From 1578e8de2dab940849975b4664b329000568edc3 Mon Sep 17 00:00:00 2001 From: phail Date: Sun, 13 Nov 2022 22:33:26 +0100 Subject: [PATCH] fix live tests --- src/paperless_mail/tests/samples/html.eml.pdf | Bin 0 -> 22907 bytes .../tests/samples/html.eml.pdf.webp | Bin 0 -> 6012 bytes .../tests/samples/sample.html.pdf | Bin 0 -> 30170 bytes src/paperless_mail/tests/test_parsers.py | 61 +++++++++++------- src/paperless_mail/tests/test_parsers_live.py | 39 +++++++++-- 5 files changed, 68 insertions(+), 32 deletions(-) create mode 100644 src/paperless_mail/tests/samples/html.eml.pdf create mode 100644 src/paperless_mail/tests/samples/html.eml.pdf.webp create mode 100644 src/paperless_mail/tests/samples/sample.html.pdf diff --git a/src/paperless_mail/tests/samples/html.eml.pdf b/src/paperless_mail/tests/samples/html.eml.pdf new file mode 100644 index 0000000000000000000000000000000000000000..058988f66172a822ab2fcfd62daeb780a4332aab GIT binary patch literal 22907 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 literal 0 HcmV?d00001 diff --git a/src/paperless_mail/tests/samples/html.eml.pdf.webp b/src/paperless_mail/tests/samples/html.eml.pdf.webp new file mode 100644 index 0000000000000000000000000000000000000000..b4481efd92e594f4fb8afeeedcc67d1df9e47db1 GIT binary patch literal 6012 zcmeH{MN||3phbrmI+T=dX%La_6r>e~?gr`Z6p#k#?vA0GAq8oq9I2tZ1%{gWvHYvQ z{^!4Q?m2JsHh1wpD=R8`k^=y`3bL9YO<{Vw|Lm7}fP55=e<&lUk||2Xs^w*+j0_}i z?7&3W_Ri0N*}GlSvu|o2be}uyO}8LTh(CT1Sj%szR>a@OHOq^JGX+VVd-7Y;bqLK% z{!7#q`L@O*-D+PbgcYHIsGN`9?7{l5d5s7)X?~u4DTFtQC4E9_yg1%lt`+`5HY3aK z0SJK?y64$7!m*H}XAHzBLIt7QiFrMH1UU=o56OB-d(=UQA*JAuf15of3n7w77UYlT zg8|+fjT7W8q$j`}iM;23@HSkFS0lM}UyWQ-pzaUc3K*{7$2Y8+XrGG&l(19y6wh)8=q*^| z0M#V4h4(B6ZwI}agdg~SOGtW}cVUC;_!Y>j52x%k|9CCp4AG(?m|Xubt6Kyplo`+oi8g%_fF?H$Vf92BIsUG9cwpt*~pnSL;D5^-OA_k!;!w`2sZjpYd) zPr33PF~QU8#Uf&i_rwp563H+DOyXbE_r9S`K(akTq0aD{0nE5HaPeOAevDO`W8+y0 zV9+{I1gu=9DPk>+?Ga;$W;VyflY)pqtAI01#JVq%? zP5(HSo%J{de!bj+A%j&F6ev%pcf-%x(HIkP@?UcQpZ}u{tOo!H=x-_@%>d>~=p5Pf zZH;{>F(XL7!cKtW6LXhv2P3-xUT}#<=ImF#0_$`hy0HXaeNGy-e=`# zw^hLoHHrCY&i&!BD0g`GnkaM^1l*mLr4O&@)4NYI4~y$0C9uBPRAkfr;Ko{``gZp9 zXE80)G;=k#aV}(1)sw*aqLX0``&&B4^KPMI{^sxHj0NY=iMy{*x5kUdlXm-ts0xk` zj*irP$f@?HT3W5GLx;;M-L{iva_eG^tg)LP)c5zRw08Zfj4da9-$nR;MIKuS+3y zXX`X?u&!#Eh62b4<#5g3t&OAuC=5Qu%oG~0^TYjBq#7PDhe=h@ZInHKB~!82V1CP3 zb2SlBYW}9pkcD4r=5IxKKl1T%haGk%2e^n~v52bujm9PaH#KdOP1u;Th{aLPA#zW- zY=ZNb7tyLtH)gX<>rb28Xzd-0#>zh?Z-U&hgw_d{TIu-Mr5SOezSXU1w6*XL64U4# z@JdyF9c&eC2`BKBiT&XCuJIbw@p?O@_D)jlgM!NtonrwYUCuexHVp`MWwVU}qA$L$ z70qdKU|`ihv}?&O{KcxU6cWjRMY4Wro?ex_t62(N6ZU{jsyV41Xh;rAd4rV-^NJ>a z{FAI)TulzRQ45B~2ddcVWPEe5BQDq`L`mVpC=jq$@Qw~ReMkA6e>fj0`go#0mr23f zWB}TZ|C^O&sBLLV5c{MpV3kRHCxx3>FjlBstoIe3VQ5nU8Z@-7USw-Wm@+8@WVEp* zQe_unSuyDZB=9GsUWIh@PPT$EzWuhPX$G#KL=G#Kg7LTv_Zel-WoYV(yH(s@nm`{_ zE{}HFVqH)jnr@P4##tswtt3bg8?;~l8;^h7sfmmlZ z|4prFg92eaZu?aQWEEjKTT;@9`cZ7$6@`eTQ2or$Cit8jEDKrQAL`dY0*j5zJ}8yH zl0po`=+C8|>$umnPT$YuD-KqJ4Np1G&x9YzQFaDC{PlZyj^7)QuW#W4j4=%hVQwSO zN-zA?p!XNSdk03z=I5RSwVZh>jMM~b4DEp!`SAqu2|34KmN9V~1=C^@gKJt0$_pyT zfG20`TsDb3VjA+Y52ET$lZQ;%}r%sZlb=!70q@U)6pw@9iQTP zLE`AUGwQi-!f2>`@lpOepSdfl4hrmNB4(imh5E{*!>5YY={_O0+4ovqW33wR-yI`k z)+FU#yd2%iQgad_^c*6z8PWEAy=~qvy2zY=bibP`?vSa^>L8m&J-MKqV3t(VhNtVAvaI5T--WQpvpUDHck=#q|tLVZjqK(jZ=6h(i1(&#Y zizn3eqxtEUj&5U9&|Zub`~24O{R~CX(U5+QyvX=2hL`WgO`>DFt&~!#wv~qlwg+Xo z1SMsQ_)A>hIjQwEdb=DQMajT{_c3=4e}r~o>|ls9zmH>Z@~3XE`0BXPNvfaMM~fI% z2DEIQ7vkNmoBlcJ4{laq7Dyi>sw{*Ff2wrvw(afU={A@XT$Wj`Zj>2w5?x882{EWFFVnZ*1g-IE^a}sH6#2H$S6a5<*}vUFxm*+}w+(Aawv%E7&nL0= z6=$5GsQ^DNDw-`q%ev5v31G2J69&9DN z)NjB&6WSka=~1(R61dUAFloP6l0w=ecv#eyrkmzm2RPpTdVE1mrX?pSVaLR*qM_IH za3^aUtla>DmFRARjD#gv5@;SD>zNM}5>Vxqx5Moe^Ms{CG4xe>gvEW73wWWKS1~Ob z7s}hNuuC^pSb#v;h8hx85aKlT>m3s*Q9n7iY%G19=iONSqLC*HqT-QFA{nC|&d}Dj z;}=Pmnz;Z{OQgpb3cA)zbxr2nd9PV})*5A?FGv(^#=6S}A@TfG_PyezB6pkNVTl~rdY2l(PhBC*fZoG*}E>Crl{bAH&TBWK`cMC zKVs7ehZ6VZ;6uk~cS_{BzLBHtpkAiKk%xxuf&z&_K5N=^lHz zSKf6hBW>HX3I3Nt+WL(iv3ITi8ydP^1mZvZAC>!?hB{zSY;^3ka zzwq9U!w41={mFSO3Uj>4Tg4+@*4;8|o4NR~>ULnvlrA7B8jjt3p|H zQVt&<^gAIZGcW-w*;lu%sz{jxny$w)^s5`KPk*b4IVwy1w$NDVR`}PMubvgyQQYq3 z0!4>tXz)tf=eK=PNo9ORTxHGbR{i)04}ks@j#moU3G6B*M08+td*&F>y+m`zQuj?4zIV9Ub$hroT5R#e|FRH2D4K{xfdFa`CG86 zxa$dDN2nBo#6Pn>U09J{6hr@&aW=eXb55Ln`CcE$KC*<2y(N)<7oyH}<{wm%W&GtV zb+)q_6lb94t~JnYXgiV%O6t$hDK3}JXDB0_WKFXu_PGgb^Lc|aYs61{T{X^Go$RIy zBvjP8vAJ9Q`C&h`)>+Pk(xH0!hk5If`6sk9_T8%p&IqwZs{6^4pQkOZaF}g8m6mAaHVYoE1m^$c_X`qhr;2?BT@3*1yQWAVl?y?nXiT zt&&>ydS-JMuHI6Hs?1_5s+;Ra8b^BkmFZmGSM&^@*j^Z z$&RKwM;MKf`q{qvp=hi%i{wHvd9M23d5GhSLU_R877+aK?u_YZqK z&>WfK-8szM7uVfinb$0fSpB>j88-kMD8uD zdwl*>p9;k#9wnTDG7+yIdH4DQw#Ej|9^#DaHAJ#Ot;N`gSo_8DEjl0BC*I)vOw#)nF+vJq~UfZ@5> zj$-|^kt4E66QYLt*Kdz8lna~?rCF7pXzhkyoPm)PSO`J}moApDD3N}5KEfAL=8W4^ zZI#*fLFZYskx#O@Iuh>3RO>G4Cvu0+s#;?fa2^xavyBw0f<8T#Y;9s;yvjc_RISd0 zetg_%lXvVx?_j?@;q|N1-%wUhOCj!c0=eC&i7_8s^VWSa0T60fo^a4d88@3X7>k#^ z82Anp+zQex;l`5F_Nc1_@$eWVG!a%2`|OuDEw?a_jjr)Z11Q2H8_Llzn}ZTZonv7XSCccQ$$ooD*2Cb%(GrX}sq-FMtN%}Kt$!fSF|*6q4Z zlU7(l4@~;88BzZ?zB=9ENz5oXg&s4#S>rFRXinYz%8~J%@cJ`a#!zg6@+5Bzy8L_i zj#2Lg%?j{E!gl^nK+<}`PB+AvD151~2WpX5H;l(!akI}55+u=mq4NotNNB+Dj31%B zBk!YFURixUaK;ZoapC+*J1o%R|J28Ct+1GVZj4qV3(Zw&j6W)smgx2^bPo3z>Ro-K zsglv%ijF>7xrpAU)7DD`|8zB#1=n#N%B&+5%Ty zvxpkH-ywif8iXWurrHu^hUtB^l=tFnD#a$+-js!?7_9eh()0u`dna$hu^{Lk=q-MQ z<2yD=qm1M1@{nnwg%dW;IwT}bA}_2|9&|~vARgizZ$Y=*ZiDqXcnF?x4L$q)1(?c5 z$-F`7JiImH(w3*!QN=KM&;Cx(_je*JX z&i4UNh3YWf5`pHs;ole*4&k|2s>}tL9`hrfCMqQ03A%IZ5Wg6-f=?NkDm|+*=lj|1 zXaD)GFRL6W1@%LG5feHOA|C2fji{d|rX6{_zc~*+>ZDj@ubmr#U$vN8Q9>+XO9jy;g|tT0HBc-93LN}sH3T&Gtd!0C2HXa zw6%1xrG{fvbOf5X7@NKkRje%y8Q<;&*fKM5yj}UtZ3(m!GjuiuP>J!dFtM;OGc&WY zFf(y6anLd`QNF$2_~d{l|92Jv0XS1TlV3Kl{>v6)LjW@zqlg@UQ6A`MYiRQ?CiZ_Z zse0I(0vI(FjI2zJo#7Z&T#TH5Q>1JS%}wDLH7re>EdboCaE$LwEzK>Qe;m*0kvDS(j($`uF2hsUtwm7w{_Bw- zvER+p^S*0yt{22mmusNyz;#71A3%Y?hIPS8K)>)<49O-YNXS8FP-3BL0xoN4v9t4n z6|WB_PMj;il52O6W9du<+5TZgQwA6P2}0063P|Xak`W zQH~wu;v>AFrl~u=J4IZ?Whg2g_)uHSih|99M%w~xR3;p(dEWYp{@8M|2(E*z-Zi99 zL)=%b#}hN3$lbI?)A%kUVoe=1oh(s|lz_r4e^8WJHp1mY#%q0_TXyTnBf81J5-QL| zvbzU8=hA{L^-|b9Y6B*!Nv?in(3gjAL^%&ukMr{uM{@IEoM5sb1STYQ+;Bfn(HA&- zyEO=JLXElKNp<8@Vm@9~WR|a4nk$rLC_c_&6G5TKj*BT_(?Q+rsyb5*tT@JRKSV+7 z6O7J{d3PVZ-q>QlpDp?##lG&d!NY~q3$|tqLRA@pa)qR84I3fkoq@CiDA7NKj=bL; z?cAZLt8wOIi_UPG)giPQ77<>&mJQDSd4Kha5@?FT4Vy++d}B8~Ba`zoGSV57?E*GC zBDH$1$eR82YA3-uBQ)AEDN<)x6m-DcCu{~M96^4((v;^}>+>Xad;RhEs&O3jj0u<) zoI*JEan)PX5)9o@Cc5PYx%s}Get4Fv7lFi8Lf;Tcws-@0xUDXsHqf*<4AnrcBiy5` z@#y_VHBJ_9HM|0#o8M*<+zJ5HIMj4XRX@;#4qH1PH5Ba+B^= zx6hUL+?AxmJ7~o0(x%(891?Egk|hIIH^8tauw-VPS=a1Z0+;Hp+Pc!v-cUaWscXq8 zfS1_mHA&wRa#Oj|{%#LCw>qfoj=g*_Xo@V|3~`kDK>5*npkuu;C>@t5kx6xu6TF!j zNBnz$ho(F5tM7Q2W4R%IaZ6GC_{CW2%k#{+lRVxU&PTJOgZi;jX07k}*~EMf`2%?t z7(`eO_4p6u5@n91DmdBPc1{kwfndqv#bK=R`bdOi#7$@hqd(%eY02M#4vA!fdh|Or zao^MWdH)=`qN)_%`p%UG-3`&ztsONnWI$h-#0(M{Ru0L;jwE625Qt#%2uUacj?EI@ zDMII9E6K^um05K3@>!29$THzhHEW#0LfnXn!c?=%pzC9J1AsD6p;oq>mdm%`5(!Up zL_V10M2a4S7!`J%{ho{GIU11*-B1&(VzTES2oyekF;>=k;xK%;Ey)`t|^8o0*5~05HFh~ zHQ1~gC>Lb=euE3V0y3uDs>n&hw+terE~Grhy<|Uyd+G(s=Xg8#@$7XIZ4OJ1#-E)! zbM1`1fdWsh48tvNKp!-2JScaLNU?;c{q#^rwUPpY3=o2vdwD(;K>5~k5!^2%*TsRT zJx^cw>Cj_*T6WTBCxlYcElcq`&L#^QvLP9L0bN%7XB`5^n%rE zc2S5p7qPGaf=cNwuv-XZ!?zLasj>=D>8KDxv|1YBTOWQF7=LXH?L>lPo$VE`$A0hp zXx$t{6psX^y1pQH>+k)&4_XH}@9Wr7(m>Oy1_=PV{c%*Szq zDvuGYpCXp#92M3zgOlzzPkxrIXeVkVdJWDMZyxtiqo?E+9bjth05u}nXW=YL+dM!~ z2%J{%Q(Si@6Qrlu`yoQ3y*z#{9i=cVwA{>Aa83|WPZA_!{JH|I4bR`DWs%fvDv)}2 zv9pv(qy@1K+cM5N?WWz0QLi%nbOTMt1-&Hz3T`gpoSfIe?7Yep7ysn32%k7%kw@v^ zZJsdtO(`9sh=L?IKozZK465&YQwq!QU;}cqCeC64%=^IXVAU21e0X!RO7e#>nMnZX z2wNP%rnvy`0or5In5p8)f@Ko&U9emH7X?R zlOk~HXsG_=*(Ng%CLjw;_EUhh%~R-*xhVZdG1YjvND(;xijdNT$S@TnU8}wfMC*+~ zO?NKe2Pay0gzTDQCH2dGlRv_&b9dJrc?E3FPMnRU46d3Dn@H+$tDx9a8PB3CpVpN%lA z?cT-G+t4%`F1UW)*)!K=eU#a@{;ZRryiF`#%mk?J28Zhwsr}ei=W%R8-+?ZUB7l-B zu7%qD@h&I6mr@b_qy@pJ!7_m(RN-#iD_H6tBHJJi3bu#8E!K_1%^&V(l(O7CYt&f%>R5s}_V7DVaAc>C4yUV8EAd&<)Y%RXZnp){&zI8mj`I#Emzk`nJ%F<8k z;bdz4mDsOIU!zCz(47f#D@kQ-O2z0I4JvqpK0x)IP9PL>8v@qp(?>owETO_Ju|}1| z=d;$nj?2-(lSA13iHwGx#frd7E>HYX3YtHUcIB89BPe@_o(JbfN6P>+XW~ppJw_HA zZ_;knY*&u#npYHTv}?#;K-uY{$U9dh&1>{tvi@DeoDNW=!SvxLnaOE#14FfzO@*eE zgX}7u7Wv(gN)l5=ElUvic}NV~t(woiHrO1^;xH&rzj>^#_p07154H&J1_ z*tPq^&EQGkX$ZWu=B%DsZoo#K3{rA36x)!m*Y;Oqvz#uugp>Q#_7rFVlawlvT?0l7 zL?pAeE}t&Fl#189!!fKzIS2v9QrKb{lOQpbVXlCN>Y$LM)giHkdBuLu3KKnCRTqYL?Dc6KvuO&j9I-cr7*yMwmE< z2=$r`EQJsDc=LcBaT5oZp!d`?wr3$XtjCg5^Q$W;)m%HFPSe$Bm@LEZ!ToN5Cjmst zbl2eY_D~?Tsjeb7WZMU!E&V4zfu^#?_{7@l_~GMrzq^mS>Eaazi_O;!vWZV=Tk#JV zbR%bD{jcuoc3%>|N-%{dzGq9xgYHWNNnE|jh=pr;Z(pk9!GT|x*Xq zaSU#>QS#0gOZ4Yt%*RKr*TyHJYr;YiTd>qf)}K9n+=;KiWk+x;7qXI{IJ1iA_*N&E zT|N&#UslLjMWYG6-JxRMwa9jd7QoGk#&xSU>W0iM2>H}rtVK;e^q{DHgJ6&Ed8J;J7(Vl>228Ajn%oJ9;7*M8M)@S|&WiflQZ z1hJ;F5F~l)NA0VFidGF4`k*Hir-Rl8+7l29-Z@uB!OJg+WyK+BSz})u7?L;gGLCj) zGnwt=9BhZ_G+R&d)2UTSkM8u*4+4+c8eXy=uHMs(Pg_v1$!oyCGQaSLkWXpPz(P?Y zTNo!ptU{70Vr=%}r&oG>wzbPe(zi2g=a{+;>(k=XS0x)MX`fzMv7h_&9vWZW{S$;M zd4TLpI@LT~c8mQ)MnxInC|S(*#=R~fq$P&VJM9YyP4;AT5{p{owU9+|9w7q-V>-jO zvHMKln0E zwj6f1dPS()vOePrG@8BGUT)&_ejB>L7?se~&M5A!YThj2M9w8B{+ho7daHo)B2gcx z0HoJ!H^C$slv2eqgq+i6uenJ$)i3w*?54^)HuiAOnQ@MLewbbI`Y6S{h?abMtp6qL@AIpJfdDltNC*2l2o%kj%4P8F#NXku%nEpH954>BnwbxPrm%911;4JVuCL;*)CAZ*SsopD)NZN|=7 zxfOQ1qWnrj0yR^g@^WN zjRaCMx!K2Q`#M_hh)Iw2AC`w_Q6-DXNiJI0;ziWwL!fFN$JKd5qX-qV@At}Tk^k3FQ@y2eoS^4rm%99PmLT&C*e$} z+{KG!m0U-#{xNh+3!&G)q)E^lnm;Gr(ZQa?08iu#()&0v_u|TOJx85iazyADhH5XP^6Wv__F?8x`bHSfqxmQPk3GqHI%u_q(=G z5w^{|%M=L_q9hD(OaVH)Wb$G+DIe=QO7uTurR99$;WnX{&JvX;BMloN>rq59PgJOI zZ*^l(Do-h}RkXS3H)vbR02Uqi@^3*egg{r7c zKl^dXhf9L(W4+y3eU=(Z_@DQHhbd&sO0Rd;v4?gw20QcnUa`Yb`K`h4V+t{q7JM}A zZ;^tO^#bLHO<`rAQL>GuC&=0~c@s^|Bl3rjao73H`}f$Pl86*X6T}YgMZ#1J8|^+2 z;nQd;YKK?@r{-dKUBJFGh&w8N+rTxCzN>kn6StQqzQEtR;Yg8CRZS;!u|AEg+|C|kk3lxjXl zt##5lkah*>q2ScGEJ&XZpsO12ds_0~=)%8cLRJa7ok!V6zBe@`vj9k^LECJ^6hKP}#B4g#9v{DAQ#Ip2{l8#Ul3gz2gs7b=6(f-_-- zPylsEUEG$3RzM$iB#o472G>z&od(AIO=gB!dNVyHT8+{NloLcferB;D1Qe_;YvPW~ zec#ikjA1^ksi`qSv9#)h(jW0f^3>C)@U#vbtd12;d&Rk{OiyH^3kw|3mO#PCca*yjo0~uVE9uT+CnS6 zUlEkL+HZ&2D3tV=11Xy=RXLJWSi#OAakNT+mQIgwJk%sh#95<{)KxBE#Zul5lPe_h zetB`5XOMG#M`*QyCGf;Q1Zz&8g`O_$bf6W4-S>RCn%t0d&C?Y;OmUVKPgTm?p&P+5 zn!4h&h{cb*Gekxs@L9elm{0ZN-L^zt6D=vB3zO5{;<7gu5*8_l+4H_Uo4 z6Gnp3HESBroG;mwbI^XYx9U(Vnpa%AnmX=%tzYG@mS-ttLtHH0hcK^Cy$Rvd{)mt) zti@oji+Decoa>e635TzSR;qx*F4GrM*>|Rs)vT6sX&35_jQq*j_MhloYPY8EI9{$Bo#pd7>2CkbWn3=ASwMNijXo%X2^U# zQz{^*OGCAR>04hK&uh{xXN3?v?^y-N*#ikBfLwTnn$sWI#du(_ON0R;p+MSm`sx^3 z-(!X0( zSU0PG{N|7>@uLcNerq(3>%ao1*E;`?`kL?CrOQOEgaU@`4b*PmKW|cKO$hgGoDIxa zJSZ6CL8y}pq;7mQQblKE8?JET^?lm$p>6av@aU3yU@J6OY&FJ>G3;VI3nW*c=!h== ziW30s1@&P*h+ND4`E6?#$19A&gH~4%1(Ta+7HX}XUXtIlE+M!*coiW36#E5;e|Sa+^yUSBMFHyNtcQe-y~?Ud_vc|U%m{?yK~ zBLK~~JCHqQ2f)tDGvXB%Z_BlZg>b@_!QyC9C9n8qzRTEg$zmqWRzAh%7{Rl_8Xu+j zU0CkPb(>yc^?o;TL8X$b*ZwMDPT#(Mo!;x6Rr>pk{Z@3HN`V>bFzup@&mtr)&PU$6 z7tmM&O;?bsqSlF#F=ko;2-Yd{TaaEWw5=Kyx}wZruOa#$ocXe^cJ|@5IxCZPezrbV z@q0gP>L4cprHEAqcZ_W=x!e+IIcYp4K0%F2jF_9_ zosXlZ#^aKqOZ_|LN>0E`x5ugzU)$ZIXLZ4QD6#{K)}lfW-vz}*^T#G>z?$(Ee*UIQ zhY4hf{tIG!+$(he?v&ZF6Q!Rebw=9UO4DUoop30&}*cZQBGZ$QMqh zZbQDp5yM#UB(M>AoS#2TC<*zKUx#N%JY0lT-SDyIt|MVTj67B%vpa2K?L|CRL18l? z^!5?Pe%kCzPy(mkV3n@%;)T*F$j*@8{Dv@o%((m5K4VS0epe;F53gcWf$dsZD{#zs z18OJpaxYzLY|Nse4(i?PO31!K`uFIu zhFWl!Vqj1u&}Ho+WzgjE+bb$DujFO_HW9o;Qiqj;lw!I|{}sYP9KO{V+#8A5`h0|w z&B+G5BCBB_IS9k+B=tM;q8&$}Al+9b?%z6*ChF73WfiE(yyxs|ejr&CoYiULtSgYS||BH8(G zU`60*ju+^!cXJGT%hcbm?CJT)=rKOj<#4eO2_4nkcAtIbL~3fzMVp+(*;8)^_KbZV zyDMc=dbl1{=wj|qkXQ-;3p~bOdJzcnVHv5ugM&Fq0yke&Uh-T-uC(H=^EttEic}Zo zWUIHDA$Ds=ICZ7JH%XV!EtZB4vj0vV)Mrxfuiv}eGU!S>i zGN32(HG+M2NUfGpd%KBc$Q zG&Xm1o2OVDK0u9GH3aOuFvM^sa;bfGU89ByBmy<7Io?z_7JpGuED%~x&bW;zKm}QV)nMPm-fW$+@0C+V+K7OL^ux~w)DGr)%S;s$MQ2^(_i?<2k z?x+yHS(yH0{yr2*G{S!+w`+qX%jy`K1ge)KiJCP(GvlO>SX9z|fHOKKoz#L)!3zl~ z;P4tMZf-WuUs&bfAWPwgLN+)^@%JB-5ua9g84SD~Py3AQIppdCEZLTlr)K;Lna1gk zus10J#EjlAfYGGb0}4`h+hy@jSGfM=%KvRB&&Kv| z37M_BC@sp2;xnl+RyXBLvD_Y@+-$4njiSSFP*#fB=L0IZo=$hu_ze<>mnKC)xt|65 zePG}U^aAHlc!_5w-pFS2LXV$zk+V{~`WKv=Ud%(5{k>i!7#LGxN>=>xeoMs3AV6pin{~?W$3>}QOngRoDQI?q; zp)WkYuzW1y_=)~1l2zZa6?5E$=i>AXR%7_8{GS=X@~;f|E14C4Lp+pCoq#Tm#->hy zH~h*QR>fGw)ES`t8>YgjYU=I`VEl~*5&8RF^zU~mT{uQ@cV|fz=U?EJw_7Dy0l&Z} z%5N}}|H6~}B5Se(e!)%NdZQ)>;8zF!%^(4M!-u?Gm0$y~{YCqAo1CeMrJ)GW9iYwh zMr7w^W8h}z=H>u!u`x4nGjnruz3CKvyYmfP;sp4W&~H*zoE=?^ofQooe-oMB;5NSx z0o;G9`n&i4I{mjw{^h*WFL5q!mb~F)WGqdb0NTG|q^$cdqzv;Pc$&Y0_Ln|!8&lgi z-M^qUc7IXc6a$!l-~J{Gp#A3CU;J{SZ$>Jb1OC1wCn_ZdU=k2`^W^P-%I*yi!}R-) znTh%jwf|VF|4^&=Tiq|<(VO%)b-(RY{)bQ|?mvb81NQSDLM1HCT^!%=Il?y10IK(f zP5@^hz{nKfXzJ!@>HHS-U*~Q>M{5R#U#KPk^Y4}W-@Rr2AH02oKmFnDFG2sdIR9bT zKfL{&QUCCknfXtl|LEQSA@tu@?ssPX@4m47556$7{i*gJ4;lZV_8-3descJyFRXtG z{YUoxhtPlbMp8|rf+p3?_&GbGME6rW&YVU-lq8fozSwDwr{vN zfc77y{$|j>RX!*6o6Yiuwr?%?KiQanm-wIDZH7W>=GKYQ$d zEy;iP%)hexSCEx~z_&z@0sIw*x32TMx&OK%|F$*Bn0owb-Txv2elOTtib#q5;sN~D z{%gbeul4*#rx7)DHnahn{}S@HAN;jzylq5=j@D9kX24%t)ZcCVZ^~cSOici9+m7j* z;J^2u|FRXp{5wbg(D+Bw{R{WV3}E5pVtxBO@qc>^W9DRI{daI=n}@gR_f^3c?%Rou zwe(?|^x?7Wv7B_-IVl$6IQ)ca$oCMz5aF=AR4FJ}{egX$pvld^3WFo{X%>iY8_I>> zX$k^mFl}iy9fXUD=$FKYp9J=0yFMXLUOqHV-rhbwpYz@BwM}|X@{jJf3FbPTfS`b& zpqPM+&qhiEA9wbfK;nF5v$^XGrH@o!XJ|pU(EJbQAh9Qpwtzd=AX)zRN7&`M^e?6( z&>A2Idtg-hIx7u3TO;hqn4nYw&~a5-EI>7EE}`h_!vpOUI{ha1^oL%Ut^+p^v|L7A z_wyp{vHK$sM=_8FtHS~hc>U*-J}$cTpk3M&qd@X6yde(dL|`(EdOnttIo|9bf}pdl zDOH+GK!deJSDVS}wAXL_mkd9Z`6&4!JnW((1=HNl3*29WGpn5zh$@?{`@eio2cheG z!pm6y-d=iC(a&5ih`em#Y=DPMv(W`Xme|cinAvh>UK)T27<2}W$V2kF;YrzLo&f*K zBA~U;&ETzfh;I}80nGcWr+tRvxD|o#xGD8Yrhf8kt?rs(`MuVzYE4wGch)V~H4#xe zbS}S7yJ7{4fvQgnz5h4l6fW<%hHPJRIf`t*~;n@ zZgARN>aMI25GAJXG`96atjA}^^)>ApS8UoBV$eRnXHMtk^?#iRnOwbE$4P&+PPM_@ zL59B_5(s5}wIX~%WKx1k2Tl`(ku3PXn5Yvm_&R$sK(d>U7`fMzKvKxg=Ueyfzf8;! zf%4}5vhz8_`Uho-tMqPkZLSJCu_ zEDv>QX2IHg?5L6<_##K3PK3zV^Su^oew1&n&4|kO*6k<74RbIgmzVLi9g?c2jVjOl`c#_h z1HJ|PjCZxeT95OnM@2LuLvB?CQx3&7{L|&^22m!*fF^3Gd6g9Hk6Gy(JO|vLh&GsR zgV2pS>x^Ab6KQt&ew%GA6_&nw_&#COp{KU*ml=8Y?gS!|Gmo@65hq>Fwebi?#qd^Z zO%v1B9Q2OPbcp&JIm$`LAqQRTaKjio-i1|LwuYZ>Ra#ohC0d__ko<)HsnX~c`4r7o zbSc7IaT9yZxaw#~DKC4H!X~S|e>6Itd}A6TVprH~Dp9tcTIq7XyvN?`w%?Uvd33`? zKF!Ti!qlP7WE$qu)Xjx4br=SXl|61utezE`QJhVvA)>vL8@?5Xg&n?-pe}gxIijb4 zW}!9@E^_m`#M$R7k*ru#OBbJgtbDv#$Omt&cNkAwDOI5R>wa5h@zj^0${50%)_KA- zHJYt?{&3;7@60ilxkCFBL(UtXb(Yr2!w)vkgyCa;wl)4BA@I(Pl|P;H zh21kITXoX2=3waY)*yN>Uem}nFXaR^v7=#jA&+w?NC_%U-LbCrg}?vMa)xfqw!Xz}SworfrK!gv>`!e}6uGWs)>=d4-N z48&6+^x!>ys*8MAQK+q~_780j?D-T#2ZkKAkPF^hn{l?8FNH3{fp8SB@Q=wf7zQaK zeGZoSP9j*#Yy#`Ao1)L@iC5HnKCcUkxijBu;?I>xw@5QemV1nYOo=Nk2af5r*+?%2 zh(FjavP>|>EYGx<>iHF$cj#k0Y2Tbzcps%y4otAluIGAKmC^E_Ja8QMDJ$#3T;MC| zD?l;waQe}HUrdjkA{4#7-}p454LP&gFXH zLXg~*C5}7c9>JHGv^1WhC)u8`u^Abv8A6|NJ%EQ6qEHDq*}Fp2^VlaM?M{t85jDON z@)@~1w*}{xR`27_@O=4WfBZKHR((>Heb5tAV+Cx(f$3Bby&p=h z55`SAnsUz~H*ZV|A$`~-GZ3H8|8yNZ>^-_ADfo`Z3#iArfh`54@wj&=hYx7I5qwkc z{<=kEfHK1#3$CXhSY;D@2 zyA~E)J2hgI6YJAcjsI+d_d%pFepyP;Be!jmnv19@;W1F*68dg^gl6YLmVM4dly)*w znFZc9aMzwY=4O0hJ#3SFL7|*X46a7e{`E0Zs z$f`XxVk6XI-9POOA-Ngb7it@x06$D~!Q9xEx;%>S9&mdp)e)21-E=;G-gHrQ1{`WN zFWwgY$yleSK80yOR+-T{a~?b&FrPL+vGQ%b%qnD=(|c z^XFIe5_tKh>=%0!C@1KBgf)S?rw#M;^mLbn7r>G}tj!^X&8{w05c0+|jPw@z8Ld0w znz8LO>t;9s`I_((6{15{gBDAUY@Zh#H}dJ_d5*Z*Hh=6GrOf%-d(WZd9U4dWmVlLk z6W$sia$Iga<(Y2+U&w9MFzN;Mec)5NDDj?q(jEYNFQOUaralLMlHFucoE z-rN=ff8Wo|8;8>iEP)~Hi_5#@C*7yXd+a;6yUtOr4?5~(W%1)l^zpjnyi{H)u9`O$ zE408Q#^iNcKjBT~B-#lLoziBN8kzH!E#4xL#e%FVohon1bS2363cUeeK>?#>l}}vn z)rXx-QXM7jb-C^s?kOAvV$uRLyBYU^JL?II6qFwE-a?IMqj!-kg1dtbe%l&x=_^iT zxwj)__x<+#CPVTkq$e1+>0{Dn_JdMluIL^K+THU`aE;KO+GfeRJVhVLol_uH@sI*s(ZZS(z@!Onjq}bof#iu%iYLm!*T;r z$VbqF?qA8S7MK;qs`Z&6!HD&BB*s9cuPq{6ZbZEfi5`_?IPPkCLA-xeGkK=CfNl;B zZ?1&`kQ8#ykK)Cr^Thi#ZMCB;G2f6je>iV`vbCUaUFnPnx-Ce0#bOZ3zGUtY#J;WJ zB(7Vfj5IDgv@<0aI4|sm1#J4z695Qox;SFHUDil4{l~n#_C$_1S-vSHDp8(njZO>c9BGukO#&wyxg3AkycK??JDSjdOZysQs4Ordj@); z6vwpz-{u!Xk4Nf<*EqB$dQv{FlY7su>A-j45WH82#UJ|ECAiTnw*j4JV^7n>%Nlbk zg6IMYpXs;`BtXtt}PhkLHbdgZ=7!uZJGg+;c1Riyk_B z6ZKxJ=Bw^wueTv-F!@uym3^ZjV8Q^QkIC=1fbi7f{w=1cUvTvdB3YtBX_L3ck|hYQ zL^VI5OgPrI8m^~Puk$4LNW=KqYRWyw0`SQvsk=~m$vf}n1HLS@{pK$T4M zrq`ou3pl^55snO};9vJ_f5vJa^MCfS#vy!lZV33E0O*_I@iGc|h!&UB^P1rzO;4ylI z;G_}9w!bCaMvp7TowsaGm@cXDervUz*U1@#Ow6JcR2d?q#D3kbW{oHh?T#TYS^!Am zzTy1P+me;@astJ|j=4GD7c`&mIWh@(KQ#q~|D-|;ix-pp%l~MvNT@Dl@*|`@QID z!HyaN1)`AdqHNNTO&k#_Kd^o(mBxULWitf~UshY29P4P{z7&O0ilMuU8V16hG>egd zt_j(J4N!n!$!EiD5S(AVg{P9{37?;jSTBMzDM`6ITT4p|uA}-Z2899djVaV!>IG4*8zc;!{n@jTl-H<sekEaT?`W?$F8A}fKtxGKOE?>u>0ZmA&+7n{4Exr(6@Cj9G;(fEb32c?anI)}TFz^stX@_W!QA~7pRDW_kB5-@R z>7t40)%VJ2`W3c#+cm2bdHdVC07fUY&)biW6d!bPn)3bj#Y}Kdd%xe+V2{FhVQL!|pzkq#S5J$h5m>_MPJK#gy zZH0a6u$OH2C{R47C@i+lw1aQCC{E`#{jMRVm|-a~GxfUWo45;jRg19pP2GnfFL~Yq_`wD(b2El+hZhsn=F+7PCvBKZz^& zDsU7DlnKRbd9DRSIX;ST>fKKZU2y zCyX8gMckSGz&*tkgHRfAE4^(i|4H5%F2ye)nLCkk+PvlTlgDNNm6YUg4Ao&Y+UMfN zO4Sibrp$4|mly-dPurl2aIX;?5knEsCgU%A22P*uK|fS(kT z&`Qh+49~l$a6M=71FPu@A5!o{nmn9)GLzH#c} zOE@h1EDEfyGUM|sd9*qaKPB>EZ*tEi_M?<-hzCA^4Ys+cJ4VPRP2cHL&~cs9amV9* zw2ER5Y%gT=MNk1AMgk>H_d4zzuNto*Ex{R&%c#%h(udGs?CX!gU>xho6T{ZHK&|y+ zUha;2qkSA6RKb0O1wWr&rsiQ6S9pis<%hISEbp6VkAVx8^&tArSztq?0|63q?)*Ef z`rr3E!K{^z5#L?DH0)U}IoxI7Jf2+pJ|WxyDJ1+9C~kgUb+p7HY2@A-wBc zEj=pd<&GU+BK1A0rJd`v<&wsFxorbVYUm_$&Q2m2&jt3(TafRVu}eI?bkyWw?ho5#*3Fdf6M?z_!2TU^l1qWg=my`x+UVf>E(?M=_FrmH$ zHp47RPGcbBAvxXh@QbF3)_0Z?7fxc%Mnk%B-FXEA30gQRxz+)3L6%c+k%-EcZt>^q z`IV_TiHsR=_&m#wv==j;8&RjV^_|%Se zOHb>E__ju8YDANZrHq;F!~H{_6=^$h<6eQvNKe~}$05^|kpWA#Y@N9&*G8NjCtXbh zt5V6xp8?)l2p7Ze)NNR3Lya=l7pi#$1+@<#S>mxo&OHJ!wGt|5{j0iKwMxVKxsV|= zbwMXYBlG!8Xjze}WTE?pXjp&vtL+tsxIzbMlD+#R?y3P*({*A%KDu`A(w}_fiytgZ=1w9`>?_~m1lQBSXXX# zAfY&AZj}aSSzVCx=ybClPX{@hL4R2@bBaBbK1NAkaJRC=#NSE=-&*GA$#~Y&nXRn4 zvO30W^T($TP!Fte`E-N3h2E7VL%pIOz$h}Gj2$F@Sm?~z-vGaVQ7ikbT}Khx>=_+Y zR52ial)0AlPEt^7{*yJ{tg^W%e*SEY*})fJa`3(t(wsf56~~-S*`i)unM8+~96m*6 z?xyQ43@L6v*|%`VPY>M>bk@&b8BZ_Vz*j&Q{E$WD?eKZ z;|@GN;V9k#{<2Y$GlBPE&X$R#n&87FmihBxU7hdtw{m?IjUPgtRgJPL=3?MkT`J*K z1&<)B*at5G@)M~SMdcUlA3ob^LzWpqWFq5ykTX=XVgG38KeegXPJ;#hqtt&J!C)E( zm-<#ny#kZ~E(_(V8bwA|oJd>rxo-D>n@8b*eBYxdf5K^~a|WqvT@_b|W)dL~k1ZT8 zRBOsiJ_yM<+%ptviWCoZ`WTY5;A1{6gc$r*Qye&j7;PG=ZCsFryb1+^$Oz^FwHJXDWym{dxdvba z8jNC$A`vA@cFB$*g24<587__xNu0tBNsb~(7b4Qf61uCHbPrFKk5dz9NS*{x7q;A+ zj00}C5KK44%BHVtkYCDV}42)_5yKxB_L4Jr|(gf$CPE_}at zXDpQoy%;cIv;a3AZaWpog+DRs4eEq55n>tslZo&gEG?cJiO^oah;mFU3%U+vpVSu# zJ`dA@cuYbE!U+YN)Hif*S*NdPDyBJVGh{0M9)lrJzHgTa`P?W}(EmPN!2ps@=r}MW zoYoN4h?8!DAV{qm!hyY)y&A)To=&t4f?>oPA(cf3dK8s0C=%5VMsVoq-5l!*h;Ddl zuXJB@IFT^2GpQbE8A?^~_i&Bwj4`EVyg3p*@Kk^vd@6~Z2p`ydH&5UAnP?w9LQ~Jf zSeQM(&D+1CV32H!-{d$LenRrxgzL-PknYRGT?5k~UW3yx_l0ljW)E-bZ3uVkqVWD9 z-;CsRYUIvoBhd!kNb&+xImjYt=FYg{-%MyHwi0lM-;C^u>IcS2{DNU8(MEI*?haxn z?2Te4?hRun>5X&lbBFuJ1+((88U3W^N)lH9>egUna#J$=D^Bs|VEEU~wK2nkpr7Gh z2GCo2&B*5tcT#)&?qI$VcVxZ3%|s4Fd}$uoIYxJEe8G1Jd{K9FPjr{ocaXjN29#SM zd=Ynid?_B#dIongcidZ%aT4CJ=eBp4#}eMSH-HW>FVtIBZ_Ia-ZII9#uzm9zQhoFJ zMCXVLsUGM^Ju2a0I32JGq#clxCP>}OXYhS)I7YN6>mdPS!tTg9l6+%lK6m6>&}T+_ zhpe2zok9A0kN{olQJ zcfaMsy1J^myH0n{e0}EpioBXkq22C9o9PAS4Z&f>Z^I4z3t|$H8@_M8UzI!UmU9RC zf4}}V{u{JHP9iq&l`h2q$%eSY+B{(+LiqMVkmy}o2J8xVehycJ5#!Nd1)(7b60&-- z`nQ6RS^6z>^<)?@0u;bqTUj85y9kFXvxspac=|2F>WLyy)dxYU0#$&&0Ea6&pvo}a z2T%faZFRpykQt}nf>uwW0lfhT(zt7@4e;stpFd=P!w`onDZt7o-6z4}O1W!GiU>gl zPxk?wVFLxg1>g@T1OqxI>9@;w(dj;$FA!~ab`DpDU0cC`wrRRg@_!X>NmozKUn1JN zAxMF)tpkvPZ<51RbHw-}&}Y`w69ceWM#4;7}0ifgs5N zBcSbe2oe)8Vps6>cevV#7&ich&AWOs4GiaPy3c!us|Q_MDF0ok0DOIgApclBc?9?Z z>=GTWN&q{c&y1@l$cXWCu)^Xn#9L_fMB^64!DH7KioE~EKrEgvuAH3T8mye?-SuzX zk=gT#q(CLrmws4L&^C&wn7hlcsL@TT*i?zh*Oj;xK~K4w(Ak_i1MJjYyN&3w&%|XM zK2MkqDqkFn^&X);lu*&5RMt3u_)R=k{O*aV;Cp7tJ9(7O-U;uR9t`Pv7+pAy6-kL+ z$=#gOdWAaRgBJD&DU(*-0OndMh!=3Wy%XQuNJ0BxQ(sj}T9>?NrJ+2o3#Xu64a2?|8IOlbe zf6*oF9uDd(g?ul_EKYH3G7TGv^8YP=jpxBkxPl(toa~l^X=!C?6@W|YR9uJ*fF^Pv zj4FW#(2=~ouR~^kM!luRs}1gx{u=qhl^`KDyWilc7{WqB_W`b1Y5Zfw*5Ms8n*Q^U z+^=*VAD(fE%3~O5#3b&0u1a$josn9rt(w=(%xP^ znuioa-Cg6j-=eVSpb7?|dAF+NqHH_1d9ME%D&Y@3Y7w0ihp5^y@$aZYyg;~+~`TDlIXdF-oI zt#bGj{;AdXZROFGZCj^$xYLrtdWM7>zK|~G3-{I~jmi((@sm(hH8obv_D0uO{{Sjt zR0>5Ap+)Mgc(bbH$I=l5kfrW0iys--yO;L2=zW#l^>2$FXtkwl}#2w!9~BaVNy((cjh6^*DtJ z(Q?p-j9ugb>1*fj2b%vxu@z z+Deh#y$10tP(Da};IqiP(FYwG2!$8Rokh6J6AA%|FHPgLvFX*dDJg7p^`0tI;j5$j zRlUqj71bj$cRAG56dvVzmGeXd99B^*tt_b&l9J5PL;Bpn;fY1?{@Inf%opKi%{Fn( z7xA_AwYa)`g#&Xtn{~3hW#5wH@QGF7zkVG$5`!*r(}fHSCAR83A+-I5jNj1m7hxOA zRUEIMKM_rE>66`q^)X#$h&Wy6Iwk275ZILX3=}#ZusLP8_q}DWKRsM0wkTJes^p^>*t!uoqzV z9m!vl&g|ZBL2dP_ora%WCO#K>2W>ArI(2#!Cn0Y{K7(0nN~J#SC#(Jxsk|iNQ(C?}zwS{f+9F|GUK3F3eqQ!a7wn!AXUb?s%eKe}!8wEw8l1Y;c;nu2>{>O-jA zpWAqxkFS0Hkz5k8;?$guv3%5^i~Ja%m!w z`y*MXQM>qOI%4c)0_B<_wR~#mY-n#m-_>?#u9-!Wd4;k;S);a9x?yu)m%A08Wut-` zQNlEJPT;yCF5z4_2LC68Ey~%1s6$T|m66(C5Y$hq-Qfc|CGlI9B*>I+DzG$5S7(Si z=Nq?Mru1DSr3AI_wvHayZuuv6_JaKq< zl~gaftfPvIc7nK;P{A$A49%CSW&YOkEA;fL1G;yMov11J`lY=*!Y;<=vTfq1-bpR{ty!9#y@aN_@Y95*wDU9~ys@@oN^W*e z2_(W(zWasd2iHW2)b-;H0YhoEupcwG1DoEw+piOAW)s9F3U+_Z1D_#KDd)~_?=6l{ zGVpJG>dkd!*@f|~g4-O6F+r<8w<;$Ghv-9J>7-BBt4}R&>$T*eFjRGQn0AUJ=Q3ED zIk_{kjY0|3v>KfG>qCX9d6VB*K0g03*3Lu<-3T6%vZbe$Fud+zw^(hop9Yf+ty}A7n^kMBAC3@L=2%9 zTNksZ)obZ<9Aeyhf_fmanQcoKrlg+fKF{p#`svfSchdZ5Sv`}9Cj2Q|kj0S?@@X_}#TGtBxDCldsVa@f_$IWHz)m$`;CuqVMtyEO2_k z4Kui-?#e3^SoBhOs{<}q9$q9DkF$PR9lBgKd3|Yp-CAS!)vd>E!fgz3&N9U3M?2A9 zm#v)=%sG)1pOXoLE37B})?T#Ie{C^kGw#qt`5;WBqs*1imTtTO&WmQ5`n8>^#Id4p zUE8tuOgC;$(K+ri&+omcl8G-lgT}<>^uelaUn=TPCPcdVfxf#3{JJvHdd0YM7MD() zqY7#&IaXL)OsO_8(#i0c8n5Z2h<%=JgLu~GyfwcVO4#Z%XKbupf-0-{>=k_(Jjk?e z6-i&v*^@$@j+wxec)g&Tyrtz5pA#sBCl9iPTCmS}>wP7~>mF4YM=NSEcTTIvI2E z(@WpGYpNRX{UDwTkkIZgEmP>)Sqga=c6F|^9@fp)Ez?t0tJVgRI(R43F|p#%(=3uK z*aY1+k0~Mb*v;0yEA=~%PsLr6@BGT8KCno?Xf;S`{FE$*|2zn$jBUgb5W+zp_s~7P zOgv7{e^1T%)t2oC=L+lS?|xy-Y^kw?@r!KVnfYedZ}UQDb;XW5zvwQ4x6X2Xuh*MQ zb>kXA0wDZX-rO3WTz{L0DpzM0);cJ7T&B~kO8Q=py)n5-$U-KU4cPg*ExxPoZF3ZY z&W|Ko>Rn3Txm@ifm7eS;ZO6QwgN_pT4m++aPg@uXuyuPq*_*>M{qvsMnb80NyZLk zdA3ZEmpnYYK}C{S%W%$o&UDoV;ppfA%hQ}JSqW2{gGs?!vg2Sso~UWN!19#@j6V0h z1tT>|ymUDTiK)fHKOpX2$#VXt!|W8+$?0n6obcQZrYExrWk6`Cv>MDrEueA|J#M;f zW_Z%sB;Q~x@w&Amj5nR=Rl*CE0lCs*zr?+~R+oy0&$`R3jZL3kv!JM*TnmS?jbEwq z7P03`A#!$K$S_os;-3m?aBuW&V1DPENv0)Mtxh&kLX`S}*YV^T1bAsjsS%yvL`!=9VjMD*48`kkQ@dog=*-Dm1_<&mETxz*Z>!45CYWarGjNqmIwSM>Q z5mNq<)AK6bZxh|3SY>wb?mz8@(8P4sk_B7y(N=DSN&WYe%`0Q)-I%=>Ku`q1tyeki+ z`-;xrJx&Te?kl=`EZEDICa}ri$WZJ#xIY-BxtsQq3!ePIE9W}-h0Y~rmbDj&0Hc1XgW<1X%uyZopxs9R3A-+gr zv(eDwgdh9W-l?sr<@cf8%HX$aSe0lo$cncg-TCxtm;fjfC+Y(@IYV+0gO6jqyE($! z6eW_WXNZ|Aa8W3)AtlAy>^ugO(6oSiVV5E9XEs=jm4q^E85BWhHsIskt(L*oiP0iD zL~NV{`*I=t?V@2?V|U-f*!emP-S=egc$(8fUIs4Z&MZ+HPr#i}FPFKf$$e3uv$7pH zy#G^6-RE4&#PZ~0-Hv|38d|M@29<`~uWffqx`aMZs4Nki#!hoVnXdhD=@?ot6-52Z zSDlqpgReH)o-<#nyIc+Gyw83dl+#;b5}$J%$etO-@T%n0Q51DA@RJg&~dtugCql8GKp*o1%J z5;}EDAWL9Ipk82AX2*gktDba>H5v*U7JeTZ9~0TUG|$!Ego@ChX4;iG(TIiATy|GN z->aQUFkJ++(Y8?*+c|LF5s^l(*4W3-)Be+EirFlU)31a|QVt(~h6vH@qvJYl(5~>J zx|?}``74a`#}IW+t#CnULzS&%Qoqp%-Wz}8Qk9~hb8fsOT}W^0D;`aO*{oG|52rGT zr$!$a-+A1^Bf*=p(HMeY^vEk=auS?^xS%;UdPX}^XM>pEPahJ3gOG_nws=WwMnhE&ybyK|A8c&p?Sx2 zP=B76_k?kmI~w1Pcyxux=7g39zIg1zo@oXa;QexHp=yHm)pqtCLat&nF#u}W1K2e0Od?f*JHMP!}ue4<>=Sbd-}f2+YI}gr=Ca`n7Tr&%4i5$Li-`ujKON<=&dedlo6k!(eb7s&L~(9__X#WTEY7YO=>+O?X{6# zin3jO=9C15jOEmNiCePeaRoC41I6fanY$Td9DzG2V|;=B3>|p3XpxAmtIq`|A^G~vV4=z<=Laq^ieviqjHip6#ORJzEH&y$O*hBWBKEh@b zD9BImhc;=S8n;qF(s5&Oj2hmMH(U|Xr2D^QWE%3)5jIttZOdw??(H*-0Ex!*OZSU9 zEss^D?3BH+wN7mqGaI*Jl*F3Sl)T)1mBPdib{{o~s#cFCW==^T>+?R`2wOW5HIo@% zDx4kDr9CmE>J4=;VBrixBXHH7opAO!y=t!oOAzCP=>1O9?)g|AkdU4oiOCI8M|~_e z&R! zS$pnaWJ~ogXKE@VY+uCZg&SK2QRr=>LtE5P(^Q_0!YCp(ni$iKCwO|sT>Uw^CL%!0LPb|cEM`T@1k+7)7+M`sG*lkA}?Q^{@YmL;tc zF!T)F)o4pTZ`C%ul@p^aB(|w8osQX=Op82dPS7vnWH3(a+S5N`+PT$LIEo8pqzMK*tudQvho+YGZ6+Y0NInwhfUv0V67h38h=!>&kI9q%1*On;IehU3N9YKO!0XL{BVZr9e2 z$Oh4)0THnf^d_;?Y)TW3jgTMXy0JedUOLi)Oh(Zu9S)zVm+3u5kWhGbI-VJ!R6rac zfemc&a#jsoVf~y*M66%~OPy8CRdwLp&aADX@TVWcx~N%xP?l@YZ>Ic>OrxH{lETlM zs@H@3Can(kzmCGENax@EuA(8l* ze4E&g<#uy4ahh?GcYNR%wd=MVI8MOOqaV-o141gv_hE5 z8d0HA1}+OXDDx0@*FANsZG8u`($cv+a!lb2!z;Rwp0F0#chyg`6M2etO|fhB+%x+F zxSO(tnF1CQ#vK@^O6&KuY}}BZ<V zJ-^mEWa;s^4+e|0zZ%%0(-VMM%?(@HERZY3!JTLcXc9ftKJ(|HKcZmmrlgRxh_x=i>%}xR0vaXKy zRl)>!KM|wxkIcX$g!p_I#3*E1%N4d6P45GYYSJZIIkmh1NDMn}aiiMV}_Zne~_Yd`%V;=Vo0jirqmrE_@EsywtO6 zQ6|IE;M@>rdzlV_Mm)y*43e*U+imVP6{MXE?LxkiLIh~MQFfUp+8o#j$dmt0HJd<% zkmuoZj<&ZFE?2gsOf@&t($G>&>Cl`~6t}=dLq0%0_!j_H~#go zVM>?SF8VIpUd)Slrpsp4vs9o_pq%u4qr(PO02x%iJjolVgX>G<+h(x7VFNX-XBj4P z`F^0XnBOSX^4<51uvOF+)uGJcMpabRo7|+X3NHTLMYS{NU6BrY8F8WBM7bx=qmQ+c=%&-&1n7d2`twtU%xpNpi`LICPPJ1&1N@D_Ef}FWemH-) ze-=*hY#iUpMwx-uQ7VpL9yL^6oV{vTFrk;ptz#~`N+)QYge zmAP+u;CcLg)MKLt$UtBgC1nDRgWGt@CBmRMaez|R{_cmr&Z`K{p)w=C?mVIgbQm%il zcjLBl$?CM8Er+y*3nvr9iL_Md`83lI%V8j z*V#vPCglM7;rDO0Bi#x%=iYe-u!LRrAWEhl*tl`na{Ah9-*b~^D3#~J&~RBms5Du{ z6lZ|fXL^aLUKdjInGr`m!r*s2rkguwqsh%FPiB&3OLjdkm(_ZPYi@h{t&81;qHg4_ zyM24}wQ$y@Zt-|NuQW>cx|>bYLDEu#3M%;A zhM*YLwpU#*7WIUk-7L+mD%`c$$Z>M`ifDB|v@II0vlb1xjV2|TRY6?pP&{i(jH8w- z(*?$6~t{8@g^h9oQgvQxOOp=jy!U6 zM-9EA@W+aaP(ExE+*7lr8VxvWOlXhs}@ zYcMf&FE&O9W4>$|hBy^;)SMdc`IB$o8C{}e^Se$rYMyeolSI<~!g?I`dWaRF6fW zF&6LWdioH%>>|S<_9_0t{+CCe>9-HM^)l2P@oOQy&*|K!+(+Cyd-?31<1J6kp5~cj z;7~~a7;RG5AoWUp_TnLvY&CGi;t~*ow~gvRp?l;xN!%e(j0izD*o@<(6qi<9GYQB= z%tx>0#=e#{h1ZG8C?2bU>dQxY^WYL`(d zF>a;{@nBrVuRPer&i!V}-eM5qZI^Y6iAI%wWW>JGYZvwHicPA*I(95{s~XNkQyK0v zYA!3P_DtXoAMSe|$U@*jPNHB0ONp$`va5s~9(O7#?VseKXzYZuCGvIDy{dBaqmy#^ zb(wA-c3~=kvKZpSap7YB+rOpw)$LUF!0K6-;$0|zT~U|qlE26T>xEM(;!du$>;(%c z>&pqY>-{&jD_eB#wnizWf!%@E$YJ|Q^~3PIh(=|xx~+Pmx)km}?!>kd@9A5S3xAGU z(1&J_jqr4tRxYvzwpFh1(oCZVr}jwu(-aK9I5MvCP))}!apxyLw$_(^W>%X2jScplP8@jZ#jSD&uDPItpT zT53I;eyII<`RFK5vSd6F%4wNDM#QN2F^R^1!={cB7ewRY@kKtVzI|qeA~R=d z4EG!9s7!i7ud}F%V?l;g23-b6>gR5ARyV;xHDMz9-ndp1$_OTVtc2JqMB^sKlgar6 zf!666M5=2|7x2{b*^fTlLfq=H1%0si<;l1DuXrMSKOeHMLry%u%Lidy4;;mrslU!`7vb{CjE|?N$0q055Yssrm$MhcgC!0zh10&UVmQ8`;+j7aKIm55_ z$H&Z~avZw(agV8!1Zm#h$^Y6l-$eBT!9@v^N*Ug`63td+rfickabYOR5?B?B!sR8x zoK%#ZX%kuUO%rESlzRh)QW^7~FIpq)q@>6eZDeDehy(7dS>v#YoR_mexJ)w@UR7@l zifVpXpY49cbZas^(|Pm?Q6Ntvz~LOLr<`SARbrJILq>^D^C9k-ha?R|!SzGsSB>=a z!kCgKsbgT`{oX7!GiHMUiK;$8ZKtZhc>FI#P zZuhS4MJya3ZdNcmgbR9)LV??;lXHVu*}+^Ou6tslq5c0(8^_Jf!3tuBf&ohz0Jvgd zEMjYB4JT*+S3gAmWPY)5aYIRjz0lD|3zH+2l(k;_g@zO6996KKUp^bi_g#rey{NVio<`h;sNlkd)<2^ z3zWIfa5$iUVG`=a%G>#~V+0*s;tRS4hgGP!3QND%p?Q8iqUrkw zbwN0%DBjqkJD+x2K8sj#4})t^SJd`KBWPCaWSMp*Cs>4d-9D35f%4?tlq59+JquE8 zR3|C}U-|tU{0zcvnk=sMP&|u**R%fXMs@)ynfS>*9$C|C!qNa~fEV|3Aw?!WPKmct3mpGwE5R|Ggua7y|1OSRw$*isMgi z6mZpHc51d3_o*MrIsSx3{m)u`=Lk1N1Ew1k?OzbQ``_f;T)^FCa#QmE$nFtcf7aOk zTLytZfaUvF89NAA27i@tK*8L=xc{yP1qf7smGN-11D*Y=3| z-($rAfkOXl9L|o0z$=2|eI8a-3lCtn0k28-05NjlL4rTQaer>ee-hPzDd^;E=;-|C R1mu8nfxu`qG!lxE{|oGNHG%*D literal 0 HcmV?d00001 diff --git a/src/paperless_mail/tests/test_parsers.py b/src/paperless_mail/tests/test_parsers.py index 2bc0fbdad..3da54e364 100644 --- a/src/paperless_mail/tests/test_parsers.py +++ b/src/paperless_mail/tests/test_parsers.py @@ -6,7 +6,6 @@ import pytest from django.test import TestCase from documents.parsers import ParseError from paperless_mail.parsers import MailDocumentParser -from pdfminer.high_level import extract_text class TestParser(TestCase): @@ -217,13 +216,16 @@ class TestParser(TestCase): "message/rfc822", ) + @mock.patch("paperless_mail.parsers.MailDocumentParser.tika_parse") @mock.patch("paperless_mail.parsers.MailDocumentParser.generate_pdf") @mock.patch("documents.loggers.LoggingMixin.log") # Disable log output - def test_parse_html_eml(self, m, n): + def test_parse_html_eml(self, m, n, mock_tika_parse: mock.MagicMock): # Validate parsing returns the expected results + text_expected = "Some Text\nand an embedded image.\n\nSubject: HTML Message\n\nFrom: Name \n\nTo: someone@example.de\n\nAttachments: IntM6gnXFm00FEV5.png (6.89 KiB), 600+kbfile.txt (0.59 MiB)\n\nHTML content: tika return" + mock_tika_parse.return_value = "tika return" + self.parser.parse(os.path.join(self.SAMPLE_FILES, "html.eml"), "message/rfc822") - text_expected = "Some Text\nand an embedded image.\n\nSubject: HTML Message\n\nFrom: Name \n\nTo: someone@example.de\n\nAttachments: IntM6gnXFm00FEV5.png (6.89 KiB), 600+kbfile.txt (0.59 MiB)\n\nHTML content: Some Text\nand an embedded image.\nParagraph unchanged." self.assertEqual(text_expected, self.parser.text) self.assertEqual( datetime.datetime( @@ -265,27 +267,30 @@ class TestParser(TestCase): # Just check if file exists, the unittest for generate_pdf() goes deeper. self.assertTrue(os.path.isfile(self.parser.archive_path)) + @mock.patch("paperless_mail.parsers.parser.from_buffer") @mock.patch("documents.loggers.LoggingMixin.log") # Disable log output - def test_tika_parse(self, m): + def test_tika_parse(self, m, mock_from_buffer: mock.MagicMock): html = '

Some Text

' expected_text = "Some Text" - - tika_server_original = self.parser.tika_server - - # Check if exception is raised when Tika cannot be reached. - with pytest.raises(ParseError): - self.parser.tika_server = "" - self.parser.tika_parse(html) + mock_from_buffer.return_value = {"content": expected_text} # Check unsuccessful parsing - self.parser.tika_server = tika_server_original - + mock_from_buffer.return_value = {"content": None} parsed = self.parser.tika_parse(None) self.assertEqual("", parsed) # Check successful parsing + mock_from_buffer.return_value = {"content": expected_text} parsed = self.parser.tika_parse(html) self.assertEqual(expected_text, parsed.strip()) + mock_from_buffer.assert_called_with(html, self.parser.tika_server) + + # Check ParseError + def my_side_effect(): + raise Exception("Test") + + mock_from_buffer.side_effect = my_side_effect + self.assertRaises(ParseError, self.parser.tika_parse, html) @mock.patch("paperless_mail.parsers.MailDocumentParser.generate_pdf_from_mail") @mock.patch("paperless_mail.parsers.MailDocumentParser.generate_pdf_from_html") @@ -373,25 +378,31 @@ class TestParser(TestCase): retval = self.parser.generate_pdf_from_mail(mail) self.assertEqual(b"Content", retval) - mock_generate_pdf_from_mail.assert_called_once_with( - self.parser.get_parsed(None), - ) - mock_generate_pdf_from_html.assert_called_once_with( - self.parser.get_parsed(None).html, - self.parser.get_parsed(None).attachments, - ) + mock_mail_to_html.assert_called_once_with(mail) self.assertEqual( - self.parser.gotenberg_server + "/forms/pdfengines/merge", + self.parser.gotenberg_server + "/forms/chromium/convert/html", mock_post.call_args.args[0], ) self.assertEqual({}, mock_post.call_args.kwargs["headers"]) self.assertEqual( - b"Mail Return", - mock_post.call_args.kwargs["files"]["1_mail.pdf"][1].read(), + { + "marginTop": "0.1", + "marginBottom": "0.1", + "marginLeft": "0.1", + "marginRight": "0.1", + "paperWidth": "8.27", + "paperHeight": "11.7", + "scale": "1.0", + }, + mock_post.call_args.kwargs["data"], ) self.assertEqual( - b"HTML Return", - mock_post.call_args.kwargs["files"]["2_html.pdf"][1].read(), + "Testresponse", + mock_post.call_args.kwargs["files"]["html"][1], + ) + self.assertEqual( + "output.css", + mock_post.call_args.kwargs["files"]["css"][0], ) mock_response.raise_for_status.assert_called_once() diff --git a/src/paperless_mail/tests/test_parsers_live.py b/src/paperless_mail/tests/test_parsers_live.py index a0fa1f54d..653388300 100644 --- a/src/paperless_mail/tests/test_parsers_live.py +++ b/src/paperless_mail/tests/test_parsers_live.py @@ -59,6 +59,10 @@ class TestParserLive(TestCase): f"Created Thumbnail {thumb} differs from expected file {expected}", ) + @pytest.mark.skipif( + "TIKA_LIVE" not in os.environ, + reason="No tika server", + ) @mock.patch("documents.loggers.LoggingMixin.log") # Disable log output def test_tika_parse(self, m): html = '

Some Text

' @@ -108,6 +112,28 @@ class TestParserLive(TestCase): ) self.assertEqual(expected, extracted) + @pytest.mark.skipif( + "GOTENBERG_LIVE" not in os.environ, + reason="No gotenberg server", + ) + @mock.patch("documents.loggers.LoggingMixin.log") # Disable log output + def test_generate_pdf_from_mail_no_convert(self, m): + mail = self.parser.get_parsed(os.path.join(self.SAMPLE_FILES, "html.eml")) + + pdf_path = os.path.join(self.parser.tempdir, "html.eml.pdf") + + with open(pdf_path, "wb") as file: + file.write(self.parser.generate_pdf_from_mail(mail)) + file.close() + + extracted = extract_text(pdf_path) + expected = extract_text(os.path.join(self.SAMPLE_FILES, "html.eml.pdf")) + self.assertEqual(expected, extracted) + + @pytest.mark.skipif( + "GOTENBERG_LIVE" not in os.environ, + reason="No gotenberg server", + ) # Only run if convert is available @pytest.mark.skipif( "PAPERLESS_TEST_SKIP_CONVERT" in os.environ, @@ -115,10 +141,9 @@ class TestParserLive(TestCase): ) @mock.patch("documents.loggers.LoggingMixin.log") # Disable log output def test_generate_pdf_from_mail(self, m): - # TODO mail = self.parser.get_parsed(os.path.join(self.SAMPLE_FILES, "html.eml")) - pdf_path = os.path.join(self.parser.tempdir, "test_generate_pdf_from_mail.pdf") + pdf_path = os.path.join(self.parser.tempdir, "html.eml.pdf") with open(pdf_path, "wb") as file: file.write(self.parser.generate_pdf_from_mail(mail)) @@ -126,7 +151,7 @@ class TestParserLive(TestCase): converted = os.path.join( self.parser.tempdir, - "test_generate_pdf_from_mail.webp", + "html.eml.pdf.webp", ) run_convert( density=300, @@ -143,8 +168,8 @@ class TestParserLive(TestCase): thumb_hash = self.hashfile(converted) # The created pdf is not reproducible. But the converted image should always look the same. - expected_hash = ( - "8734a3f0a567979343824e468cd737bf29c02086bbfd8773e94feb986968ad32" + expected_hash = self.hashfile( + os.path.join(self.SAMPLE_FILES, "html.eml.pdf.webp"), ) self.assertEqual( thumb_hash, @@ -174,14 +199,14 @@ class TestParserLive(TestCase): ] result = self.parser.generate_pdf_from_html(html, attachments) - pdf_path = os.path.join(self.parser.tempdir, "test_generate_pdf_from_html.pdf") + pdf_path = os.path.join(self.parser.tempdir, "sample.html.pdf") with open(pdf_path, "wb") as file: file.write(result) file.close() extracted = extract_text(pdf_path) - expected = "Some Text\n\n This image should not be shown.\n\nand an embedded image.\n\nParagraph unchanged.\n\n\x0c" + expected = extract_text(os.path.join(self.SAMPLE_FILES, "sample.html.pdf")) self.assertEqual(expected, extracted) @pytest.mark.skipif(