From 59d40ea4d8eba7c5b070559cb816af90824f59ae Mon Sep 17 00:00:00 2001 From: Max Wash Date: Tue, 17 Dec 2024 21:48:08 +0000 Subject: [PATCH] doc: lots more information about the image layout --- doc/format.txt | 215 +++++++++++++++++++++++++++++++++++------------ doc/res/logo.png | Bin 0 -> 25123 bytes 2 files changed, 162 insertions(+), 53 deletions(-) create mode 100644 doc/res/logo.png diff --git a/doc/format.txt b/doc/format.txt index 90f714c..e5c3a03 100755 --- a/doc/format.txt +++ b/doc/format.txt @@ -38,7 +38,7 @@ version: 1.0 On top of this base, EC3 provides facilities for storing multiple whole filesystems within an image file. With support for extended attributes, a directory (or whole filesystem) can be accurately captured within an - EC3 image, while compression and chunk-based data de-duplication greatly + EC3 image, while compression and cluster-based data de-duplication greatly reduces the amount of disk space required. @@ -54,6 +54,49 @@ version: 1.0 that are used. + 1.3 Terminology + --------------- + + Several terms have particular meaning in the context of EC3. Those terms + and their meaning are listed here. + + + 1.1.1 Image + An Image is any EC3 file. An Image contains one or more Tags containing + binary data. + + 1.1.2 Tag + A Tag is a contiguous range of binary data, with an associated type and + identifier. The type of a Tag determines the format of the data and how + it should be interpreted, while the identifier can be used to distinguish + one Tag from another. + + 1.1.2 Container + A Container refers to an EC3 file that contains one or more Volumes. It + is analogous to a storage device that contains one or more formatted + partitions. Containers represent a subset of Images: while all Containers + are Images, not all Images are Containers. + + 1.1.3 Volume + A Volume is a structured collection of logical files and directories + stored within a Container. It is analogous to a partition of a storage + device. The data that makes up a Volume is stored across a set of Tags + within an Image. + + 1.1.4 Image Key + The Image Key is the symmetric cryptograpic key used to encrypt and + decrypt data within an Image. + + 1.1.5 Image Certificate + The Image Certificate is a cryptographic public key and certificate that + is embedded within an Image, and is used for digital signature + verification. + + 1.1.6 Image Signature + The Image Signature is the cryptographic signature that is calculated + from the data stored in the Image, and stored in a dedicated Tag. + + 2 Overview ========== @@ -81,21 +124,21 @@ version: 1.0 EC3 builds upon this concept by employing cross-volume data de-duplication. Every file that is stored within an EC3 image is split into a set of fixed- - size, content-addressed chunks. The size of these chunks is constant within - a container. A typical chunk size would be 32KB. So, if two files within - a container have the same contents, even if those files are in different - volumes, the files will reference the same range of chunks. Only one copy - of the file data is stored within the container. Even if the two files vary - to some degree, as long as at least one chunk's worth of data is identical, - some data can still be shared between the files. + size, content-addressed clusters. The size of these clusters is constant + within a container. A typical cluster size would be 32KB. So, if two files + within a container have the same contents, even if those files are in + different volumes, the files will reference the same range of clusters. Only + one copy of the file data is stored within the container. Even if the two + files vary to some degree, as long as at least one cluster's worth of data is + identical, some data can still be shared between the files. - Chunks can also be compressed to further reduce file size. The chunking + Clusters can also be compressed to further reduce file size. The clustering system provides some additional benefits when compression is in use. Seeking through a file is more performant, as you don't have to decompress the entire - file to reach the target offset. You can simply skip to the chunk that + file to reach the target offset. You can simply skip to the cluster that corresponds to the offset you're looking for. Editing files within a volume - is also easier as, again, you only have to decompress and re-write the chunk - that has changed. + is also easier as, again, you only have to decompress and re-write the + cluster that has changed. Alongside volumes, EC3 images can contain a range of other data, including: * Manifests @@ -186,7 +229,7 @@ version: 1.0 The Slow Hash function is optimised for minimal chance of hash collisions. It is intended to generate the content hashes used to uniquely identify data - chunks. The algorithm used for this purpose is the SHA-3 algorithm with a + clusters. The algorithm used for this purpose is the SHA-3 algorithm with a 256-bit digest size. @@ -223,7 +266,7 @@ version: 1.0 ---------------------------------------- 0x00 Signature uint32 0x04 Format Version uint16 - 0x06 Chunk Size uint16 + 0x06 Cluster Size uint16 0x08 Tag Table Offset uint64 0x10 Tag Count uint64 0x18 Application Magic uint64 @@ -247,22 +290,22 @@ version: 1.0 the minor version of the format version. For example, version 3.2 would be encoded as 0x0302. - 5.1.3 Chunk Size - This specifies the size of all data chunks stored within the image, before - any transformation operations such as compression or encryption are + 5.1.3 Cluster Size + This specifies the size of all data clusters stored within the image, + before any transformation operations such as compression or encryption are applied. - The following chunk size values are defined: + The following cluster size values are defined: - Header Value Chunk Size (bytes) Chunk Size (kilobytes) - ---------------------------------------------------------------- - 0x00 16,384 16 - 0x01 32,768 32 - 0x02 65,536 64 - 0x03 131,072 128 - 0x04 262,144 256 - 0x05 524,288 512 - 0x06 1,048,576 1,024 + Header Value Cluster Size (bytes) Cluster Size (kilobytes) + -------------------------------------------------------------------- + 0x00 16,384 16 + 0x01 32,768 32 + 0x02 65,536 64 + 0x03 131,072 128 + 0x04 262,144 256 + 0x05 524,288 512 + 0x06 1,048,576 1,024 5.1.4 Tag Table Offset This specifies the offset in bytes from the beginning of the image file @@ -320,7 +363,7 @@ version: 1.0 6.1.3 Checksum A checksum of the tag data, calculated on the raw data as it appears - on-disk, after any data processing layers (compression, encryption, etc) + on-disk, after any Data Filters (compression, encryption, etc) have been applied. This checksum should be checked before the tag data is processed any further. The checksum is calculated using the algorithm described in Section 4.3 @@ -346,9 +389,9 @@ version: 1.0 Volume tags contain the filesystem tree and file/directory metadata for a single volume within the container. - 6.2.2 CTAB: Chunk Table - The Chunk Table contains the file data chunks for all volumes within the - container. + 6.2.2 CTAB: Cluster Table + The Cluster Table contains the file data clusters for all volumes within + the container. 6.2.3 XATR: Extended Attributes Table The Extended Attributes table contains any extended attributes referenced @@ -390,46 +433,112 @@ version: 1.0 6.3 Tag Flags ------------- + A Tag can have a number of different flags set. A full list of these flags, + including their values and meanings, is provided here. + + 6.3.1 0x00000001: Signed + The data in this Tag is included in the Image's digital + signature. + + 6.3.2 0x00000002: Compressed + The data in this Tag is compressed. Note that, in most cases, this flag + will not be enabled on the Cluster Table, as each Cluster is compressed + separately. + + 6.3.3 0x00000004: Encrypted + The data in this Tag is encrypted using the Image Key. + 6.4 Tag Identifiers ------------------- + Every Tag in an Image must have a unique Identifier. The Identifier is a + 64-bit integer value, which can optionally be interpreted as a string of no + more than 8 ASCII characters. -7 Manifest -========== - -8 Volumes -========= - - 8.1 Filesystem Tree - ------------------- + If no Identifier is specified for a Tag, a sequential Identifier should be + assigned automatically. - 8.2 Clusters - ------------ + 6.5 Data Filtering + ------------------ + + The different types of processing that can be performed on a Tag's data, such + as encryption and compression, are called Filters. Filters are applied to a + Tag's data as it is being written, and are applied in reverse order when the + data is being read. + + To facilitate multiple Filters being used together, the order in which + Filters are applied to a particular Tag's data is strictly defined. When + + It is critical that Filters are applied in the correct order to maximise + effectiveness. For example, Tag data must be compressed BEFORE it is encrypted. + Encrypting data greatly increases its entropy and "randomness", making it + essentially uncompressable. + + The types of Filters supported by EC3 are listed below, in the order they are + applied when writing data to a Tag. When reading Tag data, the filters are + applied in the reverse order. + + 6.3.1 Compression + Tag data is compressed before being written to the Image to reduce + file size. This is the only Filter that changes the amount of data that + is written to a file. + + Note that this Filter will reduce I/O performance and require that data + is read sequentially from the Tag. Random access to compressed Tag data + is not supported. + + 6.3.2 Encryption + Tag data is encrypted using the specified encryption key before being + written to disk. + + 6.3.3 Digital Signature + Tag data is included in the set of data that makes up the Image's digital + signature. Unlike the other Filters, this one does not modify the Tag + data that is written to the Image, but rather specifies that the data is + included as part of the whole Image's digital signature hash. + + More information about how the Image Signature is calculated and verified + can be found in Section 11. - 8.3 String Table - ---------------- - - - 8.4 Extended Attributes - ----------------------- - - -9 Binary Blobs +7 String Table ============== -10 Embedded Executables +8 Manifest +========== + + +9 Volumes +========= + + 9.1 Filesystem Tree + ------------------- + + + 9.2 Clusters + ------------ + + + 9.3 Extended Attributes + ----------------------- + + +10 Binary Blobs +=============== + + +11 Embedded Executables ======================= -11 Signature Verification +12 Signature Verification ========================= -12 Encryption +13 Encryption ============= diff --git a/doc/res/logo.png b/doc/res/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..d28962a9434d12abb48dcd929b3798e783f15303 GIT binary patch literal 25123 zcmXtfb6BO__jlGzwq28LJ(D%zR43b>Y|PYT+qR8K(`4J6Y@6@h_q~39gzMCez4qQ~ ztq*pnl7bX65&;qf1O&2-v^WR?0+Ipv{R{yP_-=Sd4iEf5{4TBO1Ob7I{_zDlOmi&) ze2DKXq2a7zZ|3Y~=x7Sz=H|w1X=m+ZZ1~-j+1}AS{Y;Pm0)h-eM*OR)d&Wtoo3rX1 zPH-1T{Q4(IQPjZobm@394K(cCP$THCY0gS8UttQ6zDx`J#QK!S30s;g%aSXGkbD21 zGz-W6E8CC>jZkX34Ai~$$Zd+ieU{Tz+*197u-AK23@9%zFHRteMAzULJ4;E_%DM0s z!@jgzE`I=r{FEw>O4`t~>%SJcz~&)pp1>OzL5TFxy|}nw(U2ACt^fMTTY|IF5j+$R z8k-9e+(Pz){L+0DuQsK|+ybpCR8=?c`e7B=P--O#a7bZRJP+x)rtyWML__j0 zly%7Dqyr2cAO&MuC?|LBpT5N)RFUyTZI;Z2llkQF>OB^AHeY!eCgl+@Bo>Ele&aZG z=!Ng7Dv`7ZlQThw5k^o}MI{kMawETKlKw~2jr|1$3o_%{kavu`SRF z{>E=r?MgY&4hTC>FqOWVb9>PC`}aTV0)U%bWqiEK?OmuugQ&Jn^cQB%X*t;p*uT2c z9nG^LaUhT+LVH|9lt7SelI(gsS>P(!E#t+;t2;x!rjH)Wyhq;NckZ>O z#kjzV0_Ez~)sMp8XJ}=g#WTm{@)Pxd2>(jZlRha#%R(sqD(g1MOId)6!SY!ziYLfD z%FFj1kA7YpM%Foi9`3VX>;?my1Q&RT%6&$jCo^Du0WQ|eD^HAS`Cx~V5Pl`3qCa%% zSg=7FH8IZHwYFcLUy!TLQtij zp7VRD7}UQ?*e#~bZ+~dJ77Fq}7HE#}Q)$iD3}SDkJmB0Pa>N)C4}@gvU#|#`Vq3yw z&(OD0Lh5Z*{_X1BR|wzESXETnWb4UQ7dDHx2j>ckN=QiHD_CFeXD^nQ>!TaYU7`+*6)%M)%&a$V+`J!u1XcV@qATQ6)VgG;guZT zQMoGVA?uL|mDm4p(m9!Af?Oi+TKGsF&@fY4nN4XM;XYOLLe4*~E11txz|&E^Yh}40 zWx7D=j2j9EBfZbMIfCUQ0_L+)HD7<)|No~hNRxAoF*KaCDGq)86k+aSIdFqp5JddH z>uwO}oHyu%EPk+plU>Jc7&whMFq;22)G&;YqGY!*tNfjiN4pB<(~KoOgh$*m+2XKa zm0u)2`qTp>3n_EEx*Y3CaT`jQLTaj6lFn)3!^!q*?`aqTyV|YaF2?as(SXO)GOOFI zZXcAQo!HoZ**Zk>uaAc=^y#>~Qj##imMotMYxc*N{hY+oPj9jx0sgpvM!jmoc(!5g z#qGr?=$@B<@!!9_!1Qp;^{gta`^y}0WyLUThkOlmRN%+JzzVWGsyZh@qpz?40{Kc# zOl{p0_r>)1VPqiMic;gGT7|ztwRtzoN@}AG$Le(ye~(xcj6lYQMUFGzP!g`p&EE)YiuTPyP27>TnNGkvO`QD)YD7utGY` z)sbn^^2yxzx-bk+bub6`t9B8;z|zvGSmm`!E!5Zj>M849QNgv$RJO8D*uyv~CaWon z?#zL!TPKBt8J{|3E*jf(T3uP>>>2T;;05Rt=p-x4Of4^U)S$Ae-)8OUV4s>9U_R?u zU-HhggS&rl_`yDAsnMu-6fM=hb3%9NO0E(3jy~S0WMrOPdymt`vSoBQ2jpC<^Ld=n z4=CvW>&~x0)&SlVZ>m`c*;;MznrjaiG}&kr{wAWyAEg$dc2Sj@O}?8Um@U1VxM-h~X|le1^vFhc_h z1|0bFfymml!_}&WF49YF)PL8cn=!?hrGnRtPqy$Xd)4OOn->l*eHjA3@UAe>Q3GMA zrMuuwcgx(_TdU!`_nvx1_Vk_PCj}=DNG}a^?LvfSCbo|m=yzx_1iG>Ti*CrcGrcQo z=z4*}?4s@FCCB9lyQ;xOmX$iwNX^8$(Q#OHsb;Hunimvm#!zsgCiJ%oiu^BZ(vmuN ztz2ky$Gf{k^z<8J`V(6lt{119Zif$^@h^G`Nx%#Y&86RuRdu{NiX|zWW-2la8^eTg zijLLW0=G{UJ}^PB5>AvQ!6ZTdb`beITcyR_l^pjmfGN{KqAc-#ylUj5CxQ+U?%wjh zBvMyBTagj?H+D_aj7ZR+VK@3FqMCjnE{p-X2fMf+E>(Ju!I)46UXMHa$Yb?9%U9Vz zsfW$8qlAr-;TT}n4%tnrrj#rLH`5`{FAUqvAP$^8pQ0Z_189FJ6nDh z+@afDa`1HiAR+whiLN{qL>!x0i5%bc6w<_WOmL1b@~nuGg#c%;US_L$%Oa8P&;MAb zM?Ho3%0%5iglSxu*z{Vc)Ip!vzU{jh&$;02DFj3T-T95+8f@3sy`J>MH8RuSYnnD& zEkB1ueN7GNG?GOI>@!JkQ3{Bv@u*S!XS#`nN{jaWYNlY#w*``IYdY#4n(Dt@Iu7(n z40g9%451y79Tc7?VFMLEo8(zdnwc9zN+lxhh;vYwyyr8j?Y082BOAaSJTe$XQd z<`)`nwlD1$R33AJg>vcmr$kGwE_NV!U3+I*a}%5N&gxGcA{RPHbgXHzx8f#_B(t{J zk7UK)5Z_{!ibVSshSiy^8|Y+ys$A7h@cYkCf(W-Sa&Gqz=|-Hz8^~D+JJA^-I%MxO zOQqF;HUd$M|4Jc!KQuIafAdoAMDTl(F8p{=`b2^}oxXkAe6{$;^L3grvd+fCs?Lk& ze#mFE&0F}(K6+kX-}|t0#?AOG_f}-{6t}LI$sq4VoPv2r9AV5~wQs7c29;z9%Qyd| za(tyPLo3OPL*Ey(yZq;mFW%S7=I8CE#aU){_x3AB`=#xfDjiA@&HGj%Xxkz%C(Lh% zs=6HG);eimYMpuE_{nfea<6LD%3C+rhArvasaP$=8NM)Op~+_R$OG+#d)mFc;^$Ae zTl(+*zSZ>Xaaa9T{hB#tc>!f5CZdk~|K%x643j=9=YtNN&)d9jnFZbi#-d(}`Fv?+ zTe##<1+)o|<}Ns3j*r#yBzLEmWT__)ZzJ9=QGM59rWXt2vROplC*kc;7Z|gnqe8bk zIz=3Xdj)AK(SJT-{>Hp$r%(vHjWNpg8}SuNz>`%rb}>Azz|hiu{niJksysw91UE81 zA2e4FuS_5AKD$k;d?MudLl=Ic?s<|A*j#3wUFqSJA4`Z+&$lqVsFjwR`NzZni#af* z{npqc*yfK7olEShL#yqC{qLTyF_J^wYjdGoP9nuNLljFS3>&eIfqo;9nE!h=cDr@| zfV3~z=0EI2A~feW`fP8uWD32i7h!8M61%1FuZK6DzzVAY^3?m8a4J(H%tjuGWY1iI zuc?vI_TlR-1xIv=i37`93diD?>6Ul6*Gc;h!^hH4ks&;`giSeBS9?-`s-2 z)$Pn5BhaAW1+>-zH+|;Xdcv}Hw9{4|)k^mn~@nF91zj-ihIR<~BRH4~?Jvr$}%*bbM7 zz5RvRCWvs+6#O*8J@a^{vx+OZD;#n{S_8VTKMY;o;^@j$(wfojdyZ+`>RnxJnyNh$aKc9G2t$Q1| zt^q5h@w#j9ik18w?fnt{MnxV@jLq1^;~urJa9uLiEJ%?Ow|Z3}{vtUhhmxOr8}+wd z^~6;VJ_&l};dAU%?ZGYndsM#h)-;SmHccQJXO(uWD+||VBJR!I!f{Q!kc}S-(RrSa>ERgq`O_?N#n-rQ!$9Zs0CC!wdA2U&X9J7=C%o zAN;YK8roxl>~BqHLK5e(;SgWWwqp&Gv3PI?Z2B}Zh)<`i>c^iQ92+K*8mc=oneLVl zBv+O!9Gpj=0&?dpzB>#D?d74hw5BA-S#Uuqy5ZJ)0L$sSb4?FhI9HHVFB&>_Pe2W= zPOC$9=6fa^fin-Tl&}Y_|MmDh-j5|V=*@&9XZlEbg4jfa-=$7 zXP77GtUq7%lh3xtsXuuZ4zuWPw$qA-)Lmw^9TG8HSg;imT|4rXEKU6x@EPpL*{1+a z8cbpnv571J=Y_=Qc*Nd@n%UDYIWnntYVj^h$w`3RWxF^5%!tKY1I>6@H;4#GZv^vY zf28cW23BSg<#L-n9=^nh(FSO?+Ohmo%mY?apwUWC5iYO+3My9It?4O zkYD+`hEHm<9e4YE_-|5^ih4yQ_=t#44qm!&PBb2oXQX^YUkP?Yqe6`@&jl}NDbZu-KMzbd~9ScEE4^(yo6eEt-_mTy33>MS#u-F=i}LN*c7(Yp}MN2N^x9H@Z0Lc!EeS% zS8Fe~sW?kzU&JD13sYZDiz~EQ1C!I{#EWOH_xA!C4h3U#+3lAb10OE4M7DIO zXs5HQZ@{8IxLXgmTz7MI%vl>jZuNR+V^}!d-Dxdvu+w4~Bh3%HdT?)@y6f|7pRJ$) z<{S~Fqi1O|y+W%wxec|a6kMx%r@*bET-Soz*(bQvbdP0VA>?;q!fM~Ksub(rX0MDY zi*;>uyiQhsT+FP~(_BJ3$Bh9i)c;lwZ#4NqIdK&=IW@ZMJ}TZy>+= z+cI?S0d*nCD-#9O?N6!Vul1>mDubkg+9 z|9<9Dm7Md)Nsk62!B(nr49GLqD4J zJ)&0bN!VVCzpeT`1mZ-NVJk45iAL1N3yl$ibGHe$AFOhr!0Vbl>bD_wcx21^ zc52cjFE1@mHhjhAwh@uF(SZWVy1uxjfxlUA?izZCz`}cJr}0$${aq;)60XRH-0pIY z&Q^N~W^q?Qds3Dd7OEb#6vY7Yc@4vJCOSc*x&a*HyEP9gsl?8p#t*}l#WKrp?SeWQ z7bDyX8OVjE+effPr0ey8`2oa{N2EBjv&#&z1q4?itDn)V1+ZTO~`G_c#%9sS#r z?;!BCS#-t9)Kk>)ruYFre&t#I6sF4R{#!t$(uj`RPQ5=~Q7GIr= zXyG$;XMv}SgqYYcemSAkf9&G1-C3eZ73(tY;?7Z#YV3_=35CjQVT{klxW`Q-{~kRP zFTk6Gn$-Kee2X&`UrpD2I@lo0nb$UFAFV5Nnv;Q$s?2qn1Xb1pd!Rt4H1DNth0KQt z9lz&ae0TdJ2wFk`VI+z1XJ#hyb99>A@QILj77%-21CIeOB&l<0wPN~vI-ee={%QmL z4$a+j*doev~)@xbUN1bK9wl`zuo?yL+{;H>eA^zFi?_cdlRn+1vO1 zSw!#2g2>psYKRqWqsdhFDaE-Ak>4*8$RTDW(TOUa?Hg%s%YycB1t04=(-XRV0n1hye(7A9ZFQe(Gcj%x5KCEsV+FgY8p43z4f zEbuL~anVyABFrE%RuvPNZkT8wx5k+-@!%~6s zPD^RE;RxmL=<7%N+`aq()@CXE*2dQv3dmEheVy>hTSMXiWUfyinKId4TGY z+4f9i%%Y?W++?YCjKoR~2R$A0s{XsoBG}qatX#kloh+VV7|mV`U|2Z6G`k(jJqUJ=Cc4q-E)RXTsdC;BuX)t#33uYq680R{21D?|&~j za>FWm238_Hw%dx)_tM)Ot+VEHWW_D?BFZajF?2?sip)_v^or2sRl@uw=QM=O(EwC+ z^JvCKS@dSbm6B*t^ku0UrNa%U<5@ z{o3c8==Xol>D9yjitFomuv-kS(B=&^LoP$Z#05A6WXa>U$K%U8XVa$=#fUj%R1%4c z!{qB}X}tX;pc~539srvy^hc{D*qbN`4Qw&?X_s9Zl2a>vJB(m z>Wh{B_b=+x!T$T@wE#AP`1_Z#70WYtL2F)(3U9qYk9u6^x57ar)?5-mo*|%gh^^or z)7|q>gjBZ(c;i7rhS^hNae+}q?`RQn@hcYn6%idSLr1k6u?Gc=VS{+V`TTFQ)oNLP zpv{-spQ+x7+oXZcD$GQt{EOI9oW#L{Bxcy7JDT$uL3EaQ?fC&L^RM+Ha3Z^oVq8(H z<0}aejw_?>Bb*7kz|FpXuEoxGEW>EZ$c1X1uHeYXq@YH64M8aka=q-&nYptDMPHVA z(9i&CD+}U?wkPl+#Dbvx5gP)4@k_Nw>4MqUK>E%fZv!p_CVIe}v@>D5>04+h|6j`d zv1MBci2)3JY-^e;9NcVaXB+RLm9Rhi+^6_T_`|yB{N{KlbbY(XAcS}r>_tupZ z^W7Z_dmOiyvU_cOdY7F9!e-LxxBBz3t4dB$RzIU?&c4akuYa15AYb+C+;eXF!HXIW zbl>~QA(63(8)7i;c;h7PqaiBHDH3V)$as57ZfN_Wgj48QwXT1vd)xpalelKe>br}pc)HDE96uD_BL3%epk8TJ;<%|x z0lh5qIEoFDVE0@8AuhLdph5oubNkg#_B!_GD4oq2!|TaIkWuMbl|n`8bL*}UPNBxZ zMx8$Dr{omoFo1Z_<-nmlEIY{gmGO+4J-L$^>+b^Oe}JCbEFbDh*sVam->|4xzL3n9RI>yqcZyUQ&klX#Gc(J2NHOma~xCwF1= zRX3H0?IKYhhHUtmzP;AHLYOwBR-A17oq6 zQBJ6-o!SDTexXEkQrkGUm9U1Y3ep#iRq*@UPDQ~U)bb#1WW=FB85$8q$xa^>Qljyf zGS348Ura{_%9F13o-AYATr5%u6%)h7`N^A`5Er$tx?$I2L6;xq`{OdP@5)2=^zn4Ao~_hdn&2h3+LPq_PxA_k%r$s+S)XX;;sF<>nKX&s!I{H z7fO8bwwx#1C(t0E`?%@lk$M*x`i!E$v?C&mU0yNk=IP~@Km6G}rNg(%6&64oEw0Cq zes5lbj0a^#K2hN2swQV;Z`7$*b5ds8BEA?B=k_@J z^2=YMM^3M#)y0WM(;Yt17JZ|@z_{Y^RTETej<2KsEH$SX2h|FM#bB@(yM5|Zpy^!1 z_V!lDy0^EV!~C(U{h?dqqq8x}LxJ}aTThat90eg3B&c3pb9KJio$Uc1n1iZo6Z;9wp9n z?gVF42B=**6sgAe-E!HRJ=Rk0jZLnou~|`uohkWf$A0t=$^#D93(75s-Th@k2cfla z&=bzpCz2b|Wwfet%`pYwYt4>5$W8uTS2P@;`g>BP$p5&i01=i`0gz=H`$7N!HmGo; z2Aj=t^=o4i)J_1-lu9OdI^;7V=Q$5b?I@nJvM`8~+f6Prj+{im`F3O~_#-kbDt|xZ zS6IU;hA8Xd2x>`&tfKWvg$SRKqfrVv2upOLOy|#^0R*)lw6EBx*V<1WlOqUzd z_}k<}g={y=Pci0f3=j@v=l#q&DV~g=VefAkOj^A{J%L?73C2Tl%zXGiFTnbn0apdAPBzo!g*y72> zH!*L0kF9SuOHCCtW)Lnp_ux9&)_*MZllgkL7dy-wJ&EzG?}SZvj6h=*)l0N%N=|yP z1>Vr8Al*2t|I^i|hRo1gJ3(7b?C(!bKcP1KTl>c6;aKiRF_AKfP9Jl0Io|ZxBh+S| zXMS6LK6POg&i}%04Bk<9!UxkEXA}+l`6Gcc2cC zC4alwx{#E{S9gvH!SX8s(k#e?DKj4=)-i4{MUw$yk-)DLnjc_*Tx{L`UF-UWYnC-1 zn={hBWXldfn4Lb*C#I44ldb&j`j%%hA^`6NpQhCs&q+((S!YxBWc{uqqgZaASIS5C z7TGdB0<*y5{rwE|hr_iT!_GZVMH}za&a3zwuc$xA^*Oqf2P-HqaN^w9%9ZnP$WV5d z9)5kE8RrNMeN3meqpv4Q?vcb9l02?{)Sm>{`9L(m(1_gkltPc9L*2y(w|klXu_w$- z1;t-=eIG2WBb|qQNy(gP%at0%UHb zB5~PHbwFP9kz(S;yo?9M({@088=5h50uB0TZrs{zT7fRJH(J5dCSD}C*=?+1K+l@O z(<$ILiXVvf6A%o2_3GtHsd230uH%5srXl2o1~iC6w;D~{TJ_@* zN$xLHVOf+ocxr@<-92Ne0P()Pm2maT3(!vCyxTbYIFg?P75hh2072)A3hD(Gpgx(r zxcTmDrMfN;Ro2P^ja=OWO`+JA#@jC^R9>7wF~L?YV2#w4=rgI1+0$?0bsBKt2qFTA z%Mo*Z77*3RCh!>`BMr)>vfgl(E#|>U^cZT@-B-D`2Cf}HFC1Pf3RDoq- zoxPfH4LTr}=p6b4M4$g`m1p)Ui6PaO+)=^7Q95>iXs}*(uXXt?f;b~?`aACddrzl! zp|os|+?dsL^L4q|0?vD9e561WdhoZBK1`FZSp?<&{>q`!uKT-0zhIl88jxqxZK0X; z<#w-vycy{VYl)xghu7f$^`{u%%TfP~XJzUdQZRIQRwta=ex2`MAZ#KvUEb=#)|A^& zsJ^iJbRCxw>NI~;)_js55ok%XQ(DVT*0ldh1WT&UF+uOw`~%c&OJ)Ghx~xdv5#+vP zOuVWf`WB()+NC3We#Z~cIF{Z*Zo6P`MPqw@8`@7geIN0$VLAt1TB&DVgG{tMjebQf zg>^!P)E2IZ{VyZ(X7TmK_2iM6MQCQ*5lnDv;Hy&*hQxT z^#n+TC_2)j8>;wh>MZf1kK58G8KiZhB?q{h*C}6KIzoS@V+a^{9bJ;+VboIz&C43a zzo&C;;->07j$?AhG)NuHulfyMgo6@YL;9VX1-It}*XD8bbC;=E{&`R6xSyVaof^Wf z^yEAHUY6Rp;6DrrAx+lWVC7yGewrvd{V|@THx1E_Bi{((7iJ(+7lj6#LwQVh4)OOR zwT|&$W9i7^Dq1poz8k*vyT}Wbr)Z1_F?h8lpzg*GMxQ*ttHa4ZSZMup$)>iwH zjU}WlPM%;3GP=`y4p&{(UiBBBFR+@B4S4p1I2HE;Cb`-fW3Vzm+OZ2 zaLO*hdB4Dn#|f2U;3xwT{tIo4iDVU~9IxCFvg4er*TH&JO^FWNyOsh;6gP224~)Lw z=d>>T&{Zn5z4EVoUG20Lry0Lll0jLIolKP8yP{su?`0$TW@bh-SopCM7yt_8jTQl;xK%n z{x!oEWc`oXq3x6KRfM5iBh79Y|sY3Eo^D*b?C_ zQ!RFd74WQIR(tq!p+Jzxs@y@=u>AS zX@LhE@EIA7JMI?H@b)wpyddG(J6cwtQ7nvy-3l^5d|j>2__MjaD+%PT%i|!QK%Eg% zrHFm-3XkByar&7Ng$wGFd&n z8~qbS?ndVCbO6nYfB}MTcR>_^)&LD|-{KcqUTp&Vz;qp$3ygvPZ1aX#Jh}Y}u6WxQ zVb&iZRU4b_)+|&wm%k2otsn>uPOqof#^DA^W4x)gYien&maLU=p|gF!{f5mjV5`u4 zY5VGXcGGwK8LvLU1M_$BirjQy;MFt9T8@iZGsFeoCX%z<(?+Cd$bLZrpDb^~8Mjh2 zyH}K`yrsVVx`kTywz+6(y;1nwzG5b1r7DJb9r~;lXG<%usl)wDG)S9^Eb^bqG*B)^ zvQ7c9!gl-kPk?zUuet3WDxw|X&IkuBUCH{V2g*Yb-{wL=3b?7ZsurWH7V6=oC;59r zvoVnNQ`@G0=V6s{-7c*`rR5cTm9c#Qb!9a>GO*!z4h}`q9;q^zw>R00 zF(Y zH<~BT{9U|Z{ib^J-G{r`uT7dSsmqhBHa%)yOV4n)7x#ir;1JK-4 z^iwDh>X}uB!oga`iUfAZ2L$P}MPY4(DMo<_t)+U5)KAhP#+;?n3?>FOCa~kU6Skl%LY4nQ)1+}Lg}n1FGOR=z zC0;-VyitIf+z&Jy!z#N!XR{IucL@zh;IG~Lh01qOTjETmN(W?FnEsCS#aimS8C|K9 z#+J;mT|I9caN7t22x-@995<_c7*}YWwbK`iL}DTLdNje{mg1SMd{&z79OBe}0Iy67 zY>NF|z4-^MKg}(Dt&x@p;M+nJbWf_%ALlX?W%y>p?$ocQYWbhkc zIb?r-O}RstA6sGJ**Wj)u}~_9YD38?{I(y;_+YAC1)}@iaZhpHAY+N?w|yt}+mCDG zp_%T6FI=-wQr3e=EJx_G1*CWK(krm%2nv29kNN}JNX<)dr@KeXNB`4tHP|D|l4EB% zgP^htXRoLp-cNr*mApembA-jAQ7XicE+2vY-_Vv`Maq0KxzIY9ay4^pN&z)_l|{q!94$t>Ml z=brzzcK*EO;~qTi>hwKd6wqg1v>l;fcM~AzFS$g_)zxDTq;-Yv(1M8A|JTig_&^6(V;?< z8l%BzQUsPHuls=4;lj+dPreY&mZ+w|VtN5Y+{nM25$6*gUG$CItQw!BTTm*-Cm-jjjthKsElMQ2b#gbgvu{MDP) zu9Xd*v*IgjA8k{w7{(Y-6?7*o5gW{E2WZ3CbV4@Y6TFlItTx89*-z%QUO%hXbH&ar zGd_WfzAAYF>y52^Q>iBygkWgn{#3DbdT8|G_PvB1SzpDTmIIi|;D8P$%I8M&OSg`T zOV@3{Huyn0iP2OIHtp*Ha^W?tGf!F4vPGk3rUH*Tf-<*M_)v!ZkK6w|HgU-VQ$Jbi z8W*ZSpDcY$mGR{3de3+MyX^6*&vDm|qMmCuAo%Z2!-Z7FYMt`R#w@MoiGUu}-~Tze ziasA9eYt+P6lmN%dgyI*I1|9%tjG#YPLp~X4%uV<+_FdKuK}=NdK40kCYm#4;p{I^ zql%ClLM%f+atNaXrAH%y`l+U_7DM!1b-}Q=x6es<2S@u3ruN}J^Fwde?aCNQU!&zP z*$N|qAGKDc9}Ba51%^lo^mlstEJnbCa4Ok4Alj(2)BvZKx;?>>GU4p#HOdw&2|%#| zQV`7MGFPGp%~DLswas1J_QvLqs*Tk&pCj*VwG zAY8|EzUrA{e16M9hxF+J-(8)^>jvdESxvij#BD%r-K$s>J&)FFvJjMO{&9GDH-c=b zQ7@=3uhBgxU(QG5rg57%8o#JNbj{d`U@?J=~-3=U; z&oLl4MDi!-Pi)e|vk9Oe?IjIFZN|~0aa4c=$w2Px4z174;PpzxG#6|2eKstbKp?-k zbj)w4=AjPvLifH!S-HzJItydEIlZxp+GE*0{+NY>mp+>hw(eoc4;?f4&;O|LYzevv zdO&{tYMfl_a!&UL&D`tu7e61#zU9tHmVMp+g$K}Pq%=L)>tvi9&UQ*v4an6ak9H^P znk8J_n(aovYP>w76fr#p16IMv*>jO1n+RT9# zWQCuVjch@~5~3j}cufH+KhEa4z@9eOMYRoeAId5~!1DR-Apy#?uCGQz zY{(#9(2aW!9_0|qA+dI`Fu_C^@QQ%Q6B0oC`L{JtaphmGpw(>2LqF&uKpN^ysUh;e ztbhBvHkS&BGJ|vOMO~!i;sm=&a+6lbbSQwRx)Y8#g4p4ZP5Cw1qy8BSNMKesP{ILw< zW%N|QrBHyW5Y(on3G@q60O|nbjCMy4^*bD{$wNs0fsiod&BF@0zy3dfd8v6{lz3b9M(arM=5v4r0G9V6vo=?oSxR{g|Cc&s`ERFXrkVnN2=RMW zy9<%eq2Y@EJqs}De1|auf1@9Hd~ud;C-Ll$5%u%$SF36_Aoiz$IdRFp>Fa=sLauM2A@Y{G zn@PdHw#F6iB3@sF(nQn~tGnJ4f&L}~wN)Z`ea5}n*0}TN6&yBOyMu_QiWP`<4)qQ- z=5Hq&@(LQxX4H*F%Y##5J1lH=;aa@?i(@EcOCUxjlxQuHr%iG15;MSN zWcC*!M4fHTjptD72pylR-kC==?w#Yc)@=E|feX5>n(Ho(gTftPI+wg|pp4lf12H6!-~SG0B{qzVlmsah@6Z0SCKB@b z)k7P==lK+N8BN6n5J?}F_S3T665U2dm-0joOkx#`jl3+gYIqmhk*1Dfyw`23r1wc4 zDYjx0z)kUBIc)As%AE~J?P%_spVxxMi~)r=^{#K^kXxyEfy1R64(GM0=fsm|PRaBW zu$|@c-_SdPSU9t=6m>1WcpNV99S0;$65fY|Daa@`B$+q^Vcv^AAHV9lV>RveG}^{! zad;-z4I2G`%~OwlEQ{)_d>k>r!6NeI7^506E$k|#BY!hm9!(AM7b{1P!bD^6BE1J* z$;=_2+at|$wBF`mDcXle7(LOqnFVMd%N~>Se8;XhEA>M?xrP}CN=8Ef(Z~wSZ0lMn zx@6S8^jp}^mTxrZRLY~?7fnwD9J^0EfjVI}S#0anxMv;<$kupE?|uL?-FUeiQJC(IMKZMD^PX(k z&gRmiVJ&-sKz=a$1`GIxNB6h=xN$_^AJ565P_th7D+Xo-K*N7_p5s4*wGC*Ma5X+U zwD|ra(U77)aGxQcO`>Gz?zLVy(LU*vhm_z&Wq#~RbzUOp)ST-D_LqytL}uB{GSkvb zEb}s*+(09#&ZXUd+X$l78{2cZR>dCGK)G71*~W|CtIP*{V68{8pW!ImEkKIG#Qf2K zh2TR#dL#ABjr^HkIouI;ne z0kgE{k@saWz!kGCe4diqEo)s-!9w_9L!KXf%~%?FHyyuXI=K0mSDhcWq9NoU+5Dv6 z3G6xum-ID+?zp_D5yRtxq9Hu~8?3YNX;;`9UG@f1QC)VczJs+K>b$-*36#a6EqIO$ z-!=qTd*MEu|4xmsrRqJ=0L(Tk_p;N=n>l`TeImF4ZRs=H>Xao^^PB=kpN;po=*RLV z&7D%o60*-DXWD~OF&1iNbnBRW z;jHfbKmsMJr570Ps6wW^gKJ%}9hV5fJpIJSKuxC)TgcF|V+J=JM6S=z;yG=V0Bhuo zT6@ll7t7Uv2>gfT;=E%j5Tn#cn~!{{=LkSP!2!&e=-6UFHe!EGSNw35ZTlR;E)o+X z_tUc}4*=^Dup7D7%Xq(b)m~-`yG*hOgci`~$k3@nOVf!3qLCUd zPLH9Bt`2|c(M7nVW<{JnX*+{_jl9<^>&nDrKF_$U#EOvj^|}Ab3m>Jw1rW$50-jkb z_tVwit}b2keIu^`pKKOzw&26jGS}?9L`^{-G||aTC7;Bk8MtAN{CA{>y65@XyFQS~ zOW{hg{ORSwg*JTu!+#Fw-h3F&_^jTPQO_?z`CHo~nf=96)9Xz}RHkw`{}xjj`uF8M zs+zhq!)dUO(Hu{itDUn9Ty1-{a#iWF3w1oQ@)yD-6SZ&Mx?^#ck!7 ziNn~R5lJdz_~~|0$a|gsB>&;@7lLD9_z!_iTJ}+ZmB0d-6N(#wTuYWN;1^ookJdlh z`0{L1vr1n{2pGr%DJSs)njD>STw6iHY`Hw60+P54TMB>|wN$zFqW~637EV8s*bgJ~ zoCi)lhA-)KJVF4N2}kiPv9jU}*pJh|w)!y7{mtllu-*HkQ^=mObzm^?f++Oh{W4*L z#OWQ&^lpuMPa;fCPg5xy9nhnqqW`8E%da<=WA^w{WtyrMJ_bYsg&Bx;%!Ze3_8;OV z54pIa0n&GbfLeN37({Yz=t}Bnq{9oX8_X} z!ED(dVDHeW4@;F&?+_+eukXf_JGD5yvjOIFfF~&O>;ob-WTgvWOfGOtt=^pgBJ~yt8jmC;dX6!XQ`KaPa zK|*o-j?Qlbix(vrF^&*i6``Y$Tx50049N9wRv}hF68*9W|4`aPyA!QLJ?voceuIhn zztewrUwJw9VmFe>Zz)?KAHLu=TSVD`n zh9U|+17O&6J;+9u$IZkt_gVaN!>N7m{650zz_|l6Yj1V)Mz!{7g2&X@Clel#Da2H> z=lBH0Msb8%lz{Fd+2tG$vp@*jf`mhy{k=sEYTNVm-Wnbs*dAf*&yWpkco8#(n;{9) zj9P?5yxYiG6eyXWiv})W`#*03Chf_~$Ra)xsq(ptuWe@Xx-CD_-FhAlqyOj(brlFS zN%kaE3;$i2`IQZZFY@U6T8Y&yn5j3>7jyEd-!#F$JdY7*@|-=2P1AO^UZ@()O~Vqd z$b$&FsqvbE8td40JT^_~c5fr>24ibwF?yfizC$WNgiBv$j2G|!P9?9cr=n{htF_&r z1CAq^$-@HqI-TfPHTBAFrGNCvg98vlNA(*M-Ih834#=e{un|NWxSuyWIMNSd?+UV)}=1O_p(C5IC>!?|6GWtkJ9Wo;8DnSbJ)a3dIqeTZBb# z>EPy)7n01Ncg745Mw>eZAAYhkI|Zyu=Ryl~H(9LPg1Bt^s&f2_P+{97kKfXCnEpee zAseg(bT1P-r+5a8tbB4(!9+Wnh~(oCbF4P!1T?zWQ0;{YOGn3;z)VJ~hBK*3)1?9? zM2=)zZoOlm+Jz&lv41!}D@jx!dhTr3{*tSX7iXjeiW5iwrHsTsM??%2mmEM(9hzqm zCXY>73@jk?p-`llSx-+Xp`@qDYIz8Bp7{dtmlD|_=K|r_hU3Hj1NGr`7~7bkBL1>y z!Nn`EWNd95ke^Qss8PJjD~9Ig0r?$FC@4YJ-q7x=|K|k&)&;Od0Z!P+I-d!vpLPI& zZ?UV--%@iU<%o?uYXHpv749t-WcEzRuAP;LmPZaJ2K$}*|r^ zQR#LeH~+KC8nYvK7@&CIwgPq{Q~(xuB7bn4yN1mmZQGs` z3>uab4blDMB^q)F8qT-O;{FN^s}LZ>@o`LPf+rl&i^#H_`(UOCrx`r_8EB4|n<@s* z{odjK{Mb(Bb*D&?bg76(`%);+GoK(2DA#~Lkm|_UEblvC_q=2{pvV9oEt$)_;(v>~ zOQHm>s$gn?{^17KePw>g+DAMBVml1c3OF1&y68e4CBv(Vw`Iqa>f$%66F9(Idfa(h zU&%v4XpX=s)z^!Tk1YrAM#@vQy}i^0D=2dL=q;`MTW4G10b1A*{YVBt4LP{|D!Z;` z;|&$74E$GGRObBmUfQFO&`7!AnkccOLN*?H3VOH>Jq%1jMbSKFI^HZ1%TFYB_++!290B`^KHjM0kDwl`e*y^AS$^2Y9@ZH`uP3IJ zUk;%bbrGSW3y)VwMX3CR2H?~_4z#Uws`Og}TnT^*spXi8xzbVDJ>H%e_iLK#fs>XO z*}%C?KnPx3S<0IN4)<`+uJA3d7@3%QknjUCY?bwry;+Y-26kwYa`)+grAI!*}`z z?tRbiJ@51U@I3E{jOF4@kBEpIugz*mo>@wv5#%HSf`^H#AfAYb59Etx8YC)|1u;z# zC|dRf+s8^{M0TY(;IMey;1J`=pt=1kOU^b`dBV{D=sZNs13Wk470U4sNjp3FP600kM~_);rSTQEl}cHsj&d^5mg3gBwMPr)Z8 zsDF7UE05qu1lXIunoF zi6$9^66;l4=w8Axei2P=w3I?Fb^}k19}RskuAC^g9*+bKTPP^afD?p&+x&xo#qh+24 zvrKHu1t@(^K)`Jk=)D>Io-7I_HxuVHWoF;l)se;_hn&c@C=>?Jib;NFatu+roVre1 z(GUVR2dGdx+xowp>jApGPC@}#{XgqO8UTIPHV*}y(1v6GmWttI!p#o@wz7E(BtRd{ zzqIOdmB%pI;U;gRY}hf8pY)&KQZ?b7$9IXp0Fd94eJAc*EDD6<47f9dV$NFmdaH~g z4BD4PBXTS)dMUT|3M z05qKjOcU=GS>Q&=8j8sUF#JdTN*PunTED+Hg5tfYtNo#|s+SRj75o z{L*kA2d8hbAKY-b&?`02m*FmX2H3V?-YE0|<^<%y);jGlzUYQq_c4%ne{S3SsA`)e z=6g9j?3({B$vi!b?94$$R3YHJeAjn(@?{zo%-062suug*QtXZrbitbb`)9p;`ISsK zcI&YXSNBz7^ZA)WvpzWa>M@c9k)&||oZ)|^UShRxgJSiay4PQ`-=+VtWA*ss$rDjK zdhT`_DrCuhi}{@j$BKx7aSw4Un#cQ`44`qq=+@-IoRz<*kXrp=CtNBp>z0^VcP;8& z5Y*t3p_n_79&hUz^QNrwcr!I@6tMa`uP&5JTa|#*86I!~;#!%e#Fv^b)Q<~#;RI_H zfwS)b{JVfbBG zs2AkJgxXjydcvmH8^OMpSU@B1XtCDkEMFcCBcfRJl@Lhy$-gkn?=~Qhr4_kP+i*A9 zfpb!0DqMm60E`TyPxdmcsr_$nr#aqk8jC;^&$Xg(hB+Vl19g6enCwS9t^uUlP(;B-Vv_dlGxHV!n9p-Z=oqUgT(t8xt1R}eW&@Sg{!==rX+%Jun1<-#0noxW+K8YxKk}s3fuNyRK-gR zXTa_i)MqWJsrhc2`$qq%Ku#L&U;Cvf!?u2i7^>*H3!xFHr)e z<@P;4=_S9T+b6%SgdTf6o=R}HcwEe6`7IQ(v5eEg%nw0&etnel6;4K?E zx@s4>xQk8asFs|_UjF-B<0#zc*>wq3GJ#WjZ^VljyE`*&o!?NAwY}{9@|li237_!r zM{Ha4{Zw!r&e=05$#1%LK8YB)J`ehoVD;|`G9{6_4;&=MrD&6{-s-S2kmdW=! z&t^|Oq#JU73vV+?Bvhr?PAs7xDGG_^t=%dd3#gnq!E)IHZC~U0cKU8?S0K!x@J04s3ofmy#nMpCKfsvF?+ni z58PRklX$=6f5Z(($(()dHASz?Z>oxNeC{3P=4om0Q^gv^r^Cj^9oe@;VW=qIUpG9h z^_~3V<0Vwn=^EA?%Np=v2=P7~G(AdMbVd)J=A?#2jSZ3L0}7~^s-Lc(7K@T4lwJpd zO;TvHr|x!-x5s<4v@b69aJkdJe)hYMc-Ch zUQSViK+ZWq&})%1?Kd)C=IRNFa*sGnxZv!@vXa}*!NLVsZ)ln0&9mtiYP2*g+v`>h zLzhR6`{+J4uCsb+8jHNi@-OPH`*Fl!w(6eE$?$%Ze*@1ODt6;LE$99Vc~fuWZ-k6C zpxofvrsWqy?V4@bN|JFA2B(Xa-xv#j9bt0BtYo1)YYcnVk7bli1hNvLQ;xfYH_%ub zLG8?Nh%p=Ic!Xq%3Sa3`&vG%@Py~NWgR^_ZVd&i22?@!@UOZV%C+Q5G4tAufaWv~c zefHt}I`52$vD*05qfXvV1mS7s$CT1}p74*XV!4NutQfSGz$v71BZY{;3ZefIb7##K z5z_4P#Rcb6#P%O)i};O9B^bO+_PguZssu4npV7zVmwhpQM!rX*^6kpDCM^Y**F zrEnX=o9+U=8f;vv^O-2L%%s6R7e|d#C@vWH{Ur6v=Y3*#PA#HyS?z(F05ksWRdIb- zFm&+H@v7LipeB5z3&7)dJoVJq^5uH)nMlw{x&6GX7>lWAU(8s}$Uw|)Z#=+0D4H{T zIj3#UQl_Q3+vExMnVHJqM=-6K|M(k$4?JsXxw9$qK2HwpL zU(t#82uis=^HwQQfksk$R~z2An^4CcHWFf~3UQdgkFT&)6|2tKH7=1la+*16xq!@9 z-q;%Toctk?yt6i3rsdq^F!lU$VPpGc5=d>Dghwp3L< zGGDL9ikIxl@h4jWeizJISt~GsN=?Ze(b!toEa|BCOJCjIyU8DM#;FJelw>JgD+0Xg zV;iB%jh;GQuIJ9{9|o@@h6QdaY9F(@=GmVLwg-_u*_k4KCssWosdG^`(_EcWocM-S z&jxP#psw0q`|5=tMM2?Ftdu^3Etf^CAn!LWuB|ryP;F{N3&*-^LwA6HG&K>77U9iIQ38c)5Xvui^3FCc6T14E@awqh~)Q zX4yzuDxrkvMmWwH>_MKz^2!n6dZOwO{lU-7axrxN8zihdY12jyyE*78SA7eLo{kEZ zP(45UpwX0K=|)lOh|Wgp6y*;|vJBv{m2WJwVvi7oSp4nACHE#=@sq`mIg%R7!+skHKy@kX-UQR5VZ@Pp~Z0Ev#0IKJ3 z`X{%*s72O!R>UO{oA9h{U7D0sQR6z&mTHB5J3J{;8)G@83K-v_TEDuHEXh;>ICtsC zwpr5ga%=yXN-UZ7t&giM;v(ZQeT~CO%eVV`9!z{vF|gZ1Jbhj9#8@5MwU_O=GXNzk zpPvX~5K;>V8Up%ZIJJv7`HVgO97KWZ&wtW{yVquv^(9bzg+Gr2i=H>L&*At~G)hYoORH5hp(l%cD1^ti_g|0OnG1u` zI28)^60IVu0fvgS9*niCscsj)wIb{}?Z_6Dk?d68ASJnAK(OWOp=P&5e4CdTNnJxv zL&n2+Z1@30%OdrU86r3?Hq)W^sDJXliQ9Bx(7(qI@T1J@4+VtFU9Cdeey- zcGGd3_| zuyu6t3BGD}M#&&gXywfi|h)KkM zg{FEnZmlJAF(43*fhL6~#?Og9Je;rnW&u11%MNq>U!4%1GEPO*x81+H4`83|ncZ!LOl^IT){3Nj0CK+HTDmGqIT>vOc$t~2 z)(-ZAYcm{uZA{$MK?kK@X7|ZVu;`6KX+beznONu{l1WHYc29;&q5KtN160y@?Pg+MMU&=1VHldWw#f@DSb`c!3u)Vl}6CoiV|a=G2#Bw`38tyPUHd}XSoKsOza;;?cvWA z^Bos#Ds4N6GtIu*_ffdr$LE00KQN%@@c1AaR#S1K)t|sYQjvx19W6ag#NGZe@-(yCwmIGAf3D zC6%FzcAHAo)E1}20Z92TI6&}q3iSGvfO?}>MI!9|BO9eZTi9^z53tkNnoUY1pUoix zkOzrlFy3c21B}7vzU7ye)I1U);6N|i!&iWQ(qDyCY^)+F(pIdZWW(17XLr3BB&+F# z3zugK<|ix@CWEjl^AR996XJB>M#S7eE{J{^J6F?Y2~aV=deeJLht$j zhvXtQVZ)tOQHL?B4F+L8zbG;rCUYOT0+|O7&36qxf`r%Qz1`>M6m&?8#^&n<+~o7F z_6;5h->07->-D>Qk>Q-Mkkh5T2wpqXA2m>cQTB`yrO8(Y47+hf$$2sQrBFL_Hrd3% zGm-h5ai8d9v_Pg*)I)i)Zaaxu*g{N-2oYCDPuw_eqhgk85IPwfR zmGQIm^)8>Zs(+)-5fb0qk8N#TW|bvwo_-$b^{jE*j&)EfG>T)|+@vpB+Z};N*s4ns z9~_-`fh2NpL^q|z^4ftLFhmU111qMBdXPJ##eA8C^cOm-!QGEBUwb))C@c0BVku(g zp#y|j4})h3iMwbWd8_3bd{0l&ReoFZwa{XDlsIfmAB^yDKjYJud;@9=P7f&;eM>*P zWvfk|yUV{^1%R-W zMuz^#2uwRYl4`_eVknk+_iARH_UGxC*ivr?5L8a0SVJX&P` zl@~EcSU8@(%EncLBM6J`v-DVsf9RxGbQ+rw-K@wmkdndP5;0A78-4lh-}-`)pdu_# zL${(Imh8uL82hGLJ@1nlkup8Uz55OMXLEkPgWUxx`13LF)Rn~4TB&Db8=HYEO6?g7 z9clG{ms=XaU$E;U%Oad(bJDV$x$U8EvQy~l93G!3LWwsalK4z?>dW?Z!d17wR(2|z z?Hf$E6mw?4qys}@H3s)2l;WW}@g(;5dIrwB7<`mDA1Dt}%b!uS@q<9(qpRHvd7+jxcas!y3$8F zu&?1qEb{y}8{{wgtK2(H*J(A=Mq~~|i4z1~JmxPAnK*%H;i)lW`YTmMu1qr<#`&#H zp&^M!6nW}JJ4=Uxd?z+~7pm||ne*zX;U0sc6kiEL{X0t30bJ52BPXHCk4@?r^+Zbh-F!>G7xMJI){ zW!ksqJ665b_Jfn7Gv7_JHfE|o!*{WrgrTl*vH#H$hEru{J7jvS=7i)is|Z?euX11y z<@~>Ahe_3dtK<7Rz4>YKg-d>yCq-5FfiZ)m;U^uny*H99|HP>269Rf_7QL!n^$y!ss(I0!qhd|Q;j?pw`g$~j8p9OYWeQvsdZ_Z^VgyJfll|lZnQrz zLUK1YRFzB}y$hEzI*cLcN$Z_)Vpg<3aj3O3r>K`RHe52xxjWkD@EOSd!r-1TG4Ui# zP882{GRj+|V-!np{FrE5A;)JM5mb$%x^hj<<#(K$f2;}f@>q6MboZZfBHXh>^J+e@ z6+nv^Iz}VFz6J;rkUo$jz(4%kHSe2TBsL_+rgfwWe(idA^7?yh3Unv>qCW-pNWf+Y zaV1Agbu*klS8;gD9xo)1k+QmKB5u>JzJGPPN`t=-q!#^LzB z{J5#S+4h(r){y{4yjjW0`q@ z8L7jY5{AqjU72a|pn=%p?oL%Q=w(Wp!yqf9=EvsUd$(wObem*_r)zE|xE{KbtaW^N zaBxGR3g0njUpJw!QTrm25h4!1Lc1h30*h2_p69j6Zr;&XG&wO_b+&YWlM^QT8$7&e+93*V0B{OIq;qqaU@PoWkuCzEj z5#G0rpX|qJjwoIlvr_JE#UlG*JAA26#e8Zlr`f5U#w&Z3P=ybUVRQY!vs~Rk`Qk36 zq(7cGdpZuxTd``T{BjQb$Ym3hA6oD3<~AVC5waLP^WfvR$HjBD5v^qv@DYxF91A#*rD9Sd(_Vgjebkvzp7mBk+Gc^#;2MRF%eLj5roJK zPz=eU8iWyFV8p%$A;pWMS<|Rf=cq+^P_tkyGZ$8>6{*2?rfABK-i|5W6LToyuF+~i zNy&H!1z`l5l`HSgI`_H5Ee5GU7h$QEmtJL-N2-zk*}ziCJgnksa;ngQ#vxz6{Y|jbl~Ir!7nq`1rJ2zYhEnxepC%ooUvJbP=vF-Ui4C6|&x9Vx0te zkJ-!X#Iw_csBxG~K|KGHv+(1 z>1@X>Dj;>-I4q{1QOKLn+^X3U?15{|KrCS&{wI;NAv=khA*GJ%<*!{4Uo3t8Is?l{ zx~|uDvfZB)72H4T^diB+{m;CRp9a?(IX@uRWzf}Iar!V01TyWX>OVpNP^F6zvjztG zY$J-eOe~&>T1HcoOkF9p;d&vUWqv(tW_p?^4v(ppW+R544c4>OmyK0wih?FB>?eli zj=~V8wDPez3<$(4Xi)itAthtrg+&pFHs*A1K`Tc0Mbyx}1(`-%jS