From 575171de5704a9872091b7a5e6ebe4cb2ab2d881 Mon Sep 17 00:00:00 2001 From: AbdulAziz0682 Date: Sat, 30 Oct 2021 19:03:56 +0500 Subject: [PATCH] Added a basic game built in VanillaJavascript with Parcel bundeler --- BrickBreakerGame/.codesandbox/workspace.json | 20 ++++ BrickBreakerGame/README.md | 4 + BrickBreakerGame/assets/images/ball.png | Bin 0 -> 20046 bytes BrickBreakerGame/assets/images/brick.png | Bin 0 -> 65028 bytes BrickBreakerGame/index.html | 25 +++++ BrickBreakerGame/package.json | 33 +++++++ BrickBreakerGame/src/ball.js | 41 ++++++++ BrickBreakerGame/src/brick.js | 20 ++++ BrickBreakerGame/src/collisionDetection.js | 20 ++++ BrickBreakerGame/src/game.js | 94 +++++++++++++++++++ BrickBreakerGame/src/index.js | 17 ++++ BrickBreakerGame/src/input.js | 34 +++++++ BrickBreakerGame/src/levels.js | 31 ++++++ BrickBreakerGame/src/paddle.js | 32 +++++++ 14 files changed, 371 insertions(+) create mode 100755 BrickBreakerGame/.codesandbox/workspace.json create mode 100755 BrickBreakerGame/README.md create mode 100644 BrickBreakerGame/assets/images/ball.png create mode 100644 BrickBreakerGame/assets/images/brick.png create mode 100755 BrickBreakerGame/index.html create mode 100755 BrickBreakerGame/package.json create mode 100755 BrickBreakerGame/src/ball.js create mode 100755 BrickBreakerGame/src/brick.js create mode 100755 BrickBreakerGame/src/collisionDetection.js create mode 100755 BrickBreakerGame/src/game.js create mode 100755 BrickBreakerGame/src/index.js create mode 100755 BrickBreakerGame/src/input.js create mode 100755 BrickBreakerGame/src/levels.js create mode 100755 BrickBreakerGame/src/paddle.js diff --git a/BrickBreakerGame/.codesandbox/workspace.json b/BrickBreakerGame/.codesandbox/workspace.json new file mode 100755 index 0000000..e7d06a2 --- /dev/null +++ b/BrickBreakerGame/.codesandbox/workspace.json @@ -0,0 +1,20 @@ +{ + "responsive-preview": { + "Mobile": [ + 320, + 675 + ], + "Tablet": [ + 1024, + 765 + ], + "Desktop": [ + 1400, + 800 + ], + "Desktop HD": [ + 1920, + 1080 + ] + } +} \ No newline at end of file diff --git a/BrickBreakerGame/README.md b/BrickBreakerGame/README.md new file mode 100755 index 0000000..62cc16a --- /dev/null +++ b/BrickBreakerGame/README.md @@ -0,0 +1,4 @@ +# BrickBreaker +Created with CodeSandbox works in Parcel + +![brickbreaker](https://user-images.githubusercontent.com/60597318/118232580-36b1e400-b4aa-11eb-968c-0ecc3c8ecae8.gif) diff --git a/BrickBreakerGame/assets/images/ball.png b/BrickBreakerGame/assets/images/ball.png new file mode 100644 index 0000000000000000000000000000000000000000..6c00647e19be0509a1c0b6e820343481403634f6 GIT binary patch literal 20046 zcmXtg2RN1Q|NmoUMZ@|et8(m-m6Z`0$4K@bC3|IOA1xv4*hJyj#|X!sB{GtEtWXLa zdkf)zKYjnduFKWs8TWm^*XunWk@xSZ(NHl{K@dcPRKKeSLBuBT55+lfrPV&|8~BgZ zTM21E0saM3JbDFwr+ln#>J34cY2hEDoD1*rz{M**DkeVq9`-)|54`Lke}8`=CwCWb z+Xs*Bggm?)GS_c2gNIn*hYXy2TLb|B-hj^s+z6212PIjQ;w?MoLq-!UY4G`!+TP5CZiPR~%8 zKURVZFNZUwL%EtYk2^ad)4!-nX-qgGt*W{orZ+}FJk z(}yud%(Vr_@|Aw66kzyN=Kilq}$pdy+-pZS@{<UHt@GZ`)2_`nYLIrj2hp*cGhm0=IgnL?h&+97A=`(Z?rO6|mY z*ha}^vMDijR{r8X2kSJP2(k^I-LWFSA4o({0r#(q7pM$xq3@N3nsYm)j~865D?{Hx zHs&3zWw%eE=Te}4QX*>gqQSJoD5X(@cY%>wRhkNtq2qu=UvBs zJ~^g>d-^rkvgGt9-bP`L_bk3Q-l+7e29Kzd3bbbqrX`~X5_YLn!kvr1hQ?pf;iWQH zK>KLgtTDE&L0=+KWa8?MT1^;*`}8FP2|k#)*g;MPO;$rFIB`$f%Er=(wAOcAfkR;B$FT5kWFpqa^gq2I{q=xz0p^8M6jKenDKt$ zvZ(iffFXdzwt60^U4q*8`@^tGqT z!(YO2vbPUNFtkL}X*tUc1{H?jXi1~XbvNE!i$aGM@wkRWd)J}Tuh|eCUt$*183tS$ zGeu8`)MhR3)9od8^2$* zYM<1%SRM`xID}1f?PD7!zga~w%&Sa66demm_odElWurOh+N za>kCnbq*gJxK6H4Pt3@{E8e9pV>xWjAV^ZB8**+cFmSZtQKU?&fNnP$vAnvXALOyI z^K8W6W=W{WcEDU&UrOKC7ZqDu4$2b-Jp3_nr8jTB+d2)^zP=IB)I`+U+~Qoq1Xq=jlATeE4piHp zF6QQ#anzbuXWYBR*Ew0W;3a-I#UC7_u=ASh=vd;kUkq^Lk9+kc4fHL(4CfHx$`lDx zaRy?>3{}VeoG32CaE$Wpx{;f#(M+X5d(L01n~Zj76)dvISuq2x^0@vV_XDh>l$Dt` zHpc(x>p1;>-z~oT`37_FuS?qNQwvSF`oH(|cnC-BQ{5qwB;r8V(ixdYxCjza1%?h9 zy}RlKwnNu_D@^m&C0xYYjzW%~lC@5MIIq2X;IcWSCb7Hu5nhT$?#L0ZWUMljaKSo$ z_iZ>X5h(6M<#r{m7hTvSpL~p@rr9bkJ+0*Jh_+V2xj!p^Gc z%5#bbCDJ1EifWOKcZLf|Tui{^OM_&;fNkmX7en!r3Sg}EUcK;UAS)d?@zZbH zC!^j^(|`%upS7BEyY{2&ZRpWtr36E>-V;n`93sSG*k5{?$VshT$@xWBjb>mA#$Qur z%3D@q#jMeQT1VwSzdxAns)o!02a5mTXdiz9C*vXSIBg}2_YUi#Qk=3 z-}+Q))ayN-f4UP5a9#@@czH7ZiH5 zS?bLAWvbS?ZcX;qV^%mr#4G(Wzp4%fQ71Y_;w)Y zEz0(WdF}7wY4?$ly1DX5w^`AFB1|0esIYzNt}C z@~qHCTInSg-wLa>CRUCeEN&`bqvdGEzpeE2?U@DsYiJoaXNz#yp;67)6E^FWS!)Ur`5ehdFf(}$a{`z@D9V=%PVf8pXQ0KO;s1^G?((jRisbgW? ztbu9@xYsq;^lB(ikLrb=yK>n4Kq=YA-mhW*@%p9J#D9Bb=7k^e72|If z`mP2#K?Ko1n;(zX+RmE%{w^DPS})&1rjq0384q5>yORp6>N{##4L2b|)M-L_cji-@ z@0JQR-1RmNkli9uq*@F7PULoa5H>z=yb-q}`ZMaZ=}%<)l-C<3rNB#-H_Haoej-Bd z3{%E5ujewgnUvxy9C$A(TKdiSzYRUcRXB}5yU-PoZmkjMV&k^DlBmv3%(#D%c_ioe zS^unHalY>On%wD=vc_FKUv|&Cc|w%$C|BzbtlV0+RB7b@KDJ2ZK^{HFTp+{W>-4>Z z0r2^iDn{CLxD9DGQ{*CadtIum@z-VG$!m2}Ne7?T&Uwe(ntPJ>k}cY8Wi$^xd(kAw z!GcM#@nYpo-1ssHTE6I47?})ekb2xIPt3F@|H)aSb5@)jr-zX zrY@^_Vn~QeBVTki>kj4Q%y?S!j}PZ656J593pc7C4!o3)r+`NIXla-0tdBFYkJ`?R zMZQr-(6inO{y@LQb|yzS3>@J$}zv3 zI$W{t);(24Zk)%?FsONQG7**bJnw3@7&hko6za9q{E>F#($!lBl*_ow>8M#@!jT6}!pR=?)9^bHqknfH~U3+z8)K0a*bNtOdAK>w!`?=uz*$ z@%qRO>pxFHh%se1DS|X6$A`|^>2gvN@#mFrS6OrOzS@yFjHQJ)fj3JJmLJe0LNO)x zAmu`Lz68!s&!q?^Tcpq;EITMSC-1iRz8g$aM$BN+Qc0Pze9%T76YutCXQhNmpvarG zzNKuZf0rcw3@Qut%?c87K}2WC_#%uH`6g*fAI zfk*q(dzlrXhM#^sFgC2yG-Ee8RyHR4!A``ltYkYYOxWQ3RAuDgCC%!!-e4B6^{Kb6 zuG^CmQhzbOSsA+HaaK?mwoPY@=tG~%RPM7|GCa2?#h#~#N#`bLqJ>_sFkAMe5Q_NA zZRlj7Rr{ro1HzB66JrLy)yIb0ndn=jc$uql9T$j=dS7(0@Dl8iYF%DLwmzRH9bCqa z_Ih!(U0z_X>fzr-Y$x+fV{J}}rRWRDMvh86!CqLLk%<2jfEEMsh72aPll>RexP8`* z!Kb!yF?qM4M;d3W{=bKA`uHjmDsz!|NlSX=pO-52c;NVZ1JNQ}?jj()CeFIGC|PPZ z@TOjf2ujzVc&~gRY`=Oc;OwMaBh+Bnnhc*}$#B>9Vx?ZeQSM@eri@tZQJMFWv+qU6 zE#AUTT{cMct66E;+;R4;v+l4WJ)do(H|!cmH?0245+cRYQ^uGg2yL97w)cOL2?yuk ztwI|>f-=u@0n)Z}T``jLnek-~_||jD_<}~Dq0O2-)2E9H#6}v=yWR*8WYI?!;{!Mx zp;A+Ltiz#8l%51tVAp5o)#zSMzA&So57)dOFkcZmd+$7=2`7UI$|Rw!?*N*nUKbf`Wn)^4GryVJq*ix)&YT3|~Vsk>h8Viv&l*QOQt_2$SZKKl0vO!8e>w zaqQuaf^ql!C!s!K=;6)X3ERN$VP_r;5igf{^^G%m>BQcka^UZgw?x&zWurS6g38o9Z*>b6TS$o?6ZY6!)ByaIx@lv z%610KtYatR7I_JR=F7a^&oF&Y!XEskFcG1SaZ27bM27vUa-SS25 z@@D}c!^;lrbv5u=4(iY~p8zP%HP$mGxgcdxCUq7psPNSZ2`ToPxa>{PNEV$rD3liV zt0I|1d!opR_|J{W8Cxgz+1;_NSw?HtB#D(n5c*MBZSc>lM<->zErFXWXdyeDlps=p z?h+m9mtOTbGrzoK=D&F0=k@P-8eWFtFTo+@UT4^;gB-#=o_^CO$6R`j=FuR|>%Vd@ zK|!}pm4`HK~%KT9|vj=Xd0 zjhbG%~QjO!8A$a5&G9+zfNMG)0gSlf*0MaOSvr2yGS|T zX}78Ey^8T8Pktw5o3&Kd+ED`v6A7xA29x0!^tRCQ72BGls=m>nzgt4RM9{mky4e!$ z*1a+_1*?=A`O5vPwC2vtq*&&EhJA+U=`l}<5s~=|Gd1y^mo6=YayVH}F^9uuTxc^7 z!7v=>n`J-sn!==-p4l6Vk>&K2<#l{b8+NiHy+j3F%;au6adSKAxZr&9Cmu6G>=L$C zncr`lcr5U|OCWjIvVqDNZFI85P6y=h-YgWv=YdBAu(J8Ef9Zi@|3xB~mrAyaJb@yM zUd9rsSs}G4&8v3h;N+D$5mr9Ba>v1`no}k%Ob^eQTz?b3+?UygAlx>VfPH=JlaWk| zWD@8*3M83qe@6?&L70sM3}qGLY}UG8I80jfZ(0iPIp7qV`nD4_P& z$z5GOX9{Q4AQp5H+#Y+#-{p&jmyi* z@R!*uW^cT|K#C2afCF0Nh2IA}bF<|*kFX}-_bie~pm##vM%cki9)XFkiwSm|(n#yF zS$+|k6pF%2%+(shXNjXrx!FAnHT&Cr5@(-pSb|sD(;Y&O^nu$eFjD{#NmBdN7h3aP zQZADq${2#Kk497CV+4}_>`xq}F@(Bnwq2F#M7ZKGdbA~vJTq+Ze<-O{>8CFj`y&WF z;A6P+PT>zpSv|_m8B%;|S_<3sTHt1f8UNq=!;>s?n{OEBXgK@l`X1D0_)k25WqA1- zBNYEQqU{IG(H`I;KGF<0z$${Q06aoq2e7)gRi!rgoW;lAo1KuKQKTXV<~U_vm4{2a`ADpmJAxD1=%(rNVOhTs4tORidXg-H8k$2*<1xp zi5ZQ&yvDN(7x4xc<1)mlC>+G?CvjA}pd^WQPs)3Yu=N2Dqy}vMQ7_2Xe1E%G>92I} zpxv>v-kJAC$gqQHv`9(hvag|ckEV6Wq04w9A33D>Pym#A1f>?!fTZ~e1g+kdDuW^Lw%ZPXr za_a{bG)NB$l)7_`zCap}_N>0qXFPn$z&yg|l*l4P<5yu-CXs5nSi%B9k;c5qyWb1t z^S2zbi*cPZXgnF7k+n8i{flVFQ6zi-*uBeIX?vXRsTuSAH}(v$|1_jW~;@xz3G5ln=#Xf zti=+0*xgu%;LMtu{;4=!SFQWl$G3-CavtIh%ENsmE`7Aq+d|PnmGT@BKQz#^rymsz zK-jg~LJZjmTavS5Kds=4VK<8Fbc$M^IeXhw{`mwh>oPp0v~ z2VG4oJEzD^W#C0Qi#KXUMkmL+hdCgK{ASpi*&a(sji216Vj04SzcICK&Qzbx?jexI z;uGYCpJ{c-4<$jlpXXB%M9}9NWve|t(ANO2ZGBlzZcnf6u1SdV<~<~LJvQji)!BET zfNlYwb>}E-U(D@f_F$QJOB2amcvAd9K;TlVdF;nAkmu@yy0!ofF?3TiT1VcL#DBIJ z6rpe_Qg?=0PHfj3otq7WFTLzy$#HDKv)V3)L?R$ayYJVI%%6U-6~UdHWjT4=uzUw7 z9o|bNV`B5S*d65<0itpq_TC-Js19yWeH&bbznm4dzE$yf+|V}P50*r&n)rY$+$1R)PS%INIx5 zN6i<1js=A-V?=Fu0~5UC`ko3}TAF!fj7S2A862er;gsF>VW7q?PvcVIy=Bt6Pg+?6T_ z5^q5W2c>Uk`6|Tuxk->K%F4`ww|jh3b(6^St}(zitb{CVDxYq(2@i~wpYk<@ zpvu(Q#Cs(NDuZaBKnXfdtNBzw@)Saj$0>PbDx!JWa5-cs+9H(fsQQ+i4n3!M zV}F`}Ryeckkfs$}GEEUoUEvio)>VBHomu`(bCnd3bQgJbzNqE*uf${*WMC~&+aR;0 zfw2!vt%EAXG-KF!^+*~M^r;Hk(^4ET8dS6&TQWjW{~(A~6MDv2@4U{1pJDm=ybGI3 z-(AlFLp0oA8}sK+&QqTbMFr*1s`tYS7GvhrmtW_Fg3O|1 zqsCHCMVVT67>hr{AO1ztv8Llm=K==47$Y8vi7$En1HZSxVya z)<+l1hLk2>sbJ8rN0$(!i0*&|Z_j;TYEd^2+azJipJHhF_=gqj{_z+_OFrZsi@oW< zKyiN+fkJsOut2`Z?wjQ0=2qU@lAj^iyv)fan36u#3V3TZ~IR{CLioJRLlhcK&R?E^yv_&dab|fbhG0O3i}djo=)h zSoigh65A~}5`lPc`Y&iK$jVqG_wo1sH~S{rQm*C&)F zAlFAW@(j562w9fk*WE8w09PAPZr3+DJeEH^kyeUk0{bzU1XYwi6z={{6j*M_Rk}+L;2mR}{H$RNc=A6B1uU?7H`k2(!|nsZmT3d^Ym?kdA(xg zu)ZR78+#r=7g{7^=~O<{RN|SqRvx#>Mv^%9dUU_^?)?Iwy_nH&$`{6B&kosB5lcM1 z9PFN^K4Hv^z(r3XTKLyjYW8+FcY$l-#rtk{hzbf;<)izmHmG6_?}9d?-B5_ruggDH z5UlhEDo@^vK@h>-%uL*2Qgqzzf?kpebM7_Zo&UQ*n2D*!zhU4vVFO0Ju!uFuN$6(x zx7?q}5qU6(8lMn%j@-0Bs&$84O8i>tGAT+7%$iq{JDZ_6kHHRo7M1sBof&ucPqwNB z#)Y7_U>4kZ0>oE8I6IPu57?RKnTglB9K`&uX*=?>HI_c#(ptCz7@YeT%lAs4w>9TG zIihT9#bOeay7HmPrIWPu8d4X%C}2HXqzNn4ry4CD369K8nGUKLQ(nTnRE0=>eyJuX z8&#cAL8#Zi&1$u{QWMJzEK*yg#O>|C9L4yH!cMu4Mm>=>MhA`5<8EoNj#>lW$ai<| zlden!PhKZiEif>xOpIi=VVFmjX39+vWN_HZ93P3F?v8jSg?c;ogHqqUF5TM$h!5lH zW-PWRaz49z?>kt*j*(7J5h_;}B+#vFYFkpN6m!hBYjSD9R% zoFq?%Q8@M|PFgR?P$+S?LyAh4fjKdizP`LkfpshP0!)sGFx|Pa)p-LJI&3w9^|JCz z$g)Lq8qGQcJu-NGbta#u`i)@s2KVb5HWIGhO`Hp|vSXtDLYmLv`^UK|Xc5oZl{vm{ zqCNtQ33t!~-ljW>GK`X|oM1HR`yJr>*W~0pt>&AZUwU@!v0-VP+o>`B;~iT-YadyG z6+BZsbdw&uVf48!-o-N&Id|V}XQ}!&Fv>36m$&Q(2qEg2L&xuq`gMIyBLsBpV-pWm zv!$;N&t$j5J6ev+NLw{Aa36O<+EG|{h}?&bmym@V-;bVHy|Djo2yKVjF5 z31^=N1kUx=A@U;NzDt&*@H#gof`H2r@g{arTM_)_{M0uaGcoXfjtRCJadM!jzU$xW zg+~x-h1cq-Oj4yv#Q5E|_%Qb|GSx5Wa zbL?+!pZXCPRX_2}w-rN6?rUFG)|7byuN`@g3`?srxmdbK@A>}jZ@Yl|QL&ByL%-yN z2UV;L-15~1*14!DQ##A#{9ro(=i?{ZK@7b^irXX}Csl)653v@{a) zdH}x%_He=V*{B7#fcw{Nh@ipO%u*fbT&%u+dx;YWW$hC%V$O$HepfGY=-r{XluefI zm)q4wE2JyAGV&{TTl19r;U$G=*eYvydT*bZ^^v=5Ei)@DX|=XwA(S8}<8=fB*0}T~ zN@4}(v0s1{TN1PUby85A8yxP{M?$;2c!=`F3m;CU)w=gx81|Q>*mm7`3T(hR` z{$Yo!yn$xBOySF~QlQfS1CDmruN`@zpx6vv8yL|YMH>R=wv7|LIZq~CDcc$$ z&15sbc7FKJx~&7S^TyAm)3(}-aC_HUI&7y_1&nU*4xdn&=p}`hXA+nS#cURK!1x-J z5nm{0GAuxXe{E}{7wZt;46D%hgzob zSgCH{SF{5i3ElhKJR-1&(*vxy-X!>(69{X24-QZ*PKv!E2tso(?(!(+i}D~c+Z>Rj{Z zn}A(>k6dE8nWrT_LWy_s6`y}2m>LiT41#Mx+U5%n9qZ$#hH}iIPBUv#zXHU84c|s8 zo->h29AE5z^fbAMkZf@BIg=i0lU4Zmya*nfHDeiWlVqx( zO2A>IbPC{0cMz;Uv8)lU4gHY-S;W&dM2Ybt;4+B|`N19;xdzXQ{icK!Cns0|rK-_& zqEN_lW9@)?pWCzVnZ9fBFZkSpHk9c$Nb=9>UDYPpP*r?^^pUl zrJA}%N1uGo9)}U}zwdjd=X+PZ9gtGY=?DPY)M*NZYtvrup*86_q5-?n#J>ZQ4y_tK zCB}!cE9`<%3?NSA#7Wp&@GPvVD(I9?_*jyE{5Uk=;tr{+Y_iJ{i6(X--#;Zko_eXGzYVsgU3 z#D8(JUJa6^rHAK!0K_n3lKN4;t`f3q4;m34J|=yq`{r-V%({StZSF2_`mysxo7yRu|gXrNOG ziauJf)QOYzcze{u<%DImnJV?fI!frH`E>5_jpG-aK6HLeqr7JD45BcX|$ z@_ve|+G?rqQ1u5zf?hL*h=>q>5q*BdNnDLXyT%M4ApgCHVU)^(S%GXC8;I3FsCT#4 zVt=Mft87@D$R$73h$WqcS?~D6i`Ho%J=*+70grooi`iF0wUnK?P4t#QAON+W$GE=T zt2X5mqr=XB=Qsv3_?(tRbKmIR2?w~;({X1~o1`oPvefRecVO3}A{%^;V`OmM+mio75Kr)r~0x-fUY|oM& z_+T$IW1xFi!-rZoX95@}0`{NwLg~mjhw)|CFL2NCYpT4%htB=AR52A+=UWjl+9?f}C26(4lRVp(uCJcX~%3GmX{s)CcLUXv}=i53MG zoXdH8X;9hj^}kb0#A&=Q>dCn_=T=|E!(BY?&*WL0q`_yubb%T|_4BPxT(h$cxQ`AL zlLIe`y$9v6kUF4x`!^OMqSpnd0i^hRYZXjokh=+Fi!Qh=T?{(w8@DWa_b=zrXHjJ4 zXoIozM+2R;Zms5z%OtsrKY|_lzO#eCGu?)tfuYL(?Yd*a=z3FhJt*`Wuw2olt{5PK zICQ}{l|jD2_RLF{HEE<L%!nMoBc-MyyuZfjolz^dT_zCIHR= zLRzO^DFaXGQpQ#5VeDZ276vessB8-wQ(ItqJ?V)rEd(JS@F!!lLU2vBZ!+LO$15j3 z-}Vm?5I2xW)k4+At@+_uan0xYR3s!Im;MSXr8q9qwSrILD;t(K@!2yl(+U~`;&60$ zIUnRk+kfi8OQRM+l?7U0^a~g#s$h)t;74tNl%tQwi!9kOP^t+wAFMi)^quV!fO<+j_V$vre3#Le5S!T=)nd2Y%d*M23X$Q zzYac;dVb{Ew4Ekm&h3wZ%~OdOrJbyCAQHM{J!GP+-yipnk^>zX_wo(&00`iOEq=qi z)UyL5n!cn5%^$db1bVv3E^d3Up%&j~WA`XvlG(VB`R(A7Q5-l8B=#|9=4(cOr1tu; z0rORT&nFYGl5ko*IQBE-N}n`fFyqwzvwppYtJY0l(>PU2XbIlqaDr!@zSe2= zs_-|MEVPMY)(bF6)Jw<0ehzY!&ri4nY&N(q;SmE;HUybPO}+v^6I9Y)a!xi?kv#barAQh?0?m%gS3y#r3^H- zcFL6?#apJOK==XU-}^6BTJSPaWqiYFf?V$y2F5}v>}Wru=5rz7AEg_Kpm<)D*hfX5 z*oamr<6<7E!opKOgiz;sz-uflyECfHa@XYQ?$&>@W}kdeX86EH5zGl_zKJ7))QcVB zu0NbJ6s%SMs$F^Oc;$vUXlzn7`N0kaHDz*jt*K-aoyzQ%!YSr!1I7$0F%9yvy=YM5 z!3`|b(LwP-z{|hiDDk@yj@!X3rBLKMVtlcwexgMHPAptXL9wyboCvZ})%f}IdFhdB z`ccRF)fXmQJ^(Y;zx7Oa5dppAWt<$fYICR_ouw0y0zn*u-?~ANN5!Mp8-BonST$fj z3}m@FSIngVKh9Q}X7lNto`7mZ{63gPCWBB*)kb7S78Vblj;Sw1Qi3s$Q7}Xbo6p3@ zU*(n{mTH~;93`l)0D9rifTNv|qJY$s0J`_Sc)D?`>N#b~1u%7$9-PfhO$5zuDV)Ba z5Z!y`@U;UCoO%{|LV%vzc64^+#>mui6CKcmjHyQALO(LRP})(??1uN`@Pt)HJPwE_ z`U^<&h2ifeV3fNNUAuakn9_3k!yYN@Y{IYIYou%hX8q1@2!KBQE5T#~7M5R9FQ2Tw zPYr2Ay*O97Pz53{=PU*5mts{ABvPFm1(e;6(%AD~uq7YxE<8rO1B!b>o z;hnu4UolB_yTqNx9gwaV)3}lbx(mL6-+rG)WekR(?^U_~?_MafbNXDV*1ZyO(fKAC zND*&Rdi_VqB|bPZ?4Rw^&k>1JH=AiMxS#CdVchpd8V1=%;W$7@sZzc3b2So|@zqo6 z5xEb3*3U9JtN`c!MH3+Y%EIx*zP?z_yc96$v>|7rSM&18gTE~{GWrz)jvxZ~MhS70 z0gP<6u6&VB7F2#U{N()<_Fp%oK6PGFJ{e{`Ml`)i-yIK>mB&WiI%n?yY_3|7O+j;5bi@c12P;#a&d3JX` zBJ@Yd!Ae3`G>`m`w%+#biSrbK58WB(GApxMrK88^C zk__cf>TE7+Wu}{4*ScaZq!y8|{nQb1)Tq_db@EAioXjG2!6Y0oV@7MclU*Z)h^hhP&B6dKH(*n^` z5OVVDgbXVS#<;{?%78V25kSy!YMmy6Iy+M|zP2uqM0$0%o_3t7vLFAwc)8OonVaiT zz+EOtv{+OcS+7wZVxNDaUAeC7Bf}eq%~x!=f4|(qsJ!e89J#CYz98m zxmQW-qKOV=Q&W4TmM^1ZzjFh^WR@8iu(5MnAf~^TnmU=0PqBUxeb77MWttpGnSGNK zl~lDLdRG00_V|nXvHA7e-y;&V0OP627N(~-;rpYN3!=iV_u?9f@mxp-)+fU+FvTwc zLh$SSN32LSp%>{-RiLJFES-BtM)5HfmNm(ztuJ=aB>7=N*aISt9;~6A7y8Vourh7EFvVwKGODEvaLf!+)5^F$n;SRAl*7Pbs|@^4BKiTMiq5A0AlBM=N^s}rG~ z7iq24UAM>|BB~zJ;x_qA>|zM=MXa4QBlP5vCL(+PULA@34Y9;-MP=JiVW;Bg*!c5Z z|AE$Z&wq1eAYm;!jT6!@H3;IX-2YAzGNi?2a(M&M&*D<%TFjaFweMmTm>$qSn^9T* z;%MhlK(wNE-Nx?gXxnPToAXO{M2fDi`5(|Wet#Xgti?xAzM8Bt96wz1FUOSb1c-ns zHGgdGM`hE?{Yh8sa<8oYLmqMjtErBfx_n}v=aDQ_-#*G0%|?ZlbLO&^8lg;~N8ADv zuiDzxCZeRMDY+(56gGV;YSwiU5ivyTe5o>1ucK zVgRo_|7C->u2kYLW2@W@bQv=eu5A31F_PD#S6!p;AyW zg)rkE!*SIz$ea|1t@MW=c(E5Q6k>FF;POW4eC790F@0ILtb!|?3%n`wi${1gS~ zKsm&``W84#^~Q|qdvZi8_Q+2%@)tk^W}u>CTF50qj%}Y}MTeTK zEP;hCuSSev^%DbuSo;8qb7U^}O6{G)dLT2f)gXycL~HT&N=cOR+mPXDHI72%B*0-V zFCLG*)~^oa{{QcoFAv-jBF5Jtw55tbHuin`d9JH|Y9on}&03}NlRj~<4DpQKms`G` zA{}TGE>M}9{LVQ73Z+*OG14XAq~AZLLXZ_{tB!CE>}slJo-iaxN3}E?EQ) z?8^MbG{y5uWvBo_Bw`Q#eL+OUw2RUKyoA?ioHdjK%skiFnql|mu{02>Fp^KY9HcZC z3(>jff4&|;figi2%UUaF7C6SojDbrllqsF|Al;4^8mQJ}AzBGShcYQ!f|bWZ3wfHP z7H$KYQxGr8SAfhqIk5Ijh4X2^`bM57r#S;M>+kDoadUKD29Uv?y8BTIz9zN((b?Wp zsQmv{c71P`EJcD3)0kqk4FTsfbJI^Ue0a&coeGNy@Oi?;*z}w=+Q3l3;25g@b0~H@u`?vpjfLT-8)}-?8W=tbSk6 z?#{cuL?C5qEY6T)?(HVkM9W_lN5B*u}owff>8Opbu)M7b`ML((`@xaeA!Gq|<{7CSY%tqZj18{faC9}RFraq34= zUjbc;i^2IBBF$Sc8!u?`9k~PPK2p-vt=;SmYA?ywzI3z>1o`L#Q^=bjoa6>k>GB4r z#46cqU>k{4=+jw$Iz1&~KxraceyItzD(APQ_EZ~}FIASD-Wjgn-~wCl#qh&j)ihY= zk}xa52S9v!ghuBS_2-?W*pfI6=DitU1?tJVDp#(HTxI~2)*+A5Hsry(CBfK?YnN~6 zf{ovD%Kc~pDjZLx!_!L}iLM9h$qErdT91Jsi#J=H{nY7g%l2kI)_^f;^I@ld*CTz^ zY}PbGBt^11wJZI03eo6vQ29Z580i|RV>-_P=7Wz?di((kITBh8zEDLbfg0%^5%NZB zCRjC6G?(WFr%^5}%Mp#wvM<1i9{vrH_}{fL33PKC0|?$ZKiI2GatvK&2PdaS&;I`st;9jMlcLT|&Vtsn0(KAZ8zYsIff*)cEnT z@>o!?bH0p?VTjVOa0tB5n?L!vK|v+?^8XN{#SmmT!oUWE5J-=**=c>jJt9psP-fk8 z!$P2ryG}P26u4}69W0-**Yf{vaPoqW zVUX-QFt_44L$HA!12z5R*pdqxjnlB~#T%Objh~HVe)9)kIT{UJZEOlY0J$?Ab0R$U z^0D=*({uZDo8lw#KpZS^M?GUn&3bf(<5LNQ_+m7g7(U?O-4E?kb${G*6Ef_d;xhR= zLjh7SFSx55%oYs$&QPb%Q^eXd+X-#d>D`R0Ek2LGB)!0_zdxF+B6I!K~k z^J$vRz5b!$Jp50c6q0twVZG(ZJ8cZCaMRFkxLe;en3lLkBp+v+HKDl}PD&ydW-t`Md7^*}`FF452$6N!q-oOs2J++OAL1opx>kZt-(Xeb z9IeL~)0G#fwNFK~Pst)$tbiH9*R@oJS4s~ww4R}G?655b#=#6%PdhN!NSGks|G%l; zU09ZsoAB&zuw;UdR;B%-4#I602C-~610S7EqMIEVIp8A;bm(;g>0Ar&-yOn;lRGwR zMH{NaD3k_ z1bnv;zk3Z6v##kYWE`cHYzp$8GG*+%>vb$pYHVH4|WhNT1 zOeY}|J+Lzax;P^fJcJMJX0uwCNm3|m^-idR-siTp0}1u0s#LUJv-tEJ#gNxN^%O(R z5Mx6GorMJ*Fxwg%zV!Ut#&cgN*Mg=MMb=#O{2pSm4>x{jU2d!T#oS;Fn+c~%CDY2 zT-^R*NSYIw<(Ki5@%4iaDuaSu=@N-8`YaXnDDM@ihR=t?zd1teI;e~ac6q-Swx|6T zKx6KioC_}aeCRNA=cxbb7-XlRM$`t~iX6C(bjGEI>(EPEUuDH?2$<057VO^nZuUK9 z$dnUVw#za`SZ#}=y-sbEm&Ch9_KkFv1>S})jwpgbdX9D?WBgIfd*R2%K8#2` zmv3aNE)C9%)J7lar4?vdP!}RoILjtu+KKiyXeC~em4-*XVIo$8nA8B(68KN;m-aT! zOS}%MWG>et@Eee$&0Zpqkg@^!t59K?S4Ll+juG2wjG#)xzvNY`qm=~D#R__5v$EbT zb?9)86wODr)3j&)yYrVxs`>L_>~9V;F>0geB;FYEP?FUv;H={J!^q?z$ap3$ec_q zfiniX6#g^%O+_?q?w)OjbAxEU9BQ(i4Swau{2d#!gq>$YcWO>8uDdoI(MVBlRl+u0gr(@UbG_1)7NV;HYmnGV@r>hJw-6bFTTxsL0l|J0ju4U5%iwU)3RQ~5f?x8#4fdVFS_X}!d$3Es-iY8%9{PpCphdIAFm@S1a?JJ(B zW}ml!&XaW~VC0!|8_9KQE%u(#VY7Ml|6d1J8r9^rMacv*hCzZ!ja3055Fw?61_aRx zG$BCE0K|~SsD(5UYRUt(ks`z6l|kTzS*4;T1W1*k4TB24FMTbOl`dici=dwnO^L;_ z%8CpHdAINPK6jse_Brd^b^qKeb^^@*+by4a5ANG*dUCVyGg+g^61QpHM9;1%^pa#f zMDOFbuMgQKRo0S-HXF|8Pk|vYH<_MiZ+jviZ9 z7W!5&{~3||%u0?rU%NxRw9|l_eqUCz$PYyMf?p7lQl<Y2M zjO6|#J)7m+U3qn;TWEe~3=Ok2Ek82Z$qua9C;NEq+WUXxe}umfrMfbC#*{9wy_F4&{n);Wt{v^Kv?lzo%e_34eNtipCw1Q2vnpE5njJ5 zUX5U6_Qx%xidJ)T~&ihiXU}PC4$Ygw9miPR3@J^J>V_H+#iR zw>9~oUU;~;B3^9b}(_k~yX)JfP?6r)(K9zS6S#F2|goaqwtqXRyOQ-$+%bA>k- z+q#vcSe^&)#{l-{Oyg;8zIpKl^K@xPeZDKLV|cCWH;VZK`#OR$P7*G|$#zoq(JEAL zc-8_;&iBJ#3bS_Dl6lhWLCxn7V$=|PqOU3`V_So5V~TO3_cx0EPXOKuYPN;$Kw06p zxcW|qpOIq$nYp{eE@^{sWU6qJvhaRuX&v)x_Qm~5za-ONlr-u$80Kx(ALC&d8seAn zs`XFz$UWhG`GT6uJ^)`0s+#!pm%=6Dk4abSd6bf|{`tY@6Y(K49z@>)0(dq=6>Q zXT+j+=9)u5dG-RHal-^?>0P3>YCwxPZgtS{cV|M3el*-xU@HLYE0R_gJV)l4wL#7C z`IQJCq|LmpnXTFbr@=vRa`adr#-xZT$1n$2YOVi-3l_7~1Jl?|8)asEe!WL%B#=cw z+tLoO z+^-9SEaOI0)(%oBhB-H(+~uUYA|)cyT?pVSs%XfZ&H$m-Sa$>#&vTus=^!KaSEL>W|CT{y>E+(PLZoW1igw7$zT^8v6wKsC9Jm@G2uJ z`vDuqY1q_z!)uq}aP})+r^=D5)<#f>v_?((ox{QmZLx+sYxT2VX09L5Aq6_nwWM;4 znw?P*x&3iOh(gQ9vNE_$sF@^VzZVF>gOKeYMBJB7M5p7g(j$8REsdqxG;qL80`Ox1 zKV)8*L^yb~N1SwP^V#+3`B=+GEnK|_WZ#_{JKtJ5X_H5S5)@w=@Rg{4*4cT~y>e~z)Vg<2+TrqU4$Z@p>A>cR#IFL`rWY6U5d zPCpEq8385oenoyIAj=x#pU4tvToOtoOqc zBOR9W*Uta(#~&|_k$oeXYf z`SZs61x?dNC*nf;!@Acj40;#&1jl(E4YIdi6Hp0YKZ;42@}W(AaO^YM{2IVJ>%*?H z6+=*}zZQzWvdN%wD)|q+i(ko@K&)E3i;GKu3-T7~XBIA`#_rEr_QhVmq0nKJq^YU* z;$Lr0GqUn3{_RWH-Y-&*RJe3nvbtk$EKS$D3zf+yyB|@Rx-mI6mU9J{ zkyYd{J1mMg>=*3Q(^W|S1@a|M-t7JbN**>@gmxTBO?AETW;nk4PK+j$sS>z-I(40Z zMcdv_06YwVWRB-3`PqlBcPdIvk!w)DDkwj z0tkax%qOpjCufzfzKeE+KhS;lj(sxg7wFTT%24OzCXAdz2^EtLXKk?fw5RmqzP)hnVfN30r5jCG-Efc#{^^Y4oG-+6VH@LIl@e z3Yk>r@KH?IzG5Eif*Axt?d1VIrLJO5?JIl7Ka*t=OYHebJ9GZ~{m822FKKFG1ZehF6tk1R+Dw+L!K;&c?{#Vukh5t zzH4$O)cWnp`5y`E%Ni?^gl9eZT9DJ7Co&l3ISYx-(PidLXo{m3mYUISPz4#M``;S{ zl>VsJLaKm2GUCi5hEP6G*FN+2a;`Oze6Z>G#6(4Zib!Qe#T~&vvhKMiS5#J-4XYAj zN13IihQtx7=4P!Dnjzb*YvRqv#KYDzF(60B!jSdi3~_F(p_SC46yjJ0^w&hRA+tib z{V69~Gqb|HaEj}^9j8!Cxq3OWgG^?Y>Ud7%rLyoZM@OF}{)~~@pxM-miHNlCXRG;d zm|NJ{#pPT7H6_zfniq2C1wL(7JPke=snN%`R#S*T4yKBlRjFAX%rN_Y-iXM9W=UYN z&xz@DPw?{+F3AP^=jTDD$=Tt&dI3E9ba$tHlsb`p#a&Vjc+bQk{Fd%Ei*K_Ga}-CC zg_PQzJ^yOFZ|icq)DT*7M@$SU|7pqIHxEK1f4_lV(#&3c&lNxeUkSH-vnko|V?IrG zd|nv^edkeyM!KN7>*pvaYLk)qUcUsV=njj#t-5BhvC+rl09U=ADK{2*Q0D!#!Qs}* zTV3;%6ejQMme0qCS=WT zv3MXSAt(+$aF1r76)6Khv=pa2hOzIux(PlAG+pTzS5I=zDQj$tp$Y3i$Pd$}0l+FD z(XTBP=fS7HSpkTX&!iO?!@Tk?ODhm^#PQX>d7zj)B|ogyZfQ#LW)QxUH2Nq4VrOK{6xhQGX$Fg97dx zYp zaLq(UL1lU`+`!Lb(jC^>YxUOZn$?@#nMFax2auDG=Z^uhE<;Y=?8FUJgVt|l{E+Io zMR8TU11`k zV6KctqVSA^ylM$2w@+`K&Zth`d?~vqE$z=RoB4q>>@<=snS)Cd=@fWRcuTQLP#ajnZR}Z~m#qmHBo= zSE88?&15g-NsYzH-Kn93+Zxyl^#rYfgxe5}??V`tHf^fb`uK*i7u+lk2D7k`TaqDo z26j9lNZ4?^#XBWCF1$vlzW72JZr^@_=vb2^;!^?hd|3eHJy=frcH`b~Dx~1J>l|b= zAKzg{O-TYg2{$5VCFNs$N-3@nx1XH+`ey8f(4s~PXar!JRmKtoHCE=_*6^TCwObGu zZ2Igtn;<4|1?2Aqx1+`-;jLRGQt=CyhXA;_muo5t3vR2k@yA!zqP^ilWCH<+kKHSH zu*4cCkt-i=ttJv*@7kwEO8h=cVUgit_WiZF5LG+Sley?a^g zsQEOFa>v}Z1jY|2bSmZoC^@vs&r39Weu2>d*by;O#woUo;7#2V?m?k z3byx{ST8*f|L~Fr5y&p6*ea+Pb#frcv}0pm1PCLJGarBUmTa)t*|>)DnAmlXzHO0M zX>R?-v`13ZR~S(KK<7Mf|73qdic6`j@0%28Y1{3!>XizDQfq~oZ@h1Mif5_TXkJ>S zk<02+B_Y>Al!=IFb=CoagSsB99j~01RBiMmzSyO*kh;ZN$h%bJT-m)Iz*_85u2pWm z@jN@1(+DB%|GFMfpP-JA5;EA*>u;>Ltv9GQ8+|`~~Ev<6)zm!!UG zN`eP)IG>KnhhJOIZ;4_DV-FY|o zmE>iOqG(h&+WIIx1QEFk#w3KZkK5oCqF)_GxPPjZ+Y8A ziQ9T3wkT2yJo90?eE+eSh}l-7o>7r=#YA}4hTnMm&Rg8Zjtn;zB_19mR*PV+diZ^wuBf^Th>`FM*yBsw8ffm; zZAX%dQb5`0MvE!_!UR6jb6l^LpW64+a5O7?wrVZOqec0PTQkm#GO}j&-pB20qO-@> zOIDOtgn;YoJQZMU=UJ}sKdI>5NdQ`Lgcg0ZZym<7-0efb^(dkyftwQ;AS31>r9J=Z ziTC%?>Pil|Q2-FtV!F3bc{F(4MRO*Y+BAxZc^=A5!L_P~?vr8*5v3gz+={^oup}Fn zPit13+TL2C(7iCp!>kRcy&WXX@4;B>FdgsmEJeFnxxj&?^vEdFUc=Oeho@0ec8}iK0m*g z0d(iNPRfL`tt+l!?~z)A^AlQIr=7jzU4UzI9oAUqwaraA1&~N{e%On*{t@-fcYdzw zQtT+hs64f!AH6*1mvzrFVOwaz2V**RGsF*@`y}`(RCG>T5~?W zrzNZz>E!~>&Knn3@2=j^kPrXRUVep-tXa$_u}n;fk(vcCG$`#i2nPjZhNvvZ}B?1>8Ospn^p5)YJ^ zIn+01?CgN{KuCC=Rzhl1s(-57u_~0mf%$fno194Hlj`KE6(`P$E2*oN=g0O=opH-@ zDtFS0&h1Hl#7%Z{P%ehRDNpxIvUAy#_FLIZ{rAR>Qm-^xqpnKp$GN^weGaTra0t(x zK7H>!bz>p43QZatw9BBpvMq+fZd z-SV)e?(qEV=3T4sXE(ta%*)Owg&)8HaK<@I&*{u^K5Tp9p`?CGtITo&h1tsC_zm(< zVgE}sCr$&gZHbeYFpJ2Nke$$ab;dvNmIs%Wmf#RK|4kwNBzs_j)x!4>r1F zT^?-bW~o9+VA7Xei97zz?cLu3BJq|A@L&fxDxi?jRsqgw)xQx0W_-A3Cr)K)ka+*% zsBVY)7xJKGY&L`-Nj1o_T9La6R(dy03wbG@ZE{E;;e0O#^Dsi5RNa6CSh0vze0j=^BW&T zN^M|;6YMA$Zqm=MxGBKu(JKavNO%$pAxCC?5aoi}(_tCD0RH(%+_Fs4=fIK7oKDk^3nBI=nuVX7ih_9xGmQ?xp=+RO)vYm8Z@W2gt>7l^80ZX&IDIkaUp6@};Dj1fo zz_1JON;%90E;zN@Lk?5yniMNXpIG}c^2a3wucYKR^2{I^#TT9!staWTq}o=RZN-_?4NRS+`8P)ak=2vnVshRl5?p)~ zTBdjaUR`OIdP5%Q546ppd!mR8z!fegdyKZSr^=BfQ>lR*TL=K0nwLp8>Sb6(p2t?_ z+`OMXuHFx`g?zU94!6YbJ3o86=F*YZg&OI}Rfe^SRrOZM0AItn9H>=sQRU?IcMMt) zoq|Dk1r@o44qc)d0v|+#HZh#YpJJ-HD>StsDX2Itn0a(0pcOH!6%pFXu%;Pt6Y0R@ z_0rs+i2+CDVxJQedWuJc3kB7uKL?(puPe*1>5sgLOnk0;SMYGup5F5J%d6}cn0inB zbIU(Eu+ne&-RB=I|0gdQ|MkNaZ~VLb|BW#JFXi{S|2LidmuJSF{?|k1{WmrKms@_T z=s)ZEzwPipsQv$mO8@^p>i@}v{%bY^n;9lexyQ}%>IiK%hQqE#5BVlQ#Q0WFWVWm6Zgmakg zu1Tl4Td`~}d%M! z$WU0^yI3`y{&t$5y}5v8Y6No*ex|3!Bk-E5{GnIiGL!?`Zf)fKrEdP$2u99_(mqg# zFgQ|ahjR5;l1KtNkk)o)Q3JgQ5z_sLS?BlkeMrO+LG=%qGKP>ywTPR&>J*$)$4!-N z*z~`JV}yST$Bb$bst;i$O=LWyofiAtFSCfjDvs~rN1--TdHSCaHSP@wG=AMrh<0A; zyu&W>*WdS~&XXGYy&?4N2@_>PZF=XLzF2-m9NDxh^rg;3;t~@!^?HGqw-B~J=|Q7n5?P;Mm$w9h`{H1;V4{79x}Nt( z%0P8srNfUG2Ht79J7<7;&xZTkz!Q#M>Ou+FIk4%MX6{Z;iSY)%%*x3*@Y65+cjDC) z@J&XKqg$haE|K)c&GA{Z&zD}Cj7ecdD+yx1e^QFOTaXv+zF^RVWB1rEZ4grlKY)#C zTZ^6n4X8%tRVM#gJn+#~OR{d*%cqrmKBcHKmS(5~0BYciU}{!wYgH@H^y-wg))V^z z?f@BAU-?{8lQJ#+xS5mM=yN{CTx|7i+5`X3pPuk#&p27IHn~+2w9V zDR=3MH@nh!3CeyTGQfd4t!i8@8*W#+C!Rq54N`k7K|RjhSt zj>Yd4XI(`~N`*K03cmb5wnT;&$og zV10wt3!jpnfEFh%XOZ0>4$bIeUDXzoW|t|C7UJ4Pz<_1AU_A6T^oM6N^rgxC{g^H7 z0ZOAsNM7~CB^dFmw}dmFGmEoaosHpjfR^>RR17V**wWO}`nZ0~xBonDAc6`OjUsQC z7#_MSEY#35gTVReI}Wp+wOj1Xb%)s=vr(Sy{mr*g2Sv4>V((W% z=i)&21!A+2+BR=tJri*t;O}5=wJSZVZP&R58s+m0PW33smTIu$LCULq+|plaMIi&E zojvulg^(QX71for@49m$ za=X$H#lt_N9uByNX`=qbBaGmKE0VceW0)3x@Z+=}Gq$*!Nbp`oh;N!{aX?^uar=Dy z^mGnXMQEs%94oC5cy2OaDMWc_&SPk(4vX!M|6Q*;%7l_aP-qqZ96!GjdUiA3H`k## zj9yRjBV0>p4Ytte+vIihvN!T0oPBXL`pv}6Bh2n4y;PXZt_qc+-o8bpJLKT&T^^ z3%}E5C-UDjn; zt831od9S}*%S`%RLAhP0F0S;jgH7K?kWuhR=t%!oL(3QQt)$J*nCN%&$_ttM}&pB2#*7R1Yg3LXIk%dS7pUP?!;+@IlQQd^2TeBh zAL~u)BT}r((hbs`IiFfTKyVnu?I5_Er>q}a>+&3R(a0N){W>}OU}C|_>HeejGaHUJ zRbJU2md{+6kIsodKg|?Vd zCi8pm`8)9Rw3LmdZLtc>O2E75uIQDC*Ny?12m)TTOU~xPux$fum{Un$E&{@^xl19! z^F+5s-ZrG@)V9Luz42HFfoj>2@msoW?Twdg*`H~h<_yf_PAH(kpD5Y$wPMXCEEXS9 zW;faq&X=gf7xaod5UG{y5#;bi&*vz0t5h`@WN3Kn@gS3(Iv_l=SKWZ@H;k<=Nbs!Qq+>I|3XMMyL z8TU*<;D1|9emEMjHxu5Ix1J{^CpVESqan=O3lWe+}*5JcWnVB^1<4IK_fq4^3P4xvj2 zy6S)~39|+BSfF3Pfvf^PgI*-Wv`$N_;995ivbG+g(bn63gkD8I!p8T_9Cv5ukRUJn zZDoZuZ8X||?#YOqIh05N;?-JbBT0UgqN?=j&zMOk31q6k*pljxd`jc}y;W~kgQ9T$ zqHiad_2ZlyC%y-p)8LY2RZMy@mz&WU7P@$K{Kg56FPHh(lIkv<)YQqOo8C+SRt--o zny&3hw~R%bU6O6`k(JcG6Oyb@+(PGw@K_}UabR!8;D2V`m|sO_LPT`F->@@DQJgjC4}5%~Ss3$;zIe99tl2J! z_}7swuZriQa=AfN@r|*}-VmInvP+;pgpN6L(h(SbbXW@E8U`=WR%X4 zO2^*o{r|*`TLGH3R~8ejsU>S2>It|dT4?bRRQw3^D2F)sXCiS^QLjOUS$s3J9_Q!wD^;q%#3XQ$mcz72I->6ao=(8&ykLR^Czf7PIH|6*a9z5tYvgPD*N3XPC?+{l5N92 zunMNV@87JsG-ySvbiOaoD85|-^sqO40AcBsJM~=rG#$gHmwRlIb3{asLLj-|P=82e z;ZY@E;IG)$K8jcFIruNojYDmerRo~H&bAmSeR{9|WlD7(R7CJ13f<}Am0tN*I#=Cw z6W|BN64JC7f^z*{q7#Bn3{rrTvCstgZZA*wFEWQFsw0>X%`sJA{?m0|EjLB8(iRi2 z_N>Z1(LTSw_qFrf(51HQuft>_@|iDzsHclJZbD{E*Z)Dt<>_D|Bo+(lHRymM`>hDe zZ>BeE=rHm%D$4-{1t#mC22h<#+7QRzt}Br2kLMyL0o$b=N8?Sf+%=TFQ4iox=rROg!wOBf%4fu_Vc-wV%q27tVVQ;OT4!{#-g78R|#j;OhRJvZEM*p+il*G3FE$Ue=^xatlxeq^-BJF3)P~FgZ0oUMoW`X zrc%UttD$W-*B6@D6uw2C4%!~L=Qy*l!@;zy{TM{!#bW>Hl~!o@gJZa+)o*Q&XIAbP z>B)w>)oY1Uc?uwVPNp3?xrs{jf{SnSs;0<=Tw1ezN#;7uq}L0 z5OE2vmj2EqSU|<9nQ|abQ(JVnpwY7U7IvW*SEJ;;JGs2Znd5!E>9`jMqc!N!=_w)| z`My$}M$eU8#1>$?e#}Oh8U1X2e!fF!!N2V0966t7H*xOkotgl>QFEWDlA+uLf77@C zx6xM`Zn;2EiS{`RmU$b4i(QB%8>&R`(>TuXO0d~44HG7JPonb~RXzQQSR{R~`Ru}x2W{uXq7RW=wa;o{}8b2xAwGt||RvWHViT(}PG zY1#IZB3eI%e|(|t)_m;$9LnpVL}^L|Poy8A?dVJ~MF;y3J7DyXf0i}QR+l_K9L%Q! ziA}0R93lMDq z5Z6!NA$8aECHSokQ6=oe|!Bo7$8@`93V1b-0)40k_m?7>E5hHM`b{RMz!HlB>ffEzHsnN64kjf6+w?o|3^BW+=E&fkGj6H7s`~)w?YpoV4UZBy|DO z_b?LE#|CHQetCHx8huk#$LR|V47W{EJKMgpF+JL_s?X;oQ34;t#Cdk^ZT@1>wly^ zjkbT7_e(R{&MDfj^5OEp6q!qX1UphDPimYb9tW zKl;}N#QWGUvE0EQOt&8|_c*6oWzWfGE1Q{I2Uec+^03*0ZDVFJ&J44Q4dakdv%wUg zii2<5HLtoYCCpOBjj%Y+;0O=0Um*{!8ZmMeC&&o) zCW?V<3Nj;fz_f@?V49t69j2FyIusJyhDmY>)j zG|!a+Z*?7Vhk?2aR#OG9Oece??v&YFOw+0AAS?=O_>t7h@~$b^$GMlWQKduG8+xqx zf@HCAt@@m}ihi(fp=PHpGX)>dTfmu`keXVFNfQ6g?d;^Fh|d&dTibe~{Y1N>Mdyij zyg8`n8?;+g;1(g;J^II*b{ScF;e8UhyE|(wsntj3ovgTWLvHY`9HmriZJ>(Gj{$GW zGbbQx9152_ouE-*e^o77ekH`hg3rE|eEu|IsQZN&bFf7d`k;7Vx2st-!kqyl=%Avp z=#f9^5r@u%Z4#hWJA+&(|JIzSa$r4$54buy`?k$?yVq*!Jf?+xg(s#O04GRk26j#j zwVrFv2B|h@<530OWA6K8y~YKjPt>u?LSbS;`J0RWHUvH$fI`I8;p=Mpoj4@vCk1*H z(*oWL>qe5|7!D7(h{#~z#P_FEzLINY`B%O^KH)RMmK(p=y%H{=ms3ED+pwlk zq=GivtzLP;-_s6yn}X9}O~DTzxDyNn`pSGJ;I^JH`nrV(^29PTUy_xjvU)=>!a)34 z56?WvnYD_AI{8_LfaMQa@LQ;c)DFo*RltoRx@8w0Z_Rxw!Be*Y*V(~WkX|XXqV2@m z9>j&T4(}h!H8}NZbBB0Sp)>kd)*h97*S%Ey*Ckp|o~^H_Qh@KXWIm(7faZ;%0ZXpi zcFBYsl*hQJl7W)K4TIc*oZ?qIgjn%$BPGujb2^Tkt~{+_)>ItzV?b}%T*P#Xx0IL8 zXuv7l=PThYptC9-*ZsJqbbmTO*}*wKsWX|LgC^UFuBX!6M2fBH%!-^cj$gE;3FYwUeWkH zeEV^dEcxqr(w{ne{(GC}NM8MCjJ)zTKEJZ*w^;M@9arkN9^f`=&SlkC5s67DG%_>N zGh+SZge{Zr{}9VNuCMf)-g4oaWgo?*ayhjyRe+arn6&TV|J3(=xCm>pb9rPkr;%H_ z^8IP4>Av-h;sf@RPO8kf*FawCbR{2RIhtLV6B|%NX zLkk>52LPjylOwi)&C@0xY(=dN^Dg!NOS7AcJTY6G4(*!tCR1KJi|yGo1$3h%J6e@TY!@0zRoSL4$O7#r*{jV?4jg%)=qijoM+X-mXl@klYr2kNi4HuC=Amy-HPwE zg&OZC%!N{`&=P9Tpn(U^Jp;De>n5zXfK zF@M-`ZS^d*MU*@-7{#Y2G(J4oOq3blE!V7Y+_^DcBkPo?tTr_ysy}NHIo7Y~T#+`a zt%MwA%qU+zy|vbNyN_Jw@k!anQeV_eXWdUnUv&TY?rP%7bEe`kBLmkDZlaPFjQaZH z;j)j4-9U9oT`!tS%f1eH8EJl)v3UA9;F{}D>G!_C%a_Zyf_vOT;klm4)vcE)hnxdI zBcphcH(w@EVjl+Jeh z$)KQt5|w!@`GQJ}(t5DlCC{pysN{qnd*eFF>*S4YbE6u{>#wA+fj&_sH|{I#AJ00& zdkVGBqq{kEK)oqZ_-&q=Ci$Oq8cdZk>{{6nJ4`m2?mq7_{ht`I)#vA5Gp{gW6}Kq8 z?U|hNwIR*-0e?cqsNaC}i@+S;#-fLOg}g~Shy>1zGOg4|%a7wrpI?kWPEQf4&?g6XB$cgvPtJYLsNF4-K_&0uAd1 z3QUg@-XwvuT%fg0hv{x`A!)MAYry+Ho+6Y4#!p%!ujGg#$tJ)12CM z^Ql`y0g?R^{Z>=i;KHec1YoAZ3{YL#@SK$TON6zz&R7R@siww+UYo3_}m$Wph0hm55poUs`+)|67?U!@v>8rjYC7r*&@_4 zr`+Fkk9Bsx@|bQVajpG=tI(ZrqwDi;HR$DafsYHZT*Xc{Ji82ROcO5c(c|NlTMG82 z=GHzhGq-s?WG8Zl6|c_b6msYLI(YcXb6=O`#0k`MLu1*LuC_e9%j&o7&VGDK4WQG# z4`oyTtZn3<@f_X!EPwHN^91l2=L_68=2N}lSti3rvn$i{ryixaBT0bn7Ns~@g{%wSNc5Ner!k^4!t@7@-~5 zIRQi;II;bnO|2f<1Qvb=i72M+rO~A3!xKV&_UkfXo2(7I`Sf<4%)}s6yWs8H&tkXf z^JFaaMgBT*>i4R8bX3K#mdxN%2EeA5OUKbs(ps|!o<;_)2N9=niyf-;v{AAog@dfJfKg!QKC%6CIL{HT)M;06PDmj_F@u-E`W8yu*JQ zN8QPTzmpaI8IwK${JrBp6A*f7zg6|`zwyt!g?|kDzj7V^^L_s$$xY-xZv6jNU$Jzm z%ioA8{|v_eZ_wA@mHM|S`cHcPThrf->L0)N&olQo+oFp~=c)7x|4rh5vKRUQrr!Ri zzJHsw-%|XqsQEt``aj#({|0^iPsaUsRs4Mr|M)$h{Yy-=93kYR#Kk}KcfJO(KmOdv z!p?icWI(_~-vV@$x|o}|cwcYl8hf#VZp2`i?hZ+uY3LmTv$?Y;oH%Ay%8*b|X~kI6-U~E%)?U_b_jRwsdptG^r?liIE7_zx z=dk~!QyfJ~_2?CGmi2Okf33GT%)1Ehi$Ob7KIN0BC-X~(K2~MR;*qKIyqTAc4`1I= zUuw6KUsmJ9JP6@mh*eUF@@aS#^scAnzUOc=*^2{i+wkwK)_QKxWjN2-DexpS#-AJb zjxd%@lgEsAW#q$d4%qeLB={rH2Q#krktSUnXp z;cOd`C1>F6m_k|VX1imNSvkbQ{n*13p34fKvrCbHjkuiE-gC|?jnkx5sW z4R8XdPQBXZ^Ux<1IHx-BmQ9DY-7`@J1z zHL|x%9oim~6y&n;x40YS*=Mh3*n8%7RNRc-6+Gllf1WJ($Yc2E7mN!Nz_@Hy;4qVm zmkw67@sMF9DSU0Yoehd%#HjI8=d*BKiXy0~IJ~7bRN$&g8&4&|osUYyLb*1!Wpp51 zN|eD+{9fv*3AoD0RA8rI<|Ef}Izbg2jA^2%D7GPhf%EkJX<`NXZ3c{z2K3lKZO?x` z!nx4%gTT=LNDbVZD`nVip=de+g?-d057Bikq0x}Jq>3f8(zixW_Oem#es38j70O^2 zcq+_I;N!Ni-}@Ijj2=>eQO?K z%R4$DFNR?_U*iNo-^N0|{~4y%le}o97eNG~Vu-(Hl!+T(>e3kq7K|1)H-?3TQg7*; zCls13>Z*%K<*2I6r!ptk%y}#O`Hho#uN~fY5pq$SZmrN79qJ!2DHSSJ%u?DAEJo|P zpLM<;uPlATmJgR-9d8hC8t?2>DL_A6VaDn+T0f?#7qfD|BA1#RMy(%P2+y*lpG!!J z-A=t{5TM&!>h$DnnP+NsGCfXCHngNvvZThP68FG-&echB`0*ZqLuPN zrS#JwDH*UK)1jyR0wuu}0+U86tM^1^>4^|e7+gZkI9IT_+PZb)?MhHdu48iH=}q37 zy*b_70jwsh8yE4MbixJ%@-xebSM*3UROxFln=_p$@$M=9F}iUSb#q8Xa8~JS0FN{C zBfoj^X9{|B3a#!0hsKbyfV*I&P^BPPp2Bs;s+^9w5laYR z`yR17p!(A9%mHx5UNa$|PyRuiaGu=PCu}xzw*2)abj)rhQ0#-8pXI%C1cM~Wk1*zC z`r(U$?Q7s+MM~(*2qxtc)qgE?tPqh6Vpxv7>nMUz%l2uD{P(P3{CC!n6pN7tHQIf-3XM9z_zs#|5LdoigcBrl+uD?I zmLW=0J7Fei0=UI@3(^dj4N6`>}kb>ITdtm)kJqJ?@t8_->cp-l15Z?cg5N z)q$rfvc2&Iu`JHYt7(c^HL|^GQhnzjG$EZi_;ybjjE7_B*RPIWNnDEih+qfvSN8X` z0Hh9DNJgxCnbnm>@`e~ZGA^;cN-o7KlH3~how~vHdl3n$m`GKt zrM$H`Rrj!}F37LY(14u4ye0F8Yt}8lUh+=i%M?G zfi%H|w>&&N)snWk=?*w+%JJZpu8By{XAdbM%wYe)w2ykL@Lva6{Pl4?85*R`Uv(8; zKLy!~wA~Z)JT8nhl58UPe;8}<`LMfR2&?%32P#ufP9lbBXXEgGOnYHi_8sEjA-BWk zJG|`Jyy%s*^goP~!!pb)EQ;-eSFgm>ZA;PxLkA^`Vh=tKZ`)5a1%rL7&>5wOeMtVn z)^6iMd?9hVqjpCSJy&{?7+l~9-vv(an-vRw>Qt}02 z7e-NYaxO!>*y9>qZ{;d!CbmD1G4#`_o4`ewQGShE`S+Bf?op<934@++< zcZX(PvbrH4C9~?~x*4o(SCM$QHxA%0s$>Ze*HeAI`>E&i*Y3vF=f*3Kpoe??@dimI z8Mh0igozo#j*@qXm$=nWtQ=<+;HM?{dJ=7pz{QewA9qIjSN8e^v{av z2|>beAy+Y$U7O7sl?W;wi+lxevQ2Rs@gOGw49d>v<*$6d_3Q`Zp|F7MwlJm+X_d6! zhFV$!*N>`>yrG?Kpp+nRiNqqYYVq{KdTwiYpFN97mGmI|BgUgt=^SYCOL%l#j`*bQsT}@}1LyE%|(Mt0eRm%3a~` zYzmD3b896g3`MPI^zje%A%m@;|3`a6G{50}aAYR;RmiMDuLj!`sY2DIf9hh;3+ud)c zZ4f7s9~58EY|nuGSCGUQHo6KSKQVkucL`rElFw{71!*yX;cUYJ!S4H+R{=;XgUKlJmgG^MIo)(ZnkEClI%Y|`sd zj^tUvw@THH^LVLBKTgNb##9qH2c2vRB@f&qzRGiAoNNnU*byf@Qp(%w4(6RUU}P0u zBsl>=hglhyjaJZllgG#==%8Y#ye)b!8?)`|&x<0(^ZJg2i= zJZ-kthU%mz0>u2wT{FBnY8fQ61*^^pXI4aSE%lxS7%g1 z#ez;IM4b9RD3d?lRXgD@LBgpmiMe>rUQqTUjZe6R5L`7>?<45E@3}oR3_+tvH166P zI@3V#8AHS$T>G@W|&c%8=|fJL&J+ z5xI^|dHNg*_7I(4(Y9OBURxW^haiGA8>OyO5ApvOdG7($)Y`6#>JoLK0!tK7KwL{H z(p99lr6^TEdP_jMLTG^yAORFqRGM_@A|Sm60wfSb1%!~GQbPzuAOS)G5-FkH$@>4j z?>=kq|BgHMxZ|F4#u>xmAjHJXZ@&5FGvBAY24ZygfL|iyi&LgqK8IUxW_zlzWe4aB zq1WFr&zLaWUye+A2JJ0G+52;ywb`YeET1*S&%=$WwTD>UU&ynIRU+t3!!sBmBzmj7 zHWZeBbaX55URS>JZTOJ}IU!_bAud}7pNx|}PKT}l{JmqXu`hZ@| zU*t;et=4|p8NHlw$%4YNeVaMVI+d%mmP`Yzb>*w?bgk~3M9C@Vf0=TQ73f( z4*ys@7j_zg;2SAxiTAU=Gi)&x#s_aPsalvM@S*&d>v%PoI>+} zI$(ARZM<#avoGs&p_#*TWnMC{uc6600A+(!4uXe*^Zv|7q-yckpk9}R>B05xKCB;h zpc!ySTrS?)+IkJSCVf0ncG9_9;K)NCs`9Cc4|#*MNm(^JcSk2`B!CeGpaq;E0{g$* zeXVlMa`9_pqZf3@ZEfH<)26+7Ut~?8w|}`kL*z1R03o^Yly#<8dmIkG9f9PToA8ea zY9eYb#;9$KvJtu1rJdX~?BFCNJY(x|(sCfPXxyFVr_)02o%CnE8GlGaBp^44>XPuX zU0hA2O&5`t@x`4a;pR=k9KuOkeG$u-!Y z>)C^3Hjj3B*NrC#2Ltfj$o}eBpN?W|GXK=+!Q~pB@Ei=H2@Xfpitlgw3g9+AF_}C} z!#E!eT-|6y_gC;flEK`YuM^i`4)-tf;Ix-58oVcy9tw!6sJUf!J-#G zuDWa+-g&wu@SVll_CafJ)XD9C>KN|X(2E$JL-0Cev@Z`kXd{>m5#*Ws+p@~&Yn$s& z82O!c8STB4wmtr}%<0QRfO7D=z(gQ>_SmG9y4kQhRV(2&>+YH|k7nr}TMLo5MH0&| z`3@gh#t0`aZ-il%C-@1E8+;Qmcx2^V?ceq*x*9Z7OGx;rG(bK7T?(RTBaikx zRn71PSr}KJU*xFMWCAB=?dmo4D+Z}_UuUv#hmzt;2LEvf0{lYw?qQehzpOVU#$1%H zj~aH#Ic*n=+BAcFpg-5+PPexWK^zdye#+{jzWNKEYr$Na`Ig`_Lk^DFfL>snePRVJ z68d`7?I{+}hu!r3P9YeyVza8Kbhiq2Uf>F20nWa(=B!C_hT00)#zNfK(re|tJ=X9IOBwX;FI{M4L%4H6Z(hl! zyWY|*nGPfzAYR&DO^K#Y)kLgSr~*3HRp-!?o4;~W$&z$~*OmqaYLP>K4(*k7l+Rd1 zTXw&?S)L0ugl0ikrPKl2{MaW`eW2OHRUc>xb^E>KE})e7o=Q^Hf0!hEh08PY;a^Ds zKn#WXy8la~A>ST36SJ~0J4=`1ObdW6)(5oi0VkFqvRAAfRM^3QY+{Z?xss)no5-f^&G(~#c9ByyRC zeumgEdDwA`%+TdsU_1kU;5mg}c4#A5Tr~3&F!Pg0IcI!T)VBR{S!n09*;rA=L_|fS zT>dx8h40_Mg-uG6k8xPf^_f*)`2iM|c`sv_Rxf8NI?<|B(cx}A23`mChxX1hU%aM6mzZ1NjLVy9BXcSg z%6HF6ML@+-Cx?K+LvvuH3hc!aM88EA<9NMNjsE#J9;Yt4Q;IEI4OVW`tJQ!^1cr(W zAmTt@?ipQV`X;Da9DU*QEbGUoUtP$*CEs^UYy=2Z<1D~LAO31eOQvI|^jLbSuT-!^ zS|dv;tcXUt;u)WF-VF$c(WXp3i9jHQuhb zt-mrvyw%&C6VY-*f1v%Lj^m=mKfUu>Iw#jdoe{*2^}hSZZ45Q4eTtJHrm27@ZdBL5 z5x5HTU;<=M1+KYZ$y1ntc<<_HY4_OU4iY0=p90%NXH z&%d-LxjP7O9Wk9r_b1|n?4nwlqIWjXZ5ivqO-Z-Iu#LbE1<_Tq@9li{DOksMdtksreIqmJAI2;O(KU-G%c5i=+0=sL*Ly2&q!qY1_r^sbC|w2Myoe^ zf{PvC1G&gHEcT0Sh5)aV2wKSuzQ37{9h|u)+MG~xc38P|Qu1P%<->xXO7&QpOC|mX zhP+rOr;bGoc4LGoK*e7hp1TJRyv)W_0ngDv88a|=8kJrzhp6LPQzC?e_nwPnB#G{- zReTQPOwQ&oy($_a!|3odK%Rxw4Y>Bha!cZvc?m6Y-OTDqm}*oFun`YXJhZpv>Vj6| z8xKkk_E+iEQ6&l1H3VsktqL36xDzjuEus|3*FLQ`MEiIq*9}o9rvu-e;3WsGooG)z z3=nGTsZ&z={`H0{{iisYPdGNbIQM*h;RQJxuH4u6Up4TL-df>Kx=#V?``4sSC0^jw z7>wa)2Q>PS{+m&VHjc>ABb-_iZ-cmbbAousnfDL4(!VpP>j<&`NZ^OsQJhuLt( z$#I#s^BJYl^?x*-E1qz2%LvVfbRlHTq^uD|U$Di4*i(mniL_hf>7xjQWAhhs(V#=| z7l%`3W1>$duJkMG7mOH{jr?Gl-iy+nbt##(<%P%&b8}Yzk@t>c-%_+W`q)FQz)+@C z_MBY`{U29{R$Fg$_mkyo)8}0rggp@Vjy)u-J*tiWZhwxt*cI%FbF7RV!f>lLm9F*Q6t4gWqyu`3PBOQsP6N;Ir@I4J)8*>gXG_ADB%3Ixo(0MV%xxI zC8puLe9=Tbhv~XlNBm;6x(_Ee3|?ylf9lgRY2?tcBd2}6kC(Rz?j-bO%^hJML7?waGR~Xpz42K0kUey7~u-+^n`9TUJr~x zh!Qca?O&>}x_+9&bI+M-&mPb)OIU2%pHZRhyZMKomcJ#YPc5qOB0ZkV8hZW(Gz>A` zt1zdGHf;813}iLlKEpL=BoG|D%6Ib{a)w}$pL!+ycV3O?+Ycc+;UG>epV~D|>ElnT z95alonG`NygIAn+arzVg!4CgwDr~IM%HXl$J!z?0L6D1+^Y_CJp7&lXN}&Stbi|l4 zveqO$5EW7718>I$SJi{_x2X774VW5 z177k1VY#C2om;Ty(AUscTEWjxkdtlRaGP__3Y4ag|I(NbeFWTRWoY3tUSbkYU?n7+ z7{p>XT7_mRn6%EywfmX#EvK{p=D7Y^$K3c~>NvYcc-%Q3#)dH_LR@A(E;&9B6Yos_J2*x{I&Tu@%_ zJ$T#obp$oj6T(SNj^)@VYiXTa&l|g*RZaRX5GLJ~-koc0I$lcJ(Jkjhg|^1@xT2re!v)y7UMjYxM8CrsQq z#SILLnsO5+!hXQk(N$OaHlRO)^W7q&+9=LHgAwwJjO1U@s>2i^KzCRvZFt7Z3$T8B z_#K$FUvZ3>ixhGpNDO5MiP~F~3-j~Ug-x`FuNH;RMH(}Kq&smOrb!&&*hOStdf@LW zI;B+gjDS*dA#E74uziXTjvzu`HzuHe#yHby(07%A`(unXzDUP^%!i{lt!*idR{HL9=8INDn z>sR>D;!aI4RY!R40SvDmLV}0g<QcZ(`MJPUwYFbr$7TB_65($Ayz61kPN%mFsoxx0Nzm^)+i>) zy=AUuwf-SyrKu2HSzcOkvI;NLanOwIY_T6*?V|&j&O5ZpEx+tkk_MbJ7kuA{ zcyqoBIu?E>p~^FWac<+{p>wy`WX(yP$dXx|vBb49sf{F`qMHo~v-JBM<8HvT+rK-t|UXpWwoMTC=?Q+9$hKu_f=fYCW!MVZuDhA6t2&@+l@Yp zi4XBjyEUjS4((#A8S5Zef6AzgJT2xQ&~8)J2z(Q*#xZKwlq*6>Z!X{2Tt+2xa;pCXwe0@?i;JRr7I)nl^} z+%iO#@mAPVQ8a4P3ThUloFh4iH1tV#G(sC!`Y$2|wN%Tn^p5pgx8bfeJ)Ut)FElj^ zDdlC1#**!)i0jSWS(R*&pcT!jLM*mVQMC)xN|}|0G;M)WMp|G^`6+&G@LX?b2$)(! zuff3x#$FKD@Oh4yMsAD57OY0lk9PLV%)?i{rCCMxH6pi8#hw9nV3^Iuun#ymcq26t zriuY}bJt3I0n_8o>OorrHUfZiIx~zg;tqBkh=zr}Xq4l*x3BOEQTXG1<|zK-)9UK-6Y_m& zX~VBNKc>UH`F9;6O(wen%bLX%Hca<6-m1M##N^8uKn3*XgE#O)4l8Z-ZSDpxhpDgM z2B~6BYGqvOvu*~0rZ;SvGCbd847ZA6Jn-;9P}#&=tbjmlW>C{hk+t6m$QCS;UP%J? zSsbQU*U8Zx3f3^E&^m<#t-5&ah5g)i!skx)~euAOiWL zQ=m#=V2cHe96&Yoy(-Sw?v+se`GOngGpzCAX}(?UXx1;4nNWD9!emcJ{zr`PILxm9 zF0$Uv>8M9nUzX`T7cloaMk8V;gzl?GI15RMk!1})9$GU!s%1VjC~50l*9Zcr*pHI{ z0VWY8xF^CdV+%NEmT`zQ^3!|IuU`16vvs%!fU7A2{y0iub+z2jlTjR3cGS`qz38y_ z)ZeT8s%8&6v{Qf6uDO4wJs?{3{(`?Bn}eT+v}t!#{!DR`%x&Vts(}oZ(A3TvDZm1B zmknoTzQ+P6!!GZ&c7$WcDg1Bw&u3wyZWVT{SA_QCX}}BXvDBkSYmG(F8Wt^e#ph$) zoAFD~S2~mZNA0ssQt07Vf#x@9Hi8{erEme77_unj*J@_i&LIRSVLG)dO#pjX`&pTf zNC%Nv3n$LV_M6;17OTFK)$U*1Y0m1OCq13q@X7d{9G!+1Nfs^i+!6BBS~_B3$YEDi z>+lDO=J!e}Uzb-2J1(${k4@j+Vmn^qc2y@ZeemT+KD8hGOiF3uwZ?L|AER03Ij5$V zVDOQ+jxDwLOu?GTdG}ZG}0m zkH~%B6umv#EQ$k$LtILp_Pdu!UOV(wfc++>ohJzqj`(vP5Np0%js4EHHpf+QF6>T| z*Vsz@;jlrCna()CvOC?LyVyD0TKHJI->JL(B;eb=Jg&pMykX9h6lSahXe;u8m|(8I z?AroPe_WqLy$5B$;Os@oNs$DYsx8IcW0f0o`fi8PCM#9Iq0h2|r#&vgQ;d4WZ*Qm* zssX40PzQ>DbAEh`X62kGKhi^4RM`*~K{?W}U%;F*ec*kI%!5Cs3V!?9nW_}3NAwM+ z^X^0EM@ARm3%8?A?_#)jO)$if#YaA?bwknok;0H@eEQ^U>~VQiO_r?R;1-uBFj@l1 zPV)PqjID^7e>m{&vCkvYBK+HsMBQHG`os~9YP#CUvFEpba@UsLyL89=?E_N%iB88) z+`nBYLSF7!M9c6ez4cM;Y4qz!nItx*fXFX%g)&6ZVs=pYcm9f3F3Y(b2q1uetp-M% zP(W}KGgTEh^m96t`&sU~zZabgVOO3F|VUX7=Z6TuxZcyGF)bCh0DA&E2xlW8|%-Je8EUzfXz{-AR_r5MO{{DIy;}ua9 z$F7dw3f#E`0p=n+hs;e}P;993RDJspXHicfmpkCm?D>UxsV$ZTH&_!>(;>Gw5K3kJKTkmODn@_a<-x4O^)Zs&u zG+5=c+47@YH9+#SZ(a)=D&eta^)qFAnfFe@syTZe^S^E7C+zU#{y{wTt|nv_uNM80 zy_{g{bkU7gW3{*a=BDiGNWxB){~kV(BwyNR z&ACf*&Cz4Dc4bywkKJEV%;sNLp4xo1z^6=S#u^m!?;o8d-BcJH<}908oRQr=P^EaamUCtx2F*w zA>`LJDOFc@-X15*ht!4>I)c{^MIt@bHi;3NW?Ow1NjPW>OF2>3rEYZ5+s7!7sP0$nGF02RNS2ICJu)EyIx&SE4Xu}90^7*h#ptv{MLQmTyQvDnx`u+Mqp-7_2=RY8G@1OO#tA24lQM*+3%-NK$ zRMRS@JI`?9s!<#KV_2#0>Ivitfo282H%;Y*_9L_L>XrTL7Ed#7wZr$rZ+9NOE%x+w z@zHf}1+knm^iA8SXIwG3sh9jsHV<-<4eQm7$q-(Fs0C&$!SJ3 z6tprYC5TvnlJZn3Q7KViNm+)?h4`5q5yNo(##TV zDXqxuYhEg`f&5u6Emun25|A?6lit;*q3*b&3{h!8W3Q8MW~&IPtcJDqsuAte6o>Om zzC@)$yz8n`h4zQUG%j`UhE|cdYpM!ccA4&up%>B_Nr&nvpCGhi>X#>i9_l?F(%>{= zuZNLSf)zfSQJ^vCbn#kFX{Bu)Y?|)o{bLQUG?@liW;q}AF ztpYjPmB~@EKA%23F;;P00T1`gegJ2kp#x2SJU7}Icg#i)PTBNAOPoS?BkPBdFux78 z(XQ`ULdQr2*0&9|n#T0?Kx@k{8W!3;y5+e#)M3!lM;X`WnO5A$K5{YEkKohE+{(qD zM&<^pN&}Za%1i=Nca`vRR><|BDX$mTvNS|_5J*~LVp2_Z#$UKUjDro|^YwmJZRlB* zaw1GF@R$NwSw!d%`ml>MiY>33Sa;h1l_tG-JBqLiO;bA(r)gEYZh6rTQ7$-PVWqxd zIWp8XsrM!paCDh!u35_IXq9SdZ(!^e16GM4t(+(&J8EO zy8a2H2XN=QG;ng1%UD@`Gzy&T=jjk}+9z$6M0#7VI%0zAeV21@p&nYY{hv$RrHoXKEcrdh>_iRv3!k13<}dAAcJmaW zT~2FR?JsL-$T|M_6#Yk|VboAtAt2$W3(}vvb17O{brII@Cf8BUo<*1Kc=iRKN99_A z-MJWoGs$)>ND0x7R(DR?5B;W=o*q;wjTs7(F?(K-*AflziWy@ z18NE$1Jo3S+NC5vPO?RgWFq;zA?%YIc6(0Q-!+zdM`KT-B`&2jg^ zmy&n38_vexNzxi~cMBkxN}~ruRg(D^RX>cKbE<3B4Ypxv(x&Jo*lzqKETYd7PMBcA zYq?m8&6pq{A{<5Ws--NYFv9fwMzSE`D~brA3T(lI8m59xG^RzyCQ#{ZFr;$Ln1$^m?kp$QRQ*xw5xD6XYgK{|0Kyq+P5AwsHofw8ELXWS7b8q(J|M^VID%EPZL^?$4tn(n)1EZw0hZAQcm^F zLP*JWELxm5`BNYT6s66|>~A()v8Br&HS)hB38sB_q?$V&{29r>jLi+VeCZ^HrUin& z16z@$Nd{T97+QbVyf=H%ykflDh#@Skc*2pF=q$J9EcfG&w0j*bpSP_l4-<R}d|+EyGY{c0y$MaA&;L9Pb= z;9ns9V&}<(!!FoYBsmv!+E9wUeywm_&V!tQkcNU66ZFY``&aI$Vzwi6MN!?G6;D{V z%p`0)0SbxhNBn(n))2@TeOv;UTHqtvJBLb1z$`qTwWlqdIHwYlId)T3M@ z2IOJ)YaQih@fLW%ZGioe+A7*}zUaT2eLcXgjT{RB5v>!sLcAA=%eV3^7vm3sU7 zlYAj15S!}`Emoac?@xoH>Pk*f^U6>BJI(mb(4X&E@Rwuj-&I66!}a~AL^r)12X!Q}Hzw>|NX6u$JXZ}IbT&w-pY**L& z|41bM^Id-YBhdTY=-=qSQHz^V|C65k+b4N-f2r*Ej*x%BH?CX0y07tXYxB32K}h}6 zdHG)+`M)jHe_l|)U-^&JZrA&Nvnjfo9{peOxxal%9iZZ(IA;Du7W==S+5gXK<=}*g z{Nt?sr^P%t2mh0v`&%^tUnD-!b3FgajQf|}v@7ofZ`^?$I_@#oU-aR>RmcDECdZWi z?oDkjTq+YkNX^gV)!^h67Uj$Swn@+6~{#jJ{sOO-^ z){P9+hUxFT`8QsMgM8kJbyvD%eEI5v9o36-xoEDl{YGm2@h!y1MkhXm(_=u`Or4_M zT1LP0;bB|=&E}Smu7(K-gkpiWo=A4(VaS$`W)DS;SH5gB;6oJFO($0_Lj(}HQtM-P zv7_FVF0_HgQ`pgpIG37xI*1mj_4*qKg*Hn*#EY@J@=7n;?xlr2H1xD5=pfAbz(MAVj*vJqTFq>c{Sb?Bxx5=Uq%owt`es&c zV;EUX%^}t=lYiPgBEb!Dixq!gy5{4_RcBeFJI*+9AY~9cgz5>-5OQ$6Il&*jtb1_P z>5zBmj*_W)`cQPTH65w`^bU|;nVqZ`xEZQv_)@GRI{!7qr>KzwP|4v>^J>J2ZLXdE z_`>kSykMXrwu0?woh_SElg}J$I0+aol*D(ayGH=kP2YM?IF|)1bIvT?c*- zQNB(Vc*a%o^+T|E5NB7O)N4e!7n6G1k5h{qeAk6@Z@Ybe8}h8R+c-+P!u!E5`*SK1 zdU8f5s_ta=#xj!CEf)0+%J#-}S&q1XtJ50{Q@?nGKN)8_aT9c=Md7Q~z@j{*gxg-;} zOw5&&(BmFh`TLOl>i*q7&_mBSVy`?EeJ!xiEhspjYZ?(%dKExAnrt;vdY1=+;^Mtx z1(DB0ULGAo_Ro<3kmGp(azuszkP|~04Ia*oC%{X3Z0ab?44-lWEZT)mY(hy)rX8Df zf60iXrmr5uNCh2@fuOxYoYNILxcUaRJd=vD?8CAUclpGWK3Xp^6_1lEw6F*{`EfGp z0OaWUfq@FEAc2wM8AN;m0Apsni-D{)vm9M%pWsLaWGE5-n==a{oMJB?4Vyl!ytI%*k_A^ zn#8sI0M~`GYZIYR2wr23j~$WEK6x<|+NVN1x8)}ld0Mux`%B4YIGY*K`s>KuMP`QZM5h)5=;_h*igA(a=ywoD) zuT(Q55~L?;$xWRba^z!h>q#;&#?}EM_U?+Yd4{!?9K@Tx^vDMbh^(!LS9Ht0%u5S- z^LmCe@2k2#SV!A~BVw4xO0kQlYA5vR(kio3GO7c9!SJ^vaIFuGQUw&uBB`=w>Q!56 zkd0jKQSzhus(3eP;in}*)|)P-X|2FPO#_JdLx@*Qx|6DflmRtA>1JfIQMdt-121+6 znrg)V5WFM^%XhwBBHrV|4LLu|dwv|sBRG0Ynd%}V zco4L9lRJF)FcL^MYWeyN7(dIi_5S$iF$5re*x6zAJAlNXhm5uWYN*4S`|b&w&~$EB z(=-j_THZ^NV+vV^z2?h=8pQD3S7lW=_2;Ov&~_*f#UCu1s#C<;kWD-9$_`J@V3|ex zhdX=ut-oHh8EJRQaKRUAn0v8f|M+_H#y4DH=z_v~>S?34%ygrWpao#$GGwk1@-`Q; z_5qR`I%O=dc`UI8@@`fp8Im(3D|MQZhWH{L<#Qh^y)?M%aT?Mn(AgS(O`JS0ni#w3w9{WJ+hCDCMdU3NI z+3*$YN!`4V@0{KW#WiF8^+OasyIb&RK4-D;!Hs2X-O%yI+2uz&;P=b2wt;pY)p_l{ zkh$}a=pO5dR+CB0lwt;O1GJZCNIb-f!)=Xu*YtE$?9(;Qj}^#0PWRj^)=-Bn4yIhf z)vNRRLC6`RA{)T4}JM|NT}>555VhI z$voCZ&a#ui&C88mVx;)#xo7vGNc|Dz(ZM!y0_oCvM=rE1*-da55%*4f%vA8~?O*r# zc+^6@=urD=uXLoWr~c5cn$6jzFS}`555m99tg+^6I;A4+x$Gh9j%8l#`E{%x$QNAe z7i8#HdC+0U6d$}8T5xmm_Pwfh3+`Ga-_td03Qu|ASJ~KHxN7{2G@dj(9uk&$3b-D*Z{y+H zK&qT{)%6Iujxz3I_M$-7mjZ;kRXO)b>^IN$Bl2e2o4Re0ldiOELXEWA*7>PHVDTcB zfLY=#@7r^{w~XJ;sztJ%Z5VW^YhLPjE@Hk)E{r#hc z_m!HtJds`9Ux5+MdneQvs#{3k^uDj@^*!?OC-tJ(38U{0(G^F>UQfgMM@g01{JrdF z_qPyVCa2bIB6**-)Fe0Bh@RLkzyHo~&3v7(g?rHA8N4`H_F>%{pl_=~fbZV2%j4F| z&)FXYa9?s$me-zrzOZ`zfHm6P23EbQzi(){>tTe>7MvxRc+@U3 zxH=*mp?bzSBHf8mB(>tx4Qf-dDdSPkh)?4eCE2QLzpXFPEje^3yxrjTP0Q~dwWol> z|DZh9jaSijZCn@M;72+XV7v4XnV!cf!&CN^Z5=b-KW&r-!j$mm#aVIJ)~$eF)Tb%z z0lz@)D0l>}U@Q7h7&*-qTFy;%d1|pTVLd_Upij?FFD&xTbF*tBR^-DMjOIY&XIA-1 zP@dXT-l+F#t9H4rUS9KGyTrpv1L||d)p-!^P?f}no5#kZG~QjmYMrMq6Aikql6N=L zCH!@8WA|61-D{#-ffIe&7eDMze3a?s>F!as8|7a4*vLon@(56%o|=wRRLPF5gEagU ztH)qn+4&diFyz5Muykyb&wIH4FBe2egZfr71_gx!Uf0r@iwaK)99bJ&E|Sd86d!zx z#+6=>Na~+{F?TcX&UkxYR{C}cz^Bkd_*v=Q3tiwy(Ze{N=w*T(+_)=2F(hj1+#duR zxuhZF9HPq()l&D7NOkB?c1D}tEjXP(l94G!LEqi;HGMH|V>R%KTO<1-_9?|U$Vm}b zJHOXr#tOf`Y+6GZ}Thhq6 z-y0;~*Vklyz7Ro6xyZw)h#+xqSiR_@Ui6O$Nm;j=d=coBwgSObDDMtQhW*upsP}wez+x)JuXgK!sti~_lk_|`wfeUMX(kc!ZBVltis4?J0y2v1uH2muX zWEn#@dAlS0_WLg;T4qT`CoV{S_Rd7=tp-6Evl!9tQ~Q3O6Z#Yl#7hFX!E>M_x7jaq zaS-W@>#7T+AhS6Q+Aop2Ai;KOjxoMSVIg&8Oih32>}V^!e*+K z&{u(1#8SA6idgiZvHqlyZ54#o?3#%5`34~FwfBIuB3q#Y(5oB1#tXL{ER`y5R6xF0 zHtj_ge@VnI7df{kl?Mp-y>gb_ID{vO5}MNm7XE;7r5|$GkwGiJ2eebIwh+xtk1>!A zL_LOtS)Ho^>!ScQC@NwUnjncb!I_|A&JIK$Bku;(Q}|yJhI^Vw9X9nzsAu~Zrgs=3 zZ4c*DB@6JVCuOG|hQF)THTX7x>0~D^8jIg~u*}h<|_UbH4<1^k~mz3-;8Jrn9%ss93TG`G|WBpfD574!h zAb&u=#>)bxIlKwZHxO_fNnD_4o-V}36!y*8Lf~NsEP!wD&*12>S*^+X}VMOl<#I#X%fhB69yr{aksO`?2SYrcW} z+!$*L*~;fpEt#ZhQ-k8I-WNAIUK5~VF@a8EDE9I(9v4T|03vlKST$R|>st2ZVemy1 za1<{pvE-R?8&yx%tNQO6f^030Gfff|iaGZxRou z?Yd7dNlO=o7rQsuxbt{66@4Pg5lsvN&NHsaHP(a8Ee*+*z&*F*pkx6d`4@G9RJJHv ztijA($FVMLEeBw_0vVNNcCtN^@2phsSX&#`$38gf*%&)@8pAsu*0&Sue=G(Vdo@%+k|E9?%dSM}UYHe+e9d0b#A^}Z^0 z-+-SwiQGBtt)Gu+6GHj)0J|QgBR%laF>)bamR~5xWVAT2MJfRULi4^|1?KrCUv)4A z_;OjGNQb5WD$)u*vehv%pCbeX8VyDR>ECw9lMkFR1WVTL71=&`bt_dnpIr86Vum)P zQQHo)$>;w#)(S%Ff{#%?JC&@uU|fPWkbor7lA<|XfqhBm3WnPV13tGBEZZ3;WCPhH&S)4zYC*WdAzZ{Q~lavOQGXR<7rS!BxHLsn?Us zj`XRn%m;v@)SFecLIF3m019~olISks)O5g+#wRd+p96+dGb*%_DYt$=KIGP5)NM5T zuVJtW%Am**tTxxy;90s>iy;hsubrLQc+7^h+`n>vz-_BD`XY@0&FkE_C5$4GoZ3fgBy_GRj`n&QcaKp;_@bcDA6O367Q+h-rp}BlCsxU4X@*f8M(huV-e-< zWaZANc)4INj8esgTcyHAx*-!O?;*I%?Q*^VB9PA+;(@BoE%ac4@(8h^O3KEs^=B5n zG{tN&+y1U+c7Z9eRpC~ZB;h)ycx}x~Po-sJen_oxJV;Jk9IaVxM%bdk?QKJu@A7K{Y0g-s^sxYV*s05^2JcWGo`l+qAp}P zY}EXQUVoypG7TVd6?2BvKtzC0Q(!%G*VU@JXIEV>Lm`?Id8I=eR0zaNX-{*PWTy1% zMv980f%&mUQImVK(ZjXr#>0F(I01~>D3sWBALxv*WaFn0eX~Lx!&G4Mv#l^y(8b}b z2fb(HKK3Jzg9*xoK1+AQI@WaPyjewoWm3;__j zYt9GCsk1SJgAEmUv%ol@O0NT#e0WPY(2-vTtfsj`Djlp=TYwkwaM z0<=XfmIMBjqsfnxsIMP2c};Zlx@a>PFvq+wyvmB^IIb5}fizs%wvQ@=3GgEEVj(!4 zsN?L^DdmfXONYcnH?8&kabg{l(Li#fT~wrx{))T4KQ`^YX0{J!SLVT--2dqM`+xcH zUvW48fob_4h>3sxAOBmt>_3rJ|0UJ(pH@wr^I!8a|0J0HPg|1z>UjTcb^lLak|w~> zA}ZAp0BQJ(9QG$0uDs_E-IV(Gx*}Uf9X}xM9C?w(FY)fUL4spQ@h6(qY<_>)^?WOL zt-@YpR-hpeH*rVH%(q?3*QcR({`HvtMa7p$+hdBfd!?U?gYKoVADL0ZJCmZr5*vTZ z_~L6d3w|2>0$zS;`Cd&^g|lpQn0G|;X9vqnLckH1+PC6x|GMkL*)9;cT^^r%rz3YqUmT@3STj{>sG75g{jeVdT_s|9Fd|zRf8a- zsETmI6@+0_VX#dA7rdzt4hQsI)_|x7fZTw;2>>kMP+uh_J4d83nt#$krsLv#y!G<- zjMf>XiBFOIRt^xUxRpte9d^8k3e8Wc=?753dY3)?0EHTl$xJ3`c+CFNiWJ@}S^0kjY8tcS1Z49Ga3DoB> zWn#FM21+$g6Ga=N2RiXBRwa^zefp6oQCkmI*n~}ZA+7B|AHi+p-zYe|de{BV?K!d5 z0y$dhx3v@MBSDzdZ$nUZ8&MD-wh^eZ5RrtH`Y|Vx5Z$&=K7e(jn z9(@}0d(Er$fc3!jUhloFJWvEdjFRi{Cw5gu^=LyjN})TVO~=tw;7c%(TW%3ui5w%6 zdI4Qo3o6$m&6rniv8zu*T1fPKXhR;#BnICyeBz{Wm|T?szIaHg!qPgp9uvKSE!dta`~%I_@MvHh#&_jb?<&qZi~L1CZ)q2pVs384%}W)wrGZ)bf-F-0RNU z`1(a6%f-BS$ZKBu@j`M-e)uFyK$dB zMBxJ9^#+NO_HcUQ875n>4I698?>}5rG;n?5ftB^hJu$!JHC-d6FFZJf z$-w-yzU0Y<`@`G6?Wf$hOL(9e>%OZva^G7?S?O!P7Mt_!&ZcMJ?Z|K<^?9Rm0!jG0 z&fH5ITMv+Ylz&V(RW%okRBaRD|K{niOnY^Hf zOBL1IIfT6pE3;v6KB}d2OsE^@rHrBsbZwWf0e6H}oP8cCRl-xYovap2`Ac!Z<5wu6 zn}1B$>@K)&uy9h!R0wy~Uq~mH5V79(6+`z_iWvb%qDYO{0A__X+7_`3gD1HR^i^6!;5+Q3_bgo;-Ilr%c-xXWsqk0vNA`uKJZzf{f9YC zaOp=ed6^;$5HUqcLZw@b9Sn3W{1c!Lc>)c@Vnjh>(Nf1P*J-1qj1*IZ7%6zYbm{vN zb;**Hl;-J;l*n97wrr&n|^Xu1wfS{s+ieRBAT|jyh z5orR_YXGGRA(R**5I{j}GywsTrc~)A)C7X`UX@M=J=6pUE!5wQ&pBt$nSGvfc4l{e zvpci@K!lJn-O@<`hS0^64(| zPw|%tb`)A_d^cKaq#6Z6G80)w-AYROzj>$^@YlA>)RzOj%^1Sg!7dg-;~tABB?OT- z=xEHYjJ6L1HqUB~-7#TU}@RrfFa}LZ9ntbZ!4< zt05b?PCVpSMoiVv+7LcF3u}Zz7`au|kl2G#u)9-BB*s4cvfGQYp&p1f4pcnpBFXs& zmWPB#0N3%E>#GkAD{AT-^p%tx4nnUhj73-tIRL5J^K52zMn2;e==Jy|rZj-zIpcbU zzTy#apdII3OEmXb0}n0m`1v_f=w&?qs;ywt0tt-$UFwGrp^TI$g|1Wyul01$nC$N} z5Oa()Xrt`R#8`5}8S-NFl{q}ctM7U6L*~Z%_JpuP zQsbA74w#e634(do(2_ZFzte7F7oD7^Ux)u~PuFq$bNY$40hP5a{_-*xR#LX?QLR%S z{*5--LJ~9wjhsKi#q-sy#D(ZPW}&9tJaHC2FP_vxnG=gya}yop07ks7cY00&C=ad0+Z5Hp z$AQE<@%8R3`{7AWNm}+JNNsHo=uaU!uX2^YRI?A;#9lFjI58~I_KDql%Q9b>8}Ii0 z_i$!N```)Dyh|duM!BiU4+DO?r$iMScww4iau$}_){=dUzPfhdoE4lJAI-Z69Cc=g zRM!Lh#Vvzh(I_XgC>OILHbUs2mg^oekkXuf>Z+L~tJ^E4 zZJ9IHY~%oAb|Id$@c73J;kh$g2o#!{wcv`JG3n%N2^K%A|525}UZA@h3;_BL+ro`c@yAfU6h6sNafm z|3wKV`8X<|o3QXcHv6o6o7$E^)^(?4 zV7lv`{oa9plZi{ZO=Q|w<;~)7=DgV}Pxr?BFW@2JH>+BD@t1J!cF#x4-R5BThZaZ+ zn$dT~?9q3dpo|Al=3~AfUQi(YNc@q)3daRV#ib>!vGa8f@f+zq6TjUA?N5l(_&)Pk z0d3Kkx1IpvpEus^?FHPh>(4O(S^#{Obx#x(nAEgJ7kx$Cw*$ zDb3Ed+VI`tw`ZH)o!&kA@w5eJ85lMi5n${kKecr!heRh)u{6Z<)6Q>(-F1;E<~KWikA9>k2-z@1X^dgT#35yc1^HHF?8COpcGPbQ&vq`M8~|pEz#v#ayB6&naKrKfHS=Sa;#M`et(%&v7mB zZ;HX@3;d%t-=nIh7ep8bnv>KDmB0A!P}JYVSmG4zvN?P{*W`@-sENu&K@QB{mZAJU z4eiWiS4+&H(!vTce9(peG=snL*_HdOYm@L`^C-eg?#a`M1=KG*c z$k{g6`*kpJU}`8dv={HRM>O(h_snpjB{Sr=5q^Pd~ayC)|-m*Uy=he zs;~Flr`H@Rm@R(Z*4q{;+j~4PBUB-}#ysZ*=UF>f|9-FaTXgfOA?<1JfE~&L$BUws zxsVjIc7?NRU0G8xF5N?p6Ok3u4TfwzXPo)dj0dI9?^}_d|BBPuu(Ngbw6p~(s+GWFf%5xrW`ymIzG<)se%&ayD`MTADk;v7+ zyrQr|LHQo2PD{>(Cj~b6GAa>r)O{d?7_KcNOw~&m3S-$OjMZ(Xr&LO5L78yy{1Gk956$%=}R zBg&AZ4u=*Knx+KYHMuf)iv~r$ZTMVs_b{&3yFHd$xG|-e9F4;CzE{N(VK2W7Q z|BM2M&+Iy7cjMz~O4G%*TbrIp%4J|gkVS23pc0GuXS>4=BM>{LyBm#0tq|>u9r8q(VT=Qfu`a%lDol9w90c43hMY`}1 zJmg~PP%2=<85!$r%@Hzr*kO=`HTd{lo*wFJk%xNR{ROz_f)5jJN_68L_J;M4?@pFr zBbO^=)p1G0wG$Th9i-M}n<7%{n0o5qUe1nA3F2M>&UpY|qgF{`tj=771%QRj2{A`1 z`v$sbl$Kbr-Ye}B7|PnxjL@bvP4rix_dJ98Z9+P-K!i#NWqfWhW-(=k4q5rY$E}Mo zNFh@<7Z=l>Eq2qfrcPbaD)M(O-k{v|>Gfn~kPB<#V52A`Lt%?;qN=(}WMm{%7?RS@ zk{8tA!Kjx=ZLcKCF``@oJJQ56i9*CmBFB^u)7EZt_*GJ1GRQ${Kr5N6>>WjhPi{`Z z;6RC3%D!$EMNq{M8Y&`vmz(n?tH<|>%p?_vd;S!3-o#!!MUa>vII&mU#&+J*O!p~K zfWswP4W!Ky9tkn9!9Eno*K*0)8nX zr&Xxd>rXf+B{w-dR)WmUWt@RlG(F)o4t;1epASc>P@e6PZYyYkDU3ee-bD~VX;+~T z10l}Eq)xY|+0?I4{Psa619o@h;h+cHeis&x_xUwPI*Y|CM>d6IxXA|0I5PS?QX5=o z`zD5zDp-x-cq`nNc(asm=ONLl(^d#azt?UHun^)J4HAnOu-mn-##eDfkjWS3U^x{_ zjRQ`AMB8#!0WA#bZCj)%K4E|5ud5BL^$S@m=FtJHMVnwnY7M>koXAP?9@Pu5mx4kY zU)nTGp9*#b!39-T#E3cYr$G+S1>tKTo_@ zEJ1sn14KS{LaTQcvb&nUMe7~9*Xv$Si`FPSwdTJcQgi$Ro%?(BAbq+I>gKvjsyd1` zK$Y%pIXmNpOK^(ki_i9?zKDef!dtu&R9N7YIVPfiD>YtLI>X&?=CKFtP6n4r#S8VB z)Ks`&!uU0Ey!DK6I?xf{ab1ymp*r&|RZpBvwJm-B(Po<6FZP2Si%wW);zcb-=H;V3 zT~vg!jO0ik1*j`L3As?6p`70KAsZWO_4Fv<*_Ct(0pekYNh5gPgF|;S?W>#hHbLKg ztwp6qZZwpVyg%i;HB$V2O3YYh!;#itE5@4#gHoJ4F9(@P+{!Y-f!}Nvryzw=T6yX7!Y3M9Gi{P3cM> ztH6Z(E9~yCck+s#V>I~d*u6UZMo3_}EW;|U zczKP|Qdj+C0_7zf?u0nz5J`rCc|RknqAEy+>VDKkAQ{``V`sRWO95$RG-Zwy;w%7< znm}E?n=}WhMl#^5#O(r7o^U_Dq;eKEUQ%Wu--HpbBrSxUcQ2BI0|(`Y<;HU(!{^MT z=Af!8h|AXQxYd~Gah6fe^2B%B0h*fYK{N_5fjoN{`4I~SnMPk`(Cx{bLBV6YrJ~Rg zd62n#e*0&L7l|)o+@*&~{Iy)CsV`4flXMlEKm%ds(u>d49y!Uuq57XGi|*3qhFU7E z)L8f@_>bav#+3m^_sy7=McrW|-AB6`Z4N^ANwO?4J+Ome_Rc(}-Hpyn4LX!jW&hg79_u4H-bd4XI(Q7!seQBL}?tHiFwA&bsH+m4awha9|eW~Yd0&DR&Q*9CBy;JPbx_rM>u8Z-=og#7{Mry{9tAlov%2 zb8C%P@vSHcQG$RLuDx_9aQPGsARw}10V;l*&>4;jT%J5#8o$1G8bnb&-3@;x6C)}l z7Q?)jtkc3I3-b9U91}GocEeBIyVt9-PbxVv4=pBTjlIRTL9q|*y+@y!)l>-t%`JZi z%>zp&Qm!3#03dsSYnT9Sx;R-3wgxDQ45iuoMI9fPmYEtn+=5AhcfFlfe3FtRR{Zx$ zB}MO5pO{=+ps~Gi8IrRUu0x&+DKY=TcrKJX@54g~2_;p0N&r zh)`hU7jG^_0qm+TpQ z)c%9PP0%IwaCreDFlj|wRaA<6J<;}>n5EYD(3T4~fIml&?1$hXCdji5g(NRhc5)8( zYkm&a3>;-~OvXqtLX=w`Rs%dDUR@-qRFVXr(PqQnM;yrFnW22@bG(D4W~G!frSRD0 zXDp?RwA`1iX`+FA=+zxz#j|cJxM^$QAcQCZ0EPb>4V1-9{F^qfX!xU<7ZnM5(zdoQ zdewOno=90Z5-$^fq^5oj{c)`nXxkr`ujxzuWX;~^-PPZ8*FgYI`Q!7lRzWpi;pOS2 zab?3Ix&NeVo75^h&q76tgt4E*f8@m2sL?sF+2?8z|2C}y{tf;kOxZI$DyO*sZEkzT z{<)W=MlZ!d&6Hih(4^jEkSG2mFGY{yz$nz{p5C2*Vn8!%@-;+#z!RM|WZ_Xz^<&V& z^(kvee#>S#>qzh25sr_`6O*bqn$d0M=!dpg^iMm0RU)V2Sb^g0>`{Q2T5Rl(ba})H z2EFn7JNwdu0u9Q3CKJZ-H~;YwP5(6P{~<;v>s!$l*ds&6hEdk&K0IO(Sbo9WTDkEf zemQ0ql%km|W@M=c&v0r40pR6Fn;sR6mZEK=Ut+dz?y;^_6|e0fJ>Wl4uafEM@6 z4OAW%sJtMungV<%4gBX<*diJ7K-CT5!3^A$MdmHz8L{|!q0r%(A8aNocB&_`O} z|IQB$VuAk+Ed6(t_8)5GzkTL^hOr(k{=cv2e_e-vU!{NXnU7H4{|A@qe|LTS4@>ob z(MIuKm-(L;LztYS9@6`v8G^O0sU8|zUB>_9S-LJlqT+a0cJHp0v?IP^~ug1!K zRaag0m81)w#@mkaX|3Mt{>4=eQlyKS%xSDy}3J=W2E`f!rV1i6lQD z>UXMRJihcnKt0nCn_7s!*Mp%9m7lTd4>sHbK4& zj+wo7sb(pCQ!ScpCmN~UwrK>v`(!u;giwh#gLpf zf%FnyCr+t|2c`*n53^qYQy`apAZPab=xqL}TA`_91;ywDutSy#66u)!mAwA9>6fSW z$LxJgB`KVH#Ony&Z(G}*n(9}5wl*#9L0hK>?fpSuA5s7<-V0jR;7U^j5!zVe6cd~-ML5%xLm^k+87UX=3;)XNNxk8l22AwerwVC zYIBz7-0?yhxYXfoOCiZHU{krIU`4t?@{54ujEIU&VftV4K;{A>{`!PNygszDOV z>>7ImNKk*|f}bs_8Cb}BhHW^qSsiU-8wQ+@?uveooY|_7HNu5Sm;sRWnoIFR|7>g3 z6&;WPueuuxWS^34Os6fG)F>LGi4&L=vG)!pwVL-=A&6%6s35TQIC>6*{ZBZ{Q_Plm zKa>mpQm^VO*UO!sHTSZ5@=wIYz~S@u+<6@Ox+5! z^NboRNP-nLh^>_0=FDkl9If8sI#0mQ=D&8v+RAj*cvLhn+xyGpoap)@Jmr~j!f0() zgLC_PBlphCZT1_j9Yx~i?z4)5`4@R$;m=e)(%sUVQ+=)FduM>MY(8Z^VcyY}(FQiD z8vTp1m@jcEF_J9$oy6%Lux;SAFM=yc3AD7P0gEeF0(|}i@g?yZUz5o4H3KRBmgetD zyfj=1Mf3Mf#g`?Dgv8=DR|dA+J>Z)wkLNW07g8-2+|( z?YfM6tIw`QkAnemQqP2$XZiG#DIeZL2&+Al3FlPj0zfFvj&_#TV>x@>SAUo~#!Jrt3H9-4ipVDd08mOT#iSFx;eN z&*Lh;q2hKF-xJ#=c%&W*V4YmSw@#AXqcxCw0VrpCLGRT+S|Wr6E@;1Y7uTO`862e_mJ7@|ABMJIY`Jl)w zRFBFnY}XvzgIAEgqLB5V1aUP8 zC{!`VQV_sggn2vkc1yq4M9E*M?sDXc@U!~U8vY=DP)xZ7$IWEk!4-YXqR#)`N17da z*}<5tWzFo}&E!jamC0ne;>xguG&?VX5(w@wn{Sy{4thZ5Tz%qe|W!e4ICz6L0*55~dD$&V+@ay@6bfso6(F;&m%~TQ`N^UuS)qF5`IM*j*g6A z!AUD-+a?>k*eGs_B$gNSfwG684u8MJ?>pauVk^)-5}hPE%ZVK=6Nw%7Lv7O-J*~+r zP_|&3L`1s|Adr4vTp*pW$gxFl9PIBqIFnb*EqZQCTf#vNLdNX{u`j@FwnF(xE>?U* zVRxCt7LM{ux_@-XE`hW7(~*8K~SMfFqCG~f!!&Iewg>+zp8`{7-3EDL$> zS5|hsc6P=Ui%E%C17scCGqcIuqL&WtX%T;v1S1u5$x;DMJ*$HqN#P=h$AfdF&qy}b z*29k=u&AETc-e-nvKMZGk+yBU_!aP#^%y?CP04($i_cn3IY_IXkP+%cAUhdyuzu?m zq=SP~{dmiU8i{(z2}F#ZuZ)}oic@aP*kwa6AM1YU-TQ*deyED@h{W}xp}fCFJX$t$ zPnVYU!0X;PA4fBgGpFlo+k~o7kofoZ>w=)Yl1NM9>^ie^^DPR(Z2el^bIr!dYVo9} zjWZjAqrH(`8Cq!i@?lrWZ z_Dmdom@>V4Tf)?y?sn$)92V;#)wU}%9sRsAE~zwP_j;|yUU1cVd^+plTR!#zxBS*Q zK&X`COKx+Is;?YIzVh5+2>Ohp)CGQf_Vod76ZQ@g=tc!e|8TZ3AcD-Y)A_zM_rjXW|cT{yGSm#LRw;Rn=lzf;!1 zs8n$=v9wj8J4%8)jE?Jv2N{W8yfHJ#40%@m<7VoRv;*DWKfdILZ%^*YVfH}+q5@@y z;*cpUq38anI-Q$Sjj1B1_u|BG7Vlk*VksC6mgKxmh(z!1BtGacydK3^crq!jv2^wn zwf~3c_G}H`e3om}!B?aCIdXo2KCPB>JyJItSthbhrd2Yrw#~hi=U#yw4PX|IsmbUY z)WV#^_ibGS1X2();SuwUDh_z&J}+yUA^V1%*yBH!7;d+s`i0)MW|G?XfyGsUD>OyvY{}DzlM5VfHQxEAK?K-}07(^4QpUx4^9}@?3`h3nA=OO4~^$pd# zx6+~mjgyY`n|GWv5%iX53p>Hlt5OlH+j%RNY~kQx#Q3ZwIj8!1b=mmC&dt`eE-yIH zzK)>oq7!*FLCyIEzi7lBm+k}?j4FJrxYl05FKT3$&+~H@!xwA|IYqEqi`p;1)w6-L z-E2F)&Xl~da^A;7A)Q)r;>%O#thj#u%FwQkq?|enAm5;8$F#n-e-W-jI4pXzuge(U zT2>HA-FQ3H^1EUpVqk55yXxfaoi%A9_pq}Lvrhl@8vhe1SUZWT!3ELx+X-Bj$eAt# z5~%80Hc6>lk1e1bh%1Y*wbhd&NZyoAx ze&lccyP^8WV&yl;#6Zjj{9MXm8Qd-Z%T~xj^5Vd)eZ{ab)OH9E#r?D*lSDfi5GqrA z1lIbbk-aO{tD4-UJ7av+v^#`}(BBYzL+HI2pg2!KkOA^Z-S}y9Z#e zVB=b`@gcUsZ(XJS1WAqzk@}5KwV#iS(7f zaFg55Z)Pb|G92Zu*v(;7*Glw6ZzskB=R?^xae?lbp@Qt82zO>&%1k?1%qKsm(kTPi zL__;%-5w@Qc-*|~tG=%z3RXNQf7B&|;My3Hdj{coTV)UD-(*NC`?b}I!4n0;6$Z8* zOl>jes0z*a+UJv6XKH#~3K%SqwsIi|@S1T&qi4eiCIz?Jr!9;r`;X#vZhy)-SkM-~ z?_aXn%KB(NuNBLkjh@OjzUJ3Fxy?+xtw`TSj@#Qy0Zsv*0853YE@XMtS$&oLy;1$Q zX01xz`52v@ufD(N_DLZxS<1(8*d+e)S^u0cyVf}6i3CKzerGll@vVk5KTZC66W!5) z1oQFn32N&~t=>tg?#7R&sUwUATNL>LsDJixYh27XY>n@LjfrIf`76}d^caS9v;ykO z6gcwXrf$KwVud`3=RVsJ7FyBHiDG(a+Dtg>$NfGiHPezAct~KHE?YmZp6Zd^@n$L=vKcg;`b`q z1k=8~UV8Tw1H<{_W})T_yJwUFr0dJRzFpZ;c(&rhsf7#UZY|>xCp7((@Fzc+l}X2i zW-$QE&XXiAz-Fz7Z!L0Z2KKJrS;#?9VJUW=Re3e$NrS`ioW+ z=DpdXrSO?=Q9QL?a{a+7->Z+AdS|Q*kDM#qq|<2FYy}hT^C(yM-g%zKUMkuBwy=kkZY^ndwB2! z++cDMiM(rFV92TOPHcD*e9R!9a6~yjR}kHwb56wsB7+Lf z$EXdJtzx;uO~lH1_1M2<%;*6zDxz<7?W)3~Mb*BCFjIVjSxARs&^!Byv3sVg`Jih5a$yF9FBSrsf{Bn^t>A@r?7i@{dUlJvk|T_ zk=eyLfBag}>98NUDMz_1WtcKS{Jv&9*gPbd?}G@+Edd4a%KIzJ7iL*=u?h|~oAQ?U zjmgD#U>j9-Zv;!Nu7OsskJkabInFk*0p#BZwiJ;dy?-|Zm8kYA$cex56}skw+&U=7 z0967c6AC1urC_B#byZd0hvHR{-i-uE$JPjP^Sj?1;(DJ}j?MYJLOZnleI6!$k!um0 zv$Agv8BwryhaEPGV+Uf(-npDqYKS}(`%W5TH9}ta+9oI05Ai*)w?HaLIGhf0t!mJ| zKK%({^w2oT_#DaF(djuq+>i2|W`67J50WoGj&uN8%%Sg`%{;aUlXxTL*fxTO>mT6+ z*J=T$dV7y5SuXz~NWU^L__fB%w$ILB=l9OdFNsYi+IIk$Ap=}$gMHSwnwHC}4@W=l zM_t*6*vW!{iRW*B3O>$eWV>&xy(2_adng+*t~&=D5R4Kema06$oyiQ! z$+fb8c}|W%CEtpkqwzxif zO;_r&Iyc++l0?xTVzpI}?|HE(7rvD-YMIweY9xoKRUC^}PK!miG(U=Bh!@)y%DBg^e( zAZwuTX-jv(D|xh$EJ*PeqL!sT)NB<;x_s?ePYoksRzv#n#;63qkW}n|=xJHo{LW*6lHwSH;1@lc!Y(z)y9BuvEgQ~F=2N>2KGvLSt zIlUZSi&l&M_(xM2Pa)VlO~>LqY1 zy>g6S>PDtQiXO%+7bpJ(D^pFV+QSauH(E+HF^lpsW-EwJ+a$c)B?NwX)ZeAJ0(Aof z()42%OY+_0+A!EfYIWIb`=S+}r`x9&|FQ*XW!-UM3rPR|+hIAe&db=WIma@=cK!^= zdd%cpK3sfvnVflIXHhI}Dxu4_--3LQzP6RxO?TiDmY-R&sWm&ycRh@AH=CH~4g27B zMVM34g!3gJ^R3sp*nkD1dg{k$z6gks!)*-yCFlxzsJW~O)wz5b^aUiI^{t?)QEbZ)*qC|$x9PPteNlY@>;3a-R z2HSV3KR%acLnALn_ZmhC1paAIHa_mQnL`wH8RO45-_eane9+S`B~>X>Y)u>DFb zwQH1p)?1Jf*JKb%1*c89C$nMXyc1MYD7`bt@6MwDl6uJsd#i2QY_0|QJ%Icm2}PK) zKR@BJHD?W}P2n=${_0|vA<-K$`jl5Foe$4D7q0<2f!IJQ#$zB5Xndbiur$~3`20Z< zU&u6eB*ewdM8DK5=oS_WMqEEw3u zg$MK2+6)oM!XbQnG+oO_Wu1?p-ylyC zv#SeXO5wVhCCl)`Fe2&WUuI=DGAm?tU^ikJSI%V-h7Au_hwjA(d9wAp1P+v(}GmLM8CWGk1up9}?;e)#siRCIDLF9c7wT#3>iXoDqnAk1o)Yq}QL#n05P3 zd1-9lja7#DXsno>m2*&AIm!Op=psSGZAC7{efTz@{d<`FKuc+LrDSk+1iHTlhIf&r zSxU1-HF4BLRE+et;A#t!@$4dkClkk24%5A)bCky15p9GN;w@!KM*OMZ@)WEJNQy`v zWETvb_Wl{-@>ET~RE8c@Fh0Zu_Ma+P^cJ;r3HF}_>PktjHcWmuPt7b>R8f!D=d}5N zgZ-Q#{^aQ+?}9jC5Q;#i9AVP`5UC9*A#=F_xkkt`KrKsLh7M3|S7mWaok&^5wq9_QCK9&qmRrHe`M;_ z94sra>m;D8^RW}8w_b6x@-eo@tKN9?G08S6`QHXdm(gHCWeQd-Zod<_jk+Es0LF1s zzwjU3*v%olv(5lGG*KxXGYH{L{XeZUP`f~=&wH#^1{0-l)wFL7txlC!bG_(Dt7eg# zMdz1*!{=eVQ+^VtOf=yDrtz&h4=oj1g7m!Ra?jL)dQ&N)2d`8co=s*jM#i}a;G2>K5TJ{sPq!lKVsoDzH zpP8!yK>GZX$@(wmPyVY&;Qv?s*+12(|9eIEfB5bHza;-BMg0HsOY+~8^1mql|EaG2 znVI0&7vBS*o%|C!`5+QbVPCkC8oXFD$Zu^`|!nDz|7NeY;0I5{O9nD&SO zrxyA1D;Nt?VhU4sYDQj6Z9&FFH9vbzUm;U22x^&rD2Q^YKeZ==%0x%jI= zxI~K+Pd@MJsSVRp>(XLB2GsRq2V4!aRX-SI-pZfOdGdFqte(ZlOcaxlfwDz1=kr3| zwL`*K?EL|Qge{9wo3^j^LtoCEg5Ev%;LfSz;)ymI>^7Rw&dv9aU2rH^{Y(6&rjfF>xX9$Xb^oJbwJm_QnNrA9v?BD}U+Y?pG8VMa?VN z&O6<_I{)uJ-m_cSO~!$xSmQg`&Im7RElTWae_Py$5s{B_j-BFMq-5PCzqmND15u?#x9FfAHf&%#>z9qTLy#8B7K`?SM86cD^|!q2w;4qc5{jgsr(-%=kg z1-Z!{lsHjZB)whE9S)aB{qRGOLz=2BN~99USnI39hp#nMw?&B5^InzF{>bEi-Fr!x zvF5{7f8n2NbTwynPapIL)CD%Ta4NBc)1?*aRBDzeDxXX?$UMp0&SLagQ0XLfl4(Af z`3l8fKT$IOg{G%rO|w<1}%spol`-cYC(Z^8|>uGSB8mp{jHgz~bzZhrqR ziZRtbDB$_fjxMK!?^Fg4b1VQl#@o@2RSsqAE22tWu|AzVnr^su$9Jx1h4Qr{q z2%IjAsLCP}5m6uZQGu)R$50M}({Xs6( z9ys5zlX^nn>&Em*+tVzn$2!c5rqoHGl#hW7(^5~T=nGf)JG$B`r=Is)4YK^aF?6Qp z%Qti3b;GQVD?L?C+x-))ak-nYV$2c||BHD4|2bfHI@v4#3&GN6Eh|}q-#b0vv%pRbU zc=;~fQsB$-Q@*|DG%!nX+Z?+A3LXCBkQDZ-n!&e3D)gwn3!6HgN06`U6)E#@7ry^4 zbu3qDWhzVo_uzC-kdmu^;J9)SbIA5uO!eqnMdlhZ4kmoV| z;UGciw!C+iKlF#%Jpa9K#_>9isaxW@4)V@f<*M1}r2~V_M58jLty80~#rIVB(RLbWZAVO&{ zOq0IDrw#3FzF<}?GEbQIe3sIC>JCHerA4*HGr0z)N~ZX(9^TArg}201a_+64f38db z!%4vRE0;c;-L+9EzIY2QsAHP5uBaZmU10R~r6}^%nesIK_lVPi863jVCs~Q^1{`L^BPG^vq4U|ZjWtfCna+kcFcN<^)a zXSgjL|7!btHEkfX+0So0W9IQpD(`L1C_WsBA`N{rp1DAcXmu=%@Mp@Sg|SQijC78C z=H1^=I=Boui%Um_HLk$kxSS!Y<2(bwNx2!}T{afvVkcv%K!&Mr&9Zi2*|yU$p!W0X z1{zAk;+APzvBu8Z0{h4$b}7@~l>7SMJ>0Br?57F&sCf;Xso`kB`t7frb~|r24-1}z z)Rn!iGMior*)F{>)(744E-0ZsLa{z&#beE;)=40uVdopP$`NiEl>ZJ{g`yWoQye;E zlhyzHTPrB%;==2Dl|euc$6jb5T+(Z6=!~P0@-bQyApMkh0uBK7Ff^H+ZV<_aV;q6_ zf-25?W_I14AXdd%Oa{)}ExZR=aAP%(gdNnPwk;h@o~M%s!G&PJH>` zvF=!4zDkd`?+ZfGd*+yiG;d{qQ3x)dw4_&tD-d-dQ=@K?<65zFgG^@%o!hL;CwFB$YNj zOU4mJW6+dKTd032Nj>1lu-T3ux_#>Kop0yC74xoF$BLo#j|v;_(>Gi_{=CXr#U+Ye zi7b$rx6qFg`$d~KwPCy1QpSDRlHyl(PYY-L-tvmiBRvM3s9pOf@cd=1>bD=xL38V~ zRyJ(Rn97jZOtsiF`Gbv}SP`np@Aq!?NXNiB?cIwdR}T8HFQ%RJ_@+O8r(Qu4hevJ4 zaxu6ufshFZIVtlN*|0@%owE*mp-;UIm>`H>e`Y<&4zyl5ELqzDyt>kEUJNp&&-O7a zSYjtH-XXo~%rV*nF>g}pM>?rv_#uq>nsDC?Ed&yiAB8+#6e5n;b0OM}%%{vC)bCL#hb$t$ zcFEOAz1Dg{{v13FgDi>Xp8A4t!#3exia*T~y%sW?9lyhx-P^eK71!@+7T&Aq?fFdN zHAv-S;IQ5}{rIV!YNtA@V&((qo`qEuR>rKMtadW!K`wVe>fM#zv0QzW_pOnZrxaM) z6hw|b*XZ@p65dk)mxh+1Hd-iG0)r)?4<+pTfFP#C#LeqW zc89>WNYgMfevR=$*Ek(vL4&p@XsCK(E8i|y`Q#;kGoWGPFd)FA>~TS`M8Fw#KFdZW2G%+5!AO2 zxGnEN93m?Sk+j{9qv(Fx>wIqh+URf4RuzcZk1~^|IA)T)JWg?esggd zc~_jzyf(z}+^2TM;uaRZ$7_PcHZKn|A^ zFRd4Ia5t~=p~f0`nT!`MSqYrU5&qPVmD;Az#jG7DKu#PuE}Q8<<5T4SkTh(=+7TaT{#nOF^CIsEV~{1Qag#K%y#Ty-W6AD2OFEBH#bEd{1FW{@?6fYa`_&V2b(N#(#Nu#qss{XvuY+%LqYF=quZ|7X6 zmD)AG?QK`rvb*LAL1y;vASW=&Y#c~Tz)I6Ajt3%nER5K7a;l$@*{st`1#anD-u>NE zI=A-nxGk#*zYe^$-Vh{uhCJTp`zm-#xD9gC5fbacEmHAV-05nhHnDANSqjw`Vrc8D zdhzDKO~O-=<3S1QSaQnhp_e_xSvzu6|vigx18720$QEyOjM}8)i(2=BYSap(~c~5@2mb?Prf#6DA zCu+OA@E5XF<7Z{my^tzz$J}%z|JR zS>FJDKEdR&Ih?E+Jmy5`U?&a++7pCh70On?D7`4fg~qtt-vJ}Doe5^S)pla%k;mz8 zdU0+1rnzG5YkSTr#mYLmZSU3+@5a961)e7e!$_uwkxJh(4MiJsiZSVm;?|ViD<#z1 z7F>jf6QlSct<`N`2{`>(Zpn7;999Vm0}bKmxmh<)^?K3Ug76cYznp!AM9>Vck$qbh zabpeQvT~mq&mWe03&|2Lp>B&1ocPY-zRY!(T*1Q2#otwKnW8p~HWhdHs$2VzONMs| z-5X<>kH~?)PrTb3zR{{$t)80yse!DhJ|AuwFn!+NFF;1o`qJP5llMK+`Fkt8X$lb{ zy3bj%_>*~64A=~Y)uJG2+=e^Z{68uWu#j(R>YILLIa#{CYFjUJF7{NHeD8UAKGe0R zn##3#rZ-tEBMKW)xKBuUh|+M%Qf?`}YV<_pwp78%;c1{` z!Y-~Rykyue^22skciT+LBpPe}$a7~XE)Y3Qer7OuMm5sLIgy)2b^PvxsaKguO{I6p zw$|DNJ$Z72DXU|qo?)*wBf9Mv+B4)k`+cYH;@Us`I5<(*H>+aPW*#AqqFzF$cBXzX z$5k0=>plxVh8QMQowZCEGi$6WYjdKUSjfHLIP5KC{7g2@JOALLW(V@ILCIw$1-P7- z%k#h2s`{%~plvy0+1xxM`XTZ=lR-junS-eTu9u@eWe*v#`iIR$oyz%J+mLYn6otFUo=Yx=I6nzbF-(h2mUTvZ^p)^$NnP<+L zt7xj*Q&gowJ5^`G-5*+)ru<6PdlH=znL3qvA@)hBxKQWOdqu671LYNA69gHwPW*f2X{qxMU{I z89|!rtWo0Y?!^|*A^G8*-`iHID)d#2@Z!erlTq5Z+Q|{70P@MSp!zM8{KYu3Nf3GdGAfJ*cfQeW z1@E$oUv4V1lmV&G{m*eNu+qZq;b2W1-!we)nHzy$*r{Fe>SLpzR-T#gz6bk06~owZ znZ%FY0{hsBXvJkzkPMN~c8U;`u;H?~vF4JV?}vPG;V|!0{>G)lSc@Bu+}h_Ov)IV~ zLfqo(H%!kKrEBGWIyS%IO?ETh@hls()8KtU*`Sb4Hi(N8LQAN{4b0NvGi3Z}!iyl6 zi{zcY*#!A9Fowevg&*s9{}SA-BUMVB7=Sqkyv5Ik7YO-2urFuSqx6Pv7lN$%XWm?= zEG}hj`I99cg)p(e?rhF1nk3Pu3=lmIc|mXB#P@Hfr8lzjV0w!L0seRtM%(!0mGX{EENL)sOou%?-(J+Y$a( zbKf1+#J}z9PY_WcfQa-aiUk4bNL6|hkS+*8KtLb_r36R-0qISpDhen8>5*QONC~J& zm0l7E(uIH|B=k3)^VVJGoO|zE>#g_hx_ADXHG5{hW%l0Ry+3=;cTe89L8|YXfcN7D z;e2!{72d~!E83(P4lnOVyD+^gA*7<8G|%lx?z&*ks>4vvO40vRZ zt(fOoxA}>qb5$DT71MLw2eazGx@+kDf93lBA+Q~MyO65_6w~t{|jwz!C&u) zPsYI@{AeoIgpRXku#T(MxUG|iMOMWFyIPOI7lON#JMl-KlRuGl4jbnZS~Jf_dF;6a zc@wooe*3w;_gMoEtADy!_sVW>&B;=@QlB%S$92yrIz>`bXZ@5NgHuRlyz%r~uyEhv zQhd=#8Ba&S*I5Zqa{a>IUX--4U|okbz?L#?=B$=kfP-2m*uKY z(wRfE{TcOS_V370MTY(wx)b6P&hXCtXF{m!>Y*zc?YbI@R71`f!iTDHl0!a2eYN~D z(9H2WlLns8%xkpKLxDpI#nAfkNkxlN&_x&My-DUm*Mz&s!+Dc3mo7P73<7VO4+Z*3WjpuI8!P9Ai)`-++(pze8 zS8jsZVJIBzqYxo%-McRG_Y88ksBxl;$oKG92kfzV%=o+XOPJsvX41r$uV1~F9NnzM z2pWK6=E;5*FSX?D+8lwOn6t1(SfBZV?a^oHq!z+A zxLn+Z4KYrMIpv>Q8bz3n9JJ_e(j$*=tv+clz6himEW z97u(_U>bmu_Z%0dTwbBDu*=|(4X2p4tnm$-T*~iCFr<>S)Ek)db##$$%SVL(@=jB! zc7OmzSKV%yKEA?e^)mjOfN+-yD%m?a8a!uTPIke8sgC6vHuv<;o%hgrSSdvSQ6?7G zI&8Ng7vEj;9nT%X%hQyTw!dPV*pJ@;B)FU*Wal@@5w-W$ZPfjE@&R;Yu^53~^|QqA zbSl=kKsFZKTH2SWeo%)N$hN(ZBC|C7#}l~ z^cIDi(sSDfQ}98aH9MqATbDA)Wi+2Tv8=buW!R03SF_AH?th_DLhbYQteLEfIAeGd z(D(hx@Aq1%i+8Hk8y=n$e+GkKvJhy#cThRf-j-TX2=qB1GO$!=D9{q+-7-1{(F&AF zUA>J~)RGj2h+@Dz(uV27qikUJ2ZfUE10u9iO6lFA6xYNHgfT(FPMXqTr-@Mqwk*ZZoBKEp1b}>gO6ud^p)@1-d;LI z)V>p;WT5Og`&Ovq7SAE~3gb#KAV!Bec2(Zq+j8>6%fYd_@)t3wuqdcgE=TS zCix4VU8i1E2@wh;yFgP~(zFc=glH1oZ^%ua9B(wONX1)Gd=9~}HN*Xk6w=#(%7NSf z)*1ycj+Tn9>2%|DJ!IkCDv-UbB}>2Nz~9WCT3N~7G7wiX=Qw~+nFD{d-KEwl2Y$l_ zkM&@0>z%@NqD zOoZg6c-zI|r606z`aJyzC(*uL-@1xsAk~9zWCF^1Z*+;c zOlg|ICP3bI>>yVhqEH=5;JvXjbs^tfMXC1jGKHL@41DiXS~Iu1EoGuW0a|s)mx!_n zP5G)=<^nMZ1pZ*oG9x*NogRKHbHcP*^JaZ>&e(4a{iwB!27*|(by(f~8VKlS{qNt< z^2zdDVvsEbFZzW1M>^aR3wC_ufI^I>7$8w&oevCgoU_SE#@ol@;cM=lTBX!CBHUS} z%lJgEjyZxK-M$4);_NSnG!!@#Gz33vT^oaoQYL2kYN>C$(QAGt-FwsV_!fM3OBE3P z7>Cb+hnL(11tq#hOxD;Ut#m!-*rw^UHfuP#dNf0IqGx;P_+`Q7I9^@M0AVn=(9hLX zj_CI2r=6kfoo<}zo?ZrAThA+Qvw`2Z*rf1bx97_Qi^*h2)=a#&rk zSF_@j#F#w2djiEEv~%sr^I1JhMxP((u_%;#sAP&mosTyn@`Z93pX zD@+~DELi2qmj5wC8tm$Vdjgo-meD;6qu;_JG&kvfc;aFi+fFsD9|_FP!23`0+fN*+ z3Fwj3czwMe?Zd!VLZDjZRaRVNycc_9gE=XgGg91&QBY65Ws5`c3+GWjz^w{;6rYFr zliu*LRFX&{R22<#AKsg;qWY|BlhC6g+(!;s>FpxfS~p{7bI(VT=Goo?ns9EFckr`_ z(nGCHm=e7o<02dXBwOoSEnm&p*_!M0U?SUhk!&IU$XkD-0q0u2W6`tWf4dC4$O+W; zziFrc;r!1t|3qZ_&iZdR{s+W=Y2hDV`ybx@FYo?$js44o|I)5${C(E`{fPhGi7;Pa zO8+w=sO@0(|3KuA+->`pq5SjR+fo0QGx5)l|M}YgU0wSh{7wFm+5dmD;{U54{MU2a zC+0SBB1>Da2_vRmq;V={_E9I5jx+LDH+puJTOG0OEmJs#V562 zZV9#p-+8HI+%IIVY#gIuYjzd%67*t6YuDcdFsqmr27?_V#ZChUG0B;k_c=Rw0iKqL&vB7bRlykGV~P4rZ9S(+I`RHdw}DS#~A!7g)(}(zyi!?i*I<>M_Q2$^I&R z_0pFVpU;qkrqEoCABuRsfFI?Wox4Q!jLUDY%bhyTqAF5iLz_ykS zBD8y)ky245r@@3hRpG$Uz!A4Z(!)fO2#)F$0Sm>i{oVO*z?Z4J-=|D`RDf1{0)C4l z<(3%XZAx8}DIB5z;N$xb&0~I{7iM|o=(!g5M;G0CTHJ}h(A~sk^y#xvBW_bz6_r7F zL)RwMhK$cR1RRy3@T?Frp1Ry9an0c1Py!amp4tg&yR1ylf%>xy=ccUA5O3E3Q9U67 z`T`*+gtSvkX>uXW3AFGtHeL|jaXk{QKH*WQ`pLf5>!DAn;NVrwV+G=Q2#N}KcT<^nP&I(F|lz-x)@ff zRO(N^nsFT@E^tvmSipGo%Fd75OD7%+omqm9>jua1aAObuU7 z8kSm2eyF|wIBkf*T#a*;K>f;|=D{XkIP|!YBmPQ4El;HM3rwEoCOof6D~^l-+57es z^lOZnr%3F(aGGk3U+Tl_p7yZJ=Y!ZI+iXp5yPR{qF#hATH$wT zMcu#95`Say34p~-XZQG%Nnt`HhKl~G5EAIOWZ;uw<2N_NtW-E`XYGyDbr{2dO{>`= zrLe#+xD9@cCg0f*ydv37MzW%ER@Y@k8IQ@P8|>n-Aoj!(4=J9I99!?@R3vLUK6Tl8 zD|Tu+q?3q^B^P|hiUL|ej$M4ByIWv2>yHPkP z1Jbm=kv3NNP-O*DaVO>I9r*(Ju^u!HFZX;2FMPOh6iwZnk{Rv%w-XvJT4QJvIf%Im^MACUFBmgxiZ z8@^WDXxHT%z>@GtVDMH(C}y5jk4>{Jh(*JIA2Qr>@3avi5-8Dk%p96VUd?ZF#&5=UF0cH+ zS>giE$>TkLjpyqg{7f^g-@cq&v;^i>G--v8y(6x}H+FvRXX2<8O1nolP7ua!U?jUP z5QHYZQIROFc}9Z0NKj6qGyX{#P?dJygTwj>z_|3ueC&eROeieIU} zdMV?_iC@WZ^($eVI4m@HmnsPb@{m}%6qW6zj^E&uHw9LE6(#Eh@c}em@A+A;J;h=e z_EFVg_nn3WZ1cR&J;T4wi0g!0<{si0$U8n*5-p2fM%&&E37{PkZSv3-t@HDQhWS~( zVJr$hx}*}i=EsI1q;_NfqJ``$auaM&F(e5AG}B>6{#0jA6f|p^Et2BHzp3reC2VJE zX8p3Es>i2~wncO(ts_kfB(2vK_oBM*<+M~&yVeMOJ9wMsPgM2&S$%2GE`J+{uD&J- zr=7VY=_qtJoGx5FFo_nBjt8Kn9EUDyU*npeDw+xxav_CM?8uHGM^jNTaT)?DCP@_m zRL5agfykAh1f`|Y@!`ZYmy>FYn@>I4ZCQLmS4%!>H|>eO2xlDrB=n(;OAcXI5p*-o z6J^5cAe!82cb7WWF~Dr}L!!4aBw0poQm;^cq*AQB-v0~R11;QruCs=^!aO(+CyXj=o9l5i0 zjuOKtQAUCuf>ekFr$J2TR1SEzLq8?%X1=fy|Ms!DzQ>s@ne8B23emPOBU9Q-jVk-e zmj{cLo+@+ZL+QTqt*N=DdxF8pJ3`k%H&o&D(9_@M6#PTMBeWob3=ICW^JVt zg2LnesxR(WQuNxkwaSSNh?-P=>*WXdr#p^8oVg=F@W*ii4YM^PJq^Y9AoR`=&ip8K zz(;?IqMOPuIj--0r$U8&G16oNeLmB8?m#0KzH#deAIp7k4$>yQv?#MjRGi*iTxar& zk~1fFGIt0u{>snKcBcN8r4@rh4W%t5rOi#(lkcQEUViR=ue^;bg1gNY`w@sZW=bhJ zi}50=?BXIW)DvEp9gamoSZda5jY-b!h7~vUF|$b-mt`4kLXB@sv^e|(d$A>-xiJH$ zT#5x5PQyEZGx`f5QYqQUpLjku3`j94xs8iz`_~w-)j{d0U5~cNQ>MaF$vm=R(H1U| zYFD{Ke^0pQshLDKXE4tsL?*j2YvsshmHRS&Ckr!)@6Vp8L@H$45jy`Oi7)kwrz7U> zPT#d=&6kdd_S$c=0o#AUvq*s%qpov4oAP()%C}=}&xQth$p-#hHhNL43v7P)Gtn%m zhc6r2xa(Yf))9AIq_xbe1{0V*5tDp*eqQ2?cA|G$05(#DeVlBa z1L{+lSWM*yUsk%)pxs|^Iv*TUHTYsH_F0TK=)3IrDhPp@VaWlDW^=G%f!oQPsH<5juonVO2D%VCB=c%jlz*GRWI}gO8^=Y1;M~avl z1>>rkQN|{gNeip&^-qg0qGN}P8SHI7UpSRB5tCY_47K22IPu07qZ7SwijNq}<=7EXi%|eFgG60@!>86D zmhml#{(ZmD4{|!dIdcv}kA`wQ>)2e}7x|ozS4R$kZd=4uRcU@-J-R3gwoc=g;eTiz6?BxzFp!r&udlq(o`9W<87msE z*1Y7a)yAMloX~%;P8hGQpf$|+@OORzO-H>QSqQMj#a8Qoc{L76irhI}qi zsL`B+8|WGQuq1`XblKkxa)f7Tpax2G!0N@To7T#pF{WsK4!AB`CaY(cMX|?m3WI&t zz>5_^Ihz5?hflpel3YC z!WyArpMnc6g>3kQ^skX~-2isGkEWu&Vx#$=!Dl-j{O;z`vakqyo3KA-5dL-b=tKJf ziwv3nY)i-8ZRff+*ZmPxn0zc=Bc7&is*afcRb zV>VRj5BkaLD?Rn%%%R-p+pl+@k{(6ZC;*8UzL*33^6ul)pGuX5R7d>jP5_62j)``q Irc>nq0;TyH#Q*>R literal 0 HcmV?d00001 diff --git a/BrickBreakerGame/index.html b/BrickBreakerGame/index.html new file mode 100755 index 0000000..e58239f --- /dev/null +++ b/BrickBreakerGame/index.html @@ -0,0 +1,25 @@ + + + + + + + JavaScript Game + + + + + brick + + + + diff --git a/BrickBreakerGame/package.json b/BrickBreakerGame/package.json new file mode 100755 index 0000000..3292777 --- /dev/null +++ b/BrickBreakerGame/package.json @@ -0,0 +1,33 @@ +{ + "name": "brickbreaker", + "version": "1.0.0", + "description": "JavaScript example starter project", + "main": "index.html", + "scripts": { + "start": "parcel index.html --open", + "build": "parcel build index.html" + }, + "dependencies": { + "parcel-bundler": "^1.6.1" + }, + "devDependencies": { + "@babel/core": "7.2.0" + }, + "resolutions": { + "@babel/preset-env": "7.13.8" + }, + "keywords": [ + "javascript", + "starter" + ], + "repository": { + "type": "git", + "url": "git+https://github.com/AbdulAziz0682/BrickBreaker.git" + }, + "author": "Abdul Aziz Khoso", + "license": "ISC", + "bugs": { + "url": "https://github.com/AbdulAziz0682/BrickBreaker/issues" + }, + "homepage": "https://github.com/AbdulAziz0682/BrickBreaker#readme" +} diff --git a/BrickBreakerGame/src/ball.js b/BrickBreakerGame/src/ball.js new file mode 100755 index 0000000..7d6fa4d --- /dev/null +++ b/BrickBreakerGame/src/ball.js @@ -0,0 +1,41 @@ +import { detectCollision } from "./collisionDetection"; +export default class Ball { + constructor(game) { + this.image = document.getElementById("ballImg"); + this.size = 16; + this.gameHeight = game.gameHeight; + this.gameWidth = game.gameWidth; + this.game = game; + this.reset(); + } + reset(){ + this.pos = { x: 10, y: 500 }; + this.speed = { x: 4, y: -4 }; + console.log('Ball pos: '+this.pos.x+","+this.pos.y); + } + draw(ctx) { + ctx.drawImage(this.image, this.pos.x, this.pos.y, this.size, this.size); + } + update() { + this.pos.x += this.speed.x; + this.pos.y += this.speed.y; + //left and right walls + if (this.pos.x + this.size > this.gameWidth || this.pos.x < 0) { + this.speed.x = -this.speed.x; + } + //top + if (this.pos.y < 0) { + this.speed.y = -this.speed.y; + } + //bottom + if(this.pos.y + this.size >= this.gameHeight){ + this.game.lives--; + this.reset(); + } + //collision with paddle + if (detectCollision(this, this.game.paddle)) { + this.speed.y = -this.speed.y; + this.pos.y = this.game.paddle.pos.y - this.size; + } + } +} diff --git a/BrickBreakerGame/src/brick.js b/BrickBreakerGame/src/brick.js new file mode 100755 index 0000000..b2bb553 --- /dev/null +++ b/BrickBreakerGame/src/brick.js @@ -0,0 +1,20 @@ +import { detectCollision } from "./collisionDetection"; +export default class Brick { + constructor(game, position) { + this.image = document.getElementById("brickImg"); + this.pos = position; + this.game = game; + this.width = 80; + this.height = 25; + this.markForDeletion = false; + } + update() { + if (detectCollision(this.game.ball, this)) { + this.game.ball.speed.y = -this.game.ball.speed.y; + this.markForDeletion = true; + } + } + draw(ctx) { + ctx.drawImage(this.image, this.pos.x, this.pos.y, this.width, this.height); + } +} diff --git a/BrickBreakerGame/src/collisionDetection.js b/BrickBreakerGame/src/collisionDetection.js new file mode 100755 index 0000000..9829101 --- /dev/null +++ b/BrickBreakerGame/src/collisionDetection.js @@ -0,0 +1,20 @@ +export function detectCollision(ball, gameObject) { + let bottomOfBall = ball.pos.y + ball.size; + let topOfBall = ball.pos.y; + + let topOfObject = gameObject.pos.y; + let leftSideOfObject = gameObject.pos.x; + let rightSideoOfObject = gameObject.pos.x + gameObject.width; + let bottomOfObject = gameObject.pos.y + gameObject.height; + + if ( + bottomOfBall >= topOfObject && + topOfBall <= bottomOfObject && + ball.pos.x >= leftSideOfObject && + ball.pos.x <= rightSideoOfObject + ) { + return true; + } else { + return false; + } +} diff --git a/BrickBreakerGame/src/game.js b/BrickBreakerGame/src/game.js new file mode 100755 index 0000000..5397c70 --- /dev/null +++ b/BrickBreakerGame/src/game.js @@ -0,0 +1,94 @@ +import Paddle from "./paddle"; +import InputHandler from "./input"; +import Ball from "./ball"; +import { buildLevel, level1, level2 } from "./levels"; + +const GAME_STATE = { + PAUSED: 0, + RUNNING: 1, + MENU: 2, + GAMEOVER: 3, + NEWLEVEL: 4 +}; + +export default class Game { + constructor(gameWidth, gameHeight) { + this.gameWidth = gameWidth; + this.gameHeight = gameHeight; + this.gameState = GAME_STATE.MENU; + this.paddle = new Paddle(this); + this.ball = new Ball(this); + this.lives = 3; + this.bricks = []; + new InputHandler(this.paddle, this); + this.gameObjects = []; + + this.levels = [level1, level2]; + this.currentLevel = 0; + } + start() { + if(this.gameState !== GAME_STATE.MENU && this.gameState !== GAME_STATE.NEWLEVEL) return; + this.bricks = buildLevel(this, this.levels[this.currentLevel]); + this.ball.reset(); + this.gameObjects = [this.paddle, this.ball]; + this.gameState = GAME_STATE.RUNNING; + } + update(ctx) { + if(this.lives == 0) this.gameState = GAME_STATE.GAMEOVER; + if ((this.gameState == GAME_STATE.PAUSED) || (this.gameState == GAME_STATE.MENU) || (this.gameState == GAME_STATE.GAMEOVER)) return; + if(this.bricks.length === 0){ + this.currentLevel++; + this.gameState = GAME_STATE.NEWLEVEL; + this.start(); + + } + [...this.gameObjects, ...this.bricks].forEach((obj) => { + obj.update(ctx); + }); + this.bricks = this.bricks.filter((obj) => !obj.markForDeletion); + } + draw(ctx) { + [...this.gameObjects, ...this.bricks].forEach((obj) => { + obj.draw(ctx); + }); + if(this.gameState == GAME_STATE.PAUSED){ + ctx.rect(0, 0, this.gameWidth, this.gameHeight); + ctx.fillStyle = "rgb(0, 0, 5)"; + ctx.fill(); + + ctx.font = "30px Arial"; + ctx.fillStyle = "white"; + ctx.textAlign = 'center'; + ctx.fillText("Paused", this.gameWidth/2, this.gameHeight/2); + } + if(this.gameState == GAME_STATE.MENU){ + ctx.rect(0, 0, this.gameWidth, this.gameHeight); + ctx.fillStyle = "rgb(0, 0, 5)"; + ctx.fill(); + + ctx.font = "30px Arial"; + ctx.fillStyle = "white"; + ctx.textAlign = 'center'; + ctx.fillText("Press Space to Start", this.gameWidth/2, this.gameHeight/2); + } + if(this.gameState == GAME_STATE.GAMEOVER){ + ctx.rect(0, 0, this.gameWidth, this.gameHeight); + ctx.fillStyle = "rgb(0, 0, 5)"; + ctx.fill(); + + ctx.font = "30px Arial"; + ctx.fillStyle = "white"; + ctx.textAlign = 'center'; + ctx.fillText("GAME OVER", this.gameWidth/2, this.gameHeight/2); + } + } + togglePause() { + + if (this.gameState == GAME_STATE.PAUSED) { + console.log('Pause func') + this.gameState = GAME_STATE.RUNNING; + } else { + this.gameState = GAME_STATE.PAUSED; + } + } +} diff --git a/BrickBreakerGame/src/index.js b/BrickBreakerGame/src/index.js new file mode 100755 index 0000000..7a6add0 --- /dev/null +++ b/BrickBreakerGame/src/index.js @@ -0,0 +1,17 @@ +import Game from "./game"; + +const GAME_WIDTH = 800; +const GAME_HEIGHT = 600; +let canvas = document.getElementById("gameScreen"); +let ctx = canvas.getContext("2d"); + +let game = new Game(GAME_WIDTH, GAME_HEIGHT); + +function gameloop(timestamp) { + ctx.clearRect(0, 0, GAME_WIDTH, GAME_HEIGHT); + game.update(); + game.draw(ctx); + requestAnimationFrame(gameloop); +} + +gameloop(); diff --git a/BrickBreakerGame/src/input.js b/BrickBreakerGame/src/input.js new file mode 100755 index 0000000..7f4f898 --- /dev/null +++ b/BrickBreakerGame/src/input.js @@ -0,0 +1,34 @@ +export default class InputHandler { + constructor(paddle, game) { + document.addEventListener("keydown", (e) => { + switch (e.keyCode) { + case 37: + paddle.moveLeft(); + break; + case 39: + paddle.moveRight(); + break; + case 27: + game.togglePause(); + break; + case 32: + game.start(); + break; + default: + break; + } + }); + document.addEventListener("keyup", (e) => { + switch (e.keyCode) { + case 37: + if (paddle.speed < 0) paddle.stop(); + break; + case 39: + if (paddle.speed > 0) paddle.stop(); + break; + default: + break; + } + }); + } +} diff --git a/BrickBreakerGame/src/levels.js b/BrickBreakerGame/src/levels.js new file mode 100755 index 0000000..4efb92b --- /dev/null +++ b/BrickBreakerGame/src/levels.js @@ -0,0 +1,31 @@ +import Brick from "./brick"; + +export function buildLevel(game, level) { + let bricks = []; + level.forEach((row, rowIndex) => { + row.forEach((element, index) => { + if (element === 1) { + let position = { + x: index * 80, + y: 100 + 25 * rowIndex + }; + bricks.push(new Brick(game, position)); + } + }); + }); + return bricks; +} + +export const level1 = [ + [0, 1, 0, 1, 1, 0, 0, 0, 1, 1], + [1, 1, 1, 1, 0, 0, 0, 1, 1, 1], + [0, 1, 0, 1, 0, 1, 1, 0, 0, 0], + [0, 1, 1, 1, 0, 0, 1, 1, 0, 0] +]; + +export const level2 = [ + [0, 1, 0, 1, 0, 1, 0, 1, 0, 1], + [1, 1, 1, 1, 1, 1, 1, 1, 1, 1], + [1, 1, 0, 1, 0, 1, 1, 0, 0, 1], + [0, 1, 1, 1, 1, 0, 1, 1, 0, 1] +]; diff --git a/BrickBreakerGame/src/paddle.js b/BrickBreakerGame/src/paddle.js new file mode 100755 index 0000000..4288552 --- /dev/null +++ b/BrickBreakerGame/src/paddle.js @@ -0,0 +1,32 @@ +export default class Paddle { + constructor(game) { + this.width = 150; + this.height = 25; + this.maxSpeed = 5; + this.speed = 0; + this.pos = { + x: game.gameWidth / 2 - this.width / 2, + y: game.gameHeight - this.height - 10 + }; + + this.draw = (ctx) => { + ctx.fillStyle = "#0ff"; + ctx.fillRect(this.pos.x, this.pos.y, this.width, this.height); + }; + this.moveLeft = () => { + this.speed += -this.maxSpeed; + }; + this.moveRight = () => { + this.speed += this.maxSpeed; + }; + this.stop = () => { + this.speed = 0; + }; + this.update = () => { + this.pos.x += this.speed; + if (this.pos.x < 0) this.pos.x = 0; + if (this.pos.x + this.width > game.gameWidth) + this.pos.x = game.gameWidth - this.width; + }; + } +}