From 236d4cea251fc297bf926764e8c3f49a59ed7ea0 Mon Sep 17 00:00:00 2001 From: Wouter Wijngaards Date: Fri, 1 Oct 2010 15:01:49 +0000 Subject: [PATCH] Fix out-of-order XML element parse, zone name check and newline filter for unbound-anchor XML parse. git-svn-id: file:///svn/unbound/trunk@2274 be551aaa-1e26-0410-a405-d3ace91eadb9 --- smallapp/unbound-anchor.c | 161 +++++++++++++++++++++++++++----- testdata/10-unbound-anchor.tpkg | Bin 12942 -> 15252 bytes 2 files changed, 137 insertions(+), 24 deletions(-) diff --git a/smallapp/unbound-anchor.c b/smallapp/unbound-anchor.c index 6edf88209..bcdf61ece 100644 --- a/smallapp/unbound-anchor.c +++ b/smallapp/unbound-anchor.c @@ -1129,14 +1129,41 @@ struct xml_data { char* tag; /** current date to use during the parse */ time_t date; - /** do we want to use this anchor? */ - int use_key; /** number of keys usefully read in */ int num_keys; /** the compiled anchors as DS records */ BIO* ds; + + /** do we want to use this anchor? */ + int use_key; + /** the current anchor: Zone */ + BIO* czone; + /** the current anchor: KeyTag */ + BIO* ctag; + /** the current anchor: Algorithm */ + BIO* calgo; + /** the current anchor: DigestType */ + BIO* cdigtype; + /** the current anchor: Digest*/ + BIO* cdigest; }; +/** The BIO for the tag */ +static BIO* +xml_selectbio(struct xml_data* data, const char* tag) +{ + BIO* b = NULL; + if(strcasecmp(tag, "KeyTag") == 0) + b = data->ctag; + else if(strcasecmp(tag, "Algorithm") == 0) + b = data->calgo; + else if(strcasecmp(tag, "DigestType") == 0) + b = data->cdigtype; + else if(strcasecmp(tag, "Digest") == 0) + b = data->cdigest; + return b; +} + /** * XML handle character data, the data inside an element. * @param userData: xml_data structure @@ -1148,6 +1175,7 @@ void xml_charhandle(void *userData, const XML_Char *s, int len) { struct xml_data* data = (struct xml_data*)userData; + BIO* b = NULL; /* skip characters outside of elements */ if(!data->tag) return; @@ -1160,14 +1188,19 @@ xml_charhandle(void *userData, const XML_Char *s, int len) printf("%c", s[i]); printf("'\n"); } + if(strcasecmp(data->tag, "Zone") == 0) { + if(BIO_write(data->czone, s, len) <= 0) { + if(verb) printf("out of memory in BIO_write\n"); + exit(0); + } + return; + } /* only store if key is used */ if(!data->use_key) return; - if(strcasecmp(data->tag, "KeyTag") == 0 || - strcasecmp(data->tag, "Algorithm") == 0 || - strcasecmp(data->tag, "DigestType") == 0 || - strcasecmp(data->tag, "Digest") == 0) { - if(BIO_write(data->ds, s, len) <= 0) { + b = xml_selectbio(data, data->tag); + if(b) { + if(BIO_write(b, s, len) <= 0) { if(verb) printf("out of memory in BIO_write\n"); exit(0); } @@ -1266,7 +1299,6 @@ xml_convertdate(const char* str) static void handle_keydigest(struct xml_data* data, const XML_Char **atts) { - const char* s = ". IN DS"; data->use_key = 0; if(find_att(atts, "validFrom")) { time_t from = xml_convertdate(find_att(atts, "validFrom")); @@ -1288,11 +1320,26 @@ handle_keydigest(struct xml_data* data, const XML_Char **atts) } /* yes we want to use this key */ data->use_key = 1; - data->num_keys++; - if(BIO_write(data->ds, s, (int)strlen(s)) <= 0) { - if(verb) printf("out of memory in BIO_write\n"); - exit(0); - } + BIO_reset(data->ctag); + BIO_reset(data->calgo); + BIO_reset(data->cdigtype); + BIO_reset(data->cdigest); +} + +/** See if XML element equals the zone name */ +static int +xml_is_zone_name(BIO* zone, char* name) +{ + char buf[1024]; + char* z = NULL; + long zlen; + BIO_seek(zone, 0); + zlen = BIO_get_mem_data(zone, &z); + if(!zlen || !z) return 0; + if(zlen >= (long)sizeof(buf)) return 0; + memmove(buf, z, (size_t)zlen); + buf[zlen] = 0; + return (strncasecmp(buf, name, strlen(name)) == 0); } /** @@ -1307,6 +1354,7 @@ static void xml_startelem(void *userData, const XML_Char *name, const XML_Char **atts) { struct xml_data* data = (struct xml_data*)userData; + BIO* b; if(verb>=4) printf("xml tag start '%s'\n", name); free(data->tag); data->tag = strdup(name); @@ -1323,22 +1371,73 @@ xml_startelem(void *userData, const XML_Char *name, const XML_Char **atts) /* handle attributes to particular types */ if(strcasecmp(name, "KeyDigest") == 0) { handle_keydigest(data, atts); + return; + } else if(strcasecmp(name, "Zone") == 0) { + BIO_reset(data->czone); + return; } /* write whitespace separators to outputBIO here */ if(!data->use_key) return; - if(strcasecmp(data->tag, "KeyTag") == 0 || - strcasecmp(data->tag, "Algorithm") == 0 || - strcasecmp(data->tag, "DigestType") == 0 || - strcasecmp(data->tag, "Digest") == 0) { - if(BIO_write(data->ds, " ", 1) <= 0) { - if(verb) printf("out of memory in BIO_write\n"); - exit(0); - } + b = xml_selectbio(data, data->tag); + if(b) { + /* empty it */ + BIO_reset(b); + } +} + +/** Append str to bio */ +static void +xml_append_str(BIO* b, const char* s) +{ + if(BIO_write(b, s, (int)strlen(s)) <= 0) { + if(verb) printf("out of memory in BIO_write\n"); + exit(0); + } +} + +/** Append bio to bio */ +static void +xml_append_bio(BIO* b, BIO* a) +{ + char* z = NULL; + long i, len; + BIO_seek(a, 0); + len = BIO_get_mem_data(a, &z); + if(!len || !z) { + if(verb) printf("out of memory in BIO_write\n"); + exit(0); + } + /* remove newlines in the data here */ + for(i=0; ids, ". IN DS "); + xml_append_bio(data->ds, data->ctag); + xml_append_str(data->ds, " "); + xml_append_bio(data->ds, data->calgo); + xml_append_str(data->ds, " "); + xml_append_bio(data->ds, data->cdigtype); + xml_append_str(data->ds, " "); + xml_append_bio(data->ds, data->cdigest); + xml_append_str(data->ds, "\n"); + data->num_keys++; +} + /** * XML end of element. This callback is called whenever an XML tag ends. * XML_Char is UTF8. @@ -1353,9 +1452,12 @@ xml_endelem(void *userData, const XML_Char *name) free(data->tag); data->tag = NULL; if(strcasecmp(name, "KeyDigest") == 0) { + if(data->use_key) + xml_append_ds(data); data->use_key = 0; - if(BIO_write(data->ds, "\n", 1) <= 0) { - if(verb) printf("out of memory in BIO_write\n"); + } else if(strcasecmp(name, "Zone") == 0) { + if(!xml_is_zone_name(data->czone, ".")) { + if(verb) printf("xml not for the right zone\n"); exit(0); } } @@ -1373,7 +1475,13 @@ xml_parse_setup(XML_Parser parser, struct xml_data* data, time_t now) data->parser = parser; data->date = now; data->ds = BIO_new(BIO_s_mem()); - if(!data->ds) { + data->ctag = BIO_new(BIO_s_mem()); + data->czone = BIO_new(BIO_s_mem()); + data->calgo = BIO_new(BIO_s_mem()); + data->cdigtype = BIO_new(BIO_s_mem()); + data->cdigest = BIO_new(BIO_s_mem()); + if(!data->ds || !data->ctag || !data->calgo || !data->czone || + !data->cdigtype || !data->cdigest) { if(verb) printf("out of memory\n"); exit(0); } @@ -1444,6 +1552,11 @@ xml_parse(BIO* xml, time_t now) (void)fwrite(pp, (size_t)len, 1, stdout); printf("'\n"); } + BIO_free(data.czone); + BIO_free(data.ctag); + BIO_free(data.calgo); + BIO_free(data.cdigtype); + BIO_free(data.cdigest); if(data.num_keys == 0) { /* the root zone seems to have gone insecure */ diff --git a/testdata/10-unbound-anchor.tpkg b/testdata/10-unbound-anchor.tpkg index a1bd9229c4688dc6c00841e25a611f8ae5b95f64..0eef1c1d9cc9bb5c9b6e667d4f19f35ae1c8d837 100644 GIT binary patch literal 15252 zc-pPFLvSt(uqGVaww)8(wr$(C?c~I^ZQDArZQIT}U(Ju2#a&KStEv~h=zdy+F;GBr zucfj;px4?u$=Q-=uhk#uo%RCj)m4Wy#2ZS8&?R6fn9xXFJ+4H8C@3IN)$^i&H>tnV z?h4&L?iToY>sS`5DM>v!(;o79$ zfdv33VQio`py5m7wY;0}*FGTYlseB(jEQySL?8I_tLpRSkiV@Rj^uq58)kcqGV5yw?(LpZ{x--XF__wpM_FYUUP9*;p*jXmmA8cNAty=qKXI(7%k5Ii)J>Mu;;@wtUR&2zjN5OS_Br; ztwG+!Z#?{fP7LV;Zk^L_ZGDF?*bmqeamdMF`+*RcNbV@v$I8KLM&B~+ye5`a+@6i| z98mrxM3d<4ke?!Z*3#2^k#lDG8gs)*Fm|d*uC%H_9qq)Quaj+S^)>7Gk<{rL*Dn#R z>LG}&Np{M$AycpsLcXIj=(a`Fa{kAs&yyGCZ}?h(FN@g6)9R;kyBH#!_5sU16>)1^ zqcGK|6#u@lpY;Og4&s(lmdiMK62hdP>yf?Wok8TMTh%@tgv)JWU3^`XyWF^1{7`}S z7jqpN!*PfqIt<-4S~5EsHnZihTJRF}!cZuk?B>%^e)2Z+%j45+5mt6&s=*vs* zFic=y$Ytou>$;)UMC4&r?pjOE@^txd70}eiGb_6jbYB@9N_F*H@o8T;pmsRg?sn@& zG_h)-8<)_A_VO+gOV!z*dGb_9TQFZO#td#xC>(=4^2jHeHU>tFRNLs8g8O@Eb*?Bf zGaIOMyaZFelC*04%T$6HcUGzUjJcw2j_;dO2Iu1%u^aWU=p)*N84hx2xvrl z*bto`Ac8)t^ku$C-s77&6Hz%TJY0<^amclwt(VD^BxJ`~hb?tyD zBPLWQilDhh7cS~%loxCI z!Lg-@k8Un6YIWF&>bH0e(5-QtK=)tOC6^<}pXahW@#QWxxIXP0oINPK0^r6M^N#}R zW!N6_4=(Z_01_z|I~@t*1^y%5U&&jxR~MAwfeZ9f!@dEZf$e^Gvas6BC3~pahnPx< zen72#*My4?zl_uB6ViWCE1OwY>Nh;;;pn|qx2Pu_&E4yq$2~OJA`k3jA&pGw#TWV8 zU^n+2l4!46`TubrFUXsZdo9nD-00`IT?MfVig(IQm-eB>^S0s-xA0ubOC`^+=SJeV zEUbp~S)Lud6kZspKAw&b$ga%2u{2i9B_MLm-t@8_|2DebEN?yf%podmaonZ^7_n$RQ_KaZ8RODR$3f6 zi&4H}co(TYyw%<)P$=;5CHXn#iXKF-t{}LQWXW!M zn{+jN<;}ky+U7d)983$FbzH54WrJ_npNHIc=2IH!-8fT0n^54&K;i8JPbdAo|HWQ4 z5WK6oW1OFSBgusg*5Wn%`gXr22lElGV&dS}H&Wl~Y39n>x$&7_^R_4`D><AcX*R?A-*pNz<*+{O0?Kk{YX#?Jy1#se;?%k2!1KxiaW&yVCTmUz& zuD7S3y9BBLBf#A&%6@>$ufxq=kHY28HsB}n@#!1z|5MyMVDXmRDUV{o1mk%0!{Fdy z?IYhDEBXfopw;*ByJk}Pzk7nw6ah$CDemF zKA~&#Yx2H;tc_IEWT*V_4nO2w&s$(&#V_dm3YLn}j@&DlAzDzI0O-ZfS218&zU9pb zqRBK{!yX4nS7BBt7B_ks_8uw_@NWRInHQczjDUj4(S#5Uo8XJN#%|EM(`skJV~Ri! z{nRH=%+9}&oGDS|a4&U$j6iVs3a_M`aSoI)XQ>3vPj~XoJ{|y`A&W+?hII#|zKEDD zg-x+2%LD!q;V>CSzSjq}><`LkWH3B+N{`V}cwwK!Y$@Qi8x)<)`y31@OXa{A$yggc zf*D?`-=7Y_@=Su6Z@c7RoXl3>8#WRHrzzAw;OrN`G(dUsJwhx0PPKNpMTGuEHYPCW zN6l%pCMCi#)kn00Q<3|g`kwE)7}Ait>dIm87uPAPtL}0Ff(Gr+pXc;jjCUj+^{WK< zO0pToIh^E8u()c&2UMgHetSfm`T^yfBwip7&3jqGmgS@Hv8y(U2yWeKz{g z@~}9Y(zvG)500rOhQqBUW8i75O;}5kz$=v{M>J?DLCphsFj12(=F~)6&<#a$Q*9vj z%*lB>739-4BkhbST+4$_hfVs5dLV6iIa93x#-JiOHSpx&XSs?km?nb2qL@ov<>v*^ z0kS}Q!vZw9#>8bwQ{I+X04Fk*NCB}*$^$7Hnp&d<-FTt#6?{9fIpiSPVF~rDnx(Pv zQYRPNA26H~vQZSZ3QI|E>%QSD2tkBJJHtsuHJvmHoP%)n>w0uBkf9P)a2T2{mO&cn z=qSXlut%bf34g$QDn- z;z$=%tGJFaq~ylaU^Cj+ZE-_WEM?lJFj)!Y#24g>@ReY;_Ic1#qv3Eb5iruQZYRAA z9qABkiqdm-=9!O{&bE63T(2Od!A}uhE$ah22bPvu!;I>1+Yr&1Ur@~nsCE z+m(9Vw?Z}w#c&|$_{B(n!tHk;agmQ>`i_OHm`BR}{7CasFt7Mw(bqz+0o>SuVVR~l z$s4!i*uQ_xOmGE~#nO_L4m**tk9VgrN;1PVRD(nWQN5dtT?Wu@3kwP#+=NMRP>EF{ zaJ>1CG;xth+?{spasB&OtR~ttG>3ZZ)$KCg1IQu}Syx%+SlxcSvpW zkU`krU0j@sup2#`+FT8Gb5WUFj?ZlG7UlNFW`Y@n1CqdfyL^`ZlKmO~Rtv=N{`GzR zUGid>eC1baS@{}K=Kyi2}u&H8^h*w*oxT7@%(upefaF(>!0{p!!1_$Dq5xOGb-X>P;JPGd+WDnr!`Oq zmKVdW1AF_33kkRh46xXn%EA*%dVYGOZDIRiwArLVinOWmnE{HDLE%7YU|$_07t}=| zLeK)dgI6{&H`7=&Ra>-s{44X47Q!RAHRuQ+Ao#fGeCr24Sm-q`_Va)L^O){%_9tig zVKm7<^9)g&RqTwKaTV2nENUF+CwSG@vv)viKm22&V$7Y?0;iVQ%8tbHb|fmvomK2v zt0ZFP)*8lUEnrbc5#zvgyyE)}8R)H$5C+F%`Y9>@KqqAY|6Wbz$1a0!KAzx)f_?xx`9}BPNH$0Br6|IZozHzHp4xy)jM@HnEW3SqykL zg3&ZMvdenEg920?L|DkMuVm1LCSy7kQ}a#rN4{q`ZZFlJy`Mu2_AXiYsH`O}_otl< z&%Hq;Wa?j^*j9b<*4`kWO5n%wp9@%=9pga&{>^)tV*$42KbjB;=RabzBI zF+6YAKg?b?%iew&5=Rsra2-A$AtbRciGBPO?#&7Bx&WKivWlOp^}P{`>F@x0X#ndN zMtQxt*Vu(fI)mfq@~utI>H$`B`L>^|Hem#GeHqnM<=Z&Lb@oO=y~n6%@-FLT1fqbC z+D2T~rz`(!vw%n8Tbo@!j-l;a=br2a<7Ym`{dMw?cKzXjX!ST+O-7^1JYU++pUJtC z^O)pAhPk8MaRnoE3{rf&s94+ZQCojI%S_40U#99xoPJLP#(J90*eRDa+H;pK?S7Sr7RiZ{3aY zhJM)JsmOY#3^a%RpV{<$&n>7gAAi6|rh(@yj+yAsNtF>}>2(Oi=bffdKsz zgWmy2=IgKe<@x=VIQ1<5g(c
    5OH2XF!ae0i8J26E-*(G=IzCVX2pHwx*m=~4c>1@3*=L)Yp^yXSs&+Z3dS)Dk<;7NlH{G$ewz z+oI%Lk2DJ|(d|60SIQ_jpEA|?+qRe@MiwZ(i&Hyof$3xE({%wWAuAtvM4vI0(Ot4` zt@#J3SFIK~)QA`q^+YVD1&MHRja~E%?2zTVEXQS7tUy606utQV9Oz2B(+FLIsyfa{ zqI+;g{+eI|#xjYyt!qlR3oA*a%kX|IZGph3C5a)~Cdtw!g8Cc2pv*f!TD`PRFjYXp z@&&FOj~OmQ{&exNNhS5=zvY?!bW$7pWzoFu8QI7Zg!8WWuN_c5oFcboUIMmxabxN* zY@?3DhHM`-NYOO~wW&`CmnW`x)E@*;a_#P920>1Rb0iJmE*GNs>F_oCN8Rd{=5Xc3 znc7tySO!f+zQRsp^7s_8Zgh>$AM#ZD;F!m2^}hMWv^K#g#DBqDgtRT4|#NW7vPdav3=2%J4{prm&`IzS;5dZ<{@PoNJdj@GyLJl zV2m;}b<5ytqml0(3{P~oy>Lmxoe$+PvTX*bK}JGc&viqF%{&~y&LQ4NdYf_Cl(ukA zm>JJ!dNG8g+BRPC;uglVNciFpziQLjaGSs}*b;-zrfwj+KvKI()$}pjCKuV9%G-$% z61n8|L{L(f_++myi5?4s5)xzbym$QdfR)0!Z%7io@SumiI!zyU2Akxv(mfzm`-Ry` z9x0=AZcykJq|16Y(haX-C{b#(8q?teH;B)Jj)rEeDfReZEf~9L)SR6LRag>GbI$BU zQzJ68G8v}69k|;84rgBq_dNyxz(?W~0F-Q>=MVs5Apa0R2J%k$0C@BCSNqoJ9|4Hf z2jlLI+P};^_?AJNitHP?1d@6IX-KSXWm4E5Cnbpt`ol|+6zG+9rjgDoGsL)Hj!J+- z%+!*iuc^775`l^C3k|3^1{^hnYL7w3a6ohvR)B)eN-#iI$lkdBBY1s|-Vyv-_n^ty z)UOG&TuQA*!RiY#bmq)AZ7mc9=>=m>s&576=%8Typ(QeTVBe0IaTeMvglP^9NcjX2 z0ohJ=KxtP)u-xmE4b1Rw$$}+Fq5mS?@|Ielslv_*grbn~af9+%U2T7Qarw4rODi>Z zQO+w~=3b349885}3ZLZ;i)f)Tpj$!YLzw6Fm7H^l)pBlFuCbR|qs~Hu(k!o{QAPX+ zo{t~aKZyveb_Ds;BYJNcY5~JacAy7$eDL5tFcrVu!nOUph1*_;p{0Y6MR_uEsOo6Q zDGKd8S}GGrqs(If@eRGIOginu6&obexOs!liWpg4+@fhNBc=w`?mlg4sY9jQa0e4y zLeCK-2p(_(23nFB-GYZ73D0S6gk~%AF2JLY1ASk8XBcWh^^c&VDlEc~?-si%08=R8NPg^1;6MKr8#6_TYrcSNN9oDmEmWv3~CNOcJZNY#waZ zdFVXKY(k@l5SAg>#!v;+b;osW3FVr4TeQvM(wB6+uQZ7Uon{_ojIH?hNAy*jVynO= zlVs?JS?n^9Gn&*%G=6k;yZlwi;N|^;q`f-cQnI@rh9)wbW<$p$y;VB`7HV4 zTDS{Zkm|pi)&-3|eIom)*5c~)$ijrRMC{zf9`o4HIBzf+^{=5z_6!o%C+!Xt9tcFc zNiiUXnktO#!5H|K6&NfO1ns@7(s3cq0RbX_CQG|4tQMUdEV|a`RHORDg$Z}qug1O4)1tuKIzm&XMXY+ z9}mIGYS|i0jo3}dP6a(6Z^cs_Xhe?ZNGvjtPj92fDfHVT?d*ilC7)n%T+l3O&yXwNv5EjATd35Y<)4!HY%xQHW(EgfDZ+ zEM~gdYEIX09u;7HeTV=*%$&nUid}oMqSH(~Iy5d$u0JDL&jbh=n*(Q;+-|A^5;(2> zqB)-KNCu1*He7oQj4>lwM5R0~M%%n9OffFpE$QsV@~a?9E=C2lsd}_JtRM(%;|YIC zX-T3@>PGBV%$zAc7CI1$vG<60PFGA1TETcD0m7$Mc|!86#R zS-@hrW5Z#{Z6&x{sJMPTA>O_pio_|+wLFNmvnsGOuBZADq~LiP@c#iLpvdz;_EU`| zSyhOiYc@VWpzKV%_P^@g-`xZHxq!dnKM0$?hXDZkIgdQRZtvwAr`kSU{U@J1y61GY ze}W45?qk*7k!nzT&m|wAxM+Sc6$?R0dJ4ZJ2xfgzZs)~qVXs2car4Ac@L^!lWV3@@ z&99XQ8Zy9ib_;g;wb7NYLvt=rB=C z;xkc8Z)vLbFaa}MWzv<}e)j`D;ujDu+XJ1oMRkou4HtsH(tb8Tojvb{S?v@fx5Tjt zC_+|ny~ph!wJ7kPVHsT{Ir@<{QO2cY)`#YB_VqZqDZ~~FDeIpQxu{5*Fh8CfV{A?xUnjCk zWtUj-5?RGl%&g$aDJP(-J}15yn_=>Lfe8WcSh%6T0%P8b2%!I+8#m!oTzJua{czP9 zwMo3ol}e_t^A@xb%GC&9b@{Q_eG33s?C#MHtyp)lO4+>nI`netgh~-v0wBUMWi!Sq(D(AW39>@%@7NRzPe%` z)1mZ>FI_swND9|V4{5KFxwS!~TpH#I{8@N@H%*PtV|O#l(F5SCi}(HdJjxGH?gO&5 z0O*as21g{MZveIP5o29a>1fu=g?E6p4;>#;+OapfXC1c2jAYyyJN-5wd3UC zK)rn7Agw$?Cs#Z|CvUc!n=celU$dmVQZb)AgVEj1T=>R=6YAZ_yDJxk5;}&HuAxqW ze;V2_xn?&aQk&-vZp{Y%XZKaTYEU9!NtU@vrZlZ(6?-`C@1&^LPdt5UXN+uBk5YN1 z+$mJG_q};o?6Y;XuDpdwHo^<;4s-;YRZUYAkMVCPFEV!375RF>y^x1AwTXJ1n)O4XJ&UzN^%BHo>}5f4MNE{M+*F>qN4YwE8&)ZXQ1*XE z-`RB9_l*F9 z05Bs1iU2m`zUr3%79hPK0YEwffO`^P;sM}dHXfaN(@`8GK96NWIUi39XL;RaC5~gp z>YBCFQ5a$u(#CyZl4#3d% zJ4T7=>0Y3T3Zi&&Szx%oYL%({h}JX=!O;GHVv19SRW%SVqCYG!H85EJ|8)Joq93o3 z3n?_d*%`AJ$kE&ye*dQu>Jf|xS`l;>^dC?PNFJTYUkTs@pfq4!AhbZBzWiV!01zJ7 zHRv~oA>}^y0K$NCAf_S+r$0onFXTJkJ%S;_zSe*NFb~ic@EVYAp!tASARvWgLLx9E zupQ_NcncU2gaAkv@gC$k@FMVtD%cmslh6_AzCRE&&;nQoCyJ%*l@})CcSf?n!VDXNYS^XUJxVzHcu`IRI7xOcbb>jAV*xNWQN= zFarcD2x$rQHxOn(cK~l-AqvVFssZsHsQ|kGLKfUt18xq|6ZRfrpL`%DFap>E$Tg5= z;Lm{UKqnBIBFMWXNN^8a2k<^*29UNOs3FS!5($_W>OIGR{eb!Z6DtykY#)}20TQSi zhzD2!gdJoRNFB3mYRN8)QX40i2#y*pc-}PtE`VVU)0IW1t|R0lx2Q1K02v`i{ArZ_ z6^vx|RdYS+c~P%SQm{KDS3c{AZB$L#rI&;N^Av$c1k2)J$h=f*twPliYf2~FtUB$^ z(ftXODW5?Of0`_f9~tFQEC;G&aoRttFB_!|E7;?+txFss$*8CoE?Z6HX=SmJxcOy9 z+W*$$4;Dv|)4QWqbO!6en-ilwnU97f%7J0Co41Kf{VqB>dWO=5@kkZp`=roRW6R?` zDVoga-LKYq7}gYhRf`qISBTM>@n^^}-jnGK!M5mPOO&M=qsKgU;p8~;YgU9w<(Am# z(;`L;J6}Tv;kYVHB;WU!U_HqzXFkh+g!nF&mntXo~lE^w8_FH*j8bXiIkyI>bfga~D|ZD2>nPi;nH z$VyIg;&iu{Hf`Z)m6f$asM_dD`Jtxy3pc<7Z9MRTs12ny56e3@)$Y!94Yjzb=uX24 zUGVbAtjDmy4tSD60T8qN8M>OPgcvY5{`&oSQ@n!mZYy3q( zTH0!}C@NrFBXxDo4BoCM87f8A@t~mqDh@eky&N(Zu}92v5!LoMeT|*HHJlGx$Tya_ zpdee}Wo)#@8&v(Bg#}|$X@-CWCq+)!Im<~PS|cHENyBE7aUPGYym_u@B(s4Mr8P*h z7Gjoz!sjQFc!?*PQTQ`%{EFs5JyVr63uBL_!rID8v&Cr7F*aOxVdr;R8iDb|1qvZ2 z$;}9o#>1M;LD-EWHO@D2|7dYL(&8-}uOGc(vhZ(z6msU;$}$kSdai=ict=P>OlAf} zJ2z+kIDP^pl-`vM&mN9c5*jfA02NyeDVHKH-K?oFE;6}Vh%>!u`yXUzh31O7_Wd{mhus!5Y&* zxqsUWyiMm4M;OjE>v*dNK~P@pcS&Sdy=$}YSl@bn&`HV7Axs$N6u_lEdt&_2pFiHQ z{V4P;z+8rxOwJM+LYetq&zNI!)E^%Lmk#I!%~aY6c>o|Io&rLWJ37(< zLPSZC&`ihunsB3mF92-F!E`wyiZsk7uyMz+Y!RG*iE*Np@WRHZ zYJAU z?`~ryBrRydjn|2>gw4T@&Rq6`Tdn0%SMvhH-E~%vE1-}xq3`)U>SLZG+RXs#t`s0gH_ zAb%lRkU_!iv5sSVl5NU(bh_KzPOII1F8n9F|N2kA!}KR4rmpLAP4QYfj{1te=lOn` zNRZr}mHmiog3sR1&gohIPe!}>Now+Kzj2+=_m8dqq@Rt4?n8F~z~~Cxqi5$Ox72>T zbrzFx1%7=XGz>xmdWwxt+;9|Lh}b38Dy!*6v>wR)jc_k~**Vk^VHMm-rjaj4hmPu)xi_Co{f9s-fr`_tY$QIMK zW6*PvDIm|V!}-%m4!ikHJDd%&6`S45fL7=JbM&-kFTzf&KrOSz|CSx*u&dMbg}Xw> zBe3G?lh?K6bry8fuCNCvcbMICPhB;LO2?FytuI8dWGs zx?zHn$S}l(%Bs+uy)3CX@)E2#+5=}x^nJVubcRRZ!}evCFBn~tvk=V#KyNJ&ptIWg zZ22EC>Kxq3FbUat9rK9u=QocMF9Y2UeiK=!VXlh2)b_ zyCMlk$yifD=^CdC0?6DpC!bdw$pwnRdK1l-H&sS>7u$C=^k`#cY6q^In#)qbpN zI8c@Kep#ytUUYT2@2$1p10J)k&v_W+w=`eBA>$$5C~5ic?GZAh1-P!n$JH?P-p80` z4_M0bwESnU)s{}Tm1?@RG?aLs-U!3rct7t0>inuLij9Vik9KqEmKTm>(hUv0PbAC?E;+2sNxULIb<)e&twU%EHDorvC%^0{h74g5`?Pve9Q`d`P<3KVn# zD{&aKCKRMNfCOh?$KxLXS5Q^}2l1d3(-t5hqTxqi3joml3UL2P&;yv5xiTlc1r+Q4 z;(mM*{`@KkGT#A4K-vI=h(>Dw|IHVHE?*_o;R6$IY71?>V{mo1k^>A)fIXAo>s>2@DJ` z@bjxN(FefCG&<^Ue%RZ1zq9@JVE_H9R}q))AcV=|J@{?75-1@;1xQ4~X50y^-}R44 zK)4`5gR3BroJVzJ7f@a;C;6ne4F6Mn!>Y7Ekha-}GM3_mg5Da6H{=auf*uT#PneV7 zksL&26tJk)Mvr-Uf#E!EcjIo9gqxk_O1hDkUY#XouH>|p4`7`4ajt(-+6`qMhagKW z;>X%kx8en{hf@KJk|dTGd}Hd0Ha!@OiG{l$;kJJU1pm5FZo(C4?fRW-cES~faFH+8 z4ng(cEDYw5Eab0Zqt1Bx6~$swZO(C^%{<_VeSM@BSw*O{jGPG7<7d`^_Go-v<=r6i zuwNn`#PXa%V8xNLWUcYw%p6I?#V>N;&RjjjAsiCMm$ibCH&0P=58UD556R@R&ms}r z{*45`16gzUdFiu9GoX2K2 zL!7>!IlQB(p=O4uL*p|Nq3})U$yyT3FH+iJhnbaMI4q;5FQ3nc<`WfzUo-@{LqRCT zG~6G(n7q5#S#1WA6Oa*R@KYBsriWS9_C(dnITI9u^qSV87Ot60ZX+L3{@qBBe4GK0 z6L|Kqn}M>2YXMPYrl((sjiLSkN)(y@@;xp##pGAqBNn{Cg}~yqj9PHzHX{gWi1s|^ z0aZok>caRRrWOn*up>o%HAfWQ8g(h;=>P3olq-*R{Dole<{DW2f&>l^3i)A62OTXd9J*%J|~;; z$?m})qctTl9c)Ym*?u;y`-^Q`Qh?hUO8hyynTHkQ4g-%(w2aTy1Ln zYqSeM6;AqB1CSv@`TSB)rZTz$cuKB*0e}~&GpRba3+AInJH%7atd^tu z&L1=PA7Q2n*r1MJs^pB=vCyVExZ<_xX7Js?PgF-ALe+($TKH6jw@l6#XjIwPAp@wD zZEWYRm!>L0hh(hGZYi2$7jcv_#ZFx+)R67`a%E%=ti5E?yGnQI6|qvD^{Aya*F>q0 zn@lh5coP}#akuOa^CS~icIgwi6>}T=;#tY1+UX}XI&9r*C&`#Tv!DI9jnoh2;Aa}k zrp)_+Fx$XD3p=`pODR7n;##SZR60bgbps#4O`G%=Cpq3KMhT?X50s>e#QjOdTBklz zOA;6-NZUHLWjA$(s>HXq7wq9>sN~W|iEnOI*Wr{^|5%MoR+&yzvxrtgR8~wEqQ0lj zNJS~(yJc*ea63heS-FdciK=BU309Td)Rl<}{&AGN?#iQRg;;5iMsdpCCT48yMo)cl z?@`Hctn4a8zFx(Zl~)1XBehj&;YO`$!;mXwesK$KWQdrT#ZcmAOp;x-sN8*^9nNA^-x$GX z3J}hVjQ&U8j!bC>9k(_|SxN7uT)MWYC(O5kVypNL!YTBB;l1+!xY4so&XUIY<^6^+ z*78Yu}?JBat}$DGG49Bsg=5+&Z}BzyTIM~aTmDf zXQXMOUN>KB^d1!)wd3+V!1^^>1=z><>TK%+`aAP~+Q|()J_z#!>H(~BgKq(WJ0u4I z4#DFQcyULFGq)nXh(AFkFqR0V^Oo33X(lyNgk>r{dJGyIC!4mB?dQeJXJa+=K2Lem zty9HSx3C#3>WH0g>s%E{-2`!%;{M?wrOp~~QYJL78}0%HRj#S^51TnNC*VEhV8#X& zo`H|3<4&AcOz;h{7NNP32iAr0wQBN5u!i*7<<7&He&{^Q~u+FyI zR5InJho{JhcGx%QlXG8~MNr>Mh&py@cO(URvp!zvKBh$qWuOV_AfJg#*1rhA5Yq3Viu&4?T52)=dTqw zd*@Dj!V88>4aghOzi#(LO>Q??9xQWvjdOd|sy%pSuhvE~a2ef=ue>%vcKK44Ta`BL z?U_&D-Yj?gIV*w?c1p#drMs%5d1~hC)Ac{f|Dj0*v18z0iElga8!ZHnu;o&L$D;h- zV51%0drb#2c)oGAW8i*6pXmYXSd62Mfy=j7J_yY2xNnsD>e^Lz{+#RVOJuFqXZ-rq zjmxp|QTOoTkdFpQNh5pViE0rs{M6cqUBo7zkJ7WK+ zrhki@%hm^~A%YV(Y$b8;0E_E7z%F(LLXXC_t7?0RZ!h)As_a|fpowhHUS9=xyZJGZdTIg~JgcD}Ry= zkWk1u>aqSnZDc2N!`DSv?&M>6S)0L8h+_MfN>kI*e8u7h!9DP7+a;l?@1&DY!d7N@ z`0;BiW_pUMo(G46EsW=u{gERlZ(Z!)TF~L<%)@}-DWbFzJs7L8IF(}uS4uPMO3>)( zqmBNS$L#9dBm)`vA_1f0+TS_zKBLz-jNW3UF-z<+ z^8`{Ofj+1tR;p$}UX<7v6iCDYrFStC^xat@ONF9Fu z?(yRD0n*D+egPDmQX2dBSrD#aK?iFobX_l|dK~Cjps1Yu&n!Mcr+mbSRoQOacJ9qf zJtFQWH2=*>mpsLBG1oO%GldxfJqb{1{EgMT`DGIrFHXWlwG~jM^zMm#ffzoj&d(fS z6dzxo9&NylRln{y{?}X(p~lyo#OIyv<8OZZpu)>u-m8LI0L+dw+2fzmy?%)$kgeKh zZcB(#XH|lqd*IG0L758|WisV}{6}45A&SFct-d$rEw&ut{QQ0g*_>bPLoQd^n^E+< zonnLGu*yG*pfFSYdAjTPZEAF4OpRaM@sR;n6p#8!r1&Qitni2<2p5R+nS``x3Ng%B zAoGz`irSU&`EhGsGBbCE8s+k-<;AWBDi-O!Iq*6iZQ-LB!9iCP*JfM=*iQ7U-Qo6Hr`>#9XXIOh>_?JIl%5qlDu{RbOEP%rk99B55&GPa(s>0AZYt$I{(QEEdpwbi zSa|Z?>;rqdj&u7T3sb6d%6V_gN=ICOae)sV#B~H&v?(342jA5FA?LmkGvAF`6KMO0 z)V|nH15qPw5=lI-j0U-fn02J8VP%AbR~NMPxmBJNN2CsPVgTNp4k zOfSz4S#x|j)Oqa}&Dul?6~@DG>9>+GMc`aPAs!<-t9xMZF2qEfTT-YXY`@YrAfz*MbQ*~4FB!Ak@@-OR*kyUcUt%ybf+n>ErOU( zhGI7+9!?CH27E;qR+Hj~k7B!EwS^!d$0?h&tzY15n6XFX5BGvuV^r1`k+fwF^f8xT zbF+uS2~B_PnH4l;h9t_+8^S=1_kiX8w><-Wr=PcCK!j`_zzetM9soyZOej&Z?tjwF zGceWX(Vms6cL&4(N_)7VHegXu+uUVtX}!uA7m}!#8FXcazQL%WH3!!swwma+FZ+a igyqy4OK21_$-hKG!C?QR@ecovD03!N0)zz&^uGYX)IV+j literal 12942 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 K_CW4IK>i;|47v;e -- 2.47.2