From 94febb3a77a8c79bc090119585fc7878f44bbf38 Mon Sep 17 00:00:00 2001 From: drh Date: Sat, 16 Nov 2019 21:40:49 +0000 Subject: [PATCH] Improved detection of corrupt shadow tables in FTS3. Enable the debugging special-inserts for FTS3 for both SQLITE_DEBUG and SQLITE_TEST. FossilOrigin-Name: 04b2873be5aedeb1c4325cf36c4b5d180f929a641caf1e3829c03778adb29c8e --- ext/fts3/fts3.c | 2 +- ext/fts3/fts3Int.h | 2 +- ext/fts3/fts3_write.c | 42 +++++++++++++++++++++++++++--------------- manifest | 19 +++++++++---------- manifest.uuid | 2 +- test/fuzzdata8.db | Bin 1388544 -> 1390592 bytes 6 files changed, 39 insertions(+), 28 deletions(-) diff --git a/ext/fts3/fts3.c b/ext/fts3/fts3.c index 0481ecdb1a..f90c7a56f0 100644 --- a/ext/fts3/fts3.c +++ b/ext/fts3/fts3.c @@ -4337,7 +4337,7 @@ static int fts3EvalPhraseStart(Fts3Cursor *pCsr, int bOptOk, Fts3Phrase *p){ int bIncrOk = (bOptOk && pCsr->bDesc==pTab->bDescIdx && p->nToken<=MAX_INCR_PHRASE_TOKENS && p->nToken>0 -#ifdef SQLITE_TEST +#if defined(SQLITE_DEBUG) || defined(SQLITE_TEST) && pTab->bNoIncrDoclist==0 #endif ); diff --git a/ext/fts3/fts3Int.h b/ext/fts3/fts3Int.h index 9436e16990..8aebfcd387 100644 --- a/ext/fts3/fts3Int.h +++ b/ext/fts3/fts3Int.h @@ -297,7 +297,7 @@ struct Fts3Table { int mxSavepoint; /* Largest valid xSavepoint integer */ #endif -#ifdef SQLITE_TEST +#if defined(SQLITE_DEBUG) || defined(SQLITE_TEST) /* True to disable the incremental doclist optimization. This is controled ** by special insert command 'test-no-incr-doclist'. */ int bNoIncrDoclist; diff --git a/ext/fts3/fts3_write.c b/ext/fts3/fts3_write.c index 10492b18c2..658d0d214f 100644 --- a/ext/fts3/fts3_write.c +++ b/ext/fts3/fts3_write.c @@ -23,7 +23,7 @@ #include #include #include - +#include #define FTS_MAX_APPENDABLE_HEIGHT 16 @@ -2030,6 +2030,11 @@ static int fts3NodeAddTerm( nPrefix = fts3PrefixCompress(pTree->zTerm, pTree->nTerm, zTerm, nTerm); nSuffix = nTerm-nPrefix; + /* If nSuffix is zero or less, then zTerm/nTerm must be a prefix of + ** pWriter->zTerm/pWriter->nTerm. i.e. must be equal to or less than when + ** compared with BINARY collation. This indicates corruption. */ + if( nSuffix<=0 ) return FTS_CORRUPT_VTAB; + nReq += sqlite3Fts3VarintLen(nPrefix)+sqlite3Fts3VarintLen(nSuffix)+nSuffix; if( nReq<=p->nNodeSize || !pTree->zTerm ){ @@ -2323,9 +2328,11 @@ static int fts3SegWriterAdd( /* Append the prefix-compressed term and doclist to the buffer. */ nData += sqlite3Fts3PutVarint(&pWriter->aData[nData], nPrefix); nData += sqlite3Fts3PutVarint(&pWriter->aData[nData], nSuffix); + assert( nSuffix>0 ); memcpy(&pWriter->aData[nData], &zTerm[nPrefix], nSuffix); nData += nSuffix; nData += sqlite3Fts3PutVarint(&pWriter->aData[nData], nDoclist); + assert( nDoclist>0 ); memcpy(&pWriter->aData[nData], aDoclist, nDoclist); pWriter->nData = nData + nDoclist; @@ -2345,6 +2352,7 @@ static int fts3SegWriterAdd( pWriter->zTerm = zNew; } assert( pWriter->zTerm==pWriter->zMalloc ); + assert( nTerm>0 ); memcpy(pWriter->zTerm, zTerm, nTerm); }else{ pWriter->zTerm = (char *)zTerm; @@ -2653,6 +2661,7 @@ static int fts3MsrBufferData( pMsr->aBuffer = pNew; } + assert( nList>0 ); memcpy(pMsr->aBuffer, pList, nList); return SQLITE_OK; } @@ -3841,6 +3850,7 @@ static int fts3IncrmergePush( ** be added to. */ nPrefix = fts3PrefixCompress(pNode->key.a, pNode->key.n, zTerm, nTerm); nSuffix = nTerm - nPrefix; + if( NEVER(nSuffix<=0) ) return FTS_CORRUPT_VTAB; nSpace = sqlite3Fts3VarintLen(nPrefix); nSpace += sqlite3Fts3VarintLen(nSuffix) + nSuffix; @@ -5344,7 +5354,7 @@ static int fts3DoIntegrityCheck( ** meaningful value to insert is the text 'optimize'. */ static int fts3SpecialInsert(Fts3Table *p, sqlite3_value *pVal){ - int rc; /* Return Code */ + int rc = SQLITE_ERROR; /* Return Code */ const char *zVal = (const char *)sqlite3_value_text(pVal); int nVal = sqlite3_value_bytes(pVal); @@ -5360,21 +5370,23 @@ static int fts3SpecialInsert(Fts3Table *p, sqlite3_value *pVal){ rc = fts3DoIncrmerge(p, &zVal[6]); }else if( nVal>10 && 0==sqlite3_strnicmp(zVal, "automerge=", 10) ){ rc = fts3DoAutoincrmerge(p, &zVal[10]); -#ifdef SQLITE_TEST - }else if( nVal>9 && 0==sqlite3_strnicmp(zVal, "nodesize=", 9) ){ - p->nNodeSize = atoi(&zVal[9]); - rc = SQLITE_OK; - }else if( nVal>11 && 0==sqlite3_strnicmp(zVal, "maxpending=", 9) ){ - p->nMaxPendingData = atoi(&zVal[11]); - rc = SQLITE_OK; - }else if( nVal>21 && 0==sqlite3_strnicmp(zVal, "test-no-incr-doclist=", 21) ){ - p->bNoIncrDoclist = atoi(&zVal[21]); - rc = SQLITE_OK; -#endif +#if defined(SQLITE_DEBUG) || defined(SQLITE_TEST) }else{ - rc = SQLITE_ERROR; + int v; + if( nVal>9 && 0==sqlite3_strnicmp(zVal, "nodesize=", 9) ){ + v = atoi(&zVal[9]); + if( v>=24 && v<=p->nPgsz-35 ) p->nNodeSize = v; + rc = SQLITE_OK; + }else if( nVal>11 && 0==sqlite3_strnicmp(zVal, "maxpending=", 9) ){ + v = atoi(&zVal[11]); + if( v>=64 && v<=FTS3_MAX_PENDING_DATA ) p->nMaxPendingData = v; + rc = SQLITE_OK; + }else if( nVal>21 && 0==sqlite3_strnicmp(zVal,"test-no-incr-doclist=",21) ){ + p->bNoIncrDoclist = atoi(&zVal[21]); + rc = SQLITE_OK; + } +#endif } - return rc; } diff --git a/manifest b/manifest index 3ac82a7101..2585239f61 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C More\srestrictions\son\schanges\sto\sshadow\stables\swhen\sin\sdefensive\smode. -D 2019-11-16T16:54:53.217 +C Improved\sdetection\sof\scorrupt\sshadow\stables\sin\sFTS3.\s\sEnable\sthe\sdebugging\nspecial-inserts\sfor\sFTS3\sfor\sboth\sSQLITE_DEBUG\sand\sSQLITE_TEST. +D 2019-11-16T21:40:49.550 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -81,9 +81,9 @@ F ext/fts3/README.content fdc666a70d5257a64fee209f97cf89e0e6e32b51 F ext/fts3/README.syntax a19711dc5458c20734b8e485e75fb1981ec2427a F ext/fts3/README.tokenizers b92bdeb8b46503f0dd301d364efc5ef59ef9fa8e2758b8e742f39fa93a2e422d F ext/fts3/README.txt 8c18f41574404623b76917b9da66fcb0ab38328d -F ext/fts3/fts3.c c75aa32b230bf4950d2a16a749eb893beab81abbdd2975383e19325715bf1e31 +F ext/fts3/fts3.c 6184d5748b51301f401eda0d3e5ad0caa19b4b95c0520cdd1f83a74e3a1c97dc F ext/fts3/fts3.h 3a10a0af180d502cecc50df77b1b22df142817fe -F ext/fts3/fts3Int.h 74384e28b778a057f1467529715668b98f3f12f52eeb564fd6ae1e894125c00c +F ext/fts3/fts3Int.h b879664f543ce352815461cacd828f2606716e46e47323875eddfe100d8b7711 F ext/fts3/fts3_aux.c 96708c8b3a7d9b8ca1b68ea2b7e503e283f20e95f145becadedfad096dbd0f34 F ext/fts3/fts3_expr.c b132af223e90e35b9f9efa9fe63d6ae737d34153a3b6066736086df8abc78a1f F ext/fts3/fts3_hash.c 8b6e31bfb0844c27dc6092c2620bdb1fca17ed613072db057d96952c6bdb48b7 @@ -99,7 +99,7 @@ F ext/fts3/fts3_tokenizer.h 64c6ef6c5272c51ebe60fc607a896e84288fcbc3 F ext/fts3/fts3_tokenizer1.c 5c98225a53705e5ee34824087478cf477bdb7004 F ext/fts3/fts3_unicode.c 4b9af6151c29b35ed09574937083cece7c31e911f69615e168a39677569b684d F ext/fts3/fts3_unicode2.c 416eb7e1e81142703520d284b768ca2751d40e31fa912cae24ba74860532bf0f -F ext/fts3/fts3_write.c bf724ff69dd497eb8399452ecd44e39d8eb420472bf555b826dede4b05e9accd +F ext/fts3/fts3_write.c f7d443ebe2cdf0a8515edb7588c8aab77108cc28ede9ced8baa416c95aa810cb F ext/fts3/fts3speed.tcl b54caf6a18d38174f1a6e84219950d85e98bb1e9 F ext/fts3/mkfts3amal.tcl 252ecb7fe6467854f2aa237bf2c390b74e71f100 F ext/fts3/tool/fts3cov.sh c331d006359456cf6f8f953e37f2b9c7d568f3863f00bb5f7eb87fea4ac01b73 @@ -1016,7 +1016,7 @@ F test/fuzzdata4.db b502c7d5498261715812dd8b3c2005bad08b3a26e6489414bd13926cd3e4 F test/fuzzdata5.db e35f64af17ec48926481cfaf3b3855e436bd40d1cfe2d59a9474cb4b748a52a5 F test/fuzzdata6.db 92a80e4afc172c24f662a10a612d188fb272de4a9bd19e017927c95f737de6d7 F test/fuzzdata7.db e7a86fd83dda151d160445d542e32e5c6019c541b3a74c2a525b6ac640639711 -F test/fuzzdata8.db 84471dfe9c85fc00a85bff47eb9876e4282964385587a62eb9711e4be8f4dd3f +F test/fuzzdata8.db 053981588014b4e1e5bc8beaf7034671e133cee853a0f2dd9c8d444be1a97fe5 F test/fuzzer1.test 3d4c4b7e547aba5e5511a2991e3e3d07166cfbb8 F test/fuzzer2.test a85ef814ce071293bce1ad8dffa217cbbaad4c14 F test/fuzzerfault.test 8792cd77fd5bce765b05d0c8e01b9edcf8af8536 @@ -1849,8 +1849,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 70390bbca49e706649ca5b7c031f0baf416fc38798c17e5f3b73746b3e66e3b5 6aef58b629d89955f85f65191ba2be67b2adfac4f0327fe9a7141cb2705dbc00 -R eb081275a7e8dd518362d4efeb289e7e -T +closed 6aef58b629d89955f85f65191ba2be67b2adfac4f0327fe9a7141cb2705dbc00 +P bae76a5c40703871e5ce4cd23d6fae5a3836606f524a63b01ac828c7a602c5e9 +R b5d91364fca42dbea07f58830b5ec589 U drh -Z 2f2e9ad59bba00bd0c1df6acd6bb6363 +Z baf295687228d1300e4112b17540730f diff --git a/manifest.uuid b/manifest.uuid index ccd42392f2..43f64260ca 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -bae76a5c40703871e5ce4cd23d6fae5a3836606f524a63b01ac828c7a602c5e9 \ No newline at end of file +04b2873be5aedeb1c4325cf36c4b5d180f929a641caf1e3829c03778adb29c8e \ No newline at end of file diff --git a/test/fuzzdata8.db b/test/fuzzdata8.db index 419a4ce6c855a8671ee7d6aeecca83c0ba30d181..52385464373000b833e8408fa906f902aa67446b 100644 GIT binary patch delta 19941 zc-rl|cYGAp_dmR6%FfL0Y?tWj8(41nD)QcM<}jNJ$hBr6dE0s0fJ>jtxi< z1f(Pp%s~-J1Vs@cQS2xQq9D?O{Uhaf@1g+;e8` z=2Q*KxjHPjp|Qzgkq24s{EN$L7X_P2QgXlXNL>TgvLT$!4T|%47cDn_yI1# zIjDv&;3GHz@4_KC00bql1Gd0Mcn0#}33vodSP1iA4oru17!M;M1^Poz=mrT81?`~~ zgt5t_&So!0eP&NaTbcJT+Sp8Dw7%JmQN!$N$+k$U*_qvd+0kMVe=`#ptuf;ny9FF}l@^U^L%s&*&<%4Wkd6;fyXZTQfS}Y{h7X*^<$b zW^+c9%%+TXG(#9|W;U@{vPFm4klkozJw|1-uEio;G3zk;wdrN_lxZ;fvFT>?gy~|m z%ycrk%XBdMqNy>8rpoA}rj=3Clo(xLii~EN0;97`V041X^dXGPW@OkBMg}Zqq~9XT z1dDLbLiWFj4>Hna0V5qBU?gfjBkkrg()vC|T4XWOAd`_gvl(&CVnn-_5$g;_gy|Lw z{63A5YZ;7Op3KO(bViP+?b&1-2SU$`rTPjTR_MYCU0k6{D|C5qsRLu`=(^1`+U9_-xPlo`RRjZt1|>WU6@o06Vj8_WJ@JSLUe8(?O%L-xi;`C~HTqGDrW<6@&@ z6XGJ{;xRE(^FcgiWorEa;`2)u)`57;TdQEHnde-d}Lf?LR7TRZ}Y|asQEBY| z?wTn!-WM5|DLN{aFNE7O+4xiedqxIUM@+zY3C!i91Fcbk*2uV+KklOg_fdRQHq!-f ziU~BanQehv#ypB!kx!lQ$JBpL9N@q-u{5H*kf+30E$2#8*7O9qv6jf(*oM( zEw^XPzAbFzA2a#`GsgdOM%$mVa?|rEeYdCd2e<{CgRhv|_7AkM8U2i5TmVc)%pH+! ze+=OYOw0bm514tU#BqaXOk!6IyPLvWY&N!-$40aN8_)Vj2Mpm4Xz$FToj!{-vp26^gY{g#p) zPra&Z^x90NuLxCGQ)nHD$&0L3Om1Qip`1)*nF!T5{cRXQW9BN`ML2_byTvd(_@?yH zy71r>^tpptQ09Y5z5riiUI)7$o2Wu6tzD$d7U3*TxC|q3EZ85#4mM@gx^Jv4G4%?l znEJC&2bWxd2AKP^pkvpwFbK1|DfKCFsd5P58!X@CZAc-@m9rvzi=UP&3Djk!azl~R zCCi}*z9EdlT!#{lWw}bacK)ZvlVpo|q08+DiB@|!?aEVz2=Zr4kKgS{o4!<_73-A6 z02fGlnrrU+{L0z&sqyp5w+dXs$`2Tvt0$GQn6O8&Q_g0kOo7Riv{QLQlrJ(KSJ8P! zSxDK%%5o8EsPh)(uz=l~ss>*ERC$Pol5$Lj3<^Dvre^eH$@^s0vb6zc^1+?pik|J0Io}NgQ)j)lm z$-7E@hFS~i7XUJbtx?%}kkscid4^=!7gsyII$v@svl!@{>vgonEEJ z0nISfYO8#&WZ6CZUj`KlGSh@$$1IoHn8F&VXGGAkBt&gVZjbsXP;P?S6fpODr761a zQ-4RbmFncll>?2{?pD~Pm3nAhCu0F+v{2Uz;6zCC)W?Yt>L{AmT5YYuEZX2x%RqJS zu+Ee$9~*zgu#H1z%U&?heNafo5Lt6jTC}=J1P`51wcP@}+)+)DAqXp*iEXJYS*^p+ z%u~zB+FiW?5R7?S6+gxFP*YWTwq!Yw@Yf06tK}Pk_T$1f^fgqM@=1AGSr5PZT4{pg z8~@=;oc%o_)W^y-Y6M1XRVr&8y)Q-Nse_nn?N>+Oob5^-tg53nq^OZ=m zB0>{1x~n1UuBZy#RJD2nb)TV@1B75$OEnR17ON^galhIKH$0?{r9(5-L=i%<(xbj} zmko*8@CSe}d}XHEf)ZD$p(3sssz$C0Qy(r}po$VSBlkA-ra(fr3INS9YpS}2e4*-g zfjTc!S1NLrWZ66RuVVG&!myNHXhnsU>S&;d>KYYg`98_AWAT4e!!LX!D-47- zcw(2r!uiwc*CMnfbH17lH1U0R9|04K)tJ%(wY>~;slyhv14!+kbKg&?FRB|sW@U!Z zfyxJ}24Lu~Y6ewJR%HQmcBsoB0<(^&Yp|fXXua*s$Q03qChk@@%iyQ-MQW0OnVS_E zvyZxG@iCLJA*tul9K>Q`a=iKkRlTFS1uA__&6VZ(lBG25uY$b8O&$H*w0V++hX0F< zaa=rBAqg=AY3dwi))=)VldDvn3Vad8;_35B7p&N+Zsb!nQ&=)xa9DVjHdLrnL`cBG zsp>>z+K<7RdqJgwlj@I}{D5S6rBm%}b8+cub+OEL-je@Sf#$K$_pgROMQ8- zne_HgYAn;qaY5pEIdpPpa*nAjn-=x9*sBK?=jf5+#jR z{Ho@t@H}(b>J_97(d0#v z<<%%YZwg&*tQi9IE)CUA%F<%V@-(`ul>yYerS=8L{TYfuSnd~s*gkIimE7Ul4+0Fv z31h`gc%`##Ep=+Iy(2&}4NSBhVN<=Wg#i|2+j`@7X|{UUKT6vNDL5frd>RYh)n?$n zbXy-96r;T&zz`hR#}-P>@PYGC(89|C#n5pqqU)S%8sP^raR|^#^DdL>Prd)mkzQOV)}+7)?drXflvCT>Fmz zWAOd&v{afrO4}&HSdzwRK2^?^EH}qu;YV5uJvLdJC&KX3X_{4%-nYQ}d$M{S0%=t% z(?XTAv<`wip3R+#HPQBdds0soi1|62J>2WkuqNLA>7I%uKG<`-RAQUk1KJNTiOl;n zw&=bZVi$lOen?vakdEejZ4KUf%+4am2>S}yQ@k`8^2;*kaXypx>~1pz^1r(D2A=*H zj6I7F?1B6x9a{5eQ!w+ez3!gem6>Ax`s;!28GEvhjRBhQsJ2CbsU)q^STZsVPt11I zqei*fIT5B~N*$ptHGE1tFTxBgc}^RQ+4Gzgcw&RLf^si-x&aP6=V^yQ&uLfSUUZi^ z_tL)Swf-W^L}RoPh7k`K?XgR!7DO2ZTA6Bv+qn_b*Cs312#ay}5bX#0<*cTQump3iOU!T2bHB}AH%9Yg!Y%0tUB9R) zBIK-_p!KDJSG9|(RbuLTtTz_cw>?5nPu5}u9xwPik!4u$l5GbSUDt+*u$;=@&~zX- z*x1^77|Y+(e!;8FZ8|Bk?YaOfsQhg$BCx9BXkxf+T|gI)VEIvPDRzt1o}mzjjcH&d zmLJ#ZQsaI$6DV=BZ8M`@+c+y&X?=ZLG^mfgW;12U@+10x6a45-v3-UwHL%s^pq8@h zadKVPYDCPLZ?p3mR#B)^2IkISdlZYuh)HxJ%*F!A6KHg`T_lFkE5d4WsWv`n>Fq&l z(CB3wK*{ZFdql`3qo3`GKfoXZQ-%>iHhXEbjfJQusWMX>&e(@*M<}$T?Q4L1H0FwH zF}a=gJ$8FjdysB)u~`Lp3XKI~JauLfMufFwED~D-wd-m7M1Xa8@R;@?CQfCn2PJ5o zsbZQq4X}fs8G1v1+hU1T2#u0$`?aS_Ra22H7lVmeLjz15Ejj6z6q_o@c?|Y5G)h*j0l@*SHNl-{-ABQ059BedSXt$7m!8T)>OKL!`h5pqWHrbSfgpluSf;k77vp4Cf#R%jc z;*JDlQe<(rEXLxIwqzU>uH9|c+88s6_bI_7(KeGZ_uBGBcp1wV+kU#+x(Tn@json# z;&jd^Mr(}kP8QSYc#IY);Do87hRIG_8_elrJHol`rSgYuUEnU$t8dzV2Y3aOyxfNl z+rCzSNIGV_rNFC{;s-Wqunbrw1?|f9N8b^H zg{0Q@3#!!>*cF-EngIvIlQW?!URZ1xI5^U-;>1xNo$5r|zXQ3PiC($KKaJIqonq`P zZ~B00QtWR5y_;a~D8PqQGu(bCU_dtYNvs)dPef)q8x2adzaqj%STo*!XzP(4cAM;G zhU>DYB*PadQ!Ci@>7K+HWh^k9w)rV>ru_=!4{p(jEBiBaow41w=gSt&g#0$J{7!F_;Kb*ZAS_;{CI6X( zyd;#S+V@GaAz4nPQ;h+3miWK!R;ePx9s%+vZ1`80_aD7(e%VwHwV!7HScKDilFpBZ zeBYAe6fxU=5}+zSv=!0*OnV;@s`EqJo}^Fb+S`h7COS&$L!PpuIEQ|AakP5Y9*Cm$Yk&S3hO} zx_)TcLGfU3dL=uBY!Y?^}BX-pcR}rB>_hrv$i& zh4HM`$S$;hM4m!>jR2R>eAYgeCT_NG7U441WWWf_dDtx#a2SdxsURiEZ?HIC_u$Mfp3{xdu}nQdsi4*UpmP zYx(618{@!ZEFd4-XO9!%hy21Jan$K``#U21m|vdRfSQ!qzY*alT9aqb5@_Dr_SG`{ zLe&nTp+K1(^eKSLPuR2JSDfgFpZ*e#a#=8q0hNpV8-{s=Q&e@*-b{r5VAv#A3?+QZ zlncL8(n)U!D-0KTFOcIa`_D4mpuCT4_X?PNz%w4p?$_#IPKGxdL%+7G>zsOhTzbxK z!cELNV~@mQRDv{z17Q-AKoqbN^sDsa zuXdNnQbGSu_7eh@^@J(7J6Py~p}*Vv;+0?RGG4t39$fga(w2{s^7Gd8DD5Cj0xZ)6 ziHdKsXhnwwJyfyQWibG!6EmVGkmX%x{S{1#&<|oku^2>&-`cygl6tDwPyL+wtH6Rz z^`qW&%>Bf!(j2$$P@x_zuBR^*Wh)zM$GjN5Hzfw^{h2>M#~dvAjD2XWf--SqU+97h zL-duPqrZoKAI%Td+p2Oy$#TuWyj6~|2;q7!tY@M!rL@zF#DI`kWe5qpuZL26x&)*q=)Vi#rRs3~1)#_JFtixaO+N`i6c(eO7Pv>f z%{h+bqk<_cfj7>&>g__Iz4fmpsEcXW^&vE3fWAwFdTY}heQ-&b?8dLQ>8v6;q9@RQ zl3BeA_0im^|A5JZC4J_mrc}jSTyiGtw#gJ zr|Ium*{Z6(t}myR)AWTRgs|o7=uQ1+>iYt3d?K6?Sdi%H{Ng#CE-p^aJ37L;;bFAy<%yEKj~sO2ju4zB8<`api$ zic%zp74T-5ClXJTIzFeI-Apvh{Z8lMU2IJ$s^e9G4m_#%0tm-SrzZ<@;+$=%;3+*_ zgf^7uc9e;j`LodhQ(xEldq}Y@RuA@s;KU$D5XC*OA5)+`X0galH_en>*ZCR^$r9)E1r&n0tZQ zr0YhpH-c~_ zjzTyfjUy(;3kt+gNqxs)0dqUpH7u?xb*Bw)v)Bf)RMMC&G)(@`QH%#0NSi73DDzB+ z!;&z^E)41F$i$rU`gLl2T>lmz9*r1R1Xi_hJV-Z3>w>`DXh;BJ0_DX!Qvh8qM-BRX za%Zl~SfG8M=pC$bh-5jJ&8_<)Cf?(G9dmXw_}QoR9GQRc?@Y#cB}3p&Jd(=K=-q)W z<&sejruFvD97^2lXe40jdwK!p{^B$+^PHZ~@`*&hvjAQ9=~0;Yff#~SUwP_d@%#EL z48341WdflHb>uKeI5&SVkdUp z6Ue`*_@bi#0#AuOZ4xkC4+`6+pBAxdpwyV(_oT3$`cSyDoZPGRF<9VtCjK|^{Crq1 z3M~scu3D#VF7n1cwSpZ|pdY5iD)s*ctXTk9e=Lu4bi)lJ z9ADLXaG}7Lm&_jzK=T=KHidqxSN-1tjpgG8qPbp7MRyC&k~_|g%(-vWVhDLKKhM}VPJ^NsEjYQxriTGQ1r7ho9Gd>3e+sx)8M z%M**ak2`}YG|jOj;6KBu<`RFL`KjI-Gu=`YR+Z{U|IK|cbfM030&xV@)aakHrS+OV zf};C56h&$-S$@GnpPEP&s~kspnktTZ)nzurl%bB@ax%LeonJk@E@sAhu43*Ldqc{8 zS&RT0KEkmZU<_V;*>Q|2MmeHH7>g-QJ+IP%agJUhjKh?c9#%o6I#?Ax9t+FFR7yUn zPZN1qh~{7>VBukru*}6mR`DT6^19FTr)lSO$4IM~8kG@9Gsm<4PTySy8-AmN5AfwkUm8DS|VdgfLx-#EMTGKCHOk)sSs@QVdqCXX+@9 zbn2M%oj!^po_AaU^elALKspsVJcV%EIV%=Bq6C$tuSTdFmTO%@*{;D#v{yf43%1!BC;#PqBFs+%VDbD_c&G-ML=*I)A_~Ai4|1w8QVr^+}n<& zR%k`1k2yj`c@E>YfbwSOodVAB;9s@+Qb6GkV%XzsNf(HcMg^}pQiWQD?tzD}+$uGp zrk^^hMOcVQvCb}-==59*XpWfXx(dpoz)=G~2h&|-Zn>8;U5rUxoy#!vfYgQW!_nya zS$C8Ajiad|x0Wn7=kPe3$qIC})&-Ecz$U(;9$;4v76w^g!;pE>SlpQ92*!}z&Wlu3 z$I3RS)MDpaK8LwB&sv6={av{j+FgDcGtamd(X^i(&jBpOJjvP>bCe(}Mm*-W(ak}u z?#5KBdmI)2<`^o#GAjAf!!nHuKU06`WaT8yp6_{*)dpG4<(&C)OiPzXzB1N%LXpEI z%jE|+;8A3M*i$25$XR(gN1Dy9M=0&A=UuiYjycbBfc*nXU5RFd)Q)^^=Z7LZilIL^ zAI8&ro%7H&*i{q2fw{6Zj+WMOngEYsQka7+)_u+$fFTPUb+O=nR|@7NNbwxj!T`(1 zu`t?ojUlp$rJ>HZB)N@bxtLT7>vNu?i!0c*8dIj)n^Mu6(mtS)!NMrXOPL=ySv{WfI5VSrprlensgp(Im$5oSIzX9j*F%8o z-*t7PhhB3&%HLVSA^8?o-7AG+YM2y;#p!Y*NeC9CrFdc{gKTN?GTfYs3Jg z;`f|Gfhg;ulNF!^kID4|(CG2^oeKomhbe}0B<|E)D!rq*8VGd7bou~yedrtkuVPBD zb0vpV33$b7T}D+OJDUN#hAH)(Pu1dD!JK50oJ*HJch&*ePg&Rb)UEV7m|X50Sz6`X zXO$x*%T=RxK{eu;=z&+`O_mQ{n^)WXC|}C2u;=QBZ z_wdWrl8@~}(g%2=o9xGm2&o~umN+a)`_r)`~^jp#}LKbd7?&E@tt! zuso8Li8&#`HcDM3vFsyslj{P9`Pbu>i=rz^eWaE%t=9W0+9_oj%so&!Jyk*-wcu`kI_ za|Z8X`6Ry5Mz~monCf)5z}OGPJPYsnru_A@-7)@45U*3@^pyI&Ba2)g2NG)(q zU2FIqjT6)Oi$KhKUJv;63Czov=3w?h$xck(hefEsnqG28tcaDK!h^kK0F_u- zKn43LY+>Q`G;O{R$=lEYcZ><<*|I0Pp}%SSR0x8 z(B%QHU=cpWumy4pEFSF$rqn4C%jtThxDE*L8Nz9nyC%WL8T2Vy}gZpq+Ycgc&1Qe)88gwhE-wC)xES7H*PWpskZ#<3#uh z%WE8?i7nR`ML3P+KRLEy=r0}}lk=r;9?6@DP(|i)=g&ah=6cw&?fS0kV-BU7vWB^u zh`1}?H59wO?0TFxp22c(da3RL*F^=+Qq6g12jDXu4`g58VBS0_nhqRr-6PP|=`7sw z)^Dlis&lV!dlL^?=1jmVhh5L|C+Dy-*cnfqSGkUea30MRDTr7^Sj=*ZBA4%uQD5aC zM!>Xs}?Pwmao}$5mU!X zUH%$pQ>d(vVTDVW)0-`E=8p~T#P%<+?2Kza$9WlR#>nmQ^fl+(e@jIubGfs3K*}ow zlayP0pfhlAvLoQ=BG*fBl^{du1=O#^^}Hgpt>pXczxmxPjN0!yCV$VE{6JTyxZKP! z9+OAYtT$Zi0Dk0(d=h9~xoegHKVjG}o)(xm*g2FI9duH1 zik(l=x+>Q!kssUJ>-_qz+>7Oa+vwD{%-`T9rKL#OK+C>!{tp`sZEnc8`RJZVcc@in!`|!kC-8I*uP1*^D|rfoO}5Fr z8S&?{NzBnD2fMsfaoNfia%P&lK83Dz@8N5ct*nY`yp_*K?q}SG002q1L}6oT7HMwH7FhCu9jt{sC{97 z0XvtkKdBD88dCXecQ+uWiV`N_HLK1UH=^?USSwaEw*5rEw@}&wHlOcaUpm=6O_Gx& zOIgo9*)``@3~!Z*`xbChM3? z#O4>FR`~$~hoOIm`vexp+gjd6LJY}i8Jhi-ZM;CKOWZH;<9m!B%c^tSY?Eri2fsmY zE_Wx1tZ?@ixm#n0aAhHe^l}fU>nq(06!{*>axC~Sz()hkebU_swAR}q%{HZwLyQPI~1)ixl?KR)9!2$+G1L{dpqrV-aUf9pLNb~zfDIs zyA$|Z*)-E$k1mBN2|&ZQyLSr^foV@jb+GKF=H^091bTFr`$0wS$*Pt9wb+nhdlEa9 zx>soaO)bqHlI3v9UmoUickj*{__kQRe%wk^3 zeQtjI>m&Dn1n7tB4wnq>v)?7kUcagajcS;i>+{0v2${o!)jQUI_tlZLM(#nm@nT&c&CbV?RWKv5%nM`8odvhwI)g}{M z`ox^VXr;;Imkygu0n!_08l$h6sf_M6CosCz9LMNpb2Ot*o1+-bHHS00)EvfW_Cw|n z_GgZn!srZh5TjGffsBqf2QWIy?9b>>vmc`a%)X5FF#9l?WcL2Q`l06k=NuCxD-zTW=-g|kb2NOBvuMCeO7;l@{hr{6b1Fm;VF5OcnF`!RIC;iuv{#!!HM znA6@Ei50sAjV9MKHj2<6bNogmX7=*N;l>*GAll!^h_W$OS6UiwkhwVrVcPHRx|sVC z#9{6zm`6ui8=XZMjI;U}XXx8@Mq?3@v8c5-16d&UV(L?diEH|MQ)zqsdlI7AAVgcGN(6a8vB5-hT8-DwDU6FoF z`Q5z(6Fr7TWj&00L}5fMX4Nt3;O@3e%s(Zx18weWOyp;iQyx<4QKJDynF{^s%V9=S zQRaR<29pbn2#OkIRPe7GVYl4FaNqx-rwkkZl}F2H5_0x1T22a@CW2TCdaT^ z6)mHnbVISq16aD)f+Ie~UusHx9ZkfNLEetkb*Ax_2&oADygrJ~G){<+hFOP{AgVXl z_+Erb`Gs|OWoKLzAsw^(Ffne-GlrwD6-yPe7a7Y%n2c8!S^Lt!9K&scfi&SUqY&(T z*-qv9h>63(0;3rg7Z?s?`j|;nXh>`a?`5>ZdaoMuu}WcS`kXdK8+zkaV|gGIm_~(l z47SbR@qpi7H;ytR#3~Xpi4$=Dw!oJ(X*$(xGm=@RI8c%C^gv@TIo26{t@0qray)`> zqAMwUufcNn%vnZ5^x5qZST)ouVbMk-S?2L)CT5K^9;Y=0##|9*k^eP=CFaaNqiE3< z;}HR7V`zjij#9T7;i{Y>S&HH~*Kv5E*s!Vdwq}{hd@C>Xsok*PF{1@fM>Drb=3vQk z)KNRX8c;hAgISpOtGfkn`&@+ku(E+Sl$!4|PK$6q=8b3C$$Z_&=ZBp0(pbiDe7liF zkChn@Dli|bQ-N9K9cC5n0iQ26@R0!XMjMGV;Fv)QJcub9tijkd%laTadD5t>Nkb&d z_CH@~I_Uc^jUYj0D_B~TZ_HpGS7n?NVKI$q;&}n+nCyub@QZUsYgmF=^_)TcqjK); zuY#FHQZ6Q1SzWNbnP((s7E9YP`M7SQ@fVC20kScxk<-h+VTM!UMdOeNIW(q?=S60} zk8~>)*BC(;RdC9%(uHOT;9O_j6WE37)e64^!bw5_6D5K^l&ucd|N$;g1tw1tvYAe}>Lxo@;kt zB7=Dv)9jv2@CX*ZEP3(r_l5^6O7zYgZx*WvN~Jd3n^t1Uhk9E~ZQ~hE%iSK9Mn6h$ z#-RbaC+RCG^Cu$<$XeHPLxRU&d_-psd9OZ-A2$icMA4Ir1xIuVcYJLO=StlUunMzg z>!FytQyPXjkLx*sk3v{H#_=RhP&}Ksx?5nyE`2XY{1ZI!SJl1%wHRjvmc?qysnqiU zyIe8ma?HbtA!Rkk8aiQk{7ko7#YU9U!4qqhhqD+J&@JYV^d!)KqCK)GKgM`GNpQ(A z7-~PyKTD2|o}c--YV#*+D@>lKxc*HbWCFFI@m)MG3h)%wSUoQIEBe3bn}0Tt)?$s# zlZl{N|vXL*vNDLk6iP4^U)oPC5hn@b^!%TjTTY8qHQJ!1;lSlPp zFNApi4nSNQi2WEByT!Le-Q??A4X&hm)-lSbebNXRm0Cu*AIsTQD+vi3QT z{@eGawIFPYrm!H_Y7qxNE6?J*Ucjs}=R26%O=^HA)@vaoFZOI#`0r7cdy++cJ?rvf zTx^s-GCm#?-w;}mZ>8s!3ggI^=V9w&*S2QnSgd-|Geh2%*TNiwgY!Mb_APAGcE8`} zkIBHV#(1Ks>r);U-d`f=Y0oWw2wQrd|J_MafoFgY6EJ0`=b%>f@V(}E$@2JEu1)H@ z%k!E5#gr5)s6cv&=NAD=u>2ESCw@L}Wqw(`WUBj$=c2&RKcBK!(8+zC2nF_H!AkLa zx>Dw8rpc+2Wy^HNtvPi%>KP7N>6!)RL}r|MybTY$=jkr*VNeMhy(KlJmd89_D)1^6 zKH?cm6Hj_Ji|`tT{ooiysXux)02YANP0pV^*8o$aB#CQpKbrI9cH}$d`A~${soLod zVQaLj^afQ|dz$jI&RJun$FZQm6^Gf+%UAERtK(zOqg3>*XOvYz@DQw?dFL`IkZ|xdqP9k0Q{vgN)8UMEt8uQ;2Pw?JP z1*$h)gdq(G!}m5q3?(%39_445GarGvs0S;HFyw9JE1DPPUCmD`=Z$x=yrH@GyeJ$G z&F|f$Jw>+mR*Lo$anT9U(J|>hzYp_%3TlJfi{ajNH*L>TxAxw{0#uOX^Ul(&lO@Y< zX)$QD5AKf1)k-Y?Nn9`%9Z;^X>*T#9A7!$Ah)F$+h}t}CC)MfVy~K|zS1mL`c^dH^ zT}ku?@#D%#y}bu9C)}QanSH(Sl-AR`iN9VioMUT%RgH}Sym>qw>Eqp{*rrI9FYk@H z#r|Pdx#Xv!WN)%4f50aE4AWNI+V3e28ve)G+tTiOdLV#&j%hbx8qLY^=84LrSeCv^ zUtro+tudwwK}A$C&Ko7dsr<^p&9K9Z_GUD2rFW00#745DUiuOZw=kKeP4+&=Uz%6P zE724`&HEmIX&!3#cE#inyMqSL^zP-qXHU7wVtw)z`(}D4)4N=S3>x^L_hmu;lyUkx z-wc{SlNNak`4832c)c%%zTs)gVLc_nH&p(yy&F*Cc<+HgeEc>)saeZfJf$L>!q~f0O#+<^xZ!&UAP<5)81>Ub*gMJpYB5C?|M548n3y|ukc(-A4l{Ex&GraHK76F+EoB3lA%Zoj%%vt8mVW~~f3GSVfxI@Si zy1x&)itS&tH|Np>&O6F7hNXMMuua|IkI}cvi&*fieG2^|2k8Qf3q~A^C4c_$ALv5=jxOx)=$igJx@LEyYyJ;(E$&9QlWVOpW8V6|;0pf-t~P(i z)%NeW+WkAO_IKmza5t`P99P6Ymi}ydy-N^V`mNX`k^dUgMfQX$fAvPNw0*O82u?T` z#LrvE(RT;+vY;sOmC7L2$9*N}I3I$QQqUBd_D&FsM- z((OfVpBxv>`1#q@nMzLD-U4D$y9G>+g;pF$7lb!FNjzXS6=>?WLC*tp#p;drkaaih zgYa~4Z~|Y}2=tl}>}R!R1EDJxe;+hd?B);0l)5Y-3T#1G5u>Y^7_9RXv2r4sFW6an zzREj{vabfQvO5V=)Sxfvi$=jA{JWRjol^9mSwQ!O1+NL%=$=|JT2cS&LESaTq}6h8 zmLPXxPkZJ2gHP6~bvp#i&3~fOi;wM%VXruY{s^#Dj^Jhj^r4b*-qHZ-zWkTsm0R`3 ze?!`w5ABDA!@YBnfjmGl^@EQK(4RU?^L`+5J@YC{9zY#l_wE2H3JV@4z(6#{D-CL4 i9sm+r21|-Hi|PEi7RYqIo_yBeV}RMko=5ojp8p4iKWK#j delta 18589 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 -- 2.47.3