From 1eaa879b2582b8c87935a66550c6fe5b161440c9 Mon Sep 17 00:00:00 2001 From: Yuzhong Zhang <141388234+BetterAndBetterII@users.noreply.github.com> Date: Fri, 21 Mar 2025 00:49:36 +0800 Subject: [PATCH] Use *kwarg to pass keep_data_uri para. Add module cli vector tests --- .../markitdown/src/markitdown/__main__.py | 10 ++- .../converters/_bing_serp_converter.py | 4 +- .../markitdown/converters/_docx_converter.py | 2 +- .../markitdown/converters/_html_converter.py | 9 +-- .../src/markitdown/converters/_markdownify.py | 4 +- .../markitdown/converters/_pptx_converter.py | 11 ++- .../markitdown/converters/_rss_converter.py | 4 +- .../converters/_wikipedia_converter.py | 8 +-- .../markitdown/converters/_xlsx_converter.py | 4 +- packages/markitdown/tests/_test_vectors.py | 25 ++++++- packages/markitdown/tests/test_cli_vectors.py | 45 ++++++++++++ .../markitdown/tests/test_files/test.docx | Bin 17334 -> 135824 bytes .../markitdown/tests/test_module_vectors.py | 68 ++++++++++++++++++ 13 files changed, 159 insertions(+), 35 deletions(-) diff --git a/packages/markitdown/src/markitdown/__main__.py b/packages/markitdown/src/markitdown/__main__.py index 6a5d01b..6d3d3c7 100644 --- a/packages/markitdown/src/markitdown/__main__.py +++ b/packages/markitdown/src/markitdown/__main__.py @@ -104,6 +104,12 @@ def main(): help="List installed 3rd-party plugins. Plugins are loaded when using the -p or --use-plugin option.", ) + parser.add_argument( + "--keep-data-uris", + action="store_true", + help="Keep data URIs (like base64-encoded images) in the output. By default, data URIs are truncated.", + ) + parser.add_argument("filename", nargs="?") args = parser.parse_args() @@ -181,9 +187,9 @@ def main(): markitdown = MarkItDown(enable_plugins=args.use_plugins) if args.filename is None: - result = markitdown.convert_stream(sys.stdin.buffer, stream_info=stream_info) + result = markitdown.convert_stream(sys.stdin.buffer, stream_info=stream_info, keep_data_uris=args.keep_data_uris) else: - result = markitdown.convert(args.filename, stream_info=stream_info) + result = markitdown.convert(args.filename, stream_info=stream_info, keep_data_uris=args.keep_data_uris) _handle_output(args, result) diff --git a/packages/markitdown/src/markitdown/converters/_bing_serp_converter.py b/packages/markitdown/src/markitdown/converters/_bing_serp_converter.py index 4108990..f65b85f 100644 --- a/packages/markitdown/src/markitdown/converters/_bing_serp_converter.py +++ b/packages/markitdown/src/markitdown/converters/_bing_serp_converter.py @@ -79,9 +79,7 @@ class BingSerpConverter(DocumentConverter): slug.extract() # Parse the algorithmic results - _markdownify = _CustomMarkdownify( - keep_data_uris=kwargs.get("keep_data_uris", False) - ) + _markdownify = _CustomMarkdownify(**kwargs) results = list() for result in soup.find_all(class_="b_algo"): if not hasattr(result, "find_all"): diff --git a/packages/markitdown/src/markitdown/converters/_docx_converter.py b/packages/markitdown/src/markitdown/converters/_docx_converter.py index 44ff85a..4625707 100644 --- a/packages/markitdown/src/markitdown/converters/_docx_converter.py +++ b/packages/markitdown/src/markitdown/converters/_docx_converter.py @@ -74,5 +74,5 @@ class DocxConverter(HtmlConverter): style_map = kwargs.get("style_map", None) return self._html_converter.convert_string( mammoth.convert_to_html(file_stream, style_map=style_map).value, - keep_data_uris=kwargs.get("keep_data_uris", False), + **kwargs ) diff --git a/packages/markitdown/src/markitdown/converters/_html_converter.py b/packages/markitdown/src/markitdown/converters/_html_converter.py index 91595de..dabb0d7 100644 --- a/packages/markitdown/src/markitdown/converters/_html_converter.py +++ b/packages/markitdown/src/markitdown/converters/_html_converter.py @@ -55,15 +55,10 @@ class HtmlConverter(DocumentConverter): # Print only the main content body_elm = soup.find("body") webpage_text = "" - keep_data_uris = kwargs.get("keep_data_uris", False) if body_elm: - webpage_text = _CustomMarkdownify( - keep_data_uris=keep_data_uris - ).convert_soup(body_elm) + webpage_text = _CustomMarkdownify(**kwargs).convert_soup(body_elm) else: - webpage_text = _CustomMarkdownify( - keep_data_uris=keep_data_uris - ).convert_soup(soup) + webpage_text = _CustomMarkdownify(**kwargs).convert_soup(soup) assert isinstance(webpage_text, str) diff --git a/packages/markitdown/src/markitdown/converters/_markdownify.py b/packages/markitdown/src/markitdown/converters/_markdownify.py index d98e1a3..d98bdfb 100644 --- a/packages/markitdown/src/markitdown/converters/_markdownify.py +++ b/packages/markitdown/src/markitdown/converters/_markdownify.py @@ -17,7 +17,7 @@ class _CustomMarkdownify(markdownify.MarkdownConverter): def __init__(self, **options: Any): options["heading_style"] = options.get("heading_style", markdownify.ATX) - self.keep_data_uris = options.pop("keep_data_uris", False) + options["keep_data_uris"] = options.get("keep_data_uris", False) # Explicitly cast options to the expected type if necessary super().__init__(**options) @@ -102,7 +102,7 @@ class _CustomMarkdownify(markdownify.MarkdownConverter): return alt # Remove dataURIs - if src.startswith("data:") and not self.keep_data_uris: + if src.startswith("data:") and not self.options["keep_data_uris"]: src = src.split(",")[0] + "..." return "" % (alt, src, title_part) diff --git a/packages/markitdown/src/markitdown/converters/_pptx_converter.py b/packages/markitdown/src/markitdown/converters/_pptx_converter.py index a45a507..bcf89a8 100644 --- a/packages/markitdown/src/markitdown/converters/_pptx_converter.py +++ b/packages/markitdown/src/markitdown/converters/_pptx_converter.py @@ -78,9 +78,6 @@ class PptxConverter(DocumentConverter): _dependency_exc_info[2] ) - # Get the keep_data_uris parameter - keep_data_uris = kwargs.get("keep_data_uris", False) - # Perform the conversion presentation = pptx.Presentation(file_stream) md_content = "" @@ -144,7 +141,7 @@ class PptxConverter(DocumentConverter): alt_text = re.sub(r"\s+", " ", alt_text).strip() # If keep_data_uris is True, use base64 encoding for images - if keep_data_uris: + if kwargs.get("keep_data_uris", False): blob = shape.image.blob content_type = shape.image.content_type or "image/png" b64_string = base64.b64encode(blob).decode("utf-8") @@ -156,7 +153,7 @@ class PptxConverter(DocumentConverter): # Tables if self._is_table(shape): - md_content += self._convert_table_to_markdown(shape.table) + md_content += self._convert_table_to_markdown(shape.table, **kwargs) # Charts if shape.has_chart: @@ -203,7 +200,7 @@ class PptxConverter(DocumentConverter): return True return False - def _convert_table_to_markdown(self, table): + def _convert_table_to_markdown(self, table, **kwargs): # Write the table as HTML, then convert it to Markdown html_table = "
H?8@{SeLKP$Z{r%6WjwE6DlVVp zce&BZf840KA)Qc>Nios^$pjZOW~78>gX~k8G@Rk09Op6(pt)1Gy#R7F`3{3)`avu& z!{KFlQLOg`B%#lIe>@AXE4yLt+OlO35z2Bz(ObRe)W`jpxdgLwm_9LhHGl HfgiNt&((G$PI_D=6z__aa_oiD!AdVqAV=bjd9D#~A4 z!qlW|PR)vjH)Xdw_%xw*b7{|6_+9(iFW`whKKe>lQ})z#kCG2b?Y^GxxSY?zK`p8n zM~${j?SAurh `?kd~Itp}V`0#-OAmhm_7?m?4J_1!;z6 zXpk7XQ+hA1`~E+BKhHjn{dT|OU|`K!=egFoe)0K!Pfb>Ht!3tRI-$IP=^L9?gx+9p zMzfxE1wdYx(|JUg(G6H(ZLZ`)3QkIuJkQ4tj#7!B)eRx W&Wz9l${et bDpJ+*168$Z$FM#*>NAuubZ|Ulh#sC4QO&Wfxv-2$Hb#qY(c%OIj>s{c zBt;PY3k|;mCQJAEUDq#-(fzJad)KX|A{@(*=8DAuQrndG&dHw03{~Eg 2(dlL{<&qr7W z{duB8^5ABl=vLJnJScX1Rnomvoceo?n#3Axu}BY^@lJTj+mGFpko@58Yv&$20MB!d zwLegG^%Ozz{!nEg^94GVn;dw?$F$|Dj Z{nA(IGJcw{vsWAkE{i;8#~oC0G*2ht+Ue>Sjh^0!3@xK`Xc+z=?f|8 zR8$alXeMTu6{*~(SXKB;>bt-y`P_c$G}k!{gQr?x1>7HDT~Mcn!f(7k$$&Oh{~+^8 zg?)YSRZYY&ufMjB43StDAM*->j=(MQB=J!GJ_l;g!d&4eVYR0CIAlr3kd6JEaMy{o z8hy3eG0Za1q*?=j< FD zy%;Y$yPOs-jUqSNvGLwnB02;I=U!+SCX#YFlsG|1qu z-W%G)$X&Dh0R>s|ha($oOUhp~R6$?MDc`Orw31>y#)YP&lUelA^JcHtro1IVp0Q+K zltaSZv~~WG91cDrAyM(=)W==;>mm45GoGJ0Q+mGfJ;XR#2K$70?N42sL2>1t81EQV za9V3(v!qJ8nBKQrH`(mT2rkdUwziS|S1g@iamPd(!{BD3eYVn9sE`r=G!Mh0H>ny; zBE8M!r%0T11OcubjE PkRs$u!6y*use?A>El!X_-XDtNX$fL+;|qp{I@+(N&i&1nM- zWhA3~G3-XC%k4uy1Nb$O#^j!3P4KdvgH8NMo8xXE)wxz)#=|;b@UIOp3%Az`dwL%u zViQtt&DP_r1+jiXA4Sjvg5T5|#5ZtcgN!gIzV$H^dZwEVHr#~_RxqTN*P)3JHeZy) z@HTyZ{Sy^rT*%e+=@>B~u7+- $Z>(E2GEI*D=dN~!Whf>NLPH0GqO>W?8T+d+> zB(c%k6}L{b$ b&0oK{J-gzb+Q4dPRPwjPn_P&r^C(-+(CdPU&1Ivjf zjoZfaqyc3bhoYak6M1Cn)_Ib;9$&ZdM_EK8%bQXa@yxon5%kVG@vFEAzV;A1U0t4x z5xWei>R?^iN(eS3Hza1Y`eWWG`C)iSH9EPmQNG%u{MDN`&c6DN9}GVWdhzqyz?&H` zbkBdVa_&0qVS#R4M) Ol21bK+a~OpDzN6L9NZ?7!UaB1M_RYH!Nj<8%K(4jd-0*32 zidQJ}35e)3TZaPjj1iE5OiokG($>;$1dxWFz&=YGhrkHO%|h6p2~u6P> z|HZsFeOr!7pHi=o*A|~ytG;N}kPx(_H@GO`(p1RhrorBI{btV;2fDxI7J2nV0nc_s zOOSXvt$1z>mCUsgE26i@rO6>e;wZ-}Y~O6o*)zJ6Y#TJ8`b|&-30ons1^2#zdL*hD zqN^9I0OF*dL7TSZ3)l9=Yi)@Dy67F>zw+;R4b?*;W(^)J+?>{q-t&RKVG*~~y-dr0 zOIr^3YxMELE9V1FtFm@{ziWnnz @b9A47{m&l2O(ZnC?v_*jI>iK5+dwGYChYDaeJ=#MKua3rj_wz=T 7lYHk&d(UbNSu$O_fHZ&GWKhVrY^Md%XRvKaU2kBNGxoHL59SbADL{CD-dJc2 z+qj0+l3fTH?-dd(5=589_xS~&Yw@|(G8AnUCfr`u;-J*cw?<0(;>wd>1ai5w?$!xw z`#Xe4etxhe{z@mQmv)EK0WC~D&DqN^nvh17I?b6-8rR*6%qDR660g@#gCvRK2YpS` zDskA~?935TnoN3#c!3Lk{oJbAp-9*1n#zju2nwPt(U;N|Xig=KD7TrM$;y6AmwL1L zsi+^XmJuB-xu(cwQIN^gPZ65?7?t@*0jy44tdQ#zCGb)YF$1@rF$kJpJ=%nO3KY8* zo%9p1rb3)z;ZF0fv$#w2br5W87_gHJNbLdbXeu*At=puX*)wH5$t?e(Ro%)9f>C{T z|0UGR2plxb%66uO+NLxa;rq}Q{12Hv4F#yu(aK)6Bo;bbI?g^?ta%eUEf`V|k8iuN zmJk84YO)9~Gw=E0QTf5pvyj{05~f#A*IY^UWHa!CS%jM!@o4HnZ{~Z%dCh6gNXi87 zN7`~ &Y=`sFK!$5&^lo7p7Du$Ovx)iKJ(VhZIeS%{ls_%QXEiE_r8-<{q zs~_JWoiD)9BG0Bu_3Bf_&a?^M&)ajBTu01~;?nfzX`S--i|k_2321OerutlPNr`GZ zchT$vo_rntq`aCM(-VbV=P}Q3eIh!T22K}Cp|SFh2sc@qjM~^*eZZ5_joM~k689}R zWel(`P5-c0*lb@h_8dug5vefFnG(MxN8Nw;z0#7Nti|HM0+;q!7c7g5lCp=tarJYf zb}}qT^=rzw7^U?>{S4|+|I>g_KWeLjEbXpJ8>@dqeb7(#BHh$?FV}Lc9`vgfKM%tw zsYo^^>@hkT)upqlXGkbJLLXH5KdNl{CPYA*D63DyUHbvlva0k9Gxxd4Rb^`;mefM< zZRQ#xRR%%gsb5B=skvJ1;$4lTN_Bo;JX4i%>4}1Hz1+36@oz*ZCY3x7 a2&W6m86+}0H+#(**K`HzC2jCbP@jJV zM#nYf4K)liJ3nt!4rLDiGxFT&n 2$&U;ZnU`Hd~m!2t4f`YVKB-q)EZC>mq=z)R+LK@Te9{)hOgu`Udhb&6+ zF~&-o9M4h@{6WayldFLyK**@%>R!u9z7lWV? pSL~F_s!W$1A!NrFbxwb z=9iwW?yH_@ZyU-Y8(Fco=Q8XBd?%NE|HHPT-fpM>pp~Rp>X;= QW3^-c!^YTBl1B2p +;Q}=lwYb0m%X9o>!xQZ)dca>coRQ2-Bzvswq7>2rsLEBz2c+& zJCV|b`gheH#_^%z9#yi<+iyvBf*pPr8%0HtO}wj3V2CtsVIwy&lH2riT~iU4e7&MY z=bOgu${~8l@q_1#e?MSkCAxbYaBcu5q=+uyFd@r k^@!VL&x?PtQ!~FtO z6;UP^3N~w|62i}N_HDqGIn4rlO-J&=G99rm72}@`VBTy%C$(SR{_PqaWG%z^1HjP; zXUNTIm*{E5F|7A~Lt4*6737NMV_rjAymMC;h7M{_-giEhbGy5?bPx%8JwD}#6ClRa zA=Q}G;F3TS*( 0g|zi;(35XjZeAj=JV*-*qw|5N~k29NnjG?bLZ?}@DURT%2!UfxxL@WT*2S4 zPuV1efAnudb6@j` b{Z4b-Cq0U=a}Qr(V$pXVcqrVO!9N_DlU9Nmm Seu>`0W@HtLN?N%>6)13KF{QG3GyyPQ;gt(&5NUcQu@SV#VF|O8NfytElNp z^sqkCnBiGT4nOf`V8#bZC*|~RpmCC~%h2}C&hQWKgh7=mk`b5BFIr@~yd4*|0>E^` zp$0`Q2<%4S+mU~K64#8cB0q6G-G>mf@9zF(V0cE#_}2Z5JD<`YuJES08m0qWjrKWH z{TIS^Z;09sz%yawR{CtMIAN)0Nxj%kC!{>tnKV?BF8NX)s%N=4l52!5$g!AHgXLZ) zQ>)wxoV4X%krv;v^cFSybPwTd@>y cAx5tC z }Ox5YQ^EFqbo$6oMUGI{K$#2T5Q0%q-R@C zX)f5*e9y}4!fBr)Z8Pw#)JEsmjNo_SSjC~@Vbovq7?C7-op*~Hj`HMm{s$do4_7Bd ziEy-}Nl)W73+ZG99qHU#FMx$gNuTbzN@}|8*KU0AMTo9AW%@^5cVq4Qthc63MO~D& zfmdXwtg~|mk&JAA6TjF~-{J`g_tnyzB#HJ NJX1MY_6!$7Cve=pU7LZnPu;Wz*@IZA6V04)@wQ1OH_= zAe)%4zRf8=-jpfeu!CmPvWJ(MGmOjg!d)ioo}H^ T zP7}kwsr6w`OoqzkwVw0et}^$&r}w-g%O;}B|5P24j>eV<*8RGz_KDxfgkBD5bY&&@ z0HTw&zPrp_@G~pJDrf#gg9*zD>&qH)SO~{M9f3H+sz0ErR*mFn)$WT5 1JN zFybq-CXDP<(8`89)0vFbD|qoF!=>#pw7QvSUVoBJg=vz~FcY|!%f#a;s>Ofpu>3&c zQJs%iNr2yx!~88}nf~74%tiaG%=^z*5!{yo?FhIXKsCR^S5voGPCLl{X*e_b%4PAD znmyl9oNNG{nq@Tqq{;m$+!H42sAlkLI991a^!0Bh(Wh26HadREeCoBB zEId+d3tl^4w>*`BE0T4)&10HdeP|k4p|^e*Rs4drEUK2&FmUgmhcB{a3?DjwyRD1% z-PfZ+zkT>H&+}Ho=Ts!0F&3P?S;w3X&`Vk+R=tfsZfRTzucVf*fz*&JT;@W)&={xp z=h~N_4%6A?-a1-{@rQVg3zGNa-fWMJeCBw4&%TsKiQN9F18ar9lGcQlCme~!h4u%M zn@PQ;@%56W@v&ec$w0i#ZtrPN3^&)#J@iA;%QrubCWJXp>4DQpB(q=)>cZ$XIpASo ze+BpDHT+BhulTimeRg}Za947EsIsrv^(oH0bB?;+qfHLqt{g8tjK&%i#U?oHNt-QN zU_e+;!M%IPv*K#omrJulrM9(1bji^09!>zeiEwIh6kU^{etMvthhQ;A{>pn1O{%O^ zMiq?PWlW^o^WsUdd5#n$;6&3xG2ixXAkwsy#vL{@A_ziKvUDxK2;|s3N9{fB0WRM^ zS$xaU-T3xmVsyKhY~r;SY(D`Zq^d=myUI2=7d4nI#ls1w) 6!*Ua|IKXK2U{dnZhZ$FGS|_3@Vv^qLO6et>jwrmb zHFe*Tn@BqZQ?ae7E PLoXRM2#n^qf z@*nXJ>BbzCByG4r%bjx7agZ#OdD<$4Cy(%vIh3MkZ&+JjP5+HqjxM*Rp8JH3@O-%Z z3okFla^R|@*+-v*wou+sNX3azPU^mV>-_s9E~fY$j~?w=-oR2{hq}URXIZ0EG1iRP z?OM}`rwR0F3W=jIB#J?QiI=7Vh{T8t=3fwB{2~gBjU?0JCfhZ(QN=&e *9{`!m(K}^(hC4QklnPdQjVWAZR!R7Bu{a;%f&mraT|LXuJsq zI9kK8Sf+BbQ-55!=MgizbCe9l4mGxP>jzSC^8@coh~bfTU8A|WV{=Kqz1iYt6e8 >@! z?^?rvMR(ikpT IGuJ?q&_BjT@)_j+)5^7Gr_Z8`Z%{<*v9$nCz!wncy!}wr)Dcda23B z#aA?+-k@3z{2QPvT8k0{V=I|EKaZ`yA^V>>W(cz-x|@`T_tzmWo3l2Q;S<3%iot^P zhkl;+_DAdGogu6uM&}K7B1gXhItt&BRB_(`U5s9J7GPWs&2t|n%|(eBKZ)*Grf!}E zmO4q0SFtHyp)t29y4aYW!5GQ$ggrc8pkHvS^sR8bK&Q(&CONF2Z?hAMOsG%JF-}8_ zzj*AWq!(DG^-ezz!Kh2%f@!cnk7h`If-ay@RvLWs7>_kop)iBW%}&FV_OpR6%GRD- zI`GD99w(>L8wd!SW@J6rOZxMIvjV6rgm8|0i@3Ovp}vQ|xX&9#R^qQJ>w1_UyS-vd z=W`j3I1&TmV26i=Vj XPr0Ho+LGNDUeF42{M-S!c 0 zUUa0-q)@}LE%_a?OUoB20Yfd~r12hEta^(_+uaEZ^87 h5viGS$L|gWe*76Fo#_XAP-)(>Q}MV>GyM-#bk6d>;t- zY&cs_k!1z0P}{wV-_l!egWkit3{U%hj@@4a-q~w{t^0ofq-y&i(=BLE)(%*u{a)1v z-wCvs7=2=@w!ktO@l-TAk^^={N0E`CY(0cUg++JEmleTR{1-=rVb{fB74nFEYNO-d zoXdP4BtJATwNLOsdq!&rZ5>h~s^I}{9vEF{`<$wxDa>@DqMkwP^VPe1rZ4BaOCGeV zkN?poat5z?i<=CEsr7rioCX33Sm`@>)!chGUr7;yOOHEym!TYXgG4UlSAF>vGQ=@n zY|(9V)L|CuC!i6aYl)B@tCTWz0xhskzMj5H;B?}@=xm);>K&XRXLwB`Cn_+s@mC(c z@|bMBU SpTOoL!!4h)Tj%{Y^SY4Pd3Cnc_h3 z8Wj}$I2b{Rzz>DaL0X7PSpR7|W4yag&!bpLLRU{nGOM%JjNlj(nl93#c%tT%SEwOr zYv>lJ?}Z5stDeZAI=;dD1jD(cO$c(agBTCn!`hBm%yz~VF)t@eKqW3E=of?MFFT^b zhWioe#XGylH0*jo>e$FPFCM6AA4RYt9t{_6rAneNJZ*}K@ldWD37x*mn1js$g-fQ| zXD3>q*}3`kz>W5%#f^ZzHt~nli9ojH*>hq8q=iO4$^h0*^2)~{qXz1Kd%2L+oc>(! z0pLaCCy=lj3uN^wqxbS+2%{LRX;hvdx9F|+kH&RVF+XZ>lsugB#ik9l2<>LMFGiAE z5*c^qewW7!D85Qmu%{LK`zL6>=WAKgUfM6Uwz6z r9dui8_A<_dUG@m6Br^!$+)k z7B38$*d}@AqKURVK5(sV_qLcrImWn2JkD95Zu6w)PMeE*iDf!!fk@I)7rr-S@6!?Y zxjK^c%ZEyOA0?mhjG=?+LybrHf>&JL(jfLBoEeBg=32w%swrDF{XI=e(SGe G^DYDnk zp)QMEso`bp;((%Po{{KFa=}Q?2|YbNytNU>W@EV=X2o|{cJBxj_ `+(=ck*3c-R+~CA$IkB9UB_gjb*RFC#1vi6zLT8Et?_*pX_a@hzvkPH^eXz*l=r zO6@XNMvOcqYiD@_UzB|qFFQH7f_|(uf`jc>kP1c;9x8{8sd}zTuxg2##Jw!zOolu? z7f{5|_`x!5>^&akHDtpw whctI$p;j;?L<9Biv8C^s&)l4Q`zHI{v_Vq*(O?XI$O@59zr1Eiq b=fJMEvLV{ZJ$dm%r=e{KvMl=m9?~LgbKliBe z>TX0&X%RkIftT26g%f4fmSBR&@{%KE-_1s?rDdH#K^UU;2PL9;QQZ%YiU;HtkNsMp z>=33ORN9rDs(MdPU-KlJlXv+8!g3jwGltR0*<~=MV`3){B%(~TnvnQDFsV{d<^EI1 zZ{6Byt-TYUjC&2~JT`Lek4HQ&@;_E^1Ts*+P?pZ+hb$gBl*Fi$x!bI6y<#1>3J%B^ zol&I|NDw}}$~O)ee^Ru&3~%hM+cmpT=3%pyCh09!&cFH`YsJ_wz|>v#saFLN)mm-? zY9%;ab8$OF#p{F4wLK^MV0NnTAu1cyIi7IzRjAF$VCbfS?i^b K$kSF`0TUc_!K=N9z~t`xSP?XiRSrn`f#@jMq5@b`skWnXQRzXeg7Nw$ z3|!@|dlO%S%VfBgeX?>82?_CUDqz=|Jc+jMwrL-hVzaU{D|^RF>wmj5W-c_iP1x>y zk#nz=KL`$VHk{!>c9KTKSvNHeqT9Lm<=%dYxo7k0OW@oATIz^VtlEMgU16LXiovUq z16&TC>HZKjrM%$aF5^}d&+jd){-vbe;L|ncR25t8JMy pArZXsY#Y$xF zie*54l&xa4QsY!oW9*L?CM0u&lhL*)f7Sye>thS57cMe0n#! !VrPdVgYe zoeas0OH0)!U%$!`Tw5(rk8hf=4DtYJL<;zWb<;=oFX+cg(QYr>+>IP#Ef8 bkV6*MatN1y%?cJkYjEbj+t|wGPCtZKyEJ@vVgF%lIXZ zaV>|2yu$D*1(Yo=^nj&9EZxmDpWql5RhQfAM@VNpm0nW%+Oz*Mrw#Ty ^wwRNUdYAdqQZWX=rcomaoRQM_(OckxUQQLHcDS$m$QA4 z@Z0RI&{Yv6QBu7j=FfH_?h*Wmvk>`;2|YUsf=1C4iW}nD2iOO)US9ASnWv)mcu$6Z z@Ep?8++Z~{V$!ij(lV2^4PE&cV&XrIb57e}J-C5m=H-Ya|M(!qiStYY#B;jz1va#` zF(@4 ;8vcm` zM{H|_yt}M#Ot53yb*eAW`w8%D| zc)pr5x!umrF0OMp1*(Uqwigw!B;S}dGmGO@`|G{mO7ondw9(oDpH~be8j((U=9F{d zm_s!LJ`mPJo)K)3>A_5CvMa^3jkXjHXM}MQ$&yG^%cbGSM%q2R_1%x~;Yv_t7-m@< zg_~4m2kuU-Z*+GE3g*{*XsWWt84yuu$|K*aHKkZhjHuQ_&mcy3D0Dyy4dWw8)lqP? zT=CXypG1syVV=v6fnZyk(k*p|OsgNdc*G`zJj I8=j zzfismdDaIHVj9E~6vzv+yiVTwak30gBFwx=d(-pLn<}3XKsBwA__AQXUIpAjUdX%X zZ)-mttBvNL`rh_hP%nTyTzd+DD;bQ8!+Tt?JP{jDytL!`DtQ!z*5+-iUfZGcw@SZD z+c)p@)->@#tYibeHM08PMh?2s`oc#*1GMZO;g{Cr Ym4sr&D1Dwibs zjfI>;C|EYSOFoa}k9H>y&arPhMyBs^uaDK*6jMTcM+_iVtGfd*0$hi2=EN~%Z!?bP znrtG!b^SP;t#ayaXr{=hJLZs#a%zyt2os _CkcV0AzfxcZ!OMiReIx`+`fdmF4m zd52D`$Cy0QTze>e*7tJl_3w?Z385E-l;eMnH;dXnB693$KHBHgVvD;a@wnN3B$=<7 zFZl4Vp^>yz%8>?Zs4N4ArD0Ws$An>@)s}qa4!=+gtsV;5&4NYfEi_ eJwcrjFEt0&e3my(|OsE;ldgGKR6uvuT`I1l*ljO6Xm-=~yES zJJYqES?E5>`yO3p?({Y(>1ktVHYZeZOD`-G><{`KUmrlF4(-dJenY&(Qk!Ml=Opyp zjhbeCmomYXm(;6PcENTxtCaS!p6usG<)0sTKqY-)`D_EWMHxxG(3y8e{s+=?U;iZk z-dxIJubr)2i7n0oCfw@fPkP02EG zetQ~8ssfs6qSM|08c||_H|J~3rv%Wxqu!2QC2g<%eC@O~xQaa*fEh*R3|D>~b~40> zd+pqTSw`!)*)#8eB5@vxwWt0f{$o{Ja%?-GK)E?LIo@Lqx3kO8vJras!27~+{i$x3 z$@fAz$FSW#C0PFxAI*P0{cV5g`$=8?q#`E3!4g?xv#nFoLcIKI&M>^-l#IK!p|Slf zdUKah |Bp^$C Nw#Q(AeHUU3-RJ-@lGRJ2QFq@z;u4U!_&j7vG1{5;8@=^Q$ z9msLzKS0f8G@xG4riAs8(k5^pcK|)rH-Of|<3C!DFEqd!>Gyv5*?-9RpLR^;m%ELC zgH#^?kDmeDH_gW*t=!?b0YGSq0-9O$+CG3{$av>(x7fdP&>svK&02p=mHO|5C@8%T zQ)>pmQ6TOA%C}WWF)nH}SK4Q=t4=1G8g!@IsRO={tkxm+zk~fBsm$H^`T{n~?#>?m zfJ+VliT>vb{{1oX&e_tn52xq9-|@db%H{_Uule=APyU~OefKG8GN5!>N+O8=UtYlf zJ?497Ao6G)KA`=d8|Z(I#l`^~s)L=1{_Y(A?{fki9Ov%_C~p~XANk)->WPj4aHvRq zz7IJ6=lM1RH|eQNSJ?j?`+xrN|Lf9!&h12h|CbN`pTGY1*>VLA#o;vdisFAisec~* zM Wk@zS1gzBFB{Bzb NAkN=b+LH~#%?vrO6=73;$Mg~+G#^*%sr{P0;#71}NjN{+ZervuqK zpUMib(o~p0TE8=m{V?aI{Hn?lRt3l{Y7g(l2p@i %={B(14=j5Bb3?TEc z!?X(WXO`t77R9eP0CQ84Wbx4_kO7_22eeXkDJNqq4uMhO+PM`^Pz*FAuI}PR|DX-M z46#M8_S@I!N|-=-OkA2(ppJ6mlUYF40Qo2F6LmbVc6hd!nKvNYJN~ZwlO*SlA3mm` zNM B;dM(p1Juq@g0FTN=JBU)91_Ws+iywpc?Ex%xhp*dMpf> 7b@8vImVG>#lepWMS7HOFgtu5}4VKr96@lzS- zFZ^tk)r$)+LPLzx)=FTAN;_|0xK~rv;bSUjk?~v9>I;t{@gvj?;6ZDp^d2KzmHvA# zV9&4q2jIn3Y*g~(j%ZKCNZ 2n`nOspb~+YPYhFLqv4% ztmo^xoY*4S8jQrkF0^<(*4f%v=MEzW=iK>U_q}Nq&c6Y`ej~tq+1CfqZs-o$h19re zs2Ym*3QM0R3lB)trkJ1}@KD%9 %W&5+5<5Iwc`^zerOBZagXCk zFfkOoZY2g9n0ZlW$?u2W6&EnawHY8f{{%?2I`I|KhYLp$lZ4SGfDA`@r3tEVFN#Q{ z<}5TPG_9Tm;#4(O^>ph%SE?*9Zyn5gRLNsD)dYP;E+8oFVxr`*>JaiOu5!3r;XkFy z7^HsZkdm?Gcebi$N~#mkV3or$_Rft&FYL_ZU8M{s(US>CRGaqnBF#b6iQGhHdv0o) ztIv1!-{vIIOK}~lC)?Ge?{Uy6!6!jU$Z&_gZ@QV5nvsS51U`GyP6NctUyDxSu#=so zzgau!Th?~2I1_Mc@y%`RT99_hH*;h*h-S%cZP~T09o~=L>^JaAkR3s@zp2G2Lgq#T z@gcFlC|m`cVDz4ISkBb?<~l#_)ivg@IW#fu^eWDs?B(E#BIwon#3r=0bld(W$E30U zQTMMRuYc*pefd3n_K%K$G7l~~n|ReK#`61WfuBZ^P{bP^grAmC3`p{HU4ShON|C(A zEG=BFdgZ?N{v+kfu{EntBbyHJCj5>52C%t!3QwlA#%gc>sXadvrlyi^Z)iqGmm *}QNIm#pI*aqPUzaWIkxF7Qy)g-dxY*M{SO^iWw$4-HN_wie%K73 zf-Tp|u4_v;mnXZ#2 b-hLlzR8nu#inQWE)FubYYr_1^^qH DW!%Wd^q>@4&SRW5U;{n&3kspU*&UQ2!TQcGcSFPby_U!Q5K4^h$GVKtd{@Z<-2_ zUrioS@d25ep|3Ovt3x<(3vC*ewV2t{0~Pu6>xq7>GRUr-bZnR4mAz{$(GB+v3$zn` zZ^g|Fs*3&<*pN{n&(*MDzmMa7UE9QC-xy+x5b7-jUh;8%hxLY=ju_mzIT~=ko8FCS z&=PpsboAlD!D>ss=tsviDqq47bD4G})VGg=xCQxCszvklkb%g$U42`(hU7-K`%Tt0 z`Nm{ze`8bS;Yim(DyT kvYftNq6?{scR4NI*;Gki9;zOjA@ z++bZ_rmyo-D0KmyDQUkY5CNs=+pVwm+|f(R7@jlCB1sm}UO{ijU$Q4Pv{s8zUU(WU zp{HvQ@9f!2Jq{G+rlWf=)F(;e?h*b lVSLzP1f z>+{%x5$6JgwXEIV2}2ZmyuMLg`8rWQ=jpgmEzS8q50bE{_8w_mpPrAs4)C1MR>=(e zCz9CF`J ZDb!=y#+(
|G(b9Z+ren-%VypR<ek#;bP?CW$i|2sdYmLG{}QPD|}-uIZM4{J=e @QsEC82_)ESj@ga#^P4K6 zf?!f)Ct2nw8XFNmOiKkdfA(ft?#@Sz>>SY+`TuQdvT4Gjq3f}J6`;%;+@GOuj7;A& zO<8b)The|$V`rQ2*_fzr^rV&5+!KD&34)hcy=X$Oee2iq22;)**UQ&o?>|oEd=Z c z?~tcB_+S%JFZa3*at;pn3=wQ#`J8rvSJA$L3m>ZtOp|!&$)1iQbv2ql0sO0e9=d*? zwjWS-A^1OX#bg4hmCCI#0Q-%aq&qc0Z=iW=*9D&WEhlj2bE*vSvPdqAoX}b43KZYW z%Eo52VW!&o3;+FJzMp_b{dCz!?6}|i#oNk{TEDM{iCyK~*uGi2WY$Qwh*=1&1e9sL zGIwqb;vZPkfJWQUf_{B4739tt)z@}2=5Ug28ptU*^6j4%ZlH&seVP+8iwRN7^9CH_ z!qSs0vLU|!rJg`^mwQ~YH_WLNP{T&ZhvSwkc;!AqwfO>}NJc?CIhSD_vAhO}st5^5 zwduj9!eoc31v^XGCVd6zLcgl#J6?djRj7@AqzqSa=}GVhw4OaXYvny%8J6H`q4AM_ z+npz!X8T=Vr&L5}8WTV0))>r)DP#h!XRHslN~{?0C5h4O0GKy()odtU4UE Y~dbxo4+@R?3@Xo3?ZX+G{bH0*vZ5M^^8LYQn7ex)( znbj1{Zvr+HM7S-p@VN+IgWQXJ1 tle^)_!q) a30JPPJlF$L4fgPy za@IqDEN132ri$;}j*goWk+#_h6#Q#1Lh$l0>r;nP&SlWi`iV!xM|U<4R(_h c>eo2J<($-b=#GF5@J1T$^N|qtF(8W`!j{wGwsTNn)MEPu3EmG<2!uC z7YHeoLMQulMOQx+#zg q@dh SL zgdND3=fG;k^Q&()ZO2+R+uMlz$0Xwq)N?6AlYb!v_ C9^<(#j-iIX99`P9#AWy7ByOy$M9wEf|)Rw 3H_70H)0cht|m zGL0$Q)jI`r#q0)4R5?eAxBNq%divH0LZ}uf?1kI6kSvb5FJ?1qHShCG(`((VX#+l7 z0!JSbb2Rb$9WDgTstY%2`OzY)3_cliKJp197}V7@cI_Y$F{@HZ)Qx@ujVb7LN?5#* zydCR%DscSF*~-r9TDXdxuelY-(hIoL9jko|^|9V2QxHAdz%%~)^=1!N)`x61W+^=^ z)2w&!7r!MM_0<^b0yem2PIgs7xjny-1I(@g%Y|ayTGZ|QJ3@-WiO}a$?$La9LsO)Y zQ!B0WXF-MJij5Y|jtgPJM-AdWD!Jw6RX{B}QK3NG$bA(Kb6`yk!}m>M5`l87sHu?E z&uvEs?7qC4D=be($9Z*}Tw0DxFl{rdFy|sryit--4F%(9pDF}soV>DhX;;-1Y_(|K znSDmZEVsCZZr8|CK_qUM)qH%Q=IB`E>&HjnHfb70(kU#@iCO~DoSck)85g$N!oHY| ztf#P(KFs*BsL%dKGqB(uhy{{-H$7I|JIBdgeDX<0A0$3)0TP>9S4%Dm`)|KP-wM-$ z!vLYcEg-h9ggN!2GU?`?hU-#gy?HRy7c0~(7gmiL7uYP$lX)s*o8j6?5h4G~H7{`h z*c8CAgYj){_)>*TT4^@8&ews_;FC>$wtxE$b1CR`YHHe4UFL-kUvpV&`*F*Z3~Fn7 zDS4Jp`5|qLK&kLv{tm`%`s-=0Wh^F+O|~1@bw~Y0J`Lq#CHDR2Cu+ZO{RmlRhLupn z&wor v2CykVQIkwuXH*FW`ui-`e{$;-EC&{ehDpP&CQEUT<8p%iL!*)tx zzO!N^!KCqYT_#ISWnqoU>9TJg>(TQQkGL6>#GL+56TqDKc`u*^DbnF_)m~%SXwE2c z1AHyM$IcJ3g(&7U)E_!K-a>vbpS(J wqUNpqm`3?53 z7pW+#Xe5JPpOl|`VSy+A#K+Q`OoC^DSssErwEU7O;aW-ML4KVtoo?)%BEUryYvK zMn*iO{3AT52GkT7pdMzDGNmC})cyRr&_qb%-KJ?^zn3FgUBym6Szm$sYtC{OhdJ1& z_$md?7h~AAT4&StqKK%Gu+`=7>~`zakD*`}nBb%$9nO0{Xj{PH_99p#G`}Nod$K zRu%DvQ!>k@xz8YN2X_PXpc`)|b9xv3xW|nEsJ__+&UJ^y{URPUWcqwqtR#8pX-SVv zl1HoGmQmR|!B- !^glnexCT4e!y&&&|J7Q`pzr4%PR_AeEtI~}f+lG%?ApMC&^ z07m)<<@C{Fzg~0uKG(Gch8jIKs$&Q_T5!6}k5`NZ_ZOR~5z`lTqxhDB64oYkcWU|^ zuOaU|io_IfZc8Ma_H9cdQUG62WxoDZaS}Ftn^0( hnYV!pv2xU zmeM);VoK%mhvmB3&JEc8$%|t EleOoFaRQ4B8PQ=@x;F#4$ ztEB9MwRx%Hi)|BALwYyOzh~*Dm{19&itfZek@>}DODXZa6v<8D|5R1mu`EBIt*AyD zI+?a}r8z?z8}> MI{o--T>iMf#M@zlm zR6@#(oq6<{M1B>GM4#aK)s_fx4oVvP>sni^uOwA#Es$6*hJamRNpEhZaXlp=f>&x* zoI48nZ3pffkBLo-zYMMihmX>tX}F)2kc%a}n{UZ4*dB6|A_N5h{0|DcJR~Z&2hHEm z=V0^=x7r-6mtG0a@vJJH(?Arm+my!>G8TC=5>sBX7c9L~4sS2(DhV&$cIk+Nd`>Nm zj#DX*t`1VFJve6e$?6hY4{>*+C_u>I`K;%<=kgj(IuIp}s=#` -4z|7f({|-> tCP6IxnIA =81VVu&8RamvKYGSoEr>vEtNKd4*(Srqf^& Mk|fRGRj#i+U14UdF1< zxAw5%-h{~>my69A*Eb@mBq}=KvA%6e!Nozc6eEH9=&Z=wwU4k9odwEoTM;)Ucs4{y zN;J9bZjX92)Ta1UYuGrH+-|HK#1u4}=R|nbbMXhCSTqxFhN$S>8|~S!dXQK$&sjoK zeH23VOvchv@t}=0qV5r*s+T?ZLVjg 9y9Y%C|;Ol&V!ZXc!IUPHzv#p?lN&jnZ8Q}BHbU?KYgwB}%X zR3!;d_?`De`T6o41&Tifpw@;CC>8Pw1UzB7{tAX%T7i{;?fsLcnkUBC`rNT>PF0<1 z#!-B&mUA;*^5JqxTbMR;*}w|zk9|^QRVCW3Jq;og0g1&P3+b7#+&wqtV4caX$dJoB z#4?hIyW6FDD%V)S8uFoVlrOvW`gx218?8f4tY@jgR_#mG;4%vz$)w_kRIbzC^vW#L z Z+!IfVSA1!ZP=gKp`6$c?Yl(Wc_^RkIi|h(}T=T5MavP}xI@ zr1Kj0p Ydy#+Mi({VD8Jy%4x@og` z`ZmWtKS;fFWM$T^Pqx|~9eTXw2AlX+N5(qSc;T7e$VevZkoXFdUy=2$_@-@oB?4{i zxb}^GV`*1OUG?Vd;IvNU(wCL{oo3!k{R}Wtn|{Ll$F7~ORxPW(zXy7jJDB1~q(K== z3gzGL*(+7Ld~v=mvZojI`TA)ATc0g=%KhK<3O^bJ2%g>f%5INBgx}AVEN8O!2B}IG zI8d=Y{84{0jIemP9~TguZx_!6s}|+pm#e1mX~0z24Vxw|(~hP%?Mpl(w4`*UU31;D zxmoqHxS?FHmp1s5v(fJ$(c0AFT-ykZ*T~{C*^epmz9h-fR>$brz&8|G-_F?|R~~Yf zyxtcmyf$W-l{w2;DQfntH$lMsginXrA>+4h*wgpTC0$G g_0D~Py+F3)=2BCo zwxfVh->UF|c=hOJx*D{p!MjM-DS18gOH+ x0?vuSva?Ocjr^Y~eRqYKO-`lCKl&+{ksq5QFDNy?SVoOk z_Z1sW5wg63#ed~stqy-w @V8^90c^A!fS`a+kVn_~&GArsZZgv%o3t0nzE7tpN;l-uy2s zD@5^_)N9fO5CfR4U`X)+%4~GujwZ3kM45fdA=j)SPh*L^jHMNeEvc#hN6nq(V_xP* z$3+j#4VfTA+WJ=1X0w}Rr>y&09WH%xw`>X$`dJmW>SrCrx=V^Pau2nsYj$Rm*CN!m z*mH?*u}FDBgv4*UMwqT+Dk@fadl-A;jU?DhAB#(3;Hq%N&m++LN@A@`fc8p_Ia|%^ z&ggnwXQdhiUD^=$^H3L-{_-)?ibImxl8Si)XIoyYPQI`)C8lbY&vze@$Q1OjO$UBm zw|zdwCFW;)NET-Xdj2bgogi~nr=j evQ2s~ z;oy6go~z<>&-eZ=C-V|q %01L@MV{{OI)45mKuMNB>*v4KtVPHH znorlOG2(yLvT?FQKwg@-s0&aa`qx4_Agv5gs*A1SJ%axA|No>Lr_lUJ{`bRIlz>|e z5&U2NkhyubLNb=WA3pF2Xgf%|`F2@HBoL5}*p5@=h5~egI{2Z$0d*DVQZc-n%?MDH zR{SLFB}335*vo|b?s}aNeva(d$zQfc;u!b~)^O~D03o0=5MmhrvKq#b26o+*n*;u3 z@DNx&bq6Y}v@FP|$^jvFYVBzukbCsL-km@(Ge=@ay~H}N&p>5-p99eH1x|Y70+cd* z+1#+t+Vlr+0aaX}5Nr8kx9Id yA;skK^+d#%2~E zMel+qZ5A&N)uJIR7MhV zF?$Z$Tme_Pj?b@s8;i@QK0yKrhT6A3O9f*G;_Ucco%vb;uw5!Ij*6HYN$UUmn$J3n zHK+l2?7<37vB)*bG9DDu{=iU#eceYO$MybWZ82_bnjf=f;apS>oA6h(ncir&$cOUB zs0=Qh?d7?mIM9;TYuns|!e^EOI@}gJn>w~R|9CcXY>eJ$ew1uC49-~ipwbWMPNKZT zrL@?3pur8mYh(h7AJ9CN#yj_L4J~RJRTg~kFw{Pv6b%6ym;gG3{^z~`4yJz2CH%oP zfkYfd-*^7RjWd88PRDm|71z-akpUcQ!_&+~%+aS2$TM~Emv YaJa=c=oDIKg z3A m>-sKfw*+ZW|z=H+p0%J1CQR z+Hm|cd~B5ZdF`*F2$$?}#IVj)`&q^67lbp#0Y#sg&pGGW*`_$D=Ly5pG*WH80If(` zzPOQF(Wh5h(Y$&(D5`0j!;z(4`arWP3_gy*;;4PsN`s#IWqAJ(R;>q5qEs)JRgD0{ z!Z{x9N}C7*-8-Q!b!81orTW$wQgKlc-U-X%%< zjE!lW&@Fy(u)d_6{X1H z>-|Vf18`7XVg2U9;xLwa+D0;ZM3-v(F`@Nh%Smw)tSW(&eXhN C9;`w z{B_fy*gU|xa5d=`-2GzXpyx>ranGb>JmMwHi+un%O0lc$rQ7#PTLu`_$%o&poA-by zBXMk@s4pHsj}=fUP*_6k!2*zCxu+s2AY=%2-?Ug<89f~!`mwjFB`uKE2y|VXtrj(~ zHzgT)_sMePC%f}n)w-zlv9AC;yhb)c_S-t|2CIs}lkVzpKR_CAvR7VbFDUdYf)Q9p zDo`6PWx5d@W8ltk2I4MX LiY@xn9G4p(>gw}m)oJQ}T7Mt%q@NyI>WF;D_pWZf zJEY7(5zsNQqun~lojwo>>q2ST&rnVvJ11WU&oEVvdf8gUMg;dC-2rvDHPtQ;-x!j< z=U4pAy&&CVw4!q5s;qiC!ta&G%aCHZ0z8;zzM!_~;g)Vojc@1c`Lgl7dGD(^s!l~5 zkIGfsQf}xTEu-%7(Sqh`46!=vsfqbdb9bb}iXIs;7VTU@2@^YXD$2+o(mVtQ@jcYO z>uXw_XEy7-ADmA1q&$O|=MzQ} ^jDeO#$2VmRA%Kv%aknO}GE8da&2LKQsn3=@_hC3#!X$pakD!PST1EJ%PwD!j}Va zWsg$<`uM5_ {nuSbkf)c}0OjYOO6Xi?!#osd97Vo$O_H^fMa+Ff!w^aTl+_=XjM*N5f zHu$wj{5{<$87L`D56$+bw4=%mmbN^us)D4ln>J^TOU!Talxo(y|L%8#qvlGP%4Nle zq3+&pyI@Onu5Dh-1nh3;ImfSj#}=King`wArTP@-plFtIJn!|V%Vx8xp#DOA9yx4D zakX|W7XxLsUj~@?MB_w1f3qbo?uqI1gCNrRkX)K<-nwO^T|F&vi_XW{a__EYjeX_z z0onDZ5b7TkDe$!C>3Gz{HgN^{!{NxQb?gwDN0Sa%fzpTUw{LzzCkOMJD!F3{IW uxhLR3p aDM5~161kTmRKhE zpi-^jQ;rC_vG~ukb>F|@TmKk~0l7|psuP;@>@y+r)=a#JtIMg?t6`_d=M}SIqp3GJ ziTpT=ei^Rg$l81}OO>XPoA~fd$_HK2zH_m#b1_1Hp{{^oxP?!Z`FvB5tF 7`dU@= J6UiCmQvXto;B8JrK6Sn{)_cO1yQdY48ffa-DP|bESTkj1e zTJ#DlJOQ!?l71~i9>mFFU 8)8r`?|G0rM7j!!1}nJ^kMD)FQv-Lh&0kd>nQh z9i@OZ%v>t(YgN+DF9X^yOrmno=b4jM w{M2IA h@$<&GC=MyM{hfNi^3LQ@ko_7mBP zq*mVH3>l@5Qs( 3pZG8 zs3NOLqZ{uFDZINoLCayL+A{YOMjJL!ruea(L*3a^ar`4MNAMLN&p}-h@0wugf~Wll zvt)X0!Pf6d1PkZn^XG+4Ge4Gj#p16o#m{8t2=Z;tfs=uDR0y^nyos6OzIzc%FJbnr za__mK!_;@lI}eQ+0z2;~OFXv+S|^t{X8X>8P_Fiy2Y~6H6{*3gUKswk>kK6W;D(0s z+d1?X*2LNY#Sbu8H4UmwfFs&&P=Du&Emrfu|K^A8UuOJHeRYx0Ity06+v2~UUx1H@ z4-#z!=@-0yMS|AWa-t8HYkbt)K_^9XBt{xhR9bYSF)KUnlFIsBc#cVswYj7#?Wev* z-M4m}dmd81TbJJP6Evxj-qDP0DPjI7sfk_>8CC_L;KYe^H@tyE%0}dKcy+4d3V-{# znzl{w0Xo?{iil6w#R$UH_C$dY3h?KK3I$sh89<4H4+ul=WrE;td1*U$k@W1I4lVIL zh5O6k^cojc&$C(oW?aRbY9N6D`P#>+$#j3rpkH9RJH|-Q^_O6KRMsA3aFaEipKDfj zYF&H^I6zb`ql!jhZ=eH%4D-jcBNk9Uo!}~mPt05<^8JkU+6(m6^4c7!^aA-FVYRf( z_k(a~(!JL)b-n((O;N>!Tc5YgNon7g(wa-HKfSN<-f{=_P_IbSY0EDI)DR@`^03eu z1`pEy8kObp3qF*^ZsYwh)}i1iHLpp(nXD4h#BIw*Av-M8x*Hjwi9Ps?V7a5K3-os9 zP)4c{By1Gg>GNl>M0Z>IyZu&bEA~V-7G^R);AIg*1tYOUdufzNppu>hItMDyYnkhF zRakWBCF=I5mE``XO5b^gW2PwrYJ<=B+z`$v5pq;4^-uO_H3o+d{9bzhDCzUL$%)F$ z(&!QtWb3r`IJ$iYdu`>0v-k8#9u(|##Az#7KKNQTOX=ZCv{`vg5EBZ0|IEw&Rc9v9 z{JMB~TOKov6Hz9ClN(@$aR-^q7{NOCado-8%+$8mIadyo&z2lZKf}5EIjC60)cZ(X z1%;;kXfb@4QcWGq&>mxjM(LZOu=HY`pP7*Lgk-qOqu`f`a>ClZ Is&V$q*Ogx7Z>TL!QFOSjlI@b#4xU@MDgKdh}>%6 zFf|Wc+JqCZn0f5Ej5t~;&11#}eKs>g=PrAO8AqYek6sN5uBG^33^;h^d;lN~>=lc# z`nyjkE*r_7g8lt_NIe{?IWNFwg(*{LBi50qOl3r$17>9M`O<7{+#{@lw}Mz-<%4$~ zI>!KL5Jvgs1BI!PxbG5omMZuCsn08Ivom56Wpba{Kk;oHH5Ht$WY6a|R}tV$|E;Vi zfnU8}h%rqztPyMJT=wwpiGUga4LlW>PLf4~bjh@7r-I%&;NWg;1y-I>j?7R60)K#N zTeMHgv4w-8Dn2M3??&hgEQNF=g2<32nk(r|`gm``f%d+*V^}GFUSq?ITU>!ih4S*u zmk`4jxml{Iw`zLCwZLTH$pi7JmkPjPHH(+dUNA^PgkI@@fZ)k<)JTuv{?Dbsn{hL_ za`?s`(-z)(UY?pMHT*9O??NPsm-ZGkQ1mGvUre#FJLl;yK&dgs==3KZElI)zO3UN} zd>|OQ6ih8Upg&ny(wm?xeYaV!<>}<)1m3YeLwPP(w|Sy0{G0Xo*(uWa0vT|^gUw?a zah`S`cDh_~@*sHWMacOC09$0C7|-$wT=McFqLlFtbYB&z z?;tQpfx~c1m-0uRlaM3@f3*S z_@u>X6IumMD-Fz(M@JWJX-?|( QR4OR9CNuWi!QT6BXS2zWKe#Rb;{) zlwM_0EwrSTm{1{_K$XR{wsypCT$d|6#_(*vwuH*=QVm pM;an_<=rZcu-+6G7^zK6a{x-D!g`Ko(M)CMfNFfzFaW2wrw z9g|KzC*QDDyfsa-Z}VO#wJ3}vZ8}wD*j{6uX>@?FNmDX@$I?UIue`rRpQ@I})?$33 zu)8u(!uEZxifwcwW7ThuJiS)0FUIzVFpNX4*NmHaeEn%>VnhR^73f6bc-<+Y(HYt> z*ovxm$kPKCoA&3hv)l@KUg6~6PqELwp*uA$6@?0CorK zCsQ2$q0xwTTHzj^w8;w`Mv#k88ManAWN{f39E H)&j)vtP<%!vuicu*gUse{g1F zx8QzBLr#NNGiY2Cg|IAuuZzA7{(?B+$W63V5X9K<)0g24gSywNwe}QYlu<^}$L(|{ zyUgx3bLrrej?tr%7oQrwga!*4Q{^MsretXya(~yUiHQH?EK+Im z?f0gG4Vvf}Sz2ldJiJ-qH$M?DiXCGEShJM{Q?6Ok`eCMCI$vaA`?c&IeK*nAEB{vN ziF)b5-X0i;WUJq{Z* 2d$#je>Ug0tt#@ zD59H91T(c KV9OJ9q2>g_6JKj;%A*P(z)12u)l$m-)VYK{KaH;czbJuqu%Q1Km| zf)2^$80m3j3>J<}UCfh|v#?SZVZSfJO=PZURr(kv8JuA|FQ|hVcObH3!9xYQVtTa- zMFd@G(II5^Aaqi3) L#*G%;9 )-(dGPWQ3s z6|DWc= B1y6lT93Q|E`+SITV2&&6nZzh?I} z<5qq{eUpg84)M84&k9P@^{hv0mL@V|LNE7Mb 8rBO0&mKO>%M|`46hT6 z>1sLNw_k0JDq_F?-kQK}FV!oqC$td}>0wBg&+DOKIiIs^uc-q5VB^6QXQ;l=oIDMy zzTXYBzdjT@)xCLt^hH2_lhKSVd_l1t!ocyCp5A)FUh;!es `(V@&;g<9!b@{iE@P zjotStW4QzseC}u3na42C6OrM>n~IE!{)vlnwthJXWwDHMOT&8Mg0EUEka>ab7b@*{ zE8RxmM+O^$Y{8WaYOD?7hq42u{1-+R@l1IRQtMc_q?ba&%G7y)zlg1VLgGbZz&N ziYUcnHAYmunV@y>Jhgs(-1IWP3=+GQi9+d8SBZqErDTOcKjkN-fY?Kwg3SnWow$5a z%H#eyE+~*?zrBB_6*?!RpFOoWpn{AWl49IOGJ6fOzHFiIn4cD*=0({{IfdaBuz zDbg*tS1K?rSrV=$1--9j#IIk_$gWmQlYgs>bmcL0i(_)RQTDq~?Dbi*C9syl7*f^9 zRdHK>CmqD1Xk@ehUfWBVjlmvdmooP~oKRczUd{I?AMu7Oj`jePPKcPe_kGUyCzen& z@q{nL zVX~e6=y$ASO$w^gFurho9*POMPrmw_xlvIiS%zO&Ovlk{`*FEjn%DAvQa`b|4>NpZ zKQAm6o6S_js5^#_4k}i|S9Y6SVA?2}c}zi*gER;nM%jjNIURGvSCl>HP;khtY>nL# zuA0y{Mm^*svFA{s^c3C6jbZl=D9;=?N!X*XYzFg^EZHff`cQxr!-^<>oCFt=jLaNZ zKD(dVNpY^eA|Z-;T5jf%m<+-R6{_ZFP#tK D1JVWMlo5x!72lC%oz;FoB9~_s)THMsq#ps_FAOo?Cj$2D62rg@j|iFq!ZC zU>}JFUO^prrfi_Sv<(0KbQ2GBqg&XguXl7u@RR2aL!RE;;}yNy#QU7Kx^w)~ ?K@XrrBes4+ZNuwYAbARZ*;;u zpYWFI{Z#H^QrkJIn p;~+$D4=|8-%}itsV)j+PCo|DvY8XsVXCA8})c8YoWgJEu{mA zvDm#!jF*T1q$taO&F;(17ER8M!JxN}E)xfz1r16l%HezOoVU^|2k$cX4_S3!+U6Z8 zN2@Fb25GYty8x)Hqe6mQdifFeNg6K@hO)je(YmWE?K)P>-uapej~RbF2_yZmcH`T& z>I6!(aj{!ve*88h^;oM@{C(*QW kWJ;T+Yuk|ujG7=R|e@F5(icFKftC}!8lHiulG?y`x zu_i2egO}1##ZgiV(q1(o*_keXL-#@I$yMcL+pDqX5Gf5ve=2f&En_t}<+I8SKTfR6 zi2G#v&~*sg` Q~wvNyNNn* z6yOFaJi77sy&~j+3i+$#R|NlZn}2)^e+gVr2jPkQfiwp$nY;py>5n^@*#EA=>rwz0 z!ZpZxul{|n$GEEa-6!gQL;1gE1A3E&331PF|9!7}vA{Tf;QdJacSZmIX@K8&$^|KC z{ymHptT?uUJf@gyf8R@%378iDG07hT_WzzqtklVX;`J(!2owoVkpDO1_{#$Gk1Fgp zOTZorz$SXisliC{_bdTsmClU?|Ff;~fQt AGu5Ie;URC;vaX(Q~WVL!0P3V0OlsIKm7?|>$ciE zU(!Eky9pj}m-nB4Zv0d1^^ev5 BlfVFRR@p3lc4A7(H zCQ|qxZQK7|cK1|(ak$gDni+7}w0KdL4J4!`{I@3kOBu>Y1gCxo1?&smVEzWk%Kq`B zM`}RlOZ`19<>yeG1lmsdCA!>21*w+sZ?7wkTg?@(Z|o4>`H1)D3i(=yFI;4cpVsIr z4{i#R*V#c}9x}*g|MjFRfu^_u{qEVx myYfK z(sNM3u2eUL>+|*gn+LjvOJBV0Dfs)RRTSbDbnWYyn}5FU75wWs`PwVds{f_C`#)ba zQO9v`*!Df5{`c1cT)-8&%zx`=%EobUjK{s;{(H{d`v;ecxMc93<9#Ji2FJls$o$^m ze;)f^4w&~XFkh~C`4ay*QE) j0I{&Vi` zvio4%%KTuZ_=f?kIkbiX#|1rpaR>=RZ_y4Sr|1Y?# ziR0g$q|{n<7BL(223~{o7yB&YEIj8+7PJ?&7!Y6GkU#e8`-_8x0F6B&)4x6RSDaXK z7GLvjKx_PIBWS%TT2jK)`xVLGE?x@P1)0UYJhVkWclJAIU6~vsb(R!R6fqUx@}ofE zwPYo`ScZUwD Ar{3Hj^l)aI0KBB2WwsVWf`r{r>xxN!$;m^=~4G7oj zY0LM%Z%_Dd3JK0w?k^tCUr0JG&iIe)c@Z|e#Rmj$0mu!IC-^~+-KFRG?DYZvkI}*@ z$OqGusAJqTl2W&Qx>VgokAI1wXD>V!zL|g7xU0g24sxx;ODzXF3U{~@b>*-9@%3}Q ztK0LX9-jO4>D;U;<+GS3kE65EU@6}v=I-Vd 3HoeUoFbXzUEhA zs-H*Z{LLNKi7Z6N-Y+SivEMYGLgY2-NT3G>xuzP%o o?Y$A(i&tmY{OEk c>e)qQMuPWN@lhy5wl*e1K@)4C)6P=R} zIc$Cg{;zWcVwgrCcG?1!Ncf@=bTvHzuFe=e(Hm!~^nOJW*_oj+`yRd1I=unKXRoB# zo} AqUxIhrfR^^|w7{_EPTP{Y?9Fi?Lm)0o=EWjw&yHu6NhR{wbMas+0hxz4y6 za2Z)1!rW!k>(*X+yQzv0yRfraGwA_wIG>zcH2c+-C1&o_e6%!v |psh$>)Um1DzWe;}PN$(y+(f7qqkCmsa$>r@6i?9tJt~$4;)nuc&Wi9oTle7RV zT$Z-v=;Zy;1TFMOimitT = z3=3VZ`C|?CHYUfnl7bLPRDqCteLOt^s@wFJm-Jo}2{DH+IfzoFbnLTpmAly e7;Br%@U}-~X@@l<9UQsd{n+r|cFnZA2)gozgZ#<} z93V Vm za5Q#1zz&R62xUt8F#bT6?#qfjhoM?&`=OImW#@$ZZti{ycDL=^m_gS&KHf{Pgh=&B zW!2HuP6cdyq~nj$@xPc1xER_Vjt)5gH4#MkzlS57og;7uK&9Lh_a^9OqfoCgmCA2_ z)U!<67`}82vdgCNwa%=?g)|q#ZN>BpmU)?6t)4?;Z>cv<{48|Ms`K@2yF!BBt8CB8 z9XqC5k#prh$CE6|ocL4#^@$~=qi=p?;udb}@o(G4X>Vf{%2$y(#tzCK{u-GzU>E9n zRTS HVbDX^+GKv{kKY&k=oz2)lJ4AbQtt?QUkET^j&dN>m-97|e zmj0Z40y!%`Y5d{te^EZ3x5nM#GReE+kckEMRx|7gWjpHrG(g}c0JmGhqKz+#u{)-! z(8i!Y0V5&gKVGja-NHg{t?RW9_MD>;dWN0mnd?`I5XuefeFHAYlsqL;-`k-q8;taZ ztK^bNNrhu^o^vkGF4~ZWo6dZ$omYoo_eZj~kFa9_BckX7+iWp<|IzuGgy$#Dh*B8{ z84`ywpWpG<0XOaWNCBW7hZgrOyv>Q_zYH>f+Z}U8RH9#K=Qbu6Y_|nqW>PcIhS6?c z-qx#V8}9#-3LdN%EmNSY9p2UFg~CM93fxC8tPJV^N6aa*F(DEy%MvcncIjk{y*3}u z)MI3}_VQ6*PG{al+rkaDXpZW02()3(9kq+tfgOoCo_GC8PpR|@m=OFG*n<&c;j$UW z6mQ2Rr?z-)oBpi_ljVvm@?1_S5)%> _60LDaYGr;K@p>(+T* zof6nNRhvVenks$QU+a6D)AGm|V!EBV@GF0K)Bj>orOdQ0