From 39d93838e5023a7197f2b9e2a65303cde4975f00 Mon Sep 17 00:00:00 2001 From: SovereigntyIsNotFreedom Date: Thu, 10 Apr 2025 08:20:15 +0100 Subject: [PATCH 01/15] issue #49: link with status 0.0 will not be shown and somepthere fixes for security --- www/header.php | 6 +++++- www/index.php | 6 +++--- 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/www/header.php b/www/header.php index 8abc7c8..aba32c0 100644 --- a/www/header.php +++ b/www/header.php @@ -76,7 +76,11 @@ if (!preg_match("~^(?:f|ht)tps?://~i", $data[3])) { echo $urllink . '"> '; // display the link echo $data[2] . '

'; // display the link title and close the a href and first cell, open the second cell echo $data[5] . " "; // OPTIONAL: display the description column - echo $data[7] . " "; // display the score and close the second cell, open the third cell + if ($data[7] == 0.0){ + continue; + }else{ + echo $data[7] . " "; // display the score and close the second cell, open the third cell + } if($data[6] == "YES"){ echo "✔️" ; }else{ diff --git a/www/index.php b/www/index.php index 2230e9c..2f8f6ef 100644 --- a/www/index.php +++ b/www/index.php @@ -9,12 +9,12 @@ - + - " /> + " /> - + From 46bd00a05acd7c43a72b7e62d6df1612d0cf2d98 Mon Sep 17 00:00:00 2001 From: SovereigntyIsNotFreedom Date: Fri, 11 Apr 2025 09:04:52 +0100 Subject: [PATCH 02/15] issue #49: link with status 0.0 now removes the whole line and add fixes with issues for php8.4 --- www/footer.php | 2 +- www/header.php | 12 ++++++++---- www/index.php | 14 ++++++++------ 3 files changed, 17 insertions(+), 11 deletions(-) diff --git a/www/footer.php b/www/footer.php index 7d2287c..be62c77 100644 --- a/www/footer.php +++ b/www/footer.php @@ -10,7 +10,7 @@ if (($handle = fopen($csvfile, "r")) !== FALSE) { $oldcatname=""; - while (($data = fgetcsv($handle, 1000, ",")) !== FALSE) { + while (($data = fgetcsv($handle, 1000, ",",'"','\\')) !== FALSE) { $data[0]=preg_replace("/[^a-zA-Z0-9:\/.\ -✔️❌]/", "", $data[0]); // PREVENT ALL MALICIOUS PHP PAYLOADS FROM BEING EXECUTED FROM CSV FILES! $data[0] = htmlspecialchars($data[0]); diff --git a/www/header.php b/www/header.php index 8abc7c8..ae4041e 100644 --- a/www/header.php +++ b/www/header.php @@ -8,7 +8,7 @@ if (($handle = fopen($csvfile, "r")) !== FALSE) { $oldcatname=""; - while (($data = fgetcsv($handle, 1000, ",")) !== FALSE) { + while (($data = fgetcsv($handle, 1000, ",",'"','\\')) !== FALSE) { //PREVENT ALL MALICIOUS PHP PAYLOADS FROM BEING EXECUTED FROM CSV FILES! $data[0] = htmlspecialchars($data[0]); @@ -40,6 +40,9 @@ if (($handle = fopen($csvfile, "r")) !== FALSE) { if (str_contains(strtolower($data[5]), strtolower($query)) or str_contains(strtolower($data[3]), strtolower($query)) or str_contains(strtolower($data[2]), strtolower($query)) or str_contains(strtolower($data[1]), strtolower($query))) { $resultcount++; for ($c=0; $c < $num; $c++) { // iterate over each row + if ($data[7] == 0.0){ + continue; + }else{ echo ""; // begin html table row for that Category // if the row is the first one (name url status score) only display (Name Status Score): // display the contents of a csv row @@ -76,7 +79,8 @@ if (!preg_match("~^(?:f|ht)tps?://~i", $data[3])) { echo $urllink . '"> '; // display the link echo $data[2] . '

'; // display the link title and close the a href and first cell, open the second cell echo $data[5] . " "; // OPTIONAL: display the description column - echo $data[7] . " "; // display the score and close the second cell, open the third cell + echo $data[7] . " "; // display the score and close the second cell, open the third cell + if($data[6] == "YES"){ echo "✔️" ; }else{ @@ -91,7 +95,7 @@ if (!preg_match("~^(?:f|ht)tps?://~i", $data[3])) { } } echo ""; // end html table row - } + }} echo "\n"; fclose($handle); } @@ -130,7 +134,7 @@ if (($handle = fopen($csvfile, "r")) !== FALSE) { $oldcatname=""; - while (($data = fgetcsv($handle, 1000, ",")) !== FALSE) { + while (($data = fgetcsv($handle, 1000, ",",'"','\\')) !== FALSE) { $num = count($data); $row++; diff --git a/www/index.php b/www/index.php index 2230e9c..c091717 100644 --- a/www/index.php +++ b/www/index.php @@ -9,18 +9,19 @@ - + - " /> + " /> - +
- -Sensitive ON " . $sensitive . "

"; $sensitive=1; @@ -95,6 +96,7 @@ require("header.php"); else { // if query length is less than minimum or more than maximum echo '

Search query must be between ' . $min_length . " and " . $max_length . " characters.

"; } + ?>
Date: Sun, 13 Apr 2025 09:22:37 +0100 Subject: [PATCH 03/15] Added captcha: Created new page with captcha auth and fields saving mechanism. --- package.xml | 444 +++++++++++++++++++++++++++++++++++++ submissions/submission.csv | 6 + www/README.md | 6 + www/font.ttf | Bin 0 -> 105980 bytes www/generate.php | 28 +++ www/header.php | 5 - www/index.php | 19 +- www/style.css | 8 +- www/submission.csv | 0 www/submit.php | 84 +++++++ 10 files changed, 592 insertions(+), 8 deletions(-) create mode 100644 package.xml create mode 100644 submissions/submission.csv create mode 100644 www/README.md create mode 100644 www/font.ttf create mode 100644 www/generate.php create mode 100644 www/submission.csv create mode 100644 www/submit.php diff --git a/package.xml b/package.xml new file mode 100644 index 0000000..da8dd86 --- /dev/null +++ b/package.xml @@ -0,0 +1,444 @@ + + + imagick + pecl.php.net + Provides a wrapper to the ImageMagick library. + Imagick is a native php extension to create and modify images using the ImageMagick API. +This extension requires ImageMagick version 6.5.3-10+ and PHP 5.6.0+. + + Dan Ackroyd + danack + danack@php.net + yes + + + Jakub Zelenka + bukka + bukka@php.net + yes + + 2025-04-10 + + + 3.8.0 + 3.8.0 + + + stable + stable + + PHP License + +- Fixes: + * Fix signedness formatting mistakes + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 5.6.0 + + + 1.4.0 + + + + imagick + + + + diff --git a/submissions/submission.csv b/submissions/submission.csv new file mode 100644 index 0000000..46a5f91 --- /dev/null +++ b/submissions/submission.csv @@ -0,0 +1,6 @@ +link,name,desc +link,link,link +hi,hi,hi +hi,hi,hi +link,link,link +link,"hello World!","hi, me" diff --git a/www/README.md b/www/README.md new file mode 100644 index 0000000..1b5f370 --- /dev/null +++ b/www/README.md @@ -0,0 +1,6 @@ +To make the captcha image work you will need to install php-gd. +Since there might be version in the name first try searching your package manager + +Next you need to go to /etc/php/[your_version]/cli/php.ini and remove the semi-colon(;) from the line with extension=gd. + +Done. diff --git a/www/font.ttf b/www/font.ttf new file mode 100644 index 0000000000000000000000000000000000000000..fcd2ddd0e7f3d800eca699be2e8b9cde9864a827 GIT binary patch literal 105980 zcmce;cbpv6l{S3ut<*W^oO`D8boX@6^vv|+95qQfjWo(RO9%-G31lTi5J(6_u&}Yf z7%&EG0|uLASsd5PvN(~9vDe0t-~`?8xz#fQd-wZ&@9+ELV<=Tub#>LfCp_o5=bl># zBZM^Y4~tM&*ZAOy4ST+g@SShKSx0wAXBYk*e1q?}1CBl2Bg112zb&ZY_+2=Dzk6(= z?aA_!B{+Txj#I;9$@G`rKK?L5_!t~7Td{HZmPcNC_NNF*;Ckkr)yubUf%6);{ubCv zR&Ut5>N}gVemJ!Z;eC&-nO?q9`oLEg!0#3CeQph$ka$@i9CyHRV9mxId!9P3`~@8U z3L$~ruzAJui$7s|5K_Q1m?ImP@7Y3h?9br)HE_LW)AEhe+n>MZw+NpwAjE%X%jWGn zo?PKQh477UAS8Qa%eLt)Yxt8#;rB1Y^#Y=@z^Lu~%Uiy^RNeRik~8oegnszO*Xw5Y zrOl-+{32!yjwOiDv+y7Mju|U$Mu_`Q_};-U67N*`u5!V1^bCHE{V`IDC+IJ+cvXvd zj1a*tdU;Z=K zQvMwiE?>ud1L??pNKSfDh*^OQB!;wj8`{N$KyUwnq|iq*o?m_kv&e@xBRl#KxzP*d z6Zly9Ryih7{BnBDFNoBY&< zkARG4^+0v;>Fq|;A|6v+e0rn0I8@$9bwcfqKAXy5W?wme0ku+F02%!AzLB1%{U$dc zJKa-zVKyK$ZR4l*#+hRS-IG_!uToq3ANyqGJO?&T?QC|>+*AH7*qrQ>Jz&8@s;&sLxc+VbGP4%8U9=Wq;+k1jlBo zFDf(G`{ahQ5jtfT?$)+W}WoD2_h^pFcqDAR7bSND1YM6@2nx@Y(mF zUGJklz}N=d1^ALcG3*6->j1l&Kz>@VJv&m<@4&`9S1{oJ;W}~_HIp~cYQW|X$!E)d zCl7$lZGm$gXqc>o^FKm7-ig)&HguA&fZe}eJ_fiGq*#sq4v`8r(u~%U8ngiK0BpRy ze1a5UTLv3oE1rNp%xvTZ;=5;nHH6Z^_a_Dg`TXOIB)`fHH49Unz5+zOwU!Unbv z=YMhqUl)|UpuazZ9rNTTsEWh^vo?T#S&)178FUXADF;2tnXkb9yGTJU!}A^kTRU9- z0HVGWuPfgGGG_4?%1_|q(7!X~6=FO(gQO4%A@YfvLyWx$EQ}F9Ip7!1!gm`Wl5!}9 z4q!cw;u_qHd+;DWfNvsJl81==ujFUUvo6LZce!1yuDPz|uJx{?uJ=4fkIm!q_&gy` z%2V)kc(!=s;5k{^ZenEFOo)BR;KOeA*7rHUHyj z+D|=grT8>lE|-5^{$}~v@-yY9%3m*kt^8#9zOtvxln$15l~#RxGU=`0E?*z47mFEP7-98?iTnuV3@} z)vxb-eaGt?Utjn7lGoc_kG@{@ljkL8_!}w`hTi@E^B+%S^g)zn{nG>S6`nTB*Z%2( zD~FX|GQfB_!~-9cfX&E|94U|zslXpJ5TA6w3k=AJOo0CuWJNacMF(;M>bXIWUgSf5 z6hJ`~LSa;es!;?*!JguP0!frYHNfUFD2r-Q4&_lDsz(LXfEs}(6;U(TUMp%t?WhBF zqAt`8k-Qi6p?)-g2GI~2Mk8nr8bxDh98I7}G#AZ7^U(sd5G_KB(Gs*2EknzpFV~^# z(Pz*J@ZocSJfB7PqD$y==sxs$^ab<)x{Mw~UqoMmSo1J?1brEO1wDoyM^Bkxczo~5}!h=fk7U|NAVHd0Uoyj z?T2UIkG_Tup%s9)*W)}sj;}=<(baf0nnH)sQFI%YVL4ui7vbf23NOJ+(O2QPNC!I26P79h)$!k=vI6Kx&_?i(Sdy%f7)GxJm9b_b~SwkN6PZ$KNe@giDff$urU+=`*r*a)bO=iY-cs@Iw*eshY4_Rf_ z!`7E<659sbkL@A*t@a-~(vIsKuQ)x!KZiRdDqi?&4HitUd(;_oI7B>s}zll)6+UyZ8f{&ZLR?aaCCc=om04LOv%BcI5R z=ijY6P;aV#v@q0QYFO5Y8kaRb-xO=Qy-12%imx^onvXUAv?bkgyyc}*Yy3We^vjZ1L=Xo z10N0+1|J{dhaMVs4Zkpw7`Zg^?wnO~9vv-=o*Q$G?HX?!|IWm%lZnY+&D}IFH}A#y zk1kLx_;6v@!gm)H7QMKrwD|7DA1*nz%ga;C_fG|;j;u(mxMgMI%1hI2 z)4y6ZuvwH1ZMbRUj*UOwbnB)+ZGL!*Zp#n0rnWx1 zEw=5U?Xm4I?O3wowVjK0vAcHccI-aAC%xzPy~Vwk_vQATyef6o#r-Y&AG~_}>K6_y zJMhhe`wzZ<%`=CF4qFbtaP7#oA0F9rwB_jcuG3t1$Mvr3w_Sha`g^Z`_WF0O|I0DQ zvEs3n$Icvk{xb(Y^UCpU$A5U@_=)#VzI3YV)LW<9PCs))`iAeENt}7(#*v%&oA%wD zz4^ggHr?{!S#0i_V`u|Kj;~Z#UdNe)}!AzkES+q36Pm3!l62+8v2IuDRofcdohfcNb$9M=l<| zc>Bc%FaGc@(_O{8uDR=lyMA}Kc$6!%=bH}_f7XFs}h`BLe=RrmeiffpZ4Jb3!S zpMEj@km{kkzhwE+;V=E*;f{x2e8ls}=|>}v?tk>PFE@Vq?#CpLJ@l2(S6+I&>+u(! zC_M4elh1$kny*cL?ftJuzP{?~kAD5#r_xVtdg{Ta-gw&g^a8-%-Q_690SZRPq<_U-DGym+)T-aEB>BUH%sS3E2yAAOUEP5cJX) zqP;bT!h*@5!hSW*hr+ph#$?uqviV%58LM&F#~TeU?8e!!kj~*J0`92QW;YU{ZfE=W zwt~awUv9%%X?6SA#$fwahsPUKrAAdoY^Xlfxs~Kng|IDXmGddZ%k%auiq!H=I=`Te zDzT<-O|U)7H)(K7(&+G#r=t1Nd}tM0e!cu4*+6~@Q7Zv42eKMeo&qnJGU*<9U0p%m0xkW{y<{ z9q^I-v}baSMP=<)wd{`>ReHpKDS`QqDZQ1YSd;kN3{ml8gCsC zNOyDZg3`3zR=2|u>uT+0t}Ms8a|ofPT`PGg+V4}kcVJO zz)?Egoc7U zS}wGBl>T*10}j0EXmhqV5VzZP3KPLP{lKaPHr2j9wZ<|BpC&qqhF8b5tJ<3VzGX*R z-PMBBWSjK!de#?pgcSaiUu#y_4HC{0)rAu7RC~8Swje$pSekW7!n@WaBME2RUS*RD zJa1B{s)y=5>5LA$Xf(wzhPf6!MUudQke*5$_2|yK$a{pB3EIAi%;z6CRBL6VnuYWHE4%8hy=otW$O5U(T z%@Os)F^yGr#9?K5sa}%aC|IS6l}Dsk;OeSi&kp^ZGa4KM&E>%{|Wds zqPPLxu5z$!cF_zkRMCT84Ti4v;W zut4=w{x9+#lcKgs0V`YN^I%@!+vryh1SOv4g%j5-yfvbT3)#}+cfF{#cWzjH@78Ct z8kHb4mcVi-He_KG`B%~ojNbx}HmC@FU=egna^SxzVl-sZ_^*Y9*Y2#_@WtW92j=Ax znG4#3gp#{3)pPL ze3ulb9}mqLWm$4`NbAOgDgA&WgrASQ+I!OyetMiRnEUvLbd-uA!}@2^0^l3GB~v?+(znsA6P)uUIe}aGp0w@ILW51|l?(W2U`|tx`B5t;)4&)6 z1^~MhELi%Z5(Q=zkMa^-`=NbSIl~b~&|mHA&8HalfSf>9o=U&`9{xM@ALI|XWlHDG zfc;^CcGURKvH-se*Fvn++JekW^wmZRGG4fWM5Mft z#6!$C;<0GkwZjTQAkxd@Zm-7A5#9i)e|Q`Ug6tn512CQh-vfacF%>hfCKXMK&xe?k z&oyH+NJ2%HIc>3pwLZ6}#>>ixW_{5Y9NN3CFx0%`054!ho)Nk>kM-I8i*}E>5@Q_Z z+pmiG^9SeFZ#&z5)jSxb@rr7`^`_5?dWT+w@wY%TpbfDs@9e6-Lh)$ zW*_w`j0%vMdK}u|zw&%=S9msMGb&8IzZvKmjrn3@@R4+H!;ZZ?$Ns5BmX9yWr-uuy z9NSknctekmlh*DXH#T2AEafkM6!LYBY>L&L0B`QvAM?%q4m<$xrU|gEj01pefLb|U zNQ6>qOtVq-bst4j;KRpZbNF;Wq*w|(_%Exd$)&14dJbzH+aX zO<`83glYp1p?dbFKaCfzK(^1~0eNhJZ1Et@h)f%_p=NwxKpPN9#*7CwE8+xm0>`Kf zEStXp+^gE&;UdRm3=>$bA^wFl+eSppKM#391!dmYK<$>sCWu#+a5Zy)&uiDjib|9A z=BXhU`&F4O+EuTnR>YG3{3-cH$vAazk?RekUAQqD9rT-Hec4mxwIxh8#DRjoS;g#);8IMHuIJ?Gpi+%Y+&j;l}LsEGZA!Y zc*Yh~GeobIu+p^8A#)hq&QM&bsq43GoYy4fW&Q;p8}(|m2ul0AJ#f3ttn>9KonmZ}sNzwm?Att01OTD^Bk$`xEZ$37Kg z*swz*k1Y=B)K%*m=2=XIYK2U#Oj<0}3#)2&MDk7d`X$6PvUbC|`v#V7tiI*#ty>Rg zS4a)q+Wo_O=RJ95Zr+}(yXSJN(c{%OSM@BAS-bWg>^AaMDk~FLnO3yU0bS|J&oYY` z4zge{W|7ZHNO1wW%VkwpSAqZgWWB1F?~Jz?s_l;ndL^I72L5J;)m z$T_n$7Ob;sQZ4l^iAJc-+DC?~jN0jKjlF``+%r&>YWG^yG6^p))cxk;;l&-k=4GWn z&z&B?ik>;^2X5+qqI>^U>&H_48^61x7eDQE+iUu^Ebx1VdOJ0&W?^Trrg?JQytg+f zV1?_ykM-m|LHmGADUsR~_BI>ly6c+iT_&I7hNrV~>DauMhp+q3XrgLpwBFK|p;*B{ z{QVKz!e}7}xC!!dU<=F$-)>DST+xX`ZA^Jx=h6L7@CWCMH`q{AUmYOJcdu)L?kYPoacicN>zf;rF< z=~!urE$QA=UqAfJwmZf%-PTY#X#@|Hw^vtZ*ELN&v*=$}J0b$+g&=#Z(PMHRZfnU8 z0qhP<%=Ij;XPx??x?xBB;o8#g`a)X|>q}qTS!@bOOkGQ#t*_~Fn;An*Z;v)%tFq)2 z(epPy*4(PHdZ(N6y(U2wj~KBM_l8W;;B;sECcDyP(O{)T=5G!3hte6w5Xh9?Z0Q&t zji{XlsUGt<>`up)RQHyuM*>MDX|6Lx{hGLlQ;p>d%oxmnaxUGMGR&aI2zzKHAT^pz@F$(7*v3-8oFUZ%IcaTS|yPZnM66VVQitzaeK~W zjIHk+^#{J(X~{@fp=)RK#8g9jh*t`s*19dFUvp-3GHWV;5h9g@-$5uAk+9Nr(P`-DHp~;~^%Vob zyBBXgE-&8}PfEESclYM`YYz`L+uZXS7xW%lG-q{Zy!89a-G(|- z%&&oA97e|SzcH(r0OZ#xx1lcM!fB90Z5Biz_7|{4OaXwj5&*WfBCNUqL_iKcQSJGx zILa602>u7r0>8WdNZ;J(=BIzyGn&H0Cy!rv_j@f{eNs)`y1l7%mvH}+?MA~`&+1+s zOnNsu>LeD|>2oau{&wFW-i=%OrV@kck-Ci=HtKdb@lrmv$8zZrS7Z1~Ha!yab-sw=$ei#FT;@M{J4Q zWX|TuHt3ncR6WMGrkus1Z78ALyOPlNJHhvN3>|)Od4ik zrqOoD2UM_DGzTin8B8@As4)GXh>A*-a`c%qlw#1-5yUW1jOc)(CT0N!Q}3*Vb!uW* zgkTV`DDR7@9lq{B&o*^c!YpBltgUg+3Zt|0utL@J?Paxn)?UHBeeQF6`s{3KZ@g!* zzojagX)7w^vUrx)3|+T&%5Fat*IDaM_6^>P^OMU?4JEG%{>O&g>d?pcq%`{OjmPJ# z9p1Kj4*uSn(JzFgQvHB`u}!8JI==#2IjLOG&AZ;JlG&%AXo3zCc0H-rKzp! zo0~h%cPa%{V^dd?(soTpjx|jBhU3e_Mtr<5erLe7wNO~(QT+W`hm6fM?_iYLwk*VX zwmiXOz~56a%YzVvC>Yfc$b-@d4}TEIsY%YDtVm~yY~B|Xzl1?Bp|VYzX08=Od_WJ= zu3;EEWO8{GCmN}UTUp55%%J#;bMqpr0@}yJ6HS>M;}de!6}Y8+t!7*EvOtqpPpLWBNwCIUU7gTLF>hAdaJ2Ml)3q%V+YZzo-ce&#jM-(Zz_~n;9bHSR19W_BiEnk2E+Mu&-eH ze``0~s|dAXm^mXmH$%CGa?vyE6cVYKC5a0~ze5o@q2+bMeeQ5b=knGLS9dYW$Io=9 zn%#46S&$e3dQOzF!r&f&&;h*O%xm4`?n{h>SLuDG+>ocIV=58U6D+kg`in-H!kqUu z4vy4#G!mZC=cUb&Z0Q3*TfnPpWL7z$^P{Bv+ww~GL8cXEAt@gNsZwk9&InS>r&iQ8 zg9pH~sAY?Ksb~=nsX2e51IkNuK@nL2Y{DRUAG zHAHhOVu_lnv2z;|LseZPcP&{~+otCewM}M^1gO4LsrR*bddJy%=vC4y_hO5wu7e?F z^1AfE^Bte>Di@=j)}i%dgkc3`qHA7zs?j9FGUJksZCf{f^|-exl5HQi7$RAVqq@!^ zFuYoAZSc2P6m1PUBgS*}b#jMGqvBN-TBHc_c(!zk{SacvLYNV~A`ezXN9y3zxE ztndt3!}gIx$B4V*;MDTAU}N*}oD*kyv+eP8qa`FLWO9Yf6l`_bIH^P~C`czJ;!l^7yyD`LL~(}3PxjKUSL}~I)D{<7tQq0uvKAa zGhvLzwTftIitW=F02zDWzq5!s!)xe(5k~YpowZ;N^Q;6D*S+6=vsWo)1Yuig>I7l^ z=8nxRJ8is9ZomF?^QQH2uUn({bk_IT7p{3=gMT9ZM6Jd=XjSqSUo71;R^R6sy+OybX9KEl1FnV^lPPZv%{&jpYz3%%;e@SU8I>tNkzK$j^HQ5l>l9YMJ@)mJ>ouG_ay&9NuahAXj*(aAMn*F& z8o5M2XW_wRIJ5%N*2d6=Y>my@K2e=B5xKEG*lbV)QiB`&y7au1#N>J}D^XJUm;RG^ zh8cz0f-zbz09j7(UyB>$)bp@rA=}W`)tAFgpgWUokeZC_mw?@1M9a8;Lja zT=ND`#Jzr0sbdYwXt2e~s}jQv)`@xhJWY9mBmPWp{o3jiuYdeX&6@mn16%J)=Euli z=00;ucU6tAW@V-?lnbh4HEkp94OY$Wm|g4G7EMdKu8IVb4ep*kJtLD4&Qd*L2xjvp z=9Ray%CJMB2+i;Qw+Z)qAHOD7yYe!r&1Xl(GUfv=-^y8Gkqo!18@Y$ zYksL!YU3n6g`!}TI%?MX`>Xn#a(nUgxg%RbS|W=8qfzwDcUH%{tA{o0oDY_2l_5D> zHR`IC>IPXWqt$X3qiV~b-4Py*Og(EehwL1~dwfYlN=xkOnud{G&10ODQAVujQ-^G`EdJ_Lly=nA1z7g_ceAr_O3KuD%uD zIQ)b{Cvj>RcGdSWzvqUVw#6fZ@k7<>oeh8)xcqT>6MKoVAgHkxbppZTiufy*2|^Ul zQKe9XFw5 z(wg1N)l5tO>5H*8GsIqt#K z+>s@>jduFoW9(!ni~(!P-(pTPJX9#PLG{p;F`($r`J4yjMYCQaLaK-!gisO9EF(=r z)Z!~*5e+e)6GiqZ#!GCQx9!P?om~Q1y$Q$uWu=SL@C^&t=&B_fdX_ny`vzO1;eoM5 z>ZDu1GDC7+e13KFym0J>{Y3KluP*3tkHzOl=A8_vEEDrv?;1`HtJQnvOn&}?3^=Wv zkx3WVCy$)Md%iFy$LYp;77ho;CKekRJqrWpRAzdilhe1`i}USs8je>R^;MTwffv)b z{0@wL6HFB9q+sNWscTZ80|x^QQ_rhl8?a00T*X4bV8oycsb-oOs&tW_GeHOzQ@-#u z&7IIq%%98*7GV%9q?zZ}4aKi&Tr;lI^$u=5c9@QWTO$cA$HrP~SWW+y4TH;qo9YF* zQPp$lrVX1zX}fdbgbvz-S2T7^7ANbL{`*%3138*03F}%)_xC=~cFiMok5&uhx#sy@ zBgqc66|e7K*G)&kYF=P9H4eEvx2FGFyv8ky;7^XQ&NP(jty5T|^|~75A#m(m)M?+=G7;uj||4(zR5jR<3AC zuFiKJ3=jCX*LdWtPG$|X9%`*V*uB-Rs%}l6ywo*ive+_RReg(j&hMpGG(6bhv^5lr zQAUtt+>_I>*8(nRaa_aHg zws1@<(WlqurcAP`=FPc%*Y3_;=*c(jTD56juv5U)xcHAoV_i;b-tNWW^qfF{mxd2% zlb#L@kx7ZZ%U^4($WT}QFLo}YhZ?tSP*OqjM$~pbWnrH(Fls+kSRkL-5GhKIVo_yI zfr1!_((p;P1wPR+;LLT@LE%q~v{dTMV>>tWs62tL(5|!BdnM*zYph1eCt8!7p>MP~ zQ1E7ZCk!pMb#>Q#+_$(fQyhhqy#x!Mx}k=-&)vD@=@FZZ=lZO-_Aa_TmhueS$@ zS_#m(0w(eyOP}tf&orUmHqunR^@n3E?Q0?jd#U|tIfX85SE#ZzjzUfUq4WNY1+KPf zaBie^o=vGvc?%=$EABLF9H^;+;Kc+dkjUA{OhY$_=!hpV zr+YH)&Gb9I5N?Qj3tJ97{-xC;D|*ywL)2Cm>bPIuf2i?LNYUi|wtuj5#aAZQD@ec^ z(Gg-#$r+&WELuj-QBUl@pY)co|%m1~?0cXwrZS7L9dL)y-?W>x_f*3)?On z*t9`M!a0*%M_4Zn?1^plg!%r_@te}BM@sL^>+ZHz*Vb5xL?P>p^f*RMLa^O*|T>@yPq)fCF5RHcFeukx0X6~DzQWVVL#|G<| zO$f?$CWSY^D7!mb3lX!cxY`{~HmuwGe!zeof%Hi;o@Mrss+~j|~i5mtWo!_h;S33mc173Mdy) zxj3ah;nV9A&whOwkq%sitG2AGu2IFb_LfBlPt=)>ogKG~#jE5>quRCas{ZAp7JKt8 z2PYg(W8~P%TNbUmvng@U*6SyGLT;(RawbBQS?8SmzTY08{r+9~2sh1CSLQYMWPK(!UOu1sNx)<7|niU(vNS_5R`;Trl=(H=f!4it^4C@J{V3a ztSxI%>oZ6EuBk$`oV0E^(mQatc3FEO(r8uca@QO$7&%TUUnEN|omjML`@N%t=cSqj zbB(6HCHo&*W}WO@u(mE3o}9+{7gn^?aDfX$H+04e*7)9HdX!gbs;nLHoq2UvYCx@N zIeX2d(+PGnb#C>p`!fNB=h1gZh*0Huy&GhBT{*yxFf~vuF3yyxFytXViRWS_O^n!i z7-Lh}HDevrP|rFOz@?ak0US9CD=3s@w+k2v{N`M?TjIfy+rM$5E(S}0$i%sKK z#cI`z_UR^bE^B{jbLp2KWaJWs0b8-%c7NyacmxvMyiGM{ZaPyxvcMoz-##zODkYH7 zg~<$&x9CdS*eRwDZKYM`P>~4yOB_gra-u%~o{FB6&w0hn6P>N6&M;#qBC=42xMC{d z&@57X0y5N6W&;l`GoUvBh@n|nT6zO;%>0)wygZ{Gtm!n>N};Ar@GSY4)XkT+hWqzk zz{aWY!YvJ(nr=xrJi~P+>ti?e`uu{S!R6UJ6e}uxFd{HzbrN^eu7GQKKGnDTSpV>m zOl@rJkeziot5fy$OH+*N;|A7v+h-0(N`E^!hJW68x%ApX$kWJW)*2pe|K%Cz)KV{y(w1MT%+!4ICt)v zc}};%GAF+E_)qs46IK4Ih3D?l=stQ)BJrh{cg#sq4$UBWd5X=#8l_1<<@F$GQAz-? zltil}0!u{!(_b`E3zdK{M=~ot+a%%F;B${R|3~$ zRxGX4D4j0dXtCztXl=xkuqM?>sB&B%9-U~F$)$`TkW!Gg$`ILY6qM;Um#ZqH)h$V-dKgt!t#V}rRRO1#?p|1}R5<+IZjFRvP5$a+ z#BQ+JHC~m*=#-d0UMY7~x%C>M3SxYy{Cm<(z6UEqP&1e&c$toxju^?Jbe2hlVMKbV zC-R5yEVrnG^@fFNSzkz+y6>QcjmNj+!&@CHUqHulmJdts)j{PG+|y8gm08G`p!xwp zPFo0rc=a?z27f|`Nsvy7ixm`&*L~l8U2x@g;CJ)?Yu=-uC4W_7AyE2F^;a{;cFQ>4 zj?LTOx}Dxn3vCRL?}#-$;@zmB6VYv;w1aX@$Uwl1!@q21lt+zb{pHohuFP7wq)+D> zvJKwD$jO~7sbNiq8%n#@7)=Zp#zxm9-n>?=h82St?SeH^HxriD`C$Vf4m25D23m`6 z_AS!x*7D>=EnnSC=?#^^2*io!Wc<~9P_I0P&q>=DT?%H);aW4) z;@uCcOY*RkT!m-CBjjemoGWBq+*N>r#so0e8IA$IPh*KGkLR{2)p|#D73B4pMa@o~ zR5nu3C|wh&F1_Rm3(}#Iqc7jN--3+314%l(}6=WV`gf) zPRn`Z1`_C~%C!zX8MO0sZ4!ntYYFcm>tL0TnCI~G6woScRvaEs4n$iB7L`eXMbSEt z+4KfvE3!$J)$tZpR=R^c+??sJs*Coe%n_Zo$24-Y#!>IHX9_Lx%3mIOL)B~r#e_ch8O@FS|&#Y zqnoi=2#qE;rU`b&1$C0VpK2^TQ#({k>w@@vhOSB|=2t89Dm}App)TZPJ(A?*0kf1L z*xnd|YD$)jjo`pUTBC1Ia;(#^@D$G&O|sIZ{P24QWkjXG7+((fcpNLe{D32=Y;Mo6 zm=V~gHN9uH<(=~{G;^Hho&S#7(t60v+**1b{}8W0?R3q7*lHSFAshfwfZu)Mga#g> z!l$S{%$)$iFLIS^j*8HZh(FC!#lu9ylDU1`Yb`e7s43KECzH)uZ9J+`D2dWp+ZMEY z4T50qY|xk;oWz(2n{~X3i8W*_3y+_warRoOYk~&<9W6;US9*T1B@+#4WdjRz()z|8 zjj3gFb)A}XDRo*UAMA^y8e8Q|^YWaEu<^Zv-fW~=!ALk^;T%iHb*l;?pU&Hwtx@D6 z?i8$+FTV{!D1KA^H%18&)_%HLq@_?vQ6hjzbxg7|wwm!ngzGRMi+P`!Sz^Fbji;mltFcMuSeNJ6nV2mHloFQX>p>(S30T>Zd3C_>UT72ld+uVv%EorwYskd zZBE3Lc9xz;AHlP$VHG4~Q1n-xAyPPaI0K4=c?g=I0~@CQ`|=fz04G4luyP0-3o^U> zYM3RVkG2NGflM$a$i2Q?TYhlZH99|~wsmCgw^*ee8lf~TcNhxoOQN5vZY9L0gKp?q z9Gq!YL$6vB$&Z2T+6#>V!^t+QKbZAq+?Hw~sz0eI?KB09jpHLRorBm-8UwAqq?ia; z{a5@I!0LetR?{{c%zht$BDC=zK^o){V<1 zYCYeqR@=hTe+2O0;Q{5s9-kq`spe)Cu!=+w93giaYB}xooe{IwWndV8J672jrk(SA zTy1fV@gH#A@o%?UugEjRu$Zs~A=p)kck8iOKG^=sk_>*z+rN0WUB0Wxug; z{Nm=S;qTHCo$^m$6?+#R5yv-Rle02Zu^>U3Imyx{h-|-zLn0znL{A$^V?&qh7MV5WTTbGJwIx81nNh?f~qVX9`}sckIc}S6_#l7;?s>J%_C;u?uzt=bAR&X6c~*SMT4`Bl1L&Ww z&AA=kk5Nsdie6krQCSnlW`HoMv8rOVV7XxEMQoGxaR8UhrZXiZkU1Xgji)>`fEq^VkpB@C-l zDcm}j&cs8pt+>L=-BavYWH;NQI<>@_$UrKMlsA|Dh^K*{Q~{>U%xL<;Ah!ru0gxqF zWI~N2oD;`$6j4OO73k=L7B$h>gQpX73Z{DBQnk&(xh1AAL#Yg}Q0Y{S2F_s!c=b-Z zL`bKUD*xiS%0#3+?!=ndx+xv6`>hAoFdFf6QG?CiXfH3r8d+1nr{Dv`Q06uE!}kJb z7z59O`sLD_coW1uDCvY{f6$IA-cOq#W+G_(qe=Hq3RNrohCq?sDrMV3r8=LC$z+*I zY>Q}Fi3}DO<$P@m3>;sx!eP|$E=leo7@L*Kdf%;2IPLv;=9B2fDP#;EvLr5qoKkWr zuI2DpXsB*XRVGkXtFj9w4e!&) z%#r4p3J>UvUMz7cBtb@}CrR5{4oiq$A24~OCM^_K$m*0qA6`B*q14D2O|2tf%zC{o zO5cEcLr6I1bv1yn?5sJfgZ>~7$he&>03XlN>hpXy4@?n;hjhIq4F}*rd=$fsyf`d| zKEeDG6*gQ&Q(e?z%|I1$o{=oaa9m@cm^E|egegUj3i%;3qf%>)DOiXAsa1Wh$zAnt zZGt>r8%!!9xskDN$>qcAf<)dq6_Lvq_pDM{ZHmBlDX`v7=iCGy-jy)4>@hjk(wsc3 z#lZMsJddtng?9SH+5QGh^K2C*z-NeOVveaoYAA643lUe0hD`_ zToUj#Xk%V=!go!aqqd3yfR*idBfM=vth%XS5g!ssi|FXHX$3L$11QtFy@8TK`p0xUy?RRhZ% zKv-e5#piHZ91#askppsjr0?CcX z_1;h_TCXWcjf7Wf`V*_10sN3FZ73*d7r@6~FaHeRhNs|-2r!nTKtse?5}0TJe}Vc9 z@MjZ^I8?LXFyai$%t#NInHXFv{swkQ2gVP`aM&iKl`v)GaF_{`;O$Vt4?tk{aqgm; zVI+FN;Dr)@7FJ|19)(|3)gQvc{YEumuV#1&qmZZ%Qv4r<@x+h7PCMWo88DuhrH)Yc z2lKX2WC2X&if%v^^zTz9%useFa&k&N0Zv4^(@YgN8k-@KfplT0Dkp^nCJG{l1p*bj zCK8=AkTX%+?w$nOwz>SZswHVt^(++~>b*hkFcyxaP4`7xO3%*{%jSDmjm8Cs!VcAg zqRkUtp($=pg58fjYSiVI+!1zkyNAK-+v^+sz)2fdn1Y7g9l@v`mSK@{vGfwY3*uet zY=4W~Y*7QGGHGXKQ=K!q6_Ew_rCE&4H0wcyKvi7nEvUWX$?KwVZ%tw>F{RNtSvDo* zh@>N?bZF9E2bASVYWet(Uni@LW86yQ14Aq?WX+Mr@cDJt4&J3qZC_?JF0ge~=SnZZ zrLSLop z-O?`DBqocS`kbVEHGUZ0`v#c+n&}0W2_QqKN5w8s6V2oRFe&U5No8h8bg{}zYc7ND zgFxO}?{wKiOGnHys2Wf~sagjtLgS{qTDeI`nWBPn!sSsDrA(&tCs&YHq^iuGYrRRW zI;_oP%-(u;UTwo>zkZ~Cf!|(Zl*%&A#{m{mrm8}pFehcW1IKMW7CDG_F znU_U>Lwacc+whJz+J1uop-B{b6a!v}AWA)s<~}JMfOUOzxSP$3Q~*>&llSH{ep}NQ zhuQvQpk|5_)VFZeycd_;u_4FyO8PC}=f zL~g?4HKs^1ts@#Pk~WWS$cg2M1#9R`oWoLC$1 z5|La*+M?kD3NlxKB8_ms-!YD z)SzXOdMN45^mqv7tDF)j2j>hPmBrzX+HE?ei7*lwtdR{2-_|GB@%;?vyCv^s8CYtP z&K(WPSf4dozn~$uqDwE8D^o*0SUwblHS`Kzqfo=*5`rw{&oODz512a&`78kxOfxjJ ziJ)V8MB_TNmQqpreg$6`=5PtkkEfjwVrfx<*o(>nA2H2UDO!Pef|IZW&oN+n{ERa? z6yX&7&QNMabHHK>tJM+)a{HtE-G__a0}^g%>BJdJba*6H595_^MiVEdsQCk%&fy#N z5B-7B6BUDt&JL*Gk+91WHRjp5}456aiVX%8ftRoEJ zKBrbX^kxIC;l?OJP7@2{sa>F{Y(8v;e&z)lSj^Cau#gWy)*q%W0e`;`UvqnWsprQ} zDC6tyh%OGi`j}$tNL$0O$Aj7C_`UlrmctL29J%zRgBJ6(m(4Xza|8dkIQ+Sfe^Y9OcRSMS z$4k$MH4}^JDgbpWkzy;{L2r3XFb{MRQ7DcB%OUioJBujqA7y>6xWFa9I_Jo`WBg8@JP19_5UVBW(D>&Pl=wW+|s5(Pd$-GKLq zSY?Kjz~seDb%o#qg`_zkid*zDU&pa6*DTxonQd1u+l>F?p8cCk@7{CO))Ov6WXftQ zq4~WqZkswWz2NNh@s$gI>-CtP)TFu`;Q_z=9W^&>K$<|Ost6k@Ze2Z0^X*3#j85egjW5Y>=LQ46B>1s7(| zRypPRs5fTTKy5gbK&DJeXIi0>sadJkEMQ}lN4~7h0$YbO(UNGokcojhP#~&I@ z@S3m;qf$wpQ%Y@rgmKXShj&-7SL{I!_OJo%0vq|14KNi7I%6G`ca;EKns|s(5cVOj zE%H{VMWjsJL|6OLH+_IT(n4&pObo)?%kuw&h4^*miYh?0R+z4+bl-f<^!L>yJTaDHLhSkzabA4cB+mJ`ju&`EN=%~wf zD11g;$j5QS<#9x91_=p&LuoeIYRsuxlKI5;N{?N!$mfy?qk1HL#Ydp+-%@ zLQEN_V6g`@4!OnasBQx*QDTl5s)Ke*Z^knyVYnu5+~1{h_GC7PfoHA40Xk zU~OotD`>YTAp1e!ZF4643;Y7C{ioR(Go@uz+@e2LW*{iyi5V}EH|NY8&}r~hpWuTx znAB$PJHc6ioyq0q!|;w3eB{bIRsxpQYOs73xEQNFzZpY@$j|83LE+F<;_Fsi{o?CZ zxa$c=;B_lMmM963Bc)yf?ZV~1qd(wovI%lqFvC=N=?X;@kwwyFb~7wO4ZaE%0+0{- zS4yQUvru`LQRNLmhKkV+q@2NMB-baEN8KrlRMrs7C*Fh7Nz$i0)em_TX*{HY!k`{k zO>y8bBhVPg2?2oim4IPAh|w2O+*lD-A{<8Q9ot^^o?q8d;`cIw;6Fm0>!qF>vA9@n_ zLLulThR=X+;|nv?PSjI#J4Fr)@OO~gksKS~;eyxmugvhvt#+BUyHkA*LX+$ld7sqg zz`WFK#k#Di$=bLpZN-X!gc|GuxN9KBN=f2K3M-t~Io z^{#jIpa*oBkpWNg;6@42xVIfQgtPh~Sh&B15U`oGQVmtTG)&XNI z)ER}Eah`QZBRhyRN|4!Byt6fL1N&oenIrV5Fhi9+=HHUp1>1Abb>4o3}g~j z5eywjT#{V0kjn>G1tNUhc7$|VYt}-(Se%?ytpw)}nm>@uP-Qk%xuGe-r&Fn+NFJdV zY~hxKy{gfs;MGc_Tn8Esx2PO;Z6eVU=&M#J6;SpK3)W)?#4((WrA`w@#X4A7;(I>W+{sq?qp7KNY#g%!sAqXixr)MK%;o znK{+dPzqvAs>Q$n!uP^4zzly4ki6g{JfnAbYX(tRA!XGEr*7GkI472EMlUB8MFAsn z0%P$(Shoi9lVfDv09djd@RBnk;P4{KPX!+I9LAtTcBQ%zGcu!Cr=v@{QH^HMp6|<8 z2Jp!`%yal0)D0C?sM=GaLTl>FR4CpC#6f1dp!*?Uy9>SC&nN-aP?Z7o0!3U88ZSPy z5?u?-v%uWF2Xt)}(2C>^3xgL->^^c4;L|2^AE>`2=uCRL!ijd5Sp~r` znbn)z{_FEY>-)BS>%?};R3qgxdC!#Vh0e^G*EUZb`Q*lKhm^mT^UL-3qepBG+vtDHuS;7P zja8z6mM%d?n?Xhj;4|Jw&pQNfkS{^(8|F$0jByw&ddYj`z#6po{c9;NrduUdYI;}+ z*PEYNJBbzKM6jd=#^(cY3V?nP=osQO2?kf~6%!Tyfer;2h?UizQp!|f_K~qQmDdDw zkmLH=c`4i&2lKsaD6)dg_JGVxz-oOAu(fz>^NNX%;TH{>erYWQh%c5$VDpczr3ir! zo#?P0kRkD_1mso3MXsFqk|hxr$65-FnV5^+z+duRYbvsW%%+)jP-CTsKI+ zWT6lHK5;+rD(n{B2t4o)!pVi&Y2lg&IfAnZWUe&$Aw)btoHQ{+?|!%$;h#ak^!_xF zP&+vE#2}!FFNpRKH<0F9;P!+I8Oo=*K)9SAj54~CmLZ0=gTf^XKNSpqNX=)MFCV{m zVD!3{Z~VA#B!`hzogEtb{jIO=%qsos8+}cE+(OQ!!nZe9?HbWrhT0XZ9!RX- z(<0d@Y3%N-#%%uo1`m`GiaE?yv13Dn&GWFpD^_<~CyUO-8I(esP*30X8`Acfrp}}t z>hLA@SYvzJ$j7o%i2V&8Yl%{#Iwv~Yq5~n zg1sQ}hqxB(9odHx(=5CQix$x4fGq?S8pO6C8wE9FPgT07^2W|vSI@7NJ9Y!aClyXZ ze7H!n^{z_)R#79)u9A4GdKgRe;OqS1T7iCx%E&N#f!PjvQw9?oAbLU#G{`=f3Q&fK zO%ci<5b)T@CClyk~2p`25xZvMkBbsSB5 z_x0;c?OBc9?78qr8xT(Uhw)GO253>=mmgV{c&gFIFe5j_qYigu6nLlPe8}!i8tpZS zCQt+5_Y>AB4800>GB<+WlamfM!sAmgDJk3t+U9vWvpsv z3FlU#X^Xt7&dh5C&MmTjVb2NYT2W`MX3cZDsdS^k(e;sf+@ui>jxUUUd8uVzVzS)*1Xr%c90*SH1j>qyK49iqT$%*^5|Gm&3sN@1>Y0w!$X(PNk)=dK4@w5vIDt zFnIbh#ZhhpT>SYO2!zOB_ILSzXTJsKeiF{WZa_idnkQk4wV_HPWI(>`yh35`_tp5T zm!wSEQ&UcvlZG|e*F0Pzf6s~r7 zKV*Cf$*d3+W56j#^dD8oh*f$>Tsc+TAeO@??@s9&pqi8ai^9R=a;>qk;kM(ZKEb|0q(Ah8TUi z$UfR}zZ6-lsO<@3bL`S2q)vswr820xDGlkmZkGv$UXj5D___9k61PLwj)icNX8$$+ z4@E{&Vn3nT3HCWS-$x-M`3|!kk&rM+?t%P4=43BnV#y0vlmZF=6IPGt{lOX)R$=6i zX#L?B8e0)9()Q`grbWVC4BMsF+BrzLwyHElH$Xk{i_AG{t5-v;b}Pt!{(5B!KnLTT zxb15}n)EMH?kMNgD(?LD)yGd~s+MC<+N!z)ds5AMU{At7k~T5g$f1j_%cD`^bn`Sy zhA^Q~D#~PCfjepk1ep^C;|*`Uv_=vGk<4LevVb9A5x4>v zGWh&Ltt#Q-&OlV0ir%+oc=|Oo&G@PrW2YV(M398Tu3FGpku`(XcNomHAUlFNytq>h z6#+1TvZ#-UA5}zHg;j9{)Y8XG%nI?E!K>7mcRIugf^|7$~-&MiEfpr^5`q0g5R}WdrcW z?XL5sPR=vt-8B{*t5HNeH63~}xf0r1kH6VFbk)JV4XFhjdd*u@s{3ObY6x{6d-r3g zX84;A-G(pzOZ{U~>EGV$Fzu;Yt_$}K=Xyd% z)1wuMq9{!e%e1PZDYEzBj>@tR4Cj*Ka|xY$;tr?NQ| zGTrdoCA&h7lIyg+KvkvkIXrj0UEV94D7{muynrf*$P3cKS5{sH_ZAYU29iKsbD4#S zcdLiADRpnxR%)lqJzJ*aEbgaFj#u(D>MAdxwd7ONlw3b+%&mr0rMD2VO&C!rkJR0u z#r{-GQl+Q&9cGonCrb|ZJ4!Lde7f}T!+v1M88CPN&c8<#E8HnC>kZmQgida9hw8#4 z1pqDRE(CL*Xl#J6S7&g8w${DrmOiwJ$g>Rh@>*<~{8qgtcNk&5UWv>NX~bW_8+t!;gs)8bIV;tQzcak+fc{arp& ze0x=`t!>=1Sz~jkc8mih*)&4a#>qc+)L=+|@YXY;>#`o+W1x=se$ zqjs6gt#C5tk3BcjeB)0>-C9RO)%rHM)?xK)52Re}zz zuh7B@n$<6|Eg7ISWn1n<(d7-8(wJ4}HIp#RRJoYM7$~4C$gC;^4HYQiNW32+=ob%H_9;PuG zb*+RwEEg-1hv^;73dKC@92-!obh!qt{ZX4hK9{XC^cXx581)o~JD6|-)={pvZo&^h zo`}%@lyJTALbCv*^%t%9fEow5>Bu^%5n4$F2jjV``Y=+s^=-px>r}DZAYCU>XtQW( zj<{^xm4&_v(sWQ+tf3E;lE+cIj`Ff$ImDc*DR%{UT4kF;S_+7pP9709fyy054T0}I zAM;%SNt>>Cu`JKlMlKY6{50T&Jlnk((`SR8@DkQIQsDsNTk6?LvzWz)~!iXk#%hL4H5F5u1VkGXmX1OZ|Qm{Pq&NW$|CHFe-xj68mJ)2awmmuisIMFe(Go z0_VU%*sd=13=n!P%S12z9NAJ7E&U+t%g{rxPUKOG{tlicu-wyBy1z?5&DA9+S^8n_ zFGmN4xbGi<1N3T`GY{QsdLC*Op@p7cL8w#&9U;_?f`WC@(X}c}X3YaR5LIKOq3yna z{MOj0Mv8r@XkVnk)8(FOY_vJ#F-=x#;^o7kjLjd8j5-?e3=7lXBT_jdHF`S^KX|6s zscG`>9nH9H>O^ech`gH97^RU|ez5jn!&L{M1rg5@jeSq;^(S@hi~~!JXUeYU?156 zkKixpKK2sU#>?EvN=K%Ar7PUYsS%hNwt0)ORMK|$pDXTB7U?(XlauqD9tAOVuoF$nhu-QqCe3&O)!F)Xr?X%g?XaXn~ z6Izv3Z?_~aMa>8g=hj7^VHoFN+l4m8ZXPI!6AWwhY8Z8Yw61p-AC=acw_dXpPh&y;npbZVJ=2Fhcxz$b^TV3Py$>t!&?m6T+xl3Whe6_xGEY39&X1*0AI zM0oa>Al{Gy)~yviI|=-eJ5lidN-e47o?UG$BgXqtiFUoz(@UZy9C@f*s}^Oi1KAVL zuAHlmL_P>bJ*iKnMO*Ni(kGQJpdw?k+#)L2{XSo&M=!OEa;`sgoaoQFGCrojNtlOq zG+*XQiY6Q!4O*nP%9Z?>>XE1DpQ~8MH_G*gz*z^p286S28yKNrX~QPaxbWL$tt(9@ ztSN&XI$Z+AwV|`aZDqGVo;{L(6J3vwKrbjXnjpd{0osn@GfW+Jg3-lN0z3o5IR;Dk zS=Bt36gXY4olglI5K;m+we=&*95pNOI&}zKu5Zqz1ojkC0{K7R59b|fM+J_--_rfs zAlk9EJ62gGzqY&fy^@=6jdtzfGBgt(N(ViHJ0N#640Xw*dah9OUWmL11)$_|ENOHm zfQK3i_%h$8MWaSQlN6pOz{Sw!Oxe+hn$iR33x3pWjRqT*YH#izuBz+uTGTQLC(kwf z^5WRmZeQDuvgWGK^qm#Ds{VG{K#UN`ybRq=iNRx={EN0WFV;-e*U-}FGWkjxrv9m> zmUc>YrjT6VqaktJkAYuVPht{tQP0)HsM{#V&0NZ3r2*+4SW_{sxm@`9Rr0Jt4>swO zHA3YJWZx-O2nk-2$T-x262)XTUAczEJ(=LB-KS+aDQD{qg2^Dmzgo+dMW)~7H>eerJJqnOwRRa-R=#uM`1$vVl>Dw@jWZ z1q4D1Lce&q0WipjVQ_Gv}ENF6Y26JnSlKbPzd> zE*=<_8tnCL)h1)O%BbCYym^3M*mt?i>0jjJ8;rbvM~91HSY0UMnF&bRW~R(%27)|N ztX2^~Jl#B-rgLY2Z+A`ufU!mE-7CdKl_AKCCJku#1Qg@KywyA!Adl0LjC7Vrqo*b$ z#j6@i^RA$OQ(IxR-Yo$(De-#e^92=CY8X++?BmQ3=!pin3BiAbun)PB3zOG~mZ0n` zum~U@qp@tz?{ESZw0;Vybdo0bals;9h>HW0h}1uxRMcp6Jpd5=TW%h54Bvcvb$TOAOXR)1+3}!*QBApft0vs458T_4 zY8?xk*MCjc#$irVXVkJ_0>Bv{b8ue7c9?^c0voy_I|87m@%ys$M`>uKd@7C#$j{2h z;)qL(tFjR}oH|)PBImU-n`wSe)KI%P1y5SZ3$c_-p_Xz(`gS`B;Y%a2-=g5HDuOgV}4+9Rl7g`c6Y<2b{n+ey!Y+y!!-Ii>;u^D zmFHv8Nl_#qL`6})0SiV(CCD1f#J*r|6q31BWC^ad z#bwj7#H-DSZ>j=ug3*BNRdrudLAN%N;EyvHfcuTM~vTJX0&%lB7 zH8-U)Ppyj&SVMK@7)C}c>#FLujaZ~L8{UXT@46}6saLRKR-4g6%h-mYy>~vfjo>D5ySdnQ_^x7`VPN$=hOxL*-0!9x zh9hk@_lD+81LuUM!eF7-u(Pzckj&L<#K*yQgIcy_&{F8;1ULxu^-L+DH4{_%aS|m2 z$z5v7o;lJ=+A`xlk1%adn~OL}r)9F{)fLR#i%#*R&$5S1-qY-ZiV+27@*n*|$@o3c zcjnpmG9>1}P z3EvIn{1Ok|-#X;)@{KSPF4x8XT9#3uJ=j{m-6dH_ED@}09B|f|B^pXBA=G1BgWjMu z15h2i^16{M$Ymu}4SQg{%U3gek3Rr9`4b>eCq4fyHb42=t)&na9(+E%|)D;1dDrB^PowQ^RgkrBHYj?6mGpD!_?9!tj zt>oE@8?p5K$3GOF3d|dkG5>RB9}^%^$t9^}V9*QEbo0JBaWjdBR!TNQYLUrhu*8`_ zzpC7lcmLz@=)j!&=}2#jD<|8pDIAbwFaO+Mb{P$m{Urn}uKONs2j&^y2s*Xc_MGhH z{M(Dpclemw;NND6c1-pAv5s=EoJ(L?TakpNxLdJwYspz5b2+ngE@y`3YUV4K3}k-Y z0zts7vgF3i?Uz`~!OS*^RbAa)vfR#yO1j(tPgzjq)!HRiiEqQ4o4o<1hA%qQQ{d0p z39~MSMO!Yhn~UrnL{2NWj%0HRoH<~Q3zlAeI7B)mFHIqHY33Z@apiRAPL0lsVWdw4 z?CJKwU9}_0@rL#~GtB#jF&?3Y>-#IWZW;O#P4!b}piod9KLfbGC+zvF$7@fNK?OYbB10>;Ev8wy#of{pt zlL4it_5OxaXKPZseSLxc%UJfp4cQ&qW)XGRaBlZpNZeGaT$U!UG)VE*_!hm1|NUCSu7ooTQfg&DKI zqcdiKgNK25BoR2Z_25{PxD${D1VvaV#3h1TZptjUlC&bNSXi=FQ)iK6&buQ1!&(lZ z#b?XW%FY(Cssr2ldeNPrYiQU}03>m}ph@w{!gbE@uEgu37L!dW#t={LaA_rSh0wvZfd<%5kk=iJm65^qK;ZnKQd7{!YSu-wbiatAG>f4$z^{ zK}z#?seXIY%>J!@xbrWmLG!=qj7t%W zGEv8QtyRnTmcgh@w#c1tQ&!yhYLk-Q`HLvfWPACYj|V6=_pUKENo_OW6AUe=sUw99 zYX;ISO@0_=*~%#$TGr+>t|eUY-&f^eM1dF^8>J>U3|t~J2BtX#HtM~iCq&PJg$m(5 zU>?QL{xZi(Ae7q_^LWHZWV5~?0Gs5uYB8}-A^u8U5_=Ue7|_EckuXRo1tT|!i&bcX zO2hOCs9Y!CC^#$}3^gJX+58;*MpG)Iqog?@Y9IrHIZ%HAvtc+S-ago2wzcgDw0L=? zw;idIR)@B+TLM%167K5iTAdWZ=u8``$$ziq*7oV+H`SlNHepsw+GQ*+c6lP#_HL^V zpvk*!2{o$Ih1(}=JDNA-`YeqWS-NIApjFCvvBKcXIT{@GR*k-4YU;%FX{S8qkp?FM z_T9|TukD5jjUDqm6WA=1s+bc$QG_}Wk|BKZsF`7uTV6S+kVwreu6?}K?@&Z8fO|ML z=njW;E^qxPTjh}v&k#H)#&y*SU z^mp&74FX@Y)Yj~8HOds`thae&JmJwmbB8`FZHuJy|HEr@Fm8TAjM!{~0|uIj;e^Zz z);#PWp8X!wDg|no=aV~65U`tE#LFBv+wvLwMV_K7M=E&5HQkK788sam& zitmb9n&~ujUtNDU@3Ql+OzWKnu}9*1ye|&KWt{j1zSLWaIbKvr)pxsf^HasupnWbp z;dh9UJO9%Mn>w3dU|+1<1{JXAWc)B&>wRP%4$+?QlwNYu0AJwnq<_P44(Q- z)(hBV3Q%MZ03^&_v}ZIK(!=-&MR(|F>GM^twLzxO^JUq$BKnoW^KL^b|8#EX*Cz^S zWc+QB*z~hn6(hmi-l3|QnYV|^>AtGX!4(5D-`;fm2`&0S0f~s>@I81t>0Bv89Z0^2 zJYh?T5-@}Iphztw20_ncekU&??nA>P%0Y{OI(?!`(KWfXfII?Gx!G*0P5S_&KhPOt zowpIRZFs;?L-3}bG(7kU1zZ=vl9R=2{JjL1V7mbSqnIi1Kav_JP)x+D_7;@WTJep} z)#n#D^Z?F4NwxMIkbMS!C>V4TzO7#;g3!76f47 z!iV4tu`1?AmeTYu9e@Y{YT;ufj!Oa)B*HasSCEhDf>fb^p+UK8VNdE3ZMSu8y6MB= zTp?P^G&<5lvFE1}X5ALM3^OWssHrBiJ32><97!ll=>6Mv)OS*DWV2@xZe+O^SxgOt zAQ?7j;|IU_zR~(YabTi_R8MI`)&3m;yg4(RZmnIMBl*}SV-S0*BI&MWXp$W+jfw-R zWOBEEbv7*eJ^F^I4thaESrXJECKXJ>s*LB8!LD$Zr^8^JLA8U?prc`JQsurwZwxl_ zJl4p3mas0;T@t}wA9LB2?O2gDOJw8P6Fwc|@ab8TK6sq8jrt8OZofFNsl8Ai7CPWz zYAjCo2RVZVX?33u+MH;&Nn@}WHAbpm8Q^mkxQTaNxpNmT`iX0Q_-OJ4-&A06e*1*i z#hrYp;5H(m_ZMc>LmF*Ktw}q77e9Nn-FMN0Cv^FOJ;=;{J%3DG3;VDUX5L&|*as*X zD`b4gNy`{X9t6yHTHGrHMv2c#O!dW%8TqJiM#)%GDAFU`1w7dLnQ%ogl>I=>NS}Sz zzH3{b{lH|;;VPY7zr(IT3eTuDY#*=f9(TX|$iZ!9?e6Id4-BNcV##Jph*!wu3YjU` z;j+g9wYli2p)>a>>O3+(iiqKQlS<^g0{85ji;hyp=yQ^H{oC~G@89bhGY2Mv`+C66 zh5|ZHxnZMaAnLA@DkYJRpZ#Vc{Kg&Tk#O_y`gq#psA;soWImYx-V|yx%bcP1bwdq< z&bZ!?kvi?ph?<3~LcuGsqOaUk6*2jf`PYyL{SGpJ^(1=^?Y4!3#)E<)X*CcqSQBvO zK#m|`_@6I}3XTvFY-QAVKcl3F&Ke8{Qo$&g-A-SoGdnWon%G#UwsohTvsk6w8a}^Q z?l9!Kw$*&Nx&z%YCj;7!2y7Gd95xN8HIeM3N}_JgH3tm$bXxtvv^V9pRP#0Zdo=lz zrhu_|YCNiQVCZWo>8F8-bNRpGwlL!`Y45D)U846wT|g~LXQ5$?C|__EK&grfStK$6 zC6gqJ1V4wAiBQjuu6)jd5(--ZLnN<3`e}9Z+FM9Uq(e|iAbhldDk85o1ntY%d((2bAngcr~n8!b$b6 zjMtg0%Iw?r$;<`)0jb>VaH{S3FO_@dkNToVRLZ z=i1b2TUa__kzxPeM|>V6MqWwq{IGI!zt0dAtJbF#VuhFI9U*s;m$>YWJrT3lWndV8 z*JsLwh*b8?N#_QixW09r@o}?M&9JrT(Y6GK9bbEI_!_%Bs8EMm#E!VWP7dT>`;}5j zZ)C>e%Q|v6lYd`@EYR#fgYWwcx>l4RJ_pHOKq!`k5CF3TZ}ZC}um)=%!~xiafub<) z^~6m(9WusX1p2>dt5ItT``XFVI~sbT%}Um32y?nB{+6K2h>=BVeEBJz)MSCeH!j|^ z#UJY~JX&%vstJYG!_Zz9>4zPxE(|)D1?I31F>gT);sDe~>=qq|eIij7TCzseJIwQd z`OHk1U>!Uk`skS~v~E&kh-m0Sh=rUz48)PJ5HhQsFC?nKfk(uwrs|q(XQAnfoGcY$ z-raKT<71A{m(O>a6-I}`>=?dd_vG}J?6kLWX!^l)L|?;++YWmo?n4tw9cxh51Ujso zs&=f&I<@6GS5uln5#&n_WE*1Dn?ATNFG*aLJz-!QeevuhHj_H#W`|v(V8kE62b%6a zvr*aDo7j^Y3}u2US)y~itI4W46}4*}$7_-j>&A$`uF2g$sAps_iq#yMHU!gI6Z5Sf zCzVl`Lh9exb$D{xaO#D;RIYYqWm22hR>eR_j0;B$tXR#-fij4J+Uq>}PbNhxFWTYm zB(yYidto#vgq)zZzkuV}Cn>egN0O{77Pmy8R*lPs}TDCl7#EvWwoz)bFL__iqajl=cCD z0PSyOfG{sO%*-p-eC1$^-MAzwV$Bt(2(}kcF}>}Kv$-Bn;ZF@T=Hk`&ym9e6C78Ij z{EXu_r$2X>?uLYKNl^6O5DCQRL1C#bfa33dnNmjGN_l8w-?4Sm?q6N}k9ka-tT_7& za1|xdG}J$mY8>clT@n-YCaXY&c7b>9eDi%WY1;xiB zfDaX&8FLNj3z|y+Pe;fk@Z@>nKhOb7!G)L{msTJy#4iOG=Cm{Fgs5zSlbIo5Apg4$ zNO{H53dH7+RA6OJgA7hzZOO!#kUP;EuXR`7^~ro)2~?PgzKE2O7SaQ6p803HUSscA z5-3$U&Eo3g&%PU#MXIEMtu33A)2=V(cgzEY*uYd@{G@;lu-8_F4Z#GV`UFf6uuhVu z)qw+DU0Dpf8i1gY1+}pA`a=S2^IJp*=NSh${TeC~P?wc@1b?JRVDQJwS05X$_q1fO zpgs;%U-;KD?eR@g@N4m5!}?e5y)3Qqogbx@VTVEiTH|Ze?*F>@MmZMXY<-7$mHI=w zMR2l$=4EeMQV2&TlaTTp7)YYVmpFFRZ3<_bbd5XQf21Uhiy9i?9C1 z!9epAsg7;i?^{|wTWs56P*aPqAzFBW7~ew1#Nub=J3oudt0UTVpS@Q%L`!MKZA3K> zgcrN7Lv>;?DZPDbF=>+dBzdZHDWB(pQ$x#L;uRb}^rU+YscO&)zr>w>nSbyZcHm}S!zO%ofUSVb#$qu#Ho7q;iZ?lSN z?z#1msup9;YlVcJmNBvxq{vR4+1;=%(|X-HUKub(WeUII5zkj8s7Ee&QY>c^Ihz$9 z3LCcOUw`yIn+7wTX!mVV$B0wgv*G@sR-bERqOCbAMhwr&Yt-6E{RX#cxJPSfc)0tV zN6Jd#frebORu|@Dl18N8w&&e3Th)#W-~B|7#ZYaq7;dWDiJr|$elAvN`gzO+s`Uk) zs4oG(K@I7BUJXwaDM=-+CCvO;DLK@p5<6{0lu(nU))}6?ILoomG8VwXIROjHY%}ro z%?tOqWQ*&I*K8@I06(PLQ83y;u@I|$ffa&2azzL3py_hM1sz(^u$^r)mpyDJKT=`t z5Du|8@Y{?-zOuCh8)VCgF9auN2@4fT zqZjnXGfk< zUT#Y@c*5U!(A&tuWx^m-b)%Y5*|u#uav^2ZSFPXI6>sLXI*yU-Gs#WW>l0@VS!5c^ ztpmr8S}bjoenxFnDC=|A>}pu=t@=dn-me5VC&q#%LrYk1w0MKb&Unr=Gg#kV_3_XA z@OIPw`~wpomOHf!(}!-p&)QWzGPw1lO z)5%Ept{>jb*S3fmyKVP6&@Co=$L@>2Kaqda$7$`ok@aJpSSbtEb#z4=RC3vp^}7l2ha+G71QO)V2+*0cNLRxsfV z&*gfWF1|h&mxZ;lqQvaqF!zC->H==X3DFE#suVWq!n~Qa7(B*6Ru9{b9zUH8FE?{+ zi~15X$0B6xj2=>zmdhLGBi7H48`D?8xG~HMJS3F+4}BJV`c}d)N!o#k*9!*Ns<;_p znU}>9w-c6h8SHS^!^4Zg=X`*<8TL;B8fy%un836v5xL-@5D*53XHsiFunAHR#Kfld zB)*|m3};%(=~%pHjb=At4X1;0r&`EfFcYQ&43bpWimhVw*29;#?F**Np$~0=9|u2~ z;Ggb2Zl!xaAXgJH)c19U%5X0Z((%b2}6EN%kRp{T^COQwbP>+LN6Z+|B5*+-F+QNiP z74krnNKy4yXa#V%NL-uV7{Yr%3J?PYlN0VAi1x$K3>b3{BdF&68hT$;jH`n0(c6mV za0*vSkp5ae!?vEdcW~rn>o@-$=H4?-MFz&+=YRTf)x_@1&PZcmUZn(_>gT@DYcXw{ zfqD04gl(L}(dcpnAARCx9*K=|jX2xe6NRz&>ks$ua5%3Y=~yt|s%=9!djDB0`N(HC zb-O2{yE6NR)YWFh^@n|RNVXkqLOp%kZ%Er`nmST;m4@N$vBvhck!xmV!X}_N?|Aq#s!NYbdpYa{`A;aUn) z2N0r3q}81ORPY!}`Nzd1UqL)gk_+PuD5bKR2@5=fBj)r_D2oT$`U#1nH^78|xl^wl zFpWJ7yze%@uEUbeKVb#R6E_>M4?6wD4koAx+T!Y|i_C0^0CQutFKLo0RNCgO*8a4i z$JK5z#DCiw%ce}4czCrzA2NS4Vz_Fz_Y#~(vt|xJ2Xo{s( z49^Uhf+rT5f@uU^STiLKds_jT)K~>GbKJ_snGDxnT?qS)401&@ld~ zhxWfXWRXHVVO()xVEXPzjnbLS>8;+em{iHtPv`%eRjHEx!$b8``hNMHpF%8?%vo$C zukmF2!Pka!?K{Gq=^jnQ8qjbY#){gYGVagr8{2e`cTZNFXzW`TZeC|mBCM$KWCmNe zK4etO?Q(;fshZAZ+sqsu8NRJfJGNbg6{okNClM!B^``6EY+|MUUr-NZI0DrMu~@~) zVI&8!ZGJpEi*CnjGjVs!6GTbns;iAxOU+OqN7^^~J#+C|t>kPvm0j8W- zL$Ee34K&ZFc{lcasDb3_2EV@9?U1f7^`8m%TaaDP=pnChoOHdhg!_j?LP#)0NNt%o zKue)om?Xy`B3}WSRI+eP<{<+DD27_#Z!S1D021;(J@upkDiCZVz**=;GoL49lOdwoO0Ef)v3Hm6!A05uZCdm2WY)_?KI zV=s@}WSn@=`ksL;?~B%X#_Ta$U|qcgY6o%%%SSDPx_f-4Y5no>mVBt(v8=x4|4g=b zT@|@`KpV4FYsCs((ymaY6OLSB=-gxeBRO$>%gFjj#|E2HUFXe>ckO=CtdTqPDg__i z(v<77^7s>Hs)OSP)#~#&CXqB)c!m4NT`Z4PLk$;qFYreJGYx1I{WV~QSWA_dp`l^A z4Xq0?v(TNcM2^(91aQ`uuNqZghm+PXiJiQxViAJAsi%A`*V3uS^ZuLQRpWP70kO7% zA1HX$v+tM&VoG^n-a31wRnVNyc^=;Y_-S7RKcImN$9NI^z!g?T9#e^)rS;CY=gL?} zDNiMOE~R#E;sbC_)jxipjjE@eg>k^NHE z#$&N3paE(!cJ_aOmuw$y7sVk?(nA=JvefhdQ^TZUNz9!iwucZ}BN~)wV|rN=^$JBd z^=VMkP-qXG#`H!9%aSY2n%`F#MJ5x=Bs!%*X4IO4ezUGm4dZZAfvS3yoi}MXpGIbm zv_(~D7`VWTbH++%SLt!wc0de0&H8}JBQ`T_54EoT{(P^bd#%Sst0b|Z&sl&soKhfz_c#*L+}w4N6dD2q_1tP+F9FWeQaZuGkI0Z1D#*mkl56rQt7LW zsr1N$=k}cR$+ND%ba$`o9-R89343g5WR6Oidu5ObIHe}N*GP(kc(dPG<tx{mrSHv3MQEZ{WIJ+GF1Obq?; z)6ho^{qYb}hdMv9?}Jd2)((|G5G^R|dS>BtIs#|dcXOCP0s3r6LAoit5*QS>UJP7r zi)?*HA+0&3l&Qol9d?NotVF*A5(>L7!TLqEpY3V~YB|ghre_JX-AFG92H0?jvwfd= zj;SSFr7SVA$y5y3O)!*zEf!uu7#X&ijNK~$piq)VMKOl~dK!vG2Fd&gR_I*f2eb%{ zz>(5E=)s3vAZN^=)5B@oWN~&;s!pm-|&z0?0#wbkOBv+5go?% zIyvL1UDr1g^QMLz9}PFfyt!lD&yL8Ul}G6^+*CQ-NEMaba;=yvQw|DjcXuE5xVqD} z_2zV6YtvLJC6k5S28CFvWVnc2=66Tk8b>tR6xWVe0u%mZdTUozh(S_=82n9U_W9Wq z;O1V?6x*RTdvV4nimo7Y;;>bMw`v=4)N*n#m5P!H|7@B5rp$<9DywYuNz z8}imBrrY`_+jq4+>Jc*o4i>uiWx<tt2QHp|FtD zO$#QGaG!!dLcRgog*YhC0GWXXvXDnGGoXkzT%R$KgH$j=h=xhJu$g>;dkHeiK-{s= ze-Q^;jSV%bhY$2M7)Lhdjz50W)rWOBoH5CDnDx5Uwwc=FjhOk?yQUsWsy>nb$%ei@ zYju6XiX{qJPo&>5Vd8_G_j+<8H@{0+XBBH@3Mg|8O1Itj)=0VKjt5=pgbnLs$3EBf z#9mKpYs<~ruCpGcR&2J~qS>3eLsjAjH>38e^$pYAgX>JZI$o>5yjV6Gw#u9nHfwX^ zKBJiP#n>i{9V~*Ule_G1{kFo!XGIe5Q@Zdb$oZuqBMc>dFoOV!m0;>XD+av{W(d(D zHHg#*2$2(FzK|;&-lZ>uM9k0*xJZ?%XFM%t#Ny^aYuYR}*P80cD}c0_QK_}Yx*RKq z$I@q7+*M!euL?{r%jFn4f*>jRtLVj$TE9Kd>nLzP;q~y@DhS(fD1A64iY^>V)vS(MJ`oIHE7#? zj)E&h`5v*p6fEwx)|Oi|rC{j^E(Mk<%VJ<*S%pN4Tz1q@e)>T7h&&Jr`6}L8zzdmy za=Ca}q?+rp0E6t6MO~}F3{owq=|Upc>@!ryoPgV<6fw~DDzs5wTG3>ouTqGltWMp` zDVJpID)mmrCb6n)il8xk2{kjk|3=Lzx!WK&D3;MS2}_B#nbR&~Hyb2FrcOsz*IPs(=?-bO+)S}xT$8TZmAcwK<__H;WU#r4BGFzsEVOYs0;K=sgg-$ z_^f}wyUN$9$Qq1`X_sJ4T9MY7D^yHRLBBXP@<^*hjB3{%RyLt`mnE>UK7I zTdL3p7wze6pV|}5T}1UNpTl$4`y##`h`e&S7DHp}$%eE&aO4v|I-3|UTYC>Y-E}m! z?`&skNX|(tertE_-fSe;hR_YW2igshQyXs^J$D;!tn337X5M@P{RG&$A$h!#nK$Gn zCw{UpvuAPPEH^HuVtNl6S#<4}njBL;$mj5abrF0p|4Z?)`%2@3ri<4Y4X;Cvb#3>) zisX(9Gmap4oCb!|740`|$tc-ySnYD#TQS!N-3N=g)Mi$UGrFC&;TFy~;fi|)&N%Uo zNsOy(l*d}1aV%aqabj&Z`K3iTpo(*?Y_R9RfV`43Ub*LsN@ukwxMShsR{@IG7g-tc z)8Cr?B=aW4$W??b8xfriT6_)lKcQd{E*DIaD!7?*Znhb#5-~wV7fE}X zR*R1wkIB;DHrX6{tg@NZtH8$395JoVp|ffAo6S14-s~|D-@FtX2T85j6~)Gq^%QH0 zkoPQAXR)?G`SxNp7)6{kQJlbxhReW-p8EESRGq96EZCxGXZ^1g$vC!_U1 zuR*XfM=MfQ26A4g&ffdn?q z+|`}twZ?GowcY*!1@I=@(iXKob(`O{D_1SY9mj4P7(QRWqpLR3Y*p$qx7?jGip5I# z7FnV+auMG?y=C8tXC^SmNj00+8%=}T&VFo%b*5+2fremsW-rQqd3Sq49C&>6{+?LQ z8avaPoZwWNDr}pQKXS{A(+Tdzu1EJ@_gpHV@O<)DyGtipnR z$pFC@h(j1-Uc{kb*O1=EIfwyKbs;}Tg$Hh#fUshyy$~fN>;Z)En2e}{I7lVU0`py6 zcxOsIlIStjOG)9hXWN(R9)9+k@X(pZk#Sde^RcF@Ti#vk@QgK>te<{xz~|=;O)k&T z(P*o}hftj3uDOkbZC z`yLxvx4zY88n7$R_SN_BoJ0}To1(d+33YGNqmSOQ!RaiqeHb44) zjqa^CBobe8XZN}~=CfrmWC}AYe+Ttwg z0if?RYQJ4FA{4!&n0;^ABvDqRoQ<*>h@;QY`sp*ENvIZ}UK(7j5}qYTosdYJ9g9Z_p^6F5N_H z;^v9^h^N*XSI05Z9SToOcgW;Y#!#C~-}Z~?>An3bWwS<{h?(r^&4?Y{d+d>0d%J4` zH8HbAt~I#)rn$1&WrMCL5tGViUVAy1k_3y<0TvB+4PYrR3v{S8)J$IzJ z#v3t*l_7k}$SaebE>~4btJ_vr*UzZZYLzR^t8%Dr`>D;;Gs&RUt#*lXt~9bjTM0IH8GN3`cs=AQu98jIRM|0mN64>!R?3KFyWGu+Lyx)n z-TErsz_BjgCNWvuI9n@ zOvB3Mblt>0?Sxw=F-~<(RO&pRxuEkd8cLui7ZhMwb>lY*I1Ju$6O_IvBn)Pz8}&K) z(t2<68N_3Y1?^f&`(6CToZf>f4^V_~#|xNz9=oW{+kP3Cyp+zXsDE57GMChQ*jQ#n zu8rpVWSMaYvO)Qu^_~4HWMHUo$Q6{05X!08WEhsd|vD@=IT2? z&W$RD8fzP;qDHA$3*W2HS(@%r-2QW)@U8q?`hfS~t>~*t(}R5*{hEXVk#9t9GhO^- zn!YB!X+HmVw2o^8^lwES-(2k#{l)WDH7l*;T3A-W+_s?j>fB#^e1Byf=aQvc7k^w{ zG=M*{SgF&CqJY$NHqaWa1mraPh&Eley3fRsR35ZoT%xLTAt_L? z{$_~+zf0A2R#Z?dT8XvN`pyql2mtVj3Fn^ZE$H(jC+*~ zdvfpc1bdZ?df-Yd!>9)_qG{mgyc<6#;^8Tike3Bh>V(-RlOi2{u>1Unlm>Xu)97Y& z9^wINcu$2l|M|JoPW|zBmAlsP*(vk~l!3kw_-yeufmx=s^aI)FK1^8=_m!V=Bx*o^ ziCi#~+z6kgMs#H&2)P!{?!cNwG7?C1HTtdSCENnG60EaeB|S-QQQT6Py^2Lwq3?=* zjl1AIdXY%CFsbmq1$lsMHG<#4N8~s>!FgB z@xNQ8HtBg;)EPP3=v49u>d7@ZU6W->+pR~`uq6%;%1kPr-EZJQ$!qpnsO_!>zC8^Bs{q>^S* z07z$35toT{>5$n|q^K4{A$1b6B=i+0qD@~wC|MlFS_BQNs?P1~@3vZ=JhJ=h^KRZ8 zXpeO7u|&7^UESC?_R8@mrc!;@P%>_m$&kFOx;lNZW!EcPzOvs@qvV6^oy{JT^L%G} zb~OLYvC--Eo~@0nQ$N};=7_ympMP^Obj^8v{&Oc=TLKbO?{@qpQ`aZ2jWWH)?ljfYhui%;)D>w)0ju^!9NovDSrVp z_4zpx3=`^&p)!R;11sqoIlf341C@kDd7*Tig(^>rDy>(xwe1Pk)|E3cdi!4VF|2#5 zOFKvwi!_Z`$6-me)iN_V74b**lo2iZ59I%NuAWCn`-15A#iu105$3HH=kp#WSpwn8 z2V`7gIxhgD2n}!)X@4Vp4w|-$h1KvwOhQ->-pN6mWXXKqxh0kkTBT!okKL5cJiabD zU<<{~QHGA?1tbhxWYrsf7_GSgV|kaJuj>5J@y@a0U{(ARB9yuDs&!94@?x$_?%mhg zFl^=(rf5hiR+4?U_1W#&%ynL_bE&zivHX8N-)9g;s?Ke+Fo$;>{|fA=EZCVsguNAm zSr2-TU1-F=NIphyui{a#xz<`0g52k}aJOD{N@UYKet z5pxpwwS#-YwTh^cm!pWSHZzm4InqsfCbz2*q4(4|TU%|T(cS+&eNLMpZ z^5-ZcmrLs+(&1;nT5`^2FXW#^Pg1-zfUgYApA2aIEY+?_vks&Q$1MxtbCVkpB3{Nt zZf-vbqK6@0Px5p1K=c>p=0X*sCKL+ut=atwy-Lp<->eHcS&t7+*A6&C}!>1OmA!A$=1E{-vp^3P_+{>z|@s1(3L^?bm`p=kaeUvR{gZCxpr z5JSDJ8F=7$*17TVHnCXq6Xq+zdM^5EY{35ywKuxid&M7v`2Pc<$KYBc4a}sSg64k; z_#t&wg_x3nDMQLczCmtM`VGR3H6QT@oItSIR6rhi8~jkXZVG+~O)UuS38|F?agd*` zE3{4v<<~^#%*hCSyhCaeOMD7N&M0*x4)}+v2Ay(y>wS;jb}XdD&>O&r6@wd{)v>Kxy9-SAI`Nu{>SeYnSuU!sb6Uk@XZvp8w&NNkL%_5KOZ&cO%wUA-xs z)#=wC(<_nbjzfNvC0(=kS8?UdDB%!?l-ktzvpa9u=59qY3DP`Ne@7tq(YDU<$eH}# zw`TMbX|Db1#(N*prd)%&Up@aBg-+tsFzmi>A@2134;_z1Mq=lx)hC<4q*J>M+A#6C z{(1I~xEKAeXq0d)6uG&;#sXS-II02x6DVnVLA9a~**{X`PWOsJlW&!f15Sc9BosSG z$c}Z_>n-lMpHmnV)y`NW9U|kM*)G*;vN{YMM8V!}G4QD9V(aWh9+hf?+$cB5^->LE z=$1vtk65`|sI2;L{uA?LU4SObJ%0PdT=y$L-SQr zI^Dp?HFutOfyL7isnv?vXh(w83>`Z>vLkqPBM-gf{m(vh_-H6;cW$26!K0zw&D}Gt zGY#AS{-u#XR>_BT?fK^hUg*5#6AhoN<`G2|{z%)#-tl<1+KLVh9qc2G$7+seH3^4Y zp1Er1Zw5Zq4ii(DAf6I3ajko2t=FB1J6*3^DO{dM*rV=~%pNx#= z|GEutE8>NjJ(~Y5+KYZ6sscZZFm}bBu$Rmc|Mw2Ma3#aGvt+iVH2>z}Bu#Q-7$Y{8}YPL#C#P{!TJ1@+2DuW&ibacL)`k3&@< zsi`J)EZ7HiETeF?h)R4Lbu8g|dA+R?mMuj=pvx*=$-w$_b##3twNbbKi7-@>IejNU zw6!FsdWCT`!<3TX7qLWU$F5rgES1RZZGq`aB?7rTJcY{E$&_H~mOoX+osP`G08`#q z`1(#D>y45kk}Hg?zbva70o%S%Z}(fk*3ep1+=U8qgYI`K$G3&B?^3}$MgP1!gx$Je zy`}YbcMz-RPgQR>uhQS?qNU%?-2(4u#nQhOZjVBJ9pqL>ecfguw+x;R@qQ?I%-gE3 zn-}Zame##i6k7hZH7ToWox4jBa2NhH){1@yGc2H1n)uOXa12!_;R`*iefe=hZ{Pik zI467E$RdRTE5v%pf52y$_}pha!e>~Heg^$B{m@Ka94Y%0!2Pm6SBq;!FXA7Fw2*Hh z#m^9ZqK+R;=ZyPCBMdKdC#6bYv+>~CNU~Fjq^vCFmRfv}_(7s4u?s2i*F`#b0pSlw z<&g~s9RXjGCZwqB5ytPXZ2U!{k=eZHuS73EjR;KZr9VUX5#%TQRZE!VLp3ZogPbF1 zyf&6oVwo!Hky*V~FW6%-Aj1m5^J_%jk`;jGTF6HgmQ?)4mwjW^3}2m)D!p2{=gzWM zu)I_UEKen@uIvT1{m5ExrE3iqS4);Tw^}-rq(T6<5&?kQ#3kE^Q!(re)VrHJ{k_&CgfRvhjEu)H2Bkk4+ss3q zxxyZg%G(T_4(X>2n(?j?HN-@9G6v`i)C^`Z<`q&Y-@aceN37DF$x0cH(Xi~{!#6c3 z-5ku449H&vna)2K^dhb7xkyzw49lH+$igFL$(rhgNX2rG8*CX#>A3%2+?N2xbya7- z`_|d_O(TtFG^3f(zRar4S}j?YWyzN0J&7aBBUzR#*;?$_Sx8dC60(ql5JDgcq=6)C z2`x?7LKdKf1}KHUKtt0)DbVu&{6K)RMf$(<-e`>-o0Pxx$n)-d^WJ^;p6#A{?z!jK z1m+xRDx7p^EiXy+h&lrw7%qP8F4RHUrp_4Thq_j}GIInG6<`&1m=OGuVb#ORf0cij z*1t$&HaeoAAsd-)gaw~&^4tm-1xtC(jRn3L9*K*2QX zvhQelM;zjRtQ1}fJ3?WHXrX)|$T;a+Il6U)e#$_}aWdit{Di-Ye>-R7N)gkn4Lg6~ ze;=jf3j`}n)S_5?Xk$qhfeUk--mG1AA&<)1O@cQ?yCYz2hutrg;mGz(Va1Z+)e?W# z-o|KrPiskh=@uanl#hm%_J>&3UShDO+M*+^p|JNP?ud=FhGR3PY9vOB`D!c{5AzOI z$6B4G&kk0_+MLnHTi)6bZ=b7pMX?(md1aivXi|!*8e{Eqm91NszLNiuO|hPet+$jH zd21_PdFuA5kv>n)?NfVt3b5B5ywc0fv){0va4uNrILbZ@S_c)A5e`I+HC;LD&6`2A z>rfUH`Kyvrcut9opMuYtxBW?Gw$C;=4>%FZ%@hzImbca%QmYZLYOMMtdUD zHtRUcgT`3;iQ+9U-X`X=!%(Hk!B;0L_2B*zIvnV~n)@SqMgWC`=o!iY-XF;Z4uXboE=iI;4N zOmSDDsjR=ew$r2VcGJFWL9nvaXwV;$?fkfibr!{I<*zO%-m%x^HOsPO9Exs@7)+iA zC9pmN++Suv{_89Vm!y7tHPoyMP7% zqELB3;8a7Tg8f_eprB*k-Sg8WXDgkx30agA;qsub;Y>V?5Hfh@@*lWgu(SLmSAY{5 zCh|sH^eav;#2PC`Rd&cHi-lj@>kS!&e>pJZtye@ufOXfM;g3o>QE-3jlu@$&%O1h+ zfakC+8-%P9(3dKH7UQgs3jvmZp4wtsrUOo0alj92nHd>oZ#Z2gzh>N%D5<^9&=c(o z7WqnDTOX+NUKwRil#FaI4R#*%`YSt5Bm?nmO~bF!-Kn0AIN)XF{+$Kj*F$uoxwjD0 zs!LdI;0R^a2E8h}+^%oEHoVSV3|>4}hGFYjB5$ z4mtufW0?Jhqrk*M^Fdv){cc0ny@S-HJD(+*M;;3ozX;M8+iQv@~_!8 zgr)I=;_*>kfzkeRa&D*VpwH*SD1=T6IQeQ9x(!hwBZ4wfwiN1#lr> zNJLRp2^74dMs=cw5HVpzlNMh=$|@zJNv!2e$2C2*7QrkPTC)f24!Z%HhLq~d?D}Yh zWZ+xc3PNmqXT2fWoQo<($>Pc-Y;H+38YOJqs!{ZHGBfpgNM<0GUkjU3`Sv_A1DV^P z#av8iSS4O?Zj>5qWV6)ZvCyg8C^l5NVPM_tYLymMxj`6RlN%Qj8wg#vDm8{vn}r6O zhS1Q-t3so!c$3h8%mCbj>>7Hnisk>R%=pP`vH0UZ5XUY;i?i zWM7}Wc=E#Hg5<^W|78I-r^4z_Auq0fZCG(_%Rk`X$Nw7o9nE#X+$#C2f?N%uqkiSn zMI)W6CLgu1J6S|Rqv;I)zUoq=9JRMMFV#FP|x}`~98GmtFOSoerD*>*sQoa9kUcAfU+24xAk0$8CII zsIsg?@CU-%B|-F=j4rROV~gI*jDkTlF159|CEfG2-j+_$*6a+k115IPXgqf4urge4 zzt!ok*t2)%uvA*=JK(c@Nwk`*MhG?8^XFcR?NJM5OZzo+-Vd@XDI$r46?K9Ngb6Jy z7V~ZbSs0o<#uNw>FAk)$LHMAJw9Cok1)5n|k*r6w`fXj)mDNRdGmF}{_|aBxoo}mQ zN4WJw>)v=IQWmkAk+@B$@*sMq4lp`aR}${7Zw@+{19K9KXfAg0hX$Lno+DjJ~V?c5~p!xEA{ zZypksUc9)J1`27M;O~cyXoF8*Kh~2GGJhky;(x^GaWNrr9yon+GX%~v;7I4yMP3b< z@I|}4boqq^5)b+Cdu)52LB5)DXaNe$DJt=j)}{K6fR-W7wRQ7++CNeTA1yUDU9rEn zyfN4n9Byi?Hx@?h?H$F@c;#S0BfnQv+;`;eINKAjHAiv-nWkW{ePHKsd3vcYJ>GbH zvYPY-o*P{LHE(9mz}5t9AMw7@a6^E=@j9Vx8(GP?&dRoK^hSMI0h?QT7O3MUP}wg2##j5_^5lOD_FHkk{h7-Z@Egrr;*F2?M6G56>#cI1 z^_>gN`QBW>53jo4+8j3c-!_|G`92?l`|T@F;2kn_rKi}FnD=ttY`jE?dzGkH{@v%< zHNl_U_dQk=lfV1DO5MkwlPXnR2&>p%W5>B4(tJ7!t4BJU^s?jZ6^6gRWAJ@IB6_ZS z`4#?3zLET+GbHXX%Ts4NUS5bpdUQJmeC80g)};%X-u(1mC*>~JZ3cIT&vvcZ#@<%P zo0fjL^xeM~(?)2z9o!%IyV-9rcPkpnJoDAiWcGr)e+l^ba<-(k^h9q&n% zHviU9e1F{GdZQIHyNUJ^lgQt$ z)yb@3SHw1Cl65S%EpG8Kw)ByF&4jy2jGHg>9|i76J;ykxx#l3`UB&?jQ9cMzD3NA1 z#(u%r+ta$B-X!_=+t~{)qd6tp+8&(>lroayWdh_6NhpARBVO!BTwk z+fSvZK2iB_;W^NT0ny`&*>~B?usT*?6zoSXo>}-6T#tMNZ-Z3}@(lJL6<(N?;q}lf z&tZIOiW=Oy*9ahLkbr54nT2Lusp3SLJ+Jr4-T zH>U{riElBW$asNWi6dfrGm#zT`Bv0TzDeW*`x$;tjaPp;GR?fU4=jL=DP<~-%>_`G zXb_>9GJvi*_>d$0dHiF!6|EKQ1)O+m#b0pL&wzqEt*W*WP6+^?};-6gv zSY37e@bjaq$joxce^xGYyzYS`{FMUgvdvsT7A<5#{GQANhGfrfbgHn~5>ov|>o>y!BnXbA7v?(3-a6cjjpMz>&)g#GVh9G2_2{t8;2 zvRgVfqs2Np<#9=lU_q6u3TANqxA_Vzb?+O{V?~$UD2g0r0tL$*{9gXYLW!^_{Hquc zPl|699}zz(J}-V*{F?ap;y1-_iQfS-6HvW^LK1T(GKss3`J@Zu8yJ~**&XDu?b#g; zF#H~15w|PijkrlWR$Q?FZikNRM(lof#3ct1u!p`Xp>JSWFqw)+uw=ccg|XX*9;AxWjQb*aeS8WH%}x-4ba%pq1kdXj23Z4ncms#lvE{h zRE6Ua>QyX*md7J<42_{}ac(?>1=}!I_K}_kfKI{?4-jX(Sjs}h#R+}ktpDH6uiI? zHAMC_Lt^j3U;<`~uoWkOjjj;~svIu^(Fj4doq3)XF*2VBEx62HdL zAIyzXnRL>V#Uvg$@g&n3FK8u!#rkYa0Y%_d;)=K+o3@JrO>_zzC=+ zmBD6u)$bz>3o<%GWamj{5f~S!&!lni;BqDnZ344%m}u!X=#1(V5E^zifmPmgA_gpF zRp59%nIxurgcY<;1`|YN!YsPz0)7bS0EQPZLIXi(Xhb*@M>8_9G*}>kLo(|nA|@~@ zL<|vk9Qc*pK$VQ9gWls1`jN1kx}tv2l{mD0;5-9xpqVPk#nXulp$T}zw+rM+O#)`Y zy!dkgGzjekf#gwuP9hY-QVMN#;~m(iOD%MRaDkXGNIMCl2UHR%FFKdifRx277Yt22 z0#gR@5PAy4%P}+*ciOx&Nwx9 zz&x%JfhFCwV9X5qm8C9gIUyo$eD@YD0NU%(aGFjL$ z>qQyoH2-CiBx4E<4fL>3Bg8!w%2Os9XwwrX00@U{crv%I1KK`ec}CkOvhe z0|5&kdPxRoTs$W4=q`gN91~=NVn8}d9{(dc#SU!yP>IPQ8r*^aD}YYsC3q7Mm_$8l zSD&@X7?*X_Tak}T)F$-KCyI2A{CGGKVI%-d34&-B&znU(3<;`*LY9RCc%NBk5(U^d zbbf-Z6W~`AK}XLc6(0UjD;kNa&{*|^(8L2FqF@IYB&HM5F1!s*!ZjW8VTlTwpmT`? zX7pK>jX;fzgl#~NWUj$lpI0{6WUQXZohAXbnc*jZ*U1J^Ml4CdMXgG}Ly{e@2Y`WZ zGXWVBcOH3iboi$3NXJCff@kO^GKIh_!{blHNDTjTv!XMjyFdtjR%E^61zmxr5V2Cg z(*%6{p_4i#0%U&*@76KB4d?**@yPm(ckw1bk-;a#fEyLb3Q}S0ej|P&n4)F_C=i{H zfF;yO`PS$@>IOr~Tl544bVZc0X?Up(^@F@rSl|ds5scJlJcafHfCeiYLhKP4<{#Kc z#gM%80{8`GC>lU7;KZ{i6Tf#OWA%*xE;dl>L=h1%36p9Qi1e^9Co5)bl4cIkW8^K> zZY#QjCOQeU9q7KSlTi~=Tk!-Q01JOIy^)%PzF%tr$-qIagcptICCJi z`>D@3N~l>B@GHZHVIp#P&VVck=D48tRn*aq#CIwU6JhF!Upyj+kX|aoN+!d*&5bwU z@c>mogeyu$heOl@6FMS0!WMlIh2WiL3CIBLl60`3l}PDF2m>t|aEq*<4nWN4#FM~3 zaiy8=MI8cg2DZjq&<~s&)w*rK0;=)|yetFcC=wCX5gu?4h*~Cu@)mrdbHs`gL>PV~ zD;;&3V2lR=Av~*r2v6Y$1tw&`6X2%C8$}y%j(0f}xXBRV<7O1haX~g2jBXdA`k4d| z7#oBI=L0e>Lh^yNzz_lwBcoepUU0}@Gd;at_T#;>k$}Pn0QI2N=|g70ARdI|;GOtE zPylZO;DcL40iv0@B!N9qhe;=kOA8_iVYC)NfI|>b5&EGLHDn|S4~?lvAj8xNvIFW= zBj`V(k0|20jsy(}H5ER%LSO`&$iyH(bb{_Ax`TXyJb|1d9s=C3vsgi{HJ#85zyTm= z8sQqaBo3kaP%q>j@Cd>pWT5Rd91y?by~wVHOQ0M9KvqOBxj<5k2nfrTKs#|4-j~OK z@Pri;2MPCpkU(?1tc&6Tyw+r!8AQyOk)SDv&!H(8Qh+*%y&G`BI}QLVyja8Y?`7-} zzLhQAuri0C7?2J5JUMGKu-BM9uFYZAZMu1V^OyD8kN(Kn3wsFSqO8(wu*xQcXxHXr zk0IV5MNzoq`PllI@aksH^?kY2DRCw3TwLqICC!W3A6B;|W4&u}`5s2Oo0C{Qxmf0A zsLL`<^Rrmzqy>o0$#yrUYA(Me0ofoNdbd-m#-M$X^vp9a)L|eM53-7@klb6HyDyuU z|D8>vZA}+%8&n%=8=Ov6*Fw+{bapiHpEl(o-_XS7Osb--qA+Gu9OkOA1JPa&B_zK{ zOHX%p`r}X}!0;9O8fLZD3W&4w9r3q9C3dIZsz#r}I11r6R=mI{=9~WJKXpH9+#Gz=% zdhae+2@!_^WCZJvwy=gWtnq*zMdd}{a3V3xOgAiN#6fhl(5PaOo>tvUv9PPe5NRoY zKh*(0B8KpW%`NA+% znaMX5Ra(63)-v?&?(V{%&lzeF56y}eT?8XxpR{v-*-!PS@1=XIoxV^fBJ?75!GA0- z@ec@HT3%--91=18r#UBeI`3c$08vOp6*lBN3X4Jp6LWPH2!sxq0bsyDD3E&;E%gwn zv}hj9W(0hZk_OYz1MS`K*fnr+=<4EFD6GYj+8lFg&}*>8Lm7m@DdTI)>N=x?Er*}J zdRGA=Nm(NdaqLUjLtjWWv~M3DZK;Yk?8udAL8gi~N29viqqhp)ty`u7jC~-ME*|T9 zAbs7?PAp1mv6TK=NMPSaD~(W5b+M1=fE-a9lj5b`FLoKm!Yg zk+6X1@Nsujd{?1t*L%zbK3m|5I@VNS@*3-_hnn1t5%=K!nytQaXGzmT2NUMnims}F z*%Cg=9&wm6FLvGgaG7`KL_3gN?W^)zirV9{d?gfEb4S(G5xe4uKk?3;MTUSa(lq|n zZU;h73}qrV|1G>Jlv>)|_+^#OiQ25hSq)PpLaxAw*Ady%QtXG0D~rV*dvUI5wA|sY+!alRd%Z*Nv=udm{q_!D_Ri`i zXL)RQv?^}Gt&&`Atqdd^`y&Ul6Lp?KdrQ_9`Jk)2BIR?{qHTzYvh)J~9?(|;dnJ%% zQQH%>j$Y6vigiLHhlY?5KQAdM_7hCYTFQ0kB!mv)VNfFEDohj|+uI`RNXBjEjXF82 zH{EpE;*lD!A>Q+)4;F;_Lyp*$Y?(KNYqB@rKKIYfp(QEfhbq*yJtEnbUbtrXhx^x& zOM%sCk`;ZF{c`Nupv9hUKXp@U_2trz%Gvk6L9Ea#h4Im)?+4$LYkuYD@4Br$W6Ykp z`(V+2jgNk-^3e{8rFj89(%3>1K-wC!>VHjmLElqET3E5j#Bm>>!e0_QC7fnoZMJ;6 zK$fm{)$Ua+N>^1ui__q$HiqkZ)o3`AVn?AYdaL>_k+UwZDC%ggjW+Y&?kalRqPN~0 zbmW8MRCm7709Eo!;x$EzK@RP@YcqrK%io5d>eu;KxH=ly^PPg(L~){r8tGvn7_0Qa zbbg(E4F*n-EG-l(nO~@lSBeXj>vFm3CVR}ec>MuBTDxO?KdXH$2mth4x!yXw=Zf3@ z(cwn(th~rAzx3p8pAvIrzj{|6zq7e>b4S?6`x*>W_dow;!rO~z@3Z_D5m&8`tk5d) zAucVEVxAB|a3uVw`D#=1nn<>Z?plcl1-wCT@@l&t6v%`J!v2=KJHnUm2)n8z%SfL| zGLwzfW*C*#d=S*H^>Y#8IaF@MJ1sF_#_R5>Ma5e=$;6Ir>ay z`(nTtHCbcLN>Qz|&d5i?6PVE681?(Y4gQ4DZuWT!XGZvaQ0+zbt9NYOUl9K6^ks<` z(6=ALm+(HJ1->STwRb_9yp+BoOjy3F7UaT+gw-LD#Qgc`G`msk?>sqtu0waIR|Uns z)J9OGqXdd#mmoyC3d<%VR;S!%HM_*?ILKRY5q*p;IThxTi zV}*wjf&F2rCS!|k@opmFBRf{c2%ZZgCdIw*OD2tvcKU2^b68agfNxD;!4M6a)o1~N zDl=;{ZuVPf)rNV`nY7(oj;L=~rmDTC=Pfsy%)#AfQ=hG^tla2}kRQDVnCEzjugYZ% zBjxECPH;#-_>tZI6h*5QA$Pcn0BW4m7<6Ln1LcwIt!~j#=M7p|zXSV=L{r>TYL2nOtNb_kkzCqtu^3GF*c4vV<)*PIUDeo#_Rugs~t3H=Yd>Xz4ohzE97KMtIpa}u%G(;c(?#{3P ztx^u@ORLHx8zR+lUrT4{E;s3m1x>k{Sud%7ig|;^XpZEmXp^$YA0XWjMgXx~RSC^O zlcwdZ(+G8*^Xh}>N7?eYuv@T_E<~yu+LaG~4eBP4)AlZEEwDoqFh?oLMVzbJ1c`A7 zN9e=qbE<|Y#6ExL587J&k$alEf_phPxEfh%iw9IHLiK9#C@J99tygS#h&w;e3D zS6?|(QI%r6!Pay`!{IA-Jl@#DPu%(WJ8r$Uzw1!gZYkcDogTEB%)NJ4ZuOfSrB@8) z{)~CP@P)C@Wy|Y}diD>-%w#aCtQl$Tp51vRe44nx@`w1B1uy*Va@+}SZYAc5wo7f} zIE#J87?^0=CDyTNCZH)jV-){;=6EEpq!7MnP%rT*PfTj+`OLa3#8)dkD#rE%W+%$ex+ z{BXzg9;avW)aCd4#UZGjq+nxT8AdsK3 zFV?mZ94*EBQU`PUTn3W`x~aV|Tv1eVE_Es-^R7plx|?lls;b)G-wR{t@1&ZiBi~=J zz@{F9A=HV&hR}rp&sYBCcU^9pV}S7`3$#O?}(*s!j?eLZFuLIO-%)@n{I#0;Mmf{2F0h{dH8&(1L>Ntq&0GYR&!3MaU;y-Ti%)lrK zmLgcK*#$4bGb6svEV$yOkttkrTp$mU^SNmx3(oKMP<41+Odi!`W3XV=kwNn?S#f;G z`)u_3U+w2_2s~tv>J{5PttcagP6lr$|#`w>+k$;C=$FN ztj|fO`3-#o-YdH|^*`?!^he{J#u^wUGbIoJQl$4z#GHDIbt{%Tpnj=1I0783&x2Ekb$ATgst0!% z9OM0;KnnjmBe=?}m<;0G;4xwQe?MM?-AEFNd5A#VDX%1CT92DQeIgt!FOd;3GIh|p z&ceS|olC2{tNc&kK{!O*ZvP*Eem>6Xcm7)v5b>O8`F`nl;Dg(__pa%>EBZOuVa2NC zaK_@Qc}dlBHRbJf#VZwH4ne)72}AX#A{HY^QN~O022D41s#-H`Ysck;IIU^KWyLi$ z;SD+`r-a<+X~9l z^##1nWazHwEgJGD(au{#P3i9DZLStaG6)BWNU5Q?JurK;G|uAXorm6HvmQH@SE6%c zy@i3Avbb;Ph@@%Gd&*ij>WVDGtYU2Z^Ii8H4Yjszd4s*{nvmHpc?9=jJ4VyA z3;5t_v$hMm=JI{2Gi#A(gm3QkwuZK7iQ6l0-L~f9N>_{On_ulJs(S3|suD_xdCiYk zE{7j)t#6|ruh&LyympJNI#y%6aYd1$D~%K9aqQ(y2hE+n*Y@@0Ip6ZH*dvJFV5PWJ z>h3*tqKX|5Jh=y|bV z$m{)`=C%V)gUuWC+jy&y83$V;{*vZ!BvYcdHpS95tEe<&yE+sB?qaTbb9yEoG>DQt zSf;@3psv^I3zyV!Gk&eEs@4VrV%Wp0*D(p>>-CHukcRD14?N0cK2&YY=QDPt0 zVJX1$aarf+y5U@b5k3@x;=Hb8d$vvxkvLA(HQ4f#%cbmT^gj+OD$t+E(zbboyg^54 zD?R)?*I)t6#Ig7PoBn9|ks{H)w{m=@tE;Nv#673&vgnJAd^nu0Xfnvk?d*_VcJtLS z;d9khm7RY!Xj0((^w>zS#1?@YhU<5#jpQM(2A`6S##@j*Y~Pl`|f z1I3j(pGBzX{0QR5i+u3m6K|?AwZm(XUEj{iMUOcGPnKb9(vp?Z56?Z;2)8J)n4N;j zkJjTX;OnpO9oUB%qJGleVAPIpGA9t0!P0oAYPWQGTN$s0!vQeZy{V$Y%Cz$heYIU> zv5qbFiH?SVzoIo-*Y{w>L#5#?-x2R>4c66E+&+^W++Mn+I$qv!q~Bk>b>J0UzRxspUjsPF2R2|U)FIBLCTl) zD6hQN#My<#{B<*Thxnm<*~0myd0+*um1y2m_^*|br=EH9Wga`7oAYIX>tVzBvWR;= zmoH1`#HT21-o18ed5Gorh4<+jA6QPl_Cv(HyBa;hNq5l4^ zP}u^`=W`2_3+Y1Hc2n~#$$c4h&=5nJ8p}mtw za`UMD{IBKK-NdO~m_XXlX*3Up(V^VL;`AsL&=G3p92(sX0Q950h(?d0<5MU%p)2RF zpMF^ZIyW?XBsaIvUDKaioF6+jm1_#EdwY}G<4bGjUbQXr03HE21eDeQv4mP~Z*FdW za&{(EUsG3y)3sKufx3EgKh;*KaH?MIvi9KItMC-UOXu;*QT$&3Kt_RSvLh3~rf_YR z8^`y0fQ3|$5p8V*8usJk#d9kt3Qf+3Mnem8qepWmM(3tNv*RHRUZL)q&yls?Zv(*Vly9%JR>uv~+rOa(eX0bS|U{h|y3_$L`SRLR0A2!ota>+S>WCxyh3Y z^ELC6(>1em6Sadq{b&C&lN)N2q5lD5a2I?^o$_dW)%8o9J0F{5fmyR zovQ)l+PuV1Vih#aAwUUyH5-AbX08Q!OXV7g(D%^ncdK5jp3w+FEw{xW1RzXCa9ujED<&pm`V4L5P0<=)Btn0pg<8)7!R zmwS}^b0#1I^FJax#9fFm{4%@)@4>$C=ed`-pJQkEW8AN}Uvj_Z-p_r6`x5up+($uf zW7v0ml>1u{-QRFu=Dx=c{BEN=m;=%?8kb`_$w zonu$CYuL5yI_~4#U$8fDf5kn?eV+SE?i1V>V9|PxdoyAxf028d`yBTfc0Id+-N^oo zy%Cz@o7kJ-fAv;&GkY7mh26?-W4E)nvpcw3xChvs>@LI!c!Ya5JV*a8_M6|yy@&fC ztTpf8?&dzp{XO>#_bht{yBj$=?_uvkB$szX>wXV=FS3C?z#e4pWAA4Vu|H=IvkxH3 z*CXsv?92TS`!M?m`zZSua*sa2KFfLB z$+@w`6XVmltBhl7Wkc7|*@e+D$g%~)*lJPUIyQ=`<)hkRE8a7@pmgV7h>?$8Z0KIS z-;i4^D&6@P=d`2Tt<{lJ55{e4uQpDsl?~fgD=rUhW zt%4c#Aau`62)UUFWia2XS?y>ZJhnJ9F*>(+VtRCO!92VEOditSG^f33XkF!|xpgP< zkoKlI?J%r8HLo6w!)p*S&aahCBkL+KEv!3{N3?1d)Pp!eSXv+~?a{Ebs9|YOz8{O) zQQo7G^rCu@_RLMrOh}9LZQirKPv*t-XUd*DZWr^o-M7|4Bdqoioj^JJI2u>D>JMal`1z+4+UJ*^|dqmaXruOAzbgn9LtL^2bi? zSl^vL_GrgcUH(|F9n+coF{>Rj`QJ17-!u98GM)0iiMdgTf-~A-pVpr<>OsHn=wxm# zH$OSAKeJMj4`?@@RS){n@kvOSL|udVTyAc*W`6NxZf@^o(X%rrlF z)#{059&%`A?KDTTrPWjO%;e14gW4-5XU5f6m>{xhR!QqiTS2H@jpgWg8HL9mId7ha)a%3`>zobIls{VXh&r0%CuTOseaF^R~FQA7nM=tF(G$&2LDf3R$5x4HfZfs zZL(wK*R>{ER(g6^dtmicdtmi+wNJtb-gfTrIlW3Xvonh)bc9Z|K&YgGK|>=I^(r}O zB|@KiACZxIpGHDzQA3$};|!4wl}JT}(zCn_&6A-_TC0yPLPy1Q_6)uewm{Wu>30M4 z%o>j0+S5P6S*Ax9W^gzC&Y=ccgWTIc%v{i}D;?<-GGnN8*9W}pviPttoy zn`XGepe4|q257*g&{jvFk)DL6cMY_VTkvZ?^jAH%b@|I&FaGyKA0CAEJhc2gbl4(p z@A6CBev~i6Z#?wjuc-GkTwmrS_Q~bHVV_!lj(ukNA@=n0PuVlepFqDqz5FA5e-`>O zV^8B5o_%iltN86%g30nX@lFHu?j-c<{m?Qr9RnIhzU|x#Ti*XQl)1mXC;OOoynpxq E1Elqbh5!Hn literal 0 HcmV?d00001 diff --git a/www/generate.php b/www/generate.php new file mode 100644 index 0000000..1219eeb --- /dev/null +++ b/www/generate.php @@ -0,0 +1,28 @@ + diff --git a/www/header.php b/www/header.php index 5ecae99..ae4041e 100644 --- a/www/header.php +++ b/www/header.php @@ -79,11 +79,6 @@ if (!preg_match("~^(?:f|ht)tps?://~i", $data[3])) { echo $urllink . '"> '; // display the link echo $data[2] . '

'; // display the link title and close the a href and first cell, open the second cell echo $data[5] . " "; // OPTIONAL: display the description column - if ($data[7] == 0.0){ - continue; - }else{ - echo $data[7] . " "; // display the score and close the second cell, open the third cell - } echo $data[7] . " "; // display the score and close the second cell, open the third cell if($data[6] == "YES"){ diff --git a/www/index.php b/www/index.php index c091717..7782c8d 100644 --- a/www/index.php +++ b/www/index.php @@ -1,3 +1,18 @@ + + + + @@ -19,6 +34,7 @@ +
CSV LINES: " . $lines_uv . " " . $lines_v . "

"; ?> -

@@ -99,6 +114,8 @@ require("header.php"); ?>
+Submit a link + diff --git a/www/style.css b/www/style.css index 61da77e..ff7aafd 100644 --- a/www/style.css +++ b/www/style.css @@ -12,8 +12,12 @@ .width-class{ width: 100%; object-fit: contain; - align: center; - + align: center; + display: flex; + flex-direction: column; +} +.input-class{ + margin: 0 20% 0 20%; } .projectbanner{ diff --git a/www/submission.csv b/www/submission.csv new file mode 100644 index 0000000..e69de29 diff --git a/www/submit.php b/www/submit.php new file mode 100644 index 0000000..788018d --- /dev/null +++ b/www/submit.php @@ -0,0 +1,84 @@ + + + + + + Darknet Lantern + + + + + + + + + " /> + + + + + + + + +
+ + + + + + + + +
+ + + +
+ +
+ From 9158e265fef006cf6d27a1303a596bcbd850694a Mon Sep 17 00:00:00 2001 From: SovereigntyIsNotFreedom Date: Sun, 13 Apr 2025 13:43:08 +0100 Subject: [PATCH 04/15] Added option 1 in lantern.py --- scripts/lantern.py | 36 ++++++++++++++++++++++++++++++++++++ submissions/submission.csv | 7 ++----- www/submission.csv | 0 3 files changed, 38 insertions(+), 5 deletions(-) delete mode 100644 www/submission.csv diff --git a/scripts/lantern.py b/scripts/lantern.py index f4bd94b..39abe3b 100644 --- a/scripts/lantern.py +++ b/scripts/lantern.py @@ -1197,7 +1197,43 @@ Maintenance: csvdf.to_csv(csvfilepath, index=False) #read=input("Continue?") break + + case 11: + category = "EXTERNAL USER" + sensitive = "YES" + try: + print_colors("[+] LISTING ALL LINK INSIDE SUBMISSION") + print_colors("1) MOVE TO VERIFIED 2) MOVE TO UNVERIFIED 3) DELETE FROM LIST 0) EXIT") + option = int(input("ENTER AN OPTION: ")) + # can't use instance variable because it will go inside www + submission_csv_file = "../submissions/submission.csv" + verified_csv_df = pd.read_csv(verifiedcsvfile) + match option: + case 1: + submission_df = pd.read_csv(submission_csv_file) + print_colors(submission_df) + try: + indx = int(input("Which index do you want to add? ")) + link = submission_df.iloc[indx]['link'] + name = submission_df.iloc[indx]['name'] + desc = submission_df.iloc[indx]['desc'] + # new_row = [instance,category,name,link,sensitive,desc,'YES','100'] + new_row = pd.DataFrame({'Instance': [instance], 'Category': [category], 'Name':[name],'URL':[link],'Sensitive':[sensitive],'Description':[desc],'Status':['YES'],'Score':['100']}) + + df = pd.concat([verified_csv_df, new_row], ignore_index=True) + df.to_csv(verifiedcsvfile, index=False) + + except Exception as e: + print(e) + print_colors("Try again", is_error=True) + break + + + except Exception as e: + print(e) + break + break case 0: print_colors(f"[-] Exiting", bold=True) break diff --git a/submissions/submission.csv b/submissions/submission.csv index 46a5f91..8bc1238 100644 --- a/submissions/submission.csv +++ b/submissions/submission.csv @@ -1,6 +1,3 @@ link,name,desc -link,link,link -hi,hi,hi -hi,hi,hi -link,link,link -link,"hello World!","hi, me" +daskd.com,myname,"dasjklj" +name.com,name,mane diff --git a/www/submission.csv b/www/submission.csv deleted file mode 100644 index e69de29..0000000 From 3cc79f7392c62c5179f3e878e957ddaea69fef46 Mon Sep 17 00:00:00 2001 From: SovereigntyIsNotFreedom Date: Sun, 13 Apr 2025 13:48:03 +0100 Subject: [PATCH 05/15] Added option 2 in lantern.py --- scripts/lantern.py | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/scripts/lantern.py b/scripts/lantern.py index 39abe3b..8bd43da 100644 --- a/scripts/lantern.py +++ b/scripts/lantern.py @@ -1208,6 +1208,7 @@ Maintenance: # can't use instance variable because it will go inside www submission_csv_file = "../submissions/submission.csv" verified_csv_df = pd.read_csv(verifiedcsvfile) + unverified_csv_df = pd.read_csv(unverifiedcsvfile) match option: case 1: submission_df = pd.read_csv(submission_csv_file) @@ -1229,6 +1230,28 @@ Maintenance: print_colors("Try again", is_error=True) break + case 2: + submission_df = pd.read_csv(submission_csv_file) + print_colors(submission_df) + try: + indx = int(input("Which index do you want to add? ")) + link = submission_df.iloc[indx]['link'] + name = submission_df.iloc[indx]['name'] + desc = submission_df.iloc[indx]['desc'] + + # new_row = [instance,category,name,link,sensitive,desc,'YES','100'] + new_row = pd.DataFrame({'Instance': [instance], 'Category': [category], 'Name':[name],'URL':[link],'Sensitive':[sensitive],'Description':[desc],'Status':['YES'],'Score':['100']}) + + df = pd.concat([unverified_csv_df, new_row], ignore_index=True) + df.to_csv(unverifiedcsvfile, index=False) + + except Exception as e: + print(e) + print_colors("Try again", is_error=True) + break + + + except Exception as e: print(e) From bc18f7656809d34a6d04114b28c5bd612c9a9ca0 Mon Sep 17 00:00:00 2001 From: SovereigntyIsNotFreedom Date: Sun, 13 Apr 2025 13:58:47 +0100 Subject: [PATCH 06/15] Added option 3 in lantern.py --- scripts/lantern.py | 12 +++++++++--- submissions/submission.csv | 5 ++--- 2 files changed, 11 insertions(+), 6 deletions(-) diff --git a/scripts/lantern.py b/scripts/lantern.py index 8bd43da..6754f87 100644 --- a/scripts/lantern.py +++ b/scripts/lantern.py @@ -1207,11 +1207,11 @@ Maintenance: option = int(input("ENTER AN OPTION: ")) # can't use instance variable because it will go inside www submission_csv_file = "../submissions/submission.csv" + submission_df = pd.read_csv(submission_csv_file) verified_csv_df = pd.read_csv(verifiedcsvfile) unverified_csv_df = pd.read_csv(unverifiedcsvfile) match option: - case 1: - submission_df = pd.read_csv(submission_csv_file) + case 1: print_colors(submission_df) try: indx = int(input("Which index do you want to add? ")) @@ -1231,7 +1231,6 @@ Maintenance: break case 2: - submission_df = pd.read_csv(submission_csv_file) print_colors(submission_df) try: indx = int(input("Which index do you want to add? ")) @@ -1250,6 +1249,13 @@ Maintenance: print_colors("Try again", is_error=True) break + case 3: + print(submission_df) + choose = int(input("Enter which row should be removed: ")) + + submission_df.drop(index=choose, inplace=True) + submission_df.to_csv(submission_csv_file) + print(submission_df) diff --git a/submissions/submission.csv b/submissions/submission.csv index 8bc1238..eccfb66 100644 --- a/submissions/submission.csv +++ b/submissions/submission.csv @@ -1,3 +1,2 @@ -link,name,desc -daskd.com,myname,"dasjklj" -name.com,name,mane +,link,name,desc +0,daskd.com,myname,dasjklj From 4837034ec3503152235757f8fb03d4b66d5e3695 Mon Sep 17 00:00:00 2001 From: SovereigntyIsNotFreedom Date: Sun, 13 Apr 2025 14:03:51 +0100 Subject: [PATCH 07/15] Added option 4 and did some refactoring in lantern.py --- scripts/lantern.py | 63 ++++++++++++++++++++-------------------------- 1 file changed, 27 insertions(+), 36 deletions(-) diff --git a/scripts/lantern.py b/scripts/lantern.py index 6754f87..0dc93d2 100644 --- a/scripts/lantern.py +++ b/scripts/lantern.py @@ -1202,9 +1202,8 @@ Maintenance: category = "EXTERNAL USER" sensitive = "YES" try: - print_colors("[+] LISTING ALL LINK INSIDE SUBMISSION") - print_colors("1) MOVE TO VERIFIED 2) MOVE TO UNVERIFIED 3) DELETE FROM LIST 0) EXIT") - option = int(input("ENTER AN OPTION: ")) + print_colors("1) Move entries to verified 2) Move entries from submission to unverified 3) Delete from submission file 0) exit") + option = int(input("Enter an option: ")) # can't use instance variable because it will go inside www submission_csv_file = "../submissions/submission.csv" submission_df = pd.read_csv(submission_csv_file) @@ -1213,54 +1212,46 @@ Maintenance: match option: case 1: print_colors(submission_df) - try: - indx = int(input("Which index do you want to add? ")) - link = submission_df.iloc[indx]['link'] - name = submission_df.iloc[indx]['name'] - desc = submission_df.iloc[indx]['desc'] + + indx = int(input("Which index do you want to add? ")) + link = submission_df.iloc[indx]['link'] + name = submission_df.iloc[indx]['name'] + desc = submission_df.iloc[indx]['desc'] - # new_row = [instance,category,name,link,sensitive,desc,'YES','100'] - new_row = pd.DataFrame({'Instance': [instance], 'Category': [category], 'Name':[name],'URL':[link],'Sensitive':[sensitive],'Description':[desc],'Status':['YES'],'Score':['100']}) - - df = pd.concat([verified_csv_df, new_row], ignore_index=True) - df.to_csv(verifiedcsvfile, index=False) - except Exception as e: - print(e) - print_colors("Try again", is_error=True) - break + new_row = pd.DataFrame({'Instance': [instance], 'Category': [category], 'Name':[name],'URL':[link],'Sensitive':[sensitive],'Description':[desc],'Status':['YES'],'Score':['100']}) + + df = pd.concat([verified_csv_df, new_row], ignore_index=True) + df.to_csv(verifiedcsvfile, index=False) + case 2: print_colors(submission_df) - try: - indx = int(input("Which index do you want to add? ")) - link = submission_df.iloc[indx]['link'] - name = submission_df.iloc[indx]['name'] - desc = submission_df.iloc[indx]['desc'] + + indx = int(input("Which index do you want to add? ")) + link = submission_df.iloc[indx]['link'] + name = submission_df.iloc[indx]['name'] + desc = submission_df.iloc[indx]['desc'] - # new_row = [instance,category,name,link,sensitive,desc,'YES','100'] - new_row = pd.DataFrame({'Instance': [instance], 'Category': [category], 'Name':[name],'URL':[link],'Sensitive':[sensitive],'Description':[desc],'Status':['YES'],'Score':['100']}) + new_row = pd.DataFrame({'Instance': [instance], 'Category': [category], 'Name':[name],'URL':[link],'Sensitive':[sensitive],'Description':[desc],'Status':['YES'],'Score':['100']}) - df = pd.concat([unverified_csv_df, new_row], ignore_index=True) - df.to_csv(unverifiedcsvfile, index=False) + df = pd.concat([unverified_csv_df, new_row], ignore_index=True) + df.to_csv(unverifiedcsvfile, index=False) - except Exception as e: - print(e) - print_colors("Try again", is_error=True) - break case 3: - print(submission_df) + print_colors(submission_df) choose = int(input("Enter which row should be removed: ")) - submission_df.drop(index=choose, inplace=True) submission_df.to_csv(submission_csv_file) - print(submission_df) + print_colors(submission_df) - - except Exception as e: - print(e) + case 0: + break + + except: + print_colors('Try again',is_error=True) break break case 0: From 4e79b26ebf206e4c31d91a764ede8e3722c8c4aa Mon Sep 17 00:00:00 2001 From: SovereigntyIsNotFreedom Date: Sun, 13 Apr 2025 16:12:39 +0100 Subject: [PATCH 08/15] Cleaned up some files --- scripts/lantern.py | 12 ++++++------ submissions/submission.csv | 4 ++-- www/index.php | 15 --------------- 3 files changed, 8 insertions(+), 23 deletions(-) diff --git a/scripts/lantern.py b/scripts/lantern.py index 0dc93d2..10df48d 100644 --- a/scripts/lantern.py +++ b/scripts/lantern.py @@ -1199,7 +1199,7 @@ Maintenance: break case 11: - category = "EXTERNAL USER" + category = "ExternalUser" sensitive = "YES" try: print_colors("1) Move entries to verified 2) Move entries from submission to unverified 3) Delete from submission file 0) exit") @@ -1214,9 +1214,9 @@ Maintenance: print_colors(submission_df) indx = int(input("Which index do you want to add? ")) - link = submission_df.iloc[indx]['link'] - name = submission_df.iloc[indx]['name'] - desc = submission_df.iloc[indx]['desc'] + link = submission_df.iloc[indx]['link'].strip() + name = submission_df.iloc[indx]['name'].strip() + desc = submission_df.iloc[indx]['desc'].strip() new_row = pd.DataFrame({'Instance': [instance], 'Category': [category], 'Name':[name],'URL':[link],'Sensitive':[sensitive],'Description':[desc],'Status':['YES'],'Score':['100']}) @@ -1250,8 +1250,8 @@ Maintenance: case 0: break - except: - print_colors('Try again',is_error=True) + except Exception as e: + print_colors(f'Try again {e}',is_error=True) break break case 0: diff --git a/submissions/submission.csv b/submissions/submission.csv index eccfb66..202ebda 100644 --- a/submissions/submission.csv +++ b/submissions/submission.csv @@ -1,2 +1,2 @@ -,link,name,desc -0,daskd.com,myname,dasjklj +link,name,desc +f45bzecjvj6aviwkczxpr3vukapibx275hlqetrl6fo6youlsbbz2myd.onion,MyInstance,"Lantern Instance" diff --git a/www/index.php b/www/index.php index 7782c8d..5b8ce35 100644 --- a/www/index.php +++ b/www/index.php @@ -1,18 +1,3 @@ - - - - From e21455540e422a35d75a362a46c2abe3ccbe54ce Mon Sep 17 00:00:00 2001 From: SovereigntyIsNotFreedom Date: Sun, 13 Apr 2025 19:05:59 +0100 Subject: [PATCH 09/15] Suggested fixes are applied --- scripts/lantern.py | 24 +++++++++++++----------- submissions/submission.csv | 5 +++-- www/index.php | 15 --------------- www/submit.php | 29 +++++++++++++++++++++++------ 4 files changed, 39 insertions(+), 34 deletions(-) diff --git a/scripts/lantern.py b/scripts/lantern.py index 0dc93d2..db03c56 100644 --- a/scripts/lantern.py +++ b/scripts/lantern.py @@ -182,7 +182,7 @@ Maintenance: 0) Exit """) - option = input("Select an option? (0-10): ").strip() + option = input("Select an option? (0-11): ").strip() try: option = int(option) except ValueError: @@ -1199,8 +1199,6 @@ Maintenance: break case 11: - category = "EXTERNAL USER" - sensitive = "YES" try: print_colors("1) Move entries to verified 2) Move entries from submission to unverified 3) Delete from submission file 0) exit") option = int(input("Enter an option: ")) @@ -1214,9 +1212,11 @@ Maintenance: print_colors(submission_df) indx = int(input("Which index do you want to add? ")) - link = submission_df.iloc[indx]['link'] - name = submission_df.iloc[indx]['name'] - desc = submission_df.iloc[indx]['desc'] + link = submission_df.iloc[indx]['link'].strip() + name = submission_df.iloc[indx]['name'].strip() + desc = submission_df.iloc[indx]['desc'].strip() + category = submission_df.iloc[indx]['category'].strip() + sensitive = "YES" if submission_df.iloc[indx]['sensitive'].strip() == 'y' else "NO" new_row = pd.DataFrame({'Instance': [instance], 'Category': [category], 'Name':[name],'URL':[link],'Sensitive':[sensitive],'Description':[desc],'Status':['YES'],'Score':['100']}) @@ -1229,9 +1229,11 @@ Maintenance: print_colors(submission_df) indx = int(input("Which index do you want to add? ")) - link = submission_df.iloc[indx]['link'] - name = submission_df.iloc[indx]['name'] - desc = submission_df.iloc[indx]['desc'] + link = submission_df.iloc[indx]['link'].strip() + name = submission_df.iloc[indx]['name'].strip() + desc = submission_df.iloc[indx]['desc'].strip() + category = submission_df.iloc[indx]['category'].strip() + sensitive = "YES" if submission_df.iloc[indx]['sensitive'].strip() == 'y' else "NO" new_row = pd.DataFrame({'Instance': [instance], 'Category': [category], 'Name':[name],'URL':[link],'Sensitive':[sensitive],'Description':[desc],'Status':['YES'],'Score':['100']}) @@ -1250,8 +1252,8 @@ Maintenance: case 0: break - except: - print_colors('Try again',is_error=True) + except Exception as e: + print_colors(f'Try again {e}',is_error=True) break break case 0: diff --git a/submissions/submission.csv b/submissions/submission.csv index eccfb66..95fdc2d 100644 --- a/submissions/submission.csv +++ b/submissions/submission.csv @@ -1,2 +1,3 @@ -,link,name,desc -0,daskd.com,myname,dasjklj +link,name,desc,category,sensitive +,, +http://git.nowherejezfoltodf4jiyl6r56jnzintap5vyjlia7fkirfsnfizflqd.onion,"Nihilist Git repo","GIt repo","Git Repo",n diff --git a/www/index.php b/www/index.php index 7782c8d..5b8ce35 100644 --- a/www/index.php +++ b/www/index.php @@ -1,18 +1,3 @@ - - - - diff --git a/www/submit.php b/www/submit.php index 788018d..eb885ad 100644 --- a/www/submit.php +++ b/www/submit.php @@ -1,4 +1,8 @@ 512 or strlen($name) > 64 or strlen($description) > 256 or strlen($sensitive) > 1 or strlen($category) > 64){ + echo "Don't excede the limit"; + }else{ // Open the file once before the loop $file = fopen("../submissions/submission.csv", "a"); if ($file !== false) { // Create an array with the inputs to write as a single row - $row = [$clear_link, $clear_name,$clear_description]; + $row = [$link, $name,$description,$category,$sensitive]; // Write the row to the CSV file fputcsv($file, $row, ',', '"'); @@ -37,6 +41,7 @@ if (isset($_POST['submit'])){ errorlog("Error opening the file."); } header("Location: index.php"); + } } } } @@ -66,6 +71,14 @@ if (isset($_POST['submit'])){
+
+

Character Limits

+

Link should be 354

+

Name should be 64

+

Description should be 256

+

Category should be 64

+

Sensitive should be 1

+
@@ -73,6 +86,10 @@ if (isset($_POST['submit'])){ + + + +
From b79555c386e9cc61c79939014c6f10c3271ef585 Mon Sep 17 00:00:00 2001 From: SovereigntyIsNotFreedom Date: Sun, 13 Apr 2025 19:13:22 +0100 Subject: [PATCH 10/15] Removed added submission to .gitignore --- scripts/lantern.py | 8 -------- submissions/submission.csv | 6 ------ 2 files changed, 14 deletions(-) diff --git a/scripts/lantern.py b/scripts/lantern.py index dd37a4c..db03c56 100644 --- a/scripts/lantern.py +++ b/scripts/lantern.py @@ -1199,11 +1199,6 @@ Maintenance: break case 11: -<<<<<<< HEAD -======= - category = "ExternalUser" - sensitive = "YES" ->>>>>>> 4e79b26ebf206e4c31d91a764ede8e3722c8c4aa try: print_colors("1) Move entries to verified 2) Move entries from submission to unverified 3) Delete from submission file 0) exit") option = int(input("Enter an option: ")) @@ -1220,11 +1215,8 @@ Maintenance: link = submission_df.iloc[indx]['link'].strip() name = submission_df.iloc[indx]['name'].strip() desc = submission_df.iloc[indx]['desc'].strip() -<<<<<<< HEAD category = submission_df.iloc[indx]['category'].strip() sensitive = "YES" if submission_df.iloc[indx]['sensitive'].strip() == 'y' else "NO" -======= ->>>>>>> 4e79b26ebf206e4c31d91a764ede8e3722c8c4aa new_row = pd.DataFrame({'Instance': [instance], 'Category': [category], 'Name':[name],'URL':[link],'Sensitive':[sensitive],'Description':[desc],'Status':['YES'],'Score':['100']}) diff --git a/submissions/submission.csv b/submissions/submission.csv index dde578d..c89d2dd 100644 --- a/submissions/submission.csv +++ b/submissions/submission.csv @@ -1,8 +1,2 @@ -<<<<<<< HEAD link,name,desc,category,sensitive -,, http://git.nowherejezfoltodf4jiyl6r56jnzintap5vyjlia7fkirfsnfizflqd.onion,"Nihilist Git repo","GIt repo","Git Repo",n -======= -link,name,desc -f45bzecjvj6aviwkczxpr3vukapibx275hlqetrl6fo6youlsbbz2myd.onion,MyInstance,"Lantern Instance" ->>>>>>> 4e79b26ebf206e4c31d91a764ede8e3722c8c4aa From 9321804658214df467a2c030fb0ee83d4f298e7a Mon Sep 17 00:00:00 2001 From: SovereigntyIsNotFreedom Date: Sun, 13 Apr 2025 19:14:30 +0100 Subject: [PATCH 11/15] Removed added submission to .gitignore --- www/submit.php | 6 ------ 1 file changed, 6 deletions(-) diff --git a/www/submit.php b/www/submit.php index eb885ad..105851e 100644 --- a/www/submit.php +++ b/www/submit.php @@ -1,10 +1,4 @@ Date: Mon, 14 Apr 2025 07:47:21 +0100 Subject: [PATCH 12/15] Implemented suggested fixes Submit.php doesn't redirect you to index.php. It's now easier to perform actions with option 11 in lantern.py --- scripts/lantern.py | 77 ++++++++++++++++++++++---------------- submissions/submission.csv | 1 - www/submit.php | 2 +- 3 files changed, 46 insertions(+), 34 deletions(-) diff --git a/scripts/lantern.py b/scripts/lantern.py index db03c56..af9037a 100644 --- a/scripts/lantern.py +++ b/scripts/lantern.py @@ -179,7 +179,8 @@ Managing Wordlists: Maintenance: 9) Remove the duplicate URLs for your own instance 10) Perform sanity checks on all csv files for all instances (to mark them as sensitive / or remove the ones that are blacklisted) - + 11) Review submissions and add to verified, unverfied csv files or delete them + 0) Exit """) option = input("Select an option? (0-11): ").strip() @@ -1207,47 +1208,59 @@ Maintenance: submission_df = pd.read_csv(submission_csv_file) verified_csv_df = pd.read_csv(verifiedcsvfile) unverified_csv_df = pd.read_csv(unverifiedcsvfile) + match option: case 1: - print_colors(submission_df) - - indx = int(input("Which index do you want to add? ")) - link = submission_df.iloc[indx]['link'].strip() - name = submission_df.iloc[indx]['name'].strip() - desc = submission_df.iloc[indx]['desc'].strip() - category = submission_df.iloc[indx]['category'].strip() - sensitive = "YES" if submission_df.iloc[indx]['sensitive'].strip() == 'y' else "NO" + while len(submission_df) != 0: + print_colors(submission_df) + indx = int(input("Which index do you want to add? -1 to exit: ")) + if indx == -1: break + link = submission_df.iloc[indx]['link'].strip() + name = submission_df.iloc[indx]['name'].strip() + desc = submission_df.iloc[indx]['desc'].strip() + category = submission_df.iloc[indx]['category'].strip() + sensitive = "YES" if submission_df.iloc[indx]['sensitive'].strip() == 'y' else "NO" - new_row = pd.DataFrame({'Instance': [instance], 'Category': [category], 'Name':[name],'URL':[link],'Sensitive':[sensitive],'Description':[desc],'Status':['YES'],'Score':['100']}) + new_row = pd.DataFrame({'Instance': [instance], 'Category': [category], 'Name':[name],'URL':[link],'Sensitive':[sensitive],'Description':[desc],'Status':['YES'],'Score':['100']}) - df = pd.concat([verified_csv_df, new_row], ignore_index=True) - df.to_csv(verifiedcsvfile, index=False) - + df = pd.concat([verified_csv_df, new_row], ignore_index=True) + df.to_csv(verifiedcsvfile, index=False) + submission_df.drop(index=indx, inplace=True) + submission_df.to_csv(submission_csv_file, index=False) + + case 2: - print_colors(submission_df) - - indx = int(input("Which index do you want to add? ")) - link = submission_df.iloc[indx]['link'].strip() - name = submission_df.iloc[indx]['name'].strip() - desc = submission_df.iloc[indx]['desc'].strip() - category = submission_df.iloc[indx]['category'].strip() - sensitive = "YES" if submission_df.iloc[indx]['sensitive'].strip() == 'y' else "NO" + while len(submission_df)!=0: + print_colors(submission_df) + indx = int(input("Which index do you want to add? -1 to exit: ")) + if indx == -1: break + link = submission_df.iloc[indx]['link'].strip() + name = submission_df.iloc[indx]['name'].strip() + desc = submission_df.iloc[indx]['desc'].strip() + category = submission_df.iloc[indx]['category'].strip() + sensitive = "YES" if submission_df.iloc[indx]['sensitive'].strip() == 'y' else "NO" + new_row = pd.DataFrame({'Instance': [instance], 'Category': [category], 'Name':[name],'URL':[link],'Sensitive':[sensitive],'Description':[desc],'Status':['YES'],'Score':['100']}) - new_row = pd.DataFrame({'Instance': [instance], 'Category': [category], 'Name':[name],'URL':[link],'Sensitive':[sensitive],'Description':[desc],'Status':['YES'],'Score':['100']}) - - df = pd.concat([unverified_csv_df, new_row], ignore_index=True) - df.to_csv(unverifiedcsvfile, index=False) - + df = pd.concat([unverified_csv_df, new_row], ignore_index=True) + df.to_csv(unverifiedcsvfile, index=False) + submission_df.drop(index=indx,inplace=True) + submission_df.to_csv(submission_csv_file, index=False) case 3: - print_colors(submission_df) - choose = int(input("Enter which row should be removed: ")) - submission_df.drop(index=choose, inplace=True) - submission_df.to_csv(submission_csv_file) - print_colors(submission_df) - + while len(submission_df) != 0: + print_colors(submission_df) + indx = int(input("Enter which row should be removed(-2 for all, -1 to exit): ")) + if indx == -1: + break + elif indx == -2: + for i in range(0, len(submission_df)): + submission_df.drop(index=i, inplace=True) + submission_df.to_csv(submission_csv_file, index=False) + else: + submission_df.drop(index=indx, inplace=True) + submission_df.to_csv(submission_csv_file, index=False) case 0: break diff --git a/submissions/submission.csv b/submissions/submission.csv index c89d2dd..fe75edb 100644 --- a/submissions/submission.csv +++ b/submissions/submission.csv @@ -1,2 +1 @@ link,name,desc,category,sensitive -http://git.nowherejezfoltodf4jiyl6r56jnzintap5vyjlia7fkirfsnfizflqd.onion,"Nihilist Git repo","GIt repo","Git Repo",n diff --git a/www/submit.php b/www/submit.php index 105851e..24eeb3a 100644 --- a/www/submit.php +++ b/www/submit.php @@ -34,7 +34,7 @@ if (isset($_POST['submit'])){ // Handle error opening the file errorlog("Error opening the file."); } - header("Location: index.php"); + echo "Link Successfully Submitted"; } } } From e044ba56e972d493dda168843b36ba309a8df2fd Mon Sep 17 00:00:00 2001 From: SovereigntyIsNotFreedom Date: Tue, 15 Apr 2025 01:45:19 -0400 Subject: [PATCH 13/15] Fixed captcha failed error --- submissions/submission.csv | 1 + www/submit.php | 1 + 2 files changed, 2 insertions(+) diff --git a/submissions/submission.csv b/submissions/submission.csv index fe75edb..e5ae426 100644 --- a/submissions/submission.csv +++ b/submissions/submission.csv @@ -1 +1,2 @@ link,name,desc,category,sensitive +dsajkdasl,jkldjaslkjdl,jdklasjdlkjl,jklsjlkdaj,y diff --git a/www/submit.php b/www/submit.php index 24eeb3a..9ab4f0e 100644 --- a/www/submit.php +++ b/www/submit.php @@ -1,4 +1,5 @@ Date: Thu, 17 Apr 2025 02:20:53 -0400 Subject: [PATCH 14/15] Suggestions implemented --- .gitignore | 2 +- scripts/lantern.py | 125 ++++++++++++++++++++----------------- submissions/submission.csv | 2 +- www/README.md | 9 +-- 4 files changed, 75 insertions(+), 63 deletions(-) diff --git a/.gitignore b/.gitignore index cf16774..2b5ef6a 100644 --- a/.gitignore +++ b/.gitignore @@ -4,4 +4,4 @@ crawler/** scripts/__pycache__/** .env env/ -submissions +submissions/** diff --git a/scripts/lantern.py b/scripts/lantern.py index af9037a..ddac7c7 100644 --- a/scripts/lantern.py +++ b/scripts/lantern.py @@ -129,6 +129,8 @@ def main(): blcsvfile=instancepath+'/blacklist.csv' secsvfile=instancepath+'/sensitive.csv' webpcsvfile=instancepath+'/webring-participants.csv' + submission_file_abs_path = os.path.abspath('submissions/submission.csv') + if not os.path.exists(instancepath): print_colors(f"{rootpath}",is_error=True, bold=True) os.makedirs(instancepath) @@ -179,7 +181,7 @@ Managing Wordlists: Maintenance: 9) Remove the duplicate URLs for your own instance 10) Perform sanity checks on all csv files for all instances (to mark them as sensitive / or remove the ones that are blacklisted) - 11) Review submissions and add to verified, unverfied csv files or delete them + 11) Review submissions (Add to verified.csv/ add to unverified.csv/ delete /blacklist) 0) Exit """) @@ -1201,73 +1203,82 @@ Maintenance: case 11: try: - print_colors("1) Move entries to verified 2) Move entries from submission to unverified 3) Delete from submission file 0) exit") - option = int(input("Enter an option: ")) - # can't use instance variable because it will go inside www - submission_csv_file = "../submissions/submission.csv" - submission_df = pd.read_csv(submission_csv_file) + print_colors("1) Move entries to verified 2) Move entries from submission to unverified 3) Delete from submission file 4) Add to blacklist -1) exit") + + submission_df = pd.read_csv(submission_file_abs_path) verified_csv_df = pd.read_csv(verifiedcsvfile) unverified_csv_df = pd.read_csv(unverifiedcsvfile) - - match option: - case 1: - while len(submission_df) != 0: - print_colors(submission_df) - indx = int(input("Which index do you want to add? -1 to exit: ")) - if indx == -1: break - link = submission_df.iloc[indx]['link'].strip() - name = submission_df.iloc[indx]['name'].strip() - desc = submission_df.iloc[indx]['desc'].strip() - category = submission_df.iloc[indx]['category'].strip() - sensitive = "YES" if submission_df.iloc[indx]['sensitive'].strip() == 'y' else "NO" + blacklist_df = pd.read_csv(blcsvfile) + blacklisted_words = [word for word in blacklist_df['blacklisted-words']] + for i, row in submission_df.iterrows(): + print_colors(row) + link = row['link'] + if link in blacklisted_words: + print_colors("Black listed entry found", bold=True) + continue + else: + name = row['name'] + desc = row['desc'] + category = row['category'] + sensi = "YES" if row['sensitive'] == 'y' else "NO" + number = int(input("Enter an option: ")) + + if number == 1: + newrow=[instance,category,name,link,sensi,desc,'YES','100'] - - new_row = pd.DataFrame({'Instance': [instance], 'Category': [category], 'Name':[name],'URL':[link],'Sensitive':[sensitive],'Description':[desc],'Status':['YES'],'Score':['100']}) + verified_csv_df.loc[-1] = newrow # adding a row + verified_csv_df.index = verified_csv_df.index + 1 # shifting index + verified_csv_df = verified_csv_df.sort_index() # sorting by index + verified_csv_df = verified_csv_df.sort_values(by=["Category","Score"], ascending=[True,False]) # sorting categories + print_colors("[+] New row added! now writing the csv file") + verified_csv_df.to_csv(verifiedcsvfile, index=False) + submission_df.drop(index=i,inplace=True) + submission_df.to_csv(submission_file_abs_path, index=False) + if number == 2: - df = pd.concat([verified_csv_df, new_row], ignore_index=True) - df.to_csv(verifiedcsvfile, index=False) - submission_df.drop(index=indx, inplace=True) - submission_df.to_csv(submission_csv_file, index=False) - - + newrow=[instance,category,name,link,sensi,desc,'YES','100'] - case 2: - while len(submission_df)!=0: - print_colors(submission_df) - indx = int(input("Which index do you want to add? -1 to exit: ")) - if indx == -1: break - link = submission_df.iloc[indx]['link'].strip() - name = submission_df.iloc[indx]['name'].strip() - desc = submission_df.iloc[indx]['desc'].strip() - category = submission_df.iloc[indx]['category'].strip() - sensitive = "YES" if submission_df.iloc[indx]['sensitive'].strip() == 'y' else "NO" - new_row = pd.DataFrame({'Instance': [instance], 'Category': [category], 'Name':[name],'URL':[link],'Sensitive':[sensitive],'Description':[desc],'Status':['YES'],'Score':['100']}) + unverified_csv_df.loc[-1] = newrow # adding a row + unverified_csv_df.index = unverified_csv_df.index + 1 # shifting index + unverified_csv_df = unverified_csv_df.sort_index() # sorting by index + unverified_csv_df = unverified_csv_df.sort_values(by=["Category","Score"], ascending=[True,False]) # sorting categories + print_colors("[+] New row added! now writing the csv file") + unverified_csv_df.to_csv(unverifiedcsvfile, index=False) + submission_df.drop(index=i,inplace=True) + submission_df.to_csv(submission_file_abs_path, index=False) + + if number == 3: + submission_df.drop(index=i,inplace=True) + submission_df.to_csv(submission_file_abs_path, index=False) - df = pd.concat([unverified_csv_df, new_row], ignore_index=True) - df.to_csv(unverifiedcsvfile, index=False) - submission_df.drop(index=indx,inplace=True) - submission_df.to_csv(submission_csv_file, index=False) + if number == 4: + newrow=[link] - case 3: - while len(submission_df) != 0: - print_colors(submission_df) - indx = int(input("Enter which row should be removed(-2 for all, -1 to exit): ")) - if indx == -1: - break - elif indx == -2: - for i in range(0, len(submission_df)): - submission_df.drop(index=i, inplace=True) - submission_df.to_csv(submission_csv_file, index=False) - else: - submission_df.drop(index=indx, inplace=True) - submission_df.to_csv(submission_csv_file, index=False) + blacklist_df.loc[-1] = newrow # adding a row + blacklist_df.index = blacklist_df.index + 1 # shifting index + blacklist_df = blacklist_df.sort_index() # sorting by index + print_colors("[+] New row added! now writing the csv file") + blacklist_df.to_csv(blcsvfile, index=False) + submission_df.drop(index=i,inplace=True) + submission_df.to_csv(submission_file_abs_path, index=False) - case 0: - break + if number == -1: + break + + else: + print_colors("Invalid Number",is_error=True) + continue + + + except Exception as e: print_colors(f'Try again {e}',is_error=True) break + + finally: + print_colors("End of file") + break case 0: print_colors(f"[-] Exiting", bold=True) @@ -1277,4 +1288,4 @@ Maintenance: if __name__ == '__main__': - main() + main() \ No newline at end of file diff --git a/submissions/submission.csv b/submissions/submission.csv index e5ae426..0f06602 100644 --- a/submissions/submission.csv +++ b/submissions/submission.csv @@ -1,2 +1,2 @@ link,name,desc,category,sensitive -dsajkdasl,jkldjaslkjdl,jdklasjdlkjl,jklsjlkdaj,y + diff --git a/www/README.md b/www/README.md index 1b5f370..2e93fcb 100644 --- a/www/README.md +++ b/www/README.md @@ -1,6 +1,7 @@ -To make the captcha image work you will need to install php-gd. -Since there might be version in the name first try searching your package manager - -Next you need to go to /etc/php/[your_version]/cli/php.ini and remove the semi-colon(;) from the line with extension=gd. +## Configuration for php to work + - To make the captcha image work you will need to install php-gd. + - Since there might be version in the name first try searching your package manager + - Next you need to go to /etc/php/[your_version]/cli/php.ini and remove the semi-colon(;) from the line with extension=gd. + - Make sure to use chmod 777 on submission.csv file Done. From 82ff94160e38dc98d529d58626fb827cac8b9ce5 Mon Sep 17 00:00:00 2001 From: SovereigntyIsNotFreedom Date: Thu, 17 Apr 2025 12:55:16 -0400 Subject: [PATCH 15/15] important fixes --- scripts/lantern.py | 8 ++++---- submissions/submission.csv | 1 - 2 files changed, 4 insertions(+), 5 deletions(-) diff --git a/scripts/lantern.py b/scripts/lantern.py index ddac7c7..8854bd9 100644 --- a/scripts/lantern.py +++ b/scripts/lantern.py @@ -1234,7 +1234,7 @@ Maintenance: verified_csv_df.to_csv(verifiedcsvfile, index=False) submission_df.drop(index=i,inplace=True) submission_df.to_csv(submission_file_abs_path, index=False) - if number == 2: + elif number == 2: newrow=[instance,category,name,link,sensi,desc,'YES','100'] @@ -1247,11 +1247,11 @@ Maintenance: submission_df.drop(index=i,inplace=True) submission_df.to_csv(submission_file_abs_path, index=False) - if number == 3: + elif number == 3: submission_df.drop(index=i,inplace=True) submission_df.to_csv(submission_file_abs_path, index=False) - if number == 4: + elif number == 4: newrow=[link] blacklist_df.loc[-1] = newrow # adding a row @@ -1262,7 +1262,7 @@ Maintenance: submission_df.drop(index=i,inplace=True) submission_df.to_csv(submission_file_abs_path, index=False) - if number == -1: + elif number == -1: break else: diff --git a/submissions/submission.csv b/submissions/submission.csv index 0f06602..fe75edb 100644 --- a/submissions/submission.csv +++ b/submissions/submission.csv @@ -1,2 +1 @@ link,name,desc,category,sensitive -