pax_global_header00006660000000000000000000000064141422261510014510gustar00rootroot0000000000000052 comment=85129eaf5fd03e88b6751d3e8e69784cdc4878af unik-5.0.1/000077500000000000000000000000001414222615100124615ustar00rootroot00000000000000unik-5.0.1/LICENSE000077500000000000000000000021131414222615100134660ustar00rootroot00000000000000Copyright (c) 2018 - 2018 Wei Shen (shenwei356@gmail.com) The MIT License Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. unik-5.0.1/README.md000077500000000000000000000055361414222615100137540ustar00rootroot00000000000000# .uniq v5 [![Go Reference](https://pkg.go.dev/badge/github.com/shenwei356/uniq.svg)](https://pkg.go.dev/github.com/shenwei356/uniq) This package provides k-mer serialization methods for the package [kmers](https://github.com/shenwei356/kmers), TaxIds of k-mers are optionally saved, while there's no frequency information. This package is used in project [unikmer](https://github.com/shenwei356/unikmer) and [kmcp](https://github.com/shenwei356/kmcp). ## Details K-mers (represented in `uint64` in RAM ) are serialized in 8-Byte (or less Bytes for shorter k-mers in compact format, or much less Bytes for sorted k-mers) arrays and optionally compressed in gzip format with extension of `.unik`. TaxIds are optionally stored next to k-mers with 4 or less bytes. ## Compression rate comparison No TaxIds stored in this test. ![cr.jpg](compression-ratio/cr.jpg) label |encoded-kmera|gzip-compressedb|compact-formatc|sortedd|comment :---------------|:----------------------:|:-------------------------:|:------------------------:|:----------------:|:------------------------------------------------------ `plain` | | | | |plain text `gzip` | |✔ | | |gzipped plain text `unik.default` |✔ |✔ | | |gzipped encoded k-mers in fixed-length byte array `unik.compat` |✔ |✔ |✔ | |gzipped encoded k-mers in shorter fixed-length byte array `unik.sorted` |✔ |✔ | |✔ |gzipped sorted encoded k-mers - a One k-mer is encoded as `uint64` and serialized in 8 Bytes. - b K-mers file is compressed in gzip format by default, users can switch on global option `-C/--no-compress` to output non-compressed file. - c One k-mer is encoded as `uint64` and serialized in 8 Bytes by default. However few Bytes are needed for short k-mers, e.g., 4 Bytes are enough for 15-mers (30 bits). This makes the file more compact with smaller file size, controled by global option `-c/--compact `. - d One k-mer is encoded as `uint64`, all k-mers are sorted and compressed using varint-GB algorithm. - In all test, flag `--canonical` is ON when running `unikmer count`. ## License [MIT License](https://github.com/shenwei356/unikmer/blob/master/LICENSE) ## History This package was originally maintained in [unikmer](https://github.com/shenwei356/unikmer). The magic number of binary format is still `.unikmer` for keeping compatibility. unik-5.0.1/compression-ratio/000077500000000000000000000000001414222615100161365ustar00rootroot00000000000000unik-5.0.1/compression-ratio/.gitignore000066400000000000000000000005031414222615100201240ustar00rootroot00000000000000# Binaries for programs and plugins *.exe *.exe~ *.dll *.so *.dylib # Test binary, build with `go test -c` *.test # Output of the go coverage tool, specifically when used with LiteIDE *.out *.directory unikmer/unikmer* unikmer/binaries* doc/site/* *ssshtest *.unik t_* *.nextflow.log* *.brename_detail.txt */Rplots.pdf unik-5.0.1/compression-ratio/README.md000066400000000000000000000014331414222615100174160ustar00rootroot00000000000000## Compression ratio comparison No Taxids stored. 1. Prepare a genome sequence, I used human genome chromosome X (`t_chrX.fa.gz`) 2. Computation f=t_chrX.fa.gz ./cr2.sh $f > table.tsv 3. Plot cat table.tsv \ | csvtk -t mutate2 -L 1 -n r_gzip -e '$gzip/$plain*100' \ | csvtk -t mutate2 -L 1 -n r_unik.default -e '$unik/$plain*100' \ | csvtk -t mutate2 -L 1 -n r_unik.compact -e '$cunik/$plain*100' \ | csvtk -t mutate2 -L 1 -n r_unik.sorted -e '$sunik/$plain*100' \ | csvtk -t cut -F -f k,num,r_* \ | csvtk -t gather -k group -v value -F -f 'r_*' \ | csvtk -t replace -f group -p 'r_' \ | csvtk -t replace -f num -p '^(.+)$' -k size.tsv -r '{kv} k-mers' \ > table.r.tsv ./plot.R unik-5.0.1/compression-ratio/cr.jpg000066400000000000000000007341231414222615100172560ustar00rootroot00000000000000JFIF,,C    $.' ",#(7),01444'9=82<.342C  2!!22222222222222222222222222222222222222222222222222F " }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz ?( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (_ֿ*wk"{8٢F'<4k?BZ_Ъfx|>kֿ(uE} h?ȣ@k?BZ_Ъfx|>kֿ(uE} h?ȣ@k?BZ_Ъfx|>kֿ(uE} h?ȣ@k?BZ_Ъfx|>kֿ(uE} h?ȣ@k?BZ_Ъfx|>kֿ(uE} h?ȣ@k?BZ_Ъfx|>kֿ(uE} h?ȣ@k?BZ_Ъfx|>kֿ(uE} h?ȣ@k?BZ_Ъfx|>kֿ(uE} h?ȣ@k?BZ_Ъfx|>kֿ(uE} h?ȣ@k?BZ_Ъfx|>kֿ(uE} h?ȣ@k?BZ_Ъfx|>kֿ(uE} h?ȣ@k?BZ_Ъfx|>kֿ(uE} h?ȣ@k?BZ_Ъfx|>kֿ(uE} h?ȣ@k?BZ_Ъfx|>kֿ(uE} h?ȣ@k?BZ_Ъfx|>kֿ(uE} h?ȣ@k?BZ_Ъfx|>kֿ(uE} h?ȣ@k?BZ_Ъfx|>kֿ(uE} h?ȣ@k?BZ_Ъfx|>kֿ(uE} h?ȣ@k?BZ_Ъfx|>kֿ(uE} h?ȣ@k?BZ_Ъfx|>kֿ(uE} h?ȣ@k?BZ_Ъfx|>kֿ(uE} h?ȣ@k?BV #d¶ґgP5T5R7?Jֿ(uE} ̱'Fh%GY4?PZ_Уֿ*٠1"Ak?B(4?PZ_Уֿ*٠1"Ak?B(4?PZ_Уֿ*٠1"Ak?B(4?PZ_Уֿ*٠1"Ak?B(4?PZ_Уֿ*٠1"Ak?B(4?PZ_Уֿ*٠1"Ak?B(4?PZ_Уֿ*٠1"Ak?B(4?PZ_Уֿ*٠1"Ak?B(4?PZ_Уֿ*٠1"Ak?B(4?PZ_Уֿ*٠1"Ak?B(4?PZ_Уֿ*٠1"Ak?B(4?PZ_Уֿ*٠1"Ak?B(4?PZ_Уֿ*٠1"Ak?B(4?PZ_Уֿ*٠1"Ak?B(4?PZ_Уֿ*٠1"Ak?B(4?PZ_Уֿ*٠1"Ak?B(4?PZ_Уֿ*٠1"Ak?B(4?PZ_Уֿ*٠1"Ak?B(4?PZ_Уֿ*٠1"Ak?B(4?PZ_Уֿ*٠1"Ak?B(4?PZ_Уֿ*٠1"Ak?B*+xVR"@B5e w,ʧ~"NzŰ'Fh%A@nGۭ/U_Akֿ(uE} h?ȣ@k?BZ_Ъfx|>kֿ(uE} h?ȣ@k?BZ_Ъfx|>kֿ(uE} h?ȣ@k?BZ_Ъfx|>kֿ(uE} h?ȣ@k?BZ_Ъfx|>kֿ(uE} h?ȣ@k?BZ_Ъfx|>kֿ(uE} h?ȣ@k?BZ_Ъfx|>kֿ(uE} h?ȣ@k?BZ_Ъfx|>kֿ(uE} h?ȣ@k?BZ_Ъfx|>kֿ(uE} h?ȣ@k?BZ_Ъfx|>kֿ(uE} h?ȣ@k?BZ_Ъfx|>kֿ(uE} h?ȣ@k?BZ_Ъfx|>kֿ(uE} h?ȣ@k?BZ_Ъfx|>kֿ(uE} h?ȣ@k?BZ_Ъfx|>kֿ(uE} h?ȣ@k?BZ_Ъfx|>kֿ(uE} h?ȣ@k?BZ_Ъfx|>kֿ(uE} h?ȣ@k?BZ_Ъfx|>kֿ(uE} h?ȣ@k?BZ_Ъfx|>kֿ(uE} h?ȣ@k?BZ_Ъfx|>kֿ(uE} h?ȣ@k?BZ_Ъfx|>kֿ(uE} h?ȣ@k?BZ_Ъfx|zPR GzZ<`cTQEQEQEQEQEQEQEQEQEQEY:x3ZY:x3@(((((((((((((((((((((((((((((((((((((((((=%p?W_/ǔMHt)idZwx3V(((((((((((((((((((((((((((((((((((((((((_ KQ]Ǥg05U=Ag05U=!k'NZǡ;>y+BQ569ڣF@>_?IcWy\&oP^Z¿]w?={'}g7l~oנ@x~ ӶI=?EOR<~ ~#kr},\0G^"k2x2ts5¾:dt=+kh"P *@ ⴴ!BG [?_׋|^W-/kžsXdШިoN&ɅG[8;?uK[m6&;zUQ@WRk*T3A%T~ƻk#Sm#kf-b;0|zs?J+~7umZGcT|?JcQ!X<t}hOҹoqXp-}5ER(R]+(ҟ_åWDҿF|Ym[ r7k oE}mc~5]!bd@G` oE=( ;3\/hOWuIއ^(9[_ &fBH#uuWH[oOIp[%zۿޢ(9Eq\u"F#n=hM[V)fEc΁\@ExD?AezV#DY!|z*:=VܷܵZ U!_#OL{Ex,Q4V~P ͻP7|oI45 ٷmBpp}:PUE2Yc'WT;'Ҽb7'!\=J +Ot B1?BŇ^?^1Ӎ֝#ky8x{@xs;Ë[Gpud@珥pi6 5{y$1F{v Eyt.pݙU@ UPxMI6Q6(3oEz+@Qg/yz/>!6Ho]Hx>EQEQEQEQEQEQEQEQEQEQEQETW_/_ [?*?*5njcN1?΀-QEQEQEQEQEQEQEQEQEQEQEQEs:x3PM-a6o=W#{x].uw_[Sט|>%]Oi,;uf,<_˹]Oœ o-27}oCВ>3O +j7Dl\}#ne~#[ihC PixsW2byT$ C "4QJY$8- 1h?!Y,ӓUbKk \` L>/j#&;#؊>'iQ]u-_L-U*vpI@ց(C>{YZ^I @k/u?hW^;AZ'wAUy?@Ï'z{k_5ߊM;O;D̅BGJj+z }I.+t$_WB};wQEpssK 7.DF{}h[occabڭŴR̊˅m#=>~9xSWЭDGBTW|Y4 BZ vAzf)7 it+(\=v@ErՏ&&=6AJ8byeuHK3P:}(WQ_5߷Dd+PrG#Y:l׆H借bs Jn^=m6n-`WGH g'nqn-b]:KA&ffUPl$Q^Q⟍6v& FxأLDe[Ƕk 1  AzyǘPQ\>!6Ho]Hx>EPEPEPEPEPEPEPEPEPEPEPW_/U/_/U/ =( ;<Zwy':@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@q>>tunDy'OZ:x3PM-a6o=ן?࿗r&35m[do=s.5wwrK$Y!&> |CcBJ.8ω>53Kp!qd~$Wsᦽ?^H#ɉS,P2)ne~#[ihC P+KhുB k(`Px!owkVY Dp{,?Wx+0Pjl"H: b*ϋ4|%X=)*+Ⱦj.I \*;O~B$@r!՟C-F/$`3~??JgKXx;v#O[ibU4KGԢt[-JwPzdgJ~]_CmJEƝeogKæðF?5jK wt=ǡI9A5j:(xOQ5]!o> %En Onz(#[Yrn]ԉ6o[h :,Fz }szrꦯZ%d7־,_[rrޡh-T~@ =3@|oD,VQZC(${6ʽC:$Dp'fݷ==@UeY]R4RpJ/|q+ޛhlsH$}(( _>)dGּ5 @njG, zcxN7Zt< 'GEtW-.omÙ-1>Mtۋ{$"eIۜd,{  &2%ӯtdfkveUVrOA⟍6v& FxأLDe[Ƕh o~3}GPGmh$~x)#7wKm#gP_EPEPEPEPEPEPEPEPEPEPQ\ǬRW?7PS?sʧ((((((((((J?J?EPEPEPEPEPEPEPEPEPEPEPEPEP^cDKoGI^^cDKoGI@_?IcWy\&oPkRxwM K, \ s|'h.C?;J5OFdSLp N+RXE @!3wjdBv?}TJg"4KBy;G?ڽ3^KU/wq?ڀ:(3O@5i\Ե08JUʾ[?_ƽ6K6q-ulɰc2`[@5m|F7GzrmVa0&WϟWMHpu"+򣓏`:W7Ꭶ[&#῁|os[_k%#A !|}"B ^1N\k=ݓ]/r+8%\=F'V(/wiGo]&べdPw[>5 u+$g񯞼C_i VI&(b?>SJKFps+~~)MP 0&G +Dp8W|\iNFdGԆ/o%nO mtN[B"M;UVۻ}tⱼoz&x fm#7a/gdt?\|P(vM|t@tGf]M@EPV]EeO5<9GygI"A۩Zy?\~ usrNse oRǠ:?#q c-&y1ǯקhTd8z׆7FdWv!9铒=;״V}^Yixր+CcOtz,zp=n5^ѾjZ^Z:Z;"` ?i~|!o4ۜ,g>±~?3D+]ß'z{h3mycS=Ia|rppO^;Vz{ Le#W $=@S^?I\WCZ>ȿzki^³[΅g}~% `+Ȍ;:O־~ My%㖽.M*(ڌy1 e'‹/ .5 9u[/+:ING' #quϖRe\xsƕxsNFtcRc:=2>OEnm6KܒoV\`:?A/M--&͉AgҀ48ȀjKOH'3-Ī"' _& >KPWi0VpA\Z,F# K=!}q|17,$r3>p^(SxK9Kb0x[g;;p C\_[xk\eRDlIG>¸-G>ѣjVl/7~ FmF$[eF )Ԍ<p{((((((((((((_ KQ]Ǥg05U=Ag05U=!k'NZǡ; D9$O_Q.?_ (ƿ7Ǭ7OYlUu|ab-E"܃ PuPz9Eet aGqY`L$]c?h?ܟTf Z,V >oP޿m|ӊ. w:Z3r6e!G3|Ƿx.4NYOB H uLC;[DS?T|m?|toB\3~GTd?g˛wMl.f /4%b<돗zOя<q??hW׎|f]M^@xhOWWV]EeO5<9GygI"A۩Z ~F#Z-[xL$cݏ_oNsÿ[Y'RͲNz7lcqZf7-Qݾd&~hzd|N3U,N A?SjƥjU嚰V1 )k@M@K"b*!,O@k>?3D+Uo1ȱX+h_hk߆l[ 52" (=ϰkK ;<Js$CaC?I\WCZ/ԯoRf)W9%GNմ/aYB3_տ [|@ 򽜈ñékKxjJ6#yLiGY#\G)7@FA,>O ߅^<3o\jr귊^Wt 0O^k-%]ay?> iZ4Tk7JnYV5!XȭOP:_?CmݬlKo$ޭ$u۸~+^DVm&QhۖEf 3Z_@O5s|%iwZWU TXܓ{שjL0iUj$Qf`nHk,soq/^@5%ݾKB| 9jS5Www:9@A/|)S%%fd D9$O_Q.?_ +ƿ7Ǭ7OYlUu|ab-E"܃ WJH* #B?|$㫬t:|׼kwSsY3Rk>YVO?%f!m>,!>,E;d[{}vJ)Y])XdPw YAPȯ=H9Oj ;Ku+(z=-qkWWOkm3ȑv=}=}cFw`%ּ7׌%3" L޽Rk*X+O_ӣtdXl]܅U[%x(SvCR?P}b96`Y Km|͞ }aFVd@>A'vAZ;3@kK ;<JԯoRf)W9%߉M! E[@St][Nt(<^FI- ][^Daԃ~E|oJm{-vt ZiP9Fdo0ɍ0HK/i>Yxg@;qi˪)y^IV^|(?Ɠß4{Úv57P,GP^k-%]ax>u~2-vi]-zRnvt ߥ|mu]imY6lL#>DW?GZ}֗u_Eq9n%P@%=8Ϸt@O5OX_ :CI 7TJ Bd0pMx_ 伱d' 㑞9+GŸxk2X߹̒[oVC~&:=OH׭\YYXY#7^.:妫/B #d-N29j?jE_J;kjA}4xv㜟&(;]lCwɺ i#=lxU-ɐp09}E}IY=~ht{"]/ uh早kec(ЏZTtO jid5z3O@59ײUCC*E(zF&,Zl*vzP_G IjECIn^]2hzՙyJpa8(}>S^XΡ%ލk-ԍ*A'׎E`EfEW x {qLJ:+/G𾉠K,Vʡ]kΖpaI?}X5ҭơ~уqhj~#^^#Cj Z\jdrƛ!s~dH}Pѽ)A\_;^k?|tD30\By(Of~ " *Ewgk[=W? O-~6xJ{A,wo.9,sFA+aG◈lak"Ǭ~&iLD&G 4Ia1iZ}S4(5"7x',~' A%Jo?]b4}VDe@sր6ZNo0m$4rUPW@\Cи"V:g ]Y+|񘋌>Wk#Y WKp0$tÁsnŭ.on"ktL ڧxL0JOa:`J5jmvi_u>o>ȗr2"[rd~QmZ++m6+;8VxWlqEQe$n2P+i,J {8"|'h7-sL鱚,sϵl^9A'vAZ:<=ĚWk&1 ?N??k5NkGZ2^J1$oцs(ȿ뵝hV V1ZG#nupǦkF>u7%6ЖgW{{moo:')qZg .S*Zڠ&o |?}).$byRs51kb溜ۢ>H5>мAvNp=Zȶ_I03K#ȿ1<=xZb7)Ug w _&FHa#@ =*嘴# ːqt?3oB]iCYpjM/IlMIacOZ@6/w .Pm䝎ZD-1%|C,G9Cpʲɇsqzb#ᗄ_^Hn ag~ֶxz_7Km໏1$~u@i"!ԴLzF@?Ov6:4WdDqFà@<]sz|+\5ơ;Z6cJ(J?Xr e/<"(zG/*(M\ÌϰImn60%wFbHv<;WxD=!Z<5xm[N˜gXCik(8עP|le?3D+]ß'zzkWXj]Dă֮YY[iQY°»cz(|Omֹ_/zc- =Fg?ҫC$:UV۝c1ѯ~ My%L𖁣_5]0*e@rA@ /m}y8@L |I_wdC -؞TFy} Yυ/`]Ӂ#@ßր8Ww-l]s{tGc\[foYMN;pCvhKgml1'GZo!ѬG85WyWfe1Vx <0 #ժǒ}OTQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQETW?7TzTn<`cTx\((((((((((?hi#*K"#O kekc?*'?h ~M="}?-?ѫPOhȴFQ@-?ѣ"}EQȴFOjG"}?-?ѫPOhȴFQ@-?ѣ"}EQȴFOjG"}?-?ѫPOhȴFQ@-?ѣ"}EQȴFOjG"}?-?ѫPOhȴFQ@-?ѣ"}EQȴFOjG"}?-?ѫPOhȴFQ@-?ѣ"}EQȴFOjG"}kij6q󞵡EfäaO5Izԟo(E[4dZuW ?oi^(dZuQAb0|sLIr00z֕G"}?-?ѫPOhȴFQ@-?ѣ"}EfAPav-?ѫPOhȴFQ@-?ѣ"}EQȴFI|b0]&i@-?ѣ"}EQȴFOjG"}?-?ѫPb0#y[Fӿz"}EQȴFOjG"}?-?ѫPOhȴFQ@-?ѣ"}EQȴFOjG"}?-?ѫPOhȴFQ@-?ѣ"}EQȴFOjG"}?-?ѫPcbc^F:(((((((((((?h ~M!O%^-zQ@Q@Q@V=BMJ[cāc~\Z?ߠZ(Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@6F+"L 2Je-R?eYB`{TQEQEU{)^k}A;~FU[hv;zEPEPEP{i^Y.hbU[Dd䲐RFGQV(({ Qu~V^bPm,p鞧ڣ)m)".n(((p/ӔPԵR/ O\պ(((((((((((((((((+5ߋ%/-\HO88gx5GA$A=Wz2u k7ryn6  e@mx{[~"xq4#lƽ~f =++(`AR2<^#@]zX5Ime , Oq{os ܋]"+Wpy2D@s]Cs=zN%(㏙@?-jpx xB5 1'CSwxGRMYٖPۧtu-,24r/FS;UT}){ץϡJiՋmiu毗s?źyh.lhN{UW9eξȵ6t@=^k+d`zr ztҬNI8;IXZ( ((((((((((##F!T B ZdR,23O((UPaTRp̳t#j((( I ''-G+Hm9((( SM-F+L P hJ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (@tPN'*ș#4( ( (UPaTׁKQ2΅8>((*$(p:q̲<@QEQEQET1`qsKQӴ#; ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( oMGhd x$*֡m%uko$мk4g  ;[j!^Gr]3FNӀT_aN'tCS3#yw-ݴh#dܯ/O ^%_J~=ȩOWGvGg| 炼bͦY3C,Ja*Hs Іf>*⦯x/,q}Osvg=1_ 8961FGk<7Y?o;V]spBUNGtmt[ qmHc @>- KQ) fܣ)jSoYIݨJySM*$hh((((((((*e8ԱϰsҦ34D"DjoQ9۹o$$'v$r\z{ZeYd<3ïu>ƿ>MN-8DfsO@)ֽJh7v>d=|;͸4r$r{;hCPb2M`T*%nzURb;9N?¶hW^ 7t9S,EMmܡvC =~}b!:r%nPyk'1ȡN=;5k)%%%QEQEQEQEQEɿITB)SQ4TAQ)QEQEUM7=?m[GDQp'( ( (*Y LH2W4((*?u?[di'( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (zĩq& V\m˂yϡ:5lM:.*n4z Q[嵢8M=ϋr"g?\t(i]!Fs~'Ei#X2xV$q:y;6_YͬZA,ϿN9 nI+n3d?¸iqo/iknf]+=*>>F­-E#A5 Kt˫-mm .-=`ߡkLKV?'Zki 9熫 i@ A=((((((((((MCa*4XTAQ(QEQEQETFunIE8EPEPU,]_*1"H˕\9os@(((_q?[ei'((((((((((((((((()Ddu 0T=)hp)d+ƃܠW@9?hX FJ EZE|ǩ5KJn*!Eb#qkY} l7r+2ڄ@dawErps65:z>Hǩ^?>VOw x?Qת@ /3^D^]nM᧯_f1bcXx ="";[iA;WoU\(lQv?*3m(7N aC:b5}֦0TǚY+(c+D57WF qqQ]Qա:NC1 ( ( ( ( ( ( ( lN Ah ?fkj00: ( ( dzFunIE84( ( (*YUbD EPEPU"j0D+H`>EQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQUo }6劣8AO['U*qrqOT>VŠ(QEQEQEQEQE?տv 4XTAQ(QEQEQETӿ:L$JOiQEQEUK?UbD EQEQER/ O\պ` _S(((((((((((((((((cÚ/#X}.'3ОGZtP.~C.YF Bw\~5E_BO&ah2@@Ѽ=EivJȈ)oӢ (Qzyz ӄb&ѷЩ#[d-[V-Z/11ҏ7? )U ZQdɞtKTw  _u A`U]_qYJyV.@aY5o,[)+_+tnu>ռO0<1k#Gh])`pAM5$t^| c=W![zL‡,z_+4(((() =&7??ʀd@rduW?b ( ( lr$03NozEPEPEPRDrXӪۿtQEQESD4ae#4O@袊((((((((((((((cFw`%֍F~#O9ڬ8*SwVSԥ9N#S*:zrj~c^.Vgah{v;H|entfX{6{kWyTqo_ϯj{?/5K׳->a"ffw=5~Ac)'G^iYX-B?oV뺏7G<'#L l X6k o,@wp0{<צʮ'!R񝧱z_-#Y䱇$_K(G N﫿x|miYv՛ioU?]7 G UC'FJ^_uJl=e u2{ߪ=r\4;)*%^*\ۢ'扏סYŪiOO"kew\iՠ? 9UJZ4qS]Vж$獾5'hC]·H;c=^[ƽV_sbpN Q\Vᱷ) ?ɮQMR>Q8݀ח+3#nF,<=eV_C^K5$t^| c=~N*;o9 &qǡl϶k++noZ?b{[=(H ( ( ( ( z )M"C# Ӫ ?f ( ( lr$fU4o΀-EQEQEՑV{uT_w]tQEQESDdh #ҝU"hQ@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@V/uS"?($m;ڱW nEӃ%9oR6DqQAs v8t^M呴n^)}q^> c&6=GB?_O-?t=ڸXʏM3("'*ýI_vjcj0)(((( z j:ȁO 'O|( ( ($Y :i[((#*%NӪ|]O(Q@Q@Q@ !oQ)R/ O\պ(((((((((((((((((((((?D=7i߳C_%?zoEIWg&K@EPEPEPEPEPEPEPEPEPEPEPEPYZމxK$Vj0NeBr6\<I[G" 1nk4Hk|%}yMipȭѷ#3[RTӪT읥z"7Wcg!n3g5- }V8JUA/DGY֋pQEwEPEPEPEPHJbȣXbH;T`fH` REPEPQ 2O>% `*AQEQEQEG+H˜ێ}jJ@pqږ ( ( aUp⤤ PEQEQEQEQEQEQEQEQEQEQEQEQEQET7V=orFpsSQJQRN2WLiEoȯ4?cڿ/܍=_{2?ѿ"֤Q$1P3ZSѤN z$ImQ[QEQEQEQEs,Mpn 3GF׵+.e?1ṪbW}g|*|>e^..Up΍jDM_Y?]iQA},_ ܣ+LZQb}S${esJQKmlArxOC*-c°^l+ \e;CqG"?SR3'jKz*m2CK՗?Z5m^=?I7.rO'xz]TmTy0!5]ap6d93d>{U:V3\`g~לY9$֖6$ȁY_ӽ|6ƺ-V'AB;QEQEQEQEQEQE#T#آXbX;T`fҐA(((8aX#؄$RR 2#ږ ( ( 8V&ێ}jJ@pqڀ(((Y`NN*JM22:Z((((((((((((((((((.c9-zʠgA O\d XSPRS1&˳=Y5M>GTKfv8UY}5nI͏|G ZTZIxLKڵ(c+#}|+kYUJSurRp]Eoȯ4/ϟEz+/~E{zVӡ0[q*WDa.X#6wfu53C\żw ʇk+;Vh66ʣWExOEwaq=WpWkě>ԏjZ4ۓa =Eox{Ħ wϘ$=򯙧OvRRJ7G/^}Q 43X=p@ WLuyKb1y\mQE{GQEQEQEQER0 OB1KE2V5 QEQETp°!D'ϽIH0 jZ( ( (#edm>% `IԴQEQETk 0N*JM22:Z( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ꚮ 5A2 xuW6+ OJ*Ҥk_ -$Q5xN4zkI^UOJkBozXLlTRZSʭ"4BOA;:S]%yjlEq>Oƽ\j"ќxnQEz QEQEQEQEnRql1,K03O0A(h((V*bԔ Җ ( ( 8V'9Ԕ$:PEQEQE«; IIn+ږ ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (R麝Ɨr&?}Fzfo[ nGz.aͩv#LN"Tn4^A4m4F==qb(IѥmOk\(؀((((MCa*.eAEϭIEPEPEPM7=OtoV+h>۾bsu5-QEQERuuP伭>cҀ%(((_q?[ 2M;LTQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQE)-c{OOR_0j'De^,U)g[^U%%}Qi?!^\>{yR+qWU\Xʰ$w(ΔZQEwQ@Q@Q@Q@-6T0ξ㪟Q^w]цayGWU]CORky aO'3ዏ4t|م:.9x2>m=ږ>vL=F k io!s+ʳ)ҟ1:[E~O:qxe5Q_PyAEPEPEPEPMSiԌWvywm:ԔQEQEUM;=7ugb:((( n)mwN-QEQER/ \֭K۩& c(Z( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( f3[IE>3\em;ɦKi)Y#bz^#S㘟ޯ'z;7˝/_OL{G~Ծũ]7c?]t'?^g],NMnzQ_`xEPEPEPEPdVCPiڰr1LȷHn1u (((ǻGunݻ,[85-QEQER>.n*Iv|݌t%(((_uI} tK@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@9GȇM?T{{h_GM*$hh(((((((((((((:ٷ^|+)oO@/-"e8cta3N g:șm1?޿^^YX˧^m0OW_]cvb} %^6K9mO#AI{h|( ( ( ( (MOM>bIU(((iěLO( ( ( *&[q)BEPEPERFN[(((((((((((((((꺭jzvvY_I8I \_.߇0@vqX]wk&vMDlppAX(?2]?IMC:sKpIeq]XJ7)v8gZ;sW4 7{kԖIK3.2ykXN-t2I+=Т((((Ad(/>دqڰtB}2n <OFJ|Z_}GrF_ZimZ].z%\Mĉ5uO Trc)_LVі2J(C(((((K5&NN@((((q&ԒIպ(((Yf$oS/9+z yTFyXdl̃05Hextdl #MՏzx vp?_,,S9>VW RCУWD4袊:B(((( :f`5vX=D?VohuMxY{Zk_>v$[ۢw/X[[Z9n;"EՓV S g^>«kX7#ٚTQE{QEQEQEQMShU{M$PEPEPESN$6I?o@袊(((dOAV((?w'΀-EQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEZ/e}cחR=Y3:nɓP~W$ǯcqW?iIWg: Qs*;=kJ51!DZzweXϭaGTilŠ(H ( ( ( )o4M$f(((m$7tQEQEQET$]$-EQEQEQU#'Nq-xQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEx"a4RUI?D=7i߳C_%U(((((((((((((((z?&hwZm%IbFbhf/?[uYo?1{=4B-N; nםxwW:]74YW޽<tn%\UFv[=+ 9.$G=HIImȡ^7x4ѢݤirQBTČzROר|n]iwiH%bX/dW6|7)5DgFHhԶz@ %SO“j>,ĒKFHd &JT,HY;n ( ( ( ( ( ( ( ( ( GEC+ zKEy׈4VҮ xcZgoiOz+KiQ^"m:2f᧖&z3Վ&SS(oº 홢!?Ŀ+agXҕ)H(3 ( ( (6QԂ)-%W(((A;Q@Q@Q@Ao E$#TPEPEPEP -6=PEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPYdnO1*)E.P]Y{)D[J線S>O[]Tw]<-7خ~;~Rw^_.ߪ81QEwQ@Q@5e)PV-%W(((-!h!(X槢 ( ( ( IؐDcSEQEQEBy,čOEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQPwmkC;| iވM&ki4ki4%؟iP^G}g-vE}cReYNAQ('-m; H%6*k?iihs4$_霦$#ÚvMIIJ ^gU,VMnz5Q_bxEPEPEP0܌=F*+X Xb QEMEQEQEQEAk A+Ivn=OEQEQETBK; }*z((((IY@=PEPEPEPEPEPEPEPEPEPEPEPEPEPEPET5]?IF}mgc_̚n1xI8X Tho$~#II@Smѧ^^C=-Y-QEQEQEQEQE㟴zoEIWg&KTh ~M=V(((((((((((((((H&]Ѹ M)+=ڞ&|r(^ƺ |?#'_J5Khϯkb[[61dՌb~vGe?Ssy` 1}5whΙ).^"HJz+wiس1brImnd#`ï>J姙Ԏ7/˷XXLz*jF0$\#9f4ӳ (AL ihGR f$PI=z6(a@"((XH[nv,w՚eos,QEQEQEZFy.C1!e g5^'Kܼb ( ( u ,JӭY}<|ϦhQ@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@l+9-/ 1"6#*AW~7,ތUnnfL-Wוǟ`u8ai08I}JV:Gt;m"A&N 86Os޺Z'J:+q.:/>_ (縆#,qKVIH̨I^4D&=>-z0?VRuGtXZ p:VhJ;B2?>s{$ZƃBXzMlZI [־ sq#Ft5/t9~+/3f.99dR}BSˆOi޼ҟv*~#[?1XRYtOKīr+Fo)OQ}b?ڽ$y:ܾͻ֕(&Xg]o il/Iem/>*Q{|-O[/).?.x|-=z1[BHdId9w1D[[ۛ)|i&d5zLfiZTW%lZl=<~#]TR4k$N2NA gMHWU^ }Wp-iI^ }7;^aEx js{ cxGLC(;] c^"W´%Jz{j-N;O \ץi:z\&tuW5ʐ0/v>Y:UrIYW+䰕 ?ZS4SQDWF 2EbxVϰ!m U}V# Y&9Tݢ4-QuM5$. ̽zNXւ&ppAEVQ@ )ܒA$ԲѰH"7eP ((a#InYر'VjO \`cՊ((*܆bBɁ{h9nɹy1@(((u бڪNfґ2>QEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEUk>Pʺd^CڬM6КRVgxJtE!οVN%FErZjɹ:Gz(~S˯:>g/}j;bp_J yWj:Uޗ7s9VxJ"6'tUVk41҃EU-+q5Њ^kM;3֌U>93~n:s\%:$ O0*)6HגZu6?)ֿ!'WiҼe6$1T^O^EaruIRm*ZU+˜#8]3MS{g-ܖ :{؊/쳶n!kh6|+FF?{[+!mFr?¾95n{^2<]}Yؖ`uߧZު5-5Q؛Y3}{}\%]H06q: EԎ% 1U9_z|2/R#Xd09znxEPMN-Ԃ(+'i,w$PI5=AgEin0ʸ"((X[v,w՚eW;MX(((\bBɁ{h9nɹy1V(((P @Vjq:)#*s@(((((((((((((((((((((((((+O w.eL_8(OU c^"U- ؐAGAOgSͼwv[2)S^]{i%ҏ6}Gc^\46"_?Lw^?μ Xy`+O2u? 0F7ϥZֵ!ipi d蚑58$M??֬xU:ʌ xS#lW<~X+?MBz~" Kg#b+qӿ~Wc.]ʼnj8QEwEP\6# Cd%.+ML`:QYY2 袊((c#Iba隳Uxaeq]^Պ((*܆bBɀ=*W`;y1@(((uHjWHo唏@9*QEQEQEQEQEQEQEQEQEQEQEQEQEV5 M*{`]K!¨~.x {,cݹލe"}+RgqJc#TnceCikbZ6qxVw-s'г]%H}S~d:*(ng ȇڞ -$n?-3u>H:r-m!@( Ѿ/x7?{ԝ~aAm =WO;Y|rr)ceCwm E2SYx{HJc1Y!bAb4~((((C&*J=4?/ZGȇM?T{{h_QEQEQEQEQEQY׺\q 7e'h) v9j7kQyqk mKƟGĬ&*{ԩuԓ5KլKF#pyB}B#/-(ּʶ5Zw*)\3iB U4mWk˄2즑t~7өGsꦍpjZ}kd?*eȸDz+|c7p.+vVnKv=̿yåx3oSĐJ!$lZ؝AEPEs~,otϱo/߻8ێ5 N? ?ºR*i:)I;4WSBO@ӥyImI 3c$&tRr..QOBQ\PWxQ#;0LrHWqL$'E ⸱(9h^zdH{W@5.-d?iOL-Dޣ+kzm|rDZW`~gz^ҋ5<=jO Ķn0I`q+v+#B s©Qԗ4 ( (#u@G̠ ( ( (R܂w0X(((Jp$Gb ( ( ({'W/Ez®/JW@^pVLd$zWMExZ3ES< SVQEfQMrV6#m$i".MM@Q@Q@U{9^h 9aEPEPEPEWX#_*QEQEQUhTƀ,QEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEV>m'wҶ( sGr*SHc_Y$ b2I6>WV?t--.g~?]1JoCۦFO5Mtϧq:-.d#T+RE>u]_ue&C#piWI3th.C)޽I䷚ᷮW`Tr/ Wے[3V[R(<(uG̹45Q@Q@Q@^Wg ?jQEQEQUy&V#_(Q@Q@Q@]%v"FE#QEQEQEQEQEQEQEQEQEQEQEQEQEQX/Mm+~<6uĕG z4HIN D'P=p>>"Z[ _y;A ݉9A-V;>iVX\2W[%Y5݅B`:+e-n|Ƕm ƾ]>!BdaJp$FA<MB#$$ָOf񮁣xz,󦹙@` @^9$th((((?D=7i߳C_%?zoEIWg&K@EPEPE췳w#&;~iN;A\ʭhRWQ\' :?!|I+.ON8~[#ag\NOJWcc?ivCrZouBQʃy!Ozev4XU I_סoP1#,~=gAo5̂8"y .MvZw>=O]5HRRi"!UVv;HY}dAh[Z?^EaWgGe.#Ϭ<3ǨY,V0@=z(((#Gkԩ{ժ((((2KrYH )##TQ@Q@Q@UjT*8TPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPTuMZIglz{|np( k2+jF;gt{IZ#T YOTծk2v}k񇍭2f??Ptܱ@z3?J wRח0;cFsW5Zx-1*еu1*tÆ:w/|x~ZNZM͍=k*mm ~]==m;PtmBQ-k,N;6ۻ=VE(Š(((((( _BǗ8,9Wj:eΗraLua zW- á>*Tzoz:H4K-%@zOQ]SG=YmnXIclEzp-~t/_Lpv|{T[zx [=L##LF\>ƫdl[BjR^g.*n(D l4(YB Q{U(((#%N8#ޭQ@Q@Q@Q@mQk@i22: EQEQEUXц;;J(j(((((((((((((((((((((((((((ixOO@{Z> 6Jt}{WGThvzWE$ "Њ赈_*P߉:gӁk*5W⯄o,bN1q, є0H>q@mZ5MM_$r#oF]ViZ tk(I,}N:xŸxMO4s jc㝻.-2mTV巖[O̟QEQEQEQEQEx"a4RUI?D=7i߳C_%U((*տ3}_FVV|I2G|)ӣcݎ4?ө.Xv|O5zCȌH#Ҽ2ZI+0*3?D|qS-Mo {6SꧏzoX2x>^xzwOgfs$ч_ZhڬW04׶S4n؊=J+/mkKM^ + 1Q{]%QEQEQEdj".91;T6UcxC0׺M\zpMI6#Vem7x] WI^=^\'[P+(;^(*핾l1FbijMkA%̖~I@ѵ۝"\/-C^,QE*+ 2"mwY %VN+ԣU=|$KvVl'rVot=uz^ڼax"zQ\،$x\ljFQ\gpTKm(H>=$-iSyk%ܶҌ.~.\Cprq}:爵`-FUsb{jn=z5O)N~\Oʻ'I-d`RX^jCT#揖AzN:]NLӥ-ƍQ^y'4^%3>7ºد+bǧ]ec-p{ ym.dQHC2<-bil|g 5OtzWONFXY=[T+B5R3ɩ 8tQEj@v>5{h 8?շv,EQEQExWcSM;=7tQEQETNet -~*zi EPEPEP 9k!(ljz'kjQEQEQEQEQEQEQEQEQEQEQEQEQEr4Wλeb2Z_i Tzy?Ӽcie*e=gDIB-5[hnV@8 zxI<-{뛛#C!zn<0yX/m&&d1R0A%a&tKy`˸"^X_|S$D<2W&9~Ɠtҟ%Q@Q@Q@Q@q^/բ{{YAhhťkUݏ*Կw~[(Կw~[+h )aEWzEP\du`'= uVʜeV*ǖH8d)nB zǫH>tSľ[1t,Z"k+),g J.`}Y>d&L,ĉ^L^ )J;0*J ( 5q}kЪ.`'כ`q_WU.{σO*voO-ϟEN6 +*Ԩy{ c-ϟEkr:pXik[Q\gpQEQEKU"l^^T~޵7VY]=VH>k*ƾ_J=%^NrNs~Y?ƽFA5底msk3g+fh˟OOʾC#ʕGo^\}8:*(BFm[fxP0g%Q@Q@Q@-HԴQEQEQEE WB߭KEPEPEPED(ϮjZ((((((((((((((((((M+L]^dn锶a [>2wVG.;A'<*{]g[sqsi  ߝ8Ԛ]SZCu$ӏ3>o3nnr% {|QPmc$]B69U8נ(u lޥ$*RT4w3J5#5tqK T Q/WaEm#aQEsaEPEPEP/xU.]X(I]Z\SFFR+k\fEwJ>Y;7>1ܩ*^-S&K%E~O5W\OerΆ9PJRY]xY##`"0{]om7x] Q <.⫗տGE$i,md`U yl*Pk(WXJ^?QeugZ^?.ptxGSM,tt-oN"LW*O KGPGpjrLgGEc{:f>)Rރ5"Q( I@Q@Q@TV˅# WC@EQEQEQQE8PymREPEPEHv> h(((((((((((((((((((((((((((es&|v? jژIO|>Z{i-)"{ז^Zey-`׫IҗCSt+*=jƩ<GR;[uq}^ER*qxJa+1(ױ?Jiёeaq\x4q4])uF54y>$%"yLD56 )y6@|ѱ=? :lBOu|O]=[6Z:(F;TAdI@aPQEQEQETV˅# W5-QEQEQQE8IP)[m@EQEQEQQ,^(h(((((((((((((Z#Kp˸A Q nSNڶ>zKk" ׊T =<4Oq%W+?/k:]ԬS: y~xKWwO7L-|Yq}{٫TG?dFB:֕d;(u2Ϊ?S\v"0X/ WZZg^vk?_Ze <~@//L:V߹A&0AoC^MOxbIeC\8=ZֶVZF6Q UQTQEQEQEQE㟴zoEIWg&KTh ~M=V(((|U?R|8w(gP.t}J=Br*u>&lZmf|&,s ?19(<=^Xt\E|=BouxSE}Ep? >"l6Iz ( ( ( ( ( ( ( ( WROy_cH@`AkFKףN.|;2WEym 7hKaSYOT;zo_zQk / ZXzMA+=((v{}cgC]SZ٤lCp@v?һ[( m{ m6*~C3,28[=~}WpX._=b7??ʳ|?OMVc$?Zd`V5ٞD'+DŽ HBR֤Q@Q@TպEUAP PEQEQERmv?U@P2rp:EPEPU!j U X( zrhh(((((((((((((((((ÿV4,Bf/Gz"𧈬8)_tWɟ|!cc#QbC'Vw-[go:+F`oFliڃ% 7z~ ( ( ( ( ( ( ( (8_heYI6q ?z4q*244c?4opUh:Si \X?]Bq+y[ >nlQX1~<&};)Ҿa33/qkO/;Jٺ1 -+#5^G+)'FG[\GwmM]ԵxCUm:V_戞Ǹks*pb(UFK5 xA$d`U T@+Z( ( (*i:H0zZ((*[ IUր((( Rn*,n=N94QEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQE:o ;+dKkK###% *|_!&Ieqk,Q{Gv*.=[ A>jZEUU :+9E(((]պEUAP^-QEQER>.n*$(p:EQEQER/ O\պ@QN9(((((((((((((((((((((C&*J=4?/ZGȇM?T{{h_QEQEQEQE?>oZ?h3ۧT(9wQ;^E|-jm}2_.~Xw_ex;ź<;7|BNZU?5d\ټ90?O_Cx~x~![طKc6$OQКFZޕmӬ9t#r ( ( ( ( ( ( ( (+i%qp{^cM^m0yVñՏuk,ϯ?u1\fpp<=o0>}_OUIqyۤ ~pNzJH] G4m؂+5Xo ̸¬ӵC]5pک%壌[ЛƏN㨮_Ŝ_7]*OM:r-"ݧCjدTg$9S K^B1/# .?C?*iDʡԫc?B54y΃/RIIG^]BW0$o|*^ƺ j䱙{ ¼ *5zQSE%sFi^< pU ( ( xq9*6f-EQEQEs, \iϭIU,c[((Yxw 5%TBw_ tQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQE YWz5̹Ld >r?Y/|=]iwd(t G߈~i|eN'Eb|v}KÝF?G3@9Ϲ^O>/|[MflIp%?QV^"m5m:_20{P}9zР(((((((*=Z85ETdԖ qq'Im. 8h批TOkKYBC_R^M1ƾQ\muw0:GfVJ8W[ŋ Xڄ:\xn{ Z%JJ`gM]SNx8x +:VZ2' )-m>FRXR zVGp0ȣ\׋*aB$ٻٚ6- YeB+b)u4z#X4ؤYY;XdfԿ?'Y(((8fYzg#ji:@Q@Q@G+Hm9*[(((5ZggrORUH)sZ@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Ex|xڎ 9}W۽&l- bH,g!FA |g*i"ƑGDZ>ѵ{={FtDQ#n= QW毀>uqgzُ_JEPEPEPEPEPEPEPQOo9PC RBvM'9#%5=;-ar$1?4r(`ÿ^<kx^:tx?lm"kEErP=O\u\enxsa\sqgRA^wM/;R- q}k+;[F 5~hCҼ|;KZw쑴[|Y?]Ik䶸WRRX#^ B0 RWC{oOY{E.E*ș#4>Y<ࢊ((gBG>%Tӿٿ:EPEPEPq̲6ӟZYU((*5ZggrORUH)qZEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEP5+h`y&LIA'8+a8.qo6]=?z{6xگ}4bH$FWn`-c7Eߕu 57Um:V_戞ǸZk:gT?˷=g/rp =6)VhD~ %Huw. ?ݯ8Ԋ]\osm$y^[h⽓wĸ<JĖڵhz:gg;Ad=>MEgs4)Ux<¸@>(((((?h ~M!O%^-zQ@Q@Q@Q@Q@7V[D*7VR0A|c~f۟n6?U"tN5mu=G}h߄_dV͡ݿ;`Ӟ_ M $R(dt9  WŞ==mę[[Dl=ÎFF[{+z2Ntأ0NY'l1@sZaдӷ.mgyJy28857P& \z+`n_N1'.1c/LT}s wnr8EkRV ُLx[_RWž#QeŻ$tuG5?hzmv|?}%l9PȣtׂڢiڅjS,ַ1"z2Vh(((((((icSUs<_<^ ֢pDl#KKH0+l㾲/"i`Yq u=OzM:Fy}{קIUCЬ˯Q^Q? S>;?_juQa|`z)wW_ZIm081KYG΍O*=Wc R5:S~ *N/ jwjm..z?ҷk0^T'QEl@QES#"]'MDw#3((bD VDrX iQEQESH~v}4HF0ޠ=(QEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQE鋪Aǚ>hϣZ4UFN-I8"[kF卿 קhjtw vEu[:Op5rHfZ[;Qط 觱RV"wGt=($¸hg/?[Z9U 05ŏE{~fzΌտ/q!?fzz½$DVhn!s ?/z2j\0Jט_߃ogimԬ92Xc].OT 2)=\W/UCKV/*J:u_Nv]N~Hצkip[ġc5 `J(((((C&*J=4?/ZGȇM?T{{h_QEQEQEQEQEQEs3~oMj C'fwlj|7S]5H|O >WП&_xY"$Ζ,ˈ%[ӓy溸Y&W/$1fv'$y$s@F>קNv\ר?=>_G$ʒ#WSt 5WI 5i5tǁtCG|zQ@Q@Q@Q@Q@Q@Q@Q@Ayg Ӯc{zijWLJkyFGT|pֺ/ Jio''~UT:A&c~¼k;U),m+֧8Sī gX+ Z<*!?5^]H8IGNjEJ;0* lU O􌡔F)4%QEQERuuq±4Fs@QEQEQER/ \֭k 0's%QEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQE6X'TWԫ# #Ҿ=)< HxLng\Dx>n6Q;bh>|AϾKS.Z}kB ,/-^{R3PPE}cxA._#^A29 PEQEQEQEQEQEQEQEM;GHUs,_:W\gwG獃jOiڼC9KRgRimqմW~5-r |ylhx=G뫮*OBUVVtqi{ï[Ԍ)SЌW&"+t:it̾-0:?Nw+8a9G;|M>\EoCkXμ&l[Lps-|,6tki??VЌGQEQESNfG +BpI<QEQEQET_w]upO#.s#n9(((RnXUgyw8q@QEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEWL2.ymL0>YcO-EKF$t+[|fyCn"ׅo8E+f +gƷk4EF;QïJĒe#58>w[28kNt>(C״ԬFkH57&+">#Q#r{W-1mew؎ zN?4ߢ+-4}N=Vg\ "u¯ךh7/&eQzEzLr$,dqaW^UX^ķ3,^M(C(ǻGun pX>%QEQER>.nedm4%Q@Q@Q@"[Y`NN*J(((((((((((((]=VM˾x}6çָowI!^4ԵS1iSA = O $M$/.Kd<*o(GF$O͞<CN4>+dJ>KMG^Ԍ|i > |$W F#kʴo;O$O"E 2['  A@EPEPEPEPEP~!O%^-QC&*J=4?/ZZ( ( ( ( ( (>P^i.uR9mE18 ߌ KKb)q ,'$ 97x{V̫˵C=rˎφ5OK nLO)B8PNQдzxObj? _[fKBtU`7ʠq $cxOhpDvlJ|JNRjG`<d> Դ?PGpzkl<{èBoU=@Q@Q@Q@Q@Q@Q@Q@Q@s)Ea^@55X4]*}B] jťwp]E.hE0pFF:u%NJHƬiս)ooYcy.y'Cv#56W_s 8_hqm9EnԞ{9Nxoϧ^" 5V^])($HiZs !!#S?Ol´+|IQ'0|unzIG▋GFVu?t70C sW}f?8zuV5.XO1E\d?uڞk-i (f5, <4߿M?Ukђso[?{*Kf"Eb=ylOk;iՑly"SZ %˘8 ƪo_*˹ipr#H2y-fL-Y\q]up"2w1Xr_@xWUߙj֛zK}Bi8I[iUpq^[Z"@q<Ҥ߷W1xpv}7o+6 YǶv6wr!b?jė+:YSd_:6uXd[.ކI5?MY   pe4V j=??Җ|֧u#&Ԉ¿Y]ϙ^`YJWHL/$?QhQ>3B)~aSy.e{+iwPY$(HC1|}kE}7fZWx^k[&a ҇"i7^cakڭ +"R;)P瓿8~ߙOhCVo׶iff\K[50>%-YW,<_i72ܛ{h$.~\?^Y6B?S֋aӏ$vzP9_~Yߙ~v۟MnQE0 Em.Ng(qQQvbE#h1QAGu%vz_^ЇN2YN?^=+:? jwAHOǧ7}7>x9L2=_kz-5+QwlXv>pF>u?~%i#F&՚pyq}=Z ( ( ( ( ( ( ( dq *ԫ}l \WO}3P@9F5xCVU{3?SJ~Ĺ%?pi]E9Ǩ+VPU/QQZwk'1ȻkjM]J4}<ő'?jìvһ*$bӘ6Rێ+*V.LJPjQ<[[9clHDuulAb,5Ό0/~/s^&|^F'?ˣG8GnP9mѸʚ5%ugfQE10 jZǩQEQE8-T]w] tQEQEQE&IE-TB?'tQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEli:d9L]ewbv8~@=5o?g }DhZ, {qڀ>еh/kr}9zѯ FSZƏ~ NjyO{ ( ( ( ( ( ( ( ]JfKc )UЫU=]9MIt3MTy^|v`;认aGq^WضOlso]u_gs-ߪ½tte3gRVCHHH' jRՂ#omN{=_5>GOZ/CgsѮ^e\ɜ|~=,eӯdrñZ\/([l3~+4,Zt]2^%Z?_ôKOU~>t'zZ2uA_ד4),dA5ZNb?ݒf£arKGf^+< dG-Tӿٿ:EPEPEP8KU,_*QEQE$dduR/ \ր-EQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQER2RR0AKEy+Rx>KoO·nS܌$w_׈4鬊¼eIc%%kG^chz^sXw  Oܿ6=54uP HXy'COΨxJ]&nyVW?y?sjR]H0d|: [^ M8#_S2/m;r8d^esI}&Ɂh+[zד ӮntDZֶmQc7NA1? l^ TDq8}a-;%Ts(OkCSo}v+U gRAEV0 )j%ea7 jQ@Q@ `IԵR>.n(((7KU"[(((((((((((((4_xWR7OIQ+(sϩMz՗[7~jqh)1Єsn?/RG^5i_1^߅~"|YҼ,VMm%*y"^ni{p= f++]~h>}B[CpG>ּچ8ն}Ciͦ[Z$ig9Jg{]Q@Q@Q@Q@Q@9GȇM?T{{h_GM*$hh((((((( ~޳@֎(ׯ_ ߈/ kjT+ 鯞3|$MNJ|9od}Yzz}pƛ5 #06h_ǿ:zs~,Ūrud2wV˭}6clsԀv,o;8,.໵;&A"6  88 €,QEQEQEQEQEQUo-I6 J { ~)j16ӭnA\F6Qu?H?Zz_zE s޹ϧKcI6ܺ$aJ|Ab xbVH(;yo4+ʖl-F=F[Yz8t57DHi\޿ZԊBCS]4+ʊksBN=~&vOqݎ=?ZuZ3M6_?ḳA!t_C2{gyʆai-/6WǚB[ڲvt6O*Y1[k_w!~ D̑ڧÛ{ RFi \8YZOc40:Mے?m%6yͷ9XFI%kX'w~4 [nbiZ2æ|:?21Ft2+*cp:=̷K{[K_B܅?:l4+4Wm ?Z6-8$ v?һ.,]?tVpiCN_mPzT,@T2hݵ!H¢5;hTd8z'T-HRCFz'G?v:STZ5h袊`((\E<+9yZ)8gKA8AEQAQETI˙fݝ c*Z((((((((((((((((((((((2|ihiѨxBu1~z(?P4Zr8da~Ohϣ]8Zz\emNu7Um:V_-=qּZ[ktrߊkѭejmƸtl?:0ws嵜ױ{j5]:.XyNG9 ֫WXUf <;~^]\yu-2Hŏ^={;FYNC~o<ګtZc={ A y߈nK>] WMK Ig[u++-ܫt5,3 2=>g,5[Kr^>q2o5W][Keu%˶HwcJəalƼ%]tۯQH;UQ_KAxncj[4b2~e?QگS SeJ./[QVHQETP伭>cҥ ( ( ("H66c1REQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQE-EVsJBD;z\?i=dtmy|Ƃksf퍑[XH}װצ|"}oi/Iϔ,Nq0ǡ3>^:熣lw;pվ:OQ]@Q@Q@Q@Q@Q@Q@Q@t2+4$Úv1R~q^unv2)Sה[iu-5Rtx:UhLOgy˶n*oҸ;XC9-5.)m!;IcN\u>WfyF#rsI-> J)y18: iDǒO}nd+($Cgo$J@yV#;sJغu)r4o-Σn+(X.M E620MQOO<<-U?:ʬ=CѢ&%#\OuJ,.Nv[vd1tUHvgϕmAt6[b5?Ǡϩ-d'X(PԄpx U!3ޱ&SE|/:qٿr:z t}QUt+(b#2Z8E3ɔ\]QEB (")mwN-PEPEPQ,nwP1h(((((((((((((((((((((((((((((((O?eЯ?8[iRA)t94jn=zCɕo9 s[ϯOJol尼a;-hyn eͰQvm'\Oua|1}OfiOcq<*+?0Ҷ? g-_Lxn-qk/,U;ߧV+9m%xfۏD`3u}ўSgw-w~ƽ/M!׆^{S}Sns޿CYMc"OQ+Xf%Э5=*㊤CCkV, g3\)|~G[fhn` ok=BMNK*d:ܚwK<iS[#OAŞlI"C֪u-?da1s{EJrt*^_mèR+ڢ+,(*(`gmN*Z((((%mԓn銖(((((((((((((((=ƿ{[Yd~;Ih Z'O4{g|0zuc@K][fc:qzcֽ ŏ~ jk`t`s€5gƾ n; r$ 9kequ_ûMسA~i֮|k柺2.qe*Ou޹[ƿ{up%FHYKc,p>>(|e[ hW+)G\`<Tr?zo_NpHYcG^+iRX&A$r!ʲA"%Zxo$M.Wvg 9J`dF\s{ dMqʵ|ዏxO!yaU7M|=$BTIꏷ袊 (}S:.H?g{CA knخWڵ[XLa WkssG;J ;Kpr5!uʁ,|*~I676 Muz^EΣ#;\b⭌y[ ?ޕcU֗7mC1c ,~xCS2JvG+z+;>&mj;qDz?J>}?T UC{?Q`OkY.wRAQtRkV3f=Y}h6|+G\=ԶWQBq"jϔc/[׻:jov0Wn>NN/z5Eҵ-EY=Mc]\yu-2Hŏ^={\ʳMAh ʾg*e^.8%O =^'#i+6S] }E(ՆjtQ[Q@,2dOnyو>d>=QEQERFN[#i\(=Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@މxGIխc>2-웶aʐG  |SD;:IIYp^rH8~i} =70?jᗋ<KmV;rrx._dY[pZL[NHCe<+_/<Z䎣z ?_7ksj'G|}SE69hX^7Pr@Q@Q@Q@Q@Q@Q@Q@?4"j8۳-|Б"?TKycpkoӯe|x?w*Twݼ9E%ojwH^NVTPV !\zt~#q1_=S ӽ&vgRU" DԴg٭Txw?+ {yի*=ksq_KGs á؎ת7?j< 5gxB_[[kGkc{g'*p{X0ar0!|1^kgHPlP{YW2^]Ks1̒1c׏aåeν F:NZ?/*¶};T:NHp6q>2P@>»o Jͷ/A>WFSO: qLxwShC ( fI$/nvb }(z( ( (*DOuBy,čO@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@StsK5;hld?FpA"Q@}4Yy#Xxx-N6G=ׁus>?/)M=ca A$89'ׁzȪ+ PE|Oo_xĐꖄ_r M6:+}~|Jkt;o! f"Kr=4((((((+񮝲hׇܟQ\~U]F5 >kWH?mBai8 ?bD.؊>OƽOO$9-x6 B+ҴmCWGIrr97ę# O5;_6j|pP-K6>+NY]ї_/GNPA9-WU"*MUV&ED i A F Ÿ5QRVVwkǸކxOUwV>Uz?AOʻ(oK~UUgΕ((&{ĿUZ)'bA>ᏥO@Q@Q@T;VY]Tߊ((((((((((((((((((((((((((((((((kźG> Iɦ_u;O̿^X#M UTH1\$z WY--9rnI jT؎\DoOk& $WzNOC]Vd$4R(dqSWkC79hzq^U5>NUk2Ķ# tgs/n-." \s.p;| W+ͧV?$>ƀ<_jr]Trf0 I̤nk]қ6pk @|wN:/4-fp\z*&&(Ȧ+y6Xv1 <=Ws7 S0$+#Ğ&Ҽ'ɩ+ Ž#vU@f/f[1 _h'wK`c< ~XiOGja9pe琧a9Bj|mbX;uH`*,(|ѡӾC~>4b>i?#Y6]j2Omh%zyrJgǧUYvVJ-6=#TeݜS>?TsZ3]['"zpf?lc?μOڽV;Lbi4@(0GA1@?MǁtXjHHG qIZC_%o+LP#X%@)KtǢoJ5$6)AX(((((((((ym"h%BG"WR0AOY'4׺U !'ҹM5/ӱWJfoG|Ay"=FGfKFMŌ,s$מ^ }q56Lan-=:R/)셜_*rG2Twי/ K),e;IJEn8/oٞds=*e'쏠9ˬ[E C)+,uYZ }t?6ֶqH Vχ4;50zd ^Yu9jf؊ߋ"ޫ-sWܳ޴PeȿN9?5mkqy0 &HԱ?V~i_QK?"~λ+; M>&(#h?_Z.2Ewψy&ZF+(;EKoD+XxpU@w^#VЛӈ00ӔU[ᆖ j z_&~ҵ(obw+6utR=0ilQE#(((+n;϶¿뽪q_m0H1=oOωSq|-g}Vż=B&Ki3;]im3ױM{X9}wg#v{8Y,TOz ( |U}꣞`x&PѸ\Xqt\>eP,o:$' wm|C. D=մ4Pyƺ]YXnWLJDZ l CJ.:j&NU*/̗Nmw1jG?2q{w+ZXhV^gR(3 ( *\bB@aVh((u ,JӭY(((((((((((((((((((((((/>ӼQ\i:[iё2zǾ;6Myom&Z.d;B Z|Sm3Nu?gS؏ס>}Am;,^-;mM=Wh"+FVSGmSn*>IzQ'G}:h Hc ڟC@NQMD47Wee9 B: ( ( ( ( ( ( FeW70 ue?tIէpSl尻+4u+(a?+Gu=;VFIcn-$|:a^x(ohyXyK 7 _gQHC)GzZd*+h-wFTRTOf4wGjt]y{Hӡ%א|M!5k",O}9uhTl~`q uFv5zٚl_݌72܊nK >U9h{?q{yp۽; []EmiA@JyeZ7Z 5inxzܓoo'QY&dGBw*%=MN*QمQRQh˫Ze1޿eѷЩ5xA\f?~P>-uW(yo eYMZ1"j֯1Lncc נiZ#:g5ӖxzߏfX?'!EWqQ@UkY ąz P( ( ( *r1fBhE zu4QEQEQEQEQEQEQEQEQEQEQEQEQEQE~6#Śo۫,v@usW}E| ׫c~^5x[nc$Sq'r~PEP]KPҴ˭F[ZJފ'WːCu e[M9#.x\c=%a5 =HC\*гc|  l"PꪣG۩tJKSqN[_YOG~Gki%bp 9?; i^ L_X\?nbNJ<'agV/xRe%K<тn38*eִk{`K$ܤ? bi6 "均v%,"Ҵ=:6$ tQ@9GȇM?T{{h_GM*$hh((((((((n`yfHAwl^{87OʼTʚW9Xuz-ZGRu?yƽ6t4_g t\5ޣrs<՜A}fa<~v8[ \ë/rMq{rdI'C1,k>jږo]xo>~V=G^ՓY=tJ ƽW iq%sFYO_nZ#zmB?t? z8:{=/wogQ^A{8`cz*yˤ^W- q*zpO 4.7VspbUx$+ ((j\ZB9¼RGpVD@Q_hk[.)5f^%i9=" PZ6.pOZ+ɕ G4m*EzGAL-+ 4V~ 3 66( (+DpX`<QEQEQE^8o@9X ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (1Iv`'ĞWͥjky9FݙOb?xVHMrGDchOzGh-IC$lYOB+O5OjM3JOٯpCø߅npndФnPrd_s*+->Ho[91"9&J) xwUxhzHxH;N2qlQEQEQEQEQEQE)qm$.Ԍ=f{JD6Ѓ^Y> }3Ys{"Ђ+: lj_$f(?8 wy7%"֭T}tz |!k5}ON-rw5ӯ}lm+w*A;XV3up^ƿ|!! nC\8G@Q@Q@Q@Q@Q@r-|MJ/tWWP[=1N2qY]'{H˞ I#՛O֍$er0M 4L7PGq^[%_IrrivǕ/l9DoOkAJz~GĸUto;j( (#`xf@)<״.޽@oOq^~cX.+ItgF;83=D56 2+}& &:zDҜFԞS /̪`lVz4kz% 7,SWFJJCM;0)m-0y7/=F*PEPEPUiHTJEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQ\į&cMԲkdc2~s'9j!^W7 'j' 0x|7xQgЛȾ|I;[$8 p*8'+yc Pk_uDGӥ`Wm^>Ѻ1VSGPk4-Uum9d$ Gחg]_.s/e-ƥQ^yQ@VN#k$F9? ۥG C^\w|5}|dGOq9Y8xmk_a1Qq5v:=/Um0=T+.V{w*#W徭#QO=Eveq)S?O1`'5(FE縫Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@_>1G4H5R2 rĎqםG} 64Ztrh+[ W%u~!x4ӵ4ȒX! 1r{mQ@Q@Q@Q@Q@9GȇM?T{{h_GM*$hh((((($KGT_V8W#j|L,RE Ĝul\[=?N<ٶO;Κ8a{{zr^"ﷶ"qȇĞ?7n/L౵`6 lv:}:=7ZOG/GJu܇ms3;FeBAە>Z{)-d={0Ez*GMӞ֧,-UVևQ\ׅ5ۋ+H|ڔ98UX)(*5 ?#V*4v]JpGc ݪtQ- Yܬ3G,gEx@iuTu^祃ť=n-Z %=}ǵkW[YG}Gc^j7JgUhl?'Xվߧn N{[ԃ'zԪ*SP* r|N#?bȋʺd!ԩ{բ# 7OO{}WsD3SKr::=+tFŞC\6m^Y&a$c=Ƿ=;Q.7)aqUºWZPSўEQK}VK 3OWԍH3ǔ\_, m+%±I6b#,Edud((DHڪ~5bČ5ܩ U@8TQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEo-G,)#U ZPzPGrh Mx: fHN_hs ʕF@ lxcuu}"*>[TqN GzNX"{ok S_Wu]V4Iݠբ"8@((((( ȷwּ.&#?-?58CQ^OGz~5H`TJX2;T׌y+)KpE\Ji"h)"9 ?WTd#9(txWD,߱kZHҵL/zt3GqMe##CNf{x,G蒊(S*4wXnCS -⺁MpZf2ړki XpcXZZIlF:/Mcj:Td ?~3ѿϭzo "" 7ty)ʜd+}X5e 4FZ ( ( DHت~5bƌ5ܩQ@8 TQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQE5߆f/12,|F*X]ƙGsgp%0`e0vÚlj*T㻠8=xW$IziimQŰގ8>π:8l!%K"n<x Uc)iv$<*|aGHxlڢ((((K Sc46ꮠ}ҴЌFi?EiZE#rpZ.3jdYJ^AU.{8vG+ 8[8V4_TE>,ܘGu^ѺF0=24u |1=>,%UV.'EҚLIcY#`#2v0뱮 ԝ)ӡYV (6+B XRc=s 7WpzQ浸 3סS^X߇"k<7[ wK *Ax;DGs'jk.mhgFE=h(MAcj2b{_xҖݿ꽼$ a XUmQ{@i2 x<Q@Q@Q@Wkb$lTR?UcFT(pzժ((((((((((((((JsRXeX%"d>^Aǵ}!_4]|LM_Aĺl;S (iF9iKQxz'6+)>6s@Ex4 qox;N/AZiwM2 %)mRǡj( ( ( ( (?W",Z%2!2T}:ը. BG*ѰaN*M&V. '&KdC^qj p DW1ʐV9ߏ>~$90?*+ӫi)Cȣ9a+:sW=6lr$d` E: (-g7`FOEP9vt\TrMip$)nB zs 6-O|kaUy~r&G̽mW+Mip hTt }5H3j9zʳomj5>qx>O~ߑEAgH}<(('/w,$ Rhz( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (<_%yU'g i"݄8Pr3N|9.ሤ5Kn=FydG|G4P>-^=KGh'^z5Oϊ?ܲ F{ur>kmcrN}W7}5JWrRH~ޔW|9ZW\#@`A(?zɯxX%HWC ( ( ( Ow kbS"CZ֏cq6}N)n$Bd׿u{3w> 4 xIUs4'[KM_ td z^5Z!w=4\*+ 4B+ p+a;h4nכJ:Vȣ|oO+o i7\$:Uiǂtg?'cEW{!EAk9qjz: y{,$#Ɗ`bT>kJyU}n\uzj=#XVܟ$>xoky`~D?{W'ms5UEogSX?g xsGGnzㄹQG^s,)yockBJn4(KKRz($(((rrÁU jz(((((((((((((((((((((((((+^ם]>M2vp& @\mA@:#9(+ /xZFQssiԒI_\䎽:y]3[SҦ'uaWD0FA,hL!bוxǧ={9|u >M zQ{rO_ x{ZuM&堹U׺}enVs=7<EQEQEQE[PQfuLdAOBtw}]%#3ZBc*)w{t}.a/$nś c8[JgR,3RӕjV0OiI!l2j=GvOw~/ln71̿ak>)PpޭgN-#ǚ_dM@}/xҵmKڴWuĶA;k]C$^s@EPEPEPEPE#OGm)9HKY攚p&_&=֕QRD qq/sDB zV& Gc5#Nq0C\I :~YƽZX\VʼRWӥыiUhs ( ( *a6~=QEQEQEQEQEQEQEQEQEQEQEQEQEQEs<'_ %2@?Obm<;i( DoȶkWMnx][邋-֖I5~ݲϭkZN3C &b b3ր=/N­^O/MvT@Axfgkt$F^!~ΚΝnZ| `rG[q]WOz=ׅfn$eSG%FsҀ=(((((C&*J=4?/ZGȇM?T{{h_QEQEQEQExr}C?zo-mZyI1}}O^Mssu4I=ĭKORGcFk//#B1Z ((((((((x! XdRe`zQ_9|O!6fּ) b2X.Y)ݗۨ>>29;C_T|9xefeVۨ߂#vob=s.- Uhg{+Y9)$l:P{@y^w~NV+-D# ?뎧(e 2@ EPEPEP?[k^sxWxE?_dY?/Փ i ooi- z .lE褍&C#34o|_扏qCW"lZLu _K]c0n9 k~S6F?cwּ l^T5i~ ktovӋHurqV^ʦo:jǧ k?_+?4ӣzMOUɼ/fߔ gvza]%rԦS(RCqnݨ .27E4m*Ezs#Уk$8fW"[~|it:[K$9IXu A#ՠK:{V^oGi.I?~;~FQ^QER ֭@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@q:mPE7(޾"( \>jݱ`DZ<ֿ߁KmH'糕積t>mKL4l5Xfx\_9|E{[}=? E8Ŧ('8B<ho8:@w~ݳ9㺻+ֽRkr,4k'ݳn8OiQEc)9>g(EF;#3]җUZ 4G5G]IIclU"viLQw!Ġvo_kZfyujtw+vEwΕ~.A߅z@ A=|Me=6gV*:EuQ@s^!ػ wd\uxGκZ+Z~Fʔy<3Mgppk5G.ʷbBEQV[IFDR7't)"˿RZ4zjml%=}ǵkWѭ U)x.YnQEj@QER/ ֭EQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQExOk^~ሒH*\콕CzoshZ_ =b+:_ @]\c@:{(+kO:Fk<,r}_G[? 麭qU̧ ~9Ic-!O/zC4W0G<ȡD` @Q@Q@6_OQ@?Y+f>n|ҕGNJHε(Ճ(ocyw>8`lQgFޟOJsK1x@l1Xn1 PTWoŖp=lT9v8_CEPEPdVCPiڳEQE#Ȍ=4oʨ&O&ʥj/m'k _O]ɋêuK[%u~ z}o^Ism523?h5P s]'=7{(TOCӿ:^m N? ?º_ 귺>7A+t;ic՚S%Q\hQESQԭu:ڵK-y^{wS#dd~uҝfx.,,^'$$켞wWDzXuy?|]>p?t߭uUΒ`sة^UÐ.cz(s5j; lz(B( R֭EQEQEQEQEQEQEQEQEQEQEQEQEQEQE|o(o6m_BW|e9א7)n3"pa8i+{eZ#FkyT*ykb?wNׯUֿhVݭt ,$Vie ~WMW槥]\i*WE r>y އ@EPEPEPEPEP~!O%^-QC&*J=4?/ZZ( ( (0aDMt;Zo3O$+ݒzzֹO 2qv8C@|Tʃjbs EIKO{kR[Ե2{z x&@Eq̘c_]ö>-27ٛH}ZgB*k/( ( ( ( ( ( ( ( ( ( <{FJ mJ5ξ?}EvtP.fTCd:s:5Zn_2ۏ ??;9_tt^;Y?*#Wxdhp $#88Ҁ>-.PV j<QI1ֵ= vfCཌྷ~BCǒ@܇ q3+ኹjo2[^[Ndx r }EcW6+𾝮ZS$n2@ 3qlPEPmB-FKI91Ұzj#7w_&jd$t*hTNji@ao_&. "խFFrA9?X:&&(aAF6aEVF=BV_OpI#ģ%Jz?*UٵD3 ^.<~J **Һ|ʛTnH zW)ZI=.0iko_]r w-wB3]Uxضf`ST"QEsa\ߋQmg3}}5us3G=9zW>5ԃF=@?^&w}~)~]P{/̊XK';w҈'t)" ]r$hbmH+qO}-dzykqj8K:QZYܬйIPk]j^# :GG}fSJU~5<^>x|?EWpD(ϮjZ,uا֏XnKGzuu VU+BJOKE::( ((((((((((((((((((((((((((((햆%YR ۨv8V$;W<%7yYNa(<G'?7,3o6GQEQEgkf,q+|{ҳV4OePV]ϰD_>~XLKLwiس1brI_ꭿ55T֞[[~GF#t)"Z&oA,grBx>yvc<pѭ3([V%?=VhVM3% rp+RHp2C9KU"jQEQEQEQEQEQEW)]R>VeG?(US\( B((((((((((((((((((((k~Ѽq=R JQ$' |㟇ρ5/"?6F"1G-u5#qF+C4X^:O8wW:OigO;vZ<[>٨O}DZBcP@T'&<8 WE}a}oryQ$о7#T2V+ȾE]ǫY2 0x5QER1ڥiiM6 D$`0*J>Y(me ^eir7(yULі4ghn-wJV{3Uu<ƥ TΛ,2c7Uu ի#7kE$={^{tgWa\-.m~ya~LU^6-Yh{Q\XWT\܋c!!$}IZԆ$$jsWY9$gH,<O?秗лƑ9޻.o ul1?júSm\]4Hj_q?0-EQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEߴÚäꖅAucJ$QYW% af8:෈}1y+01Rs_9[.ƕs_Gw,vvkz5X*[Kt#(+>|g<\"uo+ONTEp'd:(F;TAdI@aSVCPiEPEP=/l<,!b? mQM&K;@UFI;OўKE,0~U`j^2{&cJ܊xLC~ux_\k*8K(V#F1WxfߗF*8KG_EW{EjCJ^59c**ԍ(9"9(xU7"#lrgR}+FzLwiس1brI7_-YVZC{GٻkO+n\p=Gjӯcهpjփ+P&PIկh_hѦ=7VRXoߏ_>dFПo;;#gCSןkYλ&l[Ly7נWe}xӠQEK8ki(ljZ'kjQEQEQEQEQEQEQEQEQEQEQEQEQEAyymMyy2Cm W8TQԚ|SxMUh@2vzg56GDҼQ@гP[ Yj7FXL6$lj<-]B@)%GЊu&3j7^hf? |U[nW[ ƈUpxf@nZ?xk٭'_6k)v0r9<y'8Zi==2K}I2RiLC@u\s@0> |TѬ4;? jX 8vܛݟk9c}AȯQ-giţC'&91ʿF?Q9ѩO53Pцrs-`\uZPFFJ)c BR"fd\a}QE<{@<<|uj1f³jJUFdž^ʮC+ FAk^0k1xSaeJ^։Xj);"WΙr'|Sч>k U>]4LyQ\,kQՅƯ-$kQEw-55H4qg,7zg O!zw孁֗=H&͡^t7O`8uOXFqx! ݎe m9+?%_Z/?5~ι [Vxx?׫-?ylduSp5K^g^kh:N秸:[Rxx?נzb LpR=Eteyqu]멞/hmfB `(vqQ@އžKЭ"[d rNӴ|Fq^C+!Ur^ZM5> P55 .,Rc6}>|<^R~54qһ-мu M2}T Q?_B+]=~!-C^)c$'Y#p]NCЃSU׼ *(f8WӾ{?J i.XӑґT*PU,zlR,,23@(( sۡ剑Kts\-σ+kwt)+Ш'KH𰭬ff9bI50 ˍGPܬ|؀GR?¹+}ڽI5EK ]:Yz6o'QO#zԯPp|8+ OMӨ)U)sDx'f9P}+дMn-Z %?=8/^YA-?θfe9c<B#(=`5z)kdAkg*?J,iHW-u^po-#UAħqTϠ 7o={:x[ kt[(-nfuy6(@ 54?4^ ZJtwyh> |;|vݼԌdJOb(jEPhQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQECuo-QRHPF Ab>|Gs&_SWf5u00MdM9x{XM#~$\hpq珦/MMbV6{_ZME.(}Z|?мscjvnPbȀǏǚ uL4pЩM}ciEycsʹ9b`؊_xCǚo|&X[YrK^`xGj4XIbCLۣ}8>Ш##F!T B ZdR,23O(( ohio uAqmrDx98*Ez`k:,x1eCƻOr{~GO~x5[k v8]yOgpLyCoܶԛgƯt# uwgaE"R AלzEPU$֖eUQԔ#IhP MQI:L8nUEy_e->%X\C=v{ϲJ,n_~F?k+O{i هb+ōl_T[_/ᔗ3unڄW3ǎ?1Mol|N7`>妢݈p[q+f10߫[_9(aXyҨE*O MnE <}zI](EPEq>,i \Fl)?*1[9iQEQ@g_Vzm8E_NklI? HV NϊS_HG@QEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEWG3xKi^^`1l^E|#ZI4Z[K*T~:^hN→OTB?^>+n=0@3LI V{_.|@Sg*otK ~׵}qjVZ7uW6.割j(g]w9\s/|NмwnOJfǩSk9;^@tPN'*ș#4( ( FAEx@{)M-lxuVnO]yDIxa5H]Bn${ެWi:ƑsDwF~2xa>vm #SktfI袊;*$(p:q̲<@Tv^o2`{RTcMtyfc.{%Õ<7fu~goD>BUhTieuIc%%gc9zڋ2Ŀ3(:Nbt?-i]H2#\8ʵ7Oڧi(ɶk7qr? BCY, ޅjKր>(((((?h ~M!O%^-zQ@Q@Q@h⋝tLYF6ֵ袂!}B((((((((((((((/ҼQIisn2)W~ ior =q_Y2R`ހ> 🌵jbG1lsF^^<WD+n,`{)[1\w_xMc9g?,Ronmu Th."~UG \tɿIUϏrCi~0c$|*jJe:9{Ͷgͬ[LH2SQ4TAQ)QEQEUM7=?m[GDQp'kY\$2k>xS^YڦgGl| ?W} kSTyOFs? RueE6 כj҉g_2 *?J귚\*CʷV0?0EV_J+IM)opx͝9AHՅErۿtĉ#.Up\osO,(EϴnOu1~ RG=k+k%~?ql^=<2߻FC:K<~kc}4 1klR7\$3MgpB wow?|S^ƭ8-J=IK>Ƶ" !vQ> xz4/DJ6Š( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( iZ:W6X}*w6>n6,{eOcּfP55{+wᐔtazB+:o^n<xk $F}Ψw>`@h{,5}!ooU\E(YOm?08`Ӿ6h+:ŬxE|eyc3y QHʒv0e>tou+o%2NrO|(z+>xWD%ii,ROI!`EP03@W(( ozΰ+W8ެբ((+5ݢfSwYB3Xw~?@30cfqְiiuЖ2is98g\żr76&F,p'MO-nu .oW_us[f@ņܫfw6<SW%;) ePO_Pס<m8.ۅ?n#Z,|cmEue@dIR  7QQtqbtuSۿri<2VGuT? ]G3֤ݾUϬ3~:(:Ch/:o|0V[Nw.zz V.m'Ih(OY4=QH ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( dG4OF##>/Ԍ;+k?s_=FjOcgw9qGbxZ'ep;$$G[Ghu?XxI %-?|{}W^8ƩoX"We$! S/KPM-nY!$ W#E*HOV^Z[Y'8ʓ֝|){o =UecF0A ?5]"A_pE$u<ÓԀuQEQESNf28%ڋqhmG*_ڦwͲtHuTɡ&hH` ]T1R[U\m8CWlQĮh;?sύjG5ul]'2EDG>]7PHFNkΫBtV"ex? LH6vUs4(tdխ>\-c1<"k[} ^\4n)*?3^ފQ\cյh-m/ώ5NOJA0Gjt{^\ۏ,C tR&sN򔕾DzR)E[D^Kea߮:kk:OղJ*ۏvT,QKrxUӎ1ϞŢxm2O*D; xv 3K~}J9%m^jZz+npW SBŏ_=&Кc$\Ki/wΟij=" &5J'%yiBo퍪Zi`8~ ~uֿtRX v`O+I9` 2M>SϥThyˉn GfK.E#e qׯqWX= _Z3<:빍o6_>↷.D@;qVEύ|Gu?+NXU~JضgC7W.?(fu~9[G\jyM3RvW@2B\W[?ָcg|Qkoi %P9QҋS*E*.|A,"XM#gӕQR{Z2NU[](GPQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQES%9xf$ԫ (!<)yi4l+2zOttu2.,os8A+8x{CiMBAqyn : pw(ݝ#9> iiΘu.o%2i:c?ϻ5h~,Ŭ WP181?0$#vEH`}uK%2r}p8&+M[vSOg"mKw+(=6 4QEQESNw*`HdM$JOix j^ AV s܉kwB+׼*nӔ,^oq}ԗzN'}\I|+洸 3סS]v^㢿E5#CTi)4gKU,AVFʸ.rOH}Q@q,|:|]6HX920Њ`ዢ3j#ʹ]Y'&eOQwzp[9kxs ǿOƪkC7FM{zqT-MCGs|Wζ&%= SI o]7u/tM!j1@M,^ &d)r? q1n$9NJnK[X69K_bxEPEPEPEPEPEPEPEPEPEPEPEPEPO=}%ƍ9A#/\t9=4|e񅤺͔P$@CymϦI>O4Y%εz 2"Tjޯi:ݖZVR:RF~np1ߚ>(Q,4+;wglH@!A߃>noxpgKHGdx3&GiAhS_/8wmʻIǦp~ ֍-4dP88#=AQEQEQEQEQE㟴zoEIWg&KTh ~M=V(((((((((((((((((((O=мscjPywh g}/k/0Wh㈒Wt Xvh-F HJ"k0᭏ B[xބc^[qo,sA*H2AG9|w#_:5o]1B^B )1{~G}'EW좼Q%+b*QEIWr0afU44n( 0 A޹[;" zQZS:nfUhªז76ah߶zZ:->/)]&}0'oЂ z ՝D=oy-z*<\Ea$%7D Z#r?}BK{TXs;\u_?? ^[jVn?J 9F:OQWQJ(Ȣ (9xqukPW\Nۋ9VL%sї (Iwš5[#1*1\ca̾8 *ujMK"8.-}sMk4Rn2#tȣMbEE 02I$I$s@ }8"& Րű= T0~?<={b[,"mx;̻?U~zHt{OK*W$MCc^=}gF^79Y)־G'Vx5/\M~{ZBp ,s“C"IuS-lafK%,A!Abpƀ(xWWִ b8ۅ`y'Vr^ؿW&h̯LW_)9 v>^v3{}oy'h0.ZIvjmoǸ OfVk{Gخr:|+?*̝[1E8WԵxzIbmĪ:}GjkW4dR}k5dQ#asXL,I>z7YUӌ&Os:cZdR^J4蚆qӋڻ랿a|Vnnͣ.n LRI^uR{8wө7М??ʹk7NtzBCj: qO.ߜ-~ _MP^+Ncb烁ҰBV0Nnwcy'&m<=_`iNyD/xy,,F-,QUj:+G|6 k(?k]>L fTC.8D'WRjm< Z+<>֚v!we3]υb)k>gs彉= ojzDZl$ESڸ{) 9|f  %߳g7IEs]WUh'0촿bc}V #{xzouFuN!h1 /?בO]eKKXu$(LAHG6&(qER:B((((((((((((((((((((((((((((_/)w(f 8P9zk_5i]. id(Kd 9bO1:,Lcc+~ DZo|AwWxU̖sae=Eu5JMŕ&后Ő /JQ\C} x8>uZSc%]4ꩧdzFtn(=U@>YWZUFN.d1ڷ/4ɏ:z yҕSʷWk:qjTZxKd{0ҥZ:֟a$UFdW$"+[.XrFcpIn+!*nqޞ>~BVE5dEt`!"Q ;P2I8u?nFQw=7RϹ4XW?CN᭙awe{E@3*{{:]B][SY#a7^C5OTl_O8뵜AT#>6W>UbVvNC:Q~y_K5^ms\TZˏ ι![C69?sZ>1?ʻ CAc-=N2c'^}KGv^~5ܞeޑՋ-SHFJ}+,|-6eaw5Jۘ֞E'Y/ 餙??6{M)AסK,7W9VmQE#(++O R88ʞ=zWIEuiFyeQEQ@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@g5t;"7>%sї (Kszuk#s!Hf LW1a/k}r[Fc8q2FH< .b{Y5'FWG HV4TR $OԒO@ .,AH~D~v";ی*DAa9׳xoi궀\+p"j4ugQҗ(?_#ހ>u;]ad}Y|,θEa21z+o-泷HfR爅[;Oc0zY5?̼N:h<((((((Cwv(0\KS\"#e?uBEPjQEQEQEQEQEQE|ݬ?hK&yNP# nv?wn-<zM#JOpV*qI?(ac yj0tAŸ;$$\r=e|]ͯmoGѼ4&FSc'Mvw>tKFGnblN#EaxZ<Gˠ˧] B4^j|0=q^.|3^o- n!c+Sk~]\BwŷxU ~Tj# }EPEPEPEPEP~!O%^-QC&*J=4?/ZZ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (+zuͅ~eO ɸzW Q k-V&mueJry8$ t-~*}}:[yKx, 9$O9 |o>ZnpSpǡ5@! qI,Q*,*!@xKz<Ls-4RW`^tUDH~p~tX?=cWzށoQ{ bkK =Ta8h|m[L^S?c?_zb?KO;GWFd?{z*8aX#ؙIްI xG`8i$ m)g5c{hv`} 6ደ d;( ( K½V衈toe{*kX4RU6u]7Oʪisk[b^;S'xH۪ȮCybzjyΓ+,['=>w:fe$.9a?s7Macr̳[Oz)J%sA[_fW x{}_>`k!mfYGv:t%QӬׯbFw8q\MZ NΪ<8%>Rn59eI6;]cEա%}EyƟr\&ft S.w/8R{j6S0&㪟Q_=j捔gfiǯ)h>'k}Z)䧱++e`FA =WHg(}U3il"2ړ_q`3Zi}_ӯU# Q={yk%%t%QEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQE#T#آXbX;T`fxmsYM;&"9*u*6h\OM+cg=FW1{/^ȷ6ˏq?ʝW6WjxQ]骺N;OHNQ||CY1+V[vF=ڽR\u FU=U;.F8W 32M>Sϩ𶷮WBbya >YxQҹc>!cqys i2UG@=$w$G>aqoxu*~ΧcWֺtZ&t.cmN{FR /~;OhKَtqXhM>c PLT+WK{oL j(f\<~+hv7/st>>ѰX-kNW= xJ$xTi@@|4Lc☗O8QwLSo[,.iZd ?O`s*fd~N#- 84/GRNFRʼn vpq>=x.Qjv+<}8$'W$ `g$>X 8Ix؀u <O ռW4x䍃+s_s ơ}GCs*J\X䓝^@R3R@Ojkkv 51אTt(>kFu)[Y UW9]3IzIs9?ua7>{2^Vn:_nP7LjAF?֦= #8y5ʺ2 xjo*YhX1H"oK] u-67 FP;uOW}O+6}p+z?Z7DɈ61~kIȧZ Q S7- g [VӴmKV}6SO *z t߅Vǘߟ~h~+R݀º!;/u zXUI*<\߇v{WqsHO0?Jǰ:$5>l1`zT8)'+=:Y;Z,>vgr0N{z-PS z`kMEMŰ v=_zslUhIty[T)J yhZzb)pj9^?¶Ɉ|SFBWqx/]Cj7]?/h ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (A1M%sFi=-0yQ@U㟁<f6I}Q{׿flN#~huw᪺eXeZuk(2S ?|GH h?5zq v>-EaIT!PI'>PT[IŸu|s>>\Xӿ?H&hҭ~;x9ݤ;^|1F9=}+Y՚y^nRh hdSRGFpJ8|G,2fbAy?fcۘϗa^q6{Q@Q@=RI3Hc6WAN=?h I \Yuۏv爢>mak9Ye{qܭŴ${}|Gm*&!s Ǔ~h&1Ly+:iԯKFzh.xDtX}}~~E4sIJe9gIGC c袊ִ(X'ןOw-ʇWdvoDV<%O}ͲkK_^[;~!?c릯(塝 J]oJ&g~r>ϕW։bz{J[UQ_HyEFMb-f%љQ6TgNJ1ݗ +/Qd^jFɮOQcWO῿)ؿ$sVP uf8IiuD_VG׼eܘc ʉ1ɮz)VRFf%[k޸U&9<;5Nƛou:J2k[xwy\Cx F&HjVz3q ?*t黲A6ҙy =x٤8$ (@(((((ľ]bz݄wQ&6$}U湍?>j?lI,ovKx7? p>g޹Ouנ?̣RhqOC#yg~j m5}_Q{-s%KdxhoSDދccݺZ-Pem!Ҵ=#ºZ5[[f<=o|)妑4+=\R_0pn=xSڵΧs<}jm`p1<:ڀ=(((((C&*J=4?/ZGȇM?T{{h_QEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEɿITG]˜db ?b/"91Z ׼;Nk b+s9S9S+Ru-+̾𼏨 |y=?}y S_h'~IH~޵᷇H<w [@|w@\f>wּ &s?u(;f8ӵgk+ՅL0H%q9Ibu70==QEQET[w]n%mwN-GQ,H ċƯQN2qwD*JWG%Lbq=X%x׮VV LxסKj̭kEiyid1RNMO/RֳLᢉyS Jn-Iziŗ_4-#%@j  jrDH[q8ʑkKo*JכEǫI{7 hnh'&t^v׊Z_ڊm5ŕuﶃlݻ'8S\>s4g1d8? $|ExQdA꿕{Ɲ1ipZ2]?)Y{nT?^=bxc:բ߼!?4r2רE>ᢼt?Fp;~C5PAdހYUu qiyʅfr %MNwrH\ Q{2s +t\ܻ;E66cxZIPT4?"0oS<ZY: Z+ezy?\jdv: |-kUԧ"c!lR1+&o7,>N,YYy7g^2lỈж>]VZ]6Hzm?Zq"~\eu Bwu$}"q*$#m[A1-.?Χѡ KEV6MTn碏fNPw.8ԏ,Zw@?u*CV^iD >ux-񬑷Ua\vti.L,~a=Z\Qա.z/Kk5-fl~nW.Vdk޹FGdu*pA ԍ6h 9\ OKD2)uh-&cvJ+“W[^mo-?WםaQ(hz IF6E&#Qf5Ow ʇ{WVn[mlG(c+3L8գ?':~mM$޺ :pXt#Q[zmԧ˳ySz5f؜~;)ȒƲFCE:;((((((((((((((((((((((((((((((lj ?AVnR=F)F3%Q@Q@|-֯h&}c&2vJ +:(GIaog2+d@*c޸=Ě5ѯu~W{Svlךx2L j^$ԧC\w><:a5K8Q>?S׏~ X2 _xoˬ<;_)GC;[[/۴yc7T?}Er u_̖Sq*|]O*E T>KTu="Ue||/ үQN2qwD*JWGޒyĪ8} EkT1FܫZUu*Hd5HFacFkΛ|CgEo*Ny?Cޖoi0M$2]6*sjyasJS]Ggv,rXjMUTlҹ+ -.kC"Vے:k闷)oosWg=ǵyJ -X×ݞ i>IJĶRbiuA[e$r=1c]!  GQK;~ jvmg NΧ(5/e^f}N,0{ШhfTR@Q$+u_,/,ZsqEp꭛v|T eA5,O+H|VnZ4k4= Q3et=vtrZS"Qaq gˡev~G%QF2c')Z%y \#'CQK 4 5ᶟd춖6yv݉ҬR=95Y_CϴvQa g?܉B/rO]^KӠG{G&vzpXz?xF Вz[[yY`I!;g@JP{TI¤ (7 ( ( ( ( ( (>}j h_c-q}wmV#"na6P7A "@8<ו↯MGl i!JyP^CE?Z׉Z#3'Mԇx>/ǝ~MCt';eqV!Bqk+QХGQSB)̈r&sh((((?D=7i߳C_%?zoEIWg&K@EPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEɿUI60rv @Q@Q@!1ki^ƿp!q\~&/XAi>S<ѿ$?\q&$4w ]:ŋ$D;hd7 ?OlD}p:}wgmZIkyożk*V xgK2sIX7Uq@~1o]fjmk\p}+kA|;5a5OF"o|g'[rz>#PW"X^/ .}7O+fI$JtQEQEV. G.Șcw ?W#'SΪDƢRޡe~t#ZG>k%8usNr)pסO}*#̫?k"a/]Eemnu<xGPc7,IE?B hk+vj]^ oQj!S5aF + i>9źmV6}q^f3+pdzXl׌x&1Ly+mj}[]ևXDqso4*D@)!rp2{rj>SR(My/5N ;XaT02_3Dag,QcC9-uIʑ}Pbb45TE'.N(Z+ߋ;x&K[t B08QNGx"Ѿ>x+WRVw,*X,z-_(WW4 ERX,@OB ặXTeu# 8 sRW~2;o<%{7 $ #oR*^@Q@@ 5> ٶxIv+'M.u)B/tK0<$T>ߍT.-dN3ڍʷ+x=;f=>/6ҞW1^[\b+>Y}k 1qЏPk&&7]uY#=@rڞoj '[nKyF?+We'X':94Z׷1"۹GgYQer?žG_Ȫn.@~JŇԑ׿ekk^/EL_GK9#yrZ_ mk}*X>-_(+t:fpb$xY3=kӼ:=5 ѵo%oŞ׼{}bɒ68?)op}[jͧNѿ3ґz%w܈/񗱜z+GZ㸲~UH~׫x[״k/6I* G3M?mϩ45M H/S7G I7Izc9={Wc_8u}"6N[TqنG$HQ@Q@Uf$ЍSap2qxҎad/]< 嶝fFD9VSȮM Gő=c#?*;a?*c-c\~}B.G9QֵUhb8+5_C̶%_OOSבq5H%xħ]?ƓńL8oˡ+Q4s(KJ:>R0\&,:Wntq?$p}X@=—pߑsCMȯ a̲bkxwkLy؟2z{C]n&2^}[Z8}y{Ϊ_iki 7qهpy\GBNޞl,1ѳ(}6ڢ\OZد^x)wG:r.Y+0+R(((((((((((((((((((((((((((lj Y_skz("qe}n rF ױӼ /cA߃lw|?k_/Vu\Gw4F=G|㏃!wjT'ρ>xi}FGҀ>u+Zz_[7t0֍|3˥W28k;DXzfoR ]i:}ĺc,J;48(7=ǚZ;u=7KݵuCwvPE սF[1p4 jql1u C^c{RYb:߅uYbgXT}K ~"HRmhP ?vaT|eh=ڃF ?Zܰb/SQ78Aʦ2r { 'UF4wB:JbC{':R\S'9K!Cя<~jwڔe r@r 3z/&鬢JIdݿyV_UWF*V;/=qZvjGπM>bF|i>Vw9~ڧtY2d\8Ԕ`e{xL S_r?.NI/Tn[Z|N%@ &]qN1Z߅Z:zCԯ{W[x!F1ayC+7_Gx =J4 5(˥w=o ='tEJR.Y +s0(((((((((Ɨⶻ/ƹ<'kki&nŰ*0?Ѽh-Eyn QnqNܟ+os4Vwev6'i;Y[77{UK⇅b+˝#>Iʀ ( 8Y/&€;S@Q@TlunqatSMt)EIYOWr .&{k*cp{fnIJ!h 0Rq(<&s$O<~8)[S1$x]YN>&t.n'HV!&ʞEVHQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQY޹gY%41NNOIHrI885MЭ1˿^x4VRL8k'>>77WZMq,Hyf9$O#—GޗAR bM?aݾ5Zj+2O3T'޻?|7qY۞DCcڽ7KѴȰHWzwKc_Kb]@bNp:&ixróh趖 ߥlQSsܣF>ltk4bKB?OEVAEP0(eH"m8UpHh(((-!h!(=OEQEQEg_xijXWg'p, 0o r+XY y mr0zs_kZNۭ_@ceP# 0#8$g7|,N@I4Me3`@G|j\Y%B*Nʰ#|uvڱذ^?|ؙg+xOB]ٵ:1$~֧`d쓐( ·~~vFZ}}T]e|sk{ߴPOgy r)GB="/Iکٱbv=PtW/Ho.wX\s]@K1#k;SEFFrn-51W8L+I\o|-cr1iEQ`e1z2iRdSK1pɮc*u)3hz^SGU __z^ J5c~ZRTؼQ<0dۑ>6sfGe<}8W;ނ^^gsvW]0(Wzm'eFU=Ev/n:/>n$M|p2q{;K<`'ŷ(!CqN~e{O]KrK$Bwd߶+ۥ4.qa_]jw֒nqw72I2@hSBOK/s8ۥ"Y˕Jv3h;(((((((((((((((((((((((+UFeo/cd3CHS\vF-όun<"#!fj<O %mYF8 T57snI=f?:ָ[ۭB/.$V5i7̜oUJߕκ_ib X0|>f1n@yBs4v,Mt^>rX8-{ Fˁy~f;‹E<&3iTv3>kgO۟|{/_7]k>p?6?tT{XlCT)V`Jne7$$E蠇 KQEQEs~-'kijJ(wQGoOc_W'ſ՗nuUi##$,'8lqoPjnm r+YBaylqW55K?Yx k8`@ xI @$N¼FO)aXO{t;!LE\8k<}mas޻+&=孄WV!xR#"C VF.5v6ɲv9CWk0[[j0Zgɍ#|ףC O+s)hT5۷;u}iФ71ĤQԓQR2:1VSA⵿DaOV3MIXJ]F›m"Yz n}N5Km.U_<3˪}~qQ?3c%dцC)4=+\ҟO"~hzjUOP>h᱾V5oΒKjh3 8POS~UxH[{gd jHGrگԠ62#nn}8zgmhV>xAz5wj_e֓KHDu8ܣpq ̵ KYir} KeҚG)Rk~4L\FB'0G^2A*qA#}!ir EݥR}rG^SeZڦ^cOsQʗHujfI u/V3c\JeyHk&ۙl3.eI1G}E}[k+wŶDȳ h7#8tYv7^V^oGiul=>gCFS8 __Cp 854Rg} gy~=3Ku΄-b2P޻*zuZnw2P9`:~BRgZoӷO|1pD?Qҹ=CڍY⋓WE,]Jz^ζ ]mgy rKwE<$[>0Aݸov5 RxoW3}W-cpr^8?vM b(;wDz{2X5j7Pđ<*6Y=>ӽEQ_)`V[FD3<])7Y/)lyoQk̆U-`YA#K7AQWR5m+kk6=3&2K~:kwo{UqSוY_MQ^+-?#~=sNu$;+`OމQ@ EAEaj!Nz`Gʤ=XS9BX˕9E)5QEEPEPEPEPEPEP5|>𖱨Mh6sd@+ 4٨h6oۉ30/roo 4xVKs]dF@P>7אkp3$P'Ջ/?z}~4Kr~(|m PK/D@B@#x=xGbEmq]:sso:א)#Fs*( ( ( ( (/uAxr[Kܛȧ,JڤQ6sd>g?fm+[]-!Un$[U'{m q¥/XZcԙPyLf%H=5]Oɹy0*|i5ZjFyd(ߟ]焾5>\ Ǒvĺd5h%6Νoy8WOun}^,.|+g??w?l/ސ_WWš5 ^}YӮ,{ko¿UKhu"Ǡ@hUhc\!bUUHkŬ?i=0R6]vGo"R68f{Q~ZtfCq&˨#[RP$qӓh xKvO+p8;0 ؠ(K ǽz܇ pzEym6;Ȁ{]tg{Xmo2IVͿֿ"Զ=HK# S!s^EtRqqiY]Xԣ%$ޞC`p KX{g]gJ6S:~ErSc#SW8˯2m.ՇeGV ^لc_ӧ^H@e*x %]F[hxxz$1tn@GK[T p*bJQE'V#Ք!v[+kʿu/ߖ 2K dWAu=?+1ֺC+Jm\+((((((((((((((((<mlnfD,5x^k <0WB)等GMKE{Oonu{K"i3ooγ|K̞pG@ R{z{m66 D'^ V]A׮Ž%n?ׯxsoe ./qγ|5궲9,y$Mvԛ=\F5oKaETQEQEQEQE 9BK(],TMK -Ԃ*;H+HqU((( 4坋2~fDU=}MX((Z-f$,0*W`<b( OGAe6B1$~u~. ?2!.HI@ · 2FkMF{;1̅{`$] Nx/Ib/_T~Ifm5:T_un}W-kzu#(=x=_"ލ˧鲛˙cVE#+㵈'tg:y\Gv۹}Tu Rhlrwmqq$v5SÞ&'ihfa(`H%H 2@t^=NݏIŠ(QEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQQ<6<Q ;rk_~yVw]CXu*œ\쑼̨$+#i:ih8gw3^qxT˶o>U4SahpNJ_8R\h\#\h=S i[Fzv-;0ÕO?w:mek Fh[*>"V_ʴ/,b<p?Wm7JKs${T;WSMpZ6R=zn]fwDUvU^,?CZumQ*(QEZFܳcO֬{( ǯbhQ@Q@Q@dg3L ;H*0+ = Cm-0y7/=F*y'~hzBe/>ZmU~(V#YIs_ov\[6Rea>6Ŀ.EM:e^#T}>.mEۍ ZM ʉ! ֓FxS؂Y'fF,)@x?)}Ey_Yv/2GD\_0cl +BQE#de T\;lm[a '{WE])*-mo#*Uh{9=/<mk|*KmMQڔ02`]_D/|8j$p>VWچ͕w7t=Ҹ|.ߍ延6G{ntqЊGY> ]v^/.8PN~*7Z)b,N1U ğ䁃_*d0hT^GpD_ gmqO$2"Jde޻8'+yc PfU#]A+ ;>(v*K2c'۞)h+Յ. -vq'bWKX!k;y$n)'">WCTN%DyUԩ)+a8c]#QdVmF&k9UG~c],mYaPAUckt*9r|z_á' |袊O8*[-b90DZqҦٟ\N(b ( ( ( ( (<&+֣p\E?k.n+/zֳyagNu[mF_5hli?şU[ͥI =Jrhc$IE1x"kvz־+P-.]9mg_ň!#O}$yXH?=y +\? -kAӮeֱ*ۇ* }\24w[c$dbNwmRw~),Ѧ^~ma>vp?/Np[&Z.%bvvh[}y%vw03[w x3_Hs|K RM@OOКO6,bf9[ 3!PCzX9]}VӮlWw=h A=|=X:P" ~5\lz(aK|]a۬,.&}lguQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQECuu72,pĻ۠ m2[˹DpF25~*Mω/rsg0G*|W?/vb?Uci |?Jڟ3`eݍQ+heb c}oo vqFQ`\|5&}7N!UP]5Kw=<Z (Q@Q@Q@Q@Q@ X؎QHZE#PMMEPEPEPEW总NQEQEQEWX$WEPEP^6sx@I/tloMhUhgs(5ۯ:",%ܪą$m{>n|C}%# #6Q[8lp0zhUTƬPɾ&|p&jXg쫬17!GF5c|MV׃"a{8h j񗇶S=;2Gz߇ho ;"֭ntW΋Q?gxqӮ7V[G<{'0&p\ɏS@@]:[Iԭob`6ߨƴ+{k yCđ9FS>g[LgӢP-.c6;1u<{Ofe4ː PGEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPE6I(G8D^k⏈fmt3"\2*=߷i\aQ/ٛ +lMO Š(wS\4*IkH˓SPEPEPE^WA;~F,QEQEQEQUy%V#W銱@Q@W䴿AdQ@F>淦 am7" ,,wGO2_^k(|'^}WĎs Ug'!ǙK=Om斺ns#O/q/x5o k*U@8 {G?h (nxo68?JWvѯoΠ>f [hƼYNXU6,{<9 x0t}Z L vJTlǥt5_ְc/MX]nLlàuRa5J (a~:>^/h]{VWX#~S[~E(Š(B𷏮5X3 '&gCC=ad3F=UN`h 7MW}ԶP4.UHk |?:tcr~y$_-D/b0i2 6 ~͆GB87)u߭{O>&xSŁN#K[K@^_ 71jb) '4&u ;Ka֊_cፑwj{SGЊ~z-H>}>SE# @EaYl5`%kQH~Hے@Es~Wn=j:o1&N? ypE\( W5ҶC@dv$O=lW_ET%5Q-WEZj%{O? Կ罧MwWW׫<-,ఀAl"cOE)F*Š(QEQEQEQEQEKSjv̸ 'ge-x IĶz?ҼO7[ eX#A^~8G7` ?rl4 5{GMRNҵ.H d/g SZ"Zԥ]U'xTZz( ( ( ( ({kgc=q@@:=1@s3U 6tbVDlɂr%|pwO?=ԑ[>&${RvLt} JTpi"`ժq=/I!r?]Z>]e"z\X߭}E|җ+uE'sWq|z>\\{][3MNƟ;Vn2C&B:Tdqn=_^jߍvKsAH(~6qsh:+i׵|= >HrF؊r3\9>@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@ wHi$`3s^3_tm-|}G?ѐya#~<5۟kmRM.8EU%՟7e^V?xRontv;-5j">K11 (I,-(GpQEQEQEQEQEQE18JY,V0Q{TPEPEPEP[d!ԩ{ժ(((#,Eduj(((0gr)U֭QEQEQE|D~%s@j*:nr@ y}?h:X@b}@B ;I` zG2@hڞtֺU¡I }H ; i^̅~S| 渜c7$CKh2wVG.;A'<*{^i^Iwmt;[UL9(N Ð _j5-tdb1L3gB0 -=2;Xպ R xXE#[X"0袑ޒ[Q@› &' :bPdb(((nCSTPEPEPEP[Te貐LQEQEQEV4aNҊZ (2u ~%u.@´/9_גr.wR[)" G >ap>5xh\ۯY~1q$:_W|Di ujs%}v/+4o h ij [?mQIgkbfN+9>R:dQEQ@UFY)$uQ@Q@Q@Q@cFT(pzժ(jZ][Ol{>@1OB6}>)C/ ?J?|w[_[>h?_a@4nQԫ)`I^BxRm;qx i"rDs"LI$&| Wk?V- y!l1c7mִ6C2Ck<,G9'E|y{Ǘw]4PA,J0C:oG\_k\ IsP'$,9Wh EPEPEPEPEPEPEPxOmf/i%·xo| 2lN?[,xKEa ߋNev"8.dsWCn#o%/vY?:O<C^akik]˂V{r_3c}r=r[]DMnW@EPEPEPEPEP~!O%^-QC&*J=4?/ZZ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( kٽ4ddt*mkh KU?X((Cq=T( ( ( s3̤юTRmv?U((*ܰ0H>?u?[((?ý/7OmuiBsS.B8?/daE|?⥸m]H$̹@8퓏S^ᖗSmȚJg!rvNO$wP; šh3HeXHkkLRDя*(-[t5u >Ebй#'UgM&×GW<d NXFX7^ 2Ӌ;%AvH8%H=<^>t/c\bx.=9ObfׇHv7 %AϨ|—IjBVraf\ %QEQEQEQEQEQEQEQEQEQEQEQEQEQEQ\o.g^E4±dOB1UQ;Wv;*<IrO=?obd]y.Vϯf/KVv'#q{ &ҴgQ7K!z(OuдK]Lg!ɬ^?iِ+_L= )7sLxsQEX(((((((kf[JgR,K5xA QEQEQEAk9qjzǩQEQEdH}꥟[(((ܰaH?ZE!;պ(((((+񏃴h:4r@^7 A: (ٻđHΕ='2DT+ҽ/ 紐P֝0̱IpHg(((((((((((((((((((+ ŚoHKYX``O򠊕#NrP@56-xDn(EN.D^Ӳ^`D1a׉73՝mVYԥ}HxvQ+DTS}jGԝL"՚ ~2cSEѣ 0PQAQEQER9ڌރ4?m)9HKU?Y((D\b{iѿ[((('22G=T_w]tQEQET 9ka( jz?_@袊(*9[{ PȡԌA8IEps}sq,Gs2($WGXYqZAikvCb4\Np2I?X+^Z K{OX:W.Y>+<}+(տfBد G\F:v n}(k>"4>_"(x8YOt8fռ[{fR R:G*bxK K5'0[Ӛ5*" Aa[YdTǃlkxFڢ&-mܘb>*99l@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@ʊYU$x> jF_6w:g{=ҹɋSxȓhyYg9Xy+ͯtW^fY6 ,)}-y<¨+u+CImX-̮7`>a{sUD[&ῆ uqjB#ν H hRaQ?\p|ym?볈BU !PYAK= :Ӎ(M袊GxQExWcSM;=7tQEQETNet -~*zi EPEPEP 9k!(ljz'kjQEQEG<[oqsA*92<Gn%;yfE(ڻ(gd0F#E$G$yci@`9׵C-cѤ EPEPEPEPEPEPEP lIlYc\L0q9NN[%ņaq Gg |h((((((((((((((((((((((((~RXN2WLD2(vW,WGEh?A?wv^*c}oT3T!?pvzijyXL}mgKů;\hvw lIXijm̭Z|B\a`XI Os5\0o C iQTDP@|>,|T&e+N6w2׸ofS-ͫZ"z{5ZZkwsʥdE bZ– ?>mij'8FQ`}>]Q@!!A$$ZXB׉5fTSp y0`|1/MgML# Nю=s=뷯 iq|UC#3[V 2N>^<֤5R<7]U?"9o|hMnML5F"VXʌ:y$xWƸuRp`@e|-| ц摚fo-\eX5CcD|SfNcv Oɠg<;nxkKpZ9QزGMi~!O%^-QC&*J=4?/ZZ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( d$t*}d` R*PQEQEUM7=?m[UTU =-Q@Q@Q@,c[ IU''-QEQER ֭Płǩ&(((((((((((((((((((((+;] д90]@?ϭq\9~'̲ʴ|]ܯcOϵyU_6jZyV DZbZ[ۍNk˖/<͹ݫX]-..S>.LCC,L_6t:^oiڮآ\V=&QEAQQ[ (QEQEQEQEQEQEQEQEԿ?dT*-Q@Q@Q@4?ѿ[UTU =-QEQERuuU$I@ EPEPEPH)sZHC 7Z(((((((((((((((((((((((((+~)VMf 0Ok׵}I~Jyw=^ }q_yr癷1@{v9vMaz>A`G1e?jl!& *O\(((()M:20h ?fT*PQEQEUM;=7t ((( n*$(QEQEUH)qZHC 7Z( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( NQ N;vZUҔDٿ<.):0ĄUFI' Oy x&Iʧaӫ|d(PUgyo&֦k +~fyww~?L xbėZf;X3MzRj~Z6ƿ4ґk>K-t}>++8EX$& SUׯ~KvZV1#1I'TQP}X1JT_^/7jn=l)hqpF`#z?y5Ke`fϠ xz_x 1[[ne̞ZFr$3ޥWF/A'ɀ"yqzk4MLmgR>$hB(( ]%?\@Pc] Ϗ5|.WxD>#~.<˫gH\ OmoO.O|oǢ]zqX_ed:YztRĐ3Ad}*[t2sx*`H$O^h>_^ 1WO]gj\^m7v"]1zukt]54mO#9K;hSB_i]x Y%Kr$ =|ClJTz sU?h ~M=V((((((((((((((((((((*=-2oHD.v>DŽ @Q@Q@G <{8TSMO3@袊((9V.r֤_nBEPEPQ[˘( >\G(K#D^I'o"Spkf;cXhvv8IFMiEAa$QEN'*ș#44Y(((8fYвgTSNwQEQEs,"riԕR>.n(((ei?IU"[((((((((((((((>):"4) [BB̡s3*;zE{ﶲH<2x:* :1_I"$¯}@{7tu$P Z|]w.Їw7S ޽ ƕ{j#il%ݺd9 ,{{PQEQEsGt-Zalsq!6p v(O¯ j/}i<Fj 3'7:U7MÙ$v_ 먠(C&*J=4?/ZGȇM?T{{h_QEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQERC$($DEaT` u5d@rduQEQEHj.$MDw#hQEQEQE1"H˕\;"9` SiQEQESH4~v}4H#F\=3@((((((((((((((((((((zO}rq+;=NGTԧ)[2exoI]blQ;/?j_w ;B׳ӓyy>ɼMM߫ ((((((((((( = *JHR#T@(((đ.\ }69U܌3N(($eʮ RDrX hQEQEQE0D+H`>Ddh #ҝ@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@R3*)f`$dx^4oOu5qx9i'|Գ[1xZg@}Ot_ 5MtR:v:|Uؚ1J?MCÉcp yz_(ZTJ QAQEQEQEQEQER 4$XTAQ)uʑiQEQES#"]'MDw#3((bD VDrX iQEQESH~v}4HF0ޠ=(QEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQHHPI &)ڥ}t؎1ucs^ :ާ5|~U{(S-ܑ?wկWbB<۷ Gw֊k]PI`]b?W(ZSECw> (7 (kj008'T :(((GDQp '4jH)d`@$~4(()Fʸ.rMYٕX hQEQEQE0DV/}" a"@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@mOT>=+)mb<:lr0IbV˫I*yhm }?E|.ƈlo,pwl{v^IVV\N ggSQ@Q@Q@Q@Q@Q@9GȇM?T{{h_GM*$hh((((((((((((((((((()􌡔F( V)Fđv> ( ( ǧ u0L$@QEQEQERmv?U(V&9ԔQEQEUH'uZQ*>PQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQH̨d e 升o~P2O3Qܓ[/##y+ers#Fo쏖)f8N?  G2??+J*#dQEQ@Q@Q@Q@Q@Q@Q@Q@Q@Q@ KjVRƹڣ4( ( (*i:Q ''z ( ( gAV8XFRs#n9 (((.OV5Vwӊ ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ~$vcG|Opcֻ cTFҧ?$K困S^_Oܶ}t<|(R<=MŐ Ԋ[hlb@ġG`+7?a$۠\A溚M+^4)V (Q@Q@Q@Q@Q@Q@6_OR0 OB1@4bXaX;T`f@Q@Q@Tӿٿ:Q O>%Q@Q@Q@,_*G+˜ێ}jJ((*_q?[Ya>PQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQKsپ'sp??]O5|=y&O gN^<+4IY<\a=恢ϯX?4S{׼X0ڠHb]?_m|=*χ=?kͲKQEP((lj ?AVܤbX!X;T`fEPEPEPM;=?u0U3Ź(((w]?upO#.s#n9 ((('kjFw0qRPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEP~!O%^-QC&*J=4?/ZZ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( :QLD@0A)jxAQEQER 2KU44n((( pAjۿtQEQERn)j?u?[(((((((((((((((((((#??@>:}>v7wPZMup! z^kzFW:ʜQcG;?@u{u?+mⴵ Jv~:b?vt6< h(GQEQEQEQEQEQEQEQEQEQEQE) {l_PDŽ EPEPEP 2#ږi:@Q@Q@ `s88KU,]_(Q@Q@Q@ FFGQKU"jQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQ\@4 6իPs#xKTeю'˧Ly][ K2?N}B+X8U׿hL:l}=OVGiKul ((((((((l@ ` Rm?A*QEQE w{7to@袊((@}j[((p$E!K( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( FeD.TdpO>h4kWӮg ҹ'='R]/^#o,HwoX᷆~?~#e#7v;{+6eBW׽Cek%;Mhx9fXWE'҅Q@Q@Q@ ! qI'O|( ( (0aARM;=?tQEQER8KU,A@袊((Mq\ԵR/ O\պ(((((((((((((((((((((?D=7i߳C_%?zoEIWg&K@EPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPHsR@EϭIEQEQETV}//vI1楢 ( ( ("%mwN-PEPEPQ$.evw1h((((((((((((((((((yg$ +sY~.lu;I4,#e,z V>)$p/A sԵD %}6ʱ<{^)6sب迉ǿRK3cTL˪ح$3A{ԚTqRzFGr0j*,e{op2)[>2RW (Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@˹}F)E@g;F3RQ@Q@Q@Q@[Axnch ( ( :}>yˮ6d9 |UEu>s7JEᗇ# 6ct^Q[[im("(Jw=&8zJQH ( ( ( ( ( ( ( F]Wb/""Z(((cnҥ((*%mԓn1-QEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQECZՠ4c_s˷`> }Jkˆ/4Y]W?jjKF w?O֝ÿzn6 8y;ïVW>_VXJMdlQMtQP}%QN (4 ( ( (#bonnݴc8RQ@Q@Q@Q@[xnݖ-z(((ʒgݟ1c8h((( RM\c*Z((((((((((((((((((((((C&*J=4?/ZGȇM?T{{h_QEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEɿd]Ѳ@ؒl`$bmLA**Z((*I$[-!kx61's@EQEQER̓-I8!V xZ'IcSEPEPU!'Jd*qպ8Y/&€;@EQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEGS5RBgDm #+ɼ{oiڔzvf5Ω\͂&ByW7_^Kq3'1bjxJqK5<%(MHͽrFp㏥z Z ^6/VL`~T6ia IUm>_I$mf I#ӒkN*Of,UQEQEQEQEQEQEQEQEQEQEQEQE2_O騬 6rv tlS-0[GJ -Q@Q@Q@4M$u-%wǹ((dOAV xZ)'f pҀ'(((Di lN?:P$,HTQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQETW71Ys;$.{2jZZ,I.1=isXzNKky/TtzÝ3GН1sx_ʼH;j WtRF=A` }U 8v.LJQe~oQEIEPEPEPEPEPEPEPEPMSiwl 6rvQZ`& \*Z((*Ilxέb ,[s@EQEQER̓=I_*A- pҧ((DOuBy,čOEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEP\׍Cp~"u=VG7a.1~^,כ SM#'yf]6i*sWT.oab\,~x{ʁ[{>r|'e/!ETQEQEQEQE?շy&NNڰr0bh-c%F 5Q@Q@Q@4Mdun$7槠((Zn.OAV!hH>=Q@Q@Q@#'Nq-x@I1#k(w⧠(((((((((((((((((((((C&*J=4?/ZGȇM?T{{h_QEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQL hTng 1%ISEPEPEZFscOր,EQEQEQU$g3R{ @Q@Q@Uhc\!bUUHhQ@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@U kTFo&UN(&RPGN~} ܎Y/Mt^LџGr5ܓJLf&š(t {B̘p? >g:kH(Õlr)QP}@QEQEQEQEQEQEQEQEQEQEQEQEQEQM)ܒA$QEQEQEUk KrŎ?Z@Q@Q@UkY ą=Y(((E#Bt,vӭY((((((((((((((((((((( o˶k8]XNׂ4K#՝עOwI¿xB4[\K.z+>_3qj=֟נ ˦d}J`T`|7]+eԿ4xC:6wZkEnhGEW@)_*VN}y5EIҥ Q傲 (@(((((((l؎uPX$ ( ( (24坋2~f(((k#WMOEqFt{iRPD&8ʃRxcXZTax*yVGb=#){tqpApB"B"+|oiE1>TKF:7 (P((((pj'i,w$\hQ@Q@Q@ZF.ŏ'5f ( ( (ֲ3r & 4QEQEQEUhc̅Њ@Vh(((((((((((((((((((((?h ~M!O%^-zQ@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@6@Z'QԩECiEin0ʠSQEQEQE^'c6=}MX ( ( (+DpX`<QEQEQE^8o@9X ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( } MGGյ(*o a knfbLj:STc:z/%La_G++:(м=olˋl߀+rw;27$z)EPEPEPEPEPEPEPEPEPEPEPEPEPd`:EGiEin0ʠSQ@Q@Q@Q@x`*{QEQEQE^'[an^zU((((q:M)#*s隱EQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEU=WQI/lx2cijsi\Vק^ͨ_Mw;ng.׶x3BQH=}s^oC*fzWӓy9.'e+&R{|-$!;zu?*E'm-XQEQEQEQEQEQEQEQEQE`:E:6(apEOEQEQEU{( ǯbjQEQEQE^'[an^zU(((ґ2>b(((((((((((((((((((((((((((ȫ}'>ހ &[r;kQ%&j?QE#(((((kQEEgEgn0ʸ" ( ( (+DQ@Q@Q@W`;y1V(((( 2(=X(((((((((((((((((((((?D=7i߳C_%?zoEIWg&K@EPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPM:HS% k#KkA55AdP =QEQE^W{NV;]N8#ހ-QEQEQE^WKa$>V%,`U((*r^#j*Պ0. Upq@((((((((((((((((çXOy9Pv;}hi+~({FLM>=O?O'RyW6xзϟ¹BmKQY{gtiNREs?POA ~9z#㱮/袊B((((((((((((((JuF)2jI18JY,V0Q{PQEQEQEW总NV-u*wj ( ( m+%±I6b#,Eduj((( }4DGV*HQʐTZ@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@]F'KB~'}kt9v>נ|P7 p|zEaC M*z9IbQç3 닙{?oEAtƜ# (Š(((((((((lGP Sdu$i".MMUU`UڬPEPEPUy,jUFKrJpGZ((($ aj1V*2tYH &FGQV((}4DGV*hQʝZEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEP9!TV4֑Hy&qCPث%*UjEPEPEP{9^hYCV `TpGZ((MpFLUjRIHZ(((J},DGV*hQʝZ@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@9GȇM?T{{h_GM*$hh((((((((((((((((((((6o@M:S5re((* Y;wq@EQEQEQPA9Rh~*z(((I ((((((((((((((((⎵[[7/fAGyz GoJcK _>뚤γu&GU?£*#8*>o/˩kp{K83^\/ës"[=BkٮU8t(zAEPEPEPEPEPEPEPEPEPEPEPEPEPEPE5j3z -3G)\PQEQEQETKGƧ((*'22F;@EQEQEQP$AQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEUmF3N(Pf⎷84h[G?lf!aʧyڍ3oǵ{_OO}6zz`}s^e]gqykoKt~'Cpb'~((((((((((()FoAZ*+iL@p*Z(((D\b{((( ̲LO@Q@Q@T 9ka( hz( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( )B}j;iL@p(Z( ( ( * Y3Ƨ((*'2:G=Q@Q@Q@NZHp0?Z ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (jQEQEQESNwPEPEPU-?AV((( R֭EQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEx"a4RUI?D=7i߳C_%U((((((((((((((((((((v،ރ4ɿITJ&%qRU{V(((yH}*Zǧ tQEQEQEE fB߭KU,c[((IӔ5-TBw_ tQEQEQEQEQEQEQEQEQEQEQEQEQEQEQExƿj:,V*>>RyZk|wqό& V2GSGb'F۷u]R<3;dЖYZCko>uW9ozέEPEPQC8PymRK? EPEPEPK8k!r楪Rn ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ÿv%䃋S9|1~[?x(>((((((((((()Rރ4?xP0g%VEPEPQ[.#.1\} KU4o΀-EQEQES^U G~-T_w]tQEQETK8k!r楪Rn(((((((((((((((((((((((((((((((((cIA( :Oo5 ?ݠ 4QEQEQEEo8R0#RM;=?tQEQETQN%T G~TR>.n(((p/ӔPԵR/ O\պ(((((((((((((((((((((?D=7i߳C_%?zoEIWg&K@EPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPA=(f @3@U :KLE%sFiQEQER* *be=d}J( ( (*%T s, \iϭI@Q@Q@ U X( zrij5ZggrO@QEQEQEQEQEQEQEQEQEQEQEQEQEQEV?#6w\ǷZܢ*C&~$֗q `ك?j0IJ3n-]ֺ烴E j9#mQAۙlQEQ@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@ KjV = *@(((7tHj.I> ( ( gAVF\{}Q@Q@Q@"j0D+H`>EPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPX[kfੴٝ݃mQA (Š((((((((((((/tөz>Y *N((iѿ[GDQp2N=>((( n$l쫂-iQEQEUH)qZL"O(QEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQE6Oo5 ?ݫ$= 68(aT` uQ@Q@Q@4έ#"R}QEQER>.n$l쫂-hQEQEQETB5n"A+H`>(((((((((((((((((((((?D=7i߳C_%?zoEIWg&K@EPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPHHPI94ɿIT"C# ӪxAQEQESc%]quT( ( (# 8>ƝU,c[(($F . UH'uZEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEP$"C# K5 xA 4QEQEQE69U܌3NozέEPEPMI`J7UK? EPEPEPDdh #ҝU"jQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQE$SeTD*FAUm?A*QEQEIWr0#8:iѿ[((("9` S4gAV((цG:E!K( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (@ t9S4If((("FGNw{tV((ʬ S4g EPEPEPDd1duTB5n ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (FCT‹!ȿ_EQ /"(oQ~?D?G(" hEd_U@2/*>FCT‹!ȿ_EWRҼB *Ja}_$)ۘ699 /"CU7(" _EW4P@2/*Q~?D?_\@#‹!ȿ?Ed_U}sE| /"CU7(" _EW4P@2/*/\eż[p *@8?tW,5Pl__iiVڝ1"su*(" '?Rc8>dWW@#‹!ȿ?Ed_U}sE| /"CU7(" _EW4P@2/*Q~?D?_\@#‹!ȿ?Ed_U}sE| /"'_ YM%M_O EuBqM}^cYܕRBXnVS]Iq 2yN:& Gb+w_EWڳ;Mq״P@2/*Q~?D?_\@#‹!ȿ?Ed_U}sE| /"CU7(" _EW4P@2/*Q~?D?_\@#‹!ȿৎ-fJbG?k@*g樈%; |S .Mѭ{QTA_EV~#0RB}K@#‹!ȿ?Ed_U}sE| /"CU7(" _EW4P@2/*Q~?D?_\@#‹!ȿ?Ed_U}sE| /"CUԭJ|=,*5!r-|0n:‹!ȿ~%66@82U| /"CU7(" _EW4P@2/*Q~?D?_\@#‹!ȿ?Ed_U}sE| /"CU7(" _EW4P@2/*σ|C^Wϙ^ Uҽ.+gDNF_`0S?R<|WJZePI1w>5?j,nEA2y$ Ed_UY~)䶘>\s€>FCT‹!ȿ_EQ /"(oQ~?D?G(" hEd_U@2/*>FCT‹!ȿ_EQ /"(=KЯ!TU 8+CT1H~= Fڅ'"FCT‹!ȿ_EQ /"(oQ~?D?G(" hEd_U@2/*>FCT‹!ȿ> |=:[ʳDU|@?tu'5&S"9IS["YXj}i`l_ UᗇC)Hp}">rCT‹!ȿ_EQ /"(oQ~?D?G(" hEd_U@2/*>FCT‹!ȿ_EQ /"(|/gt5}>8m nrNU/ľ2DK`ˑtL631}Y]RBBNAVڬ<#S߀88P‹!ȿ?Ed_U}sE| /"CU7(" _EW4P@2/*Q~?D?_\@#‹!ȿ?Ed_U}sE| /"CU?Kq6s?\/xT:nn̥EO ;c\VHYP³|I$.)'>d Q~?D?G(" hEd_U@2/*>FCT‹!ȿ_EQ /"(oQ~?D?G(" hEd_U@2/*>FCU\R!ЪB[<@vqԎk'_OhvM밐"P?Ed_U@2/*>FCT‹!ȿ_EQ /"(oQ~?D?G(" hEd_U@2/*>FCT‹!ȿ_EQ /"( x7> UDAjp7dp?^E|WO+*"&ԃ-|~)K YYdH4ർ W?Z+|ˎ@‹!ȿ?Ed_U}sE| /"CU7(" _EW4P@2/*Q~?D?_\@#‹!ȿ?Ed_U}sE| /"CU7(" 3TM PE`}_$GC6羶1njP?Ed_U@2/*>FCT‹!ȿ_EQ /"(oQ~?D?G(" hEd_U@2/*>FCT‹!ȿ_EW3k -r-Y *@~8+V;L3{g)@ƚmiIirss>*(" +'R$W]@#‹!ȿ?Ed_U}sE| /"CU7(" _EW4P@2/*Q~?D?_\@#‹!ȿ?Ed_U}sE| /"+_ Ym!M_ODeFuIkO xI7h? ='',($ZtL63DvQ~?D?^6 kT7 3{]| /"CU7(" _EW4P@2/*Q~?D?_\@#‹!ȿ?Ed_U}sE| /"CU7(" > x[tq!w?kURUC5ԝ>$߆5_ٺ5uv4(NXW_ /"GzVoNBRH>dE| /"CU7(" _EW4P@2/*Q~?D?_\@#‹!ȿ?Ed_U}sE| /"CU7(" _EW4Pw^ԬH|?<*[cpGHn:v@2/*X66!qˡ| /"CU7(" _EW4P@2/*Q~?D?_\@#‹!ȿ?Ed_U}sE| /"CU7(" _EW4P@2/*ǃ(4vp"VGBь3-vA18>/ZL 5̨'@](" FA>>G?oQ~?D?G(" hEd_U@2/*>FCT‹!ȿ_EQ /"(oQ~?D?G(" hEd_U@2/*>|?h Cc#u`t"?Q~?D?OmymcoQ~?D?G(" hEd_U@2/*>FCT‹!ȿ_EQ /"(oQ~?D?G(" hEd_U@2/*>!WuKmhr *B?tu|!񞻤j~)'71#["Vwibgg)^Y>x2~I">uCT‹!ȿ_EQ /"(oQ~?D?G(" hEd_U@2/*>FCT‹!ȿ_EQ /"(/-o5][O8Un#r 'Ux{."r F;㺳|) !fv`olV֜oؐ?P‹!ȿ?Ed_U}sE| /"CU7(" _EW4P@2/*Q~?D?_\@#‹!ȿ?Ed_U}sE| /"CU|yoo$1R~'߆u_jٚ< =זliь欬5(,o u'igfHRBX*((" _EW4P@2/*Q~?D?_\@#‹!ȿ?Ed_U}sE| /"CU7(" _EW4P@2/*Q~?D?_\@#‹!ȿ/ ƍr^|u`!q^j+hڋDXo-YvsP`̸8S(:)I $mё sjK36֑6j }bNs7Z^4{ \c:&lr,$rN(((+Oiw\2Ab1nsFOm#l@jiz)Z_GoDd ޠ|s#VY۝:hPX#_UPxtxG5+ mlg? XBy+duH0Y$u|Me)4Wy#0dtH[K *@W|, |5HzB;Ssq۟G(((+>6T,tBԵy y: aObŀ` zt-GC}խpEqo*x@Ѓᱧ_j7Z#(z5{_o@/o.6!W,R=OӬ4ӬശL(^%ng(gxĚO4  .@䓃W> ;H.#qjYB!s@ZHt})h(((%xOU nXm 1>8/-m770C+R$sF$ѹ 5~ ;mxR/o$ HgM3QuV{I?w89VF0}=E4y.n,4+'HaX9֏?Xu14'Oͅy߂<Zo,jC^ @\JCI#p'~ Yդ}MBpG FZ(((({ؠs2A@X,2K[\E27 _>xS5}G&.|8ѐ@J'=E[¨7|YicywnBdeNA@==%u՟LmIWjݘ1N*ͽ~eB(qZg$ #f%40=q^g_R d' P9Y"dF2I'8wQ|1,ѷ( ( ( ( ( ( : +ek?(IM.k{0p(^]tm2;Ɏn$D^O>^7ҬqKR֭}8øpcA7^2j: 屃 9v' ހ=(((((0l'b7\WO uC^ !a.{u973{j5˭{Ȧl v{qEOYɨB1D͌=G t#ƢF}O(eh'h8xG sjK36֑6j }@>h"C"Itd`AE>vNs7Z^4{ \c:9XD9GP}AQEQEQEQETS\nѬH;zOiw\2Ab1|s#VY۝:hPX#@Njz6BuH.aYSBCR@(A: Z5_τ/'Q#Hgohk}iz]A8_H\W~x+: M>t--xH`:^yoxOH@j}pN};rQEQEQEQEZ]Ba זz#ʡMy%hR:!O63D )Xᱧ_j7Z#(z4W6ֲ[]A׊T =<QmfzuɝAE= _iKFʖRl^/i>[Sn6H$HUN@70ZDe8cp5-|C㴂;)7̖,2>((((n.5Pdpu|BCx?\F VdbI9+</xz Ʋڙ8$xxđH#td9V:&Kqqa9I'8A; hXjQEQEQEQEQEQEMdi>PҭĽKTA#󟘯'ZjxK{=?lt=\1 yljt=0xcRԬuo;0;>4W׌34Zέ!l`vD((((+] c7(1G3лvOz>~v\uUCnuHu99oS"f#"6j/@$]NK) 18.znw}";/3" {mc2\MQ⑂ D%T3ё}^ݭsQ6H*@rIg ;H.#qjYB!s@ZHt})h(((>!xGXU#P+t21 ]Z(kSAK"dFr^xF^3/5d5n'PVo4[!uj3h0J`#XF5͆gg-^a| 𿇵-^W{IDFP`O(((*络G>'e̒ȑ-ԵS(cp~U!$WƷP4/V) ??ƚܰM#%>@88v9}"7!Ɵ^m3u6<>H' d99{m}l้fU F,QEQEQEQEQEQEQd^-CYBOiwgX펟Ƿـ!B?@e,|=uu[i{77" y<ֽxާJ dž5-JZ]s1C]x3El k؜0>OzJ( ( ( ( ( 0}|hۿ7m\W7oPcdPQEQEQEQE0[l-< z__YDIXvQN&p5x:ZK_4;J3ӌ>}3Z`4[Q\²ޠ֘5yQGy~z.qgVyF>SRԮ5gMPXqs@Zjŭ]qLkO_ ͨb<qע|$̷PDrIEݱO_1'j( ( ( ( .eo0kx=P&ouML4)ZKWâ,X m?yӀկFEo=vk{i-x%]\6I[M:I+POS^#{_o@/o.6!W,R潋^$|)ݭmIv $ʀ4n.`sCXPAkOŬisʱCY#*$I>4?&[ծ8y6V*8d'9S޻ W=jڻZJ%e2P#z}Q@Q@Q@Q@6Ic3$f8T&f=5φ{~"PAe g9͌ږ`:6?*&ͫGɦYڗMT{63^)㏄px+E> 4$\L@w /mqpD%p=7> Xˉ:nӢ)C"I^-ϋZֻxGUԮ,X/=\t/D՛hu4$gqu̟3. 6_%O]Qm]qu>=4~m_r\!b2 13&|]GNlɉk)S"LӮ~6qbxŴ.}1hUBU(v|0gOzӛPPHR W[@Q@Q@Q@b~G{awXGxͺ˒ܒ(~+Ɵ&{xWş-~R+h)f ($*_EEш20N =i~٧ZG\v{, .rQv6?G((((rh#ʗ@p}FjZ7t hS]\^ZF=GrXu?@ҧ;w;O@Z/_GuۛwJ%-UE ܏ZMѼIXMc]i4 A!=gf8ϸ46HӠh ]Q{ ~ ΓK{]f][8XRX :W~ZxÖ *qUQxp{x_-  JZEK@Q@Q@Q@2Xb2ƒ!ꮠ}EssW20BI$sU$@ [U+_ƏZ~} Lb`| >rz,k!ƭn_c}!`.VNOGOTtv4̓7N8ߏMv~+Y77q e82\΃ᯋڇ4 ;{d̂ 0τb A=OA^h]dfX}:c%d#zH6XNʖסUrd+t jsLa~Uh((( A4PplCJ͹(\^;^3ƢUaG g?/|HXWQTwczt_ Yx"}v}Nt܄ULnۥggۯ [~J9 07OK62OytpKqW^iS^L[BMy5x!=s$!R29@ ߴ7,"IMB{Sjޙ$ϥw_ eixyE_+ʾ%x+~\[؉.5=V8ZJʬ$l`(3d+< ɣBJ BE?Aa@Q@Q@Q@Q@Q@Q@|BGa֝m_&yy%BOs_AןB?MY?v\BA}ļArzP_kwy]J8m!Bŋ?^.4v fOC([|p5 VQU@, z jzqu̟3. 6ג>pWׅ|>pP'W5%ѾYNS.rsp5QEQEQEQENTr9RUu?@ҧ;w;O@ZoЧYx z* M7F'a5u|)ќy {>@ A׏nm *ȔV&۵܀Kr=kټA'6͠qp3°Q៴?_+^t}(h(((dG25t=UAV+xBQFMO<1ww8 d{ Wk)-no C}8`W_VNߎoIo&`oeO ;Ew? fϞ Cr~N: Ui>їO"6{Xz?p#r1o8>ŽCzlV: VفYuV 'AW|/^>#\œ3AoqݴW0xA"0TW :-0u&iBf'<{Q@Q@Q@Q@@ 2PilCJ͹(\^;RW|Bkg>uqu=O@Gv%leh$+mM]1*$p <*cji;yk^/Ι]4?ZGUBjc# (TqO+%½kfdWeOt-vQEQEQEV.=wzńwa۬( m+Ѿڢ<'⺪|i k`}WW|Y/m"ր"bI ¨4^x4]#(c܆^o[mឱqxŬdu̇iǸR ,)k98Ojz( ( ( ( [h'*f9 tfxM>UcTw'PgY *}OSK{Hs~u}W^=x4"R[n_r,}tğu5֓MFqc/\==Ml: ?OQz >)mռ.:1xo9om pҪGUWWׅ|M{_>QEQEQES$92 >4[A$ȱwsI' [U"5T+|bx[ɤ9{S0Vu7|!^_0+/w{'VO\o˧e =ÏLެ}=A+\[ >iဤ1*wϽrŽCzlV: VفYuV 'A^h Gſ$ VWv\áR2@-*ǍaIm(@ ^/!V^𝥦(P{ фǃc}(((Ad@o q+6r}xxƯW:VTK,dā@z&jwO#kbF1\]E,OuSݏ |7]e ۭ8>ur=U3պnx"Kn1m{A+{gא~߁>&ӵ/h|-as-H* 9mqob$[k +*\qxd6&M e+46Q  MtQEQEQEQEQEQE5 !ZuTi|8Q渕 >ϭ}^ 5fr H989@~u+ᴅ ,>n8 O`:ׄ]x."Y=]nº-5[F PdXnV1Pk#$m0 wAb;O΀=Ɗ((((( A i|DtRh(6œ_ xIu 넟:ZNχuQcq| mn2`}3®jڝjwŵM, IVSHhX2}?|_;ZfB9bGɯ8`(T,HPyǝ3Niw}uk&3:(>Iյ^53MJ+:;Z( ( ( (1 h%XL JI@͌WhD7Ud 0^^JWu~'mocCHB=z259{hxTA`_1_AW|ЗIq &'{$s>\(((()m(rQ:~Ow)oiwoܞ_%|%OyvpyiUnO:kIR 81.}|>?ūۼU)jMj/>z׳x:Om-uAuobf!K`3 xW46HӠh ]Q{Tߴu彴1sJjTm^^t}+?io&V~PEQEQEQE"d),jz BVUHxU &+h$y8cRp@$׼SZODqy|i[+xT ;&M&(ʞ@w'Њ7~Ka7<02QNt  |.El4?y3zM4kGp#bߒp}(<3Ήzجu[/A8A=pO~_71X|!RFe[{ 9c9P!|)H0޹:lGíU+*#~((((((((((((((((*ÝnŶ4eV` fېO+x A돩iohtmZ/Cӥn%2'qAxm1<%{xrF1D yJ1?[tQ@Q@Q@Q@Q@Q@]?Z??8F} ,-$l2;p* B{;[{)cn0Gjz(m< ᶣwD֚rť*{ Qqar:Sڭ<Ӵg,mO|`8X{ 6[D[qT ?SQEQEQEQEQEyw xWuk-6XZ༡X9zPb? *ΗyDlB0WiIT +B((((+>18I[vaY'LN㏠P?Z:(ov[[jtPD## [^__-%D(Y1j(/mk~K#( Z((((/^|&?87^d3B-W{E|;Gt4k:EORK!$Oig|}͏m(W ׅ?1\!UɊP1w$~z]Ư X&cgjp. eRcA pqӥ{u>cE񏍯0‡) 2N^OOV(((+7+B=`Ԟػm `u+Jß ~,JDO,eԑϧ^=+A׸Q@džn?5xX H+4NkqugahHd+U(O ` qWQ@7|8O|Uk/6] o[sIl`WQEQEQEQEQEQEQE^=sxƞ Z42,r %~R=}V-KK{Cjz/q, ;ܟCz/a[hx&(/#}\>n(((((+˼']kG]oae%Gnר@^ZAYOguoqE,mѕx>"|6nU._x`ObA*323GJ*(ڭ<Ӵg,mO|`8X{U6[D[qT ?SQ@Q@Q@Q@Q@yw xWuk-6XZ༡X9zWb? *ΗyDlB0WQ@tqKX8@Ҵ( ( ( ( ( |5+m>kV`qRG>xhAפkN<We`Ptz(tNkqugahHd+U(O ` qU+NJ|[_|Ek}2܆@sdKc⽒(((((((9<[oO]oFNl )Fա=:_X"w+?A(^w-m<@~s շEQEQEQEQEQEu?niQ:P_$&2M[kHfC! <RҮ[qp g%FGM=^PK-y`ŏqY3^EWl-lXmXz**PEPEPEPEPx׈~%xW\e YWEy/ k~3𽞙,x'K&#vtqKX8@Ҵ(((((s<_^4m.p8c<.FgmEH8;``fuP-Co.ɲbH.bH#zW:wXZŌ#eʹ;zqq^Ey/~2/_Gy)3;<((((|B#Ѷ ImЮFϷ_´9τ..4Ii@Z)Y9]IuҺ-{xkN<We`PtMV~֏4HuR & {zWÏV"soِe 88 {%PEPEPEPEPEPEP^U߇:Njmi˸C)́ 2W @hԴ~7:6] #\zE6v81xkllm {8kx(^` EQEQEQEQE x~4km:Uk$HEn~Q >/x[YҴUbK(M`W+]}-_ i\DqC&ӑPsZQ@Q@Q@Q@Q@9/Ư`J۶kB8Bebw}u+kmSN$qvU@y}+(%՗XGbi.%IDX2ɎP׭QEyk^7tdYO6@^PEPEPEPEPWC<G-.L@@>y`Ӵ[:9} bX% '{_BQ@6?ŷGWFs$1NG$A=+fu {/I H+D:guPXx3O[<-cFȖN '͌ ݏßĶkd;e'9@Xcj((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((('\Oi^HfKbRHث)ȠT5=\mB0fzdWt4Q_=Sw_+ɦ}滵'|ϟq3Ԏ |xoO!կoiӘy#S ޭz Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@qxO+;שЅyƉ_ .u'?qqoNǏ.<w=9 $0̐FNOvuOx׉t]]'HGlbH[8pr==_‹oZsү-m߀㯧V?KaZ:sB~h}opǽlPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEP\wo%!S k'")f6 Ƞ147'c8Rb2Ȅ@~1𥗌5uހt2&q ˿f%Eׄ;+ĤHeG&"OQPQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQLhy"5,;U$ZVuO3?P,sg8?\((((((((((((((((siwbUpI4~kEI#"pI5RY7t+;A[yBP( ( ( )0U$RִNVSFX'YҀ/QEQEQEa3ƕtַ -ᢒ/g# *j֢N'[yVEϦAjQEQEQEUKWNBIev:$f{yc6 =A((((((((((((((( d ei: RU] I.@ZQ"Yom#fگ<''kwm}l6\@,.[pyPQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEUkJ$X;;GqVu5udEt`*rU ]sH6b9QEQEQEQEQEQEQEQEQEQEQEQT-"j3]A;g*QEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQER3*. Rih{G} h^ECSxCV]A"tbʢ A'8NaHKT5`0G%[ӊ7>!h$##~d#\?:/ ;Ko;>ϻg9'LĽOJiV"e/.͸^{-Wu5dD߁Qր=|qLJoOZ8 mK׶x[:_48m&b9ñDq@TQEQEQEPN:o_΋Ro_γQt9kHX,}qVuj”EFV VR=3= זY_gGz y6O-^kw ݬW8"##rcO:X_b[?̞Mѽ?:n; ES((];9)[x` 5Yf,Lnlݨ>=^ ~gh%g4Q hoiڈ6$X~}h_|'~&G+ZVYX?Ɍ޵Fgi01$n;;ЎWᏈnOٚe~qހ=7Ŀ*7kfuOĿ*7kfuO>KF&X`S?QiNhж&+!$q>l=~zQ@kwkWU2ǩcTw'Ҽ*uI%x* Bӟ{ޭ kA5#^Qk{J}E<в$@ޏ?q6ׇZ^:&qjW oinIs^~֩5:'^v4Ҹm}E|_h7Q|*硷B;y U~f-5M"bHa~ñjsᾧ{a+Ev E8)$zq^s_jZ[X 0$>֧SWϤA~*Tr?)Y~!:~?=3 a@D'v -,neu X𮆰5Ow1~zPQEQEQEQHX&Vf{-qqm(In8x>ƸJuIG :捎Jte$Ik?un5 2Io& $ {}M:Iҏ3hTqK)SwJI`;(((i4(a?5oMC:Hu\h(ŝ[^#l,,#N>]q*Nͧq>;gMRvƆ+@d1#hǰ{PQ_9s{#i=?A]~=GG,aa76|sY[%rx'ۭ{<^'QՔ^7W< ⻭OU[ۋÂ)eD:^Eޭ\w}QY5x7,h/CD]3k ?Jit O_Ht/x҉((/E pFp/Xq?='o0ԼIp%q&>qïuQEW!ψ?lc|YFr} ko=qm±KjXpGe ~>7ŸU]3bina vU$P?"eoʴ$~\bPO_?wINUa?(+%Cּ;}n *cI89.㷌7þEPI%2ր>cOIu4M~ KoqnH߲bH'I 䪓@ß1S +ohm7oBq$I njZOQy_wPдW|?g}J-\M7QC"11Jc8Q^A㟎4;;˖V}#1ːx8ROu]W1o@EQ^'oZ->+)Gջ/yVQ3Q^[V4 o-R>%Pb1OH|dE|+0i^]\ѕ|H=߃ }1HĠ.HqeӼmvUb | =N۹/㏋Dϫ`ՠ#Pd߼J#%mIut{zU|-l4/ iZ5J}Y0TtG PEPEPEPE7͏ǓG☴#$`uky}:.nZ6Ᏹsω((w4S|l_Αt:oҁQ@Q@Q@+׬ +ݐw2`8Slm`K$f'|]żq5J&v9K/MG .gkll5Ao9>W|V\fvAFwbM#RJ˫:1v"`k#Q_7EyR[ˏbďҽ¾(Ӽa51.U7Uހ< {zޟyb[\Js0ֽWL{=&B BqWWYKs+5샸 ^ܵit$`*|_KL]:[/%.}#iѧu[ #՜U :+[=$>HLyq 92k(Gh3` /#?z ٢x~7$[‹$qԦ֟|M m ,jzKy@}hZ+?CѼΤ%Ĺs$ ;(t{#wInv\YH {khb${nI?ϱ|Ԭ`'*SЊ|[<=Ri-s)`g8۵zs9'[5ǹ\Ux>ү-i4I$*| ǚc\\Cqk.7OO8]a=dW8 WjvHG_q6_uHmzP-N{~Ǘ::e!"(((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((>$Z㯐k;[g):FAD<3BQ47"wH(߉5-Z]k1Z*\1 G NMO}KYm0x~=P)a!~MĀH=zZj{HGD0FO8u8TZ{N!_l!tO xn7WOJrYF>(b(((Qmoɨ3I`3>> Ԛ+dc5W?$m=S!ԐA p[đCHPt/u-Uit. yc}x/u qu h=H;OKQ.$/}?~kKw&R_(GMo.k7J~ 8;=Hn|Aq$3Z?&w|d^g?*~(gMYw9nÎw#HXED@UF9߈?N|I`ˏkf_kW|AsO\^G2nZ"?_\8~> \G͆=q^uL׆ܹq׷Zx%\BAKYqPP_xA5 FLmЃ_=n/׾vF4Y9U}5_+3omh~{qq@(((o?n"UVα;^&gKQN2.-PW<H` y`J!RW/A#?*+8I*k_;-B@y?aO^߃9 +ԓM-Kc!Nα;^SsiK#+O((+忉pP͗J[B11 #%}I^gI]|C  P@g&B_+8?`eT^<6)^ggK?e|3;š +ccܚD ՞ec6ҹ+k~:&?5h;z+o,h`UμXߴkg?'WE^qsK?U?o /xK{ >8 {ޙ|s|Zi!H;c}~'}7Z>Goi(߽|_)E{`&H2]{(.VxD ʰz g>O:ŤjZxoiqaxZ#`!q@G;Hnu_?&[Dž?Zj~wsuc1o( dw ??A>3?/Z۟B?g&gK@_|B+}e,.K\H !0S]7<3g ȌyҨǛ&>g?S >'x=m]=N/6KPLy măנqZWxO~"{uQ"˽ġO $l@}kRgQӵ[L 4T}8*AWͳ:W1yYu'#MkoɅ p9=ky6:iu%zo/&^y/ YW|1 2䂀: [@'k?ٻG-[Q+rUpk+1 foDYW2eW~?J߆_L;^1*?p{/|GNe(((;_z'\}z\cς9vށ_ٶm~+УT5b0QKs(D foq'R}o8Ս+;X|VH5S۞,P6QEyǪQEQEW?u\_oSk;]FkRΘ"@NWzgF_NWt?NJi2I@IC H5_ ZxgkK$ۀˑߥ}i#aͿCRبD54TEUQE݄knomVA t' ~=HMs;mß\Ϳ=CRث7EOOW?=CRب?E?&*Jߋx?΋ikکL1b9<`L+{^5·ʤ\#^AGA2_p[Xq̒xޫ>4w'~ kj}c־('{٬8ż =7ھළBGjT w64ͻ Ě<¡ewIkiB&Pq$XpH8DZ5GW:>6.5%)'|Ԯ}^_,yqq8Ƽ㦡c/Vwzle/ܑ@׃,Lw$Fc q)T =8l{vPU*F#+̾?hЂ\KnL+Ө_|AHqudo(ҽk?MQռMn^WKmAlqO#XWIέك8$-exR'L8e|'k[=H'%U(!Gq^ 2ۯ֯3;MW ~dѺGf#>1vZ[om pHPt`?kJS$`iD nI\IoW?ל?7_w1-Fhۤ *bX;kEBJm4nnyX_pЅ}-@8=;Ķ+,m̫=<xᮟ%ϓ{wdPmݲ` F~`N2+i;5#͒QAo7b{ WP "u`evP=F>Sg' u9V=1?3I:R}u45- FuZ|8i#IZ(!Svpz+gj&Byemށyվݬ-̖L;vuu_^h, 랅|-4bJq_AA> $9Ey9"Ɠ^pev8(8QUQC/˥{)QEQE?##`ҿc^"rsҿ?cњA ؑG($_GE]`O^NUYeI~h Gᇅ,|/5`EI6 wG_/P+{D~js 4p5FhZ>TsA"`X8'z_&$t(x_@Z7y КgzE F#A{LH@-|6״ |PյI6GtX,s¨I .|v)aHgϕ#$ko|FF"7Y%!;Gt<wvו,[HıE4l{>ڀ>4 ZM!vv{+V|/xfY ٢LRzޠKZ5A7N&@̣a?޽u=YJeKla_o3EIG"N6$ߘrAɮ>#_F&B%e1Fv㑐y\&;x{P->e/$6?FZ]χPͬӧdtQݔ댌u>/ k}qwLn_"N𵆍o!CJ1x%~*lWYc.9>Rt`ACJ8 .u-f|˖%5'@ϵz ׋}i-߈ RE%,b WOOI-+Y:ƤwlHcگ0^l7xo:@q_Yqhw\-x%#A68 J;^@8\JO#,?'gBxeI<6-6v{uOܐ|h B=ׄ;; Յ5(Vy(ǮMu&ޝ IԡY!HVvu=85<]m=le 27rnl(&_ )9,l9.>ºgg#U`82XchWi?5);Gd^n ~UNj :SEou]I6S:^w2nZKю ziFڬ`FUm郓Z?_]Zk+Xn\F LzZ?_\8t h$ou2K ,_zx>H.d#S2Ios{~x p@ 9,; q] "LlS_6H+((((((((((n5}c_h9%A*dsWo>tsZfIAJ??^!-}-hnhm4,˗1@Wqp;*|;cRln/R.%39 󟎟IOZjiv:ŋjVڹ)>!_h7igzs@xE]c x#^ѳCC2+"tak3H𾃠K$Fgc$ c|HL9U2@:ڼ_'𷈥ZkF%9S}qkzG+/|?Ou) In?V⛏2[X5HS'Ÿwlu)lM!$ ?J*WkFGf]pr2thX6% ȶ GLgB8g,qpj-{/i\hMqxaXGKxW@.$H쬥v;B˜Ep\xAKt"frqG;ן|9EifyHv=@a^ ߈um^k|5}g8y,%[y RHϠ {]?h O[.l,G`:^Ё~ I,.6r(eaA\ | O KT=èV1Hx\({gqK%=wH*GJ 鶶Q*n8~RK 'R$srsυCn!y4ټY# ܏ r_x$f_Uqjo=e$r"RTyG~,]DC:]}@ySNOLdHc񾰄䭁%}sE Z#}&0 zƙx[AҴ;9]$f <{YW2eVƱ eI\Fa83rOඅBGk@;@1|pKxจpF~|X}MY\o縸 HR@Z+Akiܫ2gi?Jx>E m",TH'PAEPEPEPEPEPEPEPEPEPEP2R2`T/>fѥ"o\۱ᕿ?Q޾_AuQmױUg6 q@[wFxZ;%MtG ϻn8@ky'5}BkgmcsE6Ę z/?x͈xM EO= u~ akzh,zLCuo-I,2I#qe#Y_7ދ/D TK!Ƞ}Gݕkts4qAΫ&m+V5KXdNYA ~t_º<ƥZۏ&G>2TߌOa9_C2H m8_m`N+=xzZ#}" kN>T5'u:I,`fnXxǨ]moOq >`~M4m3[6^Ü8gE&_ Y8p̿$~>lj-yTQ/H$О?"i(PdtVZ[1 c jTz8V֓Z]B[̅$UԌGx7|QoEX|߳~8댟ε(a CA[_vW:c]ܤ INN~@.|{k^po_O\Ǭ7O>֯VSlnBf39'kR=fq|O[Y5M:35JI ۱?0{W6Gdӄ7!~ku[@ۀ#^y9?AH?*7Rj''bRR@y6ǰm3,ϧ|fe)mXc?htz~cZ-g}ؠ"UO?H>jZ\-˯Q?ysqMW}=^ca?3t@kj%ǚ`_Kwu̧+#2P[$||IQx6RZ[qV]LBÓ9_\e<`$ 5uՍ_?#=_LHhAV,-4(m㷵b8\*Ph/3[5֛6cV<%9} ߰O{ >ݏֽFS{[H.E E%P?$Rߒ 4T1Ad>_QwK'nNp&)-T#w9}9so"SȮRg_ YyrvO@+ Jz*IEPEPEPEPXrx|uߴۘ9kr8ࢊ(,((((+wzw!ycV(D'*@w}WG*Öo/դK n*$lc=AJ)V0A\_ܛ7ccS' D*Y]h~'I履#ld(dqҶf>ɦYi2Y u;x}%]#LY2 xo#q4%#f^'F5} MXU ϫwƻ9Up3ZƐđF#E o/:oה~Oկwd)$R :?4_؉g&g\dt'#V^GC5&"^-6YKG FsՊ4$$ (UUP˿󯢼Y/xnF~IɉqF:4x =y@*|=5Ÿ7ZeAx2`O=OXD-^W#ڙCÚMhO6h[JkH}S6b<_]CkjUhY'p9? i鐼:v$fr}t'ҽ+H𮁠O$Fgc,+^<??Om֑R$EAg8'ŵˁ!dU\r3qۜnZ=׆ ryy>f3Zz/4Yٳ 3зS-r̷F|[>X %/g[wR{_\Ig}(j/j_ 5kxIMuE'i ?5@*$xQnU7H `:sb?M_X02Ys۔8=NᇂuǻLs2rB tvv}6v6 (p/ÿ7 $~$Ӯ9Ikf=@댎k5#6{k{yxWi$b4^cC*Mхi = cZ|-=h|5b\5LbExj7&z9]p.&*?`|UCximj68 `=>8(8QaUFSogEmo/jb[bNJ8dG=x:TTs<[|eTY:W<#m:Əix0IaC4KKY8&3d΀>q1eqhv\}W9ê0#={_ Z=:]$ HYלkb ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( 򟉟mg|u*,ufP%brwV>t_lbv˩-Z^}s[m9FI94PQ(8QUQQEQEQEyGO:ߏ'G{Ek01^>m#š>rPic Wr SZPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPL H)@/g|⻽KV{&[QqtnGS^EQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEunik-5.0.1/compression-ratio/cr2.sh000077500000000000000000000021131414222615100171600ustar00rootroot00000000000000#!/bin/sh f=$1; function NK (){ echo $(($1<<10)) } function NM (){ echo $(($1<<20)) } function NG (){ echo $(($1<<30)) } # echo counting k-mers (not sorted) j=12 # depends on your cpus and memory seq 11 2 32 \ | rush -v f=$f 'if [[ -e {f}.k{}.unik ]]; then exit; fi; \ unikmer count -K -k {} {f} -o {f}.k{}' echo -e "k\tnum\tplain\tgzip\tunik\tcunik\tsunik"; for s in $(NK 1) $(NM 1) $(NM 10) $(NM 100); do seq 11 2 32 \ | rush -j 6 -k -v f=$f -v s=$s -v 'F={f}.k{}.unik' \ 'sum=$(unikmer stats {F} -Ta | csvtk cut -t -f number | sed 1d); if [[ $sum -lt {s} ]]; then exit; fi; \ plain=$(unikmer head -n {s} {F} | unikmer view | wc -c); \ gzip=$(unikmer head -n {s} {F} | unikmer view | gzip -c | wc -c); \ unik=$(unikmer head -n {s} {F} | wc -c); \ cunik=$(unikmer head -n {s} {F} | unikmer view | unikmer dump -c | wc -c); \ sunik=$(unikmer head -n {s} {F} | unikmer sort | wc -c); \ echo -ne "{}\t{s}\t$plain\t$gzip\t$unik\t$cunik\t$sunik\n";' done unik-5.0.1/compression-ratio/plot.R000077500000000000000000000024641414222615100172500ustar00rootroot00000000000000#!/usr/bin/env Rscript library(scales) library(ggplot2) library(dplyr) library(tidyr) library(swr) library(png) library(cowplot) library(ggthemes) theme1 <- theme( text = element_text(size = 9), axis.text.x = element_text(size = 10), axis.text.y = element_text(size = 10), axis.title = element_text(size = 13), strip.background = element_rect( colour = "grey80", fill = "grey95", size = 0.5 ), legend.position = "bottom", legend.spacing.x = unit(0.4, "cm"), ) df <- read.csv("table.r.tsv", sep = "\t") df$group <- factor(df$group, levels = unique(df$group), ordered = TRUE) df$num <- factor(df$num, levels = unique(df$num), ordered = TRUE) p <- ggplot(df, aes(x = k, y = value, color = group)) + # geom_line(aes(y=mean), color="#3e52a1") + geom_smooth(method = loess, se = FALSE, alpha = 0.2 ) + geom_point(aes(shape = group), size = 2) + scale_x_continuous(limits=c(10, 32), breaks = seq(1, 31, by = 4))+ geom_vline(xintercept = seq(21,27,2), colour="grey80", linetype=2, size=0.2) + scale_color_colorblind() + facet_grid(. ~ num, scales = "free_y") + xlab("K") + ylab("compression ratio (%)") + ggtitle(NULL) + shenwei356.theme() + theme1 ggsave( p, file = "cr.jpg", width = 10, height = 4.5, dpi = 300 ) unik-5.0.1/compression-ratio/size.tsv000066400000000000000000000000571414222615100176500ustar00rootroot000000000000001024 1K 1048576 1M 10485760 10M 104857600 100M unik-5.0.1/compression-ratio/table.r.tsv000066400000000000000000000111541414222615100202250ustar00rootroot00000000000000k num group value 11 1K k-mers gzip 25.0 11 1K k-mers unik.default 31.8 11 1K k-mers unik.compact 25.0 11 1K k-mers unik.sorted 17.0 13 1K k-mers gzip 21.9 13 1K k-mers unik.default 30.9 13 1K k-mers unik.compact 25.9 13 1K k-mers unik.sorted 18.7 15 1K k-mers gzip 20.6 15 1K k-mers unik.default 29.7 15 1K k-mers unik.compact 24.8 15 1K k-mers unik.sorted 19.9 17 1K k-mers gzip 18.6 17 1K k-mers unik.default 29.2 17 1K k-mers unik.compact 25.6 17 1K k-mers unik.sorted 20.3 19 1K k-mers gzip 17.1 19 1K k-mers unik.default 26.4 19 1K k-mers unik.compact 23.1 19 1K k-mers unik.sorted 21.0 21 1K k-mers gzip 15.6 21 1K k-mers unik.default 21.4 21 1K k-mers unik.compact 17.9 21 1K k-mers unik.sorted 21.1 23 1K k-mers gzip 14.7 23 1K k-mers unik.default 20.5 23 1K k-mers unik.compact 17.5 23 1K k-mers unik.sorted 21.7 25 1K k-mers gzip 13.5 25 1K k-mers unik.default 17.3 25 1K k-mers unik.compact 15.6 25 1K k-mers unik.sorted 21.7 27 1K k-mers gzip 12.6 27 1K k-mers unik.default 16.8 27 1K k-mers unik.compact 14.8 27 1K k-mers unik.sorted 22.1 29 1K k-mers gzip 11.9 29 1K k-mers unik.default 13.5 29 1K k-mers unik.compact 13.5 29 1K k-mers unik.sorted 22.1 31 1K k-mers gzip 11.6 31 1K k-mers unik.default 13.2 31 1K k-mers unik.compact 13.2 31 1K k-mers unik.sorted 22.4 11 1M k-mers gzip 27.1 11 1M k-mers unik.default 29.2 11 1M k-mers unik.compact 24.9 11 1M k-mers unik.sorted 3.5 13 1M k-mers gzip 22.6 13 1M k-mers unik.default 29.4 13 1M k-mers unik.compact 27.9 13 1M k-mers unik.sorted 7.4 15 1M k-mers gzip 21.1 15 1M k-mers unik.default 28.8 15 1M k-mers unik.compact 24.7 15 1M k-mers unik.sorted 10.9 17 1M k-mers gzip 19.0 17 1M k-mers unik.default 28.5 17 1M k-mers unik.compact 26.2 17 1M k-mers unik.sorted 12.9 19 1M k-mers gzip 17.4 19 1M k-mers unik.default 26.0 19 1M k-mers unik.compact 24.2 19 1M k-mers unik.sorted 14.3 21 1M k-mers gzip 16.1 21 1M k-mers unik.default 21.0 21 1M k-mers unik.compact 18.4 21 1M k-mers unik.sorted 14.5 23 1M k-mers gzip 15.2 23 1M k-mers unik.default 20.5 23 1M k-mers unik.compact 17.3 23 1M k-mers unik.sorted 15.4 25 1M k-mers gzip 13.9 25 1M k-mers unik.default 17.4 25 1M k-mers unik.compact 15.5 25 1M k-mers unik.sorted 15.6 27 1M k-mers gzip 12.9 27 1M k-mers unik.default 16.6 27 1M k-mers unik.compact 14.7 27 1M k-mers unik.sorted 16.3 29 1M k-mers gzip 12.2 29 1M k-mers unik.default 13.6 29 1M k-mers unik.compact 13.6 29 1M k-mers unik.sorted 16.2 31 1M k-mers gzip 11.9 31 1M k-mers unik.default 13.2 31 1M k-mers unik.compact 13.2 31 1M k-mers unik.sorted 16.8 13 10M k-mers gzip 24.3 13 10M k-mers unik.default 30.3 13 10M k-mers unik.compact 28.4 13 10M k-mers unik.sorted 3.5 15 10M k-mers gzip 21.1 15 10M k-mers unik.default 29.2 15 10M k-mers unik.compact 24.9 15 10M k-mers unik.sorted 6.8 17 10M k-mers gzip 19.0 17 10M k-mers unik.default 29.0 17 10M k-mers unik.compact 26.4 17 10M k-mers unik.sorted 10.8 19 10M k-mers gzip 17.3 19 10M k-mers unik.default 26.3 19 10M k-mers unik.compact 23.9 19 10M k-mers unik.sorted 12.3 21 10M k-mers gzip 16.0 21 10M k-mers unik.default 21.4 21 10M k-mers unik.compact 19.0 21 10M k-mers unik.sorted 13.7 23 10M k-mers gzip 15.0 23 10M k-mers unik.default 20.9 23 10M k-mers unik.compact 17.5 23 10M k-mers unik.sorted 14.2 25 10M k-mers gzip 13.7 25 10M k-mers unik.default 17.4 25 10M k-mers unik.compact 15.5 25 10M k-mers unik.sorted 15.2 27 10M k-mers gzip 12.7 27 10M k-mers unik.default 16.4 27 10M k-mers unik.compact 14.5 27 10M k-mers unik.sorted 15.5 29 10M k-mers gzip 12.0 29 10M k-mers unik.default 13.5 29 10M k-mers unik.compact 13.5 29 10M k-mers unik.sorted 16.3 31 10M k-mers gzip 11.6 31 10M k-mers unik.default 13.1 31 10M k-mers unik.compact 13.1 31 10M k-mers unik.sorted 16.4 17 100M k-mers gzip 19.2 17 100M k-mers unik.default 29.1 17 100M k-mers unik.compact 26.5 17 100M k-mers unik.sorted 6.4 19 100M k-mers gzip 17.5 19 100M k-mers unik.default 26.2 19 100M k-mers unik.compact 23.7 19 100M k-mers unik.sorted 9.9 21 100M k-mers gzip 16.1 21 100M k-mers unik.default 21.5 21 100M k-mers unik.compact 19.6 21 100M k-mers unik.sorted 11.3 23 100M k-mers gzip 15.1 23 100M k-mers unik.default 21.0 23 100M k-mers unik.compact 17.5 23 100M k-mers unik.sorted 12.6 25 100M k-mers gzip 13.8 25 100M k-mers unik.default 17.4 25 100M k-mers unik.compact 15.4 25 100M k-mers unik.sorted 13.2 27 100M k-mers gzip 12.8 27 100M k-mers unik.default 16.4 27 100M k-mers unik.compact 14.4 27 100M k-mers unik.sorted 14.1 29 100M k-mers gzip 12.0 29 100M k-mers unik.default 13.4 29 100M k-mers unik.compact 13.4 29 100M k-mers unik.sorted 14.5 31 100M k-mers gzip 11.6 31 100M k-mers unik.default 13.0 31 100M k-mers unik.compact 13.0 31 100M k-mers unik.sorted 15.2 unik-5.0.1/compression-ratio/table.tsv000066400000000000000000000040261414222615100177650ustar00rootroot00000000000000k num plain gzip unik cunik sunik 11 1024 12288 3077 3903 3071 2084 13 1024 14336 3135 4423 3707 2685 15 1024 16384 3382 4860 4070 3258 17 1024 18432 3435 5391 4720 3734 19 1024 20480 3502 5408 4740 4292 21 1024 22528 3507 4824 4043 4745 23 1024 24576 3615 5050 4310 5345 25 1024 26624 3584 4598 4163 5785 27 1024 28672 3606 4806 4253 6340 29 1024 30720 3668 4145 4145 6780 31 1024 32768 3797 4336 4336 7332 11 1048576 12582912 3414123 3675461 3136411 441250 13 1048576 14680064 3320328 4310664 4096268 1086090 15 1048576 16777216 3533925 4827845 4142691 1831664 17 1048576 18874368 3585299 5370094 4945253 2439876 19 1048576 20971520 3642072 5443481 5066436 2993595 21 1048576 23068672 3708425 4853838 4252099 3337884 23 1048576 25165824 3813168 5158125 4361479 3878229 25 1048576 27262976 3777114 4738455 4234319 4247379 27 1048576 29360128 3798006 4865741 4305084 4773617 29 1048576 31457280 3834330 4292344 4292344 5110883 31 1048576 33554432 3976820 4423241 4423241 5647153 13 10485760 146800640 35712068 44423994 41725994 5200332 15 10485760 167772160 35431898 48968244 41697411 11481187 17 10485760 188743680 35789341 54753068 49915069 20442405 19 10485760 209715200 36322792 55142054 50127937 25752907 21 10485760 230686720 36917922 49412436 43941045 31658100 23 10485760 251658240 37833440 52693131 44023300 35673116 25 10485760 272629760 37333471 47542851 42169105 41377980 27 10485760 293601280 37417453 48297050 42625217 45450484 29 10485760 314572800 37655604 42348734 42348734 51130166 31 10485760 335544320 38986891 43842405 43842405 55149351 17 104857600 1887436800 362918850 548780879 500127323 120403558 19 104857600 2097152000 366075766 550010399 497433925 208274422 21 104857600 2306867200 371682551 495000876 451261683 260118372 23 104857600 2516582400 380292305 527400103 440946819 317889599 25 104857600 2726297600 375222318 475640328 420606161 358606019 27 104857600 2936012800 375638499 480054242 423586235 415019624 29 104857600 3145728000 377847156 422445224 422445224 454935571 31 104857600 3355443200 390598499 436644431 436644431 511122250 unik-5.0.1/go.mod000066400000000000000000000001321414222615100135630ustar00rootroot00000000000000module github.com/shenwei356/unik/v5 go 1.17 require github.com/shenwei356/kmers v0.1.0 unik-5.0.1/go.sum000066400000000000000000000002551414222615100136160ustar00rootroot00000000000000github.com/shenwei356/kmers v0.1.0 h1:zPmWftXQWDugG99Wxd3rFmCIF2QZEUpEba3jOSEn7nE= github.com/shenwei356/kmers v0.1.0/go.mod h1:23Ltr95n98LYy9OtJMFSzkmU/1nmdYwgzqB3walAQ6g= unik-5.0.1/serialization.go000066400000000000000000000471301414222615100156720ustar00rootroot00000000000000// Copyright © 2018-2021 Wei Shen // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in // all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN // THE SOFTWARE. package unik import ( "encoding/binary" "errors" "fmt" "io" "github.com/shenwei356/kmers" ) // MainVersion is the main version number. const MainVersion uint8 = 5 // MinorVersion is the minor version number. const MinorVersion uint8 = 0 // Magic number of binary file. var Magic = [8]byte{'.', 'u', 'n', 'i', 'k', 'm', 'e', 'r'} // ErrInvalidFileFormat means invalid file format. var ErrInvalidFileFormat = errors.New("unik: invalid binary format") // ErrBrokenFile means the file is not complete. var ErrBrokenFile = errors.New("unik: broken file") // ErrKOverflow means K > 32. var ErrKOverflow = errors.New("unik: k-mer size (1-32) overflow") // ErrKMismatch means K size mismatch. var ErrKMismatch = errors.New("unik: K mismatch") // ErrDescTooLong means length of description two long var ErrDescTooLong = errors.New("unik: description too long, 128 bytes at most") // ErrCallOrder means WriteTaxid/ReadTaxid should be called after WriteCode/ReadCode var ErrCallOrder = errors.New("unik: WriteTaxid/ReadTaxid should be called after WriteCode/ReadCode") // ErrCallLate means SetMaxTaxid/SetGlobalTaxid should be called before writing KmerCode/code/taxid var ErrCallLate = errors.New("unik: SetMaxTaxid/SetGlobalTaxid should be called before writing KmerCode/code/taxid") // ErrCallReadWriteTaxid means flag UnikIncludeTaxID is off, but you call ReadTaxid/WriteTaxid var ErrCallReadWriteTaxid = errors.New("unik: can not call ReadTaxid/WriteTaxid when flag UnikIncludeTaxID is off") // ErrInvalidTaxid means zero given for a taxid. var ErrInvalidTaxid = errors.New("unik: invalid taxid, 0 not allowed") // ErrVersionMismatch means version mismatch between files and program var ErrVersionMismatch = errors.New("unik: version mismatch") var be = binary.BigEndian var descMaxLen = 1024 var conservedDataLen = 64 // Header contains metadata type Header struct { MainVersion uint8 MinorVersion uint8 K int Flag uint32 Number uint64 // Number of Kmers, may not be accurate globalTaxid uint32 // universal taxid, 0 for no record maxTaxid uint32 Description []byte // let's limit it to 128 Bytes Scale uint32 // scale of down-sampling MaxHash uint64 // max hash for scaling/down-sampling } const ( // UnikCompact means k-mers are serialized in fix-length (n = int((K + 3) / 4) ) of byte array. UnikCompact = 1 << iota // UnikCanonical means only canonical k-mers kept. UnikCanonical // UnikSorted means k-mers are sorted UnikSorted // when sorted, the serialization structure is very different // UnikIncludeTaxID means a k-mer is followed its LCA taxid UnikIncludeTaxID // UnikHashed means ntHash value are saved as code. UnikHashed // UnikScaled means only hashes smaller than or equal to max_hash are saved. UnikScaled ) func (h Header) String() string { return fmt.Sprintf("unikmer binary k-mer data file v%d.%d with K=%d and Flag=%d", h.MainVersion, h.MinorVersion, h.K, h.Flag) } // Reader is for reading kmers.KmerCode. type Reader struct { Header r io.Reader buf []byte compact bool // saving kmers.KmerCode in variable-length byte array. bufsize int sorted bool hasPrev bool prev uint64 buf2 []byte offset uint64 includeTaxid bool bufTaxid []byte taxidByteLen int prevTaxid uint32 // buffered taxid hasPrevTaxid bool justReadACode bool lastRecord bool } // NewReader returns a Reader. func NewReader(r io.Reader) (reader *Reader, err error) { reader = &Reader{r: r} err = reader.readHeader() if err != nil { return nil, err } return reader, nil } // IsSorted tells if the k-mers in file sorted func (reader *Reader) IsSorted() bool { return reader.Flag&UnikSorted > 0 } // IsCanonical tells if the only canonical k-mers stored func (reader *Reader) IsCanonical() bool { return reader.Flag&UnikCanonical > 0 } // IsCompact tells if the k-mers are stored in a compact format func (reader *Reader) IsCompact() bool { return reader.Flag&UnikCompact > 0 } // IsIncludeTaxid tells if every k-mer is followed by its taxid func (reader *Reader) IsIncludeTaxid() bool { return reader.Flag&UnikIncludeTaxID > 0 } // IsHashed tells if ntHash values are saved. func (reader *Reader) IsHashed() bool { return reader.Flag&UnikHashed > 0 } // IsScaled tells if hashes is scaled func (reader *Reader) IsScaled() bool { return reader.Flag&UnikHashed > 0 && reader.Flag&UnikScaled > 0 } // HasGlobalTaxid means the file has a global taxid func (reader *Reader) HasGlobalTaxid() bool { return reader.globalTaxid > 0 } // HasTaxidInfo means the binary file contains global taxid or taxids for all k-mers func (reader *Reader) HasTaxidInfo() bool { return reader.IsIncludeTaxid() || reader.HasGlobalTaxid() } // GetGlobalTaxid returns the global taxid func (reader *Reader) GetGlobalTaxid() uint32 { return reader.globalTaxid } // GetTaxidBytesLength returns number of byte to store a taxid func (reader *Reader) GetTaxidBytesLength() int { return reader.taxidByteLen } // GetScale returns the scale of down-sampling func (reader *Reader) GetScale() uint32 { if reader.Scale == 0 { return uint32(1) } return reader.Scale } // GetMaxHash returns the max hash for scaling. func (reader *Reader) GetMaxHash() uint64 { if reader.MaxHash == 0 { return ^uint64(0) } return reader.MaxHash } func (reader *Reader) readHeader() (err error) { buf := make([]byte, 56) r := reader.r // check Magic number _, err = io.ReadFull(r, buf[:8]) if err != nil { return err } same := true for i := 0; i < 8; i++ { if Magic[i] != buf[i] { same = false break } } if !same { return ErrInvalidFileFormat } // read metadata _, err = io.ReadFull(r, buf[:4]) if err != nil { return err } // check compatibility? if (buf[0] == 0 && buf[1] == 0) || MainVersion != buf[0] { return ErrVersionMismatch } reader.MainVersion = buf[0] reader.MinorVersion = buf[1] reader.K = int(buf[2]) _, err = io.ReadFull(r, buf[:4]) if err != nil { return err } reader.Flag = be.Uint32(buf[:4]) reader.buf = make([]byte, 8) if reader.IsCompact() { reader.compact = true reader.bufsize = int((reader.K + 3) / 4) } if reader.IsSorted() { reader.sorted = true reader.buf2 = make([]byte, 17) } if reader.IsIncludeTaxid() { reader.includeTaxid = true reader.bufTaxid = make([]byte, 4) } // number _, err = io.ReadFull(r, buf[:8]) if err != nil { return err } reader.Number = be.Uint64(buf[:8]) // taxid _, err = io.ReadFull(r, buf[:4]) if err != nil { return err } reader.globalTaxid = be.Uint32(buf[:4]) // taxid byte length _, err = io.ReadFull(r, buf[1:2]) if err != nil { return err } buf[0] = 0 reader.taxidByteLen = int(be.Uint16(buf[:2])) // length of description var lenDesc uint16 _, err = io.ReadFull(r, buf[:2]) if err != nil { return err } lenDesc = be.Uint16(buf[:2]) desc := make([]byte, lenDesc) _, err = io.ReadFull(r, desc) if err != nil { return err } reader.Description = desc // scale _, err = io.ReadFull(r, buf[:4]) if err != nil { return err } reader.Scale = be.Uint32(buf[:4]) // max hash _, err = io.ReadFull(r, buf[:8]) if err != nil { return err } reader.MaxHash = be.Uint64(buf[:8]) reserved := make([]byte, conservedDataLen) _, err = io.ReadFull(r, reserved) if err != nil { return err } return nil } // Read reads one kmers.KmerCode. func (reader *Reader) Read() (kmers.KmerCode, error) { code, err := reader.ReadCode() return kmers.KmerCode{Code: code, K: reader.K}, err } // ReadWithTaxid reads a kmers.KmerCode, also return taxid if having. func (reader *Reader) ReadWithTaxid() (kmers.KmerCode, uint32, error) { code, taxid, err := reader.ReadCodeWithTaxid() return kmers.KmerCode{Code: code, K: reader.K}, taxid, err } // ReadCodeWithTaxid reads a code, also return taxid if having. func (reader *Reader) ReadCodeWithTaxid() (code uint64, taxid uint32, err error) { code, err = reader.ReadCode() if err != nil { return 0, 0, err } if reader.includeTaxid { taxid, err = reader.ReadTaxid() if err != nil { return 0, 0, err } } else { taxid = reader.globalTaxid } return code, taxid, err } // ReadTaxid reads on taxid func (reader *Reader) ReadTaxid() (taxid uint32, err error) { if !reader.includeTaxid { return 0, ErrCallReadWriteTaxid } if !reader.justReadACode { return 0, ErrCallOrder } if reader.sorted { if reader.lastRecord { _, err = io.ReadFull(reader.r, reader.bufTaxid) if err != nil { return 0, err } reader.hasPrevTaxid = false reader.justReadACode = false return be.Uint32(reader.bufTaxid), nil } if reader.hasPrevTaxid { c := reader.prevTaxid reader.hasPrevTaxid = false reader.justReadACode = false return c, nil } _, err = io.ReadFull(reader.r, reader.bufTaxid[4-reader.taxidByteLen:]) if err != nil { return 0, err } taxid = be.Uint32(reader.bufTaxid) _, err = io.ReadFull(reader.r, reader.bufTaxid[4-reader.taxidByteLen:]) if err != nil { return 0, err } reader.prevTaxid = be.Uint32(reader.bufTaxid) reader.hasPrevTaxid = true return taxid, nil } else if reader.compact { _, err = io.ReadFull(reader.r, reader.bufTaxid[4-reader.taxidByteLen:]) } else { _, err = io.ReadFull(reader.r, reader.bufTaxid) } if err != nil { return 0, err } reader.justReadACode = false return be.Uint32(reader.bufTaxid), nil } // ReadCode reads one code. func (reader *Reader) ReadCode() (uint64, error) { var err error if reader.sorted { if reader.hasPrev { c := reader.prev // reader.prev = 0 reader.hasPrev = false reader.justReadACode = true return c, nil } buf2 := reader.buf2 r := reader.r // read control byte var nReaded int _, err = io.ReadFull(r, buf2[0:1]) if err != nil { return 0, err } ctrlByte := buf2[0] if ctrlByte&128 > 0 { // last one _, err = io.ReadFull(r, buf2[0:8]) if err != nil { return 0, err } reader.lastRecord = true reader.justReadACode = true return be.Uint64(buf2[0:8]), nil } // parse control byte encodedBytes := ctrlByte2ByteLengths[ctrlByte] nEncodedBytes := int(encodedBytes[0] + encodedBytes[1]) // read encoded bytes nReaded, err = io.ReadFull(r, buf2[0:nEncodedBytes]) if err != nil { return 0, err } if nReaded < nEncodedBytes { return 0, ErrBrokenFile } decodedVals, nDecoded := Uint64s(ctrlByte, buf2[0:nEncodedBytes]) if nDecoded == 0 { return 0, ErrBrokenFile } code := decodedVals[0] + reader.offset reader.prev = code + decodedVals[1] reader.hasPrev = true reader.offset = code + decodedVals[1] reader.justReadACode = true return code, nil } else if reader.compact { _, err = io.ReadFull(reader.r, reader.buf[8-reader.bufsize:]) } else { _, err = io.ReadFull(reader.r, reader.buf) } if err != nil { return 0, err } reader.justReadACode = true return be.Uint64(reader.buf), nil } // Writer writes kmers.KmerCode. type Writer struct { Header w io.Writer wroteHeader bool buf []byte // saving kmers.KmerCode in compact fixlength byte array. compact bool bufsize int // sortred mode sorted bool offset uint64 prev uint64 // buffered code hasPrev bool buf2 []byte buf3 []byte ctrlByte byte nEncodedByte int // for taxid includeTaxid bool bufTaxid []byte justWrittenACode bool taxidByteLen int prevTaxid uint32 // buffered taxid hasPrevTaxid bool } // NewWriter creates a Writer. func NewWriter(w io.Writer, k int, flag uint32) (*Writer, error) { if k == 0 { return nil, ErrKOverflow } writer := &Writer{ Header: Header{MainVersion: MainVersion, MinorVersion: MinorVersion, K: k, Flag: flag, Number: 0}, w: w, } // prevent wrong use of compact if writer.Flag&UnikCompact > 0 && (writer.Flag&UnikSorted > 0 || writer.Flag&UnikHashed > 0) { writer.Flag ^= UnikCompact } writer.buf = make([]byte, 8) if writer.Flag&UnikCompact > 0 && writer.Flag&UnikSorted == 0 && writer.Flag&UnikHashed == 0 { writer.compact = true writer.bufsize = int(k+3) / 4 } else if writer.Flag&UnikSorted > 0 { writer.sorted = true writer.buf2 = make([]byte, 16) writer.buf3 = make([]byte, 32) } if writer.Flag&UnikIncludeTaxID > 0 { writer.includeTaxid = true writer.bufTaxid = make([]byte, 4) } return writer, nil } // WriteHeader writes file header func (writer *Writer) WriteHeader() (err error) { if writer.wroteHeader { return nil } w := writer.w // 8 bytes magic number err = binary.Write(w, be, Magic) if err != nil { return err } // 4 bytes meta info err = binary.Write(w, be, [4]uint8{writer.MainVersion, MinorVersion, uint8(writer.K), 0}) if err != nil { return err } // 4 bytes flags err = binary.Write(w, be, writer.Flag) if err != nil { return err } // 8 bytes number err = binary.Write(w, be, writer.Number) if err != nil { return err } // 4 bytes taxid err = binary.Write(w, be, writer.globalTaxid) if err != nil { return err } // 1 byte taxid bytes len if writer.maxTaxid <= 0 { writer.taxidByteLen = 4 } else { writer.taxidByteLen = int(byteLength(uint64(writer.maxTaxid))) } err = binary.Write(w, be, uint8(writer.taxidByteLen)) if err != nil { return err } // description length (2 byte)s and data (128 bytes) lenDesc := len(writer.Description) if lenDesc > descMaxLen { return ErrDescTooLong } err = binary.Write(w, be, uint16(lenDesc)) if err != nil { return err } err = binary.Write(w, be, writer.Description) if err != nil { return err } // scale err = binary.Write(w, be, writer.Scale) if err != nil { return err } // max hash err = binary.Write(w, be, writer.MaxHash) if err != nil { return err } // reserved 24 bytes reserved := make([]byte, conservedDataLen) err = binary.Write(w, be, reserved) if err != nil { return err } // header has 192 bytes writer.wroteHeader = true return nil } // SetGlobalTaxid sets the global taxid func (writer *Writer) SetGlobalTaxid(taxid uint32) error { if writer.wroteHeader { return ErrCallLate } writer.globalTaxid = taxid return nil } // SetMaxTaxid set the maxtaxid func (writer *Writer) SetMaxTaxid(taxid uint32) error { if writer.wroteHeader { return ErrCallLate } writer.maxTaxid = taxid return nil } // SetScale set the scale func (writer *Writer) SetScale(scale uint32) error { if writer.wroteHeader { return ErrCallLate } if writer.Flag&UnikHashed == 0 { writer.Flag |= UnikHashed } if writer.Flag&UnikScaled == 0 { writer.Flag |= UnikScaled } writer.Scale = scale return nil } // SetMaxHash set the max hash func (writer *Writer) SetMaxHash(maxHash uint64) error { if writer.wroteHeader { return ErrCallLate } if writer.Flag&UnikHashed == 0 { writer.Flag += UnikHashed } if writer.Flag&UnikScaled == 0 { writer.Flag += UnikScaled } writer.MaxHash = maxHash return nil } // WriteKmer writes one k-mer. func (writer *Writer) WriteKmer(mer []byte) error { kcode, err := kmers.NewKmerCode(mer) if err != nil { return err } return writer.Write(kcode) } // WriteKmerWithTaxid writes one k-mer and its taxid func (writer *Writer) WriteKmerWithTaxid(mer []byte, taxid uint32) error { err := writer.WriteKmer(mer) if err != nil { return nil } return writer.WriteTaxid(taxid) } // Write writes one kmers.KmerCode. func (writer *Writer) Write(kcode kmers.KmerCode) (err error) { if writer.K != kcode.K { return ErrKMismatch } return writer.WriteCode(kcode.Code) } // WriteWithTaxid writes one kmers.KmerCode and its taxid. // If UnikIncludeTaxID is off, taxid will not be written. func (writer *Writer) WriteWithTaxid(kcode kmers.KmerCode, taxid uint32) (err error) { err = writer.Write(kcode) if err != nil { return nil } return writer.WriteTaxid(taxid) } // WriteCodeWithTaxid writes a code and its taxid. // If UnikIncludeTaxID is off, taxid will not be written. func (writer *Writer) WriteCodeWithTaxid(code uint64, taxid uint32) (err error) { err = writer.WriteCode(code) if err != nil { return nil } if !writer.includeTaxid { // if no taxid, just return. return nil } return writer.WriteTaxid(taxid) } // WriteTaxid appends taxid to the code func (writer *Writer) WriteTaxid(taxid uint32) (err error) { if !writer.includeTaxid { return ErrCallReadWriteTaxid } if !writer.justWrittenACode { return ErrCallOrder } if writer.sorted { if !writer.hasPrevTaxid { // write it later writer.prevTaxid = taxid writer.hasPrevTaxid = true writer.justWrittenACode = false return nil } be.PutUint32(writer.bufTaxid, writer.prevTaxid) writer.w.Write(writer.bufTaxid[4-writer.taxidByteLen:]) // fmt.Printf("write taxid: %d, %d\n", writer.prevTaxid, writer.bufTaxid[4-writer.taxidByteLen:]) be.PutUint32(writer.bufTaxid, taxid) writer.w.Write(writer.bufTaxid[4-writer.taxidByteLen:]) writer.hasPrevTaxid = false } else if writer.compact { be.PutUint32(writer.bufTaxid, taxid) writer.w.Write(writer.bufTaxid[4-writer.taxidByteLen:]) } else { be.PutUint32(writer.bufTaxid, taxid) writer.w.Write(writer.bufTaxid) } writer.justWrittenACode = false return nil } // WriteCode writes one code func (writer *Writer) WriteCode(code uint64) (err error) { // lazily write header if !writer.wroteHeader { err = writer.WriteHeader() if err != nil { return err } writer.wroteHeader = true } if writer.sorted { if !writer.hasPrev { // write it later writer.prev = code writer.hasPrev = true writer.justWrittenACode = true return nil } writer.ctrlByte, writer.nEncodedByte = PutUint64s(writer.buf2, writer.prev-writer.offset, code-writer.prev) writer.buf3[0] = writer.ctrlByte copy(writer.buf3[1:writer.nEncodedByte+1], writer.buf2[0:writer.nEncodedByte]) _, err = writer.w.Write(writer.buf3[0 : writer.nEncodedByte+1]) writer.offset = code // writer.prev = 0 writer.hasPrev = false } else if writer.compact { be.PutUint64(writer.buf, code) _, err = writer.w.Write(writer.buf[8-writer.bufsize:]) } else { be.PutUint64(writer.buf, code) _, err = writer.w.Write(writer.buf) } if err != nil { return err } writer.justWrittenACode = true return nil } // Flush write the last k-mer func (writer *Writer) Flush() (err error) { if !writer.wroteHeader { writer.Number = 0 writer.WriteHeader() } if !writer.sorted || !writer.hasPrev { return nil } // write last k-mer err = binary.Write(writer.w, be, uint8(128)) if err != nil { return err } err = binary.Write(writer.w, be, writer.prev) // last code if err != nil { return err } if writer.includeTaxid && writer.hasPrevTaxid { // last taxid err = binary.Write(writer.w, be, writer.prevTaxid) if err != nil { return err } } writer.hasPrev = false writer.hasPrevTaxid = false return nil } unik-5.0.1/serialization_test.go000066400000000000000000000066521414222615100167350ustar00rootroot00000000000000// Copyright © 2018-2021 Wei Shen // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in // all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN // THE SOFTWARE. package unik import ( "bufio" "bytes" "fmt" "io" "math/rand" "os" "sort" "testing" "github.com/shenwei356/kmers" ) var bit2base = [4]byte{'A', 'C', 'G', 'T'} func genKmers(k int, num int, sorted bool) [][]byte { mers := make([][]byte, num) var j int for i := 0; i < num; i++ { mers[i] = make([]byte, k) for j = 0; j < k; j++ { mers[i][j] = bit2base[rand.Intn(4)] } } sort.Slice(mers, func(i, j int) bool { return bytes.Compare(mers[i], mers[j]) < 0 }) return mers } // TestWriterReader tests Writer and Writer func TestWriter(t *testing.T) { var file string var mers, mers2 [][]byte var err error ns := []int{10001, 10001, 10001, 10000} for k := 1; k <= 31; k++ { for i, flag := range []uint32{0, UnikCompact, UnikSorted} { //, UnikSorted func(flag uint32) { mers = genKmers(k, ns[i], flag&UnikSorted > 0) file = fmt.Sprintf("t.k%d.unik", k) err = write(mers, file, flag) if err != nil { t.Error(err) } defer func() { err = os.Remove(file) if err != nil { t.Error(err) } }() mers2, err = read(file) if err != nil { t.Error(err) } if len(mers2) != len(mers) { t.Errorf("write and read: number err") } for i := 0; i < len(mers); i++ { if !bytes.Equal(mers[i], mers2[i]) { t.Errorf("write and read: data mismatch. %d: %d vs %d", i, mers[i], mers2[i]) } } }(flag) } } } func write(mers [][]byte, file string, flag uint32) error { w, err := os.Create(file) if err != nil { return err } defer w.Close() outfh := bufio.NewWriter(w) defer outfh.Flush() writer, err := NewWriter(outfh, len(mers[0]), flag) if err != nil { return err } for _, mer := range mers { err = writer.WriteKmer(mer) if err != nil { return err } } err = writer.Flush() if err != nil { return err } return nil } func read(file string) ([][]byte, error) { r, err := os.Open(file) if err != nil { return nil, err } defer r.Close() infh := bufio.NewReader(r) reader, err := NewReader(infh) if err != nil { return nil, err } // fmt.Println(reader.Header) mers := make([][]byte, 0, 1000) var kcode kmers.KmerCode for { kcode, err = reader.Read() if err != nil { if err == io.EOF { break } return nil, err } mers = append(mers, kcode.Bytes()) } return mers, nil } unik-5.0.1/varint-GB.go000066400000000000000000000057541414222615100146140ustar00rootroot00000000000000// Copyright © 2018-2021 Wei Shen // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in // all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN // THE SOFTWARE. package unik var offsets = []uint8{56, 48, 40, 32, 24, 16, 8, 0} // PutUint64s endcodes two uint64s into 2-16 bytes, and returns control byte // and encoded byte length. func PutUint64s(buf []byte, v1, v2 uint64) (ctrl byte, n int) { blen := byteLength(v1) ctrl |= byte(blen - 1) for _, offset := range offsets[8-blen:] { buf[n] = byte((v1 >> offset) & 0xff) n++ } ctrl <<= 3 blen = byteLength(v2) ctrl |= byte(blen - 1) for _, offset := range offsets[8-blen:] { buf[n] = byte((v2 >> offset) & 0xff) n++ } return } // Uint64s decode from encoded bytes func Uint64s(ctrl byte, buf []byte) (values [2]uint64, n int) { blens := ctrlByte2ByteLengths[ctrl] if len(buf) < int(blens[0]+blens[1]) { return values, 0 } for i := 0; i < 2; i++ { for j := uint8(0); j < blens[i]; j++ { values[i] <<= 8 values[i] |= uint64(buf[n]) n++ } } return } func byteLength(n uint64) uint8 { if n < 256 { return 1 } if n < 65536 { return 2 } if n < 16777216 { return 3 } if n < 4294967296 { return 4 } if n < 1099511627776 { return 5 } if n < 281474976710656 { return 6 } if n < 72057594037927936 { return 7 } return 8 } var ctrlByte2ByteLengths = [64][2]uint8{ {1, 1}, // 0, 0b000000 {1, 2}, {1, 3}, {1, 4}, {1, 5}, {1, 6}, {1, 7}, {1, 8}, {2, 1}, // 8, 0b001000 {2, 2}, {2, 3}, {2, 4}, {2, 5}, {2, 6}, {2, 7}, {2, 8}, {3, 1}, // 16, 0b010000 {3, 2}, {3, 3}, {3, 4}, {3, 5}, {3, 6}, {3, 7}, {3, 8}, {4, 1}, // 24, 0b011000 {4, 2}, {4, 3}, {4, 4}, {4, 5}, {4, 6}, {4, 7}, {4, 8}, {5, 1}, // 32, 0b100000 {5, 2}, {5, 3}, {5, 4}, {5, 5}, {5, 6}, {5, 7}, {5, 8}, {6, 1}, // 40, 0b101000 {6, 2}, {6, 3}, {6, 4}, {6, 5}, {6, 6}, {6, 7}, {6, 8}, {7, 1}, // 48, 0b110000 {7, 2}, {7, 3}, {7, 4}, {7, 5}, {7, 6}, {7, 7}, {7, 8}, {8, 1}, // 56, 0b111000 {8, 2}, {8, 3}, {8, 4}, {8, 5}, {8, 6}, {8, 7}, {8, 8}, } unik-5.0.1/varint-GB_test.go000066400000000000000000000041161414222615100156420ustar00rootroot00000000000000// Copyright © 2018-2021 Wei Shen // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in // all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN // THE SOFTWARE. package unik import ( "math/rand" "testing" ) func TestStreamVByte64(t *testing.T) { ntests := 10000 tests := make([][2]uint64, ntests) var i int for ; i < ntests/4; i++ { tests[i] = [2]uint64{rand.Uint64(), rand.Uint64()} } for ; i < ntests/2; i++ { tests[i] = [2]uint64{uint64(rand.Uint32()), uint64(rand.Uint32())} } for ; i < ntests*3/4; i++ { tests[i] = [2]uint64{uint64(rand.Intn(65536)), uint64(rand.Intn(256))} } for ; i < ntests; i++ { tests[i] = [2]uint64{uint64(rand.Intn(256)), uint64(rand.Intn(256))} } for i, test := range tests { buf := make([]byte, 16) ctrl, n := PutUint64s(buf, test[0], test[1]) result, n2 := Uint64s(ctrl, buf[0:n]) if n2 == 0 { t.Errorf("#%d, wrong decoded number", i) } if result[0] != test[0] || result[1] != test[1] { t.Errorf("#%d, wrong decoded result: %d, %d, answer: %d, %d", i, result[0], result[1], test[0], test[1]) } // fmt.Printf("%d, %d => n=%d, buf=%v\n", test[0], test[1], n, buf[0:n]) } }