From f45c2d88e07c5e520ef383e0dc7d604e1f164d1d Mon Sep 17 00:00:00 2001 From: Taylor Robbins Date: Tue, 2 Sep 2025 12:20:11 -0700 Subject: [PATCH] Added some simple background textures from OpenGameArt.org and rendered them with a little parallax effect --- CWasm.sublime-project | 1 + build.bat | 3 +- cwasm.c | 8 ++-- cwasm.h | 6 ++- data/parallax-mountain-bg.png | Bin 0 -> 2025 bytes data/parallax-mountain-foreground-trees.png | Bin 0 -> 6703 bytes data/parallax-mountain-montain-far.png | Bin 0 -> 1093 bytes data/parallax-mountain-mountains.png | Bin 0 -> 4729 bytes data/parallax-mountain-trees.png | Bin 0 -> 4500 bytes test_app.c | 42 ++++++++++++++++---- 10 files changed, 46 insertions(+), 14 deletions(-) create mode 100644 data/parallax-mountain-bg.png create mode 100644 data/parallax-mountain-foreground-trees.png create mode 100644 data/parallax-mountain-montain-far.png create mode 100644 data/parallax-mountain-mountains.png create mode 100644 data/parallax-mountain-trees.png diff --git a/CWasm.sublime-project b/CWasm.sublime-project index 5dab2f0..4ae5efd 100644 --- a/CWasm.sublime-project +++ b/CWasm.sublime-project @@ -39,6 +39,7 @@ "CWASM_ENABLE_DBG_LEVEL_INFO", "CWASM_ENABLE_DBG_LEVEL_WARNING", "CWASM_ENABLE_DBG_LEVEL_WARNING", + "CWASM_NO_STB_IMAGE", "DbgLevel_Count", "DbgLevel_Debug", "DbgLevel_Error", diff --git a/build.bat b/build.bat index 539836f..0b57d94 100644 --- a/build.bat +++ b/build.bat @@ -18,9 +18,8 @@ if not "%2"=="" ( if not exist build mkdir build pushd build -rem TODO: Take the app.c file path as an argument? echo [Compiling %app_source_path% to %app_module_name%...] -clang %app_source_path% -o "%app_module_name%" -I ".." -I "..\std" -std=gnu2x --target=wasm32-unknown-unknown -mbulk-memory -Wl,--no-entry,--export-dynamic,--allow-undefined,--export=__heap_base --no-standard-libraries --no-standard-includes +clang %app_source_path% -o "%app_module_name%" -I ".." -I "..\std" -std=gnu2x -O0 --target=wasm32-unknown-unknown -mbulk-memory -Wl,--no-entry,--export-dynamic,--allow-undefined,--export=__heap_base --no-standard-libraries --no-standard-includes if %ERRORLEVEL% NEQ 0 ( echo [FAILED to build %app_module_name%!] goto :build_end diff --git a/cwasm.c b/cwasm.c index ceeb8b4..069f3cd 100644 --- a/cwasm.c +++ b/cwasm.c @@ -15,9 +15,7 @@ Description: #include "cwasm_matrices.c" #include "cwasm_arena.c" -#include "cwasm_webgl_js_imports.h" -#include "cwasm_webgl_constants.h" - +#if !CWASM_NO_STB_IMAGE #define STB_IMAGE_IMPLEMENTATION #define STBIDEF static #define STBI_NO_STDIO @@ -29,6 +27,10 @@ Description: #define STBI_ONLY_PNG #define STBI_NO_THREAD_LOCALS #include "stb_image.h" +#endif + +#include "cwasm_webgl_js_imports.h" +#include "cwasm_webgl_constants.h" void InitializeCWasm(u32 scratchArenasSize) { diff --git a/cwasm.h b/cwasm.h index 42c7ee8..aa6d9db 100644 --- a/cwasm.h +++ b/cwasm.h @@ -49,7 +49,7 @@ Description: #define CWASM_DEBUG_OUTPUT_PRINT_BUFFER_SIZE 1024 //chars #endif #ifndef CWASM_ENABLE_DBG_LEVEL_DEBUG -#define CWASM_ENABLE_DBG_LEVEL_DEBUG 1 +#define CWASM_ENABLE_DBG_LEVEL_DEBUG CWASM_DEBUG #endif #ifndef CWASM_ENABLE_DBG_LEVEL_INFO #define CWASM_ENABLE_DBG_LEVEL_INFO 1 @@ -61,6 +61,10 @@ Description: #define CWASM_ENABLE_DBG_LEVEL_ERROR 1 #endif +#ifndef CWASM_NO_STB_IMAGE +#define CWASM_NO_STB_IMAGE 0 +#endif + // +--------------------------------------------------------------+ // | Macros | // +--------------------------------------------------------------+ diff --git a/data/parallax-mountain-bg.png b/data/parallax-mountain-bg.png new file mode 100644 index 0000000000000000000000000000000000000000..a4a480568fa798de5792566ace4239acc6467159 GIT binary patch literal 2025 zcmd6o={FmQ8phL_(KO=PN@=5N*V-j?LL*aq8pN)#M1xREY_XT9T8nZjMj1;=ql#8* zZ^bf}AfmLEiLsuhh@nFTHA=X8&&>aDzxO}LCA;{6E@1iWutIFoQ4063G4 zGP~gvJM*~=F}e&p_cJ$J;RnU%SU{y8G!x_oQmc7>1#tGJ)IFHwYnj0Q)6Z`RR3={o zHCl@svDsZm55_(WH5&5{A+v*QTVC%(9yMWGV?;ZN&j-7G*;s$|0Vvz}o;ZD)k@|;W z-cg^_^sVL2As$%nc13kit;xkvaeRXRGm!q4yjCd4so1^<)%-{#1opGEDbb{_PGV1* zAKg!neNyO!7H*u75;HKXA&8`dm6%&r_?V@f=C8d@&%+&r`iZf!^BRk zHfJELTv~GDymOe-iyXk64HRW~UBg8B%}do@N3`A<{QVR~WbS!wQOsvsmuVxQ1Ox(i zHNhZf-y$igd8JmE<{W}hF5 z1oEq?#s?L_`p=>UHt*Xh_R|B1`hTmu?R#FR6nRT5E~||+CYWyP!UkftsA_G2vWleI z-E{&#t#q~nMndLK(BYhPoq#%xs82YYZd=oj z{v1TzLQT40Uo2YBQ(`s5*muLSEzf;cZ+m9soA_in0IWDd+-ONWn$I}N-j>D`(HAJK z6VD2uo%7gwq_{06nizHSC3$f1tQYxPrQgz(sqkMmK`@A5#RS&9OfnDfHSE-HtExS4 z5`ko0uIw|{Bs_Gyh9+?~m14m2jtP>Zds=$)um9a zpPoMz)WMp4yml>VY|bbVv5f|qkvx13MyH0L5`dytiML4%no(8nmQ@kS3xQ9--%y&O*$mz0|nU^G{#x2cJ z;AFCE%7jluZkyI%yY;$ZYVP9#9~)bQ;z8_jQ(m7zT*Rn)Ku~iwbg#dsy|FskS^ zB>Y;b(^?~H6jB}oXb`48ZxZ`a7g;sh zv$ow{x(yltnU|Dom^!StGKAAK=}?|!N0|1xnriw?;iU2LY~SAj{N2t<8*O%v{+<$i zyP<=>oJgy~sM)+6`*Trlh4%I7ZjrTS(%F`RkWr&~pVF1(^%)wR*}@Co`OJgg&8O|V zFbbX8g8gK83X&EpStrU-;%!;^cv zcsx>1q4V<6=<1y6L5k`kiX5&Ul{BS=rOWL}K3ZQr@wR*&)grIQ@yeFGJY5RkEPMB= zSloz_tLx$r@>N3%yi!B=a9(o=quyV}C$58R&k1g(%az=?Td zuHc{HeJe*+h8}?kV~m3J&<9A2GSx;C*<{U3d#Dn1De*t8(nx;um_iI}(39!!$Qrxi z7%S9`Dzl`fXbxbIe^ELz-Y({v%i?aE6i(n_rZ{g_Fwx{l50fh2dT;G&aevb%5`gD( zlaJ^w7kB0m+?rFO?yf8;FA@^1ZM&@;K5juRqyb-bmY7W$r=;UWOv?|K;uOI50!0M= rZS(&seS&}WpOXJS*d2!EBo00x9JpcfVx;mQ1 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 QKzZrjG1M&Ac=+VM0C|+3W&i*H literal 0 HcmV?d00001 diff --git a/data/parallax-mountain-montain-far.png b/data/parallax-mountain-montain-far.png new file mode 100644 index 0000000000000000000000000000000000000000..745ef833fb5f443040d298be3bdda2ad8b049ef5 GIT binary patch literal 1093 zcmeAS@N?(olHy`uVBq!ia0y~yU=#qd7jUov$s^m1uK+2@64!{5;QX|b^2DN42FH~A zq*MjZ+{E~)xx2CJN`ORLV){+(jiNa$dl}w4u6HX?&=_QiYGtT$}kzGcG(!5rN^6JH#9XV7M7IWuL_|3A+w54e@-YpaWruzkSnOIk)))sMW~y{+EkW> z@-uJUpAz=>ee20Db$lN^geNXCo%FEN_o}Smtfvlc$?V^xxRlsM6+%hUI}+o~u9 zF?QXxlcb!4>=fjVU#jv^YFEi|s4-*LZC&zT{P-auLlwpMjV^ud5d~~_1AKl3c8W|g z;8sa8InwmPea_nCO_dJYxY{ig)I`}+&K7jAu05Kv_QD#u38se>CAKX1lFYg)Ug3FP zTY`ehNv5PshkqS9ViUH$%j{q~(s}YtLxj|YJP$vbP0l+XkK>7kEq literal 0 HcmV?d00001 diff --git a/data/parallax-mountain-mountains.png b/data/parallax-mountain-mountains.png new file mode 100644 index 0000000000000000000000000000000000000000..90ec81645704b2862f1fa5dd16c88cfe16c1818c GIT binary patch literal 4729 zcmai0XH-+|vVJj0=mDilFDfEcihzLtK|&Lx8G2QMB2|Ok-t-bfmerD#G^3IPp=Ato*h4C080DwhbPsa>^L&8)& zi=K}9RVw(rOce}1de%1pU^;s6(ty--9sn3kt|E~aFS>jCd*5*P_7T=cB87eYyxp!| zzXAYuB*PqIVZO+vzCE#_ZAidBGW0g%q!%{RzK7?CKOrf?z-B-Y$sXo3ZDBuuo|dmW zivWp@#oy;Nm14fjI0T&)$%zfmCER_pHx-=g@u_k9YtR1k&l>Y(>lrnD&}Mq(L_Gyl zB|LMnwjleL@UHgGsaYA#P)2bdz(!wlS>y&;j0WuB;PBI;&Cr*C2K%0g9yDJ_YnJ1W zrofi8Q|xH)5j4&I@hXP&cn+W$6suhTG<9k48ObNiK^84=dh6;k11?Gfr;~TSz6bb> zos?i2VEagflO`)32p_#d&;jn}Kw00VyXS$G9N=&>Y*z(C(m+lh?WPB+YC&@^8&fr) zX9jYngve8XHW)Z{i-}=DL<->0T|>iHPgk(bOHwD5QVp*cS3MtUOE2vUMWbZ|C3^L_ zPje_cA97CBlxYo2;XMY`Bj(R5XoYZdD$=F`jir!x3SQ4wF^wKLjil~dr%>G?;xV zyOxRaTj0HDyS_`kl_bZE=@H*poz(m5XYxg3v>%@8I6g?ZJUuD32ho^R0#(;EXoBOV zi|kz?TZSjuto)m&w*gpd@NW4aK@Y*ZhfnndP<|lDsI21v@23CI7XSwxaT$v@HHa>H z0CciKC9AafHd=V3n(6pk4v)1k{dQ80&=zlR)n?OXyo~4fb2?QPrY#ZGQzanjB>O>A zK(X1>Ju1P6Ri@Rlj#b?Uw(Crv*&@*x%0R2tO@Gu`WQ0KDa@R^MmYzE$az~^^kM_tt zapBhl4pULXcqKh~v%40;mU;qf>VAh*qwREG#GmU1XTp9*HKODng;txYe_(!&tS>ry zEJ8PjssFOSd@7MEE3Mz}*)jF|%GvY%rS7m1q6V@{u6cn6s?dI2PNuU>`>Bc)LxStu zr=n%drJcvBE|ozVVm4j-o(9k!2|eG;piCQ}E$l3)rDtViWjv%;B+M_a$UeewmH`rB z+Imtnp~&#ri5Kj@+Id{g$VXf0Nr`#m8BZInw zUS?v8QpIVCddI{PUXNV%sD`ROk`g}M9XXpZ+cv8(%Qq{sX3Lo2qUoErV?Hfm_U4)a z?;P8l;vC(TrD=50QN^37sy*Rc`iA-CIgj5TbLV#7 zzFN89|AKw|v7m8MKYH-(B5EON0kRRm%o4>J-bKJj@TT!Vc`&>IJeA2t1-$R?@pf6r zot6KVJf8wf@wT**BuU=pjDN%U*x>Pr$9$5q7R4n6B@-n~mg|;pEr`Vq<{=fjmI~%G z#S9-3OD#(>E`BrTGshI4D~c|`6nR@9@^IGV7&_}Vqc#&{o@v%o$C<`XVJ27J8myFv z2TN(x%}}NG6Hj}FZ{Lz^NG1z3+*2dA)qtKzB}pu#tickg-PqU zyAvEgPEDWUD^N75m%n1?QIeRHXjQ6LYFdi=)}&mqT$oYNbiToQFO*fQ%iyHlNfd_I zdpKj>eAs-vkg<^Kg1Xvfg-nS@K3{f&PQWX#!jZX|zLlkoeT{B;M)~ni4do4m?1lBl3C5+FpD=Az ztEAVY;#%ISxgomI3X&%Mqljj8RZXj@5WN(gxo@_?)kWr-eUEfug4z}l;#-Asu~ts{Lw)dD?pvh8t6VBYd53FUBzJtxS@JOd4P3 zcz4sRf&Zqj{Z!E4W=2{~TI+JrXyuCX%GH(Vu_x~opPb6HR=CmM){XpPIyZn|dh%G# zW3miqf;0)mJf9bnb(M`rmw&FR%?~KqcK*Swv8CbnWJY5KesWglmSqPKTd;z#Dr>v+8)~53A!!vDi)zOdS$D6cvtucrGSAk z^fs&*~iOeqcZDSFy|yDYZmRBZ9HYqn}!Al0{tikFOmKI3CLw z*ecM95tSWK9v}=M?IZ<_*YqSW1U>v7->4KQ-l32$HCG>TvN*2Mh{b3;O)Zlv^_H;b z8FjTL`S6GFalYCmA{P=!m?g|tw_9(^u0&SvcX-{al@)vpeeF>bS9aK1nvtYkuwY>$ z@mUgDjk$t$d({*3Mm4cC^K{ShyP7wnac9$iJfSQfX+1Lakdz-~h?W+x`r1@>O|=^C z8#u~1!+H30)Frwyc->u+q~}MI(q(i~1+M8t&;^fBhn6>CEzfB@zA;%c&P9fN8~eO$ zZ(=2DJ^9>uH!6cqgEQuC1;;3N66c*Ei81UPU$pm|S1DtUo)wq2*I({)8+2RzIw75D z%bHk{^figqi)DD^8O!9QXUm&g=SO9edL%|0!b!;b+*k0r#w&%ddwb3yEb=TiEOsrF zR|dzQJAdBs8d%{AZroD*{&Cc{aht61`sJu4jpc=pZXd7g>F?ESBPwD_7IzZ&JnhSk zJ$;wEAcGJxRE(AMx&FgPfkAZ(GvcSy-%zYwLNE6-egsIfD6?2TNbj5$^U(>MUEF4v z+!ka}8@Y8qxNHjgUg(wpMnLwOcIsNHZkl=Oo~?`R3zK&m1D}>Af_|e$g<$E5aO*&W zb&J!2sC%MLPekaMjZySaKPOg+Unlw6YXfA6FBgdmZB5e1^hJK9Qxz-$z zwLUP0+NO&P@7s^xB*Kt~i7CXlQ7lp4GF3EGRi_btaC6Dx zc0PXl+&hpwke#%al<>;)c0PHj`5SNLXlHAu;LF!o1$l>!OMA;L0b>CIKXNBwCbPGN z??_PGe?8qa?=Rd-;7v%N&_a^ef4eG3k5ccO!mfH|7XS!44gfwJfL|1fC)ZI?2%Mn#?_1>Gft9uh8N#U>^qI zu40vXrzr>9t`FXu49Vn$Zt1zwTQ%+qfQPOIR{@Y%oR$HAnGG}p8X!l#NI_`-s8r-Y z{b%Iw?gu`9M-I6D5%~}0zl~J!zmR|D`#&lFsaPHnYJ|@BXd3Mg_{$Ga#c^YkMB7&92x=|tPlYrh3>1quC_gvnq%TCy?&f1r zaNq4tNIy}p@sReT)5-QzLpKiBY?ZhzU2~ZVNnG(--}$1PerxU!wN*NLb=tfVY#Gbz zO@^0WGz=ALgVPxaB4M}%)H58GDJnI8#QV$U+(#w(;Z@9qCy}!nlDhN@s0iGSwcLke zu^h{~uUxYqxUJ6ZwIVTv&W(x{FNSA%mTi=wEf@M$= z@M%C5vXlFX1oBTt`U)%Kx*XM?eQEqc8%Tuc*37d$eEQDKFNV18ewBc|Ub{|~&fKe& zvffvF0w;Y)#=lfKSRAyzMN`XzLGn70LF>)=^|H>_q)Kv3V+8KV-#n{L4lpC*<#d#L{mgMkCW>*f>dB|CsENNT>|cpZ!RQnt8I8M zp|AweP|7W)gP_*F^aIs1c~^aI*CHSkLRx&kLWAgVuvhGGwPA7;$UVrsypj6?t(p1c zWq}aIYNKL^-tYJye3#u1Kc*wLmn~K2V;l0&au4ITIXF*00HY2&nXED=oqQy_=qLUG z(+c+#8&OpB)n9a;8@WS3_4F}LfvO^!;(bXY_!cT}OC;w{s!g$ZP&^$nWB~ijBP=Z9 zu+K?!L;a~KH<)YUjM;ncwxgO%fbc;A&epElRAKm>_7ZsSYyISXHxBTK=|1eC(T6OiCD`Wtk6dIFm4PM_iU|MO=mMo{Ci*g&$=$c>xoxIR3m&PWP8SN#m5fTmN?nw zHmy~xK-!f(eZc6`Spg9@gnPllupCW648f!7Tg#Ly`3J+a3t@+?N(e;vc@=g|{Q5vW z78vC6`qY>oJ%2iB=IQL}O}ccG1CE8haiP2qm4mJ?`s2UrOa%s54sX7;cPH!;mv@Z_#G`c5e)rfS(V_5 z6{~y%$N-X;faSm0G43!;5LCf!WvL5s(AAyB$asK+ZyQ z2ZUn5E)5+43l^X~>s&@HSbAud&`+UCJcphh9W_DAEZC1nC{b z1dy&215$FM=bm-fy5D#1y+7V}_Uzf^+0UL?Gx0_Sn$#3*6aWBFYip^Q001EuUM?Ub z!T+U;rg!iIxsR5WKLAiN{Q3xhoL5%>fWpuN3^p=y_YUy(clY+;(guUMeEhuKJRZ0L zK+qiA6k=w&!K{E?I#kt-gT2)CHen*;GEq%{F{bbdg2?G~;y|xwnT$K>)zvSt_ZP$w zB_+WUnT&;~o>9z@VnA<_qTa?m`*^w%^44>z6}vWkQ9rG?UU2}g9U<)?qsq{dG?s=@ zm8xE){~U$v>07~wC`VB6_yBZdwJsq4b8Z6Q7%DG+^LhvA2Y?`GoRSRa(9i7<Tml>hot@Btkuc!EAHFsYz~IN( zAq0TUOAr%5K?=ad;2Ng}xZeRPM(#dS2Q0+^MmOCaIbcQ@5Yx7B(*mj+fesWMWeq?^ z1&A5PMc)7}g#Zry+}uIH(`l{!i2B(;5-OLQ-wmwBsI|33vafQ;I2D4p)XcP z%6*gpU?l)LdLblQ%Lcnc0`t0f!@GOQ{T^k(BW!|O4XtuLP_Qv)ap3cd8}-*O5VNzZ z7|e`LkE)I1M~kovNSA$w#rcC1sQelB=<|m!JP{Ih5t^5dKX(ls>J@T~q>?{%T3Acg zJZq%HopFv|@6mQbSPC+tjW7EqspTXdNEBX=S53Xq%R7d1`LZl@N~E|f4OHJ(BnU|n zF0pea`k~8DXBp7(1q%TCE#93I0%Sxm_o$VTK-`|vxn=<`0CUq$^#y=?YCIxlA8VD6 zWB{O65FuEt!hYC!MW};>qmy`{lk&_#=BX-APnRm4DuoM-!_VPHMWm`g%y2cQpo8dy zGN)9Bv3pFK4~(j-a_X0;gw|+(~3C+0n!wI+iJLq#<1*Lc+*j};l#8|1XimA)4@g9w#k6XQzl^9cR+ylw2O~;k z*`8{=q5R|$AfA)VT#)<8uZ~S2QRemfr*e1NxnxB!Qmo_a6;jEb2Vx?9-Ky_z36ZBc z55B)%K~>(zR(-dEs3rc$dE|ZIrOOfO9po~X0#&&juc~NS>RB4hXq9kr@JP|mk;{@3 zJvHv)zn)g2TgTT-f6{ZsNkTlT)uJC|yV#xJQ=fay(dqAMt`v`~4qgW0%J? z#vYn*ZwQs()_@D&@8$1o@rQ>hPk9E zx|Dn(qujgN7y*;|MkBicowKhly zzmJ z&}U1GdpEw^U@wx=Lx{WDdX{BmW>}VMl^d69Zneo&?G(d{+SFUDP9tbkkUIRf{F;zt z6fu0=bk=mSn4*|jU*Yyql}MRqA^YnVwZQg=#k*N~AMU~O^t_9gp0ut1sAIAI;J~jt~^aajLN^A)OfBzo9NMJ zi{?Rl^?CKZhI>5=p%}56y4FgqlX+G8h$f8l`WmCAU-Xzp1Ynqox9xV zU>#&F)KJpUhRu`aUOZD@TMZ7pY2XlZV3SF2G8ujHL-scb2xFGd)o8If% ze;Y<8;Kfmoe@H6-MxK?V|EKPL@Mq)IQ6shE2lm|_;5%lZSCsM~X$AoSu6@PSWv_*_kl24o^+o*V^bl~U$*ne5= zr&@;EQZ7W?Q0|?uj;sZOSq->16>X|5y2{%hYvn1pY0sP zeu00XM2E0siT2z1Jb8`kI*cx6E)}^fbUQ;?FV5iB%Wo=lf+fs}y!#A+yh#*Kx;VQa z*F{HVM&o9{wt`m;_O%4{gHyLtTBV=x^hy>Ats+(u!Lt%`rg)pb(T3f|^xf*%jC-W3& zCgPhhcS$Pbo1QfYdQBRZ?^tA3LEHF(^*tl*b$*QOtS9i?qBN&ijSkydnBK87v=p^k zu6O(y17}xcihowcIM0&F6h0%c5VXo3>;17kd*NkWX?YLAWyEdFZDVaoIM0SAqbzeR zljb4y>|7o7^4+?fqaW(?qM5@2^DR*gV8q*Y`KDIa;sMm~9VN3r%nr?dn#t^rE!I0u zA3q%3We;inA+K@yD- zos)9YG)yBVCOO9x%uJG}ZfG-wBoDfdY`>HwnIU2d9Ij1&GHqC}ZilbATOTlNF^Veu!Ny%G1(K#?1@R-|( z98ZJnk0ip=;bBmblLd$QHw_`{&Zy=4wBCEobO9@4>bQjUJFRz6w);&1`!(~c3>Hlm zIqz=Udu;}6%3q|78zNg?wd7PGY&{XX!EN;+ZrBa>JXzG@VcV1M%($t^JUNBMwu4}A zY%lg`nRyZF$A69*Y?%$@->qylY_&gB-cgwaFUC$P*<38l>@9@f?+7e77+uiBl0-+1 zT%;T&(}IbUvy%s7sAIPBZYj#ieNpl|-#9A*~AuVIW9S{NCZ+)1A)1g+R`|x68DKm{6{80i65E`y_04xdsPH^~f0{|Y00l=mM0Nl<302c35 z`(6zIAZgcDQ!xvg+g`LmrE4*g7(G*a%kb%hc7#6bxaPE!!I@@)Nx-3!CG7{+)?s?x zg2N#9x)T9#YkZRq|Ar+43Sa;rzy-hv34e=t%`fr))%=?|-saylzheETkbf=yE6HD) zf9Ct!kpC6a--i5enEr3!|0|}yW$v#4e~alqmT7zQ{P;(&G3=zLMrgnh$jiA_1^c!} zeEZasvX~r$G(7+ltPHP+ZxQO_&M5kmk*l$UUF@9imC-PyAMqs&(iv~iNmHc6lVts^ z3I;n1dH@yRvR#}S30k113=ri}+=+Yhy-i~c;*{!4x(~)L(%v&NypMZ(4ZBU;%yJoF zZ?o(vc;*kW^)vV3usH!K#h{u9CH5k7CXHopO>PrbSr+huQb;)7wqe_knlzUK*76wf zRv6?rR(tOTt>wCcCC02m%DUAo&EA8eB=y##Io;&xdt7#HQHayTL0Y^m-%#>VA<=2i zwCvz|zVS)3AEgx2)q~Xa8;jr7&?g4ZCHHUi{D3O%aI^%iu)Vy7N4X%Tv}>en9Y`j* z{375{-1DG zv$`6x02&GfkI@r^OswZ48ZNNT=?jZ?`wQ`GoY9OnAF=K0K(d`I zVPb#beT#tEh7D8&fL^r~++UuCE8-SfI&Zi>2GvI`G_$v!TCk26U?+aEhVCSa;#tAx z8qK-piB7nKzG;XUbT79^X?~sJl|j2nzT~#19RPAxybBuw!T^xv&~T96uI~f3_74k&iP)O zKi8k!sQXvDSwjbDiXgFK;}Q4mj1+JNopGE)#tGqvu7-{Q?VS4B8o&33K+bnY`oWPs zdnIYiSB|{8i5)2FDrO0Z*gPsm(fOXFIv(tAVe@(Lsq2OYrcR8}r;hmDMUd?% zYPaq 5000) { shouldContinue = false; }