From f3b343c0e545fec539dfb08b47eaac6b72759e0e Mon Sep 17 00:00:00 2001 From: iperov Date: Sat, 16 Mar 2019 20:55:51 +0400 Subject: [PATCH] small fixed and refactorings --- doc/manual_ru.pdf | Bin 2961665 -> 2962109 bytes doc/manual_ru_source.xml | 4 +- facelib/LandmarksProcessor.py | 9 +- mainscripts/Extractor.py | 253 ++++++++++++---------- mainscripts/LabelingTool_unfinished.py | 287 +++++++++++++++++++++++++ mainscripts/Util.py | 2 +- samples/SampleProcessor.py | 4 +- utils/DFLJPG.py | 66 +++--- utils/DFLPNG.py | 24 ++- 9 files changed, 479 insertions(+), 170 deletions(-) create mode 100644 mainscripts/LabelingTool_unfinished.py diff --git a/doc/manual_ru.pdf b/doc/manual_ru.pdf index dfd766a0b87355b0aba6b1e8f91c1657d55ca654..71b77577d1b8a736b49a919f53748eca28f02817 100644 GIT binary patch delta 102046 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%0D+^1;Ioj{rP^@Cd;p437vr zqVR|nMNEokXK)1sqKtHjWG*uk^hLUaI#=e_h{<#bcqHMGf=3!28F*yjkt>=^mk(EC z(aFaD%vKGoclK9VbY`D?@>HWC--Z2a9*&d4X|=OUK5z8eec)OD@j~%~3+nDIK8HN$ z8Jhg@po}`4-v4!|fV^o*eR?hY7ik#vsB_L#cE@q~$5SB_lU@-Qr`~+&DeIV=92)kY z3fs=;&+?Bd`-nOunOCxU%x?MQhK}_#X$D6;Vg=WXsyEw{Dv-j^vF`WM1)<(k-~1ht z`Wp`lyu7t{ij;XE3PkHbYtWOiiQ#Rny<1 zkY~4s)m59tXt>mFqD93m;*%@-Aq8&z5kGg&zrN^N;A=bI5#QaP;V^_kuaSr5gg%5_+#*J}#T=InJxTPAzVX6x9a_ zINKpE(gJaG!Q$~W({+L4E605XHC2*4{;58R75~Z5;MwGd%j)5qt?s=eRh@3k3dtww9c;GpoR!&Qx_jT| z$@Y@8rQ59@STTBg1CL2Rls{l=pSf%xgn7yJ@M@-d_)zzmn>>lNf*Xe2H+UZ5*&{hS z{JD*gq?6O0T@vSMk%(wFaoto@;*z0^{@hgQ?)=YX>vn8XNK_lUrL`hcq_leFhx@yX6QKBXqwtr@3|t+kvuXd5H9 z_HnjRO5l_Grf1W3^_`FzNj%43d8eQLF8J{gGwpk#lF3?@?_ObN-pu1$yVv%KGZU%0j9u|pw}N4s}TrGNQWsGl)$k!N4FZwSR%hHqup z)Q;XI&ti3FtufUQ3O`DA6+M$AQF*geV4-ibvl1Z}A@A#9IV8_aPCW5()K<7v`1>T zxCU{rS}eaqR&32W>orpCOLllT*`{2g73h^&H(0!VF)!k~+*Ut@COHYNGxIZ#48HJ)#CuXAep%;MRE+s3oc&Jgw9`rO07?2z1& zZu8iStgMyN_Me9mMtVgR&0RiTG`(9TpugqwI@7qM%6;Wwdq;-!7k6>(h`cex<9|wj zZq=KSj~BrKdA=jtD;)V2v8S+RfoPcJ9Q*V87eCIJWXLu5|L|&c8Sj6VtLT*%ythtd zQ;-~)oLedtmlS# zv+J{+g~Brgc^p;vtInsXHzxb3boEm1oO@#;QJ!Gse^;t!Yn+8g>AetT=cVX)>*CkR z$jti-gC4S|N!w#vYb{38Y%~ey?)9;b(~7xb2_0 zI)2F$rSX%rO&tx^5;vEve<1$IE9ethXUXiq$1M5REfVL9W~^u}m|xW9v!G#_tXJZ} z^j0(GqBru9NA-wDmW)2le!8G;_PVGNy9mu4>c_XzYd79w1+4X(a@KRdroUJ8>qL4Z zX~#z2aK+stvYvg2;l#R7(!unN1$%XFZP1h?xm?M#YKBvvyhD+D? zn98^~fx~m>ipHk-&B)BqPkQQ@-h0qQAzyfI+V+>_!9nXB=cX9VBj>$(T65~j)oKIr z=*stRKZl1ae4+zVkGv1r>6{yLghFwY-ybnr^`ldQwepVYWJ03( zwc@?|_`+6h5HXt3wW@Zu?VSFlvj*}uCGT!=+~QDvQ$GIw(RYcFEX%6bkMDQvbib?= ze2zACWq(n?Vq=d@H?zZAw?%E_d+@|d-ENy#{f}=&v~FITa2sp&)2p}UX&LYdbf8UAj`HS; z9ba9zLHTR@yKa?4iTz3)LGzNQi0`JD^SWq$?yIvt5`{;Zua6(mX}vqv9)x@?EDUUNhojk_kzwcx&Sqs+gef6GIER)P*sujc6* zuOiDFnf5z&F`w@5D2wy?_~j0%SJd#?w)`aL7x$V53l(nOJ~8|F(`W0VEUUPTB=#!4m54(_8FL=H7+gG@;+3KrX15;x^Cr=*>X7>neyRA z<>>uBpDzVw*)KYIL*nh?s6hEPl+|v$W#QFvTlQ`l=uI>#Y%U!iJoD^%M54z$QIQpS z?(-rv3QH&FEAt}^ck03n&1286O8I}fvHaWhu*GX=4i2pewP||kgObN+5#Lr{NMl`3 zb1}YA^uTvp;y`lh!uxO6e6Tq<8@=H8Q9;DAJo(Gr$re(~bH%vENUl_K;tJoyy}5HT zX2sNyVjRoXr|!KeKd5Ne+AQM|LZmL;pRJCrl=kxttDTjYnpkk{?WL#}7d@j1>Do6( z=giFX>#OG4oW@+JX)tqh+8&>4z7E?*T3J$?eM8^fWNs%YoaYS-*Hg-F2;Vehrx{1@DlYTx$LGK znc)Jvb4{OO1T=;pB!%@`=;~UB)Lvb#$nCMEsJX##LHMkt6*pb{J|3X?ZCrWhn8M`; z&Ba%q$5dB0Wz%QIkAnDUy-DwSetL8DIk}|{809)`4q16-zTN$rQzIw53Jxvw{;>9h zpkv7M!i%iL_G51@>I|%Xo1ebc>XXdzZ)I(YXHHKA>dG{&?DUqkid*tPX@2&uG+y0R zI#n~2d+%LWKAc*=YSa7|iSrWe4R5W#eYL*+;O^Np!rZ&MZS$+vB=yJK-fXlXZB9c< z1S`l)XhK$egnKMrOK3Rss&-BYg}2_SZ>g2e4Mcjvf83}mtzX^Z9~xm=$XA8l^#1&HvZjS^ z;mK1`k8E{~^^0nh3f2YlGu2XVisl#XCQExr{|H@earv-=+{BuNYZ{k#BFj{_Us{`a zd%fy0E|bsMX^dAa;hU71aZz$%yqDwl4JW3F$j@P&AZngsDd?_QmUQCswVdwVB|2{; zYvVIhmm44b)=(lYq~g_O)FySf_+aCmn4pmc`KKZm;uEE=s$J3XYVwF93j4|J-5%Jg zq4K<3o3HukxWqft1JS7uzka^8#^K!B*z1-NLGl}#H%D5gSYGjERo}ZgSS3Adl0bb~ z#bbQKg>e0jBe`^~vy0>&u{*anUMe>Z*qz-qidZiY84LA@y!27tv2x@~%f3e+Nq0x* zO`5L^O>iKx-Y+W84Do-xe?@45Q|S1qjy#3I0oNbfQ|9)ZU9K1!nsnx(_nFi)lbhr< zboleOp0LgCG5S$=QpGQ?C|b(H+dA18jj6zS~!?7}q{aBw8Y9l4o`!Q$FO^52JwEmE@nX|}?5|eXv{9RHateg5mmOj|DwBg>+ zxxS}rD*GEZc1u~9dCw`#wNolrKxf7t*(Rlgj#;UtjNgaEb@AhM16#f*&SLUDtE7sb%fx>>pLgsvkAHo{71hEC6NNZENZ@_AHp>D`XF<}Ddy z&)SPoV>faxB5v~??tEDpHuFx0(%Qh#&>1K8M3{M$4u}=_Xk4L(8qL@qDNmJp$v5oy zT_K^k|M^mxmCs1a+=5@ZBrcmT_u$YjQK8i?aSO7J-#@k4A`(fQe@xH$ycoH?gnoU9 zvYR#M{+kcI^t0BgLb}$C7fy1wWY^1HJHelSd$RYLN1T4SS3#~Cvr%Y8SNVR2+th92 zo$Gu*eV>s~d8@d0+)#e!+${{*y_**qDG#0ty?SX`e6iF6S!ZicrsBFIK4+gx2G1$< zI=d~$VL==B0pGN|0w4ZMu`d_T4_`~POdV^hFp_0S_Z^HnVYc6W^M!f?*AY|4(+^uS z{X54tW^ag&X-4{ENSAMNYsejhwl; zUT;1u+kKn$cIc(VBtPF?9jhau54N{!z8@Yo_c)R=D1PK;ifFtw!#Rh?>P6RvoS!`{ z`@m)XZ`-Qq@NnrMCw)r;YELdBU-_=j5e%x;-4{Q<;x);Wx<-1X z97AVrXn@v0a4IV~IP5+B#S2~q=EU+mdFg;Qn_}7GYOk5S8AmrSY~JTxbzC34nmq0k zGV^83nSA5tz6)>eln~B+<#%Q>o|s_JYELind(`}Kbk>2 znRETx*>$Zu?!Domn!T%YKc9BY%P!MM^oXr;k`_9wX87JL;N#|_GZv zvwD9+^4ay#TVb-B3R_bySwA~CbIFCsQMppoWU@nzcQh_xe&gAO^`7owr-B{IU|9qqLSEVt*Pxv}2ol)JqyG}vk z%9BjDZGpp2Tb8Uk2zt%Z^eSU?sqPEf0@+EJ0wVYJ#KBgEV z^OD~1!dhXg@*MYe!@3&tT}1b0y@40=d3ZZSnMG$PG@~uumiAsDnhyq2<61*)?cD>7 z=pH>Ag)}#8bl|@^qkom+#=^Gx{-%N^^Gw#jm3Gq0kh&0M)@J&G2ekRQn`)Y6jAEek-b0SMI=2TUjC-Z{Hb==`Z&_fwK*G{Z_fesBou~GK z;GbDD^W|0@U{$a6x~V_#Xu+C$%3LeOl~Vh!oh$1rJo>1|R$@ukp7C{_`**c3zSpyJ z^|D0P(Qi$+z6QA4#s_5d5>Fs2ZXd{0J&-dZthGHlZLz#pVcwBvGDYjG#&&rRtdQhO z@DI~<$#`7-n5Z18b3LzG!T)*_w@p=S;f~{D*?hKLPtU9$=Xt#J-ML*h-?Xmn&T=DK zP3U>?AB?*CQeU~|lZ$J0U8Fv*SN}FaH))HA7n)wIo!uXc!j7cFc~eVFdP|vTAFsn= zY2ti!Y9Du2x$Fs7g?O@Uxq7ai=Z)R6ed(f?mUiCp5#A-EvnPw#OW4aYh2t>ar%<`jahlmO# z-<;_al{0vfXq0(avRtm{Q>Xkb8Aw_e8J<(n6fb(lrEpgJcQx8fA$|?_49ICiH#~~) zD8Zu)j|x1h@TkG3L~#{u8kKB9HKFQ~jWx++O>MZb>c44$`%X`-1*TLog-JG|;1EUL zIYd(~E(#gFl1I#Dv9Ez5R2srGpz6PY97>ruixjd6XIv<728IF$1&D|9F%&q1Qm9mp+@WAxG+9NQ3k)!d=H4Z0 zs#tR7i3YO7$p3G=(WwfeD(kl#rseS;yg| z--6IgraN#zTne;bZ;lLTG@Mf!P9TjVHX0o#h|Uoj4cCp|ZycV^Kr3Gn+` zO_ad?2;llo!{_PWzi})KoJw5lXiS{C|MVN@7T0px3MS6R|Hn6-%&{{%nSzQJ63vUa zUlYr?Se()5WDeDIGG{P41qY^ZsHamnvZYgScnS`WYdf8a!~a*`tpDl<{~G-d=;}QX1$95Os&p2{MMYz%Z_la`ovKWLPjhiG&p+k!hMReX1qB!dIj;M(;KN3w@Y>V>W=qD=Vg3$5h zl1|696n9DV|G77dqmBRR0dPq$@VRE-lEA$n9rtqo`8R7C;eYmxn+X#q0C%7CfBVL# zhRMOtz`Y%V%pshiL*|H@LFNE5aF55pJsku0bPS3Ksxv@5Da|m#0gX886_w0HAu`ZI z`v!<&XxJdE5x-~HYLIAFbbpXo%7va9A`(%HVWI%KwUQ`^Di0!V*dHc_1CKKpxUw_wn1VsW5z;t(Gw|hqD+cW;eA0nOg!fKAA7U@ zrw91A_&JhSW>Psy%!C*k(+#E(M^a29V|3AN;%s$%4PpNKH|lzu=*VTvEP6Ob)Zwzj zCCA{{!0(t7$B)MvoF1%Dw0wd%pFrnm2ZfA>aS)|)i2Sp_;Rjkc zGYSPpQOQrD>wIY=e272ZMZ%Vd0*?SfM_?0yP*8#$qJ)|+L=3nn6g0pVJZd;p&<=Bw z02*YANTZLis;CfxS7odbL$q@kk>CJtv4-AdXQ5ZX4uA`x%0MG1WX*IKS=<0oKwVEDf~dtP z!p9j|-UdddQPA@?$ZT{gR8Vp@BE&&dfmJ0=P7}$$1TheUa1~4pRtQ)e=q4PvbxUA` z$u=TChx2P#)uL;t(78MYX6aQFBB#iic^d9)|9GRs3J9?$qmaeuzEj9z7QPvv{6Bi5yDEq_ zXx3?D4faO@t*8LUEfx)8u#ZNTp&O!MJ}*Wii!C`8Ny9Dkzwt&NR}ke)af_z?*WYMM z1uQ<&XAm=V_#lXxE$h=~5JLiuQ*MJY7K13G8fOuGwBihuHlKwVk47^t>k)uWFPb#$H-NrBU*9s}s>g+QMG z#FAqNY~TW{V?!fovwR$U`xC1oZ>Fo(v4}pGF%6ZB1I0T96?Co$;9!GJ#lkRMPhnJc zbv+8b3r`^09N>p2VjydT!2S-_CRmnWMS=(nws&-N`B^}w69=5n-wam%Wf{yD8^x(O z!1(S92#P)4SFEbP0U>g#bI-#7ugQo!N81S(081paaZ@NpD7*ILJmz?evC1N7HQ}`G zx`4IPIF*VEfaLK24C{h@&mRv%gb9%N(ew+zy=y#>0zrm6I)L@&eghh5@xaou1VjvV zs75rG`QAK?(!)PYxrB{d=7tI8vz^G{LWl%_)Mno31 zzYIpHaOKZ=kf!0G7!41_Afv%y(&Gvu$zk!#6~qCxz5=Kwu3$2U$>pZOEVE^?;3|wr zL$}v~TwwiDK{Kx+;y?mn!}QE7js)Esy9(HT&Au`X5Ahi5=H}eMO+7B+yN?{5n9>(II&# zJ6{LiqmlyrSDBDV9KE>#{pe<_?H6@YG<=Ih!vhW)og>McDS+OHLsVZ1vJ^FJKzPx_ z6fiZ1R2YWS#YLy1-Kj8KTq;Nc$Or<_h;_rnnxz8yQviul2nbtm6;b=NKZjPL;Sntj z4^U}%ijKzMkZ?W?pA{}>VKewW4UBwm8lonSg|vTY42sktL}?nni=yFi803;T5w=f*PtVx-M@3Lr2PAE>p13?;-#v!mS69~Lh4;1~#1O?2^M3n!9#j1Mn zu9t3r5^OU7Xy+R+6~b9C4*R=T@dzTt#KM9<#KJU2tL_t3&`&pj&5SHWJa)shE-ZjA zVZwgdl@JZz+0n^tSxd63f8s*j5)h&g9#=xPi$i%vHqi295(HzIjZoq0_+Ji^$>}_u z4b*1kAQId(@T<$YfEBhYo9#>z12O^>z;2VNBt_I97vbLo$zYBbq*FLSFCBN@bShrQ z^U`!Ya;M{)NIJgjqvKwbjt9+j6C59&)1=dAC?yxxx7r-=c&BqfL(k{3wOTS4NPCbA z0g6v91j#meAYiv#m~spfD2>iRh!R-1{aZ93G0X{x|CQuJm*<1)evt?Ax#Uh#Lr?zz z)7_T`W-&7#kXkl^%qsK1N_XS~2)in#03hP|hzu5zFV98fu~Fr@C{%1%HB_Yl040Dx zseeryav(f02(~H{3Si2!3&1KVoQ8`SZvJ8ze)1R4Sq#Xv5Ujy97uFTdU~C@M(3CBp%M*p2)SBZ1Leo9g4uos}#eCR8A{IX8h=RtaWEG48ewMFGA*l z!~P{nAvj85C#0xM4pPw)K#DPmnwLO0I$R8Fq?WLeVy)bCBQn}u0(vs`3KqErEG82u z2BsWJ|Kvi*h-21t*gpa^5xr1~h{L}*f=ZS`N!5_*q4YsKabZ(6! z4CC4eb0JiKNO2kcK|2?mhp>?wl*8DZiTT%@CkG@L1A%!^Lo0Mo9$Pn1Q~Ucweeuo$*G29^I1AHKz<8{@MQTsb`}DV2bKT_vI_ zjs<0Z5Q`?i0#Yn*L(l?KBg@(2O;&>CnEXLHmkF+3B30As^{+`)4w;S^1lw{x-v-0% zs{&3;I1O%tM4aw9ccy{DtB{Ro)SW*qM+o1A(@k(TS}dBd~g?}#pY9kHsTHRGPQP-x=2e3_(`g(x)^;Dn z(_Rf@v%T8PYA_ky8bJ9;9;TP=!`IdzLi2Ek3tMEi#o=o^9Z!YO@#7Z;nbXg}9Xo#aKAKLY@jS^!|rq?-XKzd{Wx z)qlx_j`yzuu?yCM`h2Vfe%LOR@KsA^pTdK%Y?u=<%)>br6hy{|b3=*iEXSE{|Xeej()oWR{rx z?mfaOmHwSd=In3iOfrWVv3dYuJMG9vhy}W~o;?P~i(8Wf(TPV8qO${-KkN_CW9!%H zNeI!uw;0h8Lpafer|a&C^QgCNMcXg*SjdglKX$`l$hi!dulILq5mx8Axm4 zV~|#{5UiLl8$eyr$A2;=OvjJE=}desx*ku@g?J;(1>4a+dJMt}ZDeDIX(FQOjUX(x z4+rO}gla#58PKZ*ePyc_gN&&b5#9L&sH9*qud39q#5SIp0~pXQB3c139PNRfw;*cs z0#*Zor(hodz*ah!azLB;1d*2bXD~M151Vp9bPPm>=D=sasSsx1=j9AYgoBnrDEO3P zkwjFd3Df|#?|=Ibz=^SkT^)cg@KtJ06T}qe&41z+Vo>lLFa?_r1dV`hEXKfCMGKoj zZme|B)|zS{i}(zpG_XTXr^7RF9zMaaEY-gQdk}rb-i{G#AvWR2j)Ex~EP2nTi6svZ zBZPiu_c1#rqPcfq&mYIK|O#nO3~o=b*vCEz=-UEr^OFJJS2Dao`ZxpWE}m z=WMBqv`)hZm;z;4EimU!tuV1{xX&$!>R)C*je__Ai*>4D@b|6L6x6qZBA;jl6eexc zC>mNpIILgQ&R`e?X#C>YG>;Z7LKwVx;j{e+|}S5mT=N>41Bd@;8!IW_(2^5Um+N{3ue%9 zc!m-B`8BAnVh0$q!Y)LP3tB$C1_kiwV0$%8;iMV=dPc+f>;?d#L$83FTjzjvhYpaG zNau8$VKTIx?*Q^WJHfP#IFK(p5Gq;-4d|^7m{)92VTLj0@UcT58V4~?7mUu{vZ|s+ zU7+qgoe-NRb%7NaYxyaszIdJWW@aHt2obPO*YqgxhB9txsbA3#Yq^njB5 zAs9UQ#ejS{n~XH*hZTj5x}|5@e`5TPEgjehFRr|8nZZ0Xl*K8KcV`L2GUZLvm014dkx=ncTuK0)Q$CajO7_FRi}m z&s5QQSeo+|e1`7n`{yj-H&hsO&MZl>>wmBWc?CA-Lw&$G_*VfmyAOo6?k&t1-p9>= zG|m2ZFk^*pr)O;5TcCya-9N{|^C%36li1)6?|x5O*gL?__OPb!V0zxer(ASg@8sWu zIN7uI=pCRv|Nc+3FglZsj{UFx{Xsdb?;KOYb0`cv&Vs`}j$F+?Oq)$uFqB%}gJK{4 z03<b`XPPG4#7YZWl&po6^pnAK7tI+VO7I^(BlrQ#NPR``T@>q0Mfie9k7O7 z!b(B|5G`z10Fc82K(W^_lprTeM{|Y|K~EP1?uBto{eSL_-8+-V4^kM@aqIu~oAtjv z;9uiu{3kd^BPxlrP{GgOkPm%Ea?plKqQLZ#Cmu#I|MPD&a|lB5x*xEpLv1esv5Z zr(#Dz`O2_Z#d!o=g7YY}_l$rBUcpNGqlgarV-z8yUBRHyQKJCj`UR4cjiZPjTKWY* z5Hmy=HO5NBuka`83v?7?rMF*TqtE>fN_Jn7EvVNw7^v?nU?!b`66G6Wf=*zE8K;SW zIpG@+<@6moy1s#}T>1_jI^O|R|92Q%^a<>|Pksjw#u#)w`3@k5u#(Cclp3&-H&#;o z0i)%Nfs5Vv15izj!Dty+8{0hXe}LJI{s8YrX27Bcc`9YpX&eHCx%I54iip_*`Bv* z0$X$VU@#-ov}zLQ6Pf}KN@e5WhFb#|86eXs;Cf6R$biJX3V|9sfd|LJO#G4>(}+zm z94bt~vc*0jQH{|hE#su~-%TO1F(^q4Fmk$}Kx3nhc|{WEf{U+|%P?U%*k(+gK(azD z>JfpMdY~?XKmylEAgQ91{V8LL+Neh*$g8QItyd(zp zM+=<|)oEMB59*lz@f+2wBGRSV8HM$TsF3HjP3$3=aJWJQy=P}&wFE&bv-yEKwq`%% z16Bg~F*#xhQcXdqmSerE_<=J%0q98NhvOXwti;Z0vJu1y0Em$Qfb?J`IF?jK%>+Tz zHCX8|Rx*hPjY#DOd?SJYQgH?Z2k2!{3n4(YYY{BS{u3bi=Yp`+O~%^TYNss(ARn+Q z+=(zjjfLS`NIa^b`>+ywdrK4skXoz?yIBF$PZ-9K5`ijY`;<`^tOUDIL3C1>Bn`{E zr2*&$Y&%uaFiAiQtEVJ-K?EQNBuRn<7gSu7WQ$6Pk;tf$7>FMJD4%A-v9Z~G61St+ZCPCVds!NgD?>VfM#_TPC~bqKrAvlnfi}s)MB2(iNmUL?MY1r1UUC4; zHY-6nnDuNqn5${84Ob6zNm5))2D)7lwEcD-=yN;<6(&y-LnZoQONj0EW-}T1DvBp* z;L;JtS;J)`&b9_F62V4J0rc{bJe4I_HP#{ThIyw{}pdVEr8KFuI;G54XfEv3hlEl$=dGKWzS{WuDw=vmgS1aJR2ylNI z@DtHgMG}6R41ua5jKDs@V2`j=i6n))QIw?wWALc}nJG#nF`i}c0|}IH6Hyb!6GecK zO)%sOr(F>H=$;8@Z`<8SL~bSs?41Hh6V+2DiJ*x@An%?MjK516#;2o_b3y+ni9oNa zGD#FIQ^rILw=AZcNp$RAE}C{V82Ntk5TQdr0DNFM;GD8(4)8Bu`+q?7P{><0}K#MJ~2qG%#G1{x7~e#A!UgovR5SXCZFUXE2Wu&M_F zQ}A0lN@xxOME!0MLRTSh&uQZCR=6i1fi5Qf1>29cp8KQKfJ9P4U;WVlGa!We>_tRT zZFQ2&KL%gI{MF6C3N1*zrYrU1BFLt{-%)qF?l9@-1;}{UaWQItltAW^mYD@$ z<$t%j%>q5;pZ%K~Hf$!=y7G_K!C8PZdG_xypg{;-FdI26bhX2v3 zrU@t;|7c*N+^Gp*Dq4Sid>d=^`MXs_3t9{QXtmdZshQIH%?ul5t0TzLM*Fuc_h|#| zpRteQw0{r8ZZ+42*4}@%DxqYZzrdO?u)Tk`B0A7o`*-UWXqEcESPk3qvvfcRTXjhi zm|bJ`jaKS{=wHeMg_wnd1)6YHKPXT!3nZdqdf*qU?4ZOg4;JL8N0Q`*UbLG4O`mn) zPk|n|9QI`!RdkLXI7@zg@Z7(UiU2exv4wpGc8{Pd^g(D4AY!h-1a$!afhOpaB)9>P zlQN;{!>aL4pCk@Va9K$YR&*l+SVQ3E1Ds{bfx8Yd0N1fr9+`%&>g2FVd_{}Q#nc1{R@QWJI!bu!LVHz`j zRf0lhFAS)tA*o6Rzo862N5c`o|Fi*pw1~7CrISgrs`xcs_=VbZH=f6Y7Gu8rZb>8rX_dV>1jPgs`Zh5xC=5=V2el4ql6m zVRE)Bz_tfgauu8DH3Yvh4pQUjQ`dP<`=Cpg)TMYX+87j#LYq&CH2N&Uu^9|&~7?_>6nm2d6!{7G-O|v0fn6w zJeiKVGXcWWgl*-p@**PS>B%6&6$*?3@W#1Lu$fwD0+8bvBm*TZB1PW-eFQ&)^CB5KY6Y@Fp%gp8-UVJIf2H-Z5RBZLhSs2YPrl)`l3 z&*dA=E!k8DGr&I>Fxi-L*N}8b{|p=0Gxz6rzj(us2Z0>a4V$G$Op+u!(T|C9ib>){ zJuxNGGKJs~HYloSxG8W5$0g7&G;N&_v|+4pLDEjm3|JNLf?1wc05CodD=KC{9-Ml^ zfMwBikHeBmcXxMpNlB+5ozgAcaEo*!b<>^F zEv?chAdPf)ck^FRpXd3#-?tan?#-DqXXeD5IWv29_n+94?>AT1Kq;VpRzQ1?E8Zu$ zs|x{Zl6gTgqNh)z{8u=?5fT2zjKEm@%^n|DqVQkt{%l~e0S~DDCU^hxAMU`ETfxi826( zg)&cSc#@C&BjDsW;K>P0g#qJ8NcOMM(1AmW06^$}04%bAfTn=c-$CZ}2%wbv7tr$v zu>TJL1NaSY`47P05%5C(-zp^l;D2=kB$fR;XfNadMOFYcz@#$37=B7a;*keN2ZF+5 zF!4th@P9IafNAy7&60rC6#&b45;Y0Jf2Z6hS>`GL9RTv2AG2kjq752pV9Iz<06fDJ z>?zuaRsdi+iU8(sGT~Qxoq1GPg3^<;A3YX0 zQ;{qS49f=4U*{pie@rfaTFkgA0cFg}Koh?`@nceuwK8DDe;hNBGQfM6GC=1Kz!Jbk z|G)c{0LOm{Ep!2e>AVIs_y?c`0RRgB15kJki18da{l!QIexv{2J6iwJTYJQgQuzlP zlA9I$UFF~2`2a;=YSn+r!F?)Zs2Kl7Wlw9_f5~B~0?f3k{=*C;aO>c zn}5k&0RZ&JXyrfd^&e&>07UTqzu1pA#TeB7r8f6i9;Eg}?Qu>6)2jh7^Z(sb1^UJf zekybY3c<|k!0F}VMDeInFpygX2X0jZHYwf%1^-wY!rvg0?eR9*WTeE1Oo!<&(fOcIQw0Z`7=1m*?g$4Q$*6KH?u5#?#Xkg5URD_Rp^gGcNC zz-As{{{I(7qXiHc)Orm3A7{wNx`0_AY6BGi0f5`JfQshY|A!cYHUO*n2lh0zsz3hw zpbhK^vjM5rGGz3RVSv02Adm`8K%f9`Sl}gXKo;dXkMaKRQA-N{C*WjzoaG{s|R<_f`CkBH90>X#rv7U&z0K?PCZ? z0yftJWPPg#$oetk3GtuTLp;vWPfj>j5AfeWJn}SV@$|?zpCWB2AkzNby@SWPPXUL& z9w0J7eIUR9;=&LhZH4u5;#dIcgG2ro%AgNG$Nm@U_6Q|4_#X-#k5HTcg`yY$(9i!1 z)p>+M8~zW4LIXgpdWOL2iOhtI0q|YrhQJ*3AFltt2;-6KClfpekO4e^X>zzfVf&*% zfS3%5ot5MF1T$#}@Eh|M&>c|ycht!77HEFw@$|0%K#%{*7y;(_PlHH6JAc;|z|Afo zdLjmYF#0{^11-Y;S!F#wWBXJ#Xap$fX{*b`2rxxL=pB(Gctc73< zj6F6s@R1%6TRmzO8qhyG__Z#uX@+d_moGB-KUv8@;S*zEZ4;oCCrut01Dq9^JhlQ< zd?G4m0?bK|^Yeck4^Z)6Ho*V_Si}?%^n)It_NV;0r=-Yv6CjLF`@aQq!oYHt-V`V} z01E!vJ~0CO-=!mvXbh}BNWlDNK!1TuJ5E4CHfCh1i7CJ?X`vx7a%Ri`2lTiWdMtwi zR%O3MMQ#2VZm@$PvVnQbUIbVnKVkzbh-_6-7BGT25O71_kurhR%paHF4KC(n-oPga z!43`#*pR@@r|3gEl3+SZvIaU!@^nfFo(8fIYIs;kc3!ZyJp*aONgO#F@R7pb=s>dZ zBYJ~w0{P7aI4pqzsev(s`T+)lBc6`BAuNsp0y43m5)SO)z<>AdM*<}q zGX%#U+8mq>5dD-vkPuu65Ombw@*kA);H?oV!~{e-{07ni$|2yz?@tW^OSh;)I?`a8 zA<71tA*yds;O%KD#NTa#b!Mm#!3h177!4S|s3su5EwfZe00lxY`V5r}m;~UW!E}a7 z69UW_Mg6BsKq?K;f6|8YSt|MxuuK#+Vj<9fSRe>silQb2+dDAeJU*cIg!3VadNmV* z`?1Riu;3qNv~XBDr0ne6|GjSmgnYnW_M;$y%-|3uf%*MOj4QUZXc6Fk2)e&4A#Bh+u>ks?m(BaAez)^yMQu63dRZU*;#MRN zT})OwhW9jk#P^vWl>~h^`|6j4$=&twS7B5l0s=JxQ`W)*JdJiz>!7JNdP5V15^Dr; zP$gC+(XP(k5mm{Im7wHhdDDn{8wSoOs~C8v;9@!HDwCNn!qrHrq-g>4wPvGz2H&RS zVs}e`NmrLJ;wljNv=@>^MiVKL;Z!@Np&DvE*XH9S^Fq|u?+A3I0 zH*}zF@=C5EJghk4hEKj~8!V(4R8Ild_U4qkX2fKl@psOppf`Ivu0>D&bp5&OnDA#u7Y% zqwbIN@D6t;^%Ubzi$dF@4*a%kbIkD|oX>?lkt>iNRWDX|CY+@p~QCJ3)G0T`tl7bD7U8 zBRhH`>~Njt#8LdqW>IF(t`CFY#$9GgNCMx~BUi>p6E3hCEtSQ&Df`brjN;@HTnD#B zr7lRiL@Tol7+Xn38Tfpy7xtTTOB%^9oQwil2{PHP*S$Y*`QmXihM;YB(Arvt`9o?? z4n?8Wxm?5Ca~H7^f&!xB7_Vli@qK#ZmU?9=!LvDnjoKf{k#CZUT3g35R?<#zetfq2 zwk7a|o>r*VXuTF;9mV5tBtgW13Itz!sd%|1 z9lW@;P!yv|F1wR#0)m2th=#0|W*S(KL4@N(&0kykHDAc2(&S|QT-+(`z*|4gZ93>l z(jbF_b?#AD=sBh97VjBFC)|vNb52<(^yTV37I8&Lz;|JA?&>v$AdZSB`GQE7u|+9E zvxAu~qwe~(6!OG6=MHj3YWyesm+xWDJTAz_U9coGn6NV~CjwTdMsw1(1-fVVc*qnbsu& z@j~0J!ZPgxH(qc&Tly*ncg1bK3D-6}b36~GX)H_r2HQ1KAQ3W|VsDCm+8+h1j7Zxp zH0l#d_yOI_dSTH8=XWW@GJ%j>;-K%~(T@~`CC`h!1(g;;S}clOZ{Ky3A1;LMd%Y6* z{~R~aQ(tfe&e0BWGPv;-B$Ec#i<~W~;*>|=h>h$S1(9oL7?Si5o$zC}S!q%}+9>*A z3}Wzp%wT<}4txLm_yTKMxR-gCbL~l^ruz7Zk(Z&DNn&2mR3RL7`ou`@Qr{EH*rU;OD5QPk!;;w+{uqS0 z?3{;gP8vDo?`*_!gmxJtng+*GMe=f)arppMgxUesciCpp2Ti$MLKr&KiFboMl^4Zl z9P}|V4m`;vTX?Sw@iX?J`=Ll4!y; zpP~epgOF8-R8FEh=JuFBFH%Q{lrirS?jXpRP3#VF#h%^)YU8MgCgc6b?LuCn+>oKg z*^uE*1zd4&>h4dOi;RO9Y*Fs$_#s2x?q|=ajUgR46lv_f;&rNqTo}{ihZZi$FK_XN zyTcy!@IJ=~H8(;(VjSEss%}Er$WFfWu0=KYawR7JTKJnplB^)XXb4NU^RgVP_*^)M zk2lzzdBY<~#+%Lz?E!Y9*o!su1Tsy@8;_avo{9O5n=#pjM3RCxA2YSS{4H7HBKk4| zYw)G)52`l!lQF%|_+WGc{{>Wo@T<;Aw1dtwO_3JNb}GBI7DR+`qR$ZFA@4fZI(Z!0 z@Z`oGzA}COaOw6r_ELSYVTpcu#-XkWMC7)Jzr6N2@lsJ&s&4<=*&9!u4J=JrZVAtjhBNLE0W6zpF=MpmO+c6vtqZXzEZcWc2xI5N6#;z>?nMp8!&{!);gon+M|V+ z6_?dMhr4s_7u@#n3Hy1`Zph5awFEgqU!XNC`MMBHSH-$B5tHf%KM$Q;AzLmy1hF2C zrU@K+EhD)HxKnH>xWAbTGe5*Vs=3U)CeEOk4;#=_IAU^7TLyi@zyxKSAh^d~N|ch_ zbC7R0pZ@$+a8JaNoqlOrO641PQleSd=0ACed9>r6a)~quk_f)$p6`TRZg=oSNDW!& z=GfM8e?El%kbcta9(BCXVHWnT3xvIFdx>#$exR;k)g%K2XmwwGBLTDgY&Y*6bISjT2C7=7q*$4uX-a^&6{2y{6C3sS!P{q8XAg=N6hKfSc!+E_ zXSZ~4`mw;_V!dW?E0msyexLEj9fCv-I?UKE4lm?W+Ra&Ub4Kz_SJBTd7^|Ysn{K>d z{pUpnGejXU}VCCG*byGP9e1-WvEaTA!CFmMpu z;B476hDOS;a)%8$Hx0*bg=*AQD>Mu*``%rpOTPdq{c-H1upp_i1rFCMuf)u=iyykB zdiTT+pEB!o80PMTtj88|-$YkjrfdGULgAd`ea7IkDUa!#O{^sO0>J-w-3sk5{{nR{ za3mvA=OR-RWz|@5AqCB!U3ea(`a}LXXz5BAH8EKwRORrg=J_O8##LV$m_OCJBD%-Dij^ zWu%N-MaqIfiRW7SglW1|Z0p-D5AVuL)x*b)0>+==rfDnG^gWY{*5FrU^gK{N`&Z`0 zKDw;95v$2(OIz+x9#*c+LiBptip-&*+ASy#am*JtQ5|*-(`AxV3h&uomsk$Bv=bW~ z2~=&iwo@X!_TJmc2nE|~t$~O1R_Je6a9fJ|Sn&s3NfQchaQjr9cnJZi$gVECT04x${S<#XnSW3{xrnVz;ZB8f5Ype`twR0BdPNW+l=$VT!=ZW?w@l*31AqgthsMUdNg}xPZ#)2c|D^(o&zFP|yBXu~*g2)k&hPtL zm@HTw9*nq;er;@U_I-0A?0dqZY~?pom{L4#h2V}byZdE0se@KJ^1lWWn@ySoQ!<|M z0@`ERII`y3o~u;897AOIP+^xpAWQE#ZHH!zxlr!Uw(kcD$0MQ}$f|l6T4=CaFF*w$ ze*+VlAZ0~v8}49)-lZ-1)X|{T)m4BQkIyEimPct*QeIkf+A@m!akDhYeXd_J^2g<+ zD|3~0Y4kmzS}*=fW#pD{YEO|Tre{>^++9FLRTU8G+DdGCS=Wg%=z3s(Le|Pk#Y%-x zW##>68&FxncdX#N{~u%RM>s*lDZKK!5=!=HX(KMwFgd}alD@_#s2O;aUT?ti<*7oNcDUE z3}&bN#+bM`j09#-nGrJSPD5!It(x{cktKwS)?%1#S>O$rukV0 zrw47VALeh?v;I}IB~l?7klu!4u?X5qF)?5l%T|8VR2yWE$0ioe^C}K^xGX`LmL(n> zq>LZKEmo48o*vXP#n9gBSF69H^~ZNEuKE+kak6I2E7FBk%_&#HOrzAf)0s(7L(-Cx zRAQPIi4pO6=d!|LutL?a5;!@~t*<}`ehqtrHT|w0Iwo8!zOy#Crxv8cim|a0yFb01 z@vxXA+jC${aU1>hlvh7c2A%ZojbB0e<}(VVUn_))l$1@2in8}dJr=bj_`Bh0x=i}G zH^#174ct~cK}aMH@Y_<5xjhj?lkedQGySO3&e{pKLC>y)HGCR$Zrkq}gG#!C8G@0E zadlr7*(|<~T~>bm_TdBQwq-WW*Qdtcj}cTbw9_Z8B&Q&w=y>5kMcpYtMN zz@dY}`k{Ijx$uzA#)ag3(V3UPRI)Jvov(3OdmjN`?@F%wEjBTz;q~lBF8q8`UUJ?1 z3+wXHVf-Za7H-B>LFp zin4IZ8|yl>SF0j=-)no5sv=$LieDP2`sxRa%bzKQelZ{l{k}$Dv^4kXlnV{&pj$vL z6)DkU=D5Cg{^!ycQ2e^?4(CH{VrV2zwybQ@g90VOc2|FU^mB3ObXJp!p{COg>-IIQEn3|5s7URSwQ8uMRa3j-cgvTP z1Z-C&cN{uHwgo32NASOXhG{#Gk3WQU!BN?6DO(}9Ym+wp1ZpqN=PqMHD_g-XRY3NN z^GaOZsN+i;9=ECK=^|Ixx#&GzF%|3{uhYEyyz;%T7VSzYTMzX}@oYpI|Bmw`dt?DP z+rBy^dHj7Hzl_JHqn+s-A{ei*KQ&qEjA zHRadf?5E5%x) z(5Syxo)_ZKH2vuNgseBh_dh1oouaGXnz(A~1YfmwXs7Dv@Q+cc-s%UpyZ94+q$sP| zNogLm2ySu!X<3;}At`W%CYPqUmIQ2b3pe}P=p^Ya*qg1uKL2&L)5B9QC;!Q^+|KHI zPIWhuK6|a827g9Lev3BzS%j-+v&pJNF~PSl==z@y5i>HTzkWH1(DOi4709#5@ZUhI zHGr@rh^8;OMTD36Mu`&hO4@lF+hcUPsY&^>|F>C4Vo?3X9?tX^1eFijRBCX?)TNYK z;>XmXVhvpihcVK})RsuqOJr+Edp;^2Wl`tb+nRZ`jQCoqaU|1PrilWFFrk!gy#$-* zgVtqxI;i|_u%z%(3=TPQL*>i;qso)PzgkrWvL&0vz5fI_rzuhcNsCVtYTD{ zr>0FLL zPTAeu?*x|c^*UnWRbY-dl^=2nT3Ne_Be;e%%Vz0BmEQ-;yHqxw0 z{!mHBD~L%_WVtH4mu*z0=%wh;QowI7P3w!n#S7iFy;RA-n#W7Wx>y=RfyxNC1;y8; zzTFNI-$OKqISwydy9*b0d#(<{4XY1F+ayAl5Y#W$w|3Y6y?-t5eJZ~0B#$z-a>mDs zpUBV=F9ZY~h;0uuu88}V=@<*Nd>SV@3R_`Un*V~^xUZS z%yg{x2qkCBgZ6oCWy5D~uue!-b>h4B@bs-fdn<(;j^W~XwYbxYI=5rJ!`aHL6`%V{ zeVJLhNmHiK;GO7h13ty$conZt_rJ|XWZE?#4x7}br(Kts&TqLhtjeKM;;VawU`gh& z$N;=r%SM4^5D_~_Ecxp)`}TwM6k*<=!q+zjMQ425VSV9sP@*ZCe&$(H3kC+oU=3Mo zP~N~uYHYQNKE=Dlh4_SU=^Znz^WM8PS&v#lt%)u*q!{FpzI6GPSQDDii2Ke2N}QuH z{AqE-+|XhP$Fds?jbqLH`f!iF)y#N{$>(u1Ypz?QL}>g)3HJRWL1Nfu=*FyUjs}Yp zZ6EOtID<+UN8V8h^JQ^!2b_ou7B9u4gJuS(>PzHoIOJ>;sOpcX>d~m`ThMhD&~*~T z@kPo@6lBMfh}Lc)H`vlnzR~H=kX7vQRqVM|*!oSnmQPMB*D0J&Tea5H6A<+G8+M=$ z2BwX2ne|L`MTYrXatKKJRw~%#=DU2QXq@(^%0Q;864I3Ms}eGfE2P&Nq3Gx>0=}X@j!v&Oe1QY*;s8mJlu!l%*bi2Z6^ZvUE_DQb;0( zhC&h%cu{vVRA_Z!C7KXA2h~0S=c4>Wps`j+Q>1I70Y`7S*s=PgNQuddy85#=ku4fi zX@uHIgZb=%N6=LanWaoA0`nnZF6i3Nb?BmtNOEHT%3M9TwrQ?LcyKHYj@@l{+3!7U?QT-hU{@B7%oM!Zml?f*U{5GuJ3Sf|c5} zsQFvtbcboqd^U`ygmGXGQ7ou?+KG0~n9?lXo}L`evGvV@G7(;q&ca*e9*KU(9f|@r zbFO+eS5=IXXq)7)Yr6T~2BdprGwMvyjS91mm!4zM6^i6*A0q>_^{ z8T|k6Vs2fuM-PK5|bt1ZMBkH+;^k9?k$dTERM+ay_cf9x`vn4 zfWJ3sHxDmHOF%NYcIx6>B_yL$X0Kc@u09Fwt|SS?A3$wflgX*@RC8YWX!h#yjGkn4 z8ASH?=jlqp>Ij7RgXnGC7)L3AbZ=+L6+fEN^mu1M=E5-U%N7JME zdSuPtXROb-iu}2$KrzO24-8T*%TP)9DyQmVg{_#%T&eao4#GO>`amj=`QWSvevw#Z z_Dl8v!nJzC7~-oG>r}_BuT`%5?a9L16nt-rRZ2`)$A&31ZAa7i8e8=3_FF6hrYCZQ zyJjtjH6-@aR<7hh)^1S~vdp!rawHPkq%qhpyac5QQ-gwL?2BAP|z?_HHqB^9iIf*K@}9~ zo8I}^NQOhK^(7(sE`weny{};(1KC@m$hP^Uf7*)Em3I+s3mYoS9zM5GZ74~{^$V_y zRI7yb2(_af{9>vZLXecYR>@wEDvICXEf~%e+fhrb-b9lTbY#)Vr&(yhtr*Ov*)gAB zT~sK^Xbd%l4LWnUPgX&_Dl*DfDQ`l<>&@1=Hhi;;KO5CtnSfPE=J>H1!Y)M>ftyue zr-S{M*_pokCT?IT=LkV1VaXxBzA-Vk{x%EG&izy)iL34_3f%xxcN_zD4gvoGF#jqI zKf}1wc-?mR8!yr`RXJ|AmzHxfHC~uXZxQZaSyxBq*MQh|70(;lHE{S{B{p=@o5x;m zgF|ww6u-#phIDDlZmjzXMx#{XNF{xX_|caEhR;VaX?AQMEE8)5ZXHdKsMTtpI1rT= z8bgg=a-3ARl_m|C9>}=TDe@aM>1s3iP_t067)2jfY3IHyXcMvaeFl5E^}>iSeO$tM z!mhySf)|w0>FK;^>it2SSDwLxS*Lq?%JV!uo>qvgwS;ioc9clvKsEZCSP78`G5i*7 z0TyADss$sC5lniq#vyF|ikJ70$}dt^zUHX9>eMMB8@`#owuEx3Li^wr-Fpfl)wWVr zs=Txkor0Ns5^IYs-T6kbvcg|f$}`i2e&WC?a1^AUChoPYuifJ+7&*XMe{cv@CI>md z9gbwSGUZ(#qxaR$45jiSA8n*@L}J7yxo@l5U@);lL$Kd!jcE;P&a}xi{p%og-TMWC zfm#CC(a!{1NfCHs-%Xtvb6qt3%{OgYUp1dU+gpEk2z5q1>`~8(b5doaF4Y6gzZ1D@ zGw}^%RxPpnwm!w@%gaKVpOkc}OLI*P3mbZ3=Bt`V8$9ZuFl9a}b7KS6Js< zl~4HOXJ#2#6>-b630isIX%1F_qxUvzU7Pr81PJ&m_Gk0BKY>5Bzb1J@qL!&VS)_BB zKtDRKP@b<3gu?& zhj0JJDN@u(T5M7#*03*LFLgDY4Q%QF^GZ*`F0(67bFjpeS$$w@|NL8>U)=TKQSW}a z?S^2oP)XnA`>B+1>f$p+#udnp=Kngi_W(ObpN5>)*1o>xNMF0iD;tqgDNK_z&ru{M z11ZH06<}$JM9ZS|D}4un7ZMu!NcyELY%%$zUUpSL$2+bOuF;!<%UQ}sIp-Ri5}XAq z8a9XWY4Yo?Cr@vXJjD$y^5OwLH@6ncz4 zIfMyBwc^6@3xz&4(dBpO^|}xE)Uu7WGeL$_*FT+fxYP4telTDy%Fi+xD4970L8Oaqkk%s)3j2$dyLNfB&>5<}6E6O&5DU89wA<=g9GV#3irL zr%p+mYACD6-_3dG`%J>?V^!rTCz~wiH|Mf-Hu1Uz#IHm^uj*aeN+z<@RmOF&zE`nW zxG;C$Y==9xjpU?VcU+Uq$ItGnUqR~SUaM`8?l|M*G7iue_>IEb+`)tN;b!KsPj^B>p~g?ADp(r!jug* z*$gSyb-EVmW*@R&=g^k)bLM8%4y*h)tbq$C>Obu+Rgwc?G{rU^w3<@O3p9iFQPSVu zChX2{IWyh+Gv$`p1#n7RzJi*Q168cHOHfyF@{3#Y?`?BsIi`0;Z6XnkMA$<*_oLyN z`8x)X{VJLy`nZbhx~)AbKGSD;UB9f^Wf|3hl^dm&6}udj`${74W#JGWsgWgol;;|g zR0n^xlD;XzUN6?RVsV0GqVzcbcv?dxbLL<}m-$&xa#+#0lHAO^JrMp{QaL zJR)e?)Z?`orRCRNPS9j>_)N&d>#diCh>X^h5sS=tk@5{=)Hi7O4(71W7_lmIfik9H zi0Pe-GX6h^N;m0xNF~4^;a<66``P!Rzv{D>Rw2YKscyN}h!{7Dl@+2|1R@l6`KO=r z?T)#?)(bGYRPIc8B5`fy4ex)d8s-lyqqC&aC#a!93Elf3<6RZ28by^)=fnrwcl9gi{Ert$6I=t?2e&4z8)*Xi)*7fe40efvn~ zJQkEDgg)O^N2UiKWVC1SIo6a2G%(SZ^%t4_(g3TGq&jcp$jzsMZf21fvklZuH)arE z)o-jc2V2Ovrbq3cfq3Z6=~!YOR4|aY8}O-<8?+f&&pB)Z?Mm1~z4cbqTk|uKb#Ub5 zW$VjtxtrK?kw@1WaPCk@W_EbJf4*MIl79X6%ND_+6Sja4bLPnd>M_-!ZTw{0$$&Jz zOs*-Xw&aWjL8PlrEK}ddJx$}DAl@j9Ua?Ay8Z#OMYE)@RN)RQqxL7tLL_anuV_-b& z?i4Sa9K4_Ywd~f;PJVm+1@?8hpYkC>E3`H?!+|#ipM!-#rpZ9^6(wgX+sUMKH6B8?BEsqA83iB_L**Cx~IE^Oo>9GYf6sg$<>`B-_jY+F?xgHD#?g! zNWon+ZK1iU0&d?Nhzei&Srb9tT_Qsm&2bgIeHLF%JOOG%jKkqoj9=^xq7ymPtuE&K zXkmqK^-a!wiSKZrFiO>+NCTZP>tOFVttFR^Rh1)r|8(GN2$^xw3rdbi?#iXj<(>hO zV1R&7TE(u z4{A>^C#BFuviq+FmwQL{VxpBqS7of26vC`Smt6q<)& zR^c5fJh;xnUYAkTGDf@C$XZWC=2(hr<6COuaUxX*5bRNCj=bu8fn(D=3{8nJ5kV_P zU_7uMjrvwRh8;OKE+Cb?pFcWS+1e7yFG`v1iz-ha;?+Q}psa*xkc2+2zg2&UuzdGV zke@mzi(H91HE#EH{OzZArB`xkhO&#pD^LZ~t4O<5d4Vh8iXZMA1+R$ml;6vrTbPE9 zPfDFq6=sG;eDQ#0wJ5r zgmVqWJGgC@PfA2I?pVgC`Vd5oBEpmC`kV^&2$%aQu2nZ;9@`rEZ@ z?K%2Ff3#q2kvxv^yoX)Of~AcTiS(=^vmM%pUO&YY{OEY zGWO@|Z=Z*ET^no6oqiB@8m&4et2LardP$va{6eqUcr6Ozyg*_v_5QW$)!jLH z6eS+{mUz+5SpeF=$2e+O+qW^vWBA*lA3lNner1s;qgdQOKa-NJFm?_yy|zC61mjt& z8$I?p`%AN<>?g}0ER*-1TKR!CV%Bt$#+)$`LCPh}?Am_mb)By;`VMkzapJ>M`kku(ltD-D`VI(=|`A-((NLNIyu z7Q(Th(I_PySM^%DZvYhNmsj1rd?DhE3@M-3X_scw11G(2`D_OT>pPN#b)41VmY+6_ zt1XA%m(aMrlIt6?8-JR~QF1D6f20sGQP6hBaVN$SjmBI})2_7gRx=H9cJo+Gd-K)x zajV6^-dKvG$1?WesA6SLyT6cF=g{g|3aZANuME;OPw?!RXQnCNH+|LG z&7fNK>hzpAe8Ahx1IC|xQr?bdzh9B0-ELKUCvX?AE*Hta>8$(``QzKNQ4GXibP1sC zRMfW}5B=E3ZT&sPMasReR8Y_9hiJ7=V*7dAx$s#;^G?db?)?c=@p^m(w{9j1dy_Cp%Ti!6 z^*X`{Sz^DJ^ziw=ago$_eb!OD^r;|L?hhlfT4eX-Vv zK()GIO=SZzA3^Q^%pMyCR8d7^M~| zHs)Yxn%v|xz(?TgdnQh$>JflNh6yVgbrNKTvfCASg-qbs_($LSa(~}m~GlJ4NLERVh+RjWI%(7 zYgYOo(NcP-UUBOW@$ToXC=%zC!~=po`xpBN!VE;cE${WYTWkb>w5{K9Vu51PV8tYo zu|A&q3>3#1SVw%l3rOaQTkpuq!u1q0qn~y%wZ2dd9tL3$<8mbKf~OjO30Icv?(>IC zj~2Twm&jJ9Uw--|BZnnY)$Z3!)`K_l6E*ppB|O$tKQI=~G9tp${#_J}SQ$g19v(Fh6^3DYD*L zOc?oY;{M?4Lg+zY*+=E>#42+bwKQpuk@?!Ju>SIH-B!q>1zrN+Xz+=Pw=@gNL z^Wp335sD#r7@rSW;@YAcbzaaF77gKFW0-IeL(?oayc0}F5^Z8F>bAw8soYyVTNUL3 z8OhjRg@`sYl`fOx2~;zzfy9jmU&_|CQqJSX>SgE_@nhrXYX`vzioKD_inof3lr|%9 zGK-gVf_NrX%-8X8&M4#sVS#6H7d*E3>t_;U8hxvM(Xl>L@z2P7ctyX}1o**PeKLz+ z*N&*Bey@d9%3D|st7#=H&?=ESWu`sA%`-YM0FQaG#E&Q~A)JGGBLLd=(=;T99SSn+ zBET$vtt_IwW{}OLqtl!m+Ro~2t!s!Uq|@fBF`aB}*1waib*G^c>a%7&EOv&q@RD^B zs|G<|=2%g=cF~s zB4&wHoAG_lRq9!RtV#9UlRpoww2Q`nQ1;17g(J^YIk~A(T_nllrb~NPt<<3VB^Fb(VZy8--hz^Y1)<6vefQd_-&$3E2QSgxvcZiRY#4LHgt9!GZr1aoO($pN~0u_ z1j;KW%WC~!Odb#gg|T6kj)N#d*OGpmguL`Y-BT2t~ktcqVYa)^NDrHQUtiQ6jLCh>tUxkgW?ig%+g3Cl$Maxd+-Xfm#Kjj9$+ zhebt?CyU7d1cZ2k9kOf%AxNU84YXs*&iSGH^FO-beE+*zzd1Ym*M|D_gI7aB(?!-zS*r$k8W*oD$^9$QlM}twA0l>=1f93i?wFGNj1hXoJmvM zit!ZjK&FECSRpIbj~IE)t|S89A+sCkvCEI4(l1;F-D5@D{{m(5PGHO7*M6`SX>wi+%&!)(hbV zlva;PF3VuK(@zz&EW7XquAnR7m&^|b8s9S=e8+e=@ao}*Y2mwsX1)(`OOQx45wT=# zff$+kHLozs%R!>3DFmdxIuLS5X&ff?^_@rGBKlZ*(WwdCzJxKEFhog{Onz+G47R1P zv+}jf1^F7MX&bgV!iIkEdnOa0ts{|6yv6i>u>8G_Jyo>~S+@17$T9`7+$iV}SI3sc zh;TMC{nAwGXSj}S&n*4@btHztWi_TXE+H>qx;QgD+_;sIA-k>5c7{*n zINFL@!!UfYq;T%C9x8w9zd&+1f4^yc{ONmZ`K*l)9=me@yEm)zH?Tp!ytiG-N|eKX z?|SH*PQa|nUZ;6?<9^aO(Uq?KS~C*m(2o~+Afh%_56FSm(#1qx88I_2*4CqDx5Pqn zSvEvv^f|xtL>4`5FHcfm47GMnjk!5&d0SWmP$21M{^E|-h`=g2+P8YEdOTU2EPax` zz*>(b-66hjf%6jI;Fk>#-M%eA`;6TriZJ8Yp-Dp1lV_!%T3eE_R~|0aS+Nm}7jEwe zg2X1?x6t}gX2M@t6-5|U1?GyqN2;#;1C}+2ws+~HhN-oo zl58P5ZOII^CIuaD(x?u!;&Cucs7No(r41xG3<+lF%Z8qHSFc665dG+ZowKn#m7E3h zlN+D3@$E?ISW@>otqtQZVudhfUhVuE$2}Rh=xy1PF0WwIBjIJ!B>Cj~ihm3{^?aP-17}$F^?`TL&9KK)q zWJIftUv=`m{840-hLxU6ZZ2i%=SsoZG==*KSf?KusvZ)a3Wy zx1PNW=m~1fS>fbX|BPnG>9H`?cXd#KCL>3wAcF`RW?-Pt=zOr)szHTPKjHbe@P;kae{cy%mgAG9u>(HRfYi2YeUZ7%cb41d==LT{^Q_8B8C)mFBN~sZW}%+)6I@i{=64NRh}sAGLZv zRnBEP2hJ2cKFTP-E9Tlv&$py2CzB?3+U7mu*ybh|TOB?yEo9C@S|1+RT<;`4eZP^> z2~{UtOd`XMw+qqoRo!#s$Rv@G(hNpgyf=X-NvtXju3aM_0bLl}o>W+19wQp0;J@2X z;&}VgQBaIbC7+yBEMFSbX~)W+v(*%`s%*Mf>`BHhyZ5o|6(=D)nsbD5@$GrYfL(N+ zl+s-fYE0rOtr`QtoLyoSjuD!G^{lBo%mC>d%D{)>molxG9`jLsNaZ1>akOhM1gwXq zib?1tj_bc(dE79p5|c~JL6^!sqbVL(gKl9V30)7cJvs3T#DJs&jbZJ!v}RR!#arcBT?qkAvrmv`P?mkJ*1$E|zCbu;G;uNxFjnYp(${iCq31vJVP zx@$IE_TCNIX}99&HF^38?$EzG`F6Z0ax>eraC7qQ*XJ3%FKwX0HmHl%7;Q5guNd`c zi@B>#@-wsw`VUxJXKR)5reFc{*HHd11k#}w-d@Z7__)-ZE{W+(fpITH6~TWe88=|T z3DePL#QG^G(s-Y>12;dZuXmY*xYrDS*N5hgS>Zanv+c(fJ1<)Fw*a)4v>*HM*uWuc zSZJ@I@7;67m=;$+(fA}qFr*`{i&T69Hw6QS+oqlJ`WoNqJ8q=8G(;yp zu-iZA$D?Vrb!SAdr28x}G~+a!B1w+9$vd;8yIcTtLENCJie;W(bCOX}-X|A9smgO5 za_akEYd`~8H(aO}Y$owTWG3@(!j>eM4)aZFxhKSGvm{;QYN=cW8U@^SoQ1DU+^2*w z&F%tHolA7B+{Q>ocO$X}hV_OE{o}>UD33+MKlJ(|ONa=rUvwjP_Tp;xZdON-kBgF( z7EH+dh5o=uFOJ*Q{z%RfE0OUXQbAq<&6At#O7GXt{(L_d{&LaIhu&b4La64#?!UA9_bx5mrTNy4G3e63Z*aHVKerX{7lS;Hm*PDeR!brv z2Vgy8Q7h=(M11W?r=#KRGyK!Ok1ZPh{l@?TovoE*kRiWS&fws(Op}flp||}@lk2&$)!Z^9#y*02dZ(|;MB?o5ukT*X7MgQ;UjSglnA>}R)J(VG($v(<*1 zOJAYDOv1U-1?C#&V)-NZB! za9(Ck12w))JuY)@<@`AlCODc+(1a;wUu=jAyz+-`)V;DpMLeo5dwQCs$?g`^RV*?;sYRI6e=I=cK{nzZ9>@c&e>jzseEqG!#-$TO)Ge%-f<~S{$h-uB924w_vv3N|)8^*anVJQ4<#w}U3>x5{v+$8g(@Oe9QDCHO=%b0}h zB30=Rx^lACm(@ELwL zo;WmX`iCjK) zmydak9m(4XS4{mHLqtZ?mbH@!?d5Ku|DD9jyfxa44voGfFcqHk(2uBK5;RHEq8K%(&XE+qdLCKWyyTIM6`WCzE8V-NZa7#FcHg!>X? z%eEdImG0V$jqj0XJuM!_wxMRKxQ%DYv+3@5S11|Hw^u)SrZQ{Xt>3MGSu;`)&@!hr zWyv@8h?&9>my|MPQN;#-d~p@HvRhjEsKo&&-pB_j28X6tgA=X%!VQMVH4uAwq2Rdf z&r?p8{nGeMEibw7%~W83B5Q+d70!gYV-&s)dKOP9=gRU6H^0IX3tuhavQkE?t??CU%f8PNEi>oDQ`3DumeS8AN3|E=k@|v)wR~5GIVk1_Cp5vGmaO0{0{9d1vZhm*#9bl(4m?-C$I>N1}sQcY0r7^51xno#D>)?ARj`E)6^)(x)SWwSxOrswD z`HxrdwQ(2shBT3sJXthiN%3#GozU|+Zwr(VDD^q`AwMWUPL|xILmny>*&4(hYI{iM6U64iFN^W;FO(~}-0zXQgN#Qk082w(y zK;p%5hw(jZ#^Q6jNR)_*&ep!g+JAm?55%?;dnKG{I6Ecj`hdT6fb3RNnR}7vxMf`# z%2ITwey0W0TTr>+zZ$5`9y*g&-G1FxrdD zjB#K4P7j53pQGVMW`ZSpgrJz5A|Cs!=na1q&*uRUvTGVCO{%eF$yt04VDqUHkYB0O z#BYtbk|jKGBJ&0@og)wy=oP#^=3Cwrdpez-U-BmS7%Z}IM@bIBM;zFSti+P*_%xHyKdLLRpaP? zi7$EJ>yn3gkvR2;B?}qDP|{D$B8QN?4>Ppi!G=I?qJCC;B=UC~W2JIMD=-NKcW@j| z{MZ=ncn3c?I%kinPsg6btamz3#a}u`%qIctM{BHeNTar=6)uQzTS#)APD+M7YS{_iMBIXZ{ zZuU(QQ}9e$-ULJq4axd0KKbMe%FAxjE1K(|8YyG(pUlb zG*);Iix;lsg>O-+_d4FXO8kn1zYg_D2aEr#-#;#ovrE5&f6={2(4%$6dD;dHoD`GQ z1iGKLc;Yjrych?2*Te35YQmq+(6MVbiDIk%RQxVCq{~8dhA`jME(K5`#RH@ZFeB{xA(g$i&$A z6?sG?>!~%{DK7F%;+Q6FrAAuT7lz=PHa);=6h6fAIw%Gxg;$oA2Bk=jX9Fi!=XEZw zuA(WEsVwPfI1e|FNSkyrI+@nyYDh+PW8@}cwE-;!E!LxYD1d*B zH*34N0q^+po5Mwp+@d?b25Gt}4tz23&{WcYPK_52J2%yCEo4JoWM5IZ9>LL~^14(B zs&wY;$%93=tYcCh9oSuORA6gl2s5MSj*9ZX5QG?CM^JPSvn!~YaIkp$&7v+6_n??b zmv03_0OHZ8duVFCQAW96+5K3F03E2u0^3R75e+ixJyC)zp;{cS(V!LP&2Ea~_^<#I_+eil& zxa@47%GO%zuY^5g_3S8D$8@&2hzvP-HWZL#`tC&Ban{y~|8(`ly__@uE;Z>g(-EBE zJZ@(_tI(WSe8qS5Y5~?t&(j=Hr?o0=6IppcrzJzqXCpJwFl1Xj7LwX7f94sG=#=_< zq>^y+3wy;)V|ve343I-!Volg0vD49C;1Yp|!Ykn_JtA_1Ii8d%swg#;dfBlon=ir- z48AW=Ihwn3zVkkUV$Y>xYktX!;>YIsO%TN>Jsr1f6>_@p@ahQx!=!OhK8-Q~8G3hT zMU2E@HWydWD`iPt@lC=62AR!E^c$Lp=(N(YWE>^wM=6dLHJ}nNC94>pHZPD%zMLhU zb5HUFceqvMfgKb|Dv3-r(4&;dfj(36BV$WZr7o__J~_cZ_Lqfhfjmrn;`~=Y1!?=x z(4Z{&S8Vk=Y7_XR7kXJ6y%&br3uXeO8qtRoN7^gJ`95J?YEiE&IY-Y_)CKSD9hpmI zuPIMCi~21Y0BpSvYEq%Mt?o2==GPOPNxq$3;zEbm1~BA-xlt2;1~qx#&ED?HE*i6u z)7M4PBrm-q-C{u zdj;yJ>K)%qOE>*6{?<>4MMTpfWyw5S^oB!=qq4;Z^NF3to&KGm)Ii#k(oAX?t?7DJ zYs=5~Rk<`*$ev?$97qBs$m3{PB1_k3MV%jFCaum9T6^GZ5*JVBA;O*f$b#nAe^-M26J_*8 za@0qc@yLvN^rYCD=Axg6L2ESI{pP8UTozQHV3h5-P?F#zzw>bN2hahz%jgZ69n_DR z7MUrJM_u5eFEKY>pGENg6QR`i%42x%iYDyTwydNM`K$;(ohcw+1dxD2WV0s8F_8BAz!&`~6$ z1&N{IH=El33P8L}0y1cK1E3aQ*PE%3b`fh0sXUBNDDs@p^FG2;$#{`+B83)*hM*KF z(ui8rh{*9DyXPp6iKo~<1ROaV^Gk=9?o%=%j431%*OyCkoU%Gu?=YMa4DQUXGprr8 z&iE`RRlpJ|nC6o!;604zH=lE$<+j3bFA`8&1_aL&2DvMh*SMcaYaIfz!wl5Z(G$aJ zN|p4!5_P$bot31`q+;(k)&2Vo?*{S8P81K=fipCg;!!E8eC!-{<`J^V#tm0#>|Jz5 z@bD6arO;Hh=Q7!HwX>fj4SHg_Oc+V9LSlldqi8xHZVf^K+E&YgB2HiT+h~cV0lt04HOjGWZhD;;ejYWQ^=leQHJu;B<;-bJyW)bB(A@zDKRaeoC zRcEz$l+V0%!Juk|)HBEn zif}1pt2ncKxigFIGGz$f#`&(QGU2y=lNZ-#{^nj&C<5wB`ZFLZj)oZA`?#bD81Re=S?}E}XE;tTvN!!RM>lnJC#@ zQUU^7tah{eO!58MA4=NxTJ^8NK1;>k8%84paooHU@vWb^dBI|Ga5LiKhgI%TqTx*L zLbm(ad4R7;#%tJ5G+ZU>@JQ%k$;9vz;sv6ItJ{VAI>N~;NtJk*Z#vc)F)=9x3s#N( z>OZdV$j$HipF#5urAmq_%Wr&NQnwO(UMS4L=TxQpzNsq8FBCq?a-tmyU8-FwUs1aG z9B4;2Xd}Nru{DG=4-)c*!f8dnbPMRY%Wx)@{ufYV>5N3P=)tc~M-@tCZJ5;u) zocDi28WYJcK|!25*NdR-8s3aQB8-UsL^Ewo=-o;^Dy|K|ejmt5&o-@d5)t&>O7CJo z%qHX}&h$zDDePMwHgL{!Wb0k|`vnb)Wd8_$0w+)U^^dQPrmvy*Sl|xXAX?wyhDEX1 z@fpBU&Md7Gy)d4J|1y%XhIz#5wlGOj6-x@db~* zvfbT~rrZ7f*up~5o71@QwD-s-i> zu5V*Q&Ad%dOGNuJMPD;!P~+-hgLh)9r>ZT|IObzGY2R{V`-+zdsM8VztXJvpNaDlq z9*jh4r(+Tro!7I*abyN7u(4aqiUAsG7ywjdZ6Kv>;j5r%YAxkD5dHedmzAu*P2=*C z!K5SxlmGh3Tg*%0Bl3yGL{fPCSkOf(lPLka;;o6+K@CD2JB%U39#S=4GMx*ABeI>& z{WrGdTTFd}yZ0G=Z5P;)_QqGy`1fgF;=P8Xy^NVm<@h)Hs3MQj%1anG8^EH*uZitk zfNs$z_IO4U!2c5ml+k*YBK3R-QT%iTOc!{*;zlJ)1jS_$DI^8PyP=RZgt5?}Q6Xp@>O{~phM?g8TH@m0 zft3;Vgp+=$`GS}d34?oHNfHYMhIVjm2@LV(7-+n#UvY1?xp=)}LJ6=Ej;v57QujUy z!kpTed?B}9pp2fep=md;)FEI863YQhV|Z);WGq0?gyjsP49+nI?o^f}zM}nJ62G{{ zS|$$E;EG5ECCEOyjxopyscX_Ah&a&Hh3|y|z=vX(d&;{t>%9GYdN?u z#VTWPBj}?9y#7%KZ}H~w3}$>)&WTesv6+SvFk(KfLr)oTPw%@ims2th7554vmIhx{ za;`^Hml<^?!!!MYlq%M${I_|9)uBC1ahLcXLA@um;NaWGxqln!9oqi`Fc-nk?l4Ae z6?emZ5eLs{c%5TGig{Us2eV*jE}KGr&s?TPFmrf+fEmBuz?;NowVljyxZ}(WfEfpl zt&i-9itlp4S-6L|w0l?g;?PnWfx(^H2wCk$@Bmr7rB>URPnUrEYFyG}+Zb)=fNRw6 zI}~tr(n4K2x<84jf}tWP(EV^ilUwAc{(*Z$Y$?jOH7X7iv>U-p3*j&LqZGn;ltKeZ z<2=moasVEU(Q54yop-f2?SANSv2_6PS~YfDu*2UdXxbEl4B2f3AJ>tGun!u~wK}pP zk4|L$i|+GspyE}P-xPf5d#HCm*f}|UpJGs!1ht?OZ=6J!VERtO&ZOd`9uKyQp7*2H zp_^FZ5QxPPB2{j1lkL=6|En@E5<;FX*#Xi%V7f(uU})KPGkyaV!<6J(VwrPCvLW72k2sR%%7P-QgIkJF5;MbYrmBxot4&TO zS~8#q{&QQ4O*s%XJn~sXUy~U^Ehf+8C`Hof%?l@sB?EZ<-CL4t-bh7`{*FqxQ-2m(=58hIt;la>pyefX`EnFq?_BXbMt!+T@gs<~lKp1UA zS8s1ke_m>~32$)eAF*EwTx2*6`9*K(d3xM;9h~h5a_h$p*EQVTyqY2AGmM>zjKR=* zgiH;;NmE;`x+bgYtk)40CKSf)n6$v$DekY+6JBelBJ?Hr-9)l`3IenYxOznFo;thd z@{IGH)aNLK@Qp#jHchU2lh8C8Cjl`3$pU;G`PgJoV8G{Nh^X7Q-9- zr?OriTvuUPAfvwbTEKB>B@zOHy)Lh5qNx}2J|wz*gFjdrk7m-Y8Io*?`g-9|3kN0& zIo&(zQ9fPW&dRCH|6=!f1a%ZMI4KltjoM*FF?sniNc$4$ayco?KuxQAY4g%C>`|p< z52cu)Bs;9#=AC#Q!;#*pA-prErT5Iq9qK{!0+zeLMAq2`5eSvtnym>0vlgWAeDT}< z592Qb`oL$8u%Jbv`Z+FH8@TJ@8A7GLz@v}G?y)SnQ@WLf7j8ko;CJ}wONa)7Lp-!M zMyYn1?(w<9zLLr5upG2HcmlNFYsRWN|LzaG0cFD2YTwwZXt5QS61_c$p2|B~Wa~B1 zzT4{ns|$~A3;4S+TB{Z>_XWGmd|}t;V~u1RG8AXBwJ5$&`pU83yTG8_rTFo#bt3Sp z7k4*_O6%`iWj9cbehA+F!DEk%LwewLv=a2=L8q|;#;r3w5RlKB*&6*9y5g&Bqb#Q) zryO51X-JIe z6kNxlD^Rc+4LjFRYvyMBOyM>}zP-|ZFew;3&4N8s+*A0u&FJ_6Qf?5wS)UZ!TK5>+ z4981;z#HWw9BUbl*f*6n>VOhu&qM&>zg5R^y5$Dn(XMSbI2pBy`UrH@a?>H69X1TRC)(Wp z%U(F6aKdSct|Tz(M=0c;|4B$R8z4Xf+)T$P-ENg^Z*9qJuw z?_j@Ikouc89zyvonRkbp(mgg%PY76MiM2}BLmbdg+)?tddD%bdu?h&c%GD#%F_`QA zw_dq|_$)dh?Wec+j(1HoJX|nGQztLMgn7-o0e-zwV72>hbX58le#ww=1WB20nEo$q z61Zld^d3Sk*Z*lbRK^~P#cNZgs<`X2vL=yeY=s!dO;5N(K>VdRm}y1cZo8ef@;=EI z_F+RCYUR=hDGASD<-rxsw<-z2knVnRba42~Dkt%L$Ap8y>jyTc0hYF+FMqcs`d0@M zUDa|GZxCr5XL$2R%GtbtJ)@E2jS379CZP1qEm6$(Yf*|Cg))T-GHUz$@ z+L19)KX%O_+;~v%>P{7+;fTDnOVZiN zuqUQi{=WNdJ7+m(I!7=^G)FZjItN51rCy77o-&)KEa+n8{k0mB-TZ4(1x+PXB~LewTp`qKpLjScI{%x4=prYxA)KJdZcduI zY*aO|WK~3Lj54twn zXNc(v%PJPS=Y2C6DZ$Jdn*<06!w5*@^YIH{TwI)C1yZfW*og?k>QIqf`A1|aR#pmB zPwx0%@swXdi0ez7RcTxJ5!K%}J+?EU{$Cja?Q&uXK&EEO9O@UWA3yb!CMWFa+B781 z6HWc98tU*U!OXE0>IiWZoGB+VP^pm3JF*!)kg($=W=?js#~^9rn) zP_&OJ%1wNu`?r3AL(hite_qjR08 z`z(bS88p=|`ZTvsnMH7pP<7r?w@0P&gX>$G;4O6F%1r$`ca(-G76gpZpYk0vguE%@ zdkvAfd@l=IXIRFkJc?uDPS3nxKj6pn7iEIjS)jv=Nw51nfEr^L8_aZQY+sMI{`-4} zFe{m+xKe(mv$-?HLOy%Wq);a6gCg>iSX}T)i8;RW#5;uVOJ+-`!t*D7jW1Ni7MK-P zO;Vh3gRS6~==PDX`9!kHQ2@7_9ZB*H4C7 z5TZY`q!-~mH*%KXH8*k=;N?#LV!Gt(anSuDK))cr>E?wUum4|#8@8ez3)rD$oH7io zr_~kD4oqAp4gRgKKvA}5!l%j-oVRBIznG$wpL}wE{N^my5Ih-3Pbgdk#mnAGQ%Or6pu6VjXQBZpchQuJ)S=b`7lox z>mw!2K>+E4L`QTmmi7KP7hsz?Dnb5tho!_Tm^dAAN)G#eE)gLMEXYf48t`D{N=^f2Bt(G{cZn~!)B|5 zVyJKJ$KPfP?}wKd&^!{6neH=*SPSRpn>J)1G=qHC3TW@xzBF3@z;Y89+=!N>-Cu^M zdk~W5iz&o(&MI^Hk0oLb&!q>!^UhNx_GwQuRRL ztHg@7*hL!T4P-+61H?xYSujW*E~ZvVkgOrKkw`j2*Fmm?SqncBHxo-=7yUd%cW17{ zngR38`X=xYqLR7~>8{UlbRp?J@@-O>Wsrr+Xf6Lrp28BdPHSf%m|fu678372JR#jM z5ZuyOtQv83Sf?-yZZ`l#k^jD3W8 zi1S?ynEEhyI^dF|eV@hwdk{H3VZQGtJ%%hKxO}Qye_|j((f+HuX_nG}|D={gZkvBpZN(I>nx0(B0JcM z!eL~?80vk0SHsuKBrrrK+#}Qq+PtHc`Nnb4Y(B+iNc%c*>x18l3y!<=p4@8EXPWhV z&wk=Fj(i6!!lbbR*zUibyRdL=u}_*YM3;rS9Wq}#dVroCkudEXD_^*vKJvf*m|xu@ zrw-+NH>lLPw%B-H)k)iTv#)z0nWbM<3p`7(Xs+N_&kDU@A@}zNc9qYy^NB8|oaaiT z!Ec0P_r9Mtn~!&R$`i|wYZd<)MQRwn2^QyecP0a}y3hY1B{IWeg?jm!2!aZF=j`wn zFHmDxyUV^^1jjTOGne*WHsVl4jf;dG**TNO3>09yG7^!+>lq5f2r>)au#O8RZWG}0v(R$Jb2AwoDl%BJXTMscu+A1b zQ)vh#&n5PYEX_Ui3vo=t_m8?R^os?~hs^^v)2jZ{f_Q-qEwN<#>{%x$3`7${VAUeJ z`Q2yogn}K&twJ9aIb=@mXv%B?vF!ifu~a^&7hGPc@eK8&Y%f92<)5=9sOH;!ogL z>6fgnDYG740^%sPXTG#64R00xww>S7A$CjFV7)iPpR9k>R)LsV8S*1hsx@Ob-8h)v zx<_oK%V^HJ$x<>GlT(E-4O?RE8=?wTt|tZ5bDC;##;ld%UYQp0G%{rzHcr?D9z~hm z8pf;eFoi`wS2eb*;#Q0uL%Y|{sN;Z)BHJab5j)Qn6$Hy*?f73uCFS2qR&^Q`u?}dj z@5;)-4sff;Em}`(k|jNRod->lvzRj>Cg6(@b#&!9p$OR1t6KbLUAG&g@r&fN%L`@a z;FmN@$DCp5-e&3u=zOYV6cI~o;@KNY1n(Fbn)BDG@F5_po%6^h8?~653R-|isbbAp zosGCIGF(o4I>@Tz!a2GDzpXtwOurMzAjKsjs*XbcL~T35M&;HhsX{ujrSe(gbsq@( z%rl$P9FwkcInB-4zOg38GOxMUmK`D6664zn;NY+9kmVGpq{MO)7HIen}Cc;F#8 zxpOgO+xt+eH1ZCN!GqS%+x#8d&rsJdwhQ6h+H8Lr;e*Z%3q7LN-~d=hLKY5YtF-hD z*%6DTwvV`(bJvZy*$I>eXZ1%dr_gq(SCovL%(Hj@)^Qs+q&pEeou5SmCkO$i>0Yf3 z8=%>bZ@k$2*wZX$P>xzn?b*F8#i_-qON`5)$&TEuGc@eftmJwPR7&GdY|1|y0)L*e zob3LZA&h7K!oHjB76IAPBHhM@M-3%AKcP~$qWgk`U=r0BM*6VcK z^zR6&zI@g@CoVq}GhhBQ&uW1(P2(D7?K9QLNqce9*OX3dhsq~(ApC1*=SCQyJ(P;r z;M^kjAOFb54&4)#`Rphwbb8kJcluxf`!38BgU;hlq!gph{ZHTrPUql5cSYB_ccv9p zqQ%HN*U}~=!j`LEq7>cyN9um_F=s|UtG=X>!oT*qtZ8@>Ln@u76t*=JV~TisG;Q7+ z`D*4R!;J1ekz%k(1jTpzRtm8CIIma}lyt}>oJ$37G4+2^Y%V@akZ9Sje3LjUmz)*Q zSUgPT`t>m~HWJVXu8KhjZaYRRXZy?W6|sTo14^~-$G^|qP*gwDqPW=J7bTcO6DQ@9 zPR3i-=BPe>iW6f6TuTEE`n)Ek z?;)aD-Q3|zEDF?3-}n|ncy+QYrXQgXN0MBpBD(3{Xukls(&f$W%S}j*m!tpK9hN6O zQxTtW3t@{kvc&AmA6Wy|k~@qT4cnUWNP2_&OxA-pTp7|&9)CVvfL+1MS>HHa$(TIW zHM8)ns&%R{ zb;gLM7Q3O6^0V-#zsj?8{)8uS@OptK)7p7GLRJA9lkN!Ls~n zauKxHy!1OUOVDxf+CjP`X=S+uNG9=5K`9oiT(n~St{?QEhlF25n`-nkmU;3`(ut2tUmUIRIPRBy|vzi62HjII%su)BDvL6zbAezpIximLev7$zTb{2CZ$A42_< zj?IiJeqSPP$H#qNBJsjc|H%F~54iTxOu_*0aBEuZ$K=*sdNMld_(*5kqv- zHN%lD(5(@)#7*uv=$zlEed?HDoB6G3)2b3o4O7#qXF;4d>)t+1P0LJll8fKUCIs;2 zlu028>|+{lJ~*mo`O{-MYYCn)`o3Oj=8Ld}8$yThV&VS2X}&#f zGLs_EBgYAQC1UDPG^Vhm!EC-rA|+l`Ly7;=ud!&E+{8oCj+dGb4!~URf7#A|Wq&X>tzFoIu$0Z2{ODtCH!} zIlPvj+%%iLI3N*n*8k2^SK_2N`_CRnDnngG@*^JN2{a28$6&ZJ;|_`T(6VbCM=~cZb{{b>dKP-n) zSuuT%Aj-Fis-{g^QFvnEbif-zRs`OSu{tT zF@9Qw=V2(2zy9pMtpDLKgL zBK{q>2zyr}Z}zOYF2K5`84arv1{SH+bI6=VbEhq zS;4Dyt8WBbOAkc!3x2#7Ec`I}k}C8ev=iukVle$~G!fk>2t0FonFh(NUeJCnBi=j* zGzvb`HL?Hb8rwnS1SM7?^U4v`YPR~vV|5zHZg!b&L zoof)*+$R2p4j>^%IC5N`+?EHk_WZA%?$P^7->Vx4Nv;GV78D25>f;Ps!8!bLdU`NW z!C%^}7nnR$DwBv%ge03sIrTD>{YMqvO@zP-bSk+)5$4hh+}^SOnQ*OWS<05AXcSSH z6dtHapR8$E$p*dT?o-joU)q?YS>3p(KGvvfRYB$f>KuGkx1#H``gq(7hL0n+xtbHG zx_bu}$8}liO-&~>S?W2~e4eYWQ%yU+EVbVf_&~*-H>I@PxEV!l8M-1aa!_&4w_~8NNk{b5j+2D}d>Tl62qOS+pu0Vwda@%{s|*)UNXm z3}NX%zjXE5ig7ig!+QEOW=(!x`e{d~SFO|z!Wv#0dzKy`I+ZvHIzugZyJk1zi>?a!c$=IyN7s0iBioEt4*O$)(k73 zGRAv+CEg&YM&8%G85&WId!CstR9#R$`p*+skv4ac9|}Lci8Yi%r^0D(c!QX0HM~W6 z>0bwy22c%og5*MU4CR$Wu0lSP??T*#d8sDDw?fSN?FLM4EF6T_k+b8CsQ@Kj3Y!G> zP{C3yPhk-Ghg2J-FNI$07BZmBoDdztGm26uub6N!imDi)SnaKtR@6W}CHX|jlVB(L zL=`X!c_KVYcF?TYdYg2cq@1g*;LG5VAW#ZhpmGXvN-~SVrbid^eO`Pax!__|dX;{q zsH5y6zSw+gPB-~#!8a!}0T3wZ$kj;{$on9Y8jcpDQm8+O7M}>$BwZ3S6BQr@h`1?U zkzc}RlJmZ@--RMVYR9ymX#$9Uv+5RHYcYESLyJRG{3sT6+?)ZSdKBMH9_kF^joZ$ri|dCqPBTXAlne#~D;HI10AsEEN@P2LY!r4M zlC_x2F)C(X^p==t?2Ga%U*5QQT;Rvx6h7MuUAt()d&_%ENK$qTjYtGu41{5rHkrTx zP#h<0SoYrV-jG5LNPVJ>yf>^<7wxs~brg)@8y4Mq9sCPgh&+kl42~tc^)d{iS4eDT zv17EeGw|5V1?7T(J&)qszju>II-~6wZgf|sn?*uhN^}+Ua6D%F51eK^a~asO?JVWf z2im*Zr_NkzoMV~3W{vUdn=8B8d)7|2!)MN}ob4G}nIDrE9zK&glN*yhlL3=`K~=TC z9`2DAg>}tH?@w}TYVAc0NES%YY$>gCHLYOQD4o$<(QWB~^&@NA^Qkl10t^^8^vlEM zwE659cC(0j179csY1TMVdX#J;FW26`(!;J$LFpAwJb4M$Pw+PmH|#+N(=$e=%#9)y z@*8DZyjA=~{N$=-Uj<2_6!VFvQa8{G<({HJnx(2R(VB&-(ABREt3SO@j~3XG<<}Nm zecNa}N2Jw(F^gXEKqoc>y4=i~*cy#}?j^1z9u6*^Ouk9}BR{8Nr|H%uk8Y1)u6^E1 z-UB?>EH_<8-J*4?$@Iw?Z#IF&m3RR*;JbmVucoh9C!YWfpzs;@&rMYIj{b7+^7(%H zZtrX4EB%@F&JKfn%X8a)+k8kkA&}9<@TKnyd_Ds2Ixp=n@QiEWP1QRe9m@`@uW&)M zH%c&wp&V4k@#0@%?*Ul3G5Jj;bh`!*^`~Y7#4h=53f{jZZqoNWRKhS*iKRkRn29tc zqKy?Zen|*vdhX{jm%qABs0>oK9uAfrr>(_WNkKppd8jB-;=GLH2C6s-OD@*My8BXM zzZ?Q=iNfQ&-;Y?-ldu_nOhjIDO)$Q!H>H~OBBvpyJdFD~jBkVRELp?}5m)tozd(|f z>!Wxq^2-FS5TahGx-p{#W8{3TbHtlHhQIB=a}j@-Zlrjq(o%G28AKTnx7g7J>`@Dg z)10IkDFu7W*oYpE%tKC9ma5eYgh!@4o4x=J4??*a!+1`ucqF@oQAe2(TU|t(5_i zGajgW64+I1n3n1;EUXQdtj@f7)frF7Y8_MWp$Fu1Z`q+%vvf;i6vsY!^q<<=Y&&T~ zAGQt+WKF}RBl8dUx=e@T_h44mr#*N>{k{l+X(VSmlk#U}J=5F;6DdcN4OEwFo71ln zn}4Rs$G39j&5Sz;U>+*C2~NY0$18xbrD7q7^1s47Jv@Z}lt1a*j&k~7go-u{Zq~`E z5rhECV`WBmR$g15Tux3lXMRo+XDUt}XRZ{Cw!gge*~o1pB_ov`ihC6u1P#GrR$-QQ z3kiQkWi-_H*lLT2@${6iWheI ziS`x~S@x-=H1&wFE+cJCGcJtfs+rC}oi-Ha!r=Ghd0BY+%1mVEg-L{}5}Eo-rJmc> zh@7rPf{LmM9E!2!DgT{S(M8~cZdtvZwC+gjaZ_LVLb2b&CYUL@^`m|D(K59oBGS09-l^BV&+IDD8xlqk#5i2PDsQh z*Bf`H!Td(82`Axe5gP&H^aHsiTg0r&4RnxvI}fK~JA-@SqyDw$#SXAtxtheWWx`DiU;co7t8wWH&e-CF!xJ9vvOOaGr7F4u&)K%3FOxoN|Y)R9`wSDOz zvg?)}9r}^U$Pn8xyAG&PR3R=lZmbtq)}CnHF26v(Hf0ggIZTYNBI^S!{!e?u*z4NT zzgq*-miiL+-j_Vt*}WMY>DgZuok;O2xG<`!xv*`+p1JR)0@doTQXi})gO(Px;hN<< zFWJ`s9+1O2wpZ_}ag{JK_P7ziar=U>_Lz3D6%^tN{w00k3EaE%=&_`}x%pPzWV8ev zVS@2?xhu97fXG~SMnn;_w5|K%!{gl@Z>)G*-IctkEMw36??PDI378^|kdJP7{Q*9Q zU*~x3R={-wrRVi)Kr>!%F4r!8XjEzxns^(@TXm9(vR$6a%M! zl&5&SQKL~MkiStoQ@b*AaqMF4bZ!sYUEW*1a^G<1cNllL?WvDqiE@exk7~wOBgAu9 zw_pD(d7n9sCg*j>FbM3m2&DPp?Siq*`sb?KW@`5d6#T#UmSYG)!N;YrH7m&a!s=bqCT zdtJlU1k+1oA%k4+9Y`K-bV0S`{oXKf!#O|a_-KJM6EH}Xl6)PmBzMB#6DJFsRigSd9F zg3xe)w<*!Ggr8&~9zwH8mQ}U2rm!YS#iOXVtnO*`()IOxm02z;sVo1Izw0;aM>^-` zBtZmn*&p(cLQ{S|9cINo(=5j;XIwFvSvrSY``EX5PZ@P?rbnKCFNQ+1n%z9Vhl}$j zpNI1$pR}zwO*qYUj-^NaTxQcr@*!l?ARLJhv&|{2AYG75o^DpK4w13{tbRx7T+VSaelJ+@;?s( zlui9knOoTWeY)Gj8^jzZRMqpKFCqGxvv*xc6MvBmv+d}d(oHQ&v_m}ZZEkeNce0oR z)9r{C`G~fd%>q?6{y^c@*~&@lNPeNlZUXc_rJG*kAX0Seve($#u7YFisjcx#^=I_! zInOT7A-tCsF<*l|GyfgPW)psKGhH9(oC?)g6#Up`AOG~aSRv-w@LFz9r`#)f`exC( z;hJ9Opbk)V2mqki9J zv4CM9`Eu-@t^mUV!DppYyE={T+~-eHciJy4ec>FEY4l~BV?=AjbC`34b67lp)eMD2 z<-*4Jxi0+C>+b_j1|}ySC(IfXE6z+7)0&Y}*;-<0(Ek8tK$*Y5iNNV)39d_Q9f7kn zvaY}gSp`Y(W(BTzbZ;3YYr1J~pmD6TH~0^b1sviYbMSWghg|br^L-2b$L)Q7@>t($ zZqe&vZ}ZOf4|~@6&-*XgJN=ja*F1y%n}7C!ilBYIeZJ?Ef3#>1S$I!C%}yjw8TJfk zCkA5e3FNiSfvNU}z>L7`zzol|Kw2OpU=L)GM9n@wu!z= zU}?Y=SmC)DC=d7p)t*ow?CpX*$9h89={~2g$XDts^Um<5u?Kp?obv3D-_8en}5uCr4{v>zti8tUg_`i57-Con;4i)vOE7y|Df-p zf3LroY~v>J4tRK#9S&RwTo2r;6oE$nd0MM4ktH-#YP32ntc>>$+k3LpY4tkJt8wuN z%^lWauj*Y=ndqMznC)G`tDm>4a^{1lDpM-cJ*O%&i%wQ9tV}5$aTOHRdw+&q!-1`p zyz=+>FIVPPIxCC3iz-Vi%PK28Jw+$6v%T=Y?Ir^93l)6juTE1hJOj?36}_$3D*cW38SU4MJgedFqJTaFq@D@$ROAWS%gJ| zC4{8}moXlPrLUVTeIOLAAe3ABbVx^$pHNK*6B-FEgf&LlQKLU?WA)Jw6B`H}gf7BX zLO)@5)SM7DLSh6wdjP=XNRu$qSJ)4#vFt!*nc#Jq6>r(!WF`G z!Yy6j94`|D&1i%4vn*cMCFb_HA$OgwQ`XnAL?fO_NFk&XG6@R_*}8o!%hlzgkB9Vl znNzooWkrNiLYZ-0Vd($nSiG##u$5MQJ~>9a#9J2BZD?7&5tkWbOw;3KO~%-kjK#}V z6V?*i2^$HUjWKi^Hh-|!=4F zP+X;7v)x#2#Ejub+(yWV8;rQwh+Bgl~=Q@_@j?af8=<)*oE)7-cd^!~Vwc3fmL#XOgthE8d&ifO$prn<$( zdRfdM`z=18`+r<9>9CmO79ThCL$+DWdg1w^wX>M)uK2QHcf}Tar0Zf@Pm2vdEH-pk zqUv*6605HZC1i&#vTN5XdYdK2TFbu3dgQo-u1iQaCA9XI*vI^^gx25^8oP`9!$tm4 zvP2)Fi~Pbxw(la_cahz@$mU&S=Pt5y7umV%hOPswnScG0_#%zLojiWd-E;N!++?@z z1$rB9vIBR{SUoqz?t(G@a~JD6b+f#c6V|WIy1v|Gza_LTyQ{{xhc(l(ULl@fE6@?? z#vRi2$7_eXL7zi6*|xiNOjqu8dS4=aFx#TJFQN6mWNGQRy{d%vvl7~Gc;74`|0$ul zFQGlEB!8^0MLt5T174klX* zT|wP^=rLG?A7P?u6V+}eOJtO zzJJz;+l{!=n4b<^&+wauckv&JT^mcs?SD9jSYp>^Bks2F$*IA(`|bfubYF9mjk(FL+{bnQ z;C}EP>mJs94>o+mvnkG3&^E$ymQG>)^G>eNE?M9in-6-!#^%vw9i!VSYyj zUkVfdJMO4NNHpS(iod%o=2Qr2&KZ$3XC(zMg(?am3JnyRDYQ~pM`1mMO%ysQ^nXz3 zqcAY%)SR6Z1}W^NaA3~xoI@0b<_z%{!)#x)t*16@qEI|aI$I`6gd*JHF`rnp3+`P+aZrfl*@mnMWx;pqZOu4OaXq2Q zC|h=yy!+>zoO5Q*xj7f-ynj9Csu6C?xoxE0j-;+q>PCv35E~Qu<6vQc7}4 zQltz5`!C-075F-${#`^H-t~>eyS`KKUBsFA7UFDt1#u3(e>fN4IZVSB4(H>mh8h2( zvLx|}*faL`i+k#YJNHcP#W`)c7dgJCUZ)5tW9i&ul%^{RZ!<-CTz?_=Dus(iIHQ-e zNF0-glp)C?$7ppM_-D+P=d|&2GP#?-xhVI`-y^I2zWhUxBL7IfB<@pQRbCbO(GNsF zAPS;?6n&i5F#dAmOhTgZRmC}x`YP3@RYl$|?-w@t0Le;5o!R(BjM-!QNJ4*{aVtDq}fSnNf`)sNa&%KW8`nj z-=vmbmR}~$tMaQtmUqj$g(82KdZE%-hC~!b5ko!tiHME<59-$k$cr{eL)ZmYh-uX7 z8X*>)C0r2VgO_wH8nNIC;kxDe)>t`$^f4ja(|aj&Pw)QVt$z>Rnx0L;NaMO&57x9b zOf2`Vp^3r--fU9vq~)w(lJ+KRd$K;fN57i>Y?+Dum=O4_TYTG9;LEI%wodzkkhL#r z>xHIm)HaG}ZIkvT5u<%s`?84BwrE>Kyw;`e809UNxP)WnC})kw}@$* z-X9*GL7>&{;eRwjhK}U*I*(%$vu=#xVLM{!VV7`E^H1AAXq(nH>k`Fjk#ria+sx}( z>y5MpNo%M~o3)%C&ng(Zo>fe6(3Kx?1Vk@0%{eh9kIPvxvAywaS^7xnoYND^M)Iun zslB6P{mD5?Wm<@9;;i0xf`3-uG(VN~Puosux~4q;tbYMLhE04)-a>QwqWmIx_*dnx zidgMg?OC#bcCDQ(;CbzNvVhH6mq^fF)Ls1u~+k_8$fRZjbHm)*(MG`Zmc=_*sqUrvgr`-8aKfIB`j-WgvMUkaoU<+wDyEba=W zGAX6!S5T;oFQZf?g$k4@jSqs>Q>ZjTCc=1$raV1|C0XS->B@=HnV@>hB#FnOJ*PcK zV}I_}x@pW`)4oQ$_q_+vtnbH|apxIF`%7H3aK~++&=J=~bZcBc(XP1dgk9k5j@uV^ zkmzo@>WajNDd#A{R$Oy9P2AJS;jqghaZKKB$kHX5a?ZwGh#QH!Lb5i{^$CC}1@?07 z1+C++9bxQzz#W$uH#06JE}dv*+`_nQ3V*o-C-D;FisDL%TSU2KaTRfugkW4f@e|{k z5He9d1!b*ayhKx85nU%zx&m^tkFW58KQ%_U9 zU4{py@wdMuhm<1@(RI%_ZiZy1a*}8p$4!ya1zC@%AID9SlEpf@UOA2%D^10Ew|`_D zmrPHT(RHSUD~lUqv1MgQvyAP%Jv>p~CVzuUyd?8iRlg;Fi_Xrw;_`HXyq?th2nVKGfUFP|rwZ_01dYBLl) zM61nD==6OLoxcBrY=cklUjh9R=zmx5N`J+Y?zE)4Ea@#qn#L}bNfmU)TVRa+KJZ+8 zpDfKB$19MEiKmX^v*UORBnNgTD=%Hj#Li^p&6ZgA{o{B%yArM4 zRv!QE8}Hgyo+`!CRkf8TZcDOdx6pal#VyNjq4O?_YnI(Y=Uo(UTWsP!*nc_Czrflp zVeOW&b}O`Ychc_PMJssJ#F@}G-!&7R7XCjYy}^=hx6Ia8Ea@-ZmEK}0v&B+(i$&%Z zOIv!{Qa)l0Jl-_i&(FYD`+3CaW2H5{_uZhp|HcZNm?dH(+;MA{jpjaKws21gPYK(O zF`cr;c2S$F&9&{B64sKZw0~)HDQ6E|wM=OvY#_8ysg@}nl+%T<2KCw~bQmG52dhL= z9!rCa4Hh|TkhftjA-vj#5ci0>rO z8W!J28Ym*fk3l_1I86ID{oX+) zNTtwT6IqQ=4iQ3Qh$owgk2a8?1AOwmc-jZ!7Z|aFkYl756AFxU@)$B{1~U7EJN8QK zb!B<%b)q@)Rib@LPJdjH5>nVdXGn)) zPDerUyuPbr&z8zS4}qiae%Pap zU0&Z`_1#$C&#?>N83e6FNt_#$AXBy+O3UD{2R#kigxo&l&IM;P=yj&53;d&?Bj9X6 z?pD;g2#Q~(q06s!NB*_?4@AES`fJ-xPAjiaZZ|jsOqJJ={+?daRt8GDva*Bah#^}p$$Uzs zGqti;zJEft@?~2ArGKh4Qu<#xt)|=Rh#pqk@jFLkA+{uSgsF|jVygxnV!rkfPAf~8 zs*l^~lx*7%&MKx+O-!{E8?7@oq3$L6d2Ux7_?doGe`c8UJ{%yF||!a+5_4S8pHHX7#8^2o#Ryg+jrg}`V1`aO-_q< zkoIt{^e3brMagINl1K|qOD{uCFVbD0y`x@|un+tyNazK{{fLwa`TVsBNrK4H)2rv^^N9Xbihjd+4~m8rUkslvaKOg1lGBKrI&Kdt&1TOBg+-He@D@8Ds4$~S#9QjdR8Th*>(qZ|2UVl`&_n^BC{=ZP8(x-SORA>}Z zf&3$?dtUklBS^gUs&z-=v44L; zCXbMQCf$I9Z=%e<@|q_9CrW;cO3spxut)IkvMKHCzqS`t8UED{&uWKfwGbyA-cg5= zKa^>t%Kb>+uh8g}58;>HehSVPke&~l{{&O@9{55BZ2p_N&D-`6ymjEblz(>6R`7fIo=nwHlIf7j&qmtR9B}lshLTQjm@lIE z7s{7|ZUP;mdkUtTNMmW*76jB6VwH|5@lSY+lZ#$A#LB8%3e=pn5LudIi|FuvDF=e zw}wFX8D{`ap9dYlN^%o48Whh@hd11?^m5o3o+p6Q4Qn6LEk|pD-QGr-O11<| zMK164{h(Lb9>`PL(0V`oWe>{tqGUHb#fjE+n|H!5VB73vM1#oXyMOa)-3%1GJT?YDfAg(#a?}49;B8 zbD%xQ?L}HfnLc$bO5S40Nbf+p9O)LO(s|}c*TFx*RB6;}>A6TJ@}4dqKzb2VC5YTn zrm8E7PR?o$Q>8uXA%E^CIO(7l(5tD;C(4{;P!~#$fNn$G6`Yn2fSv%|$b5M|>L!Ca zLBptZ4rMOltkuU%5)(8U&t+pnh)Kw2G&9Yi@|RJoei3(B@lfXb?55ZfDQ||=h_19ry6711?%FI zxzo&3`*1MzIUE9)$%SgO*;vIXoVEE{FUQoU#7^`VQz0k6!@|#g|8rN0h!5?9nG&}GSaCUP^`Mb=QZX&l4v%DC&rywB? zefTnDK8aR7gBEw8hfb6XGL`zYG@^g7-HX}bG6g8}D}R*vEF^rG&%^TX;J>l3oMg}f zP!)70Xb1Z93zWBk)527`4*D`U(?A!3vl8iFqI@yZ4JzHI${wWiLBD~K{+I1ZqF+I+ z&!Y_HLXJjn+gXD00?MyP?${LL)w3XcB8I@+;-3(qTS7` z0qG~KAAh+5W!4}!59xJ~yh=~ozE5;IaucyGb)$znLF+ZT*N`(%a+W@7whg(J%S)rS zZ&P{!_zy5gnFpP$=DN1eu_fCYLANkfo>!02{NBfDRYQ6+`2QEQ33R>T1w7J_K0C1d zURZdLEu7NqUybmBz3_r&sd}arMq@z(j8s5zs*bYt) z>R!|N{2m$gis?7t(e+%C`on$e!+2MM#_8)GX6^g%iyN3n*jr2n=SI(C3EE>!qei%l z_J2Hl?bA%7;n7j`;LqUMv|-fBYVMDE59D8gHr$YQflmlghi&{D$K_1b$DsKEX!s%c zZ#rt-gvLC`{Uzvk!GD>l^crTt3w{sAvPxfvu}Vb4KC{s7Yw+bf(7EjO>Sv&(o0#8D zc!3|Z4z<1w$u8`tQ?(Cc9sV$OjU-6m^nY_~Y4TF&?c=DsS=~bEr}&;oeMBpSx3cZM z0DY<`S;%S8uXOOZ@Y~8sOtmzmyFsf#+rUo%ZNgpr3Z|+H^a9hUBS@bC?M1DfD8CQ1 zm}&G3q_dHG6?8SEjqv$R`6))U4e55K>RO~nm`}SfP8y)YsCyP=l0h|;%wkG*%YXA| z=d=y?HMU&d`)t)rwI)yv^jA!yD$wV5IIVt^DXsQg{?{n859uH1xqQN;UJY_@L9^5s zc^_e_u0pOI^fRCyJi*wG9&W>vlYTr!*{t3qZO9l!AA0yp?9R_9{8Z|<=)O*pe+ zZ{R$tfY>Oq$=#V-f6EHbfO30cDPI9pLu{vkYD{NA(}Kuc0BMUWCbHr(sjKKtWO*Ob z7X27GTnCx}j*QVB+|klWsbVGc%i(hvGl%p7G5kU-xxHl6xDrI@fyhsiI2BvbuQKp? zoYbWYxNZX05l*dvYjzoI+J*q zQ_w$$zL3n5jqL>V!|EP}s4`*Wg1R=)d_)Ws`$W(@fd9AXQ8eQ0Mv%EcO4$I^ zdWkrflRW^NMeOM#>}5e;hyGTRNaVc;pTe`1P*)ytZO@hym~#W{wZ?f6rvdlf^whYW)hEhgh3y;lT;= z3;AY}H#kr163IF}4iD2{vm3eMDJ)0HqXl^&JUd~3;!f@bY+u5^CNiY@eqyP3O;EiX zGJG25VHbiLR>vInChq#Z2DMdf6+aFrO5LF5!j zZc30fAv;Oo4n^cN>{^{+qfQtQR;V}TaEV|uTD<#UZe(NUb``TO60_?gL0Jt>iS>YU zf&GCkaXws!6X06Nw$Mia{RlEN5UgJd zO;`Br0sA39Z=4&a!}1nNJ3!w~Y=xB4b8!|OBWcKqq7P*8BwP*hRAR}jhh_#e#l%u( z3#=h$TteNA=n;`Kq0dC?w@~*0YORB&mXuOCXsZY8y8;)%W;cqOou0s=xUWB3UL_{cZ-W-~1zzfiH113R}3;8IpAvDW@4)Df;u^o_~!=?%3nb1Fk z#sV@%K?crg$Ta4LECKe7p{Yllh0yq-)EKfM`7VIk2~Of+1BR)CuvrhAG4Rj_Xb63G zU?8v)&>t895BR1-<|d9l5HZNa?=s@xf8Pd{=#i`(dLzjFM0?0%5fw&_x&%B1yecAW zZi%xFcnWpJXpe}oiGCmt1a^kc!H`#o^8tvpBaApH?S)z{(0~ou5}?RQ8Za2GxI%6y zt~JzhAbiT?VvnH5*{n>o3=qG~5!n!D4s0rj%%T>v95RRRXv8=fjKY1CqDQnBe_FRj z>F>aKz`5|5fVpacSvnf>10aj}%tLMm%z}Lea3bvMq2Eo;jb%fCPoU98-Tu&Y1=gXK zE${*GELM{_>|04|gsid^z$la&qf}p7S;WsgSb9q9s|c%7)RVEWMt}8C`UPkUtbmO- z@Cz*G!>2Pm^aXB#WhDIfh8zd|e+twJhUb=u$`2l@U|9=4ZD3yv`*PT~16pCcl8C)x z6_Mp139{b_a#$nGN3fAkP#%TSd&ocO&<{Z?7tuOaF;y(-Nem-_2cdZc#CL_V9l-6V zdj+u#0jqJap;4yp4or7w`b^e3}7qh2cq@gps4}A2hIbc z@3a_|Gw=kk3Z=gQ9|FIj@1F2k4s?P375wjnrax@J1IME@3#Ffc)zAz9E+Htp3q369 zSjb{2`oisld>{IIkiiez37iw05Uk|+QBjcno3|T zY+NB1AgVNIwt`_V$oo-O0~iQRSIBKq>kj0_&~Jkr1i2Ap^n&dN)P#Kw@C!7_kV6sG zGT4hV$_KJJPytJke;KsSc_TKACWpByZweV>%65mm8uA5Lf?N3<=x@QlKQtn@Sc8g% zCajW{ww^m84gRabz6ADJeOlm%CQRMm}xB9Vy%D&QMU{-<`1h44H%=bf*5hlVtz84 zftJ9@u)%s~#N2|pO(TCYAAq{R-wA5$AgGQJRIDMWb{kP)b+cnp3RV@EX>w#m4l9K< zg`ZNO7`ZhNe|d&AfgU5pfF(7Ikpg*7A=*3uBFk}NUy#{o%zPU8lYIkB1tNY{%;C7F zFw0T*SKv*cm_u*}Va1gw#(-JPt%S_LKkh+H9rPGM8h0qR4^X^cVD_>TAtOW5@J~gN z`yCaAHxMYI5$?*?0*2x{=oRAk%fLMH4SOBF`>y*1f0zXP2FoDaTPexL8gJZL!;;`a zg0hLQ6yGHG1a^}AT%^dGIz;0L)DYjJ!?z6m$=hWDb_X6O_d)W^&V>LA2+}+76u*EV zJDQ*z8kRz-D@skEc}Cu&5bmc03kWJqL=Qw}M?)j}!P^(?W0bxEE{A9MWM#l?=sO^i zC1~XVfAk*EECTk1<|yjA!3Hw(J4!b}uMN#u$f(PFCa8#kO&rh{rE2gt7mNiz-_485;ntu4be&@a4R$z1-bh^*SWSU0l z9_WprpAI=d+GCR#l3|kq9Dq^-l*R+Ep>=zd-T_X4eml?t7zUe-@V^|IOOV?F+dwlK z@)gK3$Pa)AP}dRqvA||%B@wtE8Zb<~e};V)uoN2fn$m%dGxVQ;y1)?NM3h=Vwn6Wj z0ONp$D4m5;FwbCI7{o@yMtGVd2)*n%WYO~}pb0b`2&!R>tV&0pUA>9f95ZEx))?wGTt^XM`97w>rEtur~^ zKWB}^H`5SXwfNo|IJdy*q7tR=!4l4qm^FyAIV{JD_fw3^O>lBvjGu7A;rW-z7tcJ= zmKAw_URDG96Bt39NisNFqf@22B$5S)p#uGyh`ywflLVos0y1Wh%?Yx@f5`jx!kQv{ zc9%{yN#qUc4r6u^e21s_=R}qj6J%(-uluI{4dI{g#`FYx#RS>O=Ve2{Kq6wB3yi=FIVrw* zh_*7(%6P<6C+?1m`>t)Cx*p;#97l*%hkbz-Fd@J%YWJ75sirHhaf3WMu+E1N8vGpxYY$oc%Zn9t%W)1Cim?-W-4kfLsMM5VMf5 zV|#zv+kkD!cVf0Lt!Q&w@&5y=!kB0Oaz)tUVAvama@7vP5^`$?wp>jZz4(1NGP zge1xcXa%&58WA5$k+)G9FhTylgw$jIMkAv*N{!N^j3^7rMp!!?sP2?EC6|$su9W!q zET_b)+(x*{$Tzzbc}G*Go+N%&FBbYPl&hCZpKB%mmykzCsts|GAO= zzxmxNZkW(J9hn8~#CWp(DPyU3fz&`Mf*M98Q{$<0YPK*AtEe0*m)c7m7W(=tb)71v z9#du18>)u-CT!gsun#GQy~W;UAK_ZWKF0M9TY_sb`$V|j7Nn=R-WHyb$hC-lhU*=+ z4A)}zIYkTCe{$hdkzoA-*W2t%T#MLOxZYtaa4lwE3)V&K8{yL(!TK$(x7l~N7O|DM z-eIe7EoR>f)_2%y;Zw0-{Q=k8Yz?kO>_=Shu)pJ4%zhHAi~qz3`IWkH)YN~AkhrXgkwZTI96nY<3vU{xyT5o zAdGNoA|sr-$cT_I#2-i?#gwqij;dDhtI6aXOPXAvpvVzK{ zwo<$Q5hI*|$OzX+WP~#m8Q~g>jBrgvM!2Sg5za_tgli_w7|vK?#zbPqRAQz%nK7K1 z#E-eee~*R4i>1VimBdI3iIJ8PBdsJxtR+TTgAp5vkv0+|wh|+D5+n8!BM$!oBj>5B zR1x(MfBjue)e0MF4UU%>QA&(BN{qCX7;%yqaRwvpBu3gxjJQaQxJrz4kQnI*MmkB1 zxJit3mS#*BiJ7hvGu<#_x=Z}HOZ@bZ`0cuBnUlz8bS@!~D=@*gwu zM#YGa#E7rNh@ZqrABhoviID&>5-2eeBry^!G16CJBt&AQ9~kK`F)~16WT3>zAc>Js ziIKrzWQfE_n8e6XiIH$=#zaWWL}JE7Nz6n`%*05{#EQ(2-|HlC<8Hb{$o>tekwV%h zfAeD$FGsQ&7aLUxbm#xjQLQIgbHJsQ$DK^G%Qjn!iXX*lfSB&o4_JS1W_ zOp+Sow_L0!dm-0%7w#@0)KDR-r%;or+3LepEsapMl%Q&9q^hMvRZB^#mPV;sO8(K3 z`UF8r;Nk_{L`iC_J_*urK{r{F{#it$e^n8ss3IDpiYQeT(O6YP<5Ur)sUjM$ifD=| zqN%Egrl}%IS4AY`R++s_*b~u4Gan7>DmSfIcVSa@gGc$;OaAPyEprC`PbcLElq( z`b{O>S4j_4(nFQ>NF_a1NhK=j2_#M!aRXtNTTs^YC84EtLR*)GYqoGL5G>Zw7X{3w zpQ`GWO8r*Q3+YT@RC4I8f_*NXe@AK1yXoCjLwYa0PuLwDpbt`d^kMqA;GeFhZ^o!Obg&@!6VC%1*^09~~DzGBzb~q*901CQ60AA}~5CA#r4s(v&wQe;N(_M!xZp$%&&A zV^YlA6O)q?lfzTug&O93b5hReH~FJHI6fiTE+{2DA<4|&y&G@ZSWD@w!_q^3x9dS0dBmHA%UqKI_}ZKTz3Zt9*7qOyp~vCtE;{S) zt+O2Rb=bD-+R*#m#!NLf{Vhz*_ulk1N4%%pz0!B!DTmU5e^1u0%2Mv@cl}dd&8b}N zwRu_(>H-VPA9D{UKB&FK4^Vo{iyYpic;Smhg?`Vo-<%w=Q2iJ8ZYJZ#R7{U?JbU3w z(}jl~?&_V-_en_U@n!BrgYz1xv8EIBQZ+gaJ2Y!|c8dYF+*&PNy;JLoe0?fvwFY<; zytMsR^Zblsf9x5rCbO6oS8Lb$ZtG$&qdBirKDa}^Y3Y{O9^J05`K7Mrp`p&w@h*kg z%jWpz^>aNF>Dq-RKkBq8U8XKD!to{or6$^}A!{&4d2XjWv+vu!J^n}CN(S4u&Of#n zbI8P!ZNeK)HL!I0{9B-BlE&MvUsJyxXtVd6^MQtZe=sp<&ieAb`Cd6*IUX7AaVaTD z9UL4YlSkMm{1_+u$ixJPq~Y;I>yVV37&Rs`Wwe887|AGN5QSN3FPQNCR_vtwgs?YDLlxu#>%dSk_x;bu;*8UrJo9-I+*rCX>Z1Gk7lKf6b z+nx2=&Uno!*}HCWjfq7r?=kDJUR0xNTA6PLjas?%h<@|yBVWw9IeFn1MX%Y} zBQ--j_2PbSe^R5(%R}xX=9hPTb=H2dyT|BL(LIMoT~6D-Xm;66B5 ze{42!cFAH}A&tEe(pb?SX-uYJo3{II+Jvp-wjg}^a~ezguOtgg-dtStMn9KFMVkf1 z$Bq=d{*lP|cD$3ay_2JpGf8Cacvsa&e%kc^i$o@wGylN+UnZs{-xAy9KV^-WmoVSpIc2{7_ZD2+5WZ!s zewOjJw^}KmwuPjfiT(8axcp6&Rv1(y#1wVAV@4$8LCm&cI|E1yG-a6~n`c?&OoUx;9?KZdKO_dr= zdgj*d^V_mYyZ7lTgAdfjy*-Nu)w$fAqie?#v66^ zZTXRyh6;>?{?$Tde$G~P8p?{6f7i+r3KlOuwru{!CgJU!_yAI@%L@5ovnSu<&*RgU zSCWsMzD--Dv#WC(-idGT+SZx3Q?`o_@t}af0lK`*i zzPxzJwr_dfkL<2Dtb zty8$Uu(9=v`E6a=+;jhxnK$Nj+a)#IOJl#&54M>2xqA$5*6Z1mK89737gf#Hy_~*l z^VhB0!#=JYdU3+}(-YUkf4^;>e&+qPh2wfhe7vh=d^bq1ctv2P^U0nL*#YpBdS6dH!Aw^J~-YnVNm(zP29T#Gp2rJ)*fSe=F*Z?%+Niy%w}K zvio}TuzFCK)3PUq=Z{s4c7EBf^66{Cb4?252RhyepHX_a$DC!GGWc}vgpltxi}_9? zylqP(?ADZjPIF<%9vbRPTFzNoZ5t(PYRCx0E1U9-|3;~<8W*J<-$u*}R)6G$z{Er$ zIS2z49}^!Lo)T@=e{D=kTw-#3N*ahW;T zF1IJvaVw3sZAl&-^1ku1vhU8zl5>hv!%W9|OrPmucysh1?s#nAf-U>w9qu>PtXq=O zx-``x_>loW;Pb5o5#O&|3iDL@A8Vyw)|J1J+*-%lqM*H>TaKe!=Cutj@|mH2A?emO zoa2$+cl$)Xf4F5A@!rGjMV=b-hjtBVweooj{cko;HG-B8DBH~Yi@B^9@5OuMxaV}s=<@I9GF5T1FttevLKX}D zDU0>wg{1sb7IXPeHgaUaxQkx@K7Y|NYJh9!DJ?zsyiV-8&+*W(*V+yvb9;Sy9X95z zPe;4Ef9|_9>#n@AQ*N@nI?;dCRP(`kZVo=jH|B<{eU_Ae^x)^TL%oteb*|_(2&Hlq^O7=1Rb3M!7hYEd6*a&6=M zldblrMTYd)7;x>&t4;kw9<8B0dN_pD+}~Z4?l|(>=H>cjuj5~A-)MX4VjCUp=!L5v zeB4;8*HS&&W!d}j&AsyrpN71=Ic`Oh&`ZvSVUL!Y^jc_lYL`T=-$cU1bvM*1!Pw~uG4E2g0+SPAw_cwlTe-EUl-P3SVPcWXUY+kAz{OI|Hug|@7c15kK z_cyekc$zaGU%I?otN3$E7cIZE;NBYZ-CCh*t2XY=h@0MEm|cGAaLQ!Gu4=;xzZ*`s zIyU>puv{;tL)OD*qulONlOwzeug|`8v`MXY@`5v)-1g92ht2H+_1t^x1{g0ha!|u0LwxXVvgs;kH7bT`9bo?rX)J;N^{aEo;_&$?jF5 ze9QaP@Rt)#zL}$F_(_{xRW;{ofAcGCt!AyOu8B3a{WjsnY?F!?ew#L&u?)Jrpw{Dt z`pqGGZtm^QZv3)!#M0Qi)(<^{_Ga9CZtZE`Dlel?-@pcCjP2K9nVI~^Ssw=Q>uM(# zuRQS5eC6cNxAZ@#9SKSZJm`_Rz9;4F6{Fj#bxiKcvfJ`$-W$Kn*rw}cf1sYee#YCr z$!N&rIKc^`r4!OZ(;T>7Ql%)I^q%mp`t0-pw~1 zW$#K)Ez;mFF6dcW71ZcapPfs}UMv`PXX=^qWz}+rnar!jHdYo%e_wz9RyJ<6z1Am1 zY0`-%e(M$v*GOJ|bc5^KSi1`W+7%I@T?|*vGwV{SFmn8IRq36obZe8Wd9fnNt$wD4 ze#u#l@P$=(k2ZeoH*d-X=Qcw&oql~{l4kb_MM25t@A%94r*kT2 zTsAL$ZQAEjf7ZKRPd>?_6X$47x)^`4d}PJ8mDiQ6>$NWo3ccssY{R`;hwLu)eGP|S z(%hehMkNWKVg-G;AjMH>8(L1a`iF}(I4vnLHaR>gF3sUjHx)KrMkU7- za&9A?{arr2>fMj7aIjxovmoQRO}zI0St*l7)h~H}_&IlW;{1kf#+|-;=;guFfth}8 zE@yvjf0nSYyOHn14-uR46`L=|=&d+tk!GvMn6EmrddI|)skQ|^5d|fT|G4X~7tgVc z`@V3|-ZhP{G<&$|Ld?vS^?ACvolkgK77vb!kM^I`zDuOFZkHiPbZW=nJ^%H_tLVd- zs|SBqdv|efu5arPI$KwI&0g`OMSf?Eg@cw?ee`F+Gy%H250SyKeDzgNB92DLtPH%xtH6Wv^gJb*YL!+ zP-aQ)vxU3%4!j(*A)U77(`lUChdb|Fd1dUw009!CEuUz54g z`tG*4_d2y~(|)--dfVSfm9<#%AmBr5JNDqFL5XE8ZWPbX3*LHpPtpPF+jlei#RO_@ z>s)sIY~yjyQWkN8_)mAc?KyDzc+K(8f1lfP`*QEL{Uxw)$oi+0i~chC0gHsUvZleu zMlU|r<=2BDZPW{fhaPT|aQ5vhEAPQmN~1RQ>2&E)vj5(!T)VwpwT+#9tS47l$Gz27 zvh23fB?X1Xt)*+W`@3{z&Y5%OXl=EnkVd1mniwoEE~ZsLTel)bv7M-i_Af9oFj1oX z0~ixg8(Xi5BtZKICgMx~F$gxMAwe{zMM@jQ#QJ&W_j2bv-(R9Pn{4*EXXZTTd4D^z zFFf>DUwG&3AARHdKKj(3eBr`(f9$Ehd&zs-2Y%^OfAD8_{lp7z{=xtF?O%N8_kREH zf9s8Z{`ITh`;F%=JNN9(UwYH?_rCjQKlkX-4}IpI4}Sh@tIs|3>tFry&7WMo?YZB4 z@K5h~{-3`1jt6i0nZLdC!=L#4XD?pynZF75zUM>#`0}^B^&j5-_&8{ag0qn_=jU2LhBxmLsR_5 zeZ}0vjAz z+uW4FNq?K$P?}n1+A+67*Sd{4Zr{3-U;%mfljVauz80&)HxWv9sj?}=0&TUd+$pY&kv14)R z`>x|4GyOL*0 zjdPb}U5?Hmu?JGUes&lC88C}*4MQki2>DKB9m5#~IiB!%$j(&TI!w|M>2ZFzDDMgi zuv}>CurzXF?4Ga=bLM4+C^2|7#%*+CZNIywAPW8@1y|{jDNT%?)OZr-H+WwgMU9EK zy3MoO_|Fz9KMBp&YO>Ih(lsvF;MuNqL8iev7fBh+hhdij49)cPQ>)WsE0ipub8g<2 ztBMx_FVC40h=CjjOYE``mmqQ`#?lm+yY*}>!~?>uh;@-oiYNvGAy&K)V=ecXO+o2> zT*-<1P?ihLWE3J=IZ0~76cqGA*L6`SgDFrsNki6!;O$SG)wC0(aV_meZMi@RTW?OMY!#P*Z>|)_!ZW zg;C5s##DStDaqxa_N>p?4K}#YaE3|9QFvifr-EHeWaRP*gNdOtm={7|#1b`SfQe88 zi#uz-Nd;|_=v4=pPytx-stAm5Og1L;QkbU#skoUHzp!mw@(Y3xK{g?-krTIsUh=-+ zS;zY#Q9bsLpKUY-uy>iWZQT2a8(7-J63b_Ooxz?RT4%TncC4Q3RL~Y8aUScg@hS#g zqE|74DHQ?*CjY*We8ks|4Hb@BB|s(+u*<_FEdoPzJdChX_#RttMd4*@UUsJcG5K+o zLN01_vN7c|L7E6sk;!|IA-UfnJ*R@4I7-3;4CUS}w3Lx`QmHXmtE}s(sL8WI$lr{( z*<)L|g^ngjM2`soWhrKWQZ~$1Z=B6Yf6puAw z)*hI5qP)--a&2RN-1{(oq8QkqO-_w5U)Q`W+?NdBVA;zo0y)w zdy8Z7fxN-wjKn9tl*2m8VRpu)=(H3lyxehY@uh9oiHNmb*t0H*&&Bgq&(5OLQgslD z6E1lUTEj;O+4))@Oz3<)cZT_Jscl0;oy)VDBCl5hsyiZg6y8O|fGMYmZiK3#--y$3 za1S<8od8BHUJ%Sa#%3MeBv~h^5bH>Mmg`WRwzZzs5@;~INVRZ=?NI`P5n&T77B*4V z6Dstv8+8*>LP2I*7Fj47%>v!T*Ldw9>REto)8}1q&qAVNzcHRg5KK~lLOa!_na0XN zQgr#&2!=$f!sFEY41#qj37Zm4D?xhj841r);E{DDMIYQ_QzX=FbLXp;*qI<9k2SGm z6EacndgzbreDm!)!%3AzPJ)XP9_PX3M^G@AE=(^zvpRc+k{tF6)o{AP8Y?z>3Jr0( z@GM4}D!lwEDdA~@>TAJQo>iyQ4n-B6baQ@RWu(bBg~--H@taU1(sjYtKXC+c&&Gsp zi}$UKG`XcvK{|jigRE9gjB5F3JJK|dAadptY@AXzil_k;v7-JaobG6wd8q;>{=LIR zd!#%5|DQEg7e*QvDar**l#8lpMM8^^$gw4aB;4>7LX0d?;ez})X&%Nv$w~0UUf}4F ziGI+?R4TMIOqZL?d(fm5SdKp}yrVfPlWFE-PspR=l}Yb!%yDldX<46c)F>-KCP=~sHx31Af^CKPPlQl~+E z51#aU-yGL<}B{2)c1y2B75Qsd6;ZgVEy#S*H)(w()2R^8nueR%T~}N z`Fx{;b=W7r7lFBmKZMkEluG7jmv(lj^MqMiX|D@~Y|213&MN+N!W0=NpR=8%fg~6f z4(K@A0QrmN4%&ko!8*}36tzTbVH%b$Vw`f5qP&f6GA1GD& z&43C28C{T50$W?!r5ZAyBJPAK9jR2(u#+$gm}m&mrSCJ6tqqk4dzA@AXk12Pu(p{V z`7g8aqRLovkr!s}M9XkGqGTk765j!n_>Mufb!zgKMO`KkMSB?vjB|Mz0=5T1C#ZJD zu9^Px8=R4PijxqMRS_?O0tpd;i5q1wNTRYp1nqSPOS}%sDj^_e_sST^1-%IimiRYk0EuMq9Hp%-)rllwfY?!Y6pVgHk(|?|l1Qp(N(p=Dkle){n)1HHq z42Vde=kvKMB_K@~p-l{S2!b*pfgRc-@R>3g^??j9~Vn0kD;=QBf<_y$GI0sB5 zBhsxCidvaa_R^*{J8XifMOOlwErt)6B2Q3p;hPT$oFtow=INgWe)v~hWoS^Rgw!m*iTxJ$(eKCKV32r8JO6q9Kq z@1h^vr|>>FM(t>DVMgUW<~ljEpn|T61Pc^dl%IGhp%z7vJuuyvsK?vyNYvwQpMVUl zZP7^L!96fPEylBcG~V8)Jsg`_-yn0`m4JeKPU7$7@WMp3(whf56{0z*t80r!X-e5O zJLyU=svyNmCf?P4QCAU-plKzx0&}adK}slyM;oSVzxD8CqfDQ+F=Ms;DH%bpu?Km) znXV&AkY~50hlOTj+ETWzGD37Ggx5K#SIL^Tl1j+5Ph^@v)Rbg!30oT>E_I0{4~(Sx zlMoBZ>7cH{T>NhQA5bfKUq6bc=gx>aa0cr1;XUq#DPds~wH7(ZE-G3YAq<_Igz}rh zbo9tfhG+r9eIks6MU~9VMu^a+0vfp(p3{v7^%YF$`Hi`8BAE>ViyXwRyZO0Cst;O= z1||l_27o+E`o>?QqGi-H)0E&+H%%yu0QXUbqa?4J19P2FIYG7_~ z_s~WUG=1Sdp6ENSXS#Uu@bulh#R)Q#Pr`ogqKGVF*(8afj4s^o+cG`*(!#G^grq3DJmicFGdZ%cPR-MmRNG9QM`@9W+80RA?u{Ceo`idK zLNxAA3$;+<VtqI~TWCbQjldy?-rGY8tH8uTak44Zz zL@uI3(OgU*mlj3&O!quxxHBz5P@>vUQQsDH8B2-+9{q*crhu40u2oY69Z?x&m`@4PIR&A$8Uco7Rv}YGt{g)dI zwwoobN7BMeANE`_SkdX{vx(Q$X*h-B5EvZbeZk8Z5Kb zS+8J2y@z1~*>n>urr($;gfiXw?NCi^F4ce8Y*+nXhz1?C8UglaYCr_sF53G2nGjgx zw4~Y~_t~&`8Uh28Gz`nACTh>{J98wp>R95L7!eQ(al=rsCgW0AlGw(+l%nhWcN}cr z(oOfj>X4S21ZG?!knos5RAk(4J$j1sDFV?aU@{ly=`#+``!2R2GmikTttTD1Hm zCSY1uJRT9NSbkv2x^8>TcA*5|C(%5GAkivdVjsCnDoVf?dZY+KnWawMO$h)>Fu)W= zm5-U-VRA|w4fDy;HUOr4XIevql_`kPTj>lDe8d4v`OfTs_l|U2mG5+;b&p*y^0@j! zmZN;99iW@|Z+k!)8ga4-oRfpl4yeryC15^KpnRvLBIKeuA;>Tes2ag7XWc~aYFZ;()=`*}gIK|5gUs&MDPL9*4^K5%fEq_m6paEV$+tWWQ6opLE$)daB?(~8gt zkDV0=gcttVo7qEhNxs9RmWxkb z$w|04@T1>FluIGRvmf)N%eBQxgHz>`&vXdExi}!4E}Kgnl@le|l8xoEIdVL!jv|eB6$F{w z6a;Oab7tovPQy5PFG9k)`HIUT-yNt?ihS_hMBP}+8dUab`LH;Rj}b|H&UGp&Yfu7` z%pI8YXRxSJd?d4zq++13DsdV>$x^62)+v@DO^4e@Ed!yO2&?sKz2@-kpbfQ-<237{ z3ZH1?$tJYPWE0v?vI&hJVF`7{dJp0>O23LVeGB0+S(G=#18o)Wo2kmGDpF@qq;Wky zP9xh^qf41mHlfld_K@P5AiZZ6lTrSiF$>#}2cU#YWb|ruQ<|PUhv6hr@oeSFaZO!_ zYw5mUMB4@Cc;$r}LGv{)iP9NgRBjP9E%#U(PWlGA z37?Jf8{L2uc~4Yu>>yNHMD@u+>hF%D{16WbY18_M@5!BNQgwtb zi0@?vn2as~^T8#9`-Hl_(MaRCp&|EYEm^8P5Nj_?mQcE_y>;4OG z|GE3_zW>yT8*jYf$KL)ccc04rP+yYF3R(AYC~-f;W9_uO}8zHn^+c->t$=7uk= pGmbOdb}MmpEcT)G<#*O^`af4pPdA5GonQvw)QRh^yX{9_|GzvwkQo2~ delta 102203 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 AI{*Lx diff --git a/doc/manual_ru_source.xml b/doc/manual_ru_source.xml index 11fd1cc..93b0613 100644 --- a/doc/manual_ru_source.xml +++ b/doc/manual_ru_source.xml @@ -1,6 +1,6 @@ -DeepFaceLab это программа для замены лица в видео с помощью нейросети, работающей на графическом ускорителе NVIDIA / AMD / IntelHD Graphics.Разработчик: iperovСайт разработчика: https://github.com/iperov/DeepFaceLabРазрядность: 64bitЯзык интерфейса: АнглийскийМинимальные системные требования: Windows 7 и вышепроцессор с поддержкой SSE инструкций2Gb ОЗУ с подкачкойOpenCL-совместимая видеокарта ( NVIDIA, AMD, Intel HD Graphics ) Рекомендуемые системные требования:Windows 7 и вышепроцессор с поддержкой AVX инструкцийNVIDIA видеокарта с 6GB видео, 8Gb ОЗУДоступные сборки:DeepFaceLabCUDA9.2SSE для NVIDIA видеокарт вплоть до GTX1080 и любых 64-бит процессоров.DeepFaceLabCUDA10.1AVX для NVIDIA видеокарт вплоть до RTX и процессоров с поддержкой AVX инструкций.DeepFaceLabOpenCLSSE для AMD видеокарт и любых 64-бит процессоров.Зеркало со старыми версиями: https://mega.nz/#F!b9MzCK4B!zEAG9txu7uaRUjXz9PtBqgОсобенности DeepFaceLab :отсутствие любых предустановок, кроме драйверов на вашу видеокарту. Проверено на чистых Windows 7 и 10, а также в VMWare.работает на любых OpenCL-совместимых видеокартах с памятью от 256Mb и выше, даже довольно старых.автоматически выбирает «лучшую» видеокарту. Так можно работать с офисными приложениями на видеокарте послабее, а тренировка сети будет автоматически на лучшей.есть возможность тренировки полностью на CPU. 8-е поколение процессоров Intel способен выдать неплохой демонстрационный результат за 2 дня тренировки.все необходимые мета-данные лиц хранятся непосредственно в извлеченных JPG файлахесть режим ручного выделения лицесть сортировка извлеченных лиц для быстрого удаления ненужных лиц.быстрая работа с видео: извлечение, удаление шума, сборка финального видеоПриступая, поймите: эта программа не гарантирует идеальной замены лиц во всех случаях! Всё зависит от качества исходных данных, совместимости лиц, источников света, и т.д. и т.п. Да и сама технология появилась недавно (февраль 2018), она далека от идеала, т.к. заменяется только лицо, причём без лба и волос. Вы можете потратить кучу времени и сил, а в итоге ничего не получить! У вас есть невысокий шанс создания успешного фейка с первой попытки. Только когда вы сделаете много попыток создания фейков с разными лицами, тогда вы поймете все нюансы.DeepFaceLab создана на чистом энтузиазме одним человеком. Поэтому, если вы найдете какие-либо ошибки, то отнеситесь к этому с пониманием.Посмотрите вводную видео инструкцию по работе с программой, чтобы получить общее представление о рабочем процессе: https://www.youtube.com/watch?v=K98nTNjXkq8 Обновите драйвера на вашу видеокарту.Первый запуск программы в чистой папке из торрента будет происходить долго, т.к. компилируются GPU программы.Определим термины dst и src.src - это лицо, которое будет использоваться для замены.dst - это лицо, которое будет заменяться.DeepFaceLab\workspace – наша рабочая папка для хранения модели целиком (видео, фото, файлы самой программы). Вы можете переименовывать её, чтобы сохранять как резервную копию или работать с другой.1) clear workspace.batОчистит или создаст все папки внутри папки workspace. Помещаете в папку workspace ваше видео data_src.xxx формата максимум 1080р - это видео откуда брать лицо. Тестовое видео уже содержится в папке workspace.Помещаете в папку workspace ваше видео data_dst.xxx формата максимум 1080р - это видео где заменить лицо. Тестовое видео уже содержится в папке workspace.где xxx - любое расширение видео, например mkv, mp4, avi2) extract PNG from video data_src.batконвертирует видео откуда брать лицо в набор PNG в workspace\data_srcEnter FPS ( ?:help skip:fullfps ) : сколько кадров из каждой секунды видео извлечь, пропустить = все кадры. Здесь мы собираем кадры из которых будем извлекать src лица. Чем их больше тем лучше.3.1) cut video (drop video on me).batопционально. Обрезает видео где заменить лицо, на время которое вы укажите.Нужно перетянуть видео файл на этот .bat файл, при этом оригинальный файл сохраняется, а появляется новый с суффиксом _cutFrom time (skip: 00:00:00.000) : время начала обрезкиTo time (skip: 00:00:00.000) : время конца обрезкиSpecify audio track id. ( skip:0 ) : можно указать аудио дорожку. Полезно, если например вам нужен другой язык из фильма.Bitrate of output file in MB/s ? (default:25) : битрейт выходного файла, пропустить = 25.Тестовое видео, которое уже лежит в папке, обрезать не нужно.3.2) extract PNG from video data_dst FULL FPS.bat конвертирует видео где заменить лицо в набор PNG в workspace\data_dstЗдесь извлечение только с ПОЛНЫМ FPS, потому что каждый кадр должен быть обработан.3.other) denoise extracted data_dst.batDenoise factor? (1-20 default:5) :степень подавления шумаделается перед извлечением dst лиц! делает проход по извлеченным видео кадрам, убирая шум, сохраняя четкими грани.Позволяет тем самым сделать финальный фейк более правдоподобным, т.к. нейронная сеть не способна сделать детальную текстуру кожи, но грани делает вполне четкими.Поэтому, если весь кадр будет более "смазан", то и фейк будет казаться более правдоподобным. Особенно актуально для фильмовых сцен, которые обычно очень четкие.4) data_src extract faces ... .bat производит выборку конечного набора лиц из PNG в папку workspace\data_src\alignedОпции:DLIB, MT, S3FD детекторы.Для src оптимально MT детектор.DLIB – наименее точный, лица получаются с некоторым дрожанием, работает только на NVIDIAMT - меньше дрожания лиц, но производит больше ложных лиц.S3FD медленнее других, требователен к ресурсам, но более точный, меньше ложных лиц.MANUAL - извлечение вручную, полезно для src только для переизвлечения уже извлеченных лиц, если найдены где-то ошибки с помощью 4.2.other) data_src util add landmarks debug images.bat Для этого нужно вручную сделать резервную копию data_src\aligned\ , переместить из этой папки лица в data_src\ , сделать ручное извлечение, затем объединить data_src\aligned с резервной копией.GPUЗдесь либо ALL (все), либо Best (лучший).Если у вас только один GPU, то нет разницы, что выбирать.Если вы работаете в офисных приложениях на слабом GPU, а имеется мощный, то выбираете Best.Для максимальной скорости на мульти-GPU выбираете ALL, но тогда офисная работа на основном GPU может подтормаживать.DEBUGЗаписывает в workspace\data_src\aligned_debug каждый кадр с выделенными лицами и лицевыми точками, тем самым можно смотреть работу детекторов.4.1) data_src check result.batпросмотр результатов выборки лиц с помощью портативной программы XNViewMP.Здесь ваша цель - убрать ненужные лица.Сначала пролистываете скролом и убираете те ненужные лица, которые идут подряд большими группами. Не нужно удалять мелкие группы. Для этого есть сортировка.Если нужное лицо перемешано с другими, то запускаете сортировки следующих пунктах.Сортировку по резкости в любом случае делаете, потому что мутные лица src нужно удалять.4.2.1) data_src sort by blur.batСортировка по резкости. Запускаете и ждете сортировки. Затем смотрите результаты. Самые мутные лица будут в конце. Для src важно убрать мутные лица.4.2.2) data_src sort by similar histogram.batПосле этой сортировки лица будут сгруппированы по содержанию, так что отсеять ненужные лица теперь намного проще.Пролистываете скроллом и удаляете ненужные лица группами.4.2.4) data_src sort by dissimilar histogram.batЭта сортировка оставляет ближе к концу списка те изображения, у которых больше всего похожих.Обычно это лица в анфас, которых больше всего, потому что актёр чаще смотрит прямо на камеру либо куда-то в одном направлении в интервью.Часть с конца списка можете удалить по усмотрению.4.2.5) data_src sort by face pitch.batОпциональный пункт. Сортирует лица так, чтобы вначале списка лицо смотрело вниз, а к концу списка вверх.4.2.5) data_src sort by face yaw.batОпциональный пункт. Сортирует лица так, чтобы вначале списка лицо смотрело налево, а к концу списка - направо.4.2.6) data_src sort by final.batРекомендованный пункт.Target number of images? (default:2000) : ввести целевое количество изображенийАвтоматически делает лучшую финальную выборку лиц из любого количества в целевое количество.Применяйте только после очистки набора лиц другими пунктами, если у вас осталось более чем 2000 лиц.Отсеянные лица перемещаются в мусор (aligned_trash)4.2.other) data_src sort by black.batСортирует по количеству черных пикселей в конец списка. Позволяет отсеять лица вырезанные экраном.4.2.other) data_src sort by one face in image.batПеремещает в мусор (aligned_trash) все изображения, в которых нашлось более 1 лица4.2.other) data_src sort by original filename.batСортирует по оригинальному имени файла4.2.other) data_src util add landmarks debug images.batОпциональный пункт. добавляет к извлеченным data_src лицам изображения с нанесенными лицевыми точками с суффиксом к файлу _debug.jpgЭто позволяет вручную отсеять совсем плохие извлечения из вашего набора src лиц.Перед этим сделайте сортировку по yaw.Имеет смысл удалять только те лица, в которых нанесенные брови ниже чем реальные, или контур челюсти существенно заходит на лицо.После отсеивания удалите вручную все файлы по маске *_debug.jpg4.2.other) data_src util recover original filename.batВосстанавливает оригинальное имя файла извлеченного лица.Итог по извлечению лиц src.Мутные лица надо удалять.Лица закрывающиеся чем-то (рукой, волосами, и т.д.) - также нужно удалять.После приведения набора лиц в надлежащий вид делаем финальную сортировку sort by final.Опционально можете провести пункт 4.2.other) data_src util add landmarks debug images.batВы можете собрать несколько разных наборов лиц одного актёра и затем использовать их в зависимости от условий лица dst, помещая их в папку data_src\aligned5) data_dst extract faces ... .batТо же, что и п.4, с некоторыми отличиями.Здесь мы извлекаем лицо, которое будет заменяться.Детектор DLIB , MT, S3FD ?В большинстве случаев - S3FD.Если лицо не определилось в каком-то кадре, то для этого есть опция +manual fix - позволяет вручную указать лица на кадрах, где вообще не определилось никаких лиц.Подвох с MT+manual fix в том, что на кадре могут определиться ненужные лица кроме главного, поэтому программа не предложит указать лица на этом кадре. В таком случае можете проверить в папке data_dst\aligned_debug какие лица обнаружились вообще.Можете использовать DLIB+исправить, он генерирует меньше ложных лиц.В совсем крайнем случае или для экспериментов есть полностью ручная выборка (manual), т.е. по каждому исходному кадру dst вы вручную проходите и указываете лица.Окно ручного исправления лиц. здесь вам нужно совместить зеленые точки с лицом.Управление:Enter - подтвердить лицо и следующий кадр.Пробел - пропустить кадр., - вернуться на прошлые кадрыКолесо мыши - изменять прямоугольник.5) data_dst extract faces MANUAL FIX DELETED ALIGNED DEBUGОчень важный пункт. Напрямую влияет на качество итогового фейка.позволяет переизвлечь те кадры из dst, чьи results debug из п.5.1 были удалены вами.Для чего это нужно? Чтобы сделать фейк качественнее, нужно проверять dst кадры в папке aligned_debug, просмотреть их можно через п.5.1.Неправильно размеченное dst лицо может приводить к значительному ухудшению качества:Если где-то увидите, что контур лица существенно отличается от реального, например съехало на фон, то удаляете эти кадры из папки aligned_debug (п.5.1), и запускаете этот пункт.Произойдет ручное переизвлечение удалённых кадров. Видео поясняющее этот процесс: https://www.youtube.com/watch?v=7z1ykVVCHhM5.1) data_dst check results debug.batпросмотреть все dst кадры с наложенными поверх них предсказанными контурами лица5.1) data_dst check results.batАналогично смотрим результаты выборки лица dst, и удаляем другие не целевые лица. А целевое лицо, даже мутные - оставляем.5.2) data_dst sort by similar histogram.batЕсли в целевом видео содержатся другие ненужные лица, можете произвести эту сортировку, и затем удалить эти лица будет проще.5.3.other) data_dst sort by original filename.batСортирует по оригинальному имени файла5.3.other) data_dst util recover original filename.batВосстанавливает оригинальное имя файла извлеченного лица.Итог по извлечению лиц dst.Ваша цель извлечь только целевое лицо (даже мутное) из каждого кадра, удалив все другие лица.6) train ... .bat Тренировка.Отключаем любые программы, которые могут использовать видео память.Если в процессе запуска тренировки появилось много текста, содержащее одно из этих слов: Memory ErrorAllocationOOMзначит на вашем GPU модель не запустилась, и вам нужно урезать модель, для этого смотрите описание опций моделей.При первом запуске модели, программа спросит о различных опциях, которые сохранятся и будут использоваться при последующих запусках.Просто нажимая Enter - будут использоваться значения по-умолчанию.Which GPU idx to choose? ( skip: system choice ) : Имея мульти-GPU можно тренировать одну сцену на разных моделях или опциях одной модели без клонирования папок. Просто выбираете индекс GPU на старте тренировки/конвертации и тогда файлы модели в папке workspace\model будут содержать префикс этой GPU в имени.Если оставить выбор GPU по-умолчанию, то выберется лучшая GPU и файлы модели не будут содержать префикс.Write preview history? (y/n skip:n) : писать ли историю превью на дискTarget iteration (skip:unlimited) : целевая итерация, по достижению которой тренировка остановится.Batch_size (skip:model choice) : выбор размера батча - это то сколько картинок за раз кормится нейронной сети для обучения. По-умолчанию выбирается низкое значение, но вы можете подобрать это значение самому под свою видеокарту. Чем больше - тем лучше.Feed faces to network sorted by yaw? (y/n skip:n) : кормит модели src лица отсортированные по такому же направлению как и dst. Смысл в том, чтобы кормить только нужные лица. Однако пока до конца не протестировано хорошо это или плохо.Flip faces randomly? (y/n ?:help skip:y) : кормит модели все лица случайно перевернутые по горизонтали. При выключенной опции финальное лицо будет более естественным, но тогда src сборка лиц должна покрывать все углы поворота.Src face scale modifier % ( -30...30, ?:help skip:0) : модификатор масштабирования для src лиц. Если src лицо более широкое чем dst и фейк получился плохим, то имеет смысл немного уменьшить это значение.Если модель запускается уже второй раз:Press enter in 2 seconds to override some model settings.если вы нажмете Enter в течение 2х секунд, то появится возможность заменить некоторые опции модели.Список моделей для тренировки. Также указано минимальные требования к памяти GPU.H64 (2GB+)половина лица с разрешением 64 - это как оригинальная FakeApp или FaceSwap, только лучше за счёт тренировки маски нейросетью + исключающей фон вокруг лица + исправленного конвертора. Для видеокарт с видеопамятью 2 и 3Гб данная модель работает в сокращенном режиме, т.е. качество будет хуже чем с 4GB.H128 (3GB+)как H64 только с разрешением 128. Однако половина лица может плохо обучится на некоторых условиях света и поворота головы и т.д. Для видеокарт с видеопамятью 3 и 4Gb данная модель работает в сокращенном режиме, т.е. качество будет хуже чем с 5Gb.Опции для H64 и H128:Use lightweight autoencoder? (y/n, ?:help skip:n) :выбрать урезанную модель. Необходимо для видеокарт с <= 4Gb видео памяти.DF (5GB+)модель от dfaker. Полнолицевая модель с разрешением 128, умная функция тренировки лиц, исключающая фон вокруг лица.LIAEF128 (5GB+) как DF, только пытается морфировать исходное лицо в целевое лицо, сохраняя черты исходного лица. Морфирование не всегда хорошо, и может сделать вообще не узнаваемое лицо, в таком случае выбирайте DF.Опции H64, H128, DF, LIAEF128 моделей:Use pixel loss? (y/n, ?:help skip: n/default ) :позволяет быстрее улучшать мелкие детали и убрать дрожание. Включать только после 20к итераций.SAE (512MB+) Самая последняя лучшая и гибкая модель. Содержит все другие модели. Есть возможность переносить стиль лица и освещение, которое будет изучаться непосредственно нейронной сетью. При первом запуске можно настроить различные параметры. Эти параметры влияют на то, какого размера будет сеть и запустится ли на вашей видеокарте, так что можно подстроить модель на тренировку как на 512MB так и на 24GB. Конечно же, чем больше памяти, тем лучше качество получится в итоге.Пример фейка Cage-Trump: https://www.youtube.com/watch?v=2R_aqHBClUQПример фейка Elon Musk - Robert Downey jr: https://www.youtube.com/watch?v=OLWFnPwzgEYОпции только для SAE модели:Resolution ( 64-256 ?:help skip:128) : разрешение лица. Больше разрешение - больше требуется памяти, дольше тренируется модель. Вы можете выбрать любое значение от 64 до 256 кратное 16.Half or Full face? (h/f, ?:help skip:f) : половинный или полный размер лицаLearn mask? (y/n, ?:help skip:y) : учить ли маску. С изучением, маска будет более сглаженной и менее дрожащей, иначе будет использоваться грубая. Однако при стилизованной тренировки можно обойтись без изучения маски.Optimizer mode? ( 1,2,3 ?:help skip:%d) : Эта опция только NVIDIA видео-карт. Режим оптимизатора нейронной сети. 1по-умолчанию. 2 – позволяет тренировать сеть x2 большего размера, требует дополнительной ОЗУ памяти. 3 – позволяет тренировать сеть x3 большего размера, требует еще больше ОЗУ и на 30% медленнее.AE architecture (df, liae, vg ?:help skip:df) : тип архитектуры нейронной сети. AutoEncoder dims (128-1024 ?:help skip:%d) : количество размерностей сети, больше - лучше, но может не запуститься из-за нехватки памяти. Можно уменьшать для достижения работоспособности на вашей видеокарте.Encoder/Decoder dims per channel (21-85 ?:help skip:%d) количество размерностей енкодера/декодера сети, больше - лучше, но может не запуститься из-за нехватки памяти. Можно уменьшать для достижения работоспособности на вашей видеокарте.Use lightweight encoder? (y/n, ?:help skip:n) : использовать ли облегченный энкодер, он быстрее на 35%, только не тестирован на различных сценах.Use multiscale decoder? (y/n, ?:help skip:n) : использовать ли многомасштабный декодер, позволяет добиться более высокой четкости. Use pixel loss? (y/n, ?:help skip: n/default ) позволяет быстрее улучшать мелкие детали и убрать дрожание. Включать только после 20к итераций.Face style power ( 0.0 .. 100.0 ?:help skip:%.1f) : скорость изучения переноса стиля лица, таких как освещение и цвет. Может вызывать артефакты при больших значениях. Число с плавающей точкой. 0 - не учитьBackground style power ( 0.0 .. 100.0 ?:help skip:%.1f) : скорость изучения фона вокруг лица. В большинстве случаев морфирует лицо в dst. Число с плавающей точкой. 0 - не учитьВ процессе тренировки можно выходить через Enter, нажав его в окне Training preview, и запускать в любое время, модель будет продолжать обсчитываться с той же точки.Тренируем от 24 часов и больше. Когда результат удовлетворяет - выходим также через Enter, нажав его в окне Training preview.Кнопка 'p'(на англ раскладке) в окне Training preview обновляет предпросмотр.В окне Training preview также мы видим кривую ошибки. Понижаясь, она показывает прогресс тренировки с течением времени.Итог по тренировке.Выбираете модель в зависимости от сцены и вашего личного опыта.7) convert ... .bat Наложение лиц.Выбираете ту модель и тот номер GPU (если у вас их несколько), с которым тренировали.Опция debug позволяет посмотреть процесс наложения лиц и некоторую техническую информацию по каждому кадру в консоли, нажимаете пробел в окне просмотра.Основная концепция наложения лиц.Далее при запуске программа спросит об опциях:Choose mode: (1) overlay, (2) hist match, (3) hist match bw, (4) seamless (default), (5) raw :Выбор режима наложения лиц.РежимыOverlayпрямое наложение предсказанного лица из нейросети без предварительной обработкиHist-matchналожение с уравниванием гистограммы.Histh-match-bwналожение с уравниванием гистограммы из чернобелого канала.Seamlessналожение методом Пуассо"Poisson image editing." ACM Transactions on Graphics (TOG). Vol. 22. No. 3. ACM, 2003.Rawполучить сырые слои для собственной обработки в видео редакторе, например After Effects.По-умолчанию, если нажать Enter - выберет seamless.Какую выбрать? Зависит от случая. Пробуете все и смотрите результат.ОпцииSuppress seamless jitter? [ y/n ] (?:help skip:n ) :Для режима seamless. Подавляет дрожание лица, возникающее только в seamless режиме. Включение этой опции сделает процесс конвертации в несколько раз дольше.Seamless hist match? (y/n skip:n) :Для режима seamless. Включить ли уравнивание гистограммы.Masked hist match? (y/n skip:y) :Для режимов hist match, hist match bw, seamless, указывает, уравнивать ли гистограмму по маске лица.Use predicted mask? (y/n skip:y) : Использовать ли маску, которая предсказана моделью (только если маска изучалась, например в SAE модели можно выключить изучение маски) - по умолчанию да. Либо использовать маску из dst лица.NoYesChoose erode mask modifier [-200..200] (default 0) :Указываете насколько уменьшить в размерах dst маску. Значение < 0 - расширить маску. Это адаптивное значение, а не абсолютное.-100+100Choose seamless erode mask modifier [-100..100] (default 0) : только для режима seamless - модификация размеров маски, использующейся для самой seamless функции. Значение < 0 - расширить маску. Эта маска задаёт непосредственно шов, по которому будет проходить адаптация цвета.0+40 Choose blur mask modifier [-200..200] (default 0) : Указываете насколько сгладить dst маску. Значение < 0 - уменьшает сглаживание по-умолчанию моделями H64 и H128. Это адаптивное значение, а не абсолютное.-200+200Hist match threshold. [0..255] (default - 255) :Уменьшение значения подавляет артефакты для режимов с уравниванием гистограммы.(по-умолчанию) 255231Choose output face scale modifier [-50..50] (default 0) : изменить масштаб выходного лица в пределах -50+50%. Полезно, когда предсказанное лицо несколько больше оригинала.-50+50Apply color transfer to predicted face? Choose mode ( rct/lct skip:None ) : дополнительно адаптировать цвет лица, используя rct или lct алгоритмDst лицоПредсказанное лицоrctlctDegrade color power of final image [0..100] (default 0) : Степень деградации цветности конечной картинки от 0 до 100. Уменьшая общее качество картинки, можно скрыть недостатки наложения лица.0100Export png with alpha channel? [0..1] (default 0) : экспортирует только лицо с альфа каналом для последующей работы в видео редакторе.Итог по наложению лиц.В начале запускаете с отладкой, пробуя различные параметры и смотрите результат.Запомнив подходящие значения, запускаете наложение без отладки.Результат картинок в workspace\data_dst\merged - можно использовать самому в видеоредакторе, либо склеить в видео в п.88)convertedbat Склейка в видео.Следующие .bat файлы склеивают картинки в видео с тем же FPS и звуком, что и data_dst.mp4 - поэтому не удаляйте data_dst.mp4 из workspace папки.to avi.batв формат avito mp4.batв формат mp4to mp4(lossless+alpha).batmp4 без потерь с использованием alpha канала.to mov(lossless+alpha).batmov без потерь с использованием alpha канала. Sony Vegas с использованием QuickTime сможет использовать alpha канал из mov файла.Всё. Результат в workspace\result.mp4Если результат не удовлетворил, можно пробовать разные опции наложения, либо продолжать тренировать для повышения четкости, либо пробовать другую модель, либо пробовать другое исходное лицо.Дополнительная информация:9) util convert aligned PNG to JPG (drop folder on me).batпозволяет конвертировать папку с извлеченными PNG лицами из старых версий DeepFaceLab в JPG. Для этого перетяните папку с набором лиц прямо на этот .bat файл. Известны случаи, когда Windows 10 резервирует % видеопамяти, даже если видеокарта не используется для вывода картинки. В таком случае придётся чем-то жертвовать, чтобы тренировка запустилась (batch size, размерности в SAE, итд).Советы и хитрости.Узкие лица лучше тренируются на широкие лица. Вот почему фейки с Кейджем так популярны.Иногда, если нейронная сеть будет получать dst лица только одного освещения, например, с затенённым носом, при этом src лица не содержат аналогичного лица с таким же освещением, то нейронная сеть может не понять, куда вообще смотрит лицо на некоторых ракурсах, в результате предсказанное лицо будет содержать неправильный поворот головы.В этом случае полезно добавить в тренировочный набор data_dst\aligned лица того же персонажа, но извлеченные из других сцен с другим освещением.Тем самым можно несколько улучшить результат. Но лучше всего, конечно, найти src лица с тем же освещением носа.Продвинутые советы от @GAN-er ( только на английском языке ):Tip 1:You may benefit by starting with a small batch size (within reason) and increasing it later. The reason is that a **large batch size will give you a more accurate descent direction but it will also be costlier to calculate**, and when you just start, you care mostly about the general direction; no need to sacrifice speed for precision at that point. There are plenty of sources discussing the batch size, as an example you can check this one:https://stats.stackexchange.com/questions/164876/tradeoff-batch-size-vs-number-of-iterations-to-train-a-neural-networkTip 2:Unlike the batch size that the only thing that does is affecting how accurate each step will be as far a the true gradient goes, the dimensions, actually, increase the complexity of your NN. As a rule, **the more complex a network the better the resulting model**, but since nothing comes for free, **the more complex the network the more time it will take to converge**.What you generally want is to **_figure out the max dimensions that you can use_** given your GPU's memory, and your desired max batch size.You can set the max batch size to something, say K, and then increase the dimensions until you get OOM errors. In the end, you will end up with a triplet, {batch size, ae_dims, ed_dims}Ideally, you would use 1024 and 85 for your autoencoder and encoder/decoder dimensions, but no card has enough memory for such a configuration even with batch size 1.Remember that unlike batch size that you can change at will, once you set up the dimensions you can not change them.Note that **if you use a complex - high number of dimensions NN, in combination with a small batch size, it will take _considerably_ longer for your model to converge**. So keep that in mind! You will simply have to wait longer, but also you will get a much much better result.For cards with 11Gb of memory, and for SAE you can try the following settings:For DF architecture: 12 698 51 For LIAEF architecture: 8 402 47Tip 3:If you end up being stuck, i.e. the loss does not go down but for no obvious reason or if you get weird artifacts in some previews before you discard and start from scratch, you may want to flip your DST and SRC for a while. This often is all you need to keep things going again.Tip 4:99.995% of your success or failure rate is due to bad SRC or DST sets. This means that 99.995% of your time should be spent in actually ensuring that your sets are well curated. Throwing together a hot podge of material and expecting a decent outcome is guaranteed to result in disappointment. Garbage in, garbage out.Дополнительное описание SAE.Эта модель по сути содержит все другие модели, если отключить тренировку стиля и multiscale decoder.SAE очень гибкая, можно подстроить либо под лучшее обобщение лиц сетью, либо под лучшую четкость изображения, либо просто чтобы заработало на вашей GPU.Если src сборка лиц содержит количество лиц больше чем dst, модель может не сойтись. В этом случае используйте опцию Feed faces to network sorted by yaw.Если src лицо шире чем dst, модель может не сойтись. В этом случае можете попробовать опцию Src face scale modifier в -5.Архитектура df делает лицо более похожее на src, но если модель не сходится, используйте liae.VG архитектура SAE пока что не показала каких-либо улучшений, нужно больше тестов.Если на вашей видеокарте много видеопамяти, вы можете выбрать между большим batch size, которое улучшает обобщение лиц, и Encoder/Decoder dims размерностями, которые улучшают качество картинки.Face стиль тренируется, чтобы перенести цвет лица, освещение, макияж. Если он уже хорошо перенесен, то продолжение тренировки с высоким значением может сделать артефакты.Background стиль тренируется, чтобы перенести контур лица и окружение. Благодаря контуру лица, подгоняется src лицо под контур dst.Как лучше всего тренировать SAE со стилем? Не существует лучшего решения, всё зависит от сцены. Экспериментируйте со style значениями по своему усмотрению. Включите write preview history и отслеживайте изменения. Делайте резервную копию файлов модели каждые 10к итераций. Вы можете откатывать файлы модели и менять значения, если что-то пошло не так в превью-истории.Работа на AMD/Старых NVIDIA/IntelHD видеокартах.DeepFaceLab поддерживает старые процессоры без AVX инструкций. Для этого используйте DeepFaceLabCUDA9.2SSE сборку.DeepFaceLab поддерживает AMD, IntelHD Graphics и любые старые GeForce видеокарты через использование OpenCL 1.2 движка.Для этого используйте DeepFaceLabOpenCLSSE сборку.Работа на OpenCL в сравнении с CUDA имеет некоторые недостатки:- извлечение лиц можно запускать только MT или S3FD, при этом первый проход (1st pass) на MT всё равно будет работать на CPU, но достаточно быстро! S3FD полностью работает на OpenCL и является предпочтительным методом. Второй проход работает на OpenCL без проблем.- чтобы запустилась SAE, её нужно урезать существенно как в ae_dims , ed_ch_dims так и в batch size по-сравнению с тем же количеством видеопамяти на CUDA версии. Можете поставить вообще самые минимальные значения, а также разрешение 64 и half face - в качестве демонстрации натренируете фейк худшего качества без проблем даже на IntelHD Graphics с 256МБ памяти !- каждый запуск тренировки и после сохранения в процессе тренировки, OpenCL будет перезагружать свои подпрограммы, что будет занимать некоторое время.Пожертвование разработке.Если вам нравится данная программа, вы можете пожертвовать денег для дальнейшего развития.Yandex.moneyhttps://money.yandex.ru/to/41001142318065Paypalhttps://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=KK5ZCH4JXWMQS&source=urlbitcoin:31mPd6DxPCzbpCMZk4k1koWAbErSyqkAXrПолезные ссылкиСтраница разработкиhttps://github.com/iperov/DeepFaceLabВводная видео инструкция по работе с программойhttps://www.youtube.com/watch?v=K98nTNjXkq8 Мой канал фейковhttps://www.youtube.com/channel/UCEtoVzBLuE-ni-54h7kYvsgПопулярный канал фейков https://www.youtube.com/channel/UCUix6Sk2MZkVOr5PWQrtH1g/videos Фейки на реддитеhttps://www.reddit.com/r/GifFakes Готовые src наборы лиц для DeepFaceLabhttps://mega.nz/#F!y1ERHDaL!PPwg01PQZk0FhWLVo5_MaQ поиск подходящей знаменитости по загруженному лицуhttp://www.pictriev.com поиск подходящей порнозвезды по загруженному лицуhttps://findface.sex/ruhttps://findpornface.comhttps://pornstarbyface.comhttp://www.didshedoporn.com/9j/4AAQSkZJRgABAQEAYABgAAD/2wBDAAIBAQIBAQICAgICAgICAwUDAwMDAwYEBAMFBwYHBwcG +DeepFaceLab это программа для замены лица в видео с помощью нейросети, работающей на графическом ускорителе NVIDIA / AMD / IntelHD Graphics.Разработчик: iperovСайт разработчика: https://github.com/iperov/DeepFaceLabРазрядность: 64bitЯзык интерфейса: АнглийскийМинимальные системные требования: Windows 7 и вышепроцессор с поддержкой SSE инструкций2Gb ОЗУ с подкачкойOpenCL-совместимая видеокарта ( NVIDIA, AMD, Intel HD Graphics ) Рекомендуемые системные требования:Windows 7 и вышепроцессор с поддержкой AVX инструкцийNVIDIA видеокарта с 6GB видео, 8Gb ОЗУДоступные сборки:DeepFaceLabCUDA9.2SSE для NVIDIA видеокарт вплоть до GTX1080 и любых 64-бит процессоров.DeepFaceLabCUDA10.1AVX для NVIDIA видеокарт вплоть до RTX и процессоров с поддержкой AVX инструкций.DeepFaceLabOpenCLSSE для AMD видеокарт и любых 64-бит процессоров.Зеркало со старыми версиями: https://mega.nz/#F!b9MzCK4B!zEAG9txu7uaRUjXz9PtBqgОсобенности DeepFaceLab :отсутствие любых предустановок, кроме драйверов на вашу видеокарту. Проверено на чистых Windows 7 и 10, а также в VMWare.работает на любых OpenCL-совместимых видеокартах с памятью от 256Mb и выше, даже довольно старых.автоматически выбирает «лучшую» видеокарту. Так можно работать с офисными приложениями на видеокарте послабее, а тренировка сети будет автоматически на лучшей.есть возможность тренировки полностью на CPU. 8-е поколение процессоров Intel способен выдать неплохой демонстрационный результат за 2 дня тренировки.все необходимые мета-данные лиц хранятся непосредственно в извлеченных JPG файлахесть режим ручного выделения лицесть сортировка извлеченных лиц для быстрого удаления ненужных лиц.быстрая работа с видео: извлечение, удаление шума, сборка финального видеоПриступая, поймите: эта программа не гарантирует идеальной замены лиц во всех случаях! Всё зависит от качества исходных данных, совместимости лиц, источников света, и т.д. и т.п. Да и сама технология появилась недавно (февраль 2018), она далека от идеала, т.к. заменяется только лицо, причём без лба и волос. Вы можете потратить кучу времени и сил, а в итоге ничего не получить! У вас есть невысокий шанс создания успешного фейка с первой попытки. Только когда вы сделаете много попыток создания фейков с разными лицами, тогда вы поймете все нюансы.DeepFaceLab создана на чистом энтузиазме одним человеком. Поэтому, если вы найдете какие-либо ошибки, то отнеситесь к этому с пониманием.Посмотрите вводную видео инструкцию по работе с программой, чтобы получить общее представление о рабочем процессе: https://www.youtube.com/watch?v=K98nTNjXkq8 Обновите драйвера на вашу видеокарту.Первый запуск программы в чистой папке из торрента будет происходить долго, т.к. компилируются GPU программы.Определим термины dst и src.src - это лицо, которое будет использоваться для замены.dst - это лицо, которое будет заменяться.DeepFaceLab\workspace – наша рабочая папка для хранения модели целиком (видео, фото, файлы самой программы). Вы можете переименовывать её, чтобы сохранять как резервную копию или работать с другой.1) clear workspace.batОчистит или создаст все папки внутри папки workspace. Помещаете в папку workspace ваше видео data_src.xxx формата максимум 1080р - это видео откуда брать лицо. Тестовое видео уже содержится в папке workspace.Помещаете в папку workspace ваше видео data_dst.xxx формата максимум 1080р - это видео где заменить лицо. Тестовое видео уже содержится в папке workspace.где xxx - любое расширение видео, например mkv, mp4, avi2) extract PNG from video data_src.batконвертирует видео откуда брать лицо в набор PNG в workspace\data_srcEnter FPS ( ?:help skip:fullfps ) : сколько кадров из каждой секунды видео извлечь, пропустить = все кадры. Здесь мы собираем кадры из которых будем извлекать src лица. Чем их больше тем лучше.3.1) cut video (drop video on me).batопционально. Обрезает видео где заменить лицо, на время которое вы укажите.Нужно перетянуть видео файл на этот .bat файл, при этом оригинальный файл сохраняется, а появляется новый с суффиксом _cutFrom time (skip: 00:00:00.000) : время начала обрезкиTo time (skip: 00:00:00.000) : время конца обрезкиSpecify audio track id. ( skip:0 ) : можно указать аудио дорожку. Полезно, если например вам нужен другой язык из фильма.Bitrate of output file in MB/s ? (default:25) : битрейт выходного файла, пропустить = 25.Тестовое видео, которое уже лежит в папке, обрезать не нужно.3.2) extract PNG from video data_dst FULL FPS.bat конвертирует видео где заменить лицо в набор PNG в workspace\data_dstЗдесь извлечение только с ПОЛНЫМ FPS, потому что каждый кадр должен быть обработан.3.other) denoise extracted data_dst.batDenoise factor? (1-20 default:5) :степень подавления шумаделается перед извлечением dst лиц! делает проход по извлеченным видео кадрам, убирая шум, сохраняя четкими грани.Позволяет тем самым сделать финальный фейк более правдоподобным, т.к. нейронная сеть не способна сделать детальную текстуру кожи, но грани делает вполне четкими.Поэтому, если весь кадр будет более "смазан", то и фейк будет казаться более правдоподобным. Особенно актуально для фильмовых сцен, которые обычно очень четкие.4) data_src extract faces ... .bat производит выборку конечного набора лиц из PNG в папку workspace\data_src\alignedОпции:DLIB, MT, S3FD детекторы.Для src оптимально MT детектор.DLIB – наименее точный, лица получаются с некоторым дрожанием, работает только на NVIDIAMT - меньше дрожания лиц, но производит больше ложных лиц.S3FD медленнее других, требователен к ресурсам, но более точный, меньше ложных лиц.MANUAL - извлечение вручную, полезно для src только для переизвлечения уже извлеченных лиц, если найдены где-то ошибки с помощью 4.2.other) data_src util add landmarks debug images.bat Для этого нужно вручную сделать резервную копию data_src\aligned\ , переместить из этой папки лица в data_src\ , сделать ручное извлечение, затем объединить data_src\aligned с резервной копией.GPUЗдесь либо ALL (все), либо Best (лучший).Если у вас только один GPU, то нет разницы, что выбирать.Если вы работаете в офисных приложениях на слабом GPU, а имеется мощный, то выбираете Best.Для максимальной скорости на мульти-GPU выбираете ALL, но тогда офисная работа на основном GPU может подтормаживать.DEBUGЗаписывает в workspace\data_src\aligned_debug каждый кадр с выделенными лицами и лицевыми точками, тем самым можно смотреть работу детекторов.4.1) data_src check result.batпросмотр результатов выборки лиц с помощью портативной программы XNViewMP.Здесь ваша цель - убрать ненужные лица.Сначала пролистываете скролом и убираете те ненужные лица, которые идут подряд большими группами. Не нужно удалять мелкие группы. Для этого есть сортировка.Если нужное лицо перемешано с другими, то запускаете сортировки следующих пунктах.Сортировку по резкости в любом случае делаете, потому что мутные лица src нужно удалять.4.2.1) data_src sort by blur.batСортировка по резкости. Запускаете и ждете сортировки. Затем смотрите результаты. Самые мутные лица будут в конце. Для src важно убрать мутные лица.4.2.2) data_src sort by similar histogram.batПосле этой сортировки лица будут сгруппированы по содержанию, так что отсеять ненужные лица теперь намного проще.Пролистываете скроллом и удаляете ненужные лица группами.4.2.4) data_src sort by dissimilar histogram.batЭта сортировка оставляет ближе к концу списка те изображения, у которых больше всего похожих.Обычно это лица в анфас, которых больше всего, потому что актёр чаще смотрит прямо на камеру либо куда-то в одном направлении в интервью.Часть с конца списка можете удалить по усмотрению.4.2.5) data_src sort by face pitch.batОпциональный пункт. Сортирует лица так, чтобы вначале списка лицо смотрело вниз, а к концу списка вверх.4.2.5) data_src sort by face yaw.batОпциональный пункт. Сортирует лица так, чтобы вначале списка лицо смотрело налево, а к концу списка - направо.4.2.6) data_src sort by final.batРекомендованный пункт.Target number of images? (default:2000) : ввести целевое количество изображенийАвтоматически делает лучшую финальную выборку лиц из любого количества в целевое количество.Применяйте только после очистки набора лиц другими пунктами, если у вас осталось более чем 2000 лиц.Отсеянные лица перемещаются в мусор (aligned_trash)4.2.other) data_src sort by black.batСортирует по количеству черных пикселей в конец списка. Позволяет отсеять лица вырезанные экраном.4.2.other) data_src sort by one face in image.batПеремещает в мусор (aligned_trash) все изображения, в которых нашлось более 1 лица4.2.other) data_src sort by original filename.batСортирует по оригинальному имени файла4.2.other) data_src util add landmarks debug images.batОпциональный пункт. добавляет к извлеченным data_src лицам изображения с нанесенными лицевыми точками с суффиксом к файлу _debug.jpgЭто позволяет вручную отсеять совсем плохие извлечения из вашего набора src лиц.Перед этим сделайте сортировку по yaw.Имеет смысл удалять только те лица, в которых нанесенные брови ниже чем реальные, или контур челюсти существенно заходит на лицо.После отсеивания удалите вручную все файлы по маске *_debug.jpg4.2.other) data_src util recover original filename.batВосстанавливает оригинальное имя файла извлеченного лица.Итог по извлечению лиц src.Мутные лица надо удалять.Лица закрывающиеся чем-то (рукой, волосами, и т.д.) - также нужно удалять.После приведения набора лиц в надлежащий вид делаем финальную сортировку sort by final.Опционально можете провести пункт 4.2.other) data_src util add landmarks debug images.batВы можете собрать несколько разных наборов лиц одного актёра и затем использовать их в зависимости от условий лица dst, помещая их в папку data_src\aligned5) data_dst extract faces ... .batТо же, что и п.4, с некоторыми отличиями.Здесь мы извлекаем лицо, которое будет заменяться.Детектор DLIB , MT, S3FD ?В большинстве случаев - S3FD.Если лицо не определилось в каком-то кадре, то для этого есть опция +manual fix - позволяет вручную указать лица на кадрах, где вообще не определилось никаких лиц.Подвох с MT+manual fix в том, что на кадре могут определиться ненужные лица кроме главного, поэтому программа не предложит указать лица на этом кадре. В таком случае можете проверить в папке data_dst\aligned_debug какие лица обнаружились вообще.Можете использовать DLIB+исправить, он генерирует меньше ложных лиц.В совсем крайнем случае или для экспериментов есть полностью ручная выборка (manual), т.е. по каждому исходному кадру dst вы вручную проходите и указываете лица.Окно ручного исправления лиц. здесь вам нужно совместить зеленые точки с лицом.Управление:Enter - подтвердить лицо и следующий кадр.Пробел - пропустить кадр., - вернуться на прошлые кадрыКолесо мыши - изменять прямоугольник.5) data_dst extract faces MANUAL FIX DELETED ALIGNED DEBUGОчень важный пункт. Напрямую влияет на качество итогового фейка.позволяет переизвлечь те кадры из dst, чьи results debug из п.5.1 были удалены вами.Для чего это нужно? Чтобы сделать фейк качественнее, нужно проверять dst кадры в папке aligned_debug, просмотреть их можно через п.5.1.Неправильно размеченное dst лицо может приводить к значительному ухудшению качества:Если где-то увидите, что контур лица существенно отличается от реального, например съехало на фон, то удаляете эти кадры из папки aligned_debug (п.5.1), и запускаете этот пункт.Произойдет ручное переизвлечение удалённых кадров. Видео поясняющее этот процесс: https://www.youtube.com/watch?v=7z1ykVVCHhM5.1) data_dst check results debug.batпросмотреть все dst кадры с наложенными поверх них предсказанными контурами лица5.1) data_dst check results.batАналогично смотрим результаты выборки лица dst, и удаляем другие не целевые лица. А целевое лицо, даже мутные - оставляем.5.2) data_dst sort by similar histogram.batЕсли в целевом видео содержатся другие ненужные лица, можете произвести эту сортировку, и затем удалить эти лица будет проще.5.3.other) data_dst sort by original filename.batСортирует по оригинальному имени файла5.3.other) data_dst util recover original filename.batВосстанавливает оригинальное имя файла извлеченного лица.Итог по извлечению лиц dst.Ваша цель извлечь только целевое лицо (даже мутное) из каждого кадра, удалив все другие лица.6) train ... .bat Тренировка.Отключаем любые программы, которые могут использовать видео память.Если в процессе запуска тренировки появилось много текста, содержащее одно из этих слов: Memory ErrorAllocationOOMзначит на вашем GPU модель не запустилась, и вам нужно урезать модель, для этого смотрите описание опций моделей.При первом запуске модели, программа спросит о различных опциях, которые сохранятся и будут использоваться при последующих запусках.Просто нажимая Enter - будут использоваться значения по-умолчанию.Which GPU idx to choose? ( skip: system choice ) : Имея мульти-GPU можно тренировать одну сцену на разных моделях или опциях одной модели без клонирования папок. Просто выбираете индекс GPU на старте тренировки/конвертации и тогда файлы модели в папке workspace\model будут содержать префикс этой GPU в имени.Если оставить выбор GPU по-умолчанию, то выберется лучшая GPU и файлы модели не будут содержать префикс.Write preview history? (y/n skip:n) : писать ли историю превью на дискTarget iteration (skip:unlimited) : целевая итерация, по достижению которой тренировка остановится.Batch_size (skip:model choice) : выбор размера батча - это то сколько картинок за раз кормится нейронной сети для обучения. По-умолчанию выбирается низкое значение, но вы можете подобрать это значение самому под свою видеокарту. Чем больше - тем лучше.Feed faces to network sorted by yaw? (y/n skip:n) : кормит модели src лица отсортированные по такому же направлению как и dst. Смысл в том, чтобы кормить только нужные лица. Однако пока до конца не протестировано хорошо это или плохо.Flip faces randomly? (y/n ?:help skip:y) : кормит модели все лица случайно перевернутые по горизонтали. При выключенной опции финальное лицо будет более естественным, но тогда src сборка лиц должна покрывать все углы поворота.Src face scale modifier % ( -30...30, ?:help skip:0) : модификатор масштабирования для src лиц. Если src лицо более широкое чем dst и фейк получился плохим, то имеет смысл немного уменьшить это значение.Если модель запускается уже второй раз:Press enter in 2 seconds to override some model settings.если вы нажмете Enter в течение 2х секунд, то появится возможность заменить некоторые опции модели.Список моделей для тренировки. Также указано минимальные требования к памяти GPU.H64 (2GB+)половина лица с разрешением 64 - это как оригинальная FakeApp или FaceSwap, только лучше за счёт тренировки маски нейросетью + исключающей фон вокруг лица + исправленного конвертора. Для видеокарт с видеопамятью 2 и 3Гб данная модель работает в сокращенном режиме, т.е. качество будет хуже чем с 4GB.H128 (3GB+)как H64 только с разрешением 128. Однако половина лица может плохо обучится на некоторых условиях света и поворота головы и т.д. Для видеокарт с видеопамятью 3 и 4Gb данная модель работает в сокращенном режиме, т.е. качество будет хуже чем с 5Gb.Опции для H64 и H128:Use lightweight autoencoder? (y/n, ?:help skip:n) :выбрать урезанную модель. Необходимо для видеокарт с <= 4Gb видео памяти.DF (5GB+)модель от dfaker. Полнолицевая модель с разрешением 128, умная функция тренировки лиц, исключающая фон вокруг лица.LIAEF128 (5GB+) как DF, только пытается морфировать исходное лицо в целевое лицо, сохраняя черты исходного лица. Морфирование не всегда хорошо, и может сделать вообще не узнаваемое лицо, в таком случае выбирайте DF.Опции H64, H128, DF, LIAEF128 моделей:Use pixel loss? (y/n, ?:help skip: n/default ) :позволяет быстрее улучшать мелкие детали и убрать дрожание. Включать только после 20к итераций.SAE (512MB+) Самая последняя лучшая и гибкая модель. Содержит все другие модели. Есть возможность переносить стиль лица и освещение, которое будет изучаться непосредственно нейронной сетью. При первом запуске можно настроить различные параметры. Эти параметры влияют на то, какого размера будет сеть и запустится ли на вашей видеокарте, так что можно подстроить модель на тренировку как на 512MB так и на 24GB. Конечно же, чем больше памяти, тем лучше качество получится в итоге.Пример фейка Cage-Trump: https://www.youtube.com/watch?v=2R_aqHBClUQПример фейка Elon Musk - Robert Downey jr: https://www.youtube.com/watch?v=OLWFnPwzgEYОпции только для SAE модели:Resolution ( 64-256 ?:help skip:128) : разрешение лица. Больше разрешение - больше требуется памяти, дольше тренируется модель. Вы можете выбрать любое значение от 64 до 256 кратное 16.Half or Full face? (h/f, ?:help skip:f) : половинный или полный размер лицаLearn mask? (y/n, ?:help skip:y) : учить ли маску. С изучением, маска будет более сглаженной и менее дрожащей, иначе будет использоваться грубая. Однако при стилизованной тренировки можно обойтись без изучения маски.Optimizer mode? ( 1,2,3 ?:help skip:%d) : Эта опция только NVIDIA видео-карт. Режим оптимизатора нейронной сети. 1по-умолчанию. 2 – позволяет тренировать сеть x2 большего размера, требует дополнительной ОЗУ памяти. 3 – позволяет тренировать сеть x3 большего размера, требует еще больше ОЗУ и на 30% медленнее.AE architecture (df, liae, vg ?:help skip:df) : тип архитектуры нейронной сети. AutoEncoder dims (128-1024 ?:help skip:%d) : количество размерностей сети, больше - лучше, но может не запуститься из-за нехватки памяти. Можно уменьшать для достижения работоспособности на вашей видеокарте.Encoder/Decoder dims per channel (21-85 ?:help skip:%d) количество размерностей енкодера/декодера сети, больше - лучше, но может не запуститься из-за нехватки памяти. Можно уменьшать для достижения работоспособности на вашей видеокарте.Use CA weights? (y/n, ?:help skip: %s ) :позволяет получить выше точность модели, но требует время для первого запуска 0-й итерации.Use lightweight encoder? (y/n, ?:help skip:n) : использовать ли облегченный энкодер, он быстрее на 35%, только не тестирован на различных сценах.Use multiscale decoder? (y/n, ?:help skip:n) : использовать ли многомасштабный декодер, позволяет добиться более высокой четкости. Use pixel loss? (y/n, ?:help skip: n/default ) позволяет быстрее улучшать мелкие детали и убрать дрожание. Включать только после 20к итераций.Face style power ( 0.0 .. 100.0 ?:help skip:%.1f) : скорость изучения переноса стиля лица, таких как освещение и цвет. Может вызывать артефакты при больших значениях. Число с плавающей точкой. 0 - не учитьBackground style power ( 0.0 .. 100.0 ?:help skip:%.1f) : скорость изучения фона вокруг лица. В большинстве случаев морфирует лицо в dst. Число с плавающей точкой. 0 - не учитьВ процессе тренировки можно выходить через Enter, нажав его в окне Training preview, и запускать в любое время, модель будет продолжать обсчитываться с той же точки.Тренируем от 24 часов и больше. Когда результат удовлетворяет - выходим также через Enter, нажав его в окне Training preview.Кнопка 'p'(на англ раскладке) в окне Training preview обновляет предпросмотр.В окне Training preview также мы видим кривую ошибки. Понижаясь, она показывает прогресс тренировки с течением времени.Итог по тренировке.Выбираете модель в зависимости от сцены и вашего личного опыта.7) convert ... .bat Наложение лиц.Выбираете ту модель и тот номер GPU (если у вас их несколько), с которым тренировали.Опция debug позволяет посмотреть процесс наложения лиц и некоторую техническую информацию по каждому кадру в консоли, нажимаете пробел в окне просмотра.Основная концепция наложения лиц.Далее при запуске программа спросит об опциях:Choose mode: (1) overlay, (2) hist match, (3) hist match bw, (4) seamless (default), (5) raw :Выбор режима наложения лиц.РежимыOverlayпрямое наложение предсказанного лица из нейросети без предварительной обработкиHist-matchналожение с уравниванием гистограммы.Histh-match-bwналожение с уравниванием гистограммы из чернобелого канала.Seamlessналожение методом Пуассо"Poisson image editing." ACM Transactions on Graphics (TOG). Vol. 22. No. 3. ACM, 2003.Rawполучить сырые слои для собственной обработки в видео редакторе, например After Effects.По-умолчанию, если нажать Enter - выберет seamless.Какую выбрать? Зависит от случая. Пробуете все и смотрите результат.ОпцииSuppress seamless jitter? [ y/n ] (?:help skip:n ) :Для режима seamless. Подавляет дрожание лица, возникающее только в seamless режиме. Включение этой опции сделает процесс конвертации в несколько раз дольше.Seamless hist match? (y/n skip:n) :Для режима seamless. Включить ли уравнивание гистограммы.Masked hist match? (y/n skip:y) :Для режимов hist match, hist match bw, seamless, указывает, уравнивать ли гистограмму по маске лица.Use predicted mask? (y/n skip:y) : Использовать ли маску, которая предсказана моделью (только если маска изучалась, например в SAE модели можно выключить изучение маски) - по умолчанию да. Либо использовать маску из dst лица.NoYesChoose erode mask modifier [-200..200] (default 0) :Указываете насколько уменьшить в размерах dst маску. Значение < 0 - расширить маску. Это адаптивное значение, а не абсолютное.-100+100Choose seamless erode mask modifier [-100..100] (default 0) : только для режима seamless - модификация размеров маски, использующейся для самой seamless функции. Значение < 0 - расширить маску. Эта маска задаёт непосредственно шов, по которому будет проходить адаптация цвета.0+40 Choose blur mask modifier [-200..200] (default 0) : Указываете насколько сгладить dst маску. Значение < 0 - уменьшает сглаживание по-умолчанию моделями H64 и H128. Это адаптивное значение, а не абсолютное.-200+200Hist match threshold. [0..255] (default - 255) :Уменьшение значения подавляет артефакты для режимов с уравниванием гистограммы.(по-умолчанию) 255231Choose output face scale modifier [-50..50] (default 0) : изменить масштаб выходного лица в пределах -50+50%. Полезно, когда предсказанное лицо несколько больше оригинала.-50+50Apply color transfer to predicted face? Choose mode ( rct/lct skip:None ) : дополнительно адаптировать цвет лица, используя rct или lct алгоритмDst лицоПредсказанное лицоrctlctDegrade color power of final image [0..100] (default 0) : Степень деградации цветности конечной картинки от 0 до 100. Уменьшая общее качество картинки, можно скрыть недостатки наложения лица.0100Export png with alpha channel? [0..1] (default 0) : экспортирует только лицо с альфа каналом для последующей работы в видео редакторе.Итог по наложению лиц.В начале запускаете с отладкой, пробуя различные параметры и смотрите результат.Запомнив подходящие значения, запускаете наложение без отладки.Результат картинок в workspace\data_dst\merged - можно использовать самому в видеоредакторе, либо склеить в видео в п.88)convertedbat Склейка в видео.Следующие .bat файлы склеивают картинки в видео с тем же FPS и звуком, что и data_dst.mp4 - поэтому не удаляйте data_dst.mp4 из workspace папки.to avi.batв формат avito mp4.batв формат mp4to mp4(lossless+alpha).batmp4 без потерь с использованием alpha канала.to mov(lossless+alpha).batmov без потерь с использованием alpha канала. Sony Vegas с использованием QuickTime сможет использовать alpha канал из mov файла.Всё. Результат в workspace\result.mp4Если результат не удовлетворил, можно пробовать разные опции наложения, либо продолжать тренировать для повышения четкости, либо пробовать другую модель, либо пробовать другое исходное лицо.Дополнительная информация:9) util convert aligned PNG to JPG (drop folder on me).batпозволяет конвертировать папку с извлеченными PNG лицами из старых версий DeepFaceLab в JPG. Для этого перетяните папку с набором лиц прямо на этот .bat файл. Известны случаи, когда Windows 10 резервирует % видеопамяти, даже если видеокарта не используется для вывода картинки. В таком случае придётся чем-то жертвовать, чтобы тренировка запустилась (batch size, размерности в SAE, итд).Советы и хитрости.Узкие лица лучше тренируются на широкие лица. Вот почему фейки с Кейджем так популярны.Иногда, если нейронная сеть будет получать dst лица только одного освещения, например, с затенённым носом, при этом src лица не содержат аналогичного лица с таким же освещением, то нейронная сеть может не понять, куда вообще смотрит лицо на некоторых ракурсах, в результате предсказанное лицо будет содержать неправильный поворот головы.В этом случае полезно добавить в тренировочный набор data_dst\aligned лица того же персонажа, но извлеченные из других сцен с другим освещением.Тем самым можно несколько улучшить результат. Но лучше всего, конечно, найти src лица с тем же освещением носа.Продвинутые советы от @GAN-er ( только на английском языке ):Tip 1:You may benefit by starting with a small batch size (within reason) and increasing it later. The reason is that a **large batch size will give you a more accurate descent direction but it will also be costlier to calculate**, and when you just start, you care mostly about the general direction; no need to sacrifice speed for precision at that point. There are plenty of sources discussing the batch size, as an example you can check this one:https://stats.stackexchange.com/questions/164876/tradeoff-batch-size-vs-number-of-iterations-to-train-a-neural-networkTip 2:Unlike the batch size that the only thing that does is affecting how accurate each step will be as far a the true gradient goes, the dimensions, actually, increase the complexity of your NN. As a rule, **the more complex a network the better the resulting model**, but since nothing comes for free, **the more complex the network the more time it will take to converge**.What you generally want is to **_figure out the max dimensions that you can use_** given your GPU's memory, and your desired max batch size.You can set the max batch size to something, say K, and then increase the dimensions until you get OOM errors. In the end, you will end up with a triplet, {batch size, ae_dims, ed_dims}Ideally, you would use 1024 and 85 for your autoencoder and encoder/decoder dimensions, but no card has enough memory for such a configuration even with batch size 1.Remember that unlike batch size that you can change at will, once you set up the dimensions you can not change them.Note that **if you use a complex - high number of dimensions NN, in combination with a small batch size, it will take _considerably_ longer for your model to converge**. So keep that in mind! You will simply have to wait longer, but also you will get a much much better result.For cards with 11Gb of memory, and for SAE you can try the following settings:For DF architecture: 12 698 51 For LIAEF architecture: 8 402 47Tip 3:If you end up being stuck, i.e. the loss does not go down but for no obvious reason or if you get weird artifacts in some previews before you discard and start from scratch, you may want to flip your DST and SRC for a while. This often is all you need to keep things going again.Tip 4:99.995% of your success or failure rate is due to bad SRC or DST sets. This means that 99.995% of your time should be spent in actually ensuring that your sets are well curated. Throwing together a hot podge of material and expecting a decent outcome is guaranteed to result in disappointment. Garbage in, garbage out.Дополнительное описание SAE.Эта модель по сути содержит все другие модели, если отключить тренировку стиля и multiscale decoder.SAE очень гибкая, можно подстроить либо под лучшее обобщение лиц сетью, либо под лучшую четкость изображения, либо просто чтобы заработало на вашей GPU.Если src сборка лиц содержит количество лиц больше чем dst, модель может не сойтись. В этом случае используйте опцию Feed faces to network sorted by yaw.Если src лицо шире чем dst, модель может не сойтись. В этом случае можете попробовать опцию Src face scale modifier в -5.Архитектура df делает лицо более похожее на src, но если модель не сходится, используйте liae.VG архитектура SAE пока что не показала каких-либо улучшений, нужно больше тестов.Если на вашей видеокарте много видеопамяти, вы можете выбрать между большим batch size, которое улучшает обобщение лиц, и Encoder/Decoder dims размерностями, которые улучшают качество картинки.Face стиль тренируется, чтобы перенести цвет лица, освещение, макияж. Если он уже хорошо перенесен, то продолжение тренировки с высоким значением может сделать артефакты.Background стиль тренируется, чтобы перенести контур лица и окружение. Благодаря контуру лица, подгоняется src лицо под контур dst.Как лучше всего тренировать SAE со стилем? Не существует лучшего решения, всё зависит от сцены. Экспериментируйте со style значениями по своему усмотрению. Включите write preview history и отслеживайте изменения. Делайте резервную копию файлов модели каждые 10к итераций. Вы можете откатывать файлы модели и менять значения, если что-то пошло не так в превью-истории.Работа на AMD/Старых NVIDIA/IntelHD видеокартах.DeepFaceLab поддерживает старые процессоры без AVX инструкций. Для этого используйте DeepFaceLabCUDA9.2SSE сборку.DeepFaceLab поддерживает AMD, IntelHD Graphics и любые старые GeForce видеокарты через использование OpenCL 1.2 движка.Для этого используйте DeepFaceLabOpenCLSSE сборку.Работа на OpenCL в сравнении с CUDA имеет некоторые недостатки:- извлечение лиц можно запускать только MT или S3FD, при этом первый проход (1st pass) на MT всё равно будет работать на CPU, но достаточно быстро! S3FD полностью работает на OpenCL и является предпочтительным методом. Второй проход работает на OpenCL без проблем.- чтобы запустилась SAE, её нужно урезать существенно как в ae_dims , ed_ch_dims так и в batch size по-сравнению с тем же количеством видеопамяти на CUDA версии. Можете поставить вообще самые минимальные значения, а также разрешение 64 и half face - в качестве демонстрации натренируете фейк худшего качества без проблем даже на IntelHD Graphics с 256МБ памяти !- каждый запуск тренировки и после сохранения в процессе тренировки, OpenCL будет перезагружать свои подпрограммы, что будет занимать некоторое время.Пожертвование разработке.Если вам нравится данная программа, вы можете пожертвовать денег для дальнейшего развития.Yandex.moneyhttps://money.yandex.ru/to/41001142318065Paypalhttps://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=KK5ZCH4JXWMQS&source=urlbitcoin:31mPd6DxPCzbpCMZk4k1koWAbErSyqkAXrПолезные ссылкиСтраница разработкиhttps://github.com/iperov/DeepFaceLabВводная видео инструкция по работе с программойhttps://www.youtube.com/watch?v=K98nTNjXkq8 Мой канал фейковhttps://www.youtube.com/channel/UCEtoVzBLuE-ni-54h7kYvsgПопулярный канал фейков https://www.youtube.com/channel/UCUix6Sk2MZkVOr5PWQrtH1g/videos Фейки на реддитеhttps://www.reddit.com/r/GifFakes Готовые src наборы лиц для DeepFaceLabhttps://mega.nz/#F!y1ERHDaL!PPwg01PQZk0FhWLVo5_MaQ поиск подходящей знаменитости по загруженному лицуhttp://www.pictriev.com поиск подходящей порнозвезды по загруженному лицуhttps://findface.sex/ruhttps://findpornface.comhttps://pornstarbyface.comhttp://www.didshedoporn.com/9j/4AAQSkZJRgABAQEAYABgAAD/2wBDAAIBAQIBAQICAgICAgICAwUDAwMDAwYEBAMFBwYHBwcG BwcICQsJCAgKCAcHCg0KCgsMDAwMBwkODw0MDgsMDAz/2wBDAQICAgMDAwYDAwYMCAcIDAwMDAwM DAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAz/wAARCACAAYADASIA AhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQA @@ -46694,4 +46694,4 @@ AFzb+dfn3qP/AB8N/vGiivr8J/DifLYv4jQ8P9639I+81FFdByRE/wCW6/71P07/AI+R/vUUVUth z/yC5v8AcP8AKvx1/wCCmf8AyUD8/wCtFFc9TdmmX7r1PlWw/wCPdfxqRP8Aj7H0oorza2x9hT2P o79ib/kaV+o/rX35oH/Ityf7o/kaKK4aXxI5cV1PyV/4Lpf8lY0P/rh/Wvz5vv8AXN/vUUV9fhPg PmsVui/pv3G+lbml/wCs/CiiunqckjM1T/kJJ9TV7QP9cv8Av0UVc9icP8Z2Fj/qV+prgPHH/IWX -/fH8xRRUQ6ndiNkf/9k=ckpoonckpoon202019-03-07T16:50:00Z2019-03-08T16:05:00Z2019-03-13T15:57:00Z55223485927700Microsoft Office Word023064falseНазвание1false32495falsefalse12.0000 \ No newline at end of file +/fH8xRRUQ6ndiNkf/9k=ckpoonckpoon212019-03-07T16:50:00Z2019-03-08T16:05:00Z2019-03-16T16:52:00Z55323487927814Microsoft Office Word023165falseНазвание1false32628falsefalse12.0000 \ No newline at end of file diff --git a/facelib/LandmarksProcessor.py b/facelib/LandmarksProcessor.py index 531ce86..8eed2d0 100644 --- a/facelib/LandmarksProcessor.py +++ b/facelib/LandmarksProcessor.py @@ -282,7 +282,6 @@ def mirror_landmarks (landmarks, val): return result def draw_landmarks (image, image_landmarks, color=(0,255,0), transparent_mask=False): - image = image.copy() if len(image_landmarks) != 68: raise Exception('get_image_eye_mask works only with 68 landmarks') @@ -309,17 +308,15 @@ def draw_landmarks (image, image_landmarks, color=(0,255,0), transparent_mask=Fa if transparent_mask: mask = get_image_hull_mask (image.shape, image_landmarks) - image = image * (1-mask) + image * mask / 2 - return image - + image[...] = ( image * (1-mask) + image * mask / 2 )[...] + def draw_rect_landmarks (image, rect, image_landmarks, face_size, face_type, transparent_mask=False): - image = draw_landmarks(image, image_landmarks, transparent_mask=transparent_mask) + draw_landmarks(image, image_landmarks, transparent_mask=transparent_mask) image_utils.draw_rect (image, rect, (255,0,0), 2 ) image_to_face_mat = get_transform_mat (image_landmarks, face_size, face_type) points = transform_points ( [ (0,0), (0,face_size-1), (face_size-1, face_size-1), (face_size-1,0) ], image_to_face_mat, True) image_utils.draw_polygon (image, points, (0,0,255), 2) - return image def calc_face_pitch(landmarks): if not isinstance(landmarks, np.ndarray): diff --git a/mainscripts/Extractor.py b/mainscripts/Extractor.py index 8c67f34..9c359e3 100644 --- a/mainscripts/Extractor.py +++ b/mainscripts/Extractor.py @@ -79,93 +79,106 @@ class ExtractSubprocessor(Subprocessor): image = self.cached_image[1] else: image = cv2_imread( filename_path_str ) - h, w, ch = image.shape + + if image is None: + self.log_err ( 'Failed to extract %s, reason: cv2_imread() fail.' % ( str(filename_path) ) ) + return None + + image_shape = image.shape + if len(image_shape) == 2: + h, w = image.shape + ch = 1 + else: + h, w, ch = image.shape + + if ch == 1: + image = np.repeat ( image [:,:,np.newaxis], 3, -1 ) + elif ch == 4: + image = image[:,:,0:3] + wm = w % 2 hm = h % 2 if wm + hm != 0: #fix odd image image = image[0:h-hm,0:w-wm,:] self.cached_image = ( filename_path_str, image ) - - if image is None: - self.log_err ( 'Failed to extract %s, reason: cv2_imread() fail.' % ( str(filename_path) ) ) - else: - if self.type == 'rects': - h, w, ch = image.shape - if min(w,h) < 128: - self.log_err ( 'Image is too small %s : [%d, %d]' % ( str(filename_path), w, h ) ) - rects = [] - else: - rects = self.e.extract_from_bgr (image) - - return [str(filename_path), rects] - - elif self.type == 'landmarks': - rects = data[1] - landmarks = self.e.extract_from_bgr (image, rects) - return [str(filename_path), landmarks] - - elif self.type == 'final': - src_dflimg = None - (h,w,c) = image.shape - if h == w: - #extracting from already extracted jpg image? - if filename_path.suffix == '.jpg': - src_dflimg = DFLJPG.load ( str(filename_path) ) - - result = [] - faces = data[1] + + if self.type == 'rects': + h, w, ch = image.shape + if min(w,h) < 128: + self.log_err ( 'Image is too small %s : [%d, %d]' % ( str(filename_path), w, h ) ) + rects = [] + else: + rects = self.e.extract_from_bgr (image) + return [str(filename_path), rects] + + elif self.type == 'landmarks': + rects = data[1] + landmarks = self.e.extract_from_bgr (image, rects) + return [str(filename_path), landmarks] + + elif self.type == 'final': + src_dflimg = None + (h,w,c) = image.shape + if h == w: + #extracting from already extracted jpg image? + if filename_path.suffix == '.jpg': + src_dflimg = DFLJPG.load ( str(filename_path) ) + + result = [] + faces = data[1] + + if self.debug: + debug_output_file = '{}{}'.format( str(Path(str(self.output_path) + '_debug') / filename_path.stem), '.jpg') + debug_image = image.copy() + + face_idx = 0 + for face in faces: + rect = np.array(face[0]) + image_landmarks = np.array(face[1]) + + if self.face_type == FaceType.MARK_ONLY: + face_image = image + face_image_landmarks = image_landmarks + else: + image_to_face_mat = LandmarksProcessor.get_transform_mat (image_landmarks, self.image_size, self.face_type) + face_image = cv2.warpAffine(image, image_to_face_mat, (self.image_size, self.image_size), cv2.INTER_LANCZOS4) + face_image_landmarks = LandmarksProcessor.transform_points (image_landmarks, image_to_face_mat) + + landmarks_bbox = LandmarksProcessor.transform_points ( [ (0,0), (0,self.image_size-1), (self.image_size-1, self.image_size-1), (self.image_size-1,0) ], image_to_face_mat, True) + + rect_area = mathlib.polygon_area(np.array(rect[[0,2,2,0]]), np.array(rect[[1,1,3,3]])) + landmarks_area = mathlib.polygon_area(landmarks_bbox[:,0], landmarks_bbox[:,1] ) + + if landmarks_area > 4*rect_area: #get rid of faces which umeyama-landmark-area > 4*detector-rect-area + continue + if self.debug: - debug_output_file = '{}{}'.format( str(Path(str(self.output_path) + '_debug') / filename_path.stem), '.jpg') - debug_image = image.copy() + LandmarksProcessor.draw_rect_landmarks (debug_image, rect, image_landmarks, self.image_size, self.face_type, transparent_mask=True) - face_idx = 0 - for face in faces: - rect = np.array(face[0]) - image_landmarks = np.array(face[1]) + output_file = '{}_{}{}'.format(str(self.output_path / filename_path.stem), str(face_idx), '.jpg') + face_idx += 1 + + if src_dflimg is not None: + #if extracting from dflimg just copy it in order not to lose quality + shutil.copy ( str(filename_path), str(output_file) ) + else: + cv2_imwrite(output_file, face_image, [int(cv2.IMWRITE_JPEG_QUALITY), 85] ) - if self.face_type == FaceType.MARK_ONLY: - face_image = image - face_image_landmarks = image_landmarks - else: - image_to_face_mat = LandmarksProcessor.get_transform_mat (image_landmarks, self.image_size, self.face_type) - face_image = cv2.warpAffine(image, image_to_face_mat, (self.image_size, self.image_size), cv2.INTER_LANCZOS4) - face_image_landmarks = LandmarksProcessor.transform_points (image_landmarks, image_to_face_mat) - - landmarks_bbox = LandmarksProcessor.transform_points ( [ (0,0), (0,self.image_size-1), (self.image_size-1, self.image_size-1), (self.image_size-1,0) ], image_to_face_mat, True) - - rect_area = mathlib.polygon_area(np.array(rect[[0,2,2,0]]), np.array(rect[[1,1,3,3]])) - landmarks_area = mathlib.polygon_area(landmarks_bbox[:,0], landmarks_bbox[:,1] ) - - if landmarks_area > 4*rect_area: #get rid of faces which umeyama-landmark-area > 4*detector-rect-area - continue - - if self.debug: - debug_image = LandmarksProcessor.draw_rect_landmarks (debug_image, rect, image_landmarks, self.image_size, self.face_type, transparent_mask=True) - - output_file = '{}_{}{}'.format(str(self.output_path / filename_path.stem), str(face_idx), '.jpg') - face_idx += 1 + DFLJPG.embed_data(output_file, face_type = FaceType.toString(self.face_type), + landmarks = face_image_landmarks.tolist(), + source_filename = filename_path.name, + source_rect= rect, + source_landmarks = image_landmarks.tolist() + ) - if src_dflimg is not None: - #if extracting from dflimg just copy it in order not to lose quality - shutil.copy ( str(filename_path), str(output_file) ) - else: - cv2_imwrite(output_file, face_image, [int(cv2.IMWRITE_JPEG_QUALITY), 85] ) - - DFLJPG.embed_data(output_file, face_type = FaceType.toString(self.face_type), - landmarks = face_image_landmarks.tolist(), - source_filename = filename_path.name, - source_rect= rect, - source_landmarks = image_landmarks.tolist() - ) - - result.append (output_file) - - if self.debug: - cv2_imwrite(debug_output_file, debug_image, [int(cv2.IMWRITE_JPEG_QUALITY), 50] ) - - return result - return None + result.append (output_file) + + if self.debug: + cv2_imwrite(debug_output_file, debug_image, [int(cv2.IMWRITE_JPEG_QUALITY), 50] ) + + return result + #overridable def get_data_name (self, data): @@ -208,7 +221,7 @@ class ExtractSubprocessor(Subprocessor): self.y = 0 self.rect_size = 100 self.rect_locked = False - self.redraw_needed = True + self.extract_needed = True io.progress_bar (None, len (self.input_data)) @@ -277,13 +290,12 @@ class ExtractSubprocessor(Subprocessor): if len (self.input_data) > 0: return self.input_data.pop(0) else: - skip_remaining = False + allow_remark_faces = False while len (self.input_data) > 0: data = self.input_data[0] filename, faces = data is_frame_done = False - go_to_prev_frame = False # Can we mark an image that already has a marked face? if allow_remark_faces: @@ -291,10 +303,9 @@ class ExtractSubprocessor(Subprocessor): # If there was already a face then lock the rectangle to it until the mouse is clicked if len(faces) > 0: self.rect, self.landmarks = faces.pop() - - self.rect_locked = True - self.redraw_needed = True faces.clear() + self.extract_needed = True + self.rect_locked = True self.rect_size = ( self.rect[2] - self.rect[0] ) / 2 self.x = ( self.rect[0] + self.rect[2] ) / 2 self.y = ( self.rect[1] + self.rect[3] ) / 2 @@ -333,6 +344,8 @@ class ExtractSubprocessor(Subprocessor): self.cache_text_lines_img = (sh, self.text_lines_img) while True: + io.process_messages(0.0001) + new_x = self.x new_y = self.y new_rect_size = self.rect_size @@ -346,7 +359,7 @@ class ExtractSubprocessor(Subprocessor): new_rect_size = max (5, new_rect_size + diff*mod) elif ev == io.EVENT_LBUTTONDOWN: self.rect_locked = not self.rect_locked - self.redraw_needed = True + self.extract_needed = True elif not self.rect_locked: new_x = np.clip (x, 0, w-1) / self.view_scale new_y = np.clip (y, 0, h-1) / self.view_scale @@ -355,28 +368,47 @@ class ExtractSubprocessor(Subprocessor): key, = key_events[-1] if len(key_events) > 0 else (0,) if key == ord('\r') or key == ord('\n'): - faces.append ( [(self.rect), self.landmarks] ) + #confirm frame is_frame_done = True + faces.append ( [(self.rect), self.landmarks] ) + break elif key == ord(' '): + #confirm skip frame is_frame_done = True break - elif key == ord('.'): + elif key == ord(',') and len(self.result) > 0: + #go prev frame + + if self.rect_locked: + # Only save the face if the rect is still locked + faces.append ( [(self.rect), self.landmarks] ) + + self.input_data.insert(0, self.result.pop() ) + io.progress_bar_inc(-1) allow_remark_faces = True - # Only save the face if the rect is still locked - if self.rect_locked: - faces.append ( [(self.rect), self.landmarks] ) + self.extract_needed = True + self.rect_locked = False + + break + elif key == ord('.'): + #go next frame is_frame_done = True - break - elif key == ord(',') and len(self.result) > 0: - # Only save the face if the rect is still locked + allow_remark_faces = True + if self.rect_locked: + # Only save the face if the rect is still locked + faces.append ( [(self.rect), self.landmarks] ) + break + elif key == ord('q'): + #skip remaining if self.rect_locked: faces.append ( [(self.rect), self.landmarks] ) - go_to_prev_frame = True - break - elif key == ord('q'): - skip_remaining = True + while len(self.input_data) > 0: + self.result.append( self.input_data.pop(0) ) + io.progress_bar_inc(1) + break + elif key == ord('h'): self.hide_help = not self.hide_help break @@ -384,7 +416,7 @@ class ExtractSubprocessor(Subprocessor): if self.x != new_x or \ self.y != new_y or \ self.rect_size != new_rect_size or \ - self.redraw_needed: + self.extract_needed: self.x = new_x self.y = new_y self.rect_size = new_rect_size @@ -395,8 +427,7 @@ class ExtractSubprocessor(Subprocessor): int(self.y+self.rect_size) ) return [filename, [self.rect]] - - io.process_messages(0.0001) + else: is_frame_done = True @@ -404,20 +435,8 @@ class ExtractSubprocessor(Subprocessor): self.result.append ( data ) self.input_data.pop(0) io.progress_bar_inc(1) - self.redraw_needed = True - self.rect_locked = False - elif go_to_prev_frame: - self.input_data.insert(0, self.result.pop() ) - io.progress_bar_inc(-1) - allow_remark_faces = True - self.redraw_needed = True - self.rect_locked = False - elif skip_remaining: - if self.rect_locked: - faces.append ( [(self.rect), self.landmarks] ) - while len(self.input_data) > 0: - self.result.append( self.input_data.pop(0) ) - io.progress_bar_inc(1) + self.extract_needed = True + self.rect_locked = False return None @@ -457,12 +476,12 @@ class ExtractSubprocessor(Subprocessor): image = cv2.warpAffine(image, mat,(w,h) ) view_landmarks = LandmarksProcessor.transform_points (view_landmarks, mat) - image = LandmarksProcessor.draw_rect_landmarks (image, view_rect, view_landmarks, self.image_size, self.face_type) + LandmarksProcessor.draw_rect_landmarks (image, view_rect, view_landmarks, self.image_size, self.face_type) if self.rect_locked: - image = LandmarksProcessor.draw_landmarks(image, view_landmarks, (255,255,0) ) - self.redraw_needed = False - + LandmarksProcessor.draw_landmarks(image, view_landmarks, (255,255,0) ) + self.extract_needed = False + io.show_image (self.wnd_name, image) else: if self.type == 'rects': diff --git a/mainscripts/LabelingTool_unfinished.py b/mainscripts/LabelingTool_unfinished.py new file mode 100644 index 0000000..7d43453 --- /dev/null +++ b/mainscripts/LabelingTool_unfinished.py @@ -0,0 +1,287 @@ +import traceback +import os +import sys +import time +import numpy as np +import numpy.linalg as npl + +import cv2 +from pathlib import Path +from interact import interact as io +from utils.cv2_utils import * +from utils import Path_utils +from utils.DFLPNG import DFLPNG +from utils.DFLJPG import DFLJPG +from facelib import LandmarksProcessor + +def main(input_dir, output_dir): + input_path = Path(input_dir) + output_path = Path(output_dir) + + if not input_path.exists(): + raise ValueError('Input directory not found. Please ensure it exists.') + + if not output_path.exists(): + output_path.mkdir(parents=True) + + wnd_name = "Labeling tool" + io.named_window (wnd_name) + io.capture_mouse(wnd_name) + io.capture_keys(wnd_name) + + #for filename in io.progress_bar_generator (Path_utils.get_image_paths(input_path), desc="Labeling"): + for filename in Path_utils.get_image_paths(input_path): + filepath = Path(filename) + + if filepath.suffix == '.png': + dflimg = DFLPNG.load( str(filepath) ) + elif filepath.suffix == '.jpg': + dflimg = DFLJPG.load ( str(filepath) ) + else: + dflimg = None + + if dflimg is None: + io.log_err ("%s is not a dfl image file" % (filepath.name) ) + continue + + lmrks = dflimg.get_landmarks() + lmrks_list = lmrks.tolist() + orig_img = cv2_imread(str(filepath)) + h,w,c = orig_img.shape + + mask_orig = LandmarksProcessor.get_image_hull_mask( orig_img.shape, lmrks).astype(np.uint8)[:,:,0] + ero_dil_rate = w // 8 + mask_ero = cv2.erode (mask_orig, cv2.getStructuringElement(cv2.MORPH_ELLIPSE,(ero_dil_rate,ero_dil_rate)), iterations = 1 ) + mask_dil = cv2.dilate(mask_orig, cv2.getStructuringElement(cv2.MORPH_ELLIPSE,(ero_dil_rate,ero_dil_rate)), iterations = 1 ) + + + #mask_bg = np.zeros(orig_img.shape[:2],np.uint8) + mask_bg = 1-mask_dil + mask_bgp = np.ones(orig_img.shape[:2],np.uint8) #default - all background possible + mask_fg = np.zeros(orig_img.shape[:2],np.uint8) + mask_fgp = np.zeros(orig_img.shape[:2],np.uint8) + + img = orig_img.copy() + + l_thick=2 + + def draw_4_lines (masks_out, pts, thickness=1): + fgp,fg,bg,bgp = masks_out + h,w = fg.shape + + fgp_pts = [] + fg_pts = np.array([ pts[i:i+2] for i in range(len(pts)-1)]) + bg_pts = [] + bgp_pts = [] + + for i in range(len(fg_pts)): + a, b = line = fg_pts[i] + + ba = b-a + v = ba / npl.norm(ba) + + ccpv = np.array([v[1],-v[0]]) + cpv = np.array([-v[1],v[0]]) + step = 1 / max(np.abs(cpv)) + + fgp_pts.append ( np.clip (line + ccpv * step * thickness, 0, w-1 ).astype(np.int) ) + bg_pts.append ( np.clip (line + cpv * step * thickness, 0, w-1 ).astype(np.int) ) + bgp_pts.append ( np.clip (line + cpv * step * thickness * 2, 0, w-1 ).astype(np.int) ) + + fgp_pts = np.array(fgp_pts) + bg_pts = np.array(bg_pts) + bgp_pts = np.array(bgp_pts) + + cv2.polylines(fgp, fgp_pts, False, (1,), thickness=thickness) + cv2.polylines(fg, fg_pts, False, (1,), thickness=thickness) + cv2.polylines(bg, bg_pts, False, (1,), thickness=thickness) + cv2.polylines(bgp, bgp_pts, False, (1,), thickness=thickness) + + def draw_lines ( masks_steps, pts, thickness=1): + lines = np.array([ pts[i:i+2] for i in range(len(pts)-1)]) + + + for mask, step in masks_steps: + h,w = mask.shape + + mask_lines = [] + for i in range(len(lines)): + a, b = line = lines[i] + ba = b-a + ba_len = npl.norm(ba) + if ba_len != 0: + v = ba / ba_len + pv = np.array([-v[1],v[0]]) + pv_inv_max = 1 / max(np.abs(pv)) + mask_lines.append ( np.clip (line + pv * pv_inv_max * thickness * step, 0, w-1 ).astype(np.int) ) + else: + mask_lines.append ( np.array(line, dtype=np.int) ) + cv2.polylines(mask, mask_lines, False, (1,), thickness=thickness) + + def draw_fill_convex( mask_out, pts, scale=1.0 ): + hull = cv2.convexHull(np.array(pts)) + + if scale !=1.0: + pts_count = hull.shape[0] + + sum_x = np.sum(hull[:, 0, 0]) + sum_y = np.sum(hull[:, 0, 1]) + + hull_center = np.array([sum_x/pts_count, sum_y/pts_count]) + hull = hull_center+(hull-hull_center)*scale + hull = hull.astype(pts.dtype) + cv2.fillConvexPoly( mask_out, hull, (1,) ) + + def get_gc_mask_bgr(gc_mask): + h, w = gc_mask.shape + bgr = np.zeros( (h,w,3), dtype=np.uint8 ) + + bgr [ gc_mask == 0 ] = (0,0,0) + bgr [ gc_mask == 1 ] = (255,255,255) + bgr [ gc_mask == 2 ] = (0,0,255) #RED + bgr [ gc_mask == 3 ] = (0,255,0) #GREEN + return bgr + + def get_gc_mask_result(gc_mask): + return np.where((gc_mask==1) + (gc_mask==3),1,0).astype(np.int) + + #convex inner of right chin to end of right eyebrow + #draw_fill_convex ( mask_fgp, lmrks_list[8:17]+lmrks_list[26:27] ) + + #convex inner of start right chin to right eyebrow + #draw_fill_convex ( mask_fgp, lmrks_list[8:9]+lmrks_list[22:27] ) + + #convex inner of nose + draw_fill_convex ( mask_fgp, lmrks[27:36] ) + + #convex inner of nose half + draw_fill_convex ( mask_fg, lmrks[27:36], scale=0.5 ) + + + #left corner of mouth to left corner of nose + #draw_lines ( [ (mask_fg,0), ], lmrks_list[49:50]+lmrks_list[32:33], l_thick) + + #convex inner: right corner of nose to centers of eyebrows + #draw_fill_convex ( mask_fgp, lmrks_list[35:36]+lmrks_list[19:20]+lmrks_list[24:25]) + + #right corner of mouth to right corner of nose + #draw_lines ( [ (mask_fg,0), ], lmrks_list[54:55]+lmrks_list[35:36], l_thick) + + #left eye + #draw_fill_convex ( mask_fg, lmrks_list[36:40] ) + #right eye + #draw_fill_convex ( mask_fg, lmrks_list[42:48] ) + + #right chin + draw_lines ( [ (mask_bg,0), (mask_fg,-1), ], lmrks[8:17], l_thick) + + #left eyebrow center to right eyeprow center + draw_lines ( [ (mask_bg,-1), (mask_fg,0), ], lmrks_list[19:20] + lmrks_list[24:25], l_thick) + # #draw_lines ( [ (mask_bg,-1), (mask_fg,0), ], lmrks_list[24:25] + lmrks_list[19:17:-1], l_thick) + + #half right eyebrow to end of right chin + draw_lines ( [ (mask_bg,-1), (mask_fg,0), ], lmrks_list[24:27] + lmrks_list[16:17], l_thick) + + #import code + #code.interact(local=dict(globals(), **locals())) + + #compose mask layers + gc_mask = np.zeros(orig_img.shape[:2],np.uint8) + gc_mask [ mask_bgp==1 ] = 2 + gc_mask [ mask_fgp==1 ] = 3 + gc_mask [ mask_bg==1 ] = 0 + gc_mask [ mask_fg==1 ] = 1 + + gc_bgr_before = get_gc_mask_bgr (gc_mask) + + + + #io.show_image (wnd_name, gc_mask ) + + ##points, hierarcy = cv2.findContours(original_mask,cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE) + ##gc_mask = ( (1-erode_mask)*2 + erode_mask )# * dilate_mask + #gc_mask = (1-erode_mask)*2 + erode_mask + #cv2.addWeighted( + #gc_mask = mask_0_27 + (1-mask_0_27)*2 + # + ##import code + ##code.interact(local=dict(globals(), **locals())) + # + #rect = (1,1,img.shape[1]-2,img.shape[0]-2) + # + # + cv2.grabCut(img,gc_mask,None,np.zeros((1,65),np.float64),np.zeros((1,65),np.float64),5, cv2.GC_INIT_WITH_MASK) + + gc_bgr = get_gc_mask_bgr (gc_mask) + gc_mask_result = get_gc_mask_result(gc_mask) + gc_mask_result_1 = gc_mask_result[:,:,np.newaxis] + + #import code + #code.interact(local=dict(globals(), **locals())) + orig_img_gc_layers_masked = (0.5*orig_img + 0.5*gc_bgr).astype(np.uint8) + orig_img_gc_before_layers_masked = (0.5*orig_img + 0.5*gc_bgr_before).astype(np.uint8) + + + + pink_bg = np.full ( orig_img.shape, (255,0,255), dtype=np.uint8 ) + + + orig_img_result = orig_img * gc_mask_result_1 + orig_img_result_pinked = orig_img_result + pink_bg * (1-gc_mask_result_1) + + #io.show_image (wnd_name, blended_img) + + ##gc_mask, bgdModel, fgdModel = + # + #mask2 = np.where((gc_mask==1) + (gc_mask==3),255,0).astype('uint8')[:,:,np.newaxis] + #mask2 = np.repeat(mask2, (3,), -1) + # + ##mask2 = np.where(gc_mask!=0,255,0).astype('uint8') + #blended_img = orig_img #-\ + # #0.3 * np.full(original_img.shape, (50,50,50)) * (1-mask_0_27)[:,:,np.newaxis] + # #0.3 * np.full(original_img.shape, (50,50,50)) * (1-dilate_mask)[:,:,np.newaxis] +\ + # #0.3 * np.full(original_img.shape, (50,50,50)) * (erode_mask)[:,:,np.newaxis] + #blended_img = np.clip(blended_img, 0, 255).astype(np.uint8) + ##import code + ##code.interact(local=dict(globals(), **locals())) + orig_img_lmrked = orig_img.copy() + LandmarksProcessor.draw_landmarks(orig_img_lmrked, lmrks, transparent_mask=True) + + screen = np.concatenate ([orig_img_gc_before_layers_masked, + orig_img_gc_layers_masked, + orig_img, + orig_img_lmrked, + orig_img_result_pinked, + orig_img_result, + ], axis=1) + + io.show_image (wnd_name, screen.astype(np.uint8) ) + + + while True: + io.process_messages() + + for (x,y,ev,flags) in io.get_mouse_events(wnd_name): + pass + #print (x,y,ev,flags) + + key_events = [ ev for ev, in io.get_key_events(wnd_name) ] + for key in key_events: + if key == ord('1'): + pass + if key == ord('2'): + pass + if key == ord('3'): + pass + + if ord(' ') in key_events: + break + + import code + code.interact(local=dict(globals(), **locals())) + + + + +#original_mask = np.ones(original_img.shape[:2],np.uint8)*2 +#cv2.drawContours(original_mask, points, -1, (1,), 1) \ No newline at end of file diff --git a/mainscripts/Util.py b/mainscripts/Util.py index b70136f..09540ff 100644 --- a/mainscripts/Util.py +++ b/mainscripts/Util.py @@ -63,7 +63,7 @@ def add_landmarks_debug_images(input_path): if img is not None: face_landmarks = dflimg.get_landmarks() - img = LandmarksProcessor.draw_landmarks(img, face_landmarks, transparent_mask=True) + LandmarksProcessor.draw_landmarks(img, face_landmarks, transparent_mask=True) output_file = '{}{}'.format( str(Path(str(input_path)) / filepath.stem), '_debug.jpg') cv2_imwrite(output_file, img, [int(cv2.IMWRITE_JPEG_QUALITY), 50] ) diff --git a/samples/SampleProcessor.py b/samples/SampleProcessor.py index 5990165..93fe1c6 100644 --- a/samples/SampleProcessor.py +++ b/samples/SampleProcessor.py @@ -48,13 +48,13 @@ class SampleProcessor(object): is_face_sample = sample.landmarks is not None if debug and is_face_sample: - sample_bgr = LandmarksProcessor.draw_landmarks (sample_bgr, sample.landmarks, (0, 1, 0)) + LandmarksProcessor.draw_landmarks (sample_bgr, sample.landmarks, (0, 1, 0)) close_sample = sample.close_target_list[ np.random.randint(0, len(sample.close_target_list)) ] if sample.close_target_list is not None else None close_sample_bgr = close_sample.load_bgr() if close_sample is not None else None if debug and close_sample_bgr is not None: - close_sample_bgr = LandmarksProcessor.draw_landmarks (close_sample_bgr, close_sample.landmarks, (0, 1, 0)) + LandmarksProcessor.draw_landmarks (close_sample_bgr, close_sample.landmarks, (0, 1, 0)) params = image_utils.gen_warp_params(sample_bgr, sample_process_options.random_flip, rotation_range=sample_process_options.rotation_range, scale_range=sample_process_options.scale_range, tx_range=sample_process_options.tx_range, ty_range=sample_process_options.ty_range ) diff --git a/utils/DFLJPG.py b/utils/DFLJPG.py index 4255f23..1716392 100644 --- a/utils/DFLJPG.py +++ b/utils/DFLJPG.py @@ -108,43 +108,45 @@ class DFLJPG(object): return inst except Exception as e: - raise Exception("Corrupted JPG file: %s" % (str(e))) - - return None - + raise Exception ("Corrupted JPG file: %s" % (str(e))) + @staticmethod def load(filename): - inst = DFLJPG.load_raw (filename) - inst.dfl_dict = None - - for chunk in inst.chunks: - if chunk['name'] == 'APP0': - d, c = chunk['data'], 0 - c, id, _ = struct_unpack (d, c, "=4sB") - - if id == b"JFIF": - c, ver_major, ver_minor, units, Xdensity, Ydensity, Xthumbnail, Ythumbnail = struct_unpack (d, c, "=BBBHHBB") - #if units == 0: - # inst.shape = (Ydensity, Xdensity, 3) - else: - raise Exception("Unknown jpeg ID: %s" % (id) ) - elif chunk['name'] == 'SOF0' or chunk['name'] == 'SOF2': - d, c = chunk['data'], 0 - c, precision, height, width = struct_unpack (d, c, ">BHH") - inst.shape = (height, width, 3) - - elif chunk['name'] == 'APP15': - if type(chunk['data']) == bytes: - inst.dfl_dict = pickle.loads(chunk['data']) + try: + inst = DFLJPG.load_raw (filename) + inst.dfl_dict = None + + for chunk in inst.chunks: + if chunk['name'] == 'APP0': + d, c = chunk['data'], 0 + c, id, _ = struct_unpack (d, c, "=4sB") + + if id == b"JFIF": + c, ver_major, ver_minor, units, Xdensity, Ydensity, Xthumbnail, Ythumbnail = struct_unpack (d, c, "=BBBHHBB") + #if units == 0: + # inst.shape = (Ydensity, Xdensity, 3) + else: + raise Exception("Unknown jpeg ID: %s" % (id) ) + elif chunk['name'] == 'SOF0' or chunk['name'] == 'SOF2': + d, c = chunk['data'], 0 + c, precision, height, width = struct_unpack (d, c, ">BHH") + inst.shape = (height, width, 3) + + elif chunk['name'] == 'APP15': + if type(chunk['data']) == bytes: + inst.dfl_dict = pickle.loads(chunk['data']) - if (inst.dfl_dict is not None) and ('face_type' not in inst.dfl_dict.keys()): - inst.dfl_dict['face_type'] = FaceType.toString (FaceType.FULL) - - if inst.dfl_dict == None: + if (inst.dfl_dict is not None) and ('face_type' not in inst.dfl_dict.keys()): + inst.dfl_dict['face_type'] = FaceType.toString (FaceType.FULL) + + if inst.dfl_dict == None: + return None + + return inst + except Exception as e: + print (e) return None - return inst - @staticmethod def embed_data(filename, face_type=None, landmarks=None, diff --git a/utils/DFLPNG.py b/utils/DFLPNG.py index bd6b3b3..4fe827f 100644 --- a/utils/DFLPNG.py +++ b/utils/DFLPNG.py @@ -249,17 +249,21 @@ class DFLPNG(object): @staticmethod def load(filename): - inst = DFLPNG.load_raw (filename) - inst.fcwp_dict = inst.getDFLDictData() - - if (inst.fcwp_dict is not None) and ('face_type' not in inst.fcwp_dict.keys()): - inst.fcwp_dict['face_type'] = FaceType.toString (FaceType.FULL) - - if inst.fcwp_dict == None: + try: + inst = DFLPNG.load_raw (filename) + inst.fcwp_dict = inst.getDFLDictData() + + if (inst.fcwp_dict is not None) and ('face_type' not in inst.fcwp_dict.keys()): + inst.fcwp_dict['face_type'] = FaceType.toString (FaceType.FULL) + + if inst.fcwp_dict == None: + return None + + return inst + except Exception as e: + print(e) return None - - return inst - + @staticmethod def embed_data(filename, face_type=None, landmarks=None,