From 1c85bb4ba3f16ea229e5b9d4127893b6b916985a Mon Sep 17 00:00:00 2001 From: Adrien Barbaresi Date: Wed, 8 Jan 2025 09:36:09 +0100 Subject: [PATCH] Add file on Trafilatura integration (#294) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * add file on Trafilatura integration * review markdown * Update integrations/trafilatura.md Co-authored-by: Stefano Fiorucci * Update integrations/trafilatura.md Co-authored-by: Bilge Yücel * Update integrations/trafilatura.md Co-authored-by: Bilge Yücel * Update integrations/trafilatura.md Co-authored-by: Bilge Yücel * Update integrations/trafilatura.md Co-authored-by: Bilge Yücel * add Trafilatura logo --------- Co-authored-by: Stefano Fiorucci Co-authored-by: Bilge Yücel --- integrations/trafilatura.md | 70 ++++++++++++++++++++++++++++++++++++ logos/trafilatura.png | Bin 0 -> 16514 bytes 2 files changed, 70 insertions(+) create mode 100644 integrations/trafilatura.md create mode 100644 logos/trafilatura.png diff --git a/integrations/trafilatura.md b/integrations/trafilatura.md new file mode 100644 index 0000000..c7bd358 --- /dev/null +++ b/integrations/trafilatura.md @@ -0,0 +1,70 @@ +--- +layout: integration +name: Trafilatura +description: Efficiently gather text and metadata on the Web for LLM and RAG +authors: + - name: Adrien Barbaresi + socials: + github: adbar + twitter: adbarbaresi + linkedin: https://www.linkedin.com/in/adrienbarbaresi +pypi: https://pypi.org/project/trafilatura/ +repo: https://github.com/adbar/trafilatura +report_issue: https://github.com/adbar/trafilatura/issues +logo: /logos/trafilatura.png +type: Data Ingestion +version: Haystack 2.0 +--- + + +### Table of Contents + +- [Overview](#overview) +- [Installation](#installation) +- [Usage](#usage) +- [Settings](#settings) + + +## Overview + +Trafilatura is a cutting-edge Python package and command-line tool designed to gather text on the Web and simplify the process of turning raw HTML into structured, meaningful data. Its extraction component is seamlessly integrated into Haystack. + +Going from HTML bulk to essential parts can alleviate many problems related to text quality by focusing on the actual content and avoiding the noise, which is beneficial for LLM applications. + + +## Installation + +```bash +pip install haystack-ai trafilatura +``` + + +## Usage + +Trafilatura powers the [`HTMLToDocument`](https://docs.haystack.deepset.ai/docs/htmltodocument) component in Haystack's converters. Here is how to use it: + +```python +from haystack.components.converters import HTMLToDocument + +converter = HTMLToDocument() +results = converter.run(sources=["path/to/sample.html"]) +documents = results["documents"] +print(documents[0].content) +# 'This is a text from the HTML file.' +``` + + +### Settings + +The `__init__` and `run` methods take an optional `extraction_kwargs` parameter which is then passed to Trafilatura. It has to be a dictionary of arguments known to the package, here are useful ideas in this context: + +- Choice of HTML elements + - `include_comments=True` (comment sections at the bottom of articles) + - `include_images=True` + - `include_tables=True` (active by default) + - `prune_xpath=["//p[@class='discarded']"]` (pruning the tree before extraction) +- Optimization for precision or recall + - `favor_precision=True` (if your results contain too much noise) + - `favor_recall=True` (if parts of your documents are missing) + +For more information see the [Python usage](https://trafilatura.readthedocs.io/en/latest/usage-python.html) and [function description](https://trafilatura.readthedocs.io/en/latest/corefunctions.html#extract) parts of the official documentation. diff --git a/logos/trafilatura.png b/logos/trafilatura.png new file mode 100644 index 0000000000000000000000000000000000000000..77c19b85f0aaebcf52ba31bb4640e28a6fcc9e3f GIT binary patch literal 16514 zcmYLQ2|SeB`=5oGl;swMv6Zb9A=_lFWSLO1FEz%JeVG>fHj|=Dk*N?OWf#UaTv^_( ztFlXD$vP@35s@Y9|GeDa{ol{MpYD4)=Q+>weU|f_=REVL>3IXL-MHNd1cHlTc-9Po zKn;TbQg&g$h)INl1p9kNWSLh>fwC_fjE*Fo~UKmWXgB@f_;v-#gnQmDRVsjrq`=inazb!aTO)pB{vVQpg(^7oc&c? zYBZV8?w_FXpW2--zs!w>QyPh`g&!1=`Ked3_gy{o;PU>PrE`wE>hEMZIOS>|jwJ;3 z^=tW?kLU#_1&(F*KL2ctSz-HVn=5qSC+25+ZqD`5!`v0mvj52BO%S?q`lCTf+wsP$ z$MMr&9y>}rNj=QXyXUrQ(oo8Nu17(s_-FaJi8ZC;$I`3uMH5H8MjtdPJbZ7J^w)VW zHV#=Q4so`(`Oj{hkUi_sZ>X5~Y@sG5a^Pp&XIhITO5zRbsOh1T5py~#TJ}mhD&M4U ze?0Xi&L{FN>ec0^7b|9ForiqW5mYzUIj`Tx{0}Y>LW*KdGlwP2U&;gGsvnren>-TMy;)x$KhJT=Yr*^+Os=^r^Z z7uibgP|WyB?qKw?zwF;7b?WWpuui9G$B*{u&d&75zaugZchx8C{t$LpW1+1@21yV} zo@fpt*|NAG8uYPhEAk>~FUgT~nzT8%r8E0If~mxtf^5fRponZ4#T!AQLA6VtY*~*7 z6ApWAeK0Rw{i&=V5_GhA?qO-VBq3^#^!-8A+{36MgdfHVW5qVQOBU;LdBy0c=kw6j z@2^*kqSkZDHjRCtuKW$ZOf)fn;|sbJw;>;lNl|&*^*bzfJUCLVfM--*8u2N0{mmq1 z@_To(CU=VIc=iHn;l{Y%?O@7Jt@)u4d}CgbxB8qKD}%3zqHFIthW)Gwr9$>pe~JpF z>PW&_uNzvIg=UM_XERDS1lo-v?Yr+}ZT|7DXcGH6{_n=X^<6RV!>Swy@32!8{WsN| zy&C(h)?Z5cCu|{-(V0ey!!zAUb~-PT*;Pw62A-;xd|}*`B!oL7R>a9?VjXjJ?QxrQ zB5I&^$=Qg+USvp2{rVO@kjKb126&Eno|GhWS^sD_YbkJD3g`r**&_i zYVpr;ljK=XpdPD4Ndi|2SDi}poLhpsQK`s45gLn_MJAQqktBHbT!Jn_d`Mv7-_M8uNT$ za71CqRgye=I`?$K7m^VzdudILe$$|`*9aXdOU9GMM`1?%JFU$*D?|pT9wpWvpEDte zc!3SLS2gCYAYvG`;iN93;H*!HkN~_dcPeuFfm6_EREHragdAkZLCP7H#PQT0SoFsC1rbZ!QAO0?AHxj~##3zs1k( z z@v-c>HQURg@2vJ4ES-TaQ12BVBG8V0KGQn1!iBHwEtXhIhA@5iB?4G%gdSpflEPu!cK?=BIN7Z5{6l1SR&n87 z?+g4usg~E3=$B(1SIL`>Vm8muCrood2_he8k_Apb*aAdFO-^~&BKiCP>hCl#u<(KW_0&MU5$J=!vhVGN!uA2SY4OV@h= z1K@1DnbfQy@ zYh}dEGF2-fVV-Hv=%i528lE6r5Yh$_gr=huIyGsMT%L#&np2IZa^$|QcYXP-^G-%A zYe>MW(#6I>|98!*kU8gjjEA-w9YbfQ3(+|?XC6rs2^AtI>JrQ9HSxqDUW2OuJLd;8sU4Bds_ zS0mYMTFFugMw4-K+KtOngz%|<_?l#9R$JETz3yBy2?&Ssf9RJ{!ZfF#Ykb7CV#*#$ zPP;5&N+Q!lG3>zlkB>Yk3%NM2~%h{w3v7E z*dH2|y)B7a2UfJ`87ir&LU@H{^64~U5eH-mS>+~6F4FhN%qpDd{*gJLu{Xar{;CVl z&|UyCLMB=e>V(8hQEyp;GAOnG?SmT*Qd(!1v~4K!4iFaKfcafCpdO|FKPG0?{S*s;!PpSi2BKLkwMQK zG_|9>yAp-RH_wF~ZoI?S)C>J?5T<2|&S6_6J}9Yg+{Ra`IN1_qQDLw5HC^+F9S_|9 z+wMFfV?ioW(!WfDDgty=G}jEAV|O0nv0$ndBF}0fj-aT?dDh_o!7Mp-xAA#J-ejbw$(Kp2iFpMMwivE$rc+=0nzrr+CSJQJ$GqJU+l4R3xbX z`CV*ec*5^}z(d>-18U84?|oOCL6RIpG`Z8-rpP zINC(>I>cvG*&bp`yj%LUpYd2e0nF&cY7cibfA;?F7^ohoJLyDTf8 z1eE&l)9(+o?9Sg@6Xs%WOMlD1&MMZQ_PcpeksHrA6Zte%4BwNiM`IpRL%+-uaQ)RP z|2C^Q|k4*<+1syu=J_1F<=>KKiC)-6g7K|8jr*Bir}gN1H9ypZe`P+OxRu(I+BjzLdO^64aggK9@`eywv3G*1IcY24HI zoob5uBeS@DxUPiq-uN6k|3X$iB4wi4>A7;b8p=1P_CoGM$;A>u=)6p{&Qg=S>Pm>$ zeMQEu35V}@%kSiGg!YM4>{pJhE55krczg2wi!J)+s+L zHOv);tO3s3u0U*4Ly6^Yq>QD5vseHz`q-(aJTu}QU_rIB0TuRk-=lfXiQryqv>GbX zNRhLByedu1hIc@CVDG@dtUtjF+ksiSpm>St*GSe0QyJ*qjNBt4|0@=zP|dCe>SFU5}bUP&8ROwK?0Qc+a`9rVq-Nf(9q+2-|{jz{c&05 ztHCZBl`1J*#s>*Beb$0ZH1C?$O&=aICpM|MAV= zd_>NI{sJwgOR5w&^&gb5Eg34-xyRBBDi=eF(oWGNRlea!7YrD>_S`-on^9Loz04MH zP5nEoIIGwR1xB9QQ$@@;m5f2&6Mk%a0qZP=QtX62jGl7bHR^v> zzHQ#=IO`-S9UOx_2SpL8CW^yuv01@q?Ms(11`Hs_-^!$8@O~ZkeQY2<`{P2N{?eEU zAit2LOqC?0MuFI3#u@k+urU7E9kB3AU5PSc##x;LkF>!X60beYOzTb+P`F8K+ws z{GHkle^*_|6X;Zq(zP#E%LHIf*@LVmY?u?qM6#+=jVjU3>hAk0=m*$Y?bL&^WTOA( zQKL+x9$pZP|UDN4Ka}{G*#j3%b z@OE|ofeN@c^BU&x&U8xg1uF)>3j*aaD{@f}z+nJ`z80)_OOjCk4M{SK9X|wvE_mVb zDOz^Mf&g7Fc0A%g3=)qdxQuxL8tQF(B!CFTU5nsA*~YOmbQs?Cmf*wXmWF1)xMh^} zAtM@d!xi;1M<4=TR44%xEm1{)Y-8mS0J1R2003!boiL3y@QD=ovdRe(YNxT+sJZthBUFVa|l z4^z2aVb1vmR=|&+JV0WL;4f$~82^z8BK+x*jG8r4Gd)d&H^|w$`9_YVoGJx(#4zXv>8^^! zp+JNVdj!|;2^>EgSbdO=qpQD+TxB;6MX_Cc;iisW@Wj&ava_Fi>l{q2hCNDW-G;Doz=0UcfT&MMr5MXLf6+k{7FJ24bpW|oqW9{2{8Z;*uUVZrCA$N zEQzGl9#-5LCw zH#S38M4%XIAnKE>_`TXRDhSK(L7+~W3ODRxU+0}AKb@@8Y5t?bv|x53hoVc>rAUE^ zu^QB3GtL&ijgA2o|kzL;~4q57WHg?}k67QZ*pNRPlNQT}Ni z#naYd4*W9F4!HshlY2I<{7o!q)YJ6yYtakqJt zM(+=cd3}~7wwetxCMEMV%^DwyVc7l7(%7@|LQ44-*0}q@*xH3$f%5@mqxNTEQ!^^L zpxp3$d+EA<+<4i|tI`3ahM3TD{~4r%(Pgs8XqMGwJ4^Mawjk zHR=22^jPdg`ET~a=|mj7jsB3@Tt4G7D}MYPUz34M0y$D>wyAj3-y(MWk`ka25LVO4 zrhSE@<5dvvuZhsV8_hXqbHWBc?>}%c;Wvn?{OuqL4t~?DL;txsbVmB?_gCS8v5sma zXBH+dADjNz3E#^J?&Kq4`4yB;a#{VsQ5+AQY80F4GW28QYCUF7=hF4_pybeV1?q6^ zE|T>^)q9d12*K(tuOQt67x{mS&b{K(b=(a=E8uyD!pF{gdULeCG&L-Z$V_?Uv~pmA z{ef6sn0J-M6&)1!4HqxTn;guew!|>8fuVh<4DkmDFxMeVf_zU=M*)4cURH)bv-S> zl?_djH~LktmMic>DJuH6_6gCIBNK~a+H8d96WXK)d{L2f^EO~=&nL(%g3_=0CnitF z0Rd2xQJ%P6<$$cin-ni0=v5LRTk{{newKjVC4CJIO+6(Sr1Ln*X=T^k0ai><%)YAE z${fi6d44S&5Z<551T-mSCf(!RjrGuIw(men6telV;F{u7e6=mc1u)|hAKJ&aq zVi2cNmFFSCsp)*LAtK=<#Oe7nw9P~&+Jrhn4V8T+-SJeDHUm5C`u z@ObDw{ZAVc*GOEfD9HK1MKlosF3;yDT`S7W&42sCiNU`vm_ zkk`v{MTO=Hl&IVuY`$LEdjQ;w*@xL>o$fW<(48q=%?YUMPe%#g!an#FizIFFH8sQT zQNN0;;h#er{VE0_p+D`kPe`L})cnnsmcFl{?Dz8o8m{cFN{bw{9?BLtj_j;HJEs1D z&GXY*$7Px58EP?AL$;@%JJ6*qt2pAPW2?bP;g&bJxp2FhreT*=pjwEJHFn^e#^G#% z1}BVvET|FAl-Jqt*X$K=yVr1Cjcyg|m?XobE@%9N_CjSVhRYFTkku{Qk^ZZ z?iJ?08veBddfdRXm_Cb`E!I*t0m%93d_I8O-1Wj8Y^|d3f#;0n=X!T%)^$)d`x>Hy zSTccKz>-xUF_psC#0!Z+3w>WThERVAS|lz%8$${qLy=o_!~WWRcqp;>=+8S0_2X@E zQIrMQcYzt~eIPG)-fj7H!(DhnVnhci>zP>cQ;771FX{s3k*mAmGyvUDNM0|k|7)MDWeh2j@PE?S1Mt<(#ycBVr89Zw5Eu_Dn4kF(jo zqCN4R-BK$MF?6!r(h|7j6_;Sey*2x7T5%i8SUItyS+R{e#n>>>0VeLz&qydqCfWnm zujh2r^bE9xTCjUw%8Ag(7AR4@eRNZ_>ez%F(z;CFz=WM)sHo|_+ww6`j+q%}Bw{os z(qzc*H6j_51CnGcelF)9qo^E_PYG)m7x{^x-;=N(fg}bCvt{MA+0#jXHmoB?@Xh2# z87BLzIViqOEE$sO^ah=9bMbsl79hgPac!Yx5jt$69`_oQs#FFno?VaIN(*|tYNMdU)6>*8@1#BFL6nl zGCMT=&t3*O+97hf)N0Q)h|8Af?Xuhd+gkr~ndqh?v#-K$>*40nya1l6<)$emC|UMh z@(EVIEitIgz<(ihKuaci6Ca7!;+kd~_PN(kb%<;a z$_)y)Ls(ifAd^yrjy?>uN%h&^k|pOqALW6Y_$IMcu0LkCuST^kjwkJm)_g-iWb8PC zq{Rw}GvxLucp!F;2lasR=Eb|}*GPxX`HyS1#1+#&7F$DyW>tDk7w#++mndcjf4((5{lfOhK_w8U*RQId&|g*NgaapHLMYW`4*_YZ*GpB9=!$jm(F;<4$+g8Tnj9hk zg2jSEI;Hn!kY2y)_fv(+>+r|h_KYn^5&*~S&TB_mh&K$%U)1;1qKZ139$}g!$Q9?y z!uOK@FtyQr7?}I}dJ_N3lruEgFti!+2=43NMbhZwUGpEkKpjXeMiSt2&)Ylm(?DO* zt-;wCdl3Fc{v(qv_3Nk?BC>t{BRcoKBtSgz-b@#sv8cX)asVXCW#td3Y?I)M^v?V? z&?j8STcgz$chBUItfR;|&2AoK#s4@qrwii#gTTyeB%Zap+~N!yh|AEE12zp zGc#1xS&VO0bSgP4i65JC`d`lEwYp!2dKU>Qw#AwJCtZw;-`etB73R~cP(s~ICTu!D z@qvgn6dEvff>kIhKdJUVnM>K?t8b;!rO6F};)yWotIlh(ER<0`$1Iz+@AmG6@>t&! zQK{r>N&FhAJ3HTZ3PKKu1ii(1e$?8$DJyTK{6BhP1@~t7fqluL*70p|KmU_m4sryt z_n{j8rK!W{@-rjj5eQKexEJ6$zJP!QUZ<_JZPejn?7qrTsdJBH<@*$(U&|zwAaqR!9KL1In7JCpA(A*92@8|=#mNSGr<;bP-^(nA5)oo#b zI;=lkJg4$y7&y1m&QKs~&P^%*G%r>D@ea=*Z{nH8){y`wV_>Dq|5gT~GAnPTlFujc z$L(liYE5{~9$xCz=mv*8f-XU^JvZ#^ni5bq{OVG*Eph>HPb~R`6!R$}OrkCB-ypQw zi78Qx!c~fspY69v{m+t*!tV4L)WK0yAi zrctVF-2V!7QRB8GHlt$4`HgmLbShz{03sxrMjc=W_1f(yHn{+0wm-#~faBMB2VW7H zXxoQ*_uGN%{c%LBOS|uXQD%!e|Ix5uuNT5#hZ=5ygLM%|dKiS(yZ^Gw*Yp5-Bb$Zk z;0b%T%`7uz7TKs2h5J<^D=+=8{_{ud*P4PHvvJG4!1(`zvKl>Behc?YnuXtC#95m| z(+8vSbpW>L9lR5rg81-F`#ihrAnP5C-usQ3qk!7S3^+|jcHjY(nv<-vM){9*(m{&! z>R$^9q&B9W=CTvT|2tq1>v(`n17`Fb0Ne8Kq#P)-<0+;C9oGCmQjV(RLNKYtmN@Ob z9Cf=`sd(~FH-eK zXGV?K<5NvHYI({MVFIVK1vXLZ9s6+6Rn+hu-lAUiu;FqaRMZLVFp^r4nR2SBav!}^ z5H>ZB&Ile&XAIW^gDNTb^E`MMp?;Uka~VCLALD%=JPN_u3g zf<^>OrBktv2b;-~3W7lc;;`7+i6NOBM5UTiOdqC%9u1~4bq**{^`SG|>-AD4 zUz0DC1yvkK1TchT2Hxp*Pub<|9DS1ehabWZ?OUwwr$`+n zjexLlqKS@K=Bk=~ANS%Ayd-(itwxPi!SYz_1$CIS!OF&-d6vLGM>yp~hA!j? zXr#Ir z#-a*52VY0V*qz~?X%HCd$`%+k3a;(s-DY0DKOTy8HH|6GoM<+4bsu6i@Y(FC8N~s5 zJzq}_vK3NJ1%DB$^7Ga~7^BW3h?U#0gO(5PTg#nR{?kr383{8~zNT*v`Oj^RY_suw zJ%PjGki9D$a76@%L1h6G_I{h-F5nd>6+Y}My#MoI-idrA=e5Uty4=%9P2at6rWhol zfygYob<`cpdn1hOpbrG7+BT`wWnWS_Ty8!6dMOI(gRTZ;Wy2-i32?pY z<$NSC1YX13P(sMaiaP)>i!m9f$JO+9@XV2Q0&f+ZNjUdr;F`4;-(5yFN|yw z$oXSPM*g8@KMwYbYS4*OBaq_G<^OmwTsXA(z={yH;mv2Ap#P^d-my5gD~Z($ZgR%QpU)m=R3C5b3ZOAy-}eZhkQ?T=Vg~St2|H z-Z!rU{fzqT1=g_G^Om^3=H`6qXpS$#aYh~O|Ap0n4icJ^spEPYLJ8!%FZ{s>yvVoN z>S}$Q0lfgJr_J&}sbp$4u^vAMo}5GO@}E5iGq&=!0b|pFn^M$1WCq*c8-u0PK2x4S z@G@KoU9Zg96#C%zRP*vbiN!=lQ0$?{r_Bz-bV?KJQRFBI`*0F?UK1!ac{C6OMm9BZ1IcoOZuWtC2yO69+@YLNk%3Q?Qp9X^^eXe2O!VRQ zg9YZA&*T;--x6^(or%TT)kz%iNmF&r#Sc9kec{c6K2>V=d7KxjzzwrB47EUIn}_UB zB(7}^aNph%Icol}8N>Co)j8C`JUH@9Bf=0XoC=wG+5JIr9FqRDK#|1SK$lWPI@a5R z%fqxSS3p!DD*OE09R@QT9m+Ykmt~T5^H?K-C>)C1?f!?(l6)UII`HJ0aq|`Ih+5l^9aNmDflk^fI_5 zfzn7LbwirP3q?d+IQQHs7#uD!jL%RKGvpYe5oBB7!o7wLHDR%}nx9=4eW*WnZJV8t zP?8_JFuOP0hB;ID0!A`tRH%OewT6g6f8P$~KySDY5K$D*h8M6I7B@4HyMhAeZo$hp zi#8;K*25>yzc$D*vMkF6$ld(%=Q#SoKh2zZ%ZG5yrP$=)2d+m>z zW*0_yllB($peAH4fhrQyiQ7gGJp!BICg<^4)4(2Z9e%RJ zdi;_3X~sW|A3?7nAZpVTB3`Q16(U$ z!_k1(4QsCNTt79v2(T+ftCU!Oe1vWGz8z_Di~!3+k6wIMb-LbXCT6(;G*N(_M1iId z-&XTe3?$=u9s8I-8)z~H&r9ny5xf)cre=;L5amhxK|4nbBUP+#;b-f&gF|S)@>tNZ zp=;kH)L(>t0Qz0;QG;KI7hp}c(;od$8~Ibg%n)qr^S(AaJu|T*uz?r96X^G21MSMs z!pL_Gilr9Q+)UtMt9#$8kuQ-iQC_xZ%`!vZ!KmYY(77L8a2~E$az0sP*wdB)I$UBH z!u>R6NQSyNSQL#}@`NHFZ7B9YVs>qYD*V?Np?*KaD3>sz4jhk6KEK(+U}FE>?|;e6 z^34-lLocs|5PIe`9brX*azHDzM%|!-msju!{^g3ilz<+!6dFiFzdA}|p4d_ZGy}G{ zrmukaS>XhtQIC6YJIvdL5?zg*J1^|%-O?z@dnGP_+{~zG|8;aI(g5XGaYwSM1LT=Z z-wf<<2DKhB@mIeAq78H#4^I8&YYI{_^i)f5Pxt{5>r_j4&<7ZIB>n%Xd2<`xqk=ew0+x9#) zx)KZDdY!HXdZr7%X~PyB*acp^7W8bwg3nCxOqW4aNCu*Ter^yRPF5Od zgFbC->| z{C4z@6=`~HqljcdUfr(sUihXlBR0TGxquWyPR>`~lw3@2%oZSm>t9SjsKJsn6bz+p z$Q>kTeYb+8tM-Fizxmd7ffx*H5RACEl%g-~s%uWZ{Qo=e!SBX%iD^m@Ha_aHF1P}m zMe7smB|)38mxCu^>KJ(8&QJqUed@!)!-~2T(4X7{nu<5RNb?#_Rc2^Bdos~%!?Ix6 z99-FFWahB?1Qyy}qx>*R2cf!<^C-I^AZmL^ty~RxoLzdg{G6FXTB=jfTTYsK@!`&Q zpa8B5`3Zw|YL+^$Vd2dZZI~pU^&MIZlaV5*^uy6B)I}ncgLQ($>!43CGeKT*2A7bT z@r3DKN+#&;*msUboap3hdhUAPg8gz}d_WSvJ-RW_#fUb^N`}D{9etaDTIaKQn|z+8 zjMagCFknGqEr>M);T=>7J;Iu|c?uIP4n5K_&}fT8gdy?6$wuJP2|55=LFGdCWm%$D z^!$;f%?1lvwt5NZ^oa>@mIxIlbI^zmF)us=uJQ<-YhZ8Ojqup< zt4fB2v{sRKCHJO_D8*sH;D-jaOpp!ani*7r7V>OI0Yn72J9E#xGFUSD;-Uds2s>(y zH_xTO_Vh)w{0&ooDZW9HmMwkR8@A4q3Db!57=G<@wA5u3`SJFw=>-Vczy~+xooJrR zhKC$LfzFvC5hf@}Xu3g#;ok~%X~g22l26f;jS~=!pi&jH5$dN7If5tkdfhIN6s0B0N33&?I-aE| zUsIy`rJOb!;{ljWvL9zZpj;(czP+UR2x8@M9+=W<9cE_Qd$izB`u;~rbnnBrXUsVPmSDV4V$kg*P@Y@>$m7f$V3AZY z+zL681^!e9=I0R0l+pv*)Wy{uzjccfi&2G$A{&v zsRo*W)w|GGfSNgs8qkwCbb1mrICdX4=QQ8e6A*ME4Ri*ItDzhKVnnNDZ5R^vAM8m= z$w2Mk;rORJBb(U&cJGV`>=_5t2NUI5vM#H)8-tJE9CKViBUs%GbzeW zlU^T|YB;m*UCNg%sq*n0DS@vkF86-+$;Y4hvDPRJe7Tf|fUc0u zdk}$6)}+k;ZP3*MUs@y!^g5ACAPD!&-7Vf2vjp!qA&(xIa~=joV}0#PYw(uAA%NgE zQcU*(TXb|2Tli?qWL|K8j&BXPiS!_psg^VsnKb3-$)cJ>z}3}MQv8u=Xr z%YsGSP*BG+8>?j-P;Q=kDkBMxc)%lqi1SZ14-aAA8TK3z*dq%ZY3f)4dM#HV0*Hhg z$*Qjrlq~QY-VOfP1-ns}L6s8^key&fVUIURs&LG3M zY~FyQ^NHGl6j+3iWfbt35`cqc( ze`X#s3d>%?sO z0lkqcvU9=;!0|0)x{#S@ZO~0RC`@BM(OqK)da`^i%hG`Ul!=aMKSUVOs?7W3JRns7 zek(&8gc{y}c|y8tf&fti?9zS+bTMjxY4s|V;LVIS=&MRTNiIa&(?SB>bwI%POtXEs z{I@oE@2@^7Sx_Al0KDv8Z65VHRX#^x(}$Zdm5{Xo&NdI`I`7KSxnjPkyeW_-uWb#z z%rxzoLd7>_zBfj5ou=hw-%Hdb9sDcq*5A8z&#>{!dGV%O{&9BiJMp`BRP|0*<|oI# zz3t2AtbCeH;?0SL3r7pSKFm22KYP~0_%ibUo>m|vcG7YE{Sma(j8%kq3BI}UB@i(^cOjn3L~N!d-fvE4`)p!O}+6U z)<<02hluC&@oPomBN~fJ3Q8`QM!S7RuxxbK3RFwqdMBe6`g_g7o0S*n#}{|WrOxwL@g^VJFW4;>xfZ9VsOBcZnP?Sw{ZR@aie(9LF?t>&;F^$Q{Pn82DGb) zTx*|EtQ*3EIs>?&xyD+%n}rd~g3!#SPR}=lhy;Fy_W6Hw2Gdo-WxFg5h>j5r9iKe5 zUU2({N0fw&KAJ$J7hpK>7e6U?9kuZ94N)0Bf=0}p^P_>^;BxvP5DJw@1k??FWBtDm zmTbjk6y8HjDDQW=+FVy)e#hh9wW9Fe2j6?i-KAUzqC@Aq$y+B4)++sLLdsWl{T=+R z7r!rh23g?%F~v&TzDpwxBbP2W61kSop%Brk(W-4j_8Tu&TS8RU^|=3?W7OMK)6C)PkSL<=2i6{i|$@NO=Cx5*~2;VU#oEMxYj3BwA z+k&qzPE2iHO_fhX1J+5lv&9iA=NGKsc#KM85dwqIHHM`_k*{Fh?@RCwm?VE&|7Co~ z>;u%!?1CS{dB2;?U{bQ*(^V4^FCAhByh7yxR{aU@!*cil4Mf}E#mgG!7jkx{dAa$2 z!guf!kd!Pg`ipAImv20@FYE^7C|BxV*7~MT&iqTRXX^WjZNjrgpOhodV&EwgTa)WI z(kH9W?W|rX@_UPb>C|<_zYi^>48t13#PuwRyf zmwQhqQrQ2hgRPn|Y$uXLy?sgZ{K62t>*R}SB3GA1walxVkqO5Ww-+`XM(&x9HUzQ^ zl)tRC#vGWB-~hVJvMY`LYxPn_ud5*cIanh3gc+^g>W3sGe@zWcJAUcW6#oe_Ex_VS z3;g%?z)y3g9`wq2l4+ycj0kHncr2`~#)@6_@TX@V!UnJz>MaHccUg;-idx>{C6}RIwo?dG&-^c0e$