From 7423fa98787980be15175c06f795d2f79c036d89 Mon Sep 17 00:00:00 2001 From: Marwan Alwali Date: Tue, 18 Feb 2025 09:57:19 +0300 Subject: [PATCH] update --- .../__pycache__/settings.cpython-311.pyc | Bin 8824 -> 8693 bytes inventory/__pycache__/admin.cpython-311.pyc | Bin 7975 -> 8724 bytes inventory/__pycache__/models.cpython-311.pyc | Bin 93049 -> 92994 bytes inventory/__pycache__/tables.cpython-311.pyc | Bin 6431 -> 5103 bytes inventory/__pycache__/urls.cpython-311.pyc | Bin 28728 -> 28785 bytes inventory/__pycache__/utils.cpython-311.pyc | Bin 40428 -> 40853 bytes inventory/__pycache__/views.cpython-311.pyc | Bin 204894 -> 205071 bytes inventory/admin.py | 37 ++++++--- .../management/commands/serie_translate.py | 69 ++++++++++++++++ inventory/models.py | 2 +- inventory/tables.py | 78 ++++++------------ inventory/urls.py | 8 +- inventory/utils.py | 12 ++- inventory/views.py | 22 +++-- requirements.txt | 9 +- static/images/icons/excel.png | Bin 0 -> 9974 bytes static/images/icons/pdf.png | Bin 0 -> 7166 bytes templates/inventory/car_detail.html | 14 ++-- templates/inventory/car_inventory.html | 6 +- templates/inventory/car_list_table.html | 25 ++++-- templates/partials/pagination.html | 8 +- 21 files changed, 185 insertions(+), 105 deletions(-) create mode 100644 inventory/management/commands/serie_translate.py create mode 100644 static/images/icons/excel.png create mode 100644 static/images/icons/pdf.png diff --git a/car_inventory/__pycache__/settings.cpython-311.pyc b/car_inventory/__pycache__/settings.cpython-311.pyc index 76807e6704b220ecb3e74b00eb4b7a32bdb394f6..83e468dccd1e977bb09b2daac9e93e94cdfc30db 100644 GIT binary patch delta 382 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 O1?xDR9RACWW&8(>sEfz| diff --git a/inventory/__pycache__/models.cpython-311.pyc b/inventory/__pycache__/models.cpython-311.pyc index 7ca358df6ea4ea7ab65483d5489935e27c2f3e51..cc0cdbbde5af6beb52401794fc62eeb34979b9cb 100644 GIT binary patch delta 156 zcmex)jrGtqR^H{jyj%=G;C6d+`t*&wj**O6ll>#*m1-EWm_Xtnkj}J>k%3_~5JNyP zgEB)2+vF{ghI}lym=kkyZm}ij=j0a^PyP|R^H{jyj%=G&|R`QeZfXv$4JJ$$^Mb@lV`h&P3}$N6RBayVg|{BKswVh zMh1q}jFbKMOH7^>sV>ZVi#ahT=N4OXeolT-anWR;?Bw&2PI_TL#SIJ}SeQ8_?+S~} zV41^xT|(=Ugw{m~ohuSLD^k|vUJ$pvC~S8{*zN+4-DKk^T|qvemL?s2hV@*IEX?~^ Q9a)<5qqgTqFOyX%hxi5;iTZk@zQvui6KcG8B4%hDn((Bsjm^WJdgy_uo@90~;(xc=SuA|pfXU)ZQz{7z;2A5eMB$c)TtjLr%yi*-)p zbdTVnb&uxNd4Y$zSLQXJUMJMiexK&o>xFt+uhRm0PzchxUuzITFh{)>)+0hA!6JmN?i0cUm8;WVF*^IHl+V!TYD~6g)D?hRh zu}{y*ie>;EI|{%fuaSaULk8HC`=+Q#`IR2t_FRyN9RRqbW+j-w4v*b86{63>r*r5Q~z`W9DgA5pThLh{jFn&@--nqVQL4WPjMGtzE#T>g7&>B=2zdZrjj zmm+D)pWcQ+Ce`D${UX)BDB1y01k*2R3e+1!@yjJiL(7OF=>XadhIGP%;Fcq37YdC~ zF^&Tis`nPh@-n-{?2pbQ$nUbaA3E^b?gKr(u{g&lo_SO%y`Tj%KLvw6s~UBabGHQ_ z<*BRi$R66R%nygyO`l=uth~Ed_Q`cB3+M-|{{y!fcnVTHt4bo&(^;!+I!Dkw#~#T7 z`|vazz!ThuCv*T$!#+IW19(FF@I(&a3Gc(xcmPkt%_BEKo0p?CT(PHcQl3?hr_fl# z6{lQ@1GsSRUAsqard%xta7Eo*l&7_Zr*_Z9_TgzefCt_I+tMSY#kGC`D7r^gI3?Q;Ni9r%7 z?!*8R09RC*WH#6o!6-^v0Coa5jeU0139(|uieS=wM|B_U9UO)UwlPj(EI#x^DMpT! zBF8NMF)HT&E+Lsf@%EQ7RwD-Pw0!5=gv8Mioa`zB8sz^X72WG^m5Ppj_CBS8q|;-V zQ@|1SS9Z~5Eai{@_P8}He3i5+{ok9_`ctwr7AV>s8Z z5#EPQ-z}Nj`RtXow|&mniOq@xoq!z} zSF;OFAE`%C&m#OBfgZneSo;)#?)zV0Z4?1F9JzpS5rNtjj;wwzd{fY?jnc? zNd&aNleu?e4Iu$P<4X?TuX2~04zD#oIgR<;;sj2q|Rk>c*)<05w# zA0j)w>k<47_mW`%Ur{VvC`Y^2K77=>ejV=RjoX{It>{oOI#h}d6}~9Pl52yH&aF%9 z((}5F`OSGNHe8Gimtw<(@p74Xgb>AP=KdDx5pcot|1qTWjck}r-7B&~G z*x6$2Y$4Jc-1$;Os`+gFT&glRPhFGr7JcQ`L+<{DXpi zN!!7l{&X%o>!cjbF3RfP76kJ&n<4mxXU82H(K&!8omuHwvwhAG!M}v;u$zwj7CT$r z3lJ%5Kq8~&vLpz@WCj5fAreAB|4$+ajQ}=JUw}lhLqfn$T$`W5tel>=nuGY-KjM6B ze@e1IiQluvX}~QH%d%yr$8wh+n55+{W#$vhU4CHVmb;XhZp&TDOsnNCWv0ujlrl4D zxl5TzSwF3mnIo3FZ238G&Rfj>h$sCe9ecH#A~3|le%TAF%MTyC#Qs AZvX%Q literal 6431 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 X|FAc$*3GDOvufS6yW8ti-D3PdA2Ht| delta 1773 zcmY+ETTGjE7{!m71Ij6*xxEN7JMZXYA+!R+wOrvVQDp`@N zN!H2Qh0 z2G(BIqh=f_vN^mH!>w}o2ikYdIMQ8nOpnQZRowTb1=m$g{+Ij!xjhHhIFN%CZ|79X zo-NdGQvZv3$O^rV`nVN2_2kP|%>F{Rk;)bu+^yu7ZE&Y;GI_>cZ`{Vu89Pq4%Z_bh zcHFFH_O9E}t2waeQ7U~7B(;#|9dMT&=#NrqcEWv}e1g24e2u(=>~&$P!G)=vR6cWI zs+IgFT~{tn@(^o3>+xKi@JDhs7w73}_q4A5>aMD!r}1bILC8u>-C*N4ysAMQ

^3Q%GWZ6?#gwALYIuFrJ7s364$`}<9!0b4A zcL45z0Qx7WT&9~M>p{4sL7Zebh~#P3ORT>JG4&cd8$-yPB2STzlCOr4uol8CJ4U51 zjLz4|^I^El;Z9i{#WhlY!?+TzH-?HsQhBSmM%IPmPN|=yURwfvR|)hK>&GQ<-=P~W z4M~2N{1W*T`D^lNvZV|?XUIL|_sH{QNWM~rleo%}nWlcG9R2tBCV7T>O$Bs=JV}0^ ze3g8bTo6HKLj;+}BFH>X{l5riXUV%O!57H0V_{C5kcekCkt&1Nt&f>w8Xmf_y0cLBe_fiTqfucCW<3YFEs?i-iCS zIoM7Rwt<0wfnZ2eVoYlrubcGLNo?mNHLaZ*`{3ep32EIEw{;RHPJ7z=m?rN3&E3@^ z8J|-f>C?S4^Z)a|=Kue>zkS7e@fLKS;iU!&Es(h~CSwS;D$wOTCa>CgP>TN{sr9Efou(`=aZdU?Hgz*X#6L~jcdJ6#`IS-ns)7qeyJXy&bK zapINC$JsJJ2y;W~fD(`B0c9u_kLreFAQDq_pN%)uEN{UQ=eA%VqDGUv_wahmw2D31 zKDJyumwlQo7He{voNX9hAtrKGvz6k#oI3An4Ag-G+saqbf6Yxm(&6VW60st;(D79o zYECre#u%}AF7I3+xEq<88Vv>1AtfB)3Jvs$@Qh|!kbk&X{CLJsn?f|kRRW*YaB+28 zT-9`rK@Bc|{`Aktfg$6X$^-h2VU>qztY7>ve*-akVP~({@Y(qtc-{=y2AE5rVIHN8?8c~i49M$4yt^= zV3nm~YryvifiH)j!1GDKw*jXJ47<+5L;N(}_v76i3Tr_`AwP)M%y=}MV)z{_n&fxR z!JovyQ-A{i5bz>ET3)wl$fUy0B;Kv;Mv&!qc*Gr5E#*nqOG?QjO$n!qsz&w$@n+Q` zw)jx>o(8DM&k%H;vzZ&EC742pb;aQj)2Xq0t0gn(EGZ6Fexjv!=LW-{Nbr`m3@u9TM z45vDx(+T5W2OZ4jbDDkudwFKLv^bn+u(0N&|Am8glnIH#be#YiORZhd;1v8aVvq(Wn^wwQc1_$>v>GV!W=>v`QWZl7JxE= zaFh}pq~R0dMVCjsUFHy3rH9M-K8!s9I7BclP}8HiOs9KR zOw6Cl{!{$*{Ebeyf*(0l?Ge6)rKLylCgBS%Y!$Sb^H1QlNSrAz6>l|^(((AH;TG0< z9Aq+p5avER9ZIOP0mIV2($;73dUL+aCAKa+-Vb4XF4J1lP(J{Pw2Cy|_wfqj`8;15 zApAv|hyTNxuF2R)hXp?-1{YOqxd1k`fR_LW55vLfT$=IX%bFf40?VWhQYtABtjg0; zK~fDtE2GE+I%JHH|UMG2~W#Ni97`lVKz4$-5#SH6o|%$`c=*^itn|QHy^`Nly_5|>>*{V z8W>h~45^fDcG5U$h5A93iRxi}hv7=H;g23_-ARddS8K83Lt0RgINth03hKnhJO9O6 z`%`fI8Q?8~UjB2!(HZ`r%wn4NUS)^UA5r<+LRnrib_wg=Bk<)(FPPSs=FO0)4hhr@ z2sf6db;{}wM!N<6&UrjDZG~};;DOb*+FsY zo}jEb#fg$NJuF)$2$ELz6{Bl!W2eN~wOizhGx2H1 zY<5=6>TIXgn>sJAl4g^BmVHi28_g^R(#C_J%qA|fHt^{@GiYYCO4JXOW~8Xki!AmvIUMG+uFrDegMw7c4E+rJA?nRRY+Hl5)sSv4V99TI_ zz^@ZbN!FR-wXSM9<^S6C4RTNHIJW`@-{Q~wIv3I>U=S`yW6_`H!g}AWZGX_4q zfWXM^ZSU^r33Rsi1{TgwpARDsl`7Tb24jl!wvm%mBcg@|RZelLbJ>~6Ffg1LR=AO! zOaeo(kQ$Nl8$|)qO;$eCrLq78Vk%QiH?LJF8@%k5#3LK3DPf?7RA`RG>l=4j3!n(~ z5&s714+4HI*7a5Qrp;WCD&rb;R5BWqewBUW36MMjkO7+|OJp+NAvC#c7$oCs;$oj# zCy$_MdLu8DAd_9f6gS)|Hs0rBZzaa>t3;Cf?){C{F==(X>Jcx)&j&0%E7U1euo zf)G1S8~gIjc#vV41s$+np)4dj6e+EZhRik-8W>+mdO~tb>dKdZVL9M`Eu^v8=oR8! z9%mPhe>j*-Ey<8tO4Czxu?Z1a$bKc>2>cU8G@6jtHeF_uVRfRvW=1hs{stDCg{Knn zPJem-AMq~FkEupdK$%QEm@C6t15YvoOF5AvjG0q{1F<2ArU!;ybOmeKAH- zG25Km@iZSWsTXg+>jD76vob3smYuov#xE?DvZ|DDj`RM`R5Q~QA zu#&|6!@ZFI!nWJie~xu77=rCVMT@Cng;%NK`n{@^2-RSW-a{mPQ%CI^j?tbWEX&=2)EBkG% z$_dB-Pc2nM-N@>4cqSFZST!YxKNkl_D%pGD<&hpT-=@xDF?+{3HYVQOQQb05i>F!diMNuI(nNRp3MicKvZao1=ryDHX=b`k3{qx-$s{f2&Rx-UbbW9NMKfq0k@ z-xXRaq;A&qz0}8Knod=7k-2LLWhMWv5?cSjF7B7>Z8x^zkknxwV3{)QTh$$!;R?n% zN5A?Y39C71k?f<^ae^%bLMM+TMkaF!-hcxl*5K z_M|?7{qx?tnOn?x^tDQyKk~E+CX+F;$y_%;gQNAy=yHnB_kM+Lbd8TSk-PX~Pgw7Q zH9N`UMc7r!GE5YPElkda4XIU_6v&hV5$*LR#ducS`OQ|ACw6~xH-!|g$9ek(s-RjY z1-xV`&EG^sQ=;A^^oT3_T8VJx#J;*SQj+8sj!8-QF5)%y`=3c#C|vs=9FwW%6`~{+ z+UOtuN5EeKE(354q^S#dmiB=?xB_?`Q%RpoQb_<(qtLvpn4U|08B#-%xeS9%sqp{R z{uY*-nEgZzT9#E$KF%tZf-U1XayOB^Rs8O$Wvo`zAHb2#KkO0wz*_UzGBajxuJ0`2 zK2VY|s7BS1VZO{KN)9%ex__zCnP2#b0~_4LJp2Vr$h*6P?}6CTP|{>LOwwAZ3h9)V z(csEV%O*MqSn$61<-s~uEiw+hB!%jvUaSj@x&b`|M)n4OZ(!Z>djg&Qj&_a^| z!!c{taZLRPFd-(sRkQRu9#vGHgl#YM9Hc5k88M=d%NAGnLgLToFNq=o0}I8e!- zU6znFWIIbE=O;&dEYnulzqrEZ7;Vc$Om?e!oJTdUzFGA~VnHPm9#uo$s4}E_`xT8I zV^KLbmQ3j0)W`mLlH9P;)gw#cN`E*Q09B{VTIBs=lF)EbwN$7Mr?X5_>s*vkxu2xs zM@jt-(m-n@vOSjna$DS<@rU<5e9ZH%tL&1i?Aq;lg$MLw4?Mf#oxFz2c@3A`4cD>? z4lFuWc-r$$R?X$CnoIT?)335bwTh>YmFHGK1}ELqL)6Bv5N<9J#pTm?_1*Hen9`tzs(iiX+*n-*NbU=`ndJQ-V$1`^jg-(Ic7$l7pp|1 z#Jb!f@>RR7(>9N!6h_{+?GjV3qMWSp(qCE1)^14cT*k0sa{SU7Uilvt)3xeU+6r-X!-ND$j)J^kv5 z1f(7QYDh(A`efTCnyQT4m>v`)=H-l&lOf$m*0q4wrM0_#e%V43&Fa8}B}CA7I7_`T z;e|>M%}FnT!(t>zZAVzsLlToZybSy4$4DcOxWc+7U7_v{O>U(*xBAl+8%fZan{re` z=8}?TnsZo~)s!cUL|;G;xdR?e7m!7Ip2{q+ZKv@zbvkply_`lKi#n5$70I0Vp%9DI zmsv;C*V3$E_ejkh(qyYTF=@eOj?R3{C)IU%w2qK37~p8hc$$=wz!5JOVcZ7j0L&rK zu?{DhW~4}sZ0OWn9=DXcXlX~JbaK7LjxFUnwKIDmMfZoLFK$^m#OS023KrpYB1LjbvLW7;^jNN?MeI z1dcR$4C8wN#{nk@jQEiBwafeQ%yJTAa^ztwCx-*R*goF@(aMED2s~+%hcLb!a0dV! zG8=FiJMN2oR@{hetS?zx5X}!}V)iji>hY2a@e_5fq@2hfyE{u2mHFnMv`SbnhY1?! zf%h6!VvGRLJ)}<0m@A%8U(VPxB4u0NNi01KxD3OyDsR@NDM&^~qHF>oE6JyDr5c!Z zW$#|BrO6bm^#Rrb)&cqnj0rd%$cj*x?((`rZrOlos~&D2b(&$8y z(wXN1_v7)r52;gSbHzWEQMQQ>g&gF-UO#_P-d&Kz@U@UsDcVtdsa~01&0HT?$j~fR za`ji$_kfEN0;%hWr-K-vV!Z*=95MFZ_waZbv37N6!LcnI=>*d~!=U~NfE~l$dK`}& z@~q2-T>glN5K*5V(mC3rftEvRe|cf=qYyI-@E8CAH*Av5teF9hl<~no3Np4~7$a5) zUX`O-K~o)R$a!IcS=zFYf~~#)m0O?N@9K0X`>B-6pA+qik@?p=W1)KTkBT$aj2fCT z;%nXd)+UrBb!JJ9IHf*XQjxU>D+!@4v&R35p5!vMu&Qe+XL~1B(|v)?AQd53Al$x1 zlk(T!mk65V%Y;1>oF1-ldeK^Uw|k3UldocW(lVdlkEwRrqo`5yXueL( zD}Mv-vjmO|j*V_dw`1(kHZ71CDpKI$a znYdPs*hYWhdo{(Yhq!LJ`y-%|as}Zkj{#Ntm{+wnm>bj1v zoGuQlXIFY??~?2NBK1qGlTzGB9A7m@oKVlN+D3(N!Rlk8S-rZtNL)~#tj@i{2F;^{ zL@wi0Zo@S3Jyq3EN7T18oL$Zeb5Oali7Bm{C7oT_3eFUg!WCYQmzhW_Jtb;QYhF@} z`(gFmn&qTy>e_N4Qj~Mu(%#X1GR%I)6(cs|RfA1Nb}|y&UN3bhI^VH|J={T8iDrh{ zB4NI~Krp62Cqa**TDNS9M)^utbf5AiOzOnch=iDW6I+R7OTrg;-xOCTzv3`v!-2De}M##W?-Hy0OAyMj~F; zkYFPz9Bg;7ON=DmmD}!IGFRS1>y9hT{NaG5!2O_iQ+ZYGsz<5j#bx?l)?gzzg=*eK3c=x~uF;CY z*;7MwX0e!r(OLlR8@U+fM!g5y#(1xa7JG_o)!No+;tM5P2cyYa)HZ18EuqCGIRjcC z?A-h~CQ-0xT#DJxF&fQ6I6=`sJDi#`%jM_i)N@F&=P~S-O2N!tU zcv&=T!JPrBLW%m;;7%E&lfmr`Iw`pmq)E<=&K0Yi%U0FNZk69rV15vI1?%IBPQ2RK zF-zn|c6T(v(%COI;`<@UBQvPK~D{PlWFjxvzmf5$_Tbkr;qn&cH#nb?5VW&GhU@ z;QrM}bMbMAk+!H+T`Q&|YO$0*PUA5-18?=@t26zR)vH|z;;eeDYdtx#wEGugw>sB7 zqq2_(#=T-mE9Pz?h>1mmK1S>ovO)c(KQAe!wxM?PtRunC^&BjM64Aa8qwz8IsNhXy z;w?2yh))_-g>0f_^hMVp_!5Zq6>9FTh57GTNCjMteQ|GPOgx)WcsiqOxctHD(}`vD zrqsJjI$4VK;#UKrcG%3zoXd3lcCA}C5UTJr;Vf6)4dq6b$Gv*-v!(U-~%y?(Mkg9in(AM!^HpR;SC-D9p7vZV)PvV z?X@eKR;+1ou5zufYuvb^wr;)a`nqO%+vOex zW}Bi%(+Zo6zVG67_v!wH;#}mj{yN-`mA8IV*lWP&R44XKS#J*U9EKX51oWM)9pfDU zXha``DnY?sPQYg$d_3VMGM?tizkTM3tD>hKC#7Sqs@peFmG8|G32MdOXNz$tDePWI z97&iKlS!k=o_R4QVOP!jDoN47eTOVHa9{%kIh%e>rGi9lSbY>ro|@FA1+=aXxpcOwK2q7s242>((oFk-CD?52WTWPQa3uATx*uC zbTv3v*GZ(1>;Q0vqlQXUJn3Ot`pz2idD^wm)}S|fHnGUw{cL5&*_(k_TMtlRp z3lf@)bJB&xDr&~Ver>6IfL7^WocabzTd}tp4`22rkpZo&YUUt#GZtW zFDE2EoR}CFM*k+IKUMzN=EMxKXmi)9coAj|v&P!f9L+78@6XBRpNaOij&_!Ij!a9Y zqrIiQBg>M-@008u933s2ziAiEKU3{SqUhyv^tbeP46qE~cg^er9fK@`9G6%w;ooWY z!Hyx8A^hB&vJbTk<>z#JzGIkWm}9tQxMPH61ix!xAL$rn8RfXtaw-3ANjRe|qxrd& zeT-wQWvpYIWt?NYWjw#juupJIv=}dn^i0Q8%T#{X)?Q#KAd1@B3oV8GH`)?yoD~CH za~yLma~Y?jeY(S9u{h>g<~inD=JUI3`vS*8O9?-BvWGbqSr+kgXM3q*v1PHN%u?pC zTC5J6#pYOIS>hs!J?)Dl-t)-Tqdr-wIEh`Ta?9nEm}~8AU+cKS zas@x<*=EqC(sAp1WZcUiXZ^Ci^o)t1%N?p2PvEqC*~!S;I`_ge1d=eG9yEcdZ6?zcQZ ze}~u~bUb8vh|`AJw>q|2w()bm{b9$yEdO$Bw`}L%!|bj{9FJNaZ` z_QxGhSe|g~wCr^3vg~p^X?fC7Z>i_Bk@lw?Pg|aLJY#u=e~%&wLUIk32L64i{aMFz zmgo3+w7r|7yQRD1dCT+sdyM@B$G-lFn$mxf?zX|s>@AHmvfw(AZe3*6o zhA`^{o7fgk<%Ea1yal~(owy;)a@abF;2VrMnGmPgmUwwX;d-&r~Yv+3+0+ec@)*2lx<;Q#)re>U6!{QXFlO9ppwgiN`8k^7gB0T zh_=1Usf#GJG(_I_Y_qM4H-u45VUK!h4GXip&w0uykCpPctU(pJIoU?ZOF~rm0jHKz z>QYL**0y9@Bo$8osehIaIlY3?mxWCKh|`x-x}DR@T|ot$U<3ytRFWhDIA%G?X;qX~ zO%(^Go#M0=l%_Yz_c5nADXoSpwffZw9k86X){=q)( zPOYQV%R;1nPRcMlkm=UT8;Riy63*HUVXi<#%a>gA6;!l~iVhaeSDds>_IZ`LgYf8QjmbFFu85SBmq z=^lFelb`P0AT|k$GJ5w>S@${)St(^4|z<+BU*| zn44A}$WFqHWQ>0i#`cgEMsfNhl>VrvJ{MK0{!#X5PToPuk8uS-ydjJj#(11Co?wh1 zfe}V5W9%f1T}?DHjxnAjjC$KlSFn~+5%G-h6d^p_L^Bc?;~BzeAdDaxQwfQj{w$?G z*F-auNVA?N%|ib-jU#1E=BzJJ)_+shpe{t|DV+WyrN7if<5C%8H(~4v*|=t$zL(Np z2K|kUC{>b1t=ku@_w>HGbw6uDIu~((ig+btBU{*Jvl_m-K?K?tDx)RmJxF;EQQlzt zPYA87uW=y%wNgT>00>yugO-bo(W?R1rL1`W#d~59C^zTBX_oei+#@VEF z*KF(eA=3L(`VS%A5Adkxxe)3(kn;Q(BF`Wu>r$If z@*t=2%jQH>p!XPaIH{p!Tc>1^9$ zYY0+ym#|Ftw5JOrb+tWV+Y^K&EX5w2Zj6(&N!W^Q|0cX(m7C$g>&|#R81JPJcr!hC zJ;|t3`+70r?huHxJczlB*W0!;MB`?AaPkYKv^xPmE|>p|?# zhyxfg6a^L!-ay71#CV|ynCHQ}gz*O3o(yapITh5C=6jHaFw#(4eIOF!Eb!puGtMxo za6w2BEcD(Jvd_+XRPh%5IBoH zIO7;+Jk__@wx?SoRV(wLO<=T%gjNPRjVn^C&hZkttMTa_c+@nct4SLroVD^^!j z)_>R{Au6hv%#A+1{@b>TgcxHKW_A{B>uWP_5^*;n0pKnpA**fFt^D(rUoz^)XT2CM zW*L#492rySr8}a!v}UP0(phb)b;~ zV_@gPHn$;HvU62MP1({Cdue5PZE3kpZ=kpL*5B88s}Q%=kL!9{RM$Q9CMVh*QR}qn z`ab%h?+17V;8lPF00#{%H&4tr`sL;icn&Xy5pYK=b5>QlBkfhCR;N2+ag}wAz6FW- z05gCQRa#T!s3_AbjfZk`#606jZl-G|XD!vso$jdRtMFHU9vNN$_%|n7OKVEq;j5PP z0q6_RPv3*&y+}@}E_FIrRq57}vZ~4@6}rQ0w>z?WX;r1oulWa&?Fh07n=_sM8q0gP z$YAayT5Y9vn_l9qD6g!o*1x92ef9tB-9JJcF^=|Ykuw6hBAvC>Hr*X#t#FbE%9d`A zbVoRC_9Z&V&`$%LF_QXcv_p~lj|A#cCsa9D7jnIsQjIbF3y9-J|Mn5h1O?)B1e$b> zo^oRJi^l#-Mn$RDM*QHMeg-AxG}q73A9qT*tp;?~*jCq+fG>IlvU2V7fDk^qRM$T+ z$_HnQiN+0sdo7uUbjZOSRa;FtZ2Bp@NgKLTcomLTMFB(rL=qs{ zYf5XJx@sBTQiMHB{|e~87@0#_MlsDX#?T>|qGi2h$S|#VBN8_OY$o7Ntg$(&?bL>n z%2J1o*`vpx=){teGCPT}%x1Tjlx!FJFN999=diGmI+ywl$^b|*zRE9&=AQ9QnB4oW z*2h>stVgfFiu81}41CiWlZ(i}JAf(1`@`C*A~J-r>vSvQ%f9`L@xynw{|-662l$DA zlZKzLEc&-jwc$sj^N0?j*cd-zy0}#qeX2FDe|*F|&2<48eg*gg;7@=sRHitEpAc;@ zW0`v_+hmq4b0SEbdMq-2fFk1XL@Oa-dIG>iyi3H>!eqb{0LVHg-W00d3~z%3nud3( zX?WshFuUU^H&N^P=OH@A`0UagF~2@#^a#<3nb{nPCd?;GO^VZ^fGrG@RgeDGwFqr3)2&%Xg#R}y%k<#?3}oS)bH3_kzwRbI?<84J{w^+wgn(sF#lLSS^8~8-sFDbCc`>;w03Kl z?66w2GWJgXb+OsToIZa?W`>;vpJp0_9y~Ymf9<<+ar{Og6KdH zlGMi|m3$*}YCB;V`BN9USQesyEKZO(V6<4v-I0zetIe*@=ZcB=abRyBh=Y4Gn4%8? z$Oi~1ye>!qSV#XkS5ryn*M;GKMwbRu2z|?;s?;tW+;qTH&mz(%0yd zDgB?onNCU6sQyLMAd$^8NVo1SdRKHiMDOd8CRQ?!v(T`rN*#+a`s)O8;`F=lyd})| z*4d%MEL53~_t8oitO;re0$QPQYI=5iw1UllUD~K+rK=~DR#M1b_o~!=M#tjY*v}}_ zWLCUrUVp53dAK-a44d6DN>yxFW_ORG_0TZ=ka7L&8(lu9z#YQ^E2*%$Bi7hT^%*&u z&Ul}oP3hjYQbr#?{kRxqTTNVXG68N;;tsdl$aiqo=oQua94f#aMNFu*IrX_9zyh!x zuZ`R0q;)pikWfLxKCzga;vLVJ5fNZjT5`-ubSII6So>? z_h!`Znb%yn77=OGVJbl3G5}xUwg9~O;TSr!A)Hh!^ zTuUrP`xX~*a}s9=f8_f`D^rAsu|m4xPw_Xw4g!OxlVP!VfVq1qlzvX}wPKvDR$+MoZ|p@K-1 z?DXS22rQytZW9<(jzOxUsyiC^2@I=WDmpIQM0mk+L+uvq5F( zw*uS(fDv!I<|b#^Emk_=ldgy8vOjkP5Ra|W=t5{M|#$ug? z4&g`TBx7hrzoGllcBp|nl6wsK?v)iaI<1?-->$Bvfk=sxO+})gD&A~tujnZrG~THo zqiFnI(N8&WGmL@Dx{BEPh0Cs|X#sZ>&E8D7ZU#jgQEZAwKDHIL71a(J_PBlz9X=yP z*sNO#M8{YkW{{BTP^hV2{*pp{?l@l^sloD^X*}e}7QKvvj#VU;k(GanW>26r_N6z| z({@cajA_*)wWoao>cRqg8fZ@eKtTFk^yCu`Ufg5EtmrQajA1J-?dvC@q+kgp5oLwd z=yCp{F?Ov;%X%LF*(JQ$ zJgQLHJ*%yzw8E}mYRp>GTP!rLUXvBI1=XY&JJt+eq~j4INYGHs2HKqjH^^R9R%%x^ z4s$Y{2ViDtoF7YljdaIVIB2q4vZR6rzE_P&b!}SnXbtH&;|Rb`sejZrU3HmaLH#{- z(**mE1>}ncv6j6NZt>gTWDs}v;~l_EBlq&L%IDax{72cwCYl+pD--H>UM@83-3il6 z0ifx`VD{6^aR@zF{{Ttx%F(zB#B#-F@WlQbdRXuzq0WeRwaw=t$HxS=(RyH&s>1iF z24}248;A>KuAahWY;tWQPxJf#h~|dtiAbYp-4{zgLZfI0Qdr0W!3$#8IW&r0Y##Cg z+r8b>$C(D6pRfxYp<1v`>1d2`-};Wx8>uThSHhw1V0^WH&LF62PI9n3Ocu}%tuWn6 zz#X@g=G+wLSWFIOy0PXTdATQ%*0kIIE|LLOp-!ifTF}z?_8*Is{N5$|ae8|F!&jz@ z8J7~y_FzAeXV5xrAoDna%mBElUSem0Bdm2Hh|M=ruF4d58@;cZ=$Tg<$qOT8$<+2ouaoA*UpWGq&gZ~uIa??erR9c9ZN=Y zbd?>GBbL{Es@R?Adl}^Qv#-xyf77!297F)z0olRpH;zA_ViaCmp~Uw&#MjDr_u3lq ze*Ki|GNW4Xj2&Ie9b3ARj1i)B`s>EJjaja26!t5?Zvejo`~i?gfTDTPW#ny^R8;CZ zUNQx6$n=!}wDB#BykN5rgR41deq7~F%e}%>+YbmyxsY|D4?V_HDQimF+8xVM<7inpN@1_KqDnj??!p;Imo0f%G}*UdQkU^mgt zIR4Q37-oAowP(TBAzj`>eQ8aPaOfd=g7M55k>w)pi$5=%s8XdcJH zm1o7{7!P6LglonhDnx7Jnw_7B3x<7Hn{+O*2ij#Csd>hhU9ECHK(pCOJ$IoCD+%M@4H<2~fATU>nLFBt1U6nY&Neh}!F30R zh=&`kpY1Hx7$cuuY6|>RXC1Zby#YeXkxH#=XS9DdgM**z!P;3;tP+_rez{06(x1;` zUq@#Fr~aLQ!I?g&%M>#D87<7IIBSW6f~{DXV~>Y+y3i~LplPZ1(_$#SA0aI_4nO~d zl6JrP^)G~rt`IVbhP&DT6cbvw#-so4C~h{6{JX0ix>}Hv7?KRrkoi2enY^A9zYG6;o$Sd}+KkKp3Mc(|8VPRKE1^ zWYa=%9jqu(6f(BanpP;&H-)OHYfgUD7{=k4r$U#;qTL0HKyBlhb116~C)*wG6;iEk z*HL!p7&PsH3DW^?F_QKyP!vuwR_yt`C(9#3dF(8YzvywsKlgSQ_ZtTY-dcZl?_A;f z3VdaMeK0+da~*0xFsC4<<@y~GI00ZXkS!dWmSI#_kV}vEby>u>DKybWbOXx}#^ZaV zjidYG#6yOA-?}c$yU>b~gob(y+PeMemzcWF3crWE>ZhXTfV$}s@BFh{(9#KNXS^RvxSj%_=_2scjd(Tkqq^A z$1l;V9A4&e7vhNkYq+V`-KbV46&~cIWD%V$l#_DMsD5LeT)~h_jV3<;|-H7eXbVs@o&|d?R-1?n1jbf)vV2GUAW*i2e`)8Ks<~g~zhza7T{| zIU<-;nyzirvvk`26Q%>aiy9_-dUu3z_Shwg7+Zbre|CpAXZ->V?x-@XN!rKhzZ&A5 zS@B2E_@e*^jm7VDOoKsm$JcoHT2j4S|IU!_EO7;?BDc~coOLA!EMkRW{W0yL6=fzA zRMq%`?ke8?A*!W)RBG>tPFuoAzIcZ&;cm9Lw!&^LDP8QWveyo$-3_&R1rNLA&M@EE zc2^=3*9X1UnZ$4!OU%U*UL1J--PVzaVV|mh|J|3dFK5g9Tf?K6D~FBoALXYnqr|$z ztO{qAZiC}yv*zl{jXOTN&NYC_rG>Zul>vcd>s4qUjEx?OT5!vq;Nx}~?J}7NGQb6z z`hd(4Dy9@fCr1lXd>O0tDqc~>Ov6dO3-wR+kD`tzPh`cdrB?h24SC-<@$T6Af|GX$ zR*$mqTNXCI<>O}+Ck`4fecX8x+Xw%d5zCr|!)B5t#B)B+QmrWmWc3bvSyXke(`_SN zRCQaU;B+Z5edp<=BJ)cS_%*o}J0~EhN=@p-B&in!I&H;Sf zIB$&6>(lP>Gm-a4l^4575N0th`}FCt=4^=@{2ifCXwDQD>l9S=FQb38pXCUPaqnjn z{wf+5H@cSArX6IUtbPV7$$T5+-LaM8PR@gQNK>^QiUcs32y|W^W-R&KrMmcfwpWfT zhtv=MBI|GYd-<0+@zy5zoBh}PCEnC^H`agI+Mo$vd_^cmzy8%Ty+bfszY47%NCgDM zQc++I7l`?2C9$=Y@x#~3`EMf739CQdR!$4RYE{;cziB~9{|`*Q4$ZtSf?$cU=<`;_ zi~n^f9$#0V_f4^gdXBmlt+8D9ZMHaQJoasti>LN%KGnKD`fY;#HqZhM1}(ojOLQA8 z%dWIpmDU{s7Au_3=;`Hnmyc3Z=YqM`X)}N_anDeKU;hfDIGj7hQz$RkucS>a`mNM_ zr(yf6B)6$P1 z-Ydl;2UE%=@c=jx%}+!hf)R2j`Rc2sT|D++f7zs+4LCbOm;x9pf6PqeA%!^+sqZxI z|FJ_~9)f}CiwlsAK{d@BrIlEVQnj&jt=~)Ktgrv^$6JJVGl+5D&n4pGlfSeO^Jh^m zio88UI5gH()zHFMSrs*rOzu2Ta1wxxb|#_dm*8hHKs5mNnNV(a!?sd-KnU)np`Y(4 zwi&mbFD+1xacsz8o~sCoV4Vcx;A8kr?e0ed0PZ)&To|sD@qW0&_4i-M5S{;pWM&-f znLZvr8+9||3%=;Eo%^J2!)R5hiW=R8+&#YjR5ZFi-#< zhq(e*dB@PBzs^xKJPaBP*Z5{e|KAo1cfI_rhY%kb`+mS3MYL8qr7{z&T| z2O3Whpx(jk#~ul_;Px0*70@+EiiAjEhWq|Zm+NvwOw=1_$pU$Ej_7H~KL#i#RV~7O z_Q$oof)?Re4&|UC`iiK+@ z<#fl|oHev|TVr#&X^Yy*stWQPSnC2N1wGN4b7(bM<4(j9u`i2thX1CoMvZI@>+r~^v(L$#A9wrs1%=`W&;-2^VCm+6k)rB?EeJv-@gm)1D!`d&(Ff`kO`o;x2I`aTr* zcNFA=A|b|Gtv?yESDeU|GOct}Ec*FPs zc`{jKC4LDWA(?FIOEMuvv`cvdEjtSECcsWPI7Qq$4^ql$p|&z6C|}Am^J7VIHEb+E zm^-1&ZY!;{S=D}S*28)f#x|r3+FgW-4*^(Zzf{r1#k}AVon?3mNgo5SG(EEp))m(6 zJxKZwHxK}e8G*A7df{&7ZK%2HRR4(3TaW@cC(y&Xu#e(Xj>oq<7T@q*su&aLRZQL> zkg}9`IacJ$RV_v9cA$_#k6X|o#cEbAb22U;Zz%?e>GHFdB0m=$NoOw7tq}gKRE$UJ z9spL&w`EZ)(aH5LVUmP6u<#yoF~2>-zS$v6Hk&+UJI$PU3mJV9RovrB=(Qr!# zkt2o=N7>OqK`y_I*gUfFv@2AoR$k~Rva|;x<)Uk~wlcR+i)3=6UqXRkQb)k=Xr#e|IHRl)d>F+M?{^Sgfr@AVE-cj+evgT z36dj}TK~UqS&(cmq5^ndhJ!W}HyRQYmOS}Arnyw_Fq5;k_&E>K2NVAho&pOL$C zWN}UDk|oNSXVafen$d(0`5;TNi9U=3I z$q}ON@ql;}TTdG%_Y@O^YY&lH7dOLJxwOpb0HoA?7jL zTQWtAo z{;q7TR`0MXrpF*-EP=Y#Gily0k8RLe7>h0@%JvIItZc{=m$e%Nk}m-mO28byw1c082ox{JxLyY_3TPXLIi9@>BYW zti_-%pv!YZn(FcagD12ju=^*0OKMe-;~1$__$qm%pO{5cwNw4Y)b9QB`m>`;ZVKFl z?Hc!cn$fH-v+@33-&9;~=`XS(TT%%wxwk)Q4wo?NlIHYAPbc8Rq;lM;%DX6`)0tIz z30K~RaIOUFTOo(4U%oIv#5QYOgnVa!$WG2A#A||bwCSIhr(E+8xvB?}tJ{Hc-C*Y8 zUBaW~sexiLc?x?cQMVmCNc^`Dw$7bUrI(jhR@8BX0|!HPK`l7!{vkrpnV!@62? zIyJz4^RSMmz@gIsX9xs#uuthtU3Zx}QnZkH!$ouPh#Wgy}FJ68bfW2BkBc8DQ2FTlBmAr5M=>07gze^q`u zLUa+g$%K)jZR8*#WNSmOk>Xa5FWvCLC^5^kh!Vv2c7Mrt`N&vurrv}N=|s_EMo>3l*CxSVdHlL&AzCvP)QtuR>OT2s3&5B1)I>2@b)S56$_#l^S1~|3 zCQ+z}ZO_>$g7C-`H0fO>O}AAe>RL&AQ!7^bAERkJN0Glz7VXqwn3FPV3PpW>mJ_Fl zg@5T)U5eJSSM@(woe_*o;H@QxNOMqI`hgqh-lX zt;OxdBBEvUk?W?u*ShwEvF0@G6O9Ka z0K&;tbBe`ScP4IhmfNO@T*deCiUa4SiHfKRK%XcVPZz!Bh0tU@u#x%{poel_Lg{k> zkO9(SFw~^Uq^TlWUNud0h+kK@u26}i0FC*Vm?+;b7QH6_brV?8{<;qpp-zA{a@q`U zA1d-GnrFK2SS*s|@fl*8>P>gaBd>~V6lU>Z=EI5qTG<*48+8HN%t(#qp8uK zYyV&S;dHPE;J8O5g$qQaw9ods0Ml7Dj6bNyG26MP7(0JCn!*(JU0`>lSoC z%Oub@KUh9jbQWL8&2z;Fa`tE^<>^`Gtc8o>0^s-3`BQssxjVAd>Zqus{Tw_m;ZDeS zXTU_>?&uBDdMZKQy3VqCE;$VC=ZR$TjqE*7%qVBaywMqKlV#mdV3YdHy{u_>d=6*_ z_*i~5Ph6oo*Bt2D5c#k9Vs?IzHk;L&7Bk3>EkTh0Kg*#DydKmN)nBh%AQnf>1%gF> zy+C}?X#t)W0hAH&1$+Zpa&&=6mkA{z#T6b)m{y=OR~l_*Gn<$5mt1L@Ar&Yb;5Xwdm{*tzs`WHpyxr5PGD&9hAC$t3OiE|Y-bY0k|X`SBgJmA@mZ>9}9mNrZt zEfq^Wal+B^^2Op(uhTzwzj(>ET~ijqyW!<7aEv_`)@&%Ny1ImJcktHhY$CQ%h2{pu zHYk5xTY1AQ(N@cjmDe8-gJh9av}qC-?4FuL3rHMND@F;~RPH_F8% zWehT8pQU2wq&3taTBI^7^w|WRt6oj%+dXTGY!J?%YPJO)-g)(2_NWkDq6VYFF;ro? zv{#6JR2OY}f6H(!TS!)3VqdZpgqT9eAqa!tH|l0j1O-pY%TL>Q+?D3R6EhP zV_F3!o7g&MO073&`5(*>w>V^IpoZwu0lK3Bw@`Vi>&fSqi<^{Xs!@Wq*+qOfIg=}@ z#PV!-Jv7Qil{&Drv&61bnEV z;wE|_6RT;#W3C*wLX4s;t`*|pmN0a*`Ix23tEj9$`{XcPv@h|6|J+g4RZiOBrPrZ` zcGQl5g-gVx-HG0Q%qP3tQ8lZbC3HH9CDUjTlQPtGl*!eiqnOrkLKlTXxnzwFJek7q z8E1DK1|vF0YqMMR4Mdkak!~TI!aIEcgM69??zjvC?FCcRD>cG?NP zD5@4YRyN#ROA(Pg<`N4#9X!Q;S9jE^3M;MX>I)&9K$Y(yKU^u=3#a^Tr6}MrPib5u z6K@ikhjN?LxTf{&el!!nE_baW|B)w%_sgu+VmB=$oLVii=d7eulG@n336Gok!w}!;0w&ynNUqi8{_=WUdF9C4N&Xn{`CNAEy>x&l6oZyE|dMvU5$ zoph;|vjq2GsBjf_V{d>K+)2r_q$vCRlU(6`mx~R);pMl>#lYxiNv`?@A=h26wUX1; z3b%##+3-au{>vpyov-2g^T>w&<26{Ox5W8-Q%HdkIYJDufuCwJmr9o(wiL0VnKTS>m0I_mN7U$V5&Den;dGRTZU-ad zrN2ZXbjMcFJ!>33%n|w#Iqp``UF?=CZWTS6bI5`>5n;u%uKl#ysv7z6aM8L$2U?3W z`NpxP?Pxz1EXPsM@uK|tRtggxmd$Pxx5uAG(iwo=vi>$&c%3B+Zx`+Jb+ihSru%64 zPL%f0DL-sv0lyntdk@R!%C~M8%UiNv8LswHM1ne}?xwslajj@0tEEVAnf;U9xpz_M zdjRhPumi=xA1Jgtk}kKS&4k%#UOuJM#Rg8_%}tl#Esn{$!|Uh@oq5O~i+AYr>PT_2 zXWhfQImR8)Ww~vQlaEHaBWWKs^>!PwbVin~cw#;HPy`EV@(Vm%a*=6fe(wlwr2#P6VA4JoVh3^$ezS0^mSHr+*4(4DAHidD^o*>huF* zi1uqZw)r;UBFbgH?vrj2)4)+$to%QSmt-m~!gB%5GalX6Pe#F>?M^@}jHb$Q(Q@9Sx$Jd~&O} zk`3(kMp65YC@#ppvSSp|zl)&}Uk6w&?|VwLmUnOSZk>vWkR@HTRt@L2i5U@td8;V# z$rDul9a3W{aKxK!1&k2I$}tMowJ)a8Dyxw0aFWM5h!)X0jzbWUcRwn67C?mhuXq8q zQJl|G<2pA!0c~Qoac7=S=w)pSgm1ahTNCEmhUmw{ml`=c-#_6sDBJ7tFlVfIizd(^I$w6D z4#gs?%=0O>0o*7Q;dSWL0PSu@p$4dP$iu^TVPu?BF*K0_p^4K+=7 z>`ovJ;CYaiAy+*sE>ZM#iol|7!;xpj*+^2i-7ks$QQST4^1@4EVpI*0R+laRc!|ux z;@#q*5$thu?dC9h7ifa8aZ^Pl?Zf6JRPIWLkmTDwrH__l_s~SW1==%I+V_aOVvJbs z$XdEnOD7EqQd@J>=}B44?V}zQHb)RoPu2$!+8Yhu?GbNjKF>FLzvvhB9AtDsEvZs; zWq08U^b^mfJ|6)pG{D~P3&;>U!iuuII_L9t%MXYSk<(Ezr*zJBK$rhplbbf0naO^uV#6V1LTzdI=C;xpOuka)BS zT@J;Trgb?V)dEDwl-Io7G(Up3fHkapP0SaCh*@s;T)V@8L{?Q+Efy_2A#%Do?#um= z)htw)hXh^M+c?pxjoke<1+XR`rl@Z_Iq$G2TFicEqZz(QOHc49)a1A6(B>$R2GEi& zSD_>EJC{>fwc{JYbK})0MI;V&_mvA)YH_mqn23?Dy+I$#xm3EY*Y>pMXzdsjGnRl? zM?H3NuqIC)6+L9(VG$qSgR0QS0h1@YbLBlpMf09KU|<$NK0mL4usg(W2h!Vs(>wCS zQ3}BHl`Y;B-4r((g#t`&^!iI~G=1!80$K>rS>E@is8#wuK`{cy2jsAoT6gfl>S00G zzhMChG`Fa@)rOdTh!&^pXm1)DIJ!u(rbGq6N@x;R>9_ls^>PIG13tUs5u7Sf{nm_n(&)$P%5DYs zyb$V&rG&a1qE7znZJLpdlSkhcxA6S~jZY+)qRIVx(eN5YNSBe1>H!Rd%C1)`d-@$w ztt3?xp}4Z*U2#yvv)>3quCJ0~-WOdJn=qNABPl$vaI3htnkKm~GMIyjk5f92BHW?P z`3;y&L#;WCFt5}wLgfSoDcaHG%H!CVcn6T#gf$(sd?FXE5iMn=TO6aU>}TC#L1arN zfZa_r+Os47W#PF3C{kX2O1vM`Zvwi(I==JzQmR(0ku;6@*by={ z2k5u)6RxvPS7CX)c9Unyb*2Q`X00~yd9?3iAdi;4&xqC~rFiCHg1x%)ppT_>fu7un ziz_PWBYd8dC3+uXqC3^=U6;{EFtHfoIrnCI*X&NG5_z=6|6gZB=Hy{iiT5fYHahGm znNEPI{X97N1|L(5-Z^qJzE!C8ZJ;X2D`Q2SzJyx0xMAcc;t||g>zfM>_*^uPg1V5u zbLRqQBp8s&;U&n-}A^guv_w8cEFo({s1$8E}v3V14v8T#cHv6Gjc10Um7j zM9ev5#+M>9YA-bM8eZ8b{!-Nb?Lc}4OywAJ(*x;JB2@?YHwMxS+50Q6Q@Auje(xq* zcJ)`{<){&+(%%4~g8=#vL51D!PV#sabi+!`(kiPCtLKhK5-oq>K1!MamdIw)-kvX$DHeg@BkyMRHa!a`Tw@kPpM;av)>!sbkmcb_ur(?JHCg2nQ>A1K%n%2X^z z@yh^M`%dABwRY>6adTLH<|=YnOV$V5mFF!&3y{*2^>_DC!uekhGc=jo2V)#aBITOW^X3-KbF-0 zc*D^@MUEysGmmDP_G~eNA{1SU$5!c*5}SiM3JqCoGftwhJb3Z=2S1!vF?i%hj9r-v z;(D0R!A6d{PI9-I86?~+N&)@x8dnVAOlR6L!vd$zWp0%@^!jZ!PkC*swpi`9?Wi`|#(+&cj&Q%?frBYogGxRCO+4pC ztluw2&UVHebl_a7K?>UEj;8e@Q(0M|*#u$Jt~=JXq?X1(zGU(s@*M!!1HeIY(;~46 zI)wzbO&{ZlExjkQI1?{;`Ghw^`4nH3!&ZuR!mvakRbG8_$JJv@ zwqJ{W5F&Yi4#!r|nEzqA_N)zzr(Vbgh!NY(bEGglRF88 zs^bkjEbbtT9dc2IMxoV)Co;6RMS^eiqaGkPwb6RG_7MNKYrNRS#v>_n5ki!wX~Mjw&w zCu%v;o~9+q``T)Ek?VoeMl;)Kv>n7poW4dL&eXC}xNUW4^nQTH*YLsVe&4* z12cOd_gN-@yU7-`k~{8)P!f!(esOzH7BHem0v&eQZ$y{t+iUGoo}!ffX#HbU1ntn0 zqEt(l``T-_dpsv+miCqCz`Wwtg2iOZ(Mgo0s%s5fjq^R}t`7PWsELV%@MyT>{tFTV zgvagYRx=;C_`jAVR~{rm7M@?!bPV&-9SynQ@+Q>nPEenyQc`OaLycFdEK>bBYWy)d zD_i@8h{t)^@=n?h;u&e_tYx`;l+kEqiYXK!LA}El{|yicOTB?A^b-l18?W|bs0O`2 z>7PP6rD1Y@w$@clazi&Qw>S6bG(Qr!N5l1YC(zM;`eYYvW%o^256O?aX&GJEva?G1l+KOAh2?aa zbkX#};-aymXXp>gtQ@W7c;5^+AQHj-%GcE3Zk50y^VF@sLS%m{ugK9(c$9Euca3hx zWi8<%LXDI9%XBDBYZV3h^fY;-w>Fqo$wN05;^t&P^$NfdU#@C ze2gca>v4~vyZ`&*jmb|RH`ImmtS+yEs>4hgz#DQ;AFa9Pvvytzl?8m8(l0iA(?^@3 z@s^OXaQ^O3!@U05717G_9Y%e3%1?%Bor|ymg@zQL0i@kSxP6aj0`3?xtNf(Dk6L-N z3NqKlv)h+7MlW50uitQPSTwy(&dt|ybJ0C%!hM=?C(P+J-7^E_F~J?fWx^(W0J~Zu zpU&61iw7D`^MAuxF?foG73d(a+wa)&#d<;>?s->g7tGM#L(vV=Vn`HX7o zkx14kFG6Nb)G`{Lyi{u);pw8Ejnl4G7g73qv1~M7g_w3y=71YU1G|}i5J*hpK0Gnq zEM)FjZ2g&Se=%Sm(vqlgUjH7!fL|w&-S~oPu9B@MYWu0F6z^)Fb19i(98Wy_S5;XI zJBji}a|p#U4mo>E_st&WPu6-wZva>NVVyNkzBE~j@@%0q_RNcr^KR5q7 zqN!RJah+T>Rdf38!ITjN+V;`dUrN2uN3`nstQ#q)j{RYde1|%4K$+{ZWa(thbMfV7 znOdk}w=u5g&cXHE^-xWwj<;2XUR01L3aK0ZQ^po)-Tvwv505-NO`T6|b0-&?TVa9@ z@$h7f*~e{fdTHe=v=6`q+1*C>ZoTz3)JywvfeB;6e%JVwx|+NT*OJ z+~N7`0;@8br8ZKSE-ueaCy~mj>mgx&Npm?Y#C-(QeC22Iwy1ki1osACWI5KH?SD3# z`s)tJd=Ag{8-~mwN8zvTBsB$O#z>l;^Z&xN6L=VP`0gZ?r{`*(OG$r0kmxRo52<~q zuT*JU#^bQV1!7V_k2KYTyFIfZn`ose5fhKj8nAqFQa(FR>nsk)6Z5puOj3yJP0UjN z*SOCgAPHbMNE#`3Pp59balV$Tl8-Uy-e%n z5r4=asJfRml=weIb4~&T*_>G7yAJTZe4w7X}%o9U2}Hirwr}{nqvFz%Qdw^-fh#`N2X9Sev^A`S_KU_xaCxiSfV|p zF7r)7J0F*SEYZ3T3dKF;O@KglB-9-WdK~5Q^(0wRu4P1~(W^+gwp?2Pf$A%@VISjB;r6gzU3SYu*iYxua*5)=WnX?gPk(wJLagm5yav>jA#Ob-U*X z3}zyFcPI*vz@c1?eEIKX)VVX|>1Ep0T`;0-5B+g~JU9<(u#`71*V>FXN0UNS!-u1p z?W5Vv05h6i;!X!c0b0nj%eBkZp6_%?TkA6-3)H)CAP2QT`0Z1T5?}(@1U1?qL5}+%PJNb~i$Wd#k0eocJUZsuHyu13z zn%;0d$ku=HT#2Q=KRW z?FYC-&Rd~PRJ_blyzH@3ThNfDYcXOpZ{YEF%~)M{<4n*Z&sv(yc;g2i<^qkj=^d+~ z>sDqzlT4?6H#@ar)A{?usogf1&m{Su1mki!@aa>{&<9Nq*Jz!iibxpe2GV+LE16tN z@qNgz@h2WSgP*L2{qPh@3z?>-b*~rr1uz;FR#PeGyFGkM=Ct$WgZ=vW`%fFN8MFTt%$K8n>3??bu5 z^8VFYXIB~W_V?!fD`xcne`LlW6b>*8RSob~#jncb*frWee4XIqHCkytJNOZP4nAb; zZibyW*e2jCv8|?^I8It+3DF6zs3TKTB_FEOa(N{r#FZ$WK}V=DB-HRR6wL*wkXe^` zSIdT~PQ30i?X8KSTN{hkVny807q%{67Sh@~mp{B_z~HJ@rOUt6c?ZCMK^ zpiPak-z4X(*9M7Aa?^Tkj#^;A; z5-i(vAetWu#5XH1ZKuz`+ot5O@CGfD+y8p_gQ{oAq#Lys@k{6iB6Sb$L3!dPt>$lq(enSJFy??lfM-l$9J^VQ%0|s$ zx4hw+jTArkp8H?ES!*A~YF#NeZKeql`{=AH99?8Tm3hGvpF?P@&ox(FftkeI_5rXJyg})u1ya~l?xJXk}9}QI-=(KdVnDM zcxTN&kZ>iy+b{$i%w0h3_Ih4wp65i zF!1^-^yF#JI*%uKk9=;M)~V-^WJ-Pwh!_v`19+N8t)L(}@73hmd2Bis?%T?_3==WKNMg9@19kaFxhITR4#^$gqNyb*&** zxj9v9k*a?Lq?rKoP|?d$->P*_nUCiM01E*wVA7W%4{X)$ig_87X!;nrbeoo)%Z~kg zu$a#QsoR42tUU|X<1+;CN34}6wrTc6wA8y?`JJ5ou$KM5oTN0brR8-TL}%2e$9X^9 zW%!AZz3+ZV^aA|{(Dx$%e?jsmJlTNS83N)N3Z|1Tb=YzrUa|wR6*w%EUy$VwB>apg z-j2$B8QW3)4?qH?2LK1xQc-{vEab^=hT3bzGtN&4$sM~Am*w&o7f3~2G$TcZ@3=Am z?%ep2iq6grYeg7}695qaV#({7d6e8M zS^X)t9Hv)MSqwJGg*!FR)tOarfOCwUKev!acWT4N2Nz5k=?+itX}@4+JE#WCvULE7 z8d}O_yR>vQ9ylY_hSqy_Y0qok0b$`&TGl8&>+~)J@*aS>MWAZMAUmcIBhg=$vMX`yD|!4=?O^Hfe)-EsM<~d#UUOv6U@E0Xq?; z;GIv6)_zbUT}D_@xm^D=q8rJR$PZ)vQCg#xu+-WgpUPT82=_D`drn(LrWx02j>^;1 zpwP_$(xHY_8x^5W@wdcVfaA&Z&+cgDuI8e|Sf7I8Eu_QxXWF6SM7=63|PiF|wTaGQC z_P*eBzmZN3e@Po7K9g6zq>UZ`{Vv!Z5qyv3KcI?1>gmEefKTPGFL^tFOYVA2>nlrk zYhyB7qa8t+u0|$+Z{^Qu(gms|^jAZzC`P{s_#sQB8MQ zEL~pKPFU6hk&hci`-#Gg7_v~Clvr>xw+@g(`J8Da1HZ6L^C9b|;(w|rsfvm{ zpiRsS#pF9t6hL!XeZVW3J5{Em2ek1aIlKj#0NSG6rewCLe6_D=<3i@U2l)Ux2IjlR zPcm&^)lPNtNk%u2HS=KEB0UpuH3hGg@D z$Oq7$@-<@fFn=~bsEWGbkX8_q@~tQe;1V?9pZLX+-m3Cl@|rd!WWI-i2{1A+-^0ka zI%JmZ$O13{Sxn(N=sO~u+Dqtb)7h3Wsm%1&J$ zqjzRo`PLg0&zLU1d_#MzQ`3FvQIHK#B%eQ`c`jgkl%qurkw>*Zw5V%gey@?S|Ir4u zy$a8$nT;~-r(2m5)qEjJ)`+HX>x^eaH;3DKPUsmHCeMv`HcJ9Y8*S+XM3*kn2xrL*&HwwKQ!D z`=ezA9sTg?3EDA*DDqyGTFVrLhh=Le5bxk>?i2ie?FwUvAzVGqVVw+QVF+M zuHQ|61EwtcP4cHtXvy~{+4fWFqZ~DRBx)8oa)ct$vvW`Y9kz*FVy`N#q3Mq*$?6tM z0?YYSuKP^uOH0S~pJ~0A7@7;i7^vCb7u5XV3=yAeUBxf5=jYne80ZL>8r=or`YPbqnuUx zRBT@5N$WlopO3aB1jwD<`oym4gDG~$R!~t~2d!3nN+n143oVyVQgR5rE~%(;ieD%B zu;KMDv}crAEYL&A-%Um90PoAKUwP&4Rvrf}eIzwReXac{qCP^mfAIEiv}KFAyWWMi zGY7cqZ=~@^?d@b$=Rn6qpz!wwPf%v>uC<5pmaRK)p?D4I3Ra2`byu3+`@T~cqL32Z`np_0A0CDodx87Bgi=G+ijPJBMQOrsi ztB>*)=8nV>%2Ib6R(tp=K&QTys&c3DVpS!L)Rpv+Lf$URB4z4vQ4`V32g4qg9lqC^ zcg7SPS6b0!g25z%Lwuh_Yiar3+=M~j{vMi|LZ8l@LdS<-_-4Qa$!pGO?d9#0v{W45 zl7m-^X18BX-@^H^N*gGz{()9_CJhxWT8SMI+o;$_=|AN_-U!$3Kj<&O1pm&WI zq0RfVaPy)%cGGzMjY_O*7u+g7QnI4frmu0@YI;I;&3>?CS7ta^8QE^WIBn@n);;Z}uGieYlnq_hT4=&*M_A?{Y`fwOx+IwLc!$ z{%oWco5k*6Q(M%y(H!4cKsC~bqUhVx;1hj5k}YH${-i}laa_NZ{FREQ zBSjfMYaQvbnEan95IXN?ZK$SqmB!E1*(f?eYyWaLrAKwga}W9X&svB0o_OvBkSo)E zp%=aJoCnYcwPeQgUhRH((O)k8g^cb1x#<_Jg%~IwCj8_;hND$DhE<-5OV zS*`HVPIroj1Sh!`HD$HrZVZ;m=ZP6ZWZrqLQ^%n|iuWKbt*NP2p-V(rRQzUyTzQ@v zFcL4=#~dZ^Jx_$abY5#WPoIG7UN+Uz7fzizTck;N?=61n{54p0o_SWj!Mi}e}!onEtw4mwojl0QWPry2B>T!P8s-3qT1eklJ4boz@o;aJTc6PK~b7<^Bs=Gf@JLwN9;~ zt!Pet5s)I8R60Vejq1r?0CFeO4a9KZay?gS>Q%r?^t|OODxG?@thz`CDOOOD{uNUt-i}z`&t+YQI zSKQ<({;$0KSJJ{&GV@ohSNdw;t^ue6xD4QOx#(9dD}F7WuK;k#8-CR?qt@YhJrXmb z92KkS`Z@X5uUdAVejO#an|bQ0wl3jsE>=}K_3M#<^?5o&OAS!&;da^KH?5`XCY06y z@HN0U02$zSTYxNpE&!7OrUL8-co*Pvfb#%ZFpwPqIsxkJKZmEE z04@UH!(9CJD*n2ERRET{4E&%Xp24wI70yP0Y(6f1sD%d z08j+Lm&nh-6JJ+efhRjaB|r@T-+y~Qo^W-mjyq8KdQknG3y(2y7+M2l0%QSn0vH4^ z7$6^D6u<<4B7oTdO8}Mv)B>ylSPQTL;A(&y0d4`n=}JCrsPDiN9fzZZgQxKL8~~0m z@qr%wZ9L%&f&K*mZ@}iQ%)Dh5`%CpmbkqxYip3K)`sx3tYcobc7zmx6lE3a#4mewzl*qULj@Irr@%S^RlTIt=IUEmk#q-_>PuBWcK eRHM98_odc~6e_>F^FHg3ZSg0LC#8$-n>&;xxEtFViwH-ABi^-ndv3P7m93S#wXL-~!Rx`)|@xrf_^^Y5mVXM}A8KR0uYbdR!)a*wu+c8{@* z;djklW8LFy3~tcW}AfZkyX(YAfa69bIMa@~*aW_e$GJev#|a z-5#5VpF2^*6}Ad@rLEGv%C?H%b#@uYv?h+Ojy%_;?#pbK(aWxmZm!GSYi(=YUYpmw z&bE%Gb?yGE9ap4}W>F%p-SMzgE*ER0-w)Onn%XO`LgKYzs>+QPE zeZB2^_YF2W5dR+Rdf2_wwv(Q{5so3Q zN8FFv9_56guE*Su+a7m6VSB>8%eKqC+qT=i$F_&lhPj?}SKF%HPuZU0-@{2%5Yb-S zUj9A8^|ZUjR>RLDUF}IlJG%GT_VMpgu4mlO+Mad)%l0q#zit0^KWBT+z2COqeZXrw z;67+O=ziYzJZBv3I^=%A_JWAeBAk<#A4Y${pYz2XA|irtH2-Wbar(>t-<0V{^KBW~nXHaSsH9`NGO}xpeQz>;?osw_4IB_~9&Y+@2Aw`cmW)fP*IL|D~Gn?`( z4$1R2aU$E9zw7VUmdZ7+JDrKMTG4=F0+Kn6j2%Pl8^@9=VS*ZJHs^i0jDmd z)Mb>q-s#v8O_kGs>d)rm^kPac37h^Qr!S}U6`bz$hE(toXK+ylH?hCAa-86_Qc5eM zhHIytv$DF29nui-*64a)b5VxIjRFGUxJ1PmDajYWv2^YD9imaw0p?dHs zr>>#YsxYaakp|4F&2-15b;R&F3Foq_BfPaU+P>hbFQ=;4Qq`ft`I1w;l)8>731$CR zoPGtRUrFhqy7V=tUPY-_2kQ1(9pf9vHAMNhj`ak;b6iXCd&dTXKMV?xmWxg+cQlPTdY!-bYy0(&kOV7U8)6>InK*I3D1CHO~GZ<=(+) zIcu|$az=8FhbYIxb(^E~C{Eu=>5l}p2mOygL(!c4C?!9}4TSK8a>Q_s$0^4XoFhb7 zlp~gN?4lgI>p?P(bL^oUPbws-eakje74e**nle094;l?P$6m_uH0219FV&F1={1zT zk87xlW+G|TGp1H4`b{1ranWa~=)V+pA;=|j`oAgtxq6UG;T-!Z$APfOrE>Z~N`GD< z7h?Yi|AvI!p-`Qt_l+DcuqHI-Dh^W>FNQ_3iE|dK;7eDF+O~!2NaM0EQ`uKc^t`p% z-_-FcH`2`U8vomz3%pJRj)bKrozvf-^f!Z)%CA!`h?KX&kkXP%9i>voykTi*#TnkF z4DW<(wl$|8r}Y0&x})|GMs#Ly`n#0=UfA?ZPJf@$y&r_lkVTmL!eHLU@gei2Em!an zRd6CKg4vFfoUfhZWBxbCaf<(K?>No>cHr`7$o@M%Av+z~`#W;-r&RrCVN!EB^>a%7 zA`H_zIlkm3I&-eCDA(7aqa|^u3laDY5!jVvWjP0w(3KLt4MTYzz5mWAPflw&%kh1f z^zM}YgRza%e+-k}lhS`OjwYvND)sz1jC%H_JZEo7Y2szne<9R=b&``(N4$MG{WnVg z-RTIE-jCDIQTq8X4C>FR7bx|QFw7l5IC%dIL%=}CU(DA*T>Nh;{tt;hWQ-*S4(9$B z5vGPAoFc-c3`L#PYc;gsh(xDYPhLkY--@apW@d}xY|)&nu6Y}7=8EB5u}*s!4vjGL z#BrYZ5H1fl*W}Y6Lrzf>H+fRVknxjxZnqy|{#Tk2Z z#&8tOHS_i1e0@1zI0ELG`TB9b{?6TXkn;+g&CE1_GYxd^sgp_A=9_s2ah}1{;Cw#? zwFp>X<{QHKhH}1e1S~Z34I?*`q(7W9hNEDSnQ;W?8|i#14045Lo>81CwYQja89y~?S~!khj;ELQuv9HE3s2yD6FFZvs*22flQ`dG&PPNUi__A3P2qR> z)C&&KG&@vvoo2}b&NWr#GIpn>&!5I`rq@$$nOSZI=b9O&FBcPgDI`G3RYFg*`DwYM z<&21qbB&En_2i`K&Xtu;PsOOR(xoNKs#`ZpjER{}W>%k8-L3UvAx0USGIB)A>Zdbq z6b&{a0pKoUN>-~FgMS($eowF7ko8=om}QJ@=T4tQZ+%ha_KIR(w5QxvQsIkoloVCy z6OAM7T8PQU7wra%p+>u$_F{rDDW|iz-MA#DpyjP7mEyUiq@t*}&}A=OR%u`6)Ssre z_f((Gc~A(W`q~b+#dJ78Z*pUOQI#I2t{2HlqLl$_2Tc?^oYb+hsMoc$044WbyX0AkKfu;i&X#M=;AHp06Q`7x&xs5Hn`ejT%8dz2LmM>0sK)qF z4Pd!_Y@1k$_D6W8Mi|=%b~nzC%^n7HcgE=9lmiN%If z78N-?9%XkF0jun;635OcC7}>H5C|moF{LudD4fz-++tilWwDoKA@a%EgopzMi`Cp0 z?JjdTUHW`(n1~+>_I8IjxIcp_dS8G+0AYofgA@Q-MT_vPrkc*Ji@^Vk1^K#?WsWeW zIh$91mme>@qbQfJfxW1rWK~H;iPJ-d7t9yc*R&dr&)|@*w`|sQ_MiZS%1ZN zea^-hHH;ez=Qi{5+fRT&S`cOd-UV?i#<`j};NijBCklO$E+>uco(jFBT%SV~_+p4; z@@(|EKzAO%!+0H4Qo6Lvmrz0@G;z^wU*QZIqFW~V-$QNu!x(d6o{>DyNkeeOye?`y zDlm4;%M`n-Uz*oOBaZhtlwK_sG!foHB8>VLpG~YC33Aegf1?uR;~Ux)wl2M~u)HLtY;B zA@&74vGj%vK~`2&7VOWx3o~L>@>kWL*q3VFE2*-8U`Y>xd@mE(cnevDVl1(JCUVy1 zy7CAaxnNe)!Ynx}sM!<5WY964Qd(7|hv^Q5oIS$$)Ukpbv#HL@G;y8r#&3rF8>fGXRFPotjU}>+Tb)JQ`C?^gdZUPP8{J6ptPXyJu3=D3qc!qG(3B zv#4ZgNfFC!HhMu2eG`n!N_q`qrx|kgMRPYHhq|<+LcfmMCnvbPoJJZYE4BtnLHc&1 z@pVZTai7s_d3!R$LznkbyKi@wSmq0CVJYb>9-iSln)nAK{oAKHnfl(p;rSyHu_!k6p#yEY&9mV>@B7kYgdls zLCGX4IaD~wL{vdJdQ*s0d`TvA$~aZuj<&cP(mHvB&KS}XeMFE<5`$#&BqjM87Lh$G zGluC|&1q$y#Aw#F6XhNOxW%|c@0-Bpdlvn!YH8%JY$^IwAJ>P73@BATIeH;O=@!tZ zMuv1I9{H5-IvI5W++&nfY;D8|{O&AeA!Bj~qma>~a#uIZzIec`Ww}n{?HK|gooS1a zvZ|SwYjjwZ!FH;N-2I#uU0t}UePkmWHK(kd!&zZ3ap@xrxu%;~XuP~8D~54RF}_n>Z}K=GQ@)FkE^B$_89ZY`wU?$`yY()aiS@7X7K{v0n9YYE*qn~ zj2D#0C>JNcbfg35#reh`@5!(v`#5!ta18^wy`&9gw-l| z?`@3ESI+GR9nDP%6@^9pP~cTWz}KL-%jL zmnn(8t7a?JPh3?XW{#k=ouSU4;wtUCGQB+}9KNWZNOp!<(ZUcp$e4CbhPc}(zh;6t zdo-plik92fYuU2JEG@wh>zns_8I`kge}#GlH%V45A3SCr_M!KFw;nJ18k5&&i|t1F z`c5pkos)M)=j$k~g9zo9LQ*slvLsd8%T+a>Ld~Iq*>r8Y*at{3XGcLWZH*JxwqvUq z-jDailhGVi=EB5>#WSB8_9X>ghIsVs$FoOYzo(& z;{ECyugi#OdJa565Awy^SCP%JFCh!?n(_S2S>Cp&=>otX0Dl7f1<;5W7V)QF+X&*C8PC-0XT$aR}kcbR*nT=^++&y5kZrEP4<>1iPZ-AX~JvigE9Y zM_!AX;b?ulG2qVD zv9CZw`p`rsn^5IY7o;<3!5^2ng#0dlPn1j4`oQ_q#N)AkQ=G9 ze|CpTl0A~N#>N%*ZAxGZ-vn&Zj8^wQ(lJ~GX_QRrTZOW4>*;xm@%{Z~v~H`B@IZg^ zvqnEqI*>gB#*Fp|P`3zVr&2ye0V0mIT`Eee>S&}s&{1?S(jL4bj`T7%a2pe0gA1WIv!B$}x+WTCotTwTJq zDPo#&^{x)4)A8c2*}WNOaFJ?a47o@0+f!6BbcjM_Ib7L>&r)M&65^h2%89spcSACI zr%OZ&0hiY3dPG_)|^>JfwCeY&;0X}Xpm%8iP>odQ9{eS6o&L1}i9 z0F0qeXScQnp}NY^-&p%}Zj6Wcezu3)enhl1UU|AjpsGKgKGCiV&{APv6&o#~>1&DI zr4ImAN({zdHR&zEd~zt!nlCnx2`oHs^w`&=DK{P(`W<4--$ zs3Na`?;Crc8>z?`&17`KoX8mdNR)hJhG=T!?;of27V`8WtufCZja~a6nq*llZWtZc z7ei4qC#_zEGli3=?W!i^T#e>D9OG2kZ#T9d$Y0EZQk^+-I6Dq++n3-MU#0HSQFr)= z^8};-Y&HrGE>tv5(A2Wh>jyvW!lH^&4m^wMA|2BB@cB++n-Oz}T>0uAhvo_IS77-F zfc^x?=?*tcSThpKr2PruoB*)c$fl1?&S0u6#E#;9RTgn?GEKD+^}y1D@x$}6M(W`P z;(nv$;dSkqgW+{32{@XD?)k%M{jI*hTF_(nywqvQ9;!yC-6cvj!vslK;6dnuM>CN>1mzI* zrhOq1I>2Mb_b-{tLbFwu^iT3LjH_NAFAA!Uy!^26LTJADin2nrPON$;WKUCC76f;H zM&=|?!06+Pb*?UQRZ8`XTfa)_AbMi^xB%hXdZ2xeC@t`Zj{xIF*aw8Y_-BDAdS;JK+w)Ib9s&`x4efT z#+$FVk2!<}2g~QCXf2JjBeV!3y&JW3W9E@B3or@GjSr$33hhf+s+YO_+~ZEea|G6D zOOt62WCX?@tGPkO4R7R#myJDdEC{0N=u?v}sya8m*~$9`)nloSvi{-Y4=!rZ)OLFE zrBJt-soP6EOPygCt(bAvSRb|@%wwBRn}8zr8bjZ@U#b5*Wk_y0>e2oZM#?|UjT?`y zACM1ifO_tX4swv#t-A||al9y;t7J?*);ab=2x5ftknTN}J(oLmgRldGMW*H6)<08s zK>PsjqJ>H5$<2%&Z}(U0^p5JXw+}=%VWk2AzL+8`IJ(B_7mShb&Q5p(n7;||vT^^r zZ5zY#`4TEjt`?TB(7!j{e|M=jME@8?i)vPpj^GdL39F4|0E6up1YpL;;#?5E!#P*-g z6pQRHLE_f{-vnhh11CHhW*Un>X<}^pG$EmY!eaWj$ctIeBN;#8@n?Xr-K_MpP6;zn zX$A%K-ugV1<|3y)AAhm1T!T@S zv;gfUGvx>}Tglej5KoV7758)=y~7%;bbKwI z2{*B^xzX!e<^9(a;e@T9?p#KZJGImr#LvbdN&gQ_-2m)1L=jwMZ2zLU@%OiGWj;4l zul#O?h}lQIik4Ac`#zgSxbMHuQfu&RHm!XEiTZJ5t8FW2vDH(kJ82PimD8cr?G@x= zO$!)1eJS1zB0%#1S@UAcA-Y6x(X1 zlxyNqZ#>XXL`ASazT`lAm9#a-73vUMv@><=^}y3NYJSOB%tHxtB3g06tV}JimpFVT zG5niNKJzFLEg-`K6dJkhrC5qmn5fM6P#f#2`}}$fR$pn|O=h&F?SR`}#Ehtc5&Qc9 zalU%Q?@h&mSyTgs>h7ofG!~Xs&>C1#8IeL(*#=5a0j!Pf?(?0e%>f*&5tg>Z!Q<`o_W-->a zcWuEy7Cm>A(;(ptz$XCg5`Ky&RtFv}!VVOV0v~|GXu6y#JqHG>|K0YgSgP3ks3!MZ zu1%0$A$n@NXtMWD^P1O%7%05EsH`uZ_C3?0ZiUn1qupw&%1X%9U>&SAa{%itpI8YY zP*4d0lW-qzwDDJChMd$Y7>k6fX^6TgLv6d%ijk>bt*_Mq$Zp0)w* z{V&e*UcyQT@I}dO`$ThjFiP}SjM=MU!&=SwII&hJ2Wg+&5+nM0d9DZMP+W(NJvYe~ zk-J44dAd&S6fls)Hcuh#A0b-~hflu*EwT+=gC`yW*qu`5PIXn(&U+QHIz_zq?^A?v zlT%|wdh}t+@rx{t6$eQzr#jOWo;>|!3qMx>H|p3=;6fU0*6wC^kS}d+s>>^`aJ%$_ zlvWQ3iT>?(0W$PMsP4Z}kjwp&t&K%OoWI#%GGu83krDkWRT?EXHxRE0qh>*Zm>-qI zg9FJ0DWY zZK`%PCMu81oF%fPxEVGZAk3Foumx(%Flx_*EV1i)HI?P&_V@HO%yYHdK(KcehuqyV1r^sp}C zL_+HEgx1FrYSJ5t(b1-2VogA993w`^ea%FR)*z1Jlv@aIpIFVqs5M!aKQt5l#5CEV zxfq;>KBO}P-vCw?7ZuNu%80W_kIT)?MLX}il#_(RVTbonidk*?32jj%gu@m)w;+|7 z@HPqtgsGoG0ypv@5}3Elab~dPFi;0u5uv}2Jj`Y_O|m+TFUfEF3;93=vz{B|XdN)+ zDbiv!L-IQdezvRlD?*t17u3d-ntRj57I+KfPs!E`wbzKlnXN>-eDHw0fgwN}E&**$ zG{+njvkZefg==c}4pStAgWTLoq(##a|A0IxilDaI>j`&(n>cj>Z2mMA7RZ=wlIVJ>LY z)R>2HfkttQah(TC0!7g)ow6j=Q z^G+L)D~1k1Td^Ubv7k-bKZ9VNt%VEe%7NJ;OWPhTw{Or|$+7}1R(i8VH#JiXzhFf- zGMF615TefpumYpuTqH@eO;&W3~YT%b$+lgW|w*6v8P@ifiJTbo_|8KHu zj>stt=ZgN{;}#<9^JoCz5xFNvOjg1^&%!qQ)EDhV+gZO+j^I9}bHls@5T-lnKT-DD zQl_&(Sfwz}0O)^EhNtDC4q`S$Y@aBm$jFW&O?*(3-cfWFPIltX5qoGS1uIX8Kgs<% zdPaqP=~CtFb7yKxs!@+ec^@z$XDb56MQyPfTaCLX3+jG4%*9mrijk6ac9wUL^xqu%~L$7<{>B9O zyQ)RdC=`o=aRjPb%%T{AJkVB4GqznwmWvmOczLe7xU_X&klYVoAOUNf2Uq*cO+7@m zx13tl2O$gl%;8N?ZL0MIw0v9hl`3B)Q+kWpwDi%YkC@V_clX}x|B?#>7hxf% z`!}YXdJ_VH8mI*AIcCqGkj`S3>4l6`3(9jPWYP>J6khVrJ|ezR-6~|Wz9KuNHDz2M zQle$=?%kCqAEwlvzM^$X7L~f*D#bAmG7qUTj{+ZZ$YGHn+w>EY$j7+iFm>+r{lvEu zVHJIeW%@FEX-O5wO=i*vyc^2H0scMoRCh9+LoL-YegEz++Q-~V?R)IXhe#VB`qvlr zXiL0O_Rlg*>_~*Oe{I1xfScr&0b+#eLT%--nMB1O1B87v@X4nUJj4WsYb3<_bwJes z_sDGnMXsv4L(N+QMdL`Z&+llDZ2d7favIMePN9$5(qF+4wgqVD05G(^7^<44`8wlSj$EgZX1U~HhT!hC zd~g`$5QHrkoK5~qvi)$;Ufe3D3>U4U`w}4!)RYbvx0()iO{gytkeP>{-2mwBFS2-e0x7xa;U@Qb52Ra@NA|S6JXK_d z^6cf}6C57b!f;b9G;asjgJ+OT2crwD^j>J6$4;=6XON5I)G$Z$h^%qM*a4K~<(d)W z#B(Cx+g?9|Mw@vPXvFR&@0%bx&kX4p?CT^3Yfn&L%tynM!JUx+AsuEAFar3Jc3+4A zs>2LYeeul>qK|xHqL|?~G3#cDD~+jp+876m8p^jOiR{S{RFYyz^*Uh5)1BoA;+E2e z*pgMjr*!Iu_2kgWqP03}b5hzTQ>f@ydHrOu=%S9-2;k3?m;b@=4CTxOevpHvh|!AJ zp&&Nb3?!$>SEq=v6Gu{>`nE5IYcYhWqtOn)pRsb=Zmp>-%NJ>?wb9B`7%)-mE)S+@ z&1$~R7ng{MJY|VjVH##8yG{X3QB&%lAxXF?bZ8dCkw*`+kPpr^miwoYs~j(nPZjf( zuM|EcY|+97s8MZc)$25|BGvCNjRpAtSe^ICC#H#IiukdL_}WpM>n;9GY-SJq4Ko8Uca+a`+U{RK7G#v`JW3u&zLvnJK{KVKH8|m?^qW4b!1? z3ju3+hKcFNSJ5E}5v#KdS?b^>n4y5WEk7 zCoycc>h>R`PbUmQM{;VXDr=;@bj64wUI&>>%W$(xcnLkga5UgO#?3g-cjtoVxedvAD<&SDqc)uEilG>*+`Z;MgN+ib4B+slXj+(N1j=z zFQEK-*h%|i^F&U}7ih1qT%1kf{%)RV=ig8%JKMyovx~tX?p$0oR|qGVPOQ2rm-(XY z4tGf@?GE8d3U@uucLv3H6Qw_nYx)T&Ta_dC%%j#8&lf4;TUkC|%v=V6*IgH|IM@Ld z)~m|gt?Kv9=YSUgr)1{^Vy)unoPh7tMt-$G%o!4*&Q{x&kqj|ePSgwVYnlr}qLtP*UcUaK=qEQjMCD?sYEK7fCAWLYLZmuHSEbKx*0>rv1{kBIg>+kG5#%MyM2C*=5PJGnwE17G z!%NFVo0#t4^|F9j1eR7luXkJ9%M+xKT;eqa?b+ zB@!YZa%IIiB-iR9voH`B^u?5y zd1&{Tz6LF{B0OrXaUz24OY-+&zHh)6Q?c4pNC&Z49(C3`sX$d*IkjB06;o?6J)%G; zU#!mADoYpv`|N9gL5a@dI$aL^Dx%AmME4fycK;1V7dfZt1#bYxKpf71IA8?7s}Kv7 zM7+wXmsE9LS@TvU1=zYXmsr?Mz*B6X^~GFLLf1}L=nEm7+M3=;w!TDU3SADl zMC7~J*s3UQN$3R&%;+*irjmr?jP%#e~Ghg>fD#@3K<^>c!+$dR{P zE_^oL&BM2-1h1yB1qxuTKZ9cEM1EUkxlUX@4@ml5C;zx2Us@~L#z@G~F5CQ~HIbTE zOsj8LX#;lrufs|;I0LX5!-^SQs;>FcD~_e)VeU^CT$EJM0avW#(zBC3gTSW+=;9Q* zWXl(~veM3166vqVFK!mOsZ7P2K;cz@*JRcv(LMPBDAs&Y#dc4z{<>VWNxYNv44Q_q zp)q2M9J*O_Qq$S3vUD?f7Jo{)S&UN3dRU&?EIKrv1$_9no24bCe3#JQvc)ab4WFqQ zaEr(mQ{O<9Zvwmpz%3l5Cu$+wTfu|B-q7Si4-fEv6C68wqZnrAdmh5m6iFIiiQz9=#Cy6%E#dy zOn^GZoWg4)UT2|ye~m9{g>#LE&u03fY2P+=eg}%QLy-sY#2SFel-iiXq!f}n$H6{d zoT)dSplj4pQT7NC>q~K$ETbKl&O*OL+fb4(Id#I!F;gbk#uSd2I(1C`Xnm|ncfmV!4y@D_sB5D)gu>5+Jf0N?;vrkZMTO_oLY1Ua7u zY6&W^PB;J1-kKUz&y{|Uv<7Au#KkxXP-3O`7v$zU#bEK0eDhAxbRrxbZEOQBUd zaE*(&_M&=-*_TjOUS6hG;LevdIx8c*Ctn;kX2LG2gW)fu?pI{qU7};kttk65UH}}f zao#07aWM2}(q+LO(L-k6Py4Da)GWGRTq|OFgV0apHxGz(C)APL3#f{6woPuU?I?=_ zuT4>@*RANaQVdom_CkK(){y`&rIz<`L6$ryGQuC`i@K^ivb4SlV;dUTa>{`ynwis`Cg! zSSOyC;nhDO9A-9$z1c3n#!$fg4O#st&DC+DLcbtSJ}SE8Lp1sYyny)mR+HQ;HFPt! z2|$9`#9eegW%nh`pfRohS4UZq@ghhk&pNLWPB|~D8UMKWN+W-!=Wg1!_6b@<-F~NrIa7qUK!Hx)1&VugC=!`m z4t8)4WTa4q-+MDBri~~%i$$$MtF+#l8s7$8!r(+pW+_<@w%#r0J}wgF+1+BK)g?-) zH|*ad>|!WHOL&D?JZ5rJs*Oz*twXVcKZ^3!8kDxmh1H_J*duSR7L!M@2g&HNHu3Rv z?qE?t{=20R;kInboTo&)*j*rDIUm`PE1wdR)jfQEB8_$1PD>AXX@o5z2@n?G#Q~u%&$+2fm4S<15-#aB%0F()vz~ohGz0cf@B?x2MJa9A z<|R_@L9YN$YxCDgx&9!{!qb4yK>7GV(R~I69A9)LUB;!8_JnAwHE49EBGztFQ*%@O zBPiW)#~oPjOWBUpbbnsFgWKw`L%detWN6Gj$m$$cOW!XjM-MT#`2}bQ@&%qn-taM2 zR8zYf=_lpGFN!wg;Jx;um{p$_%NGBC^MNtA-+t=V0GIPhT8lZI6&&3c8o3Bhfv46s5ZU~xXOZzht z>I_2-kRC8*fq8E-$Bg`2HDYD=R|Q>_Cg;8?9<4`-!!e_NB_4!k0V3tJ*ZduHP!#X{ zs(Jo3u|O0c8oARvbIBpXkdO*I7;>69xO)b)v3~Kyo$3Yt{?HAHx2l_wncnjDcSW?^ zc!VOmt>oQD#MCA1Q`VWiTcmVGz2PRd^~WrSgED}o38YoCF{e$FMQ;f6My%mX<3xGS zDy@Nxd{a>9PaeEpJDADA*HI`unt)#&10=|-qqL7`(-D!7(1|M6#~>$9TIuqM@k4yc z<~DAMMe-$MJV?Nkr>%JTpn?^O-}a%mwT}JB%%c=x=^^JF6&)2z>df^mmUOu&OX@!; zH4X>^w3DZgib|#bO zI?iP2lL6|`OgylPXUezUA;ykG9aE59T@PDx{vEMWcqicv+#%YS#s-eAn5-yNL9RlY zOO*y~MrM=8P6k-*OF#gsP<3A`q)7ugYb|?8+yTRAEtUjjOFCWuyL5OxBCKo3=lcNqKy|NBs+;|uC|ANNh>|N$XpL(ge^0z2nt~xZ47t7v z{i}`AKY99qXzZoi81*vRWUn*pFlnUY-aObarreP&8{GqySOZLedpeISJdv}eED!(< zzt+&g{8K{<)x&X#_SE;yfVVHj-!J@w%52It4fK5~x38fky+WTjM!Vg6d?*%1H)EoB zI{}b3H|;+!_?98L@02(=lqYYPit!AFIu}pc1G9Mj9T00eMlaEGEyw6n`SfYBqc_Qu zr^Tv7c8uT-&7=(^i_cJSV3NH048@dp$$e);zxaR?EmL0>>4nOvRFmAcLB6y#bO(HC zy*t!^>99Dbd}&IcP1(vnHTCioGLMwypNJNPi}B3k2>W`!gHV>)IePLXEh#B=1ZKK= zcVeZlq2JvuqR&xc8N@tRXSv(#U#CJ{cFC_k5gFdW)QJDeBDP5ELRs#C)h~GT3XD#c zF#WS%j+Z4;br87!Pp!}d45A`dcM`I8$bEaw`cK7!@F)Tk!Bt;~CZa*j4PS_u*WLH7*!%faUQ2i;}F0v+IA7vN6J@JZODaMutjpySSst(ERQTOf|p3@w9LKpQmS7^`Jk4mh_9h3v!HGKmr>S+ z)E_--DFe+klQWMecX%&3?`_%O58wz z!^6s;1BI2c<3FNZ8ry`>Q9;`O5#7DV!8z6m7X2$A%#wd#V5v2cW-+tSsEvp$`cw9! zNkHMva6&ox8v0d~DH8TAT!~JdE*3$nkdb1`!0U#F`BscJ@1onvZU!;jkpnAo>R=4Z0Y+Z!BDxh% zHy|^>M0shfX71;|A&RdvsyPv>?a&&IhKyDdoxZ3UWAbOxBEqc=w6?Rx(QE2-29@F`1c@WAo61OC^mUEhExk1|y!hgrY(jW}(`u)Hx+$_5OmEng`1mIq@T}ZW@ zTNmN~pZuqpHcQP(9#(S_S=wCNOY_Ed=~~vp?Np2+K|J5E6#Bod7Ng77GB>_t=$1OW zFdIh@AEg|R%I)bI-TGMbW4iVqkvIZsWvaG3)>7;2JwTkL)jF0fs-%naLJ(oyW4=5O zDOi3EYhlQF(;>i)hk!Q-NwQ_D#8X zf|e^EZ>%NDhhs&G{IQj`k-P{TD7wA1Mw>eV6zZ#GQl^%b$_TCj<}Uy|E{9}lErRYN zIuB>c>R;R=nF{U%TYxHe%MYO$yl8IC6hL0B!8r=qVP!q^5J8>5>;=t&Nuq_JOm#9I-$}8mC8cZ_Yv|(rOeiT zCyH?}_ThHg&tk9Kk`qiBEoWJJ7>>uhLxn=aTJZ*;tGpawAKKRvS&C-M`iqqJJ9!{iJ83FoO((5IbQUWP zGa%fks6S8V(6r_;AX#rDQ@U#dXpMbBcP%^SOQK7ES<*e514Ws9yt_uXkRumVCbxqc z!7M2=ivs%TOPo~vJRth*3`E)n2r9zb2J-(bBj(PI{H;GP<6hO!1!8k;%MOEHAP ziZvAP=c$C%(RuL0JXeQj!WV7@S4c-&UZ&RQCgKt|t^ltzuMu)1^8o-#^?w-;Pb`d6 zc;aascOv>aKu^4}_!-~^_iv>^uYs!9nKXbSk}lS0l71@{^d#5Du z*q14a=kg>uB!|nKM|+nTj1GG|mJJBJBynU487A`Qk|H_(^{st@3UY z6s}5Or!H%>ZeNP8;&5qLIDL)0Yp|A=2U|pQ>C>Ed{M@e7&B-MX6h71IBQxQHon0h< z8?1E_+iThk(JG>5Gx^*UH+q7qqB(eoM%)Dw*eu@-%mV#@CGS({QIEiN=eHrlc=^o; zvhbD_W7E(dwFG8VYLfxFqy7Sw@g+>iFQo1?Zu*!RGt{N#Jh-tk@_@(w*sZ93845j! zCkt_wu6YWWg?l1uHf3P)SOR-dh``Kkp{Q|PpcgC%TAdHl~}rLq`y5#?mJ zYEK#z%Q)B^I$w}mCuyByuL4(kVTrZ7{AZFDgNFEe>*$)y$yyV!h^4_JC9I#{yBq>a z&p;-uS2jGc^S}k&iBq+X7dwK( zqYKY8=M!qalmctt3QtrlN0?_;%sWQC{2BD; z@{?&=)2Od0o3Z`E>{j{@C{+(FWz)4zMfXu{`j5zkAVPhY#MY)q{|Wgm8W?G)V9@mW zEV2M>O)`FXDO+aF(Ap|@{j8cp%f&Oa%SBYp$r;+nNbg6;&bBe8cy(9oO5IOyX#azn zJ}<@h@7NIx%(?jsb2^)k*U&WEsoPP_odDb;)JH+9`Rj;{pE)D({yPMP!juqCZf5QG7w@zRO+E90s%50lvMuC5WDs7>#j@mIA zTdv(b4(Ach5&A?_z^*7BSY8zKpe>P46Cb7=mbuo#$4Pm9zLp~n%ghDZD5fW$7SnD5 zTW$u}1i)q^96?r`Dn!x#0zClxLC^5pXVA&KqYJb=rEGtx?GXOM?O!g`201LV%?;J- z^ah{)fbP|v88$NA-QX>0QDjkH0U9&qSD9K%dEX*9y>Q5D&M(q*b0)>3*M7NbvDVcK ztAkH5R645~@Ib$m4ptWXuYj_+aTl1whEIUD~l-(|)i&Gw7qS^a4qKwoAV`$x}%36S7 zN4b!FsBG{m^GP|nh>Y&f|!b^7lr zwZ)2kT`cx()VfA1Yr0R@_GIu5mu@H>mP@BE(K;o}hgx+<9@8NPYclxER8PDO>+qgg zt>t)^pkyyDNrct?>V-vkum4BF`=WAyS!k-azbSrIB>%Hp%L%&LRndeOgs_s1C8;X>^b*c8^gz(7619_~9dupv^C6hU`#tCp6!&p`NNXp4; zS*t-vt|BDyaxHxVbT!O{1vx0o%4!jUs?-SzwoS5iHQ9rcTg%brmHJ1J)2gYqqaE%l6tF^nua%=%S&|zm}zRpME z`S4l2djVzYdb0lyB+IQw==zYQ>$NP?(eQssacp}R*k(;=e}IOBI%Iu?Y`C6gju)O! z5Rb|p*V5$Hv@mh2=Nu5aO$s zBU|e;@U}h?-Ft(U0TCq}Mg=puf*J~pbQROx#OGRH9khl=mO~TBLG6}7x48I_i9V4f z3pQ#^6ENXcSLD7dGjGx={;PnR{(ltE98d_bH$*^fZ}tmlj&kg4Ub&g#>i(1dk8Rd6 zV_5Co^4MmYU9p#+1I#!!$KEb;glA2!AR*w~tFFSVVjlA0D4q!*?7TDh+y$E%p5GF8 zBLXuhUmA?Qf9HCky?ix!)(kO+ATgdC5M+ohHzcip1Zn6tulhL#-JVFbD+!i807 zut@mm1?`)pnaG+fY&gl&O`7)Ju1yb1(^^QmUYZa_*H;3p0|=pxx6)jJgew7#0~Zdo zFCe@<^eTwJhD%E1da0#G7gE}Znk`bBgNvd@{GMKuc&GM2{1A?L=AsHd{G|wk;ynYv z41X3+{{m14FCm0~&c$wX$I=|OIl7j|gv zx(uK}L4Oq)dE`5cCmUfvadqCO$u09Bb~IA$;e7vo?O+e<2qtI1=}Ubc81N3BjuWWm zaMKyfKXzy>)EUc3^1BDLRk_?A%Fy0T6bdo8U}9AZ2vq)4tfe(-qkn{4_$;4pLrc%g z>Ibz>sq^u?0AL}&Im{Q+Wy}t3OWgCIL(@meojbJbJf08C2Xpx(kh)BmkJhtHP2Zvx zcf@5f^C8WZ1XTS?n%~Pi9@4VC+!^-rFK`r5k484^%~9P<9Yv%{Jn4i&R?wfEaF<9-A8u~w z;3~~cs>`WwrPeImsZENe!MOYc%_E+BLc3zd2-J#khcw$VY#hD9VgmV^yTA(`@j**1 zU(=TiMGV@=;G&8)$j!U7{?viZV>O*+@@{QZ>P@KTW&jnElXkl8s$+=5$-UC@HA|^F z9pGkp?{3Y!K(iG7@@3;f>!X@|@iY7f{X#w2kczQ%r~}-NiklgmHblu?d$fjXoYte| zE?U{I`FM}^tmYpE?tMzj8pJ0N--R^Z1F#n0PSQ`Gb}KgMs*|! z64^>=l$xkTEVbv0Ph_p83|ng&J*!X)~E_DujATG2JgUT zHp4G}sdW4ZU#bO?0N$%ps#X1^a66_B@L`=&ne~^-LK48oRw>rb-LF$P^~&e8J(F=W z1I3v6f(ARf1eR;4OK=FEUrYg;&k&%u9Ev{ef5G2T4jR*>cfU4Td?pX?*GBb$GUxA% z3XMo#0R;?E%C&e0@TnYpz_0CVrFdWKDYqTaMh{O1Vj+dDK_P(eh&E4SYR$iwiM|Ti zq~E$J_@5fYu2EIZKB$f9QM>o}Vhal$WkrRBp|xL&+5vu&M-FNo)MW2kRZr*VwGmx6 zAVUaB8}Sa{cd+|<{NgUXQI&iBd2LYGayKC-z+bh?-J~YSEUaaRw3D`V$jB#3$D=gg8tplV`xjMoc7%Z&YRaFyT)FxzvWAYuS3ZSvv^P*oecc9Qf z+59DKSXd5kK_P&az}u3{7S-6(FKJ`LmfMPQ0BvfQ+ZrU9g)eKT+65$|--03rfx0}l zzoHEq(it_~%9+qZ!m{~ZBm;CpW{b`DDs&TG)e17g^@;mX4xpD@{VMG;WZB%O3LSY> z%MVNA11JR04~^Z4UtI11Rc_5|+T^h1b|5Ffu-fHzsB-OIuZO1(qa46El(S^y${~kCWb9{807$Nt6lD}G7cY}(%Q)DKhPSBEj8qJ&Jtc6%J8L@QaFy^_uY=_OT8$5)%dRV>KU;Vxdu`U$*df#=|fCjgH@ za{^{x$5h)FQ(4NVD=Lv|5Gsgks^rZhg*7Iemm5CR`n2H?C-kK%jn1F|xqN5Eh^Z5> zO*fAsu=mK5A8H30L)7^+umlaGa`#7CvkX?XkkR5LFbH6a+;ED%6CqB}9z0f-mx5R{ z?}XO0Hj5gAMRfYdS+Xj?CH+-Y1`g@3;pugN@Qi7NO!YBFKZ1fmT&cyB7L>-l1YLpd ztx=zY!ij)4<)V+ZHtj4nHJ=_pur{auE${zWd)~AQN6}gcTi(GtfM>v#-ijmd1US-_ zm=S+k%Z?Oo+4WN`H-wCnFY4If!Oq%T+~2^Xrh<8%Ip<1)lpSBd}3+siawRkf3EeU73N<)*Shiy zou<7o2=h4RD~T1#)evTPEn87|ByhCkJ($4{H*?qMg$h z(T5MHY8~Kx)lIZ-{N3aOH6+psiKfMT1XFOI9PypDd$K}d#Z-ffN_fnwRegky8s=zn zmqg8iVGPpcmY;b41~wjGJ%D1s8y)$k#gIX#=gt&iRtQO7P5cB01)=2uHLd#yEXCEh;vjzD;x6S*>H#Il@6c z^Rt%er90PP`e=(e+j<)q5eJOW7x>;qbqHqx{iH85(O068T~ENzc-kwyv}9SO?yP&{ zk$I6s8;^sgZK#n0EdcEy@$2A9(NVml7I*YJmXv)wDSO@66DesMtB$9%c`v2=+bP}O zk858oO@kv6z;}V_Nu*|HI^TQnH`>vyZ^2wC3HYF9Z^jy^>)GUT6{t--Xg5#Ysqh$ zn}dqp83|ngx>~7n_wQOC&aA~lx2ys)gKbeaCHoPSQsYThrXNS=pWjf$d5azFaZ`4_Yni6yJ) zsxW;3@?^-x7bsr##yKsa?LfRpFgaLUQBkg9mx#Kkc+OCH;hdI{I}9(_`y7rEP0SJq zuz1LkD5VSQiu4hbBnO|@GQ0tyRMKZuJvtk#2`K1q3d*cc#G6Dq3+yUcl2>lmX&9J9 zuk^{mIq_L+H3iPc>twTKs-QwIS)u~^Q&DOfz;xt^_qXC$qR)_Do!46Snu)~u0J8yd zVXWrhX)eG#fJNwt+$GWdXi)2SfwoyJ0{gO33+WZz*Td8-rf0eSf;PhIOQGB7;Me7u z_hss($d_ckZkC0{eTe4?zR zv;r69rfv10_X%T$hwJs>ks2)!Vx6mH?RmIRFy@CIh?x@GijTUclc0GHEc;+W=$( z^aL0UFaaPRU^c)!00+QI0DPKUUkk7ffIq`*;OQQKZ24`8 z>iA5bjxXo&*W~n{@$?J8d4N9v{sO@FtoRE|{8=JB6+byd$q~oa_{s6Wws`6Q&=+6; zz#xF30Qe#Uf0uy24WN4q@S88IpMxj90=*bdD*)U8@BsNPUA}i##|^MLE>q8Is8eb#E_igcgRD6XK-(19({P2x7dI3tzjv{s8YbN-P1-$|B|9J0HpvNkVoK| z1E3tx2G3D;C7jO$Y2+z`Pr5l$bF2oHcQ$c5(hU$~ZZ=kLa;W>6&eB`Rsjz=SE z{eSQF$mJ>GN12!!*+u+VGaxnc);Rk2&E}EQBkA8Zts-|vW&hM7R^*ExBLIJ5sGb$% GcK;6nYDZ51 diff --git a/inventory/admin.py b/inventory/admin.py index 031cd50a..d19e9480 100644 --- a/inventory/admin.py +++ b/inventory/admin.py @@ -4,7 +4,18 @@ from . import models from django_ledger import models as ledger_models from django_pdf_actions.actions import export_to_pdf_landscape, export_to_pdf_portrait from appointment import models as appointment_models +from import_export.admin import ExportMixin +from import_export.resources import ModelResource +# Define resource class +# class CarSerieResource(ModelResource): +# class Meta: +# model = models.CarSerie +# +# # Integrate into Django Admin +# @admin.register(models.CarSerie) +# class CarSeriesAdmin(ExportMixin, admin.ModelAdmin): +# resource_class = CarSerieResource admin.site.register(models.Dealer) admin.site.register(models.Staff) @@ -29,7 +40,7 @@ admin.site.register(models.CarLocation) admin.site.register(models.CarReservation) admin.site.register(models.Organization) admin.site.register(models.Representative) -admin.site.register(models.CarTrim) +# admin.site.register(models.CarTrim) admin.site.register(models.AdditionalServices) admin.site.register(models.Payment) admin.site.register(models.VatRate) @@ -82,7 +93,7 @@ class CarModelAdmin(admin.ModelAdmin): @admin.register(models.CarSerie) class CarSeriesAdmin(admin.ModelAdmin): list_display = ('name', 'arabic_name', 'id_car_model', ) - search_fields = ('id_car_serie', 'name', 'id_car_model__name', 'id_car_model__id_car_make__name') + search_fields = ('name',) list_filter = ('id_car_model__id_car_make__is_sa_import', 'id_car_model__id_car_make__name',) @@ -90,18 +101,18 @@ class CarSeriesAdmin(admin.ModelAdmin): verbose_name = "Car Series" -# @admin.register(models.CarTrim) -# class CarTrimAdmin(admin.ModelAdmin): -# list_display = ('name', -# 'id_car_serie__name', -# 'id_car_serie__id_car_model__name', -# 'id_car_serie__id_car_model__id_car_make__name') -# search_fields = ('name', 'arabic_name', 'id_car_serie__id_car_model__name') -# list_filter = ('id_car_serie__id_car_model__id_car_make__is_sa_import', -# 'id_car_serie__id_car_model__id_car_make__name') +@admin.register(models.CarTrim) +class CarTrimAdmin(admin.ModelAdmin): + list_display = ('name', + 'id_car_serie__name', + 'id_car_serie__id_car_model__name', + 'id_car_serie__id_car_model__id_car_make__name') + search_fields = ('name', 'arabic_name', 'id_car_serie__id_car_model__name') + list_filter = ('id_car_serie__id_car_model__id_car_make__is_sa_import', + 'id_car_serie__id_car_model__id_car_make__name') -# class Meta: -# verbose_name = "Car Trim" + class Meta: + verbose_name = "Car Trim" @admin.register(models.CarSpecification) diff --git a/inventory/management/commands/serie_translate.py b/inventory/management/commands/serie_translate.py new file mode 100644 index 00000000..8cb887aa --- /dev/null +++ b/inventory/management/commands/serie_translate.py @@ -0,0 +1,69 @@ +from django.core.management.base import BaseCommand +from inventory.models import CarSerie + +TRANSLATIONS = { + "Sedan": "سيدان", + "Coupe": "كوبيه", + "SUV 5 doors": "إس يو في - خمسة أبواب", + "Minivan": "ميني فان", + "Hatchback": "هاتشباك", + "Cabriolet": "سطح قابل للطي", + "Hatchback 5-doors": "هاتشباك - خمسة أبواب", + "Hatchback 5 doors": "هاتشباك - خمسة أبواب", + "Hatchback 3-doors": "هاتشباك - ثلاثة أبواب", + "Crossover": "كروس أوفر", + "Wagon": "واغن", + "SUV": "إس يو في", + "Wagon 5 doors": "واغن - خمسة أبواب", + "Roadster": "رودستر", + "SUV 5-doors": "إس يو في - خمسة أبواب", + "Wagon 5-doors": "واغن - خمسة أبواب", + "Sedan 4-doors": "سيدان - أربعة أبواب", + "Hatchback 3 doors": "هاتشباك - ثلاثة أبواب", + "Van": "فان", + "Pickup Double cabin": "بيك أب - غمارتين", + "Compactvan": "كومباكت فان", + "Pickup": "بيك أب", + "Microvan": "ميكروفان", + "Liftback": "ليفت باك", + "SUV 3-doors": "إس يو في - ثلاثة أبواب", + "Coupe 2-doors": "كوبيه - بابين", + "Pickup Single cabin": "بيك أب - غمارة واحدة", + "Crossover 5-doors": "كروس أوفر - خمسة أبواب", + "Coupe-Hardtop": "كوبيه هاردتوب", + "SUV 3 doors": "إس يو في - ثلاثة أبواب", + "Hardtop": "هاردتوب", + "Sedan 2-doors": "سيدان - بابين", + "Minivan 5-doors": "ميني فان - خمسة أبواب", + "Targa": "تارغا", + "SUV opened": "إس يو في مكشوف", + "Pickup One-and-a-half cabin": "بيك أب - غمارة ونصف", + "Sedan 2 doors": "سيدان - بابين", + "AMG Sedan 4-doors": "أي إم جي سيدان - أربعة أبواب", + "Cabriolet 2-doors": "سطح قابل للطي - بابين", + "Fastback": "فاست باك", + "Sedan-Hardtop": "سيدان هاردتوب", + "Regular Cab pickup 2-doors": "بيك أب كابينة عادية - بابين", + "Grand minivan 5-doors": "ميني فان كبير - خمسة أبواب", + "Sedan Long": "سيدان طويل", + "Speedster": "سبيدستر", +} + + +class Command(BaseCommand): + help = "Translate CarSerie model names into Arabic" + + def handle(self, *args, **kwargs): + updated_count = 0 + for car_serie in CarSerie.objects.all(): + arabic_translation = TRANSLATIONS.get(car_serie.name) + if arabic_translation and car_serie.arabic_name != arabic_translation: + car_serie.arabic_name = arabic_translation + car_serie.save() + updated_count += 1 + self.stdout.write(self.style.SUCCESS(f"Updated: {car_serie.name} -> {arabic_translation}")) + + if updated_count: + self.stdout.write(self.style.SUCCESS(f"Successfully updated {updated_count} entries.")) + else: + self.stdout.write(self.style.WARNING("No updates were made.")) diff --git a/inventory/models.py b/inventory/models.py index e7780b34..cb899255 100644 --- a/inventory/models.py +++ b/inventory/models.py @@ -416,7 +416,7 @@ class Car(models.Model): @property def ready(self): try: - return all([self.colors.exists() ,self.finances,]) + return all([self.colors ,self.finances,]) except Exception as e: return False def get_transfer(self): diff --git a/inventory/tables.py b/inventory/tables.py index e0fcf33a..01288b6d 100644 --- a/inventory/tables.py +++ b/inventory/tables.py @@ -1,10 +1,15 @@ from django.utils.html import format_html from django.conf import settings +from django.utils.timesince import timesince + from . import models from django_tables2.utils import A -import django_tables2 as tables from django import forms +import django_tables2 as tables +from django.utils.translation import gettext_lazy as _ +from .models import Car, CarFinance, ExteriorColors, InteriorColors, CarColors +from .utils import get_local_name @@ -13,88 +18,50 @@ class ImageColumn(tables.Column): return format_html('', settings.MEDIA_URL, value) -class CustomerTable(tables.Table): - class Meta: - model = models.Customer - first_name = tables.Column() - - -import django_tables2 as tables -from django.utils.translation import gettext_lazy as _ -from .models import Car, CarFinance, ExteriorColors, InteriorColors, CarColors - class CarTable(tables.Table): - # Car fields - vin = tables.Column(verbose_name=_("VIN")) - dealer = tables.Column(verbose_name=_("Dealer")) - vendor = tables.Column(verbose_name=_("Vendor")) + stock_type = tables.Column(verbose_name=_("Stock Type")) + vin = tables.LinkColumn("car_detail", args=[tables.A("pk")], verbose_name=_("VIN"), attrs={"td": {"class": "fw-bold"}, "span": {"class": "fas fa-bars"}}) id_car_make = tables.Column(verbose_name=_("Make")) id_car_model = tables.Column(verbose_name=_("Model")) year = tables.Column(verbose_name=_("Year")) id_car_serie = tables.Column(verbose_name=_("Series")) id_car_trim = tables.Column(verbose_name=_("Trim")) - status = tables.Column(verbose_name=_("Status")) - stock_type = tables.Column(verbose_name=_("Stock Type")) - remarks = tables.Column(verbose_name=_("Remarks")) mileage = tables.Column(verbose_name=_("Mileage")) - receiving_date = tables.Column(verbose_name=_("Receiving Date")) - hash = tables.Column(verbose_name=_("Hash")) - - # CarFinance fields - cost_price = tables.Column(accessor="finances.cost_price", verbose_name=_("Cost Price")) - selling_price = tables.Column(accessor="finances.selling_price", verbose_name=_("Selling Price")) - discount_amount = tables.Column(accessor="finances.discount_amount", verbose_name=_("Discount Amount")) - - # ExteriorColors fields (accessed through CarColors) + selling_price = tables.Column(accessor="finances.selling_price", verbose_name=_("Price")) exterior_color = tables.Column(accessor="colors.exterior.name", verbose_name=_("Exterior Color")) - exterior_color_rgb = tables.Column(accessor="colors.exterior.rgb", verbose_name=_("Exterior Color RGB")) - - # InteriorColors fields (accessed through CarColors) interior_color = tables.Column(accessor="colors.interior.name", verbose_name=_("Interior Color")) - interior_color_rgb = tables.Column(accessor="colors.interior.rgb", verbose_name=_("Interior Color RGB")) + receiving_date = tables.Column(verbose_name=_("Age")) + status = tables.Column(verbose_name=_("Status")) class Meta: model = Car - template_name = "django_tables2/bootstrap.html" + template_name = settings.DJANGO_TABLES2_TEMPLATE + export_formats = ["xlsx", ] fields = ( + "stock_type", "vin", - "dealer", - "vendor", "id_car_make", "id_car_model", "year", "id_car_serie", "id_car_trim", - "status", - "stock_type", - "remarks", "mileage", - "receiving_date", - "hash", - "cost_price", "selling_price", - "discount_amount", "exterior_color", - "exterior_color_rgb", "interior_color", - "interior_color_rgb", + "receiving_date", + "status", ) - attrs = {"class": "table table-striped table-bordered"} - - def render_dealer(self, value): - return str(value) - - def render_vendor(self, value): - return str(value) + attrs = {"class": "table table-hover fs-9 mb-0"} def render_id_car_make(self, value): - return str(value) + return get_local_name(value) def render_id_car_model(self, value): - return str(value) + return get_local_name(value) def render_id_car_serie(self, value): - return str(value) + return get_local_name(value) def render_id_car_trim(self, value): return str(value) @@ -103,4 +70,7 @@ class CarTable(tables.Table): return str(value) def render_interior_color(self, value): - return str(value) \ No newline at end of file + return str(value) + + def render_receiving_date(self, value): + return timesince(value) if value else "-" \ No newline at end of file diff --git a/inventory/urls.py b/inventory/urls.py index 49abe150..25b5f6fa 100644 --- a/inventory/urls.py +++ b/inventory/urls.py @@ -1,7 +1,9 @@ from django.urls import path +from django_tables2.export.export import TableExport + from . import views from allauth.account import views as allauth_views -from django_tables2.export.views import TableExport + urlpatterns = [ @@ -46,8 +48,8 @@ urlpatterns = [ "dashboards/accounting/", views.AccountingDashboard.as_view(), name="accounting" ), path("test/", views.TestView.as_view(), name="test"), - path('cars/inventory/table/', views.car_list, name="car_table"), - path('export//', TableExport, name='export'), + path('cars/inventory/table/', views.CarListViewTable.as_view(), name="car_table"), + path("export/format/", TableExport, name="export"), # Dealer URLs path("dealers//", views.DealerDetailView.as_view(), name="dealer_detail"), path( diff --git a/inventory/utils.py b/inventory/utils.py index 7ca94675..b95de92b 100644 --- a/inventory/utils.py +++ b/inventory/utils.py @@ -25,6 +25,7 @@ from django_ledger.models import ( ItemTransactionModel ) from decimal import Decimal +from django.utils.translation import get_language @@ -838,4 +839,13 @@ def get_item_transactions(txs): if bool(data): transactions.append(data) print(data) - return transactions \ No newline at end of file + return transactions + + +def get_local_name(self): + """ + Returns the localized name based on the current language. + """ + if get_language() == 'ar': + return getattr(self, 'arabic_name', None) + return getattr(self, 'name', None) \ No newline at end of file diff --git a/inventory/views.py b/inventory/views.py index f86dba16..18ec36f6 100644 --- a/inventory/views.py +++ b/inventory/views.py @@ -3,7 +3,8 @@ from appointment.models import Appointment,AppointmentRequest,Service,StaffMembe from datetime import timedelta from calendar import month_name from random import randint -from django_tables2 import RequestConfig +from django_tables2 import SingleTableView +from django_tables2.export.views import ExportMixin from django_pdf_actions.actions import export_to_pdf_landscape from reportlab.lib.pagesizes import landscape, A4 from rich import print @@ -4387,11 +4388,14 @@ def apply_search_filters(queryset, query): return queryset.filter(search_filters).distinct() -def car_list(request): - dealer = get_user_type(request) - queryset = models.Car.objects.select_related( - "finances", "colors__exterior", "colors__interior" - ).filter(dealer=dealer) - table = tables.CarTable(queryset) - RequestConfig(request).configure(table) - return render(request, 'inventory/car_list_table.html', {'table': table}) \ No newline at end of file +class CarListViewTable(ExportMixin, LoginRequiredMixin, SingleTableView): + model = models.Car + table_class = tables.CarTable + template_name = "inventory/car_list_table.html" + + def get_queryset(self): + dealer = get_user_type(self.request) + return models.Car.objects.select_related( + "finances", "colors__exterior", "colors__interior" + ).filter(dealer=dealer) + diff --git a/requirements.txt b/requirements.txt index ad22e107..95b500d6 100644 --- a/requirements.txt +++ b/requirements.txt @@ -35,6 +35,7 @@ Cython==3.1.0a1 decorator==5.1.1 defusedxml==0.7.1 desert==2020.11.18 +diff-match-patch==20241021 dill==0.3.9 distro==1.9.0 dj-rest-auth==7.0.1 @@ -52,6 +53,7 @@ django-debug-toolbar==5.0.1 django-extensions==3.2.3 django-filter==25.1 django-formtools==2.5.1 +django-import-export==4.3.5 django-ledger==0.7.4.1 django-model-utils==5.0.0 django-money==3.5.3 @@ -133,7 +135,7 @@ networkx==3.4.2 newrelic==10.6.0 nltk==3.9.1 num2words==0.5.14 -libquadmath==2.2.3 +numpy==2.2.3 oauthlib==3.2.2 ofxtools==0.9.5 openai==1.63.1 @@ -176,6 +178,7 @@ pyobjc-framework-Cocoa==11.0 pyobjc-framework-Quartz==11.0 pyparsing==3.2.1 pypdf==5.3.0 +PyPDF2==3.0.1 pyperclip==1.9.0 pyphen==0.17.2 pypng==0.20220715.0 @@ -208,8 +211,8 @@ rich==13.9.4 rubicon-objc==0.5.0 sacremoses==0.1.1 scikit-image==0.25.1 -libomp runtime library==1.6.1 -libquadmath==1.15.2 +scikit-learn==1.6.1 +scipy==1.15.2 selenium==4.28.1 sentencepiece==0.2.0 shapely==2.0.7 diff --git a/static/images/icons/excel.png b/static/images/icons/excel.png new file mode 100644 index 0000000000000000000000000000000000000000..48fab56d9ff33fe2b3814d5a04f937265321ec53 GIT binary patch literal 9974 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 literal 0 HcmV?d00001 diff --git a/templates/inventory/car_detail.html b/templates/inventory/car_detail.html index 8e089c74..28720d3e 100644 --- a/templates/inventory/car_detail.html +++ b/templates/inventory/car_detail.html @@ -244,27 +244,27 @@

- {% if car.colors.exists %} - {% for color in car.colors.all %} + {% if car.colors %} + - {% endfor %} + {% else %} - {% if car.colors.exists %} + {% if car.colors %} {% else %} diff --git a/templates/inventory/car_list_table.html b/templates/inventory/car_list_table.html index 6fd3d636..b5d3ae91 100644 --- a/templates/inventory/car_list_table.html +++ b/templates/inventory/car_list_table.html @@ -1,15 +1,26 @@ {% extends 'base.html' %} -{% load static i18n django_tables2%} +{% load static i18n django_tables2 %} +{% load export_url from django_tables2 %} {% block content %} +
+
+
+ + + +
+
+
+
+
+ {% render_table table %} +
+
+
+
-{% load export_url from django_tables2 %} - -{% render_table table %} - -Export to Excel -Export to PDF {% endblock %} \ No newline at end of file diff --git a/templates/partials/pagination.html b/templates/partials/pagination.html index 669eb5e4..67cebdf1 100644 --- a/templates/partials/pagination.html +++ b/templates/partials/pagination.html @@ -4,11 +4,11 @@
{% if page_obj.has_previous %} {% else %} {% endif %} @@ -28,11 +28,11 @@ {% if page_obj.has_next %} {% else %} {% endif %}
{% trans 'Exterior' %} - {{ color.exterior.get_local_name }} + {{ car.colors.exterior.get_local_name }} -
+
{% trans 'Interior' %} - {{ color.interior.get_local_name }} + {{ car.colors.interior.get_local_name }} -
+
diff --git a/templates/inventory/car_inventory.html b/templates/inventory/car_inventory.html index a8bdd2fa..babf7979 100644 --- a/templates/inventory/car_inventory.html +++ b/templates/inventory/car_inventory.html @@ -72,15 +72,15 @@ {{ car.vin }} {{ car.year }}
- {{ car.colors.first.exterior.get_local_name }} + {{ car.colors.exterior.get_local_name }}
- {{ car.colors.first.interior.get_local_name }} + {{ car.colors.interior.get_local_name }}