From a3bd3b6933307a6af4f63ad820c23c8f3f086781 Mon Sep 17 00:00:00 2001 From: "Squishy (C6H12O6+NaCl+H2O)" <106439598+SweetSea-ButImNotSweet@users.noreply.github.com> Date: Sat, 13 Apr 2024 22:34:57 +0700 Subject: [PATCH] Not a big update --- game/VirtualControl.lua | 137 +++++++++++++++++++++++++++++++++ game/VirtualControlTexture.png | Bin 0 -> 14338 bytes main.lua | 7 +- scene/game.lua | 2 - scene/name_entry.lua | 2 +- scene/training.lua | 2 - 6 files changed, 142 insertions(+), 8 deletions(-) create mode 100644 game/VirtualControl.lua create mode 100644 game/VirtualControlTexture.png diff --git a/game/VirtualControl.lua b/game/VirtualControl.lua new file mode 100644 index 0000000..ed068c2 --- /dev/null +++ b/game/VirtualControl.lua @@ -0,0 +1,137 @@ +local gc_newQuad=love.graphics.newQuad + +---Get distance between two points +---@param x1 number +---@param y1 number +---@param x2 number +---@param y2 number +---@return number +local function math_distance(x1,y1,x2,y2) + return ((x1-x2)^2+(y1-y2)^2)^.5 +end + +local function mDrawQ(obj,quad,x,y,a,k) + local _,_,w,h=quad:getViewport() + love.graphics.draw(obj,quad,x,y,a,k,nil,w*.5,h*.5) +end + +local empty_quad=gc_newQuad(0,0,1,1,1,1) +-- A table containing quads used to draw icons for virtual control system. +local virtual_quad=setmetatable((function() + local t={} + local w=180 + for i,name in next,{ + 'left','right','up','down', + 'rotate_left','rotate_right','rotate_left2','rotate_right2', + } do if #name>0 then t[name]=gc_newQuad((i-1)%4*w,math.floor((i-1)/4)*w,w,w,5*w,7*w) end end + return t +end)(),{ + __index=function() return empty_quad end +}) +local virtual_texture=love.graphics.newImage('game/VirtualControlTexture.png') + + + +local button={} +button.__index=button +function button:new(data) + local data=data or {} + return setmetatable({ + show=data.show or true, + x=data.x or 320, + y=data.y or 180, + r=data.r or 80, -- size + shape=data.shape or 'circle', + key=data.key or 'X', + iconSize=data.iconSize or 80, + alpha=data.alpha or 0.75, + quad=virtual_quad[data.key] + },self) +end +function button:press() + self.pressed=true + self.lastPressTime=love.timer.getTime() + love.keypressed(self.key) +end +function button:release() + self.pressed=false + love.keyreleased(self.key) +end +function button:drag(dx,dy) + self.x,self.y=self.x+dx,self.y+dy +end +function button:draw(forceLight) + love.graphics.setLineWidth(4) + if self.shape=='circle' then + love.graphics.setColor(1,1,1,self.pressed and .5 or .05) + love.graphics.circle('fill',self.x,self.y,self.r-4) + + love.graphics.setColor(1,1,1) + love.graphics.circle('line',self.x,self.y,self.r-2) + elseif self.shape=='square' then + love.graphics.setColor(1,1,1,self.pressed and .5 or .05) + love.graphics.rectangle('fill',self.x-self.r-4,self.y-self.r-4,self.r*2+8,self.r*2+8) + + love.graphics.setColor(1,1,1) + love.graphics.rectangle('line',self.x-self.r-2,self.y-self.r-2,self.r*2+4,self.r*2+4) + end + if self.iconSize>0 and self.quad then + love.graphics.setColor(1,1,1,forceLight and 1 or self.alpha) + local _,_,w,h=self.quad:getViewport() + mDrawQ( + virtual_texture, + self.quad, + self.x,self.y,0, + self.iconSize/100*math.min(self.r*2/w,self.r*2/h) + ) + end +end +function button:getDistance(x,y) + if self.shape=='circle' then + return math_distance(x,y,self.x,self.y)/self.r + elseif self.shape=='square' then + return math.max(math.abs(x-self.x),math.abs(y-self.y))/self.r + end +end + +local touches={} +VCTRL={ + button:new{x=50,y=50,key='left'}, +} +VCTRL.focus=nil -- Focusing buttons + +function VCTRL.press(x,y,id) + local obj,closestDist=false,1e99 + for i=1,#VCTRL do + local w=VCTRL[i] + if w.show then + local d=w:getDistance(x,y) + if d<=1 and db_bxorNDI;+C8BgUBOy|f(j^ij-O`LSC?Xva10s#2bO}f!gQPS_cZoE7 z*Wmm9_IK>P|Jl!TJP*UoeP8#w*0th1*IE;yuKJYVHuY@?1VW&wAg2j|p!Gr^xAbtZ zz!jyz$pr9Au(hnLx}vNsgOiJ+m9?EE1i}{M7bB_A{+Kd!E;r%rSCQnbaM{oe3yQnW z9NHX#AwxQ^Mq8JLps$9aKi7)fF2TfxlNS+k4b+R(-VU563a<=``}8jU#8~qc$tGQw zWaDuYx5wNqnW9bsc4BOS86p0j;CSw0rB+=G;@pQ!O#FQcmK3gQ;>|k?i|59Xu%ps* z*Wl4l9T0>ZEiBZU)R7qJFp0J5_cBJ?BH<*>bLcbP9jJ@({>gjS3CjT3TPrSpHI6&V z%k(vU|AGI@^3{IJ`bb^g7=q|7S?r3veu0FO{Fl zL9S8%W;W%;fh)L93i_@P2p%cwzgv)xX_Vk1wwvO!C)jHk1OyLgj|F+yArJfA3Xm}sS6#GYki`%~`wMj)uD{65nYFWE6 zj6bEV5Bes@b{MO7Ptd*%rR3$x!?PjR&>0{IWwdlSR=O+9Ch380k+XSz9+tTKYixVg zXLhygJgtk_ixs05dL~tRE`dB0+dcFb4iCQrq=P^_(ck0Wy7?qch5GR(6Cd^Cu{z51 zAPj8nDPJPuU8(TX%CM6~&YDFEj24P$FC30%Akx{aNrwQ0Bs%g74M(59)D>&Zq@;^_sEYK`? zKI;71IEhylhcOuKZB)gAXT}3#V`J^>>jb5cor)|E{IOC~(_!1*<%+M>)qI{{9d{XZ zp=8Yhx8ChzoA!fx_sv>KM`ESXWBxDC9}SI+e21VxAS1Vk4lOxY-i0r@i0U`I<_vm; zld(E_Icdc8pm~=+9IS$2DdSSbVOXug(f5*vATzN*Fc>%%B#@6$l%dW@Rp*OA#~W7K zardf5A~T?#H<>C5B>^FL6ny!(Pgi-FIM5*w;&|L1$bX-rdQ%3}_gI~kMYfZYhKBjy z4U8Mnjh21nSfUGCzsi}v9abwfH_V z+J1`P`|Iv`@3G&q2%&ih@kjEY#|rW&8I@XSy9(+PjmItfiDe4S#5mE1IT>bZQgpu< z+}#ksCy7zYX%oO#cn>8aAW)P-!1f?~D$KHv6+-`Lv5{GHMbYsI2#{^8svz~T6oR0~ zM@JEhBKQoCLl?}XWcV!DI1rSOHo`u)L`H(E>A5*11DXY;SZ}aJx1L^ZCH{%4eU;sm zP!MjkMsl`_LMVP)n&mgdz8OSBT&0PDMHb798fzZ;Pty=Hsy*0^v7yZ7g#Sjj_&`bF z-w<70T~zZJX8MV4Zf*){Y9GGV)byR4)NW1HsL4NlIuS~1QW~?qy{=Xq6A%zkKl>qF z_m?vf(`+~ClR;EqG-1>Z6M#w?O>cf97ony zDMdEoJ+!io44++zgJ^YyQ=%hr`hqRLyNL)?(snHbVux&CYP%&+t)-AzDSQjQSrVs* ztm^TB2P0{B4j25o%vm>A1%@CgZ(>Wn&rZ*B)>Y{9{z);=7^ z$VJjMJglHc5H!j|Tx6J8zvM-4Yq^N&JPyHTEDj3BWo`o-Ac@uBL716SH8Q9a{_6dR zP9o3n0^#-DF{msO>~X?}nmBR7uk!6~TkGJd`H`RLMD-6(#(xjSuzoP>b7^Fd=bnEv zau(!H`_wDr_$*4gd6#|MeVyq)%afQ<<@Di+u;GBGet!=~X}0lAW+X8a2eWEqIPk_! zyh38}!&`5Jezg+WFuvPlF-*MQ)YMerx&KnX)+q~RA6QseY@yVWR_&n#S!0CaCkvPl z+7j?(!Uy<1`H+30?Gm-+6pxa%AJp%}i(SQ}WeFxWqjG+UuRMB1n0pUDPadbwQ~Fcm z8}yKWZ&f_?DS)-{nMAX3&%a;d69;=vy!}+9@Pp3hZV9;m zPUfOs0-25a8;sA%`K7>dGVd4QU=)MfaC$-FX~T4S$-;pSM9mLUk?ikEvkXpN>?uj_mnB=_ zU|s>5wKkyV+CrDrlV_t@2%Hl`Jw;EK*&l4YS2jH8R*TKDf+oa=*KlLcK9fg+vKn>tvi%z6eCOY9x&lR#|_vh)Kq6 zM#UJUW(6|qOdu&U2qkt#vpfsJZzw1!<8k|Nvf?hkRogGu?`$@M-0xzX#Knga#7wl@ zi+R247B`Ow8)+hmO!&V?U1k*yc)#Ikg6!Id!}vWS2H3ukpd*X>#eN_eCQzjejx*Rb zY2vef8bw;4Mure+V35Qzs7(Z04j+Urig@1ocPZGS^CNg#iVAp=ik>_UqYT(RX(DN3 ziMUC0*1t=rJ+`^T9?Hl1(|Af_1%ZQS3>M+N1Ja^KL85u==jk^T7XN<%)8hLV&iy~p z&$ibAQXs4^#7_Jk79e9p3=OHaa0cv)biTwk zH#e(8^E3+-w6sXkO%}`7x3?1p22`nNXh=z7e5HWV6S{`4aWDt3u?$Oos#Jkdaeu?B z;5!NgM{?03-Wfp33<5&qn*s`z_7~JxPJR3E8d?f&6OQfe?V+I|rUa!Yg!B?@=YO~3 ze*V+|o??+%+i_c^9fEqqEwRq~$;6qx_HcsI&}5d|hc)`2`YWD`m?KzP+#tr^x3d2H zne!_`$19@?sJ*|AfFu?d*jccOfZ2*fC_7NqGS4de;l(XRQDqYzWjP1rq!AtRaB1yl zw#(J&YM9unO;7B7myWx--D6)2Qy4J&y~G3RTvvNVSJRkFHu<6%Po`q;D<_8~|1^if z253`+9W%aGRfQZ-xvmZ*iN_Tp!Fmo`IU2jVOjJ+AX zBtrN=o=iz^#lv=Imj;9%;1w?iXvA6@eCJBfl0~B0Yb}eVY;cX5cS&RUfB!t;zcF)0 zQT|!?YQwJ>3^q%46wfcL;+UtZ_gBM5dD0UX`t=g;o}v3QF?GC*!M=EdE&I3ue)RXR z5)78dp;z|!@9rEo6Vs`0Mr#0-t%awj9u_t>RT{>ESB9Ir`vQ_gMjhyYIQABVZ)^1A zuwQ@=V-y9I7CYZ-awW-Lrmg2JLU4KjJcg12cMY}#unq$GukIKDZpP`s04{3=ARxfY z$?4)Azmfmzf)gJzGjjkx_LY%%aa@;JU$}d$ei$iZux2y=y(^;ztBCGxBX*4TLkUsu zKly3!t5X2)$tG7h^ef~_YJcCJsCQ=%B6LGZ*Byw7XEEF8H8eIB3LOR}0zBuZBJg;( z3ZwBalL!iU;61S&zt7&@-eo{^HGH!kzy8**YEE5a_q(XqGrUapj^X+AF|^!e zSqW>3n5%B-4r*(U@dq_j88qAyX{f0!S_3iN5=f&g^<6HH#sSnqseo8pFGJj;r15N{ zs9#%EqZjRb(GXa0gT zYQS6$C2c+d{R%(M4AF_-`P7_MUUM)%h!AyK6@52r@D4ICy*1;(>#MK;=q8|=|3B>M z1+`1S$mr-3)C%DMjfZ08Wu`A1IyNOZR4}Tjs*cTQ-<%O~JU>lh5|^>Tuvh~Kl2^Oe zS877`liwMr-HMT-tF-#fzFyBt*~#Cz?9{FDy#Z3+Qt!5_D=8{$J@&KICpWjs=jhXH z-qm$4rt2~T^a3aA&8O@%G?db*=;%|OEo1*qu{v(GDC7`Vxq?luU)(k3B7LY zPZd_P`ti|ya`B?3k|{5%7C?C-_tpFbIY z{P@Ag!}AR#3~~GoQ*R3+cnW?)9m35I3>0NW@raur(%?}4PZ|#l^nafJ&tq2nsf;+- zeHEXxvtLEVcJo1Ep9>fEjsLlGJ@$tOv%SQ>lH2o=D*l9o9Y;hr@JOTp2 zROnZcQ1q)bYqHxVngyRfeFMDDD+2|fkfNd>M7osO;Y_ zCIMty5qZ&^CG(!~f(kAVq9xV+dc%N+=FQI1<7f-u-E9cm-h8Wx>MyaKUmqGKcJQ|O zt{X7?yP1g%wpmRd8hPs}!66q35MdE{;yU&{l=&fRQlFx(Zj#+>qrL=^6h!X$V8GUD zOW3EX?T63gq#*OiH&9upUrsEtq0^(I_mhlVBDN;0-nl;}eeun9ydX-D%;MqvrXxVvanzjKj|)cr0Jl*B*|m^yyo z=aYaK8@L6fOLa!$sx(P35Do_}k6~F)?#8{QIr!x<>drlwochYsr^kU@n0OP+!BFN4 zDw258LV;x789deQ5l9>2)c!Ye1ab$JD5Q7eD(UFxhNh=E($mu`UbLc-kXYN;#2RtI z`sYw4y*t|!i(D1W*M2coU2NJio4;#R@LW#r`>`Jh$wUjh1)qrM@T(;1M1hP!;l%Og z0=6Wg9c6|F20Z5I&a_WUn*L6H&ro@C!}BdHC_my)b*@sK?j zxG&VntfJbCh*>0xbjsx^U|4+>B80qLq8)L&IREsgcZ8;Wicz|Ip6uNFjPmda&doW< zsmq5_R)C^Hwf)%K_ctUmsBPf%;>ZrvE6Q27QSyKb^np<3K)&0~8AfEGX$b>Qp0h^Y z0%`?z!Oz5&O|~r)|5wyG(XxE_jtpv15^1V^Cv+>{gI^&trwfYi!Fw6gpNc39=0lXoOwC3QyYvJ&#why;S2)-x2aSEJXw%Ge`RX!3?bk3PR zO33H__oS>KKyVb@5*e#KKeL}&{>z@Z+kQzL`b@wS4*E>5_b$Er8R-(7_$#V4F{oDE9w-iCKO|zp7{rbcBd%n44 zsOS4QEQic!0}BA>lYMgGRlO*3CmvKDQ-vMLNkDXEaL!!Z4G#i9m4t+fiYmhWqA*LH zO#vhTBcJW6fVrZaoF{fuiLI@z3fEXu)gY`s>GQFlYnF^%w4ACI5EjNREYI%}<12J7tUSUd{#&+>LO?2xqvC^d*bx_+W$h79-f;4 zVzrpZX@spw+D;hNZ*coE;6X`#L+%~-o{qPD-`(*t$=s!0s)im)9cg?J&TU1sk8svZ zf7)re_CE@PUPwz`{u#Ehvr}mT$RVK1=H*M7rawc~8%A_bhe%@YjX|Z=dm9G_)k`w` zixlrpgzW8J4dgpzA9X2XT{Z{iL3crl<%E_JhbJRy8l>?*KJF&|$+Y|3xO}uZUi7j& zzq6}rbbqnS{CGjv)K6RTbSci}$49|}o$3YT2>%s_l3Puwn$RNKTOnm>QNsk|?yKn@g?R{nu~;rcNdQ&~TP~KlH`q;2m2C1} z%p*r!S1v{SgXy(1`(CO`Ir}btj5Uj`OK}@wU`ws~s$SJH{MlVS)}__2f}GRfvqSwl zYZd(ZO3rPnaG`44MC*7C-m569S63)yw%-pNzQ18#$&U zEIJS^*O$9}YVb3y^_`u>iAorat{MRWflDhUMfjq~(9~3F_--&1@5t_z5c4c+U-#|rLM2pYxLNw%Qdz<$L7?Xdfo{{(NAD9FhO4480vdcPV;Z-_uBBZ zhJp7Ltg>y223%dp^Aq}Tbqk37NY3=#=;7*pFzFr%Prfzxr_K?>vT~&%L~tkf>@dY` z)@!xk0m7HBoJbh6&c4a#*Z~~T#d9MvkRx56AEl|oqjukI+;+oQJ}E78cf)M+L^JKW z7^rQyi?O`K%}HiCDDVRT8+v<}ePnIzRiWR>N~)vkGhHg6xAx-I;Pb0KY*bl9TcW%Z%g>DR3yW+ zkys~{r-#3BdiULe-6*^%8D+7ZQ+cFC^$pWmb1E%28kbKGSBs#R>uM=`^MDr|#UUA)u?rB=dTg3K95;17>lyi zvuDo=dU_OrLbF&|Sw{e-9f@InI#P+0D(dX)y!rk6_h9ess_~JfB?~rJWrW|~i4m0+ zl#Qhy*+oNBq1;iKzE+>S2N|tvj)zH`4_Z&_Rw*gC*+{s8G0 z%4B6aG;9lv&dos=S8)51xOK;kT;EsN8*T%0l059^pVZ|znH+EK{PQmUjQ=PN7p}U} zSZi=466nGg7+c~cKRw3Gmb%w3lh*L^;}Vj;;LDe1l4on#2K6SOqOS!Q<_5sqIuxe9 z<-qF+zs60Xjwt(sRH2F2@?B2zzkBUOc~%)xK+D(#FxgAdl$tY}b)&U<%_swnw2|Dd zq0du3VsFKt)g0mUt{dN*7%8Bv7eleC0Exx!80L+IuzNbfGj4GPUth)i-EZ8f-yG3W zlf3KMcy)E$QZz6y@cc$QtKORvFW{;>Uz%-7aoq6z(;f)*Rm3lfWJMJy4s*Np2MwEj zS6n9tM{=~}MoZ(8yoH1fkLsF!G4Wo{`6zV`iYyx-sJ}M=Ol8e{VtTrm-e;@)vAK4^ z^AWHkO=rdks21{Qq;laZZENS5-~+F?AeZNKjB&Z9YqiuP`_YdL=oR{u)Ctd9qdz~Z z;^_dcBiy`CaD)oE#Ry?h(E@t-g|qv92gTF+l&()t-i`eFr8l$qXVSK`;Ogq?xseLW z6C{u9YM~E&OpF9;PKLciFP=Z}rmG_M zc%?KnJc6<8nMcjyE>-dH%IF>FZK--)qwKq%ADPcy+Q|3!H1GOsyk&zvZx?=jUU2#a z6*xJM?CPPyZ?Qo2XX((3ikkY)VAsw}Lyi%btxro-RFp#V@!p=({BfCm!_K%^RJP^T zEwJ+Es;beomR1({Y^`&)#Q9dGS{51jOEG9*7aB*&S*5ue$TwEOe8i%m~;4gpyhR&vx zhdMllE>B~g(#JIH)GGs2!R^2QF5=7qdOm^N@ZVl&4SbwIHGlpX4HH0fa|uLH_P|_x?0B_2WnIScPRDn%`g0-&K4U$}1sJ++q8+ezI#K5`6HIcdJuI74<#kM9!0D@S;9&B&TwLk|q zUF(cEO7D_P)HvS59^?TPD0Gh=z|G^&q9dW$<{fYEy0-{DteM(}h1X|1J6`Q9gEFi& zijc0ZvHlpz1-%b5i#h$LNj(+C3MQ_665TM?BkztszBL>s(Tm8c{dF~XeaSc-)E}ka zJBJ?gNMd)%)GcI8e`m?Dj%m5x=hWgDHpk0#&lfCQp3z7ZAV5xDULNa*he>^%r8WW3 zr|sIh#`gh+`m$NY-EvXUc+krpaca1CBhTN}PJZLliE7TMMGS-6E8l+)tR7bQo&PPY zrlmOMF*PKUXc=Lt|GU0~ zytMc)|NiP)G8Ennc$Ucu5@9;Nd3}n6_d>z{pNBjHpk*Kyim2%6SbzOv-_P{4xzsYt z5yX;Jue>edrSs+kiP9B&oZRM0PvCKj?$Rfx_=A)(g>ww+$Hte^w_|yX(~;iI$i`vtO|- zjeS0+lE-hJHe*-@x=_+~Xuz{^@g6IqXx9)C-J?_S>g3wdDHB_$;v;VshD z+Z~8(*y+LY!F&)=@2b?XXbL|}_41H9A=YQNNjSkg7{nX>{Z)CA7!cCxn@2$1qTpLJ zu1la~%*%4hQ;!erBcF`Wh$@~oW$2c6{YL(DSr*|T(fo7;~Tkv|6kvqquM zi$8hL1a992JU++S#&5f#yu6GabABG5gs5AA!UV=$^{ynQKHI;qlrMNbB(%*G^o)#Ip8@JW!X8xu%=qF!3mWxEf%bbI|;2@Y>D z@|bZym_2UR1=XsYOa2V+jfbaOFlgV4MG${(UwFM9EFu)6_b%s97P9-5$;qPTLHL{D zmHmiT>IlC&a^z6u0)Y5LHNOq5gA$J>WojB4+0)3DtE19`6r^vccWy?(YW&EdozixT zX9mR-?8E!_iatIKV@|$I=;-LQFCg74sA}crmzv(?BvUR&zfD8g%i;$ao-zZ_YhNt7 z{8ch(^{aciKSm1^ZK~g4Kon>IQ*~K+ndH^PRAG!#s{U8AKsUhl|5MIhNlEz zZ=_`6v&JA-sW2ejWOL`U$4iApC9z{;V}sC5RObRIdEEU>c;@>z^dl8@thiratx1C* zkQ6h(T@P}&{S>86T8Tm@ok>YV{V!@I03bn?Li_GrpFG97mk$f%OO~rM0%T1Z3k{-) zyf{5vrf4|{F>?F)ER#bp`R%Th4iNjL~u52LfUx<1ofU_85gpeR}jeWl`%ud z1VP)eZt=O(0U%ONl1VIz4wclcPy_nK6GSuuDpxAmng!hh>Ecv45CuUBBc}l0Rq?qP zHQ(Q)faImALv3ALG&6h;6j90L0;I#l?57`GAaA@`*@7Y%y=Lm&?YPh&1uGjxrHSup zgnNM&KqG4PSGhT#gaikX)Jf*F*J?VxggU6k@rber3kvcQL!u1;uV4|L^~^3dZqS)M zNURC|D~bw$7e}S=1pBG#pPrBn(M@SDUtftqc?!FSRM3BA8PemXz_HGg6HnvPtc(C} zRhT4v({L_!v!sFRtKl%PbmS55AMC0n%^~bnk+JbP)x9PF&qF2zx>O zO2iZYmKUg4Ma-#KSXi(euz%0gO^|Nk|C|ISc&Lxlhv$*N&VGwT`TohiH+nUT5(&iY z9*>rDDP8^{Tb|~I-2aMfu!`nDZJsPNI~k;kAYZ@yBt@rtLIAxCwxl z5*K^z2jw69R5nX2xSLNtO~bD*5B5L6jes{s|IhkY5~*QHSITupgxgIZUxUdYOn*dT zB6+#}R6gA?fJCTy8<5~_#K?iyxx-gb$f%{IC71UeHTBB}vN#DM4%(^x0Bk-x9m$i* z*}ja|JjjDyDuTB#0QQ&5fYMFjp+T23ni_UAnMxC}Y;I`0QqEx4a0Le_QH&iI|0S;| znX*l^)V@p+%c~6LeGU2op}uoOZnR)T=ae5Dz|mTi_>MZz{P;>Liki<|?s#Zvgq^rn zbVhj(yn$j9IAbh3tp=t?@%XRtQze1o+@XY}eqtgr*_swK#Ml*{yP}BxNCX+_wMg7{GqMJxKLgFP=dcO*m7XC#EeqT=%<-Dl%Ut3koTx<^rqap^~KNgTb|B)lYjPHvk zQ{$hf;=~$yrB@>{Pq|o2*3*Iwit-j^)m6htx<()JE_h7-{F#;Ef42S&z6mI~qx*7# zu9f$D^9xY}kkj}Vkge^8(=|RSw|f=WA8nq|>+>yUrb0)iszB+XCD|`}u5kUz=za6q zXeri}F`cLji(tC&#RM%XAMPRpglS1mcg0%O>4JiSCdcdsmR){}s2Z1Uudn|+paX^n zN=M}!>{VU;6&w!}lmx#BQg{54bpykA9D|!g^b(X)9%}Va1R$gbAkat-`mp6J1z^)h zL$CHf6y$^V7@^*?imFANAMX;;{>t=zy)#{~-E?+-Zhr0KQkRCR&D%|>&XfZhS#3YX z%E`$|<`9az;S3t%Mdwx4$E%yAEmG>qx=KAL0A8e9nyY@}?_)O=4p8+lxJ_Ot>!CYw z*eFM~K_EQMP_mi3A|e{ayg6Q)_kv%w$-~|)<~95ZWOL3+s~?5uM^B?@V;XjwQ)N1C zsx4&HPvqp~<+yt4Y$7rf7d zm>_z)wwELzH7E=UN=JZsVxBcTN_hJb3ip4MB+`!ffdW&cSH)f7i_?!rM>30jFeCHP z^(GV9hP)))LUjTwCJeJTDB*FJUaZD|Y1*KI`P|W3_J>>{y?LY+3POLIppem`R{{diedRK&jbmKK|cJ|3i@ z+={<@uu6bhRZF4BjH|GPg@tc@Ma4#SngD5wdJC2Tnq-evW;elCZr`wBuFgg#CuecE z@*_)%YHob|L5`*(n4lmPzWO(2Ap^Im2dNOu7nt5VWYe#Kc)(9mU1PMR-Pwa{POFR7U>A=}~6!VgSjQR!KU@*ZOrXIpoaU%PxWl{A|8O z5Fi1V2J2EN>!tMsw_i1=2`tpgC~+m3<93OyZ*1JYpqHj!QZ9m;I<;aR1Q7W$4EhKN z3H44^*;;}MU_@zlXegG~T2|OnCyk?ugC`^Cw=%IF>#`$U)g9twRh z3=GS)=1a*KVy=vT4umwcyu$=`-J#IJ?4n}Z5|^f~Om((yFc53;>J{6c9jocX-=9A2 z>TrQi4SH-7R6n637VVR}Zy_Ee3shlg;8J&$6_>lh)pgM&k&N8=(L8Rb>lZD6UD3&_s7 zS$@Bbkb&}Xcjbq@hJG5wt5nNhBxa6~Bk$HE?^_RZu{;^(784gAbwx@h)lrXm6;Z=g zqks^xXV%Vn)9i!JKD(hb4)ZP#R!Uq3mosx6kM6$fP`_UJS3D;?(lLE*n4Wk;ZeK1Z zk(K$L9(>!)a-Dqg@xlvqsw*sd?!4uA;Xwsg4MlAYa7BhMYh^M9IzJ_W1LBqg^(1l{ zMrKfeS~81aIw1kUeHX9$`Mcl0nBS#NALbfbLV|Fb*)0%ac_HfmZ&z8&O05P!vfEmqA^O|IE&Slr2Yz-Z}+E` z*uXqZ@g{lyVXfYeZsjW;>E)?K)5-65(}jfkDA%tppm08OHUDM&tiHEr?a}6}tP}zn z=3P`eTM`0lSN2|Fe(c-`q*kUIyOqUwiE-zN?8ucbsHOH4>sPW>M*~s=yU<5Kk(BZ7 zKN5Z{yOi%7m_MpteZ&n$ug^Wwnnx)TskluVMPkRF+qS7xDR9?2V1v$)g3b5maQ`mx z*;Ya;5>%1sq>>(<;a6P}5_LoX{gXum*fJO_m!at{8;^?&0)r*Jpwaqi`_gV|%zF7N+W|uS#W_)r_!{!dHq;V&e#sY{h``4dG5nBepk$f*L;K5aA@69Q8eJDdwk;h>WX&G!I=!IW*kCfQMQ_^pp1yac%fek6;{bxHrSI;tFNz@qZpo2LxTiM z1JYYfpVtkqkpTex+0xuwC_3b-7>U@N{Ok+9OJH#P0SVBA7yT$2BtqDXM9~fm{@#MX z$99nswV+whj)ueNu)5wEd>VJc4_b?3xo4)u<{tOx8KiO6bvTtxa@=JJK`S*FiapLj zQr9%A^9P_g6j|f**fFx--bPKUJ)tmW0aF_iHRq5_)PNZQjnJ!>^ao5Rnr+^B3yuZ3 z5bZ3WFq{3I?HWK___Tg}LBJ2jbF*xh$dOE;QNBbtRpq>h44VU~&_ozGCgLkvSM|K*D6d4Ult-5ndQO)L4l1K^p>+hp}6Lh$0C?#KC?L{=ik-UV2ovv z{u4Rbm8?6#{kZlTG){@Kd{>d6r%ZY$KHK}w9WD88mBaUaG(*)Gv^UoY2zs4OVw^UK z82gj{vxtG9A=77dw#F-@pP%0yY*6?6hyVV~i2P@$9gO{}LmqR31Yf9KBq#T|sma*D zz~JSz>VLZYB49!ucnu;ZbiLYTq_%`6l?o}Bqbb^v_EcV8RWt(ft-y-?W?Ds3QZj;X zCT^nHuK^z)-)Rs`*@JGes)IT?Nx8kDL+t_<7%`V8oBFEpF8tp_F`tkSE5Lhh;tZt5 zVSoR=z8QPCL&CdKBYt@fcr$y8_5~GcNWqrr@bGuCVVF8!;;q|w$U~6~;QC}>sKB-2 z-immf-Bgrs1QR_la<3wWvOk6gz=y#&$|%A--J5rKJLvO|_eHDZZGXNHK}Z4UjYw*oeY#_3mLJ&mRH~d23Ax$j{UOf(X!s5 z!UyV^lnu5%MOSA)I}dszO2|JMlFUqNy?)&eI^U?Ng!<9sKV+tCWS<)v40TFPI6Gec z%x6cf0DC%BiYKsB+r}!v(;FRI?wN{*jZVr>6ddc8jlnaFF;G70T9A zGJVBlK~C+-LR4X-cR|$N;iS}Sx@gJiOQpBjhqzIU=qSAj5O6Z?TLOzn$cbyLqMy1{ITKA?F!QO#c&{k~^@S^22*WbDKrrX>= z5I|{wif7$gOiWB}>6-g_3z(65i_b@)Lk`Aq0WtHw#NCRCAt52r$-Y@smF}8|yhE_E UlA(?jHIk+HL{+Xt=0)KD2N$H&8vp