From ecd411a9def773c239a952dd39ac125401296570 Mon Sep 17 00:00:00 2001 From: Jason Hilder Date: Mon, 6 Jul 2026 07:45:49 +0200 Subject: [PATCH] Dedicated project page for chip8 sim. --- src/router.php | 9 +- web/pages/sim.php | 95 + web/static/apps/sim/index.data | Bin 0 -> 475249 bytes web/static/apps/sim/index.js | 10187 +++++++++++++++++++++++++++++++ web/static/apps/sim/index.wasm | Bin 0 -> 928383 bytes web/static/apps/sim/init.js | 76 + web/static/apps/sim/odin.js | 2284 +++++++ 7 files changed, 12643 insertions(+), 8 deletions(-) create mode 100644 web/pages/sim.php create mode 100644 web/static/apps/sim/index.data create mode 100644 web/static/apps/sim/index.js create mode 100755 web/static/apps/sim/index.wasm create mode 100644 web/static/apps/sim/init.js create mode 100644 web/static/apps/sim/odin.js diff --git a/src/router.php b/src/router.php index 4b93ec8..2b01aa9 100644 --- a/src/router.php +++ b/src/router.php @@ -1,13 +1,6 @@ 'web/pages/home.php', - '/about' => 'web/pages/about.php', + '/sim' => 'web/pages/sim.php', ]; $base = realpath(ROOT . '/web/pages'); diff --git a/web/pages/sim.php b/web/pages/sim.php new file mode 100644 index 0000000..05d365c --- /dev/null +++ b/web/pages/sim.php @@ -0,0 +1,95 @@ + + + + +
+

Octal Cookie - Chip 8 Simulator

+ + + +
+

Click inside the simulator to focus it, click outside to release focus.

+

Keypad is mapped to 1234 / QWER / ASDF / ZXCV.

+
+

A CHIP-8 emulator built in Odin and Raylib as a refresher project.

+ +

Functional Work in progress, not perfect.

+

Planned new features when time allows:

+

Instruction Quirks with gui to toggle on/off

+

Super Chip8 implementation

+
View source on Gitea →

+
+ +
+ Your screen is too small to run this app. Please use a larger window or device. +
+ +
+ + + + + + diff --git a/web/static/apps/sim/index.data b/web/static/apps/sim/index.data new file mode 100644 index 0000000000000000000000000000000000000000..d0d6179438a949be40aadef02d84cfcb0a2d1532 GIT binary patch literal 475249 zcmd>{1(+1a+Ni(ko|f6g-B}1uaCZsr?zX{wVR3hN4Z$Ti1Pg%#3l=0egd{*9ga{B4 zBsgL3TfMW(LUPW@e}22qy)(~SU0q%B)mL9tS69z;ixQD|I6jez<;quR_hqY#B1R(- z^I64OHS0E?_AElwhlxb>c(-ER`eo0*H?gZo=k+2jXVt8mD{s<{Z99mlC*;zqZoM+~ z8muexnEm(IZ_&DIXjt{h3-5^>FD=q$Li^D0FkKqQ6R~yMcj@2m%idq@6Emcr7%9?p zXdBul?SgtMRM%u(!F(PaIs&$6e)3+ z{asx{`-KIMmq)};MWm2!pH9Q~9Lq`AbXdw~Sl-p_q|zuJ;)`O~+un@L9Y+I+6AoyQUak3Qq=c*%wLVxo?Zn zJuG~HqUL?ucj%=ky<@M?E~+#sGD#A#y|jiZLkgW*=cPDiD9SN*1;Vr@k(ZCpipvp8 z#LDM8!T$S^TjPXGGUk#(EM2xCzH4GcB#@;MI+6a=saw6S>=TKIh^)JN#h68bi}f*I zE$b|s5HzOCj-$g6xGzmonN`e2xJ}JAxb4l}xc$ujxC70BxP#4E zxO2?wxHrsaxG&5)+8_$;kHxH)}!aP#{L;TG{#!L8=2 zhFil|2e+QDD{gmRcibMnp18eyl68-hE`Hy3xFZyoMN-)7v8e1~z5`M$&b!S@sH zP2aD$cYSwp@B3bgvXq59R8a>TWl%Ti~{`d*Jr6`{0hSN8*mN$Ky`2r{FHNm*IY3 z>)bxI_u%fc_u=lh58xiPkK&%NPvD-hFW_FXFX8@V|0<>CSZAna)hyway{j&z&Qm+8r&^@?8JY}{{`+T|5@CN{)@Pm{NLmL6olOd)ePz(W>Bx7fw&WczQw&CbRYLg z5TjhM1PgAmVCoWFFu0(Y!DWMyEx1B(1u=pv2Uo^lCAbRV^@8i+)(>t#57j+aq$r>d zNo@aY-?VSpx9wlh*>{vODQI%gl%T0W(}Jc4tqa-`v?J)-p!?)Q8_{leNGDR<_)?EQ zK0p3x_Mm`YNg}&Lz|ZJlHwpMnDQu??_4+WUh{k!=ReXoEGpa ziDixo_!CJIvs=KQSW=k**%;}vnOOqiNu{(AC|4zu493Agcyjzp0{#^E1G-WvC57>B zAUqZRN&$arNnp^Dy1pun#4|Dl{Amf-X9^u2B5$jxveHR1bvh89Uec?L0smW)QwBY8-bd=WA zzA*CjVw*p(&FyXT1j6%3p}>B@z&0{oO>a-q`8n@apWhVZS$_)!4R|4y1gQ{#95#j&!63Wyr4=se0lM^?V_oBw-wl ztXqhL6E~C?VV-pFc(o7nWa~vpFL^VhomYo$l-`A$bCA9lX?jY3Vuuntl$>7WUXjqg z-hKys;T-Et+zMXpdy!hF)g|{rik{@xR_e1K=Eu_43Be}Qs zTIe6eDMy@er06Q|;%om}86lE|lDd<7xYtrzqmg>kw%d~eZSd*w7#_zl_@*2zPcCmqJ_dao8{uGElRhRZV4SH zvIpxBZA&=`?MX?IeIy)ND+J={-r1d0y|9a@*3mi&c_W8N`_VPmx`?!0-I8^YN!!n> zI=#wS_s!OxR9c3&iPgYMt!tyD43RuYrU{85+3S+)UZAB3l|G>DGL*K{y)b6q2xYGV z)>qq$*$bV7(0c!lhTcrolhV6FPTaQWxen#)klvnDWvE4@M#9?{Xo4gJl}*xi~V@A8c)QB=+$Z{!>^r#iHHbto1iWmLL1C3;=HzbZ+OwPB2;dTfgv z-9tFzXqgM518uRotz)LFMcnSviE!QfLumKjY&#I9wXgf}o2?kx$2t)2T{IHePjh*( zb=&5m{+;yB zPm&`hRsq@Y8pR~8U0n)Chn<&j>tEB!i}SH;uuqYe?O$?P5(g>Spz$60AEloz&pM4R z<3dVl=#+y-P!;N;yZ0g%=;MEqYYlR)iTKv%ZKb<)4}JU%Y*)hn4%T(#x-JU?TkU@h zu2~y;VJ{=Yozt?xJrU{WI;ElWHWZSEZYcDI_RyWMQ*f5LeiX4l$J2TItGGIjk%anY z*V~8#aL8CGiP+vD+^3J>KMptH5!@myAxsN|S7iGw`|V(ckyhri-C$A&!Vj1&rJ>mw z9nXR_FdvqK0k#*1{K)ra#Dd5)k#d-grSZQ<#LbxLd_PjoJ#>--ashJLS<%gSn1pPB za(r(`H1e&Au|Hf|_%ufYTl`i{+Tbs+sgE^}W6dIu`}(2JKN0aLI&7Qd@GayDwGr); z@t zh;*LJ#Cc8jKw8(JkH$k+QP|Wo3*!>|_Lx^`taQZrJLr6RLx{w;l1P{TFq27}0=xKU zB$r}VB6Z-kIN!-S>k8=Ye zMU{vM9ml?jp4dA1XzL!pc;TFk4D<5%{pHoDIF^#0e+S=l>Ei1ojsBOJ8?$_;tTc*= z?~H{0FEW?14VddY26`KlLCB{0D6oy%|Euj^)WeQ1p^S-tSwDXY33Vq)sNOoi2ja|T z`@ctXKAH zK&QE?W%1RH3G%o?n-LDZoeG+@dLM zvlco@LbE)?r)~6{BdrWKW=HuWF0r4|NE`9c%l|0tc<&#h+aV^_k9t31pQrOTj>U|p z{hV9o`ksOAC$FgL+w|Ig%wzxceqGj^d?Zz4$n&?$bgoIL-ID(KkUY;&FWTg_aY2X0 z=f&2U z|4rcaU9T_4?5lsnKlNY6(Pg|zh$!9za)_NKb5P4||OD1P~f%zopd8)&;x?35VLoLwPmmkBY#91D(>|e&w`NgHIip1yoLvN8Iww01= z2xReX;X0uY`OTNS&OXWO`&s&W*C6GPvn?=p@?_=uTi4xwkG!^XO;Le-CSaG0QQmd} zVJ7*!$95a_=tsKyq|d;$D{29MEBv9>AjW~HV}G$VBS`yqZ2LbG=Vu9z zJRe2u4QyAj9SrR_A036&f$ciBr{D{Y)d=`GZ$;FDldzWYERU}x^Vmz0{q-?8;)<_7 zb-5#<=JtPk-1*a3WobmK(%y{2cC$2P?V-F?fw8KBOO~Blx+do_|!MkdbrnOGZoMGrGX#WGp{hh~vml`F9Q%Wx~Fsu79oCC@#ex0>?- zwy`}B1AQzYm$LEy8|maQGD{RzQukF>PUOUs!1>Z*)2cgk2JmxRGgdons|fxhrZQz7!0x3B$Aq$yP7 zoYxd8TE%4z+AhnmnJY|^TxM#?YnFkO(!qRR8flEC(%7gat<3I( z4VHJ!Auvapdvuj>QBP}(|^P9rXKkes`;!)!k z+nsOXHj$>UF+|q6nh=>5O%2)VYI3}S^}2g@9_kiFE#wH{I8ev$qVTVmRj`$H{0;Uu zGSs<AvX?jz;_~&;53rVBbJnYZ5tK-|I1d_|NleuTvy*i)%{c7FSGQ$ zFMYp8&!ua7Yl2~1FL~>AtRIEx^&)R=hjkme_ze2|v;c$5Tb!4`sPKxYeZ7r&uj4g; z)ctWi=MLQ0{;PY$-n=}$&?Q@%(yC+FN(l?HgDFo}$-$qtC?xQr<*U-_|&suL>x9V$LeNC&^m{?!XZQ_-WzbhPy+Sgn9(26%<9>2l}j=bK9 zI>tFTGF~QG!gbQ?kcU-8WsJg{A`3YqXQZF%|Bz@_M8SL^qt=yOR%P_=F>w9v=`N6m zK5oR5oMv%pqwy_M=>sHXtBKrSsnQWQ9rKO#9{1&h34dc;85?6<8T-b#GK)FLAmoom z??<7-t=#;^We5G1-@7o^@1eJ}Q#ki@x=?n1)*~7Q=)&=V_8ivNo-)SuBwa7Y1AYBX zzqa$ymZo&&TE0E^Ll;{%*CIlG!nH>wsjb6pAzd}8Ywee|RyX{S_BPl0L^>0vA(Udx zv#xiYk&w2pNjNrP-IwOx+Js)8xDUS|pI#^2iyf4g$zETLOt16k5y(sX852m z5{Gut=K`k(ZL(kH@=uBl$kkV`{pxkkprPnYucHLgd-tdHJ#5xT8S^*j{;Ahwy>-`^ z{gr+i)knQCcn#%K-fL@LdYwzdT9^GUgx45y}so2Z^mD( zlc;raz5b;8zPF}DoBwGn(D_G=qcO$=Z*1e&v%W3VQ|n2~8@cAx$w!;(dmQ|BN3W?j z^TvF=El8NQ2YqeplcDwy+HV)O%f2~Lis-drZ#`CzCy`^{Ua#!HxMQ=vh|XqcXfu8< zgs%A=l3fNpvR>`A!vx9UUo1I-KcYz*E3SJ-Yt`a@$6{Mhk){x8;^1 zDbiQxTic{3*I@kPPV>h=wx7X8I0QQb{(KxOhU&5e!XL9=1V7;~oEWUauh{_n15fAm zM`yOrp)u@*;h>M}u&o?#%k~URgry?S;z36IwSi-QG==&2v%_RqqvcSWq*fHhbk<2W z!$r6P<+w%!eGRHXXTw!4$)c}cIcHqrT*Wf0aP7%2OC!z zO1u|IMV@Qfbv?QwQ*5?RAqOM}9i9?CB|e`Qp~TVghq6rw7U;O7m9n6(eRaJH5{^7t zznbT*B6(3h5LS`6GvQ!hi~sp^xXN)w`V-I)HUnk7C*5CKo2GjLVywZHb~0i8y->1ULe57ObU2|dXFEw**dO>z($U90UByQ^+o;=Hsh za*aS;jrdxx8F>3!7!T0D_Im`vy*N6)*EaME-A<8f4(R{IT}W$|Vh#)VslQjxGJ$P> zWJ(SdbzAGQ^jZb`sSL$$v*nMaA}^`yA1z@X=(zLrx&`uIgRAU!)%}nBv<|iYrbpr( z|C-|onWJQhnxhzvkr9x0Yk*5ee~z;T0xi955!Od4f!+e+&0bGO$vEFeGMsU-uQ@@w zYP9ZDGsb-6iW(2}K5{tBdqaHt#V}4%##|Y%mdP;AlS@^oSPfzHKvB7v;ZRtZD0O9&D&RnCyr^GDbF~V*K8+w4U4`>DC=uw(8(go z(VugX=>JKp{7?;OJ2ePq0XC^N<#za24esjecRzA{0J`@S(3opFaegpCO87ufa5l0+Qp$6 z41xu)3ogU&{7XAGpf_g*tOZuPT=e8th1M_-X7V3#%J3HlWcTkA31S=yB3%&af=Cy% zAHIQS{I`1;JmgQ3XgC&j6YC1FA3HW=gc496y241951+zKkvIzI7jfwCaVi7pNxcETCB8Tlvvc*)u30pi7@KJgC1dH6*nK01$| z3i1Q>i{AzY0ewFHM%V*i!mlC;Y+%(d!D!%GBf(LAR#hIF^LKOy(gOW95#v&#_AnIY z!iW499yt?JeiA<*cM|rK=>3i`9Ol7hU>rz-zLKJ^r06Rt`bvtvlA^Dql$-Pbf42+) z{_&oy7EFUX@P|n9#E=7!DLFDF?+ugT1K150;5U&J$eJQ4AZv<-&==;y$8ZrIi=<2n z)HP)lpuJPl-YIGCl&b+7Nck1q6-ng+@}xqZRLGO69Si~VmkRx*It<^!BazhTFLe^g z2^F9P^nod`63}((F9BVrA#R#9P!PyBO$X=))HlseI0LkAnh24!$eI>e(^iC*&=;n{ zD%cAbfqI8f?~t@m2x>xm7z%UYL--u7!efziaUnC5g2vDTXs2|vQ#!_pbhm|DA&?N> zg26BwHozgc0uM#rDgpIjIc$Z~@Uut;fn<;ys9y%^mth#pf%Wi(NJh%dNVyru!&0E$ z8IQu(K;1LZ&Y7A+Z=jts(axE6!v(k_+}efIfNrzofvKX|hy)Xb!z$ zGJF8L;R4*@85I^}gc496y25B!2*k^A0)Bu$L~@d6&Kyu4nge;}oGg+n7-)xF`GD~& zS5xQ=BjKJ%?h-)Wxyd^>ZIFlYED!xX5B)vQ9g)1V;l4<|AV?2Ip$>F{5%4~I0%t|? zR|n)OkR8xv0d!daT^4izT^1|^=(1pY7z%UYWB6R85N%p$AKZW!B83_63%?EJpc(Xn zNpJ#?rwHLi`U5sl1iLGWTt$(qC~_4=uA<0QbPF7V>+npZSOUlfWuXc5gbA<=K7q4v zOaC1mQb1m)0`I~Am;q~HKYRoCd6oz|Ein$3zz&g;MW8lx1o}nEd9WF<&r%#K#j#Qx zE5)%=94oa3ei12+-b>emE-(rfz&7{-&`D`@QU;xrL3d^P!cF=J3dGS`Jo!L0rGx_yvxOcP9o*wKqe>&4WJJ&4wa{`l&24rrw^2; z4^*HJR3Kgj;#DACg>Enk-iJ+a1g^moo)i-gvOsAdZbjl&90QABJCJ8Z@~nh>mC#3} zop1(z5~)nvR=zD##e{@_uB)KyD(Jcj_FCmGOEfNoKw+o_9bgy`uPX7X60hpd@KU52 zI;@rr%0d(92@_x$d;(|TmM~3*6p$CHKr2Ab>d09mT%;!bt!56OztyC_)kMd&D!_4( z+FfBZEQF5$o2~r=e+jpMbagTU=l42WMd~($XCn2Gw?1uFpEj#co7KlQ>Tial@EtrA zX)qH=(-0jrTrJXwwr*4auz^O{KqG9RF*eXRH4xsoI<$qsK-$LZ-~fCL#BD;{Cgjni z6d*^F?l2mVy9shPLGC6$2tS2_^)3P-T1mtRoTrH8S`v9BiSPbeyXBY{{)RFWZ zPlE;LO+N}Ukhi*sVJ9sM6JuYO1QqU6m!c;J!#t%Iry* zJ-Y$@z2|e0aO&F&J@ukpdM$u$@CDoe#+Kgnx!!LB_37OV1_845DFoF4z4qzPlZwc@ zFM0Q+K7A>(ZzmW5@52^22De1|VH^FD0ea|1p8d$PUoV&d)V&{d???Xqeik8H=}+AL zxdD6W-wKAod$0+Phzy`T25bh}W588-EHV(?3`92r(apey&>hACx*7P9$ROH#5bZjs zHgp8qY!GcWxR1yX6IQ`qxClS-{HT^9!w4U?5{Nsz9&~{ZMMk6n>M&wH+!h&0yphQv z7gU7i&>JShIyk_sdUQIfE!-3ty+mY8BM5_Wp!d_xc);z6V0a7A?KJw#G~}2@Kb|%hh&zq) zrhN_fM5bfg)6+o_s0qk49hs(+?{wl$C*SGhJDq%Iknargn?Zgv_5=1j1ACqs1lZin z!ayBnwgKuea|W!2JwP9x`K!n*8%RHEB+yo~w!(3sKh1h7GCMwGh7wR8x&m=$&x6hI z3rkj6p%kF|IcMRP$lUfY6sY4|>|yTbK>N&nEb?9x=n3QCJ&}3wAPmOv5U!Lk9+tvR zI0dxl`w=4ZlR_@22+aXm=8p#Co{uc^DPsZcyr48R0`goy84HfW6Oo0Kvyk>$cvxf+ z?XigVScLu-QU68MX%YD>qW+6rAfLs=T}*wJSdbl7iY(0xl(`gnmLbnF0bt{+O(+M*yPE#D8e3TN4m1VyxP~@b>w{F#9yq@CzQ{W4WZkimf2hgfxP_;62`zvI0L`&yu=Ey0Je#If&RZ}3!`C| z$O-gyqBx+_6V&}AHh7Z$bFv7atCOKXTb&#aUx=Kd|D2*foazYu0llB@0;7O3PE*Ed zZ0}5B$N|j(J3F&STv_PG%R)cXeUesCZy(C$ArhJ)~n$WJw(9U#lk*xS#v@lAAl z^8`E)xwTH@HhRB(0G^2a(gqfb+(`!5#vOF@Yi=kFwV)M*!7!Kx)c4m-BERJT+LpN51#S_a6D)+XrXi2K+Ak zOc@eE2FMTPpdPe=UN8z~!3x+0hv6%r?e4!2c|hNL5CVCDv=10hA9R2LFbNg`C!{M0AF+upIUR`9<)2Kye@)RQo!gB=SxTsi}fu}6SCSB|~ zqT(ch`M`5xSe02K%S|K zz+zEpcsgO4ynx=)d;`dv78%k~UPx@9jF1iRlc;pHfM-#rr{3v1iFzv-W{b*z{xg&S z%E>SfcEJsJDJmn+hs=l!87o6m=n6w&IxGk3o$+({8g2u&k|{1=Q<;#1HBOa@dS&Ve z17R{Ccc#s70FWmWvSoTIDl_u1-l;O@f-+DS+CpC#5A%V#WZnyB;Cpx|DvJZjAv;iy zEHxn%XooDLVJ^^SS

Z+CMAuXQljXCJYB`EIaaMZw%;`^-lFR?eg|1Q8~K96Hz%^ z!B|)dv{5e7<|+pCms}$N9pri}Dz_g}LJlYewV^fi2GZxA2kT%rkbmy);DM+-79@qN zK)!jZLrdrZ3t=Z5hburid8uz+;^l1))F&@;~|fUTlR;V*@3rI5W8^(sw2ElnGh{#jI+if~6%*_lAz?=*yuMU_K$<%nON zaiaW3qF7f{6&N=wv;g{S1^QuyDX<7O!X7vY-@>o(QdGq_kOp!CeX(Laz>X?T2JE8Z zMYt!b67{K+32H)Lpp7dbXXW@nyH~yp$W|paaJ&k(RF$@@+8I6r?5f&CQPpX~8pvCN z_N!?_5~u+m0%g@=46HRkRBhU<_AjF9q=U+ETU6cjP#?Y$RgX0FXuJAJp(pHxo1z-L z4WU5WHaIS-p#ijOLu{AzKh=hkG4z1(uoQN}8MrB`nS$hy2P#7-^oQxN20nwY;hw1GenwX6)GqFUvI3eW-=OIuBWm9PiC1oRM!{zGZ| z(1K6{+QAT*0~_Hmd<&06y&DHIK}l!;-CztXg6(h;euS5zS|@>=Pyt#%AD99wVGn!> zzj8a=hBQzRYCt;}0&`#^9ENYEN70$tJQC&?)3HgAs zy0(UaFca3n0k{MYM0E>>x8NOU3gIvjmILv+5w9EZx)ZNE@wyj-y3iR$!hHA?&cSU_ zVI~kSjCf(h3nN|_@xq7~wiS-U_wZa)kA#pN-hrkN4ijNHd69C){8dl)fGm=Lf8uA z+3R~zy~(q8YM|`iwV@->Hoa-v-aCOd>`fc?Azq*4K>PNo3AAsY!7v*(zyY`f4@C71 zhOAHq8UuZ=?|4`PpTXB~PgFk#D7#+)s0yJ#efm+Ke$=PmZnywXPeEWYVYJdWCG$03*hvv{5Cc_6no&&DHLs0``Lq;eDwV@*nh1swUsMA2| zG!R(_`5_%pf7WOfYqV<6aF_?1;V4l4V9Fny9B8A#w9#P79~=(UX)xsv{uIb_FnSt- zo`#U;kV1e?hqQ;mFcT<$2(k`2Cu*n#si6SW2jUF9D{2_y_ps8ySUrq!e%J_@0c&AD zaNZfl_%NJv%JAmU6;8o@Q6qvN1(XBEmJ#EC{yBp4z=#WQN7P8l9f>YSW(H&&Ss5s2 z@ApfY5fbK>ef{Sod)aYa|2qwV_*ahc-v}1gb3i3lWco+J?G@y(z zdw{rOZiyP360*ZP&=h(DvX1=(kaZlgvi_{bb%)XL75pk{JTi?(pA+H&dYgcJ6K&Aj z4S=i@ufRi5lhEBHbT=8fCbxkLqNX6zlrKe1eGAa%H1s{K7f>HA?bLMiHX}Bq2GY+& zzL~V$tV*yA4vLyx0kDtRUyGVE9_GVGqUP2G&eN>Ps`q{nHIMOoUJckH>izUE73c@^ z$$x%tKxYe(Z2@+*09h8I^M%;bqJeqRZWK9}qlwX`@;_hq#IvhPJLN1rPe z0`~j?cKSgTcp_?LF{lc|;CE50`T+T_9t7xcO$$JdHH58g4P$}uwJ$}j!`9d30m@uQ zz1O3Y_3eT7-++B>C<=9;6OjLg_kecWumg?&?X&?~-blKQ9e_9=CV;NMu}z_(Hq&04 zKZWB!JvKiVwIv~B2lTxKJ#Og?BZ2yEL5?j4;1WC#wKW*t0_wSyxLd=4@NLYuwvB@& zfIQny!_T5VLY9w`0rlMOhc0kS)W_J?4(hw(7<>cBz0-vdC=8XL74(B?uo}pB=Slbx zUWj5nRDF^KXlvF()hEdC$rxBE>QnOmv_C8pwF`URg@4y{SOYr&8`_OryC;a+gT3w9 z1k`bFCZM0}YbWY6Y~?d-bALIYt@mSR`%eJ&wI975NC@cd0D3#n7)$Nhsp0S@eUL3Fvkyn z4#;u%p{UOjLwTqVZJ{@ehC8BIvs6bm2EZPVrUBaP82KGTXUC}5F=RT%`HnS9b$k@y z|AKb=0{wn54we8mdLkDLfjNMVPi%*8MX^SyP9A};fHF?i0PN=!dN_p)r?HpQRbU{@ zhTU)xeuAf>&T#w;$Io#541Mkld7do@m7o!H0P;FZ_&FQU`8oQ*xiLW9&XLdgSdbT} z)A$X+Q`8S7;d@a(T2L7}!UVwHeyRn?@>4HBKR?|N^>b=y4dnmxJyAD{0Quj_ z2DIU=S)y)pKD=EVszEbY4d;Qr^Gik`?3Zouv#2}R&>dvH(;cw8JIMB{57GlV`Lz#> zgJp0`)NhpY+b5##qPx5A!ih6BQIDw4qrUJS>;(GlWBSPBLeLFX0&V{!DPW6F zmWp~x{hp2#^$Z!F^@l5>_zkvtj?P|i?8OkEoIlC{ZT_+apx20gFab`B!SC4(=?0&R zp<+QQ;B7vtIJAa|@Dn^0!^jJh;Ab&-+JIp$7Q^R2a>x!PpgOdK?m(Wt@5QjlmnW?l zR!*1(gj-+3ZTLeB{$*^~qhJoKh70fmJQl+tfBv;&IOOY$fxYlh4E_mixalAtl!t~e z1jyfA2HV8&2La{!Dc4^b+QD2nFGf&m$OW^2x&@Dh+3=efv8aEnaM&S6Y~sWwUF?N$ zQ;ayZpfd~x@`{5zaqfx{mvZ9vg>!)HaU;Zt7az(&J?JV%d>5)g2N(|T19HZvzVRQ3 zksuCKh8eICcyeO`%1r13+9M(PBwP&WE+KkL)CfqQ=pdYj8}PdriHV;$5oCb;&>RK; z`b~UEj3l&Ul5ucCjHJk&v-cUHVpre28bsa~^Mh;*t`vwDamVbwZ9 zGLu5T&&3pOirnPofVMrm%M(wBB|W!<=W@pit15~;Dd8@SO6mD3<4fWBxErLB zdp_=|sAQgxyE7`O=PQp-zpqRQcb&LfqJ8h+OXTGm&vVOqZgE^gN=X@Sk9#%54EEeu zo*NrCHny7>+f9z$rp9K|VXqmn)vVtCixjr4^C%!iymA_mMOH$hKDz9NgkjmyA05WM zFs1uW)JKQaCrsN@)JKQaBP?T709zeam#_?Pgw-L8`%KXv9j`WF>7zp;)7By^-5X)t z`%)oqgmGU>rF|o;I$>$v2&+a|>Nmow62?8V7#|xA>G4624nc$~$${&WoILeEFZa8& z26brT`p;@_uT`y9rc!51Z7MaVc;VuyiW^1J7YQm7RQO2Y)rH3uI##Glp(Ob)=RcW$ zWBwuei$j|HL-M_Z%di7xKqn{-iSiH0d%94Pyc_c_$#W}Ybx7WjWN9CzX_h!BQN4r( z6TC=pE5VluCKWoCAWQrS@!pHqE?$DTcjKOnbtG27;32%>s+B*lE54$>Smrn8YO{}7 z&Uj&rF?y<(>I?Or%A#yJBFs}f$z8U#!;FLbZ`#$h;anjh65AYWjx)!b6U>R`By+Mk z#hhwRbCTzOCCaaVG_ zERcn=NEXWyw<75cnXLa`=O%O$zE+DQyg{q7)z~g?_pztgt9Yv#vogX;S+(qPc5i#K zz0#TB9Enj%70wE`u|w?#Jd1@fGGq%=F~4+>``vQl6a{;%;;|dUsnRTZ-1>IA4<)WpwK` zlC0(y^Aq!wdBEIeer9epKQ@n>ADJi3qvi>7ySdl=)ZA_EF?X8B%w6UgbBB4_{KDL4 z?l%vbht1E;BjzD@h5LcK(p}}QcGtLT-F5DIq%zIv<}4B37Pwh_?g)3nYdX##agE=M zyT(1^zVX2L-FRp`G9DXGjHkvkzv8X@i$Ubv6|Qw?SA$&dyO;8VTMbJ(pGJ|g5B4iYOi)CI!E6~QORm# zm$k#~iS`O-hI86WQQWFwm$7@=6YS;AIOp)|Df|ii3H|Z>@%?fAar}w=iP3;z9kGsz zSYKGov0lYi*W`|Cxwh-_%0<)lyFqTS8_SLD#&zSl@!dFX0_^jpThWbh6T3;=L|8*I zH@TYvd#L1AcB{Bm-5q{$Q~H&g%1!O2ant$@H^fcnzU5|dGr8&A%x+e{>1K1YyKnn_ zZcaCso5RiR=5h17`P{;8ez%}o$SvR&bBnk|-QsQux1?LjE#sDU%ewEl<=paa1-F`8 zoqko*t>xBs=eTnt`=2}Ct>e~p>$&ya25uv_vD?IL=q_|`xlP?>ZVR`i+uUvChPv;% zZQRywTlc2l;%$Q+{I+g&cah)GcHwq*yZBwVtJ}>Db9=ktZg;nr+sE&B`?~$y{{A3$ zkUQ8N;0|<$_=DYH?r?XgKb9Vc7>!1_W8IPNXm^Y|%AMejbI1SLZrzFQBzLkq#hvC( zb*H;C+?nnycecCVJ?I{AFS=j4U%B77U%RK>Gwv7earcya!oA?0bkDlS>?QV2_eb7^ z_>+6tAKSg{?s0!{&$*Y}EAF@MRsGgK_qzMNd&B*~z3)D8AGy!n-`$7qQ}==U*uCTa z%KH=Vy7$}{?jN-C9p;*GIU}c}&y?l7UW4;%BWW$|qz6CqohUQ-Z>=7eK9H5Nihh4Y z&eHd9dZWoBd9M5_o=T`vs?^-D&!jS|Tq>_(=As&?#;T=iqx!26YK$7I#;F-VxeqjW7q7FJ8El@)4Dw`N#B9lx^8`M-LMzgAKTyXR?YA1 z8@yHXj{iVVf}q4fIfF(AjR_j-z0Yxd(8obLgFXqm5%g2g&p|hXZU_AmbSLQ7pu55R zxtI4xCJ#;#oSLUdy&AjbNG0C8xz1VdY;ZO@A3B?y&CV8QtFz7d$l30E?CfxMI-fY7 zI=h_R&K_s4v(Nd=+3y^14myXN!}?vF&Qa%>bKLpDIpLh-t(~WNXXjbxoO9l};C$&^ zbiU&IweyX0$+_%YajrVo-q`!rx#9faeCJ$uzW01TI;^fpB}SSuQkhvbN?qzEXFsVpeherc_47GK{6=ES@ULJ5wuh zR;*%GWsKHZU1x2!c3Zcs+t#nvUF)88-+Ev@ww_qetv{@nR)j6~SjTpPon%gOCxw&7 zdCSS|7I{^m2MTeVo2dKc~Mlz!~Taat1p?oT1JzXSg%M z8R?92MmuAiv5dC7^OR9~5@Y)mXDa7}>5R%V8OvvL&Y0`G=gf27=R4n7;4E|&Ig6d8 z&ayZ5mN+Y&RnBr}h4X>uTkWhtHa#ndsjvTgwDm4?&;R5M;~$@+O;!<@>;7rx;hnQX zymNL2@0^{HS!EyQ!msSUw4~;}vNxSu&TZ!x=Z^EM^P6+mx#!$>9yq@{51mKOAI?kX zx%0v`T;)W#;yiJl+KcTSyodG~`J`s_TgV8Pl5uT>n!z}7(|E+F(VX#NxH(auGdW|P zuufX1tkc#R`to(J|Na!jYE$&QrxUaC|3>X#`wg+NQ)nsp?`w%(R7`Su?-$O6)sB_i z^z}m$vkz3@J*-iEs zg%Gc&zC$0aW!1LoGFvLgT&6N}rrykG1~7A)%)Dj>^QV>eYI_~CDBXJ|({J>sb3EpZ zN==dje>GqJ&uZ77|35qHkG!tH?8uMzKsj%=Z_(QOnS-AWUq+i68~ zOT8MCqDOP)ag_q|r-j}O$h)rki@A%w7AO&Ued1YMkatB8>|GJ0Qtxxkmd(5R;aL@2 z{Z#U$`QmzT4Eherx7kzqRmY_3gY_eJ4iz;xa~C zl8j}{e@Dh+PZfARa}BG8Ow^XeA7tuUb!Cdxz-k~+q4_h1}^O!SFkoU35$ub|yoGJ^j&Ka^03!Nj2 z?B(`yS&Xf&lqJ~fYFUcSu9Ic^sb>k^sWv!F+*+2vmy1>$2P8DC&+g1+G;=7_fgkYiRe}O3fX5z zaP5=Cx{P13M*V8U;YwG(2|V&`;H2a|^Xj>&S8=$=VSUhhQ?BGEgD=mMb+)=$ z-DAw3!mJ)vPb=K&W%aiDSbeR2R)1@NHP9Ml4Y7t=!>r-f2y3J@${KBrvBp~CtntyZJg@q?bzM?hw``LK1o-VB-jMy9eOHRw&v}DF@i%JxSM!(3-aIgJ7C7Hppv&aF z?u#k)18cRl##(8uik{K@V%=d@^IP=1=6CC%^~m;n^P8vEGv+uiqGvhEHf+-l($XM_ zZo%sG5Aoh2AA}~SaL$Ofn~X0dJ8zB8WM{Us*jeptc6R%1JBOXq&SmGe^VoUqe0F}j zfL+ioWEZxJ*hTGPc5%CeU6R%)Unhdf1@0SWQ9v zZ?htijP-16*kY~3;+_z`dHAMBhjHI05H{QMO}Az;uhXHCIT>7^n33b|t1wn24P%1A zy`1P+tg#s5|7!Hr+VI9C@kSlxjXEY4%`%mICEFz%66)Si5~BJ^Vf;Fk9>w%A?rcRL zD@cw;%oQm1;~VvjCUm-HMk}$6wnkf|8EcG_Sb7~w;&}PQGcFoecpvyxzNIB z&v_HG4Nu4FXZDwJ$Tf{8WuGC^|ko}&u9M0e8`i(o|(`2lckpBUC=#O zj}QEbA6FThaSciwPYm5pbw5u4LObxbc&?MS7+Z~xjh)6P#;05_9psAXbK{6{)Hr4w zH%=HQz3Zp*#sy+4#_wob;T~CjE5fr+ZJXLg*U~TcSbME~)@Rm!>wtC8I%FNTKIh6t z&%FPEWit0p>x4Mzob=4WGdLNYOipGem-Duh!^!Dnak4tu9PXs?R`;vsRqR&xOXc-T zAAMxGSoDf*j4|7-T|C<5s&$oTciplc@pgE>?U!`S@srXAoaFjv33K-jPCch2<;UXOlFdqD`Fy|ouKP~~?F)NvISX=rA?X6%%vy)MWmBCc3YhLG?b`#gUeN=v~j$PK>zLEX1 zTBgw!1}maZ&?aY6-+Ip{jK`*!zF9%ng06972}kgI8jn0OAn0(AUdb85FZ?4{bac4l zNm)wYvGlzgv@tri;j1Rx-Q-#xUy$xKk@*|G{8E8E>>y~^tI(iML7mvkMyTFK#*Mb7 zpn8EYy`p!O*0A*zSl~Qhc;^9&xkxqfGnO}C#B5|WV~yVw$A04`wfZYL3Fp5h(J4&tEX`eM#)zm;a6u#l)Y^mw~b)Yp^as~E>DMmX>5$+0WO5ucr2e?2*t#R%7&bB|#t}wP{q^KH9V6W2+&99LV@GtT zmScryGmHUxKnUcoTXcoBmKNR3y=aFXdrcBpk2#wq^lB4AFU`gJF7~N@SHF`|8HZo_ z$;Y!$uFk(QZg6ZZ^99crePoZ?V;tkiG+-MDH`GdF3n7f;YGtH9`p6^$t2J7Xljn;L z?_~@l92?f#K&UdXS|c~Pv`{UyKRUb);mOFOf`KnOlryqnK;)TO%TA3HtG?>j$ghzl zI<`J?p4I&G`fKQOR%C5;_%2G^#rM%`p(`nGrMmW7*bHKS5gnpfM^kDT@rJ2S$j_wY zZjoQkJ4$tf)n2%dl{CKG7f`rLP4hxcRa%vnaqO3d0bZE?l>#Gyo(HOSUWj)_;2xh+ z-1njkrOH7N{-`=Al^6dLj%DIoIuJ{*9NnOoC*VBIsS8W|&E{W!UJmSO*|`s`kEDsd z$B~|U9A%9*ys@L5F`D-X=(&C;W3n-sXEaWwjk~ZO_c6}|-f8TSS&Wp2wNIFu6=+x9bn0qs>Uayi_T>IRVovd4p zm&R7ZVbrL+ng$(VCCGYVQ$t*J&M)~en&8e1E! zjYexbg`L7^V}D|QYP7X?+q;eS_Fj9R(ZN1!A2vGKN9^N9XZxgm!RT&B*bzowC$Ce$ z=;su5iW`HRvQ8Cas8ijkV~lg^JI#$L?n}SVnCnmC&u1+15A-iLcKMI^zu^7`qmb(G z>KizFP$iDosz%gTn$XJHZX&I-pz^+~5i91ik)b{nqQ6*)!g};aj}Ni<)l4!%^o&Vc z8fRmZfES$+`l6M3ohxT4c8;7H_bE)m-y z@PCMV4>&7|b#J$;s=L=z4+91S1GCl)QNV}^6%!&NB4Wafm@{I+te6AYfS3?bF`)ut zR>Z8BF`=T)kQ~yOmF-rz&)aYJGHmxg=brn0=g$0|{@1Fm>aKpPszX(Eb-w1YbWJaO zWDVDd@|x-C8m@`yn%;j{Gc8?1czZp*o0Qks^vNYX^U*$K8AT%7)IC|AKsMsDG}T5@B>s)jQtm55iH}e2%Kapi`sLx+ZssR0 z4JTJ}4JWRpp)CXphW$yXCBLU<_4YwU)A3Dfn$}dkRyDY4 zaOKRP1w%+CRF172UU^C7*_DGTkE%SVvR`G-%5IfiD%YXyh(q`6ZE~@Ma%zao;A*=PvN-2 z0G>E{7j`Uc$@5NY`XZVZ!uS`S)EC8bf=FkrPQuI_bh1P;wqibpJxR92S6XzxW2B3+s1Wqom^|Tu3N(;&eF^Non2z* z@q9F!XUZ3N&YWiNw-fEn_FA6QFR|y^(|Be&!XCtPQ*Z7ewqcA#C)?VtYn#*OS79w> z+D0?e<&1PWJzY*?>3G(ZHKMXk^w~@$l>E-aO-+B#$imOa!q3RU&xkbqj4b?&NW(vy zh3CmOjZe!@rW*d)Ec~-s_~}{r=~?*cS$OW=(|FUf@YA#K)3Wf>vhdTg@SJti@YAyJ z)3WeWv+z^1@YJ<598bZS>haP}RjA=SfqjUPyJnPK&z4=&%dTlxVfFNR2ElU8dqEzS6mubTpCwgx?gNtj+@(A{PMWD zoy9MYo7#V?PW+gbebxVfFNPdRRGXYtG9=5`jpJT7TS^9YNU|-3b{4-pZfy_VzVb{4-pZfuNS)JkPp}qlg(}`d!e#Q{D%`tY9W>UGkiFGtceU@GNp}a9VHzPt^y}?$B4> zb74QSoW|0nN2{9uo|^j0k%+$>hpPHZD&@DNQFUs8o*mf^YjW4LvMXOJ+tanO#oU#z zm946uY&Uo5T4H8v#ieV-m9NdWEG0T$D>j#{Xz9&e`C6=+u9bY%{fbN1iYs56Z&~s% zUz=}P^GmiYu6(WJS7*03eHYs^@~xAraV=aE?$%e>M!SG}^>^(n_8IQf@3rIY_1vcq zwL|Pl+@&92``RAdqi@0p=~i|PhRv*`Mfd~8aKA)5=yWsLwC3v%zcAi*5o7LV(~~rV zmcRS$1UuFa=WhROM(Z8Ly?#I2lX25s7-L=JK0mR%;ANK4V=~9Q&6b{`-$csN`IMuR z7)5x9+1K<6y3#WEoo%pR*bjJ;m}wtlq~An4&W^N~@f0zbmd8VQhUmpu?9F+CsIe^= zH)zcY+Ts?NPZ?YI3Mrh%NV4(t$y`Ir>kzhmggJl~uO75uY|ehI@?_8Mf zy-m9JO4&Opk!P6|sm{ps*-WQrIxW+wXp^+YEKPM9@#Xhav>oMuGa(_=CEHS$Y)xIV zJ$1Wul}#xhsz=H8l6j<4SE*Ke-Czt~{=sp>w}HuGGBTPvTZ# zD@oPT%q4lCev%8~lKtkce68$P{iJs1u6(W3Uuie1KqaMk@j1r;%7-8#2-UQYil?tjS&Q$ zSifd`CF4u3p`AoVlZ~M-@cQ@$+D*pAH^n!{x5T%`w=pvBsXuH3i-nzdKd;-r{7+8z zy8fTTx|M;9b^i1J&@^QGzl8jNoLKb7f9bg)t!@7jZZa)^Gk*U!(s~EA z9+&^qi!5Pk{u1U0+8*<^ZTjB`QT$7Y9cg9TJNuUl>t6vwc#u8iJ3)2#n zwhuG6oh3gmOV>%;{_61^jDxy69kF*mFF8tnBQqtfKfqKUNZ52Y>n2<|R=(W;r2D%p1WA8>qf#9WBdEvbqvqinr~_~WnN!^Gt<8tTu#e-BsqLpTljSD)X*N?G~izoh-# zz7s+a#-^jQjI@*E!w7KQTN+zSwx#8L^}ju5$k}2%=Zl-=>_I#kCHAi)&SjLAjNMPi zmlG=A>IR&P){fWt+Zyuc63CNp<8|;4ENnJ_n?07~8y~Eg~I{IQG?hki&doeocSo&ed(DV8cBXSnF zU;l0DW%Qcb=J);v=_8X87<#$0nvcuy=IP(8=NnkrdRten>xOZQmYz4+iZ$!7hAmbke=y1VSUtL(b7?7FAynpAd8EW7R~yLdxB+w%Cb z>$bA%*0PH}%PbsY@-o+ivWwAqncujwi}(FAKi-PZTsM?m*Oy(_m0i5apM@J!b}>Ui z<~OSBVsvKaH=^tsUUu=GeYW#DNr%ChT$0-z(z5H4vg_iqYiQYZ zQQ382*>yqLb$;1(UfIPg16fMXDZ9=tyLhu9TRWueIdUT$W!HkTtFG)~^jfyP&&#g4W!GnA*QaF{b4z3~=9FDulwBW}T_2TQAC_Go zlwHh%k!@vm*~Ocdncur*7jJQ7es7muZk~ z%B~m7t{2L#=gY2{W!H0M*Nn33*|O`Ivg_%x>#4Hq$+GK-vg`4(>#?%y(XwlL+4V@- zHLdKLQg%IDc0E*faSxDLa&p=AK<3)+|Jr+05AtmGr?<}j^q!f#V^*${GGZ^QllQ0T z`cs|cepKpYdLNh`hoPpH<2HLK=-#xh=|@dpYI=Xuvzzv;8d^1^s#{gkA}4qv-?h<`?n>C?4#roE7MnVY$@?rXX+clMO*+QpSC+Mm&^a-S4NyQZ#m#6h?| z?qOjEX02)9C}hNpj051P!kAfQnuHN+mWLssMueP&l98chIXvVziBTzSfZV5d=T3b~ zMoDzy>8Tj3?UoT{v|B16-4a4Bb>FaD=Dx;fjBAu_y5%evyT$m7V4O6maKEq|>l*L} z84uw&U*OMqAsNn7*yiL#c^rnLcC!!84{VEb1AC&D6PmL_+~7DfuyxJ~$%t%Q)OSKs z*W+b8ho$M1F(7Vg>Q5;peUwnrN9iOkC6jctv zKy3y6-2#sLgXCMz)HYe^?!ki1-6WRQ-Hp!*cNg1S;_k%#jho1FnY)8!qnp5Tx#JEX z8R@78q=7m>YRBUq>uzKDgS(aGXm<3*_mW48=S^EC5?5m zgmi<_SSO`hIFaQDcLF{Qf3t<7()}KhZsG8B3jL-5ROIRwvYQw;DdfT{DT{n&KYm zs&Iehny_qe)L6>4OV3FaF67s8Cv|qXv<#3N*uzo}ISc$t*L9Vw+GnYK$w*7>i-|8a*>YvYXEw_b{62(n zVlqDIFUM@TrX-E_MV2e<3&dVxpHJhx#BvN{Qn99e7XPJ|>rlMRa^*>e*=JaeuutRD zV4q^SIJW^~S*d}HVwIH5B-Gfyo<;1#Y1$uR-7l6J&(^4agr@#+-1oB_X{An&`19G( zQV&Um)WZfVb#J7l))8YY%Te}*G=|uFl=!BWADy~Z|Ig(o_#2{7QQ|%Ns29 z4vTOviABz1xy+u6&lr0S?&X&H$o@}ZIo1whIowLE9A&AGr14nX!)#hBZCWes@%S(P z%kfApTxq2iekG&1$xo?;%PqB#?H$Z=X!C4RPFx_(cVBWzz{G}zs7-(>e-c|$oL zdZk<3HQi!QiIJ5GY6&T%4rQg2+L4T={QkGjwLvFKU8`K(R>>AE^#mIwY-@>ahWl$v ztw@$zsR1LcA!Kh$Ey8L|({wb)J=Xlja+IZ}kq&BT<$AUSKBH|V%VBn1{Fhm3QZmB) zio3zC#_}(=V_Z4*GC#6rx%nXt`#sB%<~x?d&9@SdXW~A*(Xk^VFaK~AGhd`3s6X*i zGmqsmBeiafsY|!@CCkNzdX)?_pRpWazGgYre2PDHQR)?A-es-SuHk>qAM;+ijdx{@ zc_$6^w!|}UrCWUypAp$MW~CutXZfcqqj@Fum)f(;q&3h`Gf9!u%mzkK{;@}79KD0X z=@S`B|KJ(4Zy!es-d}3Dq2?wl4Yjqhxp|tUWmG+RW}akwON`Xzkw)tK7(-pfmXF{b zYo@XM!Axa2+Du_N$~?^4rRE`)%glrL3^S8ijxf|&j*mJ^8lMYXyp%OF&}H~O5x8U+ z{*Q~YAI9kNyMakjMVJ2dyg-|_r1g$8XD6`5<>q#LhMU`1jx@Kjyupme|0{B~@89Gs z=Yh&~&Gl)_>(ZEG(wNsu9NrI*_@h{kFeCA4Fk?x_NVZR%i5tkve>p=lZe2>*mFX6* zNVh0g@)hPXe3qC?agQ{Yq+7pOwwUEDX9%`>cIxwobGA7OpXKIAmdnf$gc)NF$GzAL zOhajqS(dNErUSp0oAzmpcC!9o%34jjeeM;= z-|94UEj~9%>l=Gn51+4iKSW~wF$bHc;nz&VuOVyA>VzL@R+I2@#W8XY8$oOP`N0rc z)K6d}`T*WE+xuV6MAZMv=D~-AUO|sPdBvCP*%C9zka9+PlUK|qLt29OSdOJEkW0Zk ztX&$&Ib|8|R*+Z0TP#NeoLNZe8!Q)7X3|>r=Q9%}h^uXIPa0VS-+tez;U5EQC%Av%Rx;2WsbBW232g6d|mh{^E-edb;-n$2R+D90=W{e`sp6O(Z z=~ae1Q#qm?(s*Lugmt5NPMk}5c{6y4cGBsL5xMKXb={V7yE^j=%GN2j*mrfdyM*Ux zNoNa|W0>hkQc#6^ELSaPIqk7985@ zo7>VK+UrMTE%wuRuS(kNzs_3i*I^{~?&Ws->wj;#58KmrzXzo{>$xx|@mBIQ`$Xl= z_Blp>%)kL57toHfbK$;~XsClgrSl}uv!Kr)%-!^y)eA5WfO`E>FO%Nfb5EN3O3 zu$-IBW%)(&19I0gTMw+x2lh-HwdT-^jJ5FDJ1p8B4Q>kv?xT zCjS}6(oA8L&RvYs(SDCX_BclS9Ku+ae)I_SU`$O{M(fC!9~qS&(`ft)<9-@V9V2Vr zG&7jTYZ{|oCYcGe5na#7m#esAFkBV>G=I*&>0kPU(#pI#X?d+G_cI+zPtzd!nwV$j zzwB@NeMT+mm6M*QJEDoS#Qp31Jagr(C*GBiHoAW^k3x9{A6xjPg6mb`XV3W}ej=8; z$=hSOXG@|BSi0zZmNq(%rHRgE8ARL_@mBoVyi*NJZHiR<2mnDSlVc(Vn;Gn%EpQ?4t6;_XU(F)-eku!qGPRUD072XG$PutKib zhsGPQJS6VS^5D1=%Y)*MEDwy=XL&%}f#v>jd*b$IRt~OTg+|X+sj%F0J}oTsoJ$Hz zJ!hxF5?)EQg~b)CST0_p>)vte4N+DDyVPE&n)kqt4rC zuKiz~xAE|7*2cv$W24U3n9tVu*SQ*XrbajD_n8{q#X3{t|CxCjnMLLAMh5IA;}Fs_ z(EsrnTq@qJ>{am|Gj05FPMp7+bK?|djAX9J|1b~EuzU{5ilsUq&VOenj&!cc|Itj7 z^3=t(?LW^odFy|eXL8N*9FsD`*$5=gvQkG@KSa!l=Z@qQ|2rq9=I|@#*Lpt}vg=td{?22AJ|}m&F9v%vvPl_EMrZ&^Ai+0NPfG_`Yt?PKn<} z+bhv1w1X1OLS=4q<~-*O@*wD>#4_VRXC?Xum3bK;`V8GrVLW$`zJa?D{&H*^E761K zCeQ_cnF(Iz2j}~_(GKXAur=qd$hiZW+>I&ZwBN74=E z7L+;X(|PA*?har9EJpoc2V zs1R^(of21|VlRjzbf6N;HV;>ryDgx-AjL{P9I05b*-?s>v>&b5W6%tHCGKMtdo6mL zV#lM$D?Awmv}mO8>=V$&kzzkaPf~0hda`0yqJtDCX+A}9EzrS=lRP|CagqJnibFzlHxu>B^=0XQp}r`;ufGXiwd}3(eso@%Gmiz^bmT1 z5=}&I8Gf`Ow(Ku9o zzW`EZUd)hVd?~}BFK1MsuVie8zM3KB>NR)+2Ev>0HpuUHG9>J~ikD-2Pca*!Ql37b zp7umPRA@^MXw6LFJ}01kGbQ>Couil@=qE6jxRP(5EA+VpybqPaw}XN}$|blVXq`ge zP!QBB=2vu{LjO?^%vb193V5F+g+8VrkURj}0$rro68e>5D!53qZoO_lU|&^FUt&qIC!^%CAm?np+LA(lt$fQRMb6)H z{S)jdC}l;Eb2+^LDRwa0N};_w{SFCz27#r%o1#K%c={a^Lpiczan~rcl?SF)vE-v^ ztKk#)_SZZlXw?rq3nCPD8sWUXEik#lD4Zo*{X@g<>V{mKm#|TPciD z;Dh3d?}u)kA-3N}u?^_98Ilj(6h=h^X1ff@lkF8oNbo^#g+83X?5Hr7B9MER6v>C~ z3L`B7IX9(<4SFby>Ilp(8Dfu~3S&O_KzD}NrkBEqkihiLkmK83aTREvjNQ;Z6vn0S zQSJCd36g?p0QuIK@ z4L}dd7>P>V19t){+Y&~B#0PgGDshC-aG2tx4i3zax^TGSPDYQ&xD`E8VdPUlf2eXB zD)koJP*mzFcq#A4D(*t`xQvI;;}ynZ1xC^;JPeXPa5tlpCSeLlI>6n64$7E{o}xHO z+u#f-=cg)8(so+LBk1Xh8;_om@g{nv!sxfaNInUl!C4Ap?gDy*mAU9S8Q-GkDxpEo z%lHmGUt#ngANkGr9u->vV*~kkufl9{ff3t*m2xd*0_0hN_U07d0+qZ6E9Lz%#jlTE zu6Xj^T%pK)J$>IP@(f|FQfwdeYDMnB%{5ATe?JU2_;t|Xij}e^=>xwtD&-91o-!?4 zlrLY6Tgnso^-w88z}P=NhO0zUMKG>Qe_Wo3HQtm#>5ZljH7z@jXTNQgb`h`LZ zWMIBjY!kFjpUHbf2T;Bf%#sshoe6z zjCkNfs|uqHdH-IKXGQa~;x|B7WNeE5LvdoCUlhi*@PSpu%6@-Uq)mu1a4EJHU72w- zx=L}|P!=(nKwmvCb!8+do&r7jft0xvafgbuJ=iGYR5Vtk9l{nePD3jcd1kYuHRT0V z_5tz?C(lbMFQSx*v|Q|oRw=G6+EkJI7bzctYll*91i8*wIRnd`Nw(BX3u?{TfO2K1uTdnxMXi<^2 z2YC)mxgV`j{D!E+5e|aZ3g3ziEagw|lqD;+04XC@jvpL(YuhV~zX)uH46)z(inIyY zjv1$;ofNqTw4D_v+n~$|azAJ#P2gmEk`9o2L%Xr!WZRo4a-V27Rh;aniz4R$yP4va zpqpnw} z2f-bW?x?s`=uV24W9qK>f#}XkunXElk@LEh-{9rAdn(e7Wp~Xu4(+ALv#2~Xr@W5# zR^)!lN?O5*J^LtfFJt#mTz|B$BIiGO?iJiuXuk|8cXIsXl^0vewggF|bcoHO^AiN1ZA>(cI#0;^?Nf`^#lQR~egA^}i_!Jn7-2(K~ z49WM?6qlfHll&CBfXBY}Y{iR>r5u3UA3ay`;+8TEPHcan z;;_4wasci?bSPYmTWoWQ;=~r0Dt=q^GQ~?-xI*z#_ODdj1?W|Zll@<`|S+tKUv6Pc1lz2PzNq8y{m+C z9sN*AB>YE8B6j##N#xk)D6ynX?DZ*mQICG6#EVclHi$n*Gh*3>ls`yzLnS^WQWxr! zq!yKJ0b^4Fc@7lftx&NM#NE&ZO41u$s3be1vTsPFjD4jfyP^$B(i2^*Bt6h2u$1t! zpJlKdx7fc?iNxMtD~Z_i8~B+plGiJgMDqF{unK?5l?#-Z{Wzndv_t`_~rgah_Qj()5!e`V`Kxjfs)*ak{_-s{^QW@urqGzo$Col z;Jz6>5>COrCwc~)iCgwFM3MGFIsXctJd}GHIXC-v(F>JG{4Y{W6?&NxQ|@?^FD0fd zxGNOt-*#6jk@#PwNdK6-S_!70*C@fKsMr^zeangMK%SZ0C?#A275hRc$0c@$fU@eu zrV#W(#irOYB%h@JNeJYa#wzk$;>30!{aa3K2chKQO-dlgCHnwr7k9TP(zh+`VuI<2 z-lmux(D6!GiQcZ5W6%joNSTo5()8I>>~N1CY8Tx=C&z5eo67GjSsD!7X4=Lfrs2o3pa(t2>5OSV&Q zJ&s$-!V~Z$Zn57}ihm1zS_vgB&%m>krMJ-;N+{`iE@NACCOpq}B#ke?%eZBquPEWG zXwH1xufgkt0XIttB~RW^Lel5n%;<(nnjn<)N;)8vu;=5XTt}CX^+Zp z2xXriDPHWK;R)yFDqg~Hjurg-=r`~!?m6gpirnwI?-e=UyB`#3b9Fx|{!{cPC25CB zd4)jY{-Q{qhV(rPq2$$Xu!?&H+KjzXr}*;yf@stNC$AZ}!l{nxpLz`u6iLRyuo1m*_a4b@{gW{9NR^@81S7tr3YJ8mgkQWhbSvbG28 ziF-9v(yKk5>Ex=rM}F z8a-C=lhNZ8e+_!P;vYm$Q2a3TM8!XZo}~EU=*fzI7#*be5$Gw3pMnln{76*FI{2yR zX&F)mPgk7ev)EK1Kf*JWNb1%Q#g9VIQv5XZY{id8&rw`&bg1GdqEf!Wzlus8L(&?( z6tG_+`xAR%n?%wjwg4k#S&m;=4sy)k??mM|A!>rkv4Qj{g_1sSeNai0&>6;LEJCkU z{DtUsil2mDpCReLL5bEx$7XDd-k7lj9jAEN_Dza^1ie`?EznyszCmxz=z`vs@hv(* zkv{zJj*Rb6u^j{tpmNN@KS1gO1P`KjXZ(W7F$lZEJxbIZmGUj@0aETElC<5gc(I4< z1N?M!vf{-yvJdc&q7Nxv?DVkWA48`oUTij1@sFd^6!Re}c7e#CvJYV!knKX$5|wQU zaz2yz5Jl({8B!jeRH7JtDnrh5Pb*f^@=Qiw^jRfZ8=ax}vFLM(mu=64=Q+k3(H9gi z`*|^AGxVj5uhEwkFM0k-#t*2JZwSP$uVwrbeO(E}uCp?JMc+`ol$SRZFURzjBI6yx zw=;f5-%+f@eOC!KMc-4TeK(w~1YOYg6=~}YKTv`lQOOUGHr?JDc7GVUhF+r@wcL%D_(5>h2n2Rzf`>BLtREcv|fqULFXxETXeqSC9f7J zrW?9Y@se+g6muH-mEv|q8x-lUPOqtp$zSp~lzI#1OmwN@CC`^BemuHd@sj_IiWB=w z-h$xPMiQe>i|J zUD1P;cpLNxB_4ntsl>;kN5RpAKLMru32_G$+X-E|h0CFqVi#r8x)B_L0VWVj%0|HW7ddY}bG z`T>d+N(;#P6$py*HWatyVybrPDWcQ(*9jsTL}iCVi&MO&~=r7vRYhEv1g&J zlwdGQ!4~Y0Y^wpN0>(Kd>-trpuV!6dYuVke{RmEaz< zgCgy(#r2h7BHB@rcH$ysR0!@xJ1h1fbOR-rg>IeqL{1DLltQ+EDli2)#zc0I|?1B$atfoY!{?$u_)UDb3H2Y!3{SmqQ@%kH1s&d+=w2pxYN-S6d7AoJW+9%peHG20(!FIE=30^GUli#=>uuAEJ~U{ z#vc_W9U$$OMcFr)r%~A-NZVWS48=Tyo~cM1TycnEo<+}6q)o0U`2=PLDtQCaPFFlv zG0&mrDbj9NJYSJ0edQYJv!v5Ha-z`Tb_-h;Gf6|Ygu`{*#m)uF=`BWWI?xO#M?BI9U^ zqZGFk9j%xj&@qa%Llv)8%#Y}GinL1=uUE`ZsFWd)HmahO8?XTT$H*50d=hStRnr*#TiO)2Kt<0&qrq}!I|juioF1RK?#PSFDlYs zU3^Ii&O%>Sq~E&uiV~cSzN*-v=xa*w5&F6!{e?xTdk}n#zM)9}Vew7H9EeIi1h*0T zwqg!K-%;GgsMIkq2cz#PZWDC2BIAjRQm?>mihiKT*y7@citB<(`as4R7bQ*LHbdtq zGVZweiQ+a#KUK^?^fSe6fzDOT;ppdz+Y7HtW(U9XuTqRPQ`hOk-9Tq zaa*Gc6f+ZDs7Sv=agkyq55H2RkD}P17|GAYiu6|$mnbrZu_)&bkiLte)Mqe~N6QuI z!zeZ?M)K%uMfx*}-zY}%|64`+H;UgWGQO|)z2anhKPX0y`$xsewtrHL*x+Zy$$nNS zG6t~t4@KJki@zvd^7NmIKL-6(@sg*%DgIb=rQ#(|S1JCuK&oL-DsbNGk8)lpHN&F~ zx*Dv7Kjpc!HdNz(0a^nc@V^9IA2!CH<1K9hLWGE{61c{VSi37=HXdO_8q>Zg4c>tc@C5g{@MA{Tf zi{LBV)bUaSa858#TBaDW6?M2oeN8S$zg7~-L+X3!2jWUveuAHI%RW~qW)S)h#Yj2* zMUnoZ(mxgHvnu_nNIy{NHzm0mU8y7&20={#m9#BpjLSD$dj5@z_uguuco9#@1YW>mNdj@YbAONZKFiw zdkx1RB$BRnO7sQVUWu?(O$R067-}|F;&0JSU{kg)Y3Kr*lZM&o7O)j=%0f+7C25Lo z4cp*P9@cEDBy!x{l;~P?J0-da-Cjw=PCF=x*k(s15xefBB+bz7N>YXHtVB4^=NM;8jbF*#Mr&24{)B0sKYgVl|=GtPbDEQYx==n z*jDmwZzYki`@nwqOCIj8L?5DuDe-scU?rC0K2?b~M9)xSN&A^F1pAZjnzP^>+>*v~ zfpbGF`?&xv#4YK%NQt|kLzP(ebFmVihF$`f5?=OmnG(yksY^9i;Lkp4#Ez8rn0?f6 z-l-XmTf&Zjk+@~sVlRmMqhpl#AoN-#J_@}~iBCqw*5Kt>Z&2bxQOOU=LOc+?S&5HE zZ-HC!KMs}rgM|F3xkHIILMJNGCg`0?B<1lgCF+RYtwfullay!!^d2Q@hu*71TcYQ}cms*ogLQI~wCZB}34a)HgGWMi3c`U@_f9utixP+2_Li8=Vt`fIK zWm^zeqm%_9rrflq4hvB|+DnOkL^*yT`Whvzt&hgN48@kMv14I8dZSXf10AOnCU7h6 zl)_$Us1ztKZ8#30us2Hn359-WJEgE6+8#RKPdREs8ifL7tIbfQurGS0Qs|EkQwsZ| zZ!3iX=sQZ`&>(1w?S!Nc$}zP)j%{9rJ_dvX(wey{AF8E=z>yzgu<5SOr@|n`n*!;ioT?z z{x9Q()c+OSQ0R`nsuX&lvy`|k`i4^IhH|VzVOw;O5=nZ$Rtm=l0p?FB?23|C?PJ34 zjuKxe^h6I=3Y3@jM=OQhQ0yiYwh4j`Ybu3J(3VPJQ?$QQ*cm-aDfC8%0(m0&(t-2{ zNfVT^C=?3lPf9`je^v@>p(~U^g8oA(G(&$;3hcil=@AO+20M#GD5=S4o#Xg5}41#?H<(wke zS?HdMbD^lq4h8=KYL1NY+Qyis=_Jb-(DbTT}M zThjKB5+8#;ti&gwQ(!7#2BFl`x<_zdf^rTQVoC3#N_-9a7(9;ua8&FF@hJ33cnUYi zR!4oUN_+?Uxe{}1bzi`jgpp$sTR_b5)YZd0-1npNVIgjgr*4rF zOW5z>N5;eN90c{Tk}Namwl*%NI7P4Q>bHUIa8E+FhyJ)U5OTy|U{iY)x`ra} z*)%p+Eaj{bI}4U$YpjNL>`TJ8hh1<}9vgR6qJb#K+;}Q=;Ry6JCH@ROT`Am+o}m<` zqGu|F`6%ZOq0oSy1?S;jf^uFG3Sz4Z;6mJDlZ)UI+;Y5^Dur*+%ap=TsMrN6cS9xJ z)PuqbbTr(Ae{b|=C83-)-lA0Qi{7dfenxMDNrc}Iy$5Df-hM#eS1P-sAHYY1ISeJA z8?k+**gLPr6kNj{O!gmL0pAy0$Y;i`_Zj{<0wo+ zPe=)3zJ>cO-v)#rUNbN&`lSQ~W(i)gcS=y;o5E{7L>^XHNrWWh!eBCAoqo~oYtQ2g z*`t}=_iOvJ3thsOzMHu<-CAxv*T${yHgH|t&h7|iCmiA~;+s#y-5u^@_qqGY{SuxN z-WINkHg38@HKRkS*Q?&SdbjF5s{2*%U420H!PQ4s-&#GP`swOf)w8QVuKucearKYY ztBSW2SCtB-W~H@C)uj%ljZ0gVb|~#q+M~38>A=##r9(@Hm5wc)Qo5jYWocCD#?tMj zdrA+Nrk7qSy)jU`8MNLD^ zH?^kL)yB2HcFo$BwXJL0*LJSmsJ2V(wzYfI9#(r%?G?3G*WOTjQ|9bEe(AVor>>pj&TDpV)w%5k=WlS)hO0JOd(!Rqth#TbIW0=`SvRI`Y~7u8&(^(Jx2W#N`nW!+Z&tr%{o3`d>)Y0Ms^6-9 zyZZk12h|U#KeGPC`Y-G2=e;^_&b+yeg~p_DjmGAUEgRc4?$WqxY$3+)xm6h4VBw6AdSpGrb|O2SsI zJM%;z>CSNHy2~gDBi)^DuKULQ!~Gf#4JZ7mBN(X7 z)k~^>Ez%oTqJ_J(T50W4O=W9ZS7R{mLa_VClHh;L_02Ri)9Tais~RdrMPF zkCk32eN>uL`n>dA>8Bc6+iEsWOTyrqGipZHOsJV!^F+-vHJ_y=foIj)C@l#sYKxSF zPUVu&uXbSVrIduxwPS1VtDRE&NbOTuN%*36K~@qXO2X=YDhWrmzM+kyB(y7+gtsXP z1KU1ENti%MnAYyGc2BjN+3uxwv&tnQ`j?V0l#=jcRub0u+mc}Gn$&Gjw|iZ`xub}J(7C>A{r2_y*B_jggxU2Jg?X>d z`=rq{`o<<{NvLjYPf6(2cp4?)s>accH#gqacu(W|jdL2m%t``Rpnv_7`&iC4m$=Ug z7Zolnoa1Kk>%_w0d?9Y%nCq_m{l>Zd&ws04`RSKsCoel<*?tZ4f}nwOU<2p72F`yC z!y2w>;5@zTA8<7+SjO5QSlGXQy@kisAHDF1`l}b7Tz}X6-{#dUJbvEDc_ZcxpEqpb zNej4FTJUAv0}K9H-*({^3(i>ZxWroUzT77)SQ-S2IB&C+3m07{`p3V;vlllm{9xg4 ztX;9VtE`!~WZ|5JAAfn!f{zz+m1y9~uy8Xtcj4&^xf(4Tzi{h?-4=FVc-6w83y)oR z^nzCGVRfjOziR$Z^B_v+8B-?hGHeNy*T-GaKC>#FP4{c`!2i|Q)oaW(y-@c9XIcb&V@+`e;rd@}#T z^FH6|<4cbG^zgF=e%@i1nj31qsO8Gj`gWf7s@l$N*QOo!9PI|eyWHdV>zLZEZ{nc$}w+-9%>3D4W+V<_*ucm2fetYxR);e*m;Vsu`xo!}& zdSRWxt)4=kXtf8+Yl2|4ww3aA<$y`cU$CEsO(UMrneX}x=FOf=u6L7X)8GH($u|Eh z^e*(3)`G$jg{unR6uv90RsL&g$a<59not7s^{6I+?)kFNW7%gRsx zyryzd6E0~%&}41c26{E&{sEoQWM-2es+v@Fs_Ig;WmPxvlfNp$u+J>(#ZeP`-s^?$h{V`M;a+AOM{Oj*3 zjD>8^%%0Eezkv;Q3U&+j4Gs&g4n_ob1TUM! zG&Ad%wq^rnXg#Vl;6d|gSa3t^YUWoP+I9KVR13bsv4=h0o?uV3$MXH?r}>(~^l%@pt?Ri~uG+2b zT1MZyb=-|^oV&?g>l*BCZXw@_STks1ehaE>^PrFI8|-2C4EoxB!Jc-npuauXuWkDW zN7<8tqwUGTF?LXJtUV<-&JGSn+Z%#0c5HC1y)n4XjtlOz_XYRadxN*_W5GMTNBypy z5xi$-2D9xn-`c)qD(!5un*GH0Gwa$0vz}dSTG=JOt^LZ>+Iq8*YhpHbRb~^{)NJJ{ z%xOu9vyk9bztVhnh>>05j5^U`DwU<;&S-j62!f>Mk<3xuL#;yU;x3 zt}_q2o6Qt=i<#-^X#1$UKgjp? zC;8L;8U9RWP#R#5^leNV`;l*Fc65B3)Vkn(`@HGnYRz-jDGmUb7vpWWXc;J5MH`yIkF!ZX9O!XfrGd!66a-WtyHTiLtqM0=-wGQ5dz zh|ISO?E=5I3!Jg5c)}>~bg_%u&F|~`yZ!zCe1YU3cc44k9pjGk+xk6yH+KPdm}C73 z{zUh_o5QolKf}Q9=)3z~eh=TrcP)he@bGkdn;*oNQNFOhxxM{ves{h}a+E*BAK=cn zWBe}u2!EvS$-V47@do~!c%yhrf382|Wu;L31se}34o~;3Zp_)5hYP&-tfCnjh_Y`-%S5q%~hJIx`uPoRyrNoR*w!whNd0 zJEJD%T-PV;94_(~`blB$Xw7iraETw|A2BV$Z^AC&w`Q&IyWj!d?szc#CEPt~9_|sf z@Ynk3{yP7tzurIQZ}5+s4=bsEW3%~X^ zg+B!M^G?X*@K=Acf6A;M{%n5@Hnr737h4Q=}BDe{%L=Uf5zYHpY^x-8DYO@ z9kZ=}&UEuL&1r5|bB2H3oatZinc zPQb~G{~yFy|5NN)!C-rKFwBk)#@btgyBUW+i81&0Fus1Gy*;>>ar3hnBmbIx)U07Y zGi%zprn&vxRNJMdXqTCiU2bY@qiN@?Y44or;6l^It!6fJtDDW;8fFW(rrFPRGW}g= zv%lNG9N;!IXS=@U9Ji;r!X0j|bVr!0+>z#Lca*u#ono$cgUt=@R5R9{W^Qz+o7>$b zW`eua+~F=W6W!(JX*bC{T~*A>I?ci>Wlij>f8F~ z>JNsY{%A1uC&Sbh>&NSF>tASnw9}n>^+N1i?V}Yb>uWug4K$|o)huO0%~twh2kAzd zscfvSQ8odiys4%tn`xS|xtdjGVAp0Vc4)R?H)cC_UUp!Y$j-?*1uHW(Z5pP)xTEX)4y@z&SWRyOmULVRO3MB z4dV#sP2*(eE#qqEZN1ug$9T|r*Lcx+-)JaU_el3B_ZZ_E<67f7=ilyJ_h|Q6<00c=;}PdQW3h3w@u;y} z{apP*{Sr4+9qu0I9`BxLykoqpHmNPfMn+Ggzk3qyMc>rj3^!IR!JQSiyPLS1i`$}} zVb8La>?!s%d(JdX3%6O^<@RE4v$x!y=C|fE=Cka1_5yp6z06)=uewF-BlfYo9y^m= z;P!UccYC|;m$P%(dAL)3zPS;<3&Y*O?c?@!H+1)O`?(vr8=JeB+na$o z+#F%{tekDbl59IRfR(bXnXhHomTVAd9sgv!_{XK4z{opEB|5(n z>oV&K>vC&vYm7D88fWci?Qb1u9bhG`GONU@5KqD?wR~tC_)}%2%>Ix?E!_Rl2X}xJ zTN`Lg=|;L|^>O-sxC2Yx_f=!^JJmKc_cll4o}}@(H)%iIrZgFMJvHG5sH4qeAlIIZ zyP{6TJyK`jj;XV8|J1p-C29d~kh%u9OWlB*r*6WnREy1b+z-9L{mA{;{lpt)EwHY# zuCcDQuCuO(w%%30*81wd>LAkJh)=Pww~LSZkG6g*)XA@@j18g*|9;Aw7w|H4pRs3v2&* zO^8#K{*X%+DK{xAl*g1hRa146~mWnIBAa8kUfm)~*LGJ3I_EdYRz18*9KI;1F z25MhOV*S*O)Q!c>Ih(1Qt6P8r+zQg!0Ck``NZlIz#J1|c)a@Ya3|4ngV`^OGckB3S zi85a;Rm;?JWq?|t4pE1yJE}XWJFB}W1JzxXdgXUWcU4LjvJtYK>Z} z)~WSsMxCrqQKza6>cQ$XwNaf8ifvX~)ER0kxc+vvL)k{13Au8%vaLEtJw!cJ`B^uts~|&M1MccN_4-iiQ?^qVDNn15)tl8@lxMh%i2Lqt zRc}*oSAJFRQ18V3cXz3GtIO1T)O&Fo-u>zW>VxV->ci?I>Z9s%^)cMrxI%pbGVn_E zDfMaf8TDE9Imp8=s4uE7sV}RqKr(&}H|f0rN$D;1ZS~){SMOc*J@tL{1NB4oBlTnT z6ZKQ|Gd`y&+lyK4YxNstu==g~o%%iQ;rmhjNnNG>3|?^u+{^cyx?25RU881!VDD)v z)`FO(Lt16f`&j%+I3*6563Q5@Kr6&;e#Kf3t*6#Y>y5kp`aquDKm?;@m`eL3tLE<))B!H`lh%w$!%L`fCGlBj6xyYi%2CTkT)kcG~vZU~LC2rp0kr zU{dq760KA#!_9#e+7NB1wxhNa?h)KY+f}R7sS7{MrgZ%_f2ZMYa<~` z@2QP~BHF40DV>l~|%gWejlh&Dl+sO^Va2@g<8wFAK^{HA=M9i-JjDyY-ywTw0y z68Kc5jHK~KZMxQ^HES)}46Rjb14mH~j^btIMdc;P(lfPL+H7r(b_lE^hiQjHFMgyp zS364Zi^pomK}&u@gwjvdPSZ|TDqux9Lm2}7`B~c8+Bvu_@jPXycD{CjcA<8WcCoUf zc8T)2cB!&VyG*-WyF$oES3ypKgrZ%iU5^_UZ`2lQH))Hs#kggv3aZVk;dlowJ*+)~yCRoskAXLO9Ct=Op*;!dai#VY zq_1aS8Rv4+^V$pGnsAS#_OkYhayg{t*Kot*8@QqBEyz&+#yyMgYVSc-`vB6~N7~2Q zC%AXu-{Mxt@3kMaA8{Y!Dh>BpDQWFj?Kf?;_B(Ej%qm|g0hjTV zW@U}8ftSLWJe}dYTEkQoGM^2J)5S%b1$v=g1RE2-2dft>P3!4>l;KL7zP>U;X;E7B z4WJd-5ciTw4auhZX8Pv(7W$U@R(gMZfId(k1gq3G`nLMNV3F7!H&*VT$Mm=|LQm*P z-PcR>QrIcV^$Of(IaJwA-%;O5-&y%Z-v#$uR>FQ!t*7*~vODY;!}Q_$2z@u)e>zg% zL*G*$rSGNhjk_?%;6BuGIwVtNr1FYBUYP~ibfUhWzQ2Be(xJ2~GjV6;B>f=023D~; zy5cky+)UZ5?1B3=XXveZ8>}TA`b=d{eHQMkoCCS`P~5(GxPF8( zN_ig^wYj*%@@V}S*i()JM|T2l=R65kwo_nTITiMm({caT8PE%zg_}Fi(a$A4(S^!h z`bD_S^Ai11{WAS>Wp8CRta4Yv8grF?wSJ9$t$v+;J#PHGQD3Ovq%YDJLyvM8&I(+i z->e*>%ux>2Z_$_Nx9Yd)x8rWmJN2ddUHaYnGTan;uYR9?zy5&!Anpx)Sbs!+R9~(? zhFe5e=uhZR>MQl9aHr@q`m_3TxGDAp{YCvH+%ozKB=pzx*OgoJH}p4^F|ZB3t^XVM zkG`vn)!)6iLf`q!`=eT&;lzlTimqp}aA{8f-I zeo@v752GG1Az>*wYwg z>}Bk2j5fwV${uIzqf9XNHO3ngl!?YfV?Sem;{fA8W0G-@QKRf<)Eae0y^(=->uzJR zF-7^pm})c_2OHBkx0{pETa7lMUzrIF%WPO&4^a*<4mA!l4mXbA^1Jder23VXaX*V_4ZQZGUIaN3gb#+ zfpL{_wd9(O>x~wIpcZb1>;5ICF5n|72{RoHRE;T4dYGYE#qzD-v+pE z<2{n(KQcZxK7lO%8JFgbFCoo;4cYix<2y+8KNvqkvR`HVZ2SWG_%~y<@w>4G7HEa3 zknVNJ_l%iB#&?92U%(2vJTGN^)|;)z`mpuc2COgJko995K|{O=bi|vn&Dj>-D%%@_PSrdzd}K9%akf zV?vsG0``TKLYjI8a@BJrJG~^OC$6D`t>I1F5csyZmG@oP7T(8Qfgf_IihaU9UH2`$ z{60a&VZY#0XTK^7*l*CEt!BR~SF$xMt9VL*va_iuyPEt4;)9f}OwH6`7hqhXGi_-8 z?^SxiX7P!#i_$|`VmivL*vWMQ>;?s9p;-i}hs!>_%--gDW*>8Xa|0n|^fNb7?ojT; zo*ky#rrfSPsyqU#!zQqxZDww6Zeea|Ze{kzJ*@+kVx^~Yqd7>~glkHaO_hhuZOwlv z_bK-)*DE(Dn?bjCwsMZLxpKNvqqbyam_ssfciCGG* zW4UsbQl%WNJOpb?p;@7vtej#FF^4Mi%pJ|0%$*@g?h4uX66I3ZII5Hr&1&f6&Q#7< zE>JF1aHFP~QtmR-kTr)1X>&J{H}@2>CYPPY2+4CFlA$IFDe3^|btahyk#t#aX3WXv z6fR?OT@NIz=|aY8F=s$hZ4Ab zUp8McUo~G-eh@cOzN!4E`~>~)+t3BSBecQqn;*cA^pW{7ZZiKAcBAFyXXfY7@qTH3 zWqu9&*T0o&^Bd(f^IO;~UQ=FI-oUw!H}hc(lhWzDwcSch1LT8CMOW6!~n)?Di->uBp3>saeJ>v-z~*qBeU zPPR_5=2@p&r&*_4^Q|+iGp)0%v#oQibFK5N^Q{Z43$2T+i>*t9e&KRx7_Jm@`_-Z3 zZrxzrXf3pEvKCp3t(zgEFR^a5ZnJK;?y&B(mRfgNcU#M>d#rn{`>gw|2doFJhpdOK zN32J!<)l+YmQ3TefXGwrhKKfn8`9*~NAbyQkgD?rpCp?rGk@?rU#o_v?H!v%Mv5 zX6|nfum{?M?5*u>sthcGC9k61&tcv&-!Ydx$;M-qGI4-r3&8-qo(O ztL$n!WvA`H9%c`>N7%dByW1n}J?uU0QTAT;-u7sFj6K#KXYXV0Ymc`l*c0vj?EUQn z>;vsd_CYqkmATHYw=?$S+`Y`x>_%}TbFY(HW@YA?4Rvmdut*iYC`+AHm+?5A;)^0W4H zxJ~&5`$hXD`(^tT`&Iij`*r&b`%U{T`)&K*_B-~w_IvjG_6PQdxK;UM`xE<9`!oA< z`wRO^`z!lv`y2aP`#bx4`v?0+`zL#q{j>dx{j2?(z1sfWUSnq+#Zev2(H+BKj_FvA z?KqC>cus*+=oC4{P7kN2)641YtmpJ`)^|2=`Z^mr{hWE^&zcc^n1Yz#*@M}~GF z=UC@BSY%FsHRdE(Vore-=2Tc=W4RM{l)Id}VHvpxR+0Oh z`<(}z2Vnzw7&ebbo#oDBuz9VJ_ATcrZa0(GI@rNpu)+GrF3qyN1hL)3vxx)pcFZEpQ9nB50L+xINuo&@rzEE%N%%C38)( z&?7^04L!EIxw{1{Qd_zG-2v`EvUF|>yX1DTW)6m3GsZ2IZqoJL61UVXbIaWdcSvWO zC2XJ7uxh4Z+Z+aq=Lpz3cXvm+dq877%H7M|+a2wWamTvj+{D(sme>2o3$ou$#_vPjyd&4Rt;&sAsxoxn~O->Ur+@?gj3J?nUm!?j`P}?q%-f z?iKEp?gIBJ_iFbV_geQl_j>mR_eOW2dy~7!UF_cM-r_ECZ*^~TZ+Gu-?}Ux&F8A)7 z#VT*Fdc=LyUG6^SKJKn?pKzZPR;#DoXWVDq=iKMr7u*-!m)w`#SKL?K*WB0LH{3Vf zx7@d-Em_!uKX5;kdSv%g_cQl%_Y3z+_bc~n_Z#Xq# zyW0KTUE^jw#luz&PxlOud8TK1w&!@R=XnKQp;zP;dp*3KUN5h=x1QI>Ti@Hj>+5ak z_479JHug60HuX01Hutvhw)D30`g;Ssf!-i*YuL26g;jeyZ+mY0hK)N8OLr2s@Di`o zEAz^|3U7!v)Z5Y9$=li6#oN`Zgnqi(OL=K8@P>KAy%FAS-tOK=Zx3%zZ`j#(DdA`+DQO3Eo6+KW~5U0PjGl*Y;|?IBfPo9$M%HZ)DCsq1LZc*5H}rMW3H&8nPUQ`g$uWLDO;W@curN{a4i zYKXNv6ipp1&vdYGmsWqzVW$oer6*ZwLbS9%G&h~^M_S^Xna;HnOUPG*ORt!a5KhPG)#HRp z@i3nH6{mjDh^FO80;R%uLa}N>v1$ToHPu@kg0z&S+dEpDtaM9TLt}GO0l5*Rqo#v6 z4SHO5A&AqUQ&)mG4SF>pNwtKmA1{%kMbzZSX!KID3-JmO21ud*;9W6>0kEP-ydvoh zi;U^8JS+wNBogMZJS^h@y;~xt4;vgec{PLMj>uV&92_rBDSx#j1V0?M3L3Tws<(pj zRZzVZRBr{$uchoj!_*(%`B10@*A>I<(5wA5e);>>|) zB%Z7?N9Jabcv{vCH>{hGPofDH4}m6N7{YXkE@_|o;EO(hkW<(q`HbhM z2@GBs}i6Cp9tM2LicI*qZbH#nkeLe z#geq<1jI)8a{dSSON~*vd0wI_A_<*JXp~DND*KX6ip48^ee~334&iu^uD17{)Y{Gm z-5ec3oRU&=bRKaM#Hl6X1gH`MOi9=j0j5L%HW7~p+UVJG4E<_zjHuWf)0Or@Zljcj zsg!CjrH+>pdX|dTfP`|1k5|%EFV}`xB3@~Z6`d8UFoNOISxVh2rS6r|xR;3r0g37Y zj>T{X*VeRUtg#Xjvg66LKDMTVjpI0Mj+0BuI6~!d0+rb~E(8>g>x9tbqRUK*SjiOi zJSCUnxSZ%?ahl*0k`Ke1&>NQ#B+3X9WnnzQy^LN=k{=L|(!<#*L;*=iNT(MM2bt7k}K${m;#;p7?cowl@MK(5IvR9 zf=h4;(v*+j6{M@I3B*266ff^i%&mR0dliJM71a9*F+!M%d}AUg(U?e*LZZ4XFl!{| z!6_|WDVt7L5%N|Mdsih;1S~b7NH{lDiZIH_uBSt!uasR*S4!R>L40mJB^R(ng6gjf z=TvH^Qleramb7Xl7F#uWRE?)AD&3mAOe?(6}iuqKa5VU9}5!NHY_%hg#K zatHt#)daAC8_2P7Vg0EbUz5m}rXE3%gwL)amP&T5k~)bsiu(w%+$Vu2E9TI}oFsq> zeku>=Fq!wpt|4a3s12v|csUJP2_XpvPe4x2gb+97e3Br}AzohY)#ah%)^$N%DbQm% z5y%_!{kT;ho$^X(dLmLzB;sa$ZWTallA6*a_oqqTPsa(x;m zDN~L5X5uRnewme_xilki!p-FSnjsR*jt2(MFJW04Go}D7 zyeX04ozkg5ES^Z3Q}Q5-2lNVwxG`mLTb;`(H&GgcS0a%FAznq!B);U5kVVYAa0weK zO4wBXik|r2D3}FT_&M8v7VFEzNXZhDK+z-gs{P^m$nl3ddhfyiJrH4Tj- zpPLVR2X}!O^k@QdNg^L#GFh1P#EcKog4`sH3oTyhB%yASAe}5>)A)Fq(DnsF#pzj1s+Mjv#gTMk8L+Y|PK!@np5xn8PRtEHri`=cY-%O(#=kYpQ32*ZS#=mMX)s=0Z8V{atXW7-&4ky@0s+H4QJRL4PQg;mkp>(Rliqm9gebhzWj~q$^*lk0A}v7?p&sq&HuR-?0Ql{ux9-tx-bqQ><0Ylj6Tj zDQKPC&^DFNlduN}L`jsT?N&lJvo(S-C1qx79%CRw$?S4b#YhmQ5KEgTmNs1y7_IzO zz`M=lZdETKsX8}+b0WnQL4B~nR0M#K-Ap}%8xMEwrQ3%cy)X#+-c}xl6S4PY*?=jfsj!@Xj zl?#<|>9UX?#=GWHNu`JPCS@FYhphvh(iIiv zoTwm8ND@%9q3(#xTfWrQU@{a)0(o6dIDU|1bHdj}s?Z!DRWc_&LwDBl7Mfxz2;IS84y&0yy+*uNvchL$r$UO>#y4nt zHLx)aQ>NGGdrfW7_iB^cgd~Z;K~Uw6nx2^wHCsqk5lkAAVgk|t1vI?`qzMX2;lYpf2pi(MW0+RBBpxP$IgcP-sv`{BWQck9P zQ@k?)oo0JqsuuumIaBzg81kiJ2x?~Hmg8kmGuO>&6(IAa(F6)%0Z?dx%XxDN%fB(MEr%KXMe%AF7Y$QJ*a5zEqDPe}dHrOSbqQ;Tp(<9!Mn#IBco4 z2}q6($n+bKJRL|w3-U>t38bPBdUN7Fq)8ZIsz=J_2#XHGl{6QSjw~RO56A=`kkTh0 zQ+z}N3{OCmN#x(^F6WFPzWC%Q!qn_zI$F5?W+&2#9|U$Sf4loE%8=5HumwH!}GI zBtZqF&<)4}5fDEekR>7@3q+7AgFME!GHA0K^wyl#p3qJ50nq12`bbtMSeuwG+iNP&hJ*WIG8+5(vnK5|Bg?kaZy-E;*3GFO&`;>ClWxHj;oi{ygY9V=Cish{zrO5W`ck?)_}|f0dcMYnGFKsU;{EA1jNY( zr0fo8KTRMtq?pTzn5DW3VS+Bn0Rio^2}lDQNbOlXka9X)%1;{WASg2h-O|)9Q6%O| z6oE^Vv_xx6^)y+B7Dci=`Vx(iUjP&?O}dg@K$w;YiPl&es2*uKhh;KspWmFKtlBN9{}FAHvj6IXwU#)V@SqgsD97`M%T$ zg5x2$NhTaBA^~T(DI?v{D(q$mh{ABo&6Z3XCJ{a@ASlXWH-YF2+zO+yp*2ht1CLAs zUyvvOgm9v;t{J+(x{lV?OjF$)s!Gfp$R)57u2?hSir0c0ria}VU_-nZF4QX5*t8rj zge5rQwD~GtRqY;A@Xq;DGx9aogZt@f#)La@q{n>!#@BF1iOm@Pa`Q$v_Z6l|Yt z@=|cxXEnpIWzqJ@mMF{J2JAgRIwTgI8Rw?`iREr4MbibxzAv0pud`QG&%4t9UmTlWa|Urj@@lkIKyGsA)u?nBv2*9eTW` z=JwEUwKR6{O6=(kO~T_%?`UjqXla~-NTs2;gjqzJpM1^9#)7W(*DWsJPo23iiUB!0ir$;__9$`2(A z#n6N!XHjhEBQlq>b|M`w7nnrYIB7;lLt|sFD2m9aqRu#3+yxsc5V?--rl%nd!MSPgW`O>uciK@y1%(%iLQB$93b>$=`fY0A6kt}s;IO;cM8pO(jT{&q-(7$+r za0cLkqRw>Hb1kBB^AuIsiJY7qExCC@D(pl>UW9~-I@3>&uEbN^g>o=Y(9FQQX?DaR zkI02DE|q22iW1ZDjsl|CU}fXgk*PH2sWck~H+4*JHJgM(7*}Oyrnj`u!HR9x3~mG0 zYt~AqPCE6{!D7hMCQAp_Gai~M9oThv=wRtglMd_(JaW2ppu*=NEUw&XkqR^F?PL z9_}>z@QBW{kEmLp9rqF139m#_?iHh2D@PR$A5}PfRN?Sffx|}?4j)xGd{p7^QH8@t z6%HR&IDAy$@KJ@sM->hSCmcSiaQLXg;iC$Nk18BKs&M$I!r`L|hmR^8KB{o|sKVi+ zTH6+mYHe;*Yf%&5P$n5OWT8>z@ti4>qgtCERTK?JmGXq6TALfyT!I|c+Hh1+yBt-@ zkQ-IhAC4+INn?rnaz4?SPNRx`MAj7ka$QEXcCArG)ikPTPfjMh98EoW_|!KwPnTHF zeG&NZpn#8z58=Z@g!SA@@X6(o@Zmv;^^pV)A08A~&piS@xeNp!9wzv3uY?cxN%-Wl z%eND`<=Y9b#95I&zb5lw6n;GH5hp83N%mG`%X|4KB#S$T%Op;%v zAHs}>2xi<%Fw5nUFylc9vq%Dm84n7WagTsmE(5`ghY4ofD`Ccc5@xyV5@sT|gqiS4 zn2GFpnDJl~W;`6iOq7y<5!v$ID9m^g4+{YiCJtI?q@EsODYwO?;E1r4yy8;hfpAz( zvSe{7m?Blf$-MW zG&VN3&xY~4p=Ju;C)|z}F~B7_6eYr~5>HB`f+yfp<5|L|VfE$NIfNx8`}8{4@Fv(_c z=_%RKNKBDbp5#i*=-`t#G=0=+FRb{rklBHnVN_0ECMd9;v{5pU*G9>3sAiHOS60ed zSTUdpnyM2Okl+cZ;QN)BU+`AmzcISk7ja#oeC%9)X-MT*ML zPGPzAqO(*O>0nD9Uskb_VXGYZu+NTs*fB@Gbj}y#e8WPYhr^Gd-x;3sjmY_S%lUTC z`9|h^d*pn3=6s`azP)n3y>q_NIp3I^Z*0ytF6Y}P=i4{u8=vz{$oVFQz5DkDNDu|l5{0QQW;Iz3WT0JEF-X!%8+zSA;H|`8kI;ZlcIz{_2dbIB65U5;Rs=b zMRJ4@X2}x<#e{?rmdFtXMMMcBEJC_B3QEGDK#njdOoS0;l~NtOJqdO))MGL<=Yk?B zZ;y~hLimLG*RUnA(1T*_{_2E~8j8XI z@E?MgOiPwV17Zs*rT8V0l#)ocM7%tbA~&>#wTW%7$)2Jm+5;QO>qlyV_>oTmKNtHB{ZSC7NI^glXBZH3 z1eHlg0U1PlR~GFR*V7}-zDHMD$bvV zi!@dt-?3)|ZN*Ge)+3LRGJ?-U{KUSTiOPCLuritfcqxMtmvA^NKR`I&C2%RXS0|SS zkc!Dlf)wZAaw(8XqV?gVR=&QNgnV)Ss8lpDKSr1uWXnY3vi71(C&(4&4>3h*smc#K z&MC=07U$3IL~?fOb0XT!gzP3)Q*%mc=+vz25)QoNUke9VM1W4ehyYh^6QX06X0%gD z*;MWz1|gzclEOf=fFFe?>}X-V5Tc@(>_^9du)nBzt-gcs^MK}O6C(9hN1>kX)KWB? zTm-4BCDE>yhdt)`*DH-y4dp>3CE5-)ob!~T{7&gGBd|0| zj@U09Ny(EpvgHXCfhav=?{ruup2p7Td;nXUBLNAYqTDX!NLqQc=hz6IFI66eP`RwH zXwF(ghWQ~1e&~dF6~+0TzL6^NRTQ2miJzbJj0E{{O%d#oC+K{-An8bu6Lmf)$XW(D zqr^{di9=SA>iMBN8O)tA59}d{FL~&y^M99!=$&+C{2ZRq^qgXdpk>II$bSF+Yl9 zew0JPcO4=Xq@!ih5xm5%@JKdVBxDZ)iRI$W#HTkR8KX;|pUNW~dY4BkY{bgrIRbgq zMj%>-aF3eJ<8lmptVN@pwswk`u6rUyOBl;2E(4fm9nj)LWX0 zxP}|5uX>T2!zJY7%X-U=1AMC!-#Q>Nz;MKyzdM zpfK!*r~$h#=zxL<_Rb}e(2o|QCpiVEJD=DUwL=IjnqC@7`Fzk8GfD>lzCZ%f`QG2w# zT$y}I*D^Wt&|2-}Q>aY8uy67>PPC!!lEP9lcUV@Gs*^<0ubU(S%!a}^)v3_BQ>Z0@ zQzYYy#YzbL5#+-+fy6M#jLAG!#o`gJCkDG3mEmz?ZKr;+Ml5CpH#gzaxmCyo-oW zC88pJdAB0IFxBB>c*1;v!?AIE6tA_pM%WqjIPWJk*GLc==~$e05Mxc` z8dZd4eTjIrHexp!Rb6I`1ffu%QX4hG7#p5cikJKLKGBhotCT!qp$Nom)^4gu+n%X&H zU$|Y@)(*o&-Bd>$?BIz8riGcJvx)GN59Ot9rfq6tb8|~BiFQ20?jy6x0}(jh2EPg@QbFve$`&nh#9E`@afq(h$E$4V$hdpkuDjKiWpgU zJmnqCPnTd~L&XKtxaqa25ywUw>Ku8b0nx0He-}a&h*#n$FyHqt52?sXN_>7Wpb=lj zX!69VS^$)eY2zHO9I3e6Y>n3z1`MEy7$Kw!0|Z7;7$|VSozO&{UdKq%$kMs`MEFG& zI@^_|Ptc|5({pLLQ6JD2?ZA}=5};Ffd_r{8nkffezExFV)bMk1*k)8`VAD#S0n(}C zX^9vPu*ju6ZnQMCWGwy<;Bv_&e61`C0(UgW5^QkFw2Ep=(j~4qRV<=h0h)ZOPaop& zrNs?OJP8S(5XPtPYWeaT4LFY_aov|Eb`X}3@#(u;J{|2N6HtsyKX8S~3@+6leyB;F zx(ajsU_`PMYj+WPrlbB!;62a)Kb!7sA4% z#hF|ICGfZ8QaSprm@iLk04@?E{D9J>B@%mUshr&TfqW9vd?GNPFvyo@uyGV2d{63+ zG=bs0sa$x5TAo5gyu?&ro;m~^sGL0Si=!NpfPKP9pD^5)d;b9k%1?Xx$s~yP58s!{ zhu;sBCQ8m;OL*WjJ$&Ny>HLr{&ku7Zo8qZ|@(Ut(f2vPnJm4eSPZE5|@``gvvRsnj znG6CpjeiVJ)S9fS)|xt`R~}@>##Gtiq&!p$j-4vNS5^4=x3HPeEj2}TaRVozD2_gI z63{vEfR0cHbc8yfBh&$Xs34Gs{V~gnR|TsnK!LDm87J=~DkSL(TdAtRZpCL9n!wCS z4>)L7#0cKd5ngViBp=oknGePonNJvjq*qvgWJYe9p$apY+jtY$u!}7~(%(J{n@}>c z)Z~WA?Q;r5792Up2A}#KvQ@N25rrZGU!&+~!wkz|jHAzT=S^Hf24O+eaK#(LC3`oW zbBRl$M7%&+xPmy~iou5~hzhQ>8^`6?AuJ#VS3nMKI4x2;aykYhBqj-L$PxJ~E944i^aAS0;0qc1|l&7Zbve}sY773ShC_b!~(&c$JY`UguX;)W_ zc6G%{N{Xy=}ORN;}YQlPoIxV(02tOREhc$ zbf`E%hl~^9_Y=dffrOuZqa)r4`uq})XqOA>>Vl-rXKt}NudXiaVNOtGy|mLfJO zNuS|J(y{p@9fMEOG4~`LXHU{e%p@_ANjl+}Bs@*hNya3dWK7Zt#w49!Ow!55B%M@D z(n-Z6om5QHx5bijii#yeEG9N2NhcSR^eL7keQzpBpKVLh2cwcCCnQNuNYV$slEkJY ziET;J7a)>yPi8DBclf}iwUu`GK${{)BSkxnpitpqu1leKvC=?)DMu?s2d`6f@H$1` zQcKan>y+G?g#2N7frSXmH919}X-yIKqzG$Lge@sLG@YVD(N$6dm+U5zmn#(Jw_8kZYRYg>9Qy|nXq!lW_>PO!(X{_rLX78j*$yJh9y&!A1N|HjM z9}$f~ag!^U*Yk86+0kvo9r^P4-gngX$aPrgY$Cbx-Rr39nePZ?6Uzh$c5p|XBUP{v zO$$WLSZ{fzA`uW93wThb5ty(cv~DW$g-{cloFS9)j5w+W1`B~si4?#og@*bmk<>yN zLCM8+;Hz3|Y8#sBJ9u3^`OYqR2S6?d-$?;Z0FCe*J@60Pg{9cWBcS^1s{P{%!+d88 z1z@=Pg=a4iA*#G*ZuXjlG#nso@4;h`+EN3dljjd3pjl{b<`EwMY5|omXau{-*&Civ z90mxUxiDoelqeI1Fl9=1N3@a)QQ_YFTS&amQ)?P0QxR4HDiA`}3NWdut>A@mWhF~?1gkWNegzydB zNC;NHNC@BckAz^2i-ho%EfL}qG}h`;V7;8N!l5b@I2(p+`odOa=ouAy#)Y1m(31&0 z&7o(GOU3csvI22JnCQF+BZ8R%MyM$q;q4G#3gu2cnm39uc+>b9hiI73QWWmN(*^t~ zqL4?x04Pl`Jp|=&bfQ+huo=_-3EmnsW!EAT#G|FI$BFFZzfXpbcNDD5#CUAFmrOg>b<)LTdko{cG|6_5MeoJwW4# z$ zCl0)C&|ZU@;PT()^jj+2rCV=3aLw_L4ElB8(oVmHgZd6!f*)M?KEm(ufu{{zGH70| z{PQ^A)pudkGI6|HQy=23|Pm#axMN2I43B_7QJEJWE6? zAEDe*MH_oQe~*2(oG?$R#yzjy{$-c(=QY0l}PRQOvDH~^Z z$R4=n$Ly-?fg(>sc5e1ZN)rz1%_85H6q+Jkg%}AI3=+P^S41I500;!eiHb5~fL)|Cdw}){`BLm<~BJ z=kw%!*_V(mXNgTjY2nY#&FA30HEYfFJXT_&!~%rYp5N#4T>mqF;VjK5BfD7Q=DO%P z>#yC1t{A&^4%B;Z*I0s7muLawxjBe0?2_DRE$s@~u6h4B9JbS4&TL3yOS?<$J}&!g z_StSzICuCr{<06E#^>dGa=csDsN_?!U-4$L56Q-|^Sf)b>wMN-9@O#G8p(r*nW?)x ze}4_>uC_lDw{F_|Go>SWhD7{-$-C|m_)FFNS2K6d0cCIfD~;sVs=rd`Pvre;z4#Lq ziY(a%ne+cm)`QH8W8L<1F|G8MsEoIM_v;W_p3$hrVSmDQnAsJa=~0e=5^`TK3}ZGW+^p z$^GBT``;Y%f7++6bf10dKh>DMIs1%E@61O<%S5q2uJF;+|Bip%t#?;{_NVS*{~K}H z@Bd0Ie{S5nj>unWVcmJ7Yrwj5g(!cpUn3cvSnxfL1v+8TW6lub*6MlSX=+nCBq*C zyDy)8cwNOptm={uEz&wt{@NUVK)&9!F}3T8lF$1;>H9M?v((FFuUc0>)}6Ah64CfP zWdC@Mik9on-<{sLyL|sSF3atU-TY;*2Oj(>drLQk|8`X87CE#qKZJ63w^C84z5Gv2 zcBg0PE>6}F&g@9h2`_||G{<$pq-;ss$HY47vzy9~E~RrTe;mqw{>OR#LJoDvv3!4# zdk+39L*{b7$9F2J?ztkS9sf0Vj606+2^!Lfrxh`l`LX$>`IWWGDReJ#Z&g(DQ&@m3 zr0#=fe>}B#rs8SB(~jp5lsC*zOsvHAJNCN@b5C(kS1fNgZ#ShtDI5|E898M1knuwf z9CGxK6Nel&q<+Z3__Yj~$y;M@us7LT*3b5n_DcI1#PmT;pPHYUpPOIs+ECX#_f+>Z z_jGr@dxm?XyTo1UzU_X8+Q%w=(0T$-Ii8*I%)^tygB5MandHK1KV&a@x_g7;ktW}Q z!$=u|y;tVb*wcgm**g@~8V7zxHP2AC!2c7JL5j+j!NRMW3?rc_#d!F->nZ1AkJlB- zqu8ecF3YPElzPLJQeej*!(m&p9a$x-W+}EiTf}ab7{uOZpPS6=XYOvEU|wNfZQf+w zVcuyjwUSnuHN@J<+S%I0+SRJG_P2hv)<|qaoft=OVJaZKSd8`ge3ZcrsjNSb!GFZC z)4@aW|I0+oGK`0p{n0Ff{zPNXuKAQbw`LxE{jBksJA1R`YFa{e)ewj43s(- zrA)N9j6IHLr6|*3{Ra1U)NktNWEY@(2fHz=u+OqX*-zO8sB1As>`;#PsC_7EAF4R)rtD&jbqB_}17qER9-WUd?!Xv#V2nF3#vRD@ zIBH*k94p~I1^2})f3vyPYPi3{U4vX6hbeMikDT+6^Lpf*hn(}!;$q~!9=Ycs_w~p< zPw9a^%|-5jJppJvDIgZG5AgOTpkU$gvd?2Ao;Qo(UzA|nl z7|#xPhT{Eq%x=YYfx9c(u7q2SCygh-GYrpgq>q5R8`4L@U4U{oXAeYA7NgILf$JT> z^$xQD{yuQ~0rFcYk6J_V4m;wJy;zK10E?7K`Z>VcE!Y4ynC-xZ67~jc7%+G)JBl66 zj$y~M6WK}Z6m~j0i!A_F-@)!=OW9p)8GDdD#2#lW*c0qYwvs)?Ud&=*Vc`;Dz;SyMGN(*Q-7re)fuW4fki7MMk5vDwGm$UNJ;#(dgxEZ5q? z+LCBwsI?<#<2P%y^*bo!2}vXF4sHx{+-}MUWejGFNy>?s>#k64Qc9G?*cV%+&QxbA z$WyIHwHAFdBq zZqTRb9m*gSHkn)DPjk%5Trn#NDo${7hW|k{&o8!&#$~)#nbE5LDd4PF< z@}4=>Y*5}epEF-lKD79v_LvKCqkm2a#?)*|Iw zYl*c)`Odo6x=;Du`pWuB`O*5p`bqi8_H0l2#V)dYD!YRq}od0tIAKR7?ArLN%`YMEN@pWF49oQaq#|IROYn15w*Ve;tYiOJKF zXD2UAUY@)rxiD8#qu=S5T#^qb?@K{7P2T4>c8x{M5B@jn z_+95O>h4!k)ZNej>7V>iqb+~QUqfHs^_3EB-9O*-Tk$Ip|G6*!o9(atI|A=?vVSbz z`8NMzF;CHV+i=7N0oYTMz1It)dFQm<1V zQ{GlzRbN%ssIRMED_Qk7ZBw<6wv|??R%qk3@#=U!lc*E4TeKzW9PKu3xq7Jfr1rFW zn)a;roO-6dzCKJnTOXs3QJ3py=x3{s>F4UtsZZ)3=s#(e{;U40)(@oMY8x3PMv1nu zQEgOfn;5qn%e76J$2={@da|BcoX<8|!d&0nKuem~(5{v6Sw$-~w>P)f%FLvh)XL2Y zvqGydcQSXu_xk>nQ6eZBOes>o{$cb%S+-wilm; zw7socty{Ix)?L zB~Gb!FQ2uv`<>~|bnOA>Z08*9LFYW@JndoUa_4gG5k6~akMdbdTkbsQJfuDDJnB5E zJ>k6Lyr(_seC&LzJ?(tve5O6)eBpedJ?nh!e62m_eCvFxJ@2e?R%tIdzdFBaFFLE8 z)!Iu=*2!uwyI{7pSG;PkT6+~(cO0G_fq9k6aA4qAWq<6O^&}da}A7IQ9$F$$TXP$9^?%@-SfJFY3(#BcBCE4p)ERYn#@O zF z{REEL`i1&x{dfH$145X73CD8%Dx-(dU%%S$jS~HCV;5r={T`0-`n|?5W0-!QF~S(3 z-*1dGM(Ph3ql{7dgM7u+A2P-o)AfgqxyE_=TbwrZAB`uBcOk2MZ>%;pV=7aPZ8)_U z+p;27Wc-WMjIkZ38Do3CLK}nm3T?#LwrpD?&bDLQ8wtKn8$K&%LyQtmS4KJLYG;E} z&Vj~Q^B}X?IKWaZ!^2^x6BIM4dT`pLKg*zX!Q+XeR4#!`D*d#v#iu)Llr_7r{#bG=QwtpbCz=sJD%e`JIT4gxqzMQT;yEDPH`@E zE@ksT30JaHo!gw-*nCb8>`YD%>}=4(a(1rsjPpD@-+9G(g~vao%#? zVwZwW-e;F_I$;Z(&z;ZNRn9lgH|%QXd*^$0jq{_kie2mc=KRKP;0LPMjjrw*Y@rMG zk1gU9!WM%%&cFjnUQoq;%3^hW%c9PbUr@!l|j_qzd`f%jmwMgiwtj`2p3F~evzwl><04r5zmmT`o! z9j5`*a)EIJ@-8xNF%IPPVAKkFXg5AIJ~rkVpBi5oryJkkcaHHLDCAsY4SrV$I=PY= z%r+JXYPn8O%k``WsO1LMoAovpvOcVjaT6$KV`Gt^mRmtBI~cbKYFP?u8EV|cc4E62 z_d-S(W<0<~uo1?CY!9}F@emuu_A(x3`?7tFN7)26!B{Tn>M_vOuEq+p+DscC3hMd< z)HTES)@(OtGTl7UJPE?UJo7YWLq5Ked61E>WrgN4a~bPl-fP~=dYTWI53pY5L*~P* zx4FVx!TOj_nNP9x%{R<9*aqO24c3=aDcb~8dIH|bjRaj?OXRx8xS=L!>M^Ndb zY$xk6>v1;0dd7N&?Pon_J;(OvR0^uoL6eQ3$rbEr`%U{zGj4xke`Y2))tM!n>dX|V zZX+}8Z0c-o4s-fD{mtDt?U}oC+A~LT+B5fbc6BPvQBJi}ZSKwK&>YR_&>RCgY%#|| zhjOGj-Z{!S&OE?5-8tQ?1@C;0SqEyo(wypC#JJ4>9~%|k$Y%grM=*KD53>CK$a z>CHSF^!C1a4yQ5mQch#$Wt_&$%RytS%quu`nb&aYGOq=7ndWuw&+gCWLQY-gP2LD^ zgt^EY_y5>?7ceP`tN*{JdwO;TRzO5VL|yhWyEC&ZhM*Eqf(pc_ueyi?32qRLVSR}b z;}R|lu84>*B2mPNQB>9tVw6E*)X-=U6>o?JFE3F-3@TA$5YZ4tr2n6DW_o94FR%+3 z&F}e7J>S#SRn@1ftLjvpI#oU0es~~h{+Y?he!9r*xJ8lT$dbs?$b*p;9>2)#DPPn0 z*sOhVkyWu-k@q8OB5Nb-BO4-{B5%jGM&57Wv@wQ@Y!lkDix$K-mPaEyBD=w%u1(JS#!*iUy~tXUUL#O{kuj@CtIM&ptqdXt32cJ7~xE=*lt-g*CAtaiWL zW3f-#<{}GXx8a`q@?Cl7*z}Z(-sAb&czh}LQuN*!bl+TL;@(|!S!ANN!{x2I$CJ^A zVvj^uMps9liLQ&j5`8`TW^_yRgXs3?r_tRpf2>`sQ><&ON31YbSRR0HS?ritpV*nP zezAeEAsmOsM#RR)s$v(%E{%=%`W89nN}KjNIBz*Gi@? zQl*sLj%ia(%Y2sRYB@c_W3-+pvr^nfpVK*Z7vYOl1~=S!gY}Ed`a4l|ncvk5Q-b9`szRlwou1)!xi;td?cH6>ti7z%byf`*C z5Jgwknx<)Uboi;c;3(IwQvnAl~x zF1oe_HzS(uB-QK#=Spucol!bFd}erP>Acbf!ngGH4ENGS_?I;2N|zKp*@CN$Zfn*Z z8{IFLYT?o2vt4*X#zl8D@4{8l9i>adBT64ET_Gt-S4l|p#HKD*zJIQCP3roh&HLk0 z(ptJUb!>@K>H5<3(bM+F#R{Tl#Ripbhz$}~x+yj&dRBBpQy0ECd~xjbEEmu6d*L%< zEx72g=&Cloj4sV~rQ4!Qi#E3Gq7Oz_mF_6rRc7MLaYY+rb+Nj# zU|CR(I4@^%9F%jWG0|x)mF$5GkB-c^vJPb(;H^(r)}^dVvrqY2QH!pudvrx~MOlH+ zMs8KKsT&mM)632&8(uc5Y)skMvdhY@EF07~gx+gcbawdCSch1!Y;sv$%#3b}4cG^#GLn*% zR?+O%*OLF7SesngOmWfoqwg0z=Q+wUT(r3?9_vnDJge-c*eIU(c6#3jrS~XHlr1c~ zr|jOMxn;}B9x7W|wz}-~vh8Khl&ve8U-kkWxFH(NV`ac zk+Pz@BF9AfMEXSrMutW%jSMMT961x;h)7lBV$R1$CPZo@(<8GYb0hPM?u*1l!$nwZ*k&Tf@B9BF$SYgf#ayM!mix^S27u>!f9-mg5?yXYnSFU9&Iv4aQ`Nje9wGzFt^mlTXETwHKP!Nh`T#E(=yqa|(mu*UHkH?Lqu!R&&0(QwfctPJ6T1w9{< zV?}|ufiMXEK3syyz6s$>|7p&#zIkC|!Em&W$ zp&!S3wz$v^WL7zdOp;1Wnp3A zz{r}Ot9w2}?7C?0!ZIv1xWcaDdcIQFqp)kVchA@L>`jU3xuxd^J-7G#wCC(xh6@Yz+PcDHu!P`b_E*@au#X=5h0lsjm%K?nD!ND32rV2^{0hhN!ZQnpR+M`# zHmh(%VHLCrcX7k4byi_*;RM{Jh2x>M5+2!9_)_6rShhA{-@+A6S34KBF7Xu-k8iHV zOB!{B^9yfNpI$+{TrXEVSGc(FzQW~&j}$&u_@tyLd=9*%zLyGLE6*?7ShyMbF4!8` z6q{RQ2#SotPl}j_V_9Q9UAQw9mX4MAIZookmy{Qm7Z>G&&f??Pt>~zf58IkqbiBIa zq7#dvMaN5sgr$xed#va8;v}}{L^-SIP=riHI~1L!?yRC=(GC?|ibfWVuIM7JJX$ml zcSX^HqDzYAl}9-rr*siv6N{!5%_y2p{DPv}ix!nLy(?N;v;-^_SxUL`P1x@G7Cjj4 zTfV7iMbRofTSLg&@=X#~@<{onlI1BsDb^Ql5WnY&HWfrusfxB0yY*p#!9PM~YWAc-qqQ!%KdUCNKoAD$=vlq=~G9VD(eSlmI5UbymTCsabP z1me77ahKG2107R504w2eamC$1LF%kH%+Yhh#YaW;F7B&gaz32vhLlenq}}GOo1GV z#rGB`)ZJ8^XgFIaKGJO@_8zdT_@UyJdi}-}NAVZ0?#fxVD}FO|7JVgkEPkeVUGXc$ zugf*LF%{=joKw67_d)UYigUVdE}7ev{EDkE!w+`d9DXqTVDYD3Sn=+PLFH>odT2RQ z-qCg8c~a^E@s;=`CRKl4?Qq`7tKC!`$@Qta%B0Eo;D3y|!jdwMeMdfU7GThjK`*wb|n*1 zzLHv=^HM2+lIil?xD`?c;=H5yN@jWG;l)X8s^o}GU#r(#nw>JmL#UU&WL9`ZDn;t* z=*p7$B~M}lytm}GlDkS4tGh3HZ}eV~GLbb>yhi-WlIL(Ql{_XsJ?AP7A+}^=$>x%G z!@~%FMqJ4!C0oHK;x9L(Un|*JvNIeA=Z8CoyM>Pm)A+;3hKZ z@M+=G%8v@4RepSAQ^lC@FrcG!MThX{@Fn4KxGTaFOU-g4JS{w4AGlNONjSFjzdEv|f= zxbUj*s`44(HRV@?-^Z;DuNS9Qb?r5z=O~{|Z+W}8@CMwb@Y|%^#?_0;=fz$M?_dPk zg(kEqRx7$qd2y*JJ#%S?(qL(@{3woHN()N6;|d53mzJ0IF6~=7pmb2_veMJ}2gc#0 zqi|zzV@oe9y|Q$2Xyx)}ySjtgP&qvOZ<~$_ADVDLb=lXxWIeD%{0omzIq$n^0C; zHoa^XZf@E9vc+Zh;chFt3!3sTFMFiyv9c%82Y8;c=gMA+jE)4#UW*uI8_PDcIVZpD z-LkD^pF~cHl_&w=@vPP*l6U6$g%J^K5`=0T!F3mw8&YJVZ=|2 zjKhrvm#9zT1mdPeW<+L3=BZAGW`aJ!NS*FIH%o6q4{?|1v$3uf9RyKIR#xsR!jUD| z-BQtAAUck$xK)%#)}xNnpF&yP|ZhbJ%jZ-S$k-)zE~ZQ^?}sdz?0JV#GWf( z#M*$Y3T)MN0a+E8%_`(h(bQQN$rouV?~Inzt^6qUqaRgtFF&@N8B6(z<)@UNR(@9b zu=0_l7+rpeO7s=wSCmgIpH@DDad39|yz&Le?V|D}wdL!}MGJZx zo^O}GUyjaGzO8%*bXSEb&s8x<%9q}xJ9C*XP-ZCTz`ZN_Rt!K>A5?KVqw?^IQ59n< z##UU${*IH`%`}HUqrJtt#W30L5aQhd*+uKuU9$n?roG^;*U)aAey4knc zx8eV#{Y#^>eY<@-t>g|`Kxb_MhtLA<#=pp3L^!+Vd0XTj+C)g(L`d5N?-JPe8{g*5 zjio%xGJ6^CA3S9LfqSj6R~S+DyF2)$eOR=QXN(T)e1Dd=2H5>h>s)KECFBMB1wz)* zdfI90X|Js(Pg{>o>)CAB_S>|feA>_!qtO1l{dc3te%F2%|9iBmB3jjlJmYqIJ9lB< zJpRw@T~OC{c~`?1FnJGzo%2Rl**k9>%=W2vgtrg0H_F&W&s$Bj!VdU5(iXdFTRfPy z*qtqSN6;es&>{yKfxyXuQ&e(2jY3BrqW`!8j`Lv%p0BlLC|QPY&?DRbWbBig8k)Hc)GPD=?K7 zZ_?stLa*Z;r3%^WV|3Tnf3mjz0$TsgMt^qw&o}xa0}F_~6-hW&C83K-LRclCTqWU9 zc{70bVR|A7K9z)^Nyq$*48w8&l9e9gi zm(iX#3BJI;8<}aZGSd#3dCtg}cMFWX;0wWZh8=tnDau2N{$z9uzKkr{$Wlk6U8qy2 zlhHABaOhwo66zf4jQ^0(A^5u>X&qJ4Y?U-iCC!hdB~;QZ^M~dSjgBgBeN^7stGrdH zymeH0v(o*aygy*6jPYg_GIprSSV5MIm8pz%<9(x3iOopbF|sp@5RtS3m9#RIv~F3F zcC_}FK9w%ho?%~03lkZ$?d$C8@Qb9G_H27LevvoZo@dWPKBZ^vqEdI1N?jL~x}#Ly z4pvD!SY_;BTVyOROQI~5sF?i#J+2SAS^-aysB-OheJWRWmR#klTpg4pSNU0Tm9KIY zM6NdT&eB`9ycZ>Mb&$$c50$GURjzudTpg)$W!l^9k4P!fW!oRyALADpGwmJpRft^(X3snM-4Y<4q zXXUleI|$k9kjEQ_DuL})0^6$uwpR(vQwg;4&dWPb-jQQ;vQ!R(Du;nAIn2+J!~85c zJV@m*sB#!kISi^Cb_uQzt~Y!tje+2+!B>qymQ0qYOqQxlmZ(gYs!WDeCIc#yw#uYs z_`bN0KF8;iw2@A&z*d*2+P z=4tBxLa6bf`WGp^PHBbG_Ck%Dg?_P&cag}yP+x^`^UcsS8uw409&Dlb&i#6n94Oy!k zcv}>nztE66rTk|F>2FjzQog%D9>}5bq~>sz(t9O`#*>=cS(;nkXC+s>@e7@$*YYMX ze10g!pN$H=32EM0$Ep7j1y{bT|KD#ad9p$t1Dg3-4&C}f~Ex~`f`2DB*7Lxys z+BQxx8TYLMa{=@k{|V&tcT)1^TmHjH(_Q?Q<^L@qA8CzzuCc$9x-j43|E@?Qe#>${ zmo!>apKI)M)=$WPZ@FXM5z@xtJe|9rXFfrHQ>Njgh4StSPZW&m6TRw#kFC8#@Muk= zr58L})AZCdYc?<{^xWe_b*IP{fk zExh>q2=xz>GVynkQVRS1v^Vc@x`b%KIrk z|5+NYy_~sR!`~5VeX6l4t$v0^LM~CNceL(O{|uq#1?qoVs9#%}t^KDhS@+rPHMUY| zN-n;k{zH^Lq4aa1{vkq{+X0PYUT{J(|ZcWopDDxkorwFzFsQwi~O_epjmV>=g z!?kT#T7%}9n&#(111gEWZ;Rij+>D2J^ESCp(^zA9d)w!`Sz|Sa=BeVheyViy?jI1V zxivLEzH4@)-IzB>teKKfZO>*eO|SB6EfBvyPpOtRGdDu)bCfE7=3|oPUZqQgn$v|^ z9n`PS>pxBWfpJ28kBL0`-cfqJ%H88if2DMhP~+d~Uo2^idh<5YCnUtYT*H?s{f$s# zjmhX?-YwKvqv6*nJzVMUmEI}TJXQU3)&FDlU#}AVxYA!KT_n`_xB3@kAZ$DZOI(2X|z|d_-_WT)s|ptPRywq`;UzjCDcfjjON7phJ^T1_ex3bMVeAuwWT#; zXuoHcNw}rCHMCUCVKN?>EAr4Gp;LqgpH=#d($}Dm<^5Rwi-hJ4g1#f8w)Lq{f4 zC2wPu+tW&47V6(6ly~NYT1wjswJMd)5(=M5&?_|$H*2`9ep~Kt*?Qk?nv-pM_id8i zIz&@GA=E!aDDzIC6O>NV@V_Yin^3cZP~W*q+e^-U?S&guo@KOzTeFoeR60*-La3>w z>f5CLu0pwrJoxTcKKCo1`-P9yPp{Ja_%%QNYb3<4x$K$!;F8;fPaO;ms^Myb5D?-c}dY2i>^LCBZXECqWvi+r| zxn9#;uQ{Bn{<-SEQDf&Q{Ydltk>>v+z4jwb`H?>33eDkr5@NllrSzV1Se~ZRijwM2 zYWk$4@y`&>{F{W(l}eA+dnJ`~Qp;qpg!uIt%{t{!r?KI@VepLVtSX#WfIpn~9i>Br z209D1S1V;kX5B1)>t>mYSvq?%M=FOZ_)^b%Ti{`?Izj2#%HeF8&6#H_&$DHI z$D7b{ue0;yUT4dk&Ud5O=zKRQ9iVhp%Abc`>bp^>IaK)!l|0~=ybX~4g#UG*#-Wsn z@sZ9SKayDEBS{J6SqSGYP;%lsQ?By;DMgiMZ}oSPvhod6+Dl8)FBHyFFF%zu)zUFzp#?IIDKh!(!P`XfJeG7$yZ=t5?uIan0 z->+!~EA5sSBu%%xfaVH6dBbnsAhG7Tnul}sj>k%fb%H##rB7#_pgBK5d4|)JShJ7% z`{-4D^uB$xZ2Rc79kBZN%qiM#r)V4Qq3L@lw`Zh$tOY{-c}lhK!s00-8^mv|RXR%3Jgt81{ml0@FA;;+HmaO}eb46`d;~)^Qqgo>HCro8!c9ouVO|m8xaHEEd0C?F?qAhL5zn zz$ew0UaWVYuCzw!O-gSS>iZ*WA?SNbZ?HGv{}f9yGh+2$rv7l?IYRD}5My=VH_)f} zZxf;T&C50AGNr#!`l{03DLql?OriXT%H{BRKtt{nY7SQaT&0VY&Q|(@aP~c{^a-U; zD!svnhU5DbJ(?V<|1$N5O{_h>`y|9z?L(T3r_2(e;x{kXl*^RJf!%Ck}`lQlXRypBwlul4OSE-J?KJ9hwG6}Iy zNu|+Rm@72z3<`&3gH6)_nxhryehUbSLSxLfT7Tq;#r;m{T?ON)6eTq7uTmFJtJ98nRO;jf-(m z#*6E!T{|V|p zTVu~wZfA?EF$&Be%}@!U--8eRx!hNu-PF>i|CDE0sFL1Y{oMk8Bh3k#@&uLHu=wfs zlxj#1_4i0gbgHkAC#B!uTC_OHb9;S?_k~*P)IUM#E)B_7|I;$xUYkmW8LEhnbX=l%BM!aeCGJsh(d)mI+FqR=PsNN2&iqN$LBiHG8ve27^9{}0g-Vap*zaok5hLxFm)LY!-Ma{WMBXAoh)ioEl zr?6*MO)cJ2e3Q7>C-rUWCYMd02|lRXopM*ryk_X+l})Z~Hs{TxTG{mJzqF8zw|{W; z=t&!|Svh5N?G?3sDZ`DmS4g{IJ*G+2TXc2^^Xw%r7 zki;b1^kShcyUB~5=(;hD>) z9i_ezLZ__t&TF?^H?a1;>jtLNNvkKtq;Tq-l*f3!N#iCj`uU~uB$Gzenv)i1o=L-k zDlu|(qgJVTs%yyEh)k}%Fz%O_xNG9BmY=(Ym`7R&Z@x~-b5fU2<`dqN4aq~w*O+?G z)5>F$)|As;_8J=;JE^?xlu6~2hfNwYdC}A>CXK1PYtqI^8>dZ_-hnbF6gd$pIbJj= zAy7BQdoFm4@cffI^K5&)D=FZSE{UMl$A~nQqe9CF-xPziL9R%JkHc?HGNtZt`1CkV zk3sQIedgZhCUuY;O&$=xbW(S5lV^EuQkO{sz?gLSfNAR|&*HgeUA_92v8gmym3wJl zeRuL@lP}}hp=mc@((FmkeHqTXryQk^oID`osE4vt>y|bn?c$z`vqv-SQ?tesO`pDk z+R7b+sM~aZDE(ln2h8r*q*STnhFVS__Zm-$hduf9q%9Q#)vGczU9&3Hdu|PIE!VrH z(vF!lL35l)^OQTMTN5R-vS~?78uN?Q(~Bn?v_aa3P)bOiQJl2jjmj}0<%NH1ay4NS zC=+>luLa6oNFnE0_f0*M#xY*QE92zq)EWKufXR!PSE%jyp^=84KO7!Ab-`ERf?HbW zYR|fML+vM5?Wp~Pf0}-C=KNX3wG+m_H06USZ+dR(eNA26^s7eKO`p2DZb`~r{p8e* zQ?^WL{tiQ5G_4)e8nVj#V zrgf@)F4t+;hPqL5Y{}Jb&{WdjXp73wdv?Z0P3;@plE@EkSvsq(pGfbNl~+xZekZu) zn#EV$K4qnr!Ah@mq;IGlQ`b+=JJ+_^P3oV%vo)Nt*VmRw!8+8(r! zbY0J0H)VTkN>kEv&o;WNM`c<7_Z&wlq}noVR9a~Y(n7>{)r#6NbBjfmrgBZ)^hSOE2ihVUMx<0TG-MxTy=Ic7;yaE~O$4DUmeuucG$|ZV_#xuAiJ= zv-s*`p)^W9CM2;m)WinM#lDE{er+m}}X~xy{tLrBm$RBNDS`_`}M)^l~ z{yTpS_E-5|eoOxCpZ~>o_+R|~hPig3Xg+Ve^il_7s&Ogn$C+REw6|R*D90x&^UeQc zx50t@$qt#^pX@X7@@E)hawA(ha~~&0_D&fMU+6kB^HurWuSv=mIpsU_@|9cn4f*C& z=BIpw3tzd1I-t&rb>EZomVU0|ZuP!$FKJR=x_94gCcQi%zfAs8=Pgt3n?!E)p1$Ci zd6JATo2PtHGIgHwwXf_Xjr@Gm>_hJwiE5s2_Cwiaj zNppC3fgH2yPxgZC`FBBc(b-SkTnlhlX0A$o7s_4kKI(;e`O17TD#L?4r~Fc1(W0!g z_@u7Rr1ZF@!)3=#&d>XPYAUd$>oS*Q^2hzNOJBe5O-_19`zKDmrXk0qJJLN9zM<^W zAUrJ*?vGMFx5k}AXy!?J$kl}Ol5g?J_vH9KFi)NOG9T@^PIB($02%W5-R}O{z1%HK zU9B8`q$#y$(r?L$d~VOqjpon0K=$u6{Jbyh@l`k3(Pr=hoql!CeUm$GXh@d!q`&Rg z#kRTARjE8=&N!F7N~zxkZT||OcWJASx3)Uv zfk}8p>)3c-A8%dirm4~`v1)($H09h(NHgP;D?9$0{<7-5Y2+S5WM5iqejQtrsKqpy z{598VvoGu7{>@<59#UJNZ$ubIrWcMA+9{n_cJS#>Yee?>8FHO*FgTv;>p0RAAU$!u zom_xR{|Nb;=l71%M`TO87vAKUx{qNFu-5hFmlcg{+6e#Y(6&bxTE3BnBsnK_rK%{ z^?P~TB9}{!UD-b?4-pmWsr~S z<8n%v9(moPc8&D|lbB{Uk_vh5Lj zzelq=yIfYVr)#s?VSyoUakc)pSADNd->q9p%37g*Bv9c_QxdhL8jA(Xui69eBnq za7;f_3$YEs?&}TSW<0qT(k2PA#@s#gX>#S47$B{~ljQWg-Jpl)=MHUrQ?D=gQl;W^ zTbG2n%XGfmAD{A&87cn$?nXI!zl=;VKdyJb?=JUZNUQdP-D@RecUJzgQtYK=czMmb zqCOMWREqX2K^ZPzH(%?ul|jpel& z*-zC2Y0|$EjxUljF6Y?m9FcqXK{@k&?hEcuJ->IvvMG9I&iF)J$ct}u#9}I=Rr+@U z|Bcn?*EFY%5~NR?+%c1^l_Nyvf&=VJX|atln`R z>sog9dB)#_cN5!CCasafQ^GSNK~^gDx^HN_*capDEG!1W;So}le6Y@y4JV+?rDxKtze9Ae8-0Ks~da=#|*lXd)UIX{0RLt&ep5D;7o`~_}vQW~d>x8~MT~FOuyY8RMpH%bQyi8bXWyW<> z-$}L8Ok}pN(0zxT{WUu%?Qc>~?rrYE>~!ezySOj*$;KnAyUTmF?DWn1Q_s446Bg;F z&y+P+$y}XTfyjh4_BHOca^qW!m3G5AAHT6mvx$rdH>Lw5U26Q6(7DFabT|j!g&BX^ z*Q6wyq-Yw@c-|*>NaZY*Hj}@x++TjF5i3PgX}mD+tjV!8CE4Vn|6str z-mSS*Uu9ToXH9Mnkb5UL*k&%G#@4^qeLmP3BQD zE6UCE7Im3)Xml$(nd$KR$`|Cfch|4e1reLH zx5o2%M~TxJW0M#!g&d`QxtDt(?DN@^&gvygA2WAP1$g<(Bx{@^E2hqU)s63d*EkX@ zrAWn*rOXRA(uBtR0=Te+gHm6+ODQll*?rmCe zwp)9P+=P42U2ggVbC$JBH@*9)xqZu-du4i^mRBG%ssGcyRPI{RV%nOU=63XCp1-Z! z_BFkGpIn(czBbsB_JQf{_06mt)a?VK{kX(^L@s7$cPPDk3fqnJpso0cl}FI@*MjET zG~rhl(qyHsNmkN5O`=IeI-q%b*jLahb7#dZWw$lq*>mvLq;FN4ENgSK=?~PqLb=TM zzaE;|9bp)!<=&zTUa-m;Zy z7YAz0WgNiz`QPx{dtd%_e2Ug-%3sHvHD2w`KbTwDm$8@Mp7*FVUO{Zc?Em3ZxE^WNp-O}iSR!fHaN~0^A zoa!6@hh_z*E$~@AN_MO!Y-(}Hy1o@&Z?Dt-@@d7b_Akk>{k!~2zxqqgUrLwx?;H_Z zD*Kl7vzF5TXT!aBeOYb(QOkGE=!zL%%c=jvF=9(-X%$cQ$$5L_a%~Q|S2X|Za>aQd zb>)@#p3!qW^2^rsHQ)k6_jjw`Bi?=Hcme5@sqj?Za#wD0&b};JI8c`O1CzguMwI1a+iAX zIlCuXwA1D6u1TlL%$RtdR<)2OeUq1oCdbr@XV&U{!y=T8! zd@UHXLN;5S&##vbyQlZmTKz~_37gw*lokCS@p}L7+T8!cwwQsv|37Stmr6u)J?|bb z$c_BUb+H37KIJ}B&RK5x{&Mu8thbdLU6`_>q&PO^d#KUA z$=%XBTleQb1smnz0G$56@ove1cnaPPXKdwPw6fkMaPMg}-csU?L$c0u_RTie@41b% znXGGDs7o1#-8Wl^+*5Gbo+8^G*W7zf&4sm{bIVucNMg&$8e-hX8oW(B?rlwiz7_#F z|9s}X$F$!$+k4-=-?zAazd5v;f%|Erqz!YZM&apG@2xT zZIto=oPPOtH~^V!fra~z79#$$!M@NfZY6&R-p)M@I)t11{BNn7|StihSavqr~IH>0Cr1^O9>1Wq(M1y16BcP!G5Chcg=qu+ek zFihURHQ6N0*=kDUmMah7lT-rGyKXaYHL<#k6a^t=?!Qa4UH=eiK{k36}`@z|H z<4Fb^fyVa@{LGERC2j0Z_$9D&L?dVofVnzOA zwbW|3rqMm*`Sm_|=0n{52|&r%M;aaNqdArt9kql)=7Yw~)Y#3Wy4idbJO-WsYmJ+O z7lJX=Y5Rt!eZ#HeYfW{0t*Oo{i@Z71}^o+9NO;#Ca?f)DZA|j=ethu7FtpV zEfHE~n@gnwIjs~)B)661wvyadlG{phTS;y!$!#UMtt7XV>PA(h9XkL=yK%fcPCGaPAjz8iq^q&AK-G#vu!Ab6%-~jM#cTVU=cVXxs-~;eau$BLZ>gx4T zzV+@3-^<_?@G5u>{GYob-FL0<`mW$WcSZ1Iu*_W%x)vnB?ci>(4SWQ)GYTB$+d!}S zXYe|B18f9;0n+RK6=e0izPC7k8@vOyfPa7wz=v);cnUZb407Y4`QR3M-NSr`GVc5m z+z##l3&EY>E^s$k1nNP0eDeL;t@if=-v+0Ep>B2Fd2V&^8=$vaEu%~58gMhCjBt10 z?lhFnLi~4vyTILG5#T>X;qEY^IdFI2?!euVu?p@E+#R?(aF?;mfx82D$2bgWsiKWk z(MGChBUQAKD%waDZKO*2P1;BmZKR4eQbil7qK#D1MyhBdRkV>R+DH}SPdCP&ZnTvu z+Da8|rHZyvWpq1G#o<{T8J~Fuhi7nj28U;Gc!opWD$2i#@~@(HtEk;7%D;;8ucG{`DE}(Tzl!p& zqWr5U|0->%GQ#%5|7~yz7)q&p1N3&QsDmo%po%(>QaTh}EY>N-9A~B`B!`C6%C*5|mPcQc6%t2}&tJDJ3YS1f`VFx>=9)rn$Scz9-&GFPy$h z(&*mIvmDS`Pv6Ngj%aBlZOhoaCtbuFvsEYItCmI`8gfTgK!gre?e_xpqahPAM8ABQ z(D1QJ2NV8Vb{hMn7ePCIh!J5my}xL^gH?w!JzWc(7|z^d4!)~snPTCSusW`-!B;`p zyYyzJO3M3aW1>$dY0*i1e2ZJ zL-ovWKjYTeYu%c>&%qbu&hJN(v#v-QlBSL{b)=~yO&w`EqSxQ=*7zTE`y)MZ^#4ut zq;G=1fz8}U()9B8*YZmEkq4b4X!)c|F=5!0Vv>@r@!tn1O}jH!+S%OgVmG08ka@rb zlyyCMs}Y$B97)=M{SqORul)+oK_3+ep^+R)dFR9gf*RuxlQaT3cU?*jy*mde?>cHR zRg!;ktGSm$IaM(qkZ~$q6IrF>7)3c+;J)f6p7xm5QCiX>MR!q6GFyK^s}vnZHOnHj zBLnToKsz#Wv`o2`jZ@=0_>PZYvNHL9I@>Y<(*s@EFIlNzOkIJAyBJ4UP9LTi3kTXceJ*Wr7S zdgkl3L7$rlnzV!tpd)Q5Pvn>s)ugBk*VnW=dn!8kUmxgx4ovOK0HFv7!PSr+8N0IC{{1#<_mL2f#{#Qd=Znwu&*=5>3 zr_M7oi?QC!g1o)u)fMYZ=h4el8Mhjfz`bCpajUN{I0*~@bBtT*z2X6vxc0t$H(%<^ zI+v2Tk$mzcVIBS6!T-M7%id0TdXkx+BTKC*i-VfY&GF6Wh&k3^%~c02n`fzk7eJ;Y zrA9I(nUQ}dkC`H4mcuNpaUH$^htwC6o75*Y=TLJFHRn)sj?qc3*3!ss1#RNc>gSbt zlgyc9u0(A#JbP!&LwEA=BR63k2D*X&1MeVJ33RCYv<>(2FWvnw`s!XXI@tHqV*la} zwcpehTSbeA8=YzK_5Rzq3cH6NZP|~u>_=Pnqb>Vs-~M|5+Ol7?I49tofO7)Q2{D6-b3L5v;am^rdN|j^xgO5-aIS}QJ)G;| zTo31ZIM>6u9v!|O?)7l5hkHHT>)~Fn+>>xm!aWK1B;1p5Pr^M3_axkta8JTrH4?Zd z;hu!M*ejE8Pr^M3_axkta8JTL3HK!2H=yJE8N3dVcxJ~Avtvhfpucj=(u0^CJHEF8 z63Oh?VRq~=J9d~IJIv4=X2%Y*V~5$X!|a$DW^3dJOIH#rSJICSrcH8wcut=)o8I5+ z^^eD%)VSwgZCr_MX)t!J!Du86eGj&+!PvG2W7`^xU1=~HiT1_Vx5TD2n3>I?w1qad z8&79$+r0W-k0 zV5SlA-wz%He+TgN?=~WKJCF|!0*8Ta;BYX{h=}Dp?_WkFcnN@a5Z*y}huQ;XNTGoo zPX^>GGzyFdJXh%VM#SjhYv<w=3aXF=(iv6{v8cm{&B+*8aXd_9j(W6x-zMK($2Dlb@Hl6$Ndv={{O^m*& zH8!5WQsaVbI}hzCM~hXvPtR7BEV@@~t@Lf_*F4JrZ+Wyvqiu_A8r?!>=FQotMHgc} zl^+KrD2M^s^;7|l0lmPn;2WSf_$KHBjsx=6&IzC|_!j5~`hyd}NkHD#{5BZKN)@YC z)(#$(=MVDyL7qRz^9OnUAkQEAF<_5M=swc-@_o+Q*Dmk{*bQ9zOCn4kz+=M2go_Cm z6D}rPOt_eoqDd*5l%h!~nv|kRDVmg`Nhz9?qDd*5l%h!~nv|kRDVmg`Nhz9?qDd*5 zl%Poonv|eP37Q3f5;O~`IPPgn&d&t@1I_|xgL6P7nfykpS|R^Zt$iM=It^Nd56!{^ ztnjdQmh>|V_Xoh9W)*vHrSY6rI-eGK3)ow0?ZX;Mk~NehYbZ%pJL*~OsAsjKp4E~MWeL_S5@=-!tWyc!W~M zWeK!0vD+oFveo-f;8;oSP6PwdGEWBRv}kMzG`0k*DD|wO)U!5|M0-o1y(L&tsb@u{ zo)wk)&_4+O0Q?hd1=|Sw2rx@Fj%V~W7=2~r6+4Vt>llFzMqq;x*kI%}7 zVB|Fzc@0KhgOS%@r0W-k0U?yUIKX?%Q9l(>3*I?u| z7VB|Fzc@0Kh%xCUfjJyUTuffP`1mVrdYcTQ}p@HCJK%N+N4MtsqQP*J9 zHH=|~$;`n5ejszp0LTMD5CZK$dyo$f0v$j{&p( zNJ$hq}TuoWQh7Hc;aYd6+*!1|5#3HTS-2|lMk5LTgPQ>J-0XQ{XgTK(frr71%z-a3f8{#5X2N=!#a;#L=iny5 zN~6Vm5Q~XpEdaNI1o#EOMq~XFV5hO}0IY6W*lR58H5T?73ww=)y~e^`W5M6TW@BNq zv9Q@#*la9pHr8*!eE_}C;#)^n5-bDgh*qP$A^Wv}OwxTG*2fPf8U@ zYR-<=n$poy7^JHfhw2`ZO5ZOzvcJN22UrO11b2bE!6Hx(egzhTUo-Dt!g!UfLqEtl zd(m_ytLa{kN*&)GBR+f22kUN4^yNfQfZjlK@(WoV83Vk1B&pSs!J$&MRaAzq;dnDPi^13f9qfUQ`3FGHi9OK49_U~X zbg&0H*aIExfe!XS$6^l}_CN=Fpo2Zo!5-*f4|K2xI@kjp?12vUKnHuEgFVo}9_U~X zbg&0H{>$l8kUVUHHP{3lY=W`^;$RbWun9WY1RZRG4mLpto1kNJjXej<0}p|R!6Sft z+AF~0U^UnR-UX~hVu^Qb7warMu_-#(6di1e4mL#xo1%kF(ZQzZU{iFkDLU8`9c+pY zHbn=UqSLMyI2LI+>%U1_+SFGyr^oK6WO@CKO4ucgWo_OE!Khu$s9nvdUF~C?h`mD9 z>=mkJuTV96g{s*rRLx$YYINW@I&d5vIF1e+M+c6h1IHQZhcMC)VWc0zNI!&;eh4G| z5JvhTjPyeo>4z}V4`HMq!bm@ak$wmx{SZd_A&m4x80m*F(hu=%V-55pupN91J^}v% zJHWpII}v@Kft{?L%BpmPT{#uBW7%8UhvNyHXZCVb`v((NsXKS7{8wQ;Nbl=FQ>bR2 zQ#JdXs@dmMjh-Dx&z5~dL(m?Epgjx;4raIG5U>n=$lC{UE&dyI$4?d7#1OQJA?V(5 zbniI2cO1>48qJ~_&7vC3q8i;hj_w^t_l_GsH;-^%HFpEoebq971^mDU0gwlRAOzZj zd~gux06KzB;9$@h90Iz4Gr*bPEO0hB2b>Frf%Cv{FcN$pi~<*cD)0j^8e9m*fQ!Jz zV7dFM|1!W=Q~Xzh>EIeL16&Jcg6qI6a6Om}=72c30n7zAf_dQQ;3jZ0m=A6N3&5>l zDM*54-~sS^@DO+yJOcgzRsaXA1doEpz#qXX@Hkivo&ZmRr@$KUHh2eY0Uv;Wg00{~ zunl|!c7T6_Pr+wkC-@xf0$;eV+SH9rUD(uxO0p)H}<~C)Xw;g=!z8d^rFb@0} zP-eji;AdbWm;}gokh})TV~{)sp9asmuZG|of^Uer3UOWN9`GyhYp?|T2K*NAtRb!s z@ob@&!7J{oMh)`a=2aKuyAJuTL%!>f?AcM|zdBHu~mJBb`uBgfUqaW!&W zjT~1a$JNMjHF8{y99JX9)yQ!*a$JoZS0l&O$Z<7tT#X!8BgfU~#tyo%gKq3tuYvyq ze+H~vSXhp&jewO4YZG`2ybT!h(48H0X9wNcL3ei0ogH*%2i@60cXrU79du_0-Pu8R zcF>(2bY}KkfdLzreCP0U#Ldcc7kzm1DFfY+t9lm^lsU+7iY#HeMB8I z4%vHHO&?K>4(_0XJLupJI=DkWQAa;fM?XzS>75D)d4K4&@z(wFDm@Gy7;`~j>0 z4p<2u1&@J0f>q#guo^r8o&-;UHQ;UV4%h-d0RIGA!G~ZQ!0zGS0saj>1)qVP;B&AG ze1VO^1k{C1UD(ux-4RgkHf3&8<~DiC!_JZSF?Ngp1>?Yv0p%8)0DcCrrvxVf@*X6= zLGl?SpTVaAwwMsSL+}n!Um>mw-2;9Fehrp@-+j9+U@dVpO9 z%fau!!{8CH0?6)zmEezH6?hyx37!IL!1Le*@c*~O|Gt*ko;N@C)EY+{9hr@EWS3OO zy|&ETN%Lj2&INRENvw42?gQ9%vC<{6(j~FdC9%>avC<{6(j~FdC9%>avC<{6(j~Fd zC9%>avC<{6(j~FdvD+WegJY#jVx>!BrDNYII0EzlM}nik(VzhI1cjgo6oV2F2CTAU zrAuO^OJb!!BrAuO^OJb!!BrAuO^OJb!!BrAr#ef#U%dTdZ_RtaM4N zbV;mqNvw29taM4NbV;mqNvw3q=2q$UaWqdbnkN{|6KKpyH0C54a}td?iN>5nV@{$m zC()RbXv|48<|G<(5({Ax3t?AoYxu zF?*Cvpk*h~vc(qPE4UWC==Neioxy%OLr2peW5JdY^?HssV!@J8^*;Pq)EGe%jGzfd z(1fvt8Dr+1t|GU}ECwYY4A9@rG7te#5Ci3)0vrQ+fnx#l1CxE<<~Knfa2z-uoB;ZQ zZvo~PW`A%ZI0*~@>>W1;f|J4N;0$mk_#bc7lR*yOTdr7SWpcv1^)}ifggj*0B;YNBqP zfS-YhU=o-Nrhr;76-)zHfjV$Cm=4$zZ}K*Rc`djJus`0M4{iYqz^#CpuK5da8(?3) z$$NHISGS7&VpZ%HtFjIU-N6x{2RITO1&#&XYwKz~48TGXXQU0T$oMO|9d zrN#RI)~R3+7z~Dh?|{?5cL8;6QKuGl>ZeZG1y<#!PW{8d_rM5nJ{SqU52#Z=b?T>1 z{nV+SI`vbhe(Kauo%*R$KXvM-PW{xWpE~tZr+(_xPo4UyQ$Ka;{~dT5JOlm#T;BHR z1P%q1u}ygf$xD#D1j$Q~yadThkh}!ROOSj7X%j)(M36QSq)h~W3a$h-U;(%lB)~7g zZGbuq{sBA+9^;(|$|^)zg&qVBSP32ntHBe1{Dt0N5Azn|yYzpjgEPRH;D5kb;B0UX zs02g7xnQ>OlyL*cx!^`H5Bwb51a1bb-5Ixl1>jctHJJ?^Z#?BY8UHEZR4@q8ulVR! zeBS}50rKD@4?gnXBM(0E;3E${^57#6KJwrr4?gnX8wSn;!@>8!2yi|a3BC_TfeSzt z_yHIVE(Bx1Mc`uaLvRWB5f}@q!KL7T!8ky_=DQ4B4#tC@fGfaH!Ihu}OaRlsRiKUg z?0ieO<~QJ8@LNEi>AN2+1xc_BJOGx1-+>3g@4-XhVekm}16TnZuo6599s_>_tH9%6 zHFyF%37!ILz|(-1$rx3|7*)kyuBX_`^%OSMr`SXK6#KZIVjtI2?BjZheOym5TdZQX zSjB9yirHWlv%xB6gH_B1tC$T|F&nI6Hdw`Mu!`AW6|=!AW`kAC2CJ+O!8Y&_*bY7h zpMZaXo#1n%qaEX22OabJGv-zKD~v07H?7{^hvRXC(% ze%cFGBzZF^julmAk5#-OUC#`%D(_v!uJ+&%fNl{i0>z*Ngh44N1K!N?oA~9_BWmiO;3-H zHzIAwN(ed8G4hujmlO67co@70C_Bc?D#pwz#>^_?T`W=#YY}m*QVv!rS(AvfA{4hw z{8%NiPB~bo9IR6g)+q<;l!JB3!8+ww*o?7GIaUYI5p)6vgU;X(&;^_U&ID(Hv%xvw zTrdor2Zn=@;QIhuFxDvt>y(3a%E3D2V4ZTXPB~bo9IR8aQYCAhaaOA0tW?EWsfx2w z6=$U?&Pr9Bm8v)^RdH6T;;dA~S*eP%QWa;VDsJ5cu+gzn6=$U?&Pr9>;@MfLinCG` zXQe96N>!YdsyHiEaaOA0tW?EWsfx2w6=$U?Zan~)%VQyPu#h=e$Q&$W4i+*83z>t3 z%)vtDU?Fp`kU3b$94urG7BUA5nS+JQ!9wO>A#<>hIatUXEMyKAG6xHpgN4k&Lgrv0 zbNu&#r638Gfd|0v0d@qeWDZs`2P>I_mCV6P=3pgru#!1g$sDX?4puS;E183p%)v_L zU?p>~k~vt(99pk~rOd%n=3psv{2u`9EB>wEL$D2e1a^RbgHOR{0Q-tx>?^y#7uZl} zCpK%zSj!x&We(Od2Wy#wwamd<=3p&z?EYXNZ%v%a@jKvj{5-$STBc3D?R9Rx{UUgS zUHuz@?C$?7YYA_Hzk$tQi@VVNySssPhK2Tf9N%|`1Z*_U?W{9=tZ!2E&%-X9hg}%$ zGav0UAM2chbb0mCwP-=V0Y?u<|)r`5df#4tu5Qu;%lYm$4k2$h>|i zu0OjRMsYS7H`ut|h#NzUyNxyMs(RK~Ym7JkWV~!#X}o5u|HZb%b@A+0i=PI>$W88fpzS2U)|c@0o+G^R0``?^+YBN#=Rh6l;q4J!`6U zvpK@L#ae1!ZY{Hxo7Y<}TQ8e&Ym4=F^9E~&wZpv8AM^*!dH#0(cIMCh`TmaPP5zj_ z++5&4#(#{N@PEVK+x&&UkH4?^OMicVfAcQ?0RKSqZvQF%@0j=a&+wmN-s>OgKiB-N z|EK<+n)myE>;J8})PKMK0W<0Uo&Op0LH|4ccg^Sg|M36QT<8DL|DpLO|HppUTyL9p zXY;Ri7yD3in|+ww&D?JHu#Yr9v5&ToHh0*CcA@!iyTmRrKec!(wSbMCw%f8gU)cnF8XOA;?+n3vyo31^>zSc7A>+I_+)1Gb5wk-RX_Af2JeTRLA zW!rb#cUu9w-oD4mvlrWot&qLMUShSgm)c9M_VzOS0W05LVXv?{*pJ$eS{?1T?6<5= z_CM@@SO?qN?2oL@_Q&?eRu_ARy~8@x{=(jEbq%mR&*~Pi0+w}nzz*bD-2?f7eCx9=e z4<2M)7VI4CY>f|g33j!95_m}m7$^5w$S;Z^R4ZnABQgc|JZx)_^PVx|NHFI?!5^ufe<<*frQ>d z4pmI(og9jE1ZjezG%12qr3Mg?W(5^gnuuLd5qld)#6B~QWu!Vfwn0d4p7-A8-kXyU z(C_p5{{DHM-!Px+$-4XOv+G*xv-jHP8b61og{B$5hUSMB8^48?g_arlq1!?$jDpar z&}vf)Z3=BR_0ZPPHq#2-6}sCDgm#8@nxW7Gp@+@5(B9BKvqI>J(356j=(*5gvr_1# z&}(LL=#9`@X06bP&?z$|bT;&pSvT}s=r^-be5d$MX5;uC@jdZtbnWSgzUayMs`luJ zHJt9;%lWE7=!mzpp=gNX+At9((zFpG8(nad(gin*Ip~5t=z@o}Lt>A3Svw-$KqGuA zJ|-6MJEaR6p$i&|rg~GonP{W8&T}4YlxFdYgATRqo&dtwUpLKHD(*L^`=U9 zG*h~xh0+}@mG0=NbjLX3nDL1|(fG{xhkm{BExKcdao#A@Z!-nDV~trB-LcthU^YN& zG(vZ5SGwaKGt118ISoxQ!(61l zYjUnv|J=OOyi@#L| zK2|rYyV2KLZY?+ZTWhQ}My|EqT5q`4CTo*1z}jYQGX`3BT6Y?Q&=&`d!PZk2KAQEi zb<`MXy=lE=jJDpj-Z#cr$F1YWcy&Yw(kVAuKUqH+ z)2u?P(3ozUwq?w)d2W43QVJNyvbiFU|W+MzJ`c<^ykNbO+iQahMN z@M!Q2Gbr_fSuXfa@O`s<@WbGTW+kZ|%p|mfFe`_wkY!d01w$dTs?-r?^-#G`d9!9H zIh1VH4pj|RGwX!vhU%KBQfruLQfn}8(HdsGP;O{|nJ%@4*+6Oyv!T=)W@EI*BC|3?~=!ejc<~4CiaY^R*xMp$9%?V1U zOcGPH9Q+I-U9`@i3y}Zho9(-U9$*k4@X$3f@=Vg zF&b}J(I$Y2U=p|%Oa@cHb>Mn172E)B1k=EDFayj4v%pPYHkbqEf_Y#*xE0(6mV*^w zC0GU403wXE`@sX?L9h!DWu!d>9tMwqJzy``2lj&l;8Ac85QT(i)>Y#zGaBzg(w+po zQwQzaReJ_J3!Ved15QwCoQTzUPm)F?l6C~V432_Vz^mXj@H%)KyaPD-j5pU+I|exQ zgiqI1`viOnJ_9GgX`-Uag9;!4B!Y^d5~vK4K^0IHR0GvP4Nw!*0<}RMkOERc8mJ5E zfpm}o>VpQLA!q~|gC?LUXa<^t7N8}_1g$_8XbswcwxAto4?2J=Ku16XmBjlx7K0^VDOd*RPeFeQ`cu%Kg8mfrr&tZ>Q;`SmB%Z1h=mNTeZlF8p0eS-N z(Mhk9UMIc27OV&Ng8RS@z}V352aFB?g;9Kw=H~~(AQ{Xf>1I~i)!N0)|;1}>K_znCQoCCju^WXx= z=OkQTFdNX82JK={M}u}TsHZ_a4eDu7Ph%aRuEy;|t_464lmQJvBS1fz^rJ~Xnhv1v zO!~^CpUfQ48PKjKZEE%ay+Cgw;219!=`GS*?Er0KS68P~x(4X)0C@!H?*RD($R{uo zP~QOc4N%_z^$k$hz>nZRfVu`lAP!KzU|CQOlm`_6V?D@N4>Hb!NuV;Q3aSB~8>|6p zf?A+9r~^_!13+Da)HT=`3;+YcC@>ma4JLtW!DKK6+ym|f_kkT?Ctz#@85_a<;1HlL zY}R%S37`W5SilCfbBH>Gm=__&V~A&l=7R-b5m*eCfaQRG3#|rufc^??1#g14zzJ{? zoC5NBv{#6Bithn>GVbsCznU72xDU`P|5sBpA{gQSzthya(1;I%N5CGi7ceF+(%46l zeGLAL*8V@CvC$R=+T#C><~BBP-$t+r+yOR&EdXs{Yy;cDo!~BTH$a0KXfOi}W}v|g zG?;+~GtgiL*3F>JjNRZNK-(F#ok80fw4FiQ8O$dGjcz;&uy)2{XnnNW|C;qcTmFCA zf-J>CECaWK+W?wAxB{#Ms{k7Rf6dBZ0soI#nod4za{z1O!V6q@feSBi(YY?Xz=apM z@B$ZJ;KB=Bc!3KqaNz|myugJQxbOlOUf{wDTzG*CFL2=nF1)~n7r5{O7hd4P3tV`C z3omft1une6g%`N+0vBH3!V6q@feSBi;RP_51;KB`DxPc2daN!0n+`xq!xNrj(Zs5WVT)2S?H*nzwF5JL{8@O--7jEFf4P3Z^ z3pa4#1}@ydg&VkV0~c=K!VO%wfeSZq;RY_;z=a#Qa03@^;KB`DxPc2daN!0n+`xq! zxNrj(Zs3X}Z4~^#g&(-^0~dba!Vg^dfeSxy;Ri1Kz=a>U@BD)p4;pF8siSAGq)X7k=Qv4_x?x3qNq-2QE9dk|Vfq1Q(9r z!Vz3Jf(u7*;Rr4q!G$BZa0C~Q;KC7HID!jDaN!6p9KnSnxNrm)j^M%(TsVRYM{wZ? zuApz>2reAK74$6}!G$BZa0C~QAWxo*5_f}pz`fu;umkJ__k#z(F0dOs#EGd+oCfIv zx`J+?JLmy=0-gb!YRVW=@8Nxk?~j0&!BNe7`_ijizXo0hZ-6(! zJK$aL9(W%d10RCp;3L48!aBNe8W&FE!f9MMjSHu7;WRFs#)Z?ka2gj*bOd1>b{zgCD>z;8*Y)_%ApIeh25l1(2`aTq~`k3$JnEH7>lyh1a<78W&#U z!fRZ3jSH`F;WaM2#)a3oSSA*G^SE#x7tZ6td0aS;3+Hj+JT9Eah4Z*@9v9Bz!g*Xcj|=B< z;XE#!$A$B_a2^-VO+M!}O@c#;cGa^XoXJjsP8x$qJ3T^|-!3wYv ztO9GmPH;cqj5k)x!D=~JEeEURV6_~qmV?!Dw7p;-*bjLBI9AKSYB^Xf2dm{^wH&OL zgVl1dS`Jpr!D=~JEeEURV6_~qmV?!Duv!jQ%fV_nSS<&uEl?ZO z0VyCAq=CAi9!Linpgw2-8iGckF=zssf@YvOXaQP+OwbBsf!3f6Xbakb_Mii}0(1md zf^0Ac%mwqn&47NxS~*xN2W#bEtsJbCgSB$7Ru0z6!CE<3D+g=kV67ail!KLWbn1uY zaj-lNmdC;JI9MJB%i~~q94wE6<#Dh)4wlEk@;F!?2g~DNc^oW{gXM9sJPww}!SXm* z9tX?gV0j!YkAvlLusjZy$HDSASRRKnmJZS54$)~KM9IS_f^>DBr4%WlLdN^1Q2kYVJVNj?! zoTG3!N8uPIuz(E$AP7Pr9+UxPK{-$!F!l__9_J_=&QUl9V~=wb4(BKwERw@n3diUV za=}0_2n+^Sf#F~T7zsv!(co$@28;#QfN@|vm<<>!ST+aC=3vIObE}X~3A`9EW2vu1v<2$+$9K051Z@7w0$}^JQ=pyaHYY zj5G6f@GbZk_zs-JYMu@;N;c%|Q z;arDfF;*jRyizxdH$OK7!MZX0ZZ;+$sH`YgC%#cV9^~cxq~Hlu;dPw+`*DNSaJso?hxtkV7(ozw}bU|u-*=l z{|;wT9L}UToJnywlj3kD#o+WFP9jv>9b$77t4%Xelx;t2R2kY)&-5pK` zIGkN^IJ@F-cE#cBio@9z2dnR3^&PCfgVlGi`VLm#!Rk9$eTTCxPKb8F`a4*D2dnRJ z&c(sKC#-@*DjSbqoW?_l{IEWd;0cd+~pmfykZJDiJgI2Yq^F2>(+RHTN-IH*?MD z#+x!)#W*eZmyI)Wf7v)I_m_?D<^Hnqv)o@c3e9h=M6($YDpkzU>>$@L$H{mUbE4J6 zYGzK7d&lM!%ds5uI;*YK!MxtO(#kfcv5(x{oMH8}`k1q2oQip~j8ie^%QzKtfs9iz zZ?P6zYs`h#W^1##nmy%v%r(}1)_vv%B2*qUH_F%)bBl~kF}GU#tpnyZ8Jl9>DfgPq zyJc*OdB5CoHXmTe`F(Sj+-o-X%e`jvfZS^~AG5x;zBLcYy=L=C>#X&g`KH#h%fXWAXjQ+AHs$^6ysZTB|+YxlSNo9ArT zcFo`If%eVjc^R`}rOKEUE5kluAFvt{xe{kJB620wYA$!Htt`1)Z8_{#=UA-+g9BGt zSISrxD<^O=aMJ3;{`GHGXSrK#<+5Ad%^Jc^H1Rny62fSm)$kvvpqX zHCq?tUbD^Fui*Q(9sD5ppY>!}n`5Akp z++ViGvcLS6JznlC+c(OcWqTTNDnHrNWrT`-i`-eZ7s{Pwdy(8(wwK6g6?-YKvig9j(nRwvyxSr2HfycXw&(-{^ftS06>$S{Jlll2N*KaUOlbNOOa{Zq6 zSFU9QoFKyGBd$NjuN2xB{7crp)&9ljN&X4#6#tT$*{AtEqc~AcYe-C7C9acL87VI+ zT9pZEF-~J&>HJ2@dpKZXcgD1 z@dX8%Xg!}q=ONjs-$hE|Z;xxBif36N_^Y$z%9>3HlSPFQn;D*S zTYnCJFF}8SwS_eOCH%bvqIQmIBlK5zhen$IDqdfL{st=wHT1Xiw@LpFK460WE^7;E z=)d>4exLP)8u~F-6>8`o;}r_D;otcrHc+dre~IrWWW*2meusZ2WULR@zu?CSJ&YHJ z1IJo|f~LG;fseurr| z9+!b`y-6!WB+wjE&gI=ywy^@wN*EhhM-LJSv{@T%Y%w0=`Viihffhcd#mR_5%`%P~ zA94M$@rjlqBZT<;()e1dZG2<=ikwJ8(wsLgaGh`3T6HskpC-(Z8RA`)fi`Z9QJ zLTYfXE0`6uJ~Ea_t7$gGixXxOvx(M9#w2Q$(Cp2%zC;&gB5!53LQaekcS-+F5NXt! zyV{s-khI0y6J|TJomL(j(2?saSbTvmbsAYMdl)HvbosYN_wmgziWfl;S;OF=WcTkpTtgTor#^?&ztZM;13$+A@dM< zK5jnFvz{=YK>j5DongLVzKP^5^DS+R`L_9$R@VI5{921MzcIhj`kUY4_Zj91^91Qn z;{P==PnoAR87Xy!yUybI8Rk#sPkj3`o?j#LH~c%p4D;qO+blE-HQnN8ytLYuj?ZUU z{L_M#X_>6%SeDKE-vju5h81VU@iMY_e82>&j8&HFa`=LcEP2M#AO@=f`6S>K8djo} zsFkrQ;u#u5WmQI=Y*i&aQCV7?Ro$wt4InnFhL$PqtCl3~t5#Q9R<7H!ij*WHw6u0I z0#xgUmAz8yX=Pj4+7(u3t21&Ux3p`lu2xrVpw->#j--dxgOok3o}}z$^&(|&tG71Z z>SOg`jcT$rSxdLBv##TFsx_5Qtg==CtGrB0lrf}S69J}Gm64=eue4SnC!UmRV#1K$ zZr!e3CGEG?R>p*BoviKFcCLvGUL{NTH-yS3Ib@|0_=JJ-aYa(%ybKi3af4^YQl z)-Im@ko6Fsk64fJx!>BaO^^|()S3u0t)KOn^%&26%6g9HKF{gtTwT@h^bfekKhWyoAAGIVk&&(B@U8VN>A$nS z)3U7-)(I`gI%%Ec`jmBw>$BDm)cQy3Kcpm5jb{=4%JnbSugHmk<@$FkpKBsvxh9TH zt19DR`DHp`>slgFu_o8H9njj?K|7>n$@n(X#M|*&cNr(E)x{Sn$8~wTJZX~bB+?N5 zrZu;#+3eNW)mb}CvQt<+9Eqort~IkW>;@V(-EOE2u^ZWqxNdAWM&873q7Ap3+D)}l zb~C#vzv$!T2m+RJcYi+FE#%`lcwAd(nZ>=IxfdAo|C_r9+@Jrwqtqie%ziM{i zH`tZH$2zCg3;Z59uhj`$2wc!w2J!>>T9ZIQpnz-Qh_xnoV7gXcMiX;jKLi&O#16)5 zCXvO7TvrTMo z`uIvMHJBaD(JBQy1-oeFf?b2%v}$;Jt`-OmfRl;fpx|&`$vGl8LTelx863&=DEOHO zj)9>i1jq7zsI=fXSXx4G0_S~d1Sj&=LpwMLo+gM^ME3@74Dy>V!Pzh~BY1Ogp;m_Y z#U-R!%D!PRxF)zpiwouj*J&xi^}*Y<+Qc<(LUKoNvsRr5Xe@s4ZWvuc@E*9E!28_K z=Yik>YWir9GuXj{!Go0l5R6X92uLJ&rQCHGerE(<2)@Ym5qO@AhCHfOmJ!ojzZQI* zYvQK4CO(qSw}WqMO^K3xSF0C%FZdU&PVoKU`&@qz{6K3fqpGzEGI|pEN5PNyJPl72 z(!13#k#IzTsWi2U#8U>iCZ3WPUBrdrv@%3h#%p${417_@*h;N_C?S-|oP4I;JKvkVP@Z3^ib^DUk+pHq4F zsuj8c25LzE7|DECs0b~Be~Qr3&{E1t95+uPB2%jrS`H@_p_Q;wK}`25?p+N#6`?%1 zsgRzuRx@;a=yvYf7~06^CRVD;hwcb%*2>{qZzT;8oaA#?=q|p!J9IbK_}P3u2%|MZ zyLqpr9eM~xYv6P5<#Qizg|(#Tt;OMaKSAxDtz z%CoPjeEOQor?08J`I^d)58}sH;a9qy8AZ=_Dam|_v0eLdybCo9jsr}FHR@$Bg*u^s~#p_xNqUPV=T6+8qmB(KnkN-Ga;$!^&8u!%<)DP*1C8MWupRx)7!wF7CeTTfNF{Z z=x~59k$ejis25`b-*No|e87qD0m%e(m;f)KF$8=d1wLRS39z19kJXeA-n`@nI%_Bu z`K$y(2+5NH`1jR}YTEVkd;r(I;0$%)47psphD$!2FhVkrwcL7~7`O@#euy!I9EKW0 zkx2faEB+9t_(KK7AClxr0-kuYaWiS=8}qqdU@Xv@aH`;Tt~VH)DCZsUis6b^Oo3N0 zl8r}=N0D$+DZ(z|ee5D$v5O4FE;1CmNQYf~L;l|y|I*?))ASwXJOST`SA3(c;v4Zs zzEOy8&E(SRaZ*>!>(J zLwTYK`5-t(dBri36vvpPIL0-KV^mP=LMSd#U2%!(ic3^iT%x+-5|+8o+^5a=F$w{f zcmkeK#3F=Z5jQFpk)T*aJpAEXt%5vVK}yLV9K|2f;SXo2(f6z*+vdMnORgr*b0PT= zE>R6G@iW)Iz$k1O#cy2ym-S@ZJjaT%ZvM`ivTdGcRXNVQz`C+-=CiVFn+0$WU2%^% z#XW@L9_fmEIEs51ihJmA4-3vqNO>d`U>!oS4xQDz zN=TBdBqWvL9!=mL$#~(M3qc|oNW5Yo;}iqQRt)3@7)TTCTB|8Mq_14(!zY$(WV&J_ zy%ihjq1Z?R#YVa+Hj=A&$V|mUy2^7TS`WoQx+(^es~E^lih*1w*9Gy>Sr_D!bwNHQ z14&d2q@rRViHd>LQ4AzeF_4Oifg~yhQb%!*Zi;&hR@|eT;vRz)_voa!M`y)7Iw|ha z*^=C&lj0to758XoJ!n11b9Y<2`DCq;Psu%IEAG+2lH8-Y;vR``k7wZw&%r>(CW-A&EyIttmA8VNK?f_5)}_=t9Zx& z#X|-v9x_1jkb#PaR8%}9QSp#EiiadB9#T>9kVM5pDk>h5sCY;n#X}Mm52+|m=fOrK z59y+KNRHwmbrcU7s(45{#Y2WF9@0hekQ~KB+AAK?K=F{NFpv!RNqxJ%*3WJL56MzI zWTN6BE)1k8{(UpMnKs#O4g={2_h>~L$vRxcI;JVsF+;JAId)sStu|M2j}eM{%v0Rs zX2m^5*d6VT+5)*23(sLKR+}Z)VzoYUEtXHoL#|RhWCG_3Z`8^u9#YkwZO_*FD>hQq zo@dYFT5^)Aij7oNY^18-wFL%2sM5C@Ck)FIa?fmE&~8)>fCNOQ$TnkzQaPO*^& zay3`$rPxRV#YR$LBd4`0fivv()DC?2CT$cm>7bZN8^ugAeas|DF_T*I%p+cSIrfJF@`RJtO0kqw#ZPK- z+Nru$C0K)S?TN=Y#CcuTFjAatcM=};2#xk3G z=fGIv6l1C2V=RVZEb)r5WGKdxt{6+aVl0&vV=)wC3Bg$I;pv>vg6&A&5>ULQrjNJO z@G%yl7>lkLiwM31W6>33sqSMe)h}W!Z53l_rWi|8#aNmt#?nnOmPEx^n#%KD)KoH- z?uxOb!dUpd364{E%}ToSNF9f#cIkbR#Qo??&FuUx=)^x&s0!+rkdh2mf|zI zkIz)_@flt5nK<~&Lai)(W)US{0;_4HSWPX(YRW2BQ-gD6D|m`zHMQhPRrm%w1C&Ja znTG5PY|uI?K2uBanX-z{lu=BkhL6eAP)w!pNUg^CO-5`=ozgEdkfETm*h4=aT{H68xeXHZlf!1ldiapfZM#OwFOVe zPQ2WO;8~n+qvV`#(`qOt(^N5;I*Q2{ipex!w=Yig2#+z&5wT^!Iuc+oDf}i#3oT1) zPh60elai1kl2WqLT4$vsWf}=734ye%Ou>KCk}|V0lhU#>?2&jRI&@TBa6dF7H4NK7TJrBi0s>M4*3dG^=+Nex_|ZX+kNz3tz+k#8gmBy=Y?3EVDSHoz* zgDaAskLDBilUS>1(dP#L8I{M^h|0sc)`CDZeTJ7_3&an>50Bj!=n}opKBIl@drqvp zaqDR-^?aG1bu5~`L_S67*ZIpEye67H?u0g_D1V>)JMotyc_5aLeOjC0liwZ7=bWhS zlh2RI^Wc}NoCT+4N5|wcc1YDXJfxUBPyFTg-qH3edT!hXaj+==;9Jpr;_Hf9rONAF zLY`hs{!lERjHq0eC-&S7ub&xD#mW_YGj?AJ`){#v;FG5olNXh@S26kSSUzb{d5Pz% zelGcZ+7Vt^G+tuuYRCQj^EsOQ6(2$=iiMyr2zhctQW737S-u9&SZPw>z z20NWsFn8>@MS-Y%dqh4!$rs1uYa;S4O1>l}-xQJaK3DQt8kJi=2a;v}teZ&rvLPQw zO7mMFq~wn(`K?3VM6OgqtOo)`BVDSBQf7wyotEx)Akva{+{&-v-@FyE6Vi2DNlmHc zh_sMiQoESb3$ER*Z_B@?G%aJVJNHDO&+juz)iz%H9*ec)&oyPMN0eFdzPV&gF4k2; z!im0K%Lsj|OI;T0J@sw0_lmxa^kO)%STFLuLA{H5lkfe#DZiIi#g2>gD&PBiH9d}A z)dHldp~e|yv;Dm*@2{)wkMuI7^Y?PP>}7eszASpbWj)DSyXnWGHp6^-@|oS*_C3(^9gyl9y>I`}M@T-ka3v zhAzEUkC^h$$HI4svHS1pyKY=~v&bE|w0GY6@LucKg`CoHGn>cIi2j`>L7GVA`9e`-=);<{_r}#9P@MV_hIByo(jD0 zr4Nu#eA~hk;lr%wv|;jnMaAN^+WatCrlt+dYUO0&ZKT>sNfrNGHQQ|4I(k&6j(`8- z+M0c?*|cF-$IfFeJn^S0u6lrqM;jvgH{)t%;TgF93Hj@4T~q7oS*;T5X11)QC#N+v zC_8#!3)>Pzv+KO>0w~3Ki1J_3v5m;GZawabDa#f2nC~)vwT#S`PGVLoovtjW2hutk`s+tU)4hAcAHFiT*W2 z$aM^(R#nr+DsACCSzdaD5(#Mu`YqvYV&qdl&c5lyf$(av>~oQ|Yj^l)ICOY-p0J*L zTs*Y>!m4IYmwk|6CTAd{Sik>iaMCK;Nvr)U&Cls+Sr9 zgVfMlr@icHDp_Bp!901MnB~cFlxPQrSX90!s=@qnG}s+VgY6GjEG9o8FyivLVL}&t z`K;C6|2-Eu#*-igY2pWA=j`~&-$c|%XtgJmr8M%br=#kHAhm!@jXcAXqi@%-0WQs$ z)WdyM%Sz=RGerB1?USZg*A`}9)fT+uo@sDO`zhKM#pEa1@{!X@ z&N})nf9^98`$qPZ(k(ef%JQ`HSRn z&qU?nF2(X$t9_;Vcz<}jUk*9E_4od2Oz_-Td!mlybLq`kdtg2N<;oKqys;;HId)$F z(lXOmKS@GW{dmrjn0%xnGfEy`SNkd^@9UG-yM#QwnEat={_z=6xh!X_JdhdL56TOm zyr|Xvg`Ld4O08nwm0IQcMx7T-N2evb`py403UK~qaldMFbrL%UkU)5tKG!%+sa6$T^ay_Ecx zK$OEgpjgJ$Vz81gjIs>-T~DqrQt~1e^HoH?Ny&>?%!d*AZAxCmV!nvT*DAU4Zwv3H zoGDCj%A@fs1~lTz!daKCL1fCuYFc8FmYCF+nxwJG;tjrtDrrZPhm;=~Q6>A0wFS-e z^##*q=LB{a%;XjJ|Dg9}!t&Bmbk3@bL*ry6WF}Oy(^Av%%_6s^CS;W9-{J5b>*}<9 zDVj@o^u4;?qLoMse>8uYDRxD3jp&+oN*}LM&5$Q{a{u)ek5uk^-HO~5 zpDtYVMc%@rH?|FT(cA9`pGkT_3{fsv_hnB^?Qzq1)$J!Jpp+ZL4Ts*WtQ(_}u zZ1-F=8aq7c!ViDC26NS{RyDxs8mF{|teIcFUfkl7OYQBY&(kY=ax5af5S7~}#P@1I zm&|8f>G|WF)$!#ot%=ItJ|h}4B2+`L?J~w=Qo<(@b|G*`u*ZpNK z*7IBcWcmMe=a*g|ucuXgN*Mv3d_7?!QMY@pnzNq#;t`Kme}%clbC;0+H`cI$ z_ztFA8B$atFwa+&41WOv^9q(P&Tks)svSEdNho@rv_yqxgAVuCl+!ysJ&W0!7O6rd zWo;tn#!bay90e-F-?Y1(tsI4&B^?EOk#ZDvmUI;C)yk0XEa@l&p77))9fiP~5qSwm zA@E#8Ucylb9F54O-t#SY22#~>=T50lk;j%h1NGE$=T5=TI3ZUHU(&H)LtHu*J1=%D zO0BUP`Tmw+Y0lpQa%qm%;t3I#iSPX_A-^A|zK^(0;lyGs!uK4al=nwmD8Bc%jQm~> zFyGQ)u@;iwdo37oskqJlhuvm_7mG%)ZIA$uEJuN{@KI{=)Z*Un4)l7MfqygUYUs(>a!dI9U1C=sR^0+nO zXQVPHNFGacA zr^BzP^#9wwYO&cARzef6}nue$#jV^2=^>`R?5pZkD7^B~;Uj z!ehhN6b@HiuH^z_RX3)UHjHV-;}}pXHPh+|HLbkdrHA0jPidZ4 zQc`|Wd$TBaH2}S*uGQjwayhM{`FmTAUOv*h@#JR;kNeWco(ni{D zebqqq@{yj2_uM?~g;Mib=aolI^TMKX+NTT0`_jva<>hluE9;XNm1l!?zb6k5@wXcj z>xi0IOdNBqnh2+bHy~pao8zu>V4o(SSnAmr#fCX4xqej1V-(x^I3oW<$zv3oz%(!Y zTS^|A2-aUC@(+}}Xrr*Xnh2-$=1Ly3oK~iq2&eT{O77|X68&4${&H9kGtnm>OfuC5!5z3O>ponbi z)m}Y!c*qG+&*n*T{gj+3DSj_& zk|)Idss!qZss>6Pw~iyKQk|EO+b6|`o*WO@mk%53Z+m`tc%5I)y6u<06V|N!K2|lT zTLsVGmQHFWb&|pJ3HpeFe6i>72jb*61t001zYYgJvyMev)j9gAf~G{aK3FhPmH&t} zQ?@8CqoDja$DR4F$5CACjM^epIXh0}?%=te0{Oole5s{OHY%|mQ7mto0Q9mpz_J^ zHNlMr+ zf?`J5l=Rdx4a=t1ODij`7olebQTB;R%^PQw3m@DW-dnC-lNMEzbVJvzWBL74u9bJb?24{=OQ+P$-(y^rcJ1PIJ=!cRYdBAfP}0kAiPfdynl>#|oI#y>r_1yney{ zcP?va+(Xp|It%v9ji2`X>iYS6BO|n%bRGq(GSu}fKd2I&uieyO^yDY?$UJ7=QOvrF}eCl4R7%c>D6(`R`3pt(Dk^l*7YtyOITHSG-#*dg$jhS9zJ1}3US9s$ zk|m!lU;g=$C7-L!|I=dV3onEpK7A_u@Zke1MewB~M5(R{pF8qW`1e&5M=q;AD4k%D zql&RcdsbD`lgkOI7$L0gZ? z9W3lO)s5KJ_$6u*>d?boJwI{JpsVV49&_KK%hb!7xWo?GiLV_VJUFgg{Q2AD9{HcE zrtE#MI;X@EUp0&5C-wTJ$?<@^fJCoZ~Fc;iJn78jMP ztDI)o@{;4slV3b8l{~IkJ(QjF(#NKye7^k%`=3(VO+MmL>mI%9`)xiiK3x(q`}n z@gF$7DcIC#ec4Kl#*E1&km$~8N|I6ao$&i?W;K6H)CqsR_3t;|{Lk$oxo6Ri`m>_{ zS6_?%&+J|oE;w{BoWFjze|H@YW$xo?$;wHNgbWr%2ofTguwOU!d_8UY*L%V%#LSr+ zx^&q%D}2;CHvjnY1gyJtyadxKGVXPcHp3C5I$zRyB=2 z+fX|d0y-3n<||$TBU3b89)>QKRubdIaPzCgU-P$JR3sV`vu(Xf_2T6K@&_BSIbCXH zW08WT)Y%thbkVb-)mP4fr{;$+@>As^1m~+|#nmE*8rHMqKwwQcS#D3~WF{w9Ov}g! zM7uf?VpY;T(BFA|cf)h9-{0{0%M5RE?DKZvr#^3U*B_2>S&;A$JBNZ)*3x+B^U4#DzQD^XAwI zZ*E=nml?C(Gp<{E$DuC$%VtzafViA*dgkU;)87|09@#CD-<`gE*1yibaknV@$it${ zJ=?>-?te1;>&Ai?m(Ab1w^a*W-(r~3-DQl*2+(AYt(4wzDHzZFdVrBSgONI3Y@K;~ z*RC68g*Arqmi0XUp?+V%*hsH^r3UTd$e?}D8?-QF z9?GEgx&*hVaDN0Y^(TUg~_sKEZIX<~G+A5#8bJ{7NTuus4p2w+r<*LG{ea~gG z9Ey+?L=!P*W z{gNi1nvy0m_ly4?`un8ZI|;YQ5(5`+?AUVElJIMXjRWC&e-&SaQ;&&%zGoe~<*&EQ zJUF{n!oFUM-EJ#}(UHWY=<9hNYh&imJWuKq{Ouf`!Xc$nr@4Hjs24sfDowmh9rbSa z7gQ;|c0#+p@H=x4vj+!RZcVa^fRC)gs?#$v*s6pJ5qw)YIZZ|1+N{@APEKZ}0a~Q5 zec(UK14ryJ_l%yjb5x((u6pdHHxcQr<<}+oUT0Lf?JM6Yj+q>Vfu-}rOs!e_6 z)?stncbe0`+lUUyEn2;>dC?1#r#v@j*5d3Ny7wH_Cb2={6{GX6S@7y~2D2)Y8k}nx zBvJ!=gSmv9%bsX>4`#HsRnt;^wB|nJ(I$ho)x;ezVvc1d-+5M^Ysj7 zUwQ`Z4mFs){Le(w$JY_#i}DHH8yYU(`2Q za=oW@N3@#i3!-P~Dis|c2$Ulb+uKPd5L?$*KJxS8z6&>ZyR-AHL){HyS3OncS!?On zn>U?Y{??0!1~2b3dgsKe?;dNtY_I&G+Voc!T$4BY3VNW;sGi+#$X+~a&T~^Hzp!ZY z3$0otcNo#F|C~z06zg++Q_v?4Z$H^ z*In4dW3V~qD?BD3t(|ld(h`Q4*M}P%wi@r=eg3%Bm_agxPA3hGEVoDlbh@Y6)V*r( zc=C1HS=IPM=yYFtI-T`3nU8#y>J%@1Uc}rFq0@co>7<>i(}$p;d~!6@Q);a`GVIN zIgwk$E4oZwf_D5d(Qtlyz&CFNq2T()oS`CpJHImC)`uV&9JFIU1ATaA(o>frP zDPG6%NZFV|+go^&mk~%WP_7$9N+pXG33xE||2!K0{r1CGKQ{m7gQE}M9==dz^^e<) zPx9Mb|L~Zx4_$A(ncrahkElx)p~ha_z;c(g?BR_FDK zq@Uka+G7|Es=#XWJS;~QOEnYK=qV{bse4;VCFGE-Twi+WPOE%yi|_TxU|5@!< zpInl7PkttH3bADV>m#Jxlb?^K=XB(&YBZNf54rcY+V(=$y#-g5fBZ0=UcI=!kbYnJ z6^ZuBe?r??R8F}O8L8K|#pG|ti_)LeyoKSC)dK0>-B=KS@~SmJO8;Ce(!C}Ip37grEXSB18=IZ9*;788)Hh=+^hB zg?d`b@yQ|?rMf`I6ls>9d`ANg{$>sF-@>wIc_~g>V@Z@>=c~2f5A}j8b=c@+6E8~?e z$D|)PlkGx(LuAnu@<@$br*5ftEBNBGPn%rf)TvX)$!`3&j|#rfvp)@=&uHJOc7s|@ zhX&zuM)n$`X84tyF{7^NFlua$xFY||>ilQL{Px3!wQnoeC->@ueUNf*bV=Wu zJ;1RE#fDdc9ABS_`Yrl5=+mHoQ<3pm!Qb?8#*N|H{WndTd`BPgRsM#8doT=aQd&!S z6Qo>Tk%oa*5~3p;L2_pj^Qv#JTQKWmJjmWH7H{a)GHW!1;IMunHC6wl;0nEoJ1CI4 zwQ|+$g1H5E>*FJ1wuKr3pQmo_9>w3dQZ}JuEERkz*3fv- zl{&9Ta`bpbjW!YK1GZXP_*8tP(#PT_f?Yg0um6(y#Ns4^9V7CxN*;@c2<((`58_jO znvzG3%Brp@YNGY9MmcJ|@?6w4;V()5hKzfloLk6;qYFg5U$$nLRe$Gf5yQDpXfyDG zHq+QRV>7da+)iRe0wR|r>~Eh`UyYIwol&1wb1T3nY^dHCbQ^yaIL zuR7hD-OsTOGMJj=`4piSy|2`2C0#R0c=ny|84eAf}fYG+UD(tcu< ze%q#AJ-cgaT-kCd4Fa9VWVYzrsL6!+ZBqtpol}sqEn`6Id;2cvvZYL=3h`zzqt}&f z`exAMs*Gx3`a)#nbW(%5gq*OT`-^W(EdF(kH4b*NcDwj{bwn%PTzWnR*e)-bMtI}Vly!E2@ zl_+m|F?qdMc{BX-Sh;Nb^gq6#K$oyzj_d9aprLAq8gZE zd~#n)$8rh8eJ9$L)(bJ~g`xpg#JO8ZPduRVvFfuhpH57$|V zi;b_0tW6vo#E$3S7IgYT3^0Q9H zN_)1U+_c_W_#ZRTyw;nUIckvtSBZ6!*g^?g{Bj!@s+^RG!;oro62GGnSzyt(MP}ys z1?{sY_sN~6X6B(W(V2N$&iGZnnQ30Dre+s4H5&#xjcL`QU&AKj7PPIy)YQM+n&Gy- zr{Dapa%z?_Lg~G)Y}2QHv?-{PEvH)a@7Pe1=O}$sviM*^wK3uBf1!Mcol(aMSRcwv z2{@6Jy5jX@X|JMOFG3T^Js7!==h1L)F)5;_aPN(@a)$Wyh6Cf>ReOe+J>B@OYsZh< z&~MPT30OrJbuE;F0CdNDX@Nb&#O|W zVq)&JmC3o=ri@tFH?70ez1NJn@9NR>_Kv9EuWj0}<$VTh9HUpiYGKzaR~+BewZXtE zuNs2#62ptsTC>?x3Kq8<+)>7hsk+J`sn=FY?2LFW+G6&kR27bW8)dU+ ztHPC#)6E|i$)zUKReChB-U#7hEqW6_3Z+bC#y;ylO{PI}2(7cIq5~GYK=WQ#R0FANVsc+g$8wRHcWP-Zgywy}G&!0#*C$8w zM)E%w@m{>L%VF+~m^0eaNO^{uHx!izow(AM4>~iF&tCCHsq)(ePH(hrr0(_7$5)Ta z3r@@F5tYZuU&f22m%3G@x9zi|J>7bW-wrw!n@s5$X)>Ta0X52$lJ9%4m80XIOm~i5 z(l5EfzC-bq`z#ut_uQJWwqVD{rtf{DqN%xQ~1$>$S$PXOHl=ow&hZdB1*j4MBjAHlD<_cJh&%5x%cAn zdB^9@IsU-4>wEWFKY7ynUcJ|cmu%eqzpK2!i>1gvY)c0yHN;%5K*R06BH{5K+@%PE) z7M*hZx3chFqVu8If7tnblj9Fvrt=G)2+X>4?_=!77M?WgpukxhDpKF95Cxjb_t2<~ zDfJ$jrJ{8h<%ZUPQ6-lZVrHZC=kCxy zT3ygsH2cG+6K}`5xmf*Y3PH73^FmxayKsWDxBoxKPr%MTf3IGY))-jzEaDC z)(tDR319JtMKeMl@7!$iK5_kuoNw~q{-Y8~l_Hx-sg7RCC~cO9f}~t_m{QJ44q?5i zG&uw`YGg>SRI!&&o|sZ<`j}CY&yD3T-#x)|m67#5hjQ6E`9;eU{abdgG&VjZ=JN;` z%|&d@uf$rfIX-93N2|x<5yT(bS0TCI;vN&$_UgHIBB~4}7WD{nhSt-YpKt1O38p+d zr^qGvi&A2$wDDub5v9b&vdj}lY05{U7)oy8#D*R&8gs4m@|pLq-Egq83R1`_n0eW< zs*Rs(!`mY931Z_Pm7Qroi}70OzsJg0LVFdBMp?#7c~!>B?dwvq63W*v%j=o)FY93$ zvx@1k{F|a>yoAT)6;X9+#1_cS^Ww$2RMQ#%D5!4a6ck*x(Xa;R|FDx~DTwL+j?S!2 zKuR~c?!ZPm5BAQwv`WuNXB9|fv{qZ|ESUVc5}Jo+tnPSdfRlM;i>9d^TUQOAop!R@ z0e8XuJM(|KY^lSeM{nvQhJ?5D=#$f;QOAH?E`^(CpYGmsXV}@_N#3ip34vLvA*o(&(Cyyz}#0OG?+xg$9o~aW3z;ORRTW+my%@txf%3=enb9Y zvsS@Q{l@dDmu=RiMta=6tMb2!yY~-=gwj5gn6*W(#Ju-Nl^7SBpL$Xy5BCc!q2#G7 zB=y9^)xv3DsYogxR;(hmh`a(%Iyd$HTy=UR4!^a})mw)2e|Y(9v7lgqF(W)-`SJP7 zzT2|k`1(rWhc8>hk?q}v*$YPuT0LN+_($B1Tf-!AcKCuhrbbr+a&sMozXpcN1%#DgwZgHkQe6?bo`-a0h(}yhQxR0_-Z4^P^h%Kwj zYx1R2EA3btdce>cU2N_zU8F^N{^|l-4F98oMQ#3{EuXS%vV8KbR^H~Ww5V--@{>`r zQd}-)NzCH4QJh)T(>^mhY6pF}KqlFQi?xcRLh7l^tn9EN^NNS+u@gwv~Md^!5 z16lMvH719YMd+6-yCghb?&tWKa`jZ%>P5L@#rqcJ9_SlMZ^sXs6DwnpH0~Ksik9%_ zu~vKB(-OS3$|q-Y_$swIta>_DLg_j1Oz3H>CD2~J`)G-4A~d^L`$Ois7L`?zB(I&% z4k#+CB=cUo)s@l9(RNm(*^}41ggm{NT#{ceeMVF+OX;hH>UBl3eWg|Y4);Z$8%tke zR282M7pL~xhABI$@JD{eP%f)!EUGE0rxwv>XXUw7!8kyJPg#a;2z$+w`Hg$*tk9 zn4$;mpgh|sBaf6D98fD=NeN$FwRS+e{s|dnTcqT6H~&3yVRnVUHZ#<}--Xu9>x$g@ zG6oF}TKV#)jUjRi|SB9FGY(L8c_Bgw&wa@tBx6a6_E7v+=_exPr$(v+SPWioD1 zwP7w@R3FrR(s$%iwQ*unT;+28dxYm3BUEV&<33%;dKu4b+eY0ekx~1S`N)W!tt%-mYrD)*Q(V#S`aRr)L*x8nHCYGJQm za@qY$zR2^f>VI5NtB$1)>9FM2eR~V?vWKT1ys&-avsdY3MjxCv=gEna zpPV)O;8^A9_24&Jq)VKop$sm5S1G3Ye^^>$^|p1A<<~Eh+cRA2&zIaN?k%4`{^u(q z=X%%43ze;ujjyzZl4DzxlJI0=-)TKZ-!XX5mTQ*nXc~S~JTvcD`PD+(cd&5v=-pGV9Mx*f zlS`L8HRkSRf!i0ad3QPkQa)|B{MjKjAmQYtkn+nHz}S&lwa)ZWDVY^2q?L6uQ_F^1 zU%o{84{r=!m8;%Sd(DcO1^VR*DCEpDE8xmhmLpQG%@DIA*Sgt+OyGUVw20_==uq9v z!;7Zv8~gb3n{pTRLI)CDUNCdpvQf{kE9j>0Te_jka>m7C>@!)>Z}-afj@x`%_Ok9h zAR?7ZadQ=m)v-zP!IH%`RFgHszcVc3F-j{8dP@Hxr8Q%|Y`-ptHWj>AqHy77^;^l= z*dpJxw^wcpw=bo%;&>iEm!>LTKEhJ9fh9PqY=O**7d6M$qJ_0XdqpkTFnh-yQVmmL zT76w`gP9xtwOBKu2jn7}_fX0CB;zYl@#60=zCx{hr$ zV*BVPR{vP(ns@K}`PTJamXA|C@s}Z!M?JSbT)1di)190-Z@F@1`2KL8x0#w-!wdO^ zjjhZC*>9x^$gFF&$@=^ms1ZMVqM7tTdE#~!bgjK>1RfQZp-QB zr|ULd`te=*m8oALzD~MYhI#sO1-W3UB^r+FUuxd*0t0lisa}kvW+`!Nh3egJ7s=Oo za_uISo}iIPdikU0GB`vI164lj z{Bn5ye8ux4iU|!&KBQwiOkA(5#UZ6#@`Tjpq!K+DGKTbxG848QGIK8+l)2*V)aR$? z(sh|SpdS+dl)1>#>1~w}t zD#uEbPVIRL-~Ly!hC=nNnM)f)@ABja$St$vU1-F5g;Tiel&p)gZ{A&}3MZ(V%R2rR zliT*mGO{L*kyrDWRQ6+kRkFV!x0KcMaye62Maln)Ji(WKec@y!|Ctw7-4ZJ+FRa=k zb5~MdNs*$_sbwioUKe?C6UzB{(Gz%S6|GHr7^z-U@i|qZxO4vxYu^D@)zSRTo^$TK zDi#nCjj-V(G?8jU0R>Spu@^LU#U8Q7G^6S5pTxu@#w2Qb zGr~Q5zu9ve1QXxq`JM#f%-OR$J3BKwJ3Bkus6_q+p!_OBd3Br0dnj#|iIi0fO$FJ4TW=Xj-L3F zugK^(qpJ^uDDbs8_}U~5)VMQegzl$LZx(x3S2ujI8O>0~6|o?c`4D0E3sB*2e6Ab| z(%ZdQcj~JxN_=}hG`KF4a4CrbfM*rac!Ze z9?_{e-7vXA`;5ihrAG9Bd#GaE)6>OO4O`{W>$gRRo5U_DA8RPh=aRtuTQnuDqKkJVzD{ zVQErJQ{u3HA-aJEdR300gDNLW6lSMBwP52zh{P|PJT&T9G(IFgI}91&5tRZ#xfGk( z01p4I0M9Onrj(vn0RYWcLQigQVo?dB%aBou;`&5t@Z8#}+6h7J?JX=uR@BmLYdDgr z$>quX1v;D}jz%T?c%Nr)yX)>ez@>k@1tS4yLZVyL6HB=sjpc~jVe>7@D6vBb8@OaW6nal z0%w14UgK~BuX)N=Y?6`8>Tf?G^$lJSO1b-=mqtFNuEfb)tE8BP>#^#hT!u&0Pp@!SQ>)ItSD11K{qSV*#wPS zLs|0(8mU0t2|DjxT!>9j@fnO74=n(P8JrE)xG0XBft)q0#pZY|%Geg?M0|VDuCrG7F4@|-oAum{)8cl{s4a;Km_PPJ z-i+~!yrqy|r!F3|VR1;7XT-r`?X$w2C3D>u`e+@6Ut`n92h+kpak|G9j7 zIz&`sltpZ?S8dhfxBmqz&&A$N)^H4=9RGi8F8pcxU21zljNT2 zE!@(!k6AP>CkiGFDcV@xGVTkbwjC|4p0a&a&EeMnjsa|)-PkYv^}q3ekb;%eQQQoX zNg$B4q>5`I4(DbIhvQt-Y6T9TBDe`GsfU;HgEc5Gb&x0=kk3mkxCAg&HS+|Ji{u|` ze+4J3{ShN2f}tUF52xs+Ch1$WK(3H~OikPo@=rH}R6w(pl4PLaK=byS%wFUH`3Euz zA7i<#Z`RcL0#Bbk;g+iU2Num;QvVnb;tq14(Kd`!sOMCv1933t7COhVK*y<8gq#8XEpuzB zJhs`eNYrzkNj=}2y=H`yBq;U6TEra3@!*{|f%Bz3@LSuYUBglxn`$Qb!0~%lQRdJD zxWigf>Zg2#`$!UzuW&zpbLB40f{wxh75bYW7}TfagD>2XoRHN&u*xw}{kjSwJMq1| zVC?jMT}4R>(XNQz6Xu+f<{{+5h|Zg_H#Bt5Ozko-HEn!G@PR|{uQB@T36X}n=&$O# z1qFAj7gYNAR4(A*Uxt{kb+Y#G0a;$R0|8%Y7t@r;FOY~gLw*DiY5~hGec&h>=i<$w z>W48zPXEUDq`6X_zO1K8+cbu;HJS@5k@#h z-58t|K@JE`8p_vE)KWdzCVaOgxcVcy@dR_yEmN_PI)*wlxRyx=hvG7!4sg*&BNOJNOB5U{ zDJid>%CyC-z;RvD#TMaqPk`Gufn)1gSC4}pPWTwwbx^p3J35SbE#&W?;aq3RU8ZnT zZZv^oV;%j#l3fv}?{wni`@aj670!2HyF(lKQNXun^0U7^aBXW31b*Yu1yRCwddM| zrUv+F^}|V12n~b&*-%>3<~L?4j28OgYLmxc<`~Kw;rXnvMR?W`$43Z#an?Dv@~_PnoByiZo^&kP zBI#JtjvYJ5R%ds&Y+-M1-%ezdr?$FoL`u9XLB}e#x|9k+QYbo{T>NyCJ^~#^puGcJ z3(a=Os}Ear4nV{?h2@vU6(LrejWmhQC-eNMNn}3a;kBoP0jBZ!)Xgt)1}H$QWZ)|KaOiA@mjokHKv|(9)P% zbDN-oczxVoU}uZNvW-a$Gn`ZbILTxZ+;_BLlya;|iD4!y2mGMlVI2ucZRSU{dMZrB zVr735VGh3P|3K;=)O{KpBUSo!5aDR*o}rXDM$PgsvC7hc^7Y5PLfScWuo$VG_phu)5fOWKXI-)TZa=S=LVNTedkyQQv2e5-Gs{)@qGG={Ryi*SLZ9hVwYG|K=7T0uZU87} zOR=S)KX|a&=x`qiZPGLw7Vet8$aM%G7I*^Bb6o*PuE}u06UZI8u^7bLhSKUbYa1{h zH-17xYk+ESf5v29M;hQaXpfH%xw_3GnPzX;6v9QWop_7z4uUlR#~z^~RIR-h9S-;bbMz-@a|#yxVo;{Hr*X;iaoAAR`I z$8rq|F3-y=m$gD4`K?#jC@JL1wyozk#mB@XH2AaMCsA}SnQlzSuL%Xct( ziIIkc;%#69*w`o+nF|)_rxsftv|cu6(dzJ!v(+1t&Sj?WP3W|z&6+qSpyMFh>WmqcVZMbCy*(46z1{pe_v^cHQT(RK=u`qEhj6f@y+y9$ zTy*gdBsx|!**_&(Y(;t1{=neYU7l%U-pe85DRAT(?>duRorW`kZGy0|%BMy<)`)gE zzZ9Bh$RK=01nNIE){kZ^4RP(>&#%k)UTLoGv!@LFfUSKB)LH8T?=KoStn=dDo-T7I zu|@AZ4c=gJKIB|b=IADDOfCO}V?C6uz_Bfi;ei10@(47>UQ-L@*BZ)OnU=?nq1srU zi=0wV83WT%J<9MK>Mvu1`OYB6Q!`u-H}AsojrC}rHNd-?Ej89-s2?Iq_3-tat{sKd zu>hg=nc2+7@5Kw!On%x@7dq5Qt8-U2w=n*(T8}?)l20%yY>btIvc) ztX`B{*y#`?A*0~>{I$;?jEO3qmAtT{IKFUuSmlh2&9(!r{Kt6DoHnid>{Z?o)p4oS zcKtg0xp_y$k4N)IAj+w#dn9=V6%6g5u~sBZ7bO5K!NUb~?IRuG!s~^3uPiQ1t~fdG z<>h;8GD@FcUNn7D(&&<`)G8@F?{r+u;q0Zy?Ao_~`T5KjlWR)nrB%J)m*F+1Vr6pu zF=`ig%{+&89r;wJSUpf3lzUOhh>1=crY?z^T{dZW&n=xs zO!gl$B`|zJkek0-pnFQFHI{36)|tPb!l@3rK%_3PaHud1^z<+eZB&TE1Hto0!wRkJ&E7~U@b==zIS=ABZ+Z_9W@-M=2#JACs8zCu3!>!w1 z<2j0en3v#r%dD#nv^CxWi3~lRw2H;*`2~JeS@7^Kn7B)~|w-tKSh^EMkqj$m?wW_fz zQe%B5!4>^Dp#;<(>EU!q*iu%eozhYt^aSL_6A_TMB6J&8L~awfVMDAb97fd%lYyYE z2xTB1EHMm^u@-DZ+%%S^q(Z#3rcDKdQ>+DSJ~CUWz_H;lfuaa?bqBcO1H|N$;_-VQ#3GugIvZ1{)hEbyy>A z*97ZQGv&_aYMg*Gf#U>RG(Q1XjmNA>XSb{ZdG13?58dF?P^ zfelv+4+%>O@-nIgU2Fu8DHX!YU!7a)nl*K5mg~u+S2`tLTO-tJBV+R1-Sc9E1KOZ9 z*An^oqaKdE5`oLH=i>5ECoTwyB5e=Pl1^MqTjA2O1TCEyikS zTF>N7>rj{+@hrfCghwf>6P{)@>w?gsfvGfUe%_*q0%-zQ7==&74|Te^7lx)K-E2BS zI@K(@HDL#XX8t$6P`LD^rd(~{M-B%+>bBd_3DfdMZf^oN;dbf-O*>SNf!mvr!l1o4 zoIEzlpcwQ6!MP8H6I!j;nSgS+R>-fH>kyq>^E%99nXHpvA~R`HrEa4prMd}2rEY}3 z=;g(PX>^*zppSSR&__{!2SZAS>zp&~;F3d@TV0l6E2LccNRGPpu&>jzW1n@leQ;Gq z^piFt?&|dESL1}z`r}PM^<=gpdO2;1Gepr2(Q`hFSiAvylF0(A99pR&FkJ$m+V2TClowxV z{@V$u9e(V0JyKjC6{O19M$Rc5StA^&Y!TJ_&+-V~3NymF`$4IvOi(oaI0SF;h<;HI z_v0!?sh>DefmaA^I57~pCs|>9x?wSc%_l5im2A~6j>t!9>!4!|&1iO>$ur(Aa|{^} zJ-)D(GzFuvg?$p|tlk~0++UAT))XQVwv25%Ft<*U+CTl*1V zo?Y$bXn!1H*H%x&L+aWvWWv8SEcRHrvfl5Bt?3EFC4mS-JA5IW zT{yvvaM)i}MmX2goRI1V(Ihttc`2le*8+Vs(O8;mWCdQqG$wGGD3w;fH#?w%>-Czh z9wC;?Q*&%88P0AR+9l0S}YT^mD>KGKo)9w4;7e`dj_s6a$Z^Yw$2jfYWIs{wflwS6=IJz zd&(Q`x895X=!%25$Y=sQMw?w|oJiF)c0$OLZ4TKp7oDKja=N8>aCGnftK#V zK>TGAp3|3t4f;Ah;jTAnqPC2={>wdY;%HoBSo<`WykY-B+ONZu3xg6wL*CqcseeO% zaYe&$scTJ*uyfx&p}d9;5}@Y!3GtQet$vf-I|tc}^~KHOl{JFY>shy8NBN+aym$1>!0x>yp@viR zvbscVh53;O4khSs&eM|<0si_h9eol5E7BmYZ_Ag@o@JhIuY8+%o;f35etYH0T@MNi zAM9GW>tR8`!;-V(jxnd#UuVuokIHYn{?Sj@2;i0PaEJex=Tiym zS1x>^et$&7{`wbKpYiVVerF#wlhrU3&{GNlx-S~4D-CF?s*8q-t z3mO&e6e)L9oA%71^#5waNl)#mr)HYgccp1u`=S0OJ;wJE z!r6hDuIG4f+H-n8lfTzd0PjsHK<_d2<9i(?@ZOXXcrU)n-|HxX_oft~_iym`$_)^U zIFoySMK(#8Q4$a2F2R^;D^9EZc>qYwHCmHnDB{ z11eQdJM9$hRh=}1a4xfFahx{4)xDv>rJpGkumq1Nc&5}0S3d#0cCxqhH)sPs38xhb zi7Ppnosb(HQv@dyGy^A6yIbthn5iSi=T0fAvg|d~wJ+1YsXb)p++&!7{jhFMcB*&l zr>r`kH#BI$n8M5+o}r1$!li?ccTdg;>E379@ZLRwGboCIrm16Su|4e|A=U$$!7%yR z>BBURh&fs>7POFg^J!|6fBPyExMzD9~Av^gL2r5|1Q>5v1>aTS!I&5z~_iJ#Ux%*UFz(nF+^&Y^> zf(|nvRtE&I>W%tnGQl6cMO-=_xx~(MWdC-K;+~pQ^}DuL4;tsT+OAZ*m8pf9+MNAn`}MH)gQYCcX4rySr} zjSr*@)wj6h)E#hTX6%lBwIymh;*bV!*4FY!-8<~NueBctUSG+$;`m){matkoL~ADO z)kZ6HRdvK?A_!vU2{ItYjECV6&X(-Xu3hr2Iu^sGd@5(NJ@3lv6$wS+Qh@0xP?|8KtI=M8lX4JM#;x(8BgB#voel33-h-SPX8MZv0kKn2! zBxqIJn@{4zbrS?mOxRG;>u3lp!W-gCYuF98BRk^eDu|11{T#n(ox5xQxb?DQpr@_# z@HsvwU)O58hm@r6AL`;G<;z}+U%NQFgxS`zi}kiX3*EVGa71mVw)>xL1M{2mhr4&P z0XK_pvHrVv%OBlZlD_@Z^z=`+r*Hc#J^izs7gM&f9@nq49$UA{UtPa0f3@|AE{kNH)NN+m0>N9=!c>Y5=$e3f zQ{b-b`$kHcM#_c~;V4a;CPktYG7LN-GHSYRJ#Sk6vrgPM``vx=NcOs}X<-mQ(G6Na zRiJ6m!J1#YW~hupzVx-JFp)?_TRzLEi>Qjr`DAv?mvVib+)p|tmQ%IC?D&FJ9wC!n z923Z{KCV>-_0}7&>IbMAwk{R}Is#kvK2j&BE(q$nzj1RlQI!ACO>5vzO)jT`he8E) z0DeP-0mUw;hwtXmU79A#3K}&LHcn2a;giGX zy;@TCW-6L|cW24uTrX-5_2LLHs7{8C#_VP3HhwEB4%~vt&s7?9I7eUK5_6$;mgIc7 zh1!`_bug$rUQQ8LG;2e_y;TF7>vua=rf#zpFJxOmr&4CIM8r-G|@MF;>)VgdYvHHWPmo=Gzb5-muCR~O&dmE7r~ zMbN?$|I$zL@;)i`FIgC5ak109oi`R;V}lPJlHZe$3MZ{67M@89%na*a%39T3WUWj4 zhh+vWK2zv*Q9khCd-=dc;R1L}LO9a{4c*`^qMOPc-sBF00O0Pxe_huJ`{kMOb<&J~ zTiLnq+$mI%oILLO-|IWU%mY%1qvOB>YyCLrX}%^vL?sAM>VYyoVr|MCrNwpfrA6z# zy(`lhb~g`vou2yD0ijjHzE9YK_f>-@Et@vAaN_>7o2yp7g=L7agLt)Zzw|2cYU^C$ zRdXM+TZ%?++}}#k9GD0RE@8<6z9Y?_Y#bRqEl8*HT=TGqI%4MtYeh#~m4cBG+h3F4 zJ#>f-xt4xoR|-ZbFm+YHnoslcK3x;AYGIINofSq%n=I5?6Dc0B$ctWuXBG$12+4n4 ztdk$n2nD8}E}FnchRoCZkmhf7F-7EG(Wf}1s}8nc?tfL!T-=s_t zh^L+&d0@R`()KBNx7SsEp10`wBl*{5pUY=Y9cF{Cto)>?_|HR|Sf@`50!pHzSNVrO zm*l)+`iL|y7rUu*I`{S%p_DSb{-K?M8Y}vySWVC90pdO7*^rI|!xc!w_imY33H26%P-?u3- zaeWvNR{|Qu8&~BI4#d^|vEdrCs;Vy$ACHc|vaa-#g8ctm8L}!Ru=CYU^LD*i|L!r% z(PKuAu71w?BAfR8G4{-B^G?av-m0kSw)NN2GWpSkI{DAi!QmOc^G_A~N+YL@ceU8N zeJfN|4u(08^*cYjvTHwJy`Qeo=nm{xSL9YjiaX*<_h8C)6r3CzP8I=c>Mf zv&+mAR3Z`}M>rTBEN?j?H`B>x+>mGFpf|Lizsg>0FP$mhaU{sMJ`M(UXVezixL=LS z{czvn7KN3CQ2bWTqmEJ!#$P?mU=z}{>Ey7}bCZoD)D8lKJGOWlRlK6zHxw5*U)pp# zC;N@15qVR(SoB){#lcB=zrC8dESxs7L(U5u%tv<` zpR~EldM55afGt3utO}o0En>=k2qji&*h zWo%4~@a4?K2si0h39D4#a!1LCCsxdqMH>A!^zRAp4gGw=dqaPp@ZQkxC%iZG{|WC6 zbfEVJIvDXc(Bld3pF|hqs1{9$ab2|X#uTlr3*CynnDzH7o? zwD-)v!|qBf=L-7D0M)m~-$JKS9GDMW2hWmDr88~Nr;3+Y<7`-|BL-Q2z^_>ZG?Z&~ z+H1>;t}mQ@GOOU7yo_5b!&c4g+?Dl;E}678w>&g7)1xdqw_-f9eyV=XIXgGu#Nywm z^*^o}3aa{i>C(@u!V9JhPWy8Ina|@3#@c$P_yny=7`^oNhWIl7fYSK5a(}<_E=#}N zwdd<>TgyS?!bVQXaNE&sJcW4$iM8^Sx_4h1{c{X znfIGvykha9lJd-XE8R}8J$6=A2%VcPY7V)K=?K zrar&=^6Z&G!HLb#ia(W8{APu}9xsvTrAh`~mY6_&FtKA&chET4_0Vs>(JcSJkx;rH zG<}%G5s^LHq36gUT?V!7*26<9{10ShZ@JF%kE`AqyDqeyl-0hY{Or@x*}%UvNh8p3l(R7Rncx9cmF?XtugVc+nHe7whs=G?%9m29F?_E%KM*3s6l1L38qe zV!uQ&r(6)<;G%(ZiCoEwlN16^yQ_lM+HsJ7)rX6NHq0p=HaVat>l;3GvYq^*Xd#!! z=8g@iig#RBE`NEY?*PjgCzd4at6RQrT#R3jaiU6MJ4)m}Ia_l5rp|ZFEW8c`Xa=Bj zt(}1YmTE2J(J>}2GR^Ib;2kAtas6H?NSE80*Tt1aAv#Bvk3uX3PDEGWd29zKVsm&t zD`^p4VD_*@c%d#wc=LLSo>0D6w@~Bd`HZjNvy6>5)^7q|&UCIHqLE3zN_3W6HRe_e zZlO^<_O0)>Q|umn?^=3m>|;xBjXiDYt+Br?y*2i_rMJeu+x@ikUt_zmd79A-&g0Oh|y}Z18+qZw4m-p@Vokx%E+;Q~i7oynZ z6r1$bgs<47Q>Wy!_ycR$9jqHuEoUm$P5wr%UyjwrH-Zh)+R||VWXR*e17tz`Ysx?| zs^OL)WnklFeArv#2ckU(vS`fxD>@yICVIv(^noW0Pin@6yty{*+myMQG#da=}Q9wCl)eXYj# z_rv3MJLm4>5DofJniAnV(V~s`yr#{_g;N^by?rcOOV6v#@xb=XzA%GFhysCmQ1{t)>k)%ezLWp-n75+To%wAp3Z8d(hP+(t zQgZLtoty4HI(G5+-l?SculDV4`QEvhWm6ryFl(WUTUt~~k%wB-u6kXoc1xBeFWpgI zv~(3|f80#e_*go^x!Q{M%9?Yw9ogAHNOCUBukAOc>$B~U6tiJft^B-HtX`HQ+Gz#9 zu{c1dYNeLC)qf+NeeOBfIHX=FZwHU-Fj-UxYMR_y$`-QZ_Qp-Omt?)aW>!%Er3#r_ z<~y-;ZsJ;))QCsCakR0twDH&xWY`)XWv3(x$<8>Rl6Wq6NgZ-xD-Ci6#>sKM^1MoH z@DF%CJILANwt^togO^9@fry3}j1DGasXGt{d(dR8n~O=eU~OP}FC;e;two>U2~WBi za{A1*A@Y~IT)me4`Oj-1Pb7NfPuW8aLYZ9y`4KF_6&d$RTKCrIoNnBlCZmATe$j>& zE~31fkBcaUx$=-r$`zDKKC*@9SNRv*rMs$LIM7g9-74jD+QJJ9Q(s(|b~?qyHS1)~ zw!hY*Jse>Z_nI`3PI?|7PGNZ{1?^U9QWn~PL&-pZ2UTAu4WJI5 zr%UXkMCcpg`7Ec!@&#ttEoh;hLbD4k!i%0zzS!)tu{`NA9X`t#1Xf?a34A#lYJ`(6 z*Of0}2%FHCH-Q@u5mAUcg)(yLn1;`jmQ$c@R+vz-<#2dtI9-dY%*wciqf{!PQUbZb zD2GEk5qm>eQq0ea8>0 zA3~l&AR?&V!#vG{kreiZDDin3)ASR9k@Q!s9^3qNe*V{+j~$y|>El~5|Cqw;#|$a= zDrDJ^axcA3mvT@0ktX9&siJ{YIC`mg|9R6;WQI=D-#~zz2*Qg;{wS)Qyf3phdv9cI z@gGNPYde*))^$QB?T?jL*T*m<#Y{u)W~J_XBC}i8*X$Zz;9191w{>+ zM#z@O1`L;4uJuraHDsMn2}pH*%{@CPH!Wr1k=Y9t=Y?jEea$g7D5WkZzBs_DPsfmA zi}bG#Z2IxYaIfQc)*d)_aQ9C??LK(+VCCH-?n4j${M^B>)4X$o!j{mcSzIGf;U>fl zuJ?Wu_=K*5ld+({^MnPQ9hLG%c)oz`JVQN3cmY$yrg`~7hH18i@#7p}$XfZ|L_E z-W&S=g!cwI(0ctq&Q#vvwpSRc&Cn;`P^;to#Y3* zsjr!nPV8XwV}Xo>2#yr}huuv_z4u1_&%45-D(~t&3-gF_(Lh6}Q z6Px$)qQX0CXO#y`S{*-o^W>1KF018Z_D2{ywP*Cs_9!B|7?2%YE~!i@}xW~$lCXFgmM z=dsv-+TKMtYdkA5K0Xq^dnTkUN|f(PAv;#ZrCGI}m^nGJBydltcSP*QaNmi6AUB#4 z1JINq`c@3kYH^pz-i8Q3c@TscpqdS&T9fv7v>eXkl!V;}c`?>We#nc0BLsO0RRvD@ zh9n6VP&NX)5vSCNoM(OI%MvC0w;-D^yrnoLb>HYdBl>o0V<)_M@I=F{#e%iGyo-g4 ze3{*|4NKph&W<-smY-ps1VG&H@5e}Uj)oyH6xHJBK)c56y?8=97>Ezle@)}`;&_f=`KA<1%SK2pmjH^HWpev&hR8>fqxJciVGB6*f z3c+t?Hm&hju|k@m+YsWJVo5>kvv|-Sl*rM*HTrBH?6>rD^TpHB^612ZlEwc1GxL(C zPAL)&2}#FO7S=@NOwTJyzR=!pm4 zen16msBk8EJ863bQE8UQ0%BWT%Z9LV zZ^_kc;al<-@^PdkY}x~yN_Yjez+#mk8{lo!LUAWFdmBh##nwkPp@Mj6{rZOSO=|)P zQHw}7p6G(Opg{CNT!O7tzu{i}ZPcBFpKIk5%T^w1m)7*1d7_NnuRksxmUGYjnS)MR zVT>+txuG$kvH3qfGZ7q}1QROoabgsQLu6G2D6ej<1btzQ)ff!5Jw4O+U{G!-qI>Ol zIc26MUf53cwZ=0swMf7Dog*roCI=Zb2<4%@U66w5!Yn8rO{_y!Ll5oq18c?16GR31 zW=#!y1(#3a5FS266*!EDrtmQ>`MPn{-Q;dDE0gMkA9M-mC!AQ{T30K+H@P^?(X@IU z8@$DPs9-);_yL%6<;9!TkZMw*=cRVF+8_B{OyXfuVMJdH5Edw)S1P_ztVo<0_@AxF zm`&dl6@9bmWcA&mqPx{6PtLFM_ph3-|7EZu^;wRq7hg_Ie#X#q-fotUumAXc1H6_A!tlwy6FGmRuLVtMztJ8iY*LcmJ|-nzwR$h-2h`t{sv-MgcVqcX}ZSwN_S8dgcVhNtOymKsp&;jS!Oen}Z= z)k8E4y=NL~21(y}g6*t*e28vl5D(FhzJ4|CmO}mD4eFRG5Wf|U(V!ko7oIIdXW90K z=0M!b%(&BqvVASHPberzkS`0bP2Z82xMv16GI#Qn6rJvX(1M-1D!Rj_#p6tT67f~-9W)~LDmM>AG>sbf+7dg9W(}pG}1n>Vt6UB0V^Cr+c>_({nqTWfrbwTe` zt%aY_JFb4zmqAG-KoR|mGnh5_gX|t#ip?XZE9qzPM>c8Bf(3KrQ!McGyYHT^pHVwd zNbFx*6B-Z{vG?$X>J$8E@K^ix$vx;Vj8!x|BHiGEF-Ebu@F+IrxDrLNIZzavlBwMa z{tKZ`_=c>APDk1f^Nks`V4bh;x&KJ_^Y5wFs}J^Lm2A6`J9zWm z{QSF{7gYNCRxX%F3FCP`KSJoE<-g_+1_1_ui*A6#+#ja|uF=wxhpl1#t^}=#H%`df z^1S>q7A)`m2zdqBHSM6AY}6~_Y2+1*-$Z!@apw9rQUhS7d#JCQKB0`ss^8Y&AV91% zW)TY2do3htna{YikdU;o4xVe%7Mx1XdV2*M0Si*Tv@>Y^+?Zl7ui}`cHF}f)Ifmu|`Lk`^ zwq?#L_1nqP->;guVMVMefu>%aaZ9eUUPi{y4@NV`90k$YC_!|3PeS9O$F*;2Y^eXtxq=ip!rk0KYIBpkmeKU!1p4g7bLV$QCPxn7enI$@$$ z;;68a;30|q-4cd4x-FlW`0C^(Tjre2%04@{-~;(_7u?T!{4f*O?ErR#=i`UW-jN!T zJ$`(4=-e$yJvy5|W4)?J7sp`}e%rD1>VgGVbIU(oKZ#TYVwousst9F_CATMLb_Rat zGRlLiaX54=Yh5c?p0xGTGAU%|PO=gd)r=Dcy69?3O6G^YYs}#8!c<6m){fW_<`H;& zE8QdjPnV#YBIMy}Vg;wqZlAe;J^HWf?Agy349hM?;}*ay|wJz8DE+7G35RM+*x&^+MirB#gcx&$-5i zwfWv|ZE}EraCaFKK|{5$BPniMKm$3e=QY|%2h~SFB8m+GaU94;?Z`L2l`|ugGoBFDo@y)HAom&e;_cuwu%I%df5cZvDoui=}gI&#albK6KiO@z42e z$PX&|^;1pBqwK5mUs^sb%XNHKu=n(_Hp87RZY;Q%l>B1W;zExFK9gcbb?o19Tx?nV z((80NFpk(ry;GWa`SO#8;wF{ z8>`OkMGc=~D1$F_6egBAkztaJwBXJ1jPsf84tH3!FeY!TU?U6-jh)t8Y&FFGK;DW5 zt=KDb=&_Cg2qosv3c=6uX7)8P?!*@X|*4kCTIw`kYHUH$P76D!i;k1k>Xo=BnEbb@${CDpk_n=+DG;XXLA= zJK>)*;1sO4R5&4}v+ALF^&VbQ?0N$P2PK_FS8W^NkEE63$FH0#AFmVI?*G5!$EO{eqO${9_9Sr2(!)Vd8=m69;yov_me)xVOd%JPX1Qb*7)o#E8Xk;_&wocSdD|% zuLrvgMmy;`q}$ViS5f|81g6no6RPyb7uc>kDOx+E-PcaS^BuImCJ7~C^1gk- zTne>s_}#LBjS;>;-23%)4WuLO&=oqNqL@cYogjr3DP8^_+#L8%6ZhzC&9FyrA7>-m zGuL<67z^fjS)O}UzR*^_a2=;JZo?GXw{xc$Tpu8vq92?#-&CKBnx$r%0W;3i>jt9P z)9D8|Uc^5CsUz4AD_1i66_l5f=;@>DIaVZO*z-|BuWfPWlJ6I@5b0*U6Mig(o*xUg zugEX=2y}693GRl2o}X7#$j7l9$C%)(T~@>|7cc!0+_0MZ3)$KX*;4L&fPd2yX0Ek~ zV@k25SZ`+>5p?d2c^5i~Bu%&FKn_r0c}Tot$2Zutm-no`oG{Y)a9@{fwx#|pX*m68 z@4fqntINgFLzgej-1K_Jdn(TXUVc3j4<`jbpEf>ssMFx6;bF71kM_tz_GsNt9q=sd z|BPdtYxvB#d4>B!(RWC^ijFwZsB=B3Xniaq;oZd)B+%N@mQn0Cmcy2+-yS=uZa#L} z{FyM*W_+MsSB*xv@VWNuKK^kNdZ{#$SPMG5vVOg`1T5xdn^qRoD){+j1H^40O!&y9 z2eZvnFRba;a0n`GQR84$wwg2$<_KkW)@v8E+~oKK3{D%6hfcQ$SBr+fD!+H|02_EU z^UdA!tgdtpOj#AO>f`)^Ps{SJEgX$hkghxB2k&XJAC+9X$Rha}3ZG@C=KE%Z52iB| z7vx7}^Ilomre^n9`KM|$zo>D%Dp_5|NdQ(rZX{xJCK{Aob97*c;xvbJOM3+gRrm6L zBma4-!@u;?y!=ns_!~}jsLLL`sPTUEqNMTudsg$)9cA)gbr-M~H6TgqhgWD;uJQV^DRk7gSPG*Q6_tZ_?8caC)i#lACjdSdT=?=NTJ~z%0 zJp>gS+ir;6^!y3Ji4$!tCTDmK3d*{G6E7?MR(@Pi@bSt?D^mk4>a6GOd^Pow{2@-o z47il~+KzeRu)P|K_zix@(f-}Vk+H7NToD2?Li(4;kFH#n|1Rklnh_u@I-TdKpFGCr zodS^}p~~qv8F4as&vY{`E%0cP6o1f;5nj=bd0Uz%_pd|xT>1WnPS4BVZ4lk|?L&fx zLHH0Gn{9T26Fkf!%w~h;TpVE|=$5I@PJBw#MUzUppd@5LK&SN*3u!@&DKpuhC9A`} zg~$lDG;6PKVc3k7$%zHi7Viji%=_fP*xj#Z4$OGx#gH4U>(Suc9}nm3S~zXGo8u%e z=LsI?2TfTjJ*Iey&vFq@F}pCprY&>f@f1l3>-;9I?X-FMlsxaytn82tjXTEYy|X#I zy`Ammz5_eWe^vf{r^ko#*>hn_mV}KTJIZ7FC{@bim&WELdCKW61Yyj-U<|?lCssEW z<9H5DaXR_H@lBJvHTCRZqu;0DZ^@dL3bi+n3(oCN&yVp~RuXHJ!U8_Vgd zLSvqvesbchp=r4)v&Y4%eC!k|q zODE*tHf~~Vj?^;qO&5~RWu=~F!!Qtf+tjwVFsVrUwa{_PtvTZtOz>MXJ^9WFc?*j>vL$fsEO{df2`~09TPGj7 zrkV2SAP%V})uzVg1$1hwj@*&H_;k{~6>|deChc@f4@_7Ikv`Js4MY?zP4019@S+RE z9HUMDG2QQ{M2#&gI8Y!@!#~<(|Baz)B~#0f>F4h&`oC~^{@)PhM+2owoEhstd#HvO z37vZj=MZ!U$CN{PLh-%_`S}lPYJSMed$51Omawob3;4g*XV{cqeqmG2os$p#^0R#4 zOwBsh_TnYheqDw9+og;0@9VHeo(!ij()xf(pa<=?Iok<^=URcr!DN!CddYvk_6y3D zVvxOo5)k4EZ1^S-t$9toMH;O75MKW0l+;mvh2hhRyiYE9zhu>0nd2%8gAk>ZFS4#U2VuT*0lh~@i=03^SNdZ8cWf#F0Fumi`R4!ZajBF z8l&m9oz4TFz2WXk@uDhX?X;OylOwh+%*mNn;_tOIJalE4a9S+>zZGk4rLI~$qr`Xl zx7NuQmIkGd9iI~%x@6*Bx3qwOv~gqR2j!fbyYSrn+~c-wI>c{`$-R~ec~1g0&Vp*K zX}Sn^X7DOd*O{dYcqvJEF5ORVBQBGdvXgA=bE5WMLt~p7`8rFQB=zD+YcgQm;aoF? zlwo+AI2OqxY^kgE;26Fq6I@-%J3 zfB%Kxu=4!^71}QfjxG-kuZYpNUocedR27kUxWK#c4svAFJbvcCkifB5X%QHy4=viL z^W1Aet7&9W)cH~LlL1UvlOQ=HpfJ7 zoa!8%J$~BeXs{XC09_S9SOg^sHOejto3%{5rcGAawy8Px_%<{dVZV@z!BASW5&k@U z%DIU4;!^9Bi#aoP&ug#lc0MQl)SNk|(sRytQ@5YDdq&R1l)avr zA>jpneg)wnnV!N`_jLb&h2zF84De5P$IvTO|K3P-2V9Ygjqi@mw(T)jDcIZe5cmmA zwb;yaDTEfhl5ct5raU8~W@;Pzv^7D+A0Q5^de(~@A}5vKNCmkaBPym7?aQrapUO;F zwwjrp7&~>CLTiEf?UjFf<+}Xl2MdL(&M{eDQ#VFWtBwZ!btENaN4q3gMkF{e8>16Z z@#r^KdF)88V3#W&e}dxMHCBok`}ohNQGZLJ{%Ac+E<#HdURYY*j z@)EXEyIf3{?Oyn~XxTmMgbPI>X|Cf7rbm>7ZDJ?e)KqAH>18qhjlyL&7MW-o4a^p< zX%sy}mP(Q^uTHyLTrTI;axK%)Ri|Xw&keD`~$k>F{bP@m-5q0I3s^>B%%D4W z8s|{VaOd&KV%4{jS~YG6?cG)Z+x7g}{aJcW#rsPzq|_=84Lu)*zNTy&YLzEX7+j6= z)x5k{UwVHA<&n7p?hN?+wFDG}BY(f049ndP!@MQU*!; zU+BfdEHJ?}kvC9H`-6$d?Q9}+=u9y>Q_MR%iRY*{63dSh>m1(Wq&qt6Kao0r4#dgi z#0cQeY4SmwOnzI^s9taU>amOx>l=SXBw_=;_>Avd^Jl3icAW8y?M?hE+EO{Q3v8?O zo#epbuj}4C#2c#f6uxj!>f~>_&^N5Dd`~#59)P;HcoH^Ac<#iXx1#%^S+w#VDv$fQ z!{O(~ZJvlavbM+dZnO-fvz-);#Dlyk7@NV_9lc~`zo-o<1u;FsH?gl%HbnKCxg>j2 zc#oI@ZOsWGe^x@~w+S0&4Bf;s3gkPZW4-Mg<_?~*A@Q56IkWnC&m1LxU63i9Iz>xf zLg>1BfF1!)YL3=ryg70qF+$0bqXgYRryrTd*+#goG?!8p)juvrTf;HQUNW91+4q1ncn?ovBa!z5;x2kEKXvl7>G2~K%{Lv z0WEN1zi=Y$_zOg1Z5w?+#8OVgI3gmRJMrhO9qBn*d5`1Ju5|tX?XwR-}L@{vmsKH6pQDd`12{VSyHyt z56?gI@-MMprDS0%o_|rE&C<|bcRc^9d!8gEOB3<@8-G^Xn~CS&`SWJ8!_p@4OFaL< zpQ~Agv{5w2^Plw0)Iyom7hI0t+5WQGThaoRgg)Pg#@@sG_?9%ELmuGLK7w2} zdk19%lzG_r$gHdhx42tHvY}OdLLg!sTd$X=^&?=8ohl3ke~4t)%=pM zQA!rw0r^D_VV%(9D}el}hnPJ?pT7g-Hyz}%*=L~oUx54$NHyx&%z~v&(sDrl(3Pnc z2BGKs0r?YfUkh7FrKRyg{R_KnB_uc(>@3wKW&F?Fo` zVRV3RQP{NIMgE7~rr6s0e$r{)iy6^t@_cJ-M*9!*i5(i|;vBcoui=WYFJg#2@pph;?K`tYM zKr4JJ-TQPDbakq}gG$!dxlvbV5ZXGAS-Us)5pjFk7>-~Xi-{$GwP|~7l}qA8@5$p+eaEN! zN_A4!E4jtjQj%wR2KAZB(FhD=XZkE#J9*&XrC~k^qj2u3=xlt#iS*24ZvA~{Mf8xz znsgaxAPXg-w~=>wqlBFpkOFYkITLs#!9j{ya+3HKoIVQLoH_Kofjuuo_Ur6wVku`U zB@TuUfUt2Sq3xOOV}ka)6a{UJ2u4MCzW1_q5rYQhg?T5A8ksr;oBN5!3GD$sv%`C^ z>nKEI4#YSR_4dNm+8d4_?0Dmd5?X&U{cM}@0eilCu;0`mpEM8G1^((Y>WnKHMHlB5 z&kXgkDC~T=v-_yPz)?Vm?N)oQUGC(zDj_&!K|-B+ z;<{zd<4QPE$&+)B#p;oY_ET%)h3)LP0V!s71M^KL<~$2XgHy+jxT9Sl|8qyIJB1tL z7x^6tNOg6dKlw;ru@JqNB{IJyTjV41$*NWIkMg_6K428a7Ku7UT^%Dkk|PEgwUo>@ zn#jocj;;#>kN7Pbzig>|?<5<>ES6QVKo-7biF`(WZqJwUI7$Zm9_olj9q_q?Bjp!4 z#ouGAZ{L>hX(nv``$08$OJ9USH26|o)D;w>VGPhZ7fLCL6TZK?>lgK{0QKH-s#BM1uydyc+Mn;m^DD?=i6Sem8$!)EK7mR~KP+-2>J7Ih@CE(M#X(xl0$)9EbEw%%!)6 z;kSt2!j(Ta{oe3WS800J29Mu2{r-PlrD@nfe>{Y3-LOHP&G%DxB9=pKmWC|6LDIL} zy+GFXP{s2^^E!q3ldGn^(A-tS99(Qf{HS!lg-@4$yeB$(&&U6dxAy?6>e$|g&&=NY z9Ka4DSb`z~8U>~ICcXEr2q=mj1w~QpU9l^+Sh1U!s7Z`TZW1-d#F9kQ^(LBPOiVAv za?a*^XZAjDz+-Oi^Sl2qPZ0JyYt~w`rmg8SYd&olI<(=_8Pm>GR-Tzw{pOS@Z_=Jq z&)3wPpL+4(rYYyAPd`89V&~$+UoTwv^`T+I4&nDVhllN+{lVPe zCfU42ckJ#2%e5$@FUhw_v1%-~yVl7D1TXE!e|V}RTl>8spYCrd02k*Fs^bD~Xz$%; z_XRJ7H*81GbN-kc6zmL>>3MAPAn5CyL``#usL|t#hZNIT@dCYLj3ZunxPjhjXi(x< zn8dNr+~aXjmcWgLAn#8guZiY2(oUEx)G>b|LY;_WlYy+qpq_bab8^<^<*&)fSwq?x z|H=o7RR2b-5pgXdqOi1%iu_dkIE-alu*pxEI58!qqJmh1UEZ49+%~{x=B|8q;>34Xl2h^)GV<6<2S)sB$>M(v-)Z=1r;wq41{^kkL+>UI@aWjG zzG?_Z^bs^yjv*rv`_!sS6DMAhN1r-%U?;WSIs9LXm;7slkOBQV5qBY1sN$Lr45wiBr5M`S34t*Ca~d|V(ZKQ6@b6>%yOjgFa(8UrEr9>yPHurGSL96+_E@NI6_?vpP32EdwWY$*gL{O zvRI7=$LB_uSGx!YX+Oiqkc%*i4NdU(`1v;J9g@WTJ;)L|ar``_>!kCfv=#m~$KO`* za=hhw2Qv$77T~i7GGe? zRPngq=9*{aFSrlkTL1Qyx*QFoTS|hw-5(mLIG-xw=E<*Sy7qw-EgikMhwYq8aWgaU3i^;;e~g zv9N*UHRs6bp!WlX4K&1X20RfacyhHqyWoZQ~%_JJ#Cr3aYjQRa0pi$e!;?$_bFGh?x#&V{CM%=@r#1;@NkPb^5aoDW*3 zxdOaVtIP-8K-v&43M|HBLs$xqx0)%k1=ivKi7ms`Wj&oz0}Ykr=mj;G}kbjQ-Wf|$WRo^(5o^+{!>YwX^=DIvq~g)anQr} z=ngd|#e)&U#W`YMML-!_g+@G@aKP}6aCW%xrap+Q-@Y9tyMXzi$#fg&_%J}6tk0+0 z4jqDu7cet41w&D;Vj0`Fhm{kN>ff#u{P;hWlLWsh`nM`8g@7rbx}b>{CyUYeOX)C` z^}nX7V>+&8QpgonmHd*D*l?8nrdtmlG(3~y>zkbH>z7RbO!ia$0z)N}in%H<12Z)@ z0g}ZHjU4)LKeKZ3{{8Z&^iM+@=)V&)RojJ|=)AEOpQ-HeRkp}uKxNz`kJV5+b^ou~ zuw5i`VPZl}x=)yESRCCWWG+sMo1X3+(Kj%e?m<{W;`9u^P!}a^QF44uhG&FpP!gqe zGd4sGj&$o=m^*z#bV!W5Yg&mMU$Y@{aFn}qe%`c=G2t--T+)h=13NH-_LR_uZyNa< zEqBq(MO>3`m(Vz}hh{BGNScx28|D(2M99e*8zMtv-CYWDYc@tkL=AM#U|#h>%)I4F zA}ad#s7-7(>}w$FIC4it-a_{=RidC_CyCh1TQl;bid@6YTZxF%#nMk|tZRr>A`u`z ztH>*wMwGX+Kz;$jX2UMP0hla=0r^#>xqz9sDdOuuelsGNd7CWW2J*X#yoH&!sp4Ni z{s6*e-gaW!UFCMO-Ab(Et83$lnDVDARV zd2}|MeL*u8Jd6?0Vw5yTVTIBdO@9wj4~S1b{0I?~H*O>^Au`n@;!4=D(jKruDUM)^ z`fRxjegk>k+gn~v+|CiVXK#1-MoLSN`_d@}Y;};Wp#507Lcp#?ewe~Wa&>n0lMu<- zPLg!aHsn}4`S)1TO}-UN+O=ENmb8t0zkWl&bkvVJE&N?EW z2E$h{Q&}XwkBu{!+`|~e*%mBy;OPpcKH%zSLqpqo%PUea!k?B#CV98r(Z-idO2d-~ zOHdu0KomZ#VoUg7vUo-vf>gu_sg4W%veU_dmJy2_N5XV@Ls`HpXJV>p-u>!oSbpr3rhNiQ%OQ`?6ml}>eyk4C0p{RoHa~q6^*lc+9V=pU?x=<^RP)nG=NRB z2W&rxx?=lJQY9r$Ia@vI;JEhBcASzOKQ%UXYJB#>_RqGje0Egz*(q|)KS~uS^S7{6 zRma6oW2xGdUv*Z$^uJ9Nn>PwVUa?|>;hbrqvH1rXMC(cX+8w*rUwbPZ|E(zd2da~N z0nd0;tyvHo7#L%ykyrmSl_k{tQ(`S@uoh3Ovmsm;s4aNeV5q^j2BO_zzgedyB>qs+ z&`|Qde0dnDDA89G%Q9&YPEmVQy(Na*)L!`^w`F^BHY*EtEm3$uESEmwD}A2qJQ2pK z{HzooqPn^wzg@WhimiIAzr#it{J>yrGm)2~1>dJ;J*+&}Dx>o_Hjn~f1LKjNt~~4b^rSKIc36Y7V_MnLWD@`V_l8`a{Q4U!ioazx z$dXrQ8B_l6tgLTgmEbI}&IRk`U~S3I9oyrShBEVMi#FEQ3#$lDnA3rA?a~38Uq8#8O^8mW=0uwq<<8l7Okpg4(2{TBF$&S>kGwtaN=O zE15C*Mi0Kg%Kqx2)3K^YvVSZ^-rkYlEh3YOhm`nk4NOW3+`heZ5h0(=vr@lGcm;&OGMN5{H7JB;(8B$o{?wwPLo@|B?Ds-1VhpX3p?m zE3L#mKRahsr(NB~ug?gYHY#kdMc3I0i6ed6rVe#X8as?G44Rx#Jkrh5vQ2jfF)}%J zphNPAK|Kaf%r;!E^2}W1o8wV#W!*-y3J41bg--F%X})ylAEx`(%$G-we0k=~m&(gu znwdVv*Jo^c+E`!Tv2@{tGjr#k9Y6l;{JCexuS%Jpk+C2(Wg-4ehKzK2n@GAYXudIJ zm5H)s>N*$hOm+74b?)QiLvIWA`rAUSZyzUbZzmUTbnE%_HvL#@fnD*4$EN-H7C*iZ znVamd?VGgSrle0=wLK>;cBuG~Y%SQ&2~Ai#+wd#-BPD+*gkx{HXoJ$-maSq$VC!d-q0Q0N8n zk`g=X#3{tyJLBr2#UIuP5X$d&RHu?@V2P)(YW{=^lWues1k8dVJoid(| zL)UC4DI4N+>IFD9cpMns10uO7OJ;U-K-Iod>jspc zchYfNx8ky4V?5)XNVmbmyaGo=P`98bN}g%gvmm->u$%m4udGmq&_VK*q}3yO4H=W3 z>X+bc)8I04YDnf*Rc@!;Aq${ku zW(@8Z6VkQ8rblK(-`MaT$lemoH+TlGEe>CYYBG>u?C4^RGhbdaPEqpi8VSM5aMOaH zufWfVVi69uK=Y19T`T$W-zfb$&V{W6kiU}VjP2iJVCPOQPlP=`t>T5TV_&F9Svao0 zy;~>if%g5zFG#^LzwsxhlhCo@(bZnPJZw99Ik``d3m+RQrIOI{@Wkl@`wnVr>(SF| zT5NcEsMv<|k9o42x4qqf9-+g>Jzp{D#qn-&Puls|+4|Y_i+3CU;-rcf#>o>9Kis2d z@DsM-j_whmv^eiJsP@~h*N8&!G9 zV~dS;Y%dpDF~w!^ai?@b&QAXhE{!fsDD*NgJ%yMd?VPmV1ArM^qu=X3TJY{=_Ux^Kjkw`*g26|qyx ziSlpaNfbji-bLAuX5&}>L$K!#n`6Y2xN7n}eH)>@!KZ>wFs!W@y?3uRXzyPA!2tcU z8|laN(=Dij#~b@gTCl;mo^5zW4eBImUpDl4MY?i7UrX*cYB5#b_=W6B|Amz&OoL^b zocwHY>Jz6zvmJt-Xy0kDb$s;U-7c|xth>ZJq^9hVU9}cF1#Nn^l=SQ?mbz_%Fs$ss zv7LvZdNiuvn~*M|D`XQIe0*VJheJc?{ir*6>pjEOMYZRg7s(grlK8vgbsT=OHhlG` zV7+%QJMWa+cv-R&SK==__Nrhm-z@pKl?-La?A{cyBF(US+WXt{^S8f0ZR)!_3JP|- zJ9X@_vG_l8^|+AHCp^={ilm1}3bwyrUH$Hk{QMp7R#(5jz2Jqh$HtF4J~m|hs&xE9 zsYrzO?YQk&%SXI$klN144<{|z%WjEe)naS;J>uJ8i5nRtztwIb*&t6^iYD*-4Ti&p z!#Ks6O|v%`x)|)iDn^)0kK@kOUVP1;cZt4i)moXfSNaY(K}~&!j}K~&(sg*2Esm*4 z$uEoy@lR^M)jD%#O6uaw-P-QsddC-aE^>~E1n+`^@Dx|A&c;F8r(d65oxPHt9GD+2 z7w5bCPKxviwQMh1^y}s13Oy=>D#1>B5KVF~-lVxYF^8v<(l8r)OGPOZaq>s*s4f-< z4oS8n3)APNCeL4zo|~JVT2LTVMY)d_2FT~!;-i<1DO(=5U_@F*X=z5<2o$+AVG_N; zD^pW9$(j##L=Kfo>Hqn%AUQNDn+HTjmg!WG#Iy8Min5*`wHtF+(NvSJ` z7OhP685-QfVPLn??5q(z203&O9_EK+qzP5@FOy^#`+GaZ*HQZ4=44FHSdf&mAhmF0 zXYJtwmR-twr|0FRr{`epAZ~ftm}SxNZX{6u!RUdJJQ>5&o09PxlF?gf`&rfJtsp8P zduE5Va;zCZ%f^l&lB46F%FfeAwt z5AQ#sYfP4FqBedTw4Z zBKvaZWprHEF)K2ypq*`5PWpo6l!dAJy;jI(Fbh!@Vf`2-trn_2BD-FGsq~iNd&apMXg%p5G|>1l|iWIf&j%k zup`_?huG*S!2d=4Q)&qsl0&1nWoK_2J$hSK*0#|Z1^tqJeN*}s3X{_6hN51i)fEk` zOPfD3!!N_#J;N`36tcg9ZWipIC2y%<7}a^?Z4`<#jtSbBl;Da37Pcb`cpH_8HcPu# zZK%K`dZMwBigK5alVMFQ6{|Cw>0d?}I8yd#O(7;S=wFAmcB68Xwj^(~t;GTPsM?UA zz$FiiR2q|*K@;U}Oo-Z!u==2bnXGyKs>!gk<+icyRIyiQTN>J-Tf4RcI>r{U?3)lA zC<^OEDK=0(gxpF&YkCUN*%=nrHFIAJrey2h?R#2w?dsRFq>^~aqqP$a zul4LgL|Uu0AS5e~yoLsfwF^_|uNb4TV#mCAR3P4ZvOjPSE}GCW36nz)rA9{O9Nr~Z zcAq9p@gEgM7Rg)u!XpC6aKn!J_#E)@6l#Tb-~)dmqQ!eSBt-u6!~*+Xs4_k6=N*^- zVAhn+1yn~xP4g##h8>7JP^cA$BC-=A3tr5x@b+k!-{-dKM?QCtWdRp1qwk>5se)3iZ8 zUazzaN5`zxo@^@vG^TeTluZK=TcQZVL1aJdIwnrYM}BTz=Sl44yC+k6yLSuk)T@tO z`U&}0()Gn*z1_Nn_w3ULWrNIIOvVlGUpUYqETsEzdHq6p(bWF=9>K{2rZOp5@$LvI z%!l){>jHd$UCT;+(5<% zwWVZ=xM;k*L0pKklZOopgSE#Ifz9liw7p8}pm+o1(z9=#JNoRKXP+w?IkISI`6yxX z^|NnY|M%Im*Xvd;T)2A8f(5J4ZkqB!5+BD+$6UnL9Q~rnxHvOx`}L%S-I1_-*!CN= z&Z?8_r1SA3-yG3>dWAL8bmQzzwIC`6(P!ENyxcYIr20N-A|;gNw;S1uak6rGUchiysVTMENEgRdJmgmD6uIXp@~$GZ&UJSzIS zrfWUlDBE60o*^R>lS{`GBqb%6WJg68ll>&GzNmP0+K7zN6Nl^+CWlUl8yFBa$TMVS z@F4fVz=5&jLW0X9q6*te?M5U;j}K8baDmCx`4(4Y3RlrUdHGv19tk3+A(TENmL;T= zj4dv@Ef>>C@~h)^6%5%WOb(d{QIY;W@e_}WD{32E+67c3Bu!#-8$(ggqadNxp+m`s z%@YnKo2SIe-%&sLD{;5jW)Zc2Sw5m&y7I+f8leBcBzB8~M8>#N_RH(2KdzbG&Z8QB zoTjr0yfb zvKObmE=&%a5bGI|77>xwtA_)5X2l1N{iCL)&e);Wj$X*bo|*wnlro>dJ>{l@fvV@! znN24#+rsBWn?>G=n_nKBcVOy}x-84XR%zjpL)^6v3(~U}B)zsZsjMu?JKbFnP)7O> z+cbW`>2cxXBl~-VPfhoYh@6r*bNj-~kdSoOh`vFYT!~5aK2qDo#Lx9ZW6|=|lp>pr z2o4X~I>g`akE8OX{_O(N2jwhG%&jj;96mfTVfb)iQuxf=h?+>^DzCM6>JlY*&aGA<^wOSe z8qOJOps%U3tzL}bWp2b74~M&hd$JOZ@TpO=^*UC)E5? zrnhv06KUR$%_c0AaSE(N_6^;_^6weq=Fu)7%_C<~V(zA5Zagzr1z{@^atVYY=Z^!EQ&xfMqHm&F}8Ja4#q7K>u8kW6&fYEtym%7U%{5EW8~BHIPrmZ z>aQXdp!t>aL6gF1Mq()9M4b@}eFZ}r?-{-$eK>+64xEO?y2oP;Y(_{ojtpu>#ED!V zY`SlX^(&W-`EZUvXF=dJIP0v?7`{W=nKitPG=}exQik{#X&_z4V_~g`$4WukPjLiW zB{-_UQgx_(jw7I#1Qkg_ zO0RPSGhIz7?Z;zbZ=j024n7u0MRF5ziQcE!#-UA7k)?7ld53xeNmY?}Aj>#{nRCu( z9gycalCB~}K<01+lg*q44;0a_NG|wfs>ssD`}9lAVjx*YK8;i9$HWpyHbXQ-F2)v! zHhiL#UwbGQi<-lF4cicnTAS2(m!1`T6%W*O>s(WZ$~v_rn;Q1k*YDl4IVCkUB{?n4 z>Z7;MfBM;5=RaP!Zt>Ff8kl2O-*oW6=H!fw!0XBi@KrJLB^7&F&V(yCJaNF|M~QG-RUE2 z3W4rkwUu4(2y2s_AZmwg9xeP&VyW{_A0R|buv<#kirofuo1NkTABbp%Vu#%-Xxxoo zV!@XnSTAJsJ~4!2-sf=A#Wyt3%QtfKj_MhkdgrCjAgL3GgMaoQFaHp~$qN>i_RE@- zGs|KjI2OSMuYe<37o^|V>#^SVZ~acPJZE8wxJyd+4bDhTPEQYv3-KP9BWxB^=cQ&% z4ND5o$vI->Qyk_rAb5~Z)XY%tfqriN!b|+Z$^xT{+FMwSPAW4>e*+f4)MZQQOuXWB zk|w8fMf$>Y-5!ffub^y)*zklS@&VdYmUHICrLC~?92VKn#XH0yxbMU_EEi6Yf9TOJ zcw%JixL}kR6f}AXLb%&m&F{JpU?pS;+|DeLGAjH-@~JFrTsoWfc~RbJIe+QVKpM$? zPGeN=bF!#xbYzU!qh9`zd}*mP zB(*-ggbZ}x7t}oJbDGSuG}RE)wJv0ZPepN1&W52W(^IUrwU6{pEwb!AGCXcdOvAFU z?DTNg!B2`(u2t{st<%??E)E_Q(bs!kjhA2awAAW7^K!yNa$Lgu1{JFc)FQ1mY~;XF zi#ZJLZ*o@`4ndPxRxwAV%}wwOJJKNQdv_}In7nw$w4m77py0STtH_$n(8a?Dm1p!G zFndb%`q@dL5eW%lVeE+rw63%UGEki=RX1}6$&)KETG&swTP|E?U|Sej({LQ7=m}Gx zpHX%3{coMj*@erKpGX?*e`5xm-LUPvS4;b865OX5KGgI4y zln?Ib6ErEqD=>O`O6I(HN_u5(ow@!@G1>TJl(TVSI=bPmnW-$>!V?oik!@5nO*4z` z#K{frVX-};+(%2EBOj)HXR%G}AJ^0%cc+q6x`kW?8Q&sGw-~OIs|yx@!9vYtx`DF0 z`jGQR7i}T!X!wP8Bv)q7mi2SyfI)5Jvt+k$lus+S@?vXUBA;9v7T+Uy(AwA}vOfR( z$-xWc8`Uu@_m8f+i>N_}I!uY0+ro3qNb5v^CMn5pFjQX z6vUg@_$P_PJDr$0$u*e<`E)>N=m7k*2_4`T8tOJ66r@@5&m=;_ZrtQs|Fhy7W&wE- zZ~fuaTcZ^z!r5(X*U81&q>r~Zd-%o4gyXJ0(NP`yIP?n)^Yn|ZxEt?OSR#nDn|q-9 zz@W6aO7{HOg2p}&@I1Q%Bo})@um)v^#v3)yX@Omzz8x!HEl9bZ96WGP`xmbkjDY`| zM7Pni(si@~OHdH@0Z9OIkt0i0B!=!IPfJ%ovrI)&fZ#d^Aj?%`DBVX_@mMQVqzHUo z;Yghc@&=E!Qbn>5>k>y+J%X%Ok#f3~?&maXRD|jL66d_u1i_9c=(A2mBEh+aBkN6Q zj`LU>nvkvF^95pUY(nF&=xh=xWbyenlRP$-8amsw*pPK3LP#(zHb78pkYAHX zJt-10A!`RXuLQDyJPYawAUlEZaSJY5%fML#S0x8EI_+W#?-I0dPPBtfLR^&)P^@6j zu7LtAsV+dej<~#pXh0!!)Zk!+woa^7cr@PCR+!~cC!F9EL%}16^Wdd}^RQNV%r@#F z-8IW&m4Hzb^uYNB?Pkt{mnX&pCsmjptAvZH9)D`t6(hz}Hm7Bc@PVqwpSl>cdaMz* zD^hT$t%F%9Ys6|!kp&9Hmb}dJw4k?x9&5zIsvdW>Ho|fM^ zkG1MK4wf%F%<@<-V(iIs4puKSOR+(f0)I|tX*Mkz#2n6p>A_A1J*vkBRgXwWapDxb z9&t@2uIUD$Le=BX$E0?nss}W+SZqd9Bz8TTR7DIw-XFfZe8!X-FrXQ(J>2)iswf~&&PA>5y^?sQNq1p3u0P; z2{BRn?tFY91Z1tuj>@jf%BsV!m09!0Bt*rJ9UC8&Fh<|^u|cEwutdjFVOejIige8| z&G7$0O8%!Q73>t73|pYsWN;E}azE|=ko@`o!7!H0Fl|d(8D^4Zwr2kS561a_Z#zj4#z}5^o4GO>=loY#S{ms-Ijt^{ox- z51a?FD<&>o!FU1w{)9*Tj<-Ks@m+(y4$n)oZ_-9;D{PhSiTpuUjljO8Q0X3@Byi#d zO<7n)Q{rgS@0$KCo*xtwGsq)4TEE02n*Tv6Jz`=!JffncwlN-qqN4|~&z8TTTB-Ou zy~$LwLKlVaYm%+dQ@V{b{=mP_NCu&#`L2@MlCjc#@I$wW z@c!afI!L<=-*Arb-7F6d6;EmhF+%$RPim`GG}Gi^L?#HA21P{;!jEB|`p2_QuMC$u zaE#&V&vs^ah{8=Qcxz=4M8kW+_YgUa+|qQ#H+&~}Goxf1GNEyq(L))P{=zIE)$&q= zsab6d+qmNVX(d0IzpCUW3u9Z0N%R}%SEzxM1qzsWLLi$vL9io!=+47$O_klRpFg0` zF$KX$wJm4F=5~KFd?cN&t3!yI3(6{`vh|N|!%+4$VriPragGi1vFX+o1EG{O*TI24 zUAuOZYJ^P5wyR@T&nNPyc603J(!XdD(p@FzlCh0ZqK;+B{X`AX-!Xh(xZ5}ZQwrF| zhbeF7y89UJCMH$6_^eINcsV>JXj*IrHpxA$(O9&VZXR8Z>?@Qir@E-%eN=NFBVFpDXtc&D(mRs`A2?ycK_Jqc+{;lO7=f!gvzt zi+com`2?c?oPjU3RkCMm=Ox(W$6nIJ&Ti$sA?&np5bW%PR6`YAQF+yCcCB~kCo?nq ziS(h|FEjJW&aMR|1+G`I{c1(!6|afq{rc$I>Kb(Iw0#^BGcsJ*4Jcr5dHla*uj_X2 z)<0$6_^|VM=?RSm$``aJSfV6CmSG}YQz?5{SN>Q>E=hC^`|@s(y;1(pG(JRfpMX2X zw`HOmumbw3p!q1pn31!lmKfEZsaaOo-;^M!gh? zyR=Z+tFfephM(^%vcs-67#vTH*>?I_*dl)vcVJJ1t5an76ZCSG!Se}UPy0^VHWu0! zge?sg?JcakdippRyr$604q;KfT|K7M&hV8#g3&(%dv}F>8FsH>qYG{t)e%?he_(&H z%$3|5Bugu;wY`^-MR;Uy*N8m_;^dEnEiaHKeP`58@o?=O73N^@oI)=-_;_};hD>(V z2F}QXeKyk`N3E2Cf~}>luqJyzH&DR+f^mML%+{WqXTG zT|In}vMESeM5L3e$JE*yU-Bdb{0sq+iU78G5W3@)P(RcwB&6y6(nO$?8xIdP+h-$;8ThVaezCjz+TtQeU+Q=4-9G3t)unPA$30B*UweGI7 zsRXMl4S!x~uw3@{5_ox#u3^Z7@|;PCj_p3f&BS~&CfmZ*UeM{zJhpQYis%ZK^WL?y zy_DAR2a)$qYOln~8{RFuhV?PtCL6yHId+*$9 zOBP+5+oB%72$wQjRi#C%!Y4#<9+7QhXNOr#J6!2)qt%&2z2lNE=FR(JNm5eY8m5o% zg;J$aBwBU9bFVF0a&7M3>^1q&+{Bhua176AhQjBVf^wnN3{}42J+N<``ke1rcYF3e(e{#d#r>*RQ~d(c(twa-sy{^Kv!Mt@U|+v)o&s*f%Tf(UbYePI%$$#InG~oQ|Dd z!j(wM28!kYlrt9OjB61P{NSp%m3(Y>< zFPp#RPo%&H=XRPEBHFLj*Zl7!Ns|AA^V`fyqDgDzn8!$BHOpSts6EBZ9WUq__1^lv z*oAgmKS+2_V5jAp!`15m<2y*#$tV?h8Lw-S`?aA5UOoKDC|~bRzvsu+EFRIr22&*6*~)#qAo;oK zEcw6AmXv*{zi1n#6?sO^(ChU=AFjj!Iq&XWz0iwmh!2FwpO}P@Kt*HVdi@}#t(<`f z`kH3AhNVqGF&TNdF-vzleaMLfAyEaXCO)4KO{6(uJKImRO6) zd==JevZZFWZ5-e1K|nFAU_*ZXhJwQN`T6S$Ju^K#GCe)n|F$bh;7AfY;wEmjJ0qVR zi9=&DHmr^yfg=n{$*Fw#9R4IbS=5dB`5OztX1zy-hgXJ&M}`;vpexBMa@4DwzI5eE z!wRsI&&h9qUCgK8hW}TtBrI4yhmm=6B8_G@CiRgd{#Qxb{of};=>1=4PBp6=Z|hd$ z4jpzQ2AXUa7k1VW!+HL1mo8czA-=xss4)6H{;yWs#ZK&G=v)vKoHykA?+Qkg7To@> zurN3{-_V6t2Rc6)60l}{@P{7;uHP6E=-Sucp8inqbnTibT^YF}X^JqONVF%B3_mo-Tx{q;zos^5td7fP zR6*=A5ljw!qjkwNMs+^w8NtR%gm_QFIpv&5 za(AKYB${J5G>LqLLUD#X2Rh~tpj`8i1b&fKj>We-L$L?wsYnyEv%vV2Zy2sSA%~k9ZAbe z^y0rzZ_@4`mvT%eJo@P8&)k z_6*e3y^@<+l~^=>J06C@JPM-P9w(pE?KD*GV<;u3=}AztIP8S`P54d6xuLb}1ZV_a z6h^(V^HJ_w#yw7WB@%Z#dEo{p<$-l~O028s%t?kcDtx<@w7XPUc}f0#>lXR9%T;>| zc6@+~rnVR4@3<1t`8P&!v8w7KX}_iVD$c}jXIE0~D1_Er1zjI> zrM;oR-$@qWeP8$+nTc`|If1nOjXZfZ9tk_qT53tN`)sS;SEar<01Lq3hgA8uOI1~u zNc*k0Kno}Ok3FMmU6>b$=Pl`qKFSLbNToPE1fO+3emUOQ4(SyEl{C@g^^p-!T zmV(BBD-SSK|3qgEu@sc7NyohnggHy>FgJ6OXf?~{MbZ;H_84BGk)PmslM@F0&Yi+W z{TTZD9yTa#$-DL#G6}W z_ilMRi>eezv75GibM|FgQZ*iv3R^&^K-bA5cgZ8^IqJ&Ca=-3x7SeGq}8|OA@Xjyv968~QbZbV-zIy=P(teJy75YPYu zC1AHazE#1}RWRs3i54l9HgE;1%x&YbzBd`Vt?@q)qxx`!KfTV1qpM@4gB zy0h6#W$cVCnU4&f10T$(vDj2IXHLyu=@#egdpdOeE3j*?UWVOzi;Wx|Gh^;|2IWtjk*<1tOT4MdXzuuKp&XJy9&x4xYm67 z5WQLY0aV%f(3(C1vrgvZRts&-;@{xjtb7t`n0hQbgeb{68gwxAr z=_7=0X7NY?b695hM+pUH@n``R*9?8kWBA0HFaJ^;?&UVeC*FMiN(uBsv-F8Vs98Me zG58vBnpye{g0iWob$%UYyL-)~_c`G;es_Lr`tRwd{JP)P_#MI4EdCSyRkH_OkV=o9 zPzUD}o79XKN8@JD|E_@#-EHU~g&Ru#Ls#>6?R>lx{@`_*wR!V{5C2nt^tTPZ8N2<; z(<_*yw>ujbv0459Hl?C8U)VO^@bmv6p(`ec$rJ8v{$D5ZH~O>L%>JGJVh-2Y({OWz zOxN`>csFXc(Cf7124A0PRrqvm$RV@%Alg~u|7a%ZJZKwD7;t0f>B2fs-dTRk^=yqt z(4WlW@pPtHJd48HH^YAz?&3CwFBLq^;&l`o#?A1lr;E+vyVOprwf=94GtAMW6D=`| zcc7=t;$6+_N%~;3pcy^M0ID=Pt@I%g)Vw~`0w&QPO)r^6m7@o(`OKlRS^7Hq&@8@{ z-ZzUMFmE?>qDmv)TJ8n%lvzGk=vA}$C)8}YLMN&XVAbw*q3Y3xK>6N??%lQ6Ld!(^KPe= zWzZe%GK&wQI^G?%ruU$fcSn_m`O-ADk5*I1x+C3RAG=fNOPsea=u&Q`}k#>Yo+VK}E$5VzJgmkW?OnjXdb99M3Z0QD&Ggyur~? zDz!3twE^#O(lBs=*UKc1F-nZ&D7s08f;G{sg?1Yor?LZ=ndT2%zU7*jVD0MY79Qgh znmEHSKeO-1@q#2cctv>m49-uVw*#qJEng(hY3_^xcU6cgJfVhC5gb@YBD@!=9m%!^QenTT$j(PMbtM)Qy)!)U)N_eT6RlGlAHEdNY zR*y3nnHD-aG&3qVImXj@KxgL!Kj9@9XIMc?$yX;-9R$*ppo5cd%t}iDO_W>66eQHqp)(WoJO&@r+Kv* zH=(~tdnh=Q!+SZk+#2~aTze3FqSf@7$h9!)rL)jur+`|X#Uq@5wL(wUH{mxqK1anj zD>&?H((A&$M-@9UoZFqzGrI$4cGo=1v>+agW3+G(C_8x#UPQjH)Nwi-wMA;?;H8(_HsT7 zJ#elMhW?T#=W|81+b~Yw8oxuWZ=4tIy}_K2wAjkg870inj%THLtG ze8fD4YHu{5_daeyn`qId5nt{_aUGcd$#vj3mtEiZomin=4c`_nCa*h(H2(tkde{(m zB$(hzUs%$3TkOU01eJaa=U)Ooft*jaipO$3CEydt>5X_km&+!4!&>yjarQR^&zlXvn|twulC%*6$%Rnov)fyUplvyt5)qQr8s!V)L! zq)7S#r(e@}*jtKxF6W3`M0q`;40UZ&(&*HeiO&gI3KiPCL>tb;z^$7GKM$NLpsBG+IhUj?{Ra~ zIPFcyna1Vckl!R7pqEW6{HCU_f+ID}BVwddvz*JRZ~RrMYr-1vLB1)afT67JsOWE0 zu`KGPn5Lr4lNOqJ=;E5F|4^t~@wnTJ@)DuQyC<6Ce3Oh+IHN?o#&do>Ph}I%cx(S` zlK5~2ul{$)Z2|>bm4HZ7(_zgTt$>>|-H)*Vb!&CL(d=z@%oKFDSD?C&L zsb7GPvBzkM!m?`L;34OUew-T881+p>M^lthM{${)n#*L=z-b|uS&b9@yq6O63eLP_ z=w8iwKTdDN`*M2TGw>e33G}R2#MHBCoq>%4O~UImt?My*9Hup8@tf;0>xWQ}Rn%CI zO=($Ln(J{O?>86^j&t33%gc0DTjZM>#q(k{b0qIi&}K1uO$zT%>Kh-ZZRF1!H@1;z zQ%z=$7=0My&)Y~XZzCDKtAaPTk&SPlZbb4rvzYT^{Sd1&t6Jf#A7VI@(>!0qS_XRNCj0dkX3bnD$wB%u|GeCKrQD|G&8HKa4 zrDi>jQfJQaR5syEBCj(F7p2a?KWH%uR!7H=8+B@?V{}!^`f@QAy!c=-Ejzg|G>ho9egB<6hG)7M*s`yJB9|O51oImO)%E%2(702D6 zKc96F{Zza!$5E!le{=dE6<20EAXgi$%Mx91?g(W>^QQQ3C7f9Dc&)wA8>-hjwDA|w zo7W5GMIz57Rtr)0wF4O{ey2+LlGo0ByuZDg<98J5os634#M=+?2LW8-lRzjE{uXcqa9Im5*?bqabDIT@{s}q39x60(GUw1SW-9Y8BTh7t(*>7Qvzr z$J1DfQ7ax$2d?X81(%=V^nX*zwI84jR7%nHXCb?BJa|lCsHpJxH?Fc{_?y6c>)JNq zUo`e@=54~|-$!@~cnNLATdgVJq1+N>@r7mu=g}aHBg@d5z;{9$IS%uU4XC%v(6$TM zpNZS<8g704HA8W=9z)x+P0mes;oe%eOUOiweD~#RcUxc8d$__AEBx2)(9bOQCXSA)dSypxrZV z&$oN$7P%x!4=oSzE?~EcP229g{t{ zB5v^HIPn#+`rM3pr^k*N9+A@fy<6mk-t$*x_jj9_5nJZ(J27YOi=}1HO`du*v|rrt zEC)H^>#tdoXewDIcqvAtsZc^qB+O+ECD@cN-eqy}!<@7i+o$P8mUSzdaBI2EAh+(f zZplB-svx?rtwREngdaFRmV_o#z;x=v^9`C$VY+)-7zZZ#R57a985-<_aTXzl*5U#m zjO>JwmG6tnHw(uz^Dr)YI&f^%^UUCM90#2#4oQo|dmJ>?idM>E}TSS+kpmQBC z?FwF~5txRBvR|K%d#qYovY|#q}uJ|3yPf2ThLS&RmZ>_d0Fa{FeIw#pTys^1F2GoV0 zPBrf0$KR>w*raNgErZY0oJd zwE;(6+|i>t`FGMzXE@199~jz!;YQ5R=`8+uj9NH%OH^J|c;l@VaveBnxkBUn|<8G3Y zMbtd;PhL$6rts^ehE67_irPjQC}e2Rkjs^ZJ*LaPmhGsv6%L0&qie#S2EEC$uVp*( zGN%V_I*|_?Ls0N%^d`%`z%g~8;HDGM!1r)`9Qc?_7z4);4)pcFO{O@2M{swXVT_o3#DlGa? zKDcFJ;H*&<=jY8kJ&tU7_Q7A&dgIvG+GHqTP7u*xupv%{!{v>WhN=|PtHJG@cr91N znOvg*3;5yf6*_6%t%Y$*hgB`9xU_81r}Kp8g^WdMSu>)N7Uxf&KH;gX?DfM6>axXu zi3`86tvEen=!Vh`R!+~(7=LnN`N`=i;{!t`CE*#QhUl8~)aiqRC#TGOc??t?htz+` zx<0WTYexBqYZjD*=N!%MNyE7eM?Yo&PhV@ivEt%{!&Gn%1su3w$1Ozq4WB(t(u{tCge!+G?U1C&x*ct7KY~X|*^l$JXYpaf>@U zqr#Lh9`j`S`AHotAZ^#eYuj^H8}=Ih5c}yrBR^EE{&(&07iWxpu0l6>!#8t=?EiZ4 zQPN=tE+TVWdZ>-8-BNjV)trmdayE@X0h}QxiOZy0cvJzy%S<2NK1z{i*Ql7hnIsZC z)W?pRiaI07Cx?mUiJ=>o7cNfth%C6hVa=EGmfn+(lIr0(()SU`PD z3TL|FrqHG~$`Qwx*o72q%LdqyOR+jtB^H^Cg}Q+TTYZt5e3{B zHBV>wC)fYpdBU~5!acpk{%za#(?g}HRNQM}_2OYePQ&#H(07!)S<1yD zHv+EFa8$f*SEKGa9jcYm!b0~>PJ}%$G3t{~$en%PRHxOC36LX6^oT`Kp$o^#KYk*% zG2FaKoumoxyfdQg%*v4sRSsPaMOP=JS4Td$CT|vGeOoJt+0poec0Ejm-S*6EY;&NK zjUUu!xy)~g;+gF0?AN6g7D}b_7f)-4WIn%s%&vlqez^lD&h#)$7(%j7t{=BE_p)!6 z`;f{I+mA&319x(d*8j9L=j~_2t`EPhnl-3wcL4)(-#MZJQDbKy-^OBkek-giu(Y#x zQf*k}vBrU5rLom@V&+9t#*U7OB;un{XGo8i3-F}*kjiDT9fS5%Jx46pt&{J`xO)EH z3SHIx=|_4V{DHJz=s)G~MDNr!!^zTt{!8WWKlDB;AC!M(mtsu9gE8wMvlBnL&R$zZ ztEp8pvI~y8Idu}(y_dRa+}Klb(dVWt`*nl<&_%ge+E!6FIK*qeN96cV8^}lO!Fi~i zh~n`)XVy~#M<;^S1J(*Sacg4GZpXTCHeBw)ilD37XuA3+jYSigpRIB$6Ron}_F(PW z2ix##-I|Bb+iy8_Y76`4RNun-f}ukvofuPpe@)*t_v^<#KcT2_NWD;1c5eOV3uR^R zY+nCX+3po<*DfTB)~#7_tY>Ly@yITFq?~=THXe-m|9E>3xTucpah$pL?ydqBIwB&l zz|z~&r1##7NH5ZR?@bWJiiicfqSz~%sL@1|XL>Zo6g4I>#Z;5LB<3YX_s;&#+`Efd zlJ~x!&;Rp(FSvVW=gypIr=K$+2RC%>oiEs}SDc-nKNn^p0nYk;0NhZ;m;)P-nnJlS zpdd$*n|Eq!OC zWxUaI-ts?QG;TdoC5>qfO04&eZl$gF&0T+EG0>j;J#QAx+llnQ+G=`8zjWKX-F;n0 z(}R05t2bxB0VxDjTdjb97S}TzKpJ9);Up^g5XE{=zQjbAx`7V;$hPU>bLef`9`+uZ zo4YkDYilm#TFu&;?VFb78<1udN;%QH9$Y~g^mSQT2z~2;LFU%n?5)`a+vn$Q$vT@5 zn*jfF2{VJS6O>QES^=W2Cz;R4Cewr5hui{@D`L45%bgjZ#R|l%airwRNcrilq4?DB zyOoQ+91dL-=4DeIx@vP=O|kx3Bys4u4mPyBK_HWG>z9U zDyVT%-GNq{_!Nz1%EYiRob?&>_(D$WPk|;5tlCU2cuIl>k)THYW^o-Uq)~Myd;mqV zvQKEN2<@P@;0u_EB&Gu5Cc#`o95kiQklv1)39&18!Ym-~92_}w z5kCz;(#h%5QREsRjFIkloz5#3M7NZe`x}Kguj#X#W1Su26dK}a>czx&8+w`8M=qRi z6KHN^-Zd-@HS(>fXp3I3j85tH&Wv64Qk~24wE@MQ2awGyarN`d)2gJlncZeKK07x= z_Z5q0Ss&;u4j5YDR&!xhOa?4nDh{Q81%L^91Inqqq;Fys#mdzp)8n1DLi7sVdZ}^j zdTH79J-x3~(XWWQE2~-^9a{0-x}==3qV<2QML(?lb3^ILn(Sq@M>DW)#*rGB7(YC~ zs6#)-gnbPFvH?j23C&jQ7C0Ob{0V3Y67$iDbIx66uE!&Lx`%Z`XVpUzOh(_Xzp-ia zt%mZ~musl0+hk@Wi32@53-UU=Dnqrb42l;+PdhY%q70TJtpnP?(5;s3)oy*eUz4IF ziHV8Uw3&A8sgmMTb=r-`>_vk7or<&j2LJ~w8*CKic2(ebawCr72<(-1HbyX3vl zc8_%lgF8%v3j@pg)TwOQhj*_I-)igpQoEu!KQi>~gO)i!{x%HH98E_QGFyZ3Vaw6q zmT>AF3H6fDS|}94ltbTnIGg?zF3_`qzIh@Ca{_(o>5<&0FePMr0DC|LEGXr-jSlsy z-?F-8yGGknjs$&IgMWkzv&`+C{iSY+heyrB%(S#4jpAbpqldHCHnpsc3i+W4Y3rHJ z5Q=6}6!5#>0Gz9ZBH0mg{C)7hP4APB-Ik{MF25D%P%U{Yc- zD)vf9z+ACzh~eNGJSTG-K@ad>?zT*n#$%B*rZDXRE=W|}J!Q(NLjo#yYbIcktZg~j z+x_AQ3W-gKgR{%oE0_{EyTo1rH?4vf(``7r5@NI9t+s=;9simr#IdDO8p$w8o8iHb0=jZP1vPW|l;x9aR7e%MWvXnarP26R+) zYyjI$6@}Ier=%ZQodVmjo*xO9ctb%#{zh^kGG)`o?-sYb*M}?VHsUqk+P610WnFgq zs`-M8qUB%V(z-XgJ1#W}Rnh0m##C|e#`vX4>Fohtb@7YN6~Qv6LjIk5Fcl&aT$lv1 z5e(Nvi`(yjiWD2pmE`N?vfhZr?y%bYEydHR6?6&vW(8_yFRic7^Qntw-Y$A$?V=Y; zJ<2v@CFI-ZRK%+Xcb+M9FB#6vE0O@_#QKX+;KTPq3d2OhjT;9;^t{VUXnWnluh1$C{tIG-&rDq)&8LD`tJ7Gs7Q~9tZH8nZJGhEZgY^X73 zC^5Vz*(9JaGt@Uk$I@)5K7TM4@?ER~M(72>Q8=i4$_{@?B!Em7PP)xx9>(-*^Rx8H*Qdpn#1Y#8HcNDQgX)%*Z*h8e&|2z$Jm>c1cspO zg9btXI+Oqa9oF<8c{|#NZU5x&Iz!UY(ck~JKj5W-EBgeDxqNRf_6)a@MvQ_pv2f+} z1Y`9ZAc~JX(Y9;b{=K z2)!tlZw^Pxi2?|=sgl0xDe1Tlr0wCdk$5{gK1Ic~=T&Q7ro?0G{~U6JMJomxzO?pm znxkt^Qw;klC1GzuKi!aJ;~gNDdW5fPcI8hdr)=OU1q_UF2aZo?riy_7^~1wIw-@9E zEOdLP?Be3nADqS~->j&q$9;Io>-VaI-yN~;+?A7_YoFp-u|4(l)@64Oy;*E?VHK9) ztJ0lz9mm`92PV-?3yyBW#!|QSdc10p3ah5_8BD1xy+wf_uct zLfT+n*p$#fX5jt>5sesC^gxYuM*EFt`^QNw#9ATd(QP@#sAjf*ywu!GE6^$u9=Dsj z&hasHG5e8`u77#s!|BZY|HF!X~3(n6(vVMyN&n62KO!kqJClRt;6qhxakT96N8VCX0@r5hn(lDni>_g^Wu`2J6-}Yfe+0C)2zB0*`Igw7~Esnuml7-w#JKE3s;=gP*$ z%AWhGHU0TbnTY!7-1+g1Wqal?e!m?E1b3zZK2x$d3SHwf&w? z`4QET<`>_gjP=Lx&=4NeACs?19J#ViKY6Ii+q-foMZfyFa^K3Khu@2`?~lSVgG;5cPwr#)^*0bhPrZ_%d4xBa{#>Wa{vrF+MNBhfp} za1;IMEkk8znrinHYmaGER_6C+WbWUvuK2}XSrEPMyUkrp*u$?9<|l>D1Hn(cxegep zutoFd`W0t}`bFwkh*vchu8yM5LhdM9B?i=Bxyu8~BkLjF+_dsa7Zk z{#FYnC2Fw0hKByys=o!aVSk;{-*W!^7X6WzUK&at$;!#9Iavy-CdttK4P~dQGV-!U z(&?J~SBE#hQ&8~s$okh7Zb55?)(#B~4-Jl4R~MEyiZ?O&&n?<;GB)<)hTiA$m`&ow z@`7rTj}Q)^@LdiAm;w&)REZ=9hvSSvfClnP1_G)@41rc zYX0Txa|d26yW-YV(7V`BdwEYms~hE_y+=M2vGT26pTocRu99EWu0BU)gC!?F zWAFoe%2@lbd{yu7hkbhAS{X4UKciiBvg9CCI8=6u3=QWB-vtyZ07b7QWYUa+p=r2F z^&pv-LgxHC&;|c(253i(Lz=R@e}Z1H>mP>?`c%93u0FU%U;O(qRR8_>;Us`0OJ9QF z5hJ`x(gbe=TaNSV;?A><9uW5aii;gDejImVotu4qR(5r9ZS$2Y)Qih67T&m0bG)Eu zc}?A>!S;vP7dTA9>}Y|UDP-;dhskhaN-D=B5ave%P&7dhM2wP(33>(cEJ&4oPfula zE2y7J(`4!~<6~oEw4Ka;9sL&E;nKjViKh_j0bL~+hqX`zcXL@5JPPCdJr{ux~wz`j%@_Fh8% z0rST5+ylC_zBv^a$I}?KaRl!c|35xFiOB@pZ;HUUt!M!2-Vk(C+4J%g)}O z6V{pSwnz=l`x?g>r1de`tO-6ghtYblk5}!+CY;UMngi+_x15eJ_ucg84}Okr@c;jb z_2KPWYvK5SLu?`8Z@}O}Gy$L~C5W16REgb>FXVV1SJ1SQLh>WkQ`8lxFOf<#{g=1u z`8!BlBo2+2w{5%J=xFI`>Ey59y4+tA3iX4!hCDM0tV0?rN<9n`;@$R4vvqLKF6>E< z8g7ksr((!JRiS2cVufj$IWb(W1Cn0f>{+8HXh1;dk;0nW`HH?&>_dJ z2GkMkr8;H%j5(RBqjBG!x3i(g6JQrggdQ1AIRhJ0O2cI-6T&0|otZt-jiK%<=S}j} z1FN={EPpYt>N5WHG_@a18S(1KpWhHduYPb%fN^A8=cVQ0D;|tFZvA3clXOhd|Itpz z;$x+;J? z_HFrtS7X>QWH>wwTb5ugp4H$T78RI@oGp4WyV+)(ZaP6N2W<2j5zfe;LIXq8WPpPp z$0!25FnA5PLwZ#H0w>Tu5xhhIGNN@fHX=1d>zdBiS2tGEGZ5<{6*PSuf$CLH-_F(S z-qt_N-0bvcBZ@*G{jGP)PEE45Ok9xbMwJ7=KHjxeHD1Z9RxM!vMfs$zTAl1tS=;2x z{tLhWeumx+V2FU5As!vzU4r`X8hQ<0OP|=WLly^hNZv^wG{7y(WYL~;eo&}ydH#*; z2XwafSV7f+^rjv0R0WPrOiRmc&I(;%+9cVE1{NNvG44B)S8}p8fAiGng}q(I6&-<+ zig}rUvWDfqp)KH{Boqt*^58IXZTx+axENJQ&Ii{TnWu@*^6 zOFo%3Ygo@!%Wte?YF1oZNpBiry;sp&R=&S#)hdB_@IkC#ocp__e1grCL9L`61c#wz zU^fHEHJQZjtzc{wDiL67sPqp$`~VN*O)soUiVBQ+?M`-oXyi&J5v9vMr;XW;07pCj z%~7pkp{4b*J3b&d4w{o7KSR-6m>^#}uFtE`z`7hdiqm?At# z3FojfrtWybno-Q48zsqpCD5N2)rCIeh6TG%F)VVeI+25jOfL4)cQ#Cjbo40;(UyF1 zW+exGOE!W2d8$G7IqVIvQZf*h3`t=gx{e- zE}-BDzDV8!6&6>n<^xy6lZ^wOo0H0gY9%ib=P_tSFo(3lfHc9ia*=NZ%1LqnA*0T_ ze!$y@$unx^o=Mn5nc!QY5VEI}c2ePY;x!>8!PxL@2hVSE?Yfh8AuQ+~*Di<@0%xw? zH7Muoj^r9=P6$`7vqIniibzVhIg@bzS{ymQB(-Sqx%QmwRp;w2G!^ZTx*sTRK3j^0 zn1F{Dy4%~kCx5OwmlYNs5t?-l-~k5~fdR4kGQsl!9<>tr9Y~)-6T7F#7Br@`iWPww zX4=(UWDnf75U7wQ@ZzAk2FowF8xa>ENHS|gAy^B6R3;Mqc5Y^D_0ov`o88?v`y-ZC z$Id*bQ@-={+6(xjg9nlIh3eOLRz65PPlu0UtyP3xXzuTpbwP~z9{t41;I z68E^-_^oK_Ka?fh5CDIK!J(Uze|_<#|HR3bq3e+Qmrwl+N+f7n1PmfM#ia44IshR~ z2bG>@3eT|bQpV87>-aUpI1hOATYlDs8CW`^>}3re^npTMD#A5<1`N4_2}P>m(G zz4Cc5z)-2j)o%uMQX`-cMWmMMdI-ZHsG}aIaHz$CpcX(K>nTS5CzPiGVw>!kvv(SVHKJk6dem`f*%4 zD;|qnBjtSiD;|qngK|D{O?8C|AGyXyqLKPxigx%&G&o`qaYo9yexd&4h_g0=>Y%&wq;C}_=X8Cw$47kL;v;AzoXy>V7kG>w2BA1 z&K@-PY~{H3fenQjRau(IkYFF9&LR zkSnK1{Ym9{@)mgr-wvb2weuslSc58;`F3EjCY1}nS9x=y+>xvQv!Y)=_yp@Ec%i%v zOshHX`0_YOL#s7FBFZM*b<=v~vzrQvYT( zb8BmJ;eKl6rv_NZ^AD7j9w52vH-fePeX!OO$^ffE$RN=?fJL5=JvYv7Am;t$6vl1h zXTq$M4cU&*y%D&PfF$!-yI? zfatYpyDD5VJPOZrcAYCO&ng}zdRt&WAQnF!sFV(Iu*^d=@RxwtB(9(r0A`IiufY|> z5MDwL;}1)=qBHC!-{63HGqd`DAb)lfdVX^S{+Je`$cM-828YvITq7b}x6q-XcbRzn zyzBw+QLx5vt2ya{#JR*K9~~`jb#-Yi8KwN#m(k1AAUkYo zNfooT=-)ec!rHA+snHUunzcXS&L@ zS3pm8_KN5rU*Djeq65m1Bo0$#3x*)spOE2CHrdeKXXz1LZLce!?{9Iie%

=(yz@O*K8Sz}a-+D&3^4H!)XVVw(P>=y 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

OJ)!Mu2Jj%&%&dtjL^Az;l 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 b^5@1|uUP)vxII7qJ6`+6U;g52f5-m=1yuBB literal 0 HcmV?d00001 diff --git a/web/static/apps/sim/index.js b/web/static/apps/sim/index.js new file mode 100644 index 0000000..9f76b4b --- /dev/null +++ b/web/static/apps/sim/index.js @@ -0,0 +1,10187 @@ +// include: shell.js +// include: minimum_runtime_check.js +(function() { + // "30.0.0" -> 300000 + function humanReadableVersionToPacked(str) { + str = str.split('-')[0]; // Remove any trailing part from e.g. "12.53.3-alpha" + var vers = str.split('.').slice(0, 3); + while(vers.length < 3) vers.push('00'); + vers = vers.map((n, i, arr) => n.padStart(2, '0')); + return vers.join(''); + } + // 300000 -> "30.0.0" + var packedVersionToHumanReadable = n => [n / 10000 | 0, (n / 100 | 0) % 100, n % 100].join('.'); + + var TARGET_NOT_SUPPORTED = 2147483647; + + // Note: We use a typeof check here instead of optional chaining using + // globalThis because older browsers might not have globalThis defined. + var currentNodeVersion = typeof process !== 'undefined' && process.versions?.node ? humanReadableVersionToPacked(process.versions.node) : TARGET_NOT_SUPPORTED; + if (currentNodeVersion < 180300) { + throw new Error(`This emscripten-generated code requires node v${ packedVersionToHumanReadable(180300) } (detected v${packedVersionToHumanReadable(currentNodeVersion)})`); + } + + var userAgent = typeof navigator !== 'undefined' && navigator.userAgent; + if (!userAgent) { + return; + } + + var currentSafariVersion = userAgent.includes("Safari/") && !userAgent.includes("Chrome/") && userAgent.match(/Version\/(\d+\.?\d*\.?\d*)/) ? humanReadableVersionToPacked(userAgent.match(/Version\/(\d+\.?\d*\.?\d*)/)[1]) : TARGET_NOT_SUPPORTED; + if (currentSafariVersion < 150000) { + throw new Error(`This emscripten-generated code requires Safari v${ packedVersionToHumanReadable(150000) } (detected v${currentSafariVersion})`); + } + + var currentFirefoxVersion = userAgent.match(/Firefox\/(\d+(?:\.\d+)?)/) ? parseFloat(userAgent.match(/Firefox\/(\d+(?:\.\d+)?)/)[1]) : TARGET_NOT_SUPPORTED; + if (currentFirefoxVersion < 79) { + throw new Error(`This emscripten-generated code requires Firefox v79 (detected v${currentFirefoxVersion})`); + } + + var currentChromeVersion = userAgent.match(/Chrome\/(\d+(?:\.\d+)?)/) ? parseFloat(userAgent.match(/Chrome\/(\d+(?:\.\d+)?)/)[1]) : TARGET_NOT_SUPPORTED; + if (currentChromeVersion < 85) { + throw new Error(`This emscripten-generated code requires Chrome v85 (detected v${currentChromeVersion})`); + } +})(); + +// end include: minimum_runtime_check.js +// The Module object: Our interface to the outside world. We import +// and export values on it. There are various ways Module can be used: +// 1. Not defined. We create it here +// 2. A function parameter, function(moduleArg) => Promise +// 3. pre-run appended it, var Module = {}; ..generated code.. +// 4. External script tag defines var Module. +// We need to check if Module already exists (e.g. case 3 above). +// Substitution will be replaced with actual code on later stage of the build, +// this way Closure Compiler will not mangle it (e.g. case 4. above). +// Note that if you want to run closure, and also to use Module +// after the generated code, you will need to define var Module = {}; +// before the code. Then that object will be used in the code, and you +// can continue to use Module afterwards as well. +var Module = typeof Module != 'undefined' ? Module : {}; + +// Determine the runtime environment we are in. You can customize this by +// setting the ENVIRONMENT setting at compile time (see settings.js). + +// Attempt to auto-detect the environment +var ENVIRONMENT_IS_WEB = !!globalThis.window; +var ENVIRONMENT_IS_WORKER = !!globalThis.WorkerGlobalScope; +// N.b. Electron.js environment is simultaneously a NODE-environment, but +// also a web environment. +var ENVIRONMENT_IS_NODE = globalThis.process?.versions?.node && globalThis.process?.type != 'renderer'; +var ENVIRONMENT_IS_SHELL = !ENVIRONMENT_IS_WEB && !ENVIRONMENT_IS_NODE && !ENVIRONMENT_IS_WORKER; + +// --pre-jses are emitted after the Module integration code, so that they can +// refer to Module (if they choose; they can also define Module) +// include: /tmp/tmp_t_pv4ze.js + + if (!Module['expectedDataFileDownloads']) Module['expectedDataFileDownloads'] = 0; + Module['expectedDataFileDownloads']++; + (() => { + // Do not attempt to redownload the virtual filesystem data when in a pthread or a Wasm Worker context. + var isPthread = typeof ENVIRONMENT_IS_PTHREAD != 'undefined' && ENVIRONMENT_IS_PTHREAD; + var isWasmWorker = typeof ENVIRONMENT_IS_WASM_WORKER != 'undefined' && ENVIRONMENT_IS_WASM_WORKER; + if (isPthread || isWasmWorker) return; + var isNode = globalThis.process && globalThis.process.versions && globalThis.process.versions.node && globalThis.process.type != 'renderer'; + async function loadPackage(metadata) { + + var PACKAGE_PATH = ''; + if (typeof window === 'object') { + PACKAGE_PATH = window['encodeURIComponent'](window.location.pathname.substring(0, window.location.pathname.lastIndexOf('/')) + '/'); + } else if (typeof process === 'undefined' && typeof location !== 'undefined') { + // web worker + PACKAGE_PATH = encodeURIComponent(location.pathname.substring(0, location.pathname.lastIndexOf('/')) + '/'); + } + var PACKAGE_NAME = 'build/web/index.data'; + var REMOTE_PACKAGE_BASE = '/web/static/apps/sim/index.data'; + var REMOTE_PACKAGE_NAME = Module['locateFile'] ? Module['locateFile'](REMOTE_PACKAGE_BASE, '') : REMOTE_PACKAGE_BASE; + var REMOTE_PACKAGE_SIZE = metadata['remote_package_size']; + + async function fetchRemotePackage(packageName, packageSize) { + if (isNode) { + var contents = require('fs').readFileSync(packageName); + return new Uint8Array(contents).buffer; + } + if (!Module['dataFileDownloads']) Module['dataFileDownloads'] = {}; + try { + var response = await fetch(packageName); + } catch (e) { + throw new Error(`Network Error: ${packageName}`, {e}); + } + if (!response.ok) { + throw new Error(`${response.status}: ${response.url}`); + } + + const chunks = []; + const headers = response.headers; + const total = Number(headers.get('Content-Length') || packageSize); + let loaded = 0; + + Module['setStatus'] && Module['setStatus']('Downloading data...'); + const reader = response.body.getReader(); + + while (1) { + var {done, value} = await reader.read(); + if (done) break; + chunks.push(value); + loaded += value.length; + Module['dataFileDownloads'][packageName] = {loaded, total}; + + let totalLoaded = 0; + let totalSize = 0; + + for (const download of Object.values(Module['dataFileDownloads'])) { + totalLoaded += download.loaded; + totalSize += download.total; + } + + Module['setStatus'] && Module['setStatus'](`Downloading data... (${totalLoaded}/${totalSize})`); + } + + const packageData = new Uint8Array(chunks.map((c) => c.length).reduce((a, b) => a + b, 0)); + let offset = 0; + for (const chunk of chunks) { + packageData.set(chunk, offset); + offset += chunk.length; + } + return packageData.buffer; + } + + var fetchPromise; + var fetched = Module['getPreloadedPackage'] && Module['getPreloadedPackage'](REMOTE_PACKAGE_NAME, REMOTE_PACKAGE_SIZE); + + if (!fetched) { + // Note that we don't use await here because we want to execute the + // the rest of this function immediately. + fetchPromise = fetchRemotePackage(REMOTE_PACKAGE_NAME, REMOTE_PACKAGE_SIZE); + } + + async function runWithFS(Module) { + + function assert(check, msg) { + if (!check) throw new Error(msg); + } +Module['FS_createPath']("/", "assets", true, true); +Module['FS_createPath']("/assets", "fonts", true, true); +Module['FS_createPath']("/assets", "raygui_styles", true, true); +Module['FS_createPath']("/assets", "sounds", true, true); +Module['FS_createPath']("/assets", "test_roms", true, true); + + for (var file of metadata['files']) { + var name = file['filename'] + Module['addRunDependency'](`fp ${name}`); + } + + async function processPackageData(arrayBuffer) { + assert(arrayBuffer, 'Loading data file failed.'); + assert(arrayBuffer.constructor.name === ArrayBuffer.name, 'bad input to processPackageData ' + arrayBuffer.constructor.name); + var byteArray = new Uint8Array(arrayBuffer); + var curr; + // Reuse the bytearray from the XHR as the source for file reads. + for (var file of metadata['files']) { + var name = file['filename']; + var data = byteArray.subarray(file['start'], file['end']); + // canOwn this data in the filesystem, it is a slice into the heap that will never change + Module['FS_createDataFile'](name, null, data, true, true, true); + Module['removeRunDependency'](`fp ${name}`); + } + Module['removeRunDependency']('datafile_build/web/index.data'); + } + Module['addRunDependency']('datafile_build/web/index.data'); + + if (!Module['preloadResults']) Module['preloadResults'] = {}; + + Module['preloadResults'][PACKAGE_NAME] = {fromCache: false}; + if (!fetched) { + fetched = await fetchPromise; + } + processPackageData(fetched); + + } + if (Module['calledRun']) { + runWithFS(Module); + } else { + if (!Module['preRun']) Module['preRun'] = []; + Module['preRun'].push(runWithFS); // FS is not initialized yet, wait for it + } + + } + loadPackage({"files": [{"filename": "/assets/fonts/Inter_18pt-Regular.ttf", "start": 0, "end": 342680}, {"filename": "/assets/raygui_styles/dark.rgs", "start": 342680, "end": 346410}, {"filename": "/assets/raygui_styles/genesis.rgs", "start": 346410, "end": 346610}, {"filename": "/assets/sounds/beep.wav", "start": 346610, "end": 468800}, {"filename": "/assets/test_roms/1-chip8-logo.ch8", "start": 468800, "end": 469060}, {"filename": "/assets/test_roms/2-ibm-logo.ch8", "start": 469060, "end": 469192}, {"filename": "/assets/test_roms/3-corax+.ch8", "start": 469192, "end": 469953}, {"filename": "/assets/test_roms/4-flags.ch8", "start": 469953, "end": 470994}, {"filename": "/assets/test_roms/5-quirks.ch8", "start": 470994, "end": 474226}, {"filename": "/assets/test_roms/6-keypad.ch8", "start": 474226, "end": 475139}, {"filename": "/assets/test_roms/7-beep.ch8", "start": 475139, "end": 475249}], "remote_package_size": 475249}); + + })(); + +// end include: /tmp/tmp_t_pv4ze.js +// include: /tmp/tmp023ek5yw.js + + // All the pre-js content up to here must remain later on, we need to run + // it. + if ((typeof ENVIRONMENT_IS_WASM_WORKER != 'undefined' && ENVIRONMENT_IS_WASM_WORKER) || (typeof ENVIRONMENT_IS_PTHREAD != 'undefined' && ENVIRONMENT_IS_PTHREAD) || (typeof ENVIRONMENT_IS_AUDIO_WORKLET != 'undefined' && ENVIRONMENT_IS_AUDIO_WORKLET)) Module['preRun'] = []; + var necessaryPreJSTasks = Module['preRun'].slice(); + // end include: /tmp/tmp023ek5yw.js +// include: /tmp/tmpge_u0ky8.js + + if (!Module['preRun']) throw 'Module.preRun should exist because file support used it; did a pre-js delete it?'; + necessaryPreJSTasks.forEach((task) => { + if (Module['preRun'].indexOf(task) < 0) throw 'All preRun tasks that exist before user pre-js code should remain after; did you replace Module or modify Module.preRun?'; + }); + // end include: /tmp/tmpge_u0ky8.js + + +var programArgs = []; +var thisProgram = './this.program'; +var quit_ = (status, toThrow) => { + throw toThrow; +}; + +// In MODULARIZE mode _scriptName needs to be captured already at the very top of the page immediately when the page is parsed, so it is generated there +// before the page load. In non-MODULARIZE modes generate it here. +var _scriptName = globalThis.document?.currentScript?.src; + +if (typeof __filename != 'undefined') { // Node + _scriptName = __filename; +} else +if (ENVIRONMENT_IS_WORKER) { + _scriptName = self.location.href; +} + +// `/` should be present at the end if `scriptDirectory` is not empty +var scriptDirectory = ''; +function locateFile(path) { + if (Module['locateFile']) { + return Module['locateFile'](path, scriptDirectory); + } + return scriptDirectory + path; +} + +// Hooks that are implemented differently in different runtime environments. +var readAsync, readBinary; + +if (ENVIRONMENT_IS_NODE) { + const isNode = globalThis.process?.versions?.node && globalThis.process?.type != 'renderer'; + if (!isNode) throw new Error('not compiled for this environment (did you build to HTML and try to run it not on the web, or set ENVIRONMENT to something - like node - and run it someplace else - like on the web?)'); + + // These modules will usually be used on Node.js. Load them eagerly to avoid + // the complexity of lazy-loading. + var fs = require('node:fs'); + + scriptDirectory = __dirname + '/'; + +// include: node_shell_read.js +readBinary = (filename) => { + // We need to re-wrap `file://` strings to URLs. + filename = isFileURI(filename) ? new URL(filename) : filename; + var ret = fs.readFileSync(filename); + assert(Buffer.isBuffer(ret)); + return ret; +}; + +readAsync = async (filename, binary = true) => { + // See the comment in the `readBinary` function. + filename = isFileURI(filename) ? new URL(filename) : filename; + var ret = fs.readFileSync(filename, binary ? undefined : 'utf8'); + assert(binary ? Buffer.isBuffer(ret) : typeof ret == 'string'); + return ret; +}; +// end include: node_shell_read.js + if (process.argv.length > 1) { + thisProgram = process.argv[1].replace(/\\/g, '/'); + } + + programArgs = process.argv.slice(2); + + // MODULARIZE will export the module in the proper place outside, we don't need to export here + if (typeof module != 'undefined') { + module['exports'] = Module; + } + + quit_ = (status, toThrow) => { + process.exitCode = status; + throw toThrow; + }; + +} else +if (ENVIRONMENT_IS_SHELL) { + +} else + +// Note that this includes Node.js workers when relevant (pthreads is enabled). +// Node.js workers are detected as a combination of ENVIRONMENT_IS_WORKER and +// ENVIRONMENT_IS_NODE. +if (ENVIRONMENT_IS_WEB || ENVIRONMENT_IS_WORKER) { + try { + scriptDirectory = new URL('.', _scriptName).href; // includes trailing slash + } catch { + // Must be a `blob:` or `data:` URL (e.g. `blob:http://site.com/etc/etc`), we cannot + // infer anything from them. + } + + if (!(globalThis.window || globalThis.WorkerGlobalScope)) throw new Error('not compiled for this environment (did you build to HTML and try to run it not on the web, or set ENVIRONMENT to something - like node - and run it someplace else - like on the web?)'); + + { +// include: web_or_worker_shell_read.js +if (ENVIRONMENT_IS_WORKER) { + readBinary = (url) => { + var xhr = new XMLHttpRequest(); + xhr.open('GET', url, false); + xhr.responseType = 'arraybuffer'; + xhr.send(null); + return new Uint8Array(/** @type{!ArrayBuffer} */(xhr.response)); + }; + } + + readAsync = async (url) => { + // Fetch has some additional restrictions over XHR, like it can't be used on a file:// url. + // See https://github.com/github/fetch/pull/92#issuecomment-140665932 + // Cordova or Electron apps are typically loaded from a file:// url. + // So use XHR on webview if URL is a file URL. + if (isFileURI(url)) { + return new Promise((resolve, reject) => { + var xhr = new XMLHttpRequest(); + xhr.open('GET', url, true); + xhr.responseType = 'arraybuffer'; + xhr.onload = () => { + if (xhr.status == 200 || (xhr.status == 0 && xhr.response)) { // file URLs can return 0 + resolve(xhr.response); + return; + } + reject(xhr.status); + }; + xhr.onerror = reject; + xhr.send(null); + }); + } + var response = await fetch(url, { credentials: 'same-origin' }); + if (response.ok) { + return response.arrayBuffer(); + } + throw new Error(response.status + ' : ' + response.url); + }; +// end include: web_or_worker_shell_read.js + } +} else +{ + throw new Error('environment detection error'); +} + +var out = console.log.bind(console); +var err = console.error.bind(console); + +var IDBFS = 'IDBFS is no longer included by default; build with -lidbfs.js'; +var PROXYFS = 'PROXYFS is no longer included by default; build with -lproxyfs.js'; +var WORKERFS = 'WORKERFS is no longer included by default; build with -lworkerfs.js'; +var FETCHFS = 'FETCHFS is no longer included by default; build with -lfetchfs.js'; +var ICASEFS = 'ICASEFS is no longer included by default; build with -licasefs.js'; +var JSFILEFS = 'JSFILEFS is no longer included by default; build with -ljsfilefs.js'; +var OPFS = 'OPFS is no longer included by default; build with -lopfs.js'; + +var NODEFS = 'NODEFS is no longer included by default; build with -lnodefs.js'; + +// perform assertions in shell.js after we set up out() and err(), as otherwise +// if an assertion fails it cannot print the message + +assert(!ENVIRONMENT_IS_SHELL, 'shell environment detected but not enabled at build time (add `shell` to `-sENVIRONMENT` to enable)'); + +// end include: shell.js + +// include: preamble.js +// === Preamble library stuff === + +// Documentation for the public APIs defined in this file must be updated in: +// site/source/docs/api_reference/preamble.js.rst +// A prebuilt local version of the documentation is available at: +// site/build/text/docs/api_reference/preamble.js.txt +// You can also build docs locally as HTML or other formats in site/ +// An online HTML version (which may be of a different version of Emscripten) +// is up at http://kripken.github.io/emscripten-site/docs/api_reference/preamble.js.html + +var wasmBinary; + +if (!globalThis.WebAssembly) { + err('no native wasm support detected'); +} + +// Wasm globals + +//======================================== +// Runtime essentials +//======================================== + +// whether we are quitting the application. no code should run after this. +// set in exit() and abort() +var ABORT = false; + +// set by exit() and abort(). Passed to 'onExit' handler. +// NOTE: This is also used as the process return code in shell environments +// but only when noExitRuntime is false. +var EXITSTATUS; + +// In STRICT mode, we only define assert() when ASSERTIONS is set. i.e. we +// don't define it at all in release modes. This matches the behaviour of +// MINIMAL_RUNTIME. +// TODO(sbc): Make this the default even without STRICT enabled. +/** @type {function(*, string=)} */ +function assert(condition, text) { + if (!condition) { + abort('Assertion failed' + (text ? ': ' + text : '')); + } +} + +// We used to include malloc/free by default in the past. Show a helpful error in +// builds with assertions. + +/** + * Indicates whether filename is delivered via file protocol (as opposed to http/https) + * @noinline + */ +var isFileURI = (filename) => filename.startsWith('file://'); + +// include: runtime_common.js +// include: runtime_stack_check.js +// Initializes the stack cookie. Called at the startup of main and at the startup of each thread in pthreads mode. +function writeStackCookie() { + var max = _emscripten_stack_get_end(); + assert((max & 3) == 0); + // If the stack ends at address zero we write our cookies 4 bytes into the + // stack. This prevents interference with SAFE_HEAP and ASAN which also + // monitor writes to address zero. + if (max == 0) { + max += 4; + } + // The stack grow downwards towards _emscripten_stack_get_end. + // We write cookies to the final two words in the stack and detect if they are + // ever overwritten. + HEAPU32[((max)>>2)] = 0x02135467; + HEAPU32[(((max)+(4))>>2)] = 0x89BACDFE; + // Also test the global address 0 for integrity. + HEAPU32[((0)>>2)] = 1668509029; +} + +function checkStackCookie() { + if (ABORT) return; + var max = _emscripten_stack_get_end(); + // See writeStackCookie(). + if (max == 0) { + max += 4; + } + var cookie1 = HEAPU32[((max)>>2)]; + var cookie2 = HEAPU32[(((max)+(4))>>2)]; + if (cookie1 != 0x02135467 || cookie2 != 0x89BACDFE) { + abort(`Stack overflow! Stack cookie has been overwritten at ${ptrToString(max)}, expected hex dwords 0x89BACDFE and 0x2135467, but received ${ptrToString(cookie2)} ${ptrToString(cookie1)}`); + } + // Also test the global address 0 for integrity. + if (HEAPU32[((0)>>2)] != 0x63736d65 /* 'emsc' */) { + abort('Runtime error: The application has corrupted its heap memory area (address zero)!'); + } +} +// end include: runtime_stack_check.js +// include: runtime_exceptions.js +// Base Emscripten EH error class +class EmscriptenEH {} + +class EmscriptenSjLj extends EmscriptenEH {} + +// end include: runtime_exceptions.js +// include: runtime_debug.js +var runtimeDebug = true; // Switch to false at runtime to disable logging at the right times + +// Used by XXXXX_DEBUG settings to output debug messages. +function dbg(...args) { + if (!runtimeDebug && typeof runtimeDebug != 'undefined') return; + // TODO(sbc): Make this configurable somehow. Its not always convenient for + // logging to show up as warnings. + console.warn(...args); +} + +// Endianness check +(() => { + var h16 = new Int16Array(1); + var h8 = new Int8Array(h16.buffer); + h16[0] = 0x6373; + if (h8[0] !== 0x73 || h8[1] !== 0x63) abort('Runtime error: expected the system to be little-endian! (Run with -sSUPPORT_BIG_ENDIAN to bypass)'); +})(); + +function consumedModuleProp(prop) { + if (!Object.getOwnPropertyDescriptor(Module, prop)) { + Object.defineProperty(Module, prop, { + configurable: true, + set() { + abort(`Attempt to set \`Module.${prop}\` after it has already been processed. This can happen, for example, when code is injected via '--post-js' rather than '--pre-js'`); + + } + }); + } +} + +function makeInvalidEarlyAccess(name) { + return () => assert(false, `call to '${name}' via reference taken before Wasm module initialization`); + +} + +function ignoredModuleProp(prop) { + if (Object.getOwnPropertyDescriptor(Module, prop)) { + abort(`\`Module.${prop}\` was supplied but \`${prop}\` not included in INCOMING_MODULE_JS_API`); + } +} + +// forcing the filesystem exports a few things by default +function isExportedByForceFilesystem(name) { + return name === 'FS_createPath' || + name === 'FS_createDataFile' || + name === 'FS_createPreloadedFile' || + name === 'FS_preloadFile' || + name === 'FS_unlink' || + name === 'addRunDependency' || + // The old FS has some functionality that WasmFS lacks. + name === 'FS_createLazyFile' || + name === 'FS_createDevice' || + name === 'removeRunDependency'; +} + +/** + * Intercept access to a symbols in the global symbol. This enables us to give + * informative warnings/errors when folks attempt to use symbols they did not + * include in their build, or no symbols that no longer exist. + * + * We don't define this in MODULARIZE mode since in that mode emscripten symbols + * are never placed in the global scope. + */ +function hookGlobalSymbolAccess(sym, func) { + if (!Object.getOwnPropertyDescriptor(globalThis, sym)) { + Object.defineProperty(globalThis, sym, { + configurable: true, + get() { + func(); + return undefined; + } + }); + } +} + +function missingGlobal(sym, msg) { + hookGlobalSymbolAccess(sym, () => { + warnOnce(`\`${sym}\` is no longer defined by emscripten. ${msg}`); + }); +} + +missingGlobal('buffer', 'Please use HEAP8.buffer or wasmMemory.buffer'); +missingGlobal('asm', 'Please use wasmExports instead'); + +function missingLibrarySymbol(sym) { + hookGlobalSymbolAccess(sym, () => { + // Can't `abort()` here because it would break code that does runtime + // checks. e.g. `if (typeof SDL === 'undefined')`. + var msg = `\`${sym}\` is a library symbol and not included by default; add it to your library.js __deps or to DEFAULT_LIBRARY_FUNCS_TO_INCLUDE on the command line`; + // DEFAULT_LIBRARY_FUNCS_TO_INCLUDE requires the name as it appears in + // library.js, which means $name for a JS name with no prefix, or name + // for a JS name like _name. + var librarySymbol = sym; + if (!librarySymbol.startsWith('_')) { + librarySymbol = '$' + sym; + } + msg += ` (e.g. -sDEFAULT_LIBRARY_FUNCS_TO_INCLUDE='${librarySymbol}')`; + if (isExportedByForceFilesystem(sym)) { + msg += '. Alternatively, forcing filesystem support (-sFORCE_FILESYSTEM) can export this for you'; + } + warnOnce(msg); + }); + + // Any symbol that is not included from the JS library is also (by definition) + // not exported on the Module object. + unexportedRuntimeSymbol(sym); +} + +function unexportedRuntimeSymbol(sym) { + if (!Object.getOwnPropertyDescriptor(Module, sym)) { + Object.defineProperty(Module, sym, { + configurable: true, + get() { + var msg = `'${sym}' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the Emscripten FAQ)`; + if (isExportedByForceFilesystem(sym)) { + msg += '. Alternatively, forcing filesystem support (-sFORCE_FILESYSTEM) can export this for you'; + } + abort(msg); + }, + }); + } +} + +// end include: runtime_debug.js +// Memory management + +var runtimeInitialized = false; + + + +function updateMemoryViews() { + var b = wasmMemory.buffer; + HEAP8 = new Int8Array(b); + HEAP16 = new Int16Array(b); + HEAPU8 = new Uint8Array(b); + HEAPU16 = new Uint16Array(b); + HEAP32 = new Int32Array(b); + HEAPU32 = new Uint32Array(b); + Module['HEAPF32'] = HEAPF32 = new Float32Array(b); + HEAPF64 = new Float64Array(b); + HEAP64 = new BigInt64Array(b); + HEAPU64 = new BigUint64Array(b); +} + +// include: memoryprofiler.js +// end include: memoryprofiler.js +// end include: runtime_common.js +assert(globalThis.Int32Array && globalThis.Float64Array && Int32Array.prototype.subarray && Int32Array.prototype.set, + 'JS engine does not provide full typed array support'); + +function preRun() { + if (Module['preRun']) { + if (typeof Module['preRun'] == 'function') Module['preRun'] = [Module['preRun']]; + while (Module['preRun'].length) { + addOnPreRun(Module['preRun'].shift()); + } + } + consumedModuleProp('preRun'); + // Begin ATPRERUNS hooks + callRuntimeCallbacks(onPreRuns); + // End ATPRERUNS hooks +} + +function initRuntime() { + assert(!runtimeInitialized); + runtimeInitialized = true; + + checkStackCookie(); + + // Begin ATINITS hooks + if (!Module['noFSInit'] && !FS.initialized) FS.init(); +TTY.init(); + // End ATINITS hooks + + wasmExports['__wasm_call_ctors'](); + + // Begin ATPOSTCTORS hooks + FS.ignorePermissions = false; + // End ATPOSTCTORS hooks +} + +function postRun() { + checkStackCookie(); + // PThreads reuse the runtime from the main thread. + + if (Module['postRun']) { + if (typeof Module['postRun'] == 'function') Module['postRun'] = [Module['postRun']]; + while (Module['postRun'].length) { + addOnPostRun(Module['postRun'].shift()); + } + } + consumedModuleProp('postRun'); + + // Begin ATPOSTRUNS hooks + callRuntimeCallbacks(onPostRuns); + // End ATPOSTRUNS hooks +} + +/** + * @param {string|number=} what + */ +function abort(what) { + Module['onAbort']?.(what); + + what = `Aborted(${what})`; + // TODO(sbc): Should we remove printing and leave it up to whoever + // catches the exception? + err(what); + + ABORT = true; + + // Use a wasm runtime error, because a JS error might be seen as a foreign + // exception, which means we'd run destructors on it. We need the error to + // simply make the program stop. + // FIXME This approach does not work in Wasm EH because it currently does not assume + // all RuntimeErrors are from traps; it decides whether a RuntimeError is from + // a trap or not based on a hidden field within the object. So at the moment + // we don't have a way of throwing a wasm trap from JS. TODO Make a JS API that + // allows this in the wasm spec. + + // Suppress closure compiler warning here. Closure compiler's builtin extern + // definition for WebAssembly.RuntimeError claims it takes no arguments even + // though it can. + // TODO(https://github.com/google/closure-compiler/pull/3913): Remove if/when upstream closure gets fixed. + /** @suppress {checkTypes} */ + var e = new WebAssembly.RuntimeError(what); + + // Throw the error whether or not MODULARIZE is set because abort is used + // in code paths apart from instantiation where an exception is expected + // to be thrown when abort is called. + throw e; +} + +function createExportWrapper(name, nargs) { + return (...args) => { + assert(runtimeInitialized, `native function \`${name}\` called before runtime initialization`); + var f = wasmExports[name]; + assert(f, `exported native function \`${name}\` not found`); + // Only assert for too many arguments. Too few can be valid since the missing arguments will be zero filled. + assert(args.length <= nargs, `native function \`${name}\` called with ${args.length} args but expects ${nargs}`); + return f(...args); + }; +} + +var wasmBinaryFile; + +function findWasmBinary() { + return locateFile('/web/static/apps/sim/index.wasm'); +} + +function getBinarySync(file) { + if (file == wasmBinaryFile && wasmBinary) { + return new Uint8Array(wasmBinary); + } + if (readBinary) { + return readBinary(file); + } + // Throwing a plain string here, even though it not normally advisable since + // this gets turning into an `abort` in instantiateArrayBuffer. + throw 'both async and sync fetching of the wasm failed'; +} + +async function getWasmBinary(binaryFile) { + // If we don't have the binary yet, load it asynchronously using readAsync. + if (!wasmBinary) { + // Fetch the binary using readAsync + try { + var response = await readAsync(binaryFile); + return new Uint8Array(response); + } catch { + // Fall back to getBinarySync below; + } + } + + // Otherwise, getBinarySync should be able to get it synchronously + return getBinarySync(binaryFile); +} + +async function instantiateArrayBuffer(binaryFile, imports) { + try { + var binary = await getWasmBinary(binaryFile); + var instance = await WebAssembly.instantiate(binary, imports); + return instance; + } catch (reason) { + err(`failed to asynchronously prepare wasm: ${reason}`); + + // Warn on some common problems. + if (isFileURI(binaryFile)) { + err(`warning: Loading from a file URI (${binaryFile}) is not supported in most browsers. See https://emscripten.org/docs/getting_started/FAQ.html#how-do-i-run-a-local-webserver-for-testing-why-does-my-program-stall-in-downloading-or-preparing`); + } + abort(reason); + } +} + +async function instantiateAsync(binary, binaryFile, imports) { + if (!binary + // Don't use streaming for file:// delivered objects in a webview, fetch them synchronously. + && !isFileURI(binaryFile) + // Avoid instantiateStreaming() on Node.js environment for now, as while + // Node.js v18.1.0 implements it, it does not have a full fetch() + // implementation yet. + // + // Reference: + // https://github.com/emscripten-core/emscripten/pull/16917 + && !ENVIRONMENT_IS_NODE + ) { + try { + var response = fetch(binaryFile, { credentials: 'same-origin' }); + var instantiationResult = await WebAssembly.instantiateStreaming(response, imports); + return instantiationResult; + } catch (reason) { + // We expect the most common failure cause to be a bad MIME type for the binary, + // in which case falling back to ArrayBuffer instantiation should work. + err(`wasm streaming compile failed: ${reason}`); + err('falling back to ArrayBuffer instantiation'); + // fall back of instantiateArrayBuffer below + }; + } + return instantiateArrayBuffer(binaryFile, imports); +} + +function getWasmImports() { + // prepare imports + var imports = { + 'env': wasmImports, + 'wasi_snapshot_preview1': wasmImports, + }; + return imports; +} + +// Create the wasm instance. +// Receives the wasm imports, returns the exports. +async function createWasm() { + // Load the wasm module and create an instance of using native support in the JS engine. + // handle a generated wasm instance, receiving its exports and + // performing other necessary setup + /** @param {WebAssembly.Module=} module*/ + function receiveInstance(instance, module) { + wasmExports = instance.exports; + + assignWasmExports(wasmExports); + + updateMemoryViews(); + + removeRunDependency('wasm-instantiate'); + return wasmExports; + } + addRunDependency('wasm-instantiate'); + + // Prefer streaming instantiation if available. + // Async compilation can be confusing when an error on the page overwrites Module + // (for example, if the order of elements is wrong, and the one defining Module is + // later), so we save Module and check it later. + var trueModule = Module; + function receiveInstantiationResult(result) { + // 'result' is a ResultObject object which has both the module and instance. + // receiveInstance() will swap in the exports (to Module.asm) so they can be called + assert(Module === trueModule, 'the Module object should not be replaced during async compilation - perhaps the order of HTML elements is wrong?'); + trueModule = null; + // TODO: Due to Closure regression https://github.com/google/closure-compiler/issues/3193, the above line no longer optimizes out down to the following line. + // When the regression is fixed, can restore the above PTHREADS-enabled path. + return receiveInstance(result['instance']); + } + + var info = getWasmImports(); + + // User shell pages can write their own Module.instantiateWasm = function(imports, successCallback) callback + // to manually instantiate the Wasm module themselves. This allows pages to + // run the instantiation parallel to any other async startup actions they are + // performing. + // Also pthreads and wasm workers initialize the wasm instance through this + // path. + if (Module['instantiateWasm']) { + return new Promise((resolve, reject) => { + try { + Module['instantiateWasm'](info, (inst, mod) => { + resolve(receiveInstance(inst, mod)); + }); + } catch(e) { + err(`Module.instantiateWasm callback failed with error: ${e}`); + reject(e); + } + }); + } + + wasmBinaryFile ??= findWasmBinary(); + var result = await instantiateAsync(wasmBinary, wasmBinaryFile, info); + var exports = receiveInstantiationResult(result); + return exports; +} + +// end include: preamble.js + +// Begin JS library code + + + class ExitStatus { + name = 'ExitStatus'; + constructor(status) { + this.message = `Program terminated with exit(${status})`; + this.status = status; + } + } + + /** @type {!Int16Array} */ + var HEAP16; + + /** @type {!Int32Array} */ + var HEAP32; + + /** not-@type {!BigInt64Array} */ + var HEAP64; + + /** @type {!Int8Array} */ + var HEAP8; + + /** @type {!Float32Array} */ + var HEAPF32; + + /** @type {!Float64Array} */ + var HEAPF64; + + /** @type {!Uint16Array} */ + var HEAPU16; + + /** @type {!Uint32Array} */ + var HEAPU32; + + /** not-@type {!BigUint64Array} */ + var HEAPU64; + + /** @type {!Uint8Array} */ + var HEAPU8; + + var callRuntimeCallbacks = (callbacks) => { + while (callbacks.length > 0) { + // Pass the module as the first argument. + callbacks.shift()(Module); + } + }; + var onPostRuns = []; + var addOnPostRun = (cb) => onPostRuns.push(cb); + + var onPreRuns = []; + var addOnPreRun = (cb) => onPreRuns.push(cb); + + var runDependencies = 0; + + + var dependenciesFulfilled = null; + + var runDependencyTracking = { + }; + + var runDependencyWatcher = null; + var removeRunDependency = (id) => { + runDependencies--; + + Module['monitorRunDependencies']?.(runDependencies); + + assert(id, 'removeRunDependency requires an ID'); + assert(runDependencyTracking[id]); + delete runDependencyTracking[id]; + if (runDependencies == 0) { + if (runDependencyWatcher !== null) { + clearInterval(runDependencyWatcher); + runDependencyWatcher = null; + } + if (dependenciesFulfilled) { + var callback = dependenciesFulfilled; + dependenciesFulfilled = null; + callback(); // can add another dependenciesFulfilled + } + } + }; + + + var addRunDependency = (id) => { + runDependencies++; + + Module['monitorRunDependencies']?.(runDependencies); + + assert(id, 'addRunDependency requires an ID') + assert(!runDependencyTracking[id]); + runDependencyTracking[id] = 1; + if (runDependencyWatcher === null && globalThis.setInterval) { + // Check for missing dependencies every few seconds + runDependencyWatcher = setInterval(() => { + if (ABORT) { + clearInterval(runDependencyWatcher); + runDependencyWatcher = null; + return; + } + var shown = false; + for (var dep in runDependencyTracking) { + if (!shown) { + shown = true; + err('still waiting on run dependencies:'); + } + err(`dependency: ${dep}`); + } + if (shown) { + err('(end of list)'); + } + }, 10000); + // Prevent this timer from keeping the runtime alive if nothing + // else is. + runDependencyWatcher.unref?.() + } + }; + + + + /** + * @param {number} ptr + * @param {string} type + */ + function getValue(ptr, type = 'i8') { + if (type.endsWith('*')) type = '*'; + switch (type) { + case 'i1': return HEAP8[ptr]; + case 'i8': return HEAP8[ptr]; + case 'i16': return HEAP16[((ptr)>>1)]; + case 'i32': return HEAP32[((ptr)>>2)]; + case 'i64': return HEAP64[((ptr)>>3)]; + case 'float': return HEAPF32[((ptr)>>2)]; + case 'double': return HEAPF64[((ptr)>>3)]; + case '*': return HEAPU32[((ptr)>>2)]; + default: abort(`invalid type for getValue: ${type}`); + } + } + + var noExitRuntime = true; + + function ptrToString(ptr) { + assert(typeof ptr === 'number', `ptrToString expects a number, got ${typeof ptr}`); + // Convert to 32-bit unsigned value + ptr >>>= 0; + return '0x' + ptr.toString(16).padStart(8, '0'); + } + + + + /** + * @param {number} ptr + * @param {number} value + * @param {string} type + */ + function setValue(ptr, value, type = 'i8') { + if (type.endsWith('*')) type = '*'; + switch (type) { + case 'i1': HEAP8[ptr] = value; break; + case 'i8': HEAP8[ptr] = value; break; + case 'i16': HEAP16[((ptr)>>1)] = value; break; + case 'i32': HEAP32[((ptr)>>2)] = value; break; + case 'i64': HEAP64[((ptr)>>3)] = BigInt(value); break; + case 'float': HEAPF32[((ptr)>>2)] = value; break; + case 'double': HEAPF64[((ptr)>>3)] = value; break; + case '*': HEAPU32[((ptr)>>2)] = value; break; + default: abort(`invalid type for setValue: ${type}`); + } + } + + var stackRestore = (val) => __emscripten_stack_restore(val); + + var stackSave = () => _emscripten_stack_get_current(); + + var warnOnce = (text) => { + warnOnce.shown ||= {}; + if (!warnOnce.shown[text]) { + warnOnce.shown[text] = 1; + if (ENVIRONMENT_IS_NODE) text = 'warning: ' + text; + err(text); + } + }; + + + + var UTF8Decoder = globalThis.TextDecoder && new TextDecoder(); + + var findStringEnd = (heapOrArray, idx, maxBytesToRead, ignoreNul) => { + var maxIdx = idx + maxBytesToRead; + if (ignoreNul) return maxIdx; + // TextDecoder needs to know the byte length in advance, it doesn't stop on + // null terminator by itself. + // As a tiny code save trick, compare idx against maxIdx using a negation, + // so that maxBytesToRead=undefined/NaN means Infinity. + while (heapOrArray[idx] && !(idx >= maxIdx)) ++idx; + return idx; + }; + + + /** + * Given a pointer 'idx' to a null-terminated UTF8-encoded string in the given + * array that contains uint8 values, returns a copy of that string as a + * Javascript String object. + * heapOrArray is either a regular array, or a JavaScript typed array view. + * @param {number=} idx + * @param {number=} maxBytesToRead + * @param {boolean=} ignoreNul - If true, the function will not stop on a NUL character. + * @return {string} + */ + var UTF8ArrayToString = (heapOrArray, idx = 0, maxBytesToRead, ignoreNul) => { + + var endPtr = findStringEnd(heapOrArray, idx, maxBytesToRead, ignoreNul); + + // When using conditional TextDecoder, skip it for short strings as the overhead of the native call is not worth it. + if (endPtr - idx > 16 && heapOrArray.buffer && UTF8Decoder) { + return UTF8Decoder.decode(heapOrArray.subarray(idx, endPtr)); + } + var str = ''; + while (idx < endPtr) { + // For UTF8 byte structure, see: + // http://en.wikipedia.org/wiki/UTF-8#Description + // https://www.ietf.org/rfc/rfc2279.txt + // https://tools.ietf.org/html/rfc3629 + var u0 = heapOrArray[idx++]; + if (!(u0 & 0x80)) { str += String.fromCharCode(u0); continue; } + var u1 = heapOrArray[idx++] & 63; + if ((u0 & 0xE0) == 0xC0) { str += String.fromCharCode(((u0 & 31) << 6) | u1); continue; } + var u2 = heapOrArray[idx++] & 63; + if ((u0 & 0xF0) == 0xE0) { + u0 = ((u0 & 15) << 12) | (u1 << 6) | u2; + } else { + if ((u0 & 0xF8) != 0xF0) warnOnce(`Invalid UTF-8 leading byte ${ptrToString(u0)} encountered when deserializing a UTF-8 string in wasm memory to a JS string!`); + u0 = ((u0 & 7) << 18) | (u1 << 12) | (u2 << 6) | (heapOrArray[idx++] & 63); + } + + if (u0 < 0x10000) { + str += String.fromCharCode(u0); + } else { + var ch = u0 - 0x10000; + str += String.fromCharCode(0xD800 | (ch >> 10), 0xDC00 | (ch & 0x3FF)); + } + } + return str; + }; + + /** + * Given a pointer 'ptr' to a null-terminated UTF8-encoded string in the + * emscripten HEAP, returns a copy of that string as a Javascript String object. + * + * @param {number} ptr + * @param {number=} maxBytesToRead - An optional length that specifies the + * maximum number of bytes to read. You can omit this parameter to scan the + * string until the first 0 byte. If maxBytesToRead is passed, and the string + * at [ptr, ptr+maxBytesToReadr[ contains a null byte in the middle, then the + * string will cut short at that byte index. + * @param {boolean=} ignoreNul - If true, the function will not stop on a NUL character. + * @return {string} + */ + var UTF8ToString = (ptr, maxBytesToRead, ignoreNul) => { + assert(typeof ptr == 'number', `UTF8ToString expects a number (got ${typeof ptr})`); + return ptr ? UTF8ArrayToString(HEAPU8, ptr, maxBytesToRead, ignoreNul) : ''; + }; + var ___assert_fail = (condition, filename, line, func) => + abort(`Assertion failed: ${UTF8ToString(condition)}, at: ` + [filename ? UTF8ToString(filename) : 'unknown filename', line, func ? UTF8ToString(func) : 'unknown function']); + + var PATH = { + isAbs:(path) => path.charAt(0) === '/', + splitPath:(filename) => { + var splitPathRe = /^(\/?|)([\s\S]*?)((?:\.{1,2}|[^\/]+?|)(\.[^.\/]*|))(?:[\/]*)$/; + return splitPathRe.exec(filename).slice(1); + }, + normalizeArray:(parts, allowAboveRoot) => { + // if the path tries to go above the root, `up` ends up > 0 + var up = 0; + for (var i = parts.length - 1; i >= 0; i--) { + var last = parts[i]; + if (last === '.') { + parts.splice(i, 1); + } else if (last === '..') { + parts.splice(i, 1); + up++; + } else if (up) { + parts.splice(i, 1); + up--; + } + } + // if the path is allowed to go above the root, restore leading ..s + if (allowAboveRoot) { + for (; up; up--) { + parts.unshift('..'); + } + } + return parts; + }, + normalize:(path) => { + var isAbsolute = PATH.isAbs(path), + trailingSlash = path.slice(-1) === '/'; + // Normalize the path + path = PATH.normalizeArray(path.split('/').filter((p) => !!p), !isAbsolute).join('/'); + if (!path && !isAbsolute) { + path = '.'; + } + if (path && trailingSlash) { + path += '/'; + } + return (isAbsolute ? '/' : '') + path; + }, + dirname:(path) => { + var result = PATH.splitPath(path), + root = result[0], + dir = result[1]; + if (!root && !dir) { + // No dirname whatsoever + return '.'; + } + if (dir) { + // It has a dirname, strip trailing slash + dir = dir.slice(0, -1); + } + return root + dir; + }, + basename:(path) => path && path.match(/([^\/]+|\/)\/*$/)[1], +join:(...paths) => PATH.normalize(paths.join('/')), +join2:(l, r) => PATH.normalize(l + '/' + r), +}; + +var initRandomFill = () => { + // This block is not needed on v19+ since crypto.getRandomValues is builtin + if (ENVIRONMENT_IS_NODE) { + var nodeCrypto = require('node:crypto'); + return (view) => nodeCrypto.randomFillSync(view); + } + + return (view) => (crypto.getRandomValues(view), 0); + }; +var randomFill = (view) => (randomFill = initRandomFill())(view); + + + +var PATH_FS = { +resolve:(...args) => { + var resolvedPath = '', + resolvedAbsolute = false; + for (var i = args.length - 1; i >= -1 && !resolvedAbsolute; i--) { + var path = (i >= 0) ? args[i] : FS.cwd(); + // Skip empty and invalid entries + if (typeof path != 'string') { + throw new TypeError('Arguments to path.resolve must be strings'); + } else if (!path) { + return ''; // an invalid portion invalidates the whole thing + } + resolvedPath = path + '/' + resolvedPath; + resolvedAbsolute = PATH.isAbs(path); + } + // At this point the path should be resolved to a full absolute path, but + // handle relative paths to be safe (might happen when process.cwd() fails) + resolvedPath = PATH.normalizeArray(resolvedPath.split('/').filter((p) => !!p), !resolvedAbsolute).join('/'); + return ((resolvedAbsolute ? '/' : '') + resolvedPath) || '.'; + }, +relative:(from, to) => { + from = PATH_FS.resolve(from).slice(1); + to = PATH_FS.resolve(to).slice(1); + function trim(arr) { + var start = 0; + for (; start < arr.length; start++) { + if (arr[start] !== '') break; + } + var end = arr.length - 1; + for (; end >= 0; end--) { + if (arr[end] !== '') break; + } + if (start > end) return []; + return arr.slice(start, end - start + 1); + } + var fromParts = trim(from.split('/')); + var toParts = trim(to.split('/')); + var length = Math.min(fromParts.length, toParts.length); + var samePartsLength = length; + for (var i = 0; i < length; i++) { + if (fromParts[i] !== toParts[i]) { + samePartsLength = i; + break; + } + } + var outputParts = []; + for (var i = samePartsLength; i < fromParts.length; i++) { + outputParts.push('..'); + } + outputParts = outputParts.concat(toParts.slice(samePartsLength)); + return outputParts.join('/'); + }, +}; + + + +var FS_stdin_getChar_buffer = []; + +var lengthBytesUTF8 = (str) => { + var len = 0; + for (var i = 0; i < str.length; ++i) { + // Gotcha: charCodeAt returns a 16-bit word that is a UTF-16 encoded code + // unit, not a Unicode code point of the character! So decode + // UTF16->UTF32->UTF8. + // See http://unicode.org/faq/utf_bom.html#utf16-3 + var c = str.charCodeAt(i); // possibly a lead surrogate + if (c <= 0x7F) { + len++; + } else if (c <= 0x7FF) { + len += 2; + } else if (c >= 0xD800 && c <= 0xDFFF) { + len += 4; ++i; + } else { + len += 3; + } + } + return len; + }; + +var stringToUTF8Array = (str, heap, outIdx, maxBytesToWrite) => { + assert(typeof str === 'string', `stringToUTF8Array expects a string (got ${typeof str})`); + // Parameter maxBytesToWrite is not optional. Negative values, 0, null, + // undefined and false each don't write out any bytes. + if (!(maxBytesToWrite > 0)) + return 0; + + var startIdx = outIdx; + var endIdx = outIdx + maxBytesToWrite - 1; // -1 for string null terminator. + for (var i = 0; i < str.length; ++i) { + // For UTF8 byte structure, see http://en.wikipedia.org/wiki/UTF-8#Description + // and https://www.ietf.org/rfc/rfc2279.txt + // and https://tools.ietf.org/html/rfc3629 + var u = str.codePointAt(i); + if (u <= 0x7F) { + if (outIdx >= endIdx) break; + heap[outIdx++] = u; + } else if (u <= 0x7FF) { + if (outIdx + 1 >= endIdx) break; + heap[outIdx++] = 0xC0 | (u >> 6); + heap[outIdx++] = 0x80 | (u & 63); + } else if (u <= 0xFFFF) { + if (outIdx + 2 >= endIdx) break; + heap[outIdx++] = 0xE0 | (u >> 12); + heap[outIdx++] = 0x80 | ((u >> 6) & 63); + heap[outIdx++] = 0x80 | (u & 63); + } else { + if (outIdx + 3 >= endIdx) break; + if (u > 0x10FFFF) warnOnce(`Invalid Unicode code point ${ptrToString(u)} encountered when serializing a JS string to a UTF-8 string in wasm memory! (Valid unicode code points should be in range 0-0x10FFFF).`); + heap[outIdx++] = 0xF0 | (u >> 18); + heap[outIdx++] = 0x80 | ((u >> 12) & 63); + heap[outIdx++] = 0x80 | ((u >> 6) & 63); + heap[outIdx++] = 0x80 | (u & 63); + // Gotcha: if codePoint is over 0xFFFF, it is represented as a surrogate pair in UTF-16. + // We need to manually skip over the second code unit for correct iteration. + i++; + } + } + // Null-terminate the pointer to the buffer. + heap[outIdx] = 0; + return outIdx - startIdx; + }; +/** @type {function(string, boolean=, number=)} */ + var intArrayFromString = (stringy, dontAddNull, length) => { + var len = length > 0 ? length : lengthBytesUTF8(stringy)+1; + var u8array = new Array(len); + var numBytesWritten = stringToUTF8Array(stringy, u8array, 0, u8array.length); + if (dontAddNull) u8array.length = numBytesWritten; + return u8array; + }; + var FS_stdin_getChar = () => { + if (!FS_stdin_getChar_buffer.length) { + var result = null; + if (ENVIRONMENT_IS_NODE) { + // we will read data by chunks of BUFSIZE + var BUFSIZE = 256; + var buf = Buffer.alloc(BUFSIZE); + var bytesRead = 0; + + // For some reason we must suppress a closure warning here, even though + // fd definitely exists on process.stdin, and is even the proper way to + // get the fd of stdin, + // https://github.com/nodejs/help/issues/2136#issuecomment-523649904 + // This started to happen after moving this logic out of library_tty.js, + // so it is related to the surrounding code in some unclear manner. + /** @suppress {missingProperties} */ + var fd = process.stdin.fd; + + try { + bytesRead = fs.readSync(fd, buf, 0, BUFSIZE); + } catch(e) { + // Cross-platform differences: on Windows, reading EOF throws an + // exception, but on other OSes, reading EOF returns 0. Uniformize + // behavior by treating the EOF exception to return 0. + if (e.toString().includes('EOF')) bytesRead = 0; + else throw e; + } + + if (bytesRead > 0) { + result = buf.slice(0, bytesRead).toString('utf-8'); + } + } else + if (globalThis.window?.prompt) { + // Browser. + result = window.prompt('Input: '); // returns null on cancel + if (result !== null) { + result += '\n'; + } + } else + {} + if (!result) { + return null; + } + FS_stdin_getChar_buffer = intArrayFromString(result, true); + } + return FS_stdin_getChar_buffer.shift(); + }; + var TTY = { + ttys:[], + init() { + // https://github.com/emscripten-core/emscripten/pull/1555 + // if (ENVIRONMENT_IS_NODE) { + // // currently, FS.init does not distinguish if process.stdin is a file or TTY + // // device, it always assumes it's a TTY device. because of this, we're forcing + // // process.stdin to UTF8 encoding to at least make stdin reading compatible + // // with text files until FS.init can be refactored. + // process.stdin.setEncoding('utf8'); + // } + }, + shutdown() { + // https://github.com/emscripten-core/emscripten/pull/1555 + // if (ENVIRONMENT_IS_NODE) { + // // inolen: any idea as to why node -e 'process.stdin.read()' wouldn't exit immediately (with process.stdin being a tty)? + // // isaacs: because now it's reading from the stream, you've expressed interest in it, so that read() kicks off a _read() which creates a ReadReq operation + // // inolen: I thought read() in that case was a synchronous operation that just grabbed some amount of buffered data if it exists? + // // isaacs: it is. but it also triggers a _read() call, which calls readStart() on the handle + // // isaacs: do process.stdin.pause() and i'd think it'd probably close the pending call + // process.stdin.pause(); + // } + }, + register(dev, ops) { + TTY.ttys[dev] = { input: [], output: [], ops: ops }; + FS.registerDevice(dev, TTY.stream_ops); + }, + stream_ops:{ + open(stream) { + var tty = TTY.ttys[stream.node.rdev]; + if (!tty) { + throw new FS.ErrnoError(43); + } + stream.tty = tty; + stream.seekable = false; + }, + close(stream) { + // flush any pending line data + stream.tty.ops.fsync(stream.tty); + }, + fsync(stream) { + stream.tty.ops.fsync(stream.tty); + }, + read(stream, buffer, offset, length, pos /* ignored */) { + if (!stream.tty || !stream.tty.ops.get_char) { + throw new FS.ErrnoError(60); + } + var bytesRead = 0; + for (var i = 0; i < length; i++) { + var result; + try { + result = stream.tty.ops.get_char(stream.tty); + } catch (e) { + throw new FS.ErrnoError(29); + } + if (result === undefined && bytesRead === 0) { + throw new FS.ErrnoError(6); + } + if (result === null || result === undefined) break; + bytesRead++; + buffer[offset+i] = result; + } + if (bytesRead) { + stream.node.atime = Date.now(); + } + return bytesRead; + }, + write(stream, buffer, offset, length, pos) { + if (!stream.tty || !stream.tty.ops.put_char) { + throw new FS.ErrnoError(60); + } + try { + for (var i = 0; i < length; i++) { + stream.tty.ops.put_char(stream.tty, buffer[offset+i]); + } + } catch (e) { + throw new FS.ErrnoError(29); + } + if (length) { + stream.node.mtime = stream.node.ctime = Date.now(); + } + return i; + }, + }, + default_tty_ops:{ + get_char(tty) { + return FS_stdin_getChar(); + }, + put_char(tty, val) { + if (val === null || val === 10) { + out(UTF8ArrayToString(tty.output)); + tty.output = []; + } else { + if (val != 0) tty.output.push(val); // val == 0 would cut text output off in the middle. + } + }, + fsync(tty) { + if (tty.output?.length > 0) { + out(UTF8ArrayToString(tty.output)); + tty.output = []; + } + }, + ioctl_tcgets(tty) { + // typical setting + return { + c_iflag: 25856, + c_oflag: 5, + c_cflag: 191, + c_lflag: 35387, + c_cc: [ + 0x03, 0x1c, 0x7f, 0x15, 0x04, 0x00, 0x01, 0x00, 0x11, 0x13, 0x1a, 0x00, + 0x12, 0x0f, 0x17, 0x16, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + ] + }; + }, + ioctl_tcsets(tty, optional_actions, data) { + // currently just ignore + return 0; + }, + ioctl_tiocgwinsz(tty) { + return [24, 80]; + }, + }, + default_tty1_ops:{ + put_char(tty, val) { + if (val === null || val === 10) { + err(UTF8ArrayToString(tty.output)); + tty.output = []; + } else { + if (val != 0) tty.output.push(val); + } + }, + fsync(tty) { + if (tty.output?.length > 0) { + err(UTF8ArrayToString(tty.output)); + tty.output = []; + } + }, + }, + }; + + + var mmapAlloc = (size) => { + abort('internal error: mmapAlloc called but `emscripten_builtin_memalign` native symbol not exported'); + }; + var MEMFS = { + ops_table:null, + mount(mount) { + return MEMFS.createNode(null, '/', 16895, 0); + }, + createNode(parent, name, mode, dev) { + if (FS.isBlkdev(mode) || FS.isFIFO(mode)) { + // not supported + throw new FS.ErrnoError(63); + } + MEMFS.ops_table ||= { + dir: { + node: { + getattr: MEMFS.node_ops.getattr, + setattr: MEMFS.node_ops.setattr, + lookup: MEMFS.node_ops.lookup, + mknod: MEMFS.node_ops.mknod, + rename: MEMFS.node_ops.rename, + unlink: MEMFS.node_ops.unlink, + rmdir: MEMFS.node_ops.rmdir, + readdir: MEMFS.node_ops.readdir, + symlink: MEMFS.node_ops.symlink + }, + stream: { + llseek: MEMFS.stream_ops.llseek + } + }, + file: { + node: { + getattr: MEMFS.node_ops.getattr, + setattr: MEMFS.node_ops.setattr + }, + stream: { + llseek: MEMFS.stream_ops.llseek, + read: MEMFS.stream_ops.read, + write: MEMFS.stream_ops.write, + mmap: MEMFS.stream_ops.mmap, + msync: MEMFS.stream_ops.msync + } + }, + link: { + node: { + getattr: MEMFS.node_ops.getattr, + setattr: MEMFS.node_ops.setattr, + readlink: MEMFS.node_ops.readlink + }, + stream: {} + }, + chrdev: { + node: { + getattr: MEMFS.node_ops.getattr, + setattr: MEMFS.node_ops.setattr + }, + stream: FS.chrdev_stream_ops + } + }; + var node = FS.createNode(parent, name, mode, dev); + if (FS.isDir(node.mode)) { + node.node_ops = MEMFS.ops_table.dir.node; + node.stream_ops = MEMFS.ops_table.dir.stream; + node.contents = {}; + } else if (FS.isFile(node.mode)) { + node.node_ops = MEMFS.ops_table.file.node; + node.stream_ops = MEMFS.ops_table.file.stream; + // The actual number of bytes used in the typed array, as opposed to + // contents.length which gives the whole capacity. + node.usedBytes = 0; + // The byte data of the file is stored in a typed array. + // Note: typed arrays are not resizable like normal JS arrays are, so + // there is a small penalty involved for appending file writes that + // continuously grow a file similar to std::vector capacity vs used. + node.contents = MEMFS.emptyFileContents ??= new Uint8Array(0); + } else if (FS.isLink(node.mode)) { + node.node_ops = MEMFS.ops_table.link.node; + node.stream_ops = MEMFS.ops_table.link.stream; + } else if (FS.isChrdev(node.mode)) { + node.node_ops = MEMFS.ops_table.chrdev.node; + node.stream_ops = MEMFS.ops_table.chrdev.stream; + } + node.atime = node.mtime = node.ctime = Date.now(); + // add the new node to the parent + if (parent) { + parent.contents[name] = node; + parent.atime = parent.mtime = parent.ctime = node.atime; + } + return node; + }, + getFileDataAsTypedArray(node) { + assert(FS.isFile(node.mode), 'getFileDataAsTypedArray called on non-file'); + return node.contents.subarray(0, node.usedBytes); // Make sure to not return excess unused bytes. + }, + expandFileStorage(node, newCapacity) { + var prevCapacity = node.contents.length; + if (prevCapacity >= newCapacity) return; // No need to expand, the storage was already large enough. + // Don't expand strictly to the given requested limit if it's only a very + // small increase, but instead geometrically grow capacity. + // For small filesizes (<1MB), perform size*2 geometric increase, but for + // large sizes, do a much more conservative size*1.125 increase to avoid + // overshooting the allocation cap by a very large margin. + var CAPACITY_DOUBLING_MAX = 1024 * 1024; + newCapacity = Math.max(newCapacity, (prevCapacity * (prevCapacity < CAPACITY_DOUBLING_MAX ? 2.0 : 1.125)) >>> 0); + if (prevCapacity) newCapacity = Math.max(newCapacity, 256); // At minimum allocate 256b for each file when expanding. + var oldContents = MEMFS.getFileDataAsTypedArray(node); + node.contents = new Uint8Array(newCapacity); // Allocate new storage. + node.contents.set(oldContents); + }, + resizeFileStorage(node, newSize) { + if (node.usedBytes == newSize) return; + var oldContents = node.contents; + node.contents = new Uint8Array(newSize); // Allocate new storage. + node.contents.set(oldContents.subarray(0, Math.min(newSize, node.usedBytes))); // Copy old data over to the new storage. + node.usedBytes = newSize; + }, + node_ops:{ + getattr(node) { + var attr = {}; + // device numbers reuse inode numbers. + attr.dev = FS.isChrdev(node.mode) ? node.id : 1; + attr.ino = node.id; + attr.mode = node.mode; + attr.nlink = 1; + attr.uid = 0; + attr.gid = 0; + attr.rdev = node.rdev; + if (FS.isDir(node.mode)) { + attr.size = 4096; + } else if (FS.isFile(node.mode)) { + attr.size = node.usedBytes; + } else if (FS.isLink(node.mode)) { + attr.size = node.link.length; + } else { + attr.size = 0; + } + attr.atime = new Date(node.atime); + attr.mtime = new Date(node.mtime); + attr.ctime = new Date(node.ctime); + // NOTE: In our implementation, st_blocks = Math.ceil(st_size/st_blksize), + // but this is not required by the standard. + attr.blksize = 4096; + attr.blocks = Math.ceil(attr.size / attr.blksize); + return attr; + }, + setattr(node, attr) { + for (const key of ["mode", "atime", "mtime", "ctime"]) { + if (attr[key] != null) { + node[key] = attr[key]; + } + } + if (attr.size !== undefined) { + MEMFS.resizeFileStorage(node, attr.size); + } + }, + lookup(parent, name) { + throw new FS.ErrnoError(44); + }, + mknod(parent, name, mode, dev) { + return MEMFS.createNode(parent, name, mode, dev); + }, + rename(old_node, new_dir, new_name) { + var new_node; + try { + new_node = FS.lookupNode(new_dir, new_name); + } catch (e) {} + if (new_node) { + if (FS.isDir(old_node.mode)) { + // if we're overwriting a directory at new_name, make sure it's empty. + for (var i in new_node.contents) { + throw new FS.ErrnoError(55); + } + } + FS.hashRemoveNode(new_node); + } + // do the internal rewiring + delete old_node.parent.contents[old_node.name]; + new_dir.contents[new_name] = old_node; + old_node.name = new_name; + new_dir.ctime = new_dir.mtime = old_node.parent.ctime = old_node.parent.mtime = Date.now(); + }, + unlink(parent, name) { + delete parent.contents[name]; + parent.ctime = parent.mtime = Date.now(); + }, + rmdir(parent, name) { + var node = FS.lookupNode(parent, name); + for (var i in node.contents) { + throw new FS.ErrnoError(55); + } + delete parent.contents[name]; + parent.ctime = parent.mtime = Date.now(); + }, + readdir(node) { + return ['.', '..', ...Object.keys(node.contents)]; + }, + symlink(parent, newname, oldpath) { + var node = MEMFS.createNode(parent, newname, 0o777 | 40960, 0); + node.link = oldpath; + return node; + }, + readlink(node) { + if (!FS.isLink(node.mode)) { + throw new FS.ErrnoError(28); + } + return node.link; + }, + }, + stream_ops:{ + read(stream, buffer, offset, length, position) { + var contents = stream.node.contents; + if (position >= stream.node.usedBytes) return 0; + var size = Math.min(stream.node.usedBytes - position, length); + assert(size >= 0); + buffer.set(contents.subarray(position, position + size), offset); + return size; + }, + write(stream, buffer, offset, length, position, canOwn) { + assert(buffer.subarray, 'FS.write expects a TypedArray'); + + if (!length) return 0; + var node = stream.node; + node.mtime = node.ctime = Date.now(); + + if (canOwn) { + assert(position === 0, 'canOwn must imply no weird position inside the file'); + node.contents = buffer.subarray(offset, offset + length); + node.usedBytes = length; + } else if (node.usedBytes === 0 && position === 0) { // If this is a simple first write to an empty file, do a fast set since we don't need to care about old data. + node.contents = buffer.slice(offset, offset + length); + node.usedBytes = length; + } else { + MEMFS.expandFileStorage(node, position+length); + // Use typed array write which is available. + node.contents.set(buffer.subarray(offset, offset + length), position); + node.usedBytes = Math.max(node.usedBytes, position + length); + } + return length; + }, + llseek(stream, offset, whence) { + var position = offset; + if (whence === 1) { + position += stream.position; + } else if (whence === 2) { + if (FS.isFile(stream.node.mode)) { + position += stream.node.usedBytes; + } + } + if (position < 0) { + throw new FS.ErrnoError(28); + } + return position; + }, + mmap(stream, length, position, prot, flags) { + if (!FS.isFile(stream.node.mode)) { + throw new FS.ErrnoError(43); + } + var ptr; + var allocated; + var contents = stream.node.contents; + // Only make a new copy when MAP_PRIVATE is specified. + if (!(flags & 2) && contents.buffer === HEAP8.buffer) { + // We can't emulate MAP_SHARED when the file is not backed by the + // buffer we're mapping to (e.g. the HEAP buffer). + allocated = false; + ptr = contents.byteOffset; + } else { + allocated = true; + ptr = mmapAlloc(length); + if (!ptr) { + throw new FS.ErrnoError(48); + } + if (contents) { + // Try to avoid unnecessary slices. + if (position > 0 || position + length < contents.length) { + if (contents.subarray) { + contents = contents.subarray(position, position + length); + } else { + contents = Array.prototype.slice.call(contents, position, position + length); + } + } + HEAP8.set(contents, ptr); + } + } + return { ptr, allocated }; + }, + msync(stream, buffer, offset, length, mmapFlags) { + MEMFS.stream_ops.write(stream, buffer, 0, length, offset, false); + // should we check if bytesWritten and length are the same? + return 0; + }, + }, + }; + + var FS_modeStringToFlags = (str) => { + if (typeof str != 'string') return str; + var flagModes = { + 'r': 0, + 'r+': 2, + 'w': 512 | 64 | 1, + 'w+': 512 | 64 | 2, + 'a': 1024 | 64 | 1, + 'a+': 1024 | 64 | 2, + }; + var flags = flagModes[str]; + if (typeof flags == 'undefined') { + throw new Error(`Unknown file open mode: ${str}`); + } + return flags; + }; + + var FS_fileDataToTypedArray = (data) => { + if (typeof data == 'string') { + data = intArrayFromString(data, true); + } + if (!data.subarray) { + data = new Uint8Array(data); + } + return data; + }; + + var FS_getMode = (canRead, canWrite) => { + var mode = 0; + if (canRead) mode |= 292 | 73; + if (canWrite) mode |= 146; + return mode; + }; + + + + + var strError = (errno) => UTF8ToString(_strerror(errno)); + + var ERRNO_CODES = { + 'EPERM': 63, + 'ENOENT': 44, + 'ESRCH': 71, + 'EINTR': 27, + 'EIO': 29, + 'ENXIO': 60, + 'E2BIG': 1, + 'ENOEXEC': 45, + 'EBADF': 8, + 'ECHILD': 12, + 'EAGAIN': 6, + 'EWOULDBLOCK': 6, + 'ENOMEM': 48, + 'EACCES': 2, + 'EFAULT': 21, + 'ENOTBLK': 105, + 'EBUSY': 10, + 'EEXIST': 20, + 'EXDEV': 75, + 'ENODEV': 43, + 'ENOTDIR': 54, + 'EISDIR': 31, + 'EINVAL': 28, + 'ENFILE': 41, + 'EMFILE': 33, + 'ENOTTY': 59, + 'ETXTBSY': 74, + 'EFBIG': 22, + 'ENOSPC': 51, + 'ESPIPE': 70, + 'EROFS': 69, + 'EMLINK': 34, + 'EPIPE': 64, + 'EDOM': 18, + 'ERANGE': 68, + 'ENOMSG': 49, + 'EIDRM': 24, + 'ECHRNG': 106, + 'EL2NSYNC': 156, + 'EL3HLT': 107, + 'EL3RST': 108, + 'ELNRNG': 109, + 'EUNATCH': 110, + 'ENOCSI': 111, + 'EL2HLT': 112, + 'EDEADLK': 16, + 'ENOLCK': 46, + 'EBADE': 113, + 'EBADR': 114, + 'EXFULL': 115, + 'ENOANO': 104, + 'EBADRQC': 103, + 'EBADSLT': 102, + 'EDEADLOCK': 16, + 'EBFONT': 101, + 'ENOSTR': 100, + 'ENODATA': 116, + 'ETIME': 117, + 'ENOSR': 118, + 'ENONET': 119, + 'ENOPKG': 120, + 'EREMOTE': 121, + 'ENOLINK': 47, + 'EADV': 122, + 'ESRMNT': 123, + 'ECOMM': 124, + 'EPROTO': 65, + 'EMULTIHOP': 36, + 'EDOTDOT': 125, + 'EBADMSG': 9, + 'ENOTUNIQ': 126, + 'EBADFD': 127, + 'EREMCHG': 128, + 'ELIBACC': 129, + 'ELIBBAD': 130, + 'ELIBSCN': 131, + 'ELIBMAX': 132, + 'ELIBEXEC': 133, + 'ENOSYS': 52, + 'ENOTEMPTY': 55, + 'ENAMETOOLONG': 37, + 'ELOOP': 32, + 'EOPNOTSUPP': 138, + 'EPFNOSUPPORT': 139, + 'ECONNRESET': 15, + 'ENOBUFS': 42, + 'EAFNOSUPPORT': 5, + 'EPROTOTYPE': 67, + 'ENOTSOCK': 57, + 'ENOPROTOOPT': 50, + 'ESHUTDOWN': 140, + 'ECONNREFUSED': 14, + 'EADDRINUSE': 3, + 'ECONNABORTED': 13, + 'ENETUNREACH': 40, + 'ENETDOWN': 38, + 'ETIMEDOUT': 73, + 'EHOSTDOWN': 142, + 'EHOSTUNREACH': 23, + 'EINPROGRESS': 26, + 'EALREADY': 7, + 'EDESTADDRREQ': 17, + 'EMSGSIZE': 35, + 'EPROTONOSUPPORT': 66, + 'ESOCKTNOSUPPORT': 137, + 'EADDRNOTAVAIL': 4, + 'ENETRESET': 39, + 'EISCONN': 30, + 'ENOTCONN': 53, + 'ETOOMANYREFS': 141, + 'EUSERS': 136, + 'EDQUOT': 19, + 'ESTALE': 72, + 'ENOTSUP': 138, + 'ENOMEDIUM': 148, + 'EILSEQ': 25, + 'EOVERFLOW': 61, + 'ECANCELED': 11, + 'ENOTRECOVERABLE': 56, + 'EOWNERDEAD': 62, + 'ESTRPIPE': 135, + }; + + var asyncLoad = async (url) => { + var arrayBuffer = await readAsync(url); + assert(arrayBuffer, `Loading data file "${url}" failed (no arrayBuffer).`); + return new Uint8Array(arrayBuffer); + }; + + + var FS_createDataFile = (...args) => FS.createDataFile(...args); + + var getUniqueRunDependency = (id) => { + var orig = id; + while (1) { + if (!runDependencyTracking[id]) return id; + id = orig + Math.random(); + } + }; + + + + var preloadPlugins = []; + var FS_handledByPreloadPlugin = async (byteArray, fullname) => { + // Ensure plugins are ready. + if (typeof Browser != 'undefined') Browser.init(); + + for (var plugin of preloadPlugins) { + if (plugin['canHandle'](fullname)) { + assert(plugin['handle'].constructor.name === 'AsyncFunction', 'Filesystem plugin handlers must be async functions (See #24914)') + return plugin['handle'](byteArray, fullname); + } + } + // If no plugin handled this file then return the original/unmodified + // byteArray. + return byteArray; + }; + var FS_preloadFile = async (parent, name, url, canRead, canWrite, dontCreateFile, canOwn, preFinish) => { + // TODO we should allow people to just pass in a complete filename instead + // of parent and name being that we just join them anyways + var fullname = name ? PATH_FS.resolve(PATH.join2(parent, name)) : parent; + var dep = getUniqueRunDependency(`cp ${fullname}`); // might have several active requests for the same fullname + addRunDependency(dep); + + try { + var byteArray = url; + if (typeof url == 'string') { + byteArray = await asyncLoad(url); + } + + byteArray = await FS_handledByPreloadPlugin(byteArray, fullname); + preFinish?.(); + if (!dontCreateFile) { + FS_createDataFile(parent, name, byteArray, canRead, canWrite, canOwn); + } + } finally { + removeRunDependency(dep); + } + }; + var FS_createPreloadedFile = (parent, name, url, canRead, canWrite, onload, onerror, dontCreateFile, canOwn, preFinish) => { + FS_preloadFile(parent, name, url, canRead, canWrite, dontCreateFile, canOwn, preFinish).then(onload).catch(onerror); + }; + var FS = { + root:null, + mounts:[], + devices:{ + }, + streams:[], + nextInode:1, + nameTable:null, + currentPath:"/", + initialized:false, + ignorePermissions:true, + filesystems:null, + syncFSRequests:0, + ErrnoError:class extends Error { + name = 'ErrnoError'; + // We set the `name` property to be able to identify `FS.ErrnoError` + // - the `name` is a standard ECMA-262 property of error objects. Kind of good to have it anyway. + // - when using PROXYFS, an error can come from an underlying FS + // as different FS objects have their own FS.ErrnoError each, + // the test `err instanceof FS.ErrnoError` won't detect an error coming from another filesystem, causing bugs. + // we'll use the reliable test `err.name == "ErrnoError"` instead + constructor(errno) { + super(runtimeInitialized ? strError(errno) : ''); + this.errno = errno; + for (var key in ERRNO_CODES) { + if (ERRNO_CODES[key] === errno) { + this.code = key; + break; + } + } + } + }, + FSStream:class { + shared = {}; + get object() { + return this.node; + } + set object(val) { + this.node = val; + } + get isRead() { + return (this.flags & 2097155) !== 1; + } + get isWrite() { + return (this.flags & 2097155) !== 0; + } + get isAppend() { + return (this.flags & 1024); + } + get flags() { + return this.shared.flags; + } + set flags(val) { + this.shared.flags = val; + } + get position() { + return this.shared.position; + } + set position(val) { + this.shared.position = val; + } + }, + FSNode:class { + node_ops = {}; + stream_ops = {}; + readMode = 292 | 73; + writeMode = 146; + mounted = null; + constructor(parent, name, mode, rdev) { + if (!parent) { + parent = this; // root node sets parent to itself + } + this.parent = parent; + this.mount = parent.mount; + this.id = FS.nextInode++; + this.name = name; + this.mode = mode; + this.rdev = rdev; + this.atime = this.mtime = this.ctime = Date.now(); + } + get read() { + return (this.mode & this.readMode) === this.readMode; + } + set read(val) { + val ? this.mode |= this.readMode : this.mode &= ~this.readMode; + } + get write() { + return (this.mode & this.writeMode) === this.writeMode; + } + set write(val) { + val ? this.mode |= this.writeMode : this.mode &= ~this.writeMode; + } + get isFolder() { + return FS.isDir(this.mode); + } + get isDevice() { + return FS.isChrdev(this.mode); + } + }, + lookupPath(path, opts = {}) { + if (!path) { + throw new FS.ErrnoError(44); + } + opts.follow_mount ??= true + + if (!PATH.isAbs(path)) { + path = FS.cwd() + '/' + path; + } + + // limit max consecutive symlinks to SYMLOOP_MAX. + linkloop: for (var nlinks = 0; nlinks < 40; nlinks++) { + // split the absolute path + var parts = path.split('/').filter((p) => !!p); + + // start at the root + var current = FS.root; + var current_path = '/'; + + for (var i = 0; i < parts.length; i++) { + var islast = (i === parts.length-1); + if (islast && opts.parent) { + // stop resolving + break; + } + + if (parts[i] === '.') { + continue; + } + + if (parts[i] === '..') { + current_path = PATH.dirname(current_path); + if (FS.isRoot(current)) { + path = current_path + '/' + parts.slice(i + 1).join('/'); + // We're making progress here, don't let many consecutive ..'s + // lead to ELOOP + nlinks--; + continue linkloop; + } else { + current = current.parent; + } + continue; + } + + current_path = PATH.join2(current_path, parts[i]); + try { + current = FS.lookupNode(current, parts[i]); + } catch (e) { + // if noent_okay is true, suppress a ENOENT in the last component + // and return an object with an undefined node. This is needed for + // resolving symlinks in the path when creating a file. + if ((e?.errno === 44) && islast && opts.noent_okay) { + return { path: current_path }; + } + throw e; + } + + // jump to the mount's root node if this is a mountpoint + if (FS.isMountpoint(current) && (!islast || opts.follow_mount)) { + current = current.mounted.root; + } + + // by default, lookupPath will not follow a symlink if it is the final path component. + // setting opts.follow = true will override this behavior. + if (FS.isLink(current.mode) && (!islast || opts.follow)) { + if (!current.node_ops.readlink) { + throw new FS.ErrnoError(52); + } + var link = current.node_ops.readlink(current); + if (!PATH.isAbs(link)) { + link = PATH.dirname(current_path) + '/' + link; + } + path = link + '/' + parts.slice(i + 1).join('/'); + continue linkloop; + } + } + return { path: current_path, node: current }; + } + throw new FS.ErrnoError(32); + }, + getPath(node) { + var path; + while (true) { + if (FS.isRoot(node)) { + var mount = node.mount.mountpoint; + if (!path) return mount; + return mount[mount.length-1] !== '/' ? `${mount}/${path}` : mount + path; + } + path = path ? `${node.name}/${path}` : node.name; + node = node.parent; + } + }, + hashName(parentid, name) { + var hash = 0; + + for (var i = 0; i < name.length; i++) { + hash = ((hash << 5) - hash + name.charCodeAt(i)) | 0; + } + return ((parentid + hash) >>> 0) % FS.nameTable.length; + }, + hashAddNode(node) { + var hash = FS.hashName(node.parent.id, node.name); + node.name_next = FS.nameTable[hash]; + FS.nameTable[hash] = node; + }, + hashRemoveNode(node) { + var hash = FS.hashName(node.parent.id, node.name); + if (FS.nameTable[hash] === node) { + FS.nameTable[hash] = node.name_next; + } else { + var current = FS.nameTable[hash]; + while (current) { + if (current.name_next === node) { + current.name_next = node.name_next; + break; + } + current = current.name_next; + } + } + }, + lookupNode(parent, name) { + var errCode = FS.mayLookup(parent); + if (errCode) { + throw new FS.ErrnoError(errCode); + } + var hash = FS.hashName(parent.id, name); + for (var node = FS.nameTable[hash]; node; node = node.name_next) { + var nodeName = node.name; + if (node.parent.id === parent.id && nodeName === name) { + return node; + } + } + // if we failed to find it in the cache, call into the VFS + return FS.lookup(parent, name); + }, + createNode(parent, name, mode, rdev) { + assert(typeof parent == 'object') + var node = new FS.FSNode(parent, name, mode, rdev); + + FS.hashAddNode(node); + + return node; + }, + destroyNode(node) { + FS.hashRemoveNode(node); + }, + isRoot(node) { + return node === node.parent; + }, + isMountpoint(node) { + return !!node.mounted; + }, + isFile(mode) { + return (mode & 61440) === 32768; + }, + isDir(mode) { + return (mode & 61440) === 16384; + }, + isLink(mode) { + return (mode & 61440) === 40960; + }, + isChrdev(mode) { + return (mode & 61440) === 8192; + }, + isBlkdev(mode) { + return (mode & 61440) === 24576; + }, + isFIFO(mode) { + return (mode & 61440) === 4096; + }, + isSocket(mode) { + return (mode & 49152) === 49152; + }, + flagsToPermissionString(flag) { + var perms = ['r', 'w', 'rw'][flag & 3]; + if ((flag & 512)) { + perms += 'w'; + } + return perms; + }, + nodePermissions(node, perms) { + if (FS.ignorePermissions) { + return 0; + } + // return 0 if any user, group or owner bits are set. + if (perms.includes('r') && !(node.mode & 292)) { + return 2; + } + if (perms.includes('w') && !(node.mode & 146)) { + return 2; + } + if (perms.includes('x') && !(node.mode & 73)) { + return 2; + } + return 0; + }, + mayLookup(dir) { + if (!FS.isDir(dir.mode)) return 54; + var errCode = FS.nodePermissions(dir, 'x'); + if (errCode) return errCode; + if (!dir.node_ops.lookup) return 2; + return 0; + }, + mayCreate(dir, name) { + if (!FS.isDir(dir.mode)) { + return 54; + } + try { + var node = FS.lookupNode(dir, name); + return 20; + } catch (e) { + } + return FS.nodePermissions(dir, 'wx'); + }, + mayDelete(dir, name, isdir) { + var node; + try { + node = FS.lookupNode(dir, name); + } catch (e) { + return e.errno; + } + var errCode = FS.nodePermissions(dir, 'wx'); + if (errCode) { + return errCode; + } + if (isdir) { + if (!FS.isDir(node.mode)) { + return 54; + } + if (FS.isRoot(node) || FS.getPath(node) === FS.cwd()) { + return 10; + } + } else if (FS.isDir(node.mode)) { + return 31; + } + return 0; + }, + mayOpen(node, flags) { + if (!node) { + return 44; + } + if (FS.isLink(node.mode)) { + return 32; + } + var mode = FS.flagsToPermissionString(flags); + if (FS.isDir(node.mode)) { + // opening for write + // TODO: check for O_SEARCH? (== search for dir only) + if (mode !== 'r' || (flags & (512 | 64))) { + return 31; + } + } + return FS.nodePermissions(node, mode); + }, + checkOpExists(op, err) { + if (!op) { + throw new FS.ErrnoError(err); + } + return op; + }, + MAX_OPEN_FDS:4096, + nextfd() { + for (var fd = 0; fd <= FS.MAX_OPEN_FDS; fd++) { + if (!FS.streams[fd]) { + return fd; + } + } + throw new FS.ErrnoError(33); + }, + getStreamChecked(fd) { + var stream = FS.getStream(fd); + if (!stream) { + throw new FS.ErrnoError(8); + } + return stream; + }, + getStream:(fd) => FS.streams[fd], + createStream(stream, fd = -1) { + assert(fd >= -1); + + // clone it, so we can return an instance of FSStream + stream = Object.assign(new FS.FSStream(), stream); + if (fd == -1) { + fd = FS.nextfd(); + } + stream.fd = fd; + FS.streams[fd] = stream; + return stream; + }, + closeStream(fd) { + FS.streams[fd] = null; + }, + dupStream(origStream, fd = -1) { + var stream = FS.createStream(origStream, fd); + stream.stream_ops?.dup?.(stream); + return stream; + }, + doSetAttr(stream, node, attr) { + var setattr = stream?.stream_ops.setattr; + var arg = setattr ? stream : node; + setattr ??= node.node_ops.setattr; + FS.checkOpExists(setattr, 63) + try { + setattr(arg, attr); + } catch (e) { + if (e instanceof RangeError) { + throw new FS.ErrnoError(22); + } + throw e; + } + }, + chrdev_stream_ops:{ + open(stream) { + var device = FS.getDevice(stream.node.rdev); + // override node's stream ops with the device's + stream.stream_ops = device.stream_ops; + // forward the open call + stream.stream_ops.open?.(stream); + }, + llseek() { + throw new FS.ErrnoError(70); + }, + }, + major:(dev) => ((dev) >> 8), + minor:(dev) => ((dev) & 0xff), + makedev:(ma, mi) => ((ma) << 8 | (mi)), + registerDevice(dev, ops) { + FS.devices[dev] = { stream_ops: ops }; + }, + getDevice:(dev) => FS.devices[dev], + getMounts(mount) { + var mounts = []; + var check = [mount]; + + while (check.length) { + var m = check.pop(); + + mounts.push(m); + + check.push(...m.mounts); + } + + return mounts; + }, + syncfs(populate, callback) { + if (typeof populate == 'function') { + callback = populate; + populate = false; + } + + FS.syncFSRequests++; + + if (FS.syncFSRequests > 1) { + err(`warning: ${FS.syncFSRequests} FS.syncfs operations in flight at once, probably just doing extra work`); + } + + var mounts = FS.getMounts(FS.root.mount); + var completed = 0; + + function doCallback(errCode) { + assert(FS.syncFSRequests > 0); + FS.syncFSRequests--; + return callback(errCode); + } + + function done(errCode) { + if (errCode) { + if (!done.errored) { + done.errored = true; + return doCallback(errCode); + } + return; + } + if (++completed >= mounts.length) { + doCallback(null); + } + }; + + // sync all mounts + for (var mount of mounts) { + if (mount.type.syncfs) { + mount.type.syncfs(mount, populate, done); + } else { + done(null); + } + } + }, + mount(type, opts, mountpoint) { + if (typeof type == 'string') { + // The filesystem was not included, and instead we have an error + // message stored in the variable. + throw type; + } + var root = mountpoint === '/'; + var pseudo = !mountpoint; + var node; + + if (root && FS.root) { + throw new FS.ErrnoError(10); + } else if (!root && !pseudo) { + var lookup = FS.lookupPath(mountpoint, { follow_mount: false }); + + mountpoint = lookup.path; // use the absolute path + node = lookup.node; + + if (FS.isMountpoint(node)) { + throw new FS.ErrnoError(10); + } + + if (!FS.isDir(node.mode)) { + throw new FS.ErrnoError(54); + } + } + + var mount = { + type, + opts, + mountpoint, + mounts: [] + }; + + // create a root node for the fs + var mountRoot = type.mount(mount); + mountRoot.mount = mount; + mount.root = mountRoot; + + if (root) { + FS.root = mountRoot; + } else if (node) { + // set as a mountpoint + node.mounted = mount; + + // add the new mount to the current mount's children + if (node.mount) { + node.mount.mounts.push(mount); + } + } + + return mountRoot; + }, + unmount(mountpoint) { + var lookup = FS.lookupPath(mountpoint, { follow_mount: false }); + + if (!FS.isMountpoint(lookup.node)) { + throw new FS.ErrnoError(28); + } + + // destroy the nodes for this mount, and all its child mounts + var node = lookup.node; + var mount = node.mounted; + var mounts = FS.getMounts(mount); + + for (var [hash, current] of Object.entries(FS.nameTable)) { + while (current) { + var next = current.name_next; + + if (mounts.includes(current.mount)) { + FS.destroyNode(current); + } + + current = next; + } + } + + // no longer a mountpoint + node.mounted = null; + + // remove this mount from the child mounts + var idx = node.mount.mounts.indexOf(mount); + assert(idx !== -1); + node.mount.mounts.splice(idx, 1); + }, + lookup(parent, name) { + return parent.node_ops.lookup(parent, name); + }, + mknod(path, mode, dev) { + var lookup = FS.lookupPath(path, { parent: true }); + var parent = lookup.node; + var name = PATH.basename(path); + if (!name) { + throw new FS.ErrnoError(28); + } + if (name === '.' || name === '..') { + throw new FS.ErrnoError(20); + } + var errCode = FS.mayCreate(parent, name); + if (errCode) { + throw new FS.ErrnoError(errCode); + } + if (!parent.node_ops.mknod) { + throw new FS.ErrnoError(63); + } + return parent.node_ops.mknod(parent, name, mode, dev); + }, + statfs(path) { + return FS.statfsNode(FS.lookupPath(path, {follow: true}).node); + }, + statfsStream(stream) { + // We keep a separate statfsStream function because noderawfs overrides + // it. In noderawfs, stream.node is sometimes null. Instead, we need to + // look at stream.path. + return FS.statfsNode(stream.node); + }, + statfsNode(node) { + // NOTE: None of the defaults here are true. We're just returning safe and + // sane values. Currently nodefs and rawfs replace these defaults, + // other file systems leave them alone. + var rtn = { + bsize: 4096, + frsize: 4096, + blocks: 1e6, + bfree: 5e5, + bavail: 5e5, + files: FS.nextInode, + ffree: FS.nextInode - 1, + fsid: 42, + flags: 2, + namelen: 255, + }; + + if (node.node_ops.statfs) { + Object.assign(rtn, node.node_ops.statfs(node.mount.opts.root)); + } + return rtn; + }, + create(path, mode = 0o666) { + mode &= 4095; + mode |= 32768; + return FS.mknod(path, mode, 0); + }, + mkdir(path, mode = 0o777) { + mode &= 511 | 512; + mode |= 16384; + return FS.mknod(path, mode, 0); + }, + mkdirTree(path, mode) { + var dirs = path.split('/'); + var d = ''; + for (var dir of dirs) { + if (!dir) continue; + if (d || PATH.isAbs(path)) d += '/'; + d += dir; + try { + FS.mkdir(d, mode); + } catch(e) { + if (e.errno != 20) throw e; + } + } + }, + mkdev(path, mode, dev) { + if (typeof dev == 'undefined') { + dev = mode; + mode = 0o666; + } + mode |= 8192; + return FS.mknod(path, mode, dev); + }, + symlink(oldpath, newpath) { + if (!PATH_FS.resolve(oldpath)) { + throw new FS.ErrnoError(44); + } + var lookup = FS.lookupPath(newpath, { parent: true }); + var parent = lookup.node; + if (!parent) { + throw new FS.ErrnoError(44); + } + var newname = PATH.basename(newpath); + var errCode = FS.mayCreate(parent, newname); + if (errCode) { + throw new FS.ErrnoError(errCode); + } + if (!parent.node_ops.symlink) { + throw new FS.ErrnoError(63); + } + return parent.node_ops.symlink(parent, newname, oldpath); + }, + rename(old_path, new_path) { + var old_dirname = PATH.dirname(old_path); + var new_dirname = PATH.dirname(new_path); + var old_name = PATH.basename(old_path); + var new_name = PATH.basename(new_path); + // parents must exist + var lookup, old_dir, new_dir; + + // let the errors from non existent directories percolate up + lookup = FS.lookupPath(old_path, { parent: true }); + old_dir = lookup.node; + lookup = FS.lookupPath(new_path, { parent: true }); + new_dir = lookup.node; + + if (!old_dir || !new_dir) throw new FS.ErrnoError(44); + // need to be part of the same mount + if (old_dir.mount !== new_dir.mount) { + throw new FS.ErrnoError(75); + } + // source must exist + var old_node = FS.lookupNode(old_dir, old_name); + // old path should not be an ancestor of the new path + var relative = PATH_FS.relative(old_path, new_dirname); + if (relative.charAt(0) !== '.') { + throw new FS.ErrnoError(28); + } + // new path should not be an ancestor of the old path + relative = PATH_FS.relative(new_path, old_dirname); + if (relative.charAt(0) !== '.') { + throw new FS.ErrnoError(55); + } + // see if the new path already exists + var new_node; + try { + new_node = FS.lookupNode(new_dir, new_name); + } catch (e) { + // not fatal + } + // early out if nothing needs to change + if (old_node === new_node) { + return; + } + // we'll need to delete the old entry + var isdir = FS.isDir(old_node.mode); + var errCode = FS.mayDelete(old_dir, old_name, isdir); + if (errCode) { + throw new FS.ErrnoError(errCode); + } + // need delete permissions if we'll be overwriting. + // need create permissions if new doesn't already exist. + errCode = new_node ? + FS.mayDelete(new_dir, new_name, isdir) : + FS.mayCreate(new_dir, new_name); + if (errCode) { + throw new FS.ErrnoError(errCode); + } + if (!old_dir.node_ops.rename) { + throw new FS.ErrnoError(63); + } + if (FS.isMountpoint(old_node) || (new_node && FS.isMountpoint(new_node))) { + throw new FS.ErrnoError(10); + } + // if we are going to change the parent, check write permissions + if (new_dir !== old_dir) { + errCode = FS.nodePermissions(old_dir, 'w'); + if (errCode) { + throw new FS.ErrnoError(errCode); + } + } + // remove the node from the lookup hash + FS.hashRemoveNode(old_node); + // do the underlying fs rename + try { + old_dir.node_ops.rename(old_node, new_dir, new_name); + // update old node (we do this here to avoid each backend + // needing to) + old_node.parent = new_dir; + } catch (e) { + throw e; + } finally { + // add the node back to the hash (in case node_ops.rename + // changed its name) + FS.hashAddNode(old_node); + } + }, + rmdir(path) { + var lookup = FS.lookupPath(path, { parent: true }); + var parent = lookup.node; + var name = PATH.basename(path); + var node = FS.lookupNode(parent, name); + var errCode = FS.mayDelete(parent, name, true); + if (errCode) { + throw new FS.ErrnoError(errCode); + } + if (!parent.node_ops.rmdir) { + throw new FS.ErrnoError(63); + } + if (FS.isMountpoint(node)) { + throw new FS.ErrnoError(10); + } + parent.node_ops.rmdir(parent, name); + FS.destroyNode(node); + }, + readdir(path) { + var lookup = FS.lookupPath(path, { follow: true }); + var node = lookup.node; + var readdir = FS.checkOpExists(node.node_ops.readdir, 54); + return readdir(node); + }, + unlink(path) { + var lookup = FS.lookupPath(path, { parent: true }); + var parent = lookup.node; + if (!parent) { + throw new FS.ErrnoError(44); + } + var name = PATH.basename(path); + var node = FS.lookupNode(parent, name); + var errCode = FS.mayDelete(parent, name, false); + if (errCode) { + // According to POSIX, we should map EISDIR to EPERM, but + // we instead do what Linux does (and we must, as we use + // the musl linux libc). + throw new FS.ErrnoError(errCode); + } + if (!parent.node_ops.unlink) { + throw new FS.ErrnoError(63); + } + if (FS.isMountpoint(node)) { + throw new FS.ErrnoError(10); + } + parent.node_ops.unlink(parent, name); + FS.destroyNode(node); + }, + readlink(path) { + var lookup = FS.lookupPath(path); + var link = lookup.node; + if (!link) { + throw new FS.ErrnoError(44); + } + if (!link.node_ops.readlink) { + throw new FS.ErrnoError(28); + } + return link.node_ops.readlink(link); + }, + stat(path, dontFollow) { + var lookup = FS.lookupPath(path, { follow: !dontFollow }); + var node = lookup.node; + var getattr = FS.checkOpExists(node.node_ops.getattr, 63); + return getattr(node); + }, + fstat(fd) { + var stream = FS.getStreamChecked(fd); + var node = stream.node; + var getattr = stream.stream_ops.getattr; + var arg = getattr ? stream : node; + getattr ??= node.node_ops.getattr; + FS.checkOpExists(getattr, 63) + return getattr(arg); + }, + lstat(path) { + return FS.stat(path, true); + }, + doChmod(stream, node, mode, dontFollow) { + FS.doSetAttr(stream, node, { + mode: (mode & 4095) | (node.mode & ~4095), + ctime: Date.now(), + dontFollow + }); + }, + chmod(path, mode, dontFollow) { + var node; + if (typeof path == 'string') { + var lookup = FS.lookupPath(path, { follow: !dontFollow }); + node = lookup.node; + } else { + node = path; + } + FS.doChmod(null, node, mode, dontFollow); + }, + lchmod(path, mode) { + FS.chmod(path, mode, true); + }, + fchmod(fd, mode) { + var stream = FS.getStreamChecked(fd); + FS.doChmod(stream, stream.node, mode, false); + }, + doChown(stream, node, dontFollow) { + FS.doSetAttr(stream, node, { + timestamp: Date.now(), + dontFollow + // we ignore the uid / gid for now + }); + }, + chown(path, uid, gid, dontFollow) { + var node; + if (typeof path == 'string') { + var lookup = FS.lookupPath(path, { follow: !dontFollow }); + node = lookup.node; + } else { + node = path; + } + FS.doChown(null, node, dontFollow); + }, + lchown(path, uid, gid) { + FS.chown(path, uid, gid, true); + }, + fchown(fd, uid, gid) { + var stream = FS.getStreamChecked(fd); + FS.doChown(stream, stream.node, false); + }, + doTruncate(stream, node, len) { + if (FS.isDir(node.mode)) { + throw new FS.ErrnoError(31); + } + if (!FS.isFile(node.mode)) { + throw new FS.ErrnoError(28); + } + var errCode = FS.nodePermissions(node, 'w'); + if (errCode) { + throw new FS.ErrnoError(errCode); + } + FS.doSetAttr(stream, node, { + size: len, + timestamp: Date.now() + }); + }, + truncate(path, len) { + if (len < 0) { + throw new FS.ErrnoError(28); + } + var node; + if (typeof path == 'string') { + var lookup = FS.lookupPath(path, { follow: true }); + node = lookup.node; + } else { + node = path; + } + FS.doTruncate(null, node, len); + }, + ftruncate(fd, len) { + var stream = FS.getStreamChecked(fd); + if (len < 0 || (stream.flags & 2097155) === 0) { + throw new FS.ErrnoError(28); + } + FS.doTruncate(stream, stream.node, len); + }, + utime(path, atime, mtime) { + var lookup = FS.lookupPath(path, { follow: true }); + var node = lookup.node; + var setattr = FS.checkOpExists(node.node_ops.setattr, 63); + setattr(node, { + atime: atime, + mtime: mtime + }); + }, + open(path, flags, mode = 0o666) { + if (path === "") { + throw new FS.ErrnoError(44); + } + flags = FS_modeStringToFlags(flags); + if ((flags & 64)) { + mode = (mode & 4095) | 32768; + } else { + mode = 0; + } + var node; + var isDirPath; + if (typeof path == 'object') { + node = path; + } else { + isDirPath = path.endsWith("/"); + // noent_okay makes it so that if the final component of the path + // doesn't exist, lookupPath returns `node: undefined`. `path` will be + // updated to point to the target of all symlinks. + var lookup = FS.lookupPath(path, { + follow: !(flags & 131072), + noent_okay: true + }); + node = lookup.node; + path = lookup.path; + } + // perhaps we need to create the node + var created = false; + if ((flags & 64)) { + if (node) { + // if O_CREAT and O_EXCL are set, error out if the node already exists + if ((flags & 128)) { + throw new FS.ErrnoError(20); + } + } else if (isDirPath) { + throw new FS.ErrnoError(31); + } else { + // node doesn't exist, try to create it + // Ignore the permission bits here to ensure we can `open` this new + // file below. We use chmod below to apply the permissions once the + // file is open. + node = FS.mknod(path, mode | 0o777, 0); + created = true; + } + } + if (!node) { + throw new FS.ErrnoError(44); + } + // can't truncate a device + if (FS.isChrdev(node.mode)) { + flags &= ~512; + } + // if asked only for a directory, then this must be one + if ((flags & 65536) && !FS.isDir(node.mode)) { + throw new FS.ErrnoError(54); + } + // check permissions, if this is not a file we just created now (it is ok to + // create and write to a file with read-only permissions; it is read-only + // for later use) + if (!created) { + var errCode = FS.mayOpen(node, flags); + if (errCode) { + throw new FS.ErrnoError(errCode); + } + } + // do truncation if necessary + if ((flags & 512) && !created) { + FS.truncate(node, 0); + } + // we've already handled these, don't pass down to the underlying vfs + flags &= ~(128 | 512 | 131072); + + // register the stream with the filesystem + var stream = FS.createStream({ + node, + path: FS.getPath(node), // we want the absolute path to the node + flags, + seekable: true, + position: 0, + stream_ops: node.stream_ops, + // used by the file family libc calls (fopen, fwrite, ferror, etc.) + ungotten: [], + error: false + }); + // call the new stream's open function + if (stream.stream_ops.open) { + stream.stream_ops.open(stream); + } + if (created) { + FS.chmod(node, mode & 0o777); + } + return stream; + }, + close(stream) { + if (FS.isClosed(stream)) { + throw new FS.ErrnoError(8); + } + if (stream.getdents) stream.getdents = null; // free readdir state + try { + if (stream.stream_ops.close) { + stream.stream_ops.close(stream); + } + } catch (e) { + throw e; + } finally { + FS.closeStream(stream.fd); + } + stream.fd = null; + }, + isClosed(stream) { + return stream.fd === null; + }, + llseek(stream, offset, whence) { + if (FS.isClosed(stream)) { + throw new FS.ErrnoError(8); + } + if (!stream.seekable || !stream.stream_ops.llseek) { + throw new FS.ErrnoError(70); + } + if (whence != 0 && whence != 1 && whence != 2) { + throw new FS.ErrnoError(28); + } + stream.position = stream.stream_ops.llseek(stream, offset, whence); + stream.ungotten = []; + return stream.position; + }, + read(stream, buffer, offset, length, position) { + assert(offset >= 0); + if (length < 0 || position < 0) { + throw new FS.ErrnoError(28); + } + if (FS.isClosed(stream)) { + throw new FS.ErrnoError(8); + } + if ((stream.flags & 2097155) === 1) { + throw new FS.ErrnoError(8); + } + if (FS.isDir(stream.node.mode)) { + throw new FS.ErrnoError(31); + } + if (!stream.stream_ops.read) { + throw new FS.ErrnoError(28); + } + var seeking = typeof position != 'undefined'; + if (!seeking) { + position = stream.position; + } else if (!stream.seekable) { + throw new FS.ErrnoError(70); + } + var bytesRead = stream.stream_ops.read(stream, buffer, offset, length, position); + if (!seeking) stream.position += bytesRead; + return bytesRead; + }, + write(stream, buffer, offset, length, position, canOwn) { + assert(offset >= 0); + assert(buffer.subarray, 'FS.write expects a TypedArray'); + if (length < 0 || position < 0) { + throw new FS.ErrnoError(28); + } + if (FS.isClosed(stream)) { + throw new FS.ErrnoError(8); + } + if ((stream.flags & 2097155) === 0) { + throw new FS.ErrnoError(8); + } + if (FS.isDir(stream.node.mode)) { + throw new FS.ErrnoError(31); + } + if (!stream.stream_ops.write) { + throw new FS.ErrnoError(28); + } + if (stream.seekable && stream.flags & 1024) { + // seek to the end before writing in append mode + FS.llseek(stream, 0, 2); + } + var seeking = typeof position != 'undefined'; + if (!seeking) { + position = stream.position; + } else if (!stream.seekable) { + throw new FS.ErrnoError(70); + } + var bytesWritten = stream.stream_ops.write(stream, buffer, offset, length, position, canOwn); + if (!seeking) stream.position += bytesWritten; + return bytesWritten; + }, + mmap(stream, length, position, prot, flags) { + // User requests writing to file (prot & PROT_WRITE != 0). + // Checking if we have permissions to write to the file unless + // MAP_PRIVATE flag is set. According to POSIX spec it is possible + // to write to file opened in read-only mode with MAP_PRIVATE flag, + // as all modifications will be visible only in the memory of + // the current process. + if ((prot & 2) !== 0 + && (flags & 2) === 0 + && (stream.flags & 2097155) !== 2) { + throw new FS.ErrnoError(2); + } + if ((stream.flags & 2097155) === 1) { + throw new FS.ErrnoError(2); + } + if (!stream.stream_ops.mmap) { + throw new FS.ErrnoError(43); + } + if (!length) { + throw new FS.ErrnoError(28); + } + return stream.stream_ops.mmap(stream, length, position, prot, flags); + }, + msync(stream, buffer, offset, length, mmapFlags) { + assert(offset >= 0); + if (!stream.stream_ops.msync) { + return 0; + } + return stream.stream_ops.msync(stream, buffer, offset, length, mmapFlags); + }, + ioctl(stream, cmd, arg) { + if (!stream.stream_ops.ioctl) { + throw new FS.ErrnoError(59); + } + return stream.stream_ops.ioctl(stream, cmd, arg); + }, + readFile(path, opts = {}) { + opts.flags = opts.flags ?? 0; + opts.encoding = opts.encoding ?? 'binary'; + if (opts.encoding !== 'utf8' && opts.encoding !== 'binary') { + abort(`Invalid encoding type "${opts.encoding}"`); + } + var stream = FS.open(path, opts.flags); + var stat = FS.stat(path); + var length = stat.size; + var buf = new Uint8Array(length); + FS.read(stream, buf, 0, length, 0); + if (opts.encoding === 'utf8') { + buf = UTF8ArrayToString(buf); + } + FS.close(stream); + return buf; + }, + writeFile(path, data, opts = {}) { + opts.flags = opts.flags ?? 577; + var stream = FS.open(path, opts.flags, opts.mode); + data = FS_fileDataToTypedArray(data); + FS.write(stream, data, 0, data.byteLength, undefined, opts.canOwn); + FS.close(stream); + }, + cwd:() => FS.currentPath, + chdir(path) { + var lookup = FS.lookupPath(path, { follow: true }); + if (lookup.node === null) { + throw new FS.ErrnoError(44); + } + if (!FS.isDir(lookup.node.mode)) { + throw new FS.ErrnoError(54); + } + var errCode = FS.nodePermissions(lookup.node, 'x'); + if (errCode) { + throw new FS.ErrnoError(errCode); + } + FS.currentPath = lookup.path; + }, + createDefaultDirectories() { + FS.mkdir('/tmp'); + FS.mkdir('/home'); + FS.mkdir('/home/web_user'); + }, + createDefaultDevices() { + // create /dev + FS.mkdir('/dev'); + // setup /dev/null + FS.registerDevice(FS.makedev(1, 3), { + read: () => 0, + write: (stream, buffer, offset, length, pos) => length, + llseek: () => 0, + }); + FS.mkdev('/dev/null', FS.makedev(1, 3)); + // setup /dev/tty and /dev/tty1 + // stderr needs to print output using err() rather than out() + // so we register a second tty just for it. + TTY.register(FS.makedev(5, 0), TTY.default_tty_ops); + TTY.register(FS.makedev(6, 0), TTY.default_tty1_ops); + FS.mkdev('/dev/tty', FS.makedev(5, 0)); + FS.mkdev('/dev/tty1', FS.makedev(6, 0)); + // setup /dev/[u]random + // use a buffer to avoid overhead of individual crypto calls per byte + var randomBuffer = new Uint8Array(1024), randomLeft = 0; + var randomByte = () => { + if (randomLeft === 0) { + randomFill(randomBuffer); + randomLeft = randomBuffer.byteLength; + } + return randomBuffer[--randomLeft]; + }; + FS.createDevice('/dev', 'random', randomByte); + FS.createDevice('/dev', 'urandom', randomByte); + // we're not going to emulate the actual shm device, + // just create the tmp dirs that reside in it commonly + FS.mkdir('/dev/shm'); + FS.mkdir('/dev/shm/tmp'); + }, + createSpecialDirectories() { + // create /proc/self/fd which allows /proc/self/fd/6 => readlink gives the + // name of the stream for fd 6 (see test_unistd_ttyname) + FS.mkdir('/proc'); + var proc_self = FS.mkdir('/proc/self'); + FS.mkdir('/proc/self/fd'); + FS.mount({ + mount() { + var node = FS.createNode(proc_self, 'fd', 16895, 73); + node.stream_ops = { + llseek: MEMFS.stream_ops.llseek, + }; + node.node_ops = { + lookup(parent, name) { + var fd = +name; + var stream = FS.getStreamChecked(fd); + var ret = { + parent: null, + mount: { mountpoint: 'fake' }, + node_ops: { readlink: () => stream.path }, + id: fd + 1, + }; + ret.parent = ret; // make it look like a simple root node + return ret; + }, + readdir() { + return Array.from(FS.streams.entries()) + .filter(([k, v]) => v) + .map(([k, v]) => k.toString()); + } + }; + return node; + } + }, {}, '/proc/self/fd'); + }, + createStandardStreams(input, output, error) { + // TODO deprecate the old functionality of a single + // input / output callback and that utilizes FS.createDevice + // and instead require a unique set of stream ops + + // by default, we symlink the standard streams to the + // default tty devices. however, if the standard streams + // have been overwritten we create a unique device for + // them instead. + if (input) { + FS.createDevice('/dev', 'stdin', input); + } else { + FS.symlink('/dev/tty', '/dev/stdin'); + } + if (output) { + FS.createDevice('/dev', 'stdout', null, output); + } else { + FS.symlink('/dev/tty', '/dev/stdout'); + } + if (error) { + FS.createDevice('/dev', 'stderr', null, error); + } else { + FS.symlink('/dev/tty1', '/dev/stderr'); + } + + // open default streams for the stdin, stdout and stderr devices + var stdin = FS.open('/dev/stdin', 0); + var stdout = FS.open('/dev/stdout', 1); + var stderr = FS.open('/dev/stderr', 1); + assert(stdin.fd === 0, `invalid handle for stdin (${stdin.fd})`); + assert(stdout.fd === 1, `invalid handle for stdout (${stdout.fd})`); + assert(stderr.fd === 2, `invalid handle for stderr (${stderr.fd})`); + }, + staticInit() { + FS.nameTable = new Array(4096); + + FS.mount(MEMFS, {}, '/'); + + FS.createDefaultDirectories(); + FS.createDefaultDevices(); + FS.createSpecialDirectories(); + + FS.filesystems = { + 'MEMFS': MEMFS, + }; + }, + init(input, output, error) { + assert(!FS.initialized, 'FS.init was previously called. If you want to initialize later with custom parameters, remove any earlier calls (note that one is automatically added to the generated code)'); + FS.initialized = true; + + // Allow Module.stdin etc. to provide defaults, if none explicitly passed to us here + input ??= Module['stdin']; + output ??= Module['stdout']; + error ??= Module['stderr']; + + FS.createStandardStreams(input, output, error); + }, + quit() { + FS.initialized = false; + // force-flush all streams, so we get musl std streams printed out + _fflush(0); + // close all of our streams + for (var stream of FS.streams) { + if (stream) { + FS.close(stream); + } + } + }, + findObject(path, dontResolveLastLink) { + var ret = FS.analyzePath(path, dontResolveLastLink); + if (!ret.exists) { + return null; + } + return ret.object; + }, + analyzePath(path, dontResolveLastLink) { + // operate from within the context of the symlink's target + try { + var lookup = FS.lookupPath(path, { follow: !dontResolveLastLink }); + path = lookup.path; + } catch (e) { + } + var ret = { + isRoot: false, exists: false, error: 0, name: null, path: null, object: null, + parentExists: false, parentPath: null, parentObject: null + }; + try { + var lookup = FS.lookupPath(path, { parent: true }); + ret.parentExists = true; + ret.parentPath = lookup.path; + ret.parentObject = lookup.node; + ret.name = PATH.basename(path); + lookup = FS.lookupPath(path, { follow: !dontResolveLastLink }); + ret.exists = true; + ret.path = lookup.path; + ret.object = lookup.node; + ret.name = lookup.node.name; + ret.isRoot = lookup.path === '/'; + } catch (e) { + ret.error = e.errno; + }; + return ret; + }, + createPath(parent, path, canRead, canWrite) { + parent = typeof parent == 'string' ? parent : FS.getPath(parent); + var parts = path.split('/').reverse(); + while (parts.length) { + var part = parts.pop(); + if (!part) continue; + var current = PATH.join2(parent, part); + try { + FS.mkdir(current); + } catch (e) { + if (e.errno != 20) throw e; + } + parent = current; + } + return current; + }, + createFile(parent, name, properties, canRead, canWrite) { + var path = PATH.join2(typeof parent == 'string' ? parent : FS.getPath(parent), name); + var mode = FS_getMode(canRead, canWrite); + return FS.create(path, mode); + }, + createDataFile(parent, name, data, canRead, canWrite, canOwn) { + var path = name; + if (parent) { + parent = typeof parent == 'string' ? parent : FS.getPath(parent); + path = name ? PATH.join2(parent, name) : parent; + } + var mode = FS_getMode(canRead, canWrite); + var node = FS.create(path, mode); + if (data) { + data = FS_fileDataToTypedArray(data); + // make sure we can write to the file + FS.chmod(node, mode | 146); + var stream = FS.open(node, 577); + FS.write(stream, data, 0, data.length, 0, canOwn); + FS.close(stream); + FS.chmod(node, mode); + } + }, + createDevice(parent, name, input, output) { + var path = PATH.join2(typeof parent == 'string' ? parent : FS.getPath(parent), name); + var mode = FS_getMode(!!input, !!output); + FS.createDevice.major ??= 64; + var dev = FS.makedev(FS.createDevice.major++, 0); + // Create a fake device that a set of stream ops to emulate + // the old behavior. + FS.registerDevice(dev, { + open(stream) { + stream.seekable = false; + }, + close(stream) { + // flush any pending line data + if (output?.buffer?.length) { + output(10); + } + }, + read(stream, buffer, offset, length, pos /* ignored */) { + var bytesRead = 0; + for (var i = 0; i < length; i++) { + var result; + try { + result = input(); + } catch (e) { + throw new FS.ErrnoError(29); + } + if (result === undefined && bytesRead === 0) { + throw new FS.ErrnoError(6); + } + if (result === null || result === undefined) break; + bytesRead++; + buffer[offset+i] = result; + } + if (bytesRead) { + stream.node.atime = Date.now(); + } + return bytesRead; + }, + write(stream, buffer, offset, length, pos) { + for (var i = 0; i < length; i++) { + try { + output(buffer[offset+i]); + } catch (e) { + throw new FS.ErrnoError(29); + } + } + if (length) { + stream.node.mtime = stream.node.ctime = Date.now(); + } + return i; + } + }); + return FS.mkdev(path, mode, dev); + }, + forceLoadFile(obj) { + if (obj.isDevice || obj.isFolder || obj.link || obj.contents) return true; + if (globalThis.XMLHttpRequest) { + abort("Lazy loading should have been performed (contents set) in createLazyFile, but it was not. Lazy loading only works in web workers. Use --embed-file or --preload-file in emcc on the main thread."); + } else { // Command-line. + try { + obj.contents = readBinary(obj.url); + } catch (e) { + throw new FS.ErrnoError(29); + } + } + }, + createLazyFile(parent, name, url, canRead, canWrite) { + // Lazy chunked Uint8Array (implements get and length from Uint8Array). + // Actual getting is abstracted away for eventual reuse. + class LazyUint8Array { + lengthKnown = false; + chunks = []; // Loaded chunks. Index is the chunk number + get(idx) { + if (idx > this.length-1 || idx < 0) { + return undefined; + } + var chunkOffset = idx % this.chunkSize; + var chunkNum = (idx / this.chunkSize)|0; + return this.getter(chunkNum)[chunkOffset]; + } + setDataGetter(getter) { + this.getter = getter; + } + cacheLength() { + // Find length + var xhr = new XMLHttpRequest(); + xhr.open('HEAD', url, false); + xhr.send(null); + if (!(xhr.status >= 200 && xhr.status < 300 || xhr.status === 304)) abort("Couldn't load " + url + ". Status: " + xhr.status); + var datalength = Number(xhr.getResponseHeader("Content-length")); + var header; + var hasByteServing = (header = xhr.getResponseHeader("Accept-Ranges")) && header === "bytes"; + var usesGzip = (header = xhr.getResponseHeader("Content-Encoding")) && header === "gzip"; + + var chunkSize = 1024*1024; // Chunk size in bytes + + if (!hasByteServing) chunkSize = datalength; + + // Function to get a range from the remote URL. + var doXHR = (from, to) => { + if (from > to) abort(`invalid range (${from}, ${to}) or no bytes requested!`); + if (to > datalength-1) abort(`only ${datalength} bytes available! programmer error!`); + + // TODO: Use mozResponseArrayBuffer, responseStream, etc. if available. + var xhr = new XMLHttpRequest(); + xhr.open('GET', url, false); + if (datalength !== chunkSize) xhr.setRequestHeader("Range", "bytes=" + from + "-" + to); + + // Some hints to the browser that we want binary data. + xhr.responseType = 'arraybuffer'; + if (xhr.overrideMimeType) { + xhr.overrideMimeType('text/plain; charset=x-user-defined'); + } + + xhr.send(null); + if (!(xhr.status >= 200 && xhr.status < 300 || xhr.status === 304)) abort("Couldn't load " + url + ". Status: " + xhr.status); + if (xhr.response !== undefined) { + return new Uint8Array(/** @type{Array} */(xhr.response || [])); + } + return intArrayFromString(xhr.responseText ?? '', true); + }; + var lazyArray = this; + lazyArray.setDataGetter((chunkNum) => { + var start = chunkNum * chunkSize; + var end = (chunkNum+1) * chunkSize - 1; // including this byte + end = Math.min(end, datalength-1); // if datalength-1 is selected, this is the last block + if (typeof lazyArray.chunks[chunkNum] == 'undefined') { + lazyArray.chunks[chunkNum] = doXHR(start, end); + } + if (typeof lazyArray.chunks[chunkNum] == 'undefined') abort('doXHR failed!'); + return lazyArray.chunks[chunkNum]; + }); + + if (usesGzip || !datalength) { + // if the server uses gzip or doesn't supply the length, we have to download the whole file to get the (uncompressed) length + chunkSize = datalength = 1; // this will force getter(0)/doXHR do download the whole file + datalength = this.getter(0).length; + chunkSize = datalength; + out("LazyFiles on gzip forces download of the whole file when length is accessed"); + } + + this._length = datalength; + this._chunkSize = chunkSize; + this.lengthKnown = true; + } + get length() { + if (!this.lengthKnown) { + this.cacheLength(); + } + return this._length; + } + get chunkSize() { + if (!this.lengthKnown) { + this.cacheLength(); + } + return this._chunkSize; + } + } + + if (globalThis.XMLHttpRequest) { + if (!ENVIRONMENT_IS_WORKER) abort('Cannot do synchronous binary XHRs outside webworkers in modern browsers. Use --embed-file or --preload-file in emcc'); + var lazyArray = new LazyUint8Array(); + var properties = { isDevice: false, contents: lazyArray }; + } else { + var properties = { isDevice: false, url: url }; + } + + var node = FS.createFile(parent, name, properties, canRead, canWrite); + // This is a total hack, but I want to get this lazy file code out of the + // core of MEMFS. If we want to keep this lazy file concept I feel it should + // be its own thin LAZYFS proxying calls to MEMFS. + if (properties.contents) { + node.contents = properties.contents; + } else if (properties.url) { + node.contents = null; + node.url = properties.url; + } + // Add a function that defers querying the file size until it is asked the first time. + Object.defineProperties(node, { + usedBytes: { + get: function() { return this.contents.length; } + } + }); + // override each stream op with one that tries to force load the lazy file first + var stream_ops = {}; + for (const [key, fn] of Object.entries(node.stream_ops)) { + stream_ops[key] = (...args) => { + FS.forceLoadFile(node); + return fn(...args); + }; + } + function writeChunks(stream, buffer, offset, length, position) { + var contents = stream.node.contents; + if (position >= contents.length) + return 0; + var size = Math.min(contents.length - position, length); + assert(size >= 0); + if (contents.slice) { // normal array + for (var i = 0; i < size; i++) { + buffer[offset + i] = contents[position + i]; + } + } else { + for (var i = 0; i < size; i++) { // LazyUint8Array from sync binary XHR + buffer[offset + i] = contents.get(position + i); + } + } + return size; + } + // use a custom read function + stream_ops.read = (stream, buffer, offset, length, position) => { + FS.forceLoadFile(node); + return writeChunks(stream, buffer, offset, length, position) + }; + // use a custom mmap function + stream_ops.mmap = (stream, length, position, prot, flags) => { + FS.forceLoadFile(node); + var ptr = mmapAlloc(length); + if (!ptr) { + throw new FS.ErrnoError(48); + } + writeChunks(stream, HEAP8, ptr, length, position); + return { ptr, allocated: true }; + }; + node.stream_ops = stream_ops; + return node; + }, + }; + + var SYSCALLS = { + currentUmask:18, + calculateAt(dirfd, path, allowEmpty) { + if (PATH.isAbs(path)) { + return path; + } + // relative path + var dir; + if (dirfd === -100) { + dir = FS.cwd(); + } else { + var dirstream = SYSCALLS.getStreamFromFD(dirfd); + dir = dirstream.path; + } + if (path.length == 0) { + if (!allowEmpty) { + throw new FS.ErrnoError(44);; + } + return dir; + } + return dir + '/' + path; + }, + writeStat(buf, stat) { + HEAPU32[((buf)>>2)] = stat.dev; + HEAPU32[(((buf)+(4))>>2)] = stat.mode; + HEAPU32[(((buf)+(8))>>2)] = stat.nlink; + HEAPU32[(((buf)+(12))>>2)] = stat.uid; + HEAPU32[(((buf)+(16))>>2)] = stat.gid; + HEAPU32[(((buf)+(20))>>2)] = stat.rdev; + HEAP64[(((buf)+(24))>>3)] = BigInt(stat.size); + HEAP32[(((buf)+(32))>>2)] = 4096; + HEAP32[(((buf)+(36))>>2)] = stat.blocks; + var atime = stat.atime.getTime(); + var mtime = stat.mtime.getTime(); + var ctime = stat.ctime.getTime(); + HEAP64[(((buf)+(40))>>3)] = BigInt(Math.floor(atime / 1000)); + HEAPU32[(((buf)+(48))>>2)] = (atime % 1000) * 1000 * 1000; + HEAP64[(((buf)+(56))>>3)] = BigInt(Math.floor(mtime / 1000)); + HEAPU32[(((buf)+(64))>>2)] = (mtime % 1000) * 1000 * 1000; + HEAP64[(((buf)+(72))>>3)] = BigInt(Math.floor(ctime / 1000)); + HEAPU32[(((buf)+(80))>>2)] = (ctime % 1000) * 1000 * 1000; + HEAP64[(((buf)+(88))>>3)] = BigInt(stat.ino); + return 0; + }, + writeStatFs(buf, stats) { + HEAPU32[(((buf)+(4))>>2)] = stats.bsize; + HEAPU32[(((buf)+(60))>>2)] = stats.bsize; + HEAP64[(((buf)+(8))>>3)] = BigInt(stats.blocks); + HEAP64[(((buf)+(16))>>3)] = BigInt(stats.bfree); + HEAP64[(((buf)+(24))>>3)] = BigInt(stats.bavail); + HEAP64[(((buf)+(32))>>3)] = BigInt(stats.files); + HEAP64[(((buf)+(40))>>3)] = BigInt(stats.ffree); + HEAPU32[(((buf)+(48))>>2)] = stats.fsid; + HEAPU32[(((buf)+(64))>>2)] = stats.flags; // ST_NOSUID + HEAPU32[(((buf)+(56))>>2)] = stats.namelen; + }, + doMsync(addr, stream, len, flags, offset) { + if (!FS.isFile(stream.node.mode)) { + throw new FS.ErrnoError(43); + } + if (flags & 2) { + // MAP_PRIVATE calls need not to be synced back to underlying fs + return 0; + } + var buffer = HEAPU8.slice(addr, addr + len); + FS.msync(stream, buffer, offset, len, flags); + }, + getStreamFromFD(fd) { + var stream = FS.getStreamChecked(fd); + return stream; + }, + varargs:undefined, + getStr(ptr) { + var ret = UTF8ToString(ptr); + return ret; + }, + }; + function ___syscall_faccessat(dirfd, path, amode, flags) { + try { + + path = SYSCALLS.getStr(path); + assert(!flags || flags == 512); + path = SYSCALLS.calculateAt(dirfd, path); + if (amode & ~7) { + // need a valid mode + return -28; + } + var lookup = FS.lookupPath(path, { follow: true }); + var node = lookup.node; + if (!node) { + return -44; + } + var perms = ''; + if (amode & 4) perms += 'r'; + if (amode & 2) perms += 'w'; + if (amode & 1) perms += 'x'; + if (perms /* otherwise, they've just passed F_OK */ && FS.nodePermissions(node, perms)) { + return -2; + } + return 0; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + + var syscallGetVarargI = () => { + assert(SYSCALLS.varargs != undefined); + // the `+` prepended here is necessary to convince the JSCompiler that varargs is indeed a number. + var ret = HEAP32[((+SYSCALLS.varargs)>>2)]; + SYSCALLS.varargs += 4; + return ret; + }; + var syscallGetVarargP = syscallGetVarargI; + + + function ___syscall_fcntl64(fd, cmd, varargs) { + SYSCALLS.varargs = varargs; + try { + + var stream = SYSCALLS.getStreamFromFD(fd); + switch (cmd) { + case 0: { + var arg = syscallGetVarargI(); + if (arg < 0) { + return -28; + } + while (FS.streams[arg]) { + arg++; + } + var newStream; + newStream = FS.dupStream(stream, arg); + return newStream.fd; + } + case 1: + case 2: + return 0; // FD_CLOEXEC makes no sense for a single process. + case 3: + return stream.flags; + case 4: { + var arg = syscallGetVarargI(); + var mask = 289792; + stream.flags = (stream.flags & ~mask) | (arg & mask); + return 0; + } + case 12: { + var arg = syscallGetVarargP(); + var offset = 0; + // We're always unlocked. + HEAP16[(((arg)+(offset))>>1)] = 2; + return 0; + } + case 13: + case 14: + // Pretend that the locking is successful. These are process-level locks, + // and Emscripten programs are a single process. If we supported linking a + // filesystem between programs, we'd need to do more here. + // See https://github.com/emscripten-core/emscripten/issues/23697 + return 0; + } + return -28; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + + + var stringToUTF8 = (str, outPtr, maxBytesToWrite) => { + assert(typeof maxBytesToWrite == 'number', 'stringToUTF8 requires a third parameter that specifies the length of the output buffer'); + return stringToUTF8Array(str, HEAPU8, outPtr, maxBytesToWrite); + }; + function ___syscall_getcwd(buf, size) { + try { + + if (size === 0) return -28; + var cwd = FS.cwd(); + var cwdLengthInBytes = lengthBytesUTF8(cwd) + 1; + if (size < cwdLengthInBytes) return -68; + stringToUTF8(cwd, buf, size); + return cwdLengthInBytes; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + + + function ___syscall_ioctl(fd, op, varargs) { + SYSCALLS.varargs = varargs; + try { + + var stream = SYSCALLS.getStreamFromFD(fd); + switch (op) { + case 21509: { + if (!stream.tty) return -59; + return 0; + } + case 21505: { + if (!stream.tty) return -59; + if (stream.tty.ops.ioctl_tcgets) { + var termios = stream.tty.ops.ioctl_tcgets(stream); + var argp = syscallGetVarargP(); + HEAP32[((argp)>>2)] = termios.c_iflag || 0; + HEAP32[(((argp)+(4))>>2)] = termios.c_oflag || 0; + HEAP32[(((argp)+(8))>>2)] = termios.c_cflag || 0; + HEAP32[(((argp)+(12))>>2)] = termios.c_lflag || 0; + for (var i = 0; i < 32; i++) { + HEAP8[(argp + i)+(17)] = termios.c_cc[i] || 0; + } + return 0; + } + return 0; + } + case 21510: + case 21511: + case 21512: { + if (!stream.tty) return -59; + return 0; // no-op, not actually adjusting terminal settings + } + case 21506: + case 21507: + case 21508: { + if (!stream.tty) return -59; + if (stream.tty.ops.ioctl_tcsets) { + var argp = syscallGetVarargP(); + var c_iflag = HEAP32[((argp)>>2)]; + var c_oflag = HEAP32[(((argp)+(4))>>2)]; + var c_cflag = HEAP32[(((argp)+(8))>>2)]; + var c_lflag = HEAP32[(((argp)+(12))>>2)]; + var c_cc = [] + for (var i = 0; i < 32; i++) { + c_cc.push(HEAP8[(argp + i)+(17)]); + } + return stream.tty.ops.ioctl_tcsets(stream.tty, op, { c_iflag, c_oflag, c_cflag, c_lflag, c_cc }); + } + return 0; // no-op, not actually adjusting terminal settings + } + case 21519: { + if (!stream.tty) return -59; + var argp = syscallGetVarargP(); + HEAP32[((argp)>>2)] = 0; + return 0; + } + case 21520: { + if (!stream.tty) return -59; + return -28; // not supported + } + case 21537: + case 21531: { + var argp = syscallGetVarargP(); + return FS.ioctl(stream, op, argp); + } + case 21523: { + // TODO: in theory we should write to the winsize struct that gets + // passed in, but for now musl doesn't read anything on it + if (!stream.tty) return -59; + if (stream.tty.ops.ioctl_tiocgwinsz) { + var winsize = stream.tty.ops.ioctl_tiocgwinsz(stream.tty); + var argp = syscallGetVarargP(); + HEAP16[((argp)>>1)] = winsize[0]; + HEAP16[(((argp)+(2))>>1)] = winsize[1]; + } + return 0; + } + case 21524: { + // TODO: technically, this ioctl call should change the window size. + // but, since emscripten doesn't have any concept of a terminal window + // yet, we'll just silently throw it away as we do TIOCGWINSZ + if (!stream.tty) return -59; + return 0; + } + case 21515: { + if (!stream.tty) return -59; + return 0; + } + default: return -28; // not supported + } + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + + + function ___syscall_openat(dirfd, path, flags, varargs) { + SYSCALLS.varargs = varargs; + try { + + path = SYSCALLS.getStr(path); + path = SYSCALLS.calculateAt(dirfd, path); + var mode = varargs ? syscallGetVarargI() : 0; + if (flags & 64) { + mode &= ~SYSCALLS.currentUmask; + } + return FS.open(path, flags, mode).fd; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + + var __abort_js = () => + abort('native code called abort()'); + + var _emscripten_get_now = () => performance.now(); + + var _emscripten_date_now = () => Date.now(); + + var nowIsMonotonic = 1; + + var checkWasiClock = (clock_id) => clock_id >= 0 && clock_id <= 3; + + var INT53_MAX = 9007199254740992; + + var INT53_MIN = -9007199254740992; + var bigintToI53Checked = (num) => (num < INT53_MIN || num > INT53_MAX) ? NaN : Number(num); + function _clock_time_get(clk_id, ignored_precision, ptime) { + ignored_precision = bigintToI53Checked(ignored_precision); + + + if (!checkWasiClock(clk_id)) { + return 28; + } + var now; + // all wasi clocks but realtime are monotonic + if (clk_id === 0) { + now = _emscripten_date_now(); + } else if (nowIsMonotonic) { + now = _emscripten_get_now(); + } else { + return 52; + } + // "now" is in ms, and wasi times are in ns. + var nsec = Math.round(now * 1000 * 1000); + HEAP64[((ptime)>>3)] = BigInt(nsec); + return 0; + ; + } + + var readEmAsmArgsArray = []; + var readEmAsmArgs = (sigPtr, buf) => { + // Nobody should have mutated _readEmAsmArgsArray underneath us to be something else than an array. + assert(Array.isArray(readEmAsmArgsArray)); + // The input buffer is allocated on the stack, so it must be stack-aligned. + assert(buf % 16 == 0); + readEmAsmArgsArray.length = 0; + var ch; + // Most arguments are i32s, so shift the buffer pointer so it is a plain + // index into HEAP32. + while (ch = HEAPU8[sigPtr++]) { + var chr = String.fromCharCode(ch); + var validChars = ['d', 'f', 'i', 'p']; + // In WASM_BIGINT mode we support passing i64 values as bigint. + validChars.push('j'); + assert(validChars.includes(chr), `Invalid character ${ch}("${chr}") in readEmAsmArgs! Use only [${validChars}], and do not specify "v" for void return argument.`); + // Floats are always passed as doubles, so all types except for 'i' + // are 8 bytes and require alignment. + var wide = (ch != 105); + wide &= (ch != 112); + buf += wide && (buf % 8) ? 4 : 0; + readEmAsmArgsArray.push( + // Special case for pointers under wasm64 or CAN_ADDRESS_2GB mode. + ch == 112 ? HEAPU32[((buf)>>2)] : + ch == 106 ? HEAP64[((buf)>>3)] : + ch == 105 ? + HEAP32[((buf)>>2)] : + HEAPF64[((buf)>>3)] + ); + buf += wide ? 8 : 4; + } + return readEmAsmArgsArray; + }; + var runEmAsmFunction = (code, sigPtr, argbuf) => { + var args = readEmAsmArgs(sigPtr, argbuf); + assert(ASM_CONSTS.hasOwnProperty(code), `No EM_ASM constant found at address ${code}. The loaded WebAssembly file is likely out of sync with the generated JavaScript.`); + return ASM_CONSTS[code](...args); + }; + var _emscripten_asm_const_int = (code, sigPtr, argbuf) => { + return runEmAsmFunction(code, sigPtr, argbuf); + }; + + + var maybeCStringToJsString = (cString) => { + // "cString > 2" checks if the input is a number, and isn't of the special + // values we accept here, EMSCRIPTEN_EVENT_TARGET_* (which map to 0, 1, 2). + // In other words, if cString > 2 then it's a pointer to a valid place in + // memory, and points to a C string. + return cString > 2 ? UTF8ToString(cString) : cString; + }; + + /** @type {Object} */ + var specialHTMLTargets = [0, globalThis.document ?? 0, globalThis.window ?? 0]; + var findEventTarget = (target) => { + target = maybeCStringToJsString(target); + var domElement = specialHTMLTargets[target] || globalThis.document?.querySelector(target); + return domElement; + }; + + var getBoundingClientRect = (e) => specialHTMLTargets.indexOf(e) < 0 ? e.getBoundingClientRect() : {'left':0,'top':0}; + var _emscripten_get_element_css_size = (target, width, height) => { + target = findEventTarget(target); + if (!target) return -4; + + var rect = getBoundingClientRect(target); + HEAPF64[((width)>>3)] = rect.width; + HEAPF64[((height)>>3)] = rect.height; + + return 0; + }; + + var onExits = []; + var addOnExit = (cb) => onExits.push(cb); + var JSEvents = { + removeAllEventListeners() { + while (JSEvents.eventHandlers.length) { + JSEvents._removeHandler(JSEvents.eventHandlers.length - 1); + } + JSEvents.deferredCalls = []; + }, + inEventHandler:0, + deferredCalls:[], + deferCall(targetFunction, precedence, argsList) { + function arraysHaveEqualContent(arrA, arrB) { + if (arrA.length != arrB.length) return false; + + for (var i in arrA) { + if (arrA[i] != arrB[i]) return false; + } + return true; + } + // Test if the given call was already queued, and if so, don't add it again. + for (var call of JSEvents.deferredCalls) { + if (call.targetFunction == targetFunction && arraysHaveEqualContent(call.argsList, argsList)) { + return; + } + } + JSEvents.deferredCalls.push({ + targetFunction, + precedence, + argsList + }); + + JSEvents.deferredCalls.sort((x,y) => x.precedence - y.precedence); + }, + removeDeferredCalls(targetFunction) { + JSEvents.deferredCalls = JSEvents.deferredCalls.filter((call) => call.targetFunction != targetFunction); + }, + canPerformEventHandlerRequests() { + // Browsers that support navigator.userActivation.isActive: https://developer.mozilla.org/en-US/docs/Web/API/UserActivation/isActive + if (navigator.userActivation) { + // Verify against transient activation status from UserActivation API + // whether it is possible to perform a request here without needing to defer. See + // https://developer.mozilla.org/en-US/docs/Web/Security/User_activation#transient_activation + // and https://caniuse.com/mdn-api_useractivation + return navigator.userActivation.isActive; + } + + return JSEvents.inEventHandler && JSEvents.currentEventHandler.allowsDeferredCalls; + }, + runDeferredCalls() { + if (!JSEvents.canPerformEventHandlerRequests()) { + return; + } + var deferredCalls = JSEvents.deferredCalls; + JSEvents.deferredCalls = []; + for (var call of deferredCalls) { + call.targetFunction(...call.argsList); + } + }, + eventHandlers:[], + removeAllHandlersOnTarget:(target, eventTypeString) => { + for (var i = 0; i < JSEvents.eventHandlers.length; ++i) { + if (JSEvents.eventHandlers[i].target == target && + (!eventTypeString || eventTypeString == JSEvents.eventHandlers[i].eventTypeString)) { + JSEvents._removeHandler(i--); + } + } + }, + _removeHandler(i) { + var h = JSEvents.eventHandlers[i]; + h.target.removeEventListener(h.eventTypeString, h.eventListenerFunc, h.useCapture); + JSEvents.eventHandlers.splice(i, 1); + }, + registerOrRemoveHandler(eventHandler) { + if (!eventHandler.target) { + err('registerOrRemoveHandler: the target element for event handler registration does not exist, when processing the following event handler registration:'); + console.dir(eventHandler); + return -4; + } + if (eventHandler.callbackfunc) { + eventHandler.eventListenerFunc = function(event) { + // Increment nesting count for the event handler. + ++JSEvents.inEventHandler; + JSEvents.currentEventHandler = eventHandler; + // Process any old deferred calls the user has placed. + JSEvents.runDeferredCalls(); + // Process the actual event, calls back to user C code handler. + eventHandler.handlerFunc(event); + // Process any new deferred calls that were placed right now from this event handler. + JSEvents.runDeferredCalls(); + // Out of event handler - restore nesting count. + --JSEvents.inEventHandler; + }; + + eventHandler.target.addEventListener(eventHandler.eventTypeString, + eventHandler.eventListenerFunc, + eventHandler.useCapture); + JSEvents.eventHandlers.push(eventHandler); + } else { + for (var i = 0; i < JSEvents.eventHandlers.length; ++i) { + if (JSEvents.eventHandlers[i].target == eventHandler.target + && JSEvents.eventHandlers[i].eventTypeString == eventHandler.eventTypeString) { + JSEvents._removeHandler(i--); + } + } + } + return 0; + }, + removeSingleHandler(eventHandler) { + let success = false; + for (let i = 0; i < JSEvents.eventHandlers.length; ++i) { + const handler = JSEvents.eventHandlers[i]; + if (handler.target === eventHandler.target + && handler.eventTypeId === eventHandler.eventTypeId + && handler.callbackfunc === eventHandler.callbackfunc + && handler.userData === eventHandler.userData) { + // in some very rare cases (ex: Safari / fullscreen events), there is more than 1 handler (eventTypeString is different) + JSEvents._removeHandler(i--); + success = true; + } + } + return success ? 0 : -5; + }, + getNodeNameForTarget(target) { + if (target == window) return '#window'; + if (target == screen) return '#screen'; + return target?.nodeName ?? ''; + }, + fullscreenEnabled() { + return document.fullscreenEnabled + // Safari 13.0.3 on macOS Catalina 10.15.1 still ships with prefixed webkitFullscreenEnabled. + // TODO: If Safari at some point ships with unprefixed version, update the version check above. + || document.webkitFullscreenEnabled + ; + }, + }; + + var fillGamepadEventData = (eventStruct, e) => { + HEAPF64[((eventStruct)>>3)] = e.timestamp; + for (var i = 0; i < e.axes.length; ++i) { + HEAPF64[(((eventStruct+i*8)+(16))>>3)] = e.axes[i]; + } + for (var i = 0; i < e.buttons.length; ++i) { + if (typeof e.buttons[i] == 'object') { + HEAPF64[(((eventStruct+i*8)+(528))>>3)] = e.buttons[i].value; + } else { + HEAPF64[(((eventStruct+i*8)+(528))>>3)] = e.buttons[i]; + } + } + for (var i = 0; i < e.buttons.length; ++i) { + if (typeof e.buttons[i] == 'object') { + HEAP8[(eventStruct+i)+(1040)] = e.buttons[i].pressed; + } else { + // Assigning a boolean to HEAP32, that's ok, but Closure would like to warn about it: + /** @suppress {checkTypes} */ + HEAP8[(eventStruct+i)+(1040)] = e.buttons[i] == 1; + } + } + HEAP8[(eventStruct)+(1104)] = e.connected; + HEAP32[(((eventStruct)+(1108))>>2)] = e.index; + HEAP32[(((eventStruct)+(8))>>2)] = e.axes.length; + HEAP32[(((eventStruct)+(12))>>2)] = e.buttons.length; + stringToUTF8(e.id, eventStruct + 1112, 64); + stringToUTF8(e.mapping, eventStruct + 1176, 64); + }; + var _emscripten_get_gamepad_status = (index, gamepadState) => { + assert(JSEvents.lastGamepadState, 'emscripten_get_gamepad_status() called before emscripten_sample_gamepad_data()'); + // INVALID_PARAM is returned on a Gamepad index that never was there. + if (index < 0 || index >= JSEvents.lastGamepadState.length) return -5; + + // NO_DATA is returned on a Gamepad index that was removed. + // For previously disconnected gamepads there should be an empty slot (null/undefined/false) at the index. + // This is because gamepads must keep their original position in the array. + // For example, removing the first of two gamepads produces [null/undefined/false, gamepad]. + if (!JSEvents.lastGamepadState[index]) return -7; + + fillGamepadEventData(gamepadState, JSEvents.lastGamepadState[index]); + return 0; + }; + + + var _emscripten_get_num_gamepads = () => { + assert(JSEvents.lastGamepadState, 'emscripten_get_num_gamepads() called before emscripten_sample_gamepad_data()'); + // N.B. Do not call emscripten_get_num_gamepads() unless having first called emscripten_sample_gamepad_data(), and that has returned EMSCRIPTEN_RESULT_SUCCESS. + // Otherwise the following line will throw an exception. + return JSEvents.lastGamepadState.length; + }; + + var GLctx; + + var webgl_enable_ANGLE_instanced_arrays = (ctx) => { + // Extension available in WebGL 1 from Firefox 26 and Google Chrome 30 onwards. Core feature in WebGL 2. + var ext = ctx.getExtension('ANGLE_instanced_arrays'); + // Because this extension is a core function in WebGL 2, assign the extension entry points in place of + // where the core functions will reside in WebGL 2. This way the calling code can call these without + // having to dynamically branch depending if running against WebGL 1 or WebGL 2. + if (ext) { + ctx['vertexAttribDivisor'] = (index, divisor) => ext['vertexAttribDivisorANGLE'](index, divisor); + ctx['drawArraysInstanced'] = (mode, first, count, primcount) => ext['drawArraysInstancedANGLE'](mode, first, count, primcount); + ctx['drawElementsInstanced'] = (mode, count, type, indices, primcount) => ext['drawElementsInstancedANGLE'](mode, count, type, indices, primcount); + return 1; + } + }; + + var webgl_enable_OES_vertex_array_object = (ctx) => { + // Extension available in WebGL 1 from Firefox 25 and WebKit 536.28/desktop Safari 6.0.3 onwards. Core feature in WebGL 2. + var ext = ctx.getExtension('OES_vertex_array_object'); + if (ext) { + ctx['createVertexArray'] = () => ext['createVertexArrayOES'](); + ctx['deleteVertexArray'] = (vao) => ext['deleteVertexArrayOES'](vao); + ctx['bindVertexArray'] = (vao) => ext['bindVertexArrayOES'](vao); + ctx['isVertexArray'] = (vao) => ext['isVertexArrayOES'](vao); + return 1; + } + }; + + var webgl_enable_WEBGL_draw_buffers = (ctx) => { + // Extension available in WebGL 1 from Firefox 28 onwards. Core feature in WebGL 2. + var ext = ctx.getExtension('WEBGL_draw_buffers'); + if (ext) { + ctx['drawBuffers'] = (n, bufs) => ext['drawBuffersWEBGL'](n, bufs); + return 1; + } + }; + + var webgl_enable_EXT_polygon_offset_clamp = (ctx) => + !!(ctx.extPolygonOffsetClamp = ctx.getExtension('EXT_polygon_offset_clamp')); + + var webgl_enable_EXT_clip_control = (ctx) => + !!(ctx.extClipControl = ctx.getExtension('EXT_clip_control')); + + var webgl_enable_WEBGL_polygon_mode = (ctx) => + !!(ctx.webglPolygonMode = ctx.getExtension('WEBGL_polygon_mode')); + + var webgl_enable_WEBGL_multi_draw = (ctx) => + // Closure is expected to be allowed to minify the '.multiDrawWebgl' property, so not accessing it quoted. + !!(ctx.multiDrawWebgl = ctx.getExtension('WEBGL_multi_draw')); + + var getEmscriptenSupportedExtensions = (ctx) => { + // Restrict the list of advertised extensions to those that we actually + // support. + var supportedExtensions = [ + // WebGL 1 extensions + 'ANGLE_instanced_arrays', + 'EXT_blend_minmax', + 'EXT_disjoint_timer_query', + 'EXT_frag_depth', + 'EXT_shader_texture_lod', + 'EXT_sRGB', + 'OES_element_index_uint', + 'OES_fbo_render_mipmap', + 'OES_standard_derivatives', + 'OES_texture_float', + 'OES_texture_half_float', + 'OES_texture_half_float_linear', + 'OES_vertex_array_object', + 'WEBGL_color_buffer_float', + 'WEBGL_depth_texture', + 'WEBGL_draw_buffers', + // WebGL 1 and WebGL 2 extensions + 'EXT_clip_control', + 'EXT_color_buffer_half_float', + 'EXT_depth_clamp', + 'EXT_float_blend', + 'EXT_polygon_offset_clamp', + 'EXT_texture_compression_bptc', + 'EXT_texture_compression_rgtc', + 'EXT_texture_filter_anisotropic', + 'KHR_parallel_shader_compile', + 'OES_texture_float_linear', + 'WEBGL_blend_func_extended', + 'WEBGL_compressed_texture_astc', + 'WEBGL_compressed_texture_etc', + 'WEBGL_compressed_texture_etc1', + 'WEBGL_compressed_texture_s3tc', + 'WEBGL_compressed_texture_s3tc_srgb', + 'WEBGL_debug_renderer_info', + 'WEBGL_debug_shaders', + 'WEBGL_lose_context', + 'WEBGL_multi_draw', + 'WEBGL_polygon_mode' + ]; + // .getSupportedExtensions() can return null if context is lost, so coerce to empty array. + return ctx.getSupportedExtensions()?.filter(ext => supportedExtensions.includes(ext)) ?? []; + }; + + + var GL = { + counter:1, + buffers:[], + programs:[], + framebuffers:[], + renderbuffers:[], + textures:[], + shaders:[], + vaos:[], + contexts:[], + offscreenCanvases:{ + }, + queries:[], + stringCache:{ + }, + unpackAlignment:4, + unpackRowLength:0, + recordError:(errorCode) => { + if (!GL.lastError) { + GL.lastError = errorCode; + } + }, + getNewId:(table) => { + var ret = GL.counter++; + for (var i = table.length; i < ret; i++) { + table[i] = null; + } + return ret; + }, + genObject:(n, buffers, createFunction, objectTable + ) => { + for (var i = 0; i < n; i++) { + var buffer = GLctx[createFunction](); + var id = buffer && GL.getNewId(objectTable); + if (buffer) { + buffer.name = id; + objectTable[id] = buffer; + } else { + GL.recordError(0x502 /* GL_INVALID_OPERATION */); + } + HEAP32[(((buffers)+(i*4))>>2)] = id; + } + }, + getSource:(shader, count, string, length) => { + var source = ''; + for (var i = 0; i < count; ++i) { + var len = length ? HEAPU32[(((length)+(i*4))>>2)] : undefined; + source += UTF8ToString(HEAPU32[(((string)+(i*4))>>2)], len); + } + return source; + }, + createContext:(/** @type {HTMLCanvasElement} */ canvas, webGLContextAttributes) => { + + // BUG: Workaround Safari WebGL issue: After successfully acquiring WebGL + // context on a canvas, calling .getContext() will always return that + // context independent of which 'webgl' or 'webgl2' + // context version was passed. See: + // https://webkit.org/b/222758 + // and: + // https://github.com/emscripten-core/emscripten/issues/13295. + // TODO: Once the bug is fixed and shipped in Safari, adjust the Safari + // version field in above check. + if (!canvas.getContextSafariWebGL2Fixed) { + canvas.getContextSafariWebGL2Fixed = canvas.getContext; + /** @type {function(this:HTMLCanvasElement, string, (Object|null)=): (Object|null)} */ + function fixedGetContext(ver, attrs) { + var gl = canvas.getContextSafariWebGL2Fixed(ver, attrs); + return ((ver == 'webgl') == (gl instanceof WebGLRenderingContext)) ? gl : null; + } + canvas.getContext = fixedGetContext; + } + + var ctx = + canvas.getContext("webgl", webGLContextAttributes); + + if (!ctx) return 0; + + var handle = GL.registerContext(ctx, webGLContextAttributes); + + return handle; + }, + registerContext:(ctx, webGLContextAttributes) => { + // without pthreads a context is just an integer ID + var handle = GL.getNewId(GL.contexts); + + var context = { + handle, + attributes: webGLContextAttributes, + version: webGLContextAttributes.majorVersion, + GLctx: ctx + }; + + // Store the created context object so that we can access the context + // given a canvas without having to pass the parameters again. + if (ctx.canvas) ctx.canvas.GLctxObject = context; + GL.contexts[handle] = context; + if (typeof webGLContextAttributes.enableExtensionsByDefault == 'undefined' || webGLContextAttributes.enableExtensionsByDefault) { + GL.initExtensions(context); + } + + return handle; + }, + makeContextCurrent:(contextHandle) => { + + // Active Emscripten GL layer context object. + GL.currentContext = GL.contexts[contextHandle]; + // Active WebGL context object. + Module['ctx'] = GLctx = GL.currentContext?.GLctx; + return !(contextHandle && !GLctx); + }, + getContext:(contextHandle) => { + return GL.contexts[contextHandle]; + }, + deleteContext:(contextHandle) => { + if (GL.currentContext === GL.contexts[contextHandle]) { + GL.currentContext = null; + } + if (typeof JSEvents == 'object') { + // Release all JS event handlers on the DOM element that the GL context is + // associated with since the context is now deleted. + JSEvents.removeAllHandlersOnTarget(GL.contexts[contextHandle].GLctx.canvas); + } + // Make sure the canvas object no longer refers to the context object so + // there are no GC surprises. + if (GL.contexts[contextHandle]?.GLctx.canvas) { + GL.contexts[contextHandle].GLctx.canvas.GLctxObject = undefined; + } + GL.contexts[contextHandle] = null; + }, + initExtensions:(context) => { + // If this function is called without a specific context object, init the + // extensions of the currently active context. + context ||= GL.currentContext; + + if (context.initExtensionsDone) return; + context.initExtensionsDone = true; + + var GLctx = context.GLctx; + + // Detect the presence of a few extensions manually, since the GL interop + // layer itself will need to know if they exist. + + // Extensions that are available in both WebGL 1 and WebGL 2 + webgl_enable_WEBGL_multi_draw(GLctx); + webgl_enable_EXT_polygon_offset_clamp(GLctx); + webgl_enable_EXT_clip_control(GLctx); + webgl_enable_WEBGL_polygon_mode(GLctx); + // Extensions that are only available in WebGL 1 (the calls will be no-ops + // if called on a WebGL 2 context active) + webgl_enable_ANGLE_instanced_arrays(GLctx); + webgl_enable_OES_vertex_array_object(GLctx); + webgl_enable_WEBGL_draw_buffers(GLctx); + { + GLctx.disjointTimerQueryExt = GLctx.getExtension("EXT_disjoint_timer_query"); + } + + for (var ext of getEmscriptenSupportedExtensions(GLctx)) { + // WEBGL_lose_context, WEBGL_debug_renderer_info and WEBGL_debug_shaders + // are not enabled by default. + if (!ext.includes('lose_context') && !ext.includes('debug')) { + // Call .getExtension() to enable that extension permanently. + GLctx.getExtension(ext); + } + } + }, + }; + var _emscripten_glActiveTexture = (x0) => GLctx.activeTexture(x0); + + var _emscripten_glAttachShader = (program, shader) => { + GLctx.attachShader(GL.programs[program], GL.shaders[shader]); + }; + + var _emscripten_glBeginQueryEXT = (target, id) => { + GLctx.disjointTimerQueryExt['beginQueryEXT'](target, GL.queries[id]); + }; + + + var _emscripten_glBindAttribLocation = (program, index, name) => { + GLctx.bindAttribLocation(GL.programs[program], index, UTF8ToString(name)); + }; + + var _emscripten_glBindBuffer = (target, buffer) => { + + GLctx.bindBuffer(target, GL.buffers[buffer]); + }; + + var _emscripten_glBindFramebuffer = (target, framebuffer) => { + + GLctx.bindFramebuffer(target, GL.framebuffers[framebuffer]); + + }; + + var _emscripten_glBindRenderbuffer = (target, renderbuffer) => { + GLctx.bindRenderbuffer(target, GL.renderbuffers[renderbuffer]); + }; + + var _emscripten_glBindTexture = (target, texture) => { + GLctx.bindTexture(target, GL.textures[texture]); + }; + + + var _emscripten_glBindVertexArray = (vao) => { + GLctx.bindVertexArray(GL.vaos[vao]); + }; + var _glBindVertexArray = _emscripten_glBindVertexArray; + var _emscripten_glBindVertexArrayOES = _glBindVertexArray; + + var _emscripten_glBlendColor = (x0, x1, x2, x3) => GLctx.blendColor(x0, x1, x2, x3); + + var _emscripten_glBlendEquation = (x0) => GLctx.blendEquation(x0); + + var _emscripten_glBlendEquationSeparate = (x0, x1) => GLctx.blendEquationSeparate(x0, x1); + + var _emscripten_glBlendFunc = (x0, x1) => GLctx.blendFunc(x0, x1); + + var _emscripten_glBlendFuncSeparate = (x0, x1, x2, x3) => GLctx.blendFuncSeparate(x0, x1, x2, x3); + + var _emscripten_glBufferData = (target, size, data, usage) => { + + // N.b. here first form specifies a heap subarray, second form an integer + // size, so the ?: code here is polymorphic. It is advised to avoid + // randomly mixing both uses in calling code, to avoid any potential JS + // engine JIT issues. + GLctx.bufferData(target, data ? HEAPU8.subarray(data, data+size) : size, usage); + }; + + var webglBufferSubData = (target, offset, size, data, src = HEAPU8) => { + GLctx.bufferSubData(target, offset, src.subarray(data, data + size)); + }; + + var _emscripten_glBufferSubData = (target, offset, size, data) => webglBufferSubData(target, offset, size, data); + + var _emscripten_glCheckFramebufferStatus = (x0) => GLctx.checkFramebufferStatus(x0); + + var _emscripten_glClear = (x0) => GLctx.clear(x0); + + var _emscripten_glClearColor = (x0, x1, x2, x3) => GLctx.clearColor(x0, x1, x2, x3); + + var _emscripten_glClearDepthf = (x0) => GLctx.clearDepth(x0); + + var _emscripten_glClearStencil = (x0) => GLctx.clearStencil(x0); + + var _emscripten_glClipControlEXT = (origin, depth) => { + GLctx.extClipControl['clipControlEXT'](origin, depth); + }; + + var _emscripten_glColorMask = (red, green, blue, alpha) => { + GLctx.colorMask(!!red, !!green, !!blue, !!alpha); + }; + + var _emscripten_glCompileShader = (shader) => { + GLctx.compileShader(GL.shaders[shader]); + }; + + var _emscripten_glCompressedTexImage2D = (target, level, internalFormat, width, height, border, imageSize, data) => { + // `data` may be null here, which means "allocate uninitialized space but + // don't upload" in GLES parlance, but `compressedTexImage2D` requires the + // final data parameter, so we simply pass a heap view starting at zero + // effectively uploading whatever happens to be near address zero. See + // https://github.com/emscripten-core/emscripten/issues/19300. + GLctx.compressedTexImage2D(target, level, internalFormat, width, height, border, HEAPU8.subarray((data), data+imageSize)); + }; + + var _emscripten_glCompressedTexSubImage2D = (target, level, xoffset, yoffset, width, height, format, imageSize, data) => { + GLctx.compressedTexSubImage2D(target, level, xoffset, yoffset, width, height, format, HEAPU8.subarray((data), data+imageSize)); + }; + + var _emscripten_glCopyTexImage2D = (x0, x1, x2, x3, x4, x5, x6, x7) => GLctx.copyTexImage2D(x0, x1, x2, x3, x4, x5, x6, x7); + + var _emscripten_glCopyTexSubImage2D = (x0, x1, x2, x3, x4, x5, x6, x7) => GLctx.copyTexSubImage2D(x0, x1, x2, x3, x4, x5, x6, x7); + + var _emscripten_glCreateProgram = () => { + var id = GL.getNewId(GL.programs); + var program = GLctx.createProgram(); + // Store additional information needed for each shader program: + program.name = id; + // Lazy cache results of + // glGetProgramiv(GL_ACTIVE_UNIFORM_MAX_LENGTH/GL_ACTIVE_ATTRIBUTE_MAX_LENGTH/GL_ACTIVE_UNIFORM_BLOCK_MAX_NAME_LENGTH) + program.maxUniformLength = program.maxAttributeLength = program.maxUniformBlockNameLength = 0; + program.uniformIdCounter = 1; + GL.programs[id] = program; + return id; + }; + + var _emscripten_glCreateShader = (shaderType) => { + var id = GL.getNewId(GL.shaders); + GL.shaders[id] = GLctx.createShader(shaderType); + + return id; + }; + + var _emscripten_glCullFace = (x0) => GLctx.cullFace(x0); + + var _emscripten_glDeleteBuffers = (n, buffers) => { + for (var i = 0; i < n; i++) { + var id = HEAP32[(((buffers)+(i*4))>>2)]; + var buffer = GL.buffers[id]; + + // From spec: "glDeleteBuffers silently ignores 0's and names that do not + // correspond to existing buffer objects." + if (!buffer) continue; + + GLctx.deleteBuffer(buffer); + buffer.name = 0; + GL.buffers[id] = null; + + } + }; + + var _emscripten_glDeleteFramebuffers = (n, framebuffers) => { + for (var i = 0; i < n; ++i) { + var id = HEAP32[(((framebuffers)+(i*4))>>2)]; + var framebuffer = GL.framebuffers[id]; + if (!framebuffer) continue; // GL spec: "glDeleteFramebuffers silently ignores 0s and names that do not correspond to existing framebuffer objects". + GLctx.deleteFramebuffer(framebuffer); + framebuffer.name = 0; + GL.framebuffers[id] = null; + } + }; + + var _emscripten_glDeleteProgram = (id) => { + if (!id) return; + var program = GL.programs[id]; + if (!program) { + // glDeleteProgram actually signals an error when deleting a nonexisting + // object, unlike some other GL delete functions. + GL.recordError(0x501 /* GL_INVALID_VALUE */); + return; + } + GLctx.deleteProgram(program); + program.name = 0; + GL.programs[id] = null; + }; + + var _emscripten_glDeleteQueriesEXT = (n, ids) => { + for (var i = 0; i < n; i++) { + var id = HEAP32[(((ids)+(i*4))>>2)]; + var query = GL.queries[id]; + if (!query) continue; // GL spec: "unused names in ids are ignored, as is the name zero." + GLctx.disjointTimerQueryExt['deleteQueryEXT'](query); + GL.queries[id] = null; + } + }; + + var _emscripten_glDeleteRenderbuffers = (n, renderbuffers) => { + for (var i = 0; i < n; i++) { + var id = HEAP32[(((renderbuffers)+(i*4))>>2)]; + var renderbuffer = GL.renderbuffers[id]; + if (!renderbuffer) continue; // GL spec: "glDeleteRenderbuffers silently ignores 0s and names that do not correspond to existing renderbuffer objects". + GLctx.deleteRenderbuffer(renderbuffer); + renderbuffer.name = 0; + GL.renderbuffers[id] = null; + } + }; + + var _emscripten_glDeleteShader = (id) => { + if (!id) return; + var shader = GL.shaders[id]; + if (!shader) { + // glDeleteShader actually signals an error when deleting a nonexisting + // object, unlike some other GL delete functions. + GL.recordError(0x501 /* GL_INVALID_VALUE */); + return; + } + GLctx.deleteShader(shader); + GL.shaders[id] = null; + }; + + var _emscripten_glDeleteTextures = (n, textures) => { + for (var i = 0; i < n; i++) { + var id = HEAP32[(((textures)+(i*4))>>2)]; + var texture = GL.textures[id]; + // GL spec: "glDeleteTextures silently ignores 0s and names that do not + // correspond to existing textures". + if (!texture) continue; + GLctx.deleteTexture(texture); + texture.name = 0; + GL.textures[id] = null; + } + }; + + + var _emscripten_glDeleteVertexArrays = (n, vaos) => { + for (var i = 0; i < n; i++) { + var id = HEAP32[(((vaos)+(i*4))>>2)]; + GLctx.deleteVertexArray(GL.vaos[id]); + GL.vaos[id] = null; + } + }; + var _glDeleteVertexArrays = _emscripten_glDeleteVertexArrays; + var _emscripten_glDeleteVertexArraysOES = _glDeleteVertexArrays; + + var _emscripten_glDepthFunc = (x0) => GLctx.depthFunc(x0); + + var _emscripten_glDepthMask = (flag) => { + GLctx.depthMask(!!flag); + }; + + var _emscripten_glDepthRangef = (x0, x1) => GLctx.depthRange(x0, x1); + + var _emscripten_glDetachShader = (program, shader) => { + GLctx.detachShader(GL.programs[program], GL.shaders[shader]); + }; + + var _emscripten_glDisable = (x0) => GLctx.disable(x0); + + var _emscripten_glDisableVertexAttribArray = (index) => { + GLctx.disableVertexAttribArray(index); + }; + + var _emscripten_glDrawArrays = (mode, first, count) => { + + GLctx.drawArrays(mode, first, count); + + }; + + + var _emscripten_glDrawArraysInstanced = (mode, first, count, primcount) => { + GLctx.drawArraysInstanced(mode, first, count, primcount); + }; + var _glDrawArraysInstanced = _emscripten_glDrawArraysInstanced; + var _emscripten_glDrawArraysInstancedANGLE = _glDrawArraysInstanced; + + + var tempFixedLengthArray = []; + + var _emscripten_glDrawBuffers = (n, bufs) => { + + var bufArray = tempFixedLengthArray[n]; + for (var i = 0; i < n; i++) { + bufArray[i] = HEAP32[(((bufs)+(i*4))>>2)]; + } + + GLctx.drawBuffers(bufArray); + }; + var _glDrawBuffers = _emscripten_glDrawBuffers; + var _emscripten_glDrawBuffersWEBGL = _glDrawBuffers; + + + var _emscripten_glDrawElements = (mode, count, type, indices) => { + + GLctx.drawElements(mode, count, type, indices); + + }; + + + var _emscripten_glDrawElementsInstanced = (mode, count, type, indices, primcount) => { + GLctx.drawElementsInstanced(mode, count, type, indices, primcount); + }; + var _glDrawElementsInstanced = _emscripten_glDrawElementsInstanced; + var _emscripten_glDrawElementsInstancedANGLE = _glDrawElementsInstanced; + + var _emscripten_glEnable = (x0) => GLctx.enable(x0); + + var _emscripten_glEnableVertexAttribArray = (index) => { + GLctx.enableVertexAttribArray(index); + }; + + var _emscripten_glEndQueryEXT = (target) => { + GLctx.disjointTimerQueryExt['endQueryEXT'](target); + }; + + var _emscripten_glFinish = () => GLctx.finish(); + + var _emscripten_glFlush = () => GLctx.flush(); + + var _emscripten_glFramebufferRenderbuffer = (target, attachment, renderbuffertarget, renderbuffer) => { + GLctx.framebufferRenderbuffer(target, attachment, renderbuffertarget, + GL.renderbuffers[renderbuffer]); + }; + + var _emscripten_glFramebufferTexture2D = (target, attachment, textarget, texture, level) => { + GLctx.framebufferTexture2D(target, attachment, textarget, + GL.textures[texture], level); + }; + + var _emscripten_glFrontFace = (x0) => GLctx.frontFace(x0); + + var _emscripten_glGenBuffers = (n, buffers) => { + GL.genObject(n, buffers, 'createBuffer', GL.buffers + ); + }; + + var _emscripten_glGenFramebuffers = (n, ids) => { + GL.genObject(n, ids, 'createFramebuffer', GL.framebuffers + ); + }; + + var _emscripten_glGenQueriesEXT = (n, ids) => { + for (var i = 0; i < n; i++) { + var query = GLctx.disjointTimerQueryExt['createQueryEXT'](); + if (!query) { + GL.recordError(0x502 /* GL_INVALID_OPERATION */); + while (i < n) HEAP32[(((ids)+(i++*4))>>2)] = 0; + return; + } + var id = GL.getNewId(GL.queries); + query.name = id; + GL.queries[id] = query; + HEAP32[(((ids)+(i*4))>>2)] = id; + } + }; + + var _emscripten_glGenRenderbuffers = (n, renderbuffers) => { + GL.genObject(n, renderbuffers, 'createRenderbuffer', GL.renderbuffers + ); + }; + + var _emscripten_glGenTextures = (n, textures) => { + GL.genObject(n, textures, 'createTexture', GL.textures + ); + }; + + + var _emscripten_glGenVertexArrays = (n, arrays) => { + GL.genObject(n, arrays, 'createVertexArray', GL.vaos + ); + }; + var _glGenVertexArrays = _emscripten_glGenVertexArrays; + var _emscripten_glGenVertexArraysOES = _glGenVertexArrays; + + var _emscripten_glGenerateMipmap = (x0) => GLctx.generateMipmap(x0); + + + var __glGetActiveAttribOrUniform = (funcName, program, index, bufSize, length, size, type, name) => { + program = GL.programs[program]; + var info = GLctx[funcName](program, index); + if (info) { + // If an error occurs, nothing will be written to length, size and type and name. + var numBytesWrittenExclNull = name && stringToUTF8(info.name, name, bufSize); + if (length) HEAP32[((length)>>2)] = numBytesWrittenExclNull; + if (size) HEAP32[((size)>>2)] = info.size; + if (type) HEAP32[((type)>>2)] = info.type; + } + }; + + var _emscripten_glGetActiveAttrib = (program, index, bufSize, length, size, type, name) => + __glGetActiveAttribOrUniform('getActiveAttrib', program, index, bufSize, length, size, type, name); + + + var _emscripten_glGetActiveUniform = (program, index, bufSize, length, size, type, name) => + __glGetActiveAttribOrUniform('getActiveUniform', program, index, bufSize, length, size, type, name); + + var _emscripten_glGetAttachedShaders = (program, maxCount, count, shaders) => { + var result = GLctx.getAttachedShaders(GL.programs[program]); + var len = result.length; + if (len > maxCount) { + len = maxCount; + } + HEAP32[((count)>>2)] = len; + for (var i = 0; i < len; ++i) { + var id = GL.shaders.indexOf(result[i]); + HEAP32[(((shaders)+(i*4))>>2)] = id; + } + }; + + + var _emscripten_glGetAttribLocation = (program, name) => + GLctx.getAttribLocation(GL.programs[program], UTF8ToString(name)); + + var readI53FromI64 = (ptr) => { + return HEAPU32[((ptr)>>2)] + HEAP32[(((ptr)+(4))>>2)] * 4294967296; + }; + + var readI53FromU64 = (ptr) => { + return HEAPU32[((ptr)>>2)] + HEAPU32[(((ptr)+(4))>>2)] * 4294967296; + }; + var writeI53ToI64 = (ptr, num) => { + HEAPU32[((ptr)>>2)] = num; + var lower = HEAPU32[((ptr)>>2)]; + HEAPU32[(((ptr)+(4))>>2)] = (num - lower)/4294967296; + var deserialized = (num >= 0) ? readI53FromU64(ptr) : readI53FromI64(ptr); + var offset = ((ptr)>>2); + if (deserialized != num) warnOnce(`writeI53ToI64() out of range: serialized JS Number ${num} to Wasm heap as bytes lo=${ptrToString(HEAPU32[offset])}, hi=${ptrToString(HEAPU32[offset+1])}, which deserializes back to ${deserialized} instead!`); + }; + + var emscriptenWebGLGet = (name_, p, type) => { + // Guard against user passing a null pointer. + // Note that GLES2 spec does not say anything about how passing a null + // pointer should be treated. Testing on desktop core GL 3, the application + // crashes on glGetIntegerv to a null pointer, but better to report an error + // instead of doing anything random. + if (!p) { + GL.recordError(0x501 /* GL_INVALID_VALUE */); + return; + } + var ret = undefined; + switch (name_) { // Handle a few trivial GLES values + case 0x8DFA: // GL_SHADER_COMPILER + ret = 1; + break; + case 0x8DF8: // GL_SHADER_BINARY_FORMATS + if (type != 0 && type != 1) { + GL.recordError(0x500); // GL_INVALID_ENUM + } + // Do not write anything to the out pointer, since no binary formats are + // supported. + return; + case 0x8DF9: // GL_NUM_SHADER_BINARY_FORMATS + ret = 0; + break; + case 0x86A2: // GL_NUM_COMPRESSED_TEXTURE_FORMATS + // WebGL doesn't have GL_NUM_COMPRESSED_TEXTURE_FORMATS (it's obsolete + // since GL_COMPRESSED_TEXTURE_FORMATS returns a JS array that can be + // queried for length), so implement it ourselves to allow C++ GLES2 + // code to get the length. + var formats = GLctx.getParameter(0x86A3 /*GL_COMPRESSED_TEXTURE_FORMATS*/); + ret = formats ? formats.length : 0; + break; + + } + + if (ret === undefined) { + var result = GLctx.getParameter(name_); + switch (typeof result) { + case "number": + ret = result; + break; + case "boolean": + ret = result ? 1 : 0; + break; + case "string": + GL.recordError(0x500); // GL_INVALID_ENUM + return; + case "object": + if (result === null) { + // null is a valid result for some (e.g., which buffer is bound - + // perhaps nothing is bound), but otherwise can mean an invalid + // name_, which we need to report as an error + switch (name_) { + case 0x8894: // ARRAY_BUFFER_BINDING + case 0x8B8D: // CURRENT_PROGRAM + case 0x8895: // ELEMENT_ARRAY_BUFFER_BINDING + case 0x8CA6: // FRAMEBUFFER_BINDING or DRAW_FRAMEBUFFER_BINDING + case 0x8CA7: // RENDERBUFFER_BINDING + case 0x8069: // TEXTURE_BINDING_2D + case 0x85B5: // WebGL 2 GL_VERTEX_ARRAY_BINDING, or WebGL 1 extension OES_vertex_array_object GL_VERTEX_ARRAY_BINDING_OES + case 0x8514: { // TEXTURE_BINDING_CUBE_MAP + ret = 0; + break; + } + default: { + GL.recordError(0x500); // GL_INVALID_ENUM + return; + } + } + } else if (result instanceof Float32Array || + result instanceof Uint32Array || + result instanceof Int32Array || + result instanceof Array) { + for (var i = 0; i < result.length; ++i) { + switch (type) { + case 0: HEAP32[(((p)+(i*4))>>2)] = result[i]; break; + case 2: HEAPF32[(((p)+(i*4))>>2)] = result[i]; break; + case 4: HEAP8[(p)+(i)] = result[i] ? 1 : 0; break; + } + } + return; + } else { + try { + ret = result.name | 0; + } catch(e) { + GL.recordError(0x500); // GL_INVALID_ENUM + err(`GL_INVALID_ENUM in glGet${type}v: Unknown object returned from WebGL getParameter(${name_})! (error: ${e})`); + return; + } + } + break; + default: + GL.recordError(0x500); // GL_INVALID_ENUM + err(`GL_INVALID_ENUM in glGet${type}v: Native code calling glGet${type}v(${name_}) and it returns ${result} of type ${typeof(result)}!`); + return; + } + } + + switch (type) { + case 1: writeI53ToI64(p, ret); break; + case 0: HEAP32[((p)>>2)] = ret; break; + case 2: HEAPF32[((p)>>2)] = ret; break; + case 4: HEAP8[p] = ret ? 1 : 0; break; + } + }; + + var _emscripten_glGetBooleanv = (name_, p) => emscriptenWebGLGet(name_, p, 4); + + var _emscripten_glGetBufferParameteriv = (target, value, data) => { + if (!data) { + // GLES2 specification does not specify how to behave if data is a null + // pointer. Since calling this function does not make sense if data == + // null, issue a GL error to notify user about it. + GL.recordError(0x501 /* GL_INVALID_VALUE */); + return; + } + HEAP32[((data)>>2)] = GLctx.getBufferParameter(target, value); + }; + + var _emscripten_glGetError = () => { + var error = GLctx.getError() || GL.lastError; + GL.lastError = 0/*GL_NO_ERROR*/; + return error; + }; + + + var _emscripten_glGetFloatv = (name_, p) => emscriptenWebGLGet(name_, p, 2); + + var _emscripten_glGetFramebufferAttachmentParameteriv = (target, attachment, pname, params) => { + var result = GLctx.getFramebufferAttachmentParameter(target, attachment, pname); + if (result instanceof WebGLRenderbuffer || + result instanceof WebGLTexture) { + result = result.name | 0; + } + HEAP32[((params)>>2)] = result; + }; + + + var _emscripten_glGetIntegerv = (name_, p) => emscriptenWebGLGet(name_, p, 0); + + var _emscripten_glGetProgramInfoLog = (program, maxLength, length, infoLog) => { + var log = GLctx.getProgramInfoLog(GL.programs[program]); + if (log === null) log = '(unknown error)'; + var numBytesWrittenExclNull = (maxLength > 0 && infoLog) ? stringToUTF8(log, infoLog, maxLength) : 0; + if (length) HEAP32[((length)>>2)] = numBytesWrittenExclNull; + }; + + var _emscripten_glGetProgramiv = (program, pname, p) => { + if (!p) { + // GLES2 specification does not specify how to behave if p is a null + // pointer. Since calling this function does not make sense if p == null, + // issue a GL error to notify user about it. + GL.recordError(0x501 /* GL_INVALID_VALUE */); + return; + } + + if (program >= GL.counter) { + GL.recordError(0x501 /* GL_INVALID_VALUE */); + return; + } + + program = GL.programs[program]; + + if (pname == 0x8B84) { // GL_INFO_LOG_LENGTH + var log = GLctx.getProgramInfoLog(program); + if (log === null) log = '(unknown error)'; + HEAP32[((p)>>2)] = log.length + 1; + } else if (pname == 0x8B87 /* GL_ACTIVE_UNIFORM_MAX_LENGTH */) { + if (!program.maxUniformLength) { + var numActiveUniforms = GLctx.getProgramParameter(program, 0x8B86/*GL_ACTIVE_UNIFORMS*/); + for (var i = 0; i < numActiveUniforms; ++i) { + program.maxUniformLength = Math.max(program.maxUniformLength, GLctx.getActiveUniform(program, i).name.length+1); + } + } + HEAP32[((p)>>2)] = program.maxUniformLength; + } else if (pname == 0x8B8A /* GL_ACTIVE_ATTRIBUTE_MAX_LENGTH */) { + if (!program.maxAttributeLength) { + var numActiveAttributes = GLctx.getProgramParameter(program, 0x8B89/*GL_ACTIVE_ATTRIBUTES*/); + for (var i = 0; i < numActiveAttributes; ++i) { + program.maxAttributeLength = Math.max(program.maxAttributeLength, GLctx.getActiveAttrib(program, i).name.length+1); + } + } + HEAP32[((p)>>2)] = program.maxAttributeLength; + } else if (pname == 0x8A35 /* GL_ACTIVE_UNIFORM_BLOCK_MAX_NAME_LENGTH */) { + if (!program.maxUniformBlockNameLength) { + var numActiveUniformBlocks = GLctx.getProgramParameter(program, 0x8A36/*GL_ACTIVE_UNIFORM_BLOCKS*/); + for (var i = 0; i < numActiveUniformBlocks; ++i) { + program.maxUniformBlockNameLength = Math.max(program.maxUniformBlockNameLength, GLctx.getActiveUniformBlockName(program, i).length+1); + } + } + HEAP32[((p)>>2)] = program.maxUniformBlockNameLength; + } else { + HEAP32[((p)>>2)] = GLctx.getProgramParameter(program, pname); + } + }; + + + var _emscripten_glGetQueryObjecti64vEXT = (id, pname, params) => { + if (!params) { + // GLES2 specification does not specify how to behave if params is a null pointer. Since calling this function does not make sense + // if p == null, issue a GL error to notify user about it. + GL.recordError(0x501 /* GL_INVALID_VALUE */); + return; + } + var query = GL.queries[id]; + var param; + { + param = GLctx.disjointTimerQueryExt['getQueryObjectEXT'](query, pname); + } + var ret; + if (typeof param == 'boolean') { + ret = param ? 1 : 0; + } else { + ret = param; + } + writeI53ToI64(params, ret); + }; + + var _emscripten_glGetQueryObjectivEXT = (id, pname, params) => { + if (!params) { + // GLES2 specification does not specify how to behave if params is a null pointer. Since calling this function does not make sense + // if p == null, issue a GL error to notify user about it. + GL.recordError(0x501 /* GL_INVALID_VALUE */); + return; + } + var query = GL.queries[id]; + var param = GLctx.disjointTimerQueryExt['getQueryObjectEXT'](query, pname); + var ret; + if (typeof param == 'boolean') { + ret = param ? 1 : 0; + } else { + ret = param; + } + HEAP32[((params)>>2)] = ret; + }; + + + var _glGetQueryObjecti64vEXT = _emscripten_glGetQueryObjecti64vEXT; + var _emscripten_glGetQueryObjectui64vEXT = _glGetQueryObjecti64vEXT; + + + var _glGetQueryObjectivEXT = _emscripten_glGetQueryObjectivEXT; + var _emscripten_glGetQueryObjectuivEXT = _glGetQueryObjectivEXT; + + var _emscripten_glGetQueryivEXT = (target, pname, params) => { + if (!params) { + // GLES2 specification does not specify how to behave if params is a null pointer. Since calling this function does not make sense + // if p == null, issue a GL error to notify user about it. + GL.recordError(0x501 /* GL_INVALID_VALUE */); + return; + } + HEAP32[((params)>>2)] = GLctx.disjointTimerQueryExt['getQueryEXT'](target, pname); + }; + + var _emscripten_glGetRenderbufferParameteriv = (target, pname, params) => { + if (!params) { + // GLES2 specification does not specify how to behave if params is a null pointer. Since calling this function does not make sense + // if params == null, issue a GL error to notify user about it. + GL.recordError(0x501 /* GL_INVALID_VALUE */); + return; + } + HEAP32[((params)>>2)] = GLctx.getRenderbufferParameter(target, pname); + }; + + + var _emscripten_glGetShaderInfoLog = (shader, maxLength, length, infoLog) => { + var log = GLctx.getShaderInfoLog(GL.shaders[shader]); + if (log === null) log = '(unknown error)'; + var numBytesWrittenExclNull = (maxLength > 0 && infoLog) ? stringToUTF8(log, infoLog, maxLength) : 0; + if (length) HEAP32[((length)>>2)] = numBytesWrittenExclNull; + }; + + var _emscripten_glGetShaderPrecisionFormat = (shaderType, precisionType, range, precision) => { + var result = GLctx.getShaderPrecisionFormat(shaderType, precisionType); + HEAP32[((range)>>2)] = result.rangeMin; + HEAP32[(((range)+(4))>>2)] = result.rangeMax; + HEAP32[((precision)>>2)] = result.precision; + }; + + var _emscripten_glGetShaderSource = (shader, bufSize, length, source) => { + var result = GLctx.getShaderSource(GL.shaders[shader]); + if (!result) return; // If an error occurs, nothing will be written to length or source. + var numBytesWrittenExclNull = (bufSize > 0 && source) ? stringToUTF8(result, source, bufSize) : 0; + if (length) HEAP32[((length)>>2)] = numBytesWrittenExclNull; + }; + + var _emscripten_glGetShaderiv = (shader, pname, p) => { + if (!p) { + // GLES2 specification does not specify how to behave if p is a null + // pointer. Since calling this function does not make sense if p == null, + // issue a GL error to notify user about it. + GL.recordError(0x501 /* GL_INVALID_VALUE */); + return; + } + if (pname == 0x8B84) { // GL_INFO_LOG_LENGTH + var log = GLctx.getShaderInfoLog(GL.shaders[shader]); + if (log === null) log = '(unknown error)'; + // The GLES2 specification says that if the shader has an empty info log, + // a value of 0 is returned. Otherwise the log has a null char appended. + // (An empty string is falsey, so we can just check that instead of + // looking at log.length.) + var logLength = log ? log.length + 1 : 0; + HEAP32[((p)>>2)] = logLength; + } else if (pname == 0x8B88) { // GL_SHADER_SOURCE_LENGTH + var source = GLctx.getShaderSource(GL.shaders[shader]); + // source may be a null, or the empty string, both of which are falsey + // values that we report a 0 length for. + var sourceLength = source ? source.length + 1 : 0; + HEAP32[((p)>>2)] = sourceLength; + } else { + HEAP32[((p)>>2)] = GLctx.getShaderParameter(GL.shaders[shader], pname); + } + }; + + + + var stringToNewUTF8 = (str) => { + var size = lengthBytesUTF8(str) + 1; + var ret = _malloc(size); + if (ret) stringToUTF8(str, ret, size); + return ret; + }; + + + var webglGetExtensions = () => { + var exts = getEmscriptenSupportedExtensions(GLctx); + exts = exts.concat(exts.map((e) => "GL_" + e)); + return exts; + }; + + var _emscripten_glGetString = (name_) => { + var ret = GL.stringCache[name_]; + if (!ret) { + switch (name_) { + case 0x1F03 /* GL_EXTENSIONS */: + ret = stringToNewUTF8(webglGetExtensions().join(' ')); + break; + case 0x1F00 /* GL_VENDOR */: + case 0x1F01 /* GL_RENDERER */: + case 0x9245 /* UNMASKED_VENDOR_WEBGL */: + case 0x9246 /* UNMASKED_RENDERER_WEBGL */: + var s = GLctx.getParameter(name_); + if (!s) { + GL.recordError(0x500/*GL_INVALID_ENUM*/); + } + ret = s ? stringToNewUTF8(s) : 0; + break; + + case 0x1F02 /* GL_VERSION */: + var webGLVersion = GLctx.getParameter(0x1F02 /*GL_VERSION*/); + // return GLES version string corresponding to the version of the WebGL context + var glVersion = `OpenGL ES 2.0 (${webGLVersion})`; + ret = stringToNewUTF8(glVersion); + break; + case 0x8B8C /* GL_SHADING_LANGUAGE_VERSION */: + var glslVersion = GLctx.getParameter(0x8B8C /*GL_SHADING_LANGUAGE_VERSION*/); + // extract the version number 'N.M' from the string 'WebGL GLSL ES N.M ...' + var ver_re = /^WebGL GLSL ES ([0-9]\.[0-9][0-9]?)(?:$| .*)/; + var ver_num = glslVersion.match(ver_re); + if (ver_num !== null) { + if (ver_num[1].length == 3) ver_num[1] = ver_num[1] + '0'; // ensure minor version has 2 digits + glslVersion = `OpenGL ES GLSL ES ${ver_num[1]} (${glslVersion})`; + } + ret = stringToNewUTF8(glslVersion); + break; + default: + GL.recordError(0x500/*GL_INVALID_ENUM*/); + // fall through + } + GL.stringCache[name_] = ret; + } + return ret; + }; + + var _emscripten_glGetTexParameterfv = (target, pname, params) => { + if (!params) { + // GLES2 specification does not specify how to behave if params is a null + // pointer. Since calling this function does not make sense if p == null, + // issue a GL error to notify user about it. + GL.recordError(0x501 /* GL_INVALID_VALUE */); + return; + } + HEAPF32[((params)>>2)] = GLctx.getTexParameter(target, pname); + }; + + var _emscripten_glGetTexParameteriv = (target, pname, params) => { + if (!params) { + // GLES2 specification does not specify how to behave if params is a null + // pointer. Since calling this function does not make sense if p == null, + // issue a GL error to notify user about it. + GL.recordError(0x501 /* GL_INVALID_VALUE */); + return; + } + HEAP32[((params)>>2)] = GLctx.getTexParameter(target, pname); + }; + + /** @suppress {checkTypes} */ + var jstoi_q = (str) => parseInt(str); + + /** @noinline */ + var webglGetLeftBracePos = (name) => name.slice(-1) == ']' && name.lastIndexOf('['); + + var webglPrepareUniformLocationsBeforeFirstUse = (program) => { + var uniformLocsById = program.uniformLocsById, // Maps GLuint -> WebGLUniformLocation + uniformSizeAndIdsByName = program.uniformSizeAndIdsByName, // Maps name -> [uniform array length, GLuint] + i, j; + + // On the first time invocation of glGetUniformLocation on this shader program: + // initialize cache data structures and discover which uniforms are arrays. + if (!uniformLocsById) { + // maps GLint integer locations to WebGLUniformLocations + program.uniformLocsById = uniformLocsById = {}; + // maps integer locations back to uniform name strings, so that we can lazily fetch uniform array locations + program.uniformArrayNamesById = {}; + + var numActiveUniforms = GLctx.getProgramParameter(program, 0x8B86/*GL_ACTIVE_UNIFORMS*/); + for (i = 0; i < numActiveUniforms; ++i) { + var u = GLctx.getActiveUniform(program, i); + var nm = u.name; + var sz = u.size; + var lb = webglGetLeftBracePos(nm); + var arrayName = lb > 0 ? nm.slice(0, lb) : nm; + + // Assign a new location. + var id = program.uniformIdCounter; + program.uniformIdCounter += sz; + // Eagerly get the location of the uniformArray[0] base element. + // The remaining indices >0 will be left for lazy evaluation to + // improve performance. Those may never be needed to fetch, if the + // application fills arrays always in full starting from the first + // element of the array. + uniformSizeAndIdsByName[arrayName] = [sz, id]; + + // Store placeholder integers in place that highlight that these + // >0 index locations are array indices pending population. + for (j = 0; j < sz; ++j) { + uniformLocsById[id] = j; + program.uniformArrayNamesById[id++] = arrayName; + } + } + } + }; + + + + var _emscripten_glGetUniformLocation = (program, name) => { + + name = UTF8ToString(name); + + if (program = GL.programs[program]) { + webglPrepareUniformLocationsBeforeFirstUse(program); + var uniformLocsById = program.uniformLocsById; // Maps GLuint -> WebGLUniformLocation + var arrayIndex = 0; + var uniformBaseName = name; + + // Invariant: when populating integer IDs for uniform locations, we must + // maintain the precondition that arrays reside in contiguous addresses, + // i.e. for a 'vec4 colors[10];', colors[4] must be at location + // colors[0]+4. However, user might call glGetUniformLocation(program, + // "colors") for an array, so we cannot discover based on the user input + // arguments whether the uniform we are dealing with is an array. The only + // way to discover which uniforms are arrays is to enumerate over all the + // active uniforms in the program. + var leftBrace = webglGetLeftBracePos(name); + + // If user passed an array accessor "[index]", parse the array index off the accessor. + if (leftBrace > 0) { + arrayIndex = jstoi_q(name.slice(leftBrace + 1)) >>> 0; // "index]", coerce parseInt(']') with >>>0 to treat "foo[]" as "foo[0]" and foo[-1] as unsigned out-of-bounds. + uniformBaseName = name.slice(0, leftBrace); + } + + // Have we cached the location of this uniform before? + // A pair [array length, GLint of the uniform location] + var sizeAndId = program.uniformSizeAndIdsByName[uniformBaseName]; + + // If a uniform with this name exists, and if its index is within the + // array limits (if it's even an array), query the WebGLlocation, or + // return an existing cached location. + if (sizeAndId && arrayIndex < sizeAndId[0]) { + arrayIndex += sizeAndId[1]; // Add the base location of the uniform to the array index offset. + if ((uniformLocsById[arrayIndex] = uniformLocsById[arrayIndex] || GLctx.getUniformLocation(program, name))) { + return arrayIndex; + } + } + } + else { + // N.b. we are currently unable to distinguish between GL program IDs that + // never existed vs GL program IDs that have been deleted, so report + // GL_INVALID_VALUE in both cases. + GL.recordError(0x501 /* GL_INVALID_VALUE */); + } + return -1; + }; + + + var webglGetProgramUniformLocation = (program, location) => { + + if (program) { + var webglLoc = program.uniformLocsById[location]; + // program.uniformLocsById[location] stores either an integer, or a + // WebGLUniformLocation. + // If an integer, we have not yet bound the location, so do it now. The + // integer value specifies the array index we should bind to. + if (typeof webglLoc == 'number') { + program.uniformLocsById[location] = webglLoc = GLctx.getUniformLocation(program, program.uniformArrayNamesById[location] + (webglLoc > 0 ? `[${webglLoc}]` : '')); + } + // Else an already cached WebGLUniformLocation, return it. + return webglLoc; + } else { + GL.recordError(0x502/*GL_INVALID_OPERATION*/); + } + }; + + + /** @suppress{checkTypes} */ + var emscriptenWebGLGetUniform = (program, location, params, type) => { + if (!params) { + // GLES2 specification does not specify how to behave if params is a null + // pointer. Since calling this function does not make sense if params == + // null, issue a GL error to notify user about it. + GL.recordError(0x501 /* GL_INVALID_VALUE */); + return; + } + program = GL.programs[program]; + webglPrepareUniformLocationsBeforeFirstUse(program); + var data = GLctx.getUniform(program, webglGetProgramUniformLocation(program, location)); + if (typeof data == 'number' || typeof data == 'boolean') { + switch (type) { + case 0: HEAP32[((params)>>2)] = data; break; + case 2: HEAPF32[((params)>>2)] = data; break; + } + } else { + for (var i = 0; i < data.length; i++) { + switch (type) { + case 0: HEAP32[(((params)+(i*4))>>2)] = data[i]; break; + case 2: HEAPF32[(((params)+(i*4))>>2)] = data[i]; break; + } + } + } + }; + + var _emscripten_glGetUniformfv = (program, location, params) => { + emscriptenWebGLGetUniform(program, location, params, 2); + }; + + + var _emscripten_glGetUniformiv = (program, location, params) => { + emscriptenWebGLGetUniform(program, location, params, 0); + }; + + var _emscripten_glGetVertexAttribPointerv = (index, pname, pointer) => { + if (!pointer) { + // GLES2 specification does not specify how to behave if pointer is a null + // pointer. Since calling this function does not make sense if pointer == + // null, issue a GL error to notify user about it. + GL.recordError(0x501 /* GL_INVALID_VALUE */); + return; + } + HEAP32[((pointer)>>2)] = GLctx.getVertexAttribOffset(index, pname); + }; + + /** @suppress{checkTypes} */ + var emscriptenWebGLGetVertexAttrib = (index, pname, params, type) => { + if (!params) { + // GLES2 specification does not specify how to behave if params is a null + // pointer. Since calling this function does not make sense if params == + // null, issue a GL error to notify user about it. + GL.recordError(0x501 /* GL_INVALID_VALUE */); + return; + } + var data = GLctx.getVertexAttrib(index, pname); + if (pname == 0x889F/*VERTEX_ATTRIB_ARRAY_BUFFER_BINDING*/) { + HEAP32[((params)>>2)] = data && data["name"]; + } else if (typeof data == 'number' || typeof data == 'boolean') { + switch (type) { + case 0: HEAP32[((params)>>2)] = data; break; + case 2: HEAPF32[((params)>>2)] = data; break; + case 5: HEAP32[((params)>>2)] = Math.fround(data); break; + } + } else { + for (var i = 0; i < data.length; i++) { + switch (type) { + case 0: HEAP32[(((params)+(i*4))>>2)] = data[i]; break; + case 2: HEAPF32[(((params)+(i*4))>>2)] = data[i]; break; + case 5: HEAP32[(((params)+(i*4))>>2)] = Math.fround(data[i]); break; + } + } + } + }; + + var _emscripten_glGetVertexAttribfv = (index, pname, params) => { + // N.B. This function may only be called if the vertex attribute was + // specified using the function glVertexAttrib*f(), otherwise the results + // are undefined. (GLES3 spec 6.1.12) + emscriptenWebGLGetVertexAttrib(index, pname, params, 2); + }; + + + var _emscripten_glGetVertexAttribiv = (index, pname, params) => { + // N.B. This function may only be called if the vertex attribute was + // specified using the function glVertexAttrib*f(), otherwise the results + // are undefined. (GLES3 spec 6.1.12) + emscriptenWebGLGetVertexAttrib(index, pname, params, 5); + }; + + var _emscripten_glHint = (x0, x1) => GLctx.hint(x0, x1); + + var _emscripten_glIsBuffer = (buffer) => { + var b = GL.buffers[buffer]; + if (!b) return 0; + return GLctx.isBuffer(b); + }; + + var _emscripten_glIsEnabled = (x0) => GLctx.isEnabled(x0); + + var _emscripten_glIsFramebuffer = (framebuffer) => { + var fb = GL.framebuffers[framebuffer]; + if (!fb) return 0; + return GLctx.isFramebuffer(fb); + }; + + var _emscripten_glIsProgram = (program) => { + program = GL.programs[program]; + if (!program) return 0; + return GLctx.isProgram(program); + }; + + var _emscripten_glIsQueryEXT = (id) => { + var query = GL.queries[id]; + if (!query) return 0; + return GLctx.disjointTimerQueryExt['isQueryEXT'](query); + }; + + var _emscripten_glIsRenderbuffer = (renderbuffer) => { + var rb = GL.renderbuffers[renderbuffer]; + if (!rb) return 0; + return GLctx.isRenderbuffer(rb); + }; + + var _emscripten_glIsShader = (shader) => { + var s = GL.shaders[shader]; + if (!s) return 0; + return GLctx.isShader(s); + }; + + var _emscripten_glIsTexture = (id) => { + var texture = GL.textures[id]; + if (!texture) return 0; + return GLctx.isTexture(texture); + }; + + + var _emscripten_glIsVertexArray = (array) => { + + var vao = GL.vaos[array]; + if (!vao) return 0; + return GLctx.isVertexArray(vao); + }; + var _glIsVertexArray = _emscripten_glIsVertexArray; + var _emscripten_glIsVertexArrayOES = _glIsVertexArray; + + var _emscripten_glLineWidth = (x0) => GLctx.lineWidth(x0); + + var _emscripten_glLinkProgram = (program) => { + program = GL.programs[program]; + GLctx.linkProgram(program); + // Invalidate earlier computed uniform->ID mappings, those have now become stale + program.uniformLocsById = 0; // Mark as null-like so that glGetUniformLocation() knows to populate this again. + program.uniformSizeAndIdsByName = {}; + + }; + + var _emscripten_glPixelStorei = (pname, param) => { + if (pname == 3317) { + GL.unpackAlignment = param; + } else if (pname == 3314) { + GL.unpackRowLength = param; + } + GLctx.pixelStorei(pname, param); + }; + + var _emscripten_glPolygonModeWEBGL = (face, mode) => { + GLctx.webglPolygonMode['polygonModeWEBGL'](face, mode); + }; + + var _emscripten_glPolygonOffset = (x0, x1) => GLctx.polygonOffset(x0, x1); + + var _emscripten_glPolygonOffsetClampEXT = (factor, units, clamp) => { + GLctx.extPolygonOffsetClamp['polygonOffsetClampEXT'](factor, units, clamp); + }; + + var _emscripten_glQueryCounterEXT = (id, target) => { + GLctx.disjointTimerQueryExt['queryCounterEXT'](GL.queries[id], target); + }; + + var computeUnpackAlignedImageSize = (width, height, sizePerPixel) => { + function roundedToNextMultipleOf(x, y) { + return (x + y - 1) & -y; + } + var plainRowSize = (GL.unpackRowLength || width) * sizePerPixel; + var alignedRowSize = roundedToNextMultipleOf(plainRowSize, GL.unpackAlignment); + return height * alignedRowSize; + }; + + var colorChannelsInGlTextureFormat = (format) => { + // Micro-optimizations for size: map format to size by subtracting smallest + // enum value (0x1902) from all values first. Also omit the most common + // size value (1) from the list, which is assumed by formats not on the + // list. + var colorChannels = { + // 0x1902 /* GL_DEPTH_COMPONENT */ - 0x1902: 1, + // 0x1906 /* GL_ALPHA */ - 0x1902: 1, + 5: 3, + 6: 4, + // 0x1909 /* GL_LUMINANCE */ - 0x1902: 1, + 8: 2, + 29502: 3, + 29504: 4, + }; + return colorChannels[format - 0x1902]||1; + }; + + var heapObjectForWebGLType = (type) => { + // Micro-optimization for size: Subtract lowest GL enum number (0x1400/* GL_BYTE */) from type to compare + // smaller values for the heap, for shorter generated code size. + // Also the type HEAPU16 is not tested for explicitly, but any unrecognized type will return out HEAPU16. + // (since most types are HEAPU16) + type -= 0x1400; + + if (type == 1) return HEAPU8; + + if (type == 4) return HEAP32; + + if (type == 6) return HEAPF32; + + if (type == 5 + || type == 28922 + ) + return HEAPU32; + + return HEAPU16; + }; + + var toTypedArrayIndex = (pointer, heap) => + pointer >>> (31 - Math.clz32(heap.BYTES_PER_ELEMENT)); + + var emscriptenWebGLGetTexPixelData = (type, format, width, height, pixels) => { + var heap = heapObjectForWebGLType(type); + var sizePerPixel = colorChannelsInGlTextureFormat(format) * heap.BYTES_PER_ELEMENT; + var bytes = computeUnpackAlignedImageSize(width, height, sizePerPixel); + return heap.subarray(toTypedArrayIndex(pixels, heap), toTypedArrayIndex(pixels + bytes, heap)); + }; + + var _emscripten_glReadPixels = (x, y, width, height, format, type, pixels) => { + var pixelData = emscriptenWebGLGetTexPixelData(type, format, width, height, pixels); + if (!pixelData) { + GL.recordError(0x500/*GL_INVALID_ENUM*/); + return; + } + GLctx.readPixels(x, y, width, height, format, type, pixelData); + }; + + var _emscripten_glReleaseShaderCompiler = () => { + // NOP (as allowed by GLES 2.0 spec) + }; + + var _emscripten_glRenderbufferStorage = (x0, x1, x2, x3) => GLctx.renderbufferStorage(x0, x1, x2, x3); + + var _emscripten_glSampleCoverage = (value, invert) => { + GLctx.sampleCoverage(value, !!invert); + }; + + var _emscripten_glScissor = (x0, x1, x2, x3) => GLctx.scissor(x0, x1, x2, x3); + + var _emscripten_glShaderBinary = (count, shaders, binaryformat, binary, length) => { + GL.recordError(0x500/*GL_INVALID_ENUM*/); + }; + + var _emscripten_glShaderSource = (shader, count, string, length) => { + var source = GL.getSource(shader, count, string, length); + + GLctx.shaderSource(GL.shaders[shader], source); + }; + + var _emscripten_glStencilFunc = (x0, x1, x2) => GLctx.stencilFunc(x0, x1, x2); + + var _emscripten_glStencilFuncSeparate = (x0, x1, x2, x3) => GLctx.stencilFuncSeparate(x0, x1, x2, x3); + + var _emscripten_glStencilMask = (x0) => GLctx.stencilMask(x0); + + var _emscripten_glStencilMaskSeparate = (x0, x1) => GLctx.stencilMaskSeparate(x0, x1); + + var _emscripten_glStencilOp = (x0, x1, x2) => GLctx.stencilOp(x0, x1, x2); + + var _emscripten_glStencilOpSeparate = (x0, x1, x2, x3) => GLctx.stencilOpSeparate(x0, x1, x2, x3); + + + var _emscripten_glTexImage2D = (target, level, internalFormat, width, height, border, format, type, pixels) => { + var pixelData = pixels ? emscriptenWebGLGetTexPixelData(type, format, width, height, pixels) : null; + GLctx.texImage2D(target, level, internalFormat, width, height, border, format, type, pixelData); + }; + + var _emscripten_glTexParameterf = (x0, x1, x2) => GLctx.texParameterf(x0, x1, x2); + + var _emscripten_glTexParameterfv = (target, pname, params) => { + var param = HEAPF32[((params)>>2)]; + GLctx.texParameterf(target, pname, param); + }; + + var _emscripten_glTexParameteri = (x0, x1, x2) => GLctx.texParameteri(x0, x1, x2); + + var _emscripten_glTexParameteriv = (target, pname, params) => { + var param = HEAP32[((params)>>2)]; + GLctx.texParameteri(target, pname, param); + }; + + + var _emscripten_glTexSubImage2D = (target, level, xoffset, yoffset, width, height, format, type, pixels) => { + var pixelData = pixels ? emscriptenWebGLGetTexPixelData(type, format, width, height, pixels) : null; + GLctx.texSubImage2D(target, level, xoffset, yoffset, width, height, format, type, pixelData); + }; + + + var webglGetUniformLocation = (location) => { + + return webglGetProgramUniformLocation(GLctx.currentProgram, location); + }; + + var _emscripten_glUniform1f = (location, v0) => { + GLctx.uniform1f(webglGetUniformLocation(location), v0); + }; + + + var miniTempWebGLFloatBuffers = []; + + var _emscripten_glUniform1fv = (location, count, value) => { + + if (count <= 288) { + // avoid allocation when uploading few enough uniforms + var view = miniTempWebGLFloatBuffers[count]; + for (var i = 0; i < count; ++i) { + view[i] = HEAPF32[(((value)+(4*i))>>2)]; + } + } else + { + var view = HEAPF32.subarray((((value)>>2)), ((value+count*4)>>2)); + } + GLctx.uniform1fv(webglGetUniformLocation(location), view); + }; + + + var _emscripten_glUniform1i = (location, v0) => { + GLctx.uniform1i(webglGetUniformLocation(location), v0); + }; + + + var miniTempWebGLIntBuffers = []; + + var _emscripten_glUniform1iv = (location, count, value) => { + + if (count <= 288) { + // avoid allocation when uploading few enough uniforms + var view = miniTempWebGLIntBuffers[count]; + for (var i = 0; i < count; ++i) { + view[i] = HEAP32[(((value)+(4*i))>>2)]; + } + } else + { + var view = HEAP32.subarray((((value)>>2)), ((value+count*4)>>2)); + } + GLctx.uniform1iv(webglGetUniformLocation(location), view); + }; + + + var _emscripten_glUniform2f = (location, v0, v1) => { + GLctx.uniform2f(webglGetUniformLocation(location), v0, v1); + }; + + + + var _emscripten_glUniform2fv = (location, count, value) => { + + if (count <= 144) { + // avoid allocation when uploading few enough uniforms + count *= 2; + var view = miniTempWebGLFloatBuffers[count]; + for (var i = 0; i < count; i += 2) { + view[i] = HEAPF32[(((value)+(4*i))>>2)]; + view[i+1] = HEAPF32[(((value)+(4*i+4))>>2)]; + } + } else + { + var view = HEAPF32.subarray((((value)>>2)), ((value+count*8)>>2)); + } + GLctx.uniform2fv(webglGetUniformLocation(location), view); + }; + + + var _emscripten_glUniform2i = (location, v0, v1) => { + GLctx.uniform2i(webglGetUniformLocation(location), v0, v1); + }; + + + + var _emscripten_glUniform2iv = (location, count, value) => { + + if (count <= 144) { + // avoid allocation when uploading few enough uniforms + count *= 2; + var view = miniTempWebGLIntBuffers[count]; + for (var i = 0; i < count; i += 2) { + view[i] = HEAP32[(((value)+(4*i))>>2)]; + view[i+1] = HEAP32[(((value)+(4*i+4))>>2)]; + } + } else + { + var view = HEAP32.subarray((((value)>>2)), ((value+count*8)>>2)); + } + GLctx.uniform2iv(webglGetUniformLocation(location), view); + }; + + + var _emscripten_glUniform3f = (location, v0, v1, v2) => { + GLctx.uniform3f(webglGetUniformLocation(location), v0, v1, v2); + }; + + + + var _emscripten_glUniform3fv = (location, count, value) => { + + if (count <= 96) { + // avoid allocation when uploading few enough uniforms + count *= 3; + var view = miniTempWebGLFloatBuffers[count]; + for (var i = 0; i < count; i += 3) { + view[i] = HEAPF32[(((value)+(4*i))>>2)]; + view[i+1] = HEAPF32[(((value)+(4*i+4))>>2)]; + view[i+2] = HEAPF32[(((value)+(4*i+8))>>2)]; + } + } else + { + var view = HEAPF32.subarray((((value)>>2)), ((value+count*12)>>2)); + } + GLctx.uniform3fv(webglGetUniformLocation(location), view); + }; + + + var _emscripten_glUniform3i = (location, v0, v1, v2) => { + GLctx.uniform3i(webglGetUniformLocation(location), v0, v1, v2); + }; + + + + var _emscripten_glUniform3iv = (location, count, value) => { + + if (count <= 96) { + // avoid allocation when uploading few enough uniforms + count *= 3; + var view = miniTempWebGLIntBuffers[count]; + for (var i = 0; i < count; i += 3) { + view[i] = HEAP32[(((value)+(4*i))>>2)]; + view[i+1] = HEAP32[(((value)+(4*i+4))>>2)]; + view[i+2] = HEAP32[(((value)+(4*i+8))>>2)]; + } + } else + { + var view = HEAP32.subarray((((value)>>2)), ((value+count*12)>>2)); + } + GLctx.uniform3iv(webglGetUniformLocation(location), view); + }; + + + var _emscripten_glUniform4f = (location, v0, v1, v2, v3) => { + GLctx.uniform4f(webglGetUniformLocation(location), v0, v1, v2, v3); + }; + + + + var _emscripten_glUniform4fv = (location, count, value) => { + + if (count <= 72) { + // avoid allocation when uploading few enough uniforms + var view = miniTempWebGLFloatBuffers[4*count]; + // hoist the heap out of the loop for size and for pthreads+growth. + var heap = HEAPF32; + value = ((value)>>2); + count *= 4; + for (var i = 0; i < count; i += 4) { + var dst = value + i; + view[i] = heap[dst]; + view[i + 1] = heap[dst + 1]; + view[i + 2] = heap[dst + 2]; + view[i + 3] = heap[dst + 3]; + } + } else + { + var view = HEAPF32.subarray((((value)>>2)), ((value+count*16)>>2)); + } + GLctx.uniform4fv(webglGetUniformLocation(location), view); + }; + + + var _emscripten_glUniform4i = (location, v0, v1, v2, v3) => { + GLctx.uniform4i(webglGetUniformLocation(location), v0, v1, v2, v3); + }; + + + + var _emscripten_glUniform4iv = (location, count, value) => { + + if (count <= 72) { + // avoid allocation when uploading few enough uniforms + count *= 4; + var view = miniTempWebGLIntBuffers[count]; + for (var i = 0; i < count; i += 4) { + view[i] = HEAP32[(((value)+(4*i))>>2)]; + view[i+1] = HEAP32[(((value)+(4*i+4))>>2)]; + view[i+2] = HEAP32[(((value)+(4*i+8))>>2)]; + view[i+3] = HEAP32[(((value)+(4*i+12))>>2)]; + } + } else + { + var view = HEAP32.subarray((((value)>>2)), ((value+count*16)>>2)); + } + GLctx.uniform4iv(webglGetUniformLocation(location), view); + }; + + + + var _emscripten_glUniformMatrix2fv = (location, count, transpose, value) => { + + if (count <= 72) { + // avoid allocation when uploading few enough uniforms + count *= 4; + var view = miniTempWebGLFloatBuffers[count]; + for (var i = 0; i < count; i += 4) { + view[i] = HEAPF32[(((value)+(4*i))>>2)]; + view[i+1] = HEAPF32[(((value)+(4*i+4))>>2)]; + view[i+2] = HEAPF32[(((value)+(4*i+8))>>2)]; + view[i+3] = HEAPF32[(((value)+(4*i+12))>>2)]; + } + } else + { + var view = HEAPF32.subarray((((value)>>2)), ((value+count*16)>>2)); + } + GLctx.uniformMatrix2fv(webglGetUniformLocation(location), !!transpose, view); + }; + + + + var _emscripten_glUniformMatrix3fv = (location, count, transpose, value) => { + + if (count <= 32) { + // avoid allocation when uploading few enough uniforms + count *= 9; + var view = miniTempWebGLFloatBuffers[count]; + for (var i = 0; i < count; i += 9) { + view[i] = HEAPF32[(((value)+(4*i))>>2)]; + view[i+1] = HEAPF32[(((value)+(4*i+4))>>2)]; + view[i+2] = HEAPF32[(((value)+(4*i+8))>>2)]; + view[i+3] = HEAPF32[(((value)+(4*i+12))>>2)]; + view[i+4] = HEAPF32[(((value)+(4*i+16))>>2)]; + view[i+5] = HEAPF32[(((value)+(4*i+20))>>2)]; + view[i+6] = HEAPF32[(((value)+(4*i+24))>>2)]; + view[i+7] = HEAPF32[(((value)+(4*i+28))>>2)]; + view[i+8] = HEAPF32[(((value)+(4*i+32))>>2)]; + } + } else + { + var view = HEAPF32.subarray((((value)>>2)), ((value+count*36)>>2)); + } + GLctx.uniformMatrix3fv(webglGetUniformLocation(location), !!transpose, view); + }; + + + + var _emscripten_glUniformMatrix4fv = (location, count, transpose, value) => { + + if (count <= 18) { + // avoid allocation when uploading few enough uniforms + var view = miniTempWebGLFloatBuffers[16*count]; + // hoist the heap out of the loop for size and for pthreads+growth. + var heap = HEAPF32; + value = ((value)>>2); + count *= 16; + for (var i = 0; i < count; i += 16) { + var dst = value + i; + view[i] = heap[dst]; + view[i + 1] = heap[dst + 1]; + view[i + 2] = heap[dst + 2]; + view[i + 3] = heap[dst + 3]; + view[i + 4] = heap[dst + 4]; + view[i + 5] = heap[dst + 5]; + view[i + 6] = heap[dst + 6]; + view[i + 7] = heap[dst + 7]; + view[i + 8] = heap[dst + 8]; + view[i + 9] = heap[dst + 9]; + view[i + 10] = heap[dst + 10]; + view[i + 11] = heap[dst + 11]; + view[i + 12] = heap[dst + 12]; + view[i + 13] = heap[dst + 13]; + view[i + 14] = heap[dst + 14]; + view[i + 15] = heap[dst + 15]; + } + } else + { + var view = HEAPF32.subarray((((value)>>2)), ((value+count*64)>>2)); + } + GLctx.uniformMatrix4fv(webglGetUniformLocation(location), !!transpose, view); + }; + + var _emscripten_glUseProgram = (program) => { + program = GL.programs[program]; + GLctx.useProgram(program); + // Record the currently active program so that we can access the uniform + // mapping table of that program. + GLctx.currentProgram = program; + }; + + var _emscripten_glValidateProgram = (program) => { + GLctx.validateProgram(GL.programs[program]); + }; + + var _emscripten_glVertexAttrib1f = (x0, x1) => GLctx.vertexAttrib1f(x0, x1); + + var _emscripten_glVertexAttrib1fv = (index, v) => { + + GLctx.vertexAttrib1f(index, HEAPF32[v>>2]); + }; + + var _emscripten_glVertexAttrib2f = (x0, x1, x2) => GLctx.vertexAttrib2f(x0, x1, x2); + + var _emscripten_glVertexAttrib2fv = (index, v) => { + + GLctx.vertexAttrib2f(index, HEAPF32[v>>2], HEAPF32[v+4>>2]); + }; + + var _emscripten_glVertexAttrib3f = (x0, x1, x2, x3) => GLctx.vertexAttrib3f(x0, x1, x2, x3); + + var _emscripten_glVertexAttrib3fv = (index, v) => { + + GLctx.vertexAttrib3f(index, HEAPF32[v>>2], HEAPF32[v+4>>2], HEAPF32[v+8>>2]); + }; + + var _emscripten_glVertexAttrib4f = (x0, x1, x2, x3, x4) => GLctx.vertexAttrib4f(x0, x1, x2, x3, x4); + + var _emscripten_glVertexAttrib4fv = (index, v) => { + + GLctx.vertexAttrib4f(index, HEAPF32[v>>2], HEAPF32[v+4>>2], HEAPF32[v+8>>2], HEAPF32[v+12>>2]); + }; + + + var _emscripten_glVertexAttribDivisor = (index, divisor) => { + GLctx.vertexAttribDivisor(index, divisor); + }; + var _glVertexAttribDivisor = _emscripten_glVertexAttribDivisor; + var _emscripten_glVertexAttribDivisorANGLE = _glVertexAttribDivisor; + + var _emscripten_glVertexAttribPointer = (index, size, type, normalized, stride, ptr) => { + GLctx.vertexAttribPointer(index, size, type, !!normalized, stride, ptr); + }; + + var _emscripten_glViewport = (x0, x1, x2, x3) => GLctx.viewport(x0, x1, x2, x3); + + var abortOnCannotGrowMemory = (requestedSize) => { + abort(`Cannot enlarge memory arrays to size ${requestedSize} bytes (OOM). Either (1) compile with -sINITIAL_MEMORY=X with X higher than the current value ${HEAP8.length}, (2) compile with -sALLOW_MEMORY_GROWTH which allows increasing the size at runtime, or (3) if you want malloc to return NULL (0) instead of this abort, compile with -sABORTING_MALLOC=0`); + }; + var _emscripten_resize_heap = (requestedSize) => { + var oldSize = HEAPU8.length; + // With CAN_ADDRESS_2GB or MEMORY64, pointers are already unsigned. + requestedSize >>>= 0; + abortOnCannotGrowMemory(requestedSize); + }; + + var _emscripten_run_script = (ptr) => { + eval(UTF8ToString(ptr)); + }; + + /** @suppress {checkTypes} */ + var _emscripten_sample_gamepad_data = () => { + try { + if (navigator.getGamepads) return (JSEvents.lastGamepadState = navigator.getGamepads()) + ? 0 : -1; + } catch(e) { + err(`navigator.getGamepads() exists, but failed to execute with exception ${e}. Disabling Gamepad access.`); + navigator.getGamepads = null; // Disable getGamepads() so that it won't be attempted to be used again. + } + return -1; + }; + + var findCanvasEventTarget = findEventTarget; + var _emscripten_set_canvas_element_size = (target, width, height) => { + var canvas = findCanvasEventTarget(target); + if (!canvas) return -4; + canvas.width = width; + canvas.height = height; + return 0; + }; + + + var fillMouseEventData = (eventStruct, e, target) => { + assert(eventStruct % 4 == 0); + HEAPF64[((eventStruct)>>3)] = e.timeStamp; + var idx = ((eventStruct)>>2); + HEAP32[idx + 2] = e.screenX; + HEAP32[idx + 3] = e.screenY; + HEAP32[idx + 4] = e.clientX; + HEAP32[idx + 5] = e.clientY; + HEAP8[eventStruct + 24] = e.ctrlKey; + HEAP8[eventStruct + 25] = e.shiftKey; + HEAP8[eventStruct + 26] = e.altKey; + HEAP8[eventStruct + 27] = e.metaKey; + HEAP16[idx*2 + 14] = e.button; + HEAP16[idx*2 + 15] = e.buttons; + + HEAP32[idx + 8] = e["movementX"]; + + HEAP32[idx + 9] = e["movementY"]; + + // Note: rect contains doubles (truncated to placate SAFE_HEAP, which is the same behaviour when writing to HEAP32 anyway) + var rect = getBoundingClientRect(target); + HEAP32[idx + 10] = e.clientX - (rect.left | 0); + HEAP32[idx + 11] = e.clientY - (rect.top | 0); + }; + + + + var wasmTableMirror = []; + + + var getWasmTableEntry = (funcPtr) => { + var func = wasmTableMirror[funcPtr]; + if (!func) { + /** @suppress {checkTypes} */ + wasmTableMirror[funcPtr] = func = wasmTable.get(funcPtr); + } + /** @suppress {checkTypes} */ + assert(wasmTable.get(funcPtr) == func, 'table mirror is out of date'); + return func; + }; + var registerMouseEventCallback = (target, userData, useCapture, callbackfunc, eventTypeId, eventTypeString, targetThread) => { + var eventSize = 64; + JSEvents.mouseEvent ||= _malloc(eventSize); + target = findEventTarget(target); + + var mouseEventHandlerFunc = (e) => { + // TODO: Make this access thread safe, or this could update live while app is reading it. + fillMouseEventData(JSEvents.mouseEvent, e, target); + + if (getWasmTableEntry(callbackfunc)(eventTypeId, JSEvents.mouseEvent, userData)) e.preventDefault(); + }; + + var eventHandler = { + target, + allowsDeferredCalls: eventTypeString != 'mousemove' && eventTypeString != 'mouseenter' && eventTypeString != 'mouseleave', // Mouse move events do not allow fullscreen/pointer lock requests to be handled in them! + eventTypeString, + eventTypeId, + userData, + callbackfunc, + handlerFunc: mouseEventHandlerFunc, + useCapture + }; + return JSEvents.registerOrRemoveHandler(eventHandler); + }; + var _emscripten_set_click_callback_on_thread = (target, userData, useCapture, callbackfunc, targetThread) => + registerMouseEventCallback(target, userData, useCapture, callbackfunc, 4, "click", targetThread); + + + + + + function getFullscreenElement() { + return document.fullscreenElement || document.mozFullScreenElement || + document.webkitFullscreenElement || document.webkitCurrentFullScreenElement || + document.msFullscreenElement; + } + var fillFullscreenChangeEventData = (eventStruct) => { + var fullscreenElement = getFullscreenElement(); + var isFullscreen = !!fullscreenElement; + // Assigning a boolean to HEAP32 with expected type coercion. + /** @suppress{checkTypes} */ + HEAP8[eventStruct] = isFullscreen; + HEAP8[(eventStruct)+(1)] = JSEvents.fullscreenEnabled(); + // If transitioning to fullscreen, report info about the element that is now fullscreen. + // If transitioning to windowed mode, report info about the element that just was fullscreen. + var reportedElement = isFullscreen ? fullscreenElement : JSEvents.previousFullscreenElement; + var nodeName = JSEvents.getNodeNameForTarget(reportedElement); + var id = reportedElement?.id ?? ''; + stringToUTF8(nodeName, eventStruct + 2, 128); + stringToUTF8(id, eventStruct + 130, 128); + HEAP32[(((eventStruct)+(260))>>2)] = reportedElement?.clientWidth ?? 0; + HEAP32[(((eventStruct)+(264))>>2)] = reportedElement?.clientHeight ?? 0; + HEAP32[(((eventStruct)+(268))>>2)] = screen.width; + HEAP32[(((eventStruct)+(272))>>2)] = screen.height; + if (isFullscreen) { + JSEvents.previousFullscreenElement = fullscreenElement; + } + }; + + + var registerFullscreenChangeEventCallback = (target, userData, useCapture, callbackfunc, eventTypeId, eventTypeString, targetThread) => { + var eventSize = 276; + JSEvents.fullscreenChangeEvent ||= _malloc(eventSize); + + var fullscreenChangeEventHandlerFunc = (e) => { + var fullscreenChangeEvent = JSEvents.fullscreenChangeEvent; + fillFullscreenChangeEventData(fullscreenChangeEvent); + + if (getWasmTableEntry(callbackfunc)(eventTypeId, fullscreenChangeEvent, userData)) e.preventDefault(); + }; + + var eventHandler = { + target, + eventTypeString, + eventTypeId, + userData, + callbackfunc, + handlerFunc: fullscreenChangeEventHandlerFunc, + useCapture + }; + return JSEvents.registerOrRemoveHandler(eventHandler); + }; + + var _emscripten_set_fullscreenchange_callback_on_thread = (target, userData, useCapture, callbackfunc, targetThread) => { + if (!JSEvents.fullscreenEnabled()) return -1; + target = findEventTarget(target); + if (!target) return -4; + + // As of Safari 13.0.3 on macOS Catalina 10.15.1 still ships with prefixed webkitfullscreenchange. TODO: revisit this check once Safari ships unprefixed version. + // TODO: When this block is removed, also change test/test_html5_remove_event_listener.c test expectation on emscripten_set_fullscreenchange_callback(). + registerFullscreenChangeEventCallback(target, userData, useCapture, callbackfunc, 19, "webkitfullscreenchange", targetThread); + + return registerFullscreenChangeEventCallback(target, userData, useCapture, callbackfunc, 19, "fullscreenchange", targetThread); + }; + + + + + + var registerGamepadEventCallback = (target, userData, useCapture, callbackfunc, eventTypeId, eventTypeString, targetThread) => { + var eventSize = 1240; + JSEvents.gamepadEvent ||= _malloc(eventSize); + + var gamepadEventHandlerFunc = (e) => { + var gamepadEvent = JSEvents.gamepadEvent; + fillGamepadEventData(gamepadEvent, e["gamepad"]); + + if (getWasmTableEntry(callbackfunc)(eventTypeId, gamepadEvent, userData)) e.preventDefault(); + }; + + var eventHandler = { + target: findEventTarget(target), + allowsDeferredCalls: true, + eventTypeString, + eventTypeId, + userData, + callbackfunc, + handlerFunc: gamepadEventHandlerFunc, + useCapture + }; + return JSEvents.registerOrRemoveHandler(eventHandler); + }; + + var _emscripten_set_gamepadconnected_callback_on_thread = (userData, useCapture, callbackfunc, targetThread) => { + if (_emscripten_sample_gamepad_data()) return -1; + return registerGamepadEventCallback(2, userData, useCapture, callbackfunc, 26, "gamepadconnected", targetThread); + }; + + + var _emscripten_set_gamepaddisconnected_callback_on_thread = (userData, useCapture, callbackfunc, targetThread) => { + if (_emscripten_sample_gamepad_data()) return -1; + return registerGamepadEventCallback(2, userData, useCapture, callbackfunc, 27, "gamepaddisconnected", targetThread); + }; + + var _emscripten_set_mousemove_callback_on_thread = (target, userData, useCapture, callbackfunc, targetThread) => + registerMouseEventCallback(target, userData, useCapture, callbackfunc, 8, "mousemove", targetThread); + + + + var fillPointerlockChangeEventData = (eventStruct) => { + var pointerLockElement = document.pointerLockElement; + var isPointerlocked = !!pointerLockElement; + // Assigning a boolean to HEAP32 with expected type coercion. + /** @suppress{checkTypes} */ + HEAP8[eventStruct] = isPointerlocked; + var nodeName = JSEvents.getNodeNameForTarget(pointerLockElement); + var id = pointerLockElement?.id ?? ''; + stringToUTF8(nodeName, eventStruct + 1, 128); + stringToUTF8(id, eventStruct + 129, 128); + }; + + + var registerPointerlockChangeEventCallback = (target, userData, useCapture, callbackfunc, eventTypeId, eventTypeString, targetThread) => { + var eventSize = 257; + JSEvents.pointerlockChangeEvent ||= _malloc(eventSize); + + var pointerlockChangeEventHandlerFunc = (e) => { + var pointerlockChangeEvent = JSEvents.pointerlockChangeEvent; + fillPointerlockChangeEventData(pointerlockChangeEvent); + + if (getWasmTableEntry(callbackfunc)(eventTypeId, pointerlockChangeEvent, userData)) e.preventDefault(); + }; + + var eventHandler = { + target, + eventTypeString, + eventTypeId, + userData, + callbackfunc, + handlerFunc: pointerlockChangeEventHandlerFunc, + useCapture + }; + return JSEvents.registerOrRemoveHandler(eventHandler); + }; + + var _emscripten_set_pointerlockchange_callback_on_thread = (target, userData, useCapture, callbackfunc, targetThread) => { + if (!document.body?.requestPointerLock) { + return -1; + } + + target = findEventTarget(target); + if (!target) return -4; + return registerPointerlockChangeEventCallback(target, userData, useCapture, callbackfunc, 20, "pointerlockchange", targetThread); + }; + + + + + var registerUiEventCallback = (target, userData, useCapture, callbackfunc, eventTypeId, eventTypeString, targetThread) => { + var eventSize = 36; + JSEvents.uiEvent ||= _malloc(eventSize); + + target = findEventTarget(target); + + var uiEventHandlerFunc = (e) => { + if (e.target != target) { + // Never take ui events such as scroll via a 'bubbled' route, but always from the direct element that + // was targeted. Otherwise e.g. if app logs a message in response to a page scroll, the Emscripten log + // message box could cause to scroll, generating a new (bubbled) scroll message, causing a new log print, + // causing a new scroll, etc.. + return; + } + var b = document.body; // Take document.body to a variable, Closure compiler does not outline access to it on its own. + if (!b) { + // During a page unload 'body' can be null, with "Cannot read property 'clientWidth' of null" being thrown + return; + } + var uiEvent = JSEvents.uiEvent; + HEAP32[((uiEvent)>>2)] = 0; // always zero for resize and scroll + HEAP32[(((uiEvent)+(4))>>2)] = b.clientWidth; + HEAP32[(((uiEvent)+(8))>>2)] = b.clientHeight; + HEAP32[(((uiEvent)+(12))>>2)] = innerWidth; + HEAP32[(((uiEvent)+(16))>>2)] = innerHeight; + HEAP32[(((uiEvent)+(20))>>2)] = outerWidth; + HEAP32[(((uiEvent)+(24))>>2)] = outerHeight; + HEAP32[(((uiEvent)+(28))>>2)] = pageXOffset | 0; // scroll offsets are float + HEAP32[(((uiEvent)+(32))>>2)] = pageYOffset | 0; + if (getWasmTableEntry(callbackfunc)(eventTypeId, uiEvent, userData)) e.preventDefault(); + }; + + var eventHandler = { + target, + eventTypeString, + eventTypeId, + userData, + callbackfunc, + handlerFunc: uiEventHandlerFunc, + useCapture + }; + return JSEvents.registerOrRemoveHandler(eventHandler); + }; + var _emscripten_set_resize_callback_on_thread = (target, userData, useCapture, callbackfunc, targetThread) => + registerUiEventCallback(target, userData, useCapture, callbackfunc, 10, "resize", targetThread); + + + + + + var registerTouchEventCallback = (target, userData, useCapture, callbackfunc, eventTypeId, eventTypeString, targetThread) => { + var eventSize = 1552; + JSEvents.touchEvent ||= _malloc(eventSize); + + target = findEventTarget(target); + + var touchEventHandlerFunc = (e) => { + assert(e); + var t, touches = {}, et = e.touches; + // To ease marshalling different kinds of touches that browser reports (all touches are listed in e.touches, + // only changed touches in e.changedTouches, and touches on target at a.targetTouches), mark a boolean in + // each Touch object so that we can later loop only once over all touches we see to marshall over to Wasm. + + for (let t of et) { + // Browser might recycle the generated Touch objects between each frame (Firefox on Android), so reset any + // changed/target states we may have set from previous frame. + t.isChanged = t.onTarget = 0; + touches[t.identifier] = t; + } + // Mark which touches are part of the changedTouches list. + for (let t of e.changedTouches) { + t.isChanged = 1; + touches[t.identifier] = t; + } + // Mark which touches are part of the targetTouches list. + for (let t of e.targetTouches) { + touches[t.identifier].onTarget = 1; + } + + var touchEvent = JSEvents.touchEvent; + HEAPF64[((touchEvent)>>3)] = e.timeStamp; + HEAP8[touchEvent + 12] = e.ctrlKey; + HEAP8[touchEvent + 13] = e.shiftKey; + HEAP8[touchEvent + 14] = e.altKey; + HEAP8[touchEvent + 15] = e.metaKey; + var idx = touchEvent + 16; + var targetRect = getBoundingClientRect(target); + var numTouches = 0; + for (let t of Object.values(touches)) { + var idx32 = ((idx)>>2); // Pre-shift the ptr to index to HEAP32 to save code size + HEAP32[idx32 + 0] = t.identifier; + HEAP32[idx32 + 1] = t.screenX; + HEAP32[idx32 + 2] = t.screenY; + HEAP32[idx32 + 3] = t.clientX; + HEAP32[idx32 + 4] = t.clientY; + HEAP32[idx32 + 5] = t.pageX; + HEAP32[idx32 + 6] = t.pageY; + HEAP8[idx + 28] = t.isChanged; + HEAP8[idx + 29] = t.onTarget; + HEAP32[idx32 + 8] = t.clientX - (targetRect.left | 0); + HEAP32[idx32 + 9] = t.clientY - (targetRect.top | 0); + + idx += 48; + + if (++numTouches > 31) { + break; + } + } + HEAP32[(((touchEvent)+(8))>>2)] = numTouches; + + if (getWasmTableEntry(callbackfunc)(eventTypeId, touchEvent, userData)) e.preventDefault(); + }; + + var eventHandler = { + target, + allowsDeferredCalls: eventTypeString == 'touchstart' || eventTypeString == 'touchend', + eventTypeString, + eventTypeId, + userData, + callbackfunc, + handlerFunc: touchEventHandlerFunc, + useCapture + }; + return JSEvents.registerOrRemoveHandler(eventHandler); + }; + var _emscripten_set_touchcancel_callback_on_thread = (target, userData, useCapture, callbackfunc, targetThread) => + registerTouchEventCallback(target, userData, useCapture, callbackfunc, 25, "touchcancel", targetThread); + + var _emscripten_set_touchend_callback_on_thread = (target, userData, useCapture, callbackfunc, targetThread) => + registerTouchEventCallback(target, userData, useCapture, callbackfunc, 23, "touchend", targetThread); + + var _emscripten_set_touchmove_callback_on_thread = (target, userData, useCapture, callbackfunc, targetThread) => + registerTouchEventCallback(target, userData, useCapture, callbackfunc, 24, "touchmove", targetThread); + + var _emscripten_set_touchstart_callback_on_thread = (target, userData, useCapture, callbackfunc, targetThread) => + registerTouchEventCallback(target, userData, useCapture, callbackfunc, 22, "touchstart", targetThread); + + var handleException = (e) => { + // Certain exception types we do not treat as errors since they are used for + // internal control flow. + // 1. ExitStatus, which is thrown by exit() + // 2. "unwind", which is thrown by emscripten_unwind_to_js_event_loop() and others + // that wish to return to JS event loop. + if (e instanceof ExitStatus || e == 'unwind') { + return EXITSTATUS; + } + checkStackCookie(); + if (e instanceof WebAssembly.RuntimeError) { + if (_emscripten_stack_get_current() <= 0) { + err('Stack overflow detected. You can try increasing -sSTACK_SIZE (currently set to 524288)'); + } + } + quit_(1, e); + }; + + + var runtimeKeepaliveCounter = 0; + var keepRuntimeAlive = () => noExitRuntime || runtimeKeepaliveCounter > 0; + var _proc_exit = (code) => { + EXITSTATUS = code; + if (!keepRuntimeAlive()) { + Module['onExit']?.(code); + ABORT = true; + } + quit_(code, new ExitStatus(code)); + }; + + + /** @param {boolean|number=} implicit */ + var exitJS = (status, implicit) => { + EXITSTATUS = status; + + checkUnflushedContent(); + + // if exit() was called explicitly, warn the user if the runtime isn't actually being shut down + if (keepRuntimeAlive() && !implicit) { + var msg = `program exited (with status: ${status}), but keepRuntimeAlive() is set (counter=${runtimeKeepaliveCounter}) due to an async operation, so halting execution but not exiting the runtime or preventing further async execution (you can use emscripten_force_exit, if you want to force a true shutdown)`; + err(msg); + } + + _proc_exit(status); + }; + var _exit = exitJS; + + + var maybeExit = () => { + if (!keepRuntimeAlive()) { + try { + _exit(EXITSTATUS); + } catch (e) { + handleException(e); + } + } + }; + var callUserCallback = (func) => { + if (ABORT) { + err('user callback triggered after runtime exited or application aborted. Ignoring.'); + return; + } + try { + return func(); + } catch (e) { + handleException(e); + } finally { + maybeExit(); + } + }; + + + /** @param {number=} timeout */ + var safeSetTimeout = (func, timeout) => { + + return setTimeout(() => { + + callUserCallback(func); + }, timeout); + }; + + + + var Browser = { + useWebGL:false, + isFullscreen:false, + pointerLock:false, + moduleContextCreatedCallbacks:[], + workers:[], + preloadedImages:{ + }, + preloadedAudios:{ + }, + getCanvas:() => Module['canvas'], + init() { + if (Browser.initted) return; + Browser.initted = true; + + // Support for plugins that can process preloaded files. You can add more of these to + // your app by creating and appending to preloadPlugins. + // + // Each plugin is asked if it can handle a file based on the file's name. If it can, + // it is given the file's raw data. When it is done, it calls a callback with the file's + // (possibly modified) data. For example, a plugin might decompress a file, or it + // might create some side data structure for use later (like an Image element, etc.). + + var imagePlugin = {}; + imagePlugin['canHandle'] = (name) => { + return !Module['noImageDecoding'] && /\.(jpg|jpeg|png|bmp|webp)$/i.test(name); + }; + imagePlugin['handle'] = async (byteArray, name) => { + var b = new Blob([byteArray], { type: Browser.getMimetype(name) }); + if (b.size !== byteArray.length) { // Safari bug #118630 + // Safari's Blob can only take an ArrayBuffer + b = new Blob([(new Uint8Array(byteArray)).buffer], { type: Browser.getMimetype(name) }); + } + var url = URL.createObjectURL(b); + return new Promise((resolve, reject) => { + var img = new Image(); + img.onload = () => { + assert(img.complete, `Image ${name} could not be decoded`); + var canvas = /** @type {!HTMLCanvasElement} */ (document.createElement('canvas')); + canvas.width = img.width; + canvas.height = img.height; + var ctx = canvas.getContext('2d'); + ctx.drawImage(img, 0, 0); + Browser.preloadedImages[name] = canvas; + URL.revokeObjectURL(url); + resolve(byteArray); + }; + img.onerror = (event) => { + err(`Image ${url} could not be decoded`); + reject(); + }; + img.src = url; + }); + }; + preloadPlugins.push(imagePlugin); + + var audioPlugin = {}; + audioPlugin['canHandle'] = (name) => { + return !Module['noAudioDecoding'] && name.slice(-4) in { '.ogg': 1, '.wav': 1, '.mp3': 1 }; + }; + audioPlugin['handle'] = async (byteArray, name) => { + return new Promise((resolve, reject) => { + var done = false; + function finish(audio) { + if (done) return; + done = true; + Browser.preloadedAudios[name] = audio; + resolve(byteArray); + } + var b = new Blob([byteArray], { type: Browser.getMimetype(name) }); + var url = URL.createObjectURL(b); // XXX we never revoke this! + var audio = new Audio(); + audio.addEventListener('canplaythrough', () => finish(audio), false); // use addEventListener due to chromium bug 124926 + audio.onerror = (event) => { + if (done) return; + err(`warning: browser could not fully decode audio ${name}, trying slower base64 approach`); + function encode64(data) { + var BASE = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'; + var PAD = '='; + var ret = ''; + var leftchar = 0; + var leftbits = 0; + for (var i = 0; i < data.length; i++) { + leftchar = (leftchar << 8) | data[i]; + leftbits += 8; + while (leftbits >= 6) { + var curr = (leftchar >> (leftbits-6)) & 0x3f; + leftbits -= 6; + ret += BASE[curr]; + } + } + if (leftbits == 2) { + ret += BASE[(leftchar&3) << 4]; + ret += PAD + PAD; + } else if (leftbits == 4) { + ret += BASE[(leftchar&0xf) << 2]; + ret += PAD; + } + return ret; + } + audio.src = 'data:audio/x-' + name.slice(-3) + ';base64,' + encode64(byteArray); + finish(audio); // we don't wait for confirmation this worked - but it's worth trying + }; + audio.src = url; + // workaround for chrome bug 124926 - we do not always get oncanplaythrough or onerror + safeSetTimeout(() => { + finish(audio); // try to use it even though it is not necessarily ready to play + }, 10000); + }); + }; + preloadPlugins.push(audioPlugin); + + // Canvas event setup + + function pointerLockChange() { + var canvas = Browser.getCanvas(); + Browser.pointerLock = document.pointerLockElement === canvas; + } + var canvas = Browser.getCanvas(); + if (canvas) { + // forced aspect ratio can be enabled by defining 'forcedAspectRatio' on Module + // Module['forcedAspectRatio'] = 4 / 3; + + document.addEventListener('pointerlockchange', pointerLockChange, false); + + if (Module['elementPointerLock']) { + canvas.addEventListener("click", (ev) => { + if (!Browser.pointerLock && Browser.getCanvas().requestPointerLock) { + Browser.getCanvas().requestPointerLock(); + ev.preventDefault(); + } + }, false); + } + } + }, + createContext(/** @type {HTMLCanvasElement} */ canvas, useWebGL, setInModule, webGLContextAttributes) { + if (useWebGL && Module['ctx'] && canvas == Browser.getCanvas()) return Module['ctx']; // no need to recreate GL context if it's already been created for this canvas. + + var ctx; + var contextHandle; + if (useWebGL) { + // For GLES2/desktop GL compatibility, adjust a few defaults to be different to WebGL defaults, so that they align better with the desktop defaults. + var contextAttributes = { + antialias: false, + alpha: false, + majorVersion: 1, + }; + + if (webGLContextAttributes) { + for (var attribute in webGLContextAttributes) { + contextAttributes[attribute] = webGLContextAttributes[attribute]; + } + } + + // This check of existence of GL is here to satisfy Closure compiler, which yells if variable GL is referenced below but GL object is not + // actually compiled in because application is not doing any GL operations. TODO: Ideally if GL is not being used, this function + // Browser.createContext() should not even be emitted. + if (typeof GL != 'undefined') { + contextHandle = GL.createContext(canvas, contextAttributes); + if (contextHandle) { + ctx = GL.getContext(contextHandle).GLctx; + } + } + } else { + ctx = canvas.getContext('2d'); + } + + if (!ctx) return null; + + if (setInModule) { + if (!useWebGL) assert(typeof GLctx == 'undefined', 'cannot set in module if GLctx is used, but we are a non-GL context that would replace it'); + Module['ctx'] = ctx; + if (useWebGL) GL.makeContextCurrent(contextHandle); + Browser.useWebGL = useWebGL; + Browser.moduleContextCreatedCallbacks.forEach((callback) => callback()); + Browser.init(); + } + return ctx; + }, + fullscreenHandlersInstalled:false, + lockPointer:undefined, + resizeCanvas:undefined, + requestFullscreen(lockPointer, resizeCanvas) { + Browser.lockPointer = lockPointer; + Browser.resizeCanvas = resizeCanvas; + if (typeof Browser.lockPointer == 'undefined') Browser.lockPointer = true; + if (typeof Browser.resizeCanvas == 'undefined') Browser.resizeCanvas = false; + + var canvas = Browser.getCanvas(); + function fullscreenChange() { + Browser.isFullscreen = false; + var canvasContainer = canvas.parentNode; + if (getFullscreenElement() === canvasContainer) { + canvas.exitFullscreen = Browser.exitFullscreen; + if (Browser.lockPointer) canvas.requestPointerLock(); + Browser.isFullscreen = true; + if (Browser.resizeCanvas) { + Browser.setFullscreenCanvasSize(); + } else { + Browser.updateCanvasDimensions(canvas); + } + } else { + // remove the full screen specific parent of the canvas again to restore the HTML structure from before going full screen + canvasContainer.parentNode.insertBefore(canvas, canvasContainer); + canvasContainer.parentNode.removeChild(canvasContainer); + + if (Browser.resizeCanvas) { + Browser.setWindowedCanvasSize(); + } else { + Browser.updateCanvasDimensions(canvas); + } + } + Module['onFullScreen']?.(Browser.isFullscreen); + Module['onFullscreen']?.(Browser.isFullscreen); + } + + if (!Browser.fullscreenHandlersInstalled) { + Browser.fullscreenHandlersInstalled = true; + document.addEventListener('fullscreenchange', fullscreenChange, false); + document.addEventListener('mozfullscreenchange', fullscreenChange, false); + document.addEventListener('webkitfullscreenchange', fullscreenChange, false); + document.addEventListener('MSFullscreenChange', fullscreenChange, false); + } + + // create a new parent to ensure the canvas has no siblings. this allows browsers to optimize full screen performance when its parent is the full screen root + var canvasContainer = document.createElement("div"); + canvas.parentNode.insertBefore(canvasContainer, canvas); + canvasContainer.appendChild(canvas); + + // use parent of canvas as full screen root to allow aspect ratio correction (Firefox stretches the root to screen size) + canvasContainer.requestFullscreen = canvasContainer['requestFullscreen'] || + canvasContainer['mozRequestFullScreen'] || + canvasContainer['msRequestFullscreen'] || + (canvasContainer['webkitRequestFullscreen'] ? () => canvasContainer['webkitRequestFullscreen'](Element['ALLOW_KEYBOARD_INPUT']) : null) || + (canvasContainer['webkitRequestFullScreen'] ? () => canvasContainer['webkitRequestFullScreen'](Element['ALLOW_KEYBOARD_INPUT']) : null); + + canvasContainer.requestFullscreen(); + }, + requestFullScreen() { + abort('Module.requestFullScreen has been replaced by Module.requestFullscreen (without a capital S)'); + }, + exitFullscreen() { + // This is workaround for chrome. Trying to exit from fullscreen + // not in fullscreen state will cause "TypeError: Document not active" + // in chrome. See https://github.com/emscripten-core/emscripten/pull/8236 + if (!Browser.isFullscreen) { + return false; + } + + var CFS = document['exitFullscreen'] || + document['cancelFullScreen'] || + document['mozCancelFullScreen'] || + document['msExitFullscreen'] || + document['webkitCancelFullScreen'] || + (() => {}); + CFS.apply(document, []); + return true; + }, + safeSetTimeout(func, timeout) { + // Legacy function, this is used by the SDL2 port so we need to keep it + // around at least until that is updated. + // See https://github.com/libsdl-org/SDL/pull/6304 + return safeSetTimeout(func, timeout); + }, + getMimetype(name) { + return { + 'jpg': 'image/jpeg', + 'jpeg': 'image/jpeg', + 'png': 'image/png', + 'bmp': 'image/bmp', + 'ogg': 'audio/ogg', + 'wav': 'audio/wav', + 'mp3': 'audio/mpeg' + }[name.slice(name.lastIndexOf('.')+1)]; + }, + getUserMedia(func) { + window.getUserMedia ||= navigator['getUserMedia'] || + navigator['mozGetUserMedia']; + window.getUserMedia(func); + }, + getMovementX(event) { + return event['movementX'] || + event['mozMovementX'] || + event['webkitMovementX'] || + 0; + }, + getMovementY(event) { + return event['movementY'] || + event['mozMovementY'] || + event['webkitMovementY'] || + 0; + }, + getMouseWheelDelta(event) { + var delta = 0; + switch (event.type) { + case 'DOMMouseScroll': + // 3 lines make up a step + delta = event.detail / 3; + break; + case 'mousewheel': + // 120 units make up a step + delta = event.wheelDelta / 120; + break; + case 'wheel': + delta = event.deltaY + switch (event.deltaMode) { + case 0: + // DOM_DELTA_PIXEL: 100 pixels make up a step + delta /= 100; + break; + case 1: + // DOM_DELTA_LINE: 3 lines make up a step + delta /= 3; + break; + case 2: + // DOM_DELTA_PAGE: A page makes up 80 steps + delta *= 80; + break; + default: + abort('unrecognized mouse wheel delta mode: ' + event.deltaMode); + } + break; + default: + abort('unrecognized mouse wheel event: ' + event.type); + } + return delta; + }, + mouseX:0, + mouseY:0, + mouseMovementX:0, + mouseMovementY:0, + touches:{ + }, + lastTouches:{ + }, + calculateMouseCoords(pageX, pageY) { + // Calculate the movement based on the changes + // in the coordinates. + var canvas = Browser.getCanvas(); + var rect = canvas.getBoundingClientRect(); + + var adjustedX = pageX - (window.scrollX + rect.left); + var adjustedY = pageY - (window.scrollY + rect.top); + + // the canvas might be CSS-scaled compared to its backbuffer; + // SDL-using content will want mouse coordinates in terms + // of backbuffer units. + adjustedX = adjustedX * (canvas.width / rect.width); + adjustedY = adjustedY * (canvas.height / rect.height); + + return { x: adjustedX, y: adjustedY }; + }, + setMouseCoords(pageX, pageY) { + const {x, y} = Browser.calculateMouseCoords(pageX, pageY); + Browser.mouseMovementX = x - Browser.mouseX; + Browser.mouseMovementY = y - Browser.mouseY; + Browser.mouseX = x; + Browser.mouseY = y; + }, + calculateMouseEvent(event) { // event should be mousemove, mousedown or mouseup + if (Browser.pointerLock) { + // When the pointer is locked, calculate the coordinates + // based on the movement of the mouse. + // Workaround for Firefox bug 764498 + if (event.type != 'mousemove' && + ('mozMovementX' in event)) { + Browser.mouseMovementX = Browser.mouseMovementY = 0; + } else { + Browser.mouseMovementX = Browser.getMovementX(event); + Browser.mouseMovementY = Browser.getMovementY(event); + } + + // add the mouse delta to the current absolute mouse position + Browser.mouseX += Browser.mouseMovementX; + Browser.mouseY += Browser.mouseMovementY; + } else { + if (event.type === 'touchstart' || event.type === 'touchend' || event.type === 'touchmove') { + var touch = event.touch; + if (touch === undefined) { + return; // the "touch" property is only defined in SDL + + } + var coords = Browser.calculateMouseCoords(touch.pageX, touch.pageY); + + if (event.type === 'touchstart') { + Browser.lastTouches[touch.identifier] = coords; + Browser.touches[touch.identifier] = coords; + } else if (event.type === 'touchend' || event.type === 'touchmove') { + var last = Browser.touches[touch.identifier]; + last ||= coords; + Browser.lastTouches[touch.identifier] = last; + Browser.touches[touch.identifier] = coords; + } + return; + } + + Browser.setMouseCoords(event.pageX, event.pageY); + } + }, + resizeListeners:[], + updateResizeListeners() { + var canvas = Browser.getCanvas(); + Browser.resizeListeners.forEach((listener) => listener(canvas.width, canvas.height)); + }, + setCanvasSize(width, height, noUpdates) { + var canvas = Browser.getCanvas(); + Browser.updateCanvasDimensions(canvas, width, height); + if (!noUpdates) Browser.updateResizeListeners(); + }, + windowedWidth:0, + windowedHeight:0, + setFullscreenCanvasSize() { + // check if SDL is available + if (typeof SDL != "undefined") { + var flags = HEAPU32[((SDL.screen)>>2)]; + flags = flags | 0x00800000; // set SDL_FULLSCREEN flag + HEAP32[((SDL.screen)>>2)] = flags; + } + Browser.updateCanvasDimensions(Browser.getCanvas()); + Browser.updateResizeListeners(); + }, + setWindowedCanvasSize() { + // check if SDL is available + if (typeof SDL != "undefined") { + var flags = HEAPU32[((SDL.screen)>>2)]; + flags = flags & ~0x00800000; // clear SDL_FULLSCREEN flag + HEAP32[((SDL.screen)>>2)] = flags; + } + Browser.updateCanvasDimensions(Browser.getCanvas()); + Browser.updateResizeListeners(); + }, + updateCanvasDimensions(canvas, wNative, hNative) { + if (wNative && hNative) { + canvas.widthNative = wNative; + canvas.heightNative = hNative; + } else { + wNative = canvas.widthNative; + hNative = canvas.heightNative; + } + var w = wNative; + var h = hNative; + if (Module['forcedAspectRatio'] > 0) { + if (w/h < Module['forcedAspectRatio']) { + w = Math.round(h * Module['forcedAspectRatio']); + } else { + h = Math.round(w / Module['forcedAspectRatio']); + } + } + if ((getFullscreenElement() === canvas.parentNode) && (typeof screen != 'undefined')) { + var factor = Math.min(screen.width / w, screen.height / h); + w = Math.round(w * factor); + h = Math.round(h * factor); + } + if (Browser.resizeCanvas) { + if (canvas.width != w) canvas.width = w; + if (canvas.height != h) canvas.height = h; + if (typeof canvas.style != 'undefined') { + canvas.style.removeProperty( "width"); + canvas.style.removeProperty("height"); + } + } else { + if (canvas.width != wNative) canvas.width = wNative; + if (canvas.height != hNative) canvas.height = hNative; + if (typeof canvas.style != 'undefined') { + if (w != wNative || h != hNative) { + canvas.style.setProperty( "width", w + "px", "important"); + canvas.style.setProperty("height", h + "px", "important"); + } else { + canvas.style.removeProperty( "width"); + canvas.style.removeProperty("height"); + } + } + } + }, + }; + + var _emscripten_set_window_title = (title) => document.title = UTF8ToString(title); + + + function _fd_close(fd) { + try { + + var stream = SYSCALLS.getStreamFromFD(fd); + FS.close(stream); + return 0; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return e.errno; + } + } + + + /** @param {number=} offset */ + var doReadv = (stream, iov, iovcnt, offset) => { + var ret = 0; + for (var i = 0; i < iovcnt; i++) { + var ptr = HEAPU32[((iov)>>2)]; + var len = HEAPU32[(((iov)+(4))>>2)]; + iov += 8; + var curr = FS.read(stream, HEAP8, ptr, len, offset); + if (curr < 0) return -1; + ret += curr; + if (curr < len) break; // nothing more to read + if (typeof offset != 'undefined') { + offset += curr; + } + } + return ret; + }; + + function _fd_read(fd, iov, iovcnt, pnum) { + try { + + var stream = SYSCALLS.getStreamFromFD(fd); + var num = doReadv(stream, iov, iovcnt); + HEAPU32[((pnum)>>2)] = num; + return 0; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return e.errno; + } + } + + + + function _fd_seek(fd, offset, whence, newOffset) { + offset = bigintToI53Checked(offset); + + + try { + + if (isNaN(offset)) return 22; + var stream = SYSCALLS.getStreamFromFD(fd); + FS.llseek(stream, offset, whence); + HEAP64[((newOffset)>>3)] = BigInt(stream.position); + if (stream.getdents && offset === 0 && whence === 0) stream.getdents = null; // reset readdir state + return 0; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return e.errno; + } + ; + } + + /** @param {number=} offset */ + var doWritev = (stream, iov, iovcnt, offset) => { + var ret = 0; + for (var i = 0; i < iovcnt; i++) { + var ptr = HEAPU32[((iov)>>2)]; + var len = HEAPU32[(((iov)+(4))>>2)]; + iov += 8; + var curr = FS.write(stream, HEAP8, ptr, len, offset); + if (curr < 0) return -1; + ret += curr; + if (curr < len) { + // No more space to write. + break; + } + if (typeof offset != 'undefined') { + offset += curr; + } + } + return ret; + }; + + function _fd_write(fd, iov, iovcnt, pnum) { + try { + + var stream = SYSCALLS.getStreamFromFD(fd); + var num = doWritev(stream, iov, iovcnt); + HEAPU32[((pnum)>>2)] = num; + return 0; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return e.errno; + } + } + + + var _glActiveTexture = _emscripten_glActiveTexture; + + var _glAttachShader = _emscripten_glAttachShader; + + var _glBindAttribLocation = _emscripten_glBindAttribLocation; + + var _glBindBuffer = _emscripten_glBindBuffer; + + var _glBindTexture = _emscripten_glBindTexture; + + var _glBlendFunc = _emscripten_glBlendFunc; + + var _glBufferData = _emscripten_glBufferData; + + var _glBufferSubData = _emscripten_glBufferSubData; + + var _glClear = _emscripten_glClear; + + var _glClearColor = _emscripten_glClearColor; + + var _glClearDepthf = _emscripten_glClearDepthf; + + var _glCompileShader = _emscripten_glCompileShader; + + var _glCompressedTexImage2D = _emscripten_glCompressedTexImage2D; + + var _glCreateProgram = _emscripten_glCreateProgram; + + var _glCreateShader = _emscripten_glCreateShader; + + var _glCullFace = _emscripten_glCullFace; + + var _glDeleteBuffers = _emscripten_glDeleteBuffers; + + var _glDeleteProgram = _emscripten_glDeleteProgram; + + var _glDeleteShader = _emscripten_glDeleteShader; + + var _glDeleteTextures = _emscripten_glDeleteTextures; + + var _glDepthFunc = _emscripten_glDepthFunc; + + var _glDetachShader = _emscripten_glDetachShader; + + var _glDisable = _emscripten_glDisable; + + var _glDisableVertexAttribArray = _emscripten_glDisableVertexAttribArray; + + var _glDrawArrays = _emscripten_glDrawArrays; + + var _glDrawElements = _emscripten_glDrawElements; + + var _glEnable = _emscripten_glEnable; + + var _glEnableVertexAttribArray = _emscripten_glEnableVertexAttribArray; + + var _glFrontFace = _emscripten_glFrontFace; + + var _glGenBuffers = _emscripten_glGenBuffers; + + var _glGenTextures = _emscripten_glGenTextures; + + var _glGetAttribLocation = _emscripten_glGetAttribLocation; + + var _glGetFloatv = _emscripten_glGetFloatv; + + var _glGetProgramInfoLog = _emscripten_glGetProgramInfoLog; + + var _glGetProgramiv = _emscripten_glGetProgramiv; + + var _glGetShaderInfoLog = _emscripten_glGetShaderInfoLog; + + var _glGetShaderiv = _emscripten_glGetShaderiv; + + var _glGetString = _emscripten_glGetString; + + var _glGetUniformLocation = _emscripten_glGetUniformLocation; + + var _glLinkProgram = _emscripten_glLinkProgram; + + var _glPixelStorei = _emscripten_glPixelStorei; + + var _glReadPixels = _emscripten_glReadPixels; + + var _glScissor = _emscripten_glScissor; + + var _glShaderSource = _emscripten_glShaderSource; + + var _glTexImage2D = _emscripten_glTexImage2D; + + var _glTexParameterf = _emscripten_glTexParameterf; + + var _glTexParameteri = _emscripten_glTexParameteri; + + var _glUniform1i = _emscripten_glUniform1i; + + var _glUniform4f = _emscripten_glUniform4f; + + var _glUniformMatrix4fv = _emscripten_glUniformMatrix4fv; + + var _glUseProgram = _emscripten_glUseProgram; + + var _glVertexAttribPointer = _emscripten_glVertexAttribPointer; + + var _glViewport = _emscripten_glViewport; + + + + + /** @constructor */ + function GLFW_Window(id, width, height, framebufferWidth, framebufferHeight, title, monitor, share) { + this.id = id; + this.x = 0; + this.y = 0; + this.fullscreen = false; // Used to determine if app is in fullscreen mode + this.storedX = 0; // Used to store X before fullscreen + this.storedY = 0; // Used to store Y before fullscreen + this.width = width; + this.height = height; + this.framebufferWidth = framebufferWidth; + this.framebufferHeight = framebufferHeight; + this.storedWidth = width; // Used to store width before fullscreen + this.storedHeight = height; // Used to store height before fullscreen + this.title = title; + this.monitor = monitor; + this.share = share; + this.attributes = {...GLFW.hints}; + this.inputModes = { + 0x00033001:0x00034001, // GLFW_CURSOR (GLFW_CURSOR_NORMAL) + 0x00033002:0, // GLFW_STICKY_KEYS + 0x00033003:0, // GLFW_STICKY_MOUSE_BUTTONS + }; + this.buttons = 0; + this.keys = new Array(); + this.domKeys = new Array(); + this.shouldClose = 0; + this.title = null; + this.windowPosFunc = 0; // GLFWwindowposfun + this.windowSizeFunc = 0; // GLFWwindowsizefun + this.windowCloseFunc = 0; // GLFWwindowclosefun + this.windowRefreshFunc = 0; // GLFWwindowrefreshfun + this.windowFocusFunc = 0; // GLFWwindowfocusfun + this.windowIconifyFunc = 0; // GLFWwindowiconifyfun + this.windowMaximizeFunc = 0; // GLFWwindowmaximizefun + this.framebufferSizeFunc = 0; // GLFWframebuffersizefun + this.windowContentScaleFunc = 0; // GLFWwindowcontentscalefun + this.mouseButtonFunc = 0; // GLFWmousebuttonfun + this.cursorPosFunc = 0; // GLFWcursorposfun + this.cursorEnterFunc = 0; // GLFWcursorenterfun + this.scrollFunc = 0; // GLFWscrollfun + this.dropFunc = 0; // GLFWdropfun + this.keyFunc = 0; // GLFWkeyfun + this.charFunc = 0; // GLFWcharfun + this.userptr = 0; + } + + + + + var _emscripten_set_main_loop_timing = (mode, value) => { + MainLoop.timingMode = mode; + MainLoop.timingValue = value; + + if (!MainLoop.func) { + err('emscripten_set_main_loop_timing: Cannot set timing mode for main loop since a main loop does not exist! Call emscripten_set_main_loop first to set one up.'); + return 1; // Return non-zero on failure, can't set timing mode when there is no main loop. + } + + if (!MainLoop.running) { + + MainLoop.running = true; + } + if (mode == 0) { + MainLoop.scheduler = function MainLoop_scheduler_setTimeout() { + var timeUntilNextTick = Math.max(0, MainLoop.tickStartTime + value - _emscripten_get_now())|0; + setTimeout(MainLoop.runner, timeUntilNextTick); // doing this each time means that on exception, we stop + }; + } else if (mode == 1) { + MainLoop.scheduler = function MainLoop_scheduler_rAF() { + MainLoop.requestAnimationFrame(MainLoop.runner); + }; + } else { + assert(mode == 2); + if (!MainLoop.setImmediate) { + if (globalThis.scheduler) { + // Some modern browsers implement scheduler.postTask, but not all. + MainLoop.setImmediate = scheduler.postTask.bind(scheduler); + } else if (globalThis.setImmediate) { + MainLoop.setImmediate = setImmediate; + } else { + // Emulate setImmediate. (note: not a complete polyfill, we don't emulate clearImmediate() to keep code size to minimum, since not needed) + var setImmediates = []; + var emscriptenMainLoopMessageId = 'setimmediate'; + /** @param {Event} event */ + var MainLoop_setImmediate_messageHandler = (event) => { + if (event.data === emscriptenMainLoopMessageId) { + event.stopPropagation(); + setImmediates.shift()(); + } + }; + addEventListener("message", MainLoop_setImmediate_messageHandler, true); + MainLoop.setImmediate = /** @type{function(function(): ?, ...?): number} */((func) => { + setImmediates.push(func); + if (ENVIRONMENT_IS_WORKER) { + // The postMessge API in a Worker, sends message to the main + // thread and does not support the `targetOrigin` (*) argument. + postMessage(emscriptenMainLoopMessageId); + } else { + postMessage(emscriptenMainLoopMessageId, '*'); + } + }); + } + } + MainLoop.scheduler = function MainLoop_scheduler_setImmediate() { + MainLoop.setImmediate(MainLoop.runner); + }; + } + return 0; + }; + + + + /** + * @param {number=} arg + * @param {boolean=} noSetTiming + */ + var setMainLoop = (iterFunc, fps, simulateInfiniteLoop, arg, noSetTiming) => { + assert(!MainLoop.func, 'emscripten_set_main_loop: there can only be one main loop function at once') + MainLoop.func = iterFunc; + MainLoop.arg = arg; + + var thisMainLoopId = MainLoop.currentlyRunningMainloop; + function checkIsRunning() { + if (thisMainLoopId < MainLoop.currentlyRunningMainloop) { + + maybeExit(); + return false; + } + return true; + } + + // We create the loop runner here but it is not actually running until + // _emscripten_set_main_loop_timing is called (which might happen at a + // later time). This member signifies that the current runner has not + // yet been started so that we can call runtimeKeepalivePush when it + // gets its timing set for the first time. + MainLoop.running = false; + MainLoop.runner = function MainLoop_runner() { + if (ABORT) return; + if (MainLoop.queue.length > 0) { + var start = Date.now(); + var blocker = MainLoop.queue.shift(); + blocker.func(blocker.arg); + if (MainLoop.remainingBlockers) { + var remaining = MainLoop.remainingBlockers; + var next = remaining%1 == 0 ? remaining-1 : Math.floor(remaining); + if (blocker.counted) { + MainLoop.remainingBlockers = next; + } else { + // not counted, but move the progress along a tiny bit + next = next + 0.5; // do not steal all the next one's progress + MainLoop.remainingBlockers = (8*remaining + next)/9; + } + } + MainLoop.updateStatus(); + + // catches pause/resume main loop from blocker execution + if (!checkIsRunning()) return; + + setTimeout(MainLoop.runner, 0); + return; + } + + // catch pauses from non-main loop sources + if (!checkIsRunning()) return; + + // Implement very basic swap interval control + MainLoop.currentFrameNumber = MainLoop.currentFrameNumber + 1 | 0; + if (MainLoop.timingMode == 1 && MainLoop.timingValue > 1 && MainLoop.currentFrameNumber % MainLoop.timingValue != 0) { + // Not the scheduled time to render this frame - skip. + MainLoop.scheduler(); + return; + } else if (MainLoop.timingMode == 0) { + MainLoop.tickStartTime = _emscripten_get_now(); + if (Module['ctx']) { + warnOnce('Looks like you are rendering without using requestAnimationFrame for the main loop. You should use 0 for the frame rate in emscripten_set_main_loop in order to use requestAnimationFrame, as that can greatly improve your frame rates!'); + } + } + + MainLoop.runIter(iterFunc); + + // catch pauses from the main loop itself + if (!checkIsRunning()) return; + + MainLoop.scheduler(); + } + + if (!noSetTiming) { + if (fps > 0) { + _emscripten_set_main_loop_timing(0, 1000.0 / fps); + } else { + // Do rAF by rendering each frame (no decimating) + _emscripten_set_main_loop_timing(1, 1); + } + + MainLoop.scheduler(); + } + + if (simulateInfiniteLoop) { + throw 'unwind'; + } + }; + + + var MainLoop = { + running:false, + scheduler:null, + currentlyRunningMainloop:0, + func:null, + arg:0, + timingMode:0, + timingValue:0, + currentFrameNumber:0, + queue:[], + preMainLoop:[], + postMainLoop:[], + pause() { + MainLoop.scheduler = null; + // Incrementing this signals the previous main loop that it's now become old, and it must return. + MainLoop.currentlyRunningMainloop++; + }, + resume() { + MainLoop.currentlyRunningMainloop++; + var timingMode = MainLoop.timingMode; + var timingValue = MainLoop.timingValue; + var func = MainLoop.func; + MainLoop.func = null; + // do not set timing and call scheduler, we will do it on the next lines + setMainLoop(func, 0, false, MainLoop.arg, true); + _emscripten_set_main_loop_timing(timingMode, timingValue); + MainLoop.scheduler(); + }, + updateStatus() { + if (Module['setStatus']) { + var message = Module['statusMessage'] || 'Please wait...'; + var remaining = MainLoop.remainingBlockers ?? 0; + var expected = MainLoop.expectedBlockers ?? 0; + if (remaining) { + if (remaining < expected) { + Module['setStatus'](`{message} ({expected - remaining}/{expected})`); + } else { + Module['setStatus'](message); + } + } else { + Module['setStatus'](''); + } + } + }, + init() { + Module['preMainLoop'] && MainLoop.preMainLoop.push(Module['preMainLoop']); + Module['postMainLoop'] && MainLoop.postMainLoop.push(Module['postMainLoop']); + }, + runIter(func) { + if (ABORT) return; + for (var pre of MainLoop.preMainLoop) { + if (pre() === false) { + return; // |return false| skips a frame + } + } + callUserCallback(func); + for (var post of MainLoop.postMainLoop) { + post(); + } + checkStackCookie(); + }, + nextRAF:0, + fakeRequestAnimationFrame(func) { + // try to keep 60fps between calls to here + var now = Date.now(); + if (MainLoop.nextRAF === 0) { + MainLoop.nextRAF = now + 1000/60; + } else { + while (now + 2 >= MainLoop.nextRAF) { // fudge a little, to avoid timer jitter causing us to do lots of delay:0 + MainLoop.nextRAF += 1000/60; + } + } + var delay = Math.max(MainLoop.nextRAF - now, 0); + setTimeout(func, delay); + }, + requestAnimationFrame(func) { + if (globalThis.requestAnimationFrame) { + requestAnimationFrame(func); + } else { + MainLoop.fakeRequestAnimationFrame(func); + } + }, + }; + + + + + + + var GLFW = { + WindowFromId:(id) => { + if (id <= 0 || !GLFW.windows) return null; + return GLFW.windows[id - 1]; + }, + joystickFunc:0, + errorFunc:0, + monitorFunc:0, + active:null, + scale:null, + windows:null, + monitors:null, + monitorString:null, + versionString:null, + initialTime:null, + extensions:null, + devicePixelRatioMQL:null, + hints:null, + primaryTouchId:null, + defaultHints:{ + 131073:0, + 131074:0, + 131075:1, + 131076:1, + 131077:1, + 131082:0, + 135169:8, + 135170:8, + 135171:8, + 135172:8, + 135173:24, + 135174:8, + 135175:0, + 135176:0, + 135177:0, + 135178:0, + 135179:0, + 135180:0, + 135181:0, + 135182:0, + 135183:0, + 139265:196609, + 139266:1, + 139267:0, + 139268:0, + 139269:0, + 139270:0, + 139271:0, + 139272:0, + 139276:0, + }, + DOMToGLFWKeyCode:(keycode) => { + switch (keycode) { + // these keycodes are only defined for GLFW3, assume they are the same for GLFW2 + case 0x20:return 32; // DOM_VK_SPACE -> GLFW_KEY_SPACE + case 0xDE:return 39; // DOM_VK_QUOTE -> GLFW_KEY_APOSTROPHE + case 0xBC:return 44; // DOM_VK_COMMA -> GLFW_KEY_COMMA + case 0xAD:return 45; // DOM_VK_HYPHEN_MINUS -> GLFW_KEY_MINUS + case 0xBD:return 45; // DOM_VK_MINUS -> GLFW_KEY_MINUS + case 0xBE:return 46; // DOM_VK_PERIOD -> GLFW_KEY_PERIOD + case 0xBF:return 47; // DOM_VK_SLASH -> GLFW_KEY_SLASH + case 0x30:return 48; // DOM_VK_0 -> GLFW_KEY_0 + case 0x31:return 49; // DOM_VK_1 -> GLFW_KEY_1 + case 0x32:return 50; // DOM_VK_2 -> GLFW_KEY_2 + case 0x33:return 51; // DOM_VK_3 -> GLFW_KEY_3 + case 0x34:return 52; // DOM_VK_4 -> GLFW_KEY_4 + case 0x35:return 53; // DOM_VK_5 -> GLFW_KEY_5 + case 0x36:return 54; // DOM_VK_6 -> GLFW_KEY_6 + case 0x37:return 55; // DOM_VK_7 -> GLFW_KEY_7 + case 0x38:return 56; // DOM_VK_8 -> GLFW_KEY_8 + case 0x39:return 57; // DOM_VK_9 -> GLFW_KEY_9 + case 0x3B:return 59; // DOM_VK_SEMICOLON -> GLFW_KEY_SEMICOLON + case 0x3D:return 61; // DOM_VK_EQUALS -> GLFW_KEY_EQUAL + case 0xBB:return 61; // DOM_VK_EQUALS -> GLFW_KEY_EQUAL + case 0x41:return 65; // DOM_VK_A -> GLFW_KEY_A + case 0x42:return 66; // DOM_VK_B -> GLFW_KEY_B + case 0x43:return 67; // DOM_VK_C -> GLFW_KEY_C + case 0x44:return 68; // DOM_VK_D -> GLFW_KEY_D + case 0x45:return 69; // DOM_VK_E -> GLFW_KEY_E + case 0x46:return 70; // DOM_VK_F -> GLFW_KEY_F + case 0x47:return 71; // DOM_VK_G -> GLFW_KEY_G + case 0x48:return 72; // DOM_VK_H -> GLFW_KEY_H + case 0x49:return 73; // DOM_VK_I -> GLFW_KEY_I + case 0x4A:return 74; // DOM_VK_J -> GLFW_KEY_J + case 0x4B:return 75; // DOM_VK_K -> GLFW_KEY_K + case 0x4C:return 76; // DOM_VK_L -> GLFW_KEY_L + case 0x4D:return 77; // DOM_VK_M -> GLFW_KEY_M + case 0x4E:return 78; // DOM_VK_N -> GLFW_KEY_N + case 0x4F:return 79; // DOM_VK_O -> GLFW_KEY_O + case 0x50:return 80; // DOM_VK_P -> GLFW_KEY_P + case 0x51:return 81; // DOM_VK_Q -> GLFW_KEY_Q + case 0x52:return 82; // DOM_VK_R -> GLFW_KEY_R + case 0x53:return 83; // DOM_VK_S -> GLFW_KEY_S + case 0x54:return 84; // DOM_VK_T -> GLFW_KEY_T + case 0x55:return 85; // DOM_VK_U -> GLFW_KEY_U + case 0x56:return 86; // DOM_VK_V -> GLFW_KEY_V + case 0x57:return 87; // DOM_VK_W -> GLFW_KEY_W + case 0x58:return 88; // DOM_VK_X -> GLFW_KEY_X + case 0x59:return 89; // DOM_VK_Y -> GLFW_KEY_Y + case 0x5a:return 90; // DOM_VK_Z -> GLFW_KEY_Z + case 0xDB:return 91; // DOM_VK_OPEN_BRACKET -> GLFW_KEY_LEFT_BRACKET + case 0xDC:return 92; // DOM_VK_BACKSLASH -> GLFW_KEY_BACKSLASH + case 0xDD:return 93; // DOM_VK_CLOSE_BRACKET -> GLFW_KEY_RIGHT_BRACKET + case 0xC0:return 96; // DOM_VK_BACK_QUOTE -> GLFW_KEY_GRAVE_ACCENT + + case 0x1B:return 256; // DOM_VK_ESCAPE -> GLFW_KEY_ESCAPE + case 0x0D:return 257; // DOM_VK_RETURN -> GLFW_KEY_ENTER + case 0x09:return 258; // DOM_VK_TAB -> GLFW_KEY_TAB + case 0x08:return 259; // DOM_VK_BACK -> GLFW_KEY_BACKSPACE + case 0x2D:return 260; // DOM_VK_INSERT -> GLFW_KEY_INSERT + case 0x2E:return 261; // DOM_VK_DELETE -> GLFW_KEY_DELETE + case 0x27:return 262; // DOM_VK_RIGHT -> GLFW_KEY_RIGHT + case 0x25:return 263; // DOM_VK_LEFT -> GLFW_KEY_LEFT + case 0x28:return 264; // DOM_VK_DOWN -> GLFW_KEY_DOWN + case 0x26:return 265; // DOM_VK_UP -> GLFW_KEY_UP + case 0x21:return 266; // DOM_VK_PAGE_UP -> GLFW_KEY_PAGE_UP + case 0x22:return 267; // DOM_VK_PAGE_DOWN -> GLFW_KEY_PAGE_DOWN + case 0x24:return 268; // DOM_VK_HOME -> GLFW_KEY_HOME + case 0x23:return 269; // DOM_VK_END -> GLFW_KEY_END + case 0x14:return 280; // DOM_VK_CAPS_LOCK -> GLFW_KEY_CAPS_LOCK + case 0x91:return 281; // DOM_VK_SCROLL_LOCK -> GLFW_KEY_SCROLL_LOCK + case 0x90:return 282; // DOM_VK_NUM_LOCK -> GLFW_KEY_NUM_LOCK + case 0x2C:return 283; // DOM_VK_SNAPSHOT -> GLFW_KEY_PRINT_SCREEN + case 0x13:return 284; // DOM_VK_PAUSE -> GLFW_KEY_PAUSE + case 0x70:return 290; // DOM_VK_F1 -> GLFW_KEY_F1 + case 0x71:return 291; // DOM_VK_F2 -> GLFW_KEY_F2 + case 0x72:return 292; // DOM_VK_F3 -> GLFW_KEY_F3 + case 0x73:return 293; // DOM_VK_F4 -> GLFW_KEY_F4 + case 0x74:return 294; // DOM_VK_F5 -> GLFW_KEY_F5 + case 0x75:return 295; // DOM_VK_F6 -> GLFW_KEY_F6 + case 0x76:return 296; // DOM_VK_F7 -> GLFW_KEY_F7 + case 0x77:return 297; // DOM_VK_F8 -> GLFW_KEY_F8 + case 0x78:return 298; // DOM_VK_F9 -> GLFW_KEY_F9 + case 0x79:return 299; // DOM_VK_F10 -> GLFW_KEY_F10 + case 0x7A:return 300; // DOM_VK_F11 -> GLFW_KEY_F11 + case 0x7B:return 301; // DOM_VK_F12 -> GLFW_KEY_F12 + case 0x7C:return 302; // DOM_VK_F13 -> GLFW_KEY_F13 + case 0x7D:return 303; // DOM_VK_F14 -> GLFW_KEY_F14 + case 0x7E:return 304; // DOM_VK_F15 -> GLFW_KEY_F15 + case 0x7F:return 305; // DOM_VK_F16 -> GLFW_KEY_F16 + case 0x80:return 306; // DOM_VK_F17 -> GLFW_KEY_F17 + case 0x81:return 307; // DOM_VK_F18 -> GLFW_KEY_F18 + case 0x82:return 308; // DOM_VK_F19 -> GLFW_KEY_F19 + case 0x83:return 309; // DOM_VK_F20 -> GLFW_KEY_F20 + case 0x84:return 310; // DOM_VK_F21 -> GLFW_KEY_F21 + case 0x85:return 311; // DOM_VK_F22 -> GLFW_KEY_F22 + case 0x86:return 312; // DOM_VK_F23 -> GLFW_KEY_F23 + case 0x87:return 313; // DOM_VK_F24 -> GLFW_KEY_F24 + case 0x88:return 314; // 0x88 (not used?) -> GLFW_KEY_F25 + case 0x60:return 320; // DOM_VK_NUMPAD0 -> GLFW_KEY_KP_0 + case 0x61:return 321; // DOM_VK_NUMPAD1 -> GLFW_KEY_KP_1 + case 0x62:return 322; // DOM_VK_NUMPAD2 -> GLFW_KEY_KP_2 + case 0x63:return 323; // DOM_VK_NUMPAD3 -> GLFW_KEY_KP_3 + case 0x64:return 324; // DOM_VK_NUMPAD4 -> GLFW_KEY_KP_4 + case 0x65:return 325; // DOM_VK_NUMPAD5 -> GLFW_KEY_KP_5 + case 0x66:return 326; // DOM_VK_NUMPAD6 -> GLFW_KEY_KP_6 + case 0x67:return 327; // DOM_VK_NUMPAD7 -> GLFW_KEY_KP_7 + case 0x68:return 328; // DOM_VK_NUMPAD8 -> GLFW_KEY_KP_8 + case 0x69:return 329; // DOM_VK_NUMPAD9 -> GLFW_KEY_KP_9 + case 0x6E:return 330; // DOM_VK_DECIMAL -> GLFW_KEY_KP_DECIMAL + case 0x6F:return 331; // DOM_VK_DIVIDE -> GLFW_KEY_KP_DIVIDE + case 0x6A:return 332; // DOM_VK_MULTIPLY -> GLFW_KEY_KP_MULTIPLY + case 0x6D:return 333; // DOM_VK_SUBTRACT -> GLFW_KEY_KP_SUBTRACT + case 0x6B:return 334; // DOM_VK_ADD -> GLFW_KEY_KP_ADD + // case 0x0D:return 335; // DOM_VK_RETURN -> GLFW_KEY_KP_ENTER (DOM_KEY_LOCATION_RIGHT) + // case 0x61:return 336; // DOM_VK_EQUALS -> GLFW_KEY_KP_EQUAL (DOM_KEY_LOCATION_RIGHT) + case 0x10:return 340; // DOM_VK_SHIFT -> GLFW_KEY_LEFT_SHIFT + case 0x11:return 341; // DOM_VK_CONTROL -> GLFW_KEY_LEFT_CONTROL + case 0x12:return 342; // DOM_VK_ALT -> GLFW_KEY_LEFT_ALT + case 0x5B:return 343; // DOM_VK_WIN -> GLFW_KEY_LEFT_SUPER + case 0xE0:return 343; // DOM_VK_META -> GLFW_KEY_LEFT_SUPER + // case 0x10:return 344; // DOM_VK_SHIFT -> GLFW_KEY_RIGHT_SHIFT (DOM_KEY_LOCATION_RIGHT) + // case 0x11:return 345; // DOM_VK_CONTROL -> GLFW_KEY_RIGHT_CONTROL (DOM_KEY_LOCATION_RIGHT) + // case 0x12:return 346; // DOM_VK_ALT -> GLFW_KEY_RIGHT_ALT (DOM_KEY_LOCATION_RIGHT) + // case 0x5B:return 347; // DOM_VK_WIN -> GLFW_KEY_RIGHT_SUPER (DOM_KEY_LOCATION_RIGHT) + case 0x5D:return 348; // DOM_VK_CONTEXT_MENU -> GLFW_KEY_MENU + // XXX: GLFW_KEY_WORLD_1, GLFW_KEY_WORLD_2 what are these? + default:return -1; // GLFW_KEY_UNKNOWN + }; + }, + getModBits:(win) => { + var mod = 0; + if (win.keys[340]) mod |= 0x0001; // GLFW_MOD_SHIFT + if (win.keys[341]) mod |= 0x0002; // GLFW_MOD_CONTROL + if (win.keys[342]) mod |= 0x0004; // GLFW_MOD_ALT + if (win.keys[343] || win.keys[348]) mod |= 0x0008; // GLFW_MOD_SUPER + // add caps and num lock keys? only if lock_key_mod is set + return mod; + }, + onKeyPress:(event) => { + if (!GLFW.active || !GLFW.active.charFunc) return; + if (event.ctrlKey || event.metaKey) return; + + // correct unicode charCode is only available with onKeyPress event + var charCode = event.charCode; + if (charCode == 0 || (charCode >= 0x00 && charCode <= 0x1F)) return; + + getWasmTableEntry(GLFW.active.charFunc)(GLFW.active.id, charCode); + }, + onKeyChanged:(keyCode, status) => { + if (!GLFW.active) return; + + var key = GLFW.DOMToGLFWKeyCode(keyCode); + if (key == -1) return; + + var repeat = status && GLFW.active.keys[key]; + GLFW.active.keys[key] = status; + GLFW.active.domKeys[keyCode] = status; + + if (GLFW.active.keyFunc) { + if (repeat) status = 2; // GLFW_REPEAT + getWasmTableEntry(GLFW.active.keyFunc)(GLFW.active.id, key, keyCode, status, GLFW.getModBits(GLFW.active)); + } + }, + onGamepadConnected:(event) => { + GLFW.refreshJoysticks(); + }, + onGamepadDisconnected:(event) => { + GLFW.refreshJoysticks(); + }, + onKeydown:(event) => { + GLFW.onKeyChanged(event.keyCode, 1); // GLFW_PRESS or GLFW_REPEAT + + // This logic comes directly from the sdl implementation. We cannot + // call preventDefault on all keydown events otherwise onKeyPress will + // not get called + if (event.key == 'Backspace' || event.key == 'Tab') { + event.preventDefault(); + } + }, + onKeyup:(event) => { + GLFW.onKeyChanged(event.keyCode, 0); // GLFW_RELEASE + }, + onBlur:(event) => { + if (!GLFW.active) return; + + for (var i = 0; i < GLFW.active.domKeys.length; ++i) { + if (GLFW.active.domKeys[i]) { + GLFW.onKeyChanged(i, 0); // GLFW_RELEASE + } + } + }, + onMousemove:(event) => { + if (!GLFW.active) return; + + if (event.type === 'touchmove') { + // Handling for touch events that are being converted to mouse input. + + // Don't let the browser fire a duplicate mouse event. + event.preventDefault(); + + let primaryChanged = false; + for (let i of event.changedTouches) { + // If our chosen primary touch moved, update Browser mouse coords + if (GLFW.primaryTouchId === i.identifier) { + Browser.setMouseCoords(i.pageX, i.pageY); + primaryChanged = true; + break; + } + } + + if (!primaryChanged) { + // Do not send mouse events if some touch other than the primary triggered this. + return; + } + + } else { + // Handling for non-touch mouse input events. + Browser.calculateMouseEvent(event); + } + + if (event.target != Browser.getCanvas() || !GLFW.active.cursorPosFunc) return; + + if (GLFW.active.cursorPosFunc) { + getWasmTableEntry(GLFW.active.cursorPosFunc)(GLFW.active.id, Browser.mouseX, Browser.mouseY); + } + }, + DOMToGLFWMouseButton:(event) => { + // DOM and glfw have different button codes. + // See http://www.w3schools.com/jsref/event_button.asp. + var eventButton = event['button']; + if (eventButton > 0) { + if (eventButton == 1) { + eventButton = 2; + } else { + eventButton = 1; + } + } + return eventButton; + }, + onMouseenter:(event) => { + if (!GLFW.active) return; + + if (event.target != Browser.getCanvas()) return; + + if (GLFW.active.cursorEnterFunc) { + getWasmTableEntry(GLFW.active.cursorEnterFunc)(GLFW.active.id, 1); + } + }, + onMouseleave:(event) => { + if (!GLFW.active) return; + + if (event.target != Browser.getCanvas()) return; + + if (GLFW.active.cursorEnterFunc) { + getWasmTableEntry(GLFW.active.cursorEnterFunc)(GLFW.active.id, 0); + } + }, + onMouseButtonChanged:(event, status) => { + if (!GLFW.active) return; + + if (event.target != Browser.getCanvas()) return; + + // Is this from a touch event? + const isTouchType = event.type === 'touchstart' || event.type === 'touchend' || event.type === 'touchcancel'; + + // Only emulating mouse left-click behavior for touches. + let eventButton = 0; + if (isTouchType) { + // Handling for touch events that are being converted to mouse input. + + // Don't let the browser fire a duplicate mouse event. + event.preventDefault(); + + let primaryChanged = false; + + // Set a primary touch if we have none. + if (GLFW.primaryTouchId === null && event.type === 'touchstart' && event.targetTouches.length > 0) { + // Pick the first touch that started in the canvas and treat it as primary. + const chosenTouch = event.targetTouches[0]; + GLFW.primaryTouchId = chosenTouch.identifier; + + Browser.setMouseCoords(chosenTouch.pageX, chosenTouch.pageY); + primaryChanged = true; + } else if (event.type === 'touchend' || event.type === 'touchcancel') { + // Clear the primary touch if it ended. + for (let i of event.changedTouches) { + // If our chosen primary touch ended, remove it. + if (GLFW.primaryTouchId === i.identifier) { + GLFW.primaryTouchId = null; + primaryChanged = true; + break; + } + } + } + + if (!primaryChanged) { + // Do not send mouse events if some touch other than the primary triggered this. + return; + } + + } else { + // Handling for non-touch mouse input events. + Browser.calculateMouseEvent(event); + eventButton = GLFW.DOMToGLFWMouseButton(event); + } + + if (status == 1) { // GLFW_PRESS + GLFW.active.buttons |= (1 << eventButton); + try { + event.target.setCapture(); + } catch (e) {} + } else { // GLFW_RELEASE + GLFW.active.buttons &= ~(1 << eventButton); + } + + // Send mouse event to GLFW. + if (GLFW.active.mouseButtonFunc) { + getWasmTableEntry(GLFW.active.mouseButtonFunc)(GLFW.active.id, eventButton, status, GLFW.getModBits(GLFW.active)); + } + }, + onMouseButtonDown:(event) => { + if (!GLFW.active) return; + GLFW.onMouseButtonChanged(event, 1); // GLFW_PRESS + }, + onMouseButtonUp:(event) => { + if (!GLFW.active) return; + GLFW.onMouseButtonChanged(event, 0); // GLFW_RELEASE + }, + onMouseWheel:(event) => { + // Note the minus sign that flips browser wheel direction (positive direction scrolls page down) to native wheel direction (positive direction is mouse wheel up) + var delta = -Browser.getMouseWheelDelta(event); + delta = (delta == 0) ? 0 : (delta > 0 ? Math.max(delta, 1) : Math.min(delta, -1)); // Quantize to integer so that minimum scroll is at least +/- 1. + GLFW.wheelPos += delta; + + if (!GLFW.active || !GLFW.active.scrollFunc || event.target != Browser.getCanvas()) return; + var sx = 0; + var sy = delta; + if (event.type == 'mousewheel') { + sx = event.wheelDeltaX; + } else { + sx = event.deltaX; + } + + getWasmTableEntry(GLFW.active.scrollFunc)(GLFW.active.id, sx, sy); + + event.preventDefault(); + }, + onCanvasResize:(width, height, framebufferWidth, framebufferHeight) => { + if (!GLFW.active) return; + + var resizeNeeded = false; + + // If the client is requesting fullscreen mode + if (getFullscreenElement()) { + if (!GLFW.active.fullscreen) { + resizeNeeded = width != screen.width || height != screen.height; + GLFW.active.storedX = GLFW.active.x; + GLFW.active.storedY = GLFW.active.y; + GLFW.active.storedWidth = GLFW.active.width; + GLFW.active.storedHeight = GLFW.active.height; + GLFW.active.x = GLFW.active.y = 0; + GLFW.active.width = screen.width; + GLFW.active.height = screen.height; + GLFW.active.fullscreen = true; + } + // If the client is reverting from fullscreen mode + } else if (GLFW.active.fullscreen == true) { + resizeNeeded = width != GLFW.active.storedWidth || height != GLFW.active.storedHeight; + GLFW.active.x = GLFW.active.storedX; + GLFW.active.y = GLFW.active.storedY; + GLFW.active.width = GLFW.active.storedWidth; + GLFW.active.height = GLFW.active.storedHeight; + GLFW.active.fullscreen = false; + } + + if (resizeNeeded) { + // width or height is changed (fullscreen / exit fullscreen) which will call this listener back + // with proper framebufferWidth/framebufferHeight + Browser.setCanvasSize(GLFW.active.width, GLFW.active.height); + } else if (GLFW.active.width != width || + GLFW.active.height != height || + GLFW.active.framebufferWidth != framebufferWidth || + GLFW.active.framebufferHeight != framebufferHeight) { + GLFW.active.width = width; + GLFW.active.height = height; + GLFW.active.framebufferWidth = framebufferWidth; + GLFW.active.framebufferHeight = framebufferHeight; + GLFW.onWindowSizeChanged(); + GLFW.onFramebufferSizeChanged(); + } + }, + onWindowSizeChanged:() => { + if (!GLFW.active) return; + + if (GLFW.active.windowSizeFunc) { + getWasmTableEntry(GLFW.active.windowSizeFunc)(GLFW.active.id, GLFW.active.width, GLFW.active.height); + } + }, + onFramebufferSizeChanged:() => { + if (!GLFW.active) return; + + if (GLFW.active.framebufferSizeFunc) { + getWasmTableEntry(GLFW.active.framebufferSizeFunc)(GLFW.active.id, GLFW.active.framebufferWidth, GLFW.active.framebufferHeight); + } + }, + onWindowContentScaleChanged:(scale) => { + GLFW.scale = scale; + if (!GLFW.active) return; + + if (GLFW.active.windowContentScaleFunc) { + getWasmTableEntry(GLFW.active.windowContentScaleFunc)(GLFW.active.id, GLFW.scale, GLFW.scale); + } + }, + getTime:() => _emscripten_get_now() / 1000, + setWindowTitle:(winid, title) => { + var win = GLFW.WindowFromId(winid); + if (!win) return; + + win.title = title; + if (GLFW.active.id == win.id) { + _emscripten_set_window_title(title); + } + }, + setJoystickCallback:(cbfun) => { + var prevcbfun = GLFW.joystickFunc; + GLFW.joystickFunc = cbfun; + GLFW.refreshJoysticks(); + return prevcbfun; + }, + joys:{ + }, + lastGamepadState:[], + lastGamepadStateFrame:null, + refreshJoysticks:() => { + // Produce a new Gamepad API sample if we are ticking a new game frame, or if not using emscripten_set_main_loop() at all to drive animation. + if (MainLoop.currentFrameNumber !== GLFW.lastGamepadStateFrame || !MainLoop.currentFrameNumber) { + GLFW.lastGamepadState = navigator.getGamepads ? navigator.getGamepads() : (navigator.webkitGetGamepads || []); + GLFW.lastGamepadStateFrame = MainLoop.currentFrameNumber; + + for (var joy = 0; joy < GLFW.lastGamepadState.length; ++joy) { + var gamepad = GLFW.lastGamepadState[joy]; + + if (gamepad) { + if (!GLFW.joys[joy]) { + out('glfw joystick connected:',joy); + GLFW.joys[joy] = { + id: stringToNewUTF8(gamepad.id), + buttonsCount: gamepad.buttons.length, + axesCount: gamepad.axes.length, + buttons: _malloc(gamepad.buttons.length), + axes: _malloc(gamepad.axes.length*4), + }; + + if (GLFW.joystickFunc) { + getWasmTableEntry(GLFW.joystickFunc)(joy, 0x00040001); // GLFW_CONNECTED + } + } + + var data = GLFW.joys[joy]; + + for (var i = 0; i < gamepad.buttons.length; ++i) { + HEAP8[data.buttons + i] = gamepad.buttons[i].pressed; + } + + for (var i = 0; i < gamepad.axes.length; ++i) { + HEAPF32[((data.axes + i*4)>>2)] = gamepad.axes[i]; + } + } else { + if (GLFW.joys[joy]) { + out('glfw joystick disconnected',joy); + + if (GLFW.joystickFunc) { + getWasmTableEntry(GLFW.joystickFunc)(joy, 0x00040002); // GLFW_DISCONNECTED + } + + _free(GLFW.joys[joy].id); + _free(GLFW.joys[joy].buttons); + _free(GLFW.joys[joy].axes); + + delete GLFW.joys[joy]; + } + } + } + } + }, + setKeyCallback:(winid, cbfun) => { + var win = GLFW.WindowFromId(winid); + if (!win) return null; + var prevcbfun = win.keyFunc; + win.keyFunc = cbfun; + return prevcbfun; + }, + setCharCallback:(winid, cbfun) => { + var win = GLFW.WindowFromId(winid); + if (!win) return null; + var prevcbfun = win.charFunc; + win.charFunc = cbfun; + return prevcbfun; + }, + setMouseButtonCallback:(winid, cbfun) => { + var win = GLFW.WindowFromId(winid); + if (!win) return null; + var prevcbfun = win.mouseButtonFunc; + win.mouseButtonFunc = cbfun; + return prevcbfun; + }, + setCursorPosCallback:(winid, cbfun) => { + var win = GLFW.WindowFromId(winid); + if (!win) return null; + var prevcbfun = win.cursorPosFunc; + win.cursorPosFunc = cbfun; + return prevcbfun; + }, + setScrollCallback:(winid, cbfun) => { + var win = GLFW.WindowFromId(winid); + if (!win) return null; + var prevcbfun = win.scrollFunc; + win.scrollFunc = cbfun; + return prevcbfun; + }, + setDropCallback:(winid, cbfun) => { + var win = GLFW.WindowFromId(winid); + if (!win) return null; + var prevcbfun = win.dropFunc; + win.dropFunc = cbfun; + return prevcbfun; + }, + onDrop:(event) => { + if (!GLFW.active || !GLFW.active.dropFunc) return; + if (!event.dataTransfer || !event.dataTransfer.files || event.dataTransfer.files.length == 0) return; + + event.preventDefault(); + + var drop_dir = '.glfw_dropped_files'; + var filenames = _malloc(event.dataTransfer.files.length * 4); + var filenamesArray = []; + for (var i = 0; i < event.dataTransfer.files.length; ++i) { + var path = `/${drop_dir}/${event.dataTransfer.files[i].name.replace(/\//g, "_")}`; + var filename = stringToNewUTF8(path); + filenamesArray.push(filename); + HEAPU32[(((filenames)+(i*4))>>2)] = filename; + } + + // Read and save the files to emscripten's FS + var written = 0; + FS.createPath('/', drop_dir); + + function save(file, in_path, numfiles) { + var path = '/' + drop_dir + in_path + '/' + file.name.replace(/\//g, '_'); + var reader = new FileReader(); + reader.onloadend = (e) => { + if (reader.readyState != 2) { // not DONE + ++written; + err(`failed to read dropped file: ${in_path}/${file.name}: ${reader.error}`); + return; + } + + var data = e.target.result; + FS.writeFile(path, new Uint8Array(data)); + if (++written === numfiles) { + getWasmTableEntry(GLFW.active.dropFunc)(GLFW.active.id, filenamesArray.length, filenames); + + for (var i = 0; i < filenamesArray.length; ++i) { + _free(filenamesArray[i]); + } + _free(filenames); + } + }; + reader.readAsArrayBuffer(file); + } + + let filesQ = []; + function finalize() { + var count = filesQ.length; + for (var i = 0; i < count; ++i) { + save(filesQ[i].file, filesQ[i].path, count); + } + } + + if (DataTransferItem.prototype.webkitGetAsEntry) { + let entriesTree = {}; + function markDone(fullpath, recursive) { + if (entriesTree[fullpath].subpaths.length != 0) return; + delete entriesTree[fullpath]; + let parentpath = fullpath.substring(0, fullpath.lastIndexOf('/')); + if (!entriesTree.hasOwnProperty(parentpath)) { + if (Object.keys(entriesTree).length == 0) finalize(); + return; + } + const fpIndex = entriesTree[parentpath].subpaths.indexOf(fullpath); + if (fpIndex > -1) entriesTree[parentpath].subpaths.splice(fpIndex, 1); + if (recursive) markDone(parentpath, true); + if (Object.keys(entriesTree).length == 0) finalize(); + } + function processEntry(entry) { + let fp = entry.fullPath; + let pp = fp.substring(0, fp.lastIndexOf('/')); + entriesTree[fp] = { subpaths: [] }; + if (entry.isFile) { + entry.file((f) => { filesQ.push({ file: f, path: pp }); markDone(fp, false); }) + } else if (entry.isDirectory) { + if (entriesTree.hasOwnProperty(pp)) entriesTree[pp].subpaths.push(fp); + FS.createPath("/" + drop_dir + pp, entry.name); + var reader = entry.createReader(); + var rRead = function (dirEntries) { + if (dirEntries.length == 0) { + markDone(fp, true); + return; + } + for (const ent of dirEntries) processEntry(ent); + reader.readEntries(rRead); + }; + reader.readEntries(rRead); + } + } + for (const item of event.dataTransfer.items) { + processEntry(item.webkitGetAsEntry()); + } + } else { + // fallback for browsers that does not support webkitGetAsEntry + for (const file of event.dataTransfer.files) { + filesQ.push({ file: file, path: "" }); + } + finalize(); + } + + return false; + }, + onDragover:(event) => { + if (!GLFW.active || !GLFW.active.dropFunc) return; + + event.preventDefault(); + return false; + }, + setWindowSizeCallback:(winid, cbfun) => { + var win = GLFW.WindowFromId(winid); + if (!win) return null; + var prevcbfun = win.windowSizeFunc; + win.windowSizeFunc = cbfun; + + return prevcbfun; + }, + setWindowCloseCallback:(winid, cbfun) => { + var win = GLFW.WindowFromId(winid); + if (!win) return null; + var prevcbfun = win.windowCloseFunc; + win.windowCloseFunc = cbfun; + return prevcbfun; + }, + setWindowRefreshCallback:(winid, cbfun) => { + var win = GLFW.WindowFromId(winid); + if (!win) return null; + var prevcbfun = win.windowRefreshFunc; + win.windowRefreshFunc = cbfun; + return prevcbfun; + }, + onClickRequestPointerLock:(e) => { + var canvas = Browser.getCanvas(); + if (!Browser.pointerLock && canvas.requestPointerLock) { + canvas.requestPointerLock(); + e.preventDefault(); + } + }, + setInputMode:(winid, mode, value) => { + var win = GLFW.WindowFromId(winid); + if (!win) return; + + switch (mode) { + case 0x00033001: { // GLFW_CURSOR + var canvas = Browser.getCanvas(); + switch (value) { + case 0x00034001: { // GLFW_CURSOR_NORMAL + win.inputModes[mode] = value; + canvas.removeEventListener('click', GLFW.onClickRequestPointerLock, true); + document.exitPointerLock(); + break; + } + case 0x00034002: { // GLFW_CURSOR_HIDDEN + err('glfwSetInputMode called with GLFW_CURSOR_HIDDEN value not implemented'); + break; + } + case 0x00034003: { // GLFW_CURSOR_DISABLED + win.inputModes[mode] = value; + canvas.addEventListener('click', GLFW.onClickRequestPointerLock, true); + canvas.requestPointerLock(); + break; + } + default: { + err(`glfwSetInputMode called with unknown value parameter value: ${value}`); + break; + } + } + break; + } + case 0x00033002: { // GLFW_STICKY_KEYS + err('glfwSetInputMode called with GLFW_STICKY_KEYS mode not implemented'); + break; + } + case 0x00033003: { // GLFW_STICKY_MOUSE_BUTTONS + err('glfwSetInputMode called with GLFW_STICKY_MOUSE_BUTTONS mode not implemented'); + break; + } + case 0x00033004: { // GLFW_LOCK_KEY_MODS + err('glfwSetInputMode called with GLFW_LOCK_KEY_MODS mode not implemented'); + break; + } + case 0x00033005: { // GLFW_RAW_MOUSE_MOTION + err('glfwSetInputMode called with GLFW_RAW_MOUSE_MOTION mode not implemented'); + break; + } + default: { + err(`glfwSetInputMode called with unknown mode parameter value: ${mode}`); + break; + } + } + }, + getKey:(winid, key) => { + var win = GLFW.WindowFromId(winid); + if (!win) return 0; + return win.keys[key]; + }, + getMouseButton:(winid, button) => { + var win = GLFW.WindowFromId(winid); + if (!win) return 0; + return (win.buttons & (1 << button)) > 0; + }, + getCursorPos:(winid, x, y) => { + HEAPF64[((x)>>3)] = Browser.mouseX; + HEAPF64[((y)>>3)] = Browser.mouseY; + }, + getMousePos:(winid, x, y) => { + HEAP32[((x)>>2)] = Browser.mouseX; + HEAP32[((y)>>2)] = Browser.mouseY; + }, + setCursorPos:(winid, x, y) => { + }, + getWindowPos:(winid, x, y) => { + var wx = 0; + var wy = 0; + + var win = GLFW.WindowFromId(winid); + if (win) { + wx = win.x; + wy = win.y; + } + + if (x) { + HEAP32[((x)>>2)] = wx; + } + + if (y) { + HEAP32[((y)>>2)] = wy; + } + }, + setWindowPos:(winid, x, y) => { + var win = GLFW.WindowFromId(winid); + if (!win) return; + win.x = x; + win.y = y; + }, + getWindowSize:(winid, width, height) => { + var ww = 0; + var wh = 0; + + var win = GLFW.WindowFromId(winid); + if (win) { + ww = win.width; + wh = win.height; + } + + if (width) { + HEAP32[((width)>>2)] = ww; + } + + if (height) { + HEAP32[((height)>>2)] = wh; + } + }, + setWindowSize:(winid, width, height) => { + var win = GLFW.WindowFromId(winid); + if (!win) return; + + if (GLFW.active.id == win.id) { + Browser.setCanvasSize(width, height); // triggers the listener (onCanvasResize) + windowSizeFunc + } + }, + defaultWindowHints:() => { + GLFW.hints = {...GLFW.defaultHints}; + }, + createWindow:(width, height, title, monitor, share) => { + var i, id; + for (i = 0; i < GLFW.windows.length && GLFW.windows[i] !== null; i++) { + // no-op + } + if (i > 0) abort("glfwCreateWindow only supports one window at time currently"); + + // id for window + id = i + 1; + + // not valid + if (width <= 0 || height <= 0) return 0; + + if (monitor) { + Browser.requestFullscreen(); + } else { + Browser.setCanvasSize(width, height); + } + + // Create context when there are no existing alive windows + for (i = 0; i < GLFW.windows.length && GLFW.windows[i] == null; i++) { + // no-op + } + + const canvas = Browser.getCanvas(); + + var useWebGL = GLFW.hints[0x00022001] > 0; // Use WebGL when we are told to based on GLFW_CLIENT_API + if (i == GLFW.windows.length) { + if (useWebGL) { + var contextAttributes = { + antialias: (GLFW.hints[0x0002100D] > 1), // GLFW_SAMPLES + depth: (GLFW.hints[0x00021005] > 0), // GLFW_DEPTH_BITS + stencil: (GLFW.hints[0x00021006] > 0), // GLFW_STENCIL_BITS + alpha: (GLFW.hints[0x00021004] > 0) // GLFW_ALPHA_BITS + } + Browser.createContext(canvas, /*useWebGL=*/true, /*setInModule=*/true, contextAttributes); + } else { + Browser.init(); + } + } + + // If context creation failed, do not return a valid window + if (!Module['ctx'] && useWebGL) return 0; + + // Initializes the framebuffer size from the canvas + var win = new GLFW_Window(id, width, height, canvas.width, canvas.height, title, monitor, share); + + // Set window to array + if (id - 1 == GLFW.windows.length) { + GLFW.windows.push(win); + } else { + GLFW.windows[id - 1] = win; + } + + GLFW.active = win; + GLFW.adjustCanvasDimensions(); + return win.id; + }, + destroyWindow:(winid) => { + var win = GLFW.WindowFromId(winid); + if (!win) return; + + if (win.windowCloseFunc) { + getWasmTableEntry(win.windowCloseFunc)(win.id); + } + + GLFW.windows[win.id - 1] = null; + if (GLFW.active.id == win.id) { + GLFW.active = null; + } + + // Destroy context when no alive windows + for (win of GLFW.windows) { + if (win !== null) return; + } + + delete Module['ctx']; + }, + swapBuffers:(winid) => { + }, + requestFullscreen(lockPointer, resizeCanvas) { + Browser.lockPointer = lockPointer; + Browser.resizeCanvas = resizeCanvas; + if (typeof Browser.lockPointer == 'undefined') Browser.lockPointer = true; + if (typeof Browser.resizeCanvas == 'undefined') Browser.resizeCanvas = false; + + var canvas = Browser.getCanvas(); + function fullscreenChange() { + Browser.isFullscreen = false; + var canvasContainer = canvas.parentNode; + if (getFullscreenElement() === canvasContainer) { + canvas.exitFullscreen = Browser.exitFullscreen; + if (Browser.lockPointer) canvas.requestPointerLock(); + Browser.isFullscreen = true; + if (Browser.resizeCanvas) { + Browser.setFullscreenCanvasSize(); + } else { + Browser.updateCanvasDimensions(canvas); + Browser.updateResizeListeners(); + } + } else { + // remove the full screen specific parent of the canvas again to restore the HTML structure from before going full screen + canvasContainer.parentNode.insertBefore(canvas, canvasContainer); + canvasContainer.parentNode.removeChild(canvasContainer); + + if (Browser.resizeCanvas) { + Browser.setWindowedCanvasSize(); + } else { + Browser.updateCanvasDimensions(canvas); + Browser.updateResizeListeners(); + } + } + Module['onFullScreen']?.(Browser.isFullscreen); + Module['onFullscreen']?.(Browser.isFullscreen); + } + + if (!Browser.fullscreenHandlersInstalled) { + Browser.fullscreenHandlersInstalled = true; + document.addEventListener('fullscreenchange', fullscreenChange, false); + document.addEventListener('mozfullscreenchange', fullscreenChange, false); + document.addEventListener('webkitfullscreenchange', fullscreenChange, false); + document.addEventListener('MSFullscreenChange', fullscreenChange, false); + } + + // create a new parent to ensure the canvas has no siblings. this allows browsers to optimize full screen performance when its parent is the full screen root + var canvasContainer = document.createElement("div"); + canvas.parentNode.insertBefore(canvasContainer, canvas); + canvasContainer.appendChild(canvas); + + // use parent of canvas as full screen root to allow aspect ratio correction (Firefox stretches the root to screen size) + canvasContainer.requestFullscreen = canvasContainer['requestFullscreen'] || + canvasContainer['mozRequestFullScreen'] || + canvasContainer['msRequestFullscreen'] || + (canvasContainer['webkitRequestFullscreen'] ? () => canvasContainer['webkitRequestFullscreen'](Element['ALLOW_KEYBOARD_INPUT']) : null) || + (canvasContainer['webkitRequestFullScreen'] ? () => canvasContainer['webkitRequestFullScreen'](Element['ALLOW_KEYBOARD_INPUT']) : null); + + canvasContainer.requestFullscreen(); + }, + updateCanvasDimensions(canvas, wNative, hNative) { + const scale = GLFW.getHiDPIScale(); + + if (wNative && hNative) { + canvas.widthNative = wNative; + canvas.heightNative = hNative; + } else { + wNative = canvas.widthNative; + hNative = canvas.heightNative; + } + var w = wNative; + var h = hNative; + if (Module['forcedAspectRatio'] && Module['forcedAspectRatio'] > 0) { + if (w/h < Module['forcedAspectRatio']) { + w = Math.round(h * Module['forcedAspectRatio']); + } else { + h = Math.round(w / Module['forcedAspectRatio']); + } + } + if ((getFullscreenElement() === canvas.parentNode) && (typeof screen != 'undefined')) { + var factor = Math.min(screen.width / w, screen.height / h); + w = Math.round(w * factor); + h = Math.round(h * factor); + } + if (Browser.resizeCanvas) { + wNative = w; + hNative = h; + } + const wNativeScaled = Math.floor(wNative * scale); + const hNativeScaled = Math.floor(hNative * scale); + if (canvas.width != wNativeScaled) canvas.width = wNativeScaled; + if (canvas.height != hNativeScaled) canvas.height = hNativeScaled; + if (typeof canvas.style != 'undefined') { + if (!GLFW.isCSSScalingEnabled()) { + canvas.style.setProperty( "width", wNative + "px", "important"); + canvas.style.setProperty("height", hNative + "px", "important"); + } else { + canvas.style.removeProperty( "width"); + canvas.style.removeProperty("height"); + } + } + }, + calculateMouseCoords(pageX, pageY) { + // Calculate the movement based on the changes + // in the coordinates. + const rect = Browser.getCanvas().getBoundingClientRect(); + + var adjustedX = pageX - (window.scrollX + rect.left); + var adjustedY = pageY - (window.scrollY + rect.top); + + // getBoundingClientRect() returns dimension affected by CSS, so as a result: + // - when CSS scaling is enabled, this will fix the mouse coordinates to match the width/height of the window + // - otherwise the CSS width/height are forced to the width/height of the GLFW window (see updateCanvasDimensions), + // so there is no need to adjust the position + if (GLFW.isCSSScalingEnabled() && GLFW.active) { + adjustedX = adjustedX * (GLFW.active.width / rect.width); + adjustedY = adjustedY * (GLFW.active.height / rect.height); + } + + return { x: adjustedX, y: adjustedY }; + }, + setWindowAttrib:(winid, attrib, value) => { + var win = GLFW.WindowFromId(winid); + if (!win) return; + const isHiDPIAware = GLFW.isHiDPIAware(); + win.attributes[attrib] = value; + if (isHiDPIAware !== GLFW.isHiDPIAware()) + GLFW.adjustCanvasDimensions(); + }, + getDevicePixelRatio() { + return (typeof devicePixelRatio == 'number' && devicePixelRatio) || 1.0; + }, + isHiDPIAware() { + if (GLFW.active) + return GLFW.active.attributes[0x0002200C] > 0; // GLFW_SCALE_TO_MONITOR + else + return false; + }, + isCSSScalingEnabled() { + return !GLFW.isHiDPIAware(); + }, + adjustCanvasDimensions() { + if (GLFW.active) { + Browser.updateCanvasDimensions(Browser.getCanvas(), GLFW.active.width, GLFW.active.height); + Browser.updateResizeListeners(); + } + }, + getHiDPIScale() { + return GLFW.isHiDPIAware() ? GLFW.scale : 1.0; + }, + onDevicePixelRatioChange() { + GLFW.onWindowContentScaleChanged(GLFW.getDevicePixelRatio()); + GLFW.adjustCanvasDimensions(); + }, + GLFW2ParamToGLFW3Param:(param) => { + var table = { + 0x00030001:0, // GLFW_MOUSE_CURSOR + 0x00030002:0, // GLFW_STICKY_KEYS + 0x00030003:0, // GLFW_STICKY_MOUSE_BUTTONS + 0x00030004:0, // GLFW_SYSTEM_KEYS + 0x00030005:0, // GLFW_KEY_REPEAT + 0x00030006:0, // GLFW_AUTO_POLL_EVENTS + 0x00020001:0, // GLFW_OPENED + 0x00020002:0, // GLFW_ACTIVE + 0x00020003:0, // GLFW_ICONIFIED + 0x00020004:0, // GLFW_ACCELERATED + 0x00020005:0x00021001, // GLFW_RED_BITS + 0x00020006:0x00021002, // GLFW_GREEN_BITS + 0x00020007:0x00021003, // GLFW_BLUE_BITS + 0x00020008:0x00021004, // GLFW_ALPHA_BITS + 0x00020009:0x00021005, // GLFW_DEPTH_BITS + 0x0002000A:0x00021006, // GLFW_STENCIL_BITS + 0x0002000B:0x0002100F, // GLFW_REFRESH_RATE + 0x0002000C:0x00021007, // GLFW_ACCUM_RED_BITS + 0x0002000D:0x00021008, // GLFW_ACCUM_GREEN_BITS + 0x0002000E:0x00021009, // GLFW_ACCUM_BLUE_BITS + 0x0002000F:0x0002100A, // GLFW_ACCUM_ALPHA_BITS + 0x00020010:0x0002100B, // GLFW_AUX_BUFFERS + 0x00020011:0x0002100C, // GLFW_STEREO + 0x00020012:0, // GLFW_WINDOW_NO_RESIZE + 0x00020013:0x0002100D, // GLFW_FSAA_SAMPLES + 0x00020014:0x00022002, // GLFW_OPENGL_VERSION_MAJOR + 0x00020015:0x00022003, // GLFW_OPENGL_VERSION_MINOR + 0x00020016:0x00022006, // GLFW_OPENGL_FORWARD_COMPAT + 0x00020017:0x00022007, // GLFW_OPENGL_DEBUG_CONTEXT + 0x00020018:0x00022008, // GLFW_OPENGL_PROFILE + }; + return table[param]; + }, + }; + var _glfwCreateWindow = (width, height, title, monitor, share) => GLFW.createWindow(width, height, title, monitor, share); + + var _glfwDefaultWindowHints = () => GLFW.defaultWindowHints(); + + var _glfwDestroyWindow = (winid) => GLFW.destroyWindow(winid); + + var _glfwGetPrimaryMonitor = () => 1; + + var _glfwGetTime = () => GLFW.getTime() - GLFW.initialTime; + + var _glfwGetVideoModes = (monitor, count) => { + HEAP32[((count)>>2)] = 0; + return 0; + }; + + var _glfwInit = () => { + if (GLFW.windows) return 1; // GL_TRUE + + GLFW.initialTime = GLFW.getTime(); + GLFW.defaultWindowHints(); + GLFW.windows = new Array() + GLFW.active = null; + GLFW.scale = GLFW.getDevicePixelRatio(); + + window.addEventListener('gamepadconnected', GLFW.onGamepadConnected, true); + window.addEventListener('gamepaddisconnected', GLFW.onGamepadDisconnected, true); + window.addEventListener('keydown', GLFW.onKeydown, true); + window.addEventListener('keypress', GLFW.onKeyPress, true); + window.addEventListener('keyup', GLFW.onKeyup, true); + window.addEventListener('blur', GLFW.onBlur, true); + + // watch for devicePixelRatio changes + GLFW.devicePixelRatioMQL = window.matchMedia('(resolution: ' + GLFW.getDevicePixelRatio() + 'dppx)'); + GLFW.devicePixelRatioMQL.addEventListener('change', GLFW.onDevicePixelRatioChange); + + var canvas = Browser.getCanvas(); + canvas.addEventListener('touchmove', GLFW.onMousemove, true); + canvas.addEventListener('touchstart', GLFW.onMouseButtonDown, true); + canvas.addEventListener('touchcancel', GLFW.onMouseButtonUp, true); + canvas.addEventListener('touchend', GLFW.onMouseButtonUp, true); + canvas.addEventListener('mousemove', GLFW.onMousemove, true); + canvas.addEventListener('mousedown', GLFW.onMouseButtonDown, true); + canvas.addEventListener("mouseup", GLFW.onMouseButtonUp, true); + canvas.addEventListener('wheel', GLFW.onMouseWheel, true); + canvas.addEventListener('mousewheel', GLFW.onMouseWheel, true); + canvas.addEventListener('mouseenter', GLFW.onMouseenter, true); + canvas.addEventListener('mouseleave', GLFW.onMouseleave, true); + canvas.addEventListener('drop', GLFW.onDrop, true); + canvas.addEventListener('dragover', GLFW.onDragover, true); + + // Overriding implementation to account for HiDPI + Browser.requestFullscreen = GLFW.requestFullscreen; + Browser.calculateMouseCoords = GLFW.calculateMouseCoords; + Browser.updateCanvasDimensions = GLFW.updateCanvasDimensions; + + Browser.resizeListeners.push((width, height) => { + if (GLFW.isHiDPIAware()) { + var canvas = Browser.getCanvas(); + GLFW.onCanvasResize(canvas.clientWidth, canvas.clientHeight, width, height); + } else { + GLFW.onCanvasResize(width, height, width, height); + } + }); + + return 1; // GL_TRUE + }; + + var _glfwMakeContextCurrent = (winid) => 0; + + var _glfwSetCharCallback = (winid, cbfun) => GLFW.setCharCallback(winid, cbfun); + + var _glfwSetCursorEnterCallback = (winid, cbfun) => { + var win = GLFW.WindowFromId(winid); + if (!win) return null; + var prevcbfun = win.cursorEnterFunc; + win.cursorEnterFunc = cbfun; + return prevcbfun; + }; + + var _glfwSetCursorPosCallback = (winid, cbfun) => GLFW.setCursorPosCallback(winid, cbfun); + + var _glfwSetDropCallback = (winid, cbfun) => GLFW.setDropCallback(winid, cbfun); + + var _glfwSetErrorCallback = (cbfun) => { + var prevcbfun = GLFW.errorFunc; + GLFW.errorFunc = cbfun; + return prevcbfun; + }; + + var _glfwSetKeyCallback = (winid, cbfun) => GLFW.setKeyCallback(winid, cbfun); + + var _glfwSetMouseButtonCallback = (winid, cbfun) => GLFW.setMouseButtonCallback(winid, cbfun); + + var _glfwSetScrollCallback = (winid, cbfun) => GLFW.setScrollCallback(winid, cbfun); + + var _glfwSetWindowContentScaleCallback = (winid, cbfun) => { + var win = GLFW.WindowFromId(winid); + if (!win) return null; + var prevcbfun = win.windowContentScaleFunc; + win.windowContentScaleFunc = cbfun; + return prevcbfun; + }; + + var _glfwSetWindowFocusCallback = (winid, cbfun) => { + var win = GLFW.WindowFromId(winid); + if (!win) return null; + var prevcbfun = win.windowFocusFunc; + win.windowFocusFunc = cbfun; + return prevcbfun; + }; + + var _glfwSetWindowIconifyCallback = (winid, cbfun) => { + var win = GLFW.WindowFromId(winid); + if (!win) return null; + var prevcbfun = win.windowIconifyFunc; + win.windowIconifyFunc = cbfun; + return prevcbfun; + }; + + var _glfwSetWindowShouldClose = (winid, value) => { + var win = GLFW.WindowFromId(winid); + if (!win) return; + win.shouldClose = value; + }; + + var _glfwSetWindowSizeCallback = (winid, cbfun) => GLFW.setWindowSizeCallback(winid, cbfun); + + var _glfwSwapBuffers = (winid) => GLFW.swapBuffers(winid); + + var _glfwTerminate = () => { + window.removeEventListener('gamepadconnected', GLFW.onGamepadConnected, true); + window.removeEventListener('gamepaddisconnected', GLFW.onGamepadDisconnected, true); + window.removeEventListener('keydown', GLFW.onKeydown, true); + window.removeEventListener('keypress', GLFW.onKeyPress, true); + window.removeEventListener('keyup', GLFW.onKeyup, true); + window.removeEventListener('blur', GLFW.onBlur, true); + var canvas = Browser.getCanvas(); + canvas.removeEventListener('touchmove', GLFW.onMousemove, true); + canvas.removeEventListener('touchstart', GLFW.onMouseButtonDown, true); + canvas.removeEventListener('touchcancel', GLFW.onMouseButtonUp, true); + canvas.removeEventListener('touchend', GLFW.onMouseButtonUp, true); + canvas.removeEventListener('mousemove', GLFW.onMousemove, true); + canvas.removeEventListener('mousedown', GLFW.onMouseButtonDown, true); + canvas.removeEventListener('mouseup', GLFW.onMouseButtonUp, true); + canvas.removeEventListener('wheel', GLFW.onMouseWheel, true); + canvas.removeEventListener('mousewheel', GLFW.onMouseWheel, true); + canvas.removeEventListener('mouseenter', GLFW.onMouseenter, true); + canvas.removeEventListener('mouseleave', GLFW.onMouseleave, true); + canvas.removeEventListener('drop', GLFW.onDrop, true); + canvas.removeEventListener('dragover', GLFW.onDragover, true); + + if (GLFW.devicePixelRatioMQL) + GLFW.devicePixelRatioMQL.removeEventListener('change', GLFW.onDevicePixelRatioChange); + + canvas.width = canvas.height = 1; + GLFW.windows = null; + GLFW.active = null; + }; + + var _glfwWindowHint = (target, hint) => { + GLFW.hints[target] = hint; + }; + + function _rand_bytes(...args + ) { + abort('missing function: rand_bytes'); + } + _rand_bytes.stub = true; + + function _write(...args + ) { + abort('missing function: write'); + } + _write.stub = true; + + + + var FS_createPath = (...args) => FS.createPath(...args); + + + + var FS_unlink = (...args) => FS.unlink(...args); + + var FS_createLazyFile = (...args) => FS.createLazyFile(...args); + + var FS_createDevice = (...args) => FS.createDevice(...args); + + + + FS.createPreloadedFile = FS_createPreloadedFile; + FS.preloadFile = FS_preloadFile; + FS.staticInit();; +for (let i = 0; i < 32; ++i) tempFixedLengthArray.push(new Array(i));; +var miniTempWebGLFloatBuffersStorage = new Float32Array(288); + // Create GL_POOL_TEMP_BUFFERS_SIZE+1 temporary buffers, for uploads of size 0 through GL_POOL_TEMP_BUFFERS_SIZE inclusive + for (/**@suppress{duplicate}*/var i = 0; i <= 288; ++i) { + miniTempWebGLFloatBuffers[i] = miniTempWebGLFloatBuffersStorage.subarray(0, i); + }; +var miniTempWebGLIntBuffersStorage = new Int32Array(288); + // Create GL_POOL_TEMP_BUFFERS_SIZE+1 temporary buffers, for uploads of size 0 through GL_POOL_TEMP_BUFFERS_SIZE inclusive + for (/**@suppress{duplicate}*/var i = 0; i <= 288; ++i) { + miniTempWebGLIntBuffers[i] = miniTempWebGLIntBuffersStorage.subarray(0, i); + }; + + Module['requestAnimationFrame'] = MainLoop.requestAnimationFrame; + Module['pauseMainLoop'] = MainLoop.pause; + Module['resumeMainLoop'] = MainLoop.resume; + MainLoop.init();; +// End JS library code + +// include: postlibrary.js +// This file is included after the automatically-generated JS library code +// but before the wasm module is created. + +{ + + // Begin ATMODULES hooks + if (Module['noExitRuntime']) noExitRuntime = Module['noExitRuntime']; +if (Module['preloadPlugins']) preloadPlugins = Module['preloadPlugins']; +if (Module['print']) out = Module['print']; +if (Module['printErr']) err = Module['printErr']; +if (Module['wasmBinary']) wasmBinary = Module['wasmBinary']; + // End ATMODULES hooks + + checkIncomingModuleAPI(); + + if (Module['arguments']) programArgs = Module['arguments']; + if (Module['thisProgram']) thisProgram = Module['thisProgram']; + + // Assertions on removed incoming Module JS APIs. + assert(typeof Module['memoryInitializerPrefixURL'] == 'undefined', 'Module.memoryInitializerPrefixURL option was removed, use Module.locateFile instead'); + assert(typeof Module['pthreadMainPrefixURL'] == 'undefined', 'Module.pthreadMainPrefixURL option was removed, use Module.locateFile instead'); + assert(typeof Module['cdInitializerPrefixURL'] == 'undefined', 'Module.cdInitializerPrefixURL option was removed, use Module.locateFile instead'); + assert(typeof Module['filePackagePrefixURL'] == 'undefined', 'Module.filePackagePrefixURL option was removed, use Module.locateFile instead'); + assert(typeof Module['read'] == 'undefined', 'Module.read option was removed'); + assert(typeof Module['readAsync'] == 'undefined', 'Module.readAsync option was removed (modify readAsync in JS)'); + assert(typeof Module['readBinary'] == 'undefined', 'Module.readBinary option was removed (modify readBinary in JS)'); + assert(typeof Module['setWindowTitle'] == 'undefined', 'Module.setWindowTitle option was removed (modify emscripten_set_window_title in JS)'); + assert(typeof Module['TOTAL_MEMORY'] == 'undefined', 'Module.TOTAL_MEMORY has been renamed Module.INITIAL_MEMORY'); + assert(typeof Module['ENVIRONMENT'] == 'undefined', 'Module.ENVIRONMENT has been deprecated. To force the environment, use the ENVIRONMENT compile-time option (for example, -sENVIRONMENT=web or -sENVIRONMENT=node)'); + assert(typeof Module['STACK_SIZE'] == 'undefined', 'STACK_SIZE can no longer be set at runtime. Use -sSTACK_SIZE at link time') + // If memory is defined in wasm, the user can't provide it, or set INITIAL_MEMORY + assert(typeof Module['wasmMemory'] == 'undefined', 'Use of `wasmMemory` detected. Use -sIMPORTED_MEMORY to define wasmMemory externally'); + assert(typeof Module['INITIAL_MEMORY'] == 'undefined', 'Detected runtime INITIAL_MEMORY setting. Use -sIMPORTED_MEMORY to define wasmMemory dynamically'); + + if (Module['preInit']) { + if (typeof Module['preInit'] == 'function') Module['preInit'] = [Module['preInit']]; + while (Module['preInit'].length > 0) { + Module['preInit'].shift()(); + } + } + consumedModuleProp('preInit'); +} + +// Begin runtime exports + Module['addRunDependency'] = addRunDependency; + Module['removeRunDependency'] = removeRunDependency; + Module['FS_preloadFile'] = FS_preloadFile; + Module['FS_unlink'] = FS_unlink; + Module['FS_createPath'] = FS_createPath; + Module['FS_createDevice'] = FS_createDevice; + Module['FS_createDataFile'] = FS_createDataFile; + Module['FS_createLazyFile'] = FS_createLazyFile; + var missingLibrarySymbols = [ + 'writeI53ToI64Clamped', + 'writeI53ToI64Signaling', + 'writeI53ToU64Clamped', + 'writeI53ToU64Signaling', + 'convertI32PairToI53', + 'convertI32PairToI53Checked', + 'convertU32PairToI53', + 'stackAlloc', + 'getTempRet0', + 'setTempRet0', + 'createNamedFunction', + 'zeroMemory', + 'getHeapMax', + 'growMemory', + 'withStackSave', + 'inetPton4', + 'inetNtop4', + 'inetPton6', + 'inetNtop6', + 'readSockaddr', + 'writeSockaddr', + 'runMainThreadEmAsm', + 'getExecutableName', + 'autoResumeAudioContext', + 'getDynCaller', + 'dynCall', + 'runtimeKeepalivePush', + 'runtimeKeepalivePop', + 'asmjsMangle', + 'alignMemory', + 'HandleAllocator', + 'addOnInit', + 'addOnPostCtor', + 'addOnPreMain', + 'STACK_SIZE', + 'STACK_ALIGN', + 'POINTER_SIZE', + 'ASSERTIONS', + 'ccall', + 'cwrap', + 'convertJsFunctionToWasm', + 'getEmptyTableSlot', + 'updateTableMap', + 'getFunctionAddress', + 'addFunction', + 'removeFunction', + 'intArrayToString', + 'AsciiToString', + 'stringToAscii', + 'UTF16ToString', + 'stringToUTF16', + 'lengthBytesUTF16', + 'UTF32ToString', + 'stringToUTF32', + 'lengthBytesUTF32', + 'stringToUTF8OnStack', + 'writeArrayToMemory', + 'registerKeyEventCallback', + 'registerWheelEventCallback', + 'registerFocusEventCallback', + 'fillDeviceOrientationEventData', + 'registerDeviceOrientationEventCallback', + 'fillDeviceMotionEventData', + 'registerDeviceMotionEventCallback', + 'screenOrientation', + 'fillOrientationChangeEventData', + 'registerOrientationChangeEventCallback', + 'JSEvents_requestFullscreen', + 'JSEvents_resizeCanvasForFullscreen', + 'registerRestoreOldStyle', + 'hideEverythingExceptGivenElement', + 'restoreHiddenElements', + 'setLetterbox', + 'softFullscreenResizeWebGLRenderTarget', + 'doRequestFullscreen', + 'registerPointerlockErrorEventCallback', + 'requestPointerLock', + 'fillVisibilityChangeEventData', + 'registerVisibilityChangeEventCallback', + 'registerBeforeUnloadEventCallback', + 'fillBatteryEventData', + 'registerBatteryEventCallback', + 'setCanvasElementSize', + 'getCanvasElementSize', + 'jsStackTrace', + 'getCallstack', + 'convertPCtoSourceLocation', + 'getEnvStrings', + 'wasiRightsToMuslOFlags', + 'wasiOFlagsToMuslOFlags', + 'setImmediateWrapped', + 'safeRequestAnimationFrame', + 'clearImmediateWrapped', + 'registerPostMainLoop', + 'registerPreMainLoop', + 'getPromise', + 'makePromise', + 'addPromise', + 'idsToPromises', + 'makePromiseCallback', + 'ExceptionInfo', + 'findMatchingCatch', + 'incrementUncaughtExceptionCount', + 'decrementUncaughtExceptionCount', + 'Browser_asyncPrepareDataCounter', + 'isLeapYear', + 'ydayFromDate', + 'arraySum', + 'addDays', + 'getSocketFromFD', + 'getSocketAddress', + 'FS_mkdirTree', + '_setNetworkCallback', + 'writeGLArray', + 'registerWebGlEventCallback', + 'runAndAbortIfError', + 'ALLOC_NORMAL', + 'ALLOC_STACK', + 'allocate', + 'writeStringToMemory', + 'writeAsciiToMemory', + 'allocateUTF8', + 'allocateUTF8OnStack', + 'demangle', + 'stackTrace', + 'getNativeTypeSize', +]; +missingLibrarySymbols.forEach(missingLibrarySymbol) + + var unexportedSymbols = [ + 'run', + 'out', + 'err', + 'callMain', + 'abort', + 'wasmExports', + 'writeStackCookie', + 'checkStackCookie', + 'writeI53ToI64', + 'readI53FromI64', + 'readI53FromU64', + 'INT53_MAX', + 'INT53_MIN', + 'bigintToI53Checked', + 'HEAP8', + 'HEAPU8', + 'HEAP16', + 'HEAPU16', + 'HEAP32', + 'HEAPU32', + 'HEAPF64', + 'HEAP64', + 'HEAPU64', + 'stackSave', + 'stackRestore', + 'ptrToString', + 'exitJS', + 'abortOnCannotGrowMemory', + 'ENV', + 'ERRNO_CODES', + 'strError', + 'DNS', + 'Protocols', + 'Sockets', + 'timers', + 'warnOnce', + 'readEmAsmArgsArray', + 'readEmAsmArgs', + 'runEmAsmFunction', + 'jstoi_q', + 'handleException', + 'keepRuntimeAlive', + 'callUserCallback', + 'maybeExit', + 'asyncLoad', + 'mmapAlloc', + 'wasmTable', + 'wasmMemory', + 'getUniqueRunDependency', + 'noExitRuntime', + 'addOnPreRun', + 'addOnExit', + 'addOnPostRun', + 'freeTableIndexes', + 'functionsInTableMap', + 'setValue', + 'getValue', + 'PATH', + 'PATH_FS', + 'UTF8Decoder', + 'UTF8ArrayToString', + 'UTF8ToString', + 'stringToUTF8Array', + 'stringToUTF8', + 'lengthBytesUTF8', + 'intArrayFromString', + 'UTF16Decoder', + 'stringToNewUTF8', + 'JSEvents', + 'specialHTMLTargets', + 'maybeCStringToJsString', + 'findEventTarget', + 'findCanvasEventTarget', + 'getBoundingClientRect', + 'fillMouseEventData', + 'registerMouseEventCallback', + 'registerUiEventCallback', + 'fillFullscreenChangeEventData', + 'registerFullscreenChangeEventCallback', + 'currentFullscreenStrategy', + 'restoreOldWindowedStyle', + 'fillPointerlockChangeEventData', + 'registerPointerlockChangeEventCallback', + 'registerTouchEventCallback', + 'fillGamepadEventData', + 'registerGamepadEventCallback', + 'UNWIND_CACHE', + 'ExitStatus', + 'checkWasiClock', + 'doReadv', + 'doWritev', + 'initRandomFill', + 'randomFill', + 'safeSetTimeout', + 'emSetImmediate', + 'emClearImmediate_deps', + 'emClearImmediate', + 'promiseMap', + 'uncaughtExceptionCount', + 'exceptionCaught', + 'Browser', + 'requestFullscreen', + 'requestFullScreen', + 'setCanvasSize', + 'getUserMedia', + 'createContext', + 'getPreloadedImageData__data', + 'wget', + 'MONTH_DAYS_REGULAR', + 'MONTH_DAYS_LEAP', + 'MONTH_DAYS_REGULAR_CUMULATIVE', + 'MONTH_DAYS_LEAP_CUMULATIVE', + 'SYSCALLS', + 'preloadPlugins', + 'FS_createPreloadedFile', + 'FS_modeStringToFlags', + 'FS_getMode', + 'FS_fileDataToTypedArray', + 'FS_stdin_getChar_buffer', + 'FS_stdin_getChar', + 'FS_readFile', + 'FS', + 'FS_root', + 'FS_mounts', + 'FS_devices', + 'FS_streams', + 'FS_nextInode', + 'FS_nameTable', + 'FS_currentPath', + 'FS_initialized', + 'FS_ignorePermissions', + 'FS_filesystems', + 'FS_syncFSRequests', + 'FS_lookupPath', + 'FS_getPath', + 'FS_hashName', + 'FS_hashAddNode', + 'FS_hashRemoveNode', + 'FS_lookupNode', + 'FS_createNode', + 'FS_destroyNode', + 'FS_isRoot', + 'FS_isMountpoint', + 'FS_isFile', + 'FS_isDir', + 'FS_isLink', + 'FS_isChrdev', + 'FS_isBlkdev', + 'FS_isFIFO', + 'FS_isSocket', + 'FS_flagsToPermissionString', + 'FS_nodePermissions', + 'FS_mayLookup', + 'FS_mayCreate', + 'FS_mayDelete', + 'FS_mayOpen', + 'FS_checkOpExists', + 'FS_nextfd', + 'FS_getStreamChecked', + 'FS_getStream', + 'FS_createStream', + 'FS_closeStream', + 'FS_dupStream', + 'FS_doSetAttr', + 'FS_chrdev_stream_ops', + 'FS_major', + 'FS_minor', + 'FS_makedev', + 'FS_registerDevice', + 'FS_getDevice', + 'FS_getMounts', + 'FS_syncfs', + 'FS_mount', + 'FS_unmount', + 'FS_lookup', + 'FS_mknod', + 'FS_statfs', + 'FS_statfsStream', + 'FS_statfsNode', + 'FS_create', + 'FS_mkdir', + 'FS_mkdev', + 'FS_symlink', + 'FS_rename', + 'FS_rmdir', + 'FS_readdir', + 'FS_readlink', + 'FS_stat', + 'FS_fstat', + 'FS_lstat', + 'FS_doChmod', + 'FS_chmod', + 'FS_lchmod', + 'FS_fchmod', + 'FS_doChown', + 'FS_chown', + 'FS_lchown', + 'FS_fchown', + 'FS_doTruncate', + 'FS_truncate', + 'FS_ftruncate', + 'FS_utime', + 'FS_open', + 'FS_close', + 'FS_isClosed', + 'FS_llseek', + 'FS_read', + 'FS_write', + 'FS_mmap', + 'FS_msync', + 'FS_ioctl', + 'FS_writeFile', + 'FS_cwd', + 'FS_chdir', + 'FS_createDefaultDirectories', + 'FS_createDefaultDevices', + 'FS_createSpecialDirectories', + 'FS_createStandardStreams', + 'FS_staticInit', + 'FS_init', + 'FS_quit', + 'FS_findObject', + 'FS_analyzePath', + 'FS_createFile', + 'FS_forceLoadFile', + 'MEMFS', + 'TTY', + 'PIPEFS', + 'SOCKFS', + 'tempFixedLengthArray', + 'miniTempWebGLFloatBuffers', + 'miniTempWebGLIntBuffers', + 'heapObjectForWebGLType', + 'toTypedArrayIndex', + 'webgl_enable_ANGLE_instanced_arrays', + 'webgl_enable_OES_vertex_array_object', + 'webgl_enable_WEBGL_draw_buffers', + 'webgl_enable_WEBGL_multi_draw', + 'webgl_enable_EXT_polygon_offset_clamp', + 'webgl_enable_EXT_clip_control', + 'webgl_enable_WEBGL_polygon_mode', + 'GL', + 'emscriptenWebGLGet', + 'computeUnpackAlignedImageSize', + 'colorChannelsInGlTextureFormat', + 'emscriptenWebGLGetTexPixelData', + 'emscriptenWebGLGetUniform', + 'webglGetProgramUniformLocation', + 'webglGetUniformLocation', + 'webglPrepareUniformLocationsBeforeFirstUse', + 'webglGetLeftBracePos', + 'emscriptenWebGLGetVertexAttrib', + '__glGetActiveAttribOrUniform', + 'AL', + 'GLUT', + 'EGL', + 'GLEW', + 'IDBStore', + 'SDL', + 'SDL_gfx', + 'GLFW_Window', + 'GLFW', + 'print', + 'printErr', + 'jstoi_s', +]; +unexportedSymbols.forEach(unexportedRuntimeSymbol); + + // End runtime exports + // Begin JS library exports + // End JS library exports + +// end include: postlibrary.js + +function checkIncomingModuleAPI() { + ignoredModuleProp('fetchSettings'); + ignoredModuleProp('logReadFiles'); + ignoredModuleProp('loadSplitModule'); + ignoredModuleProp('onMalloc'); + ignoredModuleProp('onRealloc'); + ignoredModuleProp('onFree'); + ignoredModuleProp('onSbrkGrow'); +} +var ASM_CONSTS = { + 714400: () => { if (document.fullscreenElement) return 1; }, + 714446: () => { return document.getElementById('canvas').width; }, + 714498: () => { return parseInt(document.getElementById('canvas').style.width); }, + 714566: () => { document.exitFullscreen(); }, + 714593: () => { setTimeout(function() { Module.requestFullscreen(false, false); }, 100); }, + 714666: () => { if (document.fullscreenElement) return 1; }, + 714712: () => { return document.getElementById('canvas').width; }, + 714764: () => { return screen.width; }, + 714789: () => { document.exitFullscreen(); }, + 714816: () => { setTimeout(function() { Module.requestFullscreen(false, true); setTimeout(function() { canvas.style.width="unset"; }, 100); }, 100); }, + 714949: () => { return window.innerWidth; }, + 714975: () => { return window.innerHeight; }, + 715002: () => { if (document.fullscreenElement) return 1; }, + 715048: () => { return document.getElementById('canvas').width; }, + 715100: () => { return parseInt(document.getElementById('canvas').style.width); }, + 715168: () => { if (document.fullscreenElement) return 1; }, + 715214: () => { return document.getElementById('canvas').width; }, + 715266: () => { return screen.width; }, + 715291: () => { return window.innerWidth; }, + 715317: () => { return window.innerHeight; }, + 715344: () => { if (document.fullscreenElement) return 1; }, + 715390: () => { return document.getElementById('canvas').width; }, + 715442: () => { return screen.width; }, + 715467: () => { document.exitFullscreen(); }, + 715494: () => { if (document.fullscreenElement) return 1; }, + 715540: () => { return document.getElementById('canvas').width; }, + 715592: () => { return parseInt(document.getElementById('canvas').style.width); }, + 715660: () => { document.exitFullscreen(); }, + 715687: ($0) => { document.getElementById('canvas').style.opacity = $0; }, + 715745: () => { return screen.width; }, + 715770: () => { return screen.height; }, + 715796: () => { return window.screenX; }, + 715823: () => { return window.screenY; }, + 715850: ($0) => { navigator.clipboard.writeText(UTF8ToString($0)); }, + 715903: ($0) => { document.getElementById("canvas").style.cursor = UTF8ToString($0); }, + 715974: () => { document.getElementById('canvas').style.cursor = 'none'; }, + 716031: ($0, $1, $2, $3) => { try { navigator.getGamepads()[$0].vibrationActuator.playEffect('dual-rumble', { startDelay: 0, duration: $3, weakMagnitude: $1, strongMagnitude: $2 }); } catch (e) { try { navigator.getGamepads()[$0].hapticActuators[0].pulse($2, $3); } catch (e) { } } }, + 716287: ($0) => { document.getElementById('canvas').style.cursor = UTF8ToString($0); }, + 716358: () => { if (document.fullscreenElement) return 1; }, + 716404: () => { return window.innerWidth; }, + 716430: () => { return window.innerHeight; }, + 716457: () => { if (document.pointerLockElement) return 1; }, + 716504: ($0, $1, $2, $3, $4) => { if (typeof window === 'undefined' || (window.AudioContext || window.webkitAudioContext) === undefined) { return 0; } if (typeof(window.miniaudio) === 'undefined') { window.miniaudio = { referenceCount: 0 }; window.miniaudio.device_type = {}; window.miniaudio.device_type.playback = $0; window.miniaudio.device_type.capture = $1; window.miniaudio.device_type.duplex = $2; window.miniaudio.device_state = {}; window.miniaudio.device_state.stopped = $3; window.miniaudio.device_state.started = $4; miniaudio.devices = []; miniaudio.track_device = function(device) { for (var iDevice = 0; iDevice < miniaudio.devices.length; ++iDevice) { if (miniaudio.devices[iDevice] == null) { miniaudio.devices[iDevice] = device; return iDevice; } } miniaudio.devices.push(device); return miniaudio.devices.length - 1; }; miniaudio.untrack_device_by_index = function(deviceIndex) { miniaudio.devices[deviceIndex] = null; while (miniaudio.devices.length > 0) { if (miniaudio.devices[miniaudio.devices.length-1] == null) { miniaudio.devices.pop(); } else { break; } } }; miniaudio.untrack_device = function(device) { for (var iDevice = 0; iDevice < miniaudio.devices.length; ++iDevice) { if (miniaudio.devices[iDevice] == device) { return miniaudio.untrack_device_by_index(iDevice); } } }; miniaudio.get_device_by_index = function(deviceIndex) { return miniaudio.devices[deviceIndex]; }; miniaudio.unlock_event_types = (function(){ return ['touchend', 'click']; })(); miniaudio.unlock = function() { for(var i = 0; i < miniaudio.devices.length; ++i) { var device = miniaudio.devices[i]; if (device != null && device.webaudio != null && device.state === window.miniaudio.device_state.started) { device.webaudio.resume().then(() => { Module._ma_device__on_notification_unlocked(device.pDevice); }, (error) => {console.error("Failed to resume audiocontext", error); }); } } miniaudio.unlock_event_types.map(function(event_type) { document.removeEventListener(event_type, miniaudio.unlock, true); }); }; miniaudio.unlock_event_types.map(function(event_type) { document.addEventListener(event_type, miniaudio.unlock, true); }); } window.miniaudio.referenceCount += 1; return 1; }, + 718662: () => { if (typeof(window.miniaudio) !== 'undefined') { window.miniaudio.referenceCount -= 1; if (window.miniaudio.referenceCount === 0) { delete window.miniaudio; } } }, + 718826: () => { return (navigator.mediaDevices !== undefined && navigator.mediaDevices.getUserMedia !== undefined); }, + 718930: () => { try { var temp = new (window.AudioContext || window.webkitAudioContext)(); var sampleRate = temp.sampleRate; temp.close(); return sampleRate; } catch(e) { return 0; } }, + 719101: ($0, $1, $2, $3, $4, $5) => { var deviceType = $0; var channels = $1; var sampleRate = $2; var bufferSize = $3; var pIntermediaryBuffer = $4; var pDevice = $5; if (typeof(window.miniaudio) === 'undefined') { return -1; } var device = {}; var audioContextOptions = {}; if (deviceType == window.miniaudio.device_type.playback && sampleRate != 0) { audioContextOptions.sampleRate = sampleRate; } device.webaudio = new (window.AudioContext || window.webkitAudioContext)(audioContextOptions); device.webaudio.suspend(); device.state = window.miniaudio.device_state.stopped; var channelCountIn = 0; var channelCountOut = channels; if (deviceType != window.miniaudio.device_type.playback) { channelCountIn = channels; } device.scriptNode = device.webaudio.createScriptProcessor(bufferSize, channelCountIn, channelCountOut); device.scriptNode.onaudioprocess = function(e) { if (device.intermediaryBufferView == null || device.intermediaryBufferView.length == 0) { device.intermediaryBufferView = new Float32Array(Module.HEAPF32.buffer, pIntermediaryBuffer, bufferSize * channels); } if (deviceType == miniaudio.device_type.capture || deviceType == miniaudio.device_type.duplex) { for (var iChannel = 0; iChannel < channels; iChannel += 1) { var inputBuffer = e.inputBuffer.getChannelData(iChannel); var intermediaryBuffer = device.intermediaryBufferView; for (var iFrame = 0; iFrame < bufferSize; iFrame += 1) { intermediaryBuffer[iFrame*channels + iChannel] = inputBuffer[iFrame]; } } _ma_device_process_pcm_frames_capture__webaudio(pDevice, bufferSize, pIntermediaryBuffer); } if (deviceType == miniaudio.device_type.playback || deviceType == miniaudio.device_type.duplex) { _ma_device_process_pcm_frames_playback__webaudio(pDevice, bufferSize, pIntermediaryBuffer); for (var iChannel = 0; iChannel < e.outputBuffer.numberOfChannels; ++iChannel) { var outputBuffer = e.outputBuffer.getChannelData(iChannel); var intermediaryBuffer = device.intermediaryBufferView; for (var iFrame = 0; iFrame < bufferSize; iFrame += 1) { outputBuffer[iFrame] = intermediaryBuffer[iFrame*channels + iChannel]; } } } else { for (var iChannel = 0; iChannel < e.outputBuffer.numberOfChannels; ++iChannel) { e.outputBuffer.getChannelData(iChannel).fill(0.0); } } }; if (deviceType == miniaudio.device_type.capture || deviceType == miniaudio.device_type.duplex) { navigator.mediaDevices.getUserMedia({audio:true, video:false}) .then(function(stream) { device.streamNode = device.webaudio.createMediaStreamSource(stream); device.streamNode.connect(device.scriptNode); device.scriptNode.connect(device.webaudio.destination); }) .catch(function(error) { console.log("Failed to get user media: " + error); }); } if (deviceType == miniaudio.device_type.playback) { device.scriptNode.connect(device.webaudio.destination); } device.pDevice = pDevice; return miniaudio.track_device(device); }, + 721929: ($0) => { return miniaudio.get_device_by_index($0).webaudio.sampleRate; }, + 721995: ($0) => { var device = miniaudio.get_device_by_index($0); if (device.scriptNode !== undefined) { device.scriptNode.onaudioprocess = function(e) {}; device.scriptNode.disconnect(); device.scriptNode = undefined; } if (device.streamNode !== undefined) { device.streamNode.disconnect(); device.streamNode = undefined; } device.webaudio.close(); device.webaudio = undefined; device.pDevice = undefined; }, + 722388: ($0) => { miniaudio.untrack_device_by_index($0); }, + 722431: ($0) => { var device = miniaudio.get_device_by_index($0); device.webaudio.resume(); device.state = miniaudio.device_state.started; }, + 722556: ($0) => { var device = miniaudio.get_device_by_index($0); device.webaudio.suspend(); device.state = miniaudio.device_state.stopped; } +}; + +// Imports from the Wasm binary. +var _default_context_ptr = Module['_default_context_ptr'] = makeInvalidEarlyAccess('_default_context_ptr'); +var _main_start = Module['_main_start'] = makeInvalidEarlyAccess('_main_start'); +var __start = Module['__start'] = makeInvalidEarlyAccess('__start'); +var __end = Module['__end'] = makeInvalidEarlyAccess('__end'); +var _main_update = Module['_main_update'] = makeInvalidEarlyAccess('_main_update'); +var _main_end = Module['_main_end'] = makeInvalidEarlyAccess('_main_end'); +var _web_window_size_changed = Module['_web_window_size_changed'] = makeInvalidEarlyAccess('_web_window_size_changed'); +var _malloc = makeInvalidEarlyAccess('_malloc'); +var _free = makeInvalidEarlyAccess('_free'); +var _fflush = makeInvalidEarlyAccess('_fflush'); +var _ma_device__on_notification_unlocked = Module['_ma_device__on_notification_unlocked'] = makeInvalidEarlyAccess('_ma_device__on_notification_unlocked'); +var _ma_malloc_emscripten = Module['_ma_malloc_emscripten'] = makeInvalidEarlyAccess('_ma_malloc_emscripten'); +var _ma_free_emscripten = Module['_ma_free_emscripten'] = makeInvalidEarlyAccess('_ma_free_emscripten'); +var _ma_device_process_pcm_frames_capture__webaudio = Module['_ma_device_process_pcm_frames_capture__webaudio'] = makeInvalidEarlyAccess('_ma_device_process_pcm_frames_capture__webaudio'); +var _ma_device_process_pcm_frames_playback__webaudio = Module['_ma_device_process_pcm_frames_playback__webaudio'] = makeInvalidEarlyAccess('_ma_device_process_pcm_frames_playback__webaudio'); +var _emscripten_stack_get_end = makeInvalidEarlyAccess('_emscripten_stack_get_end'); +var _emscripten_stack_get_base = makeInvalidEarlyAccess('_emscripten_stack_get_base'); +var _strerror = makeInvalidEarlyAccess('_strerror'); +var _emscripten_stack_init = makeInvalidEarlyAccess('_emscripten_stack_init'); +var _emscripten_stack_get_free = makeInvalidEarlyAccess('_emscripten_stack_get_free'); +var __emscripten_stack_restore = makeInvalidEarlyAccess('__emscripten_stack_restore'); +var __emscripten_stack_alloc = makeInvalidEarlyAccess('__emscripten_stack_alloc'); +var _emscripten_stack_get_current = makeInvalidEarlyAccess('_emscripten_stack_get_current'); +var memory = makeInvalidEarlyAccess('memory'); +var __indirect_function_table = makeInvalidEarlyAccess('__indirect_function_table'); +var wasmMemory = makeInvalidEarlyAccess('wasmMemory'); +var wasmTable = makeInvalidEarlyAccess('wasmTable'); + +function assignWasmExports(wasmExports) { + assert(typeof wasmExports['default_context_ptr'] != 'undefined', 'missing Wasm export: default_context_ptr'); + assert(typeof wasmExports['main_start'] != 'undefined', 'missing Wasm export: main_start'); + assert(typeof wasmExports['_start'] != 'undefined', 'missing Wasm export: _start'); + assert(typeof wasmExports['_end'] != 'undefined', 'missing Wasm export: _end'); + assert(typeof wasmExports['main_update'] != 'undefined', 'missing Wasm export: main_update'); + assert(typeof wasmExports['main_end'] != 'undefined', 'missing Wasm export: main_end'); + assert(typeof wasmExports['web_window_size_changed'] != 'undefined', 'missing Wasm export: web_window_size_changed'); + assert(typeof wasmExports['malloc'] != 'undefined', 'missing Wasm export: malloc'); + assert(typeof wasmExports['free'] != 'undefined', 'missing Wasm export: free'); + assert(typeof wasmExports['fflush'] != 'undefined', 'missing Wasm export: fflush'); + assert(typeof wasmExports['ma_device__on_notification_unlocked'] != 'undefined', 'missing Wasm export: ma_device__on_notification_unlocked'); + assert(typeof wasmExports['ma_malloc_emscripten'] != 'undefined', 'missing Wasm export: ma_malloc_emscripten'); + assert(typeof wasmExports['ma_free_emscripten'] != 'undefined', 'missing Wasm export: ma_free_emscripten'); + assert(typeof wasmExports['ma_device_process_pcm_frames_capture__webaudio'] != 'undefined', 'missing Wasm export: ma_device_process_pcm_frames_capture__webaudio'); + assert(typeof wasmExports['ma_device_process_pcm_frames_playback__webaudio'] != 'undefined', 'missing Wasm export: ma_device_process_pcm_frames_playback__webaudio'); + assert(typeof wasmExports['emscripten_stack_get_end'] != 'undefined', 'missing Wasm export: emscripten_stack_get_end'); + assert(typeof wasmExports['emscripten_stack_get_base'] != 'undefined', 'missing Wasm export: emscripten_stack_get_base'); + assert(typeof wasmExports['strerror'] != 'undefined', 'missing Wasm export: strerror'); + assert(typeof wasmExports['emscripten_stack_init'] != 'undefined', 'missing Wasm export: emscripten_stack_init'); + assert(typeof wasmExports['emscripten_stack_get_free'] != 'undefined', 'missing Wasm export: emscripten_stack_get_free'); + assert(typeof wasmExports['_emscripten_stack_restore'] != 'undefined', 'missing Wasm export: _emscripten_stack_restore'); + assert(typeof wasmExports['_emscripten_stack_alloc'] != 'undefined', 'missing Wasm export: _emscripten_stack_alloc'); + assert(typeof wasmExports['emscripten_stack_get_current'] != 'undefined', 'missing Wasm export: emscripten_stack_get_current'); + assert(typeof wasmExports['memory'] != 'undefined', 'missing Wasm export: memory'); + assert(typeof wasmExports['__indirect_function_table'] != 'undefined', 'missing Wasm export: __indirect_function_table'); + _default_context_ptr = Module['_default_context_ptr'] = createExportWrapper('default_context_ptr', 0); + _main_start = Module['_main_start'] = createExportWrapper('main_start', 0); + __start = Module['__start'] = createExportWrapper('_start', 0); + __end = Module['__end'] = createExportWrapper('_end', 0); + _main_update = Module['_main_update'] = createExportWrapper('main_update', 0); + _main_end = Module['_main_end'] = createExportWrapper('main_end', 0); + _web_window_size_changed = Module['_web_window_size_changed'] = createExportWrapper('web_window_size_changed', 2); + _malloc = createExportWrapper('malloc', 1); + _free = createExportWrapper('free', 1); + _fflush = createExportWrapper('fflush', 1); + _ma_device__on_notification_unlocked = Module['_ma_device__on_notification_unlocked'] = createExportWrapper('ma_device__on_notification_unlocked', 1); + _ma_malloc_emscripten = Module['_ma_malloc_emscripten'] = createExportWrapper('ma_malloc_emscripten', 2); + _ma_free_emscripten = Module['_ma_free_emscripten'] = createExportWrapper('ma_free_emscripten', 2); + _ma_device_process_pcm_frames_capture__webaudio = Module['_ma_device_process_pcm_frames_capture__webaudio'] = createExportWrapper('ma_device_process_pcm_frames_capture__webaudio', 3); + _ma_device_process_pcm_frames_playback__webaudio = Module['_ma_device_process_pcm_frames_playback__webaudio'] = createExportWrapper('ma_device_process_pcm_frames_playback__webaudio', 3); + _emscripten_stack_get_end = wasmExports['emscripten_stack_get_end']; + _emscripten_stack_get_base = wasmExports['emscripten_stack_get_base']; + _strerror = createExportWrapper('strerror', 1); + _emscripten_stack_init = wasmExports['emscripten_stack_init']; + _emscripten_stack_get_free = wasmExports['emscripten_stack_get_free']; + __emscripten_stack_restore = wasmExports['_emscripten_stack_restore']; + __emscripten_stack_alloc = wasmExports['_emscripten_stack_alloc']; + _emscripten_stack_get_current = wasmExports['emscripten_stack_get_current']; + memory = wasmMemory = wasmExports['memory']; + __indirect_function_table = wasmTable = wasmExports['__indirect_function_table']; +} + +var wasmImports = { + /** @export */ + __assert_fail: ___assert_fail, + /** @export */ + __syscall_faccessat: ___syscall_faccessat, + /** @export */ + __syscall_fcntl64: ___syscall_fcntl64, + /** @export */ + __syscall_getcwd: ___syscall_getcwd, + /** @export */ + __syscall_ioctl: ___syscall_ioctl, + /** @export */ + __syscall_openat: ___syscall_openat, + /** @export */ + _abort_js: __abort_js, + /** @export */ + clock_time_get: _clock_time_get, + /** @export */ + emscripten_asm_const_int: _emscripten_asm_const_int, + /** @export */ + emscripten_date_now: _emscripten_date_now, + /** @export */ + emscripten_get_element_css_size: _emscripten_get_element_css_size, + /** @export */ + emscripten_get_gamepad_status: _emscripten_get_gamepad_status, + /** @export */ + emscripten_get_now: _emscripten_get_now, + /** @export */ + emscripten_get_num_gamepads: _emscripten_get_num_gamepads, + /** @export */ + emscripten_glActiveTexture: _emscripten_glActiveTexture, + /** @export */ + emscripten_glAttachShader: _emscripten_glAttachShader, + /** @export */ + emscripten_glBeginQueryEXT: _emscripten_glBeginQueryEXT, + /** @export */ + emscripten_glBindAttribLocation: _emscripten_glBindAttribLocation, + /** @export */ + emscripten_glBindBuffer: _emscripten_glBindBuffer, + /** @export */ + emscripten_glBindFramebuffer: _emscripten_glBindFramebuffer, + /** @export */ + emscripten_glBindRenderbuffer: _emscripten_glBindRenderbuffer, + /** @export */ + emscripten_glBindTexture: _emscripten_glBindTexture, + /** @export */ + emscripten_glBindVertexArrayOES: _emscripten_glBindVertexArrayOES, + /** @export */ + emscripten_glBlendColor: _emscripten_glBlendColor, + /** @export */ + emscripten_glBlendEquation: _emscripten_glBlendEquation, + /** @export */ + emscripten_glBlendEquationSeparate: _emscripten_glBlendEquationSeparate, + /** @export */ + emscripten_glBlendFunc: _emscripten_glBlendFunc, + /** @export */ + emscripten_glBlendFuncSeparate: _emscripten_glBlendFuncSeparate, + /** @export */ + emscripten_glBufferData: _emscripten_glBufferData, + /** @export */ + emscripten_glBufferSubData: _emscripten_glBufferSubData, + /** @export */ + emscripten_glCheckFramebufferStatus: _emscripten_glCheckFramebufferStatus, + /** @export */ + emscripten_glClear: _emscripten_glClear, + /** @export */ + emscripten_glClearColor: _emscripten_glClearColor, + /** @export */ + emscripten_glClearDepthf: _emscripten_glClearDepthf, + /** @export */ + emscripten_glClearStencil: _emscripten_glClearStencil, + /** @export */ + emscripten_glClipControlEXT: _emscripten_glClipControlEXT, + /** @export */ + emscripten_glColorMask: _emscripten_glColorMask, + /** @export */ + emscripten_glCompileShader: _emscripten_glCompileShader, + /** @export */ + emscripten_glCompressedTexImage2D: _emscripten_glCompressedTexImage2D, + /** @export */ + emscripten_glCompressedTexSubImage2D: _emscripten_glCompressedTexSubImage2D, + /** @export */ + emscripten_glCopyTexImage2D: _emscripten_glCopyTexImage2D, + /** @export */ + emscripten_glCopyTexSubImage2D: _emscripten_glCopyTexSubImage2D, + /** @export */ + emscripten_glCreateProgram: _emscripten_glCreateProgram, + /** @export */ + emscripten_glCreateShader: _emscripten_glCreateShader, + /** @export */ + emscripten_glCullFace: _emscripten_glCullFace, + /** @export */ + emscripten_glDeleteBuffers: _emscripten_glDeleteBuffers, + /** @export */ + emscripten_glDeleteFramebuffers: _emscripten_glDeleteFramebuffers, + /** @export */ + emscripten_glDeleteProgram: _emscripten_glDeleteProgram, + /** @export */ + emscripten_glDeleteQueriesEXT: _emscripten_glDeleteQueriesEXT, + /** @export */ + emscripten_glDeleteRenderbuffers: _emscripten_glDeleteRenderbuffers, + /** @export */ + emscripten_glDeleteShader: _emscripten_glDeleteShader, + /** @export */ + emscripten_glDeleteTextures: _emscripten_glDeleteTextures, + /** @export */ + emscripten_glDeleteVertexArraysOES: _emscripten_glDeleteVertexArraysOES, + /** @export */ + emscripten_glDepthFunc: _emscripten_glDepthFunc, + /** @export */ + emscripten_glDepthMask: _emscripten_glDepthMask, + /** @export */ + emscripten_glDepthRangef: _emscripten_glDepthRangef, + /** @export */ + emscripten_glDetachShader: _emscripten_glDetachShader, + /** @export */ + emscripten_glDisable: _emscripten_glDisable, + /** @export */ + emscripten_glDisableVertexAttribArray: _emscripten_glDisableVertexAttribArray, + /** @export */ + emscripten_glDrawArrays: _emscripten_glDrawArrays, + /** @export */ + emscripten_glDrawArraysInstancedANGLE: _emscripten_glDrawArraysInstancedANGLE, + /** @export */ + emscripten_glDrawBuffersWEBGL: _emscripten_glDrawBuffersWEBGL, + /** @export */ + emscripten_glDrawElements: _emscripten_glDrawElements, + /** @export */ + emscripten_glDrawElementsInstancedANGLE: _emscripten_glDrawElementsInstancedANGLE, + /** @export */ + emscripten_glEnable: _emscripten_glEnable, + /** @export */ + emscripten_glEnableVertexAttribArray: _emscripten_glEnableVertexAttribArray, + /** @export */ + emscripten_glEndQueryEXT: _emscripten_glEndQueryEXT, + /** @export */ + emscripten_glFinish: _emscripten_glFinish, + /** @export */ + emscripten_glFlush: _emscripten_glFlush, + /** @export */ + emscripten_glFramebufferRenderbuffer: _emscripten_glFramebufferRenderbuffer, + /** @export */ + emscripten_glFramebufferTexture2D: _emscripten_glFramebufferTexture2D, + /** @export */ + emscripten_glFrontFace: _emscripten_glFrontFace, + /** @export */ + emscripten_glGenBuffers: _emscripten_glGenBuffers, + /** @export */ + emscripten_glGenFramebuffers: _emscripten_glGenFramebuffers, + /** @export */ + emscripten_glGenQueriesEXT: _emscripten_glGenQueriesEXT, + /** @export */ + emscripten_glGenRenderbuffers: _emscripten_glGenRenderbuffers, + /** @export */ + emscripten_glGenTextures: _emscripten_glGenTextures, + /** @export */ + emscripten_glGenVertexArraysOES: _emscripten_glGenVertexArraysOES, + /** @export */ + emscripten_glGenerateMipmap: _emscripten_glGenerateMipmap, + /** @export */ + emscripten_glGetActiveAttrib: _emscripten_glGetActiveAttrib, + /** @export */ + emscripten_glGetActiveUniform: _emscripten_glGetActiveUniform, + /** @export */ + emscripten_glGetAttachedShaders: _emscripten_glGetAttachedShaders, + /** @export */ + emscripten_glGetAttribLocation: _emscripten_glGetAttribLocation, + /** @export */ + emscripten_glGetBooleanv: _emscripten_glGetBooleanv, + /** @export */ + emscripten_glGetBufferParameteriv: _emscripten_glGetBufferParameteriv, + /** @export */ + emscripten_glGetError: _emscripten_glGetError, + /** @export */ + emscripten_glGetFloatv: _emscripten_glGetFloatv, + /** @export */ + emscripten_glGetFramebufferAttachmentParameteriv: _emscripten_glGetFramebufferAttachmentParameteriv, + /** @export */ + emscripten_glGetIntegerv: _emscripten_glGetIntegerv, + /** @export */ + emscripten_glGetProgramInfoLog: _emscripten_glGetProgramInfoLog, + /** @export */ + emscripten_glGetProgramiv: _emscripten_glGetProgramiv, + /** @export */ + emscripten_glGetQueryObjecti64vEXT: _emscripten_glGetQueryObjecti64vEXT, + /** @export */ + emscripten_glGetQueryObjectivEXT: _emscripten_glGetQueryObjectivEXT, + /** @export */ + emscripten_glGetQueryObjectui64vEXT: _emscripten_glGetQueryObjectui64vEXT, + /** @export */ + emscripten_glGetQueryObjectuivEXT: _emscripten_glGetQueryObjectuivEXT, + /** @export */ + emscripten_glGetQueryivEXT: _emscripten_glGetQueryivEXT, + /** @export */ + emscripten_glGetRenderbufferParameteriv: _emscripten_glGetRenderbufferParameteriv, + /** @export */ + emscripten_glGetShaderInfoLog: _emscripten_glGetShaderInfoLog, + /** @export */ + emscripten_glGetShaderPrecisionFormat: _emscripten_glGetShaderPrecisionFormat, + /** @export */ + emscripten_glGetShaderSource: _emscripten_glGetShaderSource, + /** @export */ + emscripten_glGetShaderiv: _emscripten_glGetShaderiv, + /** @export */ + emscripten_glGetString: _emscripten_glGetString, + /** @export */ + emscripten_glGetTexParameterfv: _emscripten_glGetTexParameterfv, + /** @export */ + emscripten_glGetTexParameteriv: _emscripten_glGetTexParameteriv, + /** @export */ + emscripten_glGetUniformLocation: _emscripten_glGetUniformLocation, + /** @export */ + emscripten_glGetUniformfv: _emscripten_glGetUniformfv, + /** @export */ + emscripten_glGetUniformiv: _emscripten_glGetUniformiv, + /** @export */ + emscripten_glGetVertexAttribPointerv: _emscripten_glGetVertexAttribPointerv, + /** @export */ + emscripten_glGetVertexAttribfv: _emscripten_glGetVertexAttribfv, + /** @export */ + emscripten_glGetVertexAttribiv: _emscripten_glGetVertexAttribiv, + /** @export */ + emscripten_glHint: _emscripten_glHint, + /** @export */ + emscripten_glIsBuffer: _emscripten_glIsBuffer, + /** @export */ + emscripten_glIsEnabled: _emscripten_glIsEnabled, + /** @export */ + emscripten_glIsFramebuffer: _emscripten_glIsFramebuffer, + /** @export */ + emscripten_glIsProgram: _emscripten_glIsProgram, + /** @export */ + emscripten_glIsQueryEXT: _emscripten_glIsQueryEXT, + /** @export */ + emscripten_glIsRenderbuffer: _emscripten_glIsRenderbuffer, + /** @export */ + emscripten_glIsShader: _emscripten_glIsShader, + /** @export */ + emscripten_glIsTexture: _emscripten_glIsTexture, + /** @export */ + emscripten_glIsVertexArrayOES: _emscripten_glIsVertexArrayOES, + /** @export */ + emscripten_glLineWidth: _emscripten_glLineWidth, + /** @export */ + emscripten_glLinkProgram: _emscripten_glLinkProgram, + /** @export */ + emscripten_glPixelStorei: _emscripten_glPixelStorei, + /** @export */ + emscripten_glPolygonModeWEBGL: _emscripten_glPolygonModeWEBGL, + /** @export */ + emscripten_glPolygonOffset: _emscripten_glPolygonOffset, + /** @export */ + emscripten_glPolygonOffsetClampEXT: _emscripten_glPolygonOffsetClampEXT, + /** @export */ + emscripten_glQueryCounterEXT: _emscripten_glQueryCounterEXT, + /** @export */ + emscripten_glReadPixels: _emscripten_glReadPixels, + /** @export */ + emscripten_glReleaseShaderCompiler: _emscripten_glReleaseShaderCompiler, + /** @export */ + emscripten_glRenderbufferStorage: _emscripten_glRenderbufferStorage, + /** @export */ + emscripten_glSampleCoverage: _emscripten_glSampleCoverage, + /** @export */ + emscripten_glScissor: _emscripten_glScissor, + /** @export */ + emscripten_glShaderBinary: _emscripten_glShaderBinary, + /** @export */ + emscripten_glShaderSource: _emscripten_glShaderSource, + /** @export */ + emscripten_glStencilFunc: _emscripten_glStencilFunc, + /** @export */ + emscripten_glStencilFuncSeparate: _emscripten_glStencilFuncSeparate, + /** @export */ + emscripten_glStencilMask: _emscripten_glStencilMask, + /** @export */ + emscripten_glStencilMaskSeparate: _emscripten_glStencilMaskSeparate, + /** @export */ + emscripten_glStencilOp: _emscripten_glStencilOp, + /** @export */ + emscripten_glStencilOpSeparate: _emscripten_glStencilOpSeparate, + /** @export */ + emscripten_glTexImage2D: _emscripten_glTexImage2D, + /** @export */ + emscripten_glTexParameterf: _emscripten_glTexParameterf, + /** @export */ + emscripten_glTexParameterfv: _emscripten_glTexParameterfv, + /** @export */ + emscripten_glTexParameteri: _emscripten_glTexParameteri, + /** @export */ + emscripten_glTexParameteriv: _emscripten_glTexParameteriv, + /** @export */ + emscripten_glTexSubImage2D: _emscripten_glTexSubImage2D, + /** @export */ + emscripten_glUniform1f: _emscripten_glUniform1f, + /** @export */ + emscripten_glUniform1fv: _emscripten_glUniform1fv, + /** @export */ + emscripten_glUniform1i: _emscripten_glUniform1i, + /** @export */ + emscripten_glUniform1iv: _emscripten_glUniform1iv, + /** @export */ + emscripten_glUniform2f: _emscripten_glUniform2f, + /** @export */ + emscripten_glUniform2fv: _emscripten_glUniform2fv, + /** @export */ + emscripten_glUniform2i: _emscripten_glUniform2i, + /** @export */ + emscripten_glUniform2iv: _emscripten_glUniform2iv, + /** @export */ + emscripten_glUniform3f: _emscripten_glUniform3f, + /** @export */ + emscripten_glUniform3fv: _emscripten_glUniform3fv, + /** @export */ + emscripten_glUniform3i: _emscripten_glUniform3i, + /** @export */ + emscripten_glUniform3iv: _emscripten_glUniform3iv, + /** @export */ + emscripten_glUniform4f: _emscripten_glUniform4f, + /** @export */ + emscripten_glUniform4fv: _emscripten_glUniform4fv, + /** @export */ + emscripten_glUniform4i: _emscripten_glUniform4i, + /** @export */ + emscripten_glUniform4iv: _emscripten_glUniform4iv, + /** @export */ + emscripten_glUniformMatrix2fv: _emscripten_glUniformMatrix2fv, + /** @export */ + emscripten_glUniformMatrix3fv: _emscripten_glUniformMatrix3fv, + /** @export */ + emscripten_glUniformMatrix4fv: _emscripten_glUniformMatrix4fv, + /** @export */ + emscripten_glUseProgram: _emscripten_glUseProgram, + /** @export */ + emscripten_glValidateProgram: _emscripten_glValidateProgram, + /** @export */ + emscripten_glVertexAttrib1f: _emscripten_glVertexAttrib1f, + /** @export */ + emscripten_glVertexAttrib1fv: _emscripten_glVertexAttrib1fv, + /** @export */ + emscripten_glVertexAttrib2f: _emscripten_glVertexAttrib2f, + /** @export */ + emscripten_glVertexAttrib2fv: _emscripten_glVertexAttrib2fv, + /** @export */ + emscripten_glVertexAttrib3f: _emscripten_glVertexAttrib3f, + /** @export */ + emscripten_glVertexAttrib3fv: _emscripten_glVertexAttrib3fv, + /** @export */ + emscripten_glVertexAttrib4f: _emscripten_glVertexAttrib4f, + /** @export */ + emscripten_glVertexAttrib4fv: _emscripten_glVertexAttrib4fv, + /** @export */ + emscripten_glVertexAttribDivisorANGLE: _emscripten_glVertexAttribDivisorANGLE, + /** @export */ + emscripten_glVertexAttribPointer: _emscripten_glVertexAttribPointer, + /** @export */ + emscripten_glViewport: _emscripten_glViewport, + /** @export */ + emscripten_resize_heap: _emscripten_resize_heap, + /** @export */ + emscripten_run_script: _emscripten_run_script, + /** @export */ + emscripten_sample_gamepad_data: _emscripten_sample_gamepad_data, + /** @export */ + emscripten_set_canvas_element_size: _emscripten_set_canvas_element_size, + /** @export */ + emscripten_set_click_callback_on_thread: _emscripten_set_click_callback_on_thread, + /** @export */ + emscripten_set_fullscreenchange_callback_on_thread: _emscripten_set_fullscreenchange_callback_on_thread, + /** @export */ + emscripten_set_gamepadconnected_callback_on_thread: _emscripten_set_gamepadconnected_callback_on_thread, + /** @export */ + emscripten_set_gamepaddisconnected_callback_on_thread: _emscripten_set_gamepaddisconnected_callback_on_thread, + /** @export */ + emscripten_set_mousemove_callback_on_thread: _emscripten_set_mousemove_callback_on_thread, + /** @export */ + emscripten_set_pointerlockchange_callback_on_thread: _emscripten_set_pointerlockchange_callback_on_thread, + /** @export */ + emscripten_set_resize_callback_on_thread: _emscripten_set_resize_callback_on_thread, + /** @export */ + emscripten_set_touchcancel_callback_on_thread: _emscripten_set_touchcancel_callback_on_thread, + /** @export */ + emscripten_set_touchend_callback_on_thread: _emscripten_set_touchend_callback_on_thread, + /** @export */ + emscripten_set_touchmove_callback_on_thread: _emscripten_set_touchmove_callback_on_thread, + /** @export */ + emscripten_set_touchstart_callback_on_thread: _emscripten_set_touchstart_callback_on_thread, + /** @export */ + emscripten_set_window_title: _emscripten_set_window_title, + /** @export */ + exit: _exit, + /** @export */ + fd_close: _fd_close, + /** @export */ + fd_read: _fd_read, + /** @export */ + fd_seek: _fd_seek, + /** @export */ + fd_write: _fd_write, + /** @export */ + glActiveTexture: _glActiveTexture, + /** @export */ + glAttachShader: _glAttachShader, + /** @export */ + glBindAttribLocation: _glBindAttribLocation, + /** @export */ + glBindBuffer: _glBindBuffer, + /** @export */ + glBindTexture: _glBindTexture, + /** @export */ + glBlendFunc: _glBlendFunc, + /** @export */ + glBufferData: _glBufferData, + /** @export */ + glBufferSubData: _glBufferSubData, + /** @export */ + glClear: _glClear, + /** @export */ + glClearColor: _glClearColor, + /** @export */ + glClearDepthf: _glClearDepthf, + /** @export */ + glCompileShader: _glCompileShader, + /** @export */ + glCompressedTexImage2D: _glCompressedTexImage2D, + /** @export */ + glCreateProgram: _glCreateProgram, + /** @export */ + glCreateShader: _glCreateShader, + /** @export */ + glCullFace: _glCullFace, + /** @export */ + glDeleteBuffers: _glDeleteBuffers, + /** @export */ + glDeleteProgram: _glDeleteProgram, + /** @export */ + glDeleteShader: _glDeleteShader, + /** @export */ + glDeleteTextures: _glDeleteTextures, + /** @export */ + glDepthFunc: _glDepthFunc, + /** @export */ + glDetachShader: _glDetachShader, + /** @export */ + glDisable: _glDisable, + /** @export */ + glDisableVertexAttribArray: _glDisableVertexAttribArray, + /** @export */ + glDrawArrays: _glDrawArrays, + /** @export */ + glDrawElements: _glDrawElements, + /** @export */ + glEnable: _glEnable, + /** @export */ + glEnableVertexAttribArray: _glEnableVertexAttribArray, + /** @export */ + glFrontFace: _glFrontFace, + /** @export */ + glGenBuffers: _glGenBuffers, + /** @export */ + glGenTextures: _glGenTextures, + /** @export */ + glGetAttribLocation: _glGetAttribLocation, + /** @export */ + glGetFloatv: _glGetFloatv, + /** @export */ + glGetProgramInfoLog: _glGetProgramInfoLog, + /** @export */ + glGetProgramiv: _glGetProgramiv, + /** @export */ + glGetShaderInfoLog: _glGetShaderInfoLog, + /** @export */ + glGetShaderiv: _glGetShaderiv, + /** @export */ + glGetString: _glGetString, + /** @export */ + glGetUniformLocation: _glGetUniformLocation, + /** @export */ + glLinkProgram: _glLinkProgram, + /** @export */ + glPixelStorei: _glPixelStorei, + /** @export */ + glReadPixels: _glReadPixels, + /** @export */ + glScissor: _glScissor, + /** @export */ + glShaderSource: _glShaderSource, + /** @export */ + glTexImage2D: _glTexImage2D, + /** @export */ + glTexParameterf: _glTexParameterf, + /** @export */ + glTexParameteri: _glTexParameteri, + /** @export */ + glUniform1i: _glUniform1i, + /** @export */ + glUniform4f: _glUniform4f, + /** @export */ + glUniformMatrix4fv: _glUniformMatrix4fv, + /** @export */ + glUseProgram: _glUseProgram, + /** @export */ + glVertexAttribPointer: _glVertexAttribPointer, + /** @export */ + glViewport: _glViewport, + /** @export */ + glfwCreateWindow: _glfwCreateWindow, + /** @export */ + glfwDefaultWindowHints: _glfwDefaultWindowHints, + /** @export */ + glfwDestroyWindow: _glfwDestroyWindow, + /** @export */ + glfwGetPrimaryMonitor: _glfwGetPrimaryMonitor, + /** @export */ + glfwGetTime: _glfwGetTime, + /** @export */ + glfwGetVideoModes: _glfwGetVideoModes, + /** @export */ + glfwInit: _glfwInit, + /** @export */ + glfwMakeContextCurrent: _glfwMakeContextCurrent, + /** @export */ + glfwSetCharCallback: _glfwSetCharCallback, + /** @export */ + glfwSetCursorEnterCallback: _glfwSetCursorEnterCallback, + /** @export */ + glfwSetCursorPosCallback: _glfwSetCursorPosCallback, + /** @export */ + glfwSetDropCallback: _glfwSetDropCallback, + /** @export */ + glfwSetErrorCallback: _glfwSetErrorCallback, + /** @export */ + glfwSetKeyCallback: _glfwSetKeyCallback, + /** @export */ + glfwSetMouseButtonCallback: _glfwSetMouseButtonCallback, + /** @export */ + glfwSetScrollCallback: _glfwSetScrollCallback, + /** @export */ + glfwSetWindowContentScaleCallback: _glfwSetWindowContentScaleCallback, + /** @export */ + glfwSetWindowFocusCallback: _glfwSetWindowFocusCallback, + /** @export */ + glfwSetWindowIconifyCallback: _glfwSetWindowIconifyCallback, + /** @export */ + glfwSetWindowShouldClose: _glfwSetWindowShouldClose, + /** @export */ + glfwSetWindowSizeCallback: _glfwSetWindowSizeCallback, + /** @export */ + glfwSwapBuffers: _glfwSwapBuffers, + /** @export */ + glfwTerminate: _glfwTerminate, + /** @export */ + glfwWindowHint: _glfwWindowHint, + /** @export */ + rand_bytes: _rand_bytes, + /** @export */ + write: _write +}; + + +// include: postamble.js +// === Auto-generated postamble setup entry stuff === + +var calledRun; + +function stackCheckInit() { + // This is normally called automatically during __wasm_call_ctors but need to + // get these values before even running any of the ctors so we call it redundantly + // here. + _emscripten_stack_init(); + // TODO(sbc): Move writeStackCookie to native to to avoid this. + writeStackCookie(); +} + +function run() { + + if (runDependencies > 0) { + dependenciesFulfilled = run; + return; + } + + stackCheckInit(); + + preRun(); + + // a preRun added a dependency, run will be called later + if (runDependencies > 0) { + dependenciesFulfilled = run; + return; + } + + function doRun() { + // run may have just been called through dependencies being fulfilled just in this very frame, + // or while the async setStatus time below was happening + assert(!calledRun); + calledRun = true; + Module['calledRun'] = true; + + if (ABORT) return; + + initRuntime(); + + Module['onRuntimeInitialized']?.(); + consumedModuleProp('onRuntimeInitialized'); + + assert(!Module['_main'], 'compiled without a main, but one is present. if you added it from JS, use Module["onRuntimeInitialized"]'); + + postRun(); + } + + if (Module['setStatus']) { + Module['setStatus']('Running...'); + setTimeout(() => { + setTimeout(() => Module['setStatus'](''), 1); + doRun(); + }, 1); + } else + { + doRun(); + } + checkStackCookie(); +} + +function checkUnflushedContent() { + // Compiler settings do not allow exiting the runtime, so flushing + // the streams is not possible. but in ASSERTIONS mode we check + // if there was something to flush, and if so tell the user they + // should request that the runtime be exitable. + // Normally we would not even include flush() at all, but in ASSERTIONS + // builds we do so just for this check, and here we see if there is any + // content to flush, that is, we check if there would have been + // something a non-ASSERTIONS build would have not seen. + // How we flush the streams depends on whether we are in SYSCALLS_REQUIRE_FILESYSTEM=0 + // mode (which has its own special function for this; otherwise, all + // the code is inside libc) + var oldOut = out; + var oldErr = err; + var has = false; + out = err = (x) => { + has = true; + } + try { // it doesn't matter if it fails + _fflush(0); + // also flush in the JS FS layer + for (var name of ['stdout', 'stderr']) { + var info = FS.analyzePath('/dev/' + name); + if (!info) return; + var stream = info.object; + var rdev = stream.rdev; + var tty = TTY.ttys[rdev]; + if (tty?.output?.length) { + has = true; + } + } + } catch(e) {} + out = oldOut; + err = oldErr; + if (has) { + warnOnce('stdio streams had content in them that was not flushed. you should set EXIT_RUNTIME to 1 (see the Emscripten FAQ), or make sure to emit a newline when you printf etc.'); + } +} + +var wasmExports; + +// With async instantation wasmExports is assigned asynchronously when the +// instance is received. +createWasm(); + +run(); + +// end include: postamble.js + diff --git a/web/static/apps/sim/index.wasm b/web/static/apps/sim/index.wasm new file mode 100755 index 0000000000000000000000000000000000000000..98d9c759f6d7a51e7cda526554f7b06918d51e36 GIT binary patch literal 928383 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

undF3!Rw zV#r*-Y_+*%4OqiTzPL0q{w|@0%T&W~F z)ZQz|du3)=va&|zM;?lV(ft1w_54~Rzx-krYU+;Y=_V1Qbe zhK#!D&e+9FcW7RBS(|dm-K+84sAq(QZ{q*r(zSEszj{s;4Wo|5xmJE4#1c;f^Kg!n z91jApx;x}H6h_*mHmi~2q$I&<1Kl+5@mZ4!t8EzsU~Jy}k(N^0)I1lng>BV8*L4uG@)9{vuL zM1tB0XM_+f+|hCj^|&{EHK`(q*z%!2Q6_@X*g&S>@$gDsS+B-(<#IAQxLRx3Pa!Cs zIdxBOMJ&Ne>FKSzHR9>bFr0?m9(-2NTljj@$D=7pe#5=>bV8+OTF&I!z!)SLW2Hr- zPY9_#kcbIQVbt5NB(YDg##f?f*@^MUWF+nOuKVAG&ImXY2`aj-|KjHNG|YWELqri)kI%d?>Y;a*w57%Zq52Pt9_uT3V~c)pZ%GyhOId4as#ACc zaC07@Enr%Rx~I;m*z&lM@74IbIH3z*U1S=s^83i3-!@2&0w?Ca_FP+y$X?0s@ejLO zo)n<5PEV}3_$a6mwh4%`8F^FGT zKkdc!K>o?Id=Uhrn3^_i@q5F;vn% z@ylK4d`2!kQlN_&n7Blp$QZ@=|3F-#wlX$>{%$Yerd*=-YpN7;?tlNkwxl9ob_Tv| z>P6VgoiG{#WLH{m#sZ%puFz za@%UQ0F%$s@qmvogI~eSLalP%JmPN#A_K@~bWrV$#6W*DIPVtRMM3RNq>;X&mgbeL zf8pqtYmb7A!#ki?!^UD0{|-Jgw7XfA0l%89>`oO8^q;NXDu7k#Ay>0MI4j7KVdz>D zgs}qVx6WM9RX=Nf#Roi-#JW_p?tWo73zOS^5(-oG*Ni`@!kz9H2ST<%&$to|Xv|-9 z`Zr=5>A}1-V;86yQ|*d1uun zx!dpt>rdOZ_J$axZ#%iapo?VO_RI23!PV^`%S}Tk0KnQF0M@VP$_%t1ji{#iN1l0y z9KZf@-ndxi-;r5{`M;k4G)tb&{x}z4)}PAE1pV=ls5opSviVN7qkC**SnQ&9?rK=( z*B<`$eKLmTsNoTxqWDt2mn*q$X( zjDfub1dod9 z@Td;pQMBmmF-rQ98&gpF}}bUF6w7R;2<~ z&5S@+l|<40^90Wd=gVSECU0C^fJxLWwSTtTzRd>UHHY@YfjQ2B%e*-3-(mr$E);gE z#sTKM{=!gExqOLTqN}0FNH9~Q`Uo;L*Dc-HCV-a$CUtqVEv9Y|afSYKrRoF)1!U?f z>b%RSKrb?Swy9b<6`j^lc?n0|09rk_;CZ@LijiGpr)^ER?y9|<#cgDm74 zv5ONB>e>iHHvm;&ov8O#x8S&CCPzcmav6`1|UZcJZcj{=~0=w z0ppTeE-oIA#>v#pE#00F+Q?1ao`P-aG4MxZd74k_88^;*hHi4$kr?-!*a4D=62TW? zQ4XYtix;EuGIMh)x0i$-l9d}>vB-zR6+RqZQQ@za#%|?sXavDjj7pXGP$bzhzuJ?( zrs7_gEgS}6wd7R(hAcIOD|#aeZ#k^!E%^SnQiC9RTLy6*LJ|Fos(a?wdRf@Sr2-DU z8-W}u%c7L>dr)-aAuLJnm)`>jBJLXi5HVSPasG_HXEc&~jE0RbW}Xdj?JGFSUP z0`3z4_fX9wH(i?)kCXLVB6#U;4Bd+kkTl^9h>@j$$bgl(v&Mx+HS(?)tW1rn8%wHk$OSKRcm2f;HFAj*0C|;g zPn_T71%sIB4r0dc6&j}YG2c^5j!~Q^zdz0&@#LUs;_#qjXdbL5zrU6ob(1FtRKsrr zU>dpw^bDYyN9dME9Hu+Y1WD%X^LAp_OJ3Govg3m;opAMm$4^nK$D( z0AofC2_Rv3`ZiDB5!z)AaF|hR1duO0eV3(-c0dUDnzB-n%x0es6LsKaZ?=yG5x@Maok zuZJdlc+>speuiULX7KPZzX!zv;N@`ck4S*I08|+pj!ei6Xyr)ZQaS*x@ZlY;)8l-G z*LO?;=RvE0TRFB?pCafS=M@$(6)HTzD>yL$sRAg4iQDf_7ET2?N=GhG*D6;y>5o<)|k)xvYUf|&xPfIA`Vl;58x zcnVOI4&hMFO#q^d73?GmpiTgq%;LptRXE!#Jj*MbBgS7Sgb7fSlJRmw59ovnFCxpu zs_+u8U~U5Z1dK@skP>~OmpS<4GVU)IsszBtSimGy2zCTe$rZe~QWak56<*>MUL}@Z zEo=#hl6r-Nd-n=Ugb8P#UcvQ_Be|Y(fS6F>jU~pULs$}UCO1*x&8qO0#DI_7Lc&{B z;jLcb)n4Ik8Z+~S8?pJd3bhwa1twYGV3OODxnZHeBjtR5vuC_RNGb3lfJyGGWn?SJ zteejHR)m*72gQ33J+nIJwW`fZw%2;9NNJIQ!qIidiR z1N6qb6#brh>OJqNLc9UT0k}_C4WJygp#eYyBuRN!N){g~A<&Kwh3KfgiUsq4z>gsi zs0Xw1ClCm<<5Q>Wvjk{IDSANLvkoiBzpDW30B}(Dro4RloDR^#=X4MrKBs?~FsFm> z_);j383KEJoy-C0L3e&DxCbzg{la%iew&Y+?-M4yAB6M}#G(k>1y?3N5_LxlVQ*wF#f1L%iMO~=;Z9w0mlxCfk?u7k|H7}G#Ly44{cWd+5UK3u?#aD<>9 za{+$<^jK_60|bc$1UX7TkTRn*XU8}x$8v1SOb02)`Tg<2gMj&9OP&G*0ogG&oS4#y zpge$koWzThQ%F16NxRG2eo6{YfOnjdg72u;z*lox3aX>_)l4kW9RhVEf^~rCpj^-x zAUn?Ds01{}**Ny*R2cA`03Coe#tF|6h4WJI8sIsY=7i@cc3OZq$Z`R2idiY>93UKE z>{1XM8k2K`Appcdi5CgSQ6M;gZ;S`UL5Xuq5C`*`nscc)rx=r$iD6(l0CrqnZw_dX zawJjW8Gb04KkTiar{X|)%oEU~Y&}Qn#h|(}Ed~|P4+a;rpjZXw0|3Z101Nh*B4H?Te>XBuI{@1=* z?+bt&{-J~Ecp;qwpo8xnI0v^cr89tY0L_>a7Ny8=ulUnfc>1bP9CLtlAj7@xPhaQh z8>zj)Q*av;*k7=Xx43;0YHP>cew?SK|0k0CgXjQe~{+Sc|SY; zf-JR0KASdwt%WCm!{{G?VSJR9I1C*ueCqd~!hDBZ3{9Bc(ou;(7oab`NVg6DhOw?) z`ge-Xeo3J%c=KiY3&0ijRmw!)8~|7V<|q*s-=x|xfU0N^sv-eb!G<~o1mOuBQURV~ z-B<^jlQLx#dSY@0vSKJ1r(`?_OM%SBV@~t=Qv$#f{7uP*Cl&H2CHM&>HXby9xGB{M z==-J1ot}Y!0bS7{bVYL=UBR|H(~JtR;x#5bUW2M=5UK(U!%^9UaJ0Y|ARG1tSD}Q! zDHf%GDwyAdumD@Judo%zX8`*}~UQEGM0H?TAs0!{+&8C8? z03k6a0H8QMYkt}lNw0Zl0k9ChLWqhpv$Ds$0RS!N;V z;1b~>06rWlWWc zb%&6(YtgMza2ssX0|YEKBo(d?+}ac%>_O;z$P+&7EPj}Tk7V`` zzWRCdsI&O7%pQZf$3^)QnLVD_6HxwSW{+m!smz|@-P4(I|1^|8li4#RgcvY+?+7czS`vlqC3kvFg)8yj8{y65H0UdrrcUM$L(2p0)ilfUU>>=iNK)y!VW z?A00r0Hzfm4CghK@EVqecl@`1 z_?KS43(qopm)Gx!rSJRg``mtzQqs%_c?4vp{uV)1@v9qkC_~5 zX?(1G3Rg4xltzB0;y=&qv&=rHOTKXC{F@HV?BBfpQp9|f*_WAp#p|y#`y#Wi>6dRj z;kQoLw

7vu`r{jyK93kl`4D*QdYYNu80^jeJAMmxT0$JOpisrd{gJhN(N zRPD_As~>*&p<6hsY7Bt0DE;gztUjk|XIJeUNS;~MtaENv!{l6EpI5b+RXeY`Z#Z9t zUEpoIfP}L!d#Kth+BUmtvmJgl2T)hF90{NKXt}ToKQ6*7uWA?72>?#(rCdxYmw*Ci z;-Zwfm@;@NmtuTZ4VMAms$Lo{uiE9+LY`G8Osl$%8yS9H)#g=eLmnKF5BV#q#nOJI z+H_UbuB_TsRSX)c`Ik=4HPyTtuC3ZNSa{dTVN$Ew)m6I=a<2E*-{3iKp!GLa?fR==uK3g3V?pN{$ zs&;?X9^l1;8YvI@Ncq7V{7@C;!o%2NSMA|igB$ZB9KG~NHSZQ4t=c11d$jh>=2ydG zReOv!K3=uQYi%rs-4hxBPh#v=wI}NtZm))?s`eBap03){wG4%F?io?{Y}KB@MxmbJ zwvs=MxrOJd2msH~`OjDF`Rd?F{IAlhaYxWxd>f15FSZQbD66Y0Bh8PCo{@@ZiTry1 zZOmH>02}D8q~`6`Di#@#m*yX|qyW`vD#HuRP-P*}`@#{OtN?m7uIQe=LIaExmXFgu z&u&0vKooXsK6@(JDvd8jnXoUytkfO)N|37INPbMe@FNuu)4*8T{eK0+A@;BJfy4yvZX^0M=Je~gA&rhNe|36g+#l2x&?{>g?#H;aDr*9n@`9BFYVJ+(BiXwru zmJaj>sHMy1{c!mAY7&;u*A5<$6sJYY;T~z(65QLmD*YVt^};|+?1PMG6N;40^$Ir7 zR_F*T+F)C8^RNleHjctu`<;Lfj}T4 z1#<3Dj4H+xQKvh>ds`MbN<8*KP7!GpHa3-M_ARjcB`tlDgc}sJnm2NqbCGl32U$v(W9{^S<`SLWoyzI zYuVak!#b4Y0Y5szx};f`a`<|O^PLPIo+wtia~|8)^?Bq@^fEk2;o6K|kT;tRth=Q( zOz4KxOK4S)`TD8YhE&ad4mW!|Att0=C^RHbHpaD?=;Cq{C<6WzavN#+m@o>8YCiX% zXfr6XY8cJs=z_R0P%>tCvIbelVii1&+i^v}$FZ8|O`aaR;rzY}VdJd_(KG=*@v~0Y z5;C?dsM$hfj(0L?_Er?N)$n8pC2x(O@bi2KzWI9CHf`XYGMx0Obj7RfhL^rBrT;?3 z4gvYZ&nmc}YLE*mwe^=O{TJR&CLp381AroQ?HD3I$`d|Ls5-(9G;9YN=G`dGD2z?^ zkq>Xaceuw|lRvRg%iQlE>-Ve>f5_)YIH+0$9MtdJiMK+RL}es{hGI2quu8$_9c{;= z{%Y9CtJtYv;?A^d=i!Nfc)R2lcI9?g_u~yxDzja@sYMSf9Av$RcUK#Y0Fe9)7K93C zRe!}()$U;rIujP|NkMxKPx>QT>;?Y^iU1~hpYif`iDQfN^CsH`}rp8mf#*1IO3zoqMKiy@g z27FU#sGr8wJ zo=%oz(L(=REVf(>w<@H5ROh?My+nS3|2E>ovT(iGMN*}0O|$}si#_>KU>F~yI7p;rl3-tT2^NV(FFiP( zCQy;HKM>-+R@nz3g54e4JB3&7*AC9NYfhO~fc;0*?C&-eEtpy0I@nsrhXGXX-h(?3 z372E$Su7(WVd(GT;WAd)JFt2MAbx#9u+Xbgy{G*6al(IuE?d|hvY zr%Om`ZW>iLjX=QbWzE}$-W1)3a%2~w06I|L-TG+|_gJ+e3kg8cTA{IzC|u-nt+?=t z@&)L(Weif6ybBSU4o9WLuW(BncqJFrLX+1;<(TF>$iAI6q~&Odnh%-EV5T_=bmn`B z=Bav8;P<=f2MZPbNMJ^IRfKZBFfAmQjA$}%Mx0H{IF3cJ|AW2vfRm!i`u@ARd#0in^|8&2eB|+huXrH4IS{G3N*XgBbal}5flSP%vs;> z?^e~!uJwzmSp1t+;|L(|#s zzqnk@z*nT@j+Y#@rAI2WeNNo%q=qIuuCSpk*W~gIH+&6DsN`vKl?`X+VoUl&T!Zug zuox?z80UI|D>W>Ni)fo|PsFSZt=;jiy^jHNqjflu z772Lg3Ap&&Qi{)=H{siprH)}zn=1bX>vlY(j67X~pVl~$O73K9p5VGSe3He60*|=K z84;XX-!#`lCe#V8CoiPu@vfHw^~RLyeIn*;cU$`e*Qa6W?AtH6=UCU*dRgD&T|etL z5A&(dJU4*WwT|yv>+t#qV9?5N8ic9T-*F-ww9P?SNb6!D4RjmP!>oVZ>;C0=>K`={ zQD$#a#x&x3GaGE1l`)St{SC_RbirWm6r z#>luBTf5QGS~0@#AKh-Gu{)TVyTdUOO`9;2w&^LUu}^+K4%=jpn3Q_**?O`!w*Nj+ zSFDdk1oGjl>L$5W0O1^ zmFLm68z~>{4lCJVSQ&@9W61T-9Ki;}avYXg8KSfl(sBSNvHQcx@K>s59Mv

N(bJ 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ξ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

pS-ibbZQb#C*cff(k1(sJ+g7^f>%eZ8ZxoJ zHf0H%N#HE$*d<}v#P@#~`rVz+y*RnQwq*&NP2e0U+$BxQw!XJu)%v-6w@%?uMIU${ zf%i-AE;*oV{T<_mJT~czH|F%0Do)A=2%IZbyrf0hriJ%!`)uWwN%!^FHZFnl2z*c) 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 z%0D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�m~Rda;d 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

Dn4)aVlB=rq!`aaTSWhXUL0%rSX0dgmEX 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

$2SWnvm7&I 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�Z4(@3;XA7@nTb;kv8*iI>~@rqen=Pk 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 { + const newImports = { + ...odinImports, + ...imports + } + + return WebAssembly.instantiateStreaming(fetch("/web/static/apps/sim/index.wasm"), newImports).then(function(output) { + var e = output.instance.exports; + odinMemoryInterface.setExports(e); + odinMemoryInterface.setMemory(e.memory); + return successCallback(output.instance); + }); + }, + // This happens a bit after `instantiateWasm`, when everything is + // done setting up. At that point we can run code. + onRuntimeInitialized: () => { + var e = wasmExports; + + // Calls any procedure marked with @init + e._start(); + + // See source/main_web/main_web.odin for main_start, + // main_update and main_end. + e.main_start(); + + function send_resize() { + var canvas = document.getElementById('canvas'); + e.web_window_size_changed(canvas.width, canvas.height); + } + + window.addEventListener('resize', function(event) { + send_resize(); + }, true); + + // This can probably be done better: Ideally we'd feed the + // initial size to `main_start`. But there seems to be a + // race condition. `canvas` doesn't have it's correct size yet. + send_resize(); + + // Runs the "main loop". + function do_main_update() { + if (!e.main_update()) { + e.main_end(); + + // Calls procedures marked with @fini + e._end(); + return; + } + window.requestAnimationFrame(do_main_update); + } + + window.requestAnimationFrame(do_main_update); + }, + print: (function() { + var element = document.getElementById("output"); + if (element) element.value = ''; // clear browser cache + return function(text) { + if (arguments.length > 1) text = Array.prototype.slice.call(arguments).join(' '); + console.log(text); + if (element) { + element.value += text + "\n"; + element.scrollTop = element.scrollHeight; // focus on bottom + } + }; + })(), + canvas: (function() { + return document.getElementById("canvas"); + })() +}; diff --git a/web/static/apps/sim/odin.js b/web/static/apps/sim/odin.js new file mode 100644 index 0000000..4d19916 --- /dev/null +++ b/web/static/apps/sim/odin.js @@ -0,0 +1,2284 @@ +"use strict"; + +(function() { + +function getElement(name) { + if (name) { + return document.getElementById(name); + } + return undefined; +} + +function stripNewline(str) { + return str.replace(/\n/, ' ') +} + +class WasmMemoryInterface { + constructor() { + this.memory = null; + this.exports = null; + this.listenerMap = new Map(); + + // Size (in bytes) of the integer type, should be 4 on `js_wasm32` and 8 on `js_wasm64p32` + this.intSize = 4; + } + + setIntSize(size) { + this.intSize = size; + } + + setMemory(memory) { + this.memory = memory; + } + + setExports(exports) { + this.exports = exports; + } + + get mem() { + return new DataView(this.memory.buffer); + } + + + loadF32Array(addr, len) { return new Float32Array(this.memory.buffer, addr, len); } + loadF64Array(addr, len) { return new Float64Array(this.memory.buffer, addr, len); } + loadU32Array(addr, len) { return new Uint32Array(this.memory.buffer, addr, len); } + loadI32Array(addr, len) { return new Int32Array(this.memory.buffer, addr, len); } + loadU16Array(addr, len) { return new Uint16Array(this.memory.buffer, addr, len); } + loadI16Array(addr, len) { return new Int16Array(this.memory.buffer, addr, len); } + loadU8Array(addr, len) { return new Uint8Array(this.memory.buffer, addr, len); } + loadI8Array(addr, len) { return new Int8Array(this.memory.buffer, addr, len); } + + + loadU8(addr) { return this.mem.getUint8 (addr); } + loadI8(addr) { return this.mem.getInt8 (addr); } + loadU16(addr) { return this.mem.getUint16 (addr, true); } + loadI16(addr) { return this.mem.getInt16 (addr, true); } + loadU32(addr) { return this.mem.getUint32 (addr, true); } + loadI32(addr) { return this.mem.getInt32 (addr, true); } + loadU64(addr) { + const lo = this.mem.getUint32(addr + 0, true); + const hi = this.mem.getUint32(addr + 4, true); + return lo + hi*4294967296; + }; + loadI64(addr) { + const lo = this.mem.getUint32(addr + 0, true); + const hi = this.mem.getInt32 (addr + 4, true); + return lo + hi*4294967296; + }; + loadF32(addr) { return this.mem.getFloat32(addr, true); } + loadF64(addr) { return this.mem.getFloat64(addr, true); } + loadInt(addr) { + if (this.intSize == 8) { + return this.loadI64(addr); + } else if (this.intSize == 4) { + return this.loadI32(addr); + } else { + throw new Error('Unhandled `intSize`, expected `4` or `8`'); + } + }; + loadUint(addr) { + if (this.intSize == 8) { + return this.loadU64(addr); + } else if (this.intSize == 4) { + return this.loadU32(addr); + } else { + throw new Error('Unhandled `intSize`, expected `4` or `8`'); + } + }; + loadPtr(addr) { return this.loadU32(addr); } + + loadB32(addr) { + return this.loadU32(addr) != 0; + } + + loadBytes(ptr, len) { + return new Uint8Array(this.memory.buffer, ptr, Number(len)); + } + + loadString(ptr, len) { + const bytes = this.loadBytes(ptr, Number(len)); + return new TextDecoder().decode(bytes); + } + + loadCstring(ptr) { + if (ptr == 0) { + return null; + } + let len = 0; + for (; this.mem.getUint8(ptr+len) != 0; len += 1) {} + return this.loadString(ptr, len); + } + + storeU8(addr, value) { this.mem.setUint8 (addr, value); } + storeI8(addr, value) { this.mem.setInt8 (addr, value); } + storeU16(addr, value) { this.mem.setUint16 (addr, value, true); } + storeI16(addr, value) { this.mem.setInt16 (addr, value, true); } + storeU32(addr, value) { this.mem.setUint32 (addr, value, true); } + storeI32(addr, value) { this.mem.setInt32 (addr, value, true); } + storeU64(addr, value) { + this.mem.setUint32(addr + 0, Number(value), true); + + let div = 4294967296; + if (typeof value == 'bigint') { + div = BigInt(div); + } + + this.mem.setUint32(addr + 4, Math.floor(Number(value / div)), true); + } + storeI64(addr, value) { + this.mem.setUint32(addr + 0, Number(value), true); + + let div = 4294967296; + if (typeof value == 'bigint') { + div = BigInt(div); + } + + this.mem.setInt32(addr + 4, Math.floor(Number(value / div)), true); + } + storeF32(addr, value) { this.mem.setFloat32(addr, value, true); } + storeF64(addr, value) { this.mem.setFloat64(addr, value, true); } + storeInt(addr, value) { + if (this.intSize == 8) { + this.storeI64(addr, value); + } else if (this.intSize == 4) { + this.storeI32(addr, value); + } else { + throw new Error('Unhandled `intSize`, expected `4` or `8`'); + } + } + storeUint(addr, value) { + if (this.intSize == 8) { + this.storeU64(addr, value); + } else if (this.intSize == 4) { + this.storeU32(addr, value); + } else { + throw new Error('Unhandled `intSize`, expected `4` or `8`'); + } + } + + // Returned length might not be the same as `value.length` if non-ascii strings are given. + storeString(addr, value) { + const src = new TextEncoder().encode(value); + const dst = new Uint8Array(this.memory.buffer, addr, src.length); + dst.set(src); + return src.length; + } +}; + +class WebGLInterface { + constructor(wasmMemoryInterface) { + this.wasmMemoryInterface = wasmMemoryInterface; + this.ctxElement = null; + this.ctx = null; + this.ctxVersion = 1.0; + this.counter = 1; + this.lastError = 0; + this.buffers = []; + this.mappedBuffers = {}; + this.programs = []; + this.framebuffers = []; + this.renderbuffers = []; + this.textures = []; + this.uniforms = []; + this.shaders = []; + this.vaos = []; + this.contexts = []; + this.currentContext = null; + this.offscreenCanvases = {}; + this.timerQueriesEXT = []; + this.queries = []; + this.samplers = []; + this.transformFeedbacks = []; + this.syncs = []; + this.programInfos = {}; + this.extensions = []; + } + + get mem() { + return this.wasmMemoryInterface + } + + setCurrentContext(element, contextSettings) { + if (!element) { + return false; + } + if (this.ctxElement == element) { + return true; + } + + contextSettings = contextSettings ?? {}; + this.ctx = element.getContext("webgl2", contextSettings) || element.getContext("webgl", contextSettings); + if (!this.ctx) { + return false; + } + this.ctxElement = element; + if (this.ctx.getParameter(0x1F02).indexOf("WebGL 2.0") !== -1) { + this.ctxVersion = 2.0; + } else { + this.ctxVersion = 1.0; + } + + this.extensions = this.ctx.getSupportedExtensions(); + + return true; + } + + assertWebGL2() { + if (this.ctxVersion < 2) { + throw new Error("WebGL2 procedure called in a canvas without a WebGL2 context"); + } + } + getNewId(table) { + for (var ret = this.counter++, i = table.length; i < ret; i++) { + table[i] = null; + } + return ret; + } + recordError(errorCode) { + this.lastError || (this.lastError = errorCode); + } + populateUniformTable(program) { + let p = this.programs[program]; + this.programInfos[program] = { + uniforms: {}, + maxUniformLength: 0, + maxAttributeLength: -1, + maxUniformBlockNameLength: -1, + }; + for (let ptable = this.programInfos[program], utable = ptable.uniforms, numUniforms = this.ctx.getProgramParameter(p, this.ctx.ACTIVE_UNIFORMS), i = 0; i < numUniforms; ++i) { + let u = this.ctx.getActiveUniform(p, i); + let name = u.name; + if (ptable.maxUniformLength = Math.max(ptable.maxUniformLength, name.length + 1), name.indexOf("]", name.length - 1) !== -1) { + name = name.slice(0, name.lastIndexOf("[")); + } + let loc = this.ctx.getUniformLocation(p, name); + if (loc !== null) { + let id = this.getNewId(this.uniforms); + utable[name] = [u.size, id], this.uniforms[id] = loc; + for (let j = 1; j < u.size; ++j) { + let n = name + "[" + j + "]"; + let loc = this.ctx.getUniformLocation(p, n); + let id = this.getNewId(this.uniforms); + this.uniforms[id] = loc; + } + } + } + } + getSource(shader, strings_ptr, strings_length) { + const stringSize = this.mem.intSize*2; + let source = ""; + for (let i = 0; i < strings_length; i++) { + let ptr = this.mem.loadPtr(strings_ptr + i*stringSize); + let len = this.mem.loadPtr(strings_ptr + i*stringSize + 4); + let str = this.mem.loadString(ptr, len); + source += str; + } + return source; + } + + loadTypedArrayFromTexelType(type, size, data) { + switch (type) { + case this.ctx.SHORT: return this.mem.loadI16Array(data, size/2); + case this.ctx.UNSIGNED_SHORT_5_5_5_1: + case this.ctx.UNSIGNED_SHORT_5_6_5: + case this.ctx.UNSIGNED_SHORT_4_4_4_4: + case this.ctx.UNSIGNED_SHORT: + case this.ctx.HALF_FLOAT: return this.mem.loadU16Array(data, size/2); + case this.ctx.FLOAT: return this.mem.loadF32Array(data, size/4); + case this.ctx.INT: return this.mem.loadI32Array(data, size/4) + case this.ctx.UNSIGNED_INT_24_8: + case this.ctx.UNSIGNED_INT_5_9_9_9_REV: + case this.ctx.UNSIGNED_INT_10F_11F_11F_REV: + case this.ctx.UNSIGNED_INT_2_10_10_10_REV: + case this.ctx.UNSIGNED_INT: return this.mem.loadU32Array(data, size/4) + case this.ctx.BYTE: return this.mem.loadI8Array(data, size); + case this.ctx.UNSIGNED_BYTE: return this.mem.loadU8Array(data, size); + case this.ctx.FLOAT_32_UNSIGNED_INT_24_8_REV: + throw new Error("Source data of type FLOAT_32_UNSIGNED_INT_24_8_REV must be null"); + } + + throw new Error(`Unsupported texture data type: 0x${type.toString(16)}`); + } + + getWebGL1Interface() { + return { + SetCurrentContextById: (name_ptr, name_len) => { + let name = this.mem.loadString(name_ptr, name_len); + let element = getElement(name); + return this.setCurrentContext(element, {alpha: true, antialias: true, depth: true, premultipliedAlpha: true}); + }, + CreateCurrentContextById: (name_ptr, name_len, attributes) => { + let name = this.mem.loadString(name_ptr, name_len); + let element = getElement(name); + + let contextSettings = { + alpha: !(attributes & (1<<0)), + antialias: !(attributes & (1<<1)), + depth: !(attributes & (1<<2)), + failIfMajorPerformanceCaveat: !!(attributes & (1<<3)), + premultipliedAlpha: !(attributes & (1<<4)), + preserveDrawingBuffer: !!(attributes & (1<<5)), + stencil: !!(attributes & (1<<6)), + desynchronized: !!(attributes & (1<<7)), + }; + + return this.setCurrentContext(element, contextSettings); + }, + GetCurrentContextAttributes: () => { + if (!this.ctx) { + return 0; + } + let attrs = this.ctx.getContextAttributes(); + let res = 0; + if (!attrs.alpha) res |= 1<<0; + if (!attrs.antialias) res |= 1<<1; + if (!attrs.depth) res |= 1<<2; + if (attrs.failIfMajorPerformanceCaveat) res |= 1<<3; + if (!attrs.premultipliedAlpha) res |= 1<<4; + if (attrs.preserveDrawingBuffer) res |= 1<<5; + if (attrs.stencil) res |= 1<<6; + if (attrs.desynchronized) res |= 1<<7; + return res; + }, + + DrawingBufferWidth: () => this.ctx.drawingBufferWidth, + DrawingBufferHeight: () => this.ctx.drawingBufferHeight, + + IsExtensionSupported: (name_ptr, name_len) => { + let name = this.mem.loadString(name_ptr, name_len); + let extensions = this.extensions; + return extensions.indexOf(name) !== -1 + }, + + GetSupportedExtensionFromIndex: (index, buf_ptr, buf_len, length_ptr) => { + let extensions = this.extensions; + if (index < 0 || index >= extensions.length) { + return false; + } + + let ext = extensions[index]; + const n = Math.min(buf_len, ext.length); + ext = ext.substring(0, n); + this.mem.loadBytes(buf_ptr, buf_len).set(new TextEncoder().encode(ext)); + + this.mem.storeInt(length_ptr, n); + + return true; + }, + + GetExtension: (name_ptr, name_len) => { + let name = this.mem.loadString(name_ptr, name_len); + this.ctx.getExtension(name); + }, + + GetError: () => { + let err = this.lastError; + this.recordError(0); + if (err) { + return err; + } + return this.ctx.getError(); + }, + + GetWebGLVersion: (major_ptr, minor_ptr) => { + let version = this.ctx.getParameter(0x1F02); + if (version.indexOf("WebGL 2.0") !== -1) { + this.mem.storeI32(major_ptr, 2); + this.mem.storeI32(minor_ptr, 0); + return; + } + + this.mem.storeI32(major_ptr, 1); + this.mem.storeI32(minor_ptr, 0); + }, + GetESVersion: (major_ptr, minor_ptr) => { + let version = this.ctx.getParameter(0x1F02); + if (version.indexOf("OpenGL ES 3.0") !== -1) { + this.mem.storeI32(major_ptr, 3); + this.mem.storeI32(minor_ptr, 0); + return; + } + + this.mem.storeI32(major_ptr, 2); + this.mem.storeI32(minor_ptr, 0); + }, + + + ActiveTexture: (x) => { + this.ctx.activeTexture(x); + }, + AttachShader: (program, shader) => { + this.ctx.attachShader(this.programs[program], this.shaders[shader]); + }, + BindAttribLocation: (program, index, name_ptr, name_len) => { + let name = this.mem.loadString(name_ptr, name_len); + this.ctx.bindAttribLocation(this.programs[program], index, name) + }, + BindBuffer: (target, buffer) => { + let bufferObj = buffer ? this.buffers[buffer] : null; + if (target == 35051) { + this.ctx.currentPixelPackBufferBinding = buffer; + } else { + if (target == 35052) { + this.ctx.currentPixelUnpackBufferBinding = buffer; + } + this.ctx.bindBuffer(target, bufferObj) + } + }, + BindFramebuffer: (target, framebuffer) => { + this.ctx.bindFramebuffer(target, framebuffer ? this.framebuffers[framebuffer] : null) + }, + BindTexture: (target, texture) => { + this.ctx.bindTexture(target, texture ? this.textures[texture] : null) + }, + BindRenderbuffer: (target, renderbuffer) => { + this.ctx.bindRenderbuffer(target, renderbuffer ? this.renderbuffers[renderbuffer] : null) + }, + BlendColor: (red, green, blue, alpha) => { + this.ctx.blendColor(red, green, blue, alpha); + }, + BlendEquation: (mode) => { + this.ctx.blendEquation(mode); + }, + BlendEquationSeparate: (modeRGB, modeAlpha) => { + this.ctx.blendEquationSeparate(modeRGB, modeAlpha); + }, + BlendFunc: (sfactor, dfactor) => { + this.ctx.blendFunc(sfactor, dfactor); + }, + BlendFuncSeparate: (srcRGB, dstRGB, srcAlpha, dstAlpha) => { + this.ctx.blendFuncSeparate(srcRGB, dstRGB, srcAlpha, dstAlpha); + }, + + + BufferData: (target, size, data, usage) => { + if (data) { + this.ctx.bufferData(target, this.mem.loadBytes(data, size), usage); + } else { + this.ctx.bufferData(target, size, usage); + } + }, + BufferSubData: (target, offset, size, data) => { + if (data) { + this.ctx.bufferSubData(target, offset, this.mem.loadBytes(data, size)); + } else { + this.ctx.bufferSubData(target, offset, null); + } + }, + + + Clear: (x) => { + this.ctx.clear(x); + }, + ClearColor: (r, g, b, a) => { + this.ctx.clearColor(r, g, b, a); + }, + ClearDepth: (x) => { + this.ctx.clearDepth(x); + }, + ClearStencil: (x) => { + this.ctx.clearStencil(x); + }, + ColorMask: (r, g, b, a) => { + this.ctx.colorMask(!!r, !!g, !!b, !!a); + }, + CompileShader: (shader) => { + this.ctx.compileShader(this.shaders[shader]); + }, + + + CompressedTexImage2D: (target, level, internalformat, width, height, border, imageSize, data) => { + if (data) { + this.ctx.compressedTexImage2D(target, level, internalformat, width, height, border, this.mem.loadBytes(data, imageSize)); + } else { + this.ctx.compressedTexImage2D(target, level, internalformat, width, height, border, null); + } + }, + CompressedTexSubImage2D: (target, level, xoffset, yoffset, width, height, format, imageSize, data) => { + if (data) { + this.ctx.compressedTexSubImage2D(target, level, xoffset, yoffset, width, height, format, this.mem.loadBytes(data, imageSize)); + } else { + this.ctx.compressedTexSubImage2D(target, level, xoffset, yoffset, width, height, format, null); + } + }, + + CopyTexImage2D: (target, level, internalformat, x, y, width, height, border) => { + this.ctx.copyTexImage2D(target, level, internalformat, x, y, width, height, border); + }, + CopyTexSubImage2D: (target, level, xoffset, yoffset, x, y, width, height) => { + this.ctx.copyTexSubImage2D(target, level, xoffset, yoffset, x, y, width, height); + }, + + + CreateBuffer: () => { + let buffer = this.ctx.createBuffer(); + if (!buffer) { + this.recordError(1282); + return 0; + } + let id = this.getNewId(this.buffers); + buffer.name = id + this.buffers[id] = buffer; + return id; + }, + CreateFramebuffer: () => { + let buffer = this.ctx.createFramebuffer(); + let id = this.getNewId(this.framebuffers); + buffer.name = id + this.framebuffers[id] = buffer; + return id; + }, + CreateProgram: () => { + let program = this.ctx.createProgram(); + let id = this.getNewId(this.programs); + program.name = id; + this.programs[id] = program; + return id; + }, + CreateRenderbuffer: () => { + let buffer = this.ctx.createRenderbuffer(); + let id = this.getNewId(this.renderbuffers); + buffer.name = id; + this.renderbuffers[id] = buffer; + return id; + }, + CreateShader: (shaderType) => { + let shader = this.ctx.createShader(shaderType); + let id = this.getNewId(this.shaders); + shader.name = id; + this.shaders[id] = shader; + return id; + }, + CreateTexture: () => { + let texture = this.ctx.createTexture(); + if (!texture) { + this.recordError(1282) + return 0; + } + let id = this.getNewId(this.textures); + texture.name = id; + this.textures[id] = texture; + return id; + }, + + + CullFace: (mode) => { + this.ctx.cullFace(mode); + }, + + + DeleteBuffer: (id) => { + let obj = this.buffers[id]; + if (obj && id != 0) { + this.ctx.deleteBuffer(obj); + this.buffers[id] = null; + } + }, + DeleteFramebuffer: (id) => { + let obj = this.framebuffers[id]; + if (obj && id != 0) { + this.ctx.deleteFramebuffer(obj); + this.framebuffers[id] = null; + } + }, + DeleteProgram: (id) => { + let obj = this.programs[id]; + if (obj && id != 0) { + this.ctx.deleteProgram(obj); + this.programs[id] = null; + } + }, + DeleteRenderbuffer: (id) => { + let obj = this.renderbuffers[id]; + if (obj && id != 0) { + this.ctx.deleteRenderbuffer(obj); + this.renderbuffers[id] = null; + } + }, + DeleteShader: (id) => { + let obj = this.shaders[id]; + if (obj && id != 0) { + this.ctx.deleteShader(obj); + this.shaders[id] = null; + } + }, + DeleteTexture: (id) => { + let obj = this.textures[id]; + if (obj && id != 0) { + this.ctx.deleteTexture(obj); + this.textures[id] = null; + } + }, + + + DepthFunc: (func) => { + this.ctx.depthFunc(func); + }, + DepthMask: (flag) => { + this.ctx.depthMask(!!flag); + }, + DepthRange: (zNear, zFar) => { + this.ctx.depthRange(zNear, zFar); + }, + DetachShader: (program, shader) => { + this.ctx.detachShader(this.programs[program], this.shaders[shader]); + }, + Disable: (cap) => { + this.ctx.disable(cap); + }, + DisableVertexAttribArray: (index) => { + this.ctx.disableVertexAttribArray(index); + }, + DrawArrays: (mode, first, count) => { + this.ctx.drawArrays(mode, first, count); + }, + DrawElements: (mode, count, type, indices) => { + this.ctx.drawElements(mode, count, type, indices); + }, + + + Enable: (cap) => { + this.ctx.enable(cap); + }, + EnableVertexAttribArray: (index) => { + this.ctx.enableVertexAttribArray(index); + }, + Finish: () => { + this.ctx.finish(); + }, + Flush: () => { + this.ctx.flush(); + }, + FramebufferRenderbuffer: (target, attachment, renderbuffertarget, renderbuffer) => { + this.ctx.framebufferRenderbuffer(target, attachment, renderbuffertarget, this.renderbuffers[renderbuffer]); + }, + FramebufferTexture2D: (target, attachment, textarget, texture, level) => { + this.ctx.framebufferTexture2D(target, attachment, textarget, this.textures[texture], level); + }, + CheckFramebufferStatus: (target) => { + return this.ctx.checkFramebufferStatus(target) + }, + FrontFace: (mode) => { + this.ctx.frontFace(mode); + }, + + + GenerateMipmap: (target) => { + this.ctx.generateMipmap(target); + }, + + GetBufferParameter: (target, pname) => { + return this.ctx.getBufferParameter(target, pname); + }, + + + GetActiveAttrib: (program, index, size_ptr, type_ptr, name_buf_ptr, name_buf_len, name_len_ptr) => { + const info = this.ctx.getActiveAttrib(this.programs[program], index); + + if (size_ptr) { + this.mem.storeInt(size_ptr, info.size); + } + + if (type_ptr) { + this.mem.storeI32(type_ptr, info.type); + } + + if (name_buf_ptr && name_buf_len > 0) { + let n = Math.min(name_buf_len, info.name.length); + let name = info.name.substring(0, n); + this.mem.loadBytes(name_buf_ptr, name_buf_len).set(new TextEncoder().encode(name)); + this.mem.storeInt(name_len_ptr, n); + } else if (name_len_ptr) { + this.mem.storeInt(name_len_ptr, info.name.length); + } + }, + + GetActiveUniform: (program, index, size_ptr, type_ptr, name_buf_ptr, name_buf_len, name_len_ptr) => { + let info = this.ctx.getActiveUniform(this.programs[program], index); + + if (size_ptr) { + this.mem.storeInt(size_ptr, info.size); + } + + if (type_ptr) { + this.mem.storeI32(type_ptr, info.type); + } + + if (name_buf_ptr && name_buf_len > 0) { + let n = Math.min(name_buf_len, info.name.length); + let name = info.name.substring(0, n); + this.mem.loadBytes(name_buf_ptr, name_buf_len).set(new TextEncoder().encode(name)); + this.mem.storeInt(name_len_ptr, n); + } else if (name_len_ptr) { + this.mem.storeInt(name_len_ptr, info.name.length); + } + }, + + GetAttribLocation: (program, name_ptr, name_len) => { + let name = this.mem.loadString(name_ptr, name_len); + return this.ctx.getAttribLocation(this.programs[program], name); + }, + + + GetParameter: (pname) => { + return this.ctx.getParameter(pname); + }, + GetParameter4i: (pname, v0, v1, v2, v3) => { + const i4 = this.ctx.getParameter(pname); + this.mem.storeI32(v0, i4[0]); + this.mem.storeI32(v1, i4[1]); + this.mem.storeI32(v2, i4[2]); + this.mem.storeI32(v3, i4[3]); + }, + GetProgramParameter: (program, pname) => { + return this.ctx.getProgramParameter(this.programs[program], pname) + }, + GetProgramInfoLog: (program, buf_ptr, buf_len, length_ptr) => { + let log = this.ctx.getProgramInfoLog(this.programs[program]); + if (log === null) { + log = "(unknown error)"; + } + if (buf_len > 0 && buf_ptr) { + let n = Math.min(buf_len, log.length); + log = log.substring(0, n); + this.mem.loadBytes(buf_ptr, buf_len).set(new TextEncoder().encode(log)) + + this.mem.storeInt(length_ptr, n); + } + }, + GetShaderInfoLog: (shader, buf_ptr, buf_len, length_ptr) => { + let log = this.ctx.getShaderInfoLog(this.shaders[shader]); + if (log === null) { + log = "(unknown error)"; + } + if (buf_len > 0 && buf_ptr) { + let n = Math.min(buf_len, log.length); + log = log.substring(0, n); + this.mem.loadBytes(buf_ptr, buf_len).set(new TextEncoder().encode(log)) + + this.mem.storeInt(length_ptr, n); + } + }, + GetShaderiv: (shader, pname, p) => { + if (p) { + if (pname == 35716) { + let log = this.ctx.getShaderInfoLog(this.shaders[shader]); + if (log === null) { + log = "(unknown error)"; + } + this.mem.storeInt(p, log.length+1); + } else if (pname == 35720) { + let source = this.ctx.getShaderSource(this.shaders[shader]); + let sourceLength = (source === null || source.length == 0) ? 0 : source.length+1; + this.mem.storeInt(p, sourceLength); + } else { + let param = this.ctx.getShaderParameter(this.shaders[shader], pname); + this.mem.storeI32(p, param); + } + } else { + this.recordError(1281); + } + }, + + + GetUniformLocation: (program, name_ptr, name_len) => { + let name = this.mem.loadString(name_ptr, name_len); + let arrayOffset = 0; + if (name.indexOf("]", name.length - 1) !== -1) { + let ls = name.lastIndexOf("["), + arrayIndex = name.slice(ls + 1, -1); + if (arrayIndex.length > 0 && (arrayOffset = parseInt(arrayIndex)) < 0) { + return -1; + } + name = name.slice(0, ls) + } + var ptable = this.programInfos[program]; + if (!ptable) { + return -1; + } + var uniformInfo = ptable.uniforms[name]; + return (uniformInfo && arrayOffset < uniformInfo[0]) ? uniformInfo[1] + arrayOffset : -1 + }, + + + GetVertexAttribOffset: (index, pname) => { + return this.ctx.getVertexAttribOffset(index, pname); + }, + + + Hint: (target, mode) => { + this.ctx.hint(target, mode); + }, + + + IsBuffer: (buffer) => this.ctx.isBuffer(this.buffers[buffer]), + IsEnabled: (cap) => this.ctx.isEnabled(cap), + IsFramebuffer: (framebuffer) => this.ctx.isFramebuffer(this.framebuffers[framebuffer]), + IsProgram: (program) => this.ctx.isProgram(this.programs[program]), + IsRenderbuffer: (renderbuffer) => this.ctx.isRenderbuffer(this.renderbuffers[renderbuffer]), + IsShader: (shader) => this.ctx.isShader(this.shaders[shader]), + IsTexture: (texture) => this.ctx.isTexture(this.textures[texture]), + + LineWidth: (width) => { + this.ctx.lineWidth(width); + }, + LinkProgram: (program) => { + this.ctx.linkProgram(this.programs[program]); + this.programInfos[program] = null; + this.populateUniformTable(program); + }, + PixelStorei: (pname, param) => { + this.ctx.pixelStorei(pname, param); + }, + PolygonOffset: (factor, units) => { + this.ctx.polygonOffset(factor, units); + }, + + + ReadnPixels: (x, y, width, height, format, type, bufSize, data) => { + this.ctx.readPixels(x, y, width, height, format, type, this.mem.loadBytes(data, bufSize)); + }, + RenderbufferStorage: (target, internalformat, width, height) => { + this.ctx.renderbufferStorage(target, internalformat, width, height); + }, + SampleCoverage: (value, invert) => { + this.ctx.sampleCoverage(value, !!invert); + }, + Scissor: (x, y, width, height) => { + this.ctx.scissor(x, y, width, height); + }, + ShaderSource: (shader, strings_ptr, strings_length) => { + let source = this.getSource(shader, strings_ptr, strings_length); + this.ctx.shaderSource(this.shaders[shader], source); + }, + + StencilFunc: (func, ref, mask) => { + this.ctx.stencilFunc(func, ref, mask); + }, + StencilFuncSeparate: (face, func, ref, mask) => { + this.ctx.stencilFuncSeparate(face, func, ref, mask); + }, + StencilMask: (mask) => { + this.ctx.stencilMask(mask); + }, + StencilMaskSeparate: (face, mask) => { + this.ctx.stencilMaskSeparate(face, mask); + }, + StencilOp: (fail, zfail, zpass) => { + this.ctx.stencilOp(fail, zfail, zpass); + }, + StencilOpSeparate: (face, fail, zfail, zpass) => { + this.ctx.stencilOpSeparate(face, fail, zfail, zpass); + }, + + + TexImage2D: (target, level, internalformat, width, height, border, format, type, size, data) => { + if (data) { + const texelData = this.loadTypedArrayFromTexelType(type, size, data); + this.ctx.texImage2D(target, level, internalformat, width, height, border, format, type, texelData); + } else { + this.ctx.texImage2D(target, level, internalformat, width, height, border, format, type, null); + } + }, + TexParameterf: (target, pname, param) => { + this.ctx.texParameterf(target, pname, param); + }, + TexParameteri: (target, pname, param) => { + this.ctx.texParameteri(target, pname, param); + }, + TexSubImage2D: (target, level, xoffset, yoffset, width, height, format, type, size, data) => { + const texelData = this.loadTypedArrayFromTexelType(type, size, data); + this.ctx.texSubImage2D(target, level, xoffset, yoffset, width, height, format, type, texelData); + }, + + + Uniform1f: (location, v0) => { this.ctx.uniform1f(this.uniforms[location], v0); }, + Uniform2f: (location, v0, v1) => { this.ctx.uniform2f(this.uniforms[location], v0, v1); }, + Uniform3f: (location, v0, v1, v2) => { this.ctx.uniform3f(this.uniforms[location], v0, v1, v2); }, + Uniform4f: (location, v0, v1, v2, v3) => { this.ctx.uniform4f(this.uniforms[location], v0, v1, v2, v3); }, + + Uniform1i: (location, v0) => { this.ctx.uniform1i(this.uniforms[location], v0); }, + Uniform2i: (location, v0, v1) => { this.ctx.uniform2i(this.uniforms[location], v0, v1); }, + Uniform3i: (location, v0, v1, v2) => { this.ctx.uniform3i(this.uniforms[location], v0, v1, v2); }, + Uniform4i: (location, v0, v1, v2, v3) => { this.ctx.uniform4i(this.uniforms[location], v0, v1, v2, v3); }, + + Uniform1fv: (location, count, addr) => { + let array = this.mem.loadF32Array(addr, 1*count); + this.ctx.uniform1fv(this.uniforms[location], array); + }, + Uniform2fv: (location, count, addr) => { + let array = this.mem.loadF32Array(addr, 2*count); + this.ctx.uniform2fv(this.uniforms[location], array); + }, + Uniform3fv: (location, count, addr) => { + let array = this.mem.loadF32Array(addr, 3*count); + this.ctx.uniform3fv(this.uniforms[location], array); + }, + Uniform4fv: (location, count, addr) => { + let array = this.mem.loadF32Array(addr, 4*count); + this.ctx.uniform4fv(this.uniforms[location], array); + }, + + Uniform1iv: (location, count, addr) => { + let array = this.mem.loadI32Array(addr, 1*count); + this.ctx.uniform1iv(this.uniforms[location], array); + }, + Uniform2iv: (location, count, addr) => { + let array = this.mem.loadI32Array(addr, 2*count); + this.ctx.uniform2iv(this.uniforms[location], array); + }, + Uniform3iv: (location, count, addr) => { + let array = this.mem.loadI32Array(addr, 3*count); + this.ctx.uniform3iv(this.uniforms[location], array); + }, + Uniform4iv: (location, count, addr) => { + let array = this.mem.loadI32Array(addr, 4*count); + this.ctx.uniform4iv(this.uniforms[location], array); + }, + + UniformMatrix2fv: (location, addr) => { + let array = this.mem.loadF32Array(addr, 2*2); + this.ctx.uniformMatrix2fv(this.uniforms[location], false, array); + }, + UniformMatrix3fv: (location, addr) => { + let array = this.mem.loadF32Array(addr, 3*3); + this.ctx.uniformMatrix3fv(this.uniforms[location], false, array); + }, + UniformMatrix4fv: (location, addr) => { + let array = this.mem.loadF32Array(addr, 4*4); + this.ctx.uniformMatrix4fv(this.uniforms[location], false, array); + }, + + UseProgram: (program) => { + if (program) this.ctx.useProgram(this.programs[program]); + }, + ValidateProgram: (program) => { + if (program) this.ctx.validateProgram(this.programs[program]); + }, + + + VertexAttrib1f: (index, x) => { + this.ctx.vertexAttrib1f(index, x); + }, + VertexAttrib2f: (index, x, y) => { + this.ctx.vertexAttrib2f(index, x, y); + }, + VertexAttrib3f: (index, x, y, z) => { + this.ctx.vertexAttrib3f(index, x, y, z); + }, + VertexAttrib4f: (index, x, y, z, w) => { + this.ctx.vertexAttrib4f(index, x, y, z, w); + }, + VertexAttribPointer: (index, size, type, normalized, stride, ptr) => { + this.ctx.vertexAttribPointer(index, size, type, !!normalized, stride, ptr); + }, + + Viewport: (x, y, w, h) => { + this.ctx.viewport(x, y, w, h); + }, + }; + } + + getWebGL2Interface() { + return { + /* Buffer objects */ + CopyBufferSubData: (readTarget, writeTarget, readOffset, writeOffset, size) => { + this.assertWebGL2(); + this.ctx.copyBufferSubData(readTarget, writeTarget, readOffset, writeOffset, size); + }, + GetBufferSubData: (target, srcByteOffset, dst_buffer_ptr, dst_buffer_len, dstOffset, length) => { + this.assertWebGL2(); + this.ctx.getBufferSubData(target, srcByteOffset, this.mem.loadBytes(dst_buffer_ptr, dst_buffer_len), dstOffset, length); + }, + + /* Framebuffer objects */ + BlitFramebuffer: (srcX0, srcY0, srcX1, srcY1, dstX0, dstY0, dstX1, dstY1, mask, filter) => { + this.assertWebGL2(); + this.ctx.blitFramebuffer(srcX0, srcY0, srcX1, srcY1, dstX0, dstY0, dstX1, dstY1, mask, filter); + }, + FramebufferTextureLayer: (target, attachment, texture, level, layer) => { + this.assertWebGL2(); + this.ctx.framebufferTextureLayer(target, attachment, this.textures[texture], level, layer); + }, + InvalidateFramebuffer: (target, attachments_ptr, attachments_len) => { + this.assertWebGL2(); + let attachments = this.mem.loadU32Array(attachments_ptr, attachments_len); + this.ctx.invalidateFramebuffer(target, attachments); + }, + InvalidateSubFramebuffer: (target, attachments_ptr, attachments_len, x, y, width, height) => { + this.assertWebGL2(); + let attachments = this.mem.loadU32Array(attachments_ptr, attachments_len); + this.ctx.invalidateSubFramebuffer(target, attachments, x, y, width, height); + }, + ReadBuffer: (src) => { + this.assertWebGL2(); + this.ctx.readBuffer(src); + }, + + /* Renderbuffer objects */ + RenderbufferStorageMultisample: (target, samples, internalformat, width, height) => { + this.assertWebGL2(); + this.ctx.renderbufferStorageMultisample(target, samples, internalformat, width, height); + }, + + /* Texture objects */ + TexStorage2D: (target, levels, internalformat, width, height) => { + this.assertWebGL2(); + this.ctx.texStorage2D(target, levels, internalformat, width, height); + }, + TexStorage3D: (target, levels, internalformat, width, height, depth) => { + this.assertWebGL2(); + this.ctx.texStorage3D(target, levels, internalformat, width, height, depth); + }, + TexImage3D: (target, level, internalformat, width, height, depth, border, format, type, size, data) => { + this.assertWebGL2(); + if (data) { + const texelData = this.loadTypedArrayFromTexelType(type, size, data); + this.ctx.texImage3D(target, level, internalformat, width, height, depth, border, format, type, texelData); + } else { + this.ctx.texImage3D(target, level, internalformat, width, height, depth, border, format, type, null); + } + }, + TexSubImage3D: (target, level, xoffset, yoffset, zoffset, width, height, depth, format, type, size, data) => { + this.assertWebGL2(); + const texelData = this.loadTypedArrayFromTexelType(type, size, data); + this.ctx.texSubImage3D(target, level, xoffset, yoffset, zoffset, width, height, depth, format, type, texelData); + }, + CompressedTexImage3D: (target, level, internalformat, width, height, depth, border, imageSize, data) => { + this.assertWebGL2(); + if (data) { + this.ctx.compressedTexImage3D(target, level, internalformat, width, height, depth, border, this.mem.loadBytes(data, imageSize)); + } else { + this.ctx.compressedTexImage3D(target, level, internalformat, width, height, depth, border, null); + } + }, + CompressedTexSubImage3D: (target, level, xoffset, yoffset, zoffset, width, height, depth, format, imageSize, data) => { + this.assertWebGL2(); + if (data) { + this.ctx.compressedTexSubImage3D(target, level, xoffset, yoffset, zoffset, width, height, depth, format, this.mem.loadBytes(data, imageSize)); + } else { + this.ctx.compressedTexSubImage3D(target, level, xoffset, yoffset, zoffset, width, height, depth, format, null); + } + }, + + CopyTexSubImage3D: (target, level, xoffset, yoffset, zoffset, x, y, width, height) => { + this.assertWebGL2(); + this.ctx.copyTexSubImage3D(target, level, xoffset, yoffset, zoffset, x, y, width, height); + }, + + /* Programs and shaders */ + GetFragDataLocation: (program, name_ptr, name_len) => { + this.assertWebGL2(); + return this.ctx.getFragDataLocation(this.programs[program], this.mem.loadString(name_ptr, name_len)); + }, + + /* Uniforms */ + Uniform1ui: (location, v0) => { + this.assertWebGL2(); + this.ctx.uniform1ui(this.uniforms[location], v0); + }, + Uniform2ui: (location, v0, v1) => { + this.assertWebGL2(); + this.ctx.uniform2ui(this.uniforms[location], v0, v1); + }, + Uniform3ui: (location, v0, v1, v2) => { + this.assertWebGL2(); + this.ctx.uniform3ui(this.uniforms[location], v0, v1, v2); + }, + Uniform4ui: (location, v0, v1, v2, v3) => { + this.assertWebGL2(); + this.ctx.uniform4ui(this.uniforms[location], v0, v1, v2, v3); + }, + + UniformMatrix3x2fv: (location, addr) => { + this.assertWebGL2(); + let array = this.mem.loadF32Array(addr, 3*2); + this.ctx.uniformMatrix3x2fv(this.uniforms[location], false, array); + }, + UniformMatrix4x2fv: (location, addr) => { + this.assertWebGL2(); + let array = this.mem.loadF32Array(addr, 4*2); + this.ctx.uniformMatrix4x2fv(this.uniforms[location], false, array); + }, + UniformMatrix2x3fv: (location, addr) => { + this.assertWebGL2(); + let array = this.mem.loadF32Array(addr, 2*3); + this.ctx.uniformMatrix2x3fv(this.uniforms[location], false, array); + }, + UniformMatrix4x3fv: (location, addr) => { + this.assertWebGL2(); + let array = this.mem.loadF32Array(addr, 4*3); + this.ctx.uniformMatrix4x3fv(this.uniforms[location], false, array); + }, + UniformMatrix2x4fv: (location, addr) => { + this.assertWebGL2(); + let array = this.mem.loadF32Array(addr, 2*4); + this.ctx.uniformMatrix2x4fv(this.uniforms[location], false, array); + }, + UniformMatrix3x4fv: (location, addr) => { + this.assertWebGL2(); + let array = this.mem.loadF32Array(addr, 3*4); + this.ctx.uniformMatrix3x4fv(this.uniforms[location], false, array); + }, + + /* Vertex attribs */ + VertexAttribI4i: (index, x, y, z, w) => { + this.assertWebGL2(); + this.ctx.vertexAttribI4i(index, x, y, z, w); + }, + VertexAttribI4ui: (index, x, y, z, w) => { + this.assertWebGL2(); + this.ctx.vertexAttribI4ui(index, x, y, z, w); + }, + VertexAttribIPointer: (index, size, type, stride, offset) => { + this.assertWebGL2(); + this.ctx.vertexAttribIPointer(index, size, type, stride, offset); + }, + + /* Writing to the drawing buffer */ + VertexAttribDivisor: (index, divisor) => { + this.assertWebGL2(); + this.ctx.vertexAttribDivisor(index, divisor); + }, + DrawArraysInstanced: (mode, first, count, instanceCount) => { + this.assertWebGL2(); + this.ctx.drawArraysInstanced(mode, first, count, instanceCount); + }, + DrawElementsInstanced: (mode, count, type, offset, instanceCount) => { + this.assertWebGL2(); + this.ctx.drawElementsInstanced(mode, count, type, offset, instanceCount); + }, + DrawRangeElements: (mode, start, end, count, type, offset) => { + this.assertWebGL2(); + this.ctx.drawRangeElements(mode, start, end, count, type, offset); + }, + + /* Multiple Render Targets */ + DrawBuffers: (buffers_ptr, buffers_len) => { + this.assertWebGL2(); + let array = this.mem.loadU32Array(buffers_ptr, buffers_len); + this.ctx.drawBuffers(array); + }, + ClearBufferfv: (buffer, drawbuffer, values_ptr, values_len) => { + this.assertWebGL2(); + let array = this.mem.loadF32Array(values_ptr, values_len); + this.ctx.clearBufferfv(buffer, drawbuffer, array); + }, + ClearBufferiv: (buffer, drawbuffer, values_ptr, values_len) => { + this.assertWebGL2(); + let array = this.mem.loadI32Array(values_ptr, values_len); + this.ctx.clearBufferiv(buffer, drawbuffer, array); + }, + ClearBufferuiv: (buffer, drawbuffer, values_ptr, values_len) => { + this.assertWebGL2(); + let array = this.mem.loadU32Array(values_ptr, values_len); + this.ctx.clearBufferuiv(buffer, drawbuffer, array); + }, + ClearBufferfi: (buffer, drawbuffer, depth, stencil) => { + this.assertWebGL2(); + this.ctx.clearBufferfi(buffer, drawbuffer, depth, stencil); + }, + + /* Query Objects */ + CreateQuery: () => { + this.assertWebGL2(); + let query = this.ctx.createQuery(); + let id = this.getNewId(this.queries); + query.name = id; + this.queries[id] = query; + return id; + }, + DeleteQuery: (id) => { + this.assertWebGL2(); + let obj = this.queries[id]; + if (obj && id != 0) { + this.ctx.deleteQuery(obj); + this.queries[id] = null; + } + }, + IsQuery: (query) => { + this.assertWebGL2(); + return this.ctx.isQuery(this.queries[query]); + }, + BeginQuery: (target, query) => { + this.assertWebGL2(); + this.ctx.beginQuery(target, this.queries[query]) + }, + EndQuery: (target) => { + this.assertWebGL2(); + this.ctx.endQuery(target); + }, + GetQuery: (target, pname) => { + this.assertWebGL2(); + let query = this.ctx.getQuery(target, pname); + if (!query) { + return 0; + } + if (this.queries.indexOf(query) !== -1) { + return query.name; + } + let id = this.getNewId(this.queries); + query.name = id; + this.queries[id] = query; + return id; + }, + + /* Sampler Objects */ + CreateSampler: () => { + this.assertWebGL2(); + let sampler = this.ctx.createSampler(); + let id = this.getNewId(this.samplers); + sampler.name = id; + this.samplers[id] = sampler; + return id; + }, + DeleteSampler: (id) => { + this.assertWebGL2(); + let obj = this.samplers[id]; + if (obj && id != 0) { + this.ctx.deleteSampler(obj); + this.samplers[id] = null; + } + }, + IsSampler: (sampler) => { + this.assertWebGL2(); + return this.ctx.isSampler(this.samplers[sampler]); + }, + BindSampler: (unit, sampler) => { + this.assertWebGL2(); + this.ctx.bindSampler(unit, this.samplers[sampler]); + }, + SamplerParameteri: (sampler, pname, param) => { + this.assertWebGL2(); + this.ctx.samplerParameteri(this.samplers[sampler], pname, param); + }, + SamplerParameterf: (sampler, pname, param) => { + this.assertWebGL2(); + this.ctx.samplerParameterf(this.samplers[sampler], pname, param); + }, + + /* Sync objects */ + FenceSync: (condition, flags) => { + this.assertWebGL2(); + let sync = this.ctx.fenceSync(condition, flags); + let id = this.getNewId(this.syncs); + sync.name = id; + this.syncs[id] = sync; + return id; + }, + IsSync: (sync) => { + this.assertWebGL2(); + return this.ctx.isSync(this.syncs[sync]); + }, + DeleteSync: (id) => { + this.assertWebGL2(); + let obj = this.syncs[id]; + if (obj && id != 0) { + this.ctx.deleteSampler(obj); + this.syncs[id] = null; + } + }, + ClientWaitSync: (sync, flags, timeout) => { + this.assertWebGL2(); + return this.ctx.clientWaitSync(this.syncs[sync], flags, timeout); + }, + WaitSync: (sync, flags, timeout) => { + this.assertWebGL2(); + this.ctx.waitSync(this.syncs[sync], flags, timeout) ; + }, + + + /* Transform Feedback */ + CreateTransformFeedback: () => { + this.assertWebGL2(); + let transformFeedback = this.ctx.createTransformFeedback(); + let id = this.getNewId(this.transformFeedbacks); + transformFeedback.name = id; + this.transformFeedbacks[id] = transformFeedback; + return id; + }, + DeleteTransformFeedback: (id) => { + this.assertWebGL2(); + let obj = this.transformFeedbacks[id]; + if (obj && id != 0) { + this.ctx.deleteTransformFeedback(obj); + this.transformFeedbacks[id] = null; + } + }, + IsTransformFeedback: (tf) => { + this.assertWebGL2(); + return this.ctx.isTransformFeedback(this.transformFeedbacks[tf]); + }, + BindTransformFeedback: (target, tf) => { + this.assertWebGL2(); + this.ctx.bindTransformFeedback(target, this.transformFeedbacks[tf]); + }, + BeginTransformFeedback: (primitiveMode) => { + this.assertWebGL2(); + this.ctx.beginTransformFeedback(primitiveMode); + }, + EndTransformFeedback: () => { + this.assertWebGL2(); + this.ctx.endTransformFeedback(); + }, + TransformFeedbackVaryings: (program, varyings_ptr, varyings_len, bufferMode) => { + this.assertWebGL2(); + const stringSize = this.mem.intSize*2; + let varyings = []; + for (let i = 0; i < varyings_len; i++) { + let ptr = this.mem.loadPtr(varyings_ptr + i*stringSize + 0*4); + let len = this.mem.loadPtr(varyings_ptr + i*stringSize + 1*4); + varyings.push(this.mem.loadString(ptr, len)); + } + this.ctx.transformFeedbackVaryings(this.programs[program], varyings, bufferMode); + }, + PauseTransformFeedback: () => { + this.assertWebGL2(); + this.ctx.pauseTransformFeedback(); + }, + ResumeTransformFeedback: () => { + this.assertWebGL2(); + this.ctx.resumeTransformFeedback(); + }, + + + /* Uniform Buffer Objects and Transform Feedback Buffers */ + BindBufferBase: (target, index, buffer) => { + this.assertWebGL2(); + this.ctx.bindBufferBase(target, index, this.buffers[buffer]); + }, + BindBufferRange: (target, index, buffer, offset, size) => { + this.assertWebGL2(); + this.ctx.bindBufferRange(target, index, this.buffers[buffer], offset, size); + }, + GetUniformBlockIndex: (program, uniformBlockName_ptr, uniformBlockName_len) => { + this.assertWebGL2(); + return this.ctx.getUniformBlockIndex(this.programs[program], this.mem.loadString(uniformBlockName_ptr, uniformBlockName_len)); + }, + GetActiveUniformBlockName: (program, uniformBlockIndex, name_buf_ptr, name_buf_len, name_length_ptr) => { + this.assertWebGL2(); + let name = this.ctx.getActiveUniformBlockName(this.programs[program], uniformBlockIndex); + + if (name_buf_ptr && name_buf_len > 0) { + let n = Math.min(name_buf_len, name.length); + name = name.substring(0, n); + this.mem.loadBytes(name_buf_ptr, name_buf_len).set(new TextEncoder().encode(name)); + this.mem.storeInt(name_length_ptr, n); + } else if (name_length_ptr) { + this.mem.storeInt(name_length_ptr, name.length); + } + }, + GetActiveUniforms: (program, uniformIndices_ptr, uniformIndices_len, pname, res_ptr) => { + this.assertWebGL2(); + let indices = this.mem.loadU32Array(uniformIndices_ptr, uniformIndices_len); + this.ctx.getActiveUniforms(this.programs[program], indices, pname) + this.mem.loadI32Array(res_ptr, indices.length).set(indices) + }, + GetActiveUniformBlockParameter: (program, uniformBlockIndex, pname, params_ptr) => { + this.assertWebGL2(); + let res = this.ctx.getActiveUniformBlockParameter(this.programs[program], uniformBlockIndex, pname); + + if (res instanceof Uint32Array) { // for pname GL_UNIFORM_BLOCK_ACTIVE_UNIFORM_INDICES + this.mem.loadU32Array(params_ptr, res.length).set(res) + } else { + this.mem.storeI32(params_ptr, res) + } + }, + UniformBlockBinding: (program, uniformBlockIndex, uniformBlockBinding) => { + this.assertWebGL2(); + this.ctx.uniformBlockBinding(this.programs[program], uniformBlockIndex, uniformBlockBinding); + }, + + /* Vertex Array Objects */ + CreateVertexArray: () => { + this.assertWebGL2(); + let vao = this.ctx.createVertexArray(); + let id = this.getNewId(this.vaos); + vao.name = id; + this.vaos[id] = vao; + return id; + }, + DeleteVertexArray: (id) => { + this.assertWebGL2(); + let obj = this.vaos[id]; + if (obj && id != 0) { + this.ctx.deleteVertexArray(obj); + this.vaos[id] = null; + } + }, + IsVertexArray: (vertexArray) => { + this.assertWebGL2(); + return this.ctx.isVertexArray(this.vaos[vertexArray]); + }, + BindVertexArray: (vertexArray) => { + this.assertWebGL2(); + this.ctx.bindVertexArray(this.vaos[vertexArray]); + }, + }; + } +}; + + +function odinSetupDefaultImports(wasmMemoryInterface, consoleElement, memory) { + const MAX_INFO_CONSOLE_LINES = 512; + let infoConsoleLines = new Array(); + let currentLine = {}; + currentLine[false] = ""; + currentLine[true] = ""; + let prevIsError = false; + + let event_temp = {}; + + const onEventReceived = (event_data, data, callback) => { + event_temp.data = event_data; + + const exports = wasmMemoryInterface.exports; + const odin_ctx = exports.default_context_ptr(); + + exports.odin_dom_do_event_callback(data, callback, odin_ctx); + + event_temp.data = null; + }; + + const writeToConsole = (line, isError) => { + if (!line) { + return; + } + + const println = (text, forceIsError) => { + let style = [ + "color: #eee", + "background-color: #d20", + "padding: 2px 4px", + "border-radius: 2px", + ].join(";"); + let doIsError = isError; + if (forceIsError !== undefined) { + doIsError = forceIsError; + } + + if (doIsError) { + console.log("%c"+text, style); + } else { + console.log(text); + } + + }; + + // Print to console + if (line == "\n") { + println(currentLine[isError]); + currentLine[isError] = ""; + } else if (!line.includes("\n")) { + currentLine[isError] = currentLine[isError].concat(line); + } else { + let lines = line.trimEnd().split("\n"); + let printLast = lines.length > 1 && line.endsWith("\n"); + println(currentLine[isError].concat(lines[0])); + currentLine[isError] = ""; + for (let i = 1; i < lines.length-1; i++) { + println(lines[i]); + } + if (lines.length > 1) { + let last = lines[lines.length-1]; + if (printLast) { + println(last); + } else { + currentLine[isError] = last; + } + } + } + + if (prevIsError != isError) { + if (prevIsError) { + println(currentLine[prevIsError], prevIsError); + currentLine[prevIsError] = ""; + } + } + prevIsError = isError; + + + // HTML based console + if (!consoleElement) { + return; + } + const wrap = (x) => { + if (isError) { + return ''+x+''; + } + return x; + }; + + if (line == "\n") { + infoConsoleLines.push(line); + } else if (!line.includes("\n")) { + let prevLine = ""; + if (infoConsoleLines.length > 0) { + prevLine = infoConsoleLines.pop(); + } + infoConsoleLines.push(prevLine.concat(wrap(line))); + } else { + let lines = line.split("\n"); + let lastHasNewline = lines.length > 1 && line.endsWith("\n"); + + let prevLine = ""; + if (infoConsoleLines.length > 0) { + prevLine = infoConsoleLines.pop(); + } + infoConsoleLines.push(prevLine.concat(wrap(lines[0]).concat("\n"))); + + for (let i = 1; i < lines.length-1; i++) { + infoConsoleLines.push(wrap(lines[i]).concat("\n")); + } + let last = lines[lines.length-1]; + if (lastHasNewline) { + infoConsoleLines.push(last.concat("\n")); + } else { + infoConsoleLines.push(last); + } + } + + if (infoConsoleLines.length > MAX_INFO_CONSOLE_LINES) { + infoConsoleLines.shift(MAX_INFO_CONSOLE_LINES); + } + + let data = ""; + for (let i = 0; i < infoConsoleLines.length; i++) { + data = data.concat(infoConsoleLines[i]); + } + + let info = consoleElement; + info.innerHTML = data; + info.scrollTop = info.scrollHeight; + }; + + const listener_key = (id, name, data, callback, useCapture) => { + return `${id}-${name}-data:${data}-callback:${callback}-useCapture:${useCapture}`; + }; + + let webglContext = new WebGLInterface(wasmMemoryInterface); + + const env = {}; + + if (memory) { + env.memory = memory; + } + + return { + env, + "odin_env": { + write: (fd, ptr, len) => { + const str = wasmMemoryInterface.loadString(ptr, len); + if (fd == 1) { + writeToConsole(str, false); + return; + } else if (fd == 2) { + writeToConsole(str, true); + return; + } else { + throw new Error("Invalid fd to 'write'" + stripNewline(str)); + } + }, + trap: () => { throw new Error() }, + alert: (ptr, len) => { alert(wasmMemoryInterface.loadString(ptr, len)) }, + abort: () => { Module.abort() }, + evaluate: (str_ptr, str_len) => { eval.call(null, wasmMemoryInterface.loadString(str_ptr, str_len)); }, + + open: (url_ptr, url_len, name_ptr, name_len, specs_ptr, specs_len) => { + const url = wasmMemoryInterface.loadString(url_ptr, url_len); + const name = wasmMemoryInterface.loadString(name_ptr, name_len); + const specs = wasmMemoryInterface.loadString(specs_ptr, specs_len); + window.open(url, name, specs); + }, + + // return a bigint to be converted to i64 + time_now: () => BigInt(Date.now()), + tick_now: () => performance.now(), + time_sleep: (duration_ms) => { + if (duration_ms > 0) { + // TODO(bill): Does this even make any sense? + } + }, + + sqrt: Math.sqrt, + sin: Math.sin, + cos: Math.cos, + pow: Math.pow, + fmuladd: (x, y, z) => x*y + z, + ln: Math.log, + exp: Math.exp, + ldexp: (x, exp) => x * Math.pow(2, exp), + + rand_bytes: (ptr, len) => { + const view = new Uint8Array(wasmMemoryInterface.memory.buffer, ptr, len) + crypto.getRandomValues(view) + }, + }, + "odin_dom": { + init_event_raw: (ep) => { + const W = wasmMemoryInterface.intSize; + let offset = ep; + let off = (amount, alignment) => { + if (alignment === undefined) { + alignment = Math.min(amount, W); + } + if (offset % alignment != 0) { + offset += alignment - (offset%alignment); + } + let x = offset; + offset += amount; + return x; + }; + + let align = (alignment) => { + const modulo = offset & (alignment-1); + if (modulo != 0) { + offset += alignment - modulo + } + }; + + let wmi = wasmMemoryInterface; + + if (!event_temp.data) { + return; + } + + let e = event_temp.data.event; + + wmi.storeU32(off(4), event_temp.data.name_code); + if (e.target == document) { + wmi.storeU32(off(4), 1); + } else if (e.target == window) { + wmi.storeU32(off(4), 2); + } else { + wmi.storeU32(off(4), 0); + } + if (e.currentTarget == document) { + wmi.storeU32(off(4), 1); + } else if (e.currentTarget == window) { + wmi.storeU32(off(4), 2); + } else { + wmi.storeU32(off(4), 0); + } + + align(W); + + wmi.storeI32(off(W), event_temp.data.id_ptr); + wmi.storeUint(off(W), event_temp.data.id_len); + + align(8); + wmi.storeF64(off(8), e.timeStamp*1e-3); + + wmi.storeU8(off(1), e.eventPhase); + let options = 0; + if (!!e.bubbles) { options |= 1<<0; } + if (!!e.cancelable) { options |= 1<<1; } + if (!!e.composed) { options |= 1<<2; } + wmi.storeU8(off(1), options); + wmi.storeU8(off(1), !!e.isComposing); + wmi.storeU8(off(1), !!e.isTrusted); + + align(8); + if (e instanceof WheelEvent) { + wmi.storeF64(off(8), e.deltaX); + wmi.storeF64(off(8), e.deltaY); + wmi.storeF64(off(8), e.deltaZ); + wmi.storeU32(off(4), e.deltaMode); + } else if (e instanceof MouseEvent) { + wmi.storeI64(off(8), e.screenX); + wmi.storeI64(off(8), e.screenY); + wmi.storeI64(off(8), e.clientX); + wmi.storeI64(off(8), e.clientY); + wmi.storeI64(off(8), e.offsetX); + wmi.storeI64(off(8), e.offsetY); + wmi.storeI64(off(8), e.pageX); + wmi.storeI64(off(8), e.pageY); + wmi.storeI64(off(8), e.movementX); + wmi.storeI64(off(8), e.movementY); + + wmi.storeU8(off(1), !!e.ctrlKey); + wmi.storeU8(off(1), !!e.shiftKey); + wmi.storeU8(off(1), !!e.altKey); + wmi.storeU8(off(1), !!e.metaKey); + + wmi.storeI16(off(2), e.button); + wmi.storeU16(off(2), e.buttons); + + if (e instanceof PointerEvent) { + wmi.storeF64(off(8), e.altitudeAngle); + wmi.storeF64(off(8), e.azimuthAngle); + wmi.storeInt(off(W), e.persistentDeviceId); + wmi.storeInt(off(W), e.pointerId); + wmi.storeInt(off(W), e.width); + wmi.storeInt(off(W), e.height); + wmi.storeF64(off(8), e.pressure); + wmi.storeF64(off(8), e.tangentialPressure); + wmi.storeF64(off(8), e.tiltX); + wmi.storeF64(off(8), e.tiltY); + wmi.storeF64(off(8), e.twist); + if (e.pointerType == "pen") { + wmi.storeU8(off(1), 1); + } else if (e.pointerType == "touch") { + wmi.storeU8(off(1), 2); + } else { + wmi.storeU8(off(1), 0); + } + wmi.storeU8(off(1), !!e.isPrimary); + } + + } else if (e instanceof KeyboardEvent) { + // Note: those strings are constructed + // on the native side from buffers that + // are filled later, so skip them + const keyPtr = off(W*2, W); + const codePtr = off(W*2, W); + + wmi.storeU8(off(1), e.location); + + wmi.storeU8(off(1), !!e.ctrlKey); + wmi.storeU8(off(1), !!e.shiftKey); + wmi.storeU8(off(1), !!e.altKey); + wmi.storeU8(off(1), !!e.metaKey); + + wmi.storeU8(off(1), !!e.repeat); + + wmi.storeI32(off(4), e.charCode); + + wmi.storeInt(off(W, W), e.key.length) + wmi.storeInt(off(W, W), e.code.length) + wmi.storeString(off(32, 1), e.key); + wmi.storeString(off(32, 1), e.code); + } else if (e.type === 'scroll') { + wmi.storeF64(off(8, 8), window.scrollX); + wmi.storeF64(off(8, 8), window.scrollY); + } else if (e.type === 'visibilitychange') { + wmi.storeU8(off(1), !document.hidden); + } else if (e instanceof GamepadEvent) { + const idPtr = off(W*2, W); + const mappingPtr = off(W*2, W); + + wmi.storeI32(off(W, W), e.gamepad.index); + wmi.storeU8(off(1), !!e.gamepad.connected); + wmi.storeF64(off(8, 8), e.gamepad.timestamp); + + wmi.storeInt(off(W, W), e.gamepad.buttons.length); + wmi.storeInt(off(W, W), e.gamepad.axes.length); + + for (let i = 0; i < 64; i++) { + if (i < e.gamepad.buttons.length) { + let b = e.gamepad.buttons[i]; + wmi.storeF64(off(8, 8), b.value); + wmi.storeU8(off(1), !!b.pressed); + wmi.storeU8(off(1), !!b.touched); + } else { + off(16, 8); + } + } + for (let i = 0; i < 16; i++) { + if (i < e.gamepad.axes.length) { + let a = e.gamepad.axes[i]; + wmi.storeF64(off(8, 8), a); + } else { + off(8, 8); + } + } + + let idLength = e.gamepad.id.length; + let id = e.gamepad.id; + if (idLength > 96) { + idLength = 96; + id = id.slice(0, 93) + '...'; + } + + let mappingLength = e.gamepad.mapping.length; + let mapping = e.gamepad.mapping; + if (mappingLength > 64) { + mappingLength = 61; + mapping = mapping.slice(0, 61) + '...'; + } + + wmi.storeInt(off(W, W), idLength); + wmi.storeInt(off(W, W), mappingLength); + wmi.storeString(off(96, 1), id); + wmi.storeString(off(64, 1), mapping); + } + }, + + add_event_listener: (id_ptr, id_len, name_ptr, name_len, name_code, data, callback, use_capture) => { + let id = wasmMemoryInterface.loadString(id_ptr, id_len); + let name = wasmMemoryInterface.loadString(name_ptr, name_len); + let element = getElement(id); + if (element == undefined) { + return false; + } + let key = listener_key(id, name, data, callback, !!use_capture); + if (wasmMemoryInterface.listenerMap.has(key)) { + return false; + } + + let listener = (e) => { + let event_data = {}; + event_data.id_ptr = id_ptr; + event_data.id_len = id_len; + event_data.event = e; + event_data.name_code = name_code; + + onEventReceived(event_data, data, callback); + }; + wasmMemoryInterface.listenerMap.set(key, listener); + element.addEventListener(name, listener, !!use_capture); + return true; + }, + + add_window_event_listener: (name_ptr, name_len, name_code, data, callback, use_capture) => { + let name = wasmMemoryInterface.loadString(name_ptr, name_len); + let element = window; + let key = listener_key('window', name, data, callback, !!use_capture); + if (wasmMemoryInterface.listenerMap.has(key)) { + return false; + } + + let listener = (e) => { + let event_data = {}; + event_data.id_ptr = 0; + event_data.id_len = 0; + event_data.event = e; + event_data.name_code = name_code; + + onEventReceived(event_data, data, callback); + }; + wasmMemoryInterface.listenerMap.set(key, listener); + element.addEventListener(name, listener, !!use_capture); + return true; + }, + + add_document_event_listener: (name_ptr, name_len, name_code, data, callback, use_capture) => { + let name = wasmMemoryInterface.loadString(name_ptr, name_len); + let element = document; + let key = listener_key('document', name, data, callback, !!use_capture); + if (wasmMemoryInterface.listenerMap.has(key)) { + return false; + } + + let listener = (e) => { + let event_data = {}; + event_data.id_ptr = 0; + event_data.id_len = 0; + event_data.event = e; + event_data.name_code = name_code; + + onEventReceived(event_data, data, callback); + }; + wasmMemoryInterface.listenerMap.set(key, listener); + element.addEventListener(name, listener, !!use_capture); + return true; + }, + + remove_event_listener: (id_ptr, id_len, name_ptr, name_len, data, callback, use_capture) => { + let id = wasmMemoryInterface.loadString(id_ptr, id_len); + let name = wasmMemoryInterface.loadString(name_ptr, name_len); + let element = getElement(id); + if (element == undefined) { + return false; + } + + let key = listener_key(id, name, data, callback, !!use_capture); + let listener = wasmMemoryInterface.listenerMap.get(key); + if (listener === undefined) { + return false; + } + wasmMemoryInterface.listenerMap.delete(key); + + element.removeEventListener(name, listener, !!use_capture); + return true; + }, + remove_window_event_listener: (name_ptr, name_len, data, callback, use_capture) => { + let name = wasmMemoryInterface.loadString(name_ptr, name_len); + let element = window; + + let key = listener_key('window', name, data, callback, !!use_capture); + let listener = wasmMemoryInterface.listenerMap.get(key); + if (listener === undefined) { + return false; + } + wasmMemoryInterface.listenerMap.delete(key); + + element.removeEventListener(name, listener, !!use_capture); + return true; + }, + remove_document_event_listener: (name_ptr, name_len, data, callback, use_capture) => { + let name = wasmMemoryInterface.loadString(name_ptr, name_len); + let element = document; + + let key = listener_key('document', name, data, callback, !!use_capture); + let listener = wasmMemoryInterface.listenerMap.get(key); + if (listener === undefined) { + return false; + } + wasmMemoryInterface.listenerMap.delete(key); + + element.removeEventListener(name, listener, !!use_capture); + return true; + }, + + event_stop_propagation: () => { + if (event_temp.data && event_temp.data.event) { + event_temp.data.event.stopPropagation(); + } + }, + event_stop_immediate_propagation: () => { + if (event_temp.data && event_temp.data.event) { + event_temp.data.event.stopImmediatePropagation(); + } + }, + event_prevent_default: () => { + if (event_temp.data && event_temp.data.event) { + event_temp.data.event.preventDefault(); + } + }, + + dispatch_custom_event: (id_ptr, id_len, name_ptr, name_len, options_bits) => { + let id = wasmMemoryInterface.loadString(id_ptr, id_len); + let name = wasmMemoryInterface.loadString(name_ptr, name_len); + let options = { + bubbles: (options_bits & (1<<0)) !== 0, + cancelable: (options_bits & (1<<1)) !== 0, + composed: (options_bits & (1<<2)) !== 0, + }; + + let element = getElement(id); + if (element) { + element.dispatchEvent(new Event(name, options)); + return true; + } + return false; + }, + + // Writes a struct of type `Gamepad_State`, see `core/sys/wasm/js/events.odin` + get_gamepad_state: (gamepad_id, ep) => { + let index = gamepad_id; + let gps = navigator.getGamepads(); + if (0 <= index && index < gps.length) { + let gamepad = gps[index]; + if (!gamepad) { + return false; + } + + const W = wasmMemoryInterface.intSize; + let offset = ep; + let off = (amount, alignment) => { + if (alignment === undefined) { + alignment = Math.min(amount, W); + } + if (offset % alignment != 0) { + offset += alignment - (offset%alignment); + } + let x = offset; + offset += amount; + return x; + }; + + let align = (alignment) => { + const modulo = offset & (alignment-1); + if (modulo != 0) { + offset += alignment - modulo + } + }; + + let wmi = wasmMemoryInterface; + + const idPtr = off(W*2, W); + const mappingPtr = off(W*2, W); + + wmi.storeI32(off(W), gamepad.index); + wmi.storeU8(off(1), !!gamepad.connected); + wmi.storeF64(off(8), gamepad.timestamp); + + wmi.storeInt(off(W), gamepad.buttons.length); + wmi.storeInt(off(W), gamepad.axes.length); + + for (let i = 0; i < 64; i++) { + if (i < gamepad.buttons.length) { + let b = gamepad.buttons[i]; + wmi.storeF64(off(8, 8), b.value); + wmi.storeU8(off(1), !!b.pressed); + wmi.storeU8(off(1), !!b.touched); + } else { + off(16, 8); + } + } + for (let i = 0; i < 16; i++) { + if (i < gamepad.axes.length) { + wmi.storeF64(off(8, 8), gamepad.axes[i]); + } else { + off(8, 8); + } + } + + let idLength = gamepad.id.length; + let id = gamepad.id; + if (idLength > 96) { + idLength = 96; + id = id.slice(0, 93) + '...'; + } + + let mappingLength = gamepad.mapping.length; + let mapping = gamepad.mapping; + if (mappingLength > 64) { + mappingLength = 61; + mapping = mapping.slice(0, 61) + '...'; + } + + wmi.storeInt(off(W, W), idLength); + wmi.storeInt(off(W, W), mappingLength); + wmi.storeString(off(96, 1), id); + wmi.storeString(off(64, 1), mapping); + + return true; + } + return false; + }, + + get_element_value_f64: (id_ptr, id_len) => { + let id = wasmMemoryInterface.loadString(id_ptr, id_len); + let element = getElement(id); + return element ? element.value : 0; + }, + get_element_value_string: (id_ptr, id_len, buf_ptr, buf_len) => { + let id = wasmMemoryInterface.loadString(id_ptr, id_len); + let element = getElement(id); + if (element) { + let str = element.value; + if (buf_len > 0 && buf_ptr) { + let n = Math.min(buf_len, str.length); + str = str.substring(0, n); + wasmMemoryInterface.loadBytes(buf_ptr, buf_len).set(new TextEncoder().encode(str)) + return n; + } + } + return 0; + }, + get_element_value_string_length: (id_ptr, id_len) => { + let id = wasmMemoryInterface.loadString(id_ptr, id_len); + let element = getElement(id); + if (element) { + return element.value.length; + } + return 0; + }, + get_element_min_max: (ptr_array2_f64, id_ptr, id_len) => { + let id = wasmMemoryInterface.loadString(id_ptr, id_len); + let element = getElement(id); + if (element) { + let values = wasmMemoryInterface.loadF64Array(ptr_array2_f64, 2); + values[0] = element.min; + values[1] = element.max; + } + }, + set_element_value_f64: (id_ptr, id_len, value) => { + let id = wasmMemoryInterface.loadString(id_ptr, id_len); + let element = getElement(id); + if (element) { + element.value = value; + } + }, + set_element_value_string: (id_ptr, id_len, value_ptr, value_len) => { + let id = wasmMemoryInterface.loadString(id_ptr, id_len); + let value = wasmMemoryInterface.loadString(value_ptr, value_len); + let element = getElement(id); + if (element) { + element.value = value; + } + }, + + set_element_style: (id_ptr, id_len, key_ptr, key_len, value_ptr, value_len) => { + let id = wasmMemoryInterface.loadString(id_ptr, id_len); + let key = wasmMemoryInterface.loadString(key_ptr, key_len); + let value = wasmMemoryInterface.loadString(value_ptr, value_len); + let element = getElement(id); + if (element) { + element.style[key] = value; + } + }, + + set_document_title: (title_ptr, title_len) => { + let title = wasmMemoryInterface.loadString(title_ptr, title_len); + document.title = title; + }, + + get_element_key_f64: (id_ptr, id_len, key_ptr, key_len) => { + let id = wasmMemoryInterface.loadString(id_ptr, id_len); + let key = wasmMemoryInterface.loadString(key_ptr, key_len); + let element = getElement(id); + return element ? element[key] : 0; + }, + get_element_key_string: (id_ptr, id_len, key_ptr, key_len, buf_ptr, buf_len) => { + let id = wasmMemoryInterface.loadString(id_ptr, id_len); + let key = wasmMemoryInterface.loadString(key_ptr, key_len); + let element = getElement(id); + if (element) { + let str = element[key]; + if (buf_len > 0 && buf_ptr) { + let n = Math.min(buf_len, str.length); + str = str.substring(0, n); + wasmMemoryInterface.loadBytes(buf_ptr, buf_len).set(new TextEncoder().encode(str)) + return n; + } + } + return 0; + }, + get_element_key_string_length: (id_ptr, id_len, key_ptr, key_len) => { + let id = wasmMemoryInterface.loadString(id_ptr, id_len); + let key = wasmMemoryInterface.loadString(key_ptr, key_len); + let element = getElement(id); + if (element && element[key]) { + return element[key].length; + } + return 0; + }, + + set_element_key_f64: (id_ptr, id_len, key_ptr, key_len, value) => { + let id = wasmMemoryInterface.loadString(id_ptr, id_len); + let key = wasmMemoryInterface.loadString(key_ptr, key_len); + let element = getElement(id); + if (element) { + element[key] = value; + } + }, + set_element_key_string: (id_ptr, id_len, key_ptr, key_len, value_ptr, value_len) => { + let id = wasmMemoryInterface.loadString(id_ptr, id_len); + let key = wasmMemoryInterface.loadString(key_ptr, key_len); + let value = wasmMemoryInterface.loadString(value_ptr, value_len); + let element = getElement(id); + if (element) { + element[key] = value; + } + }, + + + get_bounding_client_rect: (rect_ptr, id_ptr, id_len) => { + let id = wasmMemoryInterface.loadString(id_ptr, id_len); + let element = getElement(id); + if (element) { + let values = wasmMemoryInterface.loadF64Array(rect_ptr, 4); + let rect = element.getBoundingClientRect(); + values[0] = rect.left; + values[1] = rect.top; + values[2] = rect.right - rect.left; + values[3] = rect.bottom - rect.top; + } + }, + window_get_rect: (rect_ptr) => { + let values = wasmMemoryInterface.loadF64Array(rect_ptr, 4); + values[0] = window.screenX; + values[1] = window.screenY; + values[2] = window.screen.width; + values[3] = window.screen.height; + }, + + window_get_scroll: (pos_ptr) => { + let values = wasmMemoryInterface.loadF64Array(pos_ptr, 2); + values[0] = window.scrollX; + values[1] = window.scrollY; + }, + window_set_scroll: (x, y) => { + window.scroll(x, y); + }, + + device_pixel_ratio: () => { + return window.devicePixelRatio; + }, + + }, + + "webgl": webglContext.getWebGL1Interface(), + "webgl2": webglContext.getWebGL2Interface(), + }; +}; + +/** + * @param {string} wasmPath - Path to the WASM module to run + * @param {?HTMLPreElement} consoleElement - Optional console/pre element to append output to, in addition to the console + * @param {any} extraForeignImports - Imports, in addition to the default runtime to provide the module + * @param {?WasmMemoryInterface} wasmMemoryInterface - Optional memory to use instead of the defaults + * @param {?int} intSize - Size (in bytes) of the integer type, should be 4 on `js_wasm32` and 8 on `js_wasm64p32` + */ +async function runWasm(wasmPath, consoleElement, extraForeignImports, wasmMemoryInterface, intSize = 4) { + if (!wasmMemoryInterface) { + wasmMemoryInterface = new WasmMemoryInterface(); + } + wasmMemoryInterface.setIntSize(intSize); + + let imports = odinSetupDefaultImports(wasmMemoryInterface, consoleElement, wasmMemoryInterface.memory); + let exports = {}; + + if (extraForeignImports !== undefined) { + imports = { + ...imports, + ...extraForeignImports, + }; + } + + const response = await fetch(wasmPath); + const file = await response.arrayBuffer(); + const wasm = await WebAssembly.instantiate(file, imports); + exports = wasm.instance.exports; + wasmMemoryInterface.setExports(exports); + + if (exports.memory) { + if (wasmMemoryInterface.memory) { + console.warn('WASM module exports memory, but `runWasm` was given an interface with existing memory too. Did you mean to use `-extra-linker-flags:"--import-memory"` to tell the compiler not to export memory?'); + } + wasmMemoryInterface.setMemory(exports.memory); + } + + if (exports._start) { + exports._start(); + } + + // Define a `@export step :: proc(delta_time: f64) -> (keep_going: bool) {` + // in your app and it will get called every frame. + // return `false` to stop the execution of the module. + if (exports.step) { + const odin_ctx = exports.default_context_ptr(); + + let prevTimeStamp = undefined; + function step(currTimeStamp) { + if (prevTimeStamp == undefined) { + prevTimeStamp = currTimeStamp; + } + + const dt = (currTimeStamp - prevTimeStamp)*0.001; + prevTimeStamp = currTimeStamp; + + if (!exports.step(dt, odin_ctx)) { + if (exports._end) { + exports._end(); + } + return; + } + + window.requestAnimationFrame(step); + } + + window.requestAnimationFrame(step); + } else { + if (exports._end) { + exports._end(); + } + } + + return; +}; + +window.odin = { + // Interface Types + WasmMemoryInterface: WasmMemoryInterface, + WebGLInterface: WebGLInterface, + + // Functions + setupDefaultImports: odinSetupDefaultImports, + runWasm: runWasm, +}; +})();