From 946e4fb0369846fee4061e340115aaef2f5c9edd Mon Sep 17 00:00:00 2001 From: DiSlord Date: Tue, 17 Feb 2009 21:06:09 +0300 Subject: [PATCH] [7291] Better map height calculation by use client data format. Need re extract map files by use new ad.exe Signed-off-by: DiSlord --- contrib/extractor/System.cpp | 8 +--- contrib/extractor/ad.exe | Bin 160768 -> 159744 bytes contrib/extractor/adt.cpp | 87 +++-------------------------------- src/game/GridDefines.h | 2 +- src/game/Map.cpp | 86 ++++++++++++++++++++++++++-------- src/game/Map.h | 3 +- src/shared/revision_nr.h | 2 +- 7 files changed, 80 insertions(+), 108 deletions(-) diff --git a/contrib/extractor/System.cpp b/contrib/extractor/System.cpp index 3c3191727..f9f684014 100644 --- a/contrib/extractor/System.cpp +++ b/contrib/extractor/System.cpp @@ -70,7 +70,7 @@ bool FileExists( const char* FileName ) void Usage(char* prg) { - printf("Usage:\n%s -[var] [value]\n-i set input path\n-o set output path\n-r set resolution\n-e extract only MAP(1)/DBC(2) - standard: both(3)\nExample: %s -r 256 -i \"c:\\games\\game\"", prg, prg); + printf("Usage:\n%s -[var] [value]\n-i set input path\n-o set output path\n-e extract only MAP(1)/DBC(2) - standard: both(3)\nExample: %s -r 256 -i \"c:\\games\\game\"", prg, prg); exit(1); } @@ -99,12 +99,6 @@ void HandleArgs(int argc, char * arg[]) else Usage(arg[0]); break; - case 'r': - if(c + 1 < argc) // all ok - iRes=atoi(arg[(c++) + 1]); - else - Usage(arg[0]); - break; case 'e': if(c + 1 < argc) // all ok { diff --git a/contrib/extractor/ad.exe b/contrib/extractor/ad.exe index f483f3892f9135033e8b6e9e4786d983c5c5b8b1..402f3ae317207ea3245cbc1785e636927ad1caa2 100755 GIT binary patch delta 39214 zcmb4s3tUvi7yr&>fmIh-b;0E&sH>o$qJV;cE(nMUx_~Z{3Yd>pG&9{*OB8HH*{+l| z*|jp$(6YCMDOwqbfto3nm8KSzKN~`g(oplU|L@!d#2)|u=Z~NJn3*$Y&YU@O=A1Kg z*J9SGxS`XAV&kA4nSS#Q#ih1g%btHDwFv2D&wrZw6P^==v8e@ed3>q|o(m4oN_|8w zuS^Y*pYNoa@ywhz%gk{+(_1&tn5TK^gpE~E?Tq)>cA6pH7anG(RpMnQPB6vh~c+R0Zaoh4z6rN;(P`v6#0V}&z@1kV(jA_S9#6$=GQglS3CMHv?xm!GKUt1JuSk0ibF`f0za z>!)ju-TNzWm{<()BxkL~yXRi-ZM)Vb;;A(5 zb2t==xv|yOUZNMLURRFmgpfvRNERnt?KGVW%ZAp?H)-SzkDxKSKB=}gUXUs`_Y`@jNyhT zGy07G)1qABOeQ$N&KPe0M}gu@(SOuX{znai>c0xq|5c#*uL3O!`a0>gRX=8{(%XI| zPKrHCLLCl=%qK&6D*aKVEi!LcC`{}@+^4Vu(Q6qifz0Do_p80m0~i?Evd4kdhV@?b=?g~ zT^28Ty-kZddlk)+8K-K6T`$9;3^3URLIEjLjyE=ScfMkt)g|fuxqxS|P-nBNYZXv- zwkBd-z4|lEX2t3|Jj3&eJaEEEe73A73P>iq{)R%ajrYgMYPLE1S%h}X3Im_a8SFI5 zMK9j@OjZs6=I4qElabCgE0si1K#XiRhw*Ucan-WA+F6ppUPOuQP--@-fI1PqI7lY@ z3uwUM8PoE15peFFw&QP8#7kXl7jCS+bPW80n(M0W>lxpwS3->9adse%8q|Iyj!su6 z4B#5+hlZ9zu8*tE2k=CbaQ^g}B)#sOm$_q+nbxWYdB(|jChJ2of#-HC6+9M^Sh~a` zRM>KzZuJ-}EWA$ZJxcsWDikrRRGv?)yX$b|kosNh+{1O6}qUamW-q&T~meY zFVhoUv%OX01R9039Mo9am5MV@aO#-DwjVvMU88wvzv>0Tt3-qhkfG zLjJt~D&*e_ph7wp6ty>QfDUOb`BxQ^#ddDyGNA;kPl457I=J2UWys9`X523zwo5v` z07CWz1se_s)Qb4BtW*J2P_|3yMik{-%IuT%ntpaD3A;tF6^~Z`>LUJS`_UcQ`s!bl zl>kadKe%@H%!}7u?2OKp4+fWDF1&W+uKvr}j4y9SUIWiR(Ojl<>ftk+6wt#?Tp8?tFUV6OFL%Z? z+aVq14!x;;TX?6OzV3BgIR7eL=KYp-`m3NMX|FN`bEl-rdL^5Uf3;$GPgf$G+*T2< z^CrR%Z_p_|5#EVA0r*si7w*ra4MlcFCVTrey2ZzjB+>mok7*qo;CVHQGVN=_0LL!x zq+@*}glAu&g}yrP;au%M#S88s*t&zh=^INX(~G`;3cu~3=l%K!vW*+rf+yf3(3lj0IQR$Z5$kX0p0hD{KLsiSWn{`gE@-VgHM? zw%4yh+IIRu;2Gi3a#|J?Os>%ng93}puwqT@*+|YDEtXyHyh_Y)N3NKrkA|xGyo?vb z)re1rgVwB!vdQ}JO!gS;P;Snem!r0k9U6x9Ls8&Tz^#kP=0ap=X}twb+Pv6HkuyB307Um#jkof zKTWUU=A52==S)x5Ycu8aQD-_yua@hv{cZ3%C;XdqOut}KO6T|M?U#=-RPtxPw7#H~ zNQ|a~eM4XG*QZA*?~>BCN~c+@7AL}pxmrrMh6K^u{j!AZr8J{|u+OG#a51#Wn4M{Q zWd`c2XEx)#w4hR_|%v?(shWL9QM7hk?R@zdOMmA(EXp15x^qY`ah)DMV z^MvcK(3Jz8C&#IF;1N<^@%_NQF2b#i)MfC)!e)^!9{hSy{mewg)g9t3_A4}<=&=h) zyLc@ea^STa?`1arZZ|4Lk4j#YsuI0E=J_8*hN9n9c-;r>3kWqc1H-mr4rNmg1p<#X z{9RP>cdt_ZPStqdwq6F&;I-_dFfAVYRKRdx1G2B~D6{S6jo*;59#A;*K8hTO#tih( zkOzftC=Cf8Eo`K8UU(nj^=D~W_>iEWkp_jiA;!RUT?q7CID3jKxXJo3lf5UyNSzBG zLZ+a3evcb!AjNd$P~ZMjIg{0~b=JNZJQX)mX$~64(k|Y>ywMo#-t5PR=_f-2`c8cY zQl}PAvq}6#2Y)gJFJ=oYyaGj*c!PB-rFVu-?mB24cUyvS&tkpT(Y#?PLiRKC^S)47*=xF;(CCf)7MY-trk5tqom}hg{06k!-hs!dYVi5Oc_xq3m^1vL=`l! zy2f@_DC{_LuiGNlQZ8Tw2 z58>KsY8sU%{4CPFqtg4UR-ji;>7jZu*uuy0{ybMhne0LSzLu+LBOCP`9XL9uh%W+D zOkxEG7E}DQ;ll@shpT^7PKvnfa@6K<^ITVt4m$LogpD@FW7$abU9dkLmA{y?8?bF~S*3Ex#j@Rou3B8G zy03mjl}v9hP_|*}ID=vquD|TjDy1+Gy#lW}$(_(KF^|Cogq0jx`FLwZ6ua|ib!@Lr89BlP` zI%!N#w>_{op!ye#2^GAbrZ0@~6MW~>J!1+6zgxhGP(#hsn9Sj5o@t6O^3B}lXz^Tw z>7bCa3o!BOt#o42M4{ygx+STvuzD4(N$M^9I*(pV8cZ1VO4bj(gFqc*9@9ctwjUEj zZDa$V;&V36A`5$4KUHWC{hT|G79{%yjGxy|19-q`X(xZkJi0A8Fx1BmGTz4IFtMK> z1$h>|k-Ptz5{Jb*+r-X)=Wt~6`O3B}q)o{KqX(@7kSyc{t|t2vlQ~-*A93S6;xhAv zMJN-w>S3%XsocOd@8U|K=L-8Mdv zoV>AE+W9hPG2J(IsxWi~?U5Qx4$|1v&@Le$6FfArz(?t$sdI$&iz-g1`Vyh@pY+_EClJd2asSbFcB-@%QJ->(jn9>tew7=@6@MH?Gf|l$FtyNIu;=alk~`(9^dhC~T|r+-6GA7+GVU3?ETdm!kK?WVNRRiN{M*G^_#5 zwA+F;PAIW97b7Pdjqo_WpEw~T>kN;b%s8mx!CI}&aTlVLm2+JsSZrRQ(dNjBG;UjBHNLAZbycMgC^DmJZj|zf1sVI_u9$e zW@CHjG#xsp=8IxBBfN)S7C74bSTf3z*fHT-MIO1^NBH>N0rDaon zg$--y8&jA2`O9r!#qliJfI-H};1630{aW=jjmrrV9-KmRb6)q-T<0y)88UZ45EiBf zAE3Su1Psujg!xaAnNUEO-*asuF$H#@$|PHou~$5wDyI1lco$h0K4~Cvb1b9c=2-&c z9*EPOg|TJDS*(Z$FTv5t#fGT2CmqsSrl$YjHiAxrD#d(yi4 zl3L)yAPcO0jb4RR2LWEA*CC@-hCkMaAR#J0Y2f2vG;{JWXM)Vn-Q-*v0FumcUYIr; zvN&6Gn67F>>4O9XJvFTxd5B(|HZ*mY4Eq^O4+umnE)1kPqYWVpee-SrWwNaR0{$=~ z(_n~fhy2%6Sw=WpXvw5`(}Tztw0L^NL-RAa9l!~N#f!-({MbI}|E+sd?kS&+-D~TP z&Rj2(cm@`ZvoQnk!)TyKr}+=~4GKZ-_hh}!%m8Tn!jWlzTOWqj+0*S+S~6(fjNZY= zu5<)f{Doe%!H#W*eK&)?J|hS&;^7&+N9zD%WLII?fITu_+M4q>`}6wjTarM-@S2f6o*UA2FPHQx?v^MU-`YTT<@%%;?lH)A$=o*h z2yMtNZ@cbV?i_dXE-vaH897PH0+N$L2 z(rK-+cN01s&6`MKCl5iYRU#3+IE+21r-2uSI}3L^3*i}$Q;LbU#hrhu!<&!qrlBvNl(r)rt^82 zJ;kNgXe?W=pR9z|tOBwO_6AIR=PVVIybV*bjpo++3(V(afKmWJ{4AMeYxK)e&&a}G zrweBXj=#Z)>5tBhg-v5~7(AbtjioEub_Z|id{vW$F@t?KuC0Ykb{y{K;6j8 z#?-+3-o9D?+ykf#-|QfKv!CDx-tU`n_2BQ^K5lj8 z$|8yEne72=?5z%-*$!mH0NQiS=kQAll*~4cemN(6^!{HU^=W!zhNxms1)?pBetN7$ zpAVCKEcZJX!09d2=f^;zkrm0&Hd)+akqvjR-wK*Aw?~l%xe-;di!|`^lz1;tf;(~O zDvbCzI5Fal*e2_2)`-AQ8`yas1TtxDzba$@vg%Pho*nH_d;srUGwZo#j%LB$yjg1~ zd#wY^i+H!y`ZrFZU(FpW^hl-t5A_j#8%qrj^&IofSfH29MrCY`HH_VX%`H2m8U8Lt zUCd;?KS*WBghT4@+IK19}Y8WT%^^m7SI(+7=V!%+!>ZRYDKC(lI|@X1EDFu4_q9-bH4YdNQ< zO3qT*oJ%pE3TgU98LU?_?N%@}&<9Liub0KSees*YS3e6@zfY6s%mVMCc3Y6gJxtM}nn_&Hv*B1!IRQv`CMhlpjMsFp3! z4D;K(9EYy*=7$K<7;2yYpzxTLUY;K#jIz>@1(Cw_M4G!G*r#b4sQ;%6t;wZZ7Ch{E z@)9SC2cf!)C)g6|`>;v)#XuK793@0uqHjFh(CzGE^f^UYynKMd;+ETZY%zUtVV*F5 zF}=0WM=&m?-j6)c?-~L)_7r7qo2n6Ug5r(QurgXR3c^^`Xu9!{Ny3s*^x`A^Lban1 zfjR5B_ARa^R%u;sIlbvS@w_eWO$Ul8S|j(Sm(k&i<_IHl=*x><3HuovFC~{f*TQF$ ztKD%{JBIAGYOPLq${uQdG(+&2N-S%J+ z4XJvd?LTyje%mX3H3IlSW#DyZ#j8WWw33EH-5dooDSUydOiKvi8%S z?uahQxdPHUYfy3nrWZz+A4Q7vgt&2wwibS$f{6$Np$}TF<0Fwho8=&++D3mQkC;Tu z5tC;p)3Bv)3U1fw>81YIw)}JHAffYhs$cfBR`qj-H8{1c*=7BNYk$!z%XCp|AxmgO zC$A%D!^|e1MjKPd$+k!|ZzJvyR{&*j(?G`}k+Dn~yL^_=^(x)EypPcNDm}EkoLH&( zv0>y{`qE>5-uXe~aJuh7Zu#MW14cs^ z`;B#AR%QXo5WiqQU8m;?dlOH3w=hI7{YFDprgc)`#0FN5gDP59G@-i|1B3oGBT|H@ zDOZ`aU{x3~QE63_koq7!zN(iH@*usk%9~83u0<(hj?6?;g?fJx2XkVl>q9I7TvFLl z_*q%mvS>nao( z6TlnMq|RhV2XiiHMK@zzikgpcU5du}(DDa+Q!ZCJPrEt!zpEqvCxidPSN9vT9mg@0 z5oeop;zVue;Yz9>_w4mXmy^|hDaG%qn*v?F6IWtu!gI|kEV$xC4c)N1Pmu;vSEi1R zJ>zNX4zo|JImz~qdsg2mv_AH$B^;UHays_R5f zRi@FNyw#q(OH5W9GwPCW%S123&ajxi({?B*BO530P|PCv{_I3e$J#}$)p^|vBOAjj zrC{4#(@sB<&Mq9SZVbd$-yxmLO{}54skkHS| zw54V0JM#MpyGe_r-K4Rns2d+33Y?t+-PWyQ`gWs@Vl2n;hq3P=T z*y*Gt_JpTxFYt;}c4n5P*R$te2NB6?(WEK!ceeL~%UPGRWonm@;eCylhH+X6RLuu?<-SPCfBZPI`S~DJLae zQ>Oev?rSyrBxYz_s_?HKL#1{(h@&NNz2uI)#O>eYo$ki6^xf=-*XX!4`l4M-LQ`V; zE&yj_XW9|2--C>@~cEG$X=7Dla5zfv4g|jryk^KyD=1)|2N~H=KduQ3kvHf zwCa0dGH7_dp3sBEeY^Aof#O7*&K(^}n~Sx&0lbe|!fASDtD)lBUP8@&`qtW^-bOg{ z=tFo$WoL}U0=!^D~-Rj>kDD103Vpi#`?%1wrexsuB$q9ncyptYT|20`aUnv_1 zZFm&%9|P_7RI>L1*F;4lKZVy)+hEav__R8MPG7O$DThEb6$_pTC&KJE=$2;#JcH1o zx-n^;KyTfc)F68F*=XUmk}Bx};heH!F`Y`tR{HsKak#5Cnz~gffmjFVR-BtF9@&^6 zbT3ABlP3ls4N6v9m#8bI2c_|3HuczKBxx17n@$lDUJ>!)3xw$C7cZ?7Zn#vKHrEiL z!G-#5$tQ;^3b#B*ir(62P~3dppm=&k4jxA9+(pMpTr(Ih~Mv z`oFgZ6yPi&+p3kGd#XfbiHzVg@jHGX@qPrKt^P^Ipxh{9s6iF6zWP@nDLU7R<^Pig zj^TbX?$IEA7xCFYXlSM2Gcio20rew3i>MK)`W=rVPB`zi=bm#BTDedBYjs`f0ZNRcP5cxA9TSX)HXu*czmr=6v!l zBQyEK3u&vTlOa3-p2^KI!$z5uNSW;I$#;iXrvIzqMAyzJEF!03ub_867E;; z81R;gx7X#jG`uy)Z$`Y0!&~`eywtf)#eIz%w3h31yv>n8@_ET^j$k(4CgZI}Zj3z- z?aD$YVg9XDDat=ym#Dx3^ua_J6=#2%Q4{OIBOO-ZYE9!%z_il$8kD!_FyUJdxxa092h&EJP`zAkS8u4scCUNhQ`Q&D%`C;HV-)k zL$n+OnSZ%Z1h(IX@tk8SOTWglmLXG)N+e%1vOj$}kJaX#6A(-e$&=mZmKdwbb7NI( ztu=rh$ptwIMAH-|{>QS1a`mExZfVM6ucIFYLDO7njM$R=fD@Nvx87zOkc~VRpMe~l zqMHFb(8Nhz-dgYyTqk?-1!i`pv)L{{Vzq@4gH_bQ_yQrK{ChNB!x8~ys|w<6d?L3| zBd?&g!zAKJjB7nT_V7&3rv-W}NQmjxiNcoXU(^1{v_W#7e97%*&wa=BxN7SM*>{rhg_kXBW!Tx{*e z*7Nj4rM;Ac1DLH?KnHy2?_KnWGe1??^regdA0~j9X&(j(hxXIL5BmtqAE8@6>>sUv z0I@Ot=NuFEL6|%oU22*VTT;|E%Lo%Y2V5o`QY`0BHXnB*>p|~+ILPfVA7eK zww$(Mm9eoQPCR^A)j(vhsO_uNdC}06~D%O}vQ}+!S9|{x8o}v;{7udUssb>2`rPwvrW78^3 z{qCa2?v>b9OkHGkXUbK8b3-sM*0r(_h2A)lc&{8YV=1lPH(khhf(Gu-6Lzeo#ryq) zNmJ;{`-j1Qt=~U_6jIek!OMJ;)Pv(kil6181SR5-j;%?S$lh~8|%WMFJ|cqx%#WVf)NZgjC5srB#i_ZMmM^pH0qGE9{dxF=}F>@Au^5gzE zT>JjV-l{lfULShmy_bW=}EQ?02n5?qhxNG%ef22F<{}xXtDCEBJ0IFbneAtH#-6V zdpLWq9nPr( zvM1kWm)C=g6OJ65UGB!}(`cWXVMPbiP^amHSX+I=71kCf%yu!b`l4G|Qn<1>=#Gf` zQ*P(w9;qqNn$4Uudr-r6++nw#vs)WlS>(?i;<*^&G(4RwLQLkH#(K^pM{HdO9>oK~ z9?km7fb^>xKMeiquf5dP{_OSyx#*_}RCA~o8Apd48szaD@>+*y^8`BYP+-hWeypXV`1vW>dIgt0Np;X)8K|0$;gK08lipa9km{f^g|@ zX>h4d&~Iu}wH%M=;0-RowH(*_6LeVJ>>17Vyx{s7kg*l7{F~Xj{hWB)P32;>t-&Sq zutQ&R4HW>vfj1~|3&CZ?^<;`m-;g6oJtq%&Q1G{}d8S~@u%RkAYd7-4QE@GqWR zD|gXdM}2zk{vYzV4S+a-=*XxehXKwy(T1bG#71u&O%`?~(ZtWwg_%k8na@Mu`0f8( zPrB0|J|9Mo(eB6M`|sp}&&KdMW?#vdIIBALI$z@Itien|J|^1AG1Pi&Sk823DiIIo zbZV-PJ%MTIA*(Jei*uIuxmR8;RzoS2IhBGPVW~5=p98CZb`uqz2adC>eKAD%AhBZZ7b67nINfq$U8m1SqcEHu8che+ z`}p!5C>-;3vxkdyO?q2&AB!@gs>zQ%Gn&q<4}rh>WPPtr(*T6^AYn9pzdq2v8O$=V zr!i%6_yqK3o+vI5a-n~9^iqA6a4DE3VAIk@-#%$3z7<|y`UnDo7~!YQ%mO5LQQhY)!9tV z=QuZr1o_Z?O@YRIn2(Py^4ph^QzM;vavz?p9K%uq#r=0R`4#{$de5}N(TBeFkrky6 zIZt2uI#4+r1=6Q$iErmO@FwfS;q<4kzXq==zZt6XjghsGg8u$ZDCz}#8`b6gXue*7 zJsYFxjBky?t#S0dZ+8))BLB3?)xUID8$oOXUhUycqa7a_AffEJVRX%Ty+^7H08dH5 zjKk=M=L6GU{LJ7pefGluAw7>a{}5W_w2>ymBoc2R;9^xneW1-_ zT+h^qD=#2)Uh*lLiiwxkk1!Kk8iXQ##*-i9WgCZ}Y-NLW!9B~$fUF$5TT>pdYeQYO z$O&XIJI$Y_M@w3)B*m0fpqSNWr8z0U5dl-{N)>5h9?q65f#Al{FHG!CAP_S>kU8TT#J^Ng@haGA^=$N} z+Z%iSt=i$nP~lEL`e)++;hk6-^lLa`zZt*w@=fJJaJV0IM^!|}xW>GG)c)%btn2%J z9Wd+_l*^iEd{2mDO@YpA=GDd^8&p9$aV zwk|a>B{a9Z{`kSqfQwgO{g1w5g!WR6R%$t>;WksEE9@jCh@%iwTCF_nX5fS~wz3Y|Btuby?d@8Nz+I1+ouk z@iJcvrvJM#D-yW9Cn$eFBA8T{{D#!)p^=cO|gMu?*oM z1GYOVr{mW~>XiD~{6|M-L1ozDPh&LD=#Tq67jvMI_XUD_@s7et$Uh^3S-yWdE`;*C7qPwQ^bXK?5sYFY5{)Y7zeF+Cm)CTz35lJPa4!2z7f~Kssewu5aXG{J^?f33=NwhXXLL0 zg%~N8O(*@~-TM$9=9z18)?bar*ya)rzETC&^uZ2V4&q2_|LE((un3f2!p-Q2YQV!0 zbq;rSdpSM$M+nKIO@D;C&kx|M&qW$=b&tDz!s|05)m+okD_3 z#m;Mq#A5{xox=J49w+v0`OxcsCJK9fXl%<;m48U0BFn@M(|s*7@Rfhh>myKo()FRj zA{~9=dYO<{NxR)h_V&bPSjM=SULoiMYP`F*6OSK5&b|ty z8b@;Ha8P!BM)P^s5Sr%*)l5dx;kBl1Hb&DI9r~gmI|Ak&{`~HxLANm)o1bHH02IkOR~_!1l!~f47>2x*#IJ%?9^ml+)>HvbsLAbs|8zi zknNyy^-Z=kQBnA7!QEUyEC)n3wtSqi4++jm-^|m3xyM_DR)Q?bp9`>eiu80eSzipN8FsK-`~Q#hBTw*?YLK9$Z0B&4?t zS-m(gUIx^y&R08%9F9=#YT2qZMz&eXa3MXV7~IIi{5`;ZUmqTlJuF#W$UwaT+`68k z=3m2FC*lZ6TuBmgY@-z)@lTGdL0N2Zs#N1bOyp6?S4m>YVacQ62OPP*kElo#A(x~boya_4^J9{xGg;G>GuU2o0ee73Hla~^wKI80c=&ax zOBb?DSZ9#l?Lrp0@of@zL&8VB148+x2s_dPlwjazi3`66>HG9YfGig8lnpr*-h4aZk1D)BN%|+ zWT|1nZCTT$lNu80hTVE|y-spy2tI?B{JN2Z9<3@`hgblDZ%b4WQP-p;-AJGAFTBDJ zCE&|OmCK0;bu_cTBE8;?Jlfs6HQyxXk7RDINCUf*K7G!C`3g&rnLpXpT)rqEaDX7w z6#U3nro-!8h_tXf@kYBP-AVuMwk=NdZD^Kkkv{1T&RmnubteHa>-O?PUKfC?HP}!` zc%m_`64f{t^wC=~;l*W0HPuyqm{kvDbmpr`5$gb8sI5=4lW;Rbmot@GY zZxTdqN=v5J zcy*K1-BCS>)ngZ2$=-g7};i--|q|O2ipEE)3G1UgY|uQs5Dz zHb6%^z5!c%Z(D;59uet@rJ5HyzH!u}KqVI6fW~PGKA;|euuGd2Y3+iO;K!XqqBGwP zk!}Z)u!;X4NN@iK(pvbCe4KUW5b0JR@h@_CJqIG?K$)qPGA~ZH*bE2G&k<$hi^v=- zNI9^*+5k3j0Bnl3_sSc+n#v(#Ii#cB=E3{x*v2X5z3ysscx^@{n}^)@#yl7$1=vZN zGy!!O4u$`%`jW0;k z`aq*x_?&kYeS@@xPXcudrKkIlo^w-Q;Q1+GXdYV}Bb}*8XDZB@igTuVIa3B_O5;o= zIa7i&mFi4ggPa2A^myJoj`n9s-IwS)ZvfXU?%8b5CTV0}GPskxi=|!dsFEJ-O9I_< zc{TQyB=seIi|!X2@NMo~Hu+Kz8A({{z^^Lnh3S?zDhn9231-SX+uSN%ws@It;s`jenR%kmY989CFA98|Y2mL|U8g3rm%~l+JP_wldduR|VMC~W3CWH(TwtpyH0}9=Jp0qN^qAd`zvT#^h z8a06Q6{0?rW(|P3HdWd%fDGz>^&$@H^1s%OuHLuz!~h}^_t}s`7N0N83?=Rx@}eteVmN@&d2OC8S_d9F2h;5$f6);e4b zQg|5Y<5tBPwnLg41~tA_Dh?x2MeWRS{f2W+HgQGet`-A!^l@~8O_#G%nx5g#@r5RH z^+ll|nvLWBBz}*B+r!GPawV7A7@cLDd8;R+OFlEfHl;cjNx9hC!x8DmK7R_0IL&B( zwEXtYS2(;%F_SP}34>q-el9H=MEZM_M&ab5BMK7*9)tAeAd>F+CN}8zVTvon zF)H@)RLN~H87%zugfx6GnJu_al{OD1KB^(Z`4>1t-jF^SO!9@iGAVEf444hls39Z{ zcFc+)WR9?Tz4X%%=)gHMB#&@%WlBUbH}s&N8#srq{(unb1Nf~E@y0fJAARg1OMtCt zfx^;LTxP~9p+Xoi;uCa5tYuvq_(JW$9_WhRa(@;ecI$=Ms7lE=lz8i$s?EfTpX6QV zJMi|gW)Y>UhLRE87nSlKkIl!7w%xsJ?N#TRFVzi&PS2Nq9SUWhFS!pReL;2TFfyD} zNe>Pqxx&YG>EJMu+{0=Ih3OX%RG5Dx9N~$w_v9OHxyM?w!iXMUkvtuzaRB=JpH1nd}%a*O;_moLXNq6({+?S|`0&0H~UjApJ~oje=a zh9)ML#1jnRN{=VgbpEBKyQD5r#BWgL3SNHE5yctg@Om4~VaD~4`4!(rPx)F-Pe7%V z6-D~TI&-tw!#tM_z{Gb>tR|&xP6K?^2KE~AYHabR;Mggw-3#t86PS=w=Xy%o9R(iO zOW#J3zA4vApu+Zij83t2I9!5#ytTWL!0(FmjL}(pV0Zr>KyMkqv1b>D{^(x*t`f;G zoCFp?%8_8^qjc_f(!p|VU7XS2oMV*<89Sgg@mSulUH&FX=P&L0EMa(Eq*#loVp z$8(S-FXyQd+l}Sc&ULO^r71CF2=rP>46%6EV5G!D;Dmo24u8Ym>}F&eMagp{c|)h< zW!GY_S_6cg%Bv^~3 zPH`lX)JUV^$f)?mMZC+&&1gv-ldR)5O`e=pTQ;YGe{P?C8{dztw{(c`Xb=G{OK)Zi zS4#Wh$QWV3O6hJK8Bfkj|`qzK(EPosQ*=aOz%*I>mNZU-%_Z4~$rx)n)@19Y5^raU&Kx%4cH&w)1h-v2?_)aYEuHZCecS-S@!5 z9GJajkurTTy(~&>-YzWAvF;w|2R_NYW%XoFoa9qnjX5Aik0!qHrs2*$T6<=*4TV6# z(%K>TW?L8gs3zEyR$kQR9JL+qtB{@^O?-Sf&9+haG|I^OKnw6yURBVIz51?HJ(_sA ztpU@wmF_(^nj{LIH`eoDk>{Gze7bsUk_IJW!f)abyktLei@*A{lTjrnMS}(~D70-a zJ%l1B5OVLPj&TB{YKk8lqp)_uX@R?Pj%_)%8RlU3&9O-B_(slhEYjS6VhTTM*w*0u zBU;g`s1(W2!)0mRE@hOZYVq|+IF6@cJg_J@WY}0&PTf+a?O~O68;366fE$mT@qBwc zr*RrTl(X$QyqUx(-as}E+B91u5k;C`rRDA$&+E7+h*JUFxLDrL=E|#SoYl%X-24`; zi(J8cD1nFMQB8Ve3<)ROrLAKSXjt?5-Z4Ze(vvHFX@D6uvNKWGr?o%6*!gM*M9@@J%e|>?aC52Vjav0=7b@c5!t;2v zdL8n4y%ashvh{GWAoBCEkfW`99QFYc=RL(b9@@R$+J#8DM|H^;xG@UVmaDQ3FX+q$ zNbeg-@<`s>vZQErt6j?vt~>@THTVw%u%XeJHC}?MX&;J?#7f~A#5=T#xBCb7Uu-x6 z!w(*uE9k;L;+4350%IBN0J^ovSTnWJt#BU81OD|-=)#)wm%OLqZ zFTzX9sj;m*r?6hEO;HkCS4U_hV8S!W&kV)bpJ3BK;aHk5Gw>4-YL^_>G{HJM( zVIOpYBEM~O^jv%eH&5F#PJ|2d$2lKtJrd6~@>zQq)`e$)Quxi0h_#}?50I;G-3E1@ zYZCBot{jr6_(+SL{;W?G(xfcn9W1~z0RPSW_Z<)TltC30C~92;o`UJ-@M2DLu)le$ zv_6Xj6dfp&flX}1D-MSNjmIsGHnD|B*sjF7)E2nxVJO7{oD^`nMBO4< zBy?^Zz5xeaA&X7l1-MW z_|~@79UQYxB?B~B2;3HU<3y9}fx?e{cPa@j((&9rId+x!ds8((YJ~X)xo2GdQh8Zd zcK&}LUUq8`M4hO_$8AHl`GdLpb+|c?`F4v@S;NFsrF}ept;^*>z&n;I*pNHcQCP2t)Td#64?ej&p96;i@Z!bM|$y!gUU><4k`+vTOA^$j?M60}Vfry>_KJo;+ z#C9fwvEVFzIO>9&A+=@nF`tt&*0yDIGoKnF{XPR8=rt)gmyGtzx{MJxjoN2neXM+6 zvgVTE<2Id`?5$>?DG>9P<~C`)H- zv2-n$Oc7o>Cr!vB55gFKHxFL9-`;QXU|gzizANj%t`2tYUCDbUxkXM(-5(@Vbl+Y< zfg4{heA$L~+JKh4BNaVJR$}swnnk=j<5wzBl*7J$TMC$k;JBRa>vaGD+Z>1Wg2T%I zIgGt(-Nj1YmL8r(^ux^15cn3np6gAV9MH-q26CV{bDm6h6dxg_X@c_pa;at(NfK_q zwYSr35+Ddi-;hG)l0r0vkHUK6Q8$;2z{4?@nC4gSl(GLqE0-k^WpU75%n=s`(i%72 z0^D%%_&wF_)VGK+h&9f6qcy8CAe|e55hu{B{G{SaUF==wHzR&*s8sb3St3l_DMgt{ zA5W(yb~Z8sfvve_GFb226NbZqRU;;@AjI}VS(oBNAc$r}R z?w*@*!X8yGT{EMDVUqVe64EJrEFarC*LrE}JTi(jNNeX|pJUON(ns^KS9N@cq%R=z zg_%2~X9|c{C;5P+KO3_{dar=!V>oqSG0s2|rLDn$MaR}}Ir4C-SYr<1-5k3E-K@gl zFQ|YYoTo7Z*v0LVdOq>@b{@Zv#<{T9z5@5;vuG#2l19xZgW|cV4YF~ZLTrXZ<_VHYd^o~m&sXgR>KZVQs~mynRud7Jr2!cl|4Y~+9J&xP`u+w|@M zj&~csHF+Q4L~P@?rp^aA8Qb`+)h;r!r{9w5mk?i%QEK)7>u*YV7R2-xACaE6kg&MAm-uqgy1iN+3EcPkS#G#LnItDMb9VBc zroJRyw~!1nQW|F^aRdK?KE=@&?E07sS0a=ppDTbb&=wtXWy4{i!TnK7?^%ftnIj#s zk^n6~Zc^f~e2)B5EdNc3CKf6EWhD_QBj?NPu+=GDt`@_C+~<%%*sn>*@5iAPwqR@y z97ga7%mo{B;AYi0qBu%+NQPqTq$Nuck2x-Vxs+TWjndv_2usyU-z_8K!+6vR>ga=y zu@fg7MXCR%ysHnZs!I2JZ8(5%_)q~sKtNG3P%ywiK+i!)#E*_*2#p_D)*OjZEHE_e z;Ab3rfA|8w;Z{@ckO+UeCBz^`^Ww3 zu7}@w*Lv5x-u1cnUf&>pIoTBeETZ4IQ0GLlt(?*=zQo! zg3p=Q28m_f^_@Ow*#lRz;d0MYJYhAPH;CSvHB$hcLp;Gd^6ZsP!npHfr>(Y?n;xaag1`Br8q zxGI1jdX^<(AanCsHWpv!hBAg#SU$dtS$s~!_4~R;B2~h(l79hD**}gyvW5lAt6$`$ zYuE%i?L~Xt8ccLT$BpM$E=%XB7B*UTA8&ucLY=3nTlpW#S<2uhYC@*1Xft%+3yUUg zAMl^c+0aay@fI`P={9Vh!yGv#>f{9Nz2el1Y0qBYvPdz*ZFAPa;H?CvrSZv?d?MGb~o-vkFOhb;|3y4+;{SNz(umoG+uY|*z zMF^L1esd!W^Hr$$#$v)-`$7y>TC9B7CKjN60f#E@S^4Bm^a0?DHnBke-j9$N z>}IsN{+RB9vEg_cnLo{6*u+M7%u#2#t!_#JKfZ~Dgx7*0J_ZT2?x(&Tu)={4p12xU zd6xgY3A5i3JneZlTV7DXUwR%rs?qkpKF`iFO#1G$qGK|GU$CuJgF58*P$2;-B zsPlgfBljM#6V@uS-VoMmvVI|~yUBV%Soe{& zQCJUrX{n95WcS`wHvi2{xBxT{F$a<7>4UGFY$1(a9E#Qz|$s-I5bp z1qaK|#JNk!bGRxdS$9PXldfv9tHWVW|pO_+Vt9+bBnCb&j7Q(wW>QH>=oC%lwHn87fxseenh~ zDd+G)!rtW>#NSUrdOtTQc9oeZm}ZUns>%!&%tDP>31;5@Vz}_8!32n^-lWj-Uf%v9 z@N4J?3k(k>g%of1L(80s#R~ZLCQvB+FPPI-Ui}h#z)0~xF4m;1r@+uRvbPxn9aw^E zC_Z>%s{0Ae6Z6ftgnw@WC0m(gVseNHX{Uoi*q*EMq@2Gh1Hg_#9_syHD<^n z8R1x4u0x-IdI8=WrlBAmK6vbw;&qvqqvZbvvpXiG1_OU=)>H#}ZwP@bZUdMC&pe#% zNHD*MD@qhA@8K+bh^F1sqf(u{klSz+d)fT- z@OkoLiqnTGdk&n%Lu>Lukko*E@QE0w}dMOzKh6IMtER#>~Grrj!USJDXP7d6p{q}Yq^$L5;g^CLU zn5tKp$wGzZ{mRJ>4{XX5dH3FZ(sr`rFgC7a&Ov)ge2OLzk`fA`x8%M87o~9@wU?4x z8p}iZpa)Nwj{F@nShW1Aq$6M>6>_?|sju8-#L?_onjgP=mpJ8BbqZ%z@tzXJc<4tJYptPql~7jd7xEI2e0 z*|WNdjWG4mus7DnieKV4*4Ojtd)XuUg+pcOU6vYc<)$HoRf238*QE}}_FoQI~&m4H{^s<`uy_pvDV=izFE^VV+eT*JnC z{CSz^RJtoimhqGt7VP60fY@!=uiekaG5ydd`_kvluODE~=-(|yjRBVK1mm_Ps9>ntRr2=%BH7>#HPobZQ( zT#~`uf)`b*v0V2yD`BR7vCPn7F{!Z#uWM|s8cU{#Wv&{F>X?65Ec4Y^ z=BlyeQYq{DV4C2_2qTbd06NH1iEOE2lUY_+vqn&pyV&^jGe1ocWq#=y&Avi^s4x zrosN>F*edw&i>XO@*%q}%jG-l>@UpDJl_7t?cSsXZYATCalG*~n@3I%IJUHb)zZ zGm~`j{C8(j5Apn!vlz#nPUjz-WyNsbe~yimU!KDA&S4kt{3(3rIqZ7xdY&hp$2@T! zUwj_V^G^QqdCc#Y@MGu2z*srYf*&YGQ!hy@VD&VJ!PPaUdGmVxOzKERe?~{%c-7y% zeWI8rUtkZiV*9!a>^tW1$KT>T&|A``y!KmO)=UFS-rLM#Vx^n6d*>-Xx8J4}d+c#& z>g&>tx=MM~D%df`apMa=VQK6yyyg>zErR^aC)k?&_f)RC$a3W!seI8zOqZh6sxGpa zK~%mcd*q*5sW*K(N(cUD7g-cL%Gsw_;y94PXMM^t?B!q{$Y4X$?>XO9swwjjy> z#V59~1Q&`yxynmg*aX$SpC4*rp>f2gSW9gsw+dK}GGiDmNTJixyb|xT9vuAsrFcGi zEAbkCp7I=b`i!NHubW8kD;mPjQ?8?xLg=iVxurdEHqrX_{8^49Z?R=nAo|%NoZgnz14lZA+d|<+ zY2hR-T;$#10{e&4Uz&-4O%(837y3YE|QET$u%N|>h`Gz)flesR4IRhXiNKKE#?P6)do|F_GQ~# zj9=t&PJgW#q;)Q79SyCHJ0;KAW_Gn#1VOKw@*Z1OH$n!Ia4iY{!t*b)z|8lSBP;Y@ z45?YBAxk$P)%F>r+@?Y5LlhCI#MNu<)ekw89kgZDLhLAs#go{sOVr#32b=puYHe8u zAYvtvA`*F$cOgE@h<_EIiKK3k)ct+&HMhHwvW!zE+sua9O2@Lh(s>-(0}xKFbuZGe zBnuk4kV8sub9)o&8`qAuH}uuJ-e$?#jd0gm9N{j(R$oiuj*4*oice_|c*&9BE?ZV7 z!o5k-(bFMq`?WMh*wUWc7ttwORs-Z$K_0tv)Y>nkz?NJJJqw|6xn2967KwsChyc?_ zW&?>tL8PxvDDH9OWx!dFb{`QpUWX>I;y%Jjq2!arZf7LAv7B~Yo11Y8XFs{Do>k(v zTKv*Q>ls$@-}#h*|G#rQpQh*u2LZA>R1zrI50Cm6# z;3Du1Am_+Z7!VI+0w&;5peRSSNE=|;3A_b-2wVmfpc|0q$&wz30OElx;89>1Pzr1S zb^@;hM}SknMc^jzGoa6vrC?wjFbS9on1OQO1z=CEMV1c3atde$+5opa^%y0S;4+igcKFI}Fmu0Y=Fu)hO-CHcBT3Vu8eA z=DcH+J|DnexXN;LapPiRCBEiASrqqeV-M*J5C6T*V6SLndgh*)mL@fiHAt5(+V@;z zugd;SVASOrqG&`+xkvI>P-e^#*B}hQm;F<02)F zf9WUtyEMV=_bLC`Pu?kxrxx*-{N-o7RtKXH@Uh%D)JXXlIz%2dWU*vGJd+U*&<3;s zO~7&BFi;EZ1}IH!6Vs$qKpn6RC0i{4O|74t;Z3%$Y7w`e} zfE(ZpNWiU0NCMCebOD_}8_)ur0~&x@U^h?!n1M_n5^w{QR3rF-ykg(W`<+W>bJ{~l3V zOv}@xEB(AF%1*d@NJQh4%)g4Ve>hTI1i45w7>B{8B`Fc^OrXC$lB0NFEWgS_|G?y{ z6d~_-DXf6I`Yweerz!lEzW!lJAC*u4vXG?Zk`z#k66hBR<+Ky-ZjDF&4%5F-`-dU_ zC8cRn1fB_pp#;UlZ2%l4xrDE{Umjv{h@CnnNf+Liq-IPgRU|MetddF3US(1(&C-3k`Y)1)By?*fX#QAz+(W+_K^d5+fv!t zy9ob$bGU9tAaRxSwC&-3+z=!;D2Av89`$v%VL9&eD;03wt$>3)7aPQK6muogp42KSGbhmSd+#X?fld?;mA z;F0dGe!9c>;&?eUq^-;V0ZFQOP!$PlyOW{$BogFDTB_lF7;xmFh}Xm;4|TsWP+-X< zoPM!zQaq-9N}7d|oe8qDUpd(1{etFA^?R$&d*oj=?^ca|qtR|n90Ok|mJghORL5R3 zQnXScC}|{0)j&xtRz=L3NRcK&)FD!*itN)wYBdp}4v|hF;@PUPs1zgl;t6ul0Fuzb zSxU~(gn`%9qy%a-T%%(^DLLaoDTzg(6qGdW8+5+^>H zeOhp`JJQw#8Irw{na011m;Jn(`{|CJ=4gcjhG}(Mg+8g!`PH2ym{qZc2V^(P0r>Z? zTzVOhaik*>cApKuZhlD{4J0Dc;YfRfBOc*{%0he&9gei$fDEO*8B{ZTYNG5nO}EL= zr_9lA!_cKA1^H0qFcjF_&rOP{Wu!xv{9<`(q8vKfyye&F-DNX~@}p_hZirHv&t;|Y zkIk|lk4}>He%0Vo!~{}E$}0HGBsm}&(UCkE2c=}yYWZsebyRHx-<~9g>CxqJa7@Gr z^)&Qjl@Tk5w?em5>rn%bnk0ufeSAW*9B$Aor6*O3Yki}E;^y9yZFL!T}he)yo&%88V*-8Kt%$oK}(j{XYQjG++=u>d%1?UXUUW_tRqt zKm|m_84NoWb~LX^kz>5B3{zFj0DX8E{}QS^8pCk*6@cNBQ)ItM^TRO}2#{HgE)hujx3y>L{W|#_;D-<)L1lQFnNOQ6e867je?` za{xv}?lOF=Q5rRtXOWWf7&UV8oe{&mCdotPj(8D)JRnKP$d^)7_f&(Ru1-@`Wml0C z7Z>z`hiCJ*5YWYco>3Y)PZdth<2Mn3x6^O#L@@agBacBFkk>C3nqAFBswQd}uJ1hE z&*564I;gawrmw57t}#k;0T{K_yk))PkiE8wB#zGB{cDwn z?^1c9Mh#?1MUtO-UCq~fDs_!{Q}v_-`u*Wk)GyFEhbmAtTR1byLI2;!XBfo&pN!A! zE7Ihxt~<8Lu{*P5w-Nah4dU5}O;+E+b)e-`51P*-8~3OOMWm)ZU}TQ zvUGPSnQ@biIgc)0vS@K(;qu1}PZuvS;37AEGD{8`b#JQdF4N`TJI}h8I4Qn+RQl~h z^3VaZ??vgoDa8GED4ZsqmnVnfiknq=@`!s%auG(a_ZEZwW}fWASd;zxM`R~CFdyYh znDvd}{X>C&PA|dMm8XGxK5&72mbWdC4LJ^({&i8js_5}WOP4*d9Q8nVd@(9C&Frl( zO8*}Al?&x{vaU1|<2L(0^W~?Rjv{KZmpm$GJL8P>M^DH<4QPqOPH4P0rtq0dy*~UCvm9sdG|P$1Vu-;o z7M{MK;;hcNG>Og%oL?9Z700IC#;08DYJ&Bkm0a^jv*wxp*sD^Nx roOBK}9}DyU4i?QcujPXZk_dmXKSzy&gR$XxASzQGM6$KPp$Q1!mK^M?Pd_XF-m9&rPu3CYJ3(9)k zv_`vrK3^>jD|@!Aq$~qbP_wdUNKE=bfrL?(21hNLzRRQg;>4*`fXG*2v{c>jvPt`pcNQ zN9A%>mnc7P))nEIz4$&0$MN_;-EdQ?LXkm~iccO%ovi5mYgTxWUZjUY@eNTZo^)ph zx@ccA(xbLSpcBaua)mA?lSnjuos1j%VFSQ40OR1wE+p<}m_ku7a`}RLtoJAsCkm0* z2ACyyeoI4yfZoj$@me4#6cKn%p=m-mS-$^4ff7MXqaMn{5@SKKVzAN~%^xXx<+X;u z>T3SmO-PNP!a)LilzcxQ@Rnw*YBkFWTDG4_4^5m1-sE>g{ky{UZqgv%rxij?pU6z zh&f_%mg(b>wV;xhQ>W5LxHpyVP!22!#Yl~*ZixYhEeddvjeS9(upd!YE?JL?)uIo7 zRs<1a5-(l;i$#Ga>jNOMy{c`n^|&Kx86e(K7&(G1O2y@uSksFfh3bswvR@}CDz~8c zjNfY99l;j<9$X>67x23fynx>A8Pc~6LsqDCrs!i$&J2AJYo16S^c)$s&z-#~HWBn? z$t62^mI|*rCZy2!JclOsLUUq!q0UjHk7Bn#nI#3JifydNUQUNvWbTGrRn7%^g;=E5 z7pik*T+tJ0h*wb3y&R>^EN6M)-S>e1?o%6*@l=}Lak&(VMTQz%i0H?u7t8eNU}Uz* zvhUIa1v~QsUF8+3lS^b)tyQapR^Q#78T3`JdrLMYD-^B0-^l{!WsZqAFTW)E$PhL5 zW?!4SrbSuvT~CM40*+t4JJmG~AI>0Ws_I=dr)V^`i!!4dgEotDi90#L4c2Jv_=f^T zW63|%Q2s*=qw1du)c;hV`KJOc3I@CBwbwjsuh!dtB5sO(%OhPbm&_+)rG<`GX-n2U zuTYp-5$-eD$misti#d&%D2s%S#ZOQu))wit3g5Cb9WIx9OdY|p7zK0I#r*8F>f>8I zoRbye&4XNZh`qVY=-5pNr|8E8(W&gu1x%O4{tf-$^5mlcQMK18OX(3+u>TD}qFh^F zrZVyeo1AvVXHYhsZ%TrSL%vTAFRXj5A*KpxC2`!z0% zKw0jxjWS!>xRA7?GolZlCRuF2vz!z@sj`_5-t9*;W2)!p&k=u^SDRa?DkPR>UghX3 za#4MXJ{tW{h*tgRXt_(RJ)C>=a+Yg1?~w0-GOr3ujz#6w)^y(k)dtTmAi1lOM8A`? zx`$uMQkjvePS{N{EXn|rTPPF~r*ev^wXgd%LvKWTMlSGKEY3|pX`Ny+C}}0OQjA2j zCnmVUftMtn?YnL!_~Y(PuB<%@NjAIjvO=+&chJOw_mp(?9OYnbp)!j#pfc^E6QpN7JTbZE>Qi!M?UPYR zOe~RifD@BuKN4nWTfSqWp}}|E1L$flOXj-9#|q-Jm}3toUNt{|ACZUeEA{%%*66t5XmXSm{Q5`8fc$F?wj}-2{N_VNt0}TpA!WxzD zx(&BnE-qS|^v5_$PqOK|snJJE40NVXy71%E^l6`5|GQA)k|&L<-Fr+) zrxF7p&}!uBVU4w0vAOdEx1Kv@|IXLetA;6SntN8tO3aVno$3>vN^GKAiHR<*#^U(U zHwHb{smA2woocMRpo9ZH zh7;emB3IpTqNdr~qsHUoZ(ABqoSC85$oH@_o&|jRK#&^C)+v>Q&!lKRn;JfI3*&&s z<0vgLHkNHvLQSG5z40P)OszWkX>3f{sFZU#R#W5g#uJS--=1qc(Qx`~^Odttsadb9%mPyeu5*gxa>c8 zdz=9T{Z!*WJV35<8(wVS;Q7ifc#+)+9yMF}CwS*9BDOZ>t7?As@c3o%&%6oy_qXwn zn63It1wn2>-PMBABHY~W8pGiBHIrC=Z-0Wjw@jZZ1~u=?=wNoUGxjFXiL z)Ysapm5sAHO6!y;l_dswTx#wrb-5dw!W)w9f-~#doJz%RE?bS;6==ZU(VGqsKzNGcSG9acLP-3-EmRH*@=CUi5`~CeqiBMX( zKiJ=&2%BG`as6Zbe}!o(J{IAJ`;%xvk(-sx=I*6y`UjE)^gsO{*1pCUmnYRI%66=e z0vy}3$QQexANRV32VAS^C|8{|INF zqs0NCLgKUZserY@p66*;;Lu<#>;Xr45Zd4zhV>zCA!;F zgate3b3s1|9naDyf*XZ_&(ftK;iQ9Z3kfZ$fch}ACt^8kv@ksU=T~8=apl8biihGm z@fa^itQ9v$gVr2A)1$N5Fi_78e9Ly!HnAgPu$n0fJqo$KHN&z4nOV$}!$6~Cvo@H4 zVguj{Oza%q?MI>vwZ5BHU?|IJOy~fzhh~NblYR67+>cNP?hW+$(BMEO)3z?AlQ!GK zra}Q|bSBFcdNy=`pt?+d4;@ItXi(Td5=HM03l)q`IzLPo9DkYj>J!i}fKK#txk6uifPC-kkX{)m>dyY@$yO^owf|-9=pG*OTo)*zz10F0TM) z@lw4P&teo=SE00twTGE4+eBLizSw8=ZST!~L2usOLH7(Ans<0er|A&HtyVqEvqa1X z1^Znu=R=ip16R*}a;InLwb^p|8+RH@fLxEA=z`a|;oqf$2Zs{}ojQ16;4+k1ciUfOME~mXuV? z&J4XW3-wiUKbJmBAJXf*H=q5BSq+mKot`|TRQM%^ zo*Xhv>m%ES8heS{@N_h6s-QiFP851o&}l=1{FkHrnvdeS4^Z zl+#~_E*75OP3MI_Nxq_2!jF@N{f8n3dk8N{^!v!ALWYxOM?GKCa8I)0^0VR%_S5fB z2R>CuI>almyG6hE@b0wpcZW$S`c(6xbS$<clINOb!cUfMdytQ7@EgNS8b@b4aV51xP4A%qwyJB`(oN?Ob&nc-Gg-JsNlgW z3ZYYr4a^0lT&RPCeHAYjD=f%DMUL3cY8>>;s2RP#uHb&$r?}^^4=d>S=rqBb(hboe z+8qmFqnw%w3Zu%8Sv?P7YANWk=+Vid&wD5;KVcybN%Ls;OhW1R1XuI zyJ7#Uqw9$-e7!0&XLKOKaQqJ7X4kXT)vhl~rz|&6LH==yZ45t*3gwSj~6J=`lZhd~A1l`EEFi4!ZR3&&@Cb5>5(Vzf`qivab8p&R3eQ zl;P5f9+4kUMkr!}*fKv~JnDvzamAcQQJPp2S!b{I{kQ$Uz8;5bO4^n7cA-e)oY3a6 zM(L5Sg)w1hE4mCwUoj2l5U_gG$_?^&AnQyaUv%epBEI-X#BRKPz$<$s9&1z{`MTT4 z-w@MO9O1|=d@*pHJ3HoDJ=LhN(l;|E|#OCO&mSU1ou;|B`DR=R)uIH7VWy)ZryMJnS=;o0?czHyK+hElsR?*1>A zKzxp-NuDM=SwZc0rp`SAg>0J{8f)fh6X#fv6E#2gY6w-$#hDN@#5oDai zWHGbi6(G;5H}TMjrrc%q&o#4;zJW*0=PxrXqX#DrkN*f$#Vz!Oo@U3o8Jw-IgWR@@ z`I+^+&Y7t$uU@kh3rso>4O>oeC2`9Ujsg5FBMN{JADU-3lh zL%IpjBAu+UTD#feX{C~SntY%|oX?8&~6Fk*5^(jJs_`YGC0 z@2;qgAFtqy6%2JNJ=t@B1~XI!8QAK{wn_9-dRk~E@?)xFj*F9nJkoUuaB`M=vUp^= zz^&cyQS;;o!RtP{cJf?b<0Y31VJ0vF3bf6i^^x!H1V3A9ajbH5=w@z1~oJa_1yb9eDv z&7X4{c<%4_{iz$;tH?d~$6R^2dS}mu1n_+>q$jPXb;G(#S zaovwA3zuOQy?bh)5V?)cnW`5&x6#t63xy5$QZ_YwKT#5B!(LoHu#4&OsJWDI*Eb8-Z2J4D~C*M6)(K zmq&EyLz!uU_$YlRbGYf)ZR02l)?jB8A9K?k!WS>`H~_1Amdy&RWixNy%>8H!Iu^iOCM$hfJG>wV%E0C#=sjg4c^O}yd zu!=N|_;G%V?<1YI>&cUJ@wB*v5FStx>+&HnTQ@7{N?Ur4!w)O0tgg?%iu z=-1PNOOC-F!5AsKOxYP|OTnH1PD@dmY&+_??HFO=V|(y+)4VCP(|#vMZf|VBM!AC} zYQ7TYve#FGFP{~-n9@@@{e>4OZOOS` zDBeo5XAJN2FR;MO0^Ej7>txFk>YNeo!`yAQhMHOWa#}NENZ`G&PM~}vG@EJ|kjd9BAvhXo{P<^*BkQaXQTppZjp(abDut&AG}sEE$wwf!dOTku6#6ytaT=5xCfsADcjrFu7k!Pln1uNNrhy==KI*yj z_uSxN@hD++W?rB!B<#a&UD7xc#-GY8n~#QzzK^|6jkEkqe9Pe`Dtr$aiM{%N?Cn0j z8(@JdeBWMcy59&(s5}u5!%bf&MnEBE>{q6}yKEWa1=uavNGgO0$z|2HtF5yPH;Y%e zOWXd1QrQf-qdXqv6UCJM@HHkp$O%)XRq{~rq}GxU6eYNe!ckOt0rk^4z$Dm8tNN!+ zGW_PdDI2T%{5kpaYQOumS!Ez2j@ZDkA0B4km z?ZcF}9|^)1$v8Jw;|zK>FN_pFF+1k|o;lor;IzSX#sq)n&t2-&C7nH*+0{e7nR&ZM zT|LlQ6uG&lxyAU2c3L3c((kFI~+ASu%Ki7LGD-10%FJB(n3|y+*8dkF}+l&mYfhPLi_F?-1ARG0>xQ^IX65s$XPftl`So=y*?GhC)_b zhv6!MI;ktuuSJHi+y@~YZ5A7nB_rY50P9W!53<(56j87V^upZ0nIopl#W7bak3j{N zpI$kqb4$UD4#)E*QrJUBAml2Mh<+T#k<#DD3!~kIGu(ynu_r6VhII35u3ir` zT2@<&J{0Na@&cB|6KyfaooVD)4aC zIi;GItA-mZ$C{yW<9Vb(WM$LA-=J_l27k-l-qYyl`MMI*|BbsvoV%WGMid5had-RQard1I zf5Y7)V9(!kcj&Y~N@EvyC-Odbaks7piNELW;EX?Vm+$p6e>oEJSMKI>Je<43@8Iqf zo+)#e*X`zRuBD21x-WI*`AJ9^g=9RL0xmZOdpNZpH6b{ z0|=c{{0rXRUEDVX`}x44DZ8NGAmE}k zpN6?JJ?cy*=O+COB{X0gkY%y!3qYMbNyQX@rL+DLiyG=Zi!}fM(r3+v9$t-l zCRXq)y?9UPln4~FW$4@_tmJl=(RbYftZ=FJn|RCQYn?2MS?rN1T`gp@2l39Ki}Xef zw2i!KJTsN%-aDw|2#QLN@NIZ^H0HL+*?5~>_6w`Kc$K2J{)thWFnKx|W#Y6QnCcds z6uo>3AdpX$cs8|nm(M0UXECQePC0hyw_>)zZ8RK)S2qS8?4-ERorBmmmC>_a%Tg-Z6(6q^RX^8Y)fd1y zka)yr3B2VZeL(^Q8d+t?GPGK~49JF~Xe**M_w_3&KyFO6VVMU0;S9VNDj`fu&{en- ziEw|!c0;Re0ZX_8Yy{rnaoB%S8h*FwQ9OkO+)>;c?_4qKxnhoIlVAz}CX!u+1Ju>h zPk6W21+`44ISVEU^Cr_B3kC@ZlWFyW{u9F{1HEjDDh;)^D3&SLgDaaAe3*8);4I-4i+c!b6*nxI+>mYCQy6D?X4=3T}` z;k!w+a?#L|2V@7z4Lcw2_F}k2J;YQ^tGDRg`lB;d*7$m6_|E0R;gc|hEs)D7=5+** zk(x~&pYk&g%VmwEF*6a;kEsaWg-vAVn`I4V;mau}&qEgQ875Yh)(J(^?~e@G%jxMk ziD#+o?vSW@htxMHq~%D3*c39;^5wxC89yEk8+ z??KsYkPNPa;gZq?ZF!kv^-WXwz_7osjiXav^}ImsmbmaEyy$4E+}G9^u^ym z8=qO0CSLw*Dm`n75XPp^9*gf4j<2Lk7bgght)zPw#|jft=(mf*2N>po`oB8g1@mc0 z;Zom+uy~+R?#hUtuzvJEg=S&H1o~@XobY8U9ri$TpGYhEoTgm6dYHoMmERI%r2$Lk z3kO%wN0$r`cCDaKE}1+>SQcFQ{_vh&a8wtV=fq%Mqu!dbM~<>-uOVYp?z3!evAMGQ{>*UjdmtchWbNrLiQ?jx5E?v z97usyKI}$NUQK5_$t=V&p*8;$+ZY6<{7r0QDhR)W zS2z*^tzCMXPWuJ-ZWuS{kD8pRSKMouV__Sl@HGQ1SUwSZcYBtH_YN|+d2>1^hix;{ z#^r;B*1PDf6%4q&rr;C|tct)2%@yf-ba<5PrW(w^}!A8}4j2y{lQ<5J7)~ z=G$~}UwtLFp_5k^v|(X;Aaj!;1WhGfi8&-}X>u9f4f&TtiT&~uYYgb1oZ2c-`MVRZ-A`~o(Cay}KTy+_8?FBul z-Dr-eFhx}4M~DhDfY?QpRLqZ%^}Slm)MT-7V`W~}r^-RF`qVHmM=`T5Rij`*W9dh$ zGQ2B6JQvci)dt$Sgn1T#>I~E92;j)$yd1zPvi1U!NcE@J2fKHyc-*hzA}1 zaM;i{u0n0q1sSf{F2(TS>uZ7r$h>l=Z-c`ywBV5ig6<5hdt`3FuL}WzLp)%M&hV9O zcusa9$r3+epS9D(M+cH$X#S(nqiwX}(TqXu*JQL79(y8(dhoxw`p|=zPa4C090wwe-xRQ~RC6u_3Up&Aq84>uGwhI5hU& z-%!)6&SnduIjvgJ%T%AH=A&7krg1;C{J~P>a%DbrJk2lG3jsH2S@EcW*I|nwXyI1; z;N0pvIj81Z^RcC)d)4#Z)oD0L>KH|rm1@VV7{wb?aarpc!+gX~WGwC(zVA*vvw&vk znjvw!aAd^Ok-D!nP@JZXJXS^Zlb^WO;_+$C?@IA-4GZ-+j6$&(dnUeRS`Y9oUn71< zA6YY~grAxcGxvGa8;<$fpNDBFe){Q82PZ$F?-BWpp>c(}K6M}OB|us|Jx(|>_Zg0@ z;4O*A3bCkX{Dj)`)RFmWv9r-ukI#9d-^5hcw1#?oBhK85?l@9+I8r;Zoys#Dmm_me zWUW(Onu|k%C60M7vvJt164TUmse2WG&lYFCj7#mDrpgjC_he<8>Qi@sFa-pIP<>@1U*s^%5BOU%ymEqTy5O%wUyA9!=3q^2d*;{=d- zT*tZ=!kc!csZ2bgox^r<-b_T)9EfQzrydCx%M6|su7VlZ(FJ|s?YJZbKzj7)iQ!a}IN#&>4lte&lIF-G-@uJkJ zc0+#b)NV#a9Ai-dIF|*>R494$lRcRZBIc>xo$2Jcd!P;VzV-uXNzB}v<;*X%u`vBm(AH-xCUIKbJhk9+a+dcJgV{U6dzBI!zMNy+ix=cH851g)V(HW z=9_Hhv-Ih;`uQ)jkNEgzz6{u`+-wKd<_pMhroPF?(xV~A#5Qqlhk-|>OO+h<4~kA! z9z7$0_=kCiHGFMsISmAzYb4!K8moPC9!jAlM6dGWR;2-_2iR_Ut~7dZ18+KCZOGTa zOS+Fkjpc{?`SC!FybZMKJRP@g7+tn*QHdFv0aVy)gB{NDQs0`pjHZg?l1; zXXlupgn~@4CZB~WxD9v5nhmwU?wrn1x1G?4KRBT{cck#%SMFWzgX5YaG2vY zVjI@Wba>V-*d)cUPtcgfiqqliupGWh` z{<#~b3WDZk`hw$2vV)dv9FD^|FK$dD%jl(zss1}WlNBvtP?uNhnynfTpHXkr&DftI zx&&g}pYd2U5z1bsYc>b_n$V&8i5WdWZ~eq{6Mb=Wyb$F{&uv~Js6F>*Z<$5NDf-gm ziMX@J&3)RGK&%6FC(e`mr#~@4=(`Wut-ct53@CkVeX?#JeP-(vvX%b4)kKQ+-@WY% zLJIcxlm1OeI(=pP1|dSZf9$_&iJ(!^8~-UF?fd8c&sI|M;dY~9z<-R27jgOjk5Tam zu5-B3cNi6K;|kenRP4s(`IJ#H23HcUz^9Fhjkq+sjEc>;%61zSOZFHQlb$mw{*9~k zd86XKy+*~L7mSLjxJJB)eMDSmamBx6RO|wdw{V?*%IKlE@f2OYb20gmHth@$`UdQ8 z-+A66Is%=mR|N98&04whXu>94I`6S=ZTo%dQoluJo_;h_xo0}v-E??#|LS=ff+WF2~U2krZu5zi&wH@gaFOJWvA-Y z{^fg`1TvjYe_lt%?zcQYm&?V`y~9ej_~PqHBuIs4SNe92LI-1%EqDQ!CO7FZh&j!g;TK z-)@T0%6;NTdb>F=;QzsZ+bzeS_jgnT>tsUyuJ>rGv*$G>oDp3kAU4E&`IixJ^Z!dR zN*)1D`E=O^zOR`0 zKIaK&xp^Crn~0k+iRD}9*q4SuehOY1U-B)FW~Ef=7_9XRDe%yDg~N!?Y+!HhhL&B} zfp3=@uuAM>DM-7$h}3;1<`oR*r>owZyxzXfdPRS#7leSc+cV(xJ`O@X(FId#UP}_1 zE~#qji2%0AiV5I31NT}2J>)qHZ>!|Dxp>%)xh?i2lq+lEQS4%sqOxg2vH~m5eMpy_{_nh6gAb3o*o4cqE&t^( zNk=M^6$Q4Auk9-9W51wmOw`X>WN$86WN$CAel7!t+0V5# zRySgI>MUILvrF_E=t3P7f(C(&#BW>5KYKW&F-R|}^`)0ECD)enxU{Rpeu^(zTKi{; z)~L>6cYcFA{~JZCmIGWvFxpjOtHP%)I({8@cW++Hb696Yml@w3X;xs|FR`@)+^029 zz3f-=xd{OfwD0S(sn}2$%{+1bcr8LXU<5hTjJs`s-A7KrX2;6zvK-(7A;bXK?99Bv zUa%og4&J0*F|iu~eDu|phN%d-|1@8YGF(ltseHFp8|rMq>@j53D-iBdn9b%Avzg6< zO92}mYOi%ZTLO9t!{&I@ny?+bDho~IIcyzlCbE&o1Z;KX;n*VVM>D55sWZO-zN91d z92?0z8W!`|YSBIeqKekS8qgGzr?Z-&W@dVE{+Wtyj zpHYX5Fy>q~waeDdn{v^6U!5jQSVG@;bx>d^rWW?OT`RS&m1+*9ajn#FDCH9R%d3GQ zOFl5d$WuE=OtrCP9~!qWY*5svHf={f+=7VL<_LlRqUEp6!J)P9UP~q)Q~f@R5c?2) zY~RG_UzUN`x(BMY9;qGJ0P7q`*jZ-LrgC_(SC*oDElzata29)dDJ8G>6E-fT{;v-m zd@nDvsSNvgv8@lw=ILolM+Hw~Q<_b{A%WL}{8M=w$WK?cekM-?`vn~cd;IlK;ju&X zjn@YWcQ2z~y*@O)1wry${^uSuRuv_WRf7lu&xf{X3$g`xlqjkDrUi$QVU0V+A;4OdRweA+~D|X5wZ5}#+SqY z*jMzIH}#nh@{nYz3J^Z54k4p@g$~2idcrZUBR&*Cx;NxJK358FIaAwA7OsofLkM=F z$E}qn$elTt%?HO3;-#dyUoVB5Iu(0$GF|i5s415$TuM}8`VvQPG2P;rrWAV{eDwYTO9{q1z-+w(&oSjQ(O zkH>CIRTT;qsT~#bZq}vVQslMzF|CA}DT`+LRjbXO zR7H~&9=3^y%4L=T7hg=w%*J0aje)oaLf1IYxbr}WA;HcWY{o2$J0d14Tz;yy3HXZ8 z=Fc=7W1GuQi3}5~p2542$10H98PcU~2f})|6}D%~Ejpm;!JZEQ%8pQ&X$F0~YJg_P z6UmC@;cNo0t7G9a=(|-zac=s%Du2}tu2XdEJL;-h&||YZVauUQ-We94c}yns3I;BO zC84NZ!J`i>HD~{8??ej&!k}msR<^O9@7pJQ4>@?U{5Zy#(e{IDwN4Z7apncMepd{s zYOA-2eYAhmd&`OXyJ;L1S5~Zr_B=GCWHo2p73A`dQrmCY0@>?GaQdI@28H5mIfN?M zHLfdC89e1K4P+Gna742QyWya2A;?K#Tv)WN$8nhWx~DV9xeFY?nav+VYku?+d-)#9 zNKo3pBi0Yzf!?IA9_s0Tmm5)-jEKu(E7t1M^y5R}>Yp;Z>HU?G4+g~N00@&q#fCh_ z2Tj&2Sy^4GE43ZlF1coe8`wqcbYM>+4~n1<+nhIbrtm zp*82doGH=DwP80!)Sn5Bc)YeyYuU~@vm7<-AG;j3CWo!LlSM&nD9;6pdUaEWSk_l9 zr#O#XhWa~r)R6%m#k2q7QLmsL)qxoL*FW`B+lI1(?xNip)L0!trqKD-BYbjXIC*&H zWYB+ChbFv*9J#+6Hu3&K3siBs@{ny`cuv;DaeE=^s|G>Rzkh^}yDaHH(M#3+do1L& zQSdG8Q!{WN7jA`3#~#^?=^nz4Ibk?)%bI-?fqHqnt7uNm*eUW9_*!g05PxK$IzPcP zb_=GfALn`RM8NU29D26pQNHXAn<~q|Ao(#L=OkOTX7(c@%6Y8!RQh?%xN+{ufwQ{y zAARlTeGRwr=i5~I^XIi>fr@MO2uCSwel;zE{l6ae>#F6$FF)(jZ_|HHCmik{68{-L zb>)ox+^E=sXBCoL(s8rm+Wr|`c{p4E$- zv;qO7!ll5~4is&;7_Meq4WCi3+H@_)Bf5BliMY~n&HbF-Tf1Oh^%uP0S|i9TMac>8tba<#qLBk~x|haEu$KyctKU*NqRR~Ql-(>w-$S~1DPeo?0F7n!yfgDBzg$13+z@rig1t{u4c;5zUHedb8I)=knWWHjJnxH`U| zw~ovpu{7tXUa(A}4>74`xZWU>K;9x{;&RkJhVR#!4lDxRZrRh&U#W!eE=z@k@cyLaCGa2dQCnM0^cTa}&2mlaP2ZfP-cQQ06 zECOf5*=Eccd0F&lACJc*7V@EhzotPS!4>6dJl%}uYY8;>pY>!R05E)}PBbXR3@W9SFp=z2bh9J!+w`rS84-toLu&oOk!>9BkIVW%^%S++2s_!- z&>v`X6IV2~V(~fbHk5yWrV^6m1tbb+2cn1{<^2pU6Ppo@vf^gjlG_HBYZRx~t93rF zYe!u+$_-?-xb2_Thsv+oNSZmPP;p(8gSNF(gdTK z&tsdvbCSkTzuX8zyMxtr=2}PB+z?F8*zIgOUvMiqCcgYmK+55T-x)Epv2uZoH&vDA zo`bR%Z~f=B z`t@c1yjCB%B(K#CZSvCh#U=MzJ&QjX^0at~za+2KfaGiS5nl9A&%ko<7CTSTmR^zI`wd3;sr@k*I zK}$|y?;*9#UiC8Movi7{y|6+hA8z;x<9`_8vqQGp`a;==KHKTTKMV`}`IEn?qT*Hd z(z}1?Prvw~|DS5L{}3s>He<3eg@pXQ#HSPiul=&(3yzt$SaF413pEbOI4o3)~?$;@i@FJP;PU*jUoFLZn;beJp7h`1ZeA4A(( zw0&Z+V7mO4$ex_l&!Uf@em{-sRhA`pLB)2P==7g5f{wumQCJ69_>*bZp%CV6PhfQU z9is<+3N88MQADDQ*z>8Hi{I3#SLzq=pVqk#8pEE{gbAg{vj$rD3wy8BT^rFF{3;IG z=D9J|^Ekt*IK#XLK`E=)E)(Fmksfn;VnT341tREWM=|z}U_IV9rfQxE!_!`@R`{0h zEJ1-QPF5v9N24CsA`Mu8SG$!8YmhVBxPMZ74lauQq7v^orJKw62fztl)}N7>;u_0d zMG{N>Q+PPMTwix0-7e>LA`_8-wn!*GXY))*ZMODy6w@zSQ&pTs5dJY8ctO|WEjVC# zwQR&dntUNEb)T#;5lrdBBQuN3_`Mm{pP5aQ-xK8fKrq(K-d)S@BjVt7M0Q}p3aD#8 zqOUa4h6}?+DZ@Bhj=AR5a-MZYj5@c(j>4gXsO2C$rOtJve!&Vy)99c7lQ8&Dx9+tk z#ezx!fz>bXb&JHHd%E14SZr?QitFIZ!pp1ZuNNao0S){m(mOnauRcH0%wOL2mJi(>HBn=mmWH(HVA70h z8$lxJ!nWn4YJWppGV!tD95cM{Z*hq7-2fW?YqGF1fIjf+N>xTgvLeUKFj0SYZkw8o7EShcX!aO*GCHh{b>F51H!*vr)z&d z(1VB3A!sy=8gHcbEC6L^=Cz&ioJBX^h}4uJ>GCVOBn(z=)6_qLSQ(2jgCw}~_ zat2SAH$w{QJ-1*$2>$IxVIDw{toMw^y@yg!UGJGF7xUG9IY=mPK%LzR1Xmp8O?Y+r zSZJ!zcOzWLmaF@D3K>)t*#A>pBLh;j6cEaf{c$cKt1lj91>p-{L2c z#YXNG$5gw;9Fko*7fQZU>RoX>!8SrdxH95#bJr>U=7~_Rdv;WBzj<{+rq9^`P;8_?jE5A18vv*cwfLcBA?I-%97VI@)_QT53>+LI(6-7T4 z-pU6=1t4;hJ^K02_L$GU*#MKku!C10}>n4tky-)@5clU;e zkgIr0_|>aHrMDV@eN}+?aU>50*=uk{>Sr2!D~eRpDYqg9%5XKyLz84MU1@>ZRpN3* za#ze=jn4{qQhICTkOyJ%WBT%dy3219INZr8-W1dd)T)W~pyzK5*B5|u*V5GdLulJH zoC8WMUw|C@c*Q~fA(|~LhrKz8#=6X8ITc+7tZ((M&7@;nE-{nA+g>FBWZbsnWSIB! zTo=9DyzM#(CcC8mgbcwWiIDkPKFavLy_l=5%9yJ$)xL+yYW7L{2ni6ff)1P{q#qo< z1I->Jj*t$?-;*pB&a9S7JxN(_&SppXIfV6bl7UJ6yvY5+-shwuFS1)WK3)p-Cd<6| zt`fU0ZSy9>BKaN?JJAn>VD$6WzW)nq-fs&s+_LGM<$E}q99JCQa$?UOXz?bC2pK7v zdXSZ*{Xl&W5<-MkE2JNLl2S5STHK3dk6rOJpTJw@YQes~IKGFg71y|a6BNm~Dsa7x zGFkCLB4dsllpiTpNtb$|Z^~7YkDBO$4bbwCG_NYlYD5j})v8(+(UrACN>-D|P)k8D zPOL%k;g9b;Ij{@m#1+{re_teRR+9<+`5}l-4X;Be0ox8MR55WK()VgIsBgqmux_T| zvr?7ECo$@Hrh7{2??WEy`|M74zFE${i*4H}{l|w48l)b^#WBpnpDZSyuPOYSL|<_x zehDwz<)>4u6=lvaMrE}-#H|ZS>dEYyRZ+V?PBNg`{clCbjEu35_jIvbmI(wv}eMlII zkF&N{YtU&Nrm1zMHn%=67OOE4#MCCoqz;#@ftBo(F7_oeLkN1x^+qoq z#AibwGI??Uv6&-PN%!<4S^efez*Pu*va(+>U|30}Js=(JN8oCf7<`4hum^7st%fEI*PcG)dBv ze#9UwlBCc5$ZVpJM*5QxLi)cC%=0IKMELjp(j)!JYHurql|A~ZbiF?b>mP)Xb7p?Q z#^ErLB?wJBQ@_BMqf)ev8xVjKLwK&TDAz%0aimIo)X3t&43sLQYI z?v_8gwVFd3IHc>8-G_JBwVQX9ce^*V@eWk7`^cSdnI8=MR&ALzeJbjl!$HhH^`B3Z zlfVRb0rFa(Ha8*~i=b9}NUZKutUI;Hol114X1P;FcWR0|mEuk%x>M=y)JS(~ zZW8YvM;j~^g%EwuU0|ElJD0Ud(u*NvWDj|ZOk3(YC4Cn{LcO<3AcZ|Id54n0C4Uqg zFz&hIoX~cDf-@g{5#u&z`hfWMQB2Booaa#q(D}VaoBrN?usjtdg3T-(_cdO=2aF+6Y=X` zLgRetp@Af9#DVz=#k{;Z#}BK!7g00cF~dIe3LKP`H^(}+xRc+L4h=peFBHLtbDt59nYo9S#fQ6ud4~4T8YGCw(`F`1MXajn?yGK1+7Y?AZOD zq#R79_2gEVD|VlmrAl)LlTb27DjH12kcXt#2E(c`OD6`C{K+_m{h}s}2Mo&fw=iZbS=*bw}A6#)|m{nUS>v^2M=6{|2tf@LMeh3kX_g07@E1oZXI+P4mZAZe)KAb1Hh7z4>mz;WO zo)j96)XQ>8oF|PBCt-c7&;1eK=C`GX!byN%h8))7T7$>U!^Bjr%dI@z+z7s4eU?_iBM$jVnix!Bgv73;-3A44N<8#~AgC$g13UT(v+ z0uu?t^?C%1!+Pn*2r|@1cUQNqw7WwJ7)COEf5L|RJDA}LaiWTK@Y%Ui zaU{7o^Y9vO|3N=Ta}ND-77^Il_}v$=eYd)!2`>k8Hkb2Lx(zp@O>1(CgBcROJN~=bY!JztoMv$@Ol=RsMk}q^rNMlBl)P8SO zfWpjkuqhrm9*yvZ^YvzF<4DvxDLp?DKlA>D^vg){zz~kyw|o|&$_OBcnb^UN`DhM% z|53TeT8oMI_$R4k6p4WqwSN?uG}KKpP5`V2$&P$Wj+nFyMpX$o(c*ay?6|=W{7HbxX851>&9O~3EWE)$VTmoM~p(ys*n4t@* zsHm16jV6I3jy=lD&%5F{gIsjF8sPOQY<&xFGBcQvSMS*%=|_Xd&C;aNWN_L@)OWr89@oe9 zIKF{>!1Zq;f!~xnXzPyV=Docm*-rA z6Z zH2^=;BN@k%$Au?nN}rE~Zg_L1bZaaz!gCxyj`#~VE2P|UBusd#M0$7}i6tJ=tK-Ps zNiRcl6z(gM z9*iebNPp>_cw!TNohC&mkPLYX33EW;Q4M1yKe5A^X3mYd`oS^u-k$i|5u76;wh*WC zw`#mO;$`LQiniD5*sif|-D_2+*>CBKJ_CyR`L%Yv42cQadP#KUh{318Q1c;PJ6F6L zk<)&5oaeIoT?&-mB^{{`E$BsG_KgA97|UO z0;02pi%$Q~5SoJ#iyi6H3BgDBxa!zrelSBqSQFfL_X&%OuY!kpFngV`GJOdlRwed+ zA1u_d95woZkF0Old|4^>7~MNm(%!pBK#~MMny)Xm{<-V~)L9;z+6}??>UufuZiPwt z8ZYYdj`-;jz7PGH?8E;1iZt3l{JeI7>AUwF$S{y( z!B^+xktE-;29Cn#O=)KmCj6Tmf|tCD+_j(o)Wf8blcG@r7!=y~R2)H(8wk0#(kHqB z(lu)zo~W?l^nmh~oMT^&U5bU+ymKv6yS|dMT+1|nJa;Af$RzOwA2_ZR{Yv(riO6Hl zj6N5#oax#u6I+HezKBp@QEcB-iJ4{ z7{?pP#X+4mTP&hXI0gwvhu6!!b4wBDhPZLDdWhYVSJSwwRdToou4+Bx3YH@-h?RR(pL&j)r%-nJD%;q?o{UM&86@>C-dkr%yc$6PZs~Fj6bmf1`0qEc zL(-G&{Ta%qdnoQCR+^tl{3F|VyRUozg7`^ZobYKX?8P48mAJ-2hg8>xH8_%mLg%lXz-{j^mvCKzp$J{Gm*!jJr{TTPJLpo%F@6daif6KdDU_Za5=fG z6d`x6DXOhLZWyy0MojI%I;aN=05lgs1OEUu+6`sVgb{qp0aUr{VF{lr>&Njb*c_^Q z3Y;~$#=_D`K}Y1n=V08^6Wolm`XTWIPk?EmVA_GtO=LTX7>o^9ob1Hb6+d5T6&%s{ zXg7+@eHULw^1n`hGg6}2WU5ep{y=j!nMj0#Rnm|dWR;3rtS--}486)Jo2osABnK+P3fUoWSWrnrc^Tv!B?+0rPH&>K)>(zcbN&T zm|YtDW@G^SMCy}A;#I!+z{9rem$LE@1HB+E%_AjoLDAgf-kS=(g0c9;Fs+;+b!7~) zsO60HT^W5W%4lieYbJ!d}z+1ROFS3OEMUYzHyb|@S*$bMa(`eDh&W^0ePo5u^95<)0y4B zdiT~d922Z1331I_vrV@rCEAk}xA4O^nRmmeOO)6G67I*#1lu>a-H}fmam|u`Av%~S zr7a{8JxbE}*w%YCORE-=|F68OkE^ms+s}*~K|YTPhzNoTNs59327z`Cii@b*@e9#a zvjRgjK|LrHdJwF@BT7jPm6rHXRBl=8da#r*QL+5Mjf^!b+{hln5?d>FbK$-2dCo!d z-QT;uf4qOa^W!@A%suzq^YP3x&wMk1T@(j1upkooiD=8fQdjA#V)hcYj0e9ejxJ$7 zedI>W0F}QgzFNXU;wW_}V(hhKPDRZIe2R)fE5O6XIYb*tTJ9$H48_Uiv8E+`5Z3w*>*B zKS2QPyQHlrE@=USYL#B?vsW}d!lL{CV-K;g*Kttyo=6dt$p%i!qm;G5m-?e}_k0x` z^sO!h{U5giS|EU}fEjy4ekMLzv@Lv~)8D_wmiR3f2Z)AD=HbP=b*QeeZaaF>*L4{z zax>0&;l7j&on!U7?#c{XY;sPj~`YiS~58fq?X0Zo&tW6AE z#=`FPMAIYp;*3sJxn}P)4^35n#_AV7`Kk8ai+Tlaya!bKdpXZ*!(LvoaT%NE?2?qI z)VL%G*X3-G8%Au^dSd7$qsFfSrJ}6^R-&C#O!BrF+_oy3m$My#T3OGSk*ZegN5Nr9 z!fWGXhOTMqg35OB!lNwjt`<}_>v)xZ&-eOA{AcSzmYs69u3u1;9*6sH$4l=(Rot_J zy&Y^o+q-)b{Up=RH2mD^KUqE6Mel4j+ME2;e)Q5G%L>k{rpMMSlC#;!fH%={*mu?B z(h;%N2a%Q<(pqT{TeDeM@^Gx9X&;!VS`!)d#tQk(ZF{SR^j6YOn{N#zqLO~vTx%#9 zmGoopF5%*+eWELy`Fo7VkTWi+g+|f4v6hy@;`EfClIfSM9x}&1Eh0My?a0A5#g-gQ z{*C!a)a0=6gu?Cgxu7LT8rsZ;?pyiXz4*7zbm_#a(xvJcgBQY?0@!otriv@8F@JSj^f9xPaGKsid$jTh*6d`bC=>ZhomCvT{26+; zsY_Hzdvi)+{ECIe%(7f)$4v=#--zpG=FM_M?_4%yNDiba{ zBCPvRhq+3(Hk z*g)6%t*FV+ZagC1UdIxL{;)-M$Ygg6!<3rEvN~B$wBZCMu6t-#*NOh?*%*(PAa_z3 zfhVYzZ4oopv%x%Pi*4n4R>&f|zhpn_6wETRR5J}alyity4Zeo0O<0%B@|Cxb%_9*p ztbnz0wM=+!z&rNN2r*#;i}GkM>p3C6egj(@N~~PHb%wijrhD8B7o2CHDs*htjQ5=o zPn(;x2>(JB?Cm!b#n-y2`)kl&-L^^mzL5E8Ups$w)h3Z$NR7SNTF3_aDjy+r*db|k z{&`Ywj1I@pc-|~(3fVBXzNBV)ONk3=!PP<*I3yhm+3=5}P+CKPRS$gJK4$DAapFmILjEQ?pJZeC+fThV_9@2Px(lr`UyOg6 z4H!)`k*M&osPI%^B{BK*W<=lix=5xDVG5sS=lS7%Vootzb9d=zq|17;G~+7X6m3q> zYgms;>X;MUE^ZXF-&q17-nGU>^^w$F^^jDr>Lm46|22yI{nVd`j#Gb-&S3S5q#^2; zl7^`lBn?;3N*bx2kThDYku*R(C~2(vmZS;ltDr@7hAzt*gZh%>O;Wc>nygwSou(E^ zYEqw&bhf%$(lm9MqzlxCC0(rkLDF<}mZX{LR7sbs6D7@2<0Un#QIh7VBPGpOhk;rs z5eEyXF8dJsAT~k(<) zL)LetwTi5-!CF)oZgI?EP^Sk==P}ma@w#T3pT~!3BV@2Fj-#3_cFrovS>qBPqe@Py zx|le(DOrzueByOi?O`TpTJ-U{b~`6r<9NsGZdmLre~slAuj{aLTr^HVyzZu*^YciV zoZxt!Qm7@cMRL}J#K$;EPOADB;vhNL2!Sk%%sT7zh7yL6h04%j#k6^IX$B1@wHM;!01>j4#pBjp zv=nvg=oP2_?720gvzpVQ{_@LpoYovvYsd{!7p)UTTUqQ#t!F#6=mZYWVVkczzWvA; zn&Y+ip!0g|O&K}1{kW(y#pHD#FXpOP;s%GlC@iB?n$EbbMJ--wqUp}n4@gF2ZN!v7iOZ`ph=O_0ikeQ&gY z*u;hg3Hzb*iNBkIbX_p1Yc*!3WER_*4{6M4lDXN=oDSx^-Q{qhrSZ;;*3_HS7|AaK zzmk5i=x~2rVEHpXc<{e7p+Uu45ksNyuY;c2BwtIj^!9 zvPi}dtT*qs_X4~&PC-FBeDK;mjOKD4-mE`hBFCie!XO{JJGFpb8v`MW)3p=fInRIz z>*8l|_lvqogq5=)1MJ#8OsbA_lmrqZvq>y2XTFOlnUzh*>9X1c%u+0g3mgoN+0*J1 z4!Z0w33NXgu~!k>zp?-XN$ra+=}4Uvp>R!Yy-OBeDp}Z6n$%#Lm31F#c30%w%uAxN z9OH~g;rSe^=3#q9{d260`>Yl7pJ($t6^ta?+%RZr=GOhE#nI>44tFQw;d)eeYe9p^ z5-i?TN;zAj|9o1!E!eQ25GqcOuOu3pPAD8ji>MZO{=_7Tl%l z@*wZFfz{-|Ngz1#-S3vPOD98)4;Rxa*klVmCmbF0p{M4B4PV$MA46s2wXquY-OHw1 zPY#<$9*7Cfd^>%d=#sdY9MD`Jc$i^HC5biUGjmp(yThKEIx`h^D$rT#Tr4=kF#--~ z4M_pTws#5_M&Us3A_~m`pt%FU2!=&!9!fr4YrSW+d4ernsi|<2_QB7JKfJ&m?oGv2 z87b;sU?vL{n%9n_ZEo1VDf8~N{iyY5+X3ul$(xD#a$^-u7R1GDrkF-#^;U~2slMdi zw6omQBOQ3dbmZ@ttfD1ZRas4aw%+PvJ0VXKV-=)sFVulKfs|0&A-2891_gfrF3HA9 zS;vsYu^FcSDslEjEa4}JwilUy(8ZPAlhVEv(d!ds?=Q=X_dsYosbG@^KBD6COX&8T6a%+o4&s3vQMjEA z_ZXK$0$6ra)CoD_;C41DU?^Dgp!WfE-I2L!%G?<6vT$*M=-SRkx=w`a7@UW9i0B<` zl-v4j*{O6@bF;<+`cU zmWk&oSv-4CoUdd<+`rEvQ4h+>PolGu%|YLC_AYjieJb2`v%sV>JV$$h(cm?!7yfWI zOfh6SCDPF82EG%!X};%JCH-R1NAqE{yN~8G%)PLct1?zRx*O9xOl;lFK4ZyZ!JBN5 zIPp5W*k=-gSnEf6B#YPIz(!Z;b(u{Q6ZWwRX9Ib9OcP)1W0eCm$84}l1LTz@FCh_? zv&D=m_6h=AufnpKNlbf-jS?}hvs|{gM=T5Mu`JeNkzSWEDwVOM$yn00STx7-+hSR+ z#geYYl1Z^d;M<=67M47REE2VEv1IOg+~)c=JInoY5V)vyaY@p?_z%4{wsP9W@k`U8 z23z|(Y+^6tdp~#5F6v7)MkVqCqw*AR2_C0eA>)9$1Ksq=mLjZ#YXQI%WBq)G=biK^E-pev6|Me>{kOM~>h& z?3Zb<-DP8;&V1MRw&^wOZ=Bcdwv9Q;Y|QPoA3M9^7P{n)R=*d2|By}KZ%q+V$5^?i zoCS}=DKB&{+^2|7kFl+uBd>R2u&0Sf+S98SY^su46wmusO9&!z37 zaWQ%@%(GOTliUrSLK0%Zakh}%w7qwn)v(aq7AhsQIZgB)?MkBghBzIac`&D9$F#wm z9H*NkcAUg>m?X}e#5k@nNqm2jnXwb$p?Vg|(W_UPwL1UP5td# zD$2#OkJw~ZZhQA5c8$5M$V5BPmD{XlWQu*KF|ZsVBF?ag$bYtW;ts|e_@zVir5W|z zUAo*aDX;bi>=@&4vE>X)WFLt0XILm}6~COpe&u}=M9f*1#%E3tThC%@6s1;omPPcV z@;%zYe`%uL^ofx=@O9_dNcNr>a}KK+504k?&#~mOBo?oub49tXY783b-I8-GcQGBi z3yBMqk0n5TbNi$Fm@B;~9KQF*O8n%LoYa6M zUlUmkET%WbfQhob4Q!ld-y<$Ju%Ia7Q>=N`+?!b}Rh@<|vH{%^_52#NXB{|8{;PQb zdMnX({#?}}qRzANW3uC^y`mxfT=mj7D9yNq9cHY!-c--Rh0g6fq$24?YbI6@h+8cx z&$D3t*{`LiJY^WB>f>$a&$CzAls|`qJv+puwD9yVh<8&xexvHu2bwy&s)I2j*?RS2 zr@R5Obb3o`u|qhq$(qs#u~-t@Nn*!E?I$eIO-~G`$zbddDlyd0z(^xTt}rw*?|>KZ zZpjD}Z&*{>p`)54E|El%$Z2GL`um{+qw^=P;-ioM@6#kY8`*&0uYeeiOITBGBFuvn zM*lm6`Qfin_oOOCb@qUo>let78qL*ecWFvL7ym*`7MGqnf4u;mvq@($be2xv+**A< z(dyRbX^tdswx$##`UZ#=)w)|#I^Z});mRnS$sVr29|lX&Tnd2 z`rtW@4u6$sW9tXM*W5NxtvckP_Eq~5LSpG8_S|O_UH^dUZjmZ$${vU`H9}-3 ziDZc2&)7gq(WCz+zE?;pJOxtW-SIWFrjfFwI+JyJ?F@D5?cokX`y&Xa)r*Csp`0{) zhsS`^I@8rwmvTpX+pQ^AAs*YMCPKbC`l;MV-R&q4=X_my-(JOHUiIGk4->&Te@zzQ+OZN<6CN zFI}gfR3iUzhq}lajja7nD0?Z$d+pVOD?7U?DXd97ff(n}0vTNNzl{%(rS-)3on3$0 zz+;#tZ#Gvp0_DI?;2`iJ&2cEYJ-60Ps|< z_yS`A6Oaz%0R_Obz|K@|Q4YXz0=NkL2)NGWiXRXHj0F;a*+4q*IPfg+GEfB^08RiG zfGfZafTwZA9~c270Mmd)zzSd^Pyy@*YJjt87Ou3wasyE2aYYZr0yBXuU?cD{Pz}@r zUjiL~`+Tkp1|oq(U;(fkSPzr|y8wqlgY2*>h1U#9mWNR}0PHjxm92fT7UD2N|727$ zJjIsJS*mXA=*TgOnEo{zDZDSS`$KoW@rGi6AgG?GVb1r>c6R|$n0BKr^AdAsu6gLb zwMQ6~*Dl!Bf5CQf-wrSqTMSCWd|VGO(P0Av`X#6#c5; z)fwjCRT-q4%FbOVEl_me0;N>E)tCGB?tuH73*w``{CRmiwoGL7<7+)# zhZq&Zq(sFh$Vi#`t{=Z^fF;s^cz^&v4>$oG_a!PqEKsitbYzB&fjX=SDiQ6|bF0F?yY-3U~;m*5FAIVWXFqYrsp=V(7ZO=j8Z&O$ecl~V&NzShDH~M;pC4E#r zJ=&qD1PhWyQWxCFL`9!gL;+&O@wB+bG&nh&rz z#J1EZO2r3?vN(__e)lq^y^JYSzh+7vuoI{UI)DUhvfBkT1AgBy#RL=qe+B%mFeMq- z08{}@K;LhfG6l#3_5&*5r!pl9fO#gguV~2NPF{wujml8nwt>X;OGy@maF@Vl zG*V<{qdQF5SPYsEkl7<Ug_F}mV}+)%EQ0I%ory9iS^ybJ zSrjeajo>3(TkJ7}O%_)o_|Ur>?Xi#)RUb-O9eAX>wuf$$7!%2ZGE55$5J2Uhj1@`H z?V#0wBe7J|$WU;iVL-z|16dWS)nt15nczq6_8w6+ipz+~C%6TR<1nK^smwTq73atB zpwKM4SDu|dWvAtKQH+e0Xek=l02Y}hy9iOzMv2eUL|nenMD(B(AyJ3O0ZqhU7fH5@ z5Os*OOA(JeJBtc1T)Z=u59&h_Iym#CQ$&v8PBHJ;H660kqjq`+wWuh*_42Jv|u z5A5~Ahjz>QI=dzDxMp!KJZYeq#0PPFV6SUu4dPb{P}-n*5C5V;dMh*uKyn-H)Zu>N zbLlUGJAZMxhhyJ&w;b$lVZ4V2^=iFlkN(@A4dVTK5z*)lyX9ZM%BTmrebH%9t^+Uv z|9im4?NfK7avdNBrP6axuyiO(Ky!k{5BG3i-|0hewgfPcnB7DV75=e&sLuinEvR^? zG?&9pWt}f(#PSHw<-;^pmxdaZZ-$C3vE0{fR;W>#3&4nL_i&#HSK(;a7>X-;TV%rT z*Pd!DsH4H7j}RGpN32YWRxx}{IQ$SA%->GIhbQjv44SxW^KxwB<$565SDnu7{wf?aFw5~aDav7SK7kMV|31vaxbXjEm}fIi;9H%apUho` z7bF;DBW4<}wZsje1$d6Zpa#%(_~U&PBPa9F8FwPQ5u7PTRNB_&}FC(tW4dY(|lEh#7Nu5VE>*4j(q>P70?C zquM)-fj&~Bk$Q{BOyvc*)}}R;_u{&;;WT))KlsztvSdcz zXG}FemXq)0=}BbM0D6P7V%k5 zSa3V^5dWo*Q#3YBqrI3Yjz;tT!j!?M8R-;jPxHTai+SmM*eKeT({09L>^lzQ`Pf8- zj?>bqR>~4lIxegiN7H!}eeRuX&FMUvS#lyE4T(vhbnM3ul+GU%jD|GmY|y@-A)x(0 z6;Pa8R2oNNbPT#3bRei1)E_hfbP%W$XaMM?@I+-W=wZ+x&@|9s&|uIZiZV_K8;LI= z7{wznFa$M&J_ec&`Z(xp(3_wp&@NB|C{}ou@OX=Y+;S8wnMlkOgactf2oMYe0DgcT zZ~+wHMjX~GfM%c(XaG(F^*|j^3mgWjfdjyPU>{Hg>;bj|Wk7LUqD3iyg#zROIY1_` z0GJIV0|`JZ5DkO@-hc~$+r+wS8a<}b$iOAg0&K(hPq5fc^9I2)`9WQBArfOdlF8$B KHkTE=gZ&prn|Vx+c*p->z-d)/b); -} - -inline double GetZ(double x, double z) -{ - vec v[3]; - vec p; - { - // find out quadrant - int xc = (int)(x / UNITSIZE); - int zc = (int)(z / UNITSIZE); - if(xc > 127) xc = 127; - if(zc > 127) zc = 127; - - double lx = x - xc * UNITSIZE; - double lz = z - zc * UNITSIZE; - p.x = lx; - p.z = lz; - - v[0].x = UNITSIZE / 2; - v[0].y = cell->v8[xc][zc]; - v[0].z = UNITSIZE / 2; - - if(lx > lz) - { - v[1].x = UNITSIZE; - v[1].y = cell->v9[xc + 1][zc]; - v[1].z = 0.0f; - } - else - { - v[1].x = 0.0f; - v[1].y = cell->v9[xc][zc + 1]; - v[1].z = UNITSIZE; - } - - if(lz > UNITSIZE - lx) - { - v[2].x = UNITSIZE; - v[2].y = cell->v9[xc + 1][zc + 1]; - v[2].z = UNITSIZE; - } - else - { - v[2].x = 0.0f; - v[2].y = cell->v9[xc][zc]; - v[2].z = 0.0f; - } - - return -solve(v, &p); - } -} - inline void TransformData() { cell = new Cell; @@ -371,14 +308,14 @@ inline void TransformData() { for(uint32 y = 0; y < 128; ++y) { - cell->v8[x][y] = (float)mcells->ch[x / 8][y / 8].v8[x % 8][y % 8]; - cell->v9[x][y] = (float)mcells->ch[x / 8][y / 8].v9[x % 8][y % 8]; + cell->v8[y][x] = (float)mcells->ch[x / 8][y / 8].v8[x % 8][y % 8]; + cell->v9[y][x] = (float)mcells->ch[x / 8][y / 8].v9[x % 8][y % 8]; } // extra 1 point on bounds - cell->v9[x][128] = (float)mcells->ch[x / 8][15].v9[x % 8][8]; + cell->v9[128][x] = (float)mcells->ch[x / 8][15].v9[x % 8][8]; // x == y - cell->v9[128][x] = (float)mcells->ch[15][x / 8].v9[8][x % 8]; + cell->v9[x][128] = (float)mcells->ch[15][x / 8].v9[8][x % 8]; } @@ -388,7 +325,7 @@ inline void TransformData() delete mcells; } -const char MAP_MAGIC[] = "MAP_2.01"; +const char MAP_MAGIC[] = "MAP_3.00"; bool ConvertADT(char *filename, char *filename2) { @@ -434,18 +371,8 @@ bool ConvertADT(char *filename, char *filename2) TransformData(); - for(uint32 x = 0; x < iRes; ++x) - { - for(uint32 y = 0; y < iRes; ++y) - { - float z = (float)GetZ( - (((double)(y)) * TILESIZE) / ((double)(iRes - 1)), - (((double)(x)) * TILESIZE) / ((double)(iRes - 1))); - - fwrite(&z, 1, sizeof(z), output); - } - } - + fwrite(&cell->v9, 1, sizeof(cell->v9), output); + fwrite(&cell->v8, 1, sizeof(cell->v8), output); fclose(output); delete cell; diff --git a/src/game/GridDefines.h b/src/game/GridDefines.h index 54cdca7b6..ee05d069a 100644 --- a/src/game/GridDefines.h +++ b/src/game/GridDefines.h @@ -49,7 +49,7 @@ class Player; #define TOTAL_NUMBER_OF_CELLS_PER_MAP (MAX_NUMBER_OF_GRIDS*MAX_NUMBER_OF_CELLS) -#define MAP_RESOLUTION 256 +#define MAP_RESOLUTION 128 #define MAP_SIZE (SIZE_OF_GRIDS*MAX_NUMBER_OF_GRIDS) #define MAP_HALFSIZE (MAP_SIZE/2) diff --git a/src/game/Map.cpp b/src/game/Map.cpp index f6cd24481..f5c2bd636 100644 --- a/src/game/Map.cpp +++ b/src/game/Map.cpp @@ -43,7 +43,7 @@ #define MAX_GRID_LOAD_TIME 50 // magic *.map header -const char MAP_MAGIC[] = "MAP_2.01"; +const char MAP_MAGIC[] = "MAP_3.00"; GridState* si_GridStates[MAX_GRID_STATE]; @@ -1002,24 +1002,74 @@ float Map::GetHeight(float x, float y, float z, bool pUseVmaps) const { int lx_int = (int)lx; int ly_int = (int)ly; + lx -= lx_int; + ly -= ly_int; - float zi[4]; - // Probe 4 nearest points (except border cases) - zi[0] = gmap->Z[lx_int][ly_int]; - zi[1] = lx < MAP_RESOLUTION-1 ? gmap->Z[lx_int+1][ly_int] : zi[0]; - zi[2] = ly < MAP_RESOLUTION-1 ? gmap->Z[lx_int][ly_int+1] : zi[0]; - zi[3] = lx < MAP_RESOLUTION-1 && ly < MAP_RESOLUTION-1 ? gmap->Z[lx_int+1][ly_int+1] : zi[0]; - // Recalculate them like if their x,y positions were in the range 0,1 - float b[4]; - b[0] = zi[0]; - b[1] = zi[1]-zi[0]; - b[2] = zi[2]-zi[0]; - b[3] = zi[0]-zi[1]-zi[2]+zi[3]; - // Normalize the dx and dy to be in range 0..1 - float fact_x = lx - lx_int; - float fact_y = ly - ly_int; - // Use the simplified bilinear equation, as described in [url="http://en.wikipedia.org/wiki/Bilinear_interpolation"]http://en.wikipedia.org/wiki/Bilinear_interpolation[/url] - float _mapheight = b[0] + (b[1]*fact_x) + (b[2]*fact_y) + (b[3]*fact_x*fact_y); + // Height stored as: h5 - its v8 grid, h1-h4 - its v9 grid + // +--------------> X + // | h1-------h2 Coordinates is: + // | | \ 1 / | h1 0,0 + // | | \ / | h2 0,1 + // | | 2 h5 3 | h3 1,0 + // | | / \ | h4 1,1 + // | | / 4 \ | h5 1/2,1/2 + // | h3-------h4 + // V Y + // For find height need + // 1 - detect triangle + // 2 - solve linear equation from triangle points + + // Calculate coefficients for solve h = a*x + b*y + c + float a,b,c; + // Select triangle: + if (lx+ly < 1) + { + if (lx > ly) + { + // 1 triangle (h1, h2, h5 points) + float h1 = gmap->v9[lx_int][ly_int]; + float h2 = gmap->v9[lx_int+1][ly_int]; + float h5 = 2 * gmap->v8[lx_int][ly_int]; + a = h2-h1; + b = h5-h1-h2; + c = h1; + } + else + { + // 2 triangle (h1, h3, h5 points) + float h1 = gmap->v9[lx_int][ly_int]; + float h3 = gmap->v9[lx_int][ly_int+1]; + float h5 = 2 * gmap->v8[lx_int][ly_int]; + a = h5 - h1 - h3; + b = h3 - h1; + c = h1; + } + } + else + { + if (lx > ly) + { + // 3 triangle (h2, h4, h5 points) + float h2 = gmap->v9[lx_int+1][ly_int]; + float h4 = gmap->v9[lx_int+1][ly_int+1]; + float h5 = 2 * gmap->v8[lx_int][ly_int]; + a = h2 + h4 - h5; + b = h4 - h2; + c = h5 - h4; + } + else + { + // 4 triangle (h3, h4, h5 points) + float h3 = gmap->v9[lx_int][ly_int+1]; + float h4 = gmap->v9[lx_int+1][ly_int+1]; + float h5 = 2 * gmap->v8[lx_int][ly_int]; + a = h4 - h3; + b = h3 + h4 - h5; + c = h5 - h4; + } + } + // Calculate height + float _mapheight = a * lx + b * ly + c; // look from a bit higher pos to find the floor, ignore under surface case if(z + 2.0f > _mapheight) diff --git a/src/game/Map.h b/src/game/Map.h index 5d18428cb..65baba71d 100644 --- a/src/game/Map.h +++ b/src/game/Map.h @@ -73,7 +73,8 @@ typedef struct uint16 area_flag[16][16]; uint8 terrain_type[16][16]; float liquid_level[128][128]; - float Z[MAP_RESOLUTION][MAP_RESOLUTION]; + float v9[MAP_RESOLUTION + 1][MAP_RESOLUTION + 1]; + float v8[MAP_RESOLUTION][MAP_RESOLUTION]; }GridMap; struct CreatureMover diff --git a/src/shared/revision_nr.h b/src/shared/revision_nr.h index 8c65ce495..3d9e1623b 100644 --- a/src/shared/revision_nr.h +++ b/src/shared/revision_nr.h @@ -1,4 +1,4 @@ #ifndef __REVISION_NR_H__ #define __REVISION_NR_H__ - #define REVISION_NR "7290" + #define REVISION_NR "7291" #endif // __REVISION_NR_H__