From 6e18a36333156c99abcd415e9cb0edc35ba6b553 Mon Sep 17 00:00:00 2001 From: skygragon Date: Sat, 13 Jan 2018 17:59:10 +0800 Subject: [PATCH 01/65] Update README.md --- README.md | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/README.md b/README.md index 99a2aa9a..26e010f0 100644 --- a/README.md +++ b/README.md @@ -28,9 +28,7 @@ Great thanks to leetcode.com, a really awesome website! * Retrieve your previous [**SUBMISSION**](https://skygragon.github.io/leetcode-cli/commands#submission) thus you can easily backup and manage your code. * More [**PLUGINS**](https://skygragon.github.io/leetcode-cli/advanced#plugins) to enjoy extra useful features! -## Showcases - -![screenshot1](https://github.com/skygragon/leetcode-cli/raw/master/docs/screenshots/intro.2018.01.13.gif) + ## Quick Start From 9b39415fcf4dc9fdbdc74e5fcf171a3c8e3b6f8d Mon Sep 17 00:00:00 2001 From: skygragon Date: Sat, 13 Jan 2018 18:09:56 +0800 Subject: [PATCH 02/65] Update README.md --- README.md | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/README.md b/README.md index 26e010f0..279080c0 100644 --- a/README.md +++ b/README.md @@ -19,14 +19,14 @@ Great thanks to leetcode.com, a really awesome website! [Advanced](https://skygragon.github.io/leetcode-cli/advanced) ⦙ [Plugins](https://github.com/skygragon/leetcode-cli-plugins) ⦙ -* A very [**EFFICIENT**](#quick-start) way to fight problems. -* [**CACHING**](https://skygragon.github.io/leetcode-cli/advanced#cache) problems locally thus you can easily navigate & think it offline. -* Do everything in **CLI**, no one even knows you are doing leetcode :p -* [**GENERATING**](https://skygragon.github.io/leetcode-cli/commands#show) source code template for further coding. -* Support live [**TEST**](https://skygragon.github.io/leetcode-cli/commands#test) and [**SUBMIT**](https://skygragon.github.io/leetcode-cli/commands#submit) againts leetcode.com. -* [**AUTO LOGIN**](https://skygragon.github.io/leetcode-cli/advanced#auto-login) among multiple sessions with single leetcode account. -* Retrieve your previous [**SUBMISSION**](https://skygragon.github.io/leetcode-cli/commands#submission) thus you can easily backup and manage your code. -* More [**PLUGINS**](https://skygragon.github.io/leetcode-cli/advanced#plugins) to enjoy extra useful features! +* A very [**EFFICIENT**](#quick-start) way to fight problems. +* [**CACHING**](https://skygragon.github.io/leetcode-cli/advanced#cache) problems locally thus you can easily navigate & think it offline. +* Do everything in **CLI**, no one even knows you are doing leetcode :p +* [**GENERATING**](https://skygragon.github.io/leetcode-cli/commands#show) source code template for further coding. +* Support live [**TEST**](https://skygragon.github.io/leetcode-cli/commands#test) and [**SUBMIT**](https://skygragon.github.io/leetcode-cli/commands#submit) againts leetcode.com. +* [**AUTO LOGIN**](https://skygragon.github.io/leetcode-cli/advanced#auto-login) among multiple sessions with single leetcode account. +* Retrieve your previous [**SUBMISSION**](https://skygragon.github.io/leetcode-cli/commands#submission) thus you can easily backup and manage your code. +* More [**PLUGINS**](https://skygragon.github.io/leetcode-cli/advanced#plugins) to enjoy extra useful features! From 144b48f85be2fed2be857be282d5872ca3a81fb2 Mon Sep 17 00:00:00 2001 From: Eric Wang Date: Sat, 13 Jan 2018 22:35:25 +0800 Subject: [PATCH 03/65] [Pages] update logo. Signed-off-by: Eric Wang --- docs/logo.png | Bin 179669 -> 125752 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/docs/logo.png b/docs/logo.png index b2be6a0c77402b22b4c7228b7b6e7772af934b75..0ad15c7a04176d3599958f68648b7090e0bec406 100644 GIT binary patch literal 125752 zcmZU(1yCG8&@g(qySoPqb`XNQ1$QTS2=30|&f)Iv1Sd$aKyW!MxVyXSPd`2egtIYgGc}nIFfMSQC>Q=mrj%2TGXn>Y^xOzF;82}VSC;7Ib>Af|)zUie6`KojR zMBET>siYr5saoIxT+Q~dA;^Fdg!riAVkw(-PuK=k%s_zA1qqK4%9Wi_E=yHQ`PO&) zU?Wq&`86#z9RLuD_7up`2^CHjidYmwmqm&jQ&vK$J@+|I0^a|Ls(^+B|EC2Egj#!Q zPxu)2`E#a_pKXE+l;1@PTPB=6DJ~wCY~+(L`oP=Q9msCu431Xg-;OkwwS2~YfO zUnO5)^HcKLIFqs>WXt|oe8Kc>Nr)7O+{*N3X?#*dI7;}wz%VJImxAn#QVj)`CLVt7 z4+3AC%|$RpKP>MOWg66PK@}?Wl&+=D7!0oZheGj)pKI$MBiB9sBFkS=&?7lN9>y9n zcp6T9Gt5GqErsXHuy2xVeUxm~ec2GX<>X%2^rwCb;eXi;6)PB-cy(Wz30MBL_E;9> zoB!=rZwuT;j<?4+Flk@Uss1yvd5iB@>GF*zBq80%* zDDO1AjcB{(2eFz6G%hCK*?-x7C>NhK^V7!Q64aj{2;wD-ir*5E-Rxrkp+x7SR@+Sq z%xh*7M<$C{w=`^6e(Pl0ciTq1%UNl1^G0~xDe&G%ih1z~?=PE|cLpBVF&JkMSt%N9IGwNlo?n}&ay zUR!;jP&+EgQt@tk9h~7i75%W#j8HV?o`wtFGBl%_~6ZMNy=%iok3unsPseRCm z-{Y0uIOSO0V`d0sEuG`B^2VN7>WxFnY}@+5USURMhD9Brg6M|uZ+HbvVA%(C!3q>t zdziQAV2sT8^U}{x3U*ZC*?Gczk;##2k<4#}?o;;gNn;Q2>RsB0{ekR@I9Sq1$cRPA z#FYH?xp|T;HSJY-^#uv=0FtMt*;@{au2y^TW5{cK2pvpbdURE?!P}tE0HEv%9xyiG zXJ#T}kBS6nRCI})OEL*K(l*ul&6u(BkgjRpy}{$ zrBP^qOd(?q(2$-jA>k(cg^?N1;s2vwsQcDr&6L1_hm=4OzBH(zFWy02pNW;g9d9o9 zs5g4cck|#J+QYn^ag~fBMyY3So%#Ik0(6h`3`E0;CXB|9WKggKToejFYUP59|;q_?xX>iFv~d0fb_wtKQ<$z{aL^De?O;r zCcq6)kDK&}efwg}XkuyZsU(3V87?JZXacNDo0lTB=&P5l)vbkZC~5d=dh#vX+|+of ze|HprBxS%Y))q|G$2xBJn|#?n^UtR^j)*k0p)cVMd^-ku7#opW=#x7*H3nEM>f;)kSh&_n^9s8bk@WXdXLM9Kz^ZfNH z%$m4X<;Dr~e7k&eV4HYb1EHo^?c$;|qcpVie73)dZN!dv)6D|{ClK>No zKE6NreRO{e{=|mQMJUNS$ZE^{kyDoi%V5*q(9+PM(B;Y*7jqSf6|u_P$n;KCOa)AN zPC?9!h(4uLrlSBm>Iroe791AD7DRcycwt%zTV-3DFOM%ZFTY&6UK-*`;4R|;@%V6O zaW(M7@uKj;lC_iE80Z*3F@UsEG;cM=)qJbPlsPnb%T#MFZ8Jx?yKD)X(aNzkerUv& z{Vc1lD6dqRshBC5k^I~7_v$agC+$ziTtF^zOA{`%PZ(C*RC# z)VYcXSGo1Mrhtp~*WHBXHs7+oE!*~(Y??W(Za0=HW5UCCdG zq6ncFMma?-kR9^ho_T!#Vt-)dxq6wM+=$m#@tgSPsxfHM>yOmvhvkxS{CVB^oS$S( ziM3IUzkcETnzpl89gn@0y+yhuLzh5c3qua0hzX6MCkxA_%`V8+%_7Pc%o@oiFaR6W z>-X#9>EHcwYjgYs*ZTL@)^hfW+%kb%`Y~UF^|JV1n!l#qYCW8@R~L4tEBU|9JUP7L z+wD9}+YQ>8+qGnV7Ku#-#)c?$LaJ)w&ve!->xFnT1$IieQg=RY)NJMM2ovSuIPe)U zDYLQDJA4>q*!P)eHo965T<^nNikphNQBIvWWcNvPpU-wkIgdLJ^S;0Pb9xXR7a4Dg9ffp^d)xN`2SNwj`o0X1MP-J6 zj_#_*=zzEz$^|Nmne;5Zz(283_@m#Ge&=OyV&7T6r)m&4k7$gbicm_#O{`DYO*BX# zQN341FK!pMacco4Qza+xc}P6T{8qW1%qv_OP>b~l(^oP>iH0=?~rKC92B4^aez1dptThE+`K%rb1+ZMZI$`}GSui((f& zS=2Tv@{_ z%2ppbee!mFbafDXd@Lnd{S0rXyK2)~>{wYLRrTSG`@&6^MV&;8Uynfhv*wxRnzzM3 zb_)DS=#u-+SqeAur`;9PU+$MeCof4)M+z4TC>Ye_qg)7FUG^7NM0T#WpjU^z-c#<8 zpVB8KCqKyG$rNH;$Uh0qdim@{^e46{HjOW`{;gh8(#Tys)jX;OmAqDUN;j0|yL+F# z2z7Ms`fk16?%_lD4d>hU$sC9YiLVJsNvJUtI#EFnCmN%bI~(FOY4MFJC6ifm?KLQC zG9BgQY9znzX76q1_`}?L&p>NRe&LU`z?{qYa}EnJqXHjQ&w9sUmx{gVYNf4dtmzTX z^4xUcJ-_&8)hmrR>$$3<bb+S6_mk1Q70q7BL9 zSmkg=ytN#d_cV(&NoGIJNzL}o&e6!=PVH&{LIi5NgaK=EP?RlDA`+K8x}iUwkK9E? zNh}c(RH-~eIh;`T!|th+%1GgBnSBW80{CKgMfOb1ILPK5vH;Z-exd!DnmOnScNwoF zFaatdmITh&BWRnjBy7J(26V=;>^O1|SD&82&`^PQA*~V&1<@vQ*j5Qxs>M?^W{yry zm)yv&k#({W!(kc;KTouZE8xn`X5wZgtUG7h3bPvobqBs^8N^Cc%;s_sa@laU+3H&* z*k_ohe9JMbvq$&~TxJ?vgoN72{iHcVZNzZT<2!Yibrsrhnr-U-G1K9t^+USQV&v4V zM)Ay|$TwGX&G?ePi|y4q;1A`3(G}*~M4_=(ulMb!w39Md!E#yMBoT+FcTN9l>`_#% ztpD8=#RTuZD+6yGb-A$T3Ap;&`Oc8;F3+bCz!dVjNo0O&n_ZCrU)^Y<) zYx~~H)%fn6{vU#U!^jSO10J1^K7ED3s$ONs>Ym1uAoI1q3rr?Ww>Nnto}Y97uG?46 z@y)3mDXo;-d~ba!aC}~Eev(r-8Y{zhVZNnOAhG4I1~r-PszA1;=#vzS$0MpoOAnO> z+L&`C@Ahvty`LU0ABP}2xo=*R+;N{|h^IV;UYu_JE^UO-Xi2FVK6P*qZjojBJ#8EO zeoDh|+j5dg0%dx9dhn>YP#e3BPCv@E2bDkSa(kcX9o;Q>Mu$90zUJPg6ll84wam_a zwg>AQ@rT3SV6vE@l7+w<6Y&s{OP^}841&6lOhbqU$a~8-gf`hGJSLDQ$0rnMumFTe z@&%*BA8#d?j);E3-#RMdv%;Kq2+VoVKlH)+z_Fp+AiiPl;7{YP(P7bf$}?%TDVNCH z7A#vn(1s{WdKcRcOY9&e>&eijm2;GLsI$!={#Bob){Sjy`02eLe&qAlc7ng+%reh- z(CYqg8BRnft{Md=$XVzLFKUAfEu~enZuXSh>*uB$?5~h)`{P`m8D4x|b3XbuW&JO9 z=%@X^)CK^r=J<^qCl2E5sXsA(;$_>}-58%KFGL+spIV-}v%n>{ z7rr>aRV&d=**lmyKI9DIHG~A{r(A7%@;$H;lo2>1pBiK^m@xyH6-92lq>FKO=8-RC z6Dzl^hcx>Bp3IfnVcRjz&99+XtQe;182Xg{%-=dy-rDXkRA|KT$lTFW*X<+6UJ_Z7 ze=?H3DjXhIP{QVWX|u_(a*-3lIovqeIovwj^BsQ^GZS%AHkP?5o@IV9p2o^lxtpW1 zPZ&Us_t1XHft2U(G`QR z!ZDmeo$@ixxp~lX#1`_1CnEQmz)U4@N0HeB=37k{iCkLWO%K`+ejpN~nt(~=VZV{0 zNJ!L~%-0@+Nd>Yt^(&S?2#mLj`s6_*2$Tz+!(dVY|n)FT?C zkEGl)1+`B(MwKFQN*iyMj+@-8TmC35AFE5=@ZJiQnvn{Ab=aI8x>XBG-_kKuV*6H; zr8A<#FP&NGvC6_m*LB!q1l2<8xX>1-nxv-hw_`r!m9EO$x@luR_er_w2jBi1*C>DjO4B<~KD_ds*()F+PjUAg}0p2eqew{yMxTq8|#)pg_75*?@klUIfbAW#7u|A1mh zk-U^Q-+ulM-5mq)FZ|%&>I608ge~$-!w-T1PZ@2NlD|%y@Tn6ZH^^v$8X{7fuQ!46 z9cwrA#t4Y5Ftz*jan|E6{tPGh1u*BZJV~|YbvI`Je%Tt#?amH%=2{o=U5#GXe z3l^se z`1`MU4o5vCw+Q1QXhsT4m4jHIdHrvvdMCqe`}Y(uqgJ3otlU{p@17Y{kwKignDOYn ztqD?Kmh)z-S2{R~Jeb@E{q?h(FwzeCvtgUaH_iXeee_Iw=Cs9F$5_J%wD_Sf#cJ=@ z^!V2`(FK*|h_&?Tkd@?>=p_S()S|G+(p5X_8iUo}MIO0Zor1m+etZ7T0c=6MVx(f6 zJ-WSq5;78eYUt7{MV&G6%Oqq=s|7+&H0ovVK4y}I>I_bVv`f4iBD`*|62 zrX=6S>I%6bzA5e6Ck-?liaqur<4d_`J?brvJxR|v=6rTM)YctXI0|a`~$aY#$?ZAG)4pQy4D*V+SD-W+gKkBPHak}25 zUJI;stG#HBZjxK`{M|X4-(UB)eC?rdB!Q&i*9j|$KMyxNb*lF7|X(c;tA7dlBpeecwLXn z#_J+oHo(s~%k)=3xO&-oJjgP?wX5CrbB@nUh%?-3>ZhprD8FQIvfz*JZMte2t{t1- zbQHeWN`WMTK!wAgl#+$r(^+fV0sdP7x5F6_(+#-EqWEm=Dl`C0HK6se*R~MLKHPL} zO{blL2qUvwKIiq1P&P-ydEe_%$il`M*!l447DZIJ0DsG`|1I(>vfl02I>Wzui3S!+ zS$>*%NIu<;${0c-qj5sGPzJ$#dG_oSHb?`#c<1bqQ0D%Tq6Xq1k*k92$@Klw!FD|( zAUlkrv&m{4ZSs`CFUgA#Jl>|OXC|a>=H?*$(;j3#$rB> zq|Q=vd)s8X0hhe_l6b~>Nq%KHzwFvISN5wJ-F>k~Wt`kY(dlJd=%QDqWB|6XB+-B5 zYiASVy+kz+IV4zVOXcTgs`k#+?+XIhg}G&iU#u8SCgJlgr>w)1P{&d`})7jKV(m4^lO#o>*k zZNGi~X8PP>g{{soy-PC{I@K#hBh@)oOUp+yLkmt5qbjD_vL;(6(_pRcYdgoA$}7`w z<^Y0(eYpMy!K;(XD{$?$dK$v#Z~{Fd zB9g=yw(ff>n03E`D(6?oq~U1)oVL5UGY|K5ciTyL5){FP+;vl~y+Y1>?%YY;JDZOF zfbKfp$a5h=)-_GvVtD)Q|71O_W_~1A;9qn!8VDdma3h^}T*r1=kDSj*?Ks|BJnL9Tx?;pDTAc?zwgu_%&^h zaMK27J_FesNaAk)OM$cHpC{$eJDVrIb#<9)$hmTf|5>;$#trR+r}n?6qs-e4sQa|f zev$&c05kmZJ~N#+uf)t{+SvcYhzw!YX}$R5<8L4z*e3;V@M@A_=i#*Nzj?ef`$;-K ze{ZvNUj6)^TK)(B5uV!Qiv>yHk@*(y&i_G1L-+|4BL3#TE41X|W%}_b?NQF~ajICY zm-8%nY4RWWG7qoFfZ_8d!5R;}drw1~CF+pl(%BkKNmW?{ngOA@q+m5a+VTw>`M~-b-l{k6R>z}_Iqmf z{lRu%_~>=&oV&E-w}E0fAN9`S8Dc}mW_TV*a9w}hLX3Dq6m>CafA)6g_txBeNAY$+ z(J_9N`}XYHbqZa;$?mK&XJyYtsWbT@Rn_ij& zt;}T$?WhTvx83}(2Wh7P1rEL_W!QO5KNuw#z4Zz|_f{p4ao0c9Z*`-E!@Rw$y$NOu zdb>SVc0E=O-D!dTYGtq9f!5r;x?#xK9e;N2d3Rbo?)km$k)QM?&-uN~Bn~lYqOoX>N6*W|+-10I zF`tt;-;?Vvxz}H&bKf3vmDV1z*A{dnh7jp%BC#+2T*^b8c__eUO+@ASY_^6#-maD2 zxL!sf&!g8-UH4HP$2d9X!Q_$$sRfsm;)k5!f4#R1Uf-{xj;|Ai9};mSQ5diIyRP^_ z`kp1P6t5c;`AakL9@;)$NzVxGM(kq}sz!m;EB=*Ax$f(uy@Vx;39b z@1}H4U8{L}tjQfbr}w+0zjHr(Jv|e8xwU_D`;6cHFEF1r$?RDcg168kJV=xtM3}McKJc>d?0pZ*I{M^Igc}?w-$?U?>AzNGc{IcK-6gizXkTMo2p_;frZQ3=V$63> zP5on3-K#r}o)*@g$JSidcZpUGHJdX|ol<{YBZjjBDJhLu;iwKOOj8KsIh1yH z@NeH#ch6Lko^$(J)91g2FMlJlqFg4VK{L{1B}M;S;Ng|o?3sBmwt76qx9_)(;Jbbe zTDt=YiY4rBszc3cc@=9NI!Ox=(OeGKd4;)qgxSrkM<9mwO0x>D!wBWw6|>S%iHUZ- z9(ApvVG4@cKcv_%9I?9q(anPE@?o<6U_8}g9NiVr-ns1Iye~QL#zL^nAZ2c2u`aMV8pTvi#dV!^22?4_Olt!iB?} zy-Xr3{uc|UQDZ1HgFT*N3VF#iE~;>6cfMzzSMECR1Z`rQ={Dmv?*rNH1IMqz1dokZ zvitvl{9-*HfMC6qjc4#zOUl9hw6R%r=RxxE2nPFM_YtP)_SzJ zjirLN38k;+@9xRboB+UB%G+N{*>jzooZN7;?FsLiWTn$UQZ3qt?;S{es%-ClW_Y3H z%k$=Z#^wa{Qx{VPwah*?CAn6fDLwHMal>yl>{br)j7h@QMFPsX&wSr|R(w+dp`!+& z$~EDAQH+e^pagT<1WrC!0v?%dgJH1oRAv~*b_Qjf~mHd+uFLJ(^YGJdZo&p&yVx_gxh5eL$Yt#_vU%Rg7IUp*&rV&Tfd zW~Osw;L1lbi&~C?v(HtnG7AduHw5X5w)@A_X#R}s?|$xj_~V^SQL0bPaD&t)$eP*V z9drTJs0!1rr9w$V0xfgf;U9L(P0hc&N<bI%UkjPH6`>H@`XN?uX}fC&0Svq$aYM=lF}!h9Pzy$9*Bf+eztA?+BRcB`nQ zL=x$lW&Tju0mUyfg(&%pUvqx^ihSiMHPiKquIBXmjbKY0_7Mh1fi8yn1GNu^;=cR6 zEBj^WS0fnz6^>ZvTTahp0?U*OxMC8K*U^IhA>1!(1$_WBI2KLw(pK^IuVR8m z+b3iNbhj#K;TQ!6*AIGmknZ_AxA@)Qc6ETLxLG}FZjn1*Y5Vf_W9utN5IJ!dC2Q`y zYUb3E!RYq!8{OXKfQ%Ugku5Z<>D?NfP}GD=RsJNMuh~%WZnsz!0i!;nEFwu3(jD;O zFyBr2J%y`Zv`-sPheV^7wQhQK;sXu1Q)kRQ2))r25gBwba@t)JsNzh-_A*tdab~C7 z`!hsU@h9oL$rsmU97#K`<+>WXt_EI1zK2(_6z)rc?8(0*Claj35H2*F)CPZ)INZ@a zqS)h?j+#vUTKMJ?`CLkIxlSogx1|B$pZ6c2y5Wf&0mmLAds3l9@P$X=w_F1K9`g&-%rgiXi5V!t=J_I;T!JS)V%g&U0F!MrC3l`IPw&H4MdD4oOMbVxx;>LPhAzXaC3`Pd{K zCrQ1KTOVQFtL=qhw1Gy`ZT+%i__{Mx($JV92z5h*E&H3{00Q60fU(amqKf|X^c04L zk>fLz>hndb0Fu zfeDxBg)SllC2@mJmBYe6mJ31{c?V$q&ksGHorAmHdjh|y0i-`C_TdHM+!4`OG9(zi z%phowINpmQ$we6#TfYMARUn|?%S%3!_b!Zo^j}hcc51c)Es-ArY|8<7&v3y4hgn&V z;j#DOoDO2 zj6liUtOd~qee3JLCTiSJ>-i^qfzKl~UG{NLy&LP_s~yLi1T4(wiV3+$gS`ut!|&T= zH`Sc}G(Y>SUn^=JD=cdm!8r6HK~p;)yP|CY$ofd5Oc~xvP}finh$+u4*XjEJEX7r< zxZ*!KIN!zK)S-(2fnrxF?SB6XiZ9*wBn2MUZ432l$uy)UuDm+_>%8h%^`s!&8#8pw zgs)EiJsuKh9uB*s>8E2GFp$Us8eYH5w|>0z_zy6{3`U1m9}6hk!;RIYa`eeS=5I{A zHqzgdvlB7=iIE{E6g&}hk4}e!x=ee5oq!Mh$n!A#0}cTQ(2A;>9^_7ZNZr&Y>qmP& z<9pYMp#{o5k1K00D@TLDpSJoE8L{-itn8?~Nc~3yXzRRN$2m5X-afm%G9GWqh7ZXr z6Q!?vpw+#bL2BpZx0-maGi|;>{h<(C?OhZ3+Yix+P;$u zbJVRed!tg&WHXveyAyaZ!*VX;OU;)NzT=+q3j?lT9_GcS&H@}$Gmm3A>dT&uvUuho z!oo7t^^yje{vMA(?1f!<;H_dO)d`1~`b5Q)2+yu78AgD2_wU!VT6o%^tvdy(jA$%92m195EE-!Ev?!}YXt+VXE^ zy$J{*ZHM>|N%cSq~gUu5V41pt6C zO`s@IPD($A;-ehuoq=cHDUQUKU~2b#f#D*jE=F3AQ;}x+C{gFb5bA5?HPYce%TW&v zVC1V8I)$M;t*lS{UBs*Qb;aYY+Oqj`%O(aK`XKPDnUq9GE||YYFNspYf=2%rH6Jp| z-!S^eYOf6;=gCj2GBg{RkKGy|6@|l%h%(ePetl|a2{5X1(j_wDCTF3TTQb1`uN_8r zRk94b5o){VPgT_{grmK6l-g7;N6e57AV%gSDfIduQJJ?}{nf`GYmWu3vd$b_k3UmL zDMDjEQu1wg`$J?%!~XR-N2^}#PZANsQl(Y=uffum1NuHZGWVKa435->hNfiAgy}Z~ zEYgZ#4`Oev{B|{O^!fp3;`eCM`|(XX?K&uo0@e(`Z>aINLj(nS9%KG`O3$=stJC7P zIyJJ}G9)rf>;YT(pff^^8>Wcx!Fn6ipgvC(O?>LDdU#S<#net~&BC9qj9rH96$D<~ zt!+G&@Qn%!8YkOiQrI6Ep$_27F^uGS5et>uy&RLq%dsbA=uo<^8a;`(OcfWYxE4@L zl?7x1i7AtWCQCzb6_h=sr2^8jSd0}iVB_Sx)!{Y-p*f56FGpbm-Axp$7fsr4^(ww( zg2P&&oWJr=bAf}x#jZC5#jC)c={UvQ6oInolC;B^>euD(JFJ!U#b)4FM*QJKpN6fC zei47Hnl%rm7UHnZiaU%6!jD&zH4h=nFr9$dz3v+9h4M)CF6Mz+&C9R9L?Ete_4xfc zWf2?PhVUzC#W0>ns2H+3SY`WcKKiq{jyfpt!Z%IDLXvaj)HDKGFNv)-9}{7Y@;`0` zRjF)i%A)O0qcM`KGt{F+@JOO_|2NJO#~pM7}ClgZ!x~h zY(8q)!>kRXc3u@TL~iMVdK<^62pweRJBy{nWSJR&%$neS1b|^8LddQ@Qdu)RJd?Zg zk)mu-huPv#Wk8%}gQ|N)(+@&>m@9wgJP>6Zm?6JeDOM*Yn(o1hWGejCyMP`Y$O958H07+Yq z=9qI-_8CuIEnq~K>&N>7r5G_8(70rQ!A<`KLnSHZl+vfs#R0$m2ysjUnWy23sF|A_ zM`iM2Kj%SC$Vpe6mZh+z#!*CU&O$eQ%c3b4*11|3his&B5#6v_Yyd4YIO7xVlB(4$ zK=O9+C&Y9W%+M=QbCB-B>6`JZ)d81?!bjcEZ&od{A6Z;+sv*@5{5-$M39rH;l%cm9 zi*U{;-F+Zb8i!Q|RGtoUWS^0ARQ~~EaaR`$vQe6z($W?m*uCwnG8lAkFM}O8&!wqk zIq7NOG0hm; zm(Y@O)SBx|J3am|VIJ#`M4rbWx;sX-F6ONV?apdF7Nrk^*rl8Da+XeF;3#RNKbRuo zvw$>)nrH?po#|57GSkE4#oQvP<*oEvt8I(yXpEMkPUgP5i|-1BWt#D9$oxL-vYK6_$n!L?A*`!FLu$=9P2*3u42kT(Vk~}o#QRy9 zGZRygVGdDcQb8~2z2<;jSLD|!;-?A@o6FOJ`)CJg6|0?Ai<_4(pyu^p7U9jR6J69i zmI9*}mbA(&A37roajhBk-<0NA!&LLZ<~Tt2lX-SHb)h8l>yO~r+DI8I^sIALruA=B z0Yp%9=+rXZU4cYO5hl9Nvcun{wG|Gep#4?pg@W6#`!2F3E<7~j5fyY^!db$8Y&jyVFUT$1Mrx)dNWC+P44aWm^t3Dknl~lk5Uuv zI|1|sKC|7lbjU^@!B9}*2&~tRKRsU->thO}54NigfS`s~a7X370mvJOE>2kZ>Xg^pF#7j5 zQu~DPS3-=fEkTh)I85WXALny~gAE-tDi{l!X8QwKVz-R|n)=TExDNcbFSj>n%e-3D zQ02lD@Un0B(P2WfV_xiHs0gnXXYuV&Yv*cSioA~>;bd5o@ie9wtp^_po%;tp9B=ol zKY{a$Nx%`{ke?Swlu_vM>I5Ad?H*yD7quYnuKSs-c5*C*I!cT z_&8G_f?yh@0!1AH>l30dC?yHe>scROoNbOU>qgPg6Tgfr%PE^hG;t)c;#P~Lb}csp z68xD>cz>&>PLyI#XH`uwMmHwh-?~T}%=~J|Q}1n<(*-)x8!)4i08VXyaI`pq4>##f zWL_LMHV{+&kH?2#cSr+mW0Rn)Zh$VYb4m)pYjJ{t(n%Ew3VAZk2k3xZKCcdcDIgpu z#e1Ozl8P0Hm0%>=&HBmdYb2I-gLHmEl^3tn-5&MLzd*f$+VaHKSDu!piLBO z{2=lShY4KU{e9GoE`qEqheWj%=R3`2^ohG)T1O(~hX%N`e(1^D9^9=Uj9Tv|IUaBP zeC=JieGmGqb)aWEO&_Z8)}1bj6#}ra{!TtiP|L|R=xkk%)*p}REX$)ci>AZb&tR5g z#tc8|z1Af88g0mh3uJ2})KOt&WHgVS%aJMW*zL%y@hmpL!X|S%BMXzroLzLU7meYq zL5<|#7oikO>hQH>s!vFIP&2$Q!}KC}VtDi9|(hv5H*fRVmGa*uv{*BqK|xCoVPwE;Yx z1~yp4qy&6+PFXaHV?bJ$NY-*Tt-i|iRvOxAfHFq68%^dv<$V93k2uzEBuWgLxPJw~ z2uhB25nnI@o(I8$l>WB{(;yNjrKGPwROtv$l*Bnc;RZ?Ecm|C1q@CGc!61Z2aCE*Z zw@;H_+Ti>=kHITl-Hr4%k&cA6@-xrVXeCgN&+Y;8HrUWCxWHofOwdeN=1P}OZ&X&+cxp6+eC6_rrKafuN)NhSo$puHn7Gp9 z97Z2euG#-$>@!VIp_@Z(3kXC>El6)DEojUkGW^ardW2OK^Bu;Fb#=)I zn&IR%@gMk=zO^?$UhjQX%n+RUn_aUX268Q3MnoHV;QYQ1&3UB?cDfJ{1Qep>BqbGJ zgn$(&L^4dUWgrZ67}@?5Vb_vaKORUaz?@Qs>BuFAIu@qq;|M%ZSVcM9G$@akqiw3x zPMd{eMNmWj7QBNQex8GcSF=Fok2*N*vC8e!RZgxabcg&lzdN%-*xz6F^LhXKyn@I8~NzuqzEE;xU~icbS99* zi;cO>IR1D<-y#JA*{(iVs9I0*n&Jp@Vp9YA6?LAJ3YZjWODCVfVT#Q3a#YzPJnV}7 zWwuWfvoROO5*WHx zjT+sv`XF~SDA~x!#+?pkm@PybRr26i2R;2fy5!=ow#?AFxy89&J15xMyoN70-2GwD zm$HmHa5iUKXhZ}`ksF&-o91wwFZ*kpIVo!&<{LFqK8I>)d^l|3ei%27Q^Q}h4%7O6 zBG#^FE$4VK$>aaq_i9nXvA>6MxL1ubl2&#Di@4c^W`OodDGT8RikhSX7200qy1TIH z)L(`_$2tla>ypJAYn#2@aWS1-^iiq67GA+C+8s>ss4Z=l{v6u4fm6>tJb@8U;Q(7Q zE6oeykT8pZiWn~zns80)F8_R~@VPi~2+>JQ&CFgYIMJ*|2h%%XesX9<|*S_A5z^cC=>gmt|)lAip1<{+q%_Wja8SbIA0bEv7mFtHhbhKCirJvVmc)WC2yt z`ezKaLeZI+&@Kl}40XQI2A=Ko4jwgCuM8i9+|@5L>5%Q$B-Q($iX7r$0Ms{>Vy2iL zp%0~=45TpQ=gQdVNaAoa448#M1pVkP48yG{ipFIZnF-c7D%^|`gK zhwH_+H?g1nV|z_Im>jh|R&X`^`sqHI_yRb(3(y}f-$R|imWV{K_KV`I{tX=-8~_Tz zKI@rL=`>!qoti*`t*AxR|f$8R-5|o*C&&+bS zFGobP6sPNck7GhbK^!iKlSEi_orjr0$dEytg&Fi#e>i%Duy`dn*6bDxp3xNunuKR5 zqx?9uGLx(+Cu`E&I+LxIsv&h z$COpH*oN{-|>eM3x(Xc9rO@jlVD*tqqkCAgh=xJ0`-h34Ir!A1mfT zhrl96WE1tN6u)l>hJ&QVe_3DS8yd!#`!kDZN28{o6{OH64l*4l>CFjLjsJIFZe5cy?{8*7#}6|w!l+(ZY}PPZVlGONu??`-V?*>t zWY3d+GEdIIY^d%ma<@}=`q_{2e5#&=@^*u4VIfd^h=c?|C_#e^ISJzNRHZS;nPFS! z>`I>Xayg1YtdTxU_lFiaWgdF4MGi$qTS#mxrd^1q)0R`7o*!O&*9NN58ZTBY_fU+S+(Lv=TayID@fd5syFens-<@J!}5neGEnDUMeaI+QS?&)L@4_9iBP!hVr=DZ zR$atgeW+k}s_q|TU)%OP^3ZxrHjvZ@H?8?WyS$Q(?nNx!&|HKbMkAaX4~wJ--Q3EO z0s@5H-_L?Bp=?f|wc4ZBBbkc8fMi6Zu3{Q6#9pLbm{mqn6iA_UnTKJ-y4Xh%$Oa0E z^$74$lGt0#;-OU>jhL0_rB(@z`K^vGVxcgDluoj$RZl+q+lzDJq8lo==^{QdX^Lv= z)EUSqJ$NB)Hgrze9|^4|2Z9bRijyewuwUuXx+A5Qn!T@LuF1jiC#{Q_JjPheJ%=DM z<}evaZA+N_@TF5J;RT*M8!1SE6^M?2*oCKLdyK(a1)`JE;a8?CL+#uL2@jH=ePVq% zbanP-Ajtwbwv!(~c)TNoaX6H%XpW6iy$uyY^qcbhwKTn8nWAz0pU6X{nL?VO8X42M2!f1WMdG2^2}MUt0Y`w!WJ zFw8%N%64lLkMqCW2YWgC~Z2Yt?cV8%GrOh;GQj=D;Gr}bmNrmHH z2v0VDxZsD>&n4Y?oC#u%2uS%CXbY%b!p%!^WnoSRCXw*MI?-6V|33g|K$pKHyfg;a zDnpEh_EU#3=S)$0AWTtXe2lNAPu104#^AfPW+2VU+yQgurw<0s)iZ6ocQqH~T{9MQ zP>#HLx7WP*N}QES_6?l!qN9j0tLYR!Js_v_NT1fte672CG7ad=)7%)>GYz20x9DQO z89#iNc9iKj-y%^mZd}IbcQN>5jf|Vqpssb}Y~Z8$jU+N9kC&3Hl{p&!wuDz4(vbB6 z>X8G_IiO@4!4B^cr)D(zoW(ez(xcLWoJZ+seK8by&*_krkxe2yu*tdvTY4wu54nL; zA=m>Cs$AsVXC=P}JZTI#Qq+nRzDB)Ol-93PovlK?I zBjBd5Rm`QFIc>+|0x~=bzk31FPRURpAjA_DNttuNkzfhE87_PRhP-9v35<61p}cev zua&nR0TC4fC7`#AD918d_Kx9|^2xvaK!EL4*;kn3ecGWMes^N*gnwJg-iox7HPVK( zkTt*`jtM1@3dBzUr$7DA$x`|kCD_vfXgoq5xGO-j(W=d=@ToU?U@Z_ z^Eua2ube5T2~*E|iW|}3H+aW@i5NI% z#>Fs+B=qT?SI+s6^-y0rm^?6M`d>yIHL_uBqC$G9Px7OEbvZcRlWX!tH$`CPXq@UH zykd;WqPdyBOaOx%f={B0M7nf!69){~GZ4WT28=wz#*lp{sZ=DQOSG&Hyr^aAt37Q* zZmgR*F<2bw=#ls2-X0|W<2QX0{o>Ikgs1eT1`nImJ8GFj)80;e_cjPfz{vMXmF%SJE*pYH|}enz0it302lws zg7(cBP$0QzhJ1{1(gVB@Yt*6_%`W{|bPW5&F0oU5C$`kpmQTX_$N zc)RvufPp#=Bh=_i9qV+qrGm(x{h3PPU47;|Z*p_M7ZK(L3_R8Ipc=kLZLwHehXkioS@zy(cq_59bT$8^1A<7c%Nco18cw zbIACCwMbSP&ibG;EjnVfLUclu!$4RI{G=m{@G|0LFlr2~zBqsS<;XEQaDcv=1AQkK z_GIZ9d9qgc4D^j%s?Px)^T9hZz%e7IwgL2Ey*P}%U*gN*p9>6=#aW z66cbkiLoJnN%^L}vem&+HV21NCRbyn3(-}Gut%yZPWP3v!4Zf)8P(@bg;B2+vD z`#FGv^>rf1CKzKwkO_jtv_PT=-k%SE--e6{qfo%5*7u$e27JwfaJnA>sMh1*^THTL ziXpNB+BF?h%loeFIntj{wt937jy_UH*lX^TL&`%wJtyVTCQnByibrFvlwSG`Zygtw z5+pD@7hb9H`yh&{Paw{)*^i^l`UA8SP})k`$?qVfh46=x5yq^&=Riz3ypYzpN81?R zgvf$@9l2%vuj_>moChEB5|6PexjD>{&D2Wy=WOy!TTbtU#`oq4q(hFfE00I!Mwam| zGNjyo^K2O(MlV3_Iav(2xJQw7-~ljzvULM&c!C1n>eqgJk9_xn?T_|CwLeBh>e;bc zpzn7fJoz|0B8`A@>c@+>zM@5K+jNeXtbgBuIzVP105<-}R@mcVxI)^IUIVIie}%JF z!O(j1$fJV*S3l!i(=J27X@Mb5<{^CagUHCHvFej?NXknZ5w6e`b!g7YyNOx=$`ucY+X1C4CCcQ)@1G=)@hCLI%zk; zVR3RDJFd^`cjerREQILiTh5o#*$5Ai0AauN5FR2R3pjb=7MMYzD6D%tf8G?Jr05Y? zAv2E!h!I`_noTxJPB?foj9~=?^NPUgpMYwgV%DRTJX8uNFRcu)aoUKdRqLBC!8eZj zJl|b2X8ncK3E59ES0@D-62M+hC{Y5b3w4}q9t@5?^r?P$NZIvoY<@q%7>Qbe^D4q4plII-U-eNbyz(rD zr@lYU?@rYLRWgYu=4T9yEHHFp4xlC_YAocACrhR)2#J>JJ-Kx9kTFn4nu#%!f>U2A z1rGr)Sp`OWdwYj+1T^VSyink39RU`Z0*oJ>>%&!QjIjXT^g&c*&r4JwQsS5)WzC-+SDo{HG%R(U)$>_KblV!3ZzxV~>H&1m z;tY{n<24>@$pM5Rkv;W{0iQzV!Qtcpl1X#ML!=!BH+z+-v*}e7FEuHJ#vx_oq!6Xh zYE-jndpDMHhmp_R`e$)nD@fGIkM9UE>p4DG2hdSE%;#-6kyTI0D8u_AB)l7RwgJC| z0tAc}0g#8bZ$yA7g4`~^r7)D;9*zFxlY#c!?;Ut?loe4B03!ksJ=k1j6q9SE*!FHH zR`@_keJ4CX1b`spAnb_HO6LH%{OAm@pKpda?MRz26ms-ABvDoWT3-P z11PCQdq#{8MFTh#%~+*&@X`sc;9$yRiZ|0E!qb zo60=+@lZrBQ2wZ^tvLWJ#jcmH)`e_kEet}$;IoX#n{~2(5HM4g;i_cL)-tr$42w^k z70)a0A|EMF9;?yAa|SAuw07>vf=_Kf?~Ij9OGyTxrRj`cdE-jTYQIHx2v~A1=niK? zq(;`rjKekdD#%;iux22wGalujiGw!vbX;$Ii$5ZBGF^3o>?cA?Q#IOBN7{`u#~9N= z4sP0@1N4r5hOC!1jny^jxV$GLRZjAJ-4!qV^Hdy0QJ_OI#wQbjS2fyS*Vc{g{Y8;a z3`VYXvh`X0Udz<)b)g70&=vWx_Hwa2W(y;lsA0KHH#um+qKs4>U<4A34?xwH@E3US z#N@UqqrD~y;yFd+0Z}gF4N*9orMw&=wWF*Q#J^z7+ZU-34xUr~cT@sHfC;7g=EgYk z6m3#6OuQSZ7-P^cBJ5I&lvq9QrOyKB8Ix#2w5VTgR$^eimwLb#%FhrnHrfohxruYR`M1TKVri zqvkgVq5wH=pjy3Q4gllGfC69!5>Qwtav}X_u7FhAq7Yz#M6%XPze#P8Kk~zg&{rG= z&-9T!%CylN8vbZkS&v16O6FEXfAmh}zuS1HxP2F4ZZr zR+o{)BhDE|M!Hu$I#^|Z0U*B|NXCmCN$u*d;=wlahXIT|nF(?5tXrkbn@n4OvhUD? zwbHlrDxF8}$q~mcM9$5LJnB!GqmEgd(Hs0E+YFC%D2$QbwGF|+g*(*=$$0*MxL)h7 z&&)IiCfBh@eZK5_>i88g@7xbZMJ@nEl!TVB^7xSac=ih%QI>xe?NBgLo+~elp=1~c zFHaS@r!0&Mumf5Yx&j@307d}MP*mcP*&Jq+DGxx^7LSt<17=5PDLG}*AK>6^oo^9V zcvIUPzf)X5;S<7J3dB33gqcs?FS}Z2xp#9kC%mp{7v8s&4Fdq&tf#1tQgTA14(%&g zA3SmpL1Zf}2ms9;kBnJ_=N%B`Y@m3V)>d11rY#Y%zO<)(Yb6y4#6$rOLDV%F=Vxr3 z5xkJ1sk|D?UaEV1l@1lza2{3>kQ4n#{ox&5;<%A7#PC=Ha)ijaqr29LZrCG{(mmTU z5oE&NiAY?OPi{pLh_j`R-(b;EPK

efrR~qyv@LKL<|PIkI-<1``|@U|g&rhjh+3 zz#{rb{$vQqv6MW=h0}`EFqngavsdt{QMaU7y|_AreXc91cLQ)C~k17}Ge^p!KS z4Z#xa${OWg3|Up*`q+c#FyKE2-l3;Blblp*N;mM1PI?bZ=lHv-uWjFzwA;1OK{X^} zW2@ecW$QhUT?&E+0FbgNNWe|H5<#TsfEt4c1OZ{BEFP~~{?}N1lqHZDi&?JA$a})5 z9^nOo1kZCuj#4l_`n3U>c58c-47gU}!Dv(YagPT`iLQL++S3l>#Y2)qA4wGDG@wHP z0M+;ybIO8`fQJwRW&2(FV|W1tWn+xy$asMWqTuJwo$Cr20A@7otx0bp<<}8j8XHfJ zbHQuXj?+jX={jH{a^zuK2hIoJvmPQQDG3p>Xa^WFrVNdHYa}|=hA{yaC#)!ywWVah zQrmbzKD5i|Q#5q}HU*~0_~;~Fjl43}@tU;f`2701w+AE25LvG?KEPe-dYKG*p93NI zI?AyWv=4(<4KI)0$v6bi9eeyx=)wA+jJ800*cD?ywni5}qvX;sr7ufWM9#dkwjp3I%OX2r{pbq*sHZJ_)DGQ?k&(g;*ov5d zbFvV4LKl>cT&AyjCC9*9cEX$)9^{lBK$klA&YaG-=!ny5++|g2FUb?{1Ibs&B$Q*(O;axpa09V zw8kw82Iji1zfH>#2I-Og{r$f9CXJycdgj93LhUO#XbZqYPB;vNlmE9c+mi889*c#! z1Sv`{nz2xXE(^P^eQ7#E1ysyK`iMZqyIEJ?dj`iM1N|trcBO`RB_c&0seiXiG=K=K z@lrfhZ_D?JK;DWA0kBza$riu&#YIK9yD z#~AR%$C!-wY)ebvH;h1%hNiUwCW290cG2q&OJHD>7!($=)^ucmN{VA}`w#4;q+p;>?wSWq3q8=0$IL z)EtP&_O^X6IF3yFQD!19QH}AE1+p0DB5iv{1|kP}9=(p-k(C&TlyRjWbsq-bBZIYE zzFTv6!ik_qA{;s_rB7FlQxqoRCim9PsZ)B2=!Z3sBA4<)WDNfp2ICZ=OJ6!UDoen) zNquUQk+n~X$b&s?&Lce%)kpulbE;PVc%*&p`W_;$*3`SxrbFYC1sOZ^9P`KPvT~lM zY|7Z!Cxp@~=Ns7ZMgyvpiWLr^sDs%6nK4K@0kE>j1UY2UeM0)hU{_S%dzP{`jx8#s z0T|k)EQC7(nl@Kmfs%PhF)#p9Uvr?ms*N)<#@8G~hOUSgNucn_JSw1C8-nN)q67e- z62Y$fKl1rLAt25ON$UY!pU~JA?@M}YB*G39c&EnlBKm zo{2dUD#mH-hldSh63%PSGdXh~;7ExHo)2#kF#B!}+UC7U^@Nwk%UDwa;1IBP1%f#765;9i+#`6_Lg&2Vlc`~P@OvnV;A>;G|kzH#@ zC(KQ|)<|9QD}Ab8>s94OU3+ZwNPFaFlvA=rPVve5;*kiEGZp#Qw{m!*Kjgh~%9sxa z#+b-CCrRqkxU@?~<|3Bf&<20h#q*ky*0wQ_;c?FEn$(_uyH2!0PdItjoP&F|IjFE@ z9g!iaLSx8}o6VgLitL==wf{OskT8hhBEN{E!nv}>m8_LM$gT_x?2O(j2ctMboF99n z*7vljM?O(%SHhHQI?w%h^*+y1cG;C-@gYz`Q%Vl#q#iKJ(Pq}0S51kf-YW5MfwjE? zAvmF?td$6Jjz@c5qk*w3Atw|7G$2yj@|`m9g4GRJcy7*4tq>Fk1$gdK13>gli)07_ z?}zgFEfHlUNTN1BXhc#)K#_qpUrHq+$OeBe)c#OZAY>yS;U8glng(zH8lDa?GA_cY zA0RA>;IUJ(q;-^`81|3MOIQwUvtOe;<+s5LYza3YQyu_VD@wv>kQIRDUxLVf6OYfF z@P`14hO}qg$ov4J)RJ60t(*ir@Zl~Pev#zK(K1a-z@}?jdG6fk8;1v z@Mz0I+vFqk)%X~n@d8X<7*ASRhKMmRcfid{1fm3;aTO5&X}|&8D1X2n;PQGI4Z;%w zxFP|Df&ejyc*lE@+Hq2dS44@WYCJbKO2Ip4u*Y?zB-%yBOzD6Vu%Uc5??oLHhXD|# z1909rBg<k+I@E02IBMvvot{Oglg+{aH898QS!lc3cxV z>XSSGGV8@?Fg^};*dw4r3?)8m$GjOpI%zM*IIKHkhKF>M!^F8F!=7_O=mq|}H-7Jc z8iT|0XRu^3tT(S(q-P8~dOCvWgXj|kqJ#duzdPizciI$BS;^3wa`s-5m0F~O!L8H zDJR|pC0IpKNDB`%>$ueQAsqTjTa?$mI+SW8#et4Mu7Lg08LKETAdDrr;BpC>M| z;JpD7!br#&5?-Naz?9&b3y_;5^#}~Fn*sMLb7h6-czg5t;O% z(^z-`FbF)b2143oh^0dS5W|BP=3v}FA_R;W9g(fM`&7X7U7x&W3KheX`rcClU;|{s zTji?Z!DD>!J12Y$Xr~=lb@i_;e6Nb?9ph>&dCnjKKk2&k%Rq^k0+zM?`W?U3=XBts z@d0>BEz(~`(k3Dg04{2+b2KiF3La}uglEk9F=s?(^Ia+p{}>BoEI{1Y>4kAIWct)z zCG9$7VolVMIbdw@L6i=_asm=R;)xrh^eA~DM|8vZWEP}4-IE8hia4LVb@GeXoJydo zKQcxBfVlB;xvt97cE!KUVD+(6$P79Aftz z4TeXwNk7P|xi7<^w0#oSm64AQFg!|F@9XpWebu0pqa=W~k`xXGVKf2EsjXVZcjF+K zXImbXXUEIrsR2zS-_Dbh-k@x9>p6-m9iV?o1*8(f6A+3+0lX&!7MjqH#A6hNs0-v* zk+vvtD4weE^E?2rR0IL`j5nsvNPyFL?UOJF>QNALHdjEy+YM=hr@GDI2i{P~c!2y~ zi$Fs9^x?SzE&!-~*Yhye__-x}ewZ2?Bi92jlSjF-M<+=*Dy_PVP% zSWkS0Lku*>2u8*DSTiyd<3R4J6Os4&vVO7{Qi1qx?Z}b!hnr**F3NbwMnoR)&OYNf z|8?Wv_I)=#>2%x5+m^ma@rJEPM_y$(~=NM9S|6viN1I)goF?RavmPwAoLl7aq<=b9YL#`+T$4OJwXfw ztc(>100c@S)j-&Is!nwgrb@~y!yp@{w4*V~%iHAC?pTMitA_w11q_)}U2osbDMUcE zNx(w{o!1B?e0RE!SEihP2tTjsv3 z4}b$eYv!mdZ&hjt?|A$8@4I;data$FD`X3BlQ}6nQ6dM3y!-In$-j3=MW#NW!B1lz z9SOXZ>J%;LpA!(r$({gD+Z>WM)TW3VxbpG=7-!FW4jvgwu0Q?fYV1CUTv*@83%Y6W!`7N{ z-Ik0?nx0dE$hSQ=dgnW$tNO$zWKQN7BA*Ooj4>y5uQ`%%(>id1U?aUHhaw)|t#@!i zxiLUU`zLw5=(L;8BW$jxLGp`0(^Vf9ji<@Gx9Ap|aAN2<2IKQwp4B3-;OCncWwVg+ zQJ#|7?Dn290$8lL_sHh21!aU7BnwV3v!??H7zbVv0kbfG-iDmTVt}#-v5r4k%v#PE zwI{T-=^kYleJM}4@gM}iY{J_Jl;-d;4$)usN+=JZ3IQEpiB~))-g0Oz{Zq%8LkygP zC@H|8%u+IV!WiU02=CH*@+MtRgRB8Qjq-p`0JstW1QKLvlXcRj_G{bbCb%@gZd5_(HqBoIbi`d_mL4s5x{XG1B`Tx{BiR1%RwOL0G^|V$Mh5brEksEy)1wu z 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 B3Ag|N literal 179669 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

q*x~w{KJ6Rq*IJ5zi#5$gA_G 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�e9= zp-qv&MBEu1(dvt8NV%qe1ICJKt3U`^z-#onY8%EyS%O?;a;L>5CQj%Vy7$Nti43Ud zvRFr3d-g>jQ74JJ#7~M}5lol5y2w9pCDI z|EWcrDD(J8J@A@8_y6)QNHPa5q8Vf8E(h&ztD%LCZf(}dE9cK#Bc~QJ>7L!yWoH!kaFN?gH$WA8>N5&1%2W)Ar zVa^RCkxM*!QcC{!Y?tDY0ww4M3j+|@aj@I2nZ2r+2SXz#bFfQGjVZ4?4s6>7?oiGdk`oAa| z&f?*LWYRy;S^}u&&+mnsM7496h#p#=p)L}U04&T|q=M|=Hlqr||A)T$ep7;9ZaBVb zR9&C?Cue0QLDQyNb@a3dL~Z6dY0en`Csp0bf~<7g8FqR=3C-(&5NN$;z7_?u*VXf; z{iQ&vJR9Dq{&Mo5KqI3815Q7zxb=1gub(w136_*VQjkIZTgE?#UQy^anAulBLjx#u zNuG$c>b**jSL(Q}SN(FFCiBSFC+A@7-N}DzU$=ou6^?r<(T><738`vEZ;4Mq%0QI) zV58!pCcT-DhAEWV^L@*k^-3t_<}q-KrICz)Pf}sQDQI$&R+{}Ln+)gw9U8;zSGuF3 z2iu_lWGNnw1TQvh9o`4=PbB1t?HxKZmaRMs72{Hs-&NH5uG~(ZpP$WYI;cLW z+-~8*-X!Pd?O3(8)0LAZQTZKP8+p95uSzp>JNC=y#~S~?nnfe%NC<@;+^H29p)}H5 z5G$+RO#x~Qc(-NWk}<6|*3}MhG(Q$&w3gz*jb@m)+pwTI)n*FH5h<3Cb*5J3j=a`$ zcrp?Q7)!~XX&B*#z7$Isl6|fJ<`)9Y>Y{H%jzJw>bZ}kT<;&qbnzBxh#(b`I-)IMA z2+%u^J|*SEsIC{-c2I%ihmA`{a?I+z2YfI6HR`Q0sJ}Ag1)5-rT&edl$l)pZzr-zo z>H?Do#l`hcJ8V9Z<8E#}Dyh7pqFD9g-pLKqM=k00#iK=cPJS^Lacj|pNtOi*292SH z=7sP~9o0X-2w`(iJG}4Gq_G(Qz91wrWr@}&YiQh&Bi-OR?2#73RPdFtp0(RP19oyQ z7!hNe0gX<)RvhX19)59#{-g5rV~fE2#D)OS{{B+G4`@=WFr7YJ@vSg<7N?oRfekXA zNH{$LY|~@LR~qPpxgtyeKogZOg@Wewy$u)ol~lZ*8aIC=0^LAJRk|2Ow~RY?EY5vC zoUQzcV-5?x3|#$^TGblpNt8@$mvQA$K=U6NhKWz$ZqHb!_8mHyEnD`rMMV09qY{V# zm^FHs*?9LgMw60W%`%n%MjXW;HwCjC_MHgg@QY($6drj>!e~ofi58$nlSJI6O`9U) zkpe>E*=XV?_S##(dB$(L9^?bsp#DUs-q&z$eyH(Iuq6nz89Pm9^yoRK{XpYzZi+n_ za>u{phq}TSdk zNZuur93%}^|93*MqhI`RrBj41PsTt>)5W1M{*-JO-hwDj$BnygXW@_K4%7yAA{Sf2?prR5{aac8*Kc}ddo?vY{{C?J zjRsa+M$bbSqOYF*syXcmCZIEijx{}6ux-ul7n9ml#@w}Uu4|XDpX*LyxX^(Kfrytg zZqSBBz_h?-?9Qe{{zxhgE2z_sEkqYf;!{-dACNxgnf2E-)tdi0{Z)Rfes!7Oj$fnB z_xmT#y6?=>>!BK(yGz4CYLBc(!I|H_MOM>WZy#yl@W@)L?!w0m96IzJOSZl0E#9N* z$f-#FwEwf?2wEYQJ0#I@ffK3K0JBE2+za^V1-8qm62x)>ja1xmS;g93g|GGd_7(Lt zEB_j&6W~+m$y?v78kv!qD_T7CY0guppFI?^Wvi9PC}I`q7*Xi--SQMr_bp7N;NVF3 zXd3x!=dm}?x1(}oBLZhfQ@cyh1{@jQL1DV_yeW4vhA7l+7gTm^zQ29x+w^;Q)#a$c zyf4Y+G>qiF0SN!G8-aG(4p9QQ4o1z{lV^{I1iRJdckS6|44?sDlY5Pee?ZXQ4I1Q&6n^L^ zdgaN6SOPp$u3r#XNeY4Ju-iNu{cCEPr%xuvyrb=E0c=LRP{oND8H zeJU~gQFgyJ5oRiEz}$wQF>g52C&XD7QXfx`;}+f>5uvYaL3Ot=T%+s4=;Fm+%(m&r zO*sgQ011U(tv5F@=>0bq$qKAItVLnRr3F_^yM-vd7Ntew_-k}zkYH;5=;eBFSF4-2 z^}o+l(>0$`iu2u5q!5LA96>IbUzZPHx zedRiW4B>q#lS~rNFwq0PWo(8*u;N?fUUy+E#MFu!2d#p&;x3>ITGkPS%ClHrZE9oG zT}#Wv;7LP=&OQc%tE!B##7Iy^1%LyzHe3ov$%^mu`O5 zDlk0AVz!?gfTWi*U4Vyk=X~Qf%u28wM1e|O5@56or8nw02+(i1ThhPQzKp$a+QF~J z2C0EDM5pX%9UZ|E#9NMFh}!QJFO$;es_?y3C45ffeRt`lpeu12WN<$$B*>c>lhH6V zIs6NnVj?yr(Sm14)yNbwV|X700n7N)hp>YHF5(>JMRIw+47Aw9VF3w(52|g{Rh`DW zbTa;_?>yOk?!O%dHuP3pnL;3JQC;Dx)0>}N=0xC2HawPKsf%><9gy3`4c46+l7;b_ ziODqcBbYDGz1fRr48_B#JUdghu~Wr?@)^NNb@q(C|c;ru|BHv6`(<$$~Tic?Djn_4yeG7<~t|FjHUfHzCokDHDgf#?E>zv1SVRvE4VIs-Ew_1nu=uQGYYfA=dS6LJ&Pi+*GF znNG^whRjlt1C7noHn@Mke(%_CF&OgE3$__KawLS`2*MEP!#I97Q~Pj+3+2M1GwE-d z%vS^j>Z^B&VjP2xTnF%16e$`%=cm}|pA4iK1&GVee~J)@qWlP?zA9tUc^wK}r-T^< zP@|~qL$S*rJneCmpx2A&ak!SqggkRuZ_-9g*0sbjd!KO9!3a&!pDft=7J&G@f4ExL>O^ zSN=1=XaCUlYtlR3@Asv`UBlp^*)3esac7@tPoI13=-aE1Gw*%B1MULZFsLGvZb`wW!9j|1AvUl(B3Ri{hA6LIZfjUUS*CcSAU#gLCI{084*S({b8V*kf z10WHmcp;K0^tf_vLew;Va0}4t#L1J<9RCd$)jwI3G+HIYa^}pNQX1k=1jo#H_;5d9 zpk1RXZh(JmY-&tzy0YjbxQ+w4Cj;!c!XT~0QBiOAymjocv*yf}hd-pvKtC=~!Pp3U zQdzUqs9}Sc4OPvHcgnFVPp)wYJ~HQClH)3cy?5TSRmJ4O zarKWyRhm(QIG!&xnF5_CcfUer(V?)k#oL2}k8@j03s}CDSQIu~#*IEb6p??*P84Pm z{FX~Ff`Vae7@3EYLF~}aNHPUOyJ*0uprY^hc+4{$-*6w3XQ+OqSpD<;sdzs~OMrtz z$t=k@5=fNp?|&#F0t0{xj}nR3u#^#ueKx^-MQxRZwKB=5~myO;LjB~luNp{fKKTEOe) zVjF;Lk?Oti#K&;diZ)YF9qLbB3*h<~%@5d{q30jS=2tH`d}c9L12}_ZSKf^x(8n5@ z^~Ryok^c)8!yo4Mqtye1$tW(Ku^^6!v$Ldq?PQ`tsLy@#S*JXWDE$ndzJ{sam>h#M z4x~7vi9NCFMRiz^b9>b}w$h|Z5q@&m3*Wuu4L^ALa#4yM7XkuY!N(f5K4}#P3$46) zNB_=aV=Q$K-@c}A6E!3c!|Qsf4$!Ksq{_hV#aopKyJ02Xo9NCZPM;n^$Xq}bv|6H` zo!=#Rr1z~1^rCb-6R>tk^GLU(-pH@_LcfZH3n-3VpocaZTjQnSbP8tBA^^}Ln@t2x zrMRtiIK~63{Cwq$gbTw$Zk^nVkq7&E^^!L4fB1IHv9R!POh{vqUez83yrl(Y6h|Py zZ;YN%V=T+py0FN5Nk1#iPRa31e^g_66H!1U?kJK2o;&$VyK&kM;=E4)th1K zKM5B~qLY(V;mUa2VYr+Gp+|qdbm>lPHMv7qv8gJns@e`x2db4`il1N_{1@T8$?I3H zBT{*oAfHs2H;_T27Kh9xtU^`UX;M#nll>1i$C|g6Tn;=|AU|TGRebe6X?|^CUw01u z6V@kvF7$;NN1;I1xf$3O;c_dc6|)7J8~ zm|28QKtlL|AF>Yt*%(mz@cwj$-j2=qj{8H3$;!&gl-iqAsB*XBfEzUEtYMist4CTf zaoXZY!nvf_=mr-F^l}ufgyE7RxIZ7Iw`tqFh^XS|je0i=51Lh+@8_B=Iu5fR)XZ6a zimSM@jQdfvKFfhd?!#1j00)zkN*H7uzuW))g6po;5Aoh~uEP?Mh zNW^i;X>o>t?A_)2nR6c=9)#c+d2S|O79|jiYcpjy{o}f&D)IiG{4adMf`*MEz3AR5 zXcxdL0nXjNq_&J_To;Eu-mhhpK%rKD%%9#udRIVGg3V1B(lE|ksJdQtbzvN$kwbm~D zh1pr9NgsYLe8}-DV+M#SOE7;)k-PwZMV@v$+v1`<7d>y^KhJZ^BMLHu&b)B*C z3-MwmtbXta6U*2h+J6#JyqsD3+;Cu96x=Rsiq!8<7WHpe>v%h2Fg=H~ZXn5SkCP?- zQuKm$cIL?HL8S`{I-UsTVhv;i(LT5pCu$_6elw5I>^o%Zq9Jwk5apr|#6jJH7Mf#K z(wd8l)yV{7C>o0+>f}jt-Q%3)qPUS8cGary>4$%eF!;*($SD!7KZ3;W4wX8z?PFW-( zJDyYEP{MbcvyZua3^3notgxn=Kw7ux-bk7$U=BG{CLSGsw4m9iP?~1|9UaSc!3W7- z9#r$`h}U1T>8>5kxD+#?7CdShLdP?!8*Xd=X}jV{oyVYuGf9fzfTQ@C@%|y}v;D-0 zId<>Qlr^vIAKmoZ#UW&310~2wa7K|+V4|q;XPP=@Q9jAY4B$rRrX(dzHl5a|PrOc( zJ%r7`BxZ~BI5+ngMrqV_lCQ}vh_EB1wW=m%5BN5D-#00<^HRlt?s4GyRu@cU4pM46pB1+dO5MZJzF}gswt>z1L&oJAtEs5; z(E7LDeAm94jVJ!wA%nS?kgIKtx0h*{lKfLtXJ;^U=rIH{WY6s6QNdl~MDUMVWMyZ_ z@{o|RyvFJG^76`1?Lon9Bb=Hz?0;d@(38BT{Du=mUx|jGlzyGL423|pFc*)mtWKIa z!MEf`F%;o)50Rhp8_T)Rx!k{h8>%yuBvjNb`4JDsHu+Fqj+wxiD5UpRDW>f%tDH4eP%8Nz(B-I zS1i)8W2D7va5zUiuEwn`sv-*PdC|CYokhUNjO52~6fhKQ%~#$Ab96 zU%@J6ewWJ6MhzPZEUMqo5OM`2+&uumi|CH{ou%C75dPb_$KkmcMaBIASlBQh4IsE9 z&zRix(pcA+uWqM>h5$La!&*5(*U31*yK}o9ubWDJ0VoJEmiF~7y)Zi3Y~BkDd;YEF z+-4()8X$jxPj+I|8QBYL1uutCuzv|pGh)2e8Le~PplPBpLbsHTdgJAD) zw&l^F9$wQA>*d&^1z#a9%B$~^{UxGA!u{9vD62|sPogry*6e5I;fu^VuDw^P6?&&4 zCIZL98`g_VtCm6r{{RUFG`~oh)q!yniC?P6PBq)#U zK5UzoyddKSDA^yYTaHl1G%7K0;3*9m)cdx@{mbdg6i}Rttpes0tOE(r#yx3?A3p($ zlf(Eju7Olj;+g`QoT?}BVsUadx;gH49WiPJ%@nD;Ye0{?)P&)ZzTHo znz4l0T~v}lANJ8QRA>aj)}L%|l#Rj*Urcj~KF;QR3Sy1|ezM7=)9-fd!MwtX7_aPK z^I%5BTSX*&#OWR9{NMQcB-JCVKoxH}+A7ZUU{rGQ9yTLT@}Eq#7$_%xHRsY_wO*eH zBU!P+fXCW)a`KQKmuSz4<`*>}6)g3NO7{TufeW|FJVl9Y;?hgaf6 z`+C}sS!JgYC#_$|tmnYy2q88DGzE3Ge04vGul{NzWINO_P-8Y6fE4~fiu?nK6KAei zej+N#yt}1cJzRxW;HkG|C>^Z|`fe&}1I7_YY;u=#qp0#lX{F~#tizCFEW9%$gkm28 zLUZ8~N}2CKck4<_B)~EP7_k_`2Do5+Hnci4ZIIln|Nbi?biie*9hpjont;X|)Y5X) zcgFb%#Mb|ucESU93`eiP4b|&HS#rsPT}R!7pkbMZ?#L9 z;OJN%c)D6=7X2bHm}Igp5u7_N%U zTdoThFih=R(c}Afzq8~WS)r);>Y(fs);e|5RR%QW7^flpdWD{+;0NfRuxfX{VIOSB^TP7sAa2*Ny~_6if9(#mHG%D&M%v$(YGd zFLX?2opO;&O8GQjd;XiCY2AFkHXwj61B!wDjCzzx;NCwMp4FeE50}=R>ku;S;f8CO zM*}W$eM#HM(a!J(Nn$ZPm9Z!N_N`k51(xaDYe!HSiMLxg4-$nq4cdaEazM{Y^*%Fo z*QC)YjJQ;2W4_v zmy?AA1lWJ{8cZ2#39hKtA+O#)h*xKA17ijatsnC+Q>GwMZh@ejCSR4s0Yx$aoHKeVi3)Yz137S9v*nJ- zpGWPBieLa_AXgujGxk5_*R-tP%JleIKMdTk?jn<5J6_J8ItspgKmv8 zpVb=YFi3^HLQI_K7Jw>?lxmrxb-EIZpaCXfjVY}s6~Fy*ju)rV>DOgSi&nsUh?x$* zZ-%~H?8hIr@2R46JrQbbM*`JG4+XR3_xY`;DD?nu3U=WCvePTD=3b0 zV1L7HL}%-T-toHDfuV=YvoQ=bcihjV&Y0f`P|_Uqv8PT=UbdOQZer1I`{>N+@7l(+ za9~nkpVj!+IRC&$ii2LQxMaU|z%;%17=Lzz6eHlq+l*qeV$+?ogM6ZVvp5Hr8qYA^}@0br0cU)g$`{Do2Dn)09l59ab|9XfTAcZnm`4EYy#5B(^U zR%en%GTlQ5a1$5sC>cUxe1N|zCIF6GIlM$ge*3n}K|sroi;NF?MGOusUj4%<9~RWS z#`Z=xs=hLq!le15l))cqZ^ZGkps5(Sc^3n4K2dE+5)X$UWF{ZB=+i9_TuLD^hDvSY z<0BGbkyN(Ucm-mKH&qnKkzvH+p;p49YSx?zuvxH^@Q7B5)VpB zN)9kj?%+WS!X8C2fZ;nXck-8RExKD3`7rkVwqeCd2lxGHg^it^oUU;&{-4+|rC|o4 zBJ{G`TdSwL0Gix<`^_-)C^Ol_nJjz_upWm5#rG!jSZ8kIl!iBBr$>L6c9tRfHYpoVZT!gnClqJH#QHJQFp6V6yK}G%sBEUvE6G)k)@Ff14W&plqd`e#q4lL#mqD=- zn8rEE<`Qv7CiM25aMBt-i!zsmsX9>J@j^fTys@Z;h= zw}3QQH1}a0h60g4oH~V8R8*a^1v!%&yR78uCW&cE_jc}AlMu>@go6rWK~d-&Z@9e0vZ-aR@F9xy=2 ze4eCa2&Sd^MKo}s+O3(OX)|L65l)%Rk??dtG+B6d!8BkLQ?hHg^hB^my-@|7??k=_ zWLiKKI*DV%r*QC#9gNPQBMJuaFOuD4NSh$55o>m}v*Zp($jyCZWn-g#s0dO_FfdrT zk9|hnL6#zV2M)IQAG6?VRMph9O}9{-h}H)=DIZ3SM{28yG4xE3@T9!z%8usxM?+n~ zog_;PeTalnuvyW$iwp=k3;PPI)qDiA;v)0YnzZ-myHN=cM3m?e`!6F8hsWe7*4UNB z36FZ=D5h2UqeEA*KOt6O`&;PMQV`%(Xnacj+S8{8`R02MAKqz~Kuysa7ei&3OopJM zCfP*9Pjr(MSlbqvoQ!lh#(WKAzZXf=rdcJ3x(V7%E~)pwM=d(?F1GQmaP>fn1gQjB zg&Per`F!3BY0rIQ7Q|j(d#KK#pG;=#wLbCav{w$uj1UGyP&O zce^P+3v-@!K-Jz~(e)GU9NO3XpMPmAhl5xGdr5i_h`@GeAS+rD2yxIInx#$ren{4b z)3!SL)u@Tus8633oaLfW=K!FdB4uoL%WD)_2_%^GK`a|_^vFv9|DCB5wx(-m zqMykGiG+l6u*?VPAi{kD^$heSETjgFG>s=!zANrc&C?cZ?O|Dhnt9_rL)K9ARB7}b zfUj9h8(~4drW2yU3Ub2I>^5-0o-SV`|8M(}OVDJX_a)x1TSbUwRfP6n&lK8{G6z63uaEP(<$^vUWTd|Xt-?$2FI<@x7hHm^7|T* zWiR%BJivh-<;evPNq`L-x`Zp@t_%hRUBMVwZ>pJ-uD#wY{H9fR8Nk3gXcy~q?>ggi z3T|BmjYzDrBbG~uS2T#ow}l=@5HGp$!uaz1d4(C$b+8Ei|NhjWf28#9!~#Iq0VO$s zQL#*xGSuz_LIW0yC5#CeYIMPo*d!L3u)g)E!vhzf(c2Q~ofIEz4~opq$x`4MMi#iy_qL5$ z%~NFaBfax{qQpQ9?;iW-=;$0b44cY=7dyL0T1|UmSJ4AD#j*fNfZo;>bBAx$y#$*=qC@7Wrv7H(LH zTU^oPC+F-EmVNemEV6@C@8xOdf0Iy@|5hR>sSys=oJLR zz*Z#>2)*||%*X^b;-J&K;<%QGDgherk9Cxu!Q9rve)0j8Nt^AE&L(H2DM%Y08Ltz5gcUFuLjcyL=YiJlw zFOAprK7|Y=obcf^bBa5|?~2G1#pTP_ug3wQW$*AN9}v{OVon2)ngWJK7&g5IaxRzT z@Nb+2ufBZge{zF7R#pMw1z`P9UxC^;_-4dEne*ncAW-N^?yk60kVLnYZ#WMIL1%a{WvNI8WrBlw`XCeCim*eT?CsX-ek~Jnxq*s zibEZ2eygp0@}ehW$854W)ea(*XyG<^lyk**at}E!HttdCs;}%pCL?eC!`&iCBTN-! zG`8aSLdCF<#HT*CzsG#f9eMIr-KY8_t<4HbYnyKyuAE`0@*``5@Av}ugqasoyoziR z+Nboh_sTo|aC*w;Im`3(S}%*-)+j^&gznlrEz(1N{@%7e{`|DMPb(u{moGH?thM@c zUHF%ZKMr!{k~vWruLtlukvj?GDEj%Qii+9qR*T*ceGTp5@7`thn!EE6vk?UcX#4AW zm-*e=8T0FdEYP03j40>_kRtXA&?}0IXmw*03^T9#j$m0Hqw5xzJq;kk>Lgl=u#_t$ zXCSw~R#(44FOG62l;bPLsyDND=E2fPupOmyP!Ew&Q&fWoHK*Cevw|Sd*$KV%T~5nM zg#1CE$_{kv9*m%v&VeHCCka4sQ?EJnRL&kipN5df=;Vzo|D)x~-EB@N`-Z$>0|qcieDbxyZ2J-~^-i6BmE_yZu`FETq^_p6924H?o2!678z)?^ z$hd_(llnX`>T|{Bbuu9>LG}5IpbMY>b0W&f!OVq^pFCk1I%-}YYG4pe)uG)b`tvU% zKwy5g`TPmZNcawMb@S|B^j_bt_%5dPMDO3MTDlZ_%ZsyT&ctl9(>ykl&`Uj=lfUEK zeY%NynL#zv1MAMAzoHF$|H(y?KEV_#nZyOW|4+kxm6F=RI3%11*Si81vOpJ1E;`cL_E4#g^fsPTmNlC>JC?gJjq+6#{ z%{GC>NaQD0Lm1nmJWcrq2x(=Ml_0ca^~C=W0guFZC^dP6;!G2@1EDzoCvE2Y1ho%C zC;~jzHe6HWG@Jt5=FR#=ajMnEcMZ9}f9Ze@iCd`Vk)ved8|^ z9$_0d_3sp0OUuZn<-cL<(eLZpjQThw=TCk*@YFYsN2}18FE0Fu*u6W0Q}h<`V8!v! ze87a@au+8jUw@?+C@bpDo%pP~M8%4g0XV?>S9M&6Jr%!xp{vzg|K83Mz1EkzOTHVm zhn1xQ%9?DWo`v&*mPXBfCTK~&GnR3)%{7KCJybIA&+p$^|7xLU#cs4`-@eVLO(`sO zU%HVlC4<9BvWWs#^@X0q!MIH{k)-f)S_&(TNsx#uv~QWHt|%NM%|rA!cCGjwFSPmA zBmL)#?7w@?&5D1phfrzze(HN-sE&Qqc0gN|ygRnDZJ$x2Qj0oE{lQOP!5OPJBe8EY zRa61j`9Nkd$2mBD6JINb@V@?zhdCj^UPZl#oaP!LJ-Ho0YdA@u8;?;2_|)~{8}~pq z*k*fIt{O_KEV3@9NWLIk+T+wUgV^+p1R)sYqQB{??+fhkO-(yIDhh}XOUW|!o#-b> zalW|5%NBJi-%KisUFP@h-P6|BpYrTCfM?6jLnVZhBSca&%`9$G!fWcjt~&Lz}m3kyf3?yk=<-KR^;|k%^$Mh4NO~7b;G& z#5wbDlF1Q+3m0}P&Nd;uYf-ZI{8eN>K#Oiaa^#4yZ~0(zF83U`!c0^TsDi>uen?0W z?QDIqwT_If0Jp+V@XwW1OMoy%o`vjE2lyX8z4`4A9Ltj1s%L#-J!9DOAA)DQ@UyYy zY@+Fv9!9ta|O_JD+J~IO?Ge@mNeX<{UQdtEBXG{;4El3=@8%; zOUEnvS}ND+JbdUX*1{`B?~)#+L9D>edhnaz36K8+2h5{n3%`8b6xf`oy* z8H~Vjv(EOCAaUF=M0yTD^8rg6^q+)TP5U4fsxVSKMB!Yd`}y=q-)C>^V_JF^ql%j7 z+9^dzJ~i8w81nFJ*MZK8+z`sCgPg5qPYA8C4eVoK}ic`@AF7x!% z!kvc{U1rn?`vWN*`J?iqXgMGjhy~b}9*!PVi+; zq|}Iniu-rlqC|9KSX58iCfo+$m55qAN|LvJ@yeC9Fzr}8%qbh#KCuTLYZ&>~CLFv& z7ZXX+z{dL@#?7A*du9@9p6L;4{&zDnUQYAcmVM#6SID(1->ZmqskwOCbLDZ?Opx|% z7yu9@%ni-?rr`YL`t2H#bRB_eZ2;;<@FW%kkuYK`AzncACX%}>hBO{91YBEibI@V# z9w)H(jb5t()9T$)?zd^)9k`YgbYfq_OP4QehL{Utj!Fq-c}gGn zi^~FLjBLg_Q_m47n3m)QR|@m_{^iCGD&rJ=7l6A#V1y`ht*IZUC z2Vf6P#iZd!kYuu{eitjYdH$t>76z13By)6Vv@z3D+-1s zdlKP;+)+}2xn}2NHkj|~s-(C3hf-HugqbRnv{d1*FhApk750Ws7G6iDhDSH7Wd(@D zkBdZ7Hz8Lf8@V9!65(i6F#KTr$r~`Q!^~t-B5>c9s?Ga?L?NrLeZ3KWS&9*vf6T=z z3=|g##Ry8N_b<}Nkk)KWk`qoomg%j#cYXWxKeS;(Mz@CEL|mCFo85l90$h*Z`3)H~ z;B)V7-crn%OsSqXn;Zq{1SK^|-bCr0%PZpw+_2PjrY1GhQeD1|Cp-a$Q%R#opsD8X zHmQ3QAEm9maG-ZclTACx5AV~*;yo&v`%N(Z6sUrXN`R7N;ltk&A~K9KdmKOmvbvYN zKZ=e4RI2`|*58}XnFTQ-=sPQrkmVDcK2itgK8)yWJj_UHZO`@hRGPGE)%j(UlkS9m*tj<_1U#(zq+93C2MyvCID>ZU zva(RxqYpR^tWRk{l_hVDt7Vk`U(8vx>54-g66}UZM?p;`lEIi5(C%RP2rx?@wYd%s zB}cYQXxXNX4&o&MPGyvd988U;pJW6M4MY2Fmr&(HX;mLOYpNN=UTE3PD7EP4ZJNwx zN=lONDC`UJORyb#JsUr+K}nG+F>wa8rHzCHk(hdpa|xD3L<62GVi?h^OX$q8DMzVa ziFl9!iZVhq*tPC&spHcdHzq9JS+R5g$S%YbH3P94FKM3GC}%EQKz7#*s*Q4o-<5+; zu#NwOY7ksRmyL%!mUw;W64$Fg)}sKOk#sn6ovwrH`~6!vz06xCI1E!)54GyAyB>ur zalWRU;p9f?woN>BKfQ#)iiZ)yq*4++Wu;RuplLUv`-_G2^w-O~HzwocjHFzYvNOTn zV2PZ8!zEpeGmN9ID;w((pMpHbm0~64wHy~DGjIscH5)! zU5_eTSwmwA*a;e=gJuqByPCCWL$FmNN5>cbjtX36TKf8}z-7@cWNYSv9$?tX%FNs- zg8sEXmSSa-@L-yIRvK_BEurWu#SzF=Etm#D2v8r^CoJ()MjB{jU1^pk2XEh2SEmek zOFIM$*JQomN`&hjX08g*j@13d#TSY`!fwcHQ%Raf(hSzKF;Sdx+$b;KzrTsaldb|= zf4c;~eNCSba|n+zRnHOd zxI|rs5PU(w`6=C{{^i23cE`I0&m?&jnCH1IwR`j!>$VO&S(QGW zyI~<60>1_#VVU?>|2waK06&Jes%dt&B!@0r#%4c%K1Z<^c_V0#uhS;nxvNX0E+r;p zB~$Oj_%oB*gCj~Nm#{|)Nt`j*-3Lo@Ux(BKRQP-j0(eBA=c7Hwppd|ZFE~Zyk(qek z0L}XDRsWFwm<8K$w9jDvluXy-2mO<1KjO^IV?8s^5kd$)LJv^+v|MlMoIY>;Ec|1w zX6X%=bxb8E?~T|F$<0QB%Jx_C+eIb*e+l;W$tzn7DEmu8~k*K0&3DH@?}0yq&jKbyBFt^u;TMmtGL4I&-* zCk6N{90Z%_O=S#elqJ^8CZorUz)1)TlFR*tVv2C6Kw4`no{Ul5$3aM3ZUPgMT)Mpuec^D1S#1Ao##i^Me1va)@AEa++KB(mUnt zaSrO8pCc+Wj*-np?^w7e>{9et{@0R&=@(Oq+h z-l23MD?m^*NWu#3;hY3M3avB-nJiy1TKLTpPXBYBt_ER|Z+drqFFhj~6bwCR3|st) zM46HwYoSh_@-R43#Es}GDia#b0*j+Rf!v{p~Kj4m9H8DP?ym*)&EdbzGRRn(Bpo zxTguwL>=HH6&*zzsFrkl$Ydr`L)W~s;Rx)u*$FY)c+K51o0^i3LgNOQ4Cg~=2XlH< z`;Q0Ptq!NET>#;L&d1PJagK3sqof8TLFN$B2v)@DPmElk_h(`cY7RfepgsCpKw^@_ zX3*=xIw~Kzz)C*HLNEGq5WgSTOotD{7C%xZq6u*ax-z+YX=`@v-rZwpDsf0(YihJ{ z1aKsYrku&HQvpw8G>}>!IsQ~F)|khBn--VL-xl>8ouiO5IY6I}aKqC;x8FGLvbM#X z738$`^0nq@xwG&3R11rFR0EIP*qbSG@wt0wdQV-!}DWy63l{*U-llNB}OQ` zv&v}o!taO1i*-c|; zw-(nOln2gXIjsR)bhL(heFvCsbJE!J>vM4h+zpdm$W`^WbJC9B9esaUKB)(r67f1u zi}=m_*%6;fXb^b#g>Ti4(sq3u9tU?EG{G|Xef2d=M$jnj_T1;s&f`d=PH&d8nhu3T z+iA;|oi6c<9kUjCS;BCiM=3Br-b`(z1QeMP^>jd1CFHNg6ho}2 zkIpV=BL=At4=noDXJ=)dCijOTlymKZ!>jw8C7jncuqREUgNC(}nvVQ)t4){KE69dj zI8UG>UZwY%`+MB#8+9MrUF);^5Tu--IlqEvgq?`VqrKlswbOi7-j9KhL;O`B%vexk zs0}vq2DT!YPOL$7`wK!xQZzEQ^d>)9dK6sVQaw0Nl_BFa{3VkvJfd7hJ-6N9g7?~J zFc8)}_-_`cDBd7RI)WOpQdh5EVjE|r{qnsZIYzf{ix-emk&QBN*f5Oz0wQG@+OA^L7Q^QDDCUlAFt#VL#pr8AjRwKkc%Un)I|E{<1 zr$bcBol2X;El9^CH$Ba@TV`|UQ%dUyiVj)9d!yTq(GrK3Y9`^jUXg^E9!AX=_*a@EeGSo3HnXvVdhVm$He9N}V=aVq<=O6OE;)rnCn? zuCHkzK2LjM2LNSx`KADpanp}(xpu$4z;-Nm7^OmUktkCG@(|@ZByi#q&Ja{>Qa5q; ztRT5uge^aOGz?Eb;ltpFUPlTWp06=KNgPS2&rpV@*)%nzRlH=63`~Oa8)~5J4#YUB zt1I2Uv{^tl*e_Z!(^eKVM=b0?k^kiO-v*M>+yo$znq3U7T454v!n8XEQkhj7WqF1< zv*2h;qUq^*od!&Z5=$a*Bv04=s_(4dL#cIOPJ%dF=c1suOXvmQEj2ryM?wD3fJ4Uh zMie2x8Y^)SmK)xVWD9{b(uQy4XAVH|IALd(Ni3sBRP~hGV#v_EV}wqaa^*GcFJK3l z+-6Q8YJSn-aqezJogz_HRNiq^sE9@7v9nB1v+o+TEYQE0(Z|{Jxjk+i2_dq#KV&?U zqiff`eOa;w?!47J@$9PKm8`-y)H3GJ8i^>AHp(p43h}qOMlb&pdV@mjfsl^Qz?0A~=!fizXcC-31*77yOJQ^PlMonSJ~M0GO54 z)W%B|DgY3FO@wEhDWQ4>F;^a`_no;uI5=;%N>{27frqFaM6rsD%oNNJ)Pg<&%8%yE zGp^&+somXy)en)Wz^woZmIdrcXF`N^1bl_$kF&OFZuD5n#s%zmV$DgtE(SN8Q7d6g zSfIu%{}HJ01+e25lA?l#$IrO|(k~uS)J?y0{?SNHDqojgoB)2{iws9vYaUnXg_VWn z{_S*f1`i(0^e$>dQQEMR)E~U1f(%36!buuSHHZ2D8ek)Ju5hN@kupYks|CoQ^Lh4aQ~j7u#;AR^*!Pq4a?;p2Y4sGJl|IOKSl!Rl^Dq1X z%*~!dhx%$Y@H{du!IlvN=D60)pZyRmxZSyJa82`;EYUw1M9ozBwA}?h1HS_f>_{Y$ z8|_M1hLkn z`7rK+;@L|Vm84#>9LmI&Yp7fM9w^uK3Cb&^{8D^+7L6xYhiuQj6aJK`LIj~yT!+f1 z+H&!tUZw(-@$}7_qx_PJp0RBN0Cm56_x5dm&%$*7dV@Y)=(wq2#J`3x4x_5VOpHDYre}#j_ES9snGBVKtGbCmr&p9shZ%&p?Zj$Cmc~;HG;&Tm_+yxw2lKQD!>5V$Xjp?fuFmc2#{q-UFA!~Fc z25)*#u#g+TTP|lV-}NEu9pq>^X;7j88#ZhrtT(<)%n<#)kKzpuU-4#}cd(RQ)Hf1_ zBq?KTO@Pj=9p0;VQ>Zv}H20_aYKJ8M1qrsZP1@4oUcKMF4hfNPlx8XlGT(;|R_v0y zy*kqpc)qu!*qgv4hsTc}ONG3vr?=zSq}6A*{lI27S;f5>Q~$G#0Q)$lk>pY`(%jLE z8hh;TO*Uhik5}Nl(QCeK<}X}T89cpA*YAr@ph26@gDc6NQWdS@7>47nrWK z9tZdte2^UfrhruvhA0vSrnz9cQ1bBb7;QQOwLK?K87()})962op1+vJAYRJOTNo5+ zMBvtzk9){9&Ur+kEfc7y(FO1Zi)N0|L=F#Rm6e_2l_S!;D>qWmC;Qc{0tKQdYC_}h z!j_alz+X1s^wGHQL98HKvgZ4|(vWrE@IA@gN{*T?BUj0MSR9qcG=GF(zdjOO{e9Zm zHZRxXJo2&d%WfnTp?rPdpoZ^|_|8K4f#{`?L#u5tA$edpNN(qIXHe(D%{;osw5dSp+aFC06^sGc9}VGDbW@kQ*pOF5xzD4rzvL z*JFGKu37k~-^WYF0RzdEL(e8NXaaAS^ZGqDr_^gVKts}&^3o)#l;LVUFc>4edpqWaQn| z`WaV!HZ_6}#G*B3c{L1O3hcshA*~W~mtH&Cmi(Rbsm3<8svt`u2SYeO z-`ZWYSETXl<~tyTXBPks1tNS{w$!jJf*d{c^b&JNuWOwHc`wt~P#IQ|hTFV>7WO30 z7%8L}!GN2JQWq+?k*rIiSUpT~ySc<1Tl%|G? z@b%}<{Z8T=x(5|8{y`P8N#U_F8V#co7Z&=$h5rpErajZrWyA+7RfajFt?nGtcO>ix z?~#D1D$Y%K4A`CVj0z&3gbP{Mz z?P)m$qzfAwNSfcN0LugVLV5(_qmQ>Q#Xs*xOCD2=GV7#nO(?;}VY zm-{>J2L!y8jvB^BF2mzHM~8m*rizj%GD+~@Vd2bTtcjC0!_Oqk60%y-2tdV<9o3SQu6W@Is696u-?5VP8)$j?>TLf^rH;@%UApvbKi6?< z2*qm9!$kZ(_*4O1B(4YzgRrjX)=(G#?>uJ4E?nv{4ox4klWev@?0kgd7F6)Cgv!ot zm(PFT7ea|DQ}1L9G7A9oSablKM-+iU3R248ySdE<{A zJly}|={(?i?%TI-kF3h>LP;edWDBV@RJ27Qq*O*^W<_KqyOc;O(U2rr7e&elsqC3m z8c1YB>Up2{egB{P^?IKBe_t2%`+dKk&pD3sIF6J5o5%Y0TzjEAHn)T4l|~{Fk>k>(XG$+{6}P?F zzpyfP<#k_3GK^|pDLxfxl4=iwbym#PIpdH2IW-KIEy51pc^kue=EjT`QO}w)zZV)i zrHY`<07L?dJ*phU-WcVz)v&D@30>i_)$Q(aP5O1{J>bNG*D=|V<%42GzB0ucy2uSf1(w@051^AE-2J4i#VNvXLdTF zxbIfnZ9^YKov3U7d9qIE{+2;d}GQ6p7(+a^YH(w=&Fl(KV4V9sp8HGyH)=XIGUd|PB8EOYGx9F$r8!!s9^@Syz6+`+ z<8(97G!w1F$w@_C&At_R_}IVcdwc2Qn}T1i_qrfN92SkP~V>wnlO)eeA}`NkRpy ztghjYNyHPJg{dJu5cU6d<>A&8gVc5J=_@&uY&$(}=Q4)@kPJcv!yvH9SC<#Z!Q?68 z(BFbk#3MHaaT4|>|K$c{i7zeM8tJvT^E}80C#LQL_w5Gyw`R?yC$@c(it3AIszxN2 zm2`!fTLPPmWLcuxcR;^T3n3^q@AZwXjW#uuKvNSwoB>yn+64qky5kHiYs}=kP}BnCSG}75*8fMk z@QPutn%H0yE?quVJ<``~zrDBSP)XdU^&Fn(Q+K*S%wWDg7crhsLn6`uA>&>tPZbD< zK}omKD;4oRgQYSBw*&4a%>&3vf@4xA@lqyy^DZ|DUJ)LClVSGwsr^GOB>gfw@!!7a0)j%S%k&UA!Wjf%20ZC94fnoMGRwS(bJ?9C8p6m>aG4UA10!B5L)g9|C!iw z{KmG+p9r;uRvaQ)7q%H<0EPBR2&E*T1N7XeOAtqWB`cu;-wA=6SKbRjgOC_sW%!TEe|~HfyuPU4n7tZxn?ho+OeP=ayhNB3~rf7iJ6V8hPu5k zC-X6RLwtql&0=tD16l*|k^MzH40mN)XO`5Jl$e5F^S|M%4BkY2r^n%_V|yqJg58b89|oo&zd_i~43of2$Vf#8dgZ-NsZ;08 z2~&;prWZAs-UADjCtTbkN7mK;O8wOn2H90c_F`ax_dYXUxFyD*!__76}U+2#LR~O(v417 z2oq@K;dQlDW*T=;6E{IwCvuXQE<1Bd#SB4K>TU?(k;Qk0$66kq)8gmI8}}Gq%wwR+VWk+&TrEj<8P4o ztDeFEjGDGxc62k+DxfEXGKihxEG{j%31YV)d%uC-ud-nh_>teUlPAHK#A|d?>pV^& zP+QMo!#bgr0|MF>6chvS2ZPcVG1}E@CCH3rKMpJ&pr96jG8_RIg%*s>7=p>Vo!Ng)JJ{&Am;HdCtVr{eqTj5Mn)b3*HBCBYC zLdBO9XCGV_sKK{`9a1SbKf?J&jLIL`3bU2p$c%Ik$r(HXWwWy7x*Rq|I(y!%x4rM3 zE;_05a_6jeY$%$%`%p%nlcS1%Xi`#zOUglRt58vJ)TT6R&T!j}|0fg-LQSY=g*e;t zWkAU2-C`K(L+oLuwVA->qPc|Pm(acSeL5M5Q@0y9RLt)Tw;i}z^wjo}SA!{+ioXwY z!L0()NsK~4>WQ&HRFu*7z#%KjpR${GFc4p=#t>|JC_zzMD0zm_)IjBx-6}lwjy4&P zj9F9_#1dN>l0ohO0Znb~$Bt3_uBK}>{=hrrB}C(`vTBzqFb^RKg8^rqEf4CO?ymRm z-?1n^gXtInlo3?n$?5t`{O^fnD06iTYXq8NigOTvTBxp|Ap+}CUaa|Db{wb&g`Xw% z0WejK7~4>+GvX8TJ$@&v-hv@UK+(jX`VBZ)Ow6Oj7T`sE zwn3_2zA0ofO-?@>J2IdlXHpGOOpH{Q5QS*&Sgc>$0EXPzIl$tYTlK@JQo_<%>xU5dA#53Vtg*_K1n7o`SoY9X@*WKIryzJmkDcyvW-)lw62@5Q+RR=?4|ysP&*F_!!cc*^xy=23~jQk z$wa-o^#~&XL(m_gM_^=9d2|3HKT)ZR(}c)nNH4%6K@6zG^8<)ZXD9Js17{1`zwqRl z(!sPc6u}4sLCVJ0wCx-M;J}35;jwOi7>D$MqHDBb?5I)Br>afIk3Z#GEU?$K*_J;t zp90t!Xs<6l^6$lwL1?4^o{-_?W0EKaOR_SA$qsZ_aiW6T%9N08=f%Wn7|omMQ5vS4 zG0CW}`;TP>Vg$h(k$W_12Hg__#3SaLz!;^eLvDE`>C-3a9tDtCOP51d>X;PaWfIHD9 z?&*1Zj$Ufi+p@9=2o=ROG$*HF%Kp{!9wus*v=Jc;HN~o_^C)p>x>Z9rUn2d}{|d?k zinkTej`UC5L=U!}UKy$={XY@a3qmY^g8(it4s(V4VFi5}?Cdf~stFMcFt@6HwubBS z_~4&X1- zK-sRTg3#!mfsCF7k>m+?0URXeK3uXWr$1JPkXILx9Hh1o44Y>tlvYtr9XYa|9=M8? z%(WHcEF119ls@J z5Rad`k}TdbLRi&*6Vf_`IXv(gmsT21p1l9n=TJChm||}0(f0~v zC-Ca&e8ZY4lLnA|Xj~b9pFDmf{P1C2Z8M-WnmEpkUDD+Kd?%A#nZG`o9XE8vD+Ye; zt7SMV%McW7EpGDV%Cz?%7_Cv~jU8q1L^YjL>js?4c@$ab2Ccs?O;{Y+jW4*{T*GMB z)VZ7pPL28=bJ=2L2B^jV0zy>ZRMt@;@XGbM9v*w~h=RPq8N34Xm*IPP^!cTgefQnM zz^pe!1pcEm{oB{CnB;2`IyfRS11tEK&$_nPJqNV*9B0}ADSx4_g~PezEybZ3krDLl zZ$Bw_5WF2k+qboHA=n_hFRt*~g%l4;egs7VseS+N3|vs<43ZPElrp1)fyJn(BDERrA*}AH7&a7Fs9-4p87F)8UQu%%G#c_@*Q)gF| z_rkz|vY7HZe}#A7%%ll%c0x|&LO>5CVM9B(T{~v!!-9(S5vTjXN@3&zP-=yQ#FZDN1m>_inj7b)dz3SXDCH|B?^)R5LEG{7z(3-xjsOa12 z@6v`93?*oXw$^#_&qekJVBbrICs<{2@55H5zRXzr4>Ok!;{h(RXWLiJ`ki?TH%W!S zw~_Jc7D;muMiZln)Mk}FLJ&t4qoJ9zXFMc3Y7b&<)0fxyI3zv>SUtd5=#!bFW}F|H z;+i=_XXDAwnLr2VME6K}Tk(!QX7-c%%s1<2)L&wE{F$}; z{@l++4^x)Fe$N8w<`}s^<$OWzPF5U`7f;& zmExC-%`o^k^VV5}Hz-GteTG9H5yu6e9lssd?x9xXdZpqXdezZy>XqY5l`H>E8LvJI z)J&|YkQclmP)c1jY0}OS8wsDPRxfRpK;F{$c2LrVdcny6xEa`Fx$xpQnCU?S8h<_XNm>s)R=s=LwcCUFW}$b&aej9}t+kI$6< z=#kdw(bEQoCaQbK+1(O{EWkSABV<9@d^c!&B(iYyLQUR8I_OBdHQQpmy?y)X)2Gvf zY6klOA$YQuht4i$L(7!8_3)9@&d;pwOouI2p@Em%5bJ&7Zq)VGZ|B&xg1WThay72Cz+L#Z zir|I(APWedJ$r@`K^w4p!}j*08lxSR;h&hj$PO8sV(}^&k1TM27@Uh(@JmYMXg_7B z_(sv%y{_rw0|fGO14;&oOnMFYzw+HYb1kj)5=@;fhmXc^CY~HoBf0=pan)ce& zY-?V5!eT|n5C`Ws7I9+chRj8p272`C>_g%CRD~BtbW?4Q6!|UlKDpcYh}k;V{>-eO zNSWtfTh$zO{Cfb5TIQlL)qg=Wm?V|4ZApv@=na6mw~n*R`GeWVb*j7Y(SE0oIMs9V zbB-1fUqzQoL);UHhdU@jI>1AXyu-(jAJ4b00rnP3Bi9V((9&hgL}3j6@s7TUA?8l} z`1r)MowJeL;i^9p)kLW`%;!!WDOF)evs9)-abhbew>$2O?UX#}cB zMkwtbtW0Iana#Lwu*`@uLY)QpXS^uLFRU;a&3_|{j-NgI!{G46%V!4J>x5?Ag59;7 zr{eHr4^m!-F3+jKWq%sr_=A<97={U@;=m1O7nd}~(0d;4@9{hszb&|l)W+MEu*kf{ zC6B|)eSP1O>AdfK;1JQWZ#sIi{M_UTO1!m);FnVKyi|0CP3!N=Rm>%X!|j-P{sf&V4p(v(RDn zOpF|}x+dy0$1y7=*pIm*gVXH1ha9?*>uN_xy5MvR(A%=TmP`xjrX+R3+P!k`p7n@a zT5DpT2|zto@f#MkVEsrdIN9KWc(m|z39_b=8h9~MSjd6mBCC?G7EjNzfWumR~!|EvbFU+y|{FLz()l} z&a&o!G3mA*_CQ>H(?6Y1u?&UE*(+Xq!)(8!+c@Vi%0;V2ZlOvMqevR=%T7gaQqCmQ z4nu-?3jR6YmUU!u34nik-Z=}>EW1~Eb_V4Y<>lp=|D9i2rp)8@^zy>k`8wzYBIZuP zouIe@Bg>vo5M#R9&ieKYe6ycEooba&TU3QvOe@m{p`R46{%5rXKT)7COv-TY!G+e1q+oUwtl6Z)d0-XTElE#cW3jSeSqJn8D`Jq0l@rK6{ zZ+PI)fwxAyC1h@8At0;hMdgNGr{Jhak{K@AtP44|G~RrU04xHQ5EKHV#{l0RD4njp zN18SV9oaO&yuYQd>B`Gq;48j8M~hUPxE{!$QDi8LI)w0a)8kRRt?`b0+t9$|8JAVK z7t(f_Nx?qd&*JswuvBT&~u2Mgo$8VAXfE;Mgr+G6@=ik~8 zEGzLEi9M{^3VD&ZYZQ~qao$qJY@HLMxqR&F?|Pmz2twQDA2g6JNDuRsz$kDI7{UX+ zvP=cQhirO1tQ^lASr>(?KVP&rWun+Y!vfhg!+9txlkeTzMa3+0Mq67Ya$YZ8-AOxg zr^huT4NjsV7X}O?F&6y>kl>MqZyH1Vk4cGl)(z#qk1xTFR_Q^ap1EU#6E@lp=5H<^ ziNg`bJh%@T=6CKBYGE5N7M~{-6&3ET!yFsZK(Ai0yG;LlJ-0%QdGKp|%dH^ifpQ4! z!$T3>9DR$}{)(oyveFuw6+DZiSxdH ze)$hVVP8vQ9lPsHH>kn`_V4dRv4V+2$eAe)=Zu5L+1u{} z({3>-D(JxjJdZ@bV|ICwrgBT3rEG~Ef0lgg-E1f>ej-3PI-$Ktzv&|B3Z+YXUtBEy zjRFXSEmecp*}BK*Db+SZh7JwvDPR>hPj$hN>bs|xP$$NtzGHA?=;9*sQ6`E3=uTQR z5`_qAWa;Js8)f0A+;-|JJiJz-p(B0H&K^Mr$&5Djc}(JZU=e{f_*&Xg?sMj#zUlef zE^dKYnNHBooo(S&dC!%x80W18?nmIJqU%%qVW&;v>QI~9ID40hE*1N!Ro}gj+9jy< zt^W4y8gv2rRT)Zxn6O5{gO4F|HC7TB_WR|KU}uuNCs}=lL;r?Eqix16zw00l5TEa( zA_idU)#+F6^Y$yl%AFvt!qsBl2*c_YT~OD7GaJClB|feD``wA*p)ps2KDYni%EK6a zQ47X%bYanZdV34wR*)x&Ai(p?Yp<==oGMBl08t9j;$eU5!^BFFcQ5Nb=z?FfGDaPl zF|G5vd9CGTNcAe6al>EQ((MsLLrH_;zA)zRnW)xSOQZHbFjLpT}9Ll zJN4+Bxc|YE?DSOfn*Cqe9zRVASssJ%%jaj&mf9wFQ|{DB_L@>q z7^Mk>LfB4N(En#?fw-oN64=7|*r+=?3L*8IhJE#KrQUk>N>xhw{8gof}25E(N9CE z{82K_(PL=9;-Ec+#=M05qSe3ur+rnY$eqw3TeGQRlfBFmLE>k_$XkQ@UMBmrBI|G- z=7iJ8N_~i|f+o(2-$fjgr3(T$Gth#^i>dsEBim(hs*G=Nd@Fy@htf*)+9W>6BZsJ0 za2Gdc?Dgz`eNz=W9vWUC`)j;oVHZL2R-;IVjUW-5Jj*xM>esI|YnbtrE_;x0zi9Hl zV})(!0KAZ#2QixU^>JmY$*r6N84NG&NYRK9-IdbUl+IxUtO8;yIgc!m@qIB=aPb-7 zpGm;wTb*ZeLSfn0DbqNR#vRg7SMVQ1Y_lN3@&NEp6|XjluY_xf^~iBT{A%Gw%jB6c zpN!e4xZGI80!${m+b)QOGr4l`uXymgB{O;2#Z(!j;zYvR%gvLKh* z3kKFeJ~A_L4JMzov-b4<{3|RnvPtbA{`^P$2ALy$pxBy^%w5ck!0#6S_&7D=&u4vD zr|4tfgRdZDdxvW+X!fX4qd;y&LML$)x(8guJ5dHvv{Qv(vsAW#fW2|zLb2Ai+lVVX zf-=fYGM}2Z_EywMp|?A=O6eV9@offOnP|c}qFcCP970wUV{GGXgM%1D!>K2S`1sv~ zz^=Y$&1tWzV2|w6Y*G}8GYnUei*pJ;528yT>sAEl*qy7SU{WRmB2v2f%etY5Nr7(SHC~qobo=Aomhc2Yw;c$O2TzSPm4v`D=z+ z4^S=fzLu~f6IsEGl96@aQ~X<=y$8~`_1J2f6k+LyTZw4{WUUVMl?E#IuEE|gOSnWkx!NSLJ^Ij86%T`GG(*I<9@?$QTy)!}q6wcd9iI;;k{&(_& z0hOzE)wdLl5~V0aSxs%%+$4>)cFlq8wRLqxFd%E37A%;^EYRd)cNLYO|1NH3-UqBH z9Bk?opd-;E0tJB2L=(X&02{Pv(}t5HA)OFp##U&~bpg~1*&aio1{vtC%d*%{pFZX6 zef6j9rOlh033(R$j7~#fuVZXw!{6jC!~(I{kdzPNjG_Htc(r;vD!J_-7&89QJ1g&; zxGNw%7yxj44$Yj{bn=`ki=W!Iobk6k-cGU)nEAELAm-1vTD*7=BuZH+NF3cdHVoT+ z5?lZF2??#MK*e>cFH!_Tfwcq9@*P0;?v~z$y#({5(xi+Pb}vEC+t!oLMVu-a9%0HP z@&N(|Yt+(rw;MQQ$eO;%6Z{%F3+9Nl7Mj#sCR3oR5|nA`k)(sk4PqRXdhLi#`_6zO zRo8A6`*I^+d7ZG>Hz@Jr z=7tzN@XV}S#{|^KQ9*20t7)sq)fPq%7|#|&z`9S z8f{?N4keP(&!Yb_dfe4-@Rk*<6B7=V9_(iAvpR~1%4EXQ=BmFHsa3qA7xO;FQ=m~o zR8*1wr;CM;9_gObsalamre)IP2Gj#+wFl87&kxb#OtQ66-s^pH)O1E#JAO(LIWLEo zFS`A?W9Kv-BOP7c>%aj(XCmR|z)Lwmn0>n=qw4}8;*eGaSb~TRQsX}4xC(*jRC#k}$y>Quuvzn5irlmE|%rM`BB$&=nc<6Bkp#uPN6>`^k^y z1A{GY(Q7-&*mxt|NEKohF>W_~crrG2BjbM(t4V@GP~b?qM}GfxE<&K*8|p-%=yQ7= z_0woFp+_YxnC9QY!MTrWBaQ@Ca96~KB_*ZO%s`cbK^Wx$>m5UzBA^6(gS5^^ZAP00 zl%7r8^5nyFL8vemp*f^FW4vW}zzYw-f&6i{bH!218rDE)1=rN#;A}=NO`R5-< zs8*ll_q}vQT&_;rgH$yV*llbSK}Kdlc>#_4TIpZ!@`7DmdqmubKf{?bXT)iT8eS-7 z2t8oajGdA>oGyf~f0#{QsV1Wk6Cn+|!uy=cfE@g`z2z34a{bJ{IZQgo0({;;#R{k@ zdtaEsm9l3}oFvjHv+dg?X6ifKX%yEzBX?Y)jG*Ge6a5DN>Vm*DYVD7%6df^D$vTdq z>+(1OOBlQ;xW`j_i{hP=mN2sa%9ky`6-NP_m_mFeN((aUpo7J;te%x7k+_qepD(Hk zcrP(YN!#ImlEfuyAPa1bbc;q=c6CyScz-VjB3D8tPrEECTYLKz=cvB z-R7Q{T+pEm2R=m6Z%7yucP`d?Dt(v;J|*+U6H_+e#{>V@bzMy$*!m%;(%T|W^1qrw z+7{m#cI$!f31EL=TAr{I80&0me1XD|Mh7gpE2mjn7m#ZNSj`CdSxi2;c+56DpP%i| z#d=G!1&jJp{;)5g=xtQr-woZb);B=`D#$g?Up9RkgKxyJo#pC}^uo3pg9qDB`$$79 z?zsse=R(_X_qZFgux^pCNW&uvJ`^>1V)6IrQK!?ltS$N zi33R1)yFZiDWP7wj`=z>Sn(agb?pE{;|8!Jiy@!JfbGJ076Tn9ZMP^WC|AY6MzT?V zHQi6zj<@p?{gb*~F886aU?prjNWSDuBHV2JA!qNc1a5by2!zh}Au?-OeV;W|IgDyg ztp`Zg;|sDwgz{8Y6O9>jx!vcvj=38sHf1rMxMw1orytXV=75TA|7tZhr3)HBAt~f; zYPXikLl!JpFh}ozdGmh=v6O2xoCDrz@a?riS{XDE-p<^)!o(VMnqael^PM9VAdx%! zy(2=P=K8yZ4FLO#Ba{7T9yPQqZ>BP(wCN}wa9!&Y+CstF%pp*C`UW@{L1#PBjdCa0 z6giVe2L9Xv&o9aVnSMeDxQ36haQ|I1#X~ZC?5>0auM4gAL(33(U`LhCSYio@lq=9` zU9X2)s|d>%4lMTyId@zJh=ltZfRCaJEu8o4E#xRbQ0}{;GI8{WhAB5bpjpwm6eTbj z63&}L(2N*!U!@7eT1uDrl588MHj?oi1*T}O zIPfC0(e5DoMJTFZ@cVsv-4KE;nuk3g2;0;i6J4luFw5uAbQ;qK$7(?+$sc|HjwP7t zT2z7SiFBIR2Yo{0BlyG$K=B;ctPLad^#wc-g&)y2@YQPQs(9{yY2H3~a_$CzRQAc{ zQVcW+6?i>c>x6~#Ep$*Ca7ECz#wB+fx-g|sn8zjukwcC;!&DTk#P=!UnR_potsN-??3U;=W= z-+-EU7i~b%2!|Ximgtm}l#=W?yE2!^sx2dG3oGHd?PEY}I67g~E}FAHuM6{!XM>4s z3l0`b8K&k!m&M9>X6KZfL#D@#y~|JB@VJ#fogw&6QrB|8^{KVb5r^}ITdEJH_hvhx z1$aMIZI*r5ig3q}rdU%0f*^01L@!^|wIdTrQDGtj;V|{&9#a9NKX87S@9=%TPRvny z+s(`d>8Xh__X%WDd-DIf-~~cUBC(==<%g>1X18&}wRvk9XD3$5xw$$^G7DoS6dRgM zLEf=tG=f3>xzos8UsDcz%gR33n|A!D|MAg6}lP+z? zKPgKU6K%A?%r^geg{G0V12V8U@PLv(D_ya8accNv`yKN$``r1SF@JJXoMurr5WG4p z$9filX~MBJzlz4u_Hv^;cHMIFq<})QLUH~(r+5{|1H+Y+m1R3s&gs_&n?d@xExZGC z1xnk>D=N0DPK8|q@<0$1QaMM;ea1Uz4nlDWG`dRie@fXwoRXf0ZPkFi4?IdOEiAGf z#4)rBe(Qp9u3nus^J=3WxJChK0~s(NYXG{G{^?OW(NQ45`G*7Q-R}@jXC}=Q;}uaG zkNsKy=I@?^8#WkT(C-|Y9Oe|#!v*ig(9j$da^oLOW9=4WCW>2Ve|*(G-NJFg!G6EP zhKXbwSO3515&8DKSl9>BnnEtz0JisqN%!laLvK)y35#&%j_*Hz_GU9mmwNFW!Z<~o zP^n9GJN5Hz7NIfXzC+vdAask%x83~!)mGG4 z_(ZZg@eX7nvATjs^YKJbXhiUe z>DhEacyw>%VLNKKDtPp$gfd>lB2v{dRh6kEPvuL5`zo9cr%auS2I2yu80x0D{38rn zHaa(%KWB~r_6bfYJ%AxZAcS8Q)E8mnQir)?F-Sb1ixQxMtlnwgv@a3XdHMN@6wCA+ zLHqXEU$|RWC{rJ@Md&L9x@8@Bm$rWn23=oEzyUO6W}Zblmr@)+{}|5>FX`faU(RxE zWsm9W^s&L-9mP~GJR(BK^RWHkX@8nVu9d=0bkW#kVZ0&j8kWG40^s&Bf)bV#B1zr@ zeMb8zLno&&o_rdIka>@0?%cS0-U}C=+&w1m?p?>*9+ZBp*O(p7(|0wA1-o0D272;Av^ry661h1U4ivIToqd2DR z06+cH@5s(2Z~~5kF)2QG%pwjkKL?9?Yw8YJgxtXXm{m_bJ!RY|Sf6|wf#rEtBLKi3 zr$!L77_Ma@{;7sqa~Cee-@hjpNOmAebwNUqoik5Py=lHLCv-EUa`;a|VF2ynqfQ`# zKd?~jc-OlwEY~(J){wNru2%s@ssAY~M0mRuB`sAyOte9NU<&Niwu((B=`XDAR!LGBtAxsYjpwL&v*BjbOVs*RlJ$q!sfCLBJ zKo~cO?F(TBb0{5ZnEE3HZ|hCq{A^Dh_s~x3(u_NZbNb8RfJbQM68iYL_Fwo@rQ)mlg67SegNb4~IVI3w3;G-46myNs4{yOd`-1NEG&s9Vf=MiVt?EzD z!vwS~Bt5sUYX8=v8+h)ha>lGiNziO|jXrsHWXv>e7T$d&=w`Rh3 zCy;KBxL`404YfMQad%|oU2M8xL1#03BTqT#jO#n#$e|%#%A8M`=woaNBqeS-&__Su zCdMAH&_8RvJUwk_DbKA7qt6~OYLvnx1Y#!>Uh3|-+6C#uZVm}MFd7U)vGF%KGJuax$EUsQo2BNm;(qU zgFHDKs;c*pPKd&d3{4V}7K%0r==em3Wfp$Il!4$Pz%_Lp>)Cg*2#}G88$8L%ISwbS z&i2}OD|d~*YG1ef$B*mP-lWiu^66xSw!y{5B9wvyz+YAD(L+Q_6v9UsH;GU+KhOVb zj}~fL;iMIQ1=egWzZ!ScPlU$BSTh^e<%8|?bdnM&<7mmyEnMThQam(+8r^TOf+rR? zRMZS3IH978EI7q^PADA?Jvl7_3pUbW*aXe#K0^73>e;b8| zQLx4zsCxpS-^^AMVSU1A_BbN(L|D>8fS&TMhu<|hdEQK z(L{*rvtVe(sy?gdQ_E3>BMM2J`0FKeO0J00Gd~f+(!PCeG;{J~;kwDZMDa6*?#eW7 z!cPOG0(CJYM=-7LwZ|NKWWA@U)6k)D$B(m^DDla4DI7qV-G6)eH-if!$Vp|l;^cnf z`UuQ|NdjU)lF??UTte0$TocZ1e^XeQT3T+W>0#|#AFU1s&46scMs_m)Pl^+!GbDxMJ~8kJHYJ z;1WiKpdQpaI(A09dD*!{=QSmDc3{3DTyWP5d){w()Ec_yMB1jnVSYqnN<24Cvvf2} zA!}m~mVjfjd7=snA;%{+^Sr#G8JR#mh06jKWc_iaEMNwF;4#DRWo0$Y)`)bZ7#kHmymAZc^%)JdI^211T9Cf{Z?(y_fh9wM+qI7iuDLUpgOx zF4(AmFomPfe}rZQpDS7DKWQ49JZFZ6kq9 zcICmL2@DZBQx{p_j(e;WI2 z^6lr#N8;5m!P?sC&mUf|>`eUKl!Rsm+XAM5^V#`RJ(S-wf|!dGReW#3LkD6pO_e6z z7XMWnHDeq>jm`)ApD!uHV>^#o@iFOdX!toegfsQ52lwy0L1LgBo@DM?XHPF^Bg+jr=&>DVzXIzy%#tzxc{np%03 zKy=-D*q&MdFIuq%70U5^b4>d}i5~kxLmg+0)#iB7wTwjIPL`+HZ%k7}O@ifC9Qci7 z$5{;>?bk4~a<`a5+D;mwk3vjr+W2>}V3{TyP& z1!y~TY!O71YHCia#^;wlHPPCa$|4M)Z<+a#t+ZI3L<3*Q->_bFmWsuc)?1!57G;1> z_$mHkbh&uRl0VOEWT8VSONuo<5-8V}-*38^=nTMI-en_d4Wd*_|z5ZnxME5e}G zKx_sf5|#yh&b62GhVoppIYfDal|vaaBZ1QO!0u%4bhi)h%m8GAF4 z6~*uvrHli7RZ>(uGOW?GIE#+LJbOR*{{8z?S^vlIsN?r<{DpyQel4PQq$;abi)?`M zn;u*5z=;>yjxH|$5bqwHoNh^xzUhqSrDKi-g@wO0Iz004O)}p?+Gu5W0r3WVF#2k} zh9Bxsd0~J;d=epJLC={6R62#JtzKwG7RAH1gKLUO-@ml7GV0`0UT~%Q+`wm}z zyTa|#$h?zDNq;8CPJdPUFF4W7FY?__&uK~9`saRZ8VxaEL+1D8b}&oiq~!q3o6Nb0travYp=Sl#B2o12_JMu!r1~c-^!>npL1@lex&+8?#Hy$40dnbxl?POXY6<#ZQe)yuI(Z9Nsa)K zW0EZu6oW7+tN4IEj?MpuUw;HN&9iEGu?-`HUC%oI@_|1RKk+T??zXl2tv9eu5nwKm zH$-VchXW)6(aRlcLGg7Ct((-hc$_dp_$E1Pga!DpHNUUE-r?P%QSWG++X}NIjM_gPRo3@MAhzP?h zN^xQ(;9XnQvHfoTIy~CX2)xbd0^iAwLfe%K7l;S~no=Ys!eF*zobRsklFG3ej`itQmo zwTo!`$FuEG>IBmMBKXq8C0RcTW1;`P-{qyH1DP_@+zDS;{@LKzg;J}4* zkvOy>$k{+=QAl;O>(Tg0uuf3UvdyaJQHQQQ(}zc%=B2{B_3J(I9e+#+QSg#p6UyN= zq(PFE(G}Bs1FuKP4myE(w~EHx_GGVJL|(zcsBddOd~}PZF=vdii$}mO=}U)1%I`_2 zqYN;J`#7a%bGAl<2=>Y@En@yS1->xC2k(o`0O7f!-+*P~`{y~le+!gwEhoq1Qw($k z}iLa>#`DzJ3?BJ5m+_=(Y4UgM&gS61p2v5TOxtnS@U6 z6jM9tvUuPQ9!ejhwnD4qP6^6Kn+UEUZsq$e96t!N8$!=a_=NbSMXWPfzWhh?$d(BX zI%lpp!aFrIHg3!-BzBH}a6CGC195?_8#@Pco1OfaG_)4dQq7+IHfq>)XiFqjI4@je zTAH9fmnFPY`ynLUeQVC!wV`z3%v)K2;A z5aWGxhWZ{ks5n;Wn)4xhjl{o{7DOgD8E0n(^NH7Mrz;4k4--8PYn~Li7eyo`kB-~hy0R!3*%!K;+!<^?V zVrHU4zxE3*oIk&{&;G*8ZC6grneXX2rNoTrqldsl4LUpd6c+Ks zgD5L(tFYS`=bh93lfLj}1d~KsAsJi3ReA?5=2P4ZKSx>{2>9mo8{(V`3{m1*|66Jj znGeH_grj`(qYW2GHX-f)c~vUB1Ip>f8C$e+FY@fGDvY9uKkSVSo)y&FImi#R?ay z2C-Z?GB8$~Zm)?7^nUjOlR>KFCHQsmk>If8M_p{I^M0H#4|s7>Msn^bApyaUn{H+d zcN_Qs(zR{ZywIR&yJ?H$$?%OR60};^GJKHr#!^p0E2c6R?i&L!ny9%z1bpOuVPR(T z=g+_JY8`YU8MKpTcmRaHBTPh*M0H^Y6L8{F)=iNQo%-%_SU$DFUkR)wxW^dhZW)}V z!JheQhy$+CB~uv5W>{GQ#5W~!iqnzEM9B-i$BdD8RxqL;!qDEm&Bo7%{Q&=S6Qo-7 zBPM7G0G3`;eF&-qO@=~{1Rc$mR4Cs)=Q`uP&BX)K#1c-iTQ{p2GY+fuhRCDCv4N)f zHCDyju?)0OG~ozR>EOMenwAYdIm%L}d37I)7~c!scrv78*OT9Dx?W(GB~oRA3Hs}q zKlYv;i#$JUACPec+9F^w22u5T5!d~jhU}b1V<6)m5c)b+h>i7Mc**qrbGf~Y9C`>v4nAkHZ zh0&a~6E?O`08~_Rxfu_K3?6&NBi=?EL1k%aDe!@aEr}oQb|YBv^!mHQBUG$n!^Zaz z%^Wbc%s9YWb6+;Ko%j>vTFlFa4s|a)Isq5^O@MaxHa1tpl8%y-Ns53#)wZ+&)rNmG z>*t9X2|Izbo$S6(+=3|XpVDGu#0IlCo0vv+cTGRPCfUjd88C{xQ=SPX(6% zM8SWf!HiaEH?p%8VNozUuHSX}+s>eJ=jXq6b@eEn-ZW-NALViVvZvUb()yw7@?hT8 z0NeJfXID0L+h%b}W5$mDDwe^QdvzH)xr3pNqGBJ5_Pe{5pQ&v3_|Pt;Arav(Iz**U z*|vmGzr>^R@8@%4?g5zzos7UG{URd;`V>D#0;C{j3d4sIJ=rH591*j5VAK#J{CTdl~u4!q?4apm5v;8 zoIFx$YbZFewhFAT`pXk<5Z`QHDP%5LxI?~M)*h+4L68PJW1 zVlcXRJ!*TyI6K=JGx8|q1eFEN5R-6x6vKGavv3cm*`yEyJ#H3fH-R82-kyNFbFjRZ z{7&^Pt|tHqCkCfZpEgZ+mEebryg-#lfU*k7l1wA}Ntk%)=%xn-HU-HOnhgaA37pB` z2Y3SrnaV#N2DozVGQ941^rcIOn4;Rvm?3C2f8OXZ%fP@g`VZl#78cr3919^Fgu57Dnn%HY(fsh)7z+m0PO3MYVT2npr}_AFQyDs}S1Z-f(qlYtwv zGI|m~+~EJ>7fgilZC!x`NH$AD9!0;Dipv4VM2I8QO(FaD!=h}_y7e4*sBDVF14m}T zwCN$Cp`70!vK|G1%ry6yk0;g>oq`v=1dL%y4SY{Iddxa%Cx;T=2r}p>A?`6J0$Qy9 zdU@=#>lYbWi@6bhoQ}n@^;Xb3UZ}snKbl;c6Iy4;mRqOvD*>>>=?YVzt+0;>^|Bce zY67W{X`N;0VV(Z1ev(h9=2jk5t?m3a{p=LbD{i@1(+FllL_=A6+`qn#!t*T>KfD=e z6U4Oe^_K!&BOG9K1sJ1ol+8dqvsM~j&#rm_H3E%Hg1t&G1NRo^cWNnP0ymedb1+^7 zJ!BM34<-9GAuiBbUpp7^xTsI@#ViLnYfRSPI#FM&h@RAZMkvm`^K?GTUMfp#4nf;q};#R@9L9Db$ ze8tqIVt0U2#*So4-H4;|Y`(T+aG6emomXsaIThM1`dAvg@ksFN3MWil(8K3#_BL55 z#RJ^;Uq7J4LoT+qh8`ZruKYfdJodr<^JXR{Egy`QC&L*7S==qSnX~inEX9)5m6var zsjkh2(M_MR`rnw0p=tv*^QsVNiL9Q7#pDm1X@0uqEC6N-{zan}TaY1w!MMIzBr z)}#SKF-lN;Rq^T54!~%>Zll9qr_Lcxpp{{dQOe*1Tm|uTm&@(=AYEAej9+GitEJIvW5tyV z^{cA78uYYT>Xd#h4*We(oamfxy2G?re!{#l-x(vf`e|1){Ju`Nth9{yT#cQ~j*inM z8yz@FgKv zw6JW2-Ub4}PK&rzUX4XuMWv#~9!OePF~}f>L(!Fa2RH(hHDh*t!4#IoTW*NTf+ z=iIR2!&B_^lLMCNDFvD>iT{xOhSV7^So8 zUS)>6URQT__feajpWjN++}O8IpR4TS{;(DT9FrlSAy(3ldg~H8VMJ8az-RT|BX^(q zY47*KYlsSv&ZgNdLM`Hq_r!eK>xA)PO^w(Jb4{{%SXjt*ZoPMT`)CIpG0tO^=+&&O zMiB1|Q?L;WC6nTRDdZ}EQlt89XP?(j9NOF4zj?ZI|B&(eaJ%u>WYf-4BM0yjmP(TNlPv!aev@`j7gt!#;XfspEPCX=EYELi!$UtkX;n{_UowQ4(w$NI;QORu9p zYeW#oe=lQL*prIWuAW08bauReLLNtfMm16GKX=@jl@GW1G7IK*XY-P76De6k5d-Wl zlrqW-5fK0WSt*VN{Rl>7VX zseZlZors~WD5zygERYTrCU{rH7ptpjTMe>L{~s4XZyJAu%e-{P08A8`#AqmQJ2mg2 zx`Bb~7mM`i1u27-)+M+9SyM5_`k&~(`z+#E4jY2nb2mgpM6`6M&5MhRMZ5s;g{EF? zQ?XwG%H43q_Fq5W<;#x|O(`1i<`z?FsN0z5u$e>0{Nm&vM-fwOdZqQr)xGi5r~l^r z&fpcd)VxP80G9(o;pG134%#J*$3eZ*_NFnHf`Syf7hWaF$&hE(Vz}@3y(WLFs#5aY z=Kc8OU3iKD;b6At@g^%U>!)=7oZf37YM!r$3>?VbB|UZ{i_(T#hae|P2G)46Q}xvp zZ5#DHwYqIW4BEq~8CCI~&T#|?4@lw41&zOs3Jn|((V3%o{rU4hDYM4S*hC3&iso5x zW^QvCT|QB=Ly!379}FN$$W(;hsHQY_*9e@YWc0 z!=Z3EQyXpV>`!<`^O!QzJ3LflM#nE2h;vZ%(jN?hxwqw>8Dwgj9GQ2DZi-_?;UoO$ z=utvblYR-B4uD~k6ikv8z%RIg>(cF~R(LtQO3i5L^a3>z5}f^tg8&gk11jZi=~dHReO zeB}6Xr??>*zJYP*gW)lw^EB%{{0ZPISdmBySTrP#KD<3)n(~Xpf`;mq(cDIeEG=SO zeRP7C5crBTmee|l1%2tO%YS@gwEXt0yHm07chQ+QYh#;j+ViucPTXJF_ibJ}8Zk5@cI<)oTKKx)(Z{m7@PU%NSOZoOE%Ssu?KxwA+9e!XOv|2gAL*Xh>@@8QFJ4$rKP`l+oGmD1+hX#d)p zioP8bNV@lAUjYp<&Dae2vJ-ph0vak@rplG1EKEVU%_0Tb{m8 z$nbfTi~`lhwEq1#{S2RzM~CzUi(L9wib|nRsxW>w1nW;DCA(86yjop3X2Y&hrgTQN_c)xG>Ql&r@(-mw6N^i5^zO5-mosio z%68x;-=R`6W0f8)h9+4AWjs*pt||SFojB3j$ER|*k<}0DYtRs^y}bHR`xrraL1Jc` zxo$0#6Idbb4@Z(eDIL*j&73)NJzF_Mh0cSeq`J>Yg9L;jr1+C@0l*1Gmcl^IILQT8pFl1ZlWi#KE71QPAI@#;f|MgzrdnqQS5xrStx6NmNGAVY&)*HiC z*hb8mnd)&IAu&pO7SLiUxFL=2d)XP+vuDEr15ymEhLr6JKqQCCjBU{6d|etVA;3ZT&|=;LKNx!yOQ;A! zc?JFxpb*s;X-U=s5T-aJzDyg~l0u_`9ZE|SUNTG^Iy8rloKGZTSf=$t!T^Bedvmrc zUt_8STOu4cW=vAJ6{o3@`Rrg$jv7POJ-%-8P5%zPKo8D1oew79vf_fd)y}-vfpaH( z;)JGRa4wGgnVFdbcQZVKhI)lqL-GHW@=J`;bVBaK1K~m87Ytec;t|t$MuknmB{ivg z!A-{gF71Va$%1IakVWu9@#`cG)+GfS`}vI&g$CUbY3I_?$2IdJ+Ot{!6bDE%kM64N z6($)H7nqb$IKN9j`7<+n`)BGKR;)Sq56mm-_-xX;VBZ0TFM6qSz%Qy2&NGWu-5(H6TXayepRx#Q*< zSqugtnkald!3%mv{Y-=$?>SgZP-(D9_E0DCh=nLwjC4Xp{6x*qET$*ppjkA&Bske^ zPIW~i5W`I)JBXfY!cSw_ws3K4F|(;~VQ`%P&Me z*pb`##}Hov8q(z#3~B_OChO_b3l<|!KDt)mJ<+qT>)~CMeydlDC>J-9^@R0P^o*!8EZ1w=7kh}V+m}?Xrc1bw@Dq}Rh_N? zN0AK#hQELKZ|MB;;PR_~diy2b^M5?twhyDDI-Pd&i!(%8AEMKEu!?>SGe``gTVLg^X?C`n&&^5 zuhR2GEywHiRM-7y&1JAlr3pAX4*ZaA{o$T0_!f!Eul~Mtt5{ZqNq4Cc@X zF~Am(pBa!iByzzy;YJ$Dw)FIXA|l`6j5WGnk=ao00z)gKsU;#W0$rHrIL>hkFqcr* zWcGkJYJT>Q#Ff9R`%urkrx@^Y+fuK`<=u_y0W%PppAmE=evs(tCFBDz)rJ?k{`6@* ziT~AYy*k?_cU}e)Sdah+=L}XkU$S8@H#b*k%*^vq%e3d+GJ%E1hvVe*_|2B)=CC!l zgS690%RS7$<&QWApoy+gHkUJzD@4{owJCC4hEG@0f`;rcjcu>Y*Xe|DJ_ZMEDf9-z z^D_)j@;zBvW26-CJk)*W%p>+!jwHXrcb0KP^yul)HZA5iL8UZSdE3!v$b&x$u`|Gheq9W%p`gy?)X6Rq%4Si^fRzRA9iO~9A&2VkKZXGQdrCHwpvj)F z%4fN`Z5*%uhOP@p?4E|iLO83P74gES>PAoKviv79 zw;#p!EVD{hnA4AmmnexfpxS#G$zyBIY;<-3#1h3l`I}YKFL{Q3xIinFKLFc79oHh( zIOnf@totSOLN!K%r_$2ifei{eONj)WsBywc)E-=TI00g3V(1|{c9?QjZ8-UyG&usna4|feX}@qjFT!ZRdP~|PL}w4jKexZ z2Hh0$otEC@o3Oe;rae{%^a7;3e{F1fzW-1jjo?RT z&WNA`PR@qM2>;9icGldUT>^K%J2x0r8A8%s({$$|u$4T5rz-tMHk4)L^~dqbpq<7# zc~hG#GPD4{gbdaRXY(~UMAYvE zXBW8e?P`_}t^0>jm3isZ0weuS5QPMNzyL+OLJ9jM=Iex-r0QN?F#MXN81@~`P-G`B zf~p|#|Iu_Fa6Rws|4$he5sGA0W(k#JWu;I;nj|}gtVqbNlq4(4rc#ljL{_Cq$U!3O zkP;FHMJQ7L=XLJi|9<=)zk3|&`~7_05T*08WgHxN$mbcM4&(pR^B!oQ{! zKy*^#l=JR{&Onx+Tpai#_4&yP2E)m$YL=aP$c>y|O7~Se!+qva(uiLSZm)zle{|I5 zS(Yka-8){VroKQENm=#&(do8=Zn44Ogk@%*{JqT$zh?`A&s7IasWW)+W$S%kB9@s+ zzI0q1Q*t^3wooNAZ*Tx8q!^UYN4KEB1Bjyy#ed?I79xUM3c639?xOOkA*Gv@QO@PQ zsdNEwC$PTMq+*b*%x)%730wQ4R%1Y{S0eqaeOx(CRg8cNOp5{3n72G0~$m_G@x zaE2)DeRf|grkXr43KKgJVr-vCE*TZ<}_vtf_dO~zz zoRF%=cVm0z(pz7VSlze&IRl1~KCk>zJR-^pE@nRpMXC%O=Q6T5Cz;!cHtSThPy8_n zSsP~%-UdCO3@=ik`nd_XH=Z*v!0R#4k;=81_C2`raY)f z@~2ATUqa7fcbC{|$UQ?kW!2qfQxRXjDmQXNO&1#wOE?$bx6Siw#ZlBPYfrbG#DAo^j=Pi|KM zW*8I2;UC50qFgzK#}d*i5THH0*>P-}2niABlv9+zlNv!q3nqpe6=kZ9q2a$>FZUh+ zWC8wX0u*=M)mWUI+#x_vnrsD>O&nCHU60U#OH?`DEH0HB`T438vPf;ma$||^kQBob zDp`C5+N{3OD>u;1nh&AcBk^>HvmuiFu3R6-d=eh7+JD>4$@SU&HP1|k4U1;JmiLvA z8?QH?J@{mlib#*Nj3q<~L0Ry)Xc-zUyND;tU1@L@YvR-;PrV}>edhzM;AvC|LfNdcC1ORIeDD&yrnIrL|2)B>t zw<1hw6r?D)1vsckc{$z}Djp%BlTPlc&B8L)tYY7E&V3}Uf*txi<$|lbneU0lSKN{S zE|9xrpiZ)_7T7*P`U21j5=>4gvs5+c2>=y&iHxP)hVCIk!kT#N-(d47ivmV3<~0js zf9X;?(_CIA?Era0&Xp5Wj*CnP{jw|&(`8p34T?@bS8BW{G(Y*%;IZ~K?HZ=j6FwyF zfaK5VWB=IoIW_%R$H$ARDNiv*;DSoL_g(b+c=QvhzaywPAitXu>DvR#u8k^z3{+K? zoVASEId1su)=mI?2E#V><@gLDu40$%^N)I7g$l^A;pfXW5|jfn$3v4`BNP&f zn|H6ab#r%b-M+mft^$mJOsOR2m8&@dhD*#C;dDhqp@xKaMTJ~4YF7`Eu);u`Nm3^9 zZYW0#aLI>%zd9Lc(%2Ak+mxp$XE&9p?KJ5>s1RhJiI7m_a{v+u8mOR+_mV>s&p?#= zsF4sxsJ?O_^e7l?jt{@hRo*12@`z^!rr|<(%3}q-6c%W@S;xxf6-NE3Zc8o9F0U&~ z$$#~_Va>h%F1-_u?903qH)VkW%D+RbB8Y3&D(kv&-j~_G(?6U;RlpAyyc;2L?aXw0 z%1z{!(&6c@NLo6|XQt>PAZ&nlWU0b=yk*tWDEmu}>6+rTLG)Mr^v!L5XLTH`^SrBL zTJObwX>+|`aeUwWe*2Ic0%=qlq@=bGh=uzadEsH)O(jgUVM@>hI%UCw7%>Q-FJPq0 z*>^AkVFwOGbKAn*{BjvY+a z4A|r2&0KH{@nKiw&7$GevV<+HjwKmRQXBbl1a zAR1(KjI>A?uxX=gyOW8-PCKkQz2@7zJxBr7d!axg1Yi!OCN`fa6$& z6lp;S`8ZS7l?7*Bt|`wY@QDSpvLve!^;P$3QQ)?sI2inDgT=UUdCl7|0qv}qmqJU2N(Y-7K1qTjjGoC^nppD5}^ zV$i{vj{A&!Vx1XDJQ@+4u#5{IK145?wnt~ttBgO3$M2?U61P7zjLa(qDLDziNPmE) z=j-L9ub}{B-zc_)y`wNhe01*OMR!{LNAXS}9CyhCbAWatPugvBaC8Xd&`LlTgPCPe zkgr*00*HoMU6-M%&AM*TN&iW(yel7)l0~NTP}7P~S3%<7Bsa*Ai>JgNJj_Ts90B#-x!&oFgXi5Hg z#h5X(G$rPW2MP`Qc4xrf{IEp5#Sv-XVU(V>bQh+N9L=4^@pvv?5&JFLof6IpW}laCma4 zzlBlwsM_7vv#MPZ!x63G-NCc?QrWWB_>!5cVUokb}Nnq#`;7CZsa0+L~Q z+JI}cy%hDdS8?Vpr~7u|P@0F?RGvyJ{V}x;msdedaNo7TLcy`Z{qG-`L;^PjtMpHV z;U5P{Mh`7H3bN9v7SUYuDCBGd_MH!koYXmJ$M)@nOMatH5c6ld{H?E`y1;5n%>~|W5hj$rYdFO1Ao?( znH=B5AlYfgQWr$e#ma3j2-Xh_J)@=dn;}-h?+dwA8&2di_p9?NG?M4C6NboD*^Ld z=FweV1^MEJ$*kxibPkzwc-JVbgQ)w&JHWlzE8u!ck8&4EUM>M@-g%_d042z9Adw@2 z81ac&#uBX48ZA9S%u#ifN|k3crX~zd`m>8S3)slSMHzHX(<8zXio%f%bt|Eu#Y821 z9;7~*Lr0kofT8PeI&jLzI*V$v`s%FnWAt?O^&y$`uV1{_V+rOHI0-ER(@N`D)M6tE zFcD=6eYBi7uyYzdZnI?6e0r(=obe&vjNz{n!5riSvAH}D10Zoo~L zAjT~HPUFhUF~_zH2BLWS9||N+n};h-M{FL4r<(&W`uV{`24}NscaF0FttQzqhkzd% zSST-noDo?Z5WL0InsETSyg*zCBE=Qa?beu2vk zTX*oOQ{{_a-Nec$g{V=cuw5Y5aGI$FgTIs-L#FQC(sOnETe4hYQ2Tb0NJ_@TMLkeo>Lva(S;{|ftlN_!9RKEWfoyghLa(W2zM z7KjBONc>-)F_g9@W(PpMNv>YFbwxqc7TX`E)z(UUGw1r$b!GtC@Sa#XELb&MEAu(k z1;3%+B0a#GysCnwNe>pvvp;?xOoaZh|5I+a>1G8k#JU_ zF1xkpNF*c(lz@1kL<9=jNqviUVHg)5Ofg8>XlQ9z8LADmrW5&?d_pDS|7A`DS1j@7 zC}2*qYfamp<^f3H0Dm#+)f*y&P-$-EKs#Wfh+set6YlC&)=6j-bJ=m*cI?n-99jH2 z!jHdz5Xh$N^yA;N0UH6Th43TohQQ-~T6I$UmBMPa+t!{5H=>AV(AZ9!CvQ0V zWn?_HF!q~c9P}`M&lYV?LFLMUFg4KZtSLVd1s9t=rKFKZLN|u>+$B#}xp{LKtTyz8 z=#ls@^VlE$Pwz%Fx#)5ivvw2Btn#@F7g~w=mpp=XX2h5$Y+L6cetMF&CxL!paT!TD z_=Y4G%@1DXOHQvQO-VJY(HPn$bxv9N3U4zl5XwIW zGsjZI;r!pt>XZ2*l(6s|(SXf4za>$ELh;AAl+25h&S>v!dUZzPw{-*`nDtL8D)ZS? z_R}P{dc(HM=p2w?8a1DqQJk>#IKY1ZjUK{?G2{pkIkE2N=bfMuWPp`&*}vs3bfh#du3o?PF6x~h%;f9=M;>3mvbc2?qR;#G%ouvJo zaXz{uM$BAjzZmEZ%(5Fn&ppmXWUvinNkv>`ERd*z_aCcZ4Vt|zVND-N+z0gAV$x>{+@=K ziKo&;y9<3A5C{SM9MgM9-V+}2uDh%22{V=1$9hE_JN5hq_s_?t#l@nsbBTn?l4`~U z?X>vq#mB$6NRKj|44_EqzE@XTekeeJwo9h@7ZZ-jru)k9$SC`6kSx4R^>*#@(26%v z3xnHSfy#ojWhd^!{QM6)|MlL)h}kibhZ9@E9E~+>*R4&k+#ftpr(do>w;<}^#Ewxr z1VIH!??$gcx9oR*%*XhtgJvwc=(0fS!?vMTG5e|?_EX4ok9v}EDmA0a*^{frj=eE` z*_q9_;W~++kMBO8v=Ja`Un*FM_?JycsUq!zZ^;cp45_8)T2Yy(L{$nL(Xr$2JXH$? zI+OeCI*BU8U`L(@8%Iw)bP!wuXY)B+lt+&p!yP|cCN;fFKz~axIMtl8ePiJ_j||!g zZ-d}$JQP-7ouvSNxT<*LSv)T8a24;-l{-%L(bMyX2>2G!P-nT|LL5v|a`K9BtBDky z$N`C)KhB%}^GEGgQWU`nuV1@TGkXvD7i*j~rvjLI(x6UE4&V!jYynJ$jfs+2=4-r2 zTeF+ht=#+sTHe(LY{6~-L4;vLcmwb2FgTbpiZ3ArJuWuLD}fd$d3`zF&p9+iBeF!+ z{Duu-y5v%L`)VeGh-CyH`E0A!XmY?7%tw~5T{9g!!No84r=~fMoE`n({hrB-dfonb zr82YKns&isiq=hMM03shkj+hj(qaEJv?mbcBWV=1$d9C(1V$Cz6Nd@2VsfeWYD%`W z!rYAdKY|kPJYb8|U05pML9oWCo`2@4D84WBQNqbGh4b)V9_IW*`kv9z4+>zF`CT|1 z07C|V88XduPwrxRJysS>B4bw$9ThWLwUbxaL3x&kA1~f#&ru$F$Pz4*0tD~>9aH@ z5MwN^6|NkaMG$kD;t?u720Tcbdohs1`gHCbN~PVrJi*a`#@l~f^jso9a>_LseMa2} zuXODTtxRp&9f%+J<~#%hW`@L-8+a6av*r<=Xb*rJaYdP?c`tn%gp~uT z)Aa5Ej!oS7Ein0U_uZr(6a|xlFoLgZ({Htn-$9-5>bhe5-LcF)p(OC$#lHi2&k8vU z@8m+^ZF*!2#kh=aM#;)3iC*x!%y!bG2!pQcZZ)ja$PEWsuF_xo&Av-dO-*-!XiW}> zaXd7+-uME|xKNSWq@3o~*5f(dCo)fhooK9HUl zP)z0nB`nF{vgI(^ZPPEtt8iw=b(>nFQpl#1c}BFQ`fco+3$T>3N+f?0tStvwMZ?vm zjiq?y)dmBk3C+v%=4?Mnx8)Q!(4hYnC}VL8p_63*n;%F9yP8tnvFV@Z{b~_#!6o@3 zbE>$qjUJ6^NU%ucNc4I#HTcHEhYrq_XaFQ>lX7HjH^cL6qH2f?@EZon+scJGF1nNo z6ZM5G&?uAJ^qI79bf&9@5B_8$9WZsW%xGe3cOPg{mh<>}R;r3H_9qt1+`t2N`y#H)zg)sC; zFlb;79zHD2L5?RBnb#tRMStJhr~ei4y0Y!~h5$?eMOzD|udb<_o1IWh9$)jf=Qpd- zCLz`e;An9?GF`qe0vwp<-{CvsR)1Ri>`&eC${LylvG0l#jTC3vewp%zZFe+dl_*tt zz4mnQv2)(8sytvAC+0m74Uq{@a@_?l7ce8vnU%c910%hct~?B_We{#Xrv=d0K$OSp zV%4p<7N~19Q=>1wjiuYVPP!Gd;fai>tgfacQAz$yP0teWVJCG|yC}1FST)kq)2&E~ zoM2ps{~CYlm3WNsB0RKxTT-IqqeK_yiu($&vt-yqi&7=U!q3wz%WxeYi3BvV6w9b{ zG;=m8AUudOS6;AqaYEb2rYqk`V5#ZVu&D%Ibd+W6dWDS@ujvf0r_Hvri{_OBqJ9q9xI)qNdrgu@%{?ChUe)%w4AzWh-agl19(_G-62Me7qE$IM2olS+sEhD#) zFz|GV-fey~D7SjUBO$8pgQ3~~lqdEm2e6yY)^;fBx!Mw&0O3WIhNryh>(=rmbz3~1 zozQ#@s;2r;;9E2l0Q4L)KEgILnfh3QOpAT;{ft+KS<=pi_ybW z7;T7mG?0V@#6UJP8$PzERr7OVOS~QuRz%H0uQE;u_upE^u8o;mR0=PXIc@Np{uO?5 zT5_Soa8L@S-ZQqa$UTtviJCv)d=@cB>YY2^rB0XngQANNE^cFFAhca$3v}uS0>5$V z!h{2Wi%pg-1PDtVtN`4c@#{k$AZWb2H5LgMuDe!ESmS^vxBKA1Q%?;p8~duF_R7Cp zJ+eCFy+Njkf)8Wl)GpOB)HT-rPrrBfxrkqX{(MjL8ri>V=)@Y-qwCsj?ng^O1eZu0 z1ac6&E^vhS%Q^1-7A)Eb$h&|67Da>Z*Y~faD1s5G)ujZ6XZtJbKp39fRJZ z3`f{v%>9d0OVqoN@(ufbgW;ZJ-(e+>V9!*%*+p7f;KZK4XHI;wd1xy@cCmK}00Cbj z2s&q=gw`TJOt;;1$z(z-Dso;;Px3Z|Nk6|E4mhW{xQowzU#g5w><=VwrBn4^Y}~K` zVdPuE$I&a8YxP1f<&$?nXm4)fucH?1zIfq6Hz+@Xgpk%$yCnYR9Q`ks;o*ibE#D`hdmfU+zwEo46>xScBj(L47UE=x878` zO{!+V0!|8n!6i!{eH<4-Tgqt4Nd3NjW4U}tl5TL1(WGSSfH<6UCz9eC6ry?hrtoRE zfXO*p>3P8@Q2rV78p`Yc{5DnFy}2F54J}KA&F7PFZcG^7&cOtZZq7ETAKDbHcm&QT zk*}aTlVPej1thCL@KX*a$MK1Z#P~a%YK^^jA6F*1Z;oe|-$AA~>vwU=jsxQSG;GH% zGULz}mkcXCit9`w+PL9(Nw7&kmwPEa8Y=dlxxZK`-5|!^L(}Cur!goeW&JFI=%?ZBd8LUcbh3{`{>o z`t|DHe>a<+1y5z(ex2I?93j_+S*g>mTqv8p{W0-lho~B zMBJHQlj^bSbnmw+IWVcuEqSiChj2?FQCC({+A_F)M9QKAY|x^5nK}Wb6u|i; zqr?HAB)WVWqA=NR4y7ej1!pRNxVQHr$hlTf$F4#PNfMLp=8>N=I7Xg6HA9Ydi)s5 z7wSD>Pc~NuLr7ooq-hx z?x11p3DE&0%atqgD<(G0n$_>GLDs}n{3NF0L-EZB{T3Equ33eioTH?X-Op9gF50e5 zbe>jp>$DS_mW&0^2}K3 zB0&mIA`oQc@Q!_2dg#O`0?oXa%icuzhT& z9`U26kn>2G39n-e__5@&-7`&$eR7FhU#%8RDHpi-EQea$o@3Z;c2lPY!DWu7J>+9Sj<8 zgeu7(siIY$FWon-p{8rH7Fd@8osYBOIFv*T)KFDu+|=yQ;7#bXK$6snEaa)obe%GO z%{&yDchV2+-K#io;6VD4?0^30NK@eOK9=0=IV6jTyKP9PmhwXoy|@ndebW07dlC(c z1z)l_{{kfY4YV)8P~w%f8~iommu%2b)~ih2{Tdx$$?_o($~V9w7v6EzPY1W$db{o= z#}tUB-YH-Fk)*gy+qK|u_MBVcBUWn;N)xN>tZVU=f5D_zq6x^sE`!SB&EQ8xMdN2r zUZ8a1@3fPVZ+Sl3&VL$y;Mm+Nu>^Q2aa8iVWX=@l`KuvIo<4ZsM=MP7jLexT@w!TR zZp`-pC69mf6vuOCQnq^<4cz`XK#!Ee?v=l&rscb`0e+7A_y~f6{!Kh$zE2bmLKjQ4 znk1nC$6$3<-u&l#`$dZuMaIT9A@Ycvk8w>k6@Bh{tYlOeD(pQE9jD&+bNN{KaX3s2 zufq&V!kEDpgBLCQRM(LxitE&8j2H_6k^pHjPaJwK%^v;{Zd8ve`lxB@he`X2?`s_D z^!+E{TmEQ6*t}0`5Hec{l-okx<{gK@UiYvOMQ-7l9}6C$;d>5x!6 zSGz^0rkV!VI#^By;=MYL$tT7jla1IQxF&KIo{V2}n87UQymuOfj(=sbCa+hh74gx2 zyLPn%mX%OW?}F5{v^BMzp|H+58}dIAAK8@Sm;am5??B~#2i3IXA`KB9_t%w zsH*6F;6}amYJK&4KX&Ko;Rm=@BopO0?%ydZ$KMERqS%OZCO@%Db1q)zBbUB=_qcD9 z7X<}o=ZZv{MptR1)dHz-7fKwjrZLgcO6Vr#hcL~V+V6hhKGkgrEMT0y=z=TLgoW4%@JuV4OjXQvfdXSxWDU$D>$7p=!-O2G){?fzai}+v{FKIRn;@EuPQ1kvU73@qz9ZwZ!5^pY5RS}!{wT$jH#07$bkcO`}S31QSUzz z^mC@`KSkf~2`SEq?X60%mP00;L*Z zhy`x%hGY)ih1SRoS7roGoHC`Ipeh)82~*tq#F*5y`7>!JH0ZuT|wpMGg#&)q#jt*jP9&`r{uZ50!x`S1h z56|pE6*x}CCy(Omt98WPp1&bPl_V;brn!L0MKdxs$YeN!13%6WTK&1jdLJ&bvh2eLRTv1&x&GO6bht=4 z#!XhjuG!dbe-)&Q6tj{MK)M4wy8SNsw`k0h|E~qeR^lVxN@vOgWJas0Q>Q}lwWUws zlv4`IUF)g2LgUdm$yPQoaVuFGHlFeoN_7jOIAF0Y0shpjz{@QL9ofkt1SG1;4ktoL z@xYypNllO3oxiWm2fkNq?J!OxXm}<1P(NqGJlHrHJvbw6wHn~97BB}NqX4m_9QT}- zGDb?J;_;Iw^Ek>ym*F$Kcv%0J?#a%OMv~-1snmpwN$S+d=xB@5P6VIMLH-)E)J#X6 zI-ks+FE`P0_}eTA5R_}F_Q}tS5kot*q#Un8EX%P; z<#TI?!_=wmImKk)JsY$IAOF##N3w-kzoN@jlaC9PG!Z3vWZp$y0=BY1I@ea4nnqF2e5bj@YmW6_{6m_zp6f1 z@M=NgNp4N&%uUx`1Y7EbN{FdYp460LTcUr{W+6YlvZ5OwI+-LOT80y;soJ7~MJLA9 zH~i2?ZYJUAOTN`MJV*|{;mXlAj}xu&xkSbg={>73B-$Fe^w??Bo~<`t%>@Cs9J=KM z3Pn|m*_~Q8+gw-G40=Z`*}1N3!~|q795EL6-mhwz2@$19LmyM-qNA?fKXlQ$mnj}? z(YO_-ntz=1c-WR~@!^9jZtWMo9%UVSWE<_d@BMNyK;Y=nK=P1`!bXIHz~4HlqqWET z-7FIWs1JtB^<6>N#d8LCzPb>xTx0eyT9wUn=3eVKo=L&26MYt+y<^9H{DQUgy*5} z&2A?idHnJWJi`!(0(Omo0bFMg=Ofr{Td7@}5xnI(f>}VpRm_{u!6kXi<5XJ6E|Vdi zi+rd!`Tplnq}z|{{bv@4lmt`>Zoq1TmC1s2N6{5blTCbEC!Q|bQ_`+Gp9#Z|&=nxE zho+gQ*Je-Ck*cbj0pe%A-f5@iK)Zyv%WU!DkDHsg{K1EA$@q_}3$`a+`}Pr4G9SLO zW1p9okKH+WvM1(BNB!!1bTZj*z1&Mod;i^wGz~v9U+AFW;Oskd13c4;8<8cW#?9J2 z#yTv0-FKN)WJxrwKuZGh{Wo(y-KP=YzXX4iXw$3H@UYT3$Xo$@U?q2^z5*l1`;xWI;%a=CG6Q79LcHf!|M}mcy%IQ{DVP4RSD91c`&DqQ$xZKiTG5Z5@`$w`yC(duoxmsNXJ9b|)n zWY}xpNk=~juqcRie!$ka{0<(@@2EcJB9k!a(N8}Kfp%wjO9U2M0jU`%tfH;I`=$j| z9u0`y?AenC?KEg!MXg(alC`vJ5(cLz9eyW&QkNNg5(4k>_}>{ple5P^?4TV##_mCR z%)I*&H*5Tynn8kQ49ai7i9TI22;yU|o7)&$KYjOmWmUF(L*M`^fD_lQ9b0{j!s@TV zgS+YJDYD~cj(kE1)WyCd7G1P8)+e9b@IQw-m(|{wo za$d)DXyr30X#+VK;kU9uCczaL7dv;(90kySI+)SidK5fde5_NQvJWlNir4OPe5OQ) ziwYfw@PC0}tDe!5;7#2|*Wbo64@jr-yu)5RJ_w59TPz)Ob~I%@XBgL?BKwaMmhgy$ zo}QLec_62@Ja8?w3U8?K8x#cDZYJ&qH+gLCUx#^We5mv6px!cQ3xJ?20h8SagRrU% zI-+K->{zG^^SKN9+$ctEDEou zfYhh$&n700qekFlfCmV9_iq04qpc(E-{dTq!<0L$FudZ<;H?(?ArvsJxW7S;N>B`) zJ9jP%?Vb_1cwx%8wSOk|Y>Tl*C*{)iccgJCOF*ql@YsPv9(=c?|0&@^8FXkBJVp_- zA;2-Fj_jf$O_rN#gp%e2I!99~RGVSD`7t!|H$fng!Wmv3H^9Us^-U<1uv(qjbBZl-UjZG&8v*1fyxKAR|lZOZ_*lvPyxth$?T+&BW& zsJqX|clZBmu?YlVd2Y%&6|reMX@9r1c5}j&Qs(n9{mc~D*KA=eeha?0FXzn&kX2*0 zI_AGDG{gv!>!w__2SRMNeA`(Z2%Oq#7X|g zQqdNWR-HdhrmFN7gm4f~o&{}&_ufE6#b~>OSYw4- zM;@HmlMqL^6a6Q>M&IVy=&CE<8bJX*7Z5{gc%IE(UhSA^0cV)Pp34R zG;t!1HASRJ6ORsQEh~<5Jbcpu8V{T&98EVkV3`!Xl{fKUZj5v2*Xzj7jhPZ9NdZ8l zm{`J}T>q5o~l>J(6%!+xCh zPbsa+%C@ksh0Wo~@2L={S1wIw)LyUl!DD#0*`Rmq{#LO+Eh|FgmBUNPwLp0h_cb^p z;X6G>bAs9|pS^hWs4<7%`J`c%x|L76#wXaB{Ww{z~w3DFB9y z?E7?Ko{?6~xBH`{KL2D})a-y#=zg*cTe3!DLiL9a@5BJEJo-yxGN2uuoJ#Quo%+5f zE{51{E%dlJB_A%k(OG)sj19q*KBW|XCh2+GW7y)Hdixh!g>70`*lG|ziHA=(i@Z$R z-eZ7_^pzv0FX39vqNpwbqyVQ8oI$m!E@IT?UEl%?9@S8=1(ISvK%cdS`iuJ6@97d6 zgx73+<_=`>JfzG#RI`TFS@92g-8}AE{?3!7lP5nLeqjH8SERGj<>D0EM)c8K$T_d0 zANed$jte(qo`&4>G;t?>;!K$3>9~t~X?e7N&;%cLG-p%=qwO z5q<=VlXmosDmcl!Y+7?e(jE-;DAaf6^o0o1LXB*YU4&WoVBK`eU;dbU1Xfq-lJrl* z+qDY`#P7`gmJ1NZf^a5?qT*pAUvP#w$a|cxdd0rzl8&XNk#6jINZVNw@pAO&QOCr4 zu0~qox<_u0Ch75~d&?{Sj2qpHW^nSm#sm=cdKlcV^SWz{%w|tInRH?2%5Mf!N_|=R zl-^ByAYPH^!Xc;qg9f`VsMArintCEJaTh=&PO+8{D3Ix=XOs*pVs(psW!H7?J;8L&uF#<8`tf5N&ivp}A!GDtL2l{W zdnnBzrz6!TH#e8VsTGG@|BM<%Mjbc#^aTij4$AtT8A^Ru&HygK>v5b?dVl@psOx$@ z-hAK+`^>9o8QAgNNc=*@bwiA^@J@4iTqb$jZ^NEa zj4%mZdlp8J!_DgnzHjq|3*)TwYFIla8@>S=m^(Wke6gUR?%QMpHVFZ`4AV5COS(3F z)(`&73fww!3E+Eu<0ujX89f%8Ba(YW`b-sW1c{%nwN|oo8-xvdA-s$+(P5{PG`gY`olJ&1fUd*E4ls8?t~ znvIOujTzkjWIPfYuPKFMmZ3N_P@7x(>sOoNa)3c3>w)TD!OvZ3ujFTK-P%-yRTLP6 z`?lOLGGdOmU6bbdgOZ#Lx1ub#SE8aCapAqGosjE0;pV-|OP-yufANBm>R?kZ->rm`yDlP@J$uBJZC`rJHMsyk zFw_+J?zX2Jaj;T`1|Vt0bi*lc@w6#9;l`9UL(Pp@JXBk9kW_e>>!_2N+)*I^L!wln zfjto)uL`DUu=^iA*^GYeS$hT%<6?fB@uLd33v!G&w1TlBgc`9~%xOCbo7n=zEKw^z zo^{aHc7BcCaRjKuTOag zGV;#FllY@f?2Rc0HAZ62j*pM0M->Me!2`(u6u@ksrmr0!QA23CxbIGYQc+O_obf>V zhFM_@gLBQh(FMqOGhDzqc$RsX6q8wWSFf7?48}bPqO*cI>(cR39SGWVJ5&tE7!^Y+ z>PB(bE?v`~4bI1Q-+Q7EqShaw?%2lphQi5ccGL8C zYVB16Q(7{-x&w{&pK(~mHGMBqVAuSz@)93db#<*uIH<6-Mt%br=CANpSA?Nwkbvq zez4G%k`l&;D5II4V{&NWvSmF3zCK#R{$og)zplkr87Kg$b)90sZC5b`kTI&gur7W@ zj~*#&#l%Zmpi3G0_O~{DkHwxots+iWsceB@WzH_eA68)I8miH)!LT;LdLic`Sfk04 z*)VHMC#G=EEg1>;L@%E{__ZO;6Gw$>X-;4bdE$|0&+e2K6_Kn-1Z=TxmuFmlwhj&! z!y*uH2N1cC^Aj`%cU}v8@lNjs@*nK;PWSFKy4jYqCr@tWR?`1_z@sNm_I;jfO4iT* zEywJhEq1#g_9vMkK4;OYLFduZe>lG<^1}K1ckhBg9kR~+P1X%eYM;(sw`7YK2c@s5 zOzOx0!T6I!t!hi!35*NzV`8!}8QQ+$;S#{!X9=vC?(2+j7hhiX#^J{wSX0L-Qw;uW zvb1alb5{ZbKn1opBMA+{9KNO0dmvCyUJRyaDZti0ms=4F5X4PGhbX@WRgIj5D1@D_ zt-JWQ#}bMsgX|clnSS0pxS3-5I8~>xqx(m0L=MzZLE47NgsF&8h9nh~QzYnZLv#Ef zZhb!^p14O9dTqGwXkPj|)xXQu}F|WQ61~6r%|o0|y9vdKueO zYzJZr=jPyjRFY%=_Q1W>Fc6@EuY6K7Q0_ty7sWwpxWCQK{wS7=rYZ zgN!9Ok2Ulj6Ti)q=5E4tCkVVkT!e*adx;m|t=r?BEp}L|5kJ}qi9bFw zYP^|=Q_*H}<(+TWyS{C{U(C}nuLk-HDnM5qrfo%#*XGTe?cH8OQt%(7Gmwf`9F|O& zR1P%fw6LI4<@~Av4Ogk60B-kbhEmdmf1UIlZJlQS`RJvCy2ppP!;OC{)Sw;@BE=hin? zkUtGyUYH&a@If&|F0dJ6lJ=~}_CE(eh}`=|LAj%uPYJyew%V2s9OZNT#3p9r!P8L@ zg&5!*=77RzR%}sNqQay5^wp7&kcAtNyi<6qXDYxz!1S zrA+kI0y?}M)P>1LS~h$O*~q;P`uB_)rs5Fgg8IUx^Dh?HW$Tlh&-L2F-5Z!c(R9i( zCiE?|T)Je5Ea>zhTtn#mk+lkcCg24yV!QOjLz-rVqKFtr(T&tAU$uBqRPB8~>B&$V6@mvrr9Qno))#!e||sB*a}&B;*Fy?EmDN&<>Z)LS6XNjaW|Ngq(e-Si{_w!s#xa^}RpX{n)U zZ)-wcOx>@KNy6E}0h2na1lY#pHW`GhVQ#y4zsoBmQ4myisl}`bX*N6G%%m6Op~=`4 z7P^qeKw)DcCIDSQ=VeYaJ$y6F(K;Vzb7RR1+r0a>8+^{;AAe0+akSu=eN5C!3<-Gr z0}w;cVU4-9+C`TtMphPPP+s0R#Rn(iC5&t2&CmJNiD9Mz8cC)_OZ2gNK!&^0?1Sv& zQJ~43Fu_G>Nc>4?garY@HaB?5hN5ik*Ve@G#}X7#r@fB?4e)I|S84yAGg-&U$tflO zZ@}*EZJ^39(M;aE1fT#k@Hz{NXzNi5K6j^!#z7iaIl^hhRhDT~roPN1EKPW?DTy=m zErUIlEwkB`yM2&g=^%r#VQWxz1g_3*-dHjG*E9|qj#w*e1C3>_Lu z7gh$=1`9zQ6o#H zu;2EXK>re}LcPgix6ljKF*a^Zzud}iTnEhH70*h))m{N}Ac!auFbetIA!7i*sEmwR z6-SM=b}XxMasXwp`B1<4_ou<)+;h~RbmyOU;ayrB=(QLE78QW^p>z9ZC206x(py_s zlU$f=SDSHf#2Cpq=W>F7+Cx>Ug!pJ)W%y+VlW2na-p8p$vRwOnxf{5h{}Z@=W6)a}uu34<(a$dOW6`Vo@%oZIa- z`2CO^wm|5#h3uo9!=;LW4^Teky@0YYZP~kxPNL=-Bd@%-eVWWhIKi19%ajD z+&oz3C4Yu?S!P~^InXe>@}J(^8pcQxPR>1A*Sur59zHBt>2gaK>^pJJFGg)W=LueE ze@YPP!8zrm*}*wd*tg~SvAPxpYd4{rf040KV9;^wDfbq=omNHv?dx6CxOck{X@uw$ zqfi81!M;nyqXHH{FoUr5;NT$UzB{~xhmn+WI!n%axEivnTZkoxB9LtJAlk=nz+=#r zXjZbRvZYJr5&`ejLB%n@3l~G!RzK<+PF$yDrl>M`alYtdi4rqLoQPkd3=mah+T&|H zIHoGUeRI&-KhVU)pXY3^lr#TAXjoYHn|b;Y{b(INu;}9>r)`D+bzJGhIiR6nprani z5TLwUxR!9Rsqq4wYTw)`T@F{)DDUyH|E~q`MFp_N)vR~p=B69nsZ>_(rYMklPsS`z zLGsb&pxKmQDBmX<#VC<2!9r+8O9<1YjBR7V43ODn(9`Ce{s%J8ss;`M6P!8oWyA4C zQ4_4}j`U+3-pNtutI%F6b4~|r3-+J5z(`B(OooNC{cDfYz3@}BYayc9^!v8BoT@n) zK0+hedE#O-u7C#&ud6oI_#VR%URY1ib!}rHC5`}{wUJ~wDt;tqq%n;-IR+47dKjv% z$HZzPQPp1h^$2^0?bkGU2*XvYAL6eO+L@Msfrr`CJIG)=@dt?e6hZHHWZ2@*HaS|5 z_0hGt>B434D-sfF%e=0-8FJD9u<7pHfDz|9NOxsj?aCphrhE70fZ05F^eBM#Uc_|V zVzPWh3th7ekK!)0wcIYvU=PGdnauW(=s^WvYIpl_`k_|Bb#+u^@~z|PFM?`iV;?O5 z&nEPXMX!XxN3M4YpYhj=Q&%-7PBqy6d~X~Lbg%|Za@|Z03H)C(^1screT-hA)$?gE zJIev@D4Q+7=|SIEM{S|ZlUIG5!a0_p@gaPcT#nW^A9X$rXNBx+X~hz%H%>n{)n1g| z#>-v|$!TQqz|!I41$bO}U1Rhb9k?@=(W6&AK{F)E5&NCvvGGX+htGHEoL~Me{71h( zi`A^4QkV8xLb^Z$+lJimDzzGG?ea@nWvZ`on&f&?S^peU{Ho}xM&VKCT*D$}%*elWV$N-_(ye+Cr5w5-l6|x?6%CK3{ z^XJw_Rz~JM373>}?mv!hdM_m;k+vF}y-0c2(_6Lc%|1V@{q> z>$Nm8?qRHL@9udASm8`#^zaEZ$&3H%CCc;;w;JyK#AK3>d{`1_w~e_FFQnc3by6JwBaY#2G)WBBh^y)|~- zgI@}^eD(af!C;&1@zpb}Sy41Me(ZUpLlfa#+3M=9$+(D5|m)n^7i+(LSDr)q}!9jW}PlP3zoEf<2^WDGyzNHd# z{(KwC@mxfSM3SnNtSTM9a^-~?jc!70sr0&y5Y_EzE2q|}=Q?c3w%rah@M7Xeb%O!s zz(}&e1rARr(TtOoMT0-rwy>zm7>p4Io7{G;o6TDRw4SH#Z!)M|w-!WDxH zJ{z}L@4sK(=Y^5R`sbNW+znMdv7Dz}U;XvxPfMg&5{OZDJ2RNC4Id#TJdRD-7~GWO z2ON!ew*9g_$#bAUOs8Ak(~VZkfg4fX)m>W=!IurCT14A9Wcr*>ckMw505tOX&P{| z?3(e`h9K85j%tnmOb=8&kaFpguvI2sHu9iEWz5}DY-%^Yk-88gEI4IVRlTQ6IFNH0H@vIwiYJjy=MvFPzwM4Rxse_g}cT{6RI5?goJoo^iRT%BK=mmn>i?BC$zd zNlUY!c?7Ew;03b|ko#phFXujsyY~p5x8*wcm^gPn3k1R$WI1aCnGr zmn*&ufs4tjjpP&RDn{o-i`k^_w+-zVAHQGzu$?lu(B8e}i7}w)FjyiW&G`L!Sh`P@ zA^@%E+>n>;VCgLTzS?Tv=xZU@Dm@44cz!HNZfM`^duCnMNR3jjtInkQZ>lM6CPAar zSv|g>o@s;pla_r;aPaNvf&V%iwu5?9X&Kbb;qh>^Pzp&^(Wxsp!YCs{@~a!wuivh^ z-(bBa5f?9CzRByq-7u`rKUfuS*F~H#(hMF061_)dAMp2UmV4aUvox`(JI=qU@-f)y zcXz%3E|e6!0O4hkr>b8mJTB!n%8#jmvv!8tkvR)I2QyUTwkG9(tkMx_eRU$`Bn?fwwli1DfZeialFt zx2j93;*PQ^pP1Bg3;U+WRKiRrOr232pSULeZy!)DVHI)DtE;Q~dXfXq=S8(88db2i zrnGp%enauq(EAya0;iA^oJFfGu^@`~F7y9!OJDqF#)$ahOo~kyq#XNM@OrEdV2wT# zm;J7-)dd1(A7qisQu5)$cCa(q8N7dauiOgULPpTH_AR9A9=dC1!~Qr|tA>uhYnOf< z-8H5WT+I}fcj=^kpqFTf+(BBn--Qboa#Fp=F3dc(lZ&JSdp~VbyXuUad9KNB8avU~ z&#`4Nx>${OZz zC2Wv6gf4QfCi`w*XXo7VFdjZUeL}Yr*0J3>2S54ec>c2`gP=^*iI=Ce1Qn!w!c5qN zHbF#_*>j8{nNiN59>;fY3X2XF$FA(D_BhUphb5{VYRXpm+bFn6cuY@jU8|$EjprTQ zs*j5^uMa)hb#_+T&c)qEO#7nU_SCo5sR^%6mYr=Ea)T#$6TGzOllISs>;C%&edgl! zQuV)Ip80*F!;y(P>Lt;;N9J(i5Ig24%K=zO=83{cIQmaS7M$WdDU2hc3^@V}kw0ZC zxaF3UCwq#NnUY)V+2RnBq!H0pQ~p6&)4W&b&Fa_WxMj1K4rsPnDO9&Io{%Fr8$PiL z-!Z1RM(EcS6vTfIV|5@qd=V-rm~&a4+S=PGx#uBT6rLOw?;I?qs951V!#-M{T&x&o z)!n*JY$E=pci9QWvT^xn4`GvEEA_tpBR%&VHqou{rEC<*Bhy)7AK zDX1rC8@-10dJUK9({UZfd>s(FS^?ZK1Z%94&&;LWLaokW`jzq8fct2zvuG-;CoDLV zuM)8ArNj75h-t}On@iM_1n^R%t2{13RZ>agdFPlmgV05P$*vO12nHH(z#RGYNSP2A zQ6Z_3y%ZX)2ofDNa9Mt*rc?ngK`5sS+Rcz2&(u^Ki3S4AY&f1Ojw4q{B{1LXl{Vy=LZZEvePa%30cVEg^swtf3%U3NFa-9;vQ>#W7s%V0SquN?qLgh$*4 zuaw{KSyxQMnPM~6!eYyd!-Om9QSpkg3_F&3$rD0bg^J)lZn=n&pP-CffW`D?ECA|+#uQJlwZnC{-xt1+`knUg`2zkT>P#efPP3~ z;U_9TCS{(udbI=rvE&&FSuI&7Nv>4 zs$p!Trr%VA9c^W>Jc}7Y!VVKvbl46J}J#p3HRfBg6=6CjvhOf%ytvKvd9r(e$S!r zkSH*t#Z#tEeYpCU!&(FP(vGH+5v1K7zQBD~8J_Q~(&cDxwn{={dI~&ezT;ESL9F7jEg(~a-VBeU>P8oHyKAzv+jMcG2(0X zl)2x*XhFtQ+jn^zij-?KM5HMv*2gJqJe~HyE-Jxt&GULghKAfAmCVT)fh{yYF6~*pP_DsEs+?JTi9NcGDxj z=g!YvT}SPrgLEYx(#?jHqVCZzK$H=G;E?cxg?f$JEQp(%gRtP~Q<)lkdj^8cHgIx{ zF9e&f7zD-5oklDVso{oO7RNFGK%;y+4IZ*;mh?>XO)_&8FOJWFE{5*jk_QhMEfY=t z&jl!@kbGQRD?va%8FgPLpi^!0=#>a3yTz$`rQp4=Ki+A(fv*h}7<^C_?&#Y?^`ZGV zv*D(<;@2sBsL=U`^BPjGwd5r2)5jq$iM=16knr|#1>MAQ@KwqNLB{{%24AKILKsL- zg(HCtESw6BBXy6ef)F^u`T%3@Q@-9X%+HER86ky@2XD#FLYHi%b%z&c9<}GXKTpDz zYZ4U4egWQ{R`lRP14p3bDVCr zr-LTw9$j5Oi_St^JWO0kM~pt55SKMqf5c_low}IlH4Pw&1r3`r4w?o~Q%s|5SRJ%l z$al?f;6tOiXPg2XhW>NutvPlpJ)fvaXHKzTAGLtJ(K2yU=6sYq3JF1~&Juj+;IK9Q z7<(oloP^KJnJ{8={n7nh4!yn<*?hb~NN-VzgEJ#e_;DG2k!)3iZ#w`=MGMWo0iZC6 z;~e|4J=ZU&Q*QS_Z;X9Mu<_HxAPerCQjg{ni_+nSr@3DDgUs+PPasz&Cu`Y>3flbBBRH+T+t==B& z-OTj&%r_w%wKBYsMMQVN1f%BMRNcyOwkihY+C443KgUQ%LzO9JJ#vSR*4L?6`@!b6 z=Ty$Zn_~l;Yo?{*>K-=fKyT|_39ew>)F2@IjUsmrY(q2dpQM0nm0}xk6(d+ZS zY{8MhHo@Ac%&mqWE??^@x~AA7YmGwVm+PkVh`H@%BJ{)trZ!lYiv>c65;hn90}0PC zcQ>m_g4&8?$J6Y2*$xwx2}`hV-MTeQ^xOZ~Y(Kf+IInj-3_Lu&!bl6Ek7DTddOA(X zUTgG@)(+W|@YwKWbwWzIC(44sCyZ%}-v@&({XGF)8 zn3BC<_kxNXbP-WY097*FXJpunAWEa6qHv?82LITSDv?d{`9E)IlxoFe0$r9>R;8|~ z87MUavIBkqmqGUwGrLcmmidu)tk*9O^Rk&VsmDB^zk;G7(E@Qn&LOUWiz(wDU$9gEJ8xwWVcl6C3|qr6gmbcM z698W;<0dyoL|gT)yj@-GZLen-Y9(76#TXHSxg6!rm0}4m( zj)SrJR7105<+S_!!yDiXQaxrG27^AB&X3<4P*s z5_Og_YocFU&FlX2?VC5-$yj(ydIGNmAx8m;1Pa`Uyd#=yYHZhT7 z9Zv^z#Kw3!%zl0i%D6W>rj>6L*qnUv5}FA45s+?jr!fLf7+B=hSPu^Pl{cH!HvH|o zcNr^{T<6bkO7cSNxjK!+>C2a&JF4_x?N0BEQ3&SbW~bVrSn>r7wC{C-AT#WVF`Y8L zeNTvwx1Ba^{GGJwq`Q90ug;JR;VuI>Fjf$sTj?{LzbmmVlEcF-!BO0l<4A}OPS5~@ z^TWEFtDes~bvpcLfyp6iCR>%MpyLyI9F3#?05G2Q`HML4xx12axV;|ntG2dONFJa} zNzlW=Fc-&~GG0P2FB92scxrMQnf%_rfW$tUP$bxvx2_NWT3kjZ4nNVC{8_KX}5l3^g<`zv(WC5I-t=L(V{syjs2MH za3B{<_{g(b*&-ai$i407kaXw(H~L!3qrj?Zrh zZ`#;L&CGJ@iSecHv5vAQPVjype)&F1w+6z+19Mbid7d~ms#C?!*p*$W7pJI9;mDt& zTWq(0G`v%NBlrd=f{53UWiZ+jY;A7 z)^{HP7$Ww3cz?-QQ#eOhVI5Gy^(`6ez8g>zBi1~}Bq_;9JQIbkt6-Pigb5*M?k473 z;#x}C$^`Bbj(OFDXlgYXxgpVk1_s+V?BY^Dmx}b3<|?W16(XgO!u&xM1z{$hE-u)d zOBsmS{LgXJUZ|{|JDf$o%xG;tz}b29=OQcPZLOdlWLMrf8_3DW+}ZT@N;#D7n7p4a z8ixQ3wP*L9|BtBmfa|$`+y7l=b~MaTLSz&f$t;P4A}gY@DhgeRtcs#&P*zAr$W3`~7;I<2aAwID6lmFrT(SjGL@lT(oK= zJK@bI5shYbo;Y>#PNKL;qk#@Jz1)QoFL~DVd;hA^98Ed$ zfV9Db&!5$Q@)U}JGjztHT7jS;Mtb5KOt>neH-?LtVfJJ-gF3$c^Ms7A-@j}6jBwrP z!bB;1&zEoCvY19n<_4~i8tLj?^GFJ0@&)92?M=g=m5G|ybioj^c0ZrueTiOlWzL(5 z{gnQHjebI(_I^4HIh}iM898DEv-Rz6V#~zqzxw1!C+4X7`WGq1vM_W!KFu1f0wWrs zUUQ;BPL~=krKD|a^O36M7cINJ2Npe9d3k2 za-w>dG)6;fwF+pYky4*&n$OCwRygh#sV^r1Ue8q_p?rQZ9!InYT6fJseaEz2x|6=O zUDTk>UkxyYM+RZIvn!GV5nTzXcHpzct5%5thSrZGomw^Bxoa0QjVtuFPl zeP`VFUc38R6DAlpQQ3G>%T75;*HL4iW#;_<;{v$(PgDv}Q0<>|y*-XX7KsQ_4oADt;yKzPPxY=l3mGJNB0+;N!8 zuP(=K;P?aEu`w9;DJ8j1%u=b62_GVwqg~^%Q_?3Cmol^RgJfNO!g659kiENi-;H^L zLl^+LR0lK{nYhIX_9CAQzF5RQ3bwqc-(gO$}s3bxA=b8rX0l2%^^KrbX}(Fw}ciH zb;QTPE6-{>*xQQ;{JFt0rx=m;r@8dHJO=_L`Mn%Mhz;ZI?cZ(u5!m;i!_24` z)*nSRBC{^ikCF8Ahx$Xl8z$ov{ z#j!=-Sru?KWRj*>xR9{C)uGD6K~xKT$@`{qD}1wwU21n>>x&!Ru;S`^J@1?w=yp+r z6vbTe>~scRoQ$^i)+WZz-GszLHa$)LesRVq)>_bu7HxPux*gppGmI1S^t_qofwj}EdJGP2MMDJO zbli45B_FM;!}*&gXP>MD3NGXQ>NPi=H7h0GHyHUVvY=NaC5p0&+0FRaLg$3rXT77E zPl;dQmEnh|)m!oMD3;%yb>c;GKG}{j9!7Y|-HSI@u0kIS0aH{H@CF$DtgHC04pS0- zxh+hO%HP_=QK;cq5Sl=P65LF1bmG_lH#Koks{)oD*e7XRk8zfk$_S1396Gd<;z^y{ zjM74K2!ZdpdO&V^h9aNDYDi?lRACc<{pp48=-caVD3!Q6;&N>MuOVPd&&fE66F3H; zcQr?Eze?a}M@uE!yfA?B0;w&Un#q^?pQgU@YfY={8dT@NZfBl+9QY$ly?U3wKOB`l zI06(8*bH?_SmdKdkIsC#8rXFWTh@?GXi$^#q)Bx)=bq56UF9PCN#FTD7BKm69CiGc zyguQA4O`z{-g}Y^QANE){X(?0FQyoJb8I>n1}Gixg)#=g{Nvglu{D4Cv&VBM0F`j> zr%ny%{Yy6|o4+H(SL!V{_XbOS7nhZlp~Rjzr4qpV=B)z+L@eS0Z&wpo*h(h)QZb<5 zA6^_99y-aiLx%%FXXDP^FzIm&Qi?Q*eCpT$ut}_5j1J@ty6W-ER&pQCRWEtw#~Uev z|59?g7QgHllE)%RDf?)DGBH7;C>K8m1bA$Ui8%}mxF>5_dT|;E2i2&_j?h$G%ten& z`k{WkS3UUtu;IhSe@2d4YLHQXRU@ePf{~m#BYHic6$e#!h8-kY`=%c;!hm^t(J2*Y zMc{QCsQhXRk+=9DX2HZj2eu-^bz!NH`jF`zTk3rH(4iNiH+Iv_+4A)FUb-ZA^< zHVTY+>n^``D5P?uFx(v{nElq8(t&%k~08E*Evq4w;yW7L0koXLcw8 zKOgDs1+px9Cz!^f4`sqdi*Rw%SS3TymTjmJ1TF+qL8rIXthbSaLtkj`=6p85GT=w( zg6l4=5zhhmfZ!?Fis2H717=_idi9ENR&VaDD0aID`aYa>S$6*KnEEN^ z`)FiA`J{P=d3(dDTLU4_iWvCOqx17y+*#R}WQOJ}CU!gn7}E;AUXS*ETF;*;neA3= z$hal#7G&YOzYBPyY}z*BOsxSuA^5m$*!uAP{cN5b1fu|yUd{tj3mVP_hT*+h%{jE@ z?c|sl?5jSMemCSN1ua8zJAA*tpNG*R6cWlyPv9bm7QP@yXebPMWgxv=LUBPG*x|=< zCZJ@s&o#BqM$6QGterkLm~|M<;l|S_yLGaTVQ2>s2FeL?@N_yU$=uS?8-fAKlL;CT ze;=3J%0e+DTyrKxb%=w-UV{513JyMZGyH|!miYU_#J!3TQpoK*8`$J`5M~gq1EcZAgbu1OnMyGMmgND=Vj6+GfR`O( zhk(^cPMJ8KtcI;T@UMTXq~76oOb`l>J~gED&O7&YPji-?le=y?XO4&YHLY(03Oe5} zY-H-dDkFv2%iTxrTam5i$=cnR^(_e82D@&o8)Qxe=+HINKFQ3 z64)H=-nBb-PUrtK#`T>dMu88b248kcXuLDW&T7zt9*QLYE#?7kAU){e7Pje}f9qBb z<(zaDz!g%~Gv^oJ3ltO{`7TI0g-Xlkule`iKRv>y77zRBeeqC^olF{`kJz4%`w+Ti zNzz>9^i@o=A5?6(7etUpH9NxntLS8iZz$B-LPiJpXd`zMdPTc#-2w@^(4W(@Uh4x3 zQW`Yv-Me?m!({d3V&EhWh>R$>(wXJoB$N;? zZJ^Lf2`h#a&>r+pFymhXNnuvdu)%MOd$n)Qm|v#7!>d0fuRxFrEvGVdAtFYhH*!V}-m^|wB*uHGRo2bK(I&Z2Yy#iW5sh*f-!z(y;G6C-# zHJ9J(lKnp65lBtdWl0c1V*V6g!`5pyQ=V z+8}Ul1sG#ww}!&ft*ev2m@vT*4W8otclZz4mI@N;a3HB*?nSkEf2lM{ZUV;Zta#YJ zLH)~RR+l%dO*dREX7Chy_^A9n|2-;Ujjdzx=>=(LO=3?C@G)C4;Hg&2h6wnt>*LXT$RysYCu>0_KbtH`uC4+bJio+#ac@_l8F8b z(h;1~=eFU%YBDvV>7bDk4@CU@Tf#p_Q$&L#ECRUy3T@hmR&Z&;!rR<&w}O~$I1?OOQIk!Rr;c7`3%ZMNy*D@?laq^>Pm zW$QRk$f;l<+v4N&p}G1ml(9)* zZy44|?WC`tHghg*vl5gofi!qS z=WbkkvX~{FBma~1WFctw4|YIqqbJM)w5?K)0FX926^h< z*ktY6csS5jmYJh5&8Hu5vnBvEE@>$2S={$hh-~sM_CgiBm`V&8E^xX zG@jBEfe)!fjvUGks6f#6m~LE zSg@oJ#PyAf&B)>js7k%LYq)Z`O-`v(@6t>uCxudF{rdG{R~U9}3M`T9FbwE+J2Nir zi9d`O@5um=ND2Zb8_W0tL^uK1LD2xFivnLO{+ezV2@FCZ#L%+InDF}Zxs#|+IRIFk zT?43eSj1?=HO-547|of*3Ihwbly}FMW4K1H-)gL_U0qy$pGf{uSv$FVnYvlTuj+aK@a$ds9Os4O1OH!nz;0L( zKC;3#bm1^OrDuWZuZPDKp!$&0>KU0ZufVE@lX#nIeDOr!fR zxS&XMs+v9G4fjQKvT$?c<#3aU*djw`j{{3o{JEr}HqfBS@D|Ii9-LOp>trAZkynw;*IX&L zPNw;aZjiM*35yBpHqzPwhkiy}#Nku2x)_!LV3h1!*k#P75zIVS!^{NgkVwX6*tzUd z^l?V^C!mm3pXHoJmo0nO`8+XW8(U*EM9@}T=gp|zeDNK$AUG?j`OB6cxvO?+j@hK) zGmiv>YF8yLb^7ziy5&^9G+PCK_b9fC6n9+g`-N;o{3gofulct5T}L`?5lIQwaNbnY zV{c0MCe3jv;6{|QVQvi%-`Y+{C~3{&gBM8TV4sa=F938Kfm^8GrI?k(1v5EEme8?P zq}y7BnSMIB2*FhOAD85Kp@rIjhE(>HSJBTbz$rVzf#Z%nD$Af;J?7pPD)kPQi81u` zfz1neBcRDjG&na%8j~xGxcJ@glwImgWxieO^z$nv7g5K9Jzxo)Ow?(Na}D@xA4v)lVcoBXaW9Jc$@ zBpxK4`)A;TaaziDtkNOq=0IK4mi|Pqxj2MNHxav=>L#Nl85XoS<#w32Q$gr6AFwK8k zx;5gU8!bpttGd+RiTrAa)pRhfC)&0$31;!BNp;VQAOlni3`Mpas9gW(RR@K}h;57k z7D$METEnc*p+?hb5DiN7#{9RCRZwoQ1Suh;(0rBCQml_aytAqJL<|b!L0rCpmShDb znJ?N(IF{Gm{I1&bC#2_dvm(lzjeDanv+-7cT=29aEw(W5VW6!?A52q}We zA*I3xURL*;7==}?3gIOwBQ+_ZVK zxY0|e=#d9B2K(*VfQep5n-2S~H|VAHs4e_{v4~;rwy|Jx)7l-gC(fV$=dxn{*j}v$ zwKr<}b=|R6Oh@EaB>1m1ISXsvqw(Niti5j7P}3vWrv2m>D$kq#tTcNp6VyUUB#(6j7Lh?G`3pAHRCF&d|!@k)sf(VrUeI ztXil7Y!zb$sYgxwf*Oy%biT`8jx<1k$I$50L(-64aI`){JI|ZC5|KUk@D6bV2jmIw&n0-sA|h#NYIf{?h+KxH;=KI9d;ZIS;_ z%)Cz#RvE)#kaj@WcSW&n$+TkC!k-&47=lb><-`~O$GX7;39(V-D;M2}r>+t?NM=9w z0c66d7vm}ETlhgVCo00BRXd9gIeB{ysPg-_z%h;SW(Lqi1xo#R8w4i2&hdFH_=C^$%m zCSYCsKRR#!X4CgE{QjRQAlq8!8LUs@-+>w;psVnJ@QnPSqpe+W*{cazkkpxty-R(e zKI^H1hyk$1+w@o6^;0RT81yoFuQp!`9QT*jsF~K2DI^g7ibW*B&r?xWdt<;N(;upE zfPEp#y}6B$Bx*z9vuCo$LyYC9H{n|m5;>n0!#WN4Q)(4`(A8s^hL}@8P!MH2Bp-N~ zV(Kr!=gE__`8g{`4&Ec{oZxOCm^9RE|B{N5&6nb*!F^th7aG5O=e{=BuHnis(b;(* zwJS~7PUc7q5yZ}sSaprp&d-%vkd)cDX;V8+pfrb+o3iIq5IaPy2ojllqg%Hz7;+gS z7ht5wy!A4KviQSfknGP-ZoztK~_nL8V!rU6|!vv z`h=_-;7g-h&jdC>Amv~f#<+{aLuV^){HCj}jcBJt8@8o(JtfZzzN_92FGaEG5wmvy z9aK`+(7ZI}NbxW<&>=`4$e(zNF99De|F5NsuhR_p`UYYPT z1TW@lh(DE>5CU=%z8fNQxac*C5vEv-@o&r6f>bZ= ztZ2#v9FnUBNn#ugFqZy?SR?p+64L<+-FrTfV2r>j*KzU^4|hH_UUi4f7(r*8<2PVUrO+kIHkLMFD=Fj3E5i+`X%z>KWWnC&v!L=-`t*7qV zfBDXVi%auWq0%=(mt2|1f#@s~99}p5#6SFepiM32bcWSIpO@(!3dmor$HS#U&O ziSNmXSPHZ^l{X5k5X zH7}lt@q+A{5vbAq+uQNIL&Q*8zPry%1$F5{gzSoXE+M?KB>lj(Ww3{?gI|dxNyx8b z$9AU%j*7j)3zZEUu3iqy~`um{{wUvQG-&QQS8(rEo?ZZwCwW(;Ay2P0wzk0Qip>qRTBhPatg z^1?#@&;0~mG%u?tx(Kq45#wSgqO!{EZzA&oNvLR!ya`g$E^xBNk&+w#&#oLpgz{1f zkygeLaN(#Y-!34U*g842#-)VXTCDiMXz)N1_YFK@+R`yQHm|`F^Nl|goi=3K9g{R8 zW1J!Lk5lmC$q@z4fPOemMLAw{>sysCqZ~}?9=vIK?Op93jrqkNl#Pe`DeB-tPdhwJKkuXC3!MT*dnrwYR|EiLruQO;R2B)3?eWMZQ&-h7;bHRL`~ z4U_gh?Y)_HifO7)JY*F{SeV)ts3$?GFV`(A)O`d&gRoib^M_G^e(YKX3&ne^`M|J~ zSr4vA_KLVN9fN4bb0TSj(SS>$*~?ySb~NJIr!8MIqARWF);bSCU%%BPFVWtWvlU(y zG$9ffD@Etua1^>NDcs#%pF~LoIeuGjYDCc+5V8ul=nfwqTR4fw%4v`(@PoZe^Ko${z-$2^a|4qb9S(8cfh z@aOz2?ZMrUAK1LD{`goI`n3keF}$ki-N|?|B1hVT4Lb-A zKQF7WaL>_K*s?i1-axX0#Kowd=EPs#5ci6YsW;P_>n7z9a0FrO{c%Jelc#?*Q@H`8 zxd2rg(2>LehM#M`yfUUwj^Y(|7`TAFT{)OL25|SUfw_vK37L|ec~Es%vvN>8V%bA4 zZj*R@^Sa+3Qti}f@~K5lKWrogcN?{STtfH3-+awg3Uy z#e7~qpCvuURQe?9^qj#ZKX=1#o6`0=#e-077B7xk;M&b-UDmtL9wp5pNh1{FU9m_5 z@!5t&6FQzK7Up%Q zoH8wZ`(w9ki-)St@9ZO%Xua$7yCSt3h~S=8yOqP{5A^+r4Az)71S9W`2u^Rb9&{7p^Sa zsdpPYTD3U-Gd(rcEy!p~Xw}M!vc;~|CA()EDqxDz)$-=c)$e*UNPn7n0(h6MMA#-} z#XsE(YL~R1OxDJXduQp z%&I*h1ZnIUM-n523i8U#WjMuG`2K86>^ed#m$k35KZ_|ONEG4&Axud_E~bO^B!HME zxnhA@R%Z0?749_?r5$jA*Sh!6^d85cdzuNCyWZ_~-q^EV)YVi+BQsf)=1a|gWXxt6 zhCx)5vYzO$O&v)ou0;aJ0sC>tJ>lF*JOeZOzT|XNR8gg0E+8hxT{NNmxcCcTFqLkz z-iC6f_2Pw|K{w5bO#?6@doxC&jyyp07NndlcGrmB)ksU8ziH;9a#}=rfffdq7RDSZD=AG`gf!m zciH6ykAMn^U@GVnkTjZ1Y_>9T>-rihppde^GI-jg|0xkkqT>KYP!$r>^&(FiJhQDT z?#K+C4x*pQHE9h{<%CSULS1;n*qZ+hy=7{kLrNcuiCl5lRx2DG39ef0G-eJBY1edB z)uiE_N}HCIH>gv3GRMN=pCLoeRaZdBbU8qV%WmbntS@0(ut5RbWxK zyD8$})w=a~g@{e&{>J%p-})y`4IOM8n3l$RSHp<~$M62!2n*WawNXgk5|_zoz<@+Q z`hTm{S20t-tnTi!fYdH1mR1-v+cMp6`9|e=)k!@l>=l{&SWmN+3YKdjP%@6W zvH&n=75r)il9>oHASy^FCF{rf*0xo|L#jb z5o4;}9Ui&f2iO&2^Zs6p_*cM!;vzNxWCS@cqdd6(?33Tg`RCiP+m!ZEoVK_CpXu}@ z>G0ct`Nlv-Ln$lUu3FUm(7WLEazIOlk)TU7sV}Rl+M@5K4_u7l2{Rr+@D^U#A~KcE z;m`MdN(mbWh9}ht_t)0mUIEdT7~qm`h2nvQ6zocGf;{5Ww){eQGelTL(h>D=+cxTO z;;svBMb4G@z_7#I-25ugk~}2NARV@>Ok#dUeH>Dxe!O8RiB(**0r5mo$EA=lJa0+Z z_tT@o{BS2@a3(+&=q((UEsCr5GhRehCgH50z>F3`P8=V{+`=LgS{f8qvCWhIn09RM zE9u}Nbco-ml~rd-PpKU)zGVKj7=Qt*iE&6v_!_(UZV-yzULN|SNyG6wew!%lIXA8N zc@b2C$zyyB)rEy54baS)A%^; zf61%9fZOM%(kpFI>jU5j_X82#la2t4+tp2gcRi{k>OGR|??3nB9%ISPpNc1TC z#NpWO(=$K%KH0Bu;^fJXyU!$&X7B6P%JxsD5&|FK|0RP`Vg#+vG5&G)z2lZ+^9u)C z5JJQmqI}nCl7*3u4!g!$G-*Ry&+yZA0i{#QsN#tib-rst6`;3g9)ir~8pwdmvFL?n z&Rv1>QW67`4~iLy9b$Ju1nh{h>#4G9S2dh+1N|;I{25JcDI*e4OB!@>>ZZbn5TXPJ zh3ZzahMAe!3y4!_QAAa?16H0iGPKH8-~DsT@@kGx(6BHV5f3ZeO2u1|P=B}TfN2ag zh@Po(24dThdXYsST*A*5{sChr zBS4ZJq4)VVS$Kkp077bVEIg2hTlE^%?Q}^*yi;jvapc`7uoL_7WdH1qE zmn!4su0a{H%1o*}rUgRfLxmC(SRqDnghgp~e8z;1>e)bCYG9mnknQZjQxHC@GOkle zc?UT0e)!-gWnpjLyY8R05a5%ZmHP4EjD#V!r@#Z1Z*Q!w0%G4K5E7JSK6+HPFDC+^ zdiNAju*GgU!I}|Rn$V8-JDY~BS@>oBC_=gZyD;08%S@H8%pVl?WH--R5Cq8^^dH!G z0ZtrWoLg`wb%j!+4nw{Lg@&6YU4{TQ9`Za?fs%6>c_w?gT7x(KTnUM~XZ4@9V{6AT z+Rg)C_cQAqb!GXIC5ps)7n*?J!-uC(#@#?FF8?#;-CvNoUeI>cp{hr-w3KJx9_0x| z=tM>({Pmvv1EgU${)S=r#n;i)*4~9qe>(+9S`}6((HR*>(SC(6fTKG!JdKNPTD_9t zB=oc39ZuDoDO#4mGs7|1SJBXSlBNbU8g+WA-f(exlJ(S56L=ngJ=+Qn4-bO884NSK zeVnB!Sg$b4Z}3?rvG}F5GXkA){NW@(&A$EmX>jf*^xJo{Bm~JQ%VEax>+P@bobyv) zuLOfBw>h1^WbnQF_a}hW8~@qkE?tM;&Yc>3i)i{tfYSEex=q87bs9m&&$6G>a5ua< z600gID)K11Z}1^sXQWeq0nzXIuS{MD+=EOcPgL|Ytn7RI-Z?0@XG5=JS*g0$HqE3R zo=2%adD0}XjG>xrGzX?nDT)G}feT|qQTlW=ZQdTDK6GXy1@+`xj36{|*ZAaaR+?cj z(M(i`A=HaA7A!D>`+(40U1QIQEH@Z+i7kDuxh=NhAHbw!A9uhr1Nsn_rT2kNhf(99 zF;Px3)|^C}#^BYZH1nM`EKgvp-l!BOXer-YA)bq&80+d&Y54j3Yht3+gX$!j%16=g zhHTpt2N(r)S(g185%2d^45M$5&L-Q~^oWa(*MLOQ3zdVWfx%%|6Cs#ph5&g51D+`I zXy^(}kiWfoI#oga%HN+|LIL%k5I^`d-in5BSmaksLiqgbSq66HSf};Ino7h^a*ANU zFrAso$(>9IrS82OQ^sI^VLL;G8sg>+VSD`68#^`}IA{mlpF=`>B?sMGL8RyOmhL7LKtgWFRp9k8US$8VnwoM0^f`Yjs05j&<5|;(V1Ff|Ke`f3) zd2lmKDginmw#sO>S(~o1{~C@gWrg6xB(HX`twF{QJ{wL8j{|7fQOAQVmQ_XBLvlPG zyZiPM7Ml{yKJ^h8NAV zV06yqKZ&U-?++@LP&(zmeCz+?ey7;b_;|uRPEGx%r&Gi~EP}%-s?Cs> z@S}wvnx?e0xSX_-XPl<%^hs+{WK_ng;yYDuHIp~rNw3^+UQI?5w7NK+PN`2lH^%PV z6H$ro*<-Qe(aae$R(+d!7nem`t1*=$&+f3 zT=(BdU1QJHTekud`v8FJ*&K8FuF*hEv&bO@)WXRXKmy9BPv|21vn7%L*556na1*0zuN4 zy4MQBA0pY^0V7!C(*gujcAqh!hvp2IWr|UQ`l-;|XyxSfupyAaLJQKFf49+{VF2U` zZit|*NlR6m*EjYs<`b}&CS%Xx!!2=NMw2ccdL0ei`a`@i{$>go&uq96Gn-nK?(yqDGV4gL`kBA z&x(VuZ>7r0jo($N{~r0Wyp}epfhRx@JV#rW{IC?L`S0qgw&EZ?VNvgkAFL;{H}~+Z z{rOJ>6ad=v;lqhv0xjbW%8S)2!GVOD#~iT?>I+#E#2_YfJOm~NBQUNrIWE%hEMOxs z{{?dafc1D+*D9CLl-6k~Eqq|Ypl82j^5D(Ufxo+3!(H(U3hKj{(}6fw_ez9(-<<+0e?%)h)@=@blqFm+qkx&hFodhmSv zz+;&}E}-<@jt;@=P=xHsMI9}n9PmsDFJ4q*#$p2wLFopq51>TzHEwRb3AZb&KVpHg z2kw4aDasOG2(f8c#rcdtj*>^fE-v}A4z`ykEmVEazq2hZCxEw3rs*k(N`i5$etOZB zPY*9c1eWMq`68V8RC}!AnFBD;-197j2~IFj4W5*5T=#k{0`2Ontxclyq(I=DOeXtX z9;B}B#nhbsK{>7bEjg0TI+$b(OyF>sntL+XfL~x>?*#+rI6Jp9B=GA>(qV!`Hh`L@ zUY$V~(H^LeN#W})eY|&*7lZfg8BgW$-{1A~+p}!|Oa<&~T2?-y#?iNrr6vv=)2mOP z5C96PW~fBj!`8+pA52TC3w&*e6~Pd7zJkqtrQ6=HXg;W3A2`|e&5YgFRiiy*e= z;81^3&R5KMurSgwR8XfA?*&_~@~b{ir#ExGK9Zf79r3;?ijh&2Ux?&pmJ~xcyAx@ z_x$Vbd5vt7=DLg;RfUl-ZofIvlSA-W_J;$&h(!%}Keq8|voGtf_jiI^LyBdBuzz6Q zr!jg5UN7DS>b2G;Wwe+6$dUIpJb+~EN%yhz0-FxAX(qq?{;@)$1D#bSeTDFtI&YA5 z2pApXdNE^1G0mHV+mkFT;{l06XL%hM3dm81v%`+CsW zI$z*t*)@%BV`OKU^I~I04=(%GfdOcHMQn?GhykGIiNza%Q5bYLTi(RFUwl z%my~_&bwNtm^cE~3tc%=`5E^k2NbyD$>yA?=bti!q8k7O_OFtV{B*c^r6Ub8^Ot>CLg_JT?eJg^HH|NmCW$dC_!e)FK$*IR91w$ByS zh2~62AzP5BS&VpWGPY#GA+DPQH?XFdF23YAEC*ZSE(IG`z*mYhfp*DrLZJR{^U(C^ zxs2Z0si~FpEq(Au6nx}gq+<~|+YiqD!&R2qHO!I-pN$>I3eSla#)eD>!ev!~{eo=T z5xg&AFET`8nsQN)udgQ!Ela``*w+G&lfGavszaCigSfV0m~%>1AEpl#1cGNlF_@pg zfE7YDPeqqr3b(7M6DJhFNXHTE7}Qkm{OCX^B(m?IkN zhH{pRC7nKWlTIRm)%QNQrV<}G+B?~{&D)S2oKl>T3MA{wY5ZQoq597-l4Wr$oS{T% zPSbszHJEK*jD7M52V&HcJFu1%qdp27sdm6nW$H~k&@FvOO6QcUv2Y+E#@Y|P}%SLn3Z^Tp|UcD5%bakSsf)Eo1T@xre7Lz z8~z6zff9$uE(B59x+Yvi$^uv|+qVD6$p6nsQy4{XYdFs9>uU8y;)L>sQ_Q$fhAPNA zU=J29}V8_Du7{5RCQDYFrdfP%db4`l0I{q@tVa-RBC71ZaH>5Of3C{@+qVlP8GK2VloIc2F39z z+i~DXa`&6yl7+OTAyMSlul0w_a?8JoU8qcC@Vk?mPEcMzYgSum-~dF#kPi!6PF8)9 z_QVZ_5j#TgaZn;+8pYw3JV9eTZgNy((7{9%BBHHvew1Wc4CWIJqiDFArId$S#nUDtf)&cqV|J|q1)zt8PQ@VimD`<5Y+aKRPsb#~|7>F@PIB&v z{9uj;TDl4>74e=)wadyZL^}izhIEyQy0*`$os(bnEbE!hqLUPtj-QeP4L7xAAVw=J zYoq}h#jT(B!qSdHx9UZ-$CSeiw7l8I$ulSV+(l|~@ZiB0Br^%Ia4y*qKGi7u@})~7 zTb=wBUNY|KH5Dj~7*+2r3->F0>yn1T+Y|7ZqN5ofK<4*C24t!SUh=-VzitIiW}lx| z(@U}EQc*15`GqJZ`%GW9c(HE|Y=Zy1cj#**sW8d%hxjNy6L2_1azX1xJ2G+;&OHr0 zsg?x61{}Z^Nh{Ac$c#9Q2J{EAs0p9 z$^5>tfWCM-nJL9fBgnBm)Z@d;m*YEh;;%w5lRY{zmZtfGZQ@T9x>`~a_O=^!Ekf=# zqFmvrc%mt8@T={qTH1AoPmLGf>N=*@FJb5zYlarN-g%C0GPt%1h0ka(G1Z>ISa@Yccq%f4A!#IoG#X`mi_i+ zZnayo#2eiV^dF^4KN?ajQtp7Q3+;h{sR*~gKhzbpW_{sGAzIoQf9X=KAKVp4b+0J# zkSy*pzK-cesF`pW2Zt8C7!4!YD7L8i$}5HuHeiRZ{iZ}wMVsm4+x+q*4 zaD>mXCxmL^*By^Ksb-iG`*$Ck5!{n$YTVqDz4p$)OO}BO^O_J!0Yvb9KQ2Uhd;uS0M35fQk8Ke0tj1G3t2axg2`|Xp_cJe`bhb);@Oq|$sWLO}Y)vsjJvX37N zz&YPNzia^MPeW6)F`<+#CeEu*0*{_};7DxIzHy4PvgKm*V@(-FJ;=%-7P?^d7nPgWOfV ztdxyVLX`i0VRQtg7p_@e_X6@Rgl(d$o7lv_HyR7%HRK5c; zpY{Ct!bvkFk>Q@|{1br;ZO>I=6Zm8=sw&2^>$Wr~dG<{Ba$pqYjDlE<8jL+bisJ)j zP>SjOCU=O7@0Wu^0i`?cBqBhT#0}N2>5#TQh88iG-xuF?h0z<$(P?<}{i|1oaIx{P zs)fED8N5I7C3}G2vBf{$PkFHGa0Y+?qxVKFOIbw057fxGLt&nL6^;-cd8Dxe<=p)x z=gyv`czp%+U5Nf+)A}r%+Wx(H!UKWOT@xK2p7diXPaml2aUeNSGk=kf;rK0EGEVe> z4Jkq<4u_WVPE)%BWa@?u=OxS@fE*_i#9beFitLaJEuXqNvgrM<7u(tb@0|J7Dqvzy z*R#=~Udk}?q&1}z{*5v!Jo;|b11x<-9lHE1LFz>nr zwB`Ryn1A|FmmY`tS9BToz%sPaJ)j!@wfXqp=?eztVpIdQeOomJ&E-A!`=l+|Uw<fO{I=Eq4(wb*Yc}GQ_yyDTc z+ImVgVJs-OXhPi0f(digAO_>7`-#?vX$w7;g#S}-b8LXgj>VAPUugF_`(% zndI5%%f+3o?tN`LgS&*9Kxx|@zI%OTW+^DFtQzjOZzuCv@U$GpDHG0aLf6RiTg-M$ zA^8PNocU&*mU4^ELmf3&SE-z@gyyt$agPDX9{VQT9JF$9sM*SYQ>>g~A}%el?-{m^ zVQaU7uPvv|Dz~_|D?Z-GLRWMDs9J{`-;ty6$V>?jjgO6sE$ZZ}xqs0D?YfC^vOyr1 zJD*(&zw$aCt~BCH|!$bvW@lWmOrF}@X4AMEpiy;!&%D>P7i=WF zbiPnC;z#|V-<@>5XWhB27)T+JILf6(MJ(tT_8(j;j#AI(=P2ZeYj@wf-cOj*Hq`7o z*J#b^)u;gXKnVQ;GlA&oyt*6Kl7s60K$^IY&6ib*W2gR?FxHnS{-BuK0oJ2l_dMBQ zrUWZy)Eh1zr72+eTK_QTopto;=;fzDT%@0wbj&{GscCH!sr3sA>VBS^V=*@2l`f0D z2BX=n`xai$hEzGZ4$m$m9ju3$6)`)ZkdJr5VjCxdShf|*C{Dx)%YI}2d>n#A*qHJQ zfK>Tg;n#|rhv$Bv8s;F2aDm}%9+xEk$Z1oJUBO2-)_l|Wd)~7DtRq7vKdKJjsonX@ zqK-4pUii1X4U%fZK27WHzaGR2Umcyhp1U6&pW21b>@z!IDVxR_W436k&{yU)rlumz zRK55MjOGPZf5Tp12F{xsye`P!e+g(Uw)zwM+fz6W?a}IT{wS>;J+5AzciQgoDn@)O zAD-WWvP~HWb_(xR$f5?#3DZm(V|3a1CDn#43c>noAgP{Z0g>@wAU6>A5DW7 z(?h>8M?>A~XtT6)$Br^}6crE0@im1DzuR~J_!@7mSw*HX!EAOaiksO7F4R?y9Y>kL zTOqD7a=jP^!M%>?Xg;OkPV9#@`}g;Uo*_P>5hIIFSoGYcdU|#O&tMD9q!*_Mh(LVM zeA@czg+Tv}f)N0(CV>AV3K?3*UT(*!pfpF0Jajta_f9&Zkl|d0f@N@v_>MPNt?9->)%&~>x-Er)eQCwsS-j2V*VfBX`I^;O+(#E351+&__&y>-1 z(R&$w!<7^$l0*LKFr#_q5kf-t!woEK65SicZW4XnCTcF4V8zUAHK7 z+|4@*s99DWGsjcRZ(3}^lG*hTbFoR9#;b=%+_cXK_82h!;Ah=lSGqYDh0weEaUmxf zqdTno`SaAKhqrIt>V*p}NvzBIURO>doXcSv5i?^l#)$79CzW-1uns(|pUnXRJB0Be zY#e5^CmLkYJCv4&(;fdyuR>2dzqx0Rl8h{AWiyaGpT+x}?cn<~ z)oDJ@w0YaMv1iWgX5>~@UfyT72lKTxF?T}s|LsjbYdHKAiq=}(FZjkYLDPZW?4Kt0 z{Xk-wP6BawnjB}}>(8G*yVMqN zwL`fI0>YP<4{G;G1<$ zUIDYC)0j=`_nq88-X@#YU}7L_SP)`8`@5dpwX?L2boZ>devPDwvbre3sM(qT&iVxp zU{!;PS!=_YbnX!r8KDcXea*Uc<>W&gQ~iF#ar3fsbHCxcK~NJ{fO%}{e%x-~bbsd7 z{IvRBts`oy=JeY~nF?JAc2gOdys4UM-t|a61O((WFz9WE^&Y=}Xy?`>?WH^exE1p! zUFr@Hu+Q{IP>xZ3g_5sckN(~71^flF*Hzqt#)9l{oFGDeSFm4MbJT?sC&U%dwx!@^ z(jo0L^3;EE6R91$NRp7juu{dJKMiP zhtbq;R_Dj2<(DH1jEoDfF(6)3mw^EW1D_nGHzcYEhBy56A($H%w&;H+`r&(5Dx#fD z9u^gaASyTq`v#_Slm5lH!+Lns_xqDczj~a57CE&8y7PpDgvU)Ln=gBR-nlq+YX3S~ zZUhQ*Lcjm{Q8DLzXE7HpFJHd8tLQE2Uay`Mf9c-lKY&COavD#Ma%72+oiq#L-8OMb zmEOh0Z&^`eZGl2oTkXoi)8+KrJlg%lh?Y^&K!!!}v$S7Kujw{bpnAB-t2CTglE{Lo#iYs z1cQnygALYoQ#KN)+llqv z$8IU$`SfMUACb?s@~H|~7yj73vlE8eTgX5VknJAXP1FGl_OQP}o(9 zgeGQ@YW=2GzecjJL(G^Of3phM~-}N!nOyaA;6fASOd$3C!bZ6}nD1db(ChsjRGKLgU2$5qUDP}RTmXj^<8sh}F} z>_#t*Y@dhb_t?)N#p>+2b2;vR&Q~9o=T=`Ao~lH^&*Fm>R{S7(Q{sr>9cf6tXU}aM zA<-ExJlzKeBL)GHvlAQ&BYku%`T-Nf%xI^oDr-sKKTXl5;8R(@%wcXiCaug~-vg@P z{l?ayqe6V)XYed#r80v^VUW`xY|34Vv0hA!83GmBT~ZrSxvkUF&ZVZ- zuu^Wh(k+v zhWSk)j)PvQ(6N-#?|p6H!*np&YCz|JiC4FS4oX4z_HB!e4c>Q?l{$!}C}O4jWkkNp z)AV-&Lxfo377dU>7@WC43w)a(XNR&4kip*ivIU8oWGx37Q1?vL&aK|uAsERsMliTYXF+y0XFcbGZzSw=# z`rVwSqKwTOfr{zurFeY2l}K}t#3pxAEQy8>FBgH<&6_(x#ZjD1XOK%YSDL7YZwgJ( z7QDb1pZ4260|CTn^ffRLT6T1XK+S&<4!*HH3AJ+V2w0T317|0?~$`)6rGpfm{n zlD5FP!MBa25$0O&?#1LAR7G(x%9Y zqJN4gdN24~M;%Y78_gYpd9Son>v3#H4@=nIM{*Vo$h6offCPkJhR^B|t^CO?H+pqp zZ+LeKqgkySRa)efKAmcyuYdX5r}E9uj0T5(?4EaIZxFu|>*{ONUfL;lZ}xeL>(VSo zhy7!##VuPbe)l;|XXf{^2nBYuSi&O0?*iM@D$^W$S5#n-Gxqi>D#rYb3(O8&(k=yGT4Ve-isQ~9bO(pyjoYE!V`z9(ni%3D z21h66oIa|f_gV<X^X+$(;qC{<`1ZIE;APvw?G#2{$ zo$Q;8W-P=X^9}QE-i(Cz!EXyWa3GhCl1f=QF_hA?*YM#71i9Y7|2pwpihZJ9?$f7- z_^hiTD`8de<@@*7u!lvPfXyKIMz6Uq@rtw|uZS-{=d=u7&9QPu1Y#3NkXXh)(sO#c zmov((lmP_;AOXH$pkQJp(o-Q!;=CTs40O|%oDS&7{b`n8ynOlPdc_fZyG&yYV~f6E zyh3DiD7iQkdnt%VyAK}J@=uMn#?^5hEy4>R*n@`-(T523qlS}W(wDDLsYC$P8t9I zD+V7uh71Y8i&x+eS&R7dXWg9SzxAhDR5)GR0k(HUxSOC^cPRXyUpQlF)(tVLEs}ty zEmuKM1Dfxpqhmfwi~K=cGJUQ_Ar0jykdj4rLEF}?mjb2$)5&RO<$CO)nbqM@q8h)Y(~xDpWz-b^k z0AGa!&6V!GpwF(IJ5P{rT6fk{bShw+(IOQE$sPUmpLUGQ(r$6AbXefHy~7+XX7|a7c4N`K0a1=8%dWdD?G%jcAseuOmtaN3icx< zAN{kbqsqNQ=P(@*H3_z)35^gktaEL@(IiV<#=iuie zE>R6eY=+SM_j^c>Py6@omDR4Y=77G$I4rZ-|8W6Y)sy_d&u%hIzXq6*eW?8H+llZl zLYa~RG0~v|lX$U{h3gED>@)*j_M7r`k!-&?Wy(BG*^DW^_VZgjX+AJj+D z??Up*Cxf>c_tDke14!@{Wb!Lg4CX(LGqsryK?Jbad@(IeoDV6$TOTT`fBTvrtc6^XNX zgr&-`+~LaQ!4M*6K(U?k;@P*aU!|zws@v;z28@#7P|I0x+2H~)={Q#O-oEH~YvPEi zY7~=bE^$ly6e|FW<_Ze9-RuO5L|M=&NyUl7&Ul8K(>d9b#^U+AnuWU1BB7fPvu|!} zVggmXE4YeanE(Njs*rXi(e)Q@-IJKq*h_7wqimEw^na99P-opLt@w~R+!Va1M6b%c zvW53Fh9Z=hr(WA0Wm%TAhHgdtZ$DpO8>~x+y=Ph74p_d8V}ZNp07$+}w|$5eth~*H z(G!HNBXO(Yy%F$AD4H8Dn85^*=hI`B#*cac8qcwlJ??FuX>L9aR5CMgj^oCX%NytP z-}&a{!C?17>ebd89x&YiB$BZr<$mK@gP}uJU~H@z!`Gg07N5oIOiRY;Ob;GYqivoE z2|`E>aFEe33E%dgK^gAfj!){rEyxDC7aSB04q*9zN+J}@4DzW1zhO2e{Bh`AbFmg9 z)|Z7$A0s}MyZ~;V3I8dLSBIs6EnP+Ao1PAFDXU74LJF1*mlRKi{2fWa zO@#lDUStmmpyFU0;!x?xb|X2jDCzNJ^doieR69E@R@fSnc)`*di5ebu@NLRy`v>tV zR;Tu(+Y>$-BwDInz7(ldI&TJY99F8V_CPHT_oABdWGSo}MUy;g!q&b-4@zwkuX6LVRQ&jV7mtgO0f5ky_(`I!3ktfk@$jQ- zS8O7O+uv=#ABrXgV2Td|Mydk@Lq^H*u1Uhn>22G2Di!%U(TigihT}+l*Fter##i`+?q_Z zl;_3v4NOLF1J=w#K~0=rF)4`33VwNIt%N z5s}XBvDwImbF9-j7bjefma$$oc^hLs`@6@yK5yNB>_Yo8q=mthiKtj}2qwGp-%y*I z^#1_f%(xglCf9WE<5?+MeQ)p^)T zU#iy;ciu$YC#yFc`HUaNFpdX=uqojCcUPzUvT zS@y%@^DU)zSNcEVHPDq2GfJ1VBODQPuoRFoqE{Q180oEgeuM|t=*B4^O;TMh6$4LT z4Iqm8l@Oi-6hvwI`N<7GEr^=f`uMakQvmMlk(PBsQmh8Z-Q>cnlSY{dB{kBnisoz2 zn5*;@yK~-ug5vw$71|11u#s2Y+7W1`*naFEzv>MtiMSR?%D`Nm> zdvXBbOfgovMe#)jYYK0$Y4za+1D8{Xia;HTBd1!QWyT~n?xoysyoaGO#e$UD-Pl6p zs}EFzYuFa}Ost(CF0@SjN~E)Yc0rezE7&%V!45lCjJ`Od4eG91aV6qFgD|*lIuqQlx(AzN(R_ts^=Bnn;zPf0ulrCb2A{{`E^9VST0Tbaq2fZ6Rg}t1z5?kuH z5$AavGKEr5?A)mnN4#%?R@_qI_VBg0-3it-V^rH}M0W|(1QU;zqkqgfF^N(j=@=V1 zaqJdm4+#tqP3Fm{J7xPQkm9QTH~X1x+8b^_sIu%gE5_|C7n*Zy*JkGPSF__R!Ki$m zT?Yu2ndf7qn;R~7qoBCxR(TV!6IKUCHoK@JJNEymvV1><_zhobF%wPa%L{`T8E{45 zv^6^8x$ty{I}Y?A`%YYgr=uPwIj%gRaP&J@QuX9Do~%JLb!rX&x!0Ap(fJc48Fc z*Vd7}z|O3MUz;%d)blRczZbRZaMAU>A+AvLC?>c~y?D{1n+@{{#?h0ltPZXB)eH`$ ze&yrCduBi}6(QZ{u7iT=%(aw>)Q$3duPD*Vc{pr&jSh{ngKM3O2_qP_+)zp?@YV?l z5AHGN`C{`he%3B2{b()#^Tqwo&(H6rK*wAVD!neuwA5{ufmx5c*?G*S5$xO0jH7K8 zRYjx1k#Xxrk(O{M&t@_`kE(!FhgH+DLVJjD?K+S1IMAKf6lW3D6p)RHTWiub#~p$V zT#&MN?FVW$wWGg6{=@9H#NQFm||7i zJFb_udo&%!p%W*x(49gg_0abEIQ8zzyd8B+v77dBz|_y#Ao#M?)LtF?K!P4-Cl@GfuA8 ztf#tTF`wXcW82)<>@hUS8g@d%d>dkZ<&>ja-yF6v`)uAC?Rp005V%Lq4}r#rnB^!Y zjF}t)s(@)sq_C!2VLW2E$r)sTA#A+ss`HKyc7k#YAvlh=0#qFIId)tWnTsq>^yPu@ z%HUQYrvLW5y>D&l^JH=t;m|yGnp&eV-rvuYLSM0jSal?=<(JMeGeo(=;8r7ZQn9ID zYH9RjW(QpvuWapQ_5Vsb?|82F_l+y%M4ZZ~G$~3dEv0lSWLH8IEm2829VzXBXwlGc zsE$p$toAa}pl<{1p@C?UlStzCywC6aaUSP98a|)*`}MlVbzS#$M{d}WXKgg7eVq|9 z%n76}DecFf*)_Jo_R}##m3?;Mmji}LV=kO3D>e~PP~LQU7?FI=#c5yKWxHJnv(+j29M#qR5Yb=&P)%nk+*WSARN06idN} z*NLcg$VE!+3Q*K--Lb<8a0P1#PPQfKg!1us>Y={I#xAPYt7zqc$Suq3R*paZkkwS6 zhpmVEK0p{b)5V<#yuJJAzu`E4&0qc(;0IAaupEh%b52drnrmfSM_!WQQBiOLaj@bh z0+O^a-dr(9nW|U9C$2LgvZCqQMO-WV7`39etG0%nl}vvV#v_|Xkk9PZyB7Vvgc++yy+42f+Glnf z?z^wWEi>QX$e#5D^M*1TdW)GkI_t-?i zbh`QO{dJ90 z&tudJEl-_RgZ}g_YHXgHOlI&wk}2_Ikbsnd?pnu81$efMs)a3m;b@q^c>9D7C@wBW zUt)gzp-TR`ehdHhxCJ7tw&&e%J=bMZB18{c@H;%2{4G=t=3cC8fQwOqIOS&g=xmuw zykJft?}ham>;ArrF=t1{fh}w{B0BAu7JNlXuf}WIRP0nCE{UNYc4fX(oHnb z2y*BF_fuhszwzP2hl7k^N(Clm3@n@%j_giGsNm0EbI*Y*AqVCI#n7d^m~&S~l(1uC zc&AFsTvu&n%9c7lD5N!87W24C$I1$rikvn0ui7?;7hESMf&Mt^4E6AQovsU zz$A<4gwf~vJk8LD$AK$S!!dA35(UHqDj&ccX$fLtx&zYRB-(vif`%zHzz(~b&ZYrJ z47%`VRl`*Ji86tBSr3bMyp=Q2O2`txTR;>zgK*0jC>WHr$Uq5ld)eGhtx;XhOa-qa zlx~TF17?ps4gU~@K@u!Kroyc<5JP)rReLZx+Sb?i*s4hcYE;@JDa{e4NaG;jM zT7*Gz{>#$fxs#lab_SLr5K+m<*7^|bAgC5#;A~FbYj;*hB+?#m=jkhS=iR=2&pi2T zY)D9mS?gy{pDM?SK5vt4A}{DakXIch`Aaxr7N^wNV_JMXhu#FlJGbXd(0>|Hh)tp| ziCxC|=<_yFls$Z?MKMbE#;|l$ZzD&hIEj$(KGC?+mRTl|{>GqIH3)uQTDt zK#O#^;+^*8%iHtiOD{z4#^%;GU;&&&4mGIN+6HP^@!ZEih+-eZyHl?l?xT$tIE+Ics)Vgh>u z!Bb1i$}9n9q}e1+!)WfOTAng}dI6jmjimMQhl~kt;SA(BGXDNIn6^xrOI`2ozCSx= zLO~Q&)dJMP5TqjO|3gQwG>HRVOxFloK`Zc<`c3AmTnt4FfZy*s>Y4-~CQ9W@7Cw7= zm%VwDLvoSYnu39HTBB2^z8%A9AGeNu*SrG6NH{A(ddU+-555=wFw*~F&?KK@4L>Qe z#NvhAEmjFeQqo4HbWxxr)S< zAqF>u(c?z+I_5i~#waijc@V0m4)*zh6`4(6{MnZs#(7xzHtttU)dL@6Ub+T4RCXk_ z+G=emivVwl^$?MX+yp`g=jK5hBS!*8;VZK{P~XV7Ib=s})EG~#PAoi?I1?lE_R()b1^2y%`gp{;xaFZd5`C0V1x zlZtj@>w^eNUDnAiOzw!f>+ZZBckbTp*mg3~H;&djZig`YwuXqFRg9-{3Tdhn7sK)9 zn!H+fjSt0SpUG=?2%jLGIOurGSsdFG`!!!}DVBbRS)lSn1JF z7qCz($EN3cA;`#WbGhFlNQ~_cx!5t38XLYA#h8Dd}=St6q1!UbXst_4AbuoCToeDS&IixqH{G zB(&|vKAFl0owBw zNQ1!sS0KpWXpljaknEu09Q%gCNyIHDXPAgfC1ybsv0YhTCCQcmPy)OFbHH5%Qlr|!!KO`pCBZ-v ze@;$*cY722EZSJlfQBs_9k6!k|paiY?bq!3fUbu*QIu z`5srj00t)6y6WlcVE<^CGP=IDrKgIIN&$)mnl&fozr-oPUf8D7b!g zaU#=zR%Cruv+f8Cvs3X6QhOGNevPl#CMT!n`mP7|k&X^1L6z`LT73*2(7l6$d5(2XY&GEl#iW>H4 zjd#so%OrqB^w(LBb~Wece!HRug99P5 zL=4?{;BT76LL$ewovP}IZ`Gt58v37ESBIhMeg|+l7muVW{dAdCA2cX6tE?NMe=N?9 zoV$7`aohw~e;n(8sBQ}9Z=fkP2a=`q<)E_O6y}WO^#<-+xLfbHUaKc`)z-&s*r zG6@6~>V-F4%{W3^@4pa%6Hz){eL=2&%MB8u4jCZ|M07O6nS45$vGiO_X0+dK}d@#CRm(K{#(%c}V?36sQ*2HQY#2$6m(Uh#{!z)WB5w zqLZg>BUx{{RwCSNov(415UbmHd1WUz*;@tYg*o}#47#I8ZFh&nj}}yBGbniqGZ##j zCXp|WKUc?{D|@d0)`1kLm7xQR_J+K-v9y+noUPYaf)eGfvOE4TY{3a?b&=^2gW5)A z5dbmM4PvYXqY4?0MWN3-`9Y|IZ!q7*I}YaK75e&$R)4W+UYP%jSWWqmEDg@IzoecBV9mIk_jV8FD2<+Bm}%$ zt^4ojc47E1mGjEqqd#E!Y1@d8Fm7Q8I59e7sL`1!SxkMnsFY~JGw_?X!VBV*YZ2aY zVD#Aard<2Y7 zO88)sv_v9~OmhiqzK{|VTji9EG<_1;CR#zE+Za1bNcI|76v|CQ?^%0pl|h4AEgzVl zVe49X@X6O^V*($w!dq%X@k8KU2_Mb`kR7j9vH*c&9y6R|`5M%G87ztPS93Mg;>pS+ zM%S*l38@q**U*^H2Tbaz2;{L2{&Z! z4RK%v+cX-fU9S6@!M=|9g8^=U*T??)HU)3EP3;`{x<}nJ`_MsQK{FJ!qX;DdyhI^P z;HI~vPf~RZQV*F$mjF0~#+9)yfBhcQ-Q1#sCjD$^23Wj6W$MxZ& zhwlTF^fHfa_RyN42BMmK`*t|gvTP@$fx^cm?Hb^b<@}j2q~&R|E!^gVZ&AX&o}Bd| ztme6T!sMa>Lx&78XEV;)f|}XS_PE&pD2<%nb5G^|Z==dzO=~(+t{hsv_Lyt_blW)B z*hRgsd|CXe_UyeqS1|4 zAJ)Hq@5~EuE(zcI|2ie;+(X|@YRBN+kf*Jyd%2Q8w+wcW5{#yE-;>?z{=H)YKECbo zgd;~xgf8TY#m|WtM~@2-5fXOA@SknaYr-%?TUxXkj4>FzEf@wvvtt2(5o2T^Z!rz1 z41$>GZW=HLX%NH2vl^QSA%gLVdt+f@Yxp3r?P^$*G@hzSk84@V6h>S@DH8c}W=2u} z5-Yk4ZcOQ(1yBIi)5*^5Vv}s##ao_t&)UNO(a{Buv&)l^_RNVgcpleF=?@J!I>jTI zQ;%zH+@k>6+lPU6+E{J9h_IboDUlLT^e70y2ZebM(G5uUX6vK`@~4GQ0D>l*ln#LZ zPIZnrRsRP#Ydjn*YC(fh{pgEA2o|_3(7scQxLsN?kgF)Gib((LO1Z^dU5M6zU@jiS zY)x&O_?fO%ni+yNa?9=2)k_}up0U+Iv^pP9Ix*%VG=Z3Z@uXB#&aW>MdwD$@$#}jY6a1A`VuvK==KZ_4)!-X9Gw3MmuepTQa-)? zQYDnh@1VU=Y_pHV0T2fg;bCO?|xV!-IYVDb$y* z$#62)dAfH&T^ay}OilBn+W!gV?neJN_5BShEg^3ycIn21&80nHs~xCkThBQGjIPoz zQ)n)DogGYApVn}KTAN-lPp!Y*V)BbNjT(Y3=GlAo?Yo72NoYFgsJGl7Za83o2wSKu z=Av8#`-k{SK*}RvA@0=nZQ^LeP!Q*%LO&T_V-f0H6V+y8(KU<~7NMDB&@IyKG9eu` z5cwrqd|w2ZagD(VMXT+6t6gg$((eW$+j+u<1cW$Phhx zJVBvhv>R;l1~Z)^f}r>}fOEN?{`h2d8@*yXB?4%Wxm36DSt^@yU$4DG6MOjvLlm4g z$z8K&_rRdbSi#zMV0xJH$;4S9R0EwKWxY4CjZr>p!`rE!HZY#D za;VRJorJ&EF=EV?mpfqQtxQGrLE72UXVQT-nWxx!iJnPpaD?RNlaoaT<5eKC4sW<( zZLu4a0)ZB~Wg2ysEIQ80$}*^yT_Rj+z@+)ySP+l7ix*F#Ar@2{fk}4Uh|7|&??vg| zH=TP!m7b!>zh+gcvgICY5!f>F5xMSc|EXzJve2o0>~ph}5!BvlX!1K8awdTHMNdKn z!6F(P+%>@`I62Fp1wr}mGSx3zX~8JoqS)`KSj%}5hcjJmJnimK-2JzGoY68=C+$y# zfyC=k{Sl-JudZK<-U@&T@}`EN++`e26g+nkH*U&(Pq(!x?QO>V=F}_w+xdQIXo}Md z4YJT|uNvRJqn3G^lm7{qW9QAR{LKrGPF0!_rgCQFU{_0*2VUXlCv`Y%G*@d{d&|?d z?yX!RHX68^nYVXuwKqsu~w<%BnFHvHy;W`&W@U z9A(fqvGb&G#pbG4Yu~WFbXu*^pz6j{5^ja40Eh9Ufe_w{o)Op&yPF8Mf>4U;4jt+| zzf(O!l#H|}QkaQ(5z!oiV0^L>tyv*E+!(DwQLW2JDUxkzC9hA}uX6L-X5VUiEG&KG;T${G!NfPQQ~w5$LRmbX>e2^8P7I_ShdQQS zlO>0g9pm-X#dn>mWX{n2ma4^MU)$W`wiPHjwoU7TYs;rkfA*>nz*;(}duVRO)W`D| zQAY)V9jl9bjqZ)xCd`~J4oz5WadXY_^7wk0(A$>QCbGl?oE^llw{J#OK@gU~F30}* z^7-?1l0tBTc>Y*1BR^hRtZ4}q_vJg|u! zX65v&V`i;uG@G+m_l}$~Bzwp3l_`j#q@j5;Ld5M zPg`O>!j2lwlq~ZSM}mmKz|pvkDQ>g0_%db(8GAhRLcc-ktnS1nvMipEX}!Gy3`o3_ zC^W?M56P)Q(}3w4IMkRVZu2o1^9mItFWANSUejYlzh?$!mB0LU7%zurpV#TtT}ghC|40_*1qX8q=NiS%C|T!frEN zMMGm_O=?TSZDZL_i8Ozw%WT?kP;w2dAw#_}@Z+eq;1o!vccbyam06ZU@Y9$-jyRu2 zA;W-*S)WAygIQ60CzQkAL7unXn=ks|A$vf}}c z1qv#^TilIWY;V={}+*Phx;zw{Gt8zN(4cXIIA zM$+%ShT-N*KSwuvnCS4cKCkSsecLwOW`tk;yC=DK2y=Xp`F80A!TKMD&eJorY}t|pPpZ&~f*XPz2ixjxB-|8zpP|!UXY}YxuX4VjdU^8f z*&eHBK*03JtwM6lux;rOKc(BBsA~p(OzFIKqEopPX$7E5yb9mX)+q zoL$c_Er;SMZTZKkMOC^+M!$33FanNd5huA8NpUc;eOdg9@G+aiss>!n&Uy;@Ygofc zvRX5N5eqXqSX}-Ac2IJ)?z2}8C*d|?(@b0t*-S(Rwd`>f%PNptT$6LqQ=uO9+H(%a z-D`l==v-Mz(UwhE$c*&|rDD}cK98_Z5l@7%Kgu+gHnS}ug4c^G0VRv!=gUFk79}v# zVW&Fd)%BD3#PR!CMJ1yz5Fn%DP40SUzJdM~=S$oh@g#$w#juyc&4QG~RHbP7uIjmIVZF|4}Q;t6B9&H>8y>s$ye%VDy*G zvHtw|v#1nh?13vIe;S{!)iUL}>|(}3%swQ+?~8Z*RaFcO;Z#MX^Zupz zpi?{+ScGT>8QH@Gs4FY)h^^czMdza~3zxS0W~OyT>H6c!y5jtgSC@BGT&5^Ys z+a4FqYSirNK+mR0Ey?l}*%8h!NPtF%#v$2l#JidV&v@q}>&sBz>xGu}Vie#D=YjD>kDv zX``Z&O9{wh3}#V?`O(#`Q~z6->@;)cb~2_+B@nZc-z8@Gm$S+j<`9$4QmR^6oy2rG zhPP-4Fx!*UO&gd?0O5&PR;CY%nc*LGnvcqPe9d9R1tH|%!GlFcf5J{19#{@eSvDMY zu^lUISh!=R{{ZybK>a1j!ll>$(w_cV)FIM4eNx=mn1JDD&Yr!&Q_6o*Q(N0Q?w$>b zNET_aIC{d;eT;xg=H)yR$p*&_O(Ujj=gr%2`Td0dcW)l?^{?@B-V?V z_H^hna?CsWQaju2CACFGlQ_jvEK>n))oU_igR_~9&2Qvur3*86GOh;FqR7=rHu^Zu zru3J`bzrO$&TSr?dsVaOWL0zB!YoF9L1YqAQmk@4K|_Ms3-P=jBWD2)@Nde7%)l{& zHJz3#bQxhZyt6fE+^ARNAp=$wD8HpW+|$wsEd?vm;tw6#99n~YBCZYl)VFf~aTyis zKnfMRjD2^r49-sY?3ZzW^d+8&C=v8j{{;a%uD9Q2d*@)Np`%+>TLxh?_q6r*iuD-j z^(%Lz@7#P9SiPG8 zcwS+kA#2G)FOWQCDM3p2xv$b4Y!n(aLSH}~X}9~f{;+`xYKbMwm+O0uKJd%BCm?q& z(DKjqO^TbUsZaoM#Mi0CwQUNw{FKa0y$!!yUKr8{6`|fyO-1EH-7pRW*g#4^Ou(zI z2VTT?zV0YeBbqz4ZI-h7jAr%?@}eA`Y9R~6#h97Blx!CwN6MtV`1`Wu3m+^(*~GZ9 z-C3E%>KRLbw*vv6ak@%YIHaAmsaFeH%UHTSejHsqXIE za3B{4MqE%Q_E~18HNz??m(GQKN4&s@4=<=4v=kH1k6zu0{#x{UgXxm?fAVWMan5dY z35$X8PNl6B;gCTX3#z+P$4e_lphg`#haoB!UIig%c51-sU0kW-xZDbDBI2BQF?=uTH#WLp!u4#GdI!1BG zA$kokX03*4+s#|H^w-)CP^$y@+NVz+37$Y2BDFU?cpy4D;@B_9SBz~BMC^Q^RHm4e zI{(ljUCmBj*XvmN$tz4sOLNT6tf{NB;pq`)L=p$%hO3e!dcA$88LOiD*C=;Cusfl0 z;jsM^#cmpRQskE7{rm=rAmM{`XH_NUbM1QiTx@rnfUq@c(gbq~!fQbf7l4LmSKbrhe5 zC13rjT%%uXJ3*o&{V@mXEhFSF|DHDI87M%l@y ztEyB?kDlx-o0_^;|MVIDxrvhXh2N7W+&ZgkJM!lp^I69C$+>aEJ9|;m_!Y)YVG)N^ z42Cxi1%0$V36qdr$~qp!9?ZvRSvhIq4QIKYK~BS)YuBtfg1p2DRYutv;0z~O!$o@^ zS@Qhl%U{o`P)wCIli(lsnAR9)O_`#FhV0?v$9o^s9QC8yHZ(D*gSHo$`j3VN!z+)T zKDBdoadC7$x-Zcn%-+G_knC3{s_r~M)$YoQXD3aohmRgP%MYTyO9^P=b{>@% z!+)5nDgb#=T%9V;$fwI^Ia~kWZ zQ~!4MNgVh04YPRn5dou%nySn4HKbpIE2qx0B4uTLUV}Wzfhv49d7cULG@SV~*iUGQ;CkCsW>NU`^*$$`X*F4}Or%oxc{}wSe z!1q|UiM3U&tel8)*_7dffeNXo=`eIK*x?ZIMFbNf1hCK~9KyD@j*ck0#4at*Ylz%G zWCd_|Ntic+&C6~a>c{Gb(>!ueff0E0lA*B%$YeZKpgAW)W-KXNC`4J&or8skAP9w# z_#`Vq98>87C{mS5i%+2>WhN&hd0IUsT-veMOogmW zcNwpCro|7lAL^##s;6lLo;G@9raY$MQsv0XSG#+!nqg41q51Qo)jfOHkWa}b!FRmL zLA%$MynH#yH_!*Lq2Co8o4{>a0^Kwe)s69RI-h?0cv~8RvM~W!H6 Date: Sat, 13 Jan 2018 22:48:58 +0800 Subject: [PATCH 04/65] Update README.md --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 279080c0..52b4d307 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,7 @@ - - # leetcode-cli + + A cli tool to enjoy leetcode! Great thanks to leetcode.com, a really awesome website! From 6ebcf7525ff01b34a0e1c98b6b67a21d4868c81e Mon Sep 17 00:00:00 2001 From: skygragon Date: Sat, 13 Jan 2018 22:53:24 +0800 Subject: [PATCH 05/65] Update README.md --- README.md | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index 52b4d307..6bf37f36 100644 --- a/README.md +++ b/README.md @@ -2,10 +2,6 @@ -A cli tool to enjoy leetcode! - -Great thanks to leetcode.com, a really awesome website! - [![npm version](https://img.shields.io/npm/v/leetcode-cli.svg?style=flat)](https://www.npmjs.com/package/leetcode-cli) [![Releases](https://img.shields.io/github/release/skygragon/leetcode-cli.svg?style=flat)](https://github.com/skygragon/leetcode-cli/releases) [![license](https://img.shields.io/npm/l/leetcode-cli.svg?style=flat)](https://github.com/skygragon/leetcode-cli/blob/master/LICENSE) @@ -19,6 +15,12 @@ Great thanks to leetcode.com, a really awesome website! [Advanced](https://skygragon.github.io/leetcode-cli/advanced) ⦙ [Plugins](https://github.com/skygragon/leetcode-cli-plugins) ⦙ +A cli tool to enjoy leetcode! + +Great thanks to leetcode.com, a really awesome website! + +
+ * A very [**EFFICIENT**](#quick-start) way to fight problems. * [**CACHING**](https://skygragon.github.io/leetcode-cli/advanced#cache) problems locally thus you can easily navigate & think it offline. * Do everything in **CLI**, no one even knows you are doing leetcode :p From 0bd25b2c35c4d9da192d109b55ac9eeafe2a242f Mon Sep 17 00:00:00 2001 From: skygragon Date: Sat, 13 Jan 2018 23:27:16 +0800 Subject: [PATCH 06/65] Update README.md --- README.md | 25 ++++++++++++------------- 1 file changed, 12 insertions(+), 13 deletions(-) diff --git a/README.md b/README.md index 6bf37f36..59e18cc2 100644 --- a/README.md +++ b/README.md @@ -15,20 +15,19 @@ [Advanced](https://skygragon.github.io/leetcode-cli/advanced) ⦙ [Plugins](https://github.com/skygragon/leetcode-cli-plugins) ⦙ -A cli tool to enjoy leetcode! +A productive cli tool to enjoy leetcode! Great thanks to leetcode.com, a really awesome website! -
- -* A very [**EFFICIENT**](#quick-start) way to fight problems. -* [**CACHING**](https://skygragon.github.io/leetcode-cli/advanced#cache) problems locally thus you can easily navigate & think it offline. -* Do everything in **CLI**, no one even knows you are doing leetcode :p -* [**GENERATING**](https://skygragon.github.io/leetcode-cli/commands#show) source code template for further coding. -* Support live [**TEST**](https://skygragon.github.io/leetcode-cli/commands#test) and [**SUBMIT**](https://skygragon.github.io/leetcode-cli/commands#submit) againts leetcode.com. -* [**AUTO LOGIN**](https://skygragon.github.io/leetcode-cli/advanced#auto-login) among multiple sessions with single leetcode account. -* Retrieve your previous [**SUBMISSION**](https://skygragon.github.io/leetcode-cli/commands#submission) thus you can easily backup and manage your code. -* More [**PLUGINS**](https://skygragon.github.io/leetcode-cli/advanced#plugins) to enjoy extra useful features! +* A very [**EFFICIENT**](#quick-start) way to fight questions. +* [**CACHING**](https://skygragon.github.io/leetcode-cli/advanced#cache) questions to ease offline thinking. +* [**GENERATING**](https://skygragon.github.io/leetcode-cli/commands#show) source code for further coding. +* Live [**TEST**](https://skygragon.github.io/leetcode-cli/commands#test) and [**SUBMIT**](https://skygragon.github.io/leetcode-cli/commands#submit) with leetcode server. +* Download your previous [**SUBMISSION**](https://skygragon.github.io/leetcode-cli/commands#submission) to ease code management. +* Different ways to trace your coding [**STATUS**](https://skygragon.github.io/leetcode-cli/commands#stat). +* [**AUTO LOGIN**](https://skygragon.github.io/leetcode-cli/advanced#auto-login) among multiple agents with single account. +* Multiple [**THEMES**](https://skygragon.github.io/leetcode-cli/advanced#color-themes) available. +* More [**PLUGINS**](https://skygragon.github.io/leetcode-cli/advanced#plugins) to enjoy extra features! @@ -36,8 +35,8 @@ Great thanks to leetcode.com, a really awesome website! Read help first $ leetcode help Login with your leetcode account $ leetcode user -l - Browse all problems $ leetcode list - Choose one problem $ leetcode show 1 -g -l cpp + Browse all questions $ leetcode list + Choose one question $ leetcode show 1 -g -l cpp Coding it! Run test(s) and pray... $ leetcode test ./two-sum.cpp -t '[3,2,4]\n7' Submit final solution! $ leetcode submit ./two-sum.cpp From 95e0099c352f7ed9f4c8aecb85d030a0cbe95509 Mon Sep 17 00:00:00 2001 From: skygragon Date: Sat, 13 Jan 2018 23:31:22 +0800 Subject: [PATCH 07/65] Update README.md --- README.md | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/README.md b/README.md index 59e18cc2..46c40ac2 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,5 @@ # leetcode-cli - - [![npm version](https://img.shields.io/npm/v/leetcode-cli.svg?style=flat)](https://www.npmjs.com/package/leetcode-cli) [![Releases](https://img.shields.io/github/release/skygragon/leetcode-cli.svg?style=flat)](https://github.com/skygragon/leetcode-cli/releases) [![license](https://img.shields.io/npm/l/leetcode-cli.svg?style=flat)](https://github.com/skygragon/leetcode-cli/blob/master/LICENSE) @@ -15,18 +13,22 @@ [Advanced](https://skygragon.github.io/leetcode-cli/advanced) ⦙ [Plugins](https://github.com/skygragon/leetcode-cli-plugins) ⦙ + + A productive cli tool to enjoy leetcode! Great thanks to leetcode.com, a really awesome website! +
+ * A very [**EFFICIENT**](#quick-start) way to fight questions. * [**CACHING**](https://skygragon.github.io/leetcode-cli/advanced#cache) questions to ease offline thinking. -* [**GENERATING**](https://skygragon.github.io/leetcode-cli/commands#show) source code for further coding. -* Live [**TEST**](https://skygragon.github.io/leetcode-cli/commands#test) and [**SUBMIT**](https://skygragon.github.io/leetcode-cli/commands#submit) with leetcode server. -* Download your previous [**SUBMISSION**](https://skygragon.github.io/leetcode-cli/commands#submission) to ease code management. -* Different ways to trace your coding [**STATUS**](https://skygragon.github.io/leetcode-cli/commands#stat). +* [**GENERATING**](https://skygragon.github.io/leetcode-cli/commands#show) source code before coding. +* Live [**TEST**](https://skygragon.github.io/leetcode-cli/commands#test) and [**SUBMIT**](https://skygragon.github.io/leetcode-cli/commands#submit) with leetcode.com. +* Download your previous [**SUBMISSION**](https://skygragon.github.io/leetcode-cli/commands#submission). +* Trace your coding [**STATUS**](https://skygragon.github.io/leetcode-cli/commands#stat). * [**AUTO LOGIN**](https://skygragon.github.io/leetcode-cli/advanced#auto-login) among multiple agents with single account. -* Multiple [**THEMES**](https://skygragon.github.io/leetcode-cli/advanced#color-themes) available. +* Multiple [**THEMES**](https://skygragon.github.io/leetcode-cli/advanced#color-themes) support. * More [**PLUGINS**](https://skygragon.github.io/leetcode-cli/advanced#plugins) to enjoy extra features! From 5395b90401a97019019fc2215e220a19956440b8 Mon Sep 17 00:00:00 2001 From: skygragon Date: Sat, 13 Jan 2018 23:34:52 +0800 Subject: [PATCH 08/65] Update README.md --- README.md | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/README.md b/README.md index 46c40ac2..3eb4c58a 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,11 @@ # leetcode-cli + + +A productive cli tool to enjoy leetcode! + +Great thanks to leetcode.com, a really awesome website! + [![npm version](https://img.shields.io/npm/v/leetcode-cli.svg?style=flat)](https://www.npmjs.com/package/leetcode-cli) [![Releases](https://img.shields.io/github/release/skygragon/leetcode-cli.svg?style=flat)](https://github.com/skygragon/leetcode-cli/releases) [![license](https://img.shields.io/npm/l/leetcode-cli.svg?style=flat)](https://github.com/skygragon/leetcode-cli/blob/master/LICENSE) @@ -13,12 +19,6 @@ [Advanced](https://skygragon.github.io/leetcode-cli/advanced) ⦙ [Plugins](https://github.com/skygragon/leetcode-cli-plugins) ⦙ - - -A productive cli tool to enjoy leetcode! - -Great thanks to leetcode.com, a really awesome website! -
* A very [**EFFICIENT**](#quick-start) way to fight questions. @@ -31,6 +31,8 @@ Great thanks to leetcode.com, a really awesome website! * Multiple [**THEMES**](https://skygragon.github.io/leetcode-cli/advanced#color-themes) support. * More [**PLUGINS**](https://skygragon.github.io/leetcode-cli/advanced#plugins) to enjoy extra features! +## Screenshot + ## Quick Start From 67705668d7b462b09087fec259a1610339a35fe1 Mon Sep 17 00:00:00 2001 From: skygragon Date: Sun, 14 Jan 2018 09:11:42 +0800 Subject: [PATCH 09/65] Update README.md --- README.md | 14 ++++++-------- 1 file changed, 6 insertions(+), 8 deletions(-) diff --git a/README.md b/README.md index 3eb4c58a..258b5df8 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,9 @@ +[![npm version](https://img.shields.io/npm/v/leetcode-cli.svg?style=flat)](https://www.npmjs.com/package/leetcode-cli) +[![Releases](https://img.shields.io/github/release/skygragon/leetcode-cli.svg?style=flat)](https://github.com/skygragon/leetcode-cli/releases) +[![license](https://img.shields.io/npm/l/leetcode-cli.svg?style=flat)](https://github.com/skygragon/leetcode-cli/blob/master/LICENSE) +[![Build](https://img.shields.io/travis/skygragon/leetcode-cli.svg?style=flat)](https://travis-ci.org/skygragon/leetcode-cli) +[![Join chat at https://gitter.im/skygragon/leetcode-cli](https://img.shields.io/gitter/room/skygragon/leetcode-cli.svg?style=flat)](https://gitter.im/skygragon/leetcode-cli) + # leetcode-cli @@ -6,12 +12,6 @@ A productive cli tool to enjoy leetcode! Great thanks to leetcode.com, a really awesome website! -[![npm version](https://img.shields.io/npm/v/leetcode-cli.svg?style=flat)](https://www.npmjs.com/package/leetcode-cli) -[![Releases](https://img.shields.io/github/release/skygragon/leetcode-cli.svg?style=flat)](https://github.com/skygragon/leetcode-cli/releases) -[![license](https://img.shields.io/npm/l/leetcode-cli.svg?style=flat)](https://github.com/skygragon/leetcode-cli/blob/master/LICENSE) -[![Build](https://img.shields.io/travis/skygragon/leetcode-cli.svg?style=flat)](https://travis-ci.org/skygragon/leetcode-cli) -[![Join chat at https://gitter.im/skygragon/leetcode-cli](https://img.shields.io/gitter/room/skygragon/leetcode-cli.svg?style=flat)](https://gitter.im/skygragon/leetcode-cli) - ⦙ [Releases](https://skygragon.github.io/leetcode-cli/releases) ⦙ [Install](https://skygragon.github.io/leetcode-cli/install) ⦙ [Docs](https://skygragon.github.io/leetcode-cli/) ⦙ @@ -19,8 +19,6 @@ Great thanks to leetcode.com, a really awesome website! [Advanced](https://skygragon.github.io/leetcode-cli/advanced) ⦙ [Plugins](https://github.com/skygragon/leetcode-cli-plugins) ⦙ -
- * A very [**EFFICIENT**](#quick-start) way to fight questions. * [**CACHING**](https://skygragon.github.io/leetcode-cli/advanced#cache) questions to ease offline thinking. * [**GENERATING**](https://skygragon.github.io/leetcode-cli/commands#show) source code before coding. From 959c4ae27b75abcf463b833d694ba9aa08122c19 Mon Sep 17 00:00:00 2001 From: Eric Wang Date: Sun, 14 Jan 2018 15:09:40 +0800 Subject: [PATCH 10/65] Use level weight in `stat -c`. Signed-off-by: Eric Wang --- lib/commands/stat.js | 17 ++++++++++++----- 1 file changed, 12 insertions(+), 5 deletions(-) diff --git a/lib/commands/stat.js b/lib/commands/stat.js index 9e935183..54f7a41a 100644 --- a/lib/commands/stat.js +++ b/lib/commands/stat.js @@ -125,7 +125,7 @@ function showGraph(problems) { ' ', ICONS.none + ' Remaining'); } -function showCal() { +function showCal(problems) { const MONTHS = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec']; const WEEKDAYS = ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat']; const ICONS = [ @@ -142,15 +142,22 @@ function showCal() { const now = moment(); + const SCORES = {easy: 1, medium: 2, hard: 5}; + function toScore(sum, id) { + const problem = problems.find(x => x.fid === id); + if (problem) sum += (SCORES[problem.level.toLowerCase()] || 1); + return sum; + } + // load historical stats const graph = []; const stats = require('../cache').get(h.KEYS.stat) || {}; for (let k of _.keys(stats)) { - const v = (stats[k]['ac.set'] || []).length; - if (v === 0) continue; + const score = (stats[k]['ac.set'] || []).reduce(toScore, 0); + if (score === 0) continue; const d = moment(k, 'YYYY-MM-DD'); - graph[now.diff(d, 'days')] = v; + graph[now.diff(d, 'days')] = score; } // print header @@ -208,7 +215,7 @@ cmd.handler = function(argv) { log.info(); if (argv.graph) showGraph(problems); - else if (argv.cal) showCal(); + else if (argv.cal) showCal(problems); else showProgress(problems); log.info(); }); From 5364b237f73d6f30e4d98ea3124731f494ff2268 Mon Sep 17 00:00:00 2001 From: Eric Wang Date: Thu, 18 Jan 2018 11:15:41 +0800 Subject: [PATCH 11/65] Fixes cache bug. Signed-off-by: Eric Wang --- lib/commands/cache.js | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/lib/commands/cache.js b/lib/commands/cache.js index 5282f984..1b9a3cae 100644 --- a/lib/commands/cache.js +++ b/lib/commands/cache.js @@ -34,9 +34,13 @@ const cmd = { cmd.handler = function(argv) { session.argv = argv; + const name = argv.keyword; + const isInteger = Number.isInteger(Number(name)); + const caches = cache.list() .filter(function(f) { - return argv.keyword.length === 0 || f.name.startsWith(argv.keyword + '.'); + return (name.length === 0) || + (isInteger ? f.name.startsWith(name + '.') : f.name === name); }); if (argv.delete) { From 1cee26c47006aafc13393b5221f927b7de0f3e05 Mon Sep 17 00:00:00 2001 From: Eric Wang Date: Fri, 19 Jan 2018 14:38:11 +0800 Subject: [PATCH 12/65] Bump to 2.5.1 Signed-off-by: Eric Wang --- docs/commands.md | 4 ++-- docs/releases.md | 12 ++++++++++++ package.json | 2 +- 3 files changed, 15 insertions(+), 3 deletions(-) diff --git a/docs/commands.md b/docs/commands.md index 8b0f532b..4c63cba9 100644 --- a/docs/commands.md +++ b/docs/commands.md @@ -465,7 +465,7 @@ Display version information. Short: $ leetcode version - 2.5.0 + 2.5.1 Verbose: @@ -475,7 +475,7 @@ Verbose: | | ___ ___| |_ ___ ___ __| | ___ | |/ _ \/ _ \ __|/ __|/ _ \ / _` |/ _ \ | | __/ __/ |_ (__| (_) | (_| | __/ - |_|\___|\___|\__|\___|\___/ \__,_|\___| CLI v2.5.0 + |_|\___|\___|\__|\___|\___/ \__,_|\___| CLI v2.5.1 [Environment] Node v8.1.4 diff --git a/docs/releases.md b/docs/releases.md index 3c4a162e..e6358207 100644 --- a/docs/releases.md +++ b/docs/releases.md @@ -2,6 +2,18 @@ layout: default title: Release Notes --- +# 2.5.1 + +* auto install missing plugins after upgrade. +* use 16m colors if possible. +* enhance color output on windows. +* `cache` + * fix issue that can't delete cache by name. +* `session` + * fix issue if session name is a number. +* `stat` + * use level weight in calendar view. + # 2.5.0 * add `session` command to manage coding sessions on leetcode.com. diff --git a/package.json b/package.json index b0da2cd8..c77d4f81 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "leetcode-cli", - "version": "2.5.0", + "version": "2.5.1", "description": "A cli tool to enjoy leetcode!", "preferGlobal": "true", "engines": { From 8f114eaa98b212266313a1e8805c2663273e4d5c Mon Sep 17 00:00:00 2001 From: sykuang Date: Sat, 12 May 2018 22:33:20 +0800 Subject: [PATCH 13/65] comment locked problem checking to download loced problem --- lib/plugins/leetcode.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/plugins/leetcode.js b/lib/plugins/leetcode.js index 07e251e7..4f4b19d0 100644 --- a/lib/plugins/leetcode.js +++ b/lib/plugins/leetcode.js @@ -120,7 +120,7 @@ plugin.getCategoryProblems = function(category, cb) { plugin.getProblem = function(problem, cb) { log.debug('running leetcode.getProblem'); const user = session.getUser(); - if (problem.locked && !user.paid) return cb('failed to load locked problem!'); + //if (problem.locked && !user.paid) return cb('failed to load locked problem!'); const opts = makeOpts(config.sys.urls.problem_detail); opts.headers.Origin = config.sys.urls.base; From 54ba41e1be9d63d38e51c611da4bfe5addb456ec Mon Sep 17 00:00:00 2001 From: EINDEX Date: Tue, 15 May 2018 00:30:29 +0800 Subject: [PATCH 14/65] get translatedContent --- lib/plugins/leetcode.js | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/lib/plugins/leetcode.js b/lib/plugins/leetcode.js index 07e251e7..ff5ed557 100644 --- a/lib/plugins/leetcode.js +++ b/lib/plugins/leetcode.js @@ -137,6 +137,7 @@ plugin.getProblem = function(problem, cb) { ' sampleTestCase', ' enableRunCode', ' metaData', + ' translatedContent', ' discussCategoryId', ' }', '}' @@ -156,7 +157,11 @@ plugin.getProblem = function(problem, cb) { problem.totalAC = JSON.parse(q.stats).totalAccepted; problem.totalSubmit = JSON.parse(q.stats).totalSubmission; - problem.desc = he.decode(cheerio.load(q.content).root().text()); + if (!q.translatedContent) { + problem.desc = he.decode(cheerio.load(q.content).root().text()); + }else{ + problem.desc = he.decode(cheerio.load(q.translatedContent).root().text()); + } problem.templates = JSON.parse(q.codeDefinition); problem.testcase = q.sampleTestCase; problem.testable = q.enableRunCode; From a9fa36fc4fca11d06eee0fd4aa4b7d3e8ae8d3b9 Mon Sep 17 00:00:00 2001 From: si-yao Date: Sat, 26 May 2018 01:43:12 -0700 Subject: [PATCH 15/65] fix 400 error for showing problems. --- lib/plugins/leetcode.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/plugins/leetcode.js b/lib/plugins/leetcode.js index ff5ed557..38c61b4c 100644 --- a/lib/plugins/leetcode.js +++ b/lib/plugins/leetcode.js @@ -138,7 +138,6 @@ plugin.getProblem = function(problem, cb) { ' enableRunCode', ' metaData', ' translatedContent', - ' discussCategoryId', ' }', '}' ].join('\n'), @@ -166,7 +165,8 @@ plugin.getProblem = function(problem, cb) { problem.testcase = q.sampleTestCase; problem.testable = q.enableRunCode; problem.templateMeta = JSON.parse(q.metaData); - problem.discuss = q.discussCategoryId; + // @si-yao: seems below property is never used. + //problem.discuss = q.discussCategoryId; return cb(null, problem); }); From 6f2cf7a0de0793486301d780b26a2815f4b3a149 Mon Sep 17 00:00:00 2001 From: Eric Wang Date: Tue, 29 May 2018 10:15:23 +0800 Subject: [PATCH 16/65] Bump to 2.5.2 Signed-off-by: Eric Wang --- docs/commands.md | 4 ++-- docs/releases.md | 6 ++++++ package.json | 2 +- 3 files changed, 9 insertions(+), 3 deletions(-) diff --git a/docs/commands.md b/docs/commands.md index 4c63cba9..6ff28658 100644 --- a/docs/commands.md +++ b/docs/commands.md @@ -465,7 +465,7 @@ Display version information. Short: $ leetcode version - 2.5.1 + 2.5.2 Verbose: @@ -475,7 +475,7 @@ Verbose: | | ___ ___| |_ ___ ___ __| | ___ | |/ _ \/ _ \ __|/ __|/ _ \ / _` |/ _ \ | | __/ __/ |_ (__| (_) | (_| | __/ - |_|\___|\___|\__|\___|\___/ \__,_|\___| CLI v2.5.1 + |_|\___|\___|\__|\___|\___/ \__,_|\___| CLI v2.5.2 [Environment] Node v8.1.4 diff --git a/docs/releases.md b/docs/releases.md index e6358207..e2bd6a12 100644 --- a/docs/releases.md +++ b/docs/releases.md @@ -2,6 +2,12 @@ layout: default title: Release Notes --- +# 2.5.2 + +* `show` + * fixes 400 error + * support translated content for leetcode-cn + # 2.5.1 * auto install missing plugins after upgrade. diff --git a/package.json b/package.json index c77d4f81..d61ef84a 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "leetcode-cli", - "version": "2.5.1", + "version": "2.5.2", "description": "A cli tool to enjoy leetcode!", "preferGlobal": "true", "engines": { From b807163aed160c416b9c63aa1554bc4b4fff01f0 Mon Sep 17 00:00:00 2001 From: Eric Wang Date: Tue, 29 May 2018 22:16:04 +0800 Subject: [PATCH 17/65] Tuning output for `cache` and `user`. Signed-off-by: Eric Wang --- lib/commands/cache.js | 8 ++++++-- lib/commands/user.js | 12 +++++++++--- 2 files changed, 15 insertions(+), 5 deletions(-) diff --git a/lib/commands/cache.js b/lib/commands/cache.js index 1b9a3cae..30bc24b4 100644 --- a/lib/commands/cache.js +++ b/lib/commands/cache.js @@ -1,5 +1,6 @@ 'use strict'; var _ = require('underscore'); +var sprintf = require('sprintf-js').sprintf; var h = require('../helper'); var chalk = require('../chalk'); @@ -46,14 +47,17 @@ cmd.handler = function(argv) { if (argv.delete) { for (let f of caches) cache.del(f.name); } else { + log.info(chalk.gray(sprintf(' %s %63s %s', 'Cache', 'Size', 'Created'))); + log.info(chalk.gray('-'.repeat(86))); + _.sortBy(caches, function(f) { let x = parseInt(f.name.split('.')[0], 10); if (Number.isNaN(x)) x = 0; return x; }) .forEach(function(f) { - log.printf('%-80s %8s %s ago', - chalk.green(f.name), + log.printf(' %s %8s %s ago', + chalk.green(sprintf('%-60s', f.name)), h.prettySize(f.size), h.prettyTime((Date.now() - f.mtime) / 1000)); }); diff --git a/lib/commands/user.js b/lib/commands/user.js index 618e546a..82f52f26 100644 --- a/lib/commands/user.js +++ b/lib/commands/user.js @@ -1,6 +1,8 @@ 'use strict'; var prompt = require('prompt'); +var sprintf = require('sprintf-js').sprintf; +var config = require('../config'); var chalk = require('../chalk'); var log = require('../log'); var core = require('../core'); @@ -59,9 +61,13 @@ cmd.handler = function(argv) { } else { // show current user user = session.getUser(); - if (user) - log.info('You are now login as', chalk.yellow(user.name)); - else + if (user) { + log.info(chalk.gray(sprintf(' %-20s %s', 'User', 'Host'))); + log.info(chalk.gray('-'.repeat(60))); + log.printf(' %s %s', + chalk.yellow(sprintf('%-20s', user.name)), + config.sys.urls.base); + } else return log.fail('You are not login yet?'); } }; From fc7a09b7efcdb1cc3a8bdd88b857c7bc1f8cc078 Mon Sep 17 00:00:00 2001 From: Eric Wang Date: Wed, 30 May 2018 11:10:25 +0800 Subject: [PATCH 18/65] Retrieve premium user info when login. Signed-off-by: Eric Wang --- lib/config.js | 2 +- lib/plugins/leetcode.js | 63 ++++++++++++++++++++++++++++++----------- 2 files changed, 48 insertions(+), 17 deletions(-) diff --git a/lib/config.js b/lib/config.js index f3e40272..1f53cce9 100644 --- a/lib/config.js +++ b/lib/config.js @@ -30,10 +30,10 @@ const DEFAULT_CONFIG = { ], urls: { base: 'https://leetcode.com', + graphql: 'https://leetcode.com/graphql', login: 'https://leetcode.com/accounts/login/', problems: 'https://leetcode.com/api/problems/$category/', problem: 'https://leetcode.com/problems/$slug/description/', - problem_detail: 'https://leetcode.com/graphql', test: 'https://leetcode.com/problems/$slug/interpret_solution/', session: 'https://leetcode.com/session/', submit: 'https://leetcode.com/problems/$slug/submit/', diff --git a/lib/plugins/leetcode.js b/lib/plugins/leetcode.js index 6cb5a2d9..086f56fd 100644 --- a/lib/plugins/leetcode.js +++ b/lib/plugins/leetcode.js @@ -91,10 +91,6 @@ plugin.getCategoryProblems = function(category, cb) { return cb(session.errors.EXPIRED); } - const user = session.getUser(); - user.paid = json.is_paid; - session.saveUser(user); - const problems = json.stat_status_pairs .filter(p => !p.stat.question__hide) .map(function(p) { @@ -120,9 +116,9 @@ plugin.getCategoryProblems = function(category, cb) { plugin.getProblem = function(problem, cb) { log.debug('running leetcode.getProblem'); const user = session.getUser(); - //if (problem.locked && !user.paid) return cb('failed to load locked problem!'); + if (problem.locked && !user.paid) return cb('failed to load locked problem!'); - const opts = makeOpts(config.sys.urls.problem_detail); + const opts = makeOpts(config.sys.urls.graphql); opts.headers.Origin = config.sys.urls.base; opts.headers.Referer = problem.link; @@ -373,7 +369,9 @@ plugin.getFavorites = function(cb) { log.debug('running leetcode.getFavorites'); const opts = makeOpts(config.sys.urls.favorites); + const spin = h.spin('Retrieving user favorites'); request(opts, function(e, resp, body) { + spin.stop(); e = checkError(e, resp, 200); if (e) return cb(e); @@ -382,6 +380,34 @@ plugin.getFavorites = function(cb) { }); }; +plugin.getUser = function(cb) { + log.debug('running leetcode.getUser'); + const opts = makeOpts(config.sys.urls.graphql); + opts.headers.Origin = config.sys.urls.base; + opts.headers.Referer = config.sys.urls.base; + opts.json = true; + opts.body = { + query: [ + '{', + ' user {', + ' isCurrentUserPremium', + ' }', + '}' + ].join('\n'), + variables: {} + }; + + const spin = h.spin('Retrieving user profile'); + request.post(opts, function(e, resp, body) { + spin.stop(); + e = checkError(e, resp, 200); + if (e) return cb(e); + + const user = body.data.user; + return cb(null, user); + }); +}; + function runSession(method, data, cb) { const opts = makeOpts(config.sys.urls.session); opts.json = true; @@ -456,17 +482,22 @@ plugin.signin = function(user, cb) { }); }; -plugin.getUser = function(user, cb) { +plugin.initUser = function(user, cb) { plugin.getFavorites(function(e, favorites) { - if (e) return cb(e); - - const favorite = favorites.favorites.private_favorites.find(function(f) { - return f.name === 'Favorite'; + if (!e) { + const favorite = favorites.favorites.private_favorites.find(function(f) { + return f.name === 'Favorite'; + }); + user.hash = favorite.id_hash; + user.name = favorites.user_name; + } + plugin.getUser(function(e, _user) { + if (!e) { + user.paid = _user.isCurrentUserPremium; + } + session.saveUser(user); + return cb(null, user); }); - user.hash = favorite.id_hash; - user.name = favorites.user_name; - session.saveUser(user); - return cb(null, user); }); }; @@ -474,7 +505,7 @@ plugin.login = function(user, cb) { log.debug('running leetcode.login'); plugin.signin(user, function(e, user) { if (e) return cb(e); - plugin.getUser(user, cb); + plugin.initUser(user, cb); }); }; From c7e81c1008f2a17e18b6c0f4d938a0c207b0de06 Mon Sep 17 00:00:00 2001 From: Eric Wang Date: Thu, 31 May 2018 11:31:14 +0800 Subject: [PATCH 19/65] Warning if favorite not found. refs #92 Signed-off-by: Eric Wang --- lib/commands/user.js | 6 ++++-- lib/plugins/leetcode.js | 27 +++++++++++++++++---------- 2 files changed, 21 insertions(+), 12 deletions(-) diff --git a/lib/commands/user.js b/lib/commands/user.js index 82f52f26..af9ea4c2 100644 --- a/lib/commands/user.js +++ b/lib/commands/user.js @@ -2,6 +2,7 @@ var prompt = require('prompt'); var sprintf = require('sprintf-js').sprintf; +var h = require('../helper'); var config = require('../config'); var chalk = require('../chalk'); var log = require('../log'); @@ -62,9 +63,10 @@ cmd.handler = function(argv) { // show current user user = session.getUser(); if (user) { - log.info(chalk.gray(sprintf(' %-20s %s', 'User', 'Host'))); + log.info(chalk.gray(sprintf(' %-9s %-20s %s', 'Premium', 'User', 'Host'))); log.info(chalk.gray('-'.repeat(60))); - log.printf(' %s %s', + log.printf(' %s %s %s', + h.prettyText('', user.paid || false), chalk.yellow(sprintf('%-20s', user.name)), config.sys.urls.base); } else diff --git a/lib/plugins/leetcode.js b/lib/plugins/leetcode.js index 086f56fd..876f5fd0 100644 --- a/lib/plugins/leetcode.js +++ b/lib/plugins/leetcode.js @@ -380,8 +380,8 @@ plugin.getFavorites = function(cb) { }); }; -plugin.getUser = function(cb) { - log.debug('running leetcode.getUser'); +plugin.getUserInfo = function(cb) { + log.debug('running leetcode.getUserInfo'); const opts = makeOpts(config.sys.urls.graphql); opts.headers.Origin = config.sys.urls.base; opts.headers.Referer = config.sys.urls.base; @@ -390,6 +390,7 @@ plugin.getUser = function(cb) { query: [ '{', ' user {', + ' username', ' isCurrentUserPremium', ' }', '}' @@ -482,18 +483,24 @@ plugin.signin = function(user, cb) { }); }; -plugin.initUser = function(user, cb) { +plugin.getUser = function(user, cb) { plugin.getFavorites(function(e, favorites) { if (!e) { - const favorite = favorites.favorites.private_favorites.find(function(f) { - return f.name === 'Favorite'; - }); - user.hash = favorite.id_hash; - user.name = favorites.user_name; + const f = favorites.favorites.private_favorites.find(f => f.name === 'Favorite'); + if (f) { + user.hash = f.id_hash; + user.name = favorites.user_name; + } else { + log.warn('Favorite not found?'); + } + } else { + log.warn('Failed to retrieve user favorites: ' + e); } - plugin.getUser(function(e, _user) { + + plugin.getUserInfo(function(e, _user) { if (!e) { user.paid = _user.isCurrentUserPremium; + user.name = _user.username; } session.saveUser(user); return cb(null, user); @@ -505,7 +512,7 @@ plugin.login = function(user, cb) { log.debug('running leetcode.login'); plugin.signin(user, function(e, user) { if (e) return cb(e); - plugin.initUser(user, cb); + plugin.getUser(user, cb); }); }; From 318983cd7f79bf27e1e7f64927204e91445fc653 Mon Sep 17 00:00:00 2001 From: Eric Wang Date: Tue, 3 Jul 2018 10:10:01 +0800 Subject: [PATCH 20/65] Print stdout result in `submit`. refs #110 Signed-off-by: Eric Wang --- lib/commands/submit.js | 1 + lib/plugins/leetcode.js | 1 + 2 files changed, 2 insertions(+) diff --git a/lib/commands/submit.js b/lib/commands/submit.js index 092f0a53..297084f7 100644 --- a/lib/commands/submit.js +++ b/lib/commands/submit.js @@ -89,6 +89,7 @@ cmd.handler = function(argv) { printResult(result, 'testcase'); printResult(result, 'answer'); printResult(result, 'expected_answer'); + printResult(result, 'stdout'); } // update this problem status in local cache diff --git a/lib/plugins/leetcode.js b/lib/plugins/leetcode.js index 876f5fd0..186e00fd 100644 --- a/lib/plugins/leetcode.js +++ b/lib/plugins/leetcode.js @@ -253,6 +253,7 @@ function formatResult(result) { if (result.judge_type === 'large') { x.answer = result.code_output; x.expected_answer = result.expected_output; + x.stdout = result.std_output; } else { x.stdout = util.inspect((result.code_output || []).join('\n')); } From b72d4d69fe6b3279d3f40f00bb836696139a2fcc Mon Sep 17 00:00:00 2001 From: Eric Wang Date: Sun, 28 Oct 2018 11:31:33 +0800 Subject: [PATCH 21/65] move plugins' specific data into separate dirs. * now leetcode/lintcode have different cache Signed-off-by: Eric Wang --- lib/cli.js | 29 ++++++++++++++++++----------- lib/helper.js | 9 +++++++-- lib/plugins/cache.js | 5 ----- lib/plugins/leetcode.js | 4 ++++ test/test_helper.js | 6 +++--- 5 files changed, 32 insertions(+), 21 deletions(-) diff --git a/lib/cli.js b/lib/cli.js index 051bbee2..9b12bc0b 100644 --- a/lib/cli.js +++ b/lib/cli.js @@ -52,9 +52,23 @@ function initLogLevel() { log.setLevel(level); } +function initPlugins(cb) { + if (Plugin.init()) { + Plugin.save(); + return cb(); + } else { + Plugin.installMissings(function(e) { + if (e) return cb(e); + Plugin.init(); + return cb(); + }); + } +} + var cli = {}; function runCommand() { + //console.log(Plugin.getType()) var yargs = require('yargs'); h.width = yargs.terminalWidth(); yargs.commandDir('commands') @@ -73,22 +87,15 @@ cli.run = function() { }); config.init(); - cache.init(); initColor(); initIcon(); initLogLevel(); - - if (Plugin.init()) { - Plugin.save(); + initPlugins(function(e) { + if (e) return log.error(e); + cache.init(); runCommand(); - } else { - Plugin.installMissings(function(e) { - if (e) return log.error(e); - Plugin.init(); - runCommand(); - }); - } + }); }; module.exports = cli; diff --git a/lib/helper.js b/lib/helper.js index 33b9e1f3..ec6071f8 100644 --- a/lib/helper.js +++ b/lib/helper.js @@ -53,7 +53,7 @@ const h = {}; h.KEYS = { user: '../user', stat: '../stat', - plugins: '../plugins', + plugins: '../../plugins', problems: 'problems', problem: p => p.fid + '.' + p.slug + '.' + p.category }; @@ -186,8 +186,13 @@ h.getHomeDir = function() { return path.join(this.getUserHomeDir(), '.lc'); }; +h.getAppDir = function() { + const config = require('./config'); + return path.join(this.getHomeDir(), config.app || 'leetcode'); +}; + h.getCacheDir = function() { - return path.join(this.getHomeDir(), 'cache'); + return path.join(this.getAppDir(), 'cache'); }; h.getCodeDir = function(dir) { diff --git a/lib/plugins/cache.js b/lib/plugins/cache.js index efe8d231..677c6c84 100644 --- a/lib/plugins/cache.js +++ b/lib/plugins/cache.js @@ -9,11 +9,6 @@ var session = require('../session'); const plugin = new Plugin(50, 'cache', '', 'Plugin to provide local cache.'); -plugin.init = function() { - Plugin.prototype.init.call(this); - cache.init(); -}; - plugin.getProblems = function(cb) { const problems = cache.get(h.KEYS.problems); if (problems) { diff --git a/lib/plugins/leetcode.js b/lib/plugins/leetcode.js index 186e00fd..6f1f78b2 100644 --- a/lib/plugins/leetcode.js +++ b/lib/plugins/leetcode.js @@ -50,6 +50,10 @@ function checkError(e, resp, expectedStatus) { return e; } +plugin.init = function() { + config.app = 'leetcode'; +} + plugin.getProblems = function(cb) { log.debug('running leetcode.getProblems'); let problems = []; diff --git a/test/test_helper.js b/test/test_helper.js index ac47664e..ccb81599 100644 --- a/test/test_helper.js +++ b/test/test_helper.js @@ -188,10 +188,10 @@ describe('helper', function() { assert.equal(h.getUserHomeDir(), '/home/skygragon'); assert.equal(h.getHomeDir(), '/home/skygragon/.lc'); - assert.equal(h.getCacheDir(), '/home/skygragon/.lc/cache'); - assert.equal(h.getCacheFile('xxx'), '/home/skygragon/.lc/cache/xxx.json'); + assert.equal(h.getCacheDir(), '/home/skygragon/.lc/leetcode/cache'); + assert.equal(h.getCacheFile('xxx'), '/home/skygragon/.lc/leetcode/cache/xxx.json'); assert.equal(h.getConfigFile(), '/home/skygragon/.lc/config.json'); - assert.equal(h.getFilename('/home/skygragon/.lc/cache/xxx.json'), 'xxx'); + assert.equal(h.getFilename('/home/skygragon/.lc/leetcode/cache/xxx.json'), 'xxx'); process.env.HOME = ''; process.env.USERPROFILE = 'C:\\Users\\skygragon'; From 9f5db49f0933f19c1c383880c1f4485404869eb9 Mon Sep 17 00:00:00 2001 From: Eric Wang Date: Sun, 28 Oct 2018 12:12:25 +0800 Subject: [PATCH 22/65] Bump to 2.5.3 Signed-off-by: Eric Wang --- docs/commands.md | 4 ++-- docs/releases.md | 8 ++++++++ lib/cli.js | 1 - package.json | 2 +- 4 files changed, 11 insertions(+), 4 deletions(-) diff --git a/docs/commands.md b/docs/commands.md index 6ff28658..d8da1796 100644 --- a/docs/commands.md +++ b/docs/commands.md @@ -465,7 +465,7 @@ Display version information. Short: $ leetcode version - 2.5.2 + 2.5.3 Verbose: @@ -475,7 +475,7 @@ Verbose: | | ___ ___| |_ ___ ___ __| | ___ | |/ _ \/ _ \ __|/ __|/ _ \ / _` |/ _ \ | | __/ __/ |_ (__| (_) | (_| | __/ - |_|\___|\___|\__|\___|\___/ \__,_|\___| CLI v2.5.2 + |_|\___|\___|\__|\___|\___/ \__,_|\___| CLI v2.5.3 [Environment] Node v8.1.4 diff --git a/docs/releases.md b/docs/releases.md index e2bd6a12..4234cce3 100644 --- a/docs/releases.md +++ b/docs/releases.md @@ -2,6 +2,14 @@ layout: default title: Release Notes --- +# 2.5.3 + +* fixes "Failed to load locked problem" issue. +* move plugin's data into separate folders: + * login info + * problems list + * problem cache + # 2.5.2 * `show` diff --git a/lib/cli.js b/lib/cli.js index 9b12bc0b..443c532c 100644 --- a/lib/cli.js +++ b/lib/cli.js @@ -68,7 +68,6 @@ function initPlugins(cb) { var cli = {}; function runCommand() { - //console.log(Plugin.getType()) var yargs = require('yargs'); h.width = yargs.terminalWidth(); yargs.commandDir('commands') diff --git a/package.json b/package.json index d61ef84a..e25643b8 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "leetcode-cli", - "version": "2.5.2", + "version": "2.5.3", "description": "A cli tool to enjoy leetcode!", "preferGlobal": "true", "engines": { From 657c6c538a05d0104c54e2bd346700152da6b68e Mon Sep 17 00:00:00 2001 From: Eric Wang Date: Sat, 17 Nov 2018 12:35:37 +0800 Subject: [PATCH 23/65] fixes #130: create home dir if necessary Signed-off-by: Eric Wang --- lib/cli.js | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/lib/cli.js b/lib/cli.js index 443c532c..be78c406 100644 --- a/lib/cli.js +++ b/lib/cli.js @@ -52,6 +52,10 @@ function initLogLevel() { log.setLevel(level); } +function initDir() { + h.mkdir(h.getHomeDir()) +} + function initPlugins(cb) { if (Plugin.init()) { Plugin.save(); @@ -90,6 +94,7 @@ cli.run = function() { initColor(); initIcon(); initLogLevel(); + initDir() initPlugins(function(e) { if (e) return log.error(e); cache.init(); From 61becf9408ea3972c26c65ec15ef4f20ed4aab36 Mon Sep 17 00:00:00 2001 From: Eric Wang Date: Sat, 17 Nov 2018 18:45:48 +0800 Subject: [PATCH 24/65] [refactor] extract into file utils Signed-off-by: Eric Wang --- lib/cache.js | 14 +++---- lib/chalk.js | 5 ++- lib/cli.js | 3 +- lib/commands/config.js | 6 +-- lib/commands/show.js | 3 +- lib/commands/submission.js | 3 +- lib/commands/submit.js | 3 +- lib/commands/test.js | 3 +- lib/commands/version.js | 6 +-- lib/config.js | 4 +- lib/core.js | 7 ++-- lib/file.js | 82 ++++++++++++++++++++++++++++++++++++++ lib/helper.js | 77 ++--------------------------------- lib/icon.js | 6 +-- lib/plugin.js | 17 ++++---- lib/plugins/leetcode.js | 3 +- test/plugins/test_cache.js | 9 +++-- test/test_cache.js | 6 +-- test/test_config.js | 6 +-- test/test_core.js | 6 +-- test/test_file.js | 58 +++++++++++++++++++++++++++ test/test_helper.js | 47 ---------------------- test/test_icon.js | 10 ++--- test/test_plugin.js | 16 ++++---- 24 files changed, 217 insertions(+), 183 deletions(-) create mode 100644 lib/file.js create mode 100644 test/test_file.js diff --git a/lib/cache.js b/lib/cache.js index a6097c2a..4d0470fe 100644 --- a/lib/cache.js +++ b/lib/cache.js @@ -2,29 +2,29 @@ var fs = require('fs'); var path = require('path'); -var h = require('./helper'); +var file = require('./file'); const cache = {}; cache.init = function() { - h.mkdir(h.getCacheDir()); + file.mkdir(file.cacheDir()); }; cache.get = function(k) { - const fullpath = h.getCacheFile(k); + const fullpath = file.cacheFile(k); if (!fs.existsSync(fullpath)) return null; return JSON.parse(fs.readFileSync(fullpath)); }; cache.set = function(k, v) { - const fullpath = h.getCacheFile(k); + const fullpath = file.cacheFile(k); fs.writeFileSync(fullpath, JSON.stringify(v)); return true; }; cache.del = function(k) { - const fullpath = h.getCacheFile(k); + const fullpath = file.cacheFile(k); if (!fs.existsSync(fullpath)) return false; fs.unlinkSync(fullpath); @@ -32,11 +32,11 @@ cache.del = function(k) { }; cache.list = function() { - return fs.readdirSync(h.getCacheDir()) + return file.list(file.cacheDir()) .filter(x => path.extname(x) === '.json') .map(function(filename) { const k = path.basename(filename, '.json'); - const stat = fs.statSync(h.getCacheFile(k)); + const stat = fs.statSync(file.cacheFile(k)); return { name: k, size: stat.size, diff --git a/lib/chalk.js b/lib/chalk.js index 090ec573..ef78e9d8 100644 --- a/lib/chalk.js +++ b/lib/chalk.js @@ -3,6 +3,8 @@ var _ = require('underscore'); var style = require('ansi-styles'); var supportsColor = require('supports-color'); +var file = require('./file'); + const chalk = { enabled: supportsColor.stdout, use256: supportsColor.stdout && supportsColor.stdout.has256, @@ -54,8 +56,7 @@ chalk.wrap = function(pre, post) { const bgName = x => 'bg' + x[0].toUpperCase() + x.substr(1); chalk.init = function() { - const h = require('./helper'); - for (let f of h.getCodeDirData('colors')) { + for (let f of file.listCodeDir('colors')) { const theme = {}; const data = _.extendOwn({}, DEFAULT, f.data); for (let x of _.pairs(data)) { diff --git a/lib/cli.js b/lib/cli.js index be78c406..40dc8327 100644 --- a/lib/cli.js +++ b/lib/cli.js @@ -5,6 +5,7 @@ var chalk = require('./chalk'); var cache = require('./cache'); var config = require('./config'); var h = require('./helper'); +var file = require('./file'); var icon = require('./icon'); var log = require('./log'); var Plugin = require('./plugin'); @@ -53,7 +54,7 @@ function initLogLevel() { } function initDir() { - h.mkdir(h.getHomeDir()) + file.mkdir(file.homeDir()) } function initPlugins(cb) { diff --git a/lib/commands/config.js b/lib/commands/config.js index 8d684939..eb8a7b6a 100644 --- a/lib/commands/config.js +++ b/lib/commands/config.js @@ -2,7 +2,7 @@ var _ = require('underscore'); var nconf = require('nconf'); -var h = require('../helper'); +var file = require('../file'); var chalk = require('../chalk'); var config = require('../config'); var log = require('../log'); @@ -55,12 +55,12 @@ function loadConfig(showall) { } function saveConfig() { - require('fs').writeFileSync(h.getConfigFile(), prettyConfig(loadConfig(false))); + require('fs').writeFileSync(file.configFile(), prettyConfig(loadConfig(false))); } cmd.handler = function(argv) { session.argv = argv; - nconf.file('local', h.getConfigFile()); + nconf.file('local', file.configFile()); // show all if (argv.key.length === 0) diff --git a/lib/commands/show.js b/lib/commands/show.js index d930740f..6cc51bed 100644 --- a/lib/commands/show.js +++ b/lib/commands/show.js @@ -6,6 +6,7 @@ var _ = require('underscore'); var childProcess = require('child_process'); var h = require('../helper'); +var file = require('../file'); var chalk = require('../chalk'); var icon = require('../icon'); var log = require('../log'); @@ -123,7 +124,7 @@ function showProblem(problem, argv) { let filename; if (argv.gen) { filename = genFileName(problem, argv); - h.mkdir(argv.outdir); + file.mkdir(argv.outdir); fs.writeFileSync(filename, code); if (argv.editor !== undefined) { diff --git a/lib/commands/submission.js b/lib/commands/submission.js index ff570674..c9b07ce3 100644 --- a/lib/commands/submission.js +++ b/lib/commands/submission.js @@ -4,6 +4,7 @@ var fs = require('fs'); var sprintf = require('sprintf-js').sprintf; var h = require('../helper'); +var file = require('../file'); var chalk = require('../chalk'); var log = require('../log'); var Queue = require('../queue'); @@ -99,7 +100,7 @@ function exportSubmission(problem, argv, cb) { submission.ac ? 'ac' : 'notac', h.langToExt(submission.lang)); - h.mkdir(argv.outdir); + file.mkdir(argv.outdir); // skip the existing cached submissions if (fs.existsSync(f)) return cb(null, chalk.underline(f)); diff --git a/lib/commands/submit.js b/lib/commands/submit.js index 297084f7..fd30cc53 100644 --- a/lib/commands/submit.js +++ b/lib/commands/submit.js @@ -3,6 +3,7 @@ var fs = require('fs'); var util = require('util'); var h = require('../helper'); +var file = require('../file'); var chalk = require('../chalk'); var log = require('../log'); var core = require('../core'); @@ -48,7 +49,7 @@ cmd.handler = function(argv) { // use the 1st section in filename as keyword // e.g. two-sum.cpp, or two-sum.78502271.ac.cpp - const keyword = h.getFilename(argv.filename).split('.')[0]; + const keyword = file.name(argv.filename).split('.')[0]; core.getProblem(keyword, function(e, problem) { if (e) return log.fail(e); diff --git a/lib/commands/test.js b/lib/commands/test.js index ff320548..0410ee58 100644 --- a/lib/commands/test.js +++ b/lib/commands/test.js @@ -3,6 +3,7 @@ var fs = require('fs'); var _ = require('underscore'); var h = require('../helper'); +var file = require('../file'); var chalk = require('../chalk'); var log = require('../log'); var core = require('../core'); @@ -58,7 +59,7 @@ function runTest(argv) { // use the 1st section in filename as keyword // e.g. two-sum.cpp, or two-sum.78502271.ac.cpp - const keyword = h.getFilename(argv.filename).split('.')[0]; + const keyword = file.name(argv.filename).split('.')[0]; core.getProblem(keyword, function(e, problem) { if (e) return log.fail(e); diff --git a/lib/commands/version.js b/lib/commands/version.js index 684166a7..257f631a 100644 --- a/lib/commands/version.js +++ b/lib/commands/version.js @@ -1,6 +1,7 @@ 'use strict'; var _ = require('underscore'); +var file = require('../file'); var chalk = require('../chalk'); var icon = require('../icon'); var log = require('../log'); @@ -50,15 +51,14 @@ cmd.handler = function(argv) { ].join('\n'); log.info(logo); - const h = require('../helper'); const os = require('os'); const config = require('../config'); log.info('\n[Environment]'); printLine('Node', process.version); printLine('OS', os.platform() + ' ' + os.release()); - printLine('Cache', h.getCacheDir()); - printLine('Config', h.getConfigFile()); + printLine('Cache', file.cacheDir()); + printLine('Config', file.configFile()); log.info('\n[Configuration]'); _.each(config.getAll(true), function(v, k) { diff --git a/lib/config.js b/lib/config.js index 1f53cce9..21979dee 100644 --- a/lib/config.js +++ b/lib/config.js @@ -2,7 +2,7 @@ var _ = require('underscore'); var nconf = require('nconf'); -var h = require('./helper'); +var file = require('./file'); const DEFAULT_CONFIG = { // usually you don't wanna change those @@ -71,7 +71,7 @@ const DEFAULT_CONFIG = { function Config() {} Config.prototype.init = function() { - nconf.file('local', h.getConfigFile()) + nconf.file('local', file.configFile()) .add('global', {type: 'literal', store: DEFAULT_CONFIG}) .defaults({}); diff --git a/lib/core.js b/lib/core.js index a1356a62..a0c3adf9 100644 --- a/lib/core.js +++ b/lib/core.js @@ -6,6 +6,7 @@ var _ = require('underscore'); var log = require('./log'); var h = require('./helper'); +var file = require('./file'); var Plugin = require('./plugin'); const core = new Plugin(99999999, 'core', '20170722', 'Plugins manager'); @@ -122,10 +123,10 @@ core.exportProblem = function(problem, opts) { input.desc = wrap(desc).split('\n'); } - const tplfile = path.join(h.getCodeDir('templates'), opts.tpl + '.tpl'); - let output = _.template(h.getFileData(tplfile))(input); + const tplfile = path.join(file.codeDir('templates'), opts.tpl + '.tpl'); + let output = _.template(file.data(tplfile))(input); - if (h.isWindows()) { + if (file.isWindows()) { output = output.replace(/\n/g, '\r\n'); } else { output = output.replace(/\r\n/g, '\n'); diff --git a/lib/file.js b/lib/file.js new file mode 100644 index 00000000..ae148b76 --- /dev/null +++ b/lib/file.js @@ -0,0 +1,82 @@ +'use strict'; +var fs = require('fs'); +var path = require('path'); + +var mkdirp = require('mkdirp'); + +const file = {} + +file.isWindows = function() { + return process.platform === 'win32'; +}; + +/// app dirs /// +file.userHomeDir = function() { + return process.env.HOME || process.env.USERPROFILE; +}; + +file.homeDir = function() { + return path.join(this.userHomeDir(), '.lc'); +}; + +file.appDir = function() { + const config = require('./config'); + return path.join(this.homeDir(), config.app || 'leetcode'); +}; + +file.cacheDir = function() { + return path.join(this.appDir(), 'cache'); +}; + +file.codeDir = function(dir) { + return path.join(__dirname, '..', dir || ''); +}; + +/// app files /// +file.cacheFile = function(k) { + return path.join(this.cacheDir(), k + '.json'); +}; + +file.configFile = function() { + return path.join(this.homeDir(), 'config.json'); +}; + +file.pluginFile = function(name) { + return path.join(this.codeDir('lib/plugins'), path.basename(name)); +}; + +file.listCodeDir = function(dir) { + dir = this.codeDir(dir); + return this.list(dir).map(function(f) { + const fullpath = path.join(dir, f); + const ext = path.extname(f); + const name = path.basename(f, ext); + + let data = null; + switch (ext) { + case '.js': data = require(fullpath); break; + case '.json': data = JSON.parse(file.data(fullpath)); break; + } + return {name: name, data: data, file: f}; + }); +}; + +/// general dirs & files +file.mkdir = function(fullpath) { + if (fs.existsSync(fullpath)) return; + mkdirp.sync(fullpath); +}; + +file.list = function(dir) { + return fs.readdirSync(dir); +} + +file.name = function(fullpath) { + return path.basename(fullpath, path.extname(fullpath)); +}; + +file.data = function(fullpath) { + return fs.existsSync(fullpath) ? fs.readFileSync(fullpath).toString() : null; +}; + +module.exports = file; diff --git a/lib/helper.js b/lib/helper.js index ec6071f8..47fff2d5 100644 --- a/lib/helper.js +++ b/lib/helper.js @@ -1,11 +1,9 @@ 'use strict'; -var fs = require('fs'); -var path = require('path'); - var _ = require('underscore'); -var mkdirp = require('mkdirp'); var ora = require('ora'); +var file = require('./file'); + const UNITS_SIZE = [ {unit: 'B', name: 'Bytes', count: 1024}, {unit: 'K', name: 'KBytes', count: 1024}, @@ -58,10 +56,6 @@ h.KEYS = { problem: p => p.fid + '.' + p.slug + '.' + p.category }; -h.isWindows = function() { - return process.platform === 'win32'; -}; - h.prettyState = function(state) { switch (state) { case 'ac': return this.prettyText('', true); @@ -148,81 +142,18 @@ h.langToCommentStyle = function(lang) { {start: '/*', line: ' *', end: ' */'}; }; -h.mkdir = function(fullpath) { - if (fs.existsSync(fullpath)) return; - mkdirp.sync(fullpath); -}; - -h.getCodeDirData = function(dir) { - dir = h.getCodeDir(dir); - return fs.readdirSync(dir).map(function(file) { - const fullpath = path.join(dir, file); - const ext = path.extname(file); - - const name = path.basename(file, ext); - let data = null; - - switch (ext) { - case '.js': data = require(fullpath); break; - case '.json': data = JSON.parse(h.getFileData(fullpath)); break; - } - return {name: name, data: data, file: file}; - }); -}; - -h.getFilename = function(fullpath) { - return path.basename(fullpath, path.extname(fullpath)); -}; - -h.getFileData = function(fullpath) { - return fs.existsSync(fullpath) ? fs.readFileSync(fullpath).toString() : null; -}; - -h.getUserHomeDir = function() { - return process.env.HOME || process.env.USERPROFILE; -}; - -h.getHomeDir = function() { - return path.join(this.getUserHomeDir(), '.lc'); -}; - -h.getAppDir = function() { - const config = require('./config'); - return path.join(this.getHomeDir(), config.app || 'leetcode'); -}; - -h.getCacheDir = function() { - return path.join(this.getAppDir(), 'cache'); -}; - -h.getCodeDir = function(dir) { - return path.join(__dirname, '..', dir || ''); -}; - -h.getCacheFile = function(k) { - return path.join(this.getCacheDir(), k + '.json'); -}; - -h.getConfigFile = function() { - return path.join(this.getHomeDir(), 'config.json'); -}; - -h.getPluginFile = function(name) { - return path.join(this.getCodeDir('lib/plugins'), path.basename(name)); -}; - h.readStdin = function(cb) { const stdin = process.stdin; const bufs = []; console.log('NOTE: to finish the input, press ' + - (this.isWindows() ? ' and ' : '')); + (file.isWindows() ? ' and ' : '')); stdin.on('readable', function() { const data = stdin.read(); if (data) { // windows doesn't treat ctrl-D as EOF - if (h.isWindows() && data.toString() === '\x04\r\n') { + if (file.isWindows() && data.toString() === '\x04\r\n') { stdin.emit('end'); } else { bufs.push(data); diff --git a/lib/icon.js b/lib/icon.js index af95137b..c147a792 100644 --- a/lib/icon.js +++ b/lib/icon.js @@ -1,7 +1,7 @@ 'use strict'; var _ = require('underscore'); -var h = require('./helper'); +var file = require('./file'); const icons = { yes: '✔', @@ -18,13 +18,13 @@ const icons = { }; icons.setTheme = function(name) { - const defaultName = h.isWindows() ? 'win7' : 'default'; + const defaultName = file.isWindows() ? 'win7' : 'default'; const theme = this.themes.get(name) || this.themes.get(defaultName) || {}; _.extendOwn(this, theme); }; icons.init = function() { - for (let f of h.getCodeDirData('icons')) + for (let f of file.listCodeDir('icons')) icons.themes.set(f.name, f.data); }; diff --git a/lib/plugin.js b/lib/plugin.js index 5f430ebf..be5dfe32 100644 --- a/lib/plugin.js +++ b/lib/plugin.js @@ -7,6 +7,7 @@ var _ = require('underscore'); var request = require('request'); var h = require('./helper'); +var file = require('./file'); var cache = require('./cache'); var config = require('./config'); var log = require('./log'); @@ -39,16 +40,16 @@ Plugin.prototype.setNext = function(next) { this.next = next; }; -Plugin.prototype.setFile = function(file) { - this.file = file; - this.enabled = (file[0] !== '.'); +Plugin.prototype.setFile = function(f) { + this.file = f; + this.enabled = (this.file[0] !== '.'); }; Plugin.prototype.enable = function(enabled) { if (this.enabled === enabled) return; const newfile = enabled ? this.file.substr(1) : '.' + this.file; try { - fs.renameSync(h.getPluginFile(this.file), h.getPluginFile(newfile)); + fs.renameSync(file.pluginFile(this.file), file.pluginFile(newfile)); } catch(e) { log.error(e.message); } @@ -58,7 +59,7 @@ Plugin.prototype.enable = function(enabled) { Plugin.prototype.delete = function() { if (!this.missing) { try { - const fullpath = h.getPluginFile(this.file); + const fullpath = file.pluginFile(this.file); fs.unlinkSync(fullpath); } catch(e) { return log.error(e.message); @@ -83,7 +84,7 @@ Plugin.prototype.install = function(cb) { const cmd = 'npm install --save ' + this.deps.join(' '); log.debug(cmd); const spin = h.spin(cmd); - cp.exec(cmd, {cwd: h.getCodeDir()}, function() { + cp.exec(cmd, {cwd: file.codeDir()}, function() { spin.stop(); return cb(); }); @@ -99,7 +100,7 @@ Plugin.init = function(head) { // 1. check installed plugins let plugins = []; - for (let f of h.getCodeDirData('lib/plugins')) { + for (let f of file.listCodeDir('lib/plugins')) { const p = f.data; if (!p) continue; @@ -146,7 +147,7 @@ Plugin.copy = function(src, cb) { if (path.extname(src) !== '.js') { src = config.sys.urls.plugin.replace('$name', src); } - const dst = h.getPluginFile(src); + const dst = file.pluginFile(src); const srcstream = src.startsWith('https://') ? request(src) : fs.createReadStream(src); srcstream.on('response', function(resp) { diff --git a/lib/plugins/leetcode.js b/lib/plugins/leetcode.js index 6f1f78b2..c8563d25 100644 --- a/lib/plugins/leetcode.js +++ b/lib/plugins/leetcode.js @@ -8,6 +8,7 @@ var request = require('request'); var config = require('../config'); var h = require('../helper'); +var file = require('../file'); var log = require('../log'); var Plugin = require('../plugin'); var Queue = require('../queue'); @@ -184,7 +185,7 @@ function runCode(opts, problem, cb) { lang: h.extToLang(problem.file), question_id: parseInt(problem.id, 10), test_mode: false, - typed_code: h.getFileData(problem.file) + typed_code: file.data(problem.file) }); const spin = h.spin('Sending code to judge'); diff --git a/test/plugins/test_cache.js b/test/plugins/test_cache.js index a3980418..6b3114ca 100644 --- a/test/plugins/test_cache.js +++ b/test/plugins/test_cache.js @@ -3,6 +3,7 @@ const _ = require('underscore'); const assert = require('chai').assert; const rewire = require('rewire'); +const h = require('../../lib/helper'); const log = require('../../lib/log'); const config = require('../../lib/config'); const th = require('../helper'); @@ -11,7 +12,7 @@ describe('plugin:cache', function() { let plugin; let next; let cache; - let h; + let file; let session; const PROBLEMS = [ @@ -29,11 +30,11 @@ describe('plugin:cache', function() { th.clean(); next = {}; - h = rewire('../../lib/helper'); - h.getCacheDir = () => th.DIR; + file = rewire('../../lib/file'); + file.cacheDir = () => th.DIR; cache = rewire('../../lib/cache'); - cache.__set__('h', h); + cache.__set__('file', file); cache.init(); session = rewire('../../lib/session'); diff --git a/test/test_cache.js b/test/test_cache.js index b3fb669d..caba14c1 100644 --- a/test/test_cache.js +++ b/test/test_cache.js @@ -13,11 +13,11 @@ describe('cache', function() { beforeEach(function() { th.clean(); - const h = rewire('../lib/helper'); - h.getCacheDir = () => th.DIR; + const file = rewire('../lib/file'); + file.cacheDir = () => th.DIR; cache = rewire('../lib/cache'); - cache.__set__('h', h); + cache.__set__('file', file); cache.init(); }); diff --git a/test/test_config.js b/test/test_config.js index 6cfc0210..9ae828dd 100644 --- a/test/test_config.js +++ b/test/test_config.js @@ -12,11 +12,11 @@ describe('config', function() { beforeEach(function() { th.clean(); - const h = rewire('../lib/helper'); - h.getConfigFile = () => FILE; + const file = rewire('../lib/file'); + file.configFile = () => FILE; config = rewire('../lib/config'); - config.__set__('h', h); + config.__set__('file', file); }); function createConfigFile(data) { diff --git a/test/test_core.js b/test/test_core.js index c61031c0..1145bc69 100644 --- a/test/test_core.js +++ b/test/test_core.js @@ -171,9 +171,9 @@ describe('core', function() { }); it('should codeonly ok in windows', function() { - const h = rewire('../lib/helper'); - h.isWindows = () => true; - core.__set__('h', h); + const file = rewire('../lib/file'); + file.isWindows = () => true; + core.__set__('file', file); const expected = [ '/**', diff --git a/test/test_file.js b/test/test_file.js new file mode 100644 index 00000000..d5e3fbda --- /dev/null +++ b/test/test_file.js @@ -0,0 +1,58 @@ +'use strict'; +const path = require('path'); + +const assert = require('chai').assert; +const rewire = require('rewire'); + +describe('file', function() { + let file; + + beforeEach(function() { + file = rewire('../lib/file'); + }); + + describe('#dirAndFiles', function() { + const HOME = path.join(__dirname, '..'); + + it('should ok', function() { + process.env.HOME = '/home/skygragon'; + + assert.equal(file.userHomeDir(), '/home/skygragon'); + assert.equal(file.homeDir(), '/home/skygragon/.lc'); + assert.equal(file.cacheDir(), '/home/skygragon/.lc/leetcode/cache'); + assert.equal(file.cacheFile('xxx'), '/home/skygragon/.lc/leetcode/cache/xxx.json'); + assert.equal(file.configFile(), '/home/skygragon/.lc/config.json'); + assert.equal(file.name('/home/skygragon/.lc/leetcode/cache/xxx.json'), 'xxx'); + + process.env.HOME = ''; + process.env.USERPROFILE = 'C:\\Users\\skygragon'; + assert.equal(file.userHomeDir(), 'C:\\Users\\skygragon'); + }); + + it('should codeDir ok', function() { + assert.equal(file.codeDir(), HOME); + assert.equal(file.codeDir('.'), HOME); + assert.equal(file.codeDir('icons'), path.join(HOME, 'icons')); + assert.equal(file.codeDir('lib/plugins'), path.join(HOME, 'lib', 'plugins')); + }); + + it('should listCodeDir ok', function() { + const files = file.listCodeDir('lib/plugins'); + assert.equal(files.length, 3); + assert.equal(files[0].name, 'cache'); + assert.equal(files[1].name, 'leetcode'); + assert.equal(files[2].name, 'retry'); + }); + + it('should pluginFile ok', function() { + const expect = path.join(HOME, 'lib/plugins/cache.js'); + assert.equal(file.pluginFile('cache.js'), expect); + assert.equal(file.pluginFile('./cache.js'), expect); + assert.equal(file.pluginFile('https://github.com/skygragon/cache.js'), expect); + }); + + it('should data ok with missing file', function() { + assert.equal(file.data('non-exist'), null); + }); + }); // #dirAndFiles +}); diff --git a/test/test_helper.js b/test/test_helper.js index ccb81599..e88349a9 100644 --- a/test/test_helper.js +++ b/test/test_helper.js @@ -1,6 +1,4 @@ 'use strict'; -const path = require('path'); - const assert = require('chai').assert; const rewire = require('rewire'); const _ = require('underscore'); @@ -180,51 +178,6 @@ describe('helper', function() { }); }); // #langToCommentStyle - describe('#dirAndFiles', function() { - const HOME = path.join(__dirname, '..'); - - it('should ok', function() { - process.env.HOME = '/home/skygragon'; - - assert.equal(h.getUserHomeDir(), '/home/skygragon'); - assert.equal(h.getHomeDir(), '/home/skygragon/.lc'); - assert.equal(h.getCacheDir(), '/home/skygragon/.lc/leetcode/cache'); - assert.equal(h.getCacheFile('xxx'), '/home/skygragon/.lc/leetcode/cache/xxx.json'); - assert.equal(h.getConfigFile(), '/home/skygragon/.lc/config.json'); - assert.equal(h.getFilename('/home/skygragon/.lc/leetcode/cache/xxx.json'), 'xxx'); - - process.env.HOME = ''; - process.env.USERPROFILE = 'C:\\Users\\skygragon'; - assert.equal(h.getUserHomeDir(), 'C:\\Users\\skygragon'); - }); - - it('should getCodeDir ok', function() { - assert.equal(h.getCodeDir(), HOME); - assert.equal(h.getCodeDir('.'), HOME); - assert.equal(h.getCodeDir('icons'), path.join(HOME, 'icons')); - assert.equal(h.getCodeDir('lib/plugins'), path.join(HOME, 'lib', 'plugins')); - }); - - it('should getCodeDirData ok', function() { - const files = h.getCodeDirData('lib/plugins'); - assert.equal(files.length, 3); - assert.equal(files[0].name, 'cache'); - assert.equal(files[1].name, 'leetcode'); - assert.equal(files[2].name, 'retry'); - }); - - it('should getPluginFile ok', function() { - const expect = path.join(HOME, 'lib/plugins/cache.js'); - assert.equal(h.getPluginFile('cache.js'), expect); - assert.equal(h.getPluginFile('./cache.js'), expect); - assert.equal(h.getPluginFile('https://github.com/skygragon/cache.js'), expect); - }); - - it('should getFileData ok with missing file', function() { - assert.equal(h.getFileData('non-exist'), null); - }); - }); // #dirAndFiles - describe('#getSetCookieValue', function() { it('should ok', function() { const resp = { diff --git a/test/test_icon.js b/test/test_icon.js index 8408a2c9..559eeb51 100644 --- a/test/test_icon.js +++ b/test/test_icon.js @@ -4,11 +4,11 @@ const rewire = require('rewire'); describe('icon', function() { let icon; - let h; + let file; beforeEach(function() { - h = rewire('../lib/helper'); - h.getCodeDirData = function() { + file = rewire('../lib/file'); + file.listCodeDir = function() { return [ {name: 'mac', data: {yes: 'yes', no: 'no', lock: 'lock', like: 'like', unlike: 'unlike'}}, {name: 'win7', data: {yes: 'YES', no: 'NO', lock: 'LOCK', like: 'LIKE', unlike: 'UNLIKE'}} @@ -16,7 +16,7 @@ describe('icon', function() { }; icon = rewire('../lib/icon'); - icon.__set__('h', h); + icon.__set__('file', file); icon.init(); }); @@ -40,7 +40,7 @@ describe('icon', function() { }); it('should ok with unknown theme on windows', function() { - h.isWindows = () => true; + file.isWindows = () => true; icon.setTheme('non-exist'); assert.equal(icon.yes, 'YES'); diff --git a/test/test_plugin.js b/test/test_plugin.js index d758b9b9..a6cdf156 100644 --- a/test/test_plugin.js +++ b/test/test_plugin.js @@ -13,7 +13,7 @@ const th = require('./helper'); const Plugin = rewire('../lib/plugin'); describe('plugin', function() { - let h; + let file; let cache; const NOOP = () => {}; @@ -23,9 +23,9 @@ describe('plugin', function() { chalk.init(); config.init(); - h = rewire('../lib/helper'); + file = rewire('../lib/file'); cache = rewire('../lib/cache'); - Plugin.__set__('h', h); + Plugin.__set__('file', file); Plugin.__set__('cache', cache); }); @@ -42,7 +42,7 @@ describe('plugin', function() { before(function() { p1.init = p2.init = p3.init = p4.init = NOOP; - h.getCodeDirData = function() { + file.listCodeDir = function() { return [ {name: 'cache', data: p2, file: 'cache.js'}, {name: 'leetcode', data: p1, file: '.leetcode.js'}, // disabled @@ -123,7 +123,7 @@ describe('plugin', function() { const DST = path.resolve(th.DIR, 'copy.test.js'); before(function() { - h.getPluginFile = () => DST; + file.pluginFile = () => DST; }); it('should copy from http error', function(done) { @@ -162,7 +162,7 @@ describe('plugin', function() { beforeEach(function() { expected = []; - h.getPluginFile = x => th.DIR + x; + file.pluginFile = x => th.DIR + x; Plugin.install = (name, cb) => { expected.push(name); return cb(null, PLUGINS[+name]); @@ -183,7 +183,7 @@ describe('plugin', function() { const FILE = path.resolve(th.DIR, 'leetcode.js'); before(function() { - h.getPluginFile = () => FILE; + file.pluginFile = () => FILE; }); it('should ok', function() { @@ -208,7 +208,7 @@ describe('plugin', function() { describe('#delete', function() { it('should ok', function() { - h.getPluginFile = x => th.DIR + x; + file.pluginFile = x => th.DIR + x; const p = new Plugin(0, '0', '2018.01.01'); p.file = '0.js'; From d9e07e415a574fd1c3737964a7868f8b40da580b Mon Sep 17 00:00:00 2001 From: Eric Wang Date: Sun, 18 Nov 2018 09:52:53 +0800 Subject: [PATCH 25/65] Embed meta in comment instead of filename. refs #55 #65 Signed-off-by: Eric Wang --- lib/commands/submit.js | 7 +++--- lib/commands/test.js | 7 +++--- lib/core.js | 32 ++++++++++-------------- lib/file.js | 55 ++++++++++++++++++++++++++++++++++++++++- lib/helper.js | 12 +++------ lib/plugins/leetcode.js | 2 +- templates/detailed.tpl | 4 ++- test/test_core.js | 4 +++ test/test_file.js | 44 +++++++++++++++++++++++++++++++++ test/test_helper.js | 4 +-- 10 files changed, 129 insertions(+), 42 deletions(-) diff --git a/lib/commands/submit.js b/lib/commands/submit.js index fd30cc53..2f83d7b0 100644 --- a/lib/commands/submit.js +++ b/lib/commands/submit.js @@ -47,14 +47,13 @@ cmd.handler = function(argv) { if (!fs.existsSync(argv.filename)) return log.error('File ' + argv.filename + ' not exist!'); - // use the 1st section in filename as keyword - // e.g. two-sum.cpp, or two-sum.78502271.ac.cpp - const keyword = file.name(argv.filename).split('.')[0]; + const meta = file.meta(argv.filename); - core.getProblem(keyword, function(e, problem) { + core.getProblem(meta.id, function(e, problem) { if (e) return log.fail(e); problem.file = argv.filename; + problem.lang = meta.lang; core.submitProblem(problem, function(e, results) { if (e) return log.fail(e); diff --git a/lib/commands/test.js b/lib/commands/test.js index 0410ee58..4992a06c 100644 --- a/lib/commands/test.js +++ b/lib/commands/test.js @@ -57,11 +57,9 @@ function runTest(argv) { if (!fs.existsSync(argv.filename)) return log.error('File ' + argv.filename + ' not exist!'); - // use the 1st section in filename as keyword - // e.g. two-sum.cpp, or two-sum.78502271.ac.cpp - const keyword = file.name(argv.filename).split('.')[0]; + const meta = file.meta(argv.filename); - core.getProblem(keyword, function(e, problem) { + core.getProblem(meta.id, function(e, problem) { if (e) return log.fail(e); if (!problem.testable) @@ -74,6 +72,7 @@ function runTest(argv) { return log.fail('missing testcase?'); problem.file = argv.filename; + problem.lang = meta.lang; log.info('\nInput data:'); log.info(problem.testcase); diff --git a/lib/core.js b/lib/core.js index a0c3adf9..e4d4b645 100644 --- a/lib/core.js +++ b/lib/core.js @@ -1,5 +1,4 @@ 'use strict'; -var path = require('path'); var util = require('util'); var _ = require('underscore'); @@ -107,31 +106,26 @@ core.starProblem = function(problem, starred, cb) { }; core.exportProblem = function(problem, opts) { - // copy problem attrs thus we can render it in template - const input = _.extend({}, problem); + const data = _.extend({}, problem); - input.code = opts.code.replace(/\r\n/g, '\n'); - input.comment = h.langToCommentStyle(opts.lang); - input.percent = input.percent.toFixed(2); - input.testcase = util.inspect(input.testcase || ''); + // unify format before rendering + data.app = require('./config').app; + if (!data.fid) data.fid = data.id; + if (!data.lang) data.lang = opts.lang; + data.code = (opts.code || data.code || '').replace(/\r\n/g, '\n'); + data.comment = h.langToCommentStyle(data.lang); + data.percent = data.percent.toFixed(2); + data.testcase = util.inspect(data.testcase || ''); if (opts.tpl === 'detailed') { // NOTE: wordwrap internally uses '\n' as EOL, so here we have to // remove all '\r' in the raw string. - const desc = input.desc.replace(/\r\n/g, '\n').replace(/^ /mg, '⁠'); - const wrap = require('wordwrap')(79 - input.comment.line.length); - input.desc = wrap(desc).split('\n'); + const desc = data.desc.replace(/\r\n/g, '\n').replace(/^ /mg, '⁠'); + const wrap = require('wordwrap')(79 - data.comment.line.length); + data.desc = wrap(desc).split('\n'); } - const tplfile = path.join(file.codeDir('templates'), opts.tpl + '.tpl'); - let output = _.template(file.data(tplfile))(input); - - if (file.isWindows()) { - output = output.replace(/\n/g, '\r\n'); - } else { - output = output.replace(/\r\n/g, '\n'); - } - return output; + return file.render(opts.tpl, data); }; module.exports = core; diff --git a/lib/file.js b/lib/file.js index ae148b76..1db36ca2 100644 --- a/lib/file.js +++ b/lib/file.js @@ -2,6 +2,7 @@ var fs = require('fs'); var path = require('path'); +var _ = require('underscore'); var mkdirp = require('mkdirp'); const file = {} @@ -61,7 +62,7 @@ file.listCodeDir = function(dir) { }); }; -/// general dirs & files +/// general dirs & files /// file.mkdir = function(fullpath) { if (fs.existsSync(fullpath)) return; mkdirp.sync(fullpath); @@ -79,4 +80,56 @@ file.data = function(fullpath) { return fs.existsSync(fullpath) ? fs.readFileSync(fullpath).toString() : null; }; +/// templates & metadata /// +file.render = function(tpl, data) { + const tplfile = path.join(this.codeDir('templates'), tpl + '.tpl'); + let result = _.template(this.data(tplfile))(data); + + if (this.isWindows()) { + result = result.replace(/\n/g, '\r\n'); + } else { + result = result.replace(/\r\n/g, '\n'); + } + return result; +}; + +file.metaByName = function(filename) { + const m = {}; + + // expect the 1st section in filename as id + // e.g. 1.two-sum.cpp + m.id = file.name(filename).split('.')[0]; + + // HACK: compatible with old ext + if (filename.endsWith('.py3') || filename.endsWith('.python3.py')) + m.lang = 'python3'; + else + m.lang = require('./helper').extToLang(filename); + + return m; +}; + +file.meta = function(filename) { + const m = {}; + + // first look into the file data + const line = this.data(filename).split('\n') + .find(x => x.indexOf(' @lc ') >= 0) || ''; + line.split(' ').forEach(function(x) { + const v = x.split('='); + if (v.length == 2) { + m[v[0]] = v[1]; + } + }); + + // otherwise, look into file name + if (!m.id || !m.lang) { + const olddata = this.metaByName(filename); + m.id = m.id || olddata.id; + m.lang = m.lang || olddata.lang; + } + + return m; +}; + module.exports = file; diff --git a/lib/helper.js b/lib/helper.js index 47fff2d5..b4794bb1 100644 --- a/lib/helper.js +++ b/lib/helper.js @@ -40,7 +40,7 @@ const LANGS = [ {lang: 'kotlin', ext: '.kt', style: 'c'}, {lang: 'mysql', ext: '.sql', style: '#'}, {lang: 'python', ext: '.py', style: '#'}, - {lang: 'python3', ext: '.python3.py', style: '#'}, + {lang: 'python3', ext: '.py', style: '#'}, {lang: 'ruby', ext: '.rb', style: '#'}, {lang: 'scala', ext: '.scala', style: 'c'}, {lang: 'swift', ext: '.swift', style: 'c'} @@ -124,14 +124,8 @@ h.langToExt = function(lang) { }; h.extToLang = function(fullpath) { - // HACK: compatible with old ext - if (fullpath.endsWith('.py3')) return 'python3'; - - const res = _.chain(LANGS) - .filter(x => fullpath.endsWith(x.ext)) - .sortBy(x => -x.ext.length) - .value(); - return res.length ? res[0].lang : 'unknown'; + const res = LANGS.find(x => fullpath.endsWith(x.ext)); + return res ? res.lang : 'unknown'; }; h.langToCommentStyle = function(lang) { diff --git a/lib/plugins/leetcode.js b/lib/plugins/leetcode.js index c8563d25..8a3a8d8c 100644 --- a/lib/plugins/leetcode.js +++ b/lib/plugins/leetcode.js @@ -182,7 +182,7 @@ function runCode(opts, problem, cb) { opts.body = opts.body || {}; _.extendOwn(opts.body, { - lang: h.extToLang(problem.file), + lang: problem.lang, question_id: parseInt(problem.id, 10), test_mode: false, typed_code: file.data(problem.file) diff --git a/templates/detailed.tpl b/templates/detailed.tpl index b8a762e2..6758aa10 100644 --- a/templates/detailed.tpl +++ b/templates/detailed.tpl @@ -1,5 +1,7 @@ <%= comment.start %> -<%= comment.line %> [<%= id %>] <%= name %> +<%= comment.line %> @lc app=<%= app %> id=<%= fid %> lang=<%= lang %> +<%= comment.line %> +<%= comment.line %> [<%= fid %>] <%= name %> <%= comment.line %> <%= comment.line %> <%= link %> <%= comment.line %> diff --git a/test/test_core.js b/test/test_core.js index 1145bc69..5932cd4d 100644 --- a/test/test_core.js +++ b/test/test_core.js @@ -205,6 +205,8 @@ describe('core', function() { it('should detailed ok with cpp', function() { const expected = [ '/*', + ' * @lc app=leetcode id=2 lang=cpp', + ' *', ' * [2] Add Two Numbers', ' *', ' * https://leetcode.com/problems/add-two-numbers', @@ -250,6 +252,8 @@ describe('core', function() { it('should detailed ok with ruby', function() { const expected = [ + '#', + '# @lc app=leetcode id=2 lang=ruby', '#', '# [2] Add Two Numbers', '#', diff --git a/test/test_file.js b/test/test_file.js index d5e3fbda..481fa9d3 100644 --- a/test/test_file.js +++ b/test/test_file.js @@ -55,4 +55,48 @@ describe('file', function() { assert.equal(file.data('non-exist'), null); }); }); // #dirAndFiles + + describe('#meta', function() { + it('should meta ok within file content', function() { + file.data = x => [ + '/ *', + ' * @lc app=leetcode id=123 lang=javascript', + ' * /' + ].join('\n'); + const meta = file.meta('dummy'); + assert.equal(meta.app, 'leetcode') + assert.equal(meta.id, '123'); + assert.equal(meta.lang, 'javascript'); + }); + + it('should meta ok within file name', function() { + file.data = x => [ + '/ *', + ' * no meta app=leetcode id=123 lang=javascript', + ' * /' + ].join('\n'); + const meta = file.meta('321.dummy.py'); + assert(!meta.app) + assert.equal(meta.id, '321'); + assert.equal(meta.lang, 'python'); + }); + + it('should meta ok within deprecated file name', function() { + file.data = x => [ + '/ *', + ' * no meta app=leetcode id=123 lang=javascript', + ' * /' + ].join('\n'); + + var meta = file.meta('111.dummy.py3'); + assert(!meta.app) + assert.equal(meta.id, '111'); + assert.equal(meta.lang, 'python3'); + + meta = file.meta('222.dummy.python3.py'); + assert(!meta.app) + assert.equal(meta.id, '222'); + assert.equal(meta.lang, 'python3'); + }); + }); // #meta }); diff --git a/test/test_helper.js b/test/test_helper.js index e88349a9..8b6f64a6 100644 --- a/test/test_helper.js +++ b/test/test_helper.js @@ -129,7 +129,7 @@ describe('helper', function() { assert.equal(h.langToExt('javascript'), '.js'); assert.equal(h.langToExt('mysql'), '.sql'); assert.equal(h.langToExt('python'), '.py'); - assert.equal(h.langToExt('python3'), '.python3.py'); + assert.equal(h.langToExt('python3'), '.py'); assert.equal(h.langToExt('ruby'), '.rb'); assert.equal(h.langToExt('scala'), '.scala'); assert.equal(h.langToExt('swift'), '.swift'); @@ -147,8 +147,6 @@ describe('helper', function() { assert.equal(h.extToLang('file.java'), 'java'); assert.equal(h.extToLang('c:/file.js'), 'javascript'); assert.equal(h.extToLang('c:/Users/skygragon/file.py'), 'python'); - assert.equal(h.extToLang('c:/Users/skygragon/file.py3'), 'python3'); - assert.equal(h.extToLang('c:/Users/skygragon/file.python3.py'), 'python3'); assert.equal(h.extToLang('~/file.rb'), 'ruby'); assert.equal(h.extToLang('/tmp/file.scala'), 'scala'); assert.equal(h.extToLang('~/leetcode/file.swift'), 'swift'); From aca460901ea15fda7041f4ddbf2f7f3b83db78ce Mon Sep 17 00:00:00 2001 From: Eric Wang Date: Sun, 18 Nov 2018 10:10:37 +0800 Subject: [PATCH 26/65] Update dev dependecies. Signed-off-by: Eric Wang --- package.json | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/package.json b/package.json index e25643b8..bffa63d2 100644 --- a/package.json +++ b/package.json @@ -49,12 +49,12 @@ "yargs": "10.0.3" }, "devDependencies": { - "chai": "4.1.2", - "eslint": "4.13.1", - "eslint-config-google": "0.9.1", - "mocha": "4.0.1", - "nock": "9.1.4", - "nyc": "11.3.0", - "rewire": "2.5.2" + "chai": "4.2.0", + "eslint": "5.9.0", + "eslint-config-google": "0.11.0", + "mocha": "5.2.0", + "nock": "10.0.2", + "nyc": "13.1.0", + "rewire": "4.0.1" } } From c20b0d9a567777a22e09312f60064e4ef73c40a9 Mon Sep 17 00:00:00 2001 From: Eric Wang Date: Sun, 18 Nov 2018 10:15:58 +0800 Subject: [PATCH 27/65] Update dependencies. Signed-off-by: Eric Wang --- package.json | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/package.json b/package.json index bffa63d2..a188e57a 100644 --- a/package.json +++ b/package.json @@ -33,20 +33,20 @@ }, "homepage": "https://github.com/skygragon/leetcode-cli#readme", "dependencies": { - "ansi-styles": "3.2.0", + "ansi-styles": "3.2.1", "cheerio": "0.20.0", - "he": "1.1.1", + "he": "1.2.0", "mkdirp": "0.5.1", "moment": "^2.20.1", "nconf": "0.10.0", - "ora": "^1.3.0", + "ora": "3.0.0", "prompt": "1.0.0", - "request": "2.83.0", + "request": "2.88.0", "sprintf-js": "1.1.1", - "supports-color": "5.1.0", - "underscore": "1.8.3", + "supports-color": "5.5.0", + "underscore": "1.9.1", "wordwrap": "1.0.0", - "yargs": "10.0.3" + "yargs": "12.0.4" }, "devDependencies": { "chai": "4.2.0", From 045528eada8b995a8e9be90edaf2613e5213d6aa Mon Sep 17 00:00:00 2001 From: Eric Wang Date: Sun, 18 Nov 2018 10:46:01 +0800 Subject: [PATCH 28/65] Bump to 2.5.4 Signed-off-by: Eric Wang --- docs/commands.md | 4 ++-- docs/releases.md | 5 +++++ package.json | 2 +- 3 files changed, 8 insertions(+), 3 deletions(-) diff --git a/docs/commands.md b/docs/commands.md index d8da1796..e3270b44 100644 --- a/docs/commands.md +++ b/docs/commands.md @@ -465,7 +465,7 @@ Display version information. Short: $ leetcode version - 2.5.3 + 2.5.4 Verbose: @@ -475,7 +475,7 @@ Verbose: | | ___ ___| |_ ___ ___ __| | ___ | |/ _ \/ _ \ __|/ __|/ _ \ / _` |/ _ \ | | __/ __/ |_ (__| (_) | (_| | __/ - |_|\___|\___|\__|\___|\___/ \__,_|\___| CLI v2.5.3 + |_|\___|\___|\__|\___|\___/ \__,_|\___| CLI v2.5.4 [Environment] Node v8.1.4 diff --git a/docs/releases.md b/docs/releases.md index 4234cce3..1794ecb5 100644 --- a/docs/releases.md +++ b/docs/releases.md @@ -2,6 +2,11 @@ layout: default title: Release Notes --- +# 2.5.4 +* fixes error in fresh env without .lc existed. +* embed meta in file content instead of file name. +* update dependencies. + # 2.5.3 * fixes "Failed to load locked problem" issue. diff --git a/package.json b/package.json index a188e57a..28bdfef8 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "leetcode-cli", - "version": "2.5.3", + "version": "2.5.4", "description": "A cli tool to enjoy leetcode!", "preferGlobal": "true", "engines": { From fb5f5973a8614ad198eba0b9716998d35493ae8c Mon Sep 17 00:00:00 2001 From: Eric Wang Date: Sun, 18 Nov 2018 11:09:24 +0800 Subject: [PATCH 29/65] fixes #112: use "--" as comment in sql file Signed-off-by: Eric Wang --- lib/helper.js | 8 ++++---- test/test_helper.js | 3 ++- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/lib/helper.js b/lib/helper.js index b4794bb1..5ca496aa 100644 --- a/lib/helper.js +++ b/lib/helper.js @@ -38,7 +38,7 @@ const LANGS = [ {lang: 'java', ext: '.java', style: 'c'}, {lang: 'javascript', ext: '.js', style: 'c'}, {lang: 'kotlin', ext: '.kt', style: 'c'}, - {lang: 'mysql', ext: '.sql', style: '#'}, + {lang: 'mysql', ext: '.sql', style: '--'}, {lang: 'python', ext: '.py', style: '#'}, {lang: 'python3', ext: '.py', style: '#'}, {lang: 'ruby', ext: '.rb', style: '#'}, @@ -131,9 +131,9 @@ h.extToLang = function(fullpath) { h.langToCommentStyle = function(lang) { const res = LANGS.find(x => x.lang === lang); - return (res && res.style === '#') ? - {start: '#', line: '#', end: '#'} : - {start: '/*', line: ' *', end: ' */'}; + return (res && res.style === 'c') ? + {start: '/*', line: ' *', end: ' */'} : + {start: res.style, line: res.style, end: res.style}; }; h.readStdin = function(cb) { diff --git a/test/test_helper.js b/test/test_helper.js index 8b6f64a6..cfc502d4 100644 --- a/test/test_helper.js +++ b/test/test_helper.js @@ -159,6 +159,7 @@ describe('helper', function() { it('should ok', function() { const C_STYLE = {start: '/*', line: ' *', end: ' */'}; const RUBY_STYLE = {start: '#', line: '#', end: '#'}; + const SQL_STYLE = {start: '--', line: '--', end: '--'}; assert.deepEqual(h.langToCommentStyle('bash'), RUBY_STYLE); assert.deepEqual(h.langToCommentStyle('c'), C_STYLE); @@ -167,7 +168,7 @@ describe('helper', function() { assert.deepEqual(h.langToCommentStyle('golang'), C_STYLE); assert.deepEqual(h.langToCommentStyle('java'), C_STYLE); assert.deepEqual(h.langToCommentStyle('javascript'), C_STYLE); - assert.deepEqual(h.langToCommentStyle('mysql'), RUBY_STYLE); + assert.deepEqual(h.langToCommentStyle('mysql'), SQL_STYLE); assert.deepEqual(h.langToCommentStyle('python'), RUBY_STYLE); assert.deepEqual(h.langToCommentStyle('python3'), RUBY_STYLE); assert.deepEqual(h.langToCommentStyle('ruby'), RUBY_STYLE); From 167fa23b5f68a4b17046e1005789dccacb0d0fb5 Mon Sep 17 00:00:00 2001 From: Eric Wang Date: Sun, 18 Nov 2018 12:46:51 +0800 Subject: [PATCH 30/65] [refactor] simplify template format. Signed-off-by: Eric Wang --- lib/cli.js | 1 + lib/file.js | 7 +++++++ templates/codeonly.tpl | 2 +- templates/detailed.tpl | 32 ++++++++++++++++---------------- test/test_core.js | 10 ++++++++-- 5 files changed, 33 insertions(+), 19 deletions(-) diff --git a/lib/cli.js b/lib/cli.js index 40dc8327..e267deda 100644 --- a/lib/cli.js +++ b/lib/cli.js @@ -54,6 +54,7 @@ function initLogLevel() { } function initDir() { + file.init(); file.mkdir(file.homeDir()) } diff --git a/lib/file.js b/lib/file.js index 1db36ca2..6d02f878 100644 --- a/lib/file.js +++ b/lib/file.js @@ -7,6 +7,13 @@ var mkdirp = require('mkdirp'); const file = {} +file.init = function() { + _.templateSettings = { + evaluate: /\{\{(.+?)\}\}/g, + interpolate: /\$\{(.+?)\}/g + }; +}; + file.isWindows = function() { return process.platform === 'win32'; }; diff --git a/templates/codeonly.tpl b/templates/codeonly.tpl index 38efb755..d8baa802 100644 --- a/templates/codeonly.tpl +++ b/templates/codeonly.tpl @@ -1 +1 @@ -<%= code %> +${code} diff --git a/templates/detailed.tpl b/templates/detailed.tpl index 6758aa10..cf501c0d 100644 --- a/templates/detailed.tpl +++ b/templates/detailed.tpl @@ -1,16 +1,16 @@ -<%= comment.start %> -<%= comment.line %> @lc app=<%= app %> id=<%= fid %> lang=<%= lang %> -<%= comment.line %> -<%= comment.line %> [<%= fid %>] <%= name %> -<%= comment.line %> -<%= comment.line %> <%= link %> -<%= comment.line %> -<%= comment.line %> <%= category %> -<%= comment.line %> <%= level %> (<%= percent %>%) -<%= comment.line %> Total Accepted: <%= totalAC %> -<%= comment.line %> Total Submissions: <%= totalSubmit %> -<%= comment.line %> Testcase Example: <%= testcase %> -<%= comment.line %> -<% desc.forEach(function(x) { %><%= comment.line %> <%= x %> -<% }) %><%= comment.end %> -<%= code %> +${comment.start} +${comment.line} @lc app=${app} id=${fid} lang=${lang} +${comment.line} +${comment.line} [${fid}] ${name} +${comment.line} +${comment.line} ${link} +${comment.line} +${comment.line} ${category} +${comment.line} ${level} (${percent}%) +${comment.line} Total Accepted: ${totalAC} +${comment.line} Total Submissions: ${totalSubmit} +${comment.line} Testcase Example: ${testcase} +${comment.line} +{{ desc.forEach(function(x) { }}${comment.line} ${x} +{{ }) }}${comment.end} +${code} diff --git a/test/test_core.js b/test/test_core.js index 5932cd4d..1c8b4c5f 100644 --- a/test/test_core.js +++ b/test/test_core.js @@ -142,6 +142,14 @@ describe('core', function() { }); // #starProblem describe('#exportProblem', function() { + let file; + + beforeEach(function() { + file = rewire('../lib/file'); + file.init(); + core.__set__('file', file); + }); + it('should codeonly ok', function() { const expected = [ '/**', @@ -171,9 +179,7 @@ describe('core', function() { }); it('should codeonly ok in windows', function() { - const file = rewire('../lib/file'); file.isWindows = () => true; - core.__set__('file', file); const expected = [ '/**', From e7ac6a63ccb35719a624e371b4d704e46f1227a7 Mon Sep 17 00:00:00 2001 From: Eric Wang Date: Sun, 18 Nov 2018 14:49:53 +0800 Subject: [PATCH 31/65] refs #121: support customized filename. Signed-off-by: Eric Wang --- lib/commands/show.js | 20 +++++++++----------- lib/commands/submission.js | 16 ++++++++-------- lib/config.js | 4 ++++ lib/file.js | 4 ++++ 4 files changed, 25 insertions(+), 19 deletions(-) diff --git a/lib/commands/show.js b/lib/commands/show.js index 6cc51bed..8d238cea 100644 --- a/lib/commands/show.js +++ b/lib/commands/show.js @@ -76,20 +76,18 @@ const cmd = { function genFileName(problem, opts) { const path = require('path'); const params = [ - problem.fid, - problem.slug, + file.fmt(config.file.show, problem), '', h.langToExt(opts.lang) ]; - // try to use a new filename to avoid overwrite by mistake - let i = 0; - let name; - do { - name = path.join(opts.outdir, params.join('.').replace(/\.+/g, '.')); - params[2] = i++; - } while (fs.existsSync(name)); - return name; + // try new name to avoid overwrite by mistake + for (let i = 0; ; ++i) { + const name = path.join(opts.outdir, params.join('.').replace(/\.+/g, '.')); + if (!fs.existsSync(name)) + return name; + params[2] = i; + } } function showProblem(problem, argv) { @@ -123,8 +121,8 @@ function showProblem(problem, argv) { let filename; if (argv.gen) { - filename = genFileName(problem, argv); file.mkdir(argv.outdir); + filename = genFileName(problem, argv); fs.writeFileSync(filename, code); if (argv.editor !== undefined) { diff --git a/lib/commands/submission.js b/lib/commands/submission.js index c9b07ce3..c90588a8 100644 --- a/lib/commands/submission.js +++ b/lib/commands/submission.js @@ -1,11 +1,13 @@ 'use strict'; var fs = require('fs'); +var path = require('path'); -var sprintf = require('sprintf-js').sprintf; +var _ = require('underscore'); var h = require('../helper'); var file = require('../file'); var chalk = require('../chalk'); +var config = require('../config'); var log = require('../log'); var Queue = require('../queue'); var core = require('../core'); @@ -92,13 +94,11 @@ function exportSubmission(problem, argv, cb) { const submission = submissions.find(x => x.status_display === 'Accepted') || submissions[0]; submission.ac = (submission.status_display === 'Accepted'); - const f = sprintf('%s/%d.%s.%s.%s%s', - argv.outdir, - problem.fid, - problem.slug, - submission.id, - submission.ac ? 'ac' : 'notac', - h.langToExt(submission.lang)); + const data = _.extend({}, submission, problem); + data.sid = submission.id; + data.ac = submission.ac ? 'ac' : 'notac'; + const basename = file.fmt(config.file.submission, data); + const f = path.join(argv.outdir, basename + h.langToExt(submission.lang)); file.mkdir(argv.outdir); // skip the existing cached submissions diff --git a/lib/config.js b/lib/config.js index 21979dee..692b958d 100644 --- a/lib/config.js +++ b/lib/config.js @@ -55,6 +55,10 @@ const DEFAULT_CONFIG = { editor: 'vim', lang: 'cpp' }, + file: { + show: '${fid}.${slug}', + submission: '${fid}.${slug}.${sid}.${ac}' + }, color: { enable: true, theme: 'default' diff --git a/lib/file.js b/lib/file.js index 6d02f878..996ab9e2 100644 --- a/lib/file.js +++ b/lib/file.js @@ -100,6 +100,10 @@ file.render = function(tpl, data) { return result; }; +file.fmt = function(format, data) { + return _.template(format)(data); +}; + file.metaByName = function(filename) { const m = {}; From 6b2d514846138b4deb3b5a19a2e0579422099a13 Mon Sep 17 00:00:00 2001 From: Eric Wang Date: Sun, 18 Nov 2018 15:07:14 +0800 Subject: [PATCH 32/65] [refactor] use file utils. Signed-off-by: Eric Wang --- lib/cache.js | 13 ++++++------- lib/commands/config.js | 2 +- lib/commands/show.js | 5 ++--- lib/commands/submission.js | 5 ++--- lib/commands/submit.js | 3 +-- lib/commands/test.js | 3 +-- lib/file.js | 22 +++++++++++++++++++++- lib/plugin.js | 6 +++--- 8 files changed, 37 insertions(+), 22 deletions(-) diff --git a/lib/cache.js b/lib/cache.js index 4d0470fe..42efad0b 100644 --- a/lib/cache.js +++ b/lib/cache.js @@ -1,5 +1,4 @@ 'use strict'; -var fs = require('fs'); var path = require('path'); var file = require('./file'); @@ -12,22 +11,22 @@ cache.init = function() { cache.get = function(k) { const fullpath = file.cacheFile(k); - if (!fs.existsSync(fullpath)) return null; + if (!file.exist(fullpath)) return null; - return JSON.parse(fs.readFileSync(fullpath)); + return JSON.parse(file.data(fullpath)); }; cache.set = function(k, v) { const fullpath = file.cacheFile(k); - fs.writeFileSync(fullpath, JSON.stringify(v)); + file.write(fullpath, JSON.stringify(v)); return true; }; cache.del = function(k) { const fullpath = file.cacheFile(k); - if (!fs.existsSync(fullpath)) return false; + if (!file.exist(fullpath)) return false; - fs.unlinkSync(fullpath); + file.rm(fullpath); return true; }; @@ -36,7 +35,7 @@ cache.list = function() { .filter(x => path.extname(x) === '.json') .map(function(filename) { const k = path.basename(filename, '.json'); - const stat = fs.statSync(file.cacheFile(k)); + const stat = file.stat(file.cacheFile(k)); return { name: k, size: stat.size, diff --git a/lib/commands/config.js b/lib/commands/config.js index eb8a7b6a..a14fb5b5 100644 --- a/lib/commands/config.js +++ b/lib/commands/config.js @@ -55,7 +55,7 @@ function loadConfig(showall) { } function saveConfig() { - require('fs').writeFileSync(file.configFile(), prettyConfig(loadConfig(false))); + file.write(file.configFile(), prettyConfig(loadConfig(false))); } cmd.handler = function(argv) { diff --git a/lib/commands/show.js b/lib/commands/show.js index 8d238cea..d63a7191 100644 --- a/lib/commands/show.js +++ b/lib/commands/show.js @@ -1,5 +1,4 @@ 'use strict'; -var fs = require('fs'); var util = require('util'); var _ = require('underscore'); @@ -84,7 +83,7 @@ function genFileName(problem, opts) { // try new name to avoid overwrite by mistake for (let i = 0; ; ++i) { const name = path.join(opts.outdir, params.join('.').replace(/\.+/g, '.')); - if (!fs.existsSync(name)) + if (!file.exist(name)) return name; params[2] = i; } @@ -123,7 +122,7 @@ function showProblem(problem, argv) { if (argv.gen) { file.mkdir(argv.outdir); filename = genFileName(problem, argv); - fs.writeFileSync(filename, code); + file.write(filename, code); if (argv.editor !== undefined) { childProcess.spawn(argv.editor || config.code.editor, [filename], { diff --git a/lib/commands/submission.js b/lib/commands/submission.js index c90588a8..4cd0af46 100644 --- a/lib/commands/submission.js +++ b/lib/commands/submission.js @@ -1,5 +1,4 @@ 'use strict'; -var fs = require('fs'); var path = require('path'); var _ = require('underscore'); @@ -102,7 +101,7 @@ function exportSubmission(problem, argv, cb) { file.mkdir(argv.outdir); // skip the existing cached submissions - if (fs.existsSync(f)) + if (file.exist(f)) return cb(null, chalk.underline(f)); core.getSubmission(submission, function(e, submission) { @@ -113,7 +112,7 @@ function exportSubmission(problem, argv, cb) { code: submission.code, tpl: argv.extra ? 'detailed' : 'codeonly' }; - fs.writeFileSync(f, core.exportProblem(problem, opts)); + file.write(f, core.exportProblem(problem, opts)); cb(null, submission.ac ? chalk.green.underline(f) : chalk.yellow.underline(f)); }); diff --git a/lib/commands/submit.js b/lib/commands/submit.js index 2f83d7b0..9bb52cc4 100644 --- a/lib/commands/submit.js +++ b/lib/commands/submit.js @@ -1,5 +1,4 @@ 'use strict'; -var fs = require('fs'); var util = require('util'); var h = require('../helper'); @@ -44,7 +43,7 @@ function printLine() { cmd.handler = function(argv) { session.argv = argv; - if (!fs.existsSync(argv.filename)) + if (!file.exist(argv.filename)) return log.error('File ' + argv.filename + ' not exist!'); const meta = file.meta(argv.filename); diff --git a/lib/commands/test.js b/lib/commands/test.js index 4992a06c..02520508 100644 --- a/lib/commands/test.js +++ b/lib/commands/test.js @@ -1,5 +1,4 @@ 'use strict'; -var fs = require('fs'); var _ = require('underscore'); var h = require('../helper'); @@ -54,7 +53,7 @@ function printResult(actual, expect, k) { } function runTest(argv) { - if (!fs.existsSync(argv.filename)) + if (!file.exist(argv.filename)) return log.error('File ' + argv.filename + ' not exist!'); const meta = file.meta(argv.filename); diff --git a/lib/file.js b/lib/file.js index 996ab9e2..5cda4170 100644 --- a/lib/file.js +++ b/lib/file.js @@ -75,9 +75,29 @@ file.mkdir = function(fullpath) { mkdirp.sync(fullpath); }; +file.exist = function(fullpath) { + return fs.existsSync(fullpath); +}; + +file.rm = function(fullpath) { + return fs.unlinkSync(fullpath); +}; + +file.mv = function(src, dst) { + return fs.renameSync(src, dst); +}; + file.list = function(dir) { return fs.readdirSync(dir); -} +}; + +file.stat = function(fullpath) { + return fs.statSync(fullpath); +}; + +file.write = function(fullpath, data) { + return fs.writeFileSync(fullpath, data); +}; file.name = function(fullpath) { return path.basename(fullpath, path.extname(fullpath)); diff --git a/lib/plugin.js b/lib/plugin.js index be5dfe32..cfd492a7 100644 --- a/lib/plugin.js +++ b/lib/plugin.js @@ -49,7 +49,7 @@ Plugin.prototype.enable = function(enabled) { if (this.enabled === enabled) return; const newfile = enabled ? this.file.substr(1) : '.' + this.file; try { - fs.renameSync(file.pluginFile(this.file), file.pluginFile(newfile)); + file.mv(file.pluginFile(this.file), file.pluginFile(newfile)); } catch(e) { log.error(e.message); } @@ -60,7 +60,7 @@ Plugin.prototype.delete = function() { if (!this.missing) { try { const fullpath = file.pluginFile(this.file); - fs.unlinkSync(fullpath); + file.rm(fullpath); } catch(e) { return log.error(e.message); } @@ -156,7 +156,7 @@ Plugin.copy = function(src, cb) { }); srcstream.on('error', function(e) { spin.stop(); - fs.unlinkSync(dst); + file.rm(dst); return cb(e); }); From 196cf50a9a8e85366ac6c737905dbca6c5f13da8 Mon Sep 17 00:00:00 2001 From: Eric Wang Date: Sun, 18 Nov 2018 17:03:14 +0800 Subject: [PATCH 33/65] fixes typo in filename. Signed-off-by: Eric Wang --- lib/commands/show.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/commands/show.js b/lib/commands/show.js index d63a7191..319d5d53 100644 --- a/lib/commands/show.js +++ b/lib/commands/show.js @@ -85,7 +85,7 @@ function genFileName(problem, opts) { const name = path.join(opts.outdir, params.join('.').replace(/\.+/g, '.')); if (!file.exist(name)) return name; - params[2] = i; + params[1] = i; } } From 10e80189a354e1b32559528aa3d15932a6837471 Mon Sep 17 00:00:00 2001 From: Eric Wang Date: Sun, 18 Nov 2018 17:58:25 +0800 Subject: [PATCH 34/65] [pkg] add pkg config. Signed-off-by: Eric Wang --- .dockerignore | 4 ++++ package.json | 18 +++++++++++++++++- 2 files changed, 21 insertions(+), 1 deletion(-) diff --git a/.dockerignore b/.dockerignore index ed775dc7..c34cc8cd 100644 --- a/.dockerignore +++ b/.dockerignore @@ -1,10 +1,14 @@ .git +.github .npm .nyc_output .DS_Store + coverage +dist node_modules npm-debug.log* tmp + *.log *.swp diff --git a/package.json b/package.json index 28bdfef8..943fab87 100644 --- a/package.json +++ b/package.json @@ -11,7 +11,23 @@ }, "scripts": { "lint": "eslint lib/ test/", - "test": "npm run lint && nyc mocha test/** && nyc report --reporter=lcov" + "test": "npm run lint && nyc mocha test/** && nyc report --reporter=lcov", + "pkg": "pkg . --out-path=dist/" + }, + "pkg": { + "scripts": [ + "lib" + ], + "assets": [ + "colors", + "icons", + "templates" + ], + "targets": [ + "node10-linux-x64", + "node10-macos-x64", + "node10-win-x64" + ] }, "repository": { "type": "git", From a37018de6de704e098fc91de5c8426a8cd09d1c3 Mon Sep 17 00:00:00 2001 From: Eric Wang Date: Sun, 18 Nov 2018 19:22:19 +0800 Subject: [PATCH 35/65] [plugin] enable/disable wont touch plugins js. Signed-off-by: Eric Wang --- .gitignore | 1 + lib/commands/plugin.js | 6 ++--- lib/plugin.js | 55 ++++++++++++++++++------------------------ test/test_plugin.js | 46 +++++++++-------------------------- 4 files changed, 39 insertions(+), 69 deletions(-) diff --git a/.gitignore b/.gitignore index a833ee3d..c08d1d39 100644 --- a/.gitignore +++ b/.gitignore @@ -36,6 +36,7 @@ jspm_packages # Optional REPL history .node_repl_history +dist/ tmp/ *.swp .DS_Store diff --git a/lib/commands/plugin.js b/lib/commands/plugin.js index 6a5b9721..41d7aef4 100644 --- a/lib/commands/plugin.js +++ b/lib/commands/plugin.js @@ -70,7 +70,6 @@ function print(plugins) { log.printf(' %s %-18s %-15s %s', h.prettyText('', p.enabled && !p.missing), p.name, p.ver, p.desc); - Plugin.save(); } cmd.handler = function(argv) { @@ -83,6 +82,7 @@ cmd.handler = function(argv) { const cb = function(e) { if (e) return log.error(e); Plugin.init(); + Plugin.save(); print(); }; @@ -102,11 +102,11 @@ cmd.handler = function(argv) { return log.error('Plugin missing, install it first'); if (argv.enable) { - p.enable(true); + p.enabled = true; p.save(); print(); } else if (argv.disable) { - p.enable(false); + p.enabled = false; p.save(); print(); } else if (argv.delete) { diff --git a/lib/plugin.js b/lib/plugin.js index cfd492a7..fedf1081 100644 --- a/lib/plugin.js +++ b/lib/plugin.js @@ -40,22 +40,6 @@ Plugin.prototype.setNext = function(next) { this.next = next; }; -Plugin.prototype.setFile = function(f) { - this.file = f; - this.enabled = (this.file[0] !== '.'); -}; - -Plugin.prototype.enable = function(enabled) { - if (this.enabled === enabled) return; - const newfile = enabled ? this.file.substr(1) : '.' + this.file; - try { - file.mv(file.pluginFile(this.file), file.pluginFile(newfile)); - } catch(e) { - log.error(e.message); - } - this.setFile(newfile); -}; - Plugin.prototype.delete = function() { if (!this.missing) { try { @@ -69,13 +53,13 @@ Plugin.prototype.delete = function() { }; Plugin.prototype.save = function() { - const data = cache.get(h.KEYS.plugins) || {}; + const stats = cache.get(h.KEYS.plugins) || {}; - if (this.deleted) delete data[this.name]; + if (this.deleted) delete stats[this.name]; else if (this.missing) return; - else data[this.name] = this.enabled; + else stats[this.name] = this.enabled; - cache.set(h.KEYS.plugins, data); + cache.set(h.KEYS.plugins, stats); }; Plugin.prototype.install = function(cb) { @@ -84,9 +68,9 @@ Plugin.prototype.install = function(cb) { const cmd = 'npm install --save ' + this.deps.join(' '); log.debug(cmd); const spin = h.spin(cmd); - cp.exec(cmd, {cwd: file.codeDir()}, function() { + cp.exec(cmd, {cwd: file.codeDir()}, function(e) { spin.stop(); - return cb(); + return cb(e); }); }; @@ -98,14 +82,23 @@ Plugin.init = function(head) { log.trace('initializing all plugins'); head = head || require('./core'); + const stats = cache.get(h.KEYS.plugins) || {}; + // 1. check installed plugins let plugins = []; for (let f of file.listCodeDir('lib/plugins')) { const p = f.data; if (!p) continue; - - p.setFile(f.file); log.trace('found plugin: ' + p.name + '=' + p.ver); + + p.file = f.file; + p.enabled = stats[p.name]; + // not saved before? enable it by default + if (!(p.name in stats)) { + log.trace('new plugin, enable by default'); + p.enabled = true; + } + if (p.enabled) { p.init(); log.trace('inited plugin: ' + p.name); @@ -129,11 +122,10 @@ Plugin.init = function(head) { // 2. check saved plugins const missings = []; - const data = cache.get(h.KEYS.plugins) || {}; - for (let k of _.keys(data)) { + for (let k of _.keys(stats)) { if (plugins.find(x => x.name === k)) continue; const p = new Plugin(-1, k, 'missing'); - p.enabled = data[k]; + p.enabled = stats[k]; missings.push(p); } log.trace('missing plugins: ' + missings.length); @@ -177,6 +169,7 @@ Plugin.install = function(name, cb) { log.debug('copied to ' + fullpath); const p = require(fullpath); + p.file = path.basename(fullpath); p.install(function() { return cb(null, p); }); @@ -187,7 +180,7 @@ Plugin.installMissings = function(cb) { function doTask(plugin, queue, cb) { Plugin.install(plugin.name, function(e, p) { if (!e) { - p.enable(plugin.enabled); + p.enabled = plugin.enabled; p.save(); p.help(); } @@ -195,11 +188,11 @@ Plugin.installMissings = function(cb) { }); } - const plugins = Plugin.plugins.filter(x => x.missing); - if (plugins.length === 0) return cb(); + const missings = Plugin.plugins.filter(x => x.missing); + if (missings.length === 0) return cb(); log.warn('Installing missing plugins, might take a while ...'); - const q = new Queue(plugins, {}, doTask); + const q = new Queue(missings, {}, doTask); q.run(1, cb); }; diff --git a/test/test_plugin.js b/test/test_plugin.js index a6cdf156..19d2cdc1 100644 --- a/test/test_plugin.js +++ b/test/test_plugin.js @@ -35,17 +35,17 @@ describe('plugin', function() { }); describe('#Plugin.init', function() { - const p1 = new Plugin(0, 'Leetcode', '2.0'); - const p2 = new Plugin(1, 'Cache', '1.0'); - const p3 = new Plugin(2, 'Retry', '3.0'); - const p4 = new Plugin(3, 'Core', '4.0'); + const p1 = new Plugin(0, 'leetcode', '2.0'); + const p2 = new Plugin(1, 'cache', '1.0'); + const p3 = new Plugin(2, 'retry', '3.0'); + const p4 = new Plugin(3, 'core', '4.0'); before(function() { p1.init = p2.init = p3.init = p4.init = NOOP; file.listCodeDir = function() { return [ {name: 'cache', data: p2, file: 'cache.js'}, - {name: 'leetcode', data: p1, file: '.leetcode.js'}, // disabled + {name: 'leetcode', data: p1, file: 'leetcode.js'}, {name: 'retry', data: p3, file: 'retry.js'}, {name: 'bad', data: null} ]; @@ -53,6 +53,9 @@ describe('plugin', function() { }); it('should init ok', function() { + cache.get = () => { + return {cache: true, leetcode: false, retry: true}; + }; assert.deepEqual(Plugin.plugins, []); const res = Plugin.init(p4); @@ -60,7 +63,7 @@ describe('plugin', function() { assert.deepEqual(Plugin.plugins.length, 3); const names = Plugin.plugins.map(p => p.name); - assert.deepEqual(names, ['Retry', 'Cache', 'Leetcode']); + assert.deepEqual(names, ['retry', 'cache', 'leetcode']); assert.equal(p4.next, p3); assert.equal(p3.next, p2); @@ -70,7 +73,7 @@ describe('plugin', function() { it('should find missing ok', function() { cache.get = () => { - return {company: true, solution: true}; + return {company: true, leetcode: false, solution: true}; }; const res = Plugin.init(p4); @@ -78,7 +81,7 @@ describe('plugin', function() { assert.deepEqual(Plugin.plugins.length, 5); const names = Plugin.plugins.map(p => p.name); - assert.deepEqual(names, ['Retry', 'Cache', 'Leetcode', 'company', 'solution']); + assert.deepEqual(names, ['retry', 'cache', 'leetcode', 'company', 'solution']); assert.equal(p4.next, p3); assert.equal(p3.next, p2); @@ -179,33 +182,6 @@ describe('plugin', function() { }); }); // #Plugin.installMissings - describe('#enable', function() { - const FILE = path.resolve(th.DIR, 'leetcode.js'); - - before(function() { - file.pluginFile = () => FILE; - }); - - it('should ok', function() { - const p = new Plugin(0, 'Leetcode', '2.0', ''); - assert.equal(p.enabled, true); - - p.setFile('.leetcode.js'); - fs.writeFileSync(FILE, ''); - assert.equal(p.enabled, false); - assert.equal(p.file, '.leetcode.js'); - p.enable(false); - assert.equal(p.enabled, false); - assert.equal(p.file, '.leetcode.js'); - p.enable(true); - assert.equal(p.enabled, true); - assert.equal(p.file, 'leetcode.js'); - p.enable(false); - assert.equal(p.enabled, false); - assert.equal(p.file, '.leetcode.js'); - }); - }); // #enable - describe('#delete', function() { it('should ok', function() { file.pluginFile = x => th.DIR + x; From 73bf1a9494fc5a41e3a5bc7a83be4f41589b992a Mon Sep 17 00:00:00 2001 From: Eric Wang Date: Sun, 18 Nov 2018 23:39:55 +0800 Subject: [PATCH 36/65] fixes plugin init order issue. Signed-off-by: Eric Wang --- lib/commands/plugin.js | 5 +++-- lib/plugin.js | 28 +++++++++++++++------------- 2 files changed, 18 insertions(+), 15 deletions(-) diff --git a/lib/commands/plugin.js b/lib/commands/plugin.js index 41d7aef4..f9905780 100644 --- a/lib/commands/plugin.js +++ b/lib/commands/plugin.js @@ -79,10 +79,11 @@ cmd.handler = function(argv) { const name = argv.name; if (argv.install) { - const cb = function(e) { + const cb = function(e, p) { if (e) return log.error(e); + p.help(); + p.save(); Plugin.init(); - Plugin.save(); print(); }; diff --git a/lib/plugin.js b/lib/plugin.js index fedf1081..25665332 100644 --- a/lib/plugin.js +++ b/lib/plugin.js @@ -84,8 +84,8 @@ Plugin.init = function(head) { const stats = cache.get(h.KEYS.plugins) || {}; - // 1. check installed plugins - let plugins = []; + // 1. find installed plugins + let installed = []; for (let f of file.listCodeDir('lib/plugins')) { const p = f.data; if (!p) continue; @@ -98,39 +98,41 @@ Plugin.init = function(head) { log.trace('new plugin, enable by default'); p.enabled = true; } + installed.push(p); + } + // the one with bigger `id` comes first + installed = _.sortBy(installed, x => -x.id); + // 2. init all in reversed order + for (let i = installed.length - 1; i >= 0; --i) { + const p = installed[i]; if (p.enabled) { p.init(); log.trace('inited plugin: ' + p.name); } else { log.trace('skipped plugin: ' + p.name); } - - plugins.push(p); } - // chain the plugins together - // the one has bigger `id` comes first - plugins = _.sortBy(plugins, x => -x.id); - + // 3. chain together + const plugins = installed.filter(x => x.enabled); let last = head; for (let p of plugins) { - if (!p.enabled) continue; last.setNext(p); last = p; } - // 2. check saved plugins + // 4. check missing plugins const missings = []; for (let k of _.keys(stats)) { - if (plugins.find(x => x.name === k)) continue; + if (installed.find(x => x.name === k)) continue; const p = new Plugin(-1, k, 'missing'); p.enabled = stats[k]; missings.push(p); + log.trace('missing plugin:' + p.name); } - log.trace('missing plugins: ' + missings.length); - Plugin.plugins = plugins.concat(missings); + Plugin.plugins = installed.concat(missings); return missings.length === 0; }; From 465b3c37c9f7adf7cb4f4cb3cf2dfa9e1b7f2b0f Mon Sep 17 00:00:00 2001 From: Eric Wang Date: Mon, 19 Nov 2018 00:11:53 +0800 Subject: [PATCH 37/65] [plugin] always enable builtin plugin by default. Signed-off-by: Eric Wang --- lib/plugin.js | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/lib/plugin.js b/lib/plugin.js index 25665332..90d48489 100644 --- a/lib/plugin.js +++ b/lib/plugin.js @@ -21,7 +21,8 @@ function Plugin(id, name, ver, desc, deps) { this.enabled = true; this.deleted = false; - this.missing = (ver === 'missing'); + this.missing = (this.ver === 'missing'); + this.builtin = (this.ver === 'default'); // only need deps for current platform this.deps = _.chain(deps || []) @@ -93,10 +94,15 @@ Plugin.init = function(head) { p.file = f.file; p.enabled = stats[p.name]; - // not saved before? enable it by default + if (!(p.name in stats)) { - log.trace('new plugin, enable by default'); - p.enabled = true; + if (p.builtin) { + log.trace('new builtin plugin, enable by default'); + p.enabled = true; + } else { + log.trace('new 3rd party plugin, disable by default'); + p.enabled = false; + } } installed.push(p); } From 98d9a2fb71bc88aae4147120fcaaf534b9aea3c9 Mon Sep 17 00:00:00 2001 From: Eric Wang Date: Mon, 19 Nov 2018 12:29:54 +0800 Subject: [PATCH 38/65] [pkg] add script for linux/macos * refs #133 Signed-off-by: Eric Wang --- bin/pkg | 25 +++++++++++++++++++++++++ package.json | 2 +- 2 files changed, 26 insertions(+), 1 deletion(-) create mode 100755 bin/pkg diff --git a/bin/pkg b/bin/pkg new file mode 100755 index 00000000..c61c1d2a --- /dev/null +++ b/bin/pkg @@ -0,0 +1,25 @@ +#!/bin/bash + +plugins="company cookie.chrome cookie.firefox cpp.lint cpp.run github leetcode.cn lintcode solution.discuss" + +for plugin in $plugins; do + echo "[$plugin]" + ./bin/leetcode ext -i $plugin +done + +ver=`node -v | sed 's/^v//' | awk -F. '{print $1}'` +case `uname` in + Linux) os=linux ;; + Darwin) os=macos ;; + *) echo "OS not supported!" && exit 1 +esac +case `uname -m` in + x86_64) arch=x64 ;; + i?86) arch=x32 ;; + *) echo "Arch not supported!" && exit 1 +esac + +rm -rf dist/* +find node_modules -name "*.node" -exec cp {} dist/ \; +npm run pkg -- node$ver-$os-$arch +tar zcvf leetcode-cli.$os.tar.gz dist/ diff --git a/package.json b/package.json index 943fab87..cff45fda 100644 --- a/package.json +++ b/package.json @@ -12,7 +12,7 @@ "scripts": { "lint": "eslint lib/ test/", "test": "npm run lint && nyc mocha test/** && nyc report --reporter=lcov", - "pkg": "pkg . --out-path=dist/" + "pkg": "pkg . --out-path=dist/ --targets" }, "pkg": { "scripts": [ From 863157a03f64e48fc7a885110d2090dc309acafa Mon Sep 17 00:00:00 2001 From: Eric Wang Date: Mon, 19 Nov 2018 21:31:36 +0800 Subject: [PATCH 39/65] fixes format in `list` Signed-off-by: Eric Wang --- bin/pkg | 1 + icons/ascii.json | 1 + icons/default.json | 1 + icons/win7.json | 1 + lib/commands/list.js | 4 ++-- lib/commands/submission.js | 2 +- 6 files changed, 7 insertions(+), 3 deletions(-) diff --git a/bin/pkg b/bin/pkg index c61c1d2a..790a8a91 100755 --- a/bin/pkg +++ b/bin/pkg @@ -19,6 +19,7 @@ case `uname -m` in *) echo "Arch not supported!" && exit 1 esac +mkdir -p dist/ rm -rf dist/* find node_modules -name "*.node" -exec cp {} dist/ \; npm run pkg -- node$ver-$os-$arch diff --git a/icons/ascii.json b/icons/ascii.json index 6660733f..1a7664f1 100644 --- a/icons/ascii.json +++ b/icons/ascii.json @@ -4,6 +4,7 @@ "like": "*", "unlike": " ", "lock": "$", + "nolock": " ", "empty": " ", "ac": "O", "notac": "X", diff --git a/icons/default.json b/icons/default.json index 42bdbecd..a5263a7f 100644 --- a/icons/default.json +++ b/icons/default.json @@ -4,6 +4,7 @@ "like": "★", "unlike": "☆", "lock": "🔒", + "nolock": " ", "empty": " ", "ac": "▣", "notac": "▤", diff --git a/icons/win7.json b/icons/win7.json index 7f032a83..0e79a481 100644 --- a/icons/win7.json +++ b/icons/win7.json @@ -4,6 +4,7 @@ "like": "♥", "unlike": " ", "lock": "$", + "nolock": " ", "empty": " ", "ac": "O", "notac": "X", diff --git a/lib/commands/list.js b/lib/commands/list.js index f3e69143..67427f89 100644 --- a/lib/commands/list.js +++ b/lib/commands/list.js @@ -67,9 +67,9 @@ cmd.handler = function(argv) { if (problem.locked) ++stat.locked; if (problem.starred) ++stat.starred; - log.printf('%s %s %s [%3d] %-60s %-6s (%.2f %%)', + log.printf('%s %s %s [%4d] %-60s %-6s (%.2f %%)', (problem.starred ? chalk.yellow(icon.like) : icon.empty), - (problem.locked ? chalk.red(icon.lock) : icon.empty), + (problem.locked ? chalk.red(icon.lock) : icon.nolock), h.prettyState(problem.state), problem.fid, problem.name, diff --git a/lib/commands/submission.js b/lib/commands/submission.js index 4cd0af46..6c9c6909 100644 --- a/lib/commands/submission.js +++ b/lib/commands/submission.js @@ -62,7 +62,7 @@ function doTask(problem, queue, cb) { // - green: accepted, fresh download // - yellow: not ac-ed, fresh download // - white: existed already, skip download - log.printf('[%3d] %-60s %s', problem.fid, problem.name, + log.printf('[%4d] %-60s %s', problem.fid, problem.name, (e ? chalk.red('ERROR: ' + (e.msg || e)) : msg)); if (cb) cb(e); } From e3f108b5197ed9f46682a698381a06215a852857 Mon Sep 17 00:00:00 2001 From: Eric Wang Date: Sat, 24 Nov 2018 00:34:17 +0800 Subject: [PATCH 40/65] fixes UT issues on windows. Signed-off-by: Eric Wang --- lib/core.js | 2 +- lib/file.js | 2 +- lib/plugin.js | 15 ++++++++----- package.json | 2 +- test/helper.js | 9 ++++++-- test/test_core.js | 6 ++++++ test/test_file.js | 51 ++++++++++++++++++++++++++++++++++++++++++++- test/test_icon.js | 4 +++- test/test_plugin.js | 4 ++-- 9 files changed, 81 insertions(+), 14 deletions(-) diff --git a/lib/core.js b/lib/core.js index e4d4b645..74362f78 100644 --- a/lib/core.js +++ b/lib/core.js @@ -109,7 +109,7 @@ core.exportProblem = function(problem, opts) { const data = _.extend({}, problem); // unify format before rendering - data.app = require('./config').app; + data.app = require('./config').app || 'leetcode'; if (!data.fid) data.fid = data.id; if (!data.lang) data.lang = opts.lang; data.code = (opts.code || data.code || '').replace(/\r\n/g, '\n'); diff --git a/lib/file.js b/lib/file.js index 5cda4170..493e9ebd 100644 --- a/lib/file.js +++ b/lib/file.js @@ -110,7 +110,7 @@ file.data = function(fullpath) { /// templates & metadata /// file.render = function(tpl, data) { const tplfile = path.join(this.codeDir('templates'), tpl + '.tpl'); - let result = _.template(this.data(tplfile))(data); + let result = _.template(this.data(tplfile).replace(/\r\n/g, '\n'))(data); if (this.isWindows()) { result = result.replace(/\n/g, '\r\n'); diff --git a/lib/plugin.js b/lib/plugin.js index 90d48489..bbd6da44 100644 --- a/lib/plugin.js +++ b/lib/plugin.js @@ -150,20 +150,25 @@ Plugin.copy = function(src, cb) { const dst = file.pluginFile(src); const srcstream = src.startsWith('https://') ? request(src) : fs.createReadStream(src); + const dststream = fs.createWriteStream(dst); + let error; + srcstream.on('response', function(resp) { if (resp.statusCode !== 200) srcstream.emit('error', 'HTTP Error: ' + resp.statusCode); }); srcstream.on('error', function(e) { - spin.stop(); - file.rm(dst); - return cb(e); + dststream.emit('error', e); }); - const dststream = fs.createWriteStream(dst); + dststream.on('error', function(e) { + error = e; + dststream.end(); + }); dststream.on('close', function() { spin.stop(); - return cb(null, dst); + if (error) file.rm(dst); + return cb(error, dst); }); log.debug('copying from ' + src); diff --git a/package.json b/package.json index cff45fda..864d7edc 100644 --- a/package.json +++ b/package.json @@ -11,7 +11,7 @@ }, "scripts": { "lint": "eslint lib/ test/", - "test": "npm run lint && nyc mocha test/** && nyc report --reporter=lcov", + "test": "npm run lint && nyc mocha test test/plugins && nyc report --reporter=lcov", "pkg": "pkg . --out-path=dist/ --targets" }, "pkg": { diff --git a/test/helper.js b/test/helper.js index 56ee5363..ca0f532e 100644 --- a/test/helper.js +++ b/test/helper.js @@ -8,8 +8,13 @@ const h = { h.clean = function() { if (!fs.existsSync(this.DIR)) fs.mkdirSync(this.DIR); - for (let f of fs.readdirSync(this.DIR)) - fs.unlinkSync(this.DIR + f); + for (let f of fs.readdirSync(this.DIR)) { + const fullpath = this.DIR + f; + if (fs.statSync(fullpath).isDirectory()) + fs.rmdirSync(fullpath); + else + fs.unlinkSync(fullpath); + } }; module.exports = h; diff --git a/test/test_core.js b/test/test_core.js index 1c8b4c5f..0a436bb4 100644 --- a/test/test_core.js +++ b/test/test_core.js @@ -151,6 +151,8 @@ describe('core', function() { }); it('should codeonly ok', function() { + file.isWindows = () => false; + const expected = [ '/**', ' * Definition for singly-linked list.', @@ -209,6 +211,8 @@ describe('core', function() { }); it('should detailed ok with cpp', function() { + file.isWindows = () => false; + const expected = [ '/*', ' * @lc app=leetcode id=2 lang=cpp', @@ -257,6 +261,8 @@ describe('core', function() { }); it('should detailed ok with ruby', function() { + file.isWindows = () => false; + const expected = [ '#', '# @lc app=leetcode id=2 lang=ruby', diff --git a/test/test_file.js b/test/test_file.js index 481fa9d3..16d04ba3 100644 --- a/test/test_file.js +++ b/test/test_file.js @@ -1,9 +1,12 @@ 'use strict'; +const fs = require('fs'); const path = require('path'); const assert = require('chai').assert; const rewire = require('rewire'); +const th = require('./helper'); + describe('file', function() { let file; @@ -14,7 +17,8 @@ describe('file', function() { describe('#dirAndFiles', function() { const HOME = path.join(__dirname, '..'); - it('should ok', function() { + it('should ok on linux', function() { + if (file.isWindows()) this.skip(); process.env.HOME = '/home/skygragon'; assert.equal(file.userHomeDir(), '/home/skygragon'); @@ -23,10 +27,18 @@ describe('file', function() { assert.equal(file.cacheFile('xxx'), '/home/skygragon/.lc/leetcode/cache/xxx.json'); assert.equal(file.configFile(), '/home/skygragon/.lc/config.json'); assert.equal(file.name('/home/skygragon/.lc/leetcode/cache/xxx.json'), 'xxx'); + }); + it('should ok on windows', function() { + if (!file.isWindows()) this.skip(); process.env.HOME = ''; process.env.USERPROFILE = 'C:\\Users\\skygragon'; assert.equal(file.userHomeDir(), 'C:\\Users\\skygragon'); + assert.equal(file.homeDir(), 'C:\\Users\\skygragon\\.lc'); + assert.equal(file.cacheDir(), 'C:\\Users\\skygragon\\.lc\\leetcode\\cache'); + assert.equal(file.cacheFile('xxx'), 'C:\\Users\\skygragon\\.lc\\leetcode\\cache\\xxx.json'); + assert.equal(file.configFile(), 'C:\\Users\\skygragon\\.lc\\config.json'); + assert.equal(file.name('C:\\Users\\skygragon\\.lc\\leetcode\\cache\\xxx.json'), 'xxx'); }); it('should codeDir ok', function() { @@ -98,5 +110,42 @@ describe('file', function() { assert.equal(meta.id, '222'); assert.equal(meta.lang, 'python3'); }); + + it('should fmt ok', function() { + file.init(); + const data = file.fmt('${id}', {id: 123}); + assert.equal(data, '123'); + }); }); // #meta + + describe('#genneral', function() { + beforeEach(function() { + th.clean(); + }); + afterEach(function() { + th.clean(); + }); + + it('should mkdir ok', function() { + const dir = th.DIR + 'dir'; + assert.equal(fs.existsSync(dir), false); + file.mkdir(dir); + assert.equal(fs.existsSync(dir), true); + file.mkdir(dir); + assert.equal(fs.existsSync(dir), true); + }); + + it('should mv ok', function() { + const SRC = th.Dir + 'src'; + const DST = th.DIR + 'dst'; + assert.equal(fs.existsSync(SRC), false); + assert.equal(fs.existsSync(DST), false); + file.mkdir(SRC); + assert.equal(fs.existsSync(SRC), true); + assert.equal(fs.existsSync(DST), false); + file.mv(SRC, DST); + assert.equal(fs.existsSync(SRC), false); + assert.equal(fs.existsSync(DST), true); + }); + }); // #general }); diff --git a/test/test_icon.js b/test/test_icon.js index 559eeb51..5da832ab 100644 --- a/test/test_icon.js +++ b/test/test_icon.js @@ -30,7 +30,9 @@ describe('icon', function() { assert.equal(icon.unlike, 'unlike'); }); - it('should ok with unknown theme', function() { + it('should ok with unknown theme on linux', function() { + file.isWindows = () => false; + icon.setTheme('non-exist'); assert.equal(icon.yes, '✔'); assert.equal(icon.no, '✘'); diff --git a/test/test_plugin.js b/test/test_plugin.js index 19d2cdc1..aa3a40be 100644 --- a/test/test_plugin.js +++ b/test/test_plugin.js @@ -146,9 +146,9 @@ describe('plugin', function() { ]; fs.writeFileSync(SRC, data.join('\n')); - Plugin.install(SRC, function(e, p) { + Plugin.copy(SRC, function(e, fullpath) { assert.notExists(e); - assert.equal(p.x, 123); + assert.equal(fullpath, DST); assert.equal(fs.existsSync(DST), true); done(); }); From c957d787035e587590c8f5d6c8a23f43d7309bd1 Mon Sep 17 00:00:00 2001 From: Eric Wang Date: Tue, 20 Nov 2018 22:44:28 +0800 Subject: [PATCH 41/65] [travis] enable more platforms Signed-off-by: Eric Wang --- .travis.yml | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index e9f9d47a..40ece843 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,5 +1,11 @@ language: node_js node_js: - - stable + - "node" +os: + - linux + - osx + - windows install: - npm install +script: + - npm test From a3b384f34ae3dde018af69262a18c92119f3eb6f Mon Sep 17 00:00:00 2001 From: Eric Wang Date: Sat, 24 Nov 2018 11:10:43 +0800 Subject: [PATCH 42/65] [pkg] refactor script for linux Signed-off-by: Eric Wang --- bin/pkg | 37 +++++++++++++++---------------------- bin/pkg.sh | 23 +++++++++++++++++++++++ package.json | 1 + 3 files changed, 39 insertions(+), 22 deletions(-) create mode 100755 bin/pkg.sh diff --git a/bin/pkg b/bin/pkg index 790a8a91..33af5e64 100755 --- a/bin/pkg +++ b/bin/pkg @@ -1,26 +1,19 @@ -#!/bin/bash +#!/usr/bin/env node -plugins="company cookie.chrome cookie.firefox cpp.lint cpp.run github leetcode.cn lintcode solution.discuss" +const arch = require('os').arch(); +var os = process.platform; +const ver = process.versions.node.split('.')[0]; -for plugin in $plugins; do - echo "[$plugin]" - ./bin/leetcode ext -i $plugin -done +var bin = './bin/pkg.sh'; +var args = [arch, os, ver]; -ver=`node -v | sed 's/^v//' | awk -F. '{print $1}'` -case `uname` in - Linux) os=linux ;; - Darwin) os=macos ;; - *) echo "OS not supported!" && exit 1 -esac -case `uname -m` in - x86_64) arch=x64 ;; - i?86) arch=x32 ;; - *) echo "Arch not supported!" && exit 1 -esac +if (os === 'darwin') { + args[1] = 'macos'; +} else if (os === 'win32') { + bin = 'cmd.exe'; + args = ['/c', 'pkg.bat'].concat(args); +} -mkdir -p dist/ -rm -rf dist/* -find node_modules -name "*.node" -exec cp {} dist/ \; -npm run pkg -- node$ver-$os-$arch -tar zcvf leetcode-cli.$os.tar.gz dist/ +var proc = require('child_process').spawn(bin, args); +proc.stdout.on('data', x => console.log(x.toString().trimRight('\n'))); +proc.stderr.on('data', x => console.log(x.toString().trimRight('\n'))); diff --git a/bin/pkg.sh b/bin/pkg.sh new file mode 100755 index 00000000..d747804c --- /dev/null +++ b/bin/pkg.sh @@ -0,0 +1,23 @@ +#!/bin/bash + +arch=$1 +os=$2 +ver=$3 + +plugins="company cookie.chrome cookie.firefox cpp.lint cpp.run github leetcode.cn lintcode solution.discuss" + +for plugin in $plugins; do + echo "[$plugin]" + #./bin/leetcode ext -i $plugin +done + +DIST=./dist +mkdir -p $DIST +rm -rf $DIST/* + +find node_modules -name "*.node" -exec cp {} $DIST \; +npm run pkg -- node$ver-$os-$arch + +FILE=leetcode-cli.node$ver.$os.$arch.tar.gz +tar zcvf $FILE $DIST +ls -al $FILE diff --git a/package.json b/package.json index 864d7edc..b65b1e44 100644 --- a/package.json +++ b/package.json @@ -71,6 +71,7 @@ "mocha": "5.2.0", "nock": "10.0.2", "nyc": "13.1.0", + "pkg": "^4.3.4", "rewire": "4.0.1" } } From fc4f4acededff5831a84a6316417b1cd4359e2a4 Mon Sep 17 00:00:00 2001 From: Eric Wang Date: Sat, 24 Nov 2018 12:24:10 +0800 Subject: [PATCH 43/65] [pkg] add script for windows Signed-off-by: Eric Wang --- bin/pkg | 2 +- bin/pkg.bat | 19 +++++++++++++++++++ bin/pkg.sh | 4 ++-- 3 files changed, 22 insertions(+), 3 deletions(-) create mode 100644 bin/pkg.bat diff --git a/bin/pkg b/bin/pkg index 33af5e64..548a8be7 100755 --- a/bin/pkg +++ b/bin/pkg @@ -11,7 +11,7 @@ if (os === 'darwin') { args[1] = 'macos'; } else if (os === 'win32') { bin = 'cmd.exe'; - args = ['/c', 'pkg.bat'].concat(args); + args = ['/c', 'bin\\pkg.bat'].concat(args); } var proc = require('child_process').spawn(bin, args); diff --git a/bin/pkg.bat b/bin/pkg.bat new file mode 100644 index 00000000..12d2f200 --- /dev/null +++ b/bin/pkg.bat @@ -0,0 +1,19 @@ +@echo off +set arch=%1 +set os=%2 +set ver=%3 + +for %%x in (company cookie.chrome cookie.firefox cpp.lint cpp.run github leetcode.cn lintcode solution.discuss) do ( + echo [%%x] + node bin\leetcode ext -i %%x +) + +set dist=dist\ +mkdir %dist% +del /q %dist%\* + +for /r . %%x in (*.node) do copy %%x %dist% +npm run pkg -- node%ver%-%os%-%arch% + +set file=leetcode-cli.node%ver%.%os%.%arch%.zip +7z a %file% %dist% \ No newline at end of file diff --git a/bin/pkg.sh b/bin/pkg.sh index d747804c..eaf0ac71 100755 --- a/bin/pkg.sh +++ b/bin/pkg.sh @@ -1,4 +1,4 @@ -#!/bin/bash +#!/bin/bash -e arch=$1 os=$2 @@ -8,7 +8,7 @@ plugins="company cookie.chrome cookie.firefox cpp.lint cpp.run github leetcode.c for plugin in $plugins; do echo "[$plugin]" - #./bin/leetcode ext -i $plugin + ./bin/leetcode ext -i $plugin done DIST=./dist From 450f85a51ac3ec870acb9dd9d8f5b3868ae3d368 Mon Sep 17 00:00:00 2001 From: Eric Wang Date: Sat, 24 Nov 2018 12:45:00 +0800 Subject: [PATCH 44/65] exit with error code if necessary Signed-off-by: Eric Wang --- lib/cli.js | 2 +- lib/commands/config.js | 4 ++-- lib/commands/plugin.js | 6 +++--- lib/commands/submit.js | 2 +- lib/commands/test.js | 2 +- lib/log.js | 11 ++++++++++- test/test_log.js | 4 ++-- 7 files changed, 20 insertions(+), 11 deletions(-) diff --git a/lib/cli.js b/lib/cli.js index e267deda..e59cf7f5 100644 --- a/lib/cli.js +++ b/lib/cli.js @@ -98,7 +98,7 @@ cli.run = function() { initLogLevel(); initDir() initPlugins(function(e) { - if (e) return log.error(e); + if (e) return log.fatal(e); cache.init(); runCommand(); }); diff --git a/lib/commands/config.js b/lib/commands/config.js index a14fb5b5..6a1fe364 100644 --- a/lib/commands/config.js +++ b/lib/commands/config.js @@ -75,14 +75,14 @@ cmd.handler = function(argv) { // delete if (argv.delete) { - if (v === undefined) return log.error('Key not found: ' + argv.key); + if (v === undefined) return log.fatal('Key not found: ' + argv.key); nconf.clear(argv.key); return saveConfig(); } // show if (argv.value.length === 0) { - if (v === undefined) return log.error('Key not found: ' + argv.key); + if (v === undefined) return log.fatal('Key not found: ' + argv.key); return log.info(prettyConfig(v)); } diff --git a/lib/commands/plugin.js b/lib/commands/plugin.js index f9905780..623fd513 100644 --- a/lib/commands/plugin.js +++ b/lib/commands/plugin.js @@ -80,7 +80,7 @@ cmd.handler = function(argv) { if (argv.install) { const cb = function(e, p) { - if (e) return log.error(e); + if (e) return log.fatal(e); p.help(); p.save(); Plugin.init(); @@ -96,11 +96,11 @@ cmd.handler = function(argv) { } if (name) plugins = plugins.filter(x => x.name === name); - if (plugins.length === 0) return log.error('Plugin not found!'); + if (plugins.length === 0) return log.fatal('Plugin not found!'); const p = plugins[0]; if (p.missing && (argv.enable || argv.disable)) - return log.error('Plugin missing, install it first'); + return log.fatal('Plugin missing, install it first'); if (argv.enable) { p.enabled = true; diff --git a/lib/commands/submit.js b/lib/commands/submit.js index 9bb52cc4..7376598b 100644 --- a/lib/commands/submit.js +++ b/lib/commands/submit.js @@ -44,7 +44,7 @@ function printLine() { cmd.handler = function(argv) { session.argv = argv; if (!file.exist(argv.filename)) - return log.error('File ' + argv.filename + ' not exist!'); + return log.fatal('File ' + argv.filename + ' not exist!'); const meta = file.meta(argv.filename); diff --git a/lib/commands/test.js b/lib/commands/test.js index 02520508..21c4a4eb 100644 --- a/lib/commands/test.js +++ b/lib/commands/test.js @@ -54,7 +54,7 @@ function printResult(actual, expect, k) { function runTest(argv) { if (!file.exist(argv.filename)) - return log.error('File ' + argv.filename + ' not exist!'); + return log.fatal('File ' + argv.filename + ' not exist!'); const meta = file.meta(argv.filename); diff --git a/lib/log.js b/lib/log.js index cb8435de..acccc73c 100644 --- a/lib/log.js +++ b/lib/log.js @@ -25,7 +25,16 @@ log.isEnabled = function(name) { }; log.fail = function(e) { - log.error(sprintf('%s [%d]', (e.msg || e), (e.statusCode || 0))); + let msg = sprintf('%s', (e.msg || e)); + if (e.statusCode) { + msg += sprintf(' [code=%d]', e.statusCode); + } + log.error(msg); +}; + +log.fatal = function(e) { + log.error(e); + process.exit(1); }; log.printf = function() { diff --git a/test/test_log.js b/test/test_log.js index 3fd58ff6..a749af50 100644 --- a/test/test_log.js +++ b/test/test_log.js @@ -93,10 +93,10 @@ describe('log', function() { it('should ok with log.fail', function() { log.fail({msg: 'some error', statusCode: 500}); - assert.equal(expected, chalk.red('[ERROR] some error [500]')); + assert.equal(expected, chalk.red('[ERROR] some error [code=500]')); log.fail('some error'); - assert.equal(expected, chalk.red('[ERROR] some error [0]')); + assert.equal(expected, chalk.red('[ERROR] some error')); }); }); // #levels From 7704e1181650481fe0609aad3eeb954c53c3d25c Mon Sep 17 00:00:00 2001 From: Eric Wang Date: Sat, 24 Nov 2018 13:32:42 +0800 Subject: [PATCH 45/65] [pkg] bail out if error occurs Signed-off-by: Eric Wang --- bin/pkg | 1 + bin/pkg.bat | 20 +++++++++++++------- bin/pkg.sh | 15 +++++++++------ 3 files changed, 23 insertions(+), 13 deletions(-) diff --git a/bin/pkg b/bin/pkg index 548a8be7..0cc22db1 100755 --- a/bin/pkg +++ b/bin/pkg @@ -17,3 +17,4 @@ if (os === 'darwin') { var proc = require('child_process').spawn(bin, args); proc.stdout.on('data', x => console.log(x.toString().trimRight('\n'))); proc.stderr.on('data', x => console.log(x.toString().trimRight('\n'))); +proc.on('close', process.exit); \ No newline at end of file diff --git a/bin/pkg.bat b/bin/pkg.bat index 12d2f200..0294b7f5 100644 --- a/bin/pkg.bat +++ b/bin/pkg.bat @@ -3,17 +3,23 @@ set arch=%1 set os=%2 set ver=%3 +set dist=dist\ +set file=leetcode-cli.node%ver%.%os%.%arch%.zip + +mkdir %dist% +del /q %dist%\* +del /q *.zip + for %%x in (company cookie.chrome cookie.firefox cpp.lint cpp.run github leetcode.cn lintcode solution.discuss) do ( echo [%%x] node bin\leetcode ext -i %%x + if %ERRORLEVEL% gtr 0 exit /b 1 ) -set dist=dist\ -mkdir %dist% -del /q %dist%\* - for /r . %%x in (*.node) do copy %%x %dist% -npm run pkg -- node%ver%-%os%-%arch% +call npm run pkg -- node%ver%-%os%-%arch% +if %ERRORLEVEL% gtr 0 exit /b 1 -set file=leetcode-cli.node%ver%.%os%.%arch%.zip -7z a %file% %dist% \ No newline at end of file +7z a %file% %dist% +if %ERRORLEVEL% gtr 0 exit /b 1 +exit 0 \ No newline at end of file diff --git a/bin/pkg.sh b/bin/pkg.sh index eaf0ac71..abeb778d 100755 --- a/bin/pkg.sh +++ b/bin/pkg.sh @@ -4,6 +4,13 @@ arch=$1 os=$2 ver=$3 +DIST=./dist +FILE=leetcode-cli.node$ver.$os.$arch.tar.gz + +mkdir -p $DIST +rm -rf $DIST/* +rm -rf $FILE + plugins="company cookie.chrome cookie.firefox cpp.lint cpp.run github leetcode.cn lintcode solution.discuss" for plugin in $plugins; do @@ -11,13 +18,9 @@ for plugin in $plugins; do ./bin/leetcode ext -i $plugin done -DIST=./dist -mkdir -p $DIST -rm -rf $DIST/* - find node_modules -name "*.node" -exec cp {} $DIST \; npm run pkg -- node$ver-$os-$arch -FILE=leetcode-cli.node$ver.$os.$arch.tar.gz -tar zcvf $FILE $DIST +tar zcvf $FILE $DIST ls -al $FILE +exit 0 \ No newline at end of file From 70179c893e91f552386dd1b1f6e329d6e0205182 Mon Sep 17 00:00:00 2001 From: Eric Wang Date: Sat, 24 Nov 2018 14:28:45 +0800 Subject: [PATCH 46/65] [pkg] build from travis Signed-off-by: Eric Wang --- .travis.yml | 17 ++++++++++++++++- package.json | 1 + 2 files changed, 17 insertions(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index 40ece843..247f9281 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,11 +1,26 @@ language: node_js node_js: - - "node" + - 10 + os: - linux - osx - windows + install: - npm install + script: - npm test + - if [ -n "$TRAVIS_TAG" ]; then npm run travis; fi + +deploy: + provider: releases + api_key: + secure: "ayYe6HlYFrFposeIh2xX1DbdF3CRFnAHM5VvdtfVh/TtpcEvg4GRCanvzaSvsVajLjFZOZhGVgm+uZ1H6ba6jQuoOUvFJ667EVwQk7c8KDJrvZIMvzMxCgvSHb6N8VBh/5svWYa+7Kbd++3WP7XmkLpWli/DXvOSu6I6M7w+m/OI157mWPp0a7iy+Q+o1vSl/3INNIrd/vMT5F+ae1iBLFn3aHndtezhdQr+HrQCHaVP8OiK96rtjzaiRp+dyoMf4U71LoJGRpGZURv9imyXholoQutlT+bhRaumPqrqiwFRGMaL+xhfBZMySMND8wcO9rQnabiQf5Wo9J5aJMnixWjEIg9gGhJ8E96j9VwdUBA7yfHAbVhLrQ0h2TkZuUdqU1EnOWIbnPtjC9exv8R5X2WRs1fMz9j+XpNYclB4YdLclQ662nfsquccqfksDG1rS249WkSl1RIxr9fcD+60xYXgkG78wrTN8cr9NMGk5/AyMyHcvYjA+rGg1V8DZhzC3WZn9Q0NRJoc3b+xx9pxkaO7epBck5sAsNPO8b/bMGGKmgmR5tKSZUN+lTUKLI2znJcUC1dMKKpRCqr1To94ZYVe0G7SFbe+MH4guQXkd7sB6GnsR8/7g8OsVcAtV4DoEWfHwJQIE0bg/UzqubyBPSGPs1JBZm8nks/zTpOJ65o=" + file: leetcode-cli.* + file_glob: true + skip_cleanup: true + overwrite: true + on: + tags: true diff --git a/package.json b/package.json index b65b1e44..f013bcd7 100644 --- a/package.json +++ b/package.json @@ -12,6 +12,7 @@ "scripts": { "lint": "eslint lib/ test/", "test": "npm run lint && nyc mocha test test/plugins && nyc report --reporter=lcov", + "travis": "node bin/pkg", "pkg": "pkg . --out-path=dist/ --targets" }, "pkg": { From 24b85ea5a7be57b4265ffe9fb3dd484f3d6f861d Mon Sep 17 00:00:00 2001 From: Eric Wang Date: Sat, 24 Nov 2018 17:38:22 +0800 Subject: [PATCH 47/65] Bump to 2.6.0 Signed-off-by: Eric Wang --- docs/commands.md | 4 ++-- docs/releases.md | 9 +++++++++ package.json | 2 +- 3 files changed, 12 insertions(+), 3 deletions(-) diff --git a/docs/commands.md b/docs/commands.md index e3270b44..06cfebaa 100644 --- a/docs/commands.md +++ b/docs/commands.md @@ -465,7 +465,7 @@ Display version information. Short: $ leetcode version - 2.5.4 + 2.6.0 Verbose: @@ -475,7 +475,7 @@ Verbose: | | ___ ___| |_ ___ ___ __| | ___ | |/ _ \/ _ \ __|/ __|/ _ \ / _` |/ _ \ | | __/ __/ |_ (__| (_) | (_| | __/ - |_|\___|\___|\__|\___|\___/ \__,_|\___| CLI v2.5.4 + |_|\___|\___|\__|\___|\___/ \__,_|\___| CLI v2.6.0 [Environment] Node v8.1.4 diff --git a/docs/releases.md b/docs/releases.md index 1794ecb5..c26de3dc 100644 --- a/docs/releases.md +++ b/docs/releases.md @@ -2,6 +2,15 @@ layout: default title: Release Notes --- +# 2.6.0 +* build all-in-one binary for linux/macos/windows. +* `show` + * support customized filename. + * use "--" as comment in sql file. +* `list` + * fixes format issue. +* fixes UT failures on windows. + # 2.5.4 * fixes error in fresh env without .lc existed. * embed meta in file content instead of file name. diff --git a/package.json b/package.json index f013bcd7..7453aa5b 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "leetcode-cli", - "version": "2.5.4", + "version": "2.6.0", "description": "A cli tool to enjoy leetcode!", "preferGlobal": "true", "engines": { From b5a5cfa0160555151d70b7655f02cf0433f0a8bf Mon Sep 17 00:00:00 2001 From: Eric Wang Date: Sat, 24 Nov 2018 18:38:58 +0800 Subject: [PATCH 48/65] [pages] update docs. Signed-off-by: Eric Wang --- docs/advanced.md | 23 +++++++++++++++++++++++ docs/install.md | 11 +++++++++++ 2 files changed, 34 insertions(+) diff --git a/docs/advanced.md b/docs/advanced.md index a7cc593b..42904e91 100644 --- a/docs/advanced.md +++ b/docs/advanced.md @@ -9,6 +9,7 @@ title: Advanced Topic * [Cache](#cache) * [Configuration](#configuration) * [Color Themes](#color-themes) +* [File Name](#file-name) * [Log Levels](#log-levels) * [Plugins](#plugins) @@ -91,6 +92,10 @@ The config file is saved in `~/.lc/config.json`, here is a full exmaple (include "enable": true, "theme": "default" }, + "file": { + "show": "${fid}.${slug}", + "submission": "${fid}.${slug}.${sid}.${ac}" + }, "icon": { "theme": "" }, @@ -107,6 +112,7 @@ Here are some useful settings: * `code:lang` to set your default language used in coding. * `color:enable` to enable colorful output. * `color:theme` to set color theme used in output. (see [Color Theme](#color-theme)) +* `file.show` to set filename pattern for generated code file. (see [File Name](#file-name)) * `icon:theme` to set icon them used in output. * `plugins` to config each installed plugins. (see [Plugins](#plugins)) @@ -167,6 +173,23 @@ Of course you can create your own themes if you like, look into `colors` folder "yellow": "#ffff00" } +# File Name + +You could configure file name pattern in code generation. + +* config `file.show` for generated file in `show`. +* config `file.submission` for downloaded file in `submission`. + +Followings are some variables you could used in the pattern: + +* `${fid}` for question id. (e.g. `123`) +* `${slug}` for dash-separated question name. (e.g. `add-two`) +* `${name}` for space-separated questions name. (e.g. `Add Two`) +* `${level}` for question level. (e.g. `Hard`) +* `${category}` for question category. (e.g. `algorithms`) +* `${sid}` for submission id. +* `${ac}` for accept status of existing submission. + # Log Levels * `-v` to enable debug output. diff --git a/docs/install.md b/docs/install.md index 5b8e0706..c2e20595 100644 --- a/docs/install.md +++ b/docs/install.md @@ -3,6 +3,12 @@ layout: default title: Installation --- +# All in One (beta) + +No need to install node.js. Now available on 64bits linux, mac, and windows. + +[Download](https://github.com/skygragon/leetcode-cli/releases) + # Prerequisites Install the latest LTS version of `node.js` (`npm` included): @@ -49,6 +55,11 @@ Similar with above, while you can introduce your own changes as you wish. $ cd leetcode-cli && ./bin/install $ leetcode version +### From source (all-in-one) + + $ git clone http://github.com/skygragon/leetcode-cli + $ cd leetcode-cli && node ./bin/pkg + ### From docker NOTE: This is just a tiny taste to let you feel that leetcode-cli is. Please use other ways above to install leetcode-cli if you like it. From bd80b3afc44371a01ce026b523eb75b260c45d53 Mon Sep 17 00:00:00 2001 From: Eric Wang Date: Sun, 25 Nov 2018 15:47:13 +0800 Subject: [PATCH 49/65] expose more code to plugins. * leetcode.cn/lintcode could reuse this. Signed-off-by: Eric Wang --- lib/plugins/leetcode.js | 56 ++++++++++++++++++++--------------------- 1 file changed, 28 insertions(+), 28 deletions(-) diff --git a/lib/plugins/leetcode.js b/lib/plugins/leetcode.js index 8a3a8d8c..a2e17b8f 100644 --- a/lib/plugins/leetcode.js +++ b/lib/plugins/leetcode.js @@ -20,24 +20,24 @@ const plugin = new Plugin(10, 'leetcode', '', var spin; // update options with user credentials -function signOpts(opts, user) { +plugin.signOpts = function(opts, user) { opts.headers.Cookie = 'LEETCODE_SESSION=' + user.sessionId + ';csrftoken=' + user.sessionCSRF + ';'; opts.headers['X-CSRFToken'] = user.sessionCSRF; opts.headers['X-Requested-With'] = 'XMLHttpRequest'; -} +}; -function makeOpts(url) { +plugin.makeOpts = function(url) { const opts = {}; opts.url = url; opts.headers = {}; if (session.isLogin()) - signOpts(opts, session.getUser()); + plugin.signOpts(opts, session.getUser()); return opts; -} +}; -function checkError(e, resp, expectedStatus) { +plugin.checkError = function(e, resp, expectedStatus) { if (!e && resp && resp.statusCode !== expectedStatus) { const code = resp.statusCode; log.debug('http error: ' + code); @@ -49,7 +49,7 @@ function checkError(e, resp, expectedStatus) { } } return e; -} +}; plugin.init = function() { config.app = 'leetcode'; @@ -80,11 +80,11 @@ plugin.getProblems = function(cb) { plugin.getCategoryProblems = function(category, cb) { log.debug('running leetcode.getCategoryProblems: ' + category); - const opts = makeOpts(config.sys.urls.problems.replace('$category', category)); + const opts = plugin.makeOpts(config.sys.urls.problems.replace('$category', category)); spin.text = 'Downloading category ' + category; request(opts, function(e, resp, body) { - e = checkError(e, resp, 200); + e = plugin.checkError(e, resp, 200); if (e) return cb(e); const json = JSON.parse(body); @@ -123,7 +123,7 @@ plugin.getProblem = function(problem, cb) { const user = session.getUser(); if (problem.locked && !user.paid) return cb('failed to load locked problem!'); - const opts = makeOpts(config.sys.urls.graphql); + const opts = plugin.makeOpts(config.sys.urls.graphql); opts.headers.Origin = config.sys.urls.base; opts.headers.Referer = problem.link; @@ -149,7 +149,7 @@ plugin.getProblem = function(problem, cb) { const spin = h.spin('Downloading ' + problem.slug); request.post(opts, function(e, resp, body) { spin.stop(); - e = checkError(e, resp, 200); + e = plugin.checkError(e, resp, 200); if (e) return cb(e); const q = body.data.question; @@ -191,7 +191,7 @@ function runCode(opts, problem, cb) { const spin = h.spin('Sending code to judge'); request(opts, function(e, resp, body) { spin.stop(); - e = checkError(e, resp, 200); + e = plugin.checkError(e, resp, 200); if (e) return cb(e); if (body.error) { @@ -224,7 +224,7 @@ function verifyResult(task, queue, cb) { const spin = h.spin('Waiting for judge result'); request(opts, function(e, resp, body) { spin.stop(); - e = checkError(e, resp, 200); + e = plugin.checkError(e, resp, 200); if (e) return cb(e); let result = JSON.parse(body); @@ -273,7 +273,7 @@ function formatResult(result) { plugin.testProblem = function(problem, cb) { log.debug('running leetcode.testProblem'); - const opts = makeOpts(config.sys.urls.test.replace('$slug', problem.slug)); + const opts = plugin.makeOpts(config.sys.urls.test.replace('$slug', problem.slug)); opts.body = {data_input: problem.testcase}; runCode(opts, problem, function(e, task) { @@ -292,7 +292,7 @@ plugin.testProblem = function(problem, cb) { plugin.submitProblem = function(problem, cb) { log.debug('running leetcode.submitProblem'); - const opts = makeOpts(config.sys.urls.submit.replace('$slug', problem.slug)); + const opts = plugin.makeOpts(config.sys.urls.submit.replace('$slug', problem.slug)); opts.body = {judge_type: 'large'}; runCode(opts, problem, function(e, task) { @@ -308,11 +308,11 @@ plugin.submitProblem = function(problem, cb) { plugin.getSubmissions = function(problem, cb) { log.debug('running leetcode.getSubmissions'); - const opts = makeOpts(config.sys.urls.submissions.replace('$slug', problem.slug)); + const opts = plugin.makeOpts(config.sys.urls.submissions.replace('$slug', problem.slug)); opts.headers.Referer = config.sys.urls.problem.replace('$slug', problem.slug); request(opts, function(e, resp, body) { - e = checkError(e, resp, 200); + e = plugin.checkError(e, resp, 200); if (e) return cb(e); // FIXME: this only return the 1st 20 submissions, we should get next if necessary. @@ -326,10 +326,10 @@ plugin.getSubmissions = function(problem, cb) { plugin.getSubmission = function(submission, cb) { log.debug('running leetcode.getSubmission'); - const opts = makeOpts(config.sys.urls.submission.replace('$id', submission.id)); + const opts = plugin.makeOpts(config.sys.urls.submission.replace('$id', submission.id)); request(opts, function(e, resp, body) { - e = checkError(e, resp, 200); + e = plugin.checkError(e, resp, 200); if (e) return cb(e); let re = body.match(/submissionCode:\s('[^']*')/); @@ -343,7 +343,7 @@ plugin.getSubmission = function(submission, cb) { plugin.starProblem = function(problem, starred, cb) { log.debug('running leetcode.starProblem'); - const opts = makeOpts(); + const opts = plugin.makeOpts(); opts.headers.Origin = config.sys.urls.base; opts.headers.Referer = problem.link; @@ -364,7 +364,7 @@ plugin.starProblem = function(problem, starred, cb) { } request(opts, function(e, resp, body) { - e = checkError(e, resp, 204); + e = plugin.checkError(e, resp, 204); if (e) return cb(e); cb(null, starred); @@ -373,12 +373,12 @@ plugin.starProblem = function(problem, starred, cb) { plugin.getFavorites = function(cb) { log.debug('running leetcode.getFavorites'); - const opts = makeOpts(config.sys.urls.favorites); + const opts = plugin.makeOpts(config.sys.urls.favorites); const spin = h.spin('Retrieving user favorites'); request(opts, function(e, resp, body) { spin.stop(); - e = checkError(e, resp, 200); + e = plugin.checkError(e, resp, 200); if (e) return cb(e); const favorites = JSON.parse(body); @@ -388,7 +388,7 @@ plugin.getFavorites = function(cb) { plugin.getUserInfo = function(cb) { log.debug('running leetcode.getUserInfo'); - const opts = makeOpts(config.sys.urls.graphql); + const opts = plugin.makeOpts(config.sys.urls.graphql); opts.headers.Origin = config.sys.urls.base; opts.headers.Referer = config.sys.urls.base; opts.json = true; @@ -407,7 +407,7 @@ plugin.getUserInfo = function(cb) { const spin = h.spin('Retrieving user profile'); request.post(opts, function(e, resp, body) { spin.stop(); - e = checkError(e, resp, 200); + e = plugin.checkError(e, resp, 200); if (e) return cb(e); const user = body.data.user; @@ -416,7 +416,7 @@ plugin.getUserInfo = function(cb) { }; function runSession(method, data, cb) { - const opts = makeOpts(config.sys.urls.session); + const opts = plugin.makeOpts(config.sys.urls.session); opts.json = true; opts.method = method; opts.body = data; @@ -424,7 +424,7 @@ function runSession(method, data, cb) { const spin = h.spin('Waiting session result'); request(opts, function(e, resp, body) { spin.stop(); - e = checkError(e, resp, 200); + e = plugin.checkError(e, resp, 200); if (e && e.statusCode === 302) e = session.errors.EXPIRED; return e ? cb(e) : cb(null, body.sessions); @@ -459,7 +459,7 @@ plugin.signin = function(user, cb) { const spin = h.spin('Signing in leetcode.com'); request(config.sys.urls.login, function(e, resp, body) { spin.stop(); - e = checkError(e, resp, 200); + e = plugin.checkError(e, resp, 200); if (e) return cb(e); user.loginCSRF = h.getSetCookieValue(resp, 'csrftoken'); From aaf64517d61c90c019b85fb59ddf59e5cbcdafc2 Mon Sep 17 00:00:00 2001 From: Eric Wang Date: Sun, 25 Nov 2018 21:35:25 +0800 Subject: [PATCH 50/65] remove sprintf-js Signed-off-by: Eric Wang --- .eslintrc.js | 1 + lib/commands/cache.js | 6 ++-- lib/commands/list.js | 13 ++++----- lib/commands/plugin.js | 3 +- lib/commands/session.js | 12 ++++---- lib/commands/show.js | 4 +-- lib/commands/star.js | 2 +- lib/commands/stat.js | 12 ++++---- lib/commands/submission.js | 2 +- lib/commands/user.js | 6 ++-- lib/log.js | 4 +-- lib/sprintf.js | 56 ++++++++++++++++++++++++++++++++++++++ package.json | 1 - test/test_log.js | 2 +- test/test_sprintf.js | 33 ++++++++++++++++++++++ 15 files changed, 122 insertions(+), 35 deletions(-) create mode 100644 lib/sprintf.js create mode 100644 test/test_sprintf.js diff --git a/.eslintrc.js b/.eslintrc.js index 8cce4ef7..5ef04108 100644 --- a/.eslintrc.js +++ b/.eslintrc.js @@ -17,6 +17,7 @@ module.exports = { "curly": 0, "key-spacing": [2, {align: "value"}], "max-len": [1, 120], + "no-control-regex": 0, "no-console": 1, "no-empty": [2, { "allowEmptyCatch": true }], "no-eval": 1, // we use it on purpose diff --git a/lib/commands/cache.js b/lib/commands/cache.js index 30bc24b4..154a3302 100644 --- a/lib/commands/cache.js +++ b/lib/commands/cache.js @@ -1,12 +1,12 @@ 'use strict'; var _ = require('underscore'); -var sprintf = require('sprintf-js').sprintf; var h = require('../helper'); var chalk = require('../chalk'); var log = require('../log'); var cache = require('../cache'); var session = require('../session'); +var sprintf = require('../sprintf'); const cmd = { command: 'cache [keyword]', @@ -56,8 +56,8 @@ cmd.handler = function(argv) { return x; }) .forEach(function(f) { - log.printf(' %s %8s %s ago', - chalk.green(sprintf('%-60s', f.name)), + log.printf(' %-60s %8s %s ago', + chalk.green(f.name), h.prettySize(f.size), h.prettyTime((Date.now() - f.mtime) / 1000)); }); diff --git a/lib/commands/list.js b/lib/commands/list.js index 67427f89..c010de86 100644 --- a/lib/commands/list.js +++ b/lib/commands/list.js @@ -1,6 +1,5 @@ 'use strict'; var _ = require('underscore'); -var sprintf = require('sprintf-js').sprintf; var h = require('../helper'); var chalk = require('../chalk'); @@ -67,14 +66,14 @@ cmd.handler = function(argv) { if (problem.locked) ++stat.locked; if (problem.starred) ++stat.starred; - log.printf('%s %s %s [%4d] %-60s %-6s (%.2f %%)', + log.printf('%s %s %s [%=4s] %-60s %-6s (%s %%)', (problem.starred ? chalk.yellow(icon.like) : icon.empty), (problem.locked ? chalk.red(icon.lock) : icon.nolock), h.prettyState(problem.state), problem.fid, problem.name, - h.prettyLevel(sprintf('%-6s', problem.level)), - problem.percent); + h.prettyLevel(problem.level), + problem.percent.toFixed(2)); if (argv.extra) { let badges = [problem.category]; @@ -99,9 +98,9 @@ cmd.handler = function(argv) { if (argv.stat) { log.info(); - log.printf(' Listed: %-9d Locked: %-9d Starred: %-9d', problems.length, stat.locked, stat.starred); - log.printf(' Accept: %-9d Not-AC: %-9d Remain: %-9d', stat.ac, stat.notac, stat.None); - log.printf(' Easy: %-9d Medium: %-9d Hard: %-9d', stat.Easy, stat.Medium, stat.Hard); + log.printf(' Listed: %-9s Locked: %-9s Starred: %-9s', problems.length, stat.locked, stat.starred); + log.printf(' Accept: %-9s Not-AC: %-9s Remain: %-9s', stat.ac, stat.notac, stat.None); + log.printf(' Easy: %-9s Medium: %-9s Hard: %-9s', stat.Easy, stat.Medium, stat.Hard); } }); }; diff --git a/lib/commands/plugin.js b/lib/commands/plugin.js index 623fd513..78a966b5 100644 --- a/lib/commands/plugin.js +++ b/lib/commands/plugin.js @@ -1,12 +1,11 @@ 'use strict'; -var sprintf = require('sprintf-js').sprintf; - var h = require('../helper'); var chalk = require('../chalk'); var config = require('../config'); var log = require('../log'); var Plugin = require('../plugin'); var session = require('../session'); +var sprintf = require('../sprintf'); const cmd = { command: 'plugin [name]', diff --git a/lib/commands/session.js b/lib/commands/session.js index d348dea5..64d460d6 100644 --- a/lib/commands/session.js +++ b/lib/commands/session.js @@ -1,12 +1,12 @@ 'use strict'; var prompt = require('prompt'); -var sprintf = require('sprintf-js').sprintf; var h = require('../helper'); var chalk = require('../chalk'); var log = require('../log'); var core = require('../core'); var session = require('../session'); +var sprintf = require('../sprintf'); const cmd = { command: 'session [keyword]', @@ -61,14 +61,14 @@ function printSessions(e, sessions) { if (s.total_submitted > 0) submissionRate = s.total_acs * 100 / s.total_submitted; - log.printf(' %s %8d %-26s %s (%6s %%) %s (%6s %%)', + log.printf(' %s %8s %-26s %6s (%6s %%) %6s (%6s %%)', s.is_active ? h.prettyState('ac') : ' ', s.id, s.name || 'Anonymous Session', - chalk.green(sprintf('%6s', s.ac_questions)), - sprintf('%.2f', questionRate), - chalk.green(sprintf('%6s', s.total_acs)), - sprintf('%.2f', submissionRate)); + chalk.green(s.ac_questions), + questionRate.toFixed(2), + chalk.green(s.total_acs), + submissionRate.toFixed(2)); } } diff --git a/lib/commands/show.js b/lib/commands/show.js index 319d5d53..7c66204a 100644 --- a/lib/commands/show.js +++ b/lib/commands/show.js @@ -137,7 +137,7 @@ function showProblem(problem, argv) { } } - log.printf('[%d] %s %s', problem.fid, problem.name, + log.printf('[%s] %s %s', problem.fid, problem.name, (problem.starred ? chalk.yellow(icon.like) : icon.empty)); log.info(); log.info(chalk.underline(problem.link)); @@ -150,7 +150,7 @@ function showProblem(problem, argv) { log.info(); log.printf('* %s', problem.category); - log.printf('* %s (%.2f%%)', h.prettyLevel(problem.level), problem.percent); + log.printf('* %s (%s%%)', h.prettyLevel(problem.level), problem.percent.toFixed(2)); if (filename) log.printf('* Source Code: %s', chalk.yellow.underline(filename)); diff --git a/lib/commands/star.js b/lib/commands/star.js index 991e10e4..3660432b 100644 --- a/lib/commands/star.js +++ b/lib/commands/star.js @@ -35,7 +35,7 @@ cmd.handler = function(argv) { core.starProblem(problem, !argv.delete, function(e, starred) { if (e) return log.fail(e); - log.printf('[%d] %s %s', problem.fid, problem.name, + log.printf('[%s] %s %s', problem.fid, problem.name, chalk.yellow(starred ? icon.like : icon.unlike)); core.updateProblem(problem, {starred: starred}); diff --git a/lib/commands/stat.js b/lib/commands/stat.js index 54f7a41a..5a4ffd57 100644 --- a/lib/commands/stat.js +++ b/lib/commands/stat.js @@ -1,6 +1,5 @@ 'use strict'; var moment = require('moment'); -var sprintf = require('sprintf-js').sprintf; var _ = require('underscore'); var chalk = require('../chalk'); @@ -8,6 +7,7 @@ var icon = require('../icon'); var log = require('../log'); var core = require('../core'); var session = require('../session'); +var sprintf = require('../sprintf'); var h = require('../helper'); const cmd = { @@ -50,9 +50,9 @@ function printLine(key, done, all) { const n = 30; const percent = (all > 0) ? done / all : 0; const x = Math.ceil(n * percent); - log.printf(' %s\t%3d/%-3d (%6s %%) %s%s', + log.printf(' %s\t%3s/%-3s (%6s %%) %s%s', h.prettyLevel(key), done, all, - sprintf('%.2f', 100 * percent), + (100 * percent).toFixed(2), chalk.green('█'.repeat(x)), chalk.red('░'.repeat(n - x))); } @@ -96,7 +96,7 @@ function showGraph(problems) { if (groups > 5) groups = 5; const header = _.range(groups) - .map(x => sprintf('%4d%18d', x * 10 + 1, x * 10 + 10)) + .map(x => sprintf('%4s%18s', x * 10 + 1, x * 10 + 10)) .join(''); log.info(' ' + header); @@ -104,7 +104,7 @@ function showGraph(problems) { for (let problem of problems) graph[problem.fid] = ICONS[problem.state] || ICONS.none; - let line = [sprintf(' %03d', 0)]; + let line = [sprintf('%04s', 0)]; for (let i = 1, n = graph.length; i <= n; ++i) { // padding before group if (i % 10 === 1) line.push(' '); @@ -114,7 +114,7 @@ function showGraph(problems) { // time to start new row if (i % (10 * groups) === 0 || i === n) { log.info(line.join(' ')); - line = [sprintf(' %03d', i)]; + line = [sprintf('%04s', i)]; } } diff --git a/lib/commands/submission.js b/lib/commands/submission.js index 6c9c6909..de0449a3 100644 --- a/lib/commands/submission.js +++ b/lib/commands/submission.js @@ -62,7 +62,7 @@ function doTask(problem, queue, cb) { // - green: accepted, fresh download // - yellow: not ac-ed, fresh download // - white: existed already, skip download - log.printf('[%4d] %-60s %s', problem.fid, problem.name, + log.printf('[%=4s] %-60s %s', problem.fid, problem.name, (e ? chalk.red('ERROR: ' + (e.msg || e)) : msg)); if (cb) cb(e); } diff --git a/lib/commands/user.js b/lib/commands/user.js index af9ea4c2..4cd903cd 100644 --- a/lib/commands/user.js +++ b/lib/commands/user.js @@ -1,6 +1,5 @@ 'use strict'; var prompt = require('prompt'); -var sprintf = require('sprintf-js').sprintf; var h = require('../helper'); var config = require('../config'); @@ -8,6 +7,7 @@ var chalk = require('../chalk'); var log = require('../log'); var core = require('../core'); var session = require('../session'); +var sprintf = require('../sprintf'); const cmd = { command: 'user', @@ -65,9 +65,9 @@ cmd.handler = function(argv) { if (user) { log.info(chalk.gray(sprintf(' %-9s %-20s %s', 'Premium', 'User', 'Host'))); log.info(chalk.gray('-'.repeat(60))); - log.printf(' %s %s %s', + log.printf(' %s %-20s %s', h.prettyText('', user.paid || false), - chalk.yellow(sprintf('%-20s', user.name)), + chalk.yellow(user.name), config.sys.urls.base); } else return log.fail('You are not login yet?'); diff --git a/lib/log.js b/lib/log.js index acccc73c..394b356c 100644 --- a/lib/log.js +++ b/lib/log.js @@ -1,8 +1,8 @@ 'use strict'; var _ = require('underscore'); -var sprintf = require('sprintf-js').sprintf; var chalk = require('./chalk'); +var sprintf = require('./sprintf'); const log = { output: _.bind(console.log, console), @@ -27,7 +27,7 @@ log.isEnabled = function(name) { log.fail = function(e) { let msg = sprintf('%s', (e.msg || e)); if (e.statusCode) { - msg += sprintf(' [code=%d]', e.statusCode); + msg += sprintf(' [code=%s]', e.statusCode); } log.error(msg); }; diff --git a/lib/sprintf.js b/lib/sprintf.js new file mode 100644 index 00000000..133e32c8 --- /dev/null +++ b/lib/sprintf.js @@ -0,0 +1,56 @@ +'use strict' + +function len(s) { + let s1 = s.replace(/\u001b\[[^m]*m/g, ''); // remove color controls + s1 = s1.replace(/[^\x00-\xff]/g, ' '); // fix non-ascii + return s1.length; +} + +function padLeft(s, n, c) { + let k = Math.max(0, n - len(s)); + return c.repeat(k) + s; +} + +function padRight(s, n , c) { + let k = Math.max(0, n - len(s)); + return s + c.repeat(k); +} + +function padCenter(s, n, c) { + let k = Math.max(0, n - len(s)); + let r = (k - k % 2) / 2, l = k - r; + return c.repeat(l) + s + c.repeat(r); +} + +const tsprintf = function() { + const args = Array.from(arguments); + let fmt = args.shift(); + return fmt.replace(/%[^s%]*[s%]/g, function(s) { + if (s === '%%') return '%'; + + let x = '' + args.shift(); + let n = 0; + + s = s.slice(1, s.length-1); + if (s.length > 0) { + switch (s[0]) { + case '-': + n = parseInt(s.slice(1)) || 0; + x = padRight(x, n, ' '); + break; + case '=': + n = parseInt(s.slice(1)) || 0; + x = padCenter(x, n, ' '); + break; + default: + n = parseInt(s) || 0; + x = padLeft(x, n, ' '); + break; + } + } + + return x; + }); +}; + +module.exports = tsprintf; diff --git a/package.json b/package.json index 7453aa5b..5c043b8d 100644 --- a/package.json +++ b/package.json @@ -59,7 +59,6 @@ "ora": "3.0.0", "prompt": "1.0.0", "request": "2.88.0", - "sprintf-js": "1.1.1", "supports-color": "5.5.0", "underscore": "1.9.1", "wordwrap": "1.0.0", diff --git a/test/test_log.js b/test/test_log.js index a749af50..92e5ef4b 100644 --- a/test/test_log.js +++ b/test/test_log.js @@ -102,7 +102,7 @@ describe('log', function() { describe('#printf', function() { it('should ok', function() { - log.printf('%s and %d and %%', 'string', 100); + log.printf('%s and %s and %%', 'string', 100); assert.equal(expected, 'string and 100 and %'); }); }); // #printf diff --git a/test/test_sprintf.js b/test/test_sprintf.js new file mode 100644 index 00000000..8b509903 --- /dev/null +++ b/test/test_sprintf.js @@ -0,0 +1,33 @@ +'use strict'; +const assert = require('chai').assert; +const rewire = require('rewire'); + +const sprintf = require('../lib/sprintf'); + +describe('sprintf', function() { + it('should ok', function() { + assert.equal(sprintf('%%'), '%'); + assert.equal(sprintf('%s', 123), '123'); + assert.equal(sprintf('%6s', 123), ' 123'); + assert.equal(sprintf('%-6s', 123), '123 '); + assert.equal(sprintf('%=6s', 123), ' 123 '); + + assert.equal(sprintf('%4s,%=4s,%-4s', 123, 'xy', 3.1), ' 123, xy ,3.1 '); + }); + + it('should non-ascii ok', function() { + assert.equal(sprintf('%4s', '中'), ' 中'); + assert.equal(sprintf('%-4s', '中'), '中 '); + assert.equal(sprintf('%=4s', '中'), ' 中 '); + + assert.equal(sprintf('%=14s', '12你好34世界'), ' 12你好34世界 '); + }); + + it('should color ok', function() { + const chalk = rewire('../lib/chalk'); + chalk.init(); + chalk.setTheme('default'); + + assert.equal(sprintf('%=3s', chalk.red('X')), ' \u001b[38;5;196mX\u001b[39m '); + }); +}); From 168b0f41f502db038ccae29fea841d48b98f1550 Mon Sep 17 00:00:00 2001 From: Eric Wang Date: Sun, 25 Nov 2018 21:46:05 +0800 Subject: [PATCH 51/65] fixes UT bug. Signed-off-by: Eric Wang --- lib/commands/stat.js | 4 ++-- lib/commands/version.js | 2 +- lib/sprintf.js | 4 ++++ test/test_sprintf.js | 4 ++-- 4 files changed, 9 insertions(+), 5 deletions(-) diff --git a/lib/commands/stat.js b/lib/commands/stat.js index 5a4ffd57..3c51ab98 100644 --- a/lib/commands/stat.js +++ b/lib/commands/stat.js @@ -104,7 +104,7 @@ function showGraph(problems) { for (let problem of problems) graph[problem.fid] = ICONS[problem.state] || ICONS.none; - let line = [sprintf('%04s', 0)]; + let line = [sprintf(' %03s', 0)]; for (let i = 1, n = graph.length; i <= n; ++i) { // padding before group if (i % 10 === 1) line.push(' '); @@ -114,7 +114,7 @@ function showGraph(problems) { // time to start new row if (i % (10 * groups) === 0 || i === n) { log.info(line.join(' ')); - line = [sprintf('%04s', i)]; + line = [sprintf(' %03s', i)]; } } diff --git a/lib/commands/version.js b/lib/commands/version.js index 257f631a..4ba16749 100644 --- a/lib/commands/version.js +++ b/lib/commands/version.js @@ -47,7 +47,7 @@ cmd.handler = function(argv) { '| | ___ ___| |_ ___ ___ __| | ___ ', '| |/ _ \\/ _ \\ __|/ __|/ _ \\ / _` |/ _ \\', '| | __/ __/ |_ (__| (_) | (_| | __/', - '|_|\\___|\\___|\\__|\\___|\\___/ \\__,_|\\___| CLI v' + version + '|_|\\___|\\___|\\__|\\___|\\___/ \\__,_|\\___| CLI ' + chalk.green('v' + version) ].join('\n'); log.info(logo); diff --git a/lib/sprintf.js b/lib/sprintf.js index 133e32c8..739f3d06 100644 --- a/lib/sprintf.js +++ b/lib/sprintf.js @@ -42,6 +42,10 @@ const tsprintf = function() { n = parseInt(s.slice(1)) || 0; x = padCenter(x, n, ' '); break; + case '0': + n = parseInt(s.slice(1)) || 0; + x = padLeft(x, n, '0'); + break; default: n = parseInt(s) || 0; x = padLeft(x, n, ' '); diff --git a/test/test_sprintf.js b/test/test_sprintf.js index 8b509903..aed7cbc3 100644 --- a/test/test_sprintf.js +++ b/test/test_sprintf.js @@ -9,6 +9,7 @@ describe('sprintf', function() { assert.equal(sprintf('%%'), '%'); assert.equal(sprintf('%s', 123), '123'); assert.equal(sprintf('%6s', 123), ' 123'); + assert.equal(sprintf('%06s', 123), '000123'); assert.equal(sprintf('%-6s', 123), '123 '); assert.equal(sprintf('%=6s', 123), ' 123 '); @@ -26,8 +27,7 @@ describe('sprintf', function() { it('should color ok', function() { const chalk = rewire('../lib/chalk'); chalk.init(); - chalk.setTheme('default'); - assert.equal(sprintf('%=3s', chalk.red('X')), ' \u001b[38;5;196mX\u001b[39m '); + assert.equal(sprintf('%=3s', chalk.red('X')), ' ' + chalk.red('X') + ' '); }); }); From c95cea8bab7cc8cd111414a88d5650d5c5e35e81 Mon Sep 17 00:00:00 2001 From: Eric Wang Date: Fri, 30 Nov 2018 20:40:31 +0800 Subject: [PATCH 52/65] refs #134: remove whitespace on windows. Signed-off-by: Eric Wang --- lib/file.js | 2 +- test/test_file.js | 12 ++++++++++++ 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/lib/file.js b/lib/file.js index 493e9ebd..51ea21c3 100644 --- a/lib/file.js +++ b/lib/file.js @@ -149,7 +149,7 @@ file.meta = function(filename) { line.split(' ').forEach(function(x) { const v = x.split('='); if (v.length == 2) { - m[v[0]] = v[1]; + m[v[0]] = v[1].trim(); } }); diff --git a/test/test_file.js b/test/test_file.js index 16d04ba3..d458e83f 100644 --- a/test/test_file.js +++ b/test/test_file.js @@ -81,6 +81,18 @@ describe('file', function() { assert.equal(meta.lang, 'javascript'); }); + it('should meta ok with white space', function() { + file.data = x => [ + '/ *', + ' * @lc app=leetcode id=123\t \t lang=javascript\r', + ' * /' + ].join('\n'); + const meta = file.meta('dummy'); + assert.equal(meta.app, 'leetcode') + assert.equal(meta.id, '123'); + assert.equal(meta.lang, 'javascript'); + }); + it('should meta ok within file name', function() { file.data = x => [ '/ *', From 99f921ec806e59dce7386c9429e4d92f5a3fbcb3 Mon Sep 17 00:00:00 2001 From: Eric Wang Date: Mon, 3 Dec 2018 23:05:54 +0800 Subject: [PATCH 53/65] Bump to 2.6.1 Signed-off-by: Eric Wang --- docs/commands.md | 4 ++-- docs/releases.md | 4 ++++ package.json | 2 +- 3 files changed, 7 insertions(+), 3 deletions(-) diff --git a/docs/commands.md b/docs/commands.md index 06cfebaa..2eda14a7 100644 --- a/docs/commands.md +++ b/docs/commands.md @@ -465,7 +465,7 @@ Display version information. Short: $ leetcode version - 2.6.0 + 2.6.1 Verbose: @@ -475,7 +475,7 @@ Verbose: | | ___ ___| |_ ___ ___ __| | ___ | |/ _ \/ _ \ __|/ __|/ _ \ / _` |/ _ \ | | __/ __/ |_ (__| (_) | (_| | __/ - |_|\___|\___|\__|\___|\___/ \__,_|\___| CLI v2.6.0 + |_|\___|\___|\__|\___|\___/ \__,_|\___| CLI v2.6.1 [Environment] Node v8.1.4 diff --git a/docs/releases.md b/docs/releases.md index c26de3dc..7b78a5f3 100644 --- a/docs/releases.md +++ b/docs/releases.md @@ -2,6 +2,10 @@ layout: default title: Release Notes --- +# 2.6.1 +* `submit` + * fixes 500 error on windows. + # 2.6.0 * build all-in-one binary for linux/macos/windows. * `show` diff --git a/package.json b/package.json index 5c043b8d..ee8f2414 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "leetcode-cli", - "version": "2.6.0", + "version": "2.6.1", "description": "A cli tool to enjoy leetcode!", "preferGlobal": "true", "engines": { From 1b5ea18f15b4189c05385e4dc00017128bd54de7 Mon Sep 17 00:00:00 2001 From: sunway Date: Fri, 21 Dec 2018 11:18:42 +0800 Subject: [PATCH 54/65] add rust lang --- lib/config.js | 1 + lib/helper.js | 1 + test/test_helper.js | 3 ++- 3 files changed, 4 insertions(+), 1 deletion(-) diff --git a/lib/config.js b/lib/config.js index 692b958d..cd849fae 100644 --- a/lib/config.js +++ b/lib/config.js @@ -25,6 +25,7 @@ const DEFAULT_CONFIG = { 'python', 'python3', 'ruby', + 'rust', 'scala', 'swift' ], diff --git a/lib/helper.js b/lib/helper.js index 5ca496aa..c2085134 100644 --- a/lib/helper.js +++ b/lib/helper.js @@ -42,6 +42,7 @@ const LANGS = [ {lang: 'python', ext: '.py', style: '#'}, {lang: 'python3', ext: '.py', style: '#'}, {lang: 'ruby', ext: '.rb', style: '#'}, + {lang: 'rust', ext: '.rs', style: 'c'}, {lang: 'scala', ext: '.scala', style: 'c'}, {lang: 'swift', ext: '.swift', style: 'c'} ]; diff --git a/test/test_helper.js b/test/test_helper.js index cfc502d4..6eb6e106 100644 --- a/test/test_helper.js +++ b/test/test_helper.js @@ -133,7 +133,7 @@ describe('helper', function() { assert.equal(h.langToExt('ruby'), '.rb'); assert.equal(h.langToExt('scala'), '.scala'); assert.equal(h.langToExt('swift'), '.swift'); - assert.equal(h.langToExt('rust'), '.raw'); + assert.equal(h.langToExt('rust'), '.rs'); }); }); // #langToExt @@ -152,6 +152,7 @@ describe('helper', function() { assert.equal(h.extToLang('~/leetcode/file.swift'), 'swift'); assert.equal(h.extToLang('~/leetcode/../file.sql'), 'mysql'); assert.equal(h.extToLang('/home/skygragon/file.dat'), 'unknown'); + assert.equal(h.extToLang('~/leetcode/file.rs'), 'rust'); }); }); // #extToLang From 2287d334e0e92cacf06a19faf8bd1e67536cdc77 Mon Sep 17 00:00:00 2001 From: "sheche@microsoft.com" Date: Sat, 22 Dec 2018 16:31:44 +0800 Subject: [PATCH 55/65] Replace the with '^' --- lib/plugins/leetcode.js | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/lib/plugins/leetcode.js b/lib/plugins/leetcode.js index a2e17b8f..373aadfe 100644 --- a/lib/plugins/leetcode.js +++ b/lib/plugins/leetcode.js @@ -157,11 +157,12 @@ plugin.getProblem = function(problem, cb) { problem.totalAC = JSON.parse(q.stats).totalAccepted; problem.totalSubmit = JSON.parse(q.stats).totalSubmission; - if (!q.translatedContent) { - problem.desc = he.decode(cheerio.load(q.content).root().text()); - }else{ - problem.desc = he.decode(cheerio.load(q.translatedContent).root().text()); - } + + let content = q.translatedContent ? q.translatedContent : q.content; + // Replace with '^' as the power operator + content = content.replace(/<\/sup>/gm, '').replace(//gm, '^'); + problem.desc = he.decode(cheerio.load(content).root().text()); + problem.templates = JSON.parse(q.codeDefinition); problem.testcase = q.sampleTestCase; problem.testable = q.enableRunCode; From 1b217b9fcee57bb9d8df0f320b06689cfd45d9eb Mon Sep 17 00:00:00 2001 From: zeke Date: Tue, 8 Jan 2019 22:27:18 -0500 Subject: [PATCH 56/65] minor spelling update --- lib/commands/plugin.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/lib/commands/plugin.js b/lib/commands/plugin.js index 78a966b5..ca5a9cff 100644 --- a/lib/commands/plugin.js +++ b/lib/commands/plugin.js @@ -52,10 +52,10 @@ const cmd = { .example(chalk.yellow('leetcode plugin company'), 'Show company plugin') .example(chalk.yellow('leetcode plugin company -c'), 'Show config of company plugin') .example('', '') - .example(chalk.yellow('leetcode plugin -i'), 'Install all missing plugins from GtiHub') - .example(chalk.yellow('leetcode plugin -i company'), 'Install company plugin from GtiHub') + .example(chalk.yellow('leetcode plugin -i'), 'Install all missing plugins from GitHub') + .example(chalk.yellow('leetcode plugin -i company'), 'Install company plugin from GitHub') .example(chalk.yellow('leetcode plugin -d company'), 'Disable company plugin') - .example(chalk.yellow('leetcode plugin -e company'), 'Enable comapny plugin') + .example(chalk.yellow('leetcode plugin -e company'), 'Enable company plugin') .example(chalk.yellow('leetcode plugin -D company'), 'Delete company plugin'); } }; From 8dc0b2ab9b04771bfeef29f02e52371ff8f16db6 Mon Sep 17 00:00:00 2001 From: Eric Wang Date: Sun, 3 Feb 2019 11:31:08 +0800 Subject: [PATCH 57/65] refs #139: customized delay before next try Signed-off-by: Eric Wang --- lib/config.js | 3 ++- lib/plugins/leetcode.js | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/lib/config.js b/lib/config.js index cd849fae..a427b8f3 100644 --- a/lib/config.js +++ b/lib/config.js @@ -68,7 +68,8 @@ const DEFAULT_CONFIG = { theme: '' }, network: { - concurrency: 10 + concurrency: 10, + delay: 1 }, plugins: {} }; diff --git a/lib/plugins/leetcode.js b/lib/plugins/leetcode.js index 373aadfe..0ce3a66e 100644 --- a/lib/plugins/leetcode.js +++ b/lib/plugins/leetcode.js @@ -179,7 +179,7 @@ function runCode(opts, problem, cb) { opts.headers.Origin = config.sys.urls.base; opts.headers.Referer = problem.link; opts.json = true; - opts._delay = opts._delay || 1; // in seconds + opts._delay = opts._delay || config.network.delay || 1; // in seconds opts.body = opts.body || {}; _.extendOwn(opts.body, { From 694c42a5a3b22334fa1744d53a5910e32ffe0644 Mon Sep 17 00:00:00 2001 From: PoppinL Date: Fri, 22 Feb 2019 12:05:19 +0800 Subject: [PATCH 58/65] add kotlin in language param --- docs/commands.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/commands.md b/docs/commands.md index 2eda14a7..703f211b 100644 --- a/docs/commands.md +++ b/docs/commands.md @@ -234,6 +234,7 @@ Display question details. With `-g`/`-l`/`-x`, the code template would be auto g * golang * java * javascript + * kotlin * mysql * python * python3 From 464257cdd0c242e820f1b8237e3782e89f5ff29c Mon Sep 17 00:00:00 2001 From: PoppinL Date: Tue, 26 Feb 2019 11:29:00 +0800 Subject: [PATCH 59/65] feat: add php lang --- lib/config.js | 1 + lib/helper.js | 1 + test/test_helper.js | 10 +++++++--- 3 files changed, 9 insertions(+), 3 deletions(-) diff --git a/lib/config.js b/lib/config.js index a427b8f3..373b9f0f 100644 --- a/lib/config.js +++ b/lib/config.js @@ -22,6 +22,7 @@ const DEFAULT_CONFIG = { 'javascript', 'kotlin', 'mysql', + 'php', 'python', 'python3', 'ruby', diff --git a/lib/helper.js b/lib/helper.js index c2085134..8806086e 100644 --- a/lib/helper.js +++ b/lib/helper.js @@ -39,6 +39,7 @@ const LANGS = [ {lang: 'javascript', ext: '.js', style: 'c'}, {lang: 'kotlin', ext: '.kt', style: 'c'}, {lang: 'mysql', ext: '.sql', style: '--'}, + {lang: 'php', ext: '.php', style: 'c'}, {lang: 'python', ext: '.py', style: '#'}, {lang: 'python3', ext: '.py', style: '#'}, {lang: 'ruby', ext: '.rb', style: '#'}, diff --git a/test/test_helper.js b/test/test_helper.js index 6eb6e106..143bda9e 100644 --- a/test/test_helper.js +++ b/test/test_helper.js @@ -128,12 +128,13 @@ describe('helper', function() { assert.equal(h.langToExt('java'), '.java'); assert.equal(h.langToExt('javascript'), '.js'); assert.equal(h.langToExt('mysql'), '.sql'); + assert.equal(h.langToExt('php'), '.php'); assert.equal(h.langToExt('python'), '.py'); assert.equal(h.langToExt('python3'), '.py'); assert.equal(h.langToExt('ruby'), '.rb'); + assert.equal(h.langToExt('rust'), '.rs'); assert.equal(h.langToExt('scala'), '.scala'); assert.equal(h.langToExt('swift'), '.swift'); - assert.equal(h.langToExt('rust'), '.rs'); }); }); // #langToExt @@ -146,13 +147,14 @@ describe('helper', function() { assert.equal(h.extToLang('../file.go'), 'golang'); assert.equal(h.extToLang('file.java'), 'java'); assert.equal(h.extToLang('c:/file.js'), 'javascript'); + assert.equal(h.extToLang('~/leetcode/../file.sql'), 'mysql'); + assert.equal(h.extToLang('~/leetcode/hello.php'), 'php'); assert.equal(h.extToLang('c:/Users/skygragon/file.py'), 'python'); assert.equal(h.extToLang('~/file.rb'), 'ruby'); + assert.equal(h.extToLang('~/leetcode/file.rs'), 'rust'); assert.equal(h.extToLang('/tmp/file.scala'), 'scala'); assert.equal(h.extToLang('~/leetcode/file.swift'), 'swift'); - assert.equal(h.extToLang('~/leetcode/../file.sql'), 'mysql'); assert.equal(h.extToLang('/home/skygragon/file.dat'), 'unknown'); - assert.equal(h.extToLang('~/leetcode/file.rs'), 'rust'); }); }); // #extToLang @@ -170,9 +172,11 @@ describe('helper', function() { assert.deepEqual(h.langToCommentStyle('java'), C_STYLE); assert.deepEqual(h.langToCommentStyle('javascript'), C_STYLE); assert.deepEqual(h.langToCommentStyle('mysql'), SQL_STYLE); + assert.deepEqual(h.langToCommentStyle('php'), C_STYLE); assert.deepEqual(h.langToCommentStyle('python'), RUBY_STYLE); assert.deepEqual(h.langToCommentStyle('python3'), RUBY_STYLE); assert.deepEqual(h.langToCommentStyle('ruby'), RUBY_STYLE); + assert.deepEqual(h.langToCommentStyle('rust'), C_STYLE); assert.deepEqual(h.langToCommentStyle('scala'), C_STYLE); assert.deepEqual(h.langToCommentStyle('swift'), C_STYLE); }); From 04250608ea5d12d8eef1caf99b0d3890da15abe7 Mon Sep 17 00:00:00 2001 From: PoppinL Date: Tue, 26 Feb 2019 11:32:11 +0800 Subject: [PATCH 60/65] docs: add php in commands doc --- docs/commands.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/commands.md b/docs/commands.md index 2eda14a7..c8467e14 100644 --- a/docs/commands.md +++ b/docs/commands.md @@ -235,6 +235,7 @@ Display question details. With `-g`/`-l`/`-x`, the code template would be auto g * java * javascript * mysql + * php * python * python3 * ruby From fe9a9a916ca6a7aad05db53d21dc68f5fdc30abf Mon Sep 17 00:00:00 2001 From: Le Beier Date: Sun, 7 Jul 2019 21:36:39 +0800 Subject: [PATCH 61/65] fixed the row number format for `leetcode stat -g` --- lib/commands/stat.js | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/lib/commands/stat.js b/lib/commands/stat.js index 3c51ab98..772499c4 100644 --- a/lib/commands/stat.js +++ b/lib/commands/stat.js @@ -104,7 +104,8 @@ function showGraph(problems) { for (let problem of problems) graph[problem.fid] = ICONS[problem.state] || ICONS.none; - let line = [sprintf(' %03s', 0)]; + let rowNumFormat = ' %04s'; + let line = [sprintf(rowNumFormat, 0)]; for (let i = 1, n = graph.length; i <= n; ++i) { // padding before group if (i % 10 === 1) line.push(' '); @@ -114,7 +115,7 @@ function showGraph(problems) { // time to start new row if (i % (10 * groups) === 0 || i === n) { log.info(line.join(' ')); - line = [sprintf(' %03s', i)]; + line = [sprintf(rowNumFormat, i)]; } } From 9a0e155ea7f095807366f73348df8dcf69b5d1c0 Mon Sep 17 00:00:00 2001 From: Sparkles <34909275+SparklesCN@users.noreply.github.com> Date: Wed, 7 Aug 2019 08:46:02 +0800 Subject: [PATCH 62/65] Update submit.js fixed bug for "[WARN] Failed to get submission beat ratio." --- lib/commands/submit.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/commands/submit.js b/lib/commands/submit.js index 7376598b..56f5ed04 100644 --- a/lib/commands/submit.js +++ b/lib/commands/submit.js @@ -76,7 +76,7 @@ cmd.handler = function(argv) { let ratio = 0.0; for (let score of scores) { - if (parseFloat(score[0]) > myRuntime) + if (parseFloat(score[0]) >= myRuntime) ratio += parseFloat(score[1]); } From 4657db67d7834a99aa5049691d5e7d5ade3c157a Mon Sep 17 00:00:00 2001 From: Sparkles <34909275+SparklesCN@users.noreply.github.com> Date: Wed, 7 Aug 2019 08:46:45 +0800 Subject: [PATCH 63/65] Update leetcode.js fixed bug for "[WARN] Failed to get submission beat ratio." --- lib/plugins/leetcode.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/plugins/leetcode.js b/lib/plugins/leetcode.js index 0ce3a66e..6624f6d5 100644 --- a/lib/plugins/leetcode.js +++ b/lib/plugins/leetcode.js @@ -336,7 +336,7 @@ plugin.getSubmission = function(submission, cb) { let re = body.match(/submissionCode:\s('[^']*')/); if (re) submission.code = eval(re[1]); - re = body.match(/distribution_formatted:\s('[^']+')/); + re = body.match(/runtimeDistributionFormatted:\s('[^']+')/); if (re) submission.distributionChart = JSON.parse(eval(re[1])); return cb(null, submission); }); From 183d62ddd54ae8707fd7ac83829b2233fbe10af2 Mon Sep 17 00:00:00 2001 From: nnnevermore Date: Thu, 19 Sep 2019 21:55:41 +0800 Subject: [PATCH 64/65] Bug fix for Issue #177 I encountered the same bug as Issue#177, so I created this PR. --- lib/plugins/leetcode.js | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/lib/plugins/leetcode.js b/lib/plugins/leetcode.js index 0ce3a66e..19afecf4 100644 --- a/lib/plugins/leetcode.js +++ b/lib/plugins/leetcode.js @@ -261,7 +261,13 @@ function formatResult(result) { x.expected_answer = result.expected_output; x.stdout = result.std_output; } else { - x.stdout = util.inspect((result.code_output || []).join('\n')); + if (typeof(result.code_output) === 'string') { + x.stdout = util.inspect(result.code_output); + } else if (Array.isArray(result.code_output)) { + x.stdout = util.inspect(result.code_output.join('\n')); + } else { + x.stdout = util.inspect(''); + } } // make sure we pass eveything! From 5245886992ceb64bfb322256b2bdc24184b36d76 Mon Sep 17 00:00:00 2001 From: skygragon Date: Sun, 29 Sep 2019 08:13:44 +0800 Subject: [PATCH 65/65] Bump to 2.6.2 Signed-off-by: skygragon --- docs/commands.md | 4 ++-- docs/releases.md | 4 ++++ package.json | 2 +- 3 files changed, 7 insertions(+), 3 deletions(-) diff --git a/docs/commands.md b/docs/commands.md index 0908aec1..1893dbc4 100644 --- a/docs/commands.md +++ b/docs/commands.md @@ -467,7 +467,7 @@ Display version information. Short: $ leetcode version - 2.6.1 + 2.6.2 Verbose: @@ -477,7 +477,7 @@ Verbose: | | ___ ___| |_ ___ ___ __| | ___ | |/ _ \/ _ \ __|/ __|/ _ \ / _` |/ _ \ | | __/ __/ |_ (__| (_) | (_| | __/ - |_|\___|\___|\__|\___|\___/ \__,_|\___| CLI v2.6.1 + |_|\___|\___|\__|\___|\___/ \__,_|\___| CLI v2.6.2 [Environment] Node v8.1.4 diff --git a/docs/releases.md b/docs/releases.md index 7b78a5f3..77cce5eb 100644 --- a/docs/releases.md +++ b/docs/releases.md @@ -2,6 +2,10 @@ layout: default title: Release Notes --- +# 2.6.2 +* `submit` + * fixes beta ratio issue + # 2.6.1 * `submit` * fixes 500 error on windows. diff --git a/package.json b/package.json index ee8f2414..a9af9f7c 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "leetcode-cli", - "version": "2.6.1", + "version": "2.6.2", "description": "A cli tool to enjoy leetcode!", "preferGlobal": "true", "engines": {