From b9b0edf3cbdc394f9200062800af86576e72da81 Mon Sep 17 00:00:00 2001 From: Maxwell-Lindsey <90484034+Maxwell-Lindsey@users.noreply.github.com> Date: Mon, 2 Oct 2023 21:01:37 -0500 Subject: [PATCH] Detailed Web Scrape UI & Supported File Types overhaul (#38) * initial draft of input form layout * Improved UI settings form format * added tooltips to web scrape parameters inputs * moved all web scrape ui code into WebScrape.tsx * add conditonal display of boxes, must have URL entered * added web scrape parameters to function call * changed web scrape parameters to be more readable * standardize naming of stayOnBaseURL * adding 'read more' toggle to supported filetypes. TODO add better content and examples * fixed drop down coloring * corrected input checking; Added Github scrape msg * Added Max URLs and Max Depth ranges into label * center aligned Read More for web scrape info * fixed guthub message * maxUrls and maxDepth -1 bc 0 indexed * Update Terms, Privacy to UIUC standard ones * fixed type error for vercel check * removed unused functions/imports * fixed input check to ensure only numbers present * fixed vercel error from ' instead of &apos * fixed &apos in github msg * tooltips: Adding more text, set widths and dark backgrounds * add nice coloring and examples to READ MORE accordian * Major refactor of Supported File Types, no more 'Under development...' were done! * tiny typo fix * FORMAT FIX ONLY --------- Co-authored-by: Kastan Day --- public/media/excel_logo.png | Bin 0 -> 100722 bytes src/components/Chat/Chat.tsx | 14 +- .../UIUC-Components/GlobalFooter.tsx | 12 +- .../UIUC-Components/GlobalHeader.tsx | 12 +- .../UIUC-Components/LargeDropzone.tsx | 23 +- .../UIUC-Components/Maintenance.tsx | 5 +- .../UIUC-Components/MakeOldCoursePage.tsx | 38 +- .../UIUC-Components/MakeQueryAnalysisPage.tsx | 38 +- .../SupportedFileUploadTypes.tsx | 336 ++++++++++++++---- src/components/UIUC-Components/WebScrape.tsx | 233 ++++++++---- src/pages/disclaimer.tsx | 16 +- src/pages/index.tsx | 9 +- 12 files changed, 530 insertions(+), 206 deletions(-) create mode 100644 public/media/excel_logo.png diff --git a/public/media/excel_logo.png b/public/media/excel_logo.png new file mode 100644 index 0000000000000000000000000000000000000000..f9f0ef5f8b40c7b16be0beeb886e9c2a44ab4026 GIT binary patch literal 100722 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 z%0AQ!fodjgWzaPV@NZPcmv`d@q=A~9F2kz*!81!L)qQ#-D5u$wQrC~yuKVaPYCNN@ z)kUY}ZMAn@H3WsX(-NVm^pH7>_MxNg4LemR8*@>p#ExwAE#B4IjXlC~YVfgj%4LxLKGn!(5j_H?=CTYG=5ETe6- zi-A812oiq0&$hfjyhb`|QK*KK3|(n!0e*X-1*i*fg?6xs@MRvW?(g(z;hls;$8~yS z$pZGPSjkJ*^yfv_$$ZGL_Hf$|3G*d0Sld#7|E4@IHNXddgf%rOBq6{E9gDcvQ*ES> z*KoRGm4XliliAE>Qpego@)H(74+lkG<%jI)u1t@LaF4vOf@+BYUP17BFccI?AEBsE zXB8Q!4U_9}I5XGc+~rw|aK<~tH#5`Gbb5`|)#4H$ z*^vyn9B|1oTI*9()0NYumO!y3&=O|6Q!jD2`jVH(?H!PNNxnxMEM83o@2cFffooz$ z8c8UpW|_g)UIu%SJ?({DFW}EJWH51b;rHPJ;)$wgmVNRLc?VHKWiQ>pW5T!PS>Xc$ z1oeA}1ZY|hSP7C{gc^HEknuSd@LswQ^c=L1bK8&W#=4EwiQ9u)PQMVxT?aSUQ2)4l1`-mH1TvKYz ztz(^yyWlMx@lii6%X|rVhnuLolh$De!M~b8+6in!PhsdaXVxMVssh0g-f0a2=Ll4Z zg&H>mTom|+TCS-e-_R(O&qsQ~+Ud_4v(inU;ee}AAkIA?Ba%g%$_MTUP!d%7yinUK zzaSFX;SR!sZa0s0E}20izWe^lzN6fBwS5mgFVOsn4iqdobv~ZOE3{4mtt*QjjuIUf zysax7MT*w#S&VI=>-#)L>SMb~x6>gb!E|}Q+0z)Eab>%Pa^s@rH;u`O?GKyQ+EU5h zC`B4rWr@ViQep$>WGpw!m}rM_w`F_+F^z0Mh_uhZKWV3L`^4eohMK#ZR$YrUFND<6 zN(t6TMU|du)SymzE~IcqBa_p;P0qc&j8=zod`qG3lMH6AMI!1zRtZ@5i#`1EtpRjl z>mB1PswER{RI|@TXP@KjgannSeE3_-L#Ngz8KyM5=kW^7A96P)cREBT*uVvs?F~8| zY|#;18+@nyS;n>IV6Eaj-YS;DP6%{PNR1rj+Bj2 zWNGmEyqV&(9{obsof9M-G+|F&t2nBhE$#gCgYBzC0vSFql*fs7HovxX$V|bl2JOqE{SQQGIR^F05! z+L=0@&$s2Z-Q{ZzO*ZZN{S_`w+t=sU}Ou4vhCV5Hzyq+d7y{)VK#Rw`3j}`lE>T{46EMX+y%*_p= zN5@UQu7rPPds`$vO1)l^`;Y2i(higoNPL~@PqTS~uy))+P{@|vtA=}kLXJ}Q6 zE=Fj4wWyf+qhY|16JlfiRgU>Y$hGW$a-*grP`V@Z$qiD8`Dc5BK5mUXzHvM87H58c zWLvatXB=&BF2!hF^v6B5XLZi=r%Tctc?`k$oK*jzkWk0|49VcZcDz4bxKhhRK3jQ$ z{k7=Yc4jQ8_qvoJNNm+57Tf1I(dP8iw<5`{c7WRid1V7^_Os*_; z915Zo@iN@FKd>=}yC~O^4^|%vSKk3vPZUKPPpu$?HL!a74%Jxd+; z5&c6LW}WeUk(0$dr5g*IYXZ{**IJvgyP-O1o#ap#XgpoBB`wIqPrG-G@kT{Sf;|QZ zr|AY1&R-?%ELE~4RHEmO3uDsI?K+U?WmsMp>s4aF=idJQK>y?yE%EVr(X=S?g?s%U z-#=#^Itr}Cqt-BTW&Aw(vBD*R49BIaie~%~^lzIB9B(PRr`#nHY=7q#l?I9huhU73 zSxngz^csefa*B=6-sJFhJf$Me0C3)i>I`q-hdm1eZF|_dRJeH865)^qiIIFqo z#$8K;@bQ=T#3AmMvY2x}Naypun0^s`yp7s2ZN6o$L|TF@+_W*H-MN*lfmIU5WZ`>H zA`DDdf=hp+)ZMZ=-0TfJIDM&e*VaAx!8(c|HP6Frw=UKqU_mf_1S~AxMC<{9Zr_qf zp*?e>t_AHgIwQL}hHz8U&W1M2QEP_q&sXv+;&7pKzOtiW6Yt(6XyN)dTJ4IpU0Pat z$ruYc+^mCLpI*bHvX+O&cG>`=8vd%9w?rqn9P^ZO2)#=eT^@+8_L0raA-NQhOV?Pq z_ERmAp>gVsXw>YEMUy+Q5KRDPZ zcY*}MYI}m7JyAy8$7m{94)Bk!p6UD8;TkLJv5~=jYf#Q%s1B!nc>cmcxksGQq7$wKhRIQ7%6_P1w!<9`hj4NhtYhnl4%MIW-7`Ysxu z$Ce}IgcE&rpmI|)A z5*y@y8F)8Cm(2;1-|xo90ucQkIgU<-N?%92kojcAiz@ch49um8(9vo*+$}oXF)tw) zwfIE%<35;7szo{P2~nCE)3rCeK1+!2*YTs5lC;!A?72Y zC|HMSoV~Zu9Y1xEIwb)F{$JwL%Qr(N=ecRu;BgI<$0x%AJclQUDpR=?CSrmHH_~GJ zbH71q^Una=S2=i~`Ak>=8Y2?bX(8NOIVssiZ7p9~c4}B5zB`Uq;>?vs*yO$Fs-ihh z-ec9BB`i^N6iu=@e&TWq1~F)} zI)XCCra8FD3y0+ED}8$YM3dN!Cdv+N%R8w?-3bX=-^-h6_!8zF0+%^7{x!`GwCf+A=pd| zT1@lzES7`^m}tBCwq(bE$%#g_pJ`#mbaph$U}k|me12d?9m0?2XyrRAwN{I3;|k04 z92d^&r2D(W(~`%vob2qL^_h^Gl}$CfkG76=OXt|qe(hx>Jb+srT~AaCYp<6=ECNG- z#kkJa5oi*;Ogf{JjD6{&3kEz~x!vSpa^Gd(V|w)ImpD!KAqm0CX^YB$3F^iNLM1J1 z8n!zg_|cVXaz>O+q}#X5`akl1ZkRB-GYp(00H!>aDKCp3!a9uQke8itU=|9+c&ZGx zEjr4Oum^30?%VXe9%P=`L&6mL(&9}~1~%o)aIQZ{^zRfqTiTN54P0MZl@bgsVx1EX zE@9{7Ukhr>S$v(rb2zC1OzyPn)3vsNSH-Q=ay5ZPX!IdUNB1&vHj_(H*Ou+BY1d!^ zEvdEBVtSSTWP7{{JRBhc;-`{Rs4x%X8|Is|txI4*mGx>Ao<(pvof zEnsj?etP@{zI11oYk@tea!<8*j2lbmvT~swc0aq5J|5xjX0i`<)IK7Re{o)79!8 zy&Ox(K5`Q?BA&Bu$krEJ9NZ`p+9fGA8V>wLQ%E)F>NGZdf*D&AOl?`ojJ@l4t?E*2 zb%C2U0N7%xQkGS|ZeO!H;Q{+5tG?1D24imkfhlFnc^xcAz_RbNO+FSsNE1F7HpnVe z(%!HC9##v8&_|9BFKAt*Z^wu`8cy;9kZs}@st(0wQr#&IUBBc#;XB=w7#K=h*GYcf zM>fG=t2_1;ccEdlecJCpmmLZK^OEs9`N`0&9`Oq%-6Ix`k+B%^wNn9X`h;M4g+84> zGeJDAC91O4rj)aaCCAr1y+`l7`$bz`jlI@>p_=o?`17w)yO)jJ_d%v1^hUpIkCIit zxva2Phz5I7Jw^Sv>7CCrbi?MDA)ba7-Lx2drj0VlPV4->=DMe3)A+9UJQwPTqc!v{ zVg=j?8a>~%tT>++m0=xKszf*PsqE#W^I5te2CsCrj8xJidDlQYt4K-5SZl6Jk#&H` zVsmO$_l26vLp<%E#Npu0%)rYIo!gX7&&TF=#mj+U$yX!X4qg>5CNVtaE_b8foV$|- zZ*W`0OK~~R@?9xpF(hJcwMBJs<(&|5C>aaHgnv!uDlok5PhDk)K4KLM*jy~i?@U!| zo^feT{=#eMuRLdO^V(O}q|coDyyrXD)=^TtCl#3NUOTpJAitGw*bQgZelL&@j+}9tiV~3Q`y91oMm_*Y6IC)Fnj)LQZ{9p~e7g+YwCD}3 zz9>|{R&FYHpf~msAF!%=t$4XP9)MX9H}pC2Q_>QUF8ds1af}m#kBz{pL~Xb=Gi&oW zhBVqYxSH1sAg=XFucyVJC7qj-)f;%QIJSj3{TAG7vlyQy?_8OnN-TC*XToj`*97^Z zY}LG?ov8^9Y_xT9VSkn_S5eV7@^a;sK26@< zkf_%xc1*9iO-r_MiNA}ixy4Hwa%$Ou9a(%VHjC!6(Ky}x>w{hhtae0Uuh8r8Hq47w zJpKieJuT%!gXe)Wj@H^dL7Y+i^RD@HPWOxFB18{iCpHRV5l(xVP4UxaSo4|9f%~e% z***KF3r8O3>OOzO(K2od>nj^y5NLn&KgNKK7mF9SQXFw|cOs34hjjTV$5-oci$b^b z{aeU=md@_r?oPwWP4s>QUaqD!XOS53yuN6*UG*?V^};*yw(9SQ5)MUUp{8s?qJ4#) zsg;nX`o_1Dim8N@PF$u;nV;=sXy~Z*?mjxd@6h24i8sL_RUhch^w&pj_5S_~%ISP? ztBt2b)oQ?|qhY_bwpT2VB&?`_6IN#0Y9HL04zeat=?oU~lmVlp>}k3Mk&cAbdh)%l zaB%Fk^z2;w3mWmJ2>Xjhn^YxNKH*Za)E2bUc2sT5hUnSRLZR>b_PUGoDmB zQ=P-2Z72o9ixCoD_O2WWZW%hyKb-EmfGMAAiIlhily#gI(9EV@G-JbJ6si>^1r7Aw ziYct+=XU8$XhrB~v@B$c0o-&{W-@NMLSI-OWL_^ad$x2}!v~hn`s88g^PVmtg65sG zxT+?QF{7NM9|InxHjUL)w0?3)>_{uItb?{mDC;tMr$Vq4v9F(AlMet)4UJmlgm1k3 z%TuxT`sexQ-?7`M4!$Kq1El9bwkb`f_>6O^siw8{t#7eO9@wt)thh%9Q1N?WaZIdD9i=h&C3QjBS2Y(Y|A z_GgHx1YHFr$lMVbMId@mfcP>8dA~%X&tKAXtT~t^CUJ>XZy;3tme-p{HC!;&9w;&pn~BBEZWvzwT1!JoSu27{YpgAwN4Pndy;eTy zBa9qivec;b=cN-KnT9SUdm}9&l8h) zae@%=4f@F9GLIt64w#7Ms=lO&L*4tzPqN*GqqhMRJ3Z_+2DPQlRu4X)e_v2G7x&94 zilO6QvxaM+Buf$-tj+D3tOMz>3&u@(?((PK>{_KmBh1fffapGIz)I&eeNh|ae=lw> z=MeoVtjs#*3+kIX@_*D zB5o8kPnL(l)2laMgCpE=IOCqpA{`|J)ak=W*v^l;hKpRG-~SP!Iv)|$jftpUb7<&5 ztW}?7ZGG^^cr#!Pdx3Qdyd+y*Wx(*pZ_&`S+I|5Vyt%v|n_On2>;>~KNsx^;So^wu zOT1zxejn^wx2&Zx`&<%lW)U~rikD1kY|pxX9nPjcwW#HXRb9>?2cK1hu6bL7_;+Uk z@Q!@Lm4$#08#M{cXLDH!jQTMH=#5o=M|orRq)W07%Kz#`kfT^}Bduxxu@cB zd5;m=CH{9Urtz$fwUv(J1hm;k^4D$3raKPgh%v839HQ7nqCQ9E@~9CPOs!Urbf~#4 zI<#&iJZc)P284N>X)v-;K5|a*p&%J1+@ZIZjTrN@G*rFR0jmKxUELP5ECS@r0Wx=; zS{Jfr#*BQpTqmy6x|Tw*_U?c$xe;|4w7NPa%)wSq*L17<&9`oC+(Mfy4Lj&5Z5KA! zrx@EG{OJn4whUln?3_GP#op>%H@Z(fSukRDUz6LOo6zNn&beg379uNaKSkp`ESyDP zTM#p2(fWWgtkn^Z*JLKt0c|tkAZo4hB@Q^B;$XJ1$VFO9=Tt2D(>O$UtPQ*;EL6>| zgk7k4e{|d&vp3dSjJNXfQaQaAv5`;;WW<iBiCs^D)$4Vnsl0?@)&eFamGwlD(Ll-&93uy&evJ%`&T%UbXV+t!sXYmx z3g#|=_6v->ADs2c542m%!v89zO;X<8BI@cl>=y7dOVFN9y*OLcs5v#ye1)Fwnf8H;UpDwZSYXZMjfWLMWV@wwGH(FPFuFmSQHaCU>Misjz4#YL z+;L{tdUu%O<|j z8Jmgz1EA@itR80Ukr&a0^9?_6Sm0TUN2YhOM$%I_!_+6Nz^4Exl)r`#mM_VBXAUb8 zC_vMQ9bq?N!Nz?8^d|@;ZDsR~$^%vMo3ENW47e}MA|Di-E~6C+?H)`dCq}%el&=wQ ztxb?+o0mg$cv_D~C^lm>UzkA)<|<&jOnnod-WRof&FhJ>VkhZ17LxsByCX1gJqGx= zXZ%e1b3mC6LuUOv%$wCZ$Qb)VGx5<=o)WKZoiTEn-mIiK(KiI=r%zQU%pMy6WSRTmUckV$l}Fc%=k<2?2bzH0FS=2IzuZIS!CQt_Te!% zl1US3yI_z>*EWGl_8Mn?abz11nl{%NT?L_7QJ+{T>BHbrfnUhbDJg;cBRzLX+5^KH99@=Pj4+}r_cA`B)t6|9H_>T7xJx^^(C_|S8!jb>Aw`0m7 zof`2~%65nJTjO#YX7;2>Na%ql)NYfR zJNVf~+MYtF+JdKh2wCz<@gJuhUCai3nGz(h z{`r!*FX)_rB5&8(vPG)A)9yt+M0`xJ6W`@)WeuIu1S&u zJF`<>-eB34{#`FlGW-E1en+}HWWtTG3YZ%adS#$S1?^(c{Q=+#!QIynawTd^kHznS z_Un(tKFIkAZS(DDCvhB%b$Wy5#GLwGc0^By6#?koT0l>CaD%e=%=cJa;yOZ#Tbuy2 z>R&q6M8y-AQ1w`R>gqoc=sa!^xGaiILj}RSs8fG%<^)bupC8uC0WTP-xDe1!afAhE{7M>s2?aT<*S(+Nk|LkJSv3_dWnt`}4cH+5@U6~Hpo zwD#@|u?lv@5dDRa)t(?B2w0RT;8ZcVQcP80@qjd>?Euit4v5-h6|WgjZ?4cT+cx8~EB|gg{)SyEl!X+}A}c z>6ECGNM2yP`tp$N()T?6cJrA4P!r%2b<{gG;Uk=A&{<(gLO_WidsWkXZ)n)^>8;)D5Yy{Ev+oZ{Xsi8m+30s-@8O@!wyOOUr0h{Ky52-zGbSbU%s@rD)dr4@ARTi$z*1Z| zwa!?@f{BH@eKpDUKjBnBirCP8F#QeH+GN<0ho?zKBcq{gw$~4Oo)I9|g&vxwwAd9>qbTpU15q|5<0VW9~3HqRn>M13#C)FWUWpD>fuKq{x*pag2Ug#>9#GPrXb#5qu6WTmiB!L z@Qttx^4%oW4h(GqQ={^daj)-;Gn-E95DwoB5wZXR=zsG*0Q%d)oLMDfo)5^jydbAp zz$OBYj{Vr3{w}y`PxxX$!iNg2nNcVCW($$2xmo*a}XeO=BQtjc*SN>84BZ&MPzTXt1TDMEFsl} zr)Iuy^=>2C_Tndm_=$^;1!oh73}O1!00REkAP2|;5aeEmDzoW>>75G3_>lF8!}Zj5 zBJ4J(^i7eTMI}p4Fk`zU=nr5HfWaRhO?{xB>fTQ{!y)mHso*v+yf{1Q0wgmk`oQrJ z>vpO_2pvQ+nmH&HW~SSQ_CkE}iFjAmC=Rxc?9=~x00Jx~=Q2j(tL5Z=lxPE>(VLb0Z+T>Z$o~V5QFq>NB8n1t`M=;9N_eOT+8DPl<;K`aF&5K0v)((PCi>wp8ligowgEXI zaB!NqfnYubq=&qHf^X&Y5{Q}Y2dYeVYm;*?ZWlcBmy8R-st6T zhJPYzB4pV=umwm4G0YAO0G`25FZ(9JOPqw1huF39?*b{$c2q!V(it>9{|>>vo}>L* z5PY@6GSN1zdIDJgOzX(L(!_M23!MXhrpfl3+&X`nd4VEk8{ARS#|=`MVV(h!DMZG9 zFJfMM*duYzi4o2DMhK+v#F)Vis`9V-%a1VwB~52A=k&ip?r$WVm^WRYWf|m6eXuc| z|EH-w=T`SyhXkX}T6=wmP{`2Fj~{-Z|MxU80GLK1Tmx$PjzAl5@T$*bJsq9p0E&Ky^zy@S?PDRLKdzkyDXl=c?ShosRYr1Nen^HE2C=xU zz{dqCgE)JhA{4<7F^W)#Au&oB86D!|EWX!1G8;({Kz9dWqX{tzxZ`$=B1kceQXSE~ z4>(psILb(*0KXPv#lE3}FkX(s;{gJfgh@GPt3uhbpKzJMQw2XQZoX}_gX1C8zJIYH zkjuXz6C(AGg@+F!xhNbBcxsTz{k@j0(?eu(~(t z))G%Uf1f8Vp1!0DS>kuNM50x)bUghh&IN(1$cfMtn6i+ZQzMuHOUJ*PF}2~a2lS`s zxL=TB4K4{O)kc0&^}s0ZovL33ZTZFxZ*{*bG)ohIKiv)v3f+q#K>osQ;tm8CNjWPI zIG9I0hH?3?Cr`h|ec;|A?HEmHaP)8c5hcG@PJh|?uLVTpWav})t=df|FTx(A4TyXA zc8GktP=~p~;_1AhG~|J&&x+}v{GWIhes9=r3GR9CCyi~hR(C>x)$4CmeX#XeT z2I9r|Eer7q_@d8I5@_hwrpUsGjOh0@#dh9l;~zHPP6?mzrv^o707m;hP~lIb-0!C_ zNI0U_9_G0QX~q|s>wCTl_{T3r;JG+rMzM|vxV{%Wfyy)WCV)065w!m)N=Hrv*Z06D zY*SA!sn;X?$aXSMIKz&#h>ULfBFQ}1c%7~>815uYc4)!%G=Md&GLW1yGdlm~9_TOs@~ZRh7d@}}QQ-tSi^$=}cS0Np~y{;yvE{D3i?n1~`|_=UpcYbndl zUE8LBc;|NSXivm%^;t!HLeg(Ie~nY@ZBd&kOCv5^B}k3t$MpU0dwEv z#yhN#_4(^(VhCgpeCJ#Qz&rA!8QK|W3Lve>|I3Wav{t?e|7YzIq@)(<#GF99q=ACP zKx(4k1XroE!QYxd9MYzbOt+<}PmrcZ%Q>Ru{Mh*c%s3qWSK)i86aic$9)|zNI1Zdp zMHZ^|90j0Q{@siTq9mB{jqA(*AI$jONpte=%-B_l_|+Vt2k{+%5X_i9ar2ubE#Z-w zzmSzM8M00fn_q=+pf=aB?*}{3{Pro^U+rKIY+|EGBg2wi|B33^=AFL6@{5bLFtCD? zGRXOszmwER#Rl+zVGqOuQhnoZa{tDZ{DtNLR(u5kSD{Yjwy5vp3ix>OD_KqKRKW^_ zTDz5CmB%eeh%Wd8J{}>V2 zZ-UwajwYPFM0$_k$`B$^2@U4tWiUBP;oNMpE2YL&;)hs2v)_ns_UrWQ#zlj^m^NY= z^8Hzbzv@5pIGp}$2uN?0ga2Xe-$%1&5QSgRk?al07P~;qjx3gUQR6?0lzFSnUy)@y zn)7A3=MS0OM$f= z58)!r^ugEHmUo?v2yCVW-eqe-)A6wWe8$S0i+xIXnl8U-ZB}{K)|k5Ik7eqy&2?l25`+sModYMfK7y~@E73c-r_#7+BK z9vh_H>j~I_mDyfv`!m?+>529W)U(>Nk9YA)(Ft2@_B7wJyTsVHz7VLoapW?|RKJMB z_^<|6x0-Q41JiwLYHi;P_8Aub{QBZEkWKJ#yg=dW%SMdR7$ zie()`=siZ(%~T3lD_vY3M2pT=C9N4neo=AQWbL6ST5fgh6FEv=t*3I}$qlIsi{p^XVd#yYYu+0Ab3XN93S1DknB|qu_kP(4du7p5X~P7 z;|kj2x$#*xUx4J!!rEj2hR=`p>EbG_!@`?hy&GNClABwsrRCErpT|_~9e{#iAq9u8)Mu4&4~g^vMBpqx!QxsFQH1 zIveO0b#o0fPB;FcC^JaKKc~n~Ba^8((e2H*c!^zIs7~($Nkrw?MMHZ>JG^vZdvrADa+j)gW|1L zjq!F`wiVR8vnNzZRTpQN_Z9q+@Nuv#i=;PJvTsJV==6}Dj=!K_NsB3i!%QMRvuJw# z3jJH>N0YwtNkb2xL*u>a^~+RE-fZJFF+ga%muP5?n5S`Ez`NpC$fwyA5dnV?^|6zt z7&~1Uw!&xsr)186n^ni4>`?~G^>+U3Q(I%wG>i+RrYTf|rwiD0Y4>SBK?qpeKyzr6 zSCoxgAL1EP4xaIxDlS@{?q90CR2#&b)AvE7M3%o#O!?O}c=WN@!AfrNPzqz|0o6^7 z{sAMJf=QBDaDFxZH-}H=VCv?Z6kXPTbFp}KGHQb{+ zKm}v!#c0r;G|C4Ek?*ET8rc#NjSx7EmOugtd~--D)j0 z^^aVr3Uxh0FpDnfYUs(_KC&r5${or~8^X(Z_@$k*Av8AL%4(8@Bl%)|(1@@~SvMMt zZ>%hsq)=%O@3m7NG~*}3?1GtyM9dQ?h(wV4{eG--VR&OX%aLho($+YIW}=cj+}4C= z{FW+aao^=Ek=ez#_nzp}G>J5}9gZ~P z^Bi;xw6r~Q53`6Y13Izwj9K@^O#*LXWNM zg3eVvH{7vk_Z>U-uDR}&A{BJoy_@s)ufBimE|6txv}OI}ifCBS^7>2Kmya2Tc@6pN zH_fMy@uV#)=tuAlCxj}m$_2jPOBaX>3+xqabH(9WWAhL5AFQ)7coLV1~UV-)8FtkUtz!DV;2_=Pp(^PWhyeGTRq_ z{TEvB|F5At<-Kp}XlLG^;15(u=QQ8+vlRbRPzkPkt&a|@+fHwAV7-RWbr0~Y4 zan`a*uFY#K4a_bE>9z~T`m83-tjxk%WF>8f%?-UGyjY+&sFi(gTjT*j}q!Dh-VcqMzVYX*yP?2gjv%{RSd5@FQ$bXVpf z+*Qu@tK8tvmDh{gopLa(wbt&u9Y2~|AIiF?<>ciOm=qk>pT5UA`}q`>*MQAL>mUt9 z?$FjQ#(=JMrL~WqCWDb#)fa3GUVfP`(Uql^30dqUABoTRZJwrH&M>!h{Y@uCQ2|Wv zqP$gYWxM9T_u13ZRNwfQ^wYs7afrFFi^aRJic96v`~5M@H0-;pJI7-sIVHAqp^n1T zi@MXXSUJ*BvB+1~%2_tW{C-5;iCN+O)YQFlc9a=XJDpB6K6>79{_Me=3IDwTzzTgYw8p!;V=-J?_aLu!99Vd2V=*1} z`m)%qN+l-RcqU%)?wO`>7MyOcoe*`S=DKmV{(gh$2zBSc*Ir!`U9oA@OCoYwUaJ~O z%~=7o8|yuGlfTUljI-WWTh~lUn5f|>$)(;y3xgQSy3wFf76@CQ}v1QcphRUu`)XX`b88Vz`a!Pv|iV~HB|L`tYGT4|a(7$lEWH9A}AcMMz{bGvX|fsd^E`deqO_=IZ@@3O%FaC%=Y zeRp)_<4`Q)pj@DK3Er~SdbTlYkLfe&Anc4m%JR|9!{J|ejo3`Y7>gf9EbQoMX*}B7 zIkB(N8SGuBD`>V+kz~y8^PS?oPsBs3DI$VPh1}r89531jBF*N5?i6|#@&v_USq=xt zXa~on!nLe?kr}Q~wwa(Dw`X%MoF1oN&7@P%VaoVSX(~98veuGP)3r~Grf+JP#;do- z8E3eLYCDlSuR|W3$+~{ zoC~I=;JYtsrx%kHLaHQU#HcMlbN2J}`PQf4Gv#rID@2Zuk2=0R=GJ`9CD|2g z-QRQ*Ire$@W&6ojorj9%>`#tX-VVdQd7Z%2#4b~7((g!_B<>*X)kLSNtQ+{;{_{tT z@rw0yfXmJsCk}R+)gS3_eCkhI$hDSkg&jM|VW@X^uCz2Kl+sc40@T~<;Peo28!Ih| zQ3pn*ATc2=ndsOzCwrcAGkWE%Ddk9b*Kn$dPUI~~lz#H*bPYH&uFmz|myXP%`%d?D z1#~NqgYL#)VSICXbF%BWuUz1T%j^hwbXz94mVO&4xl<%GN`|{RxToy4PGBUx?X)MA zHM}kt&n41jkub{(Id5*BU3Oh+;T#Rf9t}HYGNK)ON1a5(KdQ1M@K^n($AfP`D~Mw$ z(D6h3mQ4ow?WH$pOOB%^BZEaAZ=Hjq*PRa>p@K578>^^3xIDV|>}P$Jm6W!7qvlcM zv+m=p9wI9CWd}sa&3(sSY;8r<$c~IPnMNl9vtzpZ|z_l zI?84{KUM((Xzs(Sd^Vp78yXvF!3ngI$HV=P$60PSJ#+S8WvLtNT3HW<^q@f4r=s=} z9}MZyOlQ5gmyt<4%=9;cUek|c0%u(u83%Tj;(M5LB6K3VOE{(FO7%64zPw1s!ys(O z>&2@Je=osLw+ceU*@K>9fxVCW3-hQ~m0aBF*!Sr--qiZwOC?=bhbrEBbxBpFepY;E z`&w1s*3NjoUW}v9cv+QFlcrEeT=BpKxxg;cY6=>0dMH2hJM}t#Mtr-gmaTmlq(SI? zl^W+OeVatL*Wp?hzOnz_VLU?0?DOKmM_{a%?W*1w>FM;mi1v-jt~CHrPtxV z((}9tc+rVRFbecHy>88hHe?lH!x6GDQxV#@DRrAIP|6ES_hn$jz^wE{q@<_wTFkD( z?6Rfvy~*eTMP3*L^v?~v+}u_A3#I*?4mAH!e5aLqU;Mp}#*Z$Z(ZGcG3Uy#c`P9t@ z;9qhjkf##gIWOuzSW zb#+}tWohY^7z6|sWGD%PkQiDzly0O%X$u^X9CApdTbdz78l=0G?(Y2E&kVY|@6Y%5 zzpvYebDy}b>zs4X_d9eiqe-@RzsShfMiw7exZ_#Fzs-}cIjIUvCNx0+;V*cv4R5F6 zgEmZvU1oRd3IW}AkXke$aY{v&`&?0l>M(33%8El=E$hm@y^fWN4U}rzTj7x)n;YQXy!o# zPaf;OJlx*fcdSyAbQt#BImsP&jw|}6Vo=RDb(N-QUY9F%{G3@tiT!HHZEKgA^YECB zuJ1Ch;X`|TB;s+L!_RIrL#J!>TJZim1DYh9n5K+x^zZez$fvWETDA8UA>WzAsa0z< z1ygKv*|Sr}X}rWwizvZEG1uFw#Uvyv>r%Q(eTLypG)7x;uor`S^EA(p%aCZAV5sG>~AVygtOKKXTX+hG- zhs*rd_=xN{Tmp2ac^O4O*I2%@J@euO6cXwexiQM_EV&|nZW zC|Q~mVp3h~$=7t?n@ys1yD%(7b_5|mO72l&5=|p*4!{wLa+HtK=Tm!lFIJB1k-6&dQ3N;8$J}x_mr5GGQT*KA4{B!CZX{T*Fw%(ZY(?~O>9}>V$En+Pt2<|d zsprs4-r~$-z7aU6=20Ptfe?!B2^Rx7s<=(T_Nw11>U8H^Dc?##|S>#Pwuug;_F*foat(%Mk&*L z{?oHM-^A2gSw*K9c*pPlUPKUBis!O6oid@ucPftPH#1v-Zfbv8>1>6Mh` z+-d)|uHYbF)K7Rwoz6&5YUHGv%fSzijaYMye%_+j%QKqSnzvY=zR8)Dd<~;X)f^VK zH#VcE@CA7nf}IP)Hg9L%_;6eUNIt>O<6qVlk$w&gAjHi~N9&*#3?oixGw)$SC&uZz zxCq3u{q_@IlLBXnyZW*O{( z1xBDjjyeBIzO(YK?6kq4sUv6Js8uQ%El{2P_f|FnG1;uj*-zX?=Pf=1L?Q%j%X}1YV z{rEE!)f|FPR?*{iGANij{@$Y~j$G%=vPK^k_C2z-E7wdw38|m$ACUV9vph0zsvV~* z=@Sca)4<&$lzVm7`mw;#d@3OdA>D6C^n(Q<{<6cWR-@OUj(H)=3^nPk7Gs5ohfK|v z5qUG*&PYVxx5D6_mZ&&7)r{s22s}A1LZg$6y0J2eT|ci+bDKsqSmqE|NMOSYWPo?? z*hg2LANe~dO@4C8{ty*g*?#ava_Cv^WBp@swe-c;ao>frX&-7jo+KHhO!F$m;~nlh zlGhsK2wTuMm+oJ0ekn2g-uJZ4%*yuLHJ5 z5xaT8p^gJhS>H}i(pGKO>rBne6r+*OM}@N!Q&cBUz@e0a*?BO$Pfd&&$3+a-fkm{* zj4?3+W=J8J%R6yfLT6H{bhoZyV&pDovF=(>pRVctfNAdI1qey92}GYB_o%jHQc;ER z(lyoG5051Q=rrm*ca|5#p${dl+5G)ZyDvxpT-&*qdrtXMe01-p4o7N<(b8vbECyRB z$!J6N!>Y`dzcaX*poFuGy|lkH3vI>^YidruZ{1Z5#5>%qn4Cm6tnv^VX+Xe4qN!7X z#H|unj6H=4ccv_0`)eV|!90;6nf|QN)X1cIDrM$6KzJ;!{b0x{?6AunB+5{;t(IS- zRSUmaamxH$&niRx`HDD+;ioY)uYfcc?%m~Pj*_v!a^Oa-Mag4N2Kz=4 z%j*GL=4tEJKe@>w9^HId)Cwtkr#@4Q3uI-wBjw+QFW26uTF(BHc&CP~-G_YKxpjvR zKqj*8tR_(6$d9m~$Mdb5X+9E0TuO>HaxlZXQ9Qtm4>|9`ODX#v7+Zzzhx@aKY35(S zW=*!u%*)5E+oGhK?Y!X+WP60$MTr0qM=skW^)Y#vgz|}86YrdD5#)weapO%_EqI%D zF-T^f(5d^yOKq%uv^|xRE9A6D{8h|Xv9+M;NGl7_I<%~0N?76T-IENs zdj~KVQ~HRc&>1c6B28l&w#b_%Jc%pEJs+c1C~AJcs_KapJlv6)*fBXZI@Idnd~%$9 zABYUUJh?d${xwLz;f{ko2)GYJL~9?xfj1iT>?@Jq86e;bbWSCIwA==*ns+GXFjrT< z_H}N9xfWZwSOxd|HvdX`{_->FQ~bTV8PV(5+K+#NC0Xa_QsGqrPhF&yrDz?fY*pdQ zG>?j--3~=3PQq#V2)}jNZQiCF<|wN?EVxuouDG-xUsY8{o}gz@_En~b&_F(bFIhIP zCU-Zvp?ehTa=0LA&Me#yha665Ze=Hx$-Adf$s~d8I>=iSw3*5j-qv}N5_){LhH`=r z7xv@()z=JiTe%lmO2kI@dMegaJamoBZY|d>lQv`4ci|xWWMTP6{1SS=a)JfH^sr`~x&H4f7vhcE9FsZbaScs`VOaeA=;`Wwk!qx}#)>be{1GpLo0Ip?8?{ zQFAf)8sJ<&yl|_utidG<(ojY0xrt4Q!wF&3N(q1bBrxbdjORNL&jSFv5J!IrEIWmx zDu*q$tqkTdWU5cnvf098h)^l=g*+kp24*NAv+SWkDec3-HX}Dn-gR(oM;6k9G1IB+ z=MmkVy%gR7!lPn;%lNiq?z!r}Lu47kb;CFKxo1bcw&+MM+muI5NcV`IIJ$j!xo3Pg z`m4uz5Oa4#u=oe(4h!+&tuR`5)i4i)S*-?>x6xnZ{UWwbN5`)gWiRGC0BOnXOFx3h zirXxaH+t#van`mdu{}ZL!>3H9kVsh@(QWC0uM=+hxtSu4a_q?!Oy=3SiR7)Y*bbF5 z_Tr)tRmPCL=LqOauh`m0vKWKPy>HT5iCT$pVeXXo_XDVT=_^ZDIDA+Yfi5H`bX+eJ z=Jl1s`px4uKMy;d4~UYpj48Nq|IE6zsaQYzyItNDE?0g+4=#-c$hklmZRHND4Mg+J z0gPgDb%jsiKGU2Yrzk~L<#bM%SEl>d|vjWkD(za9a2bBat)MF@FtLR#ey6+*rKEypHU zMl@8Hf7YQ#ogScB@eA%~U10r@*01*gWpji=et+l(ZhlAIiVgpTkvHlz-bv#rO5LD3 zfF<_g=+Tzj`e9kUCK>wRzv&TKr4H#aS9%vdN??&rJ~alJp079ZOc8jFFYGnJ_VTso ze)o@Aj~r2G(3h&eziVR=P{TVc)5(~cka6dF#nRM-E(xE9x528_q+Y#jy0{|9Jx`## zKtC3DEe@!rp68^*?yER`xSlk7->F!VT_90H2eBMMCaJq_L0s*PcAAS`-|sC(e22<1 zDc>AtHs;}N-i9L|*!`-~`F7iJ-vBL2w4E(gCeXUEEYX6S3wpWH(*uxMQd$Q-;A>Qc zCQ*g&x049QZm5YkN3r~P=;rc9#{j6hz0#{wsx$iJQ$U!l2NIH8F5?`APY*enBhX&S zvH346lW)OML!qJApGrt2XoWrge!rN|1a98WYeBkLQ-8#o?9}$RuxmWw8}A14zJaz2 zy3IdA3_2hgiEB0?`E!I`Z5{6M;mnV$`vD4e(GM3uf`)cs9BUb`F=d z-(AYSVPkoZhls{0EZmBpo4LJOT^c(03OHB-En6yV-gFZV4#x7C&6$>DUjiO|P~Iod zcU6vni9<2kZ$$JrIcwwHemf!3<1MjuUCS~ zhDwMrihDhWC5jKh;y?7Tg;8G^P@28!P!lw-NKb$Nq2X1kze|MXW3&syR1pHJ$cE#2Cel+GJ@)ZeM)&Z4QMNg}CF>#{t!*NgB--`OedaBKny zWj*c3wd6p6ewh2K)#V^-pgSy;cnC_%u-2&EuW>WkN&|GJ#$n@CWzh<={?4n18R#+6 zGP+Qg4yxOwc9x~J3qJJsFP}`3b7dJw_^r6U)WwGN=~U^BsAquA0CS8(tCja!O?g>- zaI}$DQ&p&M@Wotc%4Fs+2Un77Jmh4R7OR%))(3&j!gGCqlvby5vc11}{3F)Zc9hs@ zxPKprGDTnfzhRM&9nFU%h|z#w;f1~2{AFYriW3gdYFV8~k|LJnq?=<~T%xwWN*N~a z%&eBxTVmm6p2V)7v>&E&6&cCDz07YuLSeSL$n&z_P%H5aWTG^gva#>rJc=?#3GMfX z0C~dhg(*vo=ohVSSOYCVlYQpJF%a z1>ko~*$LdE&#gW;|C2XS;AasamGRyMo~Ws69A$iT&2}XUf0cq9^jLCOW`A=tT8=TO z{r=-IVm0`&W#R9~(}hkx@4VVG{vfj7-6UwhIO(cx-qlkjFRuO7n&WmD^jN}QTxbNk4${EPduTPA*JyR8$H?i}mh|$J z-Sspr8X_zjm&n#=2~tYmh?q`}8i4)-qlbQ5`LYefr=?8vK!Y7VNM;5hSWu!E3u_Cp zK8@_M42AhPmxu1L;I3EgOcIt79JtuT%C_%bXKdg#R`nt*M& zR4f!f_NBBKj?CyOTB?wya(|2~9{k>d{5L1bQ`WI)!8F(5@voc^3a|>w zIkUs{dOIk*;|CMlh32fsc#?R{5io9{mJA;Hwz9>Il1+^FTkl5m& zj$h^Q+aU*D?jsmo^|RfV{7d#KGZrgy?6r*$MdA<|a=5Q|Crw8KPDBHV-1k<^c<1qP z?A+xEOHF=hbD4VyL~}Sq0nH)$usiJHx2#|J)SfBdGo{CHL$Be(5FdzgMwbW4j^6+q z5-rpo9)Dm{Hg*N*{P6N>61&0I0pFz9ZP_6QJhz%Kn8+tI$2+0nKO)w&c7c20p?gwU zoCm+VN4xsXNw?pD!gAbq>Oi!p1pYWe!h|r*yS$o~kCCwvdfFaOg$@?(Y!45Ei1aHG z_Y-S~nKl9q*(UqHPjsPn-<|>*;rsw4g)LfMSKC<e(90MsO?6y@;z&9fy%c zSgj0YW9?p1P*_k8I<<-|hG}wh!!S-D$a@_$#f3{Ls)zBCqPwDApm`t=KAgwjolM zQ}p;Y_hIAP^ujUU^)EZ;v8~Ug+M{jI*Y=ULX16}nnzQQ1W>yVtB`auv0s7{A(6p_2 z(J{KLD04mSW}85-BAt6un}ixr%G2s9KF1dv6c#lU15GyQQ1N*46f{34JR}){-b#Ul z^TR+cV<3hz!?!FY)P7PgABK`31VVlA;*+BaNI&af1HDxl6jBjXTmp7B+C?HG6$y+( z%bneZxK$d?^78iV3`+{%Z(MqQYBM}!Q<&cg0&KE(&G2F(ChOyfIb~f7hYkfHjh1X6 zNMKM~6D0-8ObGPZTWDjH6G*OQaQ%cZO8uD0$J{55{x@7CWTSVA6z-thvzBeYc*SKs zElhUo7kmMNeZaGtNbn{>`IcDp%f<1GvYhTI9h6njPnAgNFkuWEJRK%z1U=+`0XHzn z;2)Q?lccJ;*len3May<}AG94Vl{SavPQAZmk;k1tOMFm#Jg5Vt5|9P4rw2xYUh7YK`R8o(!YyyT`7JFD|I51WN_&w~ zK(}7f+sKJ>IJJPy3z)aKee%#M6O(JiIB8QB3vb>-uDWXc0;jlgL-nDmA2JDdxN$!6 z-}zPN(}!lRaKTc+$u+JNsqb0T}PGbtlaAY^t<7^MpxFA?3FDqMhdKu_(`9c0<04S_Z@O$7Ai zKykMw%~0h`44^2qDJUp-^!+Wh$V|ZttBt7M0bG&9Wt3{knZ&RXoM$IXrwrDDoE5H$AmJG4W;~MI7`ZloSxChyug-U$4{?6Y}6m%NTz##0ydSLvf?K? zawnVOF13rz@F#9#rH{iWOB}<`4CP|az{u366TsjcoLqW>rc!Al8EWtwQ-i0vHi`B8 zh;ynQIsd&`9}kJ{bM{Pnk?i$^rzb?MyS#_x$VZRPnniT`U8NnvA0}BX3fMProE{2y z2#}n!Qyw=aCMZ1vQ8E;UFtUntb_nlREpilieTCE*A8j?U=Kz+|Im6ozMb2gE5HQC}!x_ZaV z%nbR4cPvY+*PP2e2Q-%Jss-xa+r8Ln4WBgWkBu7zC~7zx%>l3~89A_Z(3!2j_GJ9m z)~tatlXPVaply@C^%OSDUgn<3ecE-YKd5f6#udV@LJwzo2=N5A@|5*Aw$i54i9j@V z7NrKwmE@Oa!cf|m4SXR}D3pLkttt2XPAWr_B3~j%tfC35VKU=Xpewf+!QuBpQbtAw z>TX@hWbj@0js%5xz1LCnDLs+h{u{pfId5y$eye)W>Ca=gGn9jfJxC(Ap~s-kB`GW$ z6Q82YMi z&~&x=meZ_!6ZAIn*t?+i5s;9ivWWVz(Wn3i9b15dft{z;I+VOj97BC(yEwC}ZpAuJ zil^1dULSk08?9>WYwL7dK)-sxsy86&{oA9dh4DJ&oT`DcWt)%1I&ht_y`H7U=m#8& zjnTj$0ucYYm9zkl!lqTp;DqOf{`}+$lJKUaG@9n?khVkS^_Vf2JK z@-Nx^X`Q?(_}oT5Ct{Y{SMsnGF^z*cOaUAk{}uFWCm;e!BjrC7B*0znnZXz))1U{s zK7b{41v*(445a6d(X(xT6uMns(VJ5!Tvv zDE=lJsZkKp>rt(2g`L2Y2u(t%V_TZmGPCK!MY{?a?Iit^z9(#E`E&EorP7TpyF@7AV`(k35 zLgPy7py|j zmhL8G>`&y#(J=9qTavZI2H%xA$HRWY?ze~fBGrn0W!)HnW)?i4nIftR~ZzBWx@-O?0Wpa z5zby%c*J3};+KY+7|3Yj0-yXDvFp=E2EJQAZE3uZ*4w%?ML@bXZl!`X`{hw~v`v|{ z4|Y0BYW#of{YCa*49Xvy$t;D6E-Q%cGV&&G7Z8$cu*3W8zgfYy9d%hTLz z2(jN~rhyJX4Gn+1l*TgdAOnw>Nvv!ClS&Wwz0gH{PzE{D8vhmMkvO}gAr<$Evn3cn zPa$N^Ji_v1xdXAY=76k(X{mR`jMcq0A|!{#kQX62tKK4ucLnB6`6k# z{2K<_o#oTdyK>LZf*t76*of>(GXqC^(k^H~_2pmD4npTj#(YA~9sP!A`AC@=R7@|Pb%$bE80hKA;_P1y7`;Ov#5ntsR;_p5-RKx=A7T0q zL>c7WShvqo7(>to7*4|C_l|y9b2U{zSr1tR6#9wFpxb*^#&Cv@UFYSxB5dDh6<+Jc zDQvv}?)4$>m@weLTXs5{Pp2lt!jegB(YRZ7*JcuS!^G0TehpGkQG(VLK3roF%Q1?uGVg^@L(JXie$*a2y0 znbgkP3Cr)JLi*orY2l@gM9n@?65(#ZhUdA8os<8YW*X#rY5)2$--Ephy6pc8t zXtoX*NKNumpM3#rj^w8k*!d8_zig!}b6e=Jd_6L>IMV}f+wr%)E+TK6%Hp?DU$)x( z!Njwk>l(fTpr#ldb4VV+7GnQzT-YA4+tw-s(Yk)toDv^xR!M|Y_Ze%t&@BVL8gPSc zu;}2m*kz(dLCWT@{UDF=dmm0-Vz&*3pZ3K*o-*P#ziTW&WmzHZ-Zutp?opRE#S$@{Z!ce0ihgnY&g~l$ zQeTH4PCcq?)9gS?di>1d~=x82<#jg7|Ff3ygyg&h%X^3|Ek#rxnZzM1pLJYV- zX%nE)Va)_i~HY>)eiiUxQm^LDLtFx_oFv zf!2+}p1>c7N+0d?R_W)<#7=eNv?YC8#0=hk??=^!rSU2n-dEQcRBem0-zR$3^jm*j zgtrY)QLW5%e#UyCv~~*;4bkXZeYeqwE|d!w+GIkwNupF7oR^?jXc%QwWO2q)Ia(pNwkCru8T7=)_PB~LkO}V8~lA%I&W$Sz^ zY~H<}A(*<5!M+ybDHtph8nB%yB)Z!3YSy4*#=qoPPk~@mNh=!tSmf9F;J*F zKh61(ni^9_Zg9^kcB((amU>jh}!ZPm2_(|cVFeFXbu)>2LH*sqo{nM&AY!gb1 zO=A(OXjSXo0eTZnq=6kc_}rDQ^d`onpr~6Ey7wfSk_^@I*8@fg6X;5%Qs3KHtwnUK@DGB${p&< zT@vzrBUolSb^c1pRyCFWNJ255)r1!q zN7S?4=|@Pbh>WYRDs!!V7PwS7EN})IyJmn|# zvj>PgoRw~o8_b1oPDJwQk?nx5jnUE1uCB4r6!BBH%f4i=`?#2B4qbM(AM`h2((qpY z(mRKQ_bnimJN})vl1uXjN?i&sLoLBTlfP8DN2W}OqFs}8*pI*z**G%bmCAd>d_bPB z1Y1*zW9X9;GQAJ(R?8Q343te|eczng1|vT|O&cY)yrP7$M*gxdTy7Q2+b{vL z^9cF&+6v#_m6a>ZZ0-Rrr<{)8QaOPP;d`!s0L)%dRh7@n!#?p)k!iiH#3^(VC@D?& z@+u4X^!OR+am!$96!M?E==j*{sDn+uA+lJP9!^x;u8AGMPkplQy2e>pV@FjtgwM(O z*->{0K%li?z1jkQ3RsO-(uUSW1We#MtXH@Qo6J)SyLho-+$-A0)N%`WT8lu1htNqe zw1U&c`1H-;wGWWI{jM*GAZH%f*tT}Y1>d|COE7@kCM)*z%pi~~KMJIn`GB-Dd&83~ z{%!9Ue-G8(dbFw$$>Sz{^khUsiOE(^+x`&ZXQb-k#>e<>?m($uC&d55)DIDT@SIwB z|IMAba2Cmdw1iU%^poqCK+JQ_%%` z`rFXqDcI{F6@(@%uHT@(Y`rH?ory`v=4a4#Zt0KMsIqx+b9DC%^Z?|edUlbI)LB4z zg9K?g!CVeSkb&)b3T~dxdO*D)H>fw1sPJ`1(``87v_g+BP2shN#c?}Wewh8Uk+N(N z;|+$`IN*ese~=~wc@(ka0gt5s3Kii!`9}81`x2sP~b>h=#5zB$P`z1}xvW4URoG z##9X9N{}&(d>xU1x&!oZ4I|lBwux;CC2D+quC+Z0RrtrS>Hv!EX@KmBODGT9rc>%` z(`=&NCtLZJ2ev^2iV%W=cBLSP_%4hdvkacOgVy~p^d=MhoZHV3Z&OrDAoSLLF6{tk zv`s%KENnQTaxWsnt33I{Ru?9d#bgS9z76Iz^;XO3#dxNl&%bj3W3dpwv3l{-#1T^6 zz$*YW7E2^n_k=LryFgXcs7}uXTJhh22n!HDtx-z<2nO6 z6Vc7LFe?7&u(3!NAbPKROty#m;2lo+L^Vt>klnIE&;jiJTE!qh{so6z`O1TT9e53% zl^mtlO^E=8^-OO`90W7|1SiB@?;Z1V=mF?8sac85w=QE`ahbO@i%c!*>l?5+mNyCc zJ~-q&xUJuNDU2|Y^6pZeUVVZ8JnU2Z?zLZ8^YO&c_4N6PO)V7Ec2r+$YCue$*kxFPnd>OZii0;9A;{Bbbo>I5^Ax_;s*On+vZY0NdLtu?ce85COv=!DB|;Js3hgG>Q5smXB*{(R}NNdrEy9-Od( zl^tt~`+6d&zY?Yn2Ahr>rHY{yD^U1v`l<6BvZBM#H!jWVkmi&hJ0C3#;U`*sf*OuF zS%*lao-O|t8xpn;+S&@{3t-SN;Ev648FFs@-wD&&$7PAcLhu3B)b~(shS-$p(rGyH zQb~MrsgXLDcZ&P&@r>`}tMItMugHV1l*4t}5536I-?P}+ZNE#D;YlDIp-vJLvxKBt zO4Fn5Zi_U?pbc?_j@f3CGmx2iMsG*`-;^0H2bvbHPFrS50*Y@A2|jSySt8BRv zRd2V+0lNVQebG}w&_(h@KFVd|tt0PZ;f+i@@Xq2Snbtk?ydKvlP-X*=Fi;{h$_-G& zLH=;N0r-arN3g!*;qqP6EGE^hZ-@&ZEzL)-iwleD?^CUE`~lx?9=53^$QEi@?!up^ z=KLwe!F6VF9A*H_nEHR4uMTjDRq6ayuDi;JY6M)r&2zo1SDBBAAN>6~(yf0iH_&3W z;HW;gM;jmS0fI(gX6uDPvsRIK+9+;_4u};nl*3LlZeIFIH)W7Bwo(fW11XM2->PxH zzZ2Wz$u3hsGcU9(E)hMve6?*G&E82gKK4ByR+Vh+yfC&`Biev@Y@DBOTXod&FDw-5 zf_=(#?PkMVPaF(Y@Dpj8JmPIt> ze1rzrpvy}L`d-0M7$xh&nW${ZjeJxLrFBeSfdnzQK+jXD%)vx*`D7s(X=ZF?O1F%b z5m=h~w6_|E9vdX|4iG>rFfV|WQ2O7usRCOHp?!;yIeS<|vRuV_z&b!87@fZTO7sH$ zyu>I`KY&Hdy4YA@3RB3J;zY{|$)}tC6W%(Vw<YSj>BzWXh=??(r#SpWaI6ppDn&Q<8t9ZdZt)V2CYrTUdi+@!t zibls?I{=GZJ}F}_6kjr$0s>CV-q}@fdi)#TP%C492X^Hs{InU0=?~cT0VNr2P^Syc zWOI{`X`lqEqRxFYFu@EY;yowKNoRIttz@sF~{PcmqZ^Q$~-%-xiBk8iU?eMPM5a{NOIE zhjk2VTu3%W6WqnzGA3VK^*?zmySk(xg4D1HA~k4z7uK@nVGqg&5)rOGI@M=|1j|NW zJdWs%d(2|i9th6LkZ(=D8M5-FMEYwXGR!<4LPTs^rPCOtD-^k*z#NPO73z~2P&Na{ zw&~<{-ncInnm`RK4Ll~uzA^KsW5rQhg(NRyWm|nd=987Hz&JW3EyHOvZ~weZEGs8a$}e zEb!y*w~92LyP-7iV0%TC6CY|7lbS zt<(8~gl`U_IDj&TYCeF#Re0Z6n*1r1o`y;I+<2cgw?!ftcq<7~o>%C-kw_h9&(bflZr;9hb zJQQ+Hh6gWS^J~wk%#zBC)EjrTh5FWxI;ITO9Q815;KSONQ46%gT>9K#m#rt==@Ht%6ZIQZ^$&Ry?QvApYdU#*W<7b?)2f~Z@)*?Qoh7Bi`><^ zUA(be8hf-k3W;tjOs1-H$l9lZhP)nWN`dfO52=3`{gA0o-aV;b_$k*bI;(uZYEPGJ zqgvm-Sg}V@Rw2A{=uKS85j4knS&HIj2nR?P zV9?ENKmPgfCy8Xyuo*ISgj#8`ax3=TP3y*7T#4#QOAV%te2DslO`r?c55Q`VzZ!E@ znhJ3jP|#h0IwGs;C$uwUZ@Y2LBXtjlhnC+tWZ!o%l+%o=C$ShB4+2+rj*c}2XW&%j z`yeSY7=OQ)9~mF)dxZzTmx>`0mf>;E*7in z_}YWgRczj<2FA=nTc<)Di*sW+P1wZg4MGqJ#*lctRO0TRuC%pGX3x?oRU$#}fK#NZ zz9|1FGUxf`BC|?O+{w$w+M9biq-VX~9gvE^k&+<8K?i;^!x|U7)nS{x{~6`0f2=>+ zYg!9dp{RAP`95TYqQlhU_&a+W!1eC~IPse791dPmF z6LE-j-gr)KYu@=f6bpePYkDFAwvi@9-SWg!lIPQRmld@MQt4Z<#^8)2{%*oynf5B}L550$yfAZ>C3Vva>{b2#>xIkKpU z?Wm|I|BkCn?g-d5jLNfUcw{11V!;ITB*9)&?<~u@m?frXD7Ry2vu*3NXcxRr@craB zgxob~C~7TRRG56GJXyJ6p@pEdv*Gp75B4nHG1?^EZq4p} zRvrO|y3X2|l+V>*=A}JrW8LXw6-W(rKU%*T6Rx>4YY##`$%qvg)v+Rbs z4)h^G7bC2+bx*<>?DT-P@Dw>e0ybYe6zH4HaA`}gSjgVvXnib0R_ww|oE7*L-?T!| zi5mya@SE`UQ4r~TDRQin52)~-|Nqpe;{vDE2I_E>KcKt{gZxy_DZCQii!>^N2MV+} z^R2;H_JCo}2y&S2PfnX1=i8#I6R?Eep+4uHeQc|KrE}nB5=~YR)IU8dA@}H9Yr{dl zlz$~OfQw_MNy`DF8~z^60&JWJ@YYDhjw^AHC%}UrI}>5aPS0zBX;ktKy>e&`?dQG1 zyIw+qrkNEb&Y}oz-~Z-FgwN}(Y!4Dr1*aJ3Q6@lZ{w7o)tSUMA`eLfrM7ro{uK3(A z*v!DnCqVSMi!Jq@utQIe`^i;^&oemz@2dl-?n))jLGTYY z?k`)1f?nb6R`$>6YzKtoC!AVIpH<<^JuUD^9JJ1|)MZu=2qe!N{Q#qLbyF0|h>IaT zV7-*LUc^=A6^>gMfbjdBtB(DF51i)5jobKlK;F3bRMTavJNAuA2oMg30yB6SZQI(< zs7Qy{Jv;K?ObTAL+Oza+5OLR4q^MNlnQlE#0#&0R?f}Zi^w9mm{TrJ$k z-}9!L`=cwV6vQ6Q;C(DfJ-0sXdre2CM>doD$Q+W-xS2F4)xLqsSldSsP)2`48SE6k zXiVIGpEWa4az>#E;&4skov%l}X+!J+tm3L{o@d&C9?7t=KGtf(Ns0g?VEe#51?U~g ztI(fwUZi}m);`dO)eMDnHCG}@bUOA<@Z3Njopnf>M(*KZ=N_4u>p!&lM}y)A4fJYY zVGIb2rO;jnL7aJSu7bv?ZvMY6yD#VhD}6ZFH|YU`TIiRrU&lDjPTMZt*`0M5f0XT; zi-$|}iKXJtuBxs$W+h`i@Jr?qXdeIOf2Ad-iLuUuT05KHf?LV}7%4Sr<0oyvyuN^l z5aI&D&Nu4+SK5K#M3T!@GU#sozxn?MO!TBZ_97BohdLqsdOS7?fgrDA-@8B- zuKbT!)$364+H{xzoYZqK<1+PQl`bF%_9Oz~^*~bbd?-seRK_Jg2#+4!KX2`RP`P(J zY7kZauc*L=Dy|_To!(2LBIPch4B!*7#X}Bf@K=4nILudBzqbt-G3K}_Nuv{E+X(V$ zLg$=DMapv&i|H+ZbboOw)oy|7^+j~xV^S$vVWB~KC@FKj3=X|$5PuRRq>6*~^LNAJ zD7yuXBa|DPIBkxUM|LL+cyBXN`;d1D5Wsq2#PApk1eio@s2Ss`W4LKpzA#uo=ioGbh^m{FnHvTOkN<^qEe;yHK^Crr{D)WnG7!bgIIV->#GSl8EW84@Ls?5w z{0B>)!&`&TJy;^LY{tu?^3N^j`I9K<*w24di}e{FIdIDLyehmil)s)4bu!YTx%&(7 z{7Mv9djy_qg}rOShQK5BUm>u9*_zDopyI56-`D=jcf%S`IT?3CaNS$a@V24x)&Hi7 zB&;gBkvz!g#3an^EnSZZsgdLG5iC?{N`fRgF11(|-oRH7_ywDf;UMAZ{pxUO;-Hcz zWw&K;R4{KOxEHL`gRGf^k~uw0;wU}zDOpc*slx+xq&F6X!QvxRaU~V*uj|a!mB>YD(HYRq`{f-33iJu=7!S)pS-S=5=``DEmtuPyLRgOqmzHu-{U>i)>oZ&VUpP~cQZjg z3Xp^Go?s;cPHIaWIkP-+08)JW2V%=;1s6vV|pRcChYG=lJ{#ww=>Myv|he{b% z2XF>^SjTTBBj72YS^R*$Q%KY?Yp^Ks$S?z5xe;Q;Y-WQGp1FUkH*D!N8S>k!@ z(srwQR#(bzueh$M7iu7F|7Q7Wp4nN2B;PmTb1TOA%NKjF@O9Y$0pnr0(p7d+vtA$&qusnhUV6CiJ^8v!!uQU%uX|vWu4>E)aonc~+4&QI z=R-Wn>fMzJP_4Vi37+B0#k!6vq@ZkiGq%~KMOO86PP!8l!{kZq_s#*=tp&+pXqglv z!50qG!SYQYIopvv@Y{g&2yl)kYqw<=gP)yFT}>WL;vPzh@}bf_@JHEuq(Ou2^4a?_ z12vcVe+=PIbgIQ&2Q!EhU64Egcy?kC3Bcx1p6jpxk7m??#*6mmQ)Y7U7)@}1yRFD# zQB^|)rwHuwcOBZeHSME`1AHsO1K0W2m97e9T1HTtTEG|q3(cNaz!Gainf#{P{{j#o z6!uRZ#OUaN7tKJ{zFGCXs?vU*1uUeMvOmb-grGJb3n-L~@6M9LxyTO7jaUCC8YbM+ zv|=koPhPA(-nc+N!MW=n04jpH-(s&3R`f};CR74feb#yQlr`gh83)C|p{C>hL}nAC zAI@c{t9pXK`a4p2JdA;H8G8QWJy(jxq_d;h|DbYQW>}EUZ@T+GF@Tbp-cQnv+=Ars z&1pQTyF1PK6Yr2YL-bp7KgWWk3_uGHhtbl&OFp2@4sJ&LzH`3^|CL)Y+N>s-@@4y+ z>i~Wz% zj%6?p?ZDL8!09S80FEi}6$Y$PA^s9GL3h)?TAJCj=onn^xpy)JgN#)$R8OU;>a$e(m((+7 zW-rL3Qo&CLwjCmb+|pg?@p5FHh239FYxEUs=>8HK0S-`rpjf>qCky2}Ra$QzqDkAxI5S@9Ex0bI^ht zM?o$Gkr3M83(^eX3qjvg#=sWBRMBq;bLKD!!rCI%&`tsA2t-GgaTyBSIe z^19uPNj#IT6WiqV$~jfH=+fSK94#K$Q4>r9QPEn-zyA@|?QvRCs3K5Eq1^TiU_nOy zsi{i$Y^ba`ObR&yy-|P3Y$Lci3M?p4yYJ@&>&St!xcQ_!P;Ry|J^4)HNe%IVM@{X9 zK)e$OM)Zr1pvtOGLuh*j2w5f53g~nk!IJh^?*Mco`A6ct2hY8 zt0=ugBQ^j^Ubg6+_Wh?Srq7G)K|Nk*RN=L>GqiZH6?GasVmI;5q3w+nRy4HBnwQ|x zv6!a?oq**~koY}^((dI;NdPX?hi;1_^NwZp(TTffSAW#hO=D3yN(GOdPbrkh+*ubo8GfvF-UZ@AIQ7rWdjX9cj3h|*xz=BK89Pm&oWpKg*3S@-Y^LGu9zYrcp++H zgvtYBOh{vrOf=N;ZON# zQt z7LxsB+HJanT|hqHUP*$QdjJDycUlxnuF@T7+7ltgnKW~Du_sgn;CPypnJI|@<|H&0n z(NQ$b_^Xxl)~*Y>D2X)c=Y!bo`$F|`fM^8X>pn`sc4FKH@C}&632~dxIU?o|d4c}%?W{7s-5QKlVQn&e# zE(JK{yC}Nnzm?&YIVFa%O}u>sj1|-5R30beB`JVS!lM@(+vKce(IDx7%%jWT*93&( zpO;lGS>Fl+0`$62s+8iRXN^s6$J$WnPiT8Zx)?Mk^6#YQBUs zj0Tix^NCW0RpOrHdjLiX&_!xci!S2bRc!KDHyWk~HP{5uE;AHoHT$*E4geWng`d!u zQi4Z9XKwIlC52(5OE#S|5qO~mg3o7OQ)agji~!_7X{bX6sC+B{F_KWca=r%IQNVNL z@R0U{4`1$X2GkCC+i=ZKtw;{L3WIlCwGaOP^2Rv|)75**!!dtTi#vc&-+Sx;FD=!byALet zp?w%E)d@KI9Y*mG$oE5yvzas}YL|Bds*f*UIrna_Yv^tRBr%VyFI7qB<4g;ZyUFV- z?Cg5b&>gx#T2vrQxr{#9sZW1lczoe~Uv{77hoqzmcFlu*7a!yQkFBo`h&ub;c6W7M z#FYh96cAKO3=m;R0UL=?Km{cgkPazn#+HzfQIVlkT1rG}h%x9ChEAn(knWlH+!@^X z{@(w0ufzS^d+s^Ud7kGGSjj7AooZeh9YhJPMS#yz{!$Ch+fW>R2S_j@4;*|W;h-Fm zEbWL8OzVP0%X=s6<%(atkoL}Bdy|@#wf(HdF!M$@v_6!?>NoR+BzmgyTlvasWiEjg8|s%0E4?e)wf&*oi! zUcyUOJeSDxmGEUZVCNw!Fi!07fn5&1D3e!C3D;MuVdjxea5|5xBEEn*@{`|AMaC^sZd+@ab%maJB6k zYmUkhhvXb5iHp|1JuVJ%@J?ds${=qEFHXGKT=ANF3&I9pr~?nwtD2y8P@nu7PD%v| zdgZFge2$tS=6GcXLq+WqBmE)L+Q**p{$S?LZ_;L#N!v*5Tb!8php#W0#0`tEZkj>{94H-%LHWu?UKi%p;pGC0c-NA5*z?AoZbXwA6gh zu;cE~zcsuI97g@ ziEu7Y!53j>PoGqNVzlU(QE$=Jf}R$j)G_!?yhJ!e@p?9|@)y>4-~Es{7UzW|e^*-l z73r)pK*zwmJ+6h6D(~H0R(b&b@8i45tYXDvfHeZ(GChKCP}xTY7*{IHm8Wr|uVk2n zCKuz8B8DX2koufG`fF8jXiMAKSBX!MZt%AL%_@Uu_vtVrJi+77FWDT^AWJ$V(biB9 zR%Z*tfQnR@z~?x6jNkr+s*(Qpu(83C4&9F42NR?{HmRwnF5JjOP|MAAxtH^;tXq?#;IPt z3ibIP9Ee-ncPBvM(5=hO&m9!p%Ov7PBXY^CR%iO!{7JH zz`fJDp$~8X4Z_}fL1@6LcfctCdv^J4x_mmi`!BRleS}_>;g7_W7hp3|aeL(~DSO`K zX3qcFF`xo5mK1bv1PnaZ9I|K#&5-22zpCXh=uS z2Gzv^b+cmIe7Km?$LpVBC4t%Umtq%1_r+IJ(Zlqpau_k`HOM#pGU?T0q92R3s^)v;R8i-qWs9Bo%$F=xPgm!#oYkvZnd_uL$W1W6*)W_%- z5g3-lcMiH4f;%7n4dW5}*G{oeSHprD4SS@`2Ot@Oe%5ok(v&#z+53PSHGnqZ0X;mh2$oAm7 z#%{Ph0$Kz+VO4WGj-7DSmHmFwau`tJhudQb1$=gFN`s9z&-We+} zjJG$<(&`I(788$YiQ0#zhJsrp?33qf~py)FIuu~fM0 zoraBn-xo-t^(va)F@dvP2Z8xWOMWOt-Cil6T?!uPr^9UR5aUh<{vrFrACeWjC9mH?QGq}E zfvf>vxR}Q}&p0Mt^;u8F+CI9tGJ*zz>^lwo^s4gxvhdp|$nI2X_0mPU^LyrlvGY&j zh77KLRBjdmzhofpq;7nn4z$5*r`G+c=t?REt@upx<^wf|N%AJq2VN%oG#FYjy%G=_ z?J~7k>K@JJ6taMWM-P|>=_4rdl_dAkn+C&Hf>|A)%u-s9F0+?mE{D!%EO35aXQQjO z_2xF%CS9OVMHG-v)~BcH|4{A*>-E22idGw^$ZLc13trWzi8{h?Oo8T#^3(PfUx+Om zmZ2&`eFN6B5cB#&u4+4As`D!PNk!S+LdM`cxzlqoXicj9$O}TUh?0sMaGKvtLQW3$ z;?Ot}xrVjksd|%!-nzHvGnEC|JhxmU3*splf;vsF!9=qnY^Wk#%z?}4&&OphK{cEd0bD|$$Q zWh!9TO%5<4viZE8S9q)IR1^Pio<6+RbI)ITeSNo_YW=_Q1Uh}F5R$kH@0Fv;1^q`q zQv-`gRwf^M;g(a(lZfu*3(boF%W(tqoW2QpLSiX|P{h1!Ftz-TLo*9h{0LT0^KNc&MeH`=?j znq6kImbFX9`oYG#Jj;|pL!XC3yRK2M9DxLmug}dXX2l02p7aU^?eXPMQ+yb-Xw1&@ zY?P!wy|07yDkr77!D809<$2CC{;$mUm;dzX%NFiUJ|TaVPt$APglhn|sQ%Yb7R#I? zP)^BC(I0>VFHP}2=jR_fy~hgjY>a2Ty)R(QfD0GQXIVde`>(wU&0cH$J!9_u*z-y6 zZ>|CG^fqxc1Z-s2#wLi%tkXncd`1&E)L4E2cyT?Jgh+u4+4u0tJ%}4)a#vv)Ufhyk z>ix=$cj$pMkb!;}1po4;ym&5O28qm@_jbw~;_j#Q%58%pU^I%v(N@(yVeM$Tx=oc#IDI(zp~LGdwt zVe?ttWR`m;wTiN-LdGRaFAketfrK((w~vXZ^!7 z-q-=38BNC{+mXS0#c$Ym%lE2EqpYkuRv!XTezQof(a8T*1^>{e#1SV!I5Y6&H^g0; zK~jT}trhn_LV1E$7BEZG<`7kiK=Ywu_pm(qWnxW$Ria`+$xC>U=a`4%&KJ)N&&wI` zl_8BV{2(3dkor1@Q$YtCj%D-842JA<^WC{RMxcGWXACI9GR+3An|wE7C01VDu&>rK ztnj{p&=@$+qOn}gs(KwK*IOrVPwJz5UdIT3If0P%W3 zJV28a3q1hdYM)2s5ioEiraCAbj(_eJ$$PZ{acyWe3pM@oXWK+yV>%>uI$T4&0x)n` zhxijC0H*v0f7ub0XP{reY0r~2+YYrAm+H|2U*lENSo2dpgms)tf1z%uP(FzIFOn~x zS+%#QFot70$nWO12Hm&-)t=>_g9lmAgr8{vLVDo|m}nJOQp}AHmh;$(Ni}BO+rh zI+H^Kg$jnSB{7Q)7J+_sIk#mv6d@H&NAC*aeSGFP^o2o)q+9X3!21Qze{nL43{fLL z8?@1hykb{@$h+>Bk^X>AmohsaRSGClQ~@I;w=8u#;Xzt#yWJBALQ>_;H``;gKa~2) z?b!tux+8~|le)AEgD(i(K~X}cah()AedP_JFg4zkE;8K@6P~qm z!1L_uG#>{r9NQ}180M@82-%-Rwma9iRb;z-Pqy8;BKJv@29PfGH`e^E%Z3^`YWvH!6E%(1Sx}>U<5hJ ziwEkz$fdorx6T@OXF9U{AG(;OYzyHwy)}Ent^faX0iNDY3Eh=(f}WhP9_(M7AngDV zM9LD%a$qdUPkvuZVf=iIrG73?|e5$ToV_CEx7Sh0=Ov*~1FjTt=VPv+>7qSRoog$xqv z{=_3|(qi5}OpUVdMsCJn2pOcCz^i;s9J-}X4)GKT?B5Rq zWbWoJfW}M(o0XGYGSz`Q1XIQ=-wi`70`nt4IQ*dfYrE3q#JL_%?(kTh%2ZxYLe7W; z=&=oz}eKKQ;TxLk=$_u0dA_ zl}jUPfs89K9RCD@HzRky*a!JqMp{3N%<2DaqTsV&#>D$E)mqNwHGN~VWs;%O!VVaz zAi;jgxXgO33Ar@xD4_S2sz7>2$91%@QuH{np(_*|r2hjCG?kEjX29B_Bq)bU+?e{> zBMJv1si}-GY7a78px&lo1QP}^UX5i7sh)^xZJ zSV^P@DvK>j-9TDDl{rBYxMnqak;csdXJhqisCGinEC>FwV^wwLc~7tVb$twX+DA`p=3NJ&IMm+br!Li+J8X&A1jfK-CY?F8Aicz?5{>Cpw3 zAm30S>`@JjOL@FU@f%0Uj9QP`QxMmez5i~X7O6i2P7#CRA4ROU4gqZ`hAS{V4AoAH zXyBiamLZs_gQixclfVhhLizn`wY|t2IY-W zzRuPwp*sg1M{|Yq&?CtUc@5O#pgC|h#=9Ip3Zi&{TiCVfM~b({hS1bDF=se#T8`nO zS*GK;pG#%Z^Dv$0W&0Oz4VBjj*R=ai$Lj>7%%QoE*P;>jS+JJo{PA3V$@`hZmisM7 zpK3?@Ci4`g>ME{)N}zahlE$bAa%w8|&)XPQ%zPCWb(eksWoT8@ZoIAT5_V>5xcIh?Rc5Tg>`#6X=p4e; z8l6ClP>wpVcV<@;;9civ0Cd82zcvl-b7gG=*fc2XT3M|+44pOtzXiO;B^ci%EZ!lihc-vz2(iV%=$}KJX8-WSBJarO!wVMP*e*x@nY6g-}5H4;F z{Ys#xSSV(k1Af02nfekDLds8CX~v{NgP`J19VqrAO(AvU7-D%3tm0A^DX`^B%+T)f z=JR%}>T#dz>4q-7{QzGMp?G5o@#C=!c#%!tJ%9j5kM=p>tF+@X^i(#Wt={tVT&6NM zT#eXbernCJ;!7oL_34yMr`~NVWsvWyoe5YQC(QIsj9hYG>!IE1yjE|X_(V#XXnt55SHi{f@Gk19zD5 z4b*)(5VkBC-uR>K4Uh`?o7<}OoZtQ+<^sedYeOmJ zVnB{KL7%^QWM6*)nj>&-lU3*LMedJ9$ATy!WXL5DH|EB}^J? zk^iRCT)7;C0<-!UdXyeDJe9#pb$r}sznZ-g=0nH_JKNsR`DG@=2i-HPd{ZqeX<~W4 zt#&bWrJ9bSdZa8M3pw3OghYnk)<@f!7;FidotsIZ&?SVCNTml>ZkM#DfIYOA44V4J zt}&zoq`9vkTTAQqeAv&YGBykZoMIsd+9H%@T9iOBtOw_Y>3 zZu<`dJV+3X)1)(#ZaS|vk^Do23T@xB+mB}(2C<%glwUu$_hBS4|dgd39?IG43 z)CtBNS3REY7}qs*qt_W~Z*?D>yQlnpSBlfG3^pDAn*unBHpfN`Vwj*Ptl5mJC^GFg zg);~@BhKst+^h>o@;5>w5z)2({a;SEoq>J0+8!(PCN56EyQuG%0Rtse4<&?vya)=t zRMZ=h-i7N$vBFo_EK?cqhA6crMR-YI?6Q^M!xfm06u3i4tW3eZIZGg!JJ#)t~@ zufzL@Ws{OizE^F*L@H}eap0U3`KJyKXi%DIfQuu=-1$>^1gzzJFvPomLZzz`TpXz5GV%q`On(J*3FlfLaji zf__Wu9h_n)n@{%CwUfT&KGsuT-PA_4y{h^Ojf2Oe$xk6DYGntPh8<$40 z0tw;XQ=cOsna|es{?c#j^bo0va#TcPS9q-G^teCDuA|N6Ps?Q-;;@6}(34S@{LZ0H zu8{=owzQGID8XlAg#Ap(6nLaC>!0HFnrmBx6mcWpKE-ZIxET14@Y^~;<;Z;on0u&L zW5BV#m87=VM|C?fVb9#B*EDx*F+)MpZE56oj~|$~6MP6Bj-#=QOIbsqZ$1Qax!hI@ z6T_;rWqkbM)+?v$S=1~gODBc!IaU_*C7<>F3DECc`gfE}2!`s|KwmFnW*SER`P;nE zuRFv4ZKx%Jm%Tgcs$b7QNsfWPxGgpL6@ULB7!j*Qz$NK){~dn$gxAaEy=W91m@jA5 zFz}3GVl^6G%bhdV0;-WH#QY+f)a+3t4X(O+RqEcu`yfw(8wtO~WC`@yWY7U1u$`h4 z22i~HTg zT68+Dc>4ob7O{D~)?=hn1s5F&*pTDL%J4~0Fs7i_Y)iN_$ByWlP#tlF!s(rZ{J$&| zE?!-oin5Pe?ecc+i$+?6KQvDTE-!`}_ggz&aq#~}ClERNe?5Ox_-A)%QN0bGvJVxp z9sz=lilN6Jrt~9lu{Xlw3Dx)(?XLam?UgY68E%>755tzvGP@DiLa}i9_(_#=)U6fM z^~!T#d?|(n#X4V??pe3Noj-p)I9gWrYaiu0@ExU85w4<6&_$c{#8#Qqqp(yY9O*61Y+Zqdw!h_R}dI z2n|K7C3;pV->_neW^dp-UsWBO0@Pf6&+{YJ!0uRtvFebp%A$m|=F+bs1y*XvFXZ4< zK6MUw>M&Xi*`;=V&2r77u)yMvgHxPY(Ibq*&911l48=!BR>DcTq0$k@HJe<^FDC4)=(GxSuFy26tYV6 z-tQI9w53PMr|pcb-XHN0t}qO(KIeI}>tZo9q|Cb6rf}MkT%aIM4)OJ9fhgHCNz(d@ zeddb|X(zZczHpR;h3U?)Q_wH{TTReEc>nLmo^WhwNA>S2(vE*-q$#D+5q)!N4j{P_R&diGbd(vu+d*mz;Mv^oBV3_xok&lIMC?3Gsh{e= z9Kf2`&pCLM)kR@JUC*}f?jGroP*#i-d$_$?c%j(L}RPep_w1o zI@Kgd`q>Xu2I54y8~qT*!o*;T*yzopL%U_oR=@QbNdj)rnMRPCy{HM6GTy{Y@Yu@6pv3zLN^8 zn}d4bod8I9@EB_hZ-H={*J_$&ie=X-Sh(cvh1rxZz6lO`#LNdm`=YJP8cIY|L;@=p zZ?t}3UTw5QgKJ}F@rECvt~oVQ9zozQPr?1@t4d+-5Y2hIq;>`kc9frgGTp=Co*Pjh zkJS`1nmPmFWc+(pHqiMuWr96+TR{n87lFQIC0(}e|F$7c(S)&$G=?MJ7)g}+-jl$6LU?7F$Dn%8!&2~{xFR{K#nEeoRQyK%fw z5D|ibejG;?D!&QIjdPq{W*I%_=eAEjj*zx6OP}9Hw|8XR_&Du6l!9+R{;v~$&q+}P z=nf7rM@ef?a-WbsP6JE>pHCk-yjw(QsLTG^@zu&p_aa|zGK-el*6mq$E%qfx!fbnp*@jy$6Wt_jV-dK1m%3ej(&ZyZp~j%ABAv)@h6YWwa&Ytbl>9f|LYg9Q~M3h?owk-hMSOikba>^eMU zFm*ycs0!*y&%+8szYfamQzTADpc(ZJ{I+;IE*y#0p1T&dd851-ptAO#Yd6EN)G=H` zHS-9u(P>V~0pfK{ToY2wD^)jyEhISY8($hSd){llI&7TL!KuqJquI`E!IdW~bhZ+5o9s`s z5BHAb?YjQfcV1e^5SOIzk>ax&Vm^)RFd=ifOWawLU>11|E zdoYY&<_Wd4$+b$6=m{A-zAr~{=7ipII+ven=dYo7KBefL`T-)!!7pWguiFV&-Hwho zoXt)cNe7J8G2wo`lLWQ(Bxg9a0r|lT-|EGL{b6Ys!m=sCxo4XMdGzAr+IOCwmx;kO_B zb+ZY;HN~EhJMf>?WgqZ2az?b|OSkaKuLA_3`?L~{O8P|K&jc*sKCc?QYaY-mB8a-y zeRR~H=$~Q^#!MhTC<~O6>sdL;6pBZMTrH{Z7}L{N$dqEfV>mPWtd}s1LimTUu}0@O zHL3wqj-a*$dWh{0Gi7hE4^5W}b>u#QQD577R{f2FUuN1B^7D8PBzdys^jB5T^qpvAQ0cE1a7p+ZX{$>sf1tgOn>pk^wSilh1vypf?%t|5n8o(AJztifdB0DVCl`; zPnjhwIaGox{~$`N4Z9Z;1_f--hT=iH5(v@!#6A8|B_LS zOd}hee5X5l&cN~~3Nfk3O6w$i%=}wgLXc&3FG?tiD0UBWi7f=Tl?aHT>kpz0%Xwej z`vd(gQij}hg-h@GmA@8z8GJGsuxzxSp^jZ!W|+jkiLYX_!f~K##-hC7zgPe6Aa!#; zTeRmf3xBZpznJzRFPDE1<}CU#Q@A6&M4C-x!oZ`9I{CIo<=L5u%-RbXgP*IKTy>ur zV5Q95>En#(5G2?T8p8T_XyqyYZ2U5T$t#+&+ItN7W_st_`C{({?(%YnaqXrq__yC3 z96m+H^t}#^4mm7r`%YH}unHEK)}9?gX>w?FrI!rIR0}$8PIpFyb|5WK27gks__=5tS#0PVfA7p-oCts!ykJD?uYM$5Xk-Dc?IO_w91x(B^o0Yd` z&$H2UpgG%jkQY=V&g@ZOpluDgyP?`;u+wm(P?jqVUY&)7H<-TGt`UT3NKBxE+aGa_ z_N$RTWuvgY9`J1ZA!$AUb}hvR#c+8po(NunDapkzLSjl+b$aM-885m$jEtBECLI#+cd%>wu zpAlf~JpBTyz>RC?ip`JRVya*5Y?rK%8%LB-TB!EaT73d|wy3fRj4tje+Jo9xbv4jf zk1M*^a-$<1s3W22@oV}BD*a)=3$yAAl@9V0m|Vd7-rDJIZ(l2aZb#B509d8n67I(s z>gMMP(2G7Z?dXSLbY@7S%Atw$kkBsla*Yd;DWMSDX3lhFuQXgt&LlB7VQ=QX&`1TrwtoM9$EM2$5Lp>) zeb~tx^_R+R#HjThM}&5_%*KKskfViaa8JNGrzt1!&(Nz`$Kf=S+YTk5Zg_;#XnPM` z(Ve$+$CRDLfB@rtvzX~{%Rs=zrM~xT;Db6}Wpf~nY1GoGge6V-ivwFt(ulY%Q98{dF%YDYk0c9)f>9DcxXwf!QcX6aoW;-=*eQmbJBBjCf(cJCB4v3jn9qr zBU~^}2QizIrr6Whq*9n0SH6B&0%A8Vs z7@K>r0UNe}B3l)N>b0jtMQR70T%7AYme_Mg+P>_!n7FvJDeSZKI@k&qZK}_4%O!XG zE?4i11Pb1jsly1o+#c_cwC%1r@Lxin4Sj15`~oxQAR_(!iZ5Q466xvioVJJFw6we?6@v_tc-q{pZS>LiyTY> z)pyP_yS~z?UA!zOk}UF0&C@MXzgSL#Ui>h9C}q%fPiQRsKV{TA>W7f~-S&kuT}$Kl?WYR+nw(Bz);{_Nl|@tXH1`XpfFaX`&ZSoi60382 zIS_1NkVg-e_`d7w>FxoU8bSHj6|q{ctuG%03T_0GW^^u040vQ04k8={7 ze`55nV|hJF!scl2w`P7Ay;oJ-Z8h1NS#yuh=(`uLw#7z5c_K&|0$cy$3>x#02r~k^ zG}_a{)bpTwoFK@gnI5X0TF)jl;iL{6SkcXFnB`AgFhrelnY_tkd5)tmCr5w(K6aOW zEknPjnE~(44$r(S45q9w3|JbSz)<1haaj1(?-JqFeteFW9JQklun|>U(aVJe?Pe2^ zMv-T=f;an)!o0+6TbmdzkQ*`1@UsUC8Nm;V>JIf2bm(; zUcUzGX$WLL1LQNEKZ~pmFmH<%+SX%a=N9~KX1%`M$g$?oJezDsVkH%P4`LIykG|?Q zvn#7wHv11u;>cSY1LhTiG9yW(w^brc@eBXSJ(CvhQ=+YN47ct%dR2kna`cJC6mTlu zj)cgJv@`b&z|_RA#cQsQ?Mgny!uJX_Zn#fO$plF`?Ga!>&rZShXAeo5_YS2ARMB)g!Mt@jd3yg15P_YG z@a#J4dw97iKRwF1s;9StsZO=Ac!D%yn^Aq-ANYoD>3Tm})K-(=i2a05Ed{$!CHpyS zPIPbcz=hz(-f7m;OHSSe)N@MYy-57_^ zxPv+jWNR%KxE*av`LCI=<-rl=aP6{CJzu1_jPuN zULgxC!0YDYVd#4Kv!HEZiB@1;ifpA92#U8d2JavgnS@(&LzyN2!BkWBf3hAlhb+`~ z>rI%!2TkDlP(EKd)A4lUb7o4|$)35Sk+iflX^LMa|6%*_+dV$esuChTok8pb`Y=Jw zuKAUay|C&DhX!-VrvSq<(2H;k(y+82IceaHYYa8I``xh$|DcOnP3q-k(K93y(t4_r z>uE%>G~BAKZ+I>&S;ops(==K*OlPa0$z^zCEr&qD^O|eO1NL9fZ-dv@!ogEjB||Np z25I~hpDNsrfODs@+UC_tK?;SOVlhecdRFI=$k6|DA$c-mY8`&3zedT@F14PEbjJHs4{2>m%L z$j2F2?!w?JOPtWAw=F&I&_}~11!!`I@ik-4|HVS2C8LlErTXZe{1frrQ3?Wqq-7UN zVlT$4bB9?8bX(bE?Gc&=hmo}Mp~h+o_-~f?EjrTU{p;*-S5Q87<HPrLCQLx&)5u-nK?!Bj=3hnAF$JO~?iRLaO<(ec>bX)1!qu>74h9sObatqJ?uh5$<1j55DX%Fz^bF z4y5T9U?yyQvD~D-95kAGN3zAAuf0eg1o0rVhb%#Ga=C?`QUCsy4z_5$bu-yE;2*TP zi#HZ}krz5a@Y9KVrKi#f2t2Y%)jB|GnoTK~pAWaMbjAg@7XJ!V;-0o?W=q+pHGri$ z@H|1P7KW>C`FUrQNjE~tTW(5}AC7u15A#bU4U8~L&vKOv++;;^9X}A#+5#wzW7NMy zFS_gBV@IbTqhVDwX@t|x0A4fDe0IY9y3Vj^3eK1Y)iEO?64We1_QId}%nhcN#GLa| zzQC&VMBxY+PaX<}KYy+m1;n~i+J$@U2r26o+7{USLJOmxX#*|`5u5ST$U*+>$D~nAD_kQw=qV20@`(ABr7d)Krc{uWwAVJZ#%pV z*{TcavJFiQ>;HR!15dY^PhIH)ugwrMaQZ5e=D|(Kz!&1`dR$n*x$?EfzN^ng*>nH? z-XSQfe(P9~k|8xYiPM+oL~S<2x@w5lFOu~n9Ch66NPT@%(qBG6Q}2DCzb#^}C5`(&7(%aH5=sC@ z5yUhLM&G1Df`o9T)a|m4g+w~q)@b?e<7<#ul`_e3{{?g>hahRw@!ddd{BRGPYCyBo zZMgVUJ1S7I6Qi{cemmFUB1=!Bftn^KCQD*)DBX5_2$ozw@1fdWr15GNB2okNM{e`GJFzyfADzLHD?y!6#&GqYJ7dj8%=&N~VAPs= z6y|glwzP>g>zFJ#&8zQ_|Gg?&ws05Xo;&GV(LwA}@97P-~`JrPi0KRyLg=78?tzREktxQ5RDw+_4V;l?35RwxKUX#`riq* zk1nOtP8ZBJZ`^e1%$dVd4pWN_?)fmFrp2i+2Tg}JtuEqEq$>fYTc86>f4yqJOM6;K ziSJYHv)PjiOmaMbfmQj7(Bj6x5&O>EOhUon+Y!?iCvm`lG2XINy|bU?w$T<9GQM*2 zp(magrF#S>JM`xaW~7WVoQ!7m>KK9cAriOI>&Md?vrF%J*QPC7uAD0wR813>f}c*d zU3EM@Q>u#9IaOFt`8Lg;b4Dgdk1dEaA8~5m{`~-!>?*UNIitVqLRtlXlMN|7@VPCG zfi^4XEzol&6=5h-#~g&tTiOdRRV4#=tc)dl*{_p-|Nicm(^{xA79QMVDVt0XSsrMD zE`_x1c$nWq7i-ez(u^jDvE-41O-^TOvPlfrtO*6i@|7_ja7I1%_6lR|%)q+<3U&Em zFstpteO*J$%DhL_B1-T#^p(*>P+O0Xb_+X{ab$T$G2PE2%H!&%AAyiN;I>i}-w~W6 zjlj^ZtUEsqM|(>zQ*>TBBXq0LPmuk6m@Nwt@_;D$VIHVIGOGN-D=$Gf9BDCpB5t>o zOkX(5TZ%Ja@zYE3?SD>Qy*2OF7kos)ki4e6W<|{As=l1FR>c3(L!VIsS$p03zhU^H zfx(|Z^@Bz>&aF}|aQ8|$%!53Q4K+D%6X%AZeAn%3hYC)*ppT1dg7Z*yPAnnK9NS{6 zaRKz>+GQ$*v|8FEn&ffE(jA9Z|8G!OpnO)styUq|*eY%K?a_6LY#cov&j}*RSnYv< zCXLW&o`6RyhiJ{+?K>5_+>k_EgS;bkWLmU3dyPUa8OjmejtXyy9+(h^BC)$T2<-p_ z1=g`-C}r(FWp1awFc|3Gc6i}J=V!Rvk?#=F)UX^Fid?kUQK~)7d5e!rO6IUi#tNaM zeI5*)^H`8?4UQ(u;Qh{1yR3Ub|MEmg^|L|F5C z4xu7WQr<|qpPvg9b;Wfq3I_lKzeLXJ`oMugeJeP}q0_>@9qd(vv4*B;j6PEt^GK1Q z@8YWpj>yg}E0)gK6}|cBTE<|B^S+8dM6wXQzMgo|shK}` zWI+F`LJkc(G}}v1tBm9h*x08@-rN;!Xq=Daqy3mkSBKBc_7of1fxfPjSZz;T322**j(M_fZ)I5%jRv*dkTOSMBNeEiHjuIp2B*# z&DjANZ>sN5t(JAQN%sxMQWvF(nE3GbW@(>LhCAO)Z~oqKu{gE9*X!9WWEVpVuRKC` zNCns^X5ZyD6I9ZpCYwt@3UCjjA7@iv0-kgE(H`eNiQz?4a~xALemKO{+CjVO_%0Cq zt*#~0U$)`9TVeKQ+(=dR4tIO3;J}4#EJViw>mnB7&@PF?kUUHE%ZTUoQ^$G-g(k0% zcchHG?GoVvyD0hP7QetSnzXq^Ks3b(Y1LndKrRYCRL&ifs`q}n%O}QfrSHby+%e7M zPsKb=yg4;3#*mkkJ9k3@w_CBGSBie}N(9_i`EtrILEWzxUsfDs7GYmW$IQ$zfuod)Wc8i^sL@h404sVai-kA;#KXl7SV?yD0e4V}B%pG>R zCqb7!;gNE3;nn;vQ~rTwC!Zz2dOL116@ z$|J&so0-ULj7oK;a}PG`9=SpPigEu$ReyLQ*E9_M&JIOfq=@73X@y4(ysb{{x4Kqn zN!;drbnwaW@aScqYLlVoQvN|W>#kFfHw;O@1-*r(u}bynaFT=F9$E3Vw0l+Rd$xQF_Y#(uItx5h+W;Uzb!DkSqt+~&0B&p zj-2!eX;-l=#y6s5SQ4sVzTF#Eamw+@liwsePGegvZd|ZOC&QvEVO?{If!CuLeHYv*@~6% zoC-7JHaCtdf$DnxVjYQJ_?oQbW?c< z-&#X!OxT7B259E)cd#sz0d9_UbB9Eh{1;bi51p;FkD|3Elvv1J*kejAI#y;jso68! zrTmoz&3)hC*wEVA%6VE)jdqJ;zMys3fZWpEuQhcjXpxurO&T}z$)%X&z5Ip1bCp~Y z`J{Q#cxBrjpU_qE*qKUu+w8SQ=^>4aO|u^f^IxvLW(k&Ka{m==%V5gXU)HsHIS;a( zZgE|0i;iiJ3Y9r4_RL>lH=W3pAo#GkyKAefX0&s)((~m%3s2Cr<3%8vdctKfQW)b5ARC?Cem< zrV;k#yDL#U%sS_&%ipBa-6m=Ns_DxS@j;gDCCN{Ccj}~g+;qlx_ob$@9x787E>VsC z@#N~RfRz>}^L8`4=t6(liyUnqqU+%=xZ|)(Qs%C~*09COh+hr%N)q#BW^YLnFLroa zt}b6wjAISVwCbU_wmrn9jNF^9_e-oN6mkooG|=*$Gx&5 zd0)Zr-r!#TuHyHtVP9*$*u;1&f7xaivl3@U^Nh$|yPSF}Vn$?{oNKvo0h{mo+)hka zZ^q=9uVXDP&ioo#G-}D%zKm>}Jn{=hzivqVbhmzFGA7bq%=;O_iGPQ6IR}ZPthoCf zVU<+wIok8fYTHkD4pVFMy>yRL!+GL&1Ui0&>FznJt=Hg&wsmDC?n?@XYm&o=Vmuz2i1&zcz@sz431ubfsU@TimTySXlVIvg6Fn>fy} z2S|PE-C7*X)OEbmJKOoMdtdpbRtlY0->u3RaxVkyj?)mms$LrCFGPQ{oy)IF+-SXb69Xtte66GU!YdxvAqnhcViua0`^|6-1s3Uti zYcDHC^OCSKYd5MohIyo7T$k9R*_mT9qNHn!PH*nrL|Y`hx#%Qfa8pl>rFpf3gKD8y zXcn4#jVu%7Y1ujWEZmA{W_Tad`M50DcV>12?#^@!>b9vree)P*Fg%y}vdq;|Vt2_@ z!6^)a;Y#pifJe`Kn!6D;-E+aP#4K&iD1#AhMb6jNr+MY~<%q6cvd@gihq@H!1-a=w zs;l1Q`EmBSjDkm~dz8p~3m0(|x~{4|{UTVn>lpkCn+i@?JGnRxJ4g{H9cDU89C@f; z2u9czN}-7N&>Kba>>UDSz{uV8;IiW6a`IwlmLZ#r)iT9SLA+>&i|6WhrRyBA`PVY# zn6^>ZPom{^DQlzh2lOaT=FJ`tpghwo7#}w)p8gz?eU+@*GgW3^)2&b7IZrOsRSRk< znEZOzwZ4OTzCUHGB*?@4a1aM(!k8q-RQp};=jqn-+btP3W>EKHo2}Ww6~{)JwkE4a zqr=JNvPoL2>u@CLnr_Mnxy5sz!CE&-c<{_n@0G!lt=DVPaXm{@hK2=d<0&JxQY8K3 zeRAIC$r#+Yi_j-o1ssRet=II*r)JmcJ7v+LV`f)zeZSSm;-k9kp^eib%$uF#3z_$EY%FmW^ zcVSBzVw$BNypP1+F>tomQt4-VekhTa9&7X_(LQFywBw>Lhr+0Zj08gYDQL zB;f=5;d!(69ktXsqds!!t7H2x+e(7G=0XE!7)R zdN5SDgu957;`MWG54_ZuXSNm_?=_z`Xj7Cs^C3SFZS=c91D5bvqw-?y!RYgee+QFdGeYE~NI<1qFFeUAph)1uu`A*e2YW#UDGOpOB~@I|`ZJrSYz1 zmzDlTalMEQoqi$pjK%IZMKhU;4BT+iU2gqU)33XYlbxYnV5q|UNV~EA$~H<62aP=T z`_yu?(_qQvY1Z$ZD88m}&zgR0SG*M~SnJV{X>>zEr0=)*^y;KOY@K#T)6B+YdVsyI z>Mmt{tUA5=HLflQ1wfk^x&6J`q#2sOT=%%-va!A>slTqzQH~TlvZXsjzd)yBK--X& zwqQu@4*zA0SY}fs66L;(f4ue!S$lACJo5YTiR1|h)Rs89y>PcATym!wU>QN^mL%H! zIFgg^aeP3RH{oRS+(1`L>15H&pXe@L+j(hZ(+CHx&#G^E&7(m0U7DfHm{9M0A!oPK z<2Sa=;}`DTSG<@%hAN*8x?lZou>X@#Q684mOM6fH)&**i&7V3K_D`hykIhduJJs7& zi5O(Lc^SH`VW#|4sSV-3jG9;m2z5c#OGS2hSGmeG#Wd8}Q(aLdSl<9XO z=hFwSvCzIRK7tDtlrr`{S&=urV>tP=UcuWwY~CPqgOtvKo#Eng?)0)%fy}$KGEeg9 z-ueaC^E5?s3u2&DA?Kv5R;P?Ay#q9JEcBoAH`VbhjAi29tWMFCmP=rQ;_S*?`J>vr zZ_n+o4_u!l+@3nvS5dxc#8{7nySO_4FnwY0<0J1GraGTJsvXN6AJVI*+VYEMoa~1V z|MnVf%ghVs)>w|yf)E8r)=p*$9|9=OJ-aUX&G0Ndxyl{jTtTExi1P-J)_%xg^*5af0U@ax!@A8`O zUUqBOFFPhuI{5_s6DF9VN+rRVuZcIobm+AX&;$KsiDYD!w^3~dS{Vz6VTbe!+= z;aV~TSbNH*^yx>R9#LFY?4IzteKeMs$aI12hJ3AHmtrO2WK^FW`uUcv-7M#yd95GZ z{e-t*^4ioMm!+MN?_am9RrQpV6}euEgnV=0c%iSMmnYk9dN+4#B2N8SsOc0Qu|E?M!a|Bt=z42vpT+U*(7$jlfR1O-K4M1lzr zB}XHQ+Mqa!l1=0&Ipa7IL{Mx5ZK48gASyYd2uco3j!JH#!RJ_bHA!mg=cl-3pvn9$-t(=?Tqf>9C`zsPr z(2!)2u<0O$bCq=;CmJlC>HFUKta3(zVxDPpjan$+ zd1j#R^Gs_Xm8U_;p1o3j=%rQ2dGiEaiK$L?H-VL&&W3|Z?-bDJx-0u*`57+*z)mlnn~VoiOc=@)B5i`gNoOUhp0Lf_g%B~;sy5V zGGizB_MUGIVuJ<0hgvp4%)wF}d}w3QvUR7&W$(LRj1IIZ_w2B4b}ydiaSf(8)4{Tj zbXHOG=hGVX=lAUK9BIv8Ss9OB3}qQTTUSJGSGN3uk`XGN5}Qe(kVE4ceHYHo*@d)Q@pa0UC%6R_aWvfc< z)E`97iP0{gQX_KOT~$HIIJ7TYgAF>%gUf4^!R5`W%0i!69(I!O&FnWD-K6UJiIh_Q z%W?%%Cky@NyqC$`$@7(*p!hhwp7Uv2_i5%EoV?MGHGwM zhP{$HE!POM9E$hf3SVBQ-e5|S}I zSmjK*(#@l$#+pCb)Bj$|PfWXvGdD5TCR{kz1Xl0yP7E`~v>N&4D`qxTPNMdi^CMjl ziLRJgA88!xWX-qz9AWHqQgA1G;@U|9*ClBVk(CdPPEnu#8np_^ey z3TI;Sfs!|1_}OO;-TC?aC>zXawmg!5vqAN}nQCqfK<(&Ka(cG^4Xu0G{*IPt-Mqa# z63w*_d@6$D5TCf`6;4&Mzr!BwzNA^@&(txlv#tNHgr@0Uhu-WJr%S{W832m%FPN}A z%e^c%_p{{@K_RpI?20Qivhc`;s<3|zIeeB;ZJhdyaPh_2Jd~_aEj-U0;A#1Z7V4Wh zUGluhx@zf{Fly;!=fYrJxdE zMmgh(9j|ENlG?qQS=H=Cnd~{GoXqh#Q@`Z@*2*5dcM(fp5vG8>#*Vl=K+N!!X!aG7 z&`4C1L&>Y+&YU+j+8Uf+da;v;gbSxisdj6^;xzFd+u z3W6yzm;L(l=9$IXCn;giEtb5>zSQg$_RDX2->42Zw;a41tT4{b8zUB%VB#DVK~)QV z&Y)Tk)FlfMOX*yaxY1YGf=0GoY1)~$^22!htlM8JM!g~(^fU*0ze3)XMsm0X^+IT@ ziSxPbse$Y{z2dLw)rT#VLaWz|*(APbLptf^ex0eb#)Q_X>k9ed@icNJRrurwgM|4bOEu0N zJsW&3R=N&Tq3+*)jH=+gXq?@q`ix=Z1phbFxEV@h9pq_IvTrB~{gk|33&TT1^HeB{xixuup+FI!r>5}{^0~E+-be*TF*3VhLK*=j|B5Bp& zMa;+}Q!AK5I1bPxkw#6BMm3gRTg)=`gZ0GOp`~gs72wiCUU9~ zdeZ769b5D1m6A@^o;~8pp+|M?u+JPLgh=$X7xi288}%Du{h4yz#Z_}GRkANG%=#T9 zBSdeib=aY^^1lBVY1bd=ifQmMU6?mmoRnr687iWtta+mMt9Xv<1b?s`iXZhhP(FNFXB?oj;E}XGsq-GPTJ(_bk4}2(alXqPRcs>5`k>4n0mu8~pvGL4i_D;C1Mv!f zH+Wqf(V3hpH7%#Zzf9s~z5(g7uzwvCDR#`FFk7I-AEdrFhGMOP_4uC2r^^yI8U(FM z`(|O4qVjr$@IaCNc(@zvphXm>+QN>VkY-QdlFi9>AI|GqfAN zn)!~ne6Y01QGrUTtBgVO5SpOr9%Y#)6-48!&MEx%Sv=ugv@fuxKKL1czvP;(SCZq)nE(~|9U%I^fqz5 zNj`qTaauX0F2Hs#vr}ux7LF4YU5!;vuV&Y2wAx#`=X^19kEVr7X!jL%%gM*jy7onl z_ubd(+HlWKu_;h&fi>#UV%wc$_M5gZ8CckJS%(YH7IK1A3bf)5 z0u$ql)o`DL3AjYsw#Lm5JIjf2JKy(m7>i7ewHv$F>DnJ*l=Yk#Y#r`z89urqw>&PQ z&26zXo9?hPDz#sJ;(1rv^Nwdxjp?67BXYx@m#xZtpmbXyoWXqaa=r^Jaw4K&Yy3R0 z>2Wx95I4&#(aUe)ZZ_PKu1S?Qb^482)lB3rw_9raq=>_XVfl>Ckgf5dIXOFZEN7}z z<`){K_JzzeJ1YSrH0!^OzC`1Y(uoZr00X5(u?!GCs5QBcdpaefVz=Zh_Ysp|?dAEo zDEAdvS-nN5_NyvLI; zE)_)_y_)a>#}-F)woLER`jGO6 z$aBm-@(o=*kT9Q@zUb*NxF(`U{tj{8>%P|ZvE1R?nyOD@K0wYV`^fg5s^>0XzB^DOD^*54l20 z$Z&Xs=y|e`zQ0M{P({8(`1}{1sg-w>VU$Wws3uZv1pDLO0SC~zA+K6Bp|u=5=C0}T z$(m=@^Mr|HtCjK6U{nNfKMCzB=`!_JX;t+VIW+olsKyJ0Tz$ffp{>M^i|&WBly|$$ zLN%&){MqbQiQd_cdC$3bw(8Rh)AEfN;0k||lYepsfX6*XQcj}x1oxLFsb%3=p#`(N z$5kCgVaaW_aUtT_vM87yir|oF-h;^;D)FwHoWHzrEnUOS(`o1B?38%rJj$XS=K0-q zDq7$8s%ytL7sc)ff8IIs+TGtCK)z$nP$-5?#I;KVvYp{c`%Xn?S=C1CgoKgfpUnl( z_=nermg?>jn$rlhnxZw#4$ zbXsO*PM3ZdU?t0)`TnGhdOyvv({|W3V&&x0vX{ur+K-f_TKkpz8HE+lj^mclu4nc` z-Kz~RH9+LQW0Asx6uT-r&CTJyW)&N_ZC_6E_v^Y+zCOFRR5pq z#x0pyOH5Govt2IM)Zubw9-Z|3*r#AG_qo4+G1XPP!8Fm>+qQ;2wz`7IgxWR zWYy_m)DtetYr2$YWeS~t3z?xX>u}Irn!TV_Ns}Atf||tCZ+R`Fld_5T)N_X{a(2Ag zt!quvEE0*BW&@a{UF~@6dP7B?*?$Ks3?6yp8uMEg^TLSvYSNxY`E=CMV9qaF?jrJJ zRZo^v!WM(njanSD+L)fFU8&yP;L_1b=gXU+q~B#LVLfS*t}x$cHJC=a+TSrGF0=+1 zsIkQ)3`+=kV7`!ZP}tX7_K(G%&*;y1t<$g%#@$}{q=^RH4l_6%Z$w0|Mv0B2J-R6h z(0?0RSuQ=vr0(nButimNH<`=#cpSgqiGVFiKP20HYAAc1HQWbAW- z$Tx54?s`NK*Y02)K)=zTPCrAL4PGGM{o`rn6;|ZCNHj%F0}VDWiH$9(_=Os9lzd80 zx3#h!tvTkENz?nUK};fR$k9?Or`BegD65Xv*^ojJADK*VM0rzzT)n92)m83z&(9p& zNyF6HEOb>oZBzK6!fW`0VgAIYhpesjDh!uGDRcf&8~ui^b3AQ_7z|0lA3c(L(~D?& z_Xeuz#`(UkVTcC?WLjKkz*pRvL1RNpEmZ4B^1&jBH6$=zXK|mx z3Ta&1W`Jkm+}2j~>!p}5I~gMA!21Jh3b#v)BjaVPpmCC5q(Q~6F(S^sG(nQ<4U0t{ zq<`H3cuLU$?uMdROaior+2Dzoc(=l4xMg$zRTp07H&!NyTF68*-kfT3J%9ZYD} zb&20B@uz0Y64_@LuuF}I?8~1rjs{R-Em|_2zF?L+bx6^Z_?5{*RWY3DL(yKMdS{9? z7{iDbZXa$GwCopeUA(YsFCo@@ElLwNSNT9(b6I~0Rv&snIlZ!kptbtoBK{roRWa8W433L zn1w|Sk7ni&6t6Mrg>-Uy6gT114nJOQFO%xiUP&nTk6cf{>{* z_W!e4YM^=~Aw+EX?>?k$Oii_0^<)@QzNs+{)Q7Bn;o4B408kNyly7TArnc&AnY0iLbQdZ|GBA!$2SWt|@t&rLQag4p6?w9x`?`qTqKI z+ot!FOF%i;%Cf-5&^|EVL^h_)&>kk<8(O_ZvC_gH;9|i2g#I7C0$#><{>*s*T`X0c z(aw{+TLRT#4YU!S2e;t{5d7s|+qkI=yHPxk>|uSwFJNSMZLP5s6LU7Prap|^Qy;28)V&PG_V#KI|_aKRcSd!Pv*3-wN$E6fiV`$E{@R8hE4gf8~j zv26uK0-5kbX!1jtHsq(iq0X1b_;L%@dV;&1H~plQGpOGV5ktNJM;zq8Q@??&BgjH< zO&HpS#kQZ4pe#-{vtiDnb?IQ{3d?-PvmJUDct}PF?7_*21vt34y#g*~=wH0Ov!4MB z?I8&po}gjN%l9KqFo!||yupltkl^Nt|1ibPL$k;fZzX>>qKySPAr*^Mu)zdOOa;w-ZO9?*&mwG%Y{a@%YMG!rA z=XYN@1aKQdebw9Jnw4fFL%tW{s?CiQq9eEkapiUhSbl682zRT%AuBfx<4Kr1we&-b z4qtqWha~G{5Gu$(qA2TfI)i)xjl`s-{f^bp;S7~*mw*Dzz^zdfy*7kyc#Ug)jmy8Y zFYs67*X7z6&i|@+-gH5{bzl`(vO24hzhW{P^Kruz+Sld+$|Xr?t*oNEje7*cL~Jmb z!Id6wL(D+~vjxoqqsZ!++W!tJjIE){o5#I0iNEUrG~XWbw+M$>l-@=OIQ@hSuZXg0 zc($+xFuZR84&RU3A|f1X49-KQiS4KC-{KpBH!*~Od#t*yutFcGQpsL&2s%;&3E#Yl z!73T|w;dc}4rvHbpqTRee^ow#aN_Gh2vT z1yX>G)mO`|VfL40Gg^&ZNC%tlS@Tq{#*4Q=!D)jb!ow(VAPFO99X;PTDuaxm;M^Oi zdJR&psqq{9BB@~!mcI-E$~|AJ!&%`>9|2Su6cL3A`M)TxEBH3i0*uRT zu;_*YRySGzKCAG=bo?s(U{TxissKhwL;%g@nIAA*py9jCt(qV~V-SV}=77h*H;f?* zUB1z*l!%u&@<&!8gf!5(2Y}AKojq~TaT8#!T1dh)gKUx!v|&La=_N)Azg`O1VmW?_ zN){eZ#h59cG9f|jdK<*J)K?t@g_4C;H;Kr?c8;>8+X8SYA*^KzBMc}|u8QijC?iba zf&xV#LH*ELhh-p;Cux7UjV>2F$3ROM9k_rQ;v!gxNHiA5NIIlRjpLs(eg~Njt+GZ? z(OyHRQ6}uxTtZkYG}@7(ceA!=&v905Ye5lPql(R4-^!LOYW6AI(7LG`k zQcr0p9ed^VHSfjcWQ0iPZC5kQ;&ocluI9~Lkr#8JE6UAdNaMJo)Tj&vqCvv+59kQLvE(Nt zGioA~V$pF*O{%L?xb3QxA-&?4l%Kr~hQa+i5(P&O@-OoSQ*^6BmO~6pK^`Y7@w5(` z5tAf_Kf~W)^GiY#-%ly;zy2FcbAn|2I_t$BOQ38ZSEF8D#zZ!mJ1ArfRk zD8}q}k>|h`0lXd-@f|LGCp(ot$upnOxM$4#VO${D*a`ntexIJhf#=G|{ZWpAF1_%i z5Wy2t2ex2LY(qjKN`DU^cu1mtltZ*^K|I@`z5?nzFc3d73!0mJ6{=BS#TeKgvd%yu z>UVl>feKFq*e05~0Vp9h4T^P&=bcebPdM;o9AAeSz7B@q7@WucFnkJXl}=E#z|MjE zp1gGf)J*D8o&)(LO8ZViz)k&6=~3eX0l9XM=Y z5M&zO{;v(S{A1wXlnymZhRHKv0AsFrUX_vtXVO*$j;G_4Ax96mel@#atV_-I2TMdU z%zaaGg%$4Qifct_vn|vxU}Pv8erMVkASGfPn`i_%+tD~ku-JysS!G5!@ITcKk@)%| zi~ii`d^A7a=zq@wN0XQ>#0;J7D_ z)diBxL$0=O2Xsm+G6Xvj9>Zw_CJ#oP20>K8r|se>OhLW@Uin?5{Clb9=}D|qgLx0z z39LSlug{53&`@Lu^z%Pd5Oq3X0)qC|^p>9h1Toshr5gDaUe9LDh+o2X!m#qGN{2#v zT~Tbpir!(9@FGoq(04T4Q8;9GPl^<;>cYhS4_9NPA3i zJI=ID)4mb!7?8g!-k=(AqT?m|T|mln^N^OZrt1-h$XY7=DL%Ul;Pnw!LDIg7!vy4m z16U!1L1XkHiy?8CVOpm#xepzLN9A+I(!Hu};#ZB#789an_uxguwEn(H#M|*Y9#)2h zHF!LIVSrJ`f7a(1&I}0*7Zj1ua$o)N0U6aj+*nbAq2wRTtsw=YCWk~G$z#Oz>*T1q z{dIky4dxjj+ZY`WIe?dczg46fY%csg)tZmUKM&Ir)}OwNfb!of+}|aq3rpZbide)w z^D-1c2;=p4_J40<$cyJ-6dJF}e+}czF($gVQH35u*nE7!<<&{Z@c*riV&l#p{jEWe)q^SH z0LOpod4S>IT_McuAqhu%J1_`!q3?>Bcq0RM@iuVr_U#Q^cME?`)2qzDI#Q74pMifOxIW&YI=y7&YuaOrn@mz+9A9y!OL&zIS||3q$t zdNyRJi{T>2y?ULg%vMvRowfR*yj-EQAkTkqV39}1{sg_Orm;Z2PoWL0FLl^NT0WSW z49-~Y^*>d=wNw!jdKIyx$Mfpj z5jn6i+|IHnJ8y9l#Bc?rIyiYp8+-a42PAVh^pBMUxIYocwsl?3r%8O;?LTbmdoq~C z?L>{uJAzJ&a)eu*qLqm@cNKenO;lD1SrtgSG+H>mrhao?$VIRXt_pmyoMlnTJ+;t0mftrQ30T1eIY0==LgG9vcHz z^bv<*lJ{QC_Wy;Q3un@9r>^uNx$VE+Ef7;>p22eMA2@s=H}9+9fpIIi&ze^(y85Aq zl-w4@^o zCLE=@%;d}t`<3*RdczThWw-&2ZLfJ@V^J&(N`z3*{`o5@Ez0G)Ytr%n`d_Y5jZ;%I z^V`rtWjzP7xA)`sg5Uv;i0CQ!eAj6?is+y5$%p>JR~@^{0rkBTV&UjJxB*o5Ll987$subXL>xj1cU5Py)@1lm7SgtEWObhA z+gVt4D`cz``|Kc@ZyZq(Kt5;##S6R#;Pm+K)ZU_f^fvn3{$pNVL;({0-bu-Y`&fen zk<`DJJ!}G2!;+0HaZD6nF;$B9>YG3Xj>T)6SV}xEsjuce!27;N9K>|8LJGG{fX0^3 z$QOv~x?=}XJzw~EXUv4IOZ4+rZDAYgN@DHY5MeEPJl=6jqDAM1&I>qT#M6X?DGd}s za%C%~JR5kPimg}mP zLT6X?d0$TFjmNiR!PjHQLTOS7pFkm0C2O<^ob4zp+>4x`&|R6WF$L8a>m;2(&Ql2{ zrcTdjadw%pzaVjGb#t!VKNpv0GX0n{Z2d_y`vXt9$^BUzA#HdoWpzf^K_|6d-v-qE zc4|my<$=!=9k#r+vEhQ%>V3#QP>g}Q zFf-uvH)OD-A)~Eu<`WB0Kgcdz6d;xGbx3&Ur$XxiZfTWdhV%RhaJ2qa>`(O>s9RBI z9fTlif-KP!Pn*xrTka}8HxqwsSegx6g>Ct4U$mHXexti4XZuf<G<&hxPz?zIGC)BB1#>dJXFzfgTel> z9SW`_?+hpGknVcz;P2I)TgvV^Oigs96Nhr z`>XN4)`8#y^((HB>Pt#Fc|SDx5nto|7Cb;O)A`S7QAhQk(csY*3}c_P?F~oz+Vz%P zC?KnAQxd~MO0ODzA+GxXZYoj0lk!+ibO2*ey6ljlq*p!4dEod7x#QXGSQhmWX85$n zCb6MqrrqL+;Uz5E54fcuVav&bEVdqRhnP6|qT|!#%36?Eriv00pW^x8Pp6%CUUa>K z0R60|trs!ja?V8J&aTo*|DLY;f=tMS3!(5EOA!P=UWxKq?ME}P(C5Vui`h_#SGxhcdv zIO#?nZDw_7f9u`ug<@VLTZJc`_F_KQyJ^AP+iw)_5n@d$=&WGn*WkvKTh+p#?_zZS z2IL7jf?txeQ5=ipWC^JAb9 zK%mb#P!})qCbVFd&u^qMCn!*HT9cmMjQ3z19iXX+^+><99^~hs8a|z~t4%qnoPD(4 z?!+16r5(s}cQyawMYPKs;2QJwUMIP9^qUO8c-tX;M3#<&hPZayP;38KLRQ1ndUk8W zP2+cR5yqb-Q!04KX9W5a=scDEBIbA*+I|}Hsbo;R6CAFzt@)-_E9e~tFThRU6h&v( z_ph?aFa)7j*^K^)=r(`F;=Z>9y)<9+L+&Q~10|?dGw5K+s0O1`l+ldMp|@lVF@ z^L4hqzS*TH+miQNfEvsF@-8F62I^zx6iAueG($gwE-0b3molgFORG2G5L$jU9-KGPO(@*rh{TY%tAo z`UhqhX}{QRUKJyG3HOS1o#P2?r1bJ`3z^x(#$BG8#jT|zE{NdDAA&xCoERG8g-%BhWaw2gUnkdA3jEr%EleQ z7wpmbM-ww_3{VDlPgPy2Yk}Otebb8g#B*T&>TeBA?{^hXh5o@giK6Z}gMt1=s0sb$!^>s|H1`$uwN_@K~ z8lEe{Ks1bk-z2ZpCCGT8zLv);Q>UiujgDiPGQ44})4C{mfxVcI!%@Fkt&OozW~NPJ zwM`T}errLXhK(U4te>lB*PG`ZhLl8zw5hnb^3)`_tCwXwPk7}=teOnX19Y5$ES!rk z0HI*mQzKoo;PEvSFf(H+%P612HLr_1gIYYuLAy+vNj^x9GOy zVwFl?=H6Z)KQ7uTeMdpP|0wi=%K9kw+};^eSweI(@||*8lUL#1C|^ab>a6~omtcLWaASZ%H729fZwLa6 zJC@|FIvhGN_6W&K?<8fL#Qd=1ShK889}{m^fzL`DloNbcYd5RiMHID(5^$gX0k;A% zh}~*no#_)Vhj?ca&djRsHEMX@hEA9Mab<9kJeuG0W^bDOoPTUU*S*vgYtE}r*spzz zhUZME_tj1E;r$Y<2a1&(;%UE<^YrO|=tfxIraVXt^YP{|)4iMW$ppb{q@}Fvyw5z@ zj6HXkz_@=DT|VCto`e9m+d=gSh8urZZzKOTM5bWp5DVMSWYILJ@)ir=;vei)=#BeE zRDQ=3t_uTwjRz}z>h5qu<&Hhd@1%bKty zzw=iLx9Vf#Yz%Yr8O`$*$v2(fVc*8XVxT|Y%AVdlgaXP;{Wd7+*%vZ^)L>d}hykhc zUnq$!JXUbvf2HrGazJs^)o`EjlCl6LB8!PK@qD=kTH-bM3a^SL_mbW*9fjqMoop*Z9uTI)_9G3QNbr$L*%nu*J^<@IB(6U(v^7G0Ox{_&wrBVxN!4yf z*ElMh8`YScRPgnd83WeNM$c9;A_FQU7-&rn_I!yf>3CGBP9py)AokD*dCH5T^3k81 zme+~o-MqmsFTtDeWFfyCI;U6*6XQtAi594xsss`4Yp~*C8Sj+cnIJ0_a$~bt7(5vfEv!V7FHOc| z^Cq-OX7@f4i@4H+QiNAEMC{`oE zNw=LBF91X6YBWDfr7pCMdRJ*Fw%(xZ8Z@zK!?KsbnjV?zRG`B|lJb&aoTMdGim~P+ zRt}7!nRjrma|&rh$O5``l1j9Q$j=_spxzN%o|k8d$TIJX6#{>IX@v0Q#nA?B4{Z^* z{-F?Mr>n?pc1wnOfFso1EdE5n$Mi^Vs+STkwvK>+oP3!S1W;9g){` z#Hs4?ST)-=UktyyO~OhYvx^cfyC3ax=blYc`Q&AI?KUiawuW5R>%-SR8H4}W)QI?W zVd)A+V`;+lJrQlT4o!T||MVnY?MV}WO`auXF1M7ViewIOMO|_{8(q>{=rW*{Lq4a}{Hv>dRDX3jt=+b2UR1@$6s zjb6+W;|1PRd7tI3!^6%pM$PGZq9Q({P$qdqS!_swTR3b$5wqQyU^Yy1{{nc8aa#ca za%uU^RoAoVc7!a~oFv}eHK6}{36`ow?y;t)lH~KP#y9)6))orxUP zK$14vqU1GZuI8cNc5E9@$5rDk9|DwaxWuR!ldm=)gW_s!ejf2yP*!)UlKr`|%t79~ zI#Rw`#%6bRI6MV+zPsL7Eh}6^0dU|IqqQ=%g`H$wK~jEyqw%=QFhJV8LKDC1$h}+G zO%bYNc54z`OOB6uKblJeEL&RHg2`H#=fhJtY-T@?C~PUi@0@il;@n&VOv|8`h>3?R->BJf|y8-RGY_L0`m5IxpT; zcF?y~l;kfxV3Lfb-QU@zk}UtwZ}eO97Mg_ytJQtHbSD3aqAtJ^(YAR!CO6mVJ-PSh z+5_YwE3wnMToPMHF5OL$+H=*+NbYXR{$F9?pQM6kR|Nak1iLI8d>-aFsm>*rA?44; ze6KQp0XYdS?XRc045qbAoT~8&ZGKVxB-h|tvEt3F%ldlgP(F7W+lTcAkY|c1ETtZj zT%zN#SiDL4g~-ne)6LA87Gkt|mhlQI%0sZTZQ0V;eG8(7i20&;_g%q#&@pblny>54 z5N}@6^Wghh+a!zDheQWnwW+NYrH9L6V&5#xQ>R+K*ttyGI}_np%Ok|o@>+zK`!^Qf z5W2;;?mTMRt#*&FiR$eT9SJ|fo0lQk71cO1W-f37O!7n9FV{Z;9g7}+t$CWkB$}j~ z+Wki8Lp#zhO9fW?uqm>{=WBdmB=6{%9jL*#8mkdq1_OE%(&6}fSFJWnHuLo2l`||+ zX1**p%E|8y7rU$qIT!0dvV)7 zOh6rE*S%i(2l~qv*Nz(ot!$QI@x-Xbrr_sl7jIH^UFK-9uNVIGb{J5nYoo(aD) zXIP=lgWV_sXB|$DVi<_iEZ3EU`N`Sqo2;g96&@9kWnRC+!fmGMZCKjmxm8FcPWCTG zKtH>ZRIxe(Rxxp8tBLY%CD|a}hURkzu#)Bl=m+)~O1d^29ZhYC=J9^)qI#_D z<;UajAO!r*WOxV!9IpQE{2{W5M`Es);$5$nS=2{;n^N;LW*_Q1Za1n6d>w?mzT1{= zU5G`mJ2GBGf4fp^?uq!_0-dY@;lHuib1%W^eRM7c&M;YF2Rl#)@cWZ7q0?E+2})YI zid|)kyb1D_b0*fm29nt-((YVsIN0$z<#Xc?cxc!IPwi}ZnQyZYc1@g{<)!1XGXe(3 z-6HWBFi0t&_{REuV%;^r ze6_*#A#p>YUiVeo?FTxHVx(Pb-`~D=z|rAY+p}PIb)1aD&00VX{?Sy@Rz*{l}paK2kygRvOV# zBOfCaqY*#7+?;byJof%=eIZ>Y zWs{X9EQ$YW=c)I3_1?=~gYx|rd_|u>-#cQb)6!PY_YPkS`c*g3vQ70aZ~JsJQ9 zmHi%$8rR-CQDdrUIBkIY>SkdJIn?waaGg3=_uz=eHfI%-8C>H)2?Al@Z1SZ_OQq!f zck41lh2ag$eVD}&xRi-^#e}bA^T)9H;YA#i{g|Ow2RzKXDIny}`w)No!$JJ*TVm#S z=S!cU$hz@oG;$E88xNxxZ+)vj%5RcmeyZ9H? zm8~VF%?)HGBkv0Jz!ntgRMEAo_Q=-T0u>GbRiL#X9{jYhB`+2)J)Dq5Z8y>?mfRq@ zuG=ukZ1&9bL))kx2p(+m$iOJ)+|T49H4l6GL* zJ0yPqb4m)QlHa#ZRTT16zLiMk(Rn-2O zSn;HJh<~%_12m2_?#OpZN)V~b#eQn5;N!{+DQRjyqrXTVp9AAOq>0PzW=6;_nm4fR zYv3Nmw!<&P5Xx3An@<^&4TC<6rUi`rpc=4^RUQVe#vNF%T8+dj9jr1gm+?-SDH*qg&R@43P!8Y~5(|JNWBrq< zZt1O@SYe|AcZ?}DW3}iz=U55}yJJrJMj37?KHl~yh9j!)OCu^(5JGTm58StzGa=Sy z?Cu&O*1qu3AOEO*d7yU^d6;Q9zRbMZfb7TjPI!r|FfYg6Bnu$Je)m!Ppwsd(er%CR z$8jlUo{XA$l>K#put-T8xe>p1preQ(`oj{G6%27Zm4`P|*mbF4;zYvuJG@*cle z`#Et@RPR8!f#q-liswle@avj0u4F_jvq&zDJr(AU@$UO*S@OcCZasa-?UkDmcAJLB zOI*E_Ao9*a4$1X5*3VV)>s~%;-Lr9D1&sRiv3hJ`HNt}3xZO$w`LEZDmXbR(@rX`; z@dHULFs99rOOpGck>~QXLW;wNd+m>q2UCzC7%vel;a*(Q=KE_1Noh7ybdHJR^MQE_ zjrmtR-aj}zooJ5Lo;_$Vw#TnA<8xV%$XQ%oX#T!WQ@MVxvGryzHdND3ZILG>Od|4Xas>Vf5VB2#% z`4c9wYH=J<*mgtYX{$qX$rxa!>|s7-loVye>u2f;Vt~i?56_@8>4dXEY!zJ}3(?Di zj8&OOyS26Sd}-{TTiFh8Ki-Uw8F)=>Vj4}m|C-wbl1(J%WZsjL_RW|G_Q%U73JBDbt5rPFQo>Assm3%F=V%T`^)}Q|rKHbUg(1;BJnemqLS3 zLmG+4!M5Ig>_%NOY4`23*jo3e>Tje9>^`0>HPZyLIW%fUU`9Abpq|R~B0?ZElFOHU z1^+(;X%u>Ye`;M%o4(A=6Qt|4NEUr>F`pw)%j^tDY(_?M5s4#cfQ=Sw98fSOJiZv7 zSfdOj>iPUPXaiE7_y#DFLZNCVG34 zxqcMIj&Hjj#AUqy(Rkdb@k3rAKLeLW)F0NPYW{%5Ljom$ytU1iFUD}o2bQ&1nq$vc z`XjMXsLjLxK(mxYBH*72z}J!{9CI>iqZd)B;YF(&Eap$ymSV<874q z$}==CG^F3e2bg5*?1fFPkI#^F!$__->?9J~_JD^N9?+C3Axkm<2VaXFmLR(vgOF1N%mwboV_Jl9yhkYZGRZa-wDS;LP&$LL$uMx&Wh;qFl1?GH{qsds&dzGizJ7H zGVM$Inc}LW_x- znB@9Lb6Lo?Up&NRs&U#k%3I*L2FLMjThWcL9@}u3h`hrldP-ErNSb_H6P=Dadr%gQ zMTkp;RhC?b%Fg}um<}+YB4h*v@+v`RLuSdHN36xn?J+6y2aK3Gup|FrnQ9U?87g@_UFx`7$6n2;2*QRr|-C<_G22l|1n7-8^H&` z<+!ohy)-tSq9e;B5ii2^3AL8CDuuSY3t-Y`wb;dgk?LkK^%b2b2`u&I56wegw` z;2V1cg-d8@u#{ZGJ|2eIoyWFlwkT5Y&TS+#LxBxray^#`m^>bhspn*eoyz!CQo&Ig zSoR#eP1G#Npffn1!r(+aby6!iXsK^K0J&dUvCCq z_4-T6Iln=F4+TEL@0|DmYs6b#vsFACK_@(Z7s*E2C#)fn1(XCuj&Bp^MltbsS;nQc z`~0t^TodKxXGYespB-PB=kGBbBbV;!*VrLd@7J{xgkJ=GIl+3S*4Cs)1(@S*mz*FGCurd}Lgr@KciU+qcku{17`jJZ5IwFJdeM}ubC90w0 zt>60R2jqwYjEHL8uutT@Ve64&6ORxw9irniJ|+QrqS}|=4onzQ_#i!jh&CGrvGZbZ zg1$WiLHMDyy8+OdnV;b3qxTWNy8P_6`x}{`>}&Bvwo$4Vj4&qh8gMl<1`u>VCgfbZ zaH{Ab9L-koZs3bY3B*VA0S4q1Y>A=xK%q$A>UsgX`~@DnJkkK+T^tJdgzmW0Ii zU=2ejiL6F0J-VK!;Y|WB4*h4d19`>0=$oSiYB$igaqdIoUxFu&!_!BBmWufx11z;G z{16uCzm#Y**J)DwnZD@x1F6Rv>9#;0jLhR#KNXD@92~$Y;w=>~p$X6r!w1pJLngR> z(Q89I^FuEQ@wi;k%SeXk(d!i4pV7=V7N#tATb`QO2DV?v_%uUIhjN22(zwczlI zWbt1o!isrF6#vB*oTDRI{1&HC{<$dKb1? zLefurfty7h*DAtrHZ?VGtO8g25ORVY*q#6y}2EF;`nhJ2)4u!K6_w* zrxgE{ffcLKNB5(w=)$QQt^RY^SWx{?YcYZVy+_QaUc?!dB;cnhMOh2g+6HYNdExJP z5Kogtpp5D9D^abx648A4F>T>PlMOEYR*mN~kbq3WQ+x?$pN|-gTeG|#48SkcJ1`kdY0{KZ<6SM-d2L=;`)!QMU#ru7b{p{)8Jp z=|>iL9NB!prsgmIjHGvuj|T4(*jYwlt@S(LZnpH)yyo%NgY1Q0m~DkO{&cNYh&0`D z+lp!%@blu+Kh~z$x4*7ARUe=9h!HZKtMvib2Y5XreT=yTo>oT8)<*fDPs|5Kx@a=qKl5%Dz5}wof71If1x3i>?hxjr+Svnan7OZr_Rn@&Nr%;j&c2XFdt#r|K(Rq=+ z8`hGpx}nzPC@NXO&-PQhD=J~oW^dEu$l{j;1C1 z#D(H<+fbHue&N7vq?~#5|`b=-sf` zhWOJHfAQg;kUINhm#*9N0od;E%EoH+b0|ZFpQZeTumIVH<;K|HJy2Ox4Br#jC(IZv zNjJVXvg$rIb;+g9g{RR90t{(CtP`6)&7}DhRFfljvCLlKtb&e6v9KjOzQ@DI0_u3k3(nl>hLG$d-^yHvEbVK>r;Xeq8 z7f+W6U1bcRz@KRn=U&+D)v5$~bnv5AUYaZ7i()8pKseRRT)GyiyTHUWb2@yyZYh@` zwye^YnibolCt6Oz2c=$&=d!w!dM>Z-$45d^RsSGbaAY_ahnqr)0Y6GBAx+twC*A^& ztiCSs2N1K3FAwH@N>*;?$A#yS8J{vDD3~1&60$s*y|!UgrNn>_|KNW6`ko=#1<5wW z<`J~rLMQF2m+m3tc*a^ElVrrF@B8aBp-Gd{I`U>>#7;=Q#rLTf^rF{VR(*r~O|fi{ z2jPTRi=^0tI`?4QY6{xUk@^p~cSLZHxS_rF2y7r$@$k_YD$p}GJeBJ>#gmsh^kSBk zi?Dy|&b^JU&-v1oaZ&5d>@C?TyT!(z)_fmUzJFf%!%NnPlM@*XQR%1pq|A@Radg=4 zlidrmlO*0;bx>8F%wAo3k@5Tx*YfSc4_Vo0=YQD6Y1msBFRbo-ubGib>+H*JX%F<* zy5dilU1u{5WFQJNG&B+GZhgFH)a@f9M1w!sW_ zsCcWWxtqjUe5s_#JVn1Ma-Q;68YyZGe+8;%x>~>jB|){ zA)RD(6BA^`$1u)ta%W}so)V4Kt4IM9qXdP^$4PuND`tWRZEA@ksJrk|GR*43eWyO% zz=x8jak1;wN{F+L$ey^!yfRy|{VycX5j(Sv`sQ4tMKU#bpUT77ZmJu;3orH3cGgMf z#H~Y``9smnMeT4#fifACKTVFF;+H< z1xFP5Gyh;*CgS{5d3ieE!ci0b+DI2ACV~`g#%?s3`yY@=AFO1^ z?~$_GIegkfv%6G-(yR;pS2oO64V=q52bI&X=b`R}wfF1D`KKmWyYNl)C25eVMq=mZ znAMr{_EVW+!HLQZ4Mg0_=5teL(*l=X;oA3*Hay+ZCWU~~bZZil-rmskrMp9Fg9d8J zm+(0YwkHXe=!UxWy;HS7(A+F$3DBq4knyEuFZ-ELHN~JhRRL*jUTo%qxIaqUW2j3V z{wrSLj~^AA5uhYDI5vtb zXY#p+J{*d&VO*sZqBa=eH?zT2S~+ZlJqqo^iQVPPL|IF1+aISpSYxo(AVJUbMTvcg zhDFC~CqrW2p_1#0XpNOp2J?@Cry6FWQhN%ORUYBY!}35~&)dL>;A^f!W0l+YJQ+se zuw2?=uAtUBq+?0NSm9xhiw`bHs-EgYkyN62Gjdq1yt8Q3(X8DSnfGo&rpB_Jwd!)g1 zN^`+}ig}}bXYU$<%@b>djH&0&r!y0RW|oyR%R}+SNzp94hJq_vb5Hk* zJRYdy-+fu_R8XD9|Czq;tMe*PMP5Q9`-zYY(rcT*BS;yzoE*0*7`SXp>>;;?m zpryj_q|2mQ&ocF!b0?(-oxbe(yCi7dx}|m#x8<$f`+3_to76uif%TjEw&d^o1C}=^ zJzP4g2dGuG#5JNMC9x#cD!C{XNHG{07#ZpsnCKcCgcurF8ChDHm}naqSQ!|+Fy%df dq9HdwB{QuOw}zP+TWdg$^K|udS?83{1OUxGgvS5? literal 0 HcmV?d00001 diff --git a/src/components/Chat/Chat.tsx b/src/components/Chat/Chat.tsx index 78247e43c..73941f48e 100644 --- a/src/components/Chat/Chat.tsx +++ b/src/components/Chat/Chat.tsx @@ -228,7 +228,7 @@ export const Chat = memo(({ stopConversationRef, courseMetadata }: Props) => { messages: updatedConversation.messages, key: courseMetadata?.openai_api_key && - courseMetadata?.openai_api_key != '' + courseMetadata?.openai_api_key != '' ? courseMetadata.openai_api_key : apiKey, prompt: updatedConversation.prompt, @@ -520,14 +520,14 @@ export const Chat = memo(({ stopConversationRef, courseMetadata }: Props) => { const statements = courseMetadata?.example_questions && - courseMetadata.example_questions.length > 0 + courseMetadata.example_questions.length > 0 ? courseMetadata.example_questions : [ - 'Make a bullet point list of key takeaways of the course.', - 'What is [your favorite topic] and why is it worth learning about?', - 'How can I effectively prepare for the upcoming exam?', - 'How many assignments in the course?', - ] + 'Make a bullet point list of key takeaways of the course.', + 'What is [your favorite topic] and why is it worth learning about?', + 'How can I effectively prepare for the upcoming exam?', + 'How many assignments in the course?', + ] // Add this function to create dividers with statements const renderIntroductoryStatements = () => { diff --git a/src/components/UIUC-Components/GlobalFooter.tsx b/src/components/UIUC-Components/GlobalFooter.tsx index 127c4567b..86052e012 100644 --- a/src/components/UIUC-Components/GlobalFooter.tsx +++ b/src/components/UIUC-Components/GlobalFooter.tsx @@ -13,7 +13,15 @@ export default function Footer({ isNavbar = false }: { isNavbar?: boolean }) { Disclaimer + Generative AI Policy + + {/* Signed out users get sign in button */} - + diff --git a/src/components/UIUC-Components/LargeDropzone.tsx b/src/components/UIUC-Components/LargeDropzone.tsx index 48029e9f1..d4c3efd7f 100644 --- a/src/components/UIUC-Components/LargeDropzone.tsx +++ b/src/components/UIUC-Components/LargeDropzone.tsx @@ -1,7 +1,19 @@ // LargeDropzone.tsx import React, { useRef, useState } from 'react' -import { createStyles, Group, rem, Text, Title, useMantineTheme } from '@mantine/core' -import { IconAlertCircle, IconCloudUpload, IconDownload, IconX } from '@tabler/icons-react' +import { + createStyles, + Group, + rem, + Text, + Title, + useMantineTheme, +} from '@mantine/core' +import { + IconAlertCircle, + IconCloudUpload, + IconDownload, + IconX, +} from '@tabler/icons-react' import { Dropzone } from '@mantine/dropzone' import { useRouter } from 'next/router' import { type CourseMetadata } from '~/types/courseMetadata' @@ -264,7 +276,6 @@ export function LargeDropzone({ setUploadInProgress(false) refreshOrRedirect(redirect_to_gpt_4) // TODO: here we should raise toast for failed ingest files. AND successful ingest files. - } else { console.error('Upsert metadata failed') setUploadInProgress(false) @@ -274,7 +285,7 @@ export function LargeDropzone({ radius="md" bg="#0E1116" disabled={isDisabled} - // #0E1116 -- nice dark + // #0E1116 -- nice dark >
{ autoClose: 15000, // position="top-center", title: 'Failed to ingest files', - message: `Failed to ingest the following files: ${error_files.join(", ")}. Please shoot me an email: kvday2@illinois.edu.`, + message: `Failed to ingest the following files: ${error_files.join( + ', ', + )}. Please shoot me an email: kvday2@illinois.edu.`, color: 'red', radius: 'lg', icon: , diff --git a/src/components/UIUC-Components/Maintenance.tsx b/src/components/UIUC-Components/Maintenance.tsx index 028bdb1d0..25a60d7aa 100644 --- a/src/components/UIUC-Components/Maintenance.tsx +++ b/src/components/UIUC-Components/Maintenance.tsx @@ -2,7 +2,7 @@ import React from 'react' import { Title, Text } from '@mantine/core' import Link from 'next/link' -const Maintenance = ({ }: { +const Maintenance = ({}: { // Prevent search engine indexing of Maintenance page (because it'll ruin our entire search results): https://github.com/vercel/next.js/discussions/12850#discussioncomment-3335807 // in _document.tsx }) => { @@ -24,7 +24,8 @@ const Maintenance = ({ }: { UIUC.chat is down for maintenance - Our database provider, Supabase, is down. We will be back shortly after they are back online. + Our database provider, Supabase, is down. We will be back shortly + after they are back online. {/* Motivation: Things to explosive product growth, accompanied by the diff --git a/src/components/UIUC-Components/MakeOldCoursePage.tsx b/src/components/UIUC-Components/MakeOldCoursePage.tsx index 386c0418c..1648a56a3 100644 --- a/src/components/UIUC-Components/MakeOldCoursePage.tsx +++ b/src/components/UIUC-Components/MakeOldCoursePage.tsx @@ -98,7 +98,7 @@ const MakeOldCoursePage = ({ return ( ) } @@ -217,9 +217,12 @@ const CourseFilesList = ({ files }: CourseFilesListProps) => { url: string, ) => { try { - const response = await axios.delete(`https://flask-production-751b.up.railway.app/delete`, { - params: { course_name, s3_path, url }, - }) + const response = await axios.delete( + `https://flask-production-751b.up.railway.app/delete`, + { + params: { course_name, s3_path, url }, + }, + ) // Handle successful deletion, show a success message showToastOnFileDeleted(theme) // Refresh the page @@ -301,15 +304,15 @@ const CourseFilesList = ({ files }: CourseFilesListProps) => { // style={{ outline: 'solid 1px', outlineColor: 'white' }} onMouseEnter={(e) => { e.currentTarget.style.backgroundColor = theme.colors.grape[8] - ; (e.currentTarget.children[0] as HTMLElement).style.color = - theme.colorScheme === 'dark' - ? theme.colors.gray[2] - : theme.colors.gray[1] + ;(e.currentTarget.children[0] as HTMLElement).style.color = + theme.colorScheme === 'dark' + ? theme.colors.gray[2] + : theme.colors.gray[1] }} onMouseLeave={(e) => { e.currentTarget.style.backgroundColor = 'transparent' - ; (e.currentTarget.children[0] as HTMLElement).style.color = - theme.colors.gray[8] + ;(e.currentTarget.children[0] as HTMLElement).style.color = + theme.colors.gray[8] }} > @@ -327,15 +330,15 @@ const CourseFilesList = ({ files }: CourseFilesListProps) => { // style={{ outline: 'solid 1px', outlineColor: theme.white }} onMouseEnter={(e) => { e.currentTarget.style.backgroundColor = theme.colors.grape[8] - ; (e.currentTarget.children[0] as HTMLElement).style.color = - theme.colorScheme === 'dark' - ? theme.colors.gray[2] - : theme.colors.gray[1] + ;(e.currentTarget.children[0] as HTMLElement).style.color = + theme.colorScheme === 'dark' + ? theme.colors.gray[2] + : theme.colors.gray[1] }} onMouseLeave={(e) => { e.currentTarget.style.backgroundColor = 'transparent' - ; (e.currentTarget.children[0] as HTMLElement).style.color = - theme.colors.red[6] + ;(e.currentTarget.children[0] as HTMLElement).style.color = + theme.colors.red[6] }} > @@ -372,7 +375,8 @@ async function fetchCourseMetadata(course_name: string) { return data.course_metadata } else { throw new Error( - `Error fetching course metadata: ${response.statusText || response.status + `Error fetching course metadata: ${ + response.statusText || response.status }`, ) } diff --git a/src/components/UIUC-Components/MakeQueryAnalysisPage.tsx b/src/components/UIUC-Components/MakeQueryAnalysisPage.tsx index eb29a69f3..38e7e2014 100644 --- a/src/components/UIUC-Components/MakeQueryAnalysisPage.tsx +++ b/src/components/UIUC-Components/MakeQueryAnalysisPage.tsx @@ -129,7 +129,7 @@ const MakeQueryAnalysisPage = ({ return ( ) } @@ -278,9 +278,12 @@ const CourseFilesList = ({ files }: CourseFilesListProps) => { const { classes, theme } = useStyles() const handleDelete = async (s3_path: string, course_name: string) => { try { - const response = await axios.delete(`https://flask-production-751b.up.railway.app/delete`, { - params: { s3_path, course_name }, - }) + const response = await axios.delete( + `https://flask-production-751b.up.railway.app/delete`, + { + params: { s3_path, course_name }, + }, + ) // Handle successful deletion, show a success message showToastOnFileDeleted(theme) // Refresh the page @@ -362,15 +365,15 @@ const CourseFilesList = ({ files }: CourseFilesListProps) => { // style={{ outline: 'solid 1px', outlineColor: 'white' }} onMouseEnter={(e) => { e.currentTarget.style.backgroundColor = theme.colors.grape[8] - ; (e.currentTarget.children[0] as HTMLElement).style.color = - theme.colorScheme === 'dark' - ? theme.colors.gray[2] - : theme.colors.gray[1] + ;(e.currentTarget.children[0] as HTMLElement).style.color = + theme.colorScheme === 'dark' + ? theme.colors.gray[2] + : theme.colors.gray[1] }} onMouseLeave={(e) => { e.currentTarget.style.backgroundColor = 'transparent' - ; (e.currentTarget.children[0] as HTMLElement).style.color = - theme.colors.gray[8] + ;(e.currentTarget.children[0] as HTMLElement).style.color = + theme.colors.gray[8] }} > @@ -387,15 +390,15 @@ const CourseFilesList = ({ files }: CourseFilesListProps) => { // style={{ outline: 'solid 1px', outlineColor: theme.white }} onMouseEnter={(e) => { e.currentTarget.style.backgroundColor = theme.colors.grape[8] - ; (e.currentTarget.children[0] as HTMLElement).style.color = - theme.colorScheme === 'dark' - ? theme.colors.gray[2] - : theme.colors.gray[1] + ;(e.currentTarget.children[0] as HTMLElement).style.color = + theme.colorScheme === 'dark' + ? theme.colors.gray[2] + : theme.colors.gray[1] }} onMouseLeave={(e) => { e.currentTarget.style.backgroundColor = 'transparent' - ; (e.currentTarget.children[0] as HTMLElement).style.color = - theme.colors.red[6] + ;(e.currentTarget.children[0] as HTMLElement).style.color = + theme.colors.red[6] }} > @@ -432,7 +435,8 @@ async function fetchCourseMetadata(course_name: string) { return data.course_metadata } else { throw new Error( - `Error fetching course metadata: ${response.statusText || response.status + `Error fetching course metadata: ${ + response.statusText || response.status }`, ) } diff --git a/src/components/UIUC-Components/SupportedFileUploadTypes.tsx b/src/components/UIUC-Components/SupportedFileUploadTypes.tsx index 72ce43460..3f6203b9a 100644 --- a/src/components/UIUC-Components/SupportedFileUploadTypes.tsx +++ b/src/components/UIUC-Components/SupportedFileUploadTypes.tsx @@ -6,6 +6,7 @@ import { Flex, createStyles, Group, + Accordion, // Card, // Badge, // MantineProvider, @@ -24,8 +25,10 @@ import { // import Link from 'next/link' import React from 'react' import { montserrat_heading, montserrat_paragraph } from 'fonts' +import Link from 'next/link' const useStyles = createStyles((theme) => ({ + // For Logos logos: { // width: '30%', aspectRatio: '3/2', @@ -49,11 +52,55 @@ const useStyles = createStyles((theme) => ({ justifyItems: 'center', }, + // For Accordion + root: { + borderRadius: theme.radius.lg, + paddingLeft: 40, + width: '430px', + outline: 'none', + paddingTop: 20, + paddingBottom: 20, + '&[data-active]': { + paddingTop: 20, + }, + }, control: { - position: 'absolute', - width: rem(250), - left: `calc(50% - ${rem(125)})`, - bottom: rem(-20), + borderRadius: theme.radius.lg, + '&:hover': { + backgroundColor: 'rgba(255, 255, 255, 0.2)', // 20% white on hover + }, + }, + content: { + borderRadius: theme.radius.lg, + }, + panel: { + borderRadius: theme.radius.lg, + }, + item: { + backgroundColor: 'bg-transparent', + // border: `${rem(1)} solid transparent`, + border: `solid transparent`, + borderRadius: theme.radius.lg, + position: 'relative', + // zIndex: 0, + transition: 'transform 150ms ease', + outline: 'none', + + '&[data-active]': { + transform: 'scale(1.03)', + backgroundColor: '#15162b', + borderRadius: theme.radius.lg, + boxShadow: theme.shadows.xl, + }, + '&:hover': { + backgroundColor: 'bg-transparent', + }, + }, + + chevron: { + '&[data-rotate]': { + transform: 'rotate(180deg)', + }, }, })) @@ -99,6 +146,18 @@ const SupportedFileUploadTypes = () => { alt="Powerpoint logo" className={classes.logos} /> + Powerpoint logo + +
+ {/* 2nd ROW */} + { alt="Closed caption icon" className={classes.logos} /> - {/* <> - - Closed caption audio icon - - .srt &{' '} - .vtt - - - */} - - - And .txt,{' '} - .py,{' '} - .html,{' '} - .srt,{' '} - .vtt - - - - Under development... - - - +
+ {/* THIRD ROW */} + Github logo Notion logo Coursera logo - {/* MIT Open Courseware logo */} Canvas logo + +
+ + And literally any text file:{' '} + {/* < code className={classes.codeStyledText} >, {' '} */} + txt,{' '} + code,{' '} + etc ... + + + + + +
+ + Read the details 👇 + +
+
+ + +
+ Github logo +
+ For GitHub, just enter a URL like{' '} + + github.com/USER/REPO + + , for example:{' '} + + + https://github.com/langchain-ai/langchain + + + . We'll ingest all files in the main branch. Ensure the + repository is public. +
+ Github logo +
+ Canvas - coming very soon in Fall 2023! +
+ MIT Open Course Ware logo +
+ For MIT Open Course Ware, just enter a URL like{' '} + + ocw.mit.edu/courses/ANY_COURSE + {' '} + for example:{' '} + + + https://ocw.mit.edu/courses/8-321-quantum-theory-i-fall-2017 + + +
+ Coursera logo +
+ For Coursera, it's probably easiest to + manually export the content then upload it here. Or{' '} + + + email me + + {' '} + and we can do a direct ingest, we're limited by + Coursera's controls on login/auth. +
+ Notion logo +
+ For Notion, manually Export your pages to local + files, then ingest those. It works great. +
+
+
+
) } diff --git a/src/components/UIUC-Components/WebScrape.tsx b/src/components/UIUC-Components/WebScrape.tsx index 7a9ab1b09..b42cebc69 100644 --- a/src/components/UIUC-Components/WebScrape.tsx +++ b/src/components/UIUC-Components/WebScrape.tsx @@ -1,8 +1,18 @@ import { notifications } from '@mantine/notifications' -import { rem, Button, Input, Title, Text, useMantineTheme } from '@mantine/core' +import { + rem, + Button, + Input, + Title, + Text, + useMantineTheme, + Tooltip, + Checkbox, + TextInput, + Group, +} from '@mantine/core' import { IconWorldDownload } from '@tabler/icons-react' import React, { useEffect, useState } from 'react' -import { Montserrat } from 'next/font/google' import axios from 'axios' import { useRouter } from 'next/router' import { useMediaQuery } from '@mantine/hooks' @@ -46,35 +56,19 @@ export const WebScrape = ({ const router = useRouter() const isSmallScreen = useMediaQuery('(max-width: 960px)') const theme = useMantineTheme() + const [maxUrls, setMaxUrls] = useState('50') + const [maxDepth, setMaxDepth] = useState('2') + const [stayOnBaseUrl, setStayOnBaseUrl] = useState(false) - const handleUrlChange = (e: React.ChangeEvent) => { - const newUrl = e.target.value - console.log('newUrl: ', newUrl) - setUrl(newUrl) - if (newUrl.length > 0 && validateUrl(newUrl)) { - setIsUrlUpdated(true) - } else { - setIsUrlUpdated(false) - } - // Change icon based on URL - if (newUrl.includes('coursera.org')) { - setIcon( - Coursera Logo, - ) - } else if (newUrl.includes('ocw.mit.edu')) { - setIcon( - MIT OCW Logo, - ) - } else { - setIcon() + const handleInputChange = ( + e: React.ChangeEvent, + variable: string, + ) => { + const value = e.target.value + if (variable === 'maxUrls') { + setMaxUrls(value) + } else if (variable === 'maxDepth') { + setMaxDepth(value) } } @@ -127,19 +121,18 @@ export const WebScrape = ({ data = scrapeWeb( url, courseName, - webScrapeConfig.num_sites, - webScrapeConfig.recursive_depth, + maxUrls.trim() !== '' + ? parseInt(maxUrls) - 1 + : webScrapeConfig.num_sites, + maxDepth.trim() !== '' + ? parseInt(maxDepth) - 1 + : webScrapeConfig.recursive_depth, webScrapeConfig.timeout_sec, + stayOnBaseUrl, ) - // todo: consolidate both KV stores into one (remove setCourseExistsAPI). - // todo: use KV store instead of /get-all to check if course exists. if (is_new_course) { - // Make course exist in kv store - // Removing this for kv refactor - // await setCourseExistsAPI(courseName) - - // set course exists in new metadata endpoint. Works great. + // set course exists in fast course_metadatas KV db const response = callSetCourseMetadata(courseName, { course_owner: current_user_email, // Don't set properties we don't know about. We'll just upsert and use the defaults. @@ -166,6 +159,58 @@ export const WebScrape = ({ setUrl('') // clear url } + const [inputErrors, setInputErrors] = useState({ + maxUrls: { error: false, message: '' }, + maxDepth: { error: false, message: '' }, + }) + + const validateInputs = () => { + const errors = { + maxUrls: { error: false, message: '' }, + maxDepth: { error: false, message: '' }, + } + // Check for maxUrls + if (!maxUrls) { + errors.maxUrls = { + error: true, + message: 'Please provide an input for Max URLs', + } + } else if (!/^\d+$/.test(maxUrls)) { + // Using regex to ensure the entire string is a number + errors.maxUrls = { + error: true, + message: 'Max URLs should be a valid number', + } + } else if (parseInt(maxUrls) < 1 || parseInt(maxUrls) > 500) { + errors.maxUrls = { + error: true, + message: 'Max URLs should be between 1 and 500', + } + } + + // Check for maxDepth + if (!maxDepth) { + errors.maxDepth = { + error: true, + message: 'Please provide an input for Max Depth', + } + } else if (!/^\d+$/.test(maxDepth)) { + // Using regex to ensure the entire string is a number + errors.maxDepth = { + error: true, + message: 'Max Depth should be a valid number', + } + } else if (parseInt(maxDepth) < 1 || parseInt(maxDepth) > 500) { + errors.maxDepth = { + error: true, + message: 'Max Depth should be between 1 and 500', + } + } + + setInputErrors(errors) + return !Object.values(errors).some((error) => error.error) + } + const showToast = () => { return ( // docs: https://mantine.dev/others/notifications/ @@ -210,6 +255,7 @@ export const WebScrape = ({ maxUrls: number, maxDepth: number, timeout: number, + stay_on_baseurl: boolean, ) => { try { if (!url || !courseName) return null @@ -224,6 +270,7 @@ export const WebScrape = ({ max_urls: maxUrls, max_depth: maxDepth, timeout: timeout, + stay_on_baseurl: stay_on_baseurl, }, }, ) @@ -273,7 +320,7 @@ export const WebScrape = ({ <> OR @@ -285,7 +332,7 @@ export const WebScrape = ({ { e.preventDefault() - handleSubmit() + if (validateInputs() && validateUrl(url)) { + handleSubmit() + } }} size="md" radius={'xl'} - className={`rounded-s-md ${isUrlUpdated ? 'bg-purple-800' : 'border-purple-800' - } overflow-ellipsis text-ellipsis p-2 ${isUrlUpdated ? 'text-white' : 'text-gray-500' - } min-w-[5rem] -translate-x-1 transform hover:border-indigo-600 hover:bg-indigo-600 hover:text-white focus:shadow-none focus:outline-none`} + className={`rounded-s-md ${ + isUrlUpdated ? 'bg-purple-800' : 'border-purple-800' + } overflow-ellipsis text-ellipsis p-2 ${ + isUrlUpdated ? 'text-white' : 'text-gray-500' + } min-w-[5rem] -translate-x-1 transform hover:border-indigo-600 hover:bg-indigo-600 hover:text-white focus:shadow-none focus:outline-none`} w={`${isSmallScreen ? 'auto' : 'auto'}`} disabled={isDisabled} > @@ -338,23 +389,83 @@ export const WebScrape = ({ } rightSectionWidth={isSmallScreen ? 'auto' : 'auto'} /> - - Looking for high quality reference material? We love{' '} - { + event.preventDefault() + }} > - MIT Open Course Ware - -

- For Coursera and Canvas ingest please email kvday2@illinois.edu -
+
+ + { + handleInputChange(e, 'maxUrls') + }} + error={inputErrors.maxUrls.error} + /> + +
+ {inputErrors.maxUrls.error && ( +

{inputErrors.maxUrls.message}

+ )} + + {/* no need in this tooltip: w={400} */} + { + handleInputChange(e, 'maxDepth') + }} + style={{ width: '100%' }} + error={inputErrors.maxDepth.error} + /> + + {inputErrors.maxDepth.error && ( +

{inputErrors.maxDepth.message}

+ )} +
Stay on Base URL
+ + setStayOnBaseUrl(!stayOnBaseUrl)} + /> + + + )} ) } diff --git a/src/pages/disclaimer.tsx b/src/pages/disclaimer.tsx index 2e700223e..2797ad1d8 100644 --- a/src/pages/disclaimer.tsx +++ b/src/pages/disclaimer.tsx @@ -3,25 +3,13 @@ import { IconExternalLink } from '@tabler/icons-react' import { NextPage } from 'next' import Link from 'next/link' import { MainPageBackground } from '~/components/UIUC-Components/MainPageBackground' -// import { Card, Image, Text, Title, Badge, Button, Group } from '@mantine/core' +import GlobalFooter from '~/components/UIUC-Components/GlobalFooter' const DisclaimerPage: NextPage = () => { return (

{disclaimer_string}

- - - You may read the terms and conditions here - - - - - - - You may read the privacy policy here - - - +
) } diff --git a/src/pages/index.tsx b/src/pages/index.tsx index 335d9ba66..55050c2e5 100644 --- a/src/pages/index.tsx +++ b/src/pages/index.tsx @@ -14,7 +14,9 @@ import { Group, } from '@mantine/core' -import GlobalHeader, { LandingPageHeader } from '~/components/UIUC-Components/GlobalHeader' +import GlobalHeader, { + LandingPageHeader, +} from '~/components/UIUC-Components/GlobalHeader' import GlobalFooter from '~/components/UIUC-Components/GlobalFooter' const Home: NextPage = () => { @@ -169,8 +171,9 @@ const useStyles = createStyles((theme) => ({ }, card: { - border: `${rem(1)} solid ${theme.colorScheme === 'dark' ? theme.colors.dark[5] : theme.colors.gray[1] - }`, + border: `${rem(1)} solid ${ + theme.colorScheme === 'dark' ? theme.colors.dark[5] : theme.colors.gray[1] + }`, }, cardTitle: {