From 2d583af044da3b6f535b791535eb8cfe1e5acb15 Mon Sep 17 00:00:00 2001 From: aallocca <16933662+BrickBios@users.noreply.github.com> Date: Fri, 8 May 2026 21:59:15 +0200 Subject: [PATCH 1/2] Improve game engine: fps, gravity, vx/vy per object, onCollideAction, onOutOfBoundsAction, Tablet layout via useDeviceLayout hook (2-column modules, maxWidth), Module import/export as .afmod file (expo-document-picker, expo-sharing), Error messages reduced to single sentences, Remove mock toggle from settings UI, Remove all console.log from production code, Update README: logo, feature roadmap entries --- README.md | 11 ++ app.json | 9 +- app/(tabs)/index.tsx | 21 ++-- app/(tabs)/modules.tsx | 149 ++++++++++++++++++----- app/(tabs)/settings.tsx | 37 ++---- app/module/[id].tsx | 5 +- docs/screenshots/icon.png | Bin 0 -> 1326494 bytes package-lock.json | 48 ++++++++ package.json | 3 + src/ai/aiClient.ts | 64 +++++----- src/ai/modulePrompt.ts | 33 ++--- src/capabilities/linking.ts | 7 +- src/modules/moduleValidator.ts | 15 ++- src/renderer/DynamicRenderer.tsx | 26 +--- src/renderer/components.tsx | 203 +++++++++++++++++++++++++++---- src/types/generatedModule.ts | 15 +++ src/types/uiNodes.ts | 49 +++++++- 17 files changed, 518 insertions(+), 177 deletions(-) create mode 100644 docs/screenshots/icon.png diff --git a/README.md b/README.md index 4b0c06a..5afaff1 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,7 @@
wOu%@yS22EGyc0@WH%hAdYT+t6S>sj z7dM*qq>#>AFOvNhU%YWz>?YUx^%rB;^ep)C$H0v@re86g7*;3jXj;3ER$)Ct=x^yM zVrvT4M4&(znT8O}t(#=u=q%h1qWm&P*q`+ACI8tTr(SB~MZ?(lEF zb6EGk=_wLB|8=OuY|kPux_*RJ!H=<<7G^(cDgR;6n9nL$qY0UNe`j=3% z&5F+X)@f6Z-#nLnQcZpPpYJIWuO6 Jg%{aJ0Qv2@nids9_ z0~${~t>eaLMpYT+A3D{NvLyK@1ES5^{EAfnx95OkvWI($hK}0$`QsS5`{!uo`A=r| zpIUiBOx@ja-ZvQgO-}m0KjHg3hmZ~a e zzk63P$WKwz-`7(>U}X5PLH&vTo{?6hJp0`ztvsvIL4|&mMIOKH<;nh4&Ha5ZPvT$i z<@qDWlK-Y&p1=I4|Du=YuRrs@>*e|D&;9RvdH(vd|8g(SUw`C(=;dMk>xPm){>=AX zGQ+(*A6hifX7|V1dHzjL(O)0Ohp%S%V}tlN4LyH-5Wnsz`tqaI`LxgGR}F&yV_Wl= zyPW=pMIqmpINXqJ!S)Vfp^-KC!&|2BzBmO9XrZ5fJ^Vj(cMc6E^H&MsKQ>|gkrf$k zeL6H(c;>>8mX=G+#|||-)o6W~-86Dz&OY l!!n&S2mVGdIv?#(Q17#c980Kkcs5((c!deQP~pRg^Bz zY&ED_xi0b8IIHN&^>jOV+eM3tPMtDQ5vS7a>>v3unwBuv1qJ=Ip6;X@V|!aQ)&7!8 zf9s6M=F6UooQ^J`=p?q-F!CC_uh{qXch}fQwX{9<<)-pl`oqs(x+H#GH>*HRoLbCH z5|NQfp?I&?e_lFh^yFn4Wwq0U;xe-)8!5&sDxU|_C-z!CJtoDoOo@~_LVb0yG z&7n=u)-| q?&zasw-m7B@sn6|cU= I~&c20_ED14>xAyb6 z`9zOQ$L~w=Wz>_nYQ{rf#)GhV`+2A0`Af;QV}3DZ%DVJpN$Dy&R6Fmv5&gR}sIt{b zA}JYbWXqRGF~0fco7zmF@+TZiVJQpu@v=hQa{>bb%$VP|GJ^Dj?C53RT1(|ED7(4m z!QH!?&-6T}abo-Du#`Id24DF-eeBy5Ik<`Izg(*6JD$OuS*}S9v4`*TD7oG o8jy#gy$R^&srQxoH_)=gzFmk}{E{%Q1YVWV;;lSDb0Nlst_gQ>(s2 zJ&p44r)+z=nG`Rf-QzHCcU$UMqu$MnjNk60 i*xaD*!GiFvny?1DD zhf>J%rdE&Y>{C4F3HjX*uYReVIOhDC BMIZVlwq~BWXtb4w`eixQ3juPZ2$4fYz@Z@wl z4+Erj&nY~4^5VdNQ85Nnl1QPLwiZ7>d+$kp>4P&pP3GpztD_sYC0I*|rnJvv!+VxU zaWl1RbQCtd7~k{!PTMm*dTsm@u0Zw4I}w-l?}T5*NK@rcXBCG%Khq<}$Xj40rJ0f| zr#WTn)a))*mQtj&Y(RP4%E;=(i8F3J_KoAU%)}PK21Qb8j0g9G$jEl(w9iu!U%BUt zWD()U>c?+; jxjBz;wX|-%(xLQ9MXQf8RlqNI6XKvwj`aBJ7?pougT`!SW`ZyCfEBAh2 GLd z4znc0fjGK-`F;z=ifJw?#uAFPjeGX()21kiA5W9h*2lALU?wcv?z`uNjcyfR9w*!7 z%gvOM6(U|#Y%k9}w)Ch~*?Kzck8&H%Y~bP`8&K?@a{FmZOLTHF!jDD@<>_Mh<%t7c zu2%R5zMOn#Q`MQs{*er!3S|t~rpzqj@r}cd;eD;U)F bz7h!fyoAyxSmm*=6bdjdI5H(u z*G~Puhs`*{QiHaqPro)}kdV?kf19=PNxE4`_oIUuU58h`l}LGlxH%JU(BD@R`C#ly zV^10uDP1Pf!%+&+Ft@6^DrV%^QyY6U_1DUlGpn;h_hJM(2ko=WrC=xXrZALuAyV(p zE?ALoZ||&|*aCN#D>IWtTnrDdf-fM8kjY>l5nzy2R&z6@=g*(dkTG_YI>C^w?zn%+ z;Yv*nLRe2+7Vi}Al%_bdd`U<$=ggV8uX=j=_P?!*d^>TlQ(^F&uFYyIp$YmV+99hD zKMUJupW2qX-RSk!H$Bh0Um=Dpm(uO;+#Y# w4<&tTT97TDs6 zG^HIRo)2{GD#d)I4|tii&ZN?N51E~Z%Usv(>}$&iEcUR6?_&%l;eFhLi!uuK7p#_z zCD97Gb@zezcGZBd0t4HwOu^utbQ4`2ohlj@Ajv-MS=rfUJebO~3DT#+@lL=?k#3bz ziSsFmXH1E>qHA-Tf|N%Rh)#{p!Gj0k&oL4c@H%eDNbzs~tCOXz18?6*vXlll;u04Z z7r4Ehy*z_)dh&DzH}xpRPJ4nh^~p;kbCUT7x3!O6v~Lb8&`8>}btc`e$d+wYmKhKl zYDNB<&WXLPE>1NM34DG3>-M-Y%%qCEiv4DM1Lyi*5?8D09`WYQo2O?Ycb&xL`t&k@ zk476QE{!3B4UV>!g2CoW;%RBT7C4G5OUZG)K8A(3f51yw-1vqhby>VOQ>J@P4!25@ zsfN^kU3VSUP<_&LF-6B9axJ_WrX fV7+UayLswnp^gL1AzzuKd) zIi&OrC-U{dNTIaD2@Oc~KOc6?4}JaOD=f!0>;(7Ng8jusa2}E~+u)Zrr_ Jqml*oSOIl#f=ko&0gt+kEeuREvR zE)Lm#6m|$RbG#EdIJYKZP=*=nC0h=hg0SOK*C;uOmr(6-{`{7)c)Fu{n&tPz?aX0I z%Nw^
T!M<(!G3+u6W)LQifQx$PI8=~hv&-SJ>mobQX zKroCgWCy3Ybns1S*g(JG;Tsa869EMD?dz?}mT=k+Bw@T;2K&b=G!2eJLhN^;|JZTS zZ?NLzo&IS^XRy$p*SOMd=N8NJ5|jcSb*!>sb}k@ynz5o}Ggm1PSqG5~Fi0uY{%ZXB z^X5lflTJ#fnI>cvAEL$~i%kh!w@y%l%CuzefWcTImwT&d%jMA`%Qb{JWX zLMEkwfK>!{*i&d|#S>1fw_ak4D!sRPi$dtDr}9`N%@j(>H`Y>82tK1=I0$FA^PDHt zsbJi e>D{SbX{*cDBjwqu zhy(a@ywaTV>yX3w35uVxANkr|v3=y5KznF`@RB%&X{lUG!DM&s`SHNU^8j2MpWh*X zYDRN!@9waDB*S~9 eliSfQ15>Qnt3XyW8Z+fJ|}%mMdeu%tIWG6Z8km zUtTy}cJu`J(DIPL4I7Br)60CgwIV5IaqSP9&u_V16gV D>9k{ z#*<8DkUm`w>FBP%jdKMPZjp>f=pcgmZ`hDvn@cerk#>|~qGe&Hg+*XUQUue&_VqPB zH)>WuUWs}D;3jA`{r+jk{1u%q9y$1C7u;yXhg8J#1AE$+8@+wu0QW1wuy21?90meX zcVmq!Tn8Bq0WX=tkO8_`c-=yZ5rIwWZ|#>sT#OpSEGLMBTBp)H%^J!7`gY^yrZXE6 zh^gQoF_jsE{hk9IF9R75Q!VY82vr2MdaJN%GXvJGI|rxfyBo6+p4*utnxKU1achKQ z^7z2CbN+`AID%E0RjIpX;qhDEFl6j*9|0W#HKAk`8yXoMfYl?H+_vEJLV6ieckk1} z8oMz4>TwCyXvr#^Wr%uCRh7*%wmyR9ayvt`6i3jBBB^`DZkUVMa4wS%3y z%EXlHt(9EtvJ3gwO;b}dlkIfFf_b$nSCR?b%8=QyAYN`jQ=IxB|CFUu1rv#T9ZA99 zN7+~&2G?IY1&EMd2CN2)F0n ;B`6eu4-Fo7^SQP-y*3-w55Rpz`!*1U{oPV~ZJaHn~e;x^abzTIc0P8e2 zD my6l@<5o^ zH_z{K01|xFDt&tL`Tax%fXUKHEP@4vzkYP^_L+^l(m99kKch6mqg@=C{a-Y~$`BLA z!P#*Kz<=z#fuSLR`9q|Qk(Q~AIBCW~#)w&D)C#Y1nJC-!ic8y*k gpL>27Zrs(pGtPQ`1Qb>=Y8iD&brpd!-w}IP->f1 zvEf*}kz=QJ;PC`SfiGZNG*UYB!GLZN5u>qszf_8uD7LQT8-7B5_;4#wP-d4yb<$Sr zknZw{E0Z``JS!oUnC4)Wm?+|w-8IG|*-0V0M0T3WUaBI%8A}7^$p!RZMz77xmIe*? zUmh~df=hoGe4Rhoa%b@E9p|G<2y})o`(|rnPeBifH=a%hYz`b8*u;qV1`hrDLAqb> zs|LSARDwBeV+li7IltegCU>FiGG;mAJhQx5Vw5wdysjpryQO^8ba`$47>6AkGnmFx z>*xe)>9|W|>vozpEh(Iy_k^S?1P2NWz9kt~>JXoKjdN}@vb!$pUD|yDp#!_y+~2>4 z=ZeKHdy r$!NH#dh@D=>Nj^-@)~6R3^EYJwD@7s1kq`V*{T+G>MQ z5M &O1+~=u`C-Ka*)hB4!djp~EWVF>6dXl{Bl?M6-m!;eF+3Ud1SF|A& z@yys(9*oS;y$JV+@yMlcCceE&5_17EB2q{0$KJ{eD5MZy1%>bK4m`o&DT>e1g5D)g z1w@Na5)q~XA$T7`29cx|KhX8`^h9bp#)G{ONRHe>X|`bu0oY{R2rF5+zOnjJ{a5_I z$~9%myIyUquwZKWU8%ow$J5Vm`zL;i6~?G?sf-hd4E}T#as5M7=v1L =hzwT0m=8E5si4mYc*L4)%9vfR zAW>O_6z*TlECI*_^xm>%izM|VoD>TWSdQ#&XI~Ugc(_u)SK`!U#ArLnD;fRmZtac5 zTPpL8C57}nzM)3+L*AQLf zUI~@PZO!wr!VH8lg3n{d8Y$u#Bn>}BZla2>4DTF);C0A-w>rrH#SC7;%MIH|A|`?E zaGKJ1q%@>j58&e@jw(YYZkeGBorWZa?RF|xG+yLXu_T!@ZP7lG(U%Zi#8HoGhjhSC zhJ+V@0`*@z`=)*NKI6zMB)Q5=hb6Oj0scJkB?BW8i$X-N5`p?e3CZk=9DF|5+Td5p zPE$RBM10V!oRCmS3d=S}+nG-k-@e_%M_dJBiTPl+kppd!nHI5Q=$Y=*@2|(oSZLbF zV(&5~yG{_o90CEeY)%dQFb# Vh+|M4^sLWh0_T?h3>(QjLcZMxHnxS#j|E#=RxDQ@m^_2T3QxXW>|_M zS}xCef|=eokB*qD|x`6X&E%sNvJ=VppB|t{{b@c+hhiJlC## zr3^K00m {li&(~{ZwYIKjLe3Plg&E?A J;5@WGov*8 zLSLUD^}NS*hRh@olI(!xh(_(I;zJZ~T*^u_C<);`jUjU)2lm`p6B}oVClCUG*g8 rpb!98+nCFMCP8RTv(b{Meq|CP2K#FU z3FQL W@6mPrH&a69{I)?g6b%n>MYg`)gYYD-DbTVeW)-Zmp?GpaXL# z_d-%ZOxgR+rB5(0*_*mHUwrWeC=DU;isFjnbSb9OhWy!cWrQU&t9iMKDT*bhLd$U_ zRPbzRKSFWLrB3TJWM-^9+k(WJOQ>)$Uu&g+vu!~%f+;On9lcfk?CZyB11}C5gYIPU z dX^oq@fc`9)sd zq7YFrZa~$vHFC&>h|Vnu2Azk!f(Ib~jTuvyJ0T$1Uk7oV8hAc=#-gy7k7ce?>;N3$ z PXn$3_ eZauwMts zewQ_KoxeZIV`}0t63_#$swboa0E0YN+A*Qu6wzTj*~LW+?FrYQpTlcA2YY4@G&}ZW zx WyJwFbf;7fknJ0$Q->Orfn|;0awi5(h z%ArUa_jd^MlQN|M7#YwZFsFdYl!Ua;I9huQb)=5Ff(qdsf_~6@LFbSIF$xkD{hTJm zIB3Z=#U}vH9N>jcq~E%BY&z5eepp4FsRhwS8$4iF hM>XaDQTFe_!B=lF+Ei zTG%Y1kuYwe&e1b1*aZd#20ylN-@CEOkf0Lfx?2^Ba>f2C8(2D2w#IFJYQE!TyMnO~ zklzl%3YndOnCkJRsFo7B4cX9J1^VX*SjO(_`~q <4pG#LvkYmE8s&4k?n@) zF+;`=hD2&&C Ww)zesc ?iq=zMjo;duBv( fl%%rByQRtTpc;5@~BaDt8Nb{4c=0x<% zt;sIdO5!ZFd8+M_MM_fCn1sr6&1nTmgBg0Kp5^guyN_?$SNFAw#j}ab6H6Q2ZWmj2 z9lQG`a)&H;gxHCn6K(2qo)xH@a*yZTSw6V%VBSxgA3iXM_*NhQLA^G&|H!E$^2qA| zZVx#LDC#yB5S3DSrn%M*5$n_GgS~?TV^MD%6k@4PEZZ(6OZ96(z`fgfZ@y$>W>=w5 znzL~E5fEalGPBkT+a`y <8zr?r-mDF<1Tjbb3rHCVTD5H z9elZRk=)F5k2F=le$qw&(82|(BY_`M{HtfnZkO~;E%aDYvP7V0oQdWT`}D1`kGF&} zbIu>@SO H#_K)G=d5LK-}FFT=eh0>8C}>ii&WrZxfHomfo)?@;(^q&p}Hm^ zL$45%?La9I@D~- zN`*fCyW+lw$=mySbGGkzLP+X}&{uVy{XHv75Ae3SJgk;Y0k*Mbe_!uymwEt<5X?6y zh*R0nb;EIGXHV(il$5MuRCN)10C9(CD6<>}N{y*JjN#P<=|6cXo?b0FJr4I-kt1X& zB|Ax$P8 SfNxKZ0inxBlwg*!OziIupPh>&2446a6@tK ao`F?cPA_PiD}QK*+K zT#;WKhOPq;Y=+GDQD!O{*AP*nJeE|YIe(Ak+dDf1>io2-`+!GCRPbvej>?g;AAY;8 zdv!FL4NP*RQMG#W%E$NisdEj%sKTHYi9m`<90`OGTn?gKF)x8%C mxpNA#3#MHBJU!p0BPMB)7)T6}=kE5%1BqAWKw{a0};(8YvS^F^cJVb~(G+KREaT z6uD`Ph?_3ZSe)rnt~q9xW4Y}Qt`Bx2ZJrxB&Lbd8++2wie-6XuC4tlKC(f9PoR6uP zWMwPWb1O1gOGr71k3CNMHo9W5*7JF=PLX$Ey+0HpV4R7lbpv-Qi`Ush6eIl!DB4r$ zPPwqO=dFEXfz(|ScxLC1?A9x6fptJMeCNka-% (xD5J{f}FJNXN z*$bv+t=Zo0k;N5R?GbBz-|R$nV{r(Im@D%8oYx_6C2^WjQwL7U(GCK*rh^8#0Cu2j zr3_mDEO_6?x@>UZ`Cu0+0k2-Y+U&6eCWn;)9ESxrR%c@^8>=ry4sf;)y!`V1GqH}R z`8B;y1~*+m6d%tu*+S?JAlgvh0zQ)Hm4>XI$qQY^$G`9eJem}c$=%>&6m>>0QwD&B zA(KzgH2#OOXJ3 C-HP*jQEzaXIJhiXoDk(NkLc>ezjfBHc6m*)x+NPjpRks#G!-$0CeDfz_*!=BN z?U^q5_RbV-Bz0BN?$g~~{2T?{t(ECkWs7#2u6PcOIsDDDlMAnNteM|il`(fXkCYir z-waPbd}BGvvQ_szK`I>Rc8`1^XQ7 SNryREOB8D?XC-m88#avG=LdGdN4@fbp}thbH-+b?d7>1Uz*i*f&{;` z_5 Zk!VLcJqK)VZMg2oY!;>1At 5r>KmHyu+I7bSgGJ2=2?qy?b>!$(o$ zS@7j^=LGeAZ{O_^( bEDuFUsQ~Nze%5B#*bx1Hl7uBhG4IunN;)vQ+)rhZ8U? zGtL>BPcs!*kx(S*)9H(hUhm#+Jg}R<|Hr-zMnpA=v%Sv;2mC~lTjc>xmQ$JK!NtJE z>ww$&((~5Jd~uzk6}#uYeXK_0IR@F{y9_jcQCOs8Q=eV1`#{K$Dqt&>w-`Bwh-8hv z&iQp%76+!}b&9$2C<0h1tntJKs*F2jkJhb4SqVW89U>UG8ImpPT_o=#nK1H@(xO~% z;y&8L-W%HAyTBdJOBi+p@r^whr39fuPN fPFNBc}<+Lq5}m3lE>H(@Z#V) zb`-&BT*Yd%#erKXkho?;3Xx)>j1{e&_bw7{GgPv|2;>;k=|WTZfrAQ1<|WXQ9btA| zvl^>GtcppjXClp`{cR_O#meN}I?#7dVX&ffu 2&BYA<{)ZZMH@iOvSi#Xb+U! zhd d0iXtlgqgNLut8p zZrMT)64H>AFD7wf9RO0#bx5b6O%r!JM3rsUE>hQxnNUZ{MQ2vzWTVo}h`45|GSghy zoWm 01Q=@6)^SOBvI(^SbVKHa^cChIrj&l~*yMDi5g0o;Xgv2**o|7vh@>L~c zpZ)?MT^us@pt5*uE{R$*NUYBt3L+8cgmhWYPy8Ns_VqGFt3pv*Q|ES&t}Z+XkuiMm zZ4dg&+&qx*_^d3tnM-Qo4=s>uBd$DaIEhL^o6lq4_B*9DGod_2V_H6ic42(KNmCu} zm|6i}D<&IAR-H6bAXLM7FMaEr)uoEyjBX@e!X3o@4VPr6lNQ##KH1f1*8@yABFEK$ zN2B7w?HI}<6;C*+B}IN``{GD<)5((~b NSIgY@_&mFZiH3R_yC4Eok4m+u1d?tcczw~VEGh)dD;Di2-^J7VsnWRHh z@1Vf}WjgYUxM;?(>vQe~iJv+*!i>p+aZ_s_{*)x9OWa+OnqD0T#S!ZVw<6#og%evz zv=)M~QPCiiA(RJvBL?Ce5sCRk;`Z51iO!wNM8wW*2K4Iay*#ZSKDMd=#D3jTsTA+Y zM2Cdqj7qsTTdfksd#o!BU0!e>6i3*O{49x9BEZ5U(47dZP|lqIpb?4t^qq`+qmS)E zWDS`O_W|cW%mWNBW@OgOB=TI>2Q6f-L&2+GHod6}+4e-+WJ1|$s}i0NRXmT^f{uXP z65HLE^1-SUjy&>}+(lt+%`_XC;&|v6;k5SA=zu7B({9srg5>mi?_8=Z#z*K%9f@u? zw3M|+>7=5v0f3Ts{k?1ESw~Cg79unxwxbE#>ICG*VZ`i%xQ6W5@a)?sFl^Wdk2F!n zLAIllp1QG-y~4XVsr{Ob)zE>_#f`rN@F^bPlZZ7hVfIBeMiXQArI$lQH#b)ueO8Ah z3%QmEms!O{>)+@!HAIf>^Fd~R)OvZ>oDDCwE~oQr=a$f3q1>bLHRO%Ngi(pfh#W9P zONX|B42rSpKn2Y2XU)1mHA7=Cpy=_kg;r&KeG4#VyWG`s3&$&w;RKvB0ewy!%IK&s z-Sr{W;;{Z!X@;aRQ8&=5VK0wz;WkN2xgao8W8=10&l>RPZjegUt-P;8w8hGh!i3E9 z%v3!)7d;#4ix;=#njj512l8nRq@Ex@zJH=Mih?>O1SQh4#jiigF<^=Wv`=@uw3d@0 zPM0HY3PzaN?vWc!VLaQx0bMOvzy{3keqe(t08vbf%h=jb;ZYtzwPdh)Mr7Y8Qa?=E zT1hUo!e3;OHcqFL&dWtceTbRU&G{_okSbBk!rwj}M1Y1)oogUtu7sQbV6a$Bg#_t) z=f4b&O|2?>dB1@6=JNG}{Sb6xxTB_!A~xd1(}X0B86y+@C}+-Jy$W~9qb0Ajjz(7J zq?!y s)e* G_HVU0Rb1al4uEh@5XhIikR?aS#Yp-P7Lx*3O|Ua zY6u68A%&%-H3+G@WlAkKkCV(Tsk}EMqXQkNF(`~PWJaZAiBsc7(L?v%Xq>$>)`Z{C zWk;47fQQly+zGE8ffi8&YDX2;_#(TlmBGcWsAAtwUSwq2I*p}T+JN>*3<-Dw*ue?8 zv#Zd Zb9eN$<6WqbMoQ7qDQ~~jTfSKb kUbDVpzq#3y*}|Iwi-)HTJ=fI z-|U%<%R~PZGE-1}{>q~0VgwEB%9V&!XI2Q8+m(-Su+X%ixvWONBt`^;3m_7Jlx@^| zSGef_>8QWB(#W*j|0p?MP^L?lniO?mv%~~uIbWap)UV}8vxDXbr=CB5B$~Kfz~W2d z+eZ^bb#fWH_b4VrxiD*`lFpikX!O3Z#uAdh%c2!ZE>dM3I8#9Y1zOTmRUi4HtVM7& zpEU&%ZyqxyRJvI^bv;q-KP2Ay1#HlLTsRb@v9m$?q|lrZ-X)&spIQYSVy)1eH&1j1 z-sIQ7Wi8@xi~$`=MEt<|r8g~RE|jI;IuO>j7Z}*Uf<4|td(^n-3e6(*s)4Q-U)_m# zqp`zz3u-(N0G&w97Kp)g8b1)hoiB4~MDHtGm|1Ly?uz0@fG)2zICL$4=^6a~T3tGA zFRdb$mVC$a%!+RKf*q4DyO1&oX^6B#tOJGPD~x4K>MlL=-E^X?pY3fKMH+<7v4t2b zvH@t-iH1N>dD4V}K0lPCC0MHb%*kv-o&$L9!ZPv_R^~w82ayIe@V-vMe@DHB2P78o z>0&c2D;>4GZircg4j{~8FbEpBI{{w)H~7*LKi%_bPmwLZ(F++1e`d(?^_viB(^xbG ze(c#kvxYiffE%t;h{gzY9LkV{ysJI)$T!~{qLQ|jo`+4xh_aN1>F|}4!zArf(Od1n zBn38Jiw|FqCPhyS3wn$s-3iTfI5$J8MeXDy5<$<)o3;C%5n(B$5Vnbe49akX%#ht@ zmgD3TkyT1G& O?#$o21}-_caiT#3#U(^904h={f3=2~1ayK5 za5AFp?SlNn1iIbW)6Pnu{Dk%hgj@7`Nm6%YFk}wrfOj88+D#uOz=R6e(S>yB(^ca< z7BB@#Nu)soDpU)}m?wdm_v6Z`b3%X2)Lx4iEhS324~g_MNp!DOS#`R89~v7&8{Xw; zcyAmJH71BYM4IPQUE~&&0k9~;!DB4S2$?9iSwe-gLza?6c(y}hZH>{JuSur@#xSsw zC|1OuW5*B}3$x>9qNOazjD5?urfAcfnZWDa4Z4^sIf-+^E6xny7%|cjQd?Zbh!jia zx^T!{g2aBHlkywdpFVCPeck$y(y-5xxh92H(Y8>|5gyUV#Ot;1+)xd9K2@f8s!@2w z Tp@ mP_y2ktS6*@boWo#z=nyEu6;J1>XRqpJ-YkB5~3FaZB{StxO4D}_#&dsIZ zFhgPi2LXY!#OM?~CB2TM^~A0o=ows_RGBDQ_1X*D(e7l2@;#$7$5jkK5BwXM5Z!W* z9&N(Dz?O7vB;zuOxgh$RB#T@Z?@Au_Z8$CJl)NEhBCd^E3jyprloX%|iRpYr3f~h~ zhMO|Kx2tEuXdwcT?CX894TAgkOOGOyfT844#gfJqVaJ!#YiT9nVOPL55xhvr5YMDE z&uY-s_iMU;w{Te%uq_qf*11q^LX0l_F1nH&s3U+IxSCmR1{A sGspB#!ahM~lL{E=|krFGXs^UIP>w79a2unlzp3 zpAyGMgt_rUh`SS%q#jDs;nVss$C>E|h!*UCstMO03{n<(9f2GT$SBRXd!XY3C4zcV zV}%47qz} 3xWI(%z6{(vM?*vZZa$=#?Ej^0!8Gzo&e5yb?{!XWp zjvBsPi0QM@n3Fgx!%Xr(53y e4#ER%jLSHnY$C)cJ%j+NP0nH}bILZ&~o09PW zQ(%$k?~0;WXfk9<>6fy3PE)2hFkNIkx&RSMu3!al7=v`L6F{a-Sr+H&x)leJfQxS) zT}C8oA_oG^Uqe<$5e|nEEb&|nPBi7oYB&g`8I=|gq;&lh4h9B;>S=E@$3ZcKcx)bl zsiYm*879n!jA(KyPy;9R^fX2TI9iTi26c2H6{_*0W55-@cg|L$km+|Fl&rVqk{fpw z6o7oFFMZBg+1juw@~F3Od-{CRoI9xm_uHJRCESZ&aUvI+OA~C#KP(D>Lo5l&fz(u? z`}dHJqSHm0*-}}>U%3NfQ=rs2+RKv&N)AX?q8P9a*9Xr9G(l^Z;Ar|SU#P)0(sZZQ za=cd$ee-glTYTi 0R zbw?i*wD9=K-FY}ADdwR~2EHVZ^lfD(V~q2zxvL-g9(Y8QX%JeGlp&gCU%$WL353Wt zC{~oL1O=Q)KwW``0A KGi!ko*)+hyx-@ zpI* E?dc6p<;-d#h9lI@!s?O*LpD8~4m7YsWOW<`N65zWD~I3`D#PNRGrv}! zlTEx96$E*x{f3Y!a0Z8{?FeM*@Ni1=aJ1-OtfQuha6y57!S#olg=SVTWROr&birF$ z6!BO|Du@JnkD$5_(N%N+kQ3AqNPy5kI!GHJ3X&(1IKL!2=PW)xKO_e=Fq|KSVvSRN zq#&G9M~a{#Ddl{!kwzhg01<9$|99h%5SoWo`uT{Iu%7)t_SBTNB~II3RC`W9rLlU^ zK;+H4u?zBEmo&WCWL#`{@@JC*)fHMgua3lT8~6B{VB4F>*dr-co5qPrtDXA={|_v~ z-wU86pI(({D5sZO{Hi;>|L`q4U8xIBbxbILV{>u-P8$a@C;OG0LqAImG#-9q1A-sP ziSLzlx|Ih}Z)SaO_Xq`HQn!SBPU ^Mp07QT z05za%4i<{E=%KR%AIC}E{X8fB9uRnmm_f9|hYxK|BrI=!bH84Qv&sZ5J!p#WgKTz) zs+=nqVL}QFFlsRzH(Qli+-DrwH>ouInO@R1e@nCtEMqOOijJzdkTLLLn$f`j$JDvN z<$U-5|8|NJo4APD& l@t|G`8JFdC2Yi$Nw-7ju(@(9<&Z;%#Z_*n%&}<2 z)s*vZ_ikEfBDrse$VN@-|9pRQ|9=0+?)!1yqps`w{T$x!*Zci>y ut}CnRV_Nv}5yL$9c7Ly_=r37ut7vPm6yq0IB$W zH9Obri-ZfGQ*@wWmKtdhIW+0nr^;ly?$Yu==)4#bbVlCyqIxF=+M6$SUSiSo-Sl6V z2Ln)qthuo8jgx2^>9Mnz^2x#QU%D&T0MZAw<4zVuOP5HCd$!B}{B<&IuYB}Ot&JOn zTp%q{z~+gCm3wp94 Q=gL=xL)P7RQ^z6D_V?3+L^$*V{a@>Pn`s$FF zfl>jnO&^e=?o(>)`G7NVO{&RKJu0;b*onp(oV%7T;sC7=@Z!^Cs71X}X3gGzGw{N- zxS4rK!}h^T6`GOS)vE5O-ONS6C(gEsH@jBN-tX;EJvGTelKkm8a^UsnBMF>|*KSj| zw7E>r+2~<0p!{nVr7}5CrvW!PQ4cLn{j>s=EzJN>qh^tjtB)_!Fdn6n#3@++z4^WM zhwZKc$7oJVJ(yrSUpIPi7H1TkRm%wuF>Gtl-`9%%JgVcgJa|^ZHRw3We8Q%-ou R+~GuA@(LzHa>7Js4E*-;IO)X&BUeH3xIaa zJ)9Wip))Vsl5VAqRlLTgOLJaWS9fvHQJQ(Klc5yJh#;{67WqIari(ny6UZ*TYQERA zx)yfYc9#*$(k@;c$98C+B4Wi+0+ocMr}gy%jjx7HGgd05iAYgj{COid>wg6Dvm?yO z3|h$!3-p`UFF%s4rraHY&{J|X+r0i?{r4;{7WU<_c{k=3!`&Xp$C%q&~ej#wPb zJ9MUmX5lzB;ctD-ZEUA!yRVA7kkHDfb>s7iG57DeHWfbh?K*&yp!B@J$9mejbi093 zx6j50x;gIqaMt(pEq7;W)S_qKxi+qbeb}wjXlE s9bE9@$_P&8;DZ6$iJKT(XiY&n }DJGOGFbrefgU$ zjN~uGtU!V6nc8S+B>|J9kvk4dJK ()BC!N*6Wo&apPYViG zGE|a-z$;x!Az5>GHXV``9;Bwp1Zvx%8MzLZ`&9bTJb5s*`HzXs=MOa>3VxnBlJ`GU z*tA14!JzoDrAN!V=h|%dpL*aaQFK70wwaLw1W*{TD=42n-B_meFF+RZ6I$6X$}A9e zw1lwHuMi^;a0H`UTi^QK^FKkd`m9AmiN;tq^c;Vh`_MKR)Iq#x3ll~9b;J_9LdI1` z=j!hgF18pG8gHMLdjCN*41Ege!$Rg~m20Vm(;NoqW@Y7AZQp48O &B;G`@^>1ig33W8*{0`aX{|kJen}fUXk|lK)BExuWo&&s8*EJJ z>T)DW;goPd(-|FZ>De|+qs0;}60?yb+rhJ7m_JRVW!FxQb6TK4m1p$dql*9m@c?06 zxx@0Tp1Ch^I)OZ6p|_P3b>mQQjprvc?{7z;gB5BIaI>Xl$IE?swcvS)RY7Cj#l~%i z?Oc5=IOCXlb!KksUTu8+uERKDt`H?tngM~oB1nFaYc?P#4s8hsio55i3A4uZKfZ%+ zqfr6VLrQy+>o)*4wdu3VpYw}yqN^P{lbeOxz)tQcUCfr|4>NQ`_%dcg;SP-JR-Ed_ z Gh7gJU;>?j4J1vSYTSxDshZ%6_$V K!^5 z7Q54e39>QW`eKJDcpfx2{dy?6iyVcKz(qoZU{}RhqKgn^s7TI^Av3=w|0G)ce*cfS zi~D*Ima#w@Vk-ej*e?W>T>XhVe^2c3)$TcR5RMkRrG+1;km 8tQ1%}cc$Hof z_kf*Nx;9MLL9Ina7WlWUP$~*l7egbzX@{*e*vU20N+Wv-*IGI^^Z{PquB|@>Fd1k{ zNq@ht&O)PuNJ~< l z4~w1Q>C8Cx#q&%7hMz8Vd$j{}N6jbLmh)RbbL6b7Gx5SO7z#S{cr=c&$`Cf_% |>fu4hhEQZ%V+J?iXKu(Hm z@4~|grk*`Jd%st4)vl;JBKZ~Vj-U%be$x)19xd1@2NoO+6gJAQ=4 +D{rjycpbMaV~++!ni`>IEB}aXU~7`{USJ~ z{(DZfyDPB?qxy5A34@wcsY}U^LQ5yhT8c~dXWp;#b@@W_`mEu8*WC2nhqFhAUE9=l zmt+KK=RBQ_K~?3Or%{qlYdBn&7$TCbdsS7f88knC %?CL2s1#$Py!6wZ%s97>M+ zD(OIo!~7IkOh{!Qys{pIG)}aXbF0bhR(@smY_D0YPBd%>zsxT|S0)|^a+oD}j C=Az?MEh7axh&Y`TN@3lA7U H8EFYr&JEp%hkzBqX74^)sN$G|>%6@)P?Pjs(+b zZ{Uu>Iaf<`ls8j(8^F-Pfap|dO|V)4q(G9}mp5JF;G6c0o1^UzL9F2Iwst%Y9|~YL zOxL9qb>p!2L4!q#2S?eGdo8_M52NuQ>qR@VLr70YP@^G*i9rF|>)rDIIItZUyL1je zHKcF5rLSp*rTgZ%!4jx6JsU^0B2squ3}dD22U5!79nCH!JO&qDq4^{^tOXfSl`VFb zN|JMU#KP*4&Gd$IL#}9=(f8CJIJ}}av13!*Ld_Y0h2OKKzuz)mivmGMjh4E%f-=sc zGzz0+G_TgU`bkwaTz5`{7o5sr-{fBE=Or{6Hlm8s2af_If{ %I_)@oeaPq!M)&1N0g W-h z2J_NOyxUQ@TeO$^g5rV?!fkBXF!Un52YA?RFNgghg#>BIyLfBxN}>5ORxH9S7`j6E zwNQsHcD^mUgs+q?q#V`=wJ26&VUe&hL^EqN-k=DZ@ASn=y~{jxJO&;v1uNU=QUqJ= z*EEh>%h>q O8&FcZR5~42gPK4O>2-@%%0L =9wYZF2h-I*dYP^fTX^vXh*Ilre0G&+ja6b;dLLs6eFb+__dkR!$j&upq2~(C& zy!d%?+fIP6vHht6Etwoy2&+jn)1c3MiVc&bTGXB84iwG#N!v55n0m?ZGHg L`^STo0EA! z)||!4b?_l6Qth#^l5>i#-*0-hqQxIi17&$4FcZ^47OAJk5Xk$L5NMHZdGO0L5rPQX z#*fas{%i=fB?QZ2n%Gpo>0&a{1POsj&(+i41fa75DK8K@#fnTXU-etre5W?LZtEZ* zpD4sTu@M73hd|LsCVqRKkkcSAN%ijsGEux&%@!L8X`5SUmRR0W`4B<)J1yNjK3z~C z{R->}li4-p7cRZ4@7v94JECk^cJ_3TF#}D9F_b>oH;?cphCa1Jy&opT# xp#An5LFX$M+#Z3FP&ZAn-8~V zY`**3k3U207ubDwAuE+mgti~V8pbe}m811Wr3}x^UpxO>hWO6kAALj{q@TG7no^qk z($WMbc@-DFsVMXh6soRhi`cce?L0N HrH<~XiBTBvth+Pmy>|ye_S8SK_$((z)f*e<`0YgP_nG} zJ!RxK#H@TVsIjWKzW;8!`K7wMuV;N=dJcIHQ^Rv-AlsK>Np``eOW@&l-ELpzhzqtI zdfPG%>WRz3l|L|h>x56oX*?u3I{g{=I+bTOf4{eD2dj9Wu5=~bzw2vC4Z=1jA86gN z`Uyv|TY0g(6j~0;{eP8Onm<8q$Rf@Vf@0o$8?@!=1H4%f6Z=H{q5*djul>;ZI;GcX zj>#Tjn)5uAB{gXUel7*gP1GPBC{IHqbWw6>$;2 $j=$I6qgW!G4qOA9Qe{EM~Ru16M&FnGvF30UJ1dk#KXqZgS4@eco%( z`AKIpz&OT6fpY5MWNyU_uuQJ^HSHo?Iw6*@g%CBi_u=Hw^PCXnw+8P9EzQgr?7_xk zr0YJ?eL_|fiw8V_?AbfuIgzK#yaq9O*BM_Br-tI_%%d^<#CFtZ+{AK(W 5k zs0{+QRH~M9HHD~j(=|mTV@?ten9A#tpE;QQz2w_FOYe0ux1xP}H=6kTIN&REi<}7n zQIq9#j{PPSB1%x;_9|vuj-sPqVDBUTD7JS;7(b`62!>|;vd^V9f@H#;5Z;rVQ%R(O z{{S<9e%?^?+n FaHFAC4F4%fcYB>5T-OE*_KSto>SwOvvq58TMf*!a!tmi z+xE^A@TAf$y@`(uj$CYX;OFTysakz+P=F9+r0`;y=TuqAP)f@oPNcghPK*^`z)B+W z2y5MB7lUb=7Zm&qTOJVntaFg#Q48Jn)h%}R<5Ua?m=e>lHRkTr;?(8AH 9XbC$WfHNpxaoHVJV zP|dWxi$<0yV}h?H$4S91gCQJ8LJwVN4$}TFt_-$3n}Vq)r8UR0(u5{1CfLrssjS=( zefB;dge$REG3wf1hJv