From 529469e2e3e22e63e2552e240febcc7647f8e347 Mon Sep 17 00:00:00 2001 From: Server Ubunto - HOME Date: Fri, 17 Oct 2025 14:07:56 +0100 Subject: [PATCH] Feat: Parce END_SESSION and store all connected players information instead of just one --- PlayerTracker | Bin 130584 -> 184448 bytes include/server_structs.h | 250 ++++++++++++++++++++------------------- source/main.cpp | 235 ++++++++++++++++++++++++++++++------ 3 files changed, 325 insertions(+), 160 deletions(-) diff --git a/PlayerTracker b/PlayerTracker index 5e98092a60675a07e2a0a266a0d7c7e6850fb56f..f8449996beb43ff92ffd39c48816476ffca77f5b 100755 GIT binary patch literal 184448 zcmeF434B~t+5c}hXxUN_v@F6DS}AMy%#?M~G-aY~iCv(Gm|NPEM%pAMDFzf72$hZ@ zQb4v>)GLUhulQC#Iur{-Sz1uB@UoOexFA9zixpf3MDl;mJ7DzX^E~Hwp0nP2&kPq;%$YrO$Ph^Gb>`ioNnAeIGF09+$ zwNqWWaBlUon#P)QYMYvC8W+wjUs+#QvvA4TD{J&;`9G;%(zK+my0)&inH&c1$>Gv- zt5+>qxw3v~^(3M74b8Qb+p?PGnx)MuQ%bYCsiu0#a>}f_v8H)-W1XaJtZAqxO)Kk{ zEQn8-)2b!SOIK7cT~R{?Jg?idmmy`>RMYGXtRvi#INRAdKYd zP|Alr!W->Lmp9hbR7ahL)y+-L@`lFRy5{9hW6jd@mN(X~l9Zv~syMDbTh-r+C3VYI z)&vo!x;$^m%Gzbs^zUk_`kpD8R@5$UuC8BAf6J@Su3ufZOvRvwle+r4y45RJRxfEh z2R~Y}Y*}?Z#cKJ=`mf?=4fQ0Knu6)`KJ#oozo8}<{PQL|wRJVk)s$VM(@@jcSl>vw z>A)>rac=eUCABM^y5{;7`rjt!?Ap3z&Wh&xx+bToe(AYXFRPnY*3>kR6|Gv9avxc> zq?T%`nfi!wx3pzR_43*}3e^QQ&eE0jP4q97oLaX-HmWD6wM|T&kj>Jgj#8(k>U352 zyC81rY_j6#ETx>f&z9;`r_8CGSzbNm*lCWuo0@w&<=E-e!-vp%M*j^79o2jF-!S@A zeXjn~$Kia|(@v+5e{&Yvx5{Oh^F10%)HtbL`_|U(sYaQfFuU{0Yiap3%=smsuRfr5 zlv-*1n$Fd0E3emO{2Bc_&9?#H`zg)01D|)48d)932cG<~PTv9io!@G{1NghV5Y7Uh z#Qq(*KG5b)oc)hX>ik8&oV%Cwm*&?w2|1^CkxQI`OWZu*-TIM>e&p;wvc{kjxGy?^OTG=r zIlYHm+5>XYiCp50oYP0tg#*2$-HM(`z$I=ja7o{QT=XMnJ-&hOKz^~-7rD%!6FKMW zBIkS?kc&>_5@+O`-bXHR1}<@ntTpIIF8YzPf6u_zBj>pJ$VDe|&Nq@W=tM3$k+c5> z=BrM>MyF8aTfU%zYM4ah|&a?y#L)BDIJ&cI!+m#l$D+Vbn41YG>Y z4BQ1SacclBep(FN11^5nBbPWJ=QuSgMMQ7yO`SYCwT>QAe#gAv;zJc!mF8(7|rj`0;>u>oM>h zz{OAG>il{pA?NYIMLtQ}HvpIM-vcf>*8_JsK4}B@fs3CV$XRDZ-Pp-DJ{Y)X;Ol{V ztkVZBdLq~4&vz1V@#6v)Kc0cF2QGem;NmB8tw9fP@#6v)Kc0cF2kuLJfQz5Vbp}1a z#g7YI{CEbw9=Q1Nfs3CV$ff;UZ_o)`+PMo{{5K$H{~mJgN9%!$e;>H`-+^58-;iIw zYv2vY`TEmC&N_Vq-vM0WANenX9s_RxE`B`V5{LE3ISxK@*1rR}#O=HJbxr~<_2L2- zJsAU!+z9?TT@3hk))@yb{$1cw&KBUE>?a9a{CL16zG>j^v!4ub@#6z`IlfuoyG_>R zcfJR4VE+;1>?a2N0QM6HE_z(x(q3DDAIW}_z{QUTT>3*A_;Ktf16=(0z+LVqS>T_Q z_TltpPLNv0q*j;GY0$& zi4Snm<05B2Ex>CfKETC~2VBNPK=|h!1kUev1KrR^kI(^tizN zt8{)Xz&qJb61e#BfXj7t8u)wcCj(sk_`qG(lLbC%s@Cb;Vu%lN_7elXKl_OT7d?Z?U{P@7-c|aC;LgMo?Lwta{{G1>Le6hp_xae__v!52=DBDl`0kaV%F8g?5z@L%$02e(jav7h2zb^3sE`B`V-Z#1Z0RM-?2e|n0 zfy+LpEbv`QwSVWAhWH?7Ju%>)WIu7>qQ?d9uhIFn0RIg8Ndgx?9&p)DmIhwRelozt zj}P2sJz3zhB|f(s;)9(1#DJeB@c}M+T;P6^;{$xT#0R+e@qqi6YCmbuaWrNVTccK+1D5YevQNjxae__bGcf8-y-n=E`B`Vek;cZ_^%{Bz{QUb++#mk z;15ZB?li;)xa?bv0e?#316=gDz&&X{!2cxi0WN+#@c}M=Jm9k5B@KL~#0R+e@qx?!zbx>tNqjaK z;)9&8Q)0ls#eU+zMUM+y_D8k=zk&TEfr}pxxXbH=H1J#5PX@U7@eMo+d;|M&(uVi| zcaGEPlE5Q;em(Fcr}u!1pNxTT2Yvew>Xx}`yoT=W?DHsqq`A%h+RuR<<*kc%Dz--cZDJZ#Wo;8n;)4|36C;Mn0~b9>178PR^kjgGALmhnPUKv!IP&AQeHC!$*P17ROTHNc-v&I+ew^PJbOM)r z}~q=BykF8OAFi=S=4C12;a`E|w(yb3wTIfv2JRbp{7?D)cm}>6xWo4&eBd%}?*K08Bd_Jp zH)-I$fyZCZ@5eK6rz3xQ*T6Fd9_h^QCu!imfye)x-;ZbD&KvpDy9S;y@W`9_{UiHG}TM{4O;>QCn*I8-cA4+_Hiyt33U+-ms@3lb3#d*gNAK-GG83TR@ z`-uY=JuYy$zHI?MiTxyjiysfT!{tf?FJnI$;Nr(e&e!Kz;PWLu?;7F*T<#adfG=e~ zap0oI1upj^T7WmRpCoYc;{kWLTxsBI*iQzy`0cnYuS(UH$!}Y$GN}9fd7R3 z#DR+*7r5LfY5~51{Um{l9}l?PpGpJY%6>Ay#g7kM?lWY8KP&P1yCFWn9gcGhc&Ee% zxae__-=p(u0sg+k2e|n0kn?@OH1ORPYX2GF;>QOr_aC#s4`e^iKMe5!F84QMz>j7> zap0oI1@3UUT7aL(ev-h&kB6M^=ca+rllTA^KR$4|FO&sdE%EuMAwIz6esm0Yox}&Y z=y8F^xm+#4FOv8G7e5|wN8$r~ox}&Y`0r@cSh`z{QUTJjvxs1K%d`0WN-g;Bko$@Rub%?-}9)++ja4;O|I$fQud%IX^dQ z0X}Sz){z7*emvkw_LBy_FZ;;=7e7AmIQz*0AJ2ZA_YLs@?y#R2@KW{@2QGSCd zBtF2!j|V)-e$v2il=uJ_KR)m{`^f^oP2%%`AwIwz_7eksufzwq=y8$rbMzMAznAy` z7e5|wd48V;?n``tiyt4j>>J1e|Et93--h@Aceq?J;6qQ-_Hp2%$3@Qj9$J8Zg8d|c ziyseolKrHCk7GX>;Nr&z9%nyU;M3WU^PwR=z#aAz13p{g16=gD$a()t3-Hq=KETC~ z2RzAs(!f_pe1MA|A9$SoWPzVA@#!+e2e`w2V!*#8@c}M+T;#mps0H|UB|gB#j|V)- ze$v2yF7W{_eth6@_LBv^N#aAlH68vvH}Mkz?y#R2@W&)Rz{QV?{61YDEx=!r_y89_ z9`GdlNdw;@@c}M=eBg2RlLbEHbgk1FVu%lLhyBEW@56rLz(tRX{9cX^@Wa?o61e#B zfG62c8u&E!lL0P%eBiQAF$=sx;xp6`AKm@$GMUM+y?)$d@|Ea_WxcKpa%X5V^ z@Qo55;Nr&zF3&Bpz<(q08E%LVaCt5g1O9@<2e{~Qfk*f`N(=C}BtF2!kB6L}>!g8y zDDeRVNb@FZmsE@e=_q&!u9(BkU&*T>QAe<+)c2@X72a30(Ym zz~#AG8u(21lL0P%eBkojE(?5t#Ag>ne1OYy!5Hvm5+C5A#|0kY=ZG!9S4(_=iysd; zKi5nH|E9zTxcKpb%X8B#@arT#yBgvHT%OCufZrE011`^% z)4(5<_y89_K5%(%ody29#Al=-KEUO~~26 z|Bl25xcKpb%YK?H@LME4yBp#IT=wh4fZrwY0WNx6;Ibd61^5<;4{-700hj$oY2e!> zKETC~4_x*$Wr24}eD*NJ2YBRVZa=`^m-qk|JuY&e`xo%tzo2;%xcKpa%YLsk@PpV- z2Dtd~fy;ifEbwF4kF%#CKEP$aS`7F}>?aOf^tixfKU@p&QzbsY#g7ME_S>a_yAmJZ z;>QOr`}wlKzasJ3%Mc&nkr%oB0KY`y16=gD$p66Y2l&+zAK>E011|d=)4+cu@c}M= zeBiR5G7J1y5}y)7e1OY-%^2{9B|gAKj|*J(gSG&FM&bip{CL1+ziAqHhr|cC`0;_u ze%37T_ar`}4ew+Yj)oBtF1JkBj^nZa=_pmiPb{KOS(|@16#Jr^E-i`0;_ue)=r% zha^6qFvJJA?AMP0e_G-LT=clW<@*3Fz+ad602eU6- zsO!<$*AO4zk*B!*06&2J#DR+*7x|Oiet;jvev-h&j|W`7?~w+60{h7T7e795`94V& z_*{w4eunq}m+z~@fPYEi16=gDz~%ceEx_v~KETC~2VA~ylLnrY_y89_K5+RyPZs!< z5}!{R;sZSL1h*gHH%WYeiyjyGEKP{4Q{h{kH%Y|4HEDe;shyukQhO*?$_i_|E_r z|J#5kS-+3`c#bphQzg#(=a2Jf;PU-}2=MqOjz91-CH}xge-&_#^)Cj#YJ%410(ZDv zEx>Cz-z0F!cO7u~o`VNGbDS<$8h8u)&j1(y+mK7W0C!L1dI7$c{W}Nbua^jLe-6hV z__x_l9JuIok(X;fEx@l~KS|)?#{=%p<+uUAk^N+Viyt3&lFO9^ezU~qKtp_h$3MsM z0sb?I4{*`r0*}w+_yGT<#0R+e@sP(kKETrwAK>E02kxJu{bYgPC-FJR5Fg;qERGNG zhb2D1MUM;Im-qnxox}&Y`0;@I362l&CnY|>#g7l%tKj$me_rDAX+wOFOZx%-io^%F z=y8F^WxN93De(a=emvk2i4X9?KO{Z}8{z{zF6{^Sza>7vMUM+S zDdP|D;a}4Am;^3m&NPK{c9}jrsMC~UH{BVg6aPi{XaEHgS81QKlAK;?L zMb71F0e-y12e|n0fJeCA)4QLaA7`8)KENH;69aw|`-uY=JudJ#>uCZ0Q}&Yt zE`B@%PXqrS_LBiFeth5&ZqHfZzhXbmctd=U^Ee*^{%iIV2QGSC;ND5PzFL4kzuUA`uzbNqm zE`B`VarTo2{wIkKaPi{mG}S`JudL1%wNFYm-qk| zKOS(G=jAl;A=O%E2Dtd~fhT2r20oJgIDFrt*Zx4@afuJ`67~}ZE_yOw(|Xmv2LwA2 z^*`G$(tH;>ofP7Jh>s5Oju1a0#CL@F(IK7<@nb^VWt}64O$qT8AwD_8li$!fcO|CZ z=?~Y2xNc#ZuM6>EAwSoL`0x<-LR@K**R3J0VkEEiA+9vZD;?rem+G@jh>w!Qble)^ zyM_3+5Z^t-w}<#1A?}Cxo*~{5;(LYoju0;i@ob3i9pVnxqbln@AwDw1KM~@iLww&5 z9~0vHg?J>yKN;c^Li|%9J}Jb4LVR3^UmxP*L);7T&xH7`A%1v>uMhDF zA)XHLBSSnB;zxz})(}57#J7d`#1Q}Z?Z*-LI07F>;NuAV-;BV!B?rHsXnk{JqHV;> zFF8(PO{RHh*S19KgCidZ1b0pU?2C@mHGU5LTXIO;QR!ExPdZ=e>grm)E;v^Uyv`?b z=W1csxjA>P7IdAr=g!qauJfkcxmv(=UX?pn3%AZoa_4Fh)7h9iR|~byvvcQafz~-c zcdiy@oilUiYC+aHC3mhCVx5QP&eZ~}bD!L~T6lF1&7G?SSLZt)c9&NzusdJLovVdc z=M%YewczU9oI6(wtYSfDR|}@jnYnYdQ0knLJ68*&&O>wOYGKs5PwreTh&qSn&ecMw^PPWpmp`J;U&)=T zg-_=bxpTGP>D-(I5{8%{u44fYf=bwc0z2JNoIREgup7HnxoWBj{ufh3?aQ-x$KL+Oy!}+~% zeixko0?vO7=ii6(YvKIcaQ;m={|20&2j_Kgz8ucK1m~y0`8+tE4d*Apd1;UH$!}Gr z9{*Az^-7}k)g4s}D<)?qKayxaF?kXV%=;ZkN&mL|*pfporAAK!c>9T|ONP*4#3kx5 zBip^R_rHB|;{NQg#E^#*kAK*_ zFFE)fI~dvJ>wYBmYWz>0IF@Xk)kiH#w4QhgrF0UhKQ-@>Xgl%8bkcGD2VGqq%V;!x zc*J`b4{?T^MYi4fEBnr`(ueBJBC<=QF3cuUt9K+)i#if*i*_X1DmoHFwk2j%WJ|8j zl-!j$>j6nxc6!-qWsAxdE=XMb=Gq|FO)JP#BK0dbI9#(hIJ8%(L;Lp{=unw@srAHq zQsFf3b6=cnI=)8g)T}owk$ND}UhY<=9!_i-cE`7VRYo!VMoN{Xd?dZSEbvu6x-#`b z<^69CE8BAEI49Y4(O>DM-VdkuL*9M&-DQck;p5f#lt@)QEt|WD8bK?F#4@+FUS>;f2*FKj%(L7S6nHWmb zMpO10RnCoS_D!T7QwcWEn7t;m`Xc%$D0J&4b&za_g|ht-XM2!#8Kmx=ZM@`~hZCv$ zTVLL__5NY8$4kDqdF(qP=Jxjk!OC(ADR7*$`ls^;BuC0&E_DrO|2-9bj#2OIb*X3M z(#&a_kZ8L`Rq|)shaWj7)tOlHNXub~8QYo;OSHA?%HOPF(LSP_b9jSfzA+*(V{_vl zC?l1ma>zq-*SxiQ-+Pr_N_hsS+?(>5lj@)v!swS=b3av9>ubBlV^6CXJSs7m_ph$5 zvXZ;zI+g9SGs-ZvEpdOxu*3*man7X~6~Rk0CEw4C-EnC~mFJm`Bb3qFc@}M>OZB?c zmX5EIg+!^%nbW>vh@6=tJd8_qe9m@GY66L!ok?x3obgigq14RxD)lQ8>A&-y%YErq#r9zZo=*EzRv zwijua1L&Ol{WB1Zol|`Yw*RKHma}(4B{G%zMpZ+)0~gRamvavDNM_%i^Xr_lnewsf zoTeCzg>C-0+ z>CvZep@J+gOWAblKR=_})J?jI)Vz=gI`z>0YvygXU7oWII`xLxnUW2e)RwgBsU6qT zr#q#OpG=_`j6VMM`Jq1k{@*A7rar#^B`R39eSG*p`uKBC>-yM-3M(~WYVE)HdoE3` zj}OoF@lp!CT_3-hv;D4iIeOZzfU z+rMSoOLMlWhquwJ&At15(!NuA_Y&o35N7bv=Y@LrK@>G(@2>pDp!e=yKdI|t8WmQe zZ))e;lvZAh=Iz~!sZ#8E_ZrT2lXf|P-o4;2ftZ2y?%ACENud&%O8wl9?ot;pgOB4J zE+?6N_wM63Yk(<_1@g!8Pc8 z?DZTHqdSRDwsbq=0V?%2XLX6X{{N%S`2pp4&GP{}{8i2VC&(-a-L^#PMRh5-hvaXl zoy$4PS(46FkU#1GZBMj~CQVxt?FZ5N(;T2?_WP!orKtR8Wgp4ijG@~wt#4LQi`q&p zimGc-np)I)YEidRi}J{KnhKqkst&iPF<0jJK-#q?+r# zp)iumlX-)xG({b&S8Pa~%CB?w%R2h3jB7Yqy9!=mP3BSZtW|DQ&!u!_ zRQz67#)7A|5hl?hJf6t42bZj~FybXP|9ce*mxQ?@}RsIE-6wA<$ThEZx4R&Z=s zC{Lkkpbn2V2XNZ?ly!kIy@K3ROlOtcrRF8eLGaIy>(X5Hr#^!?jAh-U3SC%LXUQ{H zwLh|K)Pt4?TaC8qjTCU8sF`l=@3i(0btu&g$I~trh<8&SkU)qVtPNF1sn1PtKy%OZgC*NIR%euFtoUS>HWv zu4Yx=`(rq;>uKg|t9YR-^p5)3g_zb2UeU|1(c~*g(6-1=q|~y}qa~du zOSl-$C`*>&VurqqEh zHgDwYFMTOo#9k_Y#mR0{6Io(%Udsektc_tonNNO zK>?Z_ZZ3H2{S*tk=ntXTR;bybWJAS^I6WM}seeeC3XJaCl)=EJhrjWH_=OixVvp%z zPu4b~aBcHR8&40kQlasoH8Uib9`>QLTNAAvLud~}N696b;DM~o6p>-g6T+GeQ^b>; zb`Gg1FsL_>`+lZ~yV(2Nl$1(io+93Qo)h#xMcl+b|4aKUbc&ezT#!>gQ$(EZN6-cM zYPx+weVy)X(fx=t-H%Wc^j4a@w#wucz8{fbWsX)BT>t0YkMRRtTDrBR?r^2aC*>2| z;X0P8f$wmwr)<_sHsLvPEN63r_7W@&Ae+AC$SKbT0a(v>xDKLCmfbf*)HC$HO86QN zp9f0;Oq1Xy9c3z^n(k@AsO}Qcy}~@Vy@LB3!ELXt?7e{$=BB;vIGnxA$!<`26gJ8} zO`d6pJ&d$u0$st?RL`YWrhD<4=8XL9Aw6t}ORe8>+Tn$Z`n(dg_Apu>Qdd{Ono*H1 zX)Mj-n%Gi z(2PvYgoJOgJw}Re zBE@Sm=O0ED{LBhn!9O6R)6wTsx@-HWk`31cl_}EH?b1JL8@*%WF3O4xX>Znx&13WI z%?j#Hwr1^Ksq0d;JnBN*!#lH5DwMQ^|IH+C%gVJ@*)Q2wOZ&X~MSN*#XOS>tOG^et z7i<0_E$@%p`e=DSUarCrw7j;!abaUzo>A;?lwBch>rRSesBNioP@n(B z?~7_%)qzuPTZ?%V`xYrHVien*Bn6{bqIHu?F7;E#@%)5wF6Brgrusn5PzO_D8YY7Q zFVPm%R@)j?b!B&trfRHAZM|EKIF#~1RXwRSEy}QUlR7x(kD+1h=o;NXzoR^D$q?^) zV`|9;y*IZ_@5pY`X2DaV6LfmrIRED{GLlb=9|)5{Y19rE)dqVFhWCylN|Mj#C$MFd zJU3K!%%{_iPg5}^-RC*o{-iROPCfM;6Ff(6y|BZ{Jp??gLkHp>B_dclR~?aP%|6rk z$>1y~{K=f=l%U+SVrboG$_@7Hu&zeXb3UUd>l-yD{{KT98*lYY`iAbloCCtW?HZ)WMwiLCajnI!$* zu=E!>&GJXOqdwC@diVD$K4iOx<1=x9dw^Y^najSMvfmWW{v}TH`qu93%Pq2316;5h zyubl2u%WqeBuiSpC0Aokd`zM@cVorC3rS4(|<|>vXjg@ru zsPQV6)giJ{_8VKKvCYGdqrZ1GOac1JRnIJr;Vjlj7VT9-C^}u?=u~o=y|;ANDm}&Q zSBk3Dk!r>-uvP;bs?{kXDYbZrE<#)h=v9P2|4Dc0%_6V8YAhAurEn2;;Udg?xVs2r zKY}9Ei=@=zvAPHsDgnKU@DnaVm&j|c8bw9;XSfItaGJJVI;gwKei)MApH{KMw%s{SZC++LDh+v2fO zz(=`&Pf+2dfOmbNyMRZjnDi{*^<2OP30I!(cqga%;QsCceiYsD7|E_}@hB*ut|4=_VNH=(r`_oaun|jmq!J6_(ECe6 z@7IRjUr+C81u|Uadt-=4TDvZyudcnT__)yf38D8#^ZW1@%;|PL1?LQkle&5H_$Inn zk)_|hAht#`eOqNQeUNAy@%d*QXQO|tN~~@`Zw@D!9vZF3%_OS4djqTX z5x?i0ZtGN^OruX)H>uB^mQk&n)Twj+*U0n8ne zwcVo5E0;b<6LeYQe(FsSR-w*fchZQJ4I;d}_wqKp3ILnT8{w{la zTL7u}!2{LP*~=kRa{022PSV>axgJ7KthaQW`Id^Kl0_R4Xb;9$4$)_c>vfk7^vU(- zYSK3=6%?X%ld?IvJ*E7Ya++Eb zQ`OR@4?#~_upsE^dWd>$gK`(-qbe=m@S=YdqI-B5PHs!?3M@+Q&9rvxcH$P&R&rVE zNi@!767Bo038c14lBgtJv~^+>2j zvjhz$K{LBLuxk5NP&(1SrK4>ljrTMZ>%K!hKeZLcOSMs@$Io2+zGEikvG(fqf#1H} zAFbSnx^=#*dA$=R*Ee&&L-HJzcWv7*E%JGgVjRxL@a&Ifntb^*2Kn4>kXiXdij-@XPRez6(~_N zjh&L~p6y@BX=Wwnd26m#qUJ3-C3{*Z`7H(75EJwC^8i&o)y_6+C9T{0kI76@k{d`` zGZWM@!e%h}`yEt-tG5R&tM9?&>#FmG=6T}-wOk($=J|eZ_~xJI<&N(sDOk%>cRXvM z?*-~AVSPvC865JhLyFRO9)*weJ#V4!1kiWPN1^ZO+XH=nu+Y~Z8=3Y1Q^Zr6Lc{NxiODjvw6C)z#TKO|8jf-ZsymhXfVas;;i|<>uRg zH~yiJCFCmS#XS2xOF>AqwW`@qd+7*!Ik1Np^UQU%_M&Dk?d6rQm#2On)?%J@=4vl$ z*3n*ce7Hnc^zf2z`DR=c{fLS|>ua@qE4eG13roJWnbAqLcB0m1JyurvmS<`Vs!V0d zTK!$iV%vKBa^4v2MlaB|i5BWK>Zccb{Cb>f^}(`w)>t~K>%xC_JV!yGlBk6>eNDV9 zl~uiM#NQG@%hHYLoc|6-+c<*5Skli7Lj^MbXx4bjv1CK58o*07gu-i_-3rSadwF+ysQQ^C*RjqHhPX8Lz>i16x)#{Z$4c98oM^+b>|EfjK4O%X*`d-?V-2Pfs!RClhrS8)J(b4( zLj4u0CR|Yj_wTG8mK49DIGBn_7Y$?SmZ9B>;@*2y4EkQt?`ba7SkvMHs zLQS?VR43if=&w*Q>de71ma8YvX(m2wmo}pTg8b-99Az?jt z{xGa3-)I0`GxsCJkC0=U;nirM=4Q1Te61`r_ngtg^-k*beHQgoD#x}~)#-InuMO*Y z#0wX7Cw169^<1WMY-?5hRqL4@)-$7ro`OO@j|$46KjGw(%Z@ypZrSUaP+tJ={W$Qk z2ZMU)xR&gCKf1Gh9JrOej3(jzKMtJJK5mHW<=sC|^$44fB@uH{zU353S95(`pXZH# zU_+PZ{|rUA_ezHvcJ3KgG1++E52`tsQQNK_L$zI*8a}QvwQwALJ-0QYYQOF32?3rp zj=mJPa2$R8uyvB=G3F7)ClHToo?t#n@fh(+%|Fk4hT>(N6US3{+D9C7vaa9?C8eLW z-Tf+!{n~C9sxHG!Zm|)j_(^Z(_f-4}SlhiqH^TZ`o=m2eVJOs28k6&1I?5!m>c*f@ zYEZUYuOSS?LJkgLe_RM%A&BfT`5I6x3;_W;6B!Ny9Y_fUrK3YZMU6&kI+>g z1#7$4VrrPmt?j;f1Fh|vB5DXLWNlYX1<`A}Zo`jeZFkr8s**x$yVXH~cx|^refp8E z?LMRRs9{7eFvf@VY`-q7r=SJKTjUtlcDsdLU)aO-PU`h}=W-b_k5@T{*LEAD!IYP# z^?}pz*0tfHT6Ea4#cs?0Z^Mh&=&C2PB)vw844K{fwJ)^?{Is0PLn zznrcsxK>GN*PDA}bNl`Rg3GUS=ocZ>hJ|`cIj8+*wX3MI^}(L2@K#RqUE13^hyK@2 z?C=PBAZ;gfHw5a*w(mTP@C%7?pthlc3^0+e9v7e{($t*{{d!?aZ+LV z?~zmgH{5rsBL}iJ>HEgzt5;Ky^x{@MSD4dwvwmcDwF(CP&wCD?lX_YG4odfiN5z9% z+UkGa^BQfrQUN@cyma@1AmWun9_(>3^8u$^s6q{4+@r5B4&yK$NQSv^*na<2{T~Di z-D(%uP@y`hQ1*SZn4GS-k{Vvy@NtP$>v1$Sm9@qH5B8Nqp2>j5A`_|oy>;Mtg~&=-QVoomrP(NnwjTLgn20XBNc0H zTkxZ|-EEoHKLcsY=?ywknQ!+OsmD0wYm_-gYG_}h%~Nc6TVQD0ved{~=qMA|P_}A|IR7rQWavw4DYLA zK48Or14G-2p~<=6iV19}V%~34BXPK1jNk2rdg&)uysquJMW%^jn7U(8k7}VEp?VtV zzF7Jweu?0{Z>j&=qOTf1@@~l&)Gk$i5cX00jKf!1!ATSi$~}|I-FE)(rz-MZ zK}iF6FBO#kYBeQO`JX2R&n-`seB;@ijC>a==Am#a6(@I*xV&V-0Zo8G>UShy&-BuDA^FI=>o@l<>jtcHQ?uVAiSs^ zN6G&f=__mLCdMyHh_sIwp^MzHi5Qi(&u8p2R7C9W!+wMM@4%nj9!;6a3cByd-k((Y zs11lg$FSTd`#UP{+N%SLex9mtphh$Bn};@+?KmFw+MfTPP&`eU!h{E zq2{lto%F5OzH6%a(x6aB&~RdR?|NU0LM^?_SSX998O7Js4_bpl*+0!VS>Gv5()C|( z?cM*^AiqvoYyM;@5Vh=q#X^iYs&%cs^p4_wejblR* zzfFDGU70&+cwg>3&;9kQej4Q4@ddIQ`2F?E*~^n8 zy!(E$XHBCu%dNEn2jQcIHP& zM{4W+*+Y)loZ2=dGi2Kl_tQ@3r$uXP#{3OSwSBzx{$c!ooR(iLuK$|4Cf8rE)Zg|P zSb1M3KfTL4gvn>`~2@Fnd-px{al5Z)5h5VmE2_9q({Kd&J(jkPH_xxLkpi1a4;VH3iP3h;=`p$+Jj=FSAEUISuW~g1*ciG`#O< zcRI>jTFB?F>)sf??u{Yq?i)?J<~nAn!XA~Op`CsJX0KAeVovIvd)4p6%t`&F;~bT~ zx{`h!Mg4v`l_2b>H@FTL=4{&g2e{fu2%$=;WaQ$Onxyivc`qEhqku;fyx zA7H_s(Vj^Kr(f2;_`wXR=>6ld^b2k(;5R;?D`q&Q&iyEC$9{C$;nP3&a=Kkl~=7?a(+!?b#vpArRUZ(POPn4x^nfhnu!fd z8kg2I9=o*9Y>XdHj!c~rnH-rGIq$g1Q=Q;!N^mx1nm(HroK2k`KATqR9C_@V)n_*? zsjFVLqIr7dfb$rfN8ucDm@yqbpO!msKEI&`-A&DXtOU-O0_UK22FQ(p z+!*+ef!r9#je*=)NUqWo1AQ^j7Xy7U&=&=LQP39!eNoUC1$|M_7X^J$&=&=LQP5Wk z`bt4xDd;N&eWf9Ns(LXw$SnoAr69Ky37TMz0ce?crbbZ%7Fa`6H8mG#2hb<3!VtLSs%7flf9(1?zpuX%82d8yw^E#@_OO7z%C^xxzGI*AX^PRs^ge@*qPX<HuhaHN`KlJ!b%JNPkmPEp>_(N*trw+wVa=+BzvC1cEM4z8fj>19BA`(#Qu~;m9qxWeVkF{OBy4}bbxb7U_ZBhStDE(()&5~6EX@Z9MRLq;TbLRh1^J-dhQ;tj)_O)oxcUr}KyS0hI zzC2O3u;02@2~75LDl6tKte$gf*{p&0%|86|+AC;iRys|I4EihP&p&m($tKKYeZ_0U zf}5Bj|2bt<)#azot(sG@a8Tk`uIs1bG^(X=aSDE~^jDl0EI@Lr%hR$f5p7h2JXMSe$}cab<22ZKfj`E&ce#M6;-D$pysu(V*Y7ma|Y&H zStGrl?pvInp`e)DlXU?ZiSzfk)RM>X%K8oL4pDN!@>z;Yyw_uR{ zf3C9pbJdF$RM<7x-sPWHvA8<`eFTm_>TN&2V!^_)`31P>Gn3x_%Vy23oTmntxn=YE zUpA@h_eFK**42Nt4z7bO*BZ}vb?r-kum2zYyNrHKXA=G1?j9RxLk?{(`i}a4#BT5E zdg$4%u4n1*E&3bsTvykA^jByZwhzFj&^-Rr>EHbSpo{~F@dRq`C(vIN{Vk)v7W%uK z{yh4-ll~r}zo+Ssw)qwH`cK>qge994dgQ4x3FWChU_mEg!EoPBY*I+4av4&oPC;W7xAjD4 zgbb91=!{+_P^>6!?TO9^6-)boazt@EPjm)6&yC`So+$3xtsVo+$3@iT2vs(`#=}@6A0J(_Y(qdhPG&wZW&?4xe6Ie0uHi!A(9<+~pI+ zZ9Y-l=M%+^KGE<_pP;f!vG#FuPZW3eL~(mh6!-T;!y9~5JH|GM8-Aj=<0pz+exkVN zCyJYXqPXiPirapoxbG*58-Jp>^Cya1f1DI)Fz>^H~=_3Msa$K;`A8B%|B7x{S(FMF^bb;G(0_O z9XQ&Cr^6scc>2=-=LMYZqBz|}ak`6!r#tNw=LMYKqBy@r!}FW+QHnEIDb8S}ID?hW zfYGBAXRuP7!AfU<(o&qkN^u4&#Tl#=XRuP7!AfxkE5#YC6lbtfoWV+Q1}nuGtQ2Rk zQk=m`aRw{J8LSldreY2kwdc?VX=iTP;_9k7 zWoOXsS%+>h&~4i4Qx`3)uB?(Xx-_pkb^by*RUZcDYBx(zZ{>R6F4ujyTo3f+dhjmS z<8Qg{isiaDmFuCdT#o|fx+9nCA+ubMH|2U{=S?$utSr|(tz3^L<$8oD*P~Cl9>vS` zP+hKPC*F#qCz^6SSe6GfeYqav%k>aju4j#M-EqtHm{_hyv2s1rdYmoS zb4j@#c*=D*=UqU0{mNT^g5F)OCy8=BGs>PJJrvNkAQeu%PqAE&!R30OE!P8IxgM&@ z_3%@!r-E`lyqD9cHJ1ICh0iib6s6Or{kwj?dsZ2$A8W5>Kabl?4Lc2?CE&K8C_iq>3Ho@x^AT7 z-L+j^H`4LBRb5>fI%etU(=k#<|GUy*j5-!*3{M2K*#4-cXeG)$M@){ ze%xj3d6XX=52qh&_<)XM=w8RT;f_;E$60h#uYL8w8FImVXGqKFAqVcU>&SJaQSpQ5 zZ(T)K*Jo6kS-Xx_hjH{bjsCJHYi-V6qi63m=CdWce|2QiIr)GYM@}7gs7j~ozes=U zW_EQ2h6>V4@n-s4OME?*NnR?i%js_v#gKlh#c?Y38vV_o<$LaOHVLBB3H0}K`rDU2 z{~nd4`}3+RhJAZ@`-sbTY29_$rNe^6D(!aqTT|K9^{OfDZ*pmeQ+ZFE+tu}=DeXhK zw5q=UQq_Oj2<87pO8diwbWcE)Q_54(I&9d?p@B}7MzxRMQ9D?r9sx<3Q!XFYI(*n! zyHP5Y=0}v~lS{g~4%?+ynosP)X|__D{m$v?8msEHr=PutQyLZDH!00N=XP}+Oz*qX zEDEFqb-f4a98I6A_;r6?o%{S~`g{z1J}dnB*YxMAUCg1+PoU4g94_zYzCEmc_~j#7 zcNun?Dz!@2OrL*)+H`;ER3FIHcXizy_BXHF-{s1mD%XSb`SFeBa=l8Q&!Erql`BH_ z!>QiO=<{9Zw}QIMt?DVeS5P>mc><+5?BcGjzs?S&`9imr$7ZvZDoXd}7PA)BPybAx z=hH%-KYo22fsZ5baRfe&z{e5zI07F>V89U={X1>C_fz^f?Gq^9_P<>YTD00>lO8q^A&LZRXD#G&aZ&;VC_!+_6WSvKc0TGC!e>ljtHM;zNT{? z%jYBcsIJ4*Yb$?FKgk}vB78i6j~)EES|_SkB>2~H{{CTCy?VQz_0g{l1+QB<1GUsv zFP}e`9a>xYe0Tk^Glq}*@lg((%vtdbtzRu+)obK%eN@*$>b0vrIG^I<;%oIA;bS;3 zQto(4e?E%SOa8%{o|vTjSC=jyJwC4IV}_60_~`R-2OpguI>Bo+A0vF6#K$-vtN7^h zv4M|CKCa`V$H(=2%ON)Rp$jTo+w1(*t|M4Wn!maBawYbA(I=mvzk%kj?Dy{Fy?+qSe<&sQSbzVPI)&J)TNTQF zp!$`)iea~Xf$>xGS26XsAKSZJ{zB_d&Hu&JpRzBe{*=9nzdykGQ|psr>QC7hQ-Acc zZAH~zgzX1ff9jrEG4-eHi>W_lAH@G+%Z5+s)l2%{czRz<{VDrm>hDOjr*oT^=vVjH z)zWgH^*51hKS_TPZvTaj-^yOr!1UJoCHj^92>Oc*u>RCHTm$<7>R0wEe%{~m_7{KFDb(QB(ha&sDaj>(yzvlLSJG1JHy@^VE^4&`isfGtkB?5 z`f&VqhW&q9e=+%=QDppfhW&q9e=+&f|ADgLSGfHt`(pC{Pxt@-bpQEJw!hC(-O0Va zLK=b8zp_`?u)d7HL+reW{TxbOO#aHgnEchZwd5YHopPN@^eg+_=x?CqU%>X=^KXIi zTS)dwznj#CgDGJj=XO#Um$zL@b#*%vc@tz!Fuj$d`Gf1u-6BiR>o{oBO$1I@pM?2Ea7 zq3qQ?%tBu>|A>9$63dB$GYZ=m(|%O`#k8Lb$X?w)DfA`!mA!g~I?(y|Yh*i={<_;Q zy|;Nu{>omJzuVrj8pQtVWUJyo(DtY9pD6wKvXp^l-RGju)`)ae)~>Kd(UA1zNNiuu-|Pm>ta8>gfob+z3gd@Ge5x6-oGJ#`H!@; z_t+luKhDzLHRS(UOM4lwWbBjjf5Fz?pug7A-oHM7{LZ(u_YC$aOMBN~e}koc#9;qZ zOMCyi{N=yf(%v)JKVoU`vOTuHXD#g`hWtA%?fq+Y`7!_ZEbTqEk8r=0_B(0{$F-mS z?;7&o-_kx}$o~jSd;gmJ<)2|`@3B3WztYm)HROMWrG3PZf32mx|DF8hKi|^cV|y%r z%F^C7qy~p`u{1TS-u0j7|OZ$i+{}q<@ z{<{3}Yq7NV*dEKj*3#ZJ&tc{+Ok`$Mz8}S)7jv zOMBOl|6)t~h{1k^rM-W7{`zmRwD;H^1BC_7QG3qW>9N`)}p1zt=78U4#8UE$t(0kM+Onbk@~R|Mye*^?%CJ-ZR)A zZfWlt?4y?U5rh3HmiGSI{N+F0(%v)JpJQq7vOU({S1s)$hWszHwD&K|U;gVX?LCA2 zPb}?SgZ&0e`-s7Qi>1B)&HUwm#?n5*>sPG5*DdWm&L8dnVQKFg^zTy29F2K$FB?OlWYQSIvHt&NY47v%Hmv_) zQM>-{8SMA5w3p{a>e-We#e;w8w_0rN4f#*9w2yH7`D=yU`JZfQpW){}6Ii#)$9b0a zuEG8+OMCC?{Oy0GrM+udzkbcqK4P%{mZiOKSijz2Y47sYX1Yi^ruMe&m(E=0ozxS^OgLK9yuMB?+Q!%P`jPGZLGLD>CI_)g`+ynjc^Kp^F zzo;457yJEK{r%GO>T8$T3+KT8pU_`K`PHtF!}-}6xGtAXY(_WkGBGlk@@)(@%<2b#aw_w?TXndBd#r0V;@1I_a2I~gaX+#H7f{E7YRl&~26%Dx!=%Dx!=e<6Fh zM?`O}Us8Ut&q(|%J)phwYs@x$@FZKh~e>ipfV#ZHpU(EQa?28#cPoek^ zr9WqY(8B~-{gO1={K!k zcb0yW|DC1(XljEa^R&aArQhU#XX&3j$oi)Yvj3@r?0*LN&$qtYS@mo3zq9K1bkaYH z{_wT4^q)|1E>; z|5@@snC;)>e`mG-mj*dL{vi8*d650TGRXe_ILQ9r8f5<;46^@!53>Iuv``+*_4xth ze=x@flmDGHK74wR<8$yJ`#)rm{YM7b|JXtHf9N3lKWvcwA2Z1Q)&1p@X$*2U(VGHZ za(`C+T!OlXRE+&#j!$YE@nHHtevtj2Jjnjb2igBAgY19qAp8IPAp2iD$o{Jb+5gf( z_W$KU_Fp&1{u>9`|9OM#|AImGul~1ogE>B{uelATfAuxq!St`b<~5l9)z63wrvGaO z$$w-%Ii}Yn`cvN#>hE0EE1#gW>UqAL?@jN6??Y^uM=fUE-f{?}Nd9k)?g+F`a*eJ;(XD+|oYD_W1qRuUgv24f(INw08{lH(1(d zewV-eKeM&x{VZ7ido1mfoIl$C#?n4+(Eoy^y<@O{%hF!#y0; z-ZA9A#?n6XX#VnFYiS?n{)gZ1{E4M~lJm#%Z?LqF8}x6rw3q#CYW`5Kc<`^|JZo!j z$iLIlUiL#``QNv-ekpIz^_KqR{6D{pCTl2Tyd6xD` z-p_~ax7ya8^T+zDv$T&J^j~CY?-=r5XKA0=l0SYww6u?N{BZqryQRJCrf; z?USq@bmmi?FQvHbg5+Q$v~kGHgU4EdK@+Gifh zU;a}p?UQVerlmmiCSz|9dU% zGY{l1|L-mBlWdRW_bu(?hW!6(Y3~^FA9|Wy|IKX9U;a;6+9wV6<1FptY>)AqZfWlr z@}F&KpSfR`AM-!m(mu)dxPDn-X&*P_f4-%?W61womiC!U{_=m<(mu)dSpJ_|+Q$v~ zZ?d#^4EaB1X`i_-fB9dsv`?}>FPc7}^2K$Yc_Wqms^Z$*debQk6f~9@LVE>k-eddk)`aiU^ zcMbL>>VY1;`tAP)`-r8z_vifjCtKRb4fZoF?fuUD`7f}vPa5o(S=vVo_Ny)JGadQ$ zf78<5HP~NgY3~^9Z?&}dUeB-pZcF>P!TwQ8d;hik`9E)IpETINX=xuZ*#Fzo-v5)< zkM|$;Iz#jR`mblOKg7~r_RFZ>MpCbM@Gm{jvb2wL{y2Y}Y-#Vmn!o<4EbWs9`z4n4 z5rciBrG4g)`SrJ2+Pen(?^xP92K!qq?Y&p>>%Ys=K5nqzVrlQcoIn5Vmi9@5eW#^; z#9;rvrG3WFuYdP1Xx?A{bq)3hS=u`W`(rHay_fRqKgrTQZm>Vq(%yeDfBvqeebQk6 z6-)bw!Tu6U`^+Em>%ZF4-Zj|&$kN_1*#FAX-g_ax{)a8?;|BX@Ebaa0^XK1TX`eLM zzh`M5G1%{Rrq{qrpC;|BX`OM8EN{`?y( z?UM%ki!JRV2K%cl?K98h*MGC6y=$<))6(8C*gs@x?>(Jg|I?QCafAKqmiGQr`SZ_O z+9wV6qrRy9_Sb(S2Kxgn?K4m2*MF3yy=$;P!P4F_*w3}J_x?A({x4bD#|`%NmiGP= z`SVX&+9wV6S6bRf4E8r!+Gifmum289d)Hw9pryTIuz$+Z-rJU6|7(`^afAIoE$w~Y ze~8zQBhS*h`s=?*gZ=)N_P*L!PcQv%==#@S@ACapzD#z!0__{X-Yw8R3HHh3wesOC zD9*=I4f@xCeSDL)m*1ul`!fyp9^0>)FjVJc$iLQLzaH|>9G72zi@`nv_U?(=ek_;U z<>Oj|J%8MN@aJfI_1lu_6%YP(oNrs&XUes`+PkY>@!(&_xyI7oovZB+WjmLTH(J^! zS-<*yUG;K-akd#WBuJ{Y46O^_IUs6VM}|T%U{a6T|WNK);^*0SHG{VUh&{x$9dAy-mA#3 z|9MOM4A=iy&e!GRE0*?g?*F*|sngOv!sS=LkE~v9@UP?i#nL{`?Faw=BLA?p=laL} zlmE7~Pjdgq{ddE^r0b=>`OD}0vH$OGX`lS8&PV-znR>bZkGl5&kE^)afbY)UyISe0 zH%qP(E|QC?<%Vr+S(0sGHLJK$*0QuJSPiY@LckbELJ0{NNPvW50wJ^zlRzjTfrOBd zkWf-cA%!$Z_(%bgkdOra_dRp(Hc3SJzW;gt=ikS=Gjrz5nKNh3IWu$S?pmJst@~-V zf4p9|=kH_lvsa#mkw4A$Mw4#O-)HA%qdX0xV4Cd<*6a2&oOW*eqUpAG{AaxXDw$?` z!|@;Uo&NVaY1K5_Kko1!KmN7TY+o?N{8dl0{c(r?`0;O@X8WU#{m1*y=4rM!9Q$+s z?<9Brc1*KJPo6Jn(YgwSU>kqv;AJje&YSt=rr3O zb^Kqv{T-fW`^O#m#rvP5(`^5eqklz?++6uxJk9n;o%N5uFVD|jd1C)G&GwIP(DNV9 z|3|0U-Z(|KkKe!EFx~b}|MB+!$!WIV==2{izdNVd-d!I~b>w!`Nk2Qy_63gq#rw|( zrrG{+$A1<${cd#9N2l5T_$gZc@%sD3G~4fWXbdk{Pz*N(tZ#`olko9Pk{3m&rcv8Ya5!sD&JkmvlG6z@|ufcSYN>~GL`=yNT7tE8!R*&aC45VBor(>=-o@C5xCjO#omn+{LV2$Hh zf|_#H%6M{vL*2$om3$V|fNi&;rYYQ3YS$>=S?GXmdr&hFZflJ#G>rAi?*-dO0sW9$ zR@Ey1J*Yp9y1T>mqFZS-Ng*UrhAw84`4(yUj^l* zY0VtzOq&0)1ntC48$i0O08%;*Mve3#uv~r!yt3#?Zw9Ls)yT4_(z(m2 zJRcLxVs|ootMYyg6b50&A^dsT*_%|X@ZJZi9|Vw|K`OlD#Y-kM%1ZB@pmiszzdRAe z!P^0hll=qe<9Xoxka)YLkGH_-DgH0R4qpZEuWp4`=5Hx$y|sP|{Bzz@AdfltleS*Y ziB|YoH-pE`X@3J6y~s+Sc$qPlU4{wpHl>}9zDQu!X{c(>{Ta|%3=okSqvUij=xs^+ zDmo-ULk<6HkfE8xj&9H5tfs>b6RyXMs0NhO8GM|FN8*DR!9$)q(LCW{591FR<~nIi zZ)9F>Q`B#pzX2cSho$gu^F^?0enbkdn|wpjyg~|Zm?3mvUMYn)&A)+3^OzL=YF@^| zRZ{qynMvlZmcm8Ky~U`a&(iFQ&+xJXCxlN7{BOw zl#+NYo+aop2Sh{tisx4ZeboUygDLo$=dT1k>45$K;@|M3L3RmG2`J$w zPR*lW<6EASSo5?4dJ7$Y$FqWwi5Kb18PPu-}9VC(DxnC&(X^Zo*{yM z=ztDDZ+_~b4ki3dgKUrb#UlJH$~A!59^W}25q=>AifOJP?@+{~m9mPAjJ!WANg zxiUYWN%T8O^q%TAJ|5uX2|k|3Bg4w0GG|!%_ee66Myq~-nj|W75*0LwPDZ^CkMg80 zNKie*@{@dgmyciY@fsih;KPUMQCWNx@KM6Y$$V_#qn(dVKInne`}m+&SJ&ZD;Y-W7 z88j;ILASmcN!{oz(fc?(A3n=}j*(dN78$RgmOI@LhL@g#4fUM!fWgRK{2qKKnweVG zrk1s-jnmZgV0wHZ%!Bu4df`PgN{OzlCGeqM1-hzuHV+!!FR^-Y_PNMs=*jdx#Ofuv z6qo6@63`;k@4JyDJ@ekj(8fD6YlQ7@LEg;E+Kzn62?9*CHuJN)nSX@&nb{XHe*$!@ z7iQET52}iMY{SEMlWzMOah?ah?`GZhMdpu7Ta1WG8^kOnRdsBmCwV?f8~*_`@3Du@SHt6D#@S8Rq0)Qo#QAC=>7FX+DPn<6-?mShqc*psk-$D{QcWD-npYM5s#h^yMPFUO-(kxzi zJ~-Nys5xq}&N6m8`CazPCv^V>j-b-o(dFr10Z<)l0>_Uc=f4viudjYcV-7;I`SIMa z&+Bl!K9=M4u^g|D<#>H8$LnJ_ULVczDN!762y^^RhYuPdKf>{*?;xj+HGtVyz--m) z4@ez$syg-D@O>~V^Iuh{=YN;Xe^rSi6%lUL1`1al+bYvvwOtw=+bFYNb%qu#bz{F# z)vHB&;(WtL-Ad40Au=>NoLkKG#kJ%@y}bUq+>wbL*lzo!c7K>HK6;p3v#5=rqgzH~QOtm+tg8;gPO}f0L1B#dew%+i6xzr&-aR z<|UIdI}IB)N4gf`^(Rr%_usBNy)oSBEpDg&g)t-bSHz6eUlTo2e@oOzQ*2U3r$){{ zp*|kdqNTbnd8zIY6DhN1W|6Eq)+du@F3_dDp3PvUnac ztB((#@Sx(=uHLI%y;r+>uXgob$JJ~1uA8_IWs-CzvFfn&;zHt@#~5Jm#}RG(UvA*Zc?ardf@=Wxk82&%6fDq@2_7#Pk}u zdCd3?^#>p(%$5}_>BoSj`yLzuN$XMMeGgl56KpMF;gO^eb<{{QZNs+{;KY$+HaVBjxVDK2WgxKMBM8^H&GL-I zPvYB~$vql=x7*P0T}{r82=>!1)DvOF7eaR_CuLGzzjUb?i8cp*l_%piaPfD7nK68? z%m&NrQ;#5@2OIS;qZ#BNjQp>onLXr9S;|U1oXgpNkMzHdP#I46VI+SU_1h9DxR&pd z2HrYBfBblEcoGc~9wfqCw(uVN>5+tQuvkgj-eb=lN%$3d+_ps*pE{E86V~n~v-HIN zS5e!L^8m)C&fPe3$ndl#u_y1b-yJcM-v``si-cc(77u*R3ir&-MSA~;QNCD{{?UvDc3He~01aW4I@hQfBs7Amg)BW~TyTem>UiG8gI(XGY~emp77>m)mA~7YEz7?*NZX3 zWht`>Kmg?#kSRC~`2*;GV#b)c3d*0bMx`wHCAX3vH?y<$0Fqdl;!Qf)z6)n7uf5T3 zO=bFF`wb~yVbiO6?JMnkNsrkpB)!T$P139FgOXljUnl8D?fWJDn9V({*S^+%L(=Q) zLkM70y%o^&)cPv-f!1S`heXn=@;ztC4JETxTFu+ z4@mm3eF5gdYd>ONE9n>Q2PJ*f{-LB_vfq;Q%l1i_9rU$Z|h z>67+jl78L(jileO&0My7%AO_ZH|=$je#<^X(x>esl78F1S<>&=4@&xs{XHjrL(*sM zj2Wc!tX(eYb9S?n4oUjF{b47)N7C=wPdn+KktW%;CpRaLnPg9Hg=A7ZxjQ5?%ah8n zB-wL4sT6jSUFb=rl#}cQo>YoA$u9P!>gJ0*sk-?RPb!;xlULa9lXRv173zQTD*LBM z=d|IGzS=YAA*fl_t?-N~<+eBVBD(;~u{ZVocDtmP*?(Z8)DPQ9aM0e=EA54n9<$d< zdX>Fh(yQ%WNk3{|CFyncy^?<1ep1pK?O#fIll^Z=Z?@;oBE4Je4U*nw@0Ik^c1Y4Y z?W2<3WnU%f-S+1sy~ln*($Cm$OZr(m1FU;fPuP``{w4Pk;rk!Ce}WBqQ{T>Q68OJz z&yw`txlc*@PVP}j-_5-ZX;P};$^A6}Y5VNIr7`WYFPy_PXx}DjkNpKnd+l#a+Gqb- z(ti7GNzby=5r6Wg?YE009k91bI%xMxdba%mNk{FwB^|TBE$O)Z2T2dusd#_In|8=v zDCuE)ouo(XdPy&`Pm}ch_Suqtz`k74i|v~vy~KV%(hu1$O8Q~@6-lqK|BZCPH7Mh8E#6r(`JDdEaJSSEDK z_dNzaT2OIXxU!fn7ct^~Ng0G+isIR*JU5IWqy^#fpFtc%xC)gwh7p9qjCWyIS6=|} zeijvvxRv$_oD~PYjMN8ygcfvs7rPa@)|<85z7Jq;R+arFNmtn4lys%dD;satYCEf#=^A^Uq$k@; zC0%Q;l61ZO`6AYzVm~J72K#AAH`+gxbd!C);MLg8Fb;24oqa^$o9!zk-C}=2(yjKV zB|X)y5&Ug-v!o67X_7YDy^=QDzZSd}`%jW?xBn?=tDPYA?e>Qx?XW{gjYNH{OVrWU zH0tEK2T+l|(_`C^&zx0UEl&0(9z`MR6zFC4LfdQq)7FcQ>9O^qV|i>@bW*=a4XU{a+VWK{CBH_6(G2J|OF@fd@ZQ89VJqF61I-IYv3?| z`3^h|>aKu|S{K94a^}sTD6EH@6M2+UIJ<7-kL_EwLXIGb8kzhokG@0AP!lFFiwj{`x!6Hpb+Nz^VWGEffjH# zV*VN<&s(1;el>eEIB4XZA_dd1z6hMW4c6b$``q-rTJNP001a5TsY?~()@?RR!4JU$ zCvS_j3}|T6K3={`8Uhd=1{1q z*q`N5CSGIC<#3vL_j}W30hUmJ$41Je3K>uMfddB0)rqF{!4+`xC!>()NuP@qB~hiH zz%UZc^eXt6#B}TY62q9i6VjMfY99pNro@x;UV=A3UBVGy))b`AxYLvV1N6$nNzn*A z!d;#e%ExaM(c#?fkt@>lbffl%z?yNt$9n{r>2=+h<;@=f19`Iz9%SbI59CE%Fy^hn zlE9of@Aq&?+z0sQ%~+~)>4w!*0(X-wdNbEQH`TKZ!rF`@(H3)VhIc74#jCJk&def- z;=3U2tfY4!H*8$M&)l>G(Gqh%6l!j^Wdk2t(g+%JbG+|>5vv*bdA=NyOyg0@`W%;zxK0YI&CXI3)=Ocd`Duu;aHABqnm)*)uv!W& zrl0+6lENk%^-lUrCXg)uXM=jT)H{TRX_ z^BrvI3L7)&p^lm#gBvJpN~24=&@5o5&Hj2&yU1Kh(%aK^qi~67lfdqjgCKCFc|Rmv zc-o9E)Ldu20=X5Qo0=Dki)zkn|b~51D6CynBVW z$IW(VWZ^#lC#3Oqx52-OI_T-H5}vlH4}%{qDLE~?o$5B4Rn4u><#o1Bc4)Ok9OM)3K_{2iJt9@#ZVg|i60 zSA%^$5YzkyPZ|Zeia6K60z52vSTqu-*uGv!dw#XX;vrv)Ar94d3XF9AdXJ3cFtPYB z68N&3ZwbY4mZor9n1bY@IwM8jeMJ3&=8utsXled{!g^HKF`6KChVKIS{`oI!IWf4P z`4hs9ux^FI%|FST{Bfid7DEquDl~$xf`a&-rp$PRhgzZ~=3ByP_@gGzIBrDB9trCv zd0lJaLvN%7Ez|B_M})(o_l&M+ zHYqB@|7YsYg)++wxJ39e{NIKvnEwf>Vhkp_>I@EipAckNCYoR;+|m5+iwZJQ6V=N1 zXc?-qOsRV@+$=n?9>R=-b3tJ1*r2g`L4u!oa}m^JL89Yt|A>WsL6Q_qvkMIt*i!JD zFGIWwlBJMr&Vd;%NRdLi`QUOCQl*e>9)#mrpqGO@^CCEu1?f^V+dLIhupmPU1!fPl zWI=W^_X)-3g^=HZoHQzQxsmn~diCE7=RE%{843eXGEBoiyAsgzL@o?RMdTtzX!s9< z`}rRbkuppb5sp*eNsH)}_6%RexA(Px`S~Myrg<9EGcCC&!{f~QAHY&F|3|_gBVUoO z4BsuJa+N2Id#&B!I_8W7xEzk&z@=ZW^nFz%if#E-mAnSx? zZ5e&cueCKZE+{;}%U7}CJa6(+q_kwl3Z1&t{gA=@N9Hi0I2k_Ftdp*xs~?)dYKoju z#YneC>OT62pU+{!)(kdA2JTebC|F-LzB^cOZ8W0Fkx#( zETjA0yA-W|KZglhGmshGw^Y9}g9%$Rz8Teb@*VU*nVvaJ*_?6DNauRaG*Y@}29ZdF z=gSBS&crSxAJ==b86DucQ&Z7u`77*r=Ksr+`(vcssPZ@(sdv>QYbe+MFLx;u-aS-U)BE z@N_BcG(X2S0V(Vwi=5A6OkizNar$}v33TGJp+!B<| zN##n#u(M2nY*&oM=ff#1JTLcm04Hz;d}|?zyq{}pGNAw-K8%D!JnNGyAlkfNt4yXe zDaN5Sg8w=QEw4x19HY{jyr1fs*DpSpF=_{TAE5&o^jM5oYpCzOC4fHeP31O~0qn?e zN>olicoH*CWr!m0C2uNEri^jx5s@Rqmw{2_SzZ|}l)firwP@NjvHbz{cS;}P;(aq!OjmY1=0 z3E9SvW?L1d`nF18)Lk1#;oreU-g-R?`ERkXK`{vLk>i_x9<(~|fC&3DgbF*%83~-^ z)LY>a^M07|aU>Kn!}Spy-9>5v)Hm;ep3?}ardJE1NzaSXCGe~}g zmI*`tdS#?PafEg`=b%K(gt4c{Cdu$MaUx#!&gE&J@u;Zyl7BmSI(q?q218W3yVMyR z?H_Yfk+6nAt9VXRpTa>V@6CCSA)zy2Kr0@{zle0sm4%jpu1LM%{{)#jU!2)Hu~oU* z*nXuiN=jb@e_`Ga1{WpE@eMD>!c-Qer12Ds=)|*Fs~4qu*}UNbJPMblp7b@yA>m{+ zOyJ2@LJ2&@NhkrpO5{(v4?CQMGnxAhjj#_nLFCnkAZ8iX4De9Ykx3TP2v6YIxbedn zPtmohR|Am$eK1yZx|jDO9s&&iEzp{xheW4&TcV-9*C3#xGxdz}^27ljAgR3?%)1na z#@QxS~+>q;(+fV3+pwF8W-$g&PX8Bz6Ol6=p#xjlNT~tD`>S2 zg&)ID75P0fBHq;K8KQDyr@>BtrDTV~+nab(l0o~PC&Ou)0`GPr6r3(9pwUIPW|Ega z0@l7jyN}KAsYNv!ArZb`BQR$qe1xN@!J{a{E8dIOL=NHilfR8xDBO-|a3LegMVlQ% z=DQ6=Ltb7Y31f!;XPEM$n?%68QgWbo765u&puAv;48q9Y16Ng)>*alu?jhd`y(?<+ z@a9SLN)KT84x?Purgvt%jf&K1XDNH9#Wh$oioPlW_rD1nDEgkv4zH_Zb`0M&#CXve z0Ql0aMcN6x$w=UZ)e=6M{46gK;2xB{#YM?-aap`HRW2@zOH<{7v3O-N9k;i5RWiM? zw|GtRu;8yr=4}Vdyxd^=h?DZ_f@R)RFy+Mr)45K{YX_Ej%it|OIhhNSw|H%`T#y#8 zOO^}L;`PaLL0Y^aSuQ4#^76rpR4z=5tCQuzw74dj3x~IObFy5R7H>(G3)AAQ$#P*@ zd}^{>m=rDEpAGdi_+reWVt9UZb_Dl(&FvOa#32`mMj;g#qG)TnigM> zT3nd(2~gwD@7G8+n}0Sa>9f6-s-FJCGGGkzy?6 z+OYT;-d(6vIx%$sGpf{|v4WXuG1SCVi?9~?)jN2ms|NrtP!|^?f~oF;_dlBXKCH`z zC-Zus8Y=SyX4^0`zq$m8Kl3~ouaTblL-;(SAoCdlH)i(1+>E2Mjk0M0F{wFG>9d%-L#L0YVCD0GKK27{-{Y{LtYv z)e4&F>Pn0~L#4rtGSx2Rv(&fIHd|Q`TaLOCIRH`xq20?s?>V$xkB9yiLF#Wgo|3GR)f#g>IPu0QFlTDCu84+Yev-#&eti17T2k{ zP@nbc8stw=o51-7btR^7qnd%fs@0ho(I)jxjG{*U9M4)c2K+j;82oHjIq+RuR37@> zsw&V+z4GB0e5$$>oNrU-U_=e-Q9v5ikAdH$c=^?=HY4An-p%1x!>$5{t?H*}+omo9 zSM6#6B-x>opnyBnGVrrg{Rz)q>g$;C-Re?|ZjX8b^iNX{K$54cbD&jcs9C^2Q~e(K zfI1g)-mCtBe5cC8bDt{0vrDbSvs*oYeuJtX)OwVOQTM8in5jPXGt~C0S3v(PWr6;F z^=DuXDBAs?`ZDHdNR0wAtp12rBkFbVe72gioL}I&61pBzXFwWbst$C<)rFXm18O5Q z`JhS$g+uDk80lek2lzZk9a_O}W+gz9=c@0b$Me)$P&lIg1bsVS{S$L~RQ(l@3)FH* z<3jZya4u3aA<6fvY~XxAodbS8sJ;ftT&y03+%8dfVEw*SZNl?1#Q^Y!)K4+4%hkES z|FC)3SJ$XP^!QOV0{%ay&IbS2s%Jp+ zI`vb`^7X0&I`DCo3Hf|N6@u~&ssy9HQ8l5}P3lX)xmoQ4{&BSeBfUi(1?5kw?U?sl z72o{1O+AQyKc#*G`nRit=>5~G1o(HT49N3NH418XsU^_5yH!8>x<}Q5=g+9WfbzZS zkAQzx-Hzu8RRihWr`BN}Kc|jj7Cx_dwR^uh6S93kosKbnLEVbl2h|WLKcrp*&co_q z$l($7Bxrt7{TTZBsM?9Kd`Ufwe!r|10P>i67B=#@T8`0uMP)&TUscaSGEb;sV17+y zgYzd<4k&+JWkUYnPJNDSReb~f{!M)eeZ8fw2IqfQUFiKEY9;8rZCLz{MM<8%oT8t!_*QO7 zzP@+lTe&4O^Gq(snXqJ`b%Kd91XqHuE@t|SZ zn5nW#o&O)uEL*Pg{~-RlJh{8|6aN%_-QzSZW{;bQYQV7I(J=~}>+n8TQ`@>8X-(mV@lR=!QpHkorUTjdSOZ=g+$IR{Et z-k8J}Bo5Ua%eNl`t11L#FjN;5+oKLcVU&?u3qtG5clv4FrU8{H-z8KHvjdRw z-BR$FjV$buf-*nBE>4qz*SsD^RDOD@h{E)OX!)5k6u)^FgjybuLb~~D*lhV;Ddd?i z5v@}S1=(YV@nUP2P%AbUQ-0ktl*MK-2N{&YQgZ=odZbWd-a*0iN}DqCB`9clpA^c? zr^wD(Lb}5A!raRDC-K#eHO8_IxDd)>sAwsMelgU=R9SF0m1-sgyj-n^qExAuF}M{f z1Gp>IbLexG`a2AAwfZY$vqt6Nd9r#0hPPH#0CSz%injIY7$)aJ^(s_6NxdJVv(<;d z{8Q>N$oiYA4b%NC^&({Wv}(nSd|UP5`5pB+P6l zlCU4~x<4nFvKD=(J3vF;6~`j@6%5gnk-~#bqSyW9!<0M0RF;E!)Ipv9IZXciFY@s< zJbYh3w@Y8ryZTQ;BA$z&GPt|Vz^34&M9S#)Y;SZ=yAW)+2etuD- zVx~<6{3nqnYg59nOI0pdHnCcaMS2k8CHxZ5l13uRBhq&qV!~w*x}V?IsK`yC!SIS; z(!TwxA&<&i(?12I+leFxMFxj-07Z&YaW`s>gb~bR!Y(}ge8qhEdWj=F$A;2I(8-qJ z^TDc%f?9}wAOcS_a>&Xs{CuUms?Z|3A8M)3UVQ(@@biuAssgE+A6w<)8}&taqn^#y zx^)?b?-Jzmjw|7%m2lyp<>$}}Pnl5K@EefE=k?7x#rJ`riYYH+iCN(zIq$LK4JkLm zELS?k+Zs}mVFByY<%NXMm5rst`|;MD;D(Mirtn*08xlyx8+z$LN)slxI)kpn8#>XL zax=X6rnG?69&Jt;g{*4R=t8}rE1OdIYJ6+Lu+%<2zJ1jznyKIE#F&GM(tcx$yk6%$ zc0+^F`sk~=?zs&*O}Q2}u_KvN>pk{~hLnd2uyd2!W_&fS!HI3K`!=%wuGh$6=j>6A zF&p%;=6tvOKBHZNL^(blsn+~JcjAM#@#DGSJ|K2a(IM6HYcxF7%*HVMZQs{fnf7#5Eq$61YtoNoj^%=x5*d0>idX!5h9)APcj}T4t`{^^+$V zHQbCt8^d*lkgdSBU6`lI7bcMNoH#V!0K}OqoP(Mptr(FYROgkU=DFh|R-xAs>SZ2B zuK6+5Gsw9JHjFS+4^^b2hdRq`;z*2)lgZf`o`tDdws+pFdFk+ub42_yzpR}rBeyxR zoPl|9BeFRnL_$R+9GpU@=*a3Mr-`dD7JP9WC;j#B!uv)Tmxq?pRF@Ea9SZ)r{qs*E1;hI|E%mq&L&@-#WE`XVdhC_o~LM~F98 zx@N>AuxE|Kg_%3XkU$Cf9ri_!3w=fT8J^69jd|ya8YD(n+C};GS<$sg+W7H?KcP|P zN0TVb*5XOg2AmpAN!L;KX(9pLcXE9e$C4gVJ(8vRWkjTz3GOjPS@4HOcC_TloYvi( zc(CUA97mX(3Kc6aZ$w^ZF{Ca2OKin)Y19hWYY8aQTf&6t@khpldFPN^F^V2XnkGeQ zVxgbnu)}i`c4gvT;wA42)#IrbkD68pi{N=8eS&IaOcZBkM4VY#oY^L9;uM>D8nKHU z5d}PCu4G`MGbnX#{0!ICI3v=6pDDWLh>YWQy-QeRuJ(X}tR$ETSKeO7x7sueGhX;s z?1V+;!g00~UP4%Su1-6wXzmgtlbj@dp(*>a-6hQxx#MkIbxN5qovtnmdF=*7m$jy+ zi~4DYLLcqY;T4*Z>54LIjdqVPYAABN2g-3LHaAK|WZj$L+EE5=EForH&2zONdUgs^ zoXK%I#HcYb?$pkXb?kE-F*{CsZWdmW)(SC{$|25^c`2N|mOarZ3bb(iYYWRAi=SQS zq5DTn&T*B_3?X!vg(1_W!P9f^upq+Gr5=D6#tbbv;_qE2U+9iGW_2vmJk8Ln(Ip<6 zd=+cpTz73=9A?K^ap3mDn}VgL=aj+(yU=vBztGFEE)$z@;f3Xtw~rOB!!N85kQQ&L z=)Sudpz@bZG`w<1n~DLEkWfWL2SfmsC_4)gPhoM(R8_QFqj21XZbfVb^-V8VE8{Do zm&a9;Rq_R@)v*UW?S7A zwM{GE4;v3lA@0=I8OStTnuQxE;OVlVfH0*IRk_Se~1$_HuQDC(}y!tz{X?^r#T> z+pHuto@Hg-Vr8h)GcBd+GSvq>S%9w2v=Y_2EX%XoYWE&2wLIQLwcKOvP{rBPBl9Jf zOtz2#8$142biNo%=gk;0Z7w@Wzs2>NGpdwrRys$OdyAFLQCS=n$)s>p$->T?R$CM| z`$5J^Pz$ph(R7JuysAIT%HCsTsuqf7U8Y)3$)Mm-tFo+veUMO5mTJ$k{O`Ax?6xY^ zcOc*7b=DGc@`hC@3|$RaHF946l~z4djm6wLsW9IVxT%P_8*m>mJDG+tee0wm;SGT& z2<9AMBm$G2C93Ptmi;BFk0DpcoTiS1y=wSs4QD5Svkwh#(ST%~_)h7y%-xpnGz&jv zf41!LI4kC&4I^Q{T*=_#!M^iiv zv(znCuD@5UhIw${Z&-6wO_nu_d4DDZv?*H~5@yo7?YCCaH!XD#Isp6f^jfRDgLEfZ zs={NfQ}gpDkj~Vk(>3XQk{0>?XVUAUNO!CGGsPIx%kRZ(Dwt(QKD87|?Ng;$miK0k zTwM*0mx1GPtJ{0_I&ho@j#W{nGm-qQElwnV40qCrOy)#B2m${cf64Iv3-PxBfAsI1 zOxMTrCm-qeWnx#|3v7=(t^!j|r4j(X$Ufm{Mt5dRs>5thiM1?CJC{`#VE1dpVP`M8vikMhAU z{3cz?2Y)>*;eO^GXYQNKQOOcWPf_uF)I-s^gzp39qpJG&t7pDH;*szc9=0FnB%8>I z)Y1gz>VaN)Usb!Tbnl1GDQ|A{mpRe;J%+s*~XR$gb3{N0Pm1VUXwEc>_CQZ}3?Xp1tfVznmA zn(da#)ut?Kfm2Ul=LOcMHdWcamE;3bZn}@D6H@_)mfyG1vPq z)akBMbz1!t(wa&w)!Q^El1`Q#qd+E6bvu*fp^eKNHg^ znjfPa|2-sD9Tq^>MYS`nC2)063P%g53GN>p@booe!z)&U!ghN*bj7O{!V)C|^{iC2 zbWNx;{d*_`6B~)io|9Pu&M&Y~nviaBrnJ`2Xvk#rChw<0D9Cd~m5dzpFY?}dq}01; zo%eBL9em}V@O@GIc5=G+qv!2{fB&mehdr1bXTuQK(^OFr2!uL^`p5du3655*t{)l; zjt+GWG!Ax->yxlJORHVxNkeyjF%cI~f2e{sXBe9uPR zonxJ7B;#xw1BH%Iu(}805T^8KyE;cYyZXlt8-mb2+SwH}+N-w&YC785n;VVRVCTTV za90$K#{TZsVD~x0LqSboe`9C=5PyGve}qC~=OJT!WNeiDZi|_Z_hfiQaByVoupVYy zv&rR&pWo~q>-%rzQUPMnj?Mun2-IMr*w=OSb&j4QV(4hv*3`VS$=F{T?CBgI7~9-G zfN>vcL(_?at0<3%U_}dNeC)qvt^W`hil5|YvQS)1C^-oBHgyh8!o+(@xGKakA275c z>RGKB9vbWK9UmSKF^9C%cS=l_r>C>ad(g~s+H9UC7CuI~*3 zyT1#?&e5*E^@mokELmAqP|{ma(p*_kf?ot%-#aue?Mr%E>T3#0dWMEe_Ko)sjP(!c zLhw*maAd51cqpXHqhn+J$c+yj>>uhb8SC6P5M<4P{!stE{sAcJ`o8||?x54Uf26ad zzpDobT|Ffuqr+n`aL`)cGd?h&=?xF|kCpU{LR2Lq!j-A48P}` zt*Q-@1+j}jC%jFdAL?t2iK&i^hx!6^4w{WE1H=0|2Vz(d>xbcwwhZ@&V71+i!NK9t z!;Y^D4A6ZEPBjg^Q^w#}cHQXc@MvQ&6zc2^ZW{0Df#aawADL(|6GjxRvuo&2sv8=b zYwF-I(VuqB$g{%%J*JV-pbTqdc*Ggc&f(E+_E$f&seddqiJ5Be=oo9f(Y&WfSG&E? zm})w^`hpEmdl{S-#pr0~;hN#${r!%U8x7KMCXDhuJ6VNB!O;VBG5?(#T$Zst+2o7TimriR=O_iy8XW5%9k@l;sTr86O>*yrZc%1kG&~fr&Fb>B3XxtgK^nRb3 z8(TxLXH2t+O~Pm=*824mIEc2S%5qFXQ}EDO%mhHeWU*-xBsAqttaY0s`RT0ruIR;1 zxoM*eV;o-m2;S33t3n4mN9tP1fY`wVw%@b$O6?bD;el={Vtn7xlUGrR$*UP39SshR zwRBA)>i6twm9rB=U*Vx|9t}D+3b)!d-aSkkhBb$R?ZeG&;-z7jO~C`fQA2N)-kU+0 zUT4Qs2NiZVNwVQ+?;8zvY8!WzDsH~sYcIN-``!b_&i;V`tVNqULt`DX!oMd&*zB}y z8$1ib9pCq#q+3}vm4AZ7WM9dy{tJ%vRxEG`D}gpII=~6GXN1>v?it^6G!^BMeKi)s zI0qQ5DbBb#@WDyPJ-I1$w!!UBYD&?>S2@0-uB8jA;+7TB@(2^_zt zx`tPk_;F6Y2+6iK5Eu(Pb13g{hKh&%D+sF$7BfSZHcYgvV-qwqdLWUBYibKjF2*`o>Tvh?K(M2uzV?4% zrICd;UOT7MIK65H24P~O!#&1+ch^R12|GK(*}~G2G3eESF@w$|Fh16^ymBBIz-|J^ zW7MK@d1X{>#mY#nv~VybFH0>5bsY%s|6vFYg~ms*N0TlpR)UJ0UMf~a&MyDq%)+C* z>`m8qc6Y`OpAzF$WfhYZ?1s=OG!-(AaR_fH6*)$Y>-d7~MD! zI0BT)NFM(wUF67tIs=9r;C{>?wU9;>Asbp39UK^Ygve@RC>ZS4J#(tMhP#8~JaS-_ z8SdH-SrdpU7z+l*yGH~V3`6z}LufJZ;h`azF}8(6fu7F6{(-|r2&=)^FzJyuP$S)* zZh=eFL4D{j+L~*&1!}jnRyP_PbYKMbBZN3XMyS&v2nvGPTH7eK2>c8iePcLO8lixo zN_A6n((U)iIxva_?AS_;i!72&bai@P7eY{1L4d8PzdgD3~UB*^3o04+FR=|d`d|0MGp9R zai#)rYoI8)MQu$@3*1xN*mC@$C>&K=O`xG}M_t46KuvYc*1AAj{T{AAx_$t&&@~Rx z_H!pB$n{O_fyU}xMo(`L=PovHtZr$ks|{?fZ>VcC#s&j@!{b=%0@z%P!{9a#40n#L ztU6>gwrvTtwzW%>nucwGc8Hp=oz?a2o10sko6s$&wbgIg-ci?4C!GZ9n*&s^t^?37 zRJL!$aBBmt&6^N_3beGMy1r>^U2DB2TU)oIzNQY13_21_e+WH8cG~J;Hvmv)NjB7Z zAQ<5Pi5HeYl_P=bHcYdCPi@{5sA+C$Z*6Xn@{W~(h89q4-n@Bbl`$~DADnOnG&p=9 zXdLVcb%jQ-(*v(HTdP}T5FBJnUEMYq9}cuZs1;f@ic$o7n1dv#N@K$Vnw$34YL3Dk z7=%CERk=I>;$y?(m=X}*)!b6o6xe~iX?=53c)DuARzTYc=RE+U85ckEdBi3#a z`#&Rq?FjV2o#ooia3L`zEP-HlztK4sID5Pwl!Av~;go3?wy1&7;lX{wnvu5Z9hiHp zC$1nmySiYWB8fhz0cSKU36`o`x9F+G#14*hjs|+@Fj&)G-&oh&(GE)P^z0L6Q6&^M zIkQ}i>W2EZb|h59iVFHf95H)Ih=Gs&AU)L6k0k?58#h6}n{=1#L~D?!PD^WZdtD7w z$Ca>5f+OL^?OMOs1?jZZ*JDcB>sp&&_?U`AJ)?t=&+x#2$OS>9u0VHxFM|<2tWa46qq|mW?+19C}JP7WC$1Sy942d=n_jE41{4R zuyC-e&lQ5CoB|PHZCyiqby&+cS0gM8#nkLJ)$M9`c@A4TPKO5N-dxk%5Y}Ia5rzPo z2S@v{Y{;|&)-Uok#zO@G9EJn}IP-)UorC2CVT~f)nuhv1__l^-(5RJWP=Rna*geDAAo@T{b89=@Tz{w= z3oXfSuE%_c3`P9#rl13N2qugJ2S*s{#qfYw8K?=5`5-PE24QCaPvX^F)uhRd1iC^2 zM8LX&@aiHa#8dZUO=jCoHG$gtMwx*@+B6#s#Wc`^+gjaj9EnjtW3+Rqmjpqjp?M2N z7M}ir&Jhi7+ggYD3Iz7`(2L7PLkz4MTe5xQh-DZ8ff(`&28GYc2u)Bt~Dc!?FPDo2ssZpJaUz)2-NCjs-eEA zPA^qZ8!kQAp@<6>HR|t1Tdv{KO?7P}Mpx6^*jU}94eKD{Ul=xQqoKMS)`mrudSu7rhapMO`z3SB`XuAgv-(3 zh!Mg}>y@QxPhBfi)%AA=4u-lqhqP|$6=he;mP%nOTwESotde3!LvxdMzcL(>MK?^8Qr6BFi@NzmM03dMjp-viutbQZm`i2E8(_voeTT*e_rW;{$E|gN+Kv{n?G<1PjiSU_k6j$th}pYorJ(kN zu%&>h4LWkE3}A=Vj^Nx5X`~lq$Vq0e22zqGWpEfPD0Xi+=yZnyA^6;JcnH{q(K8Yl z?&%>>To7W>5m`6y5Y~i-a}OZaF}P25#l&$uTTM#`&0Lykkp*h2+p9NKw`o}P+UjiR zBRU$2ngJ0y{d#@V79*hDpq3R$aCeTynd7F5Ap_3dgDT-{X=^uQ$#b@)%PTR_TLL{; z?l>b+man&s(^?)lu{PB=L)?M!5Vw2~=$LUJ6ulZW!O3&QZ*FZ1 zG&eOg86yLohh^@=_Sq9PcFZ+=RiLe-g)0!ud|KNKH-rfWDGztYI27zf(A{0&dk(^3 zinrnJ81e(lT6`^VoX$GxG6h}6t_K6_I@B4_czvo7J$Hmq8KB$eUKU5H;Mf5iHmAq3 zjxBNuj3qjUOLmDxuXlwetHM7qt)wbV+Xc4*er{wOK%-*TVcPHJVoVfo?PqF z=RgW(+kZYotkj1`-WFg`9q>efEv?NREqYXyvgc~3tF7CtM~N+ybQ{1y)Ai>vs-`-a zmOfkvX3N&yZ2?*Bq^R}H-K-g02jpa;^`fb|q0QNLV#$D-210mg1cyviH^OwaMNJM}H?W)?R!v9PDLXr&EeOx*X~3GctGzx7+noc)&*^#IwW)1I#2gUh6P4x$ z&Gm3iS}R1-vbUs*b|vnvF!VRiJ@#xI zPy24hm>TOEn_G7Wnm3&aBXse?OkSd4e;&5)dUrf^VkZfQ+8ngdHjuxfx2zGCNOv{)-WV-)arkOPCRa>DH% z9_JZHVn2-O239*VGdc(N_2V88dt)p_kg*$5a=4~y;Y^Elqq?@XHGHjGux}XavOcK$$%5TOs!TLA)*^ukjd&#f@SD4+c6%d+`_S)GS0|KZp?Q2BEEWwH;WLw`gI} z4IM0(`0XV%QNJ zNKcS46|sk|PEB4MMMDb=H@tF7r`)Gi*VHt3G__L}at>>6#qKFuYPHa$){dI?W*io9 zrmEIEtFuFlxs!LtG@ZZ&7D(M#W*y-Leeh4)J>5I{SE($1J9KJ6aW1*XG&uJ~NfCLyr$dEx=xM@|j*TNixRjhkg6e4>0q!Qi9bJ{Y*Qsw0^d6uMI)$Thcn9R1!=Rj# zZvNtYEB3CnLqNr52(L`V9kZtqX4QhP*;?O#)dNgp?;-~gh@pDNr2CwNlL?9n8iiLxc7~Pppd3h@p=&L{38J;G1<_e>#i`tk zBY?;r-UHl0&P}Z9=ZlxTBEzMdRKp)LP=TMU3WQItB#a$3Hoj+%55ul>L`;~H_)+*e z#J&CCOM&Bjmk!Y;h(zB^7y-HVbLFECaE;g(BJQDewXQMHguSy~Ht-H6mMG^aU7=ld zJ61Ry7T_2dB8I2MjS{X1B<_UU%F5LS95s3bn@}4$@3=NZmn%I*A2FOAjXsTtxDMiW zu@AAM-qFsHzW%O|(Sui;pe5+CeNW6np~nC}U$d>H8POpO7BAh62IP1}e7G&TADk|m zoI!GJsi}s>Qu;ztd>EFwFr;la8a3<4%plhAA*>L5BQ?CfyZ1_)p>$gs+l}oV)eZHV zcZXLRT<^r4OzN6;aC%8A5~+Z!^s!y<6>C~|x3mjO&S}$$1%_RcE5`8X^i7iNJ#|!? zW9o4u(lN^kbVrsI+_Um33g!vvi1?^)*j4c!P=IbU$Jwsx&aeQ>@ehsK;;aPM$Gor9 z{;~_l1ATjh{kmLRG)4sxhUJ|O-HS|1TU~=bZc#WrvMtp&ijGp?G6rXP9S)j~J3+Lj zxs9<9yj6f;Vnmqk=`Sox4j%#QUG@5?24r4=5$bN0YMOahHLZhM*MWUJq|u9OC!ym@ zh^y0X4#=V6DO{R!*c1A*I#;?kKeSus3HB(Mhy3(J?01OH!6Ya`C2R$+f}RjZyML zSZ+Z~dj#zh^-McH!MPt1uGy3uO~eE!hs|<{1OFRd4)g^FBWPM6das0q2x5{wJiya2 ztBP_Qft>JCtfEWk1UkVte1&njLyy{gxGxCECR^SXk!x#Sx7dKv}@TJ9khc^@LEHdcXV0qfWt2;fInGq#3A9J zj?wlE;428y0{a=+Fp!NlV_EZmP%4oftMR+rl>% zn5@XkuTOW8!?DbF8NW}`UDn&xRZ_9Mq-V>j6|MblsbYEQ^3rk#1K&;wtgI@5=Nms% zf)iKSKtEqA)!#-alNazxOUuIlaOpe|L(q6tOF5Nxjf@y!d}JnV^4=I>2H+QQKQx55 zfEy@&L(P0`|`5!G2G9VRoAr0-9Cq)RW2cCz z6gb~^MCSi4KE4GMgeJzYQ-)X4_*z;luyb^zQ{E#3K6pbzzCVU+zsu_|3V72GYzs7u z=e*Je;QyZC5Z)Q<3YPH|2C0v3xRES!CW_)zHXgdO!Q#O5>nTq%lEv zh*Cy}7c#mAad^?eC0Gm94x1UiCloU9@{4@W1JPs*YPAfP_z0 zVP2p=Mwfn#0WT8pWiz~=q3@Gf4b2v`{$T^0qdne{Ld%%9LQn=~0PhAmG@+e%Z-$PV zP9T6K5EUGP#sp1dB&08cL17(TF17p=Lmv?Vi`pzoi6L@iaMZvTh2*q~l5ie@jtwHO zhk=ZH*hQ9{^VA`zVo`G46fQEOk9nFtId&WgSeGxjVY8xDj<^zX4Cqse{t1?;p7@Cn z{IvG#@5a~Tr>ODMRHkt`el>%i0(s(B9+6Ilk6+uxuY{x<&wa{4bdmxGZa6<4<<>5D z;2Y!M^?-YfS;jyyezQaJk{BJ5#}7}QOO7L-bCG4gN8{*R0=UP>HC}pOEdHkfpN#*9 zrhtFNq5sCWk->-KAd-UL7PA)!}-Num(K5|pz}K5 z9wXCme|Q@|&LSTlhDo^l+uJUDrUQ3>XxoJ^b>MrqBZH5A;=h-0;K$?O#~k=eaqzF8 zE#**7g80PCr^$i47 zdmVdm2Xg5Y_%{eV-FW^fjald@#2r)Me`yN%IrxR00`zMfjg{y3fS*B5%Qf89w_i;` z=T*Q@a+!`wE%=?u#+xMYbR+)f#M2yj*5@>lpF4hQCejQw)9}afStR&T9Xi>y4xN_o zYQU}FkDrDq@Q0>=e}r(AVH|SwUsJ(f9@KflO082K)+)O z{BIJj@FVQU9Y&nwi7D`(1)Ta2Z!a%Sf&VLkryK51nbkV<|Kh-3<_|RD zED(6QvEp8h@9O8WDe$YOfVWKn-vf9C)=hU@?tBdje!B7c1G?W9N1qP?PQMXvzaJ3z zEMp|jpIqk9A9UcZ)!!=gHSOr<7p8!JYYI4jyDL44f0x$(Oo9J~z|)OtF5LJG;z#!R z@j>4wlRtl9ECb_p{}&2ZKD3X?@M{34Jo}vSV!GusJO%!tDd5*n0l#11>BjcEG~M68 zKKXeZ@B+!jK7Q)p-+#M?-{|1K;=nI;;7grme-wBu4VFy&DEMUK%>}$*BD%3~3iyU8 z=$tkM+-O6fv!awYYn}W085hAVWN_~IoFbBLScEAO}`N3dxyfSvvjU*isR4+nbX z7ajum`qU`C+BAMh4h#c$$-TR@d~%Ecw)OqEBF7h5@oku~(ZdLUVQU@e9v>XU#Xat^ z!X-oo@M=gjszef^!yVz{dLT5uFHjpOFE3xSCV;M4tapkP?lH3q=LqM#7ueHKu|nUf z1tKpE16bt%-52kPSb-=~|d+v)(f;=PSP?QYyv)guVMrJ;FKbpvl``O-LEjK%E}T8MZ@gZxGq zt}BK|gH=5G@Gda=J8AMwwvAgF>JiPZEUhfXTN%2g1byTpGO$X%qZWgNqmf)TxxF|F zr8NlZ6qNVpbpRozp@h=WT7M@qnn#3}y8{gV3s85jullG0h{EG!i7&MAb-AcZCN^`A}bf&sbo19DjI;h~K58;ma9W3*9kB1Z|wJ9maGYD=$$gzH=ng zH9iz}Dq$V?k1yZLH5$Kf)rT*e;hP%a-l|-(^cl#vH`X|Y;N1OA{~MyQOmq4wv_dd& zCK?f~gEFWJ`9f=i8_otq--XxSpn^E)hxufU%!c!Jt$b@l&oNAZH@bo0?op9YX_R}y z%lGbavGLyv=#I1seK{5U{6gFeZ{w3U6qLa#&gW%$4`4qrM#>(*dIb|KuQco18_}n$QJ8%$QtkXsPXupuNNzt4?hQGly)B;LKiy4U6Ir{GL9((P={NzPBw6IBLidj zzm;f2rO1}{;_VK}@D2S^+)1M--l=qSSR8g~u+Leu`|us;a0!j{t%P2`HAy!g*#ZcQ z_!c&3YiiI_qm&m4*c$-GJASm%UmSCa@`jvSwQnDO1jt3?EwY=3K;10Cn8eXZ_D}yU z2>xchJyI3F2o!NToVJMG;R|F2-o$K40Jz?H~Ex9@Y> zyXgWK(MjEXu?uGWF1o!NKXlUq7tu-M+wTPYZ|}Z4?2iA0)4!X#{9}77pLqT|0mXki z5FYBo~z-2U%y5Zv@Bhn~ic#Le9D*~q*b#s3J7ru?{R zk1iT6|875SdIa_FM795s)80)tI_=~6cfiJnk>L^Qw@#DYNX}?LM z8M{8FGj8g4Gs#@giYn+ws+GU)JL}u$9G0_!@YO7Ep=KDTQp_?jkMhU-FVX8Jk7Yv zr`s&PeSy<|xr^YWZhJRA;Z|#|G|z-BcG|o3Zu%jo{}V32N!|7?c=Z(R*D|1w&#K!0 zXE2oz8eP8&4*f;35dBL*l?xI;*B^vKzj!7@e*`FTA^~*$kogzj@Hvti5Hr6VqW`lg zssv0wjLwAGkFGyyEkwToykLfy1Jj30LsX*LGXr#nJ`glO$JtbXY(*f3r8`*t$q5vL nr5zv>4kY$L^yk77K2!!~FH9luUQVp~TaQBYSE6Y^<1zpMH9Xps literal 130584 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 #include struct handshake { - // [not used in the current Remote Telemtry version by AC] - // In future versions it will identify the platform type of the client. - // This will be used to adjust a specific behaviour for each platform. (eIPadDevice for now (1)) - int32_t identifier; + // [not used in the current Remote Telemtry version by AC] + // In future versions it will identify the platform type of the client. + // This will be used to adjust a specific behaviour for each platform. (eIPadDevice for now (1)) + int32_t identifier; - // [not used in the current Remote Telemtry version by AC] - // In future version this field will identify the AC Remote Telemetry version that the device expects to speak with. - int32_t version; + // [not used in the current Remote Telemtry version by AC] + // In future version this field will identify the AC Remote Telemetry version that the device expects to speak with. + int32_t version; - // This is the type of operation required by the client. - // The following operations are now available: - // ---------------------------------------------------------------- - // HANDSHAKE = 0 : - // This operation identifier must be set when the client wants to start the comunication. - // - // SUBSCRIBE_UPDATE = 1 : - // This operation identifier must be set when the client wants to be updated from the specific ACServer. - // - // SUBSCRIBE_SPOT = 2 : - // This operation identifier must be set when the client wants to be updated from the specific ACServer just for SPOT Events (e.g.: the end of a lap). - // - // DISMISS = 3 : - // This operation identifier must be set when the client wants to leave the comunication with ACServer. - int32_t operationId; + // This is the type of operation required by the client. + // The following operations are now available: + // ---------------------------------------------------------------- + // HANDSHAKE = 0 : + // This operation identifier must be set when the client wants to start the comunication. + // + // SUBSCRIBE_UPDATE = 1 : + // This operation identifier must be set when the client wants to be updated from the specific ACServer. + // + // SUBSCRIBE_SPOT = 2 : + // This operation identifier must be set when the client wants to be updated from the specific ACServer just for SPOT Events (e.g.: the end of a lap). + // + // DISMISS = 3 : + // This operation identifier must be set when the client wants to leave the comunication with ACServer. + int32_t operationId; } __attribute__((packed)); -struct handshackerResponse{ - // is the name of the car that the player is driving on the AC Server - char carName[50]; +struct handshackerResponse { + // is the name of the car that the player is driving on the AC Server + char carName[50]; - // is the name of the driver running on the AC Server - char driverName[50]; + // is the name of the driver running on the AC Server + char driverName[50]; - // for now is just 4242, this code will identify different status, - // as “NOT AVAILABLE” for connection - int32_t identifier; + // for now is just 4242, this code will identify different status, + // as “NOT AVAILABLE” for connection + int32_t identifier; - // for now is set to 1, this will identify the version running on the AC Server - int32_t version; + // for now is set to 1, this will identify the version running on the AC Server + int32_t version; - // is the name of the track on the AC Server - char trackName[50]; + // is the name of the track on the AC Server + char trackName[50]; - // is the track configuration on the AC Server - char trackConfig[50]; + // is the track configuration on the AC Server + char trackConfig[50]; } __attribute__((packed)); struct postion { - float x; - float y; - float z; + float x; + float y; + float z; } __attribute__((packed)); struct carAtributes { - // Related to ACSP_CAR_INFO - u_char isConnected; // 1 = connected, 0 = disconnected - char *carModel; - char *carSkin; - char *driver_name; - char *driver_team; - char *driver_GUID; + // Related to ACSP_CAR_INFO + u_char isConnected; // 1 = connected, 0 = disconnected + char *car_model; + char *car_skin; + char *driver_name; + char *driver_team; + char *driver_GUID; - // Related to ACSP_CAR_UPDATE - u_int8_t carID; - postion position; - postion velocity; - u_int8_t carGear; - u_int16_t carRPM; - float_t normalizedSplinePos; + // Related to ACSP_CAR_UPDATE + u_int8_t carID; + postion position; + postion velocity; + u_int8_t carGear; + u_int16_t carRPM; + float_t normalizedSplinePos; } __attribute__((packed)); - -struct trackAtributes { - u_int8_t protocol_version; - u_int8_t session_index; - u_int8_t current_session_index; - u_int8_t session_count; - - char *server_name; - char *track; - char *track_config; - char *session_name; - - u_int8_t typ; - u_int16_t time; - u_int16_t laps; - u_int16_t wait_time; - u_int8_t ambient_temp; - u_int8_t road_temp; - - char *weather_graphics; - int32_t elapsed_ms; -} __attribute__((packed)); - - -enum ACSP_MessageType { - // ============================ - // PROTOCOL VERSION - // ============================ - PROTOCOL_VERSION = 4, - - // ============================ - // SERVER → CLIENT MESSAGES - // ============================ - ACSP_NEW_SESSION = 50, - ACSP_NEW_CONNECTION = 51, - ACSP_CONNECTION_CLOSED = 52, - ACSP_CAR_UPDATE = 53, - ACSP_CAR_INFO = 54, // Response to ACSP_GET_CAR_INFO - ACSP_END_SESSION = 55, - ACSP_VERSION = 56, - ACSP_CHAT = 57, - ACSP_CLIENT_LOADED = 58, - ACSP_SESSION_INFO = 59, - ACSP_ERROR = 60, - ACSP_LAP_COMPLETED = 73, - - // ============================ - // EVENTS - // ============================ - ACSP_CLIENT_EVENT = 130, - - // ============================ - // EVENT TYPES - // ============================ - ACSP_CE_COLLISION_WITH_CAR = 10, - ACSP_CE_COLLISION_WITH_ENV = 11, - - // ============================ - // CLIENT → SERVER COMMANDS - // ============================ - ACSP_REALTIMEPOS_INTERVAL = 200, - ACSP_GET_CAR_INFO = 201, - ACSP_SEND_CHAT = 202, // Sends chat to one car - ACSP_BROADCAST_CHAT = 203, // Sends chat to everybody - ACSP_GET_SESSION_INFO = 204, - ACSP_SET_SESSION_INFO = 205, - ACSP_KICK_USER = 206, - ACSP_NEXT_SESSION = 207, - ACSP_RESTART_SESSION = 208, - ACSP_ADMIN_COMMAND = 209 // Send message plus a string +enum SessionType { + PRACTICE = 0, + RACE = 1, + QUALIFYING = 2, }; +struct trackAtributes { + u_int8_t protocol_version; + u_int8_t session_index; + u_int8_t current_session_index; + u_int8_t session_count; + SessionType session_type; + + char *server_name; + char *track; + char *track_config; + char *session_name; + + u_int8_t typ; + u_int16_t time; + u_int16_t laps; + u_int16_t wait_time; + u_int8_t ambient_temp; + u_int8_t road_temp; + + char *weather_graphics; + int32_t elapsed_ms; +} __attribute__((packed)); + +enum ACSP_MessageType { + // ============================ + // PROTOCOL VERSION + // ============================ + PROTOCOL_VERSION = 4, + + // ============================ + // SERVER → CLIENT MESSAGES + // ============================ + ACSP_NEW_SESSION = 50, + ACSP_NEW_CONNECTION = 51, + ACSP_CONNECTION_CLOSED = 52, + ACSP_CAR_UPDATE = 53, + ACSP_CAR_INFO = 54, // Response to ACSP_GET_CAR_INFO + ACSP_END_SESSION = 55, + ACSP_VERSION = 56, + ACSP_CHAT = 57, + ACSP_CLIENT_LOADED = 58, + ACSP_SESSION_INFO = 59, + ACSP_ERROR = 60, + ACSP_LAP_COMPLETED = 73, + + // ============================ + // EVENTS + // ============================ + ACSP_CLIENT_EVENT = 130, + + // ============================ + // EVENT TYPES + // ============================ + ACSP_CE_COLLISION_WITH_CAR = 10, + ACSP_CE_COLLISION_WITH_ENV = 11, + + // ============================ + // CLIENT → SERVER COMMANDS + // ============================ + ACSP_REALTIMEPOS_INTERVAL = 200, + ACSP_GET_CAR_INFO = 201, + ACSP_SEND_CHAT = 202, // Sends chat to one car + ACSP_BROADCAST_CHAT = 203, // Sends chat to everybody + ACSP_GET_SESSION_INFO = 204, + ACSP_SET_SESSION_INFO = 205, + ACSP_KICK_USER = 206, + ACSP_NEXT_SESSION = 207, + ACSP_RESTART_SESSION = 208, + ACSP_ADMIN_COMMAND = 209 // Send message plus a string +}; #endif // SERVER_STRUCTS_H diff --git a/source/main.cpp b/source/main.cpp index cf538ca..18ea833 100644 --- a/source/main.cpp +++ b/source/main.cpp @@ -1,3 +1,4 @@ +#include #include #include #include @@ -15,6 +16,34 @@ const int SERVER_OUT_PORT = 12000; const int SERVER_IN_PORT = 11000; const char *SERVER_OUT_IP = "127.0.0.1"; +const int MAX_PLAYERS = 64; + +void init_carupdate(carAtributes *car) { + car->carID = 0; + car->position.x = 0.0f; + car->position.y = 0.0f; + car->position.z = 0.0f; + car->velocity.x = 0.0f; + car->velocity.y = 0.0f; + car->velocity.z = 0.0f; + car->carGear = 0; + car->carRPM = 0; + car->normalizedSplinePos = 0.0f; + car->isConnected = 0; + + car->car_model = (char *)malloc(64); + car->driver_GUID = (char *)malloc(64); + car->car_skin = (char *)malloc(64); + car->driver_name = (char *)malloc(64); + car->driver_team = (char *)malloc(64); + + strcpy(car->car_model, ""); + strcpy(car->driver_GUID, ""); + strcpy(car->car_skin, ""); + strcpy(car->driver_name, ""); + strcpy(car->driver_team, ""); +} + int main(void) { printf("[+] Starting server...\n"); @@ -34,15 +63,23 @@ int main(void) { char buffer[1024]; trackAtributes trackInfo; + carAtributes players[MAX_PLAYERS]; + carAtributes update; + // Basically a contrutor for carAtributes (because all strings in carAtributes are pointers) + for (int i = 0; i < MAX_PLAYERS; i++) { + init_carupdate(&players[i]); + } + init_carupdate(&update); + trackInfo.server_name = (char *)malloc(128); trackInfo.track = (char *)malloc(128); trackInfo.track_config = (char *)malloc(64); trackInfo.weather_graphics = (char *)malloc(64); trackInfo.session_name = (char *)malloc(64); - char message[124] = {0}; // just a place to put info messages from the server itself + char message[124] = {0}; // just a place to put info messages from the server itself while (1) { offset = 0; @@ -65,8 +102,7 @@ int main(void) { // ============================ // SERVER → CLIENT MESSAGES // ============================ - - case ACSP_NEW_SESSION: + case ACSP_NEW_SESSION: // DONE printf("[+] Message Type: ACSP_NEW_SESSION\n"); offset = 1; // Reset offset to 1 to read after message types @@ -75,30 +111,31 @@ int main(void) { trackInfo.current_session_index = read_uint8((const u_int8_t *)buffer, recv_bytes, &offset, &ok); trackInfo.session_count = read_uint8((const u_int8_t *)buffer, recv_bytes, &offset, &ok); + trackInfo.session_type = (SessionType)trackInfo.session_index; // FOR BACKWARD COMPATIBILITY + str_len_8 = read_uint8((const u_int8_t *)buffer, recv_bytes, &offset, &ok); read_utf32le_string((const u_int8_t *)buffer, recv_bytes, &offset, trackInfo.server_name, str_len_8, &ok); str_len_8 = read_uint8((const u_int8_t *)buffer, recv_bytes, &offset, &ok); - read_string((const u_int8_t *)buffer, recv_bytes, &offset, trackInfo.track, str_len_8, &ok); + read_string((const u_int8_t *)buffer, recv_bytes, &offset, trackInfo.track, str_len_8, &ok); - str_len_8 = read_uint8((const u_int8_t *)buffer, recv_bytes, &offset, &ok); + str_len_8 = read_uint8((const u_int8_t *)buffer, recv_bytes, &offset, &ok); read_string((const u_int8_t *)buffer, recv_bytes, &offset, trackInfo.track_config, str_len_8, &ok); - str_len_8 = read_uint8((const u_int8_t *)buffer, recv_bytes, &offset, &ok); - read_string((const u_int8_t *)buffer, recv_bytes, &offset, trackInfo.session_name, str_len_8, &ok); + str_len_8 = read_uint8((const u_int8_t *)buffer, recv_bytes, &offset, &ok); + read_string((const u_int8_t *)buffer, recv_bytes, &offset, trackInfo.session_name, str_len_8, &ok); - trackInfo.typ = read_uint8((const u_int8_t *)buffer, recv_bytes, &offset, &ok); - trackInfo.time = read_uint16((const u_int8_t *)buffer, recv_bytes, &offset, &ok); - trackInfo.laps = read_uint16((const u_int8_t *)buffer, recv_bytes, &offset, &ok); - trackInfo.wait_time = read_uint16((const u_int8_t *)buffer, recv_bytes, &offset, &ok); - trackInfo.ambient_temp = read_uint8((const u_int8_t *)buffer, recv_bytes, &offset, &ok); - trackInfo.road_temp = read_uint8((const u_int8_t *)buffer, recv_bytes, &offset, &ok); + trackInfo.typ = read_uint8((const u_int8_t *)buffer, recv_bytes, &offset, &ok); + trackInfo.time = read_uint16((const u_int8_t *)buffer, recv_bytes, &offset, &ok); + trackInfo.laps = read_uint16((const u_int8_t *)buffer, recv_bytes, &offset, &ok); + trackInfo.wait_time = read_uint16((const u_int8_t *)buffer, recv_bytes, &offset, &ok); + trackInfo.ambient_temp = read_uint8((const u_int8_t *)buffer, recv_bytes, &offset, &ok); + trackInfo.road_temp = read_uint8((const u_int8_t *)buffer, recv_bytes, &offset, &ok); - str_len_8 = read_uint8((const u_int8_t *)buffer, recv_bytes, &offset, &ok); - read_string((const u_int8_t *)buffer, recv_bytes, &offset, trackInfo.weather_graphics, str_len_8, &ok); - - trackInfo.elapsed_ms = read_int32((const u_int8_t *)buffer, recv_bytes, &offset, &ok); + str_len_8 = read_uint8((const u_int8_t *)buffer, recv_bytes, &offset, &ok); + read_string((const u_int8_t *)buffer, recv_bytes, &offset, trackInfo.weather_graphics, str_len_8, &ok); + trackInfo.elapsed_ms = read_int32((const u_int8_t *)buffer, recv_bytes, &offset, &ok); if (!ok) { fprintf(stderr, "[-] Error parsing NEW_SESSION packet (offset=%zu)\n", offset); @@ -108,27 +145,95 @@ int main(void) { printf("\tServer Name: \"%s\"\n", trackInfo.server_name); printf("\tTrack: \"%s\"\n", trackInfo.track); printf("\tTrack Config: \"%s\"\n", trackInfo.track_config); - printf("\tSession Name: \"%s\"\n", trackInfo.session_name); + printf("\tSession Name: \"%s\"\n", trackInfo.session_name); printf("\tProtocol Version: %d\tSession Index: %d/%d\tCurrent Session Index: %d\n", trackInfo.protocol_version, trackInfo.session_index, trackInfo.session_count, trackInfo.current_session_index); - printf("\tType: %d\tTime: %d mins\tLaps: %d\tWait Time: %d secs\n", trackInfo.typ, trackInfo.time, trackInfo.laps, trackInfo.wait_time); - printf("\tAmbient Temp: %d C\tRoad Temp: %d C\n", trackInfo.ambient_temp, trackInfo.road_temp); - printf("\tWeather Graphics: %s\n", trackInfo.weather_graphics); - printf("\tElapsed Time: %d ms\n", trackInfo.elapsed_ms); + printf("\tType: %d\tTime: %d mins\tLaps: %d\tWait Time: %d secs\n", trackInfo.typ, trackInfo.time, trackInfo.laps, trackInfo.wait_time); + printf("\tAmbient Temp: %d C\tRoad Temp: %d C\n", trackInfo.ambient_temp, trackInfo.road_temp); + printf("\tWeather Graphics: %s\n", trackInfo.weather_graphics); + printf("\tElapsed Time: %d ms\n", trackInfo.elapsed_ms); break; - case ACSP_NEW_CONNECTION: + case ACSP_NEW_CONNECTION: //DONE printf("[+] Message Type: ACSP_NEW_CONNECTION\n"); + offset = 1; // Reset offset to 1 to read after message types + + str_len_8 = read_uint8((const u_int8_t *)buffer, recv_bytes, &offset, &ok); + read_utf32le_string((const u_int8_t *)buffer, recv_bytes, &offset, update.driver_name, str_len_8, &ok); + + str_len_8 = read_uint8((const u_int8_t *)buffer, recv_bytes, &offset, &ok); + read_utf32le_string((const u_int8_t *)buffer, recv_bytes, &offset, update.driver_GUID, str_len_8, &ok); + + update.carID = read_uint8((const u_int8_t *)buffer, recv_bytes, &offset, &ok); + + str_len_8 = read_uint8((const u_int8_t *)buffer, recv_bytes, &offset, &ok); + read_string((const u_int8_t *)buffer, recv_bytes, &offset, update.car_model, str_len_8, &ok); + + str_len_8 = read_uint8((const u_int8_t *)buffer, recv_bytes, &offset, &ok); + read_string((const u_int8_t *)buffer, recv_bytes, &offset, update.car_skin, str_len_8, &ok); + + if (!ok) { + fprintf(stderr, "[-] Error parsing NEW_CONNECTION packet (offset=%zu)\n", offset); + break; + } + + update.isConnected = 1; // Mark as connected + + printf("\tDriver Name: \"%s\"\n", update.driver_name); + printf("\tDriver GUID: \"%s\"\n", update.driver_GUID); + printf("\tCar ID: %d\n", update.carID); + printf("\tCar Model: \"%s\"\n", update.car_model); + printf("\tCar Skin: \"%s\"\n", update.car_skin); + + // Store player player into the respective Index + if (update.carID < MAX_PLAYERS) { + memcpy(&players[update.carID], &update, sizeof(carAtributes)); + } + break; - case ACSP_CONNECTION_CLOSED: + case ACSP_CONNECTION_CLOSED: // DONE printf("[+] Message Type: ACSP_CONNECTION_CLOSED\n"); + offset = 1; // Reset offset to 1 to read after message types + + str_len_8 = read_uint8((const u_int8_t *)buffer, recv_bytes, &offset, &ok); + read_utf32le_string((const u_int8_t *)buffer, recv_bytes, &offset, update.driver_name, str_len_8, &ok); + + str_len_8 = read_uint8((const u_int8_t *)buffer, recv_bytes, &offset, &ok); + read_utf32le_string((const u_int8_t *)buffer, recv_bytes, &offset, update.driver_GUID, str_len_8, &ok); + + update.carID = read_uint8((const u_int8_t *)buffer, recv_bytes, &offset, &ok); + + str_len_8 = read_uint8((const u_int8_t *)buffer, recv_bytes, &offset, &ok); + read_string((const u_int8_t *)buffer, recv_bytes, &offset, update.car_model, str_len_8, &ok); + + str_len_8 = read_uint8((const u_int8_t *)buffer, recv_bytes, &offset, &ok); + read_string((const u_int8_t *)buffer, recv_bytes, &offset, update.car_skin, str_len_8, &ok); + + if (!ok) { + fprintf(stderr, "[-] Error parsing NEW_CONNECTION packet (offset=%zu)\n", offset); + break; + } + + update.isConnected = 0; // Mark as disconnected + + printf("\tDriver Name: \"%s\"\n", update.driver_name); + printf("\tDriver GUID: \"%s\"\n", update.driver_GUID); + printf("\tCar ID: %d\n", update.carID); + printf("\tCar Model: \"%s\"\n", update.car_model); + printf("\tCar Skin: \"%s\"\n", update.car_skin); + + // Store player player into the respective Index + if (update.carID < MAX_PLAYERS) { + memcpy(&players[update.carID], &update, sizeof(carAtributes)); + } + break; - case ACSP_CAR_UPDATE: + case ACSP_CAR_UPDATE: // DONE printf("[+] Message Type: ACSP_CAR_UPDATE\n"); memcpy(&update.carID, buffer + 1, sizeof(uint8_t)); @@ -146,43 +251,99 @@ int main(void) { printf("\tCar %d Position: X: %.2f Y: %.2f Z: %.2f ", update.carID, update.position.x, update.position.y, update.position.z); printf("Gear: %d RPM: %d\n", update.carGear, update.carRPM); + + // Store player player into the respective index + if (update.carID < MAX_PLAYERS) { + memcpy(&players[update.carID].position, &update.position, sizeof(postion)); + memcpy(&players[update.carID].velocity, &update.velocity, sizeof(postion)); + players[update.carID].carGear = update.carGear; + players[update.carID].carRPM = update.carRPM; + players[update.carID].normalizedSplinePos = update.normalizedSplinePos; + } + break; - case ACSP_CAR_INFO: + case ACSP_CAR_INFO: // DONE printf("[+] Message Type: ACSP_CAR_INFO\n"); + offset = 1; // Reset offset to 1 to read after message types; + // + // is_connected = self.br.read_byte() != 0 + // car_model = self.br.read_utf_string() + // car_skin = self.br.read_utf_string() + // driver_name = self.br.read_utf_string() + // driver_team = self.br.read_utf_string() + // driver_guid = self.br.read_utf_string() + + update.carID = read_uint8((const u_int8_t *)buffer, recv_bytes, &offset, &ok); + update.isConnected = read_uint8((const u_int8_t *)buffer, recv_bytes, &offset, &ok); + + str_len_8 = read_uint8((const u_int8_t *)buffer, recv_bytes, &offset, &ok); + read_utf32le_string((const u_int8_t *)buffer, recv_bytes, &offset, update.car_model, str_len_8, &ok); + str_len_8 = read_uint8((const u_int8_t *)buffer, recv_bytes, &offset, &ok); + read_utf32le_string((const u_int8_t *)buffer, recv_bytes, &offset, update.car_skin, str_len_8, &ok); + str_len_8 = read_uint8((const u_int8_t *)buffer, recv_bytes, &offset, &ok); + read_utf32le_string((const u_int8_t *)buffer, recv_bytes, &offset, update.driver_name, str_len_8, &ok); + str_len_8 = read_uint8((const u_int8_t *)buffer, recv_bytes, &offset, &ok); + read_utf32le_string((const u_int8_t *)buffer, recv_bytes, &offset, update.driver_team, str_len_8, &ok); + str_len_8 = read_uint8((const u_int8_t *)buffer, recv_bytes, &offset, &ok); + read_utf32le_string((const u_int8_t *)buffer, recv_bytes, &offset, update.driver_GUID, str_len_8, &ok); + + if (!ok) { + fprintf(stderr, "[-] Error parsing CAR_INFO packet (offset=%zu)\n", offset); + } + + printf("\tCar ID: %d\n", update.carID); + printf("\tIs Connected: %d\n", update.isConnected); + printf("\tCar Model: \"%s\"\n", update.car_model); + printf("\tCar Skin: \"%s\"\n", update.car_skin); + printf("\tDriver Name: \"%s\"\n", update.driver_name); + printf("\tDriver Team: \"%s\"\n", update.driver_team); + printf("\tDriver GUID: \"%s\"\n", update.driver_GUID); + + // Store player player into the respective Index + if (update.carID < MAX_PLAYERS) { + memcpy(&players[update.carID], &update, sizeof(carAtributes)); + } + break; - case ACSP_END_SESSION: + case ACSP_END_SESSION: // DONE-ish (only session type cycling) printf("[+] Message Type: ACSP_END_SESSION\n"); + // Advance session_type to the next in the enum; + + trackInfo.session_type = (SessionType)((trackInfo.session_type + 1) % 3); + + printf("\tNext Session Type: %d\n", trackInfo.session_type); + break; - case ACSP_VERSION: + case ACSP_VERSION: // TODO printf("[+] Message Type: ACSP_VERSION\n"); break; - case ACSP_CHAT: + case ACSP_CHAT: // TODO printf("[+] Message Type: ACSP_CHAT\n"); break; - case ACSP_CLIENT_LOADED: + case ACSP_CLIENT_LOADED: // TODO printf("[+] Message Type: ACSP_CLIENT_LOADED\n"); break; - case ACSP_SESSION_INFO: + case ACSP_SESSION_INFO: // TODO printf("[+] Message Type: ACSP_SESSION_INFO\n"); break; - case ACSP_ERROR: + case ACSP_ERROR: // DONE printf("[+] Message Type: ACSP_ERROR\n"); - offset = 1; // Reset offset to 1 to read after message types - + offset = 1; // Reset offset to 1 to read after message types + str_len_8 = read_uint8((const u_int8_t *)buffer, recv_bytes, &offset, &ok); read_utf32le_string((const u_int8_t *)buffer, recv_bytes, &offset, message, str_len_8, &ok); - printf("\tServer Message: \"%s\"\n", message); + printf("\tServer Message: \"%s\"\n", message); break; - case ACSP_LAP_COMPLETED: + case ACSP_LAP_COMPLETED: // TODO printf("[+] Message Type: ACSP_LAP_COMPLETED\n"); break; @@ -264,6 +425,6 @@ int main(void) { free(trackInfo.track); free(trackInfo.track_config); free(trackInfo.weather_graphics); - free(trackInfo.session_name); + free(trackInfo.session_name); return 0; }