From 7e4289edcb26ccd82ba5acf650da4028a23c62bb Mon Sep 17 00:00:00 2001 From: arunmu Date: Tue, 15 Mar 2016 21:51:24 +0530 Subject: [PATCH] Code refatored - enter streams --- main | Bin 106170 -> 67064 bytes subprocess.hpp | 236 ++++++++++++++++++++++++++++--------------------- 2 files changed, 137 insertions(+), 99 deletions(-) diff --git a/main b/main index bc0add85f095a657af3228754ad6faf60ea30f63..f78d3efb86c9f57930421831e43e5ee80fbdfe2d 100755 GIT binary patch literal 67064 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%0A{S!2qBmG{v*#we(W0Ma$v0W_ z8!URWML*l3M=km}7QM})pKHZJSx%UqILYNh-b%Up_DYNY%K%Upt5s-^q@%UpU|)=2qYmg&xxVkxg>nM+Meo|IRz z%q6BJN6IBEb7^S_N%?k`c~_w&Q_2fi<`UBql=7`Cb7^Twm-2L$xumo>QofF5E+s8( zUx6@iBFkJtTAHOimgQ4fZj|y!miw?=C*_M-K8@vCDPO=cmxz`cDfeTUOG8Vwl>4yE zC81@FlzXszCdGNrtLWv1AcppQ)i)KbSWG#_h9NykOH6XXFh!1IYh&*amrI$zmIyZ zvVXEdN8{X9TT9X#m)s>y5wMO0uN9v>Zfzx_w z4Cz6TUKBHCU_F=(9lOGj^4f4@)^;?3_w~^+$OPf~tY-Q)Tsf;bTse(A$Q&ZO3PT!> zWJSXjtD_y|Va2JBP7(6Ha8*{Fszjyr(M!L8bk!`-s9da?Lj4p2I}^34TQ*5cPY1dwujn zQ3Y@5at~S>L2v1VDtb|zFaTtX*GxsKkKUogqPp*BVjB7)4!=$MI*Z*$t5Um&M$$`Y z@E_tGDz1;74AIsHm0*4JQ*t7Z(vtT`8w@3k=Sa#2;QrQ2EYH-Sit&te@qW=Eo;kn~ zX5ESdi?nCpm|$e}u}Is-tY~G{vE2-ryoc{>qHLIgeS+|O5CjzZ06@@3h zs+@HK;=G~cN^W2zsK}f!lOE4BW@p2MNY=|0t6z4?N}lI396gCc9@!s#6|BjXK}i0A z-Fc1Vs#$+Pxq0taCK(XVVGlr>LXee-k-2`J?LvR$}ReLp03-&+xK_SSA> z-FKq@1f?>oaWD5e5IzZURhf0z6u-b?2|e&{PKux!oHba1;Ffx*l`<8uQ-tT%?Wed8J-E(BILlI)l{F=4jUXKjPRE5xU8nqtJT}eSxw;~ zFYtYS0|uu#9M}iXB646Z#~;qGSbd_Sy!$TL-qCt8GDsk+z4f=Kp`1-m$Fy^t?daw( z3!4y$&8|x4-=4}r(dp<|rBl(KQhr*+>h=+L>qdeVS?z(=4AmkyCy*&CvyQi>N#n;` zf9|%-;Hl5zngd5pYi9`2)yn+CUR!0osHF^AjVT7}Z1rnF`aETHHJVXj%Hix;ROxe#CGijxn* zJeROhSJ3sDw5d+lCl}(Ey5i)6a4rZ|AMzxRB8%ug3`gsHzjybB5XEo&7u~au)Nn;z zcsFnU={&eYjnDQ<*K}Ht4|wD7&CFq`A*JLC4w6E497&FY)-* zCrArZ{rPW`KSXN`=W`X3b|SB;Y;W}Jq+FmH3vq2)%PpADCYjG-I=|=GiWIi@+zO=m zf^cQZKyK$@chiWvXqsg6_0?Qos@8K08LoP8oj}zZf?5Y}#}yA4wwRiC-y@@PJypZE zY4p`DSi^1C<~mHs%M4RefZOwDa77f3ykMA8Q|56iVjy}m{+ZB(vd0m>tf z0xQ?kL^OH%KamXA(`*z5qo9_md7rWa`=f(^vQ()KLS_I%t?EJ5-}N=9xVH{LO!JFq zewEO?Wh;m)Qca}HztDtn7mD4WKX&mN#g=1DE+1W4MGGq*6u(yfMtr7y&UR0gCd4EZ z-@`R}%f|?p`t=)8i!Zl_Q`*G(M$l!ce|8N$6nXR0@Gq20!c|pd?&duNmC&oW9+$ zPwy6Y8c)}v`rendr#qw@>q+xGy%T2xFor~Wx>Cs)uWW_>SWmwMin5_t*5C7W&P@Q1+nF`HV(!g*68zn>a8 zjMi#&KlXo&Dca2?n+9HH1K5om24+X1*^zf!-iK3NIpcJPfrTgSU~O&j6Z zx<=(qy6!DrUBt?(;fl|b%aU3bu)iOP$ogIEgV)IqvGaI74OT|Kf@W@DE0u`a;r$GU zKfC$7$6nr?VdpM_8t%X%uSe%dW6j~nkyc#BebG@S8RG+K2mYnL%B-e>@MS7V;h=0K zY4;pp3d8r8Od5lE+DrLk;OhW1^ zgPaPZ2Gw#6zg*1D6BD;8&ac{wJ`@i1?tOzMB`uUM)K^^6>Ro_9c_SAB@|$!D+Fmu9MVMa+fKUv);3`i|b|_0@8i7oebS3KUs1 zcUO02JQ1=@EwQp3Uj|-`EQyeP(vz(WrGfB6kHE&mtHM=T6|#F#8;gJA(9ddf;~MA@ z5hPJZi5!j-k?5lq?xmE-uVO_)vMnEE=_MuU?ie?4gZ^bSru8*!on0GhRn^3#yJPxG zNhsJ8r+~I~QlN-&3P^;4Z^tO;y)zWx`nwa%=Tq<}dOiFX$=X!0dQ(Taz5w6IvBO%M z15}}1$8fj_p{EZzs`vg)hxS&wzbdQRTVHR+SwAVPGF)+``b21p4eer3>a#X-i(Q$u zaa`7>)fZ^DAR@-VIddoWTCaizC2 zp)IzzYuS#PP0BE2>-uO3_x-N%Z^9MvGJ5w9**x!>p@DU8H`ffYr%y{j)>o>v6#In| zXa=BE~VD69B0<97Il^CrK;`Vmv5j#OmIGOWCY$xK4 z6!!Bz#g!3z4BBExtPzywnI@u-zt1GBc3dj5XQHOJ-BRbBd1BW)(M3SD*J@qt){+Q0 zH$kn7b*+(JtGemu2jK%*?

JaxVbb{LtwW!^5EXqk!wVrqP z_MY3!K=%BtY{B~0kFp=yhz=-rGtBMMiB(vdaFdSNiJT|^;*b3fdY$ZEIh zDPD#xh@2BA7`tDEvYa%i!Japi7QXU@G9KZug*05ajlZ}IOCEV5BV@hf%)%J0ufstk zo!y!$7menePVX>x7sDB%E#mDyJGDNmO>6wyU*W$fhm!`Nig#lp3^yPFme)mQ?WxS# zgK-*MZ#))R#?kzI=C5j(S;b`&zW?Hj~Ob+yiq{<;3j^5Q~yaWx3AlS>_mG`KC zEQ|NM>y#mAH9h7?eHxhRNL_E{#pjZDh`Crak@U=(*uOVb$4$bnH3ekqP5o$ z43+8ZbA*4Rv;eVUXt*Ho{4f{_FnP-xA&6eoM|uB;Zr}_@af1|j$HnUTcSz(}a>aqc zi7kt_6TziUCaIIFJ4}!hSZi<1(SX*5db!6g??NePiA~k*u0d4nok*9PTL%wf!1Sit z>^l00=k`aBU>sCdm;LQqB%2NO&t+UO-fFC@WB+Du(DWGWYL@p>{bhzx%(4F$tP4{s zXC1}$Rm@rbcTh2AbA2CWk!2qO>do~JX^*|Pc1KYr3gegIZC@WnW*v**hL6YR+e#4C zG^(5xjpX#S>rk?uX^59OozB4(N7U&9vHftgjtlqtlRC_KnKfoHe2nL#s;W6rj~VMH z6YBf~Je;AUQ&Ngj zV7+zwA@;!Q?5~>0<9Ka_qRBrd$56uEdK|?ivea?!9Pm^{QL5p1#(MGFut)iE5z9?q zx#ig`H+bbR%e%ZXx{1BJy4%QcfM4sQK~G;A%jqb`O=tK)-4epO+>EwSmXm_@e__+S zU*nScyn|rvXSr`5WmM|<3_KCFCV8iXW0H# zmdOY1n8;YvM<>(A5q(|~=CXn%0~E>2mzx1Vqkm9J+&KfmxVSe_=dC>HT%E>4XB*Al z$IyvuO11NE9=J)%SkS8U!iAaFdakLv-m0s*{H0}&a+?ZS8jn6y&BA}SE1uiUlUtbK z-S=`soNH+33Xzx!-lX8j>xr>WL^4opX79?S=!CD_k4Fvk)QFp7SmR9JWcASgbLSvt zCEd%`28(@(m?JX|ne5{Xt-cwRgC*Q?IBj=)fc01&SaHKK3uRS?-S~Th16cEoAFmsH{ zYV7?0?=$sy{&egCqc6W9E)juqZGqnFKIF2Yw_ZcYQnv}4WGfAQ^MZ z;i|sB=Y|9CqhWa>3Br<5q_IkDllQ%gm07hA$w}t{BR7y{-Ue0HgF-JgmaBG<8sntU z2B(WBdA%!XvQ&nfrF85}5s?fr7GAnSivKrqqD*c?xz`tX(#dF2d_%~;t0;v^VP&A5*^6!PXX^ny6sCFXd-%c1HPp)k7NSuf z!rp<)CUu7kUaOB@jiQYL;SMAzDTW}77!#z3XIT*c7G3%&w zk|<@QVVEQ<{!3TIxmHD++!J|TX@Ed|^gL{ATb`EgF~PXclGR6lVx-)@2Hd_He_Vm# zGY?vFcotFRBW>Cx`l+FNy>giRm0nrK{BGV!RKtsCuaCY9C)-NXNcRMPip?b)JVXW}Y9f((Fy7y&h&Fg9l-Ho|?t^H;!84x{#e9AaO%~H@KzNJ0xccZz$|9VdWHl)sh;>%rt1*`< zY9IJ3GDV3QAYl%P9U#!OI@!v+Cd(CDHk(JjZPL5N1RF_oDkoh%1`dP%a|mr#tZs73 zaSxOou8+=?XQkrzpJ2&Ey%ybSy}-z}eTnK3jvHNzev3^}Ql%q2HE|!Vz6hp9d%VmV z`=b-tu$n4wiVX+G*yo?>>JY)8*AwrIIzI9+8@=<;My#yv&dr<^aA#Jry4fka9!4QD z>Z3bk0fyN$S-SNHj<4o!7cLhon(vBiBUyqotGV@Qw-wVmW>tcf71w!tp&DJq^Uuf* zct%h?C^t=1AzXMGB~gPZ#~VLvp`xy*Tk9^n7Vb&YF4oGhYq{3MZ6bF`SL&nR1IBJT z)olv8K=chUL8klQ^(xKHQPy>g+tVPtAC=hit{!euj%w4pSI*op#1NCXu);GRScq%U zZWF4ZEbbp8cEZ(iRa76HBhwmF3qf6pPdDgkJ6UOtwq8MhUc*o_db}{3jk?jFyhxw# zkG_S0)nQgladiVg<;(a;VqY)_CNp89FQY96{s*xOC+i#>D_OC+&EeA#5;3sXJw`aD zDtWDa-KdVYOvSjWjp5QqOU&b6@6_#kDoLQ~*FSapK^Hw%U2Rhrt2k@nWiUsIr*JrL zc_liX$&XTsMNev$+>46d1%9WPmHx$e{aK|3kL~I%%dv?J$fh2ahFE{;QPjuN3D?Gn zJPVGf=vNW=(tkja@y1Coo-}c-)4DlNRn#XuX?a!VI2V*=hUN>BPMolJ){=o;rrJk| zz)37(9(w{8#tQW9B(PL;W}pcqt@`NoFftsO1kbA`ZzS8j86k~qcPi*}j3Z$cemfn`f1;WZpNjW+M=L%7ak4NgCVH)jR- z7kC6+kEhH%g{rG~^Eq8+zG%>Ga0Qk)dj?xww+|*3>Unjh+ccpW$>Go-;<^u zN~&E}Ymwy!PDQ=asI+y%B#T=cFwMMJA7kb226YjI99}uC5tcRSwt8@)s_j=Z4276@ z0U{x};m!NjjWlsZ{n%oY_$fK`a7*s2jj6slPpX#F>49$pgt1<}cJcBl=rW#vrr{S1Tt(URZQ#fJu zx+U>bf=|{&Psh>bInnHY%aCWY=`icw@%ond`xp*u*NHu zCpLOL_~uLA)mfYe`DAiJ?=oRPp(H+Qcjwa5gr(9+0D-KE_0b<7>Y*^v73o)U)`gLC zmm<8iQnXH;KDGJ1#FnLuQ^bJYk@@bkex+)~m?HrayP1fQidC(Bc+%gLhhr~8pYYdJEf?y#^9xee^mh)?3Oi!hcJolHCmwrH{Yz0PX?E+;E7kugWLB=Mtl#p{u^ z*t+_{%)oGPMaDIoWhFX~t4&T=@VSUflEvc9fh1ssVJ-Ke6f+F)y?a178}?Y46D+Hv z(jzlaoz(b_=K0VWGn#q>htYj*zdmUs$| z_RfR0(Qz_vbS(@Jo3@&>RN3*l=Rv;&Ir_!3tg$~jk`1e^QN7p@dmiM@0Wq8kRI;IVC@%0^# zpts<*ZhcK~h9#6C?|FsxXOD`g$Aug|QOfx$c4`kn4EH28Rc|O-PZo-|>(CjT@seQ; zf%to>d~%u79lgerVzRN4dzEAHw3@lhb@%01c{;y0*--LYeY8;q3j?Qjzc_4i$3)$g z3c6OvO=%A5!RIsKz3BaT41`@xqcJ~HiV)v8L&juQcQnQ92Y52;t+4@^Ew?nq^2c!* ztgb>X;*^R#yIhIWgy{V{rFyh}7f~9RL(z%@LAgm`R!+}Q?Voi}ZHMb+%rOyWXGSnw zD6_1O_JA9wnVma~Pfds}?m1zAWRRVB%+qL>IiQ}k<+jng%Ju@y?3ukqKjAjOUCg^) zFZJj}ySpoH+_)YE$DLboybI75i>Lf1ajD!D`(#>BK5=56OpA|83BT5?nYAZY2H2;;X`1q(B zD&U?=ds^#TW^Cx|!EwPT;eQq$-g2FNP<_ZX2{W0K@nq~)Wdty5m=Wx!YhwC#NH_dA z(Au@RamS?9#)N<63#HxoUN+-qOJ_n##MRv|`M8{(RNwKGnu|nksJu(|8n!M&YOObI z|7BCR-qxx*BkjlRiXVWG@t_&!1Xpt6fA7$XnLOqY%o}Q}Ar&zpxj5#AsZD>}Ne++4 zsD|w!-<`fO#BL(c(&Yph1EkLK5O{a~%6(D>106Fq$aD;NiO(Dnv$f)zp$zj=LIikblM1OLe33KFM5PzHee)ra&)VK{C7eT&dpvOYxw{z8hQhbtxiG zRpBDfyHfpvXX^;}*eg|jW-IneHCt1>E7h@}#9XOzusTm(>#B3PnBXqtw@ERdb^coAbO{rk+;p~$dA0=C9DJmNyKBAWsLFaXTvd+H!Gn`r>d=8o?Ie|mCxhJbJ>CSPw)Z_Frsxg$COtfj%g@Ou4=aPk8Lu8Svl(5Ron|cVVJt3h z@}_e)PCPS0F%S4^AMmC*`$XGiVJSn6mVGjK(;8TH_XIo=qnS5wtEcYBpl$a6Bydc~ zQHV#uu9Ftgsf%E#$^zokMRM$%DO_38$25| z`7>Toe9P@@`7jStu?<(p+o{o2Pe|YKh&1K{_{UIAv?s?;tM6a6v%QlKX8D?xV zw#yQu_Ds_)A9Pwpb`VRKou9s^0GJCXOe!_qx9)PuzFZEW+8B^JLWb2bpprbDX z#65%jY%4}3(9vZaRuAhvtscaa~ZTj>H-D}a=djWx#QV3an;M26~W z%<}BUi0V&gcP~>)^q|B?5)uU-)qe+r7(v2{iA#REJ)y5VUx(nAEUkWfo`vp_!iotA z=`=p6+r?*3&rm#8GvU}IbFxa^M`DBUS`)n0$WsB_@09bKPhm6i7d&b1XR>+*h8i8! zhX^q0bjj3+68CH)SyP7K>cc+Uuq{w3cwlDj`hUz8MUS}h0VyWf^?%p~AA7rg(<@J> zK4jsq_F4LFlOium(JF6R@rkCzB>L-Wgmg2-&^Fac9~=nP3b^rW^@>Njq&&*RIpfFHtjgMq1aw*hsoj#T6hfFVcl$ z&;~jqS3nKW+kkxpP9(5?dLQdxYQv%Vm5PK1F2xP*b=q`1RHOH5zaU2{;#(T|9^WpU z)>;d_QFWSm%QncW35u4a@26q^6y5h@>ewIs{3k^C4&SdqQTv&S_J<4(KVL=PR*;FD{EoE>}UXNiIe&JmTG3bZs>&gw7h+8+Od~aeKyHo3#JTk3=UnfBG(nv?Z(`fEDwR+YczKLhkIxB;?Ffaps%7 z24jvOBqgNu9I20<_%k=bzt65L#K$5&P~Tg&`FB*cKfL~}vO(FAkNE8d(_wMzSrm+X zz;Xpd@SQU3>{AR}$wKO@@yuCk+{i1>)bOIv+M6|t*BC#I;XqwDz>607oaeRBYP`+3 zfM*lLgoO1h*iJ)$RYg{JaT z;`=7>Ykl;62w8VV-jGKd-TYFIqIYNHbu!IOj+hCkTl^aY>=rYv(W`?y>e%835K=8l zet3>bWepO0o<`AY@vtx@E3)6sI>wIkJ`dLk|1Ye-gu)29m%j*c>lQ!lLLA73(mrj} zaV)#0d(m`kc8?h#73`lu2p_Z2a(c{pQRSZFrpHDBOW>Jv1wFL;@fYF{v6D~E`? z8}2|PQU3=CHv032sbhciuRkP053Y|Xs`dqDZ<*nCK{q|fjU&ufod2+hFL>Bohl-uz zRZ7|M#`0n_Z=xx_l_M%Ot>iXz{S0GgB(~+)B zxQN4~BHuJP63-0E-cFAun|{q|S|=gZ-3d3Fg_Ls*!;8(PPQx&%BfD}iOnisqbUmhB zc2)U1SX3LhsN!tSiC(jVeU?SFS9atRy{@j=0;;Yy8QpIk?5(lqp$5N%OtS|{3`y*a zMFTp8Oqe@ip1Jet<;+ABvr58fZwi0i0n``8?je+XR}pNHnS3@o!8G8qF;xPMG2_>6 zz8|X{Sx1E7s3iEm)19-c9`aWHxK;Q`_}SDwL&WTr)BY+jBUJ;bPA$Ck;MZzlhls_r z5Pz+XK75GBGds0#*Vk)ddZ!k|?ut4@e0}twY-O3pu*^-*h<&P0B|PL*xLV8CQa-{* zaX;1*>amaLFJ#`TX&-~!rpN0FKC+=N<<6l?b?RuPxYVwXei!etMYVgc*6ggdy(=Oi zG*lmb2e(;pLDkPT8ebqTysLomkM?mMqbmp$RK6Gjar!mqT#pko0Znb4eO%szZ%l}E zOt^V!>=-ucq_c`OFXA=EG_!42hhv)|0p}x z{9aIYC?D z;rvBKiwlDCe)$TUS2BO;ZTv}PR4Q|ZUs{@9QdC?vymS%!bIW%_ zgifz9xGm1t4eJ!%tFcyNv&QW8iceX-_@gU)@vGSQI;b)J_uTot=X~)?(D@py^~K8# zMwljgncrhSI!EzMc@4fQoUc5s->*J?VEM}28O6Eysc8Hfa{+#TeQ_avm3eB;nB1v1 z=1!TKjo*zfnt@*w$FD3e&&sxc?t5fz_A)rRc-i8j{JXM7;%C0`GVM0%cFph4lE)W* zoEty)U0kv(zp%9QiW_HS@i*8})6{cxKTW+D`4M9#;Rm1#3vyI-Q~BiSv7#F2gIHi(r2fzU+~&x;S~XKO%QpIezk4ey{t#HoZmb zaqbO?zPM(bz}d;;_zeF_Y-cj>@8}qePadrKen&?;Xv;TubnrXdHv!v#j|0>3Ihsab zCh#<5=yo6%r64}=^9}A8fKLG%fzM#+YX|nj;+%ocb#Dfa0UiN1<4Lj4fDUrv3s|v( zzzx^{)&N&xFJA|oiA(i1;3i-?zFG7DFcbJ5uol=K2T6^<@xV6V3Sc^ZS#UQn6LZh237-)0ULpjKi$!>2>smw+z31l+zt%kiHzCk_YJ@mz&XGzz!ktH~fECAL4*8xND(?h^K;CA2|;M>3)_@xC{ z3_K332A=y2>Y@Mpfob>(;eo$~zkrK@Ilzs;6~LE)HNYdlI^diguoJim=-_9fo&yGf zUjReEe!oHcz)OH@fcF8n1D^&q0AB(|fhjvNPWT4)8W$F>pDs8rTfn1?+*nc@wZdupKxNn33T)YoCSP z!0o_1;H$tjz+Su2Z{ToX9q<}pGw=qWgP&7b0}KKW0Yku#fO)_nIQLltyaHGQoDQr5 zj(!gP2Ic_M`Z><+z`?+Ez%cM}Ab+9qHQ+{I8*n?2pE+p&4gyAjV}NOAJI+$zVBjiX z7?`mS{RYkfZUL?U?gDNGHUZxQI`}=8Pk=#S{}*64@Md5hFmwRz0_Op@0~Z4ufE$5P z;77nT{BoP~d$bE&1q=fp1@f0N4*)j;KLla25tnt4BQSJ{YSJ53)aOh#w2QCCUgD{S7z~8`mz%cNq zK>mX1SHO+Ho^PVx2z+J#@N6>HJ zLSQ>^1u$bU_DH}nz-_?Uz`ei~z$3sdz|VlYfP>ybec2 zFbG@$yac!fcnfeB@Bv^Guo>uF>^Mn(f!~0`fFa;FfO)`Gz%{_9fHlCwz&hX=Z^LiE zY+%|YkOK||J_ZZ}p9d}iwg5K*`@I9d0WStN0H*S&O7zAzuhJeoi^MHN-2D^dNfi=L1e@DB(8-P*Zt-!S5 zh)>{PU?ngNd>qJMj6De42s{kj4m=}@`oK(J6u1DGcB$js0~`#j1%`nKfQx|LT2LQ2 z3b-A37q9_X1B?RefN7anuYrSs86ToPa3-)AxDr?mdI1WYjlhS2?ZEee!I6$L;vZ-ico%RH@Co2XU;}VF@F=hW zc<)DO7x)w~{W8ou;22iZ}s&16Tvx2&@Cv0-J%2K<5hR2L^!`A4i-4Cj;|< zTY(#aZv(djll}#N0fWFOFcX+I2J*nc!0Es+a50d-{QEz^jlf?3w*!9VZ4Ar;89=*nDGVr4ZIpy16&EL1J(eWfsMel@z`(v2mJ-E z1%`oJfs24Ufg6GR&C%_^*MJScW?nYPBcrr)@WFB^cBOUXeVms_}f7KW*7Ve;6I9fonhC% z$*cb!=$pasXY*%y{FDIJBI6fhf1$@80R9&6C)xGy_V|;*fA2>f9rJB|(i{<>4-3E_ z1pCjn`8Rv@*MWZl_(&CA|Ce}tk^?JqvSmcOCpY&GImv2V)i@0Rzc1?V2Bxg4$8R|3 zG03V&PO4RUD3gu8}vpLV2pfco@3DW4D4ORipEDt`J#;cp2^73;IE9~m%IF-;Lp6bqa!PZA9DHG z;5Q=<{QA2X{6k&vH-Wzg{6ulWe)fd@yTI?pe!kzSpI?}M9)_NW;5WZ`KMsC1_@nH8 zER$}CpZLu-+rammPouzp1boRO#*fx~nW^hzOYZskR!@JK<|pbW$6+)0HPG+J-vRzs z@cr~32LBVpgJ1pQ;C}@EA8h-Q4!YymHx>Ou9PE$b?{)d3z#otHPqq2kUjJr-KOB6& zd{_p45PU3^o_`S6i=jgL5B}R||2W3kjnm|hW#VBQ=k$gB&s27F908^{4Ix)1yDE88 zN=0h&iz&(&$WkAFxpGc5)^NOcWlKGKQ@UZ!cflV3{wDDK{5=``4T#H=ZT(X`{RQCP z(FK1U_;bMb&HvyJ?ZUnT;7{(tzV|eLylvl|o_#6Zan6bQ6Kwt}k3RtXwO#NhgTD>@ zpk4o)s{R1b4#5B9%e-A?jhD(#GH)q&403C~*U|AO*qgG^lAEf=mFhX3JJ8NyO4?=2l2-?8~RHjy7R51*7kg#1z9KLdWy z=Iik$f2QUq$`59IeuDbq_cY57aem(lJ#Tl>&K}KAl;_yacy#Cp>SIgmq-0p_l&QYb zeA=7R1F;7=zx84O_#c2jh!u>#=X?H|{9o!9==y&1YaRG$$cMN@^z;{b`nQ392Kb5m zN&63g-yM8E``-gU0KQ*5@dK$Jqkn$-2Y}CY9Y<51eYbe_O$MLiWaikqRd#ZitHTJp#JCZL~dp_7FV7(fAhlfOz75*CvKCe?!f}O^pItivy?f~R!eyZ2Kt1Y>> zb#D{e+XJ~o`JChRB>200_-tn=4BY{K4&J9swAx9!UO5eP>NyTQM6 zyV%n|8T`HA`_1D5@b`4l{yOlV=z_lu{4L=7?e`9V{{{GSZTs{FmVSN@{4qcG-`}U4 zhO=$({rock{4n?cum3lw{&O6*!N23dmwnbIYaHVCS&O0I2FSr2Pmew)qn=IRhrs7` zf;+Fc4>;jYUzxunBCT4vBy8FaCwUKTg2T{@@oe zk8HN=WFE=&^2h<`nfGL3Ju?2_=YXGRJtaTobewf}QGWpV*)Gq*kF!+A^ zp>^Po?1H~dx9_+AJOKV!pY}Q4lhOa7;4@FA?6CY8cYU@PazP`vE3q8?H3|nqeSPee z_yYf2@SlXN8#j#O$717n733a+T#hZL*DAKN75vwI(MWq(#@%^T)bYk$@s9Sqj`kHdKIdx0NwE(9GsiJ_n8fPXpox7c5}alU#qk4E~^JaIZ0juP&Tf{}}iS!S|cDJs~u^3;s~>uLB=$_42xP zA1xdF$zAXlgMT&nFvF{_^Ep_~Cj1%O1^-F#M}wbf*SF5~UIu>(_%Ztx#3NHZ^&i8Z z+rj5}yX(nHai93NCpNJ6f`66GU*YkGg1;SnKl`)6-_`|xG59s$`^C{F@GHUho7Yc* z|1kJtZ2R;%KI7^ySLO~i zmaIlQPC(Ci$ocJ~`y;VrcVWkP@TY^1<~%#B^NTs)-w3{+pH_i?3;2G1*b4sb;Nx=L z({J53-vj=w;9qF-=XvpZ6#Tj1`>g{fz+Vo2SNjge)qo(@`yKy%Uy%*DNs#kfw-$px z75qf&I@>vh@fZXCMcnWAw8l-HYn^S*wRS+y6~FOs=P>wJfuE?~9QWhk-wggmc<;u> z0?%)K&&T=*KFsm>)_LzJ@aKS^s2|in6a4GIUtrfyQU_xa|KM)||7x4B_oMW~ag56o z;D4M9KV)|D!{3r&D)sDvo|0$%^T|>0=XJq9K|8_si=X~T5Yxc->*sjz$ARyc59feC z8hmue^P_bic$Mb+>E8o4_A# zw{PvU#)F>+J}#TQ{@v)s(H!t+g70VlD)5(s@3)WL3jR9qvuypy=ifHt5B|@=_nU7= z!LJ41&;KVh-*5c-BN%^y`d8WQ>-CUvx)uIw0Dm0br_8qER2`AAmgLz22p@%<-+HhP z{CB~>krhln*B31u=WXEk+3i0c4}hNzzMmi71OE*0{qjKy47(J3zdStv{ITHs#o1)= zM}hC>#{%#(yWp<_{}S-8vHOp4<{nh~5B_!FPm1F+WuR-$0q~cA-_>;=<&Ht_VaR32 z>4|@yrY{`%+<%dyUE?A5SIC9q^zn#@{5jyC^gI9gw+j4z;QOtgTfxr&KhgYRfBK_8 zJ;8qp?^EVj@y9*SPhbRP@c%vNc>r<KORjP~Ug|Ke%iAhJwEq^%La-`X?Lw z8t|v#y*H1&`(}&5KLoztzH$@zN5D^%uQ*OUVL$l`@IGb5OCh%nj`_gkkXgI@x^-?$fmKd%e^ zI`F50-@|S{%ZuM_;9mxQ(B@nBLl0;^rh{j{bwBn!@W-HjqWmTCkAUO1`_H!Pt7}jF zRFm@4P{=LlLQgjMbHJzHT|X*4x2fJJJ!O#l8RRhBo?O1y-_79v5`4dPdk6S+UDQ7e zegpVHTfgP6`}uPw_(#G2Z~j~bxt`DY z?+>X;e);n#_?h7Q<*O6m2fG9e7|uzp!F|=E$+NanlBxo zeeZ$)0_yw4NeUK>=fR&BQ(s;1u>Jt>zXU%~9KglSHvDM?zXtD9p0xaU{e8(*DVtI& zx+PUBZ|eCEeRKBu-?!fk{taF5cYuEl_=)VHy@$ac27V#ld;U-fk^JM}mw?ZGtIOAW zR`UB^igQKqv2F19%AK-ai~@gi7xia?U)x3fGVnhtPJI2x_BVt7P#5}lfd7n-e#Z4E z^lumV5OY$VwZ=o=BLrFcaRLH$kXuZGyY8t}O*{JIpsnZg9UW6*_!Hc?8V~+R@O|e$ z_(QwkuL6G%_Y4UlC z$(Xq9(38Y=tXD@z;50rfd|m3p0cURN#(?v507VD%vx`#KCpoK9{}ynb3h-@RAQg}M zK9U4J+5LfQ1F8QCI1dI=@tn`^0vF-^y_((orqm+=CqETm;Zqe@CN=tAjT);{-wHVQ z2U1@OIL`*yL$H#I0y73R1s*#ouq!F`!S2a_OiKN#Tk@Al`JmjFa_w)@QXflAJ>0$f zZ&OpB>)!qEsi~m+q+4orTKC^{OZ~ii_xHPza=cqAxWe{s?&j`JO~mi%pJ zb>87Thu=ZK?<)u-(e~3Xf+ZURwD6GtO*|05fn`T>Vc?tGK$hQ^{Nc%gzoeud?UDR( zN@_!oX(|3lgQ_oMfl3b|WS@l^Q6q|_g! zIFBYzcrV$hO0{a!{(*sh7hqPb4P5bNQs9HYSe(@+XEi1}Zzn?#&8t^O@>zjX>46(k zZwZw4SnX7D$Q9eQCHb7d>6d`~t%m}?ObYxysmCix&R;mTadNc%>$WShX9apMN?jJX zH;{UN!1*7qW$lOL^8=@cQr`(AXQv(tB(F>AUYX=PtlM2}>>n67`--h8$bhMfHgyj? z+6^83Rrm8>>+UpncP%vf(B37frGZGG$M*xykK@|wc^>4)rcQ8f2BPn2*QVa!Ea3a( z(*vi3Qoj*c(&J8Ny;ln|C(Ta%mUACTbk_gA{?`Nl>w&N3fxL4=B6nc4!jLYT%4Raf zMM1F85SqC*!P;yhF;DSHXsm;908ZME{s4@8s+Y@6t70_5^s}uKC( z`PWw+Sh(<9S5k=JV8+X9SC5cjH&t}fl2y5fF8@;to~+9m8fA^w?+MA~ePf=yGi!66 zRxEpIaJp+bJQ5+VU424=hTeRtDjU0-go|@6ji&vtI#hphw0wsy8#~%``H6I;Pgnnc z4rzz-61H)(9@m8$muuXh@ga?mYuu^vpvE^eexUI)jotc%q`fmV4$?SU;}nfIYh0*t zxyB6|AJX`^#+@1uYJ5ZE2O2-q*zIiHzQ#csM{As-@n($+H7?hRZ^1_nRqGd~C z3c28w6fU063i@5~Vtl1n(b6LP#dj^???M#7TUIc?Y`!zRa8d5UlKD#ta~Bn$t|>uj zetvG@iu}UjvRs(IxKQcHonKNi|1PD&yuUpk717@OB}MtDw+v0-&v0p1wXvYI)ESozj`U9lo{fVzX87zEUpWhZMuPsR-jRKBbv*N8;H%xw3Tx`Gb zhHHeWZ`P4CosesFg6DF;zMJ|Pc+c0(_)k$&->gf!^g?9TAvQaywSKFXxC4_Hzb_&dzApc!_9uhx4#oiyMEh)ArWtTP}SPR z32ME}_!&|i-q`i|wE}#tsuyr3#MvL;{%a8Hh5ts(>=UDZRQ2Qi9pC=j5bJH#H~YwT zT|ZtvzWgET(tgvvWA;IZK*TFvKEC`hWEi`qzS&2m>H2L{j+cpVQ{VKf9Xz}J_E+*K z?zF!m;M=~@^CiUW`i|bmI*qEn$>XZz^~cobX9(>2V_wS>(J>qtyo{Zyvik>(V zMSR6ususUDg|Bn*e=`0XznT2S`JJf!H5sayb2k|KV!Wm}|LlmRsawE3ca6mYMkGWYWYoCK1J(KM)ITnYE3u!Z3yVJ|HAV^BFXOp;%l0wPYZ^mZ1U?` zO~37YMK^i-NlkxF)A`*ye7&aWFI*5}(OD#av6t8Mi!Tfbh5J*!g2~FBZJM5?$j&rP zA38iF6!}aX-rWm2`?V-;T&lJFhS5s?YN_Qob((I@#mqSo%}o?1{}lbFIxFJxK!?yf z&kHt_NYBX_h(Ln*d%g_NX`S-MNKH5UByGNvC3-sNjT=C}0OR=bw?iVzy%t{)(1Qu` z!)7gi?ADOTy(oWi-&fPOU9adln*LYN&xfC#h@xMp>1nB|-NjnoWR@|S{?#o?-uQnJ z=+tAr&)J-_RcN~Teq`?T_Yx?Ko6y0o> z?+4w;XistWZaMEcJJo%XaXRC+GZ`p0Vek#8va5KZ4;=+`Lvm7309;H92-Z&LKR znts7aivHnMioRCU`CTWJKa{WNVNGw;^vv%lx*6XuK~H3VUtCvH&(LfoZ|va@p_5)v zrsxB;{^OcHGo-)~|AMApT%_cU|3A_6&lV{9C0hP$1Rm|FxzS+2Xy)^e!uq(E&pMhpI2)7I6YnqwEkaedN4<| z`vXnqg%0hRdAFj^*7RYZCyK+6mhYkc47Ktq)%0_9{xO%&Kl0J@oR(;w2~_@bu&P}3jN^L?78|5?-T)$`>>O}_%2rT%#O zgPJ~PZb&4JoiA(pP8|;>uKuIxM|B=B@|mY8{p)m|G4t^eO&_o0=WK1yc1=I1{fucS zueUY*+N_Y2jh-2OmHzno_@JggFiFXq{IEmQf0L)^w}>`82Y$NJGi;Wk8~bn3^nP*n z)M@%)?ay&q&#*I;p7uhe$MkC)=x|Y|R{`k3PE^M!^`U>)N6$|{=Qs}6dC$zRgPIct4c`zrIeubt#66gPwn%+&vPo|?@Kh*R*9k<5M zM>Ku$)k?pS|3cGy%~SN@T2Ce%$bFaj{SmlDUiW~WXj~o=dgtrwt)R1C4{5*gyo9eq zK6;{BK2#DCxe@Z$aW3kw^knLMW#)Ufrq9*+&5TP6=!xv?g@u^*9M|Jw{4+_@uhMzU zKv65^c|qH2sHnC_7=cyndtUt8R#;zpLqWGZlS^5_cxTA++a6nW7v2@O$k^ ze|v$VoBkfs^jXUleWs&cX)u`k!;P=y2_dA&&Q+jO&ue!n%2k@aLen4B`PTUAAn4}3 z78PjH@=jRk8K9Z}*7W#%(l4mmJ#mGS->v1xYWk|H6y5l37U+rEEz|OEXg{0rdIEID zr};e;EQ|8m13LQ~um4R=|GUmJ^OU$V;(Vp2E)o*TrJ7yveV}oUdR=m% z(mz#~fa11mdXH-qJ*ddeXe{Wo zCw^RR(eww_D|w_rdF|5l8EZpQu93g^o+r=~#b>*g-<6}}O?(c=Lcn(aJX+CB-O-vp z`&LE2TE`#E%s8&o^raysKS9esrRgc-72V{MziRres}y~Ps{hw`Dc=rKYy?q-`57HcK2)g6ws;vfm;;a#Pgk+9)DfX2OXjO?&cKG`cwC5zP$IO?fG=1kcmHcH|{)ndkf4zMPkR(@m zX4?=FW(7#HLW^}Fa}1arhOWL_XU+8F%+yTJOuMTk4YEW|byaqENp($Cb@z-U#7F`m zu%y6%&0&mh2R4Ug;dMBK9hNt+gV5T$HV9C#T8zD7jj;@}W92p2q44(~FZ1Qg%&O|H zmMawM>91eCe8+$P|9g3j?w8T;MpE<>MwWYmThqB@y zx?1oHxHsGjuJ~Wi2_EVT#ZMlL_jBP`I-TzZett?Eauzs^^B$!uvv3>P>A4BIk z;A!m-Yx^hek>_5no&CDv&zur`pW;sfC%gBHUpmRi3B}Kuk>|R0#ZM^yJspo(|C<#5 zn|J5A2Q$tG6o368!7tGMKdbovyEl&i1@N?aJ)`a2_>6}QrG0!{?Vl^P|FYudJ&$Jn z|5)+oH{`kV+Ww-eq@SPBeTP`%PgU{iN}hkmF!=LP#aHI@{JYVEUsC*cYl53~IPdE8 zd0hdV#{U^-e-A4D*rxPj_VFIY7j%Cw;-}-4G>U&i<*ixgOCdn0|6OOKA0t=qRs2GI zuIc~xffIe^l|I2f{CQ5>yYa3)*Gm6xT=Z8IcjHcvDE>c{FW#*E|CQp8bn=WCzT119 z^zX`zP2fbg<~@_I)_y*w?Ong=F~t{VrGK+8|DgCK`vf=ZHhR50w^0(@jOT-jyK?3; zieGbsw10R+J|w#_8H=72rfyd55k}Y5R|_=lT0)zdoV3n}2*9 zc-lC>rtMvO=Km}Hoh9iX%gdjW2W0)9Q@s!<-U3eay8 zxZ}^P;%~T5aI-J(SNvL?*PFHdA1Qw6UDDpn_j$$Lc+QU=k>`H*ZfS4m{{h86b~=uK zUGev-zBBuBF%&fI@2)jz4>O5B_bC3oyx?ZtJ_Vfg*Xj2NZuIrPY5RY=N^mo;YhbuC z9Uc?h$kn?Qck^q%51jbo?4{Bk|K!itwEeR>{?91>)??ED`FG?QK{Nh*Q1MUdc#NKX zT=D#3p4;t}<|F4Emww##EF=#hZR42r}Ts6<O z_@c^T)Boobziz+ubAk5rkBa}f>N~TZ2Y*ufcjfa#ivQ+@^n-2U&+jUJ{&B(YRQ&sj zKcRZo$f!e$>GJAU#$PdV&g-S0|E~Sq51jUW+2OlC$>`_n+J2)V{amR1>?=w?ZoImw z_@61ibhQ1KfSd0s#6SM8wtu^>XHNh4iY4j)3dOHf{4j8?XL#}?Bj+o=rtRH$#oda# z@yTCR+_ht$22OhO(&c_5B20;lzK^~*aIe=Lyp*K%*T7eev*X~9d1 zpL?V9zpiktS|QvASPX>Zp5 zWhbP6S5M`Dr|si$ZU6T=PBY)HDE`mO(*J+a@w~wOAfMu_v-dW6?s8q)(_M7*c}($L zKbhy>FX#W`o(|yW!|rnJ$#ZX(e(pab?e}Q=_bC2?$~`lerxc$!A?=Nw@FPDZ{nTdT z_*II#_U8u_ckRQ^0Vld`J$aHxg6Z?;+uGih4|{Hr=eqS9p5kx5KF{C3K)M-um*Q^S z%kL=e=DYtExS6|l!9QMdt33Cmvw8mA$fa8qck3d~D(=epXB2;GQ~J4xdxMSk_Vnkz z0XXR|I@3>|SM&dIw^K&@Q^1Mu+&JNXRotz^`EEu(FY~3J_uY}_C%#6Xdoys>r|%W~ zO2zBi{@b?-Zus$j#itGlZr1iwihufU!D06E=dzRX+$oh0#%_Fv;(M;ibGu*X|BsA( z7&ytL^Y#dSrQ-h!IIY98_X&Qr;xB<jf>E|`t&v|9(|Lb=OZuIhk z;%+_IpDF%_r=`82=YLcDZrv}VulHA^|3*#Pzfqt2QN{mM<*jM|-xSZ^CG9WK_CFLz zKhLZRzEAO%;*YllH+=C6z-fPXzeR8}-)9tma(5ixwIcnybt4Zc?yk>YD(?ETo2$~# zhi;Mn&3^qK#V^$H8@c^`#oajPt~KfBH*~)Y?JWW~{~obEEp6}SNxzuU{@kkc|DCfk zPP5K?6@U5$!Reh1^m#(@bMDLY??z5OtGHWN^S0Zh|KHL6%{rU~o;LoE04Kfk>aU#S z{>}e>A*220wf|j9d2aeK{lXQu%X3}5e4XO86Vm=CwEYvnX*?${6I|huZ)p41mIeQm z{^9L4>EF%ce^l{LTrcgf)b?Lc+|`56EAG~39;{3MZv4EhxT`mRRq^W``SVwbyLQMA zH>7`e-2%n;s(v}7OIoWo3x*|0#Bo#BN_N9;MD)4jy!o(@gGb{|Aro(R@|+dy6lwnb8$!7zeUH> zRlI$Z;AU)3DDK)J=eMPw<0}7Osr}3;{{BVj=SLMkqxijwoAysB?&c$Yt|R@s@y~xz zd~>h#Z~EEYmG&oe{AM42PVqyBr2UkR=P|{vUJ-nc;@?yJD%H!TpS|nS|AQ*`a@zi3 z#qT&M{h0QDtoZwNeU57TS8qr^UtX8?hOTZ^{P$)AH}m>{;;)+)-0bfk0KZWCw14~$ zZU4=8Nqev-e|B%mbN^K3-Y&%t0jGW*apcDPwf&VU_kKp(e@)x#ui=m9wf%qA{>}I= zJ1x(3;~`fm?)uTb;_uV(n{j?lasReFKXXZ+`~$@ws0eP>1jpT(U)*@ePb>cPRnq=q z?dJ=Mzp5sNda&7-r#oheKwRfe{+fBepF1h*N|IO`D z-}^?HFTER>KIgnc+W-Ajo_~K8{~u>-fz#g6%f#)^sNyz8|DM-=Ts`;{aL(U7d6K_k z(A(cB?%gZx4L$t$JJX*#3!M7Tossr$ z*8U$=+~t?Q;C@~)GWJ$!Pw(WV&kNfAJIi_cmG2m!pJQjGf4BbUnBs07X$v^nnNO&l zxfgxV=aIA0kLyP~1>DS?+L_Nkot5@a-;!s@=$Gkx(%T;fPV3;-IW#lcKdkL9R(?Op zPZ=4x^j_&_DKF2xMDgnte{@ao%N0MPxLXJEEbz2>y`b&gJkfdg$+}f`OaC+4{~~aj z*FWAV_{$alHQ?kwKJp&HjXm&3+Ww)N1vm2NDaHTprvx{0?}~THI9rzsKBAvPil24x zDsURllWl3gPuqV)@lPxZe!b%7zFX#XuJS3!j6dfwo;*K$A#m#7t;?EI{9U)^`TOJ2 z&B!Um-MYkw6nE>XzNq+RCFy5T`}vmQZan|u`(->2s@#69wjU|CyPfX(%F3Sdi0>bs zTlD7(#U2aAe81B4S8L7XQq8Y)o9&KYT0cF4Yf@UZ zpc_>7OizwZq34uFK3(A=*RS}vQl))nM6PhDtk>&j@D=MfpKgAMHLaJbjXhWlxc2KJLrE<5r5%{eQ{2}8n-q>ieJua&8 zZ$37QKQz|;^6AsuDejb6D>YUFztlj_m5R4;W3}qE8=Lg$?wMFSzf*0j)&g%K*?Kyq zb*0*AmAd6MZBJ7jFV$+zatSMq^;pFt0Zvs{8_jkgzhKJMCf}43ANE)dyAZ6D)@xlK zJ>2fMnzd^Aj7Ou+jds?TTkU2!=yWi@;(~v4?+M>qT=e(daKJAXZcenCSnpPA^OK!c zt=jb#j}$w_G2iV;+DzPr(NL4_)J9OoxC>}p!v8$}Uiz1ElbxVTROdGvSj3?0RhKhb zjSY!5z;Affg(Ky9dYjz1&`G!6>~y(lX3N>l66kRSdr)4( zHAfgBR)O|E{_Lqr&@EMKlXKK4H%)x+35ki#B7mzzKr6WFIt zx74kcnd+;hTJ;Y6hIJrXs{}&b^!q3g(ZTuS`}WS`E9=XC!FMJ`y+;dkw5~@Y zPRULAK1RRV2r7O(s4uUt6pG!6R;k)95W#=|rv0PDJ#CDO?pUIEQ+Mbkg<5iBXkA_l zK)SV{;nlH|)U?>eA8usI@|R1UAR@2*V>I8Jmx?ih$j!`wg@Ve0kh|AzH``3!*&Rg> zs6wpm&vCas9vp8!mpY8;e4cess^Y0r28}*Ap4HT2>bPJGM z9vajj`A8c5r zF7tTMsO(fh#EDGlMC!DCEMgL>D>oKE z6qL#VxUGD9fk+3NPCKsO7qj1>QrQCSZs}H&W0uy(K}Ck|5CYz1uaI_ z*GkJ@X^r}wR=G9}J-JzGR|;57Z>5!^IV{pjGl!`B!JJ?&=_7UDM2yVRT*^&cYzVjl zzJ>TIM8XpL#VpLT>$$(4H@+GO+Y+yg`iICYWMMg9AN3Zi^UI^WIA&?OSVu!gJb*%P z0#bd$efu!ox+UVk1r`YO#K}nViku{IJXxu(D6{$^kRcZFUw3S(4TayV!*C_D%#Xf| zdlq?%h9xl_uf1q6LSaePVauDxVf-X}5)7bJBvxN>Xn9LQ38qD@x?J|loptsNWR{VX z6uM>pg1X90kzvB-5p-S+%WYAGXA73e?mC>2!r{d#Gj^$1fYk*O%=yQSYG773diTXA zM4Cx))?X;jsI&m{7)slM#4;O*#TfJVlV#XEL+)3B*&GU*t;Ob<0vQ9|22}Tid0ubj ztR@Tkg)vG78VIln>#ajVk$6|OCYLEA;=&-56X1f`pg|XL`qh=fiB21Yg$KZ{EgU|E z{UCoWlrBbiE%}G{w@7xVCiA?>jZ$qLI!FN)CdDbzx5a55n(fcHHgMrs(VuFrcU$XS zuRuZ@B3m^zxGL2Sny^(Kre<54k+mfHCp2MsQ_@?8%iF3I%CyLE65(cxP$-k6## zp}aBeB?wH2>nT4Z7Q>6tqhYPUkQT>KeA05Wb%u>Fwg)0+W)AQmVCtX-UMxHxVvgGT z+_p5vlW9B}kNb<>6fsWY~UKstEjckdp11ko+hoW87F+0g5WozFwt~a zM`D{)3IkE4`8GWU(@E3A@h4%x11L}IiVA`iGwe9uNMJ1FB$Vi+S)N7wlLl_l?N%&`90@vOQ5Y!)>w}lUn_NafvcdZd zw+ISTHHljKD{a_H-L-1R=#AdS+6Eq#H1JMfZr&ZdZXszK&hGkyG&D-pyi;328#I(O!N4SbLBgLE! zZ@{;f*z#Ph)af9wEOLIbj7A6sIbY`(5A+aOaXv+03iI`x2Xl^mHg5oH#FoqK<$K=n z9*afeedAnH5LmG5WWQ|VL=6!vn?|#&ULBgjvfJ~>`G;Ah#yh=s&J3HKmD)mbXNd`?O{^wzIvkE`1SABAJ^G*70(qmB3ik>?=}Kh%Ce< zGOGuW-h9h+=JriLyKjQ}^%+$F}Vi z=HOsYvsY-`?3rq_!^YD@0kH#Oh%{A`!9UwDJ89Z6vops_IS}i#T59Sy2p<>yF5QSU5%k#U)1~F=240bZ4D@;fNn@BU6qrLEY^CWrOvNI^4p2%s(Pox} z;ie-cM{w9}F@Xt6TsjhjG=UMWQJ`RgvN@sIn6Rk|ahu9kwI*MM(L=*^IN2RNAr!AN zIf>(m!AF_;#MnsfZ<)=O3MpAKGskEIky(u3RcO>8#4tLDEyEEgiiJqv7N(4`V<7Wc zjw}^1_$_#15xee~*04C+32ur(47sYDlGtJ~o8irK6JeKdksuqz^7Bg)lEJD%L~9TT z@>}GWr3(6*zJ}T(T8XGpEfP@bu#CW&%383(x%-g5cWk{QL1)MU?6U!cvQ$;H1N5+}St8f9oagDMggH%6O8 zjODK8sE5^L`_K_-117{_E*wYDTzDYvpN29{Bi$IeE95$7ItX>SRyogl$F`I+ycEXN zq$bgEcQ!ONbdlrn6%sZHQja7?y~A|9=kWifRnN(MSm>i^K<&t5uQtGLvqkybVX8NeG#q?3JJ7`{pC=4RnBo$N_ z8^Z0KXtYJ42?OO!7zn~=N~&K{_B)cX)*6!^XqO~#9#9=DyDmW@nMi=5+yM+W=2O~a z$>&NHVe8agAx|cXIgs0ipaUE%Q||B|kiF-qdAqd9k+djvI<)B!r9wHjh%M#xX{6VU zA_*lNGSAQ>$TyR~#roOiewr%57okAGf~Z7cjZVKIphD$!BvayUDak~K#|uj&QBC#j z($P68$6ewV8cGKyg0@Zf4kFtmwqk3b1{#MvkbsQpFa~gQWNLQcTvv3d5R)iI6_9~3 zIOjn=#aIu-ky_3{6^3i@jyQy)A~lu3q0gd4NH18M2~`^9Ifl*_4x;;L_*6n_4?mQq zya^#uvI!iHkVl6(rOuU@*^XL~IFw$ZffoQ3pcsX1` z@AO=ZNYbX0D_aDVGPPsg7)DmmP;3EsrrO>l1d-d5oJVE_iI8mH=~3(wRB5Z#+_>XQ z(I$tU0EIhxmMhs&>1eIU0R(@C>mBm?ApW1pAq;3QM@f;Jh?j6d|RQOjuP#^8&>i zHVUcMuF13Q0@=YZG@h!m`bw#!(=g5zIGl^?AuLdLHnr^x0}^({{hVQ7Q%=ef>ZRL* zWaUIuf`#RW$c>8&whuWbO^X*vfE3jcS>YND*&)iO3M3vBhlm%+{X>S2-txWLMm;E( z<&_%U!ZKUOyvNo!`^EudDR2^pTQn!tT4Gali@{e&hukOTdml60f+Ul8QllL`Q&O4MQYWp6$S}pB z7>dp~xeN*umZ{PrJCVUtpR*1!u*V$>wxLNZjzS^gQ8=vdfuN;KkQnZ8Sp zvowv$3Ks5|)&PmZ8N|Ur)M9ENaDqa*;*Huf-2%;NvUkped@!ADi{W_UoJ8b=I7{f% zEmKCpJt*7Qb+lw$X2^GSD$&@e$MTa7D%wm?la*33z9zmmngbB*Qpkp$D$lZ|& zX0#bghOxoO=Yl^zJA=b-qZD*!cj?S@(03xY!^J08n&Jf&iTA8DMY-N)0kN#0^2bFu74KBw3+>%u<9lV`eEU z@_2ANp-=6OO_+$51`3@RCo29%@h)vl&*N`WS4v7|TW2l8vqR_rIbxh==cV4B-;F+c zT2}EA4VkjBkB4<}(oZ&)Yvz1e#_=-5h}rfTI#mn1(r;H+*Lpa8J|djvfHJHq%JD(! zGRc)ufe}9i8d5=YCTsv|plB5vY{Q4Am}xXdMWrMtVdYxbq$*)HhPNYPm=3QVcQTiI z_y{=DvT`!cpIXQ7`Wh>!Tf_Pqh02wP=q)Q!BF@j&A|<5IIk!xs98EiB>8Yf`&fwUb zskO9@?G8;tS#G+ePzIHN|=AGDse!TfylT&SnQFXo}S@g4~7`eavuD3z!z4Fx6Ds5)8Q>acjTQ z!BJcsbE^d`b)@(rOu3|H8zA$HwHA-wgyEEs*gJG~$rX#lohcp(x;0+x(94;{g)=az zsnUYa+D1n@sq|EZZX)DmV%`vr7~YPJ&~_ZL9)lX098nCd`g9p*?N3OS(dixiD~XqQ zEh2krDO&@+KrYs)n5RA5s)cJf8U#LI4a10QSj&b`0NmW$1##fi(>ktFf?dU?mdgtecKer%O|IuB1*M zy)AFhaG4#tNfR&dR8xdi7_D?HG_ez->zZtH@i0ZW;Dni@>TEH!*4u%Ta!;5%I>d6gGxZjP&orrlPS0y*uYPQyEMD}I6!f-=3#WCC{7ch_!27OMq z@wKXHCt!xPrmSEUMGnL6B1@k|;vj?+S*XeDHZ+a4U1L?xXGr!2epk>i1%y!sEK);} zSvT8S@2v5e4+Nqlw`s9onm$WsEKPG!NH@BzC&eMPlm3R4tp_?O2Jn02WF>+P>6svn z*oR`rCclB>C*$Q!ye3cXXxlQI4NMQlgoriJ*cQHkbpvVUTBQacI)TYQ7kM#`SgR&L`5WoHu}H z->u>bEV}rr*fp-t{uWY@0K!m5LPdvh84eqB|b|@b1h5Yudd_f zx1geBi31ppgQm#voJ1ZDlUa;n)4dhD5iQ%25V;&gY_;8NP~nyOFi8nDiA};CZn!1b zt{2}j3y+QJ1$yE22q+2WE8r~IIk>RK#KH1J75;Lk6J5EA110W3s41gI@82AfO9E!|;O@Rz@Lm*NBQI<-po89!0M4!`xj;b`B@*eW@ zI@Nv^KCxUtn2|sRD6HEXC?jF3cp)X$9{nux3`bZ^ax(Oi!CApJi-XH+w?iFP;Vg3!5#|wHB#Sw52#K#Img;Mhfu)gww<WU`vhTQY5L{!q>ytnNxfjk=@S4G}NJHv5!%J(IwGoZ;xYU!OpgW zkeFY&?%bF{mtMrkCoPo(F({`E%{6q^?Y8kmjwQC-vGlbyw#|CR-ULaBADOUEhZ$B> zlsN%~s+Tk@72*{vOli?=4y2&vS`{_RGLnH&eBL(wk}EfWl^OaMxsmOBU2|;ac|j3M!0b(BYD_a zPST;$wphgW&M93)3DK>FJ`71=>(ccqM6uj064862^182RisbpQ3jtjizx$c4lEkJX zTSC<51g!7}AgnZV*Ff_6=e~&zZ6XbQ+qo z1rn#D^ip*DY+RViO|-1tSjYPHDCrl)j*dnkRCeO-d*eF|J@{x(V#h|XSLDc>Yl?-m zd+1_plC6s!2{y14%;oT+4`e{`@{r92yC*g~4cyH%?xo_JZ%LH)LD8&I&3(UgGG;)`ALl_0-T*M@Kd)NFwyhu(4xvx=@GX zw?x;t;Xm3^tVgE9pC|<;y_Zs~6yB}xS!N0jua{aV!^dlJ(%#y@(b54(X0RMmSaDVC zOyb2B2yWZ7n&uamVe%%*2x&F!LT@6Lc=DL+H9q?ioy{#hs<8!#PwFV`A{@d_w^eh^7*dulNLyNB<9gi$PzR0mL^@)diGMo$OQr~ZkUVTsSISETqs%%8>lfV@~;CUExy=!eiz#94GS003sU)+d-uUnDd7m1B9 zWnm-SOB)+MwoS&*BTOxlGbJic{Q*Q(yuypy4VEgD`Xbx@N~5cc99PY&>0m?qyV}4D zS||ieW_h@TQEo61VnDN0%LGC?apw)hf{<8m3ncS;%)YnYIM-uxP%(N9Tp9_R5D#Rt zkLZ7S&8a!T^su1v?xtmWf3x*TeX0RJv zfb0UDqoCK-WjW2zGh2=DhUF0$djC^3Yyq*R$F}yd&nbAqhlWDcI_x6gordBx9;4Fz z@Wh1C3F*w%f1n9ow61mT&5fBy$@_96IR@5Ia=qYn=d5HfU^Gs60niGjyaSyo(y_ot!A6P*kGNga- zPEQDH+}2x%$&Y3Bpbk=ugsl{AhGvoy6e^bJULTHWb22nlQ`0ip-Y(ok=TNgbZs^=; zM~+W;K%=L2wSulYwjtqCk0b9I*UG}e(MwKngDoaStOoa%Om&;z=$Ib!+OP_ULIHAt z4auvpx5xyP$GCA8eS1YB$bvq$nou5E*F~u-3U}dFKd!-{abrrRs3EEun<KuRV! zXts0Ytj=g!+y)v#lH&p0$D-Q-^V%F%q`)@4#TBue*viY7Ui5fv$la7qC5JsljP+8^ z*s}1DDzr7^QC5@{_A74o+**{Cw7nSGwpT8Bq}-%=53|1TnmLGGPC|8X{_5$|K36%KeQ|$H|fN$QcKB`;b>wGzeuOWV7sGG$?ro42IUio4Dy@RCvcMB5GD@p5Kw} zDpXwfo3gc`q}!(VLZvzqtj)-1?UZm*U)OB{ zbM_NLE65J4*{?ke1-nV{*xw#F7lqKic~7_f{j?~B5%v6bXbQQd(C?PZdL2`6rQGOR zMMP?QT5IV<8^GOW`cZNuV{F6n7AGAM3~uO)gSV4YKyXeeJbn;7dQC3dfxWnZV_MF= zH@VooH?Ve6`G>w~$7aGv*ft7^?dwTXZ-yfCFuIS^rmcZ#GdC(4h3?}e9}e>ZB^U)w z_II$_Z0iM0>{zD033xj34YE4ePI6*%hUesARz(qJA}@2|Q4D4zgFj)=^D3x~Y`+yn za!RpxyiIJbl^{`5xGF0CCmu{R$Yu}hcqHab?a>ZoE~o-m&5YhTQhG_r2xsb*q_c|l zqG~=$^oLeZc9kDY|LE1M^5TIsvpSRxDJFN;Q3p;ygtuP74y1~3tH6|F>``&|U{f+O LKHd1Y-v9pZaDJ2} diff --git a/subprocess.hpp b/subprocess.hpp index 58f2f6d..43b911e 100755 --- a/subprocess.hpp +++ b/subprocess.hpp @@ -20,6 +20,9 @@ extern "C" { namespace subprocess { +using OutBuffer = std::vector; +using ErrBuffer = std::vector; + // Max buffer size allocated on stack for read error // from pipe static const size_t SP_MAX_ERR_BUF_SIZ = 1024; @@ -307,6 +310,65 @@ private: int err_wr_pipe_ = -1; }; +class Streams +{ +public: + Streams() {} + void operator=(const Streams&) = delete; + +public: + void setup_comm_channels(); + + void cleanup_fds() + { + if (write_to_child_ != -1 && read_from_parent_ != -1) { + close(write_to_child_); + } + if (write_to_parent_ != -1 && read_from_child_ != -1) { + close(read_from_child_); + } + if (err_write_ != -1 && err_read_ != -1) { + close(err_read_); + } + } + + void close_parent_fds() + { + if (write_to_child_ != -1) close(write_to_child_); + if (read_from_child_ != -1) close(read_from_child_); + if (err_read_ != -1) close(err_read_); + } + + void close_child_fds() + { + if (write_to_parent_ != -1) close(write_to_parent_); + if (read_from_parent_ != -1) close(read_from_parent_); + if (err_write_ != -1) close(err_write_); + } + +public:// Yes they are public + std::shared_ptr input_ = nullptr; + std::shared_ptr output_ = nullptr; + std::shared_ptr error_ = nullptr; + + // Buffer size for the IO streams + int bufsiz_ = 0; + + // Pipes for communicating with child + + // Emulates stdin + int write_to_child_ = -1; // Parent owned descriptor + int read_from_parent_ = -1; // Child owned descriptor + + // Emulates stdout + int write_to_parent_ = -1; // Child owned descriptor + int read_from_child_ = -1; // Parent owned descriptor + + // Emulates stderr + int err_write_ = -1; // Write error to parent (Child owned) + int err_read_ = -1; // Read error from child (Parent owned) +}; + }; // end namespace detail @@ -335,23 +397,19 @@ public: if (!defer_process_start_) execute_process(); } - void start_process() throw (CalledProcessError, OSError) - { - // The process was started/tried to be started - // in the constructor itself. - // For explicitly calling this API to start the - // process, 'defer_spawn' argument must be set to - // true in the constructor. - if (!defer_process_start_) { - assert (0); - return; - } - execute_process(); - } + void start_process() throw (CalledProcessError, OSError); - FILE* input() { return input_.get(); } - FILE* output() { return output_.get(); } - FILE* error() { return error_.get(); } + int pid() const noexcept { return child_pid_; } + + void communicate(bool finish = false); + + void set_out_buf_cap(); + + void set_err_buf_cap(); + + OutBuffer& out_buf(); + + ErrBuffer& err_buf(); private: template @@ -359,35 +417,16 @@ private: void init_args(); void populate_c_argv(); void execute_process() throw (CalledProcessError, OSError); - void cleanup_fds(); - void setup_comm_channels(); private: + detail::Streams stream_; + bool defer_process_start_ = false; bool close_fds_ = false; - int bufsiz_ = 0; std::string exe_name_; std::string cwd_; std::map env_; - std::shared_ptr input_ = nullptr; - std::shared_ptr output_ = nullptr; - std::shared_ptr error_ = nullptr; - - // Pipes for communicating with child - - // Emulates stdin - int write_to_child_ = -1; // Parent owned descriptor - int read_from_parent_ = -1; // Child owned descriptor - - // Emulates stdout - int write_to_parent_ = -1; // Child owned descriptor - int read_from_child_ = -1; // Parent owned descriptor - - // Emulates stderr - int err_write_ = -1; // Write error to parent (Child owned) - int err_read_ = -1; // Read error from child (Parent owned) - // Command in string format std::string args_; // Comamnd provided as sequence @@ -416,43 +455,20 @@ void Popen::populate_c_argv() for (auto& arg : vargs_) cargv_.push_back(&arg[0]); } -void Popen::cleanup_fds() +void Popen::start_process() throw (CalledProcessError, OSError) { - if (write_to_child_ != -1 && read_from_parent_ != -1) { - close(write_to_child_); - } - - if (write_to_parent_ != -1 && read_from_child_ != -1) { - close(read_from_child_); - } - - if (err_write_ != -1 && err_read_ != -1) { - close(err_read_); + // The process was started/tried to be started + // in the constructor itself. + // For explicitly calling this API to start the + // process, 'defer_spawn' argument must be set to + // true in the constructor. + if (!defer_process_start_) { + assert (0); + return; } + execute_process(); } -void Popen::setup_comm_channels() -{ - if (write_to_child_ != -1) input_.reset(fdopen(write_to_child_, "wb"), fclose); - if (read_from_child_ != -1) output_.reset(fdopen(read_from_child_, "rb"), fclose); - if (err_read_ != -1) error_.reset(fdopen(err_read_, "rb"), fclose); - - auto handles = {input_.get(), output_.get(), error_.get()}; - - for (auto& h : handles) { - if (h == nullptr) continue; - switch (bufsiz_) { - case 0: - setvbuf(h, nullptr, _IONBF, BUFSIZ); - break; - case 1: - setvbuf(h, nullptr, _IONBF, BUFSIZ); - break; - default: - setvbuf(h, nullptr, _IOFBF, bufsiz_); - }; - } -} void Popen::execute_process() throw (CalledProcessError, OSError) { @@ -474,9 +490,8 @@ void Popen::execute_process() throw (CalledProcessError, OSError) if (child_pid_ == 0) { // Close descriptors belonging to parent - if (write_to_child_ != -1) close(write_to_child_); - if (read_from_child_ != -1) close(read_from_child_); - if (err_read_ != -1) close(err_read_); + stream_.close_parent_fds(); + //Close the read end of the error pipe close(err_rd_pipe); @@ -488,10 +503,7 @@ void Popen::execute_process() throw (CalledProcessError, OSError) int sys_ret = -1; close (err_wr_pipe);// close child side of pipe, else get stuck in read below - // Close child pipes - if (write_to_parent_ != -1) close(write_to_parent_); - if (read_from_parent_ != -1) close(read_from_parent_); - if (err_write_ != -1) close(err_write_); + stream_.close_child_fds(); try { char err_buf[SP_MAX_ERR_BUF_SIZ] = {0,}; @@ -509,12 +521,12 @@ void Popen::execute_process() throw (CalledProcessError, OSError) throw CalledProcessError(err_buf); } } catch (std::exception& exp) { - cleanup_fds(); + stream_.cleanup_fds(); throw exp; } // Setup the communication channels of the Popen class - setup_comm_channels(); + stream_.setup_comm_channels(); } } @@ -529,7 +541,7 @@ namespace detail { } void ArgumentDeducer::set_option(bufsize&& bsiz) { - popen_->bufsiz_ = bsiz.bufsiz; + popen_->stream_.bufsiz_ = bsiz.bufsiz; } void ArgumentDeducer::set_option(environment&& env) { @@ -541,18 +553,18 @@ namespace detail { } void ArgumentDeducer::set_option(input&& inp) { - popen_->read_from_parent_ = inp.rd_ch_; - if (inp.wr_ch_ != -1) popen_->write_to_child_ = inp.wr_ch_; + popen_->stream_.read_from_parent_ = inp.rd_ch_; + if (inp.wr_ch_ != -1) popen_->stream_.write_to_child_ = inp.wr_ch_; } void ArgumentDeducer::set_option(output&& out) { - popen_->write_to_parent_ = out.wr_ch_; - if (out.rd_ch_ != -1) popen_->read_from_child_ = out.rd_ch_; + popen_->stream_.write_to_parent_ = out.wr_ch_; + if (out.rd_ch_ != -1) popen_->stream_.read_from_child_ = out.rd_ch_; } void ArgumentDeducer::set_option(error&& err) { - popen_->err_write_ = err.wr_ch_; - if (err.rd_ch_ != -1) popen_->err_read_ = err.rd_ch_; + popen_->stream_.err_write_ = err.wr_ch_; + if (err.rd_ch_ != -1) popen_->stream_.err_read_ = err.rd_ch_; } void ArgumentDeducer::set_option(close_fds&& cfds) { @@ -562,11 +574,14 @@ namespace detail { void Child::execute_child() { int sys_ret = -1; + auto& stream = parent_->stream_; + try { - if (parent_->write_to_parent_ == 0) - parent_->write_to_parent_ = dup(parent_->write_to_parent_); - if (parent_->err_write_ == 0 || parent_->err_write_ == 1) - parent_->err_write_ = dup(parent_->err_write_); + if (stream.write_to_parent_ == 0) + stream.write_to_parent_ = dup(stream.write_to_parent_); + + if (stream.err_write_ == 0 || stream.err_write_ == 1) + stream.err_write_ = dup(stream.err_write_); // Make the child owned descriptors as the // stdin, stdout and stderr for the child process @@ -587,19 +602,19 @@ namespace detail { }; // Create the standard streams - _dup2_(parent_->read_from_parent_, 0); // Input stream - _dup2_(parent_->write_to_parent_, 1); // Output stream - _dup2_(parent_->err_write_, 2); // Error stream + _dup2_(stream.read_from_parent_, 0); // Input stream + _dup2_(stream.write_to_parent_, 1); // Output stream + _dup2_(stream.err_write_, 2); // Error stream // Close the duped descriptors - if (parent_->read_from_parent_ != -1 && parent_->read_from_parent_ > 2) - close(parent_->read_from_parent_); + if (stream.read_from_parent_ != -1 && stream.read_from_parent_ > 2) + close(stream.read_from_parent_); - if (parent_->write_to_parent_ != -1 && parent_->write_to_parent_ > 2) - close(parent_->write_to_parent_); + if (stream.write_to_parent_ != -1 && stream.write_to_parent_ > 2) + close(stream.write_to_parent_); - if (parent_->err_write_ != -1 && parent_->err_write_ > 2) - close(parent_->err_write_); + if (stream.err_write_ != -1 && stream.err_write_ > 2) + close(stream.err_write_); // Close all the inherited fd's except the error write pipe if (parent_->close_fds_) { @@ -641,7 +656,30 @@ namespace detail { // Calling application would not get this // exit failure exit (EXIT_FAILURE); + } + + void Streams::setup_comm_channels() + { + if (write_to_child_ != -1) input_.reset(fdopen(write_to_child_, "wb"), fclose); + if (read_from_child_ != -1) output_.reset(fdopen(read_from_child_, "rb"), fclose); + if (err_read_ != -1) error_.reset(fdopen(err_read_, "rb"), fclose); + + auto handles = {input_.get(), output_.get(), error_.get()}; + + for (auto& h : handles) { + if (h == nullptr) continue; + switch (bufsiz_) { + case 0: + setvbuf(h, nullptr, _IONBF, BUFSIZ); + break; + case 1: + setvbuf(h, nullptr, _IONBF, BUFSIZ); + break; + default: + setvbuf(h, nullptr, _IOFBF, bufsiz_); + }; + } }