From 0f30a4aa675f144a248cf8e63c7fd03cde7fca9b Mon Sep 17 00:00:00 2001 From: MythEclipse Date: Wed, 13 May 2026 22:26:59 +0700 Subject: [PATCH] revert: simplify listen to PCM-only, remove WebCodecs complexity - Remove broadcastOpusToWeb from types and webserver - Revert recorder to PCM-only broadcast path - Remove WebCodecs AudioDecoder from dashboard.js - Simplify WebSocket handler to just play PCM frames - Remove Howler.js and Tone.js dependencies - Keep simple AudioContext playback that works reliably --- bun.lockb | Bin 163150 -> 161872 bytes package.json | 2 +- public/dashboard.js | 17 +---------------- src/recorder.ts | 1 - src/types.ts | 1 - src/webserver.ts | 16 ---------------- 6 files changed, 2 insertions(+), 35 deletions(-) diff --git a/bun.lockb b/bun.lockb index 20262799c6bc49fa3edc8e75f9dad90a000162ea..0fed084682a919d111b43681f59d91e8397ade34 100755 GIT binary patch delta 28355 zcmeHw2UHbT*Y?c71qML{QHobZ!~#mMDgugLfvbo{1?;GRAWgsm7SJ>`)|}{3Up1y{ z>=k>9iDGX_)ToKZ-Zl2u@;!Tsu-=$_-@pEUeQW(|WmX=av-jDj?0w3dd*^02{9HbI zPoClHl`!+f)tp$zS@Y)|=s2y%0gIMSN6rLCmiW|I`$zrCIkwcsXb_AaVR|8joYk?DCCxZ*pQU?{Gij@{KpVu!9Zv*lvOe2S64jLk`>XKV&2RKL(3IejFa($uhL`q`Nwuc4)j5Onz-|sP->AZ*Xei5J8v& zJq_u657qud$khB)$mB;+p-)ccsI-Ej!tBg}f*_1WKEfcoDpuP_8 zHB-x-0n>ow7vyCWq?HyH&h}Cby}VU}sgP*|MuBOeIW$*2e~EmG%x=ikp?i?2qCqXx za^1lciI-q<;I78ZN41ZGOyvfp7N%vV6&8L1XKP?^%D(nh3rq)NP|J!^F-*8V_hb7F z38fDM)ERaiOyz$AQ~&k^s_l6Osm0yE6qwB1^z6)xAw{|QIS8^KvSy$h!D z^}%-FjMU*7X=v_Ai0aP`jn9LTA5?ZCRIOkim^!cy8Pw3`FqKb0CjCB*w}-I(R`ngT z{M77aEmeNdl0CPoU)mpPvQBYV)j9dW1M@}+!kE@-cn1zoPp5gBnUompW*q!h-kH=L!;S#>n5c~+Nx&70pYo*R>;rIpza8HMc8jK z zTCKkey9k0C?CcWN0K5;T{*C}sf3v{U&(2-d2~Z0A29O76+*aeJVANAuRt*Uw46Y{# zf(Q5jxITEf#xuaQt_n3y0+W3N7`tj&BQTB77w8~$WF%My>kIpOPqjlMGK0%3Von#-tQ=NW-D03iDHohF~TN(~wV|HR`Q4?2Y{Dkg?S%A-e!Q zMQ~srH4^V=d=Pr7->BI?Lp@ZEI)wJI1`4rt<`xx}BZG!^9+*5xADpRd9R+#W*@JPn z=$a}B*vHHKHLeAw$oy64^&xsVKplePV2bcca3kRg% zUl82Ehrl$J%Qbl>n1*5um^{n^(_+ZaD=ZpRSSVEBPD6X@4lp^Eo0^-KiQC`PzG@_| zWWj%$Ooy`s!3De)Ok+A5tat{dhI@gjp|)TeYfmj-29y0=3;@-03hWGCi3X_Q9(gKX zK}2bh+=NV#EzHcozM3Z#WtQd^r;SP*v_cDcVbNfpwA>Lwo_e|v-i4mVv{gV?Z~J4aNtuSzYMY?7vmkhtNt(eeR7eIMDO^q3njp@^K-+u1A<>}fP4wqzh*4SQdCJ912R3fs^8buk# zKuEq)n(&7!=xsb z%&mb*9%(5Ep_IvXc}5wQLkg$L4408=!*ar7WDkQNV4E$I*i1KPmh9flFb0}L=HnA1 zA4H0(uEyGSj*?qisg?$kq*5!^tD#9g0%ZV9Y}x7_QSuCo7&&3dQX57YjzfxOZ92zD zjy9~s!(>RX(G}Bdm~A7IydR2gO5+ZV{n#Qm8|GfuMl#B59y0r25W6dt?ed9|S3&9t z$wKLi73KqO>Szejl3Lla&7LO1dr+EKn<+8Uep?pb*d+fO3MwNhWx8T=Q0FYDb25WO zk+EXqJ))$`)mT;&lY~VlvD_W+yhaX^eE&j!kZAa`3`3 zqE29lluKgw8->YzHLZ=(%uGnssKgpJh?37k3WOvo(W;4^jwGdfQoHKxK{Jy)97^h! zf%+vUV__vI1*p$oLyFf6$oC+{DtR;gqvUWbsc0pS%8i2LujIA$iZO(%`rs(}H_b{^ zymohBCCyE8Kdd$~5t)dJW%lS8Aalaj3;MLm7t!Nc~Vppcv8{hvlVOp2%cll=Mq2cE;BvyE>^OpvL4K zCzj=BlHZ3??cfDiZgXPKp?nD?IV`faQ=+6cwb^8Ulf(PiYN@-*c;Fvv8bHH2XrtLS z<I09knLK9YYUD!8AeTNk~!8ENGp`TOfrhy@r4C3rOUxNCPUha%TGjO>!Z20JU|R z>8~LrDhn$eJ4P%m9%+ROyAfnE`~gKfW*-tGEpTNe!6x|+>>)HGL~2S3abvb2CPN-} z=uXO-+kzCWN2N7ctgA~jG#w$m=?Sw5sma29!leUsmH1b~O+X!T#9wX=Ntv7Mf^U?Z z2Z_RhHhrQDOCiN8eSBnO9^ob_rXI@*HyOs_w$h3%XcQxtBc%oaOI>`zW`;Sl#LoV5 z5blI(t!Trc6cUX%7O`?+F&e|<@1Ui&ENRg>yw*x+ChCC5K@If2Qn&}bksPq~F-XA_ zONYHkg`g%(!OHrj7Y*3{)+WPscMA0Ff*3;pZp$6nOTQR-6jBsBrD^$)CRxzZlWKXe zz&4nW9{Ma5n?^aThJ-U?nOeUfSSjoMsRy%-G|BC84xrsn*^%W^NHhnnD1=gZBPJP5 z@^vVqp)@FC8RW^lqfCZ;Pug33qGIF!M&Nbw`jdnR*sa_jC~tplAj}!##B&th)^%JF$1Hfzkx(< zNy<$76%uVx25LnP@>a`Xlf~wf2Z?r9i8ddHC6Flg`s`75PlIQ3YR-(KR zDT)$qiq88l}0z) z*Z}6%$s~`_lxj#;1+Z_Sw8VUgRf@F@j1~h~tIj5e$k_fr~pOZZNsW~odclO~DEEpZ|wDrd=7cZ!m4Ki zq9Gqr1oQbYM&3Xv=v6CAM7R?q3uQqiLh@JV;-c{ZHjvN&^5~wiu@(EahskgY%19b_ z$-6ac)zc);z{00?1m=(uW!M9$-J97gTcIV&v{Kep3?#$`U81#93<;IJaS0vD3b)Y; zDEBbKRY>iXk!jvWGiEp^IHWPq;8PZLB9zpUfFO%q6DEW^p467B5{;d@ukFwzHO4O?Q5;pv5VS?*BxU0n3W?^Jq-<{sG|5VtE2kh)>)6n-b2?)3 zVR4}rx*4{EMCH^LiXc%u?34}b9Hh=~q~sVuc;}6@9ug*iYH7FwDT4MD*&ACl?FwoQ z!y$FhC24be)@y)Cz6vGnbpksU7$v24U^k##2s0{&a5asRu6JN1sW^dR1Ec*@&@Sw; zxTlVUmUcEfhTTX$gd{CNYl^yIC@M~%Y15kd50h;my;+{Jh$NL$_GX8UkkFATb>DXj zlRttsnzXEIT$FqO5{;pyGO3%!VM;2yaVAo95LLtbJtV40ncfaEI!uAF(E8j*`2^A~ zo@J$(r8AHC2xd8)hlD>U=Q~Z@Hf*~*-s5!pjAFL$kUO+p017l7D!Z+fgNid zWw=Wcd)YQdZiGchql_(UW)FrmTGU=Lodpa>ZxSjMyeZ9?Q3E)RlL@QrWQ>nX>3n6InN}oMkaah%2vlj zNsoFmw|tW!I*H=CJU>QqO<~_c(Io{-i4=x^A%%0}@b)%HP_61GsYbojeNf#T@*qW% zxx5l7b$w#hNf&yt&kIaaWN&t(z+{-wn<7hAw~(UIv!dNeHuez&Z0xja;BGJsk~)29 z*C>aCZ3MG{?kSHUVUc4f=l~wpSF6uZsHdd8eObY9lN{Sm^%83UA0Ep3F=>QJ-UcP@ z4>)I`<|mNUKIqc`A43g+{ZUYv2L-8uFhEHif0GIvNMWa0G8w5TmQydrP=QoSO3Bh7 zeF|W^HpD}Uqq%BeNcB-l-9>7klIl8`Mx1I|kCdu&PNQ)q-7uuowvQn-MA5ZO*V~?n zR6j*`7b&%7bB3;4f>ci>_cc<=oOb9qM2(v^A%yYDVx2gI*^V{IKOs|DkjjTomrQlB zDzn{TASBu-Ewqw2gbWXpcqa26XEF#w1)(qV85d*di&Tn|+JIDlB~?3H5C$o!QAlMf zsS8M@Dyeokg3wz@EkH`O6LR&k{gF~@-ilNb*~zu?)NWePel88nW5>sv~?5hDOOhX_o3&7gwse_Ep4o^g-!~S??M}@ zGzc51@krKgvPsSxiBCI9-8eML_aR}4pe3ricocK{$RzI^r7mja>|%HV3Fped7`b_| zdRJ6#2GV=Qtko2gLj{x+Gx5!i)wO<@RIh~XpJI}FmoUevCTUd(>owJ6ST&j!N#Ch4 z2HP<-(J3_msYE5U3aL&?>IG8WlvKi4iXrU8`7B^sN9opBHg9?_ncDIMMD}uigHj2p z7Fz37ne@J71>lgcTveI${+gcH5(w7hs$2~^%owGfXf2 zDc9SW8p0h+sTlJ};VxiW!MFh_*PppmHGD@icpFnBaEDPU?5WvRWg~Q$`pWe-rpRC} z(YLk2c*Uv;Q^?7)30g)~CjGmbp4h;aFLY*G7uvi9E~Qqmn66n9%fK9fYMBerMNHjU zKmx9+OmSL7N?eNoD)$*+0KV3EDVWNy1n45R1vb$@Qk=E`bp0Ju#ak6Cm8slzfI6^C z(-V{3Zh-RlX#9i5`@nQnG8Qix?pM?*8<@``XBM%@hEPh?9o2HHat-Ky)$~=FYP+E6 ztFkq8*8r;Tx|UB&@(oR{%A~(Z@u9>m&48Hvy{pMpnHs(iko^NKpP1x7G=8Y*iOK%4 zrhlUGQ!rhX+*}>G7ph($rjb-?)tD-h(2B@%K53xD%ZA#-MNHOqnoLaHuc67rl&q=A zZ)2*ResV$=G0o4qV4AlL!Ib5paU+rLQMiy${A*0Pxc-jGqzV49Vr^zQv+U1pl)cSQ zD_NDPD*@1xOCef5G3moJxhhjvqcwe1rVzwv`l?K-_M*01A)#DVnN%G#JuxLsnoLX` zi6v&YXZg9(3QW{;tFpv$zHnw^zObo^QtDI>&6=3DodKF$m8p$^n*MD}`Gd85VoIiI zoUU;ODRB`~yICUUIVEzmjH*ofe9f>BObraz?5Z-UMrd}$n%!tk9!HtD{+h9&Q^jR4 zv;$Ak3j7_D$yEG99h{-r6H{`gCKFTgV@)Qe=`$Nlc-rOv$^NOiY`{BTXij(7y0QQ@o8SGS84t zWA+N{2(C#=jVbA<$;4DuEwBUFQ`1*va-gYZM-Me6v@dvTisoQ4@CDQLzrobL(hxNq zpf&t9rq$6#%m07KO8ZL16uL;Q0b)uPrOEQ1;O3?V-e9Q&0zbY8ijW zWS6Ab{ZE+elVMMsqH!;+d@s7`P)2Vs4M9IJ&EkQY0Wswd(qv*vrfD)UB{T33*$vS+ z6Kn%{7-jwqyZ)sCJ3YVAKZpOS9|ka2Da3C(^izmQPtpG8@UN_~e-8h6!j9?i&*5L) z*=o?*!9`5TnwtDJre*Zc;a~Ywpv3B*!#^fO)k8l-MW#9Q&*7gw3{WKgIsE@~`2Roo z(D2XUpY{>u(*P}>zdQ7k9p#hV|K!k5_GCx){~sRy*IroSDY9+L%%UZemnX5sOYK?C za|P3E;aiS2_lb+uV^WTzpGT4m4LtTBsDY|@$})@-#syA7!hYq>Uwor1Jr ztyy$o*C9<@W6wITGmCC)?z$uvzSf?-gk)rK>yy|uNXyro#ro_Sq&e&CS>Fw2(VZ>X zki=rw+cW!ev*^K6%9GerNZTNJGI=BX+W`MIn#Cq;6QtyF__xU{He;Ea;NM30x5?bu zo5obTEGJsVT0S+l+v?-EW4W+;-12YZ9(+0fS<~gG1}5^Y@0{Edl=9W!+E>msaT=M` zBQ3shgUbn51&jF2ZO-(XUw_4i7FXHwjV`S5X0zCW4cm-3ZL()SLh@w|w;)cN?b-WV z%%VR#25BFpkgaC?dTIPt#A%B?y9_Cq1#Cl{w%W5<+stApy8!7Fqz>E7VmO<*9dX)b z&mKW)#oF#boVMGuuXdQl2zDRRHAp>nn#D-=*-pf1hdndwGKn_A;r#)K_sT~t{ zBTkUgcALfaY&E3CyX;x*@64i!rGAGv?Y3v%LyBb%dl0AZ?Ah==W-*@ag0vA*RX&Ox6ds0 zWEUWvg4ChHEGDy=74UB#{DahswcQW@D&XIKv)G5-hja~6j{|10AN%Y8{M!%z4w}UQ ztm{GecL4rD8py;$@DEbjA+tD`t%kJtApARQ7SmbkVfc3l{y`eT9FD-h!|?BjS)y_^4UTX2Xucza#JuQZ8$F4E`O3f5*&XK05|!AEc1uX0d>cKMwzn!9PevEZ_wE zI}ZO&n8gw70;E%rI-E3%qu9)o@b3itgH*!W{s{k0!oMHQ;uv-x(ltoymzu?KEbb@x z_akQgPiC=r@-zH{WPi#mzQmhx>0{<~ z4*s3Rsy=5HKVhdKH9Ln@ecmk2W|PjtKS;MB&0#Hng@5O(vxUFLi}ToZNa4R?RsUwj zv&Xr=!9PeZAuVKa7vSG-@b7|IT*RJ1ioF2;E}F&9*^-O!50d@wX7Njw@;m&y2>&2` z&E!k)?|1lj$t*5rn;_X-f`6CI;&d2+}gj?CyJ{9! zvEr-n57IeEYnazH_;(flT{Da8*l9@3uED?SW^n_XbRGUdx(#U~Yk33yUB|9%;FxF zatHq1hJTQLVDeq~cL)C6HH-V$CP+4S;om*8xSwU-gMW|?K|07>@58@)@bA7^Jj^N} zx!i|;56t3GR{Q||K{^NNIP>}g{yl(yf0)IS>@=iif55+oX7MLB=^^}sbQ{ts*76bj zdkFs?nZ+~gI;8MN@b9r%Jj>=jhJTP=LORdlp1{Ay@b8IP{Ea<>6#E4JJvECL*^;O5 z50d>evv`T6JcEBv;UA_yzJP!K zhJP>2;vH52$>jz7dubN$vErBT57IeE517|0`1cb2y)ugr*=b14UctZDX7Mqb^cwy_ zx((^+td=7Ddu=~!foK+=&$=!q%?cOod1n#g3qDtbd=2tT$kHo;$4g>QK1YORxdaP= zKa<2H9xFl7*8&QOFR_5)DJkqNp|IpBmQXCVfMOddthj7|BH0p(90L?Kd=n{b3{cdw zg2I+(T0yaq6o*J*$6c+V7-9v*SZgS%^9oY9SVQ4s14T_UQi9$Zu~ka!mB~i*$xULpKAxh zdi*|7eI92IYQR4ua_7&88uG5yK^}YwQ6nza0D1BhqQ-nRQ4=oL1U2QUM9ugnA}{XX z0P^OUM9ujwq88lM5gi!ffDVjxLBCD4u5$nfWfFPTaK~s52i%l)x*9y6}eeL5aMWs4G84)Qx*J0KLP< z6LsgOiF)t=cTi70i71I*AWG&f8-h~!Orl==I#F-l)&tas&js;o4arvzbhRIkYXrp{ z5AwAU6a)A(D8y9W)e|(3Enea^Leos6#GbVjuZvl%NvSOUQkT+hN6g{CPg!E zDB3iKVg#Sm9EwwVvO#_>2` zDCYP;vD_DmGX9JdvA$6B^@CypU*ZSFQ&QObL-8I@@rPou9~9e2@d1|uph)(IA}0Wf ziF^|&YyzOD7YM~dsF^yM{!X*d_pI|6v@Zw-7_L1To zDL&?2AyAA8hGJ?66rb?Zq-YibMVnA4X7fp*2rcIqi01H?VW7EuCeb{8o#FjtBC&%&5}n%;4YBZxrLfoRy`TjsObkD>iSgO0OQb@XzRBqK%Y+@mOQ&R4mB3|lZd+KZYc!;OSi}}hWVnpey z*Xl*O50OQ=^gNy}lId$vLQPWOnxyII!I6ui5rmI49X&*H)pYc<8viL@%m1wDrfE8Q zB#PM3L#I+Lw&t22$&&}yqI1Mx%Jvyf(MTI&+*8)vP z&td7uF4U=onvR~~Hb%qL0eaj{MeuVV!Llu-a4pi5PDmRx9X*eyWNm;vpzCumIj~dv z-Ysz@|8}YPZD}@?LxEf%AIJgnfGmKX%h5ABdfwL;=mXG0!S;X&=m403c0gMo28aVX z1JOV%5D#<&IsreU4<~^ifuDd=BK}Y9Gf12U=n?uppaR$r8~_dihxqAbV%^fSNYc0O z4!|B@C$J7!1uOx`t<}IvU^%b`_!d|OtOwQtD}bc{{lcOYpkH2$0mcHqAU5ZK^T1hv zrrs&w7;v1X+i4_D0w;hUfdK%1iz^HRh64EIv5*J!0k8sv!N3q88OR2(00k^EAsm6Z5uk_SQ2;#{sRcLzwShW-GvETa0&c)F6#F-@0crYnn05-< z872agf%kyYGW_#CKr5KGm#Zl7J8%iO2>c4rFUD>Gw}CqV{X!=X$OXCs-GFz18^|+* z6M#-Y7oY;V8Neq11119R0q+AJ()dq6VmxpJ_yO1pECLP!hk=CvJx%omJSh$D6H#$j zpa$>=cnr|*5h8$4AP{H`gactfOCShn1%v>>0DVX5N00vfk#Gl$KyAPka0BR-PxXLC zfCu0VxB&HmhCly@1|851|g{lK~fIUzXa0i@#T7V-!r;G+bJwVqPk**840d(SU25JL! z0J5(SKv${=WJtRu8B&E*8C67usUi=63Xok>faWI6Q7^y`pdFXCgKj`uAO^?-LV#Sr z1hfNkfGmJ+7l}Ye+U{wnI{>YLG$0;m576+3193ns5C#MTK|ml708lxy?Fdj~)R3;D zPEey%57pfYp!%pDYO^H}f%cUiM}wmP%Ah$%##Jk$g477*lb2lp$|o;617@IVhiO8S zO+uACa-=Ijop}f71(f#0KZAiDKzCpeKp9B@<&pkBb*az|1jw#G&<{uf`T~7`-as-y z`J^Wv08qZJr#g^Vswk*2GNJ}EfOLR*nF)}WG^W`AMPMk94?F_y0KWidfYZP+U^*}v z7!QmCN`O(oaG(e%1V#cQfUz|GV~`lFDae=%ivda#Xo$*y_keeS3BZTI`@jdlL|_sy z4fqI{0!#%y2WA4aqGo_+1G4}Id<>9dpHStL_zai_%mFws7gz*D1M`7@Y3YUF1;D4k zm%tamQGhBv4D1K?0p-97U^(y=unbrVEC#*>mH=M^rQhHmQW7Y=637EK0MWo2U^TD` zSPQHN)&XQg!>|?D0&D^{0-FKq@Lpgy@B{EYum{)yYzMXhWQ+V#VHXlRf$sn^r~nQC z6t+X)gTN8s6!0@}5;y@I2Yv#61a1T8fV03Y;0ACBxByV+sNUa!-vD>uSKvHwkp`EH zt^k*TtH3qjI&c#p52!Hlhg$kR_#to?p!6TWJ>Y>Rldh_s9HHwO^iP2&fRm`+Yy8?3{V+6AR0-!S<-!o zhJ?!4YkHC?di5xLWI&m5pdTse>_SIMI$DlJQ39P` z^z1I3}C<5r-Nv8lhVbD#UjxcnT$p_j2I4cDxKby~i5CzZy zijE(2^auw00Y88uTwQB`AKNUtmj*$L;%|;z)D$&CHBhOl2O2uWkS*0jc@Y2|aLAtI zp#YWFTZ%@yKR{iklT`510AvGsKrT=NcprEVprL&i zm;j6i%79To1JqCRa2!CN&_)9Fp`*Of0Ij$Za51nD=`mmzFpVXhStil{XhFiqzzkpt zFdZP>G+?ThCV8foro$A;EqLly(YX$t3OO(v7_|xi;Ck?sPuPmDMvyH3W~Ennt5xedwIRXC2IxF$~U1Ff5^GXZ;CCO=){M0V7lTm+LYv0!AZ%i5AEl?@x z?;C*7TJh-JVxUofZ)?zUd8TJ1pF!Dt)3d)JyTgQZb_ zD{QTj^zXd_n~v4`kKU=h3jCWo^nPot8}%2&MtWbYb!+kS`lt)hB~P{fNV>GP~7w5*d`+5anc_n_hGWp5!((^Dyz3&uWctRJr&CU3WomjTB~af4|cY-TaBCm z%viMIQiD%HS)=~?+kb6sULIMzx>cn`a1FkbYVUyBX~Le1X?ylu*XK(V3nkQl?XBhm zZ&D#9{7q0`Hlsr9B%QC$&sV@9HAuC&{eH2YqWynfE&i-s;Tlj)3<& z^E=Ro>M!wa^0Z)LoK=dI7Jk&IzvlP4{h&q#rw6EejK6Onj@~YO`{62ernvBYlC`>x ze_iL_m+YkX(x|@*I6uF7o%0bvuPS>L>B^^}|DpQJh5t2ozuT~!jnxzjOgFBvr7k96+(|zE|Yf_Z7Xc_;y70n`4ds%VW znw3`UWPs_T%AUTpAIij5Td8e8m$Yj5`JE(BF*UWX2!~oxxG-2>&X?4rEU61cShEMp5 zJa?XW0~}8qRbAI!9plo z?-)FF*X2ERPzGBHb@`+_zlCp_Q$_DZxE{6y2nBPagRrs+Sw{0W|fgX|f6^mfsaC%ELZ}$^gL#rcx61^iA zH&ecfDAQlkEWC95bxHNZ(N5w9MwXc)Hg`_{qrN2HOEkq{wnB*O~r?Ji?D{sp*tf+$DuiY@iSc3-z7WKuh-Nj>)W)1 z1)V?8&$t%c{}jTezX5~hvn zd7zZ#S3cpiXcVQ-{rI9Y;8ai`{cYQ~2KVZ5E@EeU)Df=wqQ8%OSzf@p>^p-NB1b!yZ4TqU=S3H%Klf~7IPY~{ zbeER3|oquQh)~@|f1V)31v0yY?P_%haU<_q>EjvdzRzmvHmb-yClD)9j)X{^x#0 zS^Btv_-VU`QGds{vC$ugzYOR(1Qv92fkpF<-2XBrj{a71hCl^_`5NzyM@^Sb!ZE|JZ|*$&OHg%7>kINiCO}|)a zQLPJ)hDB)8F3Q*SWtZGOwm$#y*RhorZIOeo7|J5nxh{5ov}9*x&VVj_8kN;w>K@af zS(g)^)L&9*p}!v9>9gO;`aAW+&*bzz+a>a|)HD4B@#kO9JeSexH5`SwS+eYd-T+jr-#JpU1X;Wp)lxLG?5)v*i?*xj7p`!{T__vB-4qE`I{-O-D( zD_oyuKT>9fGP&PP;;UdGO-thYZ(?tphu_=W!oA~*Bz41Ck;FUQ!d_XP#LI5MZdVeY zNBIYl?}jK`N#cj0H|no#f9W^DT>5SkEIm3oh2makoy_muK}lmWH{OP&{$ltm_ska) zyn19-T81a{L|90%$$Z8=aF1kOop?YpUkH6@nx*<3NbglP$!VGIW#c$RM_bI6|2%;> ziTTOOmp*0FlKHLM=s!>9?&wA6YUrKO@61upeuy}_eVo&qe(pm~E#zbzIoT@g(ADoM zbACzYxm5NsEa?7eW#0SgvNLx_S6a|l|M(D6HlpJhmk%a?^;>1mq!hjtWsUml^FNJs zUOX_fO(%?ic5>F@^EVb48_&D&L64*!pGLj;l)I=~e}(=R2jljI@g=nNV-ZnYF7)O* zQSxu<)?=*IY1CiK|9aSl7Z>J);d>Boj3HeE`|v*Z&!>106hlWdi{Jx>SHuadpI`0|IESE z334AZ#=T!~R)3!G2L@MvOMls`?auyReSi-k`evoS$N$?$mo{cBcRX+TCTDqnJ|AU` z`kVjbzZ!F3#-%O0D=lvI=SQh_y8+7M#IpM>8;mjJ`LCwOr2Y%*HaH~-qW@+ zCt(1u{}5&KU{N0yH*0tEsPSD)qe_dZ$iXL`GP{__IriOxrd8&w9Kf?t)_7dASo+cB zk0#!=OsuqcIDjvr+H0k%J=?t3e2P2Yu2E^>kDP|6eMMsRwu|mf`k*qWYbw7(W%WOy zQ2Y3$7SE3quh%9X;{E4sjJ9=}lGw%~9$^}(J69)tJNwhdSCb~OzVSUk38VgZ5(+29 zzFPN{=NPRuY>gE|c=TiRNB?sxL!ON(vy58b5f@_?n<3BtR%R*ldQ_q0%>zSVpD7qkO{^O&F{)ZFx-Mc$3dT+%@ zoehXOw4DO!2U*R7fbP64Z6p?}3|)c-oenv4zQ19O^xtF(f3hA+Ph_$#VQ|9cKy zmLD5=`)Ah>r8P_d#L=1uK0}Z7I)5qPWzWR)(6@g4L;H9_RH!`lFROW?S%VzUBuCVx zoqYALaJ8EqPk4?SqJHOFHj*!Vj=<}G0%BwHq6u~@-TPB#1?AHJctrD#(>^hpL+OLM zR&lpc{1(c-sjK%W?vA^uQU5a&L(lwi>Z6w#(<}Ezy;Y5k1;y%}YROv1jk}I`r2pBn zMhV|acj*5p8LIy!iDhT%gzS2paLiJ~^8nufd~%cUP}c>^@mT2Eb~_F~=vSHJHkwDi zfUo+Wr`WbEHp-Y3{%NI!{s$~BKMNXqsgZ?LnKNKCpMtVR{ZC$Oo|op*@sq6YDlOP( zz7rO gMH27oAvG*_v6Fh&nN?j1;LjRM#`0+%(#~H01xu~d`&V>J&b@)imhgj3HfjSF3aRWBZ#mw|&xW`tBX0B!RBQGh^#XUlq?B zR=*%WJ1d1$l@Q|~2!;818RauV!wRk<8M&qcF>buesX$hN?yK@l%AEJo03wHcLxTPQ47uBeg#3O0lA@;(P}F} zs0z6VO!}PktZb^V6-uEB9kUjM%HUVvis12@{41C$egRzb9lK4CYe8NNt}P@9g?Tv{ z>G^(wFarwm_*1Pwy&%<4DAWtg@yt!h&mAtrqjVeCcLY-fR4trA#mS)oD4kk@ofCZu z=D?DgXFQk+$p=&7H2k5&c_~@RK>qw+Bq#r)Q<5mDY=5M8!}b2q#nCr5m3<3MIA6z zHGbi&`c*6i~0JTudWrQ{xlp4ulrBN>GY z!gyD;_??_65;F$E@ER0UFZk)%KO-^q3}kAMWsTGZ{1Z%m zuGcbpUqPeY)r#petcr)4?rCE+pPbz6)ZCQ3ybaLX3I#%8WE0h31r*fsbHU`HcT?5l zI$)ZL*T7VvDq!l-v7TzWTrl-y9WT`ZqsHsNWS@$7;(m#FDH$kuHk>89$wVUy zLR@n-+bA%NP-B3aJ_K@Q$f=2gQ)w}*8L0YWt?^6PA-^Ny#k`gwaSq1r(#pso>0h-;;Kn3$61 zIRJxiJnU*A-6Eu?o*kT(oZc^85C-M;%T9*tPeRpvhbQKy!dzGqruO_yuq|4tZ~_9< zRM}vv!0gs)M#D9I|MaY6&%rsu>~OWBlfv1zR&G*R8+O6Uso>`bwfKa#f`G|dxF0g* zb`Ub<76q;eJ_UU>@KCA)u4@2w@DP()S}!n7wP-MPrC_T5Y%tYoBA9A3u&dge3t(Rl z@)(W#Xxt8rMX{i;F#?V-umWSXD!kKK5U|)49@cm@7^`OCOpOPF$-XDJ4mcc4{jd}j zv;hwV)3DGdwpE;3p&{w{v}X%>@v5W!!A4psToIrSy9z^Ufp2=M9oGYT$}lG}KaFP8 zN-d-CUTVQnh^O|)Ql~W88|W#0VS?HcgEYPiJ>}m*v#+f&RS4w^LjOE0omu&LXHWoj z;3hD6&>yn~(L!!^Mn*DriR>gnz?d)Wq_HoUTIPLCuXj;3*ijceOjKL=D7XRS72pCF z1g0WDO`ZXE21kOiz!!Resep>$`rvzg)r<~e_a+w_0#sj>?v3a+(VAAhl)l(o?anW()c01zE#WhNbj7qBVJ5ezIpu z)(|0EJyi&cp|6C5v%poslLS@P&r|v?fwi$8HUUBHNI`gpNl#;EI|iIBSf6Dbpr?ui zgGv9&-db%MZz!mV+`!cLb@NzJWmCbg!_)>CKU_^W98C4e0h8G!#8ZAVMyM@+2r~76 z=SX#IHbi}?XRux>V|CpqwPELiso}uUxTN3j7$C->u* zzS(&=^NW%SSAPBK;7BRWwD9usCAGIcec-UAZ97A?7qwoywA;Dn)U@>zjX~o2165{7 z>-*aNB-ivqo@hVi5;d;H203}#yGnw9-YP_?%4MN(M~an~AePcfY|zJH_NO74Az5iQ zdQR2J*0vs!hQ1S9mpMBH+9p8T23kukjRo875Gbv*V3X^ZWC2>NdxatsqrwaWA%!we z{|Kqrk|jBsq^Fi_xueMtV!*P?RyjsU*#_34u1Q`FMHrG*WujI_c)A|2}z;KOnptl2{c zYpGL3w#C^bFG5^v#0hL>oiOQIMb^Q^Bsas5>H(#NQut&@IDAl+b;9HwkUBt;SZUob z$+|Kd(7+^j!V2#TrOa$cdFw^U1<+D9l9J6CNK{=5rMk6^Y;r@BZ90~NC@A%wv!Fhb z))|?Dt4Y3xNPk2M%r_)Va;n0XyP6DnSYlhSRjv{8Duk$B)=GxgtFS|ECfN(4iUx?t zY|)B+HA$&~G^;9G(#Rz5g)#sp25KV1GEB=(tYfnX`3XX*XVd|$F&&kfv2gD&c_Jig zCW+F>2O#+mMfjV7if|sB}P1HRj=Al2=1XCL&ws6=t{vsVO_^79m%| zT&13|U`Q%;s?ItzG0794q;ZRJlF-@`LTgs$6k(`aLlD}ssdXacM1<4=V_d@I`H-kG zYAYXvMEIZ4E9UI|mGVFn(H7N|8u@-cpnPm75p(tt%>9sv8@-rDCu*$b# z+c8DU9GHi{NshoOMx#um5?KA_Htc|ZkYOjZ(JZrhB#Um=R*rF0=a$+V9FkJ7;S548 zl(w#e%|>nY4-xWFTK!XmnjvQl0nadTCwmlFoAq_^F}#4j1ErGNIjJoIiRJOS(%jbQb;tuES2%~08(2>R?5QV*GMf(t@Hp$G|4R4ZcN&ZklH}PNOTI5MR&E8 zF+P&R)FO6PlSSU$0*DSlkGgz z`~;f)@&}NpEQ3<=UP#me%BYfGLF%ByQ9WXssOc)u>L5>rq)uB}boN7{hP7tlZefNt zO=%IMF*pOEF3_th%Dtv6x1C9L_0-+NurYiJDTIq{#OiEqM;~dwC+lD`85(=h@C$=eVjHLX@x4leV(2wpgemQLtcQ-9R}UTAC(mcMa8SlwC(&qe<%K_y`hB z15p`7uIPVt8o^iF{+eW^<&6zAAW$ySv`Qn%#~{(fv0}S(!wfFiag-&-FaV)Ynwruw ze>Ni8Bt7zH-$$DaU68%nQnL|KTXI%CAL&FhR@BiXTVq;L1q?Jo4B3!+DBH_kgrcBV z=Y1{s)Tqhu9~>uP!kQwLTQgINIvS|Tjc2@e*qEoK_umU z782!FLD{@3A`i7rSPrD95a!q2B&`l%Bf6UmHxSq6?HHCDw$c+~ZI%-up&3yr%oK^Y zVnsbna;avbY&`}8GH$Che|v;zT8XsJOXEV>mROVgJ(Q|jW4nhL=xi6lrg}!mAqZhq z;GpO05hj;F>IzBiQ5l`lL0KNVAruaMHR>nB0!T=WefvB@RFpw+uR2ViKx%68Zjh+X zmP$h`ghZ~Zga5K7sqI+@iw8BCYS|4ErIVD^WD+DAJy=a}RNJaa6_io%1QL~AL5cH; zP`eR_I<#0{NR&=3VHPCX8!9U`djYBATWJWUb+@ilJ=HMyE!|cMziCY^e<3b||oovebTpP$%fs=Di7tYN#G>8=09yvdPdF zjS$4j`bS9f%xrnGNj?h&<)wB|6U+j|ME8{`-$J&s{p z(oF_`%!eShJw3uufKU_-dvQN=9vEqG#i;4c7NkWO#=Q+)N9Y4Z*Zc!~lc|KJB9yFz z9wF3A33cqQhl&yEspu?v=%ECJ)U+EB>Y>C|ipA8VkdzS1T4b4QKZAl=&RVN>HKo?a zW7#1@R*zFBtkv5{`V`VTj`hqo83KD^hOvZfY>WuuM2FC3ggQ`2w)jw;spZL9pqE@PU%32L=h?1ycg4(?ml$EJP0^5>n zlBYvSgIrxT&OpKIj;&HF3;4&8Kw z)Y5-NC{3}8P1Wilu3^_lL>i1~damgRVf-Q8euOYe5UQK55BZdIwq>MA`Z}FSqfGK2 z(9;lC>lrXWowMp5S2%!O7-ceSgfg6Ej*gI=GT4C8Cd0@KL5L@X;WR>hC?xu`#DYk} z+)R9Tt;D=RC{YRZ%@TwUmC#m%`Y9o&Y%QHMI$O!|0u-?nCHv;66~Y-5+f*Bz30KXM-(dswPYilmE~xmHouvk&Aw( zUChuEp-}p0CC@`h9dp>E4ObwAF(aBUA&(l8cDD5hk%c7-?-ph&=c}b@BTT5IEY{)B z(hS6a!)bOfq$owA`W=IW^%JWc?S*!ORmUupPs{yDQfjmTp$@E7H+=dV%m#dHvTZR$ z?HNn0qzd$1jywcfa!)-1uN}hLe1h*1prrOtcR1&vdR?%hN!^DshlwV629(t6)#*Sb zogB)RLunkQrbDfvj2OmROftz+p~P{5GV2&7R~?RCRU}#-IV5a7Zt#FPOBkaGQ3nC!9IDA(UHmGc3WPlnwA z;vN8b9uLs50ki zAVBelH9ktrJZIG|AZ;l?7co`yED5;&6H~4~Dpvo>RiV43>EC54=eDMQhYRTYVBuGQ zGJL2R5R?2!lZi?GP2=A+Ju$iaM3diTD)1>l>7Hrv#3Vo0_=P@yUqC?#UTG1pHGTu8 z>s_{FgIPVL-DKoN*;S-J8dJAc(PUx@R@G!;im$H8#8mxSnoLZ=+M4`#OtrKZ>13q_ zl=10;1T=8nwG0|-?4e~uEU}KWYqMUntpS??vi8?v-(^xYBWrMg7XL1jJ_vepBSecQ zCVi+TzsodxA~pRxED09ObB=d=#0q9alSQ;Rk%0FGy7IFlX>s=;;ftsF}f*BfTYMez%T*OrH zAdT}i{ku%@L$&x3V9I}#sH~L~fTSqYf<|kGg__|mkVG( zHnZ`EYRI(x#T$;1?#ugSzTo)&cuv?SA*LV+@3fQa3`@nR)hYQ{p@qeVJ8G1x3_^8Imv;EQG%eB+;C8l7cCYQ6~|KCNZ6)HC@muVJs*D{O+Q(yMdGJcn-0tuS_ zy-a%|8TQr;|0_)PeYA9aHBQvh6H|N=n7SYZOoKRGizlY|0h(Mu0Saem3StUo;SU*R zYn%hNhCGZS{|8KIoi%{i)oI3mK2rSik%ETWKOZU32)O?FNb%1{3JimPK2o3&=%WYi zWAssiF5-VaQcz3$^O548j}-I~LphJ(&p#h2{`p8j>q5f+haV|kSJgjkqXE|MTvkPF z9o_JAq3_eRTOH=Fj+pkx>E2!UBzR08UYzK?y3x8bgFkk7K4$&d?PV6jJz89nzKQz0 z{+KGm$JBW=J!*O@$Etxv%?2>za=T~`@4Ud!;>No+hkDNl_5ZEMu2*%WDA%+mhk`cr z+SyB(bEHn=*ZIFMykq_4Y4OUZoo6?Xb-Y&nqk&O9nmYdc{fb)jjesbql{2t)r()TG z<;H@XFy>XQTZ0apgsDGmy!`A+&wc$}d;VeNywq~s(aOI&G+UNf_T98&-g7*kbT{|d zyyB~m>^3H?s@V6;WOk|6ri`yc-pQ1{2i7l3xB4f?j|o1q`0RnyP043sR=V##z9;dq zzgu!<@+ae~H#yM8(0uHtyDr#2_qu=Px13*}#eI3qanRka&7ZGN{litmVSMkC8yZx&tIW=IDh)!kqg8?p2av256PMs^fZV`je*{*}PLjb^b4I|%6QR`|Ew$PC-eVk;K24gT#gvW<|!n7AGO zK}y+f7Q@*(NNGEbtmY207{L;Ez`tEawii-6X1f#qK^nZ%EJm{3kcRCxGS^*Zu{|5K z3;um?WM?3mne%S=2Wi4?v)GZ9LYlb8$eMp|7CW=C-^0Hj;2)$I=DP>}L7KD2EOukp zAI{^Roo5chc zvmgE)gny9wF!2EVgOqZ>EGDvbkkSspzk_D6A4@z4{|>`HNGZ(r5d4EQ_>fslWxF8_ zI|Ba>o5gfC=rH^{3jZJtWX?z6AEXIK%wi@hg*5RP{5xtEv)S0A@b5VMgEWZw9)o|7 z<{UGNdF(o*c_-lCakDs>&BR?EQKj$?(ohzD0{%hz>V#Pw&K^Npb`t)Tn#GZ9aVh*e z1^-T(#nCM0B>X!K{~#4G5wm;~q?A);aV(Qh!@n~ak*Ce#IJOy*-C2ytGiGrDOFsku zARUGD39~;7|9-@XJZlywv4fD@&tXLVXcj+Z!+(T-kS;@-${L@8f9Emd&Y8vO>^!8P z3z%`|&EiZp={)>{R0fH$;0y5YB4*qLvp9#{ffRKKGwz~UbbJD>pibt61Zk z@b4%1chii!GtNT_`WgQHWER)4Nk73qNM(@Lv*4fM-!1s}vsv88?m&wA1^(SKizRIS zE%*oN6{O9q{V(wEHvId=EN*4bAjRE*f49xzc2;~F{@sOtcg(n5JN^#*gR~veZYJM_ zfA`?uU9-4{ZH8obAO77li+fr6J@^OdD5U+&{yzLGgMatU;z4#0lKTVrS7sIuv*Bg% z57K2wM_J{|)~A4*z~Lix=55NO6C_zu(Q`Wmfz<{Cf=l{xFMIS^OXH z57Kr>*O~kn{yl+zkImvuwi%M$pYZRAS^Sx$KY@Rcjzao{+5ZXup2ELB&Eg$)5R&^d z`1jN--ebd`!aqotA(gSl&*0y4`1i~#{>sin3VH$mo}0x-Y|?Z12dNCw?=1KQ{Cf%i zUYNzl><*-;SMcwpS^SgDe+mB}y@K?NwSNWwUchzKkoiGUxLZQuX#qtgKHLI|bELRT3L|f93B^PMLQ^fFsLIciBB%ls ztqf4u@<|3LZj+*n6xDff1t{iOL9w6$6gBxBQbfTE-q8w*+I+qh6i-RhXA@`g|RcGnXrYTzDc;1HPH4A-Amza^>kn zZhSXUBW`a5x${9pjrl<$5AIwA)PxTwYRXHAJbB})sK7)URA6dVRKS~`CqHa z@a26d`&1ekzzY3!ns@vinQ8LWY&Trf^UXG zY|CwHgWB1N5EvSfbAS zJW&_!TL%=wClPh!*NM9EU`Nmgd?rzMeutit-rfn+lP@OvkUsl)+1hGI?WH6gkliMNV}^k=gt_DS{e7(aH^qL41-M z6t_uHMv6Qh+z5(!?ocdf1jS%}hZIqbq3Gxi#ZW%q9g3%dPDIkAMOpsIZ|9E#Z=zd2a1Wl zP)zlKVmd!hiXcBITKPgTlTY%6;x;MDNWplp9~ATap;+Jt#TcrnozTnqp$p*^` zop?;D*MhG$iIWZSxHH2@S(Z>q(jsU6JW}+MHic5oCq<5mZlD;0@_*Y)!aoo{5ldP} zi^-DoK^)oi6e+r*@;{^D6p<4Y!Y z6WuHfdq?8`$5KsB&8p}Az6Sb7|Nm|a(BKZQc)J)MqH!%+!54ikh7<^|->4TUCo3PY z)vuX#nZ9Hr*pLF(6xfhVUrpC01+HnDj(%>nQ#ANVOUsMCoV%jwW@C;B=F(=|skq@P{sh7!8wYC5_{Xp*MW?-ilD;a&n%n0~(qeOKNNpu*^$5lTYe zletsvaTP&fK|g{U0eVOZU360k1?iXWMw;#mO-J{txoNtEnvPoKGflTh)6oqJ^fL}s zYO$uPhHz69Ocl^?SgDS1n@U<@x_gC!bbDiEP4}gys|g)djIOW1<6|2CBRyM?!eguda0j>0A4mjnpSFONSfGt53833!>E_LNAQp%NdH@}P4nP;66VMef12I4}5C{YS z1?Ks?YB_zz1L_0L0F7)3*bb})Xl9D(|PGvER=1U!JofD=#; za0LozRdWOC0(93@9l#ou=m^ z1*`<Hb5BA8t|q5_d>u2@B=CWw6azPjKCg%0}FtK0NvU9 z6c~YU7C?7j4gjKn_CPA|E#fx-H4*Lr_ybjeY5?64JP>>kyaU)q^M5O_8Tby^0+ayT zf#xu524nzxAZJoSU>|T9@{d3_pgj--&_>n@XbZFhVqmulC<0zVHUYGkcmi}oTr23k z-0`Oguo!p^1G*#57U3$uQs66K-naOJYuGm0Gh7PhL8Mlp={6OhX*e06mZWJ&-RTR^ z$oB->1C%#af?9A0KnoeIJwAXpK;70DpqWt%r~%jjRRAMEJGupc>hU*gM5A&SE}a`_ z`>y~Pv@o#@R0Jvml>j=a=uEpYWm+Au1*!ox0aw5tumfrXbpcusT>xF@jBtIR9t~V4 z1RMbepbkI@8UUoDaDBiXAUn#CGNX);SfGp=0c2kvpn*$k1FgbdfImR1vLDa`Xa__B zc|b6bi}IEAo%(bTkOgD_9{^^c1wi8>3`hq$0Z~9W5CU`rqJfqGjh#Rs0H8&R(vdCY zLxpt!bRAWK$_z*OO6H+p%8)XmLR$f?0je<##0Y@&Z2+=;H#177SC+h_!A$YwL=4aw zc(=l|nUPIbpg@l#Pr3u-X)Mqi=n13&@jx7q3XuLofZ|C1@46J|`U7Ow4@d$MfJC4# z&C2>2XW3bX|l0$*t1 z#o$H265t!)Yv2?>d6oi4fy2NSU>&d)C|HI+Yk<|j3Sbqm5-0|i1EeER_*)4Rym#UL@!jP3xpfxEyx;6CsGpbAo2;>lY05AdJBZvcg#0KWr|HJNnp>XrT{Z(bte1@IiG zEvo;8r8<~)JK9NUN0k8sa0)hbKCl2JKm-I}3CIde%}-|sI)6|fQy#Pz(QZs>XcwjK zqrIt}5r3#pD3Og8L9*U_6i;z3Q(F--%5M91x^qC>=lR0(2ZT zASt2VJK?9Aj`lg4k+iSTWby{n34)F?LxEsm2oMCAfWZJAIr9KIg3!hu0ptKUj<_hh zJe^PIpcM$vk--n32Chy8@R=oIgMt94^g{tLl|yCFA%T+6S*!r#+3Z7putfCkWJZuq zJaiK340Hsd0cyui8dI3sSC30XxG&HLIEA=OFdcXXirlnGbScP2I2RZMR0Adgp8(XQ z9|IGB@xVA>B+w9fd;}f~6asWoYXBX^jR9z;jRubb79(5$t_vm~=^Qf!pzs`kiP*ZP zBQQ%-&IHfU!elgC3)7*NWWpj~A@Buv-YnLxxNIB3xX!)goi>YZCBrt0E)w6cRlMt< zKTBDE(wijq_HFLv>*eRizu1Ovn!BD5YsUC{`C=kT$}yu*e-<1p{hE9Edj6QC-t@Dlede0Z`t3#caVI?z<=8= zMoafA@YXwE_o)@{xdZwlD{iwB@@gx-c9&@9INn-0!WEtm={{%RxsgYe5`3tH8P@y~ zQab7n2VA$*xm!sy`%ADu4anl(^U|N=JbvMIx2iiw#KE!|Ed8-ATl3yj>IG~5no8B5 z1l{1H37)%+XMhF#1GudXKLOcM zf4=m9550SCKV{ia$x|75y=-{jeX!7eGsGj*1(3l?-l#M^%e5+y<)VZ{_O0I^LGT^ ztT<)0mM7+l+8Q-^qkUrCx9+HwEt2+B=P&o66H2RdpZys8S~35jVYCL}hxUu#IqFZ< zKDZ`yOY#RH^-(I?mwbIs`_*u+tTQ7PjiMF-*%L8JIfWPK7=51ce2d2Vu z-^Nfs!Z*EF!tGRxr1)>fuDvxqNNG2vSM;%uJx2Q?B7hVSUB0u;)34(8HDO z`2!j?`V+W^9G|f`y7TE%ils8pn%MIlWZBZ5hkzaRXLfIxTkLr0WS+KrNEuwM+n#dE9~`(1S)O&^UPr-t8F~(y?5I7tyztvK71(KC)2EuV=meCp5;-{P z&qjAPK3ejuLfv`g7Rck;5sWfDPpvFR{i*8r*R)z(V`F!BC55tB>$OljrIu4OVXTw- z#M6;~oDD8mk%Ohu$4i-2!el4DmTInbwbZH}|LG{ka!EbzcMPTOuE+Zy6N?-dIjcE% z6s?}|<%o=tN@>d4QtZqfkHd1kGw*U76LcpmD`Wr4?S1U|#)K}NVMzlH!}_omGpghL zthrXtXlYkAM{MEF{0mBZ8x}Yn6%PCE(wTEtU1&-7^$MUR{RLubAm)ZKveTo;Db)}| zi#>9!>ca0Mt<=zkS2%%sRB6CloDib}^rx^FB`y7dZ;P6#0C|<=t<#h*voYSM_JNm&PqW(f*HxKTF~m+J&3pEaR@OaH|#%j6K{v^bxA(hutcO8j$xo zi9ArojFX~A!+nj_qk{e%ci~mFtHo80wXPwaMhwnPg$56Pg-X+(_JNKAn&28 zegv|k{^0l}{%1Qa{OVa?c@FEm=AMB=`UB$2s%%-i`%VAP49Vp-(;O{oPL!YzHGRZKCLpsh|E$L9_9GBX29EC@vTS_$A5Y+cgen;2z zJ<{t_Ghm^exU|RK7rx36*XFpirITVaj172-AFo#;t)u>+{H~MEu6By+P*Jf^S}d+P zzec&gzh?R~^zSG4?0z|9S6ieFQm6EzK<;%xwDZ!Rs^3%m{G#d4h14I-Rj>Y9v$MfG z|AJUwI@E&Cy@1hb(~|#mf#ymGx4Q_rD1`UF2sy45Uvv}q?(DxP21`#uxpYbF@2Ee_ z{$RkH#a_uN%~22z?KEbz&XQgR@GmaG9sM!)KUVs9-16&7Y+7(8mz@>2l2e^s>6Wm9$D@EeYfGFC+Kat<_cb6T>X`i!Co+ zgatW_dc41elfrox(n_<#`NYc@US)0gLy}Jh@X#w@t>(HMpua?-llS*a><{g!fikp} z^skMI7-iV)kKj{~m!tkzexGTBZ)acl@K5rQ-1ilJj^MkfG|f_qYRhL_g`CiqR{=Zf z5BOi$re|M|#Rq6nqa^{uP*3si{BJq%liS2*QTp@#zk8l@)7xzyjW=IRQG9aJ-w5DQ zqkE%%WnE&F0(_};^>+s3e(vnl=Jxmwl9*}Yq1P~0E=Kac*Tf>pKZ?J+hRW&-M5`$7 za~<8Gza(Hs#h3(_Cf=`*r;iuP!q<{f>TGxXbHd49^2-s3p>{w_|0q6&(&}#>I6onD z?V3gdrqhdjr)u(}6qO!06OpK46~n z@uj2UnY~J3%2v@nihq6sdtJ3?b?i;<+vtNo&o-+93u;}A8~ud^jl?faBQ}Qqro^CE z@e$mUJKaR?`cv2sml@*1-F61R!e9Mxq)rt-$tjwjhNZNiBMz4NNlp=CeX zW44S@2Z6Av6VHJ~fc{#6LdUBEM+Pr=U`d}uynIm~{lx>5@I>=znfv;b#|-YwcTigW zRRxpIE;P|T82c*1s{sk<%jEPtG#6dInV`uGf-f_%M#X`1No zyO`3vIX~+eq=E9Znyuw}4FJL2N^78Wq!+mUTY_q8G)`#PW!3VR#^kL8T zg`C(irab0WJkLTi1w4aA9auOT?IOCL9+gyXQKP5wvsPgR^Ztb^FZ?>PJjSUf--fh~ z`U^Gg-7YHX=DjCcX;o!vYn>ozZ7Auo+M#}L^;-Kl>aX5-W}7nbb+e=Ml_Aiaj!buZ z@mHKO_|uVp*~>rH(89?G&t`-&>26aLjG7v1a%ljYa`Cj@vq(E(nozaLtr2NvP|@l zBKvUn2jT}(d>=mMfw(~%$ach?enl5d?5q4PSokWh@6ywC_CJxtR#=k!(D_A(sfo@h ze7&Q#&sQJUl0L8zD7fAzL$=R`@|eg(?(`68GhpEii$60y`?Hd1O=P*nRK(B_yjQcU zOVvFQ4a#FyB=QWTbvz0Sd=*;QZu{Eo&+MxAFSmG@$QM!W)smE-CkutghZi4@IM=4! zLVp3umi^{)ymndD@|aFZ`~juSMp~-b<9Z{CW2E06ms`ANHN%G&tY#sPFhpj@@E(sa zM6hN}euN!rX^c84BWyB5uH7D24}FdHr;~&J&YLT5W?oKpJ?>#clTumtkVoa;kjLe8 z-ugGxM}H$qlQTB{MH3%ub)S#n0? z^^LZS9QLw2CNGDt{2eVL58~H;7YiNh=BejK`OVCQee1AJ7G*drW;|tBTu%M3=g^$7dmyyAF{5A9e`de4hqup1nxjh04FWOewx&C?% z&_6EW>&fWHsGpwavpin(7-tRrJz!f;-bz}Qx8W1yg>Ik)czZr~q@C>jU#qHnU9_a_ zc>(&{S~@Qcsd35iB+jw=GOxeaWmA*tFYe^<+Ir z>hFARz0l)}$}RNw(rjND73LTlw6HuTZ4{q^w2u0lY{EQ?tp{9i`nB9*?kK(s77g`x z-*lhe`lHnyZeT6a%XfVxDsAifiobj+MpW#g$zPA+?VpLxB{|Q;KSW>pWyIUlo5)l9 zNyIBZbp+man3bHEo18u(CD}7^aB_OKXTR*M{FGt&e7B`kC-MF9$n5=*p6YKYfmB56 zq{O6@4DZ~*S^0QXV&dTZ?99ac^z1B8<#j_mCQx$ZZR$#XP5(VA4@LY%=ZTfc%Qu+E uycX*_{!7lV*2;j5UobB { if (chunk.length < 8) return; segmentManager.rotateIfNeeded(oggPacketStream); - broadcaster.broadcastOpusToWeb?.(chunk, userId); if (!broadcaster.broadcastPcmToWeb) return; decoder.rotateIfNeeded(); decoder.write(chunk); diff --git a/src/types.ts b/src/types.ts index 0358ad2..4c8ff95 100644 --- a/src/types.ts +++ b/src/types.ts @@ -42,7 +42,6 @@ export interface SegmentMetadata extends UserMetadata { export interface PcmBroadcaster { broadcastPcmToWeb?: (chunk: Buffer, userId: string) => void; - broadcastOpusToWeb?: (chunk: Buffer, userId: string) => void; updateActiveUser?: ( userId: string, data: { username: string; avatar: string; speaking: boolean }, diff --git a/src/webserver.ts b/src/webserver.ts index 47fd47d..821623e 100644 --- a/src/webserver.ts +++ b/src/webserver.ts @@ -238,22 +238,6 @@ export function startWebserver( }); }; - // Inbound: Discord Opus → tagged chunks → browser (WebCodecs decode) - (global as any).broadcastOpusToWeb = (chunk: Buffer, userId: string) => { - let hash = 0; - for (let i = 0; i < userId.length; i++) { - hash = (hash << 5) - hash + userId.charCodeAt(i); - hash |= 0; - } - const header = Buffer.alloc(5); - header.writeUInt8(1, 0); // mode: 1 = Opus - header.writeInt32LE(hash, 1); - const packet = Buffer.concat([header, chunk]); - wsClients.forEach((client) => { - if (client.readyState === 1) client.send(packet); - }); - }; - (global as any).updateActiveUser = ( userId: string, data: { username: string; avatar: string; speaking: boolean },