From a0ef0bf40c4e42d2f492eb59b521ae20f0fab26e Mon Sep 17 00:00:00 2001 From: marko Date: Mon, 16 Nov 2020 09:32:27 +0100 Subject: [PATCH] - added simple achievement editor - added records --- homepage/machs/achievementBuilder.php | 96 ++++++++ .../images.d/wechselLiegeUnterarmstuetz.gif | Bin 0 -> 70131 bytes homepage/machs/index.php | 83 +++---- homepage/machs/lib/achievementsLib.php | 84 +++++-- homepage/machs/lib/api.php | 68 ++++- homepage/machs/lib/db.php | 100 +++++++- homepage/machs/lib/machs/achievementGroup.php | 232 ++++++++++++++++++ homepage/machs/lib/machs/materializeInit.php | 14 ++ homepage/machs/lib/machs/sidenav.php | 13 + homepage/machs/lib/record.php | 221 +++++++++++++++++ homepage/machs/login.php | 28 ++- homepage/machs/setUserData.php | 76 ++++++ 12 files changed, 924 insertions(+), 91 deletions(-) create mode 100644 homepage/machs/achievementBuilder.php create mode 100644 homepage/machs/images.d/wechselLiegeUnterarmstuetz.gif create mode 100644 homepage/machs/lib/machs/achievementGroup.php create mode 100644 homepage/machs/lib/machs/materializeInit.php create mode 100644 homepage/machs/lib/machs/sidenav.php create mode 100644 homepage/machs/lib/record.php create mode 100644 homepage/machs/setUserData.php diff --git a/homepage/machs/achievementBuilder.php b/homepage/machs/achievementBuilder.php new file mode 100644 index 0000000..403da2d --- /dev/null +++ b/homepage/machs/achievementBuilder.php @@ -0,0 +1,96 @@ + + + + + + + + + + + + + + + machs + + + + + + + + + + + +

AchievementBuilder

+Add AchievementGroup"); + echo(achievementGroup::htmlAddAchievementGroupForm()); + + echo("

Update Achievements

"); + foreach($achievementGroups as $g){ + echo("

".$g->getName()."

"); + echo($g->htmlEditAchievementGroupForm()); + + $achievements = $g->getAchievements(); + foreach($achievements as $a){ + echo("

".$a['name']."

"); + echo(htmlUpdateAchievementBox( + $a['id'], + $a['name'], + $a['rootId'], + $a['achievementGroupId'], + $a['level'], + $a['description'], + $a['imgUrl'] + )); + } + echo("

Add achievement

"); + echo(htmlAddAchievementBox()); + } +?> + + + diff --git a/homepage/machs/images.d/wechselLiegeUnterarmstuetz.gif b/homepage/machs/images.d/wechselLiegeUnterarmstuetz.gif new file mode 100644 index 0000000000000000000000000000000000000000..c3feeffe10aa3b8c52cbb81eb11434353795ff0f GIT binary patch literal 70131 zcmWiec{mjM_s3^n%wRAW`;2w0A|?3Mk`OhDQmH#* zSLza#N<~y!Zc*K?y50Hy`u+8Jp3i^hJkR@m&Uu~V7vM{BO8@|m1O5R3l$1bP${>Ap zs2&z!WTwlD@`B7ygxMV1X_Xr2k`wH-ZznlFY-?_$dpyN( zUxasVjL*J^fMZEJ65|565w`poyP_C7LG0Gz-COxFBwna(X`*v!(zc=`x0-$An!WDg zgXETMFWzo%?rug&vUf?!_Ogtif@Hs%OnP-@kT}z~`H**W&UW#kz@qes>is)w_ea)d zhc)Gdojw-Za3s1kJG$+7Q2Wts+^m(Iky@P_tzZ1QFm;pG5=~q{)Ni@H_sj$soyu!lrwz# z_*lc?vFd#jt@-m^$6s7LdZD&(sF`>3bn$>#aH+23R%_|47Qs+^_099*Ydv*0x?6_N z@P^M8$<9`dw(&>WOUAlO?_Maqb6)VEr|{90(&3J((e9c%z15?=O;f#%_b%5?Uul}S z+%(r;GdIxm>}K=h>*9OTij`aSYd4DS4z%65);WKp{n@SdxuFYBZ+Abq+BQ9OW$yOn zk&CTMw_6wGr{9b;{c~5mINbAOr1Rl$|Fh96&+iN^j9;G}9egv<`So7MkH=jrcluYR zhu+>9_%Jv0Zhr8er-L77dlf4^|E&%w-VZ5O`xWcApG}WEe{g5z{_yI9(GT+@AD>OH zJ)ZiyIQr%J-M^oVe0VT@_Sed@kIRp~t<3%R z*WBN0PZeM16@NcdY(7_PKKitL_uGdR#rIc=AFGO=AAf#(r}*{te~Mo}|6c#=?Fs+@ zApC$plK=nxA1cHrJd93d_&D0xgMknLz~=Wi;QwU;Kqvq_NDIwOsBYz0LzxAc71t3% zxM@hbPjI7E;Bfo$7f89TYsT;-2Ru=x?;0hoaZ8#Ak+?-FFz@FkD)c>1l9Y}6-&UB0 zRBrlLCBLgS^_0+xZeY_NT5YeQ1Qhc#sw~6m%=h&inE z*IY!)bU}BH)qMB%dQ903?{{++(L5#K&+xVC7Fzi#z!*Xl8M~FMjAgCv#GJ9seK8o? z4pXToN57b#ZS&b~Xv^#mpE8D);_R87GT#*_TGu6gVeL_{&(T`T@D4o3G38FZv8^x& z=m?ooBY54$>wwyXl^R|r(E*?pA61;kkYZ$$(E2aR=yk#%4hS9>s##~sBpdBH%C;fN zPRah~imP@1?o#v7%^+n7d?Vu=s`Sv0sOtJTqjG^}a&wlS5gV{`+^A$hK7l_jTJ|HH zWPB+!s>0HcM$O(SSb`*9y*RvO)NIPK`d43|X`O@{U?%RbDvlJle+e|FCRVM+TwrG3 ziOf7ro3iYUdQfM|x}IG`sJA&BK&%q&6q@odZ~O^7(yKzF6NBHx%mXAxKYZS*+PFTe zz0x0dl$B7Z#VW09G|b2Z`eGU3%K}`w3*sZb`r&fxz zCDQ~i9d3`I5T8A{;fv$0>l?~gQ1TitYhLO&*`YIFmjx+HIyA~-h^ zbD9FxUu4J3?c}M~VG3Mja%3u|=zkOtoLs|4XETsG(;@;z#6g!fOc}Z)V*@uis;AfM zcTnV80)7Fp5{eITT)ln(J$+p5uD9I*wf42(9<2eAj}(w+oD6wdGn zK~%^V(y&q-z?D_L7qVsP8OnE%iyfjsZe*ycb;}?+$t?(Hg+F$+afVNHy67~g1XgL3 zK`nL)QDzAkt+z8?HdS&Z>+8{a_t)W0z(iH-!0sYZm9JM0joGn;(tjI;4EN4d*SP?3 zP@0m4Cnsua-u1SQp_WoYGBvJJ9z+`Ep-cx_kJB72??e$w!kTF*CxJeeH~894ZmlOy zdxsI;`yku_G)yuBG6bnC+?KyxrHH{ZFsu=f_4n5u7DuYJ0rbk)a^uPe!O&Y;&FH`u zlCOUUn#<6~guI31`G8zXWWlEG8cle}pWTrZ>n}q}&2rEq_h%!9-kJnhMki3ERRksa zbC977uKGo$TS*!azH5Q2w=@H_6DO#|+AHV=L5_tpEhVbwpYaSF=L;OsiE8Zi5qxUB zv2$RG75N6=j23$NMqHxirJ2#F_J1`$I0RJ;EO^^GwIGG*ue5q6Ax7uxOM;nOG-jHj ztYSh@;p-d8_sbqwB+i~2^gm~RmZ*`W6pEmd3oym_kzcD)1ab}zwk`&WUtuK-b?e5}H>G2sfV+1s@%t)Kv75A8*K-dA zn;m%@j^QN@4Ek7Id|VtG)v75I3CvzhYxOdWed__xMn3|QPBO+EUxJ*1_Q6N{TO6_( ze1o6sFgG!ka~OBQPzorN)*T*>UOV3wm!#*MhI75Xp?r|m{222;HY{ujtJWCSZInNV z@Dhipmd*sb^zS|Ja#^ppfN@6Wky6wr&UxiynCs(3Em;*MpftBuh;1gJC`2sx{wRUj zh!ap24n=yj^X}PG@*Jb?$42=j9nJ$BRbL%`k+E8vW;6)fu~})k+S$Hq$T-h)c+_xf z-%xO7D{fTk-@v&U^ZRi!vVF$S;Ww5mUgwJWd6 zRx;|lrWrqlyK_jM?NOeuaT}j!mp{8Vcrah%I$-rncHdgDt-JPlz(H%KT+8~N4z^*` z?I&6hT0{HDncEgH_W`jiB*i&DJj5`-uVD~Xt8(Qc$)fFrl)rs9uEZQTfn7M*cFLuP zK!VH~#p9tzYpGi(;QLqgz1a{S064Ka=$?GPFT=V(GwE?1h>mytYZm-^)^&qpy*}$I z3WG$;4&2R7CNX!!iJ&n6^$;m!K3iu86NX>*>YdMd_x9l6VHnRIdy2Bfl54&fkEQn+ zLrm-|0ekPhHciV?s^xnymrbT7vaT{wle@wqI(MI_Lybz1S26KJ3{=nh-mw{_n<7-h z%cfD{ZGi0O^&h`+rOUuhNA}nJ4YC&*{^1BIG67p}LL{#t5mH?e8=N45*8EP1D9@kg zW>I-CcL|m&W1OJa9hbo|V<`ppzVy&7l`>Xnl;0wcm>8NXr0(P=T*`qXHAM_=WL&7rOxi!GX1i2?0d7Op( zp_y8>gy69eMOg?TLzpMQv6&~Ym?18H^Qxn|MW2TyvK3IV&^cjUSM-308HGjQEpate zxmqF^S3;%e(^-(kO3;`?$=n9`)jasXKUSBjtQYI7KP{KMX}5NDl z)gjXqGqvz04n0y-g9xcPx3__T9ulE{Mxn<<=y8T%oRU8#MNTpWSDEO|-0V~1@eyei zqf0yQuuwW%_xeVh$U&GN%|)J)RI-`d`0I8Cd5A(h&V4IfM;+eX22)Co^graZz4~zd z8f0gxbNOZG+gf@J5A<|atH(G&V+tzRnF2AY+2z5m$&|6J?V;|e5aMbg9($&bR;$-( zZSt*TkV`kgm)=o_HEMcKw?YH$8Gu??x&%y`(J|bB#4f3!|F+Gcz=x4rj!Vt0ImR{i zh}w1Q0Y%IBy*>U1cTh8j^hLD`7C7lI{Y|u>%U1S zb1dBtNUB<|K-INiF|6%*tCO(FNGZf3 z0lr%b*&N5eyXIb;0MC`ev!w75pU~zdIG@Ejy^hR#a_pD--dd)=PLi2W=oQA9>f^v7+HI3D0M2%hN%Q zZ%qfcY2NBa&T7Or;tTGMphoQlfT9LZrN;Z1HitVEL(DeE_Z3r^>`^AVDZ24G6TPP? zEa&EKt!r9+_NF^pkYSD{?{t-thCO2)1M}DIL{u1?Ed=@YzfeaU7QrL^4o4n^Gg%!m z+NY~t?TcSe0QzHcj_txhpcxh}2TV%lfZ&w|$ntVx_G1v?8_knq;4#z5-b&x)%Sr8%mL1%q}yr1$dNjhF1UxJfnrk!Q({Bu&yic-Nj`| znuwQ)K9NkyVFr933%Y|@1bMa(V+w8e$DD4Wj)v+7;vtTd%&*B&mK5m0wM)Y~-=6sBT4vBszG234NWYp2LI}GJgvs zqId(Ivo87Sh&b+#+%MwS$h4^mNHIg4Lp7_gG*t}X!>%zF25)J@`E7$QFLYxwj$JiD9!8swYam}YWz|ZM zK4yE%>X0_aM8oy@qt_;%F%%7HP3T2T+e;RDatVFceQF9n=X|TpzVQ!7s}O!t{d$xX`uW;$y6DgJ zM%{x0&X);#nG$F?YSf8kBb!vIh_S%jt|i1>8HxW*vgqP@>$wgKd{W zPHEU!OFMBCgMIYe&+}kMJXDzvhJmiM2*5FtE4FDvPHFHs2{?HPmMl8iuDsFn5jkNOYtwW}qw)hq{{Fvlrgd^f|PD;ll87kypSb4@xq!Dx8cs4OB+-4`j}ZA5Qg zSe#|_F0L;+D{SX}?3BBI5TRUMFYD}tG z^vL1QInztBLyzLO?F1_2PQK7-!2PNvcpR$A72$5#xK~U04q-i1r_(@c@XE4APed8G9A&XAdQ_K>+OHtDIxR5LNk6NIN zzFa3Uq+QVfn3LU=I0?*2@g$0pG8)2rKP>6m3O^3m;`cVi$PqyoruuELIM**!d%rtrjKRclRl5b zP4+NRFU|akSCpy>0$MR9TIupn9>(Rele<@aPA%n?v&&ip1Mnkuk&78J-VQMDN*ka%hm6mdTyI9bu;b`ik{K;FKV5n6B`As8=X4IRRJ9h zi87O}x)`Cnyf*T{^;J!#O_3=!)UMK}ikf_Vv@-NNaaDr?K_;t`K@CY2ZmWz@W%9=* zkgCUnHIRzOBL-N-wl$YlW`7w2MmsO~-?O!S5oq0O*(os=8Yg#hmA6PJAf?+P5&>Z) z62F4tI-+{)aozSH*vLu7SLh@~k2-DWEmcsrsvV13-ikZ6nFZ5t?ldm3?Pr2e)GpRA z(x!*i=3>wzblY$-d8<9!P89t7Fu31gdoXA0rm-0O0*GH!R0Qm3(n{MPxUR zX)m|U?J@SZ@5Z6fE`}Y$sFL%dVcXIco7NRe5Lg3g;@i=3X%L-6-)fRZY%L~);9m)h z97{40P5(fY3p9_h6Ch{&6o9fn%~KhzB^KOiT9LW;v&0gcW+qm}wNXY>aeX5OtMqI& zfRHGqV7`b-`ER8()Z#k7B7i}KRtH&4wLjc&d}68{d(CA0)7NaB@lW4~x^*qgiU^_p zf%1q)xBs;o-r`yD@!4d9s9DESo_@!q2nR2_Zl@h2oNcd-Nbd92!q`&zbZ>p6pn`hL zJw&DNt#G8=O}`JUN?jz4jz3oCm?-PDwnG439`SiANU3Do5pJ36Rb%2R zKAG|gRkAjM}Z^D%Hg*$4BEfn)yl=D>ZN6!~+7()8ke1$b}B*mwAAo4w(6X=9cleO5v3+_soKUk)!_{4L{$U zm%5d{0MbaE;ahuia!G?gtyUS-K9j0UlG1eBQ=vAaa^>o$;6G{{3%!yv!UXtHvvS2& zp?^QnV%PMPrK6g`;U}-O@YAC&7(`4gVFY*09p;!TFG(V;c>b4O=rSoUKQ`kR{Wl|W z+Y6qN(QUX8u+!hSc|+OQmrg}p_OXizMaM4FG_KqGSjWqY!`O+MbyB`LTCI2oo~HG~ z*k_9up^yd`R!MH>nXFUb)cHwY))E(=k<{ki2}99nmYV%DLqs;GBAr8v}iB? z6HO_3X`)t>km6-eQ^L~4h6_C>j@_A78pT?W-%UHZusOPC7+?#LBP#AU(ClXmI)13a zqhvAqH}ICOGX#}?ho3&)Tq?YHVnbbs*~6|R+dy^ zVr(M#I8|p$=1MXTv^BpPYH?YZRmm0}DyXSl?jQZplbH{W8M^~>ZI+j%u}w`zNurCm z`Ql*v4NcvCB#}mS-!7)9qi^wv=nZ&iT6erA)Z2)74nfVNVp7ur4JcMZr}pJi7J#R5 zhBDFDo?xT-?{L*^Jk&A>sI;RoeXNIXZWFBeZPK~0lIMAj2bb;g6gpzQwh7{{&b6h1Ht=Q{-U+Wor(gk+j=9IMU@?T;bH@1HA zVcm;{r^_-u+#j5sIXR-ELwMyHc-;GDo@ng4|ClvRJJu?OcJ;clz|?!05Gwmy<4|WB zAv~w`l~!xd*49wHePQs6X)VZbe>zTl9#-$NLun8D0sb5XVh)jS*ZMj<$-2YEk3xg& ziJ%7G4sPS@5<*NKR$9NHgToV`xuB^!Y!aI-B`UV`d4ysX2$T=kYzF-|Y2_;-s+01vp}hEN*64 zxrP2`k_2BeSPi1+JLk1|EjzMNj&2kCgHjS6IK2Ct8#b=8jxGT^s4~lv??~ zxNTr!Y43~Sl+T~$6|XdP;-EyQwbu-6K9;vIW9Yq6SUg<2hm%{3Ujx*V5j17f0lMxN zjGrAOz+Y|qy~7WU1=sAUFatV>aBUy|Q$hOqcLtzirw;Hnf5}q4e(zXLGUm_RoPt_Y zhVSPBz(zBwPIe0b^kqEwyjQT3^WfS4b>A0UitlA7=c=8o1P4vkc%<=2ILOsjNPxXV zfDn>s?V@t51N{K9XA%O>>IhzkYA5!T`NQ^KaY@{$;1jhDCBaXvyNrj)$F|Gy7iMihe4*A{*nri34++c@<<_ceyadGXB--J^UQ+C3kRjx^S2xumS#a# zsv0S51^DF^9(|BRl2+QXxI`AnlkWLi=lUmFNev1_M7R+hKsIg-4)WWE67D#TYl!C( z#9K^>M!GDcUshZVCMW24^>;mBJGgOM9=GG>6`M}3?PPa^JMM85$Z@9ef7M{eHG`K6 zzh^MXD-qv|DcimY4ixjfg#47^a>I}1!IGw!HR#Q$n+Z?M`IF`cGU}3as0mr*Y#bbG z3O_Ek(K3bS;w*C4`{ep8=Cd{FifJJ7!tTm5UXzXI_VPSrnBxDSCkBLPM8L zZlxS$D&cGfaxFJGH#<%7OPujFPHk7I@fyd71#~GYZ4Ilw2N*cR0h-G=4>#Ksa-bQD z>)+0^i2~V4c-ud6V_UKA3pMBxuvZ#ybsbFGAehk+kODSK-0YO^gX zFNm#(PR>LwkqJKglWUUeX3qv`b#k_-HE2t?CIFCvoX@cYa80C6hB%PnCPzEXYbwo1 zvaEAoe0EzA7ta9MFhR2tklCiyt`(5J90(ZlcEs~sak3Wxh?_md6AxC?8}kzL8AJTF zTuP*rA2{%)pJES>q zLUl{pX2B84`HZ~FnQle!zS>=bf?b`08DK%=41X6wU@>gH3jtNJ{JkpB_FgkPi|7Bw zCf+iz8v?Rb%5!Jhx#Di;W|}-+;1U@iI{>O)iMOifW-qoRBDnn&uFM`}+^KHN0-k-3 z!ZSH;)7Om$OE$iGe!kg$r&BS~n)t_QxyD^->AiK16)C`e6l6ub-Fp}0x&$JzxKBi2 zk_`05w2dy}d9o_K@H`h1_%&%8O~ijjBL?AW!_%OVNLp+sBp6W<=U*_iPj!E>uxzQL zFwJo$Mwk^v{pI9)5#md@@_WGR3)&AqO0qC&JYO!<0<|Fa;%sKRpkI=qZD>J6)Nd2l zjGSa(q6IrP!P{rB{G>sezaK>g_7N*>!&vf*{0tf<{#QABPHp5(3#cg1kpA_a=TGs+ zcO~B2IG;h)Mrpvx4NmR5enX;_5tCy~H2NOK3F0}OyHV~9mfe-CBJ|f2qURN3H)BL!=AKE&vy2wum5GGH;R2M6F zB>geVI^e_bQ$&j+(j8d+%Rlwc2mM``B?~mVS#hPm?w`&&9to2SP(7e-v!2^)*8N+V z(CxW`K!D&xH3Z`(c%oq*h~#@w_&$RMLpAZFB{j{f;1wJsKngkQ1PvCK2ZL<;{kJ-??WeEb4DZ^7rFsBYCq z^xy%af>f{@=@CnfSjTkoG6X}Tj6fmO8z3-;n0pfWPISKKOy{$Jxegi6js)?D+T*?r z5*>&=w|r&wikQd*St9(UCs129aZc|Hx5&1bu7fORM)0KejSZkA2L1V&MpFXEkO9Om zuz$n=jR1{CGa4Q`90HSz6FojR%e9Rfh_t?7AucOvH49ve!#r|Ux3&ft)+9LMbB}(H;$b0O|jc(WXCUvZ^<~?IVdo7pCt^w+^L6%X5E}iP1f7)$H^Z&S9WsKOViE9wXm419ytxe== z$^6MbfJW@nGhcz7!|1yhj_hxym5@8n@}79k9TnJHOO)M&Qt;FI-;OP9lQ>G|esckd z6Mv}Rc<{-%KcYTzOWx4UETlZ)Xj?Fe|<)i;7Pxtev+w7$ljmr ziDMsBFMGcze+Zj%dUmT6bV}v3*~X4Z zo(+lba^tDf4A_IkbBfYES2Ue^0wv!M`lWY|x|3Jj61ioQ`-6shulLvl57M%KcEF6Q zAr8hdtE)}|wE>`~^QM0vKda%-AtU2-m;+WzAV-$B^`O;OqP6u5aBFU*9nSh)y8-3* zF#U|T)xKlvWJDm2ACOib-claU>@cjs+#s~-|B_WvF#GSq^gj@?x(lg8_oDbbF)6IzE`slP;y751w;Q}aU#Oz9#yc50u9WC=GQ^#QAy8@ z`Lx_5iyXdGjqirwpK?y~t&AZB&MMql7kiI^xG ztzXQlHQjDkx@{UA>eBsbU2 zfGB7m6>_<0nZkm+ocu^ZKy*T9#X%4<+r%K$j${vhXKeN+3~ZUpeRvUQ$>ti*fUYtP z75nKGc4t2j&JxxY(?)Di)AbPoo+~~uX_Ce)ERIOyRG}R+PecFOQM^D2z34?7f-xy!JyN! zQBDpZ-`kN}q9(`eW69p21^$=M8t(o)&dN!hhpQa4_}-sOz|KUD`z%*i%B6I z2+Y3R52FYkL<_ceKJ*d^b`be$^^ik0d|TQTO*zq zKjI#Fb&t6aN*nmQ?A=}a zqDeWx(6xUR-3HmmHTRdsI)Y;^8{~WOO5Ps@w&Ok7??a3DG@cICtsVV#@3!dI(Q*R+U z(Cv_fgH>Q`cJ4shZ1o8C|GOEW7An3Kia8d5zqtw=<(v6ku`VGWK??xft+x)eOt@#W6Ab;H%9$;&C*6yw3qu1TN1 zuiWQXu7C4#`ja15-c}fpk9_=i{jax|_In-w`Qk>(=OQoL2rfJMhj;F%+Vpo!UaPR79MWF~^7n4Xlk+}i zs)bu98uZ#pLS%k!$hIue;X6{Q|oeg2qn}}Xj&tR3^%Ri*9Dk$VUzBbDH_*zmO8|mg=xA@ zu*UAW#+{&-yZE0G)b05``LI0p=$P}a*w7cRRmn$xKB;DeXc(=nheWz8pxb&mVqDC_p;~;@Koxm|@&BL5OE16NHAW zg$-YWhDX3c-H&S-sw$ROh;a)zWg^?en#4_#S2s?KtIBUAiS~?8kwd zqiKnOd)e{Xfy7fi*+>E}&{4SWEapq0$svHTP^a+sq2~GA@EcvMW9SKAtswG-H^#a2 z4qv04HfyW<=t;&Xc278!hmOeI=*~Mjf*HknVGU!y|@qa6m)vbPU)EoQ&9s>9eKt?j7DP;@JXhx5iOg$n7V z!!B|;5070guv-GEHvLrA|0adK>d(lWN&sn6Ciyl}CFOlM)t+{YtL5Yp@>QOu8kcp= zu=y?Y)Cy2pw9YL=0}&w5u&OtcZ#XD{TWrcv;h4(*l~TM;4+FKj0qXZ`J54iKBZNVU z`!;b4x@pFD+stx#4j*igm;-lz090X39>5KdpyoNdiu`TNG@ZJ~J}bRJ#WxpOJAYLg zDQ{Okz~bpYK~zV}{8bLh6uf|(ma5&Ks_Jikd>yEhR7f_jGd)_fBj_nU%){`CXT#Jq zZff)S=QqhE{|yWuIlpFPMayd3@%xsQO@JbkOVFzEbUJ*-2P^VV7NOi0Ia-&+pY+Ek#TD)en&gb^}_=lOv9?MJK*9QJIW#t!4?- zDtTFHyNs)c`B^a6KvhvOfRl}Xs%#C!8fp)$ZL`l9&*|ZnO-OyrLmVyzVNJ9@S&bWB zxLfS%lWH}U+Z}xP=L50byJUv@UDBu4xsMw)cE`Jt_hc(oWC65oUzfbwmHf};WJuQu z#h0dxz{77!B2N}*c9I0vHb7#a$eCER$s>GcAa;X5YFrTyzm9?5xWQ4$lZG3-SciG! z1}pFE>{U;_%O{dJO12lxb)VLq{zBpOy>H>QLjfP2%N?meilx!EMsO%%o9nG~zlwBp)il@a?Bx_Y_K&XE;-4>C-KRP~ z3SUggaC0tsWuW|_8(w1Lq}XGJjk#r;YhS;7WR(V#hAi#FHrqn2q=a#%R8g+hDNAy}Qen>PAwA{m zyipZ7;!U(F`TPubuMQA#7W(Sck`Dgi#Ul{wv_#eWXY_4zl2Hi@v_h-o0{2O|QspF! z^%o(u)ZBIX$4sH;dY0 zOr*iS{P6+ZbdneNJ#Atl(eT6{ohkV)Sg0bbAhVc1Unmti}cUSmE zG7xt#LJFkFwCAqJH$ujMB~Kr>ao82YUHFYd4BO?J;ha4_)U5&$R>o~t~}E4pXr3$=?cd^QXlyLf=-lM&5T4x>D^SG=ru zBWw3~O+S`cEwjEHx`#j5i9&apL_6TXmHoVb27UIBU&e_AQzC6Q=F0@r@dRu@6N&DK z=H2g9IeKC|B_C!b9-e((WD_@R#^#zL0)GuWGzM^EuXFb2$PMkec--8@ha3mN?sFu6 z&C)&$t$S2E1%$pI_7UXudyI<#&Tn`gGuq#?*P*T;!pm0a4~n1A;4b40V)$a;uooyk4T2U+vEHqEr# z!eL|MVMFw=q0K$ehTM2iZnz56S>Tuuxdzj<2N!@Ww4Xr_6^Fx@Bv7&Z8I5oaO_^9* zLec9rzr7%nrM@3

OB;d4N4zct_JbPEX`pCDJaaW>NRiWAAV-T)4Y<$9A;y);n6Cf>)O-lsOn>l4_E{3fZ<#8di$JU>G2 zeBqO_$F3dhIZyu$kUeB{_vBP^K5v`1xtDjUmr9FgbNu^zBcB`+Mgm5hY)p5P_jr50 zoYF6do?bq89X#5sO3DW}mM(^eKX#bsHjxEk{h$DDt+`~_YLb>d`E*W`Ya$ZrV?l%< zoPiC^Xo-r?@23$?)sTv{BxRN{ex-R~N++t(;%e7ms`?N>nNgQ= zT0`yIy$a2{mzE~f{|3+}Un3_qYWK4pUZvppat#}~X4Dxy5r>(`(P5YCE7qyz zo{nt?#@#&mqIrpDs$0Pd=FZ5wh&SYEu)7nFJP&rCq^EX_Y~!zxg<$eGlYKvv_6`5W zr~1P!bmzDcdmL}ix6~l{a$WnF{?!qgz$f^yzGK>m1+`$Bz2`ntGazyNp*fmF^<910>oxj3P+3@4vsS3OKo&1An?o6um(QK@U_V-T$x zd7)OSelpET$g61OxlKklolEl~o0q73s2uO~#9q)m5U23K$EE!2BpJ4l**s5dSBb7= zX{33@oss6l^R6)Wy-zlb1L#2kE1(Eq@!+#7nMJ?_XC3macvnu79 zl@^$>X>*I}MsZv_C`}(hYkt$EM=3VWlnZqxbi-F*I`9@x`BgUOg0G%#E)XZ=Xq!fs z2U9V^*VxY1m-)aY30#>1Tv{(v!f@yq`6&$W$}gEWq&)fz0JTnm4FM2qe#*%lJrWS> zk>tYew|AA#v!bBfu3~Hki!?#fd-oe=2jY#VYzO9pq3DbYp3d_ao)W+ zubpOtWyr^m%~ftJjE7J;t#DL05HrJ8(+6T8Ky`%t%G!aG{V5n?i0U`C($H(Ap%kT% zQOpusGY6&O#L=nY>xt!Si%a@TK%IW71Bv(hAbxbJLFYspreh5QyO6}~_4*F>((S4o z<~a@0ho`{5t>>~~muK3AfsW5tw5%VVIrH0t$hj++5OcSx6^~K6(^|M#ME5&3 z3Eg(;d6ryP+=>g=uzF!Ja9ATxW>;Y**Ut2N86AtF$kq5M%UN|5{}sOguBbFbo@|z> z3;>X{5)K+zBH(bHz!q@+W3AF%-)M@yDxQr zdSnNtD)qO%`mdV1eQ$Gnvr$rD;<+B59lZZZOhVo5{e$Hl>v>Q0KA;^pX65Fj2`ZC3=Mg0((I$$$Uh1{xJN&zOb^3_M2LPnh^{`@T)oip*uDM~>boN- zTpCcJ*G?^shU5IT$^(G9`BY4}nVzY<*FPig8zm3IN!hOz1>-0`_v=H)tF}{?(i~K6 z4x)awD*YUaItcAF;yQDYg7X?THq%8(??IQHQ2WJ025Lomj@J|i@%KE zY^{I#j%*uD^PB`b4SmL!BzbjyeyEadGBNV+1LZ+OB#vj! z)Rbeu)_JvinOt-I-9!o3YKz_c;N{p^zVW2oXo!U;a&?v*`HW)o>_FW#(L0qZ?>gj% zv1UieuaBgi%gvQfrTVEeB9*Yfh^vLmzW|@JwfcJIFxV~1=rgJm6iPpo&Q?gY&M&>V z2hfyJHJp-gLvpR~&*~zM<%20Mf3Jn@*#h@a@0Nqo`ZwGcuL%y;C`uLw&A}k9^u$z_4JafZxjlm@zyT}b3~7{aQB`a|MhbnhVCkG zxHNz53{zZ2&HBFn%Rv}gD`r?WeyyBkPngOi1F3;P$${@sZfK8^3D)mrQli4TJI4UF#E)IwlY!?(m zw0j)>Nd)S|(d>vLTk%&Dw_NpZ(HXHN@Kv3py6Il+zgH_x!wTgDhs}}7j1OCLT}*ep z!B?zQp8QMN{l+h>S1ZKU&?3R4Bz1!7dwL0Ehh6YL&HWU|wZU~-EatIG|3?V zxCHNeZ8Bh<)sKtkab_l+@u*Ju6#LYB;j;)fG}0s9>t^fuD(q*5 zQC0Y%dZCTq#n1PVlp)r^To_SPUcT)dfdwQqx%F*|Cya^4zlu=H0KzN)F1?`~l!o%^ zezS+2ng&!cSdHafC5H%CtIT==sMaf2(PN=C9Sv?P84sjb7&wLN)-aQkyMvCNC7e0k zMpnM-WHsqz+MZ&2JM~jRS8li}GpTc3&Cfk`i&35?4t;jbTI0>ido!KpbJx7GPj;$^ zRtkY|*5Rx4^~yX}*vh{am8)?l-*!T`Q43 zr7#ejR?m2sUEv}L?CD6)xo8?LJz*H|?920Odn}wv3g*$8?TN#&ex2#qop+DB{rPz7 zSKJG_N#7#%z4}6QP{ZG!yvs+e-rhOxSC?_V!))jCtKko_|8|t@eb%y)*&GwpNL=T2 z+4Ou%>nDGM&}7pr%KV2XT3vz_W}(xAf^)VhZ&uqLn6H}Y5k<`<&;#%D)-kR1mx^4y zDI>AZq<-EIbcvCF*fCxJ7)f03UP~gUbi<2v{8N?%;gdZ$J^K?)koMX~9 zMz1YV-wA{k1sU5yRD+FgI+wBy2rkMV$RE2-J3>RjBBmz&U30HNzZ1%IMz9OR92Gd> ztVUS7P$Q!(5Y|c>;e@fSo#{jwiVcb|MiBzX^?D7Als3a`QaF;9LdwseujYX>Hik|E z;UBn6VTKA?)O;d<2T3-qW>DrXGyX)FEiMsMNkgLWxurgC2P{JF~ zfH0$anG()^S`6B{Q9*kKH%bC1fv_xVARHg*(^XfHg8yyy!sfn9~Ghm;#^9T0&1^mVp-Rpt2Q#juo`8f9E-^L zLiyYx#4MVQu|C=hJhT(GdQi$&V|fp_95fB5@I4F70Smb1$w^K(U1YSk(W=@b?zMdcE%s) z<>a^z6t-!SfQuBr6F_gjH0)0}4V_Y@j)?AWcvI^U>cQ7q+n_%l_YiluX_wZb7`Abg zj^S2Js1}oI_0i4Qj_wmGXJ`Yo)dZQdLWncs`njRGOkVkVW|PJ`HU z*lgNU%gS*D@?fT;it$p04R>6}^I9r#k(IeAM1tNeV}sk*8wW0Y2SfxA!7FO`d+z>o z$D!>tpw*zcrshIPx~`}FC?Piy?6Wn_eE4PB*(Zm~oHYC48SCB)aWN088yad#Ta1~^ zy?dgygVNvIPsQi&#)C+IxAz!n{mSy=ep3;M&(MO$NG|Xyl%N-+KA^a2#blp4Snt$1 zFD0)}{^&X73?ik#p=<8$Mr!OzB}53CUj|B$P)QLXMgUfmvXCojDRdtR!Yi#)*^8uv z$vvDhvc$c=I--|c2-s*HCPD1)O;PUq0X?y&7=4(T>Y5&yk>AHdSxaT^IF^4<-acSg zgEsKf4Zt;P8DL2x7%1gpw;YXjYIJrpU=`$7jhU40Klk8h=*n+wVp&&xJITdzGB^J) zKvdGCmwo+0gN}4YS9@vb-0K;0+(GAE)bni_)>qh=-DNgv&F#+gX#v;Xpc9kENh1b7 zN;iQkS#BRo(fYzTYdtMIc#&LJHmXQB-DsS>d2}o`f&p3+E!-8@u0w2sgVsxFkfT*{ z`dPoc>p=@dD{0dYf9ZX7sR9y~CZ9hF$Y8XyQCs+3LyQ!yAL0ktDS9e(i3MF(!NwlL zE35MrLS*hJU~cy8e^AlPdPW08zdF?%6Wom*+6RBVMg{^)q@+48mFu zrL39v-XsKB;6W5uYqzSM7xF7p^zZ(6c0O?0enqV%Vk>p=JS_OB1nZl6mfQ!(FxDhw z-d|=DwhK~qM@0~J1QQk7J5&5~iF`NZl1Br%C?+r5YqJ7zRfX2dX)%pIs!JamZ5M!!~ZqI3da7R$qEetjl+ zi3_usSNoAL)1{+E*Rxz5kT7L(bT~d$x#_}!t<+JSl$hQ95u*N-^I+qEV@dLI7=?7v z`5l*#m$XbC!iLR@F9P$TZinNTG$D+SKjmBONVXQd^dZA74SxZ z?NppLoxpa;&_4x)NilkmyJty;TVmniLOha3&=ackHmER#$_5e@BOYR-L~VzVXe3t- z87Ib#t6kvjV||M||cFI@RcXSei^s|PXrt;gex6nS!au(V_f1>8A2omcCa)W=om|e+J$PQ zm4w&}AqCUnA!0}f4IVdTtBiw~zsH;fWKLd2bOTV6G(61Md1E5F+b<)M-EbyKzlNw(cu2 zvWy0ep&?(%uu8(Et^VXgbX6!26(;~OSqqzJP%kk!PDXz_1m1cL)9UZoA~j)xxAIM? zXJhU@a};zsmRdZ*`zcSW&T8g1=wGu~cZ!~6)kDDmOuizZ(^J$fE3ean_#FBF``&u zyj>d5CPROtVMm;PtbdH2SS?+UJU7jKsnBhi>uAVR9u(k=fW%-S)t86-98MXe-x-)N zNHV3Mg;<#zszLzvvV`)*pz(%`$)B&Kz6*i^CpR!|IdEgqEd6`l}r)c_7v@C zj$WZrBz|ZG0QJfOZMBkuM(@H7a1jH7w*a1da3=mukJ(>k#9x}S!8lq+qU-}CdI@nX zAaMte7{aEx1a580M*WgiD`Xaxk3kC2f)@_*hQAPa4b1rg6&+kC3kvmSEl35V4)*Yf zr*`4{;r_Zv}pgYc$&4|NTQ+05x;9*sOOvm1qS%xE#P@`*jHvmPxa1+84;yrQkofkO*Z~yJTe>T*r>cfJj6>P2Paca_~ zlDT}&6Sn@aCFr&4&PxY2q_WA%QKTJn8}0F^z-GBUBQUB?p zs~+3?&BAqqwZ9MwFy>l1hX{sPDruJYdEq_F#B;cqTn5~EiA}B*QbY&5uFZL$8} zdre8n)HqQf@O?AANjru01b~vsFcvO4YdVpx&(Kq1#5auTWdV9nf&MARm6GsG2_7IZ z+q?i@C(&FdQMp1=HKG%huc`6nnj`DB_3PxG1G>Q2K~-pa{JT zP!Y*B+IgCNa%zj5ltfoa=Bdml!G?Z??&s#mvtZKa7${J62hd&LS?dLBVYdLx0W5^Q z0ENpCBQin?@Qj)5U*-6^QvpRQPUXVC>x;J>+1?1z{wCK#`#l*eDakKqnk;JSsf~7z z*0&^5S^_CGcA!S!#)tUE2Ksl(SMq)L`$|_KI~cPgEL5u)tFvJIdm7Qk3Yb(NiuLf5 zfJ_@BtQt?_W-|^7)YKPd{}p7X-cZ>cbirFlv{F@fwAv;Qp=Po(^?}aALS-*5wD#xe zP+!UUAlRaq+`-f65Nh5PuKsHDNi=(bTD?4#J}#8|$F-8!wrj%z^f{t~g_#z!r$u1@ ztE=bMzDx0&!#Y+euH8?mqs~5QlI(c$o!1yRor1kpd#=dZwthB;^H6D|+NB?FA0Y7FqgoTs|Y{w^+p)f68Z7C*Y9P+GY>)D$-O+j^Yl=-F-F`ZhkK^;(lmnI?k0BAQ2xoC-L6C;*Z zEKMGEp^E{sM`Bcs-^N}5>Qe%4kcD5Ii~LLL{L2kOoWm93RUL)Ohf0aTa zHD|DCW5jOy_ZJFWr-YO%Q8SRB)wU+b3zCnGw-!h=y6LN@q|q+d@Yv9LjjbsfC!Lii z^X&6`Y+$<;^W2y79Na=&F}8=gkbAIwmHX3l8|*FvyDMJrrJ=Aug1b;Hg-%MNzrC~E z|1kOH+ii6!gh!8gxB5zNRksdzzpOi+zx9*-_Zokrjb|SJ_@?H<~m zcu#fZ${b)>F?@WbU&0nI-SbY!4Tb(q>-9SnO zPeX89qm$iw?oO-A28xax$9`c5|aAo;*bp^;?;If$o zjgcYhWvFK~oR&oO%j^C#JTm|H4r+X(+3zQV_Kjn%_5PddPkg(j;Y|ha>)4i60xO)b zoT1b%HRO4`e6yf7%%DsTn-2@MxN?X90AIQU>!cy=g3;ZA+G|`0V#?nl5>@{^;OfV| zgc}2P=1ZBM z5)7NGy0%n0k=^&@fvs(z=kzS07W; z2gsHQOY?NqdYpLEiDmRBOLyhU=LM|I6l=o~y_H}I$2(`O*{X!w{o|o$RA!Eb&&ZoQ zmjBfT-PkeIjrj7^N zuscGmm*t4CtdX%1)FiwUQcKKN^48-EgfLW_sM+uv7D*s`XQ2 zU80?=$I{n+zFWn23+H&GxAnf~(Ro{+)$Dq=?Xb(WTnk6+CA4|Bfu*-)A3()j-8@>y z+uEo>rHt%wo0UpnxIY7{h1U$HkprE1uDkXd6I@6kw`ZYI{9Xb~ZF?E}g=XFFVK>?V zbf??i)R`l$dIgzt2!rAoAkyg0#vl1B_KWBnzMB?@RJ=99x|_3Y2VI`@m<*8)hz^dC z^#<4954rKk{B?2aj{5iXAJqB@d)@q|JAs`KoG30esaU+Xsvq{Gv=Y_IaN94qf+0UjHWD4|g}1&w0=*QaRevY#_#w0V_PcUfdmXNAw;4iwGVy zh7BGc-G55+#PoNH{t4&R_B3(T;FSs1UL(ootPWd@m3?aFRz;iW3B+z%x1}I8--G-v zfUnZ~pS$%6elD{v@Xk<=sp3%EzKXnkkH<1h(JkkrDlTixdAONdNV0urB&a(bLgJzT z5kB3S_Lu`P4v`pe2F9WKEcxc}5uhqx23i}9NIx_o1U*+AC_negyCoes90>qX#IjF! z4+@b(deGGnz51)6jP(P%@h8Pj8htZqlwKO-O%+RtMiWBe{vz1wlwI#9fXZZJ>@ur0 zDn!DMYye@P{{9xF>iihNIAjw8O=_2tEMJWyO}3@%ZWV3P=L=EmExS}&I50aN8x~TA z8JtPHx3QOpFIEI-079~S!gN$mwSd=!0MSrr9rL&Nf$a+c$eQLznG>C|JG&}(q%?_W z`*edY_5Ps7r&XujVP=|lgN#Up4e2kFGAu99F}oH&lW$IESY2SF!|FR#FW2{&X3&{I z_V0-IIQLD%gs8A(A=*1rs6uzMSGFGnk;}rpu~tR#<9Z;qdI5&PO+_;WYqs46K&%u! zC@-#(FjfH86m=jt0ws0642Ts7pwd7kOQIgc{{x_`BTxhvurM78d+S8tC0dyl5Kq9w za-FE(#Ur+0d8&4@7m63%sr-$bv987+y?+R;c|`y*sma2|E4uVo=3&Lp2QY^?d3%!&tKXUX%0`^ofxc{@G#wZIG*2@B5STcGoFYi)#p;k-pCqkeY!r%(c_s}9KaRLZ4 znvN+5?bI;!LmhDhQHC>J3*+LEPSWdF(t7vCDj&?@+3(shEq1e}9wchf)%@|fFouUn z$+Wvub1n&H=OY0TKRBxMb#+i5FTL2oSy_AC%ava5vzV)bjqmFVx$jUniwc?!C(ET@ z&A0`Tk@!TlhO%^n9l)G7_rujHLR<{P*hsfYA<8Ec2=y1!aeVRCf%g^gIGychxhy9l z{y);N`~7oGR=3xfTs^uL|5n`a-yInDBZn#qV6T`f`7DAMb`|-1yu|fN(@Hy@u}>%7 zPIc)s=tSj9Q|{N7H0h{-u*LWc@I4`lsQ}rHj+7);=QeL~i~9ToqGXnSoy` zT&Ga{J%lmvJD%R5_nyf}W8huAqhZu4up&wNn&;&3Pbdb3^ThFkQ8p%Wiy?j?Re5Lgz(IJFbu)1Ex(+uvh0BVZ`<_h*9utPEAjWYW@EdPavAz4#bAm zvoYEKg<<)lO69u0Z?u#M&z?xkwfb91F=Pml92xL!$wx0Uz*~0de|PZWBc4gHiv$(lf2o`)s*v(w(C+C+}-ScemmTrtV>;FJ+RPbo=!w}ViNHXyUe1J zqulVgmweZQcjHC;#I+T>P^WA}gspR4A84O!zp?^dR<+#n-UGuuFN)1`w`cxtYsfra zesUae+lkf*O9FWX8DpY2DVT zS7ui?dmjZzYyf$d#15}5pGIa-BY>1Nnf4?xFHs@R1;YVAQvyaR12G>E-l!&tA$jBA ztqN!iAF^Kz8SaMgL{OdpWG7J47NefdW3Ts~H_tLGXW<8DtS4j`ZB?Uq%k>jrt+xd1%unyvL+gJ$bBulB z^Q$<5ufo5ieymH3YL}uLW>D8=kR3CqD*&@A0^}VVwqQ`jFg&CUYim=!EjjGn?Do);quST?=<^&<*& zj4tMZ_~wIqfXKB9r$&i=KWDW92+j8oig;C=FyN6RG)~`$4$S=P2ZD& zBz)LbNkhtLtF$$AivWI+k(|%ZsOG@)0dQ0`JT3_yKeYl)5p-9O~QE;>v zsLBDF+Z3KmQrR;Kz%dTs0XvFxfhr8!^)#gov+;%i5Cd;Q;{bpRKwhzulK@Pn0m|F~ z87%b3P}X1p))xTc%qVS@1w}|9y8*Cx8ls7Tp8a*W5sLe&Ko!uikK@(MQ`AU5a-u?W zLuL*3W)ZXXH6P5vd}-c&imdq=Z1<4+wFDo?EV@m~wrpMhA7MSO$Y*La?kgB$RJ_%> z4L!$n21jxFW>EKN$C{7l4z^aA3SA+2G63wxhznUnk$wTz>2KEZ~-{Mj`g9SRSc~)2NJ}B z?3x3|vcNtZ2nP>dm0)oIz&HZ1M!?i#04DY*$%fGB3x|gUAaky^$u4LF3wlgpXMF$A zuNi~CG)pyP1cS2trJ*4j499kJHrxn;xK)cCjp=!0lZ0i;SmdAD*_crdH1E( zBT`Hcz_(?@v8oU=!AX0-+Fy53YiyPZJcAw@T9r!nyR32Yu)wU*V?xtWH~IXA8RS(i zvR!=of&f*|LNo%9VjA*Rs;CeURmg%D;x$q^@MJE0^}{IW1@zVtXd)kek_$^@LH7Y* zkDQ<@XXz!OGAF#B(msmH6Gx>rT%|ZW5M@?i&8f2%6Ot&}$wu1xTqOcvRWb)@@qi2J z0N@bB@4v&-T(kJ((L?FBjh-UzxGr%(ODp?rWz(Lh=k)<5O1qJH57k3qx6m>zgdIa&bujzRo@{$aBmyf(FZM>jBGzbtMVvrYDh*B=1NO7f@#+org6f>@_ zymL6oL7Y;8@65i~e}C;N4LA`mJvIbAGzyJZKqFUqhaBkqLyyE~D-a)P;C6*;f3*#+ z-iF+0qs%5~!9d49)mhL$i{^yBDr0?5B|(f5hEWW`XHlV8F|B2VK!^~bX1BziWFO3W zZ?z;~SGt!5>NkLqy3p)~fi&D7X~Q3}_%0u?YM$;V0|_(0*imSS;Cc!FO0no_F$1xR zosP@zJ+6GnMtsahh`Go_&nrb-gm~ymAp?=T4zbXODBxb@ zEUh9-C>f}$ce*`S!6eC2*eSd;o>rSEmBs-!M#vzctI&QvBzOkgS8eYz1NNQ)dx+}} zb=1}0T6eUsL(2waiK#dQE)UIm54(Cn}eV;GNgZ(k~yu#Lkwb1_+7Eh$Dqn4c+k#1$Y2L0b~wAA_S1I zA!#xnSqEsU6(bwOZ4IopyVAD3Irmn1_O;@+-=0ll*_U_aAimilF7Ra+6j#m*Zj|y7 zMXakT#uquCR(ZGbq!G(x8tfPgb`o&)BtW{L0*hxsQ5!1DZ+VoTgZK<}dMUu>#vRO= zn|J5HULrTGx~|M>Q01*UyDuF?KM+GuXCdx#4C~fy>^`^zCNzSqS)i^1%0}iO1JU;F zGKjI*?P%KV5CLj%cJJ;Z#Feu~n)lkw_BWgLwBYnYpVWZ`*j8>6LmG=A*D4@eq{-flO+R$Iyaip= ze{NR31aC}c%B#VZjo{2`0$V(gd4Q>P>h@!F_mieN7g}@aIS7*la*4gYuf}~9k$5`r zk@XPRTQm?MMm3h+S^lqdkxTp}MoVR8o8@LB+^T&9{a;>p%Fp7K_h?SZi1`T*%K1QZ zJ|s>G^E-+toLTuFYq(5=sKwv=(|GR^?eg8NsK2dE0}aTYhI@-I8|wfMWlORmynKG? zhTo@$X+xeFf7aH#qO3H?8*jrB=V5xUVClDDyQR`5@S*Y?2#2w0%MiHz3wR5@!t>ZYI ziL7SH%hBzMizm783~AEi%^)k$09$a|L!d;Zfjqg;LhfN^Kkupnns^6XeG8)RRk=-Y zGb#p_JA}Bg8Fh_;%Gvk$cU8?y{wqIQB^ULs({rE#0psObiu_HfizaYg&iz$ zIKY4{=)(4MZ^ki7ZnbjORY2C=_W0U(GfWEM`}8N=^$5}YU|azS5<&d%kb`lfHkw^A zFWz`5`sGcE*z-@lq=C6Muy_S{_)^{5WcX#c{0txN!2*?@*qca&aJF}B4~Gf>=PIRe zfozJWfbwR@$3+hDoZxUgMAwoMuFwx*K!NUS5A&f>GI$Q);(0Ezm;<#Ff#@_4*Bk85 z5;T%gDqG+O@b7QFMu-)%O2$|ss%i6+@_MQ7<}1kaq2Fo+$O}W|pa?{T;#<%T_?_*2 z_x`?raJ+AOKBW-|7YZ&O5wATafH8lp;ftrDO<|zBE3nc(2M^zcVBUH() zc5flr;Y&6DoDjbdJ_GR=1#|JxT)@wZG-Nu5a={o8c%eN|>wW5L#Ff|OwW6;F&siPJ z`Bn*NdX7b=TOcZDzNO>8XK>&-9C(W8yHK#0^Y&#X?vxM@-)=e;vh?GW6t*i4mLz~h zZGwei;Sr4fLw5yxq*Gyll0Z)XHX6)h<$FPp7Hcg|1T(Gg*QEzm|0mf;pldx{N0t)i-oCf9Okj@hb&@KN_g zc}lKU-bBqZVXctBlP@ix{%i7A+Vvgd?i$ClZA2Xf@c2x;yIM*u-cJiI*C+%rs{kq$DaK>8Bzbt)G_l zR%N$*Nl3-4ty&qFuyn$+^@@G*->4q_xp zRk*^;#}2WhBv(2#U=9hDh{ODua864=uB4s+w>b(yueg0*>pCH_mH?Hc(e7y z*-gi-WucZ;Pg%Ltj|&r_CZ-J{dq{k@VNH{(-eAP}KBrKtlk2*5Szq|U`8Fdbx^fv+ zdFwDX(`BhxTZ@;U%j>w^Q;ISw4NT2HZidAauwEq% zWaAlt*4Dm@1Dv5r0v% zi%f=0hqx1v{Q!rr5p}rZZASQKzIYe$Px=^>55T0D=Eo3I~Y*{QLhK;Qj%Q z{l5)xca}BWMM$|d_}|6NOevOai`KPJ9z7+g$s{4N`+A$-HRjWtT<41j;f|JIG6tDP1z(i{lburZN>nsSI`s;pYTdCb{Z?QxzG@8c#RT<7E= zon4*J@8pjx*ICwNUq)QVHYrb5l5+R!+@~f5?h$7Sj>Z)q*{d*ZCHbu)>nwKZ#Z&$HR-K6^@`G4nc)8enJ=1dKLQgNK z_mdGQRav#@!H+1W&Y3s*?e(I8Aatd#cI?gw&3vPaE>xE%0_r zep+;dx>?fgz<7Ewl+<;;W;~vba8zbj^E>hSnj25`vl_nGoDT@X%5W`TeJ#QV?>F8P zxHst)LYdxIx}IbF&;A_8Xc$|2#jBd*@`1&)YoOrm{hqGj#$+{@JH2_sR%HtlfBS0v z$m-5&S#miey7jMSjf!N}U(?KKI&$7%>)6WT>0SSBaTy{exZDb;mrqmn1IJ zk2Tr4uk}(N85py(^|~QWp7^|BitGM|CQhDRHxD@;dNsUb#WBIk*zJWyeCHQdRr?>m zoK!l<+eTxH#ZxVWZ8=Ah_EUjE_XO*m+cB;bVEd<2L7)Y;rQ2fYd42dq z_LaY&9caH2$!if&(E4F?|jlz8RSg{ zYa$-^I%gJOy1|<@5g<=1XX^~GlCz-9w@S%U#7Rn_U6qaxLco1N&*f0yoRPY>M_lCz;wN6u(_TOR13W;q+UZcL-XzP=v{=5F0O5I5kKi&At+QY zXz|zSqgi@86TlZsH>HB?&AYJ}RNBoedi^dFo#8i!AnSAz&?&0AbkrADkV^PwZierg ztKizedM5r*hXLk<-XyDVgux!;Br&0$7?!GgU0yk2G$w=x+6{n#nqaicsCzJRkLV$KaE&n zuohVBRbPF!aSm|jq-vGJ#v_n*ArkFvt}WyO^g|`d60Re^i|YS0#fezf zMI8e_Tw{8pIWI15|1oU0`$qT@F7?}g_ZpR?iK0w`@0BUki(%qxX6Mt(d^yIAeV$6Y z&6u85yKE6!upYN~I@WcBJjh%HS^vhxMd<3y%sgOy0eTS|GgOV&^u9UdX7a4l?7rXf ze-2CO1jvSY%%eYUD{mu+a2Kms51MV=m)%=(=(~$(gV7n5qG8MqqhH$h^xSP*Wwbq)_g=Sj$mIqOfQ7KvGAgZ z%}MY7CzyV@5$?}NY{c7J9kWt;48P>g+xT}Nkyex5-u-Vpci$^Jx);>S z7IQi7*!(-KPn!ZgZ%oXdwAx6&pX;HL{TElETr;U#J?pUhrH@FVVY1FQQ)|)|?<*m*=D?gDPf|L-#v7C0KfTMjz2Cgdqu2;6bC#O`l!^Tjk(tZIF9`mH#jf3ebNOWZ40o7=))!qye-an^$k zP>VmAdej;7Jx33alo!gZB*}!EL)4pg-_u6R=;!n8U2iumXJ*PVe0VUeH!j%M@RV*X zV51R!g>-%!`d#H_7Ylax?ou^<7&gBk;M4g(UhxyMgmH?G1X7lAw5rB2z;Q1@rhm)H8xe&XILFdxt0{)%w_ zXt>{i6wm-QrNXVq= zODp`wYSh(I%!CboLW)6wj|rx*zoodqG2A~c?vDt!h{yRC#2*bpf@c$>%{6&^TZ?9B z^o&Z6F7f=KRCIi5I6!+Y0tU2k|0_p0MDM%7LU#?FT3z>YeI^DZ34D9X|7hERm5Ic| zAU5YM9~aP$TbAPJW$FK&YUnz#!{6Nx4ra<7GQ> ztquO?j|~ka2gz*kKNg*8ZgbFSw@rHjtrL!T=kj+pwM>Tjs93@NGdMQ=3%mYE(RTqB z@EhI7*s!_~=o&QOwP-Jxo-zzinN^(7V-{G7Dezf?cS&Sx_z~)` z9=;TY{DDhjP%2pPA_aOufnC43XpV-P{;xFddFkGpr$=Vc8|KlkhFIf67;_i=6b<)> zkDC=>XT?}@bFo(zLG32dGy?Ce0`V3VV#~G;XW*F~KElp=o9{Quk z#ih2FPJb5_fBf&nz9TrkA#PS$I)%qP60fc@a(;!!Vj|*41lWH9Y=$lV10bxltn6eb zLEVt}b(YgYfOzpYm4j?Z!jrzOC+W>4VDk{t3IS?%&5!pnu=+v-G^}zL z=B2RT930pW^Gs3skBb>&;N>$oU3W3~Y!)nZcc@hLnM9@JJhB zdig)Wc~oaT73lsUolzU4ecgZ<=$>BQkpA^l75@nCI{@RlIdX)L`Hx@yPg)I0*JRorrm4Dun*7-L{V?T(Ay~^qtRbDBHl$f%q&zZqwXiJR;V5p2 zk&^E&9pM(Eg_toZ7JaOGfPq(jt}?>967aqlwP*wa`fa5_Id*tv5V&DjNhwL9GYdV^ zh5wjlnll4ic)FtU_tVt?lC->|VM>JW!z+Kp7xXXT2>pa%n%j>~{P{7JJp6u;Un7|3 zHbS;9oLViLa&td*Fzod1>#*RdmX(f%vL#_)J?~n;%9GG-ZfPDBM5&qRGr{~ z|IEie72mQTT+39;($maC&t@LBONshay$4x&z0PN|9Zl;Ptaa9Wc>|ty&g7p4aYtm~ z(6RL}v?aWYAmprWj0E{8kXHeBNBHd{9E|l|><3zpRx;)(A4@bQKEb00M3)K8*#G!< zHxkNz$#4XE-bCNEnB+Etiu9<4s&BupC8+)%RpzD!Q35cD)302n)$rJ*Ve@&v~+wM>z<|=@b+{P;|i52m^F}aHR zyX%z7d%Yg@J|~~T*C-lC{Eo?QZkhh>K|D0r(BLkKwqMsd+V+PIHDuYVVjqD$19n z0>EB`U`R3NB-l1Gt_$cKB`cIn^gr6HFdl|UlVAskinE~NeF?TW?C}awLG!S}gzkk= z+QZlX1Q@0AqJMROhm89z=88Cz%^gO49VQ>9Bk%kn$oJ6sR4AGbEad_!Ll6=XW>1B= zis0dNM4SMz2}H^}*tS!j%1QN12Fyzj=1xU!kU$begNjRKts;EPDR99J93`Ls=QE;b zIB;%>k5N*1yL9BMpZ%Hpsf|jHFiiK1A$`U=t<>6{asUtlO^6d%g=0H^K# z%fZ|18$SIf)Q3y8%pkyWq;S()#$lJmD-!I8=rYWQa8K*y-pA>W2F{fHtD7e(h?HzEFB6)NDt-NG^w`(|(t4*J1Qi&4 z4d98d?}tl}Zzk?Op1x}Xs0&nUrPyoo-5CS5ISkafqWFofFesf=al1_}B5X*TdETtp z_W5#kn_ak$%0RW!ZAVUBJxw#nq(YyS$UkMkV+$bjJu~k04d}6XF=F#N z=*_fv3lIvTIh4U>DK?v4zClLd#&r%5M~F&YzVofJ!k6=8!W?yGTUw|2n~)R2_j4Nq zlqMr@ybdvqI#$&D=qv-hB7y9GGYz8wNCBV-zC$*D#!EkAJ0)!qFT}b420${%=+hKz z3xK9xR9t_gagc!%u2NRC2|B4?{`lm1op|AAhQc#3KKY8Lb&2}XM_|#=r;Ilk`EsdN zjB(V1=~5v$>1PEIfE}7%xB_6PfS?3``6!!$5IOZ?Acg2N5G5d5&XI6LXaeqQ`lrdU zH%jk^dX86pEnna#7oA@q6J9I6d`?jq0Axr18K!23>l-Hc=2U~t<4U*xeBy}So|3Qb zA2uf3?zGdgMAx%b~@)Xvei!=X=YiduTy$7I(WD zcae&_E5h9!!apW@bm!o!L5Q6|@jZwu5Tom9gIeW^qtY_K@X3VRzLmifm1cWRw8qq3 zj~4iZXkF)wfQ6O6*G>nP>aEURsx*A*eccG{p(cg!cTiGrl~BsZL`A~--n?T z_0xog@K5WTVouih%1Z8YExZnJ=4b9}tUdGiz`~DT4qE>ly`KN1zufR({*=?Mu`A(4 zzy2oTO!aC~{Ee2TF?D{9?s*4ye7YB4pmn%oAoz1bMD3k}KO8SsG{!VMJNWWO_J0ny zc4w_-zb*RjTHfQ*j}_SwuLF~dWp|f?HIgkiZm-!+Pv=&W=@Plef-I%kqgL~4d+yr+cjRa2Sg{&sG9kVr*neT3*D#qTN~0^fl4b#_BTuG3B>+MaK- zD(3fUP2$!?%erQ)*Yk!E8aH!WdWD$z5xjLlS)BbXHIHeG~N{Uw?{GVd0S#t+_8l77KQ&kyiCtpb4sQ?JVs{YNa z-lSvpfKK4^q5FH2q5B&zOqd)IE(aZ`Z5!>Zg7h8Dqn+SsE+)n$tNLRf`sq1OAxao& z`*cHId&`at!8GnLkmuPa0yj59CWSu62UDEEOS3#Krsc zCw)p~5Vl524cN1gPm1_crnJPs9%{IcHA+#nOGye|q521@D}|IqbKN5j^jc-l5jHGM zX#_g-1!hhvC5l;LA7=Z-rdtD@vit*A(te%e#_lZm$ zW}no zDKgee+Q`wqPDaFCmf$SG6fkMB+=EKhYMAIZhcA}9UJkmF`b{N^DQUP1wN?n&@VdgUDb6en97@1pHVhxW2oJEp_J+Q#Ns2h&-f>q zXPX&|Pt9Q)1x8|D|41>dkBhy~lwMM_%vl%WI6%Utqh&4}-_tr6p7u7w;$7nP#s{cf z*zrXr{7!$RLxQBwf$2xNJK_E(dwK&i(#a)~Z4{05Gofi=Jm;z|>=wSCNk+np!6VuC z7H6)yo|#mH+-le9@hyc&M|-(*a2<|HpFe(>XUr?9OAoDj-h4vi6`C_ zNe}T~q3YF583`+Mg{hi|1OFC++y|P=Lsb)X-qKOq_qV@&%JUP?%<^0oZ!4s?wd*V& zMw-eZS<3wqBx#lroH)cJNErCaA;h5qrLb%nlL&Jl!VF&05UQJfRP#pAbX}iUw#5*9 zBGJHD-v=i){bg|XO|Vza&xZZFkw*r6{H=v^sU`Br+U~pTply5fzAPoG*3Md)`Jm5r ze=@qOQ(%8AIYYZl+NJ)Oa&yP}j;JACqHgu;{=?sO6nE^td2ghdqv*_HDf2UtY84Pv z>wcKMgouzFd!t}SgW!`G@Pte9Fz>K!E{?5QAo{9#2SD11YLtrQ0%=ywZ`0{lU(fn* zvs||Eiuaok!sq;61x=zAkC>_J_hhZgu#0RE31%LPAwf?>h4H)V2A@3ne&hb6f?4*o z)^e|>BXyWt#=nj<2&SXlDJ;!FnFto~k%4d}!gPg`Dpx@4HV2aunrE$I;Ww$~5RvC0 z@xiZk?Iq7{pS-nlaYzUAVx9D4OzF=_5l4vqq8_S$Ms{DbZPil9?{va}r8)%{Nq_sk z;rX4TckU(e1{_GW@3&8|R3b>B7};Fr(|d+<)Gjfip>t82T!W>hILg8OAQGa^vZWS8 zDom5f0+!{1T=WPv=0ja*+!SKxd1~Ej%g$OfhdIJ8-UW^Sn?Lg}-}M#x!z+FO5$?ON zstnD2m2MwHYbX(S=Ec_5x?(~X6tWLws3B(XC3}&d-SA=3Y}r zgvmd2h>#n0lKVX>sICDh6EPIU3~U<%PnQ$T?g}XYs#y*-GqzU&*oF>OF$1YNP}>8s z7Q!femZgwo!C)EFSjO_wBs5#@p$(yPB8lAQOl~X#u^g%5Qrk)i^D4<<`!!jWNmi9K zvsqC-al5dQZMWtM&xgXB*z;yw2kZd~Y9AFD-ORBcXGZrh_4v$Hd``6FK^dov1Lhy# z5K>Zted+8HA}pH9bB?TxpmRwaE{z0t&AB2g6^2{@LbpA8h-?EC_~A9Wp;&5Y&F;Q) z)&uxih6;_Tp2M`w)%u^!mLWGaLbMtn+6@rh6qeb7y*-`n=F0J1Xlsd9eDRro^A+DE zXHDIBTb`61IL`O&7sOJyVH0T3C;ynZb{|+6OoABm(LirO^<6c0~PwIwN(JZm4T%7 z;S?ef#7Oy(7#MuU?WqZK0K*DTrn$9;T)hKmzb;%RWywR z!-uy=M=A#};I0g{008a^gon$E*`StGn3Jobb_(O)=>1)iCnZ$>j?k#D*tKPvh|cKX z&UG+-8zoOCk(~W zhmPwaHlo+~>mUMY9CtL^gFiqb9WA2+4LNLL`RP2X~Ex6Ni-o zhG8=Le|h84_#6mo5u(jtuC|P=Be!)FK_~e)yvAY5U(k_~M=`P7JJ0xAQ=X2xV(MsB zi-W;-Uq=LE5c>vBcxGX|>nQLV!HZQ%9pgvvTcR|%K@`V8A|isw4GTQ$bCUp=Y-=hnvB?>QY;Etl9{i}Q$u2WvJ4 z^}|-9HwWjy?LfAF3f!5&BD%&Jx}qfOaua3EjF^}PTSZ8vrGWi%r7*&4Oo+c+!rgP z`lHO6S+zr$c}FanOf}So8qT{{7icOe$8@Dh~`UICF@`4qY^ZW$}{H!CCxR; zLZ&W>`Cy9DP;_|?;p%C2)`{x(o*EBN zft5-VazQSN!ZAFS@3XGdNKNq>rKAyZlQZgtl;!V2BX#+}zye_XhB^6l#GV|#ZF!1t z#H18Gkw=F!4{Hb9vkIb^g+;kM!H$GmHrz&U?#YM z6WQnTYpFQu8~^+6(?P)7gGftH*_mW_{jDD7ZHSU&i{?ZRnb1NCeOU`7QDBA)mIYa! z3xa|)2uR#s3IGxQ??c*gy2^#6!Q1y(VLdew$<1PugZUNX^vQqU&OB5*w3t`T^EErG99XdWOkCsD=`Le(N_{$wq z{yR_#e@h|I8JGnWW#MIQFn_mm?9~E}_HLRmrEq5~&pbsM zt`@1343q>juo8wQc`Q$=f_N~e`yU@W$+wkb?jQQJ=WraQDjaN|F0c0?kE z7!@OYQX9)|KkHK;bd}tm7dRiewR? z%A0^@_Lg>!k{q7#NWpWu!q2x{HNig>^x z3)nj5S#`8mbb>!c6Yl(hZ$xKVO8CA2CtwMtzQie$S#jNa*J#bFshhx~XOT*ALWDEs z4-2z)f=_jY>or)sfirD4v+}6W$H}a4gMHyE`D@Mp6g~au+s0Y50KaR=GHYOwV_)Zy z;L#t@9)iLE5N)`@WwOW~mIx*Pgw(t=dK7x9HlJh4|_-E|`d|Lx@EI2bDzu-v! z-~HscvT5{pN7#csg_h!Mi#C?k5Y%G!cX!(2FR!#xBJ}-+ttI>6Z?8a|C?jnZ@X8gm zs}SZvg!@Pr)ia|?7+hHsYClQg@GR>0_z-GzPhp^Rs~!K4-4N8I^ux%5E9br+y5+b0 z+_t}BWifAjV8$cs=ohq2|0cKsFD?ZeLE{{}vZKSQ&{GP_TcV6VxYb{}du9dYDIbt) zekq~A{e;U;(VVUOv4>6}5-65jnlU$}F#7j~y=tk`e&-DNn#%~;n@VBW`g9dn}2yA5iHYvx^nYOO?~6@RU3p6 zTa-1+>+6e>H4YB8366Gef$saOr@luATld?7i#s(N{LlvlgD}gNpBt`ew}SKSg=E`j&2R zj)E#T-wb2-EPDlX2Eibw-)pHQHGiI>U$u+t%Dh(jzo2|kP<`vI-Bz{!$io-un@t~} zQ=WRnbk@yyeB)1tt*Ts_FEGKfMu>5SH+~FTq%NyG^1eXw#}{`7C{Izu%dk^)GsVoK zg=tI1eIe0~K0AVKz%G@wAquMFl%UgOaGS59$;Z+aqWajm+j?hPr-up(NuglkT?BMBUz&GYo4%2=p zc>bQ)SJnhP`t<$YoTxIwFevsUd@V-g0AYM3EvQXYE~14klf3(SYgCCiD|XJBgW;GxK5MrQ6j zHuI{%od(M?ub4+{g4f@sHy!sNI(S993q9|xPQiNZ=VDiy9vAlB)O6Tkw?g}J)AugZ zMAwj=gGZ;Y=%O?-Mt5+JYi2KxZdM)BiZEAlJR~1z`hL_MiFC!)pP?M@pg%(v>cw4u z`nC6hV+LK<<)Pij9&P&brd?aSHa_TR93Ie}WgzXu@2$4_3_3zv!oSNBaMMcc9B51L zoI2D+@lyzqqdBa_au9f#B<;mcLLb5Z)H-Q?Mwk9WmB=R9HTWc~aA#GUsxkaN=L1P* z3}b^f~oFn3W%Ihp0#g!kt{F{gan%o{Y2hUfr6!uvrNfq`mo`e);Zpe)j@ z*6?94)}of;$mn^9;Y7n*4H_w@gJ-XY$rq=8>w25#(2I-DBY;Fwpdpd`ii`Y1a8#! zJJ#g*rX?*OQ}HuUnZ3~S1Kxd>3+@m;%~00ZoN+bJ-)B?bfMRfTvuoyZoyW(24+yGt zZu(-tvpD1(xTZDg?D~;7*xx~e!bk!{X?G#?QIN-zM-Mwhcvm@T5h-0Mq7>42Tu=2Op%m~yj% zWpUi5H9xo&o}mKg&$GCUTGnk#4l00CEcaLo8(c?ht2XlsD@L2V$7^+fE z$-c1EzkB<)&UrNY{*2 zm;{;9Nkh64XP@srUC%32!w4!gtXpz-`o&Nkv7n}Xx7kItcfqS)etEX0dK>RDSle<_ z66ikEVwwpQXMKIvbnwup7r&LkqqWQVy=KCqlv7XE%V5dwwMv_w_iea&Lk(@_*uB2F z;3Hw1Q6($qUk(3D4LFdBCi`3)uT-e7T??W$Pp+xx!1mn7{;l)f-UjMnO-P=CZ{8+B zReF|5{BH&CylY3o7kU=_A9UT$IX8N!}%&syNGL4`_=r-L7QmvL*_mc-t>jCj_fs7;NPWe3fOm!G|;MRvrI<=wYT76*a#jBp;s4GwO9%u%-Pt>?W-W%)v82Sh(DZb5I znl2)b5PRWK*6~-jsht(|nETHatO?%c#2{tAmifvIJsf|=-Ou{$12;mN<2g^YdF{T7 z+Z^s$!qG(6x4t<&Y|$x3kd5>qCL{CWC;iWEhvhBfQUGo7ctmT8Y6^XL=#AyEkqg4` z)*ZiwpFFx5q5n@I1Nh!TILu&wxn7F$bhTQ`{(627>><22)g!&5Xq(z?=qvN?*6se3 zq<1wf_jS*d{OJAE;+AEnn!hzdc@K_*bR@P=pn9C2N7vN5u~&6GzW@zKBwM`xXlC-l zS7U~3<(f~$nDK`3shjWXejuaVr&-&%NOe1EY&*l*3PwLLB$$w83T< zr>>y{#gv=|wO;Lq7V+uWt%z63$D7ect};mZb4NHB{@w31ij`mW_p7BEf?XrTD4)pp z@6le5{>!1OdVk=cn43-hYPN3^1Y4f_RH+YfJ!sZq^3+E+n}MP;Qej=#o+11wQ9+q> zNCYPXnR~yyi~G|Y?|~pJ&nrTD*8Py+Z$F5WQzy5z?n%*9x!#5~~S3&Gi z(e_hvHspT#RY(vt(uKuHr7EwpP6YSU?KMnE-#+BLb_PrTkeqkGgQWyFb8zCh=9Ik` zl&M+KZQ)?XSpLI3d0+jgI%%K52}+m zJAzikh+${&d7v^)as=vwnApB=I9WL^MKvTLb8;?n)QR!j2Qt@XFyMny7`EQow!TG# zyX?Yj8@7(C053MJhz7fAD%Ks%$Tok(>|E0i~&AJ3r_$Xq1;~vUy2tce;QFcjh z0?kK{V~+v2OB9T1RDnGBtmC32wo^LPjFv~C4+H22kuGUO^nxMScho+C9D{}Iix%x^ zB7sbwaBR&sl2RItq<`1PX@}c2KlSs`I4j}0!=qZ7fDrtqVQ-teciIM(x zJS`kEF&jX$1=gly08N21=P?aZ#t@M?LQ{;)FYf18Y%(D{8joMy8!rV3OA>_@YVvFr zeprxng;n|eIxFONe2Er8P6PUU3{@X>Zl_gkdyYl)VlTB|Yw4Ivay1JPi|t0K45Q8x zcPNw_^dx|E+L6(lVPonD+aCn`m>4_1eTQn`R~o>Xo8WMd9F~uQm2VNqSVhNLb$(7( z^F%!7|BX2S)DQ$Zx&JByXZRP-OI0*IQ0!|)n5729UdWfzZ_t{Ev4wnCy;DIO`kOd@ zgMaAPvC0^@@-Ba6dW`kGy7lKpO0DAc94V%ih^doeawTXJlN~+jy8D3DU31nOh~O$i zWE|C1_xzr3F2|BC9vi+GX}LZ4=%}Wr0BXuitJt7?^cX1lLl~?BO(Y()&WZ3NA! zFn&b})(*b=#OdY#_HAv8tn8|T4y%U#sq=OR^(klG#Q`t?fY1On5T@k}wi0pSmK9V> zg;5IrBRL>0F#uYwcv*$85V&g*B)lhrwzYdb$0A${&SMVdI@kDsRqE%7c1<9*6{y~1 zin&BZtJGBAjYBgj85u-Vg-OTrQ5rGBE|Jaf!cujXC>s^X6-{j z27#G+NLqtQ;APbuh1Q@3Uch?~2>5;~jt}!g|UjQ?1(UX6-yF z=F9@fZZ0zjMKM8=={z#iC+u(%$*T6$*oelwC4x$U`;e~^A#lU>bz|>Ho(wM`>zH85 z_)`rOkbS<|(UvwaRh=~tI!S@_&&@Cp$SMK?3W4lL&Hft!EPDB`he*4rB;hgVy#SEI~CU>z|se>4RmZdAKSPKb9F9#MT$Dk zKpV!OQU5$2Ms9xUd@64E`YKvzqc-=di_oib-2Xmb z_m@m~FCvs5XoZ%?RexT$tN6U7ju?{5hcfY<&A3})Y%d*q6S#1hp01jKmC^QLZufND z8S6T;P&eaJm<_C+-5)Yqi&&MP6FMFg4Irru*Y(8vzdIT}wC)k^PVodyN}0j>h`YP+#9nSSU=c#N4Hm3gi=Y6+n`!M|2iv& z`gb(NSL>XB-07>l)V@NlbZBqi^QC>h*O|T(dpH-{M8nWjuo`!?@77Z*>(WAk+PI@t*Oa-0zGelE>qU z>h_OWkDm>$vsX}lLM_Ec;>1zZ3KF&kRC-|!-m$-~r>o7P--b^jBW@c-Y>KQCB39k% z-f;O;yeRAd62Y89#At5QQ;Smk3wy7!YV##9aXgAx9&G14Y~l!_&2$ORwKb^qk%Pkl z?()0WxNj5Cu(3XF;t_(`-dnSqz!|H>s<0EXdbBKE~7&H-8(l}_r5>Wn`1S?{rX?#nvo;n zBaU?uLbdjLi-gw=mBKyeQP$#-Q+?0yZ~r^ho^~pk$i!Z4POoX!Mvqmax#+#WK{~ZL zjcQ-oq`PU(Wi7RK%f*DpNAi*Bv+9ARDVh0y`17_vg82lWvW!%mj$2|e}b4c1Uh>>7kcK3<@_ zt^Rj*fja2sMTB;(uN5g7*4KEUbqD&anIhEteBFpkx(BH?8$m><0I_pO*RD=5_Jd?Q zwS${^AH2wQ+W-9Kc%CFZ)<{(6`$bgtqhXH)dN2GU+9@-Y^)HkfMEfx} zP^ixZU54mVGK$4OsbycuB8~}~;I`~nG2w{*q8t3F7{m1@j+EelF4)&Zm7O*{$2e}v z0h228*3@57_T zaOPY?hQ4yCU--!ZnDb8=ETjvzCOzsX(``PnC|5>MrfX$H4`aJf*uKMBUF%^!P*Bo5 z`}uYIm;a#R&JPhkKc^wz_l}fbI**%tbG9^~KH_cFmd9h8-=&^9l=|}BU;;&KNf2{_}>%NblbqY}2k2!<>&7XUMwTz_Fy0A@?Uks-S)~Ci9YUBsIC-HpaBYxI&o3}m;-zvFdUXuXm0z~>xhERw@3Nk4eUIg z%C-#dk2LlwSaF}KybxI*c*HpT*iwGQTd!kQajkKq^lIQqZ>d`9#_$=dtWf9 z>#2QtX>?!9lYXn%sw9YC@}M^7r=eZOUo!lGC@WeeYgfDI z`>vo!M>f3NIGlzo*Cs8gME*2*>dSVN8U9>b(N7gQo(cVBJ4Pq6ac505)U(fsJxcFpEMONr@d_s5e#qavz z)w$>pqdOOdyggRl4=Uw4u6<)2QMI`s1A$*}My(>%bieytb$KguNbrNek1OBp^n>)T ztoNR}#>~l{M^_}Wzq_t>$~O8KpFvK3H1a0>y>C}SJ@KwKIwCcoesj)TvPyjCBDK!h z`TnHAf#}2(*H?+=m67H0gUjv#{qnc$uBecf_nJ5P8y z>~@~iHB?|;sceBaKgl=3T3i=}7Ub1aY_D28SuDJ~;II9;)8O~N9gi2kg-)Jb`Bp0% z?JHWC+GTQY)f7g644As#yw=}$re&S%VZC}{_Cr&Rt+^IRtwfWVa~dVBliN?_bq)vD zjOnsw4Gz{m^ev8|4+oscn`&8Cm&{6CU(e%@rUxC5KNxbpc!A0XE`FcaVQ#gU%X`4*C%ITYM2VlCt=l#JLH4E`PO{+#djwgb&8mlobwRsLl} zT#pDc%AjK6w0;__l_m66ZQ$9RKNi1x(o`!+;MR8{zV&b6=!93Y&DjI7$-YItz6VUz zV_z;`P>pdlvpBcW=kc$gcf@WE;WRe=-PzS>CAfg{PEZ%?BD|7*L(p_9Ad^$*1(~W8A3R;B8r}+zh#7ECitz<0UJ+RaDg; zP-XpFpqsR5Pw$O=$6hi8mEB-VT8A6_fS;npirw^f*H6vUCFR#$ZLycC1V){gu1K=Q zvO7b3w9%PPKC)z7cbkb}Gjhm8DbW4TS#`rhRW|V+p3~g4 z+pbS@$6}ya^`5r&eO=kMCbQMPOOq-LK~E;of{b0#)hk?f<)Ij)R#D4 z<+J_ANxpMs!AVAuLTYb7##~wZo@uS^Ujl6V+q@j({r9T3qjh3x2?wvUkSa7WOjiys z# zJkZ^W)t(#F2L<`HLTQLLgpEC&b;f%4Ic&u2Kn^SM&iPc%`MaaRaf^v(FU5s>6CKV6 zcBns72$mS-%-#>U{vhleuUq+8aP^;&4VYaU?bJHRNIUKI7xRQIhm$yGopsME?4?Y* zcvOsg<6EF83awP?DTaGe+1mX8LZ6rfQ~W4nAYDaJ1%WwSR}!N$D8_7=h1wxG#)WSz zEAYel?(e&lavP?NI7Il`LS=OFWCE_n8f$SpLy4T!Wf@L>suo}1cmipTc746!WM`Jr zzxs3D>)C5q{TT+8VpG@Lk1vDm8UEf|ejAn3j7X$84CeF{wIU?ICaMOT_|8{D$4IDQ zJL0vM&elo#)#v^5Jvr{O$>p@>E|{j6ff-zP2Ezd0%0vI<+#G|b%zlQ$Up>ccrZp3W zc4;Ad1m$X|ihmOR6{!zlSHq39V=vgBen^q4s5@fo!wl7$D$X4>3ddf~x*U9-!m%he zIj~1LByTrHBP-y$RmWr8R$5cJY;tE(md0PU>Cu6Lys&QNvcEy5J8Q5T>W$R;+S0PD z)cO*2r)h6U)6S0F7p2G@`h7Gg5^uSd>B$hV^_q@!dB%#7RfAgtubs~IqfvjEv25-3 zt{J>7*@w0QJzx0gmL})hyfd_LbHGHOQsdPme>8{$>`uz&xOsS6ThF^_@~%&3uYcKr z5TvQycC?@FAV$U=H|3P7-JkecQm@=ZY%Q;jeEoBMqZZmB(Ya%?WN(t+x)tIB?@tNF z;X~qk(78)Ke;2o|T5%Em*!`V`3k~*#E|9WcMt;zJ1s=ZM;|g}6F0C@+(|RHGE9jX3 zFPjR|QX)4&x60C{yFf$7E!0%u8xcKaA%Y_;D z>^)wn()}EEC+R-$tuR>B+?>9RMaT@kukBP@+OkR+*;St~q0z-sua&}WNP1XGoo}s^ z^4TjxKMhQ;Y?SsVDI0W(-gG6r^v=Cl{^7>J+r!EQ39Gs>Az@Q0=jma88e?%`NlKUc zW&_SW|KoM1q(|qvEYM~5b*?Jf`OIU*rsli&?MQ#gJ#~TkfED?#?N%ZzzyFc%2&OVG z_GgP#B>J(jrpf`4%unxm8`6n(P6^zZbp2f)>uV?DoON$>*w#fqSH_PZY$>wk_#J*$%|ljS|%E|o*9Z&Kx7 zL##r%QV<8#4nC=T`_{zg(-$9F%>G5`Gl~xVBSffR@R`Ry*maf*6=#gw@`!MKhqhGh zf^}l9Rkufz@&(f(r#)!YzJVJ>G~ts+xHTjePSTpJbMK*wvqR#|qwG6w6&D^Rdi%Bl zI62+w%2`X1abtz|9zWt!AEKX5qYlNYsoIfuPxB9m^0UN9ND{9+=dNl8RAF8og0Z=H zyCY8oxpdpz812z4V%l}#!d_9FnK*hv(Q-e5GI25iTl$e)U{(Q-01zJ@X_Pl0!s)Ii z`|RV#dEXX!4kK-Ony8Eh`?ThAKLLb21*q@=G@68TbvDtxcht%R$7kvYA&Q!Azi$JE z69Kq}3pUNL6BeAcRBMAK@5My^CVKG!Y59{EZo3`)4pQ^8+IY_n9j&v+Sc~pjV@?)P z*xCOI(Ygi30*IbFOG8cxQ~XP4+Wwm%YW-y`qqq-qClB1=O9pU3Rh+gpZM%I{17sh$ zKizntle~xt9jC?oBAjgou@^GQQVj-BM95GI+qs{){Su%kFkczyub5^ir@-P}k(*N3 znnF2Z+skML@QgdCHimXE+g(mm%(5v9oLFId9v$XOtAAWn&ll&rRcogD`|WN+Zm03a zs!#7KFttcw`Q7F_QrJ571?b&n%A*85Y?1P{b7!$0|6(7&Yj6}i#ApiFj2M|u3GMVk5FuqVpf;AYLh zhCya1h~YKC^%el%Zh+9nwCBSU(TZtQuJ;f`S;#ngozc|@{I2XDcC2w>oG!s4HWRNF zEU=>ZTqiM%wt#(j(t4mfKjm4t{86o|M{Z{{G+aMT{d6La3M&^46wMaqk)gzK_xJCP zY0w@2k@cr=Ms5!Y=b1Q@W$clC$M3kxIF#7hA9v8V_N}R;J>5t~Y#lzae0Md5!&N?dQ|1mm}E%%jD$G-31hwy|KT>jp^+Oyt2Q1*G`S=1 z4Dx3!UIc$$Mm?e?PtgZ7F$_>}t5e~~jFt9e3x2qYsOUx@G#YXfZ z0oC!Y*ROWAAydhbl>ls`(d8lr>+)=*8RHg_rec6*86Y%#o6b$u*t}V^SeflSxP(1A zhL(j=8_z6o%nEzT$GMxt2;=*fpB#`|8>-@Gk!f_EUH9v~z)QLmnIrXlS)adt0i{f; z*K6Qx8$xCPemXT_`G1k=L#l6=^E1)5i6Xcj*iG7fkCX|lw)qb$0`Po@sbGWcuB#X! zpiHsWWk4(_FvnoFqoBe`7ZY(h5WsIG%HZ4|2pXKe1eUnB< zWxdRoyHIIuT6jKyOJRox2WJnJ+@a-{OR5$#^YhwX>Mo(^lB&&`94)>Kke4Fv8w*~& zItC{Ju)sCj`Ab`N1DF&BQpC{aZ*}IsbtiI@X~?^Whl{|?UA;W{MelOW-$#v2)DYfXr zY2qm$$8tUX+`#d}clZXk(HjKCp($HTs$bJX4R+-4l8DBg)5vxI$JDw1wc!5$f9LbD z^SQ0#I$CUw zr|<2yKVY}ruIst$dS1`R{qFVl_+WN=Ln~s1HTMU8R1JO(QAoNK^Jn5_@=A6xB0HT0 zPi1AN5IWh?tR3xsltK<#$}wq{{Q3@P4c~KS*`_pKLIb^ol>xLHz; zEx_Vdp>(H^_wf-~f&X%Ko*>c=KFU+e({IpVndPZY;&rK2A0`mHOuIsSHhdUGlo63$ zVSJ;HkWFbV#c6^Y&!J%vrC}`S4%+nISlCXfU_U2o`^zkLdv?(yc*;EQ#2`z1B|BOz z`{-h}?A=53#<&lS7jEV)!p=F&g#U%h;~23G0yjea5IP>;Ix}=V3NGDwCS@c%EFJ;a zfhglZ+BwE*v)1%X7YfvF)B1S!{`f(3*T(l(?`OrW=$<6)YgI$$ug}ws@xD1}ac!Pl ztW6Nv=U_Q#0|n%L0DmOD{9J^G&pgCie(Y1p`Sb!B&VqI@VBssZ*rkhiKg=H;%#J+> zPg{XmN;xMM0YG>Cv_<&2fDgr->>c{>vipeC!LB6n;*R@5x$&^#Fl=`##Eb&O3j@q7 zw_+mP4j%G@R|85X5>bFJwBaU*7+@4Sb-)9>zdycSDeL{t*{cZpp^LlY17I6=%5D^w zk+n?s>0UW|)GY5U@hh|C{V_$PgURy~1V*Rp*A4VKRWYS)w;oiPY3J-9Afws^ z;cD^%AqYpX3}&G_*jann*Y?xl86vsfEBio%Ak?{K<78G+Yc@hPu>cXZOP1|*KsgDp zl){GX2f*31EWb&xoMBy>&wT0nY_U=j4%vZ;_&87x0Q`-@$g>X-nbs>HI|APu0gEKS z_8`8!&-!w;6=t{mv1j8{9(%7o=XQNLo)VF#kZB=p+Iy%AP5wsi1Te&*Us0!Z?uPP} z7jnk`!C4u-C~Ks{Gemebra-9K*<`tcrFP#3ZaqhYoO`>TwHYUq0DD$pMu-Pe`to;OdQW|V8AbWcm-=>UyrO$=*GCTkQVZl@r^$zN)zr40E@hhab2VsORN~d}&Z`&qTTx|E$ZCL! z8m|bRX)no?N5^*Tg}ra_(%kkNz=Q`DKm$pY=4#%uv>p3S0yb>lIM#Yjqdg#cT^ssJ zQgp<|*no(2{v!UL`_aW}Syre1oTzp!ro+lVeRqSOO8m?-|I4wZjhx(+ai_)%KQTg#$k)GS6aNOrQD6oh+C z-U(w_%<3hO-k=EOxH=v{Ak=sYl#)vfkii=Qs$AE5Y!Q_)!=MGqBTqIwbKm_~HuT`k z0p0)VeSf`e8i1m5)QV*>f8XPD)*anWF5E0b_(wAiOna^k<~ii6Q6rk7$?3865ydBhWJ`d*b$WRx$hH4P}h`muj7gFXPu%vEKTd?OvGIaX;W9Q|HgAeUT{S?ocH8m^b zGFf4z1P{20k_Y>q`c?^YKtM1kTZ>qf=-Dav4!KoiBqNQhGe9WT)!teOb^1r?1M2}w zsh{0fX=ZTxhPU5~R1!+7GmSbcZs{I}9)kKiZS~xaTQ{9%YeJhY9mm=snB)1@mBT;s zZF*cb`-P`ozJ|8^ud^0y+5j=~HE+oXLgnnIa=Re7)t<7LllGE*p!`6Q+@Td9KXZE3 z%awXv<~_=plYbz=FwkT!&O@SO($79!Dgpd80#9rf)`oj2yP4$cUvyaw+ zv%V+MJ_z-3v{z|={C2z=yf6~bGxse|Fx=Yx(W*(R@X5S&Fz6HITIsbh+vB zF`=qopY!s!kdrV)>re%oarIx?zqbvXO;#j*o?)LXyztVl$Hb0m1%Bvu*G0e6rtwCH zt$9NRXalvr9VB}|sVxmMG7)q#zzEjnMGg!{_X6(O?0Cg|x4kdD3&m<)62^{*RBla1 z@80~-{t4@PH09cjYrctk*2_iiA#9=}jq4QlO_SAMFJiKzh`&o9;Bh;}-Xk-*rIbNS zJ3b?fFssrL+vk>0llQ=6PVFlV)vI$0pW)Gi-O1+R^osKmrrztm2|%p#O+BTx{q3O- zw90jRwiYJx!SpXIIPDg<_a;qW%f!9kwu4;Y{IADyI89)h!gUGeFxADPomAIp7g$Lx zcMrfFWm64=H3)&q!r}=7sw--OwT)F*jE!$~)xG0S9zl%V8f(L)toCR*CA@H@J-EpjG9}tg_h==vCHZoS$8eD6loxL#(1X1yAC3-` zZ0}7X$C}To-${d6E?h%zq0Fi_hy|u}AUc%hPpzi(xuM8;{`q=@JOr4yNyMr9JPxv{ zrH|`SZ))_7#>?Tx(5r^A_p zYPJhm3pd3!l|Bk_f3gi;%#CGt&g@!SB$>sW&Iyxu7~h)Axk$dZW=P#-I%@%$D*LN5 z{T64kP~?kS^bYw6*gc0HntRivjKaN#^*7I?v7DbKpT0TY9V}T9gmXZfLMULB{-XjD zo;5nST~Fma!IRM&DolT>NQeh;;YPMMBXg{_Z3fT(o>!~W=#rm5*}eL{(})VXoq;%1 zle(!cC$_mqYgs(7P9wUI#*xC!V!Kf3Qqde>8j6IXedYp0o{(-oK6OfukXl(DRZD7Y zk7K;6&D&u&d+H7)i{JYl?}oHDVMU@`$A}2~h8l>Os!Mk(cnLQJ}) z0#z2aaPv71Z~-BKtrKUwzk3!!6?rKQMrlBo=Hr@)Mp5}2RKz4$0;(j7b759%InCRy zQEs;KtAn}8x;Ea2$^mW zq~@oUY@sf%FqNaGw+RI`vH43lSY4+xE^F;~o{?K3C3OU=*e-MmCi5h&3+gi8h47+} zoe=R4K!ITl$Wo5~Ce4j;A3cm^qdDbOGvsE`Nz+~GoneCux-;$BfdHtrFsW1&pO%U9 zCFE?3?$Hdm8A*F>{rcEikLD{$%bZ6$HN4jrs2!EyHO3WZ335f1^_bn5M#g>AuJ&>87CI)Bcrkb!t#*wdkOYSl_O*xV zd|RX_ZUV?DBvL5zM18z>D^GRR>c9^@AKe)rVW3_4$LIGC- z`y#X{8J3m>wfG~!b%gy5vM*Q}Cue8F?JU3=%%<U3IrxVA{q8hMQN|qzKJK-R4S=E3BO+l!-KKU5jhEdQ|5eyQ zfOx=5wA|?i=;~N4!!C;n%UR>Za;C6*!UVtZ#?Ya`-e2}p?i1an4BV-uQfn5%&TgdR z$}UTyg0`5eTt-)q=r$s`)1uGRm1f@mJb=Xxe$42h@xh>DPvT0qG%6LHuVHSy!`yhU z+gRFd#_2Y1@20eac=iMnJJ7(9FrBn9Z3IX^p-LwfsEpwvNDn_~pZ?wOdbBwriYx|( z0dQKNo%TI;5~-UX_~wmgYs$S9tKdcG8@G{6gBx_h4LVwlte|lYkXBm0FiUMt(wP8+jE8VnPr3;&jd8Ep1D48Mq3H;Y@VxzVCppki9#_F z7i^M#_T#pP69(cKk{BWqyJ>a1i%_n<4|GTCnDapldRGUAJpO~zW~hnBaPiS%ujP%` zhe8-sjg52ih!fAGnnyXdt9jyyTLdpFT4JG;|2DMTvcBhhz38C2r?+5EtDy_i>1|;E zcAVJdIJs@B3emB7H#cLeQ^uLiH3lB5-Bg2!CSkYJkLM&A&y0mP=$C)Y$ zBbjjveXv%*Bis;o+z{he0QeO#q8)&73A+9Rt0e20IL1`|V(6Cxx|I{eAk1V%1Z-?W zrG{?H!t@}WMuKO0TsY6jlMIz!I_5X%m2x0&6-@kHgRQ*axbW&iLgw~dK51vMskqzZ zhO)Vkr#JJ&Z7TOHRl_7fOP|7nJAm}3x+3=LXmA)hG^Uv@$NLo;gOWLHCR=47m*y=Y^v2S{-%>AFT zqGK3}BPsu{;C-C5Te-a3ybNSM!n`s9GD*=jINZHF_9|sc!Gzp2 zF}R@A>mc0ANXh(fTki1cOWD@nZ_?N zK&^yYcotX3g{ep7=}djlXl~NU;GU}JhX6jhhfSXEh!EHVyfr=o+42I-Wi?*VZU$hf z;fmilXaK|Jn;15-fzbfCqyWQcvf#uK+k88YOZ^5 zBRsG#6Pq=sLQ%dtgXBP(N?YpwJ7&nuxZt>a{xpch3S~0dd0|Kkmsfer=m%##Rzc~C$IK=f2RrI$$+zO#|& z**5pbOJ!9oh_>P%PMh|0S0g9hl#g)X>#k<%&t2G`WqLLR6cz+Bx$@rR2*{FBYud&% zl~d?LJzm^ zWw?~y6hQPnb}*>C0Vj)R222fcm%j9p&QupCYl?Hr?3)Agi4m8uoWSa(tF8jC0DA1A zzuHmU?K|D=2|Zscdz=%{kN<(OfG*-P9S`VYX)hoeI8{+&Zjk-^eX5{Y@ihfZXdK*h zfk!?(K<@bHHZ_uE{yvE6>Dsy=Pg;@&8S@~5EE{%-`gkd3tvE)z4{3{`t@Df6LI=sSH8D=;`A?m!_BMCUtV^FAgNpxEs$P5 zh+4`spUl@B1eKI!uIzt64%a(i&PU%c`d%RJQ0j#>DE-)?tIz-F|Ix}Mg=x5&dFE+w zsuWcH8I(HF{cs}aV9so@46G;RYV!AMdhj4}BtCnuV>`GKyU(g(q}3H{Q{9K#N(7|7 zI?3(zO=%p}yTa_`qV|!VcI(NCn9mZjfsUuutd3bdu@+6|o6eN*jDx#n1_3-1?0YvC%Wo?o z77ZY~)uEtzZP$h#H#Hs^z*MC?ng7F7atbU}DIUfUXGX&vSKCOMtTMK-+~jO-VB=w) z%pmZkRau)%`6@0R`odo9?N1tEHX6bFWj)Rv8drnerP9FFjAkgO&>1OQn=zPZLYS(?g&DEM_?4Yr}1J@a+ zkwGLa9*+7!H=1Xa@pfoRGBmNv7Ag2J_NKL?Zb7Bj#OV-2R8k@2|4T2CmM~Fn5Cb<4 zS2Mm2y_eYnWUbmh2|^<30hem$C`}Ai$_-6~45TwiXOsb`=3x89iqF3z7$Tq#l#5yw zxBV6)DKF7s9-VU!kY8i+RYHyPna1*=`-U68?sZ$G!JAy{J=CZ)=7>nVWC#Ii&x>)T zK*MOBg{0hB=02PP{#SEYcYGUnWEsfmBPyEi$g*1T&29 z9j2B!>>;F$JaZU1BYk*yql{L~oVvBe&4ZLe^GNuSr0SvO(z`X&BPp{_X`(=1z*)`R znDPvK^%E##e}un8^73{JMYcS`|b2r-`?Q zZbP5Xo4Mf4{Xk{+nctd0rXI`yoTsaSCyU>07{+rrc-=^fByadoaqqA$z8KcC_3@)G z?(A@tN63)9KdN?{M~xq3to{ti^T>7Mhg!iE%^g`R;6XFUvV}Kbfnz%Xmj5&^Q<;z7 zS^_-iCX^m~$!GU8ru8kl*BdqTG97Jx1ZK{Jb^Kc0U)x}F3wpR4dW4yU+J5@{`>bZ( zTnNahn&)U^EOVpCspZ{r3P*T2?O%nX(NTHi9Ljy`#*hITnGwgA6|Ft zz25%+8n);=M5%gcEA{kxmx%1U(ZhU}(o@E-(nC;|z z2V^GSl612d*t<+V&w#`ur!eI8RXvnvNykHT!C)3aQE?0PXI=_F3%yDwD0LCkfY?_0KEXc^+6%pE_DN;PEhmRtfgnTD{w&aT;0O?SL$tIHtd0s0Dv1nTD`kVXPKo52MFLSZ#bbT zd}rV6e!>MJXTf16=vXNo+Y3O|(=j7-OfSdya*oS+|O$Da^(w;_!7|6WhtG zS0|LuR2czkX8`CP)HeN~i+di)7@1j^u-l0IWy}3x*1M9lR`C;; zPh6DUnW30Ycx_tSzh<_4K;l-GyRt01eQ8$9Hf>>Lfnu{5@G{7ei|>ZUnanJrtt@(+DO$<-AOaF-VgQ&VC1u;l0L2P^ zghWH-UBQ8UXM%&C_o;@&`&>{dw0s*lzR~G(@Me429Y8%=i$&+cWOt%9;zq3Dm8p6| z3a;iKJ}C$+*T_9s$HDn0`MVxVi;8T2(lU#7|CX)v6alsoy{nG>oc4YZ_kC`l+<$C3 z_N+QCR{RnbAg;-CKzZ7o3dy)EP~LSoDY$pL))m31-})=hULXDZuy*Ttb9OZlBirU# zzU2b(puV|d?&IMCQO;=x(GyXEsb^!aE25X@im zd020n^fuP1aBluZ{`$GrP=kYWL*CIP$3E(DPb;@dVP?&o!h9N~yjRJ0pGnf0dt35H zRn#J<&h4y6T21Y=T#5K|(tobHFvnDisMF`mVnkel5_Rv2zU^!2YQEFLd|grDS>W@9 z;tenp-=x6?DGz0|2*`eaxPymw#@ie2O;b+{-W#HUeI2fW9k{(T^XbrT{6&j9(IShq z`f2H~^}v*V1sgSsvF!ys&5t;j37Zo=mKi@5jge#U>Mo075SkgvM48u?S)wckMVUn% zI~0=+_-<*-Q@~<(-fe&`iO$fWhYb++A|3D0h|&|QK;mhHCj~XCrM+GRvlEiA@lvrU z42a$)0jahxwkk2NYW^afAN*Nd7I^~*-&@R8s0F|*_>tLK$R4dfRN>R=8D;UymzD`h zy>fJU_|Y8^pmFw9lHaJlo&0}4ZVDij-xrjwwf8Q$T!RKAL5QReB&_MLDvd!p&w9E_ zT}$P@YB%)|DK6{#Ai>c*7Km}3W2rbZ5l_oN$^}7Z)-aR3`Z`Ja&69l=GHV5vYjKG# z(AS&y4X>9lm%BD^pn?YqH-yb73fujoT$hS*Sp*nWUT00c?L~Y>vTm2B^B16dY|W9{UPqduwcb=nnUj@P1QGz zg_Y?0(YlQ{*upJTKtzEU92YbsCanVadl#xPI;;oV)90|M^Lur_u(LNi3~jlZzNM*m z2@^9CrLxBHlu;eVkY3a%eUl;bPr0G>@k$DR5w(+-oljffd>bE&9$IqH?(Re}~aC)>9e2^Wj z(n1mJ2#})z?V@UPBRohYv&8?zdMZX87cGxlj}^=GuV@3`yJcDDpL)H|Xqum?9eZ~4 z9M6N0y8_qKNl_Ua?yZ_0*BuBbx#yO?P+39&55h*_OO) z`L(mN0Leb0G4(2ekIaVVMxy^h43#4F|9|x%0ssR1037*$>ccgp7OU0&yw|aILfBxd zJTgGg_pMlI#d~t&EOD!~ZFN2R_+x1X?U7PpG44(TS^xb*ZKr4ri;|P@3lGoH)KMDh z@5ma|wX%RAb)rFFfu->5kxb}=a@!-Ix8#Ff@uYRsqWD+Ct$RGKD)b47l+#kREA9rl zd8sd~Tc|zj7USwajTeJMgt@G%QKmyjZcvAEatw(2IzgJ&`K4TktvEI&ed2 z7b4;4(p=B&D$Un-cJH~odEK#=DwEmlKwY<^j|eltgVz#E*R7f4roq4UwmCR?d4Pxr zPqK@ik>~GQHR`m;k;!T1&A@7U#v^vrMEYYLuL>0zu{Pzdizkz)yOyVDJ?kcYTcl?H z-xI$&uM0k#4V8p}3r~*|W(L%cvzde3<1FSIp2xkeh(L@(_GX5_7^<6*6g5Z6 zNYO)4PBsiGQ$S8puQeQzj>IJGD^CKFZ(ApCB^@PCK)F1E!b?3EO3fg#Bp}(#xFN*` zX?&69qhwq+#rNK{NQ5YPlDdR%nVBy`r75$>c^KhEZt2SC(1n_m?rh^G zPPdOS#j8HIvfjbt?fJEKmQub?Y5YkoS(<(Fnc86GG^tLenvc++m^C(JT%DqTq_mVJ zUp8r|M~s@@t)KZwuc6NGJn-1Jcbj)jK{TAnB|I1E{!LOKaVs*qa|{j~wi!0A3K$zQ zZAhCznl^QQLwVevn#r@gGdW`_@2kI)k5D{`Y;+Hi9Xy@*EM%QXD`zn2ls5F~aE@Pw zheFj=AD*f2-KtIn-_DDzwZ3L+`NJZsX6dy&>wBc#m=T%tYLOUi(l75bdq#d|Zf`8h z*5+xI4(I^C2re2_5Mo=3GurcNjZ6IWu9=>UxHfER>UiUUWyeHGp5?>k89%E#3Eyo! z?_Q}?JcI6{P40l~@?_~AowAOQiSlbSb13I;`Q#W^^P`5PwbkEHMvbje2TXUpxhAsM z{Wa>a)!On{p2YzDJKm+aOJ~=Q?boyou?Xjxu#VOL3w6(%RoQB-4|>9_cJDMJ_am5UwS!KOy}<> z^&~vkAF+fbUlruH=pVhdaYbjwxd8H6&ulWc+`!24>B6SXB_wF8Ga1=kQyW@U#y1VC zL9J@zRqq4N*<=yLC&UX!WSHJCLeVJprW0H9CAHtSDlmVy(BHH11(dBVUB5Xc^$h> zb$Sx!Se=B~n=q@^N2#@L8Dx3En529Fzjh+H+W+^o(x-2Hijg&KOJ{eqQ%bp2aGRHW zdPXH#E6XCkt#hZiS#=;Si+(HVRw6{9Xlk|IU2SQsEFT5P|a$5tAA4of;IRzLX z_XK*R9nTcLoHt~}l#gedWAqXzkGEetr1T9tM_&i+)f;pdZCaTYG*LZGjjV^aW;|5- zJM-+pe1p?ghuO<}6@}KKv~hOYA=2zhwqyJBma8wW3;$u}9D3WH+&cTyVV&o=o*G%_ zW$`6NOqZs?d^yTl5a;qAFoer?(7Ka? zc&7$AJ?^@J(A1|mzDmfcK0L!N*e$rGGK1cQfmC)bK&{fdLJX_0>W}AlJGCls31gN1>YGD40 zDAk*xgS!nMh<{u=box0BW^p&LFe#%>3)p{k>(CN5wSBkNG`o!+^wGNow>c5?0j5YE zp)P%R!a6@0&YMzp+2W$F^?@_6ZmJl^ruW?bX9Kgda~zRa%oVa0>SCbgqSeAWtpx;C zwyqbr`+fSX?%IkBV8+1`X6BN2h@tcO1qqGKpY(ZaF zly$@P%Tghmx~LxG?&W;0CMtF?=;*6}q_Q1;d${6E?KoNXI{6G~QrQvG8-(`>^%QyB>@4q>)A-vCxAvwFE*yDz@y_zc#%V^erXr-j?bfdt*@IOl zZkna)0BNs9DVY$~sh6;pwRp#M2^q)&P5*57?vcZds{UrYFFNhu+VT&VL46|AY@j(Frgta=T@1HWw#|EW+F=UXNPCz?nf*h3gSO* z=jr&RhMo0y^-Jo3wBE0bWoY+}fwOPD979bBmtXdfFYISIt0@$wwb)kPS^TVVt}8bj zvs<;D`rIrkDR)aR?=wxikHQ?qc!9OQHhjJFTKD0vv}$(^ #h`1v57mX6-SVd0ZC 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 UyIR?+S1w#hlvBpMQAi--|7CW6RR910 literal 0 HcmV?d00001 diff --git a/homepage/machs/index.php b/homepage/machs/index.php index 5cd55f3..cf7d7eb 100644 --- a/homepage/machs/index.php +++ b/homepage/machs/index.php @@ -8,13 +8,16 @@ setlocale (LC_ALL, 'de_DE@euro', 'de_DE', 'de', 'ge'); require_once("./lib/db.php"); require_once("./lib/achievementsLib.php"); require_once("./lib/api.php"); + require_once("./lib/record.php"); + require_once("./lib/machs/achievementGroup.php"); require_once("./auth.php"); $basePath = "/users/cwsvjudo/www"; require_once($basePath."/config/cwsvJudo.config.php"); require_once($basePath."/config/phpcount.config.php"); -// require_once($basePath."/ressourcen/phpLib/phpcount/phpcount.php"); + require_once($basePath."/ressourcen/phpLib/phpcount/phpcount.php"); + PHPCount::AddHit("Achievementsystem (".htmlspecialchars($_SESSION['user']['username']).")"); // require_once($basePath."/ressourcen/phpLib/cwsvJudo/miscAssis.php"); // $dbConnection = getCwsvJudoDbConn(); @@ -25,7 +28,9 @@ setlocale (LC_ALL, 'de_DE@euro', 'de_DE', 'de', 'ge'); $cwsvJudoConfig["db"]["password"] ); -$achievementGroups = getAchievementGroups($dbConnection); +record::setDbConnection($dbConnection); +achievementGroup::setDbConnection($dbConnection); +$achievementGroups = achievementGroup::getAllAchievementGroups(); processPostData($dbConnection, $_POST); @@ -40,6 +45,8 @@ processPostData($dbConnection, $_POST); + + Achievements @@ -49,58 +56,36 @@ processPostData($dbConnection, $_POST); - - - + + + + "); echo( "

Eigene Achievements

" ); - echo( htmlUsersUploadBox($dbConnection, $_SESSION['user']['userId']) ); - echo(htmlAchievementListForUser( - $dbConnection, - $achievementGroups, - $_SESSION['user']['userId'], - getUsersAchievements($dbConnection, $_SESSION['user']['userId']) - )); - } - ?> - - ".$k['vorname']." ".$k['name']."" ); - echo( htmlUsersUploadBox($dbConnection, $k['kidId']) ); - echo(htmlAchievementListForUser( - $dbConnection, - $achievementGroups, - $k['kidId'], - getUsersAchievements($dbConnection, $k['kidId']) - )); - } +# var_dump($achievementGroups); + foreach($achievementGroups as $g){ + echo($g->asHtmlCard($_SESSION['user']['userId'])); } + echo("" ); + } ?> -Add Achievements"); - echo(htmlAddAchievementBox()); - - echo("

Update Achievements

"); - $achievements = getAchievements($dbConnection); - foreach($achievements as $a){ - echo( htmlUpdateAchievementBox( - $a['id'], - $a['name'], - $a['description'], - $a['rootId'], - $a['level'] - )); - echo("
"); + ".$k['vorname']." ".$k['name']."" ); + echo( "
"); + foreach($achievementGroups as $g){ + echo($g->asHtmlCard($k['kidId'], ['noForm'=>false])); + } + echo("
" ); + } } - } - ?> - - + ?> + diff --git a/homepage/machs/lib/achievementsLib.php b/homepage/machs/lib/achievementsLib.php index 9a63773..e1183a1 100644 --- a/homepage/machs/lib/achievementsLib.php +++ b/homepage/machs/lib/achievementsLib.php @@ -1,4 +1,6 @@ Heute wurde schon ein Achievement erreicht!"; } $retHtml .= "
"; foreach($achievementGroups as $g){ +// var_dump($userData); +// $records = record::getGroupsRecords($g->getId(), $userData[0]['gebDatum ']); +// var_dump($userData); + $records = record::getGroupsRecords($g->getId(), record::birthday2ageClass($userData[0]['gebDatum'])); $retHtml .= ""; } @@ -185,42 +204,61 @@ $retHtml = ""; return $retHtml; } +function getRecords($db, $groupId){ + $query = <<['value'=>$groupId, 'data_type'=>PDO::PARAM_INT]]; +return dbQuery($db, $query, $params); +} + +function setUserDataBox($userId){ +$html = ""; + $html .= "
"; + $html .= ""; + $html .= ""; + $html .= ""; + $html .= ""; + $html .= ""; + $html .= "
"; +return $html; +} + function htmlAddAchievementBox(){ $html = ""; $html .= "
"; $html .= ""; - $html .= ""; + $html .= ""; $html .= ""; + $html .= ""; + $html .= ""; + $html .= ""; $html .= ""; + $html .= ""; $html .= ""; $html .= "
"; return $html; } -function htmlUpdateAchievementBox($achievementId, $name, $description, $rootId, $level){ +function htmlUpdateAchievementBox($achievementId, $name, $rootId, $achievementGroupId, $level, $description, $imgUrl){ $html = ""; $html .= "
"; $html .= ""; - $html .= ""; + $html .= ""; $html .= "
achievementId: ".$achievementId; $html .= ""; - $html .= "
"; - $html .= "
"; + $html .= "
"; $html .= ""; $html .= ""; - $html .= "
"; - $html .= "
"; - $html .= ""; - $html .= ""; - $html .= "
"; - $html .= "
"; $html .= ""; $html .= ""; - $html .= "
"; - $html .= "
"; + $html .= ""; + $html .= ""; $html .= ""; $html .= ""; - $html .= "
"; + $html .= ""; + $html .= ""; $html .= ""; $html .= ""; return $html; diff --git a/homepage/machs/lib/api.php b/homepage/machs/lib/api.php index 370ea7a..c3801ff 100644 --- a/homepage/machs/lib/api.php +++ b/homepage/machs/lib/api.php @@ -13,19 +13,79 @@ function processPostData($db, $post, $redirectLocation = "."){ addAchievement( $db, $post['name'], - $post['description'] + $post['rootId'], + $post['achievementGroupId'], + $post['level'], + $post['description'], + $post['imgUrl'] ); } + + if($post['action']=="addAchievementGroup"){ + addAchievementGroup( + $db, + $post['name'], + $post['rootId'], + $post['unlockingAchievementId'], + $post['imgUrl'] + ); + } + if($post['action']=="updateAchievement"){ updateAchievement( $db, $post['achievementId'], - $post['name'], + $post['name'], + $post['rootId'], + $post['achievementGroupId'], + $post['level'], $post['description'], - $post['rootId'], - $post['level'] + $post['imgUrl'] ); } + + if($post['action']=="updateAchievementGroup"){ + updateAchievement( + $db, + $post['achievementGroupId'], + $post['name'], + $post['rootId'], + $post['unlockingAchievementId'], + $post['imgUrl'] + ); + } + + if($post['action']=="setBday"){ + setBday( + $db, + $post['userId'], + $post['bday'] + ); + } + if($post['action']=="setRecord"){ +# $u = getUserData($db, $post['userId']); +# $ag = new achievementGroup; +# achievementGroup::setDbConnection($db); +# $ag->loadAchievementGroupFromDb($post['achievementGroupId']); +# $m = $u['vorname']." ".$u['name']." hat in ".$ag->getName()." ".$post['value']." geschafft!"; + $m = $post['userId']." hat in ".$post['achievementGroupId']." ".$post['value']." geschafft!"; + sendEmail("cwsvjudo@arcor.de", $m, "[machs] Rekord eingetragen"); +# setRecord( +# $db, +# $post['userId'], +# $post['achievementGroupId'], +# $post['value'] +# ); + } + if($post['action']=="reportRecord"){ +# $u = getUserData($db, $post['userId']); +# $ag = new achievementGroup; +# achievementGroup::setDbConnection($db); +# $ag->loadAchievementGroupFromDb($post['achievementGroupId']); + $m = $post['userId']." hat in ".$post['achievementGroupId']." ".$post['value']." geschafft!"; +# $m = $u['vorname']." ".$u['name']." hat in ".$ag->getName()." ".$post['value']." geschafft!"; + sendEmail("cwsvjudo@arcor.de", $m, "[machs] Rekordmeldung"); + } if($post['redirectLocation']) $redirectLocation = $post['redirectLocation']; header("Location: ".$redirectLocation); diff --git a/homepage/machs/lib/db.php b/homepage/machs/lib/db.php index 52c4a31..a6f65d1 100644 --- a/homepage/machs/lib/db.php +++ b/homepage/machs/lib/db.php @@ -246,6 +246,7 @@ SQL; $params = [':userId'=>['value'=>$userId, 'data_type'=>PDO::PARAM_INT], 'achievementId'=>['value'=>$achievementId, 'data_type'=>PDO::PARAM_INT]]; dbQuery($db, $query, $params); sendEmail("cwsvjudo@arcor.de", "kwT", "User ".$userId." got achievement ".$achievementId); +//var_dump($query, $params); return; } @@ -281,41 +282,126 @@ SQL; return dbQuery($db, $query); } -function addAchievement($db, $name, $description){ +function addAchievement($db, $name, $rootId, $achievementGroupId, $level, $description, $imgUrl){ + if($rootId=="") + $rootId=null; + if($imgUrl=="") + $imgUrl=null; $query = << ['value'=>$name, 'data_type'=>PDO::PARAM_STR], + ':rootId' => ['value'=>$rootId, 'data_type'=>PDO::PARAM_INT], + ':achievementGroupId' => ['value'=>$achievementGroupId, 'data_type'=>PDO::PARAM_INT], + ':level' => ['value'=>$level, 'data_type'=>PDO::PARAM_INT], ':description' => ['value'=>$description, 'data_type'=>PDO::PARAM_STR], + ':imgUrl' => ['value'=>$imgUrl, 'data_type'=>PDO::PARAM_STR], ]; dbQuery($db, $query, $params, ['dontFetch'=>true]); return; } -function updateAchievement($db, $achievementId, $name, $description, $rootId, $level){ +function addAchievementGroup($db, $name, $unlockingAchievementId, $imgUrl){ + if($unlockingAchievementId=="") + $unlockingAchievementId=null; + if($imgUrl=="") + $imgUrl=null; + $query = << ['value'=>$name, 'data_type'=>PDO::PARAM_STR], + ':unlockingAchievementId' => ['value'=>$unlockingAchievementId, 'data_type'=>PDO::PARAM_INT], + ':imgUrl' => ['value'=>$imgUrl, 'data_type'=>PDO::PARAM_STR], + ]; + dbQuery($db, $query, $params, ['dontFetch'=>true]); +return; +} + +function updateAchievement($db, $achievementId, $name, $rootId, $achievementGroupId, $level, $description, $imgUrl){ + if($rootId=="") + $rootId=null; + if($imgUrl=="") + $imgUrl=null; $query = << ['value'=>$name, 'data_type'=>PDO::PARAM_STR], - ':description' => ['value'=>$description, 'data_type'=>PDO::PARAM_STR], + ':achievementGroupId' => ['value'=>$achievementGroupId, 'data_type'=>PDO::PARAM_INT], ':rootId' => ['value'=>$rootId, 'data_type'=>PDO::PARAM_INT], ':level' => ['value'=>$level, 'data_type'=>PDO::PARAM_INT], + ':description' => ['value'=>$description, 'data_type'=>PDO::PARAM_STR], + ':imgUrl' => ['value'=>$imgUrl, 'data_type'=>PDO::PARAM_STR], ':achievementId' => ['value'=>$achievementId, 'data_type'=>PDO::PARAM_INT], ]; dbQuery($db, $query, $params, ['dontFetch'=>true]); return; } +function updateAchievementGroup($db, $achievementGroupId, $name, $unlockingAchievementId, $imgUrl){ + if($unlockingAchievementId=="") + $unlockingAchievementId=null; + if($imgUrl=="") + $imgUrl=null; + $query = << ['value'=>$achievementGroupId, 'data_type'=>PDO::PARAM_INT], + ':name' => ['value'=>$name, 'data_type'=>PDO::PARAM_STR], + ':unlockingAchievementId' => ['value'=>$unlockingAchievementId, 'data_type'=>PDO::PARAM_INT], + ':imgUrl' => ['value'=>$imgUrl, 'data_type'=>PDO::PARAM_STR], + ]; + dbQuery($db, $query, $params, ['dontFetch'=>true]); +return; +} + +function setBday($db, $userId, $bday){ + $query = << ['value'=>$bday, 'data_type'=>PDO::PARAM_STR], + ':userId' => ['value'=>$userId, 'data_type'=>PDO::PARAM_INT] + ]; + dbQuery($db, $query, $params, ['dontFetch'=>true]); +return; +} + +function setRecord($db, $userId, $achievementGroupId, $value){ +$u = getUserData($db, $userId); + $query = << ['value'=>$achievementGroupId, 'data_type'=>PDO::PARAM_INT], + ':ageClass' => ['value'=>record::birthday2ageClass($u['gebDatum']), 'data_type'=>PDO::PARAM_INT], + ':userId' => ['value'=>$userId, 'data_type'=>PDO::PARAM_INT], + ':value' => ['value'=>$value, 'data_type'=>PDO::PARAM_INT], + ]; + dbQuery($db, $query, $params, ['dontFetch'=>true]); +//var_dump($userId, $achievementGroupId, $value); +//var_dump($query, $params); +return; +} + function canUserGetAchievementToday($db, $userId){ $achievements = getUsersAchievements($db, $userId); foreach($achievements as $a){ - if( date('Ymd') == date('Ymd', strtotime($a['timestamp'])) ) + if( date('Ymd') == date('Ymd', strtotime($a['timestamp'])) ){ return false; + } } return true; } diff --git a/homepage/machs/lib/machs/achievementGroup.php b/homepage/machs/lib/machs/achievementGroup.php new file mode 100644 index 0000000..4eb2882 --- /dev/null +++ b/homepage/machs/lib/machs/achievementGroup.php @@ -0,0 +1,232 @@ +setAchievementGroupData( + $r['id'], + $r['name'], + $r['unlockingAchievementId'], + $r['imageUrl'] + ); + $groups[$gid]->getAchievements(['force'=>true]); + } + return $groups; + } + + //getter functions for the member variables + function getId(){return $this->id;} + function getName(){return $this->name;} + function getUnlockingAchievementId(){return $this->unlockingAchievementId;} + function getImageUrl(){return $this->imageUrl;} + + /// returns list of achievements + /// - returns the previously loaded achievements + /// - reloads them if null or forced + function getAchievements($options=[]){ + // standards for Options: + $force = $options['force']??false; // load the achievements from the db even if ther already are some in the group->achievements member + if(($this->achievements == null) or ($force)){ + $query = <<['value'=>$this->id, 'data_type'=>PDO::PARAM_INT]]; + $this->achievements = dbQuery(self::$db, $query, $params); + } + return $this->achievements; + } // end getAchievements + + /// Load the achievementgroup $id from the db into the + function loadAchievementGroupFromDb($id){ + $query = <<['value'=>$id, 'data_type'=>PDO::PARAM_INT]]; + $result = dbQuery(self::$db, $query, $param); + + $this->setAchievementGroupData( + $result[0]['id'], + $result[0]['name'], + $result[0]['unlockingAchievementId'], + $result[0]['imageUrl'] + ); + $this->getAchievements(['force'=>true]); + } + + /// Set the member data of the group + function setAchievementGroupData($id, $name, $unlockingAchievementId=null, $imageUrl=null){ + $this->id = (int)$id; + $this->name = $name; + $this->unlockingAchievementId = ($unlockingAchievementId == null ? null : (int)$unlockingAchievementId); + $this->imageUrl = $imageUrl; + } + + /// A simple representation of the group in html code + function html(){ + $html = ""; + $html .= "
"; + $html .= "
"; + $html .= "
Id:
".$this->id."
"; + $html .= "
name:
".$this->name."
"; + $html .= "
unlockingAchievementId:
".$this->unlockingAchievementId."
"; + $html .= "
Achievements:
    "; + foreach($this->achievements as $a) + $html .= "
  • ".$a['name']."
  • "; + $html .= "
"; + $html .= "
"; + $html .= "
"; + return $html; + } + + /// gets all achievements of that user in that group reachedd + function getUsersAchievements($userId, $options=[]){ + $getAll = $options['getAll']??false; + $query = ""; + $query.= "SELECT * FROM `cwsvjudo`.`achievements<=>user` "; + $query.= "WHERE `userId` = :userId"; + if(!$getAll) + $query.=" AND `achievementId` = :achievementId"; + $query.= ";"; + $params[':userId'] = array('value'=>$userId, 'data_type'=>PDO::PARAM_INT); + if(!$getAll) + $params[':achievementId'] = array('value'=>$this->getId(), 'data_type'=>PDO::PARAM_INT); + $result = dbQuery($this->getDbConnection(), $query, $params); +return $result; +} + + /// returns the materialize card html code of the Achievementgroup + /// + /// @param $uId id of the user the achievements should be + function asHtmlCard($uId, $options=[]){ + $noForm = $options['noForm']??true; + $retHtml = ""; + $userData = record::getUserData($uId); + $usersAchievements = $this->getUsersAchievements( $uId, ['getAll'=>true] ); + $usersAchievementIds=[null]; + foreach($usersAchievements as $a){ + $usersAchievementIds[]=(int)$a['achievementId']; + } + if(!in_array($this->getUnlockingAchievementId(), $usersAchievementIds)) + return ""; + $records = record::getGroupsRecords( + $this->getId(), + record::birthday2ageClass($userData[0]['gebDatum']) + ); + $achievements = $this->getAchievements(); + + $retHtml .= "
"; + $retHtml .= "
"; + $retHtml .= "
"; + if($this->imageUrl != null){ + $retHtml .= "
imageUrl."\">"; + } + $retHtml .= "".$this->name.""; + if($this->imageUrl != null){ + $retHtml .= "
"; + } + $retHtml .= "
    "; + foreach($achievements as $a){ + if(in_array((int)$a['id'], $usersAchievementIds)){ + $retHtml .= "
  • ✓ ".$a['name'].": ".$a['description']; + $retHtml .= "
  • "; + } + else{ + $retHtml .= "
  • ".$a['name'].": ".$a['description']; + if(!$noForm){ + if( canUserGetAchievementToday( $this->getDbConnection(), $uId) or isUserAdmin($this->getDbConnection(), $_SESSION['user']['userId']) ){ + $retHtml .= "
    "; + $retHtml .= ""; + $retHtml .= ""; + $retHtml .= ""; + $retHtml .= ""; + $retHtml .= ""; + $retHtml .= "
    "; + } + } + if( $imgUrl != null ) + $retHtml .= "
    "; + $retHtml .= "
  • "; + break; + } + } + // show the current record + if( validateDate($userData[0]['gebDatum'])){ + $retHtml.=record::arrayRecord2htmlCard($records[0], $userData[0], $this->getId(), "li"); + } + else{ + $retHtml.="
    Rekorde können erst angezeigt werden, wenn das Geburtsdatum korrekt gesetzt wurde!
    "; + } + $retHtml .= "
"; + $retHtml .= "
"; + $retHtml .= "
"; + $retHtml .= "
"; + return $retHtml; + }// end asHtmlCard + + /// create html code for a for to add an achievementGroup + static function htmlAddAchievementGroupForm(){ + $html = ""; + $html .= "
"; + $html .= ""; + $html .= ""; + $html .= ""; + $html .= ""; + $html .= ""; + $html .= ""; + $html .= "
"; + return $html; + } + /// create html code for a for to edit an achievementGroup + function htmlEditAchievementGroupForm(){ + $html = ""; + $html .= "Edit ".$this->getName(); + $html .= "
"; + $html .= ""; + $html .= ""; + $html .= "getId()."\"/>"; + $html .= ""; + $html .= "getName()."\"/>"; + $html .= ""; + $html .= "getUnlockingAchievementId()."\"/>"; + $html .= ""; + $html .= "getImageUrl()."\"/>"; + $html .= ""; + $html .= "
"; + return $html; + } + +} +?> diff --git a/homepage/machs/lib/machs/materializeInit.php b/homepage/machs/lib/machs/materializeInit.php new file mode 100644 index 0000000..10acf22 --- /dev/null +++ b/homepage/machs/lib/machs/materializeInit.php @@ -0,0 +1,14 @@ + + diff --git a/homepage/machs/lib/machs/sidenav.php b/homepage/machs/lib/machs/sidenav.php new file mode 100644 index 0000000..26a53ee --- /dev/null +++ b/homepage/machs/lib/machs/sidenav.php @@ -0,0 +1,13 @@ + + +☰ MeinACHievementSystem + diff --git a/homepage/machs/lib/record.php b/homepage/machs/lib/record.php new file mode 100644 index 0000000..3ebf88c --- /dev/null +++ b/homepage/machs/lib/record.php @@ -0,0 +1,221 @@ +['value'=>$userId, 'data_type'=>PDO::PARAM_INT]]); + } + // request the records of a group together with its holder + // @param $groupId id of the group of achievements where the records are wanted + // @param $ageClass the age class (as int only) for which the record is holding + // + // a record of an achievement group consists of: + // - a value + // - an age class + public static function getGroupsRecords($groupId, $ageClass=null){ +// var_dump($groupId, $ageClass); + //$ageClass = null; // DEBUG + $query = "SELECT * FROM `cwsvjudo`.`machs_records` "; + $query.= "JOIN `cwsvjudo`.`wkParticipo_Users` "; + $query.= " ON `cwsvjudo`.`machs_records`.`userId` = `cwsvjudo`.`wkParticipo_Users`.`id` "; + $query.= "WHERE `cwsvjudo`.`machs_records`.`achievementGroupId` = :groupId "; + $params =[ + 'groupId'=>[ 'value'=>$groupId, 'data_type'=>PDO::PARAM_INT ] + ]; + if($ageClass != null){ + $query.= " AND `cwsvjudo`.`machs_records`.`ageClass` <= :ageClass "; + $params['ageClass'] = [ 'value'=>$ageClass, 'data_type'=>PDO::PARAM_INT ]; + } + $query.= "ORDER BY `cwsvjudo`.`machs_records`.`value`;"; + //var_dump($query, $params); + return dbQuery(self::$db, $query, $params); + } + /// @param $r record as associative array + public static function arrayRecord2htmlDl($r){ + $retHtml = "
"; + foreach(self::$colNames as $i) + $retHtml.= "
".$i."
".$r[$i]."
"; + $retHtml.= "
"; + return $retHtml; + } + /// @param $r record joined with it's holder as associative error + /// @param $u user for whom the record is shown + public static function arrayRecord2htmlCard($r, $u, $gid, $frameTag="div"){ + $retHtml = "<".$frameTag." class=\"card\">"; + $retHtml.= "
"; + $retHtml.= "Zu schlagender Rekord"; + if(empty($r)){ + $retHtml.= "Noch kein Rekord für die Altersklasse U".record::birthday2ageClass($u['gebDatum']); + } + else{ + $retHtml.= $r['vorname']." ".$r['name']." mit ".$r['value']." in der U".$r['ageClass']; + } + $retHtml.= "
"; + $retHtml.= "
"; + $retHtml.= "Rekord melden"; + $retHtml.= "
"; + $retHtml.= "
"; + $retHtml.= "Rekorde stellen in jeder Achievementgruppe und Altersklasse die Bestleistung unter allen Judoka dar. Rekorde können unabhänging vom eigenen, aktuellen Achievementstand aufgestellt werden."; + $retHtml.= "Die Rekorde der jüngeren gelten auch für die älteren, aber nicht umgekehrt. "; + $retHtml.= "Damit ein Rekord auch eingetragen wird, muss er mit einem Nachweis in Videoform gemeldet werden."; + $retHtml.= "

Rekord melden

"; + $retHtml.= "Um einen Rekord zu melden, lade ein Video des Rekordes hoch:"; + $retHtml.= htmlUsersUploadBox(self::$db, $u['id']); + $retHtml.= "Anschließend kannst Du den Rekord melden:"; + $retHtml.= "
"; + if(isUserAdmin(record::$db, $_SESSION['user']['userId'])){ + $retHtml.= ""; + } + else{ + $retHtml.= ""; + } + $retHtml.= ""; + $retHtml.= ""; + $retHtml.= $u['vorname']." ".$u['name']." hat geschafft."; + if(isUserAdmin(record::$db, $_SESSION['user']['userId'])){ + $retHtml.= ""; + } + else{ + $retHtml.= ""; + } + $retHtml.= "
"; + $retHtml.= "
"; + $retHtml.= "
"; + $retHtml.= "Zurück"; + $retHtml.= "
"; + $retHtml.= "
"; + $retHtml.= "
"; + $retHtml.= ""; + return $retHtml; + + + + } + public static function birthday2ageClass($birthdateString){ + $birthDate = DateTime::createFromFormat("Y-m-d", $birthdateString); + $birthYear= (int)$birthDate->format("Y"); + $thisYear = (int)date('Y'); + return $thisYear - $birthYear + 1; + } +} + +/// Als String gegebene Altersklassen als Jahrgangsintervalle +/// ausdrücken +function akListString2jgArray($akListString, $year = NULL ){ +$ret = array(); + if($year==NULL) + $year=date("Y"); + else{ + if( !((int)$year == $year && (int)$year >= 0) ) + $year=date("Y"); + } + + $year = (int)$year; + + foreach(explode(" ", $akListString) as $ak) + array_push( + $ret, + akString2jgIntervall($ak, $year) + ); +return $ret; +} + +/// Aus einer als String gegebenen Altersklasse ein Jahrgangsintervall +/// machen +function akString2jgIntervall($akString, $year=null){ +if($year==NULL) + $year=date("Y"); +else{ + if( !((int)$year == $year && (int)$year >= 0) ) + $year=date("Y"); +} + +$ret= array(NULL, NULL); + + // Speziell für die Ux-Altersklassen + // Es fehlt noch das <=U + $akUmatchString = "/(.*)U(.*)/"; + $matches = array(); + preg_match($akUmatchString, $akString, $matches); + // Wenn wir nicht den gesamten akString Matchen ist etwas schief + // gelaufen + if($matches[0]==$akString){ + // Das ausgelesene Alter der Ux sollte eine positive Integer sein, + // sonst ist was schiefgelaufen + $ageLimit = (int)$matches[2]; + if( ($ageLimit == $matches[2] && $ageLimit > 0) ){ + $ret[0] = $year-$ageLimit+1; + + if($matches[1] == "") + $ret[1] = $year-$ageLimit+2; + else{ + if($matches[1] == "-") + $ret[1] = $year-$ageLimit+3; + else{ + if($matches[1] == "--") + $ret[1] = $year-$ageLimit+4; + } + } + } + return $ret; + } + + // Speziell Altersklassen der Form Jg.x-y + $akUmatchString = "/Jg\.(.*)\-(.*)/"; + $matches = array(); + preg_match($akUmatchString, $akString, $matches); + // Wenn wir nicht den gesamten akString Matchen ist etwas schief + // gelaufen + if($matches[0]==$akString){ + $ret[0]=(int)$matches[1]; + $ret[1]=(int)$matches[2]; + + return $ret; + } +return $ret; +} + +function validateDate($date, $format = 'Y-m-d') +{ + $d = DateTime::createFromFormat($format, $date); + // The Y ( 4 digits year ) returns TRUE for any integer with any number of digits so changing the comparison from == to === fixes the issue. + return $d && $d->format($format) === $date; +} +?> diff --git a/homepage/machs/login.php b/homepage/machs/login.php index c8c20bf..2c8cc71 100644 --- a/homepage/machs/login.php +++ b/homepage/machs/login.php @@ -8,6 +8,11 @@ setlocale (LC_ALL, 'de_DE@euro', 'de_DE', 'de', 'ge'); require_once("./lib/achievementsLib.php"); + $basePath = "/users/cwsvjudo/www"; + require_once($basePath."/config/phpcount.config.php"); + require_once($basePath."/ressourcen/phpLib/phpcount/phpcount.php"); + + function checkCredentials($username, $password, $db_server, $db_user, $db_password, $db_name){ $mysqli = @new mysqli($db_server, $db_user, $db_password, $db_name); if ($mysqli->connect_error) { @@ -30,6 +35,7 @@ function checkCredentials($username, $password, $db_server, $db_user, $db_passwo ), ); $message['success'] = 'Anmeldung erfolgreich, weiter zum Inhalt.'; + PHPCount::AddHit("machs-Login ".$_POST['f']['username']); header('Location: http://' . $_SERVER['HTTP_HOST'] . '/machs?user=' . $_POST['f']['username']); } else { sleep(1); @@ -59,21 +65,27 @@ else{ } } } + ?> - Wettkampfplanung - Login + + + + + + + + Login des Achievementsystemes der Judoka des Chemnitzer WSV - - - +

Achievementsystem der Judoka des Chemnitzer WSV

-
+
Benutzerdaten
@@ -91,9 +103,9 @@ else{
Hinweise -
    -
  • Logindaten sind über den Übungsleiter zu beantragen.
  • -
  • Dieses Projekt ist in mehr oder weniger aktiven Entwicklung. Sollte mal was nicht funktionieren, kann es sein, dass ich gerade daran herumschreibe. Also ruhig zu einem späteren Zeitpunkt noch einmal probieren.
  • +
      +
    • Logindaten sind über den Übungsleiter zu beantragen.
    • +
    • Dieses Projekt ist in mehr oder weniger aktiven Entwicklung. Sollte mal was nicht funktionieren, kann es sein, dass ich gerade daran herumschreibe. Also ruhig zu einem späteren Zeitpunkt noch einmal probieren.
diff --git a/homepage/machs/setUserData.php b/homepage/machs/setUserData.php new file mode 100644 index 0000000..5ac43cd --- /dev/null +++ b/homepage/machs/setUserData.php @@ -0,0 +1,76 @@ + + + + + + + + + + + + + + + Benutzerdaten ändern + + + + + + + + + + + + +

Benutzerdaten ändern

+ ".$k['vorname']." ".$k['name']."" ); + echo( htmlUsersUploadBox($dbConnection, $_SESSION['user']['userId']) ); + echo( setUserDataBox($k['kidId']) ); + } + } + ?> + + +