From c11a15b6d549895b6e093a9ba6065e2e3e3b5077 Mon Sep 17 00:00:00 2001 From: Brian Ricketts Date: Wed, 26 Dec 2012 22:10:05 -0600 Subject: [PATCH] Merged Item Sensor (Sensor) into Assembly Line Some errors left to resolve --- .gitignore | 1 - resources/assemblyline/textures/sensor.png | Bin 0 -> 70647 bytes .../assemblyline/client/ClientProxy.java | 1 + .../client/gui/GuiItemSensor.java | 85 +++++ .../client/model/ModelHelper.java | 216 ++++++++++++ .../client/model/ModelItemSensor.java | 62 ++++ .../client/render/RenderItemSensor.java | 27 ++ .../assemblyline/common/BlockSide.java | 11 + .../assemblyline/common/CommonProxy.java | 3 + .../machine/sensor/BlockItemSensor.java | 222 ++++++++++++ .../machine/sensor/ContainerItemSensor.java | 100 ++++++ .../common/machine/sensor/TileItemSensor.java | 328 ++++++++++++++++++ 12 files changed, 1055 insertions(+), 1 deletion(-) create mode 100644 resources/assemblyline/textures/sensor.png create mode 100644 src/minecraft/assemblyline/client/gui/GuiItemSensor.java create mode 100644 src/minecraft/assemblyline/client/model/ModelHelper.java create mode 100644 src/minecraft/assemblyline/client/model/ModelItemSensor.java create mode 100644 src/minecraft/assemblyline/client/render/RenderItemSensor.java create mode 100644 src/minecraft/assemblyline/common/BlockSide.java create mode 100644 src/minecraft/assemblyline/common/machine/sensor/BlockItemSensor.java create mode 100644 src/minecraft/assemblyline/common/machine/sensor/ContainerItemSensor.java create mode 100644 src/minecraft/assemblyline/common/machine/sensor/TileItemSensor.java diff --git a/.gitignore b/.gitignore index 2d09f373..4513168e 100644 --- a/.gitignore +++ b/.gitignore @@ -6,7 +6,6 @@ CHANGELOG !/src/ /src/minecraft/* - !/src/minecraft/assemblyline/ !/src/minecraft/universalelectricity/ !/resources/ diff --git a/resources/assemblyline/textures/sensor.png b/resources/assemblyline/textures/sensor.png new file mode 100644 index 0000000000000000000000000000000000000000..aeab69d9e410027360c2db8082fc947fd3582881 GIT binary patch literal 70647 zcmeFYV~lS>(=R%|{Nuv{##8?Un5&4i8q`1XgEEWy z_YCbMrR@p?1dH;Y1iY{v@cB=P=O(V@rs`mXktzzVeMk>>F8qXN+hbv z?)>Y3<6k+9|CAGTF*kOzc61<8v$i(}VrF7wVP|A!vGPM31Ofsrb8^wp^vb=`*>vAz zf-}!U7=>QVv&)o?O z{8DZ>e_Au`7xdUx#!ryJ@49Z>#9!JgTncF4q+NF3u8%x#&pZF&U}O7~^hz#L&RP2D zbWMPpxEGA!iq8N{1Vw)$Cr4SUzt)`gp9LB{$Gl_vRAT+G;;#*d_tpP=*~9#h3J=`O zYaSAw%4d)L;PuD<3?K}n)n5I`-Yo+^eFfGN(+K=DdYR7t%uz1|`d~^X2aWGTv26Ie8nr z0jigeGmMhbK`>@)e6#wTR0Zo0eN)7$h&1TWxQh6u1WrMH-Iib*PVdfM_esis67)IG zJ%)0~x5H}VGz}xb<&f@gEYdBy|Bft*9(>ZXO{77F+7h0dvdu|*gpE?Own4Ro1$F*z;)QP11O#N& z#cJuR1xl#XeUD02pU%3%j}v|#9`$(TDMt8xMzSo-a+iO7Kb7hyO1hT9TQe#P`s2zU zRz%&VSnXnc`|i|$e&KNHF6kNy0_GE-KR2f{;{Q67KLpZ!d+qJyKPB7;8ho`JwC_d1d_l<9U&wrXC$Q!hUr8qxOE&`;CeBqx@j_{FBr9jd~DxF*B&?M0!+| zo6MJ*GwDsmnF4#uDEqT@r>Hmiz|{T?KHmTP)A065(DQR=^wZGkbMxI$I8gUTJjr#u zzwQV9vHi&qO`H51{(sU9EaQ3idsRSX!};b`IoqG0K!@90)%`oJe;y4aWp67Y@&5Ps z_rE;Ye-!^uh`N-u2nfiE#@<#<^rmALN2^W>|*knX7u&?{rFX>wofcZ|@CTvRh*nBn*22-LdRH6bBS4qX$_Q2Fu z2T~?Pc_U{Du1#s+y=myjhGT4yjCF*d%vk*{=3HaMgZSa;?Lm-qzMO8k+kd@ zlSJ4da6efMNMy*z&r3lJ4c+_f!l#26j+J#2JwaM#juedjzPtOlP$2wj>G%9T?s9Kn zcaYZ+Y<;iOzCeF>TlZ<=;^7z8ye^?_m_zUX6-I>xWLX{HgU<IVj^|tj<|&s=udrr$&d49fsH}d5KLkpD5Og)6G7NPDi)2&=7$UxI<{RQLhl%;0 zXOV2~pz;a{AA$TtfVUibC5E1G2BXAaq4n=(NHQx;gjl20tpIFuXk_x?Lv;fzWx}P>8w@8w=m6P@4n-0CGY^W<9MO$SotNcKm6RGk-iGKaP6RtnJ;f4PrsS-JJyW2(iqn-LE0?cK(n$lzKts zpgwWETMZZmT_oDUbEWBWXJv$f-7!eQ*O!6l4QlEyNNxkc;36JjQTxHxs2B|rsn!z&bYcU+>8_VJm=Qd}Ps=u-s@Vacj_j}~hfWk_iN2A= zT$ib$mo|+t40E)l*adA0rxn^4GLo{{QYD15Zl9ViAqJFQBmV04wlz(@5U%M3r&~vq zja?0;v8X|6#&o`T<480N&T(!ykZmQ`hn}q(mybmz0fz^8#WupI6>g|io{UO=PSYV; z!-+dMxM@|c7hueWR}?Mr@&k*#@}*Zsj4G(xpq-Hdpoj;N;e)CoFQs^}=ZQ@0o@n`e zQ;>yO3e%^_kd8@IZNQVg72zX^?4@tzs0*ou-9$2QEB^?Vk_`(WH7zd$1b(eYl>SbBmQDJAsze@KjOi0rLZ7Fy(CNa z6q7SeW`>t3CcSB=5EB6UOMn2GI)3K)=j1z==xWwBxX&=rn_o*Zy)h(D71EXp>*kM? z$u-=ZEcxR0YUb%~3xAA9LLvMR+}f3}Vu;*{K7!HW8Dd;+=u&xI7`sB6`9F?#k%BRGXmwAUX z_Uo-gdvT2reNhWZHGip*pC?Rxb$PdWumP39gBFj zs&?K(GY?^%R0#*W`q3IhGc_f1TMUGVz#`f($Gb~4r#GTX6)b{ev0odZ5RN$V5M)HWZeZ=(;e$ApC5v5iO8&?8ZHXOanw!42lb5SG5SLfJ~6i7H0dQ z>)*W)K}CPYsZR)Ftf_|Gl7Gj~#wpaYoTpErm=FYKjp#|_l}%3SNe%t!!x6Kf+lz;6 z&~e3c9_iLIb9!eUW!<~O!>*hVB;6M$&{g1 zGqUD^90Z(|$ZcwzY>K2JCM2s)BCu0(;(O>P;5WEtt*Tog-%5fzR)|)RR8?ljzYach zgYNXi+c=nI|E(Ew$;srMJD~Hx+2{%HdvU8#T!BP8e(|_mq*sL-14iLKjAi^a;xd$i zbnE4ovk_KLEqAOMz+l)k&`>R!e~9-4qEVXl z-gx*|s7^ek7T51=#0|$;p*CrW;K}lxl`^R_L``52@({9 zQu{YA#ED87-Afh}a#yrohxu_(2dMKIN-0d)X)?)a38dY)m^G!vF6**?#7sYUnM(WK zct&=M1qt4T?>89m%sF(TxG1=-Fh$?&MCos^Mnx(k;~Lv0t0Mc5 znxV6A6iT*yMC0qXiw$tuYFzKZY^f7zIo5lQ-hSl?g5&ZJ#l|rx$zqGLn}hIs>gc<#6j1x?YfE%#zQ2wk(Tj$^i&i9cblq4h*+Q(NaAuvHP(H2MiK zc{JczuyUW7>MW9Rug2c@s*$@TAR+z1lBd*O331F}>VXivST1-a@6@I4JkWfSONqix z_3|6Z;mk-Dk*JrTtRx?9V_}3zBfBuFRJZ+%KI7XjtG)XOTilPMNPaFE;rPL>r=hA+ zShpxXC&l+LS1AO*rIKPzl3>-IK!r~b`W@y>M63Bp!>)c>k1?ve3q)Oen2LL06zC0l zY6eZVDni*|2$9~g`GwDN_h4wMJnP=N6BV}=*u+lH#^&fOyH^^6gz#vv31UTIq0cbpT%74|HeHqxUn=aOn&(@MI zv|<6h1qrg3k)wV(t??(|g!J7WMI9Ea!N_L=6YfT#Nzy#~^c{cevFwH>Qg>X7oE1sa zE3uw`1LBE**If7?a=V(=-(q7PJbE!w3}W>w*iTypGILUf>Yuou2$~--(NC^; z>g0Lq{&C@oC!kDg1lWt*qyMUrm!7O3t6!n*wsF$Bh;SOPVkmTmew8t6%{h79QQ13O zFUz`6mUW>L%kY)zVGSA5;&@;A!nXtIo|YhdSF7(SFXbt(=c($x-p@@WJiA+ktzyB1Qec=)RSoMNM*c|}8X27}I7rxaV_2Hqw zvx}6w&#~|>F08Xt)D6+-e#9G2@`RKr+>_7VIobwLHk{VE0HVx3@jE%%m+yuhhQv? zPoqA-o5aq1I|RKW=Ey0vt{#~C>x(&%{WtTymxgGxcM&gH^jV0r`S^bh)ujI7D0aGPlH`=+{o$^scs01fzun#ieZm^-n_lC;EJxO z@NxWptw=+A8EBC(KW7|z3y!O|0yc8z&v+3ye#!KCahy zb83XtN@XoRd7lwnMCV9C#hF+m+QO#|3$#T5iGTjOA5XsA6u%Fve8-+ar=o9JVl|?E z4R+b-dNNrR%EOW@zj9)RNj_O|J!2F%!&<&(H22#c4UhPbHDIC6;X8c-v`KMFr#qy- zCP(~aHrpdefnT?HJR))OwYPA*6eJ@Y+a@q=Kpgm6m)z;V3lH!G6D*tDOvVWAz%v|J zre#E|=zij=yZwoq9s$|O_9?Pzx2Lwxc)@Pv9fOX>n9im&h=N7^2h7P?F_j{oxRK<)C3BYKN{rTK&uK$Mk7kyHgU}&6?v{x3RA>~Ubps)dg z`xJ4<(DMcHR?u)*?x~PH624E%1AqjXA|I0RXwJ6%D0_5MbZ@ZdxRwp8_z7nLILA2-?>B)@ z80?N>%_Y^-<?RYIJt#=Oh^zcLGFE-^L z5&$_{y90%@2Rw9v57yMkfi=YCqZ@tA-&Rx;R_Aq+@~NP5qJAWWF8l3CRwh{T`~uXE z{hC!z1+c6oq~1yp;N`vYgKcezN?Dxo)aFGry1PmEkM6SdfqrhLX>o=y$fGaA_QdnnSIZzb!UJc+ z`t)jbE_!i}FfoF`t2FPwRl0>m{uM=nK=A$rHm5hj4tvm$T%cQ>LmZ+DvKf3?`RwMEzah1kln{eI>@_8coBJZNtO$l(7~=7zsw zd%Rkhb2!?LEG*jo&0A5D2k5Kg*{JLJKyqu<^*&*1U7TxI75!(-Q&QA(UcVy)mY;Y8 zx+-6%%A=l8my}JSStIOQLD~OIW-MLjub6)#)OU}hp0zjPfitEQSz21PuB>iP#-XMD z`MKI1-4QZ=ary{u5(kB_A~!ZmTHCnVMmqLd;O_PNT&W}3L=xcft7zFEfmWhtZ>4tr19T5Fm%a;IcZqXFE2m9dRM=N-v$zB zN--&dAubdG$0sOY4+Y8nUpH8t&{wX^6|ekPURgA-Z>gfLN<~ue_%;xxj{Jt-Z*Y1) zVvaS#sZPrT^N0TIQc;IgxKBXDmBFA(K-gY0!K!Ke2Nov~KWq%Ikp$-)GVC{c98m3I zfcVbNv6KnmHK7N*V8F{S=7$|`&y>ybac&t-;v7!G3v44H-ia>-uc+UZt$LjgaVM|% z#+7ZR;xr&2EN~^;#s_DGl-Ql$hLrrJv$yDSqx_8z`LH(MmQ?n;1C z<28a5OgcV=^6M6snN9YO3=ADBDZ82>+x|2s^5+H;w?Ay5o)a7!5kbv=Y zA>6O{xv%Fh+jGkp@SHzyS%(i;S*^FtFG#Zp^u zu_jSgn6TFhwJ<8A#>BeWrp+OyXwny`-w8Jlvxq`3&L9Z{SucNL8hd}&=~S=l{vfRv z4JmY1^+6;5#@c3%^C?DW3G1CbgY@%{vAG*KzqJzF7ltyuCg8>|(aHamjOF57Ld`T>o1w|nUi-Eg|u?`qc;DenveizhpbKkRgW ze}`>En?rnv*Tp0@V~CVb<&5})Y~?bFS?S&Y+z#EErj;v5L|uHN*pMsxa1>CStjX{uY1Ef5 zZWLX1w0pGTk+ZPQylYvGS5RnmC)n`Tx~ZOic`l&7i1a_6|6ehLesxa$eR(P3Z)89K z;#Z?S2b-X2&Jk-{<6zv?UbE#Mwn00CF~+Bb^O|HK{`2gPp`hU3aYwmt03ODat1wX6B4pxF+G=!(d`;~GaLRJpN*4oeDP4}mf`6blgg$wlFL898`lzOPQK90p z-(*72QTI z^9cQ;21jiL_jugnc5xND#tfcwN;8t z(QVw(ogZ2Aiy!=dyM>r|4S`{0O%f=5R`|s(Hv^G@(8#+vNfAF_uE{36F^c2)@A`cT z2eXwKp2CnCKj^GancnI>TQw*S+guGd?CuRaQ#S!HQhL%F8xE0e@NHU~zm;kiyI%z` zIJ>Hno}1?)_Ni(NLM^(AsU`dqLzXiN-%%Ttj@^C7fyIciNo{sxow^`mnb#BYo*7d(na8M0+e9;QXU}xr4K| zu-+XJT)TlRoYwAlM!0Inl3&<ta21M_l;=43@A0dqV}gQ@U}4{KOk4Am~y9 zIz1rb;!lQ5%sjyqzd(m#`G0|k)+3sc@64BUn3mXlt#myqsvE|j zGwxoAIcYQJV2jj}6XVB6J@@_tbD=kBV2c<}y4|~SvGGe|Bq8v(bU+!OF1*0crC}grv#y3EMDpz|}r4hFHhXA!sBUhI&T~_xp=la-K4UGJUfDhdW z@N5x#$F^rp!9@1-^lQ;_)V==`rq;UWI*D==vCS;`SJ(;nS{v>2ise+AReN*bMy2LP zBS|$pZOLsvw39j9$~?t;MI7-CDI(AZb}j1|2A3}Ul*if2phY0;!A%9mxT5h43E zIQ>E7C;7(|?1k6aNhJ6Eec#WUmtoh>S!$z&$fQSz(tr?|eeIfr>kEB@j|c8|ClBvD zhIijeDa)VNdmn)UFyT#D4E}riJ4<6U2A(fHiEClM14uR2rW^*>x7XQIm}i(h;?##81wQQ#$M$(%UyhOiZ>m(!aAVI*47C2eyv$>%6^T!?*W5xn;2mFHr0O^W5CR z@M4f|KCP#4h`SVCOm1Efku%J>mwxb(U#dET!iar{GkfI*k$4bJ_o=yf&x{Q%X7k)P z1M99TA8(1D6VO!&c!1}z$`NXZwD!~dH>|m9?f?A%saSKw4Iz^t6k>$MCv6is+%;(W zzSjctm!}e#?;*9%VW)4$o4`AS;s&nUUix5=o^QnF3a&upu<_p^%1Zwc#0iry*3;#q zjWU&Byk}S(w=+-^iVw{_DJJLj%dv2jq9ZwQ*hnpU4lbwTS}py9I|-qC3;o z1CR97dP?YSfxFO=ht~^jUa0$fX|z!&@5e7*ztDE__&aM}kZlh$=iI2(dCybn$CFR* zlP~tOctxuOVrXHW{fn2?ooD6M^1u7o{P~Fek|seoJ^^7oAD@-J-rM<#CERtD?b$IH zUwaR4?pW78S46Ozrx%_N7X!mlVcJn>bHIUbK!ym#+Y>LFS61^kMN_;1T{&US=@h5D zhCQsOp>zd#p>#Jz#y9Qr$kMN5;*w;WSIj)c#!SQQc|)LA!R2Fp7hiunoyr3Rat%KQ zi(Nh9YWR2}hexS}K4w ze^4JI`>!jE>nki;{wW!j`@Fs|P7k=s zW3bLh<_2EDD*uvg#Ye9^k(P!pav_*jyOS!GIh+tQIQTPmFTQ*5#BSKmx0iUJ*<9#0 zjFlIZ6%oG6?O5E7uRmV=Iuk6xOSiPrZw&6{b5-V1omL7CDdHPa`ukj+O}6>e!xhC+ z>|AWe`JCu55%u@Z)NMV%l#%Sc!l`o{bBty})28q_YE?*E>(R*%f|h&-`?CM)Qb0orrT5GP~|(X z4@>eq$V~?J&>iOE*9{Uk^%VWJ{^!rmo-5o>^3$lM_gR0P)g{BG(Y-9i0wwQQz%Wiy!VkFr3d66ENx8!1lcR;^_rv~1g>77{GXvk=JD}1}^fY+n zgP*z)ugKaW9opX)<{k1yehE6LSmtdi(L|qt_Z5DjkI+-zWW%33GIj5qb-re0zomML zY*`ftT)bh^6!oL`p?pdo%#e4f#0+8%le8Ig>eD{C4^0hn_ceO!AR34Un zhPntXv>(!iy2V@PBJ2W%1;3MDhSA@}`^*Jfm!2o9?T~w7T;*2RdxUq!kzf&xdx;EC zJ3##+SAki4>56?dr5O&i`)p%sN8$H+I#}Fu8?dPRI3xcUU7xi4yR>0F3HU+@5FJ;5 zB|l-2_AfG;O*z&I()aW!m3$XN&WH6IU34qA7!_EWVcqlf-^pg5)hDtd|mN7lbLpNC>_khjZbe z&(eS9^7Qp~Z?X8$elCA5?s>+>iQjxA5d8V<1upTCEg||W!vK&=?ZGu4Cyk)07Y71= zsub_idxnX*gaMJ5uXE&)2gH8{Um__x)&{?k6#ppphhh*Q?rpZXIz{vGQhu;>@74?x z5r@$Cfx z`27MA`Hw*m1b8?frSwG$2ta+{_Pl~Hr%lJFnb|6S=mq!$Bd^du@?bkG`$1J-zh($> zuR;0?%(`6c{Ii0Ab!FZ^)pBI`u-Y4CDWxh)pgYs+I zKnyj6fipK?_|(BIunK7)B%us=wfVUN0bB^wI&!%A38RlAu)Djyhr7e<1-Wp1Q~@Zj zrCvz8HL-&NJ~6_cP{3x8|SMH%0h!NL~=_tafEV9-EjmkgP#kaxy8^72&4r+OKKd3Gj?eRhQ$EKZr6FR5@hjkyk8 zsoV$1s}$q5j;_?wD^i*d@XHC~Uko3qZ=Cs$$}Qg0`THBcKgnT^hv-K*_gzM;5%X&~ zLvp~I>eN}xmtX>%<`Y%}4fsgDbS1$3Wb5##rM7-1>AzaGiS9Ou^Lh@t)ls8bt$vSp zGwY8o81UU3u+BRyJRgv0T_W}kiWl_;3p$|k^4CA$dynEcpLhJ(fe&R9;nAyPCT54| zHa?8J(y2h(v`^e8JRL?=-Mm zE&wShFIPqm?Sla|L|pC}OD)n_SIn1Ct)U1KI3c2oY4Sk;OQv(a^QK@YYsUH1XM|tm zs4-uC*|f$vWs7VeSLh+Td$1{Hf*r2y%T}v|_-ebU@Mg~{cs2H?$JUf}o><0+H!nns z)Ut<9!dux-Avz?|Dzfe=)+K7qw&T;-*9V{%P-sL=uX0v~8BKep6W(#lNxXYB}wtHqRZ- z`9)ToNV!1$S-J7(=-?(R*M$^{9Jj87*x1=|~uz))?Ko zH%-%$<8!FFXKL5f)1A>e=?IZ(q+F4Q5Sy8Gd_o<`~ zda^yzM|e(@Zy*e?&bTB^&|8^N2}M`a=H{Vs?5b9^E>WJB zl`g}C6B{kr(0CP+HaZu$ep#Q$!e+JR2*BM~L9Zckgma)&LoZTAksbg5;Wm{9He?=^ zIE*oyeQ!io56f8al2xvZOe!!cH~F_r@8{CB5uqA}+7Q)%70qp#rbWtRDR!twYx;T| zfCL`BGp7#jq&!Buv8;Y`SKUUMh^Lap{DwZYz^8eAD$@5>4=s3f(nDG8LPoKUQ7^P% zjN3;30HN_lzWDqCr_fQ;;k1=O-a^4Z@`C2-$aP0ALAYD~Ornm;m1F$rOk!e$1&Ohx zlvKud1beJ(2Om_jAJ`bK9;`WMlC^4jpfR{Nl3X(qReQ&|T4TCijzkt#sW;LkQ{s{E zT*fka%1vdZU*ySsrVF>7XPs7M->?et<*u4S=A@?*bK!j+mHwas#rO)K4qrEL*G|7_ znM=+K9t#H7J+YeI(iZw4`i;irnA6*jkd0b>7<2tM4CfT&$XUdZOpfpSW7O_mRPqH0xHgk&<*AiUEUcR zy>N{~4*|4N(*+~=6VF?w?&wS=DUFZ|zw=9L$rjrVT(g@U>Reuf$!STj?{_TVTEQtPtz z&7@XRYsm#b>8i{^Rc;BtFfa@w)g7oSARVcWK~gq3{@kUNtm#~%CuT9dL|!HCH`fN) z=qZok=z4C+llT&#WStfz6>qvZmw}rH&W_8cDDU(Uw)A<2r1uu4>bOGc31#$ybOD`= zc+f2zT2UXvAtU@_ti{Rk)_z`D=RP-EMeWVKP>VRTIfp@9{K$Ph|6bFbsyax7G^W`f zzY=Q{Q^*oD2IzK;$Nwg9 zX!8-ce&lSi983VCd5Cdj0O>W9&{J}pPkf=8R znq8wQM2T~KbmzunNM5jNQG{PC8$^eN`w^)X5Ew2_OS_eO0HsjMGKd61k0BC|*<74U zPi-lwQMO~FVYt6MQAK+Uu&8y_F+5riA*+cP8o#DQH2H8x@YQN}?`jA35iDv8``h}=notppJH0judAIt7#xG@xB6t;Z(K}Q20X|m6T<`KdZS01akV<=pxxNpq2oXV zXdH_*z%R7A>`?BLwZYS&?Cc}JFx)lc3IrFiPfgoKy}>UoR-$U%#9>A-GM5yGqqhS z&NL6aE3OUa$8#p1FQXB)u*EiwhQK?K!1 zv%NO`rmZV-b-KRlC0j??$O;?2WA4+p30sNB%j@x%!Xw>M#u#CQFEVde2rhk+N{@g( zLvqUGeT#3pxG$=n+VHnd3muQcUp~(6(P@wCRd-4?XX`dFG`;LP-CT8Z@^#E7P0m2z z<2PHTS^Z-#NtyPXRJi0WuZ3I&f&$v%166acV@5*SUcy#^a?DZ_~0knEt5H_?GkeAOe$CP*5P!x+WbBq`B)tW+%Rr5v4LW|RH*$C zyUX5l{~gTMrmz;s4?R0GNb+l4?FEK+5}p{XyEkx86kq|otl|ut? z@i@1D9gKoQ)o{3^yl?D&`&zCFIg^YIWkYB2H@(`3>KditAd%OfIFzRelEwE0cKY zz6dlVLp?a+T@pjIrVqTNz1V&0SxASq!-Tq>%pS3+nC?VwL+o)O|@!Kumd_HbRgJN5K%yDDy0uY?Wq7PzRCJSq|X1@9OI3?R+zrojQ z!kMMQkYh)#>ZM)DA@5zoqb2TuRI#K{yCiZh3E-~7P!ZIZ8=))>=*pZ>l=^aO>NBxz zdE_Lv9`QO>olajl&19oVgZm=`5n!;eN;|2eOLbNyb6)ui1mrvkel8VV6gYC@o@G=+ zsHCk&t_hu~ik?x`?%(h*Z`ajqU9u%|E(-YdOIM5)^}Xg6+s@JhJR@_iOu(fof#aKn zfVlbML+py2I6iL=RqHPNn*lrrY`!PaO31Iog9dg|2XB$9L7X8LLU+WBHbEot&yX27 zfM&rqXS(=|gSmuVYQYV|18Tygmjh+<@{6zf6N8s}iuw$_cxOn2!aFr-HB% z>2tLVq8XUzIDO@ooA>)`_br1eBBQcC4m^wst~>2*ZXCYS3CXz+nAc5vWf##cXk6HOym35g;(lphXY|xw$XT2;XXB8Ux@ya}GneR3 z^xqOSdG8F0Y(=(l;koS?5+*x)Nsa9hPmeiEdEX_@L9)goc8jVN!}`u4bQ_}5Vt5$f zc_70V1@;e$cyoZMdvI)lf-m1(mlWU!h5T4JiJ)x+>@mG!YMhmDJs+=o4O$X^K3B?W z6!3>u(F7da4I+t5hwgz>Ihe?c(!P69=3-24XC!S=RQr7bBy{$O+7|1~-Z{D!1Y-8>lvy|rsG=-_#MM}P?ws^Ubq&lMwC5gOq|;<1eefncL$WxrlRzb@X+fE zEaDst{+IGKhxu?LV)0{}K*ZpI_@9<8XD-VFq?W>Cu0PBC;c%I13Ec7##2OExV?|m! zs4V7$O!Z;%>yg0A@b5^0zq`HVcENG#euaD)nFQa&opbA9fx`8jrGfAXbwIRW56T@X z^EYilx+1WK`CJplkOxpr3Sl_eD*kyRE@t>dPMdPVsS{`N7A+mddmme{G$oo!BN3CS z9?S(hHab3b#zSI@W;-uBn{8D$6$lIMbR+3TguCa(viU5;FMJSO^_o)&(U6z}>HbxS z(pw%-9AzY4I5?ZA0*iG_hDC=rMN;EmJs(rm4z-?bmR*3{g94)^f-GAJgyK9*IOa-R z92RYH3r9!F&ooWZ^~r~Mtebuvh#x>*Qbp`zOoZASMj{6;aZr6p)@^jz^H+ z8o+@)sv~qRKYb`QWHg53+~Yz491mrh3CvC9!eM-8BbF6$IVcj=o{00-{1nTy1YO;r zft$JTi0f6Ook$ePN*%t%i#BRpfoGx_s_qtSAe?@N`flB(_tCJBOtEk}&Wit&mRqnid$tcoq>lCP1co^*Mi!4WZ!Gw#lJ^b24xQJ(GL!I) zE3#5&ZiISU?0g#*jkT)`*xnebUVbJfwYwE$z42)gJMyG}D&I1hoq5gr9mivCmwmZ^ zfFP?Kr3v-_4Q$e``I6cH4^I03HaH2L^BNO*6j7DPlcQXIO}}#$h$;1r>*!OI8Qwfo zL8bF9Yd%_CV%tSq$fE3`B5eugvSnfr^mrn|c zo+Sm@PKmoUQexeb7zuA5a3LWy&VeV&g)%5h)et4q6u=e;>FUE?bepY2yI)D}_vu6+ zt7#0gNI+errY)eJ?=H|PY7TElXrHC4llTLOxQ04Twn@Xo$R^*(v5Y~CpV2epthc`MP18JI&a)`46zJgNDgY#df4X?bHGUoa@9bL2BGCrAypD zX^MWiN^-dWCjZRy>eO6&h>mYPd~-;ZJ}4gl5dw!HuXt6Ge}F_APJLkd$2n%NIALy= z<%CXM7N@&e$VQ1`K>9oVhbrRHh=XZrvY&*Rh4r}D8@JHUhRP>Q~~z2l_YaJALwAIzvaz6HS8^=JG$y z8_3ttl)d4peuBRDeHC*;en@;bhI>y0~b}*Gm;cWZe<@>upBG_3w-8|FJ_1 zXs^f2%(7}F{<&gWW6I{&zCiScyG-{*^cB!8!OQl1_?hS->jFJ$_R_qYja-X>i_w?K z!kj6dLuscg6^6^~?YrEHGrpJE_4^fgyA_f9JkdujX{z|Af0#vU|G_~bIVQ%{`z`Fd zEx-0#aAIKGT!_pRDo3w>vofYoJZ4xd_`MXCM!M~*;RI-W9u4Lp2Oo$zeGqdR7d$ZI zQK_A4nhj;R!NXYR`qcMRzRh3VWu@Yq)Fs1)IhYr1X&+~~G2xEF89M$Rmo7+iSx&$6 zrNX|rD;TYz!WZ|H|B0pHu-(h2$)o23=tzzXPj-6_nM^hIbu4cqK#iD9W6w=wfD5{r zdj|@hh5--LJ9=Mta0U`w|uFbnaz^V?>e;Fe4CeJc+ca=z9{yw0;M8JhT0@ z8cKHhLPch{;&!9#F#e`gJ?sUgq&RA|8C6%~ksCk=w3HNy+4dXivC5-#!c}(YW&f0n4rK!M) z+-%x`D81O`@}@e*eWy>XSuM_&BD=G-FGT#L=jxw+h=2LvdYG!|nA=W);xZ#yOoCV0 z>-|fO@NMjc5~FwYf7F!vY9fDI8>r7v8vN|{{YTqG`(QVBRS-%5^%P}UY_;a%o|wGC z=`~y*oOXSti*MsE_yg-T;F}c4PKsW&Xp^D+2kWv^<#KVmhQe%k#cYhm*;XM3pKALI z8MYVu*869Bw?W@Gf)2e>z9%tOJ?}~f&yakz^CO0E+~C@LC5gy_Phc8`aMoI<23J)=am#r#iWw0q z^#&W#_~+R+IB}e&UDDJ^^y5cSD$$gf;>D0#28oEuhG@+IQsxSl^*b%>P4Y}`a>0H; zzX{F|O)Dl+`Kl8dA2+cbC@f(yRiP(GMy`sbZ8WVi=}ty|LMNE+BK)|r^$zzsr_!v* zdm_CT$An8CR2_N?f)0sc6@FIHnpX;P; zfvLN{5?|c|?QXbLUtUtpA~5WRsBhanUV)e@i<+^rM*T-96~9Sp7!vag3UXiC>~}s( z-ntf6>b!eYgMF{)C)5NgEXQ*Ggwbo|MVcL=LusTmIHXeRxwNoXN%qMXS z^kS>7t3JT9q|`SicrU`Mh^_JYpL6QX3d8bPc-+EnZ-9wX`I}NQoxxUfj##lLXls{5 zLAtuMkIm@X%iqEnmL@*-Xt$le_h3Cs251_#Hk$hJD&jP<9lTt^1;_yXV^Vi zEU$bbPk@BC`}kR$!<*PG$mD~<{LZu7-0&O<0lt?Gm|1Z4*#*fOm026B;;bz94(vs} zz9F0K*0LZ&=E`=b&t`{ML6%Zt z>OUWGPfT>6z)(O~hpONOj7b<;0KKk$DnftgS~oq}C@nAlK^}-EmaaF6O@H`cb3VvI zF$n3!2>q-C>OS{9m>(@}_4$c1LgN4A zSaNaU!TLNHq5olh7!x0i(1T&Rb+@r@JUfz|KpCN|>B$fBP;GitVt$VvjF8I%aa#I? zfBTB_w*;^6plQkv&_oNs`|B^|CW%$2wu^Q9E9fRN`Eb#39N zO$027!-})zh1?LOvsxZEx8I(rXAwl|O6#!-v`M+enU8-cE}3)Kk32pAIC=P4PYFNy zs~~@inD|op{_1VUz0eTkIfu`?4Cy*KK*3Zv_~~^Ku ztANqv8W1{{2xI72wRD!<`JvRL%~c(ZOm)3tEC0r1!k8yY$!nC8+fXWBH@|_zj_o9R zV@{+?N_dI+W)oiyZO*1M|Jc!mg-`xo9ulN#Dk0U6q=`G>OMmUX^9AR*8_shHjKe`W zk?i+z6Hrl_S-b4;;}4TCQJQT{R{)>~V5=f1Nx1(lp@pITTjJd^M9tlP+Bf^rS8Y)J zw-?9-7dbRXJ*97-b0Kox9=I&nBSc9reH|Y23yuL_V5j~FJ}}!N5iQU+cxO;v{`af- z^FZR}bcb;exn@xg=AgM!ZY)A>$Nvr?c=@_NNM-9@`OGUuS>JQPCt^|L9mRln*MSYX z&oeh5$B_Z=`$d)NIr1T+n9q2&-yhqlaYbvgnCBa%Z}A6PJXP8yhsWEWDJOJaUSP)O zP+tMx%^PoObI%@>10xR9%!-$_pdpVeVveZfBq#Bydm!5vm>p8@>OD=}JnI;p83!h; z2xLm*Untz8DRjzRw-1YI(6z>QKjF+T)chh@V>*{(S#yRprg5?~gA5!HYq*2T*f)7N zuPkvfPaD1ol6!I{ceX6%2glZp+Dg16N%2I7Z8dZR#QSEuGp6|9dP0)v_WnfuxLA>` zb+lCJSm3wmy^;&50Ljpj`t-|xA9zynNT7M0V5S8eu!Oa!$TiNGKt2g8))_Cn`3g`U z;!L}L{>rfIe%4~wIl7Iqw&kE8iozt1W+0`db`KU+___0nM2=^&L9Fw_Yt0{S^2@(S zuMnVlsXU@_3(|rseFXhPq{t_l{7U*gIAt>R?IkJURdk!guWaSYzUMXs`-N8wEo8P8 zX*(wBLB5+={r;qaa;M|`4eL>b>nrP;x3m*;{3~CIvKVvskGpuU>vX}XU#tP(iEj@r z|DQf2)pmyi{^g78u`Hl7+<%^jHa(|$?2OuA-gMx~X`%Myaiu}pD+2#ok%Q+GM0eZA zl{t*Z8^WwWd7|jeW~R6yy?Zm}KbQ(@!~1=cMIYyG0*3Y!ZH>|hHBwbx?{;)b1Xm=^ zwI}q={a!Dv(d{eViS!Sg7xwRfx^TZR;I8@*e@)IJfkC{FwNCduBETw0o-Y17Ddmgs zKT>7j%=h_!?cC6=o+t}5G$ve9Lbr2rZ=D^c^&lfAY9=V0besI8UsCIq@*o&O6C38H z8G-1R6vn9R!lHj3;Z9*cPPICxf{Fa>XsEdTS-seYEAR| zN7^B)g1Gb0+hn5^e%deiP2nWyG141Y6JN@lpGCy?bCkbaUrPDZkK4ZhL&7CC7qFhGXvcT7C_-2dtFXwlic*F zV|v^p;q&_489kjeN?F;SF<*SKeQf@u6yLNgt9roA zNns%1*4_hp_q*C4w7ufDNm2bq;uaiBa%G=lL4IHW$#60~y_v#ozCwM`g1hfOxH|bG zKq928g-ndL8#z!VA6`yAXef?3FyLawS0f%&j6h%O&(;rQ2IJNw9`C3xSF6|i+Zx># z|K{~#zt*&6)W0EGxnngcFpy~E_5+0fuzGuW8?vaU$NXE>J=L?M(#<2a%r@466o6o7 zyGf}DS)IqCJQaOE&A&5S7*=i|x1B0Qbo9X-f4sFEwJ8vf{kNbtrGHRRdU88rJ*;31x0(1aRyNJL zp1}adzhb8XGpE--fzK+Gjl>qutRn{b0($C_nIwPlbDd9dwg!>NsbL4#7@&v`9Y4* zUW!m3aFGPJ2g%x%!lx^rv6I6e<{K}8c3@TY8)K=H>k4$ma%qNhLovXJxFEQgco8#N zyzH1(o){nK!iG(2bTP13K2rk0Gy$u6W{U-Tb-aLF z#*xs*37qA88!7+3^DW5>wv*o*blQMzdpJWLYC1Pt^~l^_7nJu~NVJtPIu36hZl@ig zezhI|;G;zBBToz1>b>PN+wOA@-6lC;jG2xw9RW zj+GTvPoIv0|0fHO%=`}v5NVFM*O>uvb^?;_zoJRuF2DnSQg&h>Q~sj@EDQ9uf7iKL zi`7^rdG=c7zNZpTfWm=H!3^}mU;Pr^j}INsi1zL$QkqJRN_YB43LI7L>=B2mUwT}8 z{v7%&4)}QOn&1}UQAIfNHQI*~iS)Rp>+S3_aZO1>EJY0*)ey3FetzaxQwvP{glxR` zDy?v_e>yk(!C*7y$6F}`<%M4B3_k1YK<%6~rIEcPWRIAeqv=nd!^;88gfks2p|>%} z#wQ!}->G+2E#l9-sU0+5LJQ`wV|r@Iv-+U3wYG9&>qxwE_n(xQY~v`JK;jNjP^RB z>8>5(vV}acZj7K>bx}$$g*&LWI`$XaDdDYD*nc_rAI=FWLzcIp;__^ zo5Kzys~?iO%&wRFhSbTFU%TC4O8KjU5O|JpO=l59U+ktqsGhR${Xn^@0ZXrNPUyFG zvn^^}uS!QI%#x<*PN{-M-sF;zomenDeT(|(c}#02gr`_|ms<+3HP()PAPd^F&tVf@ z2`EA|Jrk}lB&ZeU%jU6K7S4|L5*Kh59c*}ThvG(UMlB)@bNv}r>7qt$JI7g_oks_Z zCdQ!MoOkiQ=c}N6FmIXokKl&!^J7gv`1`fdce|sxK0+OGmzf?sr)#;m;cG*iZUG%x zCdPNskX(Ys$2fl%Uw`$CBaS}b&Vqpt!ijdj*6Ktjt$|SsG#(cCXgHq6Fo43L1-ELY zp!kPZOB(p_Mj*Y{0d+eduL3@fJz^|y#0w%@`G8LM{L!FjCe;Lg z(^1CVR!6hr|L1Lq8xh7DT>SZJelSV)+R0zhGSZsofcNTl@b9aTUWk;a>)NZgWJA;~ zwb2B0>!>MW*H%cAG%%kO(Gd9c*PRWUbFEZk*2@Ykg?wYrOb$GFR*E_PMR2uyJP2$cA#y@Pb$sx_T(!7cv@O z^=iO`E=xN6GCpny9U3KUk`Q}=&h?~gq)$RYm%O{^mLw(CED&uWpaGNTUA)8ljNUN3 zHdnhaZ@hX>=X?6S^^Nvph>1ssR3E^FkEvZn_$@>5^aY_^O}R#TtXy^`=~sXgsRx1-0Wez+2A z$lV8=FlW^Ao~u|Rsg1gifCqGk1?Qdhe~Km~Tbgac9XRN^F>aT;XBL8)=N4qoDF0n; zv$fXcYY=v+OVEdSimWyCWdW?+T~k#uG1t{R@vO?VDxe}KQ^oIbG+(VO6quCO7AyYy zmxQpCOV2gJrPSra7XV`-qbT#`w_ege2zH03G_F>NO}8i_^ok-Mik`e}^LUL$$^_X6 z;&F5~=PoxKzvTmjs11BU)B(OqzVcUoS3tR!kER;54JPFPUaj0Os#3t=3KrYnh!YAJUI5+3m=3#$yDV*W(`@R zlA?3T->BD4{x}3?oyikr5nQJw^ol#f+e^=+k;~R4udJ9WTJhLix=L9?8ZDBF{_xg(Z*RC78f`iSZPWk7GyN z|9TxdIXmGHS9^HAsd7eXflmfr&mRAj2>jq;P7LIYle}L^W=kN~oel~4RA=)hf6vV( zNYJa0OTDW*jzw9ZESW{wwJnAPze?9RgdXEb)GHEA+9>IMTXqadOx6Du13?Okq&ot_ zS0}Lb`Ch0B`?Je3_BTB|Ee~Fx1*@B;O(W=KuIW1x*1eAd#H@Qpa>UqbWjm;8J})jz znev4$0;0fEvY96r0hZ+dpaEv@6Eb$m)yn>A+`*pt-~wjJTp4pE;wP4qg}9M%;6mKF z)s!h&bZk!VSL&7gsKYV8_sf7!?@(?4HK@QOtsj?h%Aq(i#MMtesF7|u^>ss|<7 zSS6TGVN|%!?5t5iRly|Xw7??+#PgGwsXSp7Gk&lW57Qw79})7|KZ#INM+uI<0dFm-+7Lt%YJ7{;0D5mJZ>T zoR{o;Mv}*zuYy6!@jx!*h`C7C{+)J;@)#sLf&Z}_4{3r!7+C!Mrlmu$A2^E*)2G4< z)Ac_(*w5^CyWh5#VvsgGOkjQRCJ`uaQu07os8HbxA(hMpK>)+oISD5eKFkD#tbb9*3`9^f){UUnxAV1BCQsT-hnU(=IOFi)=!Y7^dQ$yk% z27-YK(M7&(w9_BC4*Sogq{t3g?ExQx`Vp(NhUAO1*Be6B(;H&YZ#rep5uocsPN53% zF5$Vu1B+-~YMRc>2ylFw&@o%x&r1h?=hx!A8=AKMGK)2_O&9WxPa6~{o%n)B3iLDV zt#)wdexcc-W&Odezqkr!*49aVUt}7Kzp)CrrP=pcoh1C(T<8^Cppx~R3{Y12V&e-t zQS)Mc_2cAqlG1YK#9n>hCoEZ57O`7ey-{ECOaxn6YU0(o>ukdO47G^s-xV@M&;P{v z1$vhM#O#(OPmSQIs;2JqJQ^|G^b5Y?;V;pO@QZJeZAy}t_eneP;?=3o%5W5!N{-Ai zW66gt#*`Zs@0I4RVp1B}UqD#xwD>%dGIE-3A~SMkMpaXJ7FOJq!LAdzM#JvJ>Xmld zC&T^#3GBR`;EX*&EeV;P;B#xXcRBX!KE_XW!!9ymGhV7$4+j9+@vqU>Z_S6q{WH!V zGrv>jVsEi{1RP8y&u*jS{w3u2e)hn5Lqc}afk}jK%862bDS@8DgRtJiHcM8jh@++f&VvcKSD^-SMPab*WzAdj=yMvAMIWOi`TrwAA$tXqaxT zAA3mlJ{cUm+Vd(ssOtJze^VFJHKEhJy8kIdM^VhKWbajFM}3NMK0AOB|8dcnhA=5x zm%D$ysW9I9jH<3+tH1brzjBB6|)__J&P7ukvfU|06jgytXlhw!hxEgF?plkxy-~?DIZOo#G+>-LCSe5157m}T6eM3RISP}hohdQCe3@(S>)Rxa~2KAhwN4cZ< z^{pDd*CU4P%=gV+I`~hXZ!75)^1iF@@+Rvb->s7j1oYHNM&}ng1`L}IWlXk-6#@b+ zVk#>lSDbw$@pmP%nCpKoLTM(mn3)O3-u9p{2@jmmmLko`i-hIoQH*dC#jwM(=^`#< z5B?d`_s`5~4$iZ`Ou3tdV)^+L&Y9-Tm_~wgc}ta8q3Y^4M4(N+&9C!E`qgTF;e~JJ zyMJZAN;=N{B)uuF-V)TV{9s7L8xUO!EuTuAzn{>&A{W|Y`e-{o_hdkD#nw({jxaI1 z;${=C!O*_Oz?0raRR^{g@-PRo*d2vOXq3nJHMo9=DgJ9n4!?VEp6_Xim5)Q|Ws5o3 z0h-m`W0PZlvDjHE1h;nIEO7tfZu(uuBz9wxB2li{o&K8OOSDZbUOfl)A<@WVja(bh zzlJ2PNJnnkPKI7}T85)7mwEHT#Pn3C2WN<0Cn3E*sPF|A@cb9OPD*+|3UY|}mq*fH zzL@#?to)SX&A*03JPh(!HhMu&6O!_W-1JECV$=xoq_Lh|-oUeswr$X&{5Y`g(j((1 zz+lkFQ2UbN&j7>$lhj^rO3|_LUqeFwzB1*frl`D65C*xi+B)tQ9XGSSQCunu?d+!Y z`%kmwo==OpRu9x6v}aVMrm7L}x~^|?wyPfi^*1Su%V02;WGoK|95yjIA(>u&#v z;va{_sFee`#keZ{QG*z~S`;ODJGeh3t84sdIg{Z{a6iw(IOe|wGmi-8`iB1zFAhz%3T66QwyL|vQys)+fsG<041hhZ zRH9VyiOq33?|CE-yMjO~54%>!SuHvnRoPO~QJS#Yuc^Z`Lg@9vNobC?DlapZ(PSMn zRxEZfgX$yy_5VzaC+xt}UkBMR;DU+xSO3yCsE2)8m<^?N5PK4r^IJVrrWE62E^1Nt z`z)J_DJv2E$FlC!=P_Ds z9P_4Qr0$Pi<`W8ED_T?7o6>dX6UIHKlV2u{OW-Y5xyfTYU{x5qky+p1BNWy>305A= z7@*Z2A!dcpf9&c`WsE`j(sk1@V)sW{;dEat>SX@N^b@kH5_0`rE$LS8rO(4rRU~8p z9E7|($QBixKdwngh_V^&4x?^!Ba!VjqF~kk_|&ax3%in;yX;F^XoaUxgm{T=_l90z zKmDk#4A8NEdl`a%uRj3Y*?(%qx%_eM$_RpH)a;k$0NorY3p`YeV5cw9Sm!JAm_CN-{ILmWl14~9fMAJG-* z?Sl8@v!U(YZ2j6UPU#1`>Tda;#4Ze=sH)GuhQwW|3R|4f3}ThOm{5A7A}*n}z_* z_fx;RCLK5)3`yO_&aCrAoG%Y|2UarJPn?2|dqWS^?m`OO*jwnlp;0UIbC2zxgrt(z z$&h$wwN_`G*EWPKPS#eQrs}JjT2bJ4j$HUQQmTo%yC1Zv9B_e>d*~v(h{U@CskoBV znoFb|lwZ>bWkrc{#X8XB;k9?tds*pR&Vy*(6}lC{jACSi`$l z>43l(JqMd+w~n61B|8YSQ?t08{uDKmkkSboEFL}?HIdTx23Y$k^D6Y`FRn>zldrHR zXxQt`t-hJu`dRn3n}?<;q=$z}x2s@sWYBfE)L3fn8lIcJzQFP=T4(J2VSrPj{7MYN zN<^fo^W7_Y&Si9MQ*mAi8w$#JP~6(-5Z`0n!18)wt5E)&oy4HG)%#yDY>yO0%_0Mz zvQd?2QNQ?Z?KLN2@KPQf%2j?|M9s+kCjccL&*z~PHE);$Sm#GyH%sSXIF`S^~&*yU;(KNWg~!sNmwNt3M3!F5s&ByZoW zqN$M435z&1VJ>%J;QkVDN;rcoB*VsOoPzrt&1poda&aQPg$e1)lBt#N1%J;6a`S!P zar=1El}dS#Z9*zpk_2L%#Kh*U+CksIrjT-~TeV(un0Uis9-2(+`rvNN6%(4Als9lG zl9?v=i_k+-PwAr@Im1wJ!MldPQU43f*_9Z{r|v9QZYhm{*7Y7Q z@cn5Ss?nl4ei=0I==AN)wfgCF7hmXmP1`^m3= z&T`lB%~ZtcXmL7s`6Qo>76l@UjG*f2OZLzUtp3~;CbB19M)o)rv zl?TY#d;R#tX{uphTr`ggd;Wr}#k5>==u9}Bt!-n3CF_OG+Uxo81AHF7JSD%s8jSY$ z77}khgJF@2N^fYyd)cbi3E)QfLU{RJ%##7va)(+JiS;5y&c@M(6od^CL)r}GOg}=0 z@aaDO1Pf)no3{TXXPfYIm+OEeq2Jq{rD5UDOY4T)T_aWVyG7Hy+3O_we+`NFnXw+^ z4Kw0H79XBZmY~~U2>N93%-~8LXKNh9mX0#W{zn>hX?)bSg^RFR^%hN&RGjucZ>;OzAfE16p^Yo0u zcz8Jkd{saVoBh?BR>6fKQE3;;uEv>L9gg<9c2|iEFGRO_TP*$_0MQUft?g(C(oM@z zSE^EQ)tBTmrgtz+1jjp73ERN|W;1iBhwFXbRJDXmRzjPU()Gcm-Y0}Nc3SPsCYO2 zw6Sp+`_{x$QwtmVSUhuRY0PCe4DPk}LLzW81EggbQjH7iqF(?oOc3Mn;Ovwg|@g-}C+E=TAl+GXX8DD`hY@>UgIa=d z@~)Cp)okGOItX=_*z*%e7@>Mr0!i5l9j5sphGr3(%N7=hH)o@*jmaPmQ)-)zV5t#z zklP?=+y79XiH%Jcv*Z5B^*RC5>(?cNEe(J&#EI-dH6o4!S<*Z}=k9`p%^5g2xZkyP z2M1qzpM5r+D>LOr?v*kbRN&I#8j^j#2_x(lt#qka&FsDmhB>b=N-j#m6h64$b^jKI zNPEF=MeQX_xVBCm4!lfJ5Z-?Zr;6@b%Kl0R&sl+soEt9P@xy zHP4&PdE4UvHe)aB&J*DP3hscux4AyB)vRn=VJKk}!wEd#I4qO6iRa{x%Q)$M<~~j* z2#VR_=HjLs@1}>u-4BPeBmXqJPkhw{4!wBU2{WeiKN8hyzvcMQ2^ad3Ax!L#yY6GA zp;5&ULq{#KWC(5s{FMMb2Z_o%b!;EYWFC9vwC~pv?N{^c*D_vtNTae<4^Nft4yDZh z8z+7Ol4o?IrU&l6$gF{{QZJRdKyZMxd$XL^S@Axy)$rN8Z!h7? z&N~M!T{(c%{VNVepu~3qV}I&mi0`!I$f_X;vJu^K40`SLSG3Zge2-YF>%GsQ3&=N# zwc@|Z+NkIV-@yG43X# zAee(I{9UU2Q9q^mxf|GQUqv`?erxCOa=+m3)zT>}jL^tGvlS+J7C}p#qAC%HsVW(Y zsR}rZ^BwS7k=!Ph2r#a(DNdJnB(PPZCL)&AS=e+GRE0mSJ z&-ZJj?#zJVDZm*+&RV)6JqCiYsDy)w9G!*NBM0BvH<#{w0xjs$thW1_{p$T33;h7b z&s#qjUG*Y{lOL|Br{m|2Z?=paw7TGBmOz&3Q6$no>FAh&)|QOJPZtlYYS`5uIu_B- z*P>o|!qCxkJ@wSihE<(aKbLz+Jwzr9v0#phw9h{w(Iwir&m3L0%+Rwe`f*gLD){V)hRRr9y;2wi_0ITbk zA5t)Cgzryw?SH=fG3>_T*7rM~6fcyVsO8XX25<(SVD*$6HC-8tqB`m{C_$aQXgR{%Z#C}a8vrVA9HdKX zOP-)A5ht3uZ-=8UT7ZH<;O%*uzW`|2!^t=!c~&nCwpKWkfxeF~@M1$h^S*F3@pOpD zftABLZRJ}S+1fmk9&WiUclg_pg7#f&v1@aqtns{BaKEddq_QgTz!!yV(GZ0OFx+o>@*UVbYrz&3<6 z(#FI@zjHf#cOR2TA%hqoVJ~{SQ+F6bHiddXe^^qL6toAxFOtW_O1qo4g+!3|$vjO= zg#^6HyX(=khF{++rWvPCS)|3TpN-HOI=>6%tUMsh8nn81YvKWKOHmrlET`R>%QtMt zyNtgFX8O4=`fvT{hd^sqmOhBSuopk=tJ`eanA$3cQ_LWe6tJIn?7Y}LYAud`y*)+@ zxQ_?t7+!PTt#|4j$1ZpPKIb?LAt3&jv+PD5MvB7A2~#S@3z|*TaMjPcYC(yC%aM8_)l-0Wt3kslu$McsS%Vo_TAnZxxeoWL&PE$C};f7 z3T8gshhAML`t~-iT*y7&y}dtYZ@FtL;FU$H!(F)V_hMetz;`b%^v>iLH#957 z{dF7)#BXzxT(53B;O@a5Q2PG6eWsL|9C!`v-}K{4Ew!n9f%lqvpKF$g)sUFM5#*I zteRj(;W6U=CbZ`Zpf?6yV$Gs?qu0miG3~1&DnYiv6F@DXuZ-&QXiL%UB5k*XG^A%&Yj)r#t6gde| zZKqTNVcElTD{$Q;uEBfW&~mVgs>yNndmkBNA4}>bq*;dJRxP-n&X+GW9g zGi3~-nhl4FuSe7%X>WyZH=;d=#JT+Z&xR~;Op%=jnEbe_fcrnU)Sc^4F`T_0XjuYe zB@`tLFNw$rZjJcX!B@Xw#y+!mEnw8L7LpB$ccbV$PC-jnY*|`OVTgiTV6xxo9CLVb z^LMzjxAZUcQFOP*RXkmwm8-C&+rag%VAK+H8g#dow?c!eRx#WEb?7%(a%k@_q zl%XducB%AfbZf7KS;uqF|2+1odYVyt=oCPZxr!s-kk_qn~y3|E;Ci#7hYY_xQ1x5hirNk)^l zn&S=&9!tlvivS7ET4Nr*Tq|_n$7<%Mt(F*6C6!t&p&q?XHr8D-R~*!)DmEjZRPTy7<9t}^0@VmFQ1S3 z@9NOO00O24Z+Du!hX05jfy`GAruybt)mRq!ud70d_w*+sF)vQx($2ZtL6>EfS44YO z!iCLWAs|n;9GK|wo@B$P*A2Z7Ri2hksVp2p4?pdXC`X^CE%}K4u#83h9+8u8%6c;k1y<{*bl%!k5 zU~B3ot*8t^WyEB>L)YF`daJ;L7|?c*H2Hdne$UFwa(G?Z1>N7ue#IqLn$B8CTD2du z`H;E2uzB{@o40uM%BzF3UJAMd^V*I3pKdfAFWCf;OJ^^Jd?ozdjvu zRt>ejj-}^P(8AV(@PFHLMKllzo1)^1Q)%cw{b+ZEGamwY{ghX2uVzlf#gex<3@k$vD{<;rgcfrbjHHhfH;gW}AoX+7SD#wz z!pWB9V)kqEfTI4xw}33a>ORW=E02}>(LXba_c#!dom`A9t9~rgA`B^3MTw@xTw~_s zn=)Eut3Z&4fQPq|)e(1Ap`g&P@d7cbR@m1&hn}nE0Vi`VC#uHKRF~)!%2}*Vvbyg3 zJhtD^Q+5po-&TGJxs}t|p_^WWIofc?7QVjq&ZwGPdW_rDwQIBS2rT%Jm(klKvS>RT zU30+z{UQCxw$rY(pm^f`u)TLH;=biOI9Zz8g8H0k&Ea7166P15hbmdlhpLkN8-o*_ zJE|WZ>zf$byR4qK9vgohzyx@&8pt3Vqp^uM9ccGlP)$O=nailqK6cTesmrF`nXXRk zL>ARaB2QxqQz@ToW9o8xtq#(-*_FuEUBIsSm7LK`6Ju=vw2jZ9;O<(h>@Cu(vWc=V-z6 z9&c<9VM1l){w4-DCW83}Vb*u4!5nebMD>g!(ktfvJnu5`a{mxrDq#0EdR9OtxG|d(~Zoi^9IygN(viSE_dKrQr2PlSrlMl_to;4Gr_`l;Lr2>h|ju{ zxH-qoaOSjXew^Ov7RY#8d|ZpT-b6o-6(~FRp1(1mkuYAH+&gY?VU3pYu#dl`VN2z+l^kp~uq&w?6YZoqy8dIC2`nyPcFr8{UC;vEwG zdKeIu3SJ_`+Iz+N~D1kA;?PCw#~v1BJ4z>X!>T+$%*+&bu*u4yEpv?@`?g^fP?> zhl9%~kofX&erd@S)d)^#;6JE#3V}<0i|e`BukQ}wt%t`Gos*1!6$>dXlX9016cF}Nu0%tqE;qLBlq){FP;MMn0|HhJ z%z(D9gHQwQwV(?k_vtb z5}2+&>VDn&_dX{!(71Yno5y=L(4k~M01OP94W0lLRz6e^p%H@0G}jzHnFHmR7)rLJ zNk~DQ)sbv@2JLN{x%nJp4&*c6tChO8-dBE!P3DQ;6(nx1OUx~woo;P-g`Ki&brQj+ zb@YJuuI>F@>EJdO-&YR{g`QMNHzrr)hDeNA@r;#98_D$BoW_1+@-UM0lw?h7K~cspy4Jr3X+I3*oJ! z$30JSTg+R75Ejqj@Yv7Hz@LHVf;0IbhWzD@b}Or|O~Md1`z>y}=Lg}J)FxCN_ZjBB zInsWFo({1{q-5OI_b)1MkiR60^pm8SNFHHf1pYsMQMlic$mx3q`4l3P=-> zUV@;2Q~{9=B2A?CP6Px*=~Y?~snUz|5{eLd1ccCo6hjFKHG$O2^FGh}f7kbY_q*%< z*S)i5WioU2+2^;e@%_87&fu>lZxE(){x+oXu@!>TRJ~6Zs@D`7WEo@!_4Ee{>o6lpO+3)2M@$k&isY&}N6rIBv@wmv-rsn!xv?TYGP5p?{n-^Y=3` z-5r_OqkIB%?jR{NCJ2P}>;56yl|dlKkd9a_Nym-0(Eidy-TTCV?Ztk!4VP`cd}uQ6 zE?~myj9M4rQ5%fCUKHDdFO*~*w(zVOEUJva!=-tA0D@t06T)r09Io9+MBXvO zoRcXpAJYFK!T|A|DGlS)!nMGNRRv|U9-@%*+14X)zvJ@th#E4r-wnzbeW_8pcq_kLw)C`cg#L&e8>?ia)IXO-5 z5LRdDx2{0mBbIuOMO3YKk6dh=0Aq(=YSjUGMU9obTkB1HaEb)NJf|+qC>-1+idQMK`#nV z90NTq-;EBp1x?hQmx%ow-c}F`jA5JoJ>hdgu-T?*kpqyqDxZ%n)k-aQSngSLtp|m! z%u})VBTjxK$maioE}s@SQEcGBqa*b?Asc{y>E$6Kg574-MY6jG5u^M)b^Vm8fMaoK zknJ>h<5uPHDV0rBJ^{jZO0YB{tuurw)(Dbchejj~j38vXd;Wb>yNfnu`0mDV+5)cu zTz_D#)z&lMSN&b8tLD1+YF5vc;eby@36j4{DoR?zXcsw}+xlGgtL$CR?0~)ZTi$95 z<>qaA0Pi>);uJ;KM?kM~dv~k_B!kBep_nbdO9j29u8Ts_9XPoEcT}!ob_|TUzxI6X zqKk|bSF;=QGWq*_R~GA3x+t%d0&ZUNYNO9?WX9mIUX zG~2I%JCn7Od&R)x%Wcczgd4L*8@&e_PB8Lbh|p9LbxSG`#_fs^P^2U(g=s8zAs5sK z%ag5ff;=br5zWZpXI!2e8sH29L+!dYlA>xhZz5zoWPTX#Fob5n=V)XAQ^X~mA@Wulr@Q&iu(XsI6_}o}NB7FW&HF^F|hjR1uyt)fHe({bM=`^^G(z_aLu;oE7 zH~7Q5RQU7*s=Ca5+{{9ObFa+fk36LyP=%>gZ=mIPworuGFW}+UG@vq*e1UtfXa+olo#$8JBTIqctEa(#Ad^YiQFdUf(#D3uz$@0c9oN{y z&Mz5EKOq9wVUB0@WchHOg3{6H`66pd*DuaY1MUc^TXMCH-`GGV5NLRdrNWIxfIrDS zF>9{_gGiNj81pWHPZGgL#;=XS{m;rsMb>RtV@7=$eSz&z1)(z|=(ff&;ZZ1H&T)_D zJNYNJ`2hgpotT9+35QBRJqGkhnezoB=ib1GBu9pY+b7yqB0eJyQM0j2!*I77nxCXG zNVgtSvITirixf>v4xjK5UB9+K9h5goPIilWG~cYhw1;L1RplmE+Y>;C*i$jY={)Uc zQtxXi(&8|9D2TLtiZ=eQF8_~D{M$1=>=ga+oHZ+)=>iYw!R&;%iiYJ{0eE9cdt`rw z8SbrZO8(sBBLQ5i7l4->BH9zRc9AWt?Xu~K@%+kbsirDxnVnZA465)3#9Ob6R?pLW zC*~gp1jaESUtdndtsdEF`ugf#OZ?@%sbW{Tr0C9Th>Sf@b2jHpEtF3mY8))I z)oV-!D4>Yf&wLUQOZGY8-2MlvdM&xJPx28m4@Aunl^jC;^3y>M3dg6iqhY1t+vMfY z=#~bd{*;wyJ(3)-Xmzt>hvk#qgKJQ)#&KIi{n(ML% zNz8_GwR`U`s~zjsn8CbC!+&pCbZ~|w1%2u)syQ4FxH zeqUMt4kDLTbv=04C)fm>j@PWoJ3=14jI|AvBvX8e#PP0z?-fx{Tu}JW05$$96J~^hfTyNf>WEPq#ryS4HTS7;%?7 z^vc@_wT}Mt3gok&V<=gd9Mp5V-(<=2+m6G=6|=UwK(`UNlUm0PO;;lOpRZ8zr^_fFrk zoHsn;y{+VBnz1^{w2j6ExSQTqie;*}7J8t3UiML9TP{!~F+GjU zH2lP-;{^&0FVjLSI2>b%0MQIQfLyGF*fGR)kW!LXQcztXFXF0%3&Cg`QnN34?u%A& zDE&D{mVv3R4r`Xi>~m1_cjC}hM)wSxKc9o|V7S*^q@FQ!*s_Jji;1M3V#X_;WU@@c zPtXEZyjC_Q-(E|fw<{K8)Gl3ZQc`697ruMZQ^sw2e{(xfY%{6X%1B(JI)|W9df6zB z)J&dy|2vA?*in{fMYfCM+X!54x~4)zLIi&apj*>(-@}Km2Z~1jI;~XQ%6#PVn%mmddDA&^7 zF**()>X#;@&5k|$hkJ>V2%@pH{4e+znSxkRdvMjqc^%*)x#gJNThOWEU;KbaL8spC zU;pMUc@sLE(Rsso%n`Rpaw-Feah+}d%?#?$&6{E(X)Gsm%9TuN2A?T&jt#vmk@Ar^ zmk{1)ojy0FXdELw4J;?0Rb_1?!5sf-7keA#IBxhaIe_ALmNOR&=iluAC?nBw7b`4B zvekhwun7NS_c4(dB_c8rq#E+((%m*GkM6%fE#t|DshfJeRK{am56{IH3i{@aJ-PEY z50j(mjRG0gioZl8l4JmC?U&g8GFJiVxCION6ZEE!n56WFYs(h=NkO=ioWHI&r@O_2 zqVM?c%@&pwhQL&+rK=5(3h?mJsfpO9`B>;FnP$Qn+}yUE8tVY zO5i&f4M2-@xe)lz?9w=NyoIHY($ib{N3!3;o+=k>unm3Net|mu!m!XV!UcQ5Q{g01 za1aI~;l^012*8()v*c}HerLoOX~(17=w$$sGx%lLr080d*iYs1@Ce11-u~?>$|JV{ zSQg`a;#o3u6n>M87H4Z6AZ;n)_)bt8C8P{u7}r`)^PCb%-GcXA#PFD^V}pfHsz-%- z*`oU`qC$HqZPpGz`(KDIf{urfh2?+m-RT@tBpV-WVUfYR>-z2k8c&Y8oVy={S0 z0+lfNx|9rk!k_B)kW&WHxB0`ws80rC?c0BPOPmecK-6%tWOPG0K|br-@pe1czi$(H zS!~uaaQx7tSE=>AkgUkjqp*QRP@moAj}lX;y;nrYYh%*RJWIi>*XN|ZZxc0Jt!r-R z+m(aOl}-;PDh_#!ErVMK7H8iz9&gSnUAHb1^7cC*gf#8yyxg22kmwP{B>+M4OXcdR zw4;~_K^*r*L|}4sXdboMcGXnGAWMf6w=?i~JGpc$2&=pV^VFmz?wNXTMG!6ug}0L7ATM zZQf8KkEstW5rGxd(8^R`mXJl^t;$vP0y+h8j7t)!>(Urwh`7LItzif{iT`3OCulBgfP!H(49ME64|4 z#_!GzL$GUtVjuL4CK!Smc8zgqf1#IHnQ)*U5q#+&$sbUYj!1FRaLP_pLTiy~tpBTT zUi#7f;VduGkJsh1v2caVJr>ewP`>IBk?G9&xHywQu0y596UvvZ5`o9c*dG)H>N|*5XD%h?^+qu6*pr5LDLj*yB=3 z(Dv~&;E`+$FI$b8fgzq1DbwZ)WfdK$ zY$DT{JhP8E4F(E+9}Q{Pk<7Cy2>FMWgB4>txWvvM9L9s!tB~;gmJ3#6Q)gnQ@_Xd1 z5vZg+LSeX4-bqz%$S^-)=olTUVG^E^g@Og#tdywSRXB7ER(uReN`ZfLLLzOpfe6>D zXSlLawxFNHMCcR=G_clqs8pNZ_}(~s=7cLqQVGP%LC&x^mbTf$w=Iw*t&E8_qbMYr z^SFZSvSLN9{R6Zj!y5kPz4Dg)E>T1|=68W_==P~lma`P8a>l_qQb2I>1TIEIC-rC3gv?yrGx_B`YONq=e}ejBj?ZM@&SYfhcbh zlsEl0O@gZJt46A7YNzajIse^x9&9aH0!(CkG>TG3VLUvP&^0Qv4m|hRjC>?<3i^b_ zsS;z??WFjLVGJW7)X@44H9tcn^Y5B8vD8ak}4*Td~%`Cb5u4uooUK|vUFNTx9s#oLRyB=Nu#EGiHt^R#EO`jE4!}Y5Uv76Qowb_J+Z;^{lDY6j zd|-bE0^s+Sf7^tfjmaQ6zcG=e;soryVy5$Mcfms;k@>8yU_!jnsX@;3rFDizQ@C=r zh0QsAtDb&~5ti#_0gL3npM{;k9>mrH+MqSHrQ2ei8{G|?>!J5|0P0)baIu!9m`zVA zr}kH*+%A?B>8n5i{H6uZW8bpyoAwNa|CT&Y5{F|!h z(^vURmL6Eo6*hpaYmv1FUJFWY*OY=nwT})@{Rb)?2yu&+#LwPCAM+nkHWfg4loE3f zLQHmAam(UUc>INY1*PSd&BH*>h286(cm)p?Wn6Ch(C2NM7nZ*gi9+0J^=ULp5761e zm7$-(8v9yY`mJgso75&&XPGR4iQ=M-+32P(Oma3)3x3vrTf5vvd`a|zkSI@pBkO|x zQv!(c^)DkSVNfL4LSys7!5LRTd0qhu(oV&-c)T7WvKHlW+{L+M#AOf5uo(rRCty({ zq*IB_Ut9{#FYXrvJb+IG;9^^{)8uJ>(X^LAAWpFA<}@Rce&IT;&lqy$ZPM~iJNlk^ zf&q6OYRnODATd3 zyoR2bjYLy=Jho0k)S(oVGz<$H0eKYL{>a*T)>#EbEbDPlWDBncYtmgklsE_C`v)a? zc*%3r%XJn?kY7QO;&%wI;{8ejct=vZGU&S6w^nvBwzEf>MV#IcL1(2V(gU&3iA3vU zt5JhCy`TBwUWpoQbO|K^%KdF2n;E|u6xAzEj*b#0dS8+Xyc;CC+~-$ZJ;-wjb7hdw zdbehe+-55NHLusm>bgxn?hZ!V6~d-RRr*&4T8R9p&?H zLHTT2$ZtJp!=D5hZ!-1NSXbacucXLDAkX-A+D%rxOB*WIqX{5i%sDe!LmXCvTxn`U z1EV#ru^e((oxt``Ieyxn@V?1p^!E3xIH!@HK_nzKYF z`RE#0`$6-^e9$Ws7*<$vRDT^%*_A?RmDPRGQV#z-;uMAoAGfG0a?vN#;Z4q*ks5X^ z;e&$fbX-3~6hT)4N;^e~Ns?Y;VHr&8ARxbgh2MU_-Iw*LRqnUaCjEaO3N&~(wD*x) zYorp<65qN$7%7;vei|XW#M?l%C!y&_)v~H$w9CEuZ_c)!LTA44WbuEJ+X(=iFXEgE zls^pQ*l)k6n28KkX=YlqYy1K2s$q#OJ9~*+4O$yyq3y6ccVa4wnTbZ+0pqf&w451- zUN!wFvK79FO(|(xg7(-oNp;#m`em2{2HW-lR9$&!NEB$9+wLFzy+Z$z1a}z0n7`mG z+~K^om1jABBdI>ChBYOn4d4u#vx?+_(mI@8BD< z7Hrqo&4-!aR&Ei7zV+CzJ`4ysnTf%1Gsn(yEH}jJ;4hphRl1pM?HmqC_}LU=5~|3u zbG4b9+XZhuK!A<~js_Rt%IFi^DI8v3hyl8F#t?}Cw7-;(`>!DRYQBVhTO4JDowPia zuR`iC7V0Y~lB>u*`GlaXTvXw&uw2T8+-{e+uy9;Fs(vQ4NjEhH%`baX?FAdDrm)IG zsNBK?go_-*#CM&>7-w&ML!%9{Pl(?97;G2H5&^8{N2L1Zy)bKq1{{AJ3l@EHRH9VA zWD+_(9PXuLQ`k)rRMD;5v2=i#pQjv$U^8nsAW1GHO5ZZ{Ya=CzKlsp+sd{M8cfAFh zF#TGT1MDpQPfFKf5@waS@2j(#XCz(V^-7JrH};m(k@#IQlW%l;sqQ=om=R|nZ|`aD z)sn2RIcbPE;)&&*J(JO~6|2posu2=FU!hxqU!@zlt`hF6!7)LQZ?7a&AVM~m{USz4 zJ2I4R;-6TyvJI@@&rR}qULrUo@J2O>o55DllHh_VAD(<-%J3pg^5=k+KY}#{Rk5@j z7%&AoUY1|TQeFu9cy9H=1Evpm-+tW<=wdy8Qx^1}5cjL}|D_N&C(dp6A@fD6|HoAC z2Y~dcouaGee7*f?4lSc^@>>0<+MOo2P)WL>mf&AML>Lx}CGGCIXhp-L8o0A`@Yl9& zjEoDG-DNh9j(o^C9L^_v)US-&cvi%?8yFNMH+MeTsjWUHGLs(!b7NWx!_BfZfb80OQqd@?@(TciT#KV+mr7)VF!v<_*ycOUX%e(btl`RuhuM z4%{$JAU&Yi*7~!=rg^O6k-=;fAvk2{KyliBY+HKUKHL3FVXJmwRxc2(~2k&D2n+>QoeUAzOFzOogZ z2@|e10N+Qsjyu2n1O7;CSiVi3z0DkQ({HS4b&K)wmYkdpn^^15y&o=TF3O|OT)?ZV|{g;1RazbHF?+@fy{Jshcm;ytwK6aVYBnpn{Ze|}hERe^?JL&K<`3!jH zNZUE^2-`u=wbzL6QX%=L zl30PHj3}VX!EHBww-M0%5V=UA;7D{R++tQROangA{yJ&W^y!jLEdoZI$M@!V_GRv5 z*#3%YE5^$p4ku;Up;&}^(8PCzKt=CmrFJ?9`=D+^bcSbO@ zl-?$Pq(?-kibzLWnQtv+df9*VzUYv+-v_3*^v?%}!Zr8_pSiyWaAwD^!5GazJ zD2)Bp<;ObOplA(w$O!C?^+h+>WrQ`_`d5$Rm70JvGGI~y%BFcYJe?fTu8gudS+ZVRX(UaCrwN;3& zPu7vL52@)dTzvZB0%JtXhh)vNa^0m!d7iw>OOX&jP>V%3wfHik|F&ZfO|DA9*7ke>Ko$B+)o*EFtmW>{=!;?25V$K~|{cF9*!6u_cUiuNqO^sAP%1F2uI0 zjl8=oz1t1rGW=JKqJIi({9@B7Ib3IzX8$R85uo`mRt5jmu>N5ga1un_D{{0e}nlq%aXsr$diFJo1_k1fiBAbg%1B` zML|4aiSiTtAB3?K6x7TAvD){*{~7gv_u9GDrqM1L4(D@NAoh!sQFM{KL)=?Y4kd9S zZlfa6Uo|EH&)Yt_KF$O*=VzqnC5nzmH!aGPp%U=k; zy&o{Cup5u%@mr>FPqs%nEKWTjg+G@pLinDIIisuWx{x8x7$#eCfb_S()sS(<%Ug$W z%4o+J8e=5s@qBJ;ubctU#zHDdBJa$Q=@3yr779 zG}a{kc|90ug*%*MBAnnc1`~#U*dQZJiC`#-DzU5c?Vs!PNFUOmpLl&8d$Mk z*(DkBUB}AjwpGH2DPU=GLDS!+L=hDgCr-v0=Zg3npVd6DX+kta1(8+z%Z5pLWBF`T zNUO`?mQJ-JnF7P3rBpk)b8GW0&&)uM#$WpWYAExL<8F3{fln8yCdhOkBdM}(P5iGL zNWd6+u2-7{+wbktf6(Ae;wZE$Wm#dF)nF%@eWv4I$e69$JpQ{q?*E5g01Tw09T&~B zqFEEApm@OcpN{@(|Gdh7*K7QLS~>6NVM47)fmuwdrtr16A9qqT@3P)JKk}uR-o17+ zE+IZXK0!DeXn@Z{fk4}5zsSEnnEPxi8;8K?>qOBVqA&g+!lXeI3ymovgD~}1u|@q< zo>l`FT`1tu;r&OixmF`CF;g~Q;`j-=+Z(W)Hedg~_h3BKhj5_gL6MQW{8(tlOR~A! zRiEX?YGA&~Z-MQH`?hVhLI5oNwJ%FAgo|wwsB2{+T74|@7gwO4tyNvc1qo_bk20p1 zn1p`0EDE61gY@pmo@ClTR~xgDV;!1O)~9)R-?j2lYtl0}ArflWJvjiisKJ)xJy3U= zkiAN&XiyR5Mb9*OgI=gMt07u5EsPOYSkvoJ*un+$N@}YK50A7E6fKgni;9yLp2f8e z^z=r$T>)`j@YDZtiY}M)v^i#}%)3Unor-x@otTh`iO?bqm7)}w*@SR&m#%PBl0`gmLc}CR$ z_Iq~kXt%69-A{KF8Zy{E>m(MV_7BC0DPf(=9@7j){PvdQj#UVLT8j zQ64jYPhk>$H6pi?tJO;Vw=FDH5Xw+t`1GEpiQPk8C+b1vj#EJ~U*|Vzj-O9v=qFoE zW0XfmILoh%J{=u6To+`?{H4ewye*CKc{K352RJL08@&2@A5i>Ni)VioW67a-Q=e1! zo<5&|%!c%;d>N|}eSXCbarzUj+2bN?UzFzM=1RI`oi9Gpxf9g7QKmaXXR3Cl`S&58 zwYskRUU29T9l=~9ltbwyMcLmv2&6*+zZ3!aBI4V3J@fS`l_-e7z#F%&#WRo>i1a*G zidw#Xg)J|ga&umVJ`+~lXw3*)RX@67@Yd?5$32VZwv$B457I<-(`#nnamC+k6#(XP zGmkeE@6&oQ#OPg|1R4o~Ud zKGx4Z_yxnQysHFpDuXvo=VDUYX|`46a7}CUF$}ZCRI08*hb`DtI@JIUjv z^4|26j8xgcUE`i;tr0?-&$XnYYjGgU_l|m-K6fP;2 z6Hi%frwPi!O>194xo-#2F0l_)3oJYZPS);%xhUFWAzxA!F=L*@M~v>HH%Gl*rJD|> zozdg`p-q@A_Ic636HWJce1eB}fmZiBs8rQK?v1Dv~>*B2rbY-JSNbVxcUg2vgFGW@U7_@RKAtIKtk(UVFCP z(C!O1NK*nvQVP?{3_@s{;2lKd4#Ma159Q?buac+D=#?dDi_%G_jPfi-L!E@Vgo^UB ztJMIu76HbD`vJ?MGHQI`sv&fdR<+ZYU~5^%zf7na7-h1j#DQ;J!Xq8h?KC>T-mIgL zGoGL8PtHFqbWQ2}qxIjHP`h*kD$6Fzkb2!~)cA*+?~Wxfl8m!satuc|)HqR%c7%!q8iA2jzk%y$!@ir--{L%Ip{nLP9S9Wh*g z`0jwAHMC12OK6L@YAMlz;oVyiOmb+Zg*FUo|A#?j^)@@>L1~wmPAAFH-vOaKh=SZKRa0 zH|&{lLR1a;L|pE8X*?JC>2Qs72jN)VOV{`N-t0FKXqqIq%+Ak^u_4)Cx^me!BcLB| zeiY`Y+S;&r;I5z<*^3)|%Bnh8A9J3f#1$NVI)SQ3TprE0h)NXmu`O_Fea6D}lulw( zIGB1$e1Xk3fXzqO7dmjk26HT5f^YwhgwWFav1q3X8=w!RrCH6IgX2}1ybhrT2bPwb(s952qvbE%9}8fs>X zQXkHvKh{b29dy?BODDcf-lQzE`=g=nsV{Pw8CNaMrO7r$#4U{gweyFy{wx~zOdwh1 z+qEE3-T5Dh!~Tj+!HMhfTNe&^56E=l>JPl!vPBfqEPPeu<)2Rf!WR4sPBX_doJFjU9aM!aMDuvgLV zB<$&>Cqu!meFt}MXii_fB81kXGtO~*#Jh$=F3laIi{A` zf4*t_ih;KkMfLlC{i9vUD27+vzN0%uYIvj213Ngtu^}$}tS|Hc?+Q8@Qn~T=->s4Y z3-hKwjS3_P04n6KH#_wh?>0rVsdqjCW$*Ox(r>M@(j7Iy+xnkAijSbVo!RIGV0PX3 zOq+c2xaQ=_hXPi!^JVKk@@|IQ6#^Qx`w0jro88^`n^<*zF6~lupW{`UEkfi5KOhU7V+tF z?GLQk)Oxt{hmG{8=QR``yqLLn{qD;MyuZkKW~`t}Rha6^8?3$?2uq}CjQILVHy1m4 z$RHg0+>!C+$?O-5OJoXvu3r1`>#=mP!n;rPGTJIGX;MFiIj`Ui7?dLYM0mtr{4sd^ zL@uqUe9CDCX|lJ!de6)pU1RyKV8QlRN%6W=vVQej?{cQm$%AjFes|>7XI1BdJ)_2| zX8m1Ds$G>BqL`DoS%zE9kXw+T0+yw2DPL-0bm`Pp2AJE^sEA;Y5TSw#t;{GOubv)0gtREd(^sv;{m#D(3dfFLh-qlIr%uT zP9-V{oqRU5MBd^m>|lMAuN_*G#P{k7TNs;dfy-4xy*2U|{;cq4#<%-i4oxWEMd-xm zn!`?>e7>NkozYuz5j$3ByiUVdln4ERB`zy`&v6>NhSmwU6|mZ@UAe9L)_+T2((w>- z!czopJGN{&Qr)~5mipLF6Khyl{N*am1Qo@M(=PTi>Xt4KilJOlCYDkEQ;Yo2-iQU( zP1 z6ut~KcM7SG+j-E#tsS4am?dTKTm-kApW3ag+6(76_WfVOdeUI`r*)Ma+dT-4CqR~bs zyc-T|-+Rn?EI%S~dEu%O{N0VH(`^0^r6Z_u>7wn}d%gV{W8$;3 zEpB0`LhH9R?t4>R(?-OHjB3G@pCEfWrZJMlydmQ#%zIr0>x*k7YnE_RySlE#ca*l2 zx3>JLH8d~!-T95UEdKGxMGvM;d=Uu{{xFa5j#5G`CB~SBNvo+cn@BHqP$a9v*~%?Z zl9_HHk8WGZk$-no!<&p;z&HGfOcQ6X|Yoeu|LYy+^{$q zX0=l&^3@i0F}qj+i9H+eZl& z%%E1ifcfKQ+aF7(&0o#mCH4fySsMEK=TJ^rn``YY+gb`xj&Ki|XFq?MnY2qr@rr-U zSt+_$_$F}`n~w~ld5ATlNY=SM6m(_WfciPp7>Id~&roH${{Ev{+X6XeDt?J!O3;r_ ztIf|?s-8k*O@~jPdC&Z~^r-xL=7S&*@ih+=_-V9r`j!}9+~vT!<;f+5K?%cieO7#; zJXyOr`&(ZIy7%=BI&J2&apI9RU75>;1SDth~T{ zvO*T8fuwR5>CtaN+`SKHzg|nD*i>aHiI!h(@HA3*Hl5@QBP$&gciQ)iw%eGKBj=C{ zLep=3_J4TBzi*|3-&4GQ(>FvC5MM-B6{<%g=qYpcb@neRAZmRZ@XNN?dE?3TCKFdW zU@9wRVb}f#)2srj9`gld1;5jL!D1H=YC%4e-$Ua@Iqo%fhFyWj=^++9KBoTS#Z_`r zaaV1sZdErpY_e zi2O>6-%@Uv!qY2^?O+26r8|CMn3O?J=;sH439m6TaqXz}taUzTU7^M^l@9aU$@HWa zXifOr)hV;|*cew#lA2YtV(fIE8eX!z|#{w=fVzO zKO~!Ej{@$}M2dc~_+v5ePv8sP*%vQy3|@sAK9K4;f255fotN&v<-1_UEg|22*PKqk zw%Y!W3S5~#_!8&_&3l**b5(6))gl$!Zfx_nE@|`R$sXCzR~&=V%Xg?Y<4q~W;WqD> zf-mwjUq-2me8YB3CgA~fI8$q?Lx#ul0CBpnv`m z;{-j)mT^sO!~J2`kJ_1ca=o~i4%4~gtWB0KG`@-G6c6w{<6i&5@J5A}s;p{Ka^K+^ zk2FayG&7a0x%bK2F0J4qLVOE>R5 zTZwtR43AQah%~sc3BIq~YLV2*cS)5( za~#qI5AiQ_SiJ~y(eH=77-XCvzlf=Z>v79c;+%Bx*Ti1jc>Ys_!Sq$-{ z`+hTnz!N7n_h3}#PQnd)n;=FWG_b%$_z{XhV=R+6`TB{na4%HU!{yo?;uD3KP?<~% zQ5MdoC$nmMY>)E_u5R$fIYa(zyOIgDanORoXR}p5Sr6&fj#hY{fW5k`gjU!cp3-L= zX4+JWhhfj>QK{9N$Y)+G@(TAd!lNu(chr_w&YS%z+g*z5sG0T~ z)aD|cZ;o8v9P(V^0jQ;+O}S)VUQTP-x_6u|;4u6?BpaAn_y zDm2C0XZ&){g2fzrOlVhbCD@-aYThbcc`xt;R~ub>E|WXq*%+@bdYxb+Kyen)dFAH* zt-Mrr)V`FU^fgT}%*mM9xOi+UZ@q!xpLiD@VfWElys2haHO)xe{*{!dkx{@6Wioq? zy<^%1O2mEXMj(OEW&IS$qLu0P>DrBoZQqrlkP@}5rrfSEwJIvRS6!(2ha=Jc+)`Zq zeSwM_QAd_?W>hW9WV_#Z*w2kH@r8%dcVORd&n6ue?8@!fyUO!tGUCNG@AN8a>NQi{ zw_^Aq1;r#uH_Jh8vp(AsSGbcr%zcV73w#WPX^Uh9odDfJ-vD`X80|SPf4yV14~3Bz zciZTU+eB?$DxF@x4v=_Ml~79j9M$tyq>b0$O2t?og}!~J$n1sLUU|KbH|Xs(%CbgF zbmvJW2b-tZ!e{g^Pc@VpO-_NgDZQn)a|0$dC6DUaJ6Q2ko_7woV2hvF7%AHdBa8T) zq#p#9$nosgyhpo)XeQSvnk1KF==PRWSqjAC zb17~#>GZ@vi1GnN0v9W_@p?C%cE1AGr#HZO@d>T zrTmgZ%}OVhcPYH>xm?cXl=vPzA*t~ah9~B}Oroqop{=LG3FH7BvxWH}#VhCGQ>wcV zltq7{eL-Y$(eGoiAFJG-C0bScKpD;0m)YI3bN5San96JOZ>t>^xl*z_>0IF@KYSEd z4{QlC!cvulg_6AH8&_O@?jtGZabvG*eB>z|+xf+Q5+Zx9aIJSXs@x`7-D`_l3g&|; z{m?4*fxME;0-EqT1S=*yf2MKBq?Q(0gMV1Avh`>Wf(J8D&#Z9crCO<^oSHHM$##i* zFTfhdOL*g($9%Phzc|#?1_8eIfe_B)m{Xls@q-bvWhcAa_D()8)&NYp(qY1kR5tlJ zX}mm{mXR*=RToxHL9V_N?_FzszI>8*yCVTxmuh)U>0oI^XL-mtn!B_S5@-w8@o4*G zFb#Bl9-u9gfZRT3ger-nu(lPR;jtmPz83h^BOVJl0PjZ8>>XW!o~L1dzZ`EZ^K}s; zzt0>!x)RmjZ+)I&w+fo$rP?O@pf_Rb%{z_2c%C{l(z$eQQdCj8;d>!QJWf4w?prB_ zrkPx7VHRhVpV$iC(CSb4s^w;h^O;C)(LTt*%PVx7 zsYsoaII`lS;VAT>1Q!!9x#~uMr$pi)nGz0M{mNPTXf8U(#}U=w1@{wf0GC;8qeI$dGO+ zrkS=hHvEL~w;%O{7n6CW(g$;<@z zmvYpyUcd4RIm_r?=x*f1&kVE=^k$tIjheZxH=ermxQposRI3BO9I9t%i+7+m{DGyUebD z%C+Qlkl^jQS&Paz^}auJ9_8J#>@mE}3M8&qWMsMRcELTcZf2bHO3S*6J$+*SJ%q6y}w}D}&STT`b{&@d;7OXpFUOw;+<4$$S zWE8VP%nw7vjlIP5Ha5nH8oQ0$=*jGp`hz7FB7w;E)YVO+ugq2{iGl46-63mVxvGZE zAHV2En3=mdva(v;%!l{bc)RJ&|7h>LgPPj*Jsx^T5Gg8P2#P2rRDnPUC4%Sy74QJk z2@q-s1W4#rs)8U$Q9w~_C@3B2MNlaLMXG?H5UO-T&kN{1=iGB=&YQfMJM;cXX4u&* zzTe+k`?J1GlF43s^ZM%_6>EdE4eO#RXz)Js(ra+j*dr0|6ircw1T!1%|De62IucaY zlYheWBCIA@PHbbiU+{Ycla7~*OD?xSuFy5*m^*BKn(te_@t=NW!o|XUznCXB^yvpK zy_+An(~0!ARKS&weZuWdt%Y4Jb`yZivSY@oIV*w6Ma+uz_2<_z)q_dSC1H2NZg#Dt z>#5yz&6?+IEaQk7c=**S*QgJdX&yhtRMd;%41J*s=dT#!tN$t<1(1kM1D$MM|XUsz9CEL}Fnt{V7KC~Z=Pj3DI8zCv!l+r(cj?L;5whkCjx-Teru#yY3IxLfK zHqW?JpmEDFC_S(29f|Pf(pi^6_qT(-kcG={g@t13=odbWcp20dnq%8nv;4oD{_!eK zQII(v0n2qcmP48lNO_*(n59%&ng+XI-F@UzR`*FsAm*yLhcQQB(oEAW3#k(`Qz^+? zPLauTei04pZ&u!0uplmg`B~Z?o9Xsc4c^?1x^b}EUkm|aKiw)WIocianN;pKe>TTc zJkyUU-F&UONYK+}!uFn$X>;}PmtZbZ!|uac!-Bjn@Z`Gyr(~yVOYNXX$n~Zp+)ylY zI{6dLy{%7aF>#Tw&5zTh_Oc|Og9buQ0iTil2Ua#=-k#60W8CK@Cvtsq&534>D}x^1 zB*yy^tD%QP@|_$93DR0`tQXEIFhVELrPI)(Yn=4-FXi|4(_&{au#9)RczYwvyDN`5_< z99Dgh`(j$qcVuxh6cq+a>tv>xw<{H@JVjrl7SUJR@p&oQ!Fo})j8|y;E_!N;NC+b4 z%gU|}>xd?enwds~p?M#A9y(%~_8F5vet#!v-gx4)nBaZJR~ivQ@M_1ErVo{x(E}Nd zm=yM!HpwRuBkFa#@@9C!o>YEjRRToR>FjUM`?Abw3@_Tpzvs5nozB#}(e~7FG}ugJ zr>*PT*@+o}C1wv=QksK2 zdE;sV%-vBsaYdc8rx8q*HIO5?A#7ye!;Wn1i?kCv4o-&1mlOS)G?Skv?dwzsCEM+( z&)S-Nv*qi3IpD~Q8%_jubr@+`emd4E#|-Xz6RG`GobG)kS7XGpp41zweMawS%A=n5 z+zp)K;Fi1Gu&tu-RD7uhc2W0G>ScL_YaEWV2t;w&B@Z;6aj2PX#BCGt2kOUKNg6M_ zznUt<*ew30`)D8=oyr{lF7m7G!q?04x{`Wm!pTemOS+>6Fdb#IRcbLiVKb6@~`eTOcc#Z^VM_D8FZ*Ao#Y4gA+nqbz9C zdtn)*#J)P;2*^d|wO8^Qj>f2g-GR@QLFUjBA7cxy}nb7ek4sE})dcZTaPQbE-!ap7^)n|$s<6Ad%v{qI- z5hx7cQMR7Th(#Z~v?3dI?d$hQlihkZ_tA*-TXBvsh3uW`DoD+8d)R?n)(?78e1Thu zLRGoph4y$<{^(upk&$Fwd(ujJT{RwjyG1`5u5pPk2mZ@}Q5~%@00WS#EBcD3i47f$Y&twqC= zcQsUVy5s7ZD#`vt!WM3aP5kPK=vSrv1Z-$`{aD;NJ4PpCJGqTrwd2H=(}?=&NoJHQ zu{gz=*mpB^F`s;;UeN%!gcg@thRAs9wh_1*Nup~?v{_e4c_D4ZWSNuLl#|h-J>M>& zo-rrC5FwGuu%p;AYx$7TGb=i>8U4uRB&%1UN@=wY{O$8o!4USZQ#`M8(o}TaKhNF5 z$tCA)NWn0Sx4mq2L4Lkhio?*hs)h#+(B>1!-}^O3+~o(hYvx#p@o!e%VkN(>rS76>J6B@6-*Z;Y z?Ko_AKJ5HGs`ITKzy8fb5f3}k8Hg^L?Fc2t+N;M{zgeoYDbyhCey}$4?kufgSmaC$ zF}xR$bn|CMm?sGwCo#&N$Bz0h85^6Y7~V0*HUm0N>BXn1tSjR35n zB>XQWHxH)pjI%Uc;6jcUHH;Xay)MbrNYk*lfw=?C5!8xnxV^2CODXbguwwVk!LV-pQ?AkWmqK7D3$_?MpqtTMG&4$Q}$6=sV+@DI$jYo8jim*?H3)brRvBAGP~&v?S(&PgT5aZ3~x|K znvWB^pO8G#7g(#kbL)eARWmUYY1tpVy?e(5>B8t_q-T1C^Hvf_R#Q<&IK)eVvF~8O z_SolH&2MSbZZ0|43ggAjvD?GmXVioizy=NXfHy3*9B72cIxq9wM3fSuuH5Yn)JBc*IW81mgGg(*d!8t0n2Jt$MSgel(U6hf2gW3Q zI}uViWvew?-TS(|{lHmKUBL+CNk7wk_yox(+Q{Vfw~W>}_^IpZaK;fM65yDhYw1WY9!|Ebwm#=zYBjKVi zo2OwJ@Bt6@9F30r)^OM;)MF=6b=xM`HQ5kPht(d%&ljcmG(P%z*!8~4*>s-3tyoX| z(}bQw^x+qNm&CJu!Jj7oqweBd$36#LzKLtNQaR1Tco(ccv^_%C+&C5n&0>4_=_Pun z_WdN35ORPO3nl$3$!}`ZnHokJ=<&1=j(_=C}&v9 zenw7XMs94hXy-(e>b?Ql)MtLziVdEWEUPRye6KCtnk43!@$HifdI@YY&~xKG))ugF z5m=r1@*Mj?`FBHGyR|fWHtBDdefl?etJW%HXF49f+bU;%izkvoCM2vk-ka1erxphO z|KH^eB{2&#_X>Q>ssV z*&RZW=CR5(q{_WNJ1)Q$e$?$BkT3FQ3DV*QDP(iDux?j%$Gzsyx%kHnyj%bm2dBfs z<4WcM0J&q%#-`q;`oBRC9`4e%_8xW)(m3~@_x@9Z;n21SR|jvPodePt1qCfs)q#M{ z_E34&JsvoVyze1HnN-`*k7Y z{k>)|2)Hltc7=j8_c{cc>R$qCdw4kj6{TgQ5He?EfM;Z-W#tu=l$0caax$_qU>P~E zteljr5=34OA|nI*^#G}}lK0fS>>VM7aGhV>k$;1NoV>l!5HJ{v#Y$u4r9HfmU|AIv zmAx`@a#Cc46vhwbZHtpaVMKox`Bxpd0|w#cjP`c+Kmqsa+S+;ectb&;y^j8P{5mdo z^dB9eFu&N5DS~mfXt1ob4ET@AWTP6H2}Ik=!PeWu%ho|KkU_HECF+go2 zMW8I%B`qth1T=9**?V9yYT&=S{v5`i1s&kF-VW+yOk_YZQgVvMGD;8`Wr(c8)xY?E zivDKT_po<%^!tllZqF{O2vLxO$SM7@|3&o6t_I#C^A}S4)3A4te{28W2-+k50EqVS za@(ILdj#0Q&B5IP<&7ajl>K*z_6UfhhnKspx4N^tEz$vuMj_R}e>VQ(_
    oD*_H z!GC1*Uqk<6ZvQJge{%n?l>b?j+6hH)sko@PC?Y_Sn3^ssE{X_HB&Mc|ii;uw6p5+n zqT-^607YVIx~RA)B0!Otnl36XiU?37rlyOEiy{IPiK*$L;-ZKEMPh2YsJJL1K#`c5 zE-EgH2v8)Zri+S;A_5eNsp+EPqKE)RVrsgmxF{k(k(in;DlUo$P$Z_Ni;9aP0u+g< z>7wGIhyX=mYPzVnC?Y_Sn3^ssE{X_HB&Mc|ii;uw6p8;aU95ku`fxyzmwI5yYdW~= z@iXMRLrLnvHI2z@g|g~gjV=qm!Cw%5?Oj|3)QaNl5N0*de0|75F#OuC>n@$p@d)!O zy^|~~LL8hQq_q&};_%7n2=%Lqb))*7`kfnYC;aYuj1pJA2fh0`a$H{_8fYl-DSgR% zrq9PEm=(ZlEIuYx0sssR4W(?O%Gm(@!^3&sMn8WBe90!IBnyhXu}iX~Wne=mUOC^j zKs33n$ilXG!1?vI(TCZ!+u5=bd^YrLf-H8G%kq--0=Gpp-8z^g>)~4GxezNfY%-}_ z2b%{2Z8+$iO0QNX6dEswv~*$+0v|a>#dG}vO%g6*OW5QSqe0T}ss`q>YG z^|b9B)6>(ZFmScf#vo{#UjfEV0iN5?`n!V1j$I54%BrQO zm8`dTZjM1V(6+x7J3}rd&%Gr&tOf^b#1J<8`gNe(Da`S%_@|b$ z5zzVA!90|C8Ojht2%tx+OAUzv)@i#Q1AegB5G2UGf!-onrzXb6$uo~(xg_yP>r)Ze z+AKsdWSB%cWV%h9EzXkSv$W2^1_k>Dj%=<7hj@FJbS)7G1kD7zQ5}|zzx58BVX|Wg zJ4Mv-ICJH)^(n_sPWmburtxIvjNb= zC6uyY*GxtvSt=`)OIqQ3AQonKOc0amc-TeT7(2=*wCN8^2I_o%m_y z+4(y$49v|Be2)eIegLjlb#4LF0RkmMp$z?M*?@KR3Ft){i^6-i&0Ya$HsYpXO?*Qy z?vV{LdR_;7N)rwQnx$zRB(1(ZLN*1J~%rkt(v?8Sj-{FClaBd%6uAv z{}DpTe`^-4Q@d*kJG#LEDkvzZ*lN0|7q%9hEi{gE2t4rj`2M@|k5p68jPt8lUtYAX XU)xw>PIpP&TZ*Q4)&O3hWfT5C(Lb|v literal 0 HcmV?d00001 diff --git a/src/minecraft/assemblyline/client/ClientProxy.java b/src/minecraft/assemblyline/client/ClientProxy.java index 163cbcda..301e1597 100644 --- a/src/minecraft/assemblyline/client/ClientProxy.java +++ b/src/minecraft/assemblyline/client/ClientProxy.java @@ -22,6 +22,7 @@ import cpw.mods.fml.client.registry.RenderingRegistry; public class ClientProxy extends CommonProxy { + @Override public void preInit() { diff --git a/src/minecraft/assemblyline/client/gui/GuiItemSensor.java b/src/minecraft/assemblyline/client/gui/GuiItemSensor.java new file mode 100644 index 00000000..06cfdaff --- /dev/null +++ b/src/minecraft/assemblyline/client/gui/GuiItemSensor.java @@ -0,0 +1,85 @@ +package assemblyline.client.gui; + +import net.minecraft.client.gui.GuiButton; +import net.minecraft.client.gui.GuiSmallButton; +import net.minecraft.client.gui.inventory.GuiContainer; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.util.StatCollector; + +import org.lwjgl.opengl.GL11; + +import assemblyline.common.machine.sensor.ContainerItemSensor; +import assemblyline.common.machine.sensor.TileItemSensor; + +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; + +@SideOnly(Side.CLIENT) +public class GuiItemSensor extends GuiContainer +{ + private EntityPlayer player; + private GuiSmallButton invert; + private TileItemSensor tileEntity; + + public GuiItemSensor(EntityPlayer player, TileItemSensor tileEntity) + { + super(new ContainerItemSensor(player.inventory, tileEntity)); + this.tileEntity = tileEntity; + this.player = player; + this.allowUserInput = false; + short baseHeight = 222; + int var4 = baseHeight - 108; + this.ySize = var4 + 3 * 18; + } + + @Override + public void initGui() + { + super.initGui(); + + invert = new GuiSmallButton(0, this.guiLeft + 82, this.guiTop + 5, 12, 12, "i"); + controlList.add(invert); + } + + @Override + protected void actionPerformed(GuiButton button) + { + switch (button.id) + { + case 0: //invert + { + PacketHandler.sendTileEntityAction(player, tileEntity.xCoord, tileEntity.yCoord, tileEntity.zCoord, PacketHandler.PACKET_ACTION_ITEM_SENSOR); + } + } + } + + @Override + public void updateScreen() + { + invert.displayString = tileEntity.isItemCheckInverted() ? "e" : "i"; + super.updateScreen(); + } + + /** + * Draw the foreground layer for the GuiContainer (everything in front of the items) + */ + protected void drawGuiContainerForegroundLayer(int par1, int par2) + { + fontRenderer.drawString("Item Sensor", 8, 6, 4210752); + fontRenderer.drawString(StatCollector.translateToLocal("container.inventory"), 8, ySize - 96 + 2, 4210752); + } + + /** + * Draw the background layer for the GuiContainer (everything behind the items) + */ + protected void drawGuiContainerBackgroundLayer(float par1, int par2, int par3) + { + int var4 = this.mc.renderEngine.getTexture("/gui/container.png"); + GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F); + this.mc.renderEngine.bindTexture(var4); + int var5 = (this.width - this.xSize) / 2; + int var6 = (this.height - this.ySize) / 2; + this.drawTexturedModalRect(var5, var6, 0, 0, this.xSize, 3 * 18 + 17); + this.drawTexturedModalRect(var5, var6 + 3 * 18 + 17, 0, 126, this.xSize, 96); + } +} diff --git a/src/minecraft/assemblyline/client/model/ModelHelper.java b/src/minecraft/assemblyline/client/model/ModelHelper.java new file mode 100644 index 00000000..52a88a45 --- /dev/null +++ b/src/minecraft/assemblyline/client/model/ModelHelper.java @@ -0,0 +1,216 @@ +package assemblyline.client.model; + +import static org.lwjgl.opengl.GL11.GL_QUADS; +import static org.lwjgl.opengl.GL11.glBegin; +import static org.lwjgl.opengl.GL11.glEnd; +import static org.lwjgl.opengl.GL11.glTexCoord2f; +import static org.lwjgl.opengl.GL11.glVertex3d; +import assemblyline.common.BlockSide; +import net.minecraft.util.Vec3; + +public class ModelHelper +{ + private static int gTexWidth = 64; + private static int gTexHeight = 32; + private static int sTexWidth = 64; + private static int sTexHeight = 32; + private static int texOffsetX = 0; + private static int texOffsetY = 0; + private static float texScale = 16f; // 16 pixels per world unit + private static boolean clip = false; // clip textures instead of scaling them + + /** + * + * @param v1 + * Top Left + * @param v2 + * Top Right + * @param v3 + * Bottom Right + * @param v4 + * Bottom Left + */ + private static void drawQuadRaw(Vec3 v1, Vec3 v2, Vec3 v3, Vec3 v4, int side) + { + glBegin(GL_QUADS); + + float quadWidth = 1; + float quadHeight = 1; + + float subWidth = ((float) sTexWidth / (float) gTexWidth); + float subHeight = ((float) sTexHeight / (float) gTexHeight); + float xMin = ((float) texOffsetX / sTexWidth) * subWidth; + float yMin = ((float) texOffsetY / sTexHeight) * subHeight; + float subSqX = 0; + float subSqY = 0; + float subSqWidth = 0.25f * ((float) sTexWidth / (float) gTexWidth); // constant for now + float subSqHeight = 0.5f * ((float) sTexHeight / (float) gTexHeight); + + // System.out.println("SubWidth: " + subWidth); + + switch (side) + { + case BlockSide.YPLUS: // top + { + subSqX = 2f * subSqWidth; + subSqY = 0; + quadWidth = (float) Math.abs(v2.xCoord - v1.xCoord); + quadHeight = (float) Math.abs(v4.zCoord - v1.zCoord); + break; + } + case BlockSide.YMINUS: // bottom + { + subSqX = 1f * subSqWidth; + subSqY = 0; + quadWidth = (float) Math.abs(v2.xCoord - v1.xCoord); + quadHeight = (float) Math.abs(v4.zCoord - v1.zCoord); + break; + } + case BlockSide.XPLUS: // right + { + subSqX = 0; + subSqY = subSqHeight; + quadWidth = (float) Math.abs(v2.zCoord - v1.zCoord); + quadHeight = (float) Math.abs(v4.yCoord - v1.yCoord); + break; + } + case BlockSide.XMINUS: // left + { + subSqX = 2f * subSqWidth; + subSqY = subSqHeight; + quadWidth = (float) Math.abs(v2.zCoord - v1.zCoord); + quadHeight = (float) Math.abs(v4.yCoord - v1.yCoord); + break; + } + case BlockSide.ZPLUS: // back + { + subSqX = subSqWidth; + subSqY = subSqHeight; + quadWidth = (float) Math.abs(v2.xCoord - v1.xCoord); + quadHeight = (float) Math.abs(v4.yCoord - v1.yCoord); + break; + } + case BlockSide.ZMINUS: // front + { + subSqX = 3f * subSqWidth; + subSqY = subSqHeight; + quadWidth = (float) Math.abs(v2.xCoord - v1.xCoord); + quadHeight = (float) Math.abs(v4.yCoord - v1.yCoord); + break; + } + } + + float xMax, yMax; + + xMin += subSqX; + yMin += subSqY; + + if (clip) + { + xMin += (1f - quadWidth) * subSqWidth; + yMin += (1f - quadHeight) * subSqHeight; + xMax = xMin + (subSqWidth * quadWidth); + yMax = yMin + (subSqHeight * quadHeight); + } + else + { + xMax = xMin + (subSqWidth); + yMax = yMin + (subSqHeight); + } + + + + // System.out.println("xMin: " + xMin + "; xMax: " + xMax); + + glTexCoord2f(xMin, yMin); + glVertex3d(v1.xCoord, v1.yCoord, v1.zCoord); + glTexCoord2f(xMax, yMin); + glVertex3d(v2.xCoord, v2.yCoord, v2.zCoord); + glTexCoord2f(xMax, yMax); + glVertex3d(v3.xCoord, v3.yCoord, v3.zCoord); + glTexCoord2f(xMin, yMax); + glVertex3d(v4.xCoord, v4.yCoord, v4.zCoord); + + glEnd(); + } + + /** + * + * @param v1 + * Top Left Back + * @param v2 + * Top Right Back + * @param v3 + * Top Right Front + * @param v4 + * Top Left Front + * @param v5 + * Bottom Left Front + * @param v6 + * Bottom Right Front + * @param v7 + * Bottom Right Back + * @param v8 + * Bottom Left Back + */ + private static void drawCuboidRaw(Vec3 v1, Vec3 v2, Vec3 v3, Vec3 v4, Vec3 v5, Vec3 v6, Vec3 v7, Vec3 v8) + { + drawQuadRaw(v1, v2, v3, v4, BlockSide.YPLUS); // top + drawQuadRaw(v7, v6, v3, v2, BlockSide.XPLUS); // right + drawQuadRaw(v5, v6, v7, v8, BlockSide.YMINUS); // bottom + drawQuadRaw(v5, v8, v1, v4, BlockSide.XMINUS); // left + drawQuadRaw(v6, v5, v4, v3, BlockSide.ZMINUS); // front + drawQuadRaw(v8, v7, v2, v1, BlockSide.ZPLUS); // back + } + + public static void drawCuboid(float xOffset, float yOffset, float zOffset, float xSize, float ySize, float zSize) + { + Vec3 v1, v2, v3, v4, v5, v6, v7, v8; + float x, y, z; + float x2, y2, z2; + x = xOffset; + y = yOffset; + z = zOffset; + x2 = x + xSize; + y2 = y + ySize; + z2 = z + zSize; + v1 = Vec3.createVectorHelper(x, y2, z2); + v2 = Vec3.createVectorHelper(x2, y2, z2); + v3 = Vec3.createVectorHelper(x2, y2, z); + v4 = Vec3.createVectorHelper(x, y2, z); + v5 = Vec3.createVectorHelper(x, y, z); + v6 = Vec3.createVectorHelper(x2, y, z); + v7 = Vec3.createVectorHelper(x2, y, z2); + v8 = Vec3.createVectorHelper(x, y, z2); + drawCuboidRaw(v1, v2, v3, v4, v5, v6, v7, v8); + } + + public static void setTextureOffset(int xOffset, int yOffset) + { + texOffsetX = xOffset; + texOffsetY = yOffset; + } + + public static void setGlobalTextureResolution(int width, int height) + { + gTexWidth = width; + gTexHeight = height; + } + + public static void setTextureSubResolution(int width, int height) + { + sTexWidth = width; + sTexHeight = height; + } + + /** + * Sets whether or not to clip the texture. + * + * @param clip + * If true, textures on blocks less than 1x1x1 will be clipped. If false, they will be scaled. + */ + public static void setTextureClip(boolean clip) + { + ModelHelper.clip = clip; + } +} diff --git a/src/minecraft/assemblyline/client/model/ModelItemSensor.java b/src/minecraft/assemblyline/client/model/ModelItemSensor.java new file mode 100644 index 00000000..6ffaf721 --- /dev/null +++ b/src/minecraft/assemblyline/client/model/ModelItemSensor.java @@ -0,0 +1,62 @@ +package assemblyline.client.model; + +import static assemblyline.client.model.ModelHelper.*; +import static org.lwjgl.opengl.GL11.glPopMatrix; +import static org.lwjgl.opengl.GL11.glPushMatrix; +import static org.lwjgl.opengl.GL11.glScalef; +import static org.lwjgl.opengl.GL11.glTranslated; +import net.minecraft.client.model.ModelBase; +import net.minecraftforge.client.ForgeHooksClient; + +import assemblyline.common.AssemblyLine; +import assemblyline.common.CommonProxy; +import assemblyline.common.machine.sensor.TileItemSensor; + +public class ModelItemSensor extends ModelBase +{ + + public void render(TileItemSensor entity, double x, double y, double z) + { + glPushMatrix(); + glTranslated(x, y, z); + + ForgeHooksClient.bindTexture(AssemblyLine.TEXTURE_PATH + "sensor.png", 0); + + setGlobalTextureResolution(128, 128); + setTextureClip(false); + ModelHelper.setTextureOffset(0, 64); + setTextureSubResolution(64, 64); + drawCuboid(0.45f, 12f/16f, 0.45f, 2f/16f, 4f/16f, 2f/16f); //stand + ModelHelper.setTextureOffset(0, 0); + setTextureSubResolution(128, 64); + drawCuboid(0.25f, 0.25f, 0.25f, 8f/16f, 8f/16f, 8f/16f); //block + ModelHelper.setTextureOffset(64, 64); + setTextureSubResolution(64, 32); + drawCuboid(0.375f, 0.25f - (1f/16f), 0.375f, 4f/16f, 1f/16f, 4f/16f); //lens + + glPopMatrix(); + } + + public void render() + { + glPushMatrix(); + glScalef(1.5f, 1.5f, 1.5f); + + ForgeHooksClient.bindTexture(AssemblyLine.TEXTURE_PATH + "sensor.png", 0); + + setGlobalTextureResolution(128, 128); + setTextureClip(false); + ModelHelper.setTextureOffset(0, 64); + setTextureSubResolution(64, 64); + drawCuboid(0.45f, 12f/16f, 0.45f, 2f/16f, 4f/16f, 2f/16f); //stand + ModelHelper.setTextureOffset(0, 0); + setTextureSubResolution(128, 64); + drawCuboid(0.25f, 0.25f, 0.25f, 8f/16f, 8f/16f, 8f/16f); //block + ModelHelper.setTextureOffset(64, 64); + setTextureSubResolution(64, 32); + drawCuboid(0.375f, 0.25f - (1f/16f), 0.375f, 4f/16f, 1f/16f, 4f/16f); //lens + + glPopMatrix(); + } + +} diff --git a/src/minecraft/assemblyline/client/render/RenderItemSensor.java b/src/minecraft/assemblyline/client/render/RenderItemSensor.java new file mode 100644 index 00000000..e28841ee --- /dev/null +++ b/src/minecraft/assemblyline/client/render/RenderItemSensor.java @@ -0,0 +1,27 @@ +package assemblyline.client.render; + +import net.minecraft.client.renderer.tileentity.TileEntitySpecialRenderer; +import net.minecraft.tileentity.TileEntity; + +import assemblyline.client.model.ModelItemSensor; +import assemblyline.common.machine.sensor.TileItemSensor; + +public class RenderItemSensor extends TileEntitySpecialRenderer +{ + ModelItemSensor model; + + public RenderItemSensor() + { + model = new ModelItemSensor(); + } + + @Override + public void renderTileEntityAt(TileEntity tileEntity, double x, double y, double z, float var8) + { + if (tileEntity instanceof TileItemSensor) + { + model.render((TileItemSensor) tileEntity, x, y, z); + } + } + +} diff --git a/src/minecraft/assemblyline/common/BlockSide.java b/src/minecraft/assemblyline/common/BlockSide.java new file mode 100644 index 00000000..62abad83 --- /dev/null +++ b/src/minecraft/assemblyline/common/BlockSide.java @@ -0,0 +1,11 @@ +package assemblyline.common; + +public class BlockSide +{ + public static final int YMINUS = 0; + public static final int YPLUS = 1; + public static final int ZMINUS = 2; + public static final int ZPLUS = 3; + public static final int XMINUS = 4; + public static final int XPLUS = 5; +} diff --git a/src/minecraft/assemblyline/common/CommonProxy.java b/src/minecraft/assemblyline/common/CommonProxy.java index 339c6468..beef074d 100644 --- a/src/minecraft/assemblyline/common/CommonProxy.java +++ b/src/minecraft/assemblyline/common/CommonProxy.java @@ -16,6 +16,9 @@ public class CommonProxy implements IGuiHandler public static final int GUI_REJECTOR = 0; public static final int GUI_STAMPER = 1; public static final int GUI_ARCHITECHT_TABLE = 2; + public static final int GUI_SENSOR = 3; + + public static final int RENDER_SENSOR = 0; public void preInit() { diff --git a/src/minecraft/assemblyline/common/machine/sensor/BlockItemSensor.java b/src/minecraft/assemblyline/common/machine/sensor/BlockItemSensor.java new file mode 100644 index 00000000..a4d185e3 --- /dev/null +++ b/src/minecraft/assemblyline/common/machine/sensor/BlockItemSensor.java @@ -0,0 +1,222 @@ +package assemblyline.common.machine.sensor; + +import java.util.Random; + +import assemblyline.client.ClientProxy; +import assemblyline.common.AssemblyLine; +import assemblyline.common.BlockSide; +import assemblyline.common.CommonProxy; + +import net.minecraft.block.BlockContainer; +import net.minecraft.block.material.Material; +import net.minecraft.entity.Entity; +import net.minecraft.entity.item.EntityItem; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.world.IBlockAccess; +import net.minecraft.world.World; +import net.minecraftforge.common.ForgeDirection; + +public class BlockItemSensor extends BlockContainer +{ + private Random random = new Random(); + + public BlockItemSensor(int blockID, Material material) + { + super(blockID, material); + this.blockIndexInTexture = 0; + setBlockBounds(0.25f, 0, 0.25f, 0.75f, 0.75f, 0.75f); + } + + @Override + public boolean onBlockActivated(World world, int x, int y, int z, EntityPlayer player, int par6, float par7, float par8, float par9) + { + TileEntity tileEntity = world.getBlockTileEntity(x, y, z); + if (tileEntity == null || player.isSneaking()) + { + return false; + } + + if (tileEntity instanceof TileItemSensor) + { + player.openGui(AssemblyLine.instance, ClientProxy.GUI_SENSOR, world, x, y, z); + return true; + } + + return false; + } + + /*@Override + public void onBlockPlacedBy(World world, int x, int y, int z, EntityLiving entity) + { + if (entity instanceof EntityPlayer) + { + world.notifyBlocksOfNeighborChange(x + 1, y, z, blockID); + world.notifyBlocksOfNeighborChange(x - 1, y, z, blockID); + world.notifyBlocksOfNeighborChange(x, y, z + 1, blockID); + world.notifyBlocksOfNeighborChange(x, y, z - 1, blockID); + } + }*/ + + @Override + public void breakBlock(World world, int x, int y, int z, int int1, int int2) + { + TileItemSensor te = (TileItemSensor) world.getBlockTileEntity(x, y, z); + + if (te != null) + { + for (int i = 0; i < te.getSizeInventory(); ++i) + { + ItemStack stack = te.getStackInSlot(i); + + if (stack != null) + { + float xShift = this.random.nextFloat() * 0.8F + 0.1F; + float yShift = this.random.nextFloat() * 0.8F + 0.1F; + EntityItem eI; + + for (float zShift = this.random.nextFloat() * 0.8F + 0.1F; stack.stackSize > 0; world.spawnEntityInWorld(eI)) + { + int count = this.random.nextInt(21) + 10; + + if (count > stack.stackSize) + { + count = stack.stackSize; + } + + stack.stackSize -= count; + eI = new EntityItem(world, (double) ((float) x + xShift), (double) ((float) y + yShift), (double) ((float) z + zShift), new ItemStack(stack.itemID, count, stack.getItemDamage())); + float var15 = 0.05F; + eI.motionX = (double) ((float) this.random.nextGaussian() * var15); + eI.motionY = (double) ((float) this.random.nextGaussian() * var15 + 0.2F); + eI.motionZ = (double) ((float) this.random.nextGaussian() * var15); + + if (stack.hasTagCompound()) + { + eI.func_92014_d().setTagCompound((NBTTagCompound) stack.getTagCompound().copy()); + } + } + } + } + } + + super.breakBlock(world, x, y, z, int1, int2); + } + + @Override + public void onNeighborBlockChange(World world, int x, int y, int z, int blockID) + { + if (!canBlockStay(world, x, y, z)) + { + this.dropBlockAsItem(world, x, y, z, world.getBlockMetadata(x, y, z), 0); + world.setBlockWithNotify(x, y, z, 0); + } + } + + @Override + public void setBlockBoundsBasedOnState(IBlockAccess par1iBlockAccess, int par2, int par3, int par4) + { + setBlockBounds(0.25f, 0.25f, 0.25f, 0.75f, 0.75f, 0.75f); + } + + @Override + public boolean isOpaqueCube() + { + return false; + } + + @Override + public boolean isBlockSolidOnSide(World world, int x, int y, int z, ForgeDirection side) + { + return false; + } + + @Override + public boolean renderAsNormalBlock() + { + return false; + } + + @Override + public int getRenderType() + { + return CommonProxy.RENDER_SENSOR; + } + + @Override + public String getTextureFile() + { + return AssemblyLine.BLOCK_TEXTURE_PATH; + } + + @Override + public void onEntityWalking(World world, int x, int y, int z, Entity entity) + { + onEntityCollidedWithBlock(world, x, y, z, entity); + } + + @Override + public boolean isProvidingStrongPower(IBlockAccess world, int x, int y, int z, int direction) + { + if (direction == BlockSide.YMINUS) + { + TileEntity te = world.getBlockTileEntity(x, y, z); + if (te != null) + { + if (te instanceof TileItemSensor) + { + TileItemSensor tis = (TileItemSensor) te; + if (tis.isPowering()) + return true; + } + } + } + + return false; + } + + @Override + public boolean isProvidingWeakPower(IBlockAccess world, int x, int y, int z, int direction) + { + if (direction != BlockSide.YMINUS && direction != BlockSide.YPLUS) + { + TileEntity te = world.getBlockTileEntity(x, y, z); + + if (te != null) + { + if (te instanceof TileItemSensor) + { + TileItemSensor tis = (TileItemSensor) te; + if (tis.isPowering()) + return true; + } + } + } + + return false; + } + + @Override + public boolean canBlockStay(World world, int x, int y, int z) + { + if (world.isBlockSolidOnSide(x, y + 1, z, ForgeDirection.DOWN)) + return true; + + return false; + } + + @Override + public boolean canPlaceBlockAt(World world, int x, int y, int z) + { + return canBlockStay(world, x, y, z); + } + + @Override + public TileEntity createNewTileEntity(World world) + { + return new TileItemSensor(); + } + +} diff --git a/src/minecraft/assemblyline/common/machine/sensor/ContainerItemSensor.java b/src/minecraft/assemblyline/common/machine/sensor/ContainerItemSensor.java new file mode 100644 index 00000000..93ea3da9 --- /dev/null +++ b/src/minecraft/assemblyline/common/machine/sensor/ContainerItemSensor.java @@ -0,0 +1,100 @@ +package assemblyline.common.machine.sensor; + +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.entity.player.InventoryPlayer; +import net.minecraft.inventory.Container; +import net.minecraft.inventory.Slot; +import net.minecraft.item.ItemStack; + +public class ContainerItemSensor extends Container +{ + protected TileItemSensor tileEntity; + + public ContainerItemSensor(InventoryPlayer inventoryPlayer, TileItemSensor te) + { + tileEntity = te; + + int numRows = 3; + int var3 = (numRows - 4) * 18; + int x; + int y; + + for (x = 0; x < numRows; ++x) + { + for (y = 0; y < 9; ++y) + { + this.addSlotToContainer(new Slot(te, y + x * 9, 8 + y * 18, 18 + x * 18)); + } + } + + for (x = 0; x < 3; ++x) + { + for (y = 0; y < 9; ++y) + { + this.addSlotToContainer(new Slot(inventoryPlayer, y + x * 9 + 9, 8 + y * 18, 103 + x * 18 + var3)); + } + } + + for (x = 0; x < 9; ++x) + { + this.addSlotToContainer(new Slot(inventoryPlayer, x, 8 + x * 18, 161 + var3)); + } + } + + public ItemStack func_82846_b(EntityPlayer player, int slotNum) + { + ItemStack stack = null; + Slot slot = (Slot)this.inventorySlots.get(slotNum); + + if (slot != null && slot.getHasStack()) + { + ItemStack slotStack = slot.getStack(); + stack = slotStack.copy(); + + if (slotNum < 3 * 9) + { + if (!this.mergeItemStack(slotStack, 3 * 9, this.inventorySlots.size(), true)) + { + return null; + } + } + else if (!this.mergeItemStack(slotStack, 0, 3 * 9, false)) + { + return null; + } + + if (slotStack.stackSize == 0) + { + slot.putStack((ItemStack)null); + } + else + { + slot.onSlotChanged(); + } + } + + return stack; + } + + @Override + public boolean canInteractWith(EntityPlayer player) + { + return tileEntity.isUseableByPlayer(player); + } + + protected void bindPlayerInventory(InventoryPlayer inventoryPlayer) + { + for (int i = 0; i < 3; i++) + { + for (int j = 0; j < 9; j++) + { + addSlotToContainer(new Slot(inventoryPlayer, j + i * 9 + 9, 8 + j * 18, 84 + i * 18)); + } + } + + for (int i = 0; i < 9; i++) + { + addSlotToContainer(new Slot(inventoryPlayer, i, 8 + i * 18, 142)); + } + } +} \ No newline at end of file diff --git a/src/minecraft/assemblyline/common/machine/sensor/TileItemSensor.java b/src/minecraft/assemblyline/common/machine/sensor/TileItemSensor.java new file mode 100644 index 00000000..f2a4122f --- /dev/null +++ b/src/minecraft/assemblyline/common/machine/sensor/TileItemSensor.java @@ -0,0 +1,328 @@ +package assemblyline.common.machine.sensor; + +import java.util.ArrayList; + +import assemblyline.common.AssemblyLine; + +import net.minecraft.entity.Entity; +import net.minecraft.entity.item.EntityItem; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.inventory.IInventory; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.nbt.NBTTagList; +import net.minecraft.network.INetworkManager; +import net.minecraft.network.packet.Packet; +import net.minecraft.network.packet.Packet132TileEntityData; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.AxisAlignedBB; + +import cpw.mods.fml.common.FMLCommonHandler; +import cpw.mods.fml.relauncher.Side; + +public class TileItemSensor extends TileEntity implements IInventory +{ + private boolean powering; + private boolean invertItemCheck; + private ItemStack[] iContents = new ItemStack[27]; + + public TileItemSensor() + { + powering = false; + } + + public boolean hasItems() + { + for (int i = 0; i < iContents.length; i++) + { + if (iContents[i] != null) + { + return true; + } + } + + return false; + } + + @Override + public void updateEntity() + { + int meta = worldObj.getBlockMetadata(xCoord, yCoord, zCoord) & 3; + AxisAlignedBB testArea = AxisAlignedBB.getBoundingBox(xCoord, yCoord - 1, zCoord, xCoord + 1, yCoord, zCoord + 1); + + ArrayList entities = (ArrayList) worldObj.getEntitiesWithinAABB(EntityItem.class, testArea); + boolean tPowering = false; + if (entities.size() > 0) + { + if (hasItems()) + { + for (int i = 0; i < entities.size(); i++) + { + EntityItem e = (EntityItem) entities.get(i); + ItemStack item = e.func_92014_d(); + boolean tFound = false; + + for (int ii = 0; ii < iContents.length; ii++) + { + ItemStack compare = iContents[ii]; + if (compare != null) + { + if (invertItemCheck) + { + if (item.itemID == compare.itemID) + { + if (item.getItemDamage() == compare.getItemDamage()) + { + if (item.hasTagCompound()) + { + if (item.getTagCompound().equals(compare.getTagCompound())) + { + tFound = true; + break; + } + } + else + { + tFound = true; + break; + } + } + } + } + else + { + if (item.itemID == compare.itemID) + { + if (item.getItemDamage() == compare.getItemDamage()) + { + if (item.hasTagCompound()) + { + if (item.getTagCompound().equals(compare.getTagCompound())) + { + tPowering = true; + break; + } + } + else + { + tPowering = true; + break; + } + } + } + } + } + } + if (invertItemCheck) + { + if (!tFound) + { + tPowering = true; + break; + } + } + } + } + else + { + tPowering = true; + } + } + else + { + tPowering = false; + } + if (tPowering != powering) + { + powering = tPowering; + worldObj.notifyBlocksOfNeighborChange(xCoord, yCoord, zCoord, AssemblyLine.blockSensor.blockID); + worldObj.notifyBlocksOfNeighborChange(xCoord, yCoord + 1, zCoord, AssemblyLine.blockSensor.blockID); + for (int x = xCoord - 1; x <= xCoord + 1; x++) + { + for (int z = zCoord - 1; z <= zCoord + 1; z++) + { + worldObj.notifyBlocksOfNeighborChange(x, yCoord + 1, z, AssemblyLine.blockSensor.blockID); + } + } + } + } + + public boolean isPowering() + { + return powering; + } + + public boolean isItemCheckInverted() + { + return invertItemCheck; + } + + public void setItemCheckInverted(boolean inverted) + { + invertItemCheck = inverted; + } + + @Override + public Packet getDescriptionPacket() + { + Packet132TileEntityData pack = new Packet132TileEntityData(); + pack.xPosition = xCoord; + pack.yPosition = yCoord; + pack.zPosition = zCoord; + pack.actionType = 0; + NBTTagCompound tag = new NBTTagCompound(); + writeToNBT(tag); + pack.customParam1 = tag; + return pack; + } + + @Override + public void onDataPacket(INetworkManager netManager, Packet132TileEntityData packet) + { + super.onDataPacket(netManager, packet); + readFromNBT(packet.customParam1); + } + + @Override + public void readFromNBT(NBTTagCompound tag) + { + super.readFromNBT(tag); + NBTTagList itemList = tag.getTagList("Items"); + this.iContents = new ItemStack[this.getSizeInventory()]; + + for (int i = 0; i < itemList.tagCount(); ++i) + { + NBTTagCompound itemAt = (NBTTagCompound) itemList.tagAt(i); + int itemSlot = itemAt.getByte("Slot") & 255; + + if (itemSlot >= 0 && itemSlot < this.iContents.length) + { + this.iContents[itemSlot] = ItemStack.loadItemStackFromNBT(itemAt); + } + } + + invertItemCheck = tag.getBoolean("inverted"); + } + + @Override + public void writeToNBT(NBTTagCompound tag) + { + super.writeToNBT(tag); + NBTTagList itemList = new NBTTagList(); + + for (int i = 0; i < this.iContents.length; ++i) + { + if (this.iContents[i] != null) + { + NBTTagCompound itemAt = new NBTTagCompound(); + itemAt.setByte("Slot", (byte) i); + this.iContents[i].writeToNBT(itemAt); + itemList.appendTag(itemAt); + } + } + + tag.setTag("Items", itemList); + tag.setBoolean("inverted", invertItemCheck); + } + + @Override + public int getSizeInventory() + { + return 27; + } + + @Override + public ItemStack getStackInSlot(int slot) + { + return iContents[slot]; + } + + @Override + public ItemStack decrStackSize(int slot, int amount) + { + if (this.iContents[slot] != null) + { + ItemStack var3; + + if (this.iContents[slot].stackSize <= amount) + { + var3 = this.iContents[slot]; + this.iContents[slot] = null; + this.onInventoryChanged(); + return var3; + } + else + { + var3 = this.iContents[slot].splitStack(amount); + + if (this.iContents[slot].stackSize == 0) + { + this.iContents[slot] = null; + } + + this.onInventoryChanged(); + return var3; + } + } + else + { + return null; + } + } + + @Override + public ItemStack getStackInSlotOnClosing(int slot) + { + if (this.iContents[slot] != null) + { + ItemStack var2 = this.iContents[slot]; + this.iContents[slot] = null; + return var2; + } + else + { + return null; + } + } + + @Override + public void setInventorySlotContents(int slot, ItemStack stack) + { + this.iContents[slot] = stack; + + if (stack != null && stack.stackSize > this.getInventoryStackLimit()) + { + stack.stackSize = this.getInventoryStackLimit(); + } + + this.onInventoryChanged(); + } + + @Override + public String getInvName() + { + return "container.itemSensor"; + } + + @Override + public int getInventoryStackLimit() + { + return 64; + } + + @Override + public boolean isUseableByPlayer(EntityPlayer player) + { + return this.worldObj.getBlockTileEntity(this.xCoord, this.yCoord, this.zCoord) != this ? false : player.getDistanceSq((double) this.xCoord + 0.5D, (double) this.yCoord + 0.5D, (double) this.zCoord + 0.5D) <= 64.0D; + } + + @Override + public void openChest() + { + } + + @Override + public void closeChest() + { + } +}