From 3debacab4f4c5efc6b0068bbf178c16ec71de469 Mon Sep 17 00:00:00 2001 From: Andras Schmelczer Date: Sun, 10 May 2026 14:55:43 +0100 Subject: [PATCH] Rust things --- .../poi-icons/logos/the_food_warehouse.png | Bin 5423 -> 10000 bytes frontend/public/video/poster.jpg | Bin 166062 -> 321894 bytes server-rs/src/aggregation.rs | 65 +- server-rs/src/checkout_sessions.rs | 807 ++++++++++++++++++ server-rs/src/data/places.rs | 49 +- server-rs/src/data/poi.rs | 213 ++++- server-rs/src/data/postcodes.rs | 45 +- server-rs/src/data/property.rs | 324 ++++++- server-rs/src/data/travel_time.rs | 27 +- server-rs/src/features.rs | 375 +++++--- server-rs/src/main.rs | 2 + server-rs/src/parsing.rs | 7 +- server-rs/src/parsing/fields.rs | 74 ++ server-rs/src/parsing/filters.rs | 152 +++- server-rs/src/pocketbase.rs | 399 ++++++++- server-rs/src/pocketbase_locks.rs | 264 ++++++ server-rs/src/routes/checkout.rs | 154 +--- server-rs/src/routes/export.rs | 148 +++- server-rs/src/routes/features.rs | 78 +- server-rs/src/routes/filter_counts.rs | 38 +- server-rs/src/routes/hexagon_stats.rs | 26 +- server-rs/src/routes/hexagons.rs | 101 ++- server-rs/src/routes/invites.rs | 125 ++- server-rs/src/routes/pois.rs | 17 +- server-rs/src/routes/postcode_properties.rs | 16 +- server-rs/src/routes/postcode_stats.rs | 26 +- server-rs/src/routes/postcodes.rs | 77 +- server-rs/src/routes/properties.rs | 24 +- server-rs/src/routes/stats.rs | 79 +- server-rs/src/routes/stripe_webhook.rs | 192 ++--- 30 files changed, 3257 insertions(+), 647 deletions(-) create mode 100644 server-rs/src/checkout_sessions.rs create mode 100644 server-rs/src/pocketbase_locks.rs diff --git a/frontend/public/assets/poi-icons/logos/the_food_warehouse.png b/frontend/public/assets/poi-icons/logos/the_food_warehouse.png index 0fb14a24ba689aa5229bc106ec252be8ea52132c..9d16347d34ed04d59499f8839a9bf0dfabb517e8 100644 GIT binary patch literal 10000 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 Z^nbXyjXp%xC^rBA002ovPDHLkV1hZ?1{nYV diff --git a/frontend/public/video/poster.jpg b/frontend/public/video/poster.jpg index 88dc2b570208622eb78fbe546412635a85af15ab..ea74d31c570e658eab63746af37aac33f7c631eb 100644 GIT binary patch literal 321894 zcmeEtgq= z-1T|h-+kYE|Al*JKi}Q&&YU@OYG%&NoVojbw+eWyuB@gExOX1_xQF=w?rs5(U%c|M z5fkJSl;jf>5Cq&U02BZZu>U5Ue-iHhOn7*B4<0- zKE}nvBK(^TAR%SK5q!o>hO6T)^ol%@;sYMb^L*W}<3Ce8k|wQ%Swln~=q0aB)p;ox zoKWdgiYgW$CTiKbI&G9fJ;MsSZQ<)_^+rD74IHUO?58Av`!NJDG#UcFL zGzm5-li)Kl9h_Ip?n2~=AD-ub)n)l8G1?)}c4{DaF*T zqazb)LkvEpLw$jd=j_q|2em^0p4zUL_(P`Y60Cu^zT%a}JmG03m<*o%iJwnuM-IN+ zAL9AXv-`4^(!^e+>cbRI?Jyl~s8Qp5w^a}?>cD_D{LHBU|NSTWV;2P;j?UHXo#Z@X zG|ROZbxEJfEt!?k^U!ZK<1S&&0mPO=4LYC~@ZD^={Tp6;wlm0@==qn@g7`d>Vig0c zf`wvY|G{zo(>p-e3`IH$q7giD{=Br{_O%Pqhq96-&(iCeR&qw3bes4BHw@iSm~+CiRT=2EaG;^ zl0XSQx8ZT7F0ZlcHrJZ_nD9Klq22y!O|PD~VBZ52!uy`?_r4A=ip$$r@{fsKKTew4 z&YLfOk9cZ3I!x@+9`MwTb_U5G-W0yXNyCDs8Q-(}?}z3u)c-RNPTC{DuR7eHZvbzw zr074lo7C%SHp;7g*Qh;fRCxgj?o4NMAw*nhW|>vr0n~1?zZMbJ-aEU=_Ol8P1?@r< z&a!8s%6v=Uw zdpx(+CXa?+i#z5Ww(h<#=Iyap2HpY2Z?YAPT!WLZ#YF}M{bM~}+IF!10T#{Q8+&!7 z<=R=oZ>nO|*fC(HfX2XxIl1qjWq%F7mL>{V4#9fq%I%c!2e?LOYW3?5@L;Ji9*fQE z8f^8x6&50TuL)dlER%}nIJ*N>LhNTE$H1emGvQxgF<5LC{JVDmlS-x=;t7cTAvQzd zoKre5IbP#$$qpn81D%F@jA>R4Rm!q4)8AhA{uEytA>p#7?cRct1cE@P>zFqk`9{_HjHqM8n zAL)e+TR+3oUe3KFHfq8Y*n|6a#VY4J`p<#!7)C}^;20!d9zFd{Ljb>>ycRnL>S4On zytK*7T3HXsn}l}^?e;%;D%xZCPk!gl29%aSs|#qIy@b?+!;}~*1BlX(T7PUr6M@Lf zDxyJywfEdeMEi(cQ?NgL-Sce;(gK^Dj{pk{KUa;;!R-W1Qtkj>Z5B_y!5BPhUnomO zCIf=R6I6F50&@B{-UaPnb?SA_8+FE%C|k#<0`C>Y*Iq(jo`UHH3S}N}IX`7pjlQq? zj#BaL=CIWkDFT5X63!k>IoXv)9De;esJlH<`e0oS4aGAHPKG>eKQ>9bVZSo_<7Pl^ zAR;QPH%1e?o>0NXP}mTp|A&sm+jxf9Tb)c@JH>&970!vI%-YLM_$XJ3k&z>D)D`$( zu|VWdLZ0riA_~7Fb?)2wnHXndEw=H^1x9Sc!Pgi#Pp5bf@yS_+T&&%Lru-n@!+vj* zC%cpK80%LINX8i5TGb{TU_7Hh5RDmO{j6(;c#Ts9%x9W1^G?H+8_M;k z{ZMvq=LM>2t4O3u=H9JCW;8ztQGYMrD2q%sF{;P8liR~*h{I!iFo&#}@wdN&+sm5Sci z9PpTaq@iA)nkX_tUWemv0}6csI*yPgrR@5yXITwd8;LS)04r#?Cp%w=n~qwVEzbx; z1ILOG!4|85vty|Ekj>y@za!d^R9Hd&X4#HhmD5U(3q<2BJMT(r9TW~KDH?Rs#%tThyv#)iZ~ zDc2@$2e_(i=p{#ZXBC)44`|BDz~%!LQm5%`x$%07zO0@EIZU3_wpD8MLF4#RFSDl~ zt6TEI#QSvE*b(g{epZQFsFm-Q;IOS`e0gX=MII7INrv8ymsD-_n+A_gebQ5{2EizU z6E-_Lbl$T*aMtzbqEq;^!m$6!5ZbdcB?geL3d^Ety~p;nC?JtXs=V|jUN9qScxC!mN6_KmL+*9xCAMeqSebqL{>nrhU6%KCO7!np%XVuCQb!`S;_d(zGg=?j`<;>th8(OX z2Kq$zm>T&Jv;kkXzR7TOtpT51uN2d}VSzW7fl2F*OaXjy_-;JK%=ovKYLe7}T!sZt zAIb^D8Q6S(b-rCU*muFgJQK$V5q*n5MHoYkn^TSaX0f!@oS(4@DkYxrD4i8jJa1+T z+Vw|?z8Ok|iHT?n67VlGM6uWwCBzLcNH3r`nxWSZ3tSvXsnI)wzZstD?7 zm?&JN>uhF;#hM0#zblt^UKP#S_Y5&k+gPb~jHO-&nZ@;Z?pzwQn!Pw=;%CW$; z{w^Qu+RN9}JZ9e06RUDZ=(1(6Q#9e$5ng6q8KXe#lOS)>EJCLxyZh5DIw;3w{7 zEV%cN{e6$=h61Be?L%!ZH}=-xE#Ky&%3Jg_*9WgUnMD=Je|0B*XMNibrI4!jN!4FR z?<;KF0oeUZ2O9#7G8~Z16GlB21G{hsI6MRt@NropPpz(eL!U=I>05^+ovqXzfNVc2 zy}V%mO@V9fPG=T(s+c@6pX&k>YnFefv6NLHRO|F2y~TOHO*%C%w$+)_>_e=(j0&(znrB6XBrE${upg#sJSD7#WRTC`d-k8e|*?!Q%;YsuzrfZ zby5jGO#xJ!_IWccSAJ^0gtXI2armzW(mMdY6>bBu{+XWDR2ZyL{NS22>~&7dab&L8 zNf3MdP#`$RKVI;ydFj$Q2VUQJR&(>MWmcvmb|-BzzP<{_kfPZWs@auK?<$ErA(E#} zOYc0PW)NWy`Vo$MT@MM!C#OoIL|;eI3a^$F6GX2S@~Km%(mQpG%p!f4i8D~aZdoUR zKZgc-3}#Omu^;K^(Yq-+vkG<(NbQ|OlYA_m$s?d>8^hUxu%qIS_Hqa5FIWsVub^U$ zrhBy0B>}(LW_gVwma#z|I?fIK`9N;evl*T1)sR$hTOc;X$}zoy4M>RYeF;gZy!bw3w&u$x4F>|o|XJW@Q0Ck|%b ze!}?jx@9%+2Y3Jnc}$|ykJx3Ia<9=~6OThA(c(L?TANxfGXBVHo6Tyy*qCodr*8%W zvnopAerj0yo)s#fQT8}Off2CQNo8qgGW*j3#=I-#w{FG5L2D?}!oi$#4$-Y1WR;x- z-Ouhqf2T4KCx;{3rx!J=Fk&K=xVHyA@RK-E2TJz?@tX5LXP#=KLR%Uq7u*~)i-ix( znlxSBE>LCm3=&D0jJ`0snMbkR9!Mx#`bOp_OxKBL+J}I5hY$5}C>h;BmjSIpS0CkY z1t-w$X>xmel5Tv&LZ|3<;N}tA99k;6d9%#FzW>!UImr-RMrLaLcAI*WuQK(y->BPw zoXvFw99=x>Ic-j;L>PF^v)`+4SOlA#YMyW^4Bk}_eLqhv6?;tYkkJ~o<@ViKo)fuP z48}6(0khVpGAB9r!=Cx0MNTqiP5ft!xv86Ia&hM{5kT`zb zigZXuM{W_>ge9jYr>^=3s4`_IsykUv3U&634aO6_y8lCQhuHrP!1>8`IUfmJx=3h^ z96QMo7uVZjRLNFz${Qi5|1$CPBx8J~&w_2*($HF9J_GRH?UmtGWW{V*bOpjQ!mGBL zbi7CTs#wMXE{`imKIN~oWTufL7bzZh4XvW5Am$!GF3LZY=b#E^gF-`}xzA_2 zPtD)I+-e=U@ZYWh`8#?nj`)(9{nX2FC$mx zLO}=q*8D$$sfNw6s=IGlvS);{`5Jp`-j^S1-$w7C{8jG&U zNic=(fkL!BnN|Zq?JeVAMdEj^4mp9Qchu($KcFp(?}#qWk5rC@-W$!%KD#J3W8kw4 za24VQDIwoh;BoCaO*&^w^*Qujk0=7`YxqDIZ!bkfcda){;cAqP9D6;J$2enwxbQ=YC1;A19o= z?uWuSFO^jVn@-$iyTzsIscP16iKv%ZY}uyVtbK#MjmEuT%qR&2w|_R}ntp@|er zFh+LOwdChzPS&MRrzeD&(;|)d?W|LXTTA+4U#^aE0}UmLK>8OAw;XJ;tb;X#iqAQ- zvJr*0X`H6+g0UaQo5u>{kEKIO;T0_L2}sk)fz9Z6{;tj66kL~#&7umcM~NeD zQTnECJ;f0UaFNYr5uGk@w+ekAka+mUjDweWMwEn+IjthODuRPI zB@UdK+mU3v0s8bZtgmE1?l?CM9tc}>v7!N647=-n(>6S{q%h(#&8cCdj27`2FOP$Q z{ARnI{p?=KSrn&cSQsFU7&t!LY`u{ASZu||Pf3#SP!o)P;-_#K3<{+hwN|ozD!}m4 zHeBqoMij;VxiwX%KPU)!YZet%T2frBuD%_UR$W~hHYDn0K%TP40cJGbbtY(e0&>EM zQ(xUWX;aulLB+C~df*bjVcS{BpXg&%28V_WI`)$F#(Q_0Kh{zW#B8+qt3T%$W@7o$oh$FhaUn1R7P}Sn0 zR-*jk8b&{7ji!422AxemqD)P{ZB;pLI8?u%s2yXCTK||sz0ev~hC4#F?9C2CSvC#l zFlhQ_`11u9O90bD_f?(Y&+COfUR$UcY1OlVC?#2<8y-*9eKdJ*78n{Wu_(W^EjZ9M z_`|@8s*8izQexQv1d+GggIP*t(YpeaP_*KEB;IOW3;fYe7k* zl~m_fS6hnui^V4-Ww;{;G|gxy)}UeuD$G6WtXCer0`D76(QDgUENLZ3(`SULR|_MF z{?REK_&6t|MCO65SM1iHP{XGT`u*P;K3gnZLCuk+Njs89R3oY5$btS}2y*nBDG~h? z3i635J%r7txNlPF8|9ze2h>&v*r?y9=17=~6!Eb7Ire!|C(J!nV=S$j*%VwO8aWy^ zr4$f8Dg!?4nc0-jqVAh>wlUASw)x{?_N?Xd@NHk{r1s5<+K4vliTgPi+4iz{Ybz1t zz@7-E;n|T9jTTE2Ks?8~u)X*78|VGKnx$D@aklPBJtG8#&S`@~d}&27EUhFBbduku z?Ek7HNa$h>02AS1BTA~}u03lemUEX;v{Y3qZ=sSQ6wh=5{Z;}7Yni~%z;r_G@Jvc? z#4`|ii1>bB07Rr%KDn*Ls9b#qJ%A@kzT-{{(iLIFyO`0wQvVw7{u%jplkevTcSe(q z*BOTWDTgZHVfP%xFB+^n=b{D^>evs?PKHYFKg1q>o)p=<|092&x#KzQ*j#T zMj{K$Xt5M5W6Ms=45U@`XUU6=CqEsKCP(8(3RWoFINh(KFxrB&GLmI%N=TMDRg^oW zr)3Yz?5R_HYHfH?U*hB>^8MixGb6pvG;|cy6g0(waFrKN5KI;6X{BXx z_=%BrrYcE1^|p=o+NhHKqh0Z`qQAi;1F3gf0^B-I&izu+E}G=VCTyRa5FCcVCr4PN z9IxMHKdavz+E9qNxdR^R-y71MynnY+Hu^t7LWavDfnl0pQb0w#YXX`{meK&1K0h`v}N z;?FFG`?U*bOKHJV;ap{ff-vz=*1$dn!|tQ@h;iNa=f@SQk3v*;{oTg&m#s=qo6by1 z(xb|ebovSUJoT+T!a9O~A;n2SX)t*eh{C|5I=SXSZ$wb@%r zm4`*J!k#CFnRJ8K)aV8nm7^G}9t8m}+dma;Hk+(%1&$2<`sJAe;Si-TqEk}>hAIym zAgBcOL7>hxZOUlDv@U?_4`7Z{+2xp|P9KGWIB!2<`i#_%#81`nHOvkuL^GhNGm`QE z7+5Y#*uYN2y4_FMhX{7cPE3w1t6aa#VAyeb9ctk2oqXy=zWJIYON6bQ11jGs)I;+| z6)}=$C7gL`XNA{C3v1Jeq)@G|9qJC846*|=7}Ap32vqVMlc=mR>xvF=_A4)A57tdjNCRfXwSlv=f2FArIPO)HDmeGYq$5?ZbT(n5 zVy2_7b29UbLStl_hJ+*19MbC|x&#F7oc85Z$h7nZ9-2GW-~YTPGNOHKqK17%JkyDMsq8fUBHFe@;8`Gb0@yw1MK{nL4zsmtjhxwt*|riPAkQ>6_GfZ^9*- z(X-of(ixV~G)TrN` z-hbng6XySs)A@3TtuoUA3T@2ZV#(+slsP0VK}Zdi7<#j_`t?@qBjx?+3B8Fk%F88* z1^aWFXijt79?6Jkzs=!ei*~0Fnmm0(|3R0-cu$F(l)Zq4p_oU~9GHFS%76SQ1S#`% zc0fa^@9o*-GkP7`sI2&q(mXVSXF&?WhOa#;mskz-t!m?)pJeNH5=xFJf=_81{<@qs zV`6|8$J78{szKSeD5u72q{!Lm{fO3{N3z(e2Y+SG4G*Jg^(o3oR2ZqBlj16p(Je4O zrB|Cns*o)3GJrwWE%7(bXB|GKH>Qm|ok+rbyEL;QBmoXa_d&f0n8Oh}0-o9-q4)p) zOXxkn&b!%c_v_A%pEia*Jy&kb2sxdr?tOT z#r`M?Ve1F;c&Tymi~?%y!lkXmhgRjM>h7(5Dd_3Vxt2KY@QRw6)e0xOO@{zeNt?Ww z1hqo4k4uym27)On+!cZJzwurVPp$Ya+ZRj%sh2IPwTKfpFQNK66aH>dTM4QmScF3xY;&8C5Y zpArMIxIDdT>3B^Wt>GOfP{Vb97?f<(e1ri)LKx&A+G{wW(ygOEY{Hn{L2uzHtRwJv z%CBK+jP>I@#nX|*px^w$8@a58?%sh0K$gL-fo_`(NntH?kGXke%GA`9z)-5myaQ#^r-CY+C2>C~CTdWqa3gmy$B+|1p^pz#goG}76LaiG^5P&k z8z@w2IidxM_0iEemMV0}P?SNjLGt+d*9WX8UiV3gD+2;NpLiprOAg(wd}UTxTZas1 z-089DfowpUfuUgobcK#4vwpLKF+8*A>C_lyhQd%~+;#*_pHJ>Fe`q+Wgg!S%f~G=d za>z3dEl?a%lU`7H5^Nb#+sJ47u*@<;NiL0KMv2Toq=N1XQ;Vf5vXo?t6`3M}m?0ZR zb!LAK5ne0dEVO)Cua~iv82FakT8gauQ&^x{DvcNxch`m6*nnE1PLHVV6#u{kg5NaP z%-~lMulBTn-g_1UlsBRv!XI9i#fR3Z-Q{?1bdvZ(W&7}oNa?!adH}xnYTa4x8&c(w zkwUNgl#s%+Uc|KiIT_+iN2kvKY$49_OcWTM7|LVCA{e$mF*bqbj&i@u@|@SkF?zW^s@dZP9G5Dl-&RM&` zh2``^gMrKGHj}GHzx>ioiR$3yUrK|zO;JxoCV7N4a5QNYctjI91yl!(Q+bNq9#E?1 z`Y)Rop2mOnhf>7_3`VP~m4|suUwXVK=Vg-#H&qV^@ard4D}ER&*0CQP^rbr5OqHPJ z{K*$=pFeb0O)CzlA|p0=uYR&| zeSR+K%#38MS_@g|PpPGx@TC4OQv*de8Evwis_UK>#=!F;nm$&P3TAGP9_or@*{V;<)rxN1nW@jKQ(`1KzSCiY=^Ma|Xeh=UuI{qe6bPHB`Y%3rzc< zSr5zM%1LSbkHIhOO)|PThKlkCe)irhdgfG7@TyO_yN{XI4)h>|W)xd%c*(&$nr!sg z@2PqsjMpf@FV1;##|_QSDQ;h#Hl?->Y{m-?w)Ut9_o0M`5+}xa8F+GR&$oxXa{2XS z^&3vWfcRc8ZJd-5LIwx@LS5fOqDB^_vK5#+dO9@1&%G%{y_*yfkrmtA_TrcRh+gm4 zs zuE8sw~wA;V&7$PW?nq3+jn@9=n_G0;6WG)n##MS?TFTY5qk_Hqin%+xF5p42=)I z-2nnX&s$E#mri$6$|ipf(|iC4*gF65csekHf8=eA%JtKyhdkPj7j{n(sZawejhv=T zo#fja@8-k&@?$mX#8MPH21d@oI2VS@T5Ra);U+E`2d$UxEPDVNhWV5ZJDJ{GDu9PP zd-tbgwGtG>-=N;SG#5S6uMMU!khK!*pVFIBTsJNaQE!=-WbwY|Rh#hiV3aV_f~YA8 z9o36$GpgCPU2ho^GSuNmeX?eu%k3NT9?azz z%$>5;g72*U4Z`>B!pm7MA|%U359W@3e@ok^Qf>oc)t^lA_it??*O~T^ z$<4fkYGvigiW*UkPP01s*IU8-O#&8=&mgabo_Do1ctH>s-7Wnz#vIER8c<=e)dC zn`ZM@Vd^_2om9c`1+u!=>vqUFQziHKeb#PzTbtVY^TK~jf6`r;I2kKx9oAA?!}BG` ztas92NPRjdtU*9Y16xSMF5fOo;fdq4QFkKwMGLTX8PtA^6}7o?%bNYsimx;crCiN* zzRjY^Mxn%Oel#G>GTNzB0j7L)!_3Mfh6^vc9)&+amI@mudIb8CS@o2ra}tmip2|4T zsGR09v62`X@X8PKr0B?62xQu%)NhI7{KUl`-}YYt&HBI9Q%6pCh!})`6F2;}oufgG zVe5`?8+uQ_FXG5Atz4jxnxaCiKzRK59l-oXd>)xDuQZ_YjDUVyb|lLLHpI`}r|rJ` zuw2O`3o1pVlAt{irVSy%qPN328IbaL^Yoe6m_Jo{)4QJcaqUUXoUKD!0a|d8 zNoP1pHVPK$zHK0{H_)%Cs$i|ID0BAP*5QG#HB}g-Bp2bIL7!ZQ)*c`(tTm#gmRV$UA^vioqQ~&j2x% zq||@o2Fz?JcV>>r0zsW0lo#R><2y_%J49FK@j&UJyk@HbHDteud^t9P%{~>?_`ufp z9M%!%KM2{J^`{YG_3jW=eJkt_G9i?XY#H1MK(&4bOYWmVSQg*g(}E<^YWbm@bS`l^ z3VZI$-84e4T7!;GA@Z+Epzt$k>5cDj)`>i}1WVSS_rAzwAq4kzP-9>oft zUmE=?{jJH*vuFxacPU13^Bcy*KL) zfxed`d-B^!J{+8HA|t*9ffWW(&he4O2x5v+1LZS)Z|&1FBhuW+VFfLHbfZ~~O9|xJ9=8H1};h{$?yf0z~nv)1} zzMw>X0lwj=P0-ST(=E8P>wwDXCGtl3(PQs#hG*@i4`vqqHV3sw&2BF^Vy{OF)PuFM z8lD10vRL~n74X4s--{vT?b5i1!7;~tU)gH%i}BjE;#oskXab!WJRV?4ujG_GX>Q;% z`D3+K?1qkfelY4Ial=CShyTW~Ybt0#Z(MCmeH!gcF)*p}&^|sTg-ygRE}2O&cKh>t z+233kcWN~6Ub~UWM$Nag>eB3}jUDH_4M`~xSV4|a&2&mWOt(Y{R#{rg9$RQfo%&+x z>Zxxw+wnlq(kWU6YfRtJ0}0b9Ca?TeMacH%JSn6^%G9U21WK!WfF)~5sX7e~o9}N| z5?`Jr+mch}*tonEOM4*c3aW()Drr?teVhy&k=fz|>e~(gqiB-UKEGvj!e{w(9MPh5 z$w(x44d%a@n!f}10QGimaF0*UgUM#U8=UxD>Ovw)+H+X5Tnw9RU#>2S<~s4gBNeN|NL5OJcnk(lBB((Chcj)1m7tFGwn1!~d20sLy>`W;&4E zi==)MyiT1`?`YPgocd)#N*SPJExnX}ggGgbL3!q$j=VW5NFI_YU~;Fu6B z#xPJyB{EnO&RGjq;(7W-c<^ESJ=JM#8R4J8lOqp_>AwmLzaUbM7{J3T@l2c*H_*`O z`;-KgT*wLD+P?$%o=b|}0ZucXmjwi#^O5LA$JT}AQ?#_vT5_l7ROM`3q9`{`w?(GB zrz^m$Uaeknk8{=-*;+Dmz&OT%#6p8PS`HZ)D1WKA+anL zryZVztni*-$b*9?TL*@x=u+k{#dav z3}2anjoThVwJ`Hj_~5l^?@qe|=Ky?8pmvD&=-IjdMbPsho;t2`f_RA8yJc_wUH(Zo z-P@!aG1sTkJhdbJICg0!EqG{OVmFN-vDQt9n#;b`1Z9)Lumm9{h*cc(%MdX{n4P}` z%-tH!mVP7l2$Lsobc-4Kgr5)Lq`5|B1lQbb-@d}&`NsI_s{JAt6^_}gc(v7qME|x@ z4pBVOcc7+jbFIH&I$I#yr6%Hu&9=gN&0+D$gke=n*2UTUlfac*@_O>ECvvWaMUIcJ z74mjIu47`!I8c0~iR64rKK!=evcT=8Fn7(E9awY+z|48BJ!Pt9S}nn!?*Nfz6Ln%e zjW;JZ+3?Ktv+Uc34aaHd9iWNdVO@w?nk|{}4zSR4)A(8|>kiy&Lgk)_@!oNM*5BID;uhU z-psT$x;~5CkhY#FKCjbeXmquF6(MctY&Bt3g2|z@#dFZ$sq?sp*$|Q}p2D-s{97&gR#G7JvH*)x&d4fGs9|(Zt?n>+epJSprU)i5sUJe>0|v`_?1q2aL8m z;Bpk^USJw+z?OWJ&ZXo0R=SWV&xVwmF#y=c^F)?QN&wT8J`m@j4=o< zR8R?SF*}_YXpEKe0BUFc%19|I{VZ~VXX%V_eD1aGReX_2xx8wS7*`Yz1}!FT{O`7x zc((wiR^1Z}8}BhsCIC|%6FhA4niCUDUFX603-f<5)DhE$>$Cd5@K5Ida{LRb{WnWN zg9$_S58QvCK2&1rxiMpCo7s41`xh3Y6HJHL5&MEcvK;zPb9sNGkzJp?|BLp+-}vn} z&;CawGKSUvBQlv#bc&~;JV<3i-u@po$CxP0_t{lx?8zl!tbpk(Mx4ouA*}(^1t)kn zAsF6VpL=LjbeO#UM}GfS5sIw$nXTG3#qb|I5}tgP5>)udrL-Rrr@_>?A7CMI46NPV z2Oq|unXbi4QgP)epSiWk2=gTyAG*8;M`mM%I{sI2}LK+lQL?2w? z+_S|;W%=ku9-MmDhPfHA8m|z-*Y@?w>Z|`uYyxnHdAkSPqLf6XCH*}Rr@;=3E=XLn zD86BA@|D*FwY14P&&x+9c;)*q@qfg4k59MrEKp0*)_Ik*b`gA`ckq0zyIs{`DZ00k z4Xj=+I&VVU+MzyWYjafPMz|8XC&!whUG^=rD*cdF8Kf<=S{D{Rfq#~xdN$}A*O!g5 z?sp14u{?LV1K9m6`!I8Iqe!V*QMlx=L1;Nzh--*uEDbDTd8n{{ar#}gGM1`E18yz!dt&Gp?Xm&oTnPu7<= z;^a-v7=V?t6dvw5atqA2?pOXb<>wznc=FMXXC$AWUI^|(GcH$HvXQwIUEF@I+$Ai{ z2}0jK9j3p0D>zSdv8vx}4IvBu`2{@_)wi*GEqFGMFhUCtk3)9u0GbBZ=d>04kp|`< z1BZFf6}cZL$+oSjwu`amsU9u<>>h{E;Xm&Hzs=oM$y^sqo=rzi`twq+u z)}z+Lx51(Q$yxm)$ztJ_E!H{U>k8cQQe|R4>hZ0qWdjqs9*vRQJ9pZdwQ7G-fa32$BbaCmFC(8t$TKiRd^JPr1tlOVee4PWC zxoksIAC(b;o6;V48I!zX_K1&L58{G#vx8R`Z)pb3S&x0>%GTuAz|*>|S?1J1ZZ9b5k+MWEOJhjn1)Dg+ zu&s1m_zu9Ie>0$g)7Jm)vN$=a! z?l1@I9ioNL4Gyl0>m$FB?6lFmksm8#LU(yiZsYTTQ;Tx)n`iQNZ2SnL-15uZ3w-{? zl=kkWVDXVfeqKB#QTiJBey|Lga=v2a3BlJ`nh)MAODs0~J`zy-n2h|8T8i>;2LhXj zd`j9JZVI-14sAN`ruIFyAYCWr{(+&xzQZ8Ab9u7cHKpsM^vi6y()IR5PKbvdgaQ+% zdR(EHUw?gNDO`B*+x2+CRR}0$VF6Jy)4h@Cb#b%YbgkjuYHip3x^~(AUv&MJh+~lu zA(wC7g+#ZxWyzd(`|H+5$JOR0!=McedC?)64xUA;5x7c{V=wHds%-?xXe#_ z&l!BS5OqQdH7*v7R@c>!xw5l|KhK(S%jG{7rmm|*MjoC^Rdk)K>|6mC>sNYAW#q{| zH(xPfHkNho02E%u$aXAD6vwY2)~^Fyle`8_w)aJ2)3r$&J&r?<{`|4PggxhPOZ=9^ zSDppSSnFH&7x7nAJnmOc0xDUR6hvy?^=?*((*bYfJ>j}Qye>AnLr zYu|2^+_G=Y6gj*V0!Y8ycKP9EnyNamaIm|7aJhJN72jP$vqafe^r#CVdHV&Ue@(PO zVI<-8YH2axd~Crc$7bE#eyt>H&=xCl4Rg!lOumJyJ-Ti$nEnoM^e=1X z^i9%KRI;KHMO8J>d|Su0B9u#j&7Rp7N7&0hPOLc={T4+^Hgw&__jPVI#$Iu!a9mWr z@pv9St)&H0YnY1Ma|PZ26|R%AG3qS&PaBY^@06y4cANgGxBtm=f<)E*7i=0v^$m72 zvMXCSR^`o*vmoLlQ>*niSJ{zw0F__2o5i>6hbFJNM?M(sS^kUsudNjS59Ed>saqWt z=if#-WKt5*{oD9P@h$VAi(TpYOT(-5|IQjK_ly5eXUGqA@Iv#9%_8sD zOf9Nh$;JG|N*Sd2x4E)^oAarn2dM4f2FD1WqdUs{Tsh=t$bo;Yv{6Ft$sORA#2sK! zA493BmGJm%Bg|AwS@i|zejNp9od?e3Fz04g6}JeoUzu5f^q z^5z$551(c?+21HokS3-J6#8KV6pQgN#rrX^UFUHx6X zjGxsr4XQ&chdr{JRtWB-|2v&q2+}O2Z^;oec3#YJb5Bl*l7R(%V;+S+qhkZL=Z5`-O z7Dc)=+^0C;r{fMt-iZyF;_h#erEpH_@*&)k_d(c7!6|P)yrhb*?+ z`cVmzli>{RViTo5YyC9r@w#XQ#XKAOuzn$z@eqO=YOs5i$$6=+8-(EO10IX`*Hm2o zyaPNdx)~$B8Ir46N8Z?}xAimK0a}9NZ|}dk16Z|R2);ZexdTAl8U?S#Eh$`T&gEBf zQ5n3r)v^bc3+=}ezud`5b+Oj;xB^3Rd0zz6Du6m;*n@}8Yxk8QV& z@F(kjuAOEF@3~+5I{F6-PUy;Iuh@AjtZytJll`RXuc*B8Wz8A6t0`vna=wbvug|&c z=bR1nYSBf-Ean$u)%ytorwWl<@Z6BqV#%wvL^=k=$HetcvF@njALsWWF7irit>4-g z2>W7Wwri$#KfAxC{v*?+qN!3%UYPeXfU4;Im$B23@+(j8tcYmep$XkOh7aUZyQnl7 ztMcpt#8^uiXAmZg==-poMl`dq_JmD+wY)*OGcQ=My1g2R%F+9^XVGdRPb@3+wmh(% z+_l(g_x^#|l?Y+(m%f-EM!oKxxW<=zfNob!o_DtuheY@E0j%g5Mu5PRAyl;;H^-={ zRQm(CMl~^PZ`lNH2X_=w(9zvHL_ZKbd(iHRIET>PZmV5GF-qOrlgVKnQqjxH)t}Cd z)Cs&e-7QU59Lcpyn@>`gp8Ap9b(JIZYk#USuyOlnaplj(HX=}-{B+~j1ZK^!hB5c= zKKo>`rBb>PpMVo02;eXUM9%e0BysXO6pISSMM$bXvhH0K%X*IE@)H-ktP{Sws-liRFteR>So96GsmNaH@B9W2gweLOXaV)-8xXNSz7L{Kw}d+FP}A?gR~Jc=5xOJMU&7S z@?U)Nd!olFaEan5uW>yB$iXWhjJqwdNS&N8yvK^MIZkSQ$!Cu0JMXn!+Yz^Yto1x=V1*&&SN-qn>@?qY zd7J(@59phQZG3LRo>yMU8kM;|D(6PDTESY87a~4wFgW;z2=nGEZf1PBBElAYj=VW& zZAYuzp7jS;!14YmG-TwDy#sjW-;7WUD`mMAQmWknv?%3eTWse%L)C`E{f;Dv_i2HP zh~S_KCBm_QiQ_dGmf|LvHaa(ZLcg3@#{jmjFMiPKV-el1`?lNGJ;zbL z`1A`gTCi%}mHVUWkSsByG1tTjm)6^NvS+UwN?l9#JjQb$nv*R__En9fEl_WJq6elV zI?Lr*ZQ=^yTiAi&%sEGQ0A9^y%pC%sc)}i%1{{p%vAa8V8?g#+c~BT`kWT1p__j-; z1-8I8sx~>G^{|$>>~a_rEr81Dy76l<*ICyCpm20P62ZjzCYafrOqS~Oxc5lO6@g^ zX=*xuk%P;%TQS%KEC-N%M;JFC_X*}r(y)q1cm~F1uiAMfe{!nQtKa?WxgwOYxq@w8 zFz4agTXEV{-D z_HshN=Wt=oYp?nJZ%4t#-@V-dkbsd>q}@Urw_sf0HKR)z=j)=*%?9*dspDf?9hPl}vzz0+GNHP=@Qu}ZE( zoOY4)^{9fHOUo%b zuzg4Lxq6uQ>5t2ou@5Du@ZNF!I;U!mR|P z!T3;unDvN7tPS%;f>OEWDya!5NTbt%BN~1OaMy*9zPYN1+L5>dv=^RwVI1rGT;JL1 z_Ft=>%PaMo9XWNXM(&OB-vIk=H{$=e$?LllyhFR(yF}*zuLftG^yHeVK+aGqY^B#TI6CRe>>K_oAC2O|(U> z0V4NEq`k$dJ^H(ti@hDX%SEVZ+T7tfmE*|SZM~|7tY;g@q^xpU?i7C;y*;@6fpV%C zz0#WbvWB0eCqX`6C)bV_;}p`YOXOo_>f(P~xus7vy(eA43z`ELtMJM@x>^pA#$w#Ln1$2Pwo{V|B*9fz1q%>rRg2ky|~8DNl2Udub3s< zC_iKe!ym?(!mI_`xNkcDA;ic=cVQ&ctvQW(uqzs~Fn9Xb{c@N#H@c4f7gg_9M4j>F zT>6&bPHJ1pdi)K3`UQql!#?63;wy@ONgD~Be=`)+y$NK-$js7(wU0G4}R)u|KzFL9;FQ7Ex62{8#&pFYa1@;;ns4!k>GNrDOh0PyAKd zE1uu=`fLCW(`H-l8AX4pc$V4dDIG^eYFc~`XW?7=uZkTgDSvZQ{{R(s0T%Ks%$If< zjEaYh<3HRfKXX(602Ot42)O!EH1YID+fM=i0Mr-JW>M6eSe2+g-dakCD^Q9npX$ps6Yp0`AT3up9Guf7?$JU{{u zPf%`T=G=@r=Er59%+9K{w5UZ{)h7f2D+VOm7AJ$ZVALy`u7jZ|* z#(ImN=H;o3tvVq-r>Hh7tk2wNwR(B1Mdjd!dun}fuC-*a|F|QcphAuOV)-ypxr2hc;N^jTU-x=xXW37|K zr==*acKK*=k7k2?@wxv1w)mB?JJw79)q~hAIat4G{%1F+_?0T>3`?G3zMW2tG@Lxh zuC$aGKIjzG`8YrIk*;sW^#aj3?(0nZMYQGS$2$^5 zX5%>EqZpYFlL`l31H0qCgKAU6V%n}7b#Hrs&Wp&{d-qz#?V%ff#)i|aVo+Akzv zZUvFDUH<@q7W#Z){{Wdg8vAE9^Bns}5&Y3cC^+cXOq^vqd{&MF{{X3bW#JPU<0=0D za?}3+6?XeOFD#*k3azQdzLJn9s)E|Cs!4W~9)E#eIQV%SD50ZLdTOPo$LEUbb97u& z#}1%`Wfyqc6H9oEWO?7M%poG;5S z*o!Rn7*x}RczxC~TaS(7#XUZndQZgBoYKHZ&%`R{?YUcrduPkgj34i{M&i{I4XTn#T}0yMf;i$` zJdg57?tb=7wFlPLUztnvDOYiPe00vyQBb2}ugTN4-)wmwP4UkeK=K)0mXx^sp-%`u z_z3*h>7`9*LG1(^=G5`N8a%p&Gt$R7`JBF|U9w5R8hF!)~KZY zw{f_>6oHB^IR~eK7wb5>oO08&XT&;6g5KP3eGVIl;;Xo5`A$X@oh6LaBvN*GA(y$#PQ%;0WPWSIaNH_)hZDw}_WYz7 z+xL;J&&p88#YsgqHc}dyzFp~n#7azV>hX>A`>cM+%_V=55{m3bCU++ z=s{Xk@YSj5##pvaKMZ8!7Wo=s6=d%R8BDb3CV??aPQjfc)#C(MOoXeer*T`kv*Bzhx(*zy1ZwYq>TvXRR#eA|DV+Fz3=qP5d&v@l`0NhFeN@|9 z{Kv8EmsXfusnx8-7topN#)qzP%_R`b;02O_-;1w_gwtYgM+YOnYn-<07 zaa)Sxai5i>+y4N=Q;+=>rQ&$D_vonK9S6(PeLu|KXZ{}_+id>;hm>@b+ub$YhSlVA zM-jy1`pSd%6({jm1#bt(NeL0s(JOk2Sd;Tc6d$x-Z|V{KxY_j&q{ryBnZE2(sWs$y z$#`x&G4Uv9&&TDUANm`OxXvYZ`nrqzgg?aJvZ(UP)FBNh&tb*XZz2Z&0Hz<{Shsne zexuX1GP5z9vGxA|yz;+QaX;=9U%BA^D%@O85*sIvpl$j!G$enE7wSLYA^!M(fnf3` zKk1+KEX4fC{{WZkBG)qi0C?on#lx&x4GkdMx)zd~1Ji#CHzyy&ai&(0sOiUCYJwB= z29Eob{!@+-hLktQAKtk~mxpZMK*hBw`JI$ee&|YX?OhI0;`rXmI#1m6{{Y2Y6&!CI z$aK-s<#%7`)W<(eKdSrRP%rl4Eq}wQpXW*YF1OFkn)qj)q2cH~^Fc=$KKJx`bDy)q z0`7fB!fwNkqYe5(o}WLSBlKTba40{{8)JcwwnJl_n#NgCN;RnMPZ{Uxcz)LE zZL{hT{j}XFTjq46jz`seKl(F|{mU2ZSU8R#^y7H({{Yg%`xn^yg+I2R_4_UTMxWac z=KYI2OMJ(KasH;_i0@L|4KaLHMpOvW}PggdfG)98Va3=ycx?z=Qa^>Qi}kNS6}TG~W_1e>KbX z7$4_Ntlj2RGS|z7amNqEcG1&+ae#m5?_X7MDy004G5-MILHu3yzM~)8Z9fI6ND~#v z#&Mi|mr<1agyYAV+E~N`5dluTw8qL#s}&*8ntZW6$xWKPd0iDQ?^o3c+c}5bvT*^Ki0I_{{ZDf{9Vd; zM8M4zFd6>Q8)Sb}hW!mclSERihNzr&X}fE{l^ac;X#Vx*T^3`P`_1XmS^G{=`ZI$` z#qs7mNyl;L9WzNx59fyWS;tVdBmV$F@LJAypI=o>1flK~PPyQ)y&He9H*AFYV7eN%#)pHWZ$Hn0z9V+MX zH82DyBVtz^OYjW!8a96%JGMcQB5>;k(ue^(;Y;wPR^0D%cL=4JI-45v-tpYHEg!X?z!q2&xZp ziwD_oPC8i~2P4Ay7s*~~q@|ilo*pS_>tR@2Ow_Z&w+K2McuZc?VImFeIuP4z_lT?}%w z5tvN#&EiT9(qMtxe%zjeradx0RfMq}NwYX*$J45=>aKQ8&K1JFt<9$5rkwcr=1zHO z{)dG7$Kh(Ze?ECWo;mAi!wP_FX%y>+Z0x~GgYjc}^UnuY#c)1bp^mGQ<{3Q6K_rzG zBgLrDWc;HVj3RoRd~e-`A$vFaZw#P`sLog5JxTp`YHa5xKGJ@H(0!I}_9o9rty7Qt^)eYR%PH=@4=uM0jRT=lh=6p+Ewbf!tK9kOpxR0ztZ3DdKt>gI66$j-IxbNN6jmAeBV54=P9` ztCA?NQM9sZ9=GcU9mkB3Nk}vQ0O8^P0J&+XD1ZP_(qsIdAN!U8^6f>M1z%SNVvfWq2c%Wk5qQ z#$RUquS@NGjTp!DT4m3q5PueLLyw`y^{pq{PY?ae0i(|OlD%tlq2+WZODe>yd%NP`n8i^AW-F*nlP?RSHFTtxq{ob0twUsvfSt|ykC37b zpOmC0{{WE}{mU1Rpxl}&GEO(}BOm&<0VrjV2Luqn5JzaoTdB!WPhMh#$X1Y&YNJz! zpY%{SWPNq6JKm!0>CylI05$-01JGL*_yVsV#?8je@x?B>MjDYHCE{<;Q~j)dO7D+b zwPtf=nLtH0*!J3$u@UxOr2_LZW+wJpD!;iLz}lp5Y5jL^%jdr}(E}1UwBJL5TuCXj z2SVW;7C5}gG*SERh&@??k7oC#>3ph6N`6m~Sxm z;6>8|UVU#+^3~N-(8Wx!Dpb)eVR^hlR2?}3L0tRWXVTsWldHXh?7nv$S;%r;4PZ2J z)3lPRrj}`05!yXL@&cDCPMjQc&C}v*IVyTOQppLYenxshsJF~_>n1@UW0ALN_KP|Q z?^+}dyIoFZwthN+=ZGt~cvro!J|wD#KVjP!OOoU&siWm6=434&AM;Sn7l@}haix{y zevAf|2LyGuxrPzg+QEE&Uzn-m=8#jeNMeFE`G1zEsCLM2=Ol#bh;6ZMyWH?{)m)8I zK}ac)eny_L<&d+S)ENRsk*=J8V{J}bySH@a&FotjkH_IHaAz3{{R7p$(6tGXOV)&8fQp+E8mq@~$Prf$V z;gif#$rm3n@M$2PmO6&1nhB?fO5~3K80Cc!?U2tVM5RZ9;f&kS_)Q~2u+mNF`o)B{VAsfX`H zfx*!>wkG*h+|_$G6D;XYkn${0#sr=vI~X2Vz;oS~R)Vj9x=uRgatf%6t{{Rj+ zYU^kjV_)YZg{0PnpYps_9pQneII#mr>^4Vjuto7@^94zIgHDB(3W;gfC8VpGSy9$s?^4P|pFWc`40JL}e+_ zbTMWOc4FAT-?q*ll9nG9f=H&SG_@ZpC#8o}Iz(|le3rtn*M=MPv@@;Se12bQ#yP&g zz9%S1uatIVW9YH0hHzjpJ(nF+X(c-bI!CSRUM{~U;=BMayZK|*)N>g}96XV$vOk8N z=t^sEF^g%n`WU64r&d;30}=kdmvC?_1zkJw(-q1O2Whm)UpZWSX9F{fvky+h8jjTJ-5@7pW}FyiV5|ZwRm!( z4MsQlQ&I*;Qb5P&_*~US9$8vF8g?mIzCDXSRY1vtKHKHaz6_4I*fC$Dv|my_XN{jg zifp{7?+j#M$)h^Gn8nkrVloUV^d%N-eAb4 ziE+4GTfww@H8N<05`a&cs;|5&MCygjclRBv5%$> z8?S?Via8mEkZr85a_HX~Mf23}qk=o8 z&B3_o5#xvk&TuYnw@CFPEzpbeGF4B!0ru~0G@!zPd6B~B(&<+6f&v6*C)Yok&B#-n zYmQ$CnzD(f{JdW-qLxTp0;Ps}-&&SqQ3!6^)5II7vl(Vuojh$ye~}Fu0T}x(P_|=F zL4kT(eG8>LB;P@*3)V4cJ}lK~vqY8$i!ExmVM}k2TeWV%?1*C3yxOsbA>bj+#&rz(U3nW&BF=;3 z1xoqeSjmf^>x-ccWYKFG&$jxh0;;y#V)^aHN@Qjm0&fjNo_NX2tE%0}*553%$4Ml) zXS;oFDp-6J$HNBXJ6@DdZXBHzMZ&o5d1DJ^H?SKsz1HXCR#%W&WtR6a$_p&A&CF>x z(Fo&4HtTN!%vqaWC$O@YV8F8i-fYdDAZ9*BblIlemT&eCkCDygYS|mYO^r}&P^`CQt^US26_)X4E$<#hiv_$`qbvol5SGm>Z0rJz z=hFI=6mrw`IQDe4LrLK%V}p^k+ZYRNa(DWEnlRgA>Ooyjvo7BDK97&b*fMr>Tljl$IViPxRZe}T5B7r=tetiCGz=M zGIS#JQTAL?ObxKEC1q?BZ+F)=)|6+xbqpgr9hUL3FvmuS37(?9ii#kAq_gX6?;LS} zUH&-8+v9g<DV?!|UNm7;QQ2+S_2Aa9Ep3k_x^8NTZfGr(-0K z6eH)O23;7-YEDEV4aU-ylhtofQgNJ=j}*!%+W|^hCt)-A)0D=PBGt#M~sf1iW~Z?(M!bwv~WW^z{4 z)*m4o1<(K+YySWi{{Xj(X(Ny|9Nq@qw(^VAi&A8-4iAK)Nt-iyT_kLCZsee{%PasE zSS+w%fo9fb@g&I~y27q6jEcwX#mn5 zO*vhZuuvVk^|?0cEbO#0E?H)kyTbdC?Gk?Ve^u~vf<3q0jQ$FK@qbmg^#gWalKa~G z%wM{{D?`se7TmXs$w9~by3~qhUm7{2@k2CHYr%_7fv4Wpov>u{ciu#PR`aite6Bdt zT;6GxzAu?dffvaNHHnLu{3kMp@ebP1u9MdE%D~T4W%<7>{o&JdH2z|#q9Jj2BDa7i3Hc=O3iC|Vb9%B8E(GJa6FywCT;1B!si;1t} zYbvFhQgp)teBwnU-WYj|MpbVHIUIYow>*iSrq%H{PrN@TbKDT->AAikXqGr$c@HH* z%S6(kaRpSZ`NPV*9Yl2ew>!k~Qpuo49esTz8%kf@@Wn*PUsqc>&Y1`FyXP ze4WBn$4SchkAmYWB~^H->p40qYKc|$R*o5_Nf}%6N`ejZJi+&dydR#tpXD^6`Oo;G zK2k_))}s;9{asD-2UJTFnMBL7vdFr6;Mk=vAs(M1%csioTt@>;)qJ-jL&egEjx$qT zQw<$Bc@7m!)3Qbx&d8;*$6;|%`KQagi&ZTjF~wEA9!+A?S5wYu09{3=5xFsqJ?yvx z8{6DGof|KYLFZ2?^9+8h^A`okVxCIOQgW14E%LEAib}08%;&+5W8q0By0Ujk&CA7k zr^_7WM6hvO_Yca;2Ghku$Wm2H2FLltf>&hzs0#xpPSL(aKc768S3Gp|{$=v?^GzX+ zo;dlAI!CBrNM(g%sAqRv5Xu)Jfgc;2mh)eg_$eWWmghL0GFjilf-36zT1h5;#f>T^ zLge(q=Qh$4rx@@~cj%t*0~U@Vp?M;`+4d-#D;Ek!W8cm(RXPt;fsxpUd+Wg{lxo%TP$o0`-_I zbqstV+W5e^Y5dXUx{fpJSozK(PBqc099Zkr)BXZ^Y@cSm-$|L zlb_-_Dh@6ulCF9lMv9_1%7R2jRH*P)X%BJ~cTH|W=XU%g)@{o!yQT=7-#!jZ)+ z)pT`rG%Lt)(Z?gluDS|($;1mLg7LFHmO>7DEFVMCWLbVo&0l)nR^hyt&v~DPui|{v zICQ6J>3H5^j!hzFhOC1Lie`I!;H7lCkKis^{bB>#6E$ zsQhS_LX*cE2~eh?yT+OHwU9d&Uom{+EmwAGELO)T7nEL8_qbmA!`SMPRrcd!njwPCWsg_iMVECFWB+r^l- zfDGB2F=j1b4sVzgcxZc0Me}Pw`6KKX((?w(3wjf`w)xek`V)Hvf;!wtknxm7aDSr1 z*Y~$JC+t}nrKy;+diR(lYCNk8V+ z-e>HIMang1%-NP69e!j#(tkm1{{Tq-*1t%-iB!9$q%4@!p@C)9(@^R&*`Bwo*^t>> zx)B36_OW?oobRIMGNO8;HEzO$=#hJ*wC5{NOP(@@Nw(uY>+zH&}y_qJW<#!cyp7`T&0(;MX*LQovaTH5on!#(7$b>l|G4c^}I6# z>TGO&5+eeq(Ja$adlKdikO<#4><S9bUvhNIgRXzi8YnFpcc6ajy*J=kXhE+quFV%O%of@3*$?@Wo@2LRbv?oLW*$ zyq!y{S;SM;PP6!v!6;7;#DYhOih2^H1Mnmqc3puqMC~FUVF&eIwFA)S?Y0c()9`|V zpiN05111))#cvSQsOc*)+)6qUHa?epGr6=JMVnmfyj|)Dw zr}09>$6_*71h^RYLx6j4QgI5?G|<%4Qb^$zPXMNwLJTgkByYGIWMJLD5UqAML;&04oU zyKi=N$DHe5;R|7u^dSABz$rz<3TlREYARADlf`OM=+yZqBr2Hopd{x3^!kgCad9jO z3X`EKK4b&eU(9&;&!(-tmuEiTp#H_Y*^uZ`=V+y`q4{{j67y3tX&_-^o;euqM`B~I zZRPk#W`eFcrk-c2j6(9cO=}qZh0vfV&iy*>Zt?qVD&pQa$duyxG|Ck|UxKPh+s3Jc zR3MIJiNNs@Kmaiyw@*WQZVn){!V0>&XQzll9v6%>k&cTXc%2WoNH=)rv;BWPgBj{A z18Eed;bWe7>P1CeJwl*~q=rHGs=I+Ay1Je6d!c&SQN$VIL~7dQK?=g_6GWz9GpXH- zOv=xm^F~p<4csmVU)N@(urre>O%l?IeL0WA@bGc&k&JDD((1v&M3StsPgzj$$1G7A ziBih42(8le%kOp!j8_^vMY zMWc&Y2Jlk)o+Ye`qABKwL@7?tu7d-^9!evr8jg}q;Etx;96Hmn2~kn<=TZ4$%3=kw zNd%#kjGXCt89oA*#*-p;%djbUEfb& zynn+~NMc_avEqt#sD_-%JSg2sIUUU7C#G+tHXCpBSaH;k)naM%#a~ed%9GCYDs_oI)C0y;b>Z68QskO~hQzSZ({#Poo7fy^wQ7OsXsdA^% z?rL9$(m!U?HacVJ7C9vOV~pba(R#2QbGW_@Wkgj~le|r-Lt`N9em0v+x)$j9qa31oTSRqw&s}}dl&Sd#SX)29Vl)M#NpE+G6?#V2&%Nxni z7V~P}EJAt7Lz!)&PR1vHW%6c)<$7sjkx{AL-wr#HERj4iMC5b~jz(~C>3u$N#$u1t zEp&7Nd@EpSw+q?V$k>f~y4oBseV@X>rzAM{FrISnI6k|f+@ z1B~Ye?b7kwjYUkHmU#aF5i8@YT6b!MMjs{etiCJKo%Zn#+vgt}nwyH1{{WMn{g>0@ z={`+2I*Gj@VWy7FOx#tF+P@=1g#w`#F+y&!dQ%R*%kTK{1m`B1f8#z z0V4X8{IW|YhcahTz{u^lU&aZOQ~)XKwTdeTpMEuVO3K$g8u}coFH%D+CrpY#_FBcn zmKlRmi^Eu8I$YFMPfI8xp}292Tj#dt9F7)Fxn?J3NNIT$R_^DwvhyzsOjiq#Z=FRv z(aNDUZbomoxhTI8dL6WE)Gw0f=yOL1b^H5W$S5O+<8xV?FmDY#Q0Wvst(;zSW^LrH zh|9&VK8E?#)X*g86*PnI9q=!v1;befjT2+38(wy2v6im4Wq9%m32A&S3d1)nfC25k zT@4jN&6BVO`lJ;LWpd+?(#p>dY~zd=D_|F*Eor;Sds6IVi!pj0%Rb9_C|9A<%PhzT zTP=%ZZD4LQWwzK_&8&?!!qGSunnWE=Ek^4rX+xVbCd!pO#BojGV|}%qpy7VIP zCkaa<_>$v43!7R*iyVCh)?~*|_=kO)-^cbwFr9CY<|+9Hu8K)2IaqkLj}7&1HA5y( zeqg%hb#1?!iLry8x7Ko4T{^xhI@9>GRRt@hqmH6zqjl{Lkx3q`{{SmHS(9mXD4uq$ zYNV#5R;X#YDCuK*iFN7mc=1`Od#jA&Ngb|BcH;3#<{na08r4%%#}w7|oOg)?;z>2q zq@|=$q<2fi%B|72J(qlNluQj&9tBa6acvrWi2N+(##sU8&a)Fuuz$ume~ zZ|b~RKZR^qIW&Cjcgyj#(xgcg^wjQ?R?9A_WSBE)6D%GJOb!6?WQ)Z7o`%X_Gjb_S zMXowo<*kyeMxfM45h>(4*otT+azjZP028-4?7o-$J3y%nZ}TM}5Cl(|n8o-3bmbkN z^3h!PyD)7@%~xN!)p97*=n1MrKFfkABb2}r7?LWmRTJTk~K84 zzD`eI7iY54ibB*^)ACw>C0~Hc9$Hd-3aycw`Mo%WsG?J!xjq#g3t#}w@Q9d z5!n?9AoV>B&snR$aJ_V#T^b5m9#6#t0qb`NZi{`_W0%x58kpau(`nSA?r%12%wU)E zd1tX^3fifg9v0rXyFF}-1Y9T)7*kI$NW3=Z(qxf8JKI+eajR z@{w($WdNShk#QE3@ZJ%Vi&;i&x22C|tJ}bfmJ?X>GqT5DV73ScHqthe-QMMXK4px# z_TGAm*GNk&(yHvXJEI2CW9xNDRaHq~G4Q!4xi1;CKE&TF1}7LdBnCy4XdC9rRG(9L zYHf_7xyMgpo6TRv^4zsWDw1mJ-;Icb&-AHbgwxB{qLz?n*5IaE-ZGL(DlI}tVe=AG zCY@@=oWQY?550`LF5|Qd_Ax3Lk)%PMy*qD6X+K2)BLwLmv3kdoxlS$#x5?yc=hMkg zFB4r|SxPAAqn@IoS!Jn;C#{KVN;{Urcza+0k5g(Tr970i6mv~fvhuWAW|icSog7^I ztdbUa5laj^vpaU3uh*17jH=NLgN!P#Ute3oP_wG|j<1h*8g@JS0o!z<*HL(nq*G^$ z6Y^Y#9b9Cnk)(P_o~oSH)k|CA2kz>lnH3-^4|!v4^SSAEn!CgKuL`=hCyt5+(c%Y8gH(-&VX1I*k&}Ls zt(^CO*ykX2Z+Ht7yZ25`NWkmsa-h|)#lC^@Yle!lpO}Y34xN|GN_g6+qY$G#x7eCB zjP?(W)t`)636V%G*Zq1~w7$~ z1cEM)DdHJ+Vm*fX8g8Y0Qas40Gm&# zhPOz8i2~xI&vN1bgNh`D7yV=6LneTpaoM1K8eSaeQ}7(`nSSl*sQ6wgyO*j?YK}&xqNkpwZwKY- zmD|IoM}0YDR(*o%1d)7RYwlly@?YM!-Gz6PJg-|%Mz!3Fb5ql|FUiwWX^s@9dWov) zDi)L-QsB0M>zrTNalYGF20D7@_Ih1Kux$8$7vxIHza;(VQS*EcnwC1>ybA7CjxIWZ zes!acV9{06Q`VT`ucgTMVrKCdB{u+wWAaCze9iY;_mRfU<+VO2;^*@1MR%7tzb*6p znWJ)L6HxKtbhR{L;-qQROCrp0MzROpLi}6lw}HOHd!llDE6l!H<~+&d&mdOuou*%13GW-AYfx_cK8F~-*}&PLW}N0 z%24@l$`cM{>%6r$F%K8Ux7Jg%bd#ARtx8x7tRj{}yxT-u85eh!^1XKt_rd25XUzUV zz;b-Y z`z--KbgrnYA(NTnQB{w=d`UaHv#@T2;?UAoAT!c=1LJk%<vsYw^Z;jbk6Z!zfEMt>li}W0`=73;{>KWMdOt74#(B$Ys=h8v5Q$zDe$|@U;}4VVbgv zE-ATsx#=Z=qo;x?U29M{47E~ek%N9ALWpneZL!I)V4az|9kc80w}3w|`De;?9%TEh zUK57$Ox0ZHA?A6cht1GON+9FusVgHgy!CR*wY23HG8Ps=8>Sfj$6+^bM#!l1I%)q z2OH(yMk>VRsXS=t+BoO=N={Ab+GGryM^IO*IVF-a4z;4KiC*VD=)IYp|TIHXN${OG3u9XtJV?-qhe zpSxc-QE}AbS!D9pHBU=V8Ww3CxY?qL7~@g7ZtAK5>9ySBe4XX4AD67=C^()zmyoY{ zB(ANFoffL4)LSULPwjnmkT1!+5I8 zEjQMuLGI+Rjb|Cs2<^qre3|E7AIQIXymtfTij|6Ayg914>KEbTl}8Yg616-{7a;+s zsPNV}MKg%V0dl%X2LAPeKh*xst@B_X3H!hMyyl?u*Po%6g!2@9S2g7Zik?n-i;snB zt7PyDUobetPC7Z_ePt=tjHnJ}DB!5A#(5jeyw}_}E#!JXCvu!GnYgElUP@}-IvzTg z%n*HNJz~+)a$YWKybe7c}rKABj^|DS(muXGJUzZ(&LIaW?_?rT1+=2j#cn=+BfZ zDS3LjN(o@6im~|lfKEzy<2t7@WBK;+NybZJ{>Cx|m>}miU^0Gi;J)d3`emTu`EC!+ zv2t`g_svH)8Rh;0PAS=HL#2Cj#UZN^I-OF+Y9-Pzi5>t^-Se-NJkLqz&R)05eq8e< zZzaj|G}Sc}yw8`oPDjdBZ4<^Cq;k~`XQPb9GN_?u37_u%c&pGWUxnbi2neUP=Auc{{VzthuLy*x3l*4y4*(mRS)?rKlnw@JVJPyGuw4P z^<+jfAJFF-T8=iZdit(frK#IOh~63j9u9V61sY6uJ=5ZkiN2V0WLF0&zz}`6lN3fV z8+VsZk`DO?s5$k$1x*?N8gYzvV#7T?ozWNal$5u>lixkkoTc|ZR3n^1D;Vd@@wNV7 zbn_c?Ef*#7a8@T2974yBG>24kO(TZJMRu0ej_O06m)Y{WyH)vxjEx{(Vq`!La0D^u zNXZ+W@1i))JW-kpKSh9#ZPPV}o7lftOtU+8UJKeOO zoRYhX3f$HcRla{DK#-zHtiYY0P=!`xdrqtdjl3Wjd`zz)C5}3&F@myq2D#)^w zq=9@S5VN@JZ2bYj=0m(O(SY92~i+c1*0m!42H&U z)`^eGnSj)MAmDbM=5g)K;PIS$!%-7bQ|PIW!KgtJs?8pPnj8(8LK2`IfF~C)RZtWG zfB*v>g3hH?TZMv<ljqjxu4IC19k<&nqNjj1>M&GYbTgq`|V}RHZEkiWsn0iWP;nUA3;+++Bxi zm*i981&U1gk*sPJ^Vd)V2R_Tx zG?dUPh@pxwfQ1N(p+V{Z0An^}FmVIPJzX0bkxwRhgz+#n;8q6wFx}nP00tc|QgYm^ zs{|1@en{$EN~V<_PX(0#RH(`@C9>)_+hcucc-jf@CZ(s8DPp2Xl1(MO;<|y;p4?iO zjiHhSg{h!;)7?jn9arK51B2|vnHDlbB(>*-X&IxAq(!Kh@avK3jfo&{jkA2^=J^__ z>EnsSaaPR-%aWk5j-2bO9}^;}QIp-(p3GlyAc-Sb)j&n)qoBMc6)YhHa7Lju6vB+5 zZ+M~nl6!GxP-Nv%Nnb`HpXQaR=j3LD!QtxCtu)=>`;bODV|x>jsCthMIhs|gq^Opk z#9C!!C^o=~HDYtH);`PXr91%w2$5A^#0&hsy1lu)ryWBRiISF`B~r{8BUEg#!O2`_ zBd=wER`UE(w+Th!)X7lNQd7REd@XCL7|uTiD7Ifysn6vxy6|#UBsyebmO7JAqbwP> z@DyY8ut~mzG_+K)N-3a%mmskb#;~b7oUv8)&+J@0Yf%3HObJmntW;`yN~o-|f?f;1ijmR|301t8?$w)b(KTDrNY%dU@>g^3>a zwrn#gAIbRK@bTPy5y-Go(?%s9iQ&Z@elPFzsMYYzx_TNaFXkYI6O3gM6ywt>pyT0S z&V1Eej6;;DNgbo35Qu41APx*DIMY|RLX7>kU=C$PY_xS% z3mb^mO6q!fCS}NhK2Wi2d`e?IGTYu$kgjRsqiOU-^HWCEp;uF^N*O^v&FYglX29vN zzO;~2zO{Ijgt+km84Zq^v}h>WpXK}r{2%RlMvrbiel`n~aUYSZ)k8T2^qxi&C|nH! zLmEy{6SfqcJLf&OJ#}RCLZC%ZlgN~`Xs%+1c_f_2uMw*Ef02?0VZNxPfdYjnB9D->wC8i3zDGj{4|(rBeYrA&hiN~?p9P{Rh} zQvd{&VSzraDZo^;*TvgR3 zmYwBPX&7KCFIHpFd_E_#<*=x3yVwOPI?hApL=~~1F1nH8%R=AC4UO3cyhtAly=zFf zU}T1*`@g2Jki$0bjegr9T^ z7M3yjBJFrUo|gO}XNtyD`B=Y1Tlr-I?1)Bli+&Kb;=dp%x)mAH?eGNt&C#opp}`Ty zJYT-Z`ZvDNh+bNqTww3*-oc}={3gDIB(bVxnT|U$PwT#s z&c%`!{GpZ1BaV z*y9`(OmC;&X7uki-=6W|J0AP7{;2-V+%fHW5T8qzWRo5W&&P>lBfLI2y6|x=1Cm|e z+Q--8Z>q7AwT(}=OkM9}$_=#h(5LdK03mVgCwtU1DEO^RBIUQ;r+ zM{kDrN&bg1k+#FX@SFB+p_FuY2lvN+&vTdpvB=)+@$^vDGY0G(E|$K{-zp(Lu2cU2 zqS4I_J@U6@c3B^N&-+S1*UUSOA;;*JyD7)=G6AWZ`ldJ2r=^aR5Q~p(>n!H_YP$<} z;p$oQ-zVpil>TO}~_G(6HK_j(t*J zP7%B)uBY+*+i&=lenK<)UrEK$uj29Ej2*oR{j2L~K9{smb|4Yybxf6Sl;s}r^Cw-V zTFSO8#$B4=^Qj$5k?(yhP2HtR|fo z+!fVAlxUChUU81jS<hL20g>ulP+4U^#3#>>W7bhX~J`UeGS_@grik%7iGyOBi*jYvi44spKs%&w2c zt^<9Z6h7BQKev4}Jf#-mRVrPtEDi& z8`eZ$W_xW-R3q?LvB2Nkaq41N7NumO&TU4bb=aehr$`kb zVCLH{Mldfi#uN?4ZcJUmdy%wr;ry}6Ao&;zYR37_ZdC3ZUacJ6awyeYe%MANHFScg z9OFK>$DS5~LZ`C(pxiaI305*NtUGQc%Q4nzRk3o4`5dZf8lm)!zBkf?i-I*=_m8c~ zO-hhP7Xv+~w&y!rO97?QS6a-LSsYX_#&Q>Xk((G6F*btTqoOre1@Tx5EVHeJ1(sT7 z3Nm^Q+e|Zsm(bX=P4j9wtZI%izIxrBHhCq8_?gaj_>Wr*qpGIK>`x_y09!b;Z5*Af z!tyRnCBiDy@|4u_X+mGuvllHi;$+k=yu4Pq8O}H9b5cNQS4MWQ%BkBsp5^iEPi2|1 z%o_A!J#CJbX|on!Y%_SOsWEBNts@?hrVOv2(NaJ^P3$Qa_y_MyD z&&RET!2n)G#-YY?c=XKGX%u??sN^>4S*W%hyCq{b-@Uy@FFPAi(+`?s z2D!D#86G1|Ol68U+~7kXcpt8nDQY=+Qsk3dx_mc}y~rVXSkk+Rqo|M|RaTh-EQuFz zl~J1qgE74%(0H=WF}N{fL#gy-ZutJGMaMrkO-xZKVkGprd6*!7G)h8~s*)cc2VnUj zbJ?8%N3dLL#sN?zTw!_+%ZWK;!rHYi#VXpzlPtwl(?$y`q5e?E(Rv%&I{|G?xa8Ko z_*?OxVcuBc^?8utZK1vva3h0yjf#tgFPM;$$Pq_D+j4evx@!WBk+E)!Er)OFLuP)7 zz1aGsN^rv>@S_IAV{dCRK0?D~m^NeuWxQIn0bsJr0Ayrdb{&K0y;?TY4m^MiTNbU@ z-?BqX_ym&%03yq{{Rf7m;4N6MG>=>vi!=&kBK2DyZmmL;pb+`k&Ejpf7{u3mUv>$ zSbaC5O)atV6}o*YTdiH6(i}oe_Y0_aD?O5;+vY8fzqI6$?4r` zIV@+Udy@}S^!P_)ImefB;N#$oZc3C&E^!ZLW{{V7P{pJKL z=Q5o~*4b3kq?H5xdRxV#3{vMuM3Gbx42Ms^-HtlG zXyayfC);?g;-vYM@cqJjZtV0B7^6+pfHxN^Qg4%vy)LR&%WUM5&qwfonaQZEsg`Cs z&YbkU!O2Mw8?nXex{0D}AT8`0+?2e2A!m?pj)$`Ab1{uNpB7opSGz7#R?}A~R>rT5 z>7wwrUB*5a#!&E1S#kz%rA5g_CYax?naR+^g5u185WOIdI}V6c{gb4P2md7E7skZHlIKm+cuWnq%>uu zz$7kkGkmJr*{WvJ27%MNcKJHDrU6&0e%n+l<;>GHq1~rH-t2yQE_P`)t%L zo|(GIPBCwknHx~kOCp^(Z1!2qa&&xWhAL)QwE__W$s~=A(2=8eN97WB+t%f#1H=UM z2KhC04aRwnuBupTCZ?^Tq={yRj#|Wv!ZH_(tYGLeYhBN!jbvLP7nr2Jh00z|lB!9f zic~Ke#LPNmO1hUB-#9ysu4Q1vFXbEHS5T#7{Pk>UQxu*JJJ6Vn(6+w`TL2>=EDHgG z2*txuHz85YLs1<&LpxW>ni4vZh>{tAmU)TrG)PfOC`^LgZg9%Z4?{I=JXJB%$iZGk zm7^KXzX$^3Z_x*Q+7-|xYfzK;;vqJWbNFS7hV;fk?Y}cEHB_lf^=%&_wa{@~taZks zDx?CaBzVE7)U6@kyo6^fwW`Q-SyJ3BHz^e>QPC{sSSs3SJUQg?;fW?>X7Mr&LdN4( zSm%9>gURaOPKAAIgO1UDf-mNi_pAD^=X88?%~i+29Yt)kuUB7C+M=nYPy}(G2|i@J zf+c@&YQnMGAm7nY4LKRy4y2yTdjlbx3ji!@jl)=$08&&H?7SX8FIBv_Z2P9*ls0ju z=F24)z$oOfc{CrBXV!7!-8WN1eu=Y7AIUeAueCg3maB^_o=pCYgObPO=IZH_^bgT! zi9bNza@6Yc!+()#n!B>s)`LAQj#K#}>S6m(+B&~P*tI&Ga^zB{Pu-V3v>&5k<&Y0^ zH%y5L_YI=2jnTe~nd>!wv!BZ#=%YL|U0zxyJI38U7JX?7o#S!o(&&Y8`3+~{b!#tYKA-lSOW#|rcTdk@ z=3`&TCi&w(pni|Fo`6w6+nqyA&2-fK`lnEdya^Jx8><1+{;BB(Z`o)LN@t<;y&$dPVi{VKVlhZ$8wc*K+ zb$^0yD?NMGnt0)Pcp88H;JW=ALfTgmhOp1f=S0C!*e zhWJi5^!}m0V&Y}(&V8zXV)|o74^37?71F<{ow)s z0J~rJLjM34YyG0aI`QxQ-GA<1oIhvqPwZYkkKmu!yrupq{{Ru^i=MvKsW z8S?f&{kEh30L~9f{?Y0G0Nf=0?!WhKpS*f+_X$6{r~TXVy+0J&%TNv8h*aFhGG zf84(_p#F*e3H^%-KlZl%0sV^?__zE(*Z%-o!(G1zrv5*L&+iET0Ehi0z966e-&6kp z-=3lmyclJXRp?z8QmJt&kfn|W*crb@ryw6ue>SIrd8(=4NM+X}uAjqg^svtO=reyv zgb@^A_0YNcFWvtD2ztM%`m{A4j#2)W)d%6mxl7Hxu!=m-@gJw?y*^d`7D`*bRrR}!Iv|7%3*ctW!WUxDC*z_N>aMkh@ z9DIH)WmFWAhAZMvB1WZ$U@XHY*!L;@K7#4XOGSat~`IlD_E0Zr9 z%Xma1KNVWb8cUE-#1h99N|y>_?Y~hSLoiKQLgQ96GqGLpd!T`mGo0VZt2mlJy$>)| z!^?BL{G3lY$I|(agrtX%(@zWZN#6p*^5O$B0U)fpIB7p4insd;yd96udRLTW1N z)|wq3GhH{#RlYhIW?(g76Ta4)MSOQ*CXR-g2SN|pLHxv9CO|sfYED~>t(D@WuB57x zHPq=0@k+`G$9P8UN852zd6Ubv)BLqBFU8c(2~z|$)Ur>hc4hF=QuzcN_j@g6jJRC4 zTYBEn_*)hWA(;Wl-{4KZ5wW`9*_>IwZGbT*b~mwbzeUGV!sf7SEVClaivbGDc31+o zEm$l8*=3dhS!I?0S!I?14M*hu`2MSj{l@lOwHs+a6Z)DzBP+*^GFEdtFW7`J7_)=I%3|r55I%#yd912Y*`lY0@51f@U+Lh;X3Ws z-1U&Gf&#-<#NEZ@Qk-M=G>F&>&Mra$8S86KPeWiXc~65XGh~V+Trd~C48692Uv0$W zxFnNUC{$2*(}axU7`hh??jYcDQJsUU%mTdD2GY=fG?w|HZ~b^`O_Nh2Qz0Y6BNzRZiw zJZUd^`^UG_?7IYP6b-Kw<+xSOP5i$?zb7ozd{t#%c0*51H0r0LG;y065loKi20TvYlKzLK+uWevVl@|Op=4opH%smQW%`!i znUzaMK4jCaT(nJ4$rhEGIUO_>Nf>~11G5QrS+6e7m5u+%QYQUT{f{3MLcxz zm+=&d42ljmS!0dLvbF|qsr3vsG;k|aYgOeX4c8z+zQ&0nIhZtCd^wrq2xyn6>rQ|8&C0|xjSm0?CuYux9 z2ZA*Y{{Z6ZP1Yi@>-9gd0}MNyj>WjD z>AB#~Pkr`Ju6gLoa5Ioe9{0QOxfFaX(l9ZOmd0_*EdLGu!KS zc^a`2_fGk~ek7U8V^KStb-Zu0bNKc-HTFk1jvGaoq?Vu%vxJi!&~^-OqfM+rz99v% zzB*qr3P`2^6?os{wcn+qN^mqOT#o)&oS$9p>6E;Oqw%?N&L5dQmhBu1**u*I1+i+( z;?4oZj>{~~oCeUc%-YR`AUj+$&a|nmzR!)y&!lASe11--)Ha{V&#i_!yVVeWZDAK_ z`DK=JjetFFE>5|3jT<*XJELpMcaHXC76f(zq`0&eBHVV`C*YmFwy94wT8@? zRX0rcBf6Z08yp!IC(_9(sUiMySmMt@?ub3T_6PG{1z3l_L*<$pX5$x?sfH=49x}#R zKys0;aEYCi3~%avmL1wnOTUR2ep889z&wW@5Atf@bC2PSd~P)4_~}j~tEZ6v047-9 z+3vGk-(E|GkWxbm!X8Sa@~)Q9OEs1}aZuBMcjwig-D;nwF-XAsIr@{s4{C z2V^a)$CtDNj^Q1el!IZ>w*(pJZ+BmgR#cu7A(!Rqs;R@BwJa~8N&cq`_FbC*Shr{? zCgjEigTaL!xVYznIV49JhFFO))J3#|S5fFj!(uUeZrep{8IKp6&v%xPkBu!5KmM!P zY|YIU1oHBZx&DnsoO}<krww74-q-0e4V8J=RuWb~wJ8y+3_v%ZAS%RsJS) z>g8Q@t1FLLH;12YQQlTkHXzzzo8zrSsnLzhoTQ12?{RL5>eFgFlK153(|?IH7h`tn zo9yG0q5)CX-mSO3d-HN*2!lTxtlWiDoS7Yecy#C6vAh#)af= zea)!#31umr%U2yOY*k6!*!o_|8_{xh*Erg;nC!CNEGwXeyH?GJ2x@C7=@m@U1uSr@ zxpGIMjFV|O3U?U-pmy&`UH<^7O4oCPijPHiAtFa4{{S;nsfYxmaXF1uLHB#HgP&7% z-=5?Q61Z1G#h7(ctc*ROx4Gx#YlP~M%kvN!V1UTU6kZ(CMI@{avX~K|jQo5|4ZsInrkVJP zI`keC<>=0Ps$^P^3>f6cy&r#d?b0_EU@%7676%uZ9Iyx0;%bQF_m~T6IU>uer|x(s zX$FQO_|+9Mc0*X$fF#`M$4JqcAG?9JYd% z&n!W<{GUtW(A5~7bDRUc_9CfC7b4$M^ct0@sYARter%`6aj4|9LrFWIPxb!*uw>v8 zlCC;%BbFl`-tp*e@o-P2=4hamFv_RfY}3G$Y*tp(Uw%56jzD)_^4_iiNNJ9$cgB6> zVpwD0=xvI!-P0bQkFV#pxh*nf>w383Ik_!JVQJ-9l$OTUuBRyQgaMg@b^w1}rz{HF zd@9_$irjsPnTA&v&S4+M1sY+B#ht6skKR(w@t{y2^puYCk5g7k&exKMs1{+pF52Uv(+T7CX2G|4Q+gZRq-z-_QLf}(3BVhV*KdSy&tN~7o3&(ZdRLyqiVW@sCbhl{$2^H z9aJkZa~ufor9$_c8dPpg$wyZWeLOWVol#E|b42|$$07z+$5E9dt=01?)V~GDLr+Ih zT_p6=z_CEo$k~!MK*#2)DdWH=Bx}w(3tm}Tn7A%7Dw;Zq8DOQSrg&#G<-v*+Lcr5c zGHE4yz3o`)107QKj?bzcMzSa2$i6!PO3Hl@G7J?w`7ppBQ;=3=% zd*8UUFX)e;S)o5feFEKBj~nKeFxAi#hq;M>3_2i$pY~|nqQc-C+M%x zKVr=(`XlJKWu6^h$zS`c{Dbc{{{VT2!2@-QKj4qpyiTw~3rXMy2n!WRi@5`G5hF%tZ$$$p=De}N=uXFB z`#$f|MXv&v*{`NQ$d;SueVP9NX_YvxSB>T%mRePmEK;-*EcCNd$g(EoOmz{){k?H< zRr9no{GZjUMOjlQSQ=vm9MZ)K&djlwbcmqNhC7e|9d4JGV&y0y=Nf(t>j=y zC*v8X6OcqoVXl%ieX;nisp`Vu^KS$7yG+#l1ixC9j8b!POGO{a%N~;)x}LH+tVNP^ zBrY2a4_kf(UQPW{$M7mQUmiSb8vg)kukAZDoSg)-*Tbb?G&K>^PRlK zs#Ee38w7W_t+=`$@>+lKOM9GTueR~U{{YJ9f61x;0L87zF2r37&Nt{cR_*v3@&5pJ zl$@&Yv{RZM7v%h2MFgrC*MMrL8~zW5POOr3`=%?zq0Gm@w9wp8q!imus{r_ zLWa|sSi6&xo!N=&V2=&Nay+blR^j;GA?uQ^u75Gk$wp{nR)!8ruuCgc*Fic*-jXdk zP?jg*ammQ@9%kYEqa}AGQ%O-5o9ej3Ju#&Y&kY|SBc0pBo)aRhMmEx+4~W}p0N=5f z%D!Kyq=Je{Ft9@`lR^?nqj;p0vpGp)aVm!_#fH2b?|c6Mg*XM{AB`M*0*RzEcoF!K zfgvp3BCv4lAuLH`DsoMO>Tvm9OP%1kZy%DbUtzT+o1(yFAUs)9%-jb(;aDI`w1qjmHv(-sKv+@~|< zA1}X{IQ8b+lQjNZJhe4kl=R6xB>pdjq_ipFG*S-yO7WH(?r+igcAB;>Iw>o8I-X8h z;-_|!RfaWE(WxdBf+Q%c$2fL!2EnqZSkXc%BF3sSfT^;9o%R^84*@|@%z0PI{%qx`tLrPOVCH$6Xenk|Zw(o_ zhNpVRSRswIfbBc?mOYLYMc9j*^JO&;HzcXb3V8S`s;DbDI&LZ%pyU*VPXtg^R0oBF z7t<*26#$c}{aSfcK(#=YSX zhyrjjZ`eu1(Ma?%ym>S%8jusTE#VloE<1cOSA2{fms^nX#{R`GR;Ft#YihAs7V<3(ehO=0U0T$MK^mV-y2_~ zuJWgsIXJ1-ql|)M1Sw4uch%Mf7!a8e(pHaQlw+l_xVK&9KP~byQpr)r)5$F?DFhPt z)>VaiLE@tcOk=Ks#Am3m4?W5A9&kwb+SHC&qUr;M6vYN7#^YN4oeBf=1k zB9uFlPS@%ws>Mee9bGx`mRfY09N}6}$Qd$v0^PlU-D;00d2*{jpN^)Gq)7q*9Z*Dv zyBSdWSwH}3U`E+D(S{h}MTt>W5mi-GU;v{40q6&1fO!bK+053}ihgg9i^-aw0+`b? z%`nxshssndaq<@Fns$>J-x(JC#?{mP;c(Q8#8dKg@$pr)iw#|5aN*>hmM53Pkz5y8 z*~UrVCvC6R)zi^c!q8R06--WY(M=jn86f0kWCeCTFPX}DL(6=>BlU%69I;Mi63RyVNxsI}eMuubZhMkl}I>V_!V8N489Cuve{bUpr z@KCK9CSX+X)g+Qh4w5l~?&aHK)tH;BQ{^8oR#4JWO+t@PMgr47C7BiisOHjbj1^403Wh zmd^UgEuHh5%sx}{{Vf#KaPjb^JpK7&CELYujV4J8c#n)@4E-(S4;A-cAdWp>nhi*!7H zA>=uDT5p=-c?vr2LP~X5>4bHms-$@gsV|6pRFCqzqXV}64HuQT9x|dziatJ`IiyC6 z%tpC_HpNlfysCdd9X|`z7nD4?#?~cl9DEBg@=iSe`)WS!I@h zEV9c02>eLL$3L#*JuWftulnNrpWh#vD!2{`o|=+Iie5rigvg^Tk*LcN=v$z=ip#-= zsOzEW+DkPPSyim#IM1=^YB|mpmGo3{oP9ffjMY%aemgvi(&PUCiM+L+`R@_?x|jIt z_yfxGNM2bUMq`p)n38@w-UvW?AEf@x?6j+nPn@6rk}OkcdVP59{a$~8`WOBo;J?z` zZ|=%}<1GIGh25doTpz|+{{Rqhf9YN~_gp{s@AKYA`sem+$o~Lb{>`6-hnT5G`H^@307ldQ0IjtB8BJSBRtcw`DZuJtb&wBkl5uliz`U#GYX1N%^03xY&nm7! zmMu-9RL{D~PCb|Rm?iPyie7=y9AseklpV)sUYC{Ccx?8+!@uGhy?VPGVC%B1Im5|5 z>Gwuzj?3*os^D-uCMVM8sm4%zPwKd2$AcjFZ*Y2Fm+ErbN>+aDL}ia)ZSQ8BV;&-Z z2!74hZaRxoF+-D`#@%i)#X=55k`L;S?A*yBX6{dcOEpAt$s|T53$#)a!KRQA z-FU`4T2wn^Xd9b;Kbm&`0L^JXa)JK5B`u7{xZ%0x8_Ar#!xxk#a$SW zBYyEBUHbQ;*Kh^^dUUv|60&xVO1hVvqiPCtXjA-rXX-NHZDe}kFK$cr^+T#7=B6H z;dtXIWSz{iXTn|2#?;)Q#t8gX-aC%oF`v-sEP@zXsr|(p4%44Y;ndVT)h#eRPDirt za#a#l;wTppFQ;j^2OCh!s1D1BT-@+ute&FjEwGjsbV)_Y$*e|q&*r{?7NcZd}p&dadPqetPdOVM;|1s5(%@aN$O-OJSd{uI&}pnSM!HY z#`exprk2~BF^->^*_vv#-%dgF7lkvs0HZs1yD@yo`PZ09DlJniZX=Q(1bC??GGlb{ zHrpNGN}j`ZBJ(#G$q5TKXQWEPRx-jkT(A<#MoL5qolS#{wmG$&8*a~bbRm6M^|>>A zmgfYGMe_9Z5iLzrF&QdRV^bWFO(=NCX3o(NM%c)`A2o4k-735mSe_Z4FAXM1CP)OS z-eOTCbrK)R$m^R6PaV#o7aWRJN%Xks`ATZKiijc->ZfH%OQw(=qe(Q4&PWb3b4a@5 zWgVjyZoo_Jc=9=w6>|pL7`T$ENo5GkKqm(mVtQ9t^fCelaKov(3`)uX7&+Sct+wSp z_&6s!>XO~(mc5SUJR&3kcOM&+3?1&j9wqRy=QlCmp}pYuM<;bMQ?4x`Rg#pFx5EPX zB|$muzV%}2pmpuV@br~9BI{G){u!#%mptI$^>(V)*D08m^s^f$42DaQp{huucuum+#I+@C#KS@(d9|&f<}Ie=E{y7>it{a zbw{n#uc8m$jd!zE2|f{~vrgu>*Uz!djz)#D6;_cR1?A zjeI!{lX+3`m&stqNpFQbO>H_hTwk=Zm|3)|0&k-*^E+d8ZSf?^Qx6A|5Bgm{ zg35nhZrqg-iQ|hqvgh{hhb193fckW@joPBE4_zYi-nU@q{6~YRaa`}0@ zNm4ok5Xb!<@x}3RhCl84v)6XYrlA;=w8OFPx zCl}1(VUWw8cOJLXy_9fzI!U`KPDom?ZVH;Ug~FSdZf>_DOw!?#sOw~Urt#0>fpN)#`l(lsaVbCsp=eW(u0lKg5a^r=FU2 zX&wrRGziN8G{khC=Go9kyv%!VnZ-xqRsQvLeHYol!1#-}%P8#hxGXj)DyFTNyKua8 z&4mQbQjR;lHt;dErsTN=@dY0rLrWx^ODafY$?2=Ok$f-?eYdq;EwWnDYifm$TYD(525^IZw~axq5>1v2EV9c0R#|0$ z7h1ky3@77uO6K|8xooKHyVIpBqMw=1>Xyol1=EjRxL>JGQ{pyk7Oji)u%NJyl#HF9 zC)K>M-c9Qw@eu3uIcqD(5O}m2$>W z+ZLrA%aPhP>^Cb}soCJhduwm)NL~_h-ujp}TO!sj*F!|j!#l#+TkKGBQB=ki`>)g6 zd|MUS4piXXMok*&^)sejPe8%5k#BM?w-3oY--Rj+0q=I*!xm0c7`+q8=+SSB43VHY zHkzU@7(z(Z*B2~-l}-lt%ZfR^dRZhM>X!N~i&1Q<+qGw&eucbpRC5`4`RU@-pAssF zyhx%gyo}jHvvFg)off7$Z`U#!pr&mS=H+ zp_%);;BRF=5mQ#%uZA(XJ6}SZi=m?`vr4S~+}do)7i)E&Y`iT005=SyHFae{2@*Ct zF?l>^B_id6eYeoAIksDLXwH@xHmxtAi-J!W=oh3$l<6IBIlDYa zW~k1Sfo5JxqLpQ;CF%}1K$@HaPp#^rou*;l!jI2(3yX?Lk#=K@?4K6wA8n75()>Mj z){-?9Ei!?n21jY@a$1Yr1dLvdxkUAh5 z)b$pqsZBDK&PC6)nHCe^!*=W>%#hpP3b+$e+4a9eBPmmS>aHNp<<;;_t*Mx6>bB_O z2<9(#?Q!*mB?@;2;HagNne?%=j!^3Kx=RNHZL>vs;~r;t9Dr;F`H*t*U@PE()BE>+ z3H)W$Gi>y<+PZZy;z>)oBxM9`aF`fx*>eU0^3sOL&4{_lN4W~fHDDW=TQ^!7HWIPb z`R>4sr*3Yulte9ZeDG#(6QYsry7F<$I|q_Xk#jttbq3)x)jQ%CPCH5Ib1LHdisu_X zB=Mr43I;K?$`mI4y=;jXAk+qIY_axPyJ+gu{)h=4mJ%$<^s^_@*NEA#fyQ_M6!upYvR(+RTS!~U*27} zzRAhQuzfb6WNhUTrqs&x_bf25^s>X!#%{Wiv9t}dxv(YNUJ){mKpPGS#jux`7`N1o zuOf~-Fk#q5`ZV`f_oDpdYy$vKX#IES&}_fG7MXF%85y%5>%HaEQQ4Vo2xTAVo9Gsq zM3!RX@aG*R`au1QK_}nwkJ=OSX+dZSacdWk3Qz6L`K<7y{@ninn%En%^Wi`C*R|n4 z_Sduq@owYrWd7XNcrt%(YhX!b$Kc8Rx&Ht)o(!McoAX$}lFN_5llyDg;6L{12e3we z@uOP65?C%Tmv8Oze+CcYZTJj7&q?%0{{X6sW&o1QkHed`Q}hcw8GpAo&@BA`-uCW4 z3SaHV=oSd({@Q+lW&qi+X7S<8{j~o81#B@)f6o#9NV5rc46;iuKMG&%$M_<_6u;Y# z&@2qIc3ylrf3}~XTJYxn+J1pxWs+Ln@!?DTxxRsCg)jEz`US8zZsYLh{@wooRDQ*< zlJ?2}09058>^F}NU+t&(BGHat?Zkb8z&C;DE!<`)zqcQtSR#}AbA1B9H*WF~zqU8f zzxQue0nGC!^H6^O0QRnhSpI&{{WUzf0I-H0E%0dQPSvQ!3a;F&H42E$nxC&10m!DGfwoe)V&PrOw*xt zFo)BR5R^Jo@~^x>D~$Fx=Tbji`HDX&^0Dw9S)pSOiN$iU)>J8BqD5J%Sn1nx5@14= z8R=sYa)ndk3Zz@XON4`sRL7g<~2TBnvO@2$9ImY zr;?yapTl0)j=IN*RTuUOyr!N+W_cu+|l9q z4o8!UDJo4p9JLXwLr`KDC|euo=ve-aP1K|F#SFYBAIMZway0T)h$2dMqm`;EW|AQI zr-C6Px*f{NvS4o4Zhj%Fe6vx-w2G3?#TpXdl9C!z4z0R?$2lFHFOUBK5BZSO`D(0F zamicd)_76`tC^s!rg#NBjAZ#;aY$7|#5^|{$YKS6cX*C_jpwOM^eoNc%3+!*BWS0m zm3qfCYy%??j@QAW^Vc9e^X3i~zA894x*aJ;Ql2u*)1?(XWTK(oSBX=@o4KMed!(G_ zZl9NUTFy7?TH5gv)$-N<06R2LGc-`D!yGZj8GtOo5EpDdMV;y>)r8Vj!5L(f|7hU0De;Q*CET$bDW1MN+O1ist2QjjtYsY znuf9jo|w%W%Oe@uDI<9_7|}uZMh*0jo;Y;kEBPr!L@{yt4O}x*yme44o1?TRQNyko zaC&@im&*A+lc;WVQ?yXWTg!0O@Itc73f5B5!vu3tOzMhZ58<#}5)MXgr6=9@D^E@4 zsOfnA7l@CSkByF!iipeM!qkl}qcoo=fRZ0Nl(KpOV*}AqdAo_Pl6XO>rD!RBdA@2F zrwv94R;rK015`@G4bjF%RAgN`{{TBuHwDaB@$}Vl8Xh{jww_wLDu^j6O*Bs6tc8^L zZKvKKWNtcMxxXz{a{QynWR41Xe7neTPEh_TO;*r!T<1Vke372Zg0GG9Zz<)zUx1#M zjEK*|)$x#4$307mi5i*Vibjd)RU(X*8rM@Cmgq5*1JbfIb~>J1uJDX4}> zBB_CVKN@%%MNsJ*ePN8#5E>iOFXobM@d#-&cBzabqOH>P6D3x zHqFTsZ zs)1@@;$>MWYNhA-nwa#&k|bp)Cut!^0fq;7FMA9#Y#G|6^QRrj(^XVZ({fTr9X(9Y z)f!0!B}ak|d>J}EA7x3DwMBO~unw%=ec&OXs;;Rs(~2sHV63N>8AWA3 z%pbvNDf9;mA{BKbBL}Y6)}XIWMwraBwRFQLO4P<8b_1h;9lNd7N$M}lN92x7&`!$? zNmDN)#MHaZ%W@pF^F>8Ji0ds)dl7&S;piW}7w9LhuU>AJiW*&X(!*Cg^&=!iP=OqM zed$YmfON1K4=>Er&~yG)>K87GA5ykgrZI8S`RB{^ zHKG{atVbn7(!*TT@-H1c>PRuiRNsc|SQS%{rGXc&XN0NbJi+C<^eQ3aCgfhApL~j{ z3W{aX@eb>shr;=E-c#q|rQx_~Bjb-3#c~w&iB}wx8ku3IsFGTE#W1JS9Lg9htR0cS zW09O#Bc#54^5dQ)8D|HTtE!=;1_unYQ#(f@)G6L9$fXld?-IVZdyM92xtJxEh_fV9 zNdaa?K+h8teLAs~3<~P#NH^qbe(!ms$a$Wo32E2Hs7^!6fU{-_<5v$MGta3PM!LFm zBi_R2*8Mk>czHN4F3?caX*CH4^n#}&#+Sc2)wZw2E>*j8Xk>7CtBMA6kL5U({GcSnC;xvFh0masD zD01iS{{Wft@cDJDtEuGVfUk(KFskGpsy%LF?wt*#y6<2YtNii8@wJ?VEa}L+oM?%w zo*G7yC}Wfov$GG#$G$+=+?1Yk;kg=^p^fTc6H`l9PdxPP9W_-vAT*M~=NVKRl5V|6 zmpKoa^OTWE3pX_dG&JC!aigIW>?IrFOC3Y0#pbul{DpIHNbM9!Nyc&%Rb)QF>gdE8 zqg)J(jP_W7pNsS72h7yNO-S<}V$5bUzc06TBz-`NA7 ztN1a~`b6D7crWNDX5Rb<-};}c_-{`hai5NWaqYUT{L$xsizB=IKds~T7x6x0q>Nuj z%e1^zZzWF`BRfQfL>fYZB+1+}WN9Co==EEbzEIIDVlT$jNszfZhi2Mww_w~~TIC-F z8DiY+i~5j{9JQ6q=(zfR2ym4$t2xZI64NpP zmwj_fGiZozaK~$*UFEqT`8nyUsViyfY7HT&g=!W!=U%AkBue-{kje;d%fAPnBcPv$ zPBuD)rsFZ+VgS2I+unKK|wDyqNDuHYWant!}DJdYhy9K6M3bd$924Ru^IrXDsz zBGUw68Fgw$Jx@?9!#Y)dg<_Y9sIFJ$FXFaTn}j8ZN|;v(#xrw+{+wUKJ<4@{N9Ac` zZwjVwq`Zz>!gMT|t?g zw{>I5&evf1&Vm>y>EMfys1S0H@+~!0R8vnbjUd*MQe`^i(eM=lym$lONNK>vnu8P1h&lakqCZD0h<2u~rv8G(~nINb&qJ zf1+qJ@|5|;(84zV0OhUzcBVpSLHxAe`mukaXb<#AKlu><0E-uvtzn+;{*9AM)LMP2 zT>k*IC%~&Z$NS^|0EFBx{L@_3onz_mAJuU`^GrS$iS;QQ$Hs3rrW>2h#M{VY9R@nv zumf)6EIy*R-j*g}!~>g_(HC2Cy9APJ7+;Z9__$?adV4MvYRV};35%laz~teFygtk5 zE=8qP-)^TrX}NXn`$?4HYAJAbCxkCb4^>ES-w4%)=IpUOf9B#IQ0Xq+WF{`Fzk#0-=*$)s3MFr z>0{R#Q2zkpQf?@@m8owJcyZnmQDO}^Rx0Jsy7rkkK+_Fly5 zec0UnhS{i5v~3;}L6if))g zjf-t{2j*8^q(aNv!s(ue*?H1$UEFqJ+F|K_Z%TYcsU6!Ca3DpD;zQF_*@N)XNk5af zw&R6#7Gt|M=J2^WGIo6Oyzwu1_d|*Zp>T#pcV8a4Q#&G;BiG?^ zwXUX?O(U+X4wF5tlrx{#dZvk6ji)?T#S?m?iqMy0IPb}0+8nP!D2~y>wl7yuc<&-FA zr4w%=4{`NvleO96{I^lZLRBi#M>G*ohAFWTysj9JOuxJN@2(qemWy@T+IbqQX~d7p zRS`;($vrG;Dx#`1)NmSVL@~iUBqT;h)2qeF-|}ovF2lp|^O+W&s+;8{rHoMV(l;X} zqDr)qiCsP)o+}&_yT)XCERxHed$_x*SF~MjLIy43Kom0kI^4|@JjG;`;DMZcZmnb#H44}&tU6;C1eF|w ztDvS2ZY~(9CzenfQuh1}<7<;xOC~q!6qer)KIZAG-kMJg_m|fCQ94MW)Q!hX-718R zD2gm3oNjS=rV~R86(syUE!AY=xk84bbgW>Ws<{O~i2E(gM-<)Rwno>=c_c2(eeB;) zjTKCt{+nIt_18kio?^VPx&6j*&!|}IwPqbX*U^+`rf6i-x!(6fT4IcyWmg;D+l6Uq zp+!oexEFVKEl#jt!L>NW-6^!V2Q6;F-QC^Y-Gc}B-;@70cwXe)$*ePH&73vozW2U% z3O#h$y%}G*k3jm<39Lgh)H&AP+vKxMUkui3UXttRjH>~zUfzB8v&iI;7xwqy9OEvc zO~#o0eDSJ8s+*1!Tdheo525qDTdt=>8#RL;b5l*j@By(Ay|F=RzW$h+#r=Z}vx?1T ze0O>yM9s8ng@r1_c9Db^-TfluL;UyFv*kT3T*}^4JV|s~-k^Vf-_At}v1eyi ziRIk{Z&|KfPIIi^jWj|kSaRu7?%0uei>!A`3Lf2rw`X~kED1BNfYVTW`m2ZR+AFSVzSjeA)+!7D`({c+@Yo5S zSThC|Nc=F@zSZ9-seh|)T5h^^x$EuHGZ`D;UHx^qaHTNzQ)QNtVy|>h-CEhbg&s3i zF~qiicCw%Nsom7Dhqz`EHQ|2Q&ea8xbtZ@vne<`I`&4qDYlmC>v;dbq7t2x1*s zG&e>;I?#!g#-x`9>`Nol3Ki8e3CkR+_>Qq}Z=2f)mu0Df4A#!vabtk8B_;J?=eB0g z-wNBEYD~?yakyMOw5b-qzr;Cv1WL`dvqa6spGUHHceNeTtlHUXvB80Dgz%`bE=23) zdZUls+6uH1$AWg=iht}l96cph)$J-klPSZ->42|!IKuzh)+babqPh*5HlW{p8Rzmo zm7mZ~p7>I!?JBuXKQ}==By91#!M&W8+N=| zqHVt8vZonaUU+#{Ut24<=Xpx&rjz*uXHeLs^pD$lh|$|>%ez-aCBc5-%|HXA5BYkB zS#z@~k=jMX-0YHLlU*!k`AcBFgS z4vhyVR5KNM8N?mAP1~H5OEbD`%6fX&EFaR%_keY)Vwr@ph}Z;!T54b_g9PNJJ3BGa zR+Jcp1QQF_q!;fqGV?xjZ}s$F3|nTgTIhnukC1f@wH@o8yHQ^8MvDq94bhlC@^x*@ zm6tQobCUJz70k}6>9x)IU$B6j6Te}FW+OtOj?-d7v!xBW?{#h!Kb z)rbBvM(m7#NH|yNMtVhQ)-4@Xep&GdWgC4wJ$ACL0~GSz@{I=bt)6u(k^!-m8Lg2i zef0S}RH(etw^lO+DtKE$R5@-3Be+g{wi9%Vi$Uj-uCiXN<%2jRlF_98dI6`+ zd=E--OeyB}{nW&pzap#j#yX4N2;TAE+i-fN&^Iyd>8+ud!0>8| z$FC7a4BZ-1s7SFVnwkD1gaNS$RI7ncg8xCq7MlE z!Yc(ig%Fik{HL_#6v2;(c#hf(G4d6i@owF_cT6>PZ>?0dH>Q6414%?HOFm3-Y_>)b zv%OkeqiZ|QM86Z`{njhE;@Y$W`1>OBPTO<3k!PmFl2%Lco@}`Tkdd>nI zBf?vXp_CX=5;;v^Gmpf1^eZN$_zxIW`W}yFam&OAU2$=jEwJkne@f&PmdGpXEY)=T z^fj}_Nc_!X?*881B%g^p4&;ILerX*Y^J#EXS>0Puad&7^wU-{dFV5OEU;Xp;j$biKo68m4#O)cd>hPgS} zJmn+_idcu~1HM^=i$-Tr+m2q@e+*WJYnk-y=}?>BzQPS}=3fTYV#c8^voRS-sp-#E zC(N|J5Q$48Z(rJC%yz!80dtNwsKw}L(;x|UFyMn4s59jI2qu*)p)Z^FuF9EB=Bmrwt-5(s9H@=Z zL}_`cafkBcY_m0{Vddv8KW##evI+n9D%n%=bJkgwEwbO8^itT%qM4e3X{i1I@ePwSWRNwpq=Ogn~VYzmKP?QGX~YK+Cv-g$y)*KH6S zD?0#X?*3cN=N~@ps?`fG5IXF+?!WPsH(nNxo5TyBfqu+s%5}(9!8Mr$fSqtji$EZX z(HA*>saX1l1T%Z%HjPC!*eG^w?Z>3t%zs>Y!~YnlFb71@$q-r*wCl2u$38x`q)P2j zT`SzA3(jfI%`;tkC@++ZDl&@_k*LU}P|zwD0oJz)?f=C_mY7E54XR#8p!;&w&D$d{ zZfF>?dXOym+q)IMvHx##|NsB$)|n7P4kp`x z^p7;MyNCRr=?S$mUA3CtPP*x3XY`?yiI2NjSqD$ZDff}EaEk337Rqg_Kp;9Qgz>y*B#Ikll$35v`}@OOq$7&4w*=>(}k z?)68EWQ#p0#r{bWfZkH@AlGs?YR?@7&uk`Af*oONm#>rPUJ5xyC}3}r;WE7wd2C!| z=EKFVzUC2N%{G$O+YIG9cOz^+_zJE+w)yz^3cHKAXcI4 z9I$vK?%93e`qP-h*`v%Y(SZW0+ECN|F8yg8vU4cy@e1(D+8!qF49I90@9lffw<3CF z{XdO)c^PCEx{_N03Z}ZxsD;QBck%w%1KZaqcABvVf@B!vCB5BT!nDj{?K1OMJVLSJl6+>UW z&S4Hwb(E6HoG`Th)9Y1%rP_CI+3~>OTzH%f^2C~*_GI#0l>u2yrG%F@HcRi>plumgT!+!{hsp@X1C@_XmB}d>WBmb4pEhWtOY_b+z=sjUzb(;Y0>ImeKD11`cW-JGP0x>2d`;tthfZd37U2~{~<*0eL5P? z>RWwej+yu3=$;COLm(_ z)Qso3&Ew|owea@pIXBbTQkf}v! zd5vA7$9$OIw-hrC$QeFg8g=yk(g}9Q)qv-!&9>cgFsYD_wz?23c>@Fyc-vH*)NwAk z=B`Qy(gZo`yu96EIDVN)PPDEnw*38EjogVn*Mn-36;2;h=ZG^-!4=W;IBDVQ@f;Zx7QC0f zMLK=5!NOU3_spBhA|4Z0pwnW$hZs@iNu>dOgRDRnt#=MOXBw!jM~M z%M#-B4m}nriYgYtTxHdUx_GwN?ip*Xmh{-LQoILD1d3uYBqxi})8lGuB-7oh!zwTj z*N(%7I>mJck73{aA~!#?O-K7S7gZxNwj5Bdlu>q}3fOMihTIXf_PQ62T~IqQ{(Z5{O*>1y#gcW^xqd-7h7)wiu0pA(#@!% z{^Vf<5b31`HMMaHYh*_GC9N=lm-)7D^!Uz4Mh$C+FLgTUJfnl%f(=+Il}`$I%$`5t z^I~3Y3V1mt!u>#j{~=WS`=fnvCvsi0J!>nA!(k#}&J6MzdyK>I_M*mcl{s23+JS)|Gq0+@%nrBHp2h1Q1~r!52FUTv%OrOzl3W?-Ky>v zdx&Z`XOz}_y52I89WNAir~4xR-T&x$*6i*nB1r(2wf67v(o=WrT_`b-Lb&eSYn4>< zaPSSf*Xi7OYPk8)ltaB<$XW7g04G02^(0DbTRXV|Kk(y-7R!Ff0j?j5@qY;C$b}*; z4}fSk}QFoEGf(r*aW*Jw$ zl012z9HTRt{cM6uOJ-yaZ?6hP+@DJ0R^g=n`ah#0M)uB;70*^{hDSt9FLH43%l<}8 z>4Mfau|M}%Y3%eT|E<)idw9x5Nj zT>}hxr?~P;+y?O8EEN`_SJQ9adZ<-y?y5GoS*d4zToq4Qqft$N9&ea&;Vk%{@v1jJ zuQGtmO5kfuAz7o-RvOKiyA-K3ef{zL`YB#GJ<1#c&&HD<{y*<7d!OdnuA=kkkn&#Mhrl0FaCs1Uh^{J5fDYn)1(8o_0Y7z6gB%w!zAoV=_L$HteO4QkaL`BZb9TGFY z>E>tZbF}PA`9b%Yo3nfa2}E=J@lrRUkwEpiJh6mFwP2`(kFV>aY6pB3+ZkPg2?Hegi z==WkIOO(S35gw=~Qp{!HkHYMM<(Aa_TpzUEYXdW@lGY_!lHBXWsiWQCXi<_`>e`S~ zgYpc*^qQ*8E9Z@8f9uCW$Fxy}-j?Nu)d{Hoc9X=d#nY$)DS$*!KW})qnPm`}gT+aoaAsd}q zxzJlH2_Qa$o*8K+i9EO-}YwtpAynx&1%7)NPBM;MJ4tq z@XF@Bb+YKQ+~IST)A21_iCqys*~s{QVR^#YiD9-=Ek7-K)GJHAcpg^ib-_dhI~>5w zAcV@3QhNFZXJXR3p3ajiAxEu2#TFNX*-%eG}4^>CnqXTmLX{KCKsf4cQ~0@^DX>C`NgO>l($Sk?zrWZh}pYVUkESU^M{wCt;+ zH_}#Vu~r_x$S7?P7VGNvsE7;=s9#L%B;t5VHC!F7&pp_`-RE!olT4`lCSPkOyPAIJ z)`u_uZrbP_)hxb%kHm*ZE67l(UV?n&38dCTJA70?z;%%GDV~>z2sjxF1Sk(tNnaM_ zB_=QDvKHZMNg#SbR#Z$$tV!b_>i ze<9nuWJht{+twe`w+cFq@J{=_u7~$o{$zL_F*x*Q-v01Gt9`{mwnOP-8Hv%C)$cY1 zkFT0Bw6* zEe`sF%Y?K5ekSjpd2d-_hCt`bCXLUg!*6z%rWQ_F?z{R875CXcQ#Z%enh{(t zfX1Z%5Rw~2e;CJkszly2tZEfZ&t#%00*QA&_^1dK+LagNT@MpNk5T zTw>%o&E2Z(e6Y31<=y?5Ym9$0NPh&8GXy$O7MGW$+&7IC3xpvX$ zyJY=^$7v^UPXtk9`Yta=qlxUq^Y+IE5AE%5Q|fZ{(*N$eSC@ThT!>5{bI~|GlhKbG z2c#X11qK{AQbmx}>UIFslcgg$cA?hX$pHOW#UeC0;E!EbcUdvias?4Lbo|c%ve`e} z8YV<6DWZmBjODb-0rBYtU;qRIC|{=-Vjt9z-;%wb&IJC&xGorhxGfh|A(ZyHtJIo%>yc8CxiYH4AP3_R#)NE8lS>N>68&dU_Z(lhW1LTcLibT8b4|Hr9#sJicB zc85*Y4VCHrbe<=f+1_ot4#mQUexnoPm6@i~hS;cDD?GxXW=h;m$YM!?_&*ZGXqE82 zG+H{Q)Kp(PN`r}}WF1Uv0nzVt8d`T_77Q; z<;RO=99K@sNV6!XJaeN@EkNpAzg4Xb*mXkI>dqT}+pDp}+comNRMltpx7N3^oh8yu zxbdj}y3XP)4*7Cnb5aH4Nr7w~@6P7Et~$Jc5;sO`qTRg^P|8JmK?`;(F z^O$Hat}pyrFucp4--^~dPdyQ@JFMFgB2~F$hdXayU(*m0besJA{=6PwoJTzK_?p1S z{_p>aW^+Q7cf>+55g5iB2!00PEc6yLp%R6J@tgV9*}LvEH}o|)NDPC{Q2J`P~l1P zqEJkKlrGwuZJZmKe3<_y?du!Ei?1=q|C>PfZ4}5f4kWKmZ^ImtL3nY=>2c@DKGR2nmtQz2BSCp*R;{AHf!(OgwnG_nG+r)Ra(k| zL#Sx2Im^d=zQOxn^l8fsS#vgaz^E9v(g6QbvRZQqx)d}x$IsvV?&Iv!VHnxX6YzZa znHO^4(E!zz^^K>m+Y5skA7o8c9w5^b`>h^KDr-co0u^+xW%%VTu(8i;GDbNvB$iOp z4%FvHsnK#G`qx)``Nj_!9iF~1&J1Aa57-V&!y`W7V#NsEh|IL^9qY}WOedox?&wdX zxvCQoY04<#jHk1Rv`F}7qyir)_Qq`MBou{AphR01PEAF2YFj$=w?=wmb)VX5Ubdwipu_=YA5cLw`pCA&tx7^&$ zI1^tHhAZhrs&K)S^I)#SL<+|+Zkt3_g}M!VX=9YnpL?;qcAny#i9x1yas3SH1d)^P zruNLU#K-!FW`ZQMjjJ*@ z)7$C+%tV%DQg`_(yduWtDpk;#N-U4ZK?-KenE+F@f2asK4Koo_((j{_=XS03OAa5u z$f+k{Q5lFt%0m3nU4{kept%5XUk)T%N0QNcdSY`-I!>`73AoW2XQ3`>?iwFx>&rmHKX2y!h-)y9w1e z+mr@fFP}+N7NN9YAL<}kujU;7UPV||T*TSu%$*#0Y}2IE{rDBJyhzT@uuBTrj1&LES^b;`KtV+>s{i?66Rn0SCBtl2n>R zywj|DP<>KvQ)OyFxo{39r9mAnXROImbW`$hK`74}u*;~<_;sb{AX3jQOq2c*k`q!3?b+IfymB z9LSfsQEls;DWXL2na@BDg{z_;q={UD*stzLm%}gMOesSQ%W*@^aAHX8no!(G3*LH| zWLMJs3+&t7mIGw(rm9D4tvK}#$`a701nU8);)=Tvjyq*huz1nD1^tB!Ov&%NW*3#d z2)7bR`H#9xS1+f2rw(HMLPD4rWjyKAq|wF?XsX9;aoz=zsJtRL#a$tB_RgryjN%cf z4H0Uq^?j=$G;@cPIG8YU(hngZ-Ejeke0Wf-hKy8%T1uau;}Cy1EC;P4kLa*~MVzzABx7LE=E*4CZ~d>tj8&ps zku|l6hNj&i&B2`W{Jq|-9&ro@jLn(2@bgCyUvWNwk<{#a*W_qTNwTyedHmF&2D{HW zZAfvp0jVRpV+qc@>(-eH(*z0d zCDHJgn|3-;J343cTH(aQN~35bThVUF$hhjsicI3pkte|;z{pO3!SeVa^`Zl+3Kc?n$*2(#4qbXY2d zIrJ~eRBt##*B(m8pUIkJ{)lqyRrUMZwk$Dg4z%fp*IrXEIy3FgV%468`^ij%tXEBc z3G7F;|5>QiSQG;*Nl19=v4>tncLGQ|bXo0$S(7v?p|@CksO}Ye$=5`ZeqC*&mvr1a2*Jb^^VyCx@O#>=NHTxeMj&Jj}<$Wab9@ zNr#ilSy&!yGf;31S(>B7s-&8*Mf9tivrFP=ksje~Tw}q-4jAdd4YD{n|D>=%V0Gyu zr^vYJ!m$j|VP%=FO?e^&z?0W&bBoNF59RZpPD_|5I5(0X$Smc#Ep$d z>`a5)oXo(I1+CfD5N=HYQ44ia(eDZlS3%72|J-Vi=L2~WZ+N(A$nOopEN zPJQ9!zpeYFQlgQ;F){tnb!37Y8Srv+ZoRoa;n@BsGal$e7ZQQ9J@~mU6U)09xEYft zR7un?h2xH{soy_L6(KgHnjbSLY@#+7EkzZUZ%p)n)@~9P%i8ArYjn-DdSX(@_0mbX zUya1PgFWx@OkBG6>bnBYC#56heE>qlop4%&Zd~JX$3h(DP01o#jj-u;LesK>Zi1$s z2Ykbf_X2_F)z_Gy6T^K1}P-HB7=gHTdpm=h2^wC7hnd zlfhaMq_C!N2>^Z*->Y##6C%hpmyE(hb=RfE$G>r$Q=PaPsF7jp*`Zg*F(HC}!D;{U ziT69nY{naD!ypE*vZu7Sro3)kpQ@pF(gp|UF6j1JIeB4gy5s3biGxA56JBrC{6(&S zJ4Q>4_?8=MfZ=`m2ULo!#{G8 z^%fgaY|7{sLvvdx-NH4r6f35;m>dKoEsG0gBxX4InQ zHSm}_lXeZ@;b1!7g-aZsOU*s#TyLWiSnFhn9e-SSy$hZF6DEo}sCZzfd&swmuQ59f z5tbPmrqj?W!7^f);n8spR(OaG2zcjYpQxO;mYn=}JTgc9aD!tI&gmsdxU0h)o#FYeI|>HIVL3az&;I5nyJ+$9(Vdyu1e1 zx^JXfGO;fhxVH%T8R*AUkf*2WT+6_s1t*Ce=zEcx+ldtD*eQ{*sDd1CGBNPWF-FG$ zl*2eW?b^Zo@53P0b|)k4!)_>t;|@5|`vQF>A_yGiy&~)|9$?o9|`4rt)FtQ5kmJ{3XU}^S9O8 z1~s}Ny(Pll(UNCS-d8H6X)`$h@)uW&)0}xXpsMi~E*3(Sgk3UdYLI>NT_gEjT2;+} z7n{f^NaZu-$bSfYylPf$PV{i1nm7jwLyILuVgqE?NwgxS`~!w@=I6LUW`YXR^GHBi z`^ww>8gJIX`z8G`{ce`Nzl`|7(!jHg+!59)--Y?+?%gaN_etnSlacJhnNu)r?e*GR z+A*_8U{l#-usQwXA)N|&^~RQF7R+vQKknA{V2<*HJWPP>EBpV%1}@fv1u zsE2TpoR+jeYX8h7 z+qrsHe7tUyO2;SO9u0=B=-j6@|L-_HhRmwcGOcMd==H<%g>$^UOkc}#73*$Wf~~;S zD^v@A-(@N2^+cCM8oa&9M9Mpwdn-K2EPWy_m|-52{Q;pAc1 zP9K96l%tzD!S-;^J+sW;cF^ry8l9$T;4a;`zm`gCYkMBy-&^QkDRoGb?5r{{(Pebo zQK#oh8!VWUX4m@mtGwT*K^jhvQJZ>Ao*v+g*sVwrt6SJzxf!QsDdevg9xe1p$lnPr z8~8D3p*teR6_soBiR2TWcV*8w`KHpZ7lG2=kVWF;{}5PaLH-dM`&lh*h3c@Z7QVAg ze!9{A9!>JZmKrsRGfXR>eb3Wr^9`Kqz?W-*h`b${HXvr|eQ3@-bcNs#ejM@mxo=)i^GNj$NrZP7wtb@}5#Xy1Pu!IZ_ht+syo(lE|hZ2v| zePTbUXz|iMM#4KD-=;<}g=r&)Z$y+1KKQSt<2&4d^6tCy{Ch?Tnhw#sh| zX&XexE1~S^tD9%?Rmz5=+qQJdFL)w{L^Un7A8~GZsVXUP&8gx&_^Q%%#+%GI3HXNZ zaguc3pWS?2ET5E&*nR&h$m!UxFpn&^=VNz29PUsixI}_sXj{}@7;npsm7b95t+v;M zaCs%njQGcs8?(&NY)Yt?YQ=#)ZG~euzC%+@Eqr)xquX(Ij5d;cggLd?4v;O(tXuyl z4Z%&z?z?J%1nEk--5y6AO{_Qbmd<#q=TI#soPpDa8#+X>p2Xe}LfF9i#r%e5yCZ}d z&)r~gV*J`rC*C5tJbHD|>|ZT!WZm0<7V3E0N_(l6yl`xlAbJu}Tc}2Vsgds1hx2dc zV+lg()1`xOrMz+MfG~qh(Qv!t*M45^!LYicZ@9hQWn1o?r)vRETEfXkk8&d|Izy6- zlv3|MA5-eT^PzDSYvnV^5z=NS6hUEebp5n2e0!}FW>XEnUUCF)s9MOw7NT_ zHa7J$s=*0e4j}0=0NQjGn*E~ytf-{I)5EGS}9+5L9rP86pDc9%Cf@?8@SC~exw*5xw?$F`k8~n_Jol+5tzjD^L^q>!z zy;L^h2@D+sCh4X;fp#qp#2NIVQp)UDd;zsvg9wRv?&$bf|M0YY<>NBskl1ZhC#0D1 zXo?@wEAdcxUHA%JRe|PLMx+~!8vgW722`n@C~}2j<=b@10WUOzy}W*T0i|))KG*@f z3G);KS3C$Mfpjb44$sBX=g}qmPAod4EQL{(C8=KdV0hlD!A~?NKcZIaVRHoO$Zy3X zLCEX%y)+ImT!OLik6CPWBB(9by)m1U)& zSt!6y(n~!0K((jq1wH21{{JY&3Xz-^Py6oNGy)F5&iDf|$ zDo=x9l!efPQFn-otq5e6EG=?e%L=cG{8inZ4Ireq+?MDM8G%pI~byM5lcC0<5Zo3CBt z`b1+BIp7|Jg`WT5ZBA^rGCb_uDxg_S6OYjnLOb&ck*z&N_YEqBJS)c#g?QgC2@`gH z9`5E(`V-@Ts4}OI40a{p^!n6fKKZh9^TZVvAAuor&Y-%NcGuq^E>ii?!-Szf^1Xt zvdyPT;}gF57ik->j3VLH@wNTDY2Y~Ck&WktAlF>~wv%<6@MUpwag~SsHze{_bu5h!;tg^p~rg`XYYkroWPlOCyTt@?cyH@ekWP>+rU? zUSUj4Nc0?Zx~fP=yE$$APB2*BhNi>VVV6U?pPz>v%CLtGvp%DhdjT9V*?p-IkSyBc zr_Q$^IqH)e$_yvzo%r)Nk^5r1vooNzMJ+nq;LYLH4!Ivdl%1D(-l$Kz6BkYJ6(f zcVVuVm57Ys!`v;W0x-0y$!-f?o(yR9inIUTAz}uK(FsKAcdJr+Dqji4K;c`gz{bcn zs5@AYR^>VpM6xAx@Ta|Aul-sj$+Y%S3>e-0c=kYZ7W#&Z13C#JEi^XY-YO>{I+ym# zx>&;i(&Q~dc|G}2-X%Py+6Vu8Co0YI%}|mcd9dK^ILU%Zp)BEvi22#=FwBQ$;Mrxk ze+;ZP(nU4JFB~XEd(^IolD%=VlRByJ&){$yNUCr>GgDFH60=%=wddwbFn+^eJo}yR z*-rTViJGEQ@E&Z>W6t^lW)5i$9>59_z+Br_ST%LS-VU=_%*d{g{CIWuGYeL1eax5?Hh*s&0>6x5Z;F4C z#QccP^%rBrCZ^_wlIl=q)+u|@xq#3bJf`+CGCDZ(z6rFt?L3LjJFN7{;Koe&-`U;9 z4T(fkV`>o$!0O_rdpXO3z0i`^I^aJFKVlAN|A&CfntW(2mpWp=!r%_35h`c5G6^#W z(~ZcH%u@jStBE(3&fkC|4U_7Se&59aBPDu+ZWDDWLO0$&#Q=31TcZv-xT6F zTF6X_XPx#NmSS?3CtfK^)$a`QaF3I8JR;P45?b=Fa`Ug(Gl5CLk%V4PgoY`RYGsZv zXXUFL0GyWDOCgyn5T#8JC+NGKw#kZmogkE`CT*sZDHk3_p^n84$tyvK34js)91|dp zg86|nYci|kekN1U6XKoM7%vuGlpK;~@9ug>({1BRfm8wCrI%@`&Q_H6G8>RzI-2GRUU%9AR-OX(s67ln?w+fmMaRqm`SL0k{@J6A|-k0Y!YT9P}Hi< zk+a#XKT3w8#6?~>tEho|UQjfuoPLdsQ|omQhoL1zPXOl22Dcu(K<_WoP0e5BeLK1w z9mO<(S~VVum6G7Tb!k$(sbhbyu0JPpreAH4vx7Lb+5yEpR}XS(@Q#$+5kA1?{X}Vyij&i3F%;K3l3RL37Js;4*`%G z-hoo`ePD5r>OgDlXKsNP6q^6;x2YqRX$E7yyZw@h*2TN(p~kq#L&`$4KQZ~UT**%LN@X0xKkiSvljOC0vg>xo$zrfM+&RXy>a84Z;o zQ!HbXqG*V?P~W#UeyCsUgX`C0a*i5n!rw2Dp<^Dt6FZOGL^P+IM113fC|Q4>F9R@m zJ|NR{H?t)BIExRRffSaU*EV*Bg5UcE`COLp@~HSin*{JSbMr32=p>2LQzmCr&faXu z7FLb|S7{$K6fmf<_y983WYSXAoDp(L=#E-rBZ8UHnV6Uh!y3ft1JQqVLP-{=UUxgxX5}V;X+61wS>fT8jsC%0o?`cloOi2_U-GnGC zu)-peRkJk0tM=tPHrSfOF_NNDN*?RkdA3txL{n8m{o0jPa8$0TQ0P}9&Jd_gIS5}C z0;vq5NN0D@&E5^lMKoro(tajdOn%7%>W_-AH? z_>}`!Ngk#G6PVl=F3qCXrhc24YsD|9C@izujs9_vYJ%2>gusWgG>kxuq!(*H;fSQg z@6~7B@e^SUqBkr>Mnp8LP@^QvtZw-)S%X7MDTSmFx*N_H!61W$^m9-ap_Vj%w^*dz zMw=o@8^=tBeT#!JQ2B`s+2oREb=b|SQ96uSV^}RQDCt7g$~I}41((z*zipEE20T9K zG#5ARvr9{&s?%J|cm(mqI@U7Rp8lDt*6D}qW3^_-a!3gzo^nzg=%(VDd9(ndR1Y#~ z6^)YXv8n30*SU+GL^mD_Jd1L71J!UONG^Tl za6=^V!(|O~x(VNx|7%lGchCP|C9e9&&s0B4EK~tx*9LI8W?B>5AY~;LNu`2a3e%W6 zSwF=NDkH?`)>NrmVMZ85y0-j>K(AGY6P<`=GD&)ykdSWc`@yjUn3^nET2kz+3Nxcp zUr&@CvtJliLu1C0JuYW_u!@fY!Xr3uZON+)nvm`T76xe~Un!bKS(W!gC;fY&UvsGb*|0fn>Zx zq;iCXW!8@!;ywyf%=CY`e$s#YI#}fzuMr>XO8oQLR#%~(QDG(qXV+5&X+I97liC_FMoIWscg6+OQCqShb_S{z_cRMaWrAye53TMoR3Vp^MNOyHKU$`x;V=Zd1Rsy z2@TV5*(uS$lGJ}8KF6xq#REWHaKvv(dnUCuZv7($>OEAU_7`c0Ms_@yd+VdH;uBqI z(V?tac)@3rgrKkm&@`i$v{)}`6T;fWiWn8~yYzspG2U7*Zr~RN)ehA$>!po>w=W@C z31;^#&WVe(3BfVor{x#Vy@Cu+01g@#s8(=>psM=wxI@8ZCI*H;w*4n}_gVPyho*p! zPdh;!qFxVTTTHePfEr}hg=YDkQi!2exXmFg9vvO$l@}Hi75X|%Vktz5eFRH=DMJj3 zHDy~))Sc6N*u2)ld2;8+w2z97=K!u>cP)o4lX>c>fj#GRp%$Bz{&T%)-)}RDF<~^og=t*V^@d zZ;++`OB!OsUJyOcbXEiGEBLjOIiIMr220x8baUjJ;F@-9LzKWCR-vUNDE+Bdjgn~k z*%fnL--Kk%er6W}0HSMAgqI6-k(XhOn56K>Hvfb&9u=CI3HPhTrPGtxckoA3ANwf@ ztRNSo2Po7lKRhBMU)KK`xr@}Rn@^aJVHnt6At0oGr=cOE{8_c4#Ov#bV@slOHPWgU z;k2f$O0o4fKkT9rd8haib{H7VZ&|ILi zzoeghIcEC@Q0RH~ndq6uZ<9wxIj5acC&AoiNm^Dz@B-PV;7X&8)o^h%4l+r;yR~|g z@4}6!TYb;bNxWT~(vD5js<3~=+k`SiXVan01z>8vg-*rkLw>AOew_7GpDCD=*Zov0_j8eRgjusBG*!4B=X{fl2G&g(>Oqan8NM{!d^b>^;%37BOi8r& z5zu35Hm^;Vh9rApsH)f|#RQ&&sIsO&eDN+x^&B|3!jtyXS^6eO-H<4zut*1DE{<@! z@+{vpUS|+6JbOhMFMHz3n4eE6k1j)kTz&ygl8mgmGxFsf0ZY46r7c7;Rd~WpsBMS0 z{_4R&wwL#c6=<>CB$S9%t}l0$KXiC?I)NqaLgf*oz{2W%tJ^z$m&P)?Q^v0eM!OYm z4S1S8Ph38xvWV;$vBJrtq(8j`tf^h92~48%>x6oZH6V4-VTmL0uvSL(-){_wlj5!A zyFKFU5GABl^h$=5l`|JX>k3yU-lm2Qw2l)*II!RHgv7DNsuT;xlT1N+qX-a9nDuXy^`OdSS4|UYl6CL&vx|LlRP1vk@?F zCt&CsYZ7fzk)HrS{iiv;(Wvqk&KUtoau=JZUhqgT-^22shYr<^d#96wgY;Nm3ibmz z@e$Sycyg^~X|vB-!_}igpX^js1dCjk$#8|}iSUv@l-@@1mQfN&$9jXs6;9Q?GAw`~ zVfmrdV7<&W`{js+TPO8dGflF5QMI4I2b+#=LjEoj?b0Fa zhB}|=m2=g7g&V;LBliY@1c}M^d{;r!L|^3p0Ny|$zn&CDaI)Vf0ne@GN@yis{9(Pf zp|P_B{4Y-qJ54TxB)N)Z3XU9MnlcmsP6g8w)H0Zq=k@J<+zkYLE`>)H!&H%wy}p;6 zn~y__Riu=8tmd*je)uEf>t)NCTPq?76ZDAOdog%)Rrhm?g>OC1Nk!+Lrfj#Q`dY?5 z7h99}C&Ev$sAMrnr{jI9YN+OnVDEfE@wp(Wco-GB%6MJPbb5(tXYzTA>+E*yy7b(H zQ!jafp4^+8TA0fz4T0HrwVsT1G|moil9Gzc^BVftd^t8aH$-xvmt140z41Yd$n7GK zcLO(~qQwX1bJyz>>aL=iVH;y^^=!8&_;~E|jmlj83okrSAJ@EcJzMN)s?=Gdl2Frct@Ols=g7TL$HPB+p&pk)pw!YoZjvxB zqYsOWH)Xnr7GxlgWtyEghc3DL1(ZViRk7V$=P~G2pr`Q1j_;jA*>XQ87%YI~^c}ZN zQnkau7&y)c!tK-0(s8kgDrH$DBRV||=D6U+TecE}cg1&IJWVs{$_ zJ9k?rXCIWknH$+O-w4-DrJ#TKA1RK_&*}gjV;?qw8`_e`|tOxDh zkz8Q)YJ_U3D8(G!LYi=JgyZ3LR+3!qznc4p!eN}L&i$8&>M7*$6%|j1A&Ikrh6s#$ z{`_5S$<1zwS!VX}>|>9Kb0CD0*sKqw-S~XyOG2Xr8`dGRh6|6xo zBSOp0t9iCi?yY4pY&2Uq-`nuJIknqsA1sqNx6rRoR9FO?xggsfw`V(g+)`7lo8y05 z%6QQB>K9xJDXygUTz@dR0K+%8M|bJX$zefdmRL8?ugOQMmP6@_<96SENW_X);BSdj zABQ`yp*Nk2C)W8~hl3QFV;H?RN=WGS32LfI z_>tQ#i@Ay!8W$Se>B%S5p40m`*NUP!&}bz5FNg^zvgLxRT3>MEHnP!I-rN15X`>m)Kdr7yVvcy)5F9;)g7DRET6NBt1WEux4cEitoHBixVGyTNdBgm zdZXzW{-wHjc-h#3uAlr@&+EBkq2cud;R!H$NY3N`02sQEK{V~$82!7loNS2d`j1}l zwO!M19St=4i|y%KYrB8gbd;}#6;uE^V{8t(cg5q0L>8Y6gq{F@G{{Z4B&Ic^AfAo~VerRp%o7*y#9dq!y zQg}jTd49K?7^*ob-XrhF62(oddU%jW9LxPgi}AL!sZN8!lR(_}k7?`l^|`fbHkve( zW*M~JL6Nj|F1d-4L+~QdkCq)^1bi8Wo(sM54J9!D^&7G(W%*3k8Sj+p{GV;8!8i=DcbpU^i?p*@;V$bCnKgTO?1hX z(y}@{H<@?q$yG)=@0(x?XB{mIXA0x5QQ3fP;>(#!1z?(*so-J0N9w+m6RfM8-y<2l zM?8^Z2WwEiYF#)sqf+Z@Jfp8|edYGu2sty1J>P}=MOOoC=JwpAlRBexYvGV~CZIdVdmavGYgDJP#|-LN zEMIgI58GyJXH9RRBz-PI2p0r;kFD8fT_ASi=NQSlmjre&$hTp&&~K9-7`-Y1VC!t{ zX6^-yGOr{^r*mf$9-3VA$+MEn#ie_0YG`~4bY9$N>AYMUyC!ZK)H!x=as15-c3FEY zrP$FVl0qXllSfNXPm2UnU}tm&_j`u)@ z2*b5TGoM@Q)NxBLbnTm{{6x`64`A)I)=mlOb#b?URgc$4gN171eq?Ge9S2!_&z`R#2;t7gvQ}A`JkH zej{sQ7i&$+)i&pgqGC>>%{a`GsP4b>djY=3KGAWCs;xo3q~iLM{QLy{hvjp0hFe-s zuBj{HsakbZk>Y})7~M*=Lrjt=k=tdMNge?i37*}#bV2KQT3K6ZB#1i_dvf2d?Nrus zQ^IM|o(?%!6?TGABjEK2!52n*PBVF@jbVXeU&$EtHm0(PloXZ@bdZ{*@S6!LbpBP; zdU<2n)PgUuS4ZRFkmzywL)Po8l2W!RqYgT1#m|X6D7V7saO!k1g!f|^@;Rb5{S#qa z9mYRh_JUJN10sz(f7x+OLXy-g;Ay)3oRbX#n^<|sxT*kGT#L76Mcq*f9XSNuZcedj z>6IWLZPMxSNmpAre-MB@PS%u@IzJOmn%HToj%AF=?A?eV4hN?X;we{A6sN&Ajw2*U+s>l7Ip|FOO3Rg|JtDjrtUB?)`2$ ziYO|9EVygO!b!G9r$VfYlzN;Cnuvv&bJ_^{ZPn5}GvJS9!Woo;Hto54)t<)_i>6qY zRCT!HqF01tY_-i-FM$g)4$G#Kc#(6ng>rtc=@ZtI})u!{#Qf(Nl*SMZl9WI=q9A6lCoK8#1#oNGo%8gVU__`nR zT7U6tdaJCYr0{-XWQWF+!i=+M)h361Ao}S>IQUzi-u|XmB`T*E;rx~yrxw!p;ivo0 zFIid4*HF@@i3p<{qeW3zlvAQqQ!O*HOljhlDZC+3p;_aQ1Yj8C19H-F^Hxj4)3+m4 zH9I#Z+NqgwL?fc>g}Rhr|*bt&H&$Ri`;*=**A zr$I;Msf^azR1~Gec3T;?zpC=2mNP8R`J~z9i%qT=7W`n31;yfj;gvtN#kcM8c4)~CUL767~cIsXua)A z@gacvaBeD!$Y68~WC&xLV=AF&QDM?s#ghe7A-kZETL&F16tpmfieHI}Thqj(x^9c( zbfXlW*B1W(nYYR0jZ38;6EnQkwI3%>{{WXX+>|v%nsz2gTAwQbaB_-eZK~+uxrPn9boz8~)s^ zte$>&X?YHBf~TaOu38aA%*i22nz7<|b5Q6>B{B&abpwpC>DzF{OErAFT{FvF6m80R zm1NU2>c$~GPlk;8gB4%%dyaz_>K)cJcRE4^EX~<~GEUb?x&9P!>Bx%uVMy(vXVkhG z^=ZKTqIGw00XeXnG?lqZHe8&g;ZNf6n8U!#{^s^S3GR88-QCV74^7BZ9tMA!ubtYz zmZhJ?napMw7O^STL^vB5V{D%BWA71q@~kzoRnX5@$&p#%Olzp#hO!!oBw%$c#(KG; zQ5z7^GDewPV>++Xu963DZgKlZewJ!Xl?*j{YRUQuu)6&|xLFGw+tqFoNzTafs;<6v z*t4CP!`!nbd9N|eM10Vc_4QS-NA*0DK^;5Q#th=81Nzvivy~WCbGbOWZk+42H`bNS z#!B2(4}|kl*Hog^>0>DVg;_|eIxz}TQ7)jl_+P20f|44ExfW6-N>dZKVn~QLh(J}} zIU5msq^hT`f*Ig^tg%Nj=V#F(<#i0_r>&VIRq3#^Q#n0cIhwLH{G^;*Vw$yhkZo?t zi-nNJc~UuCJsgkE^3u;OOrI<`$YA_g;)#f(Mv=@);R#~dWn~~Ajm75rzCMSxrwOEYd|8nY2Zg9rC?L+1f2+ z)^tJ9Dx9j8`z@EtpOmKNl4-1A@Ol1I=1-Vvsz=OySoGX;R!vG-Dm3b-5sv8&DM8+^ zPk&C6vVw1+=9H3JPAV8Bo*?|K3~cbTi3CSjIbd~Qj;A-)1}xwd$r;AkBlaxU5jsIa zeE|m+U{KPv8=))rO2vm1lJKPDrHFF&#eXVabCk34!t!##$i>apQ=UNa-!C;X@v79k zm1$~G6k1F|3g{t!5&T4-RBq&!%VcKerE?FNWmx4k#%XIcv8k&`Xa|7ozcEZ(!Du${ z<6s1um>l1vc^9UzJ4n@r$HV<`a8vR$RZjv53d<~SDnl~(Gw4>(Ns2%u8=P-!i#@y` zoQxGQf5a8bQ(E;jm9#%5d})>~(wUqjD*hWQ?~uyCZ+n)TkE3rhe@dE)rh0~{S4nD^ ztTG6*DUD^)s_qII6+-}aH|h_Eox=L`8TQybJnTkKU?3mOV=4Mu-w8Y5q?M8R$9^20 zvRHegx9{cq9KR`4Nl`^PFc_msxgv@|Q&CkFRBEb3@ikfT)D|UKSwIY}q_W_iYEJO* zanm{s%gORdS0s%($4)+Kws9=WPRS!g%&3Y3uf3h|gXo~FrkxANJZ_=nO__b@osq|0 z#!^1Z5l~24B#lg+=4B%;M%g$!k?b}sXOiQlN}3}Z;N?^$Ui_xsWS(EiblZ--`kr2f zyOW^cq2(o#dZpv*>#5(lGKz{x93*o1GIz-mh~$l&xe5;Z?YZJ^IjGZ=n~}%WvP!QT z&as|OR(U4WV0CX7yrLy-uvlYz^*TxGgW1#ex?OHhi>2heC8;xEbqz7qRa2{@;5s_f z%@~nbY($!u;ciYZv5fsT+F-mp+rK~k~B6-`q* zO2_d_#T1_T1Zr|Kawut6*?z0T+gy~}c%6;KLK~v~-Ki%WK6~;-QArgiJHgY_2h|tO zO(Bw5Wj`sDY3ve!X_TQyo-p^Tq*>z+i;Blt#*i1~NblyWo{OFe9?$Mps;`D~_2` z2>rV6zb1R z->f|^Cq%|FSlOj1HhCSzDkAwL^Vyd4IJHxr^n^mLLT zMyG_UNF{YBq%(t%`&R*7QOG)N*5|1kFYmGWt{t%X+iOzjDRh0f zJY25w$jsaKk6z90_XikxnoMj4KHH?~+T3BX7>nxg&=?`h3~Ju7-4z`Ys>sGb>4X+ICRp#rENBkLUN6GMXf-aT5)m1A~(9>hqrr^P`b|K38@)j zi&r7u^Mlwe3@ozC0|a$ckX428dj{8vemV+w)VE^GWcU?1sko;l+(kvLBhvJ3SX7di zWq|-O&|a3+v0%2P(}F6&o!vNcsa@$&HyC*FR4Kr z#R`@uK8Lc^HyiTOmn<6WV&bU2Tkdse=(3lY@XZI!=|_3{LN{xph;Az z0|Z!%tZ)dos4dA$7$J%-YLz@XPEnRD5#iJzsK@Ueu^{+{X0|H4%(w%Pg~0s^NXOD% zRsB~fIK1tfK-Ne^@;sg=DKyoCpp2|*5+Bk6HC&%*Hzcs|wRrI5XkQ-!zi1;Ln)X5* zYz@OF9}I+^hv8wJwYye2kW}&6J4YL@V?w$~{-hm0Ko?GaHbmSU4%Khx2ee;AQ&mCk z$Vl|J^Q)+Q#5-dehi)wxPeB*=M5{|#OHEAi>hGSbwb28 z+m3?k)NvJ143*R|)NgreH>L40w!K1%gg!Bkk(l{9uzlh7+|hERk*esBQ0@r!+AEXR z`TTpJ!aAKrJ#xdRkCT-Tufp_(sqvGhpHz!UIJM@^t%Tqo zWz>U}ibJJ_lXIGg%A7Dc7pl2QWix2%DVoZX^B_(}CUS)IH)&^%L9xy7SP?V&mp9bo zso4`-hN5zwI~ZxTmS1$@`X*iMwBu4T`hqVcTn))_(bkGND`_K`oGe}_GUw5w z1H16cZ+c_(I%T&5j+jFShCn-$lYIH<%(WUK2W#jrF~-XiGERLG62N9uE;iQ}q7VUSJ@+2ko{lyBU- zVvz+{lehG4k1->?PJlZxi%mXi)BSyMpJ>YZ8!eS9u^2XvE@5{( zoRV4U1+lQ&I9N zT(sqthLkQk5sdY|%60Ke635Y)Pfs^)=%)$3@K|523u(&|pcTV!bJEwOr@f4ejt((q z?=UfgdXf$jfQE8sKcWsWZw+je?^3IT*EsV%EiC;&83-a@EKuW<9liMfk zUpi^tqE?Z~$?WXBS#dg}7SYW0_G&ug56F44(6@M5wehiWk2hCNgW9F2JB74OAjea1k*g} zTl3P_G&-V%h>jGFFsa>D8hfDXZTEA1dT5pyLJ&QFzj9?&br3fCew(OgYIr?89ZyeI zB#$dkOIRnE&&br%R4P`*F-ltZGAyeqM9R8aoJA3Ic(g{WbdUY~i70wGaKZ_Roj(y#SUHtqGU?+k?7u@TZ7n}^C=3R}A4T)4YTBi`V0wFQC3fF)8?{iczFE(%q@!rLs;Cyd z9x8eRK>q;KBVgi|9Y6+X%kKE&1qwZ%=SUWF{IVylg zUu)?tZ9mHi9f$1M;zjfdb(LMyf_}?eT^hbv1^gqu)rXO;l0d5Y$=rM`r;=r_rC6cY zCt$Z{=d#4lhPt}rdo7!;Lc`L_EE$~NBa>WI6Sn#P0K{*yH@-hENULQ%oj%-~Qb#YT z{{WzP||q$4exPI`lV64k|_? zS-|bSu^}jyD8L#;i5;3PHIbI-EMuWllc`8X5w|0<`7M`n&AGcZH1&F!h%7Ft+Ush; zj=pwVcIo9~q8S=)dP*}?uE$`bHv)}E9=C3)f0d_5&|s0d9l5h-88g%TNPWN$Tv(7t7{ZIz0J}`i zif3H%-g0J0M7uT!wH-WAk)c4jEq2;zH1k&tE|p&Ho3o~PCtJ|Gj<>Fs z)=rV<7K?4VhO}DN3AQH`&25Vel<^GBCV^%>E~h0M%NCF`+jBW>MBdzLlU-H;=n`p6 z(Ntr!Z)nuiz%*0=EPW4d-rMJdtc~{8G4x!JR#pel$XFeYrM$dWrN&N0bmcc4kM$;> zil?bM=^PC1P@dbRJv&prh6EpG*V%@iJqr3lA5pcpSZX`66m$9SSWnDW=%XdMeb2GO zu-{6fh07L*fIme0-$!NClaHPc^A!LYS z^rYxM+wDTYN2_Dq8?NK&y(r}9(pO|U#jmLxyUJ}_&T?%Nz3YQ~axg}5djJu2T1_>u zrhV(RzN3#@hh`_V(v7oEk@#5`6M{B3IBacsbq#eH;3pX;!zoqMi9l?0>+HGdXzAfV z%An)}doYubM#K?uKw2j7SoZDx>vMa$7(x|Mscvvh*}`pbvCH~=RErV~LvEKCjf)GI zFLv3&+@{U8e49W(RnvG}i*{JcQ5}}7xdbfWo8C1GO1U_?JcV;W?E-Z@zS{}5$io@x z`Xcs~_%)Xe2EPNpxjWq5Y{5xoCKj#QYXE3B7bM3@h#u+6nWN2Jq6w)xGufpropDWe5RNyF_n4(}j7#c>BSe8YJJV-=a0&>qH`@0L4 zeq+aqC@bhIWoTU_N19yVe@N%)Z`yCk}o2YokYpM&FTD5a8$iY_*x z9nv`>3Kfd>jVm9C3-jtH2R zD7&5aB;=j<`fgCRz|yU~R;7)#UkZy~3oMf3!{B7?KLT+|AtQlfDXPjm%hnuH( zip&pnyQ1Nwu6k9#$x^@`6H84MLgCi={{Zm& zhhkW1Es>7F>3sx|T@{e^>3c^#w=M|IT57MB>>?UkB&AGs_KVi)+YDyq&TVP6(AG6V z5yVnhBCL={OCxo_zEw3>;sy6}`L6FNGAs`f>etF#tBYwTG`^>s>XyG22|P5;y)`sh zW;k{`=k~730HXk77tZ6_bjd30zsc;o=^<{pAFkm?89TI+hlaMrEUu>PvhwZ_Wb7^U zG?cbQ$@U56N_e%K2^3=8gtzq^B#k>nEu_=WR5vq zEncBQxou0UHN{IbjQ&1xj_yZo+XHJ@2cm)buUdAxM_g;178}pF3xd1))=y~tS2B(6 z8u9%WPiXx@-baRac(3_g5BV)W_@%ygoG9rkW8&tiDV-#{%I>PYH6P1P- zrIm(VODdxR2IBfWP$P_@2eOu*{8HTb9c|0~Mq^|ZmC6q|mj|7v;%R{A>Q{$KnN*kK z;;N){%wH)Qh@lk;-PFp#v|yZo!=>`a9Wz7CQ`6E_iU~&xEGzYGPZX@_T`8Qw6s@m1 zLWv2EC&mdQn!9QJxlEm2CzK|&TsiDCZ$QZinBR_;BK<#}Eb2p5#5iW;ga z13w#7i$y_ET@0+Hnn->|m0g+=Q~E;0m^){C#XSXF^6{}AG*TzkzGS5Eql#*JawU3C z0#=58{V<K9BqEL7VY7cFG-EFn{)U)Vz-8){eK$@Pn>6jmN+<`TcYFt0O6xe zOU9)TXr+#_o?bcVlA^Q1RF&k3qJzg-8{V2Q(aHG_wee^;{xS|L%gX!}Sfi(>Ncmbc z;ws6Os8PleX{lp`{O*?w4Dqc(=Lf_$?QIJ%$d{yVRAy1#LUCUlsmFXJhtJyfVsZVf z_Bi|`6-ni((s4LAt?&|JT3-a}@RjqvK*q;=;Ww6fD15x;D6>jwVXykV5tgg#7J?`W zczx|EQCZ~NlOvOU)ZTkeNB8W(S9(M*@V8kc>ZUZNy1ZvB@_uZJvAGE+ijm?%nemoB^0qdexG3HEE#lA6wEW(s?iTlMhCgSsz<?UoU-!JCTf>#KAm39A3-(w7(F1X~&-(Qih<=o%e~C94;%;kv zRQPs6d}Z-C;+;c*+E3!mftgUt*4elaGy(nk9@gGqy99W;tR>B%Gc1 zH#Rn~wV|Kkl6KB^D>vc1#l|i%jAgqUlxvJqPss9IhZ$8rIa<|{RVS-dB59*COj<|rG$ZFZ+Wm!=6CX#4j3X&$WVd%)xSv-C8Lnr$<0bNpTj*5eY3nL@ z$snYxG}R3d3sA|Zt~#+#Q`#?^!SVHUm681Q8JcpK`pndP$Z#{=Rdk7|$?XwDsM}$i z7u)~~EIJ;WGOl~9%o0v1{948_iDfMR05owm+DPH~$2C-vQq!JkXObsPJbf9NCmo42 zk|2gL=w4{f=NY6j8j=$bo{JeCz0~K z3J!R|MB+GT1oTltX6{zvV$#H#u=BY{i#NP>)tuj|=xo5V0@ZqSHIrG4F&NgCQ+U|y z<#Mpvn^`=p^mWxzRSyECmVSGJl2CPxP)7wSPwwS{u9D796n2~H`Er&@3eJ9!VK7oh z$i&n!g)0h0B?TkMkS=tHgyutqRSN9O*?ns*V7jz^1ftZN$BXs;r;GeNPx>eBachPcO@9nvehCSRU)0IA#O1*qq)QkGAw{T@KfCd)=@>aJj z5lVBE{f<<8hgxIWz7sXVyPG_pfnBSXkHCrjPc zBr{6x@`pNyiL5)0gBrVSsl~hwHp0f^xo}rbStx@S@g8NVODy}cai6#i-@J<=|N~`o{AR8!+3RbtP*T9(OCUAT7NCCgs<~Tm10`?5?78n zq0?U}l33(|L^}TfBmy0Aj@<2XZWvTiLjhy~YG~?Ck%fPisE%N|7fLRz8cviQa&vT+ z3Wu>>e9cbP(yVRbQ$-XETmq!aElhA}-}FqG_~P|n&OJ3;bn#`1auo4QyJh2gYKibN zI-dv(-uW&F*3?Y#%3|>;DWF}3nA)D9XA)x_ODgB!E)??IzccePRrr&9%{@UOMl%gG z@CEn+Cdu|)Bspapr1MCtr>AkpRW$V;E2I%UDf}2o63SXisL^!ovoOwWRC&IYNAy}c z+RRZ3<`AqM#Ma31$Yq`&C5Wll8tZ&x0NSSV)YO6&hPw|>!C=eEoVHeRHvj<%K>h`|XeE1++C zOAWJf+#G!;$x%|%YA@hH6gt04!%(^SXBoxMXs|Y|^|gxt1-m*~n*oW&MdfxkvAv?A z!f+cKEC5@yGc36mf-XymrUG#uI`-R-QA#o4{(`}{>I)RS0$bJenXd~c#_KtRrwHBf_|6F8 zt%`o?XCmg)eCb!@YD+Iex5DpJR3$>?NI2_p8(ZpaMb2}SCDk%ZhNiX}Vc#Shm|r)P zbT6d#S$y_alvbw6RbFE7%XIaNQy5^~bG6Cfi8dnmvAKxlNdw`1Itr$dI^J~NkzwcfrWXx?H6`!gSb$Ic&- zVpO25h%+Ex(kd~e-!8hFhPI?f&)S8N8fQW;=W|X7sa4harfwNwn5QwEcy;SmT0PFtb#R zWDWCuk&Fyu+k6Pl4n^7=jOw6grY}mZj2|l}Mwd}l3+4HpW2+tB%i-`96#R5@@wEWQ zUX@jn&aY1-tud*nmPn^ZjyFv*L{-X$I(8X1(V?!Apy_VT+p^*{Inal0rAO<&n&zgC z$k`hfS3}9XGd~b%%F7Y@ku-ovVIZuTaD7P|>CdI=p=P9)mr7Gu%(2i&jw&l1yez1z zW!F-5GC|@MT#R31lB$i{N+OI5T_D)pk!|H1nvYVAQrd_-TDPcLdRnTappv?VBz<$V zk$8~Rihz>T%{0X@BQ2^!huC|$Jw6_otMUcRvLqF=Q`2~_EX*QE;bHi*JILx8*bKL3 z0J^X#Vyb`>?l0o6B=*HXoZAuQ#8KoMC>fqCkKeXc3I~kbi?YQ?M`*mCw z&PXIi0CugV;V5ZFs+n<)%-kxxJn(bdqPKHt#V>P=iy=E9H*O9ZvZrvR2diy&Wac=k zEXM>v&rFeYMaUAEWB3g=lyDH!L40>9OWUC&JVhltVrdcBb^~)YbqyFQkuOfT zx)qcyPu^K1bJ|N2b%juod^tu>>2~7DZt9Cxx>n7QPtBsuRc%zK@Z|3H0H|^NByY`& zr6W0PxyiY_Cy#YGTX7_H69jJQIoyqf=}w}#H5q&w{c>{O_=_a*J0zcHCHuN0SJ+$B zF5__f`}T(kp0XS4jjtSI@-Y7Zms>3Es^y^83;RXC${+o+ zt^P=-Wyw(wfckpeeYcLHhg4-OriuAQ?Uz&r`W#eoJR#0CT?1_;c+OOjWf#TipZE%>YrHSVx z9QmsE`2gHv;D@N$%pdLOdn6I3Gty1za3l9HW3?hBJd zKib#mv%r0KVA8)xv47^cvzDz}RHa)7((-tEqtgK2O;Hm%RBmrtz878+Yo2}0Kjm@9 z&Rfnw;_6g)hJWq3sp+L?UIH)<;GWCrXClQ4EvnpKUIAz$1ooT>RpVl;G>}O9F3%J4 z>n>z{C-QFnR~HRbn%J=T3(D~j#z6BoSZfH(fN^^Nm6ie?Tb9_hgP5m)nt&)aHU3_VJ{)I4@5*=8+;&9wd} zlmhm+1MRl3I}j9I`W`e6{G0p@o0B%9OJ(0`6*Le{4$0o_HyGnJNO!=#iX?G+ss+3Q zaN@T`uF#BsEb?{7K@}9G74BB2;wj_rKX~?fU5^Gh`Y8J^Lu*H4W?9i4KAx!jBY*>L zmNR17295DvdpN(EN$=RLet*~QJQJZ=8G@|rxBWrdYa%uL!S!IW%g6YYb z97dXr)m~0N6Hm75SMm}$F#)729qyoJ*PF_B?UpcdUFtcWBiZ4d^leL8Z{I?Nl(l$xgE&R~a3aaD^z&aef{%f*MNL z>zIi94cI;3jq_zw#7mfn!*v&8E>a1=$-%Xi=3z#oV{o=yeotX z=c%X-2_P;kaw^?rP?AbYP4-VGTR0ZBCi4!bMJ?AG-tAB1Y?6{s%rHF%(PotW75W9c zE_MrSe3#@wS|oUM#&AQ1`a3SY6(v$g(mC6HrtV`V_Qwdv;bfCUco9?G&*pRG<{2g^ zR~Y>FG#rG?$HQ@*C*B!Rbt9u%$=$aK8|l83RFFcw#Tg?8;<;J5?&xD0@0{f2%rn60 zBzjLQ(Y+X7o0Z^x>VjmbncGsgT|E!kd8p=jSu*PW3{Nyz@jnQ7D;-Pc#t6j?K!tJK zIA&4XWH8mxhWR?90ArIGK=FKVho{qeH6CXtDag|i=xGP>m%MhH#U!{T;%cgE<}~%$ zU39g7F-+_!>V3jw_PseHoiY6M%2<0yN2xaxL*^OSqn7EQm-nv%7kCW zFZ-+b@@{@m&q~mk#!uzlRmecTmz4x{y;+}gh1olKktIB`)1Kqt9PQ9tbImKadCLK~ z2Y;f_2RAfyuR9F@pNO+57L?|;rt{=l;_Lg%8=Mc#eG?*QVh!_tqMTsr0OL0;CmmT7 ziqcEnUGS$F$K-rr@MbvsHNv_?+; zJKK}-zG^o9%j{M<83aIA8E9A6=!XxNX>W>Qb+d48!3+P z;-Cu|W7;m-jj{2#k0|ssQjB!*;}}N48h6Im&gJWZj|^kB<>V`T6wB$Jz) zE!)A(uGL8=7_%+jIrY2TU35^!Vv`HMQ?=65Xxgpko=!?{vYBp=Ebc9JHh-N%@CPR5 z5~PcjV11Y8ae=ni(crbPlO&K1*P@Z#rS%&xoM9;AvC-|gYrm}I_K($ai;BDY)=y~t zS7&5S=M}dXL;g!o{w;2NfG!R%{#Qf(OHckSZdo=f_T9_5_gn1C~0p zg^7I!`u(>502|O;Ysga?iK)vJk`)gozUqZ;ji~L5m=Wvo_*%&^wM(Rv!^6Yr{{Xzn zGIoJ$OvkibT!%BnaYix7SJ6=Ty1X+}Q4K$dq-C^tuDZ01+Z{V?(sF!tabJ|Hrm58* zioOid%c?zEb+3l)mDRScncC7~cUQk==;!LcE*s~bhV)DDwgkhd7ov8~ZaHdUfS{UG zh{)nN!?05$o`{3;nEr^#wl?6gmldA;VAy6ImIjyfMlC}$GlFAvkOpNWbOlKSdqErC z^$wp!g>+ftAGldIj-zh#<3h7|CD+8$t3chf`sp2?8wT23djRo|Oj-EDt}$daH1z?R z84^Gkp(=7UFICT|?H!lBOWJKPi`=&^S1UcTEy%P4qp25~s=8Vlc`9mVik=9Dsb-ae zA`Y1>+X0+)xTtx4E0fjoHMF&QJ?{c!mq|U1rH(QP#%#c+WFaJ_D5m;HJinsq%Nm=~ z(AVj;yzh&}Rc##-YpSV&nSV-Y5;g0Nu0ZQ=0Ou9UX)iazHV?wqO}O4U5Ik(ItTGu$ zDo4PLjh2Vkr{~x}Nxx6F(eb?ni!v8w4l=&*&g-91*>P8L++P{teE$F;MMdKlSiWYW z7(7zA)Dy*Z)K?=RbBx$b=Ngt}D5dpZzmi-`dk5yT@jE~kMLcsLc;rb`?iw}@r`T6x z_FjnqWah!bacgqrdG;0`*331p9uE;>@eoMMty56eSJV!qd~aKN*cfu?pXwtUpUTCr z4aenX_t|-tcwk17SrQ~wEX?c`LXM=9wgsTu!+de(@GUc1(J#W}&TZHj$sU=#KRvuj z+HZDPBLo{*m*H|^%LYe@z7}SG(OZ(s24gY}+ZeqAk((RcKFd*ig1{rI{{T1p@7lO# z9mDLos>W4+efvh@b;=)QkDweRg^hf&9>am`yAqXDEPDaHqKPGcZ(Gc$I$m;zJPI*M zG`Pvhl9Hmc@zi5;fO?C>i&p^Bb$ku=(E^ROwIo7S0D*HDwA)8K{XeUW%XbJ0aqDj*Jp>_Lm}G3E zpM~L@d|#BT=jy9Wm5Le-d}MO8C`ny$@~abIk&ON()-2OwX_X4&Tg*~f zBA%K$g1WyX=iBhTLronxJ{ZP&-tmGh=HYpcO;?Zqo@e6%E+9VtXCl9BUYqZ0nbkb zd}4YZcOAEg=((0y(7`kR07f9qrbLu-5-ffZe-cL33>a_4*msE1FLk7?uBPijP7X5( zAergriJ_i9=VEQj`Y=C~hw@tkI6GXCgChVJIUrwen<$*cD#Zd+NgWiCRIzQe$OncF z-9ZJtj4eG~G!gj5mL&tOn~7;LE;<=mpsh(uI7^>n6tG7M0x^?iTJ!ADEqmZ=o_YTo3NmY}8@Q!){JQzY`_ z$n4qex%k8VBnAPq`c`xbwMk2C7Szti8Os`%We8Mu5-z289aAilxtWOX6;gV9F7hOC zV@fFYTayefCCrY=Y1Or-JijbF9NHQIpy_1`4{4J1>gLVqzR%-*o2&`1NS=R5=4X*xE?P)T`k&)Qx6zI}?vfu?1vIL1a)@ zY=PGur{a4}z_jwQ#*#8`RTOg509&ElUTzU`&JJqb(OaB&M^Y)0QMK!(@zSn%PjS7s zZkv@30DImRxU6{_Rjq^g;TLSN86;3t+tYe@**c@O$B*1Ac*UJJ>=v~P9P&)we99b* zM7SUmb^IAI?wjkfD_m7;h)KpUFE^)BQc`~x`Q+o&Xx3$FZ$4d)QO%gJ^)_BoPP{{E z$7h3^c1xUfYEz>tlfO&dM<%kNP;P~_8{+0%qj>8sP}#eTU=MiY+l}5Ml{m6QW$f#D z?7SM-+cQ~=+_TAHIZBjZMh~{_QSwqxE|=TceAU?9o-R2aqo;S)^rljgzMEC3mGO>T zomEs@T^p@Kq0nN*U0S@jyHniVrMN?I_d>DY!2`uzf;%lvaQ7C6AjONeC*MEDITz<* zUnC=A@3k(n*IM&^=Q9s>)9P3oFbxCP-)Z|Ig*(041S9)nyapSPC)&b5Mp0pyf3i+f z>H`cZo~mM7J=Z+A0<^VeV<^0Vqc6-K3P891k3dTzX_)yu*FOMT?Y(bBpJPSAByd1? zXLMH7LyFl>M=ODox2BxXKD{WY9 zURF5Mj3UsnEdH|I-oT2wS+w+yEjFvRR<_2urA4)dw4|S!e4>g}@33D+`;+wd$hpU*8e-()ac)k+6hu+) zY&i^d=@%__%6fQD-9!p<9NpcXYRU4x726CyhC0H51mC56$kPI9_x#E~&~Zlyqlop9 z)9fATN+%=)3vf6zpH~HpGVE^u=&gQ;FR@rdu#}863t&Sqf{O`m(3_4mFFAPGUv9ax zt$@U@?X&RIA}KmQ6AK&%rdjoHQi?Lc0zMu4`#V1bRFB5`O3-$y?8 zR#R-P*&cv4U%O|JI;FkElRb~mka8MN$X$Tai^`5siWAo?jqV+1elZPfD4I1+uOn!T zQV+Uq7rb|5w&u=zeZNUs#)qHDC?w#6{ny% zT-9XkmrS$b98^~3hQO-0TWG|3s&AV}V^sX2lgBQlgpdI1qVA!v2Rl(YMC^vMcacr7 zJi(d6xoY<{f78Wvo@YD#@tqpF2gG_gyWht-Y~5V>OQKR^f4dMmjg2M#QJ0DEQ4ESz zNM^pPqp_JE&&+(AL7P0){tv*h<7QURWmEv(u-R*yEvEosz?9 zo*tGn{9}!*@vWFm1|@6!{S5}B0*o=~)2{5IR>X~r9_M1HP%Fi5+(=J5eh0Ltjs4~2&W9e}n1H&5Q zH&MKkl}*Ry2gNyOd@3MqNK$FxzPZR|28KR{Y#tt0uHS3cI61SE3X;$MC-(2lHSr<& zZ_j!FTuZ|mwQEH9;r3|pgK@y6;atkhBogtZ%dx!j1)lgBXQQEp&eql~*|&;K4y%_P zw8GeKZ>eK0U#bJzI&8ClsqyiJOK({_&G1Jj*R(lKBq6sTnz>lfzq@{Ki6qCVtjIHQ zS0zZ0ZVk?q&jUN#qrF}C`&H1p%2?W~W^hulW6Cc0M>wXk`E}F^IX|VTDw0()D_Y>h zCR=HW;x>jxi=WBXsS`@2D`|gY4Kn{tydl$+Tfw+m&36L4;LQ1MUarP5%>omXl{QvV zxV`Uy>sdK=S;n@;Ada{I9{IW6yx&ZQ;CkuB8aI^tkvzRMPk57gZkyJB>ybkAn@0z! zgv&L7Nu%Fo@@#c*B)^(+LP%MFaS)46!`h?uZ`AeDoN%}}F(I3L63)3&0zZT7{Ee%d z-Dl@pT0Y(qFn4rd(Kh589s~Nx4vtsCZHu-+r7Am^EbKVwGi?)mLESZ&ZF`L3anrF* zFmlhf%#$%t2<5g5LzMfojWhl_DATk+8>@?zYmB2kYPBhH`qH^~umd6rn*12S>{%wc zdsBzrt4ZiJk{TSy&hg4#@IYUrah+0jOh%QW;m+{gi!-#xqdj$8=$3H(ZK$RPkzp=Rz!3YeU%$iT=Jo+@ms}{TihJv+@mts|l#-NaLr`BKfe_KOcrr6Q{0Zt6X+PBVZZ1}HoigDFU zJ8ol$C#7RhVg9z6K%<1`z7tseIhY(PYSXB*a_Lc#*DtI08w8ssH!fAF&djLFuUbp` zYFt~x@p4q2!;7XODDgdu!y8m!NN?o9S`Lpv`sEZig`~3V#hh_S){|@gy9~cN32?>! zd&5uH+1ZiepXKr+$7c(NG1^h~Ai3u1rIidIQ=)jyPi(&J!|K~_mKnAi-OEMyyT}fO zeqC=_fjZ53{DbWg;ZywwOGr3t=v7l^O8u3C3Ys!;uZI^;hFoE zIQ_PN({*R?CfaBCS^M*U&xz6VHVtT8(kf&3p-Ln9wbW(K1oB}e)sBb}(oKKJd1H;& z@36N>*65dHFeZ`g;n9OtSWq?v^Cp&4;)edjrB83%)_=#*#pN$(S)IC5EjZ)k=(JQH zTMJQuladn>SZ0G2#%ZhuxpCy)5bFu#RE07wDUbFbIPYct4tv&Ig9mZJX6RN%exHuN z-w43TlZyN;G71yMUh%qjkaDqLu@Z}M^9!K6Q}F6yXrvRwGfR90eMsPzIIbh^{D~Wn zc}taBk(RF8H}9JLgU91usY9RPuaHX{YIh^!_k&~R>W+66M_8Z39UmaUjP|_IDIaZX ztTh{uS*S+PNT=>Qrs>TI>19c4E7L^xfkF&Dj}vxs}t!7~0?sKy^n zi%*AJ8Et5raJ)%na-Y!q1?mxuVCndcR#jGQM=&d_Rh%SGsxgA}Nw#zra_&e(4!#da zdGn3Qt@7U?Dtc`SRlg6dtvGl+yW2GNdaVzRZ1(o{tV$!ohUsSO@cDZ_#{u4+gW58R zdHmN?FIkv(a5XfPQsfz9$p7qPl6Q6PvCDb-Ja_H4-y1qHW6)0PZpU0W%;iAnl7wla zdC8fk>h6p+E!F;bRL2(9Rz#Eq_?6`3FK%b2lhVFFMC#mKFc5Bj%s%G5OizVYANmSS z6g}%UdH4@AF0WiYvs{^kVht?^fBuMfRYqJg*ZU?epj?`>x@Hs!O{Bn>IQy^)?qpN; zI17Kj#}FZGV7*hc8^yVxNEV}b0xscAVM@tP2|i_VwtZ2$)WJ|o{|De8O{B*!!cB&v zEl~u?xcTQsY#&xWR5E>}3W~lod$W0qow%jlH&VNF`ayZFC9ac@tgA}5!Yzt*owNlj zu`k|D447wq@bW9)OnLv$^!7-CmEyC`%3&2Grt;pLBP~9ECx-sON?uWlc6NSNUU6iB zPwrDweXK4IOi`ZtYy30pwXl58(u=7qA)gJ;yv_jOCyqqT(eRW8DN;0AOC;jTZ*lf} zpikJ)k9vB5h&RKWF4pt9$G;7O&V7VWFLXYD;(&><>SCcT`>fVib60sS9Qc!n>P_+h zH5FoummDJQkowIa0&Q%Xb1;5JvAk@xL#UT@Z@;@sFXnS^H(lZDm>d zRvYqPF1yQK%rSm%SzWK{KY(n>DTJVU;eO5ulA1J9P`Our(9u!#Kp*Duo1RjCd`=4a z(m|;j-(gZQr-Q*Z**E_6YJlw{r?TOMNB0<{t~iMz_!H-VDn^yx0%Bi^iRkKQ*MaM& zIuLiYd6^rPM{HNYzv#+SD{FEN(}C%I$kgQckk^-&TQ|)y2A9U63o}|e!n?}Km>#(0 zg}*D;x9xL!1oTb%9w*P4RnL44PC~adeysfTg0{;u!kXK!8MDm~s|X0n1nd-p-obm5!`rXGzFEj6Onb~kOA-0WsKX)DgYcN4hw-C9k=>a zPU4>X#YPE8yX-Q*FtKAO`Hus0KwyWRic}Ja0r*p#o`xA;I?{XX)fxafCGc~}3%{Oy zX}PDr?~g;i#j_scBrtGfC=_`T*esg(TJ{~jt`U=z(qAR@RHlklb-k%{_vZ0XY{1jD zT#a4pXm$6%=;e$8eKnYg`GMKrt_Tc9j~lIon+Y=SJVYCe&XaP>rsSP&a?C6PMSU6K zGQ1k5i#OSejY4iaU-Gdk+r?>$AY}d(4z_Xc4zv_9q6}BkN6*s`M%`AZ%uV%?LD{kM z7uTxvQnB&A0{g~Wqbqrm!4<;!BSO!NA1`u_O|O8)kXG zLxYpnWzTSMeU^F+{G{qb^5Vje1^Y{R0v1)#6jnC!SJQNH;qflX{Z=kd+!xO#jX#oP zm3AnL7V)?ee2(bwI?hJS)+h2f2>C3R#ISf4D)o$_6IH5UdE9x{)LL(*R*%>+)yv`V zUjFfwjeH1waz^F|&$`}fSplK|1g8B7JbZuPk5*i~pPTH4SDgV$ygy}%C9K-Y|E8l^ zF-D+3t+zV-;)-n+a4z$84}P$>mr%~oTtF8j@zye~g~p`vH#|Ayz2LohH3cIci@3YS zTObCKO}^dM7b)^*q>p$fd4&TVt2>;9X)wJ5qwjo6I@{f9+z;Mgtcn zA24}M)pjhH6Bh>&20NzXs?u@sR<`*_$C>zg2t!~)Zm$PD@JnuWbZ+s=yXaDi+n)^8 zmTh?z7HF7sk8Trn}_|_=x z2inYbk21yAo);VS(~ZmKZ~(B+<;r2Nn&ZPoo-#!}dEMrciH*X^+8Z(SwCIBOw=|JZIJdmr}s~(>@tzv`md)R z!7hk;R*-qz6;lr0d4+DBsaUm?smGA?t!!&?$qks-YXyTu^hs0EpA zr@6}ob@Jn6xVIGrtb%L0C(p-h|JN}Yq>Ab<^M0Hm$d?UY?nu6|Sf=31*1Pb}{0O{A zk|f3v;E}&a7%ia=Y1-z5W+Gn8xHC?XFWQ#O>#HxWHf@ky;8tQ?zHU%*@9RnR4=H?< z*A7y&g1nFoi%cR*7@uKtqvb@xu0VEyG|^43H@$VOfwFVSuSbk*McH3dumy(V&3q9K zV_ZlZxhi@dp0}wy$yky740H}>mu8EtERyRL5IDMKWqX6N@x>FUL-{eh&ne{kDhb{s zII37%f8+^atjuFZj?w-gf#>?0d_?rqVe6ma@4pojup|Ezo%Tq^^46P8yX<|t+W4%N zA!q#99hFMY*cWYeUhdGDak1b*=56_2z?59@4mS{|sV|n_I{5|xSwq>my?>z9e**(I z=tbvrXuK7IXjoYgxkk==3H7{T$+J2M(MU=d=efK0?~rVpCn6+}N2A6P6sKy++v{?) zI%C+~%X}o42Nj*+`&-MCh^%9OsPe~J`867n6?H|B=y=NZva$XUz=Y8x- zqB4d0mKvjlgOHUyk%;=+bm>q)3}1AElN@AqoLkdxY&Ibu1JX_@Y<3MCD0u7bEN{Ho zeHGBS!)5kEAa}NjW-aI)DK|hMqcq$gxtOue&8oJm=7XSYuU<$Iu6%yFiFbOuHWg$G z243ao4gZ17E}};|P*)Uy(>W^K3XT5a#B(3cH7~K%n_*7Hf*#>R+|IO9W}vil zGVQO)KL9Qyg{g<$m&&8IHW1jeUbIh}?InEVntQjInD7ZVcaH?~*0nJo$-~pTqeO(( z77X;Br_Y?EztRB*a}DsSQ2A55{mMCB{?#@yI+vX z8#Cp=S-Q(?W1;Zlg?O>NOvwwm^_F~C(i!1Sqz2ACvS@1ly5a3~td0v3I3O}^B9@mX z1RL7Q5g9`#!l|i$35Za~mTQz|Nl&OpHRE%7ZaQxqSS8zdKw?QW!U=MlYRn3q{fu}Izk={O`q&~h-%z#bK|Xd%F?>l>_#=NJV1F|d$9rdT??mUv zwb|8v3WafMm>Ji?uYCDkNG|98B-V?VHQ9=V$?a6IRw$^-wC*#^Q&bWK6_0PHITI$Q z1JN?(G&lNmH}@LC8FB{E84=LSr( z#wkx>r(V&8NJzS!wZix}R$VRoDxD(~D3ajtXSXgGdcuCNiN6+z*N;s^&w%cX?V0N_JXLGw$Y)BT7WOKYq;^Mbi zmhkw^P}Y}mgi+#a8JH*2#PkYPoIe&|#$3WBTVuVdtJFA;rs7kikbWpQa<=Iz7Y?UG z8~lM?oeL6|ZpGS9x_IL974@sK)K{Brzv17fr*F9uyKLI|2k=)EjQjkXs~s*FtzGrX zAb|Xc(3G*TnT%6x+rP80I~JPAp&pkq^4MBlsrn-PQ#r91N2W^lJG3}C8as-sGlOC< zjXh)S@JCdLAy@pI18bVPrxUgG;B!TUG*>lodq`3bIhtB=W|>TssofI1kAuIvs48-Wy(JovM{2!Z4OIq_E*9_2d82Rr1Gts0qtV=R zj$69R-c=e8h8r*4{DffFt1l?6?6|R}!ajxD7CH;dJI6;jd{QtvQk>9<5#~)woH$Jg z$TqF6g3wLXM~BKSUL}c*GHq0jn09VDa!;;Y()GotbRzActo0%SDYi|i zqAjiGQ6O0~tF9gKlJdt>tWQ>>zTbRCP)Sz+k0#D+aKW|yt4Hfq?PVf^R3XaUw$jsd zF`isN!iIAjm$bYxjGfCuTmhj)>yJucq?3%)xx^BO>^uRzA#a^fS7|fk6S80Mdw$Ho zh(FuhA{Ro@AFR0}6XZXtWv^I;9+)zIwZ$|aOQuKsTaaSer6`(6yp#>l;e9nTz1vEF8ExDauqz~iF$sx!Pr1GmL! zIXCdr<&jIzI6vWary;BQO6Fs~rDb(l6^7n8d`f!bG`}$=r}2c_D)+8*1jAACXX(yM zdq%%FtWkaBAv7h!p~$FkTA@XVPZz6@^UFAAs@`vu9RB-AZ&lWfPGLMw_DfU#w6V;J+&}B}`py7g=!SCr_e}QUd~FWvN0qQhRL%atvssVb>SS z2UB#8n0+K5PP5*#5_t!mJq}>$XsBCOj_lM_ zkLsduRU(eovkWYQCx9~N4~kjie0u%REI5=NM1wuj`Pjug1T9nT&?D(~%Wdu)j>XOR zuuS*~N_Z!Vt^E!efYSVYf=56I<+s^nP$h z_uZAt_Q4^K>MNz5U*fYtQ??Lcf2$d>?X+Owae-}k<+n?^RB*5*=UMHXE?F*Ht9&$R zr;n-dJ(hC)K->1Z&5W_$o2B_)Qd2dDmL7Pi-bba%anR4@hjadrtQNGise+McQ6gfu zxCn&cT$N9__yoF9Ka`s5}3CE>O*>l8_S5O@+Daaeuwl z35f`n_}QeZe#AKMVQ9}SUsZgAf818(Hfvt?$0i$>sw(Ns>6s;<^abf=>$HK}O6MN{ zanFW1pNbws3sOX%n!G^1_T4A(lqZ4r&>38K!IRNH0Qy$tKY&!|mq2L$cdDxJIj(0G zm+}1 znh;N0TR#5pi~o(3-?8Ea<t$umC+62{G(h^|HzT z&3DX+A1UINdM)!_dh)*~9TU@MA?~OCQXBfkw)20}+hSX@kgqHL-_R#L5!pcI+Zd@6 z1}GtPi06l%VDQ1#!h$P9L$(3B0@EN~V>)SD4*$97};Y3M=K2FLF{$L-)9 zaTs7%X{Q)cU-8va;(NRXIgd=f{Mlk;%eg{PdcIQmUA++stFBy1MP88N#(Fd2@5g~9 zK3XY3j9kB+hv9*Xl-qTQL@o#IR?&QH%=XyiRNbtH%JW;Yt!mAEK7H= z0Ic{XQ$J2f@NM}Gyi-0@1@EZija52eR5NOK94z|D27jGR z;UfeHs6lD-UHo2;S?wy$V;I-NFiCKf$urc(GeG|Jt};iS^|=gVES`W#cwpzV=SdkF z2^z`ClfQu2+L6!FAARD3WP<=Rg9e%M+NIR8M)i(ngjxaTZ zyD1eL*LH}jshZqkn0{h1e`^&=DGGa7TdY}`s^A_(@)yUhbRX}oDHHsWG=9@Pq!6Nj zBOvIOIAkt7&5hzcC%l<5I#=SDP08i&?Ah3q;R301)vlGdQub=SJ{w^85-*)~^OG8@ z_6@RPMZ%M7Y_0up)?T8V@z$lp$JN$Z^1om-=;igI%=2S#ic08>zSGxVa{>8cPS}Qz zc#AEv1f3~a<)&g0ry6=WLt`XE^AD>^8L0{+xS&6=q)(VBRl%$rUKFPV5nNe^FC{xtZs3Y~8Eyab{+%V57iRR#lNwcw16{)@Hi2H`j<(fQkw` zOODe(`HhtmPYc*EqBDD8Sh@F|1O9C9)|Y%j`0=kInwrz4KFWw86E@PHvVNxkp4%d z;VG7Yv8OL!!(hD~g5&+D^`f5XpI*y%xJWDfTQGJ$F14?#gtyFWdk~?jG8qDw_I0Meq|2r$%a zswvvIQ;AnEZImKU&`$6tt&jM$xV2;?p zoNXRq5v|RLTc(^)2MbL$v^qf7(+k{(^$f__;>V!42?e8^VdQU{*|rw-N(Dy*VGLtT zvTghQ7{@?9va1AOg5^V@$wHGKJK2eG`7?c^qcJq*cx`CMpE8=3;a629&WHEEy>0i$ z-ZQ;))v|q>r*@NM5Bju>=DqdJZ0Xzbgr~l$xRgkMi6PCTV;5CN&tQ<8F0wF)LkyaG zm=>*_(R4mh#T$jxanqYbJwn3uL7-&^QL?9Gbj@_oRtkq?)&dnNb0`U_9$+0kjrLaj zMv~q)UBVakXZ`}^-(BhjWH4a8U&q8EZoMB!6L=3vemao~C=OTh?J3H0FaDq-oiebR zC+;?vh>x?1!5rsSLmKuB#t{*5VNA8}8cr}aaAcN9`F5Um#NSNq3bXzk%t7zzJTnGS z3)`6(4M>&k!!)LJM&_rry^$2^e*gWZ;f<9r^A_u_d7yZv0I4B0)<_?@7Bd;8HZQky z>6+l4$KxByS9@W;cP9A0j+!H7>~gkf7&e?2)zL}NupaAPViMKX7>gkogN!<+!2F^wbyM+-tfV!!u zIEEsHeMX3f0WhKZLYyJ2}3J^@}nm@SCztqWR}bfef_v z5=32+`heln-(stT@UVcPBnaJhBKp;0mmXIk(J3;`Y=6V60noZ3Rnf|C1GOXZL@uTg z)l>S+igw47*EqL~Wq*`HY!!9BoUb!X+7NJLvUV<})J!A<1iAXdrbIt zZO9rL@^%Fa;I$0P5j@7k3lK+jQ7U6)k3w(MnT}&4mtc$FIB80kTOvb9E0SKokprnp z_DL@yrf960XRMAkIS?3(e*Ynd@+LxHtXC&SaSpKda7)y#^6OT_8nQJZX<_;o_iBQ@ znUnXJ_T8wKYY3H)mf2NjWS_s+3wd5r;-c18(`;b2J{hI%GDV z4g^o^QkkuWP-u*cAe88P=Z2T#b%hw$!*9M@%QDR)9?y%y`>t<7XE&W2)uLSz_w`!$ z^$F(YJm0YN7x_GO>>WN-=w7D2HdSKnbx&5*1wXSB3;mHq7a=g|lpnt0E_W;ZZDBDPY`rn$!n=i; zJTD3TdV6|)^;y{>O!__`Y+dXGpt2o3yhqn&EKhRmsO+Az(cs}9B39^0C&U!Ea#Fr@ z{1zWz`GTJe*9ntCaqBZaSacuU|3-R}a_q?EsIaqSZ*A z>gf5&0~{7p1D;=Z9=rmpyW~-#E3cdZ&9ADcuarVBl|6S(E`>x@(H`gp?n^ta5dwe3 zn49A?!nk5-VZekSn*FVI^gw!YoAStOuLb*5?^B2G96PSXmLxt4cdq3N&C#Qqp(M&s z4+!V&;l0XR`Sp-fQWuk0SrMNSR|W~_6-fD-uqcBeO=l4vF)_0Mj&}p`8b8`yqbn(mxbjx}zVv|KQk}qj-|a&c{?@Q(o@33zjqL zgiCuh$8RPLTCK1jq8+%BPXt+0WKwF;m8XxQ_WejP`-rJELZeukvYVnLoRTaXBQ*oP zzz!Bq@n0tSQ$U__LqYEM%9x$z5(F)rR%sw2{_35KA*pP0ecu}xcd!dlB5Uz3udXRf zPu72wC6t+;DCFlxX>8CV#fk)Fx@q20EBphrT^sa+VTXNL?L&u2$h+?f2$VB`Gv=z7|!5O)8Vm@b3MB0MTWEkL4Xc+jW6=$lp-9=bO}GWAxOVi9QpU8N8uYVv za!h_qBUor!Vt9LLX&+@r=|yU-j!*q0rf-`HMPCWBSNxbN@Y(=(flwqu46BeHLHNN{ zrV6v&et=6>4BHGQ;HsOd_W3T0kOLZRs(p|M<@f&H|99%LUgN(rS!CS2D_C@gJ;MT7 zB|WV-Cl3Y|o}3#>5H`m!6l*gjq^;qdTSvQ#U4|v(FR)XML(*(Qx19JHYMW`@QPFew zAcdV%xG_od?4FZL;##&ML&MZQU|yBvMwV*B=gHM+|MEF62TX%RjsbUxet&y|?+q2utj0A;Pc`IPR$W#;tel3zICv(u4i_75 ziJnH9U--k@Qat(R$REERthqHbY!#cxoev0}mzy7|cg>%5m$IE;WvIAclDD4z%tTvt(uZZD1)mz? zU`Ra;*eo31EV5VD?9lI2ujFb2#=1#My1A5%EB@j2X{YK$ z31$U)^0+LR3%AAQl)|EiKq!vv(9)dU_9K>J%xJW;R@X1@sI}GBJ80K^fr(u%^x@0S zH=%boO2Y?dU(f_k90cy*Sj?e|vKp zRg-iQkqnyvz$^7vZY9m|qqg6Bx#V=Y5N1FPBS7b10efL3mDs z2{)VhK?JjcD8tN+?rL6gnl(MPn{!m>cA#!t$?LK|y8x=wQiKA3WBp6?{T z@|ZgKeQ|-dFyidh>%UsxCPkv;wT?&(Z`0ttfm3$Iyv(`A5S`(!JLGG)x{G)Q?E6C! z4vG`*eytGUdapro-sonGz96Ll`E-HDDw1MY<#fsUjhfS1`{gOLq&^sTKlu%XxP7F> zVGBXJs)~!6EDmRs>_IZr!yPbZ%YOhJW4?t=nMk1Ggmn4aXo0?};|#A~yCnBpMTMm? zHi?01yP;)kX&nCmu{qm6B)*v?rTRPa{yLVx=+YVZZYhGaHcw|oB1@HvReOwC60q)u ztkEc~q&20@1T_8Qpl*`iOB|{@fJNZ-yYih`8-H%jw3&>Fy_e zNt|jHOFDK^V^@Z9jTKeQkwvKEF)Z6@rtT5@PlzN5@{7(`B zd1el|?eagR;?S;l(KRlol$rc)a;DsyI%ZtUVa@vdr;|l-6mx%cb{>BHv`dasR@tiJ z=7g{8`H_ z>&lue<2*5U*_0q37@_4*vdk4?~vu_)h75- ztLPQnGi3YF+LdQjdvjz@`?hw0=>E=7f?U`3*geyY=7x-In%w;fDkxZyjXMSx=vYpO zJS--BLmj+DdQF26waB8 zD5<$`Bts9M#R&CbBS4Q$I(orso$jY>7BkG-f*#gz(S=GThdrHBVuOA2sP+T9VU?AoU zJ7#R4KSUEtbdKwfzVqErhPNgQuSk1#=Xc!%c@`X>Nrwfe)GoGQns(BMGiEh>NnGj^ za=Y&j_J+z#RzwL)*J?xF4BuhPxuWG$wYxQ#P`gYS24cG@beE>3cG0rjivO7m?Rq1B zU)ahP26Q56W2Bl`qYL*yWtW}H$Hv;>@Y(hGy}_%+8cjOoD%_4&#kGwG{kGT$7sDF1 zev{1z@NU8K7M=cD^0SSofjkv{A!v=sIfBVgyX!$7*D4y$iYyGQzjHH&exwX^wy&5J z0QLS-ZJu&t{f-vsY|0F>*>=`$6*IuTznKdZ=eNkMuPf;I)w?{TR8Ja9T@dBs%dl!1+w01ssH{B-1+G<5RY>B@oL>xbxdU?CAjF~ zjX*O@vbcgu!X7Ayam)`KHw z%}51n*!7S-5Vm@OzzVvOd`#8xm-yt>?VOY-0O15WmDDV>e`X{c>ELMwYDC5Oq#@NI z(d$?^uyXlD6viq+B9A-%y1thhQG?-Eg_0U=?`2Z&C5W29_U`C!|NdCSvd$9!2)MIr z-gLFB5h?nJ*3!7*qH2ygR%-eEg?+vL%9G!KHU%E&rnKO6f?#{7NZ8sKrhN~ANTV(s>@h!Art0j@f-!PstvdziCi)XD{)SHGZO z_!tkn$&|a-w92s=F#NYwBxx>;6M%4>lLm1KD2&zNm7?PO7vwQ1>vtcxm=i3gb@IjZ#TBu*F^>zmocOFxiE*p_##JM$gY zObXaQAi*VJrX$C`-OmRcB#U%>7>uxB2f9ST^bnjvQIj|bRV{kSM?IEq(VT~1xcJSt z)QF<`2||+=rHg1mhSUnZpf7a12hldBocG@EaMNRwF0Lk%xk3%jamzIUn9hTyY8+p8 z1+!VKOOgfx;A#3gG80?8!@Ti^c(C`>F=Xt-N(o*q$>I)&*wk5>lYEgAsz0h0fL;X8 zE_NS&cx-e76&jFqm>73YDwk4=N1o-_ziimQ4{!M+SkJ1x|f}-8h>Ni@ym`S?V@JHr-LPC6)rmnu|)LWJ+$Byz$ zrNj(m6isLtEAl~}i3#n+VskTrH{-*TGW^o<$PltUst$Sxm}JkRw2fe7+T_&u)p}_ zMfvNF-#NoayhJ0q)S{xwg-O=%vWk?F6hx=iPo%6prWI4@aY5kq3M$iJygEt7ZSU9H zUara;_OcOMwLKGXx5A5TkJE|8Yp|2KrtLR4E1=EEDBg_baRs&3u-3&<-56lGS=hgh zI5)HBb^ik(tF1BY`>o`*m_hT&j~tNNTH<{4%{K+*Un=RJm7|ybOpCi-H3&ZbjvGCF zSVNQ+OPc<2T(v#A#l5VmKigyxCn6vS=D$atr=suv^twHp@0;Ho;y*#(J>4OKK!3AP zzx){rIgPxB@hgvtI)+|4{sV+a9C$hR`aWy!7yS3r)`I)>1uCnnmrpQE(LPevqdzt$%kHf~)X;t*x8Kw*U8=tYn%DoQ4kWyq)fhlUSTT=u3*yT>CJ0yr5IO9G6wWCE zUXErR#H*C2TO`bpkSzX^iv*52O>657;P;`@WEt*OVFUxK^-(u(LL-W)^Tn+|OMBP_ zVB)&g*z)U^C1gI1Ec+-g!%0ZExx1A2{!~2r09;Dwj#@585Hfjrd|aB}hiUQnQ!6$6 zo5|?VI%Q90QL3F@nzr`|n+u-ynAY~5Rk;u%5!Z!~)`U6S9*YKM3un2##?0GveB{#V z5R*LdabuU`a%Qa$q6nJ(Zap`owzUraGRTL_*r|F`vRha|pY1CFxxD2CM3A=LZ~4fn zUH}K?+3PlEok-b6Vx-ovhIp~dP5dMI7(0RrH>hkKtr#;q|#?Wzt{{U`S~E7 zxXzcC4Z5W)_N8tWFU>W*3#7KQ=}u$~%z>^5@t^K_*pE8D3PyE{)#u9bWn3od-N==q z4dRGo?A=RsrWd%aG1blB$;KpxjPS=b2 zF)`*ehve@C(!afYN~we3WhDDecu<`7ff_1T(UcEwyC@y6A!4M)bi%N`t&mf*TEu@j++Hb9bdTmRfpi@ z4YU6vTxmMBIu0bmo9Fp4>~~pbY30)hrM_Ap2-s%aDv14FmQ@vVk|Je{IEtAO=Y8^i z^N%Z0mb7Ih%ry!$9LrQ>%rA5XQg#&(MP$hx1w+$)b_jW*fpp=zCc#cw!|cSKlM%b6 zBS|WovJumF-?{QfJYC}9w1PlI%6wO5qXD`Z>DhPWy84qekW<|6<#@<{fpnLZ&HSsE z*qfVA?hgSG$@jCdq|fSEtkTTX zQP@>Tf3-!IGHh5--pN~``;)YJ=X1rpe)Q!^_;A`;1JN*Rii(H5m}E=tL5~3YJD~%7 zFx9IGVpTUyin$)Jq{ z4Q~$jqc`TGp)TG;7VTNDRo8bjgZy~-y<0GkzKVvUJI`ega}WPTQ)B=~-LjxztC+sH zJel8w7W59eW#`=Eoifun)kU{fe+wqkd+eXTjTV;b26q!j@`Jge+kQkX6bqz3?ux}d zl9PUKsd_S}Cyu~jI$mytFSyq((TEGRmOJAm6r09RY3>JOc~fOpR?2A(rX5CvLHEEp z3UUV2MZ0oZ{W!jj$IWv&nemMezCs%=>W(quzuYvXcxbj694H;;=r2X)oG>Rjh2107 zb%ciVd^WCtQ#isD5j+9gJL%myQm^G*S5BVvi|5+qeLUPsT;p}z>d%h|N_f*ti@aSt z>As#sejVw#J9N@%Aw*A}SDuF-m%p2TI4Vw)6W9{McrWymw96|)>GZE~)o4kWaocfM zXf!OfDwv&?E=fwRrz7qKn-*!i+KoLsPLT$-`>9{<9GySvOrySaGG)~sC4n~$nSgG0 z`18Hf*}b_#3gC}6Rg`ncv~ew;2^Xh{{3*b4qv2Ea{Pm7SVTc)?${eqZBD2a*7IK^b zziv55 zN<>?R8`#t1sv&Ggjp0Lib}R2#hEaxC5S!kFQ0UvoAy!5b&n^U0AIBxgeIxCw2YK*ew%ur7aqKwaq%r<}A z%ciTVqs@uO&+P_Ml3r&<6_T zX74bhWlP|3Ft}lP-nLwMV@qeBD!9RRY!6p@D)4n#iiY*3QB|7mTZP>W-~YqcTSc|i zhTYnv`rq=QaBvZ42j{kb~Aj(9&Oqs;Xx!RY}nI_uA(gIS)>5o0aC>1a4J$Dk9_A?-p$r zt%jb=T~q?oJ1ET7m$xrj!RTKAfFoavBR=GXQ6y18c!JeOxLN3O*v)7^qO`mRRFLz!ym#rnV&>z`yxuS>;`j6thTZlBf%;`@&-mS{}-+qQiwv zw6it(@|((JH9TAU8VFIW8=CNij{qx6vNRB`9@{`3T0u9Ua_@bJ0$%2U_r8@mWRuec zzQsGM+oC30VGmI@KCur<)AQ#Zr>6ovFPyFUJF?pBmSi4{=ni{ArwVgpRvjcB%cFV+ zkXGgs*idQ&ku?0mX zR)+_bqF0?BpnynEtR)XLr3KTyA~hZitSQ!oguV zg#Tfqf=~*7oI~KgJ4$lCYyU`_S0tl7mAARWck^>KT{z$U^r5g*b6xS=ALh=OY{3*< zINgvSo4uuw=*2`IJUuLFE}05kjaAfZibQakUw}fd1m!9I;Eh2{mVVjD-{i$bfP(|? z6qB{OBU^H+Ew@6)Xp0bAiCbU&G9MHPsWCICw7HVK_^6S|FnX$b;lSB+Kb1klmo_5s zJ7F+Yw3{ul%>Uh~qoPr28GvZ82a(x^@C!LvYp|(#G0{@9vytJsV`8k^Y zkp=ikw)$&Hj6p+!gW+Ot9i?k_wKO=}W{BPj-L;7Fh+WF7X0nc{a03uXaT`-|*^V`3 zTD-DRVod$b(W6CJO9JVAjo~o# zW8SNnBLVe6f2J3AFi`@BA9xQ_Ue4eEB1Gkr#LtsQLzs`tcE{|Zg$d#OeconT{!@X( zwRy;3=fS9g@CzuFU|t@AzT%^vt)9|08kL&WEv>JcY-14$UenJvdNF$PYRi=p=#H3E zd|c}&VC$zmuLyD_EI3N8RVdPGf2!abDCuSXl{sC#dmR@3Lx`29vZ_oxHtosmr3~ox zlafwQ)?o_tivPXRP0eLeSsX;hID5fN7{K2i&W8C&X)PMX*S?vDH>9Q<38yf}L)vF6 z%Is4=6sw7cD@S&HZuT|PmWMC2;1^T%R5*WEsEN{-uYBhh-9O$YsX7=O?e4f2t2CgB zdBZVi=KpxX|MxYq&266>3j}aT>&zVja}2d~vEzS`T=IRGD10a*KGnNE7!rHD`O`fM zlkF}Zop;lGl=PGobtPfZ6I=`}^^v+&EsRX@>mBVKGuhhERYcX`CTeFR==B%|9;jl- zBVP2JN0*v>$6U#ugluKRk8fIq%Y9jXD{jA1EqAAllx1#>;GC}rfL4l zz^9`ovZ*g|Kf2{ZMoC~=z-SmG9+Dvbhs~kLBRfAytOCz(n#1!wk)dzPE-ZZ#!qfbg z%cyaKDMrSf(AkXRDn&U=>_YHOB@N@wKSAE;F8N#A=JUdbe6Fn>by*>F!+u&=65U@7 zEjjl>6;?un+L+<$Cy66CrEnNkKx+Yb6G%A&+zv`8I0u#ro25>fB^gq1#(2RLKmDLZ z^TYb3ZX{H8%JGFh*%LY3cdn3XUHR?d_`N|E?)tPx&H1TBNcgYYpR){pBmy1oAFf3u z0fLs=*zV}+jlxX}vzkTy=n=w#3O2i7Ypct|9bSaTsj?e6mRsU##XQmEq4e;)Bq|Xj z#iw<*Bzg4;8}N<|T+~^b*2+DKr-BGurFYh*TzE}YbbQ1NM6*#!MRi$Ng)XbjB(bzgzn+>$aS|r%YenQflF*AyL6~CL?Cdp}XUkYG-&K=l!t~x# zv>LMVC+LQ8yrM>lJ(z(I9}=U)T#-2ZY|q=HnXHa zl~t4}In-Ip_e9QzvOo43{>P3Jd6tYHYZ0}mOQ zf&!DYlB_XODl)?lG&J6k6Mr5=nLrt~h`9@LGr===hw0Mvw33$wfr;v8B3VYfAhrBu4yd<(8`fnIsaG~0hmUUuA3Q%Q~We%=ck$L zbjG!en?v=E+?-(KZYt@o-OjK~TgNtPgvJ-#rVsk*0{dfvt7&Iy5ZX_gsA$a$k5nPP zs3B}>w~+NzBVso#?s*L@brDVJFTysTiERxjA~ks@sNI}B=G~u7*l)0f8-SXIx;5q8 z8akivl>nvmCDM#sSivs;!EAQ;iKU+YEGyLy3zMe|NeO!6;+Brul++)j{|-$2?XD5B z#6Low3%Pp#tMJ)pI5DubBmUN2=2!Q#r~zXu~HluoRp_~QdyQ)RCokVYbg4%4UUo9$yh}4 zqe)>?P`Zal7&3YKH4%R>yln;GU`UViK|0k|OiOdF{~Zbn`SZq1|JjIBz~MUR2Z^8< z_Z5%xG@}cWj3Cu?wMD$5=r|))MdL8VheHC1oT-iQ!e1U98IwuuuzXUwXjB>DG2Int9x!T|HQs^?}s9LfBzk`XcEVP6gG zV!JB!Asr{jZBc@46+dlvt}4##sKDIuyZF{wK0iq)sRQselNHwQ>X0{$Z>jw*qxPM*j`8o!b zik;KmBzs#>9e`)F>8ExHH}?)`R&i{ZpfNK&Vg6F2=b0PzOg}H!4~0~0;uvc_CU35M zy`!>cK{qd|Yb%|qy-!ghKZEjd97=2x1rzJ1#g*3&{B~4Ki07hu0CZV|KcPGaA1c@k zed5{}Mz~T+s>O=yFgUb_CGExu&E)aJOolhFrL-`7n@BBm48;m>{Lx@pVgCK^pJnAc z*7VO^$KqwL8>*V+u%0SC27f7foq}E!%ul<N5 z(l2*KBI#O|W-cm-jO@!(C+>Kh>!srVi`ibk-_)<%d2*^^9M>4XElQDXkf8q)({9c~ z+$c*R-=~7z_68y{k*%D9{4=zptk@^ztBGrFJ1Ho^q)lHcJ|xe0%KGAjl(EMzv?Z2& z;AMU=xJ!>}*XS~7Jgr(cykYwbi8aGIpZSYmPGaS}U8XE54hvbC7K!v;d5gN%c>ly+ z?7BlbPHD1JXgkja)u#WX_hMs4TmW7|;$c=62aE8Of^{@M<8Uhh(Su2MZ`%7H5Xa>v zwX59-d$#YUVu19uagfgKjvT&kSm`Bo$0g27wDXO`u~O~WZ3XPQ)u9μ#2Nq(5!F z3|&`+K>i20#N06RKQ45r6CG3Ywet1;y)z<4+CQBIFw)zD_eCIP8Ij}t;bFCve4zSa zweBbMoA|?ZxFHOPaAc+(hN*TE)Cm>I8%D!730N=xGO-shTeSAiR&ocYJ^*(9k~qsd z&HMlCkRhQD8~QJ8i?piS&2!bYS%uj2&;Y+dMKk^U6Rlu-rnnXRfaTnmKP+v3Cihr0 zQgX26TaARMS}@Mm6C+u2FKu;63;ztaoRwUUj75TTV^!7S@>w()w!}#8kx#FU;Z&bu zxtZSex5*@ZpneE*t(u9(uXim|0|)b!EE0f(au^s#@g?=*G*ECu9AcuR))zOGaxX@+ z`Gj+k_0zQ#m&onqr&-Sq&#>padokpbsJ|j#cT;rmX@pjQQ4!H8-v;F267atvf?>`@ zX?JV(!N(_a{z`&8$}9p`xkl-SR`OC9Uycm~eI3JR8dvYy)WwD+WOG6*$=ML66l_fsmfQedJ*#Mg2dF;F&xc1G$^gL`909J_AI}fJ03B5d zJK12cvghvWoCwg?09o~BA^D~ECE4QUge*sP0Z3x0rZRxem7s08ZX#CKL_ePn1$FZ$ zhhF8_2lL8Mz&HNB4-;BHw+2)29MgWDipUL*y-;2ID>JbP&Bx`^CKu-s z{%}8DSenjTgXkLjM1HB<#IC=IajvQ9gD!n#W7oG|a9ifz(iZln${MBi9%8|ac2sbY zjc4Vs5BfRWin)FS+F72t?jns%stJJ%PIID zXO62eD|CNYOJ?IPJ(_^oGb@hOMtWt0cc&(GCL#?ES>V4IF6q+k56r6_RJp(ZgUJFu zM9&<8eWl{3U1EBPO8l8kz%H8!j@>*^BhhcvR+~;DBTC2)PexZQ2mburBssKn*i_cO z?!IAGz8~7)+p|RKm^8|=y=4h%&RH|4a=<-Lg58*3c0$Y2A-CEr_JMHBHyrBOgnx@R z{<*73JT>8yTf^xD8ks>9oN-$7nH^Fwi z)X+d&*kd2$7%jH9|&UE)d&9Y`K+bK4)_ja!t+Hj7b zyvHfOR&VZGPD(t1usMA{IIX0_3?fqB_Ndc*;Vu|`B07pr_7b3Bs_N|@KO5yEQk;Fv z^@*)HaluaRK~$2E|MR2^!`EbM4U#b?(R~o$REI#OE^z!I^4HM&J%C>cXs%R+1x45N_Zi>`h2F|w@roqJxj z`979TwN6$7+ua!7v%5`nDwUufl~SOcpAIm9vi2wv3Q85s01c%PJ$S6QswFXUX&m2J zja%rs|JF;VrXmZys*uRC8WnMTWYc4&G5d~cb|OKfO#Aw;hqdCjRd(W`&rpTq$jO=V zLCLtVvJg}FDI3^%PG+YRW>_ifpd=sBDk@zzkHg=muEjyu6PJj9&iB*i&5aB`3snWW zx;RxRwN2DcFnvYCabDfo0pMHF(?g>lI?Y>ha?6HYmi7IgQf(jyOI4153|z zbsUBTe|Feg;$bCv(W6e8!F@lvKY}DNps)KlF*fu}oHv6qb}Zhe&IHNr@B1LB^}v<+ z?2^##ZGY8Ed}Q0OBkPmquUUIv)M^SJ6n#4u{BGV?t*BoG?6{+bpIV2e(M8hoxC&y7 zxa-3l=-*6ahL2sned;FE_+I_(_XLnmW~xFi+N_Hb#twY{5JmBSzeNh~@@S<_8e*Sj z?R3zORIpBeFS8{qskE1MDR8=I7iQ<{cypjq3qyt6cX~}$HO_)3hxhZO082T>jX~a% zMOXc}=aXp&GtiM>%vCn;u^)r8qKytGS97{WepJFdp@0BbmB5>`1@ zi03~n>7*KbtAU7)Ufh;Am|<%rqi$B)wou^#bJ&LSYqy`L_gwagm!iB%r7A2oTT%1p z&!!3rD9C$SZK?<$MDUX_qc>i;ddO$dK(yAVj$-X$A^H`$zuPc0J3`50dJ+y%EIQwg zP?5RIkn4IHk3f)Jgoqo~c}Jg(J|%)vA3`L0o%v)E)V@(oq#Z316Nj3CEH$N8&`hb6 zk@h)2jgQQ77PLhDAb05(5L~TYRuT^w$ho-gTq`PY95BppI9uq_s0}VbW$nz%xFaJ1 z>x_y9!I*K!eD-xC&~SN@-kRrgpQb*iF-k*O8%qW6M=HyT%{nu5oQoY{tAI zLP5?BD|P4mK0&0Om|e(OmwEjncfY<4Vl}e_LzLw_GkwyNudu$IIz?eL4RSz>dHY)Vz=Kpr0idC8Ee<-Y{7|x(>P; zzrhkfHEW)61S04E{ozCQ%6bQ<7&I)&(%rV5)y&@9OkfR{re|3+>0wO9SGB34gxHsp zZI0OCYd>dCgyD}Gcr}PiHRkipv6n`Y5l3;GXF21b3lNz53V$I#ZK7ncX2?=&(Lt53 zH1M-u!7~ZpY$z3$q?N?oPctOoS|s>*cvMA;iW!*K-3^~RQSpYuB8!~QRsN;bSz6`d0Cf=6pL@>=cE{yG7n+qN9z6Iu&MD-8CoZ_m zJE!Lav+AtyAB<7$G+rWgqE>uQKi?8~pFE1MKY00=EmHw5)g_5{R46Zv*82nG+VQfZ zG_I6`eOf`RIjeqZVN+b0dVrn0h=T#gkEszB@K94gn$C2K)Ww72c301ZQvq+9grB(w z$}C!;P2#*6jrmQ&hp=B=l9p8}@VilC9NSekSvsNfXAZslz|{znplm;0h4JT*gm}fp z#erHS9u~#4GS6H_+B9!s1sbjW6i+<1ToA_(kaQyPm#eHqtBO>BZoXiYc{QIb;Z5Q z19M99fV}1@mkv(Lf^OBKsu6WBN3rBkI0jDFE^9Gd=S4*M2(NHNX|$wsQW_wdRbRN1 zG}JoyL#b6u1#I?XD(wVQQ|^|dfx3dlhIYD!l#Kc8S%PCxQGx2{mF1*_reSYTe;Ot1 z&~(t&Rj0-3z4Bp{epa#awy+nD59pdAiPC0)dcpxahQt_m@ypO2{zX@B>QjfPa49%0 z%S*Ms&y*Q!oZFRE;twhVDgGr4FD&2G{t0N`CJiA;hm^BZlfOg)*EznF{#%}nMHUt_ zaF|dbS30Q;CMgXf^O7;YkgLaJUb{yQRt9F`Sg3mNo0hxXtD`PRut*nr3as(vvLXcg zR(vjhq942zAdyXZ%q}Ex!eRU7_aOYP)zGtfVO>NWh7*$bh4m{vqDZL1aD>W! zv_Xxtn%{z-6^-y7LT)aPu4Yzwa8k)a3j#M<{Y|4Vo9yBZk(HQ9d^`1>lM-{><~D92 z0XfXRXjxP!jG@gx+`CudFcTf`Komg{p~gPKjr-TCp1D-(iIc7iCEt6O;FIDeIS z0B(mun1N1K(17-6DpUJsYE|yq(q%HtHUF=iyBNg#@k(A?#oDzF^osnqy0mq74YN)5 z!ftI$z17qY8&D>Qahnx1_7&*a_CHP8G|;B(PCSGEMOSG2iZW>QQF>SKSCF>P$_JH2 z&zRpP{}Otgc%82VRVPR7&|&!XdQ{Z2Pc?W9lgb;`+VCArXNcYoqEGv6Ws0h$58wo# zj4J9Z4am?V_`1NK5Yo`^U*C)E8Icfnx;4!PRL@;oR7L?+@}5sF{i`&>9&hgqp1odd zrdNKURo$lNJ-tNIpLy3Pekta+wC!i}g*ibG$P|*3T#U~ZzN?Eg$l6b%H3L&5BMrEJ ziafs{$!!TBHRAm7AIx1)=@$J5tm?YY4jB*wgCi(j<)85zSByjSlj8HM>=dE{v(Y=~E4*VwrAGQBrZV~5uKM-|Z zcF4Rew9oPjHvMQ|w#gjXcBrN|fh-|YH*{rsBX58ANj+}IrRU4IMw@^m^+H~;Afq70 z-*=14`~>Yj9%OI*ch5i)TyQUS@2{CxuZY+>@dvA+2(+lJAN;)$%17~{62b}N6E~2{ zaCG9hu~TQXuXTvdPRK{o{Exl=!IU9#Qcai;BDzRRM%s%8kjl*X(M=7`(WKk}jF*B-yi)Ed8M8$x56hE>V#<1kp#UlzrE&gFnYh7IP}A*{T^RM{F|R`GGhl*8@Xv7M&oA zjba=QWt!x3^O!G>@(1#_{y)pSt1;xO)%)bwLD+*v9W+#?w zy~X3=-@Bcjz+||+MdH5KAcE4o8i;@Wg(ml&6qJwc9Q=PxraoVEyJ*#V<(>;X*86aC7! z-kvswve_|CuJu%?#$#tG4>IE?qdah6?cDwEZ!m+i!fxQ{X(5f9SS-2E19$GCa8RcJ z8UELDo{+VK0O$uYzAhG$3;3zz};VUIX9FeydJi|YMdDb zYJ^-At-lzn2K!yM?UqsO2s#`?J5rx!9AdUgOcSGrxU+TpjN;kY2=tT{R8)wO<*!wh zeRyX)j-<5biZHICuF<4ObIikHgjDqLQ2a zt(~g{HY$o7I9?60<9$9PCibT8d>7g{^VAKH0c5Pi6m_UZ42inbncuiu{<_+vRs>P~ zwMr*(x52X`*qqU3{(RxKH89tq*|x?1tKmu`Ke4K0zJ^Ay!@PQ>NWY_w#zMFF!s@;H zLVICuE@-#FlLUUwc2lwWDrPL?M+G~_b=TuKaME(BGDpKj=~n1_U6uck`WE0(?W4iG zYvu&eayEXoLw){+vG7e2=^W2C4*c8Hmc4oD#{L(V+lojx?t)a-;ywwPC7#7xlV%exaE$fLeQISPVHX zB)h`Kt%XEko%eClXG}&}ng3I^WOy)`nx(J=W&rXMRwBzN|IZvbInd$ixN&UiH)kRJ z#-d~cx;KF#(`Qb>xV1^eB~c9l$UW{PgPUOEjGA@<&FA_Hyr=;3c_teHl63kJBI7x0 zq)evkAnu20if zVRi1(+r8fp;y;y+hZs&;tLBN|$jE^S(w0N(h6Ru1O|?>Hxc{`#vM`gjfsDpZ<-P=6 zwZt2j%i;_%)sxrdtWqKO$PJvcFie-to0{|1>MJzK6tM5{#iIDKYAj9$wq#4L=Bu-z z#ElCYwyO)V5|qSprF}kgHA_-6a)$q>_RlN+8>`Hjs`0w6vTM}ooOIjdLggO31OzQR zmqzCi;L9r0%s(XW5~@Qt`Qr%!k-F zXA?vLRkC=5mBc{_79P8g5JWBb zTs!M8z(9Yx_ok}ya|;h%j0}evw3m{4QWCvd+OoadDE;OQK(}+MO{`Ej$#us?094mj zAyC*F$;r#M!gh5}hte4qvJE@kmTNAZ# z6>V4YFm`om=EqhNyi~HGn%l)o_T!4%zYSkc5+Ed(Kl2aZ)!-paUMgGhv(TXU+O2%w zwpJjjLMjXc z)P%Cj0;WLyy4yX#J`Znc@g%2gEyJ50oCq>l@4ObpkYf>63Nl~+MsK6?>wwK+-bSNc zC7k$y^t<)<(%C$}*NeD~%Y9+dI%I{VxofTdX@a+JNJKg77wvllG(-QvpnEuXje(Z$ zsb7_=Z&z7T8J&INS`0gQ^rpkb9!;K!$0mC3aRW*qjdI9gW*!$LPL(P;D3uAoi!(nZ zGdUHv#Pe2E=}NDk$MbeH(n)@0mp;g>wM065!(or%N1fDL%GwOWbj4cN4Fd7hJlNd# z(gYIJZp|b(!gBN+u9(@Z$v@RA%2=i_ou)q%u`c#arhPJ12u(AnGwqv`(;C<6+PGEN zVP^CcH^Ll0xp26uex?)B&z>NKS2na!!3w;VQ~ZlUTP)130A6U~O;4@E`446?cgT@g zQ(Y^o!}HUMFrO@e9^!ne=`*vSVUi2Z{LrVpwg*@`@zlGJB~`76?Ie2`70#vc-JkMC zTAOgD#4zKkiCicBE-;K|+Tt7AK;Qks=grRz4Te&BayZ`;dxI&w_Ct(Se<$uyyonac z4mnX46)6jP`5;hyPOkPak*J~l`@&{<*ru&Bkm4ezq$1TDuL4-Hxs9P>|5}Ll0-^I2 z@n|H50fUm{DXjz}Wu{wO4(g?WltrxAD4#3?aU-cfoy@T5qvM(jX7rieA>hu^;3Vnq z#o)P)_-KmJi^q%)yTqchrCnmg`-`^C1~?jk!HW5@`SuWJa>~t`m)@}yH@a*OGr;X5 zlFuxynz7iZZuy_DW3Jt_Hn%hh-d=qtwi{UaYe1UN=Gw4-+`4P9oy&Dy2X3FCBhXoA z0f|BkbMfw6d~jjk)TVGbF>c!6v_=5v)QGOypgOnG8n!ztDX`B;GJ?8zp*jy=v2-lB zfgirh_~ukC50jaa7x)9(8M9j~7BAc2{Sj@R|LtH%_o$M^eSNLj%86CQQHXE~X0^q> z>3dNqbTvq^VwnbGc6@{Fq6wp;CI%Z@b14(vcu`*!<*cF0IICXGPAHq?v!Cp7VYWQ{ zJ?MhJ^|!R0>JEHbG-`DcqDHjLkLrNl$&o)!SrsD)5h=Qz*lQyxgHG9yDc9TNvPHOjLZ@Xt zz!X>DrABh1WD$jW-}<6A#M3UopqUHb>I-F2L3iTm5F<9TH+H-2;B2A6TK8UPIWiS3 zpJ_CRKJ~zgqV>t>QV>DjSdx7$)k(tjQ8-66x5d^|^xG)BABfJmI~@P%WgQm1)4icE zGPBe3#fki`O)WW_qr+v3x$DM*-|Cxs*RSHri`8c?zPn7kJ%2|m#krA0t%mQ$zY2|Nr7F@V$T9n+bZ%Gua zkSwywkIBV&*#cK(25*1_un8i$>DJ2C1Sg)1yG!(^sW{x(QC|DOb!K>f-V);ht!=V( zzdr)sB{$UL;ZBb^vgfd8I{evuw*Cy;HbQb^O+|Q^-Z$1i+P4?knTJ4B)zu>{ylr`; z%5~{8M+-n@=7I9%7o$~OR1v|#b3Dcii*S)v3|+2D6=e;V7>^@xHk3d=TcBrUU-y%R zeRZR_J5Z8nD9lTK9k%FNiXjg}j6tZxmrZ{Fha(MN=SOHKyRRcIZ2W$%yC?NOhV#vp zY0H{+(8{RXEuW4gqlGrz20kCR=E=9f&#z9_3IrrA&E@_=R{bW(Dhuwn+=zcqTocdA zbVOonu(9D41GfiA&C!3ObU9rICbF*Jl^1fUsX?H8plC~yAge;P1@CbiL zI?3l(2PzUk#RkCKP(ME7gkHZc%>HER@TKVvs6qeb`DJylfcvfo>r**aZ_6Q(0nhBu z1)j_FF_m^yBS8o&cQDXzIvETq*NP#Td=THfB}d_kMhuAK18|w(kx_^nD4w1oK$!@m zYhDp(WqA1{$j1<_Y=DA0U;G!kyYnuxLCgT6I^b0XFwL zxVNfmnAi*rb78|OHT5I;Ga@=plS&2C3IDJq+R~thU&WGoF*ukehtB~yr83kXn-Zg# zR{tjhqdk!HjSS)xdubV!7mQ;iSVB$~=h(%~H5N@yxe}#oiC}RpezJI@?r>*?ks8bJ zswU|rw9r$nr?ye=lEl}c{Z{B5<(>UQczJoCW33Ou#G8Sc1^?2vJ z-7H_Ita^ma0I}@jFfWf;vH^xs?Gd)dN5~@dy17`qGBQ&2SwK>B;xB% ze!p<_Ff}&6%y_`s@7@y(5k?4DDd8)PoN0_|krSF@mVLjYHi{_F4O-7Ps8rI^hMaOc z&C@kpNMKcXE^~-MC4;#{e;st9WL%XQIw|XL5|BI3> z{XaccLZ>sUKHGb1u{CJazYg5Q_EVrS#I$qcn_mm*kP9Wcqr8AG;PxJU#;&JmJ+TO% zSXpf+)8*(h@9e|^A5zvBb*}~3kUdRERC_%EQioar+Gx4C-`-xpe=yLjvwMoMUG~xO zfg-6m3~>WldOoa!sV91DGg{l`Tly=;t+N@dYTl#?r#RJ08Rd&z3k%I(Q8BF#()&r& ztd5F#6)mksM_vg@JI8xwMb7lW53fgOL+f|^#qh}H4L`909UHaA`gDzQjqQN}ib@$10{~_;s*W@8l zpAVsn9$C(8f6A5Dgj)}lfZs0x9AvG%b!#q_Vm?^&K1-qWwXzEmV`mP@zdaSeTSS_! z+tA6HpzBg#Wm(|D_1oGcwHSSKSBN@fQ0f-@;!DhY01NVytITePmzhkQqz0T*c35)m zuKA8%Gdcr9BG?qXe^R7MFzK@Z=?$VFaM#lvxCjc_2?Q>l|EiA{Vs;`_kSyOrEAr2G z_8i&rznvgbT%CzLZt>b2Vez{vvR6%ra_(+teC!t zhH$+t(HM+W1s9p+a9e%#W{^r`p^N4k<(7;G|>!?bmO z!HpJ+e#20}L$yfpbMxyOzxgGcLadt3K*Y@B#I~2Q_oy(#eu}{NWVm-JHU;zR^8Eh8 zlS*`I+94eJneOcXX-jPC{_VNrnko(yfV@O%@lK_I7fD0cp|_rYPlLDnONWisrg~Y) z_8Z?f+jbrKwBm$JFYh!$g>swdJ{m#=)ma`(5=|=U31Mk1?KR3X6%+M0I-Yw6VndHS zZGoebNU-gI>Jz+W`T)DvcXxRHNLfxf%T+NKQun2NqIjk<0>^`Q{~ z?jHQ&71OFdj_>oiiHAz5Y`=4Ay<>q<0j&Sx#~8f~db4xbsMM8lOfm(cPDf-6;{lD% z)<)C{l+c^8p0ulo5JSN840UWIqj=jfBLk>r9|M@LZKqEmqRjl}Z{M_U&8dPsNUTpy zz_w#U9+Iv8KJ+{!?)+wURKDoDl{fnucblkX^49BEMf){is&w*->1wm3`uD*}$20wy zL%-9IZ(hLh>@M9(+oUDUFk))03R+DA{k~!hV76q0Jt@|JGw2oXv6gX=nN)wbI9o08 z=Psg-iD&D1FUkINyXEfLkD9}Z-O8T^hMK_OtE2y59Lia{$VU4q-U|BdUSJG8wms1L zuDUM!BhUVW3F*etD{NFNU({@xS~jcD1UB>KdD}fY)TlU$+|M}?b6{i@C z#L%?^7iEx`A!{z<-Iv8z8Y3h}#2z~}g|-40mx0%#7@x8`O`+W1{4?^Yhq0uxtFeQl zGDTbIYopy_$~br@HoYRWkMDc}MM3CN#N#A5AR3-y$~Csmwf79S9d@9a#k4ez5nx&x z`dov~F*CoYUWL4umi;}Ir`dOmofz>GN3KZv*~y6+NUN+&8KYG4l=;$gbiCedML>Z1 zz7thB4Y32*HdZsd^s#31iA0`v-ki4`#+OaIYBHE4&1#(Ue|60N*E<}J`TG0gg(0gL z(hJnY=a2RHA560|ap0d9BA9~~oT~Eu(k2Eg6 zJ>+jCLylvur>- zxG!$*i+^|z1tH~!i9Be%+8dku`gCEI)81j{pcrbn2)hZ)@__j13Oz*Wx!k7sE{YJXRBEc(ZT8%;VljEH3HjGeP z$67nJ`wG47kCv9!Y3WG)+oU@Z)0U_Q_0A7{C}A zxu^b}*zl*ON)FWN%+N>8SlAeo&>mNV_;uucv!XBPRc3CFCh1ES-HI>k5tlT*cZIoJ z=<{)Dl6>HR>CSvQ^2+WR0oiB=jutZ^jr$A~9%<$p*P5~#vY&mhvqnG{H}@EQ+N&YF zg{(BTSkl<(76mf%xSQUo0ZiYi3Zjs2?dr|{1u zqV)KF3Ne})Ugd{d97A#ol=zlgRH3QO>TToTACP(n{d zGZ{M*Q4&R75u@tZUu&dwghm*J8umJX#Hm<(6}+%zACu_KlN z**1WsD6J5?u=Ic-c&Gst)yU+QiToPIQhveBf={X!1W6v3jgK}KmCO&9WjHzgeGhOU zr28j%%gO9G%iy(ZNt%8<9ZP+r5rDBGi}>=+7blrSP(Zzn)8OiSfag|^uwnvp>~Qz&;Wvd5RYmECHHn4hJ%(R?* zlZorIn8}s5s~n{VKqudysc@OmwL0R>j$imY=~nD`^QjuX+M!xv_ml_vY&e?7?fnQN zjAR1STa~4Z!fK;xPEBGBsZ0N;uM-TKj)>t1ly#~oriCQP&<{k^h~OiTNi+sifhvT{ z^K2b8GOF|m33ZcFpCh6q$sJVtc}SF=?m0YV&6D62G>P5ka~r(?iap(C)r;3u!y|Oz zq*@e7XdHg(Aw(QtER=_BlX6Vy4#{D{Pys{ASh{D??6ohXNOQTpNyV;^yHj7~u#BHK zT}d}!2@Km!$wFJNOuJGA!=Cgw{U1GKZrFwZchphj?DT{hi}-|}-h@qgS&VvK`j+LK z@20ax8Tj{rY2G$nE>B#V`(D6xWq~a0CpS0Je`Sq3-dASIf>e>*frvnl2Z#CxU9PD? zy>Xi=u0}l$#d@vLM_XEd}N`d=s-{M+;Fuv(Y1|0 zN*4C+lP2{)oUbVFtphdrgBA81!=Q&l{K)R~KbeM*_P#UI@zbQNY6rnCcf)U#gR9uc zwPSLc;cW^eZCzJq?-VVfCq1PJ{U|JjY6goZ9&d$I@k5hp*nOI|qsMC|maef6U0-!! zZIQTKbRA0P$5l{kl*2q*@F*9ZFw~VMAqt--S%fiu>W76kDOD$$D2k%NOqV`zUOB`i z1|zWH_u&)yv5ZRf_fubs{Gy!xr1`^^3taN}d53QbA8UC`CZDZ;&o)m!5R1lwb;Jmx zqV7At%M=(S@sBfPaRMD_@lz{U9RKrf)!t@Yf{yxv7DTrCX;xF7df>+nRKdr$5y4Iy z>07;-E00miJAqkm>WuQmGyc-|r^Ee+g3jlQCEA-*Egb46{{^zV)jxk#FymCL{~i%v zHC|dXdHVNenzrDRWIF&)HXi^oRmRQ3fp#7UUrtus&rTMKtcSL(j_{(2Gn(Sos2h1m zCwwCQPIBKY-Xqc(4vH9Xy}K{(>SAl?qS~_%9s%0jO3CIpog+ zW^2?SL0Xg8N9+T<6+iq@C@XKvF(Da{dFE5aSX96EajPQp3(~`X^DCbk>VeAfCAskZ zk|3s*cM*k>McFfi`i{I*fm+TSem=9NQP+)8TR`oiwS z7ME$!eQTxzy$bS$49y zwtjA5$F3KmpG?n`xUzt4Rt`>f4zWwq1enpfv{Ct49hO(gGprgZF25!CJH^c?V{QQU z|E;*lNT_ih(IM{H@VZocl(`y+0cVRVa0=>(qU-S1-1$2^OBc&pF0HoA%TyQu1nFvb zC#Fq+#lf)PR@1JakROCiFHJ3ZZTzj4fxuHnM(MVM#OKh6_ifon2=vO1SkaT+t97_O zBhO0mhvh%7+g@O5TD&||OAHWv{|?J$ZO{@V88$Waj4`OH2N2wAc*$h?2D?PU;xN8F zuWSzrk3o|~@#tblDbYnOB}d*YnUgssOwsqNIUun4e41c(u3AY#=U?-+9hOQGy+`Jb zz8LwlFN=wJO5$We5w0Ge`f~EoMiSbZ2a#Uav@A;rm+hnuajM&FE(>MIi8=NWG@rkn z7>D3kzYkux8nz_L30#%-{1RIp8C?XnJmjPXs^lh1h>!t%e zE9V5wrleg82I?Uga&&a1f9ozfepY({cH=G(`MEilzk1X*1bz&7N_DV|-_$k@J#~+W zHbZ|QVbDkC{;^63__S&5>5>0M~)$A4QJb#rbTTHpPQq^qfMcs=mS<^NQn~%GN7DK9chNJvey|w?Qd#K5M zsX9s&u0YIPrWy3--)EtU$`zlgT1P-bmQ}>uuu^rgo>(5uk^(D&n#VD0tD}9EE_P{A zJ5=<^GCPhFJo4qQ;RDbJC3n|IrD@T!7sMOn$LyP>a+?E$obX5iKP&8e)S-$r!PDxL z!9}-+(QqLo3n>35j3V!NYX`W{(JwnFj=x4y#>XMrI(<+!mq+ReAvWYA@I6w}f**?ZgTuQAMZCb0SPe#T}bp(g=Q=E0!iZdY1bCDct8$8!?DG|+K& zF^RkMK8I{5M8vUBxK({vSuhS}z-5320tx}t(Ljx=IC*2oI)AGPew(381_F0CnGn>#ad$58QNW$c_m9@``$_MU?aS7@9M}*-Av+lJ=B`DN)`b_`C77{kzcfc zscX8(B7K5cAj6(>vg6&dgcZ1le&4fd*@#56nv)UG!YF0UlC9gJ45v-^cZroEPmXc# z{r}+Nd8Q>xVP}GcEufr1(t>}6Dj^vDr&ROaO)2^2;GI;zEcx*^)Bcr5!-8Im`m)u7 zqZeWUd5ndN0Y7R}sCuS+x$Ute_IXc=2N^7uMl0iH|Ha%#LnQ#a&g`+6?v)pq< zAvxngKSfw1;0Ktuj*ktGBM9j-Nqr5zf`1Y)b+cixtM5{A9oDZv z<*(*gEe{PL?%o#x8JMsKmS3nK4kQr!kKX8u1nZE&0c=BCUus6B?SKmXEi$sWJnT!udTACt0HqtK94&_NUDy@^G{kb%dBZ}vrD#sbihuGKKC#{YbJG1h#u{Oxu#hgr6v z^!OWT^MLwyL2QH6SU&k*2KYc)H&#s(_vAiG0U2teEQvMEnfNyIs@Vw6+DL{)NP_S(%B+bYYeao zZB)C;(AYR<7>~dso*MzqJjaYy{Fsr0V(4dg1STA;J48pT5A~I>RAnBNC*AJcy%9HL zs;4xhA-ki1pRy7PToL}Qq9Vk~l{uREh+j>|hKu_YH~&QG@W>)ts=}g2+&^oE9+24d zYf9`-gL+(ID-|Q%39+T_|J{WC|M<-KP2NK6FK(&+k2=5wrVe;AZh@gkO9=P_q%97izZyu@wOj%qIwv!jB{mFQPmU=zg&)8Xs83jt-7e5oRhEzB8n^WNWohWf}Q zG84atU>u(Wx+@+*ww5+;fz>pB-jd~1%Q+S%iGJ4jTk5+i$Mhx#xp6Ceu@CYx=KF4r zg=AP2Q_cPnzA9kx3~$g+8)-;$QAKv3C^u8L4PlwVVp62L+v zM+#|7&d0)XTLeG4T0NAB*`Hu4QpSQvuP=ZN2Uyk8AuzUTuc)7FV_0u9P?$r65um;JXMSRjC1yVqelg#+C%okJQ zltWwaNc6jEfaC+*)0UwR7Ey}M#lfy?*zk+LfQ6l|^mi~x>)~WriO%q#qf<8@Pf*~k z8tn}=S1p1*{~Zsr?U^&7oHg2isOUEa3>m=WUdVH>hTAbh)w@hEjHpA?TBE0GAFr`@8I zqso;+nv7|o2|Ws!*|Jq&c+`mOyI!8-QNY%Idv+6|^0daXX(P@gT&axav*0hBjh$b( z#a25zaZLh3{>CP$si1hZ#RY&IVMO>O@HW((WC~Q)58L?<2yn4k9fc3x?SPj`jh9lP zM&SxY5(x_4DkJ#Va#emEv|*8`M5yLw7b_DFC(4Ic>qF18iRjpxPu_m_J_8R%9`3lh zeb<@d65NWaXGwCYwdp$^@|q`gFV}MiIn| zs&`4Vce)ctSzqLD7);a)J4#l6_9RRrnmaYMv39Yl|UfuRzxeoMg#nRzeO$fV<8*VjB1ahAAbG(DL{Fn zP{wwS1TdP!@ZgzRul|Sm#d7K;V%J-JT>ZHlOv@$H3OigdcpP_j)|}Kyt$6Mii4TyL zQL>gc9_Xo=N)SUFA27n=uA1dYk^Qq|E=qXO>d#$j%rtMTaG9Yw=U`9nyS|KX*XBCD zLE5;S3G2sL-G9TiDad)^DEAD@ja zPg=F2=co%+>j1;e`AHP{HqE$eSCyjR6MwNBSxMT|O#wkqM?RE61yKbu>K*ZQ${XyPivx zj5#~8SDP$oKZ!V7qB2EkCi^r4L=Uys_@bwoE$UB0`$btRJI4XNOqsH`)XG+9W6j6k zy`F5CD*wdm3x+TtTy+4|jpj44BWUiaVj~LT#(t+x?Cj5Dlq@QAdxS4uUoYJzG4?8? zdccR;ShLMEdB1dMCfH=OMk-NVxVh#}_pOv6mSH`lq!Xo(0%r|e)C20M!0&f_T>^Ua0T@mD#(EP(X@sZJ2 zISA7(&Bb~(>+%<;A?8a#dn_E$XWQHq+$e?$*kVz$Gk zdcI}RZwJc5+(M?5$V(x^5N(OP99hJs|KQLIlHK2=p%FiQWJGcQj&rtTYtDTq50!aR z_Z<3;H5j<7Z;iiTj6dQEpxr6S`z({lix+94~aIO9DK(Xx~8Ice%

mA2J{~G*O~%~sKLXVep+jUe?$Xix;P!@96N}#PWrX=Iwsu`O`0|0?F~wsUQw(s zmlh^DJ|;9Mhzd^-%q#6F;{X}pF!XP&Pl>C9ATg3CmNj&ZjM1!%aN?53VVtN*09u!nYFJkdY#8id}J&ZTRjes~--Z z5-_|g2D*3gfRY+%f)r6%=F@sqFE__lj}29mWDxF+0lUKsaWiUIS@S37rQ?Y|136ua zIbE`*6~Bo^1}$2>Zj^^_?ss1FUK@ukB8>x42$?<@1lg+RNH9-$Lpwv z;PI#a%ZL;Z$|J<*u#y|-#LBrDPTu_8LT3 zp`-Y6R+L+-u(Z;&gX-6QsaC!^y?l~GH8gXyf9kKS9y{}wyI%xhA@r83#QC#Cj2Tf>2D7%fBa}G(BtJIT3X|#1 z*DsT0dVcH(|5sevcuhLT(qPDAI}5$e}~sr5boh+JxV!UaXg_)PfQQ3A`~SlzDK7}z$m zoN<-g5}o)ma8^@^s$~+qQ~(@uJHPp<@I_Q0(EJ;NSwpHx6}VA+w=LA)M9db zC8*2Pd&yvk;wRVPei3=pJxP&0+MRtYtHOyle)a6}b@{PW|F^%2D}LYJ7P{JC-%LC6 zIL`!vB;?kOc9Dq9mNSK|)u;Djv^{#d_kyn|2&{~N#8J3KIWO_GlWDbb2|K@^sEm3t zCnnlvdG~8a7byiv%qC1933y1x#2UWZ$-i;MwK}pXM%qu9JJDXd4^D9y_Tp~X85v1X z^s#J`+C88%gPAA(Hy^w(U4RJy;cSR1Osn`pR~aXph?Td4j1raxGh2#%)0fg|422>d zpSC^IV#<)6r0Uyl?v(U*mwbH%9v`?yIb3#IqbWPNv_=DQSb_;|Cr~cMeS7M;xB_I6+isN;b~ZQ~Q<= zoAXJzvUra|7kSXdwbGi@#u0a<AA%$ zbSeE-5#362b+g{aO{Y={{$Z7AL>IbXY>k_pEjwsHmHTK7-)&2q2jgno-y!3*K<7}Q zfKGhVdCHQs!mW!cDtTIK)KnD}XERl#;!Ql!X@Dv0Pc>6{-lO?Q1cfLue#R;-@W+oQ z^sHmZ?Qit#&E_&t9}gg?Hk2x@Y`NFrO-HtO0dbkMvg8$kO6ByodukhSTxIMzZsDw^ zx!l7)qJ8O|$3$z50vQ&tb-fY7EOp!?+!dbOzGL33{nr|xH^>W`eBmQAh)?!74(R{? zM#c7ENip=sk^kVPszW9je~q%NQ?Tj$`BiftMX%yN4yQ=#qHvu60Tr8Du`vj8=1`dk&kOsjyTnR$~Wcy;HP{KEkXm<);nt!>{RZ#A_5% z$KP%6=?>q63Wxg3SIrpO3F*K0$&!iNx{sbIF(hX((i+^HxKM8St|^Kqv%;u=f;w;$ z65?HV1hpDqtCeq|vaz(rJQ+Or4RdPjAV;nSq4mh^4*0d!)m40JnYRkbtiEOo3kwEV z-HHb(heDq>U;7(7xcqcaKDq|uPITS|$uFWe!FhEjd>nMg&&$nADzMTvi#Gv$_^~uA zY<+jKSJIy)U1tJ*&KFCsp1*e%DI@IH4q0$1eH)eXHrD5+%qnY84qE4iiSIRv_QE3e zCr}Vo{$y%vNRY){f}`7l6*`2fmd-_Jrb6x}dOU6OK;-&fGQN$OwojgGNomnZGj$86u1&>1nOWxu5f0jB%RL<|| z!i2>sVXR#z#(#z&lO$N9vcQ7Ic4kJ-WaWjrvc!CQJ+7PCnTOTgd&I7BlgftNokX_; zx3e1KWV=GnAeW{@MVyTdFW<*V%a7F)S3gU{*Nw(hrW0OqrWPoj!_mD$opEZH}?*n6kruTy^O1zGb>aMa2M*9|Y3PVGC0| z?5d-(ZnxbWZu5$mvck&ZN$%2uR&j?3{h~r-NO~u=wf%O1C>1Zhx^luXyJ$BJrT~47RoALNwAbAP3Hacwb~I+k zcwt@If3TDJ9e)fTxXb?BX7=NcWhxKC1Muqg+Ht#XT^~B16Mx1rPVV~c$=nF1wx@6f zhO{fNgB&CfegeWTtbd>$;BbsX`K*gXDkBaMVXbTDnmHOUjK6lDCr=YhnwZn|-|i=O zYxwZP%{5{_5wf-1+Q`FWb?w^gPZ#}sdA;r zfnaG1xYx>X%&n-jPAfov^t7jufhJjd&XyuxFQQRcRx|pb_-vtFEbpl1 z=OEd(ht^nLd}jmVJQ7`!h)8G6O2(=6^rDjfXvuM6WhTiX6VT^pfHVIyl-tBjg?EyK z&w_*~j*3>0F>N|@Ql%kl(DfWS>c#x@hq>)tRET1(G*&oHr_+kRALCqg=lt<@osP&P zi6A+%Q&8g{JUzE@Eu5k5Veh1b=^YvYqMkmEzPP9Ob!O`XA6Dc|Rt`M`UIgo{9!kq8 zbx69Rwc|(gUFMxaHEOi3nPze?q8_v`S_!gUqeg4!OpB)C;pd49FaGD`@!)ac&hy9S zl{=7wRo5B%JWLB3n%i!35#gd(cxyNE@U7=(X$5ln&@^*O#$mMisGI{P zEpY8fFU;C_VXL-!%B)&xCsS;1jsDK5lM>ykTez`?xoHSyvzMQOb%C(N3-#EhEMcNk-%klwOyfqS7h4v!K5brpbz0E=0ieD!GM1X+m_Z3=#wtvPXK?2{gNE2iLc-BwV7HE6gUD~%wiWP$Npvp^H)s=OETwxnQ42mh4 zWE+O}gORD#tfVKTDe95zn4@%v-0N$^{M|w>I@WifZm-yHlwZ>*uU3nq-N%OpsK_9? zgu?>1-1mVaC!<5)pFUHtJ=c_xk_fd1x-qGEpAlp%{UxL z-12RDEy-HPjr%MJocvz>=@Zod-N}}( z&9V%SM5f!5&7yIe&+(af_lZDa^XQhyFMlnL0}u`% z6nENdIwTHP;zUhT(XaeL_icCHHbJVz;IQVfCC~F7VvHq8B1&yZP6gO zJ-Px++psvGNDpL)b7>~?>Z+=V#TO6|&BA!RQfG@mx%TWg5q!jV5~0@zfqd7JF5chf z+UARls7p*Jdfc`=`T)YHP&#WZ{@^neR48<-A)UT{n}nFcWlqE6k$n(Ls%KGynFpr^ zg{~pBX-PI-TnHL5w}XJNk z%xEZD54-QAwFy}fYi;87Pik%n|8YsE!b+iKp;)$Mj0W*h)+j&=AebpVWYG}B8bvnk zey2(jBWjl#+x^aXW?LqTOt1c;*zLqb06)7WTUAcsqC0vkms?p~Ufobt7QVE&qyf}I zwN6(Cl@>6OP|F_$$?_k^H=Bzbc<>48qn_QQqjY;60qsRD!ORM8*9*`ADvYPi4;$Ib z?i{t`a%w%qX+L};lnETh3or8HpH5#=UkaG23-xpLeLZK%-Ilr2Dgrg8sY^*pa#7kO zJ!%cD4Uf>sT6simL3QQdVKo?Z8Fe21nriA8qSgGx;h>wCt|^q zBbWJw2TV?S?GO9)@+aY(J^3!HBf1xM)P88r-GVA|>j6QXDuq;(mGUc7rG?#HJwaib zo`>naBR_qp>kXr~F25d#WG$Z5n3tD+B+q}{;}cnMb@SbA$vk8B-kLx4d)*%TW4v9m z5x1>2%|M5rvh;YDAy({cfd=kZaXD|11VN;jFoyQG7WBTWyH`vSo(!{3{R@CNk;4D*;~J(qsfI;GYfldiOC$N; zOE!E^WZMVN$NZHE?1Tt|y8j_|W)KWPVSSfO?%$^`-0!JXA;SP`m#LtEC-i0nooUum zd8vYiJV)2HDTtYzw{RRTSPl;(1Nq2xaz^GCOrksr1`F6Yy0jnoit|~|mdlpTdiXZ< z+N?`u*S$WuRgli@#jJu%^B1 zF*%vKM9sLpz28_9)NGK{NS_ljWP1sd}YL?@8L+Yy0lSM^d%4CWdful!v%6Z zho0-)rdIH%sCop(RJ(3)DhN`-1$=_cFUd`sMg8R6J@TtuBO!|;1A zOj=wi7!n|2?yC|m4m5lc-r)mr^;#i#cU!b#46K4|GE+|~_@!M8)@6GZu%z>Bh7Jpq zeGbx}pxCkPk?1Ep&vAz3pEb|^A{TY|Jhd?o_kIC%Cx->?h-Dh^gK=Yn=~Gs{I16u8 zej4@s;$Qajjt%=qhog4K6U=J+T-|N#p+B7T>{ zfsc1<*?|>2baY-Kw7qQKPAFNcqGR>5tx{u46U%ahd4O7txN|g#q7t&ndg|+On7#7V z*6#5fh1Ou5(`UiEztEf7Gc;CsJ3q$KxeF)43=RoaEQ-JhKSor?M|#XoVU+q8lm;ybG4`m)F1u~Mk{ zwo;rJD!|nJTcO37MPFa~B|R(h5OUS`cg;4v>v>vwUoI7Y z=9lfjUmiETr2djgNflY9UF>VG(Vup~M4xM&KP?K%_20Ckwl!z@bSuwpSk-QI)4M10 zXj7hcO_Nx5zx_`mH!AIxy7Ul=Xh`nDrimOk0R&6aWI&$JLWyyxWnUm)_1%Bp5@O;V zJ_HBdjcnJtsk^iDm=-F?XzP_#rGi+DS!lIdq}$wAMsTI*Xgzo&QTBiqiWcLI1^oR8 z*B=VI+wQnCf^`m_^=r=U8Db7Ww%;6RGZm_#4xeusAGDw=^7L6Z+rDx{R4KyUWihb# z71HFN)^znud52|{-ZKLRlx(4+$|7zhufGMKp-3N>)H_MfnK*NIT=&2BIcL5J3wjY4 z(5=X-`@ZMw-6!p4VGfPbu~8YxX-ELl$R1K{XKxRxiY&}6pv(1-A*XefBc?0Zh}P0lQ^XY~{#E4OZ*re@W0;h| z7}&H@tA0izV0ns6H=2teA(oSs@7F5;Jv=6CLA0*S%wGzhz@(6hXM8mA?ZtG-2`rho z1*6LF0Q}L`Ki89#)dq_tS2f^gkbS4F#s3eEjfVU?Em#79FacTdPt1uzE>rAieT_Wh z+0lNgeIj3Kg~oP)T6sw-ho&M)ZXu{RJht-FjYa<)UO=nKnHbxx7dcFkY#M6J7AgGK zGZ<4!nB3NGeAdidFpK*h8Vkwl(n)qmOb4#naKIX^WVI--<05I|~z32qFWyR+R{Vaeu%q6Ik zL)U>Y0zbnYP`D}|auL{fO2v6wXwhK*7)(FI?v|2KTT)e0eROdSeIFb(ZJf@GwT+PQ z_oInFC_{s{d?cUW6-#^Xn^YXT3oMn;!N-5p5Kn(hnDDgNv!b6WCYkV3aAUy<{10n)WgzdOhmUlri6q2*qOaQ zPm@^OjU^lNBI@g2OsF;dY|hauCvr=li1$8UGqg3i}n{dz{1oWLW*)-g< zkN-A&uSs!0u@@?jD=5nxh?RWHMKLZ`?JS{=3t3eUt`T+)}QIZ?RQvr%xQ z&=6p?{$$oadFR25|L}J)Kkw|NcAC=qKAh6MUKr!u;jV30<%p4gGq;fE0tCyf`qf^1 zV@l0z(3d~7s<-z&dYQDetTZ2R(E3c7m2lsVEHLMm{_f-?+?K)J+wJ8~slo`NFA=st zWjM{u71U$Y797Ks*9)(M++A+cE?XqsUuV2HORFuo z8~Edq->OY$q7DPc`F8$;dlRYO|JGF*HQg?1yqqZ!QM8C2TAHzM#*Rr~rtXIxolK^=}kf>J9 zp$(5J#_h>Q%ng{~<3a8#xeoEe3W3)nT4+Oi^7KKfMI!$gO^iDNhkB-u*-wr!A~-n1 zOeu2bK~hPOE_J|c;$Y$OhF27y^x`rnp-*)X^(QeBj<)#opp~fi1AYY4Zfh;xuWJVa z2~rdI=Ng`&JKqZj^G=sjxnmA17ng{}1KA z;wklB^5%nIg#ttQt4jZU7R%n&a3XoqMgD5GJ8@-^=UwFe`3cW?Kw#IhG`AZ^z=V^3EM1W=>MpWSma_?mNK#vz zJf6Y1^W3os3y}|dO2hp__xYE))%T(p@e{Zo4)n2BR{V_VHxHM{hF436&e*9{CAmo_ z`_&4&B({`VzQdX-bk*MQRw#OK89;ug+Xa)d0h*;%E{D(V0xA@FDYw*RK2@*%C`2c@ z{5Ja8yK;CXraD0X8+7|F(TX#hZxlevZ@`7MMc`z zmQ%pd`k?FuUDvtA!I(OA@%rn=B(YG@l-8iqbH(Y2DtPbbe=8@B=>lURQbG-&M5~Bb ziZ9eQZl1N>Ugdd`a%qWG6~7b9PA%4MdkkCtiFGV@!@3SuHT|pwkAJwg9~INWWr#1k z^3tlExA9y*i@<$-qMk!mjp=&V2vQ$Cv^O^4M-U#bP4fc>sV+OlJNfn2Hv?|ia8+x0 zYLe_;T_j6OP!{$r{sy>w*dWwX248v86VPS9l?rRohfk|3QW!7+8B8SEO0>|H7aJo3 ziqMZgZ<|P+*;7}U;IiRTi-8bUpFja+VU2P;#Qg$;GK|N`-MEBm>m*Q@$`~pFxwjg4n+KewBo3{w- zT1PTX=z&bNsv6pz4oL5>suBLd}8!It1gR;KPP9MC1Y z3kTkkT*ft^jhUYvQXRs}<@OIfNUK&wzB?bj-6zSyEJ2lRef@9kNd7FjQ>?vn z|E=|$v#2fOl7HT5sMjNL?{>a{9Ad{tRi~ro;G*#H)Vi*@`rCrDzKXjYm2`9wxPdJb zaIv~0#GX#hJ7S;>=tbk(y^K2}5#a=nOmGVEK^)t#7hEp9Of_ywXaWsmv#)+8y85fz zRXotydT#}UNpvq6>Q2>pIK_Y8G!-=d#za#wDf;I)$>fnx6F9DsV}Rm4IBnyBw+`}(3y;{F|5I>|Ifr^xd8NRecamrMSXQv;aya zRC2R`Gwvwk)S>E8`D>+uz>W19duwD7RF4d1ph?c*PUv&K>*0k?IY%*+D{)`vWe?6C zcwwve8cu2vOQ17p1#CTqxi?3RdsY}L&ud=8C! z&DU2|><7$^&m5n$PO(*nOjL|%5<_D}$2(rdeHz*Ix-hpFfxb7Hqf(3sq)=!)1#kzj^MQZFMiLd5I>=i&?*>*thy)^Onj z87&#XNlkSmS^8Ka-(5B=B-YDDtSpk~fW)Ayi7oCH=5i`NLCQZ=6F)YC4X>`QjhBEq zUUFS?nOlgoln+YSa?0&kGjVRKcN{B=F?0n>ZYl=^Z4(**V-YiMieP+2vMEk6#@l}8 zMw}|aQO`1fa)YJGvT}OLMVb5?^MEr&sVhtWT4CkFXg9BMJ!T!e!C(hpAH(c-8>GeY zWp|vo!3$HKRM2g7J0-8rg*TwJq{+pMJv2%tK9|ry-JxSBbl9qL_B(~+m;`0%YMCi7 z0-%noKyU1G7K3CM*oKHa(7n}Sgi85=sYatDzzb_POCdC8vnGtnb%QNaBuPlCQXMQq zH?rZJ6&3sCmv525Pej3SGD7si84N@J^>~E1#M4+C>Bai9F(9m&I*SOCKrT)<*VlKPef8K1HgjOqCw9QQ2dN9Jw` zZg;@fqQ9WJMc<(ANk@ZVfqfLq6W{bz&hq6h3=s+a!Okro+{&WDqg5uql4t^X5RLV_ zFWMWV%!!$o>}^VZt9~Uc>X_j~3s6%Li$l(iYER6ZEK|+QIYynP{pmZIqXoafx*o1H z*QgFaX~k_`%0MM=?qTBGJgL2{UAm|F9HqMyZILFd6=S;vnD{Lz!{$c2vT9_+_UcQa zoye2M1Qxar0-67gt)aw6#xL;U>NOtiL`m6UZ|2w? z`!7$dQ_;HEQ)F>8Bz#kYY?`Xdkba2AJ38}};I6(FLN(>q1m{d&%xy0kA~GAztKzs9XBCKNdqV_-6QlZeD&QOw?iQ zHX@xS#ErZ*)sYnvbKY|m?-`d)e+>_Ke<{Hgo7_M0KckQ8qX2!yJ4beXUj<_ZQr!VU z@jF-O@dUF&9rMN2%Uab{{xxf?-c!n*Z!aM*{oiY$(!=A=ePav&A(X>juzDLZG21rF zR0HhzJrB;Do7tjq5NBL}_*=^!cOJ^8b1v~jM$%8D602)bU&y|W%s+XBbk)`bU9PhX zbR_VRbaN8svC265oA2?Oxbr=fxs{GDHHsTmB4ME4fMaU^Y0uwMkH%G}<;B(Qjz?na zXWe^u4DpSzEmew%-_{wXu5m3 zQmGc?78b}1N0c#kwli-vZ7`;}wyLhB#QC6lD3$PYBy4wFJsC?(9$~|MIXn?xO$c#9 z1rd}g+aq{{hWl3~@SpLKrErYzMt{@tJ%Tnz)y~btaIrCnAoBE~-=xgSabAmdmllss z6Y!ToSm0(dh+j~vKzvE$_f|*1*oxBLHx88*dueLqJp_-W+g1QUvp{!t(~#ngw;6zE)Ra4A z!)d~Fn^;S9gc3+>mPz&LSxXVaj?{Pm?HLH?30eCX=ka15Y8R-i#Sy04`#pi)>xcdK z@p$TwR?!HxI0e_`p8iRdqh`yz`A4VP&;58xFdoe?w+4yQk`^#Wi)bXbQi_gWPKOfV zi?V>1tRr+TrEe%-Sd-%j%L{#7p96Le5r5yXq01drr%KPNRWns@(Z){UoH4*KwJZsVH_T9LapWq@U>o zZFHwY8V$S{@4&l+zew_y17NLG(|pV0PDTFt9+;C$zBH!goQHfruPXzGPl?LvRt8aG zU3TM__qu+QKb-}>T_ptkCtKGk_`Y&h}ERp zn*OVm7-dJ0lRkj{3{pcSlxo#g4aEJR?&nK<9*sjMdc~^`mcrhzAF0Bz6tH)#(k5ehmcie-JjoxH9I%FkQr5w z`@%L^Z5>SWBjhF@+S9!>opV_(w~!{I`7hj>;eLmhKYn8x@9wvu(?33sX}u*xe4POI zAK!US(SqQw(S=clAWN)FNGytEUR%h)TSdI2I>aWJvtMt)^=xFyTu4@fl$kYM&vuH4 zko-{po%lR$+&0fKgN_mQVkfI6=7DB{@SYD3o!09u5DU2PS8iaXW?6tp=2^0I?pDi7 zE11U;+WZ@ScZ&fDijMyXeEKrZ!fs_FaY3p!QXgh+Nf0Xxb zl60liyOmEi+9&3#^c4|>vbiSKALGHmsoc{%{w-c&`#woh@6tlO75(r))3D2K$+Lj{ zW$;W3!`ueK{hpidKEgTkH;MXp&D5diTxPhvEiawSi1lhm)5Av{;p&;_+$S*%r@*tL zqgypbminK27#rcTom!T3H}Vh}b@FnEV;zIrhM`7w>Zrj{aQ#nz-N z3#a#R>sXZ+c)(uYSj%wE5o3@6KZkqJ=n?1kkM+JXKR)TQp_gE3$65t0T{>rOFfM0VS416pvdeeJleqjphN+L{PH|A;k_baddS3$U!!&$CE z{(o@1PVE!`vNBy_*1#+FYlO6?e|5VFLA*$+2IY((q+N;x8I9rXCU)J%xR?fci`uHn zI^EMq5J4erhI#dmuwhOIWTg~-aH7zZKaTtRF^%Kd)!)3*HZR5g___`lbSuB;bJKw>GTME{(r3`Cu=mwKqa=s;dB z^+`)sLPWlsyiA2GwVuIx(F*793F`0h`Y&j$FTC&pXQqF@g}}bRL<|b;4fs{Kw(?k* z2_JHLFm}oIwc)FC*Ar!y<}v6$IO)H<5tt_D>&Q~4<`mtpEIdG|yN0AmE$>==?hKLG zRro+HsaMIhInA(ZBY1$;E2hm9FvNiue&Jul;03TM)VCGI{MEs`#&g*)C2#5We%c!C+(@W})7Eut z`slCUr?+%Q9%ko-&W5dtFAk-K%+8LWN^4$quFuUH5wKdutuJqxng+OJGJ&9$OvI2^ zj;HMS=;IT)uBvURUbbO%(?khmncMn zN8N}O_okkp_Wv;Umoag+VgD{lOAEzIp|}+(?(R_B-Q8UVcP&t07+`RB8N9f=yB62M z26rpvS@XUtEC0Q-lb!WpKHSNj$t07@&hz>mM@K-BC1vH=6-aU}-HP$p1`Ztp_W<0K`lhoSvBzp&S^A1-QrnD+G5;)U^2ukxdcsKXj&W z*(kdO;Ws7b7Dx;_o$DG;jIN2K6j$yawRDXA5b%o8z|H;3x*I>aeeWi+-neu(CbxqK zY4>L#T75H(6qCRRZ7nP)&(*vLZ=D)k2$!de;w3yQxtQ^2WxlD_kmzMr;>1m*-zy(> zB_deist6(@D|#>?YRIj`8Xu>;)Rx=5TBwHZFIj|tYAQ!%j5a6=#M*=#JYKJgC zm+WFjzzc_SM)|zXqO(2I+5l~=r=Nn=axQIYK+2;dFLGSkB}XMJ-*FRtu$MqQ^6@y= zovMdajNf9#;)mvco?e_FhRy7zJ1 z4TVLK&dtMy1zl;JJUxM6_yJz!kiVSqlt`?euoMb`?CCJ03QJK=?{kb)RZv)usT+_J zZv?qs6_(q_sH9#&80--ne#>p4a2>}R+Ioyf^2YU!ElLZv@z8fRNsu7%>PeiGdUz(B zhRhHC{xR46M9CiJHSNrB@x{JDT>gz&6L%?5OX!}nF@<&agdwICA%sg4jQJ2x#1(@n>Gt(fCQnlkXWhdZlImtai(J3`O=Wjfnyqd8FUz;4 zAs2U>tjZ-LdimxxX

!N9={)Ff+WWdipC1LRZgk`xKEM3Aat1ZS5_}H+XpNySZW1 zwzuKHH4~hQJhkRlr}LEtt+DBg@iK%j9RZjuRX|H8MK`Aa#|Eb1)9Plui9YM3L_b?2 zgwuJbep{yrj@s#hprLM)xfzsjD9-|N4Nj|`W@d{M>3c^4T!zM z=^qKk%_xzg$Zb2X*Bjer*u1K&80JujW3M<*_;|}dHr{Dp9B=3p_C&;h~PP1sCY*c}(W~y5z6h{SPt0&$!79XD5 z09=RF|_CvFf3kuSp2{@;jw-a&6h)+=+q(e5I^1W;5?SE$nXhaMwf$`dVBrc3!_>x-%9 z+TA?CY_<*lL{bviJ|6vVMqlGzp-lj+$l1J2z;%+0P1V%P_?~2o;%c6z55agTv7KaH z$+Z1|go%6hk5ZF4#$lgh)0ja9^q}JE0C*(R^{`$TdytPv{1Dqhvf@MwSDP(Wsg?aQ z3Va{88DCgy_oNRVBSZh1l$W_PTz#1{rY*qtX{96lRQrcURJ9`rc1<@NG@wx)h(BDV zUtT(Sx3F*`dXz>kje<1kYIgFanLB`3u|sYgVa?j{aDQKs8L5dPY5qAMZPrT=kJ^}* zHJ0CDX3?t7x+`hs8DHV_;F()AShz zrkR(;#}tQ+5ZrZX%!w=W5O!_{yL%FE704-I!@?SmsrIST;0Nd@ugyk&{`S{!3A{-9 zZ1Tdh0-Xq5)Ay_jY$xG?spxm~5(ZVJ>ZkmMX@7m*W@!LzBh5RI>e4v*2ILQ)#p*j) z5iQI=UWax39@gDrzCBZJ(S@Z&;oeei7#^`oPLX0L0v0TjV>GW7eNW0)3B;cn<67Fx zZ^=b&;tV60_}Bfc9RIaPvUCb5N&Y&B%%L+mK5J1L9AgT(8)~A>jpSafbTe}G{8BrG z{_bTw9(g|bi|DDoz7bC6*%o!}<>&~@)Ms(gG{piwMB z_H|R`AefIwqy=RUZL#w8of82*$Yq7jSE~OQ}|v(-^6RlFa>__TL=C*J#$ukfZIY z-*%DB059O^srA|7}uOpPGGw$b<8k8iQDwb`#QJ;$=KVSXry*z74-_dYx zZ2_O57E%&dFV}+PGPJ1aF>@cVe6t={ahpuo-~Z-wbY_uB@Ug_4y3pVM`rGqj=12Xk zD(&;H^q1DL7dICAq`04E5c;vRmH!a7I+vF14C%K0^DTYJncO}8P;UR82rifVUa**R zqRK-RMt411xbxT3vSn6kcz*oI+u|W_y(v~~8z0I|oH;(?NCNs>m9(|dHRWKj?#1^~ z8j>PRu<@xlF=A?~1ge`z71zFZk>#9yv))&l+ku;0MB-b2Ly}L`;%|BxYl~orIl)@u z<_AdC)IW{Sf9O2cSasnsAb$4TM?kAv$0q?-nRYmSobY(2GuF4(oOW`h?@HTRf0N}8x@->guyQ$^LKp_VCYR*v?q6p>Y0L23v)+Y0fOAdfyG+4~MTB8*<* z)x-fMwBJ@53LSbUlcgS@sp|Ei^!IafAnYhcBJd_FyO6tO0X}s(HL$k&HhpYlvMd;* zxhUzw4obT?np?%4CpL*8lcN5vz2{chlN z*YJQ}xR;<~O&jPH_xG_FDHd5|Ze0^=gw)9(8dmsB;++3yjg*XIzJ87!8m0l|jg6riG;e45ak#dv5- z!Gzl!$O^ptM$5eHZ%6X7X?XXfcA;CnuOuxa?!^}ts*EsoE8N<#@dNz)nz!EU2CL3# z&zXNFmBPDXLT8`9rcqS0P}?|Ta-c2Rlag|Vu56};M-q~yo{_m}SLR1Hg?d>s@Qg^D zcL!`(UQ^+$!n&7N7F-Y>unGr=8@aaD!M?YAjg8X`RNBO6{~?%m_XF>@`q1^8>??iZ>f!4;iW_f+7bgT>!xumEF&WJpcYyB`%m zi$8zAvJI%V{y|=MRTxnpkoqp`viw}d)}3*Z8RHLtM`TCu3{_rhqFz(;Uez~aYlq1H z&qG^q`BZ`-%INiUk{qcKV-@Xn#`m~Xs{arg8Aep@b=!V*lVfqSANlUv>yOS`ms;wT zGe9FvP(Q}q5z;S_93VR@dwnoX724^7cdDQL>}@i9mHBtnzsQN0rbQ;tTUqTa zCZi-rqj-ggv#>BYCxcTD_aj_KW+Q7Pt-Fo-3S2UbNncMo92RFumtZ%PCl30>?5fKE zk>-UR*?Sa>E96?}5&bYVfw4$v{9phVH zaKO#@`Vye|Xz$5;THMeuv{qm+?M^TN{F_SX#-440HuYvA-*)_LFY-f#HnrqcKtD~u zBAs9D<~DvjZhECpaPRN(QRk}Mr1ql5gn}HYBG`k#k`{y8M z8NX{`v>`d7%x^>rN;=G3X4~qLRllbwFV;eO$9Jew!Ls&5sfD75F=a)SNMC5+>Sv?? zF7g>$n)~VEBKwa~}6>t~a=i$#<_|iy3QW7)62=U1aun zpRJ%dKlg11z5o3l^cmVH95&(**>0hY9L>Rq#0BzvkAEU9%b8NT(=uv6>*IluKI&CI z?P>Y7^+UH)D}Dt_6IL{|maK!Se|VOEziY)XWF~g7!`Wqfdt4B(a%^gM*Z{8aN$i3P zp`nFpeekDOfxppyTqPd`zpvl;j$G5LM?xfS*34C1y@;~N)|);uv0FY_&~8mXzqsU) zwG-vUdxD&yI=z)id4)GRECF(+T|^8096t+-B9|E-)61dS77)yMtNta8`CqqNS7Xy} zSG=^#s!1W3EDWo=nPjj_o7(=h?vj46TA+#Nc0AKv5WoqiA~hFfT@n1-!{PB7uH98( zq+bb7Ez5SP;5;56d@!6_9Qr=mo9A@hZ%;V0?#;KRH`uRq=ap5$^_G*DK_ncQDyKtp zFYsZ7n3q&D>;rSvz;A_h2`NB86D6_l& zyG5-WM6PsV_g55;6P{(TDr~zt#aE0ec;lVgx6K5Lmvv$(oC?X&s)Y$k4XA@O!wNzO zHI4@gTG#QOc18@O@6*1fEPR5l`lX=CN}zvng1ZO-d~6GLF$cZG+B=-S3{Rr-cN z=|MuPhgha&w8-u(|ZF&mDC1Er_waCaNmT>DSQ4v#f!_N3t%K z?G3w~F6Yni}0#Kw%wKQt3-#%X&g(DQh z*9Mc^UAlGo~Wl_#IHRh)IGLgP;>nLBf)uW zq#u6~a;vfk-qU{wc>MRD)~OZ^2k7=nCn}r1m-MaG@0Izbjb)0W2dNAnbZLyiei#&{ zgIqofbs)xGzwjMvk6;@I+qJlhUH`|Sro*1hXzYjqYjHNXBa@UW`*GAT6me%_odSUdjTp z5)D#7Y~kQ6Sy(zmH@*on)+r@_P9n^3(r)L}>^Cq-TN9u5;x$}(T0 z#SlT=_!-1R{jR4v+n-YdCLDQ~^&Bl6c?zJ8NFbl*txEe3;nQ0=v`OHfeJvbmRXW!;@&<(T3}uBZ z_S6`;k|e^bLdEwhucb`m6&*IzM-FwbLTrl3H*QUpRMM8j3l`3;NO?N|KkB+KKXoK6 zty)?Ke-VTYh@|@9T60^ByHymE;Frz@-p8v=VZKN5{MgX!+;L4p{gS=xrUVvqLGt7v z*In+rti1_soGqhgG8=jOZKK-tE(@8APb-cvvj~)tLefq-qdf1e8U0OQifpoVWkenyS{BJ$K?%Un}o-sp@532BWX3rQH}|RdhYLabIFTK3x39NCE?EvBXQqv zTxS*60_j;5aW3Sg!#9OWRfM)RYFSG6XZCVW2x3AspRAK<1Ogf(R#7`p^t40cCHZs% zT%tQZFZlW=RrpyIgv$@@Fb>%#;?^p6w5d`N z+%4iB48GsfZGV0abc`;kNDTiA=XMySms|WqM+j{BqMo<*lD-Nx8T66*RBn|rF}lj% z;W}UFLA)_Vh`8C?MK5I%2b03CcJ_69w3Jan-45JbP5BAhtdV`_#BU^SJ|AJ4#~92$ zV`);mO8a2H>~249$T41a<7qx0MODAz1P7q}iu{zCO~Pw*{a1%cyhMAE%X8S@nM<0< z@L$-zxd+Zwmk>8Fy|bJf=uff+63Aa9z0G;UPlFyt3M=(gZxmK8Qx)AKTX>UdEqt(X znAQW^rrVx2w>4g~jP68jEA#SNV{&-U>&YUw{MmmgRLNLw&OUsx^(d^(@3tu!%)(1r zSj%-Xq{6*RCjKddM|CID)28ql6A;-^g$ zsZ$qwVXTLzMR%G2ujQdBk-Su6c*{gYx}wY&h;9D}!i^>v-rVZ*eJS{+$m2D zMoZG@B?ZmKotKeF=6fVb^7xB+-HRqe%T4L3l6bJ(>2FJ;MogbyB~7tBV_W-Lk>=_L z==@GI(#JGiM`-<+(xDhehxVBX#{7t+WUd6|JTRyF++9^e==SacRC*29`Tnci=;Bsh zEx*ytFGTL4Si4|m=5gO;UE^S}l0rpdrFB^2S|%HTlr3l&y3Pj|=p>hhXnd(FtUK2l zInSycxUu`OMN(A}_pDSO?{wFX{Nd|N{~naD-9ll^%}wG%gSyaOCjDn&p&)d>CLf#E z{o=>%trZJAzVkkOTZ1M&1GV@x@gByZlZ)l+^Q-5GnYrSu{u@oE75#GJl}ElK&#)eP z#mV2J3+(Y|r1CSn0*|tMR0@&P9@x1pwb}X=@kzOP@wpi#k-1i%2{wy;zyAs$vg3)^ z6F$q)gZGd4#;U$Wj3xAi^vyIZ{Mj6yWv2b6AzSPN_<9v`oR}=F`$%iKD0WZ0k%oaN z4o~JJz!@O_yY)vZy`>w!Ycbo}@cWsnM#BHXq9FFp`4WiY3Xe}uM&dQDH&vl2nW9hT z4-Qmc+k|O(QDb*+6Q3xIX)tvY((<3Kx|64+h|kA0wcfEW!cLc}JLVlW_OI_^1zTdu zP}@dEc$dOJnb;fZ!hx(@ixVnUHU39B^+$L}Nm4}Lq9VnOaN|(0e`~}Rh@;nQhSIUd z8&90_JS=^7Mwkk3QR-fq8r$`fmJgk^z{81M@MztV)Ec8*5y-+&t3(;vwRRO;Y?^@m zBW#2&^EVrX&P?d=_}P^PuMdU4A6^hrqqif~3~(06Oes-v8_>Yp+$O?{*Lah^7kT)* z&6-g2H6M4eLR9pzivPZSdq4(M@_0aX%{A=bUAUK(l9b;|PS!F7gb7;TQB&^?jSV<= zpJFsgZhdo|@`5pxWk!~dYTa4L4hwhrZ6aJ4e3V}H2B|jQi-o=}_Wr3a*9X$w{GlSmxG8v!4%xbM@$n+IAk{48H;dZ`b{2miL#$6d zyF_B>aVml29R_I?M;y#m1)MO?w1L3v zcB@`a7($glyieKj6_OlfI)0wJ3{uYNa(4-_)zXUm6)KcKLDBFrw4|3*@2+mXOK_05 zJ_Q>kf~Ve!J(}$^jB$bDj%vj@ibhJuxV<0_3bxH8#ESi-r6jYhhdqIgpbWI(Q(dAqu|GfXo{;?LVXFrlTp_yl_=0$v(le^A7yF3%+xSx)M?8o z=8!NeG=V(B$JHR_SP9$qr8$jp2-ltLw5-@?3@K^Zk0qo($&D^mH5WB$qdzRRySZ2J zFtN!}?^#m#S(3K2s*nqLif}AERWPhn-~)ruG^EJ7UlKQc9*9XVSRo7_`7}|%O*Bq| z?O)OL^(cMd?2~+ma7GQ;f?4EST4|DXMO_|IVmld%`*n1w zOqCj1<3%VcwG;)aj#N`^yb6Uf^(T`4p#R*dhY`m=VN=Q#A^_Zax?s@Pv$INtSK>{5 zGHy!tCL@LkE~K9>R))gH4(KgxWD+HYH3jyqJUyoWwS22CTmM3jEEvXKH)EXkqa!BQ z?$qepuh+hkZ)3)n5tsC24@8Tdiq)JrxZiWiys;}kty4dMxs>th-AHYR)tM9_os>e+o;fbIQ9 zRs!oyanA`XEy6MU@gTB7Sv4UlwsqaLv+E6ajYULiDtXB- zyl&N$IeH`BtwnIWUIi0kK2sf>R0mI@{lEL@IwHWyb?=F~qyJvcxb}GQtP2`0g`}v2 z2Q3Y1rjMR8NQG?SDbpBv;Leld7(=O)hC7$AMN@?fVbhmJY`wy>BWJV@K)@2UBYbcz z?lc%w#noCltKOb?7M6pGHn#4WHB}KS-92pKW5E*4ce||CC;H9{KOWUn_GP_gep>0I zLoI;pThnt4sTT8|Xh%+zwFnQg%)Ve{efhKij@!hOYa5~|CPM2|f9Nf3}4ua zF?v*0PUL(>X($b$XD;9(W5P{=K9MdO3Vw_B`Lt5RloCgJ0%=tX4HVkB*xMNK&*1Uj_n|IkqqXaNnJ4j^1t=`|5 z#r-Y$c!|3A_7)UF|7Q2yj#V}#@o=)~5D@S~klmLB^Ks3O$f8XgFgB!?_(BMajXib> zprLtNJYb!0_n{0*{2uVa+YV7jiO_iOFlC*tI2yGlY0=&AhOY3RfUkNiztmN`5v*LY6DXr)UX zEFd64Qz#4$F25rAtTiVkf})Bw;8378%w@Uv^5?5IacudRw;p?sxY4zb9Ph>sm*dZU z^Nk=XHqBv`ih}*56R!ce*%r#;GGaGFZ<;7t1 zF9Lr>?RSRm%~FZh0K{ice_ir)q4YX2Ti?&yOu9|L5SR47_w@RBa zhIt8MMcn(t`7AsPNKf6p&3+rI3yfl zNU~CitPq9CLmGir6X+k?QuA0_$sZACmD>gi?&fvUD8l8T*!QnNLdh7-f4$%%fYLnQe|9}#)*?;2b7FIlOiL=(%+k2j7m zCyS_w0$^k%LH-?gSz~3n`0QjZ(Qyfg48nrLT3834?_&bP4qpnJ3mA7RV&a5+%1|qX znm*mL49#18DR#n-%DsU&>75N>$2+jzM_PTzUnWcv}F>6AAtxnuHFxTyAZ5KNnW&1caQ(BW*HAn26u$ zVoG%wd~P0iR()Kj<*Q#x9R?dAtio}e=jNM{y+{KN>%_~%~h=)$Wo$| zrQUfH5w0PQ6)KlP$*tRH+MHyoU||F93-)?bc$VJKiCRtMfzl#zICV~q?QLu-pC_;V z1dBcw$LiXhfS#kin7PYgb^yjQw6V&i$K`)i3H*En-R?dMvU3ZVhc6%(t?ArgjaVaY zopL+J{^Vr+n9DIgf%JX1a`)KPOG8bM@9fFw+a+#1O*3B4k6r>rT{lmZG2$aP03Eg^ z{II+E1P)kL7-0~?ecP$k4nu{A-7~xzr5MZtXk;(nBqV?(@IbU;Ydl7^Pvk~5f4mqc z>F0@OzxjtLOVed(W_tnuL->9V1WQhz>~yP;7g)%odGeDCePE`ehfjAFWmg$cFWKE| z0%@Zn^z(A?5Qw+4nl(-RW0;6V{6}oFU#}h6($SQaEq9=M*=w|b;mre$GKXbi9VPt( z^<4I=S*&vts1Iy{-1(83lJ5a_)dWORW>yla!f z7a-6|Eg#j-^X@dRrU>Zy9Y8ggB^ki9C{>I5V&qJP&Kzt1F)ls=2smLjSRr{?YjT5v zlcOb^%pOr%`*^FxFdp!6KP-LhC2W@RHryJ@{z(E1QRGSoaN`zo-s=!EYf8+02yxbUaD-!n^F9i^vM|WwC!7TShhVf33o5k(7Wm!I*maPzKo%TyH(p3CqQ{r%gK{N3 zu0Gwc!(CVihW?mo)sD{Bq?Mq^S-CoT!*QTdj=j`03lZ%qM zlGC;+x_a~Ltu@Y)f@L#}TVje!Y^2$_6L4Mg?0B^6-AFHvhqX~Y&f^yRZ4>Cx?=p_!m1a&oq99~v_9Tmy%`Tl1?dRvj*pnQ zl^8L51;}xDl7!}_5foROZRo5A`|Q1N3x$alY-4n@!vF)5QjDfGdG!kg5MHozTo830 zFzIGYyn>D+dM~?vtDUgq2l)x7loMt|C_DPl@qi{|m83LHneYX| zjdkj~>O)c?uGfPDepf?lR}r0HEN(86c5#d*7L5c7gH_@|&a&y*3L+xyJ2fpp?&QY9 zs&rxh+*+TAR4ntVsi|%Q-dPAy0*V>_Vo=zxXC+r@eqr>9w&uKPxLIhbR{XHWhJ&-!>4Og8wt>!=14~~Gt zw`OeWr&)kXV7Q(6ZVVY7{(V}pDOgyyxF+^_B=KtmZdH?3kvfsZD6uH%nbxg*$HZh6 za#WL>k*V&uyKBNAF|bST{wYu|O5?`I;Ij|HFQLcP2=GVBD;ccek z_qt-Mq{9}=%BP2&gGKT;xM!`WG<4PvXL~CZw^&Y|RB# ztL2vQaaU^}%es8_vNSlsAKB*svomIf9~W8 z;kspV5Bt05a6vKQm**Pvv@T1KFweV!%fRn_%(d1gk>CugJ z=5Cla=F8&_-Ltfl&xx2K|NMIL-PnZ*lBDND@;+(C@#qPj4BTwQxdu^Y=YL*Z8IUF%VV_B+RmxN^G zAr^N=-iP}lXZ9jl=r%PA0}r5-v?&t!^{RXp*|uWQX>?sWzX%+ku>f6Xx|7{xE8W1B zy75i8E(D{F=7(CmaVfuG!&-P@PJu5AUP9^)x5t?jNVxScRsfmFgAwl)k^ zjEU=Jw;SRx0=V!o_K=U!4=9XO2H&!6OBG3s=M?1u6CP-PNsybpYv~#pxlv*Q&i)`R z%+k%Fw|YyVl7^_^d>S~G!aM_w@S!DI(PE2!)vrdi7vDKa$^M`V&Kj_Nj#LePgy%*`TNP)zcu`k8Pm4KV$IM3}5$UZ(R+=pM{o1R@65`-lvybnSWv7 z>X68hQeI2b;5hA_j&0#mRjD+^vR<~=#fcsP3Ez0(*E{RcZ}CvvHO@IT?cM9OIP}Z5 zE)1*1j!rwVSqW|>hx^f_BrCtU+L~@fQk`~tw~ozu7Zri(GfcF>m1XO(?4kQd6H(eD z1+A^9CPbyO>yBSk>JL5XWQq57<>M<)3(JYW30RUwiF8jF&4mc3`T0UzqB8lr)m zoG(FAVlyDtZggNkTbtY1qNFnI@LLt%v#C771mk}QS&!0SH{zi5_QJe~KKH3>POg{C zVr8=o8n3$W=z>&)etQNwoQ>olpU)FbXR9x~tR87uDD^{T zpA(rZ?BcqKL+j~Ub2vJBYS%)v@{dJeSOnY>M;qySj`COZTN`?8PM}M5rgY!Y>Wc zwXI_~jNH%p`mAeyL9&5<4uY%&1JI;e2zcuBbYmNu76^ve>tvQt#0pGkva&qt`$YH&XiT!bK>d$wyiZ+&wP*%m6#uHHl z%zaWcg!su>Uw4gr;-2cbStB5;S3DN;0ms2#0INK1ai5X;bHl4 z#h>Ok24s`5{pr0-%t3UZ?r5nt0grxpw8HHzgV0nU zfh7c8H@C$;gYnZ6`N)}qsGPgGiuaPBywsv5+hbd3V^xK4XIr! z_vTI-g)nm`wG%OOR&pv$8|e*LWu|K6C%#PW9;Qlco4eF%NGAC^$5|nYabsK(S18N1 zu*Qzd-Sacu{dL%kYNs(Uml5COdoTtQlI+m)Hb`j2A5Klp*Q^J~V67^ktxt}3F()_; ziO4E~g6V5z6@f^8E3>k>PxCDL_BML6^(3BTX(H6?3WYZ&_9Pw+^($q|!V`C|mOdZr z+*o=`qmj63=j=!jgj4U&yt|4p@!c0IRiv;@K5Wk-5U%L18!LwW`R$Sa8r99eOU-#{ ze8KIQmF$7X*QlvmoyBau{EZsEr3r&~j13g1r0-8u1R_7H(q~^6`TRc5aK!fKsPX+?bp~@l^IW-mhb?WOv)_X}q)HO5n z0fiIXZ^9`rF7KvD>Z_6b1v&*#RSMaQo zE)CSGG*+ST9n}o6CH~S%yBvarNLoCLZz?N??}ZB{ZJ0h8PbsKCUlOo~+KPg)%TUm} zO59m?qkHK&k_ZR8OnIHY;zKG~RU2m%>gA`k19WI3;%6T|F8O5}AXA>)Z0L|r&B~43 zaMfwgO@Fm1DUY)XGp!<({I$-eqq=eo2xg9-$Thw>XU%O3qMhhAG*$uK29v7{aV@gr z7RaYRwMvJvsRjvEeUK8P<*U1ERY6{6>cKgTXL~M+$b}~kDO}=nbRR|zhu=?-Z5wzsyqEjt+u&HzLjvL^*5yj3-i$C%dglFq>e3+?c{{a#$ zE2-t!v==``5|yz%?zY^g4pw{KlK*tVz;_`LBLt)Z=4w_&W+ld;gppd)l=FoF1YYaD3OG^2()Hl!{`Z|d+@()d_A$SH4e zg|KkGIt9w46+$YWRqN|DwI!#hxJ4s}W!HO%dDfQIG)&2LMjI#|wr5TQU`MvC{~_?Y zvyBbC)_y!>0I?A9=R0{e!nm0P4wA`sCHSxIjMr ziSO)YEDB#OD}6A+0F2E z>>$`sI^xPngEs3CoW3%6zwMiA?#!A1J>GX=@U_>rZ}+XRu%piH3@!K$WDvBJg?bo= z>@8y*M&0UA^}B=BscjN&Seezh8HM7A6mC6E8Cam~X}>Te-C8;o=UI~`#@%U_`1{|5RWfsB1%8GD8+0ND&D^^!x~aQ zfEQf6Jg+{4D*Lp=E#?L5F z8WN4FQmmN#0Q_ks&I=KO9`X6C-OFay7_&}lTnD6hBIDCiae1(-Gr_d8jfBRyYN^^K z=ftZMystJ3n($o@0ls^2~Jg-!I_O&kr@qK}m_AGD)ULk)+j( z1C=Xz<*2;oe)D{-PJG7znqC9U5;G?qrkIH9c&%}W{$p}g$A=;BjAR=y2hc3PE#+w& zj{Cs#cMl)+wL~0eKN<~|o~E?aQr4(kpXcVJT7!X&Zz1i!QJVmES!IA0S!IA0i3&1E z0Ct^)yxksWGQABW9Wd2Y_;VbPSyCsH!zc7*DdD>QQn4A{z$J^B;-{Oyjp#l73&U2ILGCB z_8S20*-P(G#GQ+y9wzhJbHPKA}-{{RqNbhm2VteUk49*aJGz}mKLSWW`VEU+*ZS!JvS z0?P%v07s?8SprQ7)G}0LT(^pb2@Hgh?w+?7V`(>}>6USfKBpD7BwDt|ENx#Ev0L(a zc0b@|?QyixRY+1!msb}x6PW50JL!qZ+bLL)`j;M{l3HBW~y7e^tjGA?!I(HZ; z{{XDZo9ZbfeS*vBjCeb#23JbLns` zIi_ddDoHEw9+w~&CXp-*pk;{rZ8-8NW-)F(O20K3aJjj`+c(arq>`PBb-~YV*`%rQ z*L-c+{-WAgGotG!CZ@1YWwiy)6cc(X6!*3^8oVPQX3SifMIAF|jTze((9s>2qN&(z zXngE4J!}keD^0cNs}9S-4PZ$vjd`pJkvst){W4Fo_h9K^v5{1E#Yf02yq>njqQ-4o zvlf^kS!OJ;br|fmWxOCBEX9^s0gEwZn6NMywQkYPf(r$f3kQLlXQkwVNVlhJ09IbH zwX9eIvcq5oz-uX^mC4bV=4k@=TIt_@rV%s_n`awe3P{XMRfxzq?YEQ5)#)}$U3q40 z<7-0)p$6X8rJNWjICL5_sKS$XxOJCYg^3{ax*D$44{ns1Fzvl8t9Ex7tuxs&@U>aZ*^0V+$kIUF4~upnD}_rZ#_khO48+?@oBtx z-x4l9H)0BPlfBt|w`t`mWY!Z&Bvxolz0f!HH(pp?oNi6tu9M}!(bu-*r!dw>ra%eC z2dFo;kxB`vaz)s3;T+0v^S6hc&FZeYvYW%BSY%ByEQQ%{tOj$V2X#5wyK#aD$TOnH zMJ&C|O@a{md~O#k`?D54r+d2@5>2FJ5_;S`j6vxn_=}qt7a-WBbMVc*I!e{AcHM3b417%(KiZYQg}u`ACoMHJk<(JH zspM0J2YAPB-MRkw!2pdehHPp)$RB=!tm|&teAN z`IGs&M>?tDIz12T&CSPoZWR&FR=zVZ)KQ5m>^ohqM~tU5--QfFM`UY(ixhPK0JAqQ z=JsSK>e_|kD8o+&_NUC6^Jg>b$tvM_q(Y?+yX$yPd_=(a{?WD19WtQ9C?2BIQ9w_* zoZQ(~pQ?7RqbWnxWeuuYSwA}?oP9cBn4$Aqr9`HF@@=3mWxjLF)Vz%!%R%BHcJG!0 z-5d5F(+Yme=y6KyH__w92`N5KRI9T2Me#1kl@+RG01tS9eK@FA1=4!<+?13N(tvhj>+!jzAl<1c zns|F(Lc92AF{bF%#XQV>F_YIGx6@eF`r9!D=mnTV=Ld`BQlV$lQyU|C9-j^IeNQj& zwKJ%aM=KX#zTHg)Epj5%M6IQR4Em0r_Fa@zhA^rC0CXE#+H+T=wQ3yPxMwb-i}0H& zO9A%W66F{Jwe_OaE0S@Gr_DkER~uQh=qg*hq1ak^QFkW-)6bClAy+<#H7LoxPKU02 zC#FFl=O3>6f>)T324k`5VnLJu8>pPu(`KSuqb;z`F!*xE?MKadGPN`F6mfV|+?1gc z`Lvy4snPIRCXMF)6pe95&H1UO@cw);&tH{*5BjJs=#MtmB+hh<`rB;Mx~;2Oq5N|Hwu zcm>W$>H^v?4ImK_-3x_Vtyf%>=R{|Gb@aZ3rJ9Y}JO>M#^U}LW#IQQDb7Px_Lzi83 zkV|1!*B z1hv*h@LoK$Dt27nCg&Mgcx%?_5H5OZ9})G-+>CF(ZMe%ZPs~3XY`AQix~f@e5WjBs zNL=;Ptc6lPaYhC%3}VcYKNe3pa%N4I8wb;3nr|2<7I`s)Zp{*YiMw#|6U!KU?0%aH zt4nRU+YW_GFH)h2%AU*3nM?Ll`jIF&wx3iMXJciSDL>?j771W>iXRbr?{ZU6KO#JH zAsg;9aZ~q^<0Cn>9YnP3LOBCHJ#1#QcuJ%2F>!2kg01Oz*0C3f5tcNy)wEYpRv>((mFb{0+?%sUXT7L)PflHdjBjqj#1? ze|Q6WveSxVe3=lSJ=Fu!^c41-+qBQ7;!ut;f}pF4X+;p%z>-J0jPLEZc-N8SXy5WS z8T7eoYoUpI#AmQwNUFb{(npHtyLrjR2Q8AWI;b?$$C1z}oQsU3fqIWth1J(cC)dGwBVlcZ?eunu`@3d#KTWUn>T?^N)rr6iIR858%nD;P4Rr$yu-)=BjduF zDtQn=rZXh9Atu)<#A4SVR)DEgmMm?ObF`36%1|psMLZ@P{uFfq+rmN75s}wn@%k@c zKjt=U>f`;s8|Uc`59ha$V+_oE{{SH8LNu)as3{$3h#2RKySlJdLO~=S!(4oB_X#-U zqpV4qI>?q|8q2DlV8g?S*-Vu2#Esu}Kh3T)jqa%A{J=IQg!@u_e~!54tLNuKAIwrh zjCziN z)+e-^Wt5x?0BS8T#f9-^b6^=GHnf}7mY9BGvfZQ7(|8#|TKOre*lEE;h!->iL6MScsu`S!Z z*`JW{DDM#IpW*Aj_RXY>@?>jUsF)DWdiGh9*ajSynhBBCiOk|`DHA1>S&APA0}{34^Ur@}0@|W#6v&2)qhOHx+&Ur(I=PMGvb*zr9 zAbL+4j<%|bNhzdY%?zfVL=r|=1Es+mU0HtZ{H;;t3V$g*B%_Ig<=Pm8@}%)KJx|P| zB=NYFTg1*-FgPT3-*}vMi#$cetO7Z8-cI3p4myXAmN}9xKg0PMDdl=Jk0J-0jA1t>UeoAhQDr zBNC&b$W~n^2L}hz`G4?d1N9dh!T56gj~gWvw6XZCSxpSSEjVcoWN@wlI+*7d)DjP6 zy=!I!a-{NS0WTfO@vjt(P0H4_eOeh?El|=&E~Rd&q2fXmZMDr?<(?+Gwo2*Y@h6jw zlZkD8=-!e?4)L^o4x`)YcZ`va-Rv?(25bYB!g();^8D*16r6wvtgyo`AzM)d0ly{~ zXP!ur2jqa8dfvRl<>uw9I9m9o5LNLNzcmApN<4B#(9a72)5M904cUD^7As~&unK%{ z2|>qKa^Ic;H1!$K3i2w8$U_Zf zRWucz7{qTpP)d=?=r#sLY<6F0I*qrp#ajk&xi7n)EpipoaxT1tH7`L=#x#_b)l|%A zpw*@lVU-C7QPfE-@#}Vnl(=}BmFcO)H_CC(#nQ(Yb||T3WHKh4?r@3$ZiHvH`hF^# z1gYy_jwMIk=a(mkjg4ZfrEWHjc=~FJTH2~=p+=!c%e?SRlF1)+PMIBsM@#HdQl%9v zRPmQ(i3Dn0%ehh0Q?~4VN$Y#@mo|9GU>te;jpgcv<;1W|PcL7`a&^qIx|u4t=_%!< zbt*wnk53UGY;kjQUQ*(D>d0#<7N$Cg;F6cermLx?m8qp*($lf0nmtJ)D(VfWZPNN; zMK;Tz9c%-O#Q6`)+#2w)(LnJKrA(7w0de@PrV$5>E{6^UPJuhNnY%-=S1IhBAc62gT`CM_@>8QA>zE-lN zEnLyn$x&NLBCS%+14z{$Fjd}0ai`wj7`~i-K=RalG~8gNlSI{DSV=#RA*^cQ?$&(E zvq|#_fDy^=g#)0z$dw0ehN3asU>sBTd*!(}+NufSteq<>C~K=Gp00UoYNq4rA*iM@ z)p(vUSfzq2F0eF$y%^n|XUg1PJ6lIvR4P)YiDpWAifWnZrAVp@8KTt$iK!*<(^xs# zK)#TX8oo(_?qxia29P<6SDC06qfqtvgOE@e|g-BB~1xqfe{nJ zjH(h)X&v4BK0h9&_2b9udhrw1z%^x{!MYsVun20uBinJy{LB9I+?5}Z`~Lv_Q*lXy z8+=8BM<_0maj>^~Zl~?M*f`;Eg3BzlF`HIdVIgIfSOI00SO6{BvoONxM^ zmN?$@rVdg`8fmI?wPUeyMhDm}*=6-&aYv^Wgcez4nQU*BgA%}!`{N%K8{A6%4BiRL zXQN$==JH}v+PiJ1$3{YiIvN&Rve`&Cy70sEG*a@llT}mF#7Ib~q!F|JCW9+DU0Bty zPNde05mk_|@ZiM3xxVQ7m-=DJDh>FqABw7$tTZNh28Cn*#*3G~5(5 z62$dfi%Akh&IM%ne-sj!1&%cU+mfmK}oTA875Fo3cQ@#Oc)smw|v;-E( z(T{bG4cCqQwHoVQRQQ8NBx-piCqug~d`f1{HLw75y(LeUm+;}{rHVCH@Z*Xp^+wK$ zuEX#Sb%h#+k?%k0Y}!k>wxlV%UOI{zs!EwArKm2Nroo;$0y72HckeQh@a?#$IYUs` zZO^Ied*rI)uA)jhe;m`nuA)krDgIYk5tUG}crYHXl6*Dk+jRKPm8W84Z)L2eVX2-k}KI{@ShFfKTzicDy1+=n=}Zxp*U{{VQqZJDG%F>2FTif;q?$$uy>(R&pr!zFGB zaU5=b2KNa5j~OGXvl*~vY`tl-O@JX~ zy9-zXx0_bhzydb3Z*pt}#>T)5i(2t{HdqGIT%EwZGmDNtcw0NQfNNc_Zy*l0gH=tO zD}sA|2F#=lrPbis7l@*+udjM)Sr!zCD^E59n8Smk2yv3wKSk^~BinhQs*i`}DrTr5 zDQgl1G85f~Nc9C$eH;_H#xZA5&Uy-ZSSjRqMWWnUi%bNF!7IQKwWH{GC|U*>)zS;wmd9sruiIWR_;1L$E&eID<*kRDh`W zvyX*|9TZ*?j(3XF6G<#+;Yvpaba89nXn=tZ^0eNj#>3x)tP^Hn98 z{4uJYHDKB3$k8hT-s&{0QSQ(0KE%8HUnp;01*lP9i8W1ma!Bx=6y+g~S} z^5qvbQj`3}T^)5kd@7nLgj2>n4nfF1&dYc-IiM8U!IB?8=U&SGB*;^m+->> z04zS>*+I{6)wPD6myx8FU`KE^OL~R%KFi?K`Leo;h~;T{2aA_(Is=c{w!m50pI})GZ;0e%ktyq`=9WFmDLRPw0z1Rm((c9Q4hDiF^Hs4#MMKlzo%M}7V}7~6 zJ?C0#8fpBj{9>eaXPKgkC5|y0Jvj^}M$pG9!>MkcZOi0N3y!PvFPthWAW5DMO_rR< z11w#@SgQK!#n(`0qUC(u<<34+OIKF{&QVxKSQY{O%~&1W{BM`{d(BjGyfm^;Az~{l zQ4Vr6M>8P%2u%IA%ko_%C2t?*mai}#L+idkSBZ+Fyhszm&a>T*8Oi~_t)F&!6U(k5 zJ<-T=IBvNgGWfFrxb*eStG73bImAuZ_N@}KCjD+Ag>1$LlEqx>G`fJs*9N@yTN%Zc zm|!lyD%hkWu1*i@yBAZHIf+nhlZ(?!9Nib>bNas?n|>Y}ju-n~k=LN*`1*QEC}pUL zAHb&pNjb|zng>tH-uYDW#W$Gdk=s(N)f!J=Me!5!b-YEy)l|(HQZy)|XJ(irdTHAr zJY^Xr8=Pm|`)?3&wKWwLl(9`r=2IqKDLhiKO;Ti$PBfq|hez%9p3QN%Wo(su5d&39edATg`cEg01vi=5n9#)6NK?CbRN6bE)csX@YG5J{~x*fFqZYnNSC#sDx z+;gE@)z3x8U$)}k@OEM3xajHXT_pfhxkd&S(zESeW zAxTL*aW{->kxfB39vs3&e-S_jIRhBaZ(EJHD#eCj6bbVmGc3_mnE-Y1H0lmN&U?El z?s|h`m&KLKI+9jBK<=LD=zbR!RAzcvV?Ux#+AmQ>;6WNO%j3L$HuV8~j&p^ZyQh?E zDEOLLRfY3dWo|UongoYlkcGXwp4*uz%Zw5~UB_2NEkGuniV?ooTAz`4$%YNO#UNxPh1?_?5q`5HxfR@ zf}H7I*8443rfK3;wY|x|B>RaF%5Q9niZ%e=NUOT|}mm8nWl;cW2ds-GB>cCSP8J`QCkwn zPu=VRMr;5JWZY&#cC(Otdl{&k!|m&`{8;oCl!UhJ*Y#XX#!8T$gdb(uc@;3Z-_pz( zyJ4PLwEQ8KJ7W2~#VR8S;va_nPsZ;M(u`*HH8828cpK9yeJwObs;7NV!&ylj3olY8 ziCGU}$Hvi8J1!pn*gVN@i)*OGfm%a_8{TZzK?fvUsL6E*#!cnL^W3u?FoOnRli0Uq zX=bbgTX=Dfi|caI(`s0ze(?j{C$86L-UDo2i98+pZ%=|zljMp%KAjW|ImPScDgOYq zDfaJjS(|9+RM#KbMR|DocR$Ub{piJuLrov#3$bXa7HvcDYm@s(+Bi!805&$b9=@)X zNP2Ax`6oHZyF_60wnE4-$`7{81F69^TT##VVE+K^Mn|8LQ#6mLV=PVCrQ_tB9?P{| z#-jitMN^&ec4?sSp+#adW)4cU6P5DudCzm7ClN9Yh&PD1x#W{c?)-1BosFQo=H3mz z<<&-9BBehHV$^(G+)cxEVCO!U(p0e@>JW#JO*wYRd^0WL~Fs0@I*jzfaF@!_w1P7e(2XzOSZps|}y!9NkFi6)VOD zKqvnI0}tE2np`57nY>KkTuP-QEk>R;Y-$jTjMSdhjN{Co{>#M4tq8z51a!T1Hto24 zaBa8ak7J(Hb!{1pV;Mbe-6RGGLY>IDMY~Xj84%Lf47Hq!%XY6$#VCcAS!iKpmRK|v zS&?Oc7T05I7Gl5`CrWD33hnW?M@lK-!vUL`HSSt`1+~$c_;KI4qB6%(-)qA)hpENF z^-wIroXEa88oV%j+Ingq3vok}!6-SsEx}Py9V}||H-;K&cm`F^exg;1KXDxH%sVbY zEMY?z3J3&ew>$o;ryK-jl1l~TI*<-_^|l#Fz#``bTfq&r=dq)6=tn^Rp@sQmE1&`iRHuy^e%}Habtiy${CB22BfM@bwT!9=4Gcb)-eJ zu#!WjHTJuZquY7}vy}yMI*jzN4U5A@RkQZoiyVhY1RVMi`!}g$IoyvRUeLoThlr96`LslBgrwq{%Is@4TDB}KGn>qeRSCUf(-OUa=G3|{ zmno!kXk2{cu0{zs0{6;QGX5Ct7bLMQIce}Se95P2WGu(GYrH+x7J{i=CoSAArrsFaZ7Yvp zxN9KS2ZjO0*B}q8Ik_{Nt`7LoTKi&`(Gf&~I8l87xa;xqa$L=i&v4fP@{Vz51KAb- z00{2!Kk~XC@=9;3Km(_B+vtXN)>JNQZT0IR|?kmNr!`idf-6 zWd(@bfEa>sJu`ftDQjv;r3YFM3O8g@wC_*>`In~2Ifum4rI!j@Rt4~W_4ui|FEaTz z-w@PyHL z!F3pesgxo7tr^v)(Bl`ZfN*iP-pl!&Je-dS=1zN^<>RiVujV|uoP|XqNU0?fePn3q zVDW-FL@DVKpT&JG_>D7>hQQ1Dqs($r^7IgM9v6qt`6`||${tQmWYfpWb1+iYq;=Er zbYehbVjXnIsB#0{Gc=EHevq2Z}z z1=07)4<&HPb((x5<4sYo$WB%oO3CTV)T}PGehKj1NvMv7MNxoP zBR6HMeAZ~V>R9~4P2kq~mw~2+PAi;mFjYZMGE_-Yvewn{bY+Cg3K-PJ`U^8>vd|wz zDwrj4fwuP)m6Wu`1*n=hO+=m)B1Q;gU<(yc#1cXR-waEM>BBB-g>#iWv0VrG*qo|n#^RQZoB(s8`)XDbCqFElk%HA~e=82Ywy(0Ie~ zM&(={lX$;-eVxn+(_G;Ab7y4FQtP_L+Ak!+3qy)Wi|Pp@w%ecSm*pH54Vnv;&F zq^0ve9VJ<+`9ziv1%#1Ft)P;Qv%xMDhVXn%h#(JL!_@PU`6^CAq1vXtYC4`#A#g)L z)2qt`7*IA?PzcKRut6Ck2GAY#9?Kbb9R>J0&oEU-f;Y8Gzi20QcaiINRwKFc;;%@9R05y2_=g zUU>t}{7*=9gm2W7DsupC%y13F{vw}i$8 z^6T4@j-L2RZ6WNRDQ=)vdWf-?~Zry(0jj%UQfsyDgTaGTK z6@R+&L% zmRKehS!IA0S!IA0S=Q4!C?t?JCevZiugSKGcE&PqlXF(ow6ZdWC2keP^6G5goE~nz z-xhsB%X?h(^lvPSw%3ee+r|v5gr?F+R5Z^~C!ig-)r}S~s=bz}pb)MGJ-4gs(^Ipa z=cS|5DxjYkW~{V2TfJo_ZrTehv<_}VBeKj{;TGsFggoOG@LIsCoqmgK`5oL?1XI-| z9DXYd`duIRhH9q>-sw96J1*?8qsO7ft^Ok6ZYr3N$hiAl{{Z4+`K>mQ%H{{W1! z66jc@qf)9f>=(`Dv;^q6_6*-jB+*Jx8{_gKX=KtB+aIF3zMaL!qH@{s>Kd8OI)9Jc zM3plv20d8>W9+)Dt(@Jsc=@Kl!53k8FVcIOWjtk^UJk2K=ffi5rf(Pn+kJ+*@KM7C zoD7k3>b;Xa4JA^hwHZ9KHd))7Et;}A!=?s5>(=DJ`DDjkBI2puC-@Bg7pihiGW#v2 zWhf=7l-GLUAESe^n~F$D83Z3?!%<509b_x%z1R6pN}Ogn^$$iih?Ta+Ut??7x1oUP zYaN$Z*K!o#c!4E7k)lZQzwZ_}+dpX+Jv~P(<1%m+nEfS|nSPMci+Cy)_>1jp>Pr|m zj?;U2Y7}Scu2AQwjcFyvw@p>TRVqu0dXcF;_@rGD$NTlk$HRL?ZbZzz)9k)8<|?Mc zcHc%wc~pq#MU&V@P4k|btTwq~W#03-yyKIT)U1@Clp}0;?;W}NbISKFQPjxN0K|MQ z^wA`P465C`jNc}bby?He2KU(Xx~=9Wx*54tlj=e8bfjd#2|l_7pC?Vzz>6Qf7d9<0 z#nH1N`3g>^o*%JpMM&daD4|E7wgDpHmTw7_dgS!jWD zfxLtD+7zsWKIV}Od|w`kToNWvp44i)@;`MbuQdvYkTJl$xC}%Y^v@P{;U+Jee-^2ovZh1Tho*Mg@kd=95=hOqLB2mH&ed{A)O#4(Zs_gN`6=PFhfAlX+xWBvqdsJVXuQwm+1n;-cedxP_LUiZ2Q`mE|fr zYiw#iZUy%^>Ims59J%u(O_aJJ@<%x#JpTY+law^{#p5l>mT7s~s#JCBs1^Ed{{WR@X&L2qCqk+&`{X!dpVf=t z;NPP1wgoK58??o~!UirP_UZ1HIdf57e=e-UMLX~H4LoNp(1mi6k8gti0KDuT!C~AH zlf8qbg5#zak?i31Q) zk0#o+u}Up=FwiTGpKZbNvBGso;H}wtbdK&1!s*n~H0Lb%&t`VGm1(|58yZGrtZCcB zrH|lRyxIY+DzUB z` zNnX^$Zt=i66rD^y0`#GIBB@uXjAz0UN{Tc3ejA~aroqVq`f9m6EUtQIy7NaJx_QRu z;lncX=@s>5nc7*{!3zW#{8^Ouqe45%tUbw2K?es4LG8W8NfjsoQX-&tNK7}{bHBsk zdWN1VRM8SDFQS9F`$<2ZOV#72-|awR`!_A`(&4b>tFsP zH~wEGhwfz8hR@-+9}q>s2PIC`8e1cKnm|a#HoBixq>^d}7g37tVRf3-V#9-8OS!s9 z!K$k{_q&RI1Geo`!KjyWslQA6*H`M3oQVkbTB|bcWdrj`1a|17?ZjGw-X6#Xvc=J2MrMrrfp(-QD?CWxG zoLW0$B`Bu5kD$EU$+ciUMmpQIgL)R4$ywl5>?KrW;CpR&v7LhpHjBiH<0y8lvf3J9 zWtLb0Vd-V!X;K)=zHl?pWRiAK_OVg+*aP-bVho$-E<42=9PwETM1&6Xz~oilA@iSBVv9Zx#q zX{e{6(^V{AJI6Q9bM~D1vKH_s(2|9k*VUTXk~pGAHtKtI3b3n z_S=q&kndJT^(#7gg(6ih;aV4*hRWoF8)v>TzT4lWN@UZds-IFo{MRI6Gy}R0`P^pO z1IG`XRpTBnojlA*$qq%QO0gKMdMd?7RjQG|!Nvj~Ox|hIqDn*|`&e)e4^~V^%8gkt)*vU4Wg^d6|0iV@%s;2P4Aru^S#y@J@R!Oo-5ORGH z$mig%pyK3Mgc4E1Q^iY997|VGSlW3SXO-AyU0Qc$14mqTUOB!{m+|=dDjh2$lZ=cQ zCWl2_+C@Ci9LTzWC5(@&a62(~ z>}FV`caK?2s_eFRS>j?BvwbRl!Ti%<|Vf)SQ8lLj8?8@Ww zgLa{aLlU4E#q%TOsw3{6@cj2`E>a`!6KcIgZRnaVjYgHra@!fc?Us(#Y8QbtO@pit zZH1%tyElxZCBsCZiwIWiyarG@+txE-MJ`er!yk0zbGQQevLg*=xtSr4IB3lOM+fkk!)fIk0jug*pP5Y zBjdHInwp5{<~33@I^!z3ipAHoXRWTijJ$U#H6Bk%#Qy-w=s(FRzr`)gdK-s{{{WTH zf09#wid&tIFKK_NFR0OofDv!%e_g{>NlRFvDj|+#2T%?=A5p#7(4XpUcuCuJgwb%6 zy>d-0jlvl+;LtR-ObK9V-$9$lPIiY8G2e$V$CP-0c$Mr?S_AqR<%(xMe-Paq-^cj*f{3;l&(X?L)&z(+o~ajWMnm_P1Y+<l$ zM40Jd9G+*&^c=-E$;$6fLnMhMeLXOSG0CdPvUoLecwRAuih(eN(WO#SLdZxxAQWr@ zfqz>O!Cd=d|y0m{j$%!9a711VZsaFp*`BCs{w7Mv68`HphH2_qN+}ZYXKu z$V63K0fj`57#IV%2E((`f0Q zY`u75&ka8)X23I%?6WKDdof0Ou6~xIS8lc-F=gvPu*Df2<;|D_ zIbYHiWj$^9F#d<@{hK@(e?#^D&6ojqKS)~2`rf=4KSTBY&7K55q5A&-X3PPdN%}&~ zN%}(d;6eHW^V{%Y{U6t84B2|{$7O*m0~xbb?8Tb|OYyJ_X^p=mZ`b4P_!p#ErFZWG?B7cLLF?8!YeW8s!6xoan|ekc@=PSxFa|?>+rRlgKN3EIQe?v z;#1L6tvhGIdYXrYE45zA5tpWl)xWsy(xQ?2B9ouqMBoeKUQmN6e0I-%a)!Q~r} zavXLiu7;RXf1IA0cbr3>k1D(oX^3yCO-E0r_p?pV4|BOOkqQoCg7$;(q`8Oaxh z<`s4eo92Orws*W1wsP!pzfith$AZkfw50cLFRUtEv#o&7=MN!eG8$EB#I)$H-(k2v^d_KaQ@PW>!XtvPc1nKyT^0dG0Hjq#3$arXVUpfPl# zgI%#*5>1z*?n3-zfDL-p67YX1PX z@M$SamTG88Jx+m>@#$bRaX7YWwv`fTC6XsmEQX>AsN^iF*^YQ4h%gz(85M_WjNhf9 zP`%@g*G<4FDU&8R);#WTI^OA9@h~hijT>jXIX3DCrRQUAR>P2P2`Zz6_l<^)wEW1J`7|S66ahJvoL+5}!o$n~g}ata`k4Rn;lOtDp%RV+S|S ztg4Nf9xoa>Q+VZsej*=+tfv0}%0{;jBj!whU&MpesURi4eWo?u%n{>9p?ZQ!$=-l? zl}19<63AqdQmqVb6-s!~#KEO(4J8NR_?zu{<$Z(tEuQ#{n%4^K1#PY@l?ZQLTwR>8DsR6IDS=Qt?x^(zcPdKSKS9T}3cHs8AH$Lu%L zuj9UOhRz5Vjz5o@mPRFV8@9um`fRgP7mtolQ3Hu#Rv)4-M;8qPX{Ai<*>s|Txu$vQ z7_BP2sZR<>@q%J=9EMO3vK|#@THT4i(X-> z)U}@|xvOZw{3nqn)YC?u44Mc=X5530mZYlT6HtrzW;v=`NDT44QS+jU^;} zV{kwxBEg+1DOOozO#c9W>^%^WZ?*ENDfo(-#HU($m7X&qnE4i$04g?r4yn71ueiq< z(ssE=Ay>rmUn4R3h)QdUX%1#sf!!Il*Q4~9YB}7S1)LMrP-$OV^W3K&G%_=lI&# z$a(;!#&gxP*^4r;*O`Wc)9lk-;z_5&QGIZqQfVr=2+8p3c>04FEi_c<@y@X?yy{x2 zqu1TiGj}QHN{V>rP2-SiL)u5j8Q;`jDxPD&Jk@pew9+el&)`8bO4H3zIGPnmSm{F$ z*B@{$yy|Y3Z-%0lkBg>(*_qHVaC)iKa=xP<8=a?q_FRx^7hS!VU`K(uxTMgTB;w)2 zEH^SEj9P9%kZ4hH%~KiKJJ*DaoHy&d?6p_^Mzu$GTq5l|F2&8}qCu-}g6hvv9WrW> z!jDYdIV-ApETu4HUYfl{y+4Vn>F`UJyMqmGt4*YPRJ>bd_SX!#Kg&2R)^gKIhMtTg zNKTe)`-8OH+(#CahztHCr@YR3oc3nx(a=Rmp@RM?-PrcuPLp-b?;B#iF*1&d&k{PD z@aK=|uGOdJyU4Me0eG1APqO!FVVK+5YH#52)Y>spcsZ=hNy#UBEF*KZn7&rz_D6kvT~f(Yfq( z-IQO_Y>55Q{h2wAF(f{un7Y%M2^kc^*()4PVD<<&q{=<(8yQ4H{j(h{*8mX3m#?WE zgt|ZF$Pk04(I+TEpai? zrewU@C%M_F`JsTEDFQMr@6ZT@E`_TZe_TH^c{)zLlf4jCgsff;Q}|E9a3SeJmGin` zfdI@la*g_yWr}sFH-GGH{et;6=5);U`c!ulhZ5lGudZE0FoTH6Lbsv;mw!Bs%XTPr znP3O0x4jsHK&rs@^A)lG_4uUmC{Ar5;)Q$5(}%t2pz*C?3Rh{s75mbv&@Wa$o>`*( zRgn?h*Gkjh>@ljrKO7l3NSVHQBJ+kVdULZ2a5VxR9}g7J)h^2I!fdsd=LF}LG1{v2iyJQn*$=iF>U!`C<-1CWBO$-1fVhd;v(ySp7SS_pM?S1;7RQ8}#b-rb z9#Vy5gcq)jeD{1vbamtB|L*#!F1>I#I&dWswBOo4*Pj!yrHbHM91^}k%=#pxJE^6| zm+aM7jfFheDdqIU$Gn*otlKu5y0v(lLa(ZUvZVieD3A~O4k z-q_tNaOrNF1&!dc{br!XJ?T-VKYquNFE(z%Pc5AMmKAFt58^XYGfTmtP%C@`5HSNq zR&jhm<+2`<_LiEq=Yhx!cfX>$r|~PmUk=@xC$<7~!ktS_p9GOA)py_rOXzbweGDEZ zuR@T{{<1>^_tq^~&&EV}tr%pm`!p1_azU4%p|~EMR3O+a%v1(-Y{UzRHSJoNe1Svl zt8%y2^WlsODAuwwfJ*qM`PRYswDG6!Fs?CaPBhlyDf|-gQ1Y|%gGtpo zn+ITh(@VOO^M~??XA;^RJ5`o>Ftu8@?e4~pSHwTqYZoF-Sn9bnGx>4=ZL$50pYZ1? z>AA-#@>oGG?ngPCNuNv`Fg9^cq zEOqF6_px_(TMl`8*ka9i-(IF$YYU3p))0~@efR?66!9_^sV@U{^y@!P9kaaKtCU=pwnJw z$_L0dt2EXM*0|SxD<4_3DRfTYgh#?skm+8gE0%VZDm6JjEMXqGLBIR2WD$}ASbCjn zmzxy>J$qH#3v2quKFqdwNt^r}w8x0RW}8XA?z!Aj(U*Hm zPm<`8-!jU2L6_9nYVOBbPbt7q(iKfAcYbX2vR>Z;Gm@~YQ9R%m(BKm;Nux0=EE13sScooaU&^Q`b#E|-ghZ+2G0*xWdcp&U#XD4_eiafP6vu{=Utoqb6-CRX zwy$2Px><})pd)Z7i|Cq#svFxyUf0soSV^5%+RJbB zEsL6ZzG%iM_xKO(|Ic>U*eVMq^^4a3j+yo*`4_$vgat#V7k#F8$FL7|e|f$aF_$%E z|0I5na$g}W-7Y5EeB!%Fp%} z|8(xn49umD-E3cX-}{_t134qKCnlF@wCE6$N|)-HD;wv^311Y01KY{S2mset$6D&# zWY*3U?24)ccv`AVR}oZIk}Jv40Q{(pdE{al!nYA-G`sA5GaA4#$B6zx?Q2}0OjzUH z!vk@bYqj{BQ!OHB8Ah?BvhwH8W+=#lr6USA2P#W=!vHN6_>dbzH{~-S4-w5#|5*Ut zKJVa`iNuZ-7M79~7*|c|wJ`5+oLU9_8|g`Eik<;jUgVf5zO1oMwO&+y_0Bx`*84l1f)~*1h_>-LU-&c#Rfjae5oYAct_st^1XIEF; zM$|*nV`Jb zZde7wx`abS5mR7HVxi~j7iNxdEwg-$Tn;Xnxgfxd>aW}8QjIJ33@Zsr9A2;dXLR9l z$3-_n+S6RxJV|dzmW{j6h@(m6+oGkX81qmYCX9WF z!*1GX)vModZF7jF_FAfbgog+HL&_%z3|_Vy9jKY!5+O00>o-r9ASj#}Y~c;$P4cYX z9AwIR8U!PFss>9p0tP>~zQngq7>?txUA2@tXBnSe^Egd^E2Z%H>vq*#akdkpzj@XI zI*(mVStoPICo#b_tJ;Mbxww3*S!u`q4id7Z4>gw6eAe z_}5ahY?I;wW{>X-<*r-Q$)$gCs0}MkRE`I!RdM_gRKa??_|=ot*oqG7`W+MEPiTM;CO0iCeb_6|&N~?aY?`|pP0n42pja&M z<`PTu-9U6vbx0!*==}@%8czX)A-Iu9c+x1hr<&o|f)Nu39>$9MWF`L@%m}c`zi3<8 zUXSjRC!N>kEbs}}4XUYl>}M^7rZMYP@Sou8wU8YVZ_n9TAe7i$!Fh{N-_d;%kBT=O z%u!>uWAkBonhP0^>nV%=Diw-(K$Z-%MMokrVOCDI+1hPO0zFx`3pob=cxSayWH|yt z8q&0)*6bIO5J3k!&2@#!ySVUsj*)$ZPy&NO1&Fmd-PE?9S}ON#5QVtQ?%wKSQAJ%% zefy%#Vdp69ni*Yl-dcGvc`MsUymtFe!q&hGQ*lQprE?LJC2KCKWJg)A!HQ;Gog1zz zJ5%5i@YQ!&hAdgtQ*zm+5<`;1)z&~>neT=RI#c7$8db^Vzzc}6(;;lCYH0A*{kG{I$U%Ssiez4AwGvtAiUPA_4!$GqZIm6!$hgk-pN`t*S$xw z!{4PC+M8Pk)7O+*OEbPVD)B1=t}I4X`%q)-%JFnB^RPV*oF=x+Bs)PTthzeB(-Fa> zYb~0pHbl&do~h?_N{y`_A~1jGo5GX>o^Iw`=~|eU`Wq5F_*OP2U$v*XARN#8t=LMY ztAV>)?}Jt;7i%~(H~xg`Q-E8r=Prwq>uw-}_hJ;^Dofmmg5urp;9`eG^-UqN{Vgo3 z7%JLljs2y6Tv@o}^B9hOx@JjPN2F&im6e$wLsiqz@Uy!G4jY9?46om$H&3iN47dT- zIU3)>>%a0=VxhcO+?la+nR)7E-6*lQDoT-Dpu_lrT`RK3T3L(RLXOj&x2qx*{|=zf z%t_(7`6h$*9};7^e6>iTEu&rh)CNQiOD_)~gejsP9-=*BmK@)GOYPAQyJR7POmD~=>T9t#!IvGiBvS)|w%Bmt z)$#nj&Un?6bls)!mGk~DGa=*h32Nt6y>~O9X^!m>7ftHLSogct@A(3ehHd6Oobz*+ zGe(-3Eb0&-o`#$5IqqU%Dg-bKNy=aodqYXsUx5banmp>bM&^~yERRXH6f0fyfMuyp z6Lk;>_(}=nr{*^j*zu^|mJpbiL`ie&lhciQx4xSnv;6M0C+N#76LeYQd>`HZBPo8T zO$w$0B0~PK4ShfM=R2DZ$LKO*a>Ss(-tdX+CYVaC8$pzF7$VZ^Dv0TQ{z8U-*XDM4 zM9R&?6xVV{Q}r&K2ley~{U}1#aRTTV6J>aQ%Q`3_jvM~z6%CMeGZxF&xfv&-3nX1E zB%QGQoWfK-qcUeyq|^j5lOb&VhqUY2z`FCI<4zS6rse;sXi0ot+%BN`8&%X-7%WD< z_|mZ{83>Ui)6wUMsqyn3A5#wj-G{mIHVH}2tc~5=Iyt54(?5#ag+H+L_NBs8zel>e zCnT98Fdk=LS6QyG526p$K{B{fyI`?*I=_QeL}-qE#`!!4@030fxA9HS)YM)jShk^N z7dqugL>{qE4QSOvO5(p=r3RNor!;{QYieH;&Xp1T&Pl;D0M168z1nAWRi9Qho|%z) zPiICG{^OCuy}1+h+scfmZII(rS!O+r>qiEU-5gew@-PDzv)jeqUe!@Y$0-o#X_T}3 zlVCDXBhf zP-6%x%ss)@>=VEzdcSV~xDAEWRKsQ`BKci&Kjq@5Ej`~8v0xxxBYca;rJ+9lB=C>1E0j%s10 zv9wPjaGd>z#QB&t|AbWgCFbn=Qm8|v>7)UUoo|(ybge`&aRmYJb@0;p)-TC#FkB?|MGv{1d<3_w-@RUZ zu54b}EfbT=Y^(VsNifA^=UQ^q)!dvvcF4-|oW|*pl7%iWjzS*JfNEE=CdA6p1MS*o zv>K+sP641xW&AlaRPM=HX^~1`xW&;_74K~P%U10jE?PwRtmWu~>d~SbgP~p^7xgk? zxa2FzsuT0sRau#UQG|Yb?vg7s+K(ei?iaqR3k0SsnuOis7WWm^8U)b+RYj4ntc!%p zO_)UsRTYxePwv_94Q*qq(Q^cy1|v}zcbGh@ML<80ddwVsxN1t@InGSKjB$NFbsm|8 z(}5=v-IdrP8(oL(wc61SBp45f>b&*{bOS49!F5O^^_9m>Fxvr4vXBQDs;xhF>N)xmiq3iYlg#r)Nem$(AL z7tG?Qg0r?y`;($%dcsor*hJQ7zcqoIDYcIqbukU8O{7=-5<#(yGe1KU%VjG}H9u{5 zp~Mp>nAuf&-Dj~i)wM}yG;>QSQ5%bf%!h4YOS|$E2sYnTUh`B2RzrO7QGKO;R{;VP z@sE)ZvY&;Ingb>=+UpxWxdXFG0Wpjaj>ok$K^5c1M%$Y)+q=B9sz9XBYKj4I9H%Ig|wN zFd|o6`g+Vf-uDDxkp#=m!HF_Ro`?PvCuWGWi+^-;DzbU zb;bJunk|aVr7p}5^|2T=YW+N~pij8VJ}XjV%tMQOa8}{BKTNHBXj#_w*DgusLGIaG z@Jx{$8Md#`+cvI!*}DM83%U=A#m%oZ)q(s+6Oeb5Pgr)>jeqo*aX~A_4AaJWlVnu1 z;)P^79d83)?wy(~c_wf_CAHkPl@;E-2&3GA2TaSR1Nz6$M`mQMHPV8&cc4~zE+v7| zXD#14io?252a(4&2YDc zP6M=7gfc`Z*zk#;wgsk95^)sqoO?p~`?s2pkYqaA-ZV<52 z2t$N)k95e5H?yJ3(9q7G)1i@1Me4Lmk*}j+!lc^ymFM8FyZUt0_x`1J8kvn7)2oM{ z=5(!5t##z}`D@c70bPV1vboeFDfj8p$~(yE&jb|Xs(nfYo+#Be^#(GRNXA!fzA|_m z-l6uBo~wm3UG12d45CU(%$gbfEP`2QwD!6*OMGtEf_gC!XiCj6c}xuWa+RDqziG|> zv+HC}+88>1na!`S%${8B11CO_EF6&~So`TKO26d9%q^I{hewnyHY4fnA{u7qL?`z1 zw(`V1Zl7wd<01%$8Or?JZSjn|kc-6wxS$?ko6Ns9x{bkOfthXD)RWkJl*Xz)ACu|Z z3M5w|TFr_qAr9&EK_Q>M>pHra^(o=Lc&dp>7!=QuF*ryWZzhTOVJaT)YV@&Boxbm?2k^Gm%sFFvJg+>P{camg^`#6dSoFbY z?nkk4e4#w>4%QStLnDV)?>D61q{6`5iOWq#GQ=Pc@f196vXFT^Fv+0&=ag%^)xHG^ z#bvMG^Oj(gs?Cx(;&0F%-jf!)3RliuZ6pc2SIEWnM&jut{8& z9_Xq7nwA0*gfO5bX(J>0xBq&$|G(>XtBJsjn|nJOuUaZFe0&of2{Wxx;|E;1 z|C*#Qk;;U_I56dCVc{*4t0)e*IzlTUcOVw6c*I{X#%`%8z5Eh+$xgRYk4~jMm-WwZ z)x2Hvros3Z`R$iKh%^Nn62d}XHG=iJYL4T(z-pMs;+H;g)#Z%3x}0SO+%bP^%5nLF zb2g68rUEa;R9k@T&*?=Xq4~qCpWjf+ZQ1=GW0m{+_hPJ6_~Ue~U|w=1UqvkMm;2Kp z+5Y#zqfE_dIQ0+Hd2YcdwxexK=0Kb0%t8vjeuQj}W;?wgQQKZ(sZNnVGzuUyn-mlPeE~n(Jnk z8g^20jPIl9jU!x<(h>@(2??+21awRpxYe4(KY-{v5L&}J-Jfb3pRMY_N$+NUidTEP z>4l3~;{@F-nS`3b?J&xKC@$O;?BAAKYHP6mgm^=Q=XsHli;tVJ|57%2^qW#`FTc|p zjAb<_mn!3@#>^wT{I2dHJrb5n8zO9vtfxpFHXGmF+V>!`(70seV$U2gK zTDMpi4Yctw_zE?PX`D3(d6v;r07}Hjj|`T$D+xP#$Cw1UKssw^=>!2gCam%M7b-dB zh4=O0;;YT^Kt>I58Mz!_KEFUTK7BIrj!2Ue&ocj^=RNLus_OjIkY^~#sJI^Qb+bA* zQ`CGH%YK(MMea&B`A9_Ubl=h?kyCXyO;R8|9ovkvNoWklABAJ=$@_{R2kK#s})-k$H*YkstancBhx}Dpv`q5 zf2}b|{B?hwSylV8Vk(TwW11`4)bxW#JEKV~$9wB4R@5jh>h!$jnjTT!%~MZUQ0x}? z7o0XaC(|HFJ6S2HjvG0%aT$L-%1l*QerAF)iHM55W^I!&lgHdr(d46uCbJ>&$w!u4 zr%P^^c8%`7ZYJj;pHE99D$#uTK=QBtMN@4h9omiiB4On^jGeC>8~f#p#MQo7SRkxN z&93G^<-D!$tXZ$sRc{xo7WY{W3kF4~#uP0IxR&w(w3w%~iJ!aBJo3nf7ch!_Ad2njhjvwU<|LE(7h`%`bsw zeP9R_J8pLDR$f@*oPr-qYklP+kAYUJlttbmx}%T*%Fs^2L#IfRxT0S~>S=vkhFIHG zUPGv8*xE7R?JstWK0~lY$>Y4OcMs^@@|FYxX`bf7js1(BI@mU^v2CAI0MGE&*4${}c+-+p1^4lJc3Lsbm; zrySFuQpy9ZYRXiKMG2t`e;FuG}XTPD7VIsa&eT3bVzbbFLJ% z-)Gb>T;$8FiG9$aV?BQ%qaHSi|4QMr;K$wZPn>p<}$ zR0^C~mvxC?94UE?OS7*j=Cs>ybpoO}`o#LzW(?&0G$a4&#HH`U<*6F@HHlDe%1w)W zS)c@KTRG48o_Pu{KOxoS&zb~0acRnN{6aY$Q_uA^=PEBGKZLR518^VKewi#=rD~=} z3{oX_F3;>;MvO|_@~j>9?I}CRo07; zdNQEKOqs*GZ8IDA-QKDpi&bStO35P?sH*@^%+;h)03+9=tSQ}kq`wx>Q(*7ZV$4YK z|H%wTF1X`+lmQQ3_!vm>My3;xP?{0H@7aeG4@~}4ze9d=NaJ_AIc<>G++Ht#BTmu-2pCl*+wFp$saUvap_*VX#<-T zBEUcBg4uR1FaXkk=DOMl2(kk4`2srHD+~BS(*r7Am3o`txWy_yjH89q_vYW z7JEfhYFHgNF4#_3Dppy)2SX0&nm|w}(p6SEZYHB#St8hV9IVsRGUBT`<~lfTi|aMK zJW`HMJ7CduK)JpC6Be#*)6&0-D`TYk&5@wHXtv}FX#R~CU@)pGd6gsQv%a7g)X{9A4 zXKo6Ok4|NPo_vK_38ck`c)mmf^V9?m>6EAaf-*`rU^#yqV9{jvuth7XR8)Vw&rxO| z;?>1%h3FIlU!UL}@g1O0J#IWIP=And`@eB`H+kC zPku*KJ5RhxwS0)MW;@=KdODkmKMkGI%6f6$1q!wd0afLw4o!M6-4JM4sEtwJHXyEw zfP<&(($WX5rcEUS&a_+PO1KD*X&pz*M$M<>s3x5V^0 z={rzJPHRZekrx7N0NZEQe;8nY;yU>F$dlh>isvT<7ct!1>$V8nG27Id530FNTgsI+ zH2?W^s4y(e)?N<;08!Gf!qF<% zs^pkdU!bbO2deO|BrQddS0b&fj?kpNzb%vf;|L%=WnqnoAwRCWMFQ!N#sg8U2MY%+kC4O*d3s1pfoczGcUh6 z{I?FMC=N1yeA`k$6T|uzkM+Z?G`~GN2Dh&f3Dz$myP|M;`lvo0WQ&E}zX+N{<9Km{ z#l}rw zat%0s;In?96XCkl%78_ILTB_^RA_V(+b--qtVZq+7aqSo+8?^`++(dt~>-+az`S($0E`Uc(PQ4(cJHYCNKjJ9m#d`H$DCI z;=`@Tl@xO2N+;zoDi3{8BkMiehKKe~l!N3-j>IGNorY;-NACo&hAb)WsQt$yk{#p~ zUa4oC(wlM&>vU?C&I*?nxj}qU?eNSOoSEbZEwS5_M1IIjI(gup;N?Z)tIp4@MG3R; z#)b$k1z~JrJJhEWA%Ii1YK~8wAcD2}P^G!}`Nl&Io;ZC!uxCq=H8Ib4?8f za0aZ=Li<)*S}i&`I=&Mof)ys$&y)V=CUd;*z9k0B2uG-i#-sE09}*pT+wlG*w|`1{ zE^uS2ucHm3DRE|q81qq@UrXW}VCQX6`E2x~EoClku-`C=7}lOw*DD%ho5>Khb1rF9 zaeUOaE%82AI9brsK7()=%VOKFw+EDK)yLu|{h&yjs_~2Mz{1(2hPN)OnwMOwKxz*~ z@YJVFDFJM#Fg$hGbfI4$7!4ONRkV? z-KCWPdY7fhA4RK3uS}$l35pGp!1vL5w4`>wkUL72(S5`#)CIh&@cK;}ulBqR?5iR( zQxO?sD_?T-w;9rXJU7Q45Px)2DaXeZwtq-fyG=g7Y|$-dQh2(&tZ%2ytD5Dr*6#g_ z!C|X}VE4v^bfYf-9YT|^=0TN@8`aaLWjWJ__2uxh=k{C2Yme}gNlPA_01uftj`sv5 zA?jvBIu_>%7S#j^AbUkqr-m^WYq@lgQX~x<2oy2hFcNQd|U9iXD=fobRQT8uUZeeE)0`9LjHt^-L1bP zwwH$|Z@$H`8yIG)jps6ACAHJJr0&KZWQt)d;9@AdUpe-&$9qxS^D-|&DA{&kN&MKl z)~Vpa#JQ}VL^HVxN7A~@zevD1vAFo^al6&$tWBop%H zXYi?uV340%T~bbfFIWs(60Ce^+E% z;>{KX+NvmZA85LhV{pS`h?vVa3q5=}x;?SJ^!}Fzd@nG2#_{98<$1A`{9hSTN7bfb zt|Bf~AvpCpzO1=ZaJLmIVI~X{2V&jtHPDC*^I{0Y-~uUCGIKE!LE{e5o%=Q=UCoeW z7lBBmN5)o}*~-!v-+-GI&q&=`lO83|xXlr;J0EXn{)XfiJ z=ZqP4)x4OYaqt7qY-=6z4t6i_jkv5B37Nf~O6#fpKQs-?L^ zCq(RUqYl5wrA}_oFBIqNj7BZaZ(^DRn^fS7Y-2nKg8!-e*An-9(4}Dcc0j!GB)mBdxC4VVP7&_qB2eE9eo8gdAyQgeOzj^4?pZ*8Qd zE>yfGG4-K|PJBTS-gMR}!|}J@g-Y zStxrs3U<0cPTyWPOhox9oIDKrRsf=IJ@5_FQm{E{DC3#X z9>yKuA61>w{YiS)fk00H%mTjg5!tRdy(ZKTZ$20b6#P)nBs%WZtKJ1;W0=B3*Kh<$|GwSDah%IR}jg`r*FQE_Df?-reIPp@ykt0xC2Ka(nY0@ zvplxhvl{Hhdl}^U!}1>zhs0s3Ht#>Aqs#kKj{}od(Kw1sP3lAFHsp{z<8BF78;71AUn9j~Ym^l01pDv^zLVuaiD*4M zxr%=GSeyUC>G<{i7d3s?j}JT?XHPLw;sfdzszk=;TtRus;op>GRC7Ew{qya6r#2!> z6-KGFatUn1_wph3V^K0pu?ZCML0NjuHk1f>QZ_zQ{kL?irTQNOM{NYGw*fnARGI;q z1xs5GE82-laUqM6p4(Qiz7oy4eG3<}2(>70&#om_)o_|M&1 z32q^zsor9&N!L}4U)-$qecsIja+9Nu>TL*m@n$Z-w}=4PRNwKWV$18uEXf7t6WnqXAStJcnbkb;*L1xYg&#;54V_%kw=E&VJrJDyZ0Nc=CghAHVkR%fG2-Pg-8ap^fZ z=ymLwd09~lS>Z+l{CA{SV{F|=RI{w)XTXw|@xw1CAFawT@)g&3(X2i8ztY<prSC1bvg&&72leo0oXxSIUi`ytU-{MeS1*$) zL10>0D9~F95Z{g3nZmz_3?Ol*EK|ktchFofYQ`-E37f)klnsX!KF@VSs)trdxFCDR zX)-S(*AG~_#bJYmozy~>U2S~Qx*G5adrfnW1JgIzl#PtdVSG|cSz$?9n?V2RdlM_#+ehm)lwe%$mx6$Bid1I#LdiMDxgcXDtL9y`%>6+^^|TR{xREs zJBR*}D<^B*bV8Bk1bDOZtM_l9qnC^_s^e;UxemPT58Yp=f`CuM5cN3&JdLR1fkn1q zb9umi=6i{;T|=wIX|K(3*E0s-YOP$AUw_@=PWsdP2{YNH+u9_3#l~w(NgD*U;HTM@ zIQVzn+q`f%l1?Ov@7n{H%FfEllIV2fq&t1PQwqC9MnZk$Mb{zHl>yt)B-0Vyp^v&? zbT+$1Q+wf8`ScBgU$Q_$+%8c#HW8OPibhlwI?D1*($XyX1|LmIr7_?Id62kn*p$5V z>H~N1Y`3sdB)7E+9{=d34l>WW)WzST)Wll^Y=&)^^q>$sjTYTyds!Ur3OD^@&scr0 z6COH^W<;CDqTKgz*}eIiHBCeMtj;UCJ|suF0>nUV1mjfRn#_{@3L7QqoGS z&^~o82JM?Qm1v#l)DrnGdEqXEfo*NEm9tvwXRo-l*U$ZK#?%|F8)*Lq##G&AJvK>1FAzw2dod*J5@ z3($uvtT{Ft9pZ(y*E`h7ZxNCVNo9(yre&Y}A`19GP47?JY!6O)--fznLo1u7z=kq+ zfck`v%A$3g*Zd6?!or~|; zF&6j`^$N~2+C5l3+rrMp{rz1E^^=DW-~vhCDfuBN7Pf}XnGHnZO4lbEqX`t>`D4lReZ$i>Uc>Anu* z;}h4|J(E8IndivmcKaLrb!p>SGowaQc!PbYu+2MztUB*@d#Ggk8jFaC!>2fL;nU%9 zvuo-F76l{W!SY|zh~swHZln57i}ph|zkSoyV$a5C)23V24~R#Njkj-S-e_)IJ@}AP zU*3x~z@13Q755Lt=R@K$6RNjNvIed8X$rqGOS-@3+8#eByfLE~a&38Iotpye*l%2T zbeuopbsgOvI*_rajQ2e4GSa`6A9Q-8(h1U(D`lie&~Jz|!*Q7yU(#?t+4EWH0lKW2onj!&a=$($Xz#gQF>wD?co4 z&7U~!KQ7bupWs$=&&RBYe`a6>Ro!+7*B1n=Y;K2#%2Q`{r>#EC3#E_heDI;5IG?{O z=c{>4XoTHUv&w~vcg#pHw&{v9ZI_5u$Mz$y38-fML(+Um-}z$BSx7_bXH(uY(|rY-2!V*lgSVG?1R!xgxWF=UK!F6UWunU;<`LKxevI!VX~4}*-!Si{4yCXzrl zvWoGwID9noA5xjVEfBe=dsbenFR!Yq1?tAQ;Efw_(m;N3W7m4o$by`@!$?nk?Zx{48~Z3GB>Rv1^Di(mKJJ3gV29S=U94kg3TEqkF!RW zxbUUQE`hUz|!az9u#OFw844m$zaI_d;;E3{Rq%3YQK z-a4<#-XAp#j{YF51!p87+$-;ZEv7qu^$~NZd^+rz$0M&A6TniPQ-`37s5ebwqeUBR ziDx;0(F}Cm-ie?@PcT|QWAheYBSUd<6aNo$LuISlWiRrBYFZ*I2=_`rOw^`8sx<_3 z@a5oQV&)SnM5b$=qJOM(Gl_cHrf3`?M%^>)+uGGB+>AX5%|9?jMWWtFOObySWRamc z|E^q7Y4%)FT+Y2ZE4ZJRj?}m?T7&v3ndrvBjhOjiMT5(RuitRk*{Xy{PZL%se|91& z?ffONATev+NB>DACI#J%vBAc!3&d#7GtbS6f6m4lF@#62Oh?OoC}cZUpE%nVTm;7x zo^J2j#L)Y^|B-xcMgKq%(=n#tri<@p>00PQ!qvb>S&Fi02x(rjX7cRc ze1y?d1;!9EJ6~_J*QuqMkIeu_h@|7?vav#v3Fb45QCrLV1P>SP|gQdxYT_)nIe^1Hg10@EAr1V7yfl>syRC@qc|QWdLXfwozN*#0XMU7TR3M8USBu0 zBzmBl8I1PEtK2&LY<(meyVeJPnJ4OxBXik>iQ~!?_09W1lDD%@%``a_XEy=z_2J)n z#_RUB3#QS`7G3puSmQ^sR@xKqsTn}|1=U98=1Y+o-}{Ax{MXu>rccDExb*`Se_*r2 z9zG4?aQsvgEo#^dlaeT|O{kyZY3J{q8JFntbcX0QEq*C1$_vRM4ljazPO&ES*y?~t zYn;^8vcooVQ2YkZ?mhk?HNOb9yDgSM>fZvi=MJ7y4vqv}+mJm2ts3Nrn!{&z+jzb% z0RB$RHSiy{2Q3K1IjUSvYdSs|#{YztZ5HP1U0iB+nc?_!=SkQLg^*q^^)sivfCIwCJ?-hK;wL-wG)sGRQ~jVGTO9? zbC4507(qs`w$3|Vz}%;%uB;Y*G2Sb#Nlcf<$yF^yTvB)`SD-Mwp6J3uy{u$cU;+zH zlKJQ%Fac7U?xhPmdewRAdh?vTEJKK_Li58h<8+u=LktFu);1So_>iRhx*!z*I=^-@ z<%2tksWkAJLBx42lH<1TMU;nKT`}Z7RfRNZn+DT7Ze4;@d$6 z(F0z#)&vJ>~^}k$@#jq*1vmUf4o&ciu zf*!>Sd;gF!{vkz+KJfd)$5q;W+kj(Jb1!>q*DuRHanDW7w}5uQe>Z5q$`rj*`-g|fE&{ST?tvHzjS|3q(5?W2JzC6kk zt@cy!?Yl33-ixM~m5+JC?_beMeRx_Yxe;o=Wm3t#pYR`R?^phZbbtslz>N@cc&~Cq z@!EJvO#e=MyDPtF%ZuR10l|lkL8G^JE|VP=>{e`Fl{bely?zc5wxK*?U8?*;$~$jg zMI`JSom4$pM?~Gz%L&FW-a)M8tY_t7-bVc1$mFMF5jS%6QHWoRpwj?;zffq^donX! zESi!|rKOjCWGvq^P=l;9FW%9T?&{wdjOU&i8g4$dizT?QF&U$`G`!PUFM`PMTUZF5 z*ehv;X73i}<(3CCP{!$K^ARTt6Oj;Usy7%ryM6Z9jv^y6WFxev+fiff;!QD2^c5Tq~3kQIX1Rd?pi?n8@ zJ&T4cn2wp2Bw&NnviMb{u;Oj#XXPc?cGjJS<+Q!~7q9fg{LF9rR_i2635DU)fc*gj zSrWVGBOtdD8Wzr0`nL zNE7r>8Va;LWN?@gmCDjl_sYsSjONIlWqPQ~ehL1e{VBjyBDIJ5N!PYg*tMR>e;1_c>kQUnUqsPCtKL4Z5qu~MRQ=zj0*yjv z+N*xT_F*h-wk-%zQuJR5;({niM3mtF&mHF<>WcsS0L8P++h{29`PZW26;3W~(0yJ# zI4o;QUIbP|ff%Yl6V*|BiF;sr7)!p2nRNAo6}>1=F+XeY6P_%+_AdoAlRW!Hh*U$L zS+5`d4_#*&6Gt2VYotJ-NO5;4?(P(dEWWrG_r;}X3lu00i@UqKyL(xj#TR!d4(x!guFA+?~tZ5QIBVtv)oT#6>GRig^tIb&ynVqlegMR_U+>j5WR3nfq4@>*pg-) zqE1M+>L0S%DkRgoD&&;rMQljAyb)1sUIN=bSPesi0Dtu)^k?H;E{ySzXp%%8_0L_s zi9RJK5oQl6&vFFW-2%Vdnz81o<&n2$i{pAYn$9UGEVNM%>Z#*e=j7+Z>?p*pF(K4h`l4~;CNB}#(rP{k>9fA$>jbAoy`^3E;Z)3(%A%FZ-+eaOEO@7znLv^H&Cs=OXe z8Vw$s>{?H=_$LAWY@KS{@&gl&Egc98b84yLJ-!=#SpJ4OF2ZXv`@Id+=^F=MPz*au)C7=yvwu(Bw9e(0JtBV zYsZh~LhWBsVkB=|E^^T&$P3HTw?$EtFQ^#nKYZ34hcqy}ayrWw`es*Q2}`uS)0jL$ zAXmt!>GfG-mJ^7G=Lv%fvGX@BnuS5z*1V6uHC1WnaFtL13x8Bae}KFMCOxYc=tjrJ z<)K^;-#wY6B0G5!?X#k3@OYk{=@Jgs3ugWu)6}-NTx>DE`HbKV5;=DMDIOXjB4%6= zYm2nAo53&}MA~a^!P5f+-G&atm6-@niuv(-#s*&^peD8-C?r#s;Y*EM0d&9+VN?5>zwLi)s8obGYwu4L(BlBTN)a_|6BvEw zBxSUAY$c-#KT`lm$T~wQU$$i&m}dkNgosU7dhPo@gpysrlx6l?$6-jJCM~=D`#r!!cIuQ4kAA8$0TkHBUi?&*r!oZvj zI>ev!&zrTm>5k`hr6MD-J$w>ugVG$sdzJwU4h0p_YjZZgD(#8B48~qYWgJ_L&q{Dr zPAV8h`RQc4JeW4GCJl+S{LAQhS_*(K*;08KfI>pJCgkGiD)gnmE6hAbtY*?_X9f<5u!zE!mPaf3M7s( zj{C=kxJ_D#7BuJ5+vL>=DMC;>Jd9!P=hE*;q5ggVDKhmu-}`}wjexf#Ed~~)t@jJO z31Kj@=1@`~1@D=wg16*l_5J$AE&pI;oMPUl8R}oZBl_PlPA=(sxn*Q#2M95kh~hlc zlW4aomQ45SAjWYBXlHEZc3zp6X<2k!&9_pb_9o3t&n|D z!U!HiC`f9aF7W_ECoxn}Es})7Du&!fof|CmC%w@hjk0Y4_94n|n`fTId;etL*vo-C zLJIp8bmseyH}(|kb_>IEMqU$!Yv6k;ijSyuu>3rK1(g4)i_B)XC=r8xzAdC2U1{Gw zo+`g+$P*HH6&@t?`AlT;TFy%&m1-EbSn=~;0S$owUhfXtO1lg~V&L)2T6C9?o~NM$ z;n0E8_IYhp+OMNC#!!^nnjsrvV&E}(ALU2`%H8CFZd@t&_`>+E*+Cn?d~8mRvvJeX>&=#^-KT#^scYbM!nUN@@! zQ{cMDCKIwE)Ji3uhzTY2;b%~jOP(Y=Ma!dogU2#gn*tAaQO90#s%E_{PJah?{B7`} zIkK;)G-MdQQ56k&G>xr{k3$Lf`yIwc1v9X`l7 z9=0*E!o*c=alf;B`Hrd_eXW|;rm$bs3qMP?)t$L)i{?9R46-#i!GvJ^>s{1Ms7heS^=7wiprbg8O{XT2J);$mCMLM}owijH%$pZ01sD z71r*M$ESX)a6l2$__B#&@pxL6!B)iV4Z=oG6wu!q+cyW zY+wYfg~l@`QfY=%okJGfVgtml>50SE5QZD%Oz~hu*(xHD7P!7y$3Y*mh6VUg;ifs{ z-y3sk4rgfo%o$53d)QSERwhZKMKV**D#b_jmJiMWlE7rA?9vU>)!OLi_My4IpzTD} zO8&Sj(BQQGi>ax~5PAMz2A5#nk%Wmo!$Nmjz8Lv)YT7R3C*yGvSaBH1F!TlC;ln^w6zIl>q&N;_ zg1;!xI!4rGyZ5hrU(QI6xGMVmMmr^?Az)JK$7dQVBsGb1Yc;W*m>BNSVWV&iJ1bp` z8fa*s;-Ssw0;HHAb!AY=@613cpmwicq?*)JE{5_uR|orpRDd6Nom;(Mfh;Is6TrHe zT?r#zdA7=8yvmvcVhCaj=|V4>OHyZJ+v9M<%0VQo)i~ud3w1oG#WrPH6gmkrG{}W? zz3TUzzy@e^j+*?isfkW<2rtgp*eEvf+b>nBw|$zAe5$}nc4{_$4l;aku43WmFzO$u z48RqU*%d`MieLDSCARjt_P^#w#BUUDyJ#azB>uiXkA+RH&RRmm+K?a$msPVrf|OLn z9q$xaKcHa3%SvK;ueD_l2ZGnJ^gpBDY)OG*i~LvAQ{iEjIe7=uY=z84>S>-j)vV&; zCn-OSAJw(IU|_OZ<%B9tarD#ok>P{pnA~3=T(>GwyXwwhXSBj76$fx}@ahs?z0{CR zPq8Dlmp0{|kR^e)b(uw9PKgG2y z7o%DxbB_VBeZzj3c#{r>u37pj^VUuAMhYKs9$LLu`yczlkm+^yK=zqP1VOBW=EKL$ z3qg{_tE^hBUGTLvuIhZnp6v8oUCp*Jc4`K%hk0CKI+Q{(LNYHlRb;6PapumCtMMTU zp;>nt2T&TzH zsU&?ScrnVL_`TcmPLV^Twb?78_d&$2FNrY%N(SRtcBTesEsK3ZIVB=^Z!Ff74>ILj zPo^2SwPg~umtY*Nj81v*>Z}qi5M5?@vN~aJA8u@x6zG>orbBf$p4a1K48l?r0SG>A zT(NSVOLvp4f7vWX+BL|dHNaTr6U;h^ocX>6{@Nb@qNiHNCPUexw*P{8;f<$XLaLJJ zYqPZGB4R@SjNL=YbzpVgG$G>l?|b(Uys$&LL_N{oYZ~TFVoTMvnIZ%IKol+<*Lt?R z+i?^TpRca^rE>}0zgI<80fU;TP^d-$)8VM-mdrU5uOM)d_Kw|ln@`r{s)wa!c=eAgLm&!AbsV67-We&#Yd zXEbCu$+>^w1#XH1h^qv+@Sd_IuZ>x$M`O zDJt;i*ayzrzo|l^vM&0v14Z=NbY|$j=n#D6n7;?F_$1%3THy{Wo$fd{?e%AQNx+uIOj#{SBRor6MmYYw|V1ZXrMyyEw z{MW3ds@*wum}%EW!*#ZOCVBwnr+11l3SBvV$Hk)?r>!dfG5up)A@3H8 z*4hs}L6R|rohk3b0eg`ngc?Tl*{A10#TUBKvql;rM!% z5ogXfQe+}BTnuV%m>;Y9X5K%g-5Up*Y%Sdd3HE8;o(oq+sRzv+)TauJsdZFm>%F58 zMb&%l8{k zH9s?vv}R=8z0g|K)aouCQ8vYTxcywoidWq_L&Jy;Pnz;NG18xz{X?jsB5C3G>!c`_ zhNnqErM9NP^<3Q<`sglq{06Zt0Otc$RZ78`jmWgInfj#(1($caTF>li+J`S%^9xhr zcw)zPd#MZ>{nqfc49jL8f_PQBv%jh%AXM@WrR1%DdjvE;jJ9T_ue_S-waVf$`><FVyoObC}yUZgM>;iEW&$$NTb%%XiVsZzw7MX@P ze*%1%$S3PDbI-L{772nPTLbD2uegQdr;Uek=TWDAyOmqstlTjs??zE8-;*0I=N1mn zx;zVJrR<#&y40AmZ%_w#O`19u5E7y=k*iZmFtB0r)c%wsK?s^SRR_&DwhqeN3pcyG zmq(Xp!!>5;WDw(Uq;7d`a-NrIoH^g>r~H4$iS(Ti8kaKa(Xu#f*6K0qX+SX#wk6l` z^oPuB9jq>xGo^{8MfS9%@U{>P}zl;F==F0#VY#rgneDW*Ya@7w-)`;4#;A3OvX}ePg2T_p?@^s*5DqE&j>cap=Qx50ibW0d*C{!f0FD?S^@gR|68w3_V+*76^>i$JCp z@8(1KUCVV~J5`vQ5V$-j-pXAxr>rzfKkghX z?E6Qh1-5UoO#=MdV@^Av6o3XOy^u{Rm{r&^1h-UpMX9b#t2M9{kpuo}adrGdp{|pB zn4!;DFSUMouKv#GIJ@=tB+bhj#ck|V7O5d*Y3_cg9Xq9Qq?v*Uag{;DHq1X62V-0C z?H9DdkL3=YzE#*(#P8CSWRpw(@R5ge1=9RAh2ro43?WnO&4rYMQ|z5AVen^#Oc{n{ zG$S|Fr0OHcOG5nucyi*LfR%S@H9Z^*?|eyTIZlxl5V$_Ae-2KvuJSh-r5ScY+WfJ1 z^2IpjgKSNYUXHGC=tNW}+_A-g5JcS0QV_=d(V(Z^t=E~9yR;bUrkaJ(o8G>kr^t|v z=#Fq1@gb}H_k>^{WdO4_MXNN^j!;t}mRx1I+kmcL)MN&R47zE?d22SK@+(B4&)hln zv_mE;VV9X)Re6fD4kE%k?0XLS8JYoQ3d}Y;91CE7iV3@hdF1+@Br8Q_~r~v zTuL1oPGd8(__Eu6>0#bK?wo}*V%8iS#_@Go980m>-u#U3Sv&J8El&kOg_1o3Y>eqE z;jAy65!SPmR;doTz`F4!gQ<_x4Sz*CMKWzSBZaJPQm}|xNN2Id+`R4VkmQx?0{%Ht zoK~@7PT1dXm2kX-F=AJu@66y3Cs3(DdvVPXwJrY`Yu}1C#6Hm98xNy)SLcbiRGiq^ z6%y8@6t7_ISj?tk8hHHbRoza7bH%R5aXhUaHbgOvINiLZ`)5Yz9mGtuZ#dNgRe1si znEUvDK{U2)jh2hPfoa618oDFD)3!cs%~9C^v*Pgsl0vZR(S}aiQyMvb_-w8Fa_|GP zzN{1J^BFYzv}BpBlJd~MPfU;dk(HVBlQ0>$qNfhTYnCxreK&^_j^iua`M8lhU^dq2 zO`KtgKRhYOM}oz#3Zs;(pP2NowApZv{*^pdznpzpY)WJ?NSvg#xFNaGH|2#o+iq2@_rVe6QrRy zSvKjTH40#?yj^r5j+ivJOkva^s9{0*&SWJ0=ZD%6uW4z;?R4SCrAFdk9h}KYinr+2 z02@uRl&Cb%wZ(|fjakXt?$6o)6Ns1mldITgFVcF?t+DJxPAoRF=!yv~02?WOz=KJ)=^hA<5YKj% zyZ?5*{v^`ejNgRRU&~cQ!urEFZoLlKvHEZOEg!_rvQQJs#4*RUDzO`C7h^QbaZhv$ z%D$&bWiaz-Yka={xS#DE;8Mo#{CNTDC8?>YmOmzeD%f+}z$`HnRF-qPs0?&6e=q*v z_)iK}wJTUuQVT{R$T}I|caI52J;kQAGENHhn$`kJ$}2@juILt}PkbUX`l|pbOlj#@ zI(jQVv)pxL?lF8WOG+a5ULz1#7_Xg1xSN^VSro~xkE?s$-gBd*%KR()w?c-^N#Y>w zcV<~4#y<0giHCr-+T?rG%Q#*s;$hI`BwhZRH1!8{U|H1Y;thmxqnT3Jgb$Q05Vd_KOGd=4qau0eS^|$MNmDQP^lFT+{h=0Yzbf-!zZV z%1!81ZLI4F9GVD$lz%!^os=(Aa(4Nsv(zI4H~;uqKp|U2o%(+b)R*owl38m7O*r{> zRyx@v1F9)W9-I!J@!av{bU2e*ivrWH5t%B8Wy*dj*myDlMWnX6GyGPeEoyzXA;P}p z;Sl8VhqyF%))#E{5yN&}k5@D(I=vczreSLwf2ICGAla9120!7+tvXLceaC!^U8 zXppNhJ%W5^DU;`PUrtfx6!L^Z2Dr~1w)95G9t1B2m>R{!j{P%N6Z*^l_Us07_g)ba zX0b#w?Q9e-qHlvd*Jv<`%5OT8trxo+D}hG?SKgVuBJ}z%b;p)sp5C`MM?FR)XQUP_ zS{A2Ki#)_T6g2isNIHSqdR?kJltcRfrC=AW$~900 z^T}Re5gD5azJY`8cmCI#ewg!sR|gfR(!zGG{_fZwJE-VusTz)Qj<-nnk}8AizC46d z+McoqX0N0A;`5=f+9a(l>4D>`=sgAywy_JBPYsK)1NIcf^ldLX!GFYaWUUqzLmMnX z$kY_JLJRxfawThJIaRP%XZ>tW>QY%VZjd7-N&9l|IdJN}HC0xghGD(Ymi)BW|9)YV zw>9UeTya;2ZcyGZJ8j@6Yoqn%Zcl??FFV^7&g;+ih)_ zv*&S6ob&xp4F=Ftc^K#*sK%))=c|w*o7>f}$0E2Ze2`?51!>WJs$Xm$_6>G#?n$mAHs z13Q=b@wl$^X{eR5nr_)|%KavDNJf*dEug>C^Ns(uj&h1-m}nur?21Sl%y{Qk{fDp^ ze(w1^3tv%oSC*>aDK9CKQylZev3~;ltJll{M5p=wl|BP-AB#n1rc*LeiSAAlIXT?+ z^{YyMreahgO5~RAMTLo>3_4g_t~fTyvL;0cDH-Fz;>H^QN{Ra?NJmz1)L+<=yuXA$ zkDJ67&AQ#rzAH5+yn~&p2?)A2?>+HM%5uU##s_W_pNr0=dTHVt0--hgZr&0V@Z_ln z%q#sgcFcJ1h2OZ^4(^tsY@14p~YA*sF2+zlye&Yh#hn1XV@Q>d|ZwX^sV@LVO=M006h&V?QU?jK~g0SHex9#mZm4 zHLG#y+P7X0B}tt9HX<cKl{(YM;ng8jY zl&Zb^M62znLBoOk!t7H*UwSyx-!F-Pj3g zT2;=0{)ctN_z|s+ktxi?^i`6VEm_o!kD$#9I?d_4Pc8Z+TcDbPvE1TlcB!R9T`D?9Q5=I>#dy+k2K^?dzJ&Sz6!G4YN;U5Fit%W{~a`YNEGS%BME zL*d3-=&B~4mJX#b%4lGkzQ>~ZBLJ;do|DsQypS$bm;Adm#Lyu!?u+W3A-u$*RZ)4- zqQHC!?_q!sQnjtt!Gk8xZ<+S_ckjc?t_>_|Tj z7Ifh{?#@0u3G|5p%C?+Fp7VCr4l*Srhl=gt z?`a``=2EeBp3T?K&Aw48V{qQ*>Qy2DZcy;iwBW}s(Fj31>h)u>p0f#}3>3X5=1Wo#?45FJMeoa3;Qvwg?VcD~oM9F0>Mp(Y zoJ>$Z$4TKVNR1pQYWOvkiTrTU6#Z`8gkqwX+W1#U@s={2PoI^ljnUa@B6=E(=}TF7 z<}T{oG#KhKzJ!RSr3HPei?@a@@?G~zpxB1dcLf>DY`+ZVQ5H@=le~C0_Ow<^emttq z<$KLw1irCwqjk#Fasf(=Ep^qL$|_5fVIp(2D^ZxTTEM>Dr!Xy;y)s8Fnq{S7yBc21 zqmJkS!&6jJOrP;2t5gNUM9HiqbbPL6{G=kXS&!V}l6k?MZl$c^q6h8?e@u&Ka{HD@ zimC@$+28bnsQ%f9ak$~pm6uCIVxrjCdT;sqStQQ@!;^=O zh<5g`zq3Az>i0cDl?+EqbA6=$DTf2oJd0xCK z+fdt7z`?6kV#eIMvxo131+}zk>gy*E2u$-ttjr9z38m4O`?)~3VE z?3aYv6=h5U2*unybSBi{lRYniPye(HsTcF|)JpT#&t}_cm1qW3^|S?6RFt&|G46LT z=Rt`y2y^TeYn~liNhYzbE8kf#oOVz@FjEj0ms{A|ZWqF6RWeyw*b(tOp-;y=_iH+R zY~NOFgKtSY&|mRZPBYQI0=etS6mKX;&0~d0EGEXxtG6PYw?rwV+I=cE@(e6$8spG^ zig4tzUXRVldehRpkv6`pHS#W!jL<%s&OR}tG@w^o30pKS%|9y9x;U%*)s5~xf5b!~dH5jDJj+|@ zwqV}Yv;Z%TiMQM*Oh~Y4zYAv_$330=g6TS?)+qSp*L;kkG)nMV*rA$3_59*fE&ZoB zg)#;N$T%Z>;ESFbb0gpSj6B?NzVAo4Uv;?_A?jv+xMW%A+(#~kH?B)aP9YrK1Wr5) z*zfxg@^-{DI}z}^otPIg-y~)uXO+Fv3YDj;Ny#8 zF}O>#D^IRO&UgnA+E!O{+E2u>2PcG$q{CV0JT~l&{g?*P?Dfb*7XQ~tB91ldAMkFe z|6?<+fA8Q??C;#2yZc}gRp;sN+(n`AppPc;7k1H&ztuAlas+jqsT9E-Q`>Hxe!o>v zj^yUoUb&!I9C^jjZncAO6E{y z;O&UCd~S)?l+2$#D_L4l&POAiXbfp=EvTSZI++@`<+VOxrMKI$Buyl>*W#I?l~W*@ zEjsD$cwdKkJ;_^(D&b9kE*9-F?sgr2^e#8w#6@&rg!mJ9~kV~xK!r*Uaipv#GHz%|KrsLNC8 zrIqe+o2#~xy_F&*OC+OQO@k{Ko!_x$Pkw*RqhImQjXjLAvTIsFqvY|y;z$)gF#BVF zPuW?$+x?(mlw3t%`P^f0?9Y{MotF?m!}gX4dBu9?rM;Hy?GjhGQ|hNPsae<6;7y(v zc4CrPA+WJ+RJMG^5#n)umUdfQ@|>vQs#LS5twj7R;q13c6RV>`OiFnkv^jn8?jxrXK;MNmB>&~ ze-!0c&pQJ(5}cy%b9PWU3nwzc1a_B3?7YIh2DfpzwBawZROJN)=$yLpOcXwNZbuRw ziN*!1iQI`ss@RdGS3yQIKZrb=$hY)YQ9~2`@NDY?i3v}f0;-XAkK&i`pX9F*@)3qlqrRV{>170s!SP<(1!kTj3%Gi0Cd%Mjgk2rx=~X`NTwQna z-OLcFTQ4VRTiMo}=tiqsx^MJG2>k0fUH^VES={gn`aa01KFN1pR0q1u%{Ba`ujrPu zBJ_pZyqEKKicys-0(S`Ux%Qsy+k&q7^`AU2J>=efdDCIB3zSvs9!5CEx|x`q>B2_6 zx%*cCiU|a2euQwd`vrh9@APnszs-RT>`4a5X5GghuwihZcIQ92VbWjJMpJljBlBqb!^zsW(SmQvRTAus1bO0glA>VN zf4bi3KKArwJoH!qdi5%!6sRYJKl>ud+u<2VOe?|e`FmnF_I&{30?ZD8yi zn1^#ij^IYWEzLra$~##K|1k_oX=+{P<+l~f2wD;JPix7ai;%1EPQ9rY|M^3R+S%!` zRCQ)or<|=0(>mjQ?o1{Yeg)%7(|TgsOVq5ZUj%{boe0*kbCiPEdN!`t+K??zMYjT| zF^MJ8FT*Hz*F&X}H;G9^R&fI|V=0^))>s7RWU~5ja4@Rn`wsZj<*LZSrZ@KCD=K@kQ{LojAI4Iwja-*Wdj!h;J5|HL&n-_%+emSJfpKgN zPHw(piV>@FGK~coetT1}zYyzFejK)&nADgzUg-zzaHJI*<^LFz+Sf zrr3lwmtXbZ%`S(tg@)AHzp@KTg#1m6OgHMnCVWdlVWQYU^~(x>)GJY)U*cttgNV0l zLxh10k@D0*IcbM%c7|jTiovXPoBuQ)z7`gN4SUIQirc5;1j;-$*`*n{MEi^In{KCKZT zDZr!ng|7noSlyR9(qDp?#x%FIbaNw1FGt|i67vFBJj|J75TQCrLPI0Y43a5|x#^tP zRV84+&yo3>_NMw$f77+q={)({?NpqHN^2;UKDXr4SY)4Zwv%7nRIjj_X!#gtQiaSv z-Oc$QilaxRkBV~x{*RwDL#G!2bn>)hTlvEs7aF(nGY{gnE-I!BhYm-00TZPwnB`3} zzksmVV(lAr#umgXc>hk~j@{>&ozpm3x;%O3t`~~z=>DDZLi?zyhCH@U9oA{>-x&i8 zsMYU|2PJ4E2a#h^$%DL>W-{T$tSAoc}!{ z20{p zbu}Z^Xf}jX8ND@wQ-qgzh3Ey-lw719$;l$y6k#<=KgQ;TAr*} zQRNIhWx0$Va?>6@5R1KTrJLV8l^=$xMDafYb8a`f$a~ljzqOgSsuB}*8_fzeseyQ^ zq_oVh%no5dKhh=?=ZQ~FTQJ5RtY*%!T|2(qn4>=*g}hdrC@;szwQJsM$`9`65+&dk z3-#X#89c4^(Nx;jd+U3MI#nJCAEd=hEYK~@M@Ll|Ky=frC9i6>DM92qVhp{&b?e{U z+xLb;!#^(`ur8G;P*wDefJ2j0EP>{Z;fuv9U+fE0 z%YYfZblp=7%ti%z1}a{(syEAL6M6V4uFUtJwD(K#=1 zn>ABPW#=vm)pP15UgxSZA0t+reP6n>_3|t7Lc!s+QGT5naNfRyMZNrg2n;8v5uu|T zmGqS|2MgO1Xqz)zWw6S^!_v&E5vc`8iET-=u_}RECD&c)C&k5)N+#25lc?H#lT9Wx zOqUOdQ2S$xneTu1!M@jEn$Q@w;TxrS)jbSJwbVvM{q94iuscUr*C!??L}zSH`${`l zIjoStby=Bif&)Xdd-4v?-ml%#tp=7*=dZC6H+6D@XFhF}jbGoJ#7)DbA^Mdv!8J>v zs$emQP4$EL95olEru};GvA8}&4N#GGpjoB_(4&{mAKwly<*g?1i4@iyM>u%8)X90{ zFnuTIE4)8I)`5$uNPDUjNyegX_x5!^`z51&NIW<@mgd5PAD3P3o#O?48>KVjZ}(ak zk8`&tq1w0%gFRGx(!*@81@`F$Zfe9mGk>lE6jdWhN;j9-utGdG>}o|J7wK7NA|Fo- zR%ek}i5Q(TJ4xYAbbMXuXaSG&$4MU2K7*?yyhPDaI=F{qFE=G_8!`rf(d7)oUDoRFpF;E?ya@VgoJ$e zfF#I;mr{Xe&IB0Ke`{LKocy4x-A)g@wJB(yx>{Eb^Bzc*VjI>u<(yzbA4bPV#y+pX zgAD-)K~oT5yv^6hws6H$qmm-hkqfcb+cpkYhh%G0_b4!=>J6uE^Z<5{G-S8`n4H&a z+?jSK_k+_N^^vn%nJu12yMcf2=CFGPWF~mGN;FM=@Qjj*Yt}@8Dl^62L2_fmK2yD_ z5;BEVh5X)TDOI0e+?lhDQI~}tjr7TT6FlH!0gs^tY$P^F$B;`=ta_Z)q-acA2M^8C zijA&teC1HGvj$aryALf1z++*#kFjv7Bji7Xq=A1N&iyVwBDhJGP zhz#tw>(Q(W`}HZPvR08Bm-GFM>XD{+Ic!#J5UoQ7?9ie)h>&Z3?!n_MP0sxvIJ}|o z%Ld4`%eG>%BR|C0i5gMh`l|hZA30C6b$i^(0fvz;fmCW%0vvy;7eZ z>`f~|r-z-ys($pz4LZ#lEj)qcXaa*fI2aUjk4Kukz-OCn2a9k#48{lSy(yF!Y!_PT z!=S_69x?PrjsTCcUwnzrR~4Jkk`bUHTn-%?+OoR?YH}AT$^XfIW4NVNB!4 zNr2Tye-c|aKm0u9klGHG`A#@pOr~*lkfXygl#g9CBOA7a)? z!paIQsZ98l&kjItK#%<99M1HnHe^Y=dqHVI%*&%*a^$#;iet?M zRmf;hV&PPn(JoJ;H(9)!QRk~mpkFmt$AWsr6Ox(ulN=sh(Vj``nUA9n8#E2z9XDOT*q0Upi>V0 zQv(I(mVAHg6L`)4zR{&zFs~XnUSU}wzL@>H@Jobla-F@9H@;{cvwyXMesS555vSe%L+B*F|2cDsp$|(I6JMC* zdukfLop@vNe(N_nHxLwhWw(B3kcCoxD~_6EeXba|09n9Mw*NH)&plZuPV%)PJUwhE zo!5kV@N{<~dtsLvMnQ~r3GxDbK8n^PM#nsrdz;8?HI9*tEPy9+Jlwy5hxmm$Rz8Hd z`6AGT3^nfYp$eZkHO>#91fRII$WS10(RTebR?WVvN58A`6bi+Un~Fc_VXHq@{UL?* zmxItn)?I-QC$_XAO?WUGVLb9L`*n5@pa(r~*Z*dlWWApb0?QY?Lq*nASOb+MQ=K5K zR;S&DP&f7yPl=pFi!;TS&&(0*sUV>oI{a|wF(aJG=ajMh9^6VR4E0yxl_#lFUQLNN z8i+G~jlDBO49lq(NN<$6>GO=A@j89FOSeWjPcc~yzNpu!tRIe!2PHV;utdGsFAjm~ zH!oAE58aQ7!T2Gi_W;esTL+U_p1W<}eo;aY{isAW3Zx=G`fDV?b?{2}j_vWxoq`T| zQRCd-qm-&U<-0#O&5)!qx%lMo^rn>7Mp$Jjv_|NdoSPUqW0O`gpJP)Ty7x zCgGjnEXn{wK9Y-Sj7!TxMy_vwa9fWs?(<8}}OWgqHHTuto;ie*xU5=y%+wh*07Cc z=a2J&4f2!yyp`yqXLm4b5Ls+oz*i*6SO4jsM8>bkmgik(ki!7FJvU!!uD5N*8V20r zP~NjyuYX`3vYkpWgj>nD2%P?;m zJISk({iC+}Q;3Y9$Wg_lz?((FP}GsGhRM$gwG&BeZ=b~z;iXgyX~`>V*vRe>o^a52 zCWi13UCnd;3`K{~rx9hY$eWWuV>p+jCzU-mX-g1hX}{l5&HK|hj8VLTJwQ)%x|bGl zcPTXq5qjew|G^A1F1<&cns##HPt)Myjn)8HFtXW9tr;@^Piw+O&hhHi*(3iGw8_{x zh>PKXW<<08!2p)Csy~%We6_>uXL?pta zF3F7&+QA3W+=1q05ahm}-Gkwf#nyJkVk?g$%-OesN6M**#BmNjEK%awgNyOSe9%d| zaDPvco!Mggqs#%=@$w-zNpZnp6YL4{Jtx3G-k}F4H|dNy7WU$BqTEy-XmkrX4Z{(A z{ibLc%7b7-aN7XYxGP7~;Z08$I^Ug16h;9>x&$XuE9aO*>u<_HhfPsa>Q6gG6*W|MNrY ztwwe8K?&22Aw=EU)hTh+zp?sEsY(Hr<21TcTkVjqcIg=sqD010>?B_VSvd-bV%_^Y z=~Eal)^7nW_HGC=M|VtT8ecL-ld=$Ia(KSkTlrj{I$hp+&gHO)K|#x~$*P@85Cx{@Q!kug<=Hp{;C~^# zo+)ha2>X4&T3VXo`P%9{kkh17-RR**Y#7(B-L5JHTEAXjw~y+m(zOtSMEAo@4=n40 z5SH5(j|I^%8aA9cx0@8m1g)M_gZm$X!$L+HPa!$xN;7NM;;XC-tAnh?A)P^g?0$xv zi-#?9hSA~>tkZcYw#FYvK~vHc#dkl{KcAT!n{7FfbZ@0?HlWvHP(+aZnW<0o7DG4-l!~pwlsafp+r~3+*@(mN40GiU5@JS(o~?>AEDrM#g901fl|Cdna@GM% zty@2usJVPXNQW(-W^Jlmh!^MPq=ovOS>SucLh{g1iJ2K2d-~&jn)srcEoK+^r|q z_{sOY5%d5jCg|!y-4=`x;QA$FB)$pu*wPLu1LBoko}#XDV?w?JaNeyIXm_Y zin+3~#O`~&K!GawCwesgAOAyuX+2l-E~*hKc>aeVTeNFOBAB5^teKUF$FwKpFNOF@ zEcMG6Kkv$@hJ{ZcfaxpF`#2db2CT3Nl1t<>*Xk*)^u-wXM06nYWEKP07HB4mnPnz5 zIs?kS+Fk<6*xGw_+yQc$l!4nuXP9s}j;|u-ZwgaABjHlm6q{aYbfISaCSkHe?sp;@ zcdRoZg;*Q4-LnN^zk5xsN<5Plwuub;Pe)~{_eVcE=!8fcM5D#X7ao)NEPjKB+Pgt^ z&`(pyW2>u5teZ*gz-0Wp9{fq4Oef(nNxg$4U)O<(7K3b%kH_ zVkR=W{{Tp+#`c%Y%N;69Qv}mgGx7}SP2u7wDJmUIgi9oO$idRNW7sawA;cwRMJVsisMwohO;3#E`y7k}Yfz!}gqm zn*_<<&HP+(iNTfPYT9ZbKp*GhidCO%;sG3}T3*cK7Qf=UbIDIn9X(T1!v#drROkXc zK`X-gPIpz7IS{wQ<9M6OP|qy#G>ANYH{@P0ghH|vEAuFsz;zh#$K>Ow&A0N8;Xx8r zeizA_8l@w8h+WIR59G5uG0qM%i(Cr?>*iV!43f)DT?A!^+9NOKCuBlncJ z*Bg~#k&(UO{MAVssFIVAr5(E5oG6E5_QqA`TzBwr(l>uU#}U8TkgN zpTdTo1`+8A40SO~!Ig_@l3xi`pE&qj^YBko%daBS={_wa#w|G-sbifKWRcg#$^Gs- zY#CawpQq##!>5M2GAh1F<(XrSD5n0@;y01zk~eP>T`MwNUvu zVW_94fnw0<9MH=E5>Kg`PYwxL7rMPk?Xb%FBWlE!N)lGnM+CA+DWR2!X zL&MYYXjr0(c%~r5tGv>9N*T3|(|3{vih_MuEYGV^13sAPVUOS-dM+^Lf|vZBFZ?*U z_PShIKUdR#@*@3LKCSNO{-b{9O5o&u;z=0t)l_Fki#LZAGL=`6TQfFE3OZnRV%dt! zeL{9{;rM#%ivIF>ZTqvy{o#4nkm9_-Ps4x2JTH={rsCtQhnVH4g<93s$x$qFP{Snk z)O>tmo+#33l1U_agvt{_qZ{nc=EK9#aIiE|`Ja>JA)0zPpO~uVDy6KehJH}_ zdt1}!0-5*<(_Kj{DKf~6#&h_KGP*K=xa*Svx;|)4_m{=d((`Z0@qEV*Q^WA}JoLO> za`FEFKUK$5tCpyu6ugZ^ETA%YY^_j@6pt8~Aayr?lk-;_#d369bxPHv)$x3vDkkvr zPX#|1X+C4eDq2xCD$%1vjr9b4k%5|A{{WFFyv@jR6}5GBk(%!<@?Kby6wo4yhmnz9 zqG*Pa-!^n6mv)f`otJZVTg#s_&+(k|)y!)++A8`8lS(WzM_kmVX=RUmP5lxL9vdP8 zA1mJ24bgoWk1P4MUo*u`P@E4x#?jSMC4DVtAb5WUswn~#R9X&JuBItUy0?c>1SAZD zh6G%k_nWDBjzXJ@rQ^9iZ zL>y0%_)jl#X1{}hxO8Y`f_^rU-VP?9ypYH$8;?Ws=~WMfrW%M+H}K?M;1tU0+Ay%{rsBRJ4Mk zprYz%)H3QSypcu7P@sy(S#DhCE?)WKcbgc0~GY}$@qc)02fjBPLWn` zyALQ-^W3L3$nhM1F;U5i5b4QrJbipr;)WjrHm7Nz@sXYskH!rvDR|Y9Q+$EF9lBm- zgOK7P=4hu{ni=R;z8PZJO$3mck=10<%33`wi4{oIzW2r8e)M?ma&83uOXdzPkDre` zKOxD}(!)((D5o_)Dyt1_^$|{H4YG-9y9WX{aXSx<2j+k*77lNlzw3FsGEqYsGPJg_#rEsk`PZ+ z1vC{>P^1#f@%V1Y>c(CJ&y@aW<#{STJBQ~QpNr(V9wxhymO2=yBCMd1W!B~?68J4&6v zvJEm8O>D%Q>v?a>l-^o`wkkQNbgkt%K3Y*Wf>wS;p{ga0Eg)%yBxB&FRibwhG9!vuaQpSP(u`ojEF1ux_87Jb}Y`;-`$OQt2+0G_umf^z06dmRXWW*sZJv_3U-{UQxNOJ__?gTgR;0%uv@xkkqt# z%B0T-k)9=$G{}+7qI3x zR9_ma$Xr!_mY>UW$u!)2yri7Of@taLWqD-gPc+p30FM*XH94v#FAi8=RWb0+ed{n* zSD2>z&EqI3xtHcRzF&f>;;2U{FCSg?WVMwPC7Bj#Ppi2q+Ie+Kz5zorymLHaP^%&{ zLFQjOS5x_FzPh7}^GB50mb-wCDv9a%3iqj6?pB_dh$E!s>uK6DA4OM=@XZWTc#$b} z7to>d7n3;e8MyxdEBSJT>S>J?X@iKOh*eU`Ri&ntV~GTiyDFECLhGKx*7=kD)o@={ z@*G7hl^k~!Ui?Jw#!RO(TuAZJLRi|YEz`s@J zm!X<2KA(u@e8tEw8A-|3Q}Ge;!KmPo5822mRXoXBZSk8xAHF^ zQ^k3=jq&HEkIfR)&B#du#w16oc zH7#q^32=+751f=mvV{RRI5w~wqvmcOJGEagQ$s=J&oFW^QdUDjS;*733@B-8C61m) zM_Kupt7Q3PsEp4f6p}_T`Wdv5eerw_XUKdPCCk(EP(-|EEe%C9&C2oG={X9Nr;;}L zTDfB-YU!p#FjPZUlPkjP6GMe@+Fu(PW?!&bfp3X5mlj*r&iAdn4}5&dcCz8idfVR2 z2Kf1s*>MAled{nAmzgD(8PBbq?^`e%ktS@-#8~>;$?z< zWXE;CRhp#6NzJSVX!EW$AG~bT--U@0$ZBDpx_Qms~Gf=TveUsudUA z&gSKpjCkREO3ZgHobSE!Ng=v!FP~Fn;U$iTCa(LTD7Ln&o#?c>0=OQ}?_R~w<7#|F z2v1A9xZADOc5Ys0PM%82)U%&6R*k-b)#!}^%Pg=0%Pg=2Nx339^t^@5=6aZElO=|I zwz7pes4ht)C)VMXQ3Pe%pzX36flx9pQYN)!Z*+s!$0dMSvKfb56eQ@;+@0SVigx8lqK+MoSwa z-s2Z3+cev4`<*TYiGKEU0k(Z^^+bW3h3R;PnJM8^0BQq#dfrIJ_p-s?PWV-ZWRruA zx5%s#B!^oQleTZLu8wh=tzSx#q1$n7$9E)Zj zj*X;W5zmIBu=~gNqqgHwzW1{uFw#jP`XQwFsZZi$wRw|Kj_)IEU{364PTfy!s9`SH z0G;kgX(g9nqz=om4Fyasl$a)ZjSAWLWz>;#tk%L2RnW1=EgNY)D^;txPUtmS=LC`Q zs1z2vD1c#bFg=zotspti(fe1c;@b&Ja#(Mxe4fQL)m(81sIMR@I{+6AR7O}z_V!%a zvh=1-sVOeSTVIV#s&5KQ4CN;qJ2})aGq!I1B|AeNmN~hs&Fyxw%hFQE1{xnm(`aPp zTlqHnnb1(=93PKMhN0jx4<0NJ?T9*iZpDtPB4CV*%O}zqF)5iDx zMbLwfr4-N|#!qPNy~xoh%P<|iZg+$jnOD2E*zCF<2@!a8QJFO71X(YPO(eW1?Ob+V zOX?HyG|-N@_Fm~~(yMh`Up{Jdnq^qB2X3qA!%DD3zPF86TRR$(!ZW6Nj~T|yG{0&* z#r+vAmJXI)&7A?g=pS2F!La}`o6YN4&A#dM&*rz0V2PI_YtKv6vPT=+;WYfU zc^$vdYd=5WZEZZ0Wog3+B>el4%Tyh-bjN7-PqM`q8ofN;=TX>00uQDb18z2CVh-c7 z?KF;fI}>~V0C6(dMdeNI*`j$cYzEmDfHncN8|UG8W2p4K$J_hUd9VXcX>m`jEIA<_HPa^Ay3Z!n&jYCr(6AIgD!RwoUKgUZo zWE9j?6FoPA7eq}iqSCB0XTw7Hg~=N!)u*!SaqY?RGfg5gRV3K)A}%6eM`|(Ef_rX8 zr3W!j;hnz~AOrQ)fgS)-{TnmFX|Q_9h@=yVR53L6fp<2qSE z2J1a&Wl}u7E*F07MKIs=uq5}sJ#SRp&XW>H!AuM~{4!=;S$}&cPWd(|W1(r_kDB7( zkZ`s;jQ4t?}z=9Rev>;!gRG zJxL>TpJmNUIx}D+Z~98hkKrh{;?K`3%c+g}T|JL{SBGNn6^8z#A3qn2QO=S&=JzE{ zC>b)K`)zVGkU7<-e%(Dy)`yJo&H@a7FaFy$RVTZlGSvExo*3IziT%7~`)AC}MDo-f z5H3c2>)ks?Ou391X8f;(+JlWqK@LVe1<0ucAI+%Sw;SDfkdGM26lrg^*Mv_pQGz;Iy9xop_-Om~z#py++up$|!r+{~yXS5Es(?v`r5O*VEt=Q&kjU417mFN>NBHO$3l@Q@Ib} z&xZJF>DhFK*yKDsW<-yRi@InMFs&AuTCv$tfd%`W)1}B7x7c2xr{F5BYwA3cJ zi|a{Hu5}3z5*Khnklo{s!VTotarH5VT|F;i)Poj-V%|d-6pxI0U9T({*Mc%dnI>5(d}Um;hNH!8 zN`LC&>)RD%pFp@-84&p`4edo>%SBzZM`K^9 zyaUqMTS_r{x;j!8G6=k{LN8+SI-3E(OUPNbk!uFc#f=10MupU^Wl8B|IKXqCpxwLX z^8`H6#7SJ9zLt#jbMWijNmt9lvS@^4*-KSC&chuxBo61;dr0lN)U+C%vO$ZoPSSoC z(WPkB1aX14r*HS|GaV(DT-)D-yE0XBMh{y|Es~?9;p!p-8oFCa%cmz(vbwOWnvd0q zjym5jk*E^O+|C8utgKH53d2!1%Q@72x6!1oRaYxyu=^fQ_=8y++;r5>a&0+dxBziz z^u2aoaeTH};@Kwqm_iY*FiVDz3(^CvNC&9>cNpt;_<^a)x_3QIh~G_IuCXtEOPuHj zh@>N~6n<;vFH7xnaEIepPvr0PUl1L!eV&~(tjDpB_>wLTzB?c`TRm-GYiE@nfn}Cl zw}FA$+T*su4T%wz!i@E~wtFg<(7G#j-3ar`FL9Az>Nww}-}iBF(#EKWF}N2lbzhw+ zWcr;IN}3@B!bsJYS#oSFS*G2V0h65HE0snQWcKto)+X!J(Z^B%V~ljgrm|zKr|~s7 zoN=7?-0N8B0FOK4b9YyYi3g~@b!{xLzCb#AE8!WKf>L8Sylv-*>@H4fx6vwqE~=RoUu)RX}wTS z;zr8D1y60(mU)AV^U64ql{Tz>v**~KHpg2)Z+leFOS7t|@@!x&#hva#2p1W&TW0gH zwhhO<>edIAZ#KUuShnl{Yt874i&|^}S)0}ctP4OZdUvo4Td)I8EVDPE9!6{f9ZCCc zD($G`$HM2)y~SLaqkIbh>+!?-1uswLBK=oBoMPeQzpN=o{{V-J^znrdD=>ZJo1~-0fg3u>(J!0{(mVU(WJ8 zS0~HxeAgu>B_w=xFDp$W)wNmB(3hGKBgrRvJnxKWa&E7f{QKs9f6CN+v@|Ki@s)g} zDMeXL$W0YXtW_o^SbiW{k>mDVdba>L^(GvcEd#nX9}+ z=}4jDMey^D4oN+ByS`QX)2rq=PCAaWkEB?+71a@;lD1c)Z^@3Y=4k2Af;SRISq}I% zG_YNMucURtZP^E7mLVuK@SYR;OR?>8Tei$!jPlps7n?l8#np0)!BQGJHsm9d!JW-S zuS*n;iB64;OyyKJrme2el6?JB=9-j>XW?7Kg{JUnsw%#)ryr8C)78_#sgG}lTNaI1 zt7)B;!*fo^t*NJ(a@Kx_s?^@Lx3zB;8-7UPWPL2jvle2&$gH=EF<^ydmRJMLnYCqr7FlJ07FlJ07FlJ0EL*bc z*H;Q(4k**dshsJ80B~O(^RfJx(`|3iX2O)2V|+=sIA{p27X!}}JWLX+CF*=IjPku<3qw!ZIPy|>1x z((b9| zJ-13;Nu+Ze3QKgzyR>k8y+4UD)iZm?vlcTbYGFGZ5`1-L-Lxs&u-^i)XA?Mf&iiKj z6?6D#Td%_TQ^;#&*+}V|#&X1ry-BH7qMO~G5+>rRu-XsmyS0_^!5PnQWz;K6#zduZ z@-XS?bf=n0+bnJ5&N`cPv?w>1E|?tE4?7%_j=^}%p>D&Ta&}8|dB_{-@N~+Nc;t7o zbo?)!1b!s(r>hI@#)32oy8t>{k5g?88|Rj3oU!=cU)?`#yjXf&oy{${_BgTDwKYTJ z?Wo?Wc?X!`4lXL{IUt>xw^k&Jh%N0*B{k%`o<6TzZF7}<_c4*3&9P;dPgzEi%x%w` zIjqy&dd~c0E@}u`S%%pc7B2q)4IWj_H@+E7v$$78OXSK$GPm;CmQ}M+k$A^IL}Mf)`p}Ei5Ee+#_N${ z!txbTProLtvdg8^v=&)qv51V=bz=jxTe8735u%{!>Pht{w)G#qZqWDa$hNMetmhYk z@-V`Yj?is8V)CTt;cbn@NnmeJNhs-|{{To{1wBkl+&(h)_p;w&oMz-WHqo^7wS}DE zUKZSOj1h@brbs=Yj9%_cK>qp+`iou~A9UCmjN?ltCvk$}wEYG)~%C zqM9^_(=Uxm2aPyFBG(*}sBaCmb=w=?;%n<>k^?(;B%_v6FaR$ckuI#`B)^Hd8dqVZ z1=o7cdG%N2%4Hvf^dMsN;Vb>Su2jc?On#n|1;4z2jBVGHA?XbnU(8IK0UTC`@}v`6kp2 zl?wj=&JTE7jFAh(jM|dpu_e73>3Oy!$4jEkBu;uMv|?dxCVlrN!#jFd20}J{(|Tyx zfc;i{%j2@enYCuYrIR`xe2c%=GZSlPOry!jA+$~=KKj$RJUj`{>EBo&W8yoGtg03dtMPSG2P}UEl@Ga%w z3oAUGrzh#XB}1_brG21d7haaGo}yD4F$}#!t0Bj+z(1PoH+0*J7Sv22P{Er9^F30j z!l)l*#BHCdoyrF<$f}0B2?xkc_xTY5NK(#$aCHS zVNrpN?nU{!Y1)#c0V1xoasGBAvc5YGK?HVQO})fL-M{AYO9ygfJ9WO~Y#A4(;`mv) zVXc}X2xIKFvTKs(Dabu51VPkw_S>W6Qf2%?6|R+CNUTs;cZJt&F^xpy_U)_+Qc+oF zce>pe8_cx{3iaOjQF4!+5xK|P`$spYtB~%;KM(JmvHMB0Zbcg-E{`W_p0+uTE=e79 z>~EjOuZTl*yXHKOmYi@rk*t_Ie!J9?{u^NS5!;*Ag&jb=7{~>!gCgVUMJA;T*pu-N z=c&1+r11uIHhrh|ZiM`#u|Aao$oaYRf|(x+B^}5VhglJaw^z37>OF@SW~Nr2m1ZMI zJ7D!5+pEwE&BtkKO`=g#E}c2r;=s+88)>i$Em>_g11AE}ax87d=GXx`y4wd9hg)pA zkb&AP2ho)(IfRAE1=McMIq_px$6m{$7ZsY4(rz<-6bl-KQLwb~VW;u@NpF81!?MdP z+HH`s%PiUfWtLgA1&rPtUa(E9TU-E=+b!gGO}6Q60V?5X)7o=t)NPc*gG(LKT7a7mV5@j>`tU%rzA&Hll+!BFC^%(-;;3Z&s6GJ7X8ZKwv7l>uVP& zlob0e9@{c8+BWRPh!6`c4EBq5vQSz!?HhRjvdb*U363wD$*G#FQS7^Xg-C`zpdQQR z8DwHfIkg34vv7oWJRCl)>J-%<3HkEL%au?8!1S?dq>msQgIn~?DeLjQYSd_{)Hqj(=Z~PD z;`P*Sy2(2dN*h~`PR|dM1iKuPZHsT+Vlj)=Fbz6nTii$|i}WOqsUiTtu| zItrOaRSCGIhIm^NCZ9{YQOWo{$nk-(#nF;^CT&b}d}|rt^ffirN*w8 zZljSALL-F+G4Er0rJH)Qcau8qonPs_zI+|dI%TV(XxX*Dhmt)nhE&HRq3mOJxO$OK zT7;dOx_vQv=AaQ*xn7NiA8qNSp39ZaU{A6HuGaBHX3S(bYCB$ddE=&H*Y=Lr zsMc9kGR<*ZzS$Zs2@$?Y$zT;$xz=$C%HodXo{5Zw$AkITkN% zqp2*B;@#+_ttP^fLtAzX4yP9F34phZ-b)M89j$j4K@nyxG?+J^8`*CRGL7QV*w`e^ zjo$6F_yn>St$1Fy9#wZI7l*2a4|+vgmtsLJu=}KuD#$Q*_1fX8oBAw(uonbXA2(N} z8@fA1(&gourJ6+5_-&_1+#FfG7~QK?{k)#OgZj#w{GJc-V)@=`@_!xY1fh?Rl5tN< zP%1nK{4*Uxbki_&Y_6S4wl-sZ4n9C=sm?#>@c#hd7a@>fX*a)21+k5>ahl3&p}_wD zX1-Xb=ID8PI3(j{rCFE4pdu)0gvwQgKsw6|F&h=@bZS26I5&l9SCr=#k~+a#1s9D3 zl+^F2F<91En*qCbzgwtU%9gdcm`BqzZ6xVW65N+5XBh1H^TXia@}GBHKPk)Aaw%EM z@$Fqql-!JT6$=7aA^;b~Z3V#tW1y~kZ>8m)3X{s5H7^xQB(p_Mr4gkOE8w#+&xDKG z*xx-bpfviMOc(us?X|fMI!bG{Q?8|3ackn`g_VvYovYsn^Yi`RaZgX?IKF1NhnQzs zs|%Qkj}0SYpG;|_ej(YlbiLB~7mS0G;kg8;sxomLYH^T8!X=7G6*T5u5veSC>~Fc8 zi$L#YNnW2;-L9nn0QcqoZ1dDVcU(maa!{JSQl^8D6$XAPqHy#f=WMj7GzJboCwr5I z@+CJ9Q%qNz^9@xsE_@0qs7gXvnlJU6 z@18R*KSXkP4<^w0bAqek>8fj`hOSzf9%p!kOlEk*Wutf_i~<6Jrx_Oy5%+h*aeTx) z)U|w%CtFUB6)csrBYe6r!2m@ZdX5PhY@P4Dtw!IT@*Hn%?ZH-P=$6;v;!s$F%)To* z^T&R;&$wdVEov5O7L6APeFGL^)}df`r6bxEDlFzECgAoSR95d#hQhh#ef!Bs9BI~4noT^zP4q3Yyh&> zrMIY90cDvMWLN=ZtgXDSsIV}?^3fx(W>89k0qp?w8Tj6{3tHB|LE)yYK~y$0>IyY! z^v_&;EF#T9%!>!fiF+>(-Nti!o2a}n$h7(w9$_{8)_BGW4|hGkuGj?jUf`vcb|F-r zzpnaJJaWKwwiy1a$=2Gz=U3_W-)1^2oZT|Tp~8{4?7qz`o-9l11`qe|HDLmV3O3)f zrNc*6s(A<<*WCX5wBB{YYdbXceiB<-$#mMYITl{)q0^j(acQ+S*t1Q@i(q3Yf`^WZ zm7ZqZn36shGqFC)8Ov>Jt*nz8;|_?!My;J##n!5to{dhF1nkaT4x=D zYl+1+Wv;uztA!N&+Q}S~8QW33?PZqs#|N6{IX2tKTg|I#H5^(TUS12FO)+^yhoHWm zeit1SD@_8f21?}r0DktcFM2!(Zqc_fyl34d3f%&c9 zsrWS?ii-Ts4PJ)o+Ol6KC70|+i!o+w&H1NCqama&pYPmgWZq~uLT%9+PdE@i2KnD=B>9gL)B*^f z?MKK!NAswD-`TyN4pr8Ne}(huqNA+FlnTIaq+@?xw{A5Q<4C$XXrGH-N1?4?n`u&$ zNMYDG8TQ>u`uCxbD<+}v{{Xhqc@(d%F>-H=(g%tx5QdJl+phH zI+)L`jigJ}#$R-25B8Q0qs1NulX&pRx(AxaNb!rcM^z;2liTTUaw->BC&wj#J_6&G zpHL(mA6u6h7nUZ(`8Af=!*8(zN#Wo&{{S0f2YYfLVZFwr#&qD3>v~tua}IRUej`(d z^Q`ghg2YIq8^hpUpnQXiOs6K>X%@a~bXOi`ZHqBwfIQmHEWF8prM)dMZ6w?1h^NV5 zqqnWe;rMZcU9S;=Aq{f&dfPIgyCm$CRx|Kk%Z{G?Uz=@_6l~iR6BU#8{6XWc43+m|(*Wfc_{+=?hwPW#?!!nARzAyQh1 zV32;4a*`X_)2-MVM@)Zy@g*p!T@A232l_!6HJ(pPXwG8a&{wz|RRPtsG5Ua}!L`Xq*jpGt9MscL%gR zh4cVfkO7-|qgBZ^@Gi9FswL2;xVZ5@emak`-*C@Ayqw4nO9N)`z0e1xw8m`6(TdsH znj-ynv&x=erKO@?KCR-Xba~lkl0dP^;>_{@2^h-i!S)N!CoBm{M2Ft@cJ00^N8+{_ zH5*cvJDl3BWT=`+WqBQ%Y7Q|eUKZzg=|7{vO|6)T6TpgO@nh9p-Ew5qx_hgP0lscl zG}`8nd5?_-RS|+eosK2PBH^iPVyyb^jOc;k@Ij?Wqf&^9u<3ni6ljVTHhD3*&Px-Dn!(9(ZB+;j z0zx5*Ozk&)n7G^B0DwN5z@eg6$fk?v&*nES7qL})HW(jZ?6o9b1*X6+c(rm+056}- z$nk^#?R^fnUbcyAG-@Pb#AU3Er9_lpEa!2ukpA21R3i#>6z>exle(oe8ndsqLdPA^ z9ATX7bEg-GIQnS2EuZN8oeh379VnG#Ur41;ttYiH)3-NCndvB%HKiw#)Ks$2G6}gz z(qgK{Hm4|~KOIe+T#Z(-f?Jr403mg?HWMfEa@hyladMFH{Jg0=JdG-;r+A5J$i}uu z49c=9$)uqCDOICv_mtw{nw^lkt$!a3GboNonyyAk6U1j`jLjs5GU2qaACgbQ1Hr#i z+f)=Xh36p5L3~y4BOV^FcO@}`+v&*O)lE+&LlCQKsH>>-gDV6Pv?xwBj`8s_di2IG z64TQ(k22KI4MLrQ{MnBZ#o`S27-TnyNzby%+Nuw!zN@CGil(FG(j6$l^aW5FcM5hz z>dn40WJTD9q4mg5`ug6eWk~7+INPP>qq`y72MeEQ02{)c?y|5;&P%nmsW|Y_aJlU1 za0}0Eut%u87WEZ80YsTS&JRyOsYOW0+`1?Ns|1HN8?PBut#~Iz!{08Uf8=Hz&sj3);89Ol2D2!~%+XgzZwl`5`MJI*9Ae^N`Q?VHU zZ`gBk>i+;--9(_3BooxWlD(aqT(RW*FwIVwii7uS)y6)WAjm9dM*a;2@UE<5xlmym)zx}MBj za&nCd=0pJXQQLZpkD;kyDiW=+!8a9u6;n|^i5SQL4!G&?xP+vcm9y3CZ7gS_D^8V_ z?6PRWoyW5CB`d&i+j?JOk|P`lr?TmD9v+>~d$Rg;I+$tfb89WE9G<7?o-T$`-1oPZ z$~e56K<#T$y>&jL3t=e7jGlI%LA5V5hj|%S$h~iRj+#n`3V{4?hB4bF*K@X*$;C!1 zp4cpCN{W4Izlu8gn}Jp0ImQk2VB;DTEw3$$rz*CrH(zD+)2XV;<5kJN+rF%=N2ls* zhmM+3>ix>^sN|g57bJrM(8XI#^~g5`bQ?6OVdZ+ar|1}z11HkJ3B{~!dO^L6IwBgn!35$mFfcE1Oe8>Vrzsw)l^NWDc4?#0 z5{}D8HQOoMCD{`Tj(HLxmc{G6o3B+!)g*VYElqnDC&vc9a+az$Rdpj9j+a`NM-Ix0 zN&}1wu@4&pFZ%CbqeTZnBR+=nsmsLW9M{!kmx&khk0TTIV2hN#pa{GQSdubEN%bbk zi12jn-Myuhvx8kOrfM)4y>*AEy|g~`vuXJjMex# zBc^>W^m*8Ne%0wqjOxnopWP`h?8(ojvR3M~5?wQld#>cMjji+s+!FTih@QQ^mm=Y}9V{A@Wt=p^Ma|RkNw8-XEFFo06KN8W*pnk#SX(ZVZj3cG-?L_+M5kT6jlw7vYi8-+8-l zH%94aCN=0Lau%~V<_zUW6 z@cuTW%TY+zhM($e@Z2F^pnPfN*$Gt+C)U9p=yKAYGZa*X(EVTv=i?b)FE+wjk= zf_00*OMVJj;kT`t8`i;XenRl$&gRb!KZnz3#@`DBCcxVKh9gf~eiB;nem2Bs*1+2Q zgThM;No>cS+g=_!Y#zaQ5&GC5j9KA)ZTNZZur>#U9i9|+cwZYlI|E}8NUtj#X7%Cx zZ3yfQj65XAWr7qI{4;DJ^{_TD@RH97EtDtnkJ)S7AY`1_H3VVd1F5)}=~lrjwsJ6k zUT%5MyKqUIHhnEIxE!b{(hRDqfs>4H`Of#O0nl4>-agZ6*9BDsk%|9M%SyT=Ny_sGm7~#a=u}Y20reL%me-6N8jTH< z^1eulG%v8Z=x8UJb;6N?GHz}vmoKc3vih{?p^E?qvuh&q&9r(IC~uz+$fe2E7-kU- zn5Y|eT?vgsllYx`J4M~(Cx$sBVye;?Bp%UqDXCt%V&vdoRWh<)EV^rt-DGjkw<(;S zrHd_%P@Jrj#w(1zFwbe@A0^#(HA7DGw|h6!f+dA;0J1nzBmiE;&Zkl1O>NxVCh8}>uT7sEcVE-y5VH4TVEY8z)tb$i{(pGG|o#m*e|hHPLn3< zlh}POkJJ;Bt6nYb$3v4>r@GmETfsrK6OstMX>4>i*o%ya1lQkXK)LnB%(Sp5z>Het zhv{>|%Q>7vOtWMH1@-W`1frj_dtwOJ-2h&KU|YurPMc2ZuWMy4LySpOv}@lx-!b^Q zm{{Q(*8L8>BJgnCe`?lnMcN2kEajtsBC7X5ai49;^?IuBJU%8f;p)R*RW=bj^4w46ojw$AOk{6Oyd8LrJ_uZB`CVYNM0LL9Iyn^)TV-lNZ znUx+U!w;he^qz^Dzc7uRQ#ioRlC7%@j0h`j`6MyZ zxuT%(Wu_B}9t@^&DKY9NLXn_%ork@*OKCGHdUZ-%SpNVcg~ruPkD?$Qo3Jq7^WQ0<@`J=}WJ^3* z_lMy~$=Bi(AGXtnCe&%AR9ttqnmI{RQYZ1$FvDSoLPw?cWuk+Tf+wg>EAU>pnP@;rMNE}1#E_amFsDzb3Qc{%vst@QY#_+Jrx!Wm8oH)o5f zG04hJGwWm%T~19j-F9-B*49O==HgiqkG`kvy^XpXz7ELE%eDqVwWjo~*<&fU5zZ=c z#Fla>$AuferuIiN&bjIBwz&ZOev5&jZxbqUj?Y`IyZwoGTc=+L<{jX^)$bJk-2VV7 zdwh~6Ygd6MV|P!+-mO;F7a1D56Xm>T_kVTyNq*FOame$Fj#loUj@P@6f5d3x{#LyF z1+=nF(_SA9Jo~TgH5&dJfo<5Jvrta{4?kX!b(Ig2UF!GFD7g z!Y71-`5=*e-ZB#+>|1!;XoE|+h%OC zJR^9e9uQl#Ww+2{wPlwj1*2}mY)nLLYXt0Zj9~mh?6+lrLi}|DWBN27YW1`@`X%W{ zMt!vK{{Y;%?63$vN{c_%RDWeWL;nC)<)o#ir*P54k)Py%J-alRK`32|0HXU1;LFDErj{s*A7nZ5}<#opBst6l^vg%XtkRmd!im z@CU8uP+s4F_S?bD#Z?rK2jTn6B1i|WjQ4$qHjblWwGP4bV^AlvyVvNnwX|;;WT}cw zXITfPJ$AZMakU;20(;FvQB5Ns?UUp2eWM$DZpeb6=q9Bw)5cmaguP`{n@`m44MmF< z_u}sEP@LfI?m>&Ywzykxx1hycic4^JiaW&%6zIwSdCvLxuJ^;8WMx(+b7#%U?Adee z--S*qNz~NllZ)oDzTt~iQCFr$KBCMz*VNEz^PNLB9dGqRjA~zXIp%2N?vG+{Ld9rU z7Og(zytx|@m6OVF1nvhC6LRxBX4f}eE&SY+L{jxRYQ$4^NE5dF17lmm+p$Rja)U zTKiM}!?#(*ZSPXF`IqfMU=~XRM})Qv4n4j%J`i;oZqq2+4emOj7|A5vEIif2Y+s*y zIp-lz4?>;My!^JNYLhkn1<#W`TD=LUxu0wG*X$ZOPQNZ{ z`Fz3t_~_zUe#p5+2q6=Gb?gTfKP`|44K0b(ibtGQ8=55=?$<-`PkSCHcSC&|Z_5mO-7%*aexCE7qdj*To=p4NL+y)X`4ez2qj+9~(MrhF7wmkN>ca|&3d z12y~%{mc{KogpfU{^)`&K~jkz`_|r`=j!6^#%o}0Wx4xmV9Q%|;0qZh`rht!#7uHmK<_BHpL05TWB+S3>s6pvcPFda!gix{XQTv*lG z4$=Bw?9;S7`%;%Rw`<;pHbS4LdkI~Y2yRrqzbO!^)OhvAPZNXtr=G+sS>FSNkdMe2 zn=#Pk_(w;C(CvQOF4%+noG;|$45VV1-pP~f{@4LaZXWg=|^yjBGGG{!_YTCoy zB7KXY@sGgD-4w!v@R^9}{H>;*g_8Y>n{NOT1hR-Lr5VI1VCo1s)ebo7(aRt7*BqD1 zx(n)}HDW^kDsre=(@H|Uk+BHddRI*A|;^t`M&(7S4 zxaha|qk4b|H(6G7PO$C0gPss&dAP>T=hs9%K77J%nnc`cRds@J>OaXz=V4l6=W_Ii zwgGWY&N7Y%ej9va%MZ)@(nd3AW9mY2B3jN`H@!7}<`9_SidEgdRB2pf9@24^SIf(yh4Bj`g4}jKCm4 zS%1wUURd=T!m1zS7-G>a)a0!z5LVLev7e=W^H$X}T z1&*gi%gcWBtVfnHik!_5F7U2z;I8}twEFz;(j){-Bi>->_|ZWRVHx1~_|OmzhN{YP z=s z-yGfKkCxW&A0{|WgIOW~$KFf##@Q+=W<2~~oNIdog-K1^df1Nf_&1E6TtMDM`GRS9 zREHxglY6H}8j56H?8Va`){GMd=ZiJ+fMdqWk>KrXtG}#7vm6kHu4$ocMj1Afk6-iL z9klHIVuz(0q8<>D$VragYzjnw^qeL@MC6GKYl^Ygj~YE6pnCY&vayvajj6uQ@ZLE$ zUIh`+c@?>r*b+?%UTHRtepTS9t2HQSV60|wiv4ud_uS|5gfV!0_w^=rlOBt{>2Yd5 z@x7t^9}L~MSG^w1{eGpFptatxlEorTh*qG@qPnV_(g4TJ>zK>v16Go*`Nrb!`D5@Q z=(}vnsHpU?C*U@j$O9@ajQX-kdC~stXHYfA;vh9L9qNj+sC05BzXQv7AnNB0I#WG7 zJG5t{c2}F58&>3MF;-?%@}(Tqv^DLC!j)>%>C{sBQJz_X zLH)%Yqfh0p(72j!fd+oL7~2{4Rq0222W5oIi|?P`c!6-@%5y(`;bnxZ@TurH!m#cCFjNrlO#2$5ZVmdcl>D9p~I&113; zAYcgH=AibbNW|mV+O+ilxofRg6ipTS>(wQzB41xV8^9T@`2FkUVsFciqs4C7uj)#0 zrMj}vxboPdcCo!H5dgkO4PRORGyT!i7F!sQO#T^}h8HzLQzhm$f{=pCo;>^4%S&{A z3P%&S_Lml{aOE$uTXp_yf<9Lgwm(4Ru;Ct9%pdcXN<1~X?BZ|R#nFFjiD+G`s@$GJ zO%H_Vm|VBxo4}Zon9X{0$y9e9>;kbjVIZvNY(Ct>=>c(^@|w%ob+;sd+I6wYI|-gI z9yfNnjU=iq*xD>GV=5BzzyYnPqm}*;Oa!0ag53LFxWkq#1Tx)WU3=;5)`?EGtU%}M zFkn1nWbrw<=CLoDIYoPQbb*b_6Kgd#4oGEWXkPCQM34>-8^D0-;Auy-H!%&fxdnkD z5`@J6U@%nxjENI7&Vj6S@F0EbdQ_-I&Hv9e83GM@te|DaO%zZSYzRU4pQ)=`%z#TX ztR+XBKRYd7<%7|uX0)HhcGf#@>n#119ExVB{aL1u7VP?ILSSeLz6d+v5&Q&xZUqt; zt;||>X*60|7U|y?Bu0>sJG13kJE$_1qSNJXQs2L$4;>~98QTnb;`Dy)dS5y!`n&xB zI_(DT(3J^7sEYEe9Dy11y%lYB&po5WBj3?yH2fWp6w5!b`*9@~!jT2KD7ZSJ>Gw?c zU&i=KwOE6eT^D^(Ww(ypEGzPj`!M(dg6?fj(Ct+=o%+;$UEv4OOW&&h^3#yok`bW1 zraQ41#m%UsJ1!KDahwoY#_O9((tSllUkQEkopFb}`Xrh}rY#^O($2{iymk$ZFQqg_ zt-0PzK_r0+0(KyV6kZryvfkVGsWIz#Y71jTByj&<=TEun*toxZqD2Ik^U@}w6g#Pz zhDn>%JCYyFaU_oc+sEY3sgAn2l*I({7URNU;vxtDE+ zsXdom-P2K|$4biuB!J#O*5%P%Jpkj$CfcR}L9RPz491@>HJYLnG9tW#9$Zo1HoGR2 z_3_@ktTVByaK}K5xc1My+FC@KdX#k$G|m#Ke>uwvbOtCHF!ocsztoM3ZMdHJ@%W@v zu^AhTQ#g!!O|!Bq`m}1q$}Tk`E+?=c4#w&+a5;fQSy5#tQIn=Xs0n})*?uz?+|r_@ zU!GVWORPmp9-PI#xttrcRVdi!3+Mv>!3d%&*{SepNS#vbJ4LroISG7zYOo1&e^M=& zvPDaGq`5AQmmAM^D--FWQR-mW;U>)ntk$E926!EiIE_p9Yj^iCXcO!5VnJtXXleUt zs*_g2hOH=QG=dVcT*^*Hj?eIr`}BjV{xn`n#Vv@aTVud1TvM>$LbaN6TpY+xzwX%j z5q7FQHloE%8u1;X_Zh9taO(S?_zYHbwhxmZIJ_GnfpEaclJX!hn|M+w5+#4f#X^q7 zHDf?K%NufjK2;MLgnNf zIG(q&*;0ezr;W=98JEz@L(|!MxZ95jH3#*|MUAWEhh^2+-c^C0T^h``4LHRDun~bE zRu&R-Yx1Q};>P2;qbnNouLqi%I?_FVP|E4B(9S%^&0J4CBbnhse?_FOaxNc1IB0c1 z0mkJE8wvTeuK8j)se^x{`Q>(Y!p*O$^1xCSb+EK1xBpZDw=J}2a?F} zUQk8kcpY%O;>PujkSsF#If2<^gY?VD%BLGh*u`p?GljriJi1 z`d5w5v=5sJ2EX_?xN7vMWc0X|LGb=md89Rv*%t0{Nxn2NWYaS4U@s**p8=JZx}mHx z9e7xwS4t(7%*IsgqaWwmt=L((h`3T^LR>urD? z10ZnfH2lHQZT>D2jZX zQ?cs$Ohntg9p+DPdcx^n{vJKG)*(lrHyz^6=4NLte3kXZA2m(mY2^|4cQ_uC^>VU6rMnQG~ zGn|30?cp&GPc2C1tak{|r5ez#ciYGhh&ME8ZE{k1#AVFT;CLcA1PlSFQ;>;zn?hsb zShKhnp@|N4&65}{5z7U|n%u2hA^jX~v(x!OmDc`4V*J`|<#IdWkN>aEryu%)QC7WS zF^oMAwpxL(+&il@9|fvPx2MyGwHQR{ltqab%{&hj(bEPHsktsVgJ35>t(^uO$XO<| zNqpbJo_;fq@J}RP^z`$pVw8sYaP6e!PZ1u)QB6Ynw~Ll-O7U;>nr4u)u<^ z_8TYl(7Rwb9q=#kVQOo;4eF81|9CYkm$?{nA#zBWj9!=+ySdxcfo@qVN$`I&Ii;Fi zTPFiHZSQudQ!9Lq*${F0wlh}SnRjn0H(}dP9LFPC6Y*PDw6sc(h&)Qz3#ab!y1!t! zgqKFb?FUv#l+(@_8QPfS1h(=+>1MXyl|mlZ`6%fH+w9Ia#%e9LK!^z6a%{^${EBdh za)vwB^C>OG8A#>Mo9?BtNsd-N$!V=|vCv{mifS9FFuvZQ#B#16#3ydPO8p){dsbu> z0IZWbLR0ok^1NR1Z1ZAdFV4M-!7`tUcc;YqDLkd-!76!COgmGv$kAU`$8 zONM(4^_gLOqa*uW>f+{rkB#1|zBOCrQ^o!6U_R>*fH~ur7*`y3_K89?lIFe1i?in( z-X8(Piv3W^ES>z5S=LlVH))kJAV1W38FfjuK(s zNsON%rd);21eXNSq3z8%KD47@reuKA9JLumOhE~nOto3n4-F@D$$N~s_lsC* zo79%}RSd_87)5<6r%j~a0OmNlt^s+f)1`jWnhH(a2cJer8+YBG-3WK;wm)M32+Au73C(=F}jSlC<*T(rN>xd5D_TwMBtWR#6mNmSq6> z(6lUPVsWGXTfa$N0o`Q3L2 zX;c5G$ShP}y|~Dq_=%HNgPY+u9zuqceZQy}UuE}_=AN!k8tZ1A0Sb@Kcvaq z5BmCEhx)iWDXT7QELdZ($V5#ii<3Cr)dNDG+|36NyS0sg)*ddaXTpiv1nK1k*QNw#nbpq{vay1j%{}38NpQ zXps+_sm)i}c5)8hL0q1q{hM&k*lYwoZ@5XPICCI(hdVX0TkLkSlYJU)vO%v9B2d5B zo~sIQgO&O~4)15mo)Ipcw}hIg*lvGNiAEVeBCKb5(q2+%1EX-YO7mw!@O1?zHhHGj zgiAfn&s*>mPF}b$rvot9I{9~ND1l)F7uH{v$?x)Ob9{Fr!`yPV+u?V4YGZ-n({z=` z+b$EDd>XPV$eacEQCO?U2>X`nCJfVgg>WD&@3^mp|29(5sn?gQfE%E%jV#`!%(>mJHX3?4zK{Nk26`F_y zY-wT0u3dEBa&^rCDo{^E*`*JT_Ue3=Q@#LN^B4Ti)b*69`=E4X$f@c-n25+%z1DbQ z1~k{uxWKl2_8_jr*L?EG1Jqom7u0PdjzrDRBBnTxB+8n|ghG8`&PtdP_xf8;MuKjp z@D}Abvu)R^7lt@;i}>Q^J*TD;_lA6M)HnO@y0cKA3iQ#%KY(Rp*G^Uh>SmaJZ*a3m z7JqM)6TrH6AESpTbBBe~T9?P^hdr9GQ@GuVRM_O86fM#u&PjgT`_18~_+9r}`NC{1 z^n~RM@qc?D5wj835ns$%`&r)@OE^b9CG*<%E61Xk`^B`Mzx%(jg_DI%V$z{YVvN3{ z=L>xvd0|sz!B_H`duf{uwwTMOTo3y8mw;|LL6ilKoE!5r$nr1#y9N8axKz;aiN$21 zA{Szi1^N8z=p)NB6hjXE%sqM+7kn@$LFEhPh2hQK1GI@<=f>vCXd?NKBk=~?#Q$kA zxmceJP5cb)sQ-W8dq;(K_{nK4iTXJ+Sn-bk!tgojfBO5=lB1u*xj%dc9SFY9jbB0G z`|#CN%^2bTZJ)`Ez3=0Ei`}a2LCAs=6EQ7&`3GY$L(KhbTK53`Db^=Lx}hg%ig)Cz z&9+fNy3jHBw}hUE#r`*P_WwrC8Zc>E`rmCf63ps{-;>K^!F?8yYyJlV|2|wVb=A>h z=7(9ljga+$I60+vXT9BeG-4Z)U2z-OhE{UDvt~AJiPrGAqxnId8A~aEuk*9h% zx(lE*dbFR5+lrW0wLxF0i34Dp-wSnia-5+Y6ZSU~0SFvA==ZBj%k<2z=kxQ4O$W$c zCL&yk3%+=eCVyS<4XgUn$ElIlGsgdEXt&Hy;LONu>_>>9WV#N-Ja7*dJy@_vQEF71 zj^nd5=TztmpfZGax6$LK4;f=dF*KVNZYosILs=F#)W(Q< z`CzHtF(kR`i6*ue66Vyn?Nm?AGlW5*MV-cg3*2bjz^C1CkKug}Osd@T0em$s&T4*! zRWy&51XvbgsA%48b`T#L1reH9!|r>Ck|`9J_vp9O%i1~EGct%t+Uwi@QW|NLy&ln_ zY<+WPB?Dvw1ko*#M3DkVsivQPjj)2PRiF$ff?S7523#NaUDWM2zWnNY8!kB%1GAL2MMQ&{DwpH zCY1CV*YIoLvL! zf3PA*(<8WFw0%qQGc1`#t_{rzf-m%szbA3P?Tp;*_{)--R-AevSw1%2lPF?~e7=At zLHJ};LU`_50T96@7N;?32E6c@Ju>CnNB(7gf?2<3LH0-J;loSThsL9btRyV;FsAI8 z5qcX#(?dI&hZ67o{lBSQ7M*}Tep$T!CF{;BWFruT zH48C_BGTtXRdD$D__ZN4(ql`MV}`Zv()nQSMyCxRAnd@HyWDU@9*5|=;5WFvq~RM5 zXFI|gwzxQOi1oYRJK4xI;GN@+EG`KwH!qL*@R)#A zcp#>%ZTftT%uE?!U?i;fb)!R(ia#-GPZdv~O>qB|aW54>kE!ZlMT7?c)aw-C$`xoocdpjKk=ya!>5> zCaQf=8C6mFYbq9&t2sA6bka-nb(DlmU{U?cQe1v}hnNODMU5RMnDDL3Pa!8q5L=25 zwg+U%he@Qzt;UUmS_u&M9ux-79CsB#6C=awvW=Es=KZ$Q^bMx(-OuiqRo3gEx+P`N zxpzy&_8vIbh29aqKN%Kmb_?qGikNhZGXZK&v9SkKY?DmqK<<^pitJB2y;wr_qc(nC zP=xis{Y5tt-GNX4Hw1NIH`0XU1w74fiLIIrhZW*~M^oQ6)L*T~)+40?&R)(k%Ld|` z>@`3>(i>Lx3Hq)l-?I#2s@B8bS6GduWCKfvh+drK&E#j9z-oLj9-|u_e_eRoqs)i0Eb(Xk;1i@L%ZtnQ{c0DY(=(i(dET64j~7h)48Q)t z&?X2w9|U+x#}0Sb@;G7L*c+-lUpOkTc@f&qZ;37m8wHu!F1&yYoMuc4;R+!zo3( zsI)&_(40_lPGG1Bt!ZBNQwBfv=|ynY#5?s(yluW(4(*vIYgcFZNXNA+{feY9bUO zqxHO9`)Y5jZ{XwVRD$Rpq!=o|Xlwm%UZk;$cfpZyZr)BpXR?nZ)Sk(BX&16i`5Vf= z&H`5QJLF&sl%+^LEMIME|QOvy0*pcXnB^+;1)`_6S5I9OjzAM%Xz zojDs8{mjdApS5{GU%nI_=bkN|!7mf%rh}k^@bL}kmI3w16{P^7pp^@fA)XnW2Y8Rm zw@@z*rvmGU;K+!}tubaAtMHIZf?>xq{;fO_iG((VlEjrx7*{#0;Z*wW&(CPQ(^XQX z>l-lSXt_{NkN{9%9f=2QEe|HECp0R3+fTbW8|?IL7S5s3uowkL1Ff!_?pIlf-V8hy zvxGYR^nCzra<^b^d%W)TPuk8iEzCY;pBF9XL)b75E>3WyL{4y4=v2kU)$S*H_>&Ah>c?hN=Ok6!2y_ryc|K*bje&eT~ zu<8s*USZkAMPefn{P@)?9L1mkMG-8;GfS_*ztB@6N^SMw#h=t4(lfID&+mCtN+sR_GO2ZuI|Pc3Yla@An--RwVYIgi29f85ZBCAS!4l$|vqd zNir#N{m)Y6wAZh|3eG9|=-p-(x{te-3Yqt3JK9&ho;AD7Hr}A%bTFo>It7Z&T$YCma&ha2STK}mMOy;4_ z+ETZlZ>ty~oJxLA+Xr7S2I71L`_3wT3t+4&k*u#q08h-GRSMq{1qNyf@I+`wxzogn zgl7KWSoLsMgBi;6Cta4TAG_sh9VZ2oD^#&ZjTm*I+0Tozi0Mb?7o}8{Q;IY!`M5SB z?^VZ3)=K&$kG*Abb~SRP5R&cypq6_+3>b(4G!8ls*(%g zKUMX}9z2@O#}ET7CBNRysI7@-K)p!%-+z!>-)HI1HLM^JK>X~VJ*ln2{8py}Jr3Kj z;!|9n32rdR9#qc3R~0ZX2^(jY1k*)(73Gn$5A6vBOcDQ#GneD_fhM&nzy#91W8x|*FoF)KT7LG@J2Q$vRrD5M!8=P@xDh@ zMDNfz#s3yJLQv}@idx;f?26hG3fXZfKcAbg>f&aTvi)Jbl$xrD=vH@PkNs`%T%6%i zw(v&`INUhVX_}Jad^*_9&sYL*>q)0YB@+Eenk5#13-g;6R zHsu(K*VMc{@x+R#dZ6lgZ&3;_30q*>H?=n;#T-f^l!;gA4!fA_d{8vuC$d#b*0qcE z18kgF#~8o(t1@NjdI4A!Q90{;QY{@}L~4W6XMFv(k!3`3)Z@jK@lX9D82n_;)Dyia zT>Jz${%G5MDy6@2HoMHuFs_BS{A$G+DFzDc+MoKMAm?Z%_~F%RWJa2KiO;RF{uu(V zvEdWbTKYRssdEjm@A=bz<<5p#2SDIQ;@@>li4Vjd@uneAebSy|E@V#(@~YwBvWV z+PIq9gR(VC_p>;%Hn}2f=FO=6u4Sj1rQgVWjb9h4f$^ZPS6t z6c!R{L@u9gd~v9+Zimof#q+j;P)1m9LIb>30W)z8Cb$rtrEWM>(8m4x!(y*tjS zmiD^7Ww|ljZQKjyK|@2phKxWtZdyyrln_st00Kt}uiW*{kU>nQiu!F$B{+a7Kh?#ghJzMTaq7GmVKMzN~$^Jo47`)WYmR--SK!5qE1puR9es` z>o9)}(up&Z*c$!e<;Qujl#&zmo?4-0)FV#!h>QSmLv1=eXWYAXF1ODLn8pzTm6dt! zW$X`PfS|U-=QVu!S(!Ql{UR)f=uh%Bjn<(|y8Qmxdlf&z5)bVyOY;-Tn9M;?%sWht z3zjA^1ZzMNN5aI(8Mq;4qpp8SywV9$<5_EVs$K8;dQz1uHp6 z)3+@ltfewn9*_Q67d%M?p96QjDpIYXQd0;1<*~8d=)%TxZxn}E;di>1EsK?gS}dRy z!i()@$-?DF>Sg5W>s*zZ>bqN2%5$gHqgBoSxoIgP6=9h;&x|UIm*0<{T4#&Dl+lCc zj+}j54KlJYtD&m)(8Bd)UYZelOZ_x!S~XQ=@hv_++Y*VfX2hm9;uOgX4LV-dNBX;- zrGSD1HIBqfA%U%F37J+hShIkU6i zy6Wk=OUpjm>d-*`-g!SstpYvu8zC8o`=fpe+VIhd3Q&h;h+UlEOBeeh%5&}W z6{=|mWNW2r6uQUR5t%IXgiN^x92kulF+%}i~@ZvE{7x*nIaDWG_Q%j(L(ehg=6ir6DeBl&+d3zG|w19zE52C1Q@nYq*o z#LtvPmCsdt71$cev_x)At#CETI^(EyaE>WWasFM~Royj9xb>Q>hC|gu%ELUdd3tFw zPgUG;-^eAsXAC1S>Dzv-@tu(swtyIC1^cIOWWPPSulaRpo&-aN_k3DFaVv0j95N z^bL9J_32F$HK*y35EK3Padg8$D%qnVG1CE=3m z(UKQIUxEP)$%c_g`;>eJ_>gKaV>zx6^0fOlej|K~ ziKT)$b|3i|&j_44FOTY%1x>kJq|}$-h?giK?2mNG4UIWpeWB?74j^M?wLM|KqQ-o& zbp0@bN-ehh?L*=^k0*_2lho4WX2V7fvSesGdMGfB6Cbq+9=0dbXmmGghZ%Z zvQHx`oxM!@&jQu>9(q&Ub4wC5tn~44e8qUnGP66R{F*H*dm=5O2->KkcKI3cWqu0C z0dTmQc0MxB46X2<%~!?-}SQViu>?l@yKbY4Nk<2y6dQ6ksyt4}dP?fz^ zbqw)CSy@$eNv+SYcswO2-@uEx+5iZ^hUuxG7e_r?kkKYlvQ4K!XC`c}OT-`_kMEO@ z|GU*{g`q4OoQ=u1Y4v*u{S&RGLc=2dwG~KjNsGHG3o%61y!+W@>K}}LzkIsKlGdFn zT0+w}v7EB7q}7eIw7e-3fpDRQ=&~cJ2hu0aoYYk8gg0E=ApHD%+y%%F@rj#;geiWV zZxhin$^-rTAQMh|iJ#OX&r#*^3EW%avDIzmEO18N+3oKNwZIa<{tc|XFWIj-jc=kS zOLV?kj&5}Fe>wAh8?|Mf3dH=#@Kcd217$8vEH=nnEiYNW%;Gq3 zjO#*-oP-Om^p2I)HV!+xlPd`Y{C(EPNmnI!=1W-%)>#6!L~^C9%UHKQW7weTjL*TNZg#cWm@%_^yMTaY;^U ztcPc=#aP4DwMt{ImR2N~Uh9@Xuirfbn?Fi_gAiU1$tCe{w+2+4R|GDttYF?-(29Ef zl6WOgOhg+#*P|iZPqKHXKBJ*I$THoC8<|wTZv-C4UQ|Y7+UdsRvKI}z8@j$*Sk`vq zT~gH7SF40pkWTS%E({Hg5=+ldt}W_s#YNKGub;Vn)~f>7IPsq1k>8vLP!g^t9pEIPq*5r8=h$r*?eVl!5^M9~ET%^uE`R-s6_q)@Bg~9EfkmRlsjJDkGz;(fq)hq8YGxLlNVG%-0A1Q3(=3xWpol;os3eB;tZJKCY?N!b>G& zduY$}Zh8oj|EXH}B}XSMe&S3Rdr~jX=CJ&>#hO)>fY=S$PT(x-j3VTxj1&v_jLKIr zor>$A8Xo?h57tJUi&`6?%t~v_vrflzDp;MWRjY-aA;wH2XY960=`* z=CgiMQHQ##Q9UO-5kQjyu&~sj!o4}$I!>W~m#Gt<;MUNcpIrJX!qX=NgBygWwO1{A z7M-;^c0OB=LL$FvAf^FMi3p{wDNHGe_Er%qI#EiFv5m(nu8gpc#yfC=)*`O+tpec! zLiAIoJQDGk7c`ewcvTa0P_!y;k|Zc&j4g`GvC`6w6-K6y0Y7_dj1SQxjN*192yGYr zcCh;(M)AgYq5@TWmYmVBtivhw85Y~LuiEB^Kt_R)zbtUu1fOpQTKee^mF;TNwsN9@-bJ1oN$2A1$WoQ zgf(!b*XRKwz5k+-g-D`4d#9Cv=DLJ<-4)het3o&&v2MM^VN(j8$?q*j5!=EQO|-mT zg4#<48p8%YFB(?C^PWh!AJ*Xwr=DkG*0&9$wzY9NHs{|`^dD*T_tLLPZ5M<$vzvFg zn1FU?-+t9QVwS&H*$-E8c|3Mm{E-=cMs&KgmGC`rBBnee+2mdthJz9tlB=J6Muc*X z6sc995kwyUlgbz^P3LjL=#K|^U}=@UoAqgjH5)ia#j7c;nuBbMChf%&w|EcJUUfYZh5zwrVh8rfQn`&Fb1bkdO5u zSG$J9pGOJku`*iY7bba4REXIvFUOPnDC6CQQ59-cBrw2LD3i`L3?uS(@z-Z+-$`Z$4&Q17}iogB&Vb7N_z}~*_;i!7W4c`<4=#% zm@ZW1dDdTsb&-CFTReKahrF2cXnMU_zG(LUCW1FcHbBGTA}M6(t19h(h(R23=2@yeEAwQm2C#h}fX#&3hih)uuj+&_00VW^R= z#^$J!dJrFjRWa@M%f}wZZd9)<`Q`Uk?;giCv+&~Wf`_RZRG)ftYmnZDB|nl_9pWf+ zlfSTzS<{?nqj76F(1m)jf?{Lj5z#G<+iaDDZnFrM$V{{XpQ%FaENDZbQ}8SVm36%V zjRneIkMMA%NJiAV2+ROBkOIPZv3inDq-_O$UUb$A`j!d`%y_SP6d>xwyFa}zUx_Z# z{DY~_{FCr#*kbNb*tyNbum?uXFFZPEXFA_6Ipf8d)nhiICR@;#hTy8x3BjIwo(UQl zxIQ`USz0Cx2CU~x`h}^~*wz~d*w)tMX1v5~#Iy@*br0d85g@pqdo|_UMR^E_Mf?r$ zl+Q=Qc55ZJ2f&1UW{O>Jyp*;%+i_*bqeRX$+X&d<2 zEptC?*{xa z-ZCIixtFhv=s)}dF?5p-%tG=FSwG3wDF#US7h=`l*AHw3egzTG`?Rugvpvc%Ey^}l zPHWk2#10mnn^)zZ$SUS@0rDEzDku%=DUo(W*(UJRQ-b)X56en3(OE$xdM`u{H6z)2 z0cmj&I;`hTrh`sW_1jyk$fgK75n-~XT?Aeo-&Ob@w`VP`H+aKr#WTyX#`hUkAKDqf%9iGh)hqlfpnRby zkIx&fnx!bXUZ{2lCi(f5t1msEW>UCG8$s&Q_gYgO^SOb?Tgnex9 ztqCRN6N8Wlws;zQX2uQ)r=8dxrA53Z$vmW5!|nP;t0UrCJe05bDRV8* igGm0H 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∨BFt2Q2 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 z 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 akv(cI4xW+>psIq)glaTN!#MQ!(f, } +/// Accumulator for postcode-level POI metrics stored outside `feature_data`. +/// Only constructed when a request selects POI metric fields. +pub struct PoiAggregator { + pub mins: Box<[f32]>, + pub maxs: Box<[f32]>, + pub sums: Box<[f64]>, + pub counts: Box<[u32]>, +} + +impl PoiAggregator { + pub fn new(num_features: usize) -> Self { + Self { + mins: vec![f32::INFINITY; num_features].into_boxed_slice(), + maxs: vec![f32::NEG_INFINITY; num_features].into_boxed_slice(), + sums: vec![0.0f64; num_features].into_boxed_slice(), + counts: vec![0u32; num_features].into_boxed_slice(), + } + } + + #[inline] + pub fn add_row_selective( + &mut self, + poi_metrics: &PostcodePoiMetrics, + row: usize, + indices: &[usize], + ) { + let Some(metric_row) = poi_metrics.metric_row_for_property(row) else { + return; + }; + for &metric_idx in indices { + let raw = poi_metrics.raw_for_metric_row(metric_row, metric_idx); + if raw == NAN_U16 { + continue; + } + let value = poi_metrics.decode_raw(metric_idx, raw); + if value < self.mins[metric_idx] { + self.mins[metric_idx] = value; + } + if value > self.maxs[metric_idx] { + self.maxs[metric_idx] = value; + } + self.sums[metric_idx] += value as f64; + self.counts[metric_idx] += 1; + } + } + + pub fn merge(&mut self, other: &PoiAggregator) { + for i in 0..self.counts.len() { + if other.counts[i] == 0 { + continue; + } + if other.mins[i] < self.mins[i] { + self.mins[i] = other.mins[i]; + } + if other.maxs[i] > self.maxs[i] { + self.maxs[i] = other.maxs[i]; + } + self.sums[i] += other.sums[i]; + self.counts[i] += other.counts[i]; + } + } +} + /// Configuration for enum distribution tracking, passed to Aggregator::new. /// (feature_index, number_of_enum_values) pub type EnumDistConfig = Option<(usize, usize)>; diff --git a/server-rs/src/checkout_sessions.rs b/server-rs/src/checkout_sessions.rs new file mode 100644 index 0000000..081ded6 --- /dev/null +++ b/server-rs/src/checkout_sessions.rs @@ -0,0 +1,807 @@ +use std::sync::LazyLock; +use std::time::{SystemTime, UNIX_EPOCH}; + +use anyhow::{anyhow, Context}; +use serde_json::Value; +use tokio::sync::Mutex; +use tracing::warn; + +use crate::auth::PocketBaseUser; +use crate::pocketbase::get_superuser_token; +use crate::pocketbase_locks::acquire_pocketbase_lock; +use crate::routes::pricing::{count_licensed_users, price_for_count}; +use crate::state::AppState; + +pub const CHECKOUT_CURRENCY: &str = "gbp"; + +const CHECKOUT_SESSION_TTL_SECS: u64 = 31 * 60; +const CHECKOUT_PRODUCT_NAME: &str = "Perfect Postcodes Lifetime License"; +const CHECKOUT_COLLECTION: &str = "checkout_sessions"; +const CHECKOUT_PRICING_LOCK_NAME: &str = "checkout:pricing"; +const CHECKOUT_PRICING_LOCK_TTL_SECS: u64 = 5 * 60; +const REFERRAL_DISCOUNT_PERCENT: u64 = 30; + +static CHECKOUT_RESERVATION_LOCK: LazyLock> = LazyLock::new(|| Mutex::new(())); + +pub enum CheckoutStart { + Free, + Stripe { url: String }, +} + +pub enum CheckoutCompletion { + Grant(VerifiedCheckout), + AlreadyHandled, + Rejected(String), +} + +pub struct VerifiedCheckout { + pub reservation_id: String, + pub user_id: String, + pub paid_amount_pence: u64, + pub referral_invite_id: String, +} + +#[derive(Debug)] +struct PendingCheckout { + id: String, + user_id: String, + stripe_session_id: String, + checkout_url: String, + amount_pence: u64, + expected_total_pence: u64, + currency: String, + referral_invite_id: String, + status: String, +} + +pub fn now_unix_secs() -> u64 { + SystemTime::now() + .duration_since(UNIX_EPOCH) + .unwrap_or_default() + .as_secs() +} + +pub async fn start_license_checkout( + state: &AppState, + user: &PocketBaseUser, + success_url: &str, + cancel_url: &str, + discount_coupon_id: Option<&str>, + referral_invite_id: Option<&str>, +) -> anyhow::Result { + let _guard = CHECKOUT_RESERVATION_LOCK.lock().await; + let pricing_lock = acquire_pocketbase_lock( + state, + CHECKOUT_PRICING_LOCK_NAME, + CHECKOUT_PRICING_LOCK_TTL_SECS, + ) + .await?; + let result = start_license_checkout_locked( + state, + user, + success_url, + cancel_url, + discount_coupon_id, + referral_invite_id, + ) + .await; + if let Err(err) = pricing_lock.release().await { + warn!("Failed to release checkout pricing lock: {err}"); + } + result +} + +async fn start_license_checkout_locked( + state: &AppState, + user: &PocketBaseUser, + success_url: &str, + cancel_url: &str, + discount_coupon_id: Option<&str>, + referral_invite_id: Option<&str>, +) -> anyhow::Result { + let now = now_unix_secs(); + expire_stale_pending_checkouts(state, now).await?; + + if let Some(existing) = find_active_checkout_for_user( + state, + &user.id, + discount_coupon_id.unwrap_or_default(), + referral_invite_id.unwrap_or_default(), + now, + ) + .await? + { + if !existing.checkout_url.is_empty() { + return Ok(CheckoutStart::Stripe { + url: existing.checkout_url, + }); + } + if let Err(err) = mark_checkout_status(state, &existing.id, "failed").await { + warn!( + reservation_id = %existing.id, + "Failed to fail incomplete checkout reservation: {err}" + ); + } + } + + let licensed_count = count_licensed_users(state).await?; + let pending_count = count_active_pending_checkouts(state, now).await?; + let price_pence = price_for_count(licensed_count + pending_count); + + if price_pence == 0 { + grant_license(state, &user.id).await?; + return Ok(CheckoutStart::Free); + } + + let expires_at_unix = now + CHECKOUT_SESSION_TTL_SECS; + let expected_total_pence = expected_total_for_checkout(price_pence, discount_coupon_id); + let reservation_id = create_pending_checkout( + state, + PendingCheckoutInput { + user_id: &user.id, + amount_pence: price_pence, + expected_total_pence, + currency: CHECKOUT_CURRENCY, + discount_coupon_id: discount_coupon_id.unwrap_or_default(), + referral_invite_id: referral_invite_id.unwrap_or_default(), + expires_at_unix, + }, + ) + .await?; + + let stripe_result = create_stripe_session( + state, + user, + &reservation_id, + price_pence, + success_url, + cancel_url, + expires_at_unix, + discount_coupon_id, + ) + .await; + + let (stripe_session_id, url) = match stripe_result { + Ok(session) => session, + Err(err) => { + if let Err(mark_err) = mark_checkout_status(state, &reservation_id, "failed").await { + warn!( + reservation_id, + "Failed to mark checkout reservation failed: {mark_err}" + ); + } + return Err(err); + } + }; + + if let Err(err) = attach_stripe_session(state, &reservation_id, &stripe_session_id, &url).await + { + if let Err(mark_err) = mark_checkout_status(state, &reservation_id, "failed").await { + warn!( + reservation_id, + "Failed to mark checkout reservation failed: {mark_err}" + ); + } + return Err(err); + } + + Ok(CheckoutStart::Stripe { url }) +} + +pub async fn verify_checkout_completion( + state: &AppState, + session: &Value, +) -> anyhow::Result { + let session_id = match session["id"].as_str() { + Some(id) if is_safe_stripe_session_id(id) => id, + _ => { + return Ok(CheckoutCompletion::Rejected( + "missing or invalid session id".into(), + )) + } + }; + + let checkout = match find_checkout_by_stripe_session(state, session_id).await? { + Some(checkout) => checkout, + None => { + return Ok(CheckoutCompletion::Rejected( + "checkout session has no reservation".into(), + )) + } + }; + + if checkout.status == "completed" { + return Ok(CheckoutCompletion::AlreadyHandled); + } + if checkout.status != "pending" && checkout.status != "expired" { + return Ok(CheckoutCompletion::Rejected(format!( + "checkout reservation is {}", + checkout.status + ))); + } + if checkout.stripe_session_id != session_id { + mark_checkout_status(state, &checkout.id, "invalid").await?; + return Ok(CheckoutCompletion::Rejected( + "checkout reservation session id mismatch".into(), + )); + } + + let client_reference_id = session["client_reference_id"].as_str().unwrap_or_default(); + if client_reference_id != checkout.user_id { + mark_checkout_status(state, &checkout.id, "invalid").await?; + return Ok(CheckoutCompletion::Rejected( + "checkout client_reference_id mismatch".into(), + )); + } + + let payment_status = session["payment_status"].as_str().unwrap_or_default(); + if payment_status != "paid" { + return Ok(CheckoutCompletion::Rejected(format!( + "checkout payment_status is {payment_status}" + ))); + } + + let currency = session["currency"] + .as_str() + .unwrap_or_default() + .to_ascii_lowercase(); + if currency != checkout.currency { + mark_checkout_status(state, &checkout.id, "invalid").await?; + return Ok(CheckoutCompletion::Rejected( + "checkout currency mismatch".into(), + )); + } + + let amount_subtotal = match number_field(session, "amount_subtotal") { + Some(amount) => amount, + None => { + mark_checkout_status(state, &checkout.id, "invalid").await?; + return Ok(CheckoutCompletion::Rejected( + "checkout amount_subtotal missing".into(), + )); + } + }; + if amount_subtotal != checkout.amount_pence { + mark_checkout_status(state, &checkout.id, "invalid").await?; + return Ok(CheckoutCompletion::Rejected( + "checkout amount_subtotal mismatch".into(), + )); + } + + let amount_total = match number_field(session, "amount_total") { + Some(amount) => amount, + None => { + mark_checkout_status(state, &checkout.id, "invalid").await?; + return Ok(CheckoutCompletion::Rejected( + "checkout amount_total missing".into(), + )); + } + }; + if amount_total != checkout.expected_total_pence { + mark_checkout_status(state, &checkout.id, "invalid").await?; + return Ok(CheckoutCompletion::Rejected( + "checkout amount_total mismatch".into(), + )); + } + + Ok(CheckoutCompletion::Grant(VerifiedCheckout { + reservation_id: checkout.id, + user_id: checkout.user_id, + paid_amount_pence: amount_total, + referral_invite_id: checkout.referral_invite_id, + })) +} + +pub async fn mark_checkout_completed( + state: &AppState, + reservation_id: &str, + paid_amount_pence: u64, +) -> anyhow::Result<()> { + let token = get_superuser_token(state).await?; + let pb_url = state.pocketbase_url.trim_end_matches('/'); + let url = format!("{pb_url}/api/collections/{CHECKOUT_COLLECTION}/records/{reservation_id}"); + let resp = state + .http_client + .patch(&url) + .header("Authorization", format!("Bearer {token}")) + .json(&serde_json::json!({ + "status": "completed", + "paid_amount_pence": paid_amount_pence, + "completed_at_unix": now_unix_secs().to_string(), + })) + .send() + .await?; + + ensure_success(resp) + .await + .context("PocketBase checkout completion update failed") +} + +pub async fn grant_license(state: &AppState, user_id: &str) -> anyhow::Result<()> { + let token = get_superuser_token(state).await?; + + let pb_url = state.pocketbase_url.trim_end_matches('/'); + let url = format!("{pb_url}/api/collections/users/records/{user_id}"); + let resp = state + .http_client + .patch(&url) + .header("Authorization", format!("Bearer {token}")) + .json(&serde_json::json!({ "subscription": "licensed" })) + .send() + .await?; + + ensure_success(resp) + .await + .context("PocketBase license update failed")?; + + state.token_cache.invalidate_by_user_id(user_id); + Ok(()) +} + +pub async fn mark_referral_invite_used( + state: &AppState, + invite_id: &str, + user_id: &str, +) -> anyhow::Result<()> { + if invite_id.is_empty() { + return Ok(()); + } + if !is_safe_pocketbase_id(invite_id) || !is_safe_pocketbase_id(user_id) { + return Err(anyhow!("invalid PocketBase id")); + } + + let token = get_superuser_token(state).await?; + let pb_url = state.pocketbase_url.trim_end_matches('/'); + let existing_used_by = fetch_invite_used_by(state, pb_url, &token, invite_id).await?; + if existing_used_by == user_id { + return Ok(()); + } + if !existing_used_by.is_empty() { + return Err(anyhow!("referral invite already used by another account")); + } + + let url = format!("{pb_url}/api/collections/invites/records/{invite_id}"); + let resp = state + .http_client + .patch(&url) + .header("Authorization", format!("Bearer {token}")) + .json(&serde_json::json!({ + "used_by_id": user_id, + "used_at": now_unix_secs().to_string(), + })) + .send() + .await?; + + ensure_success(resp) + .await + .context("PocketBase invite usage update failed") +} + +async fn fetch_invite_used_by( + state: &AppState, + pb_url: &str, + token: &str, + invite_id: &str, +) -> anyhow::Result { + let url = format!("{pb_url}/api/collections/invites/records/{invite_id}"); + let resp = state + .http_client + .get(&url) + .header("Authorization", format!("Bearer {token}")) + .send() + .await?; + + ensure_success_ref(&resp).await?; + + let body: Value = resp.json().await?; + Ok(body["used_by_id"].as_str().unwrap_or_default().to_string()) +} + +pub async fn active_referral_checkout_user( + state: &AppState, + invite_id: &str, +) -> anyhow::Result> { + if !is_safe_pocketbase_id(invite_id) { + return Err(anyhow!("invalid PocketBase invite id")); + } + + let now = now_unix_secs(); + let token = get_superuser_token(state).await?; + let pb_url = state.pocketbase_url.trim_end_matches('/'); + let filter = format!( + "status=\"pending\" && expires_at_unix>={now} && referral_invite_id=\"{}\"", + invite_id + ); + let url = format!( + "{pb_url}/api/collections/{CHECKOUT_COLLECTION}/records?filter={}&perPage=1", + urlencoding::encode(&filter) + ); + let resp = state + .http_client + .get(&url) + .header("Authorization", format!("Bearer {token}")) + .send() + .await?; + + ensure_success_ref(&resp).await?; + + let body: Value = resp.json().await?; + Ok(body["items"] + .as_array() + .and_then(|items| items.first()) + .and_then(|item| item["user"].as_str()) + .map(str::to_string)) +} + +async fn count_active_pending_checkouts(state: &AppState, now: u64) -> anyhow::Result { + let token = get_superuser_token(state).await?; + let pb_url = state.pocketbase_url.trim_end_matches('/'); + let filter = format!("status=\"pending\" && expires_at_unix>={now}"); + let url = format!( + "{pb_url}/api/collections/{CHECKOUT_COLLECTION}/records?filter={}&perPage=1", + urlencoding::encode(&filter) + ); + let resp = state + .http_client + .get(&url) + .header("Authorization", format!("Bearer {token}")) + .send() + .await?; + + ensure_success_ref(&resp).await?; + + let body: Value = resp.json().await?; + Ok(body["totalItems"].as_u64().unwrap_or(0)) +} + +async fn find_active_checkout_for_user( + state: &AppState, + user_id: &str, + discount_coupon_id: &str, + referral_invite_id: &str, + now: u64, +) -> anyhow::Result> { + if !is_safe_pocketbase_id(user_id) { + return Err(anyhow!("invalid PocketBase user id")); + } + + let token = get_superuser_token(state).await?; + let pb_url = state.pocketbase_url.trim_end_matches('/'); + let filter = format!( + "status=\"pending\" && expires_at_unix>={now} && user=\"{}\" && discount_coupon_id=\"{}\" && referral_invite_id=\"{}\"", + user_id, discount_coupon_id, referral_invite_id + ); + let url = format!( + "{pb_url}/api/collections/{CHECKOUT_COLLECTION}/records?filter={}&perPage=1", + urlencoding::encode(&filter) + ); + let resp = state + .http_client + .get(&url) + .header("Authorization", format!("Bearer {token}")) + .send() + .await?; + + ensure_success_ref(&resp).await?; + + let body: Value = resp.json().await?; + let item = body["items"] + .as_array() + .and_then(|items| items.first()) + .cloned(); + + item.map(parse_pending_checkout).transpose() +} + +async fn expire_stale_pending_checkouts(state: &AppState, now: u64) -> anyhow::Result<()> { + let token = get_superuser_token(state).await?; + let pb_url = state.pocketbase_url.trim_end_matches('/'); + let filter = format!("status=\"pending\" && expires_at_unix<{now}"); + let url = format!( + "{pb_url}/api/collections/{CHECKOUT_COLLECTION}/records?filter={}&perPage=50", + urlencoding::encode(&filter) + ); + let resp = state + .http_client + .get(&url) + .header("Authorization", format!("Bearer {token}")) + .send() + .await?; + + ensure_success_ref(&resp).await?; + + let body: Value = resp.json().await?; + let Some(items) = body["items"].as_array() else { + return Ok(()); + }; + + for id in items.iter().filter_map(|item| item["id"].as_str()) { + if let Err(err) = mark_checkout_status(state, id, "expired").await { + warn!( + reservation_id = id, + "Failed to expire checkout reservation: {err}" + ); + } + } + + Ok(()) +} + +struct PendingCheckoutInput<'a> { + user_id: &'a str, + amount_pence: u64, + expected_total_pence: u64, + currency: &'a str, + discount_coupon_id: &'a str, + referral_invite_id: &'a str, + expires_at_unix: u64, +} + +async fn create_pending_checkout( + state: &AppState, + input: PendingCheckoutInput<'_>, +) -> anyhow::Result { + let token = get_superuser_token(state).await?; + let pb_url = state.pocketbase_url.trim_end_matches('/'); + let url = format!("{pb_url}/api/collections/{CHECKOUT_COLLECTION}/records"); + let resp = state + .http_client + .post(&url) + .header("Authorization", format!("Bearer {token}")) + .json(&serde_json::json!({ + "user": input.user_id, + "stripe_session_id": "", + "checkout_url": "", + "amount_pence": input.amount_pence, + "expected_total_pence": input.expected_total_pence, + "currency": input.currency, + "discount_coupon_id": input.discount_coupon_id, + "referral_invite_id": input.referral_invite_id, + "status": "pending", + "expires_at_unix": input.expires_at_unix, + "paid_amount_pence": 0, + "completed_at_unix": "", + })) + .send() + .await?; + + ensure_success_ref(&resp).await?; + + let body: Value = resp.json().await?; + body["id"] + .as_str() + .map(str::to_string) + .ok_or_else(|| anyhow!("PocketBase checkout reservation missing id")) +} + +#[allow(clippy::too_many_arguments)] +async fn create_stripe_session( + state: &AppState, + user: &PocketBaseUser, + reservation_id: &str, + price_pence: u64, + success_url: &str, + cancel_url: &str, + expires_at_unix: u64, + discount_coupon_id: Option<&str>, +) -> anyhow::Result<(String, String)> { + let mut form_params = vec![ + ("mode", "payment".to_string()), + ("payment_method_types[0]", "card".to_string()), + ( + "line_items[0][price_data][unit_amount]", + price_pence.to_string(), + ), + ( + "line_items[0][price_data][currency]", + CHECKOUT_CURRENCY.to_string(), + ), + ( + "line_items[0][price_data][product_data][name]", + CHECKOUT_PRODUCT_NAME.to_string(), + ), + ("line_items[0][quantity]", "1".to_string()), + ("success_url", success_url.to_string()), + ("cancel_url", cancel_url.to_string()), + ("expires_at", expires_at_unix.to_string()), + ("client_reference_id", user.id.clone()), + ("customer_email", user.email.clone()), + ("metadata[pending_checkout_id]", reservation_id.to_string()), + ("metadata[expected_amount_pence]", price_pence.to_string()), + ( + "metadata[expected_total_pence]", + expected_total_for_checkout(price_pence, discount_coupon_id).to_string(), + ), + ("metadata[expected_currency]", CHECKOUT_CURRENCY.to_string()), + ]; + + if let Some(coupon_id) = discount_coupon_id.filter(|id| !id.is_empty()) { + form_params.push(("discounts[0][coupon]", coupon_id.to_string())); + form_params.push(("metadata[discount_coupon_id]", coupon_id.to_string())); + } + + let resp = state + .http_client + .post("https://api.stripe.com/v1/checkout/sessions") + .basic_auth(&state.stripe_secret_key, None::<&str>) + .form(&form_params) + .send() + .await + .context("Stripe checkout request failed")?; + + ensure_success_ref(&resp) + .await + .context("Stripe checkout failed")?; + + let body: Value = resp + .json() + .await + .context("Failed to parse Stripe response")?; + let session_id = body["id"] + .as_str() + .filter(|id| is_safe_stripe_session_id(id)) + .map(str::to_string) + .ok_or_else(|| anyhow!("Stripe session missing valid id"))?; + let url = body["url"] + .as_str() + .map(str::to_string) + .filter(|url| !url.is_empty()) + .ok_or_else(|| anyhow!("Stripe session missing URL"))?; + + Ok((session_id, url)) +} + +async fn attach_stripe_session( + state: &AppState, + reservation_id: &str, + stripe_session_id: &str, + checkout_url: &str, +) -> anyhow::Result<()> { + let token = get_superuser_token(state).await?; + let pb_url = state.pocketbase_url.trim_end_matches('/'); + let url = format!("{pb_url}/api/collections/{CHECKOUT_COLLECTION}/records/{reservation_id}"); + let resp = state + .http_client + .patch(&url) + .header("Authorization", format!("Bearer {token}")) + .json(&serde_json::json!({ + "stripe_session_id": stripe_session_id, + "checkout_url": checkout_url, + })) + .send() + .await?; + + ensure_success(resp) + .await + .context("PocketBase checkout session attach failed") +} + +async fn mark_checkout_status( + state: &AppState, + reservation_id: &str, + status: &str, +) -> anyhow::Result<()> { + let token = get_superuser_token(state).await?; + let pb_url = state.pocketbase_url.trim_end_matches('/'); + let url = format!("{pb_url}/api/collections/{CHECKOUT_COLLECTION}/records/{reservation_id}"); + let resp = state + .http_client + .patch(&url) + .header("Authorization", format!("Bearer {token}")) + .json(&serde_json::json!({ "status": status })) + .send() + .await?; + + ensure_success(resp) + .await + .with_context(|| format!("PocketBase checkout status update failed for {reservation_id}")) +} + +async fn find_checkout_by_stripe_session( + state: &AppState, + stripe_session_id: &str, +) -> anyhow::Result> { + let token = get_superuser_token(state).await?; + let pb_url = state.pocketbase_url.trim_end_matches('/'); + let filter = format!("stripe_session_id=\"{}\"", stripe_session_id); + let url = format!( + "{pb_url}/api/collections/{CHECKOUT_COLLECTION}/records?filter={}&perPage=1", + urlencoding::encode(&filter) + ); + let resp = state + .http_client + .get(&url) + .header("Authorization", format!("Bearer {token}")) + .send() + .await?; + + ensure_success_ref(&resp).await?; + + let body: Value = resp.json().await?; + let item = body["items"] + .as_array() + .and_then(|items| items.first()) + .cloned(); + + item.map(parse_pending_checkout).transpose() +} + +fn parse_pending_checkout(item: Value) -> anyhow::Result { + Ok(PendingCheckout { + id: item["id"] + .as_str() + .ok_or_else(|| anyhow!("checkout reservation missing id"))? + .to_string(), + user_id: item["user"] + .as_str() + .ok_or_else(|| anyhow!("checkout reservation missing user"))? + .to_string(), + stripe_session_id: item["stripe_session_id"] + .as_str() + .unwrap_or_default() + .to_string(), + checkout_url: item["checkout_url"] + .as_str() + .unwrap_or_default() + .to_string(), + amount_pence: number_field(&item, "amount_pence") + .ok_or_else(|| anyhow!("checkout reservation missing amount_pence"))?, + expected_total_pence: number_field(&item, "expected_total_pence") + .ok_or_else(|| anyhow!("checkout reservation missing expected_total_pence"))?, + currency: item["currency"] + .as_str() + .unwrap_or_default() + .to_ascii_lowercase(), + referral_invite_id: item["referral_invite_id"] + .as_str() + .unwrap_or_default() + .to_string(), + status: item["status"].as_str().unwrap_or_default().to_string(), + }) +} + +fn expected_total_for_checkout(amount_pence: u64, discount_coupon_id: Option<&str>) -> u64 { + if discount_coupon_id.is_some_and(|id| !id.is_empty()) { + return ((amount_pence * (100 - REFERRAL_DISCOUNT_PERCENT)) / 100).max(1); + } + amount_pence +} + +fn number_field(value: &Value, field: &str) -> Option { + value[field].as_u64().or_else(|| { + value[field] + .as_f64() + .filter(|n| n.is_finite() && *n >= 0.0 && n.fract() == 0.0) + .map(|n| n as u64) + }) +} + +fn is_safe_stripe_session_id(id: &str) -> bool { + !id.is_empty() + && id.len() <= 128 + && id + .bytes() + .all(|b| b.is_ascii_alphanumeric() || b == b'_' || b == b'-') +} + +fn is_safe_pocketbase_id(id: &str) -> bool { + !id.is_empty() && id.len() <= 32 && id.bytes().all(|b| b.is_ascii_alphanumeric()) +} + +async fn ensure_success(resp: reqwest::Response) -> anyhow::Result<()> { + if resp.status().is_success() { + return Ok(()); + } + + let status = resp.status(); + let text = resp.text().await.unwrap_or_default(); + Err(anyhow!("upstream returned {status}: {text}")) +} + +async fn ensure_success_ref(resp: &reqwest::Response) -> anyhow::Result<()> { + if resp.status().is_success() { + return Ok(()); + } + + Err(anyhow!("upstream returned {}", resp.status())) +} diff --git a/server-rs/src/data/places.rs b/server-rs/src/data/places.rs index 108bc3c..251f707 100644 --- a/server-rs/src/data/places.rs +++ b/server-rs/src/data/places.rs @@ -97,7 +97,7 @@ fn build_search_text(name: &str, place_type: &str) -> String { } if place_type == "station" { - let suffix_aliases: [(&str, &[&str]); 5] = [ + let suffix_aliases: [(&str, &[&str]); 6] = [ ( " tube station", &[" underground station", " station", " tube", " underground"], @@ -118,6 +118,7 @@ fn build_search_text(name: &str, place_type: &str) -> String { " elizabeth line station", &[" station", " elizabeth line", " crossrail station"], ), + (" dlr station", &[" station", " dlr"]), ]; for (suffix, replacements) in suffix_aliases { @@ -139,10 +140,15 @@ fn extract_str_col(df: &DataFrame, name: &str) -> anyhow::Result> { let string_column = column .str() .with_context(|| format!("Column '{name}' is not a string column"))?; - Ok(string_column + string_column .into_iter() - .map(|value| value.unwrap_or("").to_string()) - .collect()) + .enumerate() + .map(|(row, value)| { + value + .map(ToString::to_string) + .with_context(|| format!("Column '{name}' has null at row {row}")) + }) + .collect() } fn extract_f32_col(df: &DataFrame, name: &str) -> anyhow::Result> { @@ -155,33 +161,37 @@ fn extract_f32_col(df: &DataFrame, name: &str) -> anyhow::Result> { let float_column = cast .f32() .with_context(|| format!("Column '{name}' is not a float32 column"))?; - Ok(float_column + float_column .into_iter() - .map(|value| value.unwrap_or(0.0)) - .collect()) + .enumerate() + .map(|(row, value)| value.with_context(|| format!("Column '{name}' has null at row {row}"))) + .collect() } -fn extract_bool_col_or_default( - df: &DataFrame, - name: &str, - default_value: bool, -) -> anyhow::Result> { - let Ok(column) = df.column(name) else { - return Ok(vec![default_value; df.height()]); - }; +fn extract_bool_col(df: &DataFrame, name: &str) -> anyhow::Result> { + let column = df + .column(name) + .with_context(|| format!("Missing column '{name}' in places data"))?; let bool_column = column .bool() .with_context(|| format!("Column '{name}' is not a boolean column"))?; - Ok(bool_column + bool_column .into_iter() - .map(|value| value.unwrap_or(default_value)) - .collect()) + .enumerate() + .map(|(row, value)| value.with_context(|| format!("Column '{name}' has null at row {row}"))) + .collect() } impl PlaceData { pub fn load(parquet_path: &Path) -> anyhow::Result { + super::run_polars_io(|| Self::load_inner(parquet_path)) + } + + fn load_inner(parquet_path: &Path) -> anyhow::Result { info!("Loading place data from {:?}...", parquet_path); + let parquet_path = PlRefPath::try_from_path(parquet_path) + .context("Failed to normalize places parquet path")?; let df = LazyFrame::scan_parquet(parquet_path, Default::default()) .context("Failed to scan places parquet")? .collect() @@ -210,7 +220,7 @@ impl PlaceData { let type_rank_vec: Vec = place_type_raw.iter().map(|pt| type_rank(pt)).collect(); let place_type = InternedColumn::build(&place_type_raw); let travel_destination = if df.column("travel_destination").is_ok() { - extract_bool_col_or_default(&df, "travel_destination", true)? + extract_bool_col(&df, "travel_destination")? } else { place_type_raw .iter() @@ -296,6 +306,7 @@ mod tests { assert!(build_search_text("King's Cross tube station", "station") .contains("kings cross underground")); assert!(build_search_text("St Albans", "city").contains("saint albans")); + assert!(build_search_text("Shadwell DLR station", "station").contains("shadwell station")); } #[test] diff --git a/server-rs/src/data/poi.rs b/server-rs/src/data/poi.rs index 503610b..9220c26 100644 --- a/server-rs/src/data/poi.rs +++ b/server-rs/src/data/poi.rs @@ -5,6 +5,7 @@ use anyhow::{bail, Context}; use polars::frame::DataFrame; use polars::lazy::frame::LazyFrame; use polars::prelude::*; +use rustc_hash::FxHashSet; use serde::Serialize; use tracing::info; @@ -17,6 +18,94 @@ pub struct POICategoryGroup { pub categories: Vec, } +const GROCERY_DASHBOARD_CATEGORIES: &[&str] = &[ + "Supermarket", + "Convenience Store", + "Bakery", + "Greengrocer", + "Aldi", + "Amazon", + "Asda", + "Booths", + "Budgens", + "Centra", + "Co-op", + "COOK", + "Costco", + "Dunnes Stores", + "Farmfoods", + "Heron Foods", + "Iceland", + "Lidl", + "Makro", + "M&S", + "Morrisons", + "Planet Organic", + "Sainsbury's", + "Spar", + "Tesco", + "The Food Warehouse", + "Waitrose", + "Whole Foods Market", +]; + +const DASHBOARD_POI_GROUPS: &[(&str, &[&str])] = &[ + ( + "Public Transport", + &[ + "Rail station", + "Tube station", + "Bus station", + "Bus stop", + "Airport", + ], + ), + ("Groceries", GROCERY_DASHBOARD_CATEGORIES), + ("Food & Drink", &["Café", "Restaurant", "Pub", "Fast Food"]), + ("Green Space", &["Park", "Playground"]), + ("Education", &["School"]), + ( + "Health", + &["GP Surgery", "Pharmacy", "Dentist", "Hospital & Clinic"], + ), + ( + "Leisure", + &[ + "Gym & Fitness", + "Sports Centre", + "Cinema", + "Theatre", + "Library", + ], + ), + ( + "Practical", + &["Post Office", "Bank", "EV Charging", "Fuel Station"], + ), +]; + +fn add_category_filter_index( + category_values: &[String], + category: &str, + selected: &mut FxHashSet, +) { + if let Some(pos) = category_values.iter().position(|value| value == category) { + selected.insert(pos as u16); + } +} + +pub fn resolve_poi_category_filter(category_values: &[String], categories: &str) -> FxHashSet { + let mut selected = FxHashSet::default(); + for part in categories.split(',') { + let category = part.trim(); + if category.is_empty() { + continue; + } + add_category_filter_index(category_values, category, &mut selected); + } + selected +} + pub struct POIData { /// Contiguous buffer holding all POI ID strings end-to-end. id_buffer: String, @@ -53,13 +142,18 @@ fn extract_str_col(df: &DataFrame, name: &str) -> anyhow::Result> { let string_column = column .str() .with_context(|| format!("Column '{name}' is not a string column"))?; - Ok(string_column + string_column .into_iter() - .map(|value| value.unwrap_or("").to_string()) - .collect()) + .enumerate() + .map(|(row, value)| { + value + .map(ToString::to_string) + .with_context(|| format!("Column '{name}' has null at row {row}")) + }) + .collect() } -fn extract_f32_col(df: &DataFrame, name: &str, default: f32) -> anyhow::Result> { +fn extract_f32_col(df: &DataFrame, name: &str) -> anyhow::Result> { let column = df .column(name) .with_context(|| format!("Missing column '{name}' in POI data"))?; @@ -69,16 +163,23 @@ fn extract_f32_col(df: &DataFrame, name: &str, default: f32) -> anyhow::Result anyhow::Result { + super::run_polars_io(|| Self::load_inner(parquet_path)) + } + + fn load_inner(parquet_path: &Path) -> anyhow::Result { info!("Loading POI data from {:?}...", parquet_path); + let parquet_path = PlRefPath::try_from_path(parquet_path) + .context("Failed to normalize POI parquet path")?; let df = LazyFrame::scan_parquet(parquet_path, Default::default()) .context("Failed to scan POI parquet")? .collect() @@ -91,18 +192,10 @@ impl POIData { let name = extract_str_col(&df, "name")?; let category_raw = extract_str_col(&df, "category")?; let group_raw = extract_str_col(&df, "group")?; - let lat = extract_f32_col(&df, "lat", 0.0)?; - let lng = extract_f32_col(&df, "lng", 0.0)?; + let lat = extract_f32_col(&df, "lat")?; + let lng = extract_f32_col(&df, "lng")?; let emoji_raw = extract_str_col(&df, "emoji")?; - let icon_category_raw = if df - .get_column_names() - .iter() - .any(|name| name.as_str() == "icon_category") - { - extract_str_col(&df, "icon_category")? - } else { - category_raw.clone() - }; + let icon_category_raw = extract_str_col(&df, "icon_category")?; // Pack POI IDs into a contiguous buffer let total_id_bytes: usize = id_raw.iter().map(|s| s.len()).sum(); @@ -152,7 +245,7 @@ impl POIData { }) } - /// Build category groups from the loaded POI data, validated against POI_GROUP_ORDER. + /// Build dashboard category groups from every category present in the loaded POI data. pub fn category_groups(&self) -> anyhow::Result> { let mut group_cats: HashMap> = HashMap::new(); let num_pois = self.category.indices.len(); @@ -174,18 +267,78 @@ impl POIData { ); } - POI_GROUP_ORDER + let preferred_order: HashMap<&str, HashMap<&str, usize>> = DASHBOARD_POI_GROUPS .iter() - .map(|group_name| { - let name = group_name.to_string(); - let mut categories: Vec = group_cats - .remove(&name) - .context("POI group validated but missing from map")? - .into_iter() - .collect(); - categories.sort(); - Ok(POICategoryGroup { name, categories }) + .map(|(group, categories)| { + ( + *group, + categories + .iter() + .enumerate() + .map(|(idx, category)| (*category, idx)) + .collect(), + ) }) - .collect() + .collect(); + + let groups: Vec = POI_GROUP_ORDER + .iter() + .filter_map(|group_name| { + let mut categories: Vec = group_cats + .get(*group_name) + .map(|categories| categories.iter().cloned().collect()) + .unwrap_or_default(); + if categories.is_empty() { + return None; + } + let group_order = preferred_order.get(*group_name); + categories.sort_by(|a, b| { + let a_order = group_order.and_then(|order| order.get(a.as_str())).copied(); + let b_order = group_order.and_then(|order| order.get(b.as_str())).copied(); + match (a_order, b_order) { + (Some(left), Some(right)) => left.cmp(&right), + (Some(_), None) => std::cmp::Ordering::Less, + (None, Some(_)) => std::cmp::Ordering::Greater, + (None, None) => a.cmp(b), + } + }); + Some(POICategoryGroup { + name: (*group_name).to_string(), + categories, + }) + }) + .collect(); + + Ok(groups) + } +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn category_filter_matches_exact_present_categories() { + let values = vec![ + "Supermarket".to_string(), + "Tesco".to_string(), + "Aldi".to_string(), + "Rail station".to_string(), + ]; + + let selected = resolve_poi_category_filter(&values, "Supermarket,Rail station"); + + assert!(selected.contains(&0)); + assert!(selected.contains(&3)); + assert_eq!(selected.len(), 2); + } + + #[test] + fn unknown_category_filter_matches_nothing() { + let values = vec!["Supermarket".to_string()]; + + let selected = resolve_poi_category_filter(&values, "Unknown"); + + assert!(selected.is_empty()); } } diff --git a/server-rs/src/data/postcodes.rs b/server-rs/src/data/postcodes.rs index e9b9259..10387bc 100644 --- a/server-rs/src/data/postcodes.rs +++ b/server-rs/src/data/postcodes.rs @@ -195,33 +195,38 @@ impl PostcodeData { // Extract all outer rings from the geometry let rings: Vec> = match feature.geometry { - Geometry::Polygon { coordinates } => coordinates - .first() - .map(|ring| { - vec![ring - .iter() - .map(|[lon, lat]| [*lon as f32, *lat as f32]) - .collect()] - }) - .unwrap_or_default(), + Geometry::Polygon { coordinates } => { + let ring = coordinates.first().with_context(|| { + format!("Postcode '{postcode}' polygon has no outer ring") + })?; + vec![ring + .iter() + .map(|[lon, lat]| [*lon as f32, *lat as f32]) + .collect()] + } Geometry::MultiPolygon { coordinates } => coordinates .iter() - .filter_map(|poly| { - poly.first().map(|ring| { - ring.iter() - .map(|[lon, lat]| [*lon as f32, *lat as f32]) - .collect() - }) + .enumerate() + .map(|(idx, poly)| { + let ring = poly.first().with_context(|| { + format!( + "Postcode '{postcode}' multipolygon part {idx} has no outer ring" + ) + })?; + Ok(ring + .iter() + .map(|[lon, lat]| [*lon as f32, *lat as f32]) + .collect()) }) - .collect(), + .collect::>>()?, }; // Compute centroid across all vertices from all rings let total_vertices: usize = rings.iter().map(|ring| ring.len()).sum(); - let centroid = if total_vertices == 0 { - tracing::warn!(postcode = %postcode, "Postcode polygon has zero vertices, defaulting centroid to (0,0)"); - (0.0, 0.0) - } else { + if total_vertices == 0 { + anyhow::bail!("Postcode '{postcode}' polygon has zero vertices"); + } + let centroid = { let mut sum_lat: f32 = 0.0; let mut sum_lon: f32 = 0.0; for ring in &rings { diff --git a/server-rs/src/data/property.rs b/server-rs/src/data/property.rs index 612a021..279a484 100644 --- a/server-rs/src/data/property.rs +++ b/server-rs/src/data/property.rs @@ -14,6 +14,7 @@ const ADDRESS_SEARCH_CANDIDATE_LIMIT: usize = 50_000; const ADDRESS_SEARCH_MAX_POSTINGS_PER_TOKEN: usize = 250_000; const ADDRESS_SEARCH_PREFIX_MIN_LEN: usize = 4; const ADDRESS_SEARCH_PREFIX_MAX_LEN: usize = 8; +const NO_POI_METRIC_ROW: u32 = u32::MAX; fn is_numeric_dtype(dtype: &DataType) -> bool { matches!( @@ -495,6 +496,187 @@ impl QuantRef<'_> { } } +pub struct PostcodePoiMetrics { + pub feature_names: Vec, + pub name_to_index: FxHashMap, + /// Metric-major storage: columns[metric_idx][postcode_metric_idx]. + pub columns: Vec>, + pub feature_stats: Vec, + /// Per-property row lookup into the postcode metric table. + row_to_metric_idx: Vec, + dequant_a: Vec, + quant_min: Vec, + quant_range: Vec, +} + +impl PostcodePoiMetrics { + fn empty(row_count: usize) -> Self { + Self { + feature_names: Vec::new(), + name_to_index: FxHashMap::default(), + columns: Vec::new(), + feature_stats: Vec::new(), + row_to_metric_idx: vec![NO_POI_METRIC_ROW; row_count], + dequant_a: Vec::new(), + quant_min: Vec::new(), + quant_range: Vec::new(), + } + } + + fn from_postcode_df(df: &DataFrame, feature_names: Vec) -> anyhow::Result { + if feature_names.is_empty() { + return Ok(Self::empty(0)); + } + + tracing::info!( + metrics = feature_names.len(), + postcodes = df.height(), + "Building postcode POI metric side table" + ); + + let col_major: Vec> = feature_names + .par_iter() + .map(|name| { + let column = df + .column(name.as_str()) + .with_context(|| format!("Missing POI metric column '{name}'"))?; + column_to_f32_vec(column) + }) + .collect::>>()?; + + let feature_stats: Vec = col_major + .par_iter() + .enumerate() + .map(|(metric_idx, vals)| { + let name = feature_names[metric_idx].as_str(); + let bounds = features::bounds_for(name) + .with_context(|| format!("No bounds config for POI metric '{name}'"))?; + Ok(compute_feature_stats( + vals, + &bounds, + features::has_integer_bins(name), + )) + }) + .collect::>>()?; + + let mut quant_min = Vec::with_capacity(feature_names.len()); + let mut quant_range = Vec::with_capacity(feature_names.len()); + for (metric_idx, stats) in feature_stats.iter().enumerate() { + let (min, max) = match features::bounds_for(feature_names[metric_idx].as_str()) { + Some(Bounds::Fixed { min, max }) => (min, max), + _ => (stats.histogram.min, stats.histogram.max), + }; + quant_min.push(min); + quant_range.push(if max > min { max - min } else { 0.0 }); + } + let dequant_a: Vec = quant_range + .iter() + .map(|&range| { + if range > 0.0 { + range / QUANT_SCALE + } else { + 0.0 + } + }) + .collect(); + + let columns: Vec> = col_major + .par_iter() + .enumerate() + .map(|(metric_idx, vals)| { + let range = quant_range[metric_idx]; + let min = quant_min[metric_idx]; + vals.iter() + .map(|&value| { + if !value.is_finite() { + NAN_U16 + } else if range > 0.0 { + let normalized = (value - min) / range; + (normalized * QUANT_SCALE).round().clamp(0.0, QUANT_SCALE) as u16 + } else { + 0 + } + }) + .collect() + }) + .collect(); + + let name_to_index = feature_names + .iter() + .enumerate() + .map(|(idx, name)| (name.clone(), idx)) + .collect(); + + Ok(Self { + feature_names, + name_to_index, + columns, + feature_stats, + row_to_metric_idx: Vec::new(), + dequant_a, + quant_min, + quant_range, + }) + } + + fn set_row_mapping(&mut self, row_to_metric_idx: Vec) { + self.row_to_metric_idx = row_to_metric_idx; + } + + pub fn is_empty(&self) -> bool { + self.feature_names.is_empty() + } + + pub fn num_features(&self) -> usize { + self.feature_names.len() + } + + pub fn quant_ref(&self) -> QuantRef<'_> { + QuantRef { + dequant_a: &self.dequant_a, + quant_min: &self.quant_min, + quant_range: &self.quant_range, + num_numeric: self.feature_names.len(), + } + } + + #[inline] + pub fn metric_row_for_property(&self, row: usize) -> Option { + self.row_to_metric_idx + .get(row) + .copied() + .filter(|&idx| idx != NO_POI_METRIC_ROW) + .map(|idx| idx as usize) + } + + #[inline] + pub fn raw_for_metric_row(&self, metric_row: usize, metric_idx: usize) -> u16 { + self.columns[metric_idx][metric_row] + } + + #[inline] + pub fn raw_for_property_row(&self, row: usize, metric_idx: usize) -> u16 { + let Some(metric_row) = self.metric_row_for_property(row) else { + return NAN_U16; + }; + self.raw_for_metric_row(metric_row, metric_idx) + } + + #[inline] + pub fn decode_raw(&self, metric_idx: usize, raw: u16) -> f32 { + if raw == NAN_U16 { + f32::NAN + } else { + raw as f32 * self.dequant_a[metric_idx] + self.quant_min[metric_idx] + } + } + + #[inline] + pub fn get_for_property_row(&self, row: usize, metric_idx: usize) -> f32 { + self.decode_raw(metric_idx, self.raw_for_property_row(row, metric_idx)) + } +} + pub struct PropertyData { pub lat: Vec, pub lon: Vec, @@ -514,6 +696,7 @@ pub struct PropertyData { /// Per-feature: max - min (for encoding filter bounds). quant_range: Vec, pub feature_stats: Vec, + pub poi_metrics: PostcodePoiMetrics, /// Unquantized last sale price used by the price-history chart. last_known_price_raw: Vec, /// Contiguous buffer holding all address strings end-to-end. @@ -1055,19 +1238,54 @@ pub fn precompute_h3(lat: &[f32], lon: &[f32]) -> anyhow::Result> { impl PropertyData { pub fn load(properties_path: &Path, postcode_features_path: &Path) -> anyhow::Result { + super::run_polars_io(|| Self::load_inner(properties_path, postcode_features_path)) + } + + fn load_inner(properties_path: &Path, postcode_features_path: &Path) -> anyhow::Result { // Load postcode.parquet tracing::info!( "Loading postcode features from {:?}", postcode_features_path ); + let postcode_features_path = PlRefPath::try_from_path(postcode_features_path) + .context("Failed to normalize postcode parquet path")?; let postcode_df = LazyFrame::scan_parquet(postcode_features_path, Default::default()) .context("Failed to scan postcode parquet")? .collect() .context("Failed to read postcode parquet")?; tracing::info!(rows = postcode_df.height(), "Postcode features loaded"); + let mut poi_metric_names: Vec = postcode_df + .get_column_names() + .iter() + .map(|name| name.as_str()) + .filter(|&name| features::is_dynamic_poi_feature(name)) + .map(str::to_string) + .collect(); + poi_metric_names.sort_by_key(|name| features::dynamic_poi_feature_sort_key(name)); + + let poi_metric_by_postcode: FxHashMap = if poi_metric_names.is_empty() { + FxHashMap::default() + } else { + let postcode_column = postcode_df + .column("Postcode") + .context("Postcode feature parquet missing 'Postcode' column")? + .str() + .context("'Postcode' column in postcode feature parquet is not a string")?; + postcode_column + .into_iter() + .enumerate() + .filter_map(|(idx, postcode)| { + postcode.map(|postcode| (postcode.to_string(), idx as u32)) + }) + .collect() + }; + let mut poi_metrics = PostcodePoiMetrics::from_postcode_df(&postcode_df, poi_metric_names)?; + // Load properties.parquet and join with postcode data for lat/lon + area features tracing::info!("Loading properties from {:?}", properties_path); + let properties_path = PlRefPath::try_from_path(properties_path) + .context("Failed to normalize properties parquet path")?; let properties_lf = LazyFrame::scan_parquet(properties_path, Default::default()) .context("Failed to scan properties parquet")?; let combined = properties_lf @@ -1082,14 +1300,20 @@ impl PropertyData { let total_rows = combined.height(); tracing::info!(rows = total_rows, "Properties joined with postcodes"); - // Get configured feature/enum names in config order - let numeric_names = features::all_numeric_feature_names(); + // Get configured feature/enum names in config order. Dynamic POI + // metrics live in a postcode-level side table so they do not widen the + // hot row-major property feature matrix. + let configured_numeric_names = features::all_numeric_feature_names(); let enum_names = features::all_enum_feature_names(); let schema = combined.schema(); + let numeric_names: Vec = configured_numeric_names + .iter() + .map(|name| (*name).to_string()) + .collect(); for name in &numeric_names { - match schema.get(name) { + match schema.get(name.as_str()) { Some(dtype) if is_numeric_dtype(dtype) => {} Some(dtype) => bail!( "Configured numeric feature '{}' has non-numeric type {:?}", @@ -1120,8 +1344,8 @@ impl PropertyData { // Combine numeric and enum feature names (numeric first, then enum) let feature_names: Vec = numeric_names .iter() - .chain(enum_names.iter()) .map(|name| name.to_string()) + .chain(enum_names.iter().map(|name| name.to_string())) .collect(); let num_features = feature_names.len(); let num_numeric = numeric_names.len(); @@ -1138,16 +1362,16 @@ impl PropertyData { select_exprs.push(col("lon").cast(DataType::Float32)); // Select numeric features as Float32 (datetime columns → fractional year) - for &name in &numeric_names { - if is_datetime_dtype(schema.get(name).unwrap()) { + for name in &numeric_names { + if is_datetime_dtype(schema.get(name.as_str()).unwrap()) { select_exprs.push( - (col(name).dt().year().cast(DataType::Float32) - + (col(name).dt().month().cast(DataType::Float32) - lit(1.0f32)) + (col(name.as_str()).dt().year().cast(DataType::Float32) + + (col(name.as_str()).dt().month().cast(DataType::Float32) - lit(1.0f32)) / lit(12.0f32)) - .alias(name), + .alias(name.as_str()), ); } else { - select_exprs.push(col(name).cast(DataType::Float32)); + select_exprs.push(col(name.as_str()).cast(DataType::Float32)); } } @@ -1233,7 +1457,7 @@ impl PropertyData { .par_iter() .map(|name| { let column = df - .column(name) + .column(name.as_str()) .with_context(|| format!("Missing feature column '{name}'"))?; column_to_f32_vec(column) }) @@ -1244,10 +1468,10 @@ impl PropertyData { .par_iter() .enumerate() .map(|(feat_index, vals)| { - let name = numeric_names[feat_index]; + let name = numeric_names[feat_index].as_str(); let bounds = features::bounds_for(name) .with_context(|| format!("No bounds config for feature '{}'", name))?; - let stats = compute_feature_stats(vals, bounds, features::has_integer_bins(name)); + let stats = compute_feature_stats(vals, &bounds, features::has_integer_bins(name)); tracing::debug!( feature = %name, slider_min = format_args!("{:.2}", stats.slider_min), @@ -1268,8 +1492,8 @@ impl PropertyData { let mut quant_min = Vec::with_capacity(num_features); let mut quant_range = Vec::with_capacity(num_features); for (feat_idx, stats) in numeric_feature_stats.iter().enumerate() { - let (min, max) = match features::bounds_for(numeric_names[feat_idx]) { - Some(Bounds::Fixed { min, max }) => (*min, *max), + let (min, max) = match features::bounds_for(numeric_names[feat_idx].as_str()) { + Some(Bounds::Fixed { min, max }) => (min, max), _ => (stats.histogram.min, stats.histogram.max), }; quant_min.push(min); @@ -1284,10 +1508,15 @@ impl PropertyData { let string_column = column .str() .with_context(|| format!("Column '{name}' is not a string column"))?; - Ok(string_column + string_column .into_iter() - .map(|value| value.unwrap_or("").to_string()) - .collect()) + .enumerate() + .map(|(row, value)| { + value + .map(ToString::to_string) + .with_context(|| format!("Required column '{name}' has null at row {row}")) + }) + .collect() }; let address_raw = extract_string_col(&df, "Address per Property Register")?; @@ -1325,18 +1554,18 @@ impl PropertyData { // enum_col_major: Vec<(values_list, encoded_as_f32)> let enum_col_major: Vec<(Vec, Vec)> = enum_names .par_iter() - .filter_map(|&name| { - let column_data = df.column(name).ok()?; - let string_column = column_data.str().ok()?; + .map(|&name| -> anyhow::Result<(Vec, Vec)> { + let column_data = df + .column(name) + .with_context(|| format!("Required enum column '{name}' not found"))?; + let string_column = column_data + .str() + .with_context(|| format!("Enum column '{name}' is not a string column"))?; let unique_set: std::collections::HashSet = string_column .into_iter() .filter_map(|value| { - let text = value.unwrap_or(""); - if text.is_empty() { - None - } else { - Some(text.to_string()) - } + let text = value?.trim(); + (!text.is_empty()).then(|| text.to_string()) }) .collect(); @@ -1373,20 +1602,22 @@ impl PropertyData { let encoded: Vec = string_column .into_iter() - .map(|value| { - let text = value.unwrap_or(""); - if text.is_empty() { - f32::NAN - } else { - *value_to_idx.get(text).unwrap_or(&f32::NAN) - } + .enumerate() + .map(|(row, value)| { + let Some(text) = value.map(str::trim).filter(|text| !text.is_empty()) + else { + return Ok(f32::NAN); + }; + value_to_idx.get(text).copied().with_context(|| { + format!("Enum column '{name}' has unknown value '{text}' at row {row}") + }) }) - .collect(); + .collect::>>()?; tracing::debug!(column = %name, unique_values = unique.len(), "Enum feature encoded as f32"); - Some((unique, encoded)) + Ok((unique, encoded)) }) - .collect(); + .collect::>>()?; // Extract is_approx_build_date: 0.0 = exact, anything else (1.0/NaN) = approximate let is_approx_build_date_raw: Vec = if has_approx_col { @@ -1487,13 +1718,13 @@ impl PropertyData { .collect(); let last_known_price_raw: Vec = numeric_names .iter() - .position(|&name| name == "Last known price") + .position(|name| name == "Last known price") .map(|price_idx| { perm.iter() .map(|&perm_index| numeric_col_major[price_idx][perm_index as usize]) .collect() }) - .unwrap_or_else(|| vec![f32::NAN; row_count]); + .context("Required numeric column 'Last known price' not configured")?; // Build contiguous address buffer and address search index (permuted) tracing::info!("Building interned strings"); @@ -1561,6 +1792,20 @@ impl PropertyData { } let postcode_interner = postcode_rodeo.into_reader(); + let row_to_poi_metric_idx: Vec = if poi_metrics.is_empty() { + vec![NO_POI_METRIC_ROW; row_count] + } else { + perm.iter() + .map(|&old_row| { + poi_metric_by_postcode + .get(postcode_raw[old_row as usize].as_str()) + .copied() + .unwrap_or(NO_POI_METRIC_ROW) + }) + .collect() + }; + poi_metrics.set_row_mapping(row_to_poi_metric_idx); + // Pack is_approx_build_date into a bitvec (8 bools per byte) let num_bytes = row_count.div_ceil(8); let mut approx_build_date_bits = vec![0u8; num_bytes]; @@ -1697,6 +1942,7 @@ impl PropertyData { quant_min, quant_range, feature_stats, + poi_metrics, last_known_price_raw, address_buffer, address_offsets, diff --git a/server-rs/src/data/travel_time.rs b/server-rs/src/data/travel_time.rs index 0fc6d5f..f90dca8 100644 --- a/server-rs/src/data/travel_time.rs +++ b/server-rs/src/data/travel_time.rs @@ -5,6 +5,7 @@ use std::sync::Arc; use anyhow::Context; use parking_lot::Mutex; use polars::lazy::frame::LazyFrame; +use polars::prelude::PlRefPath; use rustc_hash::{FxHashMap, FxHashSet}; use tracing::info; @@ -155,15 +156,23 @@ impl TravelTimeStore { /// Returns a cached or freshly-loaded postcode → travel_minutes mapping. pub fn get(&self, mode: &str, slug: &str) -> anyhow::Result { let key = (mode.to_string(), slug.to_string()); - - // Check cache first - { - let mut cache = self.cache.lock(); - if let Some(data) = cache.get(&key) { - return Ok(data); - } + if let Some(data) = self.get_cached(&key) { + return Ok(data); } + super::run_polars_io(|| self.load_uncached(key)) + } + + fn get_cached(&self, key: &(String, String)) -> Option { + let mut cache = self.cache.lock(); + cache.get(key) + } + + fn load_uncached(&self, key: (String, String)) -> anyhow::Result { + if let Some(data) = self.get_cached(&key) { + return Ok(data); + } + let (mode, slug) = &key; // Resolve slug to actual filename (may have numeric prefix). // Reject unknown slugs rather than falling back to raw input to prevent path traversal. let file_stem = self @@ -175,7 +184,9 @@ impl TravelTimeStore { .join(mode) .join(format!("{}.parquet", file_stem)); - let df = LazyFrame::scan_parquet(&path, Default::default()) + let parquet_path = PlRefPath::try_from_path(&path) + .with_context(|| format!("Failed to normalize path: {}", path.display()))?; + let df = LazyFrame::scan_parquet(parquet_path, Default::default()) .with_context(|| format!("Failed to scan: {}", path.display()))? .collect() .with_context(|| format!("Failed to read: {}", path.display()))?; diff --git a/server-rs/src/features.rs b/server-rs/src/features.rs index d4025b8..e779710 100644 --- a/server-rs/src/features.rs +++ b/server-rs/src/features.rs @@ -1,6 +1,7 @@ //! Static feature configuration. Every numeric and enum column in wide.parquet //! must be declared here. Unknown columns cause a startup panic. +#[derive(Clone, Copy)] pub enum Bounds { /// Fixed min/max values for the slider Fixed { min: f32, max: f32 }, @@ -61,6 +62,26 @@ pub struct FeatureGroup { } pub static FEATURE_GROUPS: &[FeatureGroup] = &[ + FeatureGroup { + name: "Transport", + features: &[ + Feature::Numeric(FeatureConfig { + name: "Distance to nearest train or tube station (km)", + bounds: Bounds::Percentile { + low: 2.0, + high: 98.0, + }, + step: 0.1, + description: "Distance to the closest train or tube station", + detail: "Straight-line distance in kilometres from the postcode to the nearest rail station or Tube/metro/tram stop.", + source: "naptan", + prefix: "", + suffix: " km", + raw: false, + absolute: false, + }), + ], + }, FeatureGroup { name: "Properties", features: &[ @@ -78,6 +99,21 @@ pub static FEATURE_GROUPS: &[FeatureGroup] = &[ detail: "From HM Land Registry Price Paid data. Freehold means you own the building and the land it stands on. Leasehold means you own the building but not the land: you have a lease from the freeholder for a set number of years.", source: "price-paid", }), + Feature::Numeric(FeatureConfig { + name: "Estimated current price", + bounds: Bounds::Fixed { + min: 0.0, + max: 2_500_000.0, + }, + step: 10000.0, + description: "Modelled estimate of the current property value", + detail: "Based on the last sale price, local repeat-sales price movement, and nearby recently sold properties. The repeat-sales index is tracked by postcode sector and property type, with smoothing and neighbour blending where data is sparse. Recent sales stay close to the recorded price; older sales depend more on the model.", + source: "price-paid", + prefix: "£", + suffix: "", + raw: false, + absolute: true, + }), Feature::Numeric(FeatureConfig { name: "Last known price", bounds: Bounds::Fixed { @@ -94,19 +130,19 @@ pub static FEATURE_GROUPS: &[FeatureGroup] = &[ absolute: true, }), Feature::Numeric(FeatureConfig { - name: "Estimated current price", - bounds: Bounds::Fixed { - min: 0.0, - max: 2_500_000.0, + name: "Est. price per sqm", + bounds: Bounds::Percentile { + low: 0.0, + high: 98.0, }, - step: 10000.0, - description: "Inflation-adjusted estimate of the current property value", - detail: "Based on the last sale price, adjusted for local price changes over time using a repeat-sales index (tracked per postcode sector and property type). If post-sale improvements are detected from EPC records, a renovation premium is added. Recent sales will be close to the original price; older sales are adjusted more.", + step: 100.0, + description: "Estimated current price divided by total floor area", + detail: "Calculated by dividing the modelled estimated current price by the total floor area from the EPC certificate. Provides a more up-to-date price-per-area comparison than the historical sale price per sqm.", source: "price-paid", prefix: "£", suffix: "", raw: false, - absolute: true, + absolute: false, }), Feature::Numeric(FeatureConfig { name: "Price per sqm", @@ -123,21 +159,6 @@ pub static FEATURE_GROUPS: &[FeatureGroup] = &[ raw: false, absolute: false, }), - Feature::Numeric(FeatureConfig { - name: "Est. price per sqm", - bounds: Bounds::Percentile { - low: 0.0, - high: 98.0, - }, - step: 100.0, - description: "Estimated current price divided by total floor area", - detail: "Calculated by dividing the inflation-adjusted estimated current price (including any renovation premium) by the total floor area from the EPC certificate. Provides a more up-to-date price-per-area comparison than the historical sale price per sqm.", - source: "price-paid", - prefix: "£", - suffix: "", - raw: false, - absolute: false, - }), Feature::Numeric(FeatureConfig { name: "Estimated monthly rent", bounds: Bounds::Percentile { low: 2.0, high: 98.0 }, @@ -248,26 +269,6 @@ pub static FEATURE_GROUPS: &[FeatureGroup] = &[ }), ], }, - FeatureGroup { - name: "Transport", - features: &[ - Feature::Numeric(FeatureConfig { - name: "Distance to nearest train or tube station (km)", - bounds: Bounds::Percentile { - low: 2.0, - high: 98.0, - }, - step: 0.1, - description: "Distance to the closest train or tube station", - detail: "Straight-line distance in kilometres from the postcode to the nearest rail station or Tube/metro/tram stop.", - source: "naptan", - prefix: "", - suffix: " km", - raw: false, - absolute: false, - }), - ], - }, FeatureGroup { name: "Education", features: &[ @@ -393,18 +394,18 @@ pub static FEATURE_GROUPS: &[FeatureGroup] = &[ }), Feature::Numeric(FeatureConfig { name: "Education, Skills and Training Score", - bounds: Bounds::Percentile { - low: 2.0, - high: 98.0, + bounds: Bounds::Fixed { + min: 0.0, + max: 100.0, }, - step: 0.1, - description: "Education quality score for the local area (higher = better)", - detail: "From the English Indices of Deprivation (inverted so higher = better). Covers school attainment, entry to higher education, adult qualifications, and English language proficiency. Higher scores indicate less deprivation.", + step: 1.0, + description: "Education and skills deprivation percentile (higher = less deprived)", + detail: "From the English Indices of Deprivation, converted to a national percentile where 0% is most deprived and 100% is least deprived. Covers school attainment, entry to higher education, adult qualifications, and English language proficiency.", source: "iod", prefix: "", - suffix: "", - raw: false, - absolute: false, + suffix: "%", + raw: true, + absolute: true, }), ], }, @@ -413,72 +414,78 @@ pub static FEATURE_GROUPS: &[FeatureGroup] = &[ features: &[ Feature::Numeric(FeatureConfig { name: "Income Score", - bounds: Bounds::Fixed { min: 0.0, max: 1.0 }, - step: 0.01, - description: "Income deprivation rate, inverted (higher = less deprived)", - detail: "From the English Indices of Deprivation (inverted so higher = better). Higher values indicate less income deprivation. Based on Income Support, income-based Jobseeker's Allowance, income-based Employment and Support Allowance, Pension Credit, Working Tax Credit and Child Tax Credit, Universal Credit, and asylum seekers.", + bounds: Bounds::Fixed { + min: 0.0, + max: 100.0, + }, + step: 1.0, + description: "Income deprivation percentile (higher = less deprived)", + detail: "From the English Indices of Deprivation, converted to a national percentile where 0% is most income deprived and 100% is least income deprived. Based on Income Support, income-based Jobseeker's Allowance, income-based Employment and Support Allowance, Pension Credit, Working Tax Credit and Child Tax Credit, Universal Credit, and asylum seekers.", source: "iod", prefix: "", - suffix: "", - raw: false, - absolute: false, + suffix: "%", + raw: true, + absolute: true, }), Feature::Numeric(FeatureConfig { name: "Employment Score", - bounds: Bounds::Fixed { min: 0.0, max: 1.0 }, - step: 0.01, - description: "Employment deprivation rate, inverted (higher = less deprived)", - detail: "From the English Indices of Deprivation (inverted so higher = better). Higher values indicate less employment deprivation. Based on claimants of Jobseeker's Allowance, Employment and Support Allowance, Incapacity Benefit, Severe Disablement Allowance, Carer's Allowance, and relevant Universal Credit claimants.", + bounds: Bounds::Fixed { + min: 0.0, + max: 100.0, + }, + step: 1.0, + description: "Employment deprivation percentile (higher = less deprived)", + detail: "From the English Indices of Deprivation, converted to a national percentile where 0% is most employment deprived and 100% is least employment deprived. Based on claimants of Jobseeker's Allowance, Employment and Support Allowance, Incapacity Benefit, Severe Disablement Allowance, Carer's Allowance, and relevant Universal Credit claimants.", source: "iod", prefix: "", - suffix: "", - raw: false, - absolute: false, + suffix: "%", + raw: true, + absolute: true, }), Feature::Numeric(FeatureConfig { name: "Health Deprivation and Disability Score", - bounds: Bounds::Percentile { - low: 2.0, - high: 98.0, + bounds: Bounds::Fixed { + min: 0.0, + max: 100.0, }, - step: 0.1, - description: "Health and disability score (higher = better health outcomes)", - detail: "From the English Indices of Deprivation (inverted so higher = better). Higher scores indicate lower risk of premature death and better quality of life. Derived from years of potential life lost, comparative illness and disability ratio, acute morbidity, and mood and anxiety disorders.", + step: 1.0, + description: "Health and disability deprivation percentile (higher = better outcomes)", + detail: "From the English Indices of Deprivation, converted to a national percentile where 0% is most health deprived and 100% is least health deprived. Derived from years of potential life lost, comparative illness and disability ratio, acute morbidity, and mood and anxiety disorders.", source: "iod", prefix: "", - suffix: "", - raw: false, - absolute: false, + suffix: "%", + raw: true, + absolute: true, }), Feature::Numeric(FeatureConfig { name: "Housing Conditions Score", - bounds: Bounds::Percentile { - low: 2.0, - high: 98.0, + bounds: Bounds::Fixed { + min: 0.0, + max: 100.0, }, - step: 0.1, - description: "Housing quality and conditions (higher = better)", - detail: "From the English Indices of Deprivation, Living Environment domain (inverted so higher = better). Measures the quality of housing stock: central heating availability, housing condition, and Decent Homes standards. Higher scores indicate better housing conditions.", + step: 1.0, + description: "Housing conditions percentile (higher = better conditions)", + detail: "From the English Indices of Deprivation, Living Environment domain, converted to a national percentile where 0% is most deprived and 100% is least deprived. Measures the quality of housing stock: central heating availability, housing condition, and Decent Homes standards.", source: "iod", prefix: "", - suffix: "", - raw: false, - absolute: false, + suffix: "%", + raw: true, + absolute: true, }), Feature::Numeric(FeatureConfig { name: "Air Quality and Road Safety Score", - bounds: Bounds::Percentile { - low: 2.0, - high: 98.0, + bounds: Bounds::Fixed { + min: 0.0, + max: 100.0, }, - step: 0.1, - description: "Air quality and road safety (higher = better)", - detail: "From the English Indices of Deprivation, Living Environment domain (inverted so higher = better). Measures the outdoor living environment quality through air quality indicators and road traffic accident casualties involving pedestrians and cyclists. Higher scores indicate better outdoor environments.", + step: 1.0, + description: "Air quality and road safety percentile (higher = better conditions)", + detail: "From the English Indices of Deprivation, Living Environment domain, converted to a national percentile where 0% is most deprived and 100% is least deprived. Measures the outdoor living environment through air quality indicators and road traffic accident casualties involving pedestrians and cyclists.", source: "iod", prefix: "", - suffix: "", - raw: false, - absolute: false, + suffix: "%", + raw: true, + absolute: true, }), ], }, @@ -996,6 +1003,126 @@ pub static FEATURE_GROUPS: &[FeatureGroup] = &[ raw: false, absolute: false, }), + Feature::Numeric(FeatureConfig { + name: "Distance to nearest grocery store (km)", + bounds: Bounds::Percentile { + low: 2.0, + high: 98.0, + }, + step: 0.1, + description: "Distance to the closest grocery shop or supermarket", + detail: "Straight-line distance in kilometres from the postcode to the nearest grocery shop, supermarket, or convenience store. Uses OpenStreetMap POIs, with Waitrose and Tesco coverage from GEOLYTIX retail points.", + source: "osm-pois", + prefix: "", + suffix: " km", + raw: false, + absolute: false, + }), + Feature::Numeric(FeatureConfig { + name: "Distance to nearest tube station (km)", + bounds: Bounds::Percentile { + low: 2.0, + high: 98.0, + }, + step: 0.1, + description: "Distance to the closest Tube, metro, tram, or DLR stop", + detail: "Straight-line distance in kilometres from the postcode to the nearest NaPTAN station classified as Tube, metro, tram, or DLR.", + source: "naptan", + prefix: "", + suffix: " km", + raw: false, + absolute: false, + }), + Feature::Numeric(FeatureConfig { + name: "Distance to nearest rail station (km)", + bounds: Bounds::Percentile { + low: 2.0, + high: 98.0, + }, + step: 0.1, + description: "Distance to the closest National Rail station", + detail: "Straight-line distance in kilometres from the postcode to the nearest NaPTAN railway station.", + source: "naptan", + prefix: "", + suffix: " km", + raw: false, + absolute: false, + }), + Feature::Numeric(FeatureConfig { + name: "Distance to nearest Waitrose (km)", + bounds: Bounds::Percentile { + low: 2.0, + high: 98.0, + }, + step: 0.1, + description: "Distance to the closest Waitrose store", + detail: "Straight-line distance in kilometres from the postcode to the nearest Waitrose or Little Waitrose store in the GEOLYTIX Grocery Retail Points dataset.", + source: "geolytix-retail-points", + prefix: "", + suffix: " km", + raw: false, + absolute: false, + }), + Feature::Numeric(FeatureConfig { + name: "Distance to nearest Tesco (km)", + bounds: Bounds::Percentile { + low: 2.0, + high: 98.0, + }, + step: 0.1, + description: "Distance to the closest Tesco store", + detail: "Straight-line distance in kilometres from the postcode to the nearest Tesco store in the GEOLYTIX Grocery Retail Points dataset.", + source: "geolytix-retail-points", + prefix: "", + suffix: " km", + raw: false, + absolute: false, + }), + Feature::Numeric(FeatureConfig { + name: "Distance to nearest cafe (km)", + bounds: Bounds::Percentile { + low: 2.0, + high: 98.0, + }, + step: 0.1, + description: "Distance to the closest cafe", + detail: "Straight-line distance in kilometres from the postcode to the nearest cafe, ice-cream shop, or internet cafe mapped in OpenStreetMap.", + source: "osm-pois", + prefix: "", + suffix: " km", + raw: false, + absolute: false, + }), + Feature::Numeric(FeatureConfig { + name: "Distance to nearest pub (km)", + bounds: Bounds::Percentile { + low: 2.0, + high: 98.0, + }, + step: 0.1, + description: "Distance to the closest pub", + detail: "Straight-line distance in kilometres from the postcode to the nearest pub, social club, brewery, distillery, or winery mapped in OpenStreetMap.", + source: "osm-pois", + prefix: "", + suffix: " km", + raw: false, + absolute: false, + }), + Feature::Numeric(FeatureConfig { + name: "Distance to nearest restaurant (km)", + bounds: Bounds::Percentile { + low: 2.0, + high: 98.0, + }, + step: 0.1, + description: "Distance to the closest restaurant", + detail: "Straight-line distance in kilometres from the postcode to the nearest restaurant or food court mapped in OpenStreetMap.", + source: "osm-pois", + prefix: "", + suffix: " km", + raw: false, + absolute: false, + }), Feature::Numeric(FeatureConfig { name: "Number of parks within 1km", bounds: Bounds::Percentile { @@ -1105,20 +1232,76 @@ pub fn order_for(name: &str) -> Option<&'static [&'static str]> { /// Whether this feature should use integer-width histogram bins. pub fn has_integer_bins(name: &str) -> bool { - INTEGER_BIN_FEATURES.contains(&name) + INTEGER_BIN_FEATURES.contains(&name) || dynamic_poi_count_radius(name).is_some() } /// Look up the Bounds config for a numeric feature by name. -pub fn bounds_for(name: &str) -> Option<&'static Bounds> { +pub fn bounds_for(name: &str) -> Option { + if dynamic_poi_distance_category(name).is_some() { + return Some(Bounds::Percentile { + low: 2.0, + high: 98.0, + }); + } + if dynamic_poi_count_radius(name).is_some() { + return Some(Bounds::Percentile { + low: 5.0, + high: 95.0, + }); + } + FEATURE_GROUPS .iter() .flat_map(|group| group.features.iter()) .find_map(|feature| match feature { - Feature::Numeric(c) if c.name == name => Some(&c.bounds), + Feature::Numeric(c) if c.name == name => Some(c.bounds), _ => None, }) } +pub fn dynamic_poi_distance_category(name: &str) -> Option<&str> { + name.strip_prefix("Distance to nearest ") + .and_then(|rest| rest.strip_suffix(" POI (km)")) + .filter(|category| !category.is_empty()) +} + +pub fn dynamic_poi_count_radius(name: &str) -> Option { + let rest = name.strip_prefix("Number of ")?; + let (_category, suffix) = rest.rsplit_once(" POIs within ")?; + match suffix { + "2km" => Some(2), + "5km" => Some(5), + _ => None, + } +} + +pub fn dynamic_poi_count_category(name: &str) -> Option<&str> { + let rest = name.strip_prefix("Number of ")?; + let (category, suffix) = rest.rsplit_once(" POIs within ")?; + matches!(suffix, "2km" | "5km") + .then_some(category) + .filter(|category| !category.is_empty()) +} + +pub fn is_dynamic_poi_feature(name: &str) -> bool { + dynamic_poi_distance_category(name).is_some() || dynamic_poi_count_category(name).is_some() +} + +pub fn dynamic_poi_feature_sort_key(name: &str) -> (u8, String) { + if let Some(category) = dynamic_poi_distance_category(name) { + return (0, category.to_ascii_lowercase()); + } + if let Some(category) = dynamic_poi_count_category(name) { + let metric_order = match dynamic_poi_count_radius(name) { + Some(2) => 1, + Some(5) => 2, + _ => 3, + }; + return (metric_order, category.to_ascii_lowercase()); + } + (9, name.to_ascii_lowercase()) +} + /// Canonical display order for POI category groups. /// The server will panic at startup if the data contains groups not in this list or vice versa. pub const POI_GROUP_ORDER: &[&str] = &[ diff --git a/server-rs/src/main.rs b/server-rs/src/main.rs index 611616a..3d6a324 100644 --- a/server-rs/src/main.rs +++ b/server-rs/src/main.rs @@ -2,6 +2,7 @@ mod aggregation; mod auth; +mod checkout_sessions; mod consts; mod data; mod features; @@ -10,6 +11,7 @@ mod metrics; mod og_middleware; pub mod parsing; mod pocketbase; +mod pocketbase_locks; mod routes; mod state; pub mod utils; diff --git a/server-rs/src/parsing.rs b/server-rs/src/parsing.rs index 4a825be..f0c92e0 100644 --- a/server-rs/src/parsing.rs +++ b/server-rs/src/parsing.rs @@ -4,8 +4,11 @@ mod filters; mod h3; pub use bounds::{bounds_intersect, h3_cell_bounds, parse_bounds, require_bounds}; -pub use fields::{parse_enum_dist, parse_field_indices, parse_field_set}; +pub use fields::{ + parse_enum_dist, parse_field_indices, parse_field_indices_with_poi, parse_field_set, +}; pub use filters::{ - count_filter_impacts, parse_filters, row_passes_filters, ParsedEnumFilter, ParsedFilter, + count_filter_impacts, parse_filters, parse_filters_with_poi, row_passes_filters, + row_passes_poi_filters, ParsedEnumFilter, ParsedFilter, ParsedPoiFilter, }; pub use h3::{cell_for_row, cell_for_row_cached, needs_parent, validate_h3_resolution}; diff --git a/server-rs/src/parsing/fields.rs b/server-rs/src/parsing/fields.rs index 38d7531..003d2f9 100644 --- a/server-rs/src/parsing/fields.rs +++ b/server-rs/src/parsing/fields.rs @@ -31,6 +31,55 @@ pub fn parse_field_indices( Ok(Some(indices)) } +pub struct ParsedFieldIndices { + /// None means no `fields` param was supplied, so normal aggregation keeps + /// its existing "all configured features" behavior. + pub normal: Option>, + pub poi: Vec, +} + +/// Parse `?fields=` against both the row-major feature matrix and the +/// postcode-level POI side table. +pub fn parse_field_indices_with_poi( + fields: Option<&str>, + name_to_index: &FxHashMap, + poi_name_to_index: &FxHashMap, +) -> Result { + let Some(fields_str) = fields else { + return Ok(ParsedFieldIndices { + normal: None, + poi: Vec::new(), + }); + }; + if fields_str.is_empty() { + return Ok(ParsedFieldIndices { + normal: Some(Vec::new()), + poi: Vec::new(), + }); + } + + let mut normal = Vec::new(); + let mut poi = Vec::new(); + for name in fields_str.split(";;") { + let name = name.trim(); + if name.is_empty() { + continue; + } + if let Some(&idx) = name_to_index.get(name) { + normal.push(idx); + } else if let Some(&idx) = poi_name_to_index.get(name) { + poi.push(idx); + } else { + return Err((StatusCode::BAD_REQUEST, format!("Unknown field: {}", name))); + } + } + + Ok(ParsedFieldIndices { + normal: Some(normal), + poi, + }) +} + /// Parse an optional `?enum_dist=` query param into (feature_index, num_values) for /// per-value distribution counting. Returns None if not requested. /// Returns 400 if the feature name is unknown or not an enum feature. @@ -73,3 +122,28 @@ pub fn parse_field_set(fields: Option<&str>) -> (bool, HashSet) { .unwrap_or_default(); (fields_specified, field_set) } + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn parse_field_indices_with_poi_splits_normal_and_side_fields() { + let normal: FxHashMap = [("Price".to_string(), 0), ("Area".to_string(), 1)] + .into_iter() + .collect(); + let poi: FxHashMap = [("Distance to nearest cafe POI (km)".to_string(), 2)] + .into_iter() + .collect(); + + let parsed = parse_field_indices_with_poi( + Some("Price;;Distance to nearest cafe POI (km)"), + &normal, + &poi, + ) + .unwrap(); + + assert_eq!(parsed.normal, Some(vec![0])); + assert_eq!(parsed.poi, vec![2]); + } +} diff --git a/server-rs/src/parsing/filters.rs b/server-rs/src/parsing/filters.rs index e74898a..ee21deb 100644 --- a/server-rs/src/parsing/filters.rs +++ b/server-rs/src/parsing/filters.rs @@ -1,7 +1,7 @@ use rustc_hash::{FxHashMap, FxHashSet}; use crate::consts::NAN_U16; -use crate::data::QuantRef; +use crate::data::{PostcodePoiMetrics, QuantRef}; /// Filter for numeric features: value must be in [min_u16, max_u16] range (quantized). #[derive(Debug)] @@ -19,6 +19,20 @@ pub struct ParsedEnumFilter { pub allowed: FxHashSet, } +/// Filter for postcode-level POI metrics stored in the side table. +#[derive(Debug)] +pub struct ParsedPoiFilter { + pub metric_idx: usize, + pub min_u16: u16, + pub max_u16: u16, +} + +pub type ParsedFiltersWithPoi = ( + Vec, + Vec, + Vec, +); + /// Parse `;;`-separated filter string into numeric and enum filters. /// Numeric format: `name:min:max` /// Enum format: `name:val1|val2|val3` (pipe-separated string values) @@ -110,6 +124,101 @@ pub fn parse_filters( Ok((numeric, enums)) } +/// Parse filters while allowing dynamic POI metric names that live outside the +/// row-major property feature matrix. +pub fn parse_filters_with_poi( + filter_str: Option<&str>, + feature_name_to_index: &FxHashMap, + enum_values: &FxHashMap>, + quant: &QuantRef, + poi_name_to_index: &FxHashMap, + poi_quant: &QuantRef, +) -> Result { + let mut numeric = Vec::new(); + let mut enums = Vec::new(); + let mut poi = Vec::new(); + + let input = match filter_str.filter(|text| !text.is_empty()) { + Some(text) => text, + None => return Ok((numeric, enums, poi)), + }; + + for entry in input.split(";;") { + let parts: Vec<&str> = entry.splitn(2, ':').collect(); + if parts.len() != 2 { + return Err(format!("Malformed filter entry (missing ':'): '{entry}'")); + } + let name = parts[0].trim(); + let rest = parts[1].trim(); + + if let Some(&feat_idx) = feature_name_to_index.get(name) { + if let Some(values) = enum_values.get(&feat_idx) { + let mut allowed: FxHashSet = FxHashSet::default(); + for value in rest.split('|') { + let value = value.trim(); + match values.iter().position(|existing| existing == value) { + Some(position) => { + allowed.insert(position as u16); + } + None => { + return Err(format!( + "Unknown value '{}' for enum feature '{}'. Valid values: {:?}", + value, name, values + )); + } + } + } + enums.push(ParsedEnumFilter { feat_idx, allowed }); + } else { + let (min, max) = parse_numeric_filter_bounds(name, rest, entry)?; + numeric.push(ParsedFilter { + feat_idx, + min_u16: quant.encode_min(feat_idx, min), + max_u16: quant.encode_max(feat_idx, max), + }); + } + } else if let Some(&metric_idx) = poi_name_to_index.get(name) { + let (min, max) = parse_numeric_filter_bounds(name, rest, entry)?; + poi.push(ParsedPoiFilter { + metric_idx, + min_u16: poi_quant.encode_min(metric_idx, min), + max_u16: poi_quant.encode_max(metric_idx, max), + }); + } else { + return Err(format!("Unknown feature in filter: '{name}'")); + } + } + + numeric.sort_unstable_by_key(|f| f.max_u16.saturating_sub(f.min_u16)); + enums.sort_unstable_by_key(|f| f.allowed.len()); + poi.sort_unstable_by_key(|f| f.max_u16.saturating_sub(f.min_u16)); + + Ok((numeric, enums, poi)) +} + +fn parse_numeric_filter_bounds(name: &str, rest: &str, entry: &str) -> Result<(f32, f32), String> { + let num_parts: Vec<&str> = rest.splitn(2, ':').collect(); + if num_parts.len() != 2 { + return Err(format!( + "Numeric filter '{name}' must have format 'name:min:max', got '{entry}'" + )); + } + let min = num_parts[0] + .trim() + .parse::() + .map_err(|err| format!("Invalid min value in filter '{name}': {err}"))?; + let max = num_parts[1] + .trim() + .parse::() + .map_err(|err| format!("Invalid max value in filter '{name}': {err}"))?; + if min.is_finite() && max.is_finite() && min > max { + return Err(format!( + "Numeric filter '{name}' has inverted range: min ({min}) > max ({max})" + )); + } + Ok((min, max)) +} + /// Check if a row passes all filters. /// All features (numeric and enum) are stored in feature_data as quantized u16. pub fn row_passes_filters( @@ -130,6 +239,18 @@ pub fn row_passes_filters( }) } +#[inline] +pub fn row_passes_poi_filters( + row: usize, + filters: &[ParsedPoiFilter], + poi_metrics: &PostcodePoiMetrics, +) -> bool { + filters.iter().all(|filter| { + let raw = poi_metrics.raw_for_property_row(row, filter.metric_idx); + raw != NAN_U16 && raw >= filter.min_u16 && raw <= filter.max_u16 + }) +} + /// Single-pass marginal impact counting. /// /// Returns `(total_passing, impacts)` where `impacts[i]` is how many MORE rows @@ -330,6 +451,35 @@ mod tests { assert_eq!(enums[0].allowed.len(), 2); } + #[test] + fn parse_filters_with_poi_splits_side_table_filters() { + let tq = test_quant(3, 2); + let poi_tq = test_quant(2, 2); + let poi_map: FxHashMap = [ + ("Distance to nearest cafe POI (km)".into(), 0), + ("Number of cafe POIs within 2km".into(), 1), + ] + .into_iter() + .collect(); + + let (numeric, enums, poi) = parse_filters_with_poi( + Some("price:100:500;;rating:A;;Distance to nearest cafe POI (km):0:1.5"), + &feature_name_to_index(), + &enum_values(), + &tq.as_ref(), + &poi_map, + &poi_tq.as_ref(), + ) + .unwrap(); + + assert_eq!(numeric.len(), 1); + assert_eq!(enums.len(), 1); + assert_eq!(poi.len(), 1); + assert_eq!(poi[0].metric_idx, 0); + assert_eq!(poi[0].min_u16, 0); + assert_eq!(poi[0].max_u16, 99); + } + #[test] fn parse_filters_empty() { let tq = test_quant(3, 2); diff --git a/server-rs/src/pocketbase.rs b/server-rs/src/pocketbase.rs index 130dd36..a86d4d8 100644 --- a/server-rs/src/pocketbase.rs +++ b/server-rs/src/pocketbase.rs @@ -88,6 +88,8 @@ struct CreateCollection { update_rule: Option, #[serde(skip_serializing_if = "Option::is_none")] delete_rule: Option, + #[serde(skip_serializing_if = "Vec::is_empty")] + indexes: Vec, } #[derive(Serialize)] @@ -308,12 +310,13 @@ async fn ensure_user_fields(client: &Client, base_url: &str, token: &str) -> any let has_ai_tokens_used = fields.iter().any(|f| f["name"] == "ai_tokens_used"); let has_ai_tokens_week = fields.iter().any(|f| f["name"] == "ai_tokens_week"); - if has_is_admin + let has_all_required_fields = has_is_admin && has_subscription && has_newsletter && has_ai_tokens_used - && has_ai_tokens_week - { + && has_ai_tokens_week; + + if has_all_required_fields { info!("PocketBase users collection already has all required fields"); return Ok(()); } @@ -372,6 +375,52 @@ async fn ensure_user_fields(client: &Client, base_url: &str, token: &str) -> any Ok(()) } +/// Ensure clients can manage normal account data but cannot self-grant paid or +/// admin-only state. Superuser writes from the Rust API bypass these rules. +async fn ensure_user_auth_rules( + client: &Client, + base_url: &str, + token: &str, +) -> anyhow::Result<()> { + let url = format!("{base_url}/api/collections/users"); + let self_only = "id = @request.auth.id"; + let protected_fields_absent = concat!( + "@request.body.subscription:isset = false", + " && @request.body.is_admin:isset = false", + " && @request.body.ai_tokens_used:isset = false", + " && @request.body.ai_tokens_week:isset = false" + ); + let protected_fields_unchanged = concat!( + "@request.body.subscription:changed = false", + " && @request.body.is_admin:changed = false", + " && @request.body.ai_tokens_used:changed = false", + " && @request.body.ai_tokens_week:changed = false" + ); + let update_rule = format!("{self_only} && {protected_fields_unchanged}"); + + let resp = client + .patch(&url) + .header("Authorization", format!("Bearer {token}")) + .json(&serde_json::json!({ + "listRule": self_only, + "viewRule": self_only, + "createRule": protected_fields_absent, + "updateRule": update_rule, + "deleteRule": self_only, + })) + .send() + .await?; + + if !resp.status().is_success() { + let status = resp.status(); + let text = resp.text().await.unwrap_or_default(); + anyhow::bail!("Failed to update users collection API rules ({status}): {text}"); + } + + info!("PocketBase users collection API rules hardened"); + Ok(()) +} + /// Ensure a collection has API rules allowing users to manage their own records. async fn ensure_user_owned_rules( client: &Client, @@ -404,6 +453,263 @@ async fn ensure_user_owned_rules( Ok(()) } +/// Ensure a collection is accessible only via server-side superuser calls. +async fn ensure_server_only_rules( + client: &Client, + base_url: &str, + token: &str, + collection_name: &str, +) -> anyhow::Result<()> { + let url = format!("{base_url}/api/collections/{collection_name}"); + let resp = client + .patch(&url) + .header("Authorization", format!("Bearer {token}")) + .json(&serde_json::json!({ + "listRule": serde_json::Value::Null, + "viewRule": serde_json::Value::Null, + "createRule": serde_json::Value::Null, + "updateRule": serde_json::Value::Null, + "deleteRule": serde_json::Value::Null, + })) + .send() + .await?; + + if !resp.status().is_success() { + let status = resp.status(); + let text = resp.text().await.unwrap_or_default(); + anyhow::bail!("Failed to lock {collection_name} API rules ({status}): {text}"); + } + + info!("PocketBase collection '{collection_name}' locked to superuser access"); + Ok(()) +} + +async fn ensure_checkout_sessions_fields( + client: &Client, + base_url: &str, + token: &str, +) -> anyhow::Result<()> { + let url = format!("{base_url}/api/collections/checkout_sessions"); + let resp = client + .get(&url) + .header("Authorization", format!("Bearer {token}")) + .send() + .await?; + + if !resp.status().is_success() { + let status = resp.status(); + let text = resp.text().await.unwrap_or_default(); + anyhow::bail!("Failed to fetch checkout_sessions collection ({status}): {text}"); + } + + let body: serde_json::Value = resp.json().await?; + let fields = body["fields"] + .as_array() + .ok_or_else(|| anyhow::anyhow!("checkout_sessions collection has no fields array"))?; + let users_id = find_users_collection_id(client, base_url, token).await?; + + let mut new_fields = fields.clone(); + let mut add_field = |name: &str, field: serde_json::Value| { + if !fields.iter().any(|f| f["name"] == name) { + new_fields.push(field); + } + }; + + add_field( + "user", + serde_json::json!({ + "name": "user", + "type": "relation", + "required": true, + "maxSelect": 1, + "collectionId": users_id, + }), + ); + add_field( + "stripe_session_id", + serde_json::json!({ "name": "stripe_session_id", "type": "text", "required": false }), + ); + add_field( + "checkout_url", + serde_json::json!({ "name": "checkout_url", "type": "text", "required": false }), + ); + add_field( + "amount_pence", + serde_json::json!({ "name": "amount_pence", "type": "number" }), + ); + add_field( + "expected_total_pence", + serde_json::json!({ "name": "expected_total_pence", "type": "number" }), + ); + add_field( + "currency", + serde_json::json!({ "name": "currency", "type": "text", "required": true }), + ); + add_field( + "discount_coupon_id", + serde_json::json!({ "name": "discount_coupon_id", "type": "text", "required": false }), + ); + add_field( + "referral_invite_id", + serde_json::json!({ "name": "referral_invite_id", "type": "text", "required": false }), + ); + add_field( + "status", + serde_json::json!({ "name": "status", "type": "text", "required": true }), + ); + add_field( + "expires_at_unix", + serde_json::json!({ "name": "expires_at_unix", "type": "number" }), + ); + add_field( + "paid_amount_pence", + serde_json::json!({ "name": "paid_amount_pence", "type": "number" }), + ); + add_field( + "completed_at_unix", + serde_json::json!({ "name": "completed_at_unix", "type": "text", "required": false }), + ); + + if new_fields.len() == fields.len() { + return Ok(()); + } + + let patch_resp = client + .patch(&url) + .header("Authorization", format!("Bearer {token}")) + .json(&serde_json::json!({ "fields": new_fields })) + .send() + .await?; + + if !patch_resp.status().is_success() { + let status = patch_resp.status(); + let text = patch_resp.text().await.unwrap_or_default(); + anyhow::bail!("Failed to patch checkout_sessions fields ({status}): {text}"); + } + + info!("PocketBase checkout_sessions collection fields updated"); + Ok(()) +} + +async fn ensure_checkout_locks_fields( + client: &Client, + base_url: &str, + token: &str, +) -> anyhow::Result<()> { + let url = format!("{base_url}/api/collections/checkout_locks"); + let resp = client + .get(&url) + .header("Authorization", format!("Bearer {token}")) + .send() + .await?; + + if !resp.status().is_success() { + let status = resp.status(); + let text = resp.text().await.unwrap_or_default(); + anyhow::bail!("Failed to fetch checkout_locks collection ({status}): {text}"); + } + + let body: serde_json::Value = resp.json().await?; + let fields = body["fields"] + .as_array() + .ok_or_else(|| anyhow::anyhow!("checkout_locks collection has no fields array"))?; + + let mut new_fields = fields.clone(); + let mut add_field = |name: &str, field: serde_json::Value| { + if !fields.iter().any(|f| f["name"] == name) { + new_fields.push(field); + } + }; + + add_field( + "name", + serde_json::json!({ "name": "name", "type": "text", "required": true }), + ); + add_field( + "owner", + serde_json::json!({ "name": "owner", "type": "text", "required": true }), + ); + add_field( + "expires_at_unix", + serde_json::json!({ "name": "expires_at_unix", "type": "number" }), + ); + + if new_fields.len() == fields.len() { + return Ok(()); + } + + let patch_resp = client + .patch(&url) + .header("Authorization", format!("Bearer {token}")) + .json(&serde_json::json!({ "fields": new_fields })) + .send() + .await?; + + if !patch_resp.status().is_success() { + let status = patch_resp.status(); + let text = patch_resp.text().await.unwrap_or_default(); + anyhow::bail!("Failed to patch checkout_locks fields ({status}): {text}"); + } + + info!("PocketBase checkout_locks collection fields updated"); + Ok(()) +} + +async fn ensure_collection_indexes( + client: &Client, + base_url: &str, + token: &str, + collection_name: &str, + required_indexes: &[(&str, &str)], +) -> anyhow::Result<()> { + let url = format!("{base_url}/api/collections/{collection_name}"); + let resp = client + .get(&url) + .header("Authorization", format!("Bearer {token}")) + .send() + .await?; + + if !resp.status().is_success() { + let status = resp.status(); + let text = resp.text().await.unwrap_or_default(); + anyhow::bail!("Failed to fetch {collection_name} collection ({status}): {text}"); + } + + let body: serde_json::Value = resp.json().await?; + let indexes = body["indexes"].as_array().cloned().unwrap_or_default(); + let mut new_indexes = indexes.clone(); + + for (index_name, create_sql) in required_indexes { + let exists = indexes + .iter() + .filter_map(|idx| idx.as_str()) + .any(|idx| idx.contains(index_name)); + if !exists { + new_indexes.push(serde_json::Value::String((*create_sql).to_string())); + } + } + + if new_indexes.len() == indexes.len() { + return Ok(()); + } + + let patch_resp = client + .patch(&url) + .header("Authorization", format!("Bearer {token}")) + .json(&serde_json::json!({ "indexes": new_indexes })) + .send() + .await?; + + if !patch_resp.status().is_success() { + let status = patch_resp.status(); + let text = patch_resp.text().await.unwrap_or_default(); + anyhow::bail!("Failed to patch {collection_name} indexes ({status}): {text}"); + } + + info!("PocketBase collection '{collection_name}' indexes updated"); + Ok(()) +} + /// Ensure the `saved_searches` collection has API rules allowing users to manage their own records. async fn ensure_saved_searches_rules( client: &Client, @@ -608,6 +914,7 @@ pub async fn ensure_collections( let existing = list_collections(client, base_url, &token).await?; ensure_user_fields(client, base_url, &token).await?; + ensure_user_auth_rules(client, base_url, &token).await?; if !existing.iter().any(|n| n == "saved_searches") { let users_id = find_users_collection_id(client, base_url, &token).await?; @@ -633,6 +940,7 @@ pub async fn ensure_collections( create_rule: user_only.clone(), update_rule: user_only.clone(), delete_rule: user_only, + indexes: Vec::new(), }, ) .await?; @@ -667,6 +975,7 @@ pub async fn ensure_collections( create_rule: user_only.clone(), update_rule: user_only.clone(), delete_rule: user_only, + indexes: Vec::new(), }, ) .await?; @@ -698,6 +1007,7 @@ pub async fn ensure_collections( create_rule: None, update_rule: None, delete_rule: None, + indexes: Vec::new(), }, ) .await?; @@ -705,6 +1015,86 @@ pub async fn ensure_collections( ensure_autodate_fields(client, base_url, &token, "invites").await?; } + if !existing.iter().any(|n| n == "checkout_sessions") { + let users_id = find_users_collection_id(client, base_url, &token).await?; + create_collection( + client, + base_url, + &token, + CreateCollection { + name: "checkout_sessions".to_string(), + r#type: "base".to_string(), + fields: vec![ + Field::relation("user", &users_id), + Field::text("stripe_session_id", false), + Field::text("checkout_url", false), + Field::number("amount_pence"), + Field::number("expected_total_pence"), + Field::text("currency", true), + Field::text("discount_coupon_id", false), + Field::text("referral_invite_id", false), + Field::text("status", true), + Field::number("expires_at_unix"), + Field::number("paid_amount_pence"), + Field::text("completed_at_unix", false), + Field::autodate("created", true, false), + Field::autodate("updated", true, true), + ], + list_rule: None, + view_rule: None, + create_rule: None, + update_rule: None, + delete_rule: None, + indexes: Vec::new(), + }, + ) + .await?; + } else { + ensure_server_only_rules(client, base_url, &token, "checkout_sessions").await?; + ensure_checkout_sessions_fields(client, base_url, &token).await?; + ensure_autodate_fields(client, base_url, &token, "checkout_sessions").await?; + } + + let checkout_locks_name_index = + "CREATE UNIQUE INDEX idx_checkout_locks_name ON checkout_locks (name)"; + if !existing.iter().any(|n| n == "checkout_locks") { + create_collection( + client, + base_url, + &token, + CreateCollection { + name: "checkout_locks".to_string(), + r#type: "base".to_string(), + fields: vec![ + Field::text("name", true), + Field::text("owner", true), + Field::number("expires_at_unix"), + Field::autodate("created", true, false), + Field::autodate("updated", true, true), + ], + list_rule: None, + view_rule: None, + create_rule: None, + update_rule: None, + delete_rule: None, + indexes: vec![checkout_locks_name_index.to_string()], + }, + ) + .await?; + } else { + ensure_server_only_rules(client, base_url, &token, "checkout_locks").await?; + ensure_checkout_locks_fields(client, base_url, &token).await?; + ensure_autodate_fields(client, base_url, &token, "checkout_locks").await?; + ensure_collection_indexes( + client, + base_url, + &token, + "checkout_locks", + &[("idx_checkout_locks_name", checkout_locks_name_index)], + ) + .await?; + } + if !existing.iter().any(|n| n == "short_urls") { create_collection( client, @@ -724,6 +1114,7 @@ pub async fn ensure_collections( create_rule: None, update_rule: None, delete_rule: None, + indexes: Vec::new(), }, ) .await?; @@ -753,6 +1144,7 @@ pub async fn ensure_collections( create_rule: None, update_rule: None, delete_rule: None, + indexes: Vec::new(), }, ) .await?; @@ -785,6 +1177,7 @@ pub async fn ensure_collections( create_rule: None, update_rule: None, delete_rule: None, + indexes: Vec::new(), }, ) .await?; diff --git a/server-rs/src/pocketbase_locks.rs b/server-rs/src/pocketbase_locks.rs new file mode 100644 index 0000000..e7a843f --- /dev/null +++ b/server-rs/src/pocketbase_locks.rs @@ -0,0 +1,264 @@ +use std::time::{Duration, Instant}; + +use anyhow::{anyhow, bail, Context}; +use rand::RngExt; +use serde_json::Value; +use tokio::time::sleep; +use tracing::warn; + +use crate::pocketbase::get_superuser_token; +use crate::state::AppState; + +const LOCK_COLLECTION: &str = "checkout_locks"; +const LOCK_ACQUIRE_TIMEOUT_SECS: u64 = 10; +const LOCK_RETRY_DELAY_MS: u64 = 100; + +pub struct PocketBaseLock { + client: reqwest::Client, + pb_url: String, + token: String, + record_id: Option, + name: String, +} + +struct ExistingLock { + id: String, + expires_at_unix: u64, +} + +pub async fn acquire_pocketbase_lock( + state: &AppState, + name: &str, + ttl_secs: u64, +) -> anyhow::Result { + validate_lock_name(name)?; + + let token = get_superuser_token(state).await?; + let pb_url = state.pocketbase_url.trim_end_matches('/').to_string(); + let owner = random_owner(); + let deadline = Instant::now() + Duration::from_secs(LOCK_ACQUIRE_TIMEOUT_SECS); + + loop { + let now = now_unix_secs(); + if let Some(record_id) = + try_create_lock(state, &pb_url, &token, name, &owner, now + ttl_secs).await? + { + return Ok(PocketBaseLock { + client: state.http_client.clone(), + pb_url, + token, + record_id: Some(record_id), + name: name.to_string(), + }); + } + + if let Some(existing) = find_lock(state, &pb_url, &token, name).await? { + if existing.expires_at_unix <= now { + if let Err(err) = delete_lock_record(state, &pb_url, &token, &existing.id).await { + warn!( + lock_name = name, + lock_id = %existing.id, + "Failed to delete stale PocketBase lock: {err}" + ); + } + continue; + } + } + + if Instant::now() >= deadline { + bail!("Timed out acquiring PocketBase lock '{name}'"); + } + + sleep(Duration::from_millis(LOCK_RETRY_DELAY_MS)).await; + } +} + +impl PocketBaseLock { + pub async fn release(mut self) -> anyhow::Result<()> { + let Some(record_id) = self.record_id.take() else { + return Ok(()); + }; + release_lock_record(&self.client, &self.pb_url, &self.token, &record_id) + .await + .with_context(|| format!("Failed to release PocketBase lock '{}'", self.name)) + } +} + +impl Drop for PocketBaseLock { + fn drop(&mut self) { + let Some(record_id) = self.record_id.take() else { + return; + }; + + let client = self.client.clone(); + let pb_url = self.pb_url.clone(); + let token = self.token.clone(); + let name = self.name.clone(); + tokio::spawn(async move { + if let Err(err) = release_lock_record(&client, &pb_url, &token, &record_id).await { + warn!( + lock_name = %name, + lock_id = %record_id, + "Failed to release PocketBase lock on drop: {err}" + ); + } + }); + } +} + +async fn try_create_lock( + state: &AppState, + pb_url: &str, + token: &str, + name: &str, + owner: &str, + expires_at_unix: u64, +) -> anyhow::Result> { + let url = format!("{pb_url}/api/collections/{LOCK_COLLECTION}/records"); + let resp = state + .http_client + .post(&url) + .header("Authorization", format!("Bearer {token}")) + .json(&serde_json::json!({ + "name": name, + "owner": owner, + "expires_at_unix": expires_at_unix, + })) + .send() + .await?; + + if resp.status().is_success() { + let body: Value = resp.json().await?; + return body["id"] + .as_str() + .map(str::to_string) + .map(Some) + .ok_or_else(|| anyhow!("PocketBase lock record missing id")); + } + + let status = resp.status(); + let text = resp.text().await.unwrap_or_default(); + if status.is_client_error() { + return Ok(None); + } + + Err(anyhow!("PocketBase lock create failed ({status}): {text}")) +} + +async fn find_lock( + state: &AppState, + pb_url: &str, + token: &str, + name: &str, +) -> anyhow::Result> { + let filter = format!("name=\"{}\"", name); + let url = format!( + "{pb_url}/api/collections/{LOCK_COLLECTION}/records?filter={}&perPage=1", + urlencoding::encode(&filter) + ); + let resp = state + .http_client + .get(&url) + .header("Authorization", format!("Bearer {token}")) + .send() + .await?; + + ensure_success_ref(&resp).await?; + + let body: Value = resp.json().await?; + let Some(item) = body["items"].as_array().and_then(|items| items.first()) else { + return Ok(None); + }; + let id = item["id"] + .as_str() + .ok_or_else(|| anyhow!("PocketBase lock missing id"))? + .to_string(); + let expires_at_unix = number_field(item, "expires_at_unix").unwrap_or(0); + + Ok(Some(ExistingLock { + id, + expires_at_unix, + })) +} + +async fn delete_lock_record( + state: &AppState, + pb_url: &str, + token: &str, + record_id: &str, +) -> anyhow::Result<()> { + release_lock_record(&state.http_client, pb_url, token, record_id).await +} + +async fn release_lock_record( + client: &reqwest::Client, + pb_url: &str, + token: &str, + record_id: &str, +) -> anyhow::Result<()> { + let url = format!("{pb_url}/api/collections/{LOCK_COLLECTION}/records/{record_id}"); + let resp = client + .delete(&url) + .header("Authorization", format!("Bearer {token}")) + .send() + .await?; + + if resp.status().is_success() || resp.status() == reqwest::StatusCode::NOT_FOUND { + return Ok(()); + } + + let status = resp.status(); + let text = resp.text().await.unwrap_or_default(); + Err(anyhow!("PocketBase lock delete failed ({status}): {text}")) +} + +fn validate_lock_name(name: &str) -> anyhow::Result<()> { + if name.is_empty() || name.len() > 80 { + bail!("invalid PocketBase lock name length"); + } + if !name + .bytes() + .all(|b| b.is_ascii_alphanumeric() || b == b':' || b == b'_' || b == b'-') + { + bail!("invalid PocketBase lock name characters"); + } + Ok(()) +} + +fn random_owner() -> String { + let mut rng = rand::rng(); + (0..24) + .map(|_| { + let idx: u8 = rng.random_range(0..36); + if idx < 10 { + (b'0' + idx) as char + } else { + (b'a' + idx - 10) as char + } + }) + .collect() +} + +fn now_unix_secs() -> u64 { + std::time::SystemTime::now() + .duration_since(std::time::UNIX_EPOCH) + .unwrap_or_default() + .as_secs() +} + +fn number_field(value: &Value, field: &str) -> Option { + value[field].as_u64().or_else(|| { + value[field] + .as_f64() + .filter(|n| n.is_finite() && *n >= 0.0 && n.fract() == 0.0) + .map(|n| n as u64) + }) +} + +async fn ensure_success_ref(resp: &reqwest::Response) -> anyhow::Result<()> { + if resp.status().is_success() { + return Ok(()); + } + + Err(anyhow!("upstream returned {}", resp.status())) +} diff --git a/server-rs/src/routes/checkout.rs b/server-rs/src/routes/checkout.rs index 34bf338..cf3db11 100644 --- a/server-rs/src/routes/checkout.rs +++ b/server-rs/src/routes/checkout.rs @@ -8,10 +8,8 @@ use serde::{Deserialize, Serialize}; use tracing::{info, warn}; use crate::auth::OptionalUser; -use crate::pocketbase::get_superuser_token; -use crate::state::{AppState, SharedState}; - -use super::pricing::{count_licensed_users, price_for_count}; +use crate::checkout_sessions::{start_license_checkout, CheckoutStart}; +use crate::state::SharedState; #[derive(Deserialize)] pub struct CheckoutRequest { @@ -23,8 +21,8 @@ struct CheckoutResponse { url: String, } -/// Create a Stripe Checkout session for the lifetime license (or grant for free if in free tier). -/// Requires authentication. Optionally accepts a referral code to apply a coupon. +/// Create a reserved Stripe Checkout session for the lifetime license. +/// Requires authentication. Referral discounts are issued via invite redemption. pub async fn post_checkout( State(shared): State>, Extension(user): Extension, @@ -36,147 +34,27 @@ pub async fn post_checkout( None => return StatusCode::UNAUTHORIZED.into_response(), }; - let count = match count_licensed_users(&state).await { - Ok(c) => c, - Err(err) => { - warn!("Failed to count licensed users at checkout: {err}"); - return StatusCode::SERVICE_UNAVAILABLE.into_response(); - } - }; - - let price_pence = price_for_count(count); let public_url = &state.public_url; let success_url = format!("{public_url}/pricing?license_success=1"); - - // Free tier — grant license directly without Stripe - if price_pence == 0 { - if let Err(err) = grant_license(&state, &user.id).await { - warn!(user_id = %user.id, "Failed to grant free license: {err}"); - return StatusCode::BAD_GATEWAY.into_response(); - } - info!(user_id = %user.id, "Granted free early-bird license"); - return Json(CheckoutResponse { url: success_url }).into_response(); - } - - // Paid tier — create Stripe checkout with dynamic price - let secret_key = &state.stripe_secret_key; let cancel_url = format!("{public_url}/pricing"); - let mut form_params = vec![ - ("mode", "payment".to_string()), - ( - "line_items[0][price_data][unit_amount]", - price_pence.to_string(), - ), - ("line_items[0][price_data][currency]", "gbp".to_string()), - ( - "line_items[0][price_data][product_data][name]", - "Perfect Postcodes Lifetime License".to_string(), - ), - ("line_items[0][quantity]", "1".to_string()), - ("success_url", success_url), - ("cancel_url", cancel_url), - ("client_reference_id", user.id.clone()), - ("customer_email", user.email.clone()), - ]; - - // If a referral code is provided and valid, look it up and apply the coupon - if let Some(ref code) = req.referral_code { - if validate_referral_invite(&state, code).await { - form_params.push(( - "discounts[0][coupon]", - state.stripe_referral_coupon_id.clone(), - )); - info!(code = %code, "Applying referral coupon to checkout"); - } else { - warn!(code = %code, "Referral code validation failed, proceeding without discount"); - } + if req.referral_code.is_some() { + return ( + StatusCode::BAD_REQUEST, + "Referral codes must be redeemed from the invite link", + ) + .into_response(); } - let res = state - .http_client - .post("https://api.stripe.com/v1/checkout/sessions") - .basic_auth(secret_key, None::<&str>) - .form(&form_params) - .send() - .await; - - match res { - Ok(resp) if resp.status().is_success() => { - let body: serde_json::Value = match resp.json().await { - Ok(v) => v, - Err(err) => { - warn!("Failed to parse Stripe response: {err}"); - return StatusCode::BAD_GATEWAY.into_response(); - } - }; - let url = body["url"].as_str().unwrap_or_default().to_string(); - if url.is_empty() { - warn!("Stripe session missing URL"); - return StatusCode::BAD_GATEWAY.into_response(); - } - info!(user_id = %user.id, price_pence, "Created Stripe checkout session"); - Json(CheckoutResponse { url }).into_response() - } - Ok(resp) => { - let status = resp.status(); - let text = resp.text().await.unwrap_or_default(); - warn!("Stripe checkout failed ({status}): {text}"); - StatusCode::BAD_GATEWAY.into_response() + match start_license_checkout(&state, &user, &success_url, &cancel_url, None, None).await { + Ok(CheckoutStart::Free) => { + info!(user_id = %user.id, "Granted free early-bird license"); + Json(CheckoutResponse { url: success_url }).into_response() } + Ok(CheckoutStart::Stripe { url }) => Json(CheckoutResponse { url }).into_response(), Err(err) => { - warn!("Stripe request error: {err}"); + warn!(user_id = %user.id, "Failed to start checkout: {err:?}"); StatusCode::BAD_GATEWAY.into_response() } } } - -/// Grant a license by updating the user's subscription to "licensed" in PocketBase. -async fn grant_license(state: &AppState, user_id: &str) -> anyhow::Result<()> { - let token = get_superuser_token(state).await?; - - let pb_url = state.pocketbase_url.trim_end_matches('/'); - let url = format!("{pb_url}/api/collections/users/records/{user_id}"); - let resp = state - .http_client - .patch(&url) - .header("Authorization", format!("Bearer {token}")) - .json(&serde_json::json!({ "subscription": "licensed" })) - .send() - .await?; - - if !resp.status().is_success() { - let status = resp.status(); - let text = resp.text().await.unwrap_or_default(); - anyhow::bail!("PocketBase update failed ({status}): {text}"); - } - - state.token_cache.invalidate_by_user_id(user_id); - Ok(()) -} - -/// Check if a referral invite code exists and is unused. -async fn validate_referral_invite(state: &AppState, code: &str) -> bool { - // Only allow alphanumeric codes to prevent PocketBase filter injection - if code.is_empty() || code.len() > 20 || !code.bytes().all(|b| b.is_ascii_alphanumeric()) { - return false; - } - - let pb_url = state.pocketbase_url.trim_end_matches('/'); - let filter = format!( - "code=\"{}\" && invite_type=\"referral\" && used_by_id=\"\"", - code - ); - let url = format!( - "{pb_url}/api/collections/invites/records?filter={}&perPage=1", - urlencoding::encode(&filter) - ); - - match state.http_client.get(&url).send().await { - Ok(resp) if resp.status().is_success() => { - let body: serde_json::Value = resp.json().await.unwrap_or_default(); - body["totalItems"].as_u64().unwrap_or(0) > 0 - } - _ => false, - } -} diff --git a/server-rs/src/routes/export.rs b/server-rs/src/routes/export.rs index 56087f5..f60ae09 100644 --- a/server-rs/src/routes/export.rs +++ b/server-rs/src/routes/export.rs @@ -1,6 +1,7 @@ use std::collections::hash_map::DefaultHasher; use std::hash::{Hash, Hasher}; use std::sync::Arc; +use std::time::Duration; use axum::extract::{Query, State}; use axum::http::{header, HeaderMap, StatusCode}; @@ -13,14 +14,18 @@ use tracing::{info, warn}; use crate::auth::OptionalUser; use crate::consts::NAN_U16; -use crate::data::QuantRef; -use crate::features::INTEGER_BIN_FEATURES; +use crate::data::{PostcodePoiMetrics, QuantRef}; +use crate::features; use crate::licensing::check_license_bounds; -use crate::parsing::{parse_field_indices, parse_filters, require_bounds, row_passes_filters}; +use crate::parsing::{ + parse_field_indices_with_poi, parse_filters_with_poi, require_bounds, row_passes_filters, + row_passes_poi_filters, +}; use crate::routes::{fetch_screenshot_bytes, FeatureInfo}; use crate::state::SharedState; const MAX_EXPORT_POSTCODES: usize = 250; +const EXPORT_SCREENSHOT_TIMEOUT_SECS: u64 = 12; /// Height (in pixels) reserved for the screenshot row const IMAGE_ROW_HEIGHT: f64 = 225.0; @@ -41,11 +46,11 @@ struct PostcodeExportAgg { } impl PostcodeExportAgg { - fn new(num_features: usize) -> Self { + fn new(total_features: usize) -> Self { Self { count: 0, - sums: vec![0.0; num_features], - finite_counts: vec![0; num_features], + sums: vec![0.0; total_features], + finite_counts: vec![0; total_features], enum_freqs: FxHashMap::default(), } } @@ -58,6 +63,7 @@ impl PostcodeExportAgg { num_features: usize, enum_indices: &FxHashMap, quant: &QuantRef, + poi_metrics: &PostcodePoiMetrics, ) { self.count += 1; let base = row * num_features; @@ -79,6 +85,18 @@ impl PostcodeExportAgg { self.finite_counts[feat_idx] += 1; } } + + let poi_offset = num_features; + for metric_idx in 0..poi_metrics.num_features() { + let raw = poi_metrics.raw_for_property_row(row, metric_idx); + if raw == NAN_U16 { + continue; + } + let value = poi_metrics.decode_raw(metric_idx, raw); + let out_idx = poi_offset + metric_idx; + self.sums[out_idx] += value as f64; + self.finite_counts[out_idx] += 1; + } } } @@ -138,13 +156,17 @@ pub async fn get_export( check_license_bounds(&user.0, (south, west, north, east), None)?; let quant = state.data.quant_ref(); - let (parsed_filters, parsed_enum_filters) = parse_filters( + let poi_quant = state.data.poi_metrics.quant_ref(); + let (parsed_filters, parsed_enum_filters, parsed_poi_filters) = parse_filters_with_poi( params.filters.as_deref(), &state.feature_name_to_index, &state.data.enum_values, &quant, + &state.data.poi_metrics.name_to_index, + &poi_quant, ) .map_err(|err| (StatusCode::BAD_REQUEST, err).into_response())?; + let has_poi_filters = !parsed_poi_filters.is_empty(); let filters_str = params.filters; let fields_str = params.fields; @@ -164,16 +186,28 @@ pub async fn get_export( // Fetch screenshot (async, before spawn_blocking) let auth_header = headers.get(header::AUTHORIZATION); - let screenshot_bytes = match fetch_screenshot_bytes(&state, &frontend_params, auth_header).await + let screenshot_fetch = fetch_screenshot_bytes(&state, &frontend_params, auth_header); + let screenshot_bytes = match tokio::time::timeout( + Duration::from_secs(EXPORT_SCREENSHOT_TIMEOUT_SECS), + screenshot_fetch, + ) + .await { - Ok(bytes) => { + Ok(Ok(bytes)) => { info!(bytes = bytes.len(), "Fetched screenshot for export"); Some(bytes) } - Err(err) => { + Ok(Err(err)) => { warn!("Screenshot failed for export: {err}"); None } + Err(_) => { + warn!( + timeout_secs = EXPORT_SCREENSHOT_TIMEOUT_SECS, + "Screenshot timed out for export" + ); + None + } }; // Build feature name → description map from the precomputed features response @@ -200,6 +234,9 @@ pub async fn get_export( let feature_names = &state.data.feature_names; let enum_values = &state.data.enum_values; let postcode_data = &state.postcode_data; + let poi_metrics = &state.data.poi_metrics; + let poi_offset = num_features; + let total_export_features = num_features + poi_metrics.num_features(); // Build set of enum feature indices for quick lookup let enum_indices: FxHashMap = enum_values.keys().map(|&idx| (idx, ())).collect(); @@ -219,6 +256,10 @@ pub async fn get_export( ) { return; } + if has_poi_filters && !row_passes_poi_filters(row, &parsed_poi_filters, poi_metrics) + { + return; + } let postcode = state.data.postcode(row); if let Some(&pc_idx) = postcode_data.postcode_to_idx.get(postcode) { postcode_rows.entry(pc_idx).or_default().push(row); @@ -229,9 +270,16 @@ pub async fn get_export( let mut postcode_aggs: Vec<(usize, PostcodeExportAgg)> = Vec::with_capacity(postcode_rows.len()); for (pc_idx, rows) in postcode_rows { - let mut agg = PostcodeExportAgg::new(num_features); + let mut agg = PostcodeExportAgg::new(total_export_features); for &row in &rows { - agg.add_row(feature_data, row, num_features, &enum_indices, &quant); + agg.add_row( + feature_data, + row, + num_features, + &enum_indices, + &quant, + poi_metrics, + ); } if agg.count > 0 { postcode_aggs.push((pc_idx, agg)); @@ -265,14 +313,19 @@ pub async fn get_export( // Determine column order: filter features first, then remaining let filter_feature_names = extract_filter_feature_names(filters_str.as_deref()); - let field_indices = - parse_field_indices(fields_str.as_deref(), &state.feature_name_to_index) - .map_err(|err| err.1)?; + let field_indices = parse_field_indices_with_poi( + fields_str.as_deref(), + &state.feature_name_to_index, + &state.data.poi_metrics.name_to_index, + ) + .map_err(|err| err.1)?; - let all_feature_indices: Vec = if let Some(ref indices) = field_indices { - indices.clone() + let all_feature_indices: Vec = if let Some(ref indices) = field_indices.normal { + let mut selected = indices.clone(); + selected.extend(field_indices.poi.iter().map(|idx| poi_offset + *idx)); + selected } else { - let mut ordered = Vec::with_capacity(num_features); + let mut ordered = Vec::with_capacity(total_export_features); let mut used = FxHashSet::default(); for name in &filter_feature_names { @@ -280,6 +333,11 @@ pub async fn get_export( if used.insert(idx) { ordered.push(idx); } + } else if let Some(&idx) = state.data.poi_metrics.name_to_index.get(name.as_str()) { + let virtual_idx = poi_offset + idx; + if used.insert(virtual_idx) { + ordered.push(virtual_idx); + } } } for idx in 0..num_features { @@ -287,15 +345,42 @@ pub async fn get_export( ordered.push(idx); } } + for idx in 0..poi_metrics.num_features() { + let virtual_idx = poi_offset + idx; + if used.insert(virtual_idx) { + ordered.push(virtual_idx); + } + } ordered }; // Filter-only feature indices for the Selected sheet let filter_feature_indices: Vec = filter_feature_names .iter() - .filter_map(|name| state.feature_name_to_index.get(name.as_str()).copied()) + .filter_map(|name| { + state + .feature_name_to_index + .get(name.as_str()) + .copied() + .or_else(|| { + state + .data + .poi_metrics + .name_to_index + .get(name.as_str()) + .map(|idx| poi_offset + *idx) + }) + }) .collect(); + let feature_name_for_idx = |idx: usize| -> &str { + if idx < num_features { + &feature_names[idx] + } else { + &poi_metrics.feature_names[idx - poi_offset] + } + }; + // Build feature unit map (feat_idx → (prefix, suffix)) for number formatting let feature_units: FxHashMap = state .features_response @@ -309,16 +394,25 @@ pub async fn get_export( suffix, .. } => { - let idx = state.feature_name_to_index.get(name.as_str())?; - Some((*idx, (*prefix, *suffix))) + if let Some(&idx) = state.feature_name_to_index.get(name.as_str()) { + Some((idx, (*prefix, *suffix))) + } else { + state + .data + .poi_metrics + .name_to_index + .get(name.as_str()) + .map(|idx| (poi_offset + *idx, (*prefix, *suffix))) + } } _ => None, }) .collect(); - let integer_feature_indices: FxHashSet = INTEGER_BIN_FEATURES + let integer_feature_indices: FxHashSet = all_feature_indices .iter() - .filter_map(|name| state.feature_name_to_index.get(*name).copied()) + .copied() + .filter(|&idx| features::has_integer_bins(feature_name_for_idx(idx))) .collect(); // Build Excel number formats per feature index for unit display @@ -435,7 +529,7 @@ pub async fn get_export( .write_string_with_format( header_row, col, - &feature_names[feat_idx], + feature_name_for_idx(feat_idx), &header_fmt, ) .map_err(|e| format!("Failed to write header: {e}"))?; @@ -453,7 +547,7 @@ pub async fn get_export( for (col_offset, &feat_idx) in feat_indices.iter().enumerate() { let col = (col_offset + 2) as u16; let desc = feature_descriptions - .get(&feature_names[feat_idx]) + .get(feature_name_for_idx(feat_idx)) .map(String::as_str) .unwrap_or(""); sheet @@ -477,7 +571,7 @@ pub async fn get_export( for (col_offset, &feat_idx) in feat_indices.iter().enumerate() { let col = (col_offset + 2) as u16; - if enum_indices.contains_key(&feat_idx) { + if feat_idx < num_features && enum_indices.contains_key(&feat_idx) { if let Some(freqs) = agg.enum_freqs.get(&feat_idx) { if let Some((&mode_bits, _)) = freqs.iter().max_by_key(|(_, &count)| count) @@ -543,7 +637,7 @@ pub async fn get_export( .map_err(|e| format!("Failed to set column width: {e}"))?; for col_offset in 0..feat_indices.len() { let col = (col_offset + 2) as u16; - let feat_name = &feature_names[feat_indices[col_offset]]; + let feat_name = feature_name_for_idx(feat_indices[col_offset]); let width = (feat_name.len() as f64 * 1.1).clamp(10.0, 30.0); sheet .set_column_width(col, width) diff --git a/server-rs/src/routes/features.rs b/server-rs/src/routes/features.rs index 91292b5..5d34d3c 100644 --- a/server-rs/src/routes/features.rs +++ b/server-rs/src/routes/features.rs @@ -7,7 +7,7 @@ use serde::Serialize; use tracing::info; use crate::data::{Histogram, PropertyData}; -use crate::features::{Feature, FEATURE_GROUPS}; +use crate::features::{self, Feature, FEATURE_GROUPS}; use crate::state::SharedState; fn is_empty(val: &str) -> bool { @@ -28,9 +28,9 @@ pub enum FeatureInfo { max: f32, step: f32, histogram: Histogram, - description: &'static str, - detail: &'static str, - source: &'static str, + description: String, + detail: String, + source: String, #[serde(skip_serializing_if = "is_empty")] prefix: &'static str, #[serde(skip_serializing_if = "is_empty")] @@ -45,9 +45,9 @@ pub enum FeatureInfo { name: String, values: Vec, counts: HashMap, - description: &'static str, - detail: &'static str, - source: &'static str, + description: String, + detail: String, + source: String, }, } @@ -85,9 +85,9 @@ pub fn build_features_response(data: &PropertyData) -> FeaturesResponse { max: stats.slider_max, step: config.step, histogram: stats.histogram.clone(), - description: config.description, - detail: config.detail, - source: config.source, + description: config.description.to_string(), + detail: config.detail.to_string(), + source: config.source.to_string(), prefix: config.prefix, suffix: config.suffix, raw: config.raw, @@ -118,9 +118,9 @@ pub fn build_features_response(data: &PropertyData) -> FeaturesResponse { name: config.name.to_string(), values: values.clone(), counts, - description: config.description, - detail: config.detail, - source: config.source, + description: config.description.to_string(), + detail: config.detail.to_string(), + source: config.source.to_string(), }); } } @@ -136,6 +136,58 @@ pub fn build_features_response(data: &PropertyData) -> FeaturesResponse { } } + let mut dynamic_poi_features = Vec::new(); + for (feat_idx, name) in data.poi_metrics.feature_names.iter().enumerate() { + if let Some(category) = features::dynamic_poi_distance_category(name) { + let stats = &data.poi_metrics.feature_stats[feat_idx]; + dynamic_poi_features.push(FeatureInfo::Numeric { + name: name.clone(), + min: stats.slider_min, + max: stats.slider_max, + step: 0.1, + histogram: stats.histogram.clone(), + description: format!("Distance to the closest {category} POI"), + detail: format!( + "Straight-line distance in kilometres from the postcode to the nearest {category} point of interest in the POI dataset." + ), + source: "osm-pois".to_string(), + prefix: "", + suffix: " km", + raw: false, + absolute: false, + }); + } else if let Some(category) = features::dynamic_poi_count_category(name) { + let stats = &data.poi_metrics.feature_stats[feat_idx]; + let radius = features::dynamic_poi_count_radius(name).unwrap_or(0); + dynamic_poi_features.push(FeatureInfo::Numeric { + name: name.clone(), + min: stats.slider_min, + max: stats.slider_max, + step: 1.0, + histogram: stats.histogram.clone(), + description: format!("Number of {category} POIs within {radius}km"), + detail: format!( + "Count of {category} points of interest within a {radius}km radius of the property's postcode centroid." + ), + source: "osm-pois".to_string(), + prefix: "", + suffix: "", + raw: false, + absolute: false, + }); + } + } + if !dynamic_poi_features.is_empty() { + dynamic_poi_features.sort_by_key(|feature| match feature { + FeatureInfo::Numeric { name, .. } => features::dynamic_poi_feature_sort_key(name), + FeatureInfo::Enum { name, .. } => features::dynamic_poi_feature_sort_key(name), + }); + groups.push(FeatureGroupResponse { + name: "Nearby POIs".to_string(), + features: dynamic_poi_features, + }); + } + FeaturesResponse { groups } } diff --git a/server-rs/src/routes/filter_counts.rs b/server-rs/src/routes/filter_counts.rs index c6f12a1..08d20ef 100644 --- a/server-rs/src/routes/filter_counts.rs +++ b/server-rs/src/routes/filter_counts.rs @@ -9,7 +9,7 @@ use tracing::info; use crate::consts::NAN_U16; use crate::data::travel_time::TravelData; -use crate::parsing::{parse_filters, require_bounds}; +use crate::parsing::{parse_filters_with_poi, require_bounds}; use crate::routes::travel_time::parse_optional_travel; use crate::state::SharedState; @@ -36,18 +36,21 @@ pub async fn get_filter_counts( require_bounds(params.bounds).map_err(IntoResponse::into_response)?; let quant = state.data.quant_ref(); - let (parsed_filters, parsed_enum_filters) = parse_filters( + let poi_quant = state.data.poi_metrics.quant_ref(); + let (parsed_filters, parsed_enum_filters, parsed_poi_filters) = parse_filters_with_poi( params.filters.as_deref(), &state.feature_name_to_index, &state.data.enum_values, &quant, + &state.data.poi_metrics.name_to_index, + &poi_quant, ) .map_err(|err| (StatusCode::BAD_REQUEST, err).into_response())?; let travel_entries = parse_optional_travel(params.travel.as_deref()) .map_err(|err| (StatusCode::BAD_REQUEST, err).into_response())?; - let num_regular = parsed_filters.len() + parsed_enum_filters.len(); + let num_regular = parsed_filters.len() + parsed_enum_filters.len() + parsed_poi_filters.len(); // Only travel entries with a filter range count as filters for impact tracking let travel_filter_indices: Vec = travel_entries .iter() @@ -65,6 +68,7 @@ pub async fn get_filter_counts( } let filters_str = params.filters; + let has_poi_filters = !parsed_poi_filters.is_empty(); let response = tokio::task::spawn_blocking(move || -> Result { let t0 = std::time::Instant::now(); @@ -124,6 +128,23 @@ pub async fn get_filter_counts( } } + // Test travel time filters + if fail_count <= 1 && has_poi_filters { + for (i, f) in parsed_poi_filters.iter().enumerate() { + let raw = state + .data + .poi_metrics + .raw_for_property_row(row, f.metric_idx); + if raw == NAN_U16 || raw < f.min_u16 || raw > f.max_u16 { + fail_count += 1; + fail_index = parsed_filters.len() + parsed_enum_filters.len() + i; + if fail_count > 1 { + break; + } + } + } + } + // Test travel time filters if fail_count <= 1 && has_travel { let postcode = pc_interner.resolve(&pc_keys[row]); @@ -169,8 +190,15 @@ pub async fn get_filter_counts( let name = if i < parsed_filters.len() { state.data.feature_names[parsed_filters[i].feat_idx].clone() } else if i < num_regular { - let ei = i - parsed_filters.len(); - state.data.feature_names[parsed_enum_filters[ei].feat_idx].clone() + let enum_start = parsed_filters.len(); + let poi_start = enum_start + parsed_enum_filters.len(); + if i < poi_start { + let ei = i - enum_start; + state.data.feature_names[parsed_enum_filters[ei].feat_idx].clone() + } else { + let pi = i - poi_start; + state.data.poi_metrics.feature_names[parsed_poi_filters[pi].metric_idx].clone() + } } else { let slot = i - num_regular; let ti = travel_filter_indices[slot]; diff --git a/server-rs/src/routes/hexagon_stats.rs b/server-rs/src/routes/hexagon_stats.rs index 9bbb4cf..01226a1 100644 --- a/server-rs/src/routes/hexagon_stats.rs +++ b/server-rs/src/routes/hexagon_stats.rs @@ -13,8 +13,8 @@ use tracing::{info, warn}; use crate::auth::OptionalUser; use crate::licensing::{check_license_bounds, resolve_share_code}; use crate::parsing::{ - cell_for_row_cached, h3_cell_bounds, needs_parent, parse_field_set, parse_filters, - row_passes_filters, validate_h3_resolution, + cell_for_row_cached, h3_cell_bounds, needs_parent, parse_field_set, parse_filters_with_poi, + row_passes_filters, row_passes_poi_filters, validate_h3_resolution, }; use crate::state::SharedState; @@ -110,15 +110,19 @@ pub async fn get_hexagon_stats( let h3_str = params.h3; let quant = state.data.quant_ref(); - let (parsed_filters, parsed_enum_filters) = parse_filters( + let poi_quant = state.data.poi_metrics.quant_ref(); + let (parsed_filters, parsed_enum_filters, parsed_poi_filters) = parse_filters_with_poi( params.filters.as_deref(), &state.feature_name_to_index, &state.data.enum_values, &quant, + &state.data.poi_metrics.name_to_index, + &poi_quant, ) .map_err(|err| (StatusCode::BAD_REQUEST, err).into_response())?; - let num_filters = parsed_filters.len() + parsed_enum_filters.len(); + let num_filters = parsed_filters.len() + parsed_enum_filters.len() + parsed_poi_filters.len(); let filters_str = params.filters; + let has_poi_filters = !parsed_poi_filters.is_empty(); let (fields_specified, field_set) = parse_field_set(params.fields.as_deref()); @@ -161,6 +165,12 @@ pub async fn get_hexagon_stats( feature_data, num_features, ) + && (!has_poi_filters + || row_passes_poi_filters( + row, + &parsed_poi_filters, + &state.data.poi_metrics, + )) { if has_travel { let postcode = state.data.postcode(row); @@ -233,7 +243,7 @@ pub async fn get_hexagon_stats( let price_history = stats::extract_price_history(&matching_rows, &state.data, &state.feature_name_to_index); - let (numeric_features, enum_features_out) = stats::compute_feature_stats( + let (mut numeric_features, enum_features_out) = stats::compute_feature_stats( &matching_rows, &state.data, &state.data.feature_names, @@ -242,6 +252,12 @@ pub async fn get_hexagon_stats( fields_specified, &field_set, ); + numeric_features.extend(stats::compute_poi_feature_stats( + &matching_rows, + &state.data.poi_metrics, + fields_specified, + &field_set, + )); let elapsed = start_time.elapsed(); info!( diff --git a/server-rs/src/routes/hexagons.rs b/server-rs/src/routes/hexagons.rs index fe557e0..434deaa 100644 --- a/server-rs/src/routes/hexagons.rs +++ b/server-rs/src/routes/hexagons.rs @@ -11,14 +11,15 @@ use serde::{Deserialize, Serialize}; use serde_json::{Map, Value}; use tracing::info; -use crate::aggregation::{Aggregator, EnumDistConfig}; +use crate::aggregation::{Aggregator, EnumDistConfig, PoiAggregator}; use crate::auth::OptionalUser; use crate::consts::MAX_CELLS_PER_REQUEST; use crate::data::travel_time::TravelData; use crate::licensing::{check_license_bounds, resolve_share_code}; use crate::parsing::{ - cell_for_row_cached, needs_parent, parse_enum_dist, parse_field_indices, parse_filters, - require_bounds, row_passes_filters, validate_h3_resolution, + cell_for_row_cached, needs_parent, parse_enum_dist, parse_field_indices_with_poi, + parse_filters_with_poi, require_bounds, row_passes_filters, row_passes_poi_filters, + validate_h3_resolution, }; use crate::routes::travel_time::{parse_optional_travel, TravelTimeAgg}; use crate::state::SharedState; @@ -29,6 +30,7 @@ const PARALLEL_THRESHOLD: usize = 50_000; /// Per-thread aggregation result: feature accumulators + travel time accumulators. type ChunkResult = ( FxHashMap, + FxHashMap, Vec>, ); @@ -79,11 +81,14 @@ pub struct HexagonParams { #[allow(clippy::too_many_arguments)] fn build_feature_maps( groups: &FxHashMap, + poi_groups: &FxHashMap, min_keys: &[String], max_keys: &[String], avg_keys: &[String], num_features: usize, indices: Option<&[usize]>, + poi_feature_names: &[String], + poi_indices: &[usize], query_bounds: (f64, f64, f64, f64), resolution: h3o::Resolution, travel_aggs: &[FxHashMap], @@ -163,6 +168,25 @@ fn build_feature_maps( } } + if let Some(poi_aggregation) = poi_groups.get(&cell_id) { + for &metric_idx in poi_indices { + if poi_aggregation.counts[metric_idx] > 0 { + let avg = poi_aggregation.sums[metric_idx] + / poi_aggregation.counts[metric_idx] as f64; + if let (Some(min_num), Some(max_num), Some(avg_num)) = ( + serde_json::Number::from_f64(poi_aggregation.mins[metric_idx] as f64), + serde_json::Number::from_f64(poi_aggregation.maxs[metric_idx] as f64), + serde_json::Number::from_f64(avg), + ) { + let name = &poi_feature_names[metric_idx]; + map.insert(format!("min_{name}"), Value::Number(min_num)); + map.insert(format!("max_{name}"), Value::Number(max_num)); + map.insert(format!("avg_{name}"), Value::Number(avg_num)); + } + } + } + } + // Add travel time aggregation fields (using pre-computed key strings) for (ti, agg_map) in travel_aggs.iter().enumerate() { if let Some(agg) = agg_map.get(&cell_id) { @@ -209,18 +233,25 @@ pub async fn get_hexagons( check_license_bounds(&user.0, (south, west, north, east), share_bounds)?; let quant = state.data.quant_ref(); - let (parsed_filters, parsed_enum_filters) = parse_filters( + let poi_quant = state.data.poi_metrics.quant_ref(); + let (parsed_filters, parsed_enum_filters, parsed_poi_filters) = parse_filters_with_poi( params.filters.as_deref(), &state.feature_name_to_index, &state.data.enum_values, &quant, + &state.data.poi_metrics.name_to_index, + &poi_quant, ) .map_err(|err| (StatusCode::BAD_REQUEST, err).into_response())?; - let num_filters = parsed_filters.len() + parsed_enum_filters.len(); + let num_filters = parsed_filters.len() + parsed_enum_filters.len() + parsed_poi_filters.len(); let filters_str = params.filters; - let field_indices = parse_field_indices(params.fields.as_deref(), &state.feature_name_to_index) - .map_err(|err| (err.0, err.1).into_response())?; + let field_indices = parse_field_indices_with_poi( + params.fields.as_deref(), + &state.feature_name_to_index, + &state.data.poi_metrics.name_to_index, + ) + .map_err(|err| (err.0, err.1).into_response())?; let travel_entries = parse_optional_travel(params.travel.as_deref()) .map_err(|err| (StatusCode::BAD_REQUEST, err).into_response())?; @@ -269,6 +300,11 @@ pub async fn get_hexagons( let min_keys = &state.min_keys; let max_keys = &state.max_keys; let avg_keys = &state.avg_keys; + let poi_metrics = &state.data.poi_metrics; + let poi_field_indices = field_indices.poi.as_slice(); + let has_poi_fields = !poi_field_indices.is_empty(); + let has_poi_filters = !parsed_poi_filters.is_empty(); + let poi_num_features = poi_metrics.num_features(); let h3_res = h3o::Resolution::try_from(resolution) .map_err(|error| format!("Invalid H3 resolution {}: {}", resolution, error))?; @@ -276,6 +312,7 @@ pub async fn get_hexagons( let need_parent = needs_parent(resolution); let mut groups: FxHashMap = FxHashMap::default(); + let mut poi_groups: FxHashMap = FxHashMap::default(); let mut travel_aggs: Vec> = (0..travel_entries.len()) .map(|_| FxHashMap::default()) .collect(); @@ -296,6 +333,7 @@ pub async fn get_hexagons( .par_chunks(chunk_size) .map(|chunk| { let mut local_groups: FxHashMap = FxHashMap::default(); + let mut local_poi_groups: FxHashMap = FxHashMap::default(); let mut local_travel_aggs: Vec> = (0 ..travel_entries.len()) .map(|_| FxHashMap::default()) @@ -315,6 +353,11 @@ pub async fn get_hexagons( ) { continue; } + if has_poi_filters + && !row_passes_poi_filters(row, &parsed_poi_filters, poi_metrics) + { + continue; + } if has_travel { travel_minutes.clear(); @@ -352,7 +395,7 @@ pub async fn get_hexagons( let agg = local_groups .entry(cell_id) .or_insert_with(|| Aggregator::new(num_features, enum_dist_config)); - if let Some(sel_indices) = field_indices.as_deref() { + if let Some(sel_indices) = field_indices.normal.as_deref() { agg.add_row_selective( feature_data, row, @@ -364,6 +407,13 @@ pub async fn get_hexagons( agg.add_row(feature_data, row, num_features, &quant); } + if has_poi_fields { + local_poi_groups + .entry(cell_id) + .or_insert_with(|| PoiAggregator::new(poi_num_features)) + .add_row_selective(poi_metrics, row, poi_field_indices); + } + for (ti, minutes) in travel_minutes.iter().enumerate() { if let Some(mins) = minutes { let tagg = local_travel_aggs[ti] @@ -374,18 +424,24 @@ pub async fn get_hexagons( } } - (local_groups, local_travel_aggs) + (local_groups, local_poi_groups, local_travel_aggs) }) .collect(); // Merge thread-local results into the main accumulators - for (local_groups, local_travel) in thread_results { + for (local_groups, local_poi_groups, local_travel) in thread_results { for (cell_id, local_agg) in local_groups { groups .entry(cell_id) .or_insert_with(|| Aggregator::new(num_features, enum_dist_config)) .merge(&local_agg); } + for (cell_id, local_agg) in local_poi_groups { + poi_groups + .entry(cell_id) + .or_insert_with(|| PoiAggregator::new(poi_num_features)) + .merge(&local_agg); + } for (ti, local_ta) in local_travel.into_iter().enumerate() { for (cell_id, local_tt) in local_ta { travel_aggs[ti] @@ -414,6 +470,11 @@ pub async fn get_hexagons( ) { return; } + if has_poi_filters + && !row_passes_poi_filters(row, &parsed_poi_filters, poi_metrics) + { + return; + } if has_travel { travel_minutes.clear(); @@ -444,7 +505,7 @@ pub async fn get_hexagons( let aggregation = groups .entry(cell_id) .or_insert_with(|| Aggregator::new(num_features, enum_dist_config)); - if let Some(sel_indices) = field_indices.as_deref() { + if let Some(sel_indices) = field_indices.normal.as_deref() { aggregation.add_row_selective( feature_data, row, @@ -456,6 +517,13 @@ pub async fn get_hexagons( aggregation.add_row(feature_data, row, num_features, &quant); } + if has_poi_fields { + poi_groups + .entry(cell_id) + .or_insert_with(|| PoiAggregator::new(poi_num_features)) + .add_row_selective(poi_metrics, row, poi_field_indices); + } + for (ti, minutes) in travel_minutes.iter().enumerate() { if let Some(mins) = minutes { let agg = travel_aggs[ti] @@ -471,11 +539,14 @@ pub async fn get_hexagons( let mut features = build_feature_maps( &groups, + &poi_groups, min_keys, max_keys, avg_keys, num_features, - field_indices.as_deref(), + field_indices.normal.as_deref(), + &poi_metrics.feature_names, + poi_field_indices, (south, west, north, east), h3_res, &travel_aggs, @@ -499,7 +570,11 @@ pub async fn get_hexagons( bounds = format_args!("{:.4},{:.4},{:.4},{:.4}", south, west, north, east), filters = num_filters, filters_raw = filters_str.as_deref().unwrap_or("-"), - fields = field_indices.as_ref().map(|v| v.len() as i32).unwrap_or(-1), + fields = field_indices + .normal + .as_ref() + .map(|v| (v.len() + poi_field_indices.len()) as i32) + .unwrap_or(-1), travel_entries = travel_entries.len(), grid_ms = format_args!("{:.1}", t_grid.as_secs_f64() * 1000.0), agg_ms = format_args!("{:.1}", (t_agg - t_grid).as_secs_f64() * 1000.0), diff --git a/server-rs/src/routes/invites.rs b/server-rs/src/routes/invites.rs index fa7c633..b110858 100644 --- a/server-rs/src/routes/invites.rs +++ b/server-rs/src/routes/invites.rs @@ -9,11 +9,16 @@ use serde::{Deserialize, Serialize}; use tracing::{info, warn}; use crate::auth::{OptionalUser, PocketBaseUser}; +use crate::checkout_sessions::{ + active_referral_checkout_user, start_license_checkout, CheckoutStart, +}; use crate::pocketbase::get_superuser_token; +use crate::pocketbase_locks::acquire_pocketbase_lock; use crate::state::{AppState, SharedState}; static INVITE_REDEMPTIONS_IN_PROGRESS: LazyLock>> = LazyLock::new(|| Mutex::new(HashSet::new())); +const INVITE_REDEMPTION_LOCK_TTL_SECS: u64 = 5 * 60; struct InviteRedemptionGuard { code: String, @@ -103,7 +108,7 @@ fn validate_invite_code(code: &str) -> Result<(), &'static str> { } fn generate_invite_code() -> String { - use rand::Rng; + use rand::RngExt; let mut rng = rand::rng(); let chars: Vec = (0..12) .map(|_| { @@ -246,74 +251,26 @@ async fn grant_license_for_invite( async fn create_referral_checkout( state: &AppState, user: &PocketBaseUser, + invite_id: &str, ) -> Result { - let count = match super::pricing::count_licensed_users(state).await { - Ok(count) => count, - Err(err) => { - warn!("Failed to count licensed users for invite checkout: {err}"); - return Err(StatusCode::SERVICE_UNAVAILABLE.into_response()); - } - }; - let price_pence = super::pricing::price_for_count(count); - let public_url = &state.public_url; let success_url = format!("{public_url}/pricing?license_success=1"); let cancel_url = format!("{public_url}/pricing"); - let form_params = vec![ - ("mode", "payment".to_string()), - ( - "line_items[0][price_data][unit_amount]", - price_pence.to_string(), - ), - ("line_items[0][price_data][currency]", "gbp".to_string()), - ( - "line_items[0][price_data][product_data][name]", - "Perfect Postcodes Lifetime License".to_string(), - ), - ("line_items[0][quantity]", "1".to_string()), - ("success_url", success_url), - ("cancel_url", cancel_url), - ("client_reference_id", user.id.clone()), - ("customer_email", user.email.clone()), - ( - "discounts[0][coupon]", - state.stripe_referral_coupon_id.clone(), - ), - ]; - - let stripe_res = state - .http_client - .post("https://api.stripe.com/v1/checkout/sessions") - .basic_auth(&state.stripe_secret_key, None::<&str>) - .form(&form_params) - .send() - .await; - - match stripe_res { - Ok(resp) if resp.status().is_success() => { - let stripe_body: serde_json::Value = match resp.json().await { - Ok(value) => value, - Err(err) => { - warn!("Failed to parse Stripe checkout response: {err}"); - return Err(StatusCode::BAD_GATEWAY.into_response()); - } - }; - let checkout_url = stripe_body["url"].as_str().unwrap_or_default().to_string(); - if checkout_url.is_empty() { - warn!("Stripe checkout response did not include a URL"); - return Err(StatusCode::BAD_GATEWAY.into_response()); - } - Ok(checkout_url) - } - Ok(resp) => { - let status = resp.status(); - let text = resp.text().await.unwrap_or_default(); - warn!("Failed to create Stripe checkout for referral invite ({status}): {text}"); - Err(StatusCode::BAD_GATEWAY.into_response()) - } + match start_license_checkout( + state, + user, + &success_url, + &cancel_url, + Some(&state.stripe_referral_coupon_id), + Some(invite_id), + ) + .await + { + Ok(CheckoutStart::Free) => Ok(success_url), + Ok(CheckoutStart::Stripe { url }) => Ok(url), Err(err) => { - warn!("Stripe request error for referral invite: {err}"); + warn!("Failed to create reserved Stripe checkout for referral invite: {err:?}"); Err(StatusCode::BAD_GATEWAY.into_response()) } } @@ -541,6 +498,10 @@ pub async fn post_redeem_invite( .into_response(); } + if user.is_admin || user.subscription == "licensed" { + return (StatusCode::CONFLICT, "Account already has full access").into_response(); + } + let pb_url = state.pocketbase_url.trim_end_matches('/'); let token = match get_superuser_token(&state).await { @@ -561,6 +522,19 @@ pub async fn post_redeem_invite( .into_response() } }; + let lock_name = format!("invite:{}", req.code); + let _distributed_redemption_guard = + match acquire_pocketbase_lock(&state, &lock_name, INVITE_REDEMPTION_LOCK_TTL_SECS).await { + Ok(guard) => guard, + Err(err) => { + warn!(code = %req.code, "Failed to acquire invite redemption lock: {err}"); + return ( + StatusCode::CONFLICT, + "Invite redemption is already in progress", + ) + .into_response(); + } + }; let invite = match lookup_unused_invite(&state, pb_url, &token, &req.code).await { Ok(Some(invite)) => invite, @@ -591,11 +565,11 @@ pub async fn post_redeem_invite( }; if invite_type == "admin" { - if let Err(response) = grant_license_for_invite(&state, pb_url, &token, &user.id).await { + if let Err(response) = mark_invite_used(&state, pb_url, &token, invite_id, &user.id).await { return response; } - if let Err(response) = mark_invite_used(&state, pb_url, &token, invite_id, &user.id).await { + if let Err(response) = grant_license_for_invite(&state, pb_url, &token, &user.id).await { return response; } @@ -607,15 +581,26 @@ pub async fn post_redeem_invite( .into_response(); } - let checkout_url = match create_referral_checkout(&state, &user).await { + match active_referral_checkout_user(&state, invite_id).await { + Ok(Some(active_user_id)) if active_user_id != user.id => { + return ( + StatusCode::CONFLICT, + "Invite checkout is already in progress", + ) + .into_response() + } + Ok(_) => {} + Err(err) => { + warn!(code = %req.code, "Failed to check active referral checkout: {err}"); + return StatusCode::BAD_GATEWAY.into_response(); + } + } + + let checkout_url = match create_referral_checkout(&state, &user, invite_id).await { Ok(url) => url, Err(response) => return response, }; - if let Err(response) = mark_invite_used(&state, pb_url, &token, invite_id, &user.id).await { - return response; - } - info!(user_id = %user.id, code = %req.code, "Referral invite redeemed; checkout created"); Json(RedeemResponse { result: "checkout".to_string(), diff --git a/server-rs/src/routes/pois.rs b/server-rs/src/routes/pois.rs index e6f4cde..88946c9 100644 --- a/server-rs/src/routes/pois.rs +++ b/server-rs/src/routes/pois.rs @@ -7,7 +7,7 @@ use serde::{Deserialize, Serialize}; use tracing::info; use crate::consts::MAX_POIS_PER_REQUEST; -use crate::data::POICategoryGroup; +use crate::data::{resolve_poi_category_filter, POICategoryGroup}; use crate::parsing::require_bounds; use crate::state::SharedState; @@ -47,20 +47,7 @@ pub async fn get_pois( .categories .as_deref() .filter(|text| !text.is_empty()) - .map(|text| { - text.split(',') - .filter_map(|part| { - let name = part.trim(); - state - .poi_data - .category - .values - .iter() - .position(|v| v == name) - .map(|pos| pos as u16) - }) - .collect() - }); + .map(|text| resolve_poi_category_filter(&state.poi_data.category.values, text)); let categories_raw = params.categories; let num_categories = category_filter.as_ref().map(|cats| cats.len()).unwrap_or(0); diff --git a/server-rs/src/routes/postcode_properties.rs b/server-rs/src/routes/postcode_properties.rs index c954c26..e0aa684 100644 --- a/server-rs/src/routes/postcode_properties.rs +++ b/server-rs/src/routes/postcode_properties.rs @@ -10,7 +10,7 @@ use tracing::{info, warn}; use crate::auth::OptionalUser; use crate::consts::{DEFAULT_PROPERTIES_LIMIT, MAX_PROPERTIES_LIMIT, POSTCODE_SEARCH_OFFSET}; use crate::licensing::{check_license_point, resolve_share_code}; -use crate::parsing::{parse_filters, row_passes_filters}; +use crate::parsing::{parse_filters_with_poi, row_passes_filters, row_passes_poi_filters}; use crate::state::SharedState; use crate::utils::normalize_postcode; @@ -62,15 +62,19 @@ pub async fn get_postcode_properties( )?; let quant = state.data.quant_ref(); - let (parsed_filters, parsed_enum_filters) = parse_filters( + let poi_quant = state.data.poi_metrics.quant_ref(); + let (parsed_filters, parsed_enum_filters, parsed_poi_filters) = parse_filters_with_poi( params.filters.as_deref(), &state.feature_name_to_index, &state.data.enum_values, &quant, + &state.data.poi_metrics.name_to_index, + &poi_quant, ) .map_err(|err| (StatusCode::BAD_REQUEST, err).into_response())?; - let num_filters = parsed_filters.len() + parsed_enum_filters.len(); + let num_filters = parsed_filters.len() + parsed_enum_filters.len() + parsed_poi_filters.len(); let filters_str = params.filters; + let has_poi_filters = !parsed_poi_filters.is_empty(); let travel_entries = parse_optional_travel(params.travel.as_deref()) .map_err(|err| (StatusCode::BAD_REQUEST, err).into_response())?; @@ -111,6 +115,12 @@ pub async fn get_postcode_properties( feature_data, num_features, ) + && (!has_poi_filters + || row_passes_poi_filters( + row, + &parsed_poi_filters, + &state.data.poi_metrics, + )) { if has_travel && !row_passes_travel_filters( diff --git a/server-rs/src/routes/postcode_stats.rs b/server-rs/src/routes/postcode_stats.rs index c2f9ac4..a261409 100644 --- a/server-rs/src/routes/postcode_stats.rs +++ b/server-rs/src/routes/postcode_stats.rs @@ -10,7 +10,9 @@ use tracing::{info, warn}; use crate::auth::OptionalUser; use crate::consts::POSTCODE_SEARCH_OFFSET; use crate::licensing::{check_license_point, resolve_share_code}; -use crate::parsing::{parse_field_set, parse_filters, row_passes_filters}; +use crate::parsing::{ + parse_field_set, parse_filters_with_poi, row_passes_filters, row_passes_poi_filters, +}; use crate::state::SharedState; use crate::utils::normalize_postcode; @@ -64,15 +66,19 @@ pub async fn get_postcode_stats( )?; let quant = state.data.quant_ref(); - let (parsed_filters, parsed_enum_filters) = parse_filters( + let poi_quant = state.data.poi_metrics.quant_ref(); + let (parsed_filters, parsed_enum_filters, parsed_poi_filters) = parse_filters_with_poi( params.filters.as_deref(), &state.feature_name_to_index, &state.data.enum_values, &quant, + &state.data.poi_metrics.name_to_index, + &poi_quant, ) .map_err(|err| (StatusCode::BAD_REQUEST, err).into_response())?; - let num_filters = parsed_filters.len() + parsed_enum_filters.len(); + let num_filters = parsed_filters.len() + parsed_enum_filters.len() + parsed_poi_filters.len(); let filters_str = params.filters; + let has_poi_filters = !parsed_poi_filters.is_empty(); let (fields_specified, field_set) = parse_field_set(params.fields.as_deref()); let travel_entries = parse_optional_travel(params.travel.as_deref()) @@ -108,6 +114,12 @@ pub async fn get_postcode_stats( feature_data, num_features, ) + && (!has_poi_filters + || row_passes_poi_filters( + row, + &parsed_poi_filters, + &state.data.poi_metrics, + )) { if has_travel && !row_passes_travel_filters(row_postcode, &travel_entries, &travel_data) @@ -123,7 +135,7 @@ pub async fn get_postcode_stats( let price_history = stats::extract_price_history(&matching_rows, &state.data, &state.feature_name_to_index); - let (numeric_features, enum_features_out) = stats::compute_feature_stats( + let (mut numeric_features, enum_features_out) = stats::compute_feature_stats( &matching_rows, &state.data, &state.data.feature_names, @@ -132,6 +144,12 @@ pub async fn get_postcode_stats( fields_specified, &field_set, ); + numeric_features.extend(stats::compute_poi_feature_stats( + &matching_rows, + &state.data.poi_metrics, + fields_specified, + &field_set, + )); let elapsed = start_time.elapsed(); info!( diff --git a/server-rs/src/routes/postcodes.rs b/server-rs/src/routes/postcodes.rs index d78d92a..541087f 100644 --- a/server-rs/src/routes/postcodes.rs +++ b/server-rs/src/routes/postcodes.rs @@ -10,14 +10,14 @@ use serde::{Deserialize, Serialize}; use serde_json::{Map, Value}; use tracing::info; -use crate::aggregation::{Aggregator, EnumDistConfig}; +use crate::aggregation::{Aggregator, EnumDistConfig, PoiAggregator}; use crate::auth::OptionalUser; use crate::consts::MAX_CELLS_PER_REQUEST; use crate::data::travel_time::TravelData; use crate::licensing::{check_license_bounds, resolve_share_code}; use crate::parsing::{ - bounds_intersect, parse_enum_dist, parse_field_indices, parse_filters, require_bounds, - row_passes_filters, + bounds_intersect, parse_enum_dist, parse_field_indices_with_poi, parse_filters_with_poi, + require_bounds, row_passes_filters, row_passes_poi_filters, }; use crate::pocketbase::log_user_location; use crate::routes::travel_time::{parse_optional_travel, TravelTimeAgg}; @@ -64,18 +64,25 @@ pub async fn get_postcodes( check_license_bounds(&user.0, (south, west, north, east), share_bounds)?; let quant = state.data.quant_ref(); - let (parsed_filters, parsed_enum_filters) = parse_filters( + let poi_quant = state.data.poi_metrics.quant_ref(); + let (parsed_filters, parsed_enum_filters, parsed_poi_filters) = parse_filters_with_poi( params.filters.as_deref(), &state.feature_name_to_index, &state.data.enum_values, &quant, + &state.data.poi_metrics.name_to_index, + &poi_quant, ) .map_err(|err| (StatusCode::BAD_REQUEST, err).into_response())?; - let num_filters = parsed_filters.len() + parsed_enum_filters.len(); + let num_filters = parsed_filters.len() + parsed_enum_filters.len() + parsed_poi_filters.len(); let filters_str = params.filters; - let field_indices = parse_field_indices(params.fields.as_deref(), &state.feature_name_to_index) - .map_err(|err| (err.0, err.1).into_response())?; + let field_indices = parse_field_indices_with_poi( + params.fields.as_deref(), + &state.feature_name_to_index, + &state.data.poi_metrics.name_to_index, + ) + .map_err(|err| (err.0, err.1).into_response())?; let travel_entries = parse_optional_travel(params.travel.as_deref()) .map_err(|err| (StatusCode::BAD_REQUEST, err).into_response())?; @@ -123,12 +130,18 @@ pub async fn get_postcodes( let min_keys = &state.min_keys; let max_keys = &state.max_keys; let avg_keys = &state.avg_keys; + let poi_metrics = &state.data.poi_metrics; + let poi_field_indices = field_indices.poi.as_slice(); + let has_poi_fields = !poi_field_indices.is_empty(); + let has_poi_filters = !parsed_poi_filters.is_empty(); + let poi_num_features = poi_metrics.num_features(); - let has_selective = field_indices.is_some(); - let sel_indices = field_indices.as_deref().unwrap_or(&[]); + let has_selective = field_indices.normal.is_some(); + let sel_indices = field_indices.normal.as_deref().unwrap_or(&[]); // Single-pass: aggregate directly into postcode_aggs while iterating properties in bounds let mut postcode_aggs: FxHashMap = FxHashMap::default(); + let mut poi_aggs: FxHashMap = FxHashMap::default(); state .grid @@ -143,6 +156,10 @@ pub async fn get_postcodes( ) { return; } + if has_poi_filters && !row_passes_poi_filters(row, &parsed_poi_filters, poi_metrics) + { + return; + } let postcode = state.data.postcode(row); if let Some(&pc_idx) = postcode_data.postcode_to_idx.get(postcode) { @@ -154,6 +171,12 @@ pub async fn get_postcodes( } else { agg.add_row(feature_data, row, num_features, &quant); } + if has_poi_fields { + poi_aggs + .entry(pc_idx) + .or_insert_with(|| PoiAggregator::new(poi_num_features)) + .add_row_selective(poi_metrics, row, poi_field_indices); + } } }); @@ -250,11 +273,12 @@ pub async fn get_postcodes( ]), ); - let iter: Box> = if let Some(idx) = field_indices.as_ref() { - Box::new(idx.iter().copied()) - } else { - Box::new(0..num_features) - }; + let iter: Box> = + if let Some(idx) = field_indices.normal.as_ref() { + Box::new(idx.iter().copied()) + } else { + Box::new(0..num_features) + }; for feat_index in iter { if aggregation.feat_counts[feat_index] > 0 { @@ -272,6 +296,25 @@ pub async fn get_postcodes( } } + if let Some(poi_aggregation) = poi_aggs.get(&pc_idx) { + for &metric_idx in poi_field_indices { + if poi_aggregation.counts[metric_idx] > 0 { + let avg = poi_aggregation.sums[metric_idx] + / poi_aggregation.counts[metric_idx] as f64; + if let (Some(min_num), Some(max_num), Some(avg_num)) = ( + serde_json::Number::from_f64(poi_aggregation.mins[metric_idx] as f64), + serde_json::Number::from_f64(poi_aggregation.maxs[metric_idx] as f64), + serde_json::Number::from_f64(avg), + ) { + let name = &poi_metrics.feature_names[metric_idx]; + props.insert(format!("min_{name}"), Value::Number(min_num)); + props.insert(format!("max_{name}"), Value::Number(max_num)); + props.insert(format!("avg_{name}"), Value::Number(avg_num)); + } + } + } + } + // Add travel time aggregation fields if let Some(tt_aggs) = travel_aggs.get(&pc_idx) { for (ti, agg) in tt_aggs.iter().enumerate() { @@ -322,7 +365,11 @@ pub async fn get_postcodes( bounds = format_args!("{:.6},{:.6},{:.6},{:.6}", south, west, north, east), filters = num_filters, filters_raw = filters_str.as_deref().unwrap_or("-"), - fields = field_indices.as_ref().map(|v| v.len() as i32).unwrap_or(-1), + fields = field_indices + .normal + .as_ref() + .map(|v| (v.len() + poi_field_indices.len()) as i32) + .unwrap_or(-1), travel_entries = travel_entries.len(), agg_ms = format_args!("{:.1}", t_agg.as_secs_f64() * 1000.0), json_ms = format_args!("{:.1}", (t_total - t_agg).as_secs_f64() * 1000.0), diff --git a/server-rs/src/routes/properties.rs b/server-rs/src/routes/properties.rs index f935c5a..6b08328 100644 --- a/server-rs/src/routes/properties.rs +++ b/server-rs/src/routes/properties.rs @@ -14,8 +14,8 @@ use crate::consts::{DEFAULT_PROPERTIES_LIMIT, MAX_PROPERTIES_LIMIT}; use crate::data::RenovationEvent; use crate::licensing::{check_license_bounds, resolve_share_code}; use crate::parsing::{ - cell_for_row_cached, h3_cell_bounds, needs_parent, parse_filters, row_passes_filters, - validate_h3_resolution, + cell_for_row_cached, h3_cell_bounds, needs_parent, parse_filters_with_poi, row_passes_filters, + row_passes_poi_filters, validate_h3_resolution, }; use crate::state::{AppState, SharedState}; @@ -117,6 +117,12 @@ pub fn build_property( features.insert(feat_name.clone(), value); } } + for (metric_idx, metric_name) in state.data.poi_metrics.feature_names.iter().enumerate() { + let value = state.data.poi_metrics.get_for_property_row(row, metric_idx); + if value.is_finite() { + features.insert(metric_name.clone(), value); + } + } Property { address: non_empty_string(state.data.address(row)), @@ -199,15 +205,19 @@ pub async fn get_hexagon_properties( let h3_str = params.h3; let quant = state.data.quant_ref(); - let (parsed_filters, parsed_enum_filters) = parse_filters( + let poi_quant = state.data.poi_metrics.quant_ref(); + let (parsed_filters, parsed_enum_filters, parsed_poi_filters) = parse_filters_with_poi( params.filters.as_deref(), &state.feature_name_to_index, &state.data.enum_values, &quant, + &state.data.poi_metrics.name_to_index, + &poi_quant, ) .map_err(|err| (StatusCode::BAD_REQUEST, err).into_response())?; - let num_filters = parsed_filters.len() + parsed_enum_filters.len(); + let num_filters = parsed_filters.len() + parsed_enum_filters.len() + parsed_poi_filters.len(); let filters_str = params.filters; + let has_poi_filters = !parsed_poi_filters.is_empty(); let travel_entries = parse_optional_travel(params.travel.as_deref()) .map_err(|err| (StatusCode::BAD_REQUEST, err).into_response())?; @@ -242,6 +252,12 @@ pub async fn get_hexagon_properties( feature_data, num_features, ) + && (!has_poi_filters + || row_passes_poi_filters( + row, + &parsed_poi_filters, + &state.data.poi_metrics, + )) { if has_travel { let postcode = state.data.postcode(row); diff --git a/server-rs/src/routes/stats.rs b/server-rs/src/routes/stats.rs index 46def2d..94ea754 100644 --- a/server-rs/src/routes/stats.rs +++ b/server-rs/src/routes/stats.rs @@ -4,7 +4,7 @@ use rustc_hash::FxHashMap; use tracing::warn; use crate::consts::MAX_PRICE_HISTORY_POINTS; -use crate::data::{FeatureStats, PropertyData}; +use crate::data::{FeatureStats, PostcodePoiMetrics, PropertyData}; use super::hexagon_stats::{EnumFeatureStats, HistogramStats, NumericFeatureStats, PricePoint}; @@ -243,3 +243,80 @@ pub fn compute_feature_stats( (numeric_features, enum_features_out) } + +pub fn compute_poi_feature_stats( + matching_rows: &[usize], + poi_metrics: &PostcodePoiMetrics, + fields_specified: bool, + field_set: &HashSet, +) -> Vec { + let mut out = Vec::new(); + for (metric_idx, name) in poi_metrics.feature_names.iter().enumerate() { + if fields_specified && !field_set.contains(name.as_str()) { + continue; + } + + let global_hist = &poi_metrics.feature_stats[metric_idx].histogram; + let p1 = global_hist.p1; + let p99 = global_hist.p99; + let num_bins = global_hist.counts.len(); + let middle_bins = num_bins.saturating_sub(2); + let middle_width = if middle_bins > 0 && p99 > p1 { + (p99 - p1) / middle_bins as f32 + } else { + 0.0 + }; + + let mut count = 0usize; + let mut min_value = f32::INFINITY; + let mut max_value = f32::NEG_INFINITY; + let mut sum = 0.0f64; + let mut bins = vec![0u64; num_bins]; + + for &row in matching_rows { + let value = poi_metrics.get_for_property_row(row, metric_idx); + if !value.is_finite() { + continue; + } + count += 1; + if value < min_value { + min_value = value; + } + if value > max_value { + max_value = value; + } + sum += value as f64; + + let bin = if value < p1 { + 0 + } else if value >= p99 { + num_bins - 1 + } else if middle_width > 0.0 { + let middle_bin = ((value - p1) / middle_width) as usize; + (1 + middle_bin).min(num_bins - 2) + } else { + num_bins / 2 + }; + bins[bin] += 1; + } + + if count > 0 { + out.push(NumericFeatureStats { + name: name.clone(), + count, + min: min_value as f64, + max: max_value as f64, + mean: sum / count as f64, + histogram: HistogramStats { + min: global_hist.min as f64, + max: global_hist.max as f64, + p1: p1 as f64, + p99: p99 as f64, + counts: bins, + }, + }); + } + } + + out +} diff --git a/server-rs/src/routes/stripe_webhook.rs b/server-rs/src/routes/stripe_webhook.rs index b894ad1..76d7f80 100644 --- a/server-rs/src/routes/stripe_webhook.rs +++ b/server-rs/src/routes/stripe_webhook.rs @@ -1,78 +1,40 @@ -use std::collections::VecDeque; -use std::sync::{Arc, LazyLock}; +use std::sync::Arc; use axum::body::Bytes; use axum::extract::State; use axum::http::{HeaderMap, StatusCode}; use axum::response::{IntoResponse, Response}; -use hmac::{Hmac, Mac}; -use parking_lot::Mutex; -use rustc_hash::FxHashSet; +use hmac::{Hmac, KeyInit, Mac}; use sha2::Sha256; use tracing::{info, warn}; -use crate::pocketbase::get_superuser_token; +use crate::checkout_sessions::{ + grant_license, mark_checkout_completed, mark_referral_invite_used, verify_checkout_completion, + CheckoutCompletion, +}; use crate::state::SharedState; type HmacSha256 = Hmac; -/// Process-local LRU of recently processed Stripe event IDs. -/// Stripe retries deliver the same event ID; we drop duplicates so we don't -/// re-run side effects (subscription writes, token cache invalidation, logs). -/// Capacity is intentionally generous: at typical webhook volumes this covers -/// far more than Stripe's retry window. -struct EventDedup { - seen: FxHashSet, - queue: VecDeque, - capacity: usize, -} - -impl EventDedup { - fn new(capacity: usize) -> Self { - Self { - seen: FxHashSet::default(), - queue: VecDeque::with_capacity(capacity), - capacity, - } - } - - /// Returns `true` if this event ID is new (and records it), - /// `false` if it was already seen recently. - fn check_and_insert(&mut self, id: &str) -> bool { - if self.seen.contains(id) { - return false; - } - self.seen.insert(id.to_string()); - self.queue.push_back(id.to_string()); - if self.queue.len() > self.capacity { - if let Some(old) = self.queue.pop_front() { - self.seen.remove(&old); - } - } - true - } -} - -static EVENT_DEDUP: LazyLock> = - LazyLock::new(|| Mutex::new(EventDedup::new(1024))); - /// Verify Stripe webhook signature (v1 scheme). fn verify_signature(payload: &[u8], sig_header: &str, secret: &str) -> bool { // Parse timestamp and signature from header: "t=TIMESTAMP,v1=SIGNATURE" let mut timestamp = None; - let mut signature = None; + let mut signatures = Vec::new(); for part in sig_header.split(',') { if let Some(ts) = part.strip_prefix("t=") { timestamp = Some(ts); } else if let Some(sig) = part.strip_prefix("v1=") { - signature = Some(sig); + signatures.push(sig); } } - let (ts, sig_hex) = match (timestamp, signature) { - (Some(t), Some(s)) => (t, s), - _ => return false, + let Some(ts) = timestamp else { + return false; }; + if signatures.is_empty() { + return false; + } // Reject webhooks older than 5 minutes to prevent replay attacks if let Ok(ts_secs) = ts.parse::() { @@ -87,20 +49,21 @@ fn verify_signature(payload: &[u8], sig_header: &str, secret: &str) -> bool { return false; } - // Compute expected signature: HMAC-SHA256(secret, "TIMESTAMP.PAYLOAD") - let signed_payload = format!("{ts}.{}", String::from_utf8_lossy(payload)); - let mut mac = match HmacSha256::new_from_slice(secret.as_bytes()) { - Ok(m) => m, - Err(_) => return false, - }; - mac.update(signed_payload.as_bytes()); + let mut signed_payload = Vec::with_capacity(ts.len() + 1 + payload.len()); + signed_payload.extend_from_slice(ts.as_bytes()); + signed_payload.push(b'.'); + signed_payload.extend_from_slice(payload); - // Decode the provided hex signature and verify with constant-time comparison - let sig_bytes = match hex::decode(sig_hex) { - Ok(bytes) => bytes, - Err(_) => return false, - }; - mac.verify_slice(&sig_bytes).is_ok() + signatures.into_iter().any(|sig_hex| { + let Ok(sig_bytes) = hex::decode(sig_hex) else { + return false; + }; + let Ok(mut mac) = HmacSha256::new_from_slice(secret.as_bytes()) else { + return false; + }; + mac.update(&signed_payload); + mac.verify_slice(&sig_bytes).is_ok() + }) } /// Handle Stripe webhook events. @@ -140,65 +103,64 @@ pub async fn post_stripe_webhook( let event_type = event["type"].as_str().unwrap_or(""); let event_id = event["id"].as_str().unwrap_or(""); - // Idempotency: drop replays/retries of an already-processed event. - // We always answer 200 so Stripe stops retrying. - if !event_id.is_empty() && !EVENT_DEDUP.lock().check_and_insert(event_id) { - info!(event_id, event_type, "Dropping duplicate Stripe webhook"); - return StatusCode::OK.into_response(); - } - info!(event_id, event_type, "Received Stripe webhook"); if event_type == "checkout.session.completed" { - let user_id = event["data"]["object"]["client_reference_id"] - .as_str() - .unwrap_or(""); - if user_id.is_empty() { - warn!("checkout.session.completed missing client_reference_id"); - return StatusCode::OK.into_response(); - } - if !user_id.bytes().all(|b| b.is_ascii_alphanumeric()) || user_id.len() > 20 { - warn!(user_id, "Invalid client_reference_id format in webhook"); - return StatusCode::BAD_REQUEST.into_response(); - } - - // Update user subscription to "licensed" via PocketBase superuser auth - let token = match get_superuser_token(&state).await { - Ok(t) => t, - Err(err) => { - warn!("Failed to auth as PocketBase superuser in webhook: {err}"); - return StatusCode::INTERNAL_SERVER_ERROR.into_response(); - } - }; - - let pb_url = state.pocketbase_url.trim_end_matches('/'); - let url = format!("{pb_url}/api/collections/users/records/{user_id}"); - let res = state - .http_client - .patch(&url) - .header("Authorization", format!("Bearer {token}")) - .json(&serde_json::json!({ "subscription": "licensed" })) - .send() - .await; - - match res { - Ok(resp) if resp.status().is_success() => { - state.token_cache.invalidate_by_user_id(user_id); + let session = &event["data"]["object"]; + match verify_checkout_completion(&state, session).await { + Ok(CheckoutCompletion::Grant(checkout)) => { + if let Err(err) = mark_referral_invite_used( + &state, + &checkout.referral_invite_id, + &checkout.user_id, + ) + .await + { + warn!( + user_id = %checkout.user_id, + reservation_id = %checkout.reservation_id, + referral_invite_id = %checkout.referral_invite_id, + "Failed to mark referral invite used after Stripe checkout: {err:?}" + ); + return StatusCode::INTERNAL_SERVER_ERROR.into_response(); + } + if let Err(err) = grant_license(&state, &checkout.user_id).await { + warn!( + user_id = %checkout.user_id, + reservation_id = %checkout.reservation_id, + "Failed to grant license after Stripe checkout: {err:?}" + ); + return StatusCode::INTERNAL_SERVER_ERROR.into_response(); + } + if let Err(err) = mark_checkout_completed( + &state, + &checkout.reservation_id, + checkout.paid_amount_pence, + ) + .await + { + warn!( + user_id = %checkout.user_id, + reservation_id = %checkout.reservation_id, + "Failed to mark checkout completed after license grant: {err:?}" + ); + return StatusCode::INTERNAL_SERVER_ERROR.into_response(); + } info!( - user_id, - "User subscription updated to licensed via Stripe webhook" + user_id = %checkout.user_id, + reservation_id = %checkout.reservation_id, + "User subscription updated to licensed via verified Stripe checkout" ); } - Ok(resp) => { - let status = resp.status(); - let text = resp.text().await.unwrap_or_default(); - warn!( - user_id, - "Failed to update user subscription ({status}): {text}" - ); + Ok(CheckoutCompletion::AlreadyHandled) => { + info!("Stripe checkout session was already handled"); + } + Ok(CheckoutCompletion::Rejected(reason)) => { + warn!("Rejecting Stripe checkout completion: {reason}"); } Err(err) => { - warn!(user_id, "PocketBase request error in webhook: {err}"); + warn!("Failed to verify Stripe checkout completion: {err:?}"); + return StatusCode::INTERNAL_SERVER_ERROR.into_response(); } } }