tcR/0000755000176200001440000000000013667667012011020 5ustar liggesuserstcR/NAMESPACE0000644000176200001440000000142013667026401012223 0ustar liggesusersuseDynLib(tcR) exportPattern("^[[:alpha:]]+") export('.split.get') importFrom("grDevices", "colorRampPalette", "rainbow") importFrom("graphics", "segments") importFrom("stats", "aggregate", "as.formula", "dist", "na.exclude", "p.adjust", "prcomp", "qnorm", "quantile", "rmultinom", "runif", "sd") importFrom(Rcpp, evalCpp, cppFunction) importFrom(stringdist, stringdist) import(grid) importFrom(gridExtra, grid.arrange, arrangeGrob) import(ggplot2) importFrom(reshape2, melt, dcast, acast) importFrom(data.table, data.table, as.data.table, setnames, setkeyv, setattr) importFrom(dplyr, group_by, group_by_, grouped_df, summarise, summarise_, select, select_) importFrom(gtable, gtable_filter) importFrom("stats", "lm") import(utils) import(igraph) import(scales)tcR/README.md0000644000176200001440000000306513667224201012270 0ustar liggesusers[![Downloads_all](http://cranlogs.r-pkg.org/badges/grand-total/tcR)](http://www.r-pkg.org/pkg/tcR) [![Downloads_week](http://cranlogs.r-pkg.org/badges/last-week/tcR)](http://www.r-pkg.org/pkg/tcR) tcR === **The tcR package is no longer supported and current issues will not be fixed.** **A new package is available that is designed to replace tcR called immunarch: https://immunarch.com/** *We have solved most of the problems tcR package had and improved the overall pipeline, providing functions for painless repertoire file parsing and publication-ready plot making. We will be happy to help you to integrate the new package into your pipelines. Please do not hesitate to contact us via emails on https://immunarch.com/ or via issues on https://github.com/immunomind/immunarch, should any question arise.* *Sincerely, immunarch dev team and Vadim I. Nazarov, lead developer* tcR is a platform designed for TCR and Ig repertoire data analysis in R after preprocessing data with software tools for CDR3 extraction and gene segments aligning (MiTCR, MiXCR, MiGEC, ImmunoSEQ, IMSEQ, etc.). With the power and flexibility of R language and procedures supported by tcR users can perform advanced statistical analysis of TCR and Ig repertoires. The package was published in BMC Bioinformatics, please cite if you use it: [Nazarov et al., tcR: an R package for T cell receptor repertoire advanced data analysis](http://www.biomedcentral.com/1471-2105/16/175) The project was developed mainly in the [Laboratory of Comparative and Functional Genomics](http://labcfg.ibch.ru/lcfg.html). tcR/data/0000755000176200001440000000000013667551325011730 5ustar liggesuserstcR/data/datalist0000644000176200001440000000003713667551325013460 0ustar liggesusersbeta.prob genesegments twa twb tcR/data/twb.rda0000644000176200001440000256176013667026401013225 0ustar liggesusersBZh91AY&SYݭ>A_|> 4  z8jRSD@ JP(r.UӺ͛*ul3R񴢎rarAWsn=ksӪt943Z֪2kN۶RC-lꅠC7;j)TIG[ZlZ IԼ:z$TXj`-9HvԒFQR^V$94*(Vm'{5l{zӗL'pn$IhexEpu$+vP{pmJ;wOOZ>R6VƏ\wu]VUR*죧z;-\C ]i $zE5eBl !*IQ^ڡ*B"Q(SbV;ehԵ +ZhWmT!) \2@p*ReQUUJcPR\(7sHD*TF `WT vޕJT$)y4 '@7jUhhj՚)AL T\twE1`}2*{hoQ@} (@b|tP$R@Q@*)T * w\r=@+9UHPZ݀ÀrRJD+fivP,xwq$*]J S%(P P=a4`x [-^ ޘpTiV> h@6T`R@4HP>؟m,H)W*(tjD1 T4 ]/wԊ% #U0UP d.;Ef7n!3wT9e+&lQ"*)"*HX|skRԗK[Byx PziPXvt((J QTP4{`JAKhk|#*)${a"QB7w  4"%XT`@ OB"AI0')=aQh@4h = @@i%$H#H2i`M=&&Fɣ2b4`FLhFM SII Bzh4h@@ IE$5!h d !h!UhCS&F Hh0a&& dhѓFAFA4 4424ѓM Fj04B&HBzj44 h@3G=~C"r@ Ș Hp$jX LTq# $O3Bg %<PU oʠk%5 */.5IQ6H)`T Pe@ &H@6\ 0pH`Tl]рaHT =6@ (VP0,0266] (n(; nJ S{`4 Co)@=r pbppxdN `J88888}}Olp=Мb*=rkEP{9ar0<|!͏8P,~bH|~G'VL:ϩG?\~_}G>}?b?~0Pهh~tj~O?r??w_??P~G<|?O$<<_N<('SOy^SyGICCG7)'xx!ogax> 4CHi4|}==yw;ܟڽٝ~O~3=bu_~}֟W}O}>|+~Ο鏎tK.~s9s>YcyS9^WyOu׺yqx4⽏N'=ofo'c7o__o[m3oY./wYaH "~gM&s˘} x.\ֹY[WsޗoizQ;n_\^`?S gH>@}tOp>&%* @x~Ar<"hM'UAU?Do_ar}.?H<$¢'7(' 'pM?1**. )@*pT p 0Oea oP2=| (QT7LDRPEALPmOꃙt|H9ΞaJ],E0vmf5v9Avu a 2 cq9+evy(d&aʪ] 6] 004[E=Ǡ^^Ǭ&{)j҈I Jk 'J(ܵbq:kUCk9:BzOCON XvdJVx4T (gj-r*h`ζ8ڞԕD a6,vq"a,NչszQ"3dtSmUNGF=2-,;g!rOgEFWmN#SYfh+RɶTtklCgٶ†dwj 4q[Xv9슼ldQxЯ&Ɠ/+WUƭ4$v)R]\=PbuWFLdZ\SuQ ʊH<[S7.L􈛔y!fciQ%맅s9Tʒ(.qZ,*vfS;3*)CMghٱCLK$.2S"*ːMstlc)P"Dz{S37".LlLvpڇ4*kMU#ɭY.v)gk8fvvP,Yp宒AA=9/Kk)ht6;QqlngPرD&I^Y'/:$!۝(Ml9lM:ơIzy &E趦e%ԛ[liX[,*ҼQ):͛ɦ֭^"EݞÌN$Icar-&:T[lHy8m l1FFfiJCi"Ug:n^(E(:ۉf*5Bi =8%Ev{gі$2ȅͨLqrDX9E7+mdZ,a8y6hwg9՝B%#d\Sg1jZ[ :Ev$k6MU(dbɅPTհ/n!pmsKh6Ѱ)CZ=ІծRYn ؚ.y&鴳+I+ۤr8Ҥڔ˭,Mr0:Ʌ iȤDf1i"lŶzXR:*hv2g"H3^^G9V,Wbڕ\jv̚R,-\Y&{rTҼ.3=m;]a)VM\7hՔ܉ٲ.mjT]fѶT]c; j&RѢ̴l4&"4Y԰"m#&E/7f[ZV5t屋MO83O;muucC;ZU mFSĶEȏ9y&:k;vI\9[n*rb,*nt4&rZ&U+E.S,YjBVL]sm1)/P.eЪ:ua"jXӥ-&*/Bimhjf""^RDT4qDUqŹ3vzj~*l&Z*^\ :vkQ;2fe؇&F6ۧMt\ѓjj:MTۧse5$(PY <. ZٷantF]W:p̈d7$! "Iܼ·s:u! ċ9Z<.z7lfoēݭe3`V# lX0DjќFL9.BU  R X CGm˻mڞsauZgiһeG-rgCHm{u3gkW#ڶMk[".9BDÍ+ц"A306Od VR*,V)tlΡt1+d[]d$ClmXѻ*gZgA1&JށuZ 0S2OT2Ln6#Eڌjm1\mA:tdS前Jmђ'fMUJVVբZ)F2!c=+θUֶyrZ]6xG$#kl 3Cо0C .R ɁQ1D48K9];FT.jse]`ʪn‰ٝҼ\fW;I6pXTJ]sЫ<̉C"Vn1T[a"F͟E1ĠwFGv JF BWU7z$q|A sT?#+Ywídx E!z?De~âLESYQ00 ")Ҍ5 <O6d +oa)k%Dyn)@t`>H(" ( )ŕr8MUǐÈ1`$:y@6yY;.0G˜ ¡}8Ab?[@| ^ǞE1=R|!W=rf h8Cp t/pgAi5L68Q0gBr<c"`C$ 3"@)PCWr+WS:р"d"aw= ubD' C_ud\"i (eYBc&4`!Q@9*c0 s3]sȀH~ 4fh*.-$ObeS#`I? t{oY1qbAE7S;[:D"Tr4!~H}Kd`&pbӾ;z7\7<@nA@ұå8NN .^zOwp8'<i .Q=?OB0b&*?)X9xC$8F" ;==~@* lÈe@֜1bWX|4F>j[PTa2pDٱP0"\qQu11}t2{sxcq'D#tHjcc, b1 g\`Ĩc0Bpj?p4AEL@W4p$QupFCw3gvS|eqǫʰa?? yM@ w홙+φN?Ԏ# A@K g<"zi4QY% تy+L? I'Nd25"[]`ĨF!\tP<|w!/X.7cLZPiC^+t 6@/]Ɨ8upG~G>aOɎ*gf9dyr q{d1\ c_)I~aP #}'78U\%7S }`*)烾 5lp=v`cgLG|33|@7A5uK0~T46{tfKU]+0]$nhX:>wl( d*_%)D@l޽@r~S?/܇b^cB*ѷI tAS?_(<l|N C09c*墀c"F RU-=!Ot*E"=@ r (uP]" :1@wU6E9T;P<" +hSjzHЀ"(j@! **A5eW|P5uS<)P5Ca5Cۊ@'`!Ht:E6_:+<ypMxS`@?PD<!# kC`@6<6 }>}c_@"0(؞/2ٗ! 'ѧnFz=0R?d #&6Hmܞ6p&w7w^7`;@=Hz&l7wi$ǫG=o}Zs6ю0ؓFyG=hd4n0!> o$zèM}x!=" Gқ=9>=qpGp{tx`,>ޏa{ 8x!#x7xx񻞩}QWwn%wS87Ctw@MtMMύ.0ۍHqfzWW_>_ ?i1鹮?ӽr| NO{KmgөNۿysw㸟Σuvܷ,rzrO_wo~{7éO=Wz9^z_.=O+{{Fa1fxf_뛿=O7vퟰӹ[sjc|^iw^}-K\|frn7m_G3_֝{r|gxj q׽syӾOz9/s'6O/vޥ}Gnx@7Ѹq_u[rxTe1!݈?75@AP F (! 7$?aRTᏉ$j˃މTxODEAQp&riQQE;r@.p&D]brJ@@Py(Zb1}eAQ}i𓳟% a_i,4ӱ;Hdj2Eb tRC٪f[ ~ϝ|BzluQ@X]K;K&TuP;SvYɛBT}xBi}y(#|'}zIpG0q}oYdNIxā$ݓTu 29IN/-]`Wh5!NƇӃɼLo!h&^D|Jhvya̯m9[rzEF]M*^ @B"8uz r-g9֖ 3XKXZB]~4,mڑ:6Kt2Tk0=]F}){a?)9J`ūrj0. \Ű(>"laH$ݹӝ5hk/!СzQD!,N 8b,T"MΉJHmՀzRa 1MHfJct93Hz6DCgNBuMmMA@OT( 7ւϟbnk[\ 6ʚLRu"9PIHV!@5-+zW]#ZJwVg}yW-2#2[;DtvREaB - e~/&XK]x#WӊIqwmTǵ.fyJYckF ݵȮng??Gzzz͹n@ڝeO=ڟ{b-Y6*+ؕ.2GQ/QXeyb]jŤwް&(?O]amYaؚahji{21;m HxZes? _a_JhDA%$ :5zQD @8c~%h*l}joʞeZ}ynwSЪ`KdVow<ʍ7wMOP7P?J󪀸r"/mǢ +6}77ك$)j0aWQMc ԛeh[-y|b a/CquXSoz3/ѺeǢ@i']k}cʺ7z&P<Ʌt=ݴc_- .$Ԅwʵh'0==<&y<8Gs!;rmāmƜH?/ȵPϟx%^!Mat}`ʲ>o{=/ "m}K#uC٧'Ȓ4C\[-HN.tqeBM mʝX 1&˳DIҝ ]Ixiw^ER(*'}M< y{>&OWcyܜ8'bw;m'bv(s$˼TNěB(1<$<&Ժ䎤e͸C7=7j^Ӓn77&9U1 <`\GnI99˃c] N79fIۜ7JnQ(H]s)\m rsID.Y»5wDgH1|wfE (2T,݉lOį&9*JF!8 V/;wM>(N7ۺ!ي@\riRv\#D.~@9'IC2˲iPyy @ 4.yw8Ò'%H"!S'luޱo$#6Z :/ʯnbL#ir8~_:^e<dv<0JC$YQNUwzPUu}=]ِ)LǑC )M$k;_d}N] חmcZdܕYhbb"kBV\l 8Tě et9v =N\.$G;89$tH8''67'nvǞv@:F,9=QHP# 30Y)E& &L.ѧN'Ӄۓɧ"bE/ϞO'/~3ӹV}<*m }vךeSzyvT}Eu&L}ȉ9 U}y>sU1ݵ䥇&YLE7>ž*tO/Tϣh;p9-N>qʡ򭰹J۷mP*^_t}}ɾHg'zyCwqtS9Cr=圞y6PZ8&8$rwXt& NIFԤޞ gm!a&$$"@mÌ3Z6Q[bTon\>1UĒaףYU| 1,a^^Qga*rqnLUpw/c5][=A}klQgc6# {.lLCf:rdHJPnt_'ދG[&<ڮ v0W׻9ݎ$@%Xc "e^gRFʑ$l7-Q c$]m/ 6n5cG(D IH7 [>~Tw5Z^7iæƖ#[Ow;d4 ,Z9g1*NY5EbBRC(C]!ZaQCvy>QMwuN2懲oSWƒ\MXÔ}Z=r6:mRa6#a` 8z N]LxGa3B|Awe'ձ\Ch3&OJDԜ"idEv(y2LpZJARԦd;Dܓ4J9ۘU-]͇=]+Hmlg]`ۚ$P˱6@'m6o!]&/[baI޻"њz^Lߨeg{O(W: N fֲ;hw'=Ci#x9]nKByBƼ JY]E86"r l5yYV$fpX[װ"dP ЩZEH;D@5bBEM*t9u]u3W>8<ӗ;;28ӲϞW^I1ޱ;w&Ǔq˶G<ܚqnL҅DP.ZZ`Hw!N d!N,PrSv+%ܡ(L)P90J#o}x~m.>@U@Pk[ FR\+j}ݏ1l Ih/R>[lՆx6$ Cfzz{-2F4J"mlEmzƶnyS*+U%7}BYy-ϯy}Nɫy0StX̋"h9oz"z$&n&Jt:K.ӣjL]{w)2Z3!q-vYRsQVvڗ3(5GElhխLhmk{+斯3I$ݣ:MۦѼt0;n̊9GB(^<4KlFG^d4=Gq}|+pZZ}=vKW?>LsR˼@ 㧔$HIZ#9((f|%x~ߓc#B$lX-wz3G/TUeKe]DO׳8}qԉϥ~xS,9'4c'Ժo";}w;x[wx蘝?O}#?TzZ"92y=ї.$S.]\A.{hB;c=x"t$o' ".wk[ԧt ,#UC b'rh@نu*}#?m}tȘ.V\g>יB1ldV}qԄ11cG]mH{Lj^Lj@G]}K+գvz5Sct8m UsD1|/~hpd%7&a3)h[&g>'4~ rKe4ιOxURykkV`bRoԜqTݼĝ:wYL9 t|88::)&$*3/v7O&pC´v tj^Sʩi900SJhGdzƐڧzZ v|z.ęy uˡ Ps eh&`=G>뵉bg LdDmҝ*Xo`!B,m7kB_ YMPO?}~y;Ffc:,ɛHzk.eɍDCnIi䔆:%1b$k*fmv_ghU#QYu٧{0"~vbYznዕ0:OU#(ROd{ c}dD=6I!4PQ &=+|=<N@O&t<7݈r^@d< BjFFP>Ԝ-cHR'#!@vChֵuRru d-N)zwK<7 @FGP"d-̥W ZZ! TBZEE@)F(JQ\m2$.//j^$̚(3gty^NmB d Ju* rC r`LURR*ҪR4(* \^NH)J ЪR EP&B Ph:*G`cmy܆<25C72E<"]TP"dix8.ܝ^p1,e6<8Q0{FDג}KL  LJDrE(ՄGHXT&N\")'S9J \.ܔLrj 5hgi8p( o;wRlI4Tr^t@r :ފ Nf$ N=f +AS9g s+\/)q!"&mgn]c ]“CȲ(".\s=H(ڹӡLT-zvLgΤQw}󏾎 "#^9QG"S V#"c .$Q2yN$*vABC.P'l);(=BfW$ZP(`A)aK`Ke]"IE@=h$/@6L1(<9ōT;v۔z7!;nwƙ9$ IQ3i*؞<ߝ9Jq jS\KTpލeY~ԓ7ӂtA*yvgkIN29}b~{FbmBKDLNp. B))2Rr(W HVf"/y M (@&J! (d"&Hv+";r5 -& ڶ@-)Hj%5(nw"/XMvX@@] @PjWRA(%D܊FAԦ@LJ@ "N0Z06!chyZ#կOؓn 1Oڥ5?tZ(k͏HbDĝ-H=Gd!l5FlmaA=9fTEEh[1hNuc4"t!)h^!Zr&wVAQ5khŠrm*B|{Rn+ fVش-meU{o{"c2e3R*ӧ56,jۙEYDrXԄZ)1$azWJIyA*i!7Jz?>1d= >{bfZ )^L ,+eƊ\Йˢٝq`ڳZ#!=!s|2cͦ*)NmB(yR.w"仰ϟ [VƗt )q/~˜7~z_eZRԏE M7=6HVjº%^K6FXi+0!~!O5QG6vDZ}}a̔ءVȖPϴӌR|S-|Rǯj.*6ƝM:WkaȾN{$>խ|bC_>҈?y"ID[M%q>~ԏEFI, p!OavιrtT'9J*J koń鎧uLMh6:֦Rz@[3Y ~"e ;( i'nvldI]3:w(#̔Nu.hAxC!tn=m'3.P,3;6LNމ {dhRBg"I0gB{ޏܓ9;fDE璤"iMdQ,"y.[[ t򂙑Aߞ()%YQ&]v8,mpk'qԢi~ĝ2*\ =$Q}t @9 !":Adk9́Vsm@PbE3Hb^ =2IQgm//M©+:Jrc*rJuC[^cCTy\'cI׹J9$̴#gmo&.e36Ig2gEȩ2mzǻpOvģ{bvkP(4a'y1zE3{T-T,ۦ{TmID7_y~atbQQԏP:"U2&r컓<3!g g$-9psӶ$P.C$ qw`쳲 ^"DŽ28L0lR= O#eFVfrԖ-bK( h/a* 8 y*!aw;.ǐ6 )h閰(ˉr@Cԋ)x/!tAάA׍4Gp m2!aDkrnK(Y mb_FE2fW> y%hƁqK!_gUV ѬJ!9 ) 0H2ϗx~2¶%5Z-#o1~r@!7QY:(ס2㿛=\ rˍz-L !#>^_UOEsfRR<<SGL/ 3_:ЖPU~d=e~Mߥ@rAR8,Εw'D<Z Wet}#Z{^*:9*&y;{~R,y>HPP?U77Um$UgJ1d */v~L: &)L".qlK (s - g[$2K]ƳtcbIa%Զ(}z*<+ђNA F`IJY%^PhEAWU"_><(lL0l+wZytq,^DK \ 0఺]2*#ξrg ^̙^ 㹷8N:$˶Q5 ]r8N@˲y}rD= B.M'voy1c?DUSTTJJJ(_)i&IS.(dTNNUN/{zs7DLmRJH6hFf r Uctgos|S;4xwW(s/(DIp3޼w KŐ_Z );@SJWrw<=q^VHAry?g58]$_tqw58<YJFa?SpT-ZP]DxWy|%*ߪ95]0!`P3~a_c} #"1.MoǏGpW'>>Y̧ћw6X$dT4$IjЍ{=0u&4nB̎F28&2\,`G`|9Uvtk>*; 'BKҲ1ro@5mt .N,2p`pF<1+> ijMg. 57|5}MKC.uރ_[BH1jE=c))~uY?qEc'jyMJwόyxyz ~o^3]̚g@gɏk`l4C8proV8辰BηūU;AѬ%ʿ1{ٓxsޱs)݈ .pp #O@d`O>$Z%zDn`EO" 40\ž<N9Gn꺩$_KOHACOt9S6`3R;2e&-بW"VI}/mb%Z- L(5l NŬ)(6ö7k('BQVRñ:DHKBfc|yWy Tp" i"p(dV)i+P ®-|r=.Bl#-\' 1;{~߽֝[,#TŒhfF"B!Hľ)b$=CވZi$-mȲl7N{,݈PQr9,n5O鑤j>+ ػD a5ھ>}jŬ=Y[[o/jo1i?W|91pOy_gY)Qjeբ|CKHgٽuo&*'k{w~|; Reѯo t}Ls؝'8T'ϐɐ=]AHBzJB !E0N)ɹ&C/쁓k98TLbwq)P6H(Rb:w9&ε+%mun4*WoY< QC+첾sKk6Jlv} =|=3'<`}]lEr霶,N.ͣXm\`@TVTo%,AQ= ke,"&+ܓin~!ę[|I#ahS &=eaI&8ZP+yFK$ ɤgl$.+3R$lhKĉIOf lԴHB 8SO!anHcub{xKm1 {mtƜ<`b}ܮZQ54d0ev-0cBQ"Pls? >^ eF"Nj~+%lqfkNR(B ۏwN] L+*\FF14%-#Mƥt߱>8<໤': 4*B0xz}LJEQ&&P/7r2 5\[Yz%j^]&ck/"JGAstgot )"rase'm3&*R,FJMKh vEz$I7Qð(T(r(N>tl.W9)Ԕ;NªV & %)HABRL5.Hdd K'P.J<Sq P#B2MHrUB5 D:N`FBXߧqJhP\Qe`e`ڕP/"X[T6me"IϴDi,~HOK=4Q@7 m#j? 9Gn}԰4;=什1AG9Z)JL*r]:!dvy7);l΁vM;NȮyr\[rww&`\8ؙ1Ę Q{v{=حLHKFZ@'kNh]fԄuPN҈f]u[lg_hQ_qp,JmI U~Ԃܑr1 ?zA~\fJ \?2m1X6 Tq0 7sATMgx \ﻝG;_US"GQwqK@p$"Yƺ]}Sߌ5(4^3;=q4 -Ϻ0 nku#)]bn 5?v&;0і!fkhssms?_1S/m2ӤrO^3R*dLu&;"'%Pj 2yd 4:ROLu}q)9:tLk.)Oc>.Rͬ%};%pqkb^}\=gߍmN2yZm BPˢg\CE,-D [C&%:Ƿy/"k}&%B`4#06",ͤN$I&蘱rJ҅ DuJ c(5E3ZtҕAQLDDQ45ASTMQ4TQDTADILE 5DLA DUDEQ%EE4RUU5SLLDQPLDTQ4RUILTRUUUQE$ԱTU55TTUQ$A4A$QTUPDUU MSQSQTDPRTT%5QMQEACUTEPTQQQ 1TLUCMĔDP5DM1,1ML0SDKEDRETMTQTKATHP$TS1QAEPU!QSE KDTQETT4%UTICU1TDESASEQDM-PTPDQ4TES0U4EQESEM5DAMKTEIMCM 5PCEQ5434!M-TE-L4E1U4-SUU4M4ULEQI-UTQQTPT@PRSPU%ADU0 TT44S5TMLT4?7N((mh DG,=/SqZl}_7G:Cdl 0y&lد< R?lkz1xG}?ʳf9'az[1}kDHh탥f-TDuɚHtVp |3ر_Y@de1[1?|RT5-_`\ xsS`5\]Q̪Q"O?T'T"<#90KZ^* 'v@({3R{INri0l7x y7)eїlr3U>xMOX/'ش1unv!k֝$7LXJ}GYJeQZDַ%źf˴څT"TufJأރֹ1)ԵtHeIͬJa\&ߗo7 Lp-ly <2y:ضѭAR؁U [⚙d1e>2qOYw3jѹmzm$,:ɮxDݎ!z{3cgfx gή$\iA~`% Hw^jkSV(t ;BBCZj,kI&v@oLe8SN o|y)6m#N6Z3| "ʪmt5*ӂZRF`mXuuy؟k)c""<'*́F /5<JH&ϏFth#S{7όVݬ4ߋ( >ڝP|x~R~{]'^),i*_)ܓި x9ReFw;ے71<ɞ2vAAT Yܡx|){8ݨ")b"DT2gn.]tH]lse@kw ^O+N!&9]eP9ۜN3]`Lr=lDq$yt I.}i7!ȺE\s?y0>?=DEꐓ<)%( "#.-XD֬e3̘a1畛֝Q\\[hiF-؉3ě4%5Ɍ'yF 1ma&^6SIkPşϮfe:őj+Ϝf<_YgƟ';tISAIBKuQ RJ5_^FŢ[emEreh#H{ SPB:C>!"@C.ɹ3Fi7; x 'O|/uI)>4HXB!ϐUf)Q)neϱް.LdUBFl<.EP`\, QAG+ ])R2B {x^PyQEy'ǾiF! "Ϸ~kz92j)ij R(r":TͅWCNEDW({ՐQp 0.ĘҪ $1!!Dud+ +@*P9R+* DE 44JR&JcB<͕@L% 6lIPS.DU*TQr%]Ve!! |r]nv\&,m0.$4NېT2QS.2D9i5- `R5dd*0c@  nMCBQlNaLyE5) n5%P$h;JuRNC2CC(apPLO&av"mS$G8Ӱ>˹$<^PJ]! T 0=Y(.sܜnTnN&P k f90NUP';8ʫnz jYQ|Þ`Z\j9*(-)8e@])ܦNHkKP*drNyr=hU^eȨ̋kr%d6UGfY#NFZG02#W{{f'섒Y_E0,()UdJPB\(EE5Is5j(2Lr@+)l)'Ia1!Nԥ)@U,UUUj&jI2Uܹ9K4;)ΰʠE8R$EAVQU!y1rF6cɂVM@!B B B4 d99d䃨]e6P!y]S;لQ0 7ggbc72 z0úz-PumN\f([ՃWaj+x<e q>)!t5-h$MOf|ɤ[XҨ͕Ӟ;үU3Ga̞teⲸj. zI)?7>+7фU]>si[Q%,%A>="8{C8ut.g}"̕*H GS$ȹt( HO: '坶0{&Ihey{'dX#gJu{@{ȼ=y@c۳!Y읛@E3==}yB^D̾Pg-[393 yE@i:qw4|y*v]cQ4,0QPtP$U󔖶B~]ddhH$ai%I.$X/+_ױ%H+Gmhve3f.#R!KX@$; V`~}cY?f|f12 S Ai5\edTVx>;73ߘϥCì{X{ܿsz*}W3AIJbbJ\D܄ h(l5 A35u9!XPYJUJCje$"A!E4%"qWYʁ"") _ߎXm|#s(+%gp81 Z -a!Aa=߻՟To 2Ġ #Hfb`Vff.rz.I&4X|Ef$49DY.0,L"QUJѐQV -2-☄X*(6uj&yu◍[u`:bJex9+3&˦̎ޞfå0 -y ܻlT,mO^QuiYiF_6VMAZ$], `" 8)7ze +iͺжXK~i攥n kyHb,Q(7}\yD@WȂQ!DU D?e)!q.@@t*S-a9wLlG%SȄH|v!vٲPJHh+.DUR & M(1o+W}D_2ױ)y֠agez܇"[.S'S {#1r]w~J\D$!_?>|[>V$000j7yn:DLG֣YV?Ͻj@,$cC x-B>1;ޗĘLDIIش?:׿7\!RahWiƴFiV}wb#<-"RKcFj<]$'+[v%m){ Iɱd֋s=7m%V@;[9)g;vC#wPN9PgI42OdP ◟#󶱡!>2'4Do\o׳jR0:6 V-[lD,Zf%;,D>$k~YX5޻$[[%r\烹w8ʆ1"uEv{96{$jQG[(@hKm  2Ƒ슙.u4e6Q xB…5tm8HtD.qu kwx|'%IIej>|ZEsH,wSJ¤*/,^2{Ye- 0R[Zy&>DZ){_[T6\@96L]=N~;%)b pEQH%DQT*("M(#@!M*҈: S~x\5<('xo:Ң:C8S"rJi6n=ŗۤPIN*OyV `G`99 ̤b<m0mZB73k.+R/[9plJWz%hEal HxЅb3لn- zn0=avЏMjaխi݌bvؓ` FuX'wd!w- xJ 6$܆ƐRfBrIW")P7[5mp"_l5'ݻ${3wCv_5E:kȓdg[8)^lBK~k.h-T,-% E\ҠT} ?$!ݡz !X&팈]sU O=۰[3g'Ĥ*H}>k=!u֘bVB6v bC;TXhRВLmN}c=arE6L:ʳK}mp%Ѐd*d $Sp=VJхThTWQ!OsdRJ*kZvBE"*>x :A.ci7 E)C͙K,Ӝe ƓP Fӗ4RWN!\rrsi>sEeE4 RvY$htaLK1 @TsCƩQaD\iʔ%ju9Uԣߕgd5R9 RTI>v!aYɳ*5 4ɧ^ijZhbIJ:%ZHḘYFone|tyAKM"+fB#d8O;(O= !=vC$=TE=s m ,C sV+RD56DZaseh~7I)jBGŇi5 mvL7 }:wPCߎ4xQ] R!ML0#9}dW4UA4Ld.gi3J1lK1R"uNj}ZңiT_hĖIb2VXi3澶Rn_c զ69[b-;S ~YU-8F)=eӭh,] 65]kyXEjk-ZlB=cđm nk B6(5[*ks^`R|Y=h]QxZ~{bU۔ҤW4dܺ"捷Fi֭؜_^ tllѹ]%0ݭUR6wPMy[0DS\;'Scl-\nDZj]8Q[gnl2I")DŸzԍaV@8`ZQ[mPp#ϔ|yӰd 1! Ă!NRNsG!0$yċvC (vx*>^[* (P (nu2JMAA@R44N]9 D'!2:J!2Hn A@)OHtYvtk.ss8Ho.k*my*ҭ%R#.TKige+-ҁv[eȗ#~ߐm2O;Љ6MJ43gYaX 8u$~$*lR1<-yMSVEc^xʘEo>'[uˍJ6ih„C ܊CїwCϐˏV* ~=Ǿ{z' ؗ3C~B=9;R te@݉&=Ko_}kJ-L]TB˅^2gԦe%g^}RZkvCvnsѭ]z6ӂ0!VQx{+Cd,C'}WbbMٓKzMPEB(w* ΜL|mؐS4sPnNkR)2L* 4) ALsrɰNI)5ϽɄNJPڥe^R](aIpK}Jex-NNIW&sCv$$mj"ЃB5oVʑ^"NU ^}#/]|R )ih+@jv˶fzhJ{zz=^̺ʼnQKle۳n\&1kX׭{=JЖ$gg6Ų9h*J$}X]Tq73[P iX2{9e(%`B\iMp7@96̖\䐶|Ox i@دŚ̡-aH-1JQG;϶Ikl;m@OMi7a:6Ua<ħSa6 uXKR4_bnZѶF>tK7L=mO{S+vb*&q6C%c[C;UW"5M,gP-[kZ xYDZYJ4(JUkP|`Uך5U-(4 i/̨Ok uvƗҡǷ;9vLgђj.C$ڶWF^k46+\f3?D|j+RCA"K-ʢa#ΔMlxъ_7}.'bl&Ξ6K}oH ESuWXӏ7%9wVhxX"K!f_]l* ]>+Y`W~)=0?YgĹarsbq_WzS }2-arͷKx7|J*w{LJF%zjmlHWYbQZ݈>b­zJ~c)؁Rzw,A JwFnoDG[Zϒ؉3jZOEd>IweuI6O v;]nBP\(s!!=wtZnBm(8vI$%X^^Dz AI{_ZrɹRsE3G"U{yBlk\6rMՅ9t&9'4M&'y󺃽iCdwy^t݀Y &^' !0 y`_YE\OTmu+@Ȏɤ_?sɑ`W~&#s$3$b^Q%DT_6#eAfejTRUZ:cY]jpLia yYE%_9}5ᵹ@-;n$tk!Ls&eW;!2;P4B9 j%%B&ԃk\5*c@nLrRB TC9  .0m=!'-݌co7QN&@<9536ϊkzm-^aVV7qrU.6EPL u꿧 Ŧ*qfpe.^KMsi(ۙE©P`:K$$n`SwBCqj` $ZQ飧Yey9/'҈P)" $3#QtECE'߯{RTzM]<)|Gzٶǒ}lfO;{jj2׳X}+tD(0n 80{0 ro0Pj"T!ˣ7"ت9*I&ܙ _q~9e5/&=?WC|Z@jb YZPL9S,̩1 M *l- k9r @B\ :."SHs%v] VTDg< =r Ń0Sˁ$MHA))yPlKB4 0b!"eD:F95ƛ44u|O9={9ˊ]+uN_6dрJhMJ2 *E5ϙ k'3iI{X%ɦyuzVt X5Ye "jV#e?z^P_s@n,:Vi.6!ۚl%؇tih:|O F<瓜rH(icu&'ϵ5m6mQ_T0m r6L]D/6Gd/ "yArGrOqsn^?d9O* % hG*>Of9t]er+ *]TSeێR/w0e7 i @ (wP PDO+m+:el,mntt=Q96!6ej^tصJrJ6ѷmHalr[X3ީصmb#$g3ҺfPu5H$ʹn(rMG3~ sÅ]:WoOqW24OHmmr< NSrmʚW:;8'(y^Nq8DReFaIĀ ]y'NJ7ӼQBgeۙȩ|m\"rTu )##{y~RݽǠ)}eu@BZBث\ʏ 0Rr&hT܀ңH#T K]&@J(dQ^&%2 "ŶhTsWJ{< Tܣ[jI(hvh_$ϓ"y@)=|=zxP^~2GgO8$Po[人 X&2 ٳ2&nIs=8ĈjвOCe FzV"\:|lj Zs"6M/O4.[ P{^r:$t#BEP*r!c*PTsJB"m2 ݉c3[,ek5^W|pRӧ]j"FY77VF7zKtc|=򢇒%'bNI1"y/\;̨ʦHC=Kx¼Z :X y .Ť }ƚ%ZllrTm#I5%Ja J#lr}?+irUBpHH#ܐ%$YЯtmO9:,DNvA]}NHl_b&}[~%6bFW*W[6].f٣(Xg׫,YƊ6&&"MT;bOÃuhx lZ'b ͹*:^GFxȱ̗[$NlҬl$7 Ahrޤ˲Le)u0aMLVul%/Xg./3ֳjj 5S͜\N1gYj؇Y$qQiKS#2)wJK](^ĬXyXͻ)ٌ6_|dV06m(L(4y\ldIcKmm:j2m45O憕!,%98*֤z %aX^l!+JV}Kmؑ+1#._i`jc͒xLy[D\DI=i4K{c}wtm˰Ia@ʖ5qX\ZTe8g 'ψDXu3M`mMIdo_1ynHUXŮ7KY^1hSJاtZZ2? j(=h53t͟)Х3,iD:(X&ݝI:2Ӎ{+}}`r7-)y 3EKԃi2L<#ĤY{6l)gJ✘S2*}I_;kNϨB3:}%KH!NH^>= ]a))h@c{y-mcf&6XK+{:fVamMs9(gd^9TSD7f,lXE=q=i'j߾|C!%!,[Ϯx/1#B#LTy$+X; ;9S*"$Ȉ*(vA"9E.I&AEe6]EAB(.S.ErT&UQDE2"G ]w"ar H)*HaLDTDE5ERE@cTTBPTE 5Q6cE!DLCM4͖A1"jpG('ZwV; Q#[d(h%UALzr ST-1U- A%TTTUMHTE&P J9\*MD30E 1PQIB&v=~8ɧ%5/qzI״OK}lx2|?7'mg$20-٘SPd ڣOtw= ~'Hɞ5}kTN*ۜN&7;i睱$›.ƓntwvZ{  O ~"GPe-DUU4ICTpVY\.3%tYtDi#%+ :.t䬒4D£*@,I*(f+ E٩ʹ*jJ!K,%YRiaKZdBIs$-B"ql S,TJQHJ%-J,"J bXDq.Z$R҅Z+JQbIIVh0(%!HUȺF .fedVhai*))Re(JȂT gT2TLkBYjF"J aSJ2H4;"lZ6 +Ek4T"FJ Cg,KDheДTРF\2L,TZ",V$vsf"TVETBÙeb%dDs iZ˅Z!UI5hViL.4$$B1 ΄UJ%+Uri*JAR9 B**r PaXBiQE! Wje#Bʚ+"(@IH0$G9R"300UMI$#:C*YTD*V9j0 bhr*PȤLKJ֘,RU¹u0АN24t%8Q!$#JJ%$ēpfQVgf jȓ(U9G*'"D"pʰŠҒZ*C̋2,ԣ0VZ-iZГfel\NH!˚$QQA (\TYUHc,"ʢBL4(8(PU%lBU"20 ,E%TPQ2LLH'; M+,,kN!Q@, %j(Q& q6YE&*BiV)hZQEJPjUJZ"PB&U+BeQ'NQΩIĎZ!j\*ieEJ"¢.*VV&*:ej$HEL-Z2U(XYh!ZFdAraU)9aBIEDU4`UUWT BDŔEE@DR'BUIm S9\Q9Tde:IfAa,Q0A}v-<ֆyQaIeI~R'YsVmM埣0{UJm"lOr!,vtp$YrmX-IR VFsa=k$W>BJ۬ȵ*[pOUOO K[V4% 7)zo$c|@N#7d¦G ؼ?DPSi6 aD(ZD(Z "Rb(h)  ( *bhZZ JH"*((Z)b"( BiX (iJ hbJ)R"!( Pb fh(hbBH(**$"("jh&"B *h" Z*fJ(*b)&$f i("Y^^;xEتbVk.k6SklkY't,"1NlDE ='w N-lP <p&jխ;ލh3njD. .+vA{'S*~nT0bo3VռA-0?>j9ϛzwe&X4& ;^kvUOMkK?m??QCvb|-,g3U7{3>gazqk{7ʏ+ƿXtj?@'Vθ1:=1 ᮧߨMۆ[c|kQǿ>=ǚe^7fB2bLM{7.+q_[ӹ'hPl8N\*vl`<41&]zfR1\o N !uƸ]>ҺJPt>5AG]1)[_kDb*Ogfnr_hj:-%} ,YC9k/e6!!Sٞ+Cz"8#ꥃE5`VL1L3\-  YF2s=Ac\ Iv]K]wB+x~s*Bu_%W@3ۣI.\ϚZycb߫#&0đ XP-*9T4Όy۳[]}G:}!q$G.1En`QQȻt<Q#t-P&5gKՋ<6A`U 71rIy!M ;B|&Mh}'eb@ABh3I%IQ")f > 9*1dGEfpdlƎ/D3“Y^: ;R$~}{_~IkT|/QNGnJs3‚P6Eh $d? "7_}O =n+PDLf =<ap$=8@hヌ3Š(X2/$ A*8!-!'MaXpgچl A s#=yjMz۬crf.HS9vpRd }up@S#̧$Op*P͕/o6kz7wOqP{D LE),MN@&G)INK/!9rqKԏ]zӸܩՐľ hscD.uU@IfpN.&l=?&.5j´.֌%&A2`$ PpENr/% kRuYm`i'&Y7YsYɣEX2WLqPl[lPL8nKtǮ/&؝Pd~2C3(A<z-:[}i=,ƫ(V"QoOjBDGr1C$U>D;a\| (VG0P2>9[3 WH8#- <8@-DЧ}v xf|kF8K ㄉMVx: 8$3̡-qKk(h # R;!:M@~3(@9"rzG"u gsyo޶}:v%r ‰aM%O52}Ln2n%$UuP4Dpdַ#'l:G!\ o9gouk2zhCwڈzѫRi@-<ӟWǛ;\O"+quhAT6k.IH'GFȠE'yyYHeF^@A|@dG!gMa HFܔx\0<CRv5&]$>5wx;^j}\hS2>ʟ>'pLE=>zA 7Aq*l(:^AFr ڕLi{(Y!Hu!ro@dnF7NԏmbƻO>o3ΔO|z񾷯/jkPD=!s7 ){܇Qx[ψ|H~gZ2 w3Zq=]Ƈ#wR}`xɑ1>{x6ar9ܞo{Rdr%A{/Cxd ۭ\2w{(Nv5:9G'(9z3~aSJQL_ X]f܍B8KrXwCs.q.Ib&d$DULOO(trI4u*]vEV3vBRC-`sAy͂d 3U} ._1>f+b=ClhtJud>ݵx7$g̍Ϧkr{:yf+p3(>ሲeaFHqqڀifs2TϵKEY#'}$O =QTU(VMbee)2nbQNHKsKQ +(m㴇IYOqq^+>X"}5MqDtԬQd'U"ݱb1l08g>կlxp d@gz8٢N0<6,˹=q982,G=;9 Co#g+|T9x$ <Ҳ<֕1h}4G]D#z1"YF^::Q*=ft_|~o_sWv~Ї ށOMhx!"K$&DF]qW&ʄGpQgk.eq O[Zkc I^/ @ȼq!XBzȦV'<'WbbX"jS#^M2*֭e7KS&MkW#1h$t tj֩5pv*lmh2t'ףR/cYsȫ3ğܨ<*L)=[A(=p5L6Sm(\)rI=TZdڍDW%tTp2sBVj6=s%[eN]*ɜ2y@US:JA\֜R5**%AM6%Qe_<e3zU bgMkMƣfH&6ƍ6rI:ͣ)=u\xR:)D7*M.ܥE0쥆 vF*+Za\iT2 E  C  bqiM3y)Y͇SE.n{LX2i fT&a\##B4vfNŵډ+aZz"4+bDÉԺ]g*Klhn\T(ٝm^7 bPÒC3$;#e-B.̏[dYrDrAMɨmiygn3MOlĶgH/2ٵv6kXmݝu%3,/lˍu3d&#YI%UǽP:f]X7g mjqѩ9={[TM6M*=Įnߛz8+Fŵ"B6 mf$bWXIJ*Y*f^ mi&'=:AͧYtOXc*!gk#ä<]|@DBxab24]"mntY LE-g2&#+*Ԥyi\Y떳BS7WD?S;Q \gb+k,QAFl)m,lBmHg,U(0"K@JCV~m|$,/Lwn[z$v1Μ$11÷B'SF[imuw)L=`ͥhM]0ɭʣ&J<(Z:TC/c"!Dዴs8vL&L݅{9ѬFJRFZ( . xr v$]$RpLml8tN'(fӜ(²tDg(ҬjlgCU:-t3=tT; +s¨5j9y*sh^gQ1"S',Ύw-ADSci@9ƕ7t2.ċ̣qv]DAr7/*RQiQMWH\aܼ+Eك笻JLӆANQ]QLɉ.ˤ}]X vNs!&I@֥!p+nyqɹLyjNCzƓ&  H䚄GR !|~ϻ<"RJW6!LDgzUʥR)#M*p"l(9(Rj+.=^7RF^J=<i̻Dg;\yWa!ml/813rmpcjۧS[CF{ .4*LkU-]gYl\*&9E4“(bLJtN`LRO*̄!T4\+Ri$ވPO@C\rrTydrb ,nk;uGn):ؑCf42"-w'Q]lO8Q2.QpUi)*)[L"(9K(!D!fZ^%L"d6wj7+!Q\mRHfBu2'".zz1J W4+ ֕dS\sKW]"ɳV˝lf*g8vTȏ޵zrM6Ĺ%Wcղm]]DWҩѷ}sFtdZB-0E P2UQD45i:T:v; (c;r2혉7;jrsLW*M'1JOsr I$N.;սrqPw{=l͟o3o3ǦEpDniY3)6RgXNŃ-̶QFEqUՠwC;fƳs6=?^xWGrl=ySTEyg/~'1=(< 1D^C!!DE/+~魦}/s&`S.3!fq=̗nYхMosՠDeNjk5Tk]/RjW!U]NJn5+כθshVBiMyT*x_sK/u0죍,'fxԍm)^es/Ma@')$gǣmb8J?L"PGG6p ih1&Mq6kddfP;c|kII׬M@PQQğ MB~yv>}';N$ I{$ܹ:+Fs PP;:rRݜrOM/'"@|A8"h 4h2w*h~ iA#&8y;J|\j9{?K`x;FO|8\odq3Ϸ;<z'U:.3' ' ~=#'ν{Quqֺ/Ei'Ӥ)[ܽh@hTJ F4d!ʃHt >VԸ:nI[Ƭpf/vSK3 , c?HS3x6Q0O(ti†] s!xlC-/IYg'(IS!Zx6$D9Y8v^^˨]Epd@ngޤu³ )ӨZ(@sX"dȽ;KMPd1e(ӞhI@:Sa1ݣ&MBTKsӨфJMAS6Nd쁫EC9LDθ'ڵ[Z{:q>{9CLl*,hD%QPQOgKnNDg.kKَ_X,MRj6 cGW-ƧU3̉*urH"K;[ld3ͤsQ@-SE'Nn\N:*r:I<-Uқ&6)IfHis՝V\MT\ŷZ[XvfMI\ʶJQ''$,c ܎'Sr.T32"H̲5(/vLL҅)f1ތ:kn=hv@|ĠSQ*"Vur[axQ*TV'm&$v[F旤%LVM;K t !&MjRͧr2#Yzvէ90gj {9<~xITf wu O,9UѶdAz-]U nSXmwuQKZ ![KIhLS݂42H'Y{\ LLn;0#g@)}lʌ;b\fb3֮Tɜl0c\5¯OI̶g&{4P6[l 8&i*Y\+ؒzKe9MC$xB?n2Oʯg:&Qȧ$HL<p\s $Tg+^xpXx]=T6)m֍)&ȹ*,ŮK̒rB6hHs("IT9^shGn3m<_F=yMض^ڒ5rl ENBN_["UYuh$OH~lЈSQzDLW)}.R&lȈI DQqd)pJ8î$;ˀ O1_'WeStAاa՗0˫C &hlHS2"a[פ{5 F5̘&sڙv vFPT'0]aɵxmc=tFXM6D 穭HJ4#GT-m}8cey#M^ܲwgVE zQrM]_ͿɷB"F 10[֦K[J!&g7hݲJ29JTd¥ T!؍EV %63GX^4mD3Zҳ:S0 =F}KļNY G%ڴY2]"-Kvj5L"m:3Όݞm%HXҴ^vD$`]eKxٔ>irCX]aYhXMIb֩JײWEIsdfÅj あ-$9iPVUXSmm3{I1%dۨeBfs kMQ]" ('|-"JaXlY^$7za񶭋s3p[H 22CkΗ[E\DIQnKk_o<}S$.$&1TJ%d,"օEQ=N+Lv\Z荤+ 7nZ9ULL3Ș_{DŽ|ëZmV϶ďycrOI'lk#ZeK%q U=WkVjɹtclNUnދٷBYybWf?fWm4dmߚQJ HT PG5ћfxkU^9͘uvpֶ[Q9fYԉSEӈw.eֆd$9dap;iprX`]. V5BS H%C!u"r-[ape'dA J\-%p3ui4!6ؙ]>tZ+ܷV6lCarcfs1*y28NaG֑NQ \T*lrQ6֏r1xɦ :H]%U1N%C%g )0}^M=?/v/e# ުa{1,u[Os<7qC=ֺ6evl~U5iwxSqGǬf~~ջ ~\QLZ٬%98Ve2QwN9Z#Vd\*Eu$ȠS"( DGWM )8W[,Y+dEarZwNpH\ɔUMS i\$3Hd$Ps3XP*w}sNQEHbA.nUT*Hagɔq@#ͅ}y_ 1ȺȪ3,&RWS._<ɗI5dqɻ *P*"4.fJlE hy2E"EWT.waC.kHJJ+siIK]Qmi^瘲8ks"uJZj(RISvDʁ$DTȊ.P\HQjIf*GeJ)b%bER𜙔r"*.t,$YFHQ¥IJvTwʼdv%t  +$&\dAShY$.Iܨ59DvQh(qE%I%5m~[▹nMBQrD:]*H.ӅQE5 "+4YHtR5Np)UHaZE#$g8y窴YdMY(K Y)2+.Q%FY4%-.M;#T@pM\Je$$ʊL4J,5D5Ơ2u d W @ JCSBCQ?R;wYVrk܃ +5QvaLQAz-h&ArD$ȌRtQvU(8ys_%TYbd*46Z 9Fg Úf$ATaaQ1#XJQUDE2H*DDG.F"W rJ$K )>E\MݢdGϾ~?]>J̊,\#$ےE iEPRT"!<$7*<eQR0,G .t$"HJFQlٴ%ȿNm#v&2BO+t*'էUR(ͤ\A0,IҮYb!g*:(fZCSTö\JB]C9Έjʢ9ew8!HHT)DtLrgEr W“-*.EP9h.PD\*cκ!@8* &Rp@.Z, ;#;C G샙AADBd֕vq^tENL3 nnӊyY꥚f<('!G,@ Φ$Z!j4Et,i%DtJidd$TQI=N|O( $ U0-̐8'ZVYIdcZB%ЪH#{I(eH `dwKX(H2'"/qJ]Fo;g<] !0\KYΨ\'j$mLX\*%RU!)9'Lt r +#T%ΕG1 .$]8QS"NA(cCHPE\*B()PqEk*ꂥ'CDXH_baE4N*\EȽ rw9YT( + SdL.;T  X)I :Z?{^T`~$jA=5dpvdsuԈ$.6:7(LֻZ-ul䯕jx?Ca[O}BT_"z{˽7QErLW |6O<3\޽Q6tqeS2 3QSgˁSq0㩗/UD(Y'[܅'֜N^s(^]r6 ^,[@kw럑8}5WcquT+sGN>ҾAYR*PL)Y2mr!sӜrQgn?\Hd+2ʹ,6vYWHy;}5uSFgW>4)Jl%PvkUmY˘k"/;n[Є4nбmjFIɞڇjꖒ%mޏIr%4Z5gm Q)#Qj4[vDfKkyrqZg]2Z֊W lC/evԚ$Zk]nyQ.ͻl[hv"sLa6W25)l!!KXEMZPAndEGV |У2_䠱U1l%HB'9T%}D E3"1(bTzF.ClB3NK{=6\a䨦zŰjهJE"pC+nGM<N-Tx"QVjYRB'/k> 4V9Jhly(݌kBףĢ[tۿ|H 2BDB Vu|TG??->903} gjsJډpg.MCvzRBղVUWm42lAGS &B{9ݻ[ NAFoнwYrc/;ђ3.ÌTK,zɨ*K8ZqbJ؁Fv6wvF 9}4;P}kwTqȗbf%Mz'f4#A 9i-\8AuCy:Ѝ)@7AR{B#u{wq{q_#MĨGw檂ָUq}Sȡ3]Y*'ٙO UE류>$M+W bRP!1ߑ0Ȃ_$s@@*$귑GQ,hio9AuꖗX:`A1Xޫo\I۩r(]uY04hjfŜE 7n\F3wzh;8۬ I^<Y"30īLE]QZ:ƤW)gD u74u!1EU^ J΂.sp#wq{t`j&^MGq-s;<0m kĶ drx:pc&GtR O5ǗyaO&Lj] צdih9H-Fms<vgxTsPk m*OVn?6." ~ 1.-- 251c9=8ѳ&&#OgCeX;9[9JOF0 _5W}|PҴ^H/Z_"7:-Rpc Zьq$޵wn/sr'q)?!DSs^u? ~_qѕyqrhz>s;j]rV3lFY5l]U%dj"Qz1:s[x&@F(:,pQpQxrbtgw/ԉyK>|޶5}U9Wߝ]q ﲲ ^g|δ+beM3h|z/h&vFϜ  iίnGCLGW@[iֳsv^׬|֜\G XyT*q4s)Ruu[>fuhza>%B}^bTy:ǎjB| OuT::|q+S 9CP( Lj1sϩt>+sks>vB#˓sBޯEq:rw|$B>Y޹VyKKC5ϼn{FDYk;־w1 ryc+L/%M޳q1scY? 0Q/f8j.UK Q2sy/=_VTPc^I'}ms{Hp9|k/duYg$]B_WsiILc}6+|SWy뮢 u7OGTkq秉+\@X LKTTfhq)Qg+b<8\M󘡕r!Z,Ctg ř$K*q5R 1 گyO6\kČOv)}5KR9='ȥDt\'qD=DȊqc `!9v\٣yȓ ̋mڔZf #s,klƈ(`6ItŶ5b%i'lZHYӗW^Xni^^'BIkZsO"\6f&S*CL˜uÚgghΈM9rmT֖ bM'll:UMH9*&JZ?Go~~r-J!i6d+Yd].RXlNf)xSmZF"sa!;^$aɨmYcW!lJ4Lsm}y=Eϯg[ٗ,l]6۬Fczr' YClebv~WnQ01]7WU#pNį[S9'YŠ 9uO 4YD5$&ZT^\P):g[*0{ܽf4g쌋3PA5 "ռϿ}|ԔED PBH pcPLIlg#Xef(t]^GE<0k"$$m0*"A$$t=)u<(ꁵ>A#"nȽ%,U+Ia:Rhfu9F`e*+ɈFL-NaYI+ =!W>"u ,̨447n#> !iE p]ɤ90rIaBg %D"*4RU*)HЁS*QTJDcjhANI3(PS""* Z"] 9GVw"t[N$p60*]m!ɀp(bp#h1Gzfb|g͡^%[\V;U>MDHj;*"Wb{9$XC":+9Fl Y{ѥ0CH7C.~6B_es% fP@!kg k^U@-?quj3ZbH5 BbAJLCpe]2ViۃFFr¸ͥYA2ӵn]m7P4h+!Ԓïԧ;Ƈu,_! rV%a<46P #r?~~Ee! ]Fȏ2< (Ln=HKQ~w5]ҍ=s3drzO4k7j@(x$ñk39x磷xr#]dI}lu@]Ġ '"IG[o|[wn wjPB=Uܓ|/č1D=T2u<=Yks~nwwskJBƺ]wO+[l ~nBn) ϣ&'gQ3-\!ak23u ε9r`+Gq_Od q y G7\!uU2VTzג"YDVI5Htp"$ܙEi 5*U舽(^ Ϸ||Ki5Dd,mZc..0>A#WIJ\DJZ'$̬,MMD!D +"r)3wؐ :i+ڎ \(w <q-.ZDuU(Nx0͚:g͹iN=Qh mrlu") , T1Nhݙ8WeRlu;ډ#z#b犔_[{NvTixLfo%ýsLye&L-9^7&jD`50_f,heX${ƪ< ]>33|Ȋ/f{_StnNY[wYFuD pHE@g(ɵ^wӓ):gu}Ur@ue'p /zPq){>`uwuո=A,+qT đVdp 3D(MP@i$du'^>|wgr8Ӿ~`Olv֐rC<0yAʺ:_|OwQu3USFi^7sCWQQ5߿nB!&~N vaһo(|<4u][uGq#-:4{34$F?|yθyfx39 U׏)AIPAN2(i")) ( hb$((iJ&a*( ") )Z&h(*((hi "*bXb&(h($(""ZF!O]=xn FzQYy<#p ϒ,77$FR|+V|}Rz#O.$_7ޏnz1~g}Guy3sA2:ʩ= UKb6'lDhTl4W#99 E#<>tyt9)>D?M\;38*';:gm۞+uqQ6cBcx jΙ3Sz'cM51j%ɪwb_ɍD[ɉ.oDJ/̮/Mg7k"9jŋ8#mђG[ˀu+G܁v''~!Ab>8YA20#le7m}+kaL:X 3c,7\j7N׿xvk}8+"%Go֖2F"\|iNV 1MϸL#cG[K'Kٛԭrx\O޵]1R㥞ɫ5ruh{z|gܧ\@ B- /!ԠQH89ԭnr3Kn(8{@䓨#N՜ !_(~, ,/'7ՑJ:͞ldFr}s?("?#|{ѕ0USp,#:{s4j\M|BNsHEr5X6>YKBz=Ns7ҚRT'MJGđϤ'yućHf{9Ak`cS7{'ӷSߝDucVckj4- Zv?G*?PpZOP # J9=卙nj" N6+Q苈cȈ߈VhG\&̼󱠪 L6nmoh#笡ړ-- :;ሁqH:!aaF~nO F$eRHg"3hyukzdx#FU dYDE)Iq5 &G 'RcD>(. #&5=ۛ<'>!7QspA"X+ї *,x'H3o\|k\a2@d9(74  00+$pQ7Hgf@4p4шQQqɏh7C JYED1!EAE,Q%U1^rR{CEMLAAK a"DTDU1CMUDUQCT_ b h$)dI1MU̱1RDCE4EDQKTo2hH"&X&)(f((JX(("J/ "i&"j*hi> &*)H)iJd""*" G$pxD_hvCP=ĠN}(<4R9jϮs=8U8!2FϥvFHgm  #Xv@d{ tDF>6G .< T@KE!9^5Cۍ764p6p0:9)UKT^"V&I˧Ȣ$c>ףYqN,j2\86p fBm '7gYvf|Xy;Wͯ!S=/3q;8qɒ|QvX~;b#KHD``#󍱫VgQwz$ h2frȝ!mDl#] (Ȁų}@F@ lC^ ɓc K+2|8k[8NNӈ'Zx>y\jU댾Hi2p_#2&;P&N"O,: rb4Tio>%9̈S j[:<ċ;nH#Yt(iW zԏN-~@8,y$ uw}RDz^#D,b;6kMY8C(XGp2w=@Y'ͬllm# {ydtGOS:Ke 8N|[q!ߣ`Y"hd q)љ+Ɣ!C%z<I.C0!p11kT 2b;ӓNO`실NQOL7Ɖس<V1$JDhP -yi)@"0LrF(@9,ZP As#%KKD ECٳDdO#Y.:.A}Dn\oO)Hc:ۏ`{[㠆P$Ż0H9Ͱ/+' ¦`̞5T0,돌zKob88wa¢'㟂BKdn@℺:98- (\=O1@xAvb}̗%δo+ k߯/ǜu nKkT{\\{uoÜen0:hO,#IR}̏i|@ / @<?nu}~ӯ+?`ryZ~Ȣ =tjքp~g:񞿃AguoZ|%׺+fhW"5zXc]XqȏGͩ6{}B+'+#bq[|=\Zg/YLa 'kZs[;~BtoD^lx_c/|045~ŭeMl nGoO_ E[~ZpF~j&G-~ա9 sQZ]pN'N WS1g88Ǧ2qũ9,AB#)cgc ģA, vG+yD%mf͋6{;Tpk?{>Z<<"|XcnOB&J'xdzKj#Jĵ bʒCoKD .> u^O=xd!k*EΖ,1ޛg0@})JFA[ .O>K۾{ M^opl8㣒6z8DM)#5W?5cxc{]a2uz/u'@qd#> [9xQZ?1u3=f:|I&_qrh8pg>Ks߿>`%g'oBϓEl!t091^GӞ ikc/g^} ^ ?UjB <9w$y>g˴yxj50|;x]ьNYfgA6p\<}V"OC4j{.;uzTHϩ5H}fn'ƦG4=f@G,ȸ{Y㗾VO=v̥wTmfuY9qR=xDHLv_vጡ~5l9auH=yQ66b}(TBLԄ ҂G^5N V 8wQ$$4qpODj(FʢZY|u+wo: [4AWN09\z8}_ $=0I Y!F~.y`vV9+y%X|-̨9=lm5Bv Ҟ=XF~޼I=stB܏}[ `yc֣y̶0ͽp 0 g5A-sȧGr.វ`_;|\¼}q 8dp} 5,!Џzhvֿ0cl?y oƍˉY<}̍}#tY3YS#2o-3$d#YDEg4[2G;b)C ZE]/z?JAWRc7a]-ZQR9+owBcz GWsw\%\-Vodg2z(qǽjYyn<5~]tֹ~ÓbBBG.^oǾWޔg`uyd 6$<?|up¢=҇z?8Wa???? ?^J) e6ori&zG%СG*(|HE+ƏzuIlU_3XGD\ps2XQ<z񼐸\xk?XMd%wi.3|y8+܎ֻ7>*&o)d( -ΐN|AY;2§w1eesNJN\u^\\zYxmE[]zoUAЍFKz1yM2y^tc5ZWJeTp(;?*?oxtZWQ j8^2=!YɌ9!%Ou$c+׭o,Ѿ(蝮ُtwDr|3(_}cX\K{E(keciH{Z9jN+U<ή91Pz6~2B#p8d _ 󯊾R,܂@D%JHz9;>>+яgQ<<1$^Q<']}!t8P#HsHǿf6T\;?' _|EtW! :#d߇xr,8ܞjlw^=r@YK1SLWkFc`I٭,Qę?~WG"$c1£ LI܌at">/'GG@?29({@y|jiC n^ЏRWԪzM=B&B ỖïX}z0ၣyizni.=UdJ߾cPoyHdb̐>b35fH6W$beQ=ipp$o3ژG3IxƹUP2sR"J[}cQ ]Y#$IvZ 13ni#-23n򹵸gyq;-ʨ֢x9KPtwhMU|W&:W$},_ktR!8<>Q1?*4:98c=9<p\mz'=wNH<&Vn7KQH vdo[+Hƈa6}0&h(>{c 9_'H{ZOp2菙K'KǜI|Ã9~4/ҝG߯}Ucv\-"!"wƾu?gLo?D} }g<'|m<`ԜR#ezH9!% '+70VWZt'}~wŻ7bxÇaƓ!N'x~d-uz82vEgDC|qđ(pQ@-kĀHF`(v$=FȺ:.ϯq]{oIuWMcR^mM$K֤?wYWD9SuKW\Zׯ:A{GfֳYŭIcBBG}ww(!Jr~% OU'ĂG 9 W Q)Pqǯ"B3CQV93q||׽vHYF2xsꦐG8|$9G1V̨PV LǖE^s=d#X;Y`.Sn[9-;ea@ +;CT 8*X"}GpYp}@ըQRfURcGP<]^~}?9,8 ॏKF<,vQ'tF*`,)οS8H'^n}hs G-L6d#bHw8*|D4$E b" /BA2C _iBHC%B¹r3( 4IǤ0e+O[QBmPh##ed#܈W ##0ZK]ȍ &pev/cNsR'f!V=`XddA<rdMz˓ǽnhk=c#\78)1wZW16g'+rAsǯ4>gZ|z5$zz6֓sS1Ɏ-ZY=/ӬSʲfz[4tB/zmp@쏸\8("4|=BcDDHk.@Xh/1^~=|lO<²D>#P̡>n;QNNGywt._Ͽ8DFP),D9nyh;_u9'r= 'j1.VGiqhC Pq fy;tsBnʞ@Syp! wmz1Q <-+;;aj5l}% xHFXc+0)B\:}oyХ&ę+Td)k$}wzTto,67D#9qu&H#wAQ]2 fO"3;qDJ(ݕ*(S2""\r ߾U˕G(R4((44PDUP^{aA_8aUUQ3J5H\TD\S#D9SUr?6Q9$A\DE_D'%G?}{)7BTUMM3ULDvczҊ*M"tUUUdS'4 UȬMD}XEE14DUAyĪ)ZJ%f&))(ɪ**(&Zi&`)r$**QrQ.B"=EX\".U("s jhhehhŴEkCT?^ҲQU&f1DD1JdT\;(wD DQr|ʊeQXHM W CR#r'e~fUir&dp8QDEI DTsAI.pZUTU\"*\(IPUӥ\-Fr4NrIP3;+AȂ-5ZG(.QXQtȡ''V*!apYڈJ'(-CK 6 eESHGEr""LP"NUUQfPGy+SVrmiTTEG*LZ>{BMKY86AM2A'X?2(Cϟ },?&j &~5 #Եp(|#L_q?yT:Y=edAm@{Sԡ"'XѣUL̎y$\Kgq}$Y1 3g9#TQ$a+[-./QCz#ϨpIzA[|!G~7CAw[<20y_9C7:gh8>MռwUn\`#}d=vru5`i?XF';Vx~O]@Dߵ3$dnQyB̸3/\}pvpR Pfu!Jp> ׯ'X1u΅N:xę:5h>F^T $Z߿K;־g:H/qyUܧ/1C>[ xA":&914_\'=)c'3k^{:\t~s̏OZ8DA>S1DOC&-*wVϝ޹1=z4=kǁLOIa1 /\Ld>иF}xZ]\ z8o~uz{W(sDquJ# ]L\+u r7,W=1kwW;ֲJ]juŮiRLV\< W<]F 3iǽ!T5Ž3Bg]dPjyK:ϊ uǩCaGB6~nF_ƨggyqkocX'#bs[guuwJC#Ke,K R>>Ym[Iu1'qn5qO<;n)G!̸8.b2e /\h<0 G2Ծn{QpQhB2?uy҂p,Ͼw!f$G@O&o4G?\'$hqJn?|6.s[r [¯C?۠+Kk&@=:tPy_rj2P=,ygT3Z-%`w{9#n+=💆0 o9BؾL.8XmtpQH>]wSKϯ!cp:߲H)F53y\Z׺{'AyUUUg ۞8WGU= ӍP.1jzYR:"k%5r"xĘ";e(|zYd <,?D.{Y,2Y;9".? 8$'wTg:per`\}ĩ ;b 2I纜qzdEȪnb(*fuϕԁ:0GPߩ9}lX!uRsSA>vVI5mr־Rw/1*|A'>NHPKK~\;wX=uy{{LB\bW/:g8yuH*5 qbhN͐w#gΟ>OL}E|El~qt=nOԱ0738T0*/v eЁ87K|@~G7]#Y]E_WuG5Wb9(神feDI9][q 鲷mD0!Mg&o3ؘ#Q+>zԍzPC/ FD\*^d8=5|߫}FB^ŭy??oׯ,r.Vq:f93U9?5m.`c/ ЈYG$H&q\@X?gazyM !M~$5 rTq|I@Ü3 $qr争^"<KYQCDBW0ʼn0 Bm^{'mϼvNK2xZZhxT`Rp0xǑ>O$(%Ӳ#8DŽ &:AN5Vh■ %%Y9:-N ]4SH 3^D\{d ;ԙtӋ#Q#ӋB-#|U%a'+Ȧ10;u׽`?ny͢|Y?^-v<$@wc<5pf0 NIN'$͒@bkg$iW`UXxhDdaH*P˅G '\zʖ,q> 6L"G D}04~% B dԚhۗ }ž|ԦJGC:Ϙ}ȝuď Iz G!88 hxDDܙ~SSxC.<ӓ5gz#CzV"q & ȽR$W ` dPhe{\s5ޅg|A&YB~ 𨫃L{B9C)s'uƸE>Ts<" ku&OΣ.{nQ.vO(Z&r'֡s;]d_e\ n_Ku"8w2,O$MKRc@]t~ dxX=EJ$0ay>dz2V$#isjxs#g\ Y9W{N28oCZ9{uolUm6qX&^$DIqo$Mpa "OCUG|DuX(ZZRUg9 >S$r 83tkN4Q:"N~H6τN,_(8qH8qExW^y8A>i1چGY㮠s!)F %9hU8SrDAL=|˚ݹh<_ ȓ[a^ H>wU-#iS`Dw7KT_u=qи&~V=z ^yϝJhp#λF Ȓnc`ߗo JXD FCDY0emIxB ,P#Ye6u(WȡM`H<H9:@CsͽD"vhx8Xq$AM&|^'㍦FO>xfڭjwo&sG?*׻Z(TA]}{׷|<]l8J}Uyi B*EDtⰇKG01z U-:}c1"! sxBQ{܌KD?7c;$c08 8U Q8ɳ2v^ڲ%;I~.II9/7} P2Z_(x@,-g>aP%l*dd @E Q>5f ,Yǣ4_kc{Cݠ+17&^擨3'/:5SFpjV?u~~ }ir,Ohz .32o_NO7?;>/k ui<|Vü!}h ~u5%L}wMB@=ߞ{s׏";KqnPݝܔ<}Gם 'yIk ;Ϩ5ws{=:w;J'.?]'=IAD}qј#%AFHLR(<`N\Npa84&X'< Dԋ!'< = 4eAhQJIA&zvD2;I2Q;`eyX3mr;4$A]Sfql@$p(1_v&zE5wύa]Gao^9l ))e, 9y*DH %.c(pC '(' a~G1(D2;4Y]f8UDE3(?foFUZt(/`X8#N9~+f{ ǽ`}eeC&T_X+DURƱO:~5C5%1DХ% P& B -|=JT>;J "ԏr<[;dG@t''']X'P\#zŕy(*dѬ\E+ue1kD0 7Ȫ>k>|vs(ݞyW=j  Vao+JPCB%@ݳ B TJ! RHH(44Wpn܁@yAHHJC hBJi~g!k?>>k9U]`"ҽ삊ĘT -%!BP2)vqܴP%#@ 4PѼ)RZ(P=HBR? E2!I@)"), #**BKM8M%!HQRR,24=@Hr~c W(|(]uϞ)J)W~7KF %s$ 0A5 >1{r CqU%r}H4}J]u &[~'Q#K0=S}^i7*O#a7dO9"\QuT=X$sADpUU^bDH2̝<\DA&^Cn>hVok@cEs b"d-Urk|o=#^ppFR<+!/NJP\O1 J8-,Y~muٲC^015P8P&wlqIH#l wJ n7j(J0 AJ$>'Tk7ۏFh2) lRp2 Tc,wJ]~ul;GPPQTPy&EFaC.k+.sU}tB8P[?}L{5z2;fpd9I8;# 'oyƮ_S_w7?["ΰSyΌlp3h%eDT:8uO~xuCkV1' J=ֳ`Qƻ]im`D!) p @ >HTƬ ʮ>Eu/=;zG o5<S (+%;4kD.75ÞxdeÂA9z$],Uc\EWo=sF6#בŧ-W6^dN0Zh b87U#938&H oK#u "$\}@׵${HaF@_5) gƽD/oEG pA#DI?7~>t'%_y~$O<|k]02qrqS3oǟQ4@D6DEL:Z'נ?Y$Uo3RQ(bY̙Q$OYg̗PkU2kbyQ*i(m25bcCq1E۱S*A}[x8$ă밸S($\tut'0Ґ:Lwu"TnjYU&v>'~BxӗcsHtd yS99C )r'G81wq œ*y4{DWnV%WgyXKQlWmiKbyГgrHpp/r$+DQ;c)}O=>`m5ˢ͙ϽnJ6h^nq91e ¬h#.)ƍ2ƪ|d6"VABZvgƢ /ZbD\6wgTTY֍nф#S: Ymb1 jg&mU2YQ3֚tǛuKh]mY꘬;{^Og:[0)B[jXGCtky#&ڷ_ke :ƹӈy;[jyї;2ۑs q'ﻷ@?c/r i<ˡr5dO&v.;=i䗐 o7j)VԝCPZ-1\wiZ&O]<To;@o;s^o=4ce] BgbWXf$ pFjl9AK[*-ٱl=ojG] ub;+-'98/;sE.s7S;4$lUbi0^Ы s}nyz{34Q%G{`2S@vDJQr?d~gJcKxIkA,r!{=m,4`EI'ϽUq:yafm =[#[D(pיY!m/M@L]p$P5Id1 ^BJjG<yHE=#!Uz(}7z̬NHxL#ޏ!+yW?yMC&o%^sdwqިy$2Hq[9phj1D=<4F4KaҰA+9!lN!wo;Ise\U&.r\f܆\H8RtR`:(dagqSoz&  s 8l$7g&*1FXBVS 05ZFX%9/+յp"גi2QTQHdAAE U"BRRP4U$1UU1%-" AA@RS0UMD%D@+BD%,EU@RP%5T4 TMEDEEHD4M$T4HSJHQE4JKUE%#DMPPQBPRETLE$DCCRTSM!EU4A@D#@P IT1-RTBSBI1PP2PRj3 ?>z@L +"-b*1M*~OWׂTXL^T`$Dx"IXgs 0SB_+}ee#([a`Pf Yђae[۩YdO im_nu]v뽠- Ydb(X"A#_d66luhHmִ,l1—I.ѵ2:xƻ oHx \I8U2!XˉܞLyAvSɁ$ 7N<Me\mtѵWP$޲//-meL1C^ŅaKZR]lrڞr݊6r׶C&b)m&E:p6sB[Z$*M+ C*؉REj0N:Sɹ˅@/ U|ge1 ;qh J䜒w H9U% Zj@ѕ.||*^py $!;y NSnt@E >8bwP%(5;(n2B@~{BS;?^E*/s#ՃmV, FQ-17r#C)>/ Am5inoeQ KH,6Z--vW+D\$&wkX?W[Z74K6qfro gp5ٗ8w,IsGau; ۱ͱAH@{GNznHeE;%1D7m)HK:+CWCXKSEv3Y+E5yLjgum98*j*ShPͻK)[K|'XY0kx&b!`ŵ#Sh6L F^)`T;1M?5V9 Ps*"hhJѲ{a?krQ=GWo^ [-eYQZ]er*=:S&شܐ}_{myFm?c&BLhɤ#P֥IΌ(<|r)&Qtt zo$37:6v1" /B5gR.pmE쐝WӮ^|VOk8NԲc@DKnxy&t\U_#yдL{;zd5SF0KmTوGf,{\/{Oe#v7zzW5Ŕ|KgLkXvQ|m6\Xk3~ƃ3Ya,BCeK=#ۃyQdi(Βn֟3mN{f+rK=rhzEKv#ɭӯ3qT([\bR->u@cj(fj*|ޢƓe1k;-;ϙ y&RER+Z4I~tY2qae ث-h+oL,!MUԗ$-ջ;(R1`oU ̍].i,nY.RՂKe# E-ܭ#;Ft<"M2صΌns/SR^Hӊ*( 6͈[hj.MZ")-#_kIz/+cMYY 4䰈]DY߽;BAMa ^Gzx(aO7bQZˣm Yvv71{ {j:1f$[FުN ړPt~v?_Icb<Ǟmً' 7Ţl#{󟿺("#ِx_X\q F'pLC}knf .9܁Oku[!t=;Y z;n6hz*d@-B Oy5 !ם̉=g Qs6ws|w1Dp+^Lu,ݕmȳ:&Wz%%~$wQFܐM 1.zQ HTl I#u䊴 v0$PĄW)l:8A$G(#ι ia;{n$xo )`[ 8;Q YDC|/UR' xhH#)Ip>A[~aI癞3Ԇ⣛ju;s>ݻJZ2J% u0;8pxXGPO[<ӁuagQd!~uYq |, 8C h"؝`! "B@"2Flo]{Tk5w~%u[sIk2RQMf'PRDHB/r:q8(!L/+(QČ@& 1?H֓g1;xQ \S iJ BFi(j h* H +V'$y#Ȓ*܍B~tīnPHNo8$'@S(4)c E Wтg9ǫ.y=UQ|"g1( QmUmlPABy5¶*;oQmni6w'~~Sm@Of jaQ2bJzCɷVmH8 m@`As"(0t9IM)͑˷ Ue>8 "y+̜t;se @i0>!y|r 5 h$4@u*r @]4m)7 (@XN2H:r ""UϢ(=Yp **?}\N*+ӪMOasCzQ}zc"l"BwiB\ĵV64u7:b5h-mNA~w 7y8ydfPEz{J\L5DGTEq01:A=sv\ʼXh* pI\@w<~yP~bm֥On1%9)*;B86n֮k $M{ptP9v Ϫ.0)!qU avUǛ@QvۗVZiNo,2Rj:9%\p#MSH CMBRnM4T]AP%]”j90@7S@Y-H"eQ_AK>gNH'Xr.QN(ڞ^ΕX̙yH/SIEeSc̃XBO?}~ً%Orq )n`epꘁ¼z)+egvzY3 1j2Jޚ~c Dm PU+@PXu:ĕp\oi[:Ǜ/#g_ Z{RZ``64c=sp߾z^5K=x"-R;?Km>[|4!`Hԇ[] )U0RRp8p! %Pp_577)B$"!&(QXUVS]W~OjP 3)+0M[,{_zgPL|OA<9ԅV#sTL'l; >L<5M{Be!Ąvqm0"V qO[5Ǜ>g΂yx!680Q'Tq1&5TN-rRERf?S zMJNQE0}uV>ˮ=x8.v`Id`do7d G1cZB&LBD) )zTݰp»pĴRF?2PHJŒ!J ZBqJh$ئ H2`ڙ&ap殢P vX ҄𭞮?e:Бz8pJhՄ~G2ޕ5(R9r7 i܊T 5Z 1&92yI'>Z>lĴ ]GDyQ_rR (pLB'_}s_??ǯ"%X&$#o7s5K6Bdr&mgTrb؈b.:ۓ8sNNv`99*9L&7;c]y e W}I=!qH}I+ڿ9D'h#2y IOyn7 s$xVQן!wGHY$Ot!rͫ|iJG q9%p H(pF[ r"4Q#G>|, ;o% =#t#JJJω@ȎlVMaLR,g)Tm%g*bf&/MZ 5 ˋ\hգaQsBݓ+j+So7amogUK"wtuӄ % [Nt.>i dJmI`X|U 1tЃ**=l4Z@<5,=b֕;׵mH4cH3d="=#m sߤJIyE,ܦ͛=^SZa;QCpQds|) %?^DUpbLGDSqGZ@MϞ;c<DypQE<YDR٬K&bH_]򨏺yɈm]- H,D8׏#@ ,~{wnj 'jyT!>f,X+ 1d@ᒯMq~<>k_=[v'\IA2궏D{8O1ΕO3О~gK4G:n|Al!KӮsVH[Gk;6"WFx#g:8 \L뇮\Ρ>0Ys;čoNa<to#7 ʒ!;W4<̟QuX'cwVmlI4?s&"07i_?}zωk @g0Y-"EBh7~}ḋϢ]cɝ];;) FO$<`yznuYZmӵ{54\sNxq5<{a~%ߖDGꠜ9ZMCxON?wg,4?ngkA~￧b ax 7$ B d14RI88dg1a6PB@6$_)7A-[HI &/JDW KqO4#PfGIʽ'V6#.?U@Ti REsN$ڰr|Ne) ,-B*~w`S:c8ձZy q+pP .mkXq$ şӳQGE fPQI->Em)Y]H0 +\D6aZ:A%*H!x! LahFe! 2rDD7FFȏs!xEip4S'#0,Q(pC0i,Oav̂.ꛙJ܊7B`,jV4f汥bh6~Ad Tw@M>vM6(cD% %Mq&=;>jҍrV)3UZPvޘB ]EY!vDj Je4YnA iO:Ln LR0ے<0R_nv 5tU:P#bJ3R&Iuʼ%"$M&֐ ",+jZ$AfX6d=?\O2T&Kq b$¨UNURFP$ Ix,E)hҋ#{?UuKpx4) O͠aI؈_3(SLQUĩ+(3PYkSP~Itx|zj"ff%Ȋ)$PEqb:?!WV@<1aٸ`d33)d>#pH$@%׬-a8Mq"V4"f_E/VhJfI8 6f!֓չ$3nU<(130DJBROYJZF!~Sf8J\* LceK~ƛi06m"2HJؾMO皳'QD:s2`' ڈ e&fড*b:2kS?_Y$N.(m~gL%)gى6_ڨ7IW4$&f!m)*W殧ȦaT%Ӏ`ĵ v9QHJ "TQ$J VF|8~sVbFi&`)^KKP*r!'*S F$Cc[3jjR-'CTU*33RjP`+HP!|4IcƢ؅H0 &RWARE(AQR$,C"X?EblĕD1X`iI,@2MjTP >"YiL _15CB5"§D,֞me_.b׽ڈCff_3MsJi} ro GE&xAS,#2e oxlկK[!D` .ʂ gr;ۅ $vl/"1)F̐AEd5--+6[H~J*b?ow3m+&4}GEF">)-?c!UCj^k9q_uyy>1a)J(hȓS$Ru-+߉F1QJZO,V7Po31 y˯.㣗ڈjƌq95i?H3`bV):[8rD_+X$Ni|' SΤ2$TIJW8X!$`OvsUNx (abyQ&aÅ6h Ag' u?U=G![,gwYCl,osvW*3OiFwQ>!ݚb‹+$qH$AOݵoRe} ߩDwQZ''~"EsI2*^mdnMTdeUQTF"ȨEՕS}SEET¦ʪdj!"j*#9IՁWĥG+JD>TS.U™ɗH#G} "_ieUTnp "J*h=OuD0qS8Fer8QNdԑ4-DP͐^wDhJJ**ˑ*P\*"NZMQT%AT1䝔D\ҥ91U ,^g%>"J(Bd( eWVM1L($h()f?WHd'Ri>V〻y|͸i.Fb%*-Yw (91A#%Zz<&woo`z ` u*oރPfdkބqq$L 1uI;2m Hllך3!oQ72+$J51G;s8/=\x|#jzhbU.-v̨aa.3W1us̈؋(\a[$D'0#%41XA+" FYLc#2~pH\yB-"ʦ=>9By&b|^U\+t{r8v9|t҆QΦ{1^rG"X#01E'R4fۜUEuDsGXj-uKJ*L @FZFA͞}jrbcCB3%֞_THO)U0ȇkm͚OԵlE{)MOS^"JvJ(rg~4[ tP'uEdV?4L#+VӇ/^|poM,]tPd6<֞󫳞^%Dv4ӳʊd^-%?%wVQJuSL }[EѨAAL+ClO G:+Ʉ;cVfȄ+'JAuRdP+4IS#Sr/']Cj`5E)2LXeű.Nyɹ[EE{K]:qJiab-%Is<{u=%TqͶ3킐y{=Q(zX\a{RhUUDunY %q9]#ԕBK$\rVJ9r" .R ({-ʒ=%F:RR]L ؖenݯܾoR($"WԧeV$&jXE!-" sXSk*1P2yupcFP)EiPREPF@@iFJ)Thi(BRZDbhThFEJhJ))VjJRJE))A)Rh(iBJhT(iRBi))XC@M0 :I NǽqZ{Lb%!}jecbO̙@avQCyq]! Āܓ;D]%"yeuY( ġz׊vP,)٩kQ-]g{e,z]pXlHvv*hr*gF#R" `&&0D0#XZV4Qͩ{םJ{YF>/@ [ԐUufm@*y:LaS1mv'JؒhȖy '[:d7n -`%V61i-U}n#Km[u-׶u[Z)•[,Sb辰yj{2Y.\6/}2劵P'ְ.&o 6(Ͳ!6!M a%qPϲѶA6U0 /jR`5֔igڦa_R'v)vlZt"nl2aQj%ljhӠv[V\_A g{@[-t@iywK!@䠃P۬vuuԺcc`&>hDQSx90: /Ļ(^ڿ?ÔxlĮ: ݓC!q !8avWD[k %. * VI ,ht7(j{CemišyrÈY6ָ\ݢ$%'_4ʄ3+'˿R 2`\mQG]{ͣC6+lnbafq-ee֌m8$:jTB58hmZ^mhS/6  -̤UV/2lQIUkkf2'C\xF^TM-VҨh{lTcP\_xk;#}WB%7[(E` tlHY?g7h12 ]~Ϲy7NP60f>|7(+(@&}tOH;Wdȥ.dB%"0Q{p7ׯ\(}vQc "EF@ m*OA!rȊaMʊPzA(QNU] k@a!8PG.I5hNCN?tyI"`P@hbev6N;6aqܜӢ& nQzA[}a<);z23=r<9W f"dyRyzT_=FXiQY""rDԪzXDA-, "ª4֒RV$(k]bHY5Z j-ёs*OtrP 0,~~]c .~ۑ$.QZT3PT A.fm`Yz(Sʽ`Ittrp:rue\uBZ1LՌ?/|:7]|V\Mym}tC\q˨S~UWq%ծuz[Եj}3ƣx9u&8וո#7=qy q?+D=\E:>f ~0qwfLWsbʇ#|~ߏw?w_п EW@ƲjM_nD 3c̀3  ?~_ V"N$C4Id@98-HY Qň."+n 8KtHAfA vK"v{(ef:D`rF88883:!# t]B!Bev,NtfsGS||e> ǒ?GoW^sO\MOԛ W&n@h@9?%]3D/W<|uw/hiu)%F)CçbGAoPHw=ʱS,BCrO-%2}a=q-qw" F2F*DO*|BZGzGGR 3G f"}"NļI NlcÉC$ $XݧhE[qHz҂kzѕF7#CA=qC&hDA'$ K8TrĐ $%H\;L7;o}qdIg\w`ƁGߧ2`-J'1J J8(#@cS.0.12f"~}Xa`m|~iusD!Qsݛ4IJop(|b Dc 1r4DU!F{s%`R#g$ RNT4(ŹjjϓM} /sdd+} ɴNH:xjZ2GYfV2FMtHcW+Tp> _;*8.aC7,z66Q,/uSNR9qeb#&> FX1E QB˲aC;!M(Y.sVuc& [XwƴRj}H4BA_ٿe9!%ccTG:0}2xi7K$99®_N IOư;[KA=zƿ4h07ʋM Y^.2':o3Ž-_uYiBiсܾ8;! Fw%aŋ`DzqaMMC4S=O40?~OZ/?gծ zC#1Dxm;NL,>+C%{/}rʘorޒ?6U8[“gqpB 7)cZ7/+j(Ƹ$ h^Vz];xgkϡwu3vQ=sۋȋhqcHchG}\br7d|ݺ!o9O׫Sr2ZI| Q?Xytcװ׏`/_?Ů0}ȅ`W?^9# CÞß\Hv7_j){,[}E_:Dp`wκy ZQru#Wb{sm9KIvmǦy&5^jⲜ#u##\J\D%wt]j2ID3]e uA4qaA7^X "Sg&al({4Œf9y<1htFzC[;ޣ!fK{0vj$J3[D,TNz^K -, tڣ=]iYa\sPsZA R/)D,oKr\SkR1ct뒉ա$d0r̫",]s<3D.N\׳obhVV>R3Q4qrOyx^GKBDʄHB rwN[E)so4q"FHet G6:4k0rKr16="co9T],ǽPg ,i&=8[UylNR㇑ȼrd PA8<(x$ D1wNK<%"%3ԉIg|ߞy49;:<ǧR~@Ԯ'7ͩ!Cj'n.od98`,^F^܍ԌuEzXd@xw\Z ~ $al$hxjqpq4Jbʼɇ%ğѥ3^_5cJQR =R!@pqBix4d&H(ڨ@M7WKFt;a\8%^Dxf@'VBIz#FuEGLxItjc5sql[p5ddV'4pO'gh06i#ۗd$hvfww,#u+`LƏ0N:+d~{w\|q ߺz\ :888VBjc*rp/ŤrrovIofls]TMLw=80/iu N1fH @wk)hί,w[Ǔ'5w] 3},U%},2Laʯq"/?:܀ D2E^c Ie5+[jNy@f987pVA#.e!,18 Oƙٔ9qY1(jFz>M1#Quw]#aq">Wvcя5]'Z+egmEׅx,u4XLaSv[!l_L}G;b\~EL*rv,c[`~B/5NϞFin&DmxۮyLp_A,s]E UϟC)/~g27O{Yh;B{!&b%_z;y@݋)ow:nb*{-k 2ݟX7=!kHUtiOKg Gxw$q|d3uc>B=hb ^CsMΫMfLj?DEW䆅qQ=זtor8Gᬈ!<ꧪصKX~9+S<|eC+[ 6EMP5;j;(@13,9&:XLUSyS9 (>8n+̮ GI_/\U^%hqd.}FK % 飢o fp9;~^C8=S0=xgڱ ]aC֝(z8ƁU h#mAU(QAsߴZzCm 轧h Ag{' Lk,^ۊ@z_ysQdECKrMp[  9u*mXOr(fX|_Ĉ iP&Q|= Z^I>P@铦ܕxtUOB)8/mi OV}>g.Ըu-/Js*m-2p~n@ ?mwstZ ;~~ PzCqsρ~lx\P>2Z^jie>@5nZi&Pt4^FМp\`yvk `^槝3Ã<}Q@ҕ_'M~$5Gm{8):&[{S??{C* 갪}l S]#tgXhfZ'7r[6`798<8(u( C'dż}>T7׻C pz{s> ڎ{ @{ u?8ع] kE6$;"5ٙ<\Ca ??=} iyf&f=9!3=8s!98Lq87/Vwpe(؍FQW!^v8*9l#@]QAxq]]d>i_VW|3{w#`WX{kc"j{<, 罿o >sGkVxs+al@O_n˺+= rSP؜ɮkQкwĆO5Έ"C"f}ci߁P{^L>j?w7nAG-:oͫsO={Lu9D|^#oI{l>_& 켅;L*c6^U@&9w:bvQC}MA־G"[>{ i`mv@!68\dcrsX4P6CeyMA]ڙi CL)ȕ>ox&>?O1E7cp⌀'ډA|?O|oP:~ @8sr:-Ҏ/vvM\ ^&yϽ~]iDr]?gv{' wԈ{0?A@pGqCJ;OPrr/(}Iʼ1mc,r!_o<}ݓ~xfoq_آlR* !pc쾉]@MO}6]t6G;9 6,a8ynEp'm5dx= 7iމS㟧q`l9[RN yhW>TcjK OnW7|_O][3[v9ί=}6pGZ1U|_4/ܾÐC`!zߎC΃J9'~D>({:r(c;L>[d?t}q :e@3t^}5m|hNOc;>qDk6ofNv^2އ ѩnꠇ%G2G9(Aӂ*?xOT6:Q;lE'c͊晾hM (I3ZD8;\a lǷ3yMGسD6߇3f  @j{ʧ.f{A@?~^ՅXʂW$=6vQSn)}X晚(Po!1TO|p=)Ω 3 ?\ڵQ ?^9>'<&}ΚM5c@DPhm"fE<i*A@W8hXT@D5O6FU6v!_1AY&SYHzu4@ @4@̀((@PT( PdPAR`4)(T"RU%/F$QJU2k BM"%RQUmPDE$ *(BT@$ )RAE@P )ET $$ )ADJ*@(U@$(>DED|}RPUQD B@*"PUQcڤ)WT[2 hPM-ٕE @WB() JR 6P  @z{}Aum7`ԉ(7"Cx'GMIV5ʒA Q> s}݉PB@$D2)"M 51i44h Phh SdRM  Q)MDShbOT Bhh&mLA4iF4ida2a1hQ&LL4b hѦ&&iSi?%OM򘧩ڧO~=Q?eSS=M53F4)MI4C&2m2=MJ<)jz~S#iz4eLbLBd =&O ==CFFA6S a4ѠhLGFѦM̂i2OI!̿#'9qeG7>Yw>[EmtFd&BJ^}nv3ýٓ#p[H@Ev* 'Fy8P )$lq?D=,&"ˉ܄=Bqhj StuEr㕊 ndJudſJΤ`RRUJ:z/T6j50$4Hy8ljʼnswxJ ㈋_&g8snh.t[)~%8uJ0RjdhD*T~S֨3ZPvE͋FnrPf*h|/Ȗ:~:]n_ HmgW^$ެNnCIEƦ(ɣd+D=ܿ %e&Q/7ձl%*S0wr"UkN6_thzS=hzGf1fAfFElLAo%-(U"4c7vVMzL\bJ*U\D?>}˶Nm"5mBw. "!ND4P)+GRKjvT_qPw-IVjDQ ̾B3$P:@&1N$PQ ӈR)Z=^; 廭d*'O\Bjz")=H3JDFXr:vaHlTSIdnk0H0ү|ֻQ#ēp 3UE;y5>5fш`JHDơ1yzg5c,VҠupΰyTp-~C=jqYB$E}/RI).e5,j† lT & hˮ߹*Uf/Wɋk.PbɫTA֘ ! N*/t Ӆs*7&3m۞_t՚r> rL)eM/u1]W ThQQAdDPK\8Qx QJu뮀iACgW,Ə5/ CL"qêFJ""'6tu*TI (6IѕBIq{yeQy/%k>V Z:Ӹl7(Pґ2١}`.3)F淌U*A L E%܉6Q;qC"1T&cM}͜HYbqh_DtS_ "2d<ȩ/eQgiCiTڀUm;1WqF% ,X'2}* AD.Ro n|ΐ?;G]Ljv|ߧnK7Y ]$]I&z͚ [򟚐LZSs۠膁"cԥY(dM0j(QtNL47mwo('dmbr;Yĕ"A u@fdӻP/n ʘb'r"G /̨ <rOe@f+'*{hdki^UBtcjjWʚ?x!k.հYʭdŽ(1\,/(%M."iP,p7Z6ˈǥOj_!ҫB 3PgEwY>] QdgW =RIN|nŚs!o"y,8Tt[3_h3UB`L)UI ˟HnɸゔE2cRd#@@Ű.$]c,iw3u]ZiK})j@HD`VD_ZIl)RA:_P󩫁Mh+FWVۊ-C&F-Ftu ˿n^E캚j /ja6^sDi},>N*.G5Q{}RX ,`^x^KfO/B=܍ VEXmFQ(B1}h\8 xL90R%,G4A_7`Wx뱾}hI1G뼏t:Gh!~ǾB{"ŷ* ܢPtavܪE 櫆K)ekre̓%"wQmQּV#`Ϝ7h\i̤C,,8hW)DT&]u}wjNC@jbNsPԶ Xa;^{t27z>z,WJoo*ij=ֺM0*Lg"3 d'EPw@ uq"nޛpjB0$iYdTSj1Gk#zB%58TnumEI-ˎ9-mzVrhQ8Χǜ/kjh:l_9"O A!JLyXXT>k IxWtɄT= H;ZwҹuY9(բܑTFG$C jf-鼔^9fP8 7NJ(I|S"lP xe c!BaX2,d}CGQcI Df2p1/p~:ql/K}2Wt!*o>B[FMq{68wVE^'W[ow_ѧzʘڙVdb9,-VySNC4HJD Ү Ū<TUv`n $BF1ʵKf4%ȈP&"XUS%հJ-ڜʽ0(K]fU7fw P$%kɆ1rL ]xj+XbD(]IY BUne1*i2&|\|L{vtJA8#[_qlKZ-۩s]To{xsb뵰~?PΦW'74h0 ) gFVR^SڃZ}c6UَُFo"')Ni7/CwZ4a`osc?WOp;hLA2p*|h3D%zz"9˾37GPEoμeV t{^G2yuUt0jK$:C|;޹KSbs־o'3=x&G1*ڝq:2)=EFd9[ɋUN [} 4Q])IΏoS.rѡ6$eK&YN{1̔l̫\“)~zHc~%~dkf L${q,=.j"#:ЈrE_-eIRroĈzi5K 8SYF&̚봻!QID\ZG >MF`z} JwuA#dcr4 5^ AU27 ЈLʨͷѨ͸R~J[5nX֥Oɓs%<- }e*n=L}5:,W¹^wܭqHrIV6g?Wr:)8hn]\ 0zT'Dߦ̌:p$3%DogxoֈŒpVN՘1KsJɎhۋy (Sͺ[TͽQO(F{"r1޶&Uj jn`添-Qc|b:ܡeaQv6¦+ jUxLTH8br{h4L:R [$LH $zYs*aB[Nha&U qaR'x4fA.{Ք nZϴ%6 HBsEvpKgѸKG/ǮNS-Ժr)^ztd,*숱hT N0R Sݥ#Uy.=]w.Hp{dGym"" LGs8*PPLoVh1HBwf+,G?]'f&irs1xwqKH֤pf7. t$ Qb2aMUoQSki3[nmuc7kȓuGAʚ֕F3CDSk8.=iBǵ#if7.m!z,T(- BpJ:Vawש\ AY*) ̎R'/PWGMp|pHg$ص&DAP =yZݬieT83 0Kx/wf.O6]|ja[ j-#Ȏ[}q2o] pB0>+\owv.Hvvs\>Zzǜ`ތo{ʛ"TԝH SNXZmCARym7Z=S5)y:n އTٛ^N;o]ȉEjvYj &hlDfrf[۵c#qغ*䨐xp|_]ޓufcpff=_-9TvUxϙߏ]t:t^n,] ";7$ʿr X8gtvm;}&];P[rmパ,ʘP/!1/dՆkiI#rkwBA[}0 Rר@+&BK`kZ[%n5KU]g=ufeLj!*Lځ.\4  (̸#MB trhpɓؑv͈qn ]~~髝Zb$9zk0 /2d惸LӨs/(d(pD@P!1cP"cRA7&bRQA⦮.t"LS4k]MCQ[gL:/`j7]u/ܶjdf &ɼVjM&SHȥV ;> *ND<4h#tUPC-F)ik)넂um(*JA2GѰA.=uo$ewup6A0nrjAtZrrPF6-TdE(>^U_Pv J_϶;.[OOS ed@҇/U+]-Xƿ]wEִ+$~Hd)W\zt+yu.c}&g'GRDi5N3c^q3m̜,I2=w_1_w3.iChUPΚ68g'vcꚂXu Eԉ.:H;̸s;uRɰiʗ |ceqjh4E,SvgsVuӥ|hKiUüoWoC[HUC"'o[v(V$?Rzi+WLwdPv,Ww1U⚨p6moGyZ;{]Z|5XIbqx!PU63pEP8)/RSTg"2A}MqnΎ} j]Db:{p Hv磞~b_vWpw9~泆BC*ʓ=g~ECao? ܪϵ~1V z!v3iY40b82/f: -}Əy& ް98=Ƅ5hyvmYNR wsB#w8Y´jn.﹞{wftf#Ӹ^ ɻ="/ jVݯlK#VkKZHkPi3fjEa)ڕU3֪t.k*)z| ry=j5a2rjk\V'l`$s`%fS%q ! .C c,N5P1#ZFz pDՉNz6EJW ٻr L>1A/<`y,|'!|Pr,*~RCHzHʳ83'srdi[|;&Q350C=7TLK@"qV;!.F:3E]Q{1lZӪ~I#Z{^GdŽ֦^qRHD,35p`ZEgyelUj\HmB ]-4rj!W[TZ ̈R!Ņh;橩ڒ߆bOcf0>s|" Svr/\g8*R#}bRZF:چyuo+Udog䭲4Bsr.s\{G T7wN,?uhR.ccr7v;Œ pcjw& ].\=0qkGaswxKU=9\SԚ5"gƢ/*c&)ksRk@ɘl:)K<l^fA&[)j~wW8' S=o4wK P^~WC5+!J\Ua57.ggxdQMXܡڬ W-<{҄PiVd72cP+zţȼ̜cuA7 z31z"''#`\nJʸy c;pL-B~r%@=NY99!ѥBT[FiM{[ 1]ҙCa$S}OUKOUZMȼ>{V{„)3'Q#6oYoJ,N|Ibb0U0eAN ǝT9kd9ֽ6owAk=Tjtcwbg ou*/onO*~%_r&1cॕb.EwYH\k{I,c5fw1)n ƈ!рSμRj]kȭ7w3a tzQcE>Ewuy]Gy9L!V-ΧԨx\Ӈmt{1G sIԤw4* j^`N@r3|sCzdB5m^_5We :Vd732B妍_zN'ө.qs ~#i*됺J&ц}nG56Kԣ]e7E.OzVfmaEYZY]͕%I%_,̫ӌ%v#S9|Hwގo뗕֮F I~ɧ# yOq!9ϙ:=zyg6*+5ɯ0/YHUޢ*\-ux6hꏓ>dey*"@d~o1rBqrԵ;{#,׳4r\foʫ}e{jF.zDA(VޚfԄ GB(ה }Y~,Trs_e6J/+~AnSt=rA֔ QǤÐ{C*xCe>0TG0XoN˻-e s( p7qF4ߩBu>Gp l!Ϥh 'j{6wBYt(m%[[601zAۛx,jN '&mWLUf tPAYֳqx n3-&Sz瓧[cJ8E3E8w3Q-;`]ϫ 0yr"cI&``VMŰ|-iA 3~g>'={4؎gu+nϲ-E.h jQF!e|S:)BU&.SmU;`saL7 TgS.(P2F`NJpH2_"(m 5u$4;4~^S֯=hS7oیsLѹQc2%S:3RwU^?3nTD+V8oJwcHFq\wC)ibݽI!1=;ַ|2E~kV,& a9βڱ0/ldm%t;삧u]!4@zzB61k{wdku܍'V>Xݞv%)4,'n r<828Y{ca.ysݡ[+13+!fq,lUS㨣B3խVznrtUcqXpسl3e)(2uPY m 2RyL#!En= HaU!np }(ܐn|3b8d;ܭ@,idA Veqb YdZ10!95=39Lr67Ћsy-6kz6q )d2N-% @Iv4*So-v1f yyqJ% 0lYиMf'*Xy;ڢxgL/UPG8kUF #P01!C$Tk5s坩P^XX̭h2[m-Z5ka<4-ϣh6% 5H!^3eTCIG|a,r>5% 2bΎ vm>w ] YOÎ|ֈ+!ww# Oc|}m⭍Qy7GO6b1~<"^w|Z- n-wц!OoOKlf;otĄa7bQ2"RP)XJS^kCZ ,Gޮ e*Wn Psc!q~S+2xqqd㢂>H4D t\Cΐa~&!Jh$(UՑn᩺yM:+#QON؋Y~^us84DK?~5SØ#5ڮU92RͅȬ?IA1IP zc5Y"ikOQ[Zjf^C[o>OgZ1҃ߜ +Bί~V|c0qTUsq 3;ѭùGA459W"guk6jq`hZ` *|''|u ǮM(fDXXh6bO@HB!kaedB {0 j,8%|4g~~n<=]'FƝg7w*ȑ!𔸺PM箯`.i8S\].Z/dQ ֬5m x-`Q\}KsCO Kx]jou}l$@=֩z:z>+NPޠ ^x?M0}`HeARf\vg.|ʅ26P|64k >g $,tv\@@Fd2(;. ̘‰Y,<'23o@սmע5"򐜞/ 1N 0Hv0w!SZ)RUwø|{7Զ/s0R[|jjum:OSb@la`1|:Y@.7pMg^ad1͋מk498$J0jqԏ֣{;q'q˗Bsٗ՜B9/g {][m`<ƥru۶u#z J!5[iKkэpB%/E WsW,mn4nDv;'S?Q՘Q~F} @ ҃D@ir*=  zֳsfo|KZ~q~_ߪ(";8ysGU\>>n3cXs_pyw"Ba\ޱ=<: .b Yf ,hU_&Ѡ+ΩM[itop_\P D4-W4"Æ. z6(4PhYBqhŊQh.XA2 F,+ k\1r|swU^ oNDە}#y|ND Ah=P_cnBC"tJALaݦ^4TBiw_p iҍΣ&^11<= L6O6-(^T,U#Q{G[VkzΠ%Z+@Pm}_ħ'`cv-umA{YPץG?&M)ގDWy֨<%mїq|W3IMF Cs_V-7YB :k21.z=]Np^c`U}j3Jc1W/T^g}#N|d ,(|<]V:˶)1M^J`0[ UUp*nUS=|Ӑ ~b|KT1;Ն-^em0DtQAP `89Zg1Xti WӍ>$K7E]ڒi#[Q4Ȩw2 0@xZ!941*.YSF0`<ߐyWݽRpDW$P>kOq ͓ PP0/֟ !aF:ݖk*鬨L7{bNϡϭhA2Ba;I$4L~,EʖCEOĻ+kFE,`k83Qa~ztDE>o2n9" 84`Y!iѲxӝ/}~3#=sO=N\B&h\~뵑oׅїgЛ"՜C=AȨ#W_fn&p FgRSibs4/pxẓTZ@Wyzo"á!2Qp_0><„e@)J' ?M" /ǀ"Np{$ng 3Uã|xEV{sv %ys,G&%2iŞ֎^Bdr" $5>81e1'w"&ݓCF>}k|5P#͘oTUr1u9Uܫӗ61f<8QXRFG޻Vh㿪 x.#|Y4h;/t *>M*Sǃ"wܫ8;0ѧv. US%Ӄ :`R&ҝ$DzO+upH4H|zCk!D(^ 9$Ё`r:͆tz*Gĕ.c^9[b@|[X\ P'K6-ipJ ị[+{ܒ(d׫;`a0qpq}i"}3, !`|ʤCA($ԊcZi5uO !X@2c # ^хGDҊFZB4̄t`(1'y rŠ3͐anYHBbcY˂ZĩDŽ=nLm0t믌]Z9ޢsS= ["g/N|ߖ^݊Td@8D!]m@j]J/3+Tٌd%siv2(6<9T\P@V? ...ϲ4ɯGyZLg"&$9 X̲4={ %Q~-Irt"W㞅CT->w!wGDO܍̧WmBUVʌ2>t?QGNkϓ+d82nT*gy2"e\yĚΤrpnΜ¹d%mwP0$Lo_ϵC:'Eg1L.m~^TFob|HW$K[1B(ړ&3^Xy>B0U&EmESQ ӽPvQ$Y9A:WW乨Xp3`Cw  '{ :q-[>CgzbsrhfŀX&#ߪďUAɼE8$[^K?9 M s,BE2un[k AoYU7yx2[ɏjḘm,i]אwO%nޖy{X5ˉ:_Wr}fjn'FqIQD!^0ӓ5 eQE]flR9ZrǮäBNl69dC{A cֵSf-i,qgL6L): 4!Rg?N6&ᅪu[|܌=c<} B|y@8Rפּdrmk^I]v) 0Oq#^;8^E&4=]6[6zjS俭v3=-%>]a]Dw'3^$*fa 7 &?;gxD)V>,Dt=J!g@QSH5=M^ V(5 ћif2oMюQ) .JPI98q]O@6(tގ?Gee5y" #y0T6| py_O!YbT #J E^Y)?F>sj@@5:N|uz'8~Gs5XRА5 @Izp9^ d ௶oz_s/j#I E#d4dF]QB>5w،ͱ1h.ivyU}arxܘQOQ/*SZt5B*NV֠5pK;qnI4>.ECWZoUMS3$&6 ["p ={ТmA=/聢 ̕ϧ7N@9'L@{v;ݞ8n|fr޻Ͼ4p}&edp0qM|v+޶kEQF/8Y8P$9V aTg6ejGQ`9 #cAsj,L\lM\WVj[UA\D_}q=ȎD0 jqZ ۂi8) ,y2GCU]j .`z_$/ q򙵨I5u'b,d;k YЫ`.f y2"ۭ;1|;TF♹8o1f[ډIfWG<9Cw}޻\WV;MtI {|߶kYcl4!/4i!d0OG*쏯6Q=uD !׾y^}p}V@} WEk9@H_B#X'0 {QB$FNb*:K[0aPa>Ȱ`emiR㗟9DQ@F<`H\q׃ISų:ɠOpj8Jzul`E9 h/gɽ9 ,̼9q^<ۓ.Y4e)6IM؁f]5/kO:m(TQNU膆d;+G@ƌ5!YKTVЋJUӟW4ٗ -0,^iOWQ7`e^ꎰ`=~gXi9XF *B3-u!3֥^bUP=.p)FOSWż` [L}o/m-|ͻIȈ4c jU@r4#"r"Uph43;1rA>F \đʏ.,%9]^Vt#FEmbw Eln|.> vM%o_"Ʒߩ]?J9Nzϙ8uBs4^\.ȇ9p%P~NPM@p?G}/][+z>[8 D=0 (^7y# O>'(L $-!&,􁬖0 ( * lC}'ܠYea- #)è4ξ9+[襔+f 2}4kKESz4ze^=t P왳bX~-EqǷtܓ0@hD]teџ#'M}c>yԬ1)Mha:vn֟uN5G vٺ51˅$,p%9ݪ#fUNSyzY ]aOwswƝn(`0L*՘C bmX[IZgsL(D>-ƣ O+Y)'V 7Y} kWe TO9I(\F^ .7#f!Ыxmo{r.M5KH .eWwbZ)WXПъ/) bRdzO:7&W^S顲YbHFO bqlѮ܊U̝ք_<NJ D5E/;l*bO>Q1@İ$!}`͆ez$ B{csi;X BI8K 1()ⴓ 'O~D{\gp#]}_wZr* A2%5)5Y29L=Q-.KsMlC1ڱ {{S3c8#j6HHHLw2D֫d-֟gB K>iLlQ`P4"#aRJ欱x$b+7\܂zb z=R -kOhMeV:.nb_/3ھ& 8xy+&α7庒(>HڶM5 &:[ QDήj" yʞS{c>bTAr\tk^iF=U߿%VE0Ig @bNhh< gv%H I}KTqna뵣n0Q(".F!n$ALFF&ҩ$lfe>9qP&[|˚2b\C yx{!nff:0%sd{ --CvK>Tpy6i\z!y@ID5,t]R(WW)ثwӣ>nao[S˕7&#!&{)I>-k Qj2mS!Uo^w%m!q^%}YʓjA7[φs!? `Ⱥ*VÍ?ZǕƒ;XP,MQsp'ycw>K01Cf:NVDNC4]6B|PODp00]n6`5/|8 /QKZe'{YuІM#JO6/ʤVaYNyio3>nP.b`2e@k2Ɇ!`"lyiV-߰xI"Geօ*!@f< ",2e i gRϻLmܜT<Ŭ:k{4=<bb|=Tt{ȑ0#ᓐUn-ʬ0y59F%^5. }~aW.Aj #»^ŔD1;{ •DHO#Zʚ?#:(74J|@ycG4 xL Y47O9_zzuje z(B],$*(~ dWH^gˈۨ[Goj4rq2"y }Q!tW;%pt`(d #U?&ȮsAQ.i&[h- Xقz%i1s|zeV|ReniQjkS]Mo)w`OZkAN%p xf0ttY0H+Vd*[*Ԟ~An.ښ"Q:âطlz)3!F5Dg`1r>ڹ٠od6*8 jz\[̒ "lkaILWv?bD}DfIq7& ,%A!gKDd+ } n\t`Ŵ >-|||;y.S}'ˉפLPՈ;tIx*U'yF& qqDJ51 0{VāF D\PFM QC|Kz%2ɘ-&b2R9p|o.M/q쩶߲c^.Fp̓aG`HRCGP&a׻QXPe[O/[N6Ӄf,T@$O`*izfZKBYE#pΝMAاO|x2 FilWֶNʹZ/Qۓ!1u\M.D= }=x-a.;V_{ǫgRcߕRϩGm6}3*cpm-9د%l?m^vn׾h6 !#jd`\NX85CVs~:og]k 'O7m3ZedNInBR?Q[զm%_@/Ŀ?i~kwwyo$-d0w#(wO MTD~Dz5?|{~Kl.n` uۜbrZFT"-z_wr#{P3T}d^e~M oNfc'$Bɓfo `2!zjאp@=FZ6Q'F z֛oŀ-'>05y/]NfzGonZj0⟫{o1;8ZI1XץTzrt?AhgZ#W@fU2,5"5Xua)\Kg47ML©p(R+=/+_p)o<坵V?/W1\t>GG| X^GճvC W>zh~ݹ?6$gϻϋijeݑO yRNFe;\ >Hͅf*R bF*`wųK[֣Mv#üYufc]̞z rw{KֽrLJI-"f\ ϲ]?Y`! (\ mtRDgӪs.qaB퀁k+"7dLĦ4vb> j&! GCQUqȪݯ&=lj{{00ʀ9Bc4+ط{sd6sq yQlFe[=_ UmԨ؝B9UQRLxl,TVh2]qGu|=Y_TN f<&508l|+AcUbϪ|8e]{Ձ| /N"&{PiIU>T2QT rUe:򓧱I=CE%NQ cf= $:;Y,vMZ3}ઋ,0\ޢF`&G I7, rnlar>8=CnG;t\4Љ\M4CR7SK` o;|d:[g/ჼEv{}1YZcΌ/^3F`6! L3NEVĚRfgשǝ0yD&r=IˣkWz ){Z>y=.;\\6 peHYSԁMQp 9ܛ cf{`P*eq<}I2-ŕ\VzT;Bh v] /s|^쯂Nd^]ǯ^9Rqټ >qe ͩ]7^zPr} 7i>Le1:~!hP.0ь1jx;*챦Gؑqձ6uu(,i0Mko]N)YEhT/Z=v Váڠ UIMV]0֥4VlK60cI-dU٦ols`@́eEUҟ]Wz=l|99sŇhcAB癟PXAi5R F(1c%hVLz1Z`h"(!h#-#-E{WDD3 GQB 0t!$(\姶'Fa_MnoJ$bn7"Gw<{Z.ʣ@ΔVcNfAXoUY|OD{ͅcWyo62?6V6p{Zkx-kēo8*1ΙY$ Xce{-=YI"5$Xʫ3߽5o9FIK_޵ߜv)Lk1 42)2wcjxS,sl%}!+{S@ۑWƞHL>Il~@T͔O3sA͹ 7DmSY;Gy1-VMx F.u槖P;)])NݞeF,0WKm1}9ZG" `3^ Ix6 :^wp: \Ȗ#寿z휇0|q7sBU?YuG{(iF2Y)(gLnJ$>1r֤XsZLsfda=8qpR%im!D8C凜VIF2jlω ^{iPsCb]wUI_tNk^*02&W1B_~m&?!mr3Hx.p<xf nG 2QAuqM-aӽ[Nsy`{ "AWs չK=1`b+կIKBWT^c}%sf 8.IE%@An:gzg-{Qü{V?T,B;s:Xm BHh !JYMTto<ޠTAU2@׾yS%CXpam`}Z"@ T Ḽk?+dFX\~? ׾:ݯ"8&dPL 5`DC`U9O߹ ޽NO!tCև,P#:cbuˏg6bQ"R}%E ]a'Ӑ|-bDaFT]e|[y5/~:(FgL;^Q(<+\zJcL7s]m1o*N]zu|~oX{|fbkzv]: 3{Oʌn޴g:/(8 A:{;` U-!];W4cA3sK2+]Iܛ'%:&ff:]/JdML4ߎ'|y,")$;p!$M םSelԹs,v!w#)-rx1H0F1-@W 6-d2t |WebV9kg\W5P6wi/=OPу363'}c\ִuN3߁3ЇE4:/#l Jȝؑgf</D+ JӪw1Ũ 6Zx\'dlC1'!z9ʚH9yC Z\fYDlʎ==M<=gfָ##Ȟlα]CBIHrjS¾_d/[y $Mm$E3qs ?jJfZB>HCtK[ oaŶeH66 r1G $tv\A٢\l!eBHd 608]`x#5:ʤ"0gt,,g46b),BEuT}k;f_5S^ އz>ߢ q(#gunum|q*1uSeP^Zs# ؐ掐 {actu~z(y٤ؾ8>V8~)Uj͕0+1UUFX.!|9Ľ׶j_;e\\H0ĐqQ MUY!-ʘ>cJ8AF$pQ KcǯC|[JU޽ `h75L>cZnl{UlzG36}LJ hmEPgkd2/0p$>͓o6؅ P_z;=>1`X!Ya2ƿ~9/MeZИk8{мeH  3Ya4"nNB׎ꏆ2ПEg&{wopG u>+f̖G oNo#jm?D$L.Bv$n#mI8O-V{s,ɽЇO؁y']U**E`X.}2IF\;4jAFj!R\2]Ƭm:MZo^?-+!G~PՏT6p1?tI5Divyczs]fܯ"^1ZhuHE5c`Z}7K@=*pnCȣ(ҝJˮ '}AJCS }m4\c~}9ν~Kߪmc4942g S4S2hDXI#Z$Tꪎ@!qڴ [E[ o"5w͢u2Q `|) :Yٹ'&_'sq8L1 zH^co;慢5kjm񏔒ј >czqZpˏ[XԚe}6\V3BAdM`Љ tG(Gqbn'.qKKƠ2S G]fkM݈."JQͿ865*)%^J *Z)eY@=TP(K,тJ춍&Т{\ώ~Q\0>0:Mζ9) 99Wa KLH[2 A)F`BP'.'<7%Z: eF̘^QJ2u1Jy0+ Ӳ:0Ҝ,XWwZ!phd $jɦ'' d}gB19> ][_)0¿u2 B{'(%j3p@&"pm6fotKY}[{?ᯗV#Ǧ?g~]9 м||A\1ٻtۓ-%EfȜ;Ɩ"++t,1/$" Xٿm$@UYK@ +40awҰoxL^3 3 ,:Z3U!8ָ&6+Z`+un셽4-鵸unV[o5z,6-nh0aAڼ${|-D4dZnhk~t/U3/@YAVMMrĢV걾]QX;<0p^Hگ^kb|:;Z:J deCdhvU`{:OLDeh6Õq82jO !aê5-fTëg3;סg%{>yb!Gu.5+ <eC2(蘿k8PP<9/v;$[ ip־DqS <֣ wN+1|5nt@upjζpCVU]ԏD^Vtx|KiqF\ʽ{kP[5U+o%/CT=Bt0A {8~ 'vk ~ޡSRkx8f$Yhj)7#(q9 zK<>}VG9keԝpAQ5H8+}h[,r|͘4'+t/Svlt }TS~'"3s BB}i O$8 Reo~`1ԢB|J%__9ZuS{5*y]eC@HmI2:ynϸ g308 &D`gNT 3f0hLCO%`h/YAtW][¿P 3d\?o^FF==KolɽҼ=Q)oyy,K y9-ϥA˝b/W ٗF'ż'3^{\$ ZS)={3;"&]Iڈ{RJߢ'LaE>DW\.|K2}CHH<T#l^],8ߺ0m%f8K)Zɘ5+8d֔Iar2٣ ^‹aPg3yꆔ4*dq q^C8^K͛iV" -nb;D~|Gż|P#ƃϭqks}(*rKE U]R+o7V)W29!&nZ+FE*1ӓB!73sɢ$"MT]hVpj_ppnzsjP (I?r17.B?1or.*/<.v$3|Rsqr})Zon`p.Y)>t K=GҰҘĚU9f9 5wZ 1F!;9(Xj7 9=;%jt{bElCR)lezQ{S8oGMZ qc"3at؇#B`zbV0O3]ВFٝXYFoj=?#w2?XZ/qU r.T,odPz^ Z5^s!*%a_"D@ݽ~wȳ"zl`&tkKv\|Zb5K%0Lc MՓɖs:-+1S{X!ǫ&$U,Ah} iFG3}mU]|ҸԳg}UdnCh_kٲV}nREjEۇY3dG+tLc}?GV 9sk38=șҖA^-t)k`[@oƬ퇜Zyi=<찁xq~YQj9ǣɆbD 1˝C05@>GJIiDso-8ϑ&bس2--AǙG `@Wcsm)ppA[J5ݬ7bMUUixC B#YLrDG:Gut]SJI+QH(̽jAͫ>:way4HHҮm #g~H*/1=q1ڈC Nd֬UemM(}K9lQ9%Ӝ&hRM|uikf;S2EUH$M3au Ar+M%=nထKU#؅aa邇 (:9+K9|{}<~?|_s-_` F;6ME;& 0!QNo2-qY=b耡ʍ6^,/7N}&rT7Ox1oO+?; g0pޑ]~:D[okgz<7,J CGI1s8IN$scc0k ˠJqVx[GMYaI`iew"ݱuxmipJX :zw opv9l|]1&vך&L_+ZZ9՜fEYmِ㢳GnL~= ^ r;K-31K @&rW)Ս8g}` :\wXOXU!Bɰo]x8!XvI[ wL .HIZ Cia1!X/`IpNk( E|QjMKJ{Vې vQp̩(hm)&Iǽ QG6ͱ%U$!Wԫ/g@0$>ߋ ߳Kwt 5R"BOWNr6?0mP~K6&vŧˁVru? :t:~f١?AۊR?m EUKs4]!\oKyXc\1k19SP9۝U@ń+F@0P|5>BB#$g~D69*-[߯_{RTY=z3l֬a%SܩKA3c.j|_Q+397ç`#єD]ԜQn}S݉O3$]C;MK%V}=ב~Jw46~g͇JսmL <9x2_0oʤ*kU leu LƏc7K{gzlc}LաJrsO\0@cC(ϵ{2Le+ nk'^Km5~63Anhm{HN2B)/(\C32'5m bh,tjM2f"}yu`ik ߹i"U環$Ny qpo͕/o뺸OK.M*!Km6l5–V* ϦRC@WD@/12q>}w-fuck )Khhy/l]5@OoV9e/dfCxUD]#մ@z/ 'w%kB AFV=x[lz=e?Xِ n{m3;q(6|?jxk oپqy@Ua_ybD.81rc|;ӟX ?/;ǠcFnCBx_x/}!\\}X==ל[~knSw[և :o1~+BEOtk9yQɅΉ\>9˺!e`DOvc]RƟ?3BgiBتDznU1{9r` -O$== `B'ZB\Oc!\q$;sc"X{F# ツzr7~Hx$9= b-{|i T?{so_o)ĺ}(fߔ|%IA:%Í&;ghLM3P[5ll(x~N7Sچuػfo)jD83hGϷN\fIȃ|sOnU^Fa-ݵ\IX([xCzroAu#/W@usdPj8c([W3R -==K;6[=;=Lv=WݕH棟߀{}hdr(ѯ7/( Õǎ8 snmm{y^>dRmo-k|y!Ź[^~:Q]|&,6{OL_NOK_}//}]Z1L/ 'Uk{9Qt P?}|w'o||w_>^˵mw?7>}>>Ov_6k> '?\z~ݿ}_ܼ7A^8pqǴ~Y~Wo\~gy oo_>=:@cVY!:uйU+BR=>`aoD LTa.6+m$D.<''nhnyN@΃E.JW &IIn(9P= =\OGI.^9zP̗WS !QS%#W<_=U9XtЧD=d֧] K`:q'P/cQG+/g^{Y{ywU?__=#{ݮuz߼]|߮|>=К#FOJxa&SNxώ@hy燠'g_PuOX5 {>{6aӻͽ}x療7Gz!F]~Xvϰuݿ}7wo~_zovo~o.w?g}AQ}_9?~Mvfυ~6[{Mػ6 {]5ƻ]5ƻ]uƴ|?jfWg嚝NSu:S+Ӟ/O|Ov_7UV;v}vC.; w9ON::s]͘3ϔ9^S_{yos]z]v;ϕUVrZG%$y?-NǍ8?mxw7Kܺs(|ק< }]ddskIcM9~bT2Ct >e}T"(~Os*;>]U~V*<gx`U, ]Mf;f/wzbqٸ[7,UTLCu)=)"w9JStR3ⴉWĒ8EJw)% *f+1TTؕ*ffbhi12 Bl#R(h$Tb Й &A$(b2F2C$aL b("6i*$,Y %3"20$HA4fDi$0bJ1@D#AؑL#dE JLa0(X(ԙ1i#B!f60a,&D2!(#Jh&2f$,& $I DaL $ H@S$#FY0!)cQ2 L 0IQ213DLГ2P& &JPh`I$#2Q DBR0h) QH1QK$ D$M&e1"M!%ehe & H1QdCF e!C$PF&I 6Q$JddCF6 12DJ1&e iJ6d2ePH0b($DId6`I-э&0EbđF̣Yc&Tň4cIDhb#lDHD%@$!D&i*4J6*0D 3 "cQ"a(,24S,2!DLJI XPb4f2&! fF&#@i"I P S,14P ̆1hIAEb@H#MZL)IFF4Ќd DB4 ,b L(!R@1 "3fd$&3 @L *4$h4Y  )#La$I$C%%0"e1 ""lEH4X!$!!L Pb(Q(4(IIC"LdLɈ&4e HAD#4H(dd(J i%1$40dfE&$4bDD1bdQi"$@)(%"dPbd F""4 D$AI! 3AEM0͆bBh)2fadLɔ)-2"f"$LR F́3#),d&,h bLD"J)IDS,HE$!X1 $ai B !H$H"#h#R!Є"X ь4 QddiM!eHAfY(̆FBbfFŊcDCM"m&Jm"bdaBaa"3ș1@E<)  LQi4""6c YHȼKwfH@T) %1)KŨcd63SuUkQR]T"tg~9;xbNh.GN~ҡX(t6CvWw6MNSoE& D~E}kCsvEz|[ 7/ϓ#~]}EDm"$b[S b^ T}U_þ)v ݃|bWs2QD]՛&)ʛ׫-Y Q7GO_b}bp7LA"\2D9s vå#wsW<|n^AڝjW|Nl?x=G'K2pGbYdDRE,dSG ׈14xyd1y :ؚA]5IF)$~'9*8D7FYg>%sSμ;џ>WehչnL;2bHׯFPVDȣKO?:⩳uQ>jY}Q%QvDhGBLx؈S&2$,ME Bk=%Gnh|ܖ,|0B_5r>Ǚ#>|(Ztb  q@R7Xg *gN=~En1Q~kU4buPҧ')t9+ߊۄ;+};iv!p n )2Z@Z2\b:|ۧgPi|A4D DCҶWI5*usf'1Tl,CrKG_:韡k3=zo"M?\Xw\n[7Gһ8!4/)BȫV"D]]z0]HR6LrJ U"l`L VeET&nAjelHM:-^gn[h}|>p}uػK97|ϫ~:`g O8KZLJ,fytSP*kqm0qvWRhL2: $Cߍ,'d ~/Q|=c_֏}#g˫~KFNI?S軓íOXnVQ[VuˡQMl?H3"/Գ bַsK5Nc u*xn!dQiw\FikZGhk;Xo;Y42Q2ƛDk1EӻJT,y4p,{g{5riኣ'<87LR;SKge^r`oѸUnr9T]cծSHX6mJЩtXtǐ07T!TpS*Ωd"p8M(Y@LQRvn6kLh@W( UoHq=l bunITN+gͷM&Lu1SYz{9Q.I3y.m[NIj R+ J$f| bR܄;t.Jsͬ:]&uVynjJ=]pouVy^sjDIϜM f':pm [fN:1_>rћf Z|n9#W2U]UZ:!m1*}\Y TފQeެ_oW]ֹUݺAvJ4 Zٝc^+$\횹.,Gjz޲ ƺ\=n]+%xQY}*.$X[Di&9(^ gx5bgcJjJpOh9ξ.{M+Q_sm)!ws}e1ƣ "=l4=R8l@h7МV UЖ4&a&C b)5XRD :]D\,G'Jx ZjV0g2wViFH݈%|2,r$]LYW>8d=!iI A줻r4!s1t'Wֵhz-꧖T5p \ꣃL&w0a:Y̐:LUן7W@&ab[Z]r@$!ْ,wz_Yݾs'MYk#MQ4)]܊ZRYaH`w1QY7c=+ZJ +!GH|jXбnp r+j{Nړ:@D?֚O0Ďܵ&e"eQ;,]} Ϟp!ɸ$Uc(piht"tl"bY%ni\.vU%¢NN]xc12@3|5nòޛJdr#ځXrֲmHpLv}G319hDչ,"@:XLͩуGcoGk |5V$qrLsKgh &S:\Zjv1tYIuMYsBAuSo"=&elW/yL֑j|ZկgV:}μ1sn'X@Kk]Bb  ܢ1#ef3!q|ù?vd|cE8֧)hjNڊ~SE ףYסg*i=ACjF'L͸ֽv>euE-b8 ڤMva7lo[ܲ|SUp(E]55oi˶QY@jV#OJClf7Q5l]vmHg*I$={rm*mt"m̨Q ]PP4Գ1 Y]P g ^Y %yˤ`j&koUȓ:hӴ!5EBt)䈙vb>(+M VCNR ɫ5LLrBB rejS_ yd:9AUz0Vc檜)V+S7g;Zœ+fl (!Z[VDoM֙vX[&!) 2R7ɠM:\:"aHcvƯӑG5Qi5h5kzLЃX,͞dr9MɥDXds;$hbŏ??M6/2o=Zd5MwW=/ Z!3U}hbiD(qLUK ڵVm5ꍌaȮ}nk\Cu*+T>#;+4%#H+K o9?srOS$YdIBIK&U՜Ǔ:"urQ(4z .=3}u{S4 <<|U[O<|>͚igQcֶy"pF&&0B<|.<,! }0u$~Q\|=VRa7Ţ*f$>79ɸV&9V|}K> &QPҘY JSy'6D>N>&|m*ed8tHC0d*5U﷟o Ak>|DwpeKukm|bBJ/_:eQ^s|Ll_Ztms͙#>ﺜȹ(ڬ/PKZ3P "$>'>~?]Hc `m&\1iRHODHdOFfݕo0I9gHN"^DU*}iòM.cNrj DY#fdX>>|O_oeϧύt&&]~< ;79Buu>ƅeg4N5:aI~pQ1-ǾP;7fvsIP m+]dґx*/1P+2`B %u4VTtz"4d*,]9)7K23Me9WVUսT?F8I6_$'-BnPeEԛIdMh<㭨i辪(ޗ JSwc,VbIpUpRsstӿ7"|wKP!vqW IU*:"MV}>mz7u)2>0WGaώ.ώXSN|'8ՖaF}_'&θDhDWApcHB.wuC!>ƫHurXstOG)>NTK~vr#aL8n]3qr.*u5hwLH\cΟYX2$Q6?z->kZo_Q|}Y#nϸi+]W||;qkO1> '?OT)֘x(iib§#\~ T%C&:OS0 B,ȫZ%c($lI!|(Q/#@K_>0_]}O5B1A8z~o߰dJ5u!eu T[ҨaC'6_BUM/d^WV"Smҕn YsacT*$>~i/6]F -k|ZFRXUWu4R!w|Q]p+|cޣQmj>PvWo0@R]c&NV,th+ #hVY-#\6M}\-^\}^ۚqU5ZyiQO?z vuh?CL< = Kޠy}tf-~__Zf=b|k#kw 3 8&Ͽ~TIcE @24%%EK"Vˎ"?W_!:!v| _Z{zs{*Sʉ|" =]7Ծq>qrqesf4_ɫR0@Z|J mmnD1ğ9O:ߒ`Y]JElT<-~컛u}~|о>>D v~%`e*&{4j"Ap  X11|Oտq_:/O/O{!Cp5CV[kS]Rǐ!&' $j-̂sXOoA?vMʜ͢͸IJh+*!$;3Fhr")|7|樰F+ ~k7 qVSHݣ~pJjZ")NTM,Fq-"aBʺ\%6E#C݄Ÿۉ{ϗ-K6||h~‏kWCk%w}3t%I0X9JL U.0EüB9o5w~>>+Sb]}n>"ޡyklk % ą8IEGRqfby:}kSgǛt\j]SG !P@4X[$siK"U2P2TbHRK&VUFK UC)IX$!F*Čکiel Z)J*U/+*z,Flkk~m_KicmD41Q(M*P2 $ӢfhsE˖$b5n# ƂU%n[.!cr2ZwFƢ4k,XjUƮhU\nEsW9ys\HѬQW+ܹ4Y1DQ&VJT}.y\Y,Z\-FFѱkb6mFܩ'+T`itT i& A=@ `҄ӎo!-a#+]"t@H@!QhmsFrFUsXblfU 1 L¦e(`Z7HҕaVUogFΜ19:}栍sk6EV6孮mZūnQVڹrm\6[Fbk0\ӡ>cZZj2 J|R!dU@Z!5V5XڬV[mLAfa(8/!ѵ5ħA2sQ%_D^RPK`0]ͨcZ*A3*hWrQzJj 24PkdX@UUhHä&"Gl~[^dM) DDH@Fbfb?F woR\TA O&yMIF3%3*#4Nz_XK^DZi²ŒuivvX_ tAc+yebH0TU; pC! He$+1IP TbVm 4;xMQ+!a0Ua$LX!=`#srʅ dtrb~f24~K=cе#֍Ɖ{#ErꚖ\.RDnK*~P8 #C}-dTVkDsPC| ێd2~4$g@j6K%O6Fsiݤx\^`H8Aji1tUEJa*LtuR\,#O? !RDǽ~oA} @S4M.C`]I/TD }.%+ %|#>ߑYAMAQpxez[эwF sط+F^M}:LAc\^4hQI*1F RF%5F꫚1d+ETkF>51Ƭj kmaQd6,D uҙ,ب';g.\0lW59|d#[zϜ8rJF{{OxuΜts$Q! 89 LȤƣ4`ߘ92!qFzW{$$S&IHd4F!K"d$C LdX$&RD0L#HP&F@c,"IA"52"`3DaJHHb $I2 )f&L&h1LD JB@ $,#BI3! !@"4YH "fc #,1 1dEJ@PfBI#`Fd 1 i142ɂ%d$ d (4L 4Rh"A!& !!d4"B bxP1@OЀmhR4$mi#@I2ZPH܁@ FE绷zK8VLTMz!(QO:ߠ5"BpL ˛e˩Έ1cwwǼwO=䎝.^PL="N* `Lb2RJ$vRlIBhPqݎ?mb5h<$+ @4qim d,/Qx& &؝tO|xD{{ֹkː6ѰbIIB'_l^v֯T|XlF1Hhhѣ"1PlAD$F! 66ahEFQJV Rd(Y",E*(42cFٖ" lFX*J#Rm,cF)HRTlS XѪ(R3Xa6-1cAlDXōlccR@bEDRh1Am1AjLUhk|֟$Dϖ%lha&#`ɷuSn:w yy%ώ[wwtLc% <$|_ʶ[2ξ{^ꮘ$m1!O7\/ (xz ${R!F+-P<:o9;w]P+\nBb=\ӌ(!B¤ZE6(Um5cYFe2E4_b_tMP൩^UP$XXk6b`Ō0Q3mmkLh"6dRIъ ,(Y(e btJMkΥ- fF쵵mj*RL$a$ʢ,TX4cEdɈjHBAI1kmbTIBP([$R6Ji!$A$,( `ō$aILb6e DTQMA` IAlQIѓ`F C64TRQK7mKhLiHQDi15ZldlUd1HȪJS"i@᠊(g@6ЦXd  wGUh(ƨڱmIjmBDڢKEX%A+j["(TT[Q6ت Ij>6)2,Rhe!cE%%,E#J,!EP\{-V! U((Ƴ 0Ah60V2ihHj(5,!FJm T)%HZOҶo oZe*T6ɵhC2!JAV-ڿgT= 9~4 q:SF1Y-(Xk*-b_WKD&bŪmQRͲe c2ToN8asMIlRl\c#ebY1&`b2ecKIPKO~l_ i)ᡱf(̦dbA1S20faR":֊> iWޟ%Ir'~ɼ&ifߝ3~CiFLETj6ߚ뫓\sr-\`4kKrF5lbӺ6ŵEFQr鶀-%5qElU4wr0NMƫW*+&+9h\\7$Jwr]M60RN`ۻ[sqnVWw%빮p4hܣrXUͨjU͹E $# q?iʯk_C7nt8s[ۛhEXhfq7iw;8iwuˉvH]ۍ!wM)'\˫n니5njMn:\+LSGu]ΣN7):@Juݸw;nq1H1!qtkhxgIAϗ %2堒G B 1"| 7<acDO+$P ̌y7H ՏY5_d˝3Jog@räT -7CYޒ_' `Ix\ND\GH;QpJT*8{Z>i>^CGjO嫳ÌqGG>?*u|JsǻMwRH啪[\})m*]ql=yqzUN8{V}M[aLm)-qaP 5q+#^]Mzܯ-73UnWۧۧm1Ͳc8c7dх-6f--rٶ1Kl6m--`-ٶNg.1SjM[[I;m_^:ڧZWU Vjgyxuynxq\kn_܍q fw'rm嶛ըc̈aч幹c |o_ ymK[CkjjZZ{rr8!yZ7R|{0y}0~1f*/70 yڶG#v68L{\VvEa`n&m`?`L're/ C/x\O{aS庻,gYϺO[#]OK2euVNKfWAW|fO;3!-7Q2F}[75n^aUd08o(Y:WE゙|ob[/gu-uLt-u?9͏S>.7YWۍwVKYt)NqaWqV"01c(漾'Ho_+r1:L5j,eY[cOCR:j)Wf[+; J$Nz$ ь>A qVF埪ѺJ"*P+= ,?oM =G ʵl#d?5(~8G߸g.="6WYׇbFžB)ϣ0[f3o+wp?sӾp X}O]c&"d A|Huz=YNd!z?^@dgDYA5-}~ܵjيSFBHfU^/5J>e0>GUb5%ZHT.6B ̚rOd2螼x:'wj Vf̘S66д>)N >c\DG.pE >?/x3-ָt?0F||",7ɍ&K$pB.\.Ρ&ەo7>_GͽZ}B=5z ߼j럯;mzi¿QVq+f:p?~He$>1 ߿Vk|lgpE6)cO"(9qFM̔XNBO&5cV >?&Ʒ8n!S`_-'⿃}s9EP‡s K" Tq[YuE GXzPYTK=h7(tǶ:&;Tz0@ӝ_]:hgUɆ, ‘fzQዶ='] :=Gz]pD!t~6\4y|XZ|Hu )M-hА <]u'uwׇdKGdh:; $dt>@#[$1,.zeHpA!ʂ9W̦`QRUJ `~t& =$ )QǓaBTQIs)L 6d] 9>-72XfUy!\?s?bfBhf$" O}@ֽـEr34Zc|S'NJ-8aY4{qFXUzCr|]}gGwow@AtHA#=uѸ};C֪G-$nl&ނ?MuyRgWR'wEHr Zz07ʭ郳QFfOD>+RCG燃8tgݍG22{5"'s ˷ŝ"|z,IMInog} ; hi&Y; r}XYHmG"VWdҏ׶4zsgYn˽ inz!"eiT+v #" 7 U ]RuKf(w|_V'O;ꔞ~ %fj0V=T+Nɚc'h2- {>Xv>tG wWU<kXrgi2;FxXH-|!91 Ў.+3^jק -#ƤaꆾE`BTE."q Zc b}3,HyRY% ,w!:MO5}urDQ- 2-=B˯FFx(]OZ=4#n:{{^F ^W_JC쬟F=bJZSTf7ڑ? :ˍ #UROO'x_7:A8O.{f8VHx5'eqԼYӰiP8e*ua:9 W~L1 S%>'oU=dRV޵a^baΕ(HB@ؾIC؜ *r+rʉ27p8狈p}LCb 䛁m <}eQLxFi!тONU%t# x}3 ӄ,סyQwPp Θu=chtQe*m˘ xq/dXW.\+THNS yْ1"uÞ5eJ#+'LN0L򲰶RRc=V\gߗ/ I@Dm-WXz?T`x_g> Hԁ<p*+=[.$H}:ƙS(Y󫆐C`)CF6}Ϸ}o9Q06l|=dlCn8dGe_8u$gB|gj(LT)Fc ѩ%(2]I0)+|ܜR{TCC"BC*41, {"\|Ir<5 <=",e%Mu(?f5)Ma.n>I*$Gң '͵C 9Y?p? ~=\ '@e!܈d]cݶ?HG_8Rz[1ZEƾF+ \+ct:dQ3"ҚxFXjAu>.ZKV!U獎mvg=[}}.6A=v`D@l Q$@1鸚-:\0PYZp;LKQ{ٻP_ި?`Lp֤?>3ejC$!tOt`8ؒ}rs z1nwfAC 0/rfGb&`k|]oRG4Tּ,Eq`h itЃtOCWS+Å#q D9ʉdjLC}RuHNBD߇NJ5TdVS*UƤdNl TB&3GϤD@Mѐ R\K d$@:)_8xJZRd9M ͩ22 $\p xT {u|v?q5jH/ kj<Cvz=ò+]bvÑԌ:<%?~BfzڨBAȠ(k+z$Pd2 #>RQ=&\6ODJ>劽1q0z~L}>|/!P}e}o_geّ Y{s]DϯG%2J5#ss\ ݺw9L;~.{뫛"F(DX!vtbdnC6.}rb[ꪟ 'Y=ՠb̑\ ;E¶G;O8q }7l6bԨ`,tOȲuާu]u]t}(!iau# m!wٜșw>Ԅӈ  -~:BXYZ]|lPef Pc 7q .IܡU D!5N/UZ44d> /]J/!P'H,_!M=-}Q@ >9nȳ[̓Wɢe cM8ߤ[O%<{Ő4N7$fDAT .q[DjyAì]Fw{׻hVȣg+e[\~=]-LjﵼFҚcOڶ`sP #TF 2-/}ptv,!J%aViAA$GcW*-oǭ{;UN&8*,Gw|3m\R 8+m@R.2}w8J׷Q?K6Gq0+'Ǭ?qh3$'\/^{_g~F U@faH g+ J؁: }_[ѵZ-?y\~6~>w.XxK{ F>ӏwE Ơ9sv@6W:,? t뮏,EGPZғ?DKC{"H~HzBHgz쁣RzlU!?mAA믪P@_] < d^=&5:nLN\ i\@Hzg? )u}k{-ok.UkE׾竉o«ImZ1U䖊j߻}mlkQr-޷koyV︾~/LZHGޞW$#/뮺a)b!ʻ[Pc1cqO   ([o}_/+N,bſ\ƿW^O+~)D"M#?%I_}*т>+; ~NVh}g}W_-\RpD2TƏR~HdO]h(F1Ҋ2TY2[UoYfcv^_rCADB#?h"d?!}&B?Q!ͿZS8BH  _7d/ސmvMАjOZo\G_z!.k=Q \.FDgb=7^8볆 ""sAPh?MVːPzdK Te@%ҪҪ:d(VPH@XA@=tO@FG5povdgFbY@PB!KkRg!ڢkLDG><=}R  ݯ]kWnL4Al\Au}Z{,~ h?kȲl3L~*I': z}O*P=yHjHcOI$A}4=}ZZ`rH T{],=tF{2!)DAb1b2%^I#GTU9{1fXE& j, l$(4̢abH(̤%ƍJ LM"2fPd &0iRXdJ 0a chІI"RE b([dXI (&$3325 !"`IHfB)I02B $D&`!E00BX`L16fYc$Xѳ2)b`bIh(h 40h1`FlE2D 0Ą2LRc"HMfJlFL$`ŘfĤ(eDC!a4TI #%&DhD%cLBBbP Ƌ%H F%PFŒHE4dPTRX Y`b$$LXE1mLhDѲbBL ,Aͤ#L Efb(e50hщ 4TFBQF)l`ĆR,B4!*LPHБ$e$32XI1i -"@$IA,"F2 6,h 21Pb0PiDBQE D$("6EI%!6H*M Jd $(cDAdƐ)DZ!,R,jLKDhf, "ŋX1bLCER"™)% !bJ$0 &&4"ҐDD14!DJeQF) 1aBD6B$hb0C ,&a!),cl2 !BQbS! % f%elT2CHh3 M@10,i-S"BJ1DbL4`6,2f$l M2HR4"dF$)6L"E# DY(i)Ic3*?P|FdU^¥WAԚ3zUs,Uj/SYU*Z20DEM &MvDMQ1%PThTMg3@ ёQESxQ@(.%\1n/1g D4pҭ,~{$X2Q3.2c Sι_]/RJ(b1[๻ B֙{ ZJϬB{ʏ4?J{<;O$C{ܪ,wu;|[ە1 :<+@ $d R2n8K d-a~5R@ Mu<ȌkO/3=TiȪ]*xLx"L%,?x7K *<q#Y&͗U*tT޺ˏC-D-]kGwk}_Ѐ/R`x)\+-a5LuvF_&.z1aw$߼/@x[K0Ǩ\-vw^q*fN@q8+ mY'U }RUy!6U *YT00Ҡo#,y$kq31?H+5WíƿȎv#gZ.]}9ļǯ{oث4VXlU!,TQFElj#X615 Hy'4ABx{yK|z<]f/ )((Z k|~O$/*%(G)c}S8 >E싕 p[z!J`zFdCO$Nӝ'b {&Bn|[L]tY>X}Rw_}_ yW{U'޳I_ :Xr)?ݿr[`*:}Մwa[?qbJG:u>z ,G'M#C"Wh@ʱjloZo;k#G1z253:bb+&i9f{וәsb`Ί}EK;E4.@i)#7;k }SAp85G%ɂ+O[+2f>G}jKU\UXkLӪ9YL𸎉qPyU.zsZXtI06|$($tB|Y]ߩ]U =O !,#cSG@" 1Ǝpu2b  |SP:zz?El8]GύT:%zcetjjDzCItE]?nK@nܐ!dYZAg N7 ߭L^+ >#ޟ^sYPzN/|=vBdVY؉ثګZ0* +|wTܜk+L '^̃ԟTX/issMX"u!Hp͏؁`y2_i/Z}ꀪ8 I2ɣqߏ6%Ս]aDz/><~}1LO+:lJ1q7[?7TܒX.C%>ݰ;KGew}}_< #G*H}q+vrgî[9 ]4Y ޗv &WyP'Uy vbpח3'DPm>`'Neݫ EDS#zSy=TFat&F;h* ; uf^f^q}`xϟͷJ}?GP=l?lpwȼKnʟG0U\rqPC`/U3Yx`uHioh8;Sy8b?)5K 7k4in7Vˇ IFҨs;±6o܈=Ly3M x`uA:Ǚ9^ZRq<& d;@77ҹ>2XT<'Ìzz ҞIC?_$lSw~#y~ @ÙR!JA}_K;)? N/|(MA9Oŝڡ j|!t˰+#57jCN~.@=w]Ctڟp$ fxes0BeqOqd`w1Cff/,tRs҄>>d-xTz.r W/iGzTsc K9خҐt!ъM|VC'o*& -?$) Ϳ0񴮈uVƴ 8Z/w{@Mw.`/ܸZȽI5"(";q  .MoD}rg9?/a>]_ٸOHz(F]יV$q^\<7%c{'}y#a<^C8’tGD9}\Ͻ(xJ\eU3|N|O|{DzDW0|a D1!J`'Q9Vو=?iyb^@Jh* 9z: KL}E>P$e*!к,'FpDz`٥PVI`4A˟~!T0; .`@(PJj4`=Eh@J'ph `}wO9(H-kB J0(==hkQ]{q.,(*JhfX*lӆnϗFjFƨmfMsyUtnf*QJv2e%YU'e7=zhC^vYGY%n+so]9)zEphR hPX >*4m8 9^P|2vr p>!elf04PKm8uvۺHKNCׄu݀>ETAa PPwjԈ#6 M @ԋְu#[vVCF@^MPwm$ʔ/xwwR}>rΌt69x"J@`>> P D  p(Z:`jh";4D vu#T٬U:7:νMUfvϹ {{^)om@ w)JzWnRVo{ zQNw 9 $%NJJ J =ە|-x}}mv۶eQ"k$< wwx{ǃ31O_Sf'cXm;( EPHTOm(W€D(^(j:3 {J(hRռ 0@ 0 A""MOA 4jzb Gzh@JIIЙ P@ O%$ F@@L*i7hOTD@"4ɓC4 4hiFѠH"%6A& =@ɑG4z~/IX0Mm"YIc2L*p38ɂa79>1Wo޽1&![d 29vaFXE3N d7HfDHNLFS N hXA+ I$-+!MEdbc%ʆ?ie{k?iS7@˺sjRTM c$‰j9sm*b(J͠Ll!z Ie7Uf܂ۍN5&Eq2"S4*aCS3PX A(43BwVTʥWU &B f f$Uɤ&T6(HANf$h7'4[to(9Yev&\ 4$p\K jfR2,jf*$jMUHۣHDبL42afFT5-`5"2ܚ!eXNYJLC* 0 䙇Ig-Bc6UDȣ-$9mV4a"```L8Nn9hwFDަZSF]TXVؘ}OCMM.ݾf*ڨV[jQ (u.ZT "CJ^pYyz"s$FE ! %T+1@ ;! LTTutlT6BKpVTrTfn"QlYcTt@bjCڨrE;(MEZaKA1(Pqe3 pdnRqsRr0I Ȉ\MHС6FM3!g1MTfb\S$e7I҇S#"#0'%+͒;XUh)eUh̃R̆uUFz VgS;NQf9r7E&q* huԬjfFXQNq6!N4ҰT)ueGfW pʦ%9F*ePm̋JڰN-F! %7p,eWW/*pKHavtTEҚ:dQT3ImP@W0iN9IT96HEK2EN.ˌ6b\Hq2-1)c ޒ4L1mkQON)8%bu=]n ZVp E9jsFȂpYd9ԝg4NwxdUE2E γW#@HGyɪYh[CIQ bFLVbVn"dU+9bF Q 2*Nf"^C-nP2 8.J$ܦˌ6T:3)A KH9HgMڤP&V(]MVb, Q! 5DEXRjD`"b*jD06g2TP4j*S, D"ji cGŚf8el^s@NMbN Y4dȶ @!GR*QLh6ŤUO,{k&r ſDRUMKd^S&DsDa*l63˒ǼiRL\\C8klh0IL#E4=*3[PZzẖXIlV~4tϙuˍ\g:k\HCWNcJ&`\qh"J&d=]< ĩȕJɉݚrۧVYLlpә-%fDv6î<в(=ëm4Y59K;Ev [q}d}{5d!]\ !-ڱWcmM4JRy7T"DyD4DȈѶ1N@))(7-hBRERpY՝ dK#4FS*IP퍒ȲMdRЉ&EmTe4]P"eMg,cl.򕝭Y6c[bugR"떖.)z&W$ZPEZ";u fmTmZVӢz[:vBU˵l:ib'&GkִV̺WkQn%WDN Rb$ikYmFlie3B.\g&WJ R.6(\6^)ƌ3TgLSC'c ŞHȑ Lڮh-akNMmci32J96zUصhIfrꋜlGdsp"F3k6mmѵ Bg.WfˢvIUӑ 64Wnz͓:i-P/Xa5؍WMc+U3YPG T4bÄU\lv/:EU$Fm3ʴN9Μ0^puZ^dB6ᮺhxö˜6(Y$=eDzVle# tDh(G.] b{VI:đj16RlRm;g:S93SQ7l˛9ceiCb&7X{Dk8vWTV$]PƢW&r Mct$'eSшMvݝ@ͭ2ZpNw 6Qn;dtF8Nvn[X6f]b*g'LꜩL, V5GҨ@Xvc6Wvz%a 6桛baTmbEK:BNG75Xʳ&m›\M'EltTfZk,3mR:Hd;HeESWh\:UҜ%UTE1g&jQ"ܼU9VJh%BfÛtʬFթk-a2M[l35j6Y6tٜ"*r[l*9)'V`^^;m:{"֣ 0HQۍnœbNEvӚ9bӴ On[jQ+6Æ<vGgqMZ5hQ[U$61R%m=Q;Zf6̬YF\cvug&-򘙥)c2=ݺXKcK}OD< <͇ȻsΥRO&r,37(3scbPDU?TDUAmU$W7H"W.Q`"wvQ\#s+W;R+XDkJrww]Ժ0Mr]6*J.\.mȴڎDW.KR!B`,S&Q:m:c\7#Q˩M.d674T#*YYe2H2QlqMǝađ9.EE* ;.RTjk*(ݧrjFN5k0Vs;E&DɤQ Iadҡ:uܤ[IdHN"•K5h˺Nh\|{ࢎAYU&mREfd͡jNibF%)(pCpTLM@ p{JlVDF[e0M : D^f̤8oۇ厹7c-}}^n茶{O$Kc?ASNI'Ó|PQ}u{Lm=ޗ|W}^>o}rGyޖxc~=1o+e8y֓KKJz {IlCT}Kcogϋ{%I5 OUziF}-}~_|IqpmTR4fc"A% {J>^c z^^Fl`&^[mmM0NQG":p#EaƣwIiI5',F($hKI"J(&=^ABvk{-O|w}zUy)>uif*J!S$YFO { )(yz,mQ`ք9hݦ-ȗ01EJ0Тʢ^t>l&=,Cϳ/f#Evm3XTRb> PDUx[Ch\(+=!Az$ܺZ9L04Ѝ7>g^O $هU!bmS7g2.wuEN!cŧSQ{'˦oQ!*Eq~{IzVUg6t;5I|-P2N槆O<I* caA{[;JdF|IYJpxA0d/C5ȤʠT;H4 N^uGh<]rs=o{BS9wxyP6 ^IHHj%a4i(0j-Y#gw(bh 6Vծ6]6\cbڒ`h5r A#sIKsW.ZDO.NTW.U8L) NF@uKX5PZ %U# EG++4E-hlF4iTO@ TDPWUjZ!CQZJTFU)$QuT?DBI"H ŒF%@"TxdAAX6-Ɗ*(1a,%F$216I,FiI,b-LZ@4iH Ci6BE 24,ECQ)3cEFTd -Qb%bd TZ f@cH4S4da Aj *! oMFmch5FTVEQ5lUXh֣Uh+X{[EFk 4hŦbJ% CBXc-PQM0%F"*,i*$Qm2,ƣAWEcY4&$HTiFc ѳT/@꜂%d Rت(-Z-Fb,khb6$ѴЙj&#$&шhTMWQJR(҉BRD(*oBU%"҄PZXFch}֭(U레 zLX])&luĚs1UɮWF-3tۚhPP f]9DcmHsC5BkmЈ"ܵȹW:Ü'eӉ]&5I2)T%(-F"ۚaʠwaFh:r Nu "$L嚙UY] 4 0*%fXY#AM:\YQ!.QqKe'C2H33LNDK+T&$'K$45%H+ &q@0@V? ]@? +r( U@䊫"?Q%G*?!@b? ?*/aWPS" PGSG/?/]eme|yTZ*#1-3K2JWB$ݵ B$: o$Q(޷J,&9o)@*v]^TB(G3LiRo&I &FEcW99_[zā䢤}O+1JKHR|Q\JU z'$L$#=2?Vˢ痽ϔgTX2.ReYHwcDY{q =3_- lO,ʼss[FեJ"VF<ǜ5\Nwco<=5稂$a|Wʮ; -~dGk[^"IT4}W1tR+Oޱq0l^wqK.f.AEubi{}>H+$̪NĢ]^SΝ ?Ѝjsjkbõ˵ TrzD*]ߔS JC#yզalI}3 2L:@15@; 3ksA^UARyBz#} }3+‚ldƖAIv˻2'ˣl8?kdl<7"Y=k EP~~ -)Mh2䆬_>ғl4BktaѧرQlTFƤm.y]|`y+#' ,0y>6ol"R)эV'~+Bkj~wb+rmC7\*`! (gfDq sE#1Xŏ׊I5Cw6[2X#KRs zt͆yG'I\,[/*l|5z1s! 9gs{[[umg!1'80d{׮>zbOk:FW LR1Ag yu]en`ϮWk{[*Yj-4gSm-7M, C8z^wa D"@ +#w. )U~8`U*nTm?\dF / lx#x,}Iixu$UNPas[%֐^Cl#|ݱ0QJlnY9SNCHi9'5(..Ge˦I'ic'l9$7:k!)hKl}$zӹ=Ea--ɤht .Qh+ӛH۵t5||%(1ÅAhkINaE(XYĿ1u _ذmA:r!:HjnѢĉWg_ԹX P5 99* }Ue9­*HԊi@>t^+2fٸοݤRP%E׷{jBGԊ3HuQyuv9tߣQ=es,+9|^ܔѴbJ+M)PNTk_=tٍ(Yvr;#=1Ŷy9v6h-ӳՍ[e];X')0w\/[a}?ܒ~9fʙUzXJމJbPkN=?{-?@&켤џ|(WVu2 RaL,O[ $+mGN=*mp \]G~g? |"9񫋨7cł!qm"@轌cC=oH*X$ְ>ɔԞI yT[3 .1 )\Z &Oox=*<%jLoOOx=hBvȡ"ΘIĒ__D[9:R:XC?PL|bSzNJ4UPKE'w6NKF 1!O |pOOoR G;I lJ@dRd d@)[d9dPr/M^׃^1jH$˒PQ%nN2G%2Sp)dˋu8Cj|Ix;爂WnORbϒf!^ !ᷮqe_ټA0CG+kHHCijK:́BɼQ$P1;)=lAZDH[mkhD*9+',%흚lU:ԛ|7Ik?iQߖ̦J7`׽$YS'. Lta_ QN '$)m=Gq ge_;8u`iT \:x$&z;ȠPɰ7w+4n rvwWWy]d&R @/'e尹 Ƞt(!\-(i\O떧ˑuTAIϡCqr"/;|ͯ|NS >KvɊTG8=O'zĊB`1XcwTgWLO'o]EӴ7jȿ3IO'gcg\/uI+wwҡ&<;#D+';=<9Lt"(H{';cjc({Ʉ{Ʉ}/y .LzjMx|̇!= #p C.Qp_ym|M'&m8}aA|BC}nR#áФƌ{<{C=?W>3TB"=91_2ǽyS1&1Rc"N~?q߿Q} qWn@O^)vr9Nu<.ϜE/:NMy/ElKGdm=NS(Oޡ:LwHa٘ iumnFB)$Q}7HIˠ|xd7>$ѽ3ˉJꇨFv6¦reJXuI{&$5/ ޥy"'s0[emGq< cPތZfuF AKNۦgTJ9yks8rFx~vmo佈[>.`6 a6U SS.4 a%MK nkNQ%%JOdʪ?2&bN`p6PXԻ([#lЎyγ;o%<TCܠoqg}N2zڰ+Zbvs*ɤgP4wttsڪq&li˕\hQ4F'YY$Skm$hj[vr:˥TTΪ٧on]SղVTT)jꬔay`Q.;Dfz!O3J£P((-#apl3kX6E elvuz~‚>rO3V&K, zHRҷ)eHLWYMkm^?zS+Y)ͻ2G7r\䜆;92dwq 7 LthHrJ3HlдHPKQNMdd&SӁT^Ni:|yLz>;gXovSs"bEm,?Viښ\eF4*dBZy*)H)@ rU6PmXq[Zko2ǡ/P:VRѽ{7uirs"{:t"JOkۈPC׍xmm81SWƤpac m4עxwy$ gDfr>c!)J;=2Ū՛-֥ ].-e(s%Ip6E76) q&uԽX I[(@Sڍn=cV1l 6SsIH0Y{K+ /:Jb H$>;mQދc}q^#l%USƞzz޿x'mB6_tkNӯ[ ^ïwRhrKtIOivT|Vs]6JYv)c0PdoI|t/_6Zu 2XOEehyB0V5.('HPtLOڍ%#=y?" ڂ_}j>|빒=@g)^/M5&T++n-+Pckk*Ey,Ӳ*lL@웼؊"U6)6<"qE;<ņA}uuF) fy&7d7,7K.8|; o]G^>{y gE$<#HO.Ia0&;B9#܀P2 -'$Zw㾼9cInTAA ⃄Eh?Ha/cB\5&OWkWպ&[bǽ-Ed:jgHO{愭9]DU,K4 1x<>WsPDQzlQ.=HR&,6&_];\ILlgy.+&*Xf\Fc_Xmyl [Ok~i޽EyǯgaO ҍ sTӚr$~:CDl%"UG8ɩPV2߷Ok*ZI4Sx#5{~/>ڌ0)g[&Q rao[5ȩNjf-gd,$Rq !H.K%R- @l܎;J!|î'&X>B}DXF][ 6FwU(jg5iٺḁ'"szʎ(ivr* X6_),b[+y5R F2ҷYܖl0:ZȈ`*϶U\ =W#nkkuVՖj4ɋ1ajHubXSq '|FV4e$Pyۜ$SKs lsh |pyr>4ѓ$Ð̽[&IRxؤtB#˧ɾ:rծعl㗔:CY?eW&Dbch^8E pwi̮~15Ok_%0j}WܼwH' }{Iz8q5;$1xmcs(p즼CsE)CG^h:lGd"%U]6)E;*rT%2(NN@H% R*(*BK!l <(9ɲ۸"2M`Sl\.`JC*R ASaS%CbV-P P)Jr UMG<eLZ QGSe^H4rBZʶ*+mZ/EQ7wE}*^9K1b IJPҠRRxhPZDUrAr\Jup嶛/7N dH)!W0Lu\l`6ZZBM*d|YStHrgҧ2leY23M&+nd4R' n`FBB@#B xw=ZdܒN,;LbtkpeIxɵ;WR@z mE%;M4&N)dQBJ=d$ƠxcsuE2Us*yɴVOYAM^Vp)/ArBHIHjژx*U:C=*d)w1v9la[ra@AP܇7ZLNj Y^f| e>.~0PO[9rU>z;IO" _<< \JCqw8ȥ&T-+Mtc,m2#\卂s=6o'$5|+DzEzA+l[qyɆƻ ,Ӹc.zAAZ:A.GOi!UQ-r=A_U#ov:yƴ 2tQ2B/nZ5ANQo/ `dml9 VnЧ:p}Bp? |! MFQrĜdz**kQU!PB+3R8K=V'×]>0Sp<:SƔ!%˓h??{਩.W6h 9"B!TViG$N## J' B@(Difb̓{65' F0gByUy2h} VI ]B= eN2)"/̝ȧI>bv j D:dFPϴ{kIQk؞U*1p[YC:*<2;vTj \LIݱs.nDʩ͑8J.tJGIˮZAɅrC?Y[NJBΗ {}i4 Z4 j$'C޷ #{tˬnb{2h/gy0e]BvI;~2#5rqC H{Tp[(!+,!ruYU; vaq:{+L\C^"H( L.Ӽoކxbu#kւyO=С5Ov zj~aNetɦ $zt3ņ22 Q2(wq??>l}˟|np.!˱&IS}n{t殰5nyqIt`27ׯ\+ܟjۃwFxhn;b߯fz>+B$XFT戁1kZ62A'' p[K>pokfQgX 0Dl2I?'? & @kol^q!Fj2d/)/*qPyެ ;-(Db@o-dz0+kי q엸G}C%Z i(8S&F\{ainuƺvrrQ=vx86|܊2UAyChA3mYSΗh fnȯi"؋S'*]yO10xPk:ikSyq]^]5O>J!NJ**;6c'A,vNT.RxyI1UBԿbozR'n};8{oQN8_y[ (XfcCdLgsm (cqfփ``,u+SsUK C;7Gyҭrs1|VfGht@~%'ۘ#ԧOhO١Iq=^>L;g1*cWw{A HrCm=KS.x:>,荜\$q2ʇ-8*r}23C KBHD#FmW)p1%#ɺP;"ߓ:'vqs8#6N(HDa_pqPy&S !(Iioh3|<8g= #';jq0z2 T{w6 (=n4b@$ ʦQտ} =V}#g2zcߠ'p Ő/hJrF(FvET(O2%(PP\JGg!$=̏Q`EJ|ʪ"Pw&M"+C!nEJ/{*>l0ί49(>A)~Wx6RW-~BCBu۷)OZ'Y 9JBu ng-θ/bybXbԱ '̺ZM3,)jVPC[ @KDݼY< zzrUܖ#k-B=l8T¢bZ/Ty]ag97ОnCĞx~\ }` ‹w ly(wd' Ի( ) &(:! .Μ4f712Ҡi`\#d!06Lڗa6J6rZ@)^BEUQbMh%v6\(22RJZJ  v 6)\hm(eK?މڟ̷P@Y qut:ر[TkB"K%)|-" a{sBhakD$e8T2lǭ:i@jڪB\Qs(ack/?{ʚm&ֹ\qjF(6.!:*QGUUHk:exmo_E SK[5.a=5c+3Shػ"Ki_>_8];8_Q,gH|Ah2."}{S glI4"*6L#AfL! FJ LZ"h@i$4D1@D4dd)bXȈ"5 EF"$؉1D0&YM$BY10$a(&CKHPhIi`BYdJM$F 5PTdRFJLB%(&hʂQIHLġ3)"DaA`d$&4=u-$Mh& !D&(ɡ  F4B1 M$& i, ajBH1)I$DfeDDa(E *iR`ІRPb24JEƊ2i,PŒ%FƔ2F,lBƒE$Y0mDLEd10dFƋ!RAPaaX [k\q]DAT#n"T. uaBk:.!9lNUCѹu4~DFŒ!wU;p \8l`c'0BhFK!6?+#+"4j:`:oltds兞H& 6":J@h u"kL (k:Q?h{D_ O_LnTTtK ,9W' Ao{Amu6sxG5+<^Y=wbOmӄʨ<)=QQVw"T9өmeNlaKs-z `Q%{D%-OϘ$*>,IC,ziCCR^/1r#K=i >/J*q ٝVv^Z!Q-# lIr>g9caoIP î:G8j=OHs)Sԃk( J= $dڜqFU{=+KڗW؄Ş#i}Z;$NL^?E?6x_#քhi. u8<*g'2,42[QWzʩBd_L}N@"pcoE@ N-1ԓczcib$DCSwwI"x6T,_YnAQ;]1@->I@uS8l$Ч JByA މ>!bժX-Ս%F(M+R95V֦օF]V!-Uܯ[-LF4]s5I]gGȝ hrSK;RpU0nȧ,6@d'D:26SEiD7fannU7ehq<#0rL2Qy HwnG,d8ma R3yW!)f4r9c tNF]u3Q\xzdbZ^07ޤN`BbDI$iCތvLT2glI\q8'>#sQ-!2GQ!&.n!i@R!%֐z:C5vU["Nڈ ±T,glԣ fkX`Jl@*aqk|E$iFFk[]h!m$ܫ5$iRsW=⋑{W*=cxƞF{^>'t*9/'RC[ <@bwhpvWoGqZ t|"q>xғ^9/K{kԹNOY{}=N'Qy=$H|O'|~z2G!(/Ruh|=S^ |rCԹ%NWR \]Є7#$P :zWFMSlGf<Œ7njVtѶ_o$$FS=RjlSBEV)?i#ND mQdd:D9M~]ζvݳI *PT8Uދ{\4FpaY]9-d'21[f[UQ;;) N6x53NL4t&MkA)ؔT<݋%V5xml2+tX|cɈnԮs)χc&\ ]fu;KIY?N=(%V=NOHrnV\s@ [꜊iN2,W ɥ6)J?C1 erk>A{+㴆(Hd&IY<2%v>{ң]bŵa 9)Opf] . s'Շmҫ5FW^E ZC ]O^BݹzdcJɄiBEf6 &;swtM2 kI;ph,#>L 瘘Ӓ}ėY=G") K0Xxl@4 qȤ-Ysn%y5RX;0h ;; &F0-)HQCJ9.J4R)JZQjh-ndH4)"lCHЪH&eQfc%m84lsGtT.w8׽0.96S$6Ð d kd&n&IAۘl(KaQ2i2Wn@<8lwqiv66JJrwq%2u2G3 Id.Hl @Bp]` ܒwXB9lf.BPSv 2NJ˲ rW$3!@ M2R2'e3X܀N dM@)ddӰہNɕm&-dPDHNlXLX>2!B31 q0k芌bM!JSd(h 2Nꍃd['xa1Y@5r_byg/(drh22D6BZv\Ųmj9,msvW;.F+eBEy)(&<r$&FKDgSlٹMHVf,9̒!TC`sqG* r'!\0JT(T1""$|(e~Rw9]"5hKF1]6'J#@ۦPxhƱGN$0܁4)!͊b-&AU^HPqE3 7 "!ZTSdws$rQDJʊ 2PhjrAȥZL7wQ2]?Qi_ ?f)'w.%;%͡U B5v"LiԐ]=cD[ŝz--;܎Vn3|omvP\diAwflb.u~ϼ)/ :f35&wuD=2(p'JTƅ[lfmIkr66}>nsiIGۙ]!];zW;(׵oKf=7k6_]PԿ {iohYy~LLyq-+DTRKqfXUJ+}[ꎬ}.ͪfpsM+?]T&HKN"L nY=t2eDђ"Hgu$c$,VچW p$ef`"4 SD>7\@ˣ빾A% A*&.(<Ћ !39HBF|w\KgbjmڙM:tމ5Pe[ ~?mvYFMܥ"MĆ3mPQ$"!cZ0m- >?ߏ$WОzA"&16sXg3'$HA3jJtCEMҊ4"R PuH,`g<?QGj|›q t1gfTq, 9̖`ډĶ9ۖI\a ˓tSlL!DIxğy4f_:XXuznߥFx7y_6zO`-,%&OU$?\"m !W8dDYXX$Q ST*@AR BR~2:ԵO LH&/ƍ2l'i=YU߯Xw~xq )A7 `(PÈ&rjc !V?K91[Rǿ=?G Թ wbJptCM APDx;MYjE -sx1DpÈ15dCA-Ժ[M898mĺ,-k!'񦿮xV t\K= buKFIJaB)Cs4$XǾ'K Dl? tn! {R$K7ȺA0p~,}BH@c!>ϾKma)+g_hiijDev/~-}=/cPd"Ipk5,Ca-e4ɘki/~[>gېOf/3/3*r8HA"n.$ȋ9DÙ@S3d(LEe+XSa-{=P)ӱ) PEb&Q$" KE:x߃C$d$x~o|I5G??G6(aJ1 x.fRM%0`Rݸb |MeSG sd FUd*wT} YU CQYi`v$РI AF 7_oiQ"G1SOy5sĞPS!p-D&Ѐ`*P%f}oV. 5Dgb$7CaBx\zX~T;`bb斣2 +-ݿ3Ŕ3m# LD!(DDj4"#g0I-\ ʔ3 3֐QiYa'FMUE)B0 HıeI=Ša)DLb*=,"#-1YSe)Ӛt-Ng -\t^fdzno礼 Ȃ5\MRFȲ0£R*`S!r 8CU1 I6՘#1' s0H"]0e(҇9L.-Iya$͸*k>(eʔ4#>0Y.$fiu%S!J*&#Pd"R&kMYf]Lj`mEx@Ua kW7>ɋmnH36a4I Q|iHrC(3LAG%j? B!LR0 0꒔ 4 jmN)f\P'@QO0D4S;Jϫ.٘ilT0nMS1 H@N#Z1eoـJQK,AEQ"D?_MA#),P#a\r o k?[ QgA_ȾaêdY"@8yTa#aS0N C=tyVTni "+det?kk na2JIh;vYOVq.?m_M>Zff/=N)Ҙ9G;]EbH+isШ$Bm0WM挶J>׼7a5ֵ ^,FP H w2Cma Ԧ<3Rnd21@э֙Nș.H('/|ޝK$ %{S[DS #^bzU*M}p/) xo;:b]Fg]WPSYOi0 JJq [V}W@H-iq)zJTuYVXdKvGlѭܑ!zlvTQJ3k\<ɇ) Pb zT+j֓:nU+$$dImuu&woCԿ{~T)`D!_oovz:%qF*kk{0W-ZeteδLCa[[j͖{="ѕ2q;:2! XȎ 92JX fn4̰԰5Cǫ.Ns?ozWF0R` hteXdiVD& 0ӱŭSF4nԞűFubm8-`)I\aD`VTt̋Tb D/UڊJA 4-""`@5H˅zWL86SsMka3vi>4HP ba[mؘ1,t5#նkɐ<Ǟ 29 I@Ro1^/M1x*sEFN9(ryh9 M7)[pvC.o]!Ï!z؞wδNy'ysd_>MuU`H"撫%5jҥGL P^p$n5IF;rt޵w wPtL={'?=+VzBP4ܖ0'0$Y_[q<'GS7HP~]=-O` ,,мFVӋKƜg'>lav}׻ tbKIHi- [kZ#].ì]h-䰅? l+d~qZK؎(^a=@Ɔϟ9偘pm ZKz،`VbWi6r{dktVs:hko݂{(|lBZ%kگbrl0QcTz\sm,N]ͣ|6A mC{zE|HҞ44]})֜i,<;^:6Y{_E"Em=O=)Ѭf- C wjo\R-:֛K19#!g`>nX(7Tᘽ{CbJ@6nPhUȳ#yqᱛ[Wa1%gh͒0M+ZVKaag_>|),aGΛw{}m'DԶ8Ğ䎎7(#??jv=JR(f͢_=VJ5ޯ/BDj6B#lۑ\ ҀUQjD./kFo_}bLY-of/?c0oj3⡫1m>DtFWD,M`xiKE~Kza~|\,kt(K, rY*i)vC hzij+X%8)+ylիmr!QKd{r(ezW4Z91 'Fkьݗ]<$m:"hfӰfNI_kWe֑$٭e2>S25L3yeߟbY~lȩVwۗ9Fy^8a[[3/d)6 v 0cR ƖQ8x;bR]-QxmTD8ܤSs-;io5? P:Y׼Wgql 6S]z0.‡uW@Q6Pi rC;!6: 2hrC!^@ҴfC+䩒QH Rl.҆@9#feBl%*(Rg^P$'͑#v͋/ڳ|0>{; ZD ҰMī1ϼ/NyNXPك !E}dS*(ZZ|L[-KV=BmTF^,=rZz=ZJޤJݲlI{Ǖzho3*,c(_k1xȫNOS)u KjY۫)B1Fzݏ&M?ҝmm?6ߟ`B#$"^L!o)4d XgO*}m'vhrmM(@&JRpOWK+9Z=Kx;"Sr:z/ET=ɏO]xxQs\ &a=] c;1]=y aMkSETk,͞5i Fl+^Aʝ_RDV XxI1.LǞIz--uBŲ *,дe loˀZ{Obi9(+J SnrNi[T%^x=Xk W^cy+#JNyIRJr@Q!ɟyfRy[ҎJ怶 -}V{uH\kn͡2Zi5+XEeSr)3(_շӇֈ҇6;}6_Oz;l걖ϛ3<%6%rFs&1*+QRPVSM*QSnjbT͠K;k,0&ݦ[RIkhXAH\DU$mh@ZEkͅ1ѮvԪY2KM޼a;jBW`1;P>ym6eY ѢV"Jvf:B!fH5Z!Ŷ~gi-NNےX ТL1v s6o<2C>P_IK{yY>5"Pֱ۬ߵhW͘F3 p$Y#%3ڶceimn'˫=(bh3nYɗ+q\_MQxՙKCFN7P׷GmllP1cT ,aHbUý=ejڄCׇ)y:%Zr/U*dN9@FT0gvؓ]"z0md͠B=R)lmdmz(C^J9nH*ɹiyۗ'+&67.yz20vUSxqQ=*jS=&&{= /)Zd{NvvwZW:FC#vTm*j®sA#TyO/.X쇨>HU]ϫ g&r/(!va':Z 8gLmfu8FC;'N6v wM 9'Nu!\I;|duͶ!+ |t ɗi7T#;DdEUMNR*rl=#6ӭFcV 1!MoRF(UlCP҄Bb1ݘh,>T~p/zM$t1L}o]W^}G)N"b2D)AR5ǽ粽.x@QpN2Sw=My&@du#  @JJlrE.B9Pr@:vWДlll-4l"#Ymtac؍kd",&czy plSջZѶ,u*96YiM] ]q4 RhD(ǛZHARj):^G.L AvY9zު{"W\0mtLLk9%ٺ+y0L}Qᐳh^(m.'ROقpaL@jXv{LT; vyx&mCP:u;<zssb} jXE=ŗѐ1)Z3*<z&I )Fx흵{͞f%ShmukwзM<Уb)K(ɾ%_4ei޶jk K1ƔC@k Y}Ԃ --Ba?Y Xb5HRRda0By׽pf (j?v,'ӂ G־~ D’ӽv;T漗X2=Tva/^l&"zO+l7mU'22("(>zVcajzzAȹO;jK'w;޻,a Uyijl[ h˿=S޷jC{IP .90b,U *BmH?o}jL߃`Bx=4V^у@1fQOJgݟ wO Y[K|;~L䱹Hct@V[W* Jl8svdIóSe6ܶMCsq ܰu!=X-=={ROs(2C΋ 1S R[L=[~%?yV,1&0Mxo}>ķ[QE~7}4: >̺K1|DF2KHIGbV}4R8~~i -@5@uַOgI ,WyanҔRPJJX*xLB6#XAIh?\^=_d@a  $LD&'&ȼ\.Fts[JOfk<O{XxBXM`QXf!|O{ކ,6߼[=WY_FA!ȑj% Jn.D3(&W4|c|{<{v%an%?n,OyeQƏDtь6R{Tv~=(rz)G$Qcl#Bg,RҩmcD8FX6(XzmQez^ǕPՌmgѵӭT[ȯ=Qc&عuڿmzI} v\qz=XiDj,y1 dJShb@N 7'ۭN]'Ǔy]tFSv@]uLI㚗H) ;]5<A;y5GHcތs?9.ZؔC'w u8qd4.ț"H'rPܡH!ԫB'Rpd s^,uݔ]lsړTc?}h0ح#uŢNNlzydHO_m$[2%&.ԟ^©!I2\sU8g=Wrr32Wa CIwϐdh24tt]IFAAIGHѓ>vɹ8 .)"4NxWA;oe(l=l̬JWhZ>WUs֬Zlbl0CnW 6y B 6ڃ! B 2t$6vi8W!k]LѴy&zg~gX>w)D(ca֢{"UȊm̹DERAwK)}'˴'$*3CHA<.#=BgoM'yBBW ŗQneK]$.$gIVI4,Ǒn9Sg! @em]K޳XǪbUUiL660lmS(k}e a>xt9s6Dcb6iMNA;__Npyxv_G'OC D2ẉbO]v5Ծ^nضgV'mY[^@`, svłd&-ĿY %Hgbik'mKYrY'ɺ,2o2p}45 GN$g$1IVck͕1ĶɉW2VFDG/0khUW+X9]iRձ F{Eo{Eޔ۝\)چՐ M\N[2d'z,QQr!َ״ɿ'>Qz{h.tE|ЉD9rr*Y6$5:UOy<:4ˢ'$U+V!*Gk,R%b=jXVձu'VGJdeI<*y=9'7EV(xFo^r+Ǟ{\,YɒMUYAUwhz(eu,jmmi^YKk5$p hJJ]UV̀!˒4,:5=A mq}8mcoxW͹/k5x'&/{~0C|-B6]Z1nExT|]`}km Ah9jڅbn^XFjF /etuK R7OPeRӡ bf9?}Rh:GHo~_⾺(mE'H/I#$:@;&NR("QG y+ElCBr!r ^B6^J J(dr(\i@EgnLmՃCTЪ* &ybMgOwQ&۫q͗ZTl%5XQ:oYQ{F ŇIF`-۬moUz\$!*vљ{+LprNNLޥ8Sɇ[lG Z)jFLOzg/S!3;r1Ǟ Yj7p|zI$bM!|)]i6H܊RjFv-Z막m&,b%bR'$h~.m̰XH} 933''˹ )8e.fD=NOFDe'R2ųT92-LnQQiՑ=`[DC.2H.uM]c`Gl-2 ! x4s Iڗ6Rq!z ȵzɴpO~x Ϝ3O2 {2d623yBzfdeP%)Q SM̭33Ihe'wnp9*DU YV :ft*&]RJFQ*lBhUXXeȢZ"I١EI ZгCQ5.a&mi҈GBҫHB:k1NaBIMiJtT,8QI2 ($13έ#C,P:*HYbҴQQVmYU\$VMTPdZej,dXUE!ȄQKhl'S2 L-edjQ$2йDG#,͚$RQ#Vjt¬SQSigXRt2@,;3$ZHW -jaIR,,!Eg QJŅ`]qew,D:)Ds'NWYMiеVF' er*6TYE*0QLU EW)ՈJVaHZY%Y-UJ[M jSL:DbVArH0ҍsDKUC6uH-VHZ$)jYr+"S.!d*!BЎ\wLS$UBa"YQ)6E IkYs%)HDMTR(r-Z,5XrÕ%t1"B݋tULU9HQah%@XG*g.Y@!L+Bj*KYK9́ݻJ(BS4)9Gg5(kTYP+:F"4"ifFPw'!Fr]d\KV]YI) f's:w:qE& LEvcB79wpۗ#.FPw7LQRKjW-!.rT+ sS0aZb.IȹFHPu)NꖅԴ#9jRRBQU&Z͢` *Z(2"*UTBrʨ(TrVR JP2,L8J*FheHE*)(rMRZ&rCDE)s4Ck\/}jsw|_{%+g <} }Z1Q[= @'R'ö,mZU3R:[ [3gڶ&7O#be1G`Z֊h4lUhب(Q#QlFY 66KEQhQFɣkl-IQFcPbm`dZBAJ5 Pi4!D!PZIRT!$F+IRlKDIITfIP%FRFƃYHdD&6)" 1S10hؤY3&2MMdKȈi$Ɉ3A$hؔN}2^M kx =r: LK=F/ &;H&ȩ @PdE BS@;~1Y0 k"֬@[T)UNZRXXU|:}AZ1>編#t4?PՖAL(o:/sk]z6pH7[#bk`Z>ևy!ĸWA:>W*<r<~/V#6v>㽩u_=q3g*32yf娂$`5U'CP*FWB9^t< ޓ<(q*@Xj>b,Y Lo}FO<,zA|R$969#N BeYuqa57B(Ou\wr}^?mw<ߊFFAQJezJYg&Pphbs&#qĎ8ьƵIXs1ۉG{/ɳH-!DQ.({0T'PSiLX$!\TR8+FoY̓Qg=#⧫Ѐ9t?7r ,?s8>ovC$OZw_zu|{И\ru\UϬ#ˆ/!'iP1]GcZ;{ׯYsG=<]=rNHˎ=o<ێ{4Oi'׹dWHϪhDH놳5̪TlVx$@76,#T_lHy^9)fs;* cgPZA9xwGxgr܆}3bumᙎT|5p{L :8>ռvqvz6Di!}l_Sx"Q36~6q! PD1+]In8u>V&$"4Fs mC2+GR0V8Pd. 9#S[(`4)w~@~H2x1D|c#fts5>hZdz\nkBoGH)oDv L* bNo(XWpHyi`\ iHТ @p$EQDnFdH @9|Ϝ>vx=1Hy9ezg v>9 /dplɥh62u д %}wB?+=Kԅ'$crC#dF&WN1OIFx3kb-Gqz#oP'[ lS:煙l{cx٥b3daă".:{uGu)<@D0HqyV|[뫙Cy > KNx:i8b>9p7*3~i1PyiI:ۛ0s!"7FL$:EHH ˵EW<0%D9z ˁ [=B"Ǒ14t:^1o0yI Íi ( ٓ%A2AHvu03$dBq_vǴ> =qepxvn#AB'0aB u#J;֪.ȄΊO} k*v# ZbPQӃ vT,P ga&"w!H3Hd̞47N]l界t8D(=X(ryHL0"J@:I {B R?;\0N8S=PBKHDz8,, X.JN/}sf5|hz)yy!C|@' 9 H~܈hA0# uV[B#feRWU!|NI>;: .PU~ȱs2K/a=!ۡ m3 νJ܁?'<(|08;ٺ ZTg@=Fn^Nd̬cVGYHDa8#^;M h@8ҋ4ADm2G=bK bgN:%=sOS8^oTe<95rGDv@G'߶fA;_79#Yo>D>艐^LKwqUvyt]։3*a5YwΨA5\=$)4G05@wG&`,cmBd ɩ1% 9ArN:Pq"}"8#%}_[[Qm)̧F3b{yJ3\=\VhXL'0yTy#<\b^XYC[3i}2n\m yh'zbeCˆ28D}trÒg#!ƻO<,wF^Q&-yxUY0%(8Do'For22I䁓8U3qdPGzu4XiZâ3žK"qS{1ck=3. ў8ݽ5h $q+g:ebe O%+aD̴gb؄gナ8v3 ̎Tdg] ra&LL!28rWwVN҉ PPKgGtTC{Ҍֵeδ;+uRw4oW,pN(*zk z,UP. rJIP%)LlWhK($Gև˹UG5J4R,Bm"'P-G`1:Ɛ3"I56B\#g؍1kr/ ;UWm[%öÆӱ g9p(ñ)K(;.+hY5vL؝NL9Θ[' cU'H9‘Z/Q;#&EisqPFM*vs"D;8~BWLURy,f֡FetZ D5aL %LWKBFIacJN]m8Ɵs9 qMy 9!{0%cf9=v{+;yɝ%Iܯa5/XHg8Y!̉J,ɳnJ/:튡rMv%U{Kh Zg:jZ*'\iChL\JWFb4aU5YQqsyF,&{DASb3b^yQ7:m4#v,"" Y6VQ);c&:Ę*{VbW<&\4:bd]ݶSan Xн6.α4,DF:QmLDW dMbmR!=1;+̤m3+2f]:MBم*x%Ck,ͶhRpMa2#*ݚAd'r$5*N[vLM4gi26+62eaW(a6瑶ֆc *Mv&v`nôR9k.i9S=*nUқu:PEm:{m27BnAI!RX%1Y,&26p:MUc;2H9) 9hdWT[J;:AHFnf4\ZL;iSVl$^ )uBEYV-B.FXbj d2\*)qTJaxÝu9.~KݙE&{RQHӹQc3,!VCVfYUgU3Üd5 H":kByMKɄy.ĖdL]n^Br{+7s]S1S*4cuk}פ#FE?XI~.NXq㻘J9TZjHNF)`FuFVaG4KD$#S̺W.RZQP())mSB,0wZuK {QNєMFFHj+L(#˧I2V"%Y3MJh5SFFVdrD<:JY;Zq$-z'd%~dIuUK^iN'"rg2"YV"jԒ5VDs+I*O*-/_l%i؆gZ],BڡDq*]@ˡu,ML- +SB#-4D9FV +bXdjhHLIHBӭ.&kSDҨe:rbmS#( -Cոk6#T,K~z(I*ihhJIS1"VTU:tR$̫aV\9u ShEVV *"lChft9JPibdeIj)t359]UY&jhBU ,1+ +2YYJeU,4)C4$B$Ф ih'~2Je$KMDQR ̌30gqS)U)2e^zFzg4DȊʁ*),IJ S'(mI2$0,*uEduJ-2)JSEt0r"UaImL9Tb\L㆒b"̔0ΛD)#"4-9(AD(D֛SUK"[؜B"\iՒU.F#w(r.n쐅 R,%+Ni J+P2T0-V]UA%",K,$K:Je(TddBDEPLk"23fWEI9HF1V$$LXPETVJ*YM(BJʴRЕԮ" aTdUazXab6ȿ{XC3DVhաR(rsdr,-*:YE -]!$)+&!VE 4QjB+D^DZRD 淚'$!E2'ݿSCv0#UKtp5C}=H555YY`z z|ף_k@CC'?[I>qrvx.?G`],ƍfje!fNr:4G^m2wŠcW̘yv'` {3QyD$nbb_Pۆg<:K98das6b$\7~=ʾSqZ8'Tמ55QBqÃTޥhbnDIU`q؆^꾤%elRƈmtҁؑ鞹9-F飴Y[LY"n)D :llds# 9=F_;f(aeefLK.k#T,V'gp]Ӎ kcٖᆬۤSL/aZU-⮜,K5cL \ɜ!QMG I61]]##h%07 k76v-@1a 9pe \WB;۝S=eҪ"3g⪦ 9.Uf,dLjYmg{bLdI c2txG$\5!cR+trcmIju9$S/fT^&GdrַT l"p˦&"mHkhI]VD\(>ISܘɳE4r;"V)iLk<֬#mH9i4 rPFNEJe9-.DRz}\]mmu"(69c>{sЪBHmEզn { {UGu(i&IǙ*0,zi5n+i()Q$B / <^Cyc`%22g2jҒa!KJJmtK;D tm Qx%s:^֛݁cEGDfZjsqE9xZ]vRkq&ۭrz:[½̐.{.Eîd,R+q߭HUWj~+ώ[~/yPQQ44ps̓VxZ! c6umYU֭g4R1ke%Xk@IKV];<{w,9HmSj"r=[̪j\:Qqi)NmNB0DhVn<{Z(^7kZT#5w}(SzvN9^ \lrtYĘjK6!!b$C&&0<ĘQܪܽɛVr #ZJDH*=yuC^yG]GYDy;~RsFQ᳂C<{21o6ΛfeU5.{u8̊)VNd y=iQVŔ~^7,ʊ Ixgd2lH[@ c;+CO*={{q_#aKZSCEf2{YaX.!w$'T#&ZEJ=mLإPU E,y  @~()Mr (y%.HЅK*l% U!FHHl#!d dB d;#r$L$ivW !6ZaL R 6S $sp\$rdZJ,6ێQE=k"Mصڇ"cn*綊^-&-&IҌMH0.|:sfkkRL<|Ҝfxкx :h a2 26Ʈd6(^7s16% 9&l $M#`ت 1M2t9.z.9gQYPN*3N%v&Cօ2BdE,s "'E5Z3U$ĚB@(O%[N˒R4;d Pa#`R8r)ȣf(tA=.[6Krh1cUȻ\(g8ugʝG%YEU]9:UJDkƼ^O}rlO8Š ӞY M6%D(˴&h X#U.ɲR)mMW'%w."rq- $+; .@d @!JT@(4U ~52niX.TIS eõ(WL.Ԋ#Q9dJdB  Bg\|tc CH܈(YN_V<0i5w\\ء 2A2G$ p 2Q`3N2*E˸|79 ^UIXbDj'BӔ1-qB^HFf;bw6+vRd3]fu9C,ɡm^ڈi<9Й-nŝpv{(UBy9 ن! wMMs%ZEL rTB](!ie(-Ys62s݊IfIppL!$ȧ6(Vw/,$)7Ҹӕkr-Qm&@49 R\ko̜5Qsbs1h 26rG"CaZEP9HH()H; m%lY[lf .?DI$?q?`k4 i?%悊Ӈ] UA<-t"]n2]Mwf{ϐ|( ӻ3U&MAjD,]Ʃ~gz"Yλtu]U{XQGdrcXz+>sWŎ \ .ܸP5q}ߎ1#OkcQLH;#d׿wuռ\?|G^s{zxY8#!>u 30 4*Щ{8EvQ ֐ɳ( ݡ$&?9>|Iځ=v'$:wO&:z#\X Jn2v}$٠{ >cdn^C+az#09gG\z|IWr<}xǓB{_'_jޯ}X`H}s]`dU-_>0F+[ 9,ZUƚ>n[3!@!ooz9:楑/w\ԉ|| ~X|\O/Y﵍q :֦ quAUr 8(^ =kyj8fDI6эoc.sL`_"99oqpKk::<\6e$31=uUb"Bs1[*!"/Ϻ2pR3-B/# 0_w1bQ;92]Mmei5i]G/{0$N&Rri2F (M#xzz@he5m\Zӌj8gkG 8Q[A%t)%leBHh]j#Q-.z nl53ԻgFFu9F۩km gp)4Er(D7 u'VDЄm+_v9>}JnW;32fjrYqE[{^"Q{Ta)fgbPQTQLg|t/qlnt]7IsJI]4y})U,RWRh\.+g9뤓W5ܤyϫO7^uq.UL؝ R(Tg;OkVƱ^|J&2 v} y 4)8\܈o}bvX˺Ӷt<OB {&A?o<9i ;\뭃TSN6C:G.X +'**V&AIhwF$m%a[l;kF,ڎI'ZvjfvESԈ#`EGH  Lih.WisMD&f?'|6!Q@D껔Q{16ȏHT+/bH(qYAy?fUW*!PK! 2"!8uÈpjÒIMLA,*GYRLmsO$ѹ^2Nk\SESܿ}][(ЈL)~n4(A/sΈTm]4~y~4K_H]&j5 ,ZakZFݗlZ)&{fr3`fǚjk!7 'qbr<h6Iiɵe,0FTcFhuEJB%oy[e\۳v5,Y=##CrݜY/k`ư6"kjGxC&4lЛN-?ݧՇUrh'#a30ƢEn3Xhg;Jdnƨ*aݚ*tm J=SU!L"ayQiax.ŜvM91=giLkwka7>x]W(%ljCI)#+&n,a ]5{ieDh6#HM7LD׽LlD aW]Rb546.y6iuɐm`vs&rѢʻdDQE 9dWK%@%EXmu6TzBk=d4SJQ^J7".Eӳ+cI/gn`RV>Yc11#꛰zן Hc atkO6Ɔ: 1.K,ЬT]$n- K0^z:K"Yq=F̚pZ3-% #iuΤìX} #MnbʜOszNC!`B'5.Rq!󼪂wxO9ULތ($^|I)ɡC&(I 9LPDo(dҕnW4*+0y'FZd]$+hG.DwI&Q(,&mVAURZ>XԊVȰ"DՒ U+P?9K3߭!EdZ+I8@YF{tC&W5e˨*UIeRsU26 yzHz=eyI #U9ʙYo>w^O$VM"LB*&AQ9߶tHErbmL rl))ps#DBW7SUsB &sG.26ʯG<̮*PA\j4P-mg9e5S9Us&:t1t0TmV^"2A$wcs 㲆)9QfET(RPM 2$ߧ}~o}Ⲍ Gw;TJArUYēDi^QT}@a O;]th2J"ցIaRQ طV=A+ N[Hy)Wsĥ"Mz9zJjQ)*$h[2F#V)3EuPY(*:\45\F΋wD\t rS !"a4E XU!$&E!T(Ԣ*a{T]ep\+ "ͬ3BU b1e&]P,R1bj6J1NcԮEk#K#dUӒƹt"La躺2,nnvn[PM#8,)iJDc=G6PZYVaU kNbJkEYAMbMjzEuHªbxlIdR"q#ȴBE6Q9/ h]2E BR#G`  P 9*d"ln1S2QL knBbUF .G"(6D$Į*J L}Ҝe|3FQ*Um.vUQl_v322EZr!2W! JC!20&V*HjjDFThE Bt.\"-.iB-;dReꆂ -QjI+9"ӿo؏殮DQm5ebfBd]BeVfHLM$94TI$"1%$Q\9 BADgJ]Q;~%(]CRG$7NG:z%9I-B*uRTjRFh\0%C B,#BCD  dUQP(ɗE*QvxΘDaKX͚"fOiQiX@3A&b 8]r#dJ䢬KXIQ3ҢNɿƚ"29)ҘF㛛Ǐ A;w]"a$ ƫ%nے08rݼ&2b?U+u:.H4'"!9$!%' iS>jXs #MSWJ3"*EZ-N9.Ȗd҈ԢE+8 В-rETZQrg9jIA , Y.u]sӼ]$OQ趒@'nYNaEvGT$o_{~'_KHLBE5<2ԑQ3ǰ "D"?P..!b[iYRb$"+ZV%Y'L4d""GI$gi,¶eWev$ RX['T8y$\" E#B@ FEЮFݹ˔P$L5[T(gN;THwHC[.*uI9QgTTN+SXI%tHi TXTa E} {(9} [_^ =r9U<>o<S<Zcy|{؀ 1iEz Yty, dA3Z$lҍ.22Mcʮs=qj']yC)94ԍ=y:$>O>\ߚEHz*}!Jˈ|VQ5 OS5(rx8}Fs玫Zm,ʿ'׋V-_QfuG5>{i¨笽L%e{&yi%uG\(,ٓ|OIG^Ywut#cbȚ<}+:Ꮃ;Ջ(֩n1xΞDQ|vpu>ݚ"@LMxvl~/o&M™kQ\:''Iجk7Z33ۙ!sd5W8u*D&IjTN ر(!/ފ5 ;7;]5gDD⒑UjDGeQ/vld]ʹ,ªi,k.4:aJ`ҵ1#ڙ'ZiT74wV 9LEBY,JI?9z3[;Y{dYmš'[܌ݮ =+ 5ó$lƅ|H,!d J&q0 ˉ,PCTFqY;Gf)+YGA bxֻc1%jn1ȗXV(FUq*;"^Thv-lmei {ϱٲti4 aMO$/hKe4pTё,1{;őZ4Pow8E=ʤR%lH9t"(e;'h#h!I C*B@IF/p3UB=/bvAĹ?[C+#3(&q]=*d6t'8IRZ^=]bȴ"@!bZTŭrdDꇗ)N[*9Z$b@Svs={e|ʈlP I` dmgz<}u1T/ ~Ȏ5v #sBcq"̃oGQ-Al+gO6L72Ft+zk8U=y[_ģdDM8kP73vn+:ֲ;μֺG^syQ^r31{z[N񞓛kюlq7vD>MsJ+Q16P6r{̌jRVO`GE,ZDb vas1b`f>cfCg4j]]z#:go֤k!\5=m݊ԫrc+~_u]r#}̅tb`b$Vb^Qr3sWpC-LC#"w͋mϭ qqm>ۏn{r7Ɏ".Y]:3|EP>W#^}ya_ dsVjv&M*YK\ޡhnǚ}f^vgcFS,4bhArdH);rʇOwz?ujuPFoSqg]ykֈ|ք:I_'y+TEʭ2Sb{2 iЙ>vG(>/`eeDGzW_~Z4殎w\F3µqSY}.ggbт=ŵ+>C^w;%?  C}UOigS8z6DA,[ ߧ1qk昂49[?NUӥnX\Ԉh$0q,mQ|04 e ߎ-lI[j]]M^Wܪ{/\johsyDg/5WFuBiyf kP\.l qod:-$hB $ p X4n{B1DrF$*18 EWbC'ebw=ω:y:{cz8" H NߪVވj`T5 d2nLhu6"t8ʚ51C,Pja󸇙~gU ˷DG~%ke{N&u쥑x# yUa_vΒ¢&S܁r9P/Pf(ppP& }5\{_u/*Fz&I/!QܷN/c=kSs)=B8ȩY;)6tZtH$cy3MKxjwj/V~՝\<+sQwD8y}z\ O5 ş=yu3>gB׮$tzRݵ5GNe\o^UQ￱~uT#]5ۧy7ETy9/fw=svy5vgqG*뙍s'a׮+BFl.Vݔ7v@Ջ=;(l$NZ>nd' ;3W/\8#=>~qS;Uw뺭O+UTk5h9" T:wVokuovA/ ]GcŢs syW(S>t_\D(|D;$u0n2|:Ę)ϼ <`9ESKdgL߱]p97κ1ϑ[h50p6D8׸W/ 򅎸?):R:?+ҙk/<\0wpx'k<ڃr<累xq 6Yzxk+twCwY+VyGG9:Un&]r AO5;C|pik#F3)|1s.8#$oQ:*R/'=]9:qRwg.+dYR6WFJ3 DKM#eI8Y4/RSh^ί[71y=K\aZhs%I^#^dmϘ&,+|7#} w#ݟYr}z\e}/dF8eܯ-[@Ɗbz={528h~p^]V(FO/.\wqF>jn flTZjt]ǑЌ4dmb8v@<>kU B#cP uPnyZ{<e&}z󵪬޼yI;ʉV y ᾳ0F@d."z"'ǹ0u OTϮڡwPLS\KףQ2('|: L3rRQ> 22jхIR.fFm3(3瘭=MKh"RiJS:Nj5v5ړ{6]C-Rꇙd"ęALⶌ*,]K4 4HЏbp˶TplUh eFKBI|2$c9™fk&vh7:7!ݢ.+O &emlbxQʎFra^h[l. -KZT+*dɖd] IW<%Pn0#P%4fe^<3 +wLXyjT붫8ٛ;OXT+Tʼ- $0 5G&J :GQwDE wC,1{@DN)T^ ɝ>ڟ RfWU $54WN(RvT$s Jrߣ۞:hك+Ơ^rPK@pEúi*-.eGm3g0]"KJڅRH\6u-1"dr ,D K]dKgY%t0TF̚ujvF͢ҚGm07%ݦHgy쓘C:tjGb 4ݵҎlDQKEn.AuW=^D)\MQ?w>ze+bLJr6S0({! ٍWFgYAEU5WD7/e+mpWE&jMOWK!]9Y-=LPEMtO"O\F4%\8tP;]f[gWQ\+Y밨黱+gn%AjWU#*ӛ,c Rɵ]j^)h`nыk-QbA (O^1U"V#BfMѫjԛQC$9E[,Gm8m[+IFVBI.n&PڥX*DlWevӗ-]EvV5JaqeqL@#4B5"-RZ%DK)]5w7}Zk{)dL:+Tߜ< I`z_73G%緎¢/цm~(pqgpTc:FskG7O4p=w!1>t A׈qL l[x?gNw+dzuҎƝ]N1]/=֢g Da0N D 9F?"aC2YViRRP;-.?f2 | bNTfJkKIXC!;pE1Q8xM^+F h !l|;!yGSv4 Q!ȋ!;ɼlcom=ːp$vvt=}{=Dt6"wt^ynd9(>;j$(vM,2L](jksQQw5 j[kZ*njŵmj URXb< F*g\Ev#q.rJ]'w\E+rL3 [`i02P2d6KUqm@J-RۊE4iP8' $$j~{~K0ϒ~RٷiBJi"P\+|уڧ'^A$pnv$ѓ(5`d.p&K ́Z}m{~$سZF^%wңNUd7jzFEyncRQss'' KRL)I` (D [lqR$ Wr$uӝE,r% hyb'M64dvRO\-PD^-V^iB5:3Xt Q#l9kv8 %lQD(w3fCbW;"P u 0wo"2˿VP|יҞM*Z . TfIWcBh~Dq[~*cdJ#FhkA'L6™ɜ/1ewJ@ːwSޕ;=I`G0: :H\ufg>O}[3SVA6FW{fޑCy04DB g母53zڱ&rd=G?5N7^ѓ˓"b/iX$°j]sBq|Fzm'eEeb3bȲ,>*ʧw4B$&Rs܍mrۦyݼ[;"EcNYl&#(55مQ0Ηv6hn$-ɵ8(AH<e/J *"{ zmrTZn`RP$0m(/,Vs΅,2(evi*'psǿh*Iذbv=RA-q?[D*RP!5f xVŒIG4sw's.K9.Wޛ^ +cr*Ϊ*_z6DXEoVeջ죻9& _)VIT$ B@PG$R$*vЦѩ5%U&J1-Ʈt6܊//tr+=زhR@zEfCޏ=D^rZ${96vW:gl NFMFy@y398&n`ʗ'x=~0c>bѕr!_'P7Uٯc6?rTd]>WesⷖxO$zI^gC0yru1z} Qr~V;FB)*St6$~o5-=}Uҳ>̈#w`G"t=mq箣~"s ||Dxc.Web5Oܼo &ֺ޷wBQ+W+& NO(u#3TN=͖2Ԟ˷|qYUr!s=iI2TL\c@Ayi43(ȂOK/MMI+LNX> m|5\df'DK!f=Kf$IFARrZ˂ RIj,5h|0Ks@Q65Hρw $I$KzcB "\!=ҭS':=k`dXD'P_2Nr IQ}y>|@AWvD(D20apG~ҟhc`=|QNGp2ngQIM>|iwk.?>>P|II?Y=Kԥ=Bl9a{F۞x?>=O#> =84G><>;kk]O:GKLrY3?a:*GS3G|x!01C􂞼9'{z? d|fZk/?} -8s'q#"}Sm+j66 F+EEE1D I6HbThM$cbf)F >;p蛑$IDԉQ'#" `،QIL(\! X”J((J* Ě $&a!M @$&*a# J3dlZ,c$E%` "CIbLTzLJ1sU=-;닣ws+TH ܞ{Nb|ϛ7ikv7s CwDt+?T "I#6~xz4࿦MzԠ7ozԭu*z^r|)Y8=X(+r^_.>kl6+R>s1\wI<,/z\$ H*Q\)s=V0. GoW*Σ~qZo?E B @=]fs7tE.FΜoN'79I*fĚvs!zVVJYV37<-0΢`r@4#<'U01ѨNOϑޓKңޘ>5Tƻ6j);[Ft 0`J+9U Z-TVe ތ9:QoM˘De ߦ' l:)p Tîj':ݒM,|4p aB8|k71 b1dL?0(+p8gB N$/,#&*3>cn(FuNs RY4?5xt=Y?9gcԊZuПU߷z@"8L职`fl #86>t}(`` c `Ls^%2^NS9[9ĴFk.mV3quwh;yg{8+~qxS-fd*G6TAG_F܏|cf\%_? O 6pf:;y NS"S?Ɓb1*6rM,`:G:дxґF)$E)[fXL凥p!,ݨyBW繸#־5q(ߝꥅQ0v{A9\e:kŅ;TBָf W+u|$eb‚3]~<+OeQnL}[e(,;w׽p|ZuFx$s#=( }Ws!Wf{y΅0NMe`\$-l:cؘ|XI mڌm+BuLlH^ H!Vbt"2X{¶?yOyCS3bdZ+#ުh,I4Q%)<=nO$Oɭ>Z祽 h3em9^+7K^DZ"-xr̤@j>Q~뚙Cڋ&v~{*sc+6L~RO̒pN8AWgN1$e8aADqۂ|'?'ōh@X!KBH/f;a2>m-I8{z#mb8C4@dA',Ac5z\ t8":,u(Y9#``käVC~S,isL(µ' -?eHQ6Z 3Ĝ^@yh G=큜S0+2Fw1wЭ2A42m N$ߋh- g*2Y+sڱ4Y,, 20 #O$Gǜ@|e}=x>.w{c{V \ϊRFI + }+zAHd2뵇8BJWFop0m =o!ugP{"ռT >=P$i!v/0^!,Ϋx]y ڒ"}f4E8{NF!8 $#e=!sQ>@v#{"CuΠYLx9:CC(~oB3`(?X:#FzR`|93^犧:Fm{q QF}[M>BNJGgH1\ӄsԕ}u= .PCdƁ(MO]8L>rs`A ZGL$F9Kh29Ygtʒ9"%#rk8fJPvqEJp2~@ŀ$ 3ypEX9;" 8)폄#x8dĬcpO+e $ 6}ѣ(㓌id+$*+N^^6D:Gy:@&2<8+Q $u@|Hwk'Z_R#1'Ag>/w}s>z>wmԜ;'HŜ2%yUŊ9 QgƲ,KB88G&^w;>l'>>3|3w\oQg9֟z&p`8>`#Jt3ϛއOgs~{\Xe4 oDp;Uh“ r ) L8DMG (`h#ך=u'|Q%zKQTVM*Xk71GCLo/s[~:o\E޹C91Ǟ<}ξj]rzO2\UzޭVY7Wҕ>djğoc;t.MuOAC1=9gSDlOԆ9<_9i׏y( t0ʢ =aZ(D{~o4EH#X{^k'L.N=UDrG<sD3豘usQ _a|p#M'fX}QH²R! T81 3ˈF1Ĕ֥AQOD3h0<+C:")"Id\â,u:g ٘[=gEerY߭$y/"&8lz<>:Uq|תt+28>./]os$M ㇓6}8uʓCwNs;#VԅoxvT}jGf}z>(ծq0֪cC=3ǹ1c3:w~^_+vv{k:|Dn#u~gJ yrk_ @7(h t⺺tEA=wj^+>.{O}9Ǒw{BmN w>F>-i3 #KnL.kD5%zW^5-Iy;ŜdU!zPJ Wo"}yoZAQ4z# s\q#O`ֺcքsBICk/n 2*ob+Wtb$vS]^?ыUޖVE^Wڼӹ츤iu׫uFyy+8ÇTM=|H~>C/T8:#;GiH;]=ĝcy+ͮ|@wHO`Kѐ}MD2 cF>FNNiSϽ uEȩ=V@9,A{>M b'8l!ӏ`zg %v{<JO;"tEt14hߞzdodA@}'/\5kJknOoo]BD#|u/>(c]ڨ29>Ͻ8#eߑY![ 2Fd{>Mܰߣwhk0~.}P] Lv LoQYƉ{_qCH9jIHwz5}].x*8:Bp47 /FȎ5Fs=J8q!CSD^|BLG%ym>kĂ5j^Ϲшk|@zܑۢj״D9r|H|}WfXDA:V=^~ԊXͨMbfL݄I q{-;멑4qzS' W#Vvι{<<Rԯ=Xw:Wg-"/)'`g9H壒yޱar#J{!(Pԭ?04d/$W 賏Q쌛R%LjT滕ФJ7~Ԑw!aPvvմRƲ <}-kTqM--Ȯ{>9NU|∳SQ#\gM O~|d1}>AxB~_ιe 6PC;d&";?8v^AxYNG'F3}=Gxǒ dd}2d⽡<z(jAŃF ,hˍ-8@/k[cj1Vb # p:i[7}]Fj#šZND ʶ+ӱ981ȅ]|gki;:5_yYtukP>wclvWCg@sMC}JAl+)P|pЀPDDU D JT7'WҒȆW~_QCB].XE/CE*b37[78#gf^R}Vʼb}đ+շ=Pj!CT1<"(v !69үWz_NP_2DrQ$vc⬟~,9Z}71#`d]PuT`8kˆ&Iz"LP1P$o8.$|ͼAĘzd,KdOd{ 0rϛ yǓc(Ns}~1>{(J(^Adn>=@dt}yϜ=wj׍U?N B}e>@8B ?I/Cr}HC#q*$<#uﵨgP[8`="gՌz,40GT`IF@8Z:7q>MW%H CG@<s1 Kb"vP8~/C㖰I!TT& 2`CADK,d!WDm`Kq(l&ɋyϗwUdx`>sHQ%Iw۷겈ʢEze. .뒈w}+k׫ W+su(‰̐ܐvF@z `&<7u[upNn2 Ç(8hP"/;X_ 5\jȖܦ1]d⏷ߞ$ H9EUjw#NJ Dwr%¢"-J.I5Yʨ=w@fR_G]`fsr P̥.nt 睌:یۗ1p@]:$Qy&;fƒc9RFJassdҁ)IpApH2H܅ˏjq+=$7!<^^utNɔs&<$bR&SN`W 0P`R$MM9Ѯ\\+N*svI",B L1cH$%Fyt3PXodώ]H%$I%.N%DED( Č ,bI2EW-sWfBw\&lgu4R(fQD]ܾI $;HU}\O 1nvn.S4F)f'pړ3)2 9]ڹ9w\-faILAM}nNfa;QA"-c@qI%pu [CkߪƉ>elO2͉ ԅrUZjuU8_OL! B+hkQ89ҙ|xh" j$Ŀ}()oU8u{q3Z1}p8hOu|7Q3Pc9$BipN k801'\0JQ <'[@xpL#k ϕt$^,ȉѠ}5UWDJ.}'=rrE=ihl"! H 9oy##1Fb9:Q__0=Le/ȄzK$LfL3wi馴;;3}. O@$m#Q:ׯ\ج]Ơ9x鏄y:,tK DVe 3Ў;NL3[NswD}diqQ}=Ņ\{+}~$;& 桅LmbiY_~dǕ !RKw܉~QzcCL=Ǫ^ڡæK_|绻Ԇ+Wߪ玫D+F7m F).q,hu.<Y x^AD59U+eG :!QϠ|u~ZAP<|Y䃅#=.uF^ƹ|rK~o$Ck};:RǮEkUMqz7\чɏy/CP3OB7LO~jc窇1 4c>|:"x{H$+I?Q逈H%8'7|:4hLdNϵoc鴟TyOMB>!҉xlK*zLI\LdM3Cz|B(BlO% luƲqL?%_ fc\EfHp#}/ezlЕۖ@]7+Ҝ@ Pq{esqL3?ECi9u2dOP].[^TzH63]}zy|">p8ߗxV/֥rerz<5\eΌfZ"8/!BZXX o=o;˦ia9${(wՇ~>s8u=8pnUY'1zWZ,9]t^Gb8_^`,Ne]B}\q( Ku:'OїQ[Enq!⟷gt'L-DqǐKkcQu8j'peDdrk(-f+ QǤ C!Cm 18^cQBP|f{&];?Ow9#RPbxQeL3bgW"U늈Ѽh3!O;tΚA3d|RPHvj_px;oeE{o#{!O9#Б~s]mLTo$}P#3"$[^iAoA<6\S'B*- :6^aA<ʘb=!kžA4uMyz8$YS}hGb ΐhnFcZGn^7E0.~ݰy(f‡Y3:uZ{aߑt McUSdFcf3H%Kɘ!Z+br9q;9\W,^tqr+yr(%-D\:w` zU3!qԮ\N1WczgOe6cOss"vy$s+_?!A v{! XnpIP8@G叱HrB8Z@.GCxLֻk qPn_}\7# D`G3sUt!GaI$FJYf#{y|nrXOIaOԿ=w G 6 vp՘g' ,CK 202iv\}i_=`]`dJUJ>G(#&u̦OAI* ]*>H9#V`B99PdyƘ^aw!J=Jh :(@@pHK3ک'w魸cF}nzv!AJ=-_q}c V CdrmH2/3'g>8(5 ApA#A" >fcB7(Afde ͞%9_QD FMSbco$^K Ji=FI{FP@UU$ d0nj8,}yۍJ\de'E*zu#Np $`!' _ |lfIghEƧ4q#lNN=J810pHg PL Ң`2ʴ='DH+K+2HC G(ssGv 8DH^ȟg 4L?-zGú̕νq8B䜦Gg4tFGÆc[]=OXZ$RJ#H$[B ZQ1*:$s5WYvjNesƧxԞyz0_V=1U鯫o_ > ;Ԟ|/w%>&9#$ @C\eտ9Mq֧? rys8*㏛U qf"Ft<rjgBtjZ4pyE,[뎠Jr@S9$yDLkH{=etqt_5Rᔷq45$ ewQcS^7~p=I޴`Wnu޻~g]z=Mc.$%1D# .]n5{k&L{wUzT=FyQr7F"chgWPM}!@+?_b9Z¾v߯.8<~Eud|3$qU9t".닟wqV |m㨉1ytuf HMA՝Zk.l:r4(%=<hh=yӏp8QFp-+ R0G"b T̎ΩA({q|HOHYLƗXuҗF F6'̮L_Y;}f#acB~ 57^8=gF5wL!EXiL}!)#zzxdL@oO%=pQꆢuֵ@ԦIXIZ=j4J }$nf^ՑKD-l IR+K|%kNݔ3l,2G&KոBpOK,O\TnqБZ"%YbQ,^U]H':}|q֖o3ET}5k85+8ܹ\x"spK ]8"´%)"?%s7ovҏI/FWq%opMs Wv$ .f1" "jèYg7ג}cH6siT&=x_â1@?U{8@3"N $}\8D|#8z`G}f4NIV˃gRGO()O^Q]և{Z>@C$ 8d2;9? :RƘ=*/ūc};E^e?~2|~^9Wʘ;wAU*.2Q.=SU4G+_Z> A=)@E29JR2w~4'O^&p Pr\!?\20=x2>H=J9zv=>z NF'#q#EG{ D.9)~:/|P?<0My`sB8|Ѭn>k9CVqϞ]cr\[őހxTKYAbHA,,~=Yjg0ȟ+<.O9G[\(_!id;}9ыV!F83_`L{CC1^35 %"J@{`_hl=>0u '[}u(OS8|Iz Gw}c}`u&C կF1;'g |Ae !Q NZ=MaQY D"-a (:jw1F-`3R^1Bc^O/ǜ| stld8ހA"0}^9@7҂0, aq&Su'%9'׿72}'2}_~<`vK ˷FG%u'd>(d (q h=GK׾|Kc>"y}Oi=iA8J?i7{6 ߟ|y?HNu;ǬV~1} '4'F!~׬h_Ϭv{;։W9퉒/'xD rpE"5ڢcM:#$r 7wy; d/8}GcRx߃zW\:>]"rG~^VQ/<::}\$u#t)tu !u1/zR0D5tPa` B9$`M/L Gto r vBCk2qP@IDHqȽ@>ި38($eDqN I#=OS;``@$Hˌ`di b<$=V@gϮz(\ wH^F"*8sU}O)Fnc;Iϻz!ql|ZX$'DžZHJvܚ-凴GzDȾKv}]Š2B {sl*EP4glZd%4RǜL-&P|ɒdƂU11Sm6TT f!!ZD)Or|!۟R@P2h+[*ksX*l0N0Dl*yϝbDJ3 th$A(eCF05 I+sȃ$z\\>yx֑QNZ[w"h ϭ<@hpnPE Jr(B"QNf,Vכ8Și )D\EUUTmoW 5(UPmlTjحƴjѷVUFńJM$@F@ F U{e6(:%w_]g^9/,χ9]H28Y2dL%'Ba\ &M*RdFض[~[9϶|ȇ@Z2i31% R2I̋unmk\Uqp<#p `jr/2ZQ1옶S~Bv@Zx@2 v1Ak>wWLx;9Q,,|ƸfV{͜dd106@Dc#JR roŭwh" N 8ƹuNuqϞQ>qqW~f <㿏<1 IDI5JjEݠzuތ=Z!K ,vy4=oZ:y_>jxgo#iۖ i?7Huwg={$B4Igγ2D?K]{S ⍹QIsx>)SJ G {tG<ڞx`YN`"-q" #0vv(i>zxTXDuyQ)"$(JH{ͨ=gYwI<|@ t%pDcX2d^dq.p=\8so9POUOvLp:?THHw8D@F %m_ 挖eW_/̣̀y#Hxv]9z( Oʛlc |8C 1leTAT497 M _I*$/~;˼>|wP_sI/V]!~HNH~"$6+iq,b 7$M.&UCGB``a N% H$\wMn}:3DrH${y8@Ns+@[@?_/l:֔fޱ~J** +duH4wV_]Yw[Ǽ;;9@drp=kPobuyJ|gL .^W96N@,H=19c n\KwH${h+P=!,}Ĭ܎|@ eI㾳lCJ8#w;!>P:`|s۬{Md z#wʌA\fF`H L.5cc׭IbAD-ж}wE>ӶU#pVX޿m=e[HJ \K6B,)f1;lͻ񕴗ނe $6+Q[HYJ{\M@ڷZ,ZbXso4E[jӭ'5%a)_F [H*7rhR/:|OXmKZm05#]$'mvrgE;xl[:l|Cn$>YtyH e )^D'kf f0dUh>x]Lo 2nLIq¼FQKR2붩 m|A,NӘOQ&&&~lE!Sg߾^$k3Tvj=y}i1gs9Z#xṯ{Eߛ 5^a?2tyZkħpF^+cbxץlWu<[ə:kZ`Lm]ө3g(H: Re~As+̓ Io/x5rVwui" &lfTYΕn4F+^ ͆1RN-D,ZMmAjL.%8kn7{$h^[9I >wun=3ٯYC^eQȶ%qѰKs *PhVZqSV3чVɶ&QGR72&E5\mdʑo{{Ʃ>qa>vBśUdzlD/e8Z)ŕ+ oJ74TylʹŔ6F F3M2WUÚz2 ؁-٧YHgO/u2lÌ3m(P*NxOvf<TP\:2L<-wiʷ*qѧ$H`UB=ވsHfNSJyJl홍NKMV/>}]x ^r*ոFw*/]vT_h3dfa='|iG{9jqՏ%ALN 9 T3-{ɏ! !zl$vDے4;!p0fm*) E4,$4ae"&#{E3WοG@4<{kɥt:`J CsxIu*44(Z(iiYJE&Qhbԙ2jHcPmj5cE)%رj-A1"DdEY*(5%RFѢbHlhɨƍEэ#lEAѴF2lDT[`QDllm2c 4ZKHhIi-FR4& - ,IFbԄ&J*)(J 5;]W ``94 }k|hѨU{# REliIVDNƨ=i'4n$جC]n i+#M5[5P{ZMU˗)MQ nm3&>ْ;L)"XB[i~fĥQ u3b&imYWrRձ$ra#ĎG9eAP+j#nmoMRM#&NAVQdH .[쮮<$}ut*) dkH[GxmfL-jjɧE۪IV#۵`4W޲ fռo^wP8'bw (7'no!?#x4r2@wGrh-kx-{riuȦ&efLJQoǃ_.bۑ+T @'%wqg'ay9-'OqpwF,E2P^\5:vI XZIKɜ:4ZhbSj4n`͆ejl*mkBk:sAjƢ6M{QM%kX{[k݄I&9.fryܞst!Q^z918$01 .4ɍhD^M6qԺɔ-vsf~iJ)/Z77* YZb.uV,0lz=NX ֊WWϽNZB2 *SY#cEVfXbV§>u[Fݫ%IE(҃Jn,zaf6XʂQFy۬- U!]pF(^ncKa[}kl gvYSf5iJde$hʪJmtX&s:5Xl+N꜎챡zeIk&HSِci51k/mFA@Z7~'V顡 Z4ld:񨞃Yv{r)KɝntenmTi\Z\*eI :Q퀭, K)6yBѩmlSm,7h3WU$:E_'W$C -eS IU#d)&zl 56"6$N|-YPɚΫṖ}\'zUBdTVmUH|;K%ˣa5PľJgI͕BW<$,}לrʦ&fyʣ:cia0y-NbaW[clxY#5r+l޼Qږ}Y1,ɰƪmɶ)Zl8 j%hHK\IR%}OĻ׃:-#홞-ek$RQ%`i|Oh.Bm6&v`"BD*{M ,)oh̠Nr{/X9F,\=}P3ӄoQQ,i0Tն+n{Ɗ퉅>gGqG\EgmgIF( ghر <9tڝci"L-֥[$U: T h28{L٭X\"6vdc,~|k I'&rjk:~^sYdֶzjӥk;;Vm"nEY}x}ŔƮvU?}CY[ʀ[Dcj(r=(%h- iG9;Q),- گmrn:qPq`.$.)C拉Z3#gBؔ KPFZϵ5&"15d)j )0i^Q@j%R0 / 3%~Wgaͧz3z lm-lhETϓyy9v6rciWi6?1YЖ[He ؉kJmJ7ѡ՚6U(A+i*YnNjeK yomKBIa*Ƈ{aû%3KG&8Э|ش-$q1Q$khq85 &)a-cqF6K" X1zo ChilDPLW m+=DKURMh56wH[ĭ^6}\nuR<5x{6#&=w#-Oٖbycv3 *Kėnv\vݵuֱF(g7ojQxձCI;Ka"&cSe{64c}S]ն![.,ĵaP&;ldĜ7D842^Rخ_0l6o6@%73 !" aQOmkv$fD"қlliq$"mkelȖcZ2oqŒ҉ j$$2CA_YHf J6&R}O:(Mܙ& v1:+Վ[/63{SM"G;py]i\ "ι޸|~ l~+&$Ge]ǯ/ÄD,&ړdPW$*Б;1O:hH ckPk2p ,|rFH X5C:vE( uǁَ#[AB$C8 0X,p76jP$h>$p:jV0(updg䓄hw0H(#'~ YDz>$%w7#$Iq\ZoGн;^͡(j ,:x@d 9<{Xh$#(zCA$qDAHI+"0zXfH CHe3DB晙H^P RǚRAH'{He(H\7'=4@ ?2Uy I!By:O)9O+!Żx_ZxmINP9BOlG&@rȫ"&n/|> <cl zxDyDy;4NQW-psh*4FW"({QI_Ϗ/ +wM!!1KrpZ3Ͻ]:ᨈbi.K܉ys[E9QGv[ BV#/C~CwP=io\(DTD(b23CA6$xAYsr^唿[ٺ=@}nL918Fs2):]s1ޱz9d9r>'!~P\I<ʄ^L: P]z65Q*W 9BP+2y+U(F!^٥ $D0(8$ KѴDrcã(ӓ" h0,*֐O汆ZB.gϘ)]{Ǵ9 #AXЉ(o?GdcF>9+1KURP,Y)%S770i4lN` {Uԧ5kb_UV( U5o2Ri6ĒSÊ%HX؍v= @q6TMي XL92rLJIA1p*_H+* qDH0Lɹ&Ȃ%(b&EI_WLя]ZT3f ۳"whJh~=IA我5RKtdR F)ⲦH)bY"G`£ğnz;iVg1Ƌ{I#-!D.&9 d0FXXF[4y&\>}ċ&s y2T_tgϼF׸`S [OdblaLs4z],S( hp+6M~~gMK,Т#Au-q0( PBh) mSW994Q0bͤMZ G|Hg+%VW[vuԖ\aнM֘ziݡ¨`B^&J!vmB & Ha\!9s5Th@f FgpƏ$LP`1& 0S}" KJ,(@$ KڸF lbK2d4X )6՞ Y߷2 0q 2Lj?.~?C;?9_daKM+! D,?g*fBr}0؛_P?G1yu)ZYc-2j4̩y6]mɑmѩŖVb%RV9((2VIۜs)!\R=v!"NtInv#ޅ;Έ3œ);2dd`Rxk/$IT,NcN`#Mr@tb]cZ6K F݋7{NCLU욲:Ib%d\Yԅs~DKqDQKLJ$ΗfYdbZN*y#%]}=E./ю `k{X @QpV;3>+b#BQƈdfO^ւ,[gArQHm;!)pfJhz2j,3o>vYʞvy# btA8"]0$+H7oũ`F~43(zi|T'q#;2ޓ_R @ qi%~sdl%9PrL0 gOHQ Fd_Pu mKU1p{3@`ϮamF5[zQ ,L[TN,gJCjطJ;$uuLhYNUbM4 .SVO 2b)MKpBL66+[Us`Ld1)?9w]Pcfj~f8De 8dcia ֽ}Y2 %IK BE$}V[-ؤYwXլ,e ӷ"6qգٺOjEK2QcE zz3E'R֌suж7u- 7Lyϒ'|sghRdD-6Th ۓ2ZNAܝ-!ċ&KITR$#eM#eC#eʌƨ 5-%"%%9dE9-mcbprz_{ާBLSD?dO~.wwyN{qEl"?%H$+X %k g$杍9&dTza9 7lXfM.Qz$\욨ӷiËtCsf-{ō EB1[}ie[)=B^vH.28-d ڔӪ+0<#׬0mmO챦c ~Ob60m6%+_am*Pl8zP`RԼlaqy:F&VtL1ђc?o߯fs! uEY"̻L= -bMe$0\u1k*DA`02klӜEP#IrŶnD8pP+߭*jCZ@w @ЖO]s iزrm*,.kq2م҆gKTBd؎jIe3|!î6xA}{, A0f&1n- Xjh^v-0" ea(A?CY3[&l,ίgV&JWuZWٺeFeNdWl[--go tﭰ$-qky[0"s& gT,Tu4$)?c{~fy޼1u^vQ6BfgR g^#A<ԓ;ӗMGޟ0'?88$D 4Gu2Y%"OFN˻VXh0ޚבM,+BYi[.@I XH$/?HrG z&P,4d$O.3_?1P]KW !I?rܜ\=n PT# K%aC.L^qPcfݺUFQprZT`33HUNE$O"WXB\ ӑtA]i!J0Ea\,T2)2 ?Q$)Hӈ2MIMQꃎPb=[E|w.I5ϭc4,޺k@q:?ԩېG(fՏ"pFm6I?D IJp?? dUmD6c_&8 'QR J?3;sTèBSINRˆe"BdkbMጋY6[!Fc7XDAҀJbaщHRDR+SU{L~z_kfDzݚ,)=7(/ bh. 7~DړPFpf=3,je1 #0{A@ΡD∙G)ɌCxTFK'ī&`$9WC NEW޳k#$F-%$8l0h}²6%cM5ӔjC)Ɇ"ӒaJ$ fn$e&( %Y`.hYK 7i[vy/[H~%m_R_OM>#NjJo۩_H\\aHo̡ԡL)}7W? E18D$KeNc([6MWR ()"\T9)"jec5D#`if}ɏ1:_W, Ȃ9p&T !ADQ.P6b!ӤL@i';1{qحU8MDr8߬/SݠT6VâE*^\HE) Q(#0nȇ9htN& 3DcH e92G^ mQ,D@jJD)ʑtɿEee)aaR8 4r tSfT!jZqI ?utxiMgH؂[dE*%\}$Qa )G.TJ4[!GRh"hR /DI08B pC̈T KP3q9AWp6M5E@E!"ÄI)rY-!ɚ )af Yid!U PpCG7 >?,e@Xp!0" &C%OQZ .47e%(,\,dϚ Lw3 iQ8lzdi$`PpqrXK6?tsBye =4`V(% 0өII=)BJBYD?]Fк2'JBbiR)7gBf\ -ƣ"*X0~CoKpFN,ѽ(1 M- zvAO8)K5$qՍFD<=f?f"O)G03ED p[D36V5)3dZ1zG"OnmgT3*L#6 L LD2!CN 3O:b?ʍeu&COq L CXr RA?/!Tu@LaAdASS%o\~BJ89*)"LH6wILAA\jS-2[~L3$sҏR$Bó )DhCR ߾T Z}-M X2("`S xf(ԶqDVDT(Au$#%$PE( `xd#aCi C30BLW*HXȍiгD7NM7N] T@ BTFPTZpClͩZ& GJ] \xeI{7y;[Δ!g'>h# ̙pbhJR.c1&f^,?s%}oOq,+$w djC٢$IhtbJĿu*JIi39*pdEXfT27dh<0sMC/.5߮v`W+^h$V_l\4zCE!%?"T h>9Y*[ғOE58zU?“$XViH(ə%R,iP-N 0oFpV&o* JI"B%q {^ yԔ u" bqlT~:IeRm-툩ƈę!$TG 1 j)%L %@ʘDܻ^6l.=4\49bRM0&ȪLΒŏ7HSq/!\)yAOYP{(Ө2 0E8"e@@ $4J.%̿=T?֗e Pkq2Ԡ}_}9@W܈BG͑+l 7fNHFݱkk75 ƭt;Ctf=R scD ymg߾h]Da몌\k'_7qLtYRĮ⪫f_?73y6G~G'rq5qzayhvdFoqkM1?[m ׻|e=uG+o*ZQo0H+_3! unrczquXG8?kT+_qӯKy: 맆۳E-N.A{D>[ W^$g4=7cP&UrL\ 'Oho_\}Cʊ""=O}1P*tTdEUlǖ{hJ#[@1Ћ짿oRr*\6a`(Qu޻>{>刺^8{W,HHhJ Eaa 4O/ܽ0L۳Y2EF#E, hTd44Q-znØ"cb0cb("1&!TDήcP抢1(3t-~+kr S\؈u5|whjyIHR~rOc$آk4ZHnb}Ɗ>A#n^R5A5Oڗ Q P%"@P? UO bJ `"@숯D=o_Bk#X+H1C0/#"\`kN$5G)k}fhQ+JpUraA 2p#Md0{ wqO%9͹Z߸RG> qD:s}@!t. wgHr(=)t|2\h;G1}/n4wۋR"VnmJ9~맏h.6v/&vFF0mYmH-q]>g2I͞UֱL"zlhjƧVWF5u콻Gp8iq<ߙSɇańXlc 6C?}#mi]j3꩏Dvgf"]o24H@0+#Wu @Yd6T#uXV۾%o s䳱ub`D'9"vpT('#IER!Y%EVm3^ (*mKW"-,2ٶ}`T#`"k2}FN]<4%$$2{ ;/Tq}?þ4Sr [ÒR$,2'>Ày>*?{r?wsGޓ_#Uoo>kP(,1A  ^I$;*k@"]HhwN. XRO'GuS Tf0Xr9r\+0Bi2' r 7s7J)Y9*=ʓ(eF K$(I RJ:}Uȝ, T QIUNtB̈̓ T]iںJBFtvl[y+DS.&kketRDYkAhVa_޹()d9WR);whG Ώtj(LJd]`|_]!0>Wռ%J^ 9Y%-V׻`^"$De뻍΢IT<"P]gєQP ` B (hz;1ݙ82ϓD}?g7՜g7} AͿ߶!;;6`g>k&:UC L(3#YH1(HG6jOp1McZԠ  9VaJDz6{VFw2T iaRۏR>Uݮt`ʲ!%&X#)3CVȼh؃W\׭+R {#tFNt`k(LjtT_+_x,.#=r1HW:PFxq#;F q*+Y1%FY ZW:hn 3&$B x2_Cݤ7IH6h|ۣGhL7멡PVb4|"豓iNe\`j2D D3%ck }B ]NMJb$} :Yо'.U؞`Zo"X`8oYf7bTJA[ʭQWJLC}814H~f'HsQǓsuj995?zFyUhBD a49.5E#W5->0Of<sGT& Ɖ&ӡ{㜭\=) ]׿EApaEz5f&\`VgQ*c]RF 8zۅ%/Đ8ޫKcRlpx8Èjd3,c zx٪Su Nr@kLJ+G½.|>c YK f7[ 􏯛TFs=u벛~vJ&4 9qߕo24}/WԠF;XG7?O띖2:"?P:5WInnedP)}QK h/ȝÓ#Gˬ4Qgr-&wշ;qy]_Q*uᜍ!N;|uWbo" "Ԯx}|/8.49(1uj]E8ݬ_0uՋ{GҐOARCCYfp?}䓊IK*Ay#߈. o9) 3ByHuz~F@ ĩ_:<ȯP@Ԇ=x("~#2dӻQ﹘hrc٩\nby(Iej W[T3Y͊z8Ɂ tsHzj{uV6uɷ4$/215honyvbLh'&ȏJ<.e[6YL:"BWE&zi5F{';"o\2qgS|$D;^(jHGU6(肖"m!EzCr,k.H)M'^< xˮ $ptE=[Z#G\#x~1"/њEt(6Q~$!.)H8\}hQ2RNC&EQFߙ}^~`iZW`Sѱ"Z-/mji)iT?lmclFI1$Fƣm+m66QhcFTm5EأFPUE6-b" ƴbVccQ5j+\QPcsk&ѭcbh-ƍԛ`6mmAmEhXTmDX4$J R(4X ct4lh,mDhZ4-IQIk(ʢLZ#ThѵQQIhTF[E~ThѱjJ+x=g? !S$\ ,f{8Dz=қVM'm(Gɇp6yd ׈fe*\i>T>yBḎUۗfP@6孮޶9w8Xwzӱ,Q& Cnkf^'Bn8啗PT2#j!DSa%7uG@䈵V+*β `u+g#,t@ PK4rdF[q+df 6G'a|\uĚ;!GstyrrOlA8/d^V5HLQ[=v@wH p_IcF8aH.϶:x^(=iFhzGLc!s|@ 0`ޣ}./Jy$x`;`cg2/9Q{]Eu%zNH`rsdkJmz'2\{@+=%bhAM*ϖңcC;TFί&vJ4ra8m򦻏8y:<.OBS}G 7PFyVG(t};(g҈AɉվZz9:71s)3GA /]DGlevy8Fac! # h)3H}zr=CV>NKςguN92@rOeA< tY=CG_6BRD$#H\Y {1EI87XYe !'wXџj}޿_2yO:8 уIFK4hx9jN9 #Ԗ;@=48T9Q8 ?G[rp4p1 L[־.qz<,Foc22G!k)2p, "g*<9fQ x}vUƢO{&Y!C|~dNɕs1%zHPϯc&~ cCX#AC@O栧E#@AP?E抿PG‚UE_*/"?!*/#uQWJ#ETSG Ob`T_ Uh@JdA`|*/lEP?. dU_!" ` Q@0DEAA?(*J*b**<@VD_+TAT-j) 2O % (U )A@ $JQQ@HR E*U% (RA!JPT@EB PTE(" $!BQ"RRHD ( DP!(( P>R(@8 @@(  "RP`@}RI(N>$H"H"D@vq"$D"r$IDDq1$H$I$H4dIDDđ"D$H $"D$HH"I$HddIDDpHIU$UTҀ5 244#L&&L `&MɀL*JҪF==J~ Ё4$e=MS!! 4z@4)J'꟩CQ @*d&@& 0eO 0#&d14FFѦFh44d 41FF&Iz&eO #}>mRqetn&HD qpOܿMs(bU"~m =o浠ցֆ>|9c?D|٧o~zSGDMQ|{967d0tV,"{zøkD h/gRu0wW'u Iff`0s7^fvB290\2PPV12bX} 6[iv2g+cdaW P%C<'9jevF7v68!޹Id˘}gۚA|G= Ō=TǾaީG6.nCgyxW}XTCߝëjce˗91wgj%.!#'&<{ TÁ롫̀{2ffs{}1GJ.xC% ټ5/-];@ߒ|YYkݣ;Qy7}a !Ufx#֣DKe`'O%fH"@9pS-DxEg0şS[߹9zxs=אָUdG R҃((-cC BnFG8(DY>1s7S/DI"qɶҔ7ƬCR7WpBـ|g!]#ssڼtEƂibvوQ  ] wPo8MAJ!;TB:X4v(08(W ( $M6Jfkd\ % a"I3O f='/ȶ&362Yi ܓ_e'<;yWpyP#LK1Lek0G aKZռAë}O٥3L`Sqc38Guԛ-8o<ǮnpUJ1oq<0\Eׅ&7ýdy\xmMa#o}rU 3϶qȱWV T9kĺ~U^$31f嶡˓<qJQd27vs`A.y֞tou3ZA#Z}xp[9+&?^wp2O" lM&Uwsco0s +gnM,#oZƧlcDb/LA&}ٲ;-DSQ32s^c|aÖczp>mp:T۞>zk+86\UL碠^߅~>8E~W<`շۃ"VעhECm=;ܻXYipSp^xvRUB;0⩒ ehi7F)R&Y| - ^ۿ\sAGz'`O"M 7~y[;"ymfϜ*/)9'8LY#DM=1.͜m%n;+O|j…'WV~9AwmQi{;.G9u7*2]N+qsێhUżGD谳dLf:򹕃g`7VP%,LEd \T°/FiEJ/VAPlߛbnL&ҹfdG] ߝaZc߂3s_3K~9|xKj׏a)|#73(s,AKgTaUK+,%&F*ؾ ǴGT *o·vg v#'70HL_R3hVEՙ%̵8hKÙ81wwYLyy |T|kGG$oңw֒fLFCL;}Cl8wckKLD{*?+ӂ1h!D'= !RFӣ=`q,^;0so\m@@fdڡP2TjAww?@dEW|' Hf>S.2}6^s{VNQ;w|/-)F%&^ hi" bdJㇷ!X *cEH@ctt_1/I,[ɽ}8wlq/rpwG}{eR4*!C-$Y㺻C1s^=ܾ}pžQ?"M^;<ơqp7j'^r<>4gZõ(z*[}[aQQ79ElvOtC&$X"v:KhdeD\06e!M.Èu\+{=xTO8G@*ͶcieN^T%ܟ[YJB'fJ;999ݯ P]FfS7a`)R)8:&?i#=yA =T؉+Fj~՝FQ(I1&ܝxH+S Ry8BxSvyO;N/st ^UVVHD x{"+OM~&{o۰|;":y{^Idذ7|pms%.sQoZ@xZߛW$a7Ee{z; >mƌ6,a4SJ 6Gjo^Dݏ=}v}09"*! p)LB .wwuJgq7J+*T~8W *;;puo·‘ީ8D>M<+a2i8PM$+Q8C}:/t'I?R=R7/{۰+z=W=Ƿ3{|'>q4IJ?rc-^]yw*vi̾7\;S~ob mi]d'")D1!e{^? >_sX:.ƲssOOvYYZG4Kggn*"~ߟ9vfx^&5 4%EI8%312&5̘ܪk%\`$<\eKȁx3]SI @-@Y%w '#g!i(( zڻ2!foWǞNwRIÝ-do3{Kng~GB//\(>tn&ćow7;C&IAx6]rI[0,ozJ.UuSIئEL9A){TitwߧwCm-d 壬d0/n P\hPP-Hr4p%2@/BzddY(3yp᝞PGK4`"I$R`562  !afmUAx#dZ6m<#`E lbƘZz)u p dP67zqlIJ@R!P (3s0{1o \L0`!ѡ aTM~ޯ`&8ЙTdyA+NK69MJ{;7tsf>{Hؘ,תD[yr`s'>N+veg|Tl+3omaV~Xђ,?sdžz{ zx U>Kb)fB@hYVZ'<Χ bg"JDQ6k dyr^GbYo´癗ĬNݤ 69z)F9 (  ܎X:{ CfCjί-eW`0pʢa %ט̝''o]MZ]͹Z=ּ'{:" 2ylSС Q1;ݼyC߾tJWl}w}c* s1aDm 5]bHĸ( bkH厱 %XZ&A24YPb#gfн5E"B`bšfYF[-aÊ1* JШo4o jgm ad 0W^p7ń% fD'b-<%.Y\BD ӳsᚃqX2-.9ף.[U*L2WLY 8b]mIٯ+!,֠4:֗<'.@t lq3Ł}yAּ(ߗhkZ%܁6gpOt`mQI`;=ͭ_80B ּT3jeLÂ0ϰӹQnr^:½#|i_$.$. J IT 3{6Q$pZ7Z8=N6 N*Q G=3C bx;}e" ֏28yGhשx;(˦ [7(T9Hڂvu8ڣs`LfdX`sL(bB͂ 1Ml|Oǻ{[o# 薦hdpc1'+T]X#:}_~w!AQe\AhׇXM|aۥ{6;w?~yЕqɱx"42T>F/ +!Maesr*92CA8FFZbIjeo{4X0i M@{myԤD'By7% ᴏ;Sɺ4\JF9;Kg @_M4yڹ/Zh o,d T]b@sV@$^oC t|+<`1Fgk](5kZBˤ $e<|83W _.'=1"| 8hU,ɒ^(DCD;$9T/"q~9x +\ٖ[t0"TBUyR$IfV=9DѵKCU`!h)WeC7!K#W@g<Y_!Q[&a8αYS3 c!ǟ7{~ne/Ɍ~Ϣ ^^V ˰ Qzp1‘cX,%"Jٹ!Ѣ,;N $JA"aK{ԳG]-;ˈ@ 73>LO67Wn&#R1|3S7uFm0Y>{"Hj%٣,Q.Ua6*I Ă*M>ewv;J'X'OǧNϣh,5*! ET!F`6(&^.ȊL9@ 1(GHv98, "V)T,"r3#&ꇵ@a T( Bz6"t/B̂`Q;9 $֔Aݻz=.L, x{٦w!blH<".D(W\c k$. ,T@)ژU Ƈf9oxb |h}|r#GOˠ60Ŋ؝ lxE^xFFP3*0!JGj1C{*9na܋ XpJf0(>O{6E4ڣMtyJiyxXI;KHlJsaiB DBxM  (a b5G91L$尀2CGe&KNǜ'0炝 Jq7/);\^ƸRfg,Ѹ/iP=:(_5[cI, ׺oămJQqX>L|t E.R{9>1<:d=ȃοSV w&|G-cpliũȋ|4瞗s&g¹2|^lC燡^CR }&-s6CԼkʼa#PdNxBq%'st'w;ίw}:{jmkV Ǎ#ksj=uC.,==/Ojeҗ32H,MߊX0p>E"$@p%Ȅ@; l .b 6.x0$Ž LiC; .xYd")&Az,ʐK&48w2mΙ83kc0R`|uN@D-adeΪqDf~Vuh $N^/ju M;gR:үeXc5 =I5f^p"2=FpH@19x%|]Ӷ &YĽ6pnxVey0:p L.0+J0ϯ)sU(}Sa˳;/O<"DQG75>/ n`[* i& #9cY8[ʦJ͞ A٩]Al ]@Hӣ1<4ʴ$ RDcX=xb+PшKv(\1t apfqQmOP9VQƶQ.qvZ<}a/iFc,RkƟ3Dm@^10oci p'$ $$0JK\/!}7GrĸQ,4ޗ. 1*;ĺ1&}67m=?x31# KƜ-r[]Sxa/tNkQA<m\lH0@FJCo|g\f!3aMn Qp{BTH3@8h Ţ\e,c./SfbNCx!CrzbY6$MO\( #ǹxQ*Ƣ&yhw dHG\p]Oa+vu# m,-meKm)minnT^yي>+%W<$)x-@J'% CU/cL: lA$jJhoi&c +'Es7ƳV^ S-Ig`,A 뾟n;ߣGǀ%ଵG&Mvw3nB`T|~!sxgyN=5̔|O/|߇[1!D 5^nhݔ,0pB} , JUOBɃ&7Cq0n"M˨3YlaaseOU#@ ADa-C-Jh 8r(p0̤ZGz}^ZyWA\kC? v,K係׀'=sg k gZȹ!xC@s9Ϳs88{nKvX<9EeD B!9fCJ,ОтTا X|:RN% &@9 ?DW3 fJ0 $dLI5aMv$Xdf1 0ɱY0;|<>yh{m`ʜ5.QoBN-^yTyjhj Wj]E  5 ޤ{hoZAe4@=ؙPޑVx&!I@ X7kr "ǀV";~t[@à;lpOh37#<3m T:(P*8- .- }<}ZP"<X `>ѹ">]9\aQ Gd)쑈⽳k`}6=k` yBħƽs42˒g.edX.b$ dPTt1&$LWW|OTǾpf&|5ePI`%uyon|E{?DλIDkaj6H}Cf+s? 'P o`^06fB.hAǨ9 :z˿ANRIHq)H31|&H&Pϥ2nDЛt ]PK0[Woޟ\7< J9d7 A +џؾ{`cw]7̐ߖ,ٕ!4K7ƉW/$(~@A25?WT{W<2" hȌe}I+aɀw~sҧ!}{T|]֫GDs%j~YpG׵ P|I:PpkCOA&EmDC |w{_9+Ĉ 6lkaGA@rtsׁxUAFe6CQV`05YK`54(8R39"3ӌkCdgW$UTqxF-GKnejq$9dEvސY&8,X%]ʜd:bi}Uu|=m7ӄfegٚu!#υ|.*jeT\TPF 4BåS Ps|wG$@Ɩ'`.O [[f4eͻ G5r@Ppë} 0rOPWO L!B!NA3 $zbfiYݘtkPlCZCʎ2V\)#9&_aq: EqpR9`)I#aE.\[˼1ÃxɿH|? Q̱x>d4Ɔ^>4A9и_|m B뇾3{fw7əGwz=$x{JbPRFلtNHFNGn1S-^-~oJ\EnL$4@b;X<c8miW/#4fEoY $ڞSi7!#'++Po{ ف&f/i#F1+NEݡQY22)Pɴ@ b"jY,UXV&%>RzlQ \hARH-$RGyy_Qr\B=m`tPbH%A#s&F#4HDD}cϚHq6A!ܥh9c{}<_<+ayhzP<˜]ef+xV]I~ h^7=a]a+B(Y!A!'yU⋒5#djPa.=aXS:qLwTtLnFrS.7 _(Mn C7 2~{<h9~TEepS:Qgy@ԤS^2&8+=.|ǢA@2ׄJ*`ٰT@A;'5^3?OS3͌'g HՄzٌO7޷.p|iѾrq wD˾ Ad[A iL qj8=K]#? ]7ѥ<^#s'\ \Mk`&.j+t]5S,b t%PX@3+#j#HK7l9g(Q1"+ q|y|C!\B({{wW$ɳDkG" ^ZX~-'\Eg!'ԩ ֨`"N;` b|2xEP $a)ABRάZe.HgW T+Iھ%;0_[`kj`M7u6v'X nIO_u#S,y[6' OĦ@%e|xa!8}hFEڰK(}6_N\ %0+X>?>P5cu K<7w;ی!QReSH -\NK:~ vcƒ".0H{ tJm3N" eh:ƷR f٠Px]UgY*HSҮ<~isJDz%be&eL:ݱ $"_(EQ&#nT gSrVE\etnLfdm AXGoÿ7"a!Ldʨ ,w#F9? ӯQ~6<6LRd" :-j` Nw_Guw^{?6tz&l^xRUޠS^0BM["\$L8Wp-CFC(=n9<ށFep_\Ƿ . yEϞc7sw}Ǽ6q@IN |qɥK(ҩ,$cȶSŒF=u* /$(LJd{32hX#_]B@oj^wesȈ's/ha%xcx{Λ A[ap NhHA"/v b+W? Ǵ}w[++bp_6cHY aB~7|!/Q{9sR<|vj2`Oh'ddg8ϒo,bS?t_ oLM0h-0aXڒ/L#YG=) J&@ZPG~F"bQb 2u'OzoҨ \2a)".AL E=)$,8Q#!y ]=㘐fB|I \ Vd| ĺxu0zs}F@bphzxe"m"T_!P[G|^ar'5ҁ(, tL)u@,y,dSWP\ $Հ`f}k/-c$'rf2ʪ\3 svZi+.!g_M'S$ㆦюNklYQX HaIe#ɬa<I%@>țK}Bqu/IBs4 69$ ȫ!aYJs^>牴Ђq? iPk5P!CAޱN.%*̠ BP %%(G $k:6\goytb~cًH &\q  ?sVo$Iq}fؔbl*A.XR5 `z,Zq}kسFOI02 䞶Z[-[h0:, LH=.mt;|"F!+jW 5* `<}O{3RZ1:G4Yb i_é $81 $~$=z9VZyZ|+뭫zt6Ռ P& ĖvQ| s?Oi6Id^&S͕|ƙ^.dzG?Gȶ/20=QIx),(Оd龶(αTjܐ)}q(^܄\Gѽ(B0vA9|9&=&“ܯܶ‚$MsKx "Gr䃿f"6ubmTiES'"/xsi /4yY&!V3шS{&Xd0UwpA9}G?9Brq꺨4a7RQo_d7 ){SE8ڶu}ϳ1{x|81x2?t{!ᒙ9A;aOKȔ4K(!X0Irkzڪfa"a=!̓7l\&DT܏p17z"2%!\UCwCv$P*bR Aޒ2_9W|19 +/v&yΒx8x=$(o`;عv37kp ^4 ݠ;UFc *hv)U^V<씻Wх6faşӜĄQ" ʞ\'m,09f/kR"PVP6";_Ⴭ.C՛}6xېRbI~&PP1D9)2/nQN_F0*lT0{tQu`ߦfKJʡ*^|!wohQ>hHyURLb*`i. 6GX[EZ}h-q:e'k5 "L)g77T/i(FJ^PVD 1{r&,6DiBsA0P:> M>i~0 38)\/gzK>NT#B^F]*cfx잦ܐ|a~d)`Wk QWx}q "'оa0~P1]ɕ~"NZP% .*v!9O"L,%7F/&&"kbú+ˠW(x*!0ZEܞƒ8DOzVqҖ"@TH 2W{o7J\~y؁ Pӛ'u9F+w\hn<Ŝx:Gw 8G xs웸13oSϜͽDRz? ivӃ# i)UFOcx2K7W"E.P$fWHNMr?ݹ)  iTK$RsTz`&g%)i$z} }o/WۮC "!KLJ4P!'Js$ qzN4^sD)襰V RWJ\!Sś7><v"r}1 %O_.6t2,"eHH܉}P)H*2kQ;fr _b|$CCD7ow+Ǒ$Sڱi5XdpՀ#Aiڌ ]<9, dZԩéAkY<^"wv8 |@$ -bv  / "HUÁdG$s1DbBg5_"#{mgM4/2:Dِ[o+(/׊EZG[yKz{^ۢ"I=3SS=!z2E-f:\!e[!T@Jc2e 'ΰ:qCi^1`Z"ݜ6cF]}ݥk,dU-7|73{߿2Ծ:O8ea@QZ`|SVP"}Pvgk2V$/SԦ4\Q Q-8*e܍]M 3m_9Pi"U]1LjXZ}K OH!hhbbzj 3DԮ9Faz#`i>dr4XCP Ȇ OD4Hn kg51v!۠YE0pIkeX5KVPcP47Hl~k ;mDyg;k6i=c>IV`5{ųKE"Ԑ0ر,r's{Ӥmr`0[b 8Vr^v=cFpɺ>YM<5f#D_#bRFEɧ¬="Ƕ%V-c߯݇>6f[_u8Fֹ֭BS^*:jmfaLY %1WVڅ!cCzL(#A44GNˉ8 ?????$5Eɣ3Oh~+qqj^N-PWdVDO {͂& F ceQ^ӷpXVL f QaΌ7j`ۊ᝟rt^l/N.(7yE,հBjcGCŌ{l>z(O2L 9q!9Xt`o _Ex_Lx+JςR9yY|zCܾ3x ~8˹3Бs" ˚pjƝxMհ47B@t Ezꭷ!rC))KƔO,;#̵I8ZQ{J ܽ@qTCD]J[.E5ڦȊP:>2R\u >,­ A \Hs6E 0鵦2_jI)%e<O?)8, K"F>4L Gjt!T@Xܓ܉ !r.h//B>D>E0 E_ G4&AEą Wפ rbRqC2Rs?d ^; n@QU @nnl@U񃯾_}tH=K"  D/#ݻOje0!Ɋ0`%T[n˩Og nE_OrX&)d֊B"Fñ'ɂPtTO 2{*RCDU9^1x4rs@ЉCn`KjGqJ0Bhkt)%Y ;.7,:SCBygʝbbnj`R~u(c[B"4>Ϯ0m(Pt|fݥeVVMn0 a9~ωNԒ. EnTqN.pHљPF)H/)MҐLN7{cSY'A!=(J2Y)H%<敂De.O?KCY߰嬅Gt~L cAE3b^d%z>BgaCAǏV9iG2O+ oGຈ+udLb]@y|E#@R H=IԼstfOTSH ]ȟEΕL8A{P'`PUH>h ԍe:<#]@HNX؄a&v*ErޔMHjAK/Ew 0fsaGb0Iq0,d\}N2Ay<ΗVE2MBff1cGq޳k>C(Ɖ@s$ qe]m!q;vb; yr$}ezQS&QC Q,`AI8],*-e(̋_4Jiu.#Uq :Ǘ21"d/ KY?;yqГ-~ PuG,$YqIe ɨ GzYw?2YF3HȋḦ́ɴ3V`kD*&ƫq0v"\v8큐JI~T$,͔O%dZf R +l>gI,a<3YpJc"!ɘHþkJ5csWoF2X"kxe*1x>3M1>cLNi|7:J1 ŻG$$k<9qQD>+x_7YxԠ8LL4H3] E[@ʄ4l@TBf9fC+%u|".X+gjxR"D{<WڰJӀ\"ES4dVkYC;3|cږPȒm17Y()UDSAJ@1f' '<<]u³\OGbuhz|iwLB[#M%9d:S, ;Bv7]z)P%W#D~AS;"0X(2;[ Wx*0wcQ* HoqPi$s%u?9yyLɆ(2od1/_Q?@<Dx vuIq'3 :s=$}KC`<ߜe?X ǓP㯣D=`LCjwr;rSTIZn2fx8ƥ >&̈۩eZ>kH^VÆH]?+J} H?L`L> ` zl"g[XH^8ZPy%8gkgT=n_S N s|@#[VeTd/Er8((s0kER[Ax,a.id,+)Mac! 4pPnL@Z-*-"M?&'%3VSfIƼ9yF~'qA\h3"&|#IJd8z),_Hط%)rCDie ˁ[k23MFA^m\-L([ hA-S`)- 4?j` D-k2>Lߢbz т7sXsugz Eʅ"!~Iv!EQT {"A6''fnVUTFAљV fyf6P$7$P:\MMlLfԤwz 1"Ak14I q`e3Li b؇W%?GG>OK?넌Kuj@*Hh\Ml4xR~Wфd_6D#E"dd [.&w n4#\VF2CƤ~2|OpY]q`YKǎB%dkD?o䊿]bzR~Z.qp W+.0ĸx#S8$8DN8n,Aިk޹K8yPc`g B!($b` ]AB.9kFYEye>}nz57!! ױ- >&xFOQpv">IQjI_Nkՙ!wQ"$2`HM]Z$50\ԘL$u: )" Ou5?R[#Nk癆_\Ȍ綏a@_'F:w_2 7hO}?Ilfbp~F_Ao87[ѣ?|A8 ,H'!HwZIjz\rg^UoȢ[\U40PS]ͯ !\G~X0 G/O>1?H +X0udJ.b`g=/T eg˜+~㜉v#a!Fۼ۠`7u%O^WLu# yU66oהߐ:7 D 4@ddh$KN48JPnn\шlV. µdA5}JP:Ouܡ 5 Fa)D#BnUsxd<F-2O]}琸Ў/-ޱK^p2|WyFh_n'21& I5PX3T{Yw4A+GRF!A5?I26m~Sx~䌐EW:"ZFl1 d2C2n dBmJAygF3%t"40LtdV 0$2aTLcXxiWFD&8|^U _&! 'jH;% Ǘm3aI.T-۞LqhDz&j&%REo6c{9!V)lX"(%2]%936A.?<(?]wPy7*{5Xpq_"셚!0xgUyI$7 XH~\I< GߋQf;/%ǝ i@> 82b2TrI>S-|'6\m4> x3~>E~iߖr^6{z!-pMDGG|{'(ѭjD* TGmU`t>yJ#%TC !Vx–uRJH,(N‹e&|`fAhbT)`oî(0>0ΩF(q:~(yg2C3ژĎ$ɏUСHc-{cדZre-`q,VX13%Vwm|DBHQȥIK\'"IIJ 7 H5~!vB_{0b:AiK'~"Ec}X!F n0JT9= (Q,1 @ĊW^^$ -Y%ASTM*/ >UV~}|- d<.T]Yt80hQcɚlҎZ0#|b*7%`l3$3tC!BQGU+PDcxMU?IQ6%,]BU8^7\KXFT ބ.]T T SOhs均UAEڗ(a] B6 fպX;F)0ʤd( n>=̫ ^#ac:YlPF#:Ź(J;OO@B6DGPesf@ y;uip9_qW sf'8W\zh74LÂ`I]1JCG:gq0fP2h9u)'d🠨BC08mcRb}qoCS11A!:YInBV>|%msyku;b՚@O9џXCo™i <(#:#Je j~2oq$"5=51h(P+S$"I`͉\pF='/D/`>fu_]S>`"rm}5R݆t 긜 ؅ NK)B;1NxF3E`@V)]{O,.zyGw'1ݴ#ÙkLsM%1spRlW4f6C8tSCcQ=v?:?|-&N42-bt({ơQے~{T%U*EU8?؊1<ǜ,oc}^9pT>Rxc'Lqƥ(TaGq9xU|?g29 |A* Aa9*ˬe] 4DA.8Qח!4g#Ó@`mqՕ-.h/3(A l +T{۲Ӝ7Y1qœj#3GE}l1հZ-33ßzeYtʹJ?QXp0-,1ӯr;Dq@#.1̫\Jԍe#`@.4=tj]23,8 `jmC|Ԯ2<6+pR9 <џ$73 5U*s]N'J·P@)ȔK3C=%JKp1%U˗流LiG# " 480Eyčv-W# 2K yQsnADlF3)I ! dmEU(a#SêXPm?kAXhr*-3b^}*hȴE $!}fP$$$+$''g95_kJgK= E`X`UZV@sD٤W^X $)URdҲ8đlGs*rΦM/CJh 뺳%vAHM3.l %a7T Ȧ<xN,$>GE'j7Ń뷗Gmz[%"]NIspM(䏒%(.ҝhٔGOM6"(>tqF&9WP:JhQLɛ`qd̽.E Z=__JY#|f̱~9`Y3J(OS1Dn?z2q9Vt<bP`s 2UZ$TE؀F\.#gNԓt4WSG}2LM?uN$|_̳/7oF.ZVWKF:rdY1Òȓa{ه!״uƌpت8Ml㤧f9܅pk^ɫPN?>YG_ṔaGэD^&fΫCf6^'@7aԗmsA9Hf8}Gg.Rǧ853SszmR H9)&V3r@dǙ7Q* +#.u)% 6Ǧ/a7 f1EXGǏ<ouؠĞ%a9kof|5Et.CdefjEʊ˳pD2?M/2dfZ w 5kqk4xy yŸ澇C1!S$B\H(Bq~I&m·b9^Wxr?c~7vg l?10^oe  IJiX ۦx-@R8)ѱH'NKC -x^>*˥H3)AadO!wC Q^rΪCb&(悰Ȧ;!t'"IWUC5@̭|q@eEQx `݉_A:Cw۝q\԰$ܐ.mK<'㥂$z qSayb}:),h@p<|'r.7y{Y|.@حK*ch`b@~}r?a_wĻh~<_BƵE: `X~k]/ٗ+Qh~}6^BĬ\Ǯ붉3khߙ/t9p NLzPՆ% Õ'#C$.P; (SK$)Ƴ;MxK%~{ qqHJόd*8XL0(yvE@Gx$y}FBD`c2]@7*]DКw2>sGx,8׿0b/όlGbr+5bPJ8TB~q~\^%2‘OZy74`|xuGydW?!S[㵍WEBծZژ.~d=->\>_`e*"EҊW^Q|O2a3^\O~oc`s1e [kbq,[CȯM<[zt~ ss{<[A~ӟNh _D\Y')rǜL X6ȺD1쌨)2uYv@P9`40Jxn}$RPC'F[kEyl(@Є˧@>TTAObra~L9Wt4b-ǻ6750Pqer?D$M(g9/i.q|2t$)xPB/YN2Ҁ%+hG.QͩEGck($1 DGebfk' E!Fǀ_h6 h`/f9srX,8k]gAHK\ =m]#X8N6XPR@3W?uT'>UBRP2:zQ0m1a naPǾ<`k,͛كMJo%+?}u>vK X$MȋXw>'LzV^,Oݒ#z]Ao6 gWw6< 2G%ٗ=R>1-@pFT&Gn/lQܼx~>-}Ϸ7W$?uM<4kc=q%$qK1Xxּz{M}b1)!Q&~`UC$A3U䲞[Q] 5}K {1/gNEHox|{6톄4.XUu羗x]xuX0uË&>-4jp= zU%b߽B$:v@FaO u|Xxdl5u~6]T)qZ뿟p!`>>_+J?^n*xN /q#>ۯ@'o?#q<3h<>㟎? 5Wu 14I;nׅw'w杞W{yߛ!֪o%w}͵{oTұд?IԵ L%3Z^(-c=%sBlr$RTJ^#ePـV%U[MJ\'"m6M'7 Mg+r)(nr ԯmU[-MrVOtV-[\={p08"pipǾ.BŗWN98UȎI9:IrHPG.\sCWW8> W;ONysˠ8c'_*:*Ѯ:[N:ԎW_տuןY_e_n}W;'fCW~O~g[]?Rwrg?7_ Gx?^A|*kk<TG`<4?h_|<7_ʼC -48ht-C_o#'x>~{ݦ]{y;˼.?o~ӻw=s?g~ݧ{>u}_Ug~;:sskJ a!U\f??|{0Fom7_7?go};Ok{_?_n赪 U<&ï∸ 4?ׄpǿ?g_'> =h=s=Lϋb(~MZ+"4ъR?L/1U~0ꊯj PH)k$9 `PRvuxUT8+uzVɂLZ歵}[j_II1F Ci$F2Y5yyyyygyz;|/y @ @~_wﰒ-TL-& 2@lLJ)D3B"4H@Вʄ 6&HAf%H вXJfPbD&bĒI00 3J42Rma!HaDBH"Ĥff $ aP"I c!hB!"M&&1 C$HY̐Rb$bDFX#" i Б2d4Bbb0)Ē#HDRP0BQ b d&D014PL6C"2 2`0CIIĒ&L&6i@lHFSd bB#K QI0QBP&C0c`RfIB3 hhYB4hĂA1BHY)$!$$Xأ0hPc JdfAКDL"d`4&M" a4A"D%i,!JfHJH#L(()c%Ѐ2E$)HcDQ"dM&cfH &""&i&l&`1l4ZdDC4PR`(eAFBIHPIJ)DD mb1%3 #!4)$M2X(ŌMdJbi3$ A`3mD c%M5ED$HMDA2HBB2HJd"FX 2b$cD@`  $6"DdF4`6BdYD(#&&) H (I(F`EA&,E1"2E&XK$dɁfZ %1ɢM$$H"L@AFM h! cM$bDD J )&̘TQ ,ddQI&@lL1H#1PBfHD$L&E$c2ȋ,Lb@2Qf4bD,C4Q6 f,J(1Y" 244B$@ن1P2 (b#aRlHfQ&f @i  (BaAДL%$ (YE4jE1@!J(M) 4fLQ!@X(P5$RL" IDc,"3I 22(lA&FQ@3FJAH $FH $iĒ0iI22L !JfɈHYbQ)"HRb1E1,2JJYfLQ#т"i4EdmANSbԆ횮fR2M5W VְqWsw8Qom%VyC'7InH#S!tSG)ܒ$.xOSҕ~AhLjoE#oI V`%Lhs=䦫>B[8D< I:fD%ZڇL aDŇ@iJɩ;,WUOFD'*FȤJka8 y:agdxgeN+*!#C5փt 42DV3Ggr\"q\8qظQy\xVAe%47! PG]vXZ,FɡH*Yv4;=;œ.BWȻ=Ul%ұմXf(YQTl xt51AGm)GT:r[dULO1um%-֩DH %@2!VXED-SINIdedNH#hm V°"z!D(C C,`UTZGUbAX``hBA)BH ,1+p4!J970R-RrⰔqIOpQ)ҡFQo- a0A),H"3'h<0EpRDHc 'E-X,ʉK.+jzc:8IeJPD8!K#D$#!lV^mL2WedeU`l9 !H 1nT[0AsbDiPswVvDc$QIdc)I32(d4DX J? >{}}#Q|ȭPD77 2 !\% FgD1NaGZՓKlCr)Z((HfΰtI8#wB(];ɵs0`da4UpL 0(%0XVE 0R,%U0J0E&"*0C00a( VaUX 0a>S"O0RTvVW*fR] bQm6湨9ڍnnk)cB\ّu\-!ʸEwmF+جQc\GfO:o.cSGgu*0mW7#i"ɱljIhEk(R£oI#^nj64Y6 Ý[%hmEJj hDEy]4g]IX yW*vcZ("g.)\5Fѧv]-lW5;nsm«rZLЅrܢMyοח0i4mu#AQUuClbj .W(ܮXlh>+^^kcch[[[ZIX[Ll4o?º|l +^*6{wu\["7ط5%q2kbܵ,m\^m#^]6W^yo+4ATW6 Qnl^k&c]hyW+DZ"ܣgvKFܒѫtg]s[)mngpW.Tck^+(,E3+qlQ]mʫ-XmZ+6Kn[\ܮh6(ьQj5TWm&6[+\6Ic\5ʍOW-Fmy|yj661So--ŹnRFضswurܹd(U;櫖4U#B`7$5ynhV"MUy*.msk\1F(r-hnVJhѭ[ʼUE\Ui*\lk-AbFF1F ^RXFZƢ5-4rƊ2Fڊsj01%lOwcMSDˮ771FwvtZ*6}ZA湮U\rEMȲ[sQI"_=ך˦˵&ە6wutj刮WHTBi6jVksT+WvE-&mrEc˥b-%+EQl{Xn|V-Umo+rwhӻ|o6y^fhEdˤh(UnmUFXjXQ,Qyr-XAQ ]ݨ_;9_rZ*4lmZ+sFɱ(Dm6 j܍,Z,kDZ hEyUWW7*,h5Qk!)(*R-QQZ6-mrEQQ5AmyshbcT[F6tѶ-ͭ1mZ5w渚~`Sudfbo'uQ\/.mcsUϝsnRUv^WwZ/77.V鈒s96^WMyU{I؊(#r4F,kwuQ[Ygλ^W w+B_N$WcQ\\FQyUn\yͷ+s󅹭#E:n5pܵ%hع**{W-|i4|y˻Q\7W^F6~UQ51Qo6X//p[mE5r-U^\^4F5bJ[ WwFl]cljdů6U[Eѵo[mb|ZnT[ʻWl&ˑ}wQW-mʹZ1k&lj*mV4m,rsU櫗5F-EE[wchmn\hȷ,UVr5\{[picW]ۤLY̦c*Ck H"ڊMU*ŭZhV[Q֋kQmmF֍T[j5[bmcmbZ6ƭQUXѶZ*ѭhZ5UZ-[֢VUhQjVkXTZc[EEFj+kcmձUlV+mbض,mUmmEE6ыQ*kjڪ56XэZTkTkV56֋QZ6c6b6XmQZŵPV1bՍljVEcUXaTHW"I]7-rZ,U^kbTGsƫ1[]7766湢Z5pku\1l]ڹܢܭch!Ks`r[h]{5/u+sQ_6-ŵюW4clEEF)hF-rhmsW4rZF+hDbj却WTBוr65lkF3ݵiB59baIrkFTZmnZQ7rMj6F[\rhl55EsW"k5mmcjZŶ媯-6bk`*Z\`Ȅaho"(Ơ寳KlwvcsEk\lh#N둊MrnUs^[yhN-F*sX; 6Eb*j0hѫjd͒76ֹ6cb,UDcV*-1b[Ӻ++owV6 61s[QcTWrƪ61FnQV6ũ+<\lT`֊#PXZ5QcmTRX[kV(lkiUŷ6ˬstsJDPb*8lKK5,` #ńņ,(رAi(&ر* AwEmj,hJJ[EhE^W6ۛjKsmQktՋQT[IlTs\k-lTV4[bƱnhѬmXڋs[sm,QjKmV-ՋU`֍T[Qb5TZmkhѭd֨cQlńV, 6U#~pxQIi}3a3 X,0XNqѶU͂|[*X\[WKtتklTVZ,Ur1`\jmF\T%Z ە\(lEFūUUůUb֣żr[E[FcTV66S ł0 %5+TWvSߧ-խU#m66EFkFlUX]XѭV浫nQXrEspֹkFmQV*UmՋcslkmEmQQ[kFضFՋ[QŅZ;,0!j3_4mo-Q[L!Q *l*Vwś Y۵D/;-bѶl[V߃me4 RIVxԱ11kVnC=}Y8*^qu~e_m(ŭErsQmU[Ub%?s02c)cBa (3XU)l)cYQ,2{[o([ͷr+HDłJ F_cXa5-6=Uhdұ©VECk«/ Y{DvYR LET9 F=FӎDƐYbO3sT&& T0rxflT`OLz$ 9Y:5d<:9)Vca+01iU k{~D%CaCMVYŋ=R8Bu$1~֬=KVDqw8KΐVMeaHL0FUVϱCM,"ȪU28«EyՌBa`)βj:"pJQ69>KOT#*K2?b(j9Z Qk{%)UI~mpRCN?Pץ)s§W]6|*$U1/hY $󰥟 %hɂ~׈}OߓW_)Sc#E4F I%pJ0-GfHJaVaJ*>xXGԱ)XWk_S8J>5J3t?Fp"`p2A])UbBC>]Wݪ1'u K_^W6m\+̣Zs.XVq.O'x #n SEkǿɂ ʒ0Z4D13ʯMX'q!R*|t>,Ddac`bcV$R.kAate6F>wܧϟKWlT#4hSI1@Cf) bc0e "I3e$DD ɘ`ɰfP( D(I c"b0Rm12`a(IHLlF!2I"LSa bfRS3"(Q)FLD (QbL$)" A4 Hb`S14JX1AH)&BabDh)TD`h$Fd(,Y `L*20`2H(`e&f2A !"IM&Lb( #a f1$B4$h $ K&Y dAhI$C$$XIT$$$I2!QHifF3I KHdB"1bi IA iji%0&ȆM$ &0DPB5"Q5 I ē 2&d>5~ﯦHY>Zy>D'rtmoky[5.['}{"UÎ:$ EvL`ZL+"d^kp>.mU+墈j"6ƍi(lZAh5bъ#k1$NVJ:q"c #os˗wNLjz뮒CC]BEL#)44&bQ$DBI&$ 1Fa,D cFŒ I162R0iDBd@dFFh%0DbHai$0)Bdf$XQCMKh12bc2!$DI4I&If0I %4`ĢAaQS2b3!($P̘"$ R"F4&Xf2 0Hhf#` ͐ % 00  HD$)%$l%4dF%) J,$zrw_O7|FKF-l` CF{ݒj]|׼\%ݾ{y9Z{kUﺌБF( &0m&Ɍ؋,XъPDhc!,I͒a$I`V#F4XQM&J4*" (Ԗ=y,|[ծFkm|F `S2#PT@ (ɈH,,)1QJlD4X(d!D)D3b1F(ȈĆ,3LF B M3hJ1A$h"(0P*CD*2%4$X ( -"Ba4Mc31R)CbXA41l$RDɖ0$DH$Q% IQ{ڠgN1w#ɵFr`J1,F4%`FQXk"IS)-Hcl3DihI`)E+]sQh;A Ysn뫯mkR y0~^?6z)EXZA+H/Ac{Տm*1GDCw {=ysܪ+9UUZhZl9*;ʪUPZhZg3UW@w9UUg2ThZhZ·qU]wwww@sK@ZhZ:s:s - @- UUUU]tUUUhZhZv2UThZhYUU@eUUY̪9ZhZUt9t- @- @-tt9t@hZhZ n5ݽng>_>_񪾭&ME$4V"MFŢ~ _ keaiTZͪ߅{}{<;@- @- @@Ns8tU- @- @UY̪9̪9- @-UVs;UUtsUUVs*hZhZݫU]nw9UUg2UP-w`shZk 9ΖhZhZ9p̪hZhZUUVs;UUtsUUVshZhZ*v2UUR- @- ڪ;ʪUUVs*hZkY/ffg3fs= yfggggs/y{=g=UUUʨ @- @9̪9UUg2- @- @B:s9ΖhZhZ;hZhZUUVs*gj:s*- @- UUU{گ{UsUUVs*- @tZ9hZUg3UW@w9UUg2@hZhZUUNs9- @- @uphZhZUUVs;UUtsUT- @- @-~Zޅujx˯<zzz|H q0VUťR#I|xǏXs<- @- @Ӝw9- @-UVs*gj:s*hZhZ̪9̪9T @- @Vs;UUtsUUVs*e- @- @AU]ts9- @- @v:s;hZk-s8 EUUʪڪ;ʪZhZs*gj:s*eU- @-UU]tUUUʪ@ @- @o'|՟c}s33>fs.s3˞^Y^{s3g{{@UUUʪ- @- @EUW@w9UUg2UUR- @-tt@ @- @UUVs*gj:s*hZhZ,UUUU]tUUUʠhZh 9̪9UUg0ZhZ:s*eUUY̪hZhZ: @ @- @pZUʪڪ;ʪhZhZ 9UUg3UW@w9UUg2hZhZ////-/w}`7wwwt{{݁ík@"AitN"cTa#Qh+\[\NnTRFѢ* nmssscDQE6\~#o}>+4- @- @-v]}}}}}}}}}9sʪhZhZ9UUg3UW@w9UUg2hZh*gj:s*eUUYhZhZUUtsUUVs*eUP- @- ]t- @- UUVs*gj:s*hZhUUUU]tUUUZhZ9U@@eUUY̪4- @-v \9sj:s*eUUY̪hZk+ys9g9,s9繾^{=c//^^/,g3ՙyyg9)ĻuteI:eRwY;^^Ys33=UUހ=2UThZhYUU@eUUY̪9ZhZUt9t- @- @-tt9t@hZhZUY̪9s*hZhZ̪9̪9T @- @Vs;UUtsUUVs*e- @- @AU]ts9- @- @Ӝw9- @-UVs*gjUUR- @- ]@] n}u^+V{kWUӻMqeYG1^b(g1kO dAc .9FjԲ|bG.ũQԲ-kle5Uv]aly: ]~K?ERPxUTUJ-HJST~ OCk̕:-#ݨwsV+Jދk^Cgb|u&=dm5[ jUkq{jZzZkuul"}l!͓b{SǧG-lS'n=]_,l٥% M;ǭWrkjjmtkl.}=t6W}qWGTƼnUG[qHnYۏ {M7w-7rqyx-ޟog[o߮bٜuvGOzv\-}އsWsq ;l?!936SYyX윷g+^r[pgNc/n}{xw39s\2ok-.]mɹݷ5rM59kۛNm~noic?^IlN?qp񛣌nWv|^ĺ׫:.n>p?Oӹ}p^K~Ez;|=y7#O;{WꝞnv ڿ7#E5ͣN{Sa}6oKײ3-Su,sb} ]T` apdvncw&QfNI /1>aYYxޏOv+&CD1tXl>%LMU'2|v \x5)9o`S:BeSb}-&|l>"bۋS.Ҍ\(Ս[Ghz~YM}RS#R0*&1! O_u%,SsH5)SJՎCUnr4R=g|٪2s^szƛ?.&2e7a~X좙Yot3 &˾/wV_󙒳jj}ZdR4'%{]CJ>$JdDna 0`¢Qf6MD2%A6Q""Y$h2%bBCbJe#Lhđb4D@bō$1 ,Th (6HcDLA`$ɬ& FhF41C- i,LFM" LfLi"KTI( FИFi* 4c0J""F3#2SfXE6&HI6M% щ "R RI 4PHI&ƙI2 1S 1 I&̢MH`"1a@%0AI&*@d`2 )( ED`3 32BH)̘bCPi @5)4F2cXJlLPTF,Fb`C%F6RRdL$R$!(M2M-F4$D2,!1cDHP@% Q6$ e K%2  #HS4hL "A2&FX"Ɖ"d(5f1&Z I 0DChƤ(# `Tĩ"6L1$EL@K"YFH&&!44h"F6Lf( IRIF60B2Lb$ IE&f&RIIFPd EƙA2(Q(IQd`$C4 Đ@"Pc!FM0X"1f HŐB $eaِ@YL Ƃc CC!0E$ (&E(ѢdR2b"$` $Q)#EHDDIF@#DBcd$$e3"L SSii3IH2C00@a@0I&e$D4T#F#b,QI"""4$IL"#&#Fd F0b,l&b"4F aa&d419LU^YV_]uI3 g(]r]2\aWs|ɷnrhpZa[fqu]g*볰#kn1PWk=%F5yVbY7kZ:2xWoFEk<}_P nӲ٣Ԛct,Y2^wQbPⴕu]Ev9MEelb< uMojҬS7\a1"g,w|Ƚ|_sg9m\4~qfJ³7*YV&6{ hj>zxd>th9_kToeZ57Kˡj/F*M~_;D#=yTxHSHd+#` >ot~ E鴶z̰-#rZPdd?Ĵk9O!h4M4Z~ճ1F8ϤuĵOUoGユLNjk΢i5r~?*o|޷ˤ8|izد*tl1U*}, zL&q81&{}cj: SɇZu~+sE,Y/ʖWΟSqUYuOI 5?CvKJҞzopuYzJ}/1~}juyW%:?qO}Ѕ4bWn5ڹeDAF@>E:klOc.ӡtY'G3x_C7 g[ LȚv6l^\UY m5dqgp(yFDdiWzӵRp wvU_k-̧_a0oVJ\DZ}/_,zTc,_}}12LGמWGM b6}'nzzv3ΛEB]h;~=O..7mJC%,zB'c5_یrLM2in8YU{fʙG2eln.걫׺V};e[?&9xZ"=Fx* 4'NCUC7K/h\YT/Q::hdѱ}ρ*7̛_{ujTSy1|ΗZ%2gXr+ e5V4wo֩{j NO)קҚ"oilQ߻ 7=q<(=S,ѽ ٔki؛zs5܃OV_fUdɫG':U|nҕˎL9Q/@ȭkm>Cz2'},ׇ(u[4^+2[ۼټv՞wm}24ˁzOns6ݔFx6|\f'gJUZ*:L#FO)ʝ ՈVCw{9WF}=!Q* ƚ+X55ӧN&4y7ӻngc=߳AMgٹu$^ӭwdZZҧWS8~ _͖k*FE[̲L]t$-#&ζᅲ%oYsyE~}oM:B&^dk;վ실Tէln!Q\G{otΜgo-{~finBrmS[}sf#?;ҩ'?KuSO+\n(>6tq] W|)OJ_?Q/3rmcvTV9F9Q`wi=E(T' 4.,rX8X#S 9pׅ~(zG{E6\Ie_:7y'4vg[#G#LĩFcds3 #:Qqg7py]]caƫoc3չj)Mn yGIEkk:ㅏ6P z?-AnR*W9ʂ8=+ȋHEychR1CpC%vz2rG%Fn:!U?!mY=}3/v|"g X lրIq_}t#CA^XC"Dn(?+'Mŧ/sQM$CFߙa%2>;q* @Bf AXK:sqVH ,A` 3';+lu1M`?LaO"~?\%OIVw򣯀?HOzV0Fdc 9 A$LYRR }{[W%:Jf-6l.{5M`>꒔%[fw ϬӮ ӏY|à={ahB K>ui>I_/{çs˨Ν"oguw;vP$\W䡎 ]kvp;aBʻegh׼PB̀wj2"@ q>*JP }eEHI Mj (E(%Z5#-ӶguMJ8qɻݷZUI"UBIpIATA%N̢JFWTTT)N@6(zgRvDkSlIR{xJs}uѽ AxzqfU#P=@;Јo]7yq7 t-'`*9 ]@>@݂(2 (@h@)BRХAC֊T 45N@uԀ:yh5}z0ƌz|;h e>Lժj8%\ֳ;hO]:S\\)ͧ5z4z \`}ͬJH=hPl 4}}RIUPPMlH A}}֙ 4^wҾtZռhF u=nT.`n:@@ t  >w=>4֊ p!T4.0Cpv ޏPT(Nanz/xBH[7nױ*TUlu[9(<(;ou6TJ6җxEM҂p7\h(<;kTA $RE P"(h$` 8P4b)ۑE*PV*uEt{Zcx!" OADjfd 0#L4!O" =@@ O%%$$2 `LM0IO5@ OTЙ(hBJ$H Bb4ڍ2bmi2iC@d@y22TE?Q *((PQ?)_7{G^}8f[\KDE2S12aSg&J/m*1?g{u ) Rf%5,m̳efQB2 X̩T@M2c ʅWM\ I 1.V )#+.n)üU6u5Tљ+bAJU72S&(A)T[>IY0[LY4oz_Vs'OѿI g aD1B]N\Z  I$,P!DPdQH $H(;BĆlĪfH /YHJu릤|~}g3}bQzmf Z]7X'|J$)>.f_S~_zF~%Ϫ? fFbbAaT-f)4ĜDK2j(l- h@BA)8#2wZ5*!YN25*T]\HJJ" S>w0&ͶS͛{CJv6 [BQL]1Y7EbV**l*Ppio6)Ͳ aMTaɦ) .*{|vﯼLtщgYOWLG?hS/`o]i~3F/:~ y^ %!i7!0j0KHLи&!`Fa >&/[3a}I) I0p%Y10.h3A-%>}/{Z[a=3k:I|{?<')>>z|bpu'f|Tbc_JĘٸI>]O  1'O7_?ď|| ԒSx"wu*N;M K_ [|wҒo6S`>x>?,F=W^ى%&z꜒=-Kk,,ĩ-o0~^4xM~}>UfATz_#'A)VCLd!j S$}t:yu;݇}g@BEM]NVFQbaBGF5F* i"P4&XYUQP2]Xe K O~hdʲH$̨ɈV\'+'E6j2`j D*Tj *Kyn`$R"Z!1F$\LK0le yRCh~}_'?wtlJ$v.U,b-pEER?0!w1o7[?h|z-[f$V`TsP((j3Tc17 LQrA* 38˲U(?Y{DK< +/liCdA4h)rEbE[pP7Ȭl'{}ﶳumb{d$e%fwEJ*'$2E42ɠ5O&H"BH^_x>AIB$`\"CTQR^ 3*AN^s&r*XA,: x4TFbxiF6Hy8DNUDUl-fJ [#+pȅpHBFK։jKyV\  J$2pRJ*" ɌhʳZɕ矯׭)/ߦwOn., AATP% 2'P8tL T42dS&f0MS, 30SV[Pa3 AbbFdZIE@G&0uI8_b~'Nh:P 37[^:tNƝ/95|~;Փ~]b%)(k/UmET-ͱEky)z4SOy)-Ĉߎuϲ^Z//o`iħt{X\6[G&~Jw>Βt${3R-߯xХ!%'KhIgy5^L{!S ,fts! J'ï3 bK)а% A0qDLMk|ߏoztHtttݠtS{ԧ@0>lѥztGˤG4'=k@ZDBc@֪Yʉ0P@@.>ϥSv .T˃U& PAUL`H5PENūIl nā}c!ÊUjI«!қ7YS#?x}`("(6%- &Vq-](PlQQ$XUr(fZ1L97X 02Vo.h9XPlHP PPIls,["^lc&`ĩ N)!%ub jNLYypD,--XHp@8L~r՟0(yw{j\Y ML!~~>듩*]D*7]BYMYUxy2+iɲITIYKl-Ply$93%=Lt%XV6b-x6hCtbeҘNd+r䙬iDccgnT=K"+)S4mnDΕPR, hVV:Kn8iфb^ad؛v<\NgM*l]jK1U4a6fɘ\dk;&Xًv6^x6=U0m U#lj2Y33Q$DhWRMrQt.pFG:zGѷ]QQN czFlg[{N7$JHBQ)Vf^CP vfʚڴԻ%ɻ:m6*]ɦw 'n6ʩr8.w4mq[kc偫1D\Fk?>=|Ò {vJYidtl.jz嬵V*Uhb/D@l;q5YV\Jhl҄%[8FD5{$0TjuDgDh惞24ؠHBh6*D"Ԛ)l[j)a:ӈ[M$G54U= FvAvȤҰNűcSg5E^Z KTЫ\5elݍ;a9̹f#-NԘ%,**F9cvQl[e,:3RfVvΥ*t\͹]4aFZvEԶY[]r+gMjQd/;Kn%"2$vl:UyܙN궬 MB!b*bee+j#db- sNU+mi-6b*VUF{\ٍYxWpQ$6Ѯleʕ%p*˗aqm"8y&E5I43:u$4Й2+XplӥWknhM%  fQؓ x#mXMUS<*6j3k+9imk=Cgr2 kiV˳]RkCKBݜ9CrJ(.Tk$W0XD۪fr1d(\SkRV*euC=h$f1;2aZ-\[򫡸ud6d[zF]!qc=&QiR[摝ت6\2:y2=j\\[]d^p-Aknnv"F& cYXtvg(K[=7&4cvg1glMFF-PH V-cѤV#X˪ tm3%rBdqe.BiZ1dqsӭntŨBc0(ıڱ3mmicmP22XsHJ촛9D$j$ESnL҈Llj9kWF1fm ds).e6X$̴U.v*W.`tlNFc8u.3k ts]u$FֺykJnΉ$(nUMZJ2X{eI3;JMifL8b1Xk;lrģkt[6UqBbm\ fG99*4l3SbFժ[$R,X6WK\iWk##jW,|L1K%RcLd6 ꤙFHBȄ*+tR!R+ȨDJLIU$a]UtaJr|tb|H\)#uMPb(dnF""\ F.k:QV.4E dE* d6g.&z EC(y 7%W `F+rMqR\9*'GrTj,lb pTmssnmIt TNJ"HT+ժˇ4=!i(Of&@#J`VұlQcsQc Vt&uJ44mNJ ҺiCw]`]ɞ 肷J$** NnUS5ARhC)NTʹQbC+y֭J <# JQIICJ !2EM )LHM;h {w7Id,W[4%(?B xR' 9dJDEAR$>2?dT@"/D|{,Q*E%8 +x߾}hM>i='9f7}s=!nb#bX|igm?sobyaxyĔ逳e 5ٽOfngDw޻m>=OSoTq }m6~l.-zm1wħ>eL{}| J}Imt2-QUK`٭CV˺\yw=]xžy^U$DPǨhD q qR>)^5y/y{ @OZzC@/(h>E'V]iߔ(NyxxW{xWoIr?;|k4~8=!}|wދYΨd1YԷQ3R )UPKm@. UB % >>u>` C}PhXR[mv&l$[/uk;DLO@hP̞i}~߷ {KxUn[e/86h6ۉR1ԏsu?=_W 3fLuF5r!! iiPLJN6diLU ̄9`]Soi}w".ӡ'q8Hs5=6'jSħ@J&xmRfɮ}iC%4QKHyǑ#@=}b${ϭo|oYϴ59_13il.K=zo^R„bȐ#}l ŠUE^[c G@гyEX[̨"ak~[:[|:ETput;yAq)"/Nhλ$qXA3* &E0&I2ō24̓"s8 k":D}oIJ/6o5ζxF31}}}}cl ՛>!sP>IjErN˞*8Ssvv2畔qnXhefjaP^sD)$pʋYkhFsz6nY2M츚B4TŵhgkUt.B\{uu]eV&Xmcw4BOtOT6%DH rW) KPytΥlr{jNd2dSJbVFe1w͉E xսYgnTfbNYd^KIaxTs<@ڃ ]Vy'wT\2_'RwPDdL""hpLE^`zUETU<#M#枺*F Eӹzx!cvj(ی7t'-)+D⚱8y{ 2{$9CQ'6\[Nh@I c)-TA( gSJL,q#<˂৐44:*TjE-QFm%j 6Z@4 %-r"EUGȈ", LT@JAR$BJڪ֔ڃX [F2Dbc) 1X*Vz{1dj0d[،lZ6mb6׷YIH4Vj#ZB@ 4 @*R@hd5EjX@$3-!FIfQNSiEj)JD@CUdQ[**xT ]'-aI.8NCZdܻLlQE $AqY\UTr;\pD\rƤ sp % 2KK͢k(I2PJbInX;\1QWwX9iJfMly")(vbDFED4(4hlSHiQeQUӚfJ !AQh\u J"Se1L9eAHT*HGLM!ai6< !tPoP"PUU?\t" LD" SQ?" @^Yq;LI;.fk$(4@fxžݔLOOzJCQZ@5 ZEPUrO!Ӡ)Z/Jґ=M tҫ(yI UDdJq$3x R^A4th]RQH'kHGFUD]{)ʞH^rdHV] ֲ̹S*OU1,mvFδ783HNim*ތ[t5R+#5YmVjM IUEEdPQ+Vsm0`^\I)Lr=,, ZE<$%hx-xDE>埥? 3$ID)]9IY F3 Ƕ{ \-XJ/k)/]l+rO2b{cJyYH޻{`=`t[5G̖"w;d|ܛ,m,u&ڧ::Zt>@CPiUMݻ:RnQm /xLI_VE>T橆tϟeg;ib; %FkkBmcڸ]$F{"Jx{O|;|9C|:y'GbD&:StD (:Kn޲I'śԟ*g7?X+Rr{$4&p΀_$=Q4'J$t- x^ǰ4{MOA[ o=J|(S4|Of@y/8|<:Q2OQBMz襥-T/Y B{0Zt5[YDw*gd.%&Lǽ{ػl7dDSS5SqPaEwdiIay5S4%ҝH .Bx 1-(zį7*J~yKj}v';٬taABmLSU hdMd&kHa5{ m#8pWOO$.45caj~g{ 0ҷ˵KhMbR^֖v)t:й[ӧ$@&|r __5gDy JԡA 2MJef#1`ݶ⧻(+S>غ;}Zt"|_fz46([NL1vgNc3[[v|66M _'|#{Ofd酮Qm-NIR2 5@VCTh(Յ)m.!l÷ޞ/<I:o e)lYieUT|:{~k&IҐ#w 58 #.΍&nӔA+_ϮuUSwTU<ǶG,-Ի}eȬV,(o]ƺiSE/@iKaERIM"J{ޛZ6Jv5+&u j2fL1|*-BuLGׇ2[y=pD9G\EI|CW&3mq,F3vU~OHttdSlJJ%"GB /@(J!GUiG215?Pϲ9$b,u5kO6-UK,e('mhjВGS^<^İM "OWqv&#۬x-chs5)!սvϽB$R LR>cˉa3cYFIw2~ 2B 2H.UC)}GĐ&4tq't`F;5s@|X퓎IA֊(d$%{LWAa2vQ#dMR}D+6`)ijYkYݪ붘~ #m}[SBZ<۩cJG۔ۨ糗w{>%N{HeM! rlp.rI 5 i<.Cϓn|$ Hњާ=Im7q;IMw:vY<=9JMV*HyĎ:hit:G@M G#KihS=ǓϷcڑ3,,)?40L!VUͻ')* m@}3_kV0JMSB B(6s!BR6^)'j4vla@1nzj!>d?4q0֐RT'HH3>xe~n²{G>DzAKN-%KЁu-IBth+^o%OES}I (i~/{ӫ'ԟWR{Avq44ѯnW ~H^4ҽy.MB|@y&#밾OtOc8.qLCh{v@9tNPhE=Nax=ޠK M{7"@$ ǽs/|B_>;$zǓ&Cɫ<{hQt !9O;Nm-;#=;!7k񡧫d$)4'"wOuB)ݛ U;f=Z FI!h% =4zzӔdPRӭG#ON'RS&8E/gz>r^yە Y!U]Ȩ. ?+{ǓyICz1zׂMĐ1HYzXNZtbzӪi}|Ev<_!":zzVW;!ݴ<ס.lN˺wB;<ɖ@Qmޘ!*I {| ag̒yFAxm ǵ{@&L ~3* wAzis%[J#Jt٘c:Xt8R.rduľ9LoY3=~SHNe/|ݓ! ^!}Ajh~?Qsо۲^ Z]t91vbU;YRRa;[gSI5/2ѓ')#3w" 4$i5J83x=o%e|U v'ia z'~)=lޟ$y:4h!~^C{ Pky{'gT>zrQg<5_^}o T_VA?'S{q>d633p(Wje":H6]jT3(0=Huu~[+ĩ/H"r)6):RKDXhixu\>l¸{b'V~%~d˸ Q * Xȡqq+8>}뛝 6jOxFz#ȊhE3\0β.x~o&*Oi%02 |Ї=!m /?%JG#^hqSa2$9]=hRQlPCnI =G/-kyYk^1-= bgae,U9]j>cGG%X.ΨSvs>ՆeYC]ҶX'n&n`|Mķyh 7lrNȸDH2<+MvQ#W3[L!#7 8`mZ;u i-$}Wڈ3ĭ@Bܴ"LDۓWQ 5*K>f{#~z|ȶ2jي+b6Dŧb{mBkO)+Z isSՓ!5QvWNe nIOd^:EOTiN3rQ֒&BmMtAo o8H{A '@==y:ɪAHthtnt4Gl~9'I}c  )0b"'7$)P|SEP`:Rx QbA±|b3tjVdTOa #?'X[YQ:ܣiJKsRBZBO(f{ ♇/6DIڴľg:Iwڑ$ESfl[rW)}F!sjXX +m`O&>:M e)ue n%vKJ,`r-H;amK4X%3tX{6{ЇMRhtweOd+W*PQ,m'%hWh=HQH)tdI()E*S즅}+Mփik a<1߽z-(BsnV"u=>ڊ-zm"rtPt.B *t :Fz:;IV,vڙ%&#Iљ0 Mz{맽j1Fmˑ~C, 6[nN)!0'F=)kKu/;aAL39[wɑ~I^S'wJ~G#Ȍ=*m%# ̩GuwfB"Du qDTn5 Cn˥),;lC Y24_$ s0J"%1wXLzkޠȔ9%e?QGw5=wg]rCgK5r0D/3>}Aȡ6cWJX*3N˚epueu 4:cā& vb@:{x=cp/ ۶7mI}Iכ{|>Ed;sw;9NB {,l'zyBVxX-l"]>/XoTu$6mBƦm'=/ϛ1j&* x2N>PES|Sd4̉[(ÒR ڧS#$^͙tֽ]˛bfYC-a V>0:Q_Y8;=i@1-QO ;NQtBtQ*8=!ip(Xǽ`ӥе@)O!@iCA$C>AE+J>ɤ}t 0yo<㐗z9LqUcK4_ y1;붣Y? !>t}Cg$qg>L $Yޙ.j@ɩ$&T}osDVoD@"N y?o:;>>v(p]{, op=?҇y+~0v:H p{+!(| PF>zCF)By,? "BtRDt+|ޖj·jجmoµz~׳Q}4~H@4 ҧB="J|_@"`~`b>cPk`b=Dm$&N/*IN^OotS r@P%;šk AxdNE*a>9n"_:]USys>]ͪ/c&=[fe'R`R?j2H‚ECV/Boxx//_M`'LjX aeES/l,M8h 2Ǵy!X2QNC޴:7lMYh4J)/?'G*&Īkuoi)-!m#,uzԑ!x'qF՟6̋1#mԙ-V%V)A/ty _bU}^S[=/Nrb8LG%U G^!.V&M51 TRnų3j۵\*^)˨ɸh#t@>]Hha IG Aۏ^ XHeǓc{v@$?%G:ZeJR(A ҀJ(iPH]/@:t*= DBB@)i T)PҮh)4T]4J:'I :I GXL!ih+jװҍ*” *="4M(bUU4"4WB/J/Jt&AT )i /| +I%JzBt nmZQPJTEjmbm^!#ڃ >'M ҨЋhtbܴ:>yt^KT'IuI%;mM=S4PGXQTѵ O/rqPR(@h^ҔBZQTҾ^{E=Wv(2tM7SSMoR:3=缔d4AE 9 D]92:Cf̢JbDYQtJ*B^۾EHF"ywMzz]43[ՔdQg5TW,\)7"l v8 g AK缸PD;yU&UQqVgQ f٤>ع?ޏ{ܚ.t o0 H 6'nԛa$Krb%e*ձG'^_c,~dmI"$/O5᫳򎙗 ڑJ,Y=N[ff:3]2:Ǽk:D[gI΄E]Bđ)[)KŲaf1"Jxo{ީS5dEt66rsU9Jө)mA Wz謆3M>|Lj xg!܅bga% ?,~bW=FofZ'Hy8ß/.9t8j)\Ϗ>"س^:A3+6BzCw)3iMjl5zFYr* .ٺ]n<Ϗ(|K*Q3eϟkf)[Q&갡<6#>Co82Tfl!G<۔¢U i]>L=h/BIIqw,TSfB|ȍrH\ v PRO[Zh6+ $F'*fh?~BZ;'EFL5TVRvL D e[1`SA<61E1RBnw5#hP]szWGj%W8yNAH%h*hɑM E|UOggK\]&ed'fSAӛm̙:Dy+uv)lg[Ԣ &VR-=!5,bxkƢݷssӃD[[+mѴN7$B+Å9f^"=c{[HSWY{BBxe:h KU<<"L"jǏ!玟/I+XHE<*f-$f!''J@N{M$ @&dH@mh'cՍKP/i>.662O:ɑI]ٹTNq$0 (nINZe.S?o?+C|##+ďPXL~$4}2tc_lAUk&yp/] rwOze2C!,MYm*`N-x7v3]4MšO Y!6ZOk[j@e斖 6 a2B8JT 9J[ms Ǟei }o(q~ychE!IAb1e=DBfFrMKúGNk}Og";lZfAtc):x&뀖ah_s?95UYӫ4~F|86G'C${''  Ҙ@ 8ZmpݑЈH9%)m{"[ C"d?+(Cgvs&WyN^WFErd왖T=b+w ri?x3yS~fTDATz )FÂq3 - g{3'9bɐW;`_}91A/rFp?N;gCߥ睚W*PEd20@_[V8<>7=hDO%Nge ẫyr;2o ֓iMDݏ}=Ӗ<78Fps=bCk,'~̟M!,UWߑ3^=LGG<'y0@/ʺ:.8qkrDOujqC{SƇ)s}hr`dzX;#Kb}5,@SvC_zӍ;!Ϋ<|GɃ ʲI#,AdGJ_k/bCl>``F6Ãjʽt󛘋ʯ2ҷ+sO; dngB3o!yqNuJ' 1Ź̏DŽQp m\`v\{Wyc%-m4VstֳBkv"͠AÅ1cH`z@H -ԠʉvC}~>( =(!Jx &'$ #I8l'EVz@2F4@E2#2̰1H hR8(c>sߧJyQ-&ȋf}Jt_{~}K7 KlA0E73  HJL,`1(G0q<"}4ó ҡ^$ @sk~'X:G-vh\PDtENDj/kIPg w#O*?H  IIndYDP$C cS2?m"[}ZK2*kdDh)'(P1$HEҚꑥPӥ)"iQ:T /(iD( :PPCUR.UJtEL{o~>~vU+~LQɲ ! D&Q,8ף'ttն뫋1"R q5X++ZOgk}m3^݉ ,s'ف)4:E=zz)|>EBv%*>B?$4 ^SciC *ҥ=M"B#ДBgv Ol.! F#MQI/H0誨>qی/5y%Mt]x7/b}KuA'}e^ ]Jz&kl`Ơ\o%"$-7\&vhɡeX(  !D:Ћ)۳yKjNө:I$4h$XSɭKokflxi6n,)Fč@utw":6U$1Sce[զǞ2wyBPqiN>o;ulmTIWxwEyi{VXZ[ǻ fbRF-BA4\mg\m='dd_mP5qQMɹVpN!Hi 4StH'e 6sF]M5K)kxcjm/wH` fW- *es#WhXh__Q[٧>%JU4[!6}+lkH2Ïm!MsnI7#ꆐ+$C@ hR"B-m.ەWCCAHR !A@4/@R)CJJ :GIB4uԝ < 5;y$qҟo0~b%[0eJ l, _׊_k "!)_w=9ldMEY]"[O_ɽmJ[~_,BBHvۖ RL: C~ֆ쏓hJGyA#CTHqI8- t&S@yy."=)V~{ ."~@tKx}xZQ64(Od#ybLJʲ k1?^>KUDLP{֤Øu"%/Ig kX?_Pm K=wrͩ(`Ia,R@hLi2;>=m= H+L-7[u C20l6ekY{$]G{QO}CWKۿU<%WQai 9w uDbbtq} =t[)WWZqBaVOϟxǻGд؇sxOUJԘÚϵ}|mZX@A%41~\5ĈB#ID+oU7Rhv5?{dG74zWկR$NYdƋJ3joHsEͮP'ٖce \@5OW! L\Ky!ُQADDPEp-%̟Km6Zs^MaXo;@ɐmN,5dI|ZD[Nxͽ>mEXũ{ƴ<|0o3+ZXG;鷡q _E<lX$\nӐX_'_h,l#)5,L{]Fø~'c0nuu)I@f0:HlCgeg -Ha/O؆JUgCCPsR֊ۙ9ؿ|y1>c"N}xgn@[ԛ٘+]oXjŅz2|_Ű3VhGc_ϯ]l`I OEOmRtthӭ qutP Iڻ=665ߞ@4:I" RP1.4;NeH(axnuNSǗJ: ndq=_i&Ms lie;7kJmW`,-Zdb['0&E>jd0p.FntΑK%qS$#AV:ta(be"9IM.߯;zl5֚%JLaf5imo.9pĊ"'i4Qӱ^ h@'PFvO ?&077mI!߈_ld>xeN^Qv^4=/|I#D4gijrW{5QQb]sҪ'ID8&'Ĥ;JrHW 'q=C'Y!' ȹAo!'!!]tv*+ҽ.M =yFy!B@C^izB iAҩкitMAvG3J֣Bi0Wh򉬖 ?W񬪸qnİMe /V6Ѽ0,9mKVZ/P1~Rdbbڐ@VTm#{[mI:,;zԖ58"R{84yb1%l6j[32VXJkRmX9[Քo6-,nӷ~?}CKʚ=mWKbc{ݙ.qgJx}J.e1v>/{Tcmk6pHK+:ZaX$mW+ +aV, NZ.EQeYrR)cM׳ޥB6ք5##C@yMHYaN/b9<'k 59.rضƣPiw- R˓\(,v 'tyDN5@Я;˼7:L9 +{^Xsلkpgی`ETjz#\u= 5MEBƋMh"hFrSδˊb¦a$%k3jeTu;ɺ'3'C=IU;$fLH>>˧[ן'3OإZ>Hx)!hxPأRthn7I{%>H= 2_G cSOg~zʪPб ҬRt֢llڥn{kg]W<Cr;p1e1)cX>ZMpDs"(@36wm26\~^RJƽ k6?IKhș;pH!2Xl"5Ĵ3EmK1fdfٍSC7%"fvw _~cNJsŮ>&bb|bM jw:Gl'KHtϓ*O !;Δ@y!CЅIZ CN"I܄ 9ߧ42}& >yJs>Z}IjzO /7KݺMh)z`:Z5e\ MOKE'vϰtѤ~_$OcAO64E ?$O/$+@%=='l/= RDwT݋95uJ͈-lkYj-VopY?~}ֶţ- =vwĦo@[ͱk;ِ6]*ݜ]x|s }}a£RȊ+&ZRA=mO1']zm.rЯ&>_<A ѵ.\&Tl>)^͵4Cy,ϯW9PG2Xf=~SLBYbъ,'Ct1v { 7垺} .ArČTON^GvkԾm.iy!< >^AyE'Z|JSu^*IYL]nZ>ozҋb6+,nQy3 T4+4X btך~ԖmTPfQiIPS5UTM}'6t[lSt! <(2om:E6Es(5A)ЌbIEUr (/ѣW74ljMśQˤ5PVƹmJF!@iQtVQ"t҉JtҠJtҝM*EuGZNHZZPN @Nt0v]AJ 4;9lM HPi]R衮JP=Ƌ(BJ@-6=R4*M&{騼\Zwch捣!;Дꄮ9q6LbD$Ęn٭)B'3YӻCTfL17O7 YvP*$Q\{I߉&zбYI@0%{W}f.vBxR "HSqI %E!-z P6O{i2+aT:t94NL!e?#{ҮB:^lidS|▭ dqڛ!&022 dD6|dPп|ܵy-V-Sgv1ʝ}FZnt6I@U8T=)GMaf|W+lqYNx<3D25ΕK >&(N^e% vciѨkYVo{E^;iY3&zB`O0 2) gŮfol.^T2mI=m^D\F3˫8{ TPd0B|%ӢM=2PH)')<)kW]s-PʆI2=ݼI{3+=%֣$&xP$'(.֫@zܱmq}ĉݭuH=)2Y4{FPGS8>Rv"ܱFmIBzBgQ6NffpHS!'=Qd_.Ģ|q=A|dA m 6S$zNe0W~^>}]L}D@^e6QȪi?׼ˁ9u)֫+'BʋÜ9yJh ׿]E^9A  t@Q#uu`c 9;sy(ITL2aI0CR( Qk܅y͔Ql(,ےU˨N\' q.&Yubh& pї?j Ň "eI)H;Soy53*rQfe>lŶ.^,*jsvd*\Q,e !l(D2- yS RB`<*FYJeQ $|]LXQі4wHD$ bnۋ 4mI  arғ#u~&5z.%!-khyA :rZ @&ɑ*1ޟU, ~ok3Bh'(+Diʑ3.a.hs.o%'.qɫTTQ9D riX\\FIE"0:'&f@@4*(NjxmrXI~Q*B«!a%d ,AM|Gվ|ׂ~" sT$xmbbH q Z }wߕvYFDK$A mZAMH2!PT+o3&TfM+A'Ig)xLL$at،g5=Gf0a"(snfg^4I6/N$Ytÿ0D57N2&x`ԛ\1l[ b´:.D;'y8f+fhYjNuQ"o# {GܩXx֊߿Uee&r B\?_DK߼ oӍho|C~#Bs3:7C+h!s>SmMT3m9TT]ªңDX4W6 ?Ǚp2s Š""ib\hi IXBT%w[),kImN%(^2y&C!]B)_˸]"L%YIX^713cHGޫkw0 v|?ߧD8! f}$PE~]sXg93СKQFńDr9*vGyo8~{EeCJ0%_޺o m[p- _/'sO&coO=-jsNgU:SGإ6y]g)oר_ȏD{9z)%Wm\lr` y991+C$-Yq7~I18SOpyls6$iҍ<)ڬtg=|:$kĵe^% rXd4duhR"Ӕ}*5ca]l:Ō%gtͲz-19|3\²F&v%fl1~{ik )laVȏf7Yɮc!9୧D՟SsI,:-w"kM.C=?=>-"MxES%& bءx4KZ@iJ0^j@0Ajګj1f;S&V y0s5\\;(3#HCqjZu(kϟSb_zqCJxDlXuliSk:ѺKA[V) aj+3#K )6${6+D?{G԰9Vq1s}nT18v٠ExiB@]IGWbm PG5([ɗ .%Ums/2ʳ8ERtbH:@ʡ nOEY(ˮ0R?gtHd+[3O$fJFEz}2I,jR˘tXyX^ꕂ}qJ:u d ʋ BHٴE.#/rs1"]UX  @B“rLPc55"jnγb3Hu%j8l@- '=yĘˬӘ"'YG#I"JŪpRDLRRڅIaXEܲB($~xC’Q4_GBQ8Ӄl)p9FeE[+QQ+sbVG{)áPT hE01kd~qERR"[$faIu+0t#ũ*euMGwK tR"95]* 2‰'hhne={)H+z Z+:ikP3i`lо#҇U5QкDHUiXΖJ*[J(#5E6$TAl9ȉ M>ysTK z$riOֳ KE`Fr=TXz\Y(e۲ +HeQ[+ KB|}fYYKQU668gc lzd}Uu#H69fBvb}gaΉkT],}[k>MX[&VY"mk)E[ e-lg3jJ YAlFTglBmMNd,RU+cB& f8#iteJxu.,sj"ݨM.o%ړd'XR[=}R)~׋ud"3)L%c i g++bgkBJh"(DQ3z@lbډqIFR2aH͌ɽYٿ}zaM,AMfjTBV* gȰLi\M(%dz>mFӢյ"ҮMEͮb߷fߛKaMeKH0_{RLu[M5?_M%ՌG^ꯞϼ0PYB3(*9x\MN֝LYTGVѵ656rb]=P.)[:;^,rjֱ*j4 @J]5jQ2ٝ{8b%,;*\;jk^T~)1t\LdmiV$ X |8ż Tw x뗏?$E4!I4ĴWHN:ȥн%"44jF'^;R2[g{ٳTh׋XU95yf\.vic[Nme(Mrb{$ Mx[V/!x>nҺDLїR\2$,?g3<'R?[au*DB%} &8k'~o\F$6'?ʝ*?2$$ku @NZqq{\tZfZW'+nkVTleRFnWDd<;c,B0Z4[:RKPYOfI κ[V^5:f}gh?%'3QW\d REE3{,r*2CXj3˻3YJ v2FO%$6ڨD?9$6H|3G,X@jӨZ2=q i շ^u;bY0~h|FE2%P%s; 82`06Ç5V@ۦv4Їae()A56RYfm׋KSGM2`evК_Cg-ƙj\o oz8XudydbNөpGձC52CH*FQ6{iT=qlba-eԶ␧FMN5m+gO޲E($ǒܪ1p@YlX!V4W];=yLKKM#eIlXS|F9,b g)1j_mݏ1Tx *pR#YDI#<))rl=?k0^0ffm]vj"PNl`YPzTUY=QiI *%[YFBTE*? %YV;TπtUgK9`$󽊥9tFS]*y5kM" }9|"Kڢmi @\]<>YKmL7,:$éM6.03ތڔVhR6 t 4}i, Y4!F|L%`p,Q9l aua53#`_',gEr$Y}X$UaUWT6,j "f]xL{),%Y`F]Bó:+kkQ4J1PR/\-[ ^.̬΂!eIx;c-l`J[Y[`wɮ,HD/f? _#b[lINIzZZ > RKyfP-FYVX4#||{-gqF"MWًٰ<{xKyت~h7oXuZu#IB6} FAt !#! {8һZb^Z{&xc111ĥ!i鱕S kI IaHg>Na ol-/L[" ,̽{ж_nz|of0/_xԔX>V2٭eme0 X+tYp,_6$,7i@75jTter[XZvq YlBx !DdԞsӚvGHKwЋR|ŗ.6i2R*&#CF7z=+hɤF=$f~}}"24eZX.cs;sxj[bL3hحiggOOgi/%()d5,#g@EA]]a)>9'cbae Qh 3{͞)NbeN)k7}}'f̘&ɱ-abr[E^Hj YSh;IG&Ԯ!^[S0/cV0bhZ1bԞrOt3Y2t|XWKhU~bFl.֨[ QmGTxj Vm!TcՏ,gXDG E-*m8ɱRY%VfFTL{uD@~.N-J-bo']qf*\K[!ߏԑ~;Oc۬\'c%UV(C!5 n1FeFktu{f|́-r:288fCݛmjnur""%xǍpAx/q ʛ[FL.k]v')\X"jpS:s[;:N^6Arg=Y=\9 ܶ$4l:A޷'/t6A oWUe.|٬X'Ydz>IC;E4.tEIKU gj%j޼Kl$L'TՔm3}R_=l6Se\eŁIm3XEsI$1ء&AMH,'AеBRbDJR4uД )= N dЇHtRFZ~B)@ tPКtNxca ҰyZvK2Shuƻˆ2CƴMDMWM\iYd^w|;V$\y' kN:ݵam{ů5 N,ԭ9zi#̰+l:LFyI*> Pם+Ebr(j )ЭLÌYɇq2]`vݬZ@_´XEm%: [`ZfM3^V3#.x)懶*FRJdյq}x&&($<(_u7 Jr9@E4_"h${~ 4*% %iwaJ:M44Bג<0y{~/ z::nȍ7ѣ?WID1͵4o%'|R  0o+'62wO_ǶxeBTQjO3t`Zz!=Os.kJ?cS4uT`_"]Ye;LFDap`SV"h%j\R@j*MAD 9B}HL|z%&-}l@$О'a, ވ7{3pRgーHU$b2 Iݯ }hS&`c1UTQf*eDiL)TMҌ!X, D"A[,@I\ pM\BfM*!-*DdA)$Y17zk=INKR\ٸeoϡA0S~1([?ѦX}P$RAhR; 1DK)URT9P)A,CCMBRo}- W+)H(FR t^ ?OE?i k<_zF61yl-^Eoxt~&`Ȉ\%DT-1.(P}_jM|o[W?L{}#-<^O,i԰bҙ3 NȻT] :x>;ՎQ$$$‹F\8sEMSZ,Moj$OO{O댶%>͸,%4޷?w韱ᾍmtuɌ/.S}RR[ўYh!{ZOl; s7jGw{Y.gȻ` C4k.k`lݸgTXߌq(b1k*(}%U5^O:Na9|ĕBx;:cĚOy38Uvcop#Er]z'͓t cw.>C>Ĉy<''H@^%7.9<ꃢȧI8%89$m;dX{Rmƻ}Ph@y t#U=Et("n8;rDiNRbƴm>|1/z1M f\i]`ef4*u@8cS8vӿVpFj$S JI;] Rƿi{kBt&:c5$9k6$귺Yϟ+斒G_v{ *t›zDSiD{!uJrvD.P;k1 C2k)exm΍HC4SϋqB2ɧ9$I*U{Cr.(U h 5n+Pmmz%[ ^ +2+}9=B{y3E*19ɇ1LMXj"S@Y7p&;)޷(|܁_0$#k'L@cNѩmHsǏɭn| Va2^ϑW P>:O*G)t.@PWI G-H( zGPP@:hZt@B&t)yt}&o +BR N:@cU`[ǃ $F4B'H#B)>o}kwIea<+2,DbXJ3Y#A.8ٝ1P}_32jn,%^-EuxХ .9mP0sPQN/}lCipO41=W|<&5mA ='OBӣyAh2qA'=krE9;!&e.rl8WIcmQ2s;WfLjJCQ Il`l&"Aܒ%4b6Kw0ҙLI"9v MH lQ"%JA)- P DBdQh=믢ƯMx-ݓe;\gI$Em}/ౕR4RX2q1fzED|FҫTj;h+l&!i =l %΅j2ke:h(Ji0sPHTcB@e˔2'$:8m';ZlYc aFJ%D}sH3b`K6ϏRt8iէflXa f90<Oh ^9+yTa]:.rf^_zW1z٣r0 x矆 q0 'w(l.1u&ڠ9$qoȍinTϞg;пuJ<|CyЃnry)u9ӻbI'Rt NW?#p"eڮ^;ihN(PZ0`BI6E;;0"oWTI$6 _fVQޏj7|(H[`gR#mc9ˁ#tW+jGi71#`~=#F́YPT|_'꺌fgl2 S_BGŃcɏFpJD xB ɮ^s$[~D؝߳dh&\E -ؓqU1:׈Щ;Dz(h=~_z]GƂoz3&ХXͭ(^MMNDuctDyq= *p=9l)uDk0̈͏(@,moΣj.~+uoYY,|=HkUp *u8:u?l! Z=۫GFHc;җ^ǜy'Kw6c;AhvBEZ7<Jz2!kYqּy ҇ߞX_:  1فëMkSGSGN~ГB1͏ιT׮4:&*3i:o: 4u>(tp:c-E\DV5=HgZݰ!eDK9{qخܨ@`\5T@ @B5|UVa.C5jz̀o'"Kv * !=RJ̖}ߕX^L,w!`za4zoΙ893h]$3I K+f? !vG ơ gz.t}.ߗً/zAbu-.%/nvGB'3><"!QJ[+],>J#N%Ֆj3+鳁gdAfU,3Gup{G8 P"m.ТH *PgRF9h:,P̸maGEYm2ܨ¶f?S)f+8DQEx601>;޼,tI' (q8Uz)#Èxĵ n1B2b5]7d:a") |J>) H_&F $,gҚN`qDtdgXp%,B+j;HQFIOG4(titik_+;m!xHץ?)N\D2@Ȓ,$ 3'g0Hdh" ]HҘ}П%TԈL7[}ؒ9wr[٪=5ޖWe!Ӊ Z8]f$3<8 a<7>1 ;@Wˤ͹YnTI h';Hop o1/ UEqk_1:mW|-# xF>JdbXG8C6 0N̜j!"5hY'xD+#8H䅀i c\L7~//44SQ@҇!wӾ9 2IC8ՠ?C\6;M0 Uר_ |m~~־%'K/KߞWHҿ_7ySG~:{ä~$e>_Q{|SC~0һC|~pO4T>Bh)(^5^$?+M{( WC)AJ'~~I~}& I?K I~*P]SsZc添"팞-|Gޑ{pBj!jrFa"h~[ 2qYic(#` 9<_~(^Oې̑^cޖ9v먽ŏOߜ{ 7""VutM)9F -aFov7EvʭP$!Mաs<̥26Yhu6w!k?&74r2gSeG J]^3z=H@ n>O{=8"ZwY'N w&_wքuoYTؔQiTfjvY2*<~ε0εO L^x8j!tP1p!ֹjGSug;*rX_vf"x@f"k"U‚T4+h &TLi[<@@ң?080  mO-hvcAsՄ`uNWMLF U4"ԥZiʲBy tt/)r%{_~~}y>E\Ͷ"7Uë>+}ÀGNV \~3?{Z{44H$٨ Y @@1lkN*cHd,5y?/F( ^G֖3}u:Er~U^5MП|>G?!~<$={~}>A|%>Nϻ:f<H`QpNuhKvS|TLI-8 2 ?ſ*aAa\/;P͝ߞgj -S4 DlhZMNH Q4l4pH23U6?r30n@1[yr\]F;_Jܭ@nUTgx =,Xΐك}j/t{ο ~EཟS2g[{?*ðwF}pd$h.̘$YG[vjiz46BBQM *s;"k-(\ I"@Y"pv|+ _IĎ7+"IɆq޲aH+&őd˓ Ogv`U^J9:MD5rjUQ )uG920FRhXd;+jMOݭJ5H/ -8U' &T ehj`z-+FB46ZH% ]tTͪTٕ1EQ ik57'8\4;Y"xY\2lg ҳITMDJ8vtԉQD6r]Mb #5Zܩ21I/ ʓr42D&EN̚EQYGEY2agQkhjKmÎQj^V]"͑@Z]Eh6Jv dܳ[FImaћ\FIrAZmjLFU2UAY趝d:JSe2Od^yPsGZnE"9 rt"(Z!BE3PI{c0WuNr# uvI6gDr[e$.JkJth'3LٮM",+F6IQmJ]ɘ^)aU!a%"EUeReE-J&.Jܩ&y{y\2*jD^P4S^{=9B#IY2t[BY0,mvydY"9iHl "/)RҢ̄4BX!jdeWCI)"R!Pߴq\wEeiGP_4( Y(Pթ2 [reC8աd"7dN3P:G2@S XȵPwYc* ou^wq|5yqD#[X'|~GG5_NO̲J/HdL[d!._LwK=~]F[p| uXZ;Ը0v.a -%eMC@Q#띍 6r<Y !B92yi+DY@qId],h@f1ZG=Jo2F>Ή8ĐXU\ &hcײm1qR-vÜ-xV!R!cÝyF+h!hw3t8+CLA[D-Ksgpm>/ 7=t0_{>ҘyYo-z|=y c` AƋmABZCjCe]ve![vE˝Ewv);] Opg d DQA'8k^aTܒ5rq-4GIhR"a^um/E;dASN6PGRB.$955"ȌM6mB;kSB[ec&Sk9JPl(Quik8LR+)uREYy1jC')(r+a1dnQۭU iВ4ms6cdXW;(dEttUL:c%IwU8Ӓ^2C:][oxPN༕lAiZ+GYT<hCS^Kl-c@z{{=6D\<{]ٲʍβBhGJ 4!JA4^GBHHBJ& ZZQ tE*4DtGBDWt J7y؏. ۶tñ0+{xMC#m+#dԕmvتY֗HUl쨯4Jf4D2vmȔEaV)M1QۈuI$ܱ2Zԏ1=xźR͖ 9AdLOS*6PڶĻ)?IVZR@,ލ[UvjIby[y}=8vXJ#չngE%5 &jJڨt#%̙rEѵ9I,Ryq*vr&uƥ1 -YY6Sk+ΖpReCugE%ЄFx، !Pн{dw*=rdFC l'AdtʨDunp]bQw.B:T9Y.E\%kn0]VBz̃= PW &B_;]%Br̆Wa*r\)Q=bq:Zm:BZK"䣧IkJm5jY&nU8meZWٹ0[-"2Jy";nEujkQ\F_+J uꮶ9e9,k+k %6 ,s#uu:N_z?"@Z-(9U#!+km-S:m5v1.lHөR>UUK汕"v r+-rh$CI@9\آ.o lDA]^1Js!8U /3M'CA̜Uӕ .ݍnQfQꙤNwcO\Cgianh%;g[Ik nlm]cL6| i9PrIжI)=cuT skL(xc! 6ÝfήNU9yJbQF:t^;K]Oi K";n:NiCS{TЂO (e@&ԢgGnG ,BB aTtѝ{=&K\/ 2TC-wF]+%ݼn=+^çJVs)Q*%YqyV"să䡕 O3j&DM: 4[ g-ݱ$@Hq;bM\fN G ;x7{11Y"_T=qj7LY>7^OO4__u3>J7p[׿>-֙3b3̠$܏*]1fڨ3].&䠊]ݪ%#hٲI` l3,![w)G䌯ϖl|58x(6/^~m5ICBsm"q6sHd£9%#>CP(.9؝rk2&U#8${ #D:$"=EFU 7׮޸d2MBҿA̧_{2U=޳q oF">dEU.;^LF-ώaYyx uPiV {CNJk"Ǫ,[MR@}P-Ds(ZG~ԏ3*->RP{ZY:>I@G:0 7@:CTtq,H(x'FN:! pmȉ+|G2'DU (bfJhXR>~W{y<|'|`/KmGF)_n;>^l5ad=y/so{?ԝ!|SNcIE:'ol^a;ͣt%~ԇ_$z}S]?$l WhװMVV4F4~Q}k-ȱz|;/wZ.?3L=Q{b=ўSrAs23'5_my\+Y9}fB#Ͳq̍#Q[oN<^?oeՒ㷧шNut:XCG:A7~]g][eE ,B̛]ݖbџmuxVw2?sdVUr U01t&? iէU l텔Vee8ݞ= t݇N)45GANCM*y3 uێ"t6[Zq pgŌ9eI";Ve.KvXvǙ> l4Q&{ast=DD+hSCk\ZBEiCUh؝gNt8rYZievƟ&χѪfMr¡h5[g[t) 8IFa[mAW8Ɲb4khNgOZc.)cm6k\NlfJH6XP KD;dA'l7dƝI;jvċla F{$!z(TTC&zB*ݴWlߍA[Z.طJH:Z< F+aiQV`_c%|fэsI- Zn&ݡv-&=az‹Y_6hR$Z=ҦB^+8X2JH,1[0*THؗfDSK&hPo2(#Q/z򺥔B̭񵘐hV=xBPw[2)XN+~p6x3[zɯbrrWHI ◖Zڭ噍} %pkR69fL=3TMvd5^uOyya{iy.',BI缆6),ݾ{H$,Lڜ*˵&A(Y>D+vxK&7zaj`rlRd )v'/I h'2aEZË#T줸hY&K6Vy(d3ݨ ]tZ= Qx% Mt weJM)҇E)J[/JP*HtOHJ:)i7l5V,;;iRҋ )J cimQMəLD^]د c-X@ /d3}3窱gefεAmg/⵹0̑9q/ўfþ>(?;h뻐s773FB8ܬ:)wPUuD,fM3BL;֕V|δ+^;zoȨc1u-K-bWE@BV1תeJs5"sQV4Dhsr.sIpKYDV΄" L℁JĚ,~|H$Ms@Rޮm:˛GbpJgmXIS{uGG`ӉAT2DŘPLI#RCLۚZ&Jhz0Jfʢ#KB]d\%DREd ÎswC@IDȣǺ&HU^os7h^W@agntɸ Z-,Lz_S{s*&>7 'R"ө2\Ğ}b|\f?l?"{|ۦJW&u i\FD! WH ]fqel8mZLCgk{O>1hEnYFRrE)siumI5XSD)@^- ^aQ33*NqÒdW<JV,ٵ @Fs-02ivF%YSv5(5 ߜKlK,ZƧSLͥG DJCPZ6ȹE+l{FU;=Yz,b^u{e5.}s{@&KmZ r=J5CʖG/w;k78 ͎uh9(5 Zٳaw㋓~TnA 4F-ՓB(2 bkӶt z+Э!+cK 鋜;>mӟY]b,I-6,4 %;+OY7y&.#8Mb "DZ2b2⚢ zg1m/(Tp γsWlmqb>,0]6!ȜWSϻuHjO*P:3<%z5+,LL.my(h㹺΢.g#&i1{bwB fQ KZ&{Uq=q<;6ETFowrFomC]m0Jk"ux_yJs>ctOw{HWwͯju<:T:ZN"~aZ>ԘuS9A *kPD CަH)eLc^krCBm"&zk9cӎ1b|N9cگhNrP}X1:Z Qe?z QGgV}_i^4`F~>Uwﻎ<>w ?IcX$os~侀?:b,1Kp"Sg\XEHФ Y KGd ]#z`H 9(QMB tdM5&uҎ>t#tn3\7{;G6F[ȵ\7$-9&rL+\iR}8/uV31_~Ow:ͺegYڵF~jiWUu~ v糌ÈY펲^!{6fU/GFLԽ(G'6.^h ]ڟ;(z.7XF42??aZZ7#{YZLg=%& 7s޺gg͍{}ÛSg˰C|f|޴u{G/7j..ֻY<79ᎈ!;e_x]$9uB+^5f5b>?몞]S嚶 M.6dE4ϓ<>e|(.=؎Sv'k_,?fJ}Ӹ=r= L J -wn@B=eƻ>r3$b!Qe#E5ugIn+\igSbج)gUhŜuv}/]ns+=;Xfρf |c0(v`zbq|?<{s5Po/Tԟ+<%eLtx^Zld_WY^yu ^r9cɿfnQtFMi|Ns5G9V{|폮eGGgE|׾F;1`< g+=ZmfQj|S({ZWAcogTh͆~u^By  k~{E1N 9S3 b$ ;^$Z4)}R(^.fGS;fFzR=MvC#òM:lw~snu}k7ioQ^w## ž|]BSM3R͏,|j7]cZypDA8GY^Cm32;gzدׄl5Yx?W:Vf[-k!w% Ԛő (48IF5:Q8ʛ̔4<56Rr% ZBZ=e@`3N3;9=gVn]y{&y/YDۦ+1q!n\V}9%o!$>Z>lWU`ih4в)Ϊ'Wl0}yL%V~o/m6r%3u d'"k+n*<#MRl猯O( UDt=uQR]peAAA1Jꜷ[8jfvR,Fa! ųCNdkaevLh%8FyLf2)b5Ov_k9UۭrNN;c c׽|x `"H&UYE5vv'q%zYEFvY%wt;ul숌zɓTj xXaD*Ef:RnvUy~Os3Ik|1rT8lR*X3*-ML&2չ5"?&ɘy8^#}Ծ |B|vYZkQ`T lp ڀ-^N'L΢1d»SǙh9{<1NiotkGz:`JϳXĂpI8  $pFJl_j55>fg{bufG{#ZnO3 ^OB#Gfw&sDlTɑ]r3pމSCgt.:Qa9dRCT;u;r2:(EefOȂcX:ۈ%ld"R$XtVlljG6&#MdUhδ=kiyme-dmej 6YteX)n@ρswSޫ( Q `@Oa>GvO6a[G]!t=G07EzT~I=s]"SZ޳!c2v(ZDŽF ¯9T2)P9IQU?ϭ&wyǕ"}w>r_L0T @Q {]k~7{|@g3u<;T𩥓|j_Eþc;;*nDu%1]uC'9 +HΦ㻳6_7y^|Eɏ#g0O;:qd:G7YÕ@s-yvJْJz껛MQΡ߫/\6wegqMt-MUArS@- e` zXqn%w[P:=G!QN{ow{f]_DFgssk^2A0GG2pMQ!XgRp/cQ V=K; Yg"xB3h!DzƱOG8Y8 6qp5GKX y(QXq8I d 8ጬyO?"iO%>?4 oYc$#bH쎾VߦJ}*n{z|᷺}U^ceM& G I$`#8#y^VkuV:(n|4|:2bo7ˀ1[!ȆR(fѪG:gzb~ -ղ6?<+_GI$@ ⊍Horƒ#b(1QX j4i,j5T6hجQQI*- FɤB1cDEi#)jJDh4&5QRIMT`B`Q&"PY*#AAF-%&c&ĆI a1"MdD!0 ,c3a C$%I\d)9~\DR 9wr>;EKp;X'D| gvo,:PL `c+P:5TFO[Bo4zz#@D~Ggε@xZ >nVw;^zIe f.΍%$w\ Tx͍w޽׶1Αݼ{fG7^9z8[q2*(ɿ=/Yc~GX"H8;NٻsϐqGfp0(4???3tz:Y"]w"Zu$2mw  ҃gg^]r٢ڝ,_/bdWf#{SAXAd5]+$h6AՏMruddBxGPH`B=p*A{dw zdY=N!ibT^ 8FL71;g[IzpnUEu<ַ;i^gwrL:i'\ t6}_'\~ؽ^m>;gKE}Kٗ-S`#ltu=v~'->Biu@~_O'|YQ C$AN0IL=Ʉ 7חH37{, 2; v++H 8nE=;8B×ËCY잦 +֯uLQבGͫ]o|wOc5ːK0-,u_*#0#l6ae,f^}?_oawm֯m[u C$d4G4($U?ET]?/<)}A^?7''_y1%dZ\Տ5-Gt9@h#DLԾ8h9^B;Ӫ+my1-'*0΋"-cRLȆn\>/ *D iLS0wHSlewtvb7s9׫n)Ht>y Hy4@(W PZtG?<󼱢|15YZk]@wG$ XBH="u]:f=ZE,w׮gFOʽWG^ف{MԠhB}( 1YӰu:Lΐ^, d[_) MkJ)y~g',1<"8; IQf 8cj-a\H? י8֜rG@#(h6aP CYX)JGF eO'ge=H|ϨlU3=, ¨Z b JP;f/ih<7a dq; dk.-0,_ *5Y`j0(,$CA_ő>W^1GtUyʹ~1+b|@sk,1!J%xgJY̼O]N"b\tltCk6uQN '\#H]VchD?~Wǹ}D'QYD}#cbguz6E!iaZvʥ7l U hdt`#:7cc,>z\0I}`h~ƊLI=S8|ַ oe!j}2##!^y e6{>;7 Ɩ^#H VF4dmA1HDZ>y[, 2H9k o_82F8G4[X쁓dN Yqgxp3'iel|屌#'+Pٯx~6ȹqNGgψ%dptpk1`?c^o#-ҟeyFaH}petx뿆H;p{o߫JG,))$> C\Ϋs65t;X84GSț!C?; |ϑ瑟$*cG],};4  G@zGyrGr41-T1R)""L|1Ԝ{DotwߨNq\BR6ዊ7 jt5m\Lj,Lm$Nߧ8;ŐEZ:T3O^v_d=@ѿ_aKQeI=7GCXR~֮Ϗd#{tV !d$տ 8K2)e iNTX ߳)["$&DؿO]P8^ 94qxPRs@gޛMw;o13˅*R |[,hHٳYxDp Y ׭v>m!0 RΘj~g/vEdNH8荜x@DQi 1JXEt 4"iݭ|Y'6B;8z,H<5~,ppa`o[x\"O"3H8@d'g[ɺ˞-oŁ@y{Cd#<1q8f 2vxGL =8g=k_uuE<շk8@F I-*B$I1>cCMހN>h#Ao;~4 XXP'9+o/1*r:qF!z^o΍ƂG%tzbGij7׵>w3P;=v>MЂ1y£ERY@Q kC !kŦ/޺Dv1{?9:cuZkF;un^Ɵ47 V-k2:!j?hkv9EǝNj)⫬N;K=I{+UuV>W!o~<=\A J?m_B8638D8}5񅯹1O21acR8cPY=k(X~Tj23]B8;:{܊HC>/[P (hZ)(NC$X\>w2GFep"b^Z$`\paDEhX5Dh.efْ-`tvyc 86B~1:;,䍴H KgHDc'`M >rySR/5jf{={˴.]t榋/k@mA9,ՈeVYF=!\ιz^.8?pzב4(zo槛u |XrbVO_;˟pD7=+-|}cd[TDXmyz"o Y~ c'hjI!RsG"#_&젖]|zY %U@TkK>E_'9g $^zj|ߓfGz͕Q țn&K@ CŨ60+jx̰qDi!9:,ȫyۣ~4ggf7\Du8KKmO\t9ZR-jAgzce{3|ܖq=ux2!7~Cr9k}TcEDN[Fx4W5?u1>u@ uǺUVUSRn"LN 4YuFu*L$wڙ$//a-%g^Moç0bW2{1sE͞rEuu=hPZX{2.|BU5 sS:,\1@:#}QWP~,J{]{z#:΋ :Pq7s!V 8;| DQn5o}tDaxwʃy9usuɷ iO92~s+V&"G=mt%*JmųU[;<*C3/.bsGsnKY*Vu }v\ySdT;\2lrwjL?V)uc;F,Xd`pe 8܁'WKҿ#~R-"CW`zC7羯7ֳG5fҦد9 H;KÌ`:pss 29Ͻw#-j?u>_֢AD^w@yr܏فG:htCHmWy~-5وyL|4f#Sjj=1M|9~d({]]Q>gWjs1c /lwȓ̇]뺺󕛞?U ƻ'$牜}#[r.a jC'F{"~_ڙ|;~O]QT,uݼ2gB0H@%wlFʝT>}B1|U"m-*dl^1z8]|59((\pCǿ3,}~S:eBfNwܐqԖQ,eZηȳ\F7]Wp {Vh*wKoKJE [9.0ufM}j]+{ufO}s x}uS$oG{@:5['\<7{럓|]r< {; * {q{|#EZ]>/% ̱cKWg\s{auWΑ}CǛ9@}8Me4wrpnH'GJ Z)O佀N~$@ 44* $`` 0$F=WƼצWwXhүō^jB-N=cՎ!Ў :BL&՗yBu}=*4K:e iaҨ#׳v_\j MO/'F~}>yz:^BVd4j|Hx1H_as{3ܚ;=_<ꏯ4Zbi3&S샖G#Xp,hIPVXdmp+S6&,r%~Ck0G \uםACJ\yan U_J~N}#YɟxhX($ Dڕ:곀H~u<-\ va3GFQx>Jo~㤢)BDSc>`c'vH"tPYQ2>ҢI8:䇑0>I0MouÎp`,DAI`{("OfWȎv>g{do9(}Ls;rH^wیε/fHs&pN00$`~i~>C'Ov?Jy(ҋ$zDz4 ~>@FΠn Znff%) j%qWVzcTOFzct+UԢhD,|]~\ai*L^'w(>"pM5Xd_1Co'e|R߁Ⱦ:Z2/O?CGז Ot}yʴVC( =D0rq%YpyQvCA{z !(oj*PQ9U\I`\j,C0Oӳ#dd&75S;Nj8Y5HrBW{LSaG84~ n}ΩDE=*Pґ|Ln:0r(9]P/% sPE?t#j4AI \`d͡~xE\M1qO|dśFV:MLT7z$Dd}wCCDŽ,tB_)!hZw R0p^v#dthzypGy."|XbzO~f'w0}+|Zv;br("<I2#ȃ()~~V7:w?o>s1|W|^]?]?fUsŸ=?~&Bb;K 2q!G!N:^1f'8+b #2cҋg~q'JNz ?mB=`3 :!"2pH I}xD1;C0 'G mZ0 ;q9C;>$rD:4w|?Ii hc8D) G ì,/Pq '8|l6|^@DB6<]n{g~GGdI"f=}l y_HD]sbz4%W4~?o=$ڥ\br8Ik# :a0S7q,rRAcsndđ9rPSrmȲv6# (~xۮ`˝Q\w5{=/2zr*.R#29W54ܠ5M.nV-7 1J&dq758\*ZuB%BtNbT]%ZE6QA;(;K#nnQˮΆNlF6L_^뭉00 [:"A̜rKS܍%d}zo:1AF$& .j,_+H gç9o+ Fsr=MhRKIIDv$ HdG_F0,2#ʨ;ڈ$G#&nЌ s Nww.S J򫝚rG}];nih[:p/ ~bK{xI}Ě S>ȳOW,Au$xPUQ::$uPP1-%\  ?cX Oy8שr5'( xu[,.P!6C-d[Dy>gNZ5gpN:B1?R rYXPpC:B+ٹ'B 1aUTH~Y>'eyح֟їr5k1CGgSx$.D~D2c@C]8UHW{=ur4_\± '~4+KQ 4oa #)`B^"; Hy8}hZt/ds;qѾGْsJzEQLFoQwț]|뿼WUWU׀OH6ؾ,wS4=gmjE?I$f>b}\ ֵ#zGEyjGݹyoZ܍NU2[yYa9.h3~0_Lԯk[W12wcS]}B|kO̢FUOƻi[=J]+绸s6ƝR}=|8\8CērDA^wK[^yƆUvH]zgdﯾu-}9 B25g0H$ ȱBh=i|{nVzk)e(5NǞXzre7.3>%O ZOގ4uJ@tTYd!2qC:"Н8|?ug~ Škif5\wkѿ3|=c2ΪjU^;}W6ۺ_ލt?'EY睻3MyzM&_/}|iOFNm4RG^^+w=NxVwh\Tuӹ|/Y(<$3+WMGyuJvYu5B0gW&]u >"|/ 1p3()Bsm*Zy[/7E_2:c3;&*8Y:WK.Zav5҂jfcfڳ288#/r| G%,_bOزz+CCJ#,y4AnDh쉻?! #^s}^KBYk"GF>Tfez+di:9~{LGb?ΝuOvw_ރ#:.=<c_N-ϽE]g:߱?:4JGe<<ޢ|tjR_*5_cph=YO*+߮͸ Dƽ_;XCȷ؜2DZjVPk[:zLW_R]w͎tSDh}sU,#q2(1}9'v?%|IxHK'S\nw-A$\Ų(wڼu`OJ"I/s5,D!!ek~p|Qq׭2+{hB 1D8y$ֻ,s{X=>=f(5֘^;$mС՟S=FsTVn$TLEy))7>+;ϝS=D4*5|;(V#-؅PT#˜5DIQQQG:uj%{9=ᎻGjwb.t _Qr{؇T߱ĝ)/xu_稼G$_>_'ɔ= CtOJ̗(FzjB8=NѢN'pZ|aiaBy|C~fA?f+O %sxkW@'PDULWb;zH}AT~փDΙrIǯRʙȄ`uARı#dI'ڶ1)R  8߯?{sO&,ʚ)n~$ Y̠ϝՓ:wHqL 8' OVmA/5)b C q"*{8a\恵k'y &qxp# a{–08DGD#Ds+GB@#Y]gqy"{0+T!Bus ΰ{Z]`p  )g"k ~[ -`#͙3[^$bH iɤa/c(~G}~Pz[ݯ*^V~'Ϯ"~P~~GS_d.;_PXӌ6B p8ҘAhi滿sʌsیyU9:`2G[EK^nu7oؓ#_C矻~o7؏UlWεD߃D/@h)צ[uc!QĿL%cյg5W,d!Ar>*=Emv:C6"N^L |2t>.3}DPGb24!Z}>k1!Ԫ"~6b.G~ujJsww'}@AҸkQ",qɈ͸dvI'#p /)8 J4-u@1"=gdߚ!ygǚ dѮH3,7WJ=檼R޹UuB}1U(z'ko=,͚QޯDžR䪻h yqR3>.g3y2$[ͣ7G'lI#LÍJ5P#7` p(.,9˟f8Gf+;us3[#oTf<0[Dvmxe"'b2;W?Tveh_~v8ޣ#=YfG棸y^{ߚTG`khx{=]8ϭS_ft_1gwMq[z2R!.^Oy^9gk DO9N1n9E^c;3iX04.jw66b| Wk׬a0FY@"|LGps'w˾ߊ'A;>!9HzV$ϫΔή0|.{+=[~-~-{?J;ʇh~ R _'ԩFgH|@A_QW_}IBR '^Ǥ?yG0{~Q?PhO#J?~R ~ k~$ aCt-- R{IߌC/RM):F~oO}H~ :CB}K`P{~{o~mz^W~0 `wcDcttfA0(/`|T/cI w:HP*6`,h$c& ;#JV >dI2j X$M!1̌h:(қ>]cZ9߯kS:s\wZTE)lGYΔY72)VǗ<{YcůΩj8̼}Cr u+sO"z" O߰9ko"$o:|}3Q5G9~ 7Q] *lug* jw}jy]Tycn뮾<(6@ XGӁd|Xڏ?PxGKBCG)8dÌ#zV$:uoᾍ~/d&G_C'9_u_(6P! 4>r-I`(yuac*XG"DI+a ̬Q EN Hx_ _f/۷}¾J~B%// `NpqhbPZXap!O?(U?iF>Ⱦ/^G@>S߬?/3XX)~ M{1Wٷ+䚈Oǽ=_$<#>OD 2~yևu8ĝoyb[餓~_/m~}֯Zv68>U~F"+'gٖPD7,G>0NƐK##RII:K0AKapx $Dq, 6jMK X I}^}88$aOƎ =y$"Oz|c DA~v ˃~6 O5DMC_"90 9!!B LN߽7s&"Hovd~<^yt_nUOޅ=;%Z!9" '3VGUzw~}}}}y`S B5ĝ4 $qaC(B'ǽ@*?~oݴ_Y4S`Q# oxPY #d?xAq2miMlV)g_T)hBIl:!ZT()&JJ>KJ A zIz_9 R;{xPS_v !fHh0;[ؑcU3\(\yC;P+چő'afy@%|y" _N?N?t! sc&~O-ƱQX*rJ/*׊KFR(!0@R{=VU\ѶEV҅ ~PXJ*"RcH) PWCH?KIFϿH&Nm+ڮY1%`ДP@ CZV5Fj* h*1VUj*h-dʸZŨ֯mNZB7յnVQ*~x̢^r%m~b}Uorۗ({ IW?J?U_G/)ԧ1 g;Hϗٷ_ԂzF"Jak|z6Ԇ}FH~RB)W]/vmc`ɨZDFHP%3zGfwetz>#ad`N1^29Ԩ߇?&2"|=Ga-kD&(@?8Go{Z\N ?PT_B3NgoN fLU;, #$QB9X|ԝi>)^}͙"jHDf>1߻zXkFEgwӥIi))|72|?~_/_/Mw$ M绘-}Ӻ+ž2L~O?:+{ ^KǏ0vpXQdv$A?xY_r3$P+^)`"G%y0@ I$q$%2Ey6 h~_{aV#@G$xB8I#j$Fic?x{ERÔ\Xd,IGHrPp_οs%hHFy~muZ8u]g}Gf2QY[T,ޒ:7۲|3\O5q2YCmz/<]|ו?}X8YQɹKߵN_"c:_[:81}#,luA.[J1Ng4 rU$E))/*'+pKw]B\tTgzu߱z]l!`#f77eO~OhO0t iCC~00q}pF£ep="u|~9L%楛68w^_ɿ:Sf^as<%\{ZQijjA]6;K DQM$JYXEV|gަZM_f'4!E*ωh̄=뼏vU]Ԉfˇ,ΪS.- Rͦ'ލf rT=G9]M 1)ҝ&TEI&dhl9|49-' <լ{ɚdDlޮ*!m,+3X@&=|ǾѱA.lDcΣe^܎/ SͯKa-Y}^~x팋hI!$ Lǐ_M*BC!'=©sbcf .RS@vR<5xRK)Nyk79hU-ʋsFe螝9 K%6OՉ$'h<(%- cz]>pNJwrz%iռpH:[x!Bxc s83YtʵHr>Bfܧg'tQi:*ѥ-B=zUaw^MF-ݻ)|A="h5KOϙq6Pe"XĶWeReYWޣkZaɘ6aqi l,U X uٓS qv'HVF٬qYBK_sqJKlҲH6||cF0]1%`k[1|L$xEGlGXtZ1TQ#L%TyygF˸5k(WK_TQm-W՚)OYK^zk0rMe+6r5X۩EP$Lm{]í=={t/COl>)i=CI?]ڔMt*7EbQx<Ä:^hR|ɥq_A'}'z;vzrIHy# Jt-Rt)::EBit({䠝P @) !-CjM S@TvхX hת h+D!)%5KնFDIJC ؘS[x Nl E|zh,9sǛ ;O]T8Vo3(ezͧcn҇'GE-)"Lv:%oz5OߴǢW3k"- KtlNt~NlvbGJΤPd9t/I3ޏ^L#?Du+6kX=(Zjw|OU<<ʮiKEst.ztNKӒIɧF†튤k={s5GZyMhɪXBK>]:rG{Ȑh_@'%*OѽjJ[\ml5K]&2e,Lh<[sbL'+$W38Ez]Rs' OӼy1>&}A,C"A*I{3ͦg&UWl[%E϶NԅuS^{~>)*IN <ތL靸IM8*g ch$C'v{hgv`Jo%l{bv pN);J!@7ws) .N9ی ZT7 QN<98z ܋RNq$E\ JGgݩCbd&B%P~oÿkDa#Jk;Vsaz;=Um&uP*r=l=IՒ*ӼdMYH)F<$:ԉ˯?=$-Xʃ*"')`؅XZd׬2:?kGfƽڛ<tYnoxIХUgv޲5isYz[ !jrN 6fǓf?}ۢ ) zq>::)oO~dAJ{5a߭s6"CbDl[CGDeNEnX"EdElB09b'=Ő8dמ>k)Љwk۠Ȳy!vPpϪyA/6՚"$JAs~)Y=(j >kN1!fφj)pim5;l\|{<xG\}|yh\P( {h1f!AD{ܹ¹H|W^-5h0移Sߦ~>SXmC'wI'm.J~QQjѯZF|v1׻8\˙-ŤW2čjQ%m:XkNrKT V4tvi՝hlRnV m gR٬~[ko dak6=|KH~zxz:ǴrmRYKma`XlGY-6%c`ĵ.)>sQ^O%[tAE#ttSȞCҔZCHIIClom쇓JCy)t)/v2yL|}rvҡ>Aw}XUIIm̬8RE4qC Z ^)4.~ sȎRBxjlc!lR+KvL?}߈lz6i)嗯u֢Jh<)O-%RP`m,EEi1IQ&c` "Ƣ"RDEIj6DTUE"AQ,RU*,Zf5PUDhƌXHQFRl( ,FRY ҷ5 Q&%%!hքJm 3$`*+"YFE !`L JHh!*b#b4d#R`cD&$4PY2lRhc%4Y&DIYLlZEED$Lhԣ tA*؍YOh5b$Z/&6b kiV,^AO[R,ΕxC2,]gmŴ-5p”+c~^Wx) J`˱{bOawqޥ!}&䊌,.ytNMZڞi;q-©UJ}/Z nHP7O=k14Ŗ, HQK-jrʦS&5.qzwׁMHW,}t+*Z[޼Qm%˱JH!x]!9y̶3tOnرr4EZٳ9quq򐯬E!lV / l[vW>$qvٙ*]э0VZ#hm#ػ {[ӉJZhЭ/ɚbU: ˎ| V?XsnBYyЍEʶMN3KBoU,k/66ōZ7>'[B^JPa/JBM09*ɋe'Jjӣں-CJo?m>O&[2:2 ~$9',-$/YwLHT4N~ԊT|fM)wĎ}hu&xYLK8EmnSmQgbW7mvmAm4Z ^b:umI2hrhۭlQhQ7xh"Hwتc~kZ#þB%n bhieQjԖBFR#R>QR{;9Cg|5CB4yֲ6j!ks5)-ZiXMÎ: ԖFfesbS+C7:;E5KKl-N-RPQeS_xOckd)3,e東>㵀}|ǧfշZ65x:uYuCd"}4<dͧ[}%!z^ѭFk*Z}]O##zw>$=3iC%S::M!]-ې`OfCG}][g9'vo~ja`gs3ԹZ&;O/z@ B 5gG"hZqHzLQ@)`}?77zεOBy|{NȈzĈD{`q3__Y_7zn1<א>Y!oˏ-i1"AQ9MR>gu܄s$K! {֫ɧĘJm [RGYz?QGDMG>Œ5Ɂ#Dki{"]aŧj(y"D7{|I.SL:#}]̏3[쎹u[X@G'r#__w|g'4ŜTg34D4ߦ&We |k(t@il| AGLu,$S^:1FK?Ìo? <8]@@# ??Hsr$8&>>NScNKEx3((~YıgOkΖ(} =IGB82pD;xk&ȓC(G*R3(qHIA_<;Wt;=O?}|Ģ q  ɖ l=Ҫ 21qct`` `Gy*t+ \qg @;XS[#DIbÎZN$HmNjbK80#)QH gm>=S&c~!(wh( Vl=zV_IkȐ`@ᓼ@QDZH} LLlHg'^lJX'$ e(#gŐ8pN4pE~^ #Fi3"a`"ȰP8Gda$^f+z:zcqL4'^W@<~ }wq!C*v|0*zj?qC(B >@)@iѓ؍Ʊm&6ѢkEhH'JnJOL79>~$ ˸&zS^l)>Msb\.beW$SgFĊ iaoB@6[}w^p- mblVXH8fRfK mP$ęGy'oty' xn:ć[Iimr0ѝM^Cgbk6QQL[<.E%J }ŵZ;s`.)͙mfkꌱBCUV )JDDYb_h%;Ͻ2rw[sPvz%KRhҁ9HJC>Q8\w_*_ӉF߯|t7ŚM'KAy!ݎ E  (wpRݓHʏ B@i>y҇ג hJD/%=ziRBbgmyQl-%}³ KSDҩ{V&.bEQ\]760m,Գw!?$ g<dH ~ȅhlQ/DY> ~:Lq 8D`ABݯ8 r""BC38IMaLɿ/9c2C}Ecwaӿ>\P#n%ᩊDWɫ3OS>}/UwڊH'vnd [Ӕ`!HxR DJJS+hzfЏ=XƱrZQuDLT!22"j"9Pú3s I&R%|xᇋǯR{Ħk{f>Z߯z-.]kc#o<=na4!&|HZ`Ra'1ILTkPr a3%q!&HMT< *rJ"T{ڢ\ݾ;O.JL}!0AE?Pݾƶ7im%ʼ,EZ*My LB|VvYV%MM] -E Ta̬o%&(YkE`ZmCR 3ofS]hs Qì)Z3yN,YFmQtf3as\Bs.=B"I&'<5fѹ3D)'~?4-4gnXcC*tâAÃ&K%FH$&Pwcaݮ1+xei*D;hmp3P5FI@RRD)MF4 `w#6eSfS@1=.fIIaCc{YxKl{y{6>-<ʽz&OB)Mt #>M ҏ С(N (:^T>wi :W=Ewc tQE/C"HPݭ5.QaD364rtk1hw=@RK}>S8GGg)D!DjHՈLcDA1Mn=^}GOTlɹY;%ϴDBX->xFg:Myk9kq67>pH;tu#]$KҒ{QiޮfvWpe6nSzAM?}W] ut `#۠cttAk8./>Ӣ9YZ1ȡVkf)f"ܵٱGH\"Z) ݡE9ht@C2(H 2@?HK2X>@/܉6$Oq9 +gZ>>Q 2H"04JBS@i(O.6Wt&4BopO!*o7|HjLP?[*lXYIEFbI5{u(eS^|+ nnګF4c{oT\b!#JPƙtd"k:Fv5Jk9Ngsd4,4۽˘c>li+ʝdK޲mi,=~&QaUp8)6-,-l@X7TΧmF鵾]023-ht6^YYgrjy\b*sT{l [֕Ug:6O48ݙٵ#[dQLFk"eEYٓ&ƗpK9R=(6X /YS7V޿ e )*PlI \ߴ+_E~0F^z҃w]r9U?mpb iaZS@6AT顣.qr c,ʔMIGb{%frV& :4NeZRJ %ʨBfHyC9W|IYk;,~=T~?nտ-hB|FC]M~Gc].v`M o~Pkh7A2Q3ȬO**+&|qZ?Њ<:~.3*>gׂ61nZf/; /CbE}pL)-~)qܡ}k8'߾䯙ʔ:/mc#[IQ=~ɿo3fxb#ڀFV>Ru@wc˪=+6kV_z0ex u_M~y{%w^,V&(_"CS3*COE4m汱 2G |Tb1_?-wF*|_>qO??M~i޷omPߨ̖!"̦?sfE3:(4pd6JijP\)JbMHN^nrS1"qM$nmRtǩ~|T*B$0K .11hImH{ԷϺ3n~zqV3p/OzqO{$B;OvҚ!OB2MCue|$i_xWyQBjĦ .+ژpS(G]r2ȳVL*k ]rY-_G<_}_߲L*NL z!̈L)hIR©D?*^{ǵԾ#2{ M57q4!YلdaSXN3^pu' )R?_wC8u+ urɱ^"V*²ˠP{n%(@ fFvQU.&&țSUGJ8F![PIUQ2`˙ܨ L7a0@<zՍ&}OmTXQ_K(BN  g5iJ}H̶9/9FL O: y;O &83!IA4 i% .Tp* N 1(rR Ԧqd"C^֓LIbu,}RbQIJQ&#ed;g9IU1s*)k"7-ɥ5lո&I(PI=Ai KV>Ch1']85ے#45uD5JA̜4A?+TqZfJМM3EffZ!NRgAk%3Lp& R ZpJY)^I}~0n"" $ܶq$(.Dd @F 3j 5L(|n[憿λ".y6EhAY!(P)ȅJ˅]UhttLI$#`8%NMrSaq0$f^VN\*J .&uWճj?){T=ʹSYj dbb!0չ7M&j$yTH R,>*a(._>K5hS`"j$%&\3'.݁_{}1YBMR߷L$1%"ސOf0$HLfd8Bqv!H^&g"ɜ'ıU?؆3:2IʨdʪDZ*YEf\B*]9 ?F͙v 6u.鉏\@1f%AҒIE"Bb S?V )uj1j[4Bi)SwQtܢTj] BgW$#&bNL52k&]R>*Td NjK1@ANI2&Duj)[%?m2̷g V?9*('0[dqH* C&0.E\:pJTZV.%**q Wu0&["X٘*HL5|oKo/ܵ$r% [" In b|0Q3IA,ySЩ4̃^鿶{0K!=>)|,m!x qjP!W7p32LAi^7̽<:ɸ[bYfHaDӈP4n9-AJ!j6RTAdes/{ցeT-=}& $;*-śO-l>ۣ4daDE&\Cq~r)nkgXA=6*oN\I @ˡmRfbhI!PҷS""M,:f1YC/yoR!}B( bfEfe cRaZٲ"\n*דe=o}Ym׳:_zZ>WF4WI4 ,hrB a/4 ߀~S-]|/^}Q| 1t Qۭ.UɣDQ&Ͽu4EE?yWyԦN@Qk1|Vȏ9 T K}ҐdAcQhP(޻~d-t/\sj13۫U- \]${wi_fM\$ƽ.B r .v> rRy1+%\"ÂfWÖݩ|:#'r~?kQX }-}ߜ445ѣ[b|v|} [q-i6_ 1FTFϯ1z.W0Ww/;5Uo᪹€ܾy!|(l"r"_؀|URZQT颃 *}ȠA2zAD R1?W u~c_?G_!g^5*|zo}]%-͔6o4 Eͨȉ '}{г~DuUFzHb6jnm{;sRSw*c\a yI#eZ;S`s * o1TGN_\n8c "e3N3.T:t\|Lmh~Ps(#SEC~0 `cf̱XrA%m-N;  _u?; fp'$-Myͱ(F"]܎s.jEljRoQܢ<9: _&#{$6Q(քL(w' {lB.HW,/$[E] fLH;aqC/%L ۮq%!`եYzCVVHGPxF%Se63sgv8_ǹx$cmj+hbP @PRR#@M(H,EƭkV- RABJPPJ Хk.g-0zƓ:GZ}~1 awڇbzK}oPr Cy54>8=| y%fI7Eg_m% x&sfKX Le$Q=b#΁Mb[YKx%{&SeY&CefO%QݒXs^nW%?="dOET}v1RtGBuPzn˄krƖвCgm& S=>ijΰ2ޯ Oi%#irpb>qwX^K"w kgY?9%%N3*EH5c(:˗ԍDFBr\tyYnK FavcE۞3HVp1`A˯cV^6[c *FT:`mmEz[f[9 /7)p[V-T7l*2yp=+Y*kIǩH+^A֢&GFA@NSPkf﮽>D2oߏ+M-IQV=8ѥtA}exgs`HD^ӣg] B̿#`c `yaYdRܴ'h|!YﰠlװRHx#dAHPS:@Ig<*BXGq]f*yX<6E?AA=Ϊ1p^?.h#:#dw%<!<åEG#kyƏe[@ace'` >Z;8쁣}K9@Ү9gFM"R~U_G (#D_Ze1/sҰ C'oɐW]ƈ"W1(rOdKTψD"/[cBC1.ݟ=qCqH3^qPlAř<;8,#4q.9ă`M@FI;AAU6;"6PVJCA=縀s9=-3vڞPHxFlf75P) NgFy3:N=^z9c*ՎޯwѡP?ݡ9Lcg3ʌ`o{NzAl-9pN]!M AAI lnt],T,nBAۘ8fScFCUz9r; 6v9'8TC@^aSr;눟2k*&~CH*I}yszc3nTc^O>&gw.Lzl>_~Qߧ-Ԗ~2GCKOWG"(c;u ~s{\<+47,E7uѓ5:{W\yq΢Vcrw[~7b`j~_p~زN}:5^kj~DZ͍Z+&gZO]_}ZV=W|U"4nF?5_22u^Q+QWYֵFrZ3G{AQP0ʽĜQ Gr޸!^{.kH8Y漙|<]tG1ۼ삹_C*W⍡<.\cďãF yg6O@YS8g]_kEFQ&Amk46}3]zkُwo_R0xru:D TQ+M]ᘡ}Ӟp5&WzAB7:|Y Nε\CFA߼gŒvO:QFdl/ӏ7,λv[ T}:"=x;L2IgmO!P+7D]"D@!ďOQ|yk)oq_G˶|NJηӕDN=3ORfbO[X[<>j;8'FJ!f\GF": ϰDd:5D-c#v!;!c)vwg.kkH*Sk 靖XDŽd5Q79P }˅]]JAF,DQôfRA8KY8{?ɓJ~<}?;![kKuJ\޴5V\ _us&r_*Lk=]T`'r5M.T~Gu2/Ͼ򗺥X7o(( nQ?+_>;"ɓG%#~K'b_wԱâe 1diH:(Eiuk:[(dkr`iҮ*?ؠ]/3®*D>E8 '}#l`k+ŗ(#mBAE |u3m?L}u2qCD6D|D} ᛙ4]FK8Dm!.NmdYdcƆzN<b2hc# ǟ:1ސY>#C%WnrD'8pO8P@[ӌdτ L!U}bFrGigk4 Nut[O>gGȼȍ⾲~|~JdiS?TB J_'#Jc1ő.LO@1BHU3Q?(Gn}};4peD#`YHQjuS T14ko\o0PES (U_A??o/-kZ_3muؿ.eV黝y=_gr[703{NOkэ'UOﯢ~;<__ES@TU* 0AT?_ "/?*+?UTOꢃ('ࠟS*"A?*}US EQ?(*(?@?A@DYD@?E 2G9 $h @TR R@((BJ$(D RQD%(DHP TP@HH !"(* H UHPP (*(@|>@(ET$(Ie0q A iB c @@B9 )mE!J* S*PMM+K4@)@hAhT@\y ( 4 )PC hOysABA@ R I XBPcp;R 2BPRE* !EP(*(""F @5<""&Pd Jy))$DF@z@h4OT*GzySj )RH dI0aFA'S'fQ'd &"{IaODBm14Sd؉6IcTm53QQL d'4M4 # 0=$ jzD&O!dhA14Ldh OPwt{؇4-Zb'blȲF{rdFJ^Y9ױ16AhɄL(0 z|?wl؛]KG A @$L)0 33ZW^t{9u7&#?3!R.zu8`n%R"/j>>d j9W?> 6|\znm9`OQ{j<&7%E ,@w^6U/fuu}T2#쭉{o1_N/e=/6pxXU/`S %9F,Av@+ f-FN|&| paf 6pLw<77tpFo>Ab?#}]>pD_еO<ۙ~ɕ>emGƤUDL(FHûpDrrp|D>ujUZ>^>x9V1 ) ߝKsP:aP@ '|yzS{0E7o#9{ᙜ&rRCy8 Fzl( xdOpi>L,yS3.202V1NݜIZ&`6|>=5ûA OG {㻞16p sLn]F<,ߜ8jrL+<<~g2=;woc_ia?1<,8d^ k?1E'msZQm;nw/.󽽍8`ǎ`egotm?G:rp8r>5ko{7SJ磆oAP_:7[{# w0bW&msxk?ybſ/M,9=q=8@1ـ}}F)[gt@C3@apNn]̈lJG0xUsdro`=!N)ȼQŷwyg|^68X#AFc SG8ȖS09f}݄,~~O'91P[sG:Zl>ִ4;745dֆCրc cԵqVȵHE:zؔyDv, DGD5ROUf8`w?sɝͦHɈ^r֖t%F l7&^&3cܜJTd Uq~ G=m`:vlf3wB;r1w'tie;eNͼh7:Q\)A(f յpy.gy3{ w O ff/;9Phsvu`m^qs~od8RyG-g.{>+IopzA)*~ x(Z]`WJ;d!s<8qʛ8w̩NĞL0" V7y_ lޮ_|DC*`dz 2G{Hw_S0N/"Odo^{c`\|ş0Aw44gN2̂DtDDH,N<ƹ>,p/9HA2>d*JOؚ1vYwyx{ygbfid ӂ6(^G\0*3gFx  0w3G3,DTLC3r@C^loSnrN]ٷjU(_'\L{q޲`I"=of$~u|bXĈ㓰PF1D)u']3JŅjaR ;WjHȯLdjIZD|AsvB'j'>Oo><^\֏Bc?44G3:W`'{.:IFtM$whg%Y)x^ΕӾ͛PxEeI 9TU.zwv+kd&W3믷֏w}/!Q)ڿ01`V~?G=ۿrnRp}({36˟nOrv`.ԌJϑAb̃?L8Z-ZiodvnSycХf;onlz Ъ"YJ^ 0ݐ %lA&r 9t`N'חV7f XX:$Y8H]l BCӢ43\a.jmL miHr]Q@\"2 Y4!*n0wC ,O*QgM"@$QQbA'7P[yi( R.~x@d [q{L}]Cl='>mg768E-Vp⥥8~%DGwNKkRpQGU vfca<7Ő<󇋧cZ>oƹe3˛;VuAj‘ L4Qlˑe9pR9=8xӍ'}I<~rk -ϓh61Ʒ( Z}qMgd\1MQO+ vLnT}hF2t:sm#e{+z(1ـV3Q>v`?/:A a"` % *AXAx^ b373x-$!x6n hMѴp1!)_C8qHlf!ћ1g2r{g 8O|v T<35.w#1u.sC&ǘ5 [8Jxq%TVP֪0a* $aDt&NffzFQI@zߞPw'-|ey'A83q5P\©I|vk߾O(Ξ*o׊;N1ω޿l~S$^s8d2sſ%}#4'. 0PϦl*v))vRNd@OC,HQLH*u|ڇ>3yβS2O5hueyA% ͮnގ0aإ]od2CcO5};g~+Re"!y"tOUn-Px`,eP=%r 2.8{bdGOTv\S(C(pɏ\rɮt#\Cez^֐ JbP&Bf\ 1n!U(NK5"$J'x>`x7uY.cb"qn9VRSDmlf`t0+5b` YKG97{~i&q ΰ9(BLy"XUs%쑈*`rjdCfCJSh&=#}_vnGhk`טx#oNq w؎rK̵4{sDDd++9/ӭGO=ݝV W ~3X=E .o*W2 @k$=ytmDq̛{rw[;\[zHoϛܸ(3uE}9xD3ׇ۹yՄy{l}vn#̯cy<()dё*)M=30*ggCئȄYĻ|/lL[{G%T ;n>޹9U6y;38:)H;}?vſ9]n+3DK~xV9wѶɁ\*AcJ8 t̬D 0 b :1Jc8Hߥ?o͹{nϑCrIb{l,Xe 6A2L!#:?D"f) k.<02.ߎ>FlLkY>]"JWCäD{xL9:|jqcC՛qSXD* jnM@d=m_#gOVLڃ cXn=S@B9(R7#IIXkY2| M YőZ_ e[a۷Wv?]#9tw~b?;\<>gkA+Wv0m<@=yc8w$PZkUe)tz/34*GovZ[q.\G |R0g|fл?{#c~] %klslsZ>n"l0c.vV}y6dd{y= 9ƏoC"^yⰣwzş,G eԨiy}qAia=`TurVqvGIi1eB\C0 w\NmMŖQ|DQ;VTD vň<":VE*bPcNijBpxGf,?ya$$j tTP]XڷP!&+x*:b Wn ظeXfaU{f8&*T@h~?L}TO8M%`mpu2J$@+Q &p# OX`%!$]RڊEdmH7*kqN @fK0$'4,2*Pf)*WPlaRϾ׷o{٣ 'gm}x {=Xv7skN NE5FH&̼1LdǤA@. 6c!qàǽw T_7o[4S#`S&aT a`Յ"GqDAR9ks 4pH)59G+!13`@D;>#g{x.#,i2hJHRI@ @'(&'LT8̽PMeZ`\Ŋ< BCb0gl*->{Gn߯oyøEV.phJ4%@uOdqӑZ`r#E[@d( BcrK,xɼ-BJ_"BOQ9$ 8RQgjMJOA|<*x6X+oZZq""y|cZLq:7S/ȩűYBՍέyFgq;mPc?'qNu_f$#9ie0Dǁ)0m$>9 ?O䡑`Rf`-TlUY H1Ɇtia³>Jvgg1sfr58pJ;dY `vd2+hiǧ "%8Fgp^ɾfe⭂@N%o}=k=mb,P7'/1l5Ժix 1TfPAQvIzn4x2&@V&RTZo.␆&c/v~"s<~m} 8ǘ6}tG+)(pQ98͙9bljy5t3% 9JbbA$jOQFG"7iYq|hwD.{`\Lˉ, *k/vzyaL^w BWz*#~d_|Ȇ0xs޲s0M'|>UeK,[BoN s&!6Plʭ+ҥ bf}p+a@k,fDP¸ (bH^ fPPA`E@ [`: m *uIJU < A`Ha(b:5k'x841+]UZȌ)n.b납j5@npͰ+yFЎG("#S8S3GV@H,ª:vfFTeg3 @ !K뇣JvFҁӢ n+e1.PT^ΟƄB=s.*{;9 ӐfWER@&χE2&\h{PP5W{c"tQ>%֋58Li@KND:|lȻIr6Ǟ _"-Gl[mJ:ѮYdd^'p[N4R{I2٪W|V8VJ8dVjLVeHޓ0 -]q10%m`28 zA.FJ8ș,o8+|N9Sh&u^#I1GFM*:ek=;Qw'Pzpqh–9*J)mǘ믜>} k@_CF|g0} 'd" UIwc ^%lLM 8S`,:"eV8(W(̌`bRW:ru|¹wk39#w9WF,"6D6UnA rCR!RJ6@A\mJ($v03QdHXֆ)+>ֆpt̎ S۲b7~!72oHg8b[VQ%$b "u8S1C0[UیyqLVgwɝS|!=tn;а~<7鳝yw *٢`bTY;;;7DE-89B%)jtr:3-]Bg*%1 Ш <P (˄C#4=TSd blƭH$- ")D9P{5 49K51 Jw(xLぷsKې w PdX41Zp2p񛂡y=XdH0v|e(e}-n {/8b7?;92cj[Ed TD^HTLƧ=1zt<0gVw8 HىA]H/ kjͼ˼惢#S<IA=.hXeg pm 1aD|c R J4:`ژD}k)`( &%f'(֊dfAvz.+1AZV(ÿ0ЀnDA5UT,9SnN!eԸGTMۘQpQbLK-mD}4wgܠO8pouZ~3T5H‰~,4`gy_ǚGǴWL 3B"N0cC<:턞u0e`XsI{e `L RE"BE &,`gu`0Je8@* îdw B0#1t@P.ƁL.S)/[D8qnqv콒 ȈVuWeAFgnQm9PzPLn@ D#=2`L@dO6' |2i='|p$@@LJaH9 8;Gj!x`!nNsU0'H+hčc&$E(9X&bȅi PM J#Ib*g rhtu Rt6 쪹DJ\݊0< Y S܅JCA.m#<`6*ӎpH95f1ɖXs+X J02mrè3J^Uq\/mko x-T EL^r.{S`9c7&r2wf G#ΖbB/T(@0MւJmQ"P܂EYA+|2\X[]\nWx@!eg|oz6Es|FϓA~ 2myxDTs;@RSlVې,!#FG&cHYr!] Qw"eA"wr1 2I1 P]1]JSh'b!#@ܙ^t =\qP o [&?kқdIrdG5 0~}Z@qz:CWOLp ;,lCHKC޹>Z?r N_d`~6h?^W{WnϾdX4O_Bȧci+$,^W",lv,r,ESѳAh54ī!*2uID%w%@2BQ䇏>,2v_y9ɼmK{߅hfS_JJ>J3/Z ;20 D4A aZw)$MM,tiC$B. tNvyP-OO┎vEĩ;c^G۞lrUc_9\[*0Y>Ho%ا6O[\a=uc51ldpgzܐaBdd}Q", NZ|(,9M(47\h{,r4_o}'"?>]K]ѓxylnd7n|XxF+u| Y w0 8Gt@`*c>?~8>ɐi=̙~{ޗ(\uOB<|A9 %1=y-. Z+#" Y qxcT = H] 9f2wO~sj& &dǀfؼG9GI40dhvGq0,[=.bC\peU4hgPIW2h"l̶],Á\t *@>W >nzEY>ukM{w7\}k\-DF@/@+uxUCd.6wU gB^L:w0DQTڸM%ÊDWq'a &IjY{8za6 +E `If(F)ͼGt`ʲBiK޺~ >9WKjwm z0s*#9-hix0fL f:^rc *DR(l]jG-̛.gw[gzYev1Bdc' bСiЩ[ګl8n͈yj9s ,+1ɍ*|rCUfJB Uj7GɱقLQl #V_3$:lV%3Ẋ|=4kPBvЁ9'o8B-tfeΉ@a+]iv #kmq3R.:lHqB'< |E΄)n'1S0B?;3:yr23*ӃD&%mY рɘiX/pDH|4LoCߔH ,lV 0N9JPV(QlyhwQD6XX~;³ο: OI4kݮ{$P~n[B>2ɥZhtt-RQYE8=lXEI8"3(D.ɘGbhU1$ %~Ti :Pd{"4$ VxѺ.p:QcY;@ 넞 PD9*PΡI#3ylkyV1{^mqdčVW݃/nI1Չ{66 ["׿c^ ϑӕ`T@JBtc!# < #k#ɤ0YGIQk~0PQQ^UcD_g uK׽Wq`J=甝+lW'rU#HYPAۑfCxnx=[qx WtF4$rb tK BWb]nA-lVlc3<*RIgăL}z13f"\ye磐RD9$NH ;P5侷>:s'DwC urNV"WQNIPjCqz'# 6n0q<2#3  DMIoFqCET2=#Yu-JbG9$9 R~$wǤ-?ֱ]~Dzwמcq W7v.wzvKfzFd/iW|jKpJ8"d/By6B1*b;8nh[v)+՛)`^MЀLh Jܢr˜%g9`ijĂ!4wwsNgѓIdndo?_G[L&FZنZUk a&`&,l$D\l~<눛n-Eal9xcu!%p E )ZHLS!;;SiѤp|}In!"L&-Hhf@ Jm5N@XzXR|+mŇ+ڗwJd$ʤԠa OgI4% "+ĉ_Hm+,HB **,vv#c,gǯ\&|ZPL8]uL]~dF1#(^vo\(A ʒ;m_lrxUiGn$.R+&f$jscڸш}>9E.IetԘ|K$9=~]}f>HHz_G5wْ4ꀱ̃RURpf·A>،zBy9bŝ94q"X}⁘ o4*r7}-tB5mO/ ;`v?#궰&PxT^韌)憾fEU% /{Ax) 9wH|#:L%_YK B:ֲ2^z:}K",7$l4T>ʓInʗcolI&u>s[08YuRBVc nƊY,Ka% ɼu1cPAއev[SD*&H-ug!!,0|^Q"XhF#tRҲ*8}˟$A(kĈqzqxq!}&Vg o0~9Ec)/1AyEtADBIixUVvlFdzi/T~x\#"'l8"=u(\Ɉ$ >I #;f, "rHd"JҜd`pPB4sKdu>;9_cŒ{,r~Nq`ľ\#t!q(Uo9bg`OρfﶓHTw?"g[K!() 1 †WhH6AۑHp#D e2gC[)mI.1I|8~Ĉx!m`":~HtEߌ? R:;ӨƐDW<+ rY4LO lO*P8G!/š҂R A9%SҪ)hecT' e]`H8U[,fвC`q&#"1(iMy,gPSQ69`CÔu(|l>xST:ZJYrsSDja-.9Pate}zUhwWrU.Є}2 Anv+bQ8j43a2f6(-0M&tݤа4xSnkk']Hڅ OiFI9>1 آ&O;G\f ͚V yW4ɆB CF% b[8cuw;nRCW& -)6Ćϼhc2WKt>:;YK/tVc(Eo3mV@܂u;X$ >xr>.󽀭:&y,e+zue; `%pa[8-X٨#sf  {]1MoPAqdr8Kc81nuPiZWzK{G961<LϽGL@|&p_[*.eTPԡ Ak|*{#Nx\qёy*.ĒAKxet>~Ϟ[E0F4 6nQghrD"vA2ۧD>^k%HEbv%qp3ۖ9d,2͈4D4c sT'7cM#A8#2/W&.DQ]7}ʊ6tD32d>(U-cg17aiDX|aEͬN]̭@ tnm,B*8BB>5eB D͕sI}ʞ:r.ba ɉ:6"9hbPUKmA% q%0N ő$)fBAduXV3UK"J}σ>p|σ1x?R:&y~lxE/,l$e2.%mw̸Y:|'Vz09b `H#zHU0017; hJǕAW3(K^yB'P9EߌL a.AlyBCO| z/}?-p2s,4qb%.T oD%!4CjN|\Gc8ULPx_b%MWR`(%iۡ4ghQϤ&łԐ=D3 :Olh;MWK&X/ ߏ=x퓁[Sy.!}f~~ ߻EF h=͊[1B[ʂZP;hф!2^h5`)0n[LBC$ X(p;%E04Gǚ#SjȆJ@.])?ǕpF Hl]q>L @pPd ρR<{.фB@qc~7I)LwJ!,[ZEƖVBܲ.O:VH&szh9 ;aVC"-g $}E !wGE`,.txmFO`[|Ȇ㢱@pwcۨ(0^܇C3F&G`"#<3,n` a2̸90)${(5T5Hp@bPV.?wTdwо[C+#@BpcBLFr٨|g#?-CMpowU$2X_q?wB~on~amߊ_Tg/Z~z&1 . 0\|y{=U5m;lҢξ$K(lBnAcԊreL7"bL"QDkmxtE+u 8sH:#HÌ}d~.BQDrI`0`49FΪx+j:[޶tY!~_,2pR$@p᠕5ED$ m# –AF- 2! 1INz .\>l =bc[g.-~I_͚68a^;$IU1R 0ELDZF(iH|ÙX2*|{yQ!,ÆAB$ `K5A|`.: $V#1V.$7a˴Avqq*OА[eCg>E@{2 m\Q@] d,Y:`2VDTTQ|"Eb)Nc^:E ?@=i_ə Qd_wso6Paa{\x2PAA-q(!)u ΏNdGNdh i %nvـ/[CXoŕ6G(Ug|v vg0?Y\]R,$^y`,^^ '(24q 3`_l~Z \_3px/{ ``I4D 6sL<2:r,+$V W Njg & 0<›4ݶ%.iðr' OӈWiЩaUMϲ @`Ee1ݗP$/m}/ U~( D[ox<_PGAydeU%_v |oہH֍AP5 (>]Iy}M=~4OWXH=o̖LX @ADh`PqS¢seE4G 8"{D$k4w%F(~iݑ7j/*.=Q5l3x)J0әty Ě hX 7Lj ` iVWu?hmkS/e==x$[eLMDS.N8 Iu2L0K.\Ե&*>+Ѡ9)@iA IDnH ^ LxDK\"1|Bvh~z߷u}ym<4eAy'69\Jgci{x+׎4f@C^TIhh 7ˊtȏ|;Oa Gqp.D dR@l7?uф`ol 0VM$N|roZlvGhϖԄ1>ʜs F{>$v)sfB)X#9, :N" ^  TrF cG~#kua›b2@&`` `K. J>_mBrr]V(e@ !*T-YX#IӜhQN'9ki 1 FH2j(>.&3rn&dy?LџuMtK}&* û!M*#n<8wdžT$bE}FFU3gѦYߺat_߷ =s) Sry;Bw1$o2,Qy343> l+.XنiޛdTNz;XHQ=HKrv.и ^hB}$Iɟmd\47"[8Zr(8c5Y!\9a׸];"R`zR0u2.p^KЗ~O_|iEp!h[HD?ݍDžg<1A+ owFz _*\ɐ$_%=(܊ʄ5wovy>:ITgp?Gk[VCMX&&xA: |c$}~HgD~?sm3ZMyM*>/9k>4eQ>QаEw˅ `ϝ"[ȞȬqdeNF`SUpaPr$M47n4/=~+&9?XqD2|-䊢@  >P}uezl`+>~|2ÞyP#BXQޗe̿QMeR MYC-]y܊C$̂G ?J]JɶŻ9N&/mDq#IBph^-Q^P'b-J'`z~.r@2Z%߷&&溌N35nQq ǓP ˹,|ůYQ Ʉ`8%+3#_ACZ O-4!9LQ/|/ ~LVgz%c<@!~vބЙڎXmiR'"2/ \(q'ۂQagh~ {*9Ƙc? ʏb i3 =3=<iZrIsE56H|EN|'iLXpv>eOgy. ə1^!ZڲёaP&ܜ@Be*Hcx6yX13e.`-y kHWh Axf8;}X$sΘUsf5Pcj]$Ψ*d"6&󄤋K r+~=^xt3]D)vM~18J(*fjљeu-6 !o^ U RDSWrԞt"w*YuM#(0eV7;IiwM?Ț|v!D0X2^ndKW9Д턜x—%0_߆˘$}<4 F $zkvDӆvBm*6 +olU41DKYJ>,/K&|Ȫ7ސu15f~6 KV~5 \;N# BKE%t c&HC(fxOǀ}Uf{Bvzw/w=yl;pzUft͙*ªYө0Xߺ<# ƖG#{wŀR>8U|)n mF>H2/&)0&}ϝ܈|H+8uR_(x4egc4c'QtEl@dh _4ٱo CE_'7nT ؼ fGJFά__1 BS$n0Zf!Sne aދ ͣV% F01 >a O HWҎ(]e@uon(G=vFz e3m+6!~;LDx|/)9M=2~g>}c` ak\r֓e2(6`K4S8UG`g*`>!L"bC:CT6ဉ y#aFUS~`@2.=R<*sv:c)2DY6lL-M'*BgB. & .(_ T:C.)#/5T)}Ǽ9#d0錸1p/Eb ,}BrY_z3^Y9up5QzIOv_(bIz p.[! Uʚ9thJq]~5aaNPMl;G(䱏cDmkE)?f3'*5;Nsk>0'V =Q!D%OI:4BݞW^~侾PͿ?\G u.9wT4"ɠH%`qA5u@u^jVBӜeRGYv]T'1ƪU3:*,@aLpDD8Ժr^6ʌ7XڙyX.t8P Ii[tQ G2E,`܃ֱE^~@qtJ3HW`xɜ\Dwu͵؎caQԱ.d/ $ʻ,*ˆ9yцm. M*,\㼤 3v`bL7L @LoEIz6GɟDž KVsg9Sp׆ `渶5pɦ᧗`I-Dsܸ'$BZR7'R}A@΀0>!w tU*x!ږ ѕL m$MJ9CceJ':sfwLKr&Y; r6͞np:hF,GHFY;eR@!u]ɉr3jH'.\\>t{y ksh ƑGIeb³c*V PR.}ut';w N:lO&ʭ˗7AOC*ɨÖrZ֫d.|%d'Y)/Zw gm:#'?*|' &5?EO!/ 5{&>tO6}Ը_cy{ўc*=ˈ=>JuZtFL۞@WWG 5yToBJ)kcʰM#U\T^hznGDX*1&%݌pGUW_WG-]83Xڔ;3Oyw:߮zEO2|6I#bDo01BK^L[?y@'&^9# `4A.m{ׇzi8Qv_|8Ǽ%.S mCד')26\e CK%Ϛ&QXPVH~e@1}c$*rQ;s3ᤱ fʞ "*ѫɢGs01V c&z8 :ELbr>hf}wH,J#\x/=#g#޵b"gUPAgɐ1uYUc5r:6%;J`Uc( b&@I۶]ļ8lOLܴ ,)9QNkߒ8ɍ/q9O՜g=_Ơs蛗ȸ aܙ&MhA\Hem9aSu >h MrŶ. Ef3u l`A,]ܕGug|A0o(\ջ^)D-AP+Pe&b&uC\j0k(M*(HHcΗC⁾j"\ޝ@[F"ev".he:Rhqls}u<ك;"QQ^S[05qqb)gOu} Mp\&4=m2Njta|rm8-9Pr5 i3Fxx ArQiMJr\'};B S8p'}#ЮfrzPIb/*lo KCdcƍ!Q٭7yhgEC){8\?훩N7x=ȵ>bd >ǛEsPƘ]z/мs^YJS|9ȶdQ^Gܭ5zR !!ET4H5;uypPbfL\&sj+F@o}cJ \ XpSFU3\Wvj3$\9R yZpeF'; yUvnXi+ ,iށwlgtbCnB0\9LSTp"lFo"ifPysťvٸ]*=L@2lK,&Ђ0/ҫ*!L1m?/PgUwq{u 3ۗy (Û HeetY )Аp]eS,%)(BSugrDžsl:Oa!k :Hew4n+ku2+b+%^I6!^17u!pH0waV#LbDrƸ8|KL\~8&A1Rm8ⵖS0Tf@ . r hA&p! Yvܦ-a1 %ULrqB!-(}\DQ!DAc5+*SS& h+A+dLxS6SR I`3/63AXa/(b0: E42&L.L8taO#į-br|m6 h^$T3dM}3FNvk$NsI ;f@#blh}<_o2.E+,@iQCJ֊'FD}lpPXdOzv*|$8hͻeO7TNs*LGǝ/VAž;_il sKc1M~p~_qPَ5qG)Va+"C[ j<`ܳz@x|`"kdw [- jmlO+<'Ӕ<bPh'15iсW+rI,7 <ԓbT9bWV늚4sOZ(R y606ݐ9 3-U}<%KsAZvL _Pd6/>5~R#<Q`A'#" F{ax2:Hg"\(9p0!x^0k@ra+Y}Bԙ ]z=e/@Fc8`GG9bدnV 4.ܭh c k>5MslC2is$jV!FenO>K2Fĸ0>>Xb/Y@JX|o*4=Ix^2`F5K`HW:?~c{MG` y|>{~d3.|sԄ٢Rs~ŝCIUiA.Z:" ZK_rd%`}xx3Ā?uds;-"3kBgB.d1Z"@CqJ6dU΀YP:RrUل yd=I2HL[#K8^58ȱ`z82F d(-b1-X~chXJx fAΙnAZ qG`'>|q+FhXЈVH:_ b#͖+VV"Ö|l5| ʅ%b@((dD†wgN$/Pܱ 4|H=)p>17Ȑo4dO,&}4lB J4ʙvf>+R$hoaѱ,:(%c #LaRg[UҢ\!6^LHGI*lSwq3xxBIg5 #kcyhEYoċmj\2Ƽ!v4ë`RaF^kԔ;<0I+-Ѡ%IFtG-ʹQA=?)8aŠqArY 4Lj.8d2]:\b0dcP b 0JL9VXCcRY֜)9һy&6ުCF-P=9囸v `DBrn{m{; ʧݔTc5Q纁 @cfֲ9b;lm6γI'x$};{O>x|w\oSqN?ぇvmπk-~ոUߡEpFr( Ny4-(ކsccNʟ}=h3IW+P8@Č'H<e֓""b\R͠H3g_b(BC獼 *mnieKHO( ɇzH x)8T6b6ӌd93AB2.lYl`%fA~l[w[NC2/U[%H5Py\T͖Ýen.?G 0XK 8C!dѪ͐$"Bڠڬ4$LU&{$+t%kFƆNr$==LEyPEy\9z8wC-wSr7fw94! m; +}GhCMک+yAwdL?Nq*KMȳoNbȒ6Or:RNtuVH,I+CoX͖P& YC*/wG>scxL!d9nz!.3:?\HiMZ 85N[-L)t JEsXBTF|_$pxF.p3i;}Z1`̞h8чqK(cV* ;|&. ϳc) `RZKjvVV4 "&pn5a$\7P%HC>U:\ZW!t4@l]?YH7t=-"v,,PULbV9wthR(z62.$YX{9♿k[AJ>5օys6<3+ ` ~"0# [ZgTW#2#nFn4la^ ǁ~ke^87svD_G()\{ݛu* R +'`URű*Ա'Vl7 oL!koMMRd]\.1+`|l൝3n;хm!Tѳ@f1̓([ȇzƈ%GeИ1y~haCa-Tr ^Y#x:yv=*\,MBh_$LPˢ|jPЌP$j@d$:}^ ?WyŽ1XAV'db;zn\;q̾epK61͹ E'qXy_[c鍊h3?Y̆[Q3 bT+b5 i|y9'̥u}{&u7 Н|~"|sׇϷsouwsAT h F ?h8wڵ;șyJ9$7 Dyp%~Z|+Z[{O56eDb^hȒo }=ȱpHrVʄў^s-&HG:M}Xva$;L88`8ɕP?!!GnvlE6nDhEi]1Ov0۰}>W?̵mFn!ESX h@U~__@ిx_;1P׎yx ۷`̿q =~wcSun~Ϭ~_bjCavfJi=9ݽ1c;r?JqOLbH"²E"'7ݟLOȚ>|oZ8,+?j?jG& XF]@$٦&Pg ~nμg?__+O?.W~?VG3r_ ";vcQo|w~'UNϏ~ԧ_{vg3FAAO }>|}Oп?w:01q)#~|KY(&g):idHzie>)* %z>xÞsKGyM<8s⌣(2Ӛy7sa9y|ryXjfTjZRu:C5||'|'itSKtdT]$UFM?#܆w9s9zz^S)o3_+X<88q#_~O{ wn < ǀm]rl{cvz˟V s >ȄA50PW/:Rr .>4\F\mּS; `5l5nP@*` U kZA|GsyejX}wnud+>75=G0hj/P6iun@yP{Dww}/1UUy4K#[~bXD ?Di*'G=zk%='d$G5r!Q wuyIG ޲QtjJ}/OBMRbyUq6a8FxfR4lTä#Z'(iBML7c*1A 8.`ŽSs 9,lD))J$BI$"$JQLC++Ԥ2"L&˓Y&F1̏L,6@ *U!D5(M "%LH lHHMJ FGZCFDE"tD"P˖FJ;r -#Tr1]̭B[rAlf RH[j0ABD-Rew3*ca,"C\9m7  E8dEhdL$ME2XAL)PdD:B!Œ'"qbJS>ɼλۖP¡T!& D:8 "I3LKئ$($&/V{y5eگ^I `P)U" ŏDca0è $BE+b"c{XGYo};_Psb )D d+Æj(B"2 KVh0F-bdD ,pmX@%cxDiiZ"*xQ"bgNqMti%I`KE&=C)3,Zf! NCH+q"Yi7%Qdo1x-Ed0fEs*E0j}+(؏~xE։-Zid;,ɬ t0`d#@"T(BȎ8qD 9*hmF0C!&D@Y4T R2 baiȒ%P7l,6dk1[81Ud(0Y XR*d:MK8Սl!H2ej2Gh5$qa^Gǘ Aݕh ˁ6z +Xh#th,a`L kN7C 'j5 ÒC. O168 @$bmۤ)`!Ac$\m!jDY@R4܈鐉#"k̪P r@jAMXXYyE\Iu#R6Ɯ*-9 :d# 5m)ܘ~kQ 5khEd#amh=DAa:̅pQx"@͘DTEID16Az*ꬌFZX )#FB"Jm[&DYF%IPAXUF[*Dv E8ѕ f6I1 -1XchEF$ EI2ZJ5E6mLfP#mI8ChX(eE2BEedծƜɉ B夛,sxdI40܋@JYMS̓&ZDā />.}Oo.D ҂S,2$4e4)PFtu1YZ&Qؾ*֊Klo᷷e5A 8a,&ŞRČ3Dޥ3@Pƍa 8Q" u\O `XGD/3$:Jџ.^R=b/LG`BUCc $4Xcq$H&ko=uu˿WdνT W{꫾Oߑ?)yHP0VI 0LTbI4TY-1qzA5:f6me7¬mP#MhFX UV]I 6ޘf m12!%Ae9 \c +I@):o_DbGռ#^~ǯ;o?DD~҄?߈wOն/+k*rN!1F` [&QBŦ!&(RS isq*ʐGجOa "(CB}\~2"1k#u)|sktr n)-p0Is42QH4ml|jqR#Hn=u,"jmD}=~__QUbG'q ww~ZD<3ÅC[U?[AIRb1I !c@ C)XD12!& T&I)5&"&c,!B$0PDBb)$DJcc"BY&L )dDF$D CM(QFa"(ƈ&a(4Y)&fS%( )3 dfL ̛ Sc$)HAJTh $b2F&F!ДE ThCd(PF2ʔ4DB4&Hf dC*aE! fJ2RCIQ&RF@fM"J4"E&bcI"f)1DH 6DaLLbhcf$A`%M$R2?JogQߧׯhlL֋)UMĂ3*N+LJoeZ7/hXX5ޓpR4ɸ3ȶދ )> ?￈W)wS&䮄e2V!jbRK!{;sԈ/OV!uT.M]ghg& ˻Ba-]9-Vb^],:a] ]£gƌb&HV6NalQVIEzvvGF]ȏdӵ*9raZ.i+eԘ eΉ2IkvJgDV#6#f3nL[ :6sJ،4 [ J FȎnɑYnӆeeӮd(Sn%6O*FnGjNgu9˩^yg'vʹuڰmlA ԣ۔'lm1;:wlCA4ʘ[bt]iaCQ9$dPЛltilbjrquOgݙ4f+[l WALY!0yuɘVH3в hبu:;a [Nvi&lgLTܩ5B+mQ0j2+0;<^*RVo_kQ65ۺ۱\6Źv]ڷ(būuom~! WC&wccp1EN aطW.;'褅E!%EP*pޫmMmX|ҋa`;kEyZRQ\4ZUomkTSbVT})32VտD~gwkIlhFYuÝ4bI *=Qr"" 4T̀j:E W;fϝz,sW-l"##$(,c&rnsEF4b'vl579ݍFW}:(mj6)%lDh4-ŽݬLrlk3Ct^{YSμ[b_Nޕ|s5E-n-˕k9Yw\\׺*6ݩ/+ؤj 5EIcDQ\phW7Q̓]ݣEF4bMFэpnQ$Ѯܫ>usT[E[slDhF5V1+֊ەۥEEm$MyE^k[rQ^ksR[NUo+տv_~ìZ_-rE7-jT5x9>㾋ʥ4nzkj[q{g*9 ,b1dr"wr29;,(C$:wT=ۘ9nDbyyQQwd6  OґQEZ屍1sܹ/7u#o,ך6/5Rnj[%b77{=\dʪQW5[s\s%wk[Mbۗ{-1sͼEyʔܻgv1rjE\1l֊nnG9\.scE611DUW5v65DZW1Eъ6"MAF,mr[V1Tlc^EyےjKbZ 5k l\պQo60ZAklUEDFbرhŌblkAAfrѶ6)-bJjsF-sj6kr5ycn[n\65b*mQ E@)N"%U%%!@lYv5w_5m}Cqk};lKBbL L`osWyMis."6ڊw[WC 4h5V\4TZ5jPF T4&Ma1sNvx`#y1F#Yr5IQFە(*-FE amAMb4R[ckbys\h؍c+5yHQ*6-湴sW6]+(^\ںF4yZ**(ʍDmE/5 X*k1E1syQa5ͮ"nQsmFѴFܷfj|m!X=nY"X$s\[E|U*cTP[GhVy+UF cEhTc&j5h.[Z5nkp65Our6ѺTEj65ccXV6-c[3yh@#NFo Q2H4/Z]ml}߾r*1}yENrlo:uWqw Fs]: ^P;z;]!^Bky=NCπY*r&hJ5 -A@>@"J{S" k<&duV}jyI6UMU^sax/xGkrVrVWm<>FE)d+"$ (2d- EmQիr'`p5`ΥTo|m?xeZbNHT!GYHw@w%& 3Z6'5ڂ❐k 73+~ uF:B rprՠqe+6 f+ڌGm$23 5w7xO+jҳd0Cx!@a@`)0gJK)0rɌ`Ύ#[u Tb?fK~u"ͮ/ڥq@qy|hԩJ$}#Ks֢y0 kŠ@/Ŷ!Ӱ+D*wwy"=+}mE??Ex,$gӅQ )Q?ы"HgE)ɡ>׾W{メh(H BQTRX($"CcP$Tјd"JI(B)@̂#IRa $f)PIA fI`H"[$lP %! d1HXdJ` l@ĠI4XؠB($fō4D`$JP$a&I0#Jhb1&FɈM@RJ1#DV2[I #$JI!DF2&M!@ARbABB hcILh؆FЦ%,IfEL23&dل"4dY#J%$c KI"PZXd! 3Je D$"d4fcM& hBA0Hd@624"%#1$213 e&i$i$EI 3A(Pa4Q&ơcCBdCii0&SI"  FLL$I(3dTc$HJ I46B("E$$"b`!R DD`mhQu=`2C0ؼ>cjH("N72Ae ȒY2 DFm31 kPfWNmŷ6.m_b(t g@C4J/Hƍ׸صU&Ƭ%JOu~zpO<|fΊ*5>%$& ") le!#I $cBģ04*3Cf04K M"b()Ff jHE H(Q"i d"# 2L4$b$H1d%!I0,iKXM)L؀Ba2"!!Ac3"!% P0 1HDM 0ƐBHb$iCBRAQ44E!CILIAƙR(")%Fl,`d"c J #$R3)2P0ɀI)!f,D2|>vR~xr9vHhqrLdь]y"'s]/BRXI-ŋ(EI#UŢ!-`5 lc F)F5Cc0lHcEF(1Q0AIƠűkj؍(cRZJDA4BE*@M UTX",m`Ţ5 IA &"$RɱdرA#A&5660h2U*1hI1ccfm4(DdhA }#g<$>wy0pI E"m)c6Mbi,XTQQJ61VAEh(EA4,bMd6lm0BIb(e{0PzճiC `M2`4$3 BI`a`F2J@ !R1 4F*$!2LBXэ%%)#Ba1%10(#"j0hi"fXFQ&&dXѱF4M0#2$MA`5) J),M4A&J"($,fI1M%bcͲws |ƴI"Xb1h6FMMɭZ+/|]3t>㻸$x""S:CҐA'1'Ʌ)21k ̫/v=4i@;)=BFL#(JBf$Q`oؙp`wE"Kx<`>E#QjCRmJԤ*jT5"Zеmj)mjTj)l6Ԛs٩Ѫ(wmeoJM=ȷʜM[\iox!& hJvute[ QMnj! ni[~[§3MM· um벦6/q//6<&vȟ-qᜭrUӐ9,גxu)ܻpP-P4h.h@Zh Z-ޅQqԗ%(hJ\!% a46Kj{9gr^Nೖvgoً1f8[)}|2K+e,r!R*G\3g0/3 L~ܝo|~v +|j]荑1{'ܽ> I_t >H13|~'pq}tNwL3 ,]u*{rHGL8T}VsuUF<Ón *Q)zxX{Kܡɵ’(a{mqə8q-$Gr)+;ѵyW.mb*u <3}-/ Cy4M"c2h%3l,/Fc`&zvo#VO׭D|*| y;C'?^}W,_䖼w?Noˏ~/҇j?>TRxQCٯ&޳o` g=ڎtl{)pyd5ng \_mO<3ܼqku^x^xL; wٕ t|}}y̚_Y3kcjϵy'Y({HɅ_?<;y¦՝jnV{ݱP[j~||j;'YXce_"# 9d{e崎xAĨy;<^\“ݑ[1q6A˖W7E,!jJN6v+fV) vȏ'w{voxW6{ѫ_WwvOA}=6u{Ͳ~E|2~ N}H/^OO{c{±>RzS.曛 I&ٕ}h-`0Yc^]|~P2y{{"8'gvd Ihƴ&YΒg]c^nZ/;%Ixjۗ82"ߞFrDte='=@-x듖dUS'kkx 9>WŶ(cA РJhA;l'fiMîv>9Īy-pOy=QCԻS{nUy=!{k+ö({ւ+Wd^ɳ#cvoGy:I~o@볐k !D*m^S gh^K^sg`*l m=ry=wwWpurحs[kXڶ᣽cv<+ | {xX+WC{9rHu]rxiJF'q=3~䷈u~xVw>ޝCXi5{M|U|[yTo6-5ʴgV:oz;4U'yc;LIL:i#?={~8;e;gƏ5рrz9LyO:[2hs3l7ms.vDzy,™hqɓ*+o5r)ʏ+3xOL*nYV-vx3Iu²c\}KN[Ev@m6/E"&֡C5h=8shc+&,+,m&F,6-5i L^Iq=~+{c(kYf{GPO~c?%_Y˴Ovg!ɟ|3vxظ:N9 KR*w'" CRÉg{'8S镫țGIGvLhw\@=y@~q+^qdmrA$MeZ 08\ AlSzp Aщ[C+h*d얯m|K[y]&փ5&=Ǡ?IomMޯ6= yx((y\q:{{&?U絓R&]cW]re=-Idf p.?={==?^&NɐI=2/v@z{^[gD󈫞8ڔٿ=^M'vL~'/*~{iGUtHC"=.ZG(^>O,=$*ߧ‡toݿWq漯}V:Ʒ׻y}~a,F7s\\v_6$QEr*m[""fÜ@ 'u ҰVݞ^6^ \Vڽݶ"rϳ zGzktc-ʹ`_sx\9]dۣ͵|k|m[w%-4 / @*trU|V7k3O(a3e]gJ“L]y]&N (u< B2g2Cݜyl[,Hg&dg]~{?2bIS --FnF.a RWkyEgzeRbY^YjE-IQY.yU&zAIY<)$V<,9x;QʧOj{n' -ܫMmr6*9^Ffͬm\1uUQh75VmjթXdq͍wOㅼ:&dFdJ%bۍ3;:ԙ+i}U><_մFo/o^}$3o>>W'ݶR(p*N9,mvf&MEXyLCmpMm^\\]4\Qz=^RC  BExByQ=()څudll*M:[m9 9cn!V۱%ʖ)Fl5z`KeIŊra6RW糨sj"$yd2Af-kk94ٲӰڽ%`{jJLC6L )a%'ʣEt,r1j-\*sn[>vU:ȇ a4űW[5vRvp"Q4mII͢цɤs ڵU]щ»N>Sy.smJ{9v2L{Qt6LreWH4L"#QD$"F&G$& )ű!D1;\Xteuk{;HKlBf5zZxSP8Ha&\S;\ͷ=˗FGDȤZm͍OU= Im B. Ҽ20&g޽*\| FĦ;,UA&pȏ*ls9&.2u,mlZ%\)&@9C\ zfW] j]D5b湹y3ζmVڪ-m5{5q mܼU)mG(D̫={{Bʸ2Ҏv&ƍJ`B:B"'Na P.TY3H wdxQ4#7<(u܊hM̎˴{sQ޹͹`ַ8sqXK &֊38qgRC<ggDEi6M%(&(FU@A/u( r58'*v/9*?zU*"ƔM+ooݥ]֏pB;v44 0X0|NGɦPKg(WCg]Meo[RMx9ǒ,{7ͻurRAjkc9=*{,H><7=j]z?gu Iq?Dx[,YuTa, Mv_~y 1HR7Zs☺QW [ECd-LY%)*/G +[ 'R1Q`R?ƿhՍt$O5RLL>sȎ| a}RMM'G'\;wǽeIлitSuA<*7Pgfkw靮l>d,yA{շώ %:2ɨ^K]$Ѭ苩FK~\{DFx2t ^{^d<({@)U +Np2)fe+ϯ<x 8L"w aT ~{{K/ N2p:(\I8S$&Huw8ۖgmUܤs8O+N3@_Gxpx}^=g:Ƞg&[;/k:$P*6oE=bߛNeU{쉚n̫BيU2SVĩkeQyL-4R9\M+<.r m|Y^/7{d"WnkP2~r'<^V1lEѴh,lFdE5b5&XEX۽[ZZvs mHv ƙZna{=ěvOogIاZ#QZnŭ{d;~Gg^>A;~\>N??O-N],ajщ8/=߹=ٹtcXSs xlblcj$^:Nx<{$<նXu/x-v9K b1a;@ͬiR7FFRzrEJ=쉬K{&y\[[Nz|eWoWe[gHLlKF5nʵsԧcRKcB?+,jSfc{i7UO!2Kv{H o\&i2Tɽ? >ҙ};HX| 85pHxP-q6ט5-Mͷ{wW¢KjmY+᫕BFl/H²]u ^V?={(O qɵ9Kx}חhR)wEݒki\;h/F'ا0&`ɇ'~/~{XwO!P0ݹ #I$!D!qtlNVw9d&56kKeP+ Y 7[_@^x:]ϊ0&?m&XB\DDtZ=`[D#R(l"DR HE=P 6,iU">"c rF$ȆڠyXt?`b`&$~my@UyJ|oW"m.Roy֑ƈ̖ _mVئDۏ 毷=ke>} >`qj5rr'&ܹSNZw6 e;;`EX[,,o0Ǿ[nF(WvhE1UJUWU=ytglw~7 !E6:l_]QEF`E& (~/uW~~|n @M(({_,>$ _ܙEwA ˱.<4=Xa72w_mRU$͂oXyD ~' `*!E괠W+(WH~M~ahw1qA$aaf*?C4D!0}ņ KR<2i.~8C 0[kl~\r1ݗQwD#(P؆ LI@ 8!-! 1 ~>LC+ػ rȠ_$N~0AaFMeeO6F_N?i ̍8Aßn 6 g{2_>ۈ (E&Ǹ?_ ?ǠiC/5J:@270?Jse֠U"/rvRDD#se0 %e2Kq!v~'Z I^@D`Bֳ674 6A$"QR*Pӱ~rҏw!~[E:i<^ @1T T T Wl`c,9a埾? aRN8fcĿhD"`Y d>D{j0)cn۶Fȳb~lU c`4B Ȥ&$b 22l ,H@d#%,jHƉэ2d"4ɔ#!IHSDL$"$¤`1L1"b$&I!HE2h$4Qe4V Ij0,ĤPLٔRAdiɈ1E!RHAH2 K$h2QEF)1a,j3CFYMje"Ibd2aM6FDR0 d2 43 dB`a$M2Mc0 bHa" & *(4L$4TA !#"bL̢HI(H!4BX̂D1`&RKRĂ&L$E-FC І Lf Bhi1hHF2ƔPM#DJ ,R‚CDT%2$%1b)0e B I1PT0HH3$ fi$C4`fHfh$,DLDd P`$)!PS2A DPfHhS#IH%B &1R@20KM$d10LƓ3M4"I)P)Q)L b c"B%(!Ldd"A$ђ$P 40ȠeH 3 ҘH hHĤc,hbBb"46c33B3,TH4HIX!H"hf,3(A)D*I4i ` l!20ј fli!HY1b&&E!A@Đ%%TѢɴEF,2""4&L!نRLҒA`Ɂ@Ƌ& B()I 1"D  !d#eI)0VD&,cdDS$0MSmkojj ة~qPΑ1!h9(1QfLbT'3=$S_w?yBiv״mIv3ؓ{y Xb^y$z|/@MDOO*"՞ۻWe3:#y!™E*]b<8;PP֢UFڋEcZkQk&Flw/ .-iǀuUvNro~>W~5 jL% 63NnS f}bgӛn^EgQFlw:ZbUy˰R=GO;qϓO]PmW#ْ&F$!XIs䇹_UɞRIy3ۿW!iv] ?ԉu 5m"fm݈hNˣ ULS%_n=EuI1{Rm6ֵ)&*DTxuR@kJih.eTRE'Gp>M!'w\Ȥ NGIG11F08]%S+[hx Sav{ud4N<,ϡ T_TQRX{ix3Jl6µC*PnGsU2;-Vp7G/8J| Pab~{(Iy#˶l-w0d<8yeY=~Gك!@0@>ě_l@t]tZH(@0>aBlFIݿx_ W7b ߑ,kz-~Q7$]&YMtΆEMmhq8< ֜IotaSRv5/1zs^ъq;OY*ɫ $_]s#e#b8g: &b8OU5IMyfˆ3[IetR}:]ț'tP_Sf{i)oj# i } zr¤=_XaĞ:5P6 ]C%mZЕc)b85~#-cEtý4$}~Ö-$:I a%P.>P?DCujTͿ26Uv*7 -h+c&&ŗ'#G= (k.BHa(Op<МVa mNmFZkl ׅ JL26Vc!PֻvsCR @| iZp=l<`l|ź规Krhkf<~ؙA}sN  6+ +6wҴڙZ,L* b-U13@H📶zOZ]6JJ7'8loY΀N籫rļ 2eYOqqJu:$|Gi{gukA>.9uI8~]+_(IzW6ȻTBM.TQOc7ϵ~U+Uiim{89X`ƓDN=%%һ(tLb,_S߿n)%I2mİ\ސ&íSa-bk޹#㸱t/THC MSZB{>E*ծgi;8>Je&ЅЁq ~)w,􇙛T@ @ʇ[I8w4uM2V0PMv"قj~bv҆U̜CuB=eEfK=N^7ȿ<#>ou7\I9vG(Q ]s LA0V /:$3U}h4Y?Q0[ӉB9gFO՜Z n㗧<hBQ舓cm:NaxaDl "U&ot uaew[A=LU'}KRPkVf|Es}g Kd+׊3|]/o@0h{eرM)!}O؛ xd:. wCYuJLT[cά>|Tyʷr%v/?0_}x |w %P/NpP`iL _4 ˺A JA;]<;4MҪ9q(/c;b}Մ;R)8KO:.Ld QesR(gjY-~bL7NSG<2X:Cꫥ^,YH%XTq 4~ ED\XnlBtW>v[=Wmq> ["H3> /rZ+hSӺR&zHfO#ſd6ɰ!т"zn@~)o8ld79;f_s@ y[N(N]g, _ODQlo-,*҉b׊ ըlo=HxY!~xeqխ<.ލg<|կ"s{q~ab!f)kT2  ت.\DBxZOg.e Q\ -J{[Xo r0!Җ>?qNGpiL+=7Q1fɞˇqYL(BN%N3eZh/rܐ>΢Y@.G6C:xx= r'Jʅt¹6S+May;TG~]W޼|qy~r F,a{u:U.u&GXv9BX%trUϙ:Mzq8(PeNفCɇ N_ 5Ӷ^PϜt*A; F28gY mÊu4 \SZvIٔ t+c-2T4W|ƋMyG`L&^oTWqJ=Zִ?~y-aPB l(Qd"<[n-))$ 99͋)3, iqQL4X3ꜳPfh̤L[78yOxRim[ACY-Hi*!@ӌEZA$myJrgVr, 12EhV%(6fvhp/=m|SķI,{>Kmr-*|1ѭ%IJREf;XةI)>O6P۞Ԃ2Є0Du/X]%/FGA>1߅ sɮN7l²Ld v+ٮp, tFpDIurLPDˣ'цPW5V= | (‚$`(|t/8bNDS LS 5ĤU*KͅAʼnASDm?ipN&D=r4X3p\[%0! :HlBt$XdőEĂlx >uʾ:4f" |mgO95=Wran\cj~ň/}>2$&#:.V$k/28uPC31 Ugtp̽mT<[蔾|%wo1em ʌ K$L|͎ņm'ճ0 c飐x>|ofH$`"h@+b=u'GHըS㧄CCHJ9cwMplg)b>:=?@?{@(t4aȐBBLt={Ԫ@Р;-QBT.&3k @n 9PkuPͪ PmTnvj$VCz;C_A>xft{천i]ׇ7umDŵwmPP;]mԠRZXlZ:^Ǐ),:)uĞiKO']@QA]ZSm{O,p@VsvB;jmx8 8ケ.}}|uӢv)y{(pv;ݹR/0t]x\9Qkf\ohw7v^㮺&ڲ.u[ކ:u{aHuϻ*ng6RRJTH*R(*@BJU秽;:닠3yѽN̤H@(-)'2m UJ KjmhRUU)RL (@>*kh @oI]PP9_Nvj@^QO@(CZ P@PPH=2<} h 4)@ w9x_@CNt(DjmvjY8EYe.]VV:8Gp>(TI@@@P*w޾!T6 CJ4=jlі( }mrN݀znwGG>Ѻvm7ll(0@ @ "z@C։WJq@(hw65w5uQ3(NqWogs >A _fqP-.h۶kn!_xހ5Cwh[l]x?4|֪4dᡙvw^&m6i6 G|1F^;3=턴M@!)JvH=ۤp{w`t[5ҧ~xqO[}-t˷,B&.yP=>̳HDL ˱=EP^=3S{VdQrŭ$b$F B6p$_^s|1Ӟ{m}YŠaSCJm($ÇK1-hL}󬰁:|وB|%PeV09>ix5x,/uzs$W{M߿_Dj' w#,OXxN[+,[.ckk5w5&\K 1w<'YFI:ὥ=?6! xi0 " !)  ] aMCzf*%{RL.YG go߿}~Y֪ǒ9i щ ;OIM9&;~,O¾S[cz  1%3yWYt%Ow3N?:JP|?Hx9lK>K s_Rx@/[&۫g̾;){ ؚIK \Tn,.Y{Ӷ(Bv,!cyЇotYN`޶YO%M )6qv =kq/v]^^;ގ{;,I۸BwzBx5{xݮ݉kՕl޽ q}g{&8Ce޾LJqޖfа:cy|f%^F^=鎾֑挶zd%Ԥ1iު22[ucX0%&u>}o^}9O,}o%e&Їrڝ9 N)-^J:;mnǦ'm#硯yO{x v;) zwF#;6KkFUa$C) :[fݎ'pn.cOx{Uݥ׬lE#čĨe`f7-`n6JxcIp3*,,%v,+bpS*LJ,{xu㬺Y[쟗HٯhrϜJ^Wƞ;qnhI n8!/[+'{o{6'+|[VXnV=juOYvw}(]-_[oO{/l/f9iˠT{헶ta{pr_>!gL/9;{yg`iIiĥtuY.E{wO=4ƾ|2w0[7o9W[06Ç];/a{go<Ӟ{SZo|SRM};HYJ{xz;}轭8I̽)Kbg{,ݘHPsW{5Uݽ6Nɀ2 x{7Et=ɷ']޽ݰw}]|K{>ez}m1'Ypvz21t^Gzݡ;=wc^[gf/61!=m@u=&K?#i~|AIQZkf:p.:w-蕾$CrCrl":XqԝE ;җ:N'|;uH{׷WXj'I ='^;KbR-{y_v-ļ:r&0喻MJO_{Lν/./Zyޱfcyt8JEyfXl;P{^tyZ/|[ٖkokȧݔ_ E ĺ|gWuB[gFwI7ҧz[Mt^rg ΔVENԇ{{`ޒuXݰ9{C|=)v;Q%dN:V))盻k:b:wwv[}wx]zN/g͙}>}<$znYu7{33i !;{NVu/^imIR淋<=:๏kޖjLeVbTXn{yL]Rýij^uk'i6ee؏myPO] C{qvt}vv;;{tt͍޲Yʞ) ΩzG{Rt{i{7mzwP6jw ӶI}31yח{^zWK%:[Uоcݳvc-v=yjgN3i}oI^=x_wbuw6@aN9A/fzs};{n=6c{*v[vsݯ^;bPnc;]BC{V\]ęD GpK-{t7֒]y#3RQ 5CKήIqP:x3IG\%4',;{,XBޙdm:NݛRq0%o7]-Ovxy>-nG;n=>'a'IӆX{tE;=ow6=v=׾{=ۊq iJ`KޱK:YVSv zgmܝ{x C/iz;zGz˲Tb>ڝe%yt hy]4(7LsUJ0->n%]{4IӚf麋;@͕{],ӽBe]'B0wk vKbl'}ݎnS{bv{o::$]g.{ma|lB<7jqn1~Ԅ[~Ӳ|>8MkCRRf*K}nywwKz,'{L1hxhbQcs8'H;yHs\>5ĄWEJzpȉ$xDyx+%!v8fٛwgzOu@9I>|챽zۧ紤 f||@n]{\]~)9G7\$(LT!@v禅uӌ8AG,R(P/ߝ7t&< _zwLI_&9㗲x1'~_8t~wTᄍPr7BQ>}sĽ)~I|ί<$N[϶œ)`Jو{3Sڇ?mڶߺJF3KƑ$SBI{V/z^dzI/oYc2ʌoϟ'жP)Wk?=Fʩm|;+v Pgyp4ChѨ'/1UN1ye(]K7k|agIt3K4e\w[ov)/[1{}"޺)@.u{~̔ B KMHRR(T +LgKg(x|`?=>m#A?\kK|<ߟ'Xo{?{>tᯋ#c z!}l^!-g{`]wNHdrLCH܆1wvS0 Hz0רyWOX5Pb`"^]\5ʓz| IE N!FIBI 7iOjmSw,}7? +Ir( )S<Ծ+~/wrs_>me8IT(Yik:{g睧P=])y{^"!ǽfa=TXɾu #l%$tΟ%k>#\YJXaD9x߇x$}ilҠ^DU)yIHT9)@Od sĞ"{ב*%fl!޲h}>$x Ml9ߺw],ߕv|Eߗ|Mw|g^o%iwJ"*TA3L(B\B^x"I=-m~ft:F/uz.!mS[}YXC-)R3e&Ĝǐ_X B9.!Y=&.A@Pw!7,5ݙlyRW"phO\s>Io%'ÔLI}IjvSNy|>T\ӽH"OSjӎo)| )=z[>~ 'JIטu훲u|@7~v! t`NK0B " c47II@|>v@sO8s ++ ^,/J^X2\42g@!L/&!c`z&O3öC{N.}1&&$sk&$9"q9Dǎnڣ`p˯X'p#) !˭^9Z=y̓_BR=9<ܞ-_[W;P'vt>Nr.?~mN#(( u(eAN^e: riDJ%( "QJ&G, V6N/_{=o~7E~1+3y^߃`E蘔STc|yIo̳!/&r!K"*BP7Wwpz t)(=!&DR&L) Z Z||)62 7VܵdĉEmA%MR{0h"O~urcPĩ/IS$E;D]ӰeY6UϞ?4ef=9H (k"JJْ. Fn6nWza?=\*J12LqZ'nW dTu6Ϊ-1 "n5Uh.r"^("KDЅgF 0u) $-+hgli!*Dk$jJ3!nQ˻1X0JKYg$jzklUV%R(\%2"W!MkD!b5v .67LLBEXN]HJUS2+X^ɪCkr4/B*uNZO\CIj$.6EFAja#urdW\F(kf4eB3܌'"ƍg*HٻufSSsx@cْ5sN:wkXZFP6"[ن]3`h ? XX< |Ҩ:s{xDyYknQv6eiˬ4;ߋa,JD&(N:T|XܩtAOkY`F -szfteA4Bz:9"l;-"Eݻt=:k)v8` 40e90-M4CI ';8e'I/Bלtg{j]ӫ'owY2T;/t{%;{m{Qf=[x7n*{5 (ZF -){4\ jrVfM,)EkvnZ[LtG/ߟ}R|*3%d_Yݒl{a"kc̏GYmҦ9Y` `{{x_Vg\޻ե5UQvRth`QLe,M ֓"9"ɑ&\I3M=w;\(^Oj|%;ѹ#ʣ^:LIN9\N:6)\iͣxLjR̷]i\x8a0<^N0NZz@,^6ggoaΒ{[k֔;O;O4을:)gxyaλh|s٧K'ݸRӔӽa |j;RGԪI ԡ0Cb@&)҉j0Lg]6@HSQ==<=9}>9k,g{sΝ陴ӶbY(roj-kv_b7`_iXDz_1̪IT:ٵQYIu<= V]-t&8pշd̂|W1!,J4fQ(2)H0Ɛ0`DQbS$0 !C3 L"JD&0`2&!jII !C%#i(I "LJ1L$DF"e2F" 3Qb`EF!$ A1`()20J (&Ibe!&a1* iIbB2 "f1ifih"ƈ*-kz5HfC9΋{71]+VӢh€lQpc6*ܖܥ<22/iEM[@șۺu\D [K%QpW DH.I#@nAL PZ 50Ȫ+MTNK=<ĂM QF [P۩U7#mǐںur(NL0> auFpq $SQ"tIwEuko(9"tv*1WgJP=ȈrgY Dy/񨈨v6]u3m^CLZb1&ыhQLk#("ƤLF$j6#P%hAQF$*0Ic6ƓhŨRQ&MEʈbmmѴRQh2QQ1cd̒JF:G/9؜^f6;{ /=$cn*#FyP^RBC:C>VMI)5SWAf֑9],1"p9&WmDp\|S{: p6uqěMh/xC_$1{û &0y<-tu m@MFرƤ(Ѩ"Aٔ`F2A*f(LD5(beC1%`^=#Q[k\r FѤYQЙ"lR:M9 8ۭdJFH1̌2!B)# % R)D @$Y"2Lcc@1fHQ )DhŊ # 6(4 dd@,0JI4DD6Ri"F$Q &A$()0w&;dUMd Er- $p· .™L(rAM[st6z$b4Q0H D"P3jCZbZL&Ef9pl Aժ*DIf-bAq:v' eѽ[j\4Iok%*AШtrR%(Qhԓ-4"%,JġH J*RU!QZL?U@.Rץj+F,hEB8*B@(* _j޶)`K%"2"DB[2Tb(!MiDX@XF"ѵcj(Ri$`ړF ʼn-H @HbIdmIXXƂ("EdEF-ԛcd1DlQAh*Jō,TiIh4EF3#,FLh(`Ԇ1EMѬ(MQb,iK!FC(maQQ$H@AAP P B (" V-Z6ڠ55EAXi6VmT[cZXhlmhPIHҴ#H4(TPlb1mzڶכWM$f6dkEkdFĊQجmFX2Z6VMBIlPF6mWBcQQmc"H[jk颓h(6HM1X#IRV1)(d&ƣbhѭmRdZ6ZimK%Z56*(6eF+F-`ƴbh@ŋaeA-Bd5ll25QRh!(FBDQH)DECamii&IFQEWT#3Z Nm;9DEQXչ;+r (宦#X(Da# ƒw:RJBp :T(Ɉr%ʇ$Hp*UˤF*2T9ERP4JV'lG% $wV1wL4cks])5ck9mHkZ)5DF,Z5Wy[Ξ ID$һIZt$. sX&TÇ :a+kΈYWC LQve)4s9VLES$"FΘ(wv\faET" {A? cb^H{O|43NTFr(JbM#qru9<}`a{s[ddԯ$HrQNrlry?J4<&J,{i\BUD'31 >[NE:jE ߺD?`$PS>ٗn{*aD}5DSbl%\ެ3{Jg JJ}˕UTט$Z(yX/<)kuSLJj(l̯ͮ}6*Zk7h[fIkyzst`HmS{3/˾eC'' y 8C~3 S 5 ĩ'y ')mǞBA뉎z"/v2=zRP8#͝^Ѳ0[JlgZ8;c Um9'CYb)ؐ# ƁۋS u2Y60-Itorڽuō+BM {a,Sҕ>0řnޛCh Cfnٗ(-UwpQ}ulWم+k__&_1bJ8,` S34KNX2YXUmQo+͘2hPjnc%t\!@יO&h+/]/ ̗%֔sm՚7eԅ&Ě5De"T/bv xN]@)SLl JNfYHǪ5# D$$;&7TgVyIQg=ŷ5!'jWTXSM"O{K yD[)ȍ9+KB^KIuĐo(#f7}t+a2EiOMo:q((9FB'c99I3V2ge]VJ?#?)Ȅ!m&UKJH1Y~/d-V(MfgX^( D]kjU\童E]PDFP),R@`8nu`KeHL5v@=ꍕGꛮvkT"YDiԘ\"ߖtz*BwsFkI[a ܶd ;"Pl +BxrEZQG䢔KQC󅛥y.28JcҊa5dH6=s•$[[u~&Ièo]5EHuD35=0 veF!NB*Z)ͱ,$ b/( -L뢳B46R#6WrYeRP*H6̸щ8IMU^֠¤$^SD呄̫Wzy6䮽?-p6KƑ' xQzm6C)/wX(Aox|2I3BRHkl Ea)!~ƯJ#)BA:N6n׋~ks$x\Ǵ52$]k6&aSҩK1x Y x.uE9&+d6Aľ,a-Y猯/BF"6ًݲw'{:9rO%%ǒE HNP>T^Đ9q%FRMu%E7y9ar$o&6(Z0l5HC!Њ/ݾ(rcaJ 9RpR4 (SHIr6mM"rw.nBy6N9y3p/FLrvy3+#ݪ'B1$%at02{{7dv{R tV<ɓ0pd({DwWLo஗8ֺ=E!)Iē֡ȋ&ǜ_]N6JQ(BwiBv37,''?s07^Fo\P7#LZ{Tr܇ I; BNU@ԢH<oŗpȢ-N ()}||\fC;yZ:Sisē[y睯{PrP.H5~'?`y >̀9ABREd>wP*{M&ƝY`xNL3`>`NM4X)% Odw3B+.9ԐJ!US*2OoZ:N|Ν8!]i)ւvt` I9/f>r (zUTb;ecUux37D>x'/m6H兴m[eAtj$8ϬgEB VԶcb&I/*I*bY֍$ZJ, %Ur̋;8 A JS/kV[P5ani4Ԩ"lw)0GzX|hꥳUik&}sx~|ˠ8~EUJceǴJb@%1L+rS&yV&jM!-mCN0hehxK,,-tr~AjjjUmE->aTi#L7'qS$ܲ,۷lhTMlyi;o1 ,D˷N"¦eJ6) M9l#.=+;'OzRZ=vx5mssw|R- ^+Qp,mӕ)h't;X|y߭e/!Z~]5rضyջZcqleڢv?C&ɐ @aaB/  !d[ReHPR/$2ZG$xG!(JH9B G`>9e幁N*d!j=|駆H_zv0*)@9 R>h~nO>geS2dajͦOh^BkIkq1hc:DT\$0} 򢛼KŌjoFPOG:瘵eFc1o-=$R'yϋP\G{|^rzP{a&-7xG-SC 혜+OV>ud6C*J@޴ Zձ9c/:z޽FA(kMRki>rcycCC<X>=./)%gV.V4MN }K(N}C/Dyy$>7ԷG<2_';&QVEP\L%'Ls}E/d|LhueADNP!5+ɩϓ1"M:vAvKz] ECN }_P6 yo&`\үsrW5T#ANJPdS;.U*d>3 )&@R;;6l͖֙Y|o6w$F ǏYYp465+Y-18Wk@fdeaBa0.i^glzO{x"cZ议w ,}{ s˺ /wtP`]vR(4ֵs*mFc/ϓ9zdiR@؃; !Lο{]Z377o6ى4lC6UΒr0H𹟉1-I7]KlxV݂*iƸ.s.0 ^eqy쯸 {]ɓ|zu@w xr ]O0,CeC9Gݲ+*R#{9l!e9 HeROC$#ԉ;M N |B~a*ܶ[H uY%~fu-j'3d?҂MTo yJс=2DoWD-W_*ub!.9*Vų&owiH[xZ͈b&L6˙^yuBnv<$ɝYV<&OZm {JcAh@DV([k䅳G[YGcWa[@'&%IivbJ2FYe hNIY֜2[lXwxRF-Y" d6،%ϴY z#5z'toxŶ[mP&JNʽKIҼ Z@G&)JaW ݱyK] MY*iÉF8BNt#`xK}hJ%Q'vkWh2NiR lNvI+ɩlKH6n8S*ܺaVIBhM0^K7JZ7|򐷉@ K`Y˨wJQ$ǝ;i ';!fg(B)ovQs=X2NO_4 zJz&/&4N0pm?Z֓FTh@Qa rܲ9˯"L&S1BcCFT]-jG) hpԀYX[· n+1bY؄ލ=7!y5y:GʌS)ק” MBv~Im']UED ",B9o Qb3(آJS, {rI k*6drʨc,Q &Sr!naP^AAJu;+f[PAP9@ƇɎC  (vP y*d%*Ёf7Zimg"ЅrDZ:Zt@iW /ks˭msY%fG3/fyE;Q $rCkIRwtoO"Ċk#0EΧ̍ &j8Kpcmlvt$i&s(O/k'pR v~sJP-1 'lupɳ li\CYSPHOd<_z;煓j%7 )ʁ>{C]z}׿-xۡ=&1.ۥ1h SJN 7'N]RpNЁmA!n9hd 0^pIC[ʁ9I]) !@lԧ$A: S$ S$s0Pd lТSJ JR ; Bd @P" @" \<'9 9M9l . W$C*%R:QU(\v G!jD 2QQ@]1ϓr)ؓ|Bz2v:DiDBhPqzQJ T3("a%!EsI.I nJ60h,r`9[16CBH B9!@䁐Pء2l`Jؠ6 ٰ2@Ph 0'OyU9;ZI[%L4\Y>њm{dXL٦J3w#^W7'jC![pOd$&ܺT8?R;uq(LQiNy "Q=t՜3], ysq!.ubvˁ1 i$$yVvI{H޲>!_Alv\p> SvQ"9]AĺȒ@[\J]L*'ݑPXBMݶ{]JH+sp5\TXr!v5PgTh,+ vϏrz=&Iley䬏mZê6mхw"OJc`6Dgв{ƤXjcgvR@`,`mڥ s8լh&ںWߞ7'=ZF<'Z<^ɑUlͻ \,ٶDv/+7>P2&6PWͬPid"*ʷfqaRm4gɝU.FaqnL# G=A،ġƜ2I';,]P|||M1,*< g܈rwY!c-#,+טK:=z[LYwݔ糙ۯ{4C]*>ǽ^v^7/gD=]!&*q>_wasAe9:O1A9Mys];Zۈ9йI㹳s2(qW4Q;c= (ѓc,@9Tz҈Cqykn}֫{mR ](^S $%=sciRV+k{<=:K"S6D3QL՜,0'$=6m{簉FeXݦ9 -Zs'ser6Z͢YH*2SJYVxk~rx>e%Zݷ{9d, ͘Vxc KnRK)|+ZͰm1pQr@P9dZ0±wt'lT3)=-eL6^`}w ]!|\KlUq֑^2mb% @(eLʍٓoI^MKaZ$/<\HHIFl9#U$4=(s^3w";*!չ݂IK;L=4/ dGǜgNs{ u7aNك(9eI{cLȄA$"LM%lɩB<2v E2>wM(Gyl™v>>LzR0ܛ9&rmly=R)@ѐ9 RwqH' y*BdBH FH~OB(}:MP?ϞQF+y-\ez&zJ2#Qi)NS\@${RL/noDG!jKF-kY0l6%b;}ne*7vP"4C!Eプ5{m.hsvs!EXkxE:z@PԼg$e6JM"v9 s!PhSJ%oX=ҮmYz*[񑵣7&u֟0iǐ+6V'!x}My+OF)d?1O =fG=dܱ~y׼93ON[fe Xʓ]?M 2nEJTEɂ=6j7>u 4U!bnr"Iħ5t8|l0||EY֜ m$]U#Ʒ,:eVx\Cܢ{kDkǜmI6|.lm8۰R2lO }\VPNu~~`DjQd8&ܹ& vzvEusnn` `0EHBY9`o'X3y,^f "xlD1L k ylc4dM6\mīÄͣ?Q{l7f/K~V\5&@9:y1qO0aD/oD̈PwuVC%|Xkxyg2|`Gh_0rHU%!'8vJNi8)#N U|l`HX\pVV!fgWhu76bK؋pX78!g֦ny󇎌zce)v`r#NNPbi+YY="4l2GF֩V@]X 0E z2@N@'Da˛zfR+_ 'g(6q$ ]. OyC HFP?o!>샸'}aOw1D K dA֐&`#|hhI}ۮWɪZ/x9/:6wª(z":HvJ H\PI1XdYiV4ir>~;W65FZ)GaG"Z)JUQ<@d P:@RQ*.@4(lP *4;lzX  -tL%b~>.oH3I1& ڈ+[W=;2ٜGwE,G~r6HZW97ɦ?dDzg(*óv[+ܚ{NW5I佬cvZkO/Zr2V2"F7|ZVs={m*9P$o2@< = y'r/ )u.ʦBp"ud/PPrL`T)-;ic7,Q`6YEn-bɻ6˺gd#c~=`el~;e%_e HYijcֿ6C)P8 Ґ6>[ai" ,Dm̈́)PU=A:!R S帆NR#2Q"XN9"inq813mQh, 5g^c z65 H$%8Yx8NNF5מ{vwUQ3Y9N˒SJdje ;r`sSz )9HlHd-Rd;@PY C&y3 i ٺse:(arx[. E%h˴fo&g4nrdHq(YTPL(}^}kKC[Zņɍbd'Iuګ#;:6e/^mV7rRe(%EHV%2+K Z‘m!V|"$ae`i:fU hm;gx·&mxCks 4ݥg[e^DNqIVz؄L"W8e)l94 >XYs=y6q8FĊ2A@'!p=P!dTϏk}?5IF%z˽/$&?rړ [yL_W>9nwb{iޚF[7v Z/%6JCʲPhq[ۗ9/9ƱsʲcY> › /{Jr ^^NÒ&BR JRɒ&t>d<2\nr)KҠd<+˒M lR&IHdP.P@4dsӜVظyϫc=ҳ R.U'tM;0%;dΙ+#;|u_!3f " T(Âyi**s4YQf|qf&{p >C%67srRK{xomأ{mrhB JB6b2 Jy%#HRO<@OX7PcHp{=oFVD'ocV*R)%g_Vֲf*dl9/:hŤ#)+O{CO݂FnD}( }GoN Ѳd[R~_gC'!)ҷWE6$u `Oԛ)akTſ.l."A'd**rFmˋ#`.A%a22?ԣz2h<,1%e6X'iR&-&V׶\;bj p4g&Ga!Piǐld;dPH Ì's:I]8y ]b#ow{)#[#imifu[afo]EVF<'K>^nīgkE?o\+-:HsHÇ*gYH^,=pNSĞl&9曙Aku[.#y@bٲ#Kx<<N IQ,F4IEVK(!Q3lf a&dBLJm 4d)QH#2!H"PJ$"i6AF()#&11&$(LQDlc hƚbPM,I ة4`M)I h)*( %BFH Y+Z61Xd&#  X&"c(LRAJMhѱh&DQI 3("D$E3d(j)43lLLY$ 0DB"e4,DiYɅ/?pH3%fGC:v&5<"F"?2db\l-GuT/fq5BQ{w+ /n `w1Wf<8h~f9s"$1 ge/.g;XlI_0M8^Ȳt.Em|u|](EOTO_~NyMr269_G-h%_= \r^WNE5ܚǷ9#dJqId6M+!W jocýMmj3QBNCz#d&Bt$Z8iQ]Ovv'-"9[~|vvT˯ϮegD^BjkJѿ-+-wv.ls mTf9º7DJB%x|zXE/];u#D)6enw޽5SskfeH@ʴ9y5e5! 7׼iʕtf׫!ў3kCZu7vN 7{E|<:BTea5:Qkk0C߷RmőeImhYuwn99lVr}wO%Ĥ!7>_6Lxr $CU;8_nĊ'.uGמM짯&rkCO]v. rU.Hg0y/%i@3*oF'9ʸ] 9#&a(6Kpc`e(M(h6iJd ò@فF% X/:9WPš.s!vڥF͝xZrZ qv͵e!Y,ms@CxECtx7l%I3ΐŤ-y48ҖpD)F[ʞ|9VTY g8J6%kͥ2pݙ>Ӻ8 27Nao8f,')il )t$o>ǫĝu{o'P,/0K]ɯ|_ψy 'rfF۲ '*!|Ҍ X1#@K&\VkOc Ōs[]X1ݷO}f4y^uJlnȫ aIEnWcᫀ%3-s] @9UEB%9$-%󧅑cKHND CJQkk9Hll"eܝP2✋q)cVӝC.q(ؠcaS, + %"Ō/fI7\Lzri (Ԟޅ^W.W=wz jQoIzh{bKq$]lY`ri9MhJ:6|읪n= x^@ˑs6Gn(S% :| s؜nwN;wr I=CK2hg$ g9/P z._ H's"|ޮ'ޱy'X`Ҵ!mNuKr &v` yBN0A,'" r_Jri]0-Nq{ GynGGFuP%U>dgfi}=).Ѷ%u;X"jb*N-E,Z<12pw%ɰg޹5n%9DZHaM9 YAj"#Ø==Pk){ ݙ41R $c\g^ѱ(̡Dȹk r|Ozr9Ekuǟ;O&dGqw-R`qϝvQK;s};iL yL:M޲RNؒOIih q;dkg@}oy62{ʃ.ZJ98Ibp&}g|IA(,~{-) Dp<&mv/2QQ,u"Idvv]$SnBeTA7UJ$g 2q5hnnyE*쐛~sHĖ76E#hIH+ͶxDP*0(P9 J)CJ-  &HHB4 lPۛ`P—[:En" BЪ@ͪWUTUGrh1f0Ғ64IӞj9N2d<@T:a+{:tcM8)ɐ*3aCB1l!A@71 vZ|)@$.,]9B쉒@4(l&<a6q^Y)9-4% e@Xm;JYPIV N182(TQCET!k2P%Mc-SHBr"A9!븥!Fberlޏ7)ɗfS\O+jL) 䁲!vڇdqEEW wIНIaSF˳E b= yYuTFxEI%PP䩐 QMRR(.ҋiMG8s) qSpmx?1<"5[b^$#Ns&90$rav\d$s\w&EΓ"C *@䡐#@l @bܱ-r)DrC$2,栙ijچE2, NtLr6bHs,:'tS[ q*#'XBja~n';Ηkm5((4"B;f͑K-/(b_!>ry K@vX6Sro$^rbvfyCXr1.=\g!xE<-ljktҠx|$2u:"[jڄz'{IGbV8 <[B+rB&]!Vq|շ"z7px ǐ;;' ҥɓ!&N޸PU%g{JbAw%T}i^'euh%'xuOwEēO@YyP\Y'/gs!W [16޵6_Qt'dK||q;^E&s9ʢDYgd(.kvLCI^m>MTO$)ӓ< F{'SU)N'=~PuhrO2C8gHN=}<๷8Xv]"2fP8!> HTQ7nMZ-&{B4 !9n& u{X@E{;¥?ȘeDvc9L YH W+;!52nmE6MD.RsIZDV52a+fm-Uep\I+b!AAwvws)E]+K陑ǝ1Q:Fu\қpsJ1"w@#&J"F3oUJ,F 3\(='I-1TNI ΐZ:Y@RUtؑg *4RP),V$g, >&VTI&uʊ&6&./z#H'%E@g M_3BLG'CyP'N:bJh xxݐ^%rr.[NmzIL$ɠ)^Y+;)BdAK Ѱd$%54L .Du8"!E'g#n8MLlE0(4%)Bd䨫p/pHS-w6pTf=0dUvn&~{gU4{ްnv` 0 ]] TJ#`I'$V@ Al(B2NOR Д& *D4LQQ @-('!J?YlЇ*ˋ[?ծ==RN?_|&$ofU1VN&⠄i^/x9|tף߇ ٱVፉ7קߟ ˊJ/M*s0uQM;; u*xQ(Au%(c"nA1ӰVRYҴ~ӡ  1Ba2b -'_ݝ %Egz?,,'u o7bn VP%>G~ xfb$ItCTԊaB rf:cylΗ{؇;֦{#|:D!}f'y.wz]A4`@~\urd)8blE( faL;wԔ9RߗObÇEP>DRJ!gB-*i49h=]ZZOt7b_e!ߵOSGЕ/3LL蔠3 û<4QhxC?|ǻYѷ万gמCiPQUU& {8|.=4I ~vz-;|Džݸܝ{>fmH=cFU$5OM>~pvTєSKfH%U.6zeYt1Ð*HX3z(6 9@pT]Qk2v21BD:\,e|Mo.37{pV>vP3F@]\EA|*.+Ph@!.owfL D'ff_ Xdm1M {&$C`.'-އtoKR7C|+ocM v-02"^-24gN0rKf>{ d] L s%3BgG~ aГ~Nzm;ݧg_Gv|{~xfb/!E J섴 8pĬ"Qd@:BDA.ȷlI aF)IhHSVDĨX^Yv&[ jsv߫6_/;{;<+WJ@K~a?͓ѐ/Bzik!w^{!Hج#0nŬKlS{^P\yxDÉURw,z( -KBV+8HVӧ$kPش "f$Sx'Y&khYs ;m='I0>|8m?]vS𭖌\;'.ʬ$ lAd^iAEK-N B|bqRl˳ΧN޾{<iyD ›M;^BJsRa !ؔ+E^eO'etD⪳4evf9m/}y~?- 귫=*擎Ο5eҸo М۳JiB6YZg]/_;ώ@{!wAwDt_.>>\N4!὾o_&Q2 ):-e)0`Ճ&]bj}K[?7t99w;-\R|'ci m oҝMmt-yږqa0c;}?;%{ }y=opK(gi`/wue~ΦoqtY}-紾6Կ hI} vfTrDI4 dZ$9^>l;_}cq=˵Ur嚗{2x|\F0 g=*(3vt.' >;膎 a0VZݦߤ;K_T4ǂA$%p2%"BMJPwҒe; ֘^0xB(=2q i>Tٕ 'pdPvifi>ޑ݆vn{y{Y$emCRQ[L"7,a,&ON٬o|oV=kw)Ο;xYiNjM⡙BL,LZii4jAM՚JDh€d J"]ĔPA$Mw_=7 VUY_-۰:(4ӣ)Qj#1."j%8KbT?)mо~%:?[x11~ ~N[zM?ry~ yM5}ٷoxPOT*hk%Т :{E]E栳@xHE6 )(X~I;aZ;~' MTNeJcL($RX7ڳݯ{2P_N=6}}ꆡqeKkTTS n]xgI#I!)r5u!pNԺwO5]&NO72&X #gI/K}>6,Me(l76^3r̵#I߿~>IQQ\YΫ_ݾE w_cu6(6Zw4 )b 5;4(%q<]M=Ph[m=R۴XrMB&˩xFnZFlBke J|#|8ĺN%K?cUٗHSle gnFaa^fÊJD`Ɂ1.])GLj_ISd)z_|;.htf&`D9II26k 3WV5m/D"R$:RN<*|o3j=% Oݼo1bYł3X6|'w\ZiQf !(R`ȿfmρEDFA O!?BjӔz N:ɺ7XЧ/X+׽]ae[&dt\0!9CPxetLg۶vgvE8SȽ< grDHmS lU7޽PG?A{Õ N9Bj#zG=]O{+`<ºwk{޻s$)TjT7ndЉ/1HlMlX5;ڳԊYڶY>{mHŋ VGc1#Hl哒KfQE9;Dl)a*C$gW(~cߏ&+|{k-dEw7yr83{b}&e RT*_'fUQZyv.ElݲhEW=[h^^y=4 Y[>n5Z.N#L4"vL1 9J.h~du)T2eY-M0g\R*ie+{h7i+322L9"ܒYݕAik2&I#2:J2I{{#,sT#53$,^2>oKs# Uc&`rNV`报JadT."~UqDm퍖-GB!SM.*qwVTDVVaS畭;wGc̾=DXRnJJ1RJ\5-.H!0$¤UMXuBEȇaF)VN&!:*e "by+tB4]5Bajf5Y)Eu=s[ RMX6uGhA0<"~x{rq:W'EWLλaQ&™v\qOQ!%mM>2C$!ZLs*p;9@W"ѹ]H\p#塬N2u†D^IP9Lp$]zo]g(ΆS:)jЮ,^RF- )O |L1+hmB_wT%"z<$^Jək[ [x("Zei/xN2&zK}{ז~H-,.G*1 {mMq+K)FMrZ,7)^XϢǁ6h*^f냌qU0IN쒢봯럽a=om͸:ъqRRc9ӽrP$R}ߞ2cDsSV]q1F%sėl^4uYOE0l~޽m[b;cOho{K"bɊQ\9Rj:E( =6JB|B퓳hϤBj)>ݯlPIhp1c,exw]&%k&0)4L1yO=PM`$z9  )(CMra1v2P`vR s(Q6T6P OEuF!F{] J0yxvѱM6*)e}lݛdJ-Yyuja0V3OVJ1(:u,3ŘZֵ,vi^3饼JP*Ξy{ý@'u(E`J׈35iybsq/ L;:ʌ7XZI)UbnKj=37G$olv{mKFH#@Pe9M3znYI܆ \gTtI*=V9AԊ[f /ZM,%gϐhU':vŌ{ci՛\$YO%éDeO$~_{Qm/U7~_M.iɳ0}ͪRak5!Zٞ汴b-=aM-.ڼum[nb zGtѽ"(kjt%E2S :R1Epms&dݶR V5[u#K(-:Wq)v\3tSq \&K)QS_U‘>ڝ[mIq8q2O97kɈT14q󦗜6SdIYPc,Ɔ<^IOyrSliljlԔ.5Q~$8,Ꮾ4&rUcF'nōsmH-v'ݣq!%Tzpclou9R0ΨGT&AaP=%tQu&O;d: .{k&xQ<:Ud{Õ DԽ{Y]rb>wGuYsFѓml"'ڝc0FЕȖS2ڲզ@97ly6LC4h2)h3oC^W60KK.܋A"ac첌OD[׏%S%"͜<% m&x5ԁu HI@<څC.HAwpG$rEEMi@Q G7\Sη e&)Z-k(I`UtHJb}x55 F#kՒX)"*jmw<Ӳ$M!շfxv7rU\HHyAT<>C`T" !NUzvmɒ%]"3(33^2dˮۧRm,Fd *)Ů 'VJr0 2r^hjzͅIBg̶&R+:jX5#5HA~oMlt$hRs7f~j|mGMi[ R>@D!m#xejx% {O(ʼBijKHea8[#l^7y<9o$UHO5gޜq=^0J*_k ݱL2ۗcsvɗ/TyS>7D{QgSx<a)))|roS>?dH҂뱨Mar:cg4([¾ ?^vX p^ jb*S $.߁7/y_huv c I[޽ :amM!nvxmhE[:nصHQ`BbͲ%2PLQs!#H/%L8xi3)%X nn+n:/psϚl%!]OB`cK~]>wQ%^oˮ4=޿;{Zw1l=c^{|<g{_^lgJ/*8{ùyӼ:5J {OwЪ%~e G:i7or,ow'_Z vp]a`Q5-C5&TNە$0,ƍD w+C;K!uqslZӚ{e̘sXx>ANt|]j#e3_+ OP39513 mP^'gH漉Dͮ)^N.5uyCCs)oO*}oCjR8 888صr+cNB/Pt@p%4>>5M]C;QъQy6˚o囏TJUuP1җg;zV1 9ˠ!eg=YzNFfv^Qf1 'a)>=||:D(B}gY9tFN$ NpaUq8\{޻VV]ea/]h6y񆺇gE8RTԪmԱm'˹z(rtܴ2$hGlB Vg^QɉYJlzOCu,V)\dӆIʺX1$xvjlZжŵvtW)LO=EgNpDrթ*vRhjjF,ɜ?=W;c-Y\uO6/~w|hw%iSYggڋs42ayJ'=!s}w}wԽf0Y@^٣i(]kתةURMY@+}y⫥Tw< qe<>Oz/o҃rZ}FyPUxVV5XYq޴xmqKShzv+"&ұIbF< @cF0iЩ]$jCCog8,Ŭ&=)uMd9dY-fIc^rC &Ex^k5t knHbeQSEukjKnusu\kEb1WxqK؋Y3 2[]{VMaw]cH09p_1`t31)"V#(hFemi9A&o& @R9Pq:;2V.L9ܕ2PJ9;!H2Ca'% EMf@dd/ Wva@ Fh) 2tB{r:$J'P4^Jkս,r 6s4^5hI%z4P"xS$BY)e-LbQ4;~bt9޼k#y%{yy⽺rNB"N' sf{Z*]X+ s/d;64tm+' 'INOc_e>djɭfʲ4>f) ea`Pյ-6Sޮ=Gf-!bY۴,21l[v<;NHs!}~~+.6Xٲa;jͰ7޿_}뺅}}f۩yl⚕a+i4 Xo)>YQn9--݅U;ѱ"M`DfJf0ɭ“(BGt(:܍BL,F@`,Hb̰b &Dn2IF("4&h6ۚޞJL4JNs"&4I F#D$.먍$GTbjXF!R1`CcƹPjDb59D7{Cj7գ6Uݼ\,IH:T+z!7pbMǝnrZv w1 Hs⾎/:%^m bvxIo8PC{T$>n:R]8bYSS52E KHȦ+:I!X4*L*XI iI(5D3$d.J#!PډG$l*J+l&D5E,֥l%\VIQ5B:Fh"]YrZZ+:QUEVbZiШ)5,D%B S %.Ae& ʪ䢡\Lak#2#M+RKT&"Q,1B,MI3$в%P3 :BKRI1D[(KRR2dN!EQU*&&Z$,3bHrJ04$#"QP)ԃ42A,K0D,8QQuYu4#DݘN\t"ӑ%rU'eDJ$Xh ҊA[HtIq9%%HINJ21Uhӗɻ;Lu:ZhTr,T#2NU1JSTLZdf2#6˙YEV(RD&ZIYQm5Q$]2-T(Ԭ6FgVH\.A1:.]f%J4)CTSDZtDВօtR25:464Kir9*DUPTdAY,pA YHFRDY.*40BIBd\NipQ1NQW Թe.tjYAI4Pf 5(k2I*EQ"YfM-R MF#iDgI3M"ԣ#0"Hwz=Ëo}ﹾPT>-uPL~Gw&߸$ڔI9kW֘XJ9}˓MD1F6vZ߾Lla/ikE8{^o럡%Ѻ)&ׂr`#sשݤADl=] |Y/.x^a<$r3vAym K*#D-Z.Ӥ9'. qZU5.%"NΌ;N8b~ rU;zS %QJP4gT>2g1 \L?3 &4*7ú&#?Woa1a1YDžLJ@Wg̷3MD@Cc8B&`Pd><}Q1=`0euɲjas5zf#N-QVf\^&q1C]40V.ͣy8Lʾo27!1 $2ʮ2]lG  $v3veo}KQ">_>wC_?:m\˾Vv?'{7~ܥrK9c:aM& T ɒɯ/OgBn G3|y_y\WɨyZ%_bPۮ;Άu5(p䖫=$ٜqx.76 |H‹^v ^f԰F etht"0t|fI-] ݘmO+{v~6g8pc H0e@a  Uxh1!M`|5'9rE^n/HQ0WmY/ 2{rLL&'7W#鳞ds8nҵ(+H6Ի)rhryvؙ5{`}eT'e.S>1^ϼd'xIwb`z}{Ոޜ|9M6l\AΡp%%-OM7jtNH [ta?>!?'v٣C,KF"֒4A!EsYS"ŊTO)JXf-p@AC@EK`(!a9aeVFRS,ʰx[zsQˣ|=F)k*VDT7um ADQb6FOe˿u?K3`2@1!b0ؽGaF36+LX Y ;$z!oO1>_!;m9@6F u]D43X 6ɴH):~n'>C^Ic~@yZz7=adV7^F!X{J~6|d鴌$`4s+ľc{o>1?cc0+t-#x~ƙv=DWw♸c;0ZP]6W#ȴK9Kzuf=81z1 [REAm`C"i ӛ߇Q]u e"Cs,!Nq"$7zC羚~kvO;Rra WAC):ƋR8`PL}Dpc()!>/uҲ#NpAu(oOlARl0TY!0|ޥ9g1?$Bk{oâ$dpkdAarٍ2̿ez}P*d5.CNAo["y%(7yk$rC~;I'!N\O1xH]T߈l/$'/r}n+yx:r+B2l'#I3q)!)9"}A(}?p?~n7v`:Pd)(aԿOrZ5 x@P}k~b\8dg5\.Iq9bֈj\/ Ah7椗*гa6"YyN(*pL&k1 ,$Icfdpew|!hpY @v¤py=YDl͢2 It 3 'LOr3 LJ:Pv=BݠD#8r CRr45GX$)h;9 r3+NH;kUzFDAhƕwvga#^oi|UD0`NMT'L P.:2h,ń73Ev&AY@r /;8 Q0<'i5xG>S{zxe&ƾUu-W;{~ قz,Z5ik0tNJ#wwy.iw7p6Uƺ6/,=y)!/Y\H]LPc ٹO.bf2AI\0R$wI0]3L {Q7hNiə'I'ف MEA&ě.] 7!`Sa2q֥6 lH$ ,GF6r-Ə?$=Ab?6&m膄8u\ڈXXbkqӯ٧c;ufv\jN氮 T%Pw=@_;B zp rfM"}ћ.BCMp_0rL2vj,!3It1I;U|at*ԻjFD>S\>'=<0!"{l,|dy8|CCuڛR<=3ٽ鍴C36XQBo-d- aXqy}NQ -JSaю +)74A6}@Co H[=AcK>{P<ݶ>7> Si.TW~ r?vO.^)=F|KL)v|KrܝrK\p Cɭ6|[ y%(R9Y!FM|?PwPCGaqR>`a2DC"w&R;G}Bu TR}ױ_Fk_gz=CԻ <1@ya+*n0ϴ"dlCY_s>o1~#wӹ6z7󶒜b@N'%? ǟ8a/Լ{1)C,yD9ͬ2DZ죤 [;=0O_xld3 ,m,$JйkC '!<_S9#%C!!{;|e)I;D蒜O];ĉaJ 4R`mAx'%#ۙFpřEBf$QAٛ3 ()Mz,8ے.DnDB2kv:V9V;bSm؆ӉOoQv,Q2&J11`勐C$WF=h6{DZ+ؖa笯.$xdv}l4ñ e? #Iɵ$z:i i v?Ȋ.mK#EfI79 خJ :ΒkXTဢ3-`W 7yeiañc0b 0M[^.YS=0@ ]hT\k=B*8QD^\f{&oWfED3Hh!6cp *HujuәtfU!n!(穵 bHI FFܥB=Yls*&uʦuMvw!72]E-vdX7%Bh\5q&0nv7Nb8l[+̕X.fp*.^{EQN\=". = /IOϧB9TfSfdfD)b%I,*agnTDr3ZZ+K!?{Y^H$QU ҏTCL1$JjJq.1"-H,)Z9D* {RMŢ$Wi!!8V!LN dP&7I%tLiyjmi&A$ZuDbb(T5)H&E YmQJ2҈Y ;4)$I-HY9J41H R*fʰsKZBI" (nso *NYf'BNЋ %Eu ?ӴRk i\/ޑU:F*6i&)"IJ%I2eA"AYVaBZ%P+LiMNQC5# 1Y4UC 9Q]e*AE0BGDб#404,D0ڥPQZVYl:F2!(ʔʂC$DZIHI*Hrlhj&IKPq".U9R-H $6RΡaYЈ(Z)e" e3#HGnfVfq"1C XH+M_\JDAQ5HkJSܱHBS͑rBJUHWIJR] GRJnuH\ $,ͦ {‡Զƚ%?mFwoBn7J Q$WAQ uVw: ȓA]-@{!aZ#čsL^1ih 7Jm/M(+q0bgA_p)nmrva N 6P);IDƨRy{8ª .I"U6>[#$ >?E{$ڢ c 07w d2N?iR:m_ 7=E `d-ak [W/{:˜ifV`HyZ3gm6bL[aGE{t+ qPcF4ffl$@dVe.AKadӶ6*̧t0 2HbpN)IY't[(7Čs, CPrgAj(-qxI7maDmqe]eQ<$%3ZعXeKiN7b4lZAyܷD=>Stz4U՜-qö6ؑыmlȢO5n!5ҡNэvIne圊3R+TX6ec 3eJK 4EaY&su]FӔQ˰CmvP5'=eiҹtԵR,s`T C+R2ha#-avwer.w0:UW62֮ݞQh' 3Haˮ=26{nܶnt/dxe(UI/yNp_A+ Xdu cU5B*d 2!C/ q3ã=sy I=.sˋhΜa^z ᙒպ\Xʹvr򨹒xlmʎQ4Fu6I˝llfAqxۣ8rQS4gaM'Lrh{uBYƞ rPXD@D!ަ>ڿZZH=}_)ΐ#?©'XV6 -^6mzN2+ܴT]u5޼x"w> D Ag"RGS;9HYT\K)F0T7= H.jMJ\%YS I+97.#*+B{RTW>A?q]$\3clnW+.x5q Y3ID˶Y]mb܂6Sl JH!H.JB!J)-(PD--͘B&T( )!NB -ǰPíO6W"WL&I)FLٶvP#[Mv2],XiTg6R F2e0%n}M` LkG+u\3 L.-gmykS\,ee,\;!a.F ;$J&8g3:7JKKlnlLDyTbgub8u Y.]^rr_l6&lDb5aߞ%JѲ+l;%.h]u5RRKLId°ȒgU]?f|%Ameo==w62Qg^ob[:W*OpwM29 1&Ւ!-KM X4ZY >ɤUe鼰N%fN>?'jqr1Ootgouxd۳d.u,"ٽXʙKm;nŻ- ]˖E6 ߔ+*8 B JA Omբ@ܓjrjF\D:T @$dkc&{gxJɞQN6Խz{b:G@aՐOHw)BT^I2:mI؞Γ2Yk儊dA@ KV񼆹hEtm(3.U[$ 9L!,ʏVFTTL!ø&,QaIh]K|Ss"*(fT1 LE6xC'npI&@:H(N 8*Ⴜ+&Cң'sMd:0ȸ]!,%H )2f 7h 2w(JBfj̬D" Ȧ:d6Ўc<0"O6m9,ڙPPurv^KnAHd%!*%H.n4M聒; 샐JRlBPB 1lNΓ;61I(FKIH#2a"5H$m9_%+uZX3n3lbeN6s ȰT"]wUl!@H".H P*d%hdl9; ) !Pl(d©eJl @lZITIA%&)LZ2%mkmPkQQ1®W(`ni6A(m jժD(RRJJA(r@ DLLlb\:d7X6i' ۄvg#} o8XCI˔LgmFQ i,ut4uG<3*lTL$rwp m04gI2[gC VnDDJ \ӆ u# 6K) c6k\XٶK΅{PR`4ѭY-Ѫ6VKb-VUbɬ0@D@ $(!" 2L#b2Rh$IH S (IFe$2ȟ1M"d"E4ņh@D$L) cX- AYDX0h#c`2FEH )(SdQha#X,2LE*6,[*-,f`ڨlb*1EPH$F1BQFE,Z4m`֬Um[jDch((c% e Dhh#Pi(0"F4̌j1RQE6#F#Qjh*kEK1hD)JiT)QXUEdFjQHm ڱ-XTUXѫ[F P)RL)'(xQ&tڀv0&" QPx2t.-kQKV۶eT&f2{eP%u2;A@4rS92I9D(,-I)ƌȸIg[N)EaY!)F42 `2] 24M- MC#\tt&gePPTABTB۔JGu<+fwPִ\["n^W>/mk pyacVʩC %zr{"/H[SE][Xߗ=*sCg/:^`rNREW*6 MbqjvaZXM>G2lnlctDR{uyaLYV3ڒYWjyn*VڤmnmJH K[b[Mcy 2VELhV'RyL m]ymwTv9iHKgWJsjS,򎉶qYc‹uI6ܠeʖȓwp\-N[fO".gSَ&bxW3Lhil$+&W1@]qq%TM)r E]bͭcPfF,FZVsSH4M,KPseLn2aM:3/6PYagXR .ی7 ږt9BVMq/;[V k 2v) \''%Mvk= r)3ěGmj[v7+=y *y&kpU=B+ׯ/ .t P1YͥjT#KV^]-H"j$sBb$3Y3Y!ʋWE^&TtgU22M%7r=2viknn?-HL4ΰ]џ=~iDyнRb;!jE2d&ɓ+r + z%N::LHɓ+šĖ^I`$NFVbmrȴb(xeʦaMP/W&sl w BH 6 )J]4Vfw"Kfkp$r;#>ΑABR l.ђl@Ѕa; !4l\50rT`Pv(ARy"j6j-XK7xd[ya7%lEhDD.n[ ; BB *H)fI$uTWJ*/<7]LJ2gW_1~Ft |zwCt/)^w]m|5:pS_<]BLRTWxLYXirrPwz>cpz;Кr\-$% )Xlb&;2˵_볭s[r?<}m[v,3N/'쿩c9}C; K!/!n;x2? 9oכ ˻#o𵤀.m7'Ovqf6r16EJazfnm`2mIhڙ<~W /Wg##d^6ü6Aǩ]O"SՒnyįPҔh ܣNOX Pr:c$=&KTfr6>P6?P\p2aLu:, MU!'zmf}0~e{{SHՌ-gQQ8wy_#ÞO[ӓ]ul2(e!NY#r_ژ)[$(7ԳUh@ҋǐžľVsq}"dž٥3Th{D)%TC֤;^c&_4&o8ːm\xSc\ʒaER _荖Q0cڋ@G9EϟeW,"7slÝӷUI(J,H(s0v ZFPMm 6pN#DSwNb26hHuƶ0[nK6h7>ņ\Ib)E!Zm/n{ДrRsb*1(FhsֲfmsͲXjQɵhQ0v-}\UY&E06 % 2{כ_cdMlli]\hnZvizhIWZFWˌ^K9 ˥sDdvxm&؞qHj*$$섃FW)&f4txCz$ B [;F؉n"3^tra.\sz*"R6ȈEyjWk9uӞX@^3ysJ̶Dh$rރԾxVefDƅo0T[ŧ#B%ũZ9M =7v]{${EN b[;1$RBf `8`aYLb ;ByVzNeeG=B.˛Zgޔ'ܟ) S:'sFˮ F^A\m$9frI:ֱ͒=&5qRy*IIJ=C5Ŷ2ԨȈL6]ZvbBXenc57vV4bc]lRdu֥]FzMyFi-m$92gUt4B5u^]Ax`1l?H{SRҦV$b2pŜͱ$6QNl٣Ei;Rq4S5 "·Ek`3+m,^6ޓHrN\T .\%!{+D FSsIi,[.9$C"NfX%q3Vܿ,r"+C CA1O ҳԓTdɶVYRZb\դRHzD"FR}K 2(PfQt3 16tȈt8HHM8z SN.f Ju")4\nם$y4 MΙ`/EYtE*YkfUBj]?/g-5A QEI \ 9i(ѦTYhȔDɗC2̤33ȣ&o4bM9*_~{5Y6eRۥFG*Q8'U RΪU&V$)L[]>{sw.ۗJ fBt ':ssdJcM2h\'=GW D1,D*ALDg(rNY E[5!'+\$2L9QYe"ZF(Uɖ+$@JN"WԦUPQdQNѰV4;Z6ѩJt0L.\ i.aάk&.q4Ҳy%q#A՜*-K)E Zt$*((J*;Hcv*'ap=rmJ#i%{,O |gq8`=ΪaKPybm,HFdA(%dd\)Teg")BIL dhkbe$kL-Ur̨H젦E ("IHgbʊ m ▅ZӅ+'Ǔ=Tfq18܇ª\i$W* ZP2Mr҈[N'5=y|268P$΅I4%f.+r<8柵LM fV U];#ϲ.v^?QenΞ9#sw|}Hw/|Q xo_Xvsaؒ.au":YIտK1uB.!mNP{!Ƶi‚Wgq}*5vؾ:y]5X~?uݻ8aA j;qJlnXfd[Ѝ?B(̽nAS{k/x1| $4-_?K>Гzjx]m ^3-g6X2:5p/S U4_»R+ ۷ªuMۤ&am]h^_?>;~;QG[^@ +.ghl[FLĸŝvî͚eJ@셄ahp8 "խF#ĐYPHf2ß2Z?46eY#?xE{ҍlV53JOy tS1Ռ;"_Rr~^s&on~DkIl/G0"F^T_(z[_kE[hӅǪF9FD~}x]uĎ71N廈{7Xޥ5l9cFY~&F1fu1Fsȇ'c֕֋r--zöjNpۉ8p*3I"2 W ^5`a+} VrXqNh-;lu`9())ioc mS0j|| }\\:H=`h/ 4_O]W\]Ƴ*rfo*Ch95fTPoj̨8%D~]|LY ܴ=L'Mamc(*]!)}!4Ȃ~]S\>RE5>x)N;5gΜb:W[aI"߬S/+Ȼg.J #80FCDt;azd`]V7t_/]Lt:6\oY^Ửb]e [Csh" :b@i/kݷ'&1hKkob=?1cm^SF2j~*[DŽQw+S&oEUpٺLJ)Ė 7Uro+aq `$)~`G;cR Zvb/Hb!q,uU$0SNtK2FD`E9яb|^}o9s2 YmƜ!lHn8gSPpȮQiq& gl\+\6ΡgCǛSq{Ӡ~⯃=3+ffL:o;*VٳTܙd[b4ЗIxS[m:]\e|[F#Kb1/#Zg6_S=:Q%RO*IWr9A<41>s15~@:h%MwxL[>/W!sꫭ jwu=2y4TnPʻa\Dncg:uf,ͬQ[Zyv #-7 aEʯ= g99ʐZ1Q%I7`e;[^I?ؗFS=rCE 2;hr;9Dzd+H9'24v9 %h!]R!Z,")?tB7Cɺ87n3vK66Mb)vmV;$g#Pƻ1dWI9bbD6K&Jx˘S&XHpaĻ,q9Chѷ׏U 0ٍfPlR 43O[J, QdB4.C "ם)Vݒd=V먍eiMcM 5i,U&H/թE)2Og*ZuE[+9sxy]>(<p؄EV#fbTCDLѢ/t 'ǶY6 ]mD G$UM=sUh.[{k4ҭ)Ȫ22QLQ\qȈm7%SA\EgjrJi0N2bi[Ul%e3%e]!lN˟եw cl6b99źgѢ3EV+uP6yÔ n-m:,] EL%FNrN a,c'ORJm^<'9 άeh"lZMugbbi򤺝7&Ѳl8X'U'#ٴ\c#\ 5.lc/)#cknmƚ]KMb.F۲usN]:6ЮlͮBĻuɪAv潼d1 9HpV;j!tc<3ʌ4XRbQK ;9G6^U{gbh^W3&I0MsqtBz4X!0U ؆ 1Y|;{2Z?ύԡ'0V۳󯸑`B,kdDovOPkl_x֑Z5UPGux/~_roQ\}J AԐZtv (k16_n9aj#ZU0 ߭雥|'Y̧T򯒍.~w\m>#s-U 09Wcwj|Xj49H^{v$ !!CѮ9&TFBBD[͘% @l&d!6ZxyD 5L9صS2q4lndd.FKa[''ɼ1JaE^u"v3 "dX}=|}p亊Sh`pw[jZs*ԍ6JXM#=(xSWː+Q* UE Ѝ HSSJRdlVBQ$QS1(l+49Mm`dTT(Xi2QBiT_$0ج$9)Y Cq\G{Az5E+0\{MI>鹆# 0r쎊ysdž8?uw~/xA A(AbBV ȔNFs;r吵oWx^X*6a5fEZUK+w5s՜ܼԉ͈Rg]t*jU]UlT ,$RťGeĆdU\z_!Y&T3NYwFcokVA $d,,U_ ^ %S,P$35#/ӡ&(NƽkF:dj~TUO Xz 3,r!Bm3 f5 q*vDz=(.UWl_m/:k<"\brm߮-|nr!8~=io&-\vǝTZ/P/ nw"o!$"V6%^BNc8[Bʯ,s qJ$vhn XaW3e ww-k`tJ,h 3gHͬj"MrːTwIV #Pb mЪ2B ?Aap&6Ur#7L(IW=8xrNJMeNf;8sL9ɦDĒ3ɮ6nQWb 5&n=ۙI^iemQ Z @vDذXKøaHBl&ɘ#h A&nC}K6F 69!;(RYBaI{sPWZg G+A%\`lD hI&,Ӫ֚-rh7z<\{/WQaD k8`Џasۓoe2i)Z|÷=`/^;̱d2XJ[/E~3a^;f,0Ȑ{VYC/wݵ-q?if*z?/߹s["bKj1/X5ΐ|a՘g쁚u1gfVLY4.>DapaIcHFI-%F5)CD0F5 PFfAFؤ(KDARiƄ#IDTQ,Q&J,PIIbY+&a2TdX 0L0 DLě3X,h@%(,Ɂ@(Y(M*YZh!]Ð[ [*Nx+ CѼco܋[K)]P8-3\(2.m}6.^9CM| }S|ޭԢܶUSYkcQad >ɗ93M-xR"$[CC70.Q<nL08Rq4kM׹^jGgYɺP Jþ>P"K[إ+0 pdu mAYCC0*[M0zrzSC^ffjt;fcI@~LJ(goiϘf2A<kU=vΝ76PN(6~~g0ƞ1no_T#:k[3,ME00Dw =:kγ/n˭\Gz#ho;e҄曀%CELn~wzrӚwX"!!PL0s3vg Ń)&" Ϊbsl \@0rM!LƁh;et3ᰇW, rV i *QI>H"\1t-txn߮R}6mA+>n~yx;2sSjޟ_^emb4g;:V|F/;> >|@ZÆ0*#Ysr َ6K`ֻ߈dl @2~ mW pj;.tTpfhuLW/HN'פ?y$>Oz~A?8[z~VzsqLQa{Uxj6r+ Y6cՌ2_l uw 6r%U0kLFf}9m=6_Ϗ<[菿:0'*a]6eMLֿXXTXZͶG*9 P@HY`$a,#yz\$q/-=6>]49'҉Nl'w!`A!p>ssj)h6ĭW`ŝI@,RƶFiZNA(m0.pJ0ٵ:Dٕhmxa͂g+􌔚 RKvH}(uГ1L $ Lb %Lnh 2A^`, &1L3F* @d 0 &Q"Q0fEDȬPh (!Bf`!dFE2Ė(w QI"4xPL̐ aEI%(4E1Dfh4}\4ll(6 _O.yHr(0ۦ]|TJh EK>bwk6eyHTW!{#G!kPAj&!d qk"w?Š-#f7#_:wˎx\P⺻yQ= Q6Ɲ e.HM٩5GP ?Xj:bkH.tl7O܏3CVckhۭx!|C!1|5ɰ*!@Gl#7A30EZs7YY=RфXiaNA{׎źXTȆ0@(lq 52#`"HG^8 _׎@)W MKzaޞ2|hCԲ2 0ǎ訞qFem=ENWKdkShnuÌɅ$CXTǸF=7u1`k Ih=e4+`v %!޼zUqt.)2 Z`)N!N[L;MmqdIF;'LtX>wxI*|nGilWg96^6 4X|ݧŎ^V;llP;$HjO44&aRa G X GOpM#7Lvh<(|w]o!+}|XE 0qؑ\m[9>1W D t]OLg-nLuf<{!'Ƶ`)tI%kuzaFM}&E!ܮ.~sï$.  |q?;9~r@6|Khif4r&ZX7dmknEiP 6u3z"@DQwk *RgLM cjaF2{#h?"o; Fttg`+S2Fh@E c?D tms'ֺ/7B%^'#; I6ƹ cݸ|voA:*.2r18q2@!|upLN:\xUutQr%-$2O2J;F [#=hl`yk6zQ\$:"LR0sv08pr0Q;z]8k{fkXGIY1X 9dxgn #IR^5,lYm5( |>(YN+W7Eo3lAt#8=*}+(Nryb+b&%MDFZݼse#>smjkbzCr[:v/.Ci?O"-8yʎMγ,/5&K(dv20Vy x`G9xS}{vӎ^.>s7 tN>kzȆy9#|{Zm}010Yt] rł瞶O.''j7#1T8AR_[{iKcoUYqwqNJ;/xq[p]G/k uGѩZZuʁ҃񭘌7|mkם\!7"ok|8>7-K%) eHU"؆SLCK.@tOHG!toc!h kn5B+dk!P@aCQKdB(r0Ef6ᵶ@lZpGcC>l>/SܶLt+& M7l]& A6Zep/u~D C\$#az ww6l["tX{b:EDA /_gܛ'[NL$!-kIbeUl?9.xP9rO1r ɏfvWu&i(ČGF Qɰ [$=+vh͉^ WkrX/K#@y=UVi+w]=M' XsaE J*xkI6vvb{'I|޻q`N~vFosA(Y6n:1ٵ&2\ #f-%L-=S3iq)] nd-?:f<њuhɎX }3 wS8}9Pj*qW(4wr:C[3uR(Ol0\C`4LOl4[%Sozdvna̗?y_Ppͣ[̾'5@0c8yhږts 5LyrhCagtrdXf=2Du[8>+:"0kRd\VD`1isި* 2Qd$bk!FĸpH Ȉ(x A!y`O4m[t !M |=22tz |֫29FAiAMI3 v 7ôl 7>'l5\u _Vu_q>Q.;v+]~fT qKc.WD[wfc߷t#-U~|Y?:3;#߷˱tw/fC+K9X$L2{xYt۵:qX$һŽH}0*f=CLgt\fVMgfuhQm\0(剗0yt:˽0g8MMgOzlpE1[6ivQMWhvy(7{)sTa4gk:ƛ=q^C1޻(ޫ>5]B{RFz n|/u9K %O~"Zt Eוgu&2eSç,FP/-ݹwi5#1܆/}3 J)ࣥ4+]4c?+wnAnѓ&US+pӵy`|ɾP#҂{@1*#ifDUM~ڏwWMbAL'q_/ ҙM09\VrvS:,Y~r&q7{"}U(_Dl$A5|SA=;}%(>F=j1}U 1h{I(Mb':ē&kQ_36{}u:M+(Q'Χ@ Q5p޵N8Oo1]@V)}c}_U%i\JoWxDO7nRd~e2\=Iz)O}H{#R>!9>#؊|317Dgh-*dמߕ yù8yu_.qFHñ7jr+m_tBrCE8teUˈzl_/ncA?ȧyo #Cs>MSv.sG L1uFeC8`;GXoYؘ C:39b!4g.R抏~X!6k,o}~4[w'*ˊ/aa2qt4םO~ߋp䌃t ׾eƠ}v3[E:MPC8$9>S㙛I-O.Oȃy fd=̎)g^UJ[=$ʖCVi7aܻXK{ 1"1*ar4{]=ez1i h$qlQNn,va,4|855rt+$f7J M*o7]}1ke|[hq"kUv*h탐s 4Ëw*7.s8h1|ݨ뮓A{ !Z;{Zu;)Y8Qפֿ3Gy+opgw0$,2XxT0+2q5z=rmކ: /'놶{-|ZݑmX"-dPrW!Q䔨*o{\xay=W,B,dwn{ec|JN%Aп&#Eٍ' )'p v "yӹzښ 1̬a C a)]l9şwfXcM/abLF[q̞vC<2dvC}84 Aד=#Ef!46tm~q7 a.M~sxQUX\[][~=y*ȑ܎6AU CT+J2̧ e}ʿR'}-pR}ܡ io>~PސG;C%!k]'OJ18!9zR:Dfغu7ZGͰh#<+]Ǐ#6$zEúۋ  eݟdk3~T0hM"tݫ~sL̅/X]ML4[ ی hΊԵ0B"ΕkiJ Ĉ^s0"y!0>yQ+#LLo>릗l:[ udߤ5"I($Z[-gދۿCKm7w=`HbK(kÆ]}/{w.Z&j/}@]4(ca|YG/®8M#YFJ"nwݶϧmm{Տm1!LeyvLr-iqnRU NaKSrۦ?4 DcWsFvU@#REoyak0;\G*61kl Նo ri;쇎ƒ`/r0}KȧG\}ExC9'i~o]3^fK-i"ֹpG@Wj+1E=eoJ6"Ghmi՜e$0;`zG`2mdtBW1R+ ^{|ksE}oqW5 u5|Q/T7 ۸_'Em=yc;g sYǯ?;3G͖ܯk?7O{#dIaa6;h>;ƈ(|)M]};!Cґ.ۆ ļRtҳ70ivKfIIe6!?WĎ6?[]i" jn_③T{#oBzZm]{3Ti߅+17ދ )(aQpC2P8wwx5i g:['ZbD >5qoK"ae&CܿyBD Bs#>Obl1lvi 1ґby] YH;t׎vg-F eܨC pYmi˥xX1 CYg`g?59͸"fpdU^Z&0׻ k$Ejk"4/h.FD9R Ar4EGDTa<>8_v_k׏ox+N@>gӔ*ZK$Jsf$Wv=u68k86h84 `(Rh 8"U78?zɃ!$+ Z6sٶ-a'9[~5O7EBl_;6\V[\{M1=HamCN(`xPٳzG:S "][~z7&c$Oψt)Pth;}zR(s [~b7ɐݸk)IqJkJ( q KLJwZؚs2)UUENRA4bꍐ0F)ˑ ؓe( 0xy<C+2H{⻮n_-f+:aI#\! I]>\A2o]$A*,GD&p0AR( DE#icfh.]5wO\n)b*gwI$Ӫ`Ԛ1S$\(=@:*˪sSy@ɃO;5TubRz΄X ss]ݮ:ϒGf $۸x!n\ȦbJ95JK wp4P2 LΜB)& DkH,+3BA+5  CM ¾UUqDe \7wb≊"D l~:`m#q[!ov~#Hxht;[i5i>gv%.6}#7sy?lyY:83<~M7H+`7aWsQbq:TbhMLP_]bͽӹ9~c[U Ȟi\6_0 qr~n.ߖ[kDQjYXXZyOtOr/;j% 'N.03`^@DZorUgp֬8vHhYvk:U1>4 :v,džͬ)S6" b`9; 5x3d5iƏƏRwrK9G"&ck׬m}8vƤ$=-Ʒ bd^LpCOL0ЁJ "E^j)ImN (3O6 ^8sΣ'$p/Rj@Ggߘ㇮Ԩ^"k1glave+Lg;Qsg57cv֊q0GI;yW{kܸb >WZM3]h|=N ֮aN2<̧|cȂ$<}1xSw-9;-47G+,5;0jfDﶙ{~ή5B:ÉiF5=hTQ۴^ymݚC㻥{6+F=C?Đa.'"K$oǽѿ֗UC}K=p{oۖh}+ U401@o[|'3ξ?TW.9~gwf~Ƚ/v;_o)3۽#d~ﵧh~t3!Ri;+DC}sh1]Ia|oW1x¶KI˳4}8N*`;39̾XCN6FR|EF54 #RXLɧF6*>$O37X̌kZ,Zyt|F%3g9F;[Z$e+CXC>#*gs!ͯD8W9Df b Ć8G_ZyȺMM.${2uP[={Mv4-XU_jyQE)u"55wُky͛ Iް>nwjW"aՇ c5ϻ+ٯoIJpEyDmoq7Udu03ŧ~aUX`]ߌT$37̻D"=!\:)a6 \CzNj2³|},'=. 쳛;>3E~ _ڦ0q1&3bM]c?a7sܭ oǩl7:?W|,_ IJe]xM.Izl𜓜f->@L$t&:2icw\S^E>~Qrlu yμqǒ&`luawֲ"v:]Rd6 j?wA.>#l]S<~3Mly/!uݳ N8y4yTGZIdM`.8Gj7HoM򚌂0D|8iR8hd_cщ`q5>5>(J\1X˰b3kw6/͜e, W_B[/2f.g XK̃5/w21Fxۜi ^uc[(r|k>xEN]`lϬs0Ps:6r?*2FP6[+Λ#$=ƳQsHfS7ǃ,ʽi|E].VL$:ケӏ;)Q|>5 57%_X=8u"o;V̦٬?YGzثcwr<,:Xh~F FN=:#ȯ9יaXX@ af_sQ$ $tl(g/YaD$pnU\y< 8l!Yug\YD0OƧ^DHlYg-w(Y T2r q$A"H][d?"ߟh~X~z~U}{[`p>w*cfuzr^ֽ1u5g%>$B͊Zѵ~$\*vc (Jfo䟫M NBdxC_ =sS(<s1>ewLM%7*Oۧ%Zh=!k#䱯}OSN?0x#!OR|OJ#J_ri3ȵ 6 k#ֵ/Ooơvb {ψxBx//5v‚1y64kY|WDzMo(6(7yXN7Qj&ye{}1^%b#ֹ`Ayұ!cjV9jNij=AͿe4w֍XnhOz;U6W_ox޽6z6E^d{I.["@E %qS 8D{1/W+c-ca%Eyȟ)s>j!}u5jއf\{v]Ke1SG^z߶}=q= $Srh>HMˠ@,=\cS*fТ ;A~񹫌ߚ8]n>?>5bJy${ݽs@*U{y~Ou[U1SmEP>v[TLF%Pz$38 -z{I,eH tYTlq+)w`%,ysܞn͞Pwz,ۈ4"}L)Q~L=S2I;u|!+Jι96dz 5׫rMu=, -rg%kZ6~{0ۼg5mKC q_z޹} /իSẊPqm)0#TSČkq5}%=G> OKߵ0]F~?=: e#uW+yMK5|#9{"6,l.]8wyw>p:Hq1g/h"5Iɞ;Al$EEvH쎘l0>˒L$A1%۾}UXU "Ӹݜ;{Bj簠|Lz|~o> y:dGyGa >p 6n5=ZzaAE̾ #v~ =f9a7~#][&ß!z?rO/{W Iĉ2Wmuok5~W@z 6pm`J6 66z9"?]S=HRlWy? PR``є-8l[Up}GqM:u瘚I4!eP|JRNuzy_&}cJ[P@Z+98z,N.(V'z~|B982Q1G*6 ("feTn맶ZAU`? Մ֒HT#[CDcedv Qe8̾bc:x;I^^C>ONH"e OQh`/)hU$-nR !a ip޲rvr[vXɵ6`ɺRF̀riV;@XhWoZmT_/-`<}uݖE7n,j"[D ~!f &}am[Dgjۥaoɰ֡0laxB hEb-e1+Il82Lհ)~M(^v}x1g<~w*J^3p 3'$fD*IOc)HH@lɼ G&5hd(ǍeBYWb:.,YF]t VUAs%dHP7> A$I).DL; ubme)X&'-oVGW"_ϕ|iQʩܿ/r~:6#A?16b,}ܼ(۫y4/>oxy& ;oԨC~)?=>{Ww "l K}+0F\ WA䊒s >1cO‚쯆`!$MWd f!, i`PS$JN*-[dQ|e||u w/3v*-׾^Ƶ 4-|}Qb2mZ|(OĠ)F~WT6bPZ@D B{ȡJQh}oU6 *mz`Ă3Dc,X" ,Z_.;H\؂~'׿]xL֨@OJiFMJ)DJAR֠lQ*ŶW |A`MLwURPW_ /kW/튊)/64mj+B4%?$R")/~">eaClnp;X[XC,S(Kl鶑$@D Ԫ]O:J6AۙQb,9~皊Ʒ )DqVaa&6ܾ:ɵD}\ҌF/ y1iq`m@k;Q'=SbƩk82Q- t@d—_SZX-bmgrJSqv]ziYkhc|z7}6U.Ox/{K.cʆc~+*v@YHjp? u$k뇈q^jR|y \qg3;P:ZqI] a95sW*uD 74!dԌm*;˗[yA5qma1O52r`ʰbHH`M0 6ɿǽ7ş{bD|SҢ5 ' }XYpU$$A w!p_H! ?r􈱝vMrBDoe6A? X 80lА d1p*~{^Rh$ kQgJi 4b5_vVːSF%4]`dS4.lB MہQHڱl_oh}L;{,Ɓf/W,QSo;˔P/WKgad;!PReg~LO=%e<}@w=@1}ۙWd=va7cn& ]9]htEV7rXڍOKqzfvcqO]fGb^ MyHg^ 5˴5GWB.鼞cbѰ=  64l, ByXCm i}Kם9Ut,$X8vv{4ԡ]-ifwoz4lv L;'bnC&͒.PiJhީrv v >4Dl3Jw\Nbma9G6$ A`Prmkvp䃿O$ Y" 9Y{"E܁wVwdž˷&d=_װ{C_fcX j'g.'ܼ 3[zCvJmޥgeQMƔ3NgX7XWnedj}>S'}xK"ixUp-n,fwFb'l֗ kO"D5]FLl$/MϞͰ2^#v^:U-]y1u|ךӃ%&b"Y{:Mev)EDvi>{p2=kudrnȻtjV+㬻h hHͪE$<j{ ByNtH/TNp޸^N*k쁒푄UW\fK훊 "(Jky".xv@o}|wI[wċ'sh" 5kڇ2]ِW[:,l6]ٵvK'淭U}]BlAlm0=T}ot3 hJcם+~EhDavtgV27bee--iOqD 0ƒ mL*haꍠȚ]10YtΑ#1+*,TNDϨ+7S튤Z^Դ@ Q&sٽ{1qhݳ,lFo2j>y)sb|yz<&Ug ߏ|d 0d^s)P_=yvǓI'c|@dS " NC9.FHdYy I|d?^N  %Sf`"#@% RP@&@ *+HH 9 JЪˀ܆ JĞתt.2u >ѴBekSBW(/1fʤCͪȽDtͶPsMMղ~87Xj'L^YZ'i:Phb:Y"Q I!QmFi0%:爛R2Wd Ř9̽[a9>~E\ҏda3g.E.#Z#;nX"[]))zӇoz=88pcwN_eԽDF`7םT(ds|vGߘ<{5FXa̦EZ;3 &C}DK1 r  e8bzv^8Sz/9WTx$2s%jk2kc$[f""V$D8sKH3W&sʢOzW/|³H/{Hzhק/H5pȱcDmh9S32|vdBK9]o'\{۽ C5&nˢ*{_y??2*9Ҫ53=O'Rҋ_k)TaV[\<3rv- g16#x6e,utBD0vCmz#Ħ K !f#PcۢHoJL8{#P&!u}w?_QK`RZǢtF ) +ɍ-8n{.K ء+h8&j~g rݬNYo͟zv2P"כWFmJbɖS}jk(Gf|Sm3X4ՑE)+mmKy7F{K<^&x[FP#}o9QoEk*2T̺d^S8S /kʆ((6G#dr ! 4r%)2A@Z־Xe90)rM޴y RmW{8¿'t)5+Jd?/?حֺz+Ȟ|l+4XZ.gvw.<11SA5:vĕRJgbݱA&4Y*4j,m)5)d ƋQE#chشVFJMD2H1Qd6 )-Ԇ5b؍MأFEѴEmcQI[ 1 Ũii LEB+ Jd#F4DlFX@v];?=y>o =#\5[j.mjF$tYvVڏ-7K,R Lv%ƦuE$16]ŷ^VQ.dmL&HFYmЕaq.Beեñq1a {UVʄot{bL8rrgYɗwVȃbkj[=fkxlHOv>. թ7׵MمwmcjL9wSD6Lf6B%Pd.3(h*)7qp5xQnchzZSC6֭B6ujIzgɖ\8uib+JpVV'D%ÉGK[,19vp8Uӑ&jvͬ-SgLgby޶ ޳ϛt{ͥ֘,.Đኣ!XFSﱞZs(%teYew5U2ikm=d{tIklhky Dr9LW\bGUX˒pXSy0M67sӽKkfau-.;t)ohs6TۭtZxYv.blrˮärRuJhSt$s gd*oLzwgU4.4V8&hݨF) H3cmQwVvIleBhB;HXIY -l*혷^^'oz=L6lbh Q:|d%ߖFlQj*i` *GV]tQ-DL6g1H-Fif4d qŘR-:b^\ V +@@mʱ`mmV4}O&Y!!}L/d.A>X*mxYwha6N8yBp蜊 ;ϒUyRtC /rϓǵ3uoWʇnc6llJiօv:9+fCtfBYQr7)!x앵m>oIz4mh+gk xmAV "9>׈O]aee^!XWt;O5 L콣9rQ\DIVkh,f1K% vWMzDv&OxլDfۓSrƂ](,%57*hv*Fb1땅[bg2Yؚwc`Q %fzƻ[)IvF6B&e;R34^1lJFmF-[Սo]l⹋&slݕ3RPD[xVV=ne9LYSmqsmb[ a؍X'5gDFťNa )'m L-Bֳ'sS~y,oœ2&{n1ڬKFƺ]+ z. >M792y,]-OmNUHͼNǨm)U˜Kْۖ˭{ [:eibGf̬+KeYpBv+3̕϶[UM޲/"hb9$ 'LHo&2[(YxFQ,QXor7TiEZ&v'(:D`B 0xu1X =-lj-OAd}+kull ET[&1Aqkja ;t/aEǖ)%앟֬O)}.bTcŭ8B²ͪG{~kKsF|<|ZLCO"Nר#.KDJJzSfݥR64 2ڥ!84_$x@ə:mA~lr8cvw#e=Ó rH*H #"0~0 Mq!j.PM0YLdcZHm$lM.@}36J՜,@Wjs*H![/d WckK-.a7edî/f$4?~F7I w01Wԥc<$Nr~ dlچa MQBEp6e"hX8#̡bfD7|"qSo|6_W~ pۣ$d9%^D2(A05"=OYor3 7~I4IUaL^voPca ;qv_M1 _jN6r[RlF"J65a7jISvE̚n&%(! eɏv]=ϷV 9Eو~kQyT+q#f4L2NK 'b8@!H@B)"AVQF*"ŀjlh-X-(m3Xض""ƊB5DhŊ(,lDQwz3A|iҖ&= ¥2715"v=݁eY@6w1y!KIVa Yg?8]R@ΛP9j(*M޽L{ۋUQI&]D1XZSQlGdb2U C>^tΒmOcG#“pmOsa^!YՌk=¨gr1Ow?]YO?ݰDϚ\Zj~N;[l"i?wYy/wszp|˥v?;sq6Au f{0통fu9yosF 0~YR'vb]d}^㯛Ο=7v _O(v'vY T=:~,Ѕ5/r,l o[BtLHaPf7};^~}~a8N|?.ܳ]YI[%/iNO϶'\t5z}ݏ{wMKf<(?f];i0!rЄD$B'%Un07OȆqs}RԅN|{7iG'4Jo[CTxV?w^ߌ>_^枽 μ̵ .͆ײwxx^-#]ͯ%mcw.zBJ/dlqxNrZ ~$HOqQX@ f&Ȁd@QVՑDK1U ٲfɻ9*&t B Xcn&'ED;7e È.Ig|'EL2^|$Jg=AxY& T[h 2X*?wO=&@BFar8 ?xX\ rfMkQZdPΒςOU 4*.2Q6@ PrU@ZBC9M;#WmNBrӒJ5e(M=U/ HNFL`/WB,[Yru޸Z?:q9B`ǙK7,3w[{vv=#hlϊ"D?䍮yWv6tr>lP@JmHr%tZZanxP9~A]W|Iknᘏ‚I'v!@~GU,ThZM oL鱷k v=}JٰTqX ߎ(@scҹ:6ѷ+hT a)=3"@AqXa=H^-~z zp@x^w DcVD-ÀlN}?>׾q jByf$v{[ګlL65cg?wǫ4iZA6v 0^NN2wL8?e*ۄLs.4TRQ4ȋS]sLRT+Z?1.[䬩xfYiiykĖSLvb-(vd"xK0!i9Bn6ħ{{֍QJ(F ܰz~- i0fNvȱBik10Ht_xNH$̈ X 1.RiZd`0?%t.SoNNJ eCj eP,f<䜯#StC0fD`G/;l=duX.bZi aHA@gu]W̵^s8u-3GVߢ5ǫ3sȧQF"GrmPS1lWʩ ’đL΃|g4Mxfgo0[;YYo,>,.5Ӱ1sEFk&P7!3̚J39ez7N!Zv B c?-U ~"~t*J:Hs9/UC=n E!YHa~zBs@!"t?71 =Ҧo/94~龾l?etVD@r"2w-81E$iy+vv1xiD4_ ?u!t={v)ˏ =%4V1i"F9z,EzQ(0䪛q09?2a_oA'FGg,'A9;â*!.T:@KĬD!ӻٸS0$))$3|w?کn߻_(81ۿF/nͿ[gy܇9/ ڿ?#O?ͳs}Irm)FAdgxTÑX?L2vغɨx?ʦ1cvdKs-G޿:dťf*j y-R$Ld \0x;dpXk /D8̄e vcXl_H)Fa@Uv2*`Jf& oQ6j7`el!Y=ᵉ&BB]۔{rYrD`(bBC; UPpw_{4evX* 11<.5*Ai!LVuҢݵ:Xf|~3?YFTE%*\B!ܳ f?.S+\.xǏWťoxÀ:Lοb7Pɘf۽b/2]\ň$] SpxL ?nGMT13+(E_!ܥ<0fOwrt A%}鬝 :lCn/㼻{ﷻMq‚LHЕs*c)ZMaR" I^dK% ܪu#'ؤy.C$Ϩ@^ rbeg B. vL nM 21 0 ˱{͞8H"MuX3y&C+AZ(àn@Jr%t{6 _4v6bvwoy:W{=}D e^Όg۽sED. e_{44 ٟb\zV{oKv5{uzv`j96eAsБ%+ &La? C:M($2(F/Ȭ>N?UK@bʲʚ !-F&?!e#pr]LSP$nEɹHa1fx,!B$Hwݥz}}SfN^' sHBifMrD\{nA wWoAH&d1c (Zi܋̓2@ EbznO{mya>[b}ە]h}UY4^ܒ/u#TQI}Z+}VYݵ~)Z,mTcF׍_>v2sk&d^}EW4F Fهt*HKFbF/wݮEcl^YOl_ iĔ{pLloWoDE?  4"R/ 'B(-FiEEEM\@GaR1QU;WEB6D?Q `_(#h"U??QshjVmUs"?n?ѽ41+tG1ƲKaڹA2$[ Rίǁz.<{dm:"LnmDC;ae8Qr,)q,!>RR,Q'Lqifvy qlN|ѽH]OwN '&UWn #O.|22]1~Tή"(nʖ{AP#pz'm2BY6,>X P ČL\45F'SZ%kNf;g*= 븫+8vW5Z:,qgidX(9@%2"|Sdiml2(%h!݈Z[/%0dtt.mhq+y[MP,8ZW[l [ {G}ߛ;9o;oƮ %qS!3c4sRa2y^--'G+ylm>5K9b2/)|j}dv^<9o\wtㆻ!|;u.&d5w3ݞ*|I=>m=UŒ&{JJo//ZH0a|/2^))QHҫ"/fceL-u-Fdɜjyy}ϓԢˬnQp%Jg T]FAt*wC q$m/֝ߛvEi^礿.,}j'k;f&7t,-}pѧ3LKmN׼gIFmTuk*Y(P0 ¤Yiri[ZX~!55j1mgC9Bvӳ-[;0{<4;94[m&+Uشiۉ'L;9NْYJ5ت &YBWBZkuچU,~TۙboYw?m>ZQ6/{B?ۆ69h؄(5λhP_auGth._9T/ ެN.?>}N̮AwågIbB 5j$\?}_|/vݮ_4ǯ <{ZE` %y(7Ki"WNenT܉S 7ǵsFx̕p [+"&AJ7'<. 8UEFUde 0 N>=Ѱl ŐaXXQ}*Ol5#z% Բ-,\d{*R֣)$J%HľRPD˒gߊ3S?~י $k͓߮gs#(% U^랞$RF&mHEklOrIb{`ۼCI!YBfEIȟDc + rcRdpA}A+ɀMLS#ac`_f{~a]`9lJ@oZ8Ij/o@qutrF+Y}?M9JƼR tæ_|,y/\ `&=%wo.a_Ӊ}j یUCa˾akmt* _S~gj﫯o̳ {%aB [a=`ŞD#7ן?j+lCHW>]vs-&֓ s,mōHO H vmm \Xt@6`V\6oCZ0ld^i+#aki6ibm`+HlV6B3b9$1etLG u0On6Kuy7I\ơχ{r!ȰbDZ F?PerwRl'~`z`|Y0z:)]xt D vk*CF{,zrB=@}8x;_ 8 1̬}Gwl]cL;*#NActaPvպr@guk|8RӇPv=0)IJ{Z*KYapxnIۡ Vg,A"Qt,|" {yчIYл#±M}1)9]^\7*$XdܹSe?i0Uh@{n{b0ȋALC̽1% LAtE3,x/]ej'C֜8S~>O]|ޗc㡀C%!08``)k\$/"%$H@\gqAddF˄\^ȲX -|D M-$\%DE-b`/BAaN+7 f"6ul,-B, tഀ_x{oETQAvvp_Ogԏ¨>pHtmGo< aXBfD{bꈒAo=]֏k9E1#[6!- vF 9|L`e mg&o6cN)BhA;1x"qbP=+N H:Ұ΅ |"Z\#zhHOlyJA QtOwBF:vsUԒ6<:.`k9 \mJC|p:-"d=5dRM2t!,]!3ktDI2ޤI˶3 /]{hK>59)ZB.`lXZ9 RwꉷD}5~q |Ȟ@S3u@$ r^G1+n}dAm&yսz|Ug_33O?hۘ(a/wH#]I]A~̬10*+ C7d0Qr-8@Tr4kþȰsh  -kuEI6">86,R9 :m=:c4o@zCAՏu9C!~]@;#H!b6w H ~!3kT0Okq1X-Rӳ>E b~3!+7~d|:e֊}huRݾuqĴ_$ǵ,G:>:^USnz-?N9_2pלsX|ٮ^9r0,v}Q7|MXJiY㛇=f2[uFHe02%ټJm#HOp2@)>9pԡanZyuӡk3t G:h[|JkE4Nn핃/,ٵk8!X&ykkMaL, 7yrJvn9ú/}@햜:цq9ȼ8[ɷ5}kt˪8yWHT@3^7J<tGzN* 06(=6J_//Ρe\Ӷn;Xmlw/9zʕPwr2Q|ŮtKٛrd9n:ѝH `!EodH#N7I^yU&3Fɪ \&L@m8/q FډC;LP@2h4E@qv?69Vsf.G+҂"jv%|]i <9pa"*ls/\'_u|  rl6,j*U-~v_Լ[F*ƹkrѴ}U@|\c[6wVPZѢ_utI=V-F,mQcEnb*6mmoۑZ&moU^IQV6h*C`ۛ%FZ+A"6Th&#lZmbmM1ţmѬQh QREb(2,cEhmZ"بѶ+bjEEA +h,Z5`mW+cj4Mc&kFZ F-b"T1 EXرhب+&Msj=7MFb(i1IE5RmEF5h=.^ܯֺ(NО!J9ٰ(nZ v+mPl2[`|=%©"D;.k;t~ubZEtqmT$%|vllA3T MlIIlYjF~_LJh1$F_< N6X;J-~O$t:FWlãF|@#f(rc!-4T[RkRֻXB#6]\m&m&-mLq.QߣbXdB,yV$zh2 t-̄Bn6?1l]8!+fS[VdR"G]+m3뽍-dbFΓoQ-veW- ןDq2FB(>cp UqSk͝3ޗ.n7}N L"sd'Y1{ LWPq9W8*!7 ZWyD܁'ޛ:ߴ !bYwy6ٹvu˷GOrԙS 4.iguy-NCUѽf]t]&5`-^N2pr9dƍ& #rURTŸX2$xl NM6$Ou}8-(wlզ\0@PxvYwn-#u9][_gRnlWDE[l7Z2D9I~ZOaXN$ 6Ѣ=xk cK8^@zCi6~i-W=kWX܌v\ 6[.baѽaFIm 4[*9d*M*4! o XRt )л*=(tlL +ʹ{󧾐]g7au5؈vlONub@mk2~a \rm`6jKY_"Z.iT>6$p^髎 b2{f1m J!}j< dzU/ɩxz}8d7k_T?JTۣʼn;ֲM#k٧ _8Dž]~S豳{ۿ}|" _]br&SUɛv+`8!뭭_qxg Ӣ)e"XK/>Cy_4F]bLY}_x >owEU";+HDbhl %*fjE!$KEmDU4YhZ(UWP֭4ka+:F@Pi@ŀ ut(룡Fsтk@5uvH]`i1v6[d%LZlAuu@U Ew]0̕B)R-9ͶmTH e$H&""ѡT ) V; ŬTDWZFIE@*QJAA)*6USM PRH[eZ4AI*! }T'f*!I)(PP (@A"E@J@ J"$AA:}hSh A='i*D*625[9,-7, O$<ˈ-YT6po!<%D\E+|٬Bڻ^PpݤތNhq(S'it>R{e"JUx'/oXmk9+(~Ѱsjrb :j+ y3Ejk; iAJe0@Z] 26>9ZiV4XZ,5U;NLo= Zz:‡ ш( r6)jU=|%;Rq.Fa^oMR+XW@.4.cK(Z=dcKlynh+Tݡa0d"Czx#T>]8'Du~ɥbƒK QGP9Ğ+|n4 ȉ XwŪC+<& 9,mtU`5FȲ*$ ;c'X }iRɀ936jl 1+ ,]1dCȵ;PCx Hb[:fu\ijAM EJS[ܪ'Q0#Jٙ jW'Tk#@!M,|MZP<(dONx{_'r)ֆf/42 (. +\Lڴ8t].kBH#C@suip<<Z- phk@\aĸg( X/Gd U=yUgLj4@mӭ"0ZD+D^pS !>41S ) -%[~ngoU3)Ŝ"b@aE-|L2f |Y]dJv+ M/8f&֍6`H"H1P2u0Zei6o.WB􂵄R% [SlhR%\5>`6eB Md,zZJO[^%w ˝CFQ1HD$:߈8V]T,8kvÊ&VkE0e:Z-0cP|+0H4/J2A@L7{uS/gkZOv$鶾YVـ VU$A^4 pT\5jf[ҥuCA9oT DsT*3޲go}nQjBF)Td.)9(xz5}(i{3%,ݤY@)d+B}b4dͲ{u ,. QS&ABnW5 M%4MBfTQx;Lų$3`$vqAT(2 ֹ;kG5rJ2KO^MeTRaST#_[eߵpQ |yb,uPIÏ*FޝKI$$9ić8o3'daM,Ax\Qw녠f h]֓WY7%38cuk2AAZ9s6Yϕ~ut߈u S_.4+{$5(({,qNmoz~"7 32ApV~bPH,^I$v`_3َƱҀicE} CUW aiLiF$dGq'qJ%cu>jQ$|gwܨ"/@\x\LG<V#>𵕿<[l  cR83%S*M-qnftPtiޣvwg;۬dnS!ցzs7FZR`iLL53-.b{z.=1kvʤI(vYҔ bS!L]9.ٌr-ؾ 6}Jyu@4XF nFۨ9̏]uo%*\:  !͔uG2}])4Ei3b62PUH^Ux-Jjѳ7pJr5IC@Wf!X}"aB]"9JM݊.=A03 H"bXPYɯzXOerռ ֑ BJ$ܗ3:s*pXAhvAs7w1eNA苡 yywEӞobχ>D*Z]&T(%M8'afZAMLmn2`,]]K]R/,Mc9U([P-LT rwY o͎> V.X*R.?-Ԏg9 F/NM;ѽh$a#'RHxrUJIur6NT%ỘJtU>$hKJ58s7£_{AL> ѹG;Js}DUhūrC6g!cSL-bxʆ.C3撈ښFplfc(&fkbMpYhq+h%Ѻnغ\hWk6{Rf7BVue`6b$lbx*G ̩9=V9o-NcTdgtCZ:'_S[.V:3\ĈcNR3plZubW/շ+ ^e^XhʋWyW4а H˹o*pou 7WlO K Գ'LD銘RʷxȬoP7*{#J aR./ֳÈB9^/u'Ea;.* ØT9(0zÆogV;2&Rko%aH+ #'jS0+9 ѓo؞pq9j`0L]]--R:[ڬsfH`~]$R+9 2 e-7MF4R4e$RE\ שbUU#T70Dsm9D٩6L,1/9;o i;^6}Rm!1P¬9U,UшƊHVsںr|)JPyA^$^Rp 6N0G#gY,im!lhAh/_'X7U\$Ha۰ր 8oR ˱i mWһ,3ڿ+9Q< Ɛjl пù\&jAӻ$c~q>fqӅNY 2"s:Fί#0pnbңވ='B:w(-/5K,5Q_J%18I8̷5Gq R9xqňI ,`)@PHwHcWIQŢU  md;d,KF2tປAh>% ;p{︬ZI|sH[k98_Z' <7uj۷C r ƫjҗEۧPZeRFPQeKڨ;[0eaJZ0䚷oy'uF@`*whO6d@w{5VgK Ł/x\?Ί {{ V7"V޿&_1$J&#i}EֱRaKܑ;ȭIg>8cU3GYFY0n{qW',.m#ܬ3VH\5-n2y׾Z(Q9[B3oݲz£ԎG#zb_Hѽ_S4Eys${W(F( Jj.|s6M!E'bT B0gPJk%n\'z'pb 韾zbQJRR9-\J3faȇ~&6W9URUXU Wo8c.4qba\ʘ{]s+7ȅMי Y7봵GʍYsQ0)ٲ'ABQ^G=NVd4Ԯ1Ji ' &&rzQɽG/{}|N(k0b6޸A"ՃL:Z6-*pr G-2Dg\D·9V9:DZoAME5퉛n82Aoe R8j7c߯Ҿe$( >b a1Md"lwbD1gM:,Ehd4.tq*hyPFD%qҦZ @|_z2t{Bw˂ں%znJ1{ Oo}gx2\1hjG y<ݛGj@6.z>[Z}&9FXkOn>[[o4sV`n)i!bCLp%40Oɢ7)SK&tQ&N ?ڙ4L 9@V\(s!9Aeyޒ o`*oZ5 veMoPʥrSVTgXtRx@Gx垗Ѳ}>X"w.r #ux ΗtFr-:R;lzW=qʰmJd9Rw˴3Ve(29Fjo T{IJ8PO).Yռ߱PLkQ$:Hw9:Ȑ+qb=md$v_};2`,=!Tf֟xHDh3PaBBej-Z*tjהF3~KR w7ZtiduWm?SgxE|vi4y]:Aָml摮8'u7me֣Wfr8Bi{\I]U!G%)e!:d^7a!j'[SVt,:OQWnQeiiI)EPrdc9&n m:ֵ;~kK.U_|Z:D.?Gwm2w9VhښnCܢ7\%ߒc}R ~Y+k?_ўh h3)_n}vlĠ|)VNDUV0+{S3uVfY 8]~dak;ם2&摰 23|!{2SG6udqH#2rٽ}+H'P۳z/zP02Ug4b\[Yt#35<(KŐSu,oeח f3bߖG仫-mَ \4¤}iN= WʽQСnp΅ cP#[\HD~ړr҅QɧDTY|ۿoV:VWm9v1 ;9U(1`WJf,UV-zyFњ9 Yߺ &Dl= N֏{FW̘pS̿Qd4":-wu :'k+(ۮX g5F EYK\,,H޵@>FȳZNM:aJ^h 1遳8l :ed9TbG'Sb>RPBٌEȥsϪHiD%(ĒBќE1̅|nR!HxGpiLi5;%({|'ip){eN]41UUCdfAfF B e(r$aMB?'5֣*j紞S%R[`^;gcC.T?T2ꙩv/koOUH;3=!#,fEYi% -:4Cw /-'uYw6FiL|M1(eq&-]H5J$dnVU*'r v ;茁ѧutH#A´1qL3ZmFJSc栺iL{zAsq*o镝m/P8r޻6'" zu RHmmH[X\EMŨ&AzqXPl=6T,y G!%ZbfBe[4pBk̙3~/&d GL=M{+p #͍4W1I95Z]|w?<<2͟0c/!K;H*Y`tpou.f^ '(mW&l={hS<15-Q%Rjϖ;\U{S1bG$uW}_.܂Z=(Rv\9[ >.ܩd ˎŎv\ FG04 4& ;Ё2 UbY_0 ^>C<~zrC;\73O^E sTxP<֤8c{{El9=[ě{+2a$׻YIG xj95s׵6k'ehmVy,jn7,)[4d- D \6&WN9G00u:AYrG-JZ] 969g:4!]`⮏  ;]`!;c)0Ru8J.sɍ'chjtvN\sdb0-,nA=^!Llڍ>^NIq ܶό9ZcLw&wÖj=WJs{TVF[#PH$}AKsY ԐYV6jeA rQT?=hMhVLRFeMg!䮷sr鄐z&W[N^"ra>ӠAw0 e%> c8נ>"$>_eJo /4 Zk{hqUśRm6ԅCEw2,!Q,xC5Zfnpr@Wԡǯ 1y%Gߣt:ƫX#r)#vc utXxJ.U) YSm{\J$9d ;6_&P5 I0Z 39*e(;C ?A.j[=o?6ִ45 h hh~1W$UTc:KxB3rLv]۫Z׼4#S$ "Z(x@VM .*dbTvə4TM1\P͘49a#$':KS3E U-OWXο~{Zڼ: 2lj)IJ#tXۤ oc2ABXr֞-f)v2J]hp!vqe\G.yGDC#HxhdXL%D3I#јK҅w+fxAV8^TOZb 4pJ{EJ)g5ݱ.;9;џ${ʷ; JuK =TV~tx Q; {O>>6?Qx|,YVShJPH;|pUS3mf $ux|4>S_gŮj-|?grOkA:&J>`A@ZӞV{fVJNp,پm$"h;žzpiLL:-mަ[8 s.72r9h'}QN;:jO8ĄNQ2,$v=Jzv\:O֒81A##R$o&H}a=w^]7D= =yK0 0(ɈhSdb-[%%z;-/ 9}6 3Ey״ٺ2ld '-j^۲V.T'~s)2>}m}}?UDgͰI}_3eރ.Hyl}xMڹvk({wl puJ|V\հȌ=I78!p;J9H|Hh*KY7T:8V!`?,Ah5km::t[Yɶ~lR>I|zD5ggo;u9yLm}Ruκs&nڨԳ/8ytHjs'f%N=!,TTKVQaUFgwLʹ.q1jk(wOIr Ȕ U4JFIdFߛ!uuY߈:9 F:wˬݔ^epJͥR֥=Ŭ"HֺPf۩qƚbgf^d8rNbHwR7)3Ii.)-gS\ԟJ[D# 1:*\ sR5h %K!{evSQ\xUjI 2u=摂WrE.^W'=>sG+u+>L#L WxF {;@c;F"j:6"N#7q]Y%g']-jmpAo?Cle{U-Oy>3iBj FHAوI =z(S uMltH7хTt2[wcv·,B5vYm"[UEZ|WB錡@=:ߝ{~UuT$R[)eaZS jPYhiFsZw}&O g, @8N) {  NQ\=bۄ2wC,on'lлk>1\\{T_.@ȽjOݴ|bMtOU{VOҾ&GkSuw53bQɞ?SL݉~IbfCx?NDU?thL߈g ʪ뵒 pA$VnM 'FYRKu+8|/SBvpVyx;جzb+}ned 'WS\DNhTƑ[3%wfVʮ/)sSlԴ#J_\VC\|X+G\37:h1۫Mtwzs#k}BZXjngfȆӚjRRu 'hxp-o{Ѽkr]ޣCZ7r">76Ϸڄ7?R'LW K]rOԅ9CO5i6 \xrgȳQ\X,@ p0(>uL33)ЈMPo}wFt2JC EU2ByhN u(vQ$"|Yp]6jgJo>("kپ'{nM4O D.4!~Ը1 i ,D @]6%pUt0h #i uX!Iz_߫t>>4(%̥ Zt*rn0 (82PcSШ8d\*͌;o;ᵻz&rBhqc39͒FxHQ=H>$%Gz؊"3U^E< #2Ԥk5ya}==?)DA- !pZON7\l!ٓ5xu4Q:U׾t$ _POyrܠu6oD":.*']S`ሢScPD5FD]lczPnifӵ2zt$FoZ8Kjĉn^Y)3V٨zNmc 6_>;l6 c$]${!ywE&&f9?ʽ݈p}Uc˃YQ- J&k*cT/`DV :ꑑxإD!xխbH[q4+m vޢq[K(6Wީ*ܮQҰ.o>^;#X-Yeh$#yvU[&c?[VouX i,ۗF5̨Rzeؿ'nIZ3Ѝ޳I `<:ĖŸJ@&Ͼ+QyRޘYMjN\ԅ= 3ȝd-)DrA~Df> ?x^S8,976i6gܺc|{gԱ'"L(C GC9imq0 C4N{XNtmi-zِ2KMuM=_d(ċ6MN$T :p:Hpr:4!4{{h 溵J)uUsE<Ⱥc55!O)ވT Z^xCCMuI~tw-d0̥}7~ݻ`ǐ^c2IT}\(]HN5+ʾBZ/c'# H nH=ގ0Y- 2O맨}m3ܟMZ.KET\QMA}e ?15}8q蝥甚xIG; >4My؇*e[:qYSψU7%;q.vη,vG: U 9Jq2`Ճ gUI~jBul uwJ39ytлb=Q%/lR4*OX6@wu7~]OTUeK@עA’)L~V^ag\ާjx9!՜'Ifsfk׭}G9Y2$>5%'WnTHWw&!@Hy5pHss~W ;X.d=[UbY'o#l׷=MIV(Ioø^hiUTiӏ!(>25DV> z5 r߾T. Ю" XքUK@` ˡ*1uYAlnUjlh$w="=U7[ M>M3馃KuX7!v}CX7_P z!{ Cj WlVA*7Egr]"an!+O fWiѡl'raB+Qn֋50i=h(# ۛ9xU4(h;'S7K(>[=hq+6C#GF -K៫c\2O#KpN`F$q=,zЙe7?:}K]ۘ=m*SE2;l'ܵkS|\멨-@Q9rn6[$:Ϛ kWU97F&0aM6v_(ګ6hi{vm}}saͻT XP+ik%aP ܀Ti6RF62/7E+SizeY,[3/ϙ ۗ{4"᝽]qc]ZR:@QPpm.~1 yp5ީT6?w~d!!5p;P~F+Yf>4ۓ$s^ Z=j;離qyv˯FʙcZeIk.V\a}oaLd!.:K$d#bbUI陘 sRKn]Fo=[^& !|jH.~k \ njm/>Ҝ$}YeX'GVW"-& &mXVD..Ǻ $d;{R-{[S1,qd;="r롣.%`r_hb5 +]V03v"b}M@#ȶpU(ReBb[r{~{z 6K?Sj}s3~bD}Z~|EGf=]3w4lFϬQDp]IBVirLJ b߻8sZn-0_Lq1?.XrkJYDWa^C!M D(Ԋդ:"o3i缨aEf3:6T -[FB;iw-%mn/9CKCX n 8je1̙w!"ňoB`n1,ܩ?hnU)!Jg_) 'lSI(ÀM'{$S4{Kȃ*3A`\LNûL(*j;Z|@$;5(nR ;Tr1e*UcN9TR"PnO̽ij*i]IWeɘI2ĢH,2`# EK"7hX1 !{:d($SP=-u`PJRn%/8ުoʒ*Z]V'[甆vO.ɖ PĽ3ltQUO5(4\̫<FCr#%D\Kw#Dܣ8ޯNŴ lFR- '䣝4fS%(fX0.ءEc4v9Pwmv (5)4PqF~|w=jѕ<`-ЌU!3|.Z()313@}Rkָ) .LT[ɁB0 @M=Lu-B1>0Y-@v?TxZzּ'88Re1f5P0&32#fNM-r+&(N U$)ۉ!J(hwJ <^K4(b e̢FVl0<.FZ((7ZE]bgƥdr9kg =ΩSqtX_S[A~Qz֏#ldVݐ{:-ۿ:+GەZ6 5/; I˶2Y (,b9 <JA\Rwk2To35فc-{ѳ󹊤o0rY!ļ>_ۓ㵻Dm`M2_fBl9o4aOHcJа22RLF2aCLߚqR[%a~՜4=爵ZXltnMɨbqطI5T =p{80kfU#I(USלS6sk!]N:j2.G˸7V#,̳V7[6)5_q<>*>GJOi2!ap[qgj.U0!Dr^% %@@T I)*>fӇaglPxӑfb?De<}$_t噭5^d!0?-+38 j6/a$F :}+Z);|J|5x <<"_Ԭ+'(њ23:Ӵ6:V& n>SIQD[ڧⓆ-o)ܾ%I~v )xP*)@'HprpI٫ ٪( ً¶DDʚVl. ߋ5 R:x[NiQ-Ю\Č &5)ۏ%K暣y)dֹ2+Qާ( J&ّ!/w'g]0m2j܎;? ޯX/5UBA#h\/6^oUdk+j-i -N4yO.Ʉ= ,7O4 āZf ]w^j&"aߪt}/?'L#& ie+nczHک}mtڋVloR 84HD3xM # -0IR(b9RH5c!)x~G:T0Z`LOϒE~hSH8!4h?e!J,߭?k AB$U_{SQQ% p jyǜ3"($/  jh H--(|X$P"T[CB\Ojnj|Pj&tu0}a)[ sɤ%T^q5Ogi=gffh/_k}YڪQy7p=9,/ L>\!~9{ !c$m(d]:Fɮ06nj?SRB*тE `Ϧ,+a^%:Z1q0Ī0AWW$3v+]mRʢt- A"gR ClvqB'VDjVSTw7Z1*威A&egx]Od֓n4ɂ`R~*# w'hqDw'˛|s^mқd+"7MBNB,3 M5G|̖#Sj:pOEf[njZbOvcJMzP3oCEogR ԰NwW+r7/:Kb8c6CRT) UdSg B Y1cm\j]tz 0yNhЍc#kLQ {)&LH0j  ԝ%G)iڳ>S88̸}:8(G`>z#MT#qΥ3V_ ~k{ɗxQG5>Ɂ9Ə#T-D5 ڈ6T6~`My67,+`d 1+ nZ> wn_Uzan7" p֖5}4k0Y69[tWS$]*h iToKk ua:iFmbLαeNͨU "_$@M]N҄6@8cǝ㯼saT})!ߥ*מf]NE-.,%{cd KXYW|Gϐy|ljuECqb6!7>I9彵yuf #x#; + WiAO1icXl?o%utu=bR`'ҥB9R頴R_߂12˫Y6n7WneL։A_Hm%sح( :?=:?0$uwkJN .?u1]vu"U>J v5{MȀg~$SlӼi"fsHw~{E>}xKUi\ޙKǤk0nLj0LMH$%e<O:莹ڕ%U׹/{B豓O@8e.FxZ$&8AQ,u@13YL5,WEBBDE dݜJك^rxP3=zS}'rIk5yVɲV%1Hr=@ڣ&{.HQ Gņ? +y/n\ӄ`?< 7h'kg #u^f+ZouGn|9LMQ ge9]\DΞ%BUDdzf?CA)-R[@E&ra9Y\Zmҝ:b1B `]/~7ǼR>VZ-M=2a5VޭSH.J/{E,j;ik4liCvOklڪ|O\+XHH4[ mTF{ $!9 EĦ=)Ԋ]mLx3D4ڀhv`/n¬:^DΌSRkV~U\66ZΝPF8wyZ%Q3̨cYUb1n_:&\fhh:zs{{}ѮҞh U(FsIi겛]a_uoM8_d KcV 8J9G V&@B4{r}OYHmk/ݚQy?PɸQrOQ鵎3Ml􎅄Fh}wV3-f2NֻOw8@ = /Z> Q5mʘVpIpf{-W؟Y\|אrh.Í; a}:7<4^Zrl4wpӭgBwU~hTW{"1ygyc@=Djbפc֣Gǘ\ִ0e_iQi62S0TLOiVQ'VvS'm` Lg,(E׉*Qn?|e L^LC-oVzt hwI!c^哨E%*S5 Rukڵ4 wĜ WWU}YrbAy>}oj~g[jm+q-$!԰/8mNH]Nڇ1U4.7/;jlyx݊Nʉ:^Rv/}%.=lY@c V/oqFm=jw"{Uy|bLa9%8n X9"(B[k ;{%;JG2M-|WXX\p$BKq!Cb"@jc3nf~wۯh% .7`ۺZ]ft 6 Seޭ@lhռ&Z*Qû! Cc@?^ϯT U_uU'znђlߝ CFZğٛs{gs:f1Us+"5+~8F [sc(/OxB#%o(hj%X򋻁o!BW➏d 9 -J]4t18Wc-x[z( ~[ST_@`anv:mݱ9h=WTUcԊ)N*Ac*`:^ˁ[6Wg;S0of{ʴ=+_U쿷L {KEӽ*_tH+̦G{PhHJɔM;wWA&a"*a 7j;YcCڂŹզwC7Ԥ0!l`^(K^9"g V@Hm(m^eCɜ&֜+nIeP( F׻ҏ+N6Ap?|.Nm;of/]6BSτ0>15 9LVq1Ki¹E~?4pχN}GT<2'-7xAIOJ~ڝm4c{S5@n[hK#$\ъOuiȎ"=̳5-adpi}/9c4Af\e֧}}f]d$|SRB:*:3};)Jvs?W jeiTJd+d={1p7`irIF GH! #fEwu̜BtaK&K P7y_>=j޷Hgiyٖup^TxZw̧}SuOu%F?T/a /3B߭ͿGȻ p̚ U-1Hݨ!*/Okٕhyb*׫ mUVASvO W q]<>,rW<|Dndlê7(@VL, (*A܆Wd-Sz3l&[ҏ=V$^ZC^,Fl\|QX3WAQýTRuDU!9瞒(вpsX~_g{{'~s?(|x ;Xgoҩ^S|C4濙咄fO8܌(K|jCR؅t*o* '0tCR?;:v*0*" WU}17 ݾEL-W._egs'΋([=F>K@[OS" WW}c|7#ͥi)o5gOl?nwHx.F9 5MGQGs/*&E(dOڛl|ӿ`lKWԚ>_1Iٚ8ëqg3&V;]aOC)UzN#p2h@4D[㈨y/Kx'+vP=$YLrUv,U֞w`&޶CY5 l=Q:`1ҾgimVܝU_}h#!i!c p,M-ST{lʌ& giWCՅc$[;F6Tv#*׹dWvFޢ2$*{ntÛ5>WNvkBiJ!گ>kBWҪd*~8q=p՗I~~Ou~?ߣz? I#4DK ?{bBNG5!]=tn$I$6 V$Ͻ3Yѝqv|2p>6VCZ)EE[ơwRp<κ@58lC=abvKe3{`Zs԰AlG|5L=_ -MRȁPn6N($h, ߉#TO8hjFvŁEU(a".e/1čЋ1#dD=E+ 1ߘ?Sn`BjbE;mhTU(>(!u,) <ѪEmK51~}Ŕ$^mf )ٌb)NAB3u#!J%ާ)xnM*P.z(ȡ N(udé1hxe/K7BFw4\]1zBm<2WuQ✉ ~bRVOo(jx;NunIL~>`?=p6^wLFkӌa}R]ΑVfł?zo'M)^dmMa>|dmeP{uYly}PC2j n4mB$W0oSpKMF8G{+SAvSCq#MHf(u`|ռFbvY*_mPnj(}lgP`B,nǪJJC.)sl0efTç!^U&`)*Ԃq=]r|Uk1c:W a n>85/ωeJ^FC934VfViN!RZ"r'R*-4Ԏtj5*(u>_[ߺ шy-pdNGښ3V;6'|Df^ ¥[}aB!@Td@~N!ЁgQբ\|r ֨Yh@:]ήd? j_~u $R9!-I#A1"]G}٣af]~zt3|.@ȈwZ{vہ$ "@hvOkj;)b!kW9 s{q-~ 5k%h찐K ^OQ;H @֫kpAK.Dԕ뭂D+Tm~ri)L'Yd5S컋4XU9#Zsָ7$jCn,~=D~ojʹ;18a\K<'`/ASTu~q[Yi ޛNy6EPsdJ( 1`+\6Hw-o:y %tPߋM4c؝ٷ CmtˋlNjݓp7%=Y0.,qf+EZ#y 0 1 Nݞh90&%:PZ)ՒԱC΂1#}1dQ- /A $1kJoނgdWQT#ݙY~>1ִ-I8@TT3oöNO@Ӟ)ESeUfp]|\lXjf`W׽AWRSX9@H&B,Iܱed4#"kXb .Mmx>މ^\x~ j@ɇ/0n'F6ΈN`[T{c_`t]w}KT9o\iQ7:KMw(|mבlҔs᫜.ɛ1ѫ%ƕו,⚲Zd{@D/sPv JVFVW)aN MJ %QT?S#KKYkRV5T`]٥+S?{׷!tNpWpt^M^JX9 |eۗbYq!l"*!W%"JueDt!xˤvzAV8dKr$t'Bz*~R2/݌c얩$;§ןo+N"x_t~wx>-yM)֔:w]ߓZ;_tO~5t .r;8 Js@i1^y]`vZ0{c pQaOZp!G^# !ye\|r̖s (35r(tFVV0:tsDA,77#".B18m L Lc?c;0vFJ{^,a[neZڴJQ"?ЧHLa`rm1A V1l*a#.RqJy*Z[溸j,f3a*2 hD`G`Y}4 в:p>zz쿽#dU/+=QoYi_ۈ괍]I溦C<}V0*^.RƲW~ѝ{Qدu-YeCJʃؔ(zʱȡ>1rF9MwjOM^r¡/)P >-lcR5̃ʚ{fLU)nȽl2 W.K@g] a9UG-}qw֮ Ew{  gGK83CJ&?cTSҞLmGKU{IEUTR1|רͺo՚׾TqJ􎟺dU GŨ C)A W!Ns!eg3.ʖJmR9+ތLPIJt`cdnkQfÖu0GI=w~t҅KkY hVHI'3B즫 ET¯ҽH(~0bA7{赜Tm꽰LNMh:֞iimw=6G]\Hlt_WG5.`vӡ4Z=@^Cӱ},MR)m!R=?Hk@HU , ~OE9$-x~V,Pi\bw#,;S?M_9_}QulOIe=f;M"VoхAC9f_ t`D[LutnP턐{jLE0{P/KVOcXݢ[sKne{2?sJptSI%GMÉ@j}Mf I8XҹޗRhyٟ_XQ*z򚽴NO-goϓ,Cn[gL]~XmDAU axiuJ U㒹(].+x>0\oSPC6smG2z#Ն-Z wVa4֪f*¶AMšWn4?.cP@·+ko#`;Bԛԧ -Pp .y}:XvXD'+P416=j -?+N5H7}xC_|?k!uSHVyLJ2B))"1GV$@„CRISh5ٕ4/vA R?7)  fh,P&6K9Aݻ`ެ;˿:ڡiJgYZQe'@` xs3\N(ղɨDS:ӴņhRGۋ.ہYffBs۪*fiwn`jO7y:!0Ad#JH&rGM!*uF'=Ũֹ!`g7:OjzH0;9ڳ%gbS}}p~V^X銭*(WwȘ`b[t*E=~6߃ޫ @E{f(ne?x/ev\%O|Xٷ5d ~1nXsV-k(_פZ. .آH$FFdsd# tdխ$'RliĴéoD "S+f`20YF5D]oǖ|ͫ2h\.q3X7;_`3mʫSV,&A o? C(8!iK6cs|A_ o9W6𗓣|? }4'T{|jgVoBElK)w0?W;0j $C;6ۀq.tCͪTO mj+SHd}*9hM4Enlq:e z SSvo/p]PS!f4"JiZW)<[1.:L){=!>++ _ j$ d"B5梟b6}5 O&\cwحǼ}7~ 7)eЎ?ˆ73΋w8UyR-[WS7 1nުa{0<_dgxeXmя۠_X#y_ Mi E;u}j(P1R>rSLd`>ɪpqa64BM& +Y=] NnHۆH$"iK[~.MT nHa&6|Qޣ(Y3 Z(baC^]*?1tYP (wޓFv e B%8.n[NX8 B~uB).߬ͼCvl?/@VYwr]'I$[{g[? ]x] .Gbtx,2v~HcfF(`X[sᆭ\EPo#Zb4b7[r%QHz$sr˅")G <ϱEٞJ 8܎<ت܌ix@$KDϛ4 J^#ԓSHeД(:?eM|W@zύmÑ'D5BsO Yz1!(>q\9u>Bʿ ۊ01I[FݻR4\J\&鳪Kv_m~Ҏ׬g.H—l} l\40=EA>LO 7?o}8Sbڼp/9Ƨ蓡LTڻ%-yA}uJg]~nэe?V;._ O Ar`U!f$p~j?ֿ!S͛dIlXh݂W%:\3jmՔ8-gL@[A`N)kofXpWJ W5ESE{A\>Ǟ~A=~F;~L#P]~oĈwݙwijPʑ?Nvs>颶jxJ*idt;<[Nڤ(ֳ֪ii(_E+%nH+=|d(NF0;W*m7]ܶcGcا\o^6-&(dm;Tu|G_áҮ?ʥ޾鷏5FZö2ARP0./ݓK??xKp/bW|^Fa{0w ~n>O=~)Kqq=}Oڿ~O~(ưy5?m6}q~xߎ>BsyǏH ,繏>:m}oq;,>:|e?=;vn;v Q}z "^";V;DШI!M(d,D!Q(ɔX!AQ($IJ1$dAidHd ̉),I*R$șB0FHEa@F"&a$LLBLԑ@$DBaP K &%H dE1$$HB"#220C62cS4lJ" J )bL4fh!l͙MHCZe& i2h$ d36"IB 0dDbR 2L1Qd14A2"EI!&(" &1)B (K6*Q-#% PH&%P)F)42"` D)3X" !bH&IDDFB2"fEDB&0d̘4$HF!@,54QI!b$2IJ4H1D&,Q42`FDi 6Sd"4ЈF!,@@Rb)HƑ!"(bAHF2D LIJD4Y2! eI(F "cI,`Ě!P#Q0DA^C2c cQB,bbhP EDJXɆb Q PdldHJDD&e$fRK2h#hP2hF 2E&!"iL""RB$ Z̠K0R,MS3 )""hhD3ba$ H J2$ (La6H0Q  DRd ""% (!1dDBi$XY$LQĊ` Ņ )L)b@ "*"6$hLIa1(̐`Kh# 1L(i2a(L e%[L ,(XD hlJCc2P 3!!1JaL m3$fdeIh$"`2IJ 0Fh"hbI(ȑEA40L) `Dĉ2iɁ&DɄFXXL,((Q Hi12F  "# ehDi"hSI!e,23$1f II!$LJ(#fF5( JdL2CIH$%A6f1,"$BiIADb ,R$J)E2%TiHH&RH`&`) F&DQIE&ID$f1&#J ̙5?ؿ??H H%0O-SvB(Ք)H )fF@c&H4uiCNY5EE)U-P'JaABtKBj m4uKUT0!Wu*+ pmH(]06 n"Q7,$@QPh!ܪ7HR!Qdd- D 00rH5Lj!2"ZRjDC(Y4KT S $p1@S YTm 6(BAATrQ"QI3 b \$J)IRL2 C( 0 O*[jv JYI4rȔEwr ( q *=CH 6Z0-$b(Ri6AKE%/M%iAnS`*&BHÀ12 P2:pD*J\"Ӣ!UPзP,L6Twm:$(@EƬR$-66ݲ%.[+PXn5`l`GM$9RTVe%%D[% WT.F Ja2U&hRhD6T!ȉ 1YB0JQh!D B"@-ii AM % T:L"@$T@TiaZvBF$3!GT)T!Cj5JHݰȨf;"TDH4)SBm3DkTZN`AJD)D D $KB`B "@lĦ:H4E+Ja\it)(J TbYH" LS  6Sj ZD'ubn.0@fR"rPHI)U@L"H ‘fPLjB$*D)bX$wQKDT$%vY@/N%ڹrJ0&٧!4 @GNU,@M`@Ҕ-Ge2$&)jB P&ݐE#(ت ,ʻZ(M ڄݍA$AJ2% 52 &a 0IIHa!0eLdf$@d &AJ PF",FSaR1Je2)E(̙1)(Ć`Ʉ$!lI 3(IK6A cH#BhFhH&e"@DL f Q DC"h` "("IMɓ&*(IEF5&1@2@32b@,J2`F$HD2K2dƔI%B&4)bC L%42`6 !&Y dF&FIb3aҔL2BE- AdI#2}kz֭UPaQADAhEH@!%D"AJU Qi@"ö)QB}捹Y-s\駻mq&X%E.TE.nc5uNئѶS@Yy^ydG7,l6bwhhѓ{̕;FFHM-}sQFш_=#TQ[W#k"4vM"Tĵb\ѩkF#W"0jhص$+ Q3{\|nX+яsożuE&#DErcƯ7Byh<#Xm6 T'lh(QmdJ *(TQ;Fڍƃ`^[˜DXPZ@4 iv΢J ;cb+bƫ$)"ŵΕt"\(Il[cF mj=D^ctwvuq"4dӯo3ݐ aGunA*jkͼb cW.۶,U6ccI) =&.cz箝; @U=t-dН+4|\Ο;^ **"-gv(*-yFo96A%<@cd5h9[rn[Qrvڹ"1܃LyHUWw.W'vh-IRTEbUNB4+E%4s^TVmҍr9slo^XI(ū\* V"ɴb st+ʎfsX+Ecm&c`wEjB#Eűkmb4FQW-VksnkƢi:35@H(Q:4h'Iw+Q[1]-_GQPTV35kccrHŢ0%V*b4mmɣ\仵q$c-BJ!픥.`,Qnhڋsr5E^bˤcc("--QHRQ 4[yWFWگ0h.I,+űH[1kX5j#bb(|КkNZXmFvj=rQlh75y^o-h؈"5Ǝmۛy &ŲV1d,Fѷ*Z1yb͊޻+% A˚1EQDV"IKcU&(b`#lnmʢŪ-dѮUAj(kIhZV (GZCuEEիP&Z3˨w5] ]z):9r#F075혝HSĔց:CPyBR^wSItubA7Oݝ;m8롥)(z !Jl`|%l|\+y`1G#QRs\NεOJ4 I(/.%64htt&=@CHQc\tM6ɤ׽95HzPVFFlQIr*Ţ6dоCBfJM&T(}F%<ټƉGy[)-劊cZtK@h+HR(.hNM j^VΆI幭EQUQT/Hq*i4D]/Jy8)M )f y$tOi𹼍jZ&t@=&\Em^^A[+sb0-r,]nb %&%JlIIQcZ Ic%Tk$lVjQmRHJ *PE P*#BR RPPP% )BR5[ՈՊUlj+ cZ6*bU hP&TUchQj-ZmIAUIhPhE@J QiQ)(PJQQkQEUY5hUhb֍FFVRhBZR)AEU5Qتձ[E*UUk[FѪ(Z1F5k%U(ҊR J4дՒ5m5QZbmZ6EmbEYRR)HB+B :M(k:{cXnr4˚uӤB.cClԱhAk5˔m̐hsj*#rbyyT-F,#_Q 6QeFcU]ht"j+:NMM&4/sh%Er横sEX25\ٛX&т#@nmEՃmFPkFήcclj1sW6-Ѩ`ꢍFThZ-m^kmsUljXb֢#cX[rƫb,j)&+@:t(UjCIl%[׽ּ#UʍTFU=ܲ ARZ6I[j{bWUykry5幢lFEW5sfUU͍X(EF`6cFmF6R)hiJlӃۑI:jj"EI[IкA Z-m\-Ͷ"Q4Ej%)iZV(*hTm&ETּyZ5r9r.FQ5o+l1j+{ch(+JZlw smck54jlTUcDA͹dڍIcPkT^jj jV+4h-VVѭR)AJH)B TУH@ ?6 Ӧ;E_u:"6@%KlIs R![nhآKI\*{+EҚ4 4i /Q{C@1"=B4)H%r(جEjش "ZwkH(E@ZQ: Q@P<3k[˔QFتtV,L+rm4M%!:Rţ,h5]6[\1lEb,ZJتlk&+B4@ :SJ)HPJ4 Ҕ iU#Z-kchm PZmWsjmFmQZؼ!JSBJP#JJ"W@(R(Cjmh+EQ;[+EbF"Ҵ(4 HH N:WEhZD%"HtR(K(PЪ4@R+HPVUI|k6p6V5*4-R QBPR DҪ)T TJ ]+D 6 HRM(*-͵j+PVʪ*jAiZ@4 %"*:PT]-hUR(P@thhDXQ?B}{ZR_vBTHɳ1h(FXJ h&E#FDDlPd&#e !dH2fQF4&d$"Ė@d(&DA1E6JLc&J 2A)MED4A)2B3#DDhHbB"`FLD$P He462 @̋!%lR$b2I I #1#(0S@#F+TTmEƱQ%A&Eb YSFDb6)-DUMj0m4Dm5 (Ԕ&#c(26L,0ȐYH,c 1e4Il̠#X! $TZX0U$"C_3>{D"<  A* ܈ U>/U1~ &?B ?նb֪a"S#$&bX*XLbb c % d@D `B3,D$f1bPKF"h6ȓ@BH%TIDDFJaLL Ć!"L1dJ2L)1fA!`đ hHHD41L P $SMc1&i!&hL3"B`Ea ́CC" XM&41(0IdHLlhM"c$6Bƒ&bS4 I 1FBf%I%$IcH1 @24ccDQ%(%!F4FCb i"6FI@d*hK&B$ RЊS!C@3j#b 03,Dla0b,Dc3da(CFE QH%  ( E HhdAC`"f"$ cIEAH1a4E"If,`"e(5#!dA0A!2 3BA&)&4I2&LdYfa$aЃ 2E`BDJ "S#A M3!P# $ţX$fI2 0҉K*%E$Ȧld0A% i(&aIFFdKX@QM(Hl`0 fH Dc%$b, ŦH`Hّll$ 0S0ACRL!,#F%)46 Q`aa)!aHK(f(I2de Hb R"$F1  $,JiHiM RI@6B2Y`LHX4)iXM21RI$RJ*$fS4RP4bJ!BbPLI 6K0PĖ)) &M%L3mk}>~~3?z9|߅ܜ`}C`X~@uw?~ ?e bo|k op(ZЯ?  i]( *(xIMvk;m˃4SY A$WJ%9J#}^ob`u0˔Tr1oڧ ]ε]xjr&u dQ%f$I Wu=uhFe E-H0pAzYp4TI̮ʽL,/g({k9#<My8wݚY? ՐQsEsrk}eJv-gsރo#C#: ]WV|b;[c@G;%jRTs [{AmxbK6ofU?$!q7BF@c&|҄<+L9+9@u TTIJ$H+zj 4IT7"C[_KY=i:ΝKBTq{_cqntS!XǷ:`Ύ+QhP+sV\#4ڮr$)&nHQ䎧3VVb|A`*v;޲::jkRƺR9iԹp.+`,-Y.%?[m#$-K%q@ =y˶< RJJWeu#.U[35rU؀}%0>lH;k! mqxjӹcB0zV]w$S itcR/data/genesegments.rda0000644000176200001440000002522713667026401015104 0ustar liggesusersBZh91AY&SYzI}`/M~/A:z0/ݎѳe%X\+l(LnwZf5ݴ鴪ĶVcnn΍hH[5;+fNC tfM@d;kA!\٦Dͷݽi6-,ۺ*ZIv%uOCӮkҍ 2QSIjzhijhi@4*OJhdbdёF&4 ad)*SF =@ J) "QO)+uŊ9=Y_ z zl}9f+) ע*eu:0 FWNu|!kux7 gtF-Xۡ@7 b=u3kiy{=EbP:bx+`/lWz<'& ^PC,܆~ AK_ͷ99;{8yv4vmɲQ41S_wQs"W>$~ br~V`qu~{pE@ l5~[1م[vfeݽfcýMEYo~QeUjffgaUU*UUS7BYFBӁ[Cw Xٷ}l8=(OݭyVKA|ظ3ɮ1*m0UKn}A^|:O*׼w`ҧ!)=ӔsL|.ziNZ|<$3;qi}O ˀ  1 s.UH +"EH3(5 b @șv.Q2lb $R A][GK%.M;p?7 {֢\>NXQwor-U81l,9.$F!69oo!EoD;'{w?ϻlPPR,$H$0e&Y !pH(B*Cw } tjUiAhN@4C[Q7'*5d˺|(2.ލy$b҈FIaiݳV.ur7pK$;)8v)!Յe$*ĒHQG ʮ'ʧ/re[(V M~¼LHFu9`pB.\F`OgvTDQcQȹô !aYpD͑ߕ㤱4xhD?ЦFjfY,4ecVi/q^)4m15Ƃ-k%g$TbV 绑|ySe0׵3g!s,IAמΞqD/a1:@M={uDLNtr*QV.tzƎw=JH{\n,[SVifΓT ˹֚K(eP2Š )HM(\ŒFr, 2(&^ !Iq;QIYIN:1=+9,+Ik^62L"$@)3YtusSZ' {[^DŽ ,CQEū& fZD11X6\9);;:BvcP@yخ=1ï( ڰ5YRHS◯9 \s+.٣ppC4]*j׬fbT6M0jqr 8ݻB,C.;u m68n4A2a(֎,W-D[qƸՐe@u Z md`W F t̂kCkuփbshQs%Cr]bic!db09 ԤCBi /{q8a(ɹlPD %jLP: 6M뉠^J~<-4v;7LX¹ۭXQ<6ntYpfnZUxPatZ!! yRpEĥ ȔR. =hNH` d 'sAgPBʋn:Rf 0f%`#"5LEs:Fcef0Ku!].y %md)bK-&?NVtg,0lnbR)ȇ[t+#\C+Kx^õ$Ɖ,jIq%lg71'1ظq<.` "i"GbCf MGC:8DZZ͓lEv/g"}Nxڥn4ȏ=Խ* G2LZm07ErPfnp!P)J]n3ZT.\:Inacjy[F{n="YPcIM.]-% qsظbhqFq3FR.pn*tRr=9gZ%ւRDp'IUҒsG*I 6`/UG&m)Vh"E)IGS&s$8,9۪P˨.xt*-j,2VT$lL:ΝiR ZEBtԙi:DVYCD"Ͷڟ^sD]ZMipli8b7]jv+Z(b%y|ޱì-u E6\PA4XӝKIg;.#VYܚUJȺg$ftp,ph!!hfm e0v%7kGKt,`KB*FʟՊ\gG'nJ\ hE4X3qJ DT@Vy) Q #\Zb%{pihN=fNvPv5f]uL01-3 ]0U#K`*:3"U%۞d)w w&q藴{Z;Iy 'O_ Ybzx{LJyǍ%Pт[+qQ2چQt8w[XбLƪ-.k%)q KVR 'ǗV ݹwtɫy:]lFF˔dpvw'dp=0tu,":#8^3ɹU@2b"Lح &\U6FS6P뱄lD#nBNr'PX 76|.ECLNJq5X&cӶVeX :)qLw( 遀+mP`~. ]РdU(FxCJn61E3ڈ݈://\9л6b anbapWP驄TƤuJt;tDIU54qRt6Ui5Kua9 U{羥/*$DZ{C'Ce+{]z# ϧN|) [Pvjwm dd?h.\/7?W.-[A{=zT}k$Zyȗx t4Ro hG w>X''3$8ykCpE͟2pJ,Y=wvE%.fg Hh5{sF5YΦ3VAuR؉OL9UУan=wb`=ppUϑ91Zt kgng*IuVI^lx,:F,Jl0jZ홻ՙZlIuhթ"ۇf'*Kg;sG;S)Wznٵzc>|{8ohIw67hϔ>,.ztwh'UVima,}$80`BrN$\&%ε`J2aː{tG-t9cBhE^浐aq;:ղñ2bԅ-.\04[bηjL|O<${{ElbŸ̗2A̓3&;pJj4QdGc JA&}6s9q;vBC|l|1Qbɋ3A̖ +&AͨNl&M4qڕ]BTdTn$@h#ֲ ኈ#J: c{Mg5 ^=&]*,.P$DDE -̀N69COPU9[:P.,^=(k`\rˬ Û$Zs icHxBb#;0%u9&77:"tʫf&H¥u3G, <'96p$bjfB;kl-rL[Q}c$EMH\W[V4PN k1ȑa쭎\Gh8NXk]NVBpTBNFA%!9u͞9p):T0-2]C}d(beD^yբ9;4ꑖf{ aXX$qz~ s%MTJC2C%'qh`LcFGYh4Jiݴ&qJ!a$O뮘3YFG^u`̓2_g|v= ]\keauLhb3 ]/ Tk>m0]q;yd[XXm6 I46K187q7 /q#HX,Livߩ|q[VU 00!ShVRiXzM#Bv74@;.R1\ ,EZcku0M-ED4эMS(i'x]K`])(`R&ǡ;®ci DiJEA`ԻRM!uHf[&d^.(OYy18\i).SKRzX+ZIuƷ$p\e &u&,t n`QN`7rswDreZ",1Kq;yգ᪵gN#jpHQ% U#Dɍ6i.ȝA,q6r'@N}qm$۩;2-n- FRaTM9BB''[ Yɨ$Z\(#Z,Mnu"*ڗCs8v#i I BLڮ4f62骜󘙖Rŋ6V I%)ALdϖ>Aq)ӦvSd0-(~z`}Ae4Gl̉s_:*ѹ'7=]B]J !ZTUM[GvBO9imivNhi$wi"<ëEv!Tva pܫ+vpqt1u6̦S5@ɜf44̛2L#uہ06$,=&Qb$^#\ ]h:h Դci! QUDWJ*Xi諶#OEm#6M6v)uT9Y;`,g7a*Vr.!w< aX/q[zS@[gG-LQjXD`7QFv%E@ıbĀ> Kr:}dIӖ_/< ^OynBO9GŠK'3aF"4r\lAJ5ƶS,<5đcstb8ZPp{r뵆~|x$c2QnY2:F&Un3YӚm!VXG pu. ;1YhGXx1h])<8Ҿ/:@ PmP`XkУrݒE w\`A7;'qQСPCagBi\]aq7" i6r8G3MqY9ȹieշ vAAf<>[KvLRr&DfCĿcS d/8}d:N܌Tl#'XQ >'Ī$!F@8n5Je:J&cm9fȚDŌEXb t|[7~:%V۾k.5tT NkKM .u H(; ֆLʇ!cu9rΛuzbU5 uTtjv)6llA'm=!eRa]6u)-pqdrG`}BQ]np\SWw&}7Тam}30% $VŸ&LJbQ^TӦl΃j&ܚ'J)oQ e H oXtcR/data/beta.prob.rda0000644000176200001440000001544213667026401014272 0ustar liggesusers] |MGF-S{ѪZSyY)5bWK+I "$Ⱦ/]/mU+ߝygy~3};wΜ94HUfP####ScSD̨BKpd>aʯUZ^*4(aLmij'|]W]; *f:mS~0c؎&G;3i~/߾x4yV7#s|_&&Za=\>AԲKTOUT*qv_!SeZbs_FiV}xTِU]&`ţ{`GN:vx#)ۻrI#N/OK q¦^Ot;y4}ֈA̼JaXӇKCJ>܅.2`C}U& 4Bк騱 )ǿOEJ)Eܜ\'+U\E^~ק-,t[j-t[蔷)z.o|IYiKhr(W^P`NT:y+TZ9;dٷXRO-[JWZZkJYkv֮pFQ6hk]vE6ٴ-ծV"[l+~ZrL6pd%ބ |S4FO1]tk˔r1g=cf&owO&״/|+VUÚ?-~7=vs?;p=n5ԲSvWru\B,4m_$qJҸyaS\x K7^(o2*?ޠtYXTD[Yzjȷ.bhQ~YMx-Q7ϲ\gBW!Nǫ_vw`޹~AP/,{RXraIa3cKlu:w@etg▜ pJ5{b{o=@rzd]{v<cnN^7\[b%,qcmmm2m') .!,ݜ sET1>| ~A)f]S4g٥[ocL 4} UB2RL,Z+ yWJ^Y+ye+䕬C%P:TƢ(l,Xxc"'oO=B4F#ݟGKݕ_TUCC]7=k7-P.B"GpasNU]F݆MrfFËgmʴܨV+:#Mt :_{glX0e2R(`Z,c2 NB4ӏXcp1Mg&P$./ѷQu5&w_K"z{jflwq4Y5+ǰolT]yݝ)A]bzi2q%$eʉq\ P'$7սX BD@]1\Bu`r/O=Fs!4G*)T׵ĉ"DiTTCgCG1?iɷޣ_8|C"7"D$53{ڞKH*DO= 6"ژhS͉mIԂ%Q+Dm#ڊhkmC-vDAځ(ߑ)oOy{w|'w|gw|w|Ww|7w|w;PAǶU*򂬑0}E3vH=Q塾~ H85k5bzL\ȁZ}߲ɣim l΍a ա)kc]بOWt"hݮx:{o=&u=u>FXv 8D 97Ђ9'kA}I;;L-X$iSmw Z=Gk~k|9W7.}ܶ?WO]jv fe~c6R﷚]q~7D~Q;s`9cj`k)mt.Y^O1pz'sjL=ܵo<)@%2xAÂq{ҾoK8/Yl,x4q%P:T5~QC?M,eKY_K5ܔeMv4extX:i;1,lA\؋⢟[pY8zg]vcW5n,%NsO'8Td?3e:N8\~>^of,stWyY م43 r՝#t%N"U:4mԑ.㧌L? dޡе}뮅NW ]w-tO3itsnx(ۀ.NE28LJ҈}#ؽBC ͅ\ FGvxHqꏇ1]LrS `H~ۧ{clTbC=fk̹~ vklFF;^=dG sw(~|$pq^ѽ>΍Hd+t[+S8|8ʡFo:YdcP4ga:3>> d[8?Hu;i2mB:7)o'/"EǟEGBE |<yD6f=.;‡ lE6f#| Il֕~{q4^.GTa5黝EMHvWE>4oDPHZ-8dfHaJ;J0k>u 6U4p&}ëH :z<;QLBlUL({ i % TzW\XOHy] WODm&$IH"iK'mczB 8 Z wiBEes9qtc[@dn:zX Wh׎ ~EAm젻>i$I D*!O]O2i ;=XGZK߫GJ89F|*5nE/#Ml /R=o[`Ovӄ#֊dAl+t7zkE c\I")Sh<%6ğl+[WvzAY_-tqX+#NFN̎XZz e*:^ Pbn_Qf9|[iV$1G,υ_.1 |hޭ'R ݾ&LFz`t &"&KboVD8y-)2Ur"Cz5Ef/iL|rMȈ(=9F?|0]APcqapVb\}_IhC_%2Y2rD^﩯l<&ƐfȻ*mL^ӄ[8/ t,T BhdL"]!MSbf̊5~ FvfJ]4O22=ɚE6"~@4#>HU:eXwNYRIa3gCs|~bݾ&ͪ<(,Kn?!J%,>w[?4Hcw˘ͧK_$>|!`ARACPR$<{a8ң}1p;`3BΧ]k-_?"۸:Vj뿑A ?L#${$-"6͐KRd2jty\gŠFS܉乁 *"Swu;a|֘s!4,Ff lԏG R t D`dzUh h!h=W!իwq5!D%Kf=z[IC\Ť]^["={pëߡ1am@H28i +yvD/2ضb 9E:r,>/Eya_Jޖ:xaǠG'~傴G!lu2ZKz@tD>v2}( wP9N "XC2 9pv=$'~!D: _4n2y'u5O'́RmH(|~k$3Cm:8(&47H3W;ZׅZ 2Ȏ.M <װ#=×v#WH6T#ILc j?I-͟vg A/"#p)͜lw7Ϋfh~~0?!s5&Ƒ"1JyO`^{I/ aL]$P7\90"I}4jL\$g#MԤP$vW¾xH "{R;l&Ҩ&COp4v,"530=^A~sa'jC>my;$b\[+&"U5!jťx 3d$QF4$P}qFw+Iym0,"Z)R. Wܑ9#ya7Yj9q6^-$'5~OTonYRoFeiB @ aFw$׋p$O_xJ$}&4 <Il+X\BS0ްFD_NB!"}NM)数O~Yh2p=^2= 1~Wg fqo$Dluņt@&,!uT s89Bdp"E?wm ޕC~~QKBtI!GNz^%wDB6l |F ߳HK[-d!5g%7 T _oyCOi)?g= sEZ\TP/"=فd=vիI|Xsb 5o![83Ҟ|.bp#vJHqQ$~7L@dY$" _kn/_?)@M f^ߒ'D/v\4WyéquDpDcc3)m hGL;Iܭj`Ph8s {.V@fw; |8g %PW\BNCM~D#yߴ%B~).CcBL|%,JwL?YG ԟ"[f_Xӥ|,,;z 2hSJ9t3{O Jvi;ޱeW[8uh:,s_ws _k{vΣt9Iײp/>Yc+O=YfosY:s"Nayu˵.l]va;/9zW4痝%]Z4O֪o}RyG-rKHuDFP!f26D(/& Ⱥ8j/  b{!rk pv2(Eo U7Ovө0k|pfT0uҎ]N];n܎K Z;u\vܭ[D;.pԗvǵݎ f;Ҏ^|v;ҎGf<ڎ~ \X@{/v/lo~hnގZh{=h{#q‘?v;Gȿhӑ/iG{M|^;wvGv[hmG{z;ҎlZ;Nhe#sdhkG{Ov޿#kwD{v緣>G<9G<u8Gܽ#nՎZ޻#\;uęh^#oGҎvk;qv\?b88GtOx:u_<ՎomҎOhov-G<ЎvWUxe;{EhlG?^mv<vnqvm{{ߥwѮNF{y{{-{^G{=ni8$[x{mGno:oo>}g;vccq<Ԏ+ߎhmiG{x'><nG{}p`5v~/ՎvvWGn{?ў ^hm/nNjx۞<ڽz3ѮmtOoۓyN<ȣ}.ݒ-qdܔM>7n7j qv{&= ţW]3hGm;Ma3hm'd{vv qIqb;~[n׎dMƴ76c5+XNdꍥcI2}Xq,v,+870g\Ggm,4K8zθ$K$=G]E ]7.ģ=˶gٶ $HylKB 3?hc%9s dWo|k`|3药'k<:g|%_?x|i`|r|a9 ўe (_d|*Oq%F{/|7>7g|X7hc$dE2307ޭ?wƟƟ;{x{260Zo.7)㍽GxÜdnxmafx50^U3^QW/W*K %x18^T/(x^a<9_`<03;xzx0Z9 'W'㉇9px94{pKȿ GW:_`ǃq_p Ƹ/0 {^90qCn¸4r.;N/a\?q_`4n}[KŹ4n~.G㦿qp`<77% 랏u~_q֯pqtk:o0qoh~Uq8qqt8q8Αq8~q`qqkck5<+;6q{k?cʘc8zc}(q`c糱2qq7t8~MǮqc51qkc81su8k3&8q1qca?qcXX81qRq81q81qODZ81q|=4qc8qK,,,ݼ;W8WYk^u[߮yC/[}֧_?yG~+n{羬yw?mOn/~'4#nxG&cv>淎}⸷7X=w㛳W{%w7gO=9E9xM֜G߮9nw׾'?Gsߋ=G{#1W`s;|^߿[{]~+vGs<%4m}'_;=M = ~Ǐ7.f'?v|szorn?>y}?}#~s[u3?p n/7O.[ ~o}δG\ ~t.ύwB~~c~_Ig7}:+\/#:?=.vj\~uv{>֜uۜggN8MisjO}psW櫛k_e7k}綹?izēk%OuzesͷxK\#|+QsM\Kq^&k^L߽^YwZɍΓ~8W5wi񈇽 Gܮ]9w_}Ys_[Ƶk\|\cg,>k\rO76WC|wz_o_\Q:@suwn+Տ9l~+kݿsqG_Rs濞q~95O8_9ۿ_翤9_ixqɳҜq7yYqw?֛3o93N߾VsG_ko=M_pVɇ7p_?S/˿oNosԜԯ^}6?6Es:?'/*/=~ioN7`s+}';4ۻ7] ϿkNУ~W}9;/ٜz5?NhN͑]9ucϟlNq+ U>\M횫s)]Xrɿk9?j՛'5߲Χ˯g7~^9xz{<9x}[s+qs7=)_^qo5ˉ/ڜ߽O>攇<\9exFse7\¯~ܜ̧~4'hNؽ.}֜es >77'?㨻G7'>pwԣOyjs3='<6}m/~ųg\nsqܽ[ψs͇=ŕ,,F́ ߇$'N7oz>q]_íӜꧼ^$WNݮ#.?椛=I{zIϜ̉?{Oy9 ;>t7mNmуnNȋ^+ؗ4?w[7n~߽q~ƶ쇛w+?uٿK??|gf5/w#Gfߏ_g}_]>gΟuboj#?s 5!ýό =q}zr}ޥw}7~^㘛sUqo[{~3)w}k6.w?u}q8eOS|wYp۳nsfχ0?{^ok6t k6/oǙύ]ekߵ¼ϋ7Oξ[Vq~/DύK7G\ia{Kęϓ- W=/}7s89i5{ܙ{Ͻcs~|>|>o~уw&[Ϯ{fިG]ϊ3_as,w^Lͷ5}͔ϳo]pOl|~qƝ+g_ٸᙧ^kv^}鯚#}?=5~Yfu/>q~ݟgWvoK|ٹy w:a>U|+\O^u=hczqɩ7|׬N.{4;s|.\3*ǫ=gҬ>n{܅U>gf>W8oxģf—⳶?hf^|6+һuZ>?;?c_f|u{^o>;b]n~? few%fw32=f0 _|3>;oq8z~n4,jfeOgfcn[/#wٙ0эN?4;Cy]`v~=;fv>o?zv7N{y|rǜԭ8xW-gǙ],sߋ3e^֟_!O:x |Ǚ|E#'ͯ||=8 ׾wSq_f{>s<޸6;s|yk9>9~\6-g΋qK^K4;9l)q9/ogm>3x׺;|O3ǭa5+=3ǹ;89ޝ9U緟qǷ2?3o0;sㆿsggfg3s}$̯z{vOk^1;s]f/|=ƃ^|;7g+3ϟ} wOO~ȓ}9Þ9_9o'l^33wq/J_=sos53{Gk𥇼Ϻ+jmh^/s#fgԙÞ9gg'gf#w>n:3~gKgfOy}o9W/ٹ5_Q=sgg3׹go3Ϋr\W;g۝g3u_x:9>s/smy>sN{\=feK^+3s<~\?gk3ao8gC3/D|̹>sܞ/_~7s?\u:棹vW;gffg;gGKrWf}| og܇U/_给3 ~]1<33NWe(>73M~egƱ_0|;3ff<ϯ|a͌k:ό:όg/|_p̌Ûb8+3":_q+63vϣq`<8̌xf83d\8Of'tf8zG0dI3]df8fۙ5ο3|63_nf8ϛ1rǹ: qU=KG?<: 矒88gCqq>'8<<3/V88Ϥ:<\=t|yy=888KH~yyg/byySfsqq??4<<|? ߰qqqL<<<9<<<οJ38888#qqqqqlo}Wmyyyy7}}嫍88888F}|-v888888c~?"<<<<<<|yԋ|{=<<<<<<<ο{_^;<<<<<<<6/,,|‘ nwCekq덷yoڹƵK˯muާ/oisCk?r?~tt݋n?xsSƶw譇^C߭{9;㝣?h||Z*C_v_:JCpM.j&䢺[CߡC~¡oI*߇>?i_]q2oM>Cw>C]zNn=ݪuw+oߔwoڡt zuMw}"C.e]`ۿt _)-u-wMЕpsH{{ƗC{And2=kjIu:=kq;hҡ=glš+C_t5{[}C/˻_5u&| n3>{ëWX_.!LjЖDcY,_(z@-W_nX>=pג;p36|&?a:wWf|wѝ8W'.r7y9|6h>>=U{>m{ wN:ۨzuv^='ͲMK OჽQѝv^c]rKU\6F>; 4WήzefߌVn1$ m#{$889>>19SLhu$'>_#d$߃Cx8rE? c+Cg+]DC_.ƜqRsUԏ~Z? .Rf_ścz{A -*:H'{n)Y?7B;'n]K.c9 uz|:L|w(B:HҢ]"ߝtEo2q_;sn©.)>O tMs,ރ4NrmKHKA9zߟP52a辷H] fd=s\Il$~#k'>pޥ L{_ʶr= 1Qw?G7y%UZQ$?(<-N6AC ); 07h})C{[[CAY! %I\Nc{;[4̽*-lM1J /ԋ8hdb‘~h9P5?{#9=H}6`ÝV 5 _(9Upѝ(͛$ N eC%:FLͭiP*-DSGG)RJ(\ϏDfp=%6auUH ]lk=|+ޒ =Մu _V;~EMǴE^gY+2t1]Z#ŝgbqZ :Z;x;EJѷx}WTRҬ#{dJ{%t}OQK\t\L+N1S}S5SWP=rg<׊×-TZs9 /j.,gwңz~NIO~1ZMѤh(Di̿ XM[|;JV".C$AhWxnjmoCHD:RM.[ЭqM(m؏I~ZX< ̈]4¯s^E{ g-ɷ ʽ^K97{oN.Clzy3h|o}n)bIM[Nwt~躃hcp=0 EkIIGS<*l,y%4s<>M\^̿(bo/I-ƔI;뎊§@o:8\fpUС#YK )i$t@ۻKDtr}й,GRkdMRmZDT\Zqj=]lJ "갛PNmB^Wں?U%+K^W͖3J\m)i 6Ӷ?f:zb^3{46&it#6`T&.@!;_;t{W{f&IkͤbWuS bMR;- (jYNqP] @%m'>rPQ #"%n 2x,XAdhYINWGc1@?Kڨk9چJn@U.UiN4\ޝ7ƠEXzD0vi BrthgObg W:x Nled c~j@▀Ĥ(²B*)]~?bmu^ q)QWc$Yi~p_U喙87]أz$VD6!1=+U\:ڳ]wǩOR,dpy=d) #&)/g-B mjPDD;8}J k [!P)4 -j %nC\ڊ`{οX^,\( upxG7o# ]He+he;4̹#P]YTpD  ._F`ּXzOspnĦ}CRQ] -+2삎z$,tJ-gQdVM|OV$yV:$eeL~m)؝v-4dzXvK =C7INYDAPy# Zء]eY`mnOxHF~Ml`rȫaP&+) ,UiYM!Tf.G=,@Ko$l.m:;{Qږ2煢 úb sxn+u•'6 iRz[&ǜaټT%ߕ 'B1 d`~2;tpbeBc}U1gX{KR)m au~&)E%録AV1lױ's;[MsWTSاK.`Ezy ([= 瀂x.efq5G\wF"ZӤR`Bp|;sBZ:!љs#)Q%qP<= >ďjy uzXG":ʳ)hj0((̆p9mN ]E;al YYn5R-sFN걶+_ݿ\3^i1\Xױ_Dfn"k;xL_5 DU6zMz@1Ꞥ},`92ӷ,>T3|zHsU|ЗRoYٯO?ub9@OuͻSV1&l%|.ltMY]bu]ky ʾ/JhmvS*DQP3_ A 8fXys1WPHLtM+& E0 7O?vytΘuAZ蠛d/ sz pQ4L0aq밬 AX* jF6d܆75P-2|B%j6}] &gx9vV{> Hо`O#*/"Yx#ϒd'=XOn`|R&2`" wietٜ20VFOނQWsE,:::IuE9TC$`sЊs({~7^k{m0x[fZo~PE9$Kc"8=S*uJ֜862844lݬq1ubny_Y:-\}r[LM|wd[BDWgJJxM ȊR!(Ut8ʍCvq/h4'RǠ*36;臖F1 9Bt Ѥ_&T7K, yCTuQ/F{Njѳ@ H=0g܊*s%bE3-;I 9'A.s&dqQf H L E3* :dnFK;:2,.v˶tT[+`c,|KC* #1`u@ly3~mo4Y L/B,&V!l1$ֲo:5Xs"^>b[Y$ؙO&簀@>Q/nT: u#%{Q0RY1"c6wRt*'jD9x;P zϥ'TL25ZX`bY?-"aS*Ur:?WCܶ)yN`#!EOżMHN4M|AIT'n\44C03.U,o2:#ICݓI .Fe EAv>i@}{sjb1\zȲ*!%8qwv|&fߚЕ/ AcLLb@狘Ad0ɮOWD|@nx?EMaM3_^5mbŬEt=BЌ'~R$fAmQ>M $Nwu^sDm+z VH_1@*!p2'-N 2 u*7Z *1BւJݴ%$?0db(buAFc쟳Gg1&\0Nf藚6F]eN׿tRIVO6sUY$ƀƎ>JLVUX2$\ y61L{(¯$vH^ cB(D6q*-) 9"U~Y[ɫ_`:" aO7 Ww_L7$5BV1lRfrn|P:X̛H5}:~:XgcP.*Y=VqYdPHP1H:]$a칈~:e+Y "|-qR ($sׄR:cw e㚇,L(<ԋ+,^`\ݫqtBP씛Q Љ uPUx~_BQYcڀH0DXA%L,G'>۝vj%/kKvO?v@v$5.@*R `Z܋bbiTDtteKPIt|pIQoFo.ר95Qv^͚ZncQ[+NuTNjNrP}+E>i+\4SQ_LbW,ʅJ2ǒ:Èp/&8 ZӶ$9́u  gM> V~OOq0ƻ /wXLwdI-pybxS%uLTym$fFJq'GpS!ҁ8|p1 cO 1yԉ`|ו|j"ZM{1&(cI#HnrË1\)P9#4thê@r`5258ŋ>y0n7?0>0: du ^5&gY@8{ 8V,[D&!U ,ڦ-nmȷ,8*6#Չ .vֱ'1 5OI%=RYC3i|ᅝ&Ѐ= &`ֻϧ͖M`$O=6f>6ꣵ(pjS/ؚ1zի{mL((1Sݚs tٚ(ePө@\McS<$ٓ9p|p#Vibv$T讳ݗk&U ڢ$jwurgbx$2dpN\Y%_.D+%YJH1ʿQ9F2>P 0du5-YI"OE-;8=V{&vm4۠Y@"k:QtWfP13Ȟ3mgi&ݐh&)Ij8*9uE^g!\baPܭ4 8?Eh֤G|0#%TsTjII _ K<ڕ uV,CrG8x\_FaNޠ#9׸d)*H͊i3U!\n3φ "NCX,0I3Hwy_ & Emz˩Qөܨa2^t]ѦJK\k Ĝ!8u .raX9oP:`@wWN_FZn~(MۢCBhBRy+JXC&Ŭ똮i^FJG:)Fce$)EMϩ>QQWJ PB 7XluwfY{iٓ25e\yQ-ؓz263ST9TӰB6}}Pq- ?@*XLҝ%٭@?wlv^HЄ~FAu]m̺B2݄`Ye)Z@ˋz/ TdcLZ={%vww|$_P[JiCFc;)Ep]݅c8Hp>G;yC&{h^W58ׅbIةoV6('aQMUi`fKѴ-'dH`ݝd8 {[*:^,(1YgH< d" p$VrQk+r:טk%ڇϏA+F  Nʭ7H cJ9O0kl@^ ɦ> S1SSo$`^ndJqr b6H}Q$=CV7bX܎ #ſ}|2qff^5֓ `#=;;V*:.\Զ8ޕ0 /3K]TȹNzN_4/x;\'󇗖fv *AT]qe*4:TJY ""ZX=3:9F,!xwYLIn%4|cʳr%2ԛ[VtO9/TlORw.h=ư` i.r%<.[v-?\p{D̩"]ᖹ4)Q0,@.BxU*a:rR9=1=x G2hS%ęi- pkzzNOURGZZ軜 *ZW*p8sS[^Bр]Ж E4[z̵@9bg-AL.s`OY\ $%=ҠE󥬽\| Rvymm4Ùb9Ijd""Ϲ*Cٰ8: 0 Q]L}fdǢ%~6g7Sp- :} 1Zki&^b{\ ZD^"9)oG0UYqG; l ܣIZR-%3Q Dqk ?l'm3p2qUEptŶצW*R epf_k`jKeӵ9G ¤ Pk.z܀Cc-$) b8wRW+HC%ԹX=8kb<=.0W2 $NB[3JQzT㺭%pm,x|BF.#J)Ve1bdmģ!A9q"`OYѦ5apX?)8.ؤ>oX0;Q;0pj nWVcܛ} 0X dłI 26带ڽqLh<CW&)5Ҡ3MH8*(q9V^4q1;yXV0pxHHX\˥8srO1f@Y5 v-3Uu/eR10O}A'a󃺄8-N%?[ɴ <>M< 5{5bld3E ,g0LӠp2BvDA/:0!ێTw;XmT51beԜA V+ٞ'+3AϞHP[bJ*m|uJ]%̈.2Y+2A=?1lb9bQ.'z]Ƿ*.@Q('G2]Kh;Rm|%S90'NQ_͚)Hj[ExdHApұ]a0&E0MVnp6_݋V %fSq!U2 3`L*1><^.N3 =YÊ=H 5qMgR-ֽC_gN܃hXcJ/iC_㚐Hv=܁Y]F;EAg5 @\Wj &N]%Xai8/kgP #aWg(@Vx RJP /FRw}cm6/O12 9.~\I*x]t=Ogu+*DQ"uA}+ҁFAMp)RF| &řeOrkW6`y`|q#8Z1 aqbt=j񻭓% 6]ZC5  O}\Dģ=^y.e { {'[L1m CD;d|jX0$@W-ŗk˪F~ض\5$ 2H Xl>b躕L&@VT+bIذywBN wpZʣPf3I:%B_ߧbdK^3lHo'0hC>0Gg A18v*Te(DD˽/g8VSuX$ϤTi1 R"΀<$UWcÊu{ eqĮ'K}G~7< 4&e,`s40ڒ/-=RiIUɦE,+?KTI7跒!5wICF7Y!_,s4LEg+v`4E_&JCsDSaAACg}8Gc(E+}|:!%LxJO:*o~+j ^lQ%SEpy Va℺Ea zpnEG+#" lhgB=8B5LH,ۣe@ՅuËgb [`,࠱lHTwLA$φ %Yn0FؤMӂ εf?d4qRDDtʇb&t; GfxRSiZNN Bfk푶F &])#ۣ Ul@0 @бTM.PR/03Ti3&]:Au -|'gH":yKd _x7P]+Yvv=9;Ʈ$4n2Z_^%$dl1_!#WpsMEqh L0-N) ȥ\R g1U̸mI[e@vՕh.F't`˭OG\c*O1t"u,bƸDcA4$l(Vr`:v 58Xpb*L!aq?!Úg1PK.%jaTہ '!cFT7,mPU)#vwϕ夆w'}rks 栤l iLH`JJ$vmI3~TpWDn'"]HtR8'389%wM@^蜠dL)rx\o45[ eЯJԚaІq(tC- :j*uP]^D26 RC=c*{$I:.v%'peu ב>fFۼ*tPXkp+^ʊRp+2X>q4ǐĦK!j[9<%ITnJ W* AOQR[YU70 zNg)䶳K,qk fO]i7fsYgRck!plb -_ŊE^WPFIW#=8;Aq[\"8V 607HKNUm) &4E2b3 ҇1, 2%pi. #Vd`Tl v] U kT~da+I(@)*WJ4ׇl1MHwZ$JC':S\˺!rYD"Vt-$DNG|ސa!]RQ:A}hHxܩ^rEHg:jHQ,dRV75H0 { "B=lqF!(~R9'Gt:)7H$i:%$ <T®#(ZZvtbKS3)?ꥶ)"7gem0>Uy^P% BSk+e{ۀ{b*`'3l%Ӈ`]bypQ`>B]9 9lE@iO$A+7Mtkf9ҷꍬ umYqr'H|#xbןTI>Zޟ kQjWUBh1V|8PU%u)"HF #A18ɁtxY,*@KfT@Y3`t8ilqH,Ѹbĩ$6 #Hy<$U6l:nûy(Wיc'^LbGG"a pgOS=-B>CYx(>Kkڟ7,jS^W9YvC1o sr?gLқ '^,q΁A[2^@_1R➪vzsY)RޘM(g }+7=؇ Vc HC(rG);% Ň[Cy L~ɳk1Y@yNI^A$^6UA`Y_#%+6f|>>ro-{z` RbڊDV|z%Ak1z(8Ų8T߆>"xJ=-ki;X+HI xZ4 2/ 5!@8`-)^_}0)v,75↢.AAHSԆ vD¦ZA^q@ :y҈i4d,s{1N)$wm,fXx/##w`M#`!Huq\^y2J0)tn`_('RcG`1,Qlwn8$PAVu{bX^ &F:lhC|kPM g d儁f4E J̫1rH=1Ku>:F°A9h!e"(bX\&Y6?LJޣ|zW,A$e>y.k0-AIl@0u"g_t\Dl֖W13ʽ.Xs ybϘI^~atjIАn-hlS5m@ByPRo>uv#eG:D̠ρ=1\Z>ùkKC@R UKi; ]X,` CD;e, 65jY,.h/;zLKH)"@ojC1pm}+*VPt"\ujˍhQR]wax) ~և Eֈjb`&NOrjwv#K8;ѱG~b 2 (`K^?#!n_"?Յ6GBm1q쒺0|+Dtpm/T~UX.֚P*BźSwif|4U7'Zޤo c=@9 6KCzi3EzVUY.68[U)jHj?e£\bu"c 8<f%f$\i566)^lzj5>9EX^Jm0E&. ;!@!Hx Gte4zQd)4X+)+@b!'%2+pHV:+цcˌ`Sza׽ qoZ^Gb| Ŗ}nTp*2du tIX4M{@ E9@zkЛ Dsr *#uU+6Uz^|^is61@.)mLgR 䤡D(qGDLU1a[̈́ 0O~4ɑg'(MAWi(]v';dAE#1M)汬Wum)v$qpb`tRf6IRhaы9e XLH-K} SփZLs/B]V@c_mpᤅ=1)x'B_̌qÉi%NiSPX:AJ Qq˦CWV3q[X#Tf5>KI @ !;PӍ(׍Ҋe lfE䌁BI2-Fd1Уy\<^dSţ%⊨AY2!0!`}IO"$FKJIT%/Va`%%@Rbb؁Қ%,Y7V+k!m`0"ݑ6\ $⡡^a찒_sWoYVkr 19LJnOlʅ<ڌ ֿψ0Kc3# 6'ԉٰ$NKgpqcIk9Pz&`|6-0s4Ɗkh'/AY%R+eDXvllr[a♇Ei`{ VxV<Bv`/i%QAY崳+]$"R(u,VsvQ%k$&O8l$FV3h>1} !HQ9\TR!ݶb}/Q r,I"Љ} 0jj$[жj1au,VP?evU'L XuyjZDadu=MOh'B#y6#DraڗIA:Hs y-l ^czST+$< \ctF~\68Z3/ 8F\I{\=r_[u3"Ijũaԧd57(7"nv5ѮSc\G] ȧYK`], ̃{XSY͵޲Y*yI <P?gtWY46a@1(6# ZT x?:}w'=)#KQ̨M(\D{CJ{ % (!14L/7Xa߈S)T rd~ZBM%CYҖ6 Jhx_ j ;׹`ˣ-MK2&.ƕ=_h%$1EHS YxzA4IƠ# parnRP$/wM@UA瘚A%wRk10U{Y,P zt}; ^]r @Mp :30K-T~w )[W B#='2&ŔeW~3۩VMY l>"Ϸf"ItrǶV/9d+ q4©n%R|[OiZa(3ʃi-@WDKV81tw@BB"8] ZCwH,e4|9D*mLK\Bt(DF t]aYjj,MR*F,u$Gb"֑jOB Hvd?ޡٜp՞RBb3X'T!rfd0'TY$.eTaA+SÖ:@f1qjmW5PlJżCFQGdpp7jwenW45WL8yP(B8 ݘo#B'BEW}чΞaLӢ+ eȠPfWӝ(^NF.-Sb`DrN>Ö[MAwINʙM>DԜf"Zg*vW_tg-?@䵶6y ͤ2V 2@ E2v5tS$s'(2ʐ_ҐA`Ze&[eYCGvF\}gnr)fv@eYΉr?V# J+ @SңK\UXv 7xAWd9Ä MTǻڝǾ 7TY)I6p9$bcEpOl#}G,%aC^zz+•L=b#@a\ E&mmIF*ٳt.݉fkVPUe|lw L2cL(1-ғ4Xz`UGM"KV\]e%֗ 3#; LM@k*-XqOߔer|:TrM"*VVN+&IxZt=[ PPwaٗayZO AR/h=NL+iYej0̓7I[1S#So5e3[J%B0˕ ʩ'Y,>#A/A@a> 3%,)އbj"ڙC,($:ؗ+-HAwU}P/#r-CZVv;Jl)g? 0Dpr:)jaƲǥ @ 1B@fIN"ݸ#/Cc1eN'^߰<ӤS|(OHRɜjGU|{tɁP{ֺlڕ*Mn9OUCpe |^E?y!͎Y7_#8k.w!C̩ՠ:f9FK7Baw #F"DjCMns? ȢZ)|EFݲ k;lnᖔ[_Te4&@6*@~G|18nhUTV'*,V0E mU~mPêRTf`{1N98Etc{X3\/9Hg@T0դ@9Ca%M$C&"հ:kk%1fҠq-d_E'G1 Sq\"K d gUnNqüNRiXHvus+@y7q;Q(˩*CG q8z~!R@lE$fVkN_2_xas ȩ8Bv碬i1ޒEg3zGj\_'d D0τR'N5U񸻤`<ůsJ8U2꣊eʃ-+S)SI5)TsVBY&1N^q\,Mz̬mƲ͉ꖓ- ,ks` y2, 8m^,BmEܫa[ NW ==MKXos>.*eݽ zԷh[DqO39d"7Ҥv̘.7tΨ{5) +)ޢr:Zm49qUVS0`}& n^e-=OSeC$LǬ0w,B()cYv+92#i)q~tY'ɳ 03!c ll59^|TBxN~rJԺ 4R;bMfj/F eN),NSx" }Ph9@Y"/2<Fâ\0ց 2]bL' ch Wu`)DbRE ?lSG./U>-xJyIdžc!o -aO8sRLX$BZ̨3w<:̎̕*BbyeTRߑa(X=MɠQudR(r"IRl'o ~)X[X:a9~}T{4Xb8dlm⬗\FF%JFk`6,Ǹg[ZLJ,qmְgkBM'?r~E+x? ~л+01"%!6h>қzy:8`3O 2m=LJW"u9cYGCdTU%/,A`ZFf1.`53EbWNSUc I˝UklYLo/wz{o ڐcuGvwX*",^1M ٗ%@֕țh%]P"ѲPx/0vV{jj^l0Uj }Q6b>TżWЯ=%<bŠ :.8j"RӖ[cĘC+s1 7*PJq9gXa5lʕ1B(ZI$#@ԝ>)r. ÍS¸(T@9 !Ey9VV[k1 أL p`&&5&Qr#iM]^hՑ…R-e"6uVƤ.lq@}Hn+o@j)4,5{AߌM*ߛ3޻Du@>P`$+&dVm[tKdsIx-R:*Kia&$:v./*,p B#R񎨁,I yG-A"$iT:{ C}(ͺsW(fz½{!\Z.\ŭ@f&(5bDZe ۛFC໶4Skfyk63'Gd#)V;랔)Xy{n4cYWUi3TaH~қB0 %J$AΥ8Eȓ+C=LNJeE*iD*hV6mCI|+zkBfZ݊2sFGf(}ER$ٙ{lBbRek3 Bsqf(Q "xDJP("MME,%$jmRC$%x+W&1Zt[ c{bPX H$Q[#R$v KDQ(@LMKBp.-HG)!ރWjgԤ ;n'Co]] \hy.] 'v7Y"5\$ZgE.22MTc&|_"ЩhK\8q9`z/à1ȭ@m _ܾ,_5\#̾>" :H]6U1{2:E|ZlU>e G1c6r@r&=Cm`筩҉gQ+0>_as]c ޮ睅zV.9:{љS~BS0:ݠZ:ֹ Klk3'fs߻Kc1"AP|JlZ9n3eʤ F()V=#~ {rG1Z!u>,(q/}yz}i[쀡dSxUG'"= YI8 h%o2Da\9M[U>Y4~*8: N&31K'ʔILHYܲLSkD!Uo6.ֲ$\4%&.1bf aQ@2c{, )cT\³=0AG~}F䖇rR(9ᇓZS]Ñc5Ui}Jf*$B%@a(" yPe2( x˹a˹ bQbѰ%lCEF #i^ bZfD]UFgRos(ZWUy-V5@T[D-V~%GaRԪ*CTtj^w'\RFt.@h-j7bT~Y\:6d+*JqA`3@^oi2I/\Qp%K Pȑ@TM)UGH+Uyu4n$+Pܟ`.Lf +;zu~¤l:NHj8}1^bAR˧-^Ŵ%ۅWl0Mlk@sɔ=}d[2#3➄E ط X0LEW 22[*?䃰$@вނ5e襤LR&_=nݪq`ؤ/覽Vf9J˧D>YD9fk~NKьGj$CFCF`Hpʤ5]ᵩVAU)QFM$Ҝ_eȂz& >: mbyӱ|_ΐw|ts 9v^zj3pX[RY}VzF95!,X '+Ȋ|ii ԉD#Iꌴ8ʥq5Jeˡ|׸1ݙ"}AҗgHo%쮊ݱpר &){㰟EvA_O:dZT:h @=rR>/jCX6lSU|kKՆSH_ Sn;E`v( bޡTnF!gVd=ox9;9_뼯W2<%mJ;!xk [8 žf)Thu0Bbrѿ֖K=Z!TJylx5Yʝ6 g 1s1bͽ/Qo^g۳SY.u\cUћ[: XKĶrU/LVp:ޟ7arJeҎ "q/y6x b̥ϋHj=pO&A ݧ1l0 ՌET .iR*6|$ s].#P::8B:=YX/o|p GwĦa0:-48핐*R`r}KЁ(iVK"^a f5PlrTN7B3kzd7@diK&mt廥 uLWzj"QfO}d Tчg&i eI¥I6+"2 g L^H`[`W7SqJY:qa ~*Y20bnae$5:4d\o!{k{fek}}"F Ex(2{i G$ 0u)F*rm@;i\!4ǣfio_T~j镜㴻Ty؞$Vd0)u0,˕`9ctJtiQhvy*r@I+*+bT:/rrX)B iav!=uLW2V)SzAoh;’8Lmj䒉`il "jR>9[*Gˍa Vj>I/gpGH9AeRHV nUMbqE>k04(!>K5|8+F|ςn#OcdV\+48bGŤBPjUC%>a'qudW✈t+IZWG[CݓNͯc(}"딭@Y2S%f_t,A{85-[^#kqzA}1SUJZ (p҉9t5Ƹ:E /Tq$4R;Ȥ|O1E% KuMNH~BD*cX~ڦR`6zUcŲZ.h[Di b'1ks.xO*nR-.pwλt][VlVwiU4BV}M:RuAςevWAU#; ^qw$k4ژ;LE)+L~Iw"ԏ>x &`{eN;!TA[D ?rA1ORiFs) E"V P4HfFí`ԃQ{rr )a95P*8I,)_{&EZx8)B iW%J>i%%J>Gj D;!sL;'7)XZI^*j]SlM&H(`DT"}RiݲtX# -m\|}trڬwXD '*t\O|M òEsRTI8CZKS|Rgan^kwY|_JWrZh7B*$`Id]+;ps$U*EZi\4^:'= AlQ_4ذh<<%JJiN_XOQZ1EIwd0tg0dRRq"^6emb@ʖ5WW(sUNfx@2ޭq("TM%qЎ3`*3+>pۯECU(\^fzz?uSB =>x7@l'T#d9i뒘:_M7ސ~Fjh@^JrxH,3lipn#!^LTHh㱒{T^-ZHن\%!4KƸ {$,,oX=l$½V@{1o՘{}FKCYzֲC(X}ɭϖ%}~dŊJYf(r|VdzY+X";Ad'bktǽxp;) ' XI$ we'  nLvqVz``!\Dn\~ޱH]4UAb;ҷWWzGQa$qYNN dywvmOI _CG085l ,ɮI  =,ѮvCA *kmVtƨ4`K,8ZDf|%}7`=ۧ $Fzc0:/ߕ ɔ;$ !Aª|uaa#F7e>+Qwx.<.}#TRF-.ݫbq *eU ĚSLGˆ#{i4Xf!*,]G}I:iAC>`pWCiMNcR:')J<;!9ڡOó~bhWN҅(#+Rbo+"L3pE iGIJ)"YW,k[{~`_R+f.fdMDYBztTg$j{ > eJAjm+) `j0m\Ai~(zqR#>+B.(auqXX!4Yu 'Pwiwj(S b-X(qû{0A`CI멦88 @MKb&KPM{1(3 AZР"B)cúh$C)pb򭵢ҋjYclTbiU9:_GVN7F}(QHG\|.rL-!@V6`W``J[\u!`_](uVN@Ӵ,AW1_"Kʪ&,?QEFakJY.X^ikK★* GVM}Q!#I Zg!-PrQհÌA'a'D1-&4{6p R}2XDcmy1lp[i ,T7ĈC! #/+kƲGZ}ەڔ[D'(ӕB6uz'ރ l vn"h$,7fc@(zѰPaӈ R# 8UiDH_J!4vR*=K3Z%w(Kb;M3CwkMd)^,zTjפ@bҫ9 Q vVcPt cX1CB=̚dku ވ )n sEs KRpJKT,;n x*vh2x72ѱ2'=p?܁.BV9) *q\dp8:3/jVt_Ga]yk~qmhKB8 % QLyÊfxU!:t|*C>aWS%o-oAM-{0c,"g ç?PG<ʵ:ԒS 78&VLɆDb,K9A& 3vTp/t L'qUNOt(>)Ti,[y $Re=.)`~cTGQn5PJgYk^ƣ39v$O3/|J:TnX_ dV(>lj ,~Ldp+HkFUa/{ȰYDݔHJo)W_5(  M z0U8/YgIU8wY[9|3^D%B,^g;% W#0J*)/,z[!;Fr4KUN0S^•8'@Ʉ>TrO! t<$IbTki(-T:-MZZM(o5:DyW*>$|-ox-e(eFwe<qL5$߅HU +ZT5-r[ۀw5/'B= d0/ ? E.vI* _F2O!`uQ`,s$\ĀNDŰ;#i~sZ,`k-&ڽkkŖR\+u)<p!_RT5$F[%mv;VZ7l\bEE YuYouL<wɣғ0Jɀ"~r-78C"mܲNXX O (+2V,K }K:d U`6dAT8;ۙ3N_x@(;C]2`h~LR=E/j<>B* G2.vTMRɀݎbJ2IuK3'[au VSS!7X j߷`Va_aƐIǦa9<IJTn)9BBZ #p캈>nlI !ZLqho\QKf.1Ǟ!b2]zH7:M f o  MJQSxcA`0Da\!0H4SwVY &ag 5w-j2]XzGwF_8SPZLXٰ%f?i]39}44M" :BQdE Y{b^H*=.Y @EdޏtɳK[<&Q!1֙N{8YЎ0<ܕ#poڧ1=k( '_K\A $cPoWu&- ltFvCY.` HW"p1TQ;L2SN{xr 񈌳=CX3iW@'*( Z&H6.FГgB=Z<.׼xWp[Wo&%Y~ApS |^&a(Z)4fV djrI5g>}<@IGIdMfT<@B\TpJq(0&l1%4XudP(h;r@ r{<ژ{ޡZU"ڣ^w g@kӽ5|X 8 _+Nf) aĽwou~v5벚,= <6b lp=_\x` t\eћdy% H:A m q|ڰ+ʊ:HAZM; UF[.ua$m0i @tq֠VQiAiλAy4- C55w HfRX9;C8O7p#vNjЬW==Z6QH<'փ18U^_-@=p: M2΂uuduEp H`08>-v !$C'bTjt"1=L Klr+-Q&t3`TD@Z'y+9b n͠)oOZ$ Pub"pj/)K3oOdīT D$K/ܜd.0QoVlYlzQisFADhT,\=0D M.X] F7CЊ {dž &4U5sgvQUb?.CmZmZ_(Ux֠ b)87!70}\rM~XoF0l0X^L 2}d \vΚNtH؁Ͱеg" +kø .u{Q$-sxڂaHW%f/P38bjأq(Ԟ ԙ"a6~GYuY-.t0Й`E*~CH:W:XL (GP^ah#ޅ҄VtZ'6t[ Q 6SCJ)IUS iIx!( ~F445U>Aa3!*p߱=\]뙹D%Y7q`@Mp4uQ 97˝CalXOzSA=t2fYN0+1ok5sf==@X\f.~ ^ \kw e"~Ũ3{y7A3{ pg"lO HLJCPA1;T6H_|26jb+,Y+GtH8_k@ewM(Smؐh*oYh} ΄r7CŅ|vfi@CYex_ POd'pIRڳN=O:A:ʚ_ ~+ |p>@x$ ņ[ދ̺D@(=d\N 2&J%Eo]#gj&D㺝V[B\z)roTO ]TF0Ym RCxzS8`' fO:jCo& q5Z*M2t^}pEZޛ va]ȒΞtO7 tO9Al{.%8@\*g63o+}QH5L&h*UN@t+y Ր*G)s;$DѩQ$}!T(q D8]9ĸ2엤`'u|] 2m,e`/'^ e;`eX8e9lζEϟ^Ak`sFң:69b9ůXf U0*#0|ٱSg bcd}K{c:RAJ>!)0rQ*/u iEf==Qf+Ğ!/0S$s Z%#̀) K܀z֊܇{lnJ9Y/*q2 y-do2Ƙ*?jD P)X,:hpM_d=#`T5C0MX#(*q_he! ĈT@a=HiR솈AYFY M6vps`F)=g(^O@|Aj*nރT,5QTBx~ AQDs=da au0\8LtJ(W ȣf`)N,PQ $uL*ϤG[͈26[3$w0Nz( >FJ|!Y^-Q0z> `1HUU[â?.ʘ!cJ #TaAQBBv Df,Ia=/>9(A}fYK{D4( Vf,cU.purja9OX!fmAL,$v^Ƣ֙ Y03 ʅ fk1>]0Țnl9 UA$oz2|G@L0(N.2ėĢa&m10R$jdQ rҪL|X "c^ts "ѤDI_A''0AL !rP~0`EF9֌_=.䰱V;)C^9ĽSޕ]=t[ vŕNRi}W^]H((/;|DP 3B Ô(hSt\iHZȠJ R3KQeHOh;'F1.| e^ud{&60XcT=Bke8@JQ17 \_X,;-w˷(7I]48JTzkZJ3]M}{(V: ШyB=Ş{p5?s ]cvps?༆"}1 ;봓:d݃ΪB]-Brb39GP5okwW*pTZ_Q# db98GP3{]!i4g9 ھ1JǢE]#م08W- 87qߋԑbubp 27`;ꖕQz{g]s3RB11꼝{? 3j 鈚k>#H `T.* &V呌;̪Ҿѥ 'N8dK g\ap?=&Rw3 y =1k@xa)Wl _Mȧ.Q z5N`tD)o<^F,Y(\_w#p L̒2DJpu0R݈/9,訚{7V}rcdGOpCJZ ~R܆Pxx9b"'5"_=zWWĊ%(}0O|$$058QF˭?_E{&rq_@ ?ю>J=nPĻt(HC!ïޕ$4BLpF6̋v qD OrYɳ ? 2&D,F a6v%0O/dkT)pPk)ZpB\ĐP^k$tqy)EZ YVBǤq9`~ ^d; X!SqCrT’!}w b[s5 =Ahe[SZXfV\&~ԊfsVBڠZVa೰oFW` HsJJzE7{ YU=-P\*G+Cӗ 3 N>nZm梺&88"Wшw:SXg)na FWB܌:N?)6{""7!hTmn@)l;H W)#T)hF,/~nJ_G!,??.Tc(PP z DVRɌo0<" pJLD +^9rMt>CQ2+k+hpa`Wwf$ n3kDNVl,&4*d bCQly8ԯF=|Ԩ劕a)Y{Gc\Ux_z_7{E}wU,䇖(Ԋ"AwXSDf.dz 0Lh&wQJ l͋H6`h40euţ(B_s$ l+=4$u܍@(TAT|+ڤTƥ  8C>A_n&Rpry䯀쒏,sNC<>+^RbE~*pidӧ^5RT'.!2VTJ R±RѿDG {T_q=P2aEK.'IGy. y`q˝g2;ۊ& G{5tNGQN2]R#]WE˚Yp@nz 9li3?M<gE<)D @~u&|yc{-Xtk{crghL4<ѾC<MJJ5K_4wo0ɔz J& rΆ 5ɠ:?{-79ѕ eT5lѹ&%xE4V'd>G5'q=y~trkTMn{Re @J秶9_Qǥ.@BxLhP7=]qAȮMDᩝGy.!U{=P̌^Kښ't'zbX0YI3TxO;l+W&^"w!CFmJBfú[sf.jȕ*0gdRgppKE%QcFHPM FT<#72[:Yi-'ӳLI7|pnkb6>>*G)N}`Î}H^Ok9ϐpiERkA0fIwW0-}:廆KoBz?( t@4W %" fMr[j8W$/ZS`ܗ 1JJ?ŃeӾǝ|cVҢ{_"7:U.^`U\Z E+v)R(9Ll<4G.ĆFru裸[_7-+ )F73Y&r75=Y`k;+ k%JS.?*!nlC³ok{IqACi}OC4U >zh`%I?șWҥ l 4rUXi-yV}-`JjMι*ًZFx;?Y}KA ukLD,fIRz>;.= ̢XUkV~qA\;0]>E"w6BA.`a-w͠R w17D%5 Bef6pNAj*l> )syޗMڤ_ `VWH o@sWfd 7rAm6tIIZ\HbINp.LTGюCˉ[N{ u.\5 g>\ GT> S)$]/` O/ +G(#(fŅ8=PeM ڗd>\_gh^%@aMq^jʚ.5i%iSw%Huu%6FGipإ^' S%榈E̓Ņ&Y0 3rm B&};R3mK\ٶer-)ixR!r*sW Dp-]4ԟ$1+edMvm{im?;#GD#ULEOPxfB*6ϯ'EMҸ٩L1>FJ%D:I#uZ8i'ae2"ArL+aJ ?[i"*=-nc :7B؉z%3l?I#gPFĨ5ױXAbڤ t$1 (*U*kKK0BWaaXELd9-#WU8DHJdz !f߃bD>ea2b#@ ULD[CtXh- A@v{z`zjמR@!iE`_yűERwDʡ QhyB 4~ɕ: Dݝ^)'0Ē;9` r'Jk2IE6' S&t&* "-i=\i m}Z1AO c<.YelB\C'bU.f®np4&;gHKm FihPd|ի4.a D) H \YcJ+JflbƠѦ(-I!gQqCjF=^ kx9&TH"u_g|HG.`@(!j.Ѕ4 H >(wr-+4Y ZNQ/w_݅ˊT<"NU.&է) uT$xIUk'\U Oy.$}yxBU_-ė[˓%PîA_I8ff#@e6tɐӈ9R sU_JPfXI&m޲L(h~NUE!-^\svլݙ8d lmwp<"@aQD|&ꦔNť:*M(R"eMu]c5A 3 * "W;`A۝H3}p}C9Vv0LO!  (JL ׭ĒbR.5  E o}@]d<~Em`JAی)ǩܷ (@Ih]3tq6L/I GaTGqn$P7i@XgG;≠k?Z_5>>6"15IFj1&eB\Lç^i[-FACbb>5|ю S%mnϥ?.__9V D[!>qNmOLUz9[&ayV*zB/ Vo|1GW= XQRޯ[HjQ N6V5YEl^+ ^ ^ۛ?;'RbB'NPITa5/'V$F*̚egы K@0VI< xUo&#FTNX8xLQ5 崈B+vu`{Ln)g3 G]-`tL&R6p!Ht }xԃ8S["A`ro))FCHDB5NJ`n  ).T\>hli$ .BR:9V8 "\(Ped͝21hk)y:y@9$[< 9>,h*R-K=Ho| S3UUAt"Gw J!W`,w`M6u`*!]̙WQ {J71-#֋F hTNRm)g XNޅKhkj&?;A"jX}V*Ѻ0""S<;vN$d  g~ Cys1Lrxpl<,^DN En|: :AH>Gߒ"P;XmXLz*$BՉ9 z5D5 j*vb00WDYgs3IJ[r̬ښњrV.<_jT*yzN Fg9K~ڽ۟f|ؗ'7@˖~T߁d.lA361z# jǯUqdl1@63߇"I(y]*!@av،@V4+lYaTd$d) ̞#)=H當BUoGd$ޜmmd =~2%]63ތ~l+Cd "LO6a\ q|2F9!ޥ;SBWMg)ʝR; 7TI{8I&&mp# ^Vʫn{(~thCN4~bm<%Q~V,7ZK-E,~@&\x`tܐ-ul+qgnW4%{Rr/%Lۥ0cP56^ek)R^[2IVqšcہJ`_``'^:@zG^ pj9,eCZw=K!!{h!RlPwdob㞼րϡ?Jɴ f Bµ4W izqB8ƮYU{+ZJRf l+X] F ۣ Z*3.dMmXv^k!wp<XQW{zI]* s~a'3ݜ1fK.Gh>¼ RAR{ΐ=;C1<.ܱIIj֪ .⽬&f$3cNJV/4D)zX[:Z!JFǤW8abx0xx" 8-&?[b 0ه`*QEȳhOh7#pT,΀H=Yco])e]鵷,zBs l8XWV} 'NzRڳ;v% ұVjGs/XnlR|gvy>@af/Ie-Z cblBm8!=7/(ൕCY8DoNDӞ Q玭L`dRN蜘n/Y?#fLٱ43.A[{#̳rsEYLb] Ȋ=2wrQ9ljn"*Xk&_ҔK9xm_|R2{Б ?%̘,=nږ ,lˇH#&6+=vI k n{x4͛\Ř(u>|$1||S::DKM\ )NMsU c0P<"E|}II$mb_Pf`igLZ}:5 J0EBQkݑU$~do0hKA߾`d/N :؛Wn+}O=;L}*)@obCgO'EU.UZtx܁;…IG}'lycXɥHkAp+(1<3=z5)x "TZ#3NT՝s{u\'V8p$(=蛪T먻aj:ÜpnOw4 oPQL7b14)1'SondAasQ͋LmKF-fP8w@JLF_4{Fw"IΧ=@L-'h'GF¤2H"hZ&&A+Y+.@0@QbИ=Cñ %1 j:XЀe .hghIҡ؇"#lȻ)iA3ݙ: #UtH9(eb(y^#O`- ֣fPNeu2 /d9П(fBAk= ztg`i*p~>SD\j*wP2eik&Ǻ0gP\C.= {tWFT;q#S#(qĻD+0A oev"}2r=H#hcN'G`VΨDzDb0UDnuXq U F?ͣȴ.J4U *3!x*f@yx3N ^^_зYaABsSLTKL([[1 (Hb9uV]Lcbw Yx~*c_1 lq%Iz+$Mx; ݻ8jRAD SJa-T_g&73/"jl)R粂ca5eA&i u=!z+S*ZVhҨpT8=XcR2؀|pD{߉~YeGW[˲~hhrӔڙ$MSBGĀ`b/rc4 ص#T 8IMI=ː xwjVsҰ;^u#NX ,lbo"4ɫ`P379޽DS8gZe'm =M1:N{":#ʮABZ%=@Sr.Axp- Vtf\WC )#:NAf g_nJ˕/Ob@s5^U3J'O[VY52{iA 9TRkA- mO!5M2{si Th} ڼN4.eSkQoa=X!8}Mr$ 㐽Ċ{+GIL#9 g yU bv̪vw[3Z*0%cy**> bhoԯK$_ ܴbrDYۑLra%MÈBV=I$xߙG afӛBÑ$"m HN;OHtKbbSZ!N3 8Jgyb}M aK_x,++FÇɹx‚~zirX12A|l V<1B{9%XcVrjk#^ޭ~v$Z˂t]o μTlV"uMpVd_ #D1"ޚѻ0¤޺ny(q_/a$Y2 Xbj`F 2\iz׷GbF@C+OC@7*;Kc3;ed!$&ge,R @^C&t'B⽭?#D"3&ɟXb73 QdDd? ٴΌ|L^Fp=ECc]ǜ4=ED؞v&u{a8̹UDΈ3o~G0o:z -9nI䯊uԘ/7$j Ł$XΛQ& uJ7j#t&sR*:MU`D1)P W}th Cˉ@6:[Bv$ +BtV3r]*E[C&vk!n&Ϊ%iR,s,S3dxIzŸd#Xj2JAH,-#~ZfDB׃5:9&*Pk@o2tmTp 雈b8K *[!DR*㧻nLCB5FV}=BAM{Lb׍{ACDѾޗý8)]"Db=o6S}dG+|@v6ܜ\PYQApj&xTh#ƙ숷(M9OC&6?Xh |+gN'wP STt`jm6Vkb>J`*A͕թz@$0-ՎOkϊ㼔*1`*?U"`Nʝ['C>=7AO>B$pn@[PB G%b"'j!Ɲ⓵:FV=z뿃> X 0NBCd{enM!z&؉ 9Fr8Mca\d b'!l;D+;V_r.#SU+8Anra\LU|eRS;߁>Ƅ"O\ͷIrsن3R3juxm}v1a-sz>\z!g\Ά1a>A!8 <$b(0,,$7#9y`+NN k,J:Z8 a9Ri!jNPꑶ2Fx+,[FS]ɝTȽ+|Xztôx9)WQýw;}U#ـDё#Tj1 ݣI)#P3徶D[{Tť0`~,8 9qyH;]җ;X402jׁ JYQ$J(eŗe)9- .rBP9y9[^Nec06B2*S\+򡐶QhJCxeY$X\sLag%hyXQ(au|P(*[Up溜X^u3TFđ=qα!tXey#STpPm#R`C !x60ݥw7Nm#`t;1Ճ_/R,ߝNemLkZ/\zAx&Aߝ֯Z:L_\6D8M1 Xhi5h$[&&0 ul}[-j(3+}O)ڝj!\ IAC߹W@;-tXDm2H/uUa'xѶ=,B> ~t!3DP#dRVX~_r1,?K!w0mBmWmR Oi<=`B$Rݡ=x_&EE%.6+{^ 9݅_mh#Sw1 {L sgo!j;:;2̦Fk^m⢇ޙ?6NW^u:{Z_|ig.3@j>)V7>JM,vǓpZCD+D?Z@ohRyOnj:>m$h]UJN,_wP|K 2cyCi6Uü[I7mtP2?Yyz:A5|A?[Zlz]G qo}'ce>r_[_흂:hk!g_4{PVH׫(ytEYO&98=2/=-aUW}S2wk!u ]AM'yKPXݿ^0_.ش%?EP t"tKߞ;͝|+O#8-B}^9b׽Lڹ+|zυ &W靶6V_1߿D r>sL/@_lnN"|QmFIrxN7GՃR^qMg}ImqGk{W{ fGx3=;qK}ۛ#$4܋ݘ R-[3w"q gbqOyat;m_s+DQ{rs\s􅙻|7붝yɔ+i\O*Fuo{}nAx/ RZ_[͞FĽ/=Ok+k[]ޥ;Flb *:};z׽|\x\UQ5lqm6bGq}ސ%5(yuOXO?+,G_yHesTb l/cnSLI?:aT=k<՛ָ/7jn^tA?j:6zV#^n,/B?)v9|1}81Zg]rm¿6pfOVO#?>Nc/B?jB|Hjj/l^ܾfU}XI(?ؘt6ryvLOg,V{trT~x`=Quk5CM wĩ^)N$*EzSOǔ~6^+ѝN\+zV鵆C}Erli+>/IoВ~0ퟅy_Uu-N=vW }רޠ@};]hCW}ꌿkTۻ{_ _GKlj;W3ee샫k}d)}СZ V%㪖Gbι~:Ը%UsQj\qrf^~qp?*ƝkUqzMP\_N~/i~iln kt ޱGwMj@?4:?:j}-&UFǗrKO lA>+Zv/?(݊$s[SቻsyzDx|5k<@OjJq {]v;^a;RVJ~)p(/V'/+_wUu^hmP 4WNщv>sUjr]~\AX~گ=^=Y~V6ċ]wf듓r|Cs7LɺwyP>"vKkaʔQ;~QtT_eO^IU ?kow΂zJ e[܅b1y\<*wr;"帮y鹛eR Mk6~;*y?$"8m+ǤN8>{(/$1 5s/ KCօBr}'|,K.seah#}.4[=.^KC2tD^H隍vX6/}gmi|hoQ;**x;<]W׏;}WacRoi')o#{l;nYI_[_eO`?{F+P} i׭c7nDwDm+4~>fi{t:ݝ&Ӈæj@{:qE~&ȷ'E','?+#Wtwԋ{4ȷ#]2K|ܝ ͳ]sAs_ЉՂiޮn $ /e'[ !trC4^nFmwu|~]Ju>Vt]}:/6߼1N[˔yN?|)mس?\||;WRx(~g ovSwtR1{>޿yP7(6fm{ ^Qj%buiW7~Z4Co Bnk%<&|[E'מJ>Y˹ǸӃf"2&:9d%q흙]OweS9Sb?[[].luCE|T,s8oM~|̿kOE/ H{tD謔iS?}o5/?4<[1^wCb~ f\ H\#~ |@?ž_gl4g|6N]啜#CvwWݾcϪtz=1tA߿=͏|w7>0%d7fWd!Ǡ yƼG]{m04;Am`.m?d*>n i֕li/T*>ߙAq;t|<8fRnwCgf-Eӱ rppS+Gm'y^r+h8y_^΂h+daz'IfTVz-<6Wst"f昶#w4N`xGfcDdڥTݵ=>տֈm]/\n+}]2%#BO: ++23}Z. ]eay/w>aAt:."Yo/'JOAJ BWM:]%}dʕOYB{ﰶk"掽;|R0JCKΊ~Lㆸ̇uz}TVlXWT^/af|mO϶kSGڎ.xLu<$KAAxE,U? m{XzH?FlI9.?}Qs #i6ˁM~̽g.qIw#^P0}6V۬ ?29J?IKm>C=Eg ҫQļ)6WOptPOEhµWvܖOqlY˞/EԶ-bOZ*~?i@|2;XR_?*:w<[;k5-7.fkGؾNі'9mKqg>>mVZ8ߧˁG5L>&˒ܻKЦC1m'1 6=*Hkgϵ|:"I sL,IBKf+|B|];7\/q:.==I9G_Gz;yu6JC䗞B[tZQ:Crm@齣X|P=z۷ I{mc+,$6C;a+Bfk@ۤ@7AM+R}\_3w2۩_\KW 0k+R RYtHj9OBy=b?"x_w̌ Q}Ccʬ3GGWQ&e:O/;O0ɝZrZIh § :n/H޹qŧ7 wXĮlaYb C |ߨ9$Inm2đuw=mo\wUs'd]V')Pgٌ< 0FcUڅ VoGhlyȫNX1G@81$PzӏJbJ;a/A=4A2Gܕwrw?|{ƥka mKlM> z]7Wj:kF FB+[giUe|u92JFk.U/ϰCk~)e^_M sD!oFlW/^(eU޻٨-{,ݸK.^}Z9/{ߗO"WH>ey#}.3}-o/o|ZakS*Zgk|zɝf$*Z~vWߓ'(H@~?]{ۼjWzmn'|^ϧ^JO_R_a= >*=rTwOWnK,T!]OQ 8q^A8S=$ +WԃBLjFBwJ!ftPjx.:47(wPI؋tTA!{h;ܙ_ր~O!׾Ruhlڊ/c'1ӁvwH`ɬ>H^_}vC :%q:r7x: ;yp_mv~{?K֣8Ժu tdYG]+7s==*E4ُ .rt GגCŽtݱꡯJ -psU򘭭EnǦi59(:jyWU[k^Kk3. ulU/ _rfӁ%ks]Slz0߉N˻WOwަ"ydAv* pasH+Gs׊ɇ ֶ;h^hN0=(Q(&w5ݿϬw9Ƽ>ݸA[-1W#ͣJ~p=vA k?u/?Oe["ٴP03`B 7V'z>}FՋApz9< k*R5?vL~q}v§__GR}/ϜV̥9}\}r"=0o`zeVz뫔_qՑ>g{A2Twr{s^=_stKiux9uUɦ Y%;?I"9ŜjQ"if1ʂ`ifkE*G!5<^Zl@Gl+Wq6|^@">kV4Ck9Dx~v8/-ܶt8 n%/YvIJ¹2[|*toyX01iKeU6rek|eou'޼&S{Oz_G^d|>l \>/ } 4UЉΫ;{ٽR+;1Iϭ ̋O+|ܼh*Wm՟߽>Wv 5Q5N> ^*^~a:⦗;`7=˯w*|y?}{l&Pǽ೩j4X~-7ɳ -rz}-df@[_2U7߼(>@yޣZ>r0& G|m>gjo6cBR~Qx>ݙp{*+y M{X.bSs'm^?~g QۇHgTv=Sq}mYَ/#GVTܺx&?f5^;P󃹻;x_ct=:2N~sǕF+uҙUO6!ӽO.GҦETލ'/>:}3崷<{'yPFAϪssUWAowUf2R~=cJ>GLJ=w_U:3Y㕌!踇hܑ:qQvN[kn̽gyB pQ{.:lBǵ _I}%YS{F̘A_Mk? XFTXGV}#+̑܇ҦBpl͗ңcugpŚubNNkbYhcq埞tH6aILքʛTʃUԾwzvL5ODÅ?AʼD$q_Pp`a:!%z͑BF{9][w[ |BֶLئ!׫uw[г<=[WfEj5yԶ?P~ԺV_"q:95i÷pNFxrӑF)uxr}z-\W@E8瑿TOe q*Ÿ?FyMx6y/a_uwjN%D.p88Zb.{jNS1%gVN^SCAw߮cJYϝC!= Wۊi9Pݹp;glƁG}*|=섷"y䅏_lq- ?q2/;co!A Y阕/6/xQ䕨|`$÷Lt[y`9ud{8[;ݻkhwh-_'VhýiV1M{9E_v(fغ2_p~+#8{B4K4殢ymo39Az_}/jkdqH wO?O2w/Wn0)AAӽbpؿQښz4o_pk Fizx卸3+BhX+t9 X~{W Ɠ5ǝm{d>-~μk󚣞Z#w"܃CKow3w__lqE`_={dn=Vp8kRNG;_!bģ.uwc9ΦѰmeW^JKZl]B_ԙw/ܯ<ǽgmkMh&U2޵OG*0JXk?ӽp&vu!$| _('-8"OP9@mTވnS>l) ٳl`4!{U^3۸_2!;`oߣmCj<"7e>*vO`]3׃nӃF^x)5ROw/ٳtw~juI]_^?ۄv?يE;Sc{aL^wͽP)azFas@p:rL_|kUc i_O>s Aj};n7|&j|t%X7kﬓ1MfK:^+;gC4v{g3u'{\eg M^Y>8Z{;/Wܱm^^9 i6YcyR~w+ậ|am(Dow5%B׽ps[#nw'ߌ{[zώ[`M:vfi-~q;D\=,6?/9ўNXÓӡB8K}X:g,U{vI}Dn_36KWZ~JGv=l]Ow1iMQ 3 륀owm ؝ʌg8&e>~3ǯ[R-axm8`&Sl{hx="!'^s4s 8ᷠrG)=KoUt_>4ڪ]w~ˇְ*[=1s<`"n|g>6Njo`"ǹ;5;lryztݎtܻdDu>]Ow,?Ot/&vvy}e&vGxO&v/ǹwolV暑lk!a ;׬5[н^vW2rGn(/'3g$}i~:tݵa*?. 8d(ʍg#:!{s-:|q+;+f6 )2~pzC=ӹ+5w'ӿlпCVu!_Ky|Q8l-w{= ֐qoYί??,G=pWȊ݉q!O?|w2e|19`)s_O|Isf;|sכm=~Ms6?]W'ŹT^ۊx[9ߙ\lsgMcxOO7ky|..{?.n]{i6nLJu+.de¦dJ{i()ίL~v0"bws߽!]F&cՏcFy]V?~ߞL<'9|uy~Vx]M@6~JO.K&f=:W,If\+dĀ5n~/e!w8 OEuѓ͟z#,k1ݞFȏuJ;d_%w.m NeOnRݠK'W<|/esq*Oh=T}ެ>Ϳwy.^cԻMe)>_csVivWm|/Ł"C}e[O\C~ד 7EyҎcR/&u&?:g.u%U#e{'f޽Fɚ5mU.5-oژ``|ûpLF*4V&wvEjɲwjտϳZH]gWJKudy~(s ,7=_gz6ƥV^Yo0](ӡ\qJ tP'ף!įamR-0nV\ٛn`ݯ{K !$p4F*k$SVx;a;mPq1«5ǨX+qv!>~!`h.jK>M`/ׯ#t7Ol7#0\^e@DPfv75eTG>^ >'}( |ɲr랰[);͘Ohh{3&Grdv:ؤ6IK`Xi W"nH:j~_򋶬t8K?f_}NX xm M/XI@ Et}>$9闡U5Ny {]ReSW\Aywj*Zk7yGte. %z.UtjdMr 6 w f:n[BT?>[EjQB@E@֋P>pnibe?B(b`7/->~^v-NMWd І@czmaLaԋP,j=WJj2of&G+6̩̩)పU[Ж޺:9,2 mԡ_MCOY<ʐIr<^ 9(d-waщz Rޜ ~Fzh__Bxޯl߷v$ uOӑQvSpf˵R_* RIZ ~"`ݔ$WWK]lw/KKT"o繏Q*rd".R$$`lÜ֦`q |۲]jі [ S$&|0`.+QwR.&]&m{ݭ}YftXZ"׈lPڨ+Y6+e}>-d!/[Tւ]im/PηNU>mCly]^/IR| ^dfԗct$ +~jEJAOqefݯlt]c?I^^g:fPoO&Abkr/"Z5+o쇶L^.-]?n#^8w-i"i͖!b1z gJLmӏVo@/V-`}H*)!7y11;KO}j> 6 Ofb!5.y_l ]C!FӾBM5)0!"i)kM?v j|ԗ<]_R[Ԕj\;C4} UՕ+UF>o;?fsKlF9~TRS:f>EƦBnW5.;X.e,fX_f! Uo`{Uakc-27v Ig75;l$!l`Ƒ5%4Γ:~hX:(%džp8F[[8]mf-!>9GV˼2տiqӤIE?7L~A PQ^#2AUD]$? ^3+ҙn:]ж >N\[kZ}~GݨSz˺QC|6 ҃u.{.^m ΙCTHEADhvmmաn͢Gm@nƜԦ 쭇Vˢj)o^رիm>e,:lB`yiΊaI-xg\Tr|]oMpU2vԽìkza:~hѭqxx&Uh8*o./QVA㪮Pz "C j3Ԭ-'w+1sF[!dr-wVV0t?QJt~KOf`3wKGB1\A15"T'Iũ>R@-VuR (Y̡$N퇼Szg_5 C1h+=Lֿ:Is߭O3v!'ƐJ{n{=1r[HY4Tyf `bCKfVhaťXuIHKHO5!kLyjPK6\m~+1#ɼqX.}am8t ,&gNcM/A i;5px<`&.JAwߊ;.7k p6U>E-yXKlII+f_ؗ(42[;s+@P&Hn2"ںz6r/1WSbYv˧'IH[MSUX z^M8lQd՝n8ݯ.k)I9>+@5u $&g[@5C& U3(S>speInb1f lBe 6840;WQl77v!Ev^ƣ_n4338ޢ`Џduc$ ;ꧮP}TZ)du@Škm;}g? Bql$Qى>tm_mxYYh9s0pqeJ[wb 3fV.7 myLEVDK#./Fi$t#"<`FU%Dl2,zZiu6BDze-ՐI }0׿ Sr0.JMcPKs~A B:5F ;xIτKMzH(rVnە~!Qmj$ghdR gk(!$.[Bxi FF\jBfm4UB"pqY̧jCHiS4W `@X\aegW\p5ZO5LZQNwAC&kU0<[WQ=HCoWn!C5fJd؜.^4/ńk5QiUn@Uaiq!뢸B#5NBcz[`/g9O]RϠEeTx \D.#=[ %]˚\EFiޅQ߭MgkjYO@1ވ@}TvI,N=hk[p%L\*~Q%M^| #H5TX2$ h[&wCr>l}-iV|NصQR,mKKmWJDKЬ~!9J$,JvmPhK o5[ِ HaH7I\b0/ Olg%DXw3ag%'G-c'~GIh})hcg9fETY'*r9-naxw3A)݌)Z/+%9M-֐q,V]4hu< zDB$%l^+ ,./ K0 * Ґ7Ǜ ;v1Pt^7ObL&QAfAj4 I8^j8(H CN8l#K9뼲"+Ӹ_% `gB sk™ҦY:/Eeƍ<#oJhz;wP` a|YYVҚ+H?'ZoScTIR AK jm Η#& (*01pU*0nrˎD"B.Ii^.Dy~\ψΛPk ]oWnؠC4V{тvtH- ( ۑHV~߂,`uWQL^&c:u5$NMݦH@Ov@5FΏzRL %DVKI2VNE괻7˭C:AAgMDvj2+vB%Et\.)Fg>.'o]fMVbG5ڤM!ho0r'YeKbsi}J;G$ LgK*֞d,~ॕE/=BptZЬ!-FH 0[h(u9bq g_JadS#3V;ld,R0Zbv(F#ۡ+xĺ݃X2quu!"V֕h,6XʓZF `떁 5ӵS^Q=kD'WGbG@7rm{P,ݬE'E>D-8.Ԟ AY)qCuMkI=OZ9[\fZYLA l@uU8k TRoPaeSJdcHy2=B v 4ZE`DV&^6)߆f2ƥ0p\;/[Qל7d) Q T2 ,s(HRly\M܁tZ&i-4(ܱIc`[ q j5#Xdq۬kT\9W#.vj_p{q\ CRsLٌ}!$O1/%tf{y5'*y#kfxwM^3qCT( jmKDBM$MT<#Tv dbL\fG"r^&Uʺi'I!(QStОA/"ŦQ?qDIUs@۷&c(;GH3jU~ 5(uRFzBl'yxBf47G=dw02#M)VZXmu0WEhc;S3\fFA8.F` 's, x_kAixthyHt"L90lgXq4iL͋ X$L#N,nF4L *:cm)#s`a3 +ɊjɃq'rI>-ǶB]sv8օГLRX-ڋ[y;E(m\iG̉[ӾS\$`rf+4ńA5.ؓ7:aʇ뚂%L%'"6fF]$.19eFAP0Hle[F2bHl3EL@lAT߮~>U }}U*y/pMKJWG,Dd|#ڵg $'9]960^~1Q]``:B+_'+Ik2"x',禀brVp~QoNH;>laoȞ vgZo,#&8tm֪EV>3k7|mp[#3SsSLN"E5iL=;H/m aH*L%bW/)) -=|C]ɣFڠ5_&w=KJ  |YH t.,h0O9:DtgND=D3nlHa*hvf,h6Ew7i,&KMe4P y1/f纶AC8O PQzDƠ\6  Q끹54fu{#eEy9GygbF1akGnetgL!#'GL0fMP;?xb>PW2 4(:lH1?:@D|(N]lJ$}o%@+6 tR}r j|' \U= ZرAœe]oҦ q'YA?-L| )H@3 7I;G4aG7%H.p 'b!k.jJIefV_sp2`GNY]o eԓz_fyRV0Hu0/Ƣ;"DoޛӝSSvQӺ3_岻 er' Lu(h>ZGa7Df,HHTupMc2vbPHEH鱦r;=a.iGu؛; ?!6v4o[gR)8ΆD5<תPdCOSDw* ԭ c}A`^J氣P WԂq-g,IhZHݤ5!H|n  }vȑDL^pN TuY~ZK/?h&2R+h<3=wᰣHk}u&^h;þ(DHDBBkȶ/Bn(кbznG8Q5F {H ɗ֚=b;Bb%hl$;H!Ii^ СJ9証x( ?׼ ҫ_UAc3,}5:o,(f[0s$Ip㐕2q{r< !?tػohjr2)2 izt J_%Z,IrP 1霴s[f|E:2YD[5XE©u<*)hgbh[Fvךěݡ:o`Bn4Њ zNƝ7Q6K3 KƠjr vv EWRb ar MStܷmC`lcoipu VV 3cHk !B5x=c Z^dK }纞5a.0H91vJ)u3A( &+ȊjY8o1+Y"U҈DJT@nHB b&1|,Z j'f5szsP)p℔򻵷!F,`Oq_l "{ZGۤTvP!|]8=ҕ:fեTU{nXJ]<&Ƴ zW5ePlYrYʽ'R9C]\-jf $KhBDw5Ł8EN!H1>f+90 ]fRm'-Sfc3Ex_J͗&Ho**&B&䧨%IWw3%A d!n jkl10";gp=޸.076Mfs8ԟ,o"4|wFҬ']ݘPR"7+  J#mR\'RYP?z rعjEAT?7p::C:Cz59̛h-13y1=$فuj=i~jo:hlY.1^m)S[ a77W 7m ӄںg0)BL*̐b@L1wvHggf#M*/G s*";CЙujؙѐGa8_GXJ-51_Jkp9$Λ Muf5;yiK*SrQ"ҏфaQT|9Oi:]12'ƭdS7%x9NDrD_f!w`BΞls0h[>vb,A&<)ckjlϘws 4$V ' !Q tJk Au_&QQ6a>٨O0Rqj4$P"7!#W唋+e08yC aC#i| aCv©DȞ}&Y,g ")6fj,PaLd/tґNQ|`}s]u;x:x$p*g. Q1JL]I+PߵS0ʜ_<]UVkДQ_58vll#3i;֫hB-7VGNaL.`:G. Z~"t)GJy&KYygcD`pD|vB3]HM =ĄCv&9K kZ hh},zOD UiTU127f_Qp37,P7+eG/A/ h5j;Nyl/ƭ ԫx1LA!.] F5o@r_8 luLpӲLRn;$PzeK\D+C\t=sfe( tiQe+ JQp}o[uAEsOtE7+Htgq)[jú΁@[>BOsuA&iH"U :r_q!4YfBTJaT pv${ۓm1  e 0S*A OBf3 cc'vI% k77x_3BFhBaWܭ~:7 <|GG e 1L ϫ!כ䕜`q{3Y RD]ѬúŲ P#lب[w~a@_ֈ%'j͝;,XKt"T)GV ,7L֙3)YuLc϶Aϙdu]"gĂO;I$;.d #Rx# _v}Hq,Da] t.__MOj,禫 "=FmyO7ݪ?CO-F୫P~h2@LH72ffš3ႁ:ĐgTaFҝ$9AqD-eCwfGV1AJБu~26m(75~]9[]3?]GncdNgF$8(#3".bt`djiM-\v?lӢR(o7i+-9_HtLe,aw[?t =6~\+1-jlmLʵ -ꞙh2U[s($1@C]9rekhD Mh izHx3-Y#NsΨRMpjHu& Ew-h=+^2i􊠀,IWʯ}![dmXȈԎ cк1%lʣXLPeg mh0A!(Ӛ8gn@+?5_|G'AOQHuƠ6N-e$Vg0 0rG֠v&sZ [pO;YLK1G ՆV\sk;2"P$/ɱH>D7PKTpUy,#%*A뮎!2b0T9ƶ'#4 9f(Ҁ:3b ^))}NnheD-9sfT摓i|b$e<岺EJצjwۑB-qAGFHÄx{\YQ%NqLr̬J[ h7L3 M5o-uVR+-!80T  ̑<]%3v]dlJJ^Fw2~P;6S67 o\tNDB5eK)PD!Y-V+6d=УSzP&V "d5O<&Q7簊_irhn:A5q(>b%άӢB?ձaڂ.e.;/Zc~-8E4Ll_jQj֡~(ցyY7NBt&U4GofrY0kv.Z'vsERA@83CFceCrv=5y.) ߴ5\&X3;oVȲr mt$4+pv֠%Zm%p= \#A po$h5 .dL5'RHfjVbgA7:\ &n0A]хޛHBz6>2ORMxwF'Q^%iR(* #CdpFʗc5QLjЏp%BQ¤kWpmQ݃VoeF~ 9ua A3'LD8,s [Z]}p&oPxm=:uRa WU ހ3bA1$neYrX i !<{~w'?!{]bh hFߘŷE2K6گ Cu "z Y5YDPxY;W_W$u4,ɎS"yq#A3eeT\q/ <*oh@xAWiij_kV51Вzec-jCK-[b.{άq5eP ms՗Rek~l@x/PǑ(7Rxg|b`g",Rٙ V'y6NN8q,pKota*(\0 *)Z4>P4ؒ\Ho?¤dn- u6Qx"~@꧵E6r@p֪%VdL*4?>Ԥn3\2?NNnu/) shIM6B!r@ە$!ηX?[$F&~~ ̕Hpw`C5'c9^8yj q[ R)ڒRx]𗘣IqgO2z,kǭSX:Hcwzl}/w c@=Xj=ْ4͗ :Ctv|uEB$pH3̰3Q ĭ:_0#j9䙇[:>:{2uͭNo3]8Ob Fu()+g 2q?7C_cxcH7́v@Mfѐ.֑KAEBmV /jn2HG FBQxB--qyX|¾mz~.D R<ĢV͓Z i4ig:Fj~&JAkٞQy=mŽPb٢h0m"z! oށq\qVםܤ4l(<.6ts]dHFspZT$*(GB<*5b-ڈ.w}-m'%UTHfd؄uDⵧwz7>` 45x<>ERtmw$Qô v&:yQoLT]8!v݈kZk$b)|]<|e}g198ם{I );s6ް)ѝ`gN?PgerwI#񓂺jDu e ţJxRј6H0p#pSB".[x߮ny~Y߮VI %>/ڤڧ5Ey͛arI:B' 9QE& Ӎ{C8[4sG 1x蔸w?_qisAޘK`5}F,֕泼0( D*FJ{\H%B`fʁlwm8;ٰ5r=vYWˑlgw&x-1`0(!`T%"+X 6m,"y%9b7#Z&\6ȮL(h3Og(lY6HÐLVw[*l*vZx4hg$ڤu#`ZpGsC}y3q ;%C4nNW׼+a nޞ곩4]v:QpuSi 7ŚM x7TYX@V= o ڔ[}WR*$a.5"P`X#aX)i ¹H85qOsH?HQ`l#_us$]Q)[Ȥʩi XI ]s#ɜj&sA萤,n(ӮWf}v}bF%VV[_;d0{R@Y bflMnJf&FgLY%tv4u;v0bU>w\-hۚ2jI3QgScƛ7bZt}]N"^ ,Xn]〶( }tqı7(7 [wqvh(*M6-J|FJMG(\դ⽝`rCOvw$9]nL! زlTTnMȦ/&q1:F=~ߵ.f"ZwNY21xFvV _\Rg;vJ.73|I x'& M%QД jD^8gjf좯(vѰ!y wIC{Q"3,Cp fm5'lqd T"HVUad qpʆܛv)v0d85n>2m(`} I! ;(^:/dl> :=}@<3Ā]|ňcolDG/#з$=>c]j,?Z:n#\g >:uE{[XdJVDX 23I.ސVɉfZl<ok_[jHB|XDV+ xl$%g,$5gN,Fy0?tփ4Ԫ\22 ?dM A3W0|Gr!UWv!6yqHYcNbMr@GV-uP2:xnlB`3L v,:T)42H/8FDz|4n;ig &/\̙ s}^=+NKpG}sS]]a<;; R^WYMI==8cn/Sm/@>ttw#v[@pe-f)<8&$y G°bLl(N9 Hrt5Tl#Z?)GgֈY#u0"T "[n/|^'M{{ n/L|#jԖ}:][-Mf뗔쏔)[aȔ@V=C ȾWԈcYU m`e 3BQ+~C+>~я_ "Nd@$`E'̿Qb\0 4f4ʉ%yX$$W.fye 7V5;o&P &B)t*E*_M ؓ~\ {.J0uc"$)u$c]f͙ kR+V _ 8ɑc ;ZWIBIXx&ݘL<<\'eRu^B @} 6 qA@tt#dR{4.;(ucA!6|se*# })$:τؖlt%Cu\w u88 &yvrW4(P?G}ѝT3,mv]$Tj tC_v*Ag&Zx3:Q"9FuE7FoXf:]HQݯ?J& Hqq{&tPuVC<ˬ:PU?z-iROg463U #ځ;;ÙJ3P<GW#jOc$dkkan&j[C2\mP]Zw}fY{ɲ #wZ $<֫F'^Ұ"7I[7}ʍIŤ8^)];h6rMX9\n4`{5 Jj 3$hf,&{1gҬgjԯpg"Zl:1&0U@!ٚ/((4oT}I]? k|}7OWTT]YK7Ta$& -4^ ˜E#S3+ ;k91L iH͉4o_t4 a$3f=(S1b@,&fQrO癉Zx6EB#sL fXɭ;i 7G@M^|]481 5uIB$,  c10ݔdjh4^{ZsX*M x_A\qTv%CgeZ"1(`a=^7'Tu(7np.yxưJZu|S u]r^H81ObnٞT #ӱRX>닟~zQ1Wz*=nK9Dbm$I忕N`<(W+/I1=;٥U?R"*ou!DU)NB]7g$.H}pֹnA`sIhp@aww;w y1t|w,(*זIªD|  k)Pa# V]UC(&:DœtDO<`-ҁn گ,$s6YZ7aܽqAZY&{zHN'vD3c,y`ԇ."&w*,qǩ´;3"I5`YCF/hM ,3 ALJp # Nc;@DHp(S7$KG-B kZ&y n'ـq5}=Ke*GcqZ՚KxjzZyXjEX];vp&i9=~ЂfTo*\ r5~s5 EolAG >=g #9?@!%}bO+$J$g{f9nbU T !j-վIa *@4'Vr5boNk,ɟ4 7K|bUFZ2Lޠn0/pA8XF 5Ml|'5jz'$HVtAmkX!Y]\DaH9U0ϝ0Iś8E z,cat6eS]st%B8L'.j@ކEU%ٲo 0l5MnQRH9)e 3;IDLKHF! ]E10i@mSU@-4[S 0`%ł?Cv$8dDT6D캁AV+*%%Y212!_FNn\95DՍĕXHbW%fI5: {̀:H508'/L@qJb'$;ԮNX$)\] nw]`a(<cuͶ *m:_)"aM@(1ʯa8'>5'DhNEʥsvCu{@wR2~k wI,Ǹ\+1X<.\5 I&,塗@`#\S1q4HlhÏ-K8=%\[jI(3-E9.yk%kE9̦ZT:YDg!"vvއoГ0y'~EiŅ0wC¼_h:o)TZL~9G㫃w> \$gb,>m_KI{q5uxHR;zt[2:bR:f 4H=Cj:"Coh( q H CNeoYKxmQ xBQ|NL!ؗ%xFG&#K$ސA\t`ru;PAh]22BGM~0dK'c0;ĄșY'l6%45Y;vf gIfp^I>xNzc6d](FlڤpA[t 9c%u$)CeU w_5t1"4gH Ae")z81]vǀeݢYq}EoMdTB(t)5gڡ O˕cJF ߊժgrerH-/nD3S9Pߍ;2E0m[YM՚Yq5wU׫IᤠD5#*il - FmUMʇ,*Lq{Ա >RR )Q1wD֡Ы.Uvz|"ff8MIE꛳4냎$k"\xZOW.>ߘfD*lLRlL9m,D4x436#A{eMnB*r-bJmX却\c,-ip4ǩ(q$3Si^; ~rze7!VQG$mJTˬC9a#ud] a*BP8 ضLj-)1%Y]4(`ꉕ"[-k)Į UQN_!䰄U:Y$vJabr`]SBv "Sfٛi jS,myx#. > PRE\L\.*nF*]G7e*S;4 .}6ܤ8ZGp7@Dq'Mы!9[[J8b'r&ȬEq(\xfڿiC'Qw2toxc5LX$=Na|4dqUmsFo+$&BvE:ZŸ+ԋA30QɽJI~eJs?8::o]GJ <Τ: (*7DG!LWTwu/>ԡv-](ҹQ(qKӡb3~ݖCoY/ !'{INYj1hV@/uvt bi g&à3=7utZQ@$UΖ[=iWBCxCqG˙6\G|7ie7;K|Ȝәl :4$7)| C$/e'\Q_r͖N`"Րa^t*fc JQ㨓0ܝU5PSuJ8>"J np E˓9-MB(nHG=b)™:yrCy݇<=u/02*^or3Z-%ԂaDPtnv#&0-Aqj75]oٿj(!ɱq_?ͧ8ߣ(QM{),>٫<ѧH^iI2tB4t|4-9RM/歆ju>.o5jCsC#4E䣧t.!\5w2R]Xxp$a5KkMsARh *9@j5ؼb7e&)BkZS85 OA`ṂHiC{v`H?5M`! !` 2ڄb.@`RqkwQa_Ŭƙ$Q"E&¬ssqf@zu`)e0qؘ yU"< jl9)ʌʌX (6f >~'Qo7Zh2 pj l*~:M/`h\'t9noex[4+BB<-|~f(3xH> D <&SQW ~[s-Q!Ff"éGANBqh<Ԛ EM%-_4þ].ѧP$3GV+i+9<-k7+@I ].xuO$_o-؈mV̚jEFp|b1gL M*,?n^#x%ivD=j4vBu5!: !ؓys__m:N %e=LNfP؇hX[ߧJ.I?oD$'*&)LRz|8Pr0o0 <4q[DR3?Ax=k j7:,O5t@g,JDdy^KݸH4dWn Ps$E 7(v'RfR*3Ҽ-䝄k,uL7[깞T{LgeXzЅэH3!Qﺁ88K`~:nG@-|h_>~&`q` gw*R?|(BN+8*^ℐL):"4 Jj3R:G( $WlJӚP`)|ٹBl~).0?V%Νv--Pؚ\ Qn7k.J%vg'ʼn$^ n'{Ϻ傕"xǃDz$2t-ibHx_,)Nx !nɔ\`胑 8)0DM41B@#9B9KZ DP79$0KƧ-icهi@E |2̓sk>(6PWq u<mxK=Θ\EkZ!gd7K}rjV zz#w:B1i?60 Lj~ìrw!h砿P:;/P[]i"I{? Ӓb99tNz9zĽ"mQLj#ͽ ($~te k.BPSFVHc~˂.RT9dVF5Oa~+YX XvC?@"5ā(d)DƑC`8|:{z_5]cӛҡEu %,.\|z.O qA涛 z&p~/X+|\aq8e!X Wx2oɑ@NU TAS98GmI\v̻t{wэdjDV77a .= ZS BCl6_Rq"Y @M2[ьVoFv :aN]FuZ"EJTv8)DNp\.Г:p OT|YΤ]n&^cvLRdI®Qjž"ӂL/(D + 3*"͉6=X4ɍ`i7vH,6c0#kqnSs="STq&I MSK|63bd<7iǦ4s<&XhZr_y6Zgz[sfo (X.{Һ\سj+r֩R5(HuB-2u IJLS.NKg*K}`^ܝbj3*CGDS'HL$2^+GG(#3 ,0)MKvl#zX̎\#jhˑ[?'L!ܲ5䧹0C kKX &b%'7oAki$D>ͺ';" %AI)!G1 @یۈ~LXuCu0=O|$,^ݍx⏅BV^Y #6[JWU8.{DRTKR*BTC449uh>Mۯ ay!9A" iϠ9w[*ޱɧX?IԌNjqj>/*JC}})\j9\ Q@hx%2y: j|_ !.jmkx. "yQ7H3/?M:TgSWS%)%duÏG $2/y%$g,z5u^h$kI(<"ExBq'`~΃BJ2"TQ9-+L|#%0zxrc(boG[:I'ƿ)JIѢШ@ǞРV–α7ar혃GcK,h ́Ù(,g@Qr^C/O/&..Jf/)0 B,OZ78BLO!Qq_Z0îG%f2tfSϒ-N@kWfӼS >`:F;sZ:LoE0UjK& SrxrEl]e}p+EZͤQ\Mr)f*+zܯtod. !$XXKȫ1c4aIML42ؔH[:2Ԉ3PWn5&JQI[Mi2" eå&P`?ŖNmZmY"!i"Փ]SLR!!!/[9ϔe)K$ܨ:C s|-<9سtz"P3ꭼ?-% uh0u3TUWcjJDh0 bvצJO4O,PpkhkF)DdirwÍ'WʔCQ]gs"P(m!IK?l]Pe2#걒*t~6NLKml1hO*K"!*dStŭE_/iQnjx4k$⑮%yR%TlD4 "d *iV ;%)+ u_CYGd2+9dؾ>Ċ?vbiւt։]`%ED =-IM 2G;\<#9ôWWэ:`fo"QEGZsk<*ғ*T "<~h&{A$fNCp|1~f(2a:";PHe#c|S-fhoFsn{ 4GabF/;{FR)X-T%Z: ֊ d-r1#w2;UOJH&HqS wB9b%O,Y|MTuj00W&dN]FA1!啾 :RaR&Ae yl(s<0PhyˈC)? Bv ; p4{Uu$E"a`+5@ɨ'r-w`t(Q`V`$TGX+ QQGcpSe^3a&͎5Bu$Rh(B@\ <@ii[.{0^>r]lnF'gh빶*TPΫ˧[m`ff3xZoE-{OA^Shsg2UPJtu@9ϩr C5Dl8_hv9?cX=Q:)D$ 9aRq%nm Tۊu5 7hLrq=ʐ(U 5Krt hzЕu)T#Kގ;GL۝a =)c9bIR(`nd*B2@ʭ>*VR<\a i>1%3N ) xkƮ9B . YvlΉif W%<2eL ٰjS/5$2^ۉ1Fzx4yX5HZDE,fZn&E , >'"iD#rrm'V2YQOf W A(cKB)C6SH4J $K0 Xwhː'xn9c16Z׃h&k=DʎjheJw2%K%17Oe`(ѐTB-ЦH. Xʊ*B0ugd}IG csDн1-~ĐBR{3Rs MZY@"?X[72vGf3~ŵBL"An˝Cuh5^"JC:ҬpI޽Fpw0IIo .1TUrs\4VeY/]Uײn26uHf7C <}LHN#}""0iXRُfQ&"y.N. }p+׫҄Ql(RbS ̅YU1 쌉9.PXJ2W߻,S}Vߴ&P?s+68Byb+1VsMοiF 7`…u7k;obg;ΔH\^Hĩ#Yo5D4d..q::§/]~XŨcv(*oT'FFVA";X&>*n3"kÝF̏Kƨ+?lP|fXH>'F iLRހ(]i892c kk1Y`ڱ7~9q Vi_uB7y.B@ "\J=#:1ʾk\(ʋxs ynHyHIz䠁2D{wB<[(v nu" !KX/gFl  ûEJ~LH@LICZ/d!KmlRHGjoh1ch3-Zt)_@a%I7Vcu]i:Tuq 7eMX=hȹ-Z=-Wg7ٓC3ߴld) -]傅@ bxbլwH3QK~0^H(xv> 75#NL,\nҖ ZҒRkxq6IqՉ)Wg;3 )1uX[nӤ:O;&k]>Rf hv|5Cp7)չh]yqK]k9xk̹HM2PnG2 ;ݚ^LsH3(T'&$a_٤1k"u]vLj ~73'"lUXơ".)SLrj77Qn02`./[xg9K1'_3w%a^n`F>)ggDޤ3k&C؜7L.,-v`Oacm44|62Ĩ]nLONif3U ˰2놫13BskMk oIqsk oa@DzWl#n1vwBm oXEgOԷ:]LӶ*"m1%*Jq(ϭI)5zǃc. %& {=ii HFd|]ȉ9^gp$=a\+@d7Ϩ9g; Sbebܙsy_]#b3,o$v!Jsk\"6va>m&c6oL VgjM|֣S1ں.&&P\v\3iQCqƛ/s >_Ӣnx-n?# g bĚ@e$k;c+/7iO7=}~3do9">" )x"_w*[M7$D֕f08=h萰T"Hh3[zf ED]Èސt SHMN:R㴉)kԺ_ǚT ݰBgS@;#A]q`byj<]P߮}G.M@]o*UիՈ:4V)Snz:]>"i4n(4nyS"s=oZ:`^Lw Wx~b07k򽗯BIrOOuhؚ-N~;@]R}*l.ssR·H4DCob0wEaNbII0Q>N$"3jDXq1.[`chbXҥRmkS4;Cg :)vjwZCx#̨Ôď[!meeœj ͡~yKhi"i)[V59\#Q~эD@!ii *tn= ~5չ m~\aLC[eOD| "obl,j5'lq˅p8WcF+wswR0:J㎶IBF rXl I",dO.dTYޠ@}aëՑf huaBWetX?ovBxAk}n];rX1¾/0:&ֲ :n)]n`=YodW/a͢gC E[;z^m̅7Dd!u^uR(}5cڅ3YgBCsLv#f E]'YjX,~V.%D)9J!r*euQ3-5ȑu;CZgdq SFG{{ѱ,KO:MWaF\'>т#XH%bjw#Q䬙+%~֕%9 ̰=A.оk+GSP)%j3(PDcYR"S)&gvX;9F朲@kW1D?ѐ=a- ;ChF cPKN&B){ˢUbٝ e2Ge/jqɉh60&FHjHHU@~!!Iplr-!tr໰<__7uyL7mچ\LLQ.?+4gU\-XUIUU&Ė k CclxīL7]P4ݛ}Xy^F1o'QkX([M5\cCø:E^҄czĺeq l|κPDwvpv,yYv?S׮ƬLӏAR?Zg@4YMtI3x [xR+՚)e`]|Ξ+64rk'mIdKdiuE!P^oٓ1avB:$gϼsm9f s.eՊE"0̯v\%cj>wbkw{ jυ]籭Y"CUt k#C$__?O]dhnmd7SC9kS6<;*L9|AD`B&k`ڵvqsMz0Hlw2c(Xlb:ٷ CR=?R\[Z.J`9i_EEj !6 I&mV ,ʤ=M%W ^ )5=1KsCkۍ\aFPl8\PVD,*q2{f%Elx?34"9еLLk5tȹ”~݀&[(U %ID? EIb Z…x=^Úå>CM׍P[֣7).Iؠ.vTB' d/$GGr^뷰d\Ur*pvpdGt\aL9$ZSq8rg:?S; ##'ߨEР )K ЛM`fQ*pN -l]H}Q;ϡ|J}@I0Ȕ%A=k4_^{xT)o[bA'me<*.f/BNe|;/hߙ +{Ф}e  WQS &&rd m{hC&ND3W?01bf-ؠ ʼHZ>Ԕ #aoI;G".F L6< ZbHoO-h(34ߑqganiH۝O2~HØ:d`WE 9+Jx2e ;v}$ q@uǘ׹#y tA5#NJ؀g~񆋀 =S=SFΌ6|Πٿ^7zxK=55}l&o|!`"t m,uQW3}27j&1vx!m$N÷E-uOY+#-U?hbmh{c׶2.2i.6|p{r[ohbecήN}{ni:"e?f[x 9@5 DS2;-i$=pތ2v#W < 3$(1"Ih ϛ|LMo{Sb&'Do3̶(tu }e-mZpqk54W&̊@L&%N gD1ndJɆ8&: a"Nvot .o"D`K3T[O"I]7A+x_Ŷ|=v=jNYF-Fmj71s%EёbfP%QfM}*5y&t ^JfG/1A yx:#3⭟;:;&} A)觰׆{``\%%s1c$N 8;+0/ "P*gJ#L%GJܵAPLK#Ez yG6RKdDs:ӣο&DDD|ԑp?g:+,`6/4EIy9XȳB "R%Jd(b&fgQ(@LZH|01:ۉz8vMvt0 NgGx4P+GpʝQI"AY'DYL=D7])/渨YѦJ.z~xsy;E`sbD2eԍc@s\sFq2Y%HG[yL癈́M@шc#O)PDE""*q.E`M9FO٢F B#1 z3 RLoy)UwtV"·ؔ%`X#6u531zk>ZЌh1Qupv)S;,=;`^u%3.ϡqy!ǃ=J.>(HD<֔bf 6v}*;g $ĹN[aSgE׊{K=4jYIƣ{}Ch&($[Iۻ b \K9!%#ӁLV/ Hmؠ߄xU-&/3S|my|4!QP>*bw:>4,qHfR 2R.<mZO?S￿'=boPN^ӛ",$h4RE x(_^kSgfa BHGՇEwlHF _% "e͈)I)sn)Y*#452%xu:7:3Su @[OpKAێ[V^|yc =ēqvMf9ڂ` W4xO VjE7.i+^TT] F½Z4F`!C)5ʨ[f rx-FeKgw zޛIee/"cVKo34C%6I&k*ɦGfQQdDAeAEY\"#*.( *_dEt޹¹ʬȈ{Ys|oG[ 2Vp60#G] >8o9 EX̴ ~=rxġef8Μ}e :>e8O9RÃ#*t {gG9|&hfK :>8cm7+{v-]JvO=H_E}QXu^rm-~}<(/Ə9 Zfy95iw[PeGt{sEon-<̾%PfF[$= yFv~= { ֳo`f%O=gvEv24k-ottr/~}zt﹜ ˎJp̬[_<S,Ŗ͛8FYb~U3@>O(s1qBI0p4ݺɴ=:: b{>˲J߇ݻhibڭln:4GkwrN3*Jf'5he^Y(C;ub\;f49] Bˎo2 rs'Cfr2`{BLcqVf=Qwn,7 ]yud>Qs z5q9̝,,q~V /sη[4p;w19ܻ~vҌ69Gqǽ1@YHiā=8ݺ3쌻S,Gy3=[g{/wjS.(v͓+ f af||9efn {u:bѝ| ]n3H#xv瓚5}kv}[QڝqhݛLcٝ;}G|Q00`=fy yP"KlݓyŲ{rt0/ӳ$RG&x.IIO6wIuzNiNr'g#>9/'qJ9՞ersU\lr[$眵6r2S4Ph-[pI|c?&=9o ?guSV37w'OPXsƭ{w# Vx~ n=s.o6Wo=yrmf6==HsV1#<_w-sLZ~@r<$lb?Ʀw׵E_1\{n0a:yg@nc{.z{2t?)q {dh(r7hSSWmB [7wg}sO9o3x͖ޭl{9.Ƿg%0>Βh2(w!?/}y1J/wOOMo0H!01>ɯ9rD^7Os{e29={g)OyE,};ͳ7v9A f4G,嬅1Lï|.vg\}tr,v9> Ӣ\m@if籱&Ƿ=]aoߪqz̵h=e/fPțGެS=rozvxg,㝛w;x捽<||ѽ\Yٍ^S6Gٛ*8?9TMT?cjaޝ{|f9ȱ/{XyB7N{vvޝ+?Jgepynσ< o췳k8m803ݸ}k( wOo|+cF~V]:7c .=<'ON?A/Yg%y\ᔃe&rl3Y~feWN8fL0-mo<# 68.3>܇; j[7y]o٭eNbg8]L]7[{zȜzkoeE0\!W{!W1@r`֕,wq83fV3>9eKzh;o>ÕplǷ9}6kYg3\q~̐9vx&g3֞̈ۖ 9}'8:.7t۳t̀~t)# '5{B0y ,/g-d踐S"}jsX~nej ߸ Ad_/M#s7;1zT8wzBˏ^|`P{%bK5kȧ G6L$صob~}ul I#\{_Ϳ`y!.+>F%Sc]7vh.]g#Nbq)>UTwk}+/H؃W้{G+C|:8.<8>E񰀁%,*W>㐳?+jAPx&vw-JM )ڹ[t{x ,-X>w<pwlS̈́7,y-ݨh$hH叀jwC>*ci]$ob4\*p']ǃx#/ڷ&Bsow&Os̿&ǚ"9^c"cw.,g6돻8*8R29>r "TP`7_=0˳%X<jWoS --/搎]g .x^:y`CLcoMg? ۙz,ivu`kdE⺊ = ª9ޜē_xbaҳS`{n.εbcQse}S9 ?)w9㲦zxGž]r]wԲ/0Q1_}\|)0.hwj$Q"-=0rkJ#wjS7Uɩʊ`{JqWb>`TVǦCgIbbb69ZCʲ1pp9l VwTnEGT %tE{=zH|W[ ~y^qd$lj_z~=edt \Wvs(*-Xwz{qw|gbxww2P!l~WfDY~H+͟:BM|F0 X=G_wc #{ eXKD*yxTfPuBA-ytc&> l8wrZ,]589^};U#.Xr]'"#8ۨ4^K3yb#>(Dڬ>"'˵s1C۱2Z˦ǔ cb̡M#E dć2Xep*, w6wWeO#Ƃ#7sRx⻲gWN֧4'6:e]*OHD>L:1`6ݙ<] p_P`\:ʇ*ެUW̙JHSȅi?^ c,F#)Ps\"W2沾&Ji Z5~GߝbMIEEVt=eS $?J.gR8K726 XCqYIXDDkF٭Zʑ2@%{[R~/#ŅMktH#*1~-n'.{qq8#+Y*u<:(DgLPt$է%Dm &DZ&9+P}8RCS% t V\֥((rJ יnX…C"';qDWU*hFb"[-bz>D"VhCM41\_JziNEOD p0S6c]M.$?{qqX~ f|MќXx!(H*؅x;C%+$-\({w@[6EP(cb cXCMu9Xp "óG#'Ce n#5"3xp@b> ߏX9x. XCQS;!A"Q)OYId'L1ՔRmnMAx&Tsĩ+a*k֊aH'6)E S<;5j AFmHSd$8Mӛ7lR(HW%H]&?KWj3s1kH=R` Kkh1 RJC9 Aͅ$2>F!!9re? \ ɩj #bb I1̡hus9Ba.&kf=wf`AU*>.syJWujA 4$Cm&U~mO!sn %-htɧqՁCwMYap|NL\:k|JUrZ[=Pt,,l;.J"ҖL9_EɃTFEʲ5+;媤ici?/eҢ"?*4PQBӧ dbCc{PMu2-v""' }UEBlYOiT_4ZbS6V$A2:}浸0Qrp?Z|39{ፖ*1nw| Ew^sRޛZj njbb*JRZb f۸(QMRT P͢|\+S,ˣD}3/:{NQGEt ,2 8Ba_lSrD%}+ĦF. gDM [$WǏ*KH.WBHAl "H+,xT<.DEbEL 3B4׊[ǿz` ,/SW0x[eN 1q^Dh4fT"jiUQ?6cf],J\C ؝[Y^VXw+ķdyѕ`C4ƑS #J;@s\l?&눢Hc>*Hd'Z_L 8AKqSh'K8tET*5 ,)#2!O"K 8L%='vN{"{HQ˪:+w&'-T?P kP&!J <1GT'?"[{U DC~q: ]DܻՋrtV# e>bȒ]QHO5h?CNd3)8 {EO @bpcݬNW7}GHי57cfXH[1x  >_3A+Qtꈁe7* :aK |uBڋxD`:O  \tN.RkTv"T]LVzhOJINcGwJh"}yOVYqmo/e6Mz!#i]p5͆/>zS2*R?_\`CܫU9TO+^<+`E//GB;cShAR׀p,HO]~EcQ\fRSx,P8+rzb?<82X]$IJw?.Lee<|μc%y/Enlv;戒;E+)c#7V|{(r&ܸ@۳ u('F~Nx 7-WFMd)5j48~"^0XU~Ts#qDFV(~U؝gqV8cBBŭoSXHw@ ]xK3Q s#c j*Z"wx.CRݒ}"tuD蟨Y,VNB.D&1Bz Hf`Ӱ,V^Uu\ZS2rT }P]_1؜a!fcMQ$E^zW+ɉ@*3V]:cu['1I&$HUp>]E{gč)`*|/:dsYu-/o>c6uj޾ñRjl&5&7+sVj ԑmxTessy]ӥ:G 7\X7'ZȾ?i6?L1BV} ",YmH9}ß QAS 9p2p_=9҂l k$BqA5 e8ޏibծJ(Շ:&pqb1s [cHRNёAA/sRT-eL5)E0#.?@ZZIS48tJ<5x\ZNrpDH}{A9G.1zhWA hd.Y,'>-G&'@2.EA]Z &uTw@k2 -gU<"ZUA<}gN}O.^++u'_ǦjKZ xS`[ E/v 4bbݳ5.'lެT/ ,_4Wt#1~ī?S&0&Ű]X֩pC\\ɰ'Zbޛ&ٷ)p_WPO@dqbFE8$d˝X# oĉW, :b\EZÂ1~tbHWI{/Y&>>EպLOH"qx)O6Wu}Zgy 5F6.T o(:cyɀ 8!;djTȾ t-O $K ꟮*J y(|W35ǮtIlhoE* !Q'W(XY: 5?WJWK9=WvCE6ɍsT@In'*Xq7%CM e?>RX^pi(GW%C Ęh[Q1Hd?&#nך pFxdˡJѨ(H;Tusvհ0P/zF1}Q5"_5y)LZAi%T, }mլ#-`f#fZME^ W3dShiy ֪*l+j+F%W嗒ͩpZL_{2ys?'dV IAh1mr$XN ƙ(܎&@kΒ^U#y !)d WMUgZj0{B'W(.ǚ3F.FaRM22SM_I[X_ 9s+p2iWXs5!:H%S2HKk[^(QgSH ]Ѻ%ś\,JDc1eꤢPYś?pDP~.%./E1416=6)(Xѭ{ -Ѵ)K"K%A{# BN@xe )NU+> W-XqƋjDx#&BDc~V^)&YpBy)h`\kRJUbA2,X"^ʋQ,H8Q_0ШlV3#BFh1uęN«[jB48:gŖ[ ad9_~b9 W3(yusEF51u#]7CĞ**mXY#(Jq1n`@L6ۓ{~6hfr!҄=+SA{ٯCңUã{+&b?#"7Y2$ۚ8Ve.|(b<b嵧Ző{!=Qj ./Ekv 뼻Dja横/-ypil@Za=V~+#qE.E\)"eP+dOYJn->PIָ21N,pM.pVSɶʑG2Xj~u &jTGܬ#4 +l@>/XH%5udJVɊf؃`()ІhߌV%[`/cts(Z({ī } t*+.S 7)"i8*l[M7OVftF̊b2tüFW7 s֢9x`\*Chx nUSW{/^H􍵿s.cgd^u6?y-5FA2y겠|萶:25&mXWN0E:?Ђ&T,?T%z"yM3V8h~%lDvm [{/i!Kqsge\RzEn.\,4 QjSO Xǰ/Cy@]rDhO{U}2t#AS-ouO }žzTzk-tДT& rUsGJ 5 VnUyA!DFu"Mn_NOWYR>ő:sQh7y^/HK EVŧZ>,RbC%#Bf&P! , w[iE?ARj]8]Pt20Y9COAiQ^R+NW\ RsjmjX.!bYvaG;/sTؗ}Qo)J_/(hx}. = WؒϿqW_t9HU\\p,ރ꾶Q]il&\}S&d.Xث+Ԁ!,OPˍ <%ш^_|Z\gG_ ]]f5t>=_Z"_z<хG?;*E3 j _^m8O T"n&hQŏEҒY/|&JpEW As.VfKaN f>ibNrg.J/UEJ+ Mg=)P xSQf,+ fw6hQco iŒrPmWXE4)ڨF?Լ2IUZqIJؔpe1eOȧϺ|'#"p!u( G/U;ʃkO V:S>\K|̨hU G{IF^-'$ FZ.B1>'[ z11vs";\ZbT~`W$xZ]A:.F+dI6X cwb0P%DFĖW-0T: IJfQӷˋƫ}EO닺}@T A@VĶдL2?Kte(F\Mo̸i"g?P"WY4YHwWzajiO]VCe!a&+f_<.f0R ?.lYiɣ} .E. ?O&Gųș&%B=Vêˬv\ޑK׃DT\;4Ʌ"Ee(T!cG)kvj)_g C|U}R+EcTPHOs~=gTqL+\]̮R(LFeKlHX7E`Byu$@jd2^YЮƮXݝ,0pƕ]J}?1+YbӼy ~/`u@8y}M_ o ~R+B#% {W5HG؃G.0ްnP)O+|vAB})e#7P],w?puWeдjP?B=g;EQ`{sg:ch }>R<3h9RMCA{^/ʼn)T(\^mu/iT%VAA2T+RYň2̸ZPE6CmbF*Y VuӗN?:棗L{]jG%pANN^&xE˙/~'hPD?I+Q 4JstjoI_VtUZW'Uܥ4X[)}$~ZZQq҇GmB fAۦ{'h(6K} LE^oxUWTL%r ^,z)~]U#.PP.!:y"L:vmW)OkZhDk~dT'H0IWy7Scu",#kc5JM9Ujl+`IտHy)#Wd>u(ًyt:]B7d#C*z+Rt,MlKra/ѰK䘿DZGԣH ̬&B!1_ CGW:e'rKփ:?2+.!+%Av?#B/gJbmɟ)L ]E@TpJ'_Ċ1L2r2CCcCmU݂hb.+(y霒3qXX$nA|)4\YZZeVǫAb Sx.e>jH$ʯ>x׵Z(/'_R ݊4ƛ@mV"a]S8묃"w,\@u 'QGOH#e]<'=b v.^m^'l{ыPO:;C (tɗ>o/k"G M9H1C"OWob r+ة) (e.Zn)h+T=b8ɊDR" 0Q拄ƣ$6JBtԇ19_ nmM͙\fN2{$Sa2$v3˩.Rt-_BCj 7}/ba,(n}yh2[æ4_P#Vi 4l-Ǹ@(XV-!i.ܐ%Xh!+FJԞ#1^ $hQ9[X qH_&eT\8ұ:E:00RD]8/m3iE"0^CσY(B+gxNO^R/EbS_+r (v( =,޸!AŁБ] lp) ^E8?4|wH( . 0`@G[h.Ûsɇ| .%rjP}t$M=V@e&w>d'jK'K?yp~%-\z(^OXb=t-ߕhGk&﷤!_ W>XeFwppa2–og-ߕ .ߕH]ruSՙ-d~@X#uJ6/M_)&ny-VgG—-JuyG_ki8r+$%l#^ߖG-slCᑤs]XP3 3rWp3)o8-ؽGju)pC"mdiY:򉐿f0dyG.!8FEݟ$=8X87vDq39tT:^'#_};Ek] GU>0r[;NT8IX 5pSi,4u_g*t)oe:N F8rB2QFCY }nm^`>[P`łM/Uq=mstwNs-AwE.i-HZ\IOI:z@NP3S" :OB F%~.ӣ ӛF-拎w$OKn{(Xcǩۿ0њDqh 0u^ ,p Tp헍01n[#ʑi } H2"aE ZUvR!87'9b\zƎbꇐ_9v <.Cw,i,l [ !!iX$E"Ik%#F,$GVBP+6:vLn h I łYV=2w&2v/Y!'TP,E":Q1O.m~|,Z?RR#V:|2$oo tRBc6>S1L6[ZЁ)I?7*G&Rb~`$ ܛ_9N/!Ŵl&Ob (RD﹇ ӡ[ ?0%Z0!pݭaYA$R@ +(:X#Yһ$D,$c:|28D*W 'H|_>,QP00%M0}&.J"ni5*u4t,4 .j:XΘPco'=#e 2HmJD?ÿ/'ZȔb7@|)SaX $tmE^L#X?ɩ心ĕ-qIa$` eiKᣑV.&E2ufj$d{E#Q^M p,(0Smb<:Ud ԝJwNPp"hUȗgOtSjGpFJ(ܑPNINuIa|k3H)B!@v܆?mh2;vv '+bZDʅŇ.%H[x`_ڜ-Su1P =2t$T'jxPLTܖK8pUՇqBPԝT'Ok9. }IЛhY)R#=D c92N, UH[Z΅HXFJx̑W  $x"5 P(R0Qa?+afzh0$r(r/֏K<RBp),J FC XD .jHC"1j8)]GMnrݱ2 drI!#eb8.+@>,`])/.}屶Z1jH3&jXm.@mu5*2tǶ\H Iԛ+j5##{s sTnDnH|j4"uUTיJB·P!'9D挛*kkHMd&yc-^%Cw;x-#2b/09 4cñ'UTD:?PVe x:fo,B8-Bt*%kQڜkD[RG~habeyK& rJ&?R=j$Z[Kh@!#DhDq|'ژrR\GU(Hq$8D[+5:4V`M%>:Zz7%JuF$IfO>SuD5U3* eĩ֠H|(KG _H*lHR Va#T M ԐR ~HN.],c-˜|8V$Hk/j@ȓ#5^G(R"-(v(~! :@8ݷ9rǩ@PX¤]$`ݤ𱅊v]ܽDOK!6hmTJb6*Ic(E(3N(ґFBb:vGAH(VMud4r;uޤXY0&~|PW*lhu6,##Uޖ0.0Iz0-5@Z8 JoEߎ^i"\ !XQ]gycD `0Zu X D@uB݄9ĊF.!ٚj`)ՏQ=Ԡ)$6EJIݠ Ɏb[FrS J"{.(cX˹)2T t|;ok܄R<G}]Jc 9'R[)+Y S!>8?fFJk̹R#X#hm9EZFgɤOb% pm 4ψ!h5rs tR1kDJF {N3'&<őX"ҖNTzHK?)x$JsdֳpTK{rEˋ2j`j;BƦ(u:Bqn+g %2/@ >UC! aDM]8 r;(uR&WcSGup+XH6''jAK/ iՂixon"}-bba]s u>@`\O.jXK;Tp͵d+ͽJRagԪ/S`s7U;ոV+("2"CmOxm*wk ci&R}0VA-Xp:U2 "(]L} ]_IjIxy".ñ6J GZ60"]JʼuxiAOWjm'ɹȭDЧ:qWk,W$M0H-q.h%שû%cn(NYsksv!kWFi%P2UNpH}0'&汶U.ȀD#5oKړ`63B8R[ulxJ~ <#6sӯDM?%uBXVQ2Qd4oorPIYRˆ!HFoFZjd`3Ryjb"N'Z\#(xAd@?+궼I^2& ,Vw{SnԸq).u^VXK 0LXA#e*XdI6@9]wng8q9'AzZRk/H C"`$rMZ$oVr-OR@vDV vZ(Ѣ!E@`<(6OոbOP)&P+R΍LE)QVDUlHMP_KH zL8G5*Ht!OdH_d&%,!Pp{CsXju;@g{9*L{#E)oI-hI#"XwL #mH"s*@00HERWjv`$R'u[h):ymbuv.]l)IZ$jIZWSwu|JR:}N%f_LRY&^BY HT0,D8i%BAu p BIXT۽Oklo-RPǫUXX *:ĞhEً*nN5$cmіaE&a;KNG uNeũ^oű..0 K톤vT 0sD !fM Iv@ +:4>UvM(Ŷ[({uNlKl fƵHi,)h-@.9'FjYNTƒu& ]^R=qI374RzRl&Z$]U%"n4RwGFBs!jYDɽ@KE:LP7KK'nk,6KBcdd@.m_DɆKe&G( ,Ii;-~ U ce-[&ifF +}H DǓ &r5ReǽDM);P{%*:ZQߝne`q/BCeOڢ;4 &L?=jNVa"X:D=҂cA zmDj'(& ].aj<<{Ɗkz½:IXۂX0U|D}8a$[c] Ox50Ub 2od F͡G〾["yFZ64vՐTq7hH"I@ap^:̻5ֲQ` hRG-Che "`q,|p*J\w"`HmP~NLDu*3ԝfCPJ?.XiI!Fq cm6 #Ǻ&X[,2Q3wt,$=#5HE`Ɠ:2)T[gEZ`l-z^"-h DN T(GtJHQbXѺNv-&ƠuMD>@"!4+:1IK?],H}/ub}KP g^#$2i80Q20UMaTIX#DZoeqR3a'mkazXDH a)fJiHaP eMB[F7:W)r@>Tn -#m'xJ])iRDKlRϬXCI\RD"œƄjTO~R0Uc%#[-DM+#el(qR%{A >6fIFZdr$ʼXKK=L,yTBGn2jfXU[rz#E"s.snhY;E뷹9?Tb O2P5]pޝƼ)Jv`cm/T%A\ uj͞aeZ:J|q|rV &g Ikp H+l(Zziz{GIZjXah 2E!BZF'p$$G+jg$$К)F(5`HAHH$["H[:IFj:3g@ʐfXMrR\@G^G; SQ*5 b:X[nN`aԝ+l$*{)J#$j$B0bX o>|=~!.Rȏj,l:1o)o9VJ|kjQNH.Rs<^JJ-D"eFZW$ _%|,|HSM&촯β#4xDSm1%Z_qONkfE4u΄]8DN5C!ۑ'UP%? "n{KJ/)aA+ŏ"--Νj6> 0HǥZndA(R9$AZ\ !i.&ZNB9 sM: PW&,dzX*Q*>MOʶ$RWD, u =R֘^R8k'HD]**6JNpfͺ;tj O:£ŶI.^.$ ^;U GZT8KY@fpR#t( GJ6hHj]/c-x TM鱶TIqRvmzfNF1:/YWu/M{E;PK%V g:Vz˩NBui9品6'Tڽ-DK9TB3DjۆyAƱ{k["0+<Ă*SIi$q3JjTZN}"uKq!UE4 &Nԕ(r6TK PZKq, kQBGe?$1*$a@[#!E)(!3..TK6LtIA&YEչgB9dXXE+x/aP 8Hj.8ւ"&s(v/9Lr'xн&G-$&Lz*K^/՟HI='f2Vp H)EV2XPmL\!'xeV'MWb:tJ8Y 7)op.aĽKԌZHJ_R9Ԭ (1-@K!A %!wLuN.+I)'Vˑ{X[bOОĮצP&#mV}*j4*Á*vqREcLS*bmudqHU%ִ9GRnX#𣉢Ipe=n+/8 dSedsK)8UB$fIc72j~yOp&QF'X.S-^J@{űbeMJE)+J:K#.HwSJHɍ'(\,XoBXI athD US7Py(@7ME\V Ik- zHA*)ީd0#m.k-XbVDq5&6 h>"#q~>I;Vw"|X O$f񄼗CGEj6DKeYw,T>T bdNK-FB2׋q&J&S^4V:ʉ:"P  D?9IjtFSuXc-j?Rc>$K= =@$pǩ"B@IeP=Q6N}"ԠJ|ωZ7XCRG}?gϸw-:6{2QȸKK%y02(k6ɔ&:t&Zh.A$Pd wOda);J[ER+Rrr,uR=ֺñǍCCwCo 0.A"iűkR^qڔH-IECH6b,;@ pMԏL=T#E XSjXhk~D[$&M_QeCvZ'4tTeq&b-˨/$RXO=V/4e`OTBt=U=jÁȞ(1+$ h4XWj49PcZ'JgØjCݸ3UGjX W&aDjX`B閣/O% h.9|Bp,Jr}s$6p-RfWha 8TI#PX>:T'~y$=D#Q]"M8o_a =iԤ>cm7TZ6ڮ.B61 ü@9.KSu5Q"cus l%p!$]Om/8aKH=|[j֛IBa%Pő 1=UW)KH:xc5EjFM] H4ۖBLݖ>Vѿgjm:x.&G@-@[>B:%bP8EJHjai'U/ODjP#B4ҝH=|`H~G( ^8V xIsc-C׾-ƚcm%e2VJd-M&=rڇ T[e3ն*NYcm&qh}up`wXLi>ԿG<j&@Xˤ)Y+ǩ Ǫ)=qs0ʖ)P.Q}I42T;NCL M1:&&&+hddLy5X٨[P>F(&X{HpTKKĄR#~B0("uTJ@N͌PFԝZJDNR!hR>Y R,%0PKj2}.0Up :d ďm>숔̩aEylj6sN-/>a,鉺\CKtjMcm{M%)`~2Ɓ^-߅MxD>u7exQIv 3)!eOjk l~U4ce{>:R|o+h5&{iIu,D)W C5FR8N8tc7[FKDSE;JCJ'B@I*m <idW㭆=[߄E8&VQePr"s,ݕ" }M5ԶǒB5"b<#:HRmBgƁN&":^Ih!e˥PFk$ՖǑlx-E-BEc-s'xDBNj |\SIG*HLE>*T݃(8o&J̆T>zDF-j P(wNkc-;:4GcmT=CHMysb:- =RJԇTZ3mJuy1A}㱒ñ򜉆 ,& L>XK+4cupX$Fj 42đ<j]u[t#obD8R0 V# v- |mUO^ua]^SP6E#ƊG çʢDkCHӱO V)H$цB~:/X]2k֤LHFNtc˚q |g,!( R>1/*#dRNE%EU:8PW3E괫JiAҝ'K'Ŝc @Ao=ѢBE)˖H چ5Ѫd安У OՅ4ϜV8yҟH[2i}M|WfH'6#-ݿFI}oˤmvn(u,"gOR:pCMpb}czC%{27pgpj')HLR%3Z+(I&ZH0֢fm*fVOA;pC+HRj9)HR#j a:֦w3Q[AcTۘi| D4]c-l96·"G &CASI䣑TbyHKX K'2FP}GeOl5V0JG#j Phj|Db:Vdc 0Pǩ# G(L HзN:ZDљ ri2SG\S|Ւ(ɱNHCFj)%h8L6#euBT Tx"=wT+돯Kv#-_"?D&R>XQ p2EbGj%,.-kN@i;x$P[ʗHHmT ;b;;4E~3O(,`!EHCG2e<0$XD6"uJZwd( ʢXMb DN#JC BC-"ukP9>N)'6l6l6l6l6l6l6l6l6l6l6l6l6l6l6l6l6l6l6l6l6l6l6l6l6l6l6l6l6l6l6l6l6l6l6l6l6l6l6l6l6l6l6l6l6l6l6l6l6l6l6l6l6l6l6l6l6l6l6l6l6l6l6l6l6l6l6l6l6l6l6l6l6l6l6l6l6l6ۼ4A'gss.a&|y]~I+~}ߵ毩6$ݜg>/~ug,>33?ww7M?J8ٵɵk wj?J>cw-uwm{%C>=m3[~ȳhkZ{=?KsmUr_dϯјMCܛ>yrOwY|'.M!y=[w`d4:x]r]t5zsh65ɵU`OTɽn12wms~ݺd=ڛ~߻YSt_w^º{]'kBU Y-gjBً먒{Hun@tI : z.$: zMi& ž ߳ :Baq{ymrs^\GQ=Xx5jxF5Xc8jD=OQ||t{Ȟ3k Q\_u3n=P'Eޣ uvb6ImbuawkS%!kmUwXh=CYk5=jp{uԉo͟iHv|}9=N<aO4g^5!߭w|>}݌mUbǴa?UɹV%ϰڶMrϨ=jS="_!_skI+:3POlz rUS6;vn6l/UCB ZV**oo;46`߆jtz^{t'Ϯ>g ~l&>BЗ}XK!|?VhO*׋}\!7$kS|-:6]uAW6ή9 $=eZZpMMF#:F:9Cet~X>ܫ&޵k{p-I{znn?A:sCw>;Q[ ٛ5#jMC}Lh"$rZˢ>y]]\k A_ԙs v] 8kpt;}Hl 1*Kk`'еo;,]n1pLo}¿7b 4Z=bSuAw8<3][lZgm bEB=W%;Z_Pc#6ֈYM!<;CE[D?7 AR;qgZpuA:ꂍfTl ܃MmOm ꟷ! ٷm&n!ϗ:ٯЇhc|4G !:YW6Nj{0҂߄8Xu&Pa56&lM-5Zy 4Ag`cR tr-f`S%ed7=т|tmUaOL| ϥ g.Itί+mu8;p_갟ki}T? 1s6T`ͶNLCm8G0Q%vL:جt-t#C?C8;w iCNg{P%g)C&Մ5F1߁\VH4 FGujU Cb3ጠ:6! W\_pnМfBvZq6*sw=Ч0ڀ@rԟB{0Xa\O(Σ䍺pua}ځ=Ԇ|FN=`7giB| *y/zm6>qudUjh-ȋ4M4XeUPG'jxE]QǧX!<;ԙ\|j{8vm;C&Fkq&:Lm.s&m]c0*uLӁg||!dr7DSh aΫ:TsvEa֙NxΈkL?g2)bL!`0^[ 9>5@޶BwpM߇Leu f`r(t4XavU έ&\s=&ŗC!lB&su58~\.[̅Uaot;Se./܁:Ʋׅ7!K 'hoL fQL.gQE$#߅%z.D ^B .it:;*یΪwQIh#oxuXOl3gf`i}uHK#~aׁŽۂQLql&ڀNیm1ϣ{! II!F K=>ul;8oĵ# Ok@<&9Hus7 OEۆ}e`k0gVtUcbu6s6a=7&s֡6+ML#wqx[%W䰼&w`pM C+pcܶښBc}rM5ƿD +Ʊ?fjBNEGA/n21CL)dpmv1mf q-G[vsa_قc+߫y.Oׅ]y^![/av:SՃ`1#pvy0 &f4ZeRmݠb jZ䬡ur"u k cۅLj3vDY\r~U4~v&֪Yru&]ނB!ìCD p րܙ܄FsB}{ifl\ ͿW #: yPSwepamȥ4,`86].}҄gQ\Z`cm u Y͝A! : h 6 V *o0x: 7)b)Nqu!}vԠ6!=+KЄ:cWzl̳ ]C[?dmjC&A1j@ %>9i=5BWG(Mݛbb?A}*;ۀ]@_Ī^2Ϯ vHIu l.j3w>hk9rN5&?2z*yUp̥֦35ilB.@-0 )US~2 yĆաޱviu@Fot}_i݄`qPkJ9#z _!Y64@_q | 490u: N]ٰ=Z ]Ճt.`7BLjAMyΤ6/g{pV+h Ϫ˴` : sfw3 k.ي!۩3퐜5M}`12F1Ycrv564']y6qk`Z a7 MqX:SنRhUޕ1Tڎs6aCk36tYKuSOK]Ɔ'MRXaEH: )gSc{0ڭ _S{6C'01' !N`Ι ,I|fϭp%4&V!6|/sԠVFiɑw X޻f:?UYO$d(b9\R W XG vc1a,r(sX@)h@0[p&We> +25==L!;WH."kԖPV#t_5bڢMC772vfQdj\ZPHNί*eMB&>Հ:ѠD,'y2Ejy6.eM.as kه #\ `b)mȡ ~ؙ:OnkyALcہmk<7E-s6!r*L̈́ˮ8jI|_9ø'}6z`ʐoW#X<}/:`]qJn0q ēuӆg<ŁU@M3ƛې+2GB l08/75g\%GL oԇM&/_k29C'؇/NV>u/[Lm[0FFT|zC5iC y!uՀ3ܐS7}lE jCfov\zdOxO7 9sw:_\A^+[qĝ+5&VYe17\ 9}цZy!̙djpVa}$61ziB]M֙6&1y.GiB. zu`:M21:11 ߗkCp?cܐ^Twp>\*[ vV8o+*Cj/C&XcD8bM^1S-I`{ƺ c#w_Gv诎>kqЂ<a]t r܏Ҿ}# ZP2u-0HAmG}c}W!Q2댋A7kj@mz:cp} u ߿`ic3#-!SS~aλ FB; 5l2g<ͷfbU8?^!J5!_Y=} 儤j0_R4ת/@nv +d[;AYpR}ywo!`IW+];`ˈkI?8SK9`t*Afuh3̟4vqg n8j;3wBFCNXnp?Mƾn 1#Amb̘e2u ý3s<.b+]uW sq#k Qaƣw!%Uso29?COɥaO&lP;BLVRk5YzL]]ϯ Լ7xlm&lž/-&֘\mjz^X}kzuQ9L̤zW=ΛgXP3S:SOYet뙴VGqj]舟! ^D6d"dj.K[x~i1wt{'[Ao`3s :'u*P?[1k8p|\/&)~nݕi2qJtAy3źFbS/FmGZh]";`.;u8K9 NMjg,{$^r!GBGi j:>= *u$ct<7-c s< ߗoΣZ ~a25:r&yMi1V wہCN*ϘuGN\>_ ALyXLu78) go;lЊ{<١czU\8e5s@7v J|;rjL!S?h;pk nMG|= =pN# A[3y&v@7*u= ڒn\߄1dj*C]X~h:zB&ITg^kYa0 GÒGt1gQw0>]^A`vx~i0SNz`W6Y/!2ysYr8,Ɓ>k ߛΜ\ƮƤ!<+UYwuBa8[E?ȡa~ZA{5&:b\&vB̻*زpZ{C A>64Aо=pߩ= ށȳd-m6_!,so]8ubC\yX7S[=L^[P CgWdss:.?Nb._=n:6aϯccZucdM_ou}Y1+\ g|^8Yۜ]&h~AG'JuVOWIcDMT&w1KɺY܏mz`g߭_N&:iEQr-W:ڀ y}".dlk_\׈~E:\#׸4׹'Cq*r/Ag<$=[d3*g:unz[PHA-r/DyI6Ƌs܏`}6ə#Um/_#e<ĦY 65/nku&{t5Zo~yѧ\=I_ׁ|5/L`PY%܂6\Dm2ml}:y!m(c w䳷 D7,7[,vEz-j!9O:a\7;?jwɺClpt=;gģhvur][u& quuMBd {CmC|xg?&TP;G|ѩm:lB?Xk:Կm^; ~a?muc6Ok$?;Z݀r&=GG>{9]ȅ31^܋$c/ӯFMП Gɫ2`m˼ W&,&v@HtH/ ;Ț EKԟB| n ~P>SF1lip<+nSC`s0FA>d6!f|on-Y7wu &n gUW>!ύ}ԟ$6=WIl κ$:됗1y `cdMHLwA~GT'n@Lb^xľq9:ѩ-XyۀYNlm=Mf+D笓sOcDn&;cG}]}N~lep~[[߼A߅cpa{$!} 5c!ĝоـ8{f=&p>ٛ-z3 {rS<͵3w6Y\Ur͘7 <7{&ZΤxz2] /q~Y콇@7tϦC?9b9h:Y?Z#5~f=/X&CLp#^Qߏ}t:"=-SNƑOZ:`GMt r;p]ЉW ~܇6g2 :<[hl 66䖻On"׆i?HNX^:!6=Cfzq|S2qA!<( ˏYϾO_6z߀:Lޙ9Ihq$q-x>Mۦ5&.my(}d"Y_MXWC{=gzDwZ&nd@S;n}^qu+™#k65lN 4~ L+!Gq3Cނg`1Bb-Щ=֡3>jrN?16w Or"kj{/1.yF[A (9u؂U{sB+)f树SV퀍ؤ:ɵ:^{̹qSX܋M>Duu1EO-'> e``k$M0zc/21>OWhA:6ͭ ׇ3 g;>5Xy ~L]MfbWxL.GvZ򽱚O@ZpQB3=+1=C*X&9B, W乨ڰ2u8[CM XG9yط ew!֥YGἾmۄ g7!.#ϴ=xvكAgw5{a.gF~ `̹uFh _‡n%sst!܅<mP\_qvb El`K7@Cl 4VbbKPulB޺ 9!K_GIjaO_!mE$oCl=%]gcjrL>n=N~[@lj/BnY VĠi_Ggv*<ĝ68=>kif.;pFc|kV)6'ېvrWтz+pxBmCKZl?B^G5`(? Z5>rHIR$6C"'1-@>u֡ll>Ernp-=zA61ZƔ6$9gBetuȍm1qO9ZyA<(NF0luI*{pvK&Y[P{kQ{PCmp k%׶qƢ?gK"B9z|M7]{yɩyizADD0!YX'Ӈ1Pq~̭N:|mutbFg؄8FzӢu&EcaP߅q;SA Q~5UnKn;?Y >98c;D;⇻k0GzPk҅ڃoBO\Vu~T?^۠w!~ 5PIsMG. jҾXI _aWɳ9<ۿykoBl:Q`rgXځ3k =T `[nG=[pp>?\Ow{[4qw"!nvdr۠!.-έ' f҃z!4o|0f<k";?8d=;B>A\kDw]#y^MXwrTMZjfuC^Xvj)6H:^\O 54A[ɵ{A+bfPc8cn8A֙*-m 3oA]Lξ>fq>Nb`{] O1wú4j_\ x..أT?v\=[}(C# !ΊrG聞35z X->^#$Ny؍d]!6۶>&9~BX1^:_ :[:L``H1b1g&Lϼ_v&L&r@8pؿ})x6}X糦ۃ]"8X<8##GE׉^ NGB6LԎ7o@L=A"ԡu`Cؼ=W & R~vbk +jlS}ƴwi[?# ߏE=C ]#w%1mSRw[$Eb\ > mƏ3T)~iA a聾%i]79yhsk}ñG(6٘c_bh=Y=y$nOuUX}QؓYw[8u&pYW&cG l+9+uƥ{/".qC {9ۂ'wlpEmî丙1^q:. _l;]L >3ӅaHˇ-ȵ8 .k™f.`a Wa t9] ڄ!{d-ߌo*clCSsySӣg&60y'!R?goW`t.њA pg宻`e:yكz>Zױ 9G8=u\3^5!ܗ-{`.>1 v\Bb_A^ Xk?D0sY6uvKԳ6!7:-=g0Deu;b_[pOm8߰)6urƧiB 4W rDsX.V/ !8= 3xce|"z=W3 ߟa}~⻔Rl Y?M P;9?hwA{ڜ ugz乞VZ{g;{i]dp*.:!Bp]#jN9\ymuv!7ep6##~#P F6B6k˳`0yއ趙M7|O󽨞 aC)UR@`ޯ=Oh`jˇ+E؂QgIp]!y.`=AsXk1F乲Tȑ жX}vx ] =Lܣa,L|3Xwl gl:6&~`{'b0maOSij>o@=&iάZܳ6Y5 N|x] CnmjV J9 {om>BwxjlќZ'r8_!L(dzAl' eO!Oykʵce`GZ?6fB6X9 ߷N8\w;jqO<8 ?:g߁xpAgtׯ n|ܯrPӶeeMxXg~)yPo,bxh3bŕ`I6!^{l˽-im]!/K=$FJ71w/߆[ρ1õ/@k=8|Zu+Z|=8z o/ҁg䊰9LD_`1\ h4QL{my`h :1w gzl¹b;Aݨ=h jˁ}igpV^u0ZnCN,q~2"" qr6w7HjT/]p֔~r*cO#>oS?umݺuxf[9C޿.GyA Y']&ށxI!}oy 뒸W'sm0\wA'Y<=!}"]>=_a6.!.jk<xu.li=د6x:_MӁ;r"xjćR@5{=d{Li7=)nMԇ Zk3xÑG` hl [n^C.CGBm%SrZBzl21HqLs/  b>;߀)kAΒrLgue]\Bv;3L|6Zh}Lb W9D-Q= =~b Y\-} pg<yhʹr-OE[PstUru!Nq*KLzу&[ I7bCQ kn?::nbpBVb2DhUul287n&Dcuفڡ&Ll s2f[{CQ,܄8tt!Lm!jpŚ[ޫ&1: oC{:mAĎ`',\e S%sngz7 aili޿,iG~A{|8XPiZP˴5S apN]ױW/z>7Ix en5voʐ74fF4ּ >FjL|P>˷qmO׃e> ȇ} ^pmԡoiސɭa0ԏO=絙XJyhm7|MXc!O@l ߇g.sn/PaSՀmFas)_P;sv<)V gUj3y>mz?6"}xb7UooÙ`כA~] YU?zہ{nkF$vnC:)u3P/s;6!gWB~Q7MvOO]':k b%ȏN۷HLf=XwM83 8:AO:ނ$UoCD N.0-8 b;u,v ^q0[ Aԫ`y>^[fr]|k}rm Fƞ0&e3st@ub  _А|6kv?p]듳s:h- G T=XCs/c-GGU}aLiC u^f'nÆ 6lذaÆ 6lذaÆ 6lذaÆ 6lذaÆ 6lذaÆ 6lذaÆ 6lذaÆ 6lذaÆ 6lذaÆ 6lذaÆ 6lذaÆ 6lذaÆ 6lذaÆ 6lذaÆ 6lذaÆ 6lذaÆ 6lذaÆ 6lذaÆ 6lذaÆG x=586l6l6l6l6l6l6l6l6l6l6l6l6l6l6l6l6l6l6l6l6l6l6l6l6l6l6l6l6l6l6l6l6l6l6l6l6l6l6l6l6l6l6l6l6l6l6l6l6l6l6l6l6l6l6l6l6l6l6l6l6l6l6l6l6l6l6l6l6l6l6l6l6l6l6l6l6l6Llt۰aÆ 6lذaÆ 6lذaÆ 6lذaÆ 6lذaÆ 6lذaÆ 6lذaÆ 6lذaÆ 6lذaÆ 6lذaÆ 6lذaÆ 6lذaÆ 6lذaÆ 6lذaÆ 6lذaÆ 6lذaÆ 6lذaÆ 6lذaÆ 6lذaÆ 6lذaA'۝aÆ 6lذaÆ 6lذaÆ 6lذaÆ 6lذaÆ 6lذaÆ 6lذaÆ 6lذaÆ 6lذaÆ 6lذaÆ 6lذaÆ 6lذaÆ 6lذaÆ 6lذaÆ 6lذaÆ 6lذaÆ 6lذaÆ 6lذaÆ 6lذaÆ 6lذaA'Gy.͹Fk>W3)󯝽f=u9̤>ww>W_ˤ7wys1kTD4&\O0gݘ|^\Gc>?cI~ߚw|}ŽY܃27ko+y{2"ϯJ>4WsJ.]%[*k~>->AKmTZ.$)3߇ZJ6kz6TZl\ܻ\k767{CQbM=BGy7md4sU&ߩ0*du`}Ț]Q̿C zoF7]T&B!_o{W&׻Fo<*w0::|\u6p0/^oK~k56/ Y=X+3f{. }[݇uDT@opfy\GG| y5w*]uf4-@02td=R}[Ԅs>2:eb gtA{6otQW r7gTyT7,]w> kE!=@`>{V%:B58cpOojD*:2yS,^&guU3\#״6 S!B<5,z^F}Kׯ 6 7OuM[ku >eb_Q&_#{ N 8^Ns_陆6m9 @ϋ<}d=}U#߭DC~ N Mܧ;Ycs๿-txϣFl*pD4 klw\#m06ȹB2ѵf~lz6Y55k* *['f[ٶɳhzik)1~x<_$/q[Z(>gB\>J乬ݶc6 g|w|Wgk؞kp~UYI5朣S >=;E%K%Y _"c轧vho\Y_M[Awk14Kj-x m-?V8jk/CvW`@ DTaM !vS"ߡ k vR@ %/Y%rD'T.~ߵ$ ؘ&+cVY輅noTg Dm&<.Cƫ D]&Mb}M6|`&eurMJoAumxto5*pi]kkʜUe`+~s ^ϭ5Ϩn1v ~Ƙ}gőW-]1/V!>^2x>+ZsT1T{ l5kbFt5x%7C&\]vL* *ɩoޅd mb;H|u3u7m[&gZ Uڌ]'kI!𷨭rrUk[=T3Mƞq5hܾ 15\L.Z : ]r"uL ; `T&_5q5e&W5&LmMb$X' 2 53Tvj -W$*,L?7!Z 0`4]#92G!kxV5E䙷 W&6sJ`{Hi`dU!.uT}0[ziXNzMj`?ALz-5 N>a=[p/: ZUG6YW-- : ˘>/5{`.g lM8{(V.d!5&.+¿e3}<u,Olsn>2W+1/bfL 4_`$KMPsymki< 1l~*p?At1k䌪b k vBtDə0ϸ412ě{$Єl_ԉT@ko1WqC 8:zpW+U3`̚p}u𑛀%~O 5Fpzb[8 3$5Q7 +g`_mS khL9J#yfPl$6#,U9+?ːߢg]ˁ[Fb/woẠAe36༨Y^WbJL|s F:ce/8- g{G^U&ՆVñf1 5_ VJ̹2"65tC|gbxW=Iu ՍmƎ1xfb<Z`;`NˀA@<߷ @J\XX u ߬9_aY*Xd9onm~XcpWXW)Yermlv"#!4Aw85&+;Cޕ\ZLn֘Q Ά*a0rz^a0u-F}:`Bi*$1W\[mKzfsyZ"BП1*.[p _`|ajSpF&:XÌ_?|aL 5[&ĺJ`|>Nc/X|:#u.A.l :D\Dr`-p+1 ^W6> e&vK6[;b}΁nWC(#0oZ%P 6 ZKk6qA`E0nVfbUQX,`b%8#W:*k ֡lV}Rѩ1tP*kubw:}|yc7<_cLkp.³n~-90A@\#q s`kت#h{tJ?_Z}9u \n0+ο lݗ!C?x>mw՛LޯL N6,3ش c/Z2*pc>QoSabMrgT w%&'U]䜨2'.'W#V1 ANFx%-10gq kk 9G|>-FOHlMtmrT_S۷ xZU3/`ұ2ˀM12&3 qc pV;j֙!օQLcs(Dٱˌ6S8*jA&06⽯@b GSPnc[] ^hMΊ4]h~,׺S<5CC y*pb>9hL= 8)ơjoה'c sxMV!OlVW\"a?p-\/[DWԁy?o]ߤ 8G|+9 ,pe!!B~k܃45MP^/!Qf0s{b7zCG@p)U3`5+_myOS]cl:Yb*eG^[Wb``ocm G:*ߠ 3 ZcW@amx&qKw=N#N9%`g{H9)4 y)VϹu?S}߄on1sHa#:{A55GL ]Pwmh|Fk,׺_?w]f⿔y {bF] Su| *A.Okbr#_?*dTk 7 Ai2z_kAE9N>dp ף%_Qw N-`>~'| D G][%kpoY <=SyNJwky.9ʐG;rK}e8SA_`1\ zR;\:kfטsX=GʰZ-:Ǻ2`uE_P'+` :b:%Uan\5G+H.`T̜kqZ û"PFG !Y\/X?Y'| TT!g>-߁<[Ak9p|_@3 =xwǔCOW "Q9Rib-3{`eUGx1VJq{M['#T B&Gy)֨ *c |c֘r%ׂ8`o&B.p<x,+lyMiS^N}F9.Cl N m=CA?PlZ cڠːm2*އ3=4|cfW{ [9|T@tCAr|ǩzŸg _[Vu5_Ҝ0Mds~V OG{G!ǎo^w=rDX->:w YU Pfbe ]yKi 6^lvy2c,tg)3~19&Y\u+Q,Kh sb@`? @i| 0+W|qr_]8$ǾF]r/h\~w렾~p!!`Ιpsz>y"qZF@XRahV3x~]J}CV:r1n0?7cql|>g?n^?ٟ}F+۽0111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111yA 'Ae7XaPw嗽-(}AsAj|ٛK8 /  xG' _V;GΗ` xn|~& KA0 H- L27Of}YL%2ɮL& fLLJ&wdS v׷?,n& 4o=L sAW3LQ&}ne}NL2Lm58 hd L~(?ɧggD=:wgߣ||&;|H&Cd}ZI~f}d}d}ggWe݇Q&3Ivj>4=#?of_/d]S524LQ=dIvիdYLkdϱO3L'IvW-{Wg^]2|F&uWޑɧd2I%[o*I*72W%{+dϰ\> G2ɞE%[Ǖl W^f]Z~62g og}$?kYڹL$?I=־0e[|-.k;ޭe~-{k-gݻelee->kLd{v-^k/esy,sIך4Le.3.gϢ?grO?K$[^T~o&?ɿ$7lL[p9[L?l]TE9UKٳ/gkmsurOz.g3W+2Yf璭r ϜKN$)OKoS|r&ٺ*g몜=3ɞM9{6LW?2LgTyx.GDuX=l_Xd9ӫ${L#")gϳr>˯$ӉdϷ=r%kstn9\2]Ue=rHi.:(ezkLu_C)[I&Jz(esssss\y&?I$[lϗs#dsd{RJ/InJ{.^+dzwg]sιdkR'Kٞ,}\u.~.2o$;'Kz+}\>˟$[l =sdO參|\3˗tFLh.% *ek9s鳉|gG$ӳL~o&پ)e{ o˧LJRJow%c7%;CJ=l>z.Pz\%dt<|\st{..-e{t0="%.d3W0"YYҔd.L2[4K:LwDsRJ(}\>䩹d[@ ?'LޏD^cD2TzDb$;J*]%rd{.[llYK.="]#,@si̥HM\*DֈR"ܗ ?s5"Hv22_b0ŹWA~3G ȿw ζg^5 ?E_0AOC)ȏ cD2.Bd~R!F~!P!??`+|?+1DG7dvTD#A\2o' |+#ȷ(1|#7(uZ"V!!_C*|%?w?Y@Rx A#L)_uQȗ?\@#H!_/*(#_/ -(/Y4!\Q(|%ﻀ|G~o=w)^T /Q>EO^AvyR>/ -yI X>͗$oZA>w\P>c|%o{yP>K^d9{rE<"KD>E;/1×z^r7<D "5 d77|o&&*%y&Ʌdhri(d$6yIJdE6yȫL~&L~3vߵտ/_>;_Rog|W[vuoow>￾zg;g}y|o}ۗ_s|ΣWOz?_}z3~?as믽5 ;U|և}۞y?zyן7O{=^߳w|yϏ??y~ۿ=;kӾe;row>'G7^7?I_ͯyOwO}1o{}߻~cv>Wkw>_+w>uTO߿yۿՓyW_|7|?o +??~~GOoy?~sӾ7so?-;gIr7{^9|5O_zo={ssǼwyߴsoK߽s/}nɏU< Wg^_:9'_C>{v>b=~;=_۹z7^s7ݹ}?sosG~e7ع%wn=w\{ǫwn5?^_>S;{~/N7/t|7~Gmr?Sv?+'vz?^m;_/n]y'}+y߽Qoѝ__|_?}ǿ=;_}vv+wwku;7|͇yL~}57_;;_/3_;-_ͯ;;1?ɝWW s;}{;~wz_y.Gw>?{(Yr` DPZiwgͼ߼; 8@&S$rƀ9h"cIFd & DF"5|uZW{_w[/[׏Gʏ?7׏s_}_c>ǿG?!O?O_~gAמz]?߿:^?~ko~oO^?oO[֯/o~O~ҟ^ЗѿS﻾K'~׏'o~}o~/{>Ͼmk's/}]~Lx~w߾~1{e迿-/>׏_z~sW[??}oO{W?|׹oٿro;c7gm7_?w]ao==^W|o|ƅ/[߻%oS{_ _?+]˿Y/{Ƌ/6/mO\*޿g=?[=w}=|}x7>wa|w^7'>m} |uo}^|{;}7|W_}s?~/}g}Ư^_{WʋOzߺco^[ c=ѫgsq}|_ٯ=7Ӄ>m}ʟ| ~ [_l}9o 7egoȏbw~ߏ}k=k'|鏼ԣ֧׸O^k?>}7u>߿Yy?Y!zs^Z>_͟q/~WGp~֫՟y~2{}w~|k?^>y}͗{/,+[=_>?},C^^ox?X?kߔW/K~ك>a}u{=Z'ݛ~c?O[~w=>oQg7__qy}|?ޛQ;~s||m룿xxY뮏>_}?p} >w?{Yw?>W<~{s~r o_z笏筿i{a}tߛշ~.w|Sև?sç>l}so~ֻ'tЯ^Mm~_:&ه^ߨ/}3|~eWS1ogoton}}=wr}s?y[}޳Oy3֗O_yj}/w__~/F?ދG<۟yO-~~ksO}W>IEJeʏ~k/Gѫ?^#C؏C~}W}µ^_z]]_wïkS~_\_};.ҧ/}[ͷ]]_u?x췟Kا/k_^_z=bM?,^ʏ|#U^n}?SG|bK}:~}Ǭ/"}=/3zoao-ߴW{={7_d/1G{Oz{>{oWA{oWO_s%xF3\ƽ?Nʈsƻwׯ}Ļ?-O?ӟ_YƯw_[qNls}ݿ{}Gk/='/}o!_G e|~W?Q/}/y_{^Oy]>?݅s& y7NL/O]/FS ?f2L׿cs;{z}օp_6}/ß/z2}Nx'#A'<ƈx Ao{3z#^G?t^觾>~H 6ކ|o^߆go;^w? B7U>W}/@G yDǏ|x#%?#6_8#G<qzO?)\?qѿ K/~|?*{Njqs|[;oO}W_?||<>{KX?짾%]? I>eDow?eD'|ѳn< qпܯ?J<∼O{yDO|=mqCßAq(?<"}]Eo_}C=5F[?3{sw~{o~?"{ȷ#?GA1"[?c #1g[|x2>K++CxO_/7q+{ W\ɧeo2wǷ/[F#1=>OJy?}'}W/O{2cs?"^%믄z+!>g?"~wGw񾍯<`cD^yDGBS;~g??>"z=~{~7}ԗ#?!ou#͖GaKパmV'?<-/~G#ŗG~8"o?.wݗ}_C#3~;"GȇƗC>1";"?eO#y;"?wG/>;"/~y::AQ/O>uc|~_'# zDQpG%6F'_K#Q/=>GEGG#+Ϸ!;nǗg?+^,mG}uu+zDu=|Qz{=GϞo#o%QQ#yϷ=wDQGS/:}D}~GG'#d#{D58#?و lD6B;_ ؈: lDl|w|~Qy{<?/~D=/'ggy!_/Ծ?گzڷ?j_>^xGG;ЌOrG훾g}O>m_F'~oB?_G;^ G)oB?;^xFŋ莊gٍRq6zG w7*_zmTڋ\ƥQz܍QqasUFvTvn܍/D#tvn܍/Al7"B|7ݸw?Lݸwn܍/#|;vn܍q7Ff-ݸwn܍q7gq7ݸwn܍܍q7ݸwnW?¿w7ݸwn܍qt|wn܍q7ݸwndg>/}n܍q7ݸwn܍M~/?5>d7ݸwn܍q7I)_cwn܍q7ݸwn܍㯽ӽ?wn܍q7ݸwn܍q7O7xn܍q7ݸwn܍q7ݸwW^iwn܍q7ݸw b|x+>%2߫SB 1()IqDB ?pӁzM"ֿ  r˟'u$ȭ;py.?|~?x?_ӗֵy3Hum?n]I Mo}?_n pGT>.DZͯIn]yN);ݺ3 ӧG %p';qz {A@JנW{5R/I>yW9:k?7=s@"3o}D;MC~&~)9}]Ξ[jϞwqoO̊iLw3L֧UN*_a+aUi껛-MϻG}#L?ֿ~[rGRև?V>&8޹l}VMz#e4[jCe:uJitVݧ([Pif)Lˍ`mKU;r3xHzrL/{ dmt4NVq4#UV i_/jݕgImcne*zFz3xi[U8nn'Vu{9%"-:`uu_2n &4xsy3짟,N}_Mώn=OIIɗiY[8<-!XV객ӄ= 3`7v$Vt45Q-xGN-ԩ٥z!r͹p6|hNC?9/Goicy%&^_g[G ~绛+ouMo{XUQ>xboмp^F!%De$j̚x0]ܝl6(_~=LOt"vAљ;:΍¥4Jc\H.,~*#bǠǿ}n4u9'9=O?%OSlRиjqo|[ӱKr\'֯d 0[ v~lv"}_-!!|nO(5Ȋt2lɋNQi.NJ`g9'Ub wJڲt挬m:t" UhIr ݜJ $S"ipJž;-{u\n^kDOSq.ܯ]0鶴%! 6J/1u4L#<[dH"eo5QN@29"HYI婺åyF"Q7Wvtr3]*Ri]ЩaW]٠^;$WMH$%~'/F 8&3}Np&JtįijW~no a&H%b_T,ԝ@+'Atz TID-sfSF<V~fӨXq`@@u9ن&#vvMsrB uCPnQm@M\B ܩ6*G$咍M.U}MNa؀KXx]h o6d5*f;kc&3usP"FO",-^q j / GBGus^ 8c gkѐ`.x6K{55 aB $bqe8t59 Gϯsz6J(DqK%JԖMM2%;22Gg g )Z\ 79ǥ%Og<ނ}NZyR&?MD)ڞ/P|6 Gv19hmyl2Рh֒ɱha`BRmVPal% * PN+˯nff]}jLGx^ͽVBD'椭I lVȶP2YӒ$LTVb-Ǡ,?X'.)Iأlޫ]QB [H=+,;C9ppIPDA7[]߬X> -{a@Mt$2@bY6P݄qsFFqX=+<$^ 2ndBUL<,y}{R)za!ǸEg9S3D?HGFkC !Y]ٗ6P% //BZ k#2/ A=Խ*]Z\mADɄY}/Z;r1wZ݈2D4f5+Ub1-!PsQzB.UƺILxszt o'B:ٴ`W$ ճ*-*8f@ΑP>i9/m%f= $8k2ޛ wo9{ȳ ((i]T9҇M {[)\D#i-dh1 `MfW 'zFdDhN8yfg-w02t1aa%}5>iWUAF taY!;GTPglJ(0r SESxNF15qU`+3.5nlb$- YEjљUԊ~J&Ϗ1e4]yn{ -P \ilO(ԔHv$2* EQ%!(lP8DSkR{F,k\|sh 2$µ Rr2b/* sHGG3ɘ^*Aqsc1nדؓ/5*cyW tDK@KK9}nz}DܜU6%UY'Q/|Nh^ c0,3S?o5;Lqes|56ލ9^+&(y9Y `A|F!XKN)Rd |N Z\6bbiIc:`"U=ǩ(HiXP į=9$YɆ~]&cI"7Δh@vqײ 7:qWii Px));B/.?\}2SM;Bpb"cLj!A cRj"}&kRV.#P(`1[("Bd6:O!sypڽc!ެaf+%`'"$1"ii\hvٻKdD*sࣅy6{<[tԲpA"?G8KSyGL sC$%ϡH!۹vwf MX<3a$Pd, N[]li֤Ћ`7f&=!_;k}!;+,b )iA, cXLf sfʫ#5TsLZg{'p՞5sv}ċnmT݂Oxo"^:ZD2`_BGjD]3H1_$kVV:Wu4fjvZ?/1N/Z7rES/p91ܢvT},ˉkpۏyڲjᔮUl*p!N-4]ؿUB,yH9)ǭ@/a;7"—Mjl6bsZ](?W̝(:jKf~Y>c$l1 B'B*!qrjՓ3B6gŬЗ!;3&)lq/)R*t8MMՉCy4dt[aqR}݄BI0$u+I`nD{/M݇TA V-,H/jŔpY/t7M[L΋TV5P"sv53kȉlE0-[#H@͊=u-1oڃYn̚MVѯ)Υ՗[j38cC;ٶaopSuGa2I^[3 ({\yJ}0e5"B+PSh`XI].ɖ>uˈ!r.h癊lGg Eog*FtԎ,(cPPÏa(IjVYL 'J~@ܰ#dqWٯeN3s$!AcJ,8o*T,d!0*G%oďHc!P0jmX4[DP!_20 k]$(uD2 Txv&1P|w:vN7O#~%VM 6fFbc U׈/UnDo4osYw*Âcu0Rѽ @౲nqi쑶S+lmp|ʼL0uOIGC3Nz*qUEv2r=4|knwf&0IN c2Nˇ@p8`#\Y<_!)܍m<: z] eˆ#59A]qpj}6UyIwX8͎jU5yE2|liHg 9a_~u anL *e#uerqfDDm¹WT2EC[eNvvΰ)EBCB$s4CN?%$Lt~# S>4MާW_9(DsiV`- Puf /#Q>~,KtF[dE _(]AIKxe[><"##I5PKnMfV˔_'߯] r;Q7H)sG*~Liߓ^L$@yJq@k0vȥZ.ߘyjIޣVe%d/+77}HnXELݱ: ʻؠjOR_uiO<\cnFg1|OHӗճJ(|0Hܭɔ[H؀[j*fp6 NnR3Ϥm5n)9u6F0 ~ âjH©TĠ$T, / W4Tc%@?#>E: ,W{miڕ+-45WW"L5˪%#H7 ZsXU[o끙y`̲G1bs7a ٜ6sq̜,p9޿dLjSnCfpLq֥j󍧔2 Ĵ]\"B״(W;ר-"'TlKa&۴>iº/&M*^D `S"A!ybD]%P{RtZ;̶ mGp<! gd}`yˁ Yfc ZSt剺h#B/CzSϩF+)4ޑ\*gun\6*&׳4;츀`灀늁ь99}&'ReIYb$z3Ri"{3ŅזŁ)w5ucg̡4u"U14sb`(`Nl#Dǧ uc; QnٳuF3'5nÁ!P=& h">S7j2 U\C"To玾oX2m,®XƵ)`@H͝7o"Bm\ҘX g7{N1 Vuae+ZC_X2CS_ C*vEԞZ Ÿ5s:i7r@a+։Nvi9~;ܸvyc(wGOhA[M^+YAtqT' @c#IZPm9 K byM<%w_ ?;K55s4P&:؁ 5b/^kai+OL薎 gF  0]!=-zl[n>YRiH{+D mfx f]i8MGt"_ռ FB-rk`&gNd(5".[Å)n gH@#^u8*pgto֮IS2Z[AŃ&!X"ќ CshIB&!4e@Z$ҝw{~`F\\kұ2=/2YMd,Δ|Z[J5A±J`'_Xt#(We5 ZTKFcio!Exq MgDl W8}vz͝d 9Eƒh{0^9Qfs4@DU|<젚(Hտ-RKYk93YM mLߕ՛ 'u{y:|BTʀ锫}]лIV{m9ѫ"T=m┼6dD~WNy{AL߃=Wڷ#Ds:þna,0 N1Sj8 gLzeHBpV %ozn)~Bf{m܄ŀg+ ?lsA@I=!YsQ鳔Qbᶩ9]a W!X*SAY`94zQ}8B$-YK5W.V^4!iD  񱐝f {F S )six+7 /gȵSY{sx$ьҭҊ( yk[mMkCq2n Uy ! \J`UR/h|, dPm5bya )/殊Ʊd 'i5!j}~Eғēce ].[ MUZ/۟.$gݖx{M J=Y;qÒYZx5 $fUJ/dS!KXh )t&+jLYo~3+ӥ0{Q}&ު>b경 QN*Mx v?mL' <\ڞ=T4 {~BZ$ GHO\p1(#H -T_E`*uMs\[ T re ٝZSk$B֯ϛ&;ͳ CLt#]th3W#OF}xR"Z R̄3W:կde`N\~6XT]@Dטa[ӺhmSJ4¨bs(D[[tJ>YNzb[ETꁃ7u f9p8)(j[}h"/jv[НΪ19V(!D 2)zV-UVFɀS׎"GBqLK25J%ŗl2@eʿK\U8dJ pS"5m`àÌA:dx\0 |T2޹ cdרּʀgɏiD*@ynrH-6ki,@]GCFHe0G oO0;plƌHeHՆ㴏U-r;A?L<4r«`\`Uu2./j.CP0C.@ N^[\* 9{rO;ցMP}U'+q&K0l/w\</2(0M$vJ^!YYcHgM^sacg@iJuւh,;, /3wp\MqC7 dzv-h`E*l#QJ(e-F;me5dig-h)U7!"=])z-(= <[:pB |р7ƨIva'Qۂ=-;G[d~YaK;6qEv'جR~nxq;*l@Z[t,Z5TWGEE)6 ʑuLPf~e}e(n4a yy,35- #7%yupD|YXR_Hy_)(@ @yB}>j4|z%yZ*)n5Yno{0'n]l5 {iN&MZA7#sZCd$zKLZ,]$?]jد~TTkjK} 5SRf˧sHpܪ&H`t*bb#Ult5#2iDEBʞF%d8mx$BrDb[х{<."=GĞa)3e9k>}rٴ%셊n.i80`p?ڮ|v6 pyfyi>17ڈ4ݕL8^>ɓHU1 fE0D$LJnVTz;]&m蚘T'/ CrioԦTkHt#S  41,$xIM+L㝮XYzT.  Kޓ NKObIyR|#;_JipG'xz3ufk#(c9$˓h"tvAԣ5E?dfHIj(7S*HgFC4䷆qKdJov7ںETL>̗R64rBlL@4ռ$1=XWbL5 iŶ!U|+ş$aE7j6.#i̚Ȥi$x ȡllw6q54aqT4qմҀd &D@IdTtcBt}|YĀrO_!k-nQczIĦgBV>;oFWth4֝_]V%[Q%Eظe=aU~?wCjoP86 ?TތKa dD:/QnʓvkD:$'B&yhAjf^JH4{[z1U#]j91m$So=%d(0jDFPK5˗훘D+ v௤9HR}x5[5R˧N@5*YG *ې4HoR2IDEa|1bU!:h^TYF5hPu4wN.f8N%aU*3J0%$DN=JDݰ| \6u]H_f \.,TXڬ-s: J9"hξ*6FQTjf8}DO $6'5+N_͘ӭ!aL)"q!WElqG-4 ʱM>N!BМG qAAJ_G~ 1|E:FXIwË[d8?s8 oKKg*VgG[[f 2~T)= t}nQ&፣twea+IWAl R)J1n qV#a7&BVk\.U heyѿ}8L`OBp:d Z?0X1qho r~eܚ*A`ZǢIMఆW1LcA&-_#3d7oT*e̸C yn\ϗωu뎱$lb[CjUx^qȧZFWfvQ 3ʼ kZ7ί*D-@*^wL/`IV &tt޲HJ5I$X e~S^nE-BT1*:zaH`n8hͲK7n84II Wܝ ʭ5WR/7Wex& "$ Hv%{ru7i !>'Jaњ)b,ƶ)3b@,AP]F p;uw _kqԠ"W:f$S'T"G;5L@pΨby#PTIrqIN`dCO/!Laiq(N<>6+.+J;U=[Ma{jWI[P'9n9׳k>S/`laYYmVUyqpNj'80ĶxZiЖ 8l%Rܺg8澶6Jɿ%sI:{\ɖ#7ΎHIEY zVɴ*c01dkF9 1ӆY`RN/WgvIB+ W%> PA\2-V5\4P|1 ǖԙ!{-v](Jp\Ieb|<[ܘ~|v#%bN؜ԫזʣYi 4eb$1:ai'}{Q[=AμTyP|c>!$Lhj;I+xIhu8`Q*Ea,@˻Q c`A+ZxM,nVHpTS4$ <ٜjytX':$zA9HREu82g od(x'.ug  ت ׫Ug]Fd Q ! gIS(ҜZ|ڝv~,'iԁҰU2,Ū+tzV=8-lVm \0a / l=mƙ0[($Pf)n73BtJF,yA<݀:/&u!}7}sːf1BEPL}Gd9`9pr~D>fq;֧Ǟȿ^EcG"zgA+-t)hVʠV/$1W8JuLs[wKuTM.=-[?o`LHNU<ǘS f}_g9! 1bpL#Jϖ}l)Kœan!ɼF>N _v]zhǤB#޼Sޞwt@ȵ:gdp.!bxPAF^v5R`MC3.XF@)2 `F6uB RBL&-F 1Y㄂ee_ i${b"d%*|MiPr m}9tE?T/>VriSۋw]"*la(sX/\&-T;$Vrhk{|sh%'%o#DZRFY]U"-Z*)K.R6z>M_8}%/.Z$=1\ϮJQP[CMm.AR 𓽆O|$"G3+5T˹@Ͻ/+L]/h ۭ 'ꥩa9@ "'A:W8ÕNW&E7<Ϫ|iPBt^iH>iDmt]lɛ"Ly]` # 72@5}IL\{Cu0>KK9n˕}ǐRܘγS<8[@~^IG\+~FzM+LPT[ nlY@[[DJb|\W~1䔻ѵ1mvb&Iwm.A!(m%'# Óy44+Ig>WA\N#!s}UXLծ6Di`TT0б_P"!1o(5Hs2hv8{;qÛJ4a%1ܠ&@f ?n68wf?*DH.h~CnS8hUXzusdQF Y *֛V~A" qz"4@c<"q*|m|RHt `F9-}0n< 6#|!Y-I nޤnXEW&9 G2~^1)2EcRT,/\x/6PJxN`]W:uAplťcJwa*/ǁml󩀲^QMzӘi/?9 k 3YV31nWJ!/(bm*K /$w42_+¢Q. p0&yuH̓TjJT~R0\UuӶ[#SRޜSj&m8@ zԝ(^ 1޳(2%˙Me:.iPh05 -"NJVR:UN+XTv)>\7I _0>!(Zg :15Th+7w["j-\$Vم}b_-li& B`G8!W| ;[Km5J~W!>0$׎:;{M@hNHduEU=\HpQ<#!V-ÄiamNOP,tGu{W1nՄCrvGϡ>@TS h(HipockZYГzֶ՘Q/eL# Z1ȃ-Aϣ<ئ,'TX=لAok3ROFf![!`\7he5P34^5J#*7nbqOWEhM`8w'VeaZ&`Jak] (饖ӚV7Җ1,olvԲ?[* #jCw0b`ʑ])TbξSq< hE[&~JeU> Au/3(BjgCUiq3u%1<=l,mxMѽЏ Vz9F=ᆷXVo"!*{6SAjCF3$ӰN%Nt+䍂 jP[(YQ? 1^!d1mנiRXɴz>C+)A!TsTqM;O2my8[Zv5⊴hS+-%nmUCHAf}S Nd 6&d<sbSHhPG- hK}ae@8,p2SkSB)& #FE=)bOkŪh=aYh&ЩGD2Y54d,%p 5L^]HH8YԙȨSC~x+rȸ~-Of!$v,>X&ݖgm8G4Z&v4fWphNvUrPjCTqeVD>$xœ{$I w_KXHgG=+MTIZ#t*y$(Q읇8}YIX ~Gx@zRц{b\Xx_pE;o,nj\Nc& !;l@t nl:y`SMΔ.9a9׸ L 0*(ޖ)kϔ% ~2p˥NB=-[ձ>5 ;OLv!ht,_~38jT=ڳ=muխdY{g*^g3u[iL`PY?bVs2p-h JȂXņBLJfd5unNqdU@@q9PCy@нgͳtVzY-[VeZlOtRn[f\ cwDȒr" lpOv1(qލWcRQb: YsY]3 Mi5$BN:?ȨoIykm:eBZ|w~Q<谡v29_g'drPIz_uJS*+֜̅W| $:bwbЇ>`0 ; D\vR"NQ%囿Hh,گqYWC@z)ަ*"/êmO(-mzJ ~ҵb1O8"^6r>Vc2:-Yӏ(ZR-@l^Kf?Ů,~jϺ㔛 ~{nE$iHhrʹ {S*G\0`pQO1䢺`N7nC^Us-   >DNQ:_X\V a+]W4hZؖʅ,t:G^QQ H-dY҉2'b~W.Eyfւu ̯o~D"<ؓ-hR~|OxѪ. ), dɔmB{ `g4X\ҩ٦^͸>J[O$HIsQO>f"C; MD,M(IVgqUʁ+%sec@%r pǸ3$ k:܀Oj$+nF]ot?`ЛiL@(tt19}گIQJO)6C?NWUMԅl T#j$ kz<.cBdrdbPwSTy. cuyI*tpriEgt4JZ@2~lZ|9T@[+>yג<a'?у\jzvq7wR tE~7H5[X?wSLxak̳w*U^ΞUJ'vYjB#Ϯ#}͍icr y7^;k?55v=O6o<+j;e#TYzMR-!?NP'uU hȜMNLιE޴ M6I(6߿ڪ(R1IL\NtTD 8.hʂ|0%<ϴR\, U0K (ZO_ҏ7:R0TՁ8TW%% }!^R3pY/<qEb*'?JZްX)l?>83J1tqR@<|ʂ!S:-]ƐH}1@l  ?1+d%f"&pHlnP殍S_K/x…ͯIJ۟- ڽq3ϲfoH{gZi:-KUG1@h iH]"zmdy-'m<^K`BV5k@S!rjPk+BmS=O*al #qlè<k爔$ry_#+#qAuV"OEIQ&}0_ JcF#P'‚֮5`UՋok0xj U>^DHpq1r CC_HΒ⯛Ҵ~W\ s3~OG)celuGD98RdߕxNECXdrTr,߇P5?~#Ktv葒rm}E{ _, 2_+MlO4 .{U5^@a@aPLr=ev[0E/:tuamz.A(̠4OYnT=lK\oۋSCi8YV6-0$cfeZ { ESE3,XRWxN uMv`<7^B C:dYu"IP^jm*D{3)ٷ{НTp/B qk$pdesNN b|W'8k̺pvJ(Rg+ʈZr6\BQOhtN+O8t_n5B`W4N~\gmTj5\9.&t~%$wFAh_(Oߢe.I_HML)V[`Եtol.Rw}G᪝zSu\}/ׅlߦaq_2ZEc٬̖;k\ Q>kj 阳F Dl4+}r!Y2ݜMcU'`ش /fo„exṉ+Mt?u4@uc0.DmUVIUV#2Fݮ R1^u5+@괄f ҿ5qhoJE=I$!BqIpsۺE5#+T6/lMj7QU<ׁ ?Ƞˬg eQ1s9u4GN<%"py,w?-J4 Zx\.q QnNb~t^} I4<`Ӛzg^dKLPPDUU\э~Qi@q)`YKu|d'mW Bf]_ .S ;l}QMJfG}Y$`bvcbuX}~ .! Gʑ2&>7B Z^1Lx3+k%^h"dr 6ˁ2m0X| l i>{SQarobr9j)9zm J00%\4CZnPǺ;jXV2wHsEٓ)VGXrDe+96Bf$ò'r`*t2!rd|>2V';y6Y < }-S0 t#Ot;r"q`/1/)0ih&DNJ+ZTGJ4IH2B*!%6b[sl%1 (&rSKdPm'5ΐ`fUCS+_.{S3vA H Gbp"Kk'hMs͡Hw{&ϝ(}*XQݟE蓈hт<9dUi +-{N/>|1{{ /Wpin/}W?W]hKBw<`i6\شhn鿰jUI/JOT&Y/ i9kYӰz`$8_z(wLv#͈g&mQ(2=ZmO9Ap8 ƧB++pNw+ۀQ#? "zf8/ܺ哬GWLjAIL_9w&tI"UOB6d^'٪[1;DNgUjb&A* V9֪*JQwa"JI@\7GLWQEvi*>E;^DKe4e;%r?x!p_-1zc˜,W7*Rb ?!JS$6;DW̑|dժLY'$U#}2]3hfB( t# k \PqB,>F`EmV'O)GS}ˆj\*\8W9`m_ J^n` /s(yyk`K^Dt0O+RasiA֍#V*%yɄ>4Д} )"A]r\O\K`WNJ2,w JFƞrtN2Q6Zs`F@I\i)g5x$kYӕgΉ#2 2PnqRE}}Y{8K鏆rKOR]r ЊYF-WicIA caKgB--1sue8_Άs!T)ͺ}тb1*D ΋kʂ \|qxwǓܨJD7*k=p63^\ "JCI|vy+,.j}Kdэb_H V&$ZPM ~f)d_5YA$XRd%X7b=%.*L81 K9 JBUn5.vuUdt >9.fKd|a_uW3BCd÷=NOIv{0&b7~JH!t~Ķ4CvS(C#53ɘvچX,Tm#Y 8V&fg[*.>SOb I* hx[c^푉sL3_BƂ1Um-x(%tVʀ20#ER%KFe'~A"Q#z(\9,9I,+R`'Ѭ@`b@mǭ@44?,(aziѵ\1h}ڻ8vP\r9eRAL<3  >(7Ӫ>R0MP֜ /pЋ,ffI'swm{8&9SW]#Z̥!NhJ7o6G;440w3$c$`ἵ7@E<,c*L,#v}CSf""E-.$UbNIHarI$(K'`! \yIT@+Yx2E'<Dk)E,:UruK+  2Ķê,m)[V[^WKC 7CZ*DdjLF1P.i79RANֿ2% 3$nʻM,y.QPNX#N&J6M1| ŤvC$o ӻdl(.ez"Jv0.JU޷ 2"HB*pZaR*_>n+GMgz&6#;$i,UZ¢6WkvF2hZ%i.F$b pq0vPH ݕ3 (pe^xU {(j3,6[^2&$ x k#ѪW (lm>4HVİ `U#ŗk#B4O/&3Imk%6~dƙNrxb\(B~Ɓ~w:E(˭I>V-$Fֵ9M/dm+p*Zq+ԄdT!@zb&EpşlLWB*JQDRhHZQp=}OZ^_m8ClͼhXaTyq,,a+@vA->K;HWb;?"bazHb3aLXTrcm/Cx{IAd]r_pocwvVҺ=ނ*AC^׳R=]ܗO`-m]xK# 7ogt;0QyK517HaGXuHȴ7^.]";,Ei/R9/^i'I׮;rҀ8A0o`ELZktC($J"Zӕo}VPVaYfAҕϩ'$C ‹L V]&c{ w˄ (UQg)w Y湧]ri[%ʲ5.8r'9qNZBR (C- (nLj}"?2EV2׹|\/ӑpVc+"Sy=O4zJQ>t?V,Z NuPubHDUJW!pAT-C#cu݋Fz 'V(qmxL?#k~qYVCHU% kJ<P]2q#э7"y' n][_˿J=8+҅ u4B '+'$Lr=j>ycUFMNϷΜ*83v{9֝@@/*c[1d{7z6y5B ^ߎ80ևIU<+!ő/f)Y!\նu}z Kw` sL%ƚgׅo;"զ]0ePsAFh  HG/jtD>'X4mhݝFZT5L IpuvFlgW &'v 5 'Eύ+XB fLXD"gqUhEF Eڠ z4)d.{hK36%Ul8>ɚӢS5ҘfH Dhʇ rفiBC!}+8ܳ2$/wiKe/_"AawsVRG<4A̰:HfH::㰔({ùfc}`!- J=O/ɺx!P)S~ȋkx c2"cr}&$!"dH`)OYЪr" @H/eg6pϣbw<#F(X zEPN}~b^# 8ŌMcDK2:o)0u&Ag&L).Ա_O&XZ.3kUwuF,.=+.%r+n.WUCL&j%;oi]-Dtk%Bd G~c.! [I+C{fY3RU˅)8: p˜DdkQ'4OTrØ%}ܜz,V'ῶ{.=uۛ9@RA)kKs̍ΙI }8%E"S̑uiYvw3a t)P+9ׇO~L-~7@0\'.>F%8Ό険ᚘ8K`*f꓃;bE_pF÷zB폙ng5`4|[,GbLD?0نS@gsPeuͷX=:&q"g^$)w++]\5Wj ެZU'k_ϵQCSs _svSnx_O=a ʡFWpNNU⵾`:;_Ydi_&Lܫ3ՠ cW٭dco~G(CV 2w92(L>Z1=w ܍p8o2*zoCz"e)LAń%(h!͹Ȅɛf(Oުv<^P<4G06Y_{w7FTo G%O'9Prt-D((/ | Hc)h: t pB7H5s)"ˍL!lD+FEKSYqbD` H (ҴGB20%gt`Bw fz0:Sǫɻ@$%Xͥj'+5#C-62#6Z5;H<527 Gr֔ la`D[Zn*{ɂg&ysAxnQ1wr)[KZ+vcY?j-o#lK-Qκ0-n4Lt44Ck=3΋U_CF `Ώ! 5"u v]U%߉;ꐶM@jzKj*] lg }o}(+R2+0mtR |?:)V"׷h%z'aD$=Gݹ)"*A w6@Td'&YEhK),H?2zVӵB$D;0@J4c^ŪGl϶0ڹ &Ci5bcc2T素 IJ6jTTJ`G/Zmi]!xHX*!a'|9$~3I=Dt_(kWs0d!w6n*74`3ֶRa3յȸYb9 u(*L!Xc~6QtPgx׫6eQVzzÌg Wƒ0 ǓVެ)\Vf`]m|f_҉5*" ʩqiom">..vRIi XG qK1VNXÏM,(|Aս9Ty9ݚQk{$q[ NꝥNh]yT w$%I` W2I6c,GL`F_6\?m0'0@<%)Q&{S?N D/j;u_sDX31vFr;#a8DA#_Ϙ9 =@ٛÑ-gl ^ Hu BUyJ#{D߅< rI*5 j|t0|l:ޝ_: Pa'_龱WRZؤnǻmNݦbrH+ߴ(%[%772fBm\~X8&ٳ6fЖn 1h M%ҿ*)'^ߐ[j2+%}WG'cn 3*;+?A_ l3eH4/di#Y/=P~{iv.J ю<%8ۜٚv;BNTuJs%3MtVsFU#{~d͔M#XTt =ˆ>ř0R}qmY["Jx4 \DCz jD2RM۰fFҨ-G)_@,LUG!iFǓ=;u)!:4#ngRgՕ,YElYvBzgB2A8dB-i ͙-rTKj{Q$|?Rby"̹|>Y&iJ@ I/WA)[9$Œ}dM>6 Ԕ4ALYRZ1  $%j^%;ZT zQND>1  ,r8dVA!fV u2!ԭ)=G6HiX&Ŭ9 & qRA bgݭRrLRn.ki%NMuKJ$LJ=F~v.09vGuSyl0X']jTeztD4h̕J(hfaS 1L|eLISr@[OM/.ڽAj 8֛t $S0Ѷ\Sc_AQvJBQ"%i* 3 2ZL$ꈀd%N2@`LT4o΄-g,mC&9*})$3h\<.2k#{)ڪA^ fek3K(`-1=& K/] Q٫qJ|C̤KjK 1.wyr`wV]|~V֧ylРEp*H6#J"QdBmswO{ e\{xZe6뮪P!j% %v!3%:n4#Oz5xFXU՚0/FkΡ˟lvu3ڍ2o?V:) k MRA~@Rnum™_] v`v4++V$!V( XhH t4RIhZ6İMp2DmgI_r’z~cւ\׳6_tǤ[Rai )DNIhp׺T~N6Gڿpv]ƌ++qagNRA{M_MRf]m(0 ~84OA!x߃ʷ(׉햩h"%6 - ,g L?4*X3%^<6S6Y5$r\W$ [C73U[$7hO_"<35K-lA+/6-P*$ߟر(f%ZG;"H0Q)Kx9 U>7]MHZDD".Q1R;ƺ`GY:T8U#SpHQCt{`4wR]AOo89fd+BVRpOp~qc#|'ry`>fUg.Z&s,>C)l2Jqz$"q|7R‰Wg΃ܜ <';cV\.?Va'2C- igpNs\rr~EmKو#CĠ́] O`ӡRjJ A:qm-jOSȎӲ =XEM[JV.%~wfTXnSNs7˕֚:[짔+vbF|Ny\ nGԴ"ۥ$J(Ӑ^T_hU""s5zQbdr}Q}kFܠDwpҲe.Sõ! ٤{CgsGkaAXP߇ցOB@wޟua~ԌdG5wK]H`ꔣ";5{vw`Er/T\g#/@sa΅ U݅~fouۗ}YeUs{,,J߬}㐯n#*B}OƘMv>SqH!nlHom*K:撬`#u32KtA_FmGp-[v;:Jgs[_#rTIx%G(l V{_FHg..X^{UP wp]Ig)\kAqs#bJ4y!n\t i% ('˟I/޹DPS盙 y^YDIaW3]1 4A/ S>%Rʐ^-@7Zܷd<"w6632p^ms%N\ݰ .jS W~-[w]9ůΐ&BIp1c/RV<9Le8ݖi+/53kʑ'$`UFE@'EwLHAh 2"P+iJK˹W=nksNh8F+-kGli+1rގ342?G>s556i#d \8'CK˧ :aaR` IxrSwo/wcpΊU> jW@0_7()>u AN\AYL]5M  zwҦK'qi}RC j^ mb46ar8!aVGB@`=BX !zIĸI4Ե}V==Ȇr2B%\m;}U/UNI Ͻi'F<@"ԮG* 9T'5x(--Θ5ɲ[tl/)@"CkA:[ۥdzޙ4.f>{B]D\tfxgT-J C 4gKD}w/нs f/ 2zQNQaHl=yPsJH>\ Du_xay^Kcf. l" 3(<=IdH9/v&͡pΏʐ Sa$ws-LQ_`goL( (L]_t?k POu/9}6gX|k O!-DmZ`Ԧ:~]NyZw#kM3kR~gfJX6 6c$.=!Nz:}X.t$?# ef2Bdo2WG 6f6('eo!JaE6&%mڕcgsf?W5K!'P 9YҘto-qK;B Cwh9`[1(Q9 4EYES&nRVp1eGHb rCf&™Mي kga$H\Te`;5V d9V^1)Tp/% PުC>FÊR%~`I,Ӄ+3)2Y/ HJR3J^_֊D:mbM OLaDQ8ӶbZJ%6CRl:5@K\(준aFNcV ZW\uTr%̈́n-,# 3c;Kta6ncc1|!G,BJ2o3Wh:xGIPɬ)}|.NE[5MPH"l_N'obu4XCQlٕZUe 6'ΑM(< Aq\S PrNz%ͬ|â㺰65AT}1?"X  u 3‡Bp$d i>"!/DW5.sݩLB:iV,Yymp&pyp*!Dv/ 1t]"`.2;mN"ۈ~Z#6hw,﹇r6'mAkw| S=hk#|?es&8-%nX`RLe. J9NO1^)"AԌ'1d)Ցai9&>pХw|lUDRS*}y0~n6`Gp?b(B~b.);=ៈ(92#S=aFU&h1DT6S,~B 1qyg{!'JS0sD oC$b;eQѨ/8A\xtVS+}L~n8srC) bj=T[LqB$A³3!܅ſ%p^UȺȡϦ4ƘHbvt\ZD9t_A€E\Ge:Z|Q":'q*l.IdY_):'ſNͽ  q΀Kv_eT[}^[ UlG/iq#ac`1|=ą gafv*>H[ sOi4Ei 8ՓK! @an;Z!et000"e98CDZy)e|h{OW /b'M YӤZ~1oHCpϠú:пSp5 g7 h2CXH5I"n~w8s:_fgD~ef fxf2ecI4EOT[`K59P gV:"ڝ:nU+(L,%.QHܜ-dYaS gH #爠v$EɵȦ FlAȽ-;ec0sUVULq;<2E2$y*OZrDxX:΅u47d. DgF3_F]Rb`96%qPnD+!InJb.d`Z%6()}iLgu=*%`\&C?NAQ:Vԩ9Vt=~\']_'>ulDEu6%/F0S%N4UW3T U) !&-Lɮ2K0MZ8/OVGrg4]$'y`К`%_l*$浾,ZKEڅOOm\5dr崩8 {'Z ]ͳdS+fO1C'W*٨Ji9U@Fz|_֕*tbsG/.y$X Zq%_*hw4nl˕͘ov**>bE<EF3BF=t7}p,3~[ݯkzTSz^VM T8qkb6x]ZMV!kV`;15҉ ϭfڵBT /^2oxw!CWWפvnUipL':l"WU̶D\|K ;{/ RW>҉PJL`Y?Y.T;#ܟSg/Мb@Y:Hp.h!l MsY>Et9 ݈u."kۅ.k. _4ك6uw+}>{mBۄGQbQcn6+}'8yu:ߴL{Y^U")?=].tfq救C|SwŌV0X$jDB~vb!#S)p@GIcU/D9+", i@me2;H% ^w]wUգ˞0 V^6ј5t-Ih;Ԛ(, lCa*)vkvfDuOVa\X7;khv:cNC}5Bd$ODcIa-6Dcج I,="Dj#E1Z) ؏j=6<5oA盤e? #:6$ClvJC>vW3 Ŝ&-"z?h1ITR^I~R:rNE>}<ê4PDO538 P@&bdFή*! l[YVQq[TőXIԸUۀzbW+rj-TOvuƬ zg7q?٠GIR Dq*^ߛPe%Jļ"L!z^B.ʹ Y `Z3$JxW 1-^Ru\erPi16 2oьdXsּLC$ m`Ɗ3'q~B`i&`1tGqD[*9HP;Z$&# 11i}jbk!-{054Ӡ73 ACLBXm B%@=('y c ?ekub"rN#ʪaQv~A<8:.Rwj%xuϘCR*x4.PGMCXb2)E=jFY BIx :4EiQpFC~4DYsaDKn=`ˉ lT!IG46fҙ0}o:AA/" zSBvy%]"T\Y]։]s&&&7pؗ [F*w!8\BAJcAɶDjQH$B\ DѺ싕Iy:/yaT| ؞/;$ 2^03@>O Ya*!{ms5I+ |`($x>]pJvpVf&0#z%i\>]7yVK7|"rc.v .aĉ 8 I';>7e0Jtj(bt/ljqII<~4yRsQKUjJ~d쾉jN21$cO2v_!ݝvGsGH5Hw{-QM3h=E]]}9ܼy:vm օ0k>h,¿x0KPc xٚpu(Y AGwqHM?KP /nK&.Ū&b/ݫ7ov5 }C2|tT^}@~|;z4rGKPJ &F wmYsofj1$];]mLKH@@Q9.$@U҅8^*w}wS6[\1η(t\0KB+Y@\2ʩmktl6 v3[۪l+lBmM=nhHV_)Jޠd>b @g/YWE]xV +К3̥- Ag;gJ(dy#[R}Ss̭?oXD ٺ@.i~Ǵ\o(&@pPbd٬cueg1ʪTm9~ay(%WYmo#q.͆Br7 @2G VM_GXSRkdJ g&Ͻw ^vrK &3Zރa%^ށ~ך \7q;תjyq>KYeUl"%'m'HIY8cg_U\gwI@U8=|ĐFI$eRmQzޮddR󇹙at@e) }RmIV3<Ѽ #ªji`Į* (rF[$ ')\~¶v]ߥm]1; 'ZrWۓ<rze13Lwz,F=afjޓt brzfxq&a=x\HhuзRtr܉q]B6> gO0SI'֮!Y( V9%>rFhIHePI;;: %ɾ; +(82zV>o}bfc-=⯋=~H_ Q9Ő[`QB8HOO51"ɧՑ"d=0 s!I&N:P/NmB"4PGsa%R8QUC߂ʶ eYq !DS_4%Z(DT;(hu@]㈝YX7О蜦iKAр_|B{2F|_t'ODk[M/&c%bgToj;yg->t+I>}~( Q%{FոF$}V|`%COh&-ʲ"Me_Bg%K #_Ιd!Zf# gPTx%3C1Udh`cu%hsZiG LDvzy$a:%*A&LwCUe7v\<f[[*C*0E\o“Pcy C0֒$/Eːx0Ȁw?%3p҄m-0."MUb]E,}܃a:Q p̓KZs򾳴]rkM̆M];";,9LI# F.e4 CFa .;DI]r+mh_i!~e f_7sXe +:4`2˚A̞Hǖ;l2M$Iøj!$qUKYwM6f $>BKnь]6\E8V7.!l=jD뽱.7}f-.% qO=g,kSO|'Xuh$YyrkRzp.VӮ.N;Zcյw ~Q]K2SM\@kuz@$r>4yk䐓ߍ&tӍ3SD+V{`[;UZѷWsHH@ saoC{ƥg )i_ƙc[:}5NzkM)tIa[1{vDžEp$(Kbp;.TmfHukZj/^B]GY/-ғtmQMFMI10~ ?QF6P%1=])Jo >[(zpO2\s8z궗T-l^rQnպ䭙N"yg 﩯DBue1ŔKt)[YgeR6,2|%ĬPjot.+DW.)@3N AԗEsq/C hvPw`h?䪔D*> bƾUh{]n]1$43+X~RIwh%U<.WuGa4 qM4@oPJBB{36]%)pnE\hmk>>ҫ"X +gM#&Kc<@uڦ FS]$M/G fTr;O&Y&A4Cܐcֹr%Cl#2ik 3M]5qN9wn5U+'G/dۉV!b"puFSp1k;T.s媀 A~J R1qd6ߧw,ӥ}aaWt ,B %tN#繷 "A%(\oqs5Ó7ȍC*\`v)ڿdxuΚIaƯl8 SD *urNּ h/#:kc& vi[kO^nRb 돖1nG2kd#ԗY˓9M2YbGpE(D]somjӾy0.2d!ɠNNˈ̜$G^*&r1uo*0UK-G:kU=2࿁"Q+[0t+S; ̾Rp@WεCqZ~e3Q̮+UI{&'A\B)TXNQ*8(D*m׉§K GLݭ׆n:u |M~w,oLEؼ8/T M^]p^tVM*}Im΁ sm׵ir}(+W;-X_"b8ge&Aִ2w1v"i'6#JaΤ!:9pHQVJ3uoZN{sz}(;/nƵCR\92Dɻʀٲv문ozBZPh`J ]҂bE6 E/e K0.1c Yv܎+oŲԅ*vqݙQxgS#_3oϨ,RL ?9QfB;eWU`mDzkT-i(}snT+?nDm  m]nMZDn*[ǽr'^7 nsM-{@ EAFYs8dQGkm2 <ES~ϷeU +ֆ͊Jnc]@1Zz7QS,홑{b K8VKSg~>w'xMJJaK¾Ala6SJ熌xbA+h XrtJ` JunHW![gMR}bIנwWAi/X){kVM2H{ڸ/\WbrŒ i-•L+;GOetnSPI^8d& A"/4v'ى,fB7GBuOEB27\j1;B #!Sc n **UT&[|H#qTˮH8>ں\@K3C3,1,b ϩX~cQF*r3ܪ-Tmdy YD]ӭy6PlD[U˼8mͭlN2G\UX>q&M?Fl-fM=?7m؈V6Lv[!l5M{ fqd6{~ W3 :4N;j V[M=IJ,g[䘶Ta$i]Rxlv2Urؕ\Mq)T"j_g'`ϯlT4M+XQ^`qE@BOe/Zqr3EOHq(}Z,\x4rcu7o*Exü5)yn ˀ=bCu͙JsCTbwj7kbTv 1dhXGBqASofFGچe$;KٻEPO&dF&(#f-wjWq#5VOigM%^ yj)&<%< A/Cbu# 6A,K m}R#vc8]#l`8M4:4U1fE?2'PS9HhDNEIu{^'auӥ{Љ5~֧.WьK ,gݗ+*;Ac\i!AH jiZA!{|-\Ψƨ1V ^U{-_YDfm(N-:-Bv yum̯+rIPc]IW |3ӆaQWhNQpfQvu澃jrCH,OVZ u'Y‰T gu+H=ddkF>Im88#ZWROrRu-쨗r@떼/nusB,wKVoU}M\|BnהN283ݽwϤPwEM\=W%# ZZثef4 H\&4:PaB.%^ 9<)IڻfmmBDi[q†tӅJ&>%^ uP-/"SσWeu%ίGUJ'HeP@u񦄜ml21E ` X9IS3iKzUYs r.TRquPfLjϒ  ᦗX;)qZ`B*В, oƭ D! Y9=t:V@^+4Eho=A~F  }7j|iF\ce}hQ k&1(+䡩@BӪ봟$@3&Z $Z&E1({D6 dXpsف3 3cP Aӄ}VYv@/'h%8h{P'Dha`ԟYbV!6];%"͟]V(@U.]cfM7yOxv3:-Ƣu*IϮ{/TbD묊y(4c=N`yS^u9kҗc5ҠW̾}W+ ilp^s@0Y#Ipڈ:$̂t@@Ov1!dfeUViwHk$QTJCal揅cp{';(?7l`r"愝1a{;;=0`Mylt*N1ɘ}lJo9Q|ZM밉=kSo & uAIWG{2$_2$h޸'Sc{y[oO e栴ok]UNXܮQyaAz;z{,*X~;`8lWP7*;%0K[(S| '$i LR2RDK[Y(4nhzKr6$̗3Owr2"Z8Eg> ^ߨSzI2#R\|0+sۇ2[/n($4 FZ`;.siP;dfDZF~¹x~o .mHځU|)!zvU`v0^/t&)Xxsl$0;\ een-:o żg0"(& !Z5hYcY<NW_՘2|) ՐyJvTCfo-]V9y[*_^Dxi-Q/}>Q✻-?<7Lx-eO¾-JC-𧻓ńclrMhՋ)ݬ$L?*TFO}tx="b 'ecP۝ Ae/sm"&Ȍp #6T,ݿtUe) Lռ^)%$F VaXP wdє2P41R S^x2 tXRy僚Hpy}KO9Lcd{냥(PvM)H߇>Dg,=ܗX~~1t-ra pp}+uquHf>Ax . Y *zIFEcEM[nC7M i&)Fjv],Ol=1E*1-`yl}bfN[_}6n[i3&e.wrCRTZyV-+Rr"Xj2"@rQ7'ؖ;(r#}8q54d,5ɞ,k(/W H_d5Xbʂ!h`!g4nƢjAI#b"{n˰=7KɴV3tf!̀?'r岌 1y:n;VEv@=@]L&Lxd`e! Z%r畊*cӘ`78G%ԙd3wjxU̥H*d+;h#S z1CY\BT?L{G4NFB*h4ɉWdDA4bL,wΏ\R;sԚ]m_ꨑT %\:zYGφP?Ha-FP,Y;Jhr=uK.d8{+ޡU 0bC5L @AM 魜k*uP#L]"Ò Prr!VІU~ݤsr&k)jM)_.D]xG^`9pv{,KiAq-%dg'{kAt'uM_2Pz VNNVDS>EsydjwDZD:WcI0S/S" qP$ƒS%YhU5M F_h_ĵ?s[(&#$DS8`E [0/P]RqB@p_h4 P S96쀌 j\Xi8)O*,w0w &5u"BFGUPr !&'Aps/PA4|j,pYQ=Qтa GlL곔[46*P-aS#\bvWԂ5f ELD|foyI[m[QZ4;#cʤUHh[5.J6yDŖ)=D N(HV!%##ާoRg5f.qSdS(&o1"lJx*@VT4ԨR,',Χc+ $4lD5+PboA<Ϝ1w~, Zi]YGj-i웑˵v̞?-?m}cHI{#9zRT)HVWiqPtt#1[R_/ M8}V?as? X0Y|IyRhM B$=Lo' h^P{U-=[`˴:D*{api9 -%3FЗ8 s+o2XTaփ&唌\agDbҴФ$+;)Zx8c7^U e1F.^GX,pYxNQ6kD`Яnd|ٙ}6%/_I#*}I+ BI|hSiql] rd@friva ypI9MFiN~hj*S hiW~P;Ұ%[<YXJ (wV~䧁> RPr4 MI 2<& !4?n̳ ݒh,U5{VID)UiaeeDy?n:Yɕ\MdQг*~mYΌ70o䂒 IDAjDZIv7{  cwQؙF-{'ȗc«a5lHd n֬KFGb N /0d䉃gO62;Ţ۝ќBq'gPP rG@(wQL䂂MZcDMeY)HYeT"2Shi,7s;ޱQ 7V4(= rA@S z,>2C R%SsQA (P1Q3sK{7 6H%_Q3ŗ;SRבJF%e*eޖvتиac\ &fmeVbx~aGtczGUhnxP>ѧBgj1:#1rbKn(A2/SlJhғ5Ac(ɬF1/l!RV,ՃacfQVh9ɗJE)$ʤ\n$B>Lfܩ/'RFgʗa.09d&'ǡ)FNMI c;Jim0RqsqV4P󖇉yV=у֕H%Fߋ3rc?Rė q9ZU}/`Rp¥F=l`){ U KLڝ)<ݰ#@Ԁ3"qTwWQXm2ӵdd؀`w`db۶Mr1U VrP$"F Nl:gKr/K VƖY/y.S޺nbmkX  B*"x7借S*}͜ bŬ>MW4`A*̊TY4(f2EZ2{ğm %̞;^'نNӥ~lvV 軤8aH(1V壓jCj1Gd+ (S0թ}/) Zu$^2@+ HVs)0@`H4ªj&M!NtI2%b@vi5M7TH8>\Aʩj ;[j5Ry\ciiPKB_nMz/Sс9D E"6l =jU>m9ra} JjTtsB}.AM11jVzV܂?k W*yCE|Ve2uoWgQ$ !WgIV"~7x'9^-ٓ6c =NO?i!AIEϐE9'-Mo.:ItL[;:30N$]:=]1LlQKS`y]/킝0 [eD?-f<V2Ș/RNy9} ?I$!ѳcJUhG$lo(3[-12u+FXzCoqr +:dXUݡz[,K2 bsCq*ʀdA}wS0'gB\DgBIUG`ag-+.WV,V-ZbTٴG;MzF7~i>&^/c4yO_^jur}\!Ty<ؠY=>S#z6,BfY"CCEacQeu|TP1wȪiR)Ɯ[CCV:U.ZnH~cǝ$̖*3nײ[W [yKB^Ei71U|>K(~M k ,>z\w sU;$붞gvL| Q?÷ȣn&wHqɩ<=wF|XuD ֮Uة6qѳ3o+O`S~+Lqy{yҷ5ktJ8xz]T?N=={Y7-<qgn/>$+Rmz=7Ҽ-#>~g'5lǏ.E|f "#ɲsl??ȏ2+ +x-/?}|Y\Mo+轕_ =ޡo$̣3"렾oGß~+v>Y̓̚~6xN4m:2;mÒſ=ޫ=,^Z?ZGD2®ws!I3rfȖ_~v8?Lc>6O?c !H󛥈qXe7϶zXkqj̱i잷 {L5 M!?88Hإp?{\٘mYqXA1ZlIi|{Ԛ|& ey}Gϯcq?=磿QV 8q+ }Gi}>n0T$9yE{g3'ޣ¾s\ΟHo| N2U6߿ŏHo`\H ߟi;:qj!6/5im|z09IwA}Y|t?*RG ǞEuxOuuG`oI8_$6gugh/%|7x_WT߽Az  peiƝRw!ypV՘Hn0n܏*6 ܗפ|?B?Jw ٷ*T or\OWp{\ᯚ;'3̇ſU>;_]'ʡ &u^W״*śV'8h=++Ŀ+@k< }YQg$} !i Kd3=l&c6Kt6ǟ-ꆫ,?Z'ދGO"W(>_; ?^6u.05Gi{QުG|Dc?D-?vLkm4] iUouz$o:,'WWv5<'ZEzfXu>.q <[Xr\i953}-9\[i&燝o*X<*mLmm{-Ώ{N/Ko,^an{``pVaHg(a$ ->,B;7G%؟Mм{䇢]<đwޕ:_hUUyhjm)uY}L\3?|ҖT|bχo %𿨛/=Ty>/zTfz6k*/<ޥ/ ^|A1WT :8#izG_IudəO-|go9/?K=w՗̻nߑ!矞~㾬*CS}I9<[__/?ܣT%{fĆpKZ 8lNb;Xޱ`d*Oڌ0W|6"Mϛ&b0;}*+>J2oW޳r{'lo_lhmZѾnQ}ɇFG V'nuMpoHW)4zҖwۮu>U??o/hX۩a-G~R7I>}M;\m^)wj?(!{ljp>6V,|p/9o StdE=uwUVX%ֶЊrgͧo<R:T+]f&vlEmA1_R?<?Enj7܃tdEU/ %|h8H)~W)NyH^:q <þ kCvB}upY{Ɔxy~[n[9͛Qr鱑=*\!yl9n&޾|}U`PZŮ9Au&Kaw֖rr{qǞ㡿Vy_%5Oo4yUx|øI!ׄӣ|hG 'c>?pɗBO8ϯǟt$?^zRT]ud9u??=mOs?ifŸ$eB)/g/_N/kDp?d zU#WnޟWiH9覜ϯ@< lTϕ?"W96?o}H ~连:&+Hɓe`:bܰZ76kߌJqp5Ȍ|^ maq?!c|T|[Ǐl&F_lr8ذt'#=8#Wa?-|:ɲG'9DK; ^!vw`6[ʼ荽f9FX|ƥYܫC~y5 dyx[Mk[gU80$;0}؞|>fTő7tp c;V~ T_DK7Pͺ_L&|(vxle0dd"|M}V"٘QV<<Ҷc&+Gt(ȱ}fsةƽ?}|-31+ۈGݙNͬGAc+Wu@v\]f;1{Y3'804EO[qP>kzA^gY;#8ɖh}ܟGgzx|~MgwݿlҥE/t_7u>@g\ۇ7(߲`"g 6ƴ:7u> -mwGts~[lkxީyS+Oc1h8ǾMD|گ'OAa {<x,r+;CFIlÓ~~ᯱM_<|bCxs~5^ 3F #sz鷲뺗^SkS!zH^̇G/YӵWּ.6̯mՑ=gٴ:39wGMxrXr搯c>W]w=½>Vױ[1ѽ?{T75ͳԻi v͇U숧y5|?jM9lҁ{Xg7g{$x9co .yNyrGjk[fKpw-S>OjZtROOJ-OBh}4itR'7U>'nZ~@Y1nM߿̾s{8k+5 9RrUMOw1f;C`)ȯݰ  ϥE|>*ۺ՟:Md I8u?z_hg k&p>꣸>Q&?voH|l 0134m pG((Ofs6M;ލTkQҲrUت_4YzR%|끭̧zev[{(GZ Uj.AkX 8 `dB#ߣM~*vz_/iGUfvv·e ? k[{D9$}j@c:{[;uP`Z;;s9 9}xVB۪z鯺/T="M=kak\x~؍lrh3f47e|:7VA*Z[GS~8}>݃:?|.Oe*n}ݻ73}ի19@78Ҷ-<[ݫ޴&kWgɦj7!Y_o#]ʷ'uԽꝬ(z1٢]*' *cm>n]w}yv =GAODOv,vr_d'_:pL\ =7o_t5eMFS+@s8`GTjwi63yvo /=bͭRsx}]tk8՞|4Z-Aؚdw|/s|;W\vvk4ߓ9i6c\[n7Ǣc}[wZZȾdîbf d`f4A˸-wj/wsoƟT\\e[Rٟ4w6FɶϜIJ{ӥ\>:q2*;[i8O8[m'[qJ=z7G_5h|S|}cu}bEr^7!;4>_G~~x6f{;sv}>~qGD~eUl^N77VuM2hU4x覾 [z9h v/<lv5~mCzm݂CW`;,Z7<)~V&vG X2xΘ J}=lHIqk}>:V0|tMnлyw>ۯj 66^ lfg}*k= փ+Tk !3rE}㵲G;l nȯm? VΌ{>.{S1;OU*z x_`?NDU쥪Yw硉`xe,7!7"!V,7ODWs7;x۫3<զ]9>zJn†cpc]OZV:_}p\Ჿ`iXgn3O 2/ a/yë5Ϗ;>!q7`AqGwݛ/=4y~Di v's>d5z(;n@|Z]_V&޾?wF}#U7޶fɾDdoͰyQ};WٙZt恤"㭯Emo3=LqcJVeAm |Ο' 6!'H wW.7eϚ|Q4lٶɢ׷JzxUsxg*koW?}|֞c_?O}d3ї~)1>_,F?<.x'nb_OOl?Ovw=/ncKI&/Υ߿ۭW湟,˾-%ױ<ߖI:(T?CxtI|kceR~\⺻-\KWy(?u1T $wR~}ۡ{??}8ӳՐIJtuħuVw'>.?2ȠOos1.z{O P@2iG.7CL2n?s_꼇l:4.KnLƦαyG]։|w׹/ <2|zS~PmI eލy(}ۭx6[b4jty<!v굤OAhpsIScQv;yCtq\vOΰ)e]Vz {]I(/b8-r-3ir|rqʏ<&5$a ZRWN;u\c/֯Mtv%*69V0n1)O>{DrhV;_m9æ,0z%{}}1@9o.w $N5~U9BKk szsoB"쫹ʂ~nS}굙iمſօtZ&"#܈1XŠ66_k>`%2DApm5~~[Xꦩ.~)Gw&0Du5~]#‹E66IW&]ow4z(N%6ĊK3$uuG4}-LJκˢ^lX4:HcݫN=)<ܒQ&Wn(u4SR;Tg-\:Yi Sx^*< {?_SDi~_Xϰ[U1vqluP3nnHdFR`^k;xCTw[y~w~ PWj1]+7I'.`VbC/1ms);<24%cf1+u\'gky?*-i{<3d46w/\%@KiJW,E-;)^RWqb;Mݩ.5-ug6'6:hו?1MucwY=m.d>|j[ {rjԁduwYK*cjMG,'_SN:i1և#gY1;hI^t_a#M1C^gXl QUsLZq`c]upd|'oWc/=ۮ~BT]lb]5GoS2sÝu\ZW qꌫurd?-~x,Գw;SWO Z#JGa=/ Tq1!̺>!$TKncrᬙdQ) e湎wCid~]+׺yt8_#e ټZe ?f7boo]P$p._iEE)VP{DU* nHkNH._z$/b n!+w Ghlfu!U@/J}1v"FԳ.7MFn"m0.^5bB[r e~e(2# %K`cT/snQ]u |B ZŬ!!s}}t +xk1&o5{pw(2BYqZ]pߝ=FVlu{%cRCܬZLSU%59#wR ,ڞ7GkC6a:"h:(K\W4{mU2t}uPp'Ͳ[С _W4EJ_ VGƚarֻ kϤY3C1 w$Э6mx&'řB'O"1j3j~D`>6ӊm$gW$!n=5Mx5W$ 1ʑ{֋FI]&@Љ*]RM7xao&: 1:l-Q#o ^W'SV[uYl([  ,uǐEc祍eh~Cn˼O]ЛT]4\w@?I0xw nA:w![çmZ%ʤi]}ڻjؗX_.Ը@f.\=^gInq&RkQ kjUė q ?G[a ߾_+`$ӭ'ySԛmX0Ⱥ;&r0^Հ@8b >S 䁁*{.ޗȏ2ɝ#۩٦;"l*ͺe|@#"s$YfJ9t,!Mº?I-XvsCX)yDb?!`XjPu备w=e_̒ 2=jL\9ߙ@ W YIՙ^ [ fԇ7Tړ`\\c苚B\ }V/'Dr}7`#HRM< ~z܋A7EjHUMO1,cھ АAr~㢋2'k5&_\WHO=Ou'pF]-: _}/d )GxoR,gH,;27ؑMzڝ>޴~d5FaoN5׀-&?-_]O?-*v)6wFxEs\k୵Cgm{Lؿ9h2K+M܈f"NHfaY*j]wa(^:n>O:,%l",ဖ+( /o(.3 L#D[ZLyI$AX]3eоavdl8o?l}hi,S3E>1('PC2Wk 53x_ՙO50d '=V<tK>:6_f&^Ϣ_kDC)VTLjԼGgao iv3^($:2PE. 58@.P\ #ޒ Xᡑ#53)ΰYc)85Iֿ"wT6mR) C8 #2Kop=BKҗdka;Ԃ k)a嘔bQ9JnHxkXa*DsC}@꯻]CWcs qZfIs`XVEMb<:Ȇₐ8Dt[* 3/A /⺺CB >6:UPۂ;$R Ji!A#9"6d7q$u Zb |fP(P -Q[,v('x#źzs]P$)?ߦ~@S ԟWhK|Xp$"KXS&kRXTQ*OCŮR4aK8nh}uOub밨u!< eyO$'eoь []Wz:=۫Љr*O0x>'.^6E'kK=[Դs)ECs`pB\w\,U J- R`֙hAfJ!e3:+rBkg6~fu5/h)v hK3[E ݂} +0,ѫs6 8wfRC"WTcV|NswM Hٗv5Yj|]9ΪdӼvQ2)]4Y#CkL8*ש>' f .PXoDE)(H 91!~BCI+ղ,$ 雐]=FKs ql}^Glʹ,o[ u h,.zOx!6)5l ϦP0(hNdNtJ!0>3`pa)f$ Xٌ!P ʖd;X2E|$  biCdСra[M>67S?EMjaiF!|Fj զeL]c=}2Q|zS6@Pz8AN0)hR@cqHnGxc8928e&;IKhnUה&k{Ģ'e=Fnnce>fpYT5ߤ1Sv9wR Y6sMʏ:6N]+A<\U.+LD5˨9bdqQ r?lL*FFDLx]`<3 X !;\S&B][H((AG|Z@j.rа~eϦKƠXUANG&:Jl5кV!d[q,JM3p,96iz%&/P&@Ps@dƁ K @bbLBf'S's@m^`$蘆Р!8[(N@ wu@&>j#3aGg``ٜ,)>ހgfѓŻ#ц1h\m-6Su֡Q$}/X A:cn'qdc U3: OAԶomU\ޘˈ?-t)ߐt[ rdܱtnfm; kkbp6؋W{&QL2HȄX{?Eiλ?5K˜(Q>`U=+XЛ hG=TCy8V[H\sI~+Kiq;Zͷ,0L4rj(;mDE@B&lI ]/~*w"v@(.\+2zBO >1)W)igY ]GP{#ug\C/T.3 LGȂ\3"!*cGwud֑pegfc%qݬRVl$DuPQ{!x'H= y5"$Px`YP Fy{sFr@sΜs[7 ʧ l ytj!=Ī/4lo͝{# sّk5.Y4aD圉XwQТq<2v34R=vjїM˵ˊ{DS,+ic7iHάz^`m[4T{5-HF߈}(r#9L|]_^yS;x tDR}*(cS\o "*#>A%fF"8@b֞n07q}*3LZE6N%R'pj36!J_]բ3Mw'iZ%쳚w|Æ_! 1gkJHui8ODȂMs;bI/ut^20@,,c]b be T 2Cic* /P`Rpa7 "ȱ(xp~یS؂PMyk@C }[ȩ#Fu Io#Pő 6JZv=YU1 ڟ(B'Lmt[uXD u?I%N6k8,ZQ4&e,X %;v;ٮd <<_wH"=KJmCqC)ꓧN`g\1>#>}-6~I tcqńY@P^G%Xl]{*e/WcZ`v)L,J h<-:[ѮѝZBSJ 1c 13uul"VϋS?s,0Lєgmbӡ\I{p5WyTQL1שgjc{%5 4pE[2bE)12R{t&QQmK"RL])"*6q 鉈44I2I]Na1d^%ji4~ΐtm$NE  ˮNA&4q'q`hDpԔ13`$!'8FV47/T~h1,f&58"&WSԒHKʆkJ1s(sOL.֒\ތ\#9Ռq3!vR1V7a@\vc(2Ѻ Ӻ+g3` X6T`K䆀E % kwE;ue u(Oxw}׍5i$WW7fr]TN]z QߨgQ3׈1" R0#|h4T G]+ڻ /7ELƻIE:يCǔp)Z;1s״ D̠}Gҏu2Z5#MZT'iZn}3L!5Z% ":-H24A-6XQ],C+LBbZsu"UV|c-aZ:'YR۲*^aty ݰ3뽻.P*:kVo-jE7+' _xt$wEOB-Fu-wZK ܮZ&.@OzsiyYӋ!wǂK?$544009$^S&!Q WcbsFʞl7x4LX8oͣ>#}'juU9ݧ}7/T1 ]5.bzukjrʑсLZUZmDpArR:n+ Aj,voj#-Y)'s76&"3ʸg"B$b!4/ }ORj$p#&N!PW(jTcs29)f A"*ԁDؑ]'Ox?_&$]U=Q6_[yy{˱_jC$(nI9jֺ̾kdJ}̀mx]݋oAEH%8'h乤s_#.o:/eɞɄu(CQ8(ꕶK[8u \ !]]Bb:X D(ʛ+$~'Laz5K RD,0b%p7ܑ "62&Ia% 0>, 7Ylǵ ATv5cաf<\ w O=&kǦ@SKq |b͋B9\f 3,GwE(؄!-a@Rw㢧kr?^+GW5nӭF}Tw+GmD}1GI?nt>LQfB-v;E<q.Z5p ~ @1ABȑ'mvC Q] +N]vqy qQ^ }ܚ0iw7}SpDC=Z5mGC߻!O-\洬 p %2ao M &1 ݦBL1Zݝ9,# `wNw3`Gym/v1[R;<3,ϻLAM>nhJ,X_㦕ɫMWB-2U&VZqDފwOǑE6U`XF`7HP%y %ZLSqb\UR'nnm{D.~uB zsVځTW&(È95`tt,+Md7fL(͊H 0wbãv=M6a1a\"|ǼX6 6;3b1'YK0_@hh6HM!^0uWEq,oU|߬29sfn!+1z4r/ebw_ ZgK t’I>{ƓH3!kH\KnDsfCk郁0a(!$%z| yM)i#'WP^a>MTjH$\Z3M Jō}Ocz+Q=uS/j|fޞ>IK_.Ϋ.F\+eZuIIMR4$mCKܜHvpuSK;a f*JG@@<'. C7:j`Qh0yBƪRw) ] =uҸRg,wb2J?Y4HYg7VZʪsUo˧$2z`x<5u 5) l>p!ThLkMp/)RVVa?uNȍۮl*Bo3i6~# MŽDROBY'9k.mPħ/]DПU%!х|u]Zϳ{.{l&q`cܔ\d))P7SY0HՌXUi9[G% 1Rhv sgG>gNJ k1AHglLݩ_ls:`  \u'g:<麇8@X{'IY:ZLa1Dvyzyx1M}5gK{ 3TH֐3AYYb @;_ot^hlN,[q׵^HClѦH`WޢCv8c+P;*fS~XH+xvNcR E//d}:4QpdEސDSBܕ0n['X춃O8'9Q ܨ5b`"Bu82Qc6qD,4OQV#zbfw™|$(qAV~II3 [ambOnN=s8Y{C4$}pvy~ Z,fVq]T0p屆2ןVZ 22;Ι 䓏(  _pFf@KMu9Zf;Kqĵ$'zL;ۛ9 ZAO:+l+Q IjNC,ZÌH%b26j\@S E3(Rfuc?c$rȖ.BOp.[)tՐ;U^g['?4T-VYmǶ: XhK^r<{>uU`N*idYrBt4pU"hCD.ϷB󿐼֜ ^}k1EK3ݭ\ qcJV#2w5I"osfFRȘc֌gzs 2nߧXL`8zNɬOk1J_Zdֳ̉*$ *4D4$RU /I"L xp.!l 3(32jq}cT ߍ/PtΑ*RjDowf$zI{_6R7ͭn$Zְ/}0S ˽ўPgё~H%[!-];ے:Zg}EO ~Of0݇#SL4LIMIq:x>!_|'QEtӢ #yd;0)aˊC/bgR=H&0I&- fF q 0"Gx!ZL\bq2[^TkK2qG.Pi]]Io|yu:l9-OM4IhQKeIYP[fSx\a2Y # s(b턴00 @CG)dÛķk!&IcGۑ&D{)2X@l!j.` @79:MxM(+A#gpߒ| L'fXxOR XF C\p8ӫY|9jozR1**c !T ȃ?n~8dU6U:g G~m~0[2#IT6&z\s*+e,.$GITU T-tUG2Hesp60&$j t(FǴ9&wf$=@#(ʃ.DaEEhY0Ԓpp\I4̑'UP]`$K}m)$.!dIBuf:[+5i$FBˆ QBՌ ;(:oi&QBHԵz֧XN[FOvaMV?$1tusaQg3SO SdD u*]kJ'#VŞi_2)ɮ݃g4/uJ̙CR1xz^\Q1pj_戄u! ."7E,<&cڞy0ۻ!rӱ$:RwV}K.5f0M#f>^0#gb0g@LBzLK6֚oc6Y=>`ymGt /{RU]g/ GʳFo湭&tWdDLn 607.PD rf827Qu&'wMhV4u%yO#Wa\.ױ[ Q''B,rDni}$XE}lɝ)e Ճh)qL6c"],m;Fe$i2S5(v@ ˤPWf-PQJѭR3b^kDu 5 7;Vݏǡ2&/ji*>f"6-ėq D'}2 O*B{LZ83WB1`!B--ċfbEF.;s#9"@G۶ #)>/h|xv3t)ipѠ S :&8:Nc ܐn(cP];pm]wdဘA`f"@X/D كg]f4ZK/Σ/7RhjN$RMq.".5a^c={ ,0kkLP߯£ϏJ@56ӝ ae<x3+\QUE4HpЖRRqy( |vH\Ԉ3 .7`ae7muKC8C[S:GF Sg)?2L/ UǚT'1xޕȮu׭G9f B@(+"::91U~-߁ۏ-ShVĺ&iZm(Bc=B|)G_m95@+!G<ڵU.]܋Oz|[3KJ]D*ox5G5upa=!g޵"f^Dv *q FߚRQ`[~j:Fi*CL4YNbsʢi{HsD='GmhIEhHC@jVν Fߍ{bOu2]Ў0zE|H㠋@`z BD8r˹+2ϙyrә ~ŽrW 5cXg-HP Z~€AЉ .]^'ϯq6bEc.=^şf$׈bәMS]5hԃgYUf} w6g JT[}YC;b=ɐ_T#􀀯!+~ eԵ0[xs7u(0U:GhJ0K3As$eQR[غHFHJąԙ ̦R"dƧ׸@c0lÈPk\t S(UԖ*%ZXMhXowZ6֏E(~,Cq#'@9Yx7~;ae퉹enV z5uTKSPOܙ>]ARAꐽGCeuHp  ctteq§b+ :'UoF š(Rߕˏ+[S %hFo p]k'әꡔ)]VeNiM~#Q&Ed|N+[*◺gel&3ONmmsܐTL 40LǰLG⛛OiE5(b쎱xHcS"l]gDG@ W:H:ר:#Ǖ3?9~k6HJ<,<~Qś'* tIh;G3\HҠ'Cvb 0&06<%99P#tG̺MSCb9GԔ z6"9)QYɁa<5jM`MWehȗr'TSѢ N)WtR)a֚>{%xꌫgm3{od'xza֛S2ҙJn^;>p}Tz[͆/1+I30X%0\(>R':\ >|DpCPA/k1E4N<$H݀{ I/B@91S& 3a0{!mQۍU"ԩK.UL\Ca<)~!`ߐyѻξ`c*+k Զܢ, ּ`ٍ)D8lbXOucK#&Y58[;چh:5yMz. 27|ph]V"T!;HL@YY )@k 6E5K)`nuhjqF =hWt`iξo'wklTD.fE05mXoU3H;Oٜʂ)|hqݑ3?v7:;QvSkC :EXMF*rBHWks N5NzH qȘpnLv2k8"xi)<ɚ;oD;_fƲn58FRC#|ˆ)ucmaExO+I-G)煄p5 1j=O2ggl-3^1e,֕E̾Q(W"C:G 1sn+)`Ed ~Nx'D`aO@#V>i̝ D[G\Pأ 3#14hL Fs!7dn- ,8xwMH,,MtBh9IiA!" %# G,3FYs_/ J] DX8AM ĕcyUD(mSm.Z&b7/3[`hItz@ Xt0{]_[L wcGOzk ՞ـ6vD!D%Ϫ&N ۭee@CzWm^hy,jE W oBGNZ訋C41j^i#z9a%C>;#5! N <мwnѝЊ@D0#\IT0 a'ᇧ+&IhWcAIP, -$ FR@0j-b5uo#r  J$fʢ̬;s %j&NN, ŞBH@]ފ. `f<\ITL0 5v] =<-Q }=- t* \ՂWHxGbfyGb,i)W&悂uH5bMiͺhڥ}j\܎O2Z;l(06k=zw03"?5^ȷ'І=MowэA QK"u{"A&|Bins ̓~pr{}RnJ"c;:G5LG"aܓxE8|A~)S҅'9_s'J(ATxEGx{? ܠ8jH+nnf8͂I+I߭ 'éCOS[,qDyvHKဃ&բ*T" J̻#g$.-h7HC`;c1fɡ |{fU}AרESE_T.+peD]h]8!e(t1A.*`(R 거AZ1&3x=WwN \yb½$Ȁ]1=-֚ţG 㯛DƈLˉX|[.pIS 5M"g+͆~m4=uA 9G6vɂ!]i fui&J{w$gfX^>R֭A;,tI.qSg9)z֩/XRrMI؋@ oi|HX+9n'6"h%uQ rΓ8@B93[ (te ST{WM7/v_Lڙ8LpтhXA\ᦄt 22'G DÐuCvwrBy!1ҾE'~!zÒG&M):4X (1A<c& x]1L}p6?ԻȺkwjw)eI1 &F^bj5-Ӗ0N4mAмjZIu̓(ࣻ4і{S$XIвm8QrסgrQ"x P)y<G}E?a`"}OF_'rzg'b8u4ef(pdy!u!ՕR,h.R@׌B0ɦSu_:KrdCM𯗑jO[žU; S*`!Ł 5'oͳxe1eF[O|0^= g!dnWP)'}u CvnD!WPb.tO,kxez(&K9x@$_!$͌.n"#p݉ksX,Xq^tIf &8SDD˰1t9E^+9q~l_$ifb->FT8~iYQʊSp:`zOSͧN8Df1uVk,sM0 /h#“Mؚ+XR  }٧[`56B0<rۜiH#AJNu 讔C^sZ,Okȫۻvt_tl5 $J4<)qE)FTp;zإ_Dk 1X_[ׇ#Q蘒+ ?0ngi1<&6vj)l3Cd.Ұx#!ţI:D8Xl%]|<N-e{T (Q>;bØˈIV@rW90سuDX‚.4 U48ТGANbjeͤ|8 rv{t9b K-u-S35t";]<_gcGt%OAT1|VI!-פ>.q1o!uව!ftVVH<%Cx|PϴyL 5V뗎2 TUSvГOt.x˸n4q40Q ٞ UK#*3 d`f\=qpp h@iO%3ynSAJD1bi;bVOڙ"ذa]ǃ4j=6AR Mi1 V ⁉WlB)1 H$'mE#1K.JERWE( |/;|6oe!1 Fcx6&6c$?!+ m*wӉǶs\B_z_+2z\j>A|(cB"]I;RwCv%N=ZҸ.'EEo^X< (i= ^$AߌGrCC b 7@m֋C*c2~L9Z[m$xhCF^ Z_!ˢ}%* 8s.*t%ҬquTZKŐ0 &3Q ԅ aq!ؓ6[P$/Q.nZK?zSGR^6qpvqd⓻$mkѣn#{ ;2$^"ڢqP^MdsJIEr 8#8ȪB]¸592ԧ/]F-"J#j; 59H"G*¸ן@2DӴ4B[^"(]'Ts~`ڹ僚@Q[::L9-\:" !׀x4 2 W~e0883]éEcWUW]ΰ5dRGҸ-e`lG*l3/h J L}DA;s JbrfJ)q H6@Tр,1&qW\- gL2%b^w >Q}J3B=v#hk q:An".Q*5hg"Rd H:b.$iO %mt!Iи{w `;!1hڼ37llQx<}-p=G_x%znr6odSc4FiĺKemԃq3T>ϐߞy7e~sm^nk5V}/@>[C "HNmXFVBAT!zHm~ne,F QOƩģ%I ȹ B[V4f.q`qʳɣ#x}-(sabuot]+3͡DH/%a?)Q~^p%X!l-:$eђ%33PeEή0l"kIvtDsgï/r^d9@tZx;iՌ[#:2bE|aha~ݞ:JČNG55^sdN #!ttbR!F&Zb>3PnK7ȼ-#RNu2-@|f"6CbDHź-?`0?]$&|r Txhk?Hڈ3\nXC?,UWC+>uYEg!u ΅Db$>5z:+c{{H!ùsq}bpUOUF] Yu+rCɞzV{ qCaNj̥]XOâ偤s` )mEn61 a:$F^gYbdi)Lqc.YB5C1BEvC@S>CX(w4L /yXױL8ar}i`Yn X3YW^0:QW/Wv Sֽ;1ErU=2O50An90;MuMe ؐq% sjBe^ ̰٘iҭ;%J >Nl@h`C<=ʅgn62ҫORI3T=Ѿb4ث6%;gt)r*u"{uoHXSϣ;ҹŎBVHMA!neshF0%3sݳYh{Ϥh>蘞\ԠDTZ#vq *ZjyM$eDRdB1~/0nII2qN*2SMVyҁuc"caZyIԉtl|fgd(dѿ&Q-^k|LR]w/a訳D:OA|ka|@oFOv(4vy j vPލ (jy'74u|G*jNZi!3؆C.M`Rm~5P Sq  u?"j Uhw#m2! X꾊䲜ĤpΚoOX]5e([ .{0`IAjP-;OpC[&]c:LeBa-Qpi2FG1Q;.G&2bIpD ,a [ 8٫QNb 8ouIL]ȁ+B<YNLl6óEGD!Y{ >U$eQkD.A ;L^'g3~B8]15nHDBzh.M =em#D8l+9 kOLWvU8;*esMȖVk{g(6Sڨutq ,ē&Jv7lN7Zn^IW{*js睖 1rL/O{;C:@D@ E,SMs|МD?etd5gRR޺(w"-ut{'=Ȑ|-v{t UA/qTA f ]ӏn3M~Mou3%“P_,Mf9!q;-R5YʇnHS7!-,cDC8*O8vLcX8˴8J-$YX{ŭ6$*.=@zz9:}X;4ܙF pxMf$9Oဥh4kfʘEQk(PE|i`Iu, ?S'DZyj &1X/O3;/վߓvafY܅+uI2G zG0ݭƙ:Q)_L<6z=wȝW$Y"nq&̆X̀Z[Iu7X^|ZJ4>O*W&m9m-:jc1^t\<Z 8)v pPisO'\ ](T#: @фun9`l ss$o$O'ǿr)t^&<zPA2ꓰ! ކ`1Vd$. Y)G84x}6t7j4FwoQcKPb$9k`I"1R1zIQD$y&w#@ &E Z%-j ,Qdp,/ $Bqi2ݍ<R<*"d!~N6GRC0 ҡӠ3"CB8=20>x㢕C >Mtz]-~ٝdRrP~> kPPG׸ "cPHt+i Xpp.a dDOUx^;dTJܰLFsi &r9=( ˰)gt9 (nĘ'"* ^'k90$qC=Na.rȨ$3YD a:L8 MҰfPc_hY cuJjIyY7Q$br32 %dV9,ɀk^Rhl`zJm@ȝ$Qw:HL2ŜQa{Gq'Ik/Th\^trad#R@,4Gi\;RI~OACC&ڽf(r<{+ĽR$\{˵#u0€ iUʆ:$kk?3~qDk7(!Rv@M/:UsU2e]idtԆX&)'Bi@D&ԺkH ͼNϝ#:g(Ծ?R[;wE'Aj25p'D vEp =3;"D\~]`B|` PΧ/2nCaD2aGD-RP,)l*hs C=ZF=B-4-t$(4 ̖i3%P/놓f.MH +!"zJ @J_d9\CX bh.)x%O~`ZD !BH_(|Ay=[/~ | wtH醁sL,uiDѵ~w.Z ]oPҲ9vݮU_x!(ieLˬe5nCoZ6} DhYe% V+h n nQY} ޞ7wlpj&N ՞B 5Qo$091,)5GlZ~Z绎) _uKdvZT)lCU(4vP ؖ'Z0cJ^wsMME_:K~u2h6>嶸!@W}ԓG.|̢-N1O&1{*>p%*:HLh! BDg 5Wi51ĔR„8xx`ɏ8nޠ*AUr 3[XiLK"rٍL uL,r|^uҙRINS>AЌ_ g 4mђ+>. ` dMXS*xZ>egP}Ίa RQ(F8hL1eMtp.i6B #@)eA1}F!ʍ5N`>dRG Mߑ3RYjsH+`foO\M |Vt%(Figę8F3IyΦ1;#5Y]6M8O̜&_nΆEJ&&HPR7:1z4}Jb^xGg=3 {/ҵ9+J hUjF32~4`g6cN$#/iD3LVČDL"@&Z]y5КD,!lrbxFI0tQ9n7Sw HxS"& !9/ 22AvN$9o #H4xߩ75N&!\xGŜӞƎwsdݗA\o3]txa(렾V H/@;{- `60֫'2Ȥf f&KLs6Z]KP4cDЭj6Pj&hc{dD]"wc2"!d= kDnj87(uK{|EZth}/I m5\J*֢pMJ^\%%HQ 2BKNA+K£n"o{gR??N9jQ[W6in;ofGᷭ+V-UB-fSH[DkLfCWozKz7y{9jV^ x VS*òXP|Oʸ.PMHEWx]\(e| Z tYJ`ݷYgހUdž < ~[!г2f: t:Vq/6KT9~_EH 5y^|^t;2+7Zd 4] bI }K6 `< ˭ pLW+zj)EO`zħ q 6&2X8֫2J% { =%}۷:1yQ4#ksiq{i)zR뉉j/_enL Dʣٳ%#ôYyj~ɛo-9#緆uf5l{[ D\*Kv 9EͺH< tE#m˛#VE/oz1n9>°5^rncGG?__E)xGkDh;Z< ,觅cWn8;f.rSe-']^/w|.ٴK(8 Sկ# Fz!uZH,τX#Vdd~cP2ԧ9)̪a+YW|+ O3k@]euzm^X1^=::Nc'/Xվ9}=YV-]7@喫(c ؘHvά`lgΞ"5ļ!FX[zp g_E1sSi OﬧF Ix@$= ʄ*4*ęF,|ڙ1U3u,}se;t^CCϘMǷ F*uXλ&)%@*ewgdt[@ݱG J1@ڙ @5uhމfb+A1iQ9`➉4e`X Q݁wehp x'OT!VK'.Lc᳅i@{)8~Q걨&#ԉh7qw uZuH.܁GFe-D]l~l&_9Б~FꊽnKF i" `;[b̟_m8NSe~F|hJLNg\ALN.\4 OfT;{ޅ"ꮪ)q6;?cb]fk+7d^ eV˦/5 kcƂ- ZAC ]gn)X`J1\}k~Wom:8g>i@xR^C&P?*TBU8o-n?P3nytb$^&4&q"wn*b/sa0}>^meRF !3 绸cY,E'PaT@XKL% ݕZzPF 35!Px->rwْ:cwqx'O!Z1^J6ћGFg;juJo]xvaՋ_µ]І;ۚGQI]W"ruLCU{8H-X$ȉhCqnD0_`uyF&] v#0PAthe[7YٜDG-rH'(R6k`[FT: y&s.g#l8#%DV/vQ Sp3X]I<\-%"4ܙ+HE,{lJ̓3OiSH[j0իIdZ`Ȣ[An /[h$P9au!OQ֐=P{I[T_絲\M^j&TczqaF-"*JVM XF(נQ r$aP Aw$Ve&'>3P9^dL좹uX#a58ti*1.w*>f LsU)qԂHҎ7!Ɩlb%Cg-M̽kȀL)³טݻ\&0~EMQĠPfw4+nR"D^ V[9~ċW-Ҷj],)γ$.UtGlRz!!Do_šFq3T {* aeDxkcAЎ@)|"c?={@K.2ƿV]R_ÈqOTwZw=-p]º|u"\Ty\jJ&ؤm8,V]w]*_QB튮p߃W ϸ.jmUl۝Yٝ597zW[;'c+ D&v5Q$zWԯ"2~Qi9`Z&J U"׀!:03 eQI\_l[YwYuZ/u>'=}h5okA<֌S =D.l dc<`L}[M47n(#Gu`&I}7ړ'Uu#TZލHDϞj,J X]:q DV. @ .%Df ەUX Hk'٘/{anuI>7Ndf]TB E;?5dFfꞧBKK4AFT<^Aa ػN;QnY&ʤ7~slt[}Gӯ&\p`G/at"1"k &fNqS4\<܈M=FP(L8'\I#k9 #};}r@݅cg-h H鎽Z^_?ٖr$=aYhynN"R"\nJ{tx1_.2Eّzu(*]C{۴|tD #GE#ԍO s$R/58!΀WC.4uzs fd)HHCk؍"1u w}D\L}]%Cb!LE@< X/!cw":F#v <0Pa#I*zcIsuc}:qxS;v5Z$f10zUAUNki0*"ʥ"YNOݕuEv8 WSj2r8G^)cqAiƾem{1T|6WQ"`&SM*{/ 6AݽIh!:TPȧĞ:%rIGȰ^-1NC)OB=x"{b"bxVBqWbZ4d"Sa*wd&`j4-5#51+C䚨q}O[J%rMdQ.b'l~(>)Wa'K N1aq7H?t&yt&-(w0ÖP$]G-?" !` i-k7^;GR3tsvhuG /eJ"fכa3#%T4H Uﵦ*QsS$ž\QXwZ札%wx _$@-bnw@J4\42JGD|^PzSbg!⼚2P5_o aTRJ,W0u]6NםTWeG{ RC}eǪq_m;ж25b_lɲQUQ+`Yy;Bpٚ鑐|N+M }K" ˻>]CG=߭F">j6S}:ݴymۛ<ߜKoޏGpݮwZv6Ҕ^u@kK1.1 S/kjt#$00 ƿ/1XE ѷt[`J{tbRP} OzWR]ެPm+t[̼žabfm㌽1]c%%*jוB\W%;f}\=H-n48Y&ڜa~,|VF&KOTXCn Jk)o9.]SNC4}Pat˞V h`S}C/NMT yDm^ԙ>pCKЮ@[?k5մ=?yߐ+F;Ș"jBlW_iOQ~s6;oi0ڥ~mr}J8!fCq )_r]~~{S+FZ1xlkҕ&l7rvhPkF.wa hٟUpkk9_iEw7E!e`mFtcP/k(ڮN(|}wkOi^&YA va!-±s\pSFq;o.a=uCڊ <5mWq_8yL9UGqS M戅Rh+H$X<\":l;i s%[]3[#GImO7t{L#m.\6% -P~"g aw> &C~Ԩtӈ3hR&71 tYcU:I̹}uOt#HdvYf#rM0c {'[t@*%F,)Ys^ 8?msa?2PpIɏ/ ~(˭muJ d<"iSN^Dg]9BLIJyYdA W1hPYĩAF{žlaglIZȆuPeOjc?P.L2J̜Wͦz ͷ$EdZ!kc҄#yd0Zd맙cY]s Bjb-@6\ņWZgr%Z5w wY,tsnT#v:~`-ԫI bv`$J`ZKZ:ebʒfM.^gH]0nuliI=! mQ$0f)cM$fTwjk.5&Fn5>@cxZC̭rw3329E6i0Ě*_(ؠwjuU(DlJo"&s {fE&OA5lMfʡ3yY=H@01R;Ԧ2-*]fPq QyԫΕr_nnDu8a{ot]5fW3U"TbrңWY/2篌.v0DeHrqCk[,t.1Z#rj|zRhH9`=)6|=#Rk()?M fJH ͻTKWa=2͒xLhtH+~ZrFWj"Ts蠃rq }yWffd,t|ۺl/!osE *~rHsƥP}C"IBlO#V="$ (t8޴ FP;;8̀o5]p ǣG~< {2օ6v.HZMכâڶ+hLkM=aۣc WMZWkwJZ:k`PZEYRKD]ӚuvmZ ]6?Zi饤,i;gQwݷuJI_ q*+RG)#imgt93,@u%-"v #R]kup.y7yy'zmsCz |WhG}5 ^MYJX4wuCkֿ;,{2k ٢Mŕog?+q?o6$RnZz §dWvZ෦iwԋ:'n+kgA2n^@~N܎={ߞݞz뉩ϯC&HmoA47{GZ%ucJ]Ȏz]w<1ӟ{6[)BZ7hU!w5}vG:nK.m.q}).w?͞+̶&7t=SjpR2lgSpšk$:m6»\}(j דvk 害C׳.SĿnJ=fדDjZhWצg1%l+ [4Y~A. duѹ+E~nJ!V12N!ﮎL5sHz*J2C]5S>[9C: 'e'-Xo+Mz2eO^ ;s:Ygw1p`1~wvV ͌0e(9&v'|4;l~d]-g6&sy.Oֱmm-$B3jBned~CY $gP;CƔN O){RLjSW_=.48˟"Bݺ!_D:-~XGĉжN6aGFCU\ ̢m]dc cw}a F5=5}\h1%.v 3i_ﴝ~Ad߅(ϬE=]$!PDMjˡĤ;£HZB,g+gjV ̄V^ea#cH%&{Oa(x8,ރmicv\zt6ԑYR ,y"#ь!evm+Q_CmU!uGWöPՁJ{zJ3RPÏ䯙d läa$WcgBʌ5d:ަQ02xД=L1{"]n/М|{!fX8*Z4nmGַB8آ=FoQYp9.pdA zj-Z βPM/+X:,`k.z -<r\@#En8~-)Yb ⨟m(vvbTt"Zuc'ZSҩUKuWWRv$- GUkFonz =`ۏ;k#]\$c-R H0#4"9̊L.D e@Hu=^!cj2@6cRjh8 xv)edLX ytF}GzGj@L^qOqoBlϨb?;3ӯ^V/b?A&T@xwm8J7E!z2@+ҠW,"p&14G*:ZAgw#Z֋ ߴCaӤ+JE@ȤbE #n4FŎd@$46)i8)$">kM=>Eb>xҶQVc@M4ќApƪRVqvt&LV{e9j7Q0HnH{wCZd=,4=v6}۝FqI^MYإ<LiEU @-Rh̐?ucJxϲ_-ľN_vuk"迴Mڅ*_ܛhnJyE ?ػ?KJB& *jzŷ  S UqF `_ eW@>I-RKliy yeXt?ڮG4Qۮ`xqbp>9`4 4F'hE45VZG#?)5"%Q ϧfZ%\u#Ϝ"*QUa^Y>_w>}&/pfv.+[υI׻0_BEZ!1ΓNdׅL۲7C"ꁴ p=?F mA8ޝV_ ƐqD2~ YD7NS{b߄ч`R|)ld 3%/TïVE8DO`Gu ܥP!sPZUt]@a^%!z_0LtL=`L^ɌEfܤ.KB,s.=ҡDr'"7m{NrA;Ḧ;=[ &]#^e'(ys9h\PՑdlٙcRtI1 !j8 hM B 9sP.'x;ͼ~f"0Lg%N2Nͻa'Jy e?r򥆐u١EsZȚﮎDDŽZ\ Wvgϕ(OڱnmDtƇk8"-Ⱥx kfP%%RڊϖƄV21A-!D7ACqäZqB y|6Phps xk\.Rć#F_GCY{`ǠEf/ C])b˄ɷG144"."֥>Eph_gCOIqH" Ȱ$8َxU+(3A U87k- \\4nW&-W%H6.q{(c NJ DPȜC>1 ɱ$P^v{=62#sh;]#ye%"\ +RC7gESPwԫ Ň!I1#vO"L}ahGItY9E7W~3;0wq]M,иS ͊ʺkSER ݘ/[AgLBu~z#@a{w@7|M +*>t&Q?v Ȉ/Q•H\LGzʚR",ueGDf֊Aʼ%rJ PΕ!ŷP)0o̺3%"`ǡKԦ`Y;Bg3dIwZ_-+BR.##@PDRGBq1;=tv`<{Sַ[b"B x1z2;b\Tdc7-$p銄zOWTUc%69\%ݏDNi_Oħ0oUG E+uu_鈫[j\S؂(v>Bם!tj)нt4< MdjC˂+dz@52WH>-  #A4f@P@>g4HH ɵ9O.|{IAO=$d7V\G.sz!J/|JV_FP2 jfW^0ztq fN#sѠMHN^Pt(OlCb "GU?oƥ^Կ7OJ1TC!^ :d;Dx ƈ#9w4CEߑsHFDY2:s,!m:l &ff{U%DUm6Qύ]PW㼚sBQbѽ(MT=]c [J.){~QZ6=:tڹ%1ԛ2L!n <>䨗ڦX|QCK߯kDj}f4g(28>,Jj+n=x6.JmVo/WLz~ 'Puzȋ>ǝG' eFwu8OѢ_[&l:y# ΤjF֙;I<_vdy4~{aXm6P׊0]0X1嬻#C3`z!4 )kq@0XaF "C #Wk]72Ͱq,o*E=tlahՀg'v-0h- lqA}5a˂\jyxooz.~l6Vao,Y+%GHlM:MlW2?BJch:X'Srub#G|g .r]&me (݃ӊ_uS(.B\t| kFjmĖ e[U~N5&=|N2\uu[gQ^DpJ'FG8D8 jD@ITTԀ&BVz﬽:k~뷻naomme~;Lߵˇ.3Lr]x`:[Wu>nA:l_~rc7 se~=:/|qo<f+K|7<am7xF{`M؏pfs!-o<-dr|q̭ xgwO̙:J\fY.K׻ "; =9+'= pnl߾{^q¿ ^g;nwy*ٿ/_ۗin9>/1K,N&K,Avǐ/N*8qԁ;Cg}pZǑ)Awa[S׵lg,Ԅ{'9t`~` sw>e!>ܕ\kB%Al+ KmNp!:Xݝ W. %|d:d&t=غQr ݣxQSxV99݃+{5d,1~\V9I.s vNo.C%=e|G hy;(JlÝ=pyzn!;eȂ%ǀr}縻8 ze{{S?b<8I tR z܋Eqghxex %=ꪘy}6)>.܅xX t.Ce7"-/r[g[{ܾ Gtv3Žs{W\bmk}0[ƃhطɂ\'q,lzlmgue_4^Y]}!J.2mRY}fސ{;X0L|Ε+fQx Oȭuum@/c#^zn{\n1VGO3@{9WՋ`v9݉%%<͠ we!r"s{+˄y0߼<^;awdH/,sffd/sď L &,&R>!wv s\0xi!~9%q֘.z<̣b擮o2\;\+[{>W7*wA'3zr.[u~үսlkI;sGW>2cb8~t}A>3ls/L[#U|p 1|LI2Ĥ@'A Ù913ֶw 2%F3l_f*<.\`^[j*I~፜W9o\⁨ WӔvR;2•LpZF"w/\ 4µLօ,Edy a;zp{Z/}`ýxlkIn«>2.ϟ){gN8w2V֏Z O$ΏËx`Ev2܄>{hYDQpP#"*wǷ>A2s[⾐EL <=`8 fE'n;Aϵe"8n,w$sD2G˾m,=Eo1πCo3&;lϛߜgb`=D&^ȴƙ׷}.4|GMG4&W W.,O:<ᗩ6rnWeA9=3` ;JW3kh>Eq~.wV[h]9exS3~¯c\/ NfvEھA_厽cT]<0O}~廝q_6gFzXWeg^Ynփw'lɼwwuǟۺ8o`~[]L[ )ɷ&2-$v͠;N$9dP;u "ܽe>kwnL>5hi dRLKy![?U():?G7>0ܝ^6d֎`qhĵp?l^hLIaZrDwmEO8#u۞$pe/ ]Bw+8">v]pU}ۻ%=j3iDy:{w08I=uo*GzuK;1rh1Fvв'qal&܉s}~ūGf?v v3i\+'ؾ|˗'C;^E2bѺ{8we}5M{4u.\r'\ݟ9_w'Ì<^-N dG]ؿ{5f2kL/Gl;wg/Hm_cxw[YV}r eQDueww".}B0?Ȃl:0+;ckH`ma災~/|r'mf8K bۗv&}_*&>s2ӎy"F_h}Zu0Ã}sz= ^We9/ sl#~,}4w.ngx/> -&gK^2Ecs~ko? W3~v ך6@z/\e_?"8xHX $"zG60?leҩ|k=!g4-9>w|ng?ʽeؾ8>}{bDd?/Ki=d~҅dW[,qWd^`L1Y +YQ@MmbIJy~ e/]/K{uow;zp>zuTDzk]>ȩysW2#[-ԖlO yA=nN3Wzfѯ]އ,Izf9zp~a 2l4ErC }3A6f;[LÝ==95ځ滓k&a;S~AaHZlsWvs?7Ua9d!ݽ,jL-E~x㉅]^aWԕs[nQgkϠw' |=[,.Wrygy;,=XE]ٻ){e[b̞ߺpp\FGm]eօ+ e֕`5ؔb֤Y] }fQxRGleC9\\ŭ LUŋ\N&lkRiA2wOfl3; WI&:w2x{&}i۱{̞߾vûuP\/`jɼ#e};al3Ĵx^59˜0E2Zy~UKle&wqGm l5ul}5rw.N樧>}ڌm'Ѿf0v޻/w69wb>ʹ:+Wv/Oʓ"rb\D!"A38LO9w8~4^Rϓ='oGӯҹѹG}H׏svi{Re] 3XI>A2~6?_zc[voǎg?Qo:[ km~AeW 5g᳚??οÈ] +mfWXs)ˀ[Fxrj+H/}_$9ʇ7V^}串 D&_}uۿVC +{R0im;%juv/͓[r=aq'C6|sعiJ.ҨNwǗJ:\'2w_snqh՟I< PVĎ92%Z2ևʻM 9<{ -D;``w,r7?g30_w z;q% G8u6(q֧#vJR]2,#YPC%WU2m19 mQ Փٵ]x2RZ̦v`Zq)Ȩ1ONqX@4㋻_cGK|z#uyv8i}d$Ǘ8^=#Da8T$&F6)c8Dyb9_OO'["rٿKS=?xtr8nADm\A'vDC=7vI&Jv3ɮ/UQOұ5"ْ1'<1Lmk lN{vu1{Mh,qNsiՆy QW7j8.T*D{ !?WH;ݹ kB15b_8icJ=Ɓ}{(Gt@ KQęt)F|e14P}k4yV%*=E! U[J}}D:BH[,5'Q. 3[Ќ[;}DcpFS[9BBH<+v[{)38{E}ifݝFc|#4E$]),bf^)zÓ:B$Bd6kǤ_UDfyȌ&9ʥF*guvta(arkt Y?dM$E&ӗ<.Y#؛6̓WhD ,_qBId)nx<o2-\Wq"SJC"d:T& d+,b}c.EAIHQNJH9^_= P ~H>b{P˜Ex2qٖ82Gr Á{61pb剸0Ǟu7ϙL{=gJefYiRLHIŕܶ2(!/IzE׳C.IWI*e9M>J6*L긋e:RB0Cj0,.U%q]r}&o~sG`=u+=35:_  ; e.RO*3/ TnOQ|;W`ܜו( Љ"w %&ˁJdSOxC>;V0v4p"pgcU"M/9ESE4uej_9|dpON*Ww"q>2=bz6\4B܇“3@b-jsQYi+Bݴ&Jx^JuK&+I 3\y@M, 2?dYh\ӝ=Rg:ǾVE?#ݝ~-_㩘i+qpMoUv$~'<<Gkr9ʫDDt lyb(^Ѩ}fG&@}q8[$ȝ&gUǩr-6cNNN*MgFve]68,rjDS ,0:5W[>ѕľ-^T,Q$7px"-C4'$vxq*0QF4.R+p$zF5K#Ӳ>CO]T:w?H]̓]u"]0՚`XMDȊO0c k#͡%}@[Ŧ&]>9eȼyx9zH7q,9}UܯBC]5 Ox7cw%N&l]ߵ߇RBG3VsP"캍Dc T#ȄQ9<*{9U'Z`UK7s"Ed^z>&.mN!(,5TXt"ȀFB$qIWsEE<,_|bbHjfo|Boxjߗ2+7P/OכK4ιi?g7rp:|72E8UY29[0Qy Ow\%nJΞfJT= $r<\vƚN**XW&y7zSC;vIs)Ԇ 0LIh 2]I@`dβ47;M{lu!krHD2eL&AfIr#}3f B#xDCN$APL0su`b\=PBD^{qG.lR N tyr$0'T^Tԩ1lLqx8GE V\hHs 8 >9 ޥ.| W*9z8ʱD"w//!p. P.eph:ι:'J>¾LU!C,neŦ1J˝.``>йPDcm U'G0yG!$4f?cJuIBb=#~5о`\ίM" #"_?/aUQ5.$]KblGzeq9}?@(j;ڥdZ1q7KJ׮*Gu"Gtj) '؅vvvU5HyJ_s@P"#'є7'З]k ^rBHu9[  z߼U0n>c˅.s1թR->ɕO kR'9Z8yHgg]=]ugh|g0:x_Ɠr!GQ&_ɕ?gkηu@hZ.G-zh|n\@%bPl듬"G*B?{1O\ϰUI wqE֮KY('BpU̻`/H;*ʃ.U$ўi/s1đ47DURjPHӾFt=s|,mnw4KE婵fD+掷eJɥJ ܕs* *X HhxD WًE;Ja>2~den:DOE[:*!ndAwmdh@k=pA>7-看)JsopYdcW*NXkʌX@_ɥ\6rc?)Q'/q'2 ̫g t풨1anJ3͢z꾡*X݀TiY{ gF**jts[̺'ch*$G`r>A1/䠈Ts9L5e D ;˜3!X/6 I\q>1O|@ :fRW[j5AJsޖ4@XT]2/-!{|_Ou!a^U7d(pyHNT9/˔U"o_n?8G6MXДAy#'PQȼ׎C1Q`Nx[v&0 ȧ4W,bdWh;"s,>̉RpW^[WϘ\ Lr$|ͪsR. Z D(W~M:=_(wB7= NǶ ++K%(F,mv biq?=_tQٻycP.Xv D$L'wuAi\`+I$Wmo`-_i#rWr! PT]G im\a"LS[IpŊ#ZOB*ą/`J5VN>(Sm}>cqw2a{浒8nTZź{N:mGb]5Qa9; x=FwйF '/2.O/H]\\Q bnl(Qc=qJc̋rrBZ+s̉?W{i)Oꄒ“(dͨJ#b'P?P㜝žRH|s sRۖXt䌎,d m%zzd~2UXu|G?U_kpg cYM:Q g: j[X"׼"GTi,@߰JXOjtOkdd?[ٮ?)0/1 WCmAq,Gx%)IQd(EZ)8f=xxXR['j*=x,y+Q}o8!-4UuHA26+(@%U18Ǥ7*JcI3cK'ؼܑv|Bkֲhe-G{-D&$Uߌ'&_ט6S'J3tC߃?1=&1|2X޺b*X<\qbZUw0 >鸤 9ގKe^0G!yOd!>+pq|RRt\Bk!˪fRIαj9#Χ<dz' _mc2N]8kK )=S0)<2$?<~:cT.~ekCQ4;ɜX]Լt]ǺHWƴ`u+k= 2`wUp9 U0lZ:} tXi4RP-(MտW ,XFHǀh2tsej(FUZ4g N4:AϼDBtqp_H{7tϦdw:ger d/BhigG)3ZPݪK_y汪IYEs4tuE(b5AрEA,IEBzr;b/E88OS1mwܖ;o4RQE'Q+t]e}d8}x\J#I^Z\=i]HBż|MF)A}Ca9ò@F|[PtI0BOwT&q{@h< 0Yycm3|"eO1CJ“':I:W8oTi{;apIlT`Ol=b&$}rbe'XW8?H!40N)Ӡ3ld2EJ )7m/7Se~GXHI 7GۯOZ9{y*A!ʕvOGS૏qq6CHaQ770Di"󜕡jPxZp7q /zڗ-F*,Ơ䏠4BT2ɲvD1{bMof=j\ @Xn,?~̥F ٵG9g矘[/%͙c:nGzF7*I*:fZ1p5NEO!pOm -`6kaRb]A iދ,PyS \| '_(T\pSnNI{k`z5-&G,=rS #OO ޼"qL%Ű4+|W7#ԟ9=M;avC/5Gڑf:Ŏ. sw䃶**,|Iݔ,rA\5IQ Fx'Xjf/ٲ8e+RBba$ SH}PTsAC:udyu)|"F49JG4:M )F9* ?8]#8%B"9:]fa}@΅hz-GkpF9TYOI|ZyDj7f_O :(%3p|$!1q1؎&nyrsdesa گu i񄸴яM+Ma ȮS$Pcr c Cz9L 0`&eF`1=VQIm3ի*U I0yGа2>J!9o8(hԵ=D!w|v-e&+rO#+[Yߤ4MHKCd!g~Qm+%{4 ՒG-Yvx :uYU'2qa3w;y.CB-CKuj&%͙kJ8QGe/̠>oaOMQWANP^̕;T!<*&:~W5\]:+]S6p㶈gAnTkG.2G /͚BfbnW6ä7ͷ&N\1N|nQ(Iv,8~TN:9V7ٵ^2=qH}sqT!}IrLla*h  zFgsPuܸyZ 'XՠX7yh.BϳX4P_1q<7"kιPp 6&s)rtB9y 4 ffR|I6}rыG#Kξ'/USP ۺH߃c_h[ F9ٔ's^n8N JMI ۢ#V2FŔLy'tW \d<=V19r =S@PL+k2+ͩ[~`;\0KYrQC *O.pcj9?q)\^{V~~ih9[#Tq%\Ā>hk`M ;clY6"TMK.CE~d@hN.jP[DuMi}dJ*8NoGXnD›BS@ޯTAv^y [XJ v,>%dj='a1F؏<|p"cNA1yۏyrX2qضKڹ`.Δyrc:pPE q;LzVkvƮ)`Myf;J,ܣy xbz!=}°K#userg` %_{@bu p$EU'L[z-vQu0e(3HF-9SA4Rؽ OAh;zO*-]_J!-қak{2mcy,ot+7<=wFMC_Ǭ`3."ކ?Xo=Jn#y<"v<>,WAy@a=%5E.qD3Q7}F^P,)G*Sl KwSD=Y6o9~}lXRwPxBL̾~D7Q.ZNx<̛}iSM霐kW{꧑nUǺ{\NޯE&?(?shKp#Gx[vm<)-œor5y]@ҥkjI$l=u4AH ?mt3W'df!ZT 2ɿmLt:sIg윕FHmZJVyim)wrћP?J;r E$Kj/vqŞ61X_,Y;\^ T7)["g7G,K#}Fw9J_n{ lisz9GR = zQd"ncl9{'Hk-^*Vc5G1w>zԓ G \ t|_˞GQc`{<=%Qk#sL|MJ&d/fFID= lN8˥jyRܹϲX$*Y:L7< )aܑx.y"Ndذn%ƢՕ\2OR2ĪJKtI -+}6jG^Lzi[ ÓHd\ON?2aQUu]!}9@u.,_7820b $zx"'U.gobSq+3aJPe!WӂtWtOE$J_0o>g=y{5$oިx=8\T!@ >X縔=zN,̚T+RT#r7C[7$X'!ZsũG뉧]>vo\TsZʕz6ȗg J Z uu<ɴ8pk3x:?E#eT Ga4߯:q nuSR딜~Tԗ^Ѣ ApW?w4ݟ_<?/4vqBQ^?I*/W-]fᄑ$r{G74/3f:DA!^&Wj<)t;SGI9q0笓ˌE;P{#+vo~"lW<'n'Ng SXRi_}aݛpϿ8q&xdn[UHj8ovM g :y~ 70ʏ_g,hL[–IX8%#f~/d0}quܛn#D=A}`eOPZ}f & dPang|!}ZK> H,S}֝?{ #ro!pNM*?^Ҏ݆}W!yKshmCqK9-mI_v6~=G.d\nR9x=lT0*7r,֝r&҃>6Q"‘Kfq_xα{Srό#q^7uȯRL[Œqq]CS.g]8ՆuMQznG0:k)nWB\/1NC_T(n%lni;\ngH0n-l)^&"[}F OV06jՓ9QAA :B8Iܞ@L#!`iC߱0Inךp]:pGεѕ 5XWXlvNĽҎZ=?-Z#Bςk2z-.fM!)@6t]֭ܯ. H6) )ohH$5u5XΑ#osAnVgaI Ѳ HG>2_ _ %E)8ApK ,_ Bw*TX]CBn>I$%nPmܯ!WD缳`X' QW1gBQƒ43>mIΖ<+r_ۖNwx("F0%ؙ+Ď^\,S-F"V[!6) OJDB8 +<Ŀr|yKzn?I@HQw(,<}| |1*gcݹwH"][,rKVL-Ta>gOہ6G SS!%Sڇpd-6X,!dhόxM K',"G p}GُB:U"!3 :s\!%/$!<8 vPK^XI>#*(0AdGKFrPr*Y !rSg'viG PLiE`!09hpщdt*y]FHRB+E2QB5 @"G(t!/nSb/MRwMWkA of<;FZ3"jgr%;&,.΋K`!w-$QVKHqh#"gE>k lZ\[ȁ6jzJ)ᬅ4FcI˞b}ેjv!,aIJ=훓x"O*Ix:k@)Z%]5@Fx%f8wuLe,HuM[\z?!#!1٩C-Xsݞv+uS5]m jQv*dҎr/z(ȼD` l7՝Q_q0%4DM0XKP<]Zc*UMvF}HghY}^W*Њ2W+\D[ʁJ^J1TKuh@ K3G tG(l_I&nsdg bHS"dH a;P?QG:/CuCmcѮ+&VWH$E:&@]eXQ;'ZY 2ɬ)S߻g̯-Q'W2X`iq&Bip,H@nWGBlD,Vsc@ڒi.h(( D΅Qێ G,lH2#--j1VF#$EiM Z⡲:j߾|cfHfjQZ2Rm7nXeD:)('Z'ӝjIKvDH-SwkkyVӎd⩽@5N7| + G~0ەʫJEDw\!Voq1AGzĝ@ C_ .s'TiIΗ(+i~n7x"OHNH'/)(9?Qf%x\@$esKdũ֭L_j{UѶJoD$g3rc.euV5U02&B}-}T#^E]eyT*FFv̧JC?jIj&uE|PH\JM\>5&jDJ!UVd]EmW4V" !&t2GTmR ⥚uedoK왩O1PH#骡ZHc~5傑:I/]Dj"&lqQH"?d$9@۾@\]-ǙĆ.1J mH ~ݎ2!kqG! nftt11$6JqΎZ\*D$EP kh%B[!rZM.R"Q*>Mϒ-aeQW XDS2EiGi m7JRn&ve篴Z:}E͞H$횣/N: fa%X*MRJG[TfE[+Շ:h5zA5HR[6 ִbÎM]>vD4 T)KHTQ_dBHJu4G$_P1:J{R-jvxR0OBci~R*NDג`?QغR; QW;nomV$q@KdU-@HKPӠ'ebu ܮ6ࠟUi$  X.N@ȖYxR;K܂7HB -({&ʼh*kIG]i?N Xh9J"6ް]Kj#$lI݄v%vHN8Vҁ%ѺIPQ+Ζ{5HhT$@L%²[*QE֪i8sI=‡)@ũ=m[hEg_IdӚm+V lU6Ъn&Uo;nUS7~Zc%ڦi_ g1MbvzIhH) L(]-T{Hn5hTwO7<T["5ӎ2*& XX)uMJ}.X[#S6 ֨=mfZj|' IH2#0$ldc)S@8}?Ts)pt} 2d+M? +,tp{ce*_Jap=Wq&5LlבK&J]˓#hI$RϔE** 9di<}1oMؿ>:VmNԸTHޥtW@q羺f%KrkXutW9mީ&Qtv"ݾ=)u[ZvuM#bJEppG,N|L -.R>O"ҺFjNTʔڊHX8Ѻ{"k|\:ZԮ#:ؼ\O ,.\ssZ-Rm"h+V1%Q/)=Ʉ@9P/ۮ!gH-$LUe RHN$5p~-iGbU,j;J 9a$iC]޾px_-쥁}I%_ 1iHQOx-Rɔd%I|z|H%HXjpN .ťo*y0d1T͔M(;VdT,Yc%Y7vm O1"Scf8PCIZ8v0Ha:R&M%U$9{L(IAĮ`HX8.0lJB' z桒 2d]-%|ܲRT^ZHΐ: jèw|TR}e&U$.kYlG]E sLSQ7~g rC|/KR%L@ZTȤ7f7c1SC5f"xeO)4TC µ@NdKIX`"KT0к:jV5?AW;)T^ D,PI&2)Uxj=#uPG(!foԐ;yђjڌBTpt5T %hM+ C$Ƒyש(O}3!u_<Ԑɚ*~ӁM,&RWϛĎ$AdHaSM>dT+$:b), !ʖ 斀R|2ﭯ&Z"4s= :(B"Rj'Uw iRhn(kR;QCmVI H19h~/ :R dsryF}K`|:8",]_K RK;))Q%$zZE[^w1OZ% #mL*YW}u(^ TQ3n#Kv*F@])N_XY}2w DH YTEkE%)HJ&В\FRK"aZqqv@iK=uaRa ,e9PaPctW"lt!L^ haBV,dntު`|;'Kڒf*Oi0ʐB_>PljbT{׮;!@.4G/}VEt$ABo2TrB$fR Nךk݆gj#kqOW%Zb2GYZ6Q*3h_QGK{*D=u$ t"1ylM+Q%H>z_Ju_)SMCCW NH%SK9K63XoqG[l%  PkEhm]Nk\:Dk/!?I[8L%_ĺw%=,X}-RW[&OuWbɼ~iu%{!(Rd&w]q aKb_ѡ?-U|$CmTۋ[GY + E UQO͟J'Afik2" 97nu.qOka)YEm4d>?PT=jmX:FT;6p;$UI1H*FUQ7e% RoHom(Z[?k VCRT MZc <.6-vPYW!?xSX@ZXx"{cvZ/Qȟud)u+ RRϜ7&{Q@PK D>b|-ɇV3DrHB8>k|bWl%}ֻj}{] +֨+oo h(V'L#^0[+0J $DXrݾSTEMwԄ 8sPK-<MZ}QvFO@M Fj*YӁUFKGL>EP[t 6vWLrTUĨQu|% A.7HRϟ*5ڶ8R gLɂuOkK(SG+qhjP \JO1깣g=E#/rWi[m$ ܈nuhui憎8KO\X=m7XI.yDzG,9 Z):t۶B-:Dƾmr{nc[-(kT^"5YOzR :*#Q8v|LJd$H{ݞVR'{!$E^A=!`PYӤ(hi&Zl}ϒu%],OE ħxIb|*R'$ UGWUTֽ~܍SՅ.ՄjضTYK^Z|ɐ )%(AӾ;:JԌC%WFBvB.u5foRAS|^#y1#H>kR~,@% zH*KZ47ʜvOKТ{ !&%ԄN ᗞ 梞OM6BӁ{Ͻ$Yjz ]6ԁcƁ E@;-Pb$JnDj穏OWmZ3l(Z,VQ{Iϓyzh#}-`XLխ"MA$:ߒhZ'B2$X L9- 7PhcG$u}mp,j(*rǥzF.^4}GK)D| R}TXQ=ZĠZ pW??M5opr6$m(QI_X<b^KI\AiXe/8OJj]tj9%_T U"ۆP*PU(G4DK4@" 'wSs =EChZc%P2!֙-Ra HbO4~1TŒ%ȒpPE-+$ RB/z) +C#[ao5"N5(/T~:ݎ&$S!Q"7bu59␞ b`Ecu58B+QrEIDUbzAxRC1MBIĎk,1Ml!1Դ}}R-iP -gHY]|\qEtce")E,Jjs*@۳DԩXȍ]-!$gSNDqOM}WX lr]o/X0%\ojͨTDJ |*8)In AH֣Чy~*@E΢ZgG6j=E0Qwh!}-EM7UHw"UB$eӦIDlSY,P-#R5Qr;ڣXI:2t5D'@DJ:%殤w$c8R HxٓD!DO5_*y HD8DO+ DKS>W{W"SVR4#uDr1tՅԇfL%"MFK}$FB/GOYR+*~hR@Y"]ЃQd8Kt4֖&Z^ϮKdv(V_͒(1l5P'vE*tT0ߵ\ 8\"GnMIKlSDN) W?_sXK,m O%%V&&)0B U$j &Etl2$q҉;M)=1ҭ_Fb5E JG#-r&h'buv#A$TK!\01Vb ] ,>Ԛ-ө\̹ҮMT:+Z!?+5u{Wj펗)|)p"{nEV D0d-(#@ّ`2X$}!uuZdRO%ڜfR!fhU,9Or(|I ;NE6W%28UDZJJ->N$?P_IuF(@R4EuI|H;@biYRй5v]% gFGn4J<>v(<"#TR*L%PQ*"tԝ#`v7#gnڈN:p?T[&aDw-yMm 7jݾLK=;ny}&TP_.k+UqMq &nz_rސ!QHRŝ *q3q wރTEJb4%PM'{ʠ$#hm.'7rg(HJ$BX{ +Iꉛ&:\)m*@ju XAvS)BKv*⩤~a*F}89 W DRIGZ"uC-@MFJه:rѪCE8FG򏩶R*;jQd_](f 6&pL@u_K(ѤML1xX|Gۺm.%Im_`Zn  S0 <?I̒%KdlK55O|*RXok 8J1 ׂ%S}%j$7wҙ)3uvӌո|1^KL=RW'6ܕc{`+bxUbk'zXbWZ hSu=E f VDJ5MGʆt]"Jc=K4Gv((.Z}-B#{@UXUSJBWv@<՝Q/zJLOk1 - ltύI%i:qARѡ-dW_9m2Բ>֕r0&R̲[0E*!ӑ$Tig^XuݴЕ+V?X{Q"T%+ݼ3q&JoZI!_F+T{;Odjijҹ ~ V"5P}JFu%p1:DuWWH ^o!J\ OF~I_ڥHi&6)1Gl#SmOlO`tԯ(eKihO.IW&J4ў|Mn=E% Pl go *͇H-hsR8MaeUz؎2$$On_[u*Y{[ilr OD K(U+ u8Tt[Bc&2UmUc࿦c#(w (V1WMIP4VXl3%g@DQCi+ I%"D$W}>!'Epc9xG׭wnM7go@J(S\h6'-ܧ3-yvpښh@ϮcE8_291$ےCK!Ck'8rCjb/#Z_}-!aHT%R:D/hQE:;XZTnjDצa۲f"O@➲jPdMʥE EwڢD0Clת4]¡-_hm*Կ>p$%^%MIݭ $LXE %Z)x ]YjJ7ŷ6TEq_[ԇKDTY 5ű6O(IXz]Qםdj/tt5jZʨByZH(_K0 擄N#!k1ARz/kJUQq9DB(.m3X Hv`9%ᩂ7PژPq~x-}NSCe2JJ_ON2l"wCbܙ4zCZWm FB|-tk[8ŰU_Ha3:Pz$iWGwՄYKleJⓎShqZ,gM $u-Ƒ"v$G6cj/s`E:ҖbI8ApW{fmfmfmfmfmfmfmfmfmfmfmfmfmfmfmfmfmfmfmfmfmfmfmfmfmfmfmfmfmfmfmfmfmfmfmfmfmfmfmfmfmfmfmfmfmfmfmfmfmfmfmfmfmfmfmfmfmfmfmfmfmfmfmfmfmfmfmfmfmfmfmfmfmfmfmfmfmf h]K8XG?qTc8֦_<ӟk03TUצW'Q#_ͮuU**|^\w|wQ>7wSi6ϖ_'?Q'Q%+B|f?{ nM?FVɽywkӿ[!U Jaf^w=}I]c>suؘS\];kog9*<2*y'-7هTuC,gB{\oK\W\G}4:{l5]'T'1[E)Ol]5_'NW$kD>g CkTȞ >߫EoHw\,ձ鵶k(ϢB~LEi7 隦Ay!&y~mk=r{>:yZD4ok³LjrEkp=u|o|Jd턠pvD k Nߐkt/;,u:vL7a7kA3!=g؞~ zvޥL>sn-YP Al:ӨV 5:2ErmuЙ wˌ-S#$Y /zi*m ߭W̪N=;jҵS}ބ > ^]wϮ»Edm<Jp3" (zQJsfpl Gh) > ~=T%{ڶ~ge{ C"Y/er޵5P`QpW!ϺvxEl6urN5-@2yGJ`k*Y" tvztm5ǵ/=QAm23uz=X}Ys 2'uoN*`ɞ=.3FrL<΃6f`;rNΖE&SP#4eSuc1zAyj0{tvߊ27;`WTF*w-"뒋7Ԙ2nmKcm3 @|6K*_Mj@ sSsgصe8#ϪޯC\Y%/댯9{%$fـ xNJg^tR|4fԂstgY!dF tl˔:w໔mDSljڰCA-Q!{,d%"7rUC2w  ]:lc ~A&o ʬ!  L+ux%=՘8S[~Ll~c |&s ,McMug~lzN.Σq6;aEsiR3d^ui\BVq:+$wXKGW[*2v:c[@5U[Bl *Mο:;-^VzMq#s=_ĎXxtƪ>p.Rmه1VZ $1o3qYeن׆dT_cqޯ߀lƜHt5 G_gP{@N$6Vg&]SH>N0*c65[ x5뫀(cTuPxL!~R2ј׬զk "324|t4@4 zm4U^xu tio&mL}WXjOL D硾9T B147TxKe91=t]k2p~q12A] hÖMseP'kEq#T6k0>u-@ *+85 5X!Kwc 9}~*8ܹPsLH :w ɵȞi2˜{@  A5NY ſp*%k/q!&P!?=jpľP=VxNs"`BkC`9sɜ!*^ st-ŐL5*'U I~[ ?+0gVۀ5l1Y,38aT7pQc Yی8|jYUU&~M&^2@ 0Px4\{bVY !OO~M!S@0SXB"Y *K]<WBػ-^[Ϫ:lKL B1ex[3fga⾦8=AW9^fԉtRr buWjgԀr~jXOP8v\*N+0x +@N G޲u`|K,BZo i>"= wڄilbC,WW5gA[YfbuR21&olFu :ذnca͇D E7z:qWNb  v5%gW\-35&.82)-%:02+y8$ 6U"j="ϼ uV F.@oWM}!*2b*KA>+ IL9<;ЇE&^Pbpe&7]PT!Nm6s5uk2qِď׫ =dJ4fStKru(X1ƂB]PcLboHdU֮t^8| XXւ`GгUPb }M&aW]7i85؛|2ۀl0Wl)9=TOI 1%&C1{>I^ft]M&6V_@,~bH\q&W e0-ԯ+0|:`9))`3 {GSS^qU[6L5BL[|WwSabeȻU᝕"Դp F?U_n>D@4 6+b| ^![a64zԦ`TOقs! 齵GVRa4w_-*0u?J% _\G!suG당gYH/ZL45 5{.2>Uk^I#]&n3z9 ,W>dm 2 ɫڌ E&/q:{b>L@e]Άj\'5Ge&dl c*գ!+B,2X2c7s 26<5#,V;n=ab0\9Bm2:&!;j1uu&6_cBMCϩ2#YfpgG9+3*SJlSRtmrVlj2+L\ mΦJADQs-VZ`+8:15x!UzaO j^kdm7%g.E\Ț` oSY_X\xV5`aĩʌω>r"AU L< ~Wy(^8W0pĈ( Em`D$U? kLM0Uȫ!ڀ8Pΰw-p5reoLuO ΁BEDcC{]J{kkL KrYi2&ũPbЁ3m?j1].S rU!XgRǖ,YnQ%8}:RgpQV bYsɼg*1uP%K*oD['ns ̺G*rPQrΗ^-5YS`ꥪ<#(8|VA3ꔙ }?j: U!nzHǨ:u]zLr UGZ Jl՝= |Ԯ|a68,QM&2y:T犣)=\$>]be y Lڊ%Voqs0t<|` ІXBbj_qPCjgn08UWv`g(~de9^ n@ԊѵR8;Yy,OMjV9"cGW0*saM)A=S;,#)-.A+{7T5{A DZ܄T}djA<>˩~Elo[2 #< ƞøV5mA:vZp-j1b=)oPg犎x]ɹ$X`b%XsSxE~׻JX_.\w؉t-#~ kgiķ|W]p dyk2q}˪lF|oYZ|wpԶMq\}8*0vb-J|WWTC6 CSb3uy7`kL4XLެu/y[ᇖz-{W[$F[e/Wdj`Ѿ[XUd_Wί5`? j)}m'֍4Pf,Bv0qjH {lZ0{7r=1)˖~Z Nd9JjB=XQRau v 8C9('  }̱E".'d02UG {8S;SWgb']:u^qk0S;{7 7Jy_JGŁ0+h~X5fB+L 7m2.B77GM9psY"9ʎXzù_WX.ۂs=B 6¾w O\7CjGL-9jW{sPd!pߘ;-Sa G-4:#.rԝRvmٞ`srXӃaz 5`.yE["X{ENk嘸.Y;r83u5xq(>Ǝ8{ͨ0KJ= Or/؃'toxjmi֐íV; u)uUG>ca}è= ߜ(NIj\)vfgo!Hkn!?[gEp/wM>kYm5ӆW߻:{=y^tߙ79r؝fq+Y#N?c7n=1Z֡~a ir?; k;Me϶yC} KdmMQ^ΐu2{<왷HnY5,kLl{d]ӄ^#t=瓡(}7O~ʀS-ܟ|o5g:}!Y8EOz:yMf4:BMG*3 67?dWɿgϐ񯓵N~A>Ng^' 5Fo&93=J7Y%kasjgtn6YӿW#{A{7ѵkfBH9G[d d`o&љ+`o$rԾZ%ײJۙor46Ys\?+佬^w1=#+6YU7܀g>}Tј*y`{?#g{iq3yh69Cf{ȹF>^lko!ufcIu\=VmDg#{49{L> U!`*c F!B$ѕ։=It'ۂ;ko ؠϝMa|ƭĎ܄uKmgl0C؂mY!Qm{ٯ-ZwIϞ4"_S; > snClf5,>= 1IzИihDݻ?k5o{<=lڗkZ%H>:Y6wUq`k$>OG'x!QpMxmSdY8n%k4yd77wԄ7=(LB[M& 99<s==Cl:FD[B,44AQ5V$ zzC4dt9fYfOR:6˩`jNΐcoɯslþ@M̯]' ߆j;-Nwt:6^| ԙQT5a ߟ ]lo3Ϊ< :!(&s> >m@lz|UQXbǣZmBn} |S}Lo,!G<3!qvڂM6 WT0X}Nu`sVɚymo}hX59o?Eg껵Q࿬3UP`*؝ cPıjPC}wI*CokU9 { ؐZd-Qv V^6d>#c0Y/4g}rk'1/On@d/uM:S=UУi_#4μIDC5?ʏfk|]o= >~KkIc50 V= :);^^ b!5X;kA':=`*#:5$~ΐ`*(9u8L> qBG 9N<u:7X 5ZƓĞU7!ĥ[L>vi7لv#!ĸmMZpn:jq\cF<_A'nAH!Ļs53UR p$ #4B>;y5^),Y 7@k 2؃ rkL4-9$ա` ϫ5R!`j)ְ7@zjҞc@mI.45c}kZSd|$y&k_xUGј)șlNv-ڄ\[t24S; Me^i hcN™`!i#VI i@b-CN90JDTcu5r`~#wAs%rN&o}B746$m쩍`ס>c8- g~} !o0~ 5.3nc 9Spt) 5{B^opsr -أ4րUxMUV>!{rX jgbjgI;11U !~j6QҞm[{k\N;}[?ϗ^8m1u;`q]& ^*P_>{E`:L J lKPcS!yS]"'4v `aX ˃jn ԸP5?p# Alq5b-*ֈm >1bFϒ ӂX@Bы!ٿx}_c< {~γ{|T^ȹ@߿PmV>ô,m}8n bk`ׯCb 1n4lkV}MXMɯ26]_-Z6Yߡ ر!Ahp3e6# *$U1SdNC4v6!B9mK؆5Z}z6VI<ָ77@!|ucv bkg kj=~5u8S[WҺ5q`r$FIc4׳ X[^#>l}BεX:Ykuطfhównf:7jϤ5MXskpnC<Yer!gmb0!ccoY6Ġ(/Bewy!&㗭1 [k^`~Uf:oQ>U}l@s 0^|!hLs' Ơ Ee]:gbZtњMF#dt*Ԝm29[OoxJz~7&!b coFhubj: &Bb_VhOYz&?j]6*Ir9N16إԦDa <]kZ% ?Ebu/ڄm2gASMb(MFYߧ\cr ۓm&஑sPkk6{kGX%gi7w@sy<{O ):ba0ݷD6|[%&i1u0K #7H `)i﫰nۀ5& ˑMnY&er#8j<T ߌ_d'4ZN7]W-f}M igϣI.NSO ilBF0߷bס1Xf0C| /蒍`l_TF؛$p;Ps }l]@ b@=ؠZ/oȇNuZfd9~  e(ξhKyB4AQ] Gy{hQd_[cj8:yM b0E xbj7(b(| @L|xH qk."(#^&!bNVrJPwn`|*o1+ `=P6ĥ"?=piqÁE]s[{\?ራ1:m߀Sw߫[nhϵM x^3z?uԙZOpun}6Ao3&Ė11}K`5R t9ܥxo5&ȝsn}Pk+B{B)q.T ~gg2ӵ]tĤn%6YӀ͛`g rF_hg5(IӌU 9 {>ƺ(/Ea ( 8 ˫Yh[AM갧 n`CЕ+>0-'^߫LΦdyo}@kV<:-wqu]4t yQ/P`|4J0{ lɤv=!uy$OYc'jWO<]w݇A/ lB 쯵 Y>:9f y*VZ0bj)LƋ(wG5g[%yTg6"͸gS8tmD?:~b()NAT#A??Em8Vb.6g XAZOS"&` .:|/mbmh*䤱gjè= v q/G F0IfT-iokΰ ?|5q{Μ!uNgxM WG'@ rm?4DZ騏,&b-`/6lPeX}]Ղl < ihqk0ϡ gQ@GX 6Aϕ2_ 9wG{ ?# =-p#{UַO 3Vs'NF45カIjCfX>|.i\,m<,|7b<5y rs> g P?`"YuK Ygb\`4'd#"A9i s֑39GհSc|v>>r >q6[b0m1}9$anOdW@|I^L~F؝ˠ 6Zsѵ!:\NZDnȫGkzQrY~ A병>Zmy)f1LL|.ZXWԭ;!hi󰶚ֈ7,;ւy&`kF0S8Cl>_%6>VVl?C#nt-_1UONbx\Ľd7`z0ߟb8C pހj-ƟH?r&eKsXw܄xHr={n@fvNA>@=e"KkZ^sK﯐<3+0ue{ϖ߯]~2~guw#1fLW~@toY7 3Z̺Z!kJ]`䚪ӹI sToFòwH~g ݯ% &|kqs g=gAYKdoL~kn[*WЍUOKdm-=MD eXM_Kkgb 쁒`̭EHWə8^|~@El%n 5O~,ebDP]D yIW3g2cWDt2y ؇=hC|/$Uer_koVR{2]S=Ȼ;)]B;wM)=[Q=׀ Ͼ{1 k^d=ɻg0ݧerVa`oy׺ qs{+ӟY=D/3A=ϫYReS^ϩY;MB%3uV'ga{KdOUO*~^+gW֢%3%h/[B%6*lTPvMzvP giYT_Q"}ʀ"YhߩmX!k#?:gL \K &Ke<=='d`tu^]K+G,M=ѳ!~n ~|!{bT595 ƵLtP[W6J{F[jamKw`Pylj} _ . N^Hc%8>-]Q&/X͈{( g ]bZf-3>>]c![#6Y د6yUx6Kgaihvl7Jd-gYK`L%r!eڥOAd c]xz|tjT1n0P\Eltp6^@fY471e7Gϧ"c.=Wc_؃/`=c^e/ޥ9 W]$W {hlQa29KhsUAE){o-BΆ"9cCd: jXf2s+BnEϚS(BLwe Ğ' L i 3=}+ @5S?6q[YwJX:[_)8KB/2_I~|(>*9$QxѲ#^3ubtȹe uleK/0q"%K>-6{ l2LG-36}i'i~h cXf~1e8ËGQ۫>S).3y(C +do_M^#k 9:*s)0:{|/R=~*}Ћ$Wc.4]gG΢v]ц k0vl"c(@= ؃%]f0OkA#X\&Vq*i$||.8% W%CsE&/3wzZ% ~ķ]G~wb,WV Vk-Ӏ\xu{7/qw@"Y ]sK ~Z WX Y ĪVÍbCBBUbgq+B2eEf _ڃ7L\ezR/TrXzxSIh %Ы,m$ZQxJ|bRgQ`-} +.g@k >3 ^5`_2`OCg `pG.OYbʀϘ ^&>CTa/ 7%Rlt:X8?5G>S`oUȾ Gkhֳ;-3:Tyߢ#XeO+@ pk|,\brEڃ? |CΏ+C[q 0&%ŬR+h |o78 [BhfVw;y? 317`PƗ+4_YY"x"XǗ!F0M=hNr D13iM(dϮFc\0Q*9婍X2ǘ[?.ֿ`?yΥ_>+58B | M-™/1'W Χ-jV_dv^.1X'*uq`Vnú2BAOV"?MUȗc\exV~[arJedѼJ%r6>U q\jّ(LjCLQ^823 B9kVw1OSa!P߻Ϝuȁ֦sz0_{\g0Ü>(~uh'U`!fk+L ϛk.O1pߘs\Xbp#ˌ݈X|"{P,|\&ʀ{锛9mʀGiz"aV @ [f~n|πA [R}gzr-i7hd dkʰdM &k-\3XQae8'BBu: >uQ6CycϞ/r 2_W]^bhA 1w; fgS\t 8; ǝq?^tiQ`jz z%(Yf0PT_ysL_&̳aM`Pg [+R֊ׂeCၱId@pe&u+LGnU(}Z 'ЍAzͮ496\o"A\؄_lK FJ*%l)o 3)Bm&ıVf+]aOQ`$ wK.V\ 2C)2cC.1IkE!^cfC ꈏV{k,h*$D'C> +:%+М SA U(2e G@2O1_ݣx"=Vyb2Z ڔ ϠE|y߿DjJ\spUQ?-0 LV,W[U`0'ظE{^ 8 ꀖX`3L~g .Y| .0""#g[x BUсy pUA'U?K&jP7p3}I4&\|)AoėfSZac3YE #F:;1%ւ!pἯ0va.1y2Eȕx( R//{hάg?j?,1(, 5hU(=xZQ3RdbZ rU fx_}rleƫ<'_lǣw>ZGpWfb-G8:`.Csu8;luK avk[8)=_!>ZWdk*L|ΝZ0_X \s7KK(~2"4OV&lb0eܥQdٚ!C}j4!Lqz5/jo n✁=+0b'Z HBbn#gL+qmrY L,- brL<A scO {S/ 3v{0KqU pQO߶Alr:,ݰH YjPN:Z0Wt`rfe`cQ{֝`JX|Sq%&QĻ`7,-C`9O] -1>`%02Ue BbE=[`[|=|b5&v6GYP9s_ 9k72jaL{M-AX 8(>JVfgYck+2Ī_bL|bľvvX ||E {~a16ĝ^eFy][@PǮƺLJpѫAW <*sf6L b [[82?-@\aŁA(GYgKACqEGC_ pW..◂lRj0R\.'pC`L#,1:؛dLK_Kq= k0.X/^`?Z2ݘgu$h/)Cs"%WAq:B!$6F-%T; 6UA{؀Xb@ د hڎUՃlʀ!ĥ0@y9*yJ.idy骠#8 Fఋ(n9߱MأAl]И{9ߗl/BDa/\dec.ڌ6EK ?ۙ`ϭ#׿1ks/3zsKo6M/n 8Z'V!OXC&}sԭ:q\L` k(9-3wŁZ F}W&(ƬV%#na+ٍN5E`\Rh7f [OZ x|b勐žG nQx#K(gWWdt =:TsxZ s0ytyQޏ:*cGQZHLuo/_%-0q.jփy"Bi,gq{0;&Z+UaW׼ +\'ŪpV\B11R|YW 5\-0y0yBd+'%ȟRM&&麩Y倯jW82<~o؛tZ ,-Ylq n@ߑ&Or1T@|vթĘhvד#>Ԍ,1y(@R׆;;kN7xm2~m`+n'{3$->]O})N=Ն=Y20IT$u7[렟+yh?J$ g/G|Iѱp!F!EH! A9*_PD0!؄ '?[<~p ۓx݇=l1dEFn:C@.3:{P5HpioXxn$eAppT&߽찇UY)ЧB7 L2#GU!fUuL0tӸJHw3cؤ4As>eQ[k%m.MbEah̨d9ʱVd]KpSjEcg%9E!}~`o.?g<72l7_.6+vQ8jذ%&S^b˸^0r:Ő Q{bt }b堤gL)N+pj6'~\h3`2/ ,A^9'^qĒzA9`ť![fu.5\`jG SFX2_ύra* (q,5k5c|X>w,2ce,g`e7W~o,??˿wKYc2tǒe|+ˣrf,c??,k,<oWֱX<Oep,5o׍cey|/<~6|,_89cı|X>n*;r8,?2=-GcyXcy|?˧"2~{\:XJcYR,߱_e,?"忍2~Kg},4~VK~*o˛2~nK?Kd~b,uT,;˿w~*x-ҷe^i,8'2^sK_7W|T{cˉ|/Oe^5/˿/?ʵ|X{ikvS̱|,/K|*ȋ2^CKLN塩ς2_o3OD~#ۧ6"!kSUW2ȿ!/zg u',I' /?|ƂGX^z%'$/>aO}S>GX^xDG@#(}$y#,t乏,! 0 ? }1yH? c>rCL> dayCH>L?? Tv? ⇩a.}He7qʶZ#{MIJeK~4ĕʓُ~i;_~WvF+?y]\F1?]ow?}CG~qynj>bca黾mtk^/kåse_30z`/79{~h/?'G{w5G{?7=fٟ׎x9{ǾEF{=ۻO-./~it;o~Uǣݧșn^߷Cϼ}ټ9U]׿﷞K }u5?}WᏍv~wǏv^ p;ο=?|)ѧGc οѯ{z=k_=Fo}myʳGW_4h}m?j}G}ܟ=:_q;:W_1?wc>F;/~\nWoѽ7l|»G34^?_uot﷼c_0wcb 7_oFѳ޲w1zo[~ikw~۫޼?z+=ů:yŃg^GϺOO^ѳ~~޿m[=_1z_u5o~Qm_cG[W_ywb+߽ܘ˷A2ں=m~ݟu3[ͣg|3/X* Fϼ.GϬ|GF #_~o3^3^s/1?:y}t}=}r{w+W|ݘ?evo_=ާ?o>+yj͏: ?~ h| ~k4?%ɗ}у'hxh^?V ~oS7{ó_;n}8x]֨?mTo_uk/upcx~g|㟎?uF_u??QKm{E<Ճ{qQo=gcԝ38o{7o{{͇׽~g ݻ+_~o<ճynO~d{~ןǍG ?OoQ_|ƫ(yEOް|(Ooe-ܿW|ksc+('}{wGɋ_%S|Q]^7ody19ٻsmՕgqiIڛF_}~E?+s)~ArKiܘ~͛?7V_s_~R1O=>E3c{-˟|tcɯ۵Psܿlޘif??55y{~<1O|㮝|G|s?=S;Sg?W{ﯿ/uҗ79<=;O=?o:W??5;?=~|Vv>܎E?Ƽ5|)/ݘvfj~gSp%_S|=WΗ='{y~v _>z ?woyn=_S;;OX|x~x> _/w`w_̗?_wKY'6]]{N8'dS7VD d(2b+a1 b $HH H6-@#0@b , YB `!c ^k^7n=Ug~Xo~{ P?Əm? >j~55=:m}Q7[_^k#|ryf=j~h=k_ǏG5ޏG͏?y5j~{<{?j{QQ Q|_|GҏZގ?ďZ=j=j}냏Z[>j >jmG-^GҏZގZO=j}//x_Q륿WcosցG+/:TQZ?jv~~ï}ks~__LK|~iGʏֿ/BsƏޏ7_M;XIڏ;j_uH˿9js>Q~eGy9OksTƯQ")xߺw~돊/=*7)w~뎊]99*x_"[Dgg?*t]93;?*tOG=*t<~?O_QyG_ǏyTx:vGQOq~S剝fGÝ!GO_<S=͎ʯ=GK>͏ʻ>OǕ(t<ף]?Vt\:u#8O_QuUNCz38=x:2:H7rTtm>xoQNwyt=)<Oʣ;;<Oz:oox:cxTt<>Ot +:V_t< q:7t<O:S3s:kwT_t<Oq~[u:x:t<OtIA<Ot<OQJOt<Oߍ?>x:K9ox:x:~G:x:?t<Ot<;_x:x:C{|t<Ot<O}~o^[|:x:sOw:x:x:o~W?<Ot<Ot<O7?}s:x:x:G~wx:x:x:oW?t<Ot:?~pS?}SN|_9Qʜ3e"&fNřϿ\q8/S+7rJt' qqa7ÝN~ ssp?9EHYݓr8oOv7vS :_of6R2Jؿeɇ?SR>,=˙{'V_,y̘2˟,F2 Rw7: eԥ$>Ofi2#orK/t%y}) ^lNrMWWS0:Ʃt\/|uZ 'K2Y^\<β6d i-x_@Jotzw#/Pn,[|pY6p-&Qt?e[20%})e~/^ዕAVaU93N^ +L2@{yqe`^[>m;AI(7Yfv?|RR'G[|%@(s2,t>MYdX_K z4`.3~WkCG w.xga-HnثngbKQ\+"rMŔS_ e7S*$*@leA:uthw2=:2?jēi[ҖY6 (g땷U_I m_{w-= u8N.m-Vݵl,)d]ԩ3+>|,q:Yj˓=dm{~%ݏ-E}^Hcm]t~ɺyDv>Vن|^9;\˖9n6U /<6GQn#MkRԯ*moHMNX jБ%*Kmep,,=vcᙬ8=v_+E?ۧrt".W[blֿV\<WYF$!$cZ.j~Y#nT +UZŪ,e1 *.3 gce JnA*c$."/Wt m),¼3D.G8+I \{@jx\ xNq~JYR/ծtv6Ed</6 4w&Z Tm_Y"KTq3PSKޫmRq<Ǎlm`-R\̴lQ/ǥɒzw(nj{-X݆`t - 1m :2'8-ES &0! =#cW\5"a oEpHA%ghRwU௴ @qL&B#’$ro1';͚V:j5ynh{| iٚ`*8ӳ:Aйnola`jYa~q1I)tZ,PqCoњP]5$88ײE1Q&bP_б`W" wkf uQ-adZߝCj *e.c)q) &CYZ'9ؕ@vLc ]7KIEgNޥ/)DG{wWP0ɖZSz>q-BҐ@}R}-uHei_j"U|\:qȮ4dshd{[RemY+m6pkQG | H&ql2X %+kjZ- Z d1׿VCUDP2r۳I̔㨿9^{*w~-|w 0M2'YʦP:,+C*!*oߚL0 =^BF7$G 0P5_P[w³'[ cAchM5H`0ABUGjFZdj WeO$F` 8ʧrD pRE[ )o/Ub ?pqlVVs B#@gv7 ^.Hs^zuLHAݼ|~>SRPHh%Ў%1!d[Hr9 M_)I½E mYOVV?ZDMTlV*9=iJkm[Of%c2~<;Ga@?X-G'`uD@k!O-țэKgF̡ܷ~i(*&'}ЦPcha5R@M%@JUq"}!eK =ꑜ؄a1K Ȋa&e*P #nPloXqg ׶xqBP'ϻzlݍZN6?nS2\{jH.S{\BDDmt)-|ډG81q8N*]̏dxPyϏ\ u5/yZC E50AA8(S2]PD3)FY9eXrUۚJn Iwӧu[W(]V50WNX FqEwA4Tkij^ pz$@N;0liUq65#ʖl*U3^&$K"%Q=VX@ZZIӎ0=w"%>FY'&R@=Y$Bl\ũ$U]-aC̦9v(E!ԂzNA|EjNjS誡k'hh>F` %V?tjBƒ벞>@Th`SKUƠm\u1s>p]cBep:30Fy^tDX I/ .dfmrH}Ӈ&9-a`~,6]H^vr`Ww˶ v>2by0x9n+SF2Vw7 LKjUusdwpHfC YW4Τ#‹tݡ|N%4#+;BJXƬ6sχ{{Z~d7j_&*)=Ms#a%);jT"T:/(Y'#"NMm&< DҔM#6iw:!|12+Y?NGv|Mɯ?u;]y_""F7aJ&<-\uU=W$w/" ͇xPV5}}MIW}@t-oX7>\8āh e I¾].%.@,}O#vݑxL J=j^R9Mf.W=*Yŧ5Tt8P aޘX&u/i,pDR%K@ |ZQnJ%+0Y1a?u;Ү`Dj|ԮXRXyN@D뼘\&ϺG̪68rD/٢2'+659Z\\y-N[^te6$/ZȜ!C̹.Q!xBc5ߝT"ﵳ&YhBqœ3A6}Qi)1W6t> *xe؂yV:6`]挙bBodnOt:Ay&lkK.\I\\KFt^il}uU.% 594P$껮I6 '@QwI$5i^ZҜ@7&9:[yY筠u64,ʖ'qYR& @z%:.|%|C9p/dm/,Q:PBM Wфp I7BU Sɒ]JAԹ)M "i#/ YYatPQIqk-ROa1cMU5ȇoWN},hoφ(&DgDP(r:&v+) ^V]3) n5(dT^4o  gԍ'ԹIS65o <2yV2?cͲ#MhIA@o{"/a~c0iϸ./ jxfK|V*j>RyOet9P'PUoka|~d`ƋBٯ6"boO:7lw5"3d͑ j^Шq+j iS%J$Zv8Bn9Z2b5DD<ʼܷW\#FD4N̛0Qk5YTӍV5zÅ蟜{W\cCߪ"4ץ-$PҢEAG*PX 2hAYF, `m;e"WJܞc)L0X3`| X@&kg=~F^+RyUI\QSRhC(ezKU SFbsZm0`{?8[0 Sm{tDe/D Cm1GRn,{YD4u(qB﵊Esם@GiG4+՘JC5#tejJ 3T3p+> k/iV7x5_p2b{qMAchK5iʣ.c;.O/A:Ң٥yoSEؖ ia ᾌ6Ɠɜ-ꆀ5 H_9\w? U]`F$6 IYgr qʢ8G.U0K8i?*GdWB3AX@ H 1 ,'M!l5OF`O)Et(kNA u国g;;1Atɋ`~fb|* 0OˈjM r[S.mu;Ġ9/q|$BC@P'i`;, W;}0VF%IK w-Z.vLC6EN$GbI+( J$D>Ѽ1RĽH&$?fͿlŜŠukuuW$bhGJ+$! \Wt º!R)͉զٽ&cR cNO:!ɗ@^S;,way&$vXRc2"cR A',E;=dR@HwأM 1l3=K{&?{{8"ҁu ÿxv sX?@19/G!⢳#$#KB 2f`yk5DIw)Kr5@kpЗ_" Ԇ9/ƻnNR&Lu#A}CN"05P%Qfsx]k`bw8@nXq?8QkhQ"Ӟ#=y4 Z̖F+.8CUq{D(C$U>t,lHd}d*nssxܟZ,$ݦ0]|suJD$_+W^L+zHyZʮ/?jG[+kȞs յ[6ӒZۋfw/?m:X 6j."9Qui/'aPjY;7 _Hw"ee6Ӫg5I褩O-*%//n0Yg͕1drF$ws4Gܫ:%2:#LT O!l%;`.%J(LڎuC/[V%IPǺu UDFTF"U*[[M&>6Ij~3]X,78]wE]En6MjKԻwA+ݩ`)QY~2BA (2tq-= Ś9xn?asJy̢eF̫=u)Fz%:YJ94V(arpp9W /Zl̦Ӗ ;TlhHs #g /9 pXvըЉ~'VK]dc|:BU<®aήF:Cb '0xXâY{TSbMbf4v?8qڋM,Cң9 +=vȪ@H%CEX,t3J*0 VA"FF-ʦ$36Ss*Rnq30rw<ؐ[O]aI@4fn]@bR_S!}ɛ;/r9E43oi*HbFFY1,M1k }']FvHMźuBMgs_v.7tI݆Mߤ)dEċM\@U)vd&vMj8LclѲ6h[x8U^RɌ Έ2":r'? -@bF}|AE2JMj_?Ļs ?;_s^)8AȬ viLC -"Pd髡+%$Z+q˘K9.#+XاڤyuNZà"$OMVQvY׭QC8aJQ@U?lR=TP&[:9=N+k,mWb*og\|hB#~@((qo#K eWW&ґr Jɦ9?+ ,P5gY\, h\[ Ŵ)Sf7y6'Jm*_ ݆X /6%g^-BfR\ZfQ[rӣ7>K9]F!p150Ũor y9: qJC!+QM}ys/5͏`K? [ITz)HUpݡUm.RP{bS8+lԔр&\j<'+@gR2$RTU c⅗^"~Y$i$ܥi|!=r^7MOC\ܿ[bRL01Ql 1̢nZ/2b^| Nmb^+RL8&j6%y X'B%N'vT蹹UB]^" Ӏ_#1oWe"myni] &{o{ \Y j5[TTz=yA϶{ZàP*SP.CI4*"2ÀI&kO;R.JLHգ8AmtbC(YHӸt/Ij :WyI$1ڒ#I{|go1D\kXƋI r0I!qluS4kZAt oZl# i4Z9lPFWea )t'M)VR-ʈHBN;sB L"|ŶT~[v.?:(.fLE +h^pyT#nZJ3ոVHI@FQEf&a5DlAtG8kIdOQ FD?%4Dem?]_gz=X 񁯿IB"҆}{??wTil]ymr2:2i,w֣:yQ/SyU 5k 67xRY-*pSf^ʍIAǼJ4yZS\l v_6,MMhρB(W# $jdvEyL}fV!7KpC(.b3r q+ K^JԼOgh_!E*"0n2Z Q $Ck2b7T&gŁ#W}~bVD( Do=S3oܙ8qyTP5EҮy _ +U+I(FvED 6{g7LzLj]Z5M%O;I48'[aеd1b|ٍW/ZGS^A!K+.elHTJނ=,FDɽ֌vAd$`x"R$W9$Z AͽpZ~2AXzsD@#oǍ{ʟ}_UtmE"|0HmzKUUv+jf /m+E `.Kӿ$­kN-0G.'Z'olŸȀV=WHK\^"@Gx#"-*'֥GMRڍR f[ʒ Tt妰hwG O;XisD8#6ŝP +?Mj;_;'7Ӄ饂b&ZDZxJ"#T9ᩙפ SnIQzW6"R>,Ve reFԣNӠ6]TtM4idߩiI/}YQ3=?0y>/rD-p1X,xQAϤQy֒Ub~AH)^(:f8$TО%E&+IO饷$Г^rM [ɜRh$uA8TG4jSɘ84 ȋ#у߯MZ=YM[x~m0Ǿحn-{\-]ϿdJ綐RWU2278u.Z!8ƴp6'-Wń+6J̰bS| p$ӳEه>"y!)t"/}0&疉4mX+u Gfi؊{1ʆ`)(u d+>?vL+R]=N+`S[=j$ũm#C 0DLd1p(B- aYiwtneQR `#}$}lb4"*R9 GR~3$rB eXSiRͭ*U~?`"Sp.sJɔMhVn6CCb15@hoTV]eAJr Vd5fLU>n]U2-6.x&@W?-$(c;<-H fmj4&I((z618ŘS4w*1Ѡ`[$ 8# /p%QۤHkMEP -yw_wm/Mz 'Ytv$)!͉!vj 6Y>),Jr.B`'koIvKWy|@<[k ;UʏUdY"aUCܐdIsf$L19aJfw,yIl4q$!?AF~;kYvH1P2>!j缢Ok cj,L7h3˧-YAV  9C٢BB̋|ZT!m _t./hDv (2JHl=u-%.](~qS֐TȦћ8=KEr$mY9XXڗaݫ3xy jć[϶" E gsVzկOϰ~pVOB^{^pbEpAޔ"Fq`9ljStiZc:wy?\.mVEH>y0L/l! ndf9d1N+nN^hڱV]=ڂ;s>uRe"Y/n,+hӅ?tRrrmBiuuK1qp7DŽ$!`[f#! 2OƈL.{,nW|6}.;;1Ӣr2w3DưVLD Tw1P>xZv#ԩE]Ja ƳцEnPˍ06PimO馦ؤtlGbE=N,8fQcYnF%L8Y?oE*Oj&E0lW BZ*=rz˄gY{7`?5qDh2*nAPM,Щl7BPZ=k$'vikD[OV͊SP [}=ooh kԡ e\^8TFuSj N-ZxDVk:Z_ Q,XAI.Qiy9,SBU_ו&X +r+jzPA8iYMܴQأ&-* !{cxWIaIg<["-oI峡-Ud+. l/0$PL*w6$C%NTڎL u5UpP=JvJqӅ fcdM5wg"_nfn5N)jdʹA d:oyXVPmi]c|"$_%#_xFy V#Hpݛ!Qm&*wB ɺS+ aq$DVhQչ:f܍2U zS͕K3dx鵫E[(fZYل5k 3W>Y:[Ak.;o mzlLr x螡ʎ6(I׺.qĭ m),th䐭 A) )Mq Y2լȩ*%4nAJA`lL6shŎsM yg:#߂(k @$ Q&L D}@:(EiZ?*)WrZ x.`Ry&[9 Y70~Gr$ϻX,ފaVCAc)M~Dl1J"+ Iu27BjգNQs fN#5_]D+3i@sIѸBh/Ll[RĖA`tI ZH@Ń詅;jG-!v7允[YA$Wb>#s{,tLd+R*h2vѥftl(âDvE*_QL5׽p]v;1,f`zTKt~:2(C6`A\O\[^ٜd!P s^KB h#I&1_8.Qk,}^ ~`N{@NK3fgs^R\wV, y7^dY\IF'JU r5"\ ,_Dr'1<_ Az+Kp}5l 7uH՛$";BjE]!"lm u!1)6X8ej}0ߤƒ3߅PY-ٲq2(){w|A[M)yd"N WUc\Q,ӍJJ>kVɡx1a#j\7l>B5+H@OnLPnt|Ml)cmѡZV5X~?=e%(2`:xpFIEx| `tDjQ%e@4PiJq#$Y"6Qfhb"+JmeY(ËL ATuδ?}+љ&O{e2L@m#bT3JJW(^s/T)C\ÕۛH T݀9~w^Ep\WWEB@( Y\eL]lW-9.}ipWQK3س)ƈTq0 W/,P1 aA*Ջ` HU$R(02FMzCܐʀ67[(I@Ab vtY} ,y0;+0R7c$`u2/XSfjFJ!lڙD4<&V0!-. ԹC{AŸ\h!^Uӌ0>,|˶<Yt[ZXtgIBGk^1ZIB Sמ9Kv/LɈl ;[XZdT0@g)+9|!_~N ]TS)I Wwiᦚ<,2E M[ij*ͦ3?r VCGVª 0J5;Q)4P06xѪ%:UD+D6b2P3B!6b ,e6n4ECܞd8SgBV.YU  =8ؚP#?lk` 薛uɳڤmAl(ubCZ)*<}2FB;*F 惈A.GY窎) :8D>iLh?oe׮1wfYC>@UDBznE@n)#zAcuyzM1074w:8h`/] N +sBk5F":,bJP. moA\Q0lr i*. 6k%jqHr5Z&SkԨ0B[xEG VUIv2;Kf3@݂W6&? C 1_P۞ie:(;\AQƤW =Bu[7:oA>= u$NALD)b%h[_y%@AĴAvR (Q n[Vް6څ 1xr.$kE.88(oE=>`cd2b)H,-&WFigQG U.FvLxؓY{A<3- ŃԶߡJ*ʡaA°r;g-ϕ <"[̋akTsK}h!ͥ3 kP^7МT|t\0pbɴo Gc ̅ >szjJ9뢯,[_ |ۍFu0T/>#}#$a=g[IkZOͱZR7 4:CK*;ņCk޿|zU Ғ Ck)w̸[Dž3H,/%/ |[ b3aL -^:aiBZj{nQzҺl6qrj&GWB c@$'6YI1ϳcj$]i5o-q݂;rWe)@mkBuJ@&k%bA14LRK(\J g=tTHr;'߭†"ǹ [2a9NzLt#~7,{zj^g J!FK wFuR qVlI O7G!)8glaaA2 e%NM\ʤ͌ԋJ;L\ྜꕫ ׶4%78wArg.9cƑ,jm֬}R.NCxa%ZU{zQhTq!FWv;ꐭ8Azf'A3S d 9ܤ9hzdj]Gf+ X"Wu DϪ7F0N uʬz^1Y!? N~.z!mEj>'PL6עZd`FGǕ]Fy۠ [YlnO$FLY6 ƆN0"yJ3PUzYgwQf7hRyp)?U5J>D*ޘbUUQ*xfK)j>6O Eu8Ƒ t7_2U-jfXtPB`fVH,Q.b ,xQ\np/uں:V&i:B*lXѿXQt9$83=j2yQjǔx` PK}=- &Qc6E683D"XEH&ީ[@ @)1Y6}b\ɼ^|f:N\5t%d63*MPB9.VM`?S 1&)PW&EQ;g\ϻYy 3?v+pg9̷}Il&z`ȹ{iɺH6 o?`-3v8&'`I4g!dqLh5 & I֌MYH@oJK&k1nVcߔ]_BEfn ]7PV>bV DAkJ p{a}T F(`&B]$![gWʴ$;! Eqrd'2>XUW C8ixIdD8Fdp]zb43Wb$hw `yeQ7U1)KCr{'^{EU.|mN%h[|=mJ2h51%,yδxn4_tgCs|dfSvGFH*΁~njt 2ծMm)9>+QPϣ,@'_"0RlYÊRi]'|֏hqE`p5n\z-[Z0*ȦĊPho5_/R$;0jҶ:e~%B`1Ozg"jnYdJ9@NF4F2 @oLbfN g}  :Ƨ"m9u-PJhYIJka}m+Fbª|\5|r '3hɏ5Me$մ4@EYSZ@;_'{B ZYQTag$V:gX S* Ό?!L dp#LA^b$l: rp|&W婝7|V˽J,0L1!:zay>tk6{XӠ~}#.C˂Su?([ʼBYi$tɂС%ZiTK\v~ѠDwd@3L dv+Tػ3oR2]\Xĕ4r 32*L FLvZ5s$L p1 qQIm*KB&Pxѐ@' :JnĎ<h@NYi2 Tg p7}1.}I ȣ$<R8Jvij>7U|>?2sAlʏ\wدeU7$!ԡ*k6hHҡۃ4CM`-vĚ1?#YP!GQ)x27 y!9ckxƽnIrUPV$[gU.) t uRfH1+%\jƖ$Ʉ09|(OFBG3m%Ms}n̛Ů?JaܘȶӮt CYkƊNi7IҮ8H<+0Qrʒۄ?U1&Ge_zDg0!5g Hܴ3OU7z FuYsEhhBU.+L \JHNJkz-ut |X;f(׍uw#x؈;GsilfJ@ RK%O5mu#I p֪Z9Rj0t=μ|,4eH,5H@diT2X 4kWטW:#"&r`Sy0 qn\tWZ%dޠsźWܲ)rJ9N2P23JTԌE xlŇ\#ؠ[ *ӦRTEfJw;Wb15h"UsZb^eiBaV3_QURIcNMk to!X8+ jwKE;U)2`lPF~)_lh4E( HMΛJ˂_B]M.TPd冁DvqNWX&".VaAX5Zxџ p?j~uoDn(+ j dtqLleqL~K\ݚ21((}n25Cb'F1dUI\X 7!|MǧOiV=lq8wFD#uIxRDaXU R0C_x6#}^Xf5z&% $ݎ Qk"(TcL!Q=17!" N o{)蘼(k TDYϭߕgMՆ2DVmiEWUB zAFL˚ U*2U#6ɂp暼d\e@yP>+Vy_2 ?WZ=WU 7!b/|9IK-(t *Hi2&W|C)OYԡ{7e'3`LFBb1ߠ+6)ġK,sFcM+Vxq@!KV@G&.t71T.z'#OP(x j/fnNO:%+M]>_Cԣq9ηo]vxrbm>X9G ,XZjA u0gߛf7娼 N(:EM΢ fti ..eְa:7] -=vhB+p([D`<οHs ?՚+W+c7$`%uy@TM݋qW5RX*|um"PzŬBb9Ad1ê ΏF 9Vq ­Wo;/5ЂWXF*+OfLj#,?H (\vR6}%kV'S X!=@,`hOiR"25@m*Iչ'fʕ[rDt@Bjkj!1/w@\q[sW }(cz ñegV%҂s ^T5yb@y\U\Z[ʳEVKuXIsY&c7r<H^(>2Ӏ@%Tfab=ξ,F)f?s = TYk"%6̕73[SV3nl7!I ~<Uniޑޅ|?Flid` -OT0;J{`o 3 Ey [!E #N4X|*͆We"Ft,hD`2U7J6S5խL\D2PШ*NH2PY_ýa͉̪IJ7 dg4W);k˜ee$HV+\,יDQC"d4q=l F_5Ԉ(0C1n8bxx_W܅*:X jϴ~*Kt>#Dfz^e6Ă9ԡN b?ȸf8ycMR/V0‰9t Ԙf*Y9!l̐oeԎL)R0 .3<#B;&1SkYU ؞"&;N$ZXXuV=Hz"u&H* ]NxjFpܡ,WJLp!"^$a⩌.,i+,Rm.ޔec2: үT\ADEJ E*Pd}(%3/5((?.Iqj:^ `{+ _lפ6oW6f(p yt7}7flu.l?`ϗ* 8WJP_ð-bgCij`!Jy(WH g# ,:~P/V#GU]aJ]ڠFɪ `E4E$2:߈x}tyQBV(aJC38@(ɠͮ8Ki9/V5]rVdžJq׫RRic ִ1/)c#шbƗaa6? ,B*}ђp ~r_vL@RPu!<6% .H+Ņț {Dc[-eese>w17K H$;|@R7׌@j1 U!R6=odxzP\ڣŧݒ&j I8,2qbVTҘÐ;bom*MHϩ/HOUulJfZ ]Ԥ{_yV{ÌeoQ'Z0T}0ē&MgfQ Uz[% 7p J(vA1wisrۋo)RWY4s,Q7^0ϡ\n<'sYPߛQmͳSFj)-Y{H[) \Pc.Zv2%|r5LU6/⯬{[^Pf)M$ i4AyVp =q&v$W 4. -$r3m!#PY稉u/%9&5`5̖0.:RƼBS,-hj%~奂uR2RYhE-ҊUVC6ᨡŴTjUB'!Ÿܮ>,Km-!b)1T|9^lzi*]mJer#}>" A[:C6m$X򂕶dpKYS UNQxZ2g{`'d]]'RpE!iUԮ)[v.BP֐:)(43&]$6DJ->7 Hأ$|i1Z.*fQ葼;I #j )0^.#X~psdQJA'BŖESnd4>Eyqb%r֐GC!V;PFI"-UҼ}>)F]vdX*Q꺅;jkXm khߴ*@! XRch6 و|je~BPC# ( }V|7_i* Ԏ݌lȾBGꓭpJyɣ?~P+XNR|=}cyʀevY.U4R[t?쫚֪ U AОy#Ѩ"2`{e| /a':~Q\0[=#BψꠍY*  /rI3 kS*-:eawUS%E骩<堊|[uQGɣIUPP {(5 _p[x,09?HU;&<6j)5ZZ43$%hh3#+w:㍂N &'킢VJǠbF?2uߔAP!| z56S^\7JTsJ 0AˌnJЂ=}DI!9c>gmڨWZGjLWC*[I1#`0@.0V:E1ĈbD`@X Xs>ԼVzѫ 3%\f^I?VśֶV'6ecD!&b55U'kAv*8;>uP;ĀqCUU=0gyo wVϬecG-4L%son٬\†ЭLjoYlI(#k&aA&x!b#]KP@WVI4dDu"W@g! O7 e*RFy/eӂc:͚ܸC0WQD6eA j?+?lL'De@q/<8nԙb QŪ,jrCUg 6 )ƶK9kPSL XKd#,) W^000C*1^iT5׌< )? 'Zͯ0~e 9qrफ़YU{j`Y7v3`?wSxUZV5Uwfz!w6M5QW5tf, ui *\}`SZVR#b+`[0i"NSUO(CPrښ CgmG[Rޛ;##"-N aI{VBqN'SOl=m8J0C}RiZ u\4)üe3 UV$x4h*M597W<r[ l)D|Y%f kqr1+q~}Q!>'&+=i℞Uޔ6':C 6򨲂rŒn:(b95| D&q: )%16IJ =fhZ_PzNΨ1MՁ%G nApTq5EꆥZx{-V/mRILlg`^Y8Q3-̰}=%I/λxѷBv+TVv"Ma~=r'q&ŴM" X"2^9J@[ XH/mgHO}#CV 9yl+3u(@G΍,QV bj2²Zڹiqn`N@Yy~k'd c*IUl'f4KQFozP@itʐ#Qk ֡n& %h;͉򢖎\e Y):w䵽`p+' KR>˲iIO H,Ͱ*B"N{ Ȯ_\ G sΈu眄3T)ɍbwrm %GW}Tz baV߳y'P@ u%4m!*jHɂqm#ny î![KPީHJ={Yd$jo#flE-,#eB3r$c*x ;WA2U,ijxDkx-.|#`\mFB I t2$:ZCe rvuZ9: qfQ?_확K9/'C!6#H-PHm"eB @[av¿,BHo˒'aa'RgTɰl=g:Ϥo WS .@Ô!fTFU10|3_e5{շx%g rsLV0np3!@׃N[UghPG)5 uʗlǀ6DнBLvB]֠$ #aKհcM =X%]g׈qG J gc t nː:].y3*4%U1bnAf˕Y1{9I9Cp&/³@ΡyeƎOL5v8G=_ىTC!.Zډ{`?K `G>Ğ/VU, fq_ 74 nU#;_R1,cc?"aq&"(ÆL_ux={o;'3s}—fEZh*vR1jDo&~CmpldyKΦ/ɎS}0(A!=|HKsmWOFt@~,A'[6 7Lj7/ߔipZDz"M.d`̓U? o('UeׁqIL BeJ6Zf(ɨ(UK6sT!]v5tY䃩wy])"-xTi5\i" QʔVL b> Y')z2L Fp+a:: @G(CJKfLOa8(9yЂDb ${`ˡP g7z'ⶒ2XR`:dAxPI;%![1&EE;0"٤!0sqjRlPa==%`mʻ-V (}xNXJѫ5LOPdm F}3ED J!)vVRrd}uZNQ.V.md#|6,qأ]wM RvSZwe/REtʈ_Htk\!w=+[ٕ*,R u>^RYXqèM(Ӱ[&a ̍}=bu3J?sju *)1gJƣ0]vH<p2^3B^sZKci!{+ wȫ꜉,IXLۖ;V1NO/u/ZRGB *33 ([b#bTPU! Jq$ Bɜ^ =D͡":G@E?V#GjN]:@8R1/YNk7]0N8.e[sN`f{'`($љH+]&[kAT *tj&B1ANMv[dSAf 1RУQ+ c?jlN:w[]5FH"dXHU8Ric SJufsj*͹ [dWTPCΖZ]UNN)XM |(iбrLUHd 3_mTqo>*`;TM՘K+,ԗ7n_(1km̶.k&ʁ$WG`+}u޿S\c@EK -s"ta0Q:GS'KM= S(\@`Wq rղu}w$ 6}c1 [+/ƺdR$K8l^\o7kuF`KSV5BZk {Ggm=.ku#go-""Uj>[IKR9ā hE>n ]br^<Щ2M3zE6R'ԍq5D>y BDEnf DYM@eU%hZcYחU b}8[VZWiɪ+,U,,jҗŻŜˌ^˲}=6ki#09NiWTvW` K0^nk(9I WVNW9*^u$DZ}uFEފΕ r4NvTpTW37&b d 6H'gPU\ͯ㿞.2CԖX*%ƫeD1\ӋQH,3r j5MQMF61AB>уxH6`jib N T^^hxrT2;FB.Rw`_*QS!D^B@( ʠvMPg?v ^9ƜЂ4 %BPI#@ !"NDlz r MἨHZ-Gix^8)@B3Q -$U}w29WϽu#pIIr{-nFv6rn0j8ߌ\3׫uhY%;s zG{g9Tnk6Yg멏@ajH)A}ǘPۑYaQ[gA#uZ6ELT* SER Gx^#3j+3Ei"N#TN1 A"UeǦUsf=hWFSp bf[5Y3yǨr:~} Ṫ#|,1lk sl9(Ip/wDK $ra B@R lUvއc&Jǔ&hEKRWgRO7+х^l~W&! 춱iw-i\]`0M7(cW $XƤoڄeGn408Ƽ]:My``ɵ9i) $/@Wl?F_DqWwK3% ò稽sKfULIйtuʡb 퇢t(&L (fI ?v:xl[؛1]G䊝 n4Nɐ;|3dK;Mr M]4z:e3`8,/k}%d̂t X"Z"ԓ3#İH0D*#o@ 1?9#mT7֢(v%CASJLaG6gt[TTG[J!>d< *\HE\LEI쓞=[>VW֞1vje|k+*;w R6j]:=pQJ>vym@* ʵFTDnQnpd?ӬtZү}=EmP8 2JgA.N1f1We4lՒ3Oo Ί}e-Ag*#fK JM!vI"HcpJ޳p G4Uh{]f֑nwSn+PưȀsU߭ _Ϭ+ 0`^P3Cyz`k/AuOiQ>iI3jRA][ңhB+_ݝSlՍR+[?8Hlx{P뉗ҩ7Yf)o.aYU#㞰TaaZa +L!R a-L ;7,s+{v,` ZÚ0ᒺ ɨvl;?# 8 %2+TjWǼB H=8N Y!djQie@VT2B ƐhŻU}Ҍ3Cg;+Ϣ x6J ɐ(A-`VEw=i ӊLVb5&}Lxa+14?ZÚJYBU5VXcD'GL`f˝jo. ȧP5+(GЖ!a!HAhfPE(c.' h~pRZaK5*鍪tp&p+9dЁX7 Bȥ^lleNyEO.CZ;N :>' 8bNZ$q 5I?cPdxfT}R^ 0uZyNb32? *٢դXa~Ca01㹁SHJP\hL(`` Z Qz5Zez9 LR-M̥ *dc0(/Zi8B-Z1}lXۉ :yAn%W] 0{PZ1L׈`R/IP`m\F%(u(Q cĜfUn%/ ˸0J'19/˭T-ɹ]VHW00yQJ $_rFlzս+/-]H&W{a.@EÎݱuy!3PL疤YL$ʊeAbC,èPJDEsHZXOس^ x_T'FA J*#,T |UQ 3C zK뿪ڵ:iy LEfm/:r̸٠RdD PQZ[5WنAD*(ϊCxM U>Xgbj㠤ʖƀ7c|96 9ؚҪnZl>@*Hȏf#^PHA ܌R勤( L rKRI*2?W^9 f4#Cu[P79hbU] .d.{j:fy'ϸ=$XӔ8Y `b⭥.Gn€yT: Vi&/D{ 0-U#4m|v QcEo@(ע2MQH&b!쿕%20\u%y@P\mcP1YO*NKW`QDI)Z= 6 >b2ȴyЀV p$)&xj#$'(HT*X=#NzA1.^slْR W$EȴKcm:OR_e f3_FSrǴ(<׵J3q$2.d:Wnі0<e3-hzÞ tң0f`O"4WboXUX,.\u͝r3dBZJ{4Hk{љQXC(9^1KKe"6X32b\" 0 ŒV@uqnZUE0e7}ʨ-8+b;VV!8u-A$ A (Q2@AuI0u{'5Ƞ O1D'c(@#ʙ37t|өGN򑐹ZٻEauO];.l>&4:ϫGgKS}>)U`vq \lSc B fsBmG.%Pnw2~%^ټFc5 h$, 4*/0~/T5Z:Ԣna#70r$`Asc[VrR r -I0M"hG.ʛ,E0cRHf! TK2K KZd5dP\{.sTI 1b f4rE#L\5 U5gM{O[x:Ԑ=`<;egVtLECIrf\A M)ԝ@I x.wD9tIgR -ULR5(UR.slyzZ%h~Vo@ UEI*JV~1 5r;ۚ$pY1#@ I"P:@@z]FtuqXѩ{ W֪ N{A:~uqh<XBm+$&;o_9ǘ&mix֖ɢv9mԟ)\iQJsTۍrN P-:%,3 JD¢UP pWvj dkcS' p8x}S(y/bQ)ɰ7*eWT-m5q? $ne 8 bjQ|ZfI \bٸ۹ҡ#׎'NW0((nݕ.KR\ը &ܡ*37.`NwG9Y҆ D Jɠ/Qz=èᥲԽ3dgRq,kV yc,Rx)&?;c6I^.A̔0@PÝJ1$z 6{m Tƥ' k=$R0v,.AG]FhߣM(cFsxMn WЊΒ ľG_ȢH H#1ӣ30TER,Xc3 Q?PprBl}BԞ-h͠5W.DpE>Tc@΄4 DnQ7,5IAĪ4QМUѕ!-ܓ.ȑuhuU<|`3~(z!eV$ jq%)*DY%nXK2CRCE7էxم CNʾ$}VԠ`|R!64Aʝ$S)}-dbЋ PՁ@$LďqVqKJ!lO5 ME{4fin6 Ŝ@},Ց-)x=$TJ #v0*z*; cB YU@hgkda>6I(E[\D3en1UifQY∊pYK>񝿜fVQjtϻ\ a S @t6^\ sR#J}_St;k~Q<*yֱPձ?#ᣞM_ҁ!Z.JݮnW72Txo)R=uVydtrW[S8_ոv[|+ v,l (sWTŵs8[_4@bp/zN>OyxMpaBFMD;)kgh(S53î͈A7v|4QwB!S7H$%|f-zd I7GSuTUsč>Tw:e=̞3AP ɈS}KsR Q#HLKZ]:;UO,py/Rϕ#_rl C2k "nϼӚ+x=$d}TsL«,5ФaәVMx]d.twk8S8̆Oǽ(t;>$EЛZ`M%1ErnXd"rh SA7q|<֔TgĨQȻ%8BL s~>NТ_{­6W0,̗P`r26-] WuBY%Hq`*; i,#:wJl0NR+4( &*(Yjp"+a3Hl0uR[*Τ4𫚀pٲ$3E7Wt0tҠ5QlpYZ|̄6AإEe&խaTm 8 @yY*.#VƉ@.5q3CaT1('5LiBhن&͉<&" $O+\-ɺ`Jډ ֲP9t'4hM-Yń\̡1T‡D5AB!gSʩ8>gC`R ժ1 *; |gBZ)-nh4YxMH1Ueү\ tg*{7zP.t8M2^#%w0zUfմN'L]\ Pj)s<7ԵCB=O>\p'M#@ŲQÙx  n¡?DJpf@󣉚"> jhnu)sQ.Ae1bRJ8&$ }w?_? !*[ͿxmثMwsOHF`𬤹ΨDoNwZB [R#Ysc 4]Dp?0 >}:rVfMh;m`AmNXu2=ܖګ}iNL[[ ?̇#*1hy=#]QUM&lwјc/[{u,byI AaFM̝=9/~͝MsЂj8egb!wwjz*?9V&$DhYZ1U0i}te^1I$d{;lQJB\F9wNJK )}lm;D_m9e٬ҮFl6٢L*G9U/lu9>MyVHǮך3Il@h]5} rs]mLk@ltyUXU0h(} KPuyԕ`UB+9(zek` /zibVVČehu#tZ1JRiŋHěOLJf7\]Cɨ c~ߕ(g+Y@2N`M]kh,qazV 6e"ׂϐIr7U4HD<|Ԇ 8hLݞ,rG@9Lޏ\hU}œ"N% \k9FV0GO\hUE dزV(q?Iեhu\zkK<,f؁^$7@7* 1R`sҕ~dT<^NC l MmJ;w-1DP3=npVΙ0qW`\eml +[ =HпEKW$&YpB(Լ?Ps_ d(ZIrRqkU]uAxwEj6[lG^f]9FP"+<-cߣQ1tiY }=`@̡Ƨi!!xQ8SY9g@<#mǮpDZ}L1i4 <yxRZ+Dcˑ*ȼbA2ȶqjԽmpr!e#lhesLWcZ$_g?J!%|UxM7/',NRcQ9YT)Av#8"TI ܺ5wJJq_˕ ݛ^M.+w:uh`$ ?z 3P҆a< T0{2t^y clTApsIX$la!Fo.h%ʂR(@O^w HRdFԻr G%R`y$ 'j_RJP&_*U#yЋE^3`J3,hE8.B BDdBA}/&9zKh I\"&2k5 @]I2h!FOJ dUET٧d ~bڍAI_[ v^˳R֫TӽI8vEFg%Qƣe[,zi9ZBV C!:aߕTM2&@*;M/5jfsk:G ĝ+`GajQ8hmM7x9蚓: o:(d^3A,,3!o $.;XPٴ5@S) 7#P2J 6LSi|W)% WğzaӊTd&1S)qw^p1'"^fH2תrXӠ!iǕ)IWI Og4\31Q&9P$NoF-'2ht7Rΰ]-)"慄L`!>e.߆$lR1mB퇴sH7c̘ < 9eG}Ťـ/K>Kn7)vPg1CEl*3f]-4 v)[i0R&1秵 8 x+A51 \UEwD :oE4ovفDZ`J*{0s9p=0<|dQ/6}VCG" 63Hd_UkzJ d뚌_Y8#XHTИr76Ę r^F@L{T)?wݻV"<~1;fb8;|,ޭ-|Aqޫ(E\{XlFw*r{<0-_+8n% #7aDpnk>"աJdZN ?cݹS'=4{g2>gQ.N ȵ/ՂRlLF %b' i Ua Sn7Ϭ`v{D6zX֕ش0JV߰!m1ŀ1_U':(|1j??rIYgcci9M"BD2L7AVF6u$#$eibv;+EÅAK ёj_DxmgXoFt7#'I ccjrB u¨UFJx]}Ldj;>5[s95MUVSa?ո /6zQ2XWj&3J 1**ҎN%ة{Z21縥ze3 򞖽yU 9-3L%hEvӲmRfWpp0s( ʲ෧(bj^Iv񙸮{3E\BJ|D_\/a]+M KZOV5C1g( ʰBFǛ".>^DȺ }]Ԍ'hJV0zbV!Gf i jՂsW:KMJߕZC.O ;mJ9%n5$mT!U qꝻ@."<Y+] 18į[[=[ʕ'WR'N-{7kKR,d7RJYH2UFZXf7qe\dlivHMApFltNpIld;+7*4Sƽ n$}@- SEz>ƴu,NH~D/:hoʲcW%?1 o(z]5 $ [z`W$MV(ܕx݊ 4P҂ýIo!7MiE!Wج>@ ܲ9!gv)P:cwЌJ. [&4@¢5qs\,,2|J)dh Bc^ j }Ԥ1Fcڔ&8NG&eiֈVW(EOp|Sͩ.d۬LL\#CH IӃ\1 ЌRg#yPg[ ~;1VC7FkYHl'j ,W יBzYGȿ )1*`MQ:c4gnp؍yOhdئ~㢥z d.MƝrϛֶ!%Q&YgO[ۚzpomּ$Q>%kj6m+©ލV|k]]o9B.LpMu>K7[E;XZ&I/qVI4YKa3SE4ZHV\X,Upe^g֏qzpXFH\0IpdLUU A.mogzըSL//#ǭxRTs{qU,Ǐ3h)ǽN93snIͶg֬WFGhi]"6M^s&Ψg]a%WC>j,9  q S3W4HִFbO211OAF7ƌzKsg3\E`Wq)y"aR͛{ժ-Dy0?"OU|-|]uEVڒI瀣* [Ć[{r +J{ 5i{ 7h_ 4X 1Υ3L?5s{8>4t EREE`W% '9@ȸH󎕳' Sݕ:H-1_)G0o{)^U~'?Xg2:QcnM%vkr`M$N轗aV)d]v)?ݕ >~jJz25sp}4XWJ=VEܪkd.7dUWb齋$WDTZCF7bv:5mzjTU a'r` PT+f|  hL DA]wxޮY +DV(UXEwSo׮Kx3 ]`>iSU?`Y.HE^U1KuZr;(1ppTGVF WʡF H(#7*3HƐyALN\$RgXs,7XoT;^0icԔ4G 觭ɜbOJl?ˑZ `JdPj1{.(mZf8\F Re\: i((_8_ΨtIw4K,ka(PECf[ŘC(zg̐]USHF8oQsAVނڪF MU1\CFǎ0!)&kr5t%(lD$ ;ErZBK1Lƙ3>UeYɽA%\kT<:<,4Tk"1_ TY> f0ATQT}HR㰥1QEًcs/?{DI.}s>%$2cwVs{X^J|YF;Җni(=OWl6g=w/cXE} 58.,lex;w>yMM[G絯PIˤZci1'uE3'y@ &{q#Y&rӕa-+٨XR+rYf Zَ[_yQs}`]`h;?9LOTP =x%g?w Vd$a*CԫHb2Y)l9&R"bh8jf7GYw5& ˃x:5aɻ=&+kcrPMQW tw S''5Xa, =jʭg k yCR1e3^ESeK+ݲɐ{X{qg΁nn%W hTyX"Huk8XoJ eh B{ۦ5"HŸɓ/):Ү]}AAiҒcĒIy.hѽ•@ e^sNZ&.Gua }Q*p$]t(wJJ!Bi!!Ђ d^X.62P\S:- 3]e߹H6M Uz_Aaì:bWrTF S7\ǟtRy\8 Rc+r3k+ ^axVĜ]" 5](H^I= -_M#CSt /mW!bCedqG(v(_>#6|,!Yq]"K]L("N R B-0>R8),Oc9פEzv܃^)a24Dɑon[" !2Ҳ1S]1!j.]F5&Z *W=MLC\~C HY\TH^U$UJ%Gev=l2 Bp4FGWh\}AF]AhO+TZUt~v97Jhaւpg$Z9/P%S:ᵄRqu~-ʗa2oaON&pU픳+;]Ej`/4M6\ahmG+HRq5Rqb9a.JNP47 d7+v'Mti]Rq2'(W@.F颊Јn1f-By"OO)eDo b/RY͐*!5R+h_ܴUw:(d9ByI_&N 7S*FKs.mKg'n8q8zTBz 1R` )\RJܥ Nˢ+f HVa&0 ݴʑCᄍ xvUU! 0~"*0{Nsbc 5>2k(fk۝?7ռuPC̓/^ Q<GVX/]оϦeh I &8C˫崔MȘlދ <"(˰*&" ^IzjkvI@읩 =ܠpᓃRӉb"){˺ krzcfa;dB2 N;rE3PmL6 'Toјl:߭J~7)S44ɄeHm"j۝0&2^os㹩R> 5]X,`8#zfiT< 6j=8Ԭ\s^|dL9'95s/`+8S!I&>L j(Q pN%K#D¤F $u,8oRp4Xn^CéԈJ@1G-d@XtC49ý3tc=q:r a\gB=OK*qy60g+e+Z fn:)Xm#-N͂3 #[W;>Ek~Y,$aܧzX?:Vs`6z{TJ l .mq On1A2}p@"ڥvϒ}w"aӲ>H&+nK*+ʥ/NS‚t01.6, 9jQYoAjiY磠8tLL|qKT?7?򙅦TO$eH"A4gX37dQVtw8{Y׊R&%C0uImHHSyEQ]0tބ JKտB,ҋf,@a6n"Vn1C Y_hY.K {tyQ^EkƲtb+BL+*YG\Rl4`^!;E;KSЋTiAFDcldfoo!:W iw%+jB-I˫FkE3+RY(%-(W"E)Wh䘌JQ!rUG0`7%ВNIm(qܹA K&vQWlT*/ߑxʋz46;g[/a3 h$o[BiG glkWxIO"1=Ѭd?cYyAPɔ/"J.b$9A-oుIa<8 ۣBʺW&hPb^+#Z D$PXj%KwW/A/62SU+gw$QBPJn»%hXbmBr Żje(IShDk3:ě{ *`-0_|1u1Qd(q,,J) :j0YK'trJ9(WtMip^|giݭ؞ȋ(L(Z+  TjÍޮ\55f^{VĊ쐼w#D$EX&8f0m#|妾 sd4k]YkN5 f͍pJS.&mT%RaG(qWT>*%%7"i 5eHDj*TIfRӤpT!YIy(ȸ8<eTo~]8èHu~MEK11A,|MF+iPWpN*$ "t&&+'_6'#:y.뢇kIkp3nҿ(THc%Jw=HYq4+&4iMN` E M灬2= LʋT\5疞-딝OgTpă+L$U[>jE$T[}CwDv*I NKBӟ=~#LR~)~Ǡ\vX#33“4f%Uj@;{n=4y3s#t·]2ВS(:Gl3hz%nGul!>lLtN@${L_,,>z%BIdHHw'0?<^;9#bIlTJL"-|gUz/MrNnm djڿ0q8.QScK:\޿ثȅHοSJϯdJ1dI j/R. nA6Eo)*u;!*T=]Vq3/B&G6% M3{SZ}bD҇0bc@!^\jY^̻%$K1IU%92?Yf3hE@/vR^"siINwjvnz6v7NkuHp+AǨ`}|>py|C۟mBE.u[d;AZY4$&QH`+"Ha:4\"ECHEed@APv=Ll^ J?U?dZ= ʋ ICf3^=0/LU$ADW$2!h߫3jF%yYflEgP0`?(ѭK1Dzlxtb5*0C/ұlw3:R¥$*reYwE DdpϨ*D ɷ&fDByհ g!z*%&ɷ,U;~&"UZQiPo*1fk9ը=,4rP357pO8{嵘8ړ(ͦixP.(wkզs=v<04zxg *+f<L` 1RH:P9ƉՌyVTeT]X]!3ϫ([[<&2,e&.IYT`I@X3Jh([KcbJH0DV<\B.J1F AMv/yVDl}GǮ]ѾG ]Ƅt*l)#$%(ucz:,gP:VH\PN{ta~HrWI[탕r f ]yAW#v/_}ew`wmvYqd3{?6ߥW~}Э.GJtho߿xGɗ:bBywnQ޾VCpx//?g9]f~zuq)w_n*Yd><̐n (γ~3{H(4 wl\\S՛~۾?ux}X_tlvG-o}h^(I8*v :&ʖ@~Jo0Q;]~]|Q0tdR#Wok: [8Kqy>qݗݺ;ܧaґ͋/?}r?yR޻o^I_>,}d~ض<m[o_?= ic3h tJDӯ>`czBuxcZ&%ѳW]!KvS~=nw?tR_osi^ ۟]nwwM~9>l=ߍ -7w^Ag-7A6; ׫2U +Ƴ>Je&]盼@""y?qDȭ_nM/M?MHI ј&kz}$ͺێpBol'^a2?h/g2xwwqѲۑ0ގUW0mn\Zӽ9R&϶k7L*w^7,>r[{av{$a+umȓ^?pl+]0zȋ~W1D!߼>Xq)h[Pxfa94$"m^J6;ɑv-P݋q8q)U 9\~ݫmz(rWD4/ҷ9垏WŕA0, N1n>{7?,mej;7w|7Pwodaݫg1P&w_^o79tjRtLJKum*JvKwǞ:ݿԟY~>,@qqI_p޽mW_D=FԇW޽yݦJ^6MoQ~7_aIu;Uv~n'}"-xl?ݰn]5n}?; _޿s(+;_757GAiwm1{xo/޾zݸav?qR嫼xѿrݛ)_$D/?)Հ71atvl#%M?DJ_CcM?ts[>v?Oh~1:м?*Mr6_z}~;7abΛ7&+#el9{V_~*w_ɨh;HC}\7g /4O_滴cvcЇvjJ~H]ޔ[ʖsȫ?|,ro±Ra<?jSb|wz_6x~Bo~] o|io}M]gG~OHA_n6o[<4,kIY~[,Xߎ1>Eo7PKioa4l,sכIT-iSML6gV) +z޽?y0_:^wzkng=4fUCHpt~f*ۦϛ7_|;Iv>rɍ7/_7$Fcr{eڍX0wU۔э#@w߾m9_ ͳ?9c1M=OGf}8諣q w_.#kS3R|GohƦuogHt{S[Un(}GT>PUC٨^P4l}Cw[׻tOuKy/':^~5pT4m+mQ_[eٴMKCA۝.=.ݛq׾yw X 9LaaYu7a.mw{gѳcSCݾBR{t᧾ܾRo&J;l X7۩_lf9M_k_~\͋!-i(rS7=>?Ϸm`w,>Vxy$G/G>A_AK|Lk޽y6KAo&UxDݽݠ37W_}i߽HKz7GZG`#CzӣAuߌ+ ೣC^{GPeʇ0^B#z_}soھ|>Y݆dG'7_mwy:cH&rA"oE{h̽gc7{e43 gGJ2^=Ol}{fݶWCy/@/-oFyyqwfm̽9Ѽ;V3oKֶ(^֜v/Ueu~o;"c;NJq{D R'A0:e'APs=كԅۅPVA0qgs'2rB쏿SAZA뚞WۑqP#C:ՄFxrae('AH dY[E|6Hkvȧ6@+J.7$Et]V0v9-^9(%kxaNO) +?qtؒ%5>7m6[#n9@lx g4Xrd|҃+: c֋^Z 5dؔBֻ|p6ITʼ m|,Ձ7ޅo+ 4Wu"B966578炾T6ښI,Fijc-_d  B LrU6l\bo f8J-i!DG4!~&5&.:j}P @zE*Sgk"D:PVpHAֲvljXԌN1pƩ5a5Ԗx ՜ )naWp}v)"PPѫnN)Z26lGN&V<*#4 Cujjzjt5.s\&[d5_fr6zo4g6= APJ$Q3lFsNu)b}1k⺧'&H@ygX`^Ƨٿ[F:O-7^K&W]K$ǖ^x" ȫkN^ 5MؤyW1[d3WX)5%VVc{hL ˵!#{h;a kxNZc2&衺N P}".mQ>ql]?|WS2^W|#xC:)I= OϨNw0 邁a2#P]0z9daoDo  ,D'Y  : L5ꔯvᩧ>b0 O{m-0jx6 gfafܐh 'ėoA5\ ytZao_zZV" <BgZxCNdT+8>e!6~VK -÷&vC &%f~9&8pb!dVS3i 1XQ|^l&9Ó&6 tZc]Jd# &;!՘ДI2-*%M ¸3 ck B#|7Oji-Tx N?bZ1/ƺkjkB,m==79Ru'5ĭ΅WD#r=ͼшe뼹/Y6jsXq鈬-}6^dդ)<qӏDޫ(@@vz&#D<%Oh԰rV"Uh,f4f ΜNl6]3W* 50&<iO͑,J׀l $ج"1^PN8}1C&b*^xK Swnoyw0Eh NEr?NCIh-ct— $n0r_ )7r^l͈Eܒ&'QyOHHSfQYuUg(8{6y'.hne"u=c.W\WPc$I9V}u$4K@#B."e"`e/1 f7Q=e[ a =A$Tc'uVV&cmq/7 6zR)XfSW@[bdBsPV۔6: TL6h^: N72dW+'7I .*SnԱ7<(ʑ!5B5wXXq]ݕhiPx{Gmmﭦlv|tgm_Sz5Pާ!eKf ti]@lr,6roN! VJR^)xC`T$sL;oR|n<;ڑ K-fLjJrv2qr-)_g]5Nfe!т/UFo&N$\a;BUi{䜉k7;9BMIʄǷ4=/w0 MߏF=!.vWX7ko*MJm5i2iTfj@I,**׬&NHUiRV^vr"ߞ4m  h =r~ի_Rĥ8g!Swvib$(t}ֶ1F|~p,Fd;wV:tWi SC1Sq͌cV*i?Q5'+c%@WKfI7bQ¢AHC]0GCu)ZKN75#ă 1IͱVh8qEC95>z3 @?lUc6v$q6,cCx.UXV]y)BY* A%VJ7_:X_HgP'q*3dePopL֡R!H j1C&n˅m@pn_?\BgMB^Cy#{7NEHwIw~#'D&&3%J`qᛓF'>`,l%M~̂FDAs -('OziV^ƅ`' `Nr۫A`%RMumZt sرPF22kYRs@˫9yjGo%#c!BQx"V֠#r򬟲 s5dPHB2%Cfe3il"50mCG'l0b+4 0=s!͗JVW/*KTs7u4;i¼ӊI?iH'XWu*đb`6 obqL n00 go묣l.d';n-qF+|"@A0~5 _S9,ϖԫ\ $TGl3{|p1gu|_H:X* ]${<̉ ʔx0NhC}VGJx 8@nZZ[:7F3-%3= {946/oxw₆dv clU;hZqW]D1T=#CxR%*0q}k3v h$*"Y "2Vbɯ0Qnz9(':i \X'֩ C;C)1ő%k[hRh{BNғ||xuӓ5|Tq."5xF3׸QAO!K tЧI,qbqFΖY~i oo*q<`PH!kGK+6" fw">K͑:֥6]N56o>6K ]r-݁=лҤ!5nRw: $rnpj7d'hkMбtuNB'u\!-dIs+Ҹ -y\a>5XYO`QcCnK:Bz>y·dMiGpw7"z$AԵA 3QD1 #S7 =3J#$}Fu{{i Dd:,m-8.@\d]F5-2PU\h،w,U>o$%PD_,B7 q6!FBDzFr3bH9ZJ xA`?h̤:zU3"h$6.VJYԑat&Utй)DWCu4=Bc;S`$@4Bn1K982gq́eKsd6O6M[$EG֋O^ 3=w7\Q6JA"gJAL-_OCl#gXd0N*\dܼw՝2PLog ]VЗ|3-oF II/d%,r~rǝo1S!#cT˫_$mB0Q_qKň=A4jei&3x:?b9_n#81=,3(tSƨ&wxor9ٶ3(2'+b(-:GE)VX/#{3n\^V`6qhIʃd \\\3(K{O~8S"'13Dk"r1Md3jTB #J*R 7XP{0|Iz 2ZR801^VǼfcwޏ@32*@_D`Q#^c2 $a66'R1x!X|F*yhD8M@i5(F퐮k6 :֝v)'Gfkt,r]:)OoYBIVM'a$ W%oﱎUl374fR,,Jemc&>>~7@npOᄌ1dGXn1K9gkx7eIVpvӉN5Y.kB Zg^uranLCqHXɕ%W8'<$uHEO)Sa$CH~)kܙ-$ T/͋W swLr8ø6uai'7qxfY@3XmLW]چX;26!U\m'd`kّ0޲**u1*!3v yR+I>GÊy stL, M1TC82z||,po$ʶ9kRwx5,$!m1A|uϐJY(YRIyә<]5H%l`IJ DR8$Z0+EIkaO\I1n$6/ࠈ+nF}`x7}HVq:.zWC.<Bx4x`G6@̾-SK!g4sǽ#6ʣIP(څ^ Ĕn<2u&zf9b>EtZUF>MyxU6_Uz׫Y#4NLau:|j[q;&6#+p2YG7YE@b>nOR=&hf6Z "D8]x  !DFW$3HXd +D82|@?aM).V' b#%VtotnhoU78|:rԤi!T U>p9,>s tf؞lt W)ҁRs֛t`gV6/$u3xEHԝ1y-ֲПΠsL'swgG(Z;7pZc)AƷ6Dt5kiXTzmHHgƟc),Nhٍ9lY"MF=C0x̷A("1ĵ8PxGzGmI=5Wrb{`"198j^A/ӈ&-9CD@[CQ^Y9([Mt&smB-/N{ʛug=t>Kȶ;L2?xnDĆ.Xu `^*9 :K,R;B5!z|{v4ڡٵ4afC_y@5r]C^|$F4Ԛ'٨EXMqUDt6ܲK( I$F 6-ڭٲq9ƆzX:RhnO":1ZӰf\H:^|l2qk NŶ}nsԮPlC7;GgiVIN[v-ȎHwZFyh@Ag6t>ˢ'KBRJTٟvOg0+"6Jq37l9< YE x<:]q8^>5s4mG3-WaPyW=cHmG8JOK:[2l_qBB/"|D*yCٔ6d ޘC84Bpsu#2(83'LL}-{j%xKtĀGўY*ͻ;:9_u2F5Åzcr Rd v-CcA,'X1 5* hv6?NJg"O)oƛB*00CG1 9Ѥwb"ko!'D|,Xya4M< H<3Dd*Q|=Ş(blxd'?C(bo$~>Sˆ>iY4GiB#q g$2<38,prtl=Ep#&Z|RhO+NSC$METI/{|xCB2+#1@lMx'L`le=WdO#z&=R`n黾?7ڑQ_gid]A}׻B{W JǕ9ZŲ$ƴ*HT7ladnbJLC<7nv:jd{wbSEI!xQ  ZL3RzhX/N&Yu=0x y 9툿 Gp5 ^r@g7LENAB%WloFd,\ \ RgV:_3jqCXu,Mnl k O9n $sͭhSM9D`cp-; њ*W,U+k,Ž%yt2M-M@bVЩ6+~4X *1~ZXM.Iº5 ϰgŗgu8Jcz?8si ‘*T.q!/8>seVwط, S(ܞ֓RCubVE ɓ wŇf`v`C${3G:6 _S1ߥٹEw>a3Y&#;Rz}qrJ; ]]j\k*=ø03,f4 iPlYѫsEߡAd^ۣ]N@ A-a@AqI,%1l(#$xk3cn2Z23"DGM:Dogr"Sq'HM"«YLc?͞ce Isht>;R3ز[هc>Iȇ4J5=;sh*,F$mh&C4bPdF"i|LbvG%0؉MA|dg8wIZJSx,:*X|y6CWNeաB ,c"j%g(X\/iΠmSoohtG/9-k]EC#-ӵ;Փ?F3DY<[37B7I+.t.KCTf8lOѦ ~{ 8A]RF֔:fc\r9ohPFm0H[}:B݃]$8Jk嬲̞[bI!=PR7Ga ejrW ߻%[<a2R-kUEe{erZ9u;?'ie_L $үg4{_9nŲFh4q $|W~J_{W;R78k5&:{ִanYxxUX='KBߕ$[Ki *y|Gi_Dp{&JB۹Zˇ8S<&GL鳣3\a%'v $(>Bq<4q?Xc:tZoLW39 ޟ']::wC;r;70MBL=\`VJ8U8]0 1}I9l -{8‰8^%F{۸Qa͒|82q$ur&-8)Cy泵A71%{+"it&gxbR٬2~Ewd-;0 pbF쟳v$4K"jB:ppgt\z!Z 9tP9-?`nw9Z ;O'ncF<k`\i1hs$.%{pC 0Ҕ} =y벒>P7Y"Ge/(dA' ˲A1.JD"^ qD̷ G3TY1=ɘ[*(bsУӄJ|\4T%0f^4 7hX Q+iݰEX͊l'V˝̃ yۥb>vgݲ:XFP*0 a-WGٮ= mJ1#l ċmS31!:G%ju 7Z a15I W - ;vl1&(̦MxVsZ1.s ߸}_5}_I~_-m9&Aa96pB;#wȾ{5X9]]uR?r:OI[F$PR.vk~IWf:w>9:[Cm$d3gt@݆ $ێ_K=JUqjqO55u!,Ɍ1uGttt|O^?1[I[W!sc ,\OCSŒi9TD`Y"R<> FP{LpѱZRzeXw !GV~ą(5n+n0~G⒣HJ{tCchk ܥ Ӏv'DVo"n{'i/m=f):4: $p(mwo,p! &C6{{Aj64[ߜ=11uO/# iH&W "|x!i \Y= .kYK0O4D3cǹk3gApMh˧rEx#"#qоCm@w,Vm`=1]#Qgq8&c '_EFf).f= uEܾ!j$N ows:WZ^k, =hTX\@lB s\w '?ֱy[D7-oH9mprx 枠.?Cq L:=1K+; "iCȑBffcܼ= eoh3뒐|e8[r|dR:3"k:wj!wzKܡYOdذi_웤ӺB Uڐu3"x:1o;ZFMZ>.)Q!>U(D_M,ʄwpɈi;GaKKVHs!ebA™%e7-SMFy=qf9|ϑ6ӳnْgxP3F]o'c8(W0 B%yp2IFw [[M|G` Gk}eu|s[Mg=g\wT#SrZdL2\tk)UynF['펨3QY)> %Z(_g͝{*h<4! x؞)|d\1['*ugmqV'է5\ 4Q6cwL,zÝN4'GƾzϺ=Ol"`-_:yƃ=8lWhBa1f;V]v9%(m#Ko8tLFS{zӵȎk{5CZv$At9|XWoq2cʍ KC { 32إ~ P8H#AR A|NNvI$ëÍ$_р^febv]B2Rmf̛8kA ^bб_8]詻(]cyF`8J}G .a8ؗT}Ã|6)3ku[؞Ԝr<ә)]+!rT Ga%m-Gs\`q06n>1'5^OO'k [q{ti)WܵZ4J~ܯX8V\F}O[ Ҽ&X39KSLXĺYIhq^{v%Gýd}z`wefOk9!=;Ry"ԚL;~NwkS81`- QHvEdqF }z])ig68zw>kRx~ԹJ^t)8Nl̸;tbRlRSsR]j1csB@hs`!;5?mNHdT)bY5t75)^ _=p9mNOs2I/do=\æz;*skc`ha<Ŕ\DsO䊐$xD#t M՚t$v EΰN]XO h!«tZ,dc+S~(B`-~%"j 0hzwG*O;3g #=_L-%Ltxh, F!6*djq3L%J"HxvbZkϷ< \w+X;<YeS?gڠ et%; ۈّ~ +6iG|lG&Veo.vR;_D? Pˡ 98;$dKEn']pM,˭R~2B;K/b1*s΋K-7:mG()3%T& "Ԁ?wT"$?HSn3`3Z'݋Ui@l{H6 tk 8? K=‚ybyѨT7 8kѴC0-g9`-2~dAw j{;șB~y?%sfv3? ew~u'D%9NhGsfʼ35 "'JM B`_HKc%VA&r>X-}2"K{B_,QE";wL3MkkG'n>EHP9mO؅E4$ Cm1d9Yx6QúBI\OoG*'"mi0'$k"SRRu=X ;Ԥʱe c;©Wn2&Uym@KKv˴؜.";?F23(z E =3hVN[ ݇1ʻB%eW#  =?h"\-_R9 >=䕣 MP`l`ܥ͘xnYkK@E}\nHb( İQ#  >9$)nhhLS(g1\]CbA×"`B΁HɆDg&}u^(ˍ,~bes:]\P|3z;mB#UlNl&gsbk4ZXLXdYݜ|~* 9&qgcd~Tfҫ)ך ::7Сr-Lw%)]\% M쑔Wd$EǽJب 5D,^AY7+LHf\C HUd#Fy<Ȩ;2zbO藟Ә &T".Ry- XGI6[$IN=2<nšTdCM'z ?79Pdcqa,b*WM yve2續H>J v8dplOy[3e #VRuPIY&ĆoHx I6n!*LyiF3(3Lvs7ϟ_qVsI -Olp܍0!'u!^} 23rx5;`I5mOr#_wa@e $h1'ԪٌesnHre\Dl $Ф,cWSv Th sHo2T,ҝ5~vl>įtrBZ9R@hB3"IX9szӲ){gʾzqJ4gfogWf'+5TʠGQ3%"K@<3_ؚd))g9Y_I\L, ϔ|Ӄ@vl<8-8 Ʌ9+_mip6' $r1vf&i6Z;H;tL]3P<ٮd6L,dCC.!;7Nqظ9ķXA kG (u 99@$Vyc~`u9G16YM.Is-dNS>q[Q9A--vDNs*s\eƅ[msC66Gw}cG<݈5x#ұY9h{D}:cș凧;H{L `ɾjve CR)QMv;V|ج}an+]u81ѷpaK :nNƝIw\xOtzVy31 O'/c5kj2Wmhۙ0!Ju|&>A"H)~ I'a( ԙlQ%-- Y05GYe?E( -;R?/ w KkP%ЎL+4 ȟ Kjl$|s ?\t|:zs7 AO1X4\X0]DttEgR*M3RjG0}`aʨ : .X4hx4s &MI|ӑ}{MlG5s+.H JXedVfmoy 7x0+腾4X@ žX>,HPT\ pg ;@i5*FF&x$ͅC"5H?`s<__UBۇtWHT tɗ蝆CoOп2-u-3YִX71j-6Ba˝KG 8(Xz4NA/irC߿!w,>ތD\DY̰i<0$xGYt5PGɥ"^lטxx/ -"690XOֹUu>[̛geM$m,}G}9/h, }Z&78rY~Og@H%{ƭ`ǒRc\li@䛍 pqK| Vϯ Ǚ h?2xNdkt ,RК/;˙u޴4)#6tC|nh l(/8>mA03ÉGjuF% &x%4 XlD})H?FƦ/YXz7ȽDބpexײ CG &%888)H,uLDtSp' p& DY(6Z ' SC,hH*ne\MF18alH@:V *sz6wyp1@) s_|h(kVhq`'DNAryLR _VoEVpU{K 񒏧שL=Z'pDl+O|V`g۪gs݋|Ks3rxI{˱!>>940P];v=ezpJZƏÄb!Y-,c@{: VSrˎ>@1.t`U(YtSky͝zdݟ9[úⵤɡ/ޯ^輻HSR#hՏ5#ƭ7<#YC/ݬ 1uSG7{V eӣ_h=zJ (W8ҁ9VEjl 0#MW.)#^ A$-@]},&f '[h֊.`gyTs6 ؒtA dẸB )qcns!B>tޕTGxȝx~?"v?%Zy/`r?[;w^Cs.`66RDA$wNJiϴaLK_Sܐڰ`̑&oy`M{JSnnnrވ>:w 0ġRTbۓN& .Ѓ\=ea6 G9@ߤה{R?{FCOy 3'9'c3ĔXZ}zaopXW7lg:~-jb+26Iԫy:k& X3w<&hF޻7M `ħD!d~"aHL;O-L`ZGt&!*˿o۱0r >>xue vНBӌSq3m|r; waY7,->W d E:(SY:`td-K(8?]c: 7 YR p'') b9lP1#*ҽ_fn@GII,gCK΃+Q̲W mqX(1eC13ՋgNl}GzOm(%?I^Z𼛖p;$հ Fx{w$fMg$R&я8:f$}2"͛(# 'tw¾αq! K51G0ѽ7ɻc" #ɮTxT#+Ce1l(T)v5Cj\to/ d>u&2oH0hP+]Գ tOdжx:v1ωxɮl {t F2.7ca9HQZ?40 S3NtF&i?uv#IߦH&MDFѣ'&M<1 THh<]hf61-oMP`Û/sx{I៥1 uv9_DU6 hMUMiLxy[t2&Uo)t, <IJ\5_od}:Uȯ~` qn3\6Κ%MۗUqjK tL qlJcUllsr}jʠ#떽hoX掬v AWVW1yJ i 72*>_5M,Ⱑ qSa֑!]a *G:K3k\ݛvҀߜzŘ +nOv$Wam^TqE~w-1xӢ%$3iaCwPnؓѯ,gB7pN8n;v&)آ| ۸+kCiGisni:_,/\##p&Rl+PuOVlF/Ⱥ1?.%Rye&uQW F*#ᵦ9ch)]Aܱ2bm4i݅V5M;<5N\b1Ȁ`(g\F{ÉLYT q&YjG{j$wCPfJIh7)r3"đ .4Cau'BÕX?4E-y]KzzD>=ͧ%6--Z4dKney ꄃl r;茼cR̿Ki}{-&3|u3=gsy9;y"X#a-,I8Kn5MPoģy;vf͇ʟrPNrfs\;‹s[Lz璿&x5v|7u-W]t*cܜ +Dxd=gD_)ec_0׹+/UacܸgyY_,~+i{b&+b+1q쬄\A"I[)!z;IL "Nzfh!Sg1^dʩX'+!k׵,ܱ^ofj߆s{(I`H2vaۖdF{}#qBwǼ3dW ΥEM4r?3trRg""[,m'i]HIƵ`TDjWN|qg]yY i}"^jjY;lz~{Ε0 cT5Y:˟1?woELGB  Cg$'oeP2Q޽QN 0Gocbq@1ᘹm [ǃaH&!d, kӚc\$6|fI7PAt]z6UeDzҽ#\얤"Ѯ[a3琂'W Wdkѝ= q$<6>8cTo1]޴ua/2rƕ gErXI!rmGm @ctKO "Y6HoY#<%wS' L9h8: y"DgaPݑ!C়54隰!o,L\M-!(V=銉>:h>DrN1xS2= º3ゟ__v۱krp"ҡAã,@J^pQ!-ŒQMf}ͦLwM_^&ln.[uk1~KKS`-ߚIDAZ`'eqPcưrpa0N\'3#gV 5AbPˎq۶' |M00ao,9іd)}dlHZ #p Vȵk'C3<zw!H;;m1Ff"޽^i@cb<Osi$# 2 doG 37@|7[sCQ=_h+ۧm;NEq@Ɏ!9i֍!Z!5?g\F9GC6sDq01s_P˔4Pe_"B{L F~"ƹEka%\q!b 6hKgHb+bywz|,irOzd tFx$ ƝH 5ZJ ߯m#>B1;+(EI*8006sRG;g܃r1A7.x(w&Sp |!44?O)မ%q9y>8cjT) Iih~Kӥ9(~$D;#$#9MT}!Ov٣s&?xj- 8zNM?R 溬K e]lvrZ'ځ'9:40I쎇ݑDVƐ8I)BKP]pjx "O@d'f8] ^f^Iޗ0ϙ3 oW~ |Vic~Տ zgBIIXZn9eZlw[[5]͓?0N,#W}~Jf9{laJX,MF%د-V3zKK4m =l136D=.NiAn#ױԞې>/sB5t O |[>lkLtęeuß VOf;~u8Zzk-i('S{TaP(*SePWJfj]9> =O0|-WEsy0Zh/@qG&^>Po=ţpsRyz}ԃ9eӭXM`—F9g.Ff6쏠@BA91{Q$|W<ۛwϴ%e@vr}tO$ S\T ZRĝ{OQ3E%A]-W:9F?4O=ljYM[ -Mx!\&i5jC!'"&۠կ70!(W=૥9a*<| ]̓4/9 bA'rGߴvq_G@מ52bùy2 ʉV")c㦱չ_F,jK*'9ѶaX1WW0q2rS:1Q[OY/jOܨ!>{ j.2=FvHctk{ ( y50|TJFrև{׏zlF%A6 ;Е YM 1c琁F3!AD類wmo94-穈-kp* ͯ]VL Inݭ1eHLI~0Fs+Vʳ&j M}ۀL}yfM]B@1VA\F v5yoNl~蔋^1]y[2%*PO0)=^\:ҎQ ye;v35$H6S%1\[IP q;q#,b),!'XaEb @, IˉV@v8L,%GY8 >[X &\|!EcU${\[;G$(fB/EDA` 3ΐ8')A2`~Ne'=6PwtSң~J,<,N&_Rv*6gLh~uNx@N|n CGm,&Yvb 6_Rā-qHN<)E1U퉆"=EOЋ`I/%sċNWwWܼIU}LO\9@q0x({}N^/5s{5[Glj^lt&P84$Ini.^i" WW#sA̞xjˑӲ?G"I\;ƨlK4 EBp-M Ig$6_{rˁycIh2jG%,v1vLL!؇8L"(8=F5_L[ks&,3@dOrk5mR4C+KlRsDSޡl&"qQir4W4SG2Ms%M #8OK<2QGdLSQW'0F(I#Eb+xNR0$QsۑCT 5;tR <_ 'ٷ9,1y-knoq9ѷ5Ata{奰8b= pz+ q,3VM4.`c"\&WyՄ|f.dl݉閱by3nWs6>Kf~D 5Gs\\Tc__ 1fT7N2utIFaI:mFeq:-az:jvV]MτjfO ͹(co_;BxXe^ lghs c=JT5.m!-H.Ʌɣ(8⛘Sjd0BD1Ir :7Z7 l# o9]81TQ :%Մ&8`Ģm,Qs@K@nq&FJbre&/]v$@I#2(Mb<.eFg 7.ғO h2bƻc@\;Zd0H ̔f_ n]׍(!ugcD4qV-JMvAuR=my9 $ϡPOI4t7#/BBWʜOv$=..eIY3U9΄yjq j' +ps%ɸqw[+C~uȩɽa$AŐu7D^UA_ٹsI:"|@eAC&L1ӈܿE3j!ȝsp1ѠZRKҁ8ud1ܐE$= EZ N,TmU`{=!hv,RY!x}1l<|fl"ةdV° W\&ݑQo e; C5A5r&)Aޙ\#$Y> ZsL9<=܁o'N ^䦗ƒq`|α^TYR l` J-n!n^xP疞]nH/yQOɻ3 BEȩހ4[!F3\5_919U5L?%oP/V=цk ~jTiuͅ}5D(ZܷS?WԳt29I\3Y A!57է"ӄ:;;gGJI .(}>1 Q\Z P>09<@Q5 &..s>ww\7˙.$1:1W&.1^T-7qD4:_HM޹2Q[DlO 3"TSN!g2;ԋ:'^_08B畉6:_^g){o}2*ĵ_Ÿ=_i1ז@"B4]^GZh( -*_$1nbFdVCSCGq!CmKl `H,ESՅ7{;rѺ$2}`Hהk(c^Xg)Bl"t |$`Rz͟+DDqb(JĢ$CC^;KG>ػ#gǡqYG 4x=ԅ*Bс%k\T|j1CGT Mg 3~_Cs1d c ]Оѡ T'7l11KmTgИ{Rs|b |)v)9U8Yr;%P J+-UZeHP&J}$ٲ0+No% G8C(|ϡ|&8O[r'}W 4ԙN_($yzHhWcJ:G \HV6 cAc+G ?`BHRű PXrRsCH̒nGjB VkF ]%h0!m[~@z4*Denӡg$^ש[Nnju^'S,=>Ԥ-b3 A< '0-6jK@9iPWDwO!˃@qݑ4659gCxp j=u’ lyh(,ٌQ^ub 'h7p'֒z+{uYg/AnXO7pV4%̀HҺ(0 IQ$1QQli6ΘX&F4ݲ1S`\1^7M4a)cQzlcGJm$N5=a~H\;j2 2r}!b^w]1>zAln1o5w4&m0]n#[V[MXWN͝1[uXITHTl/c]c["sLY>dDfDW6Oއht܏$|$3a$!F435w1 _ 6,2͠&uHyC4̞zl3tw3g~6(q}{{&`2G@bI6Tlu'Xegr"LpЋoD•MZ3EN11? r9X6H3ܙ: 3NA435oyC2%_1;I> $ZW{p>3R/BN>5HqBbln鄦c@9m..GlAr>~u"hw`"K<3`'q  H6,K4Ma@),X2MIĹ3HV<҇l?HSɐO>k܄:gs>4fW'qo"<Ľ O |Nbfzy4wB9j6r c98׼PWM=q83 ]$tqȍ~XfcF:1m+O\ =>Grk—7 m!&\]P3qDp=73"^9qvYk 9dT畅}O߃.@SN_\Z ç }r&GAxsmT[iF^H K+a S˄3Q 2||# T#~;x/)s, ?{LҘ?;>ٝ3љ)ڱNq(RʅZT|:LK*f4d6,>3 sJ=n 9员wu哀tٙ1K6$P}$r0N5zIFāI|27 1CD^m&:0Klض\G5Δnf%V@y{*Xf;)"'daL7''vjGC~YvrSa_s6Do2$sx Elω>'ߞF6-TdH[ixokh71RH^uO7cqbc]Oac# W粏 uYF13>a o"s$AJ龜Nw89*6!j{D"gNGxF $9:d0}D7"L4k۸F%;2T3.=Ih2 G:"Te4*.ObiCFx'І!`1u#܊":cD:G==:@FSH.0vvH`;ّ'OaNN׎,9ѐK6S/VNOY$n^; !)G,Ww=YQ$f 7ё?j05,+BÉ ?KL#z2JoGr۱| 2xs`;qilMk0!zRKx8<Υ3ygT|3JJe"*\>t{gz}H]pq{uXOD|#Mn*l1CDZ{GuMa 0E`J :6'mc,'#sl'w<D y4:҈UK"rND9 +'8\F8=m\i"nxN4y޴b^a4^V;^༴=:eBe(lw^M78v1l{06ڝMq+b*{azO|AnZHXgSdذ7(6 47DIk>)'CЀbs2>n4ooU{RMvul],YgQ2G561ssg6)O!42M?{? t>;oF{c#S;K]a#9O7}`i|oo~oRo F/m.7') jp.6mQK*͐W?wz5hIԵO[VȨ=֏Dk0:bNfpEI8=K͢D3wDzrVn*a 6|b7 #o ^> 熚E-yamNuǯpK( gTx7:kijMg3=[:nO t@/Vȍ8)2i̱ƒ R.8UOìUJ$dΦ Y,ΩeXxkƓ64jPtB>Y6WNSɻip,p' A=* M?ɯw89mgةi=UkB†{tq/!Lo$#. y3vBK|Wݵ&͒X`pl'|[>T Gns-QщFphqn`WRoƞi{q@xkh~E7EH4]HGG=D5XfF #d# \qF_ж9Yvԑq 8r*?j\}-ӽ%X֑@=DbskG]iGlaƞzڎUќR`"ȨW@*QRsfe>it#Ɠ1`^13 &a_1׺6l+W|KU|4}vx g@, T<#QĦ]=xE}ʐD}.{2Y{(2N-c3|eQdhS o9V'mP7$oůuP~ (G:@%kGƹq8!2ĵ$¿Hfx}ܒĴSgX_P(#Y:dLN.Hh&at䶑flbԘg:2؉8a#^wz`kʁ<%k”Տ`( H 鈡fWSC5䣎v;bP1Rv^2؁2ѹ׷=5|-hpMGzq<aktJF$-!dC`kqtH0Z||ߨXrZ!^mA)2$c+u5L?w"1D@=5ɯP_G>s:^{gq4*cTǙ?0\(f!|pi#zYT<+|v:ιlA^^ɞx @CeF*@sz[%G<DhoGkGl5 5E3kl I<}fF05䫺x0Ac `8f3t[gBLU\$g#V:!0{M$:[ooЏ?ʠͷɀɶLc7wI%8{3A_wN-&zޮsf6!x^깁ͤqISMar??[mL C$y-* i8< v'vdsXc޿뺉^$&C!Ѳ^YC m/D[/ ~1\ь40x8bWL"$.hԵ|oi$pWU @L-j v+89fxmK')K* /!1Jdg7dUfCd~I/"%>6(Aپ T8m"i1'|)%|$gzMݓÓ桜DCuX!ȵ j-hZlyh\%qg7D 3؎ ;UC NQWRng^{&=~,=g:>]Y"WGVktv̿:Mד XiloxܕMz:ٱ= U?RXn[.p ;]sxJ^,{0GO$Yoi>MLFzmQa[*ؾ9ўf_q2Ja6*FbhrikeV(G%_<ܳD4Gv,Xq q:|v' ,)MеAr%x#a(;M2 P42΀>[0V-w9y6%|gq m $=UB1<^ђx1qcv%0hdiPf,o+ϯ\y$z#h8ߩį[ŝM..p~[*ONOiokGGEMw?ȼ$ã#+y,=/R=VhȨZ1-b+m!8E$u `tO>"tWx7rFk!8&L`O80 L,Z1+Vb+nCs/X+0"|!c@'&N3 5=>pT)7䕱w٩3ˍb6q,.x8 *fہH3aYBiL+AeL 2{ ,ɡ%zв`[!#-ãE@蘿Ac}FbP (0Nɑv%}<&v 1E{K4pZLlDNl!Id S8Czb߳^}5D3>Vi=.m?Gm㐖V xω0ZZr8\NCdTew0Ed OGG8R` )yB8Yn8w)w% h839=_{_=qw-kN86 l.2MȗP(טZ{ہ !N< t] ?J'tw.ΤDrO E#cD7c)M 6̯'XGC}|!З{`&tmQ qo@tqװ86s+#\ą!ME?/7|{pO~o!Łj.]/v O7&(azZ]DgF\[7'Krrr3tw/lt.^2*Ubl={cN<{|)oo?JvcZܷߟrZGgoM4G7}duБvשtN^ e.EqsXUg 2~[g.8abKn$5O|KI?mSQ⩋%^ΞlK\^VlkdX!bX03hKBh/~[X'aVl3 [*ZVi]HS.IBJa~CKT=M]62 RX$֏=mZ=}F)E$pX&K|) 0/7i HZB?ԏ#!˘2)n'#fx>28i3I 8QN|ΌU Xer j Cnm51W{O~D 6k"K4GG[?Q"m5ĚlzGstO: Ih9mƋR)?]? g(g=':8|='b٢ǝ'x-Yn6tCb3s0d|Iln pՠA So _~e0qμ(;Μ8=LQeO4$aHX 0y$7n5*aMk g7dv) }-aHz(_/-Kq_uɧ`{Y{cg;2`XvPăab~4^Նc$SC*z͙4iЧPx\X^4̸I?MQ@v$]p/Ќ1z b x‹W;O:W9{펞/~^x SDȾt^sX<e/\Gڗ-|0ި'?M;ϾJW7Y~'-7RDkNz]U>-mv7Y?f?{8Tz!9l;oni|!_iy]יbĎ-oۖx>~ q~T ^D--;_ozq+1)%%h_|GW>_#jNڂPXR".'J,NV*g֮*nJ֍/X$]+ )ށ|7+- U׈}/^.7nLk6T -Y5 U-rRկeѪ*P^G}K3[.7ʅz}m-J.ՅjNG]K5?6Uug݆Onu)l  gzG-?g|kC~|U֛8+yzK5h]qCn/=ۡ $}6ikx6ڱ>V Ku U,7J/O,k k1R*Y~ᓘuTU*AvI?oʋ}8շM`seUgc児ޡU} ]p¥|kd$`2)־/Ͼ۲ u%[).mx^K-ȗؒxl]UF+֕}kjBn*USUJo6hPM]`e%l_*N1>u'`V^Yc}[5 ߲-3]|e MU ?T-sZcg.B )lg {$qjN&Ps;dH`̺XcaP:HŲf"VWR t ]JZV2, ɺқd]ж~}aB2 ^н6ph6/4P|0',oAh0F]'-}WlUX- 3Djm`+`^Lg[5#}B\Q$E[G4ȭC{{o>?~9.+K؀'0j͒saEX.#/ "R>U:k_ڢJ4'(t4mq TQsP1X-5bjd~PT;Vn{Vo VoEje3@Ӆa]x5Eq].7E2C |]ZC&B]=Kly]off G{K3nzlkǪKTsBHJn_%^/Zn=/wqw+[v4y}e2UvԘl[)N`unV(t^6V`1 6k&ׄz)o{nuՊ.+{ U-TtiX楶z_a61:-<囑7i}>W  smm^t`_^ ÃaΧtKP^odRIA3acۜ}~U@0[og$vnNcToV].ozbFYqמMYi.l?e-S-wjǬuԠ ꞕ˹;6CRlT™QT+oWyubVQВIvKC\+ {ZZP/g~ _P6)14Eܠn^n=ӵ_gF"Q?moڴJ>,yVfo6H>./5E}UGIVحŘ̅ÖLݗez[82 V\np=*3"*JkJn7{EW}M rrK@?o8EL+*/M*˧귒NA_l7ǍGV'G3+Wmy)ԡvJD?ovu"JSEܔ]E.WuU$yRM-|o%5c{7`U X Ęk_*g_>l~0 {@R=].IPXߪNv?r+lXJ6s6)R~˶ X+#5&5aDSy|yI~Nɺs/ r5T&6t] F'7T-Jh_\\_OeqqMs r#X92ܚBT1,į0:].eu9mD~l,hv:jهrm[_O-,_l+̋zOUX|= Rs` 5gbpsPcM"ba{^>fj1.+f/}BoVsZH݆NʯCwW6<k&Es 2kOzY&&lشr5R9lX{-& /cWc[/@CXϨ|]![3$ߥ0]:' Zs'mA?Vea3Oì$|eܶ*Z\S~4.Չ )ޕhq.u>cLXCMR+MjCmuz \'?ӳHH]7( -W\$Ԙ&g-c m^/jwj:ie?;uw`6Fas|=[;Yٳ__Hux_=Zrwݺ*mtLkATq ZV_ P+*܇2#2 BzcsQKEMtFK̢{W/U sLբek%VPUZr/U-Srnz[z)m3ݗם1!g]^ii`F7Wuu1I gr#rZl) "L~(xf.C*Vx^eNlq%dmgWȬJKKΗ"0?QBm ű>m [, $r :ba {̀ANfHnY&W+{b>z?w(gYWl˻-,n=~ }*Pk%H)  Ca٬x-rv׾~L:m}$k]d>?Ěݒv~劊 $@V] RŇ9l<->ߡeO,9_>=DU#(Ӏmm<WSjVJǼ=c3e\sed2cߥx:=|q/3 yJKcPl8{IFwf.g}]5]6g*7<.{&q5*#p-Jnc_p-;r# NϿH<_ 1k֜rڍS6. }L&:[aWd2M#JFwV8-Q.6Xpӟ*FCU=t]V xXو2ϕ朅ajJ%O55gڠ~ȥ&6+{ mD*=\!P=g* ^7mVR]Oy[WnkZ'gIYP.x{@VS TuB FU` dU{ʲtjtm1p`1UW&5cA[҅r]N|uqKBW lX̉A~W~}r ~/m*KQ>!U+3/x[Uz Sj:mxoV/q.7sWl,6׭B,anq*|p_Ű[vz@ҹibU%xeyx~^H=Jd2}H/Uu1\xLTPwwѦlg%wfD=^Tu?"^}^tI@pT}xuЈ]4RTɖ8آ` ]u-{\/9uc9R/$oYmU%bInjڢbS)A# 3G$k߭A\4b  y~ȄN]~[fû!.ˋGKYِݣڤ?/RP,֫%ؔ!N/oS[i ٿ#j^.WNJ!GM AeV :z]%5/;]cfB+37 hO_g߉˦i_j1C]kD㽶eBuWU@ϋǽ%_] ?:@׹ᥦ.,ggu +/NhqKyW4G`Vjٌ!#-ќX? ,xxrR9"xe[oa:BTʠ,mln}X-=C\FaSM緛GN05CQڭ֠tf]l!.:z{],k*y Y W\תO>ˡ&؃oPq2 {Z{ ޽|?jw{WVPծfT|[ޣ7e2]z.J\TuSgSY?SmpXmWib:ݗez%[ iG==|ۮzAn;A6CPk:|~_Wa*"U&W=F T} ;B-^Hkwֵݍhy4 Z|ֈyIi_R(PWȠB=m`|(TX ӴhÅ Y֤+iK Ұ%ᣞiq}KehZB~DVB?ש[7)튡BcmW{_RK ~|Q)LxeVkk߈,ˬ .4[}%Q!*]ubmi٠f+jy.}3 7T)ϥv tù^1THۃ֊|~,0%=s}~x~ne+iGۡ!&-kNIJ]keF R3 |$L]5kJWoVi_\Vn,,;E[wn?y"-KXwj5Kחy!UGU.IdA) [h(9И]tnS?[ùYxc9|sNѴ@/ǫqI`%LHWTWVw7/KǡZZ˃/$#[;^m?UY_Cf+jؕfeƷZٕ? r4קqV'pw޶7w}D,}9i2ǡmF׋||QwNr&GXj6ؕ"BZ'YuU.!մuWur}u<ϷÕf{_п[m$,w\?^zj/BQ_Gy7)O[(W?䢸ێqC)PE K2y/iP9 -^ JeŪR]UJe61GפI 5'Jr>|}\ P˿Vh^OJ%,3wR\cj*jy ~0bw>Ƨ_xKn2iDlE*Q:s]8ߢyv_#L=VmRx0wg`2mS;bXҍ<>{\i#>1yޖ z3(a\:[7[Xt?ȣbaijǞ{yz λs-=5N6ult~^h>[jvju>>ą G O4W=rD~5>xi"oz %N](w{WZNA+Kw[1%ُ3 ~~W ^w=l*ۏo>!ߙZemEcn][s\PI8Ek;) /r.ʜV nZ\>Xzo!,dT̯J;bjpPӶBezKT c \b~6?E9 :<_"Nqlbkbq6[krS =Dvy`D} 5GXmXs - Jlm ) WZi_u#&R^=s^+URc+~- }߲@MsL^A ۆvIQ=5. krGpI]oַ¶}^4#~ʺ"[N(z'o_~D=1&iW5ބz ĹbUz UsKlЮrھY75]Oyܒ\9X~Մ|`"gYRmRF6RR>&m8\z·Xo$ϙkg5ǂ$[Xi*ob=nt=鰫?o_lBq MIQJ]&,0صڮCKE{ͩ,|]/R{T~81Lend%9(zԳh k_ߞkQxYǥ$}lFfCY8y#2}i!ϒupWщpރ׭۴{Bw:ݺBLRK/zmk[z,.n?DW"p~ j,,e6QfȒU({(^^R5_ Ue4}O#ۓvUA5OI`jh?^:;Kk=ݲl3tn"[A}[.r)*Lj}f+ULnQ.zC M[%S96w?&TYcL\xVڿ-H%Ǐ'\cgT7{빲0N iGp;mv_^_kmTvr>1C-l,ˑ1*'wn+| Z_5woWvl~wD_E15?Wj-*6O~*[}J:_Z#j^>}Lj76EAsϏߣ4`Òoþ|7LG=v0i7Esc 6cE*OMe>Iyt^oҠm" &4m[#B[{:;wӺ'6C4 ["j+afc<6O)~?a? |6y 8d!fˬfBT.W9[҈_zF?TuyHX>jQ}뎛+?XeV1V8enK(&iu^1ms[=&q+X`_7[UFyC#b4X~UkZo-;L!~?cXW$RT]Wj)aIؚw^-ʲvp> (\PGC,c}Yk6ZF8i[Iy학Q,.6tK{@4UFzߏ~,zQ[}cE>2| +zB7s25 Mz,cXVȐz54,ktBGQHfiT]ȁuy;yVF໥?z+|<<$<_+ [Wmo+9X6{EvRȴ`>|FÖaE n!lG{q*`D`jSLCm*Jxe#uq3ĭk>gز g鬴ݐ8kh$d(w xJ kTCPˤ-حXݮHv=?@lhljP{rL"+jCQU>%KGj~,PD xG ob>?l&?FY`m˺I&ږ|76\Ht3s`;PyT?%S0D:lb` Qns\-?|#ѦGGPˌIZvƏq|tVW5 K5-G}P\-U8PBWL˃-fgl/ч;N#w3N6=3 ^Uwa|Yߺn^yº~8'3;ۏG]=nDb77Tn'g>'(H8" ߞ`UZSGm>3?OU C v40wyVw>QkWE~zc?VGƿ/;8<$gfQz} EqMmYPeqPxR߫Vu&u|ۖbUGs>G|]E^dnM =HpҦ Uo^(y;ZXu~Wg.u#.ﯶ~\E!ޢhJYB$hgx8%Uڌz𾸙WŪ|COВscuvֺ{!q~<.2m}[AV[\̊|o\hؚ] ߅mO}AX^ ljtHUUݏ˞+m:_Ij=daQ|] qm&3|ʏ;?>._V?HDÂ;VVӠ ߩ9&wnoOUokn`(m[>{{㰫?~Mz%eG{|.[JG-7|ndݫR뿴l ;/͑u,Qzc5 taRQ]rj9׀ݣzv2!jT^s]Dw.sR_X|.ľt3+dM-n*PUIwk`߭z8 7vˆǐץudOz]vb%W>q_aپ%WW# ow.So!H5%IjǸR[,Tわcngդok_zyYק5 ?_7앟^racKy?;zxˀه.KϨu8Ћ>__v/g8T䜗8To5;o/e_Piѻ/С}*5=/n;`>,_s2@5JD譞^XZwiKװ^ 7~yYz5W{c<^IӐ}nde[/zeʞ/E^|f*<_YvO҂danxf|%\m+˧B/[~ݕ=o{O+vX|.e,oF61|)l_ R[y>_nh 5m~^~KuYJl<UMW T.kk+tm|^^5 }Z^z^ JaZLf_(K5ʗ6/,WߖOз._>sV*j3r-_MRjEKETQfkf>V}v?/y/ˍeg^>/Ma_ U3򥶫r}]+ΐV;r 6ox BKRQr|zվopVAe sEYNB[^-?PJHS醝?Vef0A|)TIPXn|A$]ޗ%߆~{d-//_*- %t^P)MP˧37 mn(4DS sVJ]4?Vg;5;+$>(]=,:Ĭ:o~뱫}?z,) 5rx×BR[HW.K3w(}Rt=/w =ž~Z՟kOڙ0/`/5ЬeO>PrPآvþzY̾6˜/RZRvJu(lZO^ }~_{2K弿IؕJBOέb5^D Dj{J4_njá@'(, ,e8Mhm$/O%KcwT&J8seչp yXw>ZK))a[PӸC^h?|Zު>}0ٗ jst&Ya} L Bt=owa[a,/ ;c/|o⡴_{C\^{lJK\/m,08n@>7ך(=Z\{?t? O%ZK}6๖Zjz7~ ^1~ \ 9򹖔aeȧB) }9OSXfW}eۮ5ЁԎ,J@{9r~NQrp%, ڵwj Q8mWwE+K-eU^GJd}9pCRM)J+WǞlQT"%pq($ϵ2C^73 T//o͒!}97Ꝟk!O+, CZ FB{ZYC ]a 1\vCĒP?WC496#ۨcեX=Xq*a}A$e4~|3 LP:[->[*kúJxu(KFna[2 /*u R;IȦ z€TVAmZ}]X,3/)6+Fս8PlSiުSDbpZ[Wv|֒]l VƘzPVpƖi{Ecji$myy hKK%JR0x/UZ%ZV|׮$RM-zlɕ~}^3u^*I[FyU[&ޕh DT`QX!2ԧQK퀬`г+u^/Æu_; ,+d] =kUtRTܰR\,z$/ *o%i6baQ}* ߖ[ϵh;Y0A׾_*NǔeK\PkNAɪgW+Fۗ[WPٷ,] &Ha]1奒iS4:a_).H ZJ0l>|J΂9'Jx %/e˗Z}skAKjX V/eɲg6Z~-ի,1VNfFahVBZ'jEKEӶCоX_\%n_!!sA6[U#yT΅x㔔JP(쪫J KAj[ #5T/.ZK70}%sj}WT3(>T7VݗJB`ʵM5V! ZUֲS-OwK4їZ =-&+8~~%cOitVWz<ՅilRJZDR^W' X~aڗZduC&BWXjaݗZd j{RR;%UVwWg=_^ ¾FKC5_FRJ7{v[Gk/l?b| Pku$T܇BZM*R|.ED-YK}JaI)0߶_S}}p[ Y18 [͡f;Yv ϵo)k2Zq(R6TgȩEZVTR{\#ϵ"EbBI,Ut_jQb$j*3uۈ]fQ0"{KUo LLtnDA ( 3#Č9<ňALuSW묽amؿ5] {·S#+ 3Z}mp 'D)h__u7՚rbtHjWTxC wY w9X@Y?%PBQJOc+%P*;}$1v6riW Gdy(^??ռeW7nB R B)`_=(ߪi!!P_9`GK;ԗ@} E}sK @mDS!!=J5X$$@(5I}A`P)FCeb_ 3`Ҷ*yjRTB ?7GFf7}>Js_IdT@K8|b(ԍ+=mq b!!4}|Rⷧl(-~ŸEZCFy$_=%G[ԁ d$>5}hN=m-P*UU::{RhqK n"[_ i^N$D@I$‰2c8Tㅟ\:{dq}4R%i;4p0Jv#mOQSBySޗUAbg XXSR*Ć6&}-tf<*AN` :Nᾒ?Tv| CmS᎖OB%XmM2b]u2{RlW*v=-5d..;WA3gW@0 $P=Q(|]%J: )%ZP&s i9߱{GJ]$%6vWYr&z =u5Dss%¢y|=A9d-ԕCdoѲ !I@^O[8U7 rIrywI I7>;9 d9ؽ<$Δj#i+Sb;E*[(vxzZhW8cUk eo_wA9Tݼ(lF2L!}u9iA#/ѺNE2mV{e1Pp1v%i(mwVZ(H&Jh1W4! q(x}?mj>pvcZ,n?k!|FZF$FRw=y…vZu_ou`OΠuv#ZT 4jؽU@{ZOvKH }u)p#i ؒŲs1wyo =P۶bhc]ңٓGHEjv~AtCm7в (YžX[%lk,М@C7 fD(Եu'4%:3ҷ#ӒoDhQ}m ^2!l]OsrUO'{exyh܁:4uoy+ /=S<SOM48Tt"dJHLpWmoW"EXg򖾄J.oKDh:>~Ꮏ*_K'5]H-k%H@nepj%dPh!HxPV?RkIz1}EaˆZ̘`0}j>9 H ))we Ufj2@['$UDa-(H=mS)XV P=e"@8T0R{k.J]^_ɧ0P v9DFsuƤmb"԰]+6Xuć1ѵbYLϻix0 -NFeXݩxu(DRepT" Ѿ o+~ΛN6R?mHQ'|?Twv{*9LjAuhrzr9y{LqSb=!&x)HfG+!O^p_@h>T8{JlPSPNp{O2~9\N2VƎD%{Jw]iZzx~W{ (]E kiR'@_&]Uq|OfJG. 6L.< U}>G]($#cFZdPxuC q\VG~4бpMzZCԍ4E*A)6Tr[lO׾/ܷ裫['JGb'  ai{ZGcvlXP r=uITB =9TK9)M?Z1HMMIFro 9GW8B:y%@jWlb2z>HęL8Ys{ EBZpKiN'RCgl{R}_Q琗P"TF=S #RA=j:Q }mB<w}GC_hZN&0FliwkbjF($-j1v PWŒDS* fB[֑T?Wϫw_ HI%&y5o\`ZlIU_ , @X i)jޞeve!R>m&obTj}Ѓ}-{v.P#1Lj5(Q+(/t_GfČHPp/Ջsj]BV)7mw@Jo[!0dNjԶHo-yƉevu&mpY%A_[sX =o nm/e( 'g,Iܑ$D@AvΡ^w]50_Yv uS&|#x z.bR~WQR&G>1\|_"ұuzOc\}^!sJQwϩm"}C 'Q_^ݴDi#5NUk9%nA_ARI:'$A *0o8TP;2Bk)n jTJL@W_N W5Sf1ZPj:Ҫ$ѵUb$ki${? \VK\@Ã2fL\6`45T Pɪ$1.KDj2nJn ]j}Þ,^ՔC[$>V-M%|2RWw'5;GBwB"ua %>'x#Zl'eWj)=-GkZgib}54J$-BmށDϓz#-ࠧPHMv쎶T)AlYRRc5`)m2Pj,1?-ZM ,#R#CC-Y%f~F Q1"WP̛y9*#!M.dN y,$ٗrwRby4oYodvO^^rZy kG?(1+KyGs_ɏNI)fM>8Oh!4D2<ڄh.aGaߓ(z5ȿ'%%PDeiچBRHjH"^bI@K Ij5DŁd_bj"!*i0V|=eB.Ѯ?j$BF/[kkPHgBS_9PC-%'KiH)=ǁҪ?jӂi$PJW ';*&5 b}%wpGG7n@[:;ZyoO K0*5d7@1mLZ!H4<h_ a$wΙ@%6T"BZ@G{Wn*ȑGbJ#_" IˉIC L8PH˳2rbI [Ñgj>DV[9i< d)%Tk}LoWEKl_2IN]f0^E]GaԎP*u(ޮ2hoeVzT} FI,D%A@kKMR#%m$Dw]P:ԥq?*(s|gzj#Rj)*쩯EH{JJ`_4J&l5:Z<)$mOI.;+CFWHd}#mXNW|G,5֖{ZIϗ!F` S)C'e9fKeFuWpV)zL-Zdu45I0E"_e3aQ Ꮏ˱#-wD~u9+DKԞlO{Ɗ ZaoGnZ0\+_TiZ($J()i}W,2C{#t1gEw J)Fڒj0 /ClHSPrXU/"O";P3%k1CEnqv9C -)d$H+JSS$=e*'uq_PQ"c(c _p_.eiY'm=eT6PҶCuޞx(٪wkR1 9_@4 }mr_RK`@FJQ_k V*M)~:9M13lI;Оk|e)u{%uwM#j¡d*e<=@/+r}-kWbUJw}搔-`=$G[ZJ4HyjӓiGaG{{'eG. Z$yN\w_L/z9̡Yb=mʮ[v!DwGfaHQF꨿Ԓg4ԖvhgsP?Z5IƾB aF~d/*Iu]# ) BRD2^T>P+̷V(eTM荍`qY%>j=mU_ hݥ>#(6* RI`_Q7(!m}ER!8Ǖq sM(z#edזK$VQbg<0cAMv(EBi]#!ke7wUhy8GBhO oC5|L{~]+JP?FZ3{)iCu#0sj]m#E=+3w3ľ6$A'#.+O1T@K2TgBԞuQׇZ8Czb2LKڣc*//%%Y!oGx;j+Z46[o-1B DJd=c[u7&F}}p}m8 ̓Ou{X)hюH_!i>l@RfAR}H9 ]F{hI$vOJnH% jMi/ԟjB6w%)5] R^$۞B/R+$vU}%b$I).Rk͊g}N#I\~?%iY*jB"()2>ā(-`:C_2W~)w#Ao׾޾@8&VX2DHܩ'KUB@[Ԟ鋄H c~f0P69=$AsxP}À)hѯR~O[{h3=E_MLwf/J0}'>PA`8)L4v cʼmtH(w2U_8:Jn.TJ_) OQ^^R bwbwc}G['bwn>H\Hu48 #=㶧cF{ZҶ*j~>XM;|@RQJo}EG}*UiC!Lr:VHU JοH@n5RD#m Jcܑ}m@*1TPңSR`I.YWw tE*ɔ:Ji)>8g8%A,eIEobDpYOoLiOb@χF1ZE$sGj(|lm&%m*8ԒVvĢ=mllut{`WO} ܸP C7ٷuŽ̓İ qKy@Q-|yK qkr>FŞ_ֶ}]@{7#fuZ֒ e6>2Z^j!pO<B,h r-ھBGPkK#J(H_XWJz뻊j𴁖NVb8@Ϳ'uR#8޽}l"rpZUGNUatFa˾O8g_ܵfG}.f#EƜ;CԷ,6ѴT+^!j7?~̠&@kzC錔zBD`|\9M +UvvYMGoG\."t(~NN1){"A_g֓|$fxl,s}FRN$l_=כVqkP7P9&SSkH^B@݀XwlGCm1<[5Ġv]Sa>2 뾖`@ʷ6o]V{A/ddG[C/I8&h{}!D-0b;=)*LfO]vBPC KR { kU*0ƽ]}h2˾nsRqT7?R"Pհͻ11sve4^A- =-aؖj/Jz%YE#-tB -ex S %Pg &VH{m@[lؗ+4bžPKF_{n~ K[k 4tH!/@ckBԈNj4T<` ]2ĥ;>Z;y}ɣoXl8@y)u 8m)엨 z'*'Q}%̮ P,RRZA_fQ[oAƬ#uGڂJO[cp3M֨CB~ve@A=[,{rŐqq8PӖO e,QHdap@jƩ E$em?POM G{kjZiK z c.G:+pWG0$?: $R=)3C$.eeVK }=WF_24K̡ 7RwhuU]-)ă\f5Mv"cW˰g8E@C%o WKItR%H_[VJ`{JƯ]%P]Bj(/, D3*G,#Bz}vw_(Oʉ<%]R`C%Þ&F g*'۾Xdj;$vo6L;$D]o_D-P熂HU\k =%mv]-0W#gCm5PSjçny)H:WjHAN@ioÑ>J~(q!IUBE-瑠 #U 8@H #Pb9szlވPx#elGz恵c\ȝʁ\g ,ROih%Pc'"d_ѓDhG+ 1Fb  ڏZ:>ЭXeGv'F}b{#EdiH偖huI?w® -FPһwSS]H#vOsttm`ҤI&M4iҤI&M4iҤI&M4iҤI&M4iҤI&M4iҤI&M4iҤI&M4iҤI&M4iҤI&M4iҤI&M4iҤI&M4iҤI&M4iҤI&M4iҤI&M4iҤI&M4iҤI&M4iҤI&M4iҤI&M4iҤI&M4iҤI&M4iҤI&M4iҤI&M4iҤI&M4iҤI&M4iҤI&M4iҤI&M4iҤI&M4iҤI&M4iҤI&M4iҤI&M4iҤI&M4iҤI&M4iҤI&M4iҤI&M4iҤI&M4iҤI&M4iҤI&M4iҤI&M4iҤI&Mfdtw*Yq9e'kNܿ,wt>WuQqߓ{]{*g0k3u*ﬓ2 u ruL[]J~\zMuo%x^gz 5gޛ}uZk}wXwPKAM";s\wg i&yFݧφ[[-7u%k_\o\gVwXuP#{N ϔ>{[qo|ӿkuW`?6.5=ۆ﯑"?GG μ:yW5SY=RCuB `X\C\{zn҆u]{j[!ϓ&ʠd4aM}V%zk&uu2+Yu_]\^sN>便gS9RGu w xt:K{[o< q 8 3X#gMot]Va}4aOU#{ Gj6ȟkKWA c`oM >_BtCg Yv'¾~RtB0:5?9eƆn:qztPL>)PG[wPu=CcT7}B6*|@̏<%-Ki1~#~h>O~| sOhL uj HM58:̻36bw&duEpk*q5SVi Ĉ]SW-b#aP:*E&!݆a{6+>zm&۠pD6ĩ'~vAr[U&@cx團I*up5ƽd4Qգe&Ɣ 1K_M&f|:?[uQꠧ*`uαo[sT@ϔ/Ѐh9+;+2y&gtrAV(2!=;d5`w!nT%:sũ"*|_ U l:Z䙗)]gDnΆlZ3.$z q" VstEe r ȍs<(CN\ot`%ew<}:zj@ח+рwy.q*Unh_[ r&㙈gΨWhm?kiﮀ_f &vB"@ m:zKu̱92SU`ߧ ώoz!?Xe|u%22N@^cX5'&P5| K+`3qx%xupu8pf@RvFYU:؊軠[IU! G+`2՜<kŜBk*pa,c0$U(Hcex֜>*W-WOSe*ë@+`ֈ}pz{^?Wɟ[h@]MR]#!9MϗR?w;)_U7 Uc[Zr.&&6MnMA6j2M< 209VNξz6!u[/2A^m-]4ހXbK Lʜ V*g*kXo@̡`Є9d/gitO~; nk2Jׯ¹vw>` (9ք}ЀgL@@UDF[ f`H i֐p Z? 1E6 UTa j`bnpmߦU՚ fsegb3+L |yftRl1\m.MuP0B5ɚL[Mbǔ,y͏`,Rg+Om2"_=WΆ:4`k c~4>ہo3gF 't_\eUL- 9{G<_qϴi1:*c*'0yw5@m2ٟ-&Մ8bij>F}ʉA52X='O\ϩM\<> ` <ʠj]Pflfc%5+4{zLt?7ʐ%: k3:`7.*2_n93ЇG߱ 1n|';Ll󇈅k2q^5Qn5 ەƺax "PZdh3| sʠW ΈNBlUjL=sWrWM5TEp]&bLܙ\cU8Yd؈E73`K,9϶yZ}i1z6r!9a |&9v#bV3 w Upνׂ5M؏8zj,`bM&9Z!6UƜSM&/C}6+bE`CoB ]m>sԤ DI'濻>h0yՙs#Oz:cטg]'X3˼U&~R]`t[L-a^CL}.^S'  !cvZ5 6|7Un Z-*2 d:w>czKj폵-Uj _b}@?S UE1 %3uwV=ހ=с|b |B̅V`6.`RkjX6Wd0@pr՜uVer %g#F.*3q&'@wʱk9X6k߮=R5Ztcv=T\| 5oĹ&;m0&el8R0-V:V|{`[`68D1'bU]"Sc<7!`"W rU&-(}U|R p &FwRllp5Qֆ[ 9 vEu!.[MeΏf5XkZE>U!it r1UoummZ EYMV@W:S@sE2-\HԘI%X0cUdp"X70@=/gGjSw]bpW MfՠQ0g[A6 ֩7Y&~I E#̳G^:+ucrV"2 4ƃY|6%Ntv]n`xL7!abHeb%!oBEL /E5m7+4PXG@{A,mO2:/ȉg ߁%&XRͩmx66c/Gaho0f lViUgK0NQebj`ǣky6B~ &P:SoS ֪*ǺgKփe~:`7k`s`=!;Bʳfij=Qf ikg nNItL /1T5X"A^K r0dxZL1l0uAz@jtC 6 {n2#ڝ;x" ?1-VZs48 hn ~e\=A5'WgtQ "׏x ms0b C8&Ƶ|BD ʁݻ98&Gk*]k& Uj紙|)ѷ qՙAI N9{qm0g] &?׃eG˵I|2S <-`%֩|ya,sdeBSy)׵ZrVgj:Q{TL/됗˼:*3:h2둋 ՙk圡Mqs|UL2$&~EPKy &`|G087d 5!nfjpopد:B-)6!NRgj"ɝ,np&&bM0y_@R"YK99R{gRYgM&U8N|U̩k;c6ІYXe06M0w5&oF5e8oJ ޮ,.> zƜ ubjJ9|b(T'ͫ`!r3ཱ6_T9UߵNS[gۀ3j;3+ŕg nIX &7K~W];հ.x9ʀF|QMf?#c 7W<112+-23Kgy {'?Bm^nܻ9ڀW)VajL>L|C( /*8\.;kLM-2 Tkl`OLcF6\-^crֱS\_kh q`];`asbnHu~ G#{+ƾ S7sgH0Ou&V 9%OBNR5%Ʒ~0*B ku~hl J p\}z\vCshC|9 JrS,Aܿ r`k~=FC@֟5FMƾnX$;Q>Fbr̀3K9'bR\aomQXE r;bcw3b,yBݎ5- r!\o[Fs6 Y,7jLF9il^A2k# _5OR̆gs M#>+3R.A>W-5 ^bbM.a8MrX/rmjV>R`wlg0~-U`dl*SWxfF r)uKqMb\ 35158Wks6`z1/K.&Mc/h֘ڛEu:W[6u%gP|bsl<IGҘiSbsX^ˉږr}a9zY Mn}m#b58'`tQ߇,86,=& ڂ܂w%߷,n|/[?swQ~opA=&b}tv^^gj7kIh!%"ߙ{؆rvQw߳>wyf'?qw'O Anނ]-xmr^lg 86=F5ȳ?MqϨ:}W& ϊ+z$yg)G=w%Aw\7un>6ߥk* ט6sP/aО*+an%哐uCN?R5 rt!E\B^6;T'g&gnmLjOwMxkԜڠu%55>竃lׁ ˺A%ѓMXg9+^mI&M; F em$kUD si7w,<1=w]5Y'&9Ek?7Ⱦ?BjwFkݱIwrm m3JαfEb0g̫;wc/kge]Gpk(yl$jƎ``J:y-Iϟ]umu|R`آwXbCнFk2Q@]r:F-W &7ɵӜk Ln:X;G^>u;%׆65?-j lg~8䎷݂Z 2N"kdo -m."#YY=Omf_!` Oήk`W 6vAS,"˔&-zL['֥6Z^9 k{p\ P0Yu'4%<.6163Ü!9~|ve٧gXK[䬩M#`/׿ ׁq-sP(.߷ams>t9Nm\36l\`KNUE#P"(]_''u@te4',_Kj;W!>XknDϫ-7ق=mm{¾u5ニ.ѧ'r0GP;5%mbP3ȓA~6-i}zzlc[n ݅GU]AtJ9۷.NRc0fh zn4^m_m:JfN! Эo˜GM|=4Ĉ 96ɚ=,:w &"P& 4 Ry"X3\el:;to5,՜m uAb]Mbkg+L.`x{&e)OqKP_~ON3Ҽ@Λب-3:!ϾM4w 82~ _ dwauyGIFu}vKe6Y.4MG4ϵqjZ1}&M"]$оhG}67qą7Oz8R[KiCn+XkBŜ4ID˩/P4AQr4W|ɵ{)m=th } mbԉaj;Dw'Mb/]v;o:-L,eyކ8#p\g.ɨ?cY8۰?&6kF· ȣ4N=|8o\@ y*6H f?!?6~4L6oA/;IjrVo0~{kl@.bY-wNvM~&2k @+}ƃ6 G% q.ڞZj>_,ن 9mQҺP*CJtYE&9ɹ [E8AR0b=_EQKkp{ab `@lqg7!`/ e \c;A~9v3a^>|P`a >&O@{ 2qީ8] NgA1D0I9&il Jj1/8n } Q Au_c]/"L|A.8=h̑;:sw &>!jki)U=:gl{pp`o:ja'w6(qA#ḼIV% kɣ9 ro 4]C*]9>*{߽-E;9B&S[ m`~}&4~u| 8( g 0:5&&Յ뀙yMQ{>hˬ`z&s^n@αIwk ht0Am;>k-5Xx檛w4 x>Qctnu+mAOYbtokB 璧9C ':MsUF6^r!&'#q`ڐoC>{Rj춉 oAxbT7a9M"gE,KFLAC9շu׷My9[L]OJqU&^*6ڐ>jCgr`[dfjǚn ϰEp-r?hS ~1U`7/`?nc6ZLNgqb6ƭЁ`'`1`pn`_IsAT?v$Wlqg݂< ֳ l[ 9HN6c|Vpc\. $ A0`'^`z&?| tW bY[imIZx|16 P\6`M6؂\6+b;Frc>`4;RH̗v6یOerzyX{6!F)6 RۏupG>L&h< :G5$>+o2g ։s=ҳJ]"8%{+X&6S4AOݝ |L-ڄКiB`MkDswi0g[wu1T&*Ӡm`+mM xĞh,Ej}P%qn%ӆoΠ!%,m{3XOk; aF0C){;BήDoyr2IcT E!~f̩ݏ]نXF?hXTWZC d-ukrkwu%#Ƕ{{ GvXv&b[phߴ Z#{VsL|EsѱHu4fVNڄb̲,B5ESڄc@ƕd]lq %tD|Y4GL$n_5|0: xkP[dΜYՅ 1qmБ]Cx_ԙicdoo0-OA!B\0؆31iwUfoT ^];m3:0%L$s蝳fNrKGS[yA܁=}yG &=O\ޮ K^ab `6ud?O\atJ3Xɦ j@ r֠,=$)G1&MCm#|)AmAh#a<cemWW<^+Xi0q:S qC6ip&l0g׆}|E+Nm-b7%kJbpXm&A"f |`oMچ{lAI-zPEo>1:X̳h"' 8h߄k9L FihM |xM8;W6+w[FsӸT#76 @ώ#Y? k,?ŜkGܧ',okhB.$qjف[Flk!Ϊ{Ӝ`,*MI%r4Q UTɵv!L{b̵M`Zg|{w!ygbj<7øGpFa'ֲ#[6;PK:ka-j0`>߅.w j`k yU& vs2`_ޅ3`{Gu!F{91]i `+~U2+P+=h]o "ok &ZtrjY f6w99j߿1<m&.}Jkhgk<6+N}zU#قb:.o%kC&uF>!$rp*G!Ձ\van\UpFv1`仰7RWr/cL^`i=ɉ`/6 .@8lg@!5e .eփ,26| 8#a''`>c3Gp&Puc7L LJۀF bh,o (_IbZڱmͷHL 1.#-Ou˱6* v9֟[csod#1Nf61wIuz_9|jm}=\VmR牜ثJt&-0O&n${d !IcGȚ;E+s`/M7$]>&pn8dIـ!|-@|dNY.S[V\F{1ԂZV~3~9ijc/ &_6r0y4Z;z^e&I{`a3 [&k/g!AcݛP[xnf69ǎiν6Fm9k$%Uؓۨ g&-fta$( kwAoQ6:bpMg*r_nVԈp\j!5f B8d@os.{ a-XH(CܭKC6}!g1}vǃlϼMN8>&q`(,o/ť%䬎@ެ+= 5m~TFe3Xo18<:>:d90?Ԉ6F`!<{+s`3p}7݆j К2Ƈ)nBp QL o<1XL8^~!cZ `HxM/ ~\O߄׆o6` 0oH}sfQu+d[u$6ɾ; Z(V7Ї\ S  7Ⱥ?6&nܗ~#XWapXG!w 5D]<1,b> ʠ0.m38&@Gփ,/!撯, Wyr[WyO{n?p9Xu &Y`/M` WU'k =;My5`Oo$[`Lf-;mje|`g,W7f7F최4+>Μ X[4؅XQϩ\mM+\Wt6è0;~)]'ǙZBk> q@k/4_~?^D?u|SsD4,/6[gE؂46!^ItKO?,x6ᜥn^exbb]؛U8_ ˙p2X؆ԙxYUn|7;%8vx'ft<93#9Wat b˼-Fcxt|W01. 7H}&s{ e_GtoQu^oؠiOԉM؆s{+XIsok#@]<78?7?^jwu[sp#mXs o<,`a7W o#d}r9CP'ym3P/8]hKquFmq{`'42;KknL둚 6j31*p>̤ܕmn to 6vFՔ ݓWU|]zƴ\4]8{?= n]阛 gQWLȟn h// &M4iҤI&M4iҤI&M4iҤI&M4iҤI&M4iҤI&M4iҤI&M4iҤI&M4iҤI&M4iҤI&M4iҤI&M4iҤI&M4iҤI&M4iҤI&M4iҤI&M4iҤI&M4iҤI&M4iҤI&M4iҤI&M4iҤI&M4iҤI&M4iҤI&M4iҤI&M4iҤI&M4iҤI&M4iҤI&M4iҤI&M4iҤI&M4iҤI&M4iҤI&M4iҤI&M4iҤI&M4iҤI&M4iҤI&M4iҤI&M4iҤI&M4iҤI&M4iҤI&M4iҤI&M4ihmذaÆ 6lذaÆ 6lذaÆ 6lذaÆ 6lذaÆ 6lذaÆ 6lذaÆ 6lذaÆ 6lذaÆ 6lذaÆ 6lذaÆ 6lذaÆ 6lذaÆ 6lذaÆ 6lذaÆ 6lذaÆ 6lذaÆ 6lذaÆ 6lذaÆ 6lذ1Atמ 6lذaÆ 6lذaÆ 6lذaÆ 6lذaÆ 6lذaÆ 6lذaÆ 6lذaÆ 6lذaÆ 6lذaÆ 6lذaÆ 6lذaÆ 6lذaÆ 6lذaÆ 6lذaÆ 6lذaÆ 6lذaÆ 6lذaÆ 6lذaÆ 6lذaÆ A+Nw4`1֧dͺtsm: 37Wg \'^w5,=џK\qs[׽NJL~w|\%Y$+"2}U[#ߛ2\˺*5xvrE]+^䳇JfjQ$:Ygms~z.ϧN>F'=j:{k-))5uT{hw*|W|o^zߩhºH_|W鳭X  ﹆uӹN3uFGZK_|gy麧{:J>[ L]"wRpk:5PpkHbα"_Uwu~wIm2_ecdX{/r*kD_}^g`v s]6ɚ>~W-` )w}Y$gr@t"E}ԞN{7wjRS#׆3@t| >R%y'^,vؾdZc΅Gz=a?MH5rnеuײFUtq}ɵ^ \.Y {{>(3@zx)[:/3:8[+D̾+.k.2>R" ȳϠ k,]}x%h}F{6T,3vIxؙΫpW29W?\[L~V$Wߜ>2e8qFBuʰNjpV>yL-*9~UKs v +uVclNx'{uƞ:Ct:۠n/uquSw16N| " %87 V#(0k /.悺μgmĆI-}UƷhyԖ]cH[ DI32Ac[ExnRFAl"9R D]#U ⰸ_˰K9'q+&X/Tץ?u:+"{N~MLӳ*&`luX[_flVj_ϲ68㸻"+> ˔A'.)0ό" ֘8~:%j3mFC}- \:%갏+.Y"80|kU1p9`o5Y4ɵ Xa|*`agEWW.0B~7}O59?{#篖ݿi+/L(eĖIх^(KuaR_g2<50ϾJQoA cyW2cV!Gi X]S>[r c+Pbrhs+xrx>XrxVk&oI w~L QI"g1m5F` ]``n/_Caq[weD1nެY*b^w_eة\ ttO -5p@1Z62 PWrya+1:6+\"|ʌMyoK`9g;- 6!Bt;`oTWbk%Ur/Ac b ޼hh90X ^3= [>h7W06O `ɳNik#[3Y'1d\{%&quś*Alik1C17_{x'TI޹ClEaTɽU,z%b |kO)&;UыL0"d |O]#q/@^`DG+2(.R|یWs6UjwU{|9'K9A%{_cb>KD\s< |:O3x |`9XƞSQ^\3}R|5Pd7k  [R*ux5 R{o:0}3v) O}*ת*9X[pXTdk_1u.UB0"cƳ = 2A(ÙSel5j0SfuW۾6:YDώJNLy5D 99AƬG]3r6 `g$1Qg^q䆊0q$gЄc}=Ԃ,w9cp5AEeuXs [a}g&oS`J`Ok`6@'u|CJϪXc̓Hrm1^}mfglC@N_tJy> j&ďJ`"f\Le]PS_WF׳>Azv/?3*YOcpV!71c708EgP?sЕ Ʃ^2zI.FV\glZr0Wy5M7̽s2xuƮA[SW#^q pS\!H [/ ϨFs5XgA+0^:Ė*98W]4w~w)VX Pq6&7X$^s 8i TbU`3gW0Yg k]gr4Gm. F-/~AL;[Jl&EmOѸČcy:Yw! qkp:W `o[(}^[L^!5iJp r T;~֏ Lο,g\.Vek\Mmu϶R"='L춘C*򽜭~hCZbb!S*3:FNn0+ͻS7=;㢱:^'+ ~]$6GNˌ}9L:_p?0غ"%BƝ LXq!~s:c\e|" Ė+'KLA+@~Ñ1zVF,Pyr4R`l2`^m3جe8pP:U(1XSZ;c*cAgɵ1 C#k}c&e,m5^MU7X̵A]gt/TE0x̃5.V:-k `XcP95}ZuׯA쯚F{/Tau(=\&%W^crkL<Jr qR= s1gߍ{ɛwb]0털KLp@t5ڂSc< a!,>)Q5ʉíؗ`)Jp1~F)ǘӽg%|_^XSWR x>Dj7zALcW e%%P 8." ĽX y)~rkD&M)CNqIE.Afi>J0#hw[J<(fcs ֫{9 62r Iu"4^щ`Os eqczn2"ģnnCAr .n."ʽZfp %\ٚ=\{L|/]Bώ7-1[er0] XF&r~]1yb81<)`\AN =6ȻkA!6 `h^"$H֘l- 3G y, ^YzD >,xxU%`VVbKsD`Upƈm(1k'c?!w#3ϕ9X2cr-:̹Ce0WxQ1s^zbt Ŝ'ChMپ8ywk cIijkpMa6 9 ) s9 S`NEParE0+Li]^v36YݍBANqq\ jxG,לR^MIỪIJ92Boh,J\o":Lt[b|6JL,]4f|8)[ Rg )Bl<&oQat:f_&|WC`{ (:~Bb0T/'Z̃V[ R{@Ly%`dE֙t{ ̼|!01,>̜ 4qUh0)MfogU%X4SK9"XgZp,B ~(VrXf\}xjp^əFvضsrGLa9?6+0vq>c||5ݤ55b@H<S=~mM+5 YNyaO7թ|Mp{Vc;XD\X!'Mϓ p`^ @iN.cFc(WgVpOw!=K` #kgybG=st֗qX獞HeH.b7_)*1WUl Ɛ) V\*\Rݸ2X7 |{? S,\5OXUsrMyo㳾:XG?hz rpHwVIbm5'N꿫H{s:o{"gj8>uŬ1gS jr25ԃfO]2;(0+ m"} l>5⋭zh4U"q Ľ4~axQ).@>|o Xk GnGn"`=o Nw!OR xNM̍\5O!q:89nƵ [Ήu+^R=s`[rپ+kHc `|l1ՒêYBcU&Fg1ف]r9u&X \t 'Ģ˼u$[~fvaĢ_|_s}sn{[:Y9=>?֋Ͻw볞|kߟ̧??u̟@Tz['\|mOzmO?0 j=:OXn۞ g٣=M]Stۓ.>9Oz?}h[O۴iӦM6mڴiӦM6mڴiӦM6mڴiӦM6mڴiӦM6mڴiӦM6mڴiӦM6mڴiӦM6mڴiӦM6mڴiӦM6mڴiӦM6mڴiӦM6mڴiӦM6mڴiӦM6mڴiӦM6mڴiӦM6mڴiӦM6mڴiӦM6mڴiӦM6mڴi3Q]{6mڴiӦM6mڴiӦM6mڴiӦM6mڴiӦM6mڴiӦM6mڴiӦM6mڴiӦM6mڴiӦM6mڴiӦM6mڴiӦM6mڴiӦM6mڴiӦM6mڴiӦM6mڴiӦM6mڴiӦM6mڴiӦM6mڴiӦM6mڴiӦM6mڴiӦM6m.tt7>A x˂ x𛂠WAgAp?19u-#ApU)[_2A~-A}t^Zt/οӃOAP|t~z~u:_;/|t>t:ML*_9_6㦳?AP~g|ε (MoioO鿕;s?:12Q|tN|t^3G`}}:7wM٭OLwWN+s{׿q:x:2]>?s\ߝt<׏L`mz kkX^ڟNߙߜ]^OMONOc9}k\{\>Ot}tNڗOٯh:h:hY9}NkOs>ߵOY{tNs퓧sF8c7kgmo:6tLܜtNt]s&z6 *s9]cs+霾ߒ|Zxtous 1>t ~_Οws 5Vx?_9}/{)|t~WMtM^wO{+|tN]a 0_7_;_]k0}"7_0Džyt~tN~a $n~Mg>(ǻ)9]k:+ C_n~$?w2 濒|3SL733Ks[aͿdn&?uO`?v`n03bϙd.3f[`VΜ(o_'r_!s/9`0No̟͙?̟曄SI7"gx#|cs1y s?k˜߫\|rrw8K)淯0-g~g~r~b~b27*1_ߠ_3#_̯Yq~eίK+̯e9tp˘_| +/ʙ/Xa~4#Ͽ߁yw¼2s˜w?JY|8QsϾ;h~8Q~S> w̏|4?c0x'O} >S?w|x>n<s'G3G݅#FwI{|=`>c0?8r7Dw{| 99㏣y_yw꼷;lbS=oy+}wgc6wm~\̑{ڼG΁ͻ=sǦ͏`^isyѦ͏`^i8۴y's6m~ϳ6mT36mΛlڴQmڴy7ڴi.3Oٴi=xiӦͻM6m!z6mڴq7OشiӦ͏yM6mڴq4iӦM6m~Tq6mڴiӦ{.4Ap;SǍ_Gگ7sO=״1?_y +~7{_7_~CWUu_ԧ/x |E/=k)/So᳿=?KN藼{O||+s73gį#__?K>Ɵz/, O?Oė _Ə?KǏ{c>μb!YǟmO^~Ǐ[={ce>;sƏW\ȧ½/?ӿ{G_)3q~7?<~k?a?s7ԟ߿=~>*~7U.ß7~wk8?}P{IOW'-/}W?4[G~0~-{.|~C-S?'u>v?eO?/|W'|W'\=|Ȼ7ֺy?>ă|?>yo~7|`Ooǿ>~מc>\qE>]گ|_Ao^IsU|ï{ ؗGx2~?U/?q'm@~} g_[yk7~_~yw//T~ki~۽7?Q/0?b0'xhOe+7ey>Ńm'+{B~S9w_~~n+;_+i|]]}}_]//iO~K^x>+o s׎'W?ONW>oKkO{O>z|Oc|_~u|w[{^:+;~~/x?8ߩZ7_>d!:Yw?mޛmχn9K<'4_wBo;^Ce֯~o_~xܒڗW}W5G#~!__Ϗ_ۃ}|ɻ_}|x>^Nϥǃn<(=^;|SrMq럼=;=WK}uA y㶦Noo[o[LJ?-__:=~I>^C+ߎ{?ݿ߷B3_C?|B[^|>ȸwOύ{s^eΣ^篿xʸW~>(W|~ޙλ?/?ooxB/\6/ҝws9So;໾>~׽.cỿo;7s!W|Bp˲[}},|_ ;ύ/Mw7} x!? W`|ɝ۹qO';/|.}+{|.Kw_|K[/S EgG»?7J ]l|k< |ܥ7>^k9<i|59Kg-Igwk/P{;x;-o!YHg_-Igg-Igw-Ig-[qkKmyoshkOx;g=xكKsO}ү`|ًjW>য়|Ùy[,oɋS~/e=65WΝ ~˯ΗEyӻ>ksT yxsū[.sڣ_u.O;;~.+]?g^^]:`I:@-?:7۲t~V\9ղ,׿_/<[~/ߓ+oi Ϻ^:F7i)O-ɷuG/_[c%_| y̗ʓ.t~eK矪?r?o3V/^Y:?ye,?!/VVK^wt~Z:.n.׻xeKXY O^r7׼g5;>jM.[8%Oxg>j}0Fwt;M>Γ.>tq*sq;\Z8eK߻ä~?bwtq;L-uq;LxG,]T-]c%W8&]&]yekyotwt􏖼׻?%grII7ӤC/,yI4*j)w]2s>frJӥ}Ԥ.?1.y.Q.?{.|w\~c.]~n+]^.#]"<]N:|=N:ǍttxwWpCwpGw>ecÍUÝcù}J3QwxwxOq#QMjM^px_wtxew1p&M޵eM~wKW?a..]݈;I߲L~2yϒmW_fn*]ݝɏOru&gkɦ35iNפət&YM7i(ɻt&MޑALKKb!ǤIwtH&M~\IWeҤɻ84&M3i]_I&? u4i/KդI 4iG[I&M4iG]>&M4yOχI&M7cҤI&?>ceҤI&Mޡ3iҤI&Z4iҤI(Κ4iҤI&2pM4iҤID>3֤I&M4iMቯ|I&M4iF~S=&M4iҤI&Ca_~L4iҤI&M4yqI&M4iҤI&?n)4iҤI&M4iҤ{_khҤI&M4iҤI&M#7=ڤI&M4iҤI&M4iD~-|O?E&2nŠ6 qt'QMTFaN&aN>J<'aNH~hxO?48L'?;Kg ?;I~tL?^dp;~f[gO>;f?Mxv-`2xh0(s).zrxa&ÿُ̿G5{I?^]_$.$LJ8}s4M.t*!*}Oq"Ye.8txLfo9LNuc2IDp@7z]7.^y<$$kuvV(.>VY4{ѳ'ɳkgO0>N_fv)d%s3?D;Luz<[|M=6^(Dn#LJ'L/bfwhg/5N$ӽͮ%vhɵLff==o!ݔ(SgZ!C_؍NFq'қ:-,DW$Gs C%3S4_(6v 5jbV$kh17m ]3/l=s {O7G8u%GLg&k NE `gkLVLmrvW1˷|2/Fwˠv`g@a{xb^\6k؎b}zM73;N-,KD9ș}+k[w,Mq06f#9k=9θq3sJiLDVҩO_R[Qpq40W2[v_Y7':/gzh8y* 7=һ15D'sd® R{ѱhD^2qO%Y@ab`̌쐳hϪs)4[N#. fW$ jŲԉ%_J)V!*0YE|HI0$ { z~1ɵ|4 ı|[d&WHg2=,X-uf#9:3Ż2L* "iO &}pe'd\z^j8|1*L'>덱#\F_̎Bן -90խ-BQbӅ43;C:=fK[8s4fW~Ii&_^N4ؗX(}^\OH'e2ISԊc0W'8gݿZ=:0qnf9yd$Vb9NyS$y ~'9 ~l9K (=6%i35"G~a2(\"K՝& fb@ ςC7QO.d-brvzoG&Y4M#L ;+-T㳷.,@Ӝ;d&j&fbiYli}tɒ}:Sξ>i \k̼TsyL ԖH;_|o& x>{\a88^1fo%fOE#ο ݹ4HXB3;6F̹*pdr4'JY"IZzIzNӐ!+ܔ=5M)x#7b,ݹ/|('NeyUpM:J$:Wg٢D?.DfTcc3sTקb6wNTF^O !%2Zu58y#5`͌stKduIV"LXbNlFj)ƞ6Gqw(jY` NXG"ߖ;q+&:0H<|G[ P0Kcv 뾝߷_ȞIN[gI$O0UNodq*(Mf^]8L:([Ad/9;gV| z4I)h~HO;%qBkspRc4=~$fsD "D&-dzL C&i$4DۨѽQL.0[L!?)AYRL{^ojjdNg_ 'J=qqf$d&z~;<4Li=\9g%ٓTtV Yg_>,n3e:% |<8rhM.%: H vv;cnV9T$1@լsЖ$o؟!e)"@:1 vE)MtI9%HkM,<'͙ώ5Vӄ*%'J7澘}0(ώIiU%T[yv 'a)sA\[:z? DIPg8- U%MVe,dO#LUFՍ߲o[@Bgs~+ k&g$$r!WUyP,ߦ'憒Nt /%ĀIe "d3%"I@>IMO 4F:Z>NQɡID~||`X]SQqb}#B&vdEAOyV#Ezzj *9vW;<$p9ρxӸ2Q scLKZq_nGc,_:W@L` ۉz7tDGrv9YϧK> 7bFN\ZDO\8\Sh0s^iEt2x4Fa9~D#Q(tpd sxwVRdk Whtrd0 sTkt=)TeQ'ްqp]+RF |ŒY`=.e墓 z4Pgg5j4dϴ K;!`\Z_8[=b/*WjHWC8[5!ȳCJ?jh`Ho4y|^I\de Wr} 3g}e Ц gi1x"v=Lieq)ԙ:ޑ{|"uȢu"RFYOg%(RN򳡮/rrnAOĞ$|9fgw$hAeZx1R o>hC\@ٕŴdom^]T X&ZX=[KCQ )Ej*n/ vceO;K:B)ֿHk]xHFbMՓGfjf[!w7"6 zc$g9UMF yKIJm!K'ovx2Q͛< RҪәh-#a'P0WB{bz~-!WD:jnAЖl.&H[Qn7_r* 7)]Rz*{Tl\A3'8TeE3<ʀ9uE$j$aDc&eêV.O4|g3d+G̔{‰y2]hBR/:&8͖ .Ӧsv .;2YWij(1H(儈 j Ɗ Jjɰ=-yA7~!vQ}|tEɽ۫=:Յ-RwP؅Z-qLt"xnUh'J85ڹ=w}dd ز}c٫wyB8mtbCWΑ6s=Zy3)}`R?nJ 0D&uUiqvM(%#$ړ9ĪxT9DQ-ZM.m*xj6Z]V\9VH]+Q29ҬGzr3WE|I} h^LJ~$C•ŠyyXHvOF62 haԙ}"J&0uRTq~^^rb=A%*"c]+$0՞I&e2.)4(*D|:?rFU:P ѕ6KɅ) =:Sy*(3+4Tuo\]AD^@`˖*٣}ݲϓcICǮ'lVxȒUf ^tN# *^X/;N>FJ 5ʴa\N5TC`LG` ^ ᦼ 4RhlNű7TsQx]y8!HĊiNrW-BQEwA[G2è7dC/#C %_Ps?fҒ9r ?kՆ2A"vĊT9tf geIY$)NjIu* <^9:5_N@WjtENV!s)L`K0gD֪ɖ'szI-}2zMH'9 hJH]!Y"7EJSD[p NpXZP67,-_xx/<}t*&Nf=ߒ'm8R]wg<(a(|kj Mjb=~Gtf;lƺPI$Y`9KEBJW1)&ζbj<{(-ڲ(ȉ G6 '^~qy5>D?"e\Fsإ4,gq%1xSIVjzy &!0=F.ey V~YTt̺E (V ly}REPƥ xpMm2WxpK6=~mQ5Ċ c/ӽK>TUl_J◹+vp=tqƶL>G:_ w7(o]:eO@])F ZBJNKs"/}Se JCǵRm+ad}&2)&AT]ꭂɴE_Lo~Iz*&LMDB(uh o|3LބiDy'{>KUAH"9$ y)c:IW7?!OVxH;GPkTT1-)d%boYz&7?=S46 RJSmZ-uf¼7D>X/./P#ad;G=PeTȝ+{LwMr:Kq hFzڱ*Orrc3 d([D V5@<z+N>UZ[׿w:* U$Fʗ"e̎T`2[q[R*;Y2^HdhXkTɬCiDl|m˭L?NSJ9kzK4xUs߇$<$Q1D&NG\oz ENw{ Ykԙ \ŋq*x)RYY0FtJ"A^VՈBBx<B4QC6I,Chaԋ_Ai.ߕOW!;ށj(uT@[䒶Y0Vl'S**$#U=}m8W7Q{(N62]1z:.IE%ТV ӞԒI^9~Sl % 7UŮk:lDJ@ (JqhrSyOVj'M*sWɌ͡p0Ib9_,ΒrU3S7a).>C53Tkg2jX:0e󭲹R4Rp7LƈQ]Qt|5.k:ጰxۉU`zBvOy9NT=I$wFߔ4y]&0\oW’+]v=cbI9z#JIrZm<іZޡٲN2_k {jM k.5ۂ*/ &z̩2ߔ.ί3ި' dk$ڞRPeR ND[]-ClC*PaD34%kzKJY%XPOLp|#owE9hAΝsU},qEzmG:O-#S?!Wв2-`^ĞB)1<`` F%bn$qnpKsX5@pS_x-gf o^ :l]!*" U-ʔl 5:1m/*M5xLqbULj - ?&Q )GԻS8'l(}ZZ Y-:zGz_-+nMi8wgg"+7eBʜ Vjhjyڥ%J5Z\߇/QIGcR#Dv!9OiQoh飠tsrio7yBū$RVK!uk^ O)},*;serG^q>]s©O>VtLTu- 5Y6mF)@B鍫a Eܢey3 jǑnC̳X'Ij:&];&yWw$X'1I(78W^OZ0I(8Tp7(X#Ҕ6J+PW0Ǩ_K[N%)[$$PaŜ"?HԼ J4e9nIR$ȿil'ųK^I3 3W\Xcj$ 汶gǿn"pHݒ;L4rCJ׾ލ,x5X ~}x +䅱[X݉ᙃ(ѓ޴&b2I&r*JtY+.\͂e[gJ_\N%ih}" 2ZAR mJ]V ~+Qf\]5 f,co*CFa%E|ohRJ8ϱ݇9 c^ا,З˵Ě`;O47|^%o+?z b#RlpWz,JNUAZ;M-˾n\*]K֜뎣$ъ9LvC6!'M\C6o.3x-8c Qo:ܴJ ٯx!l\'v^ԽNK[9է̹*dH*{${eÞD*}ޞQg(oh5i2N<%f3v#RV NZ%ߓbd9JC5]:j&\Mn'7H"Z0mѭG}ǢsnO%Ɖ dq፭_rV~*}%*O1eD{Y,ary:r`YA?a3R0f99lkOTL8T2o_QKG\Xau3H)S堢PҊ[S690UB2L+<ΤFX%fսVaQ ?\OELU$̯22CY{^+/fgWbϒXde'\@YF$aRTɵiP.ꯔ "׸s;]vr jѵg|Ex*eLV&M`ő-3r"E=Iw\tՌ٫ ' _BqEI 7k{ied'?qzRg34;S属+콯4z3aZͺQnBQKJzAd&GtErl^9-l\4s瓫gXD0s[,:UxcfO\b埽|M'+DӨ*AgJ\0g&g\c;5&od EЃn9Ay9DžE5W︴{Ox%u]sBqٱ2E "%%ЃPf6[ IA~tpc8]x)p) %V4B|bq uNd8M2:T2;-v3-OjrM$q;N,N8y:Re'HE?o-fomeNU/š/:ڜT/+ԒVI۟-O4iPsQC|pr54 W\"7R.TuUe~E_4șJdjlPG>3OU aZ*u ' \omwtk(1f~*Z!v>˱ 2* k\;҈]mpjkc\jz2 ߈B~>JZr\"2"5ד4K!wE7HƦyi{fry \KSOTO4@ qї=ɗgэ 9R2|"t+nv-櫳P#g 'hHH#I.'eiZXmAJkgU= \4Y̎-(˵R|zbjiljMEօ4@ =5 yrw̘Yxu5b,**EIrN},tըsW;5\4\0^g)F: ڢ%tov˫44N㿾H$?=ankO"\h޲9 j u)b Sa-Ҝ$U GOEKb\O'U@I bKj'=5e u&YM6G5eCmK4ƋHzNqc0̎ˠ^>;G⎓8Z4FVDJ&ʈ)H+_l; zrIk3Bgkє L̝$zVÝ3[:Eu<7,q=5ذyg&9S/ :VO]Xb"LqW ˝Tuе5SsYTu$T(FXZ߬+uB=-"LVi^NRhL>]UTutJ \z<)9aX]Awv KS~Mj%үx2Xv ֵE>tA~𯆚FL\HGeBɉ5PWrO%U[rN3;QOnNߌ]`1(j_΅L~ѬHe{w7fhuճb;=/#U["-B70_N=d^0\둹a/n=~`&{ζ"4r. 'a,I~dx^ݬU4Uqf*_q0%̮{ھ~it*$ȫ+O߯2~ C5D=Ec&Q(Ǎ>mJQϩApVD$ m$Ku} n [?A8v4c8ijzYZ LFIҘ`X|qT1ez)Om<;%8 XNwup@[ylRN-MO$%$[\Bt$:t}T('|S~;} h*p\@$$𣈑%]jr;.67-z7dz. f)u"ך- X$]CyˆgG*11Z΢lO8]X%'5]ȂWAfMz/w塪5 Vc *ƾN Slȏ\ ꫖ΛBk\I}RKuQ' ?I+awӒ N|ػoq`-jJUll+B~NT}]"z>m(xvqrmr6Q97_7BK7=|PaPCebY++\Oe|Njla Pw';Vk{CЁ1i>*zd S4v*QawMdD)R6܋'ɩlcӖI]wE_ds<:Z4ԉ99ƒ RvV:5i Z[p*TT/pU/|B_8-]qry^J+ n;ۡ4煍}([ Z K@UWk7/UGR:DJVŴNY6Wf_IE4?tIW4*wUކB$.ؑr~2Ǟ^f~8ZZ䖿GS/2pUEv5itmJ=N.G+\¯O?EȒ2s[qFr"i'/,ԇ3}\5/++;w7]r*gPdnjDk㤥2µC)Ջ"֜F,堀K:qpw͜s|7>I0t"0\NpxIIu sv%p4(9Kڞ|í,zi'm$~!<>IjRm!LK_=|EP&;"ef?uּaWI/[)nAEy?8όf8e˵;؏\UcK&xיX,M\Pa']W;ʕقڤ2OAy -T&j Y̛kkޛ-8ڼ J\lk_͞ɖxaKO-4)ȋV㡚,ս9].L22cNTs-#ex|bAIOH2ӟqJj?Lr{>:Y'Q60|SC3ZdzOflk 'ݳLAv] sOޜ/pNZD8O ׸/&(wFuy= ]ރ<|2VUZ ,EC[Z5MN\xc_ bHhk2 ӰN;lf09Lnrb|cUD ŪD4g;#MXaY=qNj995_DUႈ竝=[s9go *IBRҔDVb3d(jAotJs_͔y^;R:&Ut=p;8c G$A jKmSճIXY;wYC't6qHd4M#Gh^$Q\W9H#-(QZ2^b¨U<ٰ,[&~&I^BV^£&m\3ZzB*:A;v øwمr \Ph.$&N%'ER>v8LvKZLNtEOǬ$ r34rOۥH*XcW/fHȑ╳N$(bd%ƼAL.;3oD̴x:Fsrv&+48#%TbEՑ .ƻ0Xͧ H$"O-~yNUkN.iZ4Ai*ZxX ޓ#Lj,y`m0'HBpa&*|us>LtÌ8,fF2Lv65|b;=s&=EEp%UN#w"F+ewB5`F4W"]Xk3sfL+8u/ y:rUj#'R"1@qf͚QJk!co02Pea>a>*S3]ajzWbo,fG> SqMo-WIzes4PD5p'\BNmLto4%']WLnCp#Y:ItHuʐME&k\ |soA2)Uaº~@7 v $||6EQ ."רx+ &0ѷ/' rNTKDM(SM^6Ql,tX|>mZN ~ +#o9)R+*kQ!ȭQ<* sw:ܗ`%UAtUYB)hFx E !MEF>eT)K7-P@u"L).1wW)bNX&t{T85IV*} ȡR(-E&y|G' q,S>E{*' bD4-D 'MO :<29k\@7xi,z&rH'ƒf":LDXqgqH(&eqW7ll~0)+}JHD)u!S\7-[WAqӱGuD.̚=.%wPF:L‘5J&iK!fB$υY8"_+@FslߊlU7m@8;4w/qZ }z5 S@OQU&4x {W գ%6 enbxhNtT(>0vDK>N]ܞ.?O;_ j%1zrcancهEq}h@ŖC؋J!+wOf害<,HeVGyU0BRX]P)8Ymۥܑ+ S%8=6h+m wQ-/KEX#g1D#$G"L[(fZ?)v ȅF€ؕ#rI*mRI^ ܎*a2_̎\=]%'['}˴k#uh¤ܖb,x'ȁ&|O|NOD6`s`P% ˮjAU$+,E@o.ajdh)FO2ءbc&NJ$2xv5KS>em|aCh-ū ..I\MutC~y!]g\1P,X)[Vr\\,|yxkaToS>w2fvoFÇM DU6 iKSRP8&[u;&[%7&YЎl'Q QP3H$z7Tu7h?mpIS> ӁӵIjKNRtTЗ;l{} Slȷq+֣M1}3gB8KN˪Ԙo3f~mO >D`n+M$@G]+tme'7N4[ We;[~ҥki8[>FM2z|k,H|jWw6) b [?,8ص$>bYMkZ!A+*76rS)4GĤQKKdkS/9023DD!((}Qӏ[k7YrI$3T(C޺N 7*ʒa>,EOtaQ kv Ƀ}>4 Z[_R} c k5^TKDM?0ui)͐x"G^}bHł.q)vl707$CC決^f4JM$Q %uBڕ3û$OAZL/d#sW`NL%<85YY lcuAciYA|$z9eV6ĎD\Ѕu=̓k?BBΖ*]qKBtHakS Vc=mJ)Y`43XA!:S`*'Q)cO~eМ1js boج:T$ZsP@B ERގVTH ܕ+FԀ`/J<_mlZ4lGFAߑF%KudtG~@P$ hh(EhDZɐ^(GY8%C{-vA{'"y_O"_B;h AWFu{kvR"0hWk(5Q9/m7zҚ عj *Ku=lG1b+)moN/c}}MpS@uf:swJȶJt1k iW|pϲ0w䴞R K:_RVCe z||1`gz3,Uؓ%gREoqC{}ĿKD6,jϺ`JG9):K,0t,?Cj '#h1-ʮڟB"iXG(oI{A*%[\Vr._ѐ"2eWQ&qeKYY{_GVh嗘HMT8KfAye7Sr3J] `džJx6+Q&~Zf&u\(G *;yB@FQ|'9`n4 R-I`G2e`X)?0O,qٔ*sV.Gzo?fL|Uvdq9hʐ[VYC|_[C|w-ԙb;_nl%qqt4@l 0 yz,+;  Mk?X3k;8X 0?.یR:fE<.! v%kQvXsEڐbX"!`2+d4HN筝?|i EWx$RJ1MGP vt{> #.MbKӣ?&FHeS7y5L} <= P[R05ߥW(%#hLFh*8/Us9^>c># GC"?8jX 3?ƫ5Bj`F3]czx|Lj @"-jk: !&Xɒ5]-껬}&l;;:cWfB虃JHM h_1 ҪSzY%݆bhZzR 1/(aCXt_+$Is7!\8 GlܚWAl!mC8f 2KzC ^^W5!ח*oH,C7Aλ m/°TssW|/6-0h{(9zuTsaɬoƺ$'8EV>D)q$-.HgI=Ge1$q;jeclqYS|ܸ'uu>"{ 76gޛܔO(uk T("7^%{]?9D+g7dK{7rj# չO5.mԠtvRv6QjD Z#2-c0|fNP^-Vn djz2-E*[a v{_z@Rt$@tM*1n16T6@L@}Չq GMRT vUwYc)M&MC̪G`R]`uv5ұ`~.`PUi xN#$Q"Y&}}$kB^GRIS}60v2̈́%} KZ,c=jUEz'_!S eyXU,$TQZ[f d.>WDr&9},^H³ٮM sX\4X [eg# 2PYvFmö Pl#UܽO~moN.q"M 6.eUU"N/W9u^Y]Z~W%QvPz*C|ˆaSwg:@Z^ HlI*JT+ƠV>Ia2q]4pho:+('-m0_[w2)q¼2٠+jՉfx)ى6a'ZLL,osV$ $Buvop6uK"zpuiti#Nɣ$t.|Nt?}r\yDr>PUߘˍqbRNb8"[h-l}0H-':/˓'˜O wP[#+zpFHbV)qQ{5xj.I KIXxI<-1:bG')nn˂wCmg֙5، s "!v=Z&=s"KYtJiC0hEHyxXC}O1Pn76Px'W 0!u^1HijenZe}kp :7ݟ̧rȇ3d>^&(QjBK_j&\z!u{ +~C%zt i 3;.:geX4Fj2]1iQN\Ut0Lt!֑~uHTL.3"K piܤ{B<4Ep9$i'*1B/ǒZAx呰J@ZV'5Tۅis& tV#[$edc0tnӊwL7w ^xEX]cX96$ǰ؀2`Up hkdNr\NL?;ɖ' y`y=M:oǪ-dN(^3Rk/cT@0 Tbӗ%7-쏤VT~sH}TJ` O=7I].w$ml̸j`gnS }wXq"K))-6 U)K͟Ҧ? M28Ц_Dhi|%(Qmpү B֖jHbYk[MVZ0;H(vS2C5[9(7WE{Ju9A1sK zֿ¸'r|,eQC:+(1{:X+}j4qP k{|zͰ@lNn͝XO9OǺVkKQ,JUgG)*62C*J#L,VFM!l|9WH D]VlRΨ4׷~İNTm3 [SD h` ulţQPQ2hB@kٴ:8±pJJZEх/'2ʅ#mJbR.obfM0Y[kd'bygwybU *wSK ٿbZ=ezDD2-TgY"Es 8(.d&"J n1C  Q=v LЩf` q\(b|u-;~+!"Oi^D6B`PħSD(Ju&obQy q3/3ّL4(Dž5M/ZPøcɻOxi";3)+1}Sz\K^TyWz[mQW% n$s´\?zsރ۸CD+%0E-p΀QԎeH/ t82WBNIVE0TFI#&SNQF^؈ER /T_;2C㍕߫C=U~#7UT%Jm9d^_)&c.nW6U4WqGS#<Ϩ(&gh[î)d5Qk ku[]e_pT}MPtW|'w1PwI'(KGR9Y 9c>K9%,(uqܹաL i7!YRz36f˒h{:˼IĘi"pan */0.L᷉Qabmh2G^ĩSƢGME ?790Cd1e"(/`+unF%9W߃'NޑhQ6s6\W wFtAzf $|bN%MP 3cI~b0!L\TpxӻT7GѾH"+}$qn !O7*R,ih\?;|(! 9y-Y]C6q/z #Ӱ'Uq \ȧZe3k@݊hݤ xIZH>]GFpw+eE nI69(l~@[dzJy  c*`Cdc\.ph't$1RVlTkܜ 9]+ўCX։,Hsۨ>vprnrܗ2$ yOz;?@'xL9g_˗2eM}i,:Co,/iTUZ&NC7FxFTĐ*S*#vcfp-y5 qR L?w<0ˠ Qg( $H 1&<$Lnp>T}kXDH}JfӊCn[ KVCW.fkJ>g[ '^K) %$1Kk2Bb~3ui`G^]T req+6t۵p!cMil8ݻ6TU #DT;MHRSUT;i}P[@>c ]OSv|ռ:4/rxYQֵ]Fh©+&KKs\9-M dz Zߗ|k@Vƒ ,7 M&v)i5ȃ:(!Ȼ. @;bIDxIvW(d# @(H$S#s󳵤MqBa5c"zM0n_sg.uU#>T$rA+4~xy <ǬoQc;*[lPfyvrX_.7I Y̕u(Rm)=T U,_,O:۵sR5ZJ?y;? d@V]Wq̼gHߓh I)-C(-$#7Y喷\E./QcC5v_3Պ[n $1@=Nr#=Qlt0IUmgE? ݀1oB劵UsMd8m(AڰmcF`݃#&1v]e.x!n"n\R[ /8KHˢ K42f汢[ӭ$#䓻I,Ppgi=w$~ [eK70B`xIyCrCllՑ 6rܺC[ǫ`gtӺ5B)\_S1sҐ}ļB?Vc<5oWN-1CEOWn-4f޻T!(&IV VAl<l BN„<j-'IT#c ^>^"g8ND璢߫Bk?M 2~ll>jp7q#7Hrk5Ž8SZ:NqW aeZ $̞VY`>R;AoeU|JTk)W9z4 XJΞW(gz vNț-#k#ʿĔHm<:@\= & pի{^9+f8}fZ7Cl) f9D}$-K2C>FU%kAu}S c#QIޖ@a7'DP Or;:@ғcՁHFK@!6ٌrEEIXؚrtܩ  Gw)%T8dm:$`P9gE!X< {ՑM.=d0bH w[e>qqb|60+ćF^QEF82lq$c%#6r0A@ `3*$LB\S`)RS H݁`NUC PLirc>UH} Jgk/a31> UufkCrJE}9V 2U/,I1>-s%"U'FK3Xf)[vD}h#rF0$57Kz'K h?D N]?pxn.n IE!9Osc} ⽊yYO=oyLټ5ȺK۪\L d]AEx _Q:mfuNu048Hh,3r+Gyjl?]L g++Y|1ھVDXU2>9&"?-Li-[XEA>/jܲ!|a-wΔX1 -%fòoYZFN~`)1bÝ7us%rrM͏.HEqx{Xթf&C.lj /w!*R6x|d_m!C e5"Ð_Z{5͜u3(f/e_ƚɰG >EB~&+P)_|-S]"A˶&sLu9+|qeÐ߁hQK݉-8 gzRX/LOطn8 $Imԣ:$86 f1ИOuaŅͬn[&ԑFV^1:(J 50wk5cV/T4\Oo}pKjjXh .8Xv.0 ˌ@.z^bLbRMGL*89Dd0׵wS4*d lM%Mmw"ITHbrc$r!bD,ͩͭܨ=ќ+hVTDE|ڏ9{611᳢X%E "03꜉8rbq,Q3ө E R5.U]%FBYPdYMgf=IZ>9Y+z_:G-ЎCrF;ua[uBH5oVgZNMVHoJ#@1(2,xqKy 0+R35f\#iA'tn3r'NHps{`q֥sAM) hR xX:|5vj^Hf ^|h D~p|DAE.P!w/PJqjmyC#6, JE2L'֘hAz?t4֝6 tf[5g[^]4lr7kxl*tm^ Q?O !XӢ23k܈&DCIo`Jy;!IaZ- )wH40eUO6GYY܋80)7~~Nrk7` *#1\p_8^B •G^ wkWA)i. =2LŹG;׭Hҁ8Oqzw}k.l&,6>A*>Ya+V`*0# "5`[11FR.RŮwT1_\1^u'V$6hlS_JSkc\EZiɭ#ۢA$X4lt;E!E)լMbc`-?` gaye<4X<@ uԱΘiKJD@ۡ[9{{IfWZcuazԡZU c|"q)͒"⧴R%bs9xMpܖ`+oiFzMsʆGߒU⎤ܕq&ӹRBB, . )NA“#]2+؈Uȗ8M]E-F@-q@COxm JT j"JT;c%U .p|F!m||VK4mn4c '۷MuHyݙ@)/5^EXgV({/f #\ XNt+%T 4 egbts.,7911X lh4΂YkvX弙&6<JN9.V͆0PH)17O|_G~B<,8W> 6Xu-_ǼqAc6NX>& ;C5qWZ:Gr^`zk@ E}ԛ/dlw]2FPdW[XV>Z _5qbBl>HM !Eêko/LLߌ'a`."ާ)| JnWwbn"E!i}{6yAwwi〵N /-O Pߺ'Bj1iX⚲ܨ!ι:IoTѦ'1o=Jv=H=WrXу Ѡ@f\ǑӅmqxzt[M(U**[kWY/zuV+Y S҅SGS\%ƔJW//IG&s`w/𻊛7U#vU 5WGjUR>d~s^UtKFS|& ~m.ZZQ!.w%r#[)R٢r 6[z٢CNs;̿w!sp[X; ?tf٦֓t1'hsC)UL:s!ATmMA,Zl(;}JgѶ'=%3(R{җ%0ij]E8kdrHƳEÿF;l\5(Mí'%0ֹ23)3W oʑq>IX Hy MԡܭSXݱ2#{eÊai%eHlg)!Z?+יEGbv8pV5+bG(SY4`Q }|!z8d{O0vsxɭ>)ǣUƌDYqd}H͋hz#ѷe"UeP!N.iR'-´|(ۄ~*42sʦj@> 'LZ߬O^r%TLx"D~qŨ"#_…%:3PBzc .Q.)ȂVRu˺j{ j=eR1u42Wb!5v m+;)zyJh>eF[S7fER+7!ɺW'$ OBuSuP4hD>Vq xjPƱI_nԀM8q|/2gFYDᦫ~6BwQg;@x,WVCwS؜?&K**1uX{Ras|H!Ug8;P3!;a,'vWjP៟Q8eҮdK#9;/?Ū ߂e!^G݅ j9|552\VϞ(VƢ EJ (Ѽ+5;TBÔru oY2{ݘ_ciWs@894Xn:ˬ{Z5h+V[I,gMH]~/ oQ[s&BT5Bvg]m53i3_g7x,#zqg?0ܮY'-{ Ɓ;釔)4Si- ?E@ҭS{2ߐ&rp7)|"w)t5v3׃PsEQMtNCK+&'h^"srNWw\M]6F,Ѳ)&&h֖i!Ӳ(E ݙj(":чDB|s#]Ze ;>&_Ď!]]Bp9 >$ JWnD0%ɬDN+f`uG@y̷:NcNQ & b\RrF$ w-#t8OCV;;Sۖq5{O\52 )]lѯɆWK~{b$ʽU>eP!ٱY(AaE4h'!P@Lj+BoRe$L j{Spgx=J.X+eIS#.FiYskڤ:!ʳ^9*;J9%4ֲF}@gk,&t-[D< S+.:R! *P|_[ep窐*-KB^ۨ9^*k1z12д+WVY/Օ󣯷jC~k&%gۣd|ˋ"oX XK9^Akiyj_||vJk#G疇"aҜ̊?< E? ^zyā_^%K焴ȉZd]sT(\ oY|x90nrnw6Dh][ڗ~{l\ᵣ4,mkev@y!AOMF8xYUI'Y%12)@R&*QyV_&wܔ6Qq qjrp+ ,HۡMCme~QtFﰫ+0➞@G5Z5V:s=JJ4X,Q)YJN]Ne-oPUd6i," ։?F-^ǞDP٪9m;| ZEO#4[Oo]*u`kWԳF>{*e[DvcV"VG+I(,> *U-'a`0#j;7L 3w<1伾MݵrIٸ Z]䩈3"ܐȞPp&]NڈE \j9[MlwE'~ŤƗDzl󤐄:)FskOp7%nSu6 ۴G>gwq%z{%dIڤP6 o+ϧ"v)5ZCHIt`U~2S~()FV xX RTY &Boj8Uc[ALgiÇK8wLH&,ֳh/v,2U)æ֓4x$щt7P$5@ܤ8; d:(5`49hO'4m=}摳8(IrP7lw3bKpb!tRI*Jps"4&hIz?r($YR(uWC8ʙb<4F%u4n}& -1ݕvCF?Q׭B.T7RAa rd_ *!ܖGI)#Ǵ/TNf9⨐T ™W.  L.`q{ͲcviUf6L;ecRobE@ҨmבC깜-{fWwID~[b*YwcZQ[bfVMB9mĂo-U;"Iq޽'&[|g`md]蒤_q@%pWv͒pQ u Be\ׯS}6Y68Moc%REN| H_Gbtۼ21쳍utȾu ]E֧˓:5@M]E*9jU%5X~4S9RcW!Oh̯~?O~[׮ cH?Es37y3M ֒e:1~K1y(e՚D1(kyZ;k;]Tj䙺f,קƸkT}0`[JZscF/iӑ 5%:X K$XcKfOFH0q&~.Z~㟳$de[%}b~\X6!?ԥ r5LS%O<5e;@M4-ۧje40@AT"΍E6 {Q=IZǤOC ga632x#O2ML)t("'[ We6l5?:\5cR^Cp/DM i\@ i*mVu|ԬvTiEs*6:pZcϞpp ip%0klud?CaWCU:,cHtR={8 ĄśP/rW";fz`IJ>dIգS{Tu˺z pWx21S5=q4uoV6<=[( Q@1p}mO\tGo=]AEc\5@ šYSZ]}z/h wyrƠSs3EP (E3`66X-znT5' {c9$}m7+6:6gz eTEF左{{t+5Kn 9~`"/7( 0u ܰFRp^2fkɶqp}\E^Z88Ug+(h (}W3/9x%-mx{5[UܫOam -!B&6O7v6 LZ#kLQ42 ^AMܾ'eF~5 MMR2}~J4+N_@cŠdT;* .^K!;Aa0]⦇c5xn^eiKQխKaumx31w]KʈQJA#P67IѷG:~/kǗ|zePj䀜o֡/BrX[Huu Z%@3T+N$"ꇌ,̸#0?YaU)PSe)A G\mPQ,`mOdq.c&?Ev-3q0#TA):MɟTefxxGHcV. ڕ߄Q]z).7Xe[1>O$[mX.V?W&1wPZ|8xP=rL s|jS%}bR&Qa['apnTpwzw,ӣBd%5urF1*ɝ>fp)O|H MCL|]zdi!~q vf哵h)s ژςf$+L80u(! G}hBA}X7a@I(X m݁]ҋEu2U9.<}tB΄\9ׁ YNx|Ӟ( :+!8*C ƪakI r}P9 $ &U>o$jz=v =D {d+la6Bhߞ'Öʐ596&Z"<:8YRb+rrKS͟DȠ%X_tRW;}mJl/ojA?FJa_Zje@ 2 KGW @o%2 2R %Vky<^d)u̥ 1M  gd=#T0PI~0*<׎$mk͜3)Bƙ4oQDC*ց g'hn?7N"\(qtzuù3Ff4͈](}"wrF/V^y i=o7 \yln̸DZRwڴZv ))y%LnBJB)F%Mj)i[.X{Ţ~uӼi{UV zqr+X`>at֡eQ]DEW';֨,YB1c]ڲH(H3 ՛|))8na+,}+ Es áW,;3c4tJ/߸!I,)HsCٲ G\G1Vybs }U4^ DVcKò69 u[ZN4sV( "pl3t WMRf`t.GŒuo:v|GLhT;w7fKrICFMT? !e-$&Id9b51@w$[$`”>%/: Sw%yi`!f, s?T$h֠"5Z/37e_c&ݭd'@{O(/y˰R˹ƢZ6{<͖FMH- ^Զ(w 52+#w%T&]TqEvZ|5|u~Aj ER4A ͈ZZ4"8:NΚ zbaMG{d?3 YbuH\^b>)hIZ 7$OV=1t`i%'>Aj 7KbŸ26X'4yTgkAxȧQ>4?~H%-6fΌ~HM\8J`sɯ?Aͼ.{Ɗᕨ͡u "ő>8%Szԝֈ~X34TJ`!-.{2Fg{atڗx"C |UQ|9Ɣ+3+ d֛H5=f^_Fs5ڨqlfcXOMH'{%i=Jh3gPc^D jtҔaѼhl?Y m}8e Ê;Lߍ\dnκҸ mڎX5rz I ud%$|-м$I|$#*ڀ(tRj*&VcJmrS#::FFӜ:20m(5.@#.Vue12W?лHua/4M]ǩH@^; FSފ4適qC&2ɫÂ&B:2RCT?N)#H2J7LM #Xd'C t+㇐f@WDͱs4ZOy1 =Z2^E 6f*`A.۹,vDY}k!XR2?yeQJ-#FoY\|AŌCm[,:t};\s*[ b +bÄWУ4tḂDI]=Lz#jh, o:Кwq!/Hh֎<њ#&Pr"8Ϲh ~ILb+]8 .[ȢI틜H`ݦx6MwߴDDPÒB1$P&,=bpmh7J|I1N/FftzW"wQ5wGO鑉W}R'f-WIOQFb\#An"v 'b1r<X.sWKh#7+P K)Z*!y@}aFDI& v Ī #v A_֜61 Cj%C[8ڴ$%~Գ8~Ԡ6v/׽Y)N_Q$rE@~鹴ũC.2J=h;>I Q9nYĕE#fԉ$ҥW7K,F0mw[' Qe3x̕roq>Xe] PnE͏)R|'ucп{ӫt(Eu*!ı%n}Z*Z=D!JNmS N2Ԧ$nt}D]Jj-ϲ"L G[u5.}U͎~ƨpimX]*n YqL[V汲aO#BТɣ3/a%!Ф y} *=@@R$jK9.תۍqT..-5 .3壸eh|=&*3@-t1B"O`#-܏,S V90VM.àNUvp( \|΍ ;tjG5LK\U0{%/f;{]j ]!x6M55noBt:1#8!(~n %6&GL9,BTy^q젆sKP?Nh PHz#@D xQ *:5!Tn]*i\^-aF`R*I %/lVM ԇX١4Rz' zNqHQ3  o{Qb:2uF9'SN2֢X)ȶ$%*Q %.l4/#B@Vj2SڈPQ }cP@eYW+j*n%CW743U&&.ߪ0zfiZf}q[Rtm-%1_zH 3)*Ӎ?-ԣo̓=-qG,4.=(m\q?rp⽅̓q j#G߲VC:ykxH_ﲟi_K; rT11ڌ`F{7T\u*; |%2pPJ%L]&s9c[#vfj7fâ@eih7Y&:gAdr-%k׳,79[w(I+2N1 cPc:t]+ Z O(Z> ZЈ ! ~. EqB&2zN7aj=*c؈: Xh 2ٵTQKҨLiQB`_صBmfpdק]@ee!mM=GV\CFv~)9Ƶ>7hJf:y ՁYc%E thd[MAHd؁!867zΛZBɆuky+ӣw"ֱCn4%AW^uA8XA,t,ң}S2 |CDd XźF$#b;w+h>D9|Dp##P [n>ɦULV (vJ5o纓DJ jDDMVcR>)ʗC2GA:=t)H%9Noc 8; -nX v8,䒰qch*my.Y#ch=w9â8Z PޥtI\Pۣ]׌Z{ﲤ6|k HlYhMXyP|-t}$_ Q)/>LJkb_GA))>K[챻sA͵z{Y!<VKY83ص,{nQ3JDNbnUFAJu;?$v5Ziv @Xף7\= }Q.Q9e\! 8FzMKh~?KQ%R~yuGc3&/tS"m.PPRyS w|PHH^2k>z˖vV+&ِF1Bw<+H XLȥ}2 Bd:R") )bYe'YO/V8y ̝%Y,PObBp&nSxg%SwSXJ8ZkHdi'$FMHr 09H`ɔ/ylRDڞzpدAmdj݁1  z7ԭQ6҄昬- yTDI׆h]%Ng;4EQYqP8|9Xďj *:w#vmyKNXXWP wGc >1bT \n^tDT@?yX)zP$3z%o($VPÜw"qiL3WA yzNFvN_ȱ-BÄB%4mF2NeHL@P@S4?W'dJ5?|J!N,H諸P} ?6GȇȬp7c>Y?AV1(>qdc$PɑTр SO J{ݵmc{Ʉky?q7sBr;"K}b+lyZ i+ؘсώZ+Ρ"rV^0`jZe 4!M_ P!AaEc %naWa2b Vsя|3hz>& mrǓc{6BhH4F*ɰ_ `\l x>w9K99ػdm21H:5N- 巉T{O$ ;AR} FPܺWC5"eqFbSSnVbcUHa].rʀX:X3[c}u{9ۉn{`4&8& f A#qZDXVJPmԠ*vNkQɴĦ$LX1d _mV%C/_ 5:HNc-}Q@Z t`Z TgRTr/eD(l\? U lJwnG~.o(lP X2~sx(gwgY[Y{ZEն uƼf5&o:WkZWQ#֮U;'o}?"yJrȯMNoSQ(Gt9FZZIn Qa?xcD$~_9,XF;e p[&8gچڥ30I]䷤/rX܎Ƥ3dk*szJYK5dW{5 ;[b:aєTV@vfRwJvZNHț}.9= 6QŵWrw/1K"9 `>Kj/I[U8kjuB,럩7Y >'cWr}C5,}:O1Mg/x=[x?~5[s~aP{ r>O@Icf0!4;/. \1 LR \jRުK̈́.>y_VF1'8iF( ^ZkԆ<=ɕFyB8* rh+s ΧC؈h\)?ս)V(ݧpRMH> H7I7;4˳DEx&ִ>ӿvd1xo&t2 r9YLzصFёZo)eO(I.HuvKXiRtZ"BuMu2llNiSv /G͟PbpLdO,h/N-}-=@l 9G7_\>SA#PKi}њ qV@`#d찖>h`\Jrm$X2ow}]^,BNJH lt(9('өɍX5PXhI'6{ U=i!|΍nPq`k=LꤔZ>>mHƊd\)ی 㖭)D~JIC@g šo:NڴG"# ]ls(L6dl^EVYs5dO2kk~ed~L#ܶRRCP)Khiw=L ̇(n5.~>u a!>pC!މ- zy16X{_n6r96EU8R`t }$kU1M:O`^~a! v`Dv7x3*\" DBqװ=سx<4')@JT|Mx2u\\oWڔD. s< udb6Nb;1%ʃ M|yʀ4߆#hH> 6$:w$]nqƌCxb!-Z#au1;r6]Sly<{7Ž'z8Af Q^ C,ySV =}ʺGlj6Ht۔cϷq~U &ILbn\'57<$-|!7NӴ| YhI+C1 шqˢ1:`sMO47~UȣC(חծɺU^zihX(jY  Sz-5y1Jh\`2yt+o+z5+l4[y6DQ) Qmό Q"4ƯhX9C2oQA-JnN&46oM6w7PIM Kǻ7"f-:g:Q(nu{ͩ9eI5-n*:{F"b/1Bu ^f܅t5=7rRRpuB1{3JJ@ K9Qh p_!5E-*4㙣d+@~NP>Xieq=p{R' m\8R/4zpU*k_kCo$~ͿG?ȟ51'&岯E3c)K{ g2">"- '+ $U-wEYNRR9@/u}{])v?NjC, T?L_;J6qJ%49T# f$}m Kkv4 ^''ZhFpuMqT-"2_ɧ̙9Du%VN:ͳ46mɡa+ 9Wttz7eqk.4E1D]d oYRow J;WC]^y>!-m.,7ЅQұsE=e3m`ь.q.lQ6ADfWLێdmG5UP@)v{3e E S0MYcO%D>,F)mؾ?%o|rn2כ!b݌B-iE'oZ^ 16x5*}pX渓h>ˁA+ǭ"It1;SXdM}еUxrpΆ.wp 4cv6x5>:t3ig6jZD mjg8xs>n-۲n J%ݑ˶Kf#)0J}ddv8x"J>ֲc%2?ěò`o} cbbўiDV|5ڙ6}Wg˷(zr P %Zt "|wTG-׈[x;'3&m&.(> aRQ+̦Li{Tb׼dr|.Ӗ+fBiPVĺ2XBC\Խ+Q$ݳo6kE{W`)4|A-[Cb*HQiZ=hc]GBm\8Q:xg*٘!P#5?FIwy#^v\PWa^%m[Q04\qe¹;tjgcnb+K 1Hkk#A ?7}6.H;$M3X۫mG+{=mސ:Z~u_ aqdB|dӏ6Mj2x[4 ڡ/  :=]YP.[ΡA cH\9sN`qnf,Ҏص|MS|HAv%AdCl{~KpS8Zk;*Eu. \TnPvNk.sә0M޴rd ʝ$Ghm]L,kU]&ES@Û0h5`s`O(zfQ#4:Za\L&q3,?-_l f7!L= ~P2g2?l4N M"g:r=ֆALSxY9H; jLQgq\̴|!WhDR!bgk !YMb;#Qe8GDDNn? [~hJ#Je.1'%b''sҔ!VǠXְfGhۉ\C4zN!+Uᇼ-̢ xҾH]噪bqt6m"oD+JmLO\H/zrZoQZRDh-~&:jOa^ kO^ 532QFiݐONV4ÍhuAu㺓>4mY,T60 2v]\ue :.Wdg ll48=[`ep~EI4LJB m illwZuaӣiTUB kVU8.hMQ(Ba;Gh_V{!e rƌfޢ~&V,'.cn=׶$*Sv8XkPjn*TY`㝷9;83v>e.S\Y*ht;Z|B8EK6ci=Ql'g,VX{s_w mtB ^ >ߑi7UC5$3}^l11˧t#NT~l}F5A zXY[`YcX4WmVh4fz$+1KqXQ/cZٴMPI^t6o7bDxE"kg+e|QA'v]I1"eOk,!3^mB$(s#w'mBVFqMcҵk9$\8@+DqSxwkIМkTCZ!㛤:LqS^VIBc(Bکtn=:ڰ u/b_j+(qmoz2WH: B^|]p¶AULVjs dpy#n-Up j L.04rkdDF:K`F?oO7׆RxH%h&\V*8Ybsf՞OQ@efl]—5ְW#~V^UD_ Ȯc{B2&ooj=ҿEQZcjC܏~0бJ5R^&PYOBNӞ}D(Ф?>jks-s+>kY17 V,/݀<49ke[ӿSv!ᷢ t 7zVȅHd|e#xKK#bSkH(_Bɲ̢ڝ_2EW h?5'XsyJ}mnXV:)eԯYť:ן^_`}˰}̆DpVzɛx(Ia;5H2px:2 甁&u)x9[29G>}Nf-[hH9`;m5Tﱇj"Bn-%4+b7]kzmΠlv֬d ̆=SPTOM>Sk`޳4=aʇPY.FsK19@CO/8#6ʉ*"\$jalz}ĵ+<=]\)3Ҕ'(\6}!'J %ޱ(gv#bhk\va%}Ct &iVRS)b҃NIEO^W,OJ&b(;<8]գقv?7jp%[k]$Y35hMd֮Y+do2D 7AR7#;{|7V# :4X4ːdz˝}hʟ˱S/X'2S̸nrvOA?Dbƚ]f.cz uE>|1ŒC׵,es5Nk9phmX#ѵMM!]]\ GX'Nȣ'tO7Ձu զڝ=Ot;J{Ǵ$ahL~xhEQ!3G7UdmZ~"._-2fHA#y&>9"hܑ~B1бt9+>z}S@+CLjF{p6dIчs#yG޷kggt,_}Z.9B\CB+*,g0u/)rw9k4Ǘ=\NFͬ6a{ϗA|t9Ɨw};! -P꼔D!={ƋC' @}rZ5€.);<s[Չ!5kgqEW:xY qVCC<=@Ra )bH .B}$\A,"@9JA^rEBS $ nz`LXWg,]##A%y%q#` E+Ci &~VD)CyA|9\ _n>܁C.΄̃JzQ3J`sq{qv>F\8qEA@rwy/jL[)}Zۻ|ӭ]-ey?h<EW 8=bu6{m>mcܳ ak$] ' E9`uV䝸^,wBY.CVYn֠˦X:kbג~e(&pʜ<Fl3:u1Ie6&'|oⶬ&[M$mD}2o急L|ɵo]*.ïrtUu :`󘚏4Гt{k/4Ҫ.8$G_k֫y45N[$C'BPHd.A]zwI1׸NPIQX jzWs4w%zwΣu/ևN$m~9r^|ﲼkJ{wi*Ӂ;r'd科LTC2H6y~ w,"[9{.a %].\k0ӣ2EHWBQ _ 5X G/t`i`OSQshH9)01oih9([()~-aMF(x~Nf3Z lG˗ Y b|b4RlQoFaP)26`U}A"$H[nvHa:veDarmtD,;&wܞr=7((0RT#'Ya/mֵnC_)#we"v %,oP79cL/@Pκ2c/xR+ԕi4ҳzJboOIhNSHp:.ȧO1|_[,W^gq1s4ÎtY1Q.3xo̯@r=F zBL-1nZV odXf, D" }Fj+/*&ˇ04\c}EV%чEAsbAKX <Ӊ(bJ;BNy\ ݞV|:!ɶpAq%2`!t҉EC(tm\).}~t!ȲKPFRz;\N}0DklcEf)xxs˺"\wPeBt(#rjWN?rI`%Oؽ;/20g<-4 Š?A ]:(c. ?fu|DHD <2 i Ȳb23CQc]DLFp b>n͚BtIs"v8]t_PK&9r0 .F/W#B@d2Kq$ =!B( aAյ^ft5oFEAvO N. 6]GVDX$Z2/-4£,w5Pe$kwe, X7yƋf㻄tsptm{[ɼ . #/eR.N+wߦJ\Rt]#K默nPjke.2oJto0^FA9lV_/!0ݘq`DHq^@n:kH:%@f2bq*WDL"TѺ%uYebNHW#J,]a]WF ?:[|Z%e 8o#~Sh9L|Mqε?4߅vN#&$|gBtYڟ!2έ22m"Zr4@D,c=+: ɣ'ǽCsL/R %D! A M%VTӠxb0ބ_#_Xۘoh0Fs5>#<{"+z+ pl{e9mU /$AC[C*u wkʔ2UX buLk_| KBʯx]= f IcMYWs\Z?%+6_J =CaLGBH"A*5sj3x,/w;F!CY2*2]Ea]$;VGQ5gUȫd d#ZjH{}{+?vZǤ<e[1S;V~72λ>T;u1 3-DH> hB*(hЯ=H Rd_oZH/I5zZses6 P [ҞBz2rvߒvY=w\^ބ a/2 ֖·Uk:W룉c9~h(KM^P<@`Z`P9aӹ+ߴU(s'i9fc׸Kq &*,!n3hbzqfgvdhk]aL3=}=C,4%e GQҘHڝd1rm95d4FpQCB/%F,ړVRK\#a3^t%HV9.)D%l RA t\~Ԍ[ۋ 0K(q: 9-+'Iئݒ_VN8%qRG޻>h,%6Qv͂ ST0 z#!@6*oЮd E)tNsFo}z*~\+&/_JZEUӲzt|K,gS7q n뉹ɉ@t}K"~ij8舦|ue@MPӳ 5mnR8EЈYޠ0 bXrNXdc[~ b zY,ŵ1UETHބU#`{h QJGp˙Kx;-DP$h…[qBCN>e?&^貎>HK B+V8T~GI?aa|^'`q5pgXԉ8rkdIxEҮ{V%8(fyXr&8|QB֨TD n&Qb290ǡ-m|G U8Z[HCJX{Z$PB]}! QL' HrG/"\#:sWnrPM}vP$BB]WOQ]@/N\p@ZߡF ΢e$V%mcع#bΊb}8ckvj"S 7rP=Yv´Vc'aMUbc7(/T8])-vG"}G͝,B쫏yY qc*e7cAu >H% "meQ +a.&5A?WE^<#MĚUMi )"ڀY\qSΖh,B L@rmQ@mh|!^.We0rDI #˕yxqXH#fZ) -sX\}Ag'?@/tpLSʡ > ItrPu^R!_d@DBrJ{/˗f9VMʌLM.:(y v4_ zMT5~*-z;F l̀&n ].z E`ti15{![4x3ƃ{]GcBuxs],3顸78}QQ0"i#X*r~{HtDB,j GI,-QFPzzO(Žs &j8QjB!qzLuu6 ii*;D)Tٸ]p@J0QsP*WyQʚ!,51Bhys `dFM6Βdl|*\7L F 5mx&l6$Rr{&7r2mHh1;mf\6:։k-?Ev|j`=ӾѵZ'Y1$jޝwR)dZޱ&߫՜C=ȵfJ :,j=@Ze0"c14;JkȡWHK'F9C#-_O}XA]Jb):"P]bi#v7;@TMr-U7ś($LMK7 0fL 7E8#cܫujWa\AȒF]eOF>F[*n]#WIY :`F(_Ev~0gΪ ~3zF\jήBW#0p9֢T͙.!=EhVWث\*<kp5J4Tϔ.T6`dZr|O4ݫѦzcW'-:|:?^Ovb]?EHƳmИps\*Ӑ(*D4N`ܥx8;2UR'1-agw_UGf|I˫c[9[]K=vDq!C? gaLYvLc$|7&.ˢ5QLYh{R?I\l!{~SsL[{zA+eV59BBb\Äo5\ˌդ ҥCTT3\7[Fұ[hֲrcbX&Y=$u=Z~5*)tX+{E ,GJ6Zs}#kr*l`d׬q~&&Z ks"ù_ ]`,owQ}7֡WVL|R+N-.|`VB.p0DvaciÎ G^,.~*bc56s\`Dn S ӔKc'mp&q{%]*հX\U>3odߗyI^%Y&!r_' N/ wAq;-Wf&Ɏ$\U ,@|ɴ@qEnlcbifsl%?ds gxCsT Aw9p̷LZ=>q`9[ ,\YTxvb˳B̜iηل$|Ƌ.$Wm1Kګ>4fE)lSқj>DN]&ۼQے >/1M4Q .i\;^.Ow5`Z a[&m6JF:4!BP~[ {?Ď%'1j A)>B$+J8wk O.Mf:1۾B9w WٲC6rF;eI佸ۦ݊Ø8`݇ 栚PּP@ZHn2,9)[ßR124/>dYVcݷOҽtdt h(OF1Qx]YHFy1pjs&=8hh/!QܓoRH33o#r=`ũ/= FRl *pPoqbw/è6՝ m VmdF v*m[P\|}$TO0 2H%*]9?|m ˟O"7cmwJ,-cU2fx]p]1cVgFk+*\yMa>oN2~2= CO(?PhQ'wgH0>j `lH#lvd;JXkíe[+S9'\Ml˵$'Tsv8y~T%S7{ܗ :55X<ќm98Nu|e(K:$r~s uؾwxzRkl($}iBG+(zueZ;xî*Pl2SNʴ6}i.#uܕl%ʆ%Z;ȌUg_;Jj? t5^9^BisjW2D;"_~?=S0;q{ 嗈5cir~SH@^,"e)1lqv1VF!x3J es ~m0CbGEH֑C@Br>XP=е]j{`HfN{/ѾkƐS1*cZˏӫ<$d&ЇDӰ2ƀ&) c.g@kc FykӚ?wbaS 4ʿ&(JPIU"F̟ZSAy 2fHNpx1lv"$|Ous10'ZÜ5)(a;wÿzQaFp*~1Жtΐ6=N1ukGDCT] ݾ9$m6$o9mp 2&jvNJ6p>-t?4*WhrlrC cfSP8 |?ҢP~G |Ģ_S!ΟfmnxB+Ԇ4D`禞`|P_k$0zƔw]h0dכVe lNPtd ]>閭o/W4 2Z(JnRθc=~R.WȈ \vqt;c۝ۘLɝKZi]0< h̻ ֡HO}'N(ܬ( cE+-] M8Z~}9@up U X2\^&Em?r@. ,@\zNJON휊g{S^fe;X^` xPVF|uL\dZmй3aemC7muz-?pI S*^\8#sA'ס$AkѱCT o5JA1r{Fۅ6!u%fw;f]+3##ı',Wo1gFTi>+iQ_S4.4U98:"v!9OR3mQ4=1h 3/`{<@ YK"ٖes'z }f< ̄Abߢ,Z뜏Ǯ ms,'#?ښ\G77J|Q}}R_'muu9]K oY[UTmM5kKuK iM/3x!n vU8&Q J2TB'w!?>N wvKq+ b DHIBґ$%w\h~c{ Lc\F%_s)QYӶH_?3f=)""qgZU-\P)+{V_ثWmZN~Kmx {鷬[qqa1%B];BN6?kAI|""e]G5}-1LהkxNCM}A~P@C+Gl:<9T]Z0Ta,؍Vy!qy!羋T[Bs*.fFˇw̳NsN|mMҥXֺ߬y46^50a7#gf.K{Ff]ԁEdpm _N\Oy(V{PEM[EKhwnԁ qWc ?m4L$Q&/_rR$_S>f hd 5&ʡ8&-PM`#Cnb6(Su!AM ZlݤAh2oB7P`C:ą#n,b1Ork 7Ov|]@1*by:9v]A|`(6[:&ƀz6:iPr'vm*c)G %{7!!H 1ȡ@s঑3  ô\݇5tC턨1<ȈOPS%1XZ^-c&Pi[S}] [Ѐ# jdkW8%`s- A>K},;hYX"߄AZgpR&KhҋQPkcL>,d4?d N.0@zc'GaQ|Szݖ2o~Gd# c{CӁ7'R8 8U]Nz< tbǐo Y9|@>;FKh~/ZÂkW4>AgqN 0?lϚ!xR'r 9!cHDcLpꍦJ`05CrъKRQ*&h h$@1pIޣr#ffB]f?,7,FA|sT%Sk@ǐʖA~[#L 8WM6ǘI,44F;$h> McYV;Vcȵ,XW}v >$qN5B1<}d[j/T;0 YӜ@mC'`Pɶ`b}qt/kzXi0# D<>> 3\`y~wrQ^!cpX{ھύuJ>qsgf}LY[tl4BK&k{)fdhC\ p%D_bhOwnc5p;7H ּM=x2L/" Å bK*N9!TV %[`,T86pv 6H4cHR(eg@O3,R *wh%Ny%oe661^ (Г dɨvFYK8ΦN%}\ :pRb nk$Y}2o}Ӟg;8]|9-1c]Af\A[:[nX 'D+Dm{F_ rDj֯vUȆLtTQcND(\(ԤR3xѩ5F€}мV/JJ+e'_bԤd{ɫ۰lڹ隆kx7ϑ ލxT!oVIuߟ q'S.i*2j O ZXKfI \[b{l+l^E%7*^UZ\*z QtaD J"sƔ~_{Yt{~,Z*{x5m0+mL;}\9gQ25ڥi!/A}elGʻklV<+G]^p672C'Zz`LG۩ɺQr-75oUx9ku G(1X͑N~M[Hc 0' JF.N•[\k& o~Եi*qv"` u| [MOo,e1B['մ$*VK >`w (k)A4/YU-v4p/~2·>9iOp2/j8D/=†>a[6{]N/yFU0M߸L_rgiܽX7eOʑzwO]^9^,k?>#na<__O9lr^M_???ø$i#[_⟵Sy9)*_!4=9A:?A3K+jxΧ_VsLy~)kKy?ik%}^8=/ŊN=_a(ݴ1]G ykO.2dqmi2λl)>oϘe?m=6oq jl[W:Lhr?Oݴw%AK,O<n"ٍGS,vN昍?Mj<YlsH?byWcpm߷ReϪ@pqzazOcE!ΜNu~^^1\lÚ7h8Ny?fEp|X8M%fdە{?aYsq(m?L%{y!=&_NOFv|"bRϧry"2R筤܇sV薗4<_I?r1]sWa^|Yx nga r8mѼL{y/<cØ<_:]~ݴ6l%>r,kȴ՟X96s)5ž^coYw^0Dcz* ]̾%-c)‚`5p71vs>v:egqs*ؾ+1rـ4ݿygV/[i{Zfh{[iLfUftceVeW,KT\(dг|pձ'N}?Qțٵ3pN$P'ߖ)zOC>⦿b%`g㩒9AԼv>!naŜt(7Lz>`8n.Yx\n-~%/8n|g_K gsn0960s*0oS=gfc@k;i:Өd3h,ɢy>MapwZhrpy%W?.9KJ{n.YV\䵖TKf+ǦJ_͇0eXͼyP1UٞШyL5=lQRm5vf(]^1U/z$j({yKq/߲間L%YQ2fnyRyhPǗ"Yy>KggV1YyBI'(M2F]b:ʙsN7i'7,ԩGP?qem=O;m9v*-Ӟi9cӜ Qh%ݴ^dt6 cqRݤHhP(Εtݎ=@gJg[&y<'QYte)|\9Guԝ翾NH`W!-a{yx5rQ|]rI',:<d{|ep,+VEuxܝaxw)ɧ2_.Z$c#?8OiŹb?P)CwSP6ϝwSͩ]ݥK4mQLWScUOGeCYd(,yNfm٣TlmђibÝStt˥8{p:ok;O+.#l;bU>jei<5s3jOY jydٕm|q;AC ePEA^ƯQ-i֩3PC~EEEE{Rog ~Jq<ߡ82+kykևr"ƴҾW$s<7˽w,C--Td/t~̳`]tχhki[)糪* 7kϧbF^0*\K=Cnf7Mba`:<"Y|0cH\߰ѤlE,h4/5Ʊo+u'u\dIK}eyU1|8zWJ.=3%;C=eZ?~r*R]O~œ<]&թQY[;En,*2gml6kqP:,s[R;.?~?z>r|Jmn?<|5GS<b6_X[/B/qLR(B\E?ɎK.͟~RwٕP9>gM*)B LBSTۀ%RlrN5KsTU%;{QZ^TYv{(<鸯9? /Vn^=4Sa_sβL}(+JB*3Y"0EC6̵ruy%"(fV]wf_ B=Zs)׿W;|C R»}>yۺu؞g039*KYP9CYžA.d PJŋn2qKUXlՋ(oSeQjzJNYE*Լ;DmZ[(cjtCOH$44ntL'JXTSzE,Ip Tnn龪W,)p*o`6eA|G~[[s鴨҇a =$guO}DXr¶|YCM77ܥB~Rh>kaB1MYYc+mOgBH9SPIʑ~:>K`/B"0b{L;M{IGX2evi3ΗU*R4O(M<'U&g|"6f:IKUSZy$<-ZugU^Rs1mv\ٙj&礞a;*7RUy nZ19K6q; eS圴w5ez4{3{SHvgqPtq߱e 2?!0Z,sv|ΩVU47ٳA)Q<Ts1TݶqRc\SWx,xEfrΟ~r(Om}^<zUV$+2<@674Yr4Χ^@Y^}* 0-}7*^onq4T$iE(wL&?PLtRu*qJOJ{nKv%+Ijc-'+6c;9Tώsxw+şx@Gw ZtWéҥ7vyrź?=yQԭsMW_uz:/e*x_օf*5Xtܧ']渵~J7=Jl~ٜY4EbeىTv8Y㯔6i*L\~;Gϋ>NZ Qڽ8P c)5ؐVx4K7X?wsJR\PlmY8L=}*KRf<_Hg_ݹ_OXE{oǡZ,p\wEt9c.)Z 1po`±ШT%kE1wL8ǚjZT}mocȲ'biZ0|.'@}m/>Z9zׂ*¥\; KηB[1*WDS?+Jebǹ}wy)sr^%'VZCNx<^D o[]_7K:;y.t-|yb./>W)snQv\EZbffYy{*4S;-aڣ{9Jmuk*yV: Oe+Gt'hݘR bi,Sr.$KEyMRHN `y\]V.%Uc_Y5 EZ$A.F`6[-uƴ2ds:y,6žw<`yU^Q\ Εb/%|~Cva婚SQYt˦B!p'* 9acSyGKnp\-*OS\8Pj'eVy=b);' ik236-|.gSR^&)S˳r=)v/ybjژcỶ-)5c=;T;#:<-i@yZ+D]Qg]ѕPa8BPv/Jix*B99X9B qxxSm:Z5A<9cQ$<+)A%$xceǡg 1oX_q2Sj"qS;.cVf*tIBT|Ϗ yW3SR>Mc"K~Ϙ%_J*ĆXew0EThNc1˼=^Sȓ9v YsҠݮ]LpjyTVr ZBT:?԰!K /QKY߫5ÞϕP)| /PcRua^?Zf;GET?LL-Oi8g."]e7^M|%k2 s^'ltzH4eO D$78Ey{Oϴ x{|ޜKꠎ5UUGM0bSw p)W+lK[jYnsZ'_ ̎X)I.~sΰ-Bh5eVB8aӮrΑn7bqjU5Ox<4%ok05s\km85YSsi{nLc:@v,c\9U[O9.ETaklr7H2Sx0Iiw:CꘞɡT<=LI8?0^U1> M㠈\Ŕ{+v];PEx=6 >:N+dKKA8TYku&~_R7%̗}F=ޗv2W8&?٭4oՙ ip81̯b:L2KRhO+:WKmRʙ]ixSciX|Iբ֩lJ4<ޤ/x)O MZ#pZv"N&w= + 0TD*C nkghU; .)y>U*Dޛ%9ih &tQ'}2ڞn[/ :J9sXTsy_Za, w9.n[Vt}a𺨾*`֊USxxޕi `Sv}1y;l8Η|]4)e,/vTڛq93>q|ɌRJU'P9658SP*2?TO3 T|î S&I1S"JXCsL&w ݱlgwұFK%jNPy4?ֽ{ qKޘx5w5nPl4|=ad+34T5YۊKأ*35kTe8`/ <q2DxɨFd%IZcĞ"/@-BjI|ʆN5PC1 fl* bH~ KKCNQ,+vOtZc&>;\ fs>ڢ.)Z%<7 n[ǗCݎu1X(OB f΅sLŴXKOu+}\xfVEKX9OjloZ?8?R6v vB3aN,OlMiVӶ^ɘb%[]j)z%?NSX=_ h"K/ލC 1!/Srz)5cuz>Ci8WE0iWnE"EܛS:G0A UYU*/uHe)ҋSQϴkEI 4JRyi pƒԥRF1/#X;l{}ڗsAǕIlʦ?/Ot]Jb:u|X)~ /H$mk`LKqS؉ ZŠA]|W =l+&[b| kp]h--zPR$8\*weMKETʥwվ|ҷDzM\ݪ_ ]j߳>^_RŪ,.-YS\d.)( ?ShjpzN pRհSV$}v Kx>M\.qkU1ڲ2sV1ᱲ2vT-:kddM Jt/Pq㶔S EnuͻT6>D Aryv,:Ì/rCuP>ZOl]]\FXxZאӳĥVSzT%v>ՆLJ2\;A]I/ײqkGu[;({>Vl>fƔDSFV╮P2EGRpQeSgw(mnszy9=9I!id#K3Ut,a|aڧjyS1|kQXFd/[C5[njٍ0w]*bղXmBCVgPA{-N5U̩0v/ b7?nmeɨ7?hP{ /ٮ5GS9GV4ےJx_΂e}.%C9[FJQgsx,/]{\v/.6-%+K "޿ԼKGO&; e9`v~S,1SVRCH*ԩRvefS4<3mO2T aM^6[+J3F QT -/Ep?f W 1<_=|ޏEgⶈ0>TKrgilvk6U04]wNbS/|:M5Ϙb4=9\r'y璴&/KV/KÐYBQ {[un8ڊnsC[e,q;fcN5ٵw!G ͌ uiXWZy+R \baxЮƇ"y>*VNweޮʋJyv4!=ݍ9dҧ0?Lc[ uި9vg'DcO6Eyع*s}&Vfw)}L;.}9%Kb[!ٕӡՌ6αB9֓%ϧra9j|:֦x\;癪SºBJԷ:+2ԎZnWfaosgUd _N2Ʊ^7mͭڞJXɞMq*wvꐝ ~ QFawɻr^*=v5mrSDZF$yȍ]Z}RǹjQO .?ZRp657åwǗ; ke udU8* 皻zmU>]3*+X n4QK)TjiZ/ T`dXETD>_miXCJX1\K- \Yrf8ZYE4:e ٭$;mW3Jf͔ [؀6+U*?D˘kMB?Gt$/E2WJ)C'va8]F{7y&n3 Βښ u~9~:/|PbYc*3~YUeX5UEch//e ~Z:ʅj8d,F-m(OSpPU'ƊwyV'vE,Vى\(3A)rWzH徢/LJJYiPsaw>Ws!#)_ltޕ6v~>W9yS>uL%/S`] bDj"9ʎNs9}S~% <+dMG yjٴT{El=לfzv)T_+SZ[+u`s u`KS%WBS)nQ+*gSILoIӹU*QJq:ܯ ̞*MuC9O%t5jxV?,eV 5"]Y;jmo L[,辌`!'PWW TU΂J~lA*I]eZSձ*9Wsl9WLVj3UɫeR4\'rfl lS|T0S7stŸqe0Yiw-ߋ, s9Giiߛ(s5?7F֔ygj8Smmնᬪea/3CgZJcM~:W}:C'{kç]מp3k8<+q|>ɡTj<Ը@ͥP>VH缭p!+LiIPiFW* 3T"J/y,#camv9krߋ,aQaN%~>(?-'̄57}D3LkAuW'sfnYzѾ"!d#`]*$K6IB >7TNjN@m|07lqX-o;]j>_Jy[]l3I Nuv49Ęv:TUQTzSt:fs 9T{?T5 2;nv5N|:UD+bYTuP14-ߕC|:O</E6T}^^SN5CVbεMUg7h[oC8^C 2q.ElI464vMZUzL8gxL&ag;Qs2M6톕y,<ؒ}4=nl-iXB ok^LJḴY)iϩ| B*m5t[])S HPwdϪ=CޖF]'~NKRCN=9zwW%R˯0 T%(KלLDc۱PI\a%E~n{%mǚxu} ɋUfXVꋻyD AB{*jhr]ixl?uՇC,Y9?,v)AOey^kzC ^/M#j64MaZRfl HaMG_Xfq+Ibj>v|.>AyGt*s[;P|*e?D~?oT . ǚA?V_kɧU/üLlUyNՎ/4,oR6Cۂ6/HxYYJMŨq[恗X*F[@z9.Y8(k~Y ".3ƂHn_W']y:)a|Kك8jI)@U|1OۡiqPw(:qM5]^M/NO&X&:>fvˡ|B~˦ݫ&̢UVt!|2ܷ`2IJEaU¡ݩ;}vݞe/ ~x)?>=1$ u)Ll̮G:|y,I>59V+Ps8 i.draIZ+z)cV>YPa-eK̼bX8%Lk'U^?j Ji:)ϒєgtH"[op^ ̹=c ~\Y'x<\Us 8)YTZvViD?VZf!Lɫǽ_W )/%Le?T;Χq;Ks 5׽vRhNhF[ka"˧^*>T%RtK>*2EVN4.b 8fɈdw?VVg+2e˔N7v%w-[l}0>vOho:(%BÜI__z.YYUEp1+.D~(q<"g/˲Y9͕P Le}0y_=ØwbִS Q}s|ڻ~վH_֜CUv,Σ0{B2st4n㥰(;U9e+"HJiRTZo8UdtnW{u?ʦ)b>Uh0oPx*l:\2iWsZ,?.Q5 2l;TQ0-[4v%oy~Px|x6 fymz JlUkj;<\3s`MI'QŚl?Vppc5 1[bOfWk{;$XN1x.dby^BȔc0>r=پT 8>=s`:*5"V: t%_J+J`Zұ = Ӽ/ ƭf<b*Vo[UV=J[EE)sˣIX}i4UGt,y>j纸>Og;tQ wٛ-g̸ߔPpac֖\]^O<^j0MWl&%/9DY54d7X(ui(\*"{;K E9ո]#ܩj[o*Z}_FU|^/!OǶk=>TP"qS歍>n.ygA^ recz\GtQ0{U^[щI&eb$P$AAFLZ-}gi(skH C: DbVnX-z_W;ۦ`\xxKjdlx %=@&% ץiw݅nЍFGʶ ; oÄra`9;}2=#} nLhlFG br UH9/X{h; g״HEf൭u+C*dVۦc=|œtw6 Oj*/kKLlӎ4@aj-lAmPbb` X38s@yAF]Kz~"7:2Bޘv?fGEԶV;q3T{gX p]j,ZfeG[Z ߀ĮRTQt[,##Nmd! kbBA-cߔZkr_Tgl]rdbFxLjCc7Q/nj[z_yk`_~tȉ@Ͳ4\ -9wP1?Xrc-j R_Hv RBgڲG^ߴ@d/Tpk:1>.aأK&\W{+wH I{_U2O\ Ҟ<'T߀مK]!8$ۗg %P`_iH FE͓9Kjjv2"$mWd;pu澪GeU;=}KiPr!ڋ&]tTH%i}3p\% In֝a=A qs{j1%g̡&5%j7krNj0]{!tɶpf}[HRd[؟ Y{q ׭形ڞQg+̑vcK_ʘX}-uvb"jڷiKۄPWƳE-@hoi.2<® .?_ iڷBP/# A2P[2:mf'k1!jP "A5p~@m[XSo+w*sB 0Pnt'+'f MpO۾;u az>p!ښAWa:=ˢPtwxQ\G G2yWdl րݜCȰeuÌ\tO1+3j b[BI9M5\֯ƕ_?nas`wN]%= [cն!?:oCyUD}S|[Tҷݜf*}){E*U䨼*vɴ Zz$c @=&m"ݚc>׸Hl}:\q jWTwLӋmddkpt!<>n$gA]# !>D_^u*Rhd{@@;P>̂*O&ۃpcc$H+M Fþnp^(duT4Lb1p.yu.Nf} ጌ]S]sfк4Ũwa,W81Y0 *Vl*+:,Ms"*RC0W 7 5_)[ܗhe]Ep.0+aMQ> %SqQJ)ȫɭ.SZ&<{Ug EٖOnfqU!f-wv_M칝y1l{fg7Nn iם!{`ԫ{>gE[vY VweM{a'gWܪd1c F].Ti\ˤ|6]2cJO[/H*%?}mVl<4-Nˊi5@M& R FySn?/4hwn =ޗ]T]\فqOYU=jq@ cäpލ=]BW25 s% 0ןaa 2( ,Q7s˙DKmb.60F6I:Zke.M=C92@߫1߾P_~\#} GΆ qCr}yEd6ttx'lUegzӴL4jhݎaAy : : Vu0ný}8aP<YM8%WGV}2Dʫ_"I4Đ.+FkZ4q䆫s0{ gz(p(4 ϰb\;5@z(Ty[:p$/._jm Gl[@ewÅT#ޗY تùq!8 Pv \lQ|]Ŋ!Xd4GIEB;܇eP3+f+r[nZzVb=byչ^jDmDxr6H{N-%B5ref-[Sqݡap6 =fϖetr f9k;dA/=S7,E7 )gYm{dp <ˢ3o! ʏs@[->u92auXB )~jdfcUs7#d+&0J[7ɫđWeqrs_-M">{|>e? XgxrMrnS3|ڶvehV?=]Xx@w_̀0hnojX붞?@CbS+P%V9o*Sue@aC1*[[)mqX̀:ɶfνnGW6J-rZ.U4_[_(mq<4 :_T0FT LD034h 0r;z-U%\V  l1j}[pZDY-@ӻ{ ʸ1 Qe<80 i|pD` Nr+@˗YЃa dZɂ}{sF@qT;]yv뚧RwӞVC—39- /- 4ZVl nēPl$dYK`=ڵ[uӔ]WRdt!?k zI{n"U7;>$4H˨?A7'>zm- \k0d3p Q. ~b .4^ӅKu \B &ca pΆ~] ai@w5<}"NfEau2ܕ vCķ6FǓ0Pi[XDmmîBxr{G+81/]_r7ik"@awmBЮneT<;T1jl}A.Tp -7 t@fU"} C GB |tIùG ( Y6O eK IOnxضx@hw;iSP%U:·NWp+9ƮCk-ɻ^(@p`z߮I}q:^HgӅpp݈}=wDez\.W疋`>{FVU)COO_P΢YL8 ,"U=BL:`R ֲn zCE ?o#O xBIS2mܸ}_Cme=p@sXm:hM߰@SCP%HK3@{q0o>xNu>=!0J()h5a`NҘ͏%p݇ vPAv)@91蕌~8G01Tfz Ն}:/&bV}| ܰUe3>gFpem:k^pu_ڂM[9Ӵ Wo\rutoߜE=̗OG:mQy޶.S1O3{d%{Ug.WOZь=yשͰmӔ Kv Frw9# S|"ph%v~IPC)lk7W]@Ž؆ˆ 1ַ7;o@j<ǯa EP+>n6 %Bl Wqp} k5(ߙC޽4J6:"g]4@hZ{05^ɨ\jʂjLmmqF֞!?)T0ē{5 H8dX[z/(2o{fv^sdURxv!;xV͈_s!NߢNoh~?  ŵ\qկN-²HiE& p^۵ڃg`$6P˷py*;"녵1 %{>,n6 yUS2˪zHgt?+y1GFxߵE0nZnuu,)#U ۆkIH%!>dIH(bT6ٖu,l$kS4P"hrC="&5Te0 =e'{ 3JhPjH/eL 5Nߪ3/0KN,rQFx3EߑIkN `lṀcn᫷8iuÀ2qᯌe- Owc#Sh, qԀ8v kTmiR4tv%R` 1ez-^:N:3=ƅ^ ^Lv|Mə 3PD_MYv:J]'t07;q9(#2}YT^D{lQu@ݮm7m"Gcɼ&^O4 jq?=3Aݺ5 j(74hPoûDQCQnov V$Bնkx'hrxw~eVA0PlH k1qaNL ƛmFwX<*g$i7E<65$)L&TQ slLDl w7{$lJ%7] }t90A ;%:}2*O X@:bTݢ摅T"ҡ}}VUo|6ӵ͞|u8 Jz@ιn-Gھp!Å_1Ѽo?}~EiE=YI#E Gd@|iX>5mўExpSR1t]@j3A&bb5ze͓`&NM?PchC ovDv4cg4Ӆfxf{$céEKm(}>rmH.w`]y4bD$#š)):>V3Ot8ci C[zu'0[HcQSJ J[`WZ8LSRp#KHjE4WڑE(~OƅEmAk䱈?c@T9^V)$8!⸆uaq X>\׆׸_e<`Z  ]dCi)i\/CmJSu[du9 ٔѕ_S ڱ <;,QqTGRמQzۃ@k- {4r˾|LuZg:&U 3J;. PQbZtMʜkP[2)YݙQZXo(K"+ aQ? =oy e ,hvm4 搒53bҳjHآ޾CYk'~C3CU }ю dṹ"VoK+n JVjMt{퀰CjֲV1H¹B"!5ꩆ&t5;D'l-c{`홬#ѱ#!l:/ iZ{ cSŭ>Bts-0EE]-ۖh2Nng/w54ե@W|(]Lrڗ \> ǶWV@/ p\P!٥\zc6{nUʎ7iT򵿺uc9WPxac(:EUw`[O]gY-0d|_Q|u<} iVib .l~@3qӣ*DUBZ{ ~Ee_gZ@Ln x5}dCJd*té3@Ӷ^x⚐Վ]O0_Ҭ< Ch3h#Ex/˘G FY ۄY츦{M5* ,0Z;Q-/@Ӏ߶9P׀ln5**ҹ]0Vs-J=^ @\N>XiOԎ C[Rݯۑ%d裁%D)K\?Rܡiq}(03aHؚ@{8* aL?OgT[S '~6Å~}pO`emӅ&dVJ#L_҉-oX=6ŁĴGצ Ex O1\ ۮ=4.aq?*K@^ VvK4Xv{jEl\ 8]>!qvu-G|jAQP3+ P;7 @׊4+x+ՌOb?f[Rj=(++3PjP 0 ጮzeh0P.A B3]C ݊ڷ-WCxi:*&v3!dRk MT0V.@8`x ;>ym̉)a0نxkՈ_ B.q4;P ~DR<Ҁ@gKwW"ה*mǴl`8X6+ǂJS0jP1.-$:-+>#a(ڨC Jg6d]qⅫf %5wԶ_P@rqᤚe6{.|eCkW=v,-?o+v@)ex) R)6;^JV~ڳ2b쩋Եۏf*(3G욚*8Hn{oeW˾㨚};tcھ!r@D1%" \^_rmH(*=gf%)FUa8mMǻ{єbYCYL; v83=ײ!ea4>@ro\ _a_o C978;vMӐ?bSTl8_jZG0=)6l fJT7iOH>nTS CGe.bS8]SJ(7+yZ`m`{ ,ʱ flWE ,֋#6Ҝz: n6{]Gz@1 ZjSQgD<jdM!e9s=`cŸ к-~pƒ[ k3\<sW9ǒ "ՆϳSw=^E:hXZ6,g R^ȝnBevu,P6 ҡj-/}= =aJg *P;wX$g-R5TACI3oTն}J"{ŅjyȒ|Ke`]8@}ӏBqakM6OHLuSTQbz{y]u~b uՓ)"d6g sy ՞^ϱM PO%*T0KoBJmIĆaU2n FW38$NBH:N)*/39',+z*Z~ZvUnxxPQqy$nР`Uhߝ.8"" E.pŤ=11iZZpAO^+L;0z_LDeqv8Q#V3\ j-IRق V>+fl MK okݚC^]P\bp'r瘮bei d~ZZճk7wRmZ_HWi=@X <= YH [l|t7Zق㿫 .KQ)&U %4"x)|1aT@:]GFV8 (ȸJ2m~T-.y=zG,;\M#ljmSٚ=@踑P*DZ9͍b\ʊL< 6{q2nS80R'ր5Wln!~Be}X0X,;aն7{; F}eEk,.\ uh.J^3Kʐ9@׵e-[ρðbţ+ߞΜζH.pv5Ֆ?lEY)A/(!Uc8,(4]{n06؏q\JϢcs:H_alC4jXx>i@駇쿾PܹAZA{`]0i V8EW"YV(hա-A󀊵{_!g3˻m_L/vI<D϶jjSYoTR-aQAӖ.09?9Sk[i(6 4 7v穤5wXb =فkAltw,Pt{[j7E٢Kj*xix .DT/K^ T5}p!l]g"faF0PȰQEϠ&tFYS!iѰ@ߓ[.mx}{߶5C~[F A# {&@nZD\Qy2!ѫF>H\ZC~cxMu# ù@(xAQxʂC`7N,/ /81}rNϙ9O9kyw4@is\s( @tcyr2<;T hN"@4?)8nh=LީaI<1i^ƬIbTD򄾄 3iXYqٵDI?YIYv)ŸzjiOÈe|BW>UfWzF m2QMn;.wێ<3$ƢVn_o6O~#ͫ?l/yEOVo^6]mW Vu7ynn蚦c r* 6P ҄Ϸ\jݦ9tȓu¹R_2f;%Tlmz_9X:,[;P3҂"\Z ϥ]6 4]#$aq5z}yHɀ ,d7jm}a_,݆P~T*}E1 \_=ǦC]_W:ZV b\A)kl\j Jeޒ ~Kg :z֏;vb$BY$fUe@aw'Pk-`a3b;. (wZMޭ@%@j@azGj!5/˅gZ# veǧ ~[[/ DlZ0a^TfR a^@;\Y.w֖0~:O(Bm@t|{[0}3cm:ϭg%ly^ qe5zPUD\zgTB%7* "-m$CnY=*aaf\i -|2nn O))rXDZdev-YjhIp>Z&ZBRX._`Oc+G4p<_Z^|||c//LKɀ.Z6GE_gm8 gyqG0 x_?,΃ Gs6~j/$ P< ĺb?= C'#0 yYT %B4gn8oP X7i<'c [nL `fsJ_pl-۷|uX Q^[O@2oX/4'$BCВ؜lΨ4h,5,ٮ@4ZN)ɗ,,yaf S7y5h6vC_(r'5" w7^ktwP 1 ׊e?(g<Ю` \m]ڮٜ.\ԐxsܰjlfشT* `$ЅD[J.m@`w?cAq4~eMJZ?Z Jp{d2;k< ?v%khs=[lcvh`u ˬ,$moԗbkk{ K5!M`hlQ Z }ykX]{B%ζDeVfY|E"jCe,+mHo^`\C(P`](\L猤]5#Dmmƀk[]RF7zwԑQDmUB@:V-z`Y-)~kHu&K"…*<5ę=\sdxmfcO6|Mv:)aS<.r]HԺceahψ>I,hrprW܀\s㕛rY큳qeEeہ E`<78)c%r,iA}h\~J0T&U!HYNz }eo[P5vbW{*E<Z =hڽLEz ~9>ʽik﫳ci#f'R@9XnQ}igFO^(g:]EQ0/>s p4~֠Q VU)x(;oCwdCц|'eK3k 푲`ݕ)muaFD]QqtFJCYaux 8PsZzS`ꙙ;~:02EAmO=ؤ%X %-+۞CkFK F4@[䮰A璾*8k<-<LrӜQϡ@{j-yKY/} ,[mmI,:Zٱ[{(?3-MG lyH23wE=]0x =0]?3gI:Cus1iKsix.OBep rg\Sگ^pg.Toʂ_;33#\iTcvr1p8pEpWK\7{ b==EJ\b/K;reqKظĈ\j[u"Vۉ"hj113Vݾ@f9>=(\zie>filA 6<<Ǫ;G֏)vifژ1#?x7ŞiRԦv'D\.A]9=^-nLWe݆'v-Z m=E!tDSő^.A:35}A%1%0_F]נ }r) qii|aMyb^lFV0mO=?}؛xO}ӄ =j`=(@j$jl_2_q@;4.#1}DE @U@Xhmz t?mIr4Pĭ$xO/zꝍ}pB"< IQ[0aR'kЗx_}G %4Aנ.5O^ٜr5i.N2d"A!'ur%o_mzpN }/ 7;G}?HЀf?(7h@1 Q9{/r bguA*A W zͧs=x{i]TD$ t\LQ<IcBkE۸;AI;MU|@ځNyo}Q { imfy9)u妼0͚=wܟu +>&\`]3 ddrx~%K7P>Ǭ0}FJn):RwGs*@G~@g ;Cx>+x]'ySYF0j@ˈ T*έ:Բ:#!f|,>{bCSO/m crzhِxDž?ٝ(I;m8ٮpZvK^ Ce[q?Xd=:- V'nlLWÆ;xOxMͱS$6`mjS޾3uў]7O݅nBǛ sq1cO?\. GhU : [וSu!kW̢4o)zë`;:b`wHX*MAr* oun4:vuMd[ et*{׹붛.ޔ#I2OBsa| '+T= ֶ* 4Ǟ_[!R$~ m *m0`>a]PDߢ&QcM gE50wlܰ`jnnjؚ1'H>`o06g*lŦA__RWY[h'en09.m 0斧 (M_eDctە\vvn]Xմbuۣ]x>OW_KS @b&@4YvkUl#Xs\D)lY^TohLL Dwݙˊf,lWy? aٱX'T% UeMG;-}[ߜFWv$(%gh4 -t n̜W" mLv5xþ@+eNq+ܜ-W+_hʞ֠v+Z^ZSH): /lsuGTe^uue[~! P#MhM~l!bPCZgMZ7[Ho&\]gބk{B"x`e0pvЂF_]%; 5̖7 k >Ĵuל7%@,ύ .w;:س;< =W?# ց=sWll}t qoOu0Ў aPO5{o۷Ņ4fƍ\o$SGUaK(%.COu;C 'WpA,'<="UE[eIۉM<4hÊ Xc7 ;j\sϑ[ctd OiƽuZz^8 gF dOxyL0u==aF~7/F'^#vz\ ͓OO,5}ȲjRC5xŦ1FC?Ԧ'~!EkPm=xm1UȆyyTk,mǭ^ȥ }8i\:0Թ !PF$GZևb~CW]t!A_;YW%fndp֥=` u1#U+m]ͽ^pG pqgOzO}ga>:%R-.yd |[OV[FFY DD$NdڵFH􌸅n &m7 h~PϿtJEKTVp`Ϭ7+VmO5A`Hfs0EpI%bx{_zѴEtgĎ"\uD0EFq@0 kPwz au$ 4еdh$=|`=w; }*sNz?jfZ.锩2YY;{b`dQ5G[]ưm~%{!'*YZ[h֒X*w}d_#>Z}'puVt6BڂH31 _Coiklx+`=s(G}J~έ\N^nA~eQ。O7g_۾/aZyn-=6 xY r!Y`p.'{ W@| ~[ oHY9L+FŎC j'e{>00y(2(B ^{I{^3~Wor!PO`ES{(--vcn+ʉ*J0]]Xm/t^|T@gNjP&؀b g.KGx˭qW(&gPK4 @Di=Lx7XN!8cFO\4nX^STk>v%@oлfLmgI֧PDV]?Tn 0jx^c{Pz~z?^Y2:݆*7),7hϦLl 'S_GEk[iYkTyE[C & AʭW|Ks`p%'$ӆhncf^{b"x)b؂1Vdi{'VmQECКenQ_ ø4mp:w)0Okͅ:\5+_[p Geym T[-ʙ 2D 3mdpl9`%({f9=xǥ\wh|*ͱ?ڹzSDFFO3Їñ>/]<}ߣܻcĞ`u9VS S[hZcIoK G8s!]ޢU%%ue{n+>]Ob ч'D}ce|$]S#Eܮg+Y=Pڝply4_g>k&жi|)8%lzR62Y^(K^mj4m.8Ć /mCT͕v-jdסG9酞x3 td*GΪvUnح+\=כEW>91ٗ-o|Ů@eV Rw RHWt~xP<8+Zl@)2MJ#U#t'@C{m/d`˽6c "=(`s]70H%65ힼRo)RhkjW( u*x`F_@+ąGH?zaʞ'pm UNfm/YutA>u5hX7;=# Į>5ڐI8Ze?/Q-@e ^!Mꪳ= *8w %Xm+ LPu{(*s(MˆbqvA_#A#BǺ`R;(J0[ȸDAl2rH!{?l{動1@!j> Mrv釦?^S\oy f+#Év9j; }ě]KDJ0t 潀3ˈHfm5kuGIhێm]!o” zE]Ҏmp*(}'IR*+@{n5ZN0ګd}L߻l9 hfXpIMkP"z:;Nm7`-İCq-B@&<ƻuiqnRn2I aQ8iWFs_r\P e=싚+ÿ{? F5{ $BAS{z1F)εOcCY߷zS@X̴ũɗ MEeݮ4ϽisR@{m "RP':j v `b~ h"eo Mz{[7NKERezl/n!g|tԻwߖ( M0L@3 K@m@0}WIUٽYls> O{U_vE!7&|~* ,Z`^)Go@m ^zhn<?R gڠoma˦.z2?C*aBnl >ۆ,EPJ&r}1xDHTn\7tķ>f <߇:U%3 ߔI oٿW}XE仗97%Էٛ~~uh;K~2Z&^a#k(~UU@ޥ uU\ ࠞ^srI GSePg(ՆC\ςf뮇OSsF*{΂yqQ%EoLݻsbs3=4:wskK{ӦGZbc 1 #(ucBj\ERn-+e[l=|?.)Ip/1;V }d5PG &ԧ#-vQ*oQ\{`K \_Z#qT^JW\ &hx"{R+z_=qD٧ wfP7vg[h{Uw=0vTqatְ5J;Pl@ѽ84}H=%* up4A?|k,X{Dpl@@7}0>j/ o +w@F\fζ5/(h k KN_<-g0n\ʟ9b5m\b㬯za%u<4%,@TfU7==\mVDS#G`^9PC^78D0 QRt'Ptw8Ac{p5W\a'fSo{c:8(19ȞEv{y{r{۱^ VþEӾEej[{Cw=1ᐚ҂uT_]rMǛ8ukN6U$ fO=[:jz{a*AIkqow]9 0p+A.abzCv;> o[0iCPj{OGJ@2f1ʏ3:rM>-@l߶ WX;6Y>0d0Tm-!eoo}Ef۾X$$M 8d 0Y ȞyhYC A`2ahoo)-ōHx-v $)~@v b@zx-$f"a"(nW%ʰ[%-Z8K2 g>G#PAN2aIxfwBxQGn56M܏J;q |Uށ.A(9aB v+uSIuTX.*覆 갫O|{zlEΘkF%۸X!@C`Ȗ{ սG[m끭`Aސq;ad2@H\2YLa?zl9ėJ0E%<~m-ͤa?ѱ"c`U]'2=Նӆa<d(Su~}cO qS:g!Xn,[r_W 5UW7w=c[x zv?N qc \_; Sc`df3xwA5噣}nkx>Bv+ 1шlr:U $vMq3A}۵%Qʈ][mGEK2cG55 "sV؟T\-2>SlHzv"$ANb;*[p]CaN5G9 [; n/bt' :27lis>8/L͗ ݻH}kӅ>M7ڧ Awy )8Ŷ% E{(|λ3)n@;s o_(`¶@$"TV:{j -Mk P> BbPAp$:`0Cv\ NeO#Jt=zr;nGJ _2r1B WH/M SP K}RL rյ`AWs;8NI,m@5m!t=YP&.jXko@o/,@DŃ{4%հ[йȝvt@m={Ǧa00Sv݆O]W0)\ոJVv'kvj j#v=GZ\C L:r_w<5={Py X RbA[_RPMj Ȱ֛갯 )wq `ۘ ƴ;ch eL2( xfԆPjn`l J jE {wrύA3qȥ-8dE,g9~Y X' M{5 7,`W-3 s ho  ~Ѷ6ϰ]ɯeW(MVAyU< xʼn?KmTwt5.*.ޖ5x_ 3 P>Casr7!saӰuw#ytFA& kǍKo+zKa`a8Wcð<XU+{#ff 8̒-Wy mąߎ:BUfv-$B n6-וcO0yx(8֝jޝZz?JL}`t{`ĖUW7\j v`cumJ /IFȽȒZ*f,+*oJfn?swnьvtSoKði,z ~asJq>~.P)c (1g(Z;ڦ9< ۟~ow?\\x1w-Zn !B \l"\t\C;1ҍ_Pڶj9JrPjt;|E7mO%Gy5Wf0Bk'e xUwPGGoO njjdQO4[/e"X0l,0\cc+D+ ۬yXM{W?K)3=0â [,.S+_`6LJvYjk`P >u)k mk K? EzqU3wMi k J3~m{xk[ukBc1K8a~RTg2xlTWd߸%*$8yW{"Pܝ͑ATTlϟ9Kx3:m + ̹ /NJ BE|;4M,b캇v3=EP EӠ! [dWƨ};ֹkj@q+,9>|v jC 1uC̑)jJ,= }E}0~=;9g;4\2ԕc9[$ &롕gup.l6xXO.=(ڴU EW#зCVs?{l1{kvcPjVBAA* 4mhLC^raBwhkEzEO%OB鼒?GQ -ҥv="L}QdQfLh"N2ԍDŽV.z,6}S^[de9GɯQғV_r; A`+pA0цj8;0mkf˱dMY@HsA\kM&M6 RU}n9@|(k* D[2} _hw㣤/9jL9j,TxEmfT{d(Lakzɑʈa! )ېbh1Xtnwನz*or϶gVuhqaGwZ6~=s皍|wRh\t= hPz.5 Y0[7>4-Q!c؟"r6 =UoiMG[{4ESOMC-ݑQ7YZnc7}ϬMmS0T|ɒ- !Yu?nh^Ș6P&o9;~w^πÁš Z}>nkPa~ x~Ojg˅cM2Sۦ4^N~kKti92ۼT*b:}fW0Dv -C~`u̇ңgK3;#,߹*u݁#Y =A5F|f}'HW"nY\$yEy sIM"b6&i4F#x%"Qu@x@H \Ұذ6ml d\G.Y\WVޣo7%G#w=GQz ŕ.{pC]Swt;0\ -=p*D)%+253 R#m =庺]<mşnr8.RY@N)> +v5ٽAkaOׁ{4Z̿D!000uv'[6gav F[%E%~87dm}{m86[U>!;u{gS{oph;fw-Iw'C摻/|2Q++ [;as m#Z_؃'Lv 1Ԧ%sgʏt ssD:߮zqu%om9ܥfOmunUDݻ O]SQܵ N>CCx[\n#;0̉9ۭ9stAe^Z ܶTwbcKKz. NT<0GCeV6=UF%߀L?QPt n8*3jCՄי1#J 3a>xg/2Øp%7g)?KR0ѵ҇vC7Sx~u,sa_u__K0`Nj>c}X6ư[jX^@s$ʫoHR՚b*=9S}DsU}!È)6rtF''\.zG8?]nK; neHvحr~`?C+8LT߈Ô{Y.TO3^i}Wa;.}udƦ=^EwEJ@H!8BĻ=4W+a&^x̋lUߔ55v`ZvђᏀj$)3&w uр ) FXxiP=`( wDonZ$狖VmƂ柛;d$ #~ ?gHn?:__rGyS1_Ts5s3Sg{_^;l9߳$){Ee+wQkqd%ddjD_I'kgrO*?tO]K≎8hOl\?kz/q^a#.]=%;<SsU zyL?|4Fk`D)^RZ5DsgfOh[bJsu퇷?q^&y$PZ4 ʼR9~Z垁>Gc5&b.4!8яT{bNSW4#f B#˺i'ɦ.*>:29Md០zoj/#l"Ɣ-F`CGB$bAlARٜ@.h~ć`(kSQfEkb:h˦2G&PedzjFlD<ʥ`R(!&Z J*lȊ:`¶IV *("\ikpEE؍$SLҢGxjhU>ޝ5}v~u+VFl6B,@cd,!d#u=Ցf k)ǫ7Wi_9I`¿-JuC~hwbOoB#aw\ Z05]ϊE!Fk׭/v*THti^).O$3Q{Bn(ˑ?]+>4VU<+؂i) ]M"&jd.м"iPZo"yAly JB xKyqH#CO8Z7 O䑉?OfWjw>5Lڭt & (CT(b!M}XC['*>\f$*K( Ļ.}r͖wHāemSfvt3}DE Q;O (^G..,h''i\mf23xT00jr- y4p_Ɇ c::SeR4k w)P|'gvMsEZBsInh;uJAOS!E14L!)x*0Ex ^W۠.UQBՔjijf%q2&>LIu#nF$7L0R+e?uT碩&7t5E5ŌBUMG E P5]hjaDxR2^+^LkQ,K%CUn(WZ mk Rџ<P>cEiaQU:053zdF:V%DK0~-dF,й>\\DwtbPM+/l.I*CB(/U%o,𼦃DŇbLu^QBGsCTdУBn=;|R]v*Nqp۵A̿ù"uUnfW:1;n‰DKix.+HL8SmG~X+=\_^XC\.p`.4 PVɌ-$-Vxe 0X(7t8!g+QwF{`0̜E9"AbcV %&P1F7+J*HLdRN!cCETu?ڎ½ԗWuHP≯| 2w1NJrR4,211ofg"~XWi޶aB4MZJvC2P OD,U#"ktƫPt@@\Tt% 款ij {E s4 흵X"q֫RyO& YC$ithuP\5"u݈>V+Kٗ?' RIGӰCWv 7;GXB.:G"f3r>Ӧ{F!ҒhD9K sPBL~ 0~󷅚*)lAbwK ~Nqҭ(zo'%3Mo-0LM[ı% lorXe# %@f|xYy4r~5S] 2m"k%+f2s)hsWqV fKX(,}*d"9^i0o|HqW~= 4ӕ%|+[ydR0~܄F~}ŚF5\%r&NH=5ױ}DP5@L)tEEyH, i*ODy˨on~feP'rlc엦\! gF tf)0E;^r,gu:Ut)ei@cr[ןTp*M7w(&SrN-,ޡ&4&_"88]=(nbnl)klUlߨ&wtԛ"|Z>F;_%UmKd|L AfC,4#1ASfHӸfz lF?$*oZuGZKVGry,RZ(84Q= Q#ըlmDU.aN{Zi[IGmp4P!8%yh6 Ut d0_ĕ0) ɠ!\I?%MtB%/TIc)H߭UYRze叿ӿBG!LR'(+׳jW=M0!B_)Gu)'&[~k_oJ~TKMgfoM ?EEhfޖ=WlKI9(8[44o#Y,?u<#qzz\J & "YɱJ "{N*R)3U5:I6+Gŝt_ z"MU$bR_ )s M?ȼљ[WT UCs]MOAj:RN4GYUPW%nsⓚhANfu3M FU{pGdx5(ň Ƽ`J-xr_]b׷lrZHEZ[Ѝ*X;ȁPZݴ9Q1) kZ(L/.TO7&=+Վ﷫T?%ښ3C;?l׸`e1)/R lL))t$Ƴit,St:H!^l)?rU3I/T %$E0ոy/PR \QNxJWz^X{ftM5[vJU]8:|y>9$ 7q_ɤE*Oҧ tf^({`ݧE'RBA/HF\E5mE pqD-B#YS| u! }wNߴH:Z`5Kɼy:])-"%@qiB,j=3EXFF FLz/w]3>x4_/$%Z22 %sx#L'mrd^%tʭl3¬r(?=#콛 'K sO0.wDN"պ j@frD?$Qh|6y|D*to%$v<@MD"OS[KJjEyx8_IZZ\Ƌ/IVQ劀+MkVf1x?P x*rɿ(伏~G!bli',^1mWHf4VFաogŚ) < H:N:%54_PᠻY5Էa|:9[2:[:QD&U@J #}iƁ5zpȠRJX*Wt8yh3M *W1KI3H.SsL(=¶(STaUkm2Z+uVX2[rkjvrN2 d: $ٸ<3a+;ڥjk_i}f:3zorL3ꢬ9IY6?1=TW8SR^_jJbMunXMD}mVpcj+ ą.XO3QcHfpl9#ﷶ6ޡ:4;mhHi+C6 z=㙵x)qR>D#15H A@l͹ :se\$X}#fVKJ6EM9jo`f}$Ӄo*h7Tx4uq[ccz1jVY: yP4;a2u^fH =]˲{r9>k)WMWn͝g-D$G+]w1v/ˀ Dӓl9[(K<*W*J`"\%`nǥ4sBvpgj`QhwJopfWX5gf4]I9T^JwESM,K3@6#[Rv?+9vM! ^Eq\/yrnpN7EY6 AX6+vJͭi[|IEXKU\/$⁤J|cw*Cɮ-ij[H|-#MF1uEBJߒ)3Wu)Mާ[Ż2 "'@k63:BVF\t/*U,^8b$.ː`L rN[?;t_bX7q#LA$a@uNG&KLmRXCɼ6=9]z/lZM!tWZ,J;{5ܟùrwoLGɥ/?gɽXRVފ9 ɝROwŵ%:5|> p.6 ҅{0)ټ(mD j\TV`86D(t3 e{yq"wccg|i:Z,b e7Wf 8@:8t2@| =*qd z^_$*^&]I1W%M{7W v(.ZD)MkĊK b1$dE ZpwICJ>i*S.7Ww(*8(LK9pN];eNν8ԈM1.5fU}]uy]>T;멅1,ヹ J0Cm}::zEֻ 1fQM5Rٝ`ȝ-^Έ1ۡՒ5h67(UwA{wy-I}biiȓަpN(Ÿ(!{_Mq.rD٨?浇hAH ƯAN&* ln 4Es6m['&"-|&()Qk[u2W1>SߓJU `QӀ[r7ީݝR:hÂ9xz K0/o;& 2ZPdv})s b~Y>z/˟;. 1LB +};gއԳC4Z@4"(ND;giĝc}V6^.PoϔcInfKsw@Hj|G*vGti" sRzT,jtP-IU3.X̫P ch2xyU,2?$&7[=X{;-3 ߱c2 `iv]xLtꦫ ٙDJÖ[Def䌽C2B$*[#d{.faA8d&I֜ѢU4H 1>l"u:ٞat<@x;u]nߑ:z/s]:YCt,lEK$yTJo@uUgu3SFDž{fZIl̳Y{d&B8ONp.TD@'y5}ED{EVz⮀|^2tHW4+ 3|;gl{$W/" w].+GTj4ĠB$} ރ`"APlh-ӽ96!?2XXcߋZ3`[x?SX(ҵN4Bs:JVb-ZZ&a*7~8?!+Nx k{i9@Z?֘-THd}3u%E:Kp}RN@޸C$눶KꗾO8o;o7=;Âm4Fxl(=ݳǔ-)$>'+I_r*tE\U:}&Jtx .alS\}Kqj:u_$D9ye[Ji^lRIzB{ ƀ_C" E im+?I i;B$6$P#fYqM~_'x+۬;jV+:rKGЩs50y=g_i-@I@0yx|;/z"rZҿIxtWB,[\_1!/;S<;"]EgguE'y iz=iJkj}^N6ys(i*n"й^d{+&L\T/KqxUH~C9jpMۈ(1݈@e$Ly1?Kf럗u7PϯgŒ{!iS W,{lLb)"|bH- q]xbxBH7X{ed`M}BP*/"sz;Ж́"/*ݡ`tڝgXި&={TDr}<+!zu嘋4Sw Sշ0"rvbf;&bγ>Gw0ۯ_Jb-g`#5-q9)|xirϧj =Z RчVW4W0QF;h\Ğ>&uli9Idƺp5s?M8Z\QQX)lSw듓ZwT,Yu7Ǝ3uͦ;" lk/ .[7XkTEURA% ޡ.-)=Kڒ~Ͽ~ !xO"%Lsf zW1A2׬Wh9so!fz4WT6;y?AOVZ|هWVemJInn:xeDSFN3tSd^aS߮A. uaV7.&ܼѸTawa^=UTլ4LDkTPwI/ =GW0ӛD]l]wԺGabj 3J=o_v8@g1d@_T' *hL2ǀߡiE9TDP.1/ċZtW>BFQ"Ժdv%JϽE^9ZW^L IӅ|mi^DKm_YE2 j#oU"οAwo "3 KEMfKE֘D)? \[ S4 T%߯n`Z,])1߻G9P:cKԟwE DK58T2K4Owޡ%뤺5)*(<3m ׄsa6&@l̲i,igDx/Wu~N1~E79˦3(lyۢE֣h/'¿Dj ͕3tj6nit~Sz2 rN^W* +\fޣs, ,r%n;;Q7d{nn:C)&r )J]r&+^MZivS3`"q~ F?]}j ok{fxsĕHJ-5-5yZ<PftzlW2[h<&[!3*w8|Z_dGB+#[P=ߜt-ʕb5}X9TM#SPu@;Otu})Cʷb-Ms?)@}(z$/s<4ɜk߽jmjRij8 z$@gӠX5VӬHG5K_ Z 74⫠b4}g<'2Q_mg:ު]+{[*`R ~SK}hJBx'50DF9TV}OqQ8o^MfFIAɋfA[K򽷥8 /Ȯ8HZ%=3}v,U=Or%.=3ۏngAio0 7B6cy[6^UlnF(hՖɬ 5\&8 Go$b?q,g_.NZ(YlFل :}td_dU*"#{(ECӥ| "/i tB/΃ u wq5]L)@C/% _/g823ۋnT5D./k[*aJ%cs3e7)D㞩վsWeǛſ]:GRGj|r:ASJ_Wk=|V<8.)/^:9lܚM[@*i2R͑ g*q`Nvz7#95٨៱/O >+2!g4($T m(fϞqs\s7u%<18f6TKzۏ}d2|ꜯ½M[}Wh-hQmgU;Es9{>r&U~3䣁Qz.wBx{.suq4= ;½J3d)͌ *LX+$y{ٟO9˿ Ѿc3ށp{zQJLJO0#YB'],."z`W$Ks4HgYӠ0q9ڃۨo7_,+5jrOʷJN2_\}o#㿒o y[PoK sS#}Fpt׫I:};F[?d3 e-דc7~r-L|*G2mT#/Lh$aff& R풑O|<3LUb97\NN2JW!|2\)J2a*㩟MTRCv0$jzͦרLk<- w!p1} lQ/E8^2a%Qi.5kaU&x&_/fYpƒ9LcitbRX#'.ZCȿ%k#ވ?a0Ƿ}d„}FL4I,MDMl`|zIϟW64 u) |->t9y,dCHޢe6yjÄ52MM"̺DE 'EBV aZg/{0?n- _)X*N~*5K;38ɅLdz\Lg?k\2q 3>Aa[FJp"aEz1\PZҠIs. '}R?%TzظTӨƣa)p_tY XV~ B2lz_h|]|-vR>&{ ͦ\DWB!=IQ2V2t4H&bIQ/ZƓ H yEdED5*{YT)/2W+&M8 Z!b@eTZd>;He0N0DېHL\>ϊ6'Y+5 tRE҂ȄV`Ԋ RA*r%/VJ T³)NKJj'}Q`1VZ QB_E.5 $)؅R ys% ^"{8hwXi˕ߗHdeIz.|@LIO}Kҷ[Ct |ʒran瑄erdZk|hŐ&by20R5xlT2EF(Hgmn+2Me>V}/Ȣk4SrDL xftٖ$T+b(3yS%ᯧhiA Y(Dp*! tu\aޢ2*[NB’fQa3ADQhٳfZu ZAcѬ#.EIsEa$׎iӕKB%VYN'bYYKH4)jޟJN `m 1g/ʉ \?J5B)ۼP.򤲠 iZUH{$ o񬐣Ege""BK̰M++1&T(jd!Z@b.䶙9H㥲(B\W5g0khk]0TRH5d1Dl ( :{THXϓt"n"%Nj  Kڇ{c <OiڭY:X` ZQ=֛.(=keTHI;JD-fAڊ \i퇒ѱthw)E)e h<'+EI auɔ2kQ-H; m-I.jDm B6's-Fb#z e`1J(rM$#,&(Q??T DBK$T+0e,i+W+R{)-qɘD2~) 3-u" |L+fj@Dʅ8oZKd%N;{@$}ȳŤBOG/v H!rBfimAur5v;UұSX chB\Y2BkU(M8PK-E2lrkb./Z)#/gA1%2! FYfZɒJ]q, (TVi#SJC$L 3B&[hAs,XKmC%kRR9oL$9RīQB5 Q-ƅ-$)Txd/jO&2 Y,pBZQ̧2 IJi.l|4@jY'yP3,025&Q|]AejDj>?ka"r[\O{'k-&5UJ(W/g[*ѯLdCUsҊ/3\՘>Y*:bIxU"Ej3BdZ.n E?04׆˸tR *h$qo=\BN%ZX^(]]9JZ.i j+-6WFE3ըI[$WJ-ijXy/IK^fjZ<+nM$ZiPQER4dZe\vM٩LZǠ6*|nvϳ+*J{D 'IFh˄vŢ\]JYNT,>`'M\+Ujmsb39Pc(]R=Oajq5+ l|oAIdub{:OQs7hD9P=pvb&cc7앸 DTs%JPyJN(HkY-$jCr&漚 kA)TR_!heM ٳbI4u'(M!Zެup Y(c cLx\ DV>. 8jf.Q\[J@楺OL@4(tUG,#\)Zvt&.ѕZc^w<,ګ{'&VʆYHzR֪W&CKLIR>a %Av)JfIM]B\6b"YÊ-•%y3nPL+ 1 F-^ui|3s-Ab,WzwSb*YՄd$0P_J^a+ZCXu3Pa\k\B>[vRAE|RIqMTb|IG&տ2UCyy>kcTAu,6Qc$$䭵̵d.ndoIU\-.YfB g*FRbeE~.yT%Z\A5}V(d S,D&5]GI҅p)yQ }\Fl)3m >[7~ZX½ױPLi7d^+FISo5dI2IcGPP(ek5Nr>4[jiWm)ږ:eO '8WdRm_RO"d{!!~Z'r⹖/БXCp>H~HTOjBK$ɗ&J©ELv}~b"]U'PJ:qUHT҇z"n%Bd\ږl D7#I1I[Ƥ MgTyBe:]*iI^ uT,W hWk]RBl:zJ݇|d mZ$S%vBΪ.JXzГgU~(CA&(?+;R~~G<bp~uzE,rM`cZ!%E GV1Ĕ2 -Ir6 $5{TZ 9cU&Q:¦V8](dbx\Ɇ -絣D C*WZ i%Ml a_i4 g*/b/g82^JjGuXƽͣ>NT%.i'xƢ5OlJR|Kmk &S+5$`-%I.M(rOǿ-4ϢEyvgL ̄kٓ؆ZQ$vJSr`.5}Tn¦g)¾`:)h=7lxW疾.L AeBֻigJۜYU8E.[R QH0%P9%Z_P,;A9YJ@ lhJU&Z#f]ܼsQ'&B{D]v8cQbveJ(fZ$ hAgȗv$qiJ˺]+$bKğȗ8oad3]!-˩ڞXNvF*ڌNV,@v'3iZ/˴3є)g=R-,] g TaNR-LTR33g&gZ?UCUUN_*KlR?RRDVJXBH {e޶Z%tt8^kQ2O*7a0./Ro1c)'Vu ^ӋC\$/kɉPijV@.耑e.ђѓLI] T̳8W)DCRpKc]0)sƭ$/TsI\c0HJj=1#U i| 2X'`ZcD!ʵlQ1BX]*YMԹ% TQznAA>l4D%bDU-D-LChL?Z+<DqRThU$g)&ĵɤBN(%2Wt|Ѻ L@dꖑ4Uӵ5 bgďMb|VjRo6x)x֖ 2ӌlZK -6MoI`"]7dUH# +ER%#{a, rMjg"Qkm =!5lҮfh4ȥ l HZ݋c ?(QkGJ*!тF |$`*+yuJՒ` m3J5⯔xA ]ʳjJ,QbǟGKXRm:i嶧{zUKiў[zI`#,!E;NԎ//ʴMY$Dh˵6ԛr겮jb,ԹI6(ժNO᫵r1+ a_C2RaV3SmM3ɵ2qًHiuNԮݩ6x^ԝE-;-KMR 鷵6,LK"5E:gHռ'IBjdze e',Jsj>3%I_NZޘKbzh%}B [+`eѲtrzSJ:Y+m;*UQB"1QGA!AδK(>-{)unTY"[ D/jiZMřV,ϵ(ln8.=K=1b"xHD ˓]p,h1hn%*aʕezDZWln >kX$B+L*_͋T>T ja]&:JnpťPxXHj+ņFR$g FW(xK'S6tUtg-L꽝X* lbJrX*KBnH)A"$@RK$Y+,6s->F{j e}8}B֛L& PI T3SWrԹS, q>kOpbl:LSmo TYLZ !QܒZ H+F,v]9I\L-J.J m,"]gh9iJ 㥶=Õ>k-+JHi6 wk$tsc'dkj_<{)P.`%i# sb$FZI3߄)Y6u{+ Zd5͞54ψ+lRu$8&` 2X^F䴢n&K-6Yh]% nt $Tm%.WVo1SJ1J'麤&1uY喬U NVH\odaL/^':"JD.J} k%uŨ D}jrF5 j$D!v˕2^ou'}/eYzXt-kS5A2M35t˹1u8YGIjؑd>O7STLwt)x$z*ZkI2[jFYꐋ8-VM-Q:3%J3L躯( bH+B X"cMV ҿ'bJEzH8ɑm1d@I)IR]J#ZѥJKGqE! e#wj$Cr!a 8dj5-EҔjk LJm3ICNd5Mm2cKɍTJ܉,7Eq3)] r:X{EZVRlZoBVSiDՐId-!%)\ k}^Vr˞4>g 7pID&{87WlUHѣ(B" uR]})"-*N%eZ_K'$lA$hKcCaYEꮖ&Km!IZ͐%L%SpHNlrh&H(i_-ER% dN{-DY ȣ|=ȚJ:%\%YMBٹ fz% }VfJ,+2$reHIIH:. CHR}}n.API,S+Z{]wqͤ2eY OZ)_O/%_X%ZhRS)- N2P˯L+/eK\%-RsI'#,޴%ƚd!$Le,Ǻҹtӥ$I,-DR9EFL;SspildLVIUgt/ז\)CRjd:xB% Iطe,?,}J*X_'Z/yRZ{2tHFYnJ{)'<J/xMa&WOgOT[[fZ D-2lDƴy [>fҝ'_G,bFŒ,ҙ2CRlb'AZ%QC̙lNa߽T9gj/( RDi2B^SivH cOKT[V(MZ]Z䋷f' cS( BL$m5EI]\+YJ4bRN =u6DJP&'MG)zq,H~:Tq\Dؤ d9. .$eh;HZ˹D}Z'LgŒ鶤Bi0[+9@ I= jÂ$KŶ:#3[+ʞ1)|vI`I= LJ] EZfV)pr0bbm+@I$҅N> fdZ?S)UE S`"+IJ]2&*EIsYX@LU-sQm~y1M["W +=ħ/ %.r^$VST*JbDI%|.`n@3œ̌%.th11R8˴+*[K͈L>,frեTxZ.ZM*)\I}LJJ4R!h. IzgR}Q„W==>Z-h).a6TԅD-Мe5.Wwr}L&LkyMƖdA8"!51D\ CLJU<8S+bs/ZYDAC-H]umF"ZD *\5%گtj>9.!iy&j֦Xn%}7 A3ʗZEj{Kz_.#aZҘ.9b_V]2+JtBIH\d+%$O=[+EUtsEE!V+R.bIYAi@.5-M&Jeq0W.Z&U&g\l:y_qh60WL4Ia swRl1,bkJR8E:R& ibSRbx_ԔT+RC( 3JJKniMEՑ稞Ga}Z)KKdc r-LY2CY[BhUs%YOd$J/Al~5|>,MYBj׵T+Ne&Vz@WQ d[VZ\h\n1KUn ؅Mq{!+z=)(V`WjHBK4Վ[TVV32Ӻ2#j|.ja QP/’E0v^"S.恉6vzգ$CBIYi.9NH2r3A Tm5jUSjZZ̴Pꐒ2UQFIީ#%djʉPτB`BK1ifQZK*D+_$ZbPm T* B6k_uc*iigStt>E_Ҫ)Kx^xi ̵bKANȷg !2PdHɦM#i֥Rhtv/d,w"1&)XHLNV8JIf}͗ZD4-3eFRz4Zrij)u_JwB*{ZɄ]-$)|VJY E\շZbuQu!Q$eRZHKB[MOEQ3?y1-2FIIJJKJ^)RIKRmIMPQ@'Dہ% fhtd- -&ϴ)K5C%'e\$qTk,BH")ґtXhk^ JڦJ-# $pT5p k%+׶#&Z6Q( D%dk!xk_d)uD`VUZ1T=L3^:Yi=Ҕh݀^\H9CFQQR]?En-9ɳ$+]TMIA:^je5u58 fiۥ.)I4$Sݥ֥dVRpv *Z I[.|ޘ/=&jZ"8b@ZQAeg4r^Rkp@!zK*Y2٘Ysja"8J7"JF*= hMյYI^$FH=vOp鯆)$*NKD؆\-KR+Y&KRW6]Eac##W}%RAYJw(KmTKVj# )TjrXLRMXv>XIRhysYhIng)q }EUZ~P{ Lc`-ZEܯ'ȤjR$V?{VZ|I¢0/3doi7AEsPڸKYrj*|vA,wɭ LH$SBH ~ 4 :,`D%\Rtrm_]rfg&;{B§fR(#&EҘ"5S6i' pYJyh~ݥghD%`$k<)bZ ]VKeM' 'KϕK׊-T3WNޠNJ\1z6GE.LK@J =ȟ׋NTZT_>˲QKdyg7}Fd_Eޗo_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|GǿWߧ羽_>|џon;̿빏7뻾?y_oݧtsy^׹/7=t~sn~ˇ뺽/7}yk~>voo^uO{ο~_>~ϯߎx3>=߾gJɷ{?:>܇O?܇o| }Bᷛ~_D^w}$zL?+yfo盵͵J8vsyf9~&y>9Md]}^_z7|yVod|ݎ_n_W2N?ܻ~3s+Y_\][Z#o+ _o7Hηzܬ˿s~~=n>vrsr7;gn7 nֆZf^ozx|$LOdL~$c~~s?x{Oo|s/7| Wrv{O<7>9~57g_ɺtJ70=vop~ng2tlẏd~#coHbR}&o7+t'yt Qn>~sH\|Ǜ͚uoɞd_DgݾwrMM<<;W~$}4p3ndGdN<n|o>$.;O7s|h._}n7y~'/534.zgGf]~W@ f]G>}7MvF_Hmÿ_X)!kכ8w2ƓA-v}Lrf}F\ׯ7+-ӼNz'~!svAEa.䃿6W._IwnJBO::𧛱t[Sg__s/~~|okηZnm濏`DjI;ɇ_I] -~/7kdN}!cy.yĢH ɽuO 7e_^-yv;-~uOy|s ytN}"o㔯COdHvVg~_} I_I~s6|!Xd+m}!͞HcoF;>}쏤@u\Z2~7v|%y/?mgr[#W2y {뿒gv۟&F"A?=2~$6 j\n⥏77L So G@>J$F7cG'>_Imv~ޏ~ƴH>Z'қBzyoy|&3;>RcJ'2!yo|#cpnVg o7y2>|!c+M>m$7D~_{o,Yv=S ̬BTDH+^$CD &"{YR?AC`lwnL;2yzov.[#u?Q6B'Db bXy u5j]=DG1=7=Ոt~'ə:PߛX=`YMXqhxN&Pbwxj>ԵXdϔM:Oqi-pFP_Bm%y(K ZzK67x}½9Ki\__bG:\MɅ6_iO|A7Rmp盜pZ 8QGZ|ppfc4#7b~X{#_w7̘k+T&c~{]^q򢔗9a>e˨ f<O!Fm` ;8!G3*CnLPcvGi8 Nzwzg:8v'?ל L|7gZUX{' `ӉT5׼ydxSbmZy0]̃4_Y^-mIYJ{bN~gM.Tm>ƙ%yLg N[n,[ԙ6<{o618` ryvC.<9W?\̹l 18is7!X$gS -,'GNl +v;Қx2~BlƼ gW#`C?gq+ÛL4cݕ4=1#μd8%w:a)aF7E|_C?9][=L*E G]`D1>,ɘ`29D֙ t~YLݑPgWƪL&}jϝ9{-I׵A /smM^f 7 ׷TL5<>(ko'vFm;#~"_5:w16{Szv<=1N?#8!ZܙoW*F1.oFKĄkF?C'RD;sn%&M.lςrzL܊Ͷap~6j o{ sG`&1 M>u`wU+3So#>;(#f6<+S ?#O2|zW8:o.rZ=tD9%x>CSy1Xńtga+r܏zMrZS2`ְƺO&͞:!~ z?e0\KEFecp ՖOc45M|x]6hX|ed =~oњ 'uĜsvk䠘ֽh ٫+!;#l .uP8?!<c#؟^׈%t액

vq0,{o^djc 8ь3[o Filh?y /#4+X3̰K ~~fZֈm]o9MW`S C]uÇf}ˀX 3p.s8|R1!`ަ3X XD4&?{q5 .(ɾ+V;aѢI~55o|z_̾5~bu֨K*F,x2qOcr˻$ȧD7ا73#{MbK, &0^'SC3'y_0^k~0wұToxiM^L7Y3XbOךzwqGqܧo:=?5!gY]OR}M۟;p;Ss]Z}э#;ua^bkkj4S;w_әXk@ba(kؾz>`0`6~& wgr@s"wgL;?E}37&$q7rW45ũJĬ3xx?Dr;ig>JǾye }Gԋ*=g Χ5„a}<(cy9Ҝ9/S&c\^:Ծꌏ6QQ%7@n7>d/'R6[+hù65ShMIkrU:v}|jSp:p;\^3LIt'K;j()yt>9ӧ}"5fb0>Ux8@J?.ό\9en@qMל`7c=Wg|ſVMfOa&uwn п+ɗ'2nhӱhSZpft1\ ?}:tnq^s?{bHw )T;S3ÿm'\~ׇњf>:j&3|ԑ+Oxk5<wN1։jb9s-,' Eg/xb7Fo'<Ҧ=^g6Nn {c qÿ$&am`jX`g ƼC<41H-z5usOG/!6O]_3__GWi MGCkaWqӱ.x_[|ulϒnLBo'\ "k~kG̀Yx_|6\cbpV'qopbJOcS7C/=+<ldw&9{sZ3?ΦFyԌ^S)zסAΫ25rH{!|fs]3&5X 73QJ>:'t]oMvxhr*%t HmLlb' rmӟ-0\ho6x™bޚ뙲aں>{j<_7'\:5oJ^NG gWlE+CfNF9Qz{ ~gֵ3P DחsBdݗښح7xٜ{Gq%{6}5`y[SXOL>]vV2[m?kR.|?ksRK.݄ygQCP%8Sz{BG/3$vܡˍ5'xrcFK &1{Oӄ׮a{M'1 M; ru4+|rWS=&S;րzp].o\hr=X}R?R=S='Q3ƉL {'vc"/~Ae/s]In{:/q=ұwҌkァ_>'iZzAe9ɵ/guP@v &^ճM0w⮗drۼ5捴A}6I1J_q:W5V9ppfh?3KiLcrլ;9PJ?ik^jz\;]&| c l38gz)?^V49~?J}/~㿻|KzXgs5//8s^}5<~~g~yyg:kpy7c}69OW}5W7%;oM^_ {cjFy}z{Kxg3r~7W07ٟWW'b_L 7kϿnZe7_d$h18+^wt/gf}xǹw%}Vj[zYp?> ;f/sd\fb LrFW-EXNȫS4M]*xOހuo8&:`Fy)gLG9WeWVr2 |Gyh׫ k7蟋Ylڊ fpvKx}Fq}}t/Z-=ORaV[p}6p}o6*"Ww⣰WH8hasvݪfz}:Y8ȾS\?5O2ߝz?}4IB̥I S`7?LWmd/s0n xAt*?'ǩe[^|t웻=d/4?V8_dW}V779ح&{ 5s5 lE0 n5c*vCLnрgjrs~B0|̂ *WOnZn=0gLnr竜S7 /*Њ-}A =;[%p39a\Kp:턳l~cS.i{ kfS״6 Dg27wz=0v*xgpwl eq '+01BnÒ}7! g41h]UfCb\ny+QCŎ=52!'1约c!=w֗}~mmj'o? ~H6#&~Գe4c=V:UUm3l3Z~=3xrLAsu(w临gʙ=g1/*zx_ am l\d4.M\"p'o ;_$<"7:!OĻ|"CV`tvrίSL 9^/G=N+a͋v;!̭*Foq/O7ށ9y+*)ث7`Z Y:lë$&_i> \`_[͈So;Zy+8,r!|J{TfuɵW$޺e݀~h:N__ߦ㝅g"so >> 9W;϶T/=؋~R\t1j×X& N܌oI0LaCzAd~udn{3_wKǞ|C6|3@ׯo ;Q_éU c=Z px[heNbdk/C{o:rB\Mv&òC~d?wɼ9Z| Y^Ps}.ܠ4z.I[o#rیgr)t0?4K(i?GqfS!~e?6{n =\+Ƒe* Ey\k׈c{38+;+ _d\^棁kQ_5{~&T'; ~n??\L}ɆE̵=U_!př_Kso8˞뀛9.5fOϒC1"K|1\9I8y+"So_?>*qϢx{ުo+r꯶S]di"q՘ |{g1AK(6yAΑݏ*+]f~2C,o9*bx]Y[lcn1LLXπӱ >e/K_en&Ǯ:xk6kښMɌjg.gƎ:;. _ Odv{+$>od;伯sWwFDW͈Y&wF|]Ulb==ps{ݟ3|y L{=\'`K8^s' sk7Wc뵠+UoaL9oǻ;cϘġ}//}C *9pq'' u+⹻&ɿ^ v1{z[:O>;GuOFN;.gh?zϢ_.'3 Ikp/5Nی^Z0b}: ik&GZY|Xb ?f2 }VE;_M`̿wط}}5蹋QX6G\~/&c~r‰*fF q.<uq\ncǦο 67*3F6&g6{qv8!pOnzŊic N9ʋ/uaP ٷq؈[kX -|AFR:ON// Wɟ.YM{:l&2c\ɝ+!'^7B΋N L y69SUf/gL0y}:)=YZ)[L2 ǣM;u>L㝼Uf;n?h^fC^|158wpjn៵xOĒ;Yӣ Ռb`Y[:^K53F{ЌXeiX{ɃGU==)}";Xkp)Ϻ o[7/Vl|Eşs<9Zv9<&іӱw+S^{w)WC{q.q wM=8Vf_{jkFԯzx|@N =4b, W^ʊ\O9'Ukk:a+"L(RwL}n؟ y9tc胜+[c/I-+/wW[]Q-=K/X ߥ[̿Ӛ|| o`#~}K}>/h}*qhl`|1s#<;s\sڟW ZyCkxؓߠ8Y c62j3ap, LļsF-t/Q`8!+plU>Yŷ}ļcxUlIqлdh/Ʊ_8W^3L75suʫ}E*gtUlE#>][ v0>+0 Hz6M%ԿMbKzW?*]nȝ+ƾw.V/YoVmJL?\sNy/rkFVS_5.EzvXpgÁR^1ĩ[ 1+Ɣ Tݷ.ChK;|xǴt=l-Χ?{{^sje{9shǹ>Ƽ䋌+!ŴS x⯨AѳspzBޤn^LEy7xu]d=s4ifu)y<i=v: pr/?YOrQ;3}*xχ\~m\=M}9q6\~>;t|&7\ӆ8+l ~∘FuzAqo+0E<+l <5> +~&?it3ڦp4|Z_eZ͉.=eNL+xtQ<|k.z\dNbFlSteBiO6qN͍]?~ 6ԦLMѮ駾e u|K:/o6_ywO4zg5fϸ3~cjpK4[%=txz 1ETo]ⴒyA2\|~K$I>fX>sWW}o^B>w'u2/G.>&6 | pѻ3 >j?={30G/NW|.şsj59NDcO}ޞ6^|%xMo)%;pW ~99EdxԘ~ + 8z%]zfEuGJywh$w}߽—wtFzeƷ"9W?7\9S_SV3O7[OE ^+޷GrE}&W /}7qy<7<u655#:kMϵ$ߗG,1?k@|}Z8+tw@_؁6?u}wk&vM}kt5<'9#^SnxaϿ<6xKǻ~n0C=V^WG͸zO}/=[P׳S7/ms={3d>}5s.X~7w lpB1T|'Z}s[`# |وҊ\0'$ k:&8+xZˬ~jC gsL*z''u/&Gx琎}ch}gWR8rpIw_bg0 ?NL\m_x܅}]%>W[<ӄᘎwwлt\x7!!;lNQiq#}2z%;VĈ1;!rA]$1s5o6oM0bJt>$V]' dFN?_5o[g#8&k:ޛ0 O>o K%& #^=W ttN_ |~כjGAfY@4y3~wB$Ͽz Czwg̀/(OW~oxg[qfޡX`[z=kzvM Ω;bofޱ&} =6O'b/KM9kz\`&oh չԭxW~9rƈmOK'M=j1yټ$ܡpٿ"1ފp]WKpL4֝kPp&lzw<ӥc|؜gߤc)?'R&q7Ma̝{sN,__iO}6>I\iZpOpY.i_1=31o⻨}Zw>ɭȇN?wCBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB,)9ҟ$c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1uQ[gI)M)}L$)),U?+;ݏTϯ/2񺟿~y#cyzZg5{V}~?~wx+92\~7=L&~+|_2||Q毒ϱ =^;|}񷽼w\֫g׫>>;-0w>{5dMϐ5{yR>>cϟx$kd=gס׮estFְœ6 I>-i%Ϛc`^s{; );9s^稰J|ϢYd ,<`Z>o5JJ|ײ;9Ok 3@Ge7FuD0tWf1uB+e=U?k| NX]^D#ks{$spj-}ٿNNn({fy.p{ ۟p*<izgU}V?0 m_gԳ_.*TֺgJ3Cg 6ؓ$XmWa19 :ݦM^¿yƽ>{jz&Zޡ[ufs/[h$%bQ[it09ℳ<8W†SLF/Y3c[2]dy.v77(ClZ<=>|&g<7{}Ą9WcԦ>ɍG],40:ijQg92cgWg.'5=+y5jg;{2[+g8=C(>#Fb̸ೞ{pOyL]'&@/e߽-q `0/3mE/&i䳔ev06iꀹVFɬs\ b;YJU;&9[` JnB3qa`>t8#g qka>pfl|klm>t=ۓحø5N&YPgxnt@a>wN| x:G҉gEW4kt7IvfAB4X3 dF2&S;K"C (Gw;e8D%yɜ ] yL;lniV21J ܲua!BΣ4~R!チ_Z ^(?nN`jzY iJc| Ju-e\`]hWGp J^6z%TJn| y+_ºV,~ itv=QT؂Nrmlcxfz<s$g3{Xc#Kfj)j Y4mprmb 9s=br>΁ Z7,Ǫn>W9}䞭ddX2 Ru̜W&*7jY|sE;@n2k"VQYډ^ {1s_xB>Kׂ,jxذ vRILFP5K1g'}?*O̼w#R=nL,Zv 8 ̏|0@-ӵ~1z3+d.Wsr+tqcr-7ycJ~`u~ ~=}[MmY Q ߞ5x=FW[J}\db7-5EC׈q9w_+{}[KN6yhcj# wM=Wq s-8T̢M@-eܘWb b-n_-B:#{]|_`=W<@bO57LkNb,=1_s*wGgzf;@%1\3#uz.Ŷ{Vu Q:clݟNVǍ-"?:!}0JNLwp+Ouj؛d֚' {4:E8c5vj c29Q|2 y}>KzSe:5roc׿g锞 GB.:6>U BjWƾ%b;: ~%grԆb;.DsЍKâ$38|i?#Ύd_}JF&B rُcأeznWcJ&/'n.|}jJ?q]PN!7*8OKe nJ(goKdƆ=0آd/:z)XCk?I.'MzhW+~NpT >Nyt,'{'YJ=ާdG3;нBXNri(M]zcfTȕ&E)/ 'f¾uv_(X;Ty\=3T]9˾mIO_%>e53XFkzwS<&|\b%%ЕuW~FYitRn%7B}7; FsWat'ʠrv쟔 v< :=B0O-| ~l̞/ 4(7تڰcɬ鹿O6`;RIJ37#ݳZ[In9FWp\y;3ɝ/!jyW~W_OCK;N$$\:,yu&<1Δ͛UX ,.3ϐ#OWcߣdg­$M>XJrU5'҂C@^ұb YWr9JOr8lkȷc8㱵:+ؐ]4ԏr=8L( &=%db֒pfF!*~fޘ5 ČF1žƶ@F?7؟0kZW]Lj=ր[k쉦0 ȱN:o3|=6{Wpo&6y9_q``Xb:ᠦtz;Nz29ދ=Ufy.gp Nb%%߫`{tOP`^tNSX8<ĩyis*ޥcRiϯM:I#ى%_ۤc?.b9v|4ƗֱS$_3˻;r^K2JJǚ>y; z4n|X>8ĵk4>ΐ{Ȳ⽭{:͹);B]oy@_ŒJ<+lFT'RFK9HFA7qzM/fr;;_ +< 0g>՞j~_W֞{֋(gW8W )EWrjĉؗOw(.{`~/+wTb;C>;Ƃʥx3Bxm|pbj_tQ\h n[Fǔ\._&o29tYntga&|W/{zp8{6&ߧ I8JsZm3xFeK E7!HX`U:'`0uz)jyj_?}yg.4.ƥ+-%U+FgoC8b\0&;47k9$zyxIJX3Sf*Z[B̍~dx&3헰n5=Չmtdxq{Ng(MVN;.$s+ebM{sl~PuN_;o;ӱgHaZq#4..w|L?(MΓ6 z_}QZ[|-r\=9RcsZMUn1 *eyK538kĶյ[C g53֤&y38 2+Ku'g t?Jj-f&HD9I9=a?wuJڃ.Mzg?z\'2XPha|0|iN9*e"4. ^Y^ie:r/+X41*+rxy̔?!3;-k9Y?ɷN]S=5=V:)j`_w51z l睐Qe̥9իH~JZgfș' kxPg~~ͳ.v S:JОtk}d3ď0{ rt[pHړ.mᓕCG&gs̾1- :K*-_}Nva~c~Z!Gؠgjn49'Qy/k`A9r3ל-@w;LK} KoiǾ`{p5ȑ+s2!xlJ}t>=z8ϣ@>G_40՘4X{ -3XYrn|q^.D2xrVf|àNW>sbngϡrزssl5&_{^> Hr{fr/S+I1P{&wW{spג%#@,L{RZ]ə ;Y1> ֛.kIr-K%^rĜ_EOf\)=*c:LfhqO:#ulŇh)Ϩ6Ƙ.ֈ{83}پ1BNOWRxMII9z|qYI(7Rb3˓ߐ nQ =;kw[ӱnAp[**<&C}vw*ktpq^ұj ojdxmqH {]~RB[O> }pzK{'|KǺV7'>[k8 s R9#+'r|:_9gZ!B}hRnp u6csX639\d3M^sƌg ؋F/~{?柰?_~7/owï{˟sŷ_??7?|?ᇧoݟ~_U?_VWwßo\Y9, ߟ__xc~?O~cקWJNN.atcR/man/0000755000176200001440000000000013667026455011573 5ustar liggesuserstcR/man/repDiversity.Rd0000644000176200001440000000414413667026455014556 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/repdiversity.R \name{repDiversity} \alias{repDiversity} \title{General function for the repertoire diversity estimation.} \usage{ repDiversity( .data, .method = c("chao1", "gini.simp", "inv.simp", "gini", "div", "entropy"), .quant = c("read.count", "umi.count", "read.prop", "umi.prop"), .q = 5, .norm = F, .do.norm = NA, .laplace = 0 ) } \arguments{ \item{.data}{Cloneset or a list of clonesets.} \item{.method}{Which method to use for the diversity estimation. See "Details" for methods.} \item{.quant}{Which column to use for the quantity of clonotypes: "read.count" for the "Read.count" column, "umi.count" for the "Umi.count" column, "read.prop" for the "Read.proportion" column, "umi.prop" for the "Umi.proportion" column.} \item{.q}{q-parameter for the Diversity index.} \item{.norm}{If T than compute the normsalised entropy.} \item{.do.norm}{One of the three values - NA, T or F. If NA than check for distrubution (sum(.data) == 1) and normalise it with the given laplace correction value if needed. if T then do normalisation and laplace correction. If F than don't do normalisaton and laplace correction.} \item{.laplace}{Value for Laplace correction.} } \description{ General interface to all cloneset diversity functions. } \details{ You can see a more detailed description for each diversity method at \link{diversity}. Parameter \code{.method} can have one of the following value each corresponding to the specific method: - "div" for the true diversity, or the effective number of types (basic function \code{diversity}). - "inv.simp" for the inverse Simpson index (basic function \code{inverse.simpson}). - "gini" for the Gini coefficient (basic function \code{gini}). - "gini.simp" for the Gini-Simpson index (basic function \code{gini.simpson}). - "chao1" for the Chao1 estimator (basic function \code{chao1}). - "entropy" for the Shannon entropy measure (basic function \code{entropy}). } \examples{ \dontrun{ data(twb) twb.div <- repDiversity(twb, "chao1", "read.count") } } \seealso{ \link{diversity}, \link{entropy} } tcR/man/vis.heatmap.Rd0000644000176200001440000000306513667026455014305 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/plots.R \name{vis.heatmap} \alias{vis.heatmap} \title{Heatmap.} \usage{ vis.heatmap( .data, .title = "Number of shared clonotypes", .labs = c("Sample", "Sample"), .legend = "Shared clonotypes", .na.value = NA, .text = T, .scientific = FALSE, .signif.digits = 4, .size.text = 4, .no.legend = F, .no.labs = F ) } \arguments{ \item{.data}{Either a matrix with colnames and rownames specifyed or a data.frame with the first column of strings for row names and other columns stands for values.} \item{.title}{Main title of the plot.} \item{.labs}{Labs names. Character vector of length 2 (for naming x-axis and y-axis).} \item{.legend}{Title for the legend.} \item{.na.value}{Replace NAs with this values.} \item{.text}{if T then print \code{.data} values at tiles.} \item{.scientific}{If T then force show scientific values in the heatmap plot.} \item{.signif.digits}{Number of significant digits to show. Default - 4.} \item{.size.text}{Size for the text in the cells of the heatmap, 4 by default.} \item{.no.legend}{If T than remove the legend from the plot.} \item{.no.labs}{If T than remove x / y labels names from the plot.} } \value{ ggplot object. } \description{ Plot a heatmap from a matrix or a data.frame } \examples{ \dontrun{ # Load your data. load('immdata.rda') # Perform cloneset overlap by amino acid sequences with V-segments. imm.av <- repOverlap(immdata, .seq = 'aa', .vgene = T) # Plot a heatmap. vis.heatmap(imm.av, .title = 'Immdata - (ave)-intersection') } } tcR/man/sample.clones.Rd0000644000176200001440000000115013667026401014611 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/datatools.R \name{sample.clones} \alias{sample.clones} \title{Get a random subset from a data.frame.} \usage{ sample.clones(.data, .n, .replace = T) } \arguments{ \item{.data}{Data.frame or a list with data.frames} \item{.n}{Sample size if integer. If in bounds [0;1] than percent of rows to extract. "1" is a percent, not one row!} \item{.replace}{if T then choose with replacement, else without.} } \value{ Data.frame of nrow .n or a list with such data.frames. } \description{ Sample rows of the given data frame with replacement. } tcR/man/gc.content.Rd0000644000176200001440000000063313667026401014115 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/strtools.R \name{gc.content} \alias{gc.content} \title{GC-content of a nucleotide sequences.} \usage{ gc.content(.nucseq) } \arguments{ \item{.nucseq}{Character vector of nucletoide sequences.} } \value{ Numeric vector of \code{length(.nucseq)}. } \description{ Compute the GC-content (proportion of G-C nucleotide in a sequence). } tcR/man/find.clonotypes.Rd0000644000176200001440000000430013667026455015175 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/stats.R \name{find.clonotypes} \alias{find.clonotypes} \title{Find target clonotypes and get columns' value corresponded to that clonotypes.} \usage{ find.clonotypes( .data, .targets, .method = c("exact", "hamm", "lev"), .col.name = "Read.count", .target.col = "CDR3.amino.acid.sequence", .verbose = T ) } \arguments{ \item{.data}{List with mitcr data.frames or a mitcr data.frame.} \item{.targets}{Target sequences or elements to search. Either character vector or a matrix / data frame (not a data table!) with two columns: first for sequences, second for V-segments.} \item{.method}{Method, which will be used to find clonotypes: - "exact" performs exact matching of targets; - "hamm" finds targets and close sequences using hamming distance <= 1; - "lev" finds targets and close sequences using levenshtein distance <= 1.} \item{.col.name}{Character vector with column names which values should be returned.} \item{.target.col}{Character vector specifying name of columns in which function will search for a targets. Only first column's name will be used for matching by different method, others will match exactly. \code{.targets} should be a two-column character matrix or data frame with second column for V-segments.} \item{.verbose}{if T then print messages about the search process.} } \value{ Data.frame. } \description{ Find the given target clonotypes in the given list of data.frames and get corresponding values of desired columns. } \examples{ \dontrun{ # Get ranks of all given sequences in a list of data frames. immdata <- set.rank(immdata) find.clonotypes(.data = immdata, .targets = head(immdata[[1]]$CDR3.amino.acid.sequence), .method = 'exact', .col.name = "Rank", .target.col = "CDR3.amino.acid.sequence") # Find close by levenhstein distance clonotypes with similar V-segments and return # their values in columns 'Read.count' and 'Total.insertions'. find.clonotypes(.data = twb, .targets = twb[[1]][, c('CDR3.amino.acid.sequence', 'V.gene')], .col.name = c('Read.count', 'Total.insertions'), .method = 'lev', .target.col = c('CDR3.amino.acid.sequence', 'V.gene')) } } tcR/man/assymetry.Rd0000644000176200001440000000153013667026401014110 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/infoanalysis.R \name{assymetry} \alias{assymetry} \title{Normalised log assymetry.} \usage{ assymetry(.alpha, .beta = NULL, .by = "CDR3.nucleotide.sequence") } \arguments{ \item{.alpha}{First mitcr data.frame or a list with data.frames.} \item{.beta}{Second mitcr data.frame or NULL if \code{.alpha} is a list.} \item{.by}{Which column use to merge. See "Details".} } \value{ Value of the normalised log assymetry measure for the given data.frames. } \description{ Compute the value of the normalised log assymetry measure for the given data.frames of the counts of shared clones. } \details{ Merge two data frames by the given column and compute value Sum(Log((Percentage for shared clone S from alpha) / (Percentage for shared clone S from beta))) / (# of shared clones). } tcR/man/mutation.network.Rd0000644000176200001440000000340113667026455015410 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/graph.R \name{mutation.network} \alias{mutation.network} \title{Make mutation network for the given repertoire.} \usage{ mutation.network( .data, .method = c("hamm", "lev"), .max.errors = 1, .label.col = "CDR3.amino.acid.sequence", .seg.col = "V.gene", .prob.col = "Probability" ) } \arguments{ \item{.data}{Either character vector of sequences, data frame with \code{.label.col} or shared repertoire (result from the \code{shared.repertoire} function) constructed based on \code{.label.col}.} \item{.method}{Either "hamm" (for hamming distance) or "lev" (for edit distance). Passed to the \code{find.similar.sequences} function.} \item{.max.errors}{Passed to the \code{find.similar.sequences} function.} \item{.label.col}{Name of the column with CDR3 sequences (vertex labels).} \item{.seg.col}{Name of the column with V gene segments.} \item{.prob.col}{Name of the column with clonotype probability.} } \value{ Mutation network, i.e. igraph object with input sequences as vertices labels, ??? } \description{ Mutation network (or a mutation graph) is a graph with vertices representing nucleotide or in-frame amino acid sequences (out-of-frame amino acid sequences will automatically filtered out) and edges are connecting pairs of sequences with hamming distance or edit distance between them no more than specified in the \code{.max.errors} function parameter. } \examples{ \dontrun{ data(twb) twb.shared <- shared.repertoire(twb) G <- mutation.network(twb.shared) get.people.names(G, 300, T) # "Subj.A|Subj.B" get.people.names(G, 300, F) # list(c("Subj.A", "Subj.B")) } } \seealso{ \link{shared.repertoire}, \link{find.similar.sequences}, \link{set.people.vector}, \link{get.people.names} } tcR/man/dot-column.choice.Rd0000644000176200001440000000057713667026455015405 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/datatools.R \name{.column.choice} \alias{.column.choice} \title{Choose the right column.} \usage{ .column.choice(x, .verbose = T) } \arguments{ \item{x}{Character vector with column IDs.} \item{.verbose}{If T then print the error mesasge.} } \value{ Character. } \description{ Choose the right column. } tcR/man/vis.clonal.space.Rd0000644000176200001440000000117213667026401015214 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/plots.R \name{vis.clonal.space} \alias{vis.clonal.space} \title{Visualise occupied by clones homeostatic space among Samples or groups.} \usage{ vis.clonal.space(.clonal.space.data, .groups = NULL) } \arguments{ \item{.clonal.space.data}{Data from the \code{fclonal.space.homeostasis} function.} \item{.groups}{List of named character vector with names of Samples in \code{.clonal.space.data} for grouping them together.} } \value{ ggplot object. } \description{ Visualise which clones how much space occupy. } \seealso{ \link{clonal.space.homeostasis} } tcR/man/vis.rarefaction.Rd0000644000176200001440000000152213667026401015146 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/plots.R \name{vis.rarefaction} \alias{vis.rarefaction} \title{Rarefaction statistics visualisation.} \usage{ vis.rarefaction(.muc.res, .groups = NULL, .log = F, .names = T) } \arguments{ \item{.muc.res}{Output from the \code{muc} function.} \item{.groups}{List with names for groups and names of the group members. If NULL than each member is in the individual group.} \item{.log}{if T then log-scale the y axis.} \item{.names}{If T then print number of samples.} } \description{ Plot a line with mean unique clones. } \examples{ \dontrun{ data(twb) names(twb) # "Subj.A" "Subj.B" "Subj.C" "Subj.D" twb.rar <- rarefaction(twb, .col = "Read.count") vis.rarefaction(twb.rar, list(A = c("Subj.A", "Subj.B"), B = c("Subj.C", "Subj.D"))) } } \seealso{ \link{rarefaction} } tcR/man/shared.repertoire.Rd0000644000176200001440000000734713667026401015511 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/shared.R \name{shared.repertoire} \alias{shared.repertoire} \alias{shared.matrix} \title{Shared TCR repertoire managing and analysis} \usage{ shared.repertoire(.datalist, .type = 'avrc', .min.ppl = 1, .head = -1, .clear = T, .verbose = T, .by.col = '', .sum.col = '', .max.ppl = length(.datalist)) shared.matrix(.shared.rep) } \arguments{ \item{.datalist}{List with data frames.} \item{.type}{String of length 4 denotes how to create a shared repertoire. See "Details" for more information. If supplied, than parameters \code{.by.col} and \code{.sum.col} will be ignored. If not supplied, than columns in \code{.by.col} and \code{.sum.col} will be used.} \item{.min.ppl}{At least how many people must have a sequence to leave this sequence in the shared repertoire.} \item{.head}{Parameter for the \code{head} function, applied to all data frames before clearing.} \item{.clear}{if T then remove all sequences which have symbols "~" or "*" (i.e., out-of-frame sequences for amino acid sequences).} \item{.verbose}{if T then output progress.} \item{.by.col}{Character vector with names of columns with sequences and their parameters (like segment) for using for creating a shared repertoire.} \item{.sum.col}{Character vector of length 1 with names of the column with count, percentage or any other numeric chaaracteristic of sequences for using for creating a shared repertoire.} \item{.max.ppl}{At most how many people must have a sequence to leave this sequence in the shared repertoire.} \item{.shared.rep}{Shared repertoire.} } \value{ Data frame for \code{shared.repertoire}, matrix for \code{shared.matrix}. } \description{ Generate a repertoire of shared sequences - sequences presented in more than one subject. If sequence is appeared more than once in the one repertoire, than only the first appeared one will be choosed for a shared repertoire. \code{shared.repertoire} - make a shared repertoire of sequences from the given list of data frames. \code{shared.matrix} - leave columns, which related to the count of sequences in people, and return them as a matrix. I.e., this functions will remove such columns as 'CDR3.amino.acid.sequence', 'V.gene', 'People'. } \details{ Parameter \code{.type} is a string of length 4, where: \enumerate{ \item First character stands either for the letter 'a' for taking the "CDR3.amino.acid.sequence" column or for the letter 'n' for taking the "CDR3.nucleotide.sequence" column. \item Second character stands whether or not take the V.gene column. Possible values are '0' (zero) stands for taking no additional columns, 'v' stands for taking the "V.gene" column. \item Third character stands for using either UMIs or reads in choosing the column with numeric characterisitc (see the next letter). \item Fourth character stands for name of the column to choose as numeric characteristic of sequences. It depends on the third letter. Possible values are "c" for the "Umi.count" (if 3rd character is "u") / "Read.count" column (if 3rd character is "r"), "p" for the "Umi.proportion" / "Read.proportion" column, "r" for the "Rank" column or "i" for the "Index" column. If "Rank" or "Index" isn't in the given repertoire, than it will be created using \code{set.rank} function using "Umi.count" / "Read.count" column. } } \examples{ \dontrun{ # Set "Rank" column in data by "Read.count" column. # This is doing automatically in shared.repertoire() function # if the "Rank" column hasn't been found. immdata <- set.rank(immdata) # Generate shared repertoire using "CDR3.amino.acid.sequence" and # "V.gene" columns and with rank. imm.shared.av <- shared.repertoire(immdata, 'avrc') } } \seealso{ \link{shared.representation}, \link{set.rank} } tcR/man/kmer.table.Rd0000644000176200001440000000323013667026401014073 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/kmers.R \name{kmer.table} \alias{kmer.table} \alias{get.kmer.column} \title{Make and manage the table of the most frequent k-mers.} \usage{ kmer.table(.data, .heads = c(10, 100, 300, 1000, 3000, 10000, 30000), .k = 5, .nrow = 20, .clean = T, .meat = F) get.kmer.column(.kmer.table.list, .head) } \arguments{ \item{.data}{tcR data.frame or a list with tcR data.frames.} \item{.heads}{Vector of parameter for the \code{head()} function, supplied sequentialy to the \code{get.kmers()} function. -1 means all rows.} \item{.k}{Size of the kmer.} \item{.nrow}{How many most frequent k-mers include to the output table.} \item{.clean}{Parameter for the \code{get.kmers()} function.} \item{.meat}{Parameter for the \code{get.kmers()} function.} \item{.kmer.table.list}{Result from the \code{kmer.table} function if \code{.data} supplied as a list.} \item{.head}{Which columns with this head return.} } \value{ \code{kmer.table} - if \code{.data} is a data frame, than data frame with columns like "Kmers.X", "Count.X" where X - element from \code{.heads}. If \code{.data} is a list, than list of such data frames. \code{get.kmer.column} - data frame with first column with kmers and other columns named as a names of data frames, from which \code{.kmer.table.list} was generated. } \description{ \code{kmer.table} - generate table with the most frequent k-mers. \code{get.kmer.column} - get vector of k-mers from the k-mer table from the function \code{kmer.table} } \examples{ \dontrun{ twb.kmers <- kmer.table(twb, .heads = c(5000, 10000), .meat = T) head(get.kmer.column(twb.kmers, 10000)) } } tcR/man/vis.count.len.Rd0000644000176200001440000000215313667026401014557 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/plots.R \name{vis.count.len} \alias{vis.count.len} \title{Plot a histogram of lengths.} \usage{ vis.count.len(.data, .ncol = 3, .name = "", .col = "Read.count") } \arguments{ \item{.data}{Data frame with columns 'CDR3.nucleotide.sequence' and 'Read.count' or list with such data frames.} \item{.ncol}{If .data is a list, than number of columns in a grid of histograms for each data frame in \code{.data}. Else not used.} \item{.name}{Title for this plot.} \item{.col}{Name of the column to use in computing the lengths distribution.} } \value{ ggplot object. } \description{ Plot a histogram of distribution of lengths of CDR3 nucleotide sequences. On y-axis are sum of read counts for each length. } \details{ If \code{.data} is a data frame, than one histogram will be plotted. Is \code{.data} is a list, than grid of histograms will be plotted. } \examples{ \dontrun{ load('immdata.rda') # Plot one histogram with main title. vis.count.len(immdata[[1]], 'Main title here') # Plot a grid of histograms with 2 columns. vis.count.len(immdata, 2) } } tcR/man/get.kmers.Rd0000644000176200001440000000225213667026455013762 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/kmers.R \name{get.kmers} \alias{get.kmers} \title{Get kmers from sequences.} \usage{ get.kmers( .data, .head = -1, .k = 5, .clean = T, .meat = F, .verbose = T, .left.shift = 0, .right.shift = 0 ) } \arguments{ \item{.data}{Either character vector or a data.frame.} \item{.head}{Parameter for head function applied to the given data before kmer generation.} \item{.k}{Size of the kmer.} \item{.clean}{if T then remove sequences which contain '~' or '*' symbols. Useful for deleting out-of-frame aminoacid sequnces.} \item{.meat}{if TRUE than .data must be data.frame with columns CDR3.amino.acid.sequence and Read.count.} \item{.verbose}{if T then print progress.} \item{.left.shift}{Cut all \code{.left.shift} symbols from the left side for each sequence.} \item{.right.shift}{Cut all \code{.right.shift} symbols from the right side for each sequence.} } \value{ Data.frame with 2 columns Kmers and Count / Rank / Proportion relatively to the .value param or a list with such data.frames if .data is a list. } \description{ Get vector of kmers from the given character vector or data frame. } tcR/man/contamination.stats.Rd0000644000176200001440000000354313667026401016056 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/filters.R \name{contamination.stats} \alias{contamination.stats} \alias{decontamination} \title{Contamination filtering.} \usage{ contamination.stats(.data1, .data2, .limit = 20, .col = 'Read.count') decontamination(.data1, .data2, .limit = 20, .col = 'Read.count', .symm = T) } \arguments{ \item{.data1}{First data frame with columns 'CDR3.nucleotide.sequence' and 'Read.count'. Will be checked for contamination.} \item{.data2}{Second data frame with such columns. Will be used for checking for sequences which contaminated the first one.} \item{.limit}{Parameter for filtering: all sequences from \code{.data1} which are presented in \code{.data2} and (count of in \code{.data2}) / (count of seq in \code{.data1}) >= \code{.limit} are removed.} \item{.col}{Column's name with clonal count.} \item{.symm}{if T then perform filtering out of sequences in .data1, and then from .data2. Else only from .data1.} } \value{ Filtered \code{.data1} or a list with filtered both \code{.data1} and \code{.data2}. } \description{ Occasionally DNA or RNA libraries are contaminate each other. To address this issue and estimate contamination rate \code{tcR} offers \code{contamination.stats} and \code{decontamination} functions. The \code{decontamination} function received data (either data frame or a list with data frames) and a limit for clonal proportion as arguments. Script searches for a similar clones to the first data frame in the other (or performs pairwise searches if the given data is a list) and removes clones from the first data frame, which has been found in the second one with counts less or equal to 10 * counts of similar clones in the first one. Function \code{contamination.stats} will return the number of clones which will be removed with the \code{contamination.stats} function. } tcR/man/set.rank.Rd0000644000176200001440000000124413667026401013577 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/dataproc.R \name{set.rank} \alias{set.rank} \alias{set.index} \title{Set new columns "Rank" and "Index".} \usage{ set.rank(.data, .col = "Read.count") } \arguments{ \item{.data}{Data frame or list with data frames.} \item{.col}{Character vector with name of the column to use for ranking or indexing.} } \value{ Data frame with new column "Rank" or "Index" or list with such data frames. } \description{ Set new columns "Rank" and "Index": set.rank <==> .data$Rank = rank(.data[, .col], ties.method = 'average') set.index <==> .data$Index = 1:nrow(.data) in a sorted data frame by \code{.col} } tcR/man/rarefaction.Rd0000644000176200001440000000357613667026455014372 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/diversity.R \name{rarefaction} \alias{rarefaction} \title{Diversity evaluation using rarefaction.} \usage{ rarefaction( .data, .step = NA, .quantile = c(0.025, 0.975), .extrapolation = 2e+05, .col = "Umi.count", .verbose = T ) } \arguments{ \item{.data}{Data frame or a list with data frames.} \item{.step}{Step's size. By default - minimal repertoire size divided by 50.} \item{.quantile}{Numeric vector of length 2 with quantiles for confidence intervals.} \item{.extrapolation}{If N > 0 than perform extrapolation of all samples to the size of the max one +N reads or UMIs. By default - 200000.} \item{.col}{Column's name from which choose frequency of each clone.} \item{.verbose}{if T then print progress bar.} } \value{ Data frame with first column for sizes, second columns for the first quantile, third column for the mean, fourth columns for the second quantile, fifth columns for the name of subject. } \description{ Sequentially resample the given data with growing sample size the given data and compute mean number of unique clones. For more details on the procedure see "Details". } \details{ This subroutine is designed for diversity evaluation of repertoires. On each step it computes a mean unique clones from sample of fixed size using bootstrapping. Unique clones for each sample from bootstrap computed as a number of non-zero elements in a vector from multinomial distribution with input vector of probabilities from the \code{.col} column using function \code{rmultinom} with parameters n = .n, size = i * .step, prob = .data[, .col] (i is an index of current iteration) and choosing for lower and upper bound \code{quantile} bounds of the computed distribution of unique clones. } \examples{ \dontrun{ rarefaction(immdata, .col = "Read.count") } } \seealso{ \link{vis.rarefaction} \link{rmultinom} } tcR/man/vis.shared.clonotypes.Rd0000644000176200001440000000454513667026455016336 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/plots.R \name{vis.shared.clonotypes} \alias{vis.shared.clonotypes} \title{Visualisation of shared clonotypes occurrences among repertoires.} \usage{ vis.shared.clonotypes( .shared.rep, .x.rep = NA, .y.rep = NA, .title = NA, .ncol = 3, .point.size.modif = 1, .cut.axes = T, .density = T, .lm = T, .radj.size = 3.5, .plot = T ) } \arguments{ \item{.shared.rep}{Shared repertoires, as from \link{shared.repertoire} function.} \item{.x.rep}{Which repertoire show on x-axis. Either a name or an index of a repertoire in the \code{.shared.rep} or NA to choose all repertoires.} \item{.y.rep}{Which repertoire show on y-axis. Either a name or an index of a repertoire in the \code{.shared.rep} or NA to choose all repertoires.} \item{.title}{Main title of the plot.} \item{.ncol}{Number of columns in the resulting plot.} \item{.point.size.modif}{Modify this to correct sizes of points.} \item{.cut.axes}{If T than cut axes' limits to show only frequencies that exists.} \item{.density}{If T than plot densities of shared and unique clonotypes.} \item{.lm}{If T than fit and plot a linear model to shared clonotypes.} \item{.radj.size}{Size of the text for R^2-adjusted.} \item{.plot}{If F than return grobs instead of plotting.} } \value{ ggplot2 object or plot } \description{ Visualise counts or proportions of shared clonotypes among repertoires. Code adapted from https://www.r-bloggers.com/ggplot2-cheatsheet-for-visualizing-distributions/. } \examples{ \dontrun{ data(twb) # Show shared nucleotide clonotypes of all possible pairs # using the Read.proportion column twb.sh <- shared.repertoire(twb, "n0rp") vis.shared.clonotypes(twb.sh, .ncol = 4) # Show shared amino acid + Vseg clonotypes of pairs # including the Subj.A (the first one) using # the Read.count column. twb.sh <- shared.repertoire(twb, "avrc") vis.shared.clonotypes(twb.sh, 1, NA, .ncol = 4) # same, just another order of axis vis.shared.clonotypes(twb.sh, NA, 1, .ncol = 4) # Show shared nucleotide clonotypes of Subj.A (the first one) # Subj.B (the second one) using the Read.proportion column. twb.sh <- shared.repertoire(twb, "n0rp") vis.shared.clonotypes(twb.sh, 1, 2) # Show the same plot, but with much larget points. vis.shared.clonotypes(twb.sh, 1, 2, .point.size.modif = 3) } } \seealso{ \link{shared.repertoire} } tcR/man/entropy.seg.Rd0000644000176200001440000000420013667026401014322 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/infoanalysis.R \name{entropy.seg} \alias{entropy.seg} \alias{js.div.seg} \title{Repertoires' analysis using information measures applied to V- and J- segment frequencies.} \usage{ entropy.seg(.data, .genes = HUMAN_TRBV, .frame = c('all', 'in', 'out'), .quant = c(NA, "read.count", "umi.count", "read.prop", "umi.prop"), .ambig = F) js.div.seg(.data, .genes = HUMAN_TRBV, .frame = c('all', 'in', 'out'), .quant = c(NA, "read.count", "umi.count", "read.prop", "umi.prop"), .norm.entropy = T, .ambig = F, .verbose = F, .data2 = NULL) } \arguments{ \item{.data}{Mitcr data.frame or a list with mitcr data.frames.} \item{.genes}{Parameter to the \code{geneUsage} function.} \item{.frame}{Character vector of length 1 specified which *-frames should be used: only in-frame ('in'), out-of-frame ('out') or all sequences ('all').} \item{.quant}{Which column to use for the quantity of clonotypes: NA for computing only number of genes without using clonotype counts, "read.count" for the "Read.count" column, "umi.count" for the "Umi.count" column, "read.prop" for the "Read.proportion" column, "umi.prop" for the "Umi.proportion" column.} \item{.ambig}{Parameter passed to \code{geneUsage}.} \item{.data2}{NULL if .data is a list, or a second mitcr data.frame.} \item{.norm.entropy}{if T then divide result by mean entropy of 2 segments' frequencies.} \item{.verbose}{If T than output the data processing progress bar.} } \value{ For \code{entropy.seg} - numeric integer with entropy value(s). For \code{js.div.seg} - integer of vector one if \code{.data} and \code{.data2} are provided; esle matrix length(.data) X length(.data) if \code{.data} is a list. } \description{ Information approach to repertoire analysis. Function \code{entropy.seg} applies Shannon entropy to V-usage and hence measures variability of V-usage. Function \code{js.div.seg} applied Jensen-Shannon divergence to V-usage of two or more data frames and hence measures distance among this V-usages. } \seealso{ \link{vis.heatmap}, \link{vis.group.boxplot}, \link{geneUsage} } tcR/man/pca.segments.Rd0000644000176200001440000000213113667026401014435 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/segments.R \name{pca.segments} \alias{pca.segments} \alias{pca.segments.2D} \title{Perform PCA on segments frequency data.} \usage{ pca.segments(.data, .cast.freq.seg = T, ..., .text = T, .do.plot = T) pca.segments.2D(.data, .cast.freq.seg = T, ..., .text = T, .do.plot = T) } \arguments{ \item{.data}{Either data.frame or a list of data.frame or a result obtained from the \code{geneUsage} function.} \item{.cast.freq.seg}{if T then apply code{geneUsage} to the supplied data.} \item{...}{Further arguments passed to \code{prcomp} or \code{geneUsage}.} \item{.text}{If T then plot sample names in the resulting plot.} \item{.do.plot}{if T then plot a graphic, else return a pca object.} } \value{ If .do.plot is T than ggplot object; else pca object. } \description{ Perform PCA on gene segments frequency data for V- and J-segments and either return pca object or plot the results. } \examples{ \dontrun{ # Load the twins data. data(twb) # Plot a plot of results of PCA on V-segments usage. pca.segments(twb, T, scale. = T) } } tcR/man/check.distribution.Rd0000644000176200001440000000226513667026455015662 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/datatools.R \name{check.distribution} \alias{check.distribution} \title{Check for adequaty of distrubution.} \usage{ check.distribution( .data, .do.norm = NA, .laplace = 1, .na.val = 0, .warn.zero = F, .warn.sum = T ) } \arguments{ \item{.data}{Numeric vector of values.} \item{.do.norm}{One of the three values - NA, T or F. If NA than check for distrubution (sum(.data) == 1) and normalise if needed with the given laplace correction value. if T then do normalisation and laplace correction. If F than don't do normalisaton and laplace correction.} \item{.laplace}{Value for laplace correction.} \item{.na.val}{Replace all NAs with this value.} \item{.warn.zero}{if T then the function checks if in the resulted vector (after normalisation) are any zeros, and print a warning message if there are some.} \item{.warn.sum}{if T then the function checks if the sum of resulted vector (after normalisation) is equal to one, and print a warning message if not.} } \value{ Numeric vector. } \description{ Check if the given .data is a distribution and normalise it if necessary with optional laplace correction. } tcR/man/beta.prob.Rd0000644000176200001440000000401713667026455013740 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/docdata.R \docType{data} \name{beta.prob} \alias{beta.prob} \title{List with assembling probabilities of beta chain TCRs.} \format{ \code{beta.prob} is a list of matrices and data frames. } \description{ \code{beta.prob} is a list with probabilities of TCR assembling taken from \code{Murugan et al. Statistical inference of the generation probability of T-cell receptors from sequence repertoires}. It's a list with the following elements: - P.V - matrix with 1 column and row names stands for V-beta segments. Each element is a probability of choosing corresponding V-beta segment. - P.del.D1 - matrix 17x17 with probabilities of choosing D5-D3 deletions for TRBD1. - P.del.D1 - matrix 17x17 with probabilities of choosing D5-D3 deletions for TRBD2. - P.ins.len - matrix with first columns stands for number of insertions, second and third columns filled with probability values of choosing corresponding number of insertions in VD- and DJ-junctions correspondingly. - P.ins.nucl - data frame with probability of choosing a nucleotide in the insertion on junctions with known previous nucleotide. First column with names of nucleotides, 2-5 columns are probabilities of choosing adjacent nucleotide in VD-junction, 6-9 columns are probabilities of choosing adjacent nucleotide in DJ-junction. - P.del.J - matrix with the first column "P.del.V" with number of deletions, and other columns with names for V-segments and with probabilities of corresponding deletions. - P.del.J - matrix with the first column "P.del.J" with number of deletions, and other columns with names for J-segments and with probabilities of corresponding deletions. - P.J.D - matrix with two columns ("TRBD1" and "TRBD2") and 13 rows with row names stands for J-beta segments. Each element is a mutual probability of choosing J-D segments. } \examples{ \dontrun{ # Generate 10 kmers with adjacent nucleotide probability. generate.kmers.prob(rep.int(10, 10), .probs=beta.prob$P.ins.nucl[,c(1, 2:5)]) } } tcR/man/generate.kmers.Rd0000644000176200001440000000231713667026401014766 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/kmers.R \name{generate.kmers} \alias{generate.kmers} \alias{generate.kmers.prob} \title{Generate k-mers.} \usage{ generate.kmers(.k, .seq = '', .alphabet = c('A', 'C', 'G', 'T')) generate.kmers.prob(.k, .probs, .count = 1, .alphabet = c('A', 'C', 'G', 'T'), .last.nucl = 'X') } \arguments{ \item{.k}{Size of k-mers or either integer or vector with k-s for generate.kmers.prob.} \item{.seq}{Prefix of all generated k-mers.} \item{.alphabet}{Alphabet.} \item{.probs}{Matrix with probabilities for generating adjacent symbol with |alphabet| X |alphabet| size. Order of letters is given in the \code{.alphabet} parameter.} \item{.count}{Number of kmers to be generated.} \item{.last.nucl}{Adjacent nucleotide from which start generation. If 'X' than choose one of the nucleotides with equal probabilities.} } \value{ Vector of all possible k-mers for \code{generate.kmers} or a vector of generated kmers for \code{generate.kmers.prob}. } \description{ Generate all k-mers. starting with the given sequence on the given alphabet Generate k-mers with the given k and probabilities of nucleotides next to each other (markov chain). } tcR/man/vis.top.proportions.Rd0000644000176200001440000000130313667026455016056 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/plots.R \name{vis.top.proportions} \alias{vis.top.proportions} \title{Visualisation of top clones proportions.} \usage{ vis.top.proportions( .data, .head = c(10, 100, 1000, 10000, 30000, 1e+05, 3e+05, 1e+06), .col = "Read.count" ) } \arguments{ \item{.data}{Data frame with clones.} \item{.head}{Integer vector of clones for the \code{.head} parameter for the \code{top.proportion} function.} \item{.col}{Parameter \code{.col} for the \code{top.proportion} function.} } \description{ Visualisation of proportion of the top clones. } \examples{ \dontrun{ vis.top.proportions(immdata) } } \seealso{ \code{top.proportion} } tcR/man/gibbs.sampler.Rd0000644000176200001440000000115713667026401014605 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/kmers.R \name{gibbs.sampler} \alias{gibbs.sampler} \title{Gibbs Sampler.} \usage{ gibbs.sampler(.data, .k = 5, .niter = 500) } \arguments{ \item{.data}{Vector of characters or data.frame of characters (1st col) and their numbers (2nd col) if .meat == T.} \item{.k}{Motif's length.} \item{.niter}{Number of iterations.} } \value{ Vector of possible motifs. } \description{ Perform the Gibbs Sampler method for finding frequent motifs in the given vector of strings or data.frame. Each string splitted to kmers with the given length of motif. } tcR/man/generate.tcr.Rd0000644000176200001440000000370013667026455014443 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/dataproc.R \name{generate.tcr} \alias{generate.tcr} \title{Generate random nucleotide TCR sequences.} \usage{ generate.tcr( .count = 1, .chain = c("beta", "alpha"), .segments, .P.list = if (.chain[1] == "alpha") alpha.prob else beta.prob ) } \arguments{ \item{.count}{Number of TCR sequences to generate.} \item{.chain}{Either "alpha" or "beta" for alpha and beta chain respectively.} \item{.segments}{List of segments (see "Details").} \item{.P.list}{List of probabilities (see "Details").} } \value{ Mitcr data.frame with generated sequences. } \description{ Given the list of probabilities and list of segments (see "Details"), generate a artificial TCR repertoire. } \details{ For the generation of a artifical TCR repertoire user need to provide two objects: the list with segments and the list with probabilities. List with segments is a list of 5 elements with 5 names: "TRAV", "TRAJ", "TRBV", "TRBD", "TRBJ". Each element is a data frame with following columns (order is matters!): "V.allelles" with names for V-segments (for TRAV and TRBV; for others is "J.allelles" or "D.allelles"), "CDR3.position" (the function doesn't use it, but you should provide it, fill it with zeros, for example), "Full.nucleotide.sequence" (the function doesn't use it), "Nucleotide.sequence" (function uses it for getting nucleotide sequences of segments) and "Nucleotide.sequence.P" (the function doesn't use it). List with probabilities is quite complicated, so just call \code{data(beta.prob)} for beta chain probabilities (alpha chain probabilities will be added soon). } \examples{ \dontrun{ # Load list of segments provided along with tcR. data(genesegments) # Load list of probabilities provided along with tcR. data(beta.prob) # Generate repertoire of beta chian with 10000 sequences. artif.rep <- generate.tcR(10000, 'beta') View(artif.rep) } } \seealso{ \link{genesegments} \link{beta.prob} } tcR/man/matrixSubgroups.Rd0000644000176200001440000000165413667026401015275 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/datatools.R \name{matrixSubgroups} \alias{matrixSubgroups} \title{Get all values from the matrix corresponding to specific groups.} \usage{ matrixSubgroups(.mat, .groups = NA, .symm = T, .diag = F) } \arguments{ \item{.mat}{Input matrix with row and columns names.} \item{.groups}{Named list with character vectors for names of elements for each group.} \item{.symm}{If T than remove symmetrical values from the input matrix.} \item{.diag}{If .symm if T and .diag is F than remove diagonal values.} } \description{ Split all matrix values to groups and return them as a data frame with two columns: for values and for group names. } \examples{ \dontrun{ data(twb) ov <- repOverlap(twb) sb <- matrixSubgroups(ov, list(tw1 = c('Subj.A', 'Subj.B'), tw2 = c('Subj.C', 'Subj.D'))); vis.group.boxplot(sb) } } \seealso{ \link{repOverlap}, \link{vis.group.boxplot} } tcR/man/apply.symm.Rd0000644000176200001440000000176213667026401014170 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/datatools.R \name{apply.symm} \alias{apply.symm} \alias{apply.asymm} \title{Apply function to every pair of data frames from a list.} \usage{ apply.symm(.datalist, .fun, ..., .diag = NA, .verbose = T) apply.asymm(.datalist, .fun, ..., .diag = NA, .verbose = T) } \arguments{ \item{.datalist}{List with some data.frames.} \item{.fun}{Function to apply, which return basic class value.} \item{...}{Arguments passsed to .fun.} \item{.diag}{Either NA for NA or something else != NULL for .fun(x,x).} \item{.verbose}{if T then output a progress bar.} } \value{ Matrix with values M[i,j] = fun(datalist[i], datalist[j]) } \description{ Apply the given function to every pair in the given datalist. Function either symmetrical (i.e. fun(x,y) == fun(y,x)) or assymmetrical (i.e. fun(x,y) != fun(y,x)). } \examples{ \dontrun{ # equivalent to intersectClonesets(immdata, 'a0e') apply.symm(immdata, intersectClonesets, .type = 'a0e') } } tcR/man/cosine.sharing.Rd0000644000176200001440000000374213667036420014773 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/shared.R \name{cosine.sharing} \alias{cosine.sharing} \alias{shared.representation} \alias{shared.clones.count} \alias{shared.summary} \title{Shared repertoire analysis.} \usage{ cosine.sharing(.shared.rep, .log = T) shared.representation(.shared.rep) shared.clones.count(.shared.rep) shared.summary(.shared.rep, .min.ppl = min(.shared.rep$People), .max.ppl = max(.shared.rep$People)) } \arguments{ \item{.shared.rep}{Shared repertoire, obtained from the function \code{shared.repertoire}.} \item{.log}{if T then apply log to the after adding laplace correction equal to one.} \item{.min.ppl}{Filter: get sequences with # people >= .min.ppl.} \item{.max.ppl}{Filter: get sequences with # people <= .max.ppl.} } \value{ Plot or PCA resulr for the \code{shared.seq.pca} function or a matrix with cosine similarity values for the \code{cosine.sharing} function. } \description{ Functions for computing statistics and analysis of shared repertoire of sequences. \code{cosine.sharing} - apply the cosine similarity measure to the vectors of sequences' counts or indices. \code{shared.representation} - for every repertoire in the shared repetoire get a number of sequences in this repertoire which are in the other repertoires. Row names of the input matrix is the number of people. \code{shared.clones.count} - get the number of shared clones for every number of people. \code{shared.summary} - get a matrix with counts of pairwise shared sequences (like a result from \code{cross} function, applied to a list of data frames). } \examples{ \dontrun{ # Load the twb data. data(twb) # Create shared repertoire on the twins data using CDR3 amino acid sequences with CDR1-2. twb.shared <- shared.repertoire(twb, 'av', .verbose = T) sh.repr <- shared.representation(twb.shared) sh.repr # Get proportion of represented shared sequences. apply(sh.repr, 2, function (col) col / col[1]) } } \seealso{ \link{shared.repertoire} } tcR/man/set.people.vector.Rd0000644000176200001440000000223613667026401015433 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/graph.R \name{set.people.vector} \alias{set.people.vector} \alias{get.people.names} \title{Set and get attributes of a mutation network related to source people.} \usage{ set.people.vector(.G, .shared.rep) get.people.names(.G, .V = V(.G), .paste = T) } \arguments{ \item{.G}{Mutation network.} \item{.shared.rep}{Shared repertoire.} \item{.V}{Indices of vertices.} \item{.paste}{If TRUE than concatenate people names to one string, else get a character vector of names.} } \value{ New graph with 'people' and 'npeople' vertex attributes or character vector of length .V or list of length .V. } \description{ Set vertice attributes 'people' and 'npeople' for every vertex in the given graph. Attribute 'people' is a binary string indicating in which repertoire sequence are found. Attribute 'npeople' is a integer indicating number of repertoires, in which this sequence has been found. } \examples{ \dontrun{ data(twb) twb.shared <- shared.repertoire(twb) G <- mutation.network(twb.shared) get.people.names(G, 300, T) # "Subj.A|Subj.B" get.people.names(G, 300, F) # list(c("Subj.A", "Subj.B")) } } tcR/man/get.all.substrings.Rd0000644000176200001440000000115313667026401015601 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/strtools.R \name{get.all.substrings} \alias{get.all.substrings} \title{Get all substrings for the given sequence.} \usage{ get.all.substrings(.seq, .min.len = 3, .table = T) } \arguments{ \item{.seq}{Sequence for splitting to substrings.} \item{.min.len}{Minimal length of output sequences.} \item{.table}{if T then return data frame with substrings and positions of their ends in the .seq.} } \value{ Character vector or data frame with columns "Substring", "Start" and "End". } \description{ Get all substrings for the given sequence. } tcR/man/barcodes.to.reads.Rd0000644000176200001440000000072213667026401015352 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/dataproc.R \name{barcodes.to.reads} \alias{barcodes.to.reads} \title{Rearrange columns with counts for clonesets.} \usage{ barcodes.to.reads(.data) } \arguments{ \item{.data}{Data frame with columns "Umi.count" and "Read.count".} } \value{ Data frame with new "Read.count" and "Percentage" columns. } \description{ Replace Read.count with Umi.count, recompute Percentage and sort data. } tcR/man/dot-add.legend.Rd0000644000176200001440000000123413667026455014633 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/datatools.R \name{.add.legend} \alias{.add.legend} \title{Internal function. Add legend to a grid of plots and remove legend from all plots of a grid.} \usage{ .add.legend(.vis.list, .vis.nrow = 2, .legend.ncol = 1) } \arguments{ \item{.vis.list}{A list with ggplot2 plots.} \item{.vis.nrow}{Number of rows of the resulting grid with plots.} \item{.legend.ncol}{Number of columns in the shared legend.} } \description{ Given a list of ggplot2 plots, remove legend from each of them and return grid of such plots plus legend from the first vis. Suitable for plots with similar legends. } tcR/man/ozScore.Rd0000644000176200001440000000252713667026455013514 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/crosses.R \name{ozScore} \alias{ozScore} \title{Overlap Z-score.} \usage{ ozScore(.mat, .symm = T, .as.matrix = F, .val.col = c("norm", "abs", "oz")) } \arguments{ \item{.mat}{Matrix with overlap values.} \item{.symm}{If T then remove lower triangle matrix from counting. Doesn't work if the matrix has different number of rows and columns.} \item{.as.matrix}{If T then return} \item{.val.col}{If .as.matrix is T then this is a name of the column to build matrix upon: either "oz" for the OZ-score column, "abs" for the absolute OZ-score column, or "norm" for the normalised absolute OZ-score column.} } \description{ Compute OZ-scores ("overlap Z scores") for values in the given matrix of overlaps, i.e.,. for each value compute the number of standart deviations from the mean of the matrix. } \examples{ \dontrun{ data(twb) mat <- repOverlap(twb) ozScore(mat) # Take 3x3 matrix ozScore(mat[1:3, 1:3]) # Return as matrix with OZ scores ozmat <- ozScore(mat, T, T, 'oz') # Return as matrix with normalised absolute OZ scores oznorm <- ozScore(mat, T, T, 'norm') # Plot it as boxplots sb <- matrixSubgroups(oznorm, list(tw1 = c('Subj.A', 'Subj.B'), tw2 = c('Subj.C', 'Subj.D'))); vis.group.boxplot(sb) } } \seealso{ \link{repOverlap}, \link{intersectClonesets}, \link{permutDistTest} } tcR/man/top.fun.Rd0000644000176200001440000000272713667026401013452 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/datatools.R \name{top.fun} \alias{top.fun} \alias{slice_fun} \title{Get samples from a repertoire slice-by-slice or top-by-top and apply function to them.} \usage{ top.fun(.data, .n, .fun, ..., .simplify = T) slice_fun(.data, .size, .n, .fun, ..., .simplify = T) } \arguments{ \item{.data}{Data.frame, matrix, vector or any enumerated type or a list of this types.} \item{.n}{Vector of values passed to head function for top.fun or the number of slices for slice_fun.} \item{.fun}{Funtions to apply to every sample subset. First input argument is a data.frame, others are passed as \code{...}.} \item{...}{Additional parameters passed to the .fun.} \item{.simplify}{if T then try to simplify result to a vector or to a matrix if .data is a list.} \item{.size}{Size of the slice for sampling for slice_fun.} } \value{ List of length length(.n) for top.fun or .n for slice_fun. } \description{ Functions for getting samples from data frames either by consequently applying head functions (\code{top.fun}) or by getting equal number of rows in the moving window (\code{slice_fun}) and applying specified function to this samples. } \examples{ \dontrun{ # Get entropy of V-usage for the first 1000, 2000, 3000, ... clones. res <- top.fun(immdata[[1]], 1000, entropy.seg) # Get entropy of V-usage for the interval of clones with indices [1,1000], [1001,2000], ... res <- top.fun(immdata[[1]], 1000, entropy.seg) } } tcR/man/column.summary.Rd0000644000176200001440000000330613667026401015044 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/stats.R \name{column.summary} \alias{column.summary} \alias{insertion.stats} \title{Columns statistics.} \usage{ column.summary(.data, .factor.col, .target.col, .alphabet = NA, .remove.neg = T) insertion.stats(.data) } \arguments{ \item{.data}{Data frame with columns \code{.factor.col} and \code{target.col}} \item{.factor.col}{Columns with factors by which the data will be divided to subsets.} \item{.target.col}{Column with numeric values for computing summaries after dividing the data to subsets.} \item{.alphabet}{Character vector of factor levels. If NA than use all possible elements frim the \code{.factor.col} column.} \item{.remove.neg}{Remove all elements which >-1 from the \code{.target.col} column.} } \value{ Data.frame with first column with levels of factors and 5 columns with output from the \code{summary} function. } \description{ \code{column.summary} - general function for computing summary statistics (using the \code{summary} function) for columns of the given mitcr data.frame: divide \code{.factor.column} by factors from \code{.alphabet} and compute statistics of correspondingly divided \code{.target.column}. \code{insertion.stats} - compute statistics of insertions for the given mitcr data.frame. } \examples{ \dontrun{ # Compute summary statistics of VD insertions # for each V-segment using all V-segments in the given data frame. column.summary(immdata[[1]], 'V.gene', 'Total.insertions') # Compute summary statistics of VD insertions for each V-segment using only V-segments # from the HUMAN_TRBV_MITCR column.summary(immdata[[1]], 'V.gene', 'Total.insertions', HUMAN_TRBV_MITCR) } } \seealso{ \link{summary} } tcR/man/loglikelihood.Rd0000644000176200001440000000117113667026401014676 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/measures.R \name{loglikelihood} \alias{loglikelihood} \title{Log-likelihood.} \usage{ loglikelihood(.data, .base = 2, .do.norm = NA, .laplace = 1e-12) } \arguments{ \item{.data}{Vector for distribution or counts.} \item{.base}{Logarightm's base for the loglikelihood.} \item{.do.norm}{Parameter to the \code{check.distribution} function.} \item{.laplace}{Laplace correction, Parameter to the \code{check.distribution} function.} } \value{ Loglikelihood value. } \description{ Compute the log-likelihood of the given distribution or vector of counts. } tcR/man/set.group.vector.Rd0000644000176200001440000000263713667026401015310 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/graph.R \name{set.group.vector} \alias{set.group.vector} \alias{get.group.names} \title{Set group attribute for vertices of a mutation network} \usage{ set.group.vector(.G, .attr.name, .groups) get.group.names(.G, .attr.name, .V = V(.G), .paste = T) } \arguments{ \item{.G}{Mutation network.} \item{.attr.name}{Name of the new vertex attribute.} \item{.groups}{List with integer vector with indices of subjects for each group.} \item{.V}{Indices of vertices.} \item{.paste}{if T then return character string with concatenated group names, else return list with character vectors with group names.} } \value{ igraph object with new vertex attribute \code{.attr.name} with binary strings for \code{set.group.vector}. Return character vector for \code{get.group.names}. } \description{ asdasd } \examples{ \dontrun{ data(twb) twb.shared <- shared.repertoire(twb) G <- mutation.network(twb.shared) G <- set.group.vector(G, "twins", list(A = c(1,2), B = c(3,4))) # <= refactor this get.group.names(G, "twins", 1) # "A|B" get.group.names(G, "twins", 300) # "A" get.group.names(G, "twins", 1, F) # list(c("A", "B")) get.group.names(G, "twins", 300, F) # list(c("A")) # Because we have only two groups, we can assign more readable attribute. V(G)$twin.names <- get.group.names(G, "twins") V(G)$twin.names[1] # "A|B" V(G)$twin.names[300] # "A" } } tcR/man/top.cross.Rd0000644000176200001440000000462713667026401014014 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/stats.R \name{top.cross} \alias{top.cross} \alias{top.cross.vec} \alias{top.cross.plot} \title{Perform sequential cross starting from the top of a data frame.} \usage{ top.cross(.data, .n = NA, .data2 = NULL, .type = 'ave', .norm = F, .verbose = T) top.cross.vec(.top.cross.res, .i, .j) top.cross.plot(.top.cross.res, .xlab = 'Top X clonotypes', .ylab = 'Normalised number of shared clonotypes', .nrow = 2, .legend.ncol = 1, .logx = T, .logy = T) } \arguments{ \item{.data}{Either list of data.frames or a data.frame.} \item{.n}{Integer vector of parameter appled to the head function; same as .n in the top.fun function. See "Details" for more information.} \item{.data2}{Second data.frame or NULL if .data is a list.} \item{.type}{Parameter .type to the \code{tcR::intersect} function.} \item{.norm}{Parameter .norm to the \code{tcR::intersect} function.} \item{.verbose}{if T then plot a progress bar.} \item{.top.cross.res}{Result from the \code{top.cross} function.} \item{.i, .j}{Coordinate of a cell in each matrix.} \item{.xlab}{Name for a x-lab.} \item{.ylab}{Name for a y-lab.} \item{.nrow}{Number of rows of sub-plots in the output plot.} \item{.legend.ncol}{Number of columns in the output legend.} \item{.logx}{if T then transform x-axis to log-scale.} \item{.logy}{if T then transform y-axis to log-scale.} } \value{ \code{top.cross} - return list for each element in \code{.n} with intersection matrix (from \code{tcR::intersectClonesets}). \code{top.cross.vec} - vector of length \code{.n} with \code{.i}:\code{.j} elements of each matrix. \code{top.cross.plot} - grid / ggplot object. } \description{ \code{top.cross} - get top crosses of the given type between each pair of the given data.frames with \code{top.cross} function. \code{top.cross.vec} - get vector of cross values for each top with the \code{top.cross.vec} function. \code{top.cross.plot} - plot a plots with result with the \code{top.cross.plot} function. } \details{ Parameter \code{.n} can have two possible values. It could be either integer vector of numbers (same as in the \code{top.fun} function) or NA and then it will be replaced internally by the value \code{.n <- seq(5000, min(sapply(.data, nrow)), 5000)}. } \examples{ \dontrun{ immdata.top <- top.cross(immdata) top.cross.plot(immdata.top) } } \seealso{ \code{\link{intersect}} } tcR/man/repSave.Rd0000644000176200001440000000145713667026401013465 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/io.R \name{repSave} \alias{repSave} \title{Save tcR data frames to disk as text files or gzipped text files.} \usage{ repSave(.data, .format = c("txt", "gz"), .names = "", .folder = "./") } \arguments{ \item{.data}{Either tcR data frame or a list of tcR data frames.} \item{.format}{"txt" for simple tab-delimited text tables, "gz" for compressed (gzipped) tables.} \item{.names}{Names of output files. By default it's an empty string so names will be taken from names of the input list.} \item{.folder}{Path to the folder with output files.} } \description{ Save repertoire files to either text files or gzipped text files. You can read them later by \code{repLoad} function with \code{.format = "tcr"}. } \seealso{ \link{repLoad} } tcR/man/entropy.Rd0000644000176200001440000000374413667026401013561 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/measures.R \name{entropy} \alias{entropy} \alias{js.div} \alias{kl.div} \title{Information measures.} \usage{ entropy(.data, .norm = F, .do.norm = NA, .laplace = 1e-12) kl.div(.alpha, .beta, .do.norm = NA, .laplace = 1e-12) js.div(.alpha, .beta, .do.norm = NA, .laplace = 1e-12, .norm.entropy = F) } \arguments{ \item{.data, .alpha, .beta}{Vector of values.} \item{.norm}{if T then compute normalised entropy (H / Hmax).} \item{.do.norm}{One of the three values - NA, T or F. If NA than check for distrubution \code{(sum(.data) == 1)}. and normalise if needed with the given laplace correction value. if T then do normalisation and laplace correction. If F than don't do normalisaton and laplace correction.} \item{.laplace}{Value for Laplace correction which will be added to every value in the .data.} \item{.norm.entropy}{if T then normalise JS-divergence by entropy.} } \value{ Shannon entropy, Jensen-Shannon divergence or Kullback-Leibler divergence values. } \description{ Functions for information measures of and between distributions of values. Warning! Functions will check if \code{.data} if a distribution of random variable (sum == 1) or not. To force normalisation and / or to prevent this, set \code{.do.norm} to TRUE (do normalisation) or FALSE (don't do normalisation). For \code{js.div} and \code{kl.div} vectors of values must have equal length. Functions: - The Shannon entropy quantifies the uncertainty (entropy or degree of surprise) associated with this prediction. - Kullback-Leibler divergence (information gain, information divergence, relative entropy, KLIC) is a non-symmetric measure of the difference between two probability distributions P and Q (measure of information lost when Q is used to approximate P). - Jensen-Shannon divergence is a symmetric version of KLIC. Square root of this is a metric often referred to as Jensen-Shannon distance. } \seealso{ \link{similarity}, \link{diversity} } tcR/man/cloneset.stats.Rd0000644000176200001440000000160313667026401015022 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/stats.R \name{cloneset.stats} \alias{cloneset.stats} \alias{repseq.stats} \title{MiTCR data frame basic statistics.} \usage{ cloneset.stats(.data, .head = 0) repseq.stats(.data, .head = 0) } \arguments{ \item{.data}{tcR data frames or a list with tcR data frames.} \item{.head}{How many top clones use to comput summary.} } \value{ if \code{.data} is a data frame, than numeric vector with statistics. If \code{.data} is a list with data frames, than matrix with statistics for each data frame. } \description{ Compute basic statistics of TCR repertoires: number of clones, number of clonotypes, number of in-frame and out-of-frame sequences, summary of "Read.count", "Umi.count" and other. } \examples{ \dontrun{ # Compute basic statistics of list with data frames. cloneset.stats(immdata) repseq.stats(immdata) } } tcR/man/vis.pca.Rd0000644000176200001440000000134013667026401013412 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/plots.R \name{vis.pca} \alias{vis.pca} \title{PCA result visualisation} \usage{ vis.pca(.data, .groups = NA, .text = T) } \arguments{ \item{.data}{Result from prcomp() function or a data frame with two columns 'First' and 'Second' stands for the first PC and the second PC.} \item{.groups}{List with names for groups and indices of the group members. If NA than each member is in the individual group.} \item{.text}{If T than print the names of the subjects.} } \value{ ggplot object. } \description{ Plot the given pca results with colour divided by the given groups. } \examples{ \dontrun{ data(twb) tmp = geneUsage(twb) vis.pca(prcomp(t(tmp[,-1]))) } } tcR/man/group.clonotypes.Rd0000644000176200001440000000315113667026455015414 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/datatools.R \name{group.clonotypes} \alias{group.clonotypes} \title{Get all unique clonotypes.} \usage{ group.clonotypes( .data, .gene.col = "V.gene", .count.col = "Read.count", .prop.col = "Read.proportion", .seq.col = "CDR3.amino.acid.sequence" ) } \arguments{ \item{.data}{Either tcR data frame or a list with data frames.} \item{.gene.col}{Either name of the column with gene segments used to compare clonotypes or NA if you don't need comparing using gene segments.} \item{.count.col}{Name of the column with counts for each clonotype.} \item{.prop.col}{Name of the column with proportions for each clonotype.} \item{.seq.col}{Name of the column with clonotypes' CDR3 sequences.} } \value{ Data frame or a list with data frames with updated counts and proportion columns and rows with unique clonotypes only. } \description{ Get all unique clonotypes with merged counts. Unique clonotypes are those with either equal CDR3 sequence or with equal CDR3 sequence and equal gene segments. Counts of equal clonotypes will be summed up. } \examples{ \dontrun{ tmp <- data.frame(A = c('a','a','b','c', 'a') B = c('V1', 'V1','V1','V2', 'V3') C = c(10,20,30,40,50), stringsAsFactors = F) tmp # A B C # 1 a V1 10 # 2 a V1 20 # 3 b V1 30 # 4 c V2 40 # 5 a V3 50 group.clonotypes(tmp, 'B', 'C', 'A') # A B C # 1 a V1 30 # 3 b V1 50 # 4 c V2 30 # 5 a V3 40 group.clonotypes(tmp, NA, 'C', 'A') # A B C # 1 a V1 80 # 3 b V1 30 # 4 c V2 40 # For tcR data frame: data(twb) twb1.gr <- group.clonotypes(twb[[1]]) twb.gr <- group.clonotypes(twb) } } tcR/man/segments.list.Rd0000644000176200001440000000172313667026455014664 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/docdata.R \docType{data} \name{segments.list} \alias{segments.list} \alias{genesegments} \title{Segment data.} \format{ \code{genesegments} is a list with data frames. } \description{ \code{segments} is a list with 5 data frames with data of human alpha-beta chain segments. Elements names as "TRAV", "TRAJ", "TRBV", "TRVJ", "TRVD". Each data frame consists of 5 columns: - V.allelles / J.allelles / D.allelles - character column with names of V/D/J-segments. - CDR3.position - position in the full nucleotide segment sequence where CDR3 starts. - Full.nucleotide.sequence - character column with segment CDR1-2-3 sequence. - Nucleotide.sequence - character column with segment CDR3 sequences. - Nucleotide.sequence.P - character column with segment CDR3 sequences with P-insertions. } \examples{ \dontrun{ data(genesegments) genesegments$Nucleotide.sequence[segments$TRBV[,1] == "TRBV10-1"] } } tcR/man/segments.alphabets.Rd0000644000176200001440000000364313667026455015657 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/docdata.R \docType{data} \name{segments.alphabets} \alias{segments.alphabets} \alias{HUMAN_TRAV} \alias{genealphabets} \alias{HUMAN_TRAJ} \alias{HUMAN_TRBV} \alias{HUMAN_TRBD} \alias{HUMAN_TRBJ} \alias{HUMAN_TRBV_MITCR} \alias{HUMAN_TRGV} \alias{HUMAN_TRGJ} \alias{HUMAN_TRDV} \alias{HUMAN_TRDD} \alias{HUMAN_TRDJ} \alias{HUMAN_IGHV} \alias{HUMAN_IGHD} \alias{HUMAN_IGHJ} \alias{HUMAN_IGKV} \alias{HUMAN_IGKJ} \alias{HUMAN_IGLJ} \alias{HUMAN_IGLV} \alias{HUMAN_TRBV_ALS} \alias{HUMAN_TRBV_FAM} \alias{HUMAN_TRBV_GEN} \alias{MACMUL_TRBJ} \alias{MACMUL_TRBV} \alias{MOUSE_TRBJ} \alias{MOUSE_TRBV} \alias{MOUSE_TRAV} \alias{MOUSE_TRAJ} \alias{MOUSE_IGKV} \alias{MOUSE_IGKJ} \alias{MOUSE_IGHV} \alias{MOUSE_IGHD} \alias{MOUSE_IGHJ} \alias{MOUSE_TRDD} \alias{MOUSE_TRDV} \alias{MOUSE_TRDJ} \alias{MOUSE_TRGV} \alias{MOUSE_TRGJ} \alias{MOUSE_IGLJ} \alias{MOUSE_IGLV} \title{Alphabets of TCR and Ig gene segments.} \format{ Each \code{_} is a character vector. is an identifier of species, is concatenated three identifiers of cell type ("TR**" for TCR, "IG**" for Ig), chain (e.g., "**A*" for alpha chains) and gene segment ("***V" for V(ariable) gene segment, "***J" for J(oining) gene segment, "***D" for D(iversity) gene segment). } \usage{ HUMAN_TRAV HUMAN_TRAJ HUMAN_TRBV HUMAN_TRBD HUMAN_TRBJ HUMAN_TRBV_MITCR HUMAN_TRBV_ALS HUMAN_TRGV HUMAN_TRGJ HUMAN_TRDV HUMAN_TRDD HUMAN_TRDJ MOUSE_TRBV MOUSE_TRBJ MOUSE_TRAV MOUSE_TRAJ MOUSE_IGKV MOUSE_IGKJ MOUSE_IGHV MOUSE_IGHD MOUSE_IGHJ MACMUL_TRBV MACMUL_TRBJ HUMAN_IGHV HUMAN_IGHD HUMAN_IGHJ HUMAN_IGLV HUMAN_IGLJ MOUSE_IGLJ MOUSE_IGLV } \description{ Character vector with names for segments. With \code{tcR} we provided alphabets for all alpha, beta, gamma and delta chains gene segments. } \examples{ \dontrun{ HUMAN_TRBV[1] # => "TRBV10-1" } } \keyword{datasets} tcR/man/permutedf.Rd0000644000176200001440000000106313667026401014044 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/datatools.R \name{permutedf} \alias{permutedf} \alias{unpermutedf} \title{Shuffling data frames.} \usage{ permutedf(.data) unpermutedf(.data) } \arguments{ \item{.data}{MiTCR data.frame or list of such data frames.} } \value{ Shuffled data.frame or un-shuffled data frame if \code{.data} is a data frame, else list of such data frames. } \description{ Shuffle the given data.frame and order it by the Read.count column or un-shuffle a data frame and return it to the initial order. } tcR/man/vis.gene.usage.Rd0000644000176200001440000000323013667026455014701 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/plots.R \name{vis.gene.usage} \alias{vis.gene.usage} \alias{vis.V.usage} \alias{vis.J.usage} \title{Histogram of segments usage.} \usage{ vis.gene.usage( .data, .genes = NA, .main = "Gene usage", .ncol = 3, .coord.flip = F, .dodge = F, .labs = c("Gene", "Frequency"), ... ) } \arguments{ \item{.data}{Mitcr data frame or a list with mitcr data frames.} \item{.genes}{Gene alphabet passed to \link{geneUsage}.} \item{.main}{Main title of the plot.} \item{.ncol}{Number of columns in a grid of histograms if \code{.data} is a list and \code{.dodge} is F.} \item{.coord.flip}{if T then flip coordinates.} \item{.dodge}{If \code{.data} is a list, than if this is T plot V-usage for all data frames to the one histogram.} \item{.labs}{Character vector of length 2 with names for x-axis and y-axis.} \item{...}{Parameter passed to \code{geneUsage}. By default the function compute V-usage or J-usage for beta chains w/o using read counts and w/ "Other" segments.} } \value{ ggplot object. } \description{ Plot a histogram or a grid of histograms of V- / J-usage. } \examples{ \dontrun{ # Load your data. load('immdata.rda') # Compute V-usage statistics. imm1.vs <- geneUsage(immdata[[1]], HUMAN_TRBV) vis.V.usage(immdata, HUMAN_TRBV, .main = 'Immdata V-usage [1]', .dodge = T) # Plot a histogram for one data frame using all gene segment data from V.gene column. vis.V.usage(imm1.vs, NA, .main = 'Immdata V-usage [1]') # Plot a grid of histograms - one histogram for V-usage for each data frame in .data. vis.V.usage(immdata, HUMAN_TRBV, .main = 'Immdata V-usage', .dodge = F, .other = F) } } tcR/man/tailbound.proportion.Rd0000644000176200001440000000372013667026401016246 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/dataproc.R \name{tailbound.proportion} \alias{tailbound.proportion} \alias{clonal.proportion} \alias{top.proportion} \title{Proportions of specifyed subsets of clones.} \usage{ tailbound.proportion(.data, .bound = 2, .col = 'Read.count') top.proportion(.data, .head = 10, .col = 'Read.count') clonal.proportion(.data, .perc = 10, .col = 'Read.count') } \arguments{ \item{.data}{Data frame or a list with data frames.} \item{.bound}{Subset the \code{.data} by \code{.col} <= \code{.bound}.} \item{.col}{Column's name with counts of sequences.} \item{.head}{How many top values to choose - parameter to the \code{.head} function.} \item{.perc}{Percentage (0 - 100).} } \value{ For \code{tailbound.proportion} - numeric vector of percentage. For \code{top.proportion} - numeric vector of percentage for top clones. For \code{clonal.proportion} - vector or matrix with values for number of clones, occupied percentage and proportion of the chosen clones to the overall count of clones. } \description{ Get a specifyed subset of the given repertiure and compute which proportion in counts it has comparing to the overall count. \code{tailbound.proportion} - subset by the count; \code{top.proportion} - subset by rank (top N clones); \code{clonal.proportion} - subset by a summary percentage (top N clones which in sum has the given percentage). } \examples{ \dontrun{ # How many clones fill up approximately clonal.proportion(immdata, 25) # the 25\% of the sum of values in 'Read.count'? # What proportion of the top-10 clones' reads vis.top.proportions(immdata) # Plot this proportions. # What proportion of sequences which # has 'Read.count' <= 100 to the tailbound.proportion(immdata, 100) # overall number of reads? } } \seealso{ \link{vis.top.proportions}, \link{prop.sample} } tcR/man/set.pb.Rd0000644000176200001440000000112413667026401013242 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/datatools.R \name{set.pb} \alias{set.pb} \alias{add.pb} \title{Simple functions for manipulating progress bars.} \usage{ set.pb(.max) add.pb(.pb, .value = 1) } \arguments{ \item{.max}{Length of the progress bar.} \item{.pb}{Progress bar object.} \item{.value}{Value to add to the progress bar.} } \value{ Progress bar (for set.pb) or length-one numeric vector giving the previous value (for add.pb). } \description{ Set the progress bar with the given length (from zero) or add value to the created progress bar. } tcR/man/find.similar.sequences.Rd0000644000176200001440000000272113667026401016424 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/strtools.R \name{find.similar.sequences} \alias{find.similar.sequences} \alias{exact.match} \alias{hamming.match} \alias{levenshtein.match} \title{Find similar sequences.} \usage{ find.similar.sequences(.data, .patterns = c(), .method = c('exact', 'hamm', 'lev'), .max.errors = 1, .verbose = T, .clear = F) exact.match(.data, .patterns = c(), .verbose = T) hamming.match(.data, .patterns = c(), .max.errors = 1, .verbose = T) levenshtein.match(.data, .patterns = c(), .max.errors = 1, .verbose = T) } \arguments{ \item{.data}{Vector of strings.} \item{.patterns}{Character vector of sequences, which will be used for searching for neighbours.} \item{.method}{Which method use: 'exact' for exact matching, 'hamm' for Hamming Distance, 'lev' for Levenshtein distance.} \item{.max.errors}{Max Hamming or Levenshtein distance between strings. Doesn't use in 'exact' setting.} \item{.verbose}{Should function print progress or not. // DON'T USE IT} \item{.clear}{if T then remove all sequences with character "*" or "~".} } \value{ Matrix with two columns [i,j], dist(data(i), data(j)) <= .max.errors. } \description{ Return matrix M with two columns. For each element in row i and column j M[i,j] => distance between pattern(i) and data(j) sequences equal to or less than .max.errors. This function will uppercase .data and remove all strings, which have anything than A-Z letters. } tcR/man/clonal.space.homeostasis.Rd0000644000176200001440000000235413667026455016765 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/stats.R \name{clonal.space.homeostasis} \alias{clonal.space.homeostasis} \title{Clonal space homeostasis.} \usage{ clonal.space.homeostasis( .data, .clone.types = c(Rare = 1e-05, Small = 1e-04, Medium = 0.001, Large = 0.01, Hyperexpanded = 1), .prop.col = "Read.proportion" ) } \arguments{ \item{.data}{Cloneset data frame or list with such data frames.} \item{.clone.types}{Named numeric vector.} \item{.prop.col}{Which column to use for counting proportions.} } \description{ Compute clonal space homeostatsis - statistics of how many space occupied by clones with specific proportions. } \examples{ \dontrun{ data(twb) # Compute summary space of clones, that occupy # [0, .05) and [.05, 1] proportion. clonal.space.homeostasis(twb, c(Low = .05, High = 1))) # Low (0 < X <= 0.05) High (0.05 < X <= 1) # Subj.A 0.9421980 0.05780198 # Subj.B 0.9239454 0.07605463 # Subj.C 0.8279270 0.17207296 # Subj.D 1.0000000 0.00000000 # I.e., for Subj.D sum of all read proportions for clones # which have read proportion between 0 and .05 is equal to 1. } } \seealso{ \link{vis.clonal.space} } tcR/man/sample2D.Rd0000644000176200001440000000106713667026401013524 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/datatools.R \name{sample2D} \alias{sample2D} \title{Get a sample from matrix with probabilities.} \usage{ sample2D(.table, .count = 1) } \arguments{ \item{.table}{Numeric matrix or data frame with probabilities and columns and rows names.} \item{.count}{Number of sample to fetch.} } \value{ Character matrix with nrow == .count and 2 columns. row[1] in row.names(.table), row[2] in colnames(.table). } \description{ Get a sample from matrix or data frame with pair-wise probabilities. } tcR/man/vis.clonal.dynamics.Rd0000644000176200001440000000157213667026401015734 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/plots.R \name{vis.clonal.dynamics} \alias{vis.clonal.dynamics} \title{Visualise clonal dynamics among time points.} \usage{ vis.clonal.dynamics(.changed, .lower, .upper, .log = T) } \arguments{ \item{.changed}{Result from the \code{find.clonotypes} function, i.e. data frame with first columns with sequences (nucleotide or amino acid) and other columns are columns with frequency / count for each time point for each clone.} \item{.lower}{Similar to .changed but values are lower bound for clonal count / frequency.} \item{.upper}{Similar to .changed but values are upper bound for clonal count / frequency.} \item{.log}{if T then log-scale y-axis.} } \value{ ggplot object. } \description{ Visualise clonal dynamics (i.e., changes in frequency or count) with error bars of given clones among time points. } tcR/man/vis.logo.Rd0000644000176200001440000000154413667026455013626 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/plots.R \name{vis.logo} \alias{vis.logo} \title{Logo - plots for amino acid and nucletide profiles.} \usage{ vis.logo( .data, .replace.zero.with.na = T, .jitter.width = 0.01, .jitter.height = 0.01, .dodge.width = 0.15 ) } \arguments{ \item{.data}{Output from the \code{kmer.profile} function.} \item{.replace.zero.with.na}{if T then replace all zeros with NAs, therefore letters with zero frequency wont appear at the plot.} \item{.jitter.width, .jitter.height, .dodge.width}{Parameters to \code{position_jitterdodge} for aligning text labels of letters.} } \value{ ggplot2 object } \description{ Plot logo-like graphs for visualising of nucleotide or amino acid motif sequences / profiles. } \examples{ \dontrun{ d <- kmer_profile(c('CASLL', 'CASSQ', 'CASGL')) vis.logo(d) } } tcR/man/vis.kmer.histogram.Rd0000644000176200001440000000206613667026455015620 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/plots.R \name{vis.kmer.histogram} \alias{vis.kmer.histogram} \title{Plot of the most frequent kmers.} \usage{ vis.kmer.histogram( .kmers, .head = 100, .position = c("stack", "dodge", "fill") ) } \arguments{ \item{.kmers}{Data frame with two columns "Kmers" and "Count" or a list with such data frames. See Examples.} \item{.head}{Number of the most frequent kmers to choose for plotting from each data frame.} \item{.position}{Character vector of length 1. Position of bars for each kmers. Value for the \code{ggplot2} argument \code{position}.} } \description{ Plot a distribution (bar plot) of the most frequent kmers in a data. } \examples{ \dontrun{ # Load necessary data and package. library(gridExtra) load('immdata.rda') # Get 5-mers. imm.km <- get.kmers(immdata) # Plots for kmer proportions in each data frame in immdata. p1 <- vis.kmer.histogran(imm.km, .position = 'stack') p2 <- vis.kmer.histogran(imm.km, .position = 'fill') grid.arrange(p1, p2) } } \seealso{ \code{get.kmers} } tcR/man/parse.cloneset.Rd0000644000176200001440000000424113667026455015010 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/parsing.R \name{parse.cloneset} \alias{parse.cloneset} \title{Parse input table files with the immune receptor repertoire data.} \usage{ parse.cloneset( .filename, .nuc.seq, .aa.seq, .reads, .barcodes, .vgenes, .jgenes, .dgenes, .vend, .jstart, .dalignments, .vd.insertions, .dj.insertions, .total.insertions, .skip = 0, .sep = "\\t" ) } \arguments{ \item{.filename}{Path to the input file with cloneset data.} \item{.nuc.seq}{Name of the column with CDR3 nucleotide sequences.} \item{.aa.seq}{Name of the column with CDR3 amino acid sequences.} \item{.reads}{Name of the column with counts of reads for each clonotype.} \item{.barcodes}{Name of the column with counts of barcodes (UMI, events) for each clonotype.} \item{.vgenes}{Name of the column with names of aligned Variable gene segments.} \item{.jgenes}{Name of the column with names of aligned Joining gene segments.} \item{.dgenes}{Name of the column with names of aligned Diversity gene segments.} \item{.vend}{Name of the column with last positions of aligned V gene segments.} \item{.jstart}{Name of the column with first positions of aligned J gene segments.} \item{.dalignments}{Character vector of length two that names columns with D5' and D3' end positions.} \item{.vd.insertions}{Name of the column with VD insertions for each clonotype.} \item{.dj.insertions}{Name of the column with DJ insertions for each clonotype.} \item{.total.insertions}{Name of the column with total number of insertions for each clonotype.} \item{.skip}{How many lines from beginning to skip.} \item{.sep}{Separator character.} } \value{ Data frame with immune receptor repertoire data. See \link{parse.file} for more details. } \description{ General parser for cloneset table files. Each column name has specific purpose (e.g., column for CDR3 nucleotide sequence or aligned gene segments), so you need to supply column names which has this purpose in your input data. } \examples{ \dontrun{ # Parse file in "~/mitcr/immdata1.txt" as a MiTCR file. immdata1 <- parse.file("~/mitcr/immdata1.txt", 'mitcr') } } \seealso{ \link{parse.file} } tcR/man/get.inframes.Rd0000644000176200001440000000246513667026401014442 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/stats.R \name{get.inframes} \alias{get.inframes} \alias{get.outframes} \alias{count.inframes} \alias{count.outframes} \alias{get.frames} \alias{count.frames} \alias{clonotypescount} \title{In-frame / out-of-frame sequences filter.} \usage{ get.inframes(.data, .head = 0, .coding = T) get.outframes(.data, .head = 0) count.inframes(.data, .head = 0, .coding = T) count.outframes(.data, .head = 0) get.frames(.data, .frame = c('in', 'out', 'all'), .head = 0, .coding = T) count.frames(.data, .frame = c('in', 'out', 'all'), .head = 0, .coding = T) } \arguments{ \item{.data}{MiTCR data.frame or a list with mitcr data.frames.} \item{.head}{Parameter to the head() function. Supply 0 to get all elements. \code{head} applied before subsetting, i.e. if .head == 500, you will get in-frames from the top 500 clonotypes.} \item{.coding}{if T then return only coding sequences, i.e. without stop-codon.} \item{.frame}{Which *-frames to choose.} } \value{ Filtered data.frame or a list with such data.frames. } \description{ Return the given data frame with in-frame or out-of-frame sequences only. Nucleotide sequences in a column "CDR3.nucleotide.sequence" are checked if they length are divisible by 3 (len mod 3 == 0 => in-frame, else out-of-frame) } tcR/man/repOverlap.Rd0000644000176200001440000000557413667026455014214 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/repoverlap.R \name{repOverlap} \alias{repOverlap} \title{General function for the repertoire overlap evaluation.} \usage{ repOverlap( .data, .method = c("exact", "hamm", "lev", "jaccard", "morisita", "tversky", "overlap", "horn"), .seq = c("nuc", "aa"), .quant = c("read.count", "umi.count", "read.prop", "umi.prop"), .vgene = F, .norm = T, .a = 0.5, .b = 0.5, .do.unique = T, .verbose = T ) } \arguments{ \item{.data}{List of clonesets.} \item{.method}{Which method to use for the overlap evaluation. See "Details" for methods.} \item{.seq}{Which clonotype sequences to use for the overlap: "nuc" for "CDR3.nucleotide.sequence", "aa" for "CDR3.amino.acid.sequence".} \item{.quant}{Which column to use for the quantity of clonotypes: "read.count" for the "Read.count" column, "umi.count" for the "Umi.count" column, "read.prop" for the "Read.proportion" column, "umi.prop" for the "Umi.proportion" column. Used in "morisita" and "horn".} \item{.vgene}{If T than use V genes in computing shared or similar clonotypes. Used in all methods.} \item{.norm}{If T than compute the normalised number of shared clonotypes. Used in "exact".} \item{.a, .b}{Alpha and beta parameters for "tversky". Default values gives the Jaccard index measure.} \item{.do.unique}{If T than remove duplicates from the input data, but add their quantities to their clones.} \item{.verbose}{If T than output the data processing progress bar.} } \description{ General interface to all cloneset overlap functions. } \details{ You can see a more detailed description for each overlap method at \link{intersectClonesets} and \link{similarity}. Parameter \code{.method} can have one of the following value each corresponding to the specific method: - "exact" for the shared number of clonotypes (basic function \code{intersectClonesets(..., .type = "..e")}). - "hamm" for the number of similar clonotypes by the Hamming distance (basic function \code{intersectClonesets(..., .type = "..h")}). - "lev" for the number of similar clonotypes by the Levenshtein distance (basic function \code{intersectClonesets(..., .type = "..l")}). - "jaccard" for the Jaccard index (basic function \code{jaccard.index}). - "morisita" for the Morisita's overlap index (basic function \code{morisita.index}). - "tversky" for the Tversky index (basic function \code{tversky.index}). - "overlap" for the overlap coefficient (basic function \code{overlap.coef}). - "horn" for the Horn's index (basic function \code{horn.index}). } \examples{ \dontrun{ data(twb) repOverlap(twb, "exact", .seq = "nuc", .vgene = F) repOverlap(twb, "morisita", .seq = "aa", .vgene = T, .quant = "umi.count") ov <- repOverlap(twb) ov[is.na(ov)] <- 0 vis.pca(prcomp(ov, scale. = T), list(A = c(1, 2), B = c(3, 4))) } } \seealso{ \link{intersectClonesets}, \link{similarity}, \link{repDiversity} } tcR/man/matrixdiagcopy.Rd0000644000176200001440000000056013667026401015076 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/datatools.R \name{matrixdiagcopy} \alias{matrixdiagcopy} \title{Copy the up-triangle matrix values to low-triangle.} \usage{ matrixdiagcopy(mat) } \arguments{ \item{mat}{Given up-triangle matrix.} } \value{ Full matrix. } \description{ Copy the up-triangle matrix values to low-triangle. } tcR/man/vis.group.boxplot.Rd0000644000176200001440000000312713667026455015507 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/plots.R \name{vis.group.boxplot} \alias{vis.group.boxplot} \title{Boxplot for groups of observations.} \usage{ vis.group.boxplot( .data, .groups = NA, .labs = c("V genes", "Frequency"), .title = "", .rotate.x = T, .violin = T, .notch = F, ... ) } \arguments{ \item{.data}{Either a matrix with colnames and rownames specifyed or a data frame with the first column of strings for row names and other columns stands for values.} \item{.groups}{Named list with character vectors for names of elements for each group. If NA than each member is in the individual group.} \item{.labs}{Labs names. Character vector of length 1 (for naming both axis with same name) or 2 (first elements stands for x-axis).} \item{.title}{Main title of the plot.} \item{.rotate.x}{if T then rotate x-axis.} \item{.violin}{If T then plot a violin plot.} \item{.notch}{"notch" parameter to the \code{geom_boxplot} ggplo2 function.} \item{...}{Parameters passed to \code{melt}, applied to \code{.data} before plotting in \code{vis.group.boxplot}.} } \value{ ggplot object. } \description{ Plot boxplots for each group. } \examples{ \dontrun{ names(immdata) # "A1" "A2" "B1" "B2" "C1" "C2" # Plot a boxplot for V-usage for each plot # three boxplots for each group. vis.group.boxplot(freq.Vb(immdata), list(A = c('A1', 'A2'), B = c('B1', 'B2'), C = c('C1', 'C2')), c('V segments', 'Frequency')) data(twb) ov <- repOverlap(twb) sb <- matrixSubgroups(ov, list(tw1 = c('Subj.A', 'Subj.B'), tw2 = c('Subj.C', 'Subj.D'))); vis.group.boxplot(sb) } } tcR/man/fix.alleles.Rd0000644000176200001440000000060613667026401014261 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/datatools.R \name{fix.alleles} \alias{fix.alleles} \alias{fix.genes} \title{Fix alleles / genes by removing allele information / unnecessary colons.} \usage{ fix.alleles(.data) } \arguments{ \item{.data}{tcR data frame.} } \description{ Fix alleles / genes by removing allele information / unnecessary colons. } tcR/man/inverse.simpson.Rd0000644000176200001440000000600213667026401015211 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/diversity.R \name{inverse.simpson} \alias{inverse.simpson} \alias{diversity} \alias{gini} \alias{chao1} \alias{gini.simpson} \title{Distribution evaluation.} \usage{ inverse.simpson(.data, .do.norm = NA, .laplace = 0) diversity(.data, .q = 5, .do.norm = NA, .laplace = 0) gini(.data, .do.norm = NA, .laplace = 0) gini.simpson(.data, .do.norm = NA, .laplace = 0) chao1(.data) } \arguments{ \item{.data}{Numeric vector of values for proportions or for numbers of individuals.} \item{.do.norm}{One of the three values - NA, T or F. If NA than check for distrubution (sum(.data) == 1) and normalise if needed with the given laplace correction value. if T then do normalisation and laplace correction. If F than don't do normalisaton and laplace correction.} \item{.laplace}{Value for Laplace correction which will be added to every value in the .data.} \item{.q}{q-parameter for the Diversity index.} } \value{ Numeric vector of length 1 with value for all functions except \code{chao1}, which returns 4 values: estimated number of species, standart deviation of this number and two 95% confidence intervals for the species number. } \description{ Functions for evaluating the diversity of species or objects in the given distribution. See the \code{repOverlap} function for working with clonesets and a general interface to all of this functions. Warning! Functions will check if .data is a distribution of a random variable (sum == 1) or not. To force normalisation and / or to prevent this, set .do.norm to TRUE (do normalisation) or FALSE (don't do normalisation), respectively. - True diversity, or the effective number of types, refers to the number of equally-abundant types needed for the average proportional abundance of the types to equal that observed in the dataset of interest where all types may not be equally abundant. - Inverse Simpson index is the effective number of types that is obtained when the weighted arithmetic mean is used to quantify average proportional abundance of types in the dataset of interest. - The Gini coefficient measures the inequality among values of a frequency distribution (for example levels of income). A Gini coefficient of zero expresses perfect equality, where all values are the same (for example, where everyone has the same income). A Gini coefficient of one (or 100 percents ) expresses maximal inequality among values (for example where only one person has all the income). - The Gini-Simpson index is the probability of interspecific encounter, i.e., probability that two entities represent different types. - Chao1 estimator is a nonparameteric asymptotic estimator of species richness (number of species in a population). } \examples{ data(twb) # Next two are equal calls: stopifnot(gini(twb[[1]]$Read.count, TRUE, 0) - 0.7609971 < 1e-07) stopifnot(gini(twb[[1]]$Read.proportion, FALSE) - 0.7609971 < 1e-07) stopifnot(chao1(twb[[1]]$Read.count)[1] == 1e+04) } \seealso{ \link{repOverlap}, \link{entropy}, \link{similarity} } tcR/man/kmer.profile.Rd0000644000176200001440000000174213667026401014452 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/kmers.R \name{kmer.profile} \alias{kmer.profile} \alias{kmers.profile} \title{Profile of sequences of equal length.} \usage{ kmer.profile(.data, .names = rep('Noname', times=length(.data)), .verbose = F) } \arguments{ \item{.data}{Either list with elements of one of the allowed classes or object with one of the class: data.frame with first column with character sequences and second column with number of sequences or character vector.} \item{.names}{Names for each sequence / row in the \code{.data}.} \item{.verbose}{if T then print processing output.} } \value{ Return data frame with first column "Symbol" with all possible symbols in the given sequences and other columns with names "1", "2", ... for each position with percentage for each symbol. } \description{ Return profile for the given character vector or a data frame with sequences of equal length or list with them. } \seealso{ \link{vis.logo} } tcR/man/convergence.index.Rd0000644000176200001440000000161413667026455015470 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/crosses.R \name{convergence.index} \alias{convergence.index} \title{Compute convergence characteristics of repertoires.} \usage{ convergence.index( .alpha, .beta, .col.nuc = "CDR3.nucleotide.sequence", .col.aa = "CDR3.amino.acid.sequence" ) } \arguments{ \item{.alpha}{Either data frame with columns \code{.col.nuc} and \code{.col.aa} or list with such data frames.} \item{.beta}{Either data frame or none.} \item{.col.nuc}{Name of the column with nucleotide sequences.} \item{.col.aa}{Name of the columnw ith aminoacid sequences.} } \value{ If \code{.alpha} is data frame, than integer vector of length 2 with . If \code{.alpha} is a list than matrix M with M[i,j] = convergence.index(.alpha[[i]], .alpha[[j]]). } \description{ Get a number of rows with similar aminoacid sequence but different nucleotide sequence. } tcR/man/revcomp.Rd0000644000176200001440000000116313667026455013536 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/strtools.R \name{revcomp} \alias{revcomp} \alias{bunch.translate} \title{DNA reverse complementing and translation.} \usage{ revcomp(.seq) bunch.translate(.seq, .two.way = T) revcomp(.seq) bunch.translate(.seq, .two.way = T) } \arguments{ \item{.seq}{Vector of nucleotide sequences.} \item{.two.way}{if T then translate sequences from both ends (output differes for out-of-frame sequences).} } \value{ Vector of corresponding revese complemented or aminoacid sequences. } \description{ Functions for DNA reverse complementing and translation. } tcR/man/codon.variants.Rd0000644000176200001440000000326613667026401015010 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/strtools.R \name{codon.variants} \alias{codon.variants} \alias{translated.nucl.sequences} \alias{reverse.translation} \title{Functions for working with aminoacid sequences.} \usage{ codon.variants(.aaseq, .nucseq = sapply(1:length(.aaseq), function (i) paste0(rep('XXX', times = nchar(.aaseq[i])), collapse = ''))) translated.nucl.sequences(.aaseq, .nucseq = sapply(1:length(.aaseq), function (i) paste0(rep('XXX', times = nchar(.aaseq[i])), collapse = ''))) reverse.translation(.aaseq, .nucseq = paste0(rep('XXX', times = nchar(.aaseq)), collapse = '')) } \arguments{ \item{.aaseq}{Amino acid sequence.} \item{.nucseq}{Nucleotide sequence with 'X' letter at non-fixed positions. Other positions will be fixed.} } \value{ List with all possible variants for every aminoacid in .aaseq, number of sequences or character vector of candidate sequences. } \description{ \code{codon.variants} - get all codon variants for the given nucleotide sequence with known corresponding aminoacid sequence. \code{translated.nucl.variants} - get number of nucleotide sequences which can be translated to the given aminoacid sequence. \code{reverse.translation} - get all nucleotide sequences, which can be traslated to the given aminoacid sequence. } \examples{ codon.variants('ACT') translated.nucl.sequences(c('ACT', 'CASSLQ')) reverse.translation('T') # -> "ACA" "ACC" "ACG" "ACT" reverse.translation('T', 'XXT') # -> "ACT" translated.nucl.sequences('ACT', 'XXXXXXXC') codon.variants('ACT', 'XXXXXXXC') reverse.translation('ACT', 'XXXXXXXC') } tcR/man/startmitcr.Rd0000644000176200001440000000232113667026455014254 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/mitcr.R \name{startmitcr} \alias{startmitcr} \title{Start MiTCR directly from the package.} \usage{ startmitcr( .input = "", .output = "", ..., .file.path = "", .mitcr.path = "~/programs/", .mem = "4g" ) } \arguments{ \item{.input, .output}{Input and output files.} \item{...}{Specify input and output files and arguments of the MITCR without first '-' to run it.} \item{.file.path}{Path prepending to \code{.input} and \code{.output}. If input and output is empty, but .file.path is specified, than process all files from the folder \code{.file.path}} \item{.mitcr.path}{Path to MiTCR .jar file.} \item{.mem}{Volume of memory available to MiTCR.} } \description{ Start the MiTCR tools directly from the package with given settings. } \details{ Don't use spaces in paths! You should have insalled JDK 1.7 to make it works. } \examples{ \dontrun{ # Equal to # java -Xmx8g -jar ~/programs/mitcr.jar -pset flex # -level 2 ~/data/raw/TwA1_B.fastq.gz ~/data/mitcr/TwA1_B.txt startmitcr('raw/TwA1_B.fastq.gz', 'mitcr/TwA1_B.txt', .file.path = '~/data/', pset = 'flex', level = 1, 'debug', .mitcr.path = '~/programs/', .mem = '8g') } } tcR/man/spectratype.Rd0000644000176200001440000000211713667026455014426 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/spectrum.R \name{spectratype} \alias{spectratype} \title{Spectratype} \usage{ spectratype( .data, .quant = c("read.count", "umi.count", "id"), .gene = "V", .plot = T, .main = "Spectratype", .legend = "Gene segment", .labs = c("CDR3 length", NA) ) } \arguments{ \item{.data}{tcR data frame.} \item{.quant}{Either "read.count" or "umi.count" for choosing the corresponding columns, or "id" to compute avoid using counts.} \item{.gene}{Either NA for not using genes, "V" or "J" for corresponding genes.} \item{.plot}{If T than plot the spectratype plot, otherwise return a table with data for lengths and counts.} \item{.main}{Main title.} \item{.legend}{Legend title.} \item{.labs}{Character vector of length 2 for x-lab and y-lab.} } \description{ Plot a spectratype plot - a histogram of read counts / umi counts by CDR3 length. } \examples{ \dontrun{ data(twb) tmp = twb[[1]] spectratype(tmp) spectratype(tmp, .quant = "id", .plot = T, .gene = 'V') spectratype(tmp, .quant = "read.count", .plot = F) } } tcR/man/geneUsage.Rd0000644000176200001440000000463013667026455013770 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/segments.R \name{geneUsage} \alias{geneUsage} \title{Gene usage.} \usage{ geneUsage( .data, .genes = HUMAN_TRBV_MITCR, .quant = c(NA, "read.count", "umi.count", "read.prop", "umi.prop"), .norm = F, .ambig = F ) } \arguments{ \item{.data}{Cloneset data frame or a list with clonesets.} \item{.genes}{Either one of the gene alphabet (e.g., HUMAN_TRBV, \link{genealphabets}) or list with two gene alphabets for computing joint distribution.} \item{.quant}{Which column to use for the quantity of clonotypes: NA for computing only number of genes without using clonotype counts, "read.count" for the "Read.count" column, "umi.count" for the "Umi.count" column, "read.prop" for the "Read.proportion" column, "umi.prop" for the "Umi.proportion" column.} \item{.norm}{If T then return proportions of resulting counting of genes.} \item{.ambig}{If F than remove from counting genes which are not presented in the given gene alphabet(s).} } \value{ If \code{.data} is a cloneset and \code{.genes} is NOT a list than return a data frame with first column "Gene" with genes and second with counts / proportions. If \code{.data} is a list with clonesets and \code{.genes} is NOT a list than return a data frame with first column "Gene" with genes and other columns with counts / proportions for each cloneset in the input list. If \code{.data} is a cloneset and \code{.genes} IS a list than return a matrix with gene segments for the first gene in \code{.genes} and column names for the second gene in \code{.genes}. See "Examples". If \code{.data} is a list with clonesets and \code{.genes} IS a list than return a list with matrices like in the previous case. } \description{ Compute frequencies or counts of gene segments ("V / J - usage"). } \examples{ \dontrun{ # Load your data data(twb) # compute V-segments frequencies of human TCR beta. seg <- geneUsage(twb, HUMAN_TRBV, .norm = T) # plot V-segments frequencies as a heatmap vis.heatmap(seg, .labs = c("Sample", "V gene")) # plot V-segments frequencies directly from clonesets vis.gene.usage(twb, HUMAN_TRBV) # plot V-segments frequencies from the gene frequencies vis.gene.usage(seg, NA) # Compute V-J joint usage. geneUsage(twb, list(HUMAN_TRBV, HUMAN_TRBJ)) # for future: # geneUsage(twb, "human", "trbv") } } \seealso{ \code{\link{genealphabets}}, \code{\link{vis.gene.usage}}, \code{\link{pca.segments}} } tcR/man/reverse.string.Rd0000644000176200001440000000101713667026401015030 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/strtools.R \name{reverse.string} \alias{reverse.string} \title{Reverse given character vector by the given n-plets.} \usage{ reverse.string(.seq, .n = 1) } \arguments{ \item{.seq}{Sequences.} \item{.n}{By which n-plets we should reverse the given strings.} } \value{ Reversed strings. } \description{ Reverse given character vector by the given n-plets. } \examples{ reverse.string('abcde') # => "edcba" reverse.string('abcde', 2) # => "debca" } tcR/man/parse.folder.Rd0000644000176200001440000001062513667026401014441 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/parsing.R \name{parse.folder} \alias{parse.folder} \alias{parse.file.list} \alias{parse.file} \alias{parse.mitcr} \alias{parse.mitcrbc} \alias{parse.migec} \alias{parse.vdjtools} \alias{parse.immunoseq} \alias{parse.immunoseq2} \alias{parse.immunoseq3} \alias{parse.tcr} \alias{parse.mixcr} \alias{parse.imseq} \alias{parse.migmap} \title{Parse input table files with immune receptor repertoire data.} \usage{ parse.file(.filename, .format = c('mitcr', 'mitcrbc', 'migec', 'vdjtools', 'immunoseq', 'mixcr', 'imseq', 'tcr'), ...) parse.file.list(.filenames, .format = c('mitcr', 'mitcrbc', 'migec', 'vdjtools', 'immunoseq', 'mixcr', 'imseq', 'tcr'), .namelist = NA) parse.folder(.folderpath, .format = c('mitcr', 'mitcrbc', 'migec', 'vdjtools', 'immunoseq', 'mixcr', 'imseq', 'tcr'), ...) parse.mitcr(.filename) parse.mitcrbc(.filename) parse.migec(.filename) parse.vdjtools(.filename) parse.immunoseq(.filename) parse.immunoseq2(.filename) parse.immunoseq3(.filename) parse.mixcr(.filename) parse.imseq(.filename) parse.tcr(.filename) parse.migmap(.filename) } \arguments{ \item{.folderpath}{Path to the folder with text cloneset files.} \item{.format}{String that specifies the input format.} \item{...}{Parameters passed to \code{parse.cloneset}.} \item{.filename}{Path to the input file with cloneset data.} \item{.filenames}{Vector or list with paths to files with cloneset data.} \item{.namelist}{Either NA or character vector of length \code{.filenames} with names for output data frames.} } \value{ Data frame with immune receptor repertoire data. Each row in this data frame corresponds to a clonotype. The data frame has following columns: - "Umi.count" - number of barcodes (events, UMIs); - "Umi.proportion" - proportion of barcodes (events, UMIs); - "Read.count" - number of reads; - "Read.proportion" - proportion of reads; - "CDR3.nucleotide.sequence" - CDR3 nucleotide sequence; - "CDR3.amino.acid.sequence" - CDR3 amino acid sequence; - "V.gene" - names of aligned Variable gene segments; - "J.gene" - names of aligned Joining gene segments; - "D.gene" - names of aligned Diversity gene segments; - "V.end" - last positions of aligned V gene segments (1-based); - "J.start" - first positions of aligned J gene segments (1-based); - "D5.end" - positions of D'5 end of aligned D gene segments (1-based); - "D3.end" - positions of D'3 end of aligned D gene segments (1-based); - "VD.insertions" - number of inserted nucleotides (N-nucleotides) at V-D junction (-1 for receptors with VJ recombination); - "DJ.insertions" - number of inserted nucleotides (N-nucleotides) at D-J junction (-1 for receptors with VJ recombination); - "Total.insertions" - total number of inserted nucleotides (number of N-nucleotides at V-J junction for receptors with VJ recombination). } \description{ Load the TCR data from the file with the given filename to a data frame or load all files from the given folder to a list of data frames. The folder must contain onky files with the specified format. Input files could be either text files or archived with gzip ("filename.txt.gz") or bzip2 ("filename.txt.bz2"). For a general parser see \code{\link{parse.cloneset}}. Parsers are available for: MiTCR ("mitcr"), MiTCR w/ UMIs ("mitcrbc"), MiGEC ("migec"), VDJtools ("vdjtools"), ImmunoSEQ ("immunoseq" or 'immunoseq2' for old and new formats respectively), MiXCR ("mixcr"), IMSEQ ("imseq") and tcR ("tcr", data frames saved with the `repSave()` function). Output of MiXCR should contain either all hits or best hits for each gene segment. Output of IMSEQ should be generated with parameter "-on". In this case there will be no positions of aligned gene segments in the output data frame due to restrictions of IMSEQ output. tcR's data frames should be saved with the `repSave()` function. } \examples{ \dontrun{ # Parse file in "~/mitcr/immdata1.txt" as a MiTCR file. immdata1 <- parse.file("~/mitcr/immdata1.txt", 'mitcr') # Parse VDJtools file archive as .gz file. immdata1 <- parse.file("~/mitcr/immdata3.txt.gz", 'vdjtools') # Parse files "~/data/immdata1.txt" and "~/data/immdat2.txt" as MiGEC files. immdata12 <- parse.file.list(c("~/data/immdata1.txt", "~/data/immdata2.txt"), 'migec') # Parse all files in "~/data/" as MiGEC files. immdata <- parse.folder("~/data/", 'migec') } } \seealso{ \link{parse.cloneset}, \link{repSave}, \link{repLoad} } tcR/man/mutated.neighbours.Rd0000644000176200001440000000226413667026401015664 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/graph.R \name{mutated.neighbours} \alias{mutated.neighbours} \title{Get vertex neighbours.} \usage{ mutated.neighbours(.G, .V, .order = 1) } \arguments{ \item{.G}{Mutation network.} \item{.V}{Indices of vertices for which return neighbours.} \item{.order}{Neighbours of which order return.} } \value{ List of length \code{.V} with data frames with vertex properties. First row in each data frame is the vertex for which neighbours was returned. } \description{ Get all properties of neighbour vertices in a mutation network of specific vertices. } \examples{ \dontrun{ data(twb) twb.shared <- shared.repertoire(twb) G <- mutation.network(twb.shared) head(mutated.neighbours(G, 1)[[1]]) # label vseg repind prob people npeople # 1 CASSDRDTGELFF TRBV6-4 1 -1 1111 4 # 2 CASSDSDTGELFF TRBV6-4 69 -1 1100 2 # 3 CASSYRDTGELFF TRBV6-3, TRBV6-2 315 -1 1001 2 # 4 CASKDRDTGELFF TRBV6-3, TRBV6-2 2584 -1 0100 1 # 5 CASSDGDTGELFF TRBV6-4 5653 -1 0010 1 # 6 CASSDRETGELFF TRBV6-4 5950 -1 0100 1 } } tcR/man/resample.Rd0000644000176200001440000000377713667026401013677 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/dataproc.R \name{resample} \alias{resample} \alias{downsample} \alias{prop.sample} \title{Resample data frame using values from the column with number of clonesets.} \usage{ resample(.data, .n = -1, .col = c("read.count", "umi.count")) downsample(.data, .n, .col = c("read.count", "umi.count")) prop.sample(.data, .perc = 50, .col = c("read.count", "umi.count")) } \arguments{ \item{.data}{Data frame with the column \code{.col} or list of such data frames.} \item{.n}{Number of values / reads / UMIs to choose.} \item{.col}{Which column choose to represent quanitites of clonotypes. See "Details".} \item{.perc}{Percentage (0 - 100). See "Details" for more info.} } \value{ Subsampled data frame. } \description{ Resample data frame using values from the column with number of clonesets. Number of clonestes (i.e., rows of a MiTCR data frame) are reads (usually the "Read.count" column) or UMIs (i.e., barcodes, usually the "Umi.count" column). } \details{ \code{resample}. Using multinomial distribution, compute the number of occurences for each cloneset, than remove zero-number clonotypes and return resulting data frame. Probabilities for \code{rmultinom} for each cloneset is a percentage of this cloneset in the \code{.col} column. It's a some sort of simulation of how clonotypes are chosen from the organisms. For now it's not working very well, so use \code{downsample} instead. \code{downsample}. Choose \code{.n} clones (not clonotypes!) from the input repertoires without any probabilistic simulation, but exactly computing each choosed clones. Its output is same as for \code{resample} (repertoires), but is more consistent and biologically pleasant. \code{prop.sample}. Choose the first N clonotypes which occupies \code{.perc} percents of overall UMIs / reads. } \examples{ \dontrun{ # Get 100K reads (not clones!). immdata.1.100k <- resample(immdata[[1]], 100000, .col = "read.count") } } \seealso{ \link{rmultinom}, \link{clonal.proportion} } tcR/man/dot-verbose.msg.Rd0000644000176200001440000000071013667026455015076 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/datatools.R \name{.verbose.msg} \alias{.verbose.msg} \title{Print the given message if second parameter is a TRUE.} \usage{ .verbose.msg(.message, .verbose = T) } \arguments{ \item{.message}{Character vector standing for a message.} \item{.verbose}{If T then print the given mesasge.} } \value{ Nothing. } \description{ Print the given message if second parameter is a TRUE. } tcR/man/cosine.similarity.Rd0000644000176200001440000001025313667026401015517 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/measures.R \name{cosine.similarity} \alias{cosine.similarity} \alias{similarity} \alias{tversky.index} \alias{overlap.coef} \alias{morisitas.index} \alias{jaccard.index} \alias{horn.index} \title{Set and vector similarity measures.} \usage{ cosine.similarity(.alpha, .beta, .do.norm = NA, .laplace = 0) tversky.index(x, y, .a = 0.5, .b = 0.5) overlap.coef(.alpha, .beta) jaccard.index(.alpha, .beta, .intersection.number = NA) morisitas.index(.alpha, .beta, .do.unique = T) horn.index(.alpha, .beta, .do.unique = T) } \arguments{ \item{.alpha, .beta, x, y}{Vector of numeric values for cosine similarity, vector of any values (like characters) for \code{tversky.index} and \code{overlap.coef}, matrix or data.frame with 2 columns for \code{morisitas.index} and \code{horn.index}, either two sets or two numbers of elements in sets for \code{jaccard.index}.} \item{.do.norm}{One of the three values - NA, T or F. If NA than check for distrubution (sum(.data) == 1) and normalise if needed with the given laplace correction value. if T then do normalisation and laplace correction. If F than don't do normalisaton and laplace correction.} \item{.laplace}{Value for Laplace correction.} \item{.a, .b}{Alpha and beta parameters for Tversky Index. Default values gives the Jaccard index measure.} \item{.do.unique}{if T then call unique on the first columns of the given data.frame or matrix.} \item{.intersection.number}{Number of intersected elements between two sets. See "Details" for more information.} } \value{ Value of similarity between the given sets or vectors. } \description{ Functions for computing similarity between two vectors or sets. See "Details" for exact formulas. - Cosine similarity is a measure of similarity between two vectors of an inner product space that measures the cosine of the angle between them. - Tversky index is an asymmetric similarity measure on sets that compares a variant to a prototype. - Overlap cofficient is a similarity measure related to the Jaccard index that measures the overlap between two sets, and is defined as the size of the intersection divided by the smaller of the size of the two sets. - Jaccard index is a statistic used for comparing the similarity and diversity of sample sets. - Morisita's overlap index is a statistical measure of dispersion of individuals in a population. It is used to compare overlap among samples (Morisita 1959). This formula is based on the assumption that increasing the size of the samples will increase the diversity because it will include different habitats (i.e. different faunas). - Horn's overlap index based on Shannon's entropy. Use the \link{repOverlap} function for computing similarities of clonesets. } \details{ For \code{morisitas.index} input data are matrices or data.frames with two columns: first column is elements (species or individuals), second is a number of elements (species or individuals) in a population. Formulas: Cosine similarity: \code{cos(a, b) = a * b / (||a|| * ||b||)} Tversky index: \code{S(X, Y) = |X and Y| / (|X and Y| + a*|X - Y| + b*|Y - X|)} Overlap coefficient: \code{overlap(X, Y) = |X and Y| / min(|X|, |Y|)} Jaccard index: \code{J(A, B) = |A and B| / |A U B|} For Jaccard index user can provide |A and B| in \code{.intersection.number} otherwise it will be computed using \code{base::intersect} function. In this case \code{.alpha} and \code{.beta} expected to be vectors of elements. If \code{.intersection.number} is provided than \code{.alpha} and \code{.beta} are exptected to be numbers of elements. Formula for Morisita's overlap index is quite complicated and can't be easily shown here, so just look at this webpage: http://en.wikipedia.org/wiki/Morisita%27s_overlap_index } \examples{ \dontrun{ jaccard.index(1:10, 2:20) a <- length(unique(immdata[[1]][, c('CDR3.amino.acid.sequence', 'V.gene')])) b <- length(unique(immdata[[2]][, c('CDR3.amino.acid.sequence', 'V.gene')])) # Next jaccard.index(a, b, repOverlap(immdata[1:2], .seq = 'aa', .vgene = T)) # is equal to repOverlap(immdata[1:2], 'jaccard', seq = 'aa', .vgene = T) } } \seealso{ \link{repOverlap}, \link{intersectClonesets}, \link{entropy}, \link{diversity} } tcR/man/repLoad.Rd0000644000176200001440000000324113667026401013437 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/io.R \name{repLoad} \alias{repLoad} \title{Parse input files or folders with immune receptor repertoire data.} \usage{ repLoad(.path, .format = c("mitcr", "migec")) } \arguments{ \item{.path}{Character vector with path to files and / or folders.} \item{.format}{String that specifies the input format.} } \description{ Load the immune receptor repertoire data from the given input: either a file name, a list of file names, a name of the folder with repertoire files, or a list of folders with repertoire files. The folder / folders must contain only files with the specified format. Input files could be either text files or archived with gzip ("filename.txt.gz") or bzip2 ("filename.txt.bz2"). For a general parser of table files with cloneset data see \code{\link{parse.cloneset}}. Parsers are available for: MiTCR ("mitcr"), MiTCR w/ UMIs ("mitcrbc"), MiGEC ("migec"), VDJtools ("vdjtools"), ImmunoSEQ ("immunoseq" or 'immunoseq2' for old and new formats respectively), MiXCR ("mixcr"), IMSEQ ("imseq") and tcR ("tcr", data frames saved with the `repSave()` function). Output of MiXCR should contain either all hits or best hits for each gene segment. Output of IMSEQ should be generated with parameter "-on". In this case there will be no positions of aligned gene segments in the output data frame due to restrictions of IMSEQ output. tcR's data frames should be saved with the `repSave()` function. For details on the tcR data frame format see \link{parse.file}. } \examples{ \dontrun{ datalist <- repLoad(c("file1.txt", "folder_with_files1", "another_folder"), "mixcr") } } \seealso{ \link{parse.file} } tcR/man/vis.radarlike.Rd0000644000176200001440000000161313667026401014610 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/plots.R \name{vis.radarlike} \alias{vis.radarlike} \title{Radar-like / spider-like plots.} \usage{ vis.radarlike(.data, .ncol = 3, .which = NA, .expand = c(0.25, 0)) } \arguments{ \item{.data}{Square data frame or matrix with row names and col names stands for objects and values for distances.} \item{.ncol}{Number of columns in the grid.} \item{.which}{Character vector, which datasets to show.} \item{.expand}{Integer vector of length 2, for \code{scale_y_continous(expand = .expand)} function.} } \description{ Plot a grid of radar(-like) plots for visualising a distance among objects. } \examples{ \dontrun{ load('immdata.rda') # Compute Jensen-Shannon divergence among V-usage of repertoires. imm.js <- js.div.seg(immdata, .verbose = F) # Plot it. vis.radarlike(imm.js) } } \seealso{ \link{repOverlap}, \link{js.div} } tcR/man/bootstrap.tcr.Rd0000644000176200001440000000351213667026455014667 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/stats.R \name{bootstrap.tcr} \alias{bootstrap.tcr} \title{Bootstrap for data frames in package tcR.} \usage{ bootstrap.tcr( .data, .fun = entropy.seg, .n = 1000, .size = nrow(.data), .sim = c("uniform", "percentage"), .postfun = function(x) { unlist(x) }, .verbose = T, .prop.col = "Read.proportion", ... ) } \arguments{ \item{.data}{Data frame.} \item{.fun}{Function applied to each sample.} \item{.n}{Number of iterations (i.e., size of a resulting distribution).} \item{.size}{Size of samples. For \code{.sim} == "uniform" stands for number of rows to take. For \code{.sim} == "percentage" stands for number of UMIs / read counts to take.} \item{.sim}{A character string indicating the type of simulation required. Possible values are "uniform" or "percentage". See "Details" for more details of type of simulation.} \item{.postfun}{Function applied to the resulting list: list of results from each processed sample.} \item{.verbose}{if T then show progress bar.} \item{.prop.col}{Column with proportions for each clonotype.} \item{...}{Further values passed to \code{.fun}.} } \value{ Either result from \code{.postfun} or list of length \code{.n} with values of \code{.fun}. } \description{ Resample rows (i.e., clones) in the given data frame and apply the given function to them. } \details{ Argument \code{.sim} can take two possible values: "uniform" (for uniform distribution), when each row can be taken with equal probability, and "perccentage" when each row can be taken with probability equal to its "Read.proportion" column. } \examples{ \dontrun{ # Apply entropy.seg function to samples of size 20000 from immdata$B data frame for 100 iterations. bootstrap.tcr(immdata[[2]], .fun = entropy.seg, .n = 100, .size = 20000, .sim = 'uniform') } } tcR/man/get.deletions.alpha.Rd0000644000176200001440000000257213667026401015707 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/dataproc.R \name{get.deletions.alpha} \alias{get.deletions.alpha} \alias{get.deletions.beta} \title{Compute the number of deletions in MiTCR data frames.} \usage{ get.deletions.alpha(.data, .Vs = segments$TRAV, .Js = segments$TRAJ) get.deletions.beta(.data, .Vs = segments$TRBV, .Js = segments$TRBJ, .Ds = segments$TRBD) } \arguments{ \item{.data}{Mitcr data.frame.} \item{.Vs}{Table of V segments; must have 'V.segment' and 'Nucleotide.sequence' columns.} \item{.Js}{Table of J segments; must have 'J.segment' and 'Nucleotide.sequence' columns.} \item{.Ds}{Table of D segments; must have 'D.segment' and 'Nucleotide.sequence' columns.} } \value{ Mitcr data.frame with 3 (for alpha chains) or 5 (for beta chains) new columns for deletions. } \description{ Get deletions for VD, DJ, 5'D and 3'D ends and two columns with total deletions for VD/DJ and 5'D/3'D deletions for the given mitcr data.frame with 0-indexes columns. Cases, in which deletions cannot be determined, will have -1 in their cell. } \details{ By default, \code{*.table} parameters are taken from the \code{segments} data frame which can be loaded to your R environment with data(segments). Data for segments has been taken from IMGT. } \examples{ \dontrun{ data(segments) immdata <- get.deletions.beta(.data) immdata.prob <- tcr.prob.df(immdata) } } tcR/man/dot-fix.listnames.Rd0000644000176200001440000000050313667026455015430 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/datatools.R \name{.fix.listnames} \alias{.fix.listnames} \title{Fix names in lists.} \usage{ .fix.listnames(.datalist) } \arguments{ \item{.datalist}{List with data frames.} } \value{ List with fixed names. } \description{ Fix names in lists. } tcR/man/AA_TABLE.Rd0000644000176200001440000000127013667026455013252 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/docdata.R \docType{data} \name{AA_TABLE} \alias{AA_TABLE} \alias{AA_TABLE_REVERSED} \title{Tables with genetic code.} \format{ AA_TABLE: \code{Class 'table' Named chr [1:65] "K" "N" "K" "N" ... ..- attr(*, "names")= chr [1:65] "AAA" "AAC" "AAG" "AAT" ...} AA_TABLE_REVERSED: \code{List of 22 $ *: chr [1:3] "TAA" "TAG" "TGA" $ A: chr [1:4] "GCA" "GCC" "GCG" "GCT" $ C: chr [1:2] "TGC" "TGT" $ D: chr [1:2] "GAC" "GAT" ... } } \usage{ AA_TABLE } \description{ Tables with genetic code. } \examples{ \dontrun{ AA_TABLE['ATG'] # => "M" AA_TABLE_REVERSED['K'] # => list(K = c("AAA", "AAG")) } } \keyword{datasets} tcR/man/intersectClonesets.Rd0000644000176200001440000001252713667026401015740 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/crosses.R \name{intersectClonesets} \alias{intersectClonesets} \alias{intersectCount} \alias{intersectLogic} \alias{intersectIndices} \title{Intersection between sets of sequences or any elements.} \usage{ intersectClonesets(.alpha = NULL, .beta = NULL, .type = "n0e", .head = -1, .norm = F, .verbose = F) intersectCount(.alpha, .beta, .method = c('exact', 'hamm', 'lev'), .col = NULL) intersectIndices(.alpha, .beta, .method = c('exact', 'hamm', 'lev'), .col = NULL) intersectLogic(.alpha, .beta, .method = c('exact', 'hamm', 'lev'), .col = NULL) } \arguments{ \item{.alpha}{Either first vector or data.frame or list with data.frames.} \item{.beta}{Second vector or data.frame or type of intersection procedure (see the \code{.type} parameter) if \code{.alpha} is a list.} \item{.type}{Types of intersection procedure if \code{.alpha} and \code{.beta} is data frames. String with 3 characters (see 'Details' for more information).} \item{.head}{Parameter for the \code{head} function, applied before intersecting.} \item{.norm}{If TRUE than normalise result by product of length or nrows of the given data.} \item{.verbose}{if T then produce output of processing the data.} \item{.method}{Method to use for intersecting string elements: 'exact' for exact matching, 'hamm' for matching strings which have <= 1 hamming distance, 'lev' for matching strings which have <= 1 levenshtein (edit) distance between them.} \item{.col}{Which columns use for fetching values to intersect. First supplied column matched with \code{.method}, others as exact values.} } \value{ \code{intersectClonesets} returns (normalised) number of similar elements or matrix with numbers of elements. \code{intersectCount} returns number of similar elements. \code{intersectIndices} returns 2-row matrix with the first column stands for an index of an element in the given \code{x}, and the second column stands for an index of an element of \code{y} which is similar to a relative element in \code{x}; \code{intersectLogic} returns logical vector of \code{length(x)} or \code{nrow(x)}, where TRUE at position \code{i} means that element with index {i} has been found in the \code{y} } \description{ Functions for the intersection of data frames with TCR / Ig data. See the \code{repOverlap} function for a general interface to all overlap analysis functions. \code{intersectClonesets} - returns number of similar elements in the given two clonesets / data frames or matrix with counts of similar elements among each pair of objects in the given list. \code{intersectCount} - similar to \code{tcR::intersectClonesets}, but with fewer parameters and only for two objects. \code{intersectIndices} - returns matrix M with two columns, where element with index M[i, 1] in the first given object is similar to an element with index M[i, 2] in the second given object. \code{intersectLogic} - returns logic vector with TRUE values in positions, where element in the first given data frame is found in the second given data frame. } \details{ Parameter \code{.type} of the \code{intersectClonesets} function is a string of length 3 [0an][0vja][ehl], where: \enumerate{ \item First character defines which elements intersect ("a" for elements from the column "CDR3.amino.acid.sequence", "n" for elements from the column "CDR3.nucleotide.sequence", other characters - intersect elements as specified); \item Second character defines which columns additionaly script should use ('0' for cross with no additional columns, 'v' for cross using the "V.gene" column, 'j' for cross using "J.gene" column, 'a' for cross using both "V.gene" and "J.gene" columns); \item Third character defines a method of search for similar sequences is use: "e" stands for the exact match of sequnces, "h" for match elements which have the Hamming distance between them equal to or less than 1, "l" for match elements which have the Levenshtein distance between tham equal to or less than 1. } } \examples{ \dontrun{ data(twb) # Equivalent to intersectClonesets(twb[[1]]$CDR3.nucleotide.sequence, # twb[[2]]$CDR3.nucleotide.sequence) # or intersectCount(twb[[1]]$CDR3.nucleotide.sequence, # twb[[2]]$CDR3.nucleotide.sequence) # First "n" stands for a "CDR3.nucleotide.sequence" column, "e" for exact match. twb.12.n0e <- intersectClonesets(twb[[1]], twb[[2]], 'n0e') stopifnot(twb.12.n0e == 46) # First "a" stands for "CDR3.amino.acid.sequence" column. # Second "v" means that intersect should also use the "V.gene" column. intersectClonesets(twb[[1]], twb[[2]], 'ave') # Works also on lists, performs all possible pairwise intersections. intersectClonesets(twb, 'ave') # Plot results. vis.heatmap(intersectClonesets(twb, 'ave'), .title = 'twb - (ave)-intersection', .labs = '') # Get elements which are in both twb[[1]] and twb[[2]]. # Elements are tuples of CDR3 nucleotide sequence and corresponding V-segment imm.1.2 <- intersectLogic(twb[[1]], twb[[2]], .col = c('CDR3.amino.acid.sequence', 'V.gene')) head(twb[[1]][imm.1.2, c('CDR3.amino.acid.sequence', 'V.gene')]) data(twb) ov <- repOverlap(twb) sb <- matrixSubgroups(ov, list(tw1 = c('Subj.A', 'Subj.B'), tw2 = c('Subj.C', 'Subj.D'))); vis.group.boxplot(sb) } } \seealso{ \link{repOverlap}, \link{vis.heatmap}, \link{ozScore}, \link{permutDistTest}, \link{vis.group.boxplot} } tcR/man/vis.number.count.Rd0000644000176200001440000000207313667026455015303 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/plots.R \name{vis.number.count} \alias{vis.number.count} \title{Plot a histogram of counts.} \usage{ vis.number.count( .data, .ncol = 3, .name = "Histogram of clonotypes read counts", .col = "Read.count" ) } \arguments{ \item{.data}{Cloneset data frame or a list of clonesets.} \item{.ncol}{If .data is a list, than number of columns in a grid of histograms for each data frame in \code{.data}. Else not used.} \item{.name}{Title for this plot.} \item{.col}{Name of the column with counts.} } \value{ ggplot object. } \description{ Plot a histogram of distribution of counts of CDR3 nucleotide sequences. On y-axis are number of counts. } \details{ If \code{.data} is a data frame, than one histogram will be plotted. Is \code{.data} is a list, than grid of histograms will be plotted. } \examples{ \dontrun{ load('immdata.rda') # Plot one histogram with main title. vis.number.count(immdata[[1]], 'Main title here') # Plot a grid of histograms with 2 columns. vis.number.count(immdata, 2) } } tcR/man/pca2euclid.Rd0000644000176200001440000000167213667026401014072 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/datatools.R \name{pca2euclid} \alias{pca2euclid} \title{Compute the Euclidean distance among principal components.} \usage{ pca2euclid(.pcaobj, .num.comps = 2) } \arguments{ \item{.pcaobj}{An object returned by \code{prcomp}.} \item{.num.comps}{On how many principal components compute the distance.} } \value{ Matrix of distances. } \description{ Compute the Euclidean distance among principal components. } \examples{ \dontrun{ mat.ov <- repOverlap(AS_DATA, .norm = T) mat.gen.pca <- pca.segments(AS_DATA, T, .genes = HUMAN_TRBV) mat.ov.pca <- prcomp(mat.ov, scale. = T) mat.gen.pca.dist <- pca2euclid(mat.gen.pca) mat.ov.pca.dist <- pca2euclid(mat.ov.pca) permutDistTest(mat.gen.pca.dist, list()) permutDistTest(mat.ov.pca.dist, list()) } } \seealso{ \link{prcomp}, \link{pca.segments}, \link{repOverlap}, \link{permutDistTest} } tcR/man/twinsdata.Rd0000644000176200001440000000103613667026455014060 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/docdata.R \docType{data} \name{twinsdata} \alias{twinsdata} \alias{twa} \alias{twb} \title{Twins alpha-beta chain data} \format{ \code{twa} and \code{twb} are lists of 4 data frames with 10000 row in each. } \description{ \code{twa.rda}, \code{twb.rda} - data frames with downsampled to the 10000 most abundant clonesets and 4 samples data of twins data (alpha and beta chains). Link: http://labcfg.ibch.ru/tcr.html } \examples{ \dontrun{ data(twa) data(twb) } } tcR/man/permutDistTest.Rd0000644000176200001440000000320613667026455015063 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/crosses.R \name{permutDistTest} \alias{permutDistTest} \title{Monte Carlo permutation test for pairwise and one-vs-all-wise within- and inter-group differences in a set of repertoires.} \usage{ permutDistTest( .mat, .groups, .n = 1000, .fun = mean, .signif = 0.05, .plot = T, .xlab = "Values", .title = "Monte Carlo permutation testing of overlaps", .hjust = -0.1, .vjust = -4 ) } \arguments{ \item{.mat}{Symmetric matrix of repertoire distances.} \item{.groups}{Named list with names of repertoires in groups.} \item{.n}{Number of permutations for each pair of group.} \item{.fun}{A function to apply to distances.} \item{.signif}{Significance level. Below this value hypotheses counts as significant.} \item{.plot}{If T than plot the output results. Else return them as a data frame.} \item{.xlab}{X lab label.} \item{.title}{Main title of the plot.} \item{.hjust}{Value for adjusting the x coordinate of p-value labels on plots.} \item{.vjust}{Value for adjusting the y coordinate of p-value labels on plots.} } \description{ WARNING: this is an experimental procedure, work is still in progress. Perform permutation tests of distances among groups for the given groups of samples and matrix of distances among all samples. } \examples{ \dontrun{ data(twb) mat <- repOverlap(twb) permutDistTest(mat, list(tw1 = c('Subj.A', 'Subj.B'), tw2 = c('Subj.C', 'Subj.D'))) permutDistTest(mat, list(tw1 = c('Subj.A', 'Subj.B'), tw2 = c('Subj.C', 'Subj.D')), .fun = median) } } \seealso{ \link{repOverlap}, \link{intersectClonesets}, \link{ozScore}, \link{pca2euclid} } tcR/man/has.class.Rd0000644000176200001440000000055413667026401013734 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/datatools.R \name{has.class} \alias{has.class} \title{Check if a given object has a given class.} \usage{ has.class(.data, .class) } \arguments{ \item{.data}{Object.} \item{.class}{String naming a class.} } \value{ Logical. } \description{ Check if a given object has a given class. } tcR/DESCRIPTION0000644000176200001440000000206613667667012012532 0ustar liggesusersPackage: tcR Type: Package Title: Advanced Data Analysis of Immune Receptor Repertoires Version: 2.3.2 Author: Vadim Nazarov Maintainer: Vadim Nazarov Description: Platform for the advanced analysis of T cell receptor and Immunoglobulin repertoires data and visualisation of the analysis results. Publication: Nazarov et al. (2015) . License: Apache License 2.0 Depends: R (>= 3.0.0), ggplot2 (>= 1.0.0), dplyr (>= 0.4.0), gridExtra (>= 0.9.0), reshape2 (>= 1.2.0), igraph (>= 0.7.1) Imports: utils (>= 3.1.0), Rcpp (>= 0.11.1), grid (>= 3.0.0), data.table (>= 1.9.0), gtable (>= 0.1.2), stringdist (>= 0.7.3), scales (>= 0.3.0) Suggests: knitr (>= 1.8), roxygen2 (>= 3.0.0), rmarkdown (>= 1.0) LinkingTo: Rcpp URL: https://immunarch.com/, http://imminfo.github.io/tcr/ BugReports: https://github.com/immunomind/immunarch/issues VignetteBuilder: knitr RoxygenNote: 7.1.0 NeedsCompilation: yes Packaged: 2020-06-09 00:07:49 UTC; vdn Repository: CRAN Date/Publication: 2020-06-09 11:10:02 UTC tcR/src/0000755000176200001440000000000013667551325011606 5ustar liggesuserstcR/src/neighbour.search.cpp0000644000176200001440000001734213667026402015540 0ustar liggesusers#include #include #include #include #include #include #include #include using namespace std; using namespace Rcpp; //----------------------------------------------- // Exact Match //----------------------------------------------- // if patterns is emptry, than use input sequences in trie for search. // [[Rcpp::export(".exact_search")]] std::vector exact_search(const std::vector& vec, const std::vector& patterns, int max_error = 1, bool verbose = true) { std::vector res; res.reserve(patterns.size() * 4); unordered_multimap string_set; for (int i = 0; i < vec.size(); i++) { string_set.insert(std::pair(vec[i], i)); } for (int j = 0; j < patterns.size(); j++) { std::pair::iterator, unordered_map::iterator> i = string_set.equal_range(patterns[j]); if (i.first != string_set.end()) { for (unordered_map::iterator k = i.first; k != i.second; k++) { res.push_back((*k).second + 1); res.push_back(j + 1); } } } return res; } // [[Rcpp::export(".exact_search_list")]] List exact_search_list(const std::vector& vec, const List patterns_list, int max_error = 1, bool verbose = true) { List out = List(); for (int list_ind = 0; list_ind < patterns_list.length(); list_ind++) { std::vector res; std::vector patterns = as >(out[list_ind]); res.reserve(patterns.size() * 4); unordered_multimap string_set; for (int i = 0; i < vec.size(); i++) { string_set.insert(std::pair(vec[i], i)); } for (int j = 0; j < patterns.size(); j++) { std::pair::iterator, unordered_map::iterator> i = string_set.equal_range(patterns[j]); if (i.first != string_set.end()) { for (unordered_map::iterator k = i.first; k != i.second; k++) { res.push_back((*k).second + 1); res.push_back(j + 1); } } } out[list_ind] = 0; } return out; } //----------------------------------------------- // Hamming Distance //----------------------------------------------- bool hamming_distance_check(const std::string& alpha, const std::string& beta, int max_error = 1) { if (alpha.size() != beta.size()) { return false; } int err = 0; for (int i = 0; i < alpha.size(); i++) { err += alpha[i] != beta[i]; if (err > max_error) { return false; } } return true; } // if patterns is empty, than use input sequences in trie for search. // [[Rcpp::export(".hamming_search")]] std::vector hamming_search(const std::vector& vec, const std::vector& patterns, int max_error = 1, bool verbose = true) { std::vector res; res.reserve(patterns.size() * 4); for (int i = 0; i < vec.size(); i++) { for (int j = 0; j < patterns.size(); j++) { if (hamming_distance_check(vec[i], patterns[j], max_error)) { res.push_back(i + 1); res.push_back(j + 1); } } } return res; } //----------------------------------------------- // Levenshtein Distance //----------------------------------------------- #define MAGIC_NUMBER 27 struct trie { struct nucmap { nucmap() { _data = new trie*[MAGIC_NUMBER]; for (int i = 0; i < MAGIC_NUMBER; i++) { _data[i] = NULL; } } ~nucmap() { for (int i = 0; i < MAGIC_NUMBER; i++) { delete _data[i]; } delete [] _data; } trie* operator[](char letter) { return _data[letter - 'A']; } trie* addTrie(char letter) { _data[letter - 'A'] = new trie(); return _data[letter - 'A']; } trie **_data; }; typedef nucmap next_t; // The set with all the letters which this node is prefix next_t next; //int index; vector index; trie() : next(nucmap()) { //index = 0; index.reserve(2); } ~trie() {} void insert(string w, int w_index = 0) { w = '[' + w; trie* n = this; for (int i = 0; i < w.size(); ++i) { if (!n->next[w[i]]) { n->next.addTrie(w[i]); } n = n->next[w[i]]; } //n->index = w_index; n->index.push_back(w_index); } }; // std::vector search_impl(trie* tree, char ch, int *last_row, int sz, const string& word, int min_cost) { int *current_row = new int[sz + 1]; current_row[0] = last_row[0] + 1; // Calculate the min cost of insertion, deletion, match or substution int insert_or_del, replace; for (int i = 1; i < sz + 1; ++i) { insert_or_del = min(current_row[i-1] + 1, last_row[i] + 1); replace = (word[i-1] == ch) ? last_row[i-1] : (last_row[i-1] + 1); current_row[i] = min(insert_or_del, replace); } // When we find a cost that is less than the min_cost, is because // it is the minimum until the current row, so we update std::vector res; //if ((current_row[sz] < min_cost) && (tree->index)) { if ((current_row[sz] < min_cost) && (tree->index.size() != 0)) { //res.push_back(tree->index); res.insert(res.end(), tree->index.begin(), tree->index.end()); } // If there is an element wich is smaller than the current minimum cost, // we can have another cost smaller than the current minimum cost if (*min_element(current_row, current_row + sz + 1) < min_cost) { for (int i = 'A'; i < 'A' + MAGIC_NUMBER; ++i) { if (tree->next[i]) { std::vector tmp = search_impl(tree->next[i], i, current_row, sz, word, min_cost); if (tmp.size() > 0) { res.insert(res.end(), tmp.begin(), tmp.end()); } } } } delete [] current_row; return res; } std::vector search(string word, int min_cost, trie* tree) { word = '[' + word; int sz = word.size(); int *current_row = new int[sz + 1]; // Naive DP initialization for (int i = 0; i < sz + 1; ++i) current_row[i] = i; std::vector res; // For each letter in the root map wich matches with a // letter in word, we must call the search for (int i = 0 ; i < sz; ++i) { if (tree->next[word[i]]) { std::vector tmp = search_impl(tree->next[word[i]], word[i], current_row, sz, word, min_cost); if (tmp.size() > 0) { res.insert(res.end(), tmp.begin(), tmp.end()); } } } delete [] current_row; return res; } // if patterns is emptry, than use input sequences in trie for search. // [[Rcpp::export(".levenshtein_search")]] std::vector levenshtein_search(const std::vector& vec, const std::vector& patterns, int max_error = 1, bool verbose = true) { // The tree trie tree; // The minimum cost of a given word to be changed to a word of the dictionary int min_cost = max_error + 1; for (int i = 0; i < vec.size(); i++) { tree.insert(vec[i], i + 1); } vector res; res.reserve(patterns.size() * 4); for (int i = 0; i < patterns.size(); i++) { // if (verbose && i % 100000 == 25) { // cout << i << "/" << patterns.size() << endl; // } vector tmp = search(patterns[i], min_cost, &tree); for (int j = 0; j < tmp.size(); j++) { res.push_back(tmp[j]); res.push_back(i + 1); } } return res; } tcR/src/Makevars0000644000176200001440000000002013667026402013263 0ustar liggesusersCXX_STD = CXX11 tcR/src/RcppExports.cpp0000644000176200001440000000743613667026445014615 0ustar liggesusers// Generated by using Rcpp::compileAttributes() -> do not edit by hand // Generator token: 10BE3573-1514-4C36-9D1C-5A225CD40393 #include using namespace Rcpp; // exact_search std::vector exact_search(const std::vector& vec, const std::vector& patterns, int max_error, bool verbose); RcppExport SEXP _tcR_exact_search(SEXP vecSEXP, SEXP patternsSEXP, SEXP max_errorSEXP, SEXP verboseSEXP) { BEGIN_RCPP Rcpp::RObject rcpp_result_gen; Rcpp::RNGScope rcpp_rngScope_gen; Rcpp::traits::input_parameter< const std::vector& >::type vec(vecSEXP); Rcpp::traits::input_parameter< const std::vector& >::type patterns(patternsSEXP); Rcpp::traits::input_parameter< int >::type max_error(max_errorSEXP); Rcpp::traits::input_parameter< bool >::type verbose(verboseSEXP); rcpp_result_gen = Rcpp::wrap(exact_search(vec, patterns, max_error, verbose)); return rcpp_result_gen; END_RCPP } // exact_search_list List exact_search_list(const std::vector& vec, const List patterns_list, int max_error, bool verbose); RcppExport SEXP _tcR_exact_search_list(SEXP vecSEXP, SEXP patterns_listSEXP, SEXP max_errorSEXP, SEXP verboseSEXP) { BEGIN_RCPP Rcpp::RObject rcpp_result_gen; Rcpp::RNGScope rcpp_rngScope_gen; Rcpp::traits::input_parameter< const std::vector& >::type vec(vecSEXP); Rcpp::traits::input_parameter< const List >::type patterns_list(patterns_listSEXP); Rcpp::traits::input_parameter< int >::type max_error(max_errorSEXP); Rcpp::traits::input_parameter< bool >::type verbose(verboseSEXP); rcpp_result_gen = Rcpp::wrap(exact_search_list(vec, patterns_list, max_error, verbose)); return rcpp_result_gen; END_RCPP } // hamming_search std::vector hamming_search(const std::vector& vec, const std::vector& patterns, int max_error, bool verbose); RcppExport SEXP _tcR_hamming_search(SEXP vecSEXP, SEXP patternsSEXP, SEXP max_errorSEXP, SEXP verboseSEXP) { BEGIN_RCPP Rcpp::RObject rcpp_result_gen; Rcpp::RNGScope rcpp_rngScope_gen; Rcpp::traits::input_parameter< const std::vector& >::type vec(vecSEXP); Rcpp::traits::input_parameter< const std::vector& >::type patterns(patternsSEXP); Rcpp::traits::input_parameter< int >::type max_error(max_errorSEXP); Rcpp::traits::input_parameter< bool >::type verbose(verboseSEXP); rcpp_result_gen = Rcpp::wrap(hamming_search(vec, patterns, max_error, verbose)); return rcpp_result_gen; END_RCPP } // levenshtein_search std::vector levenshtein_search(const std::vector& vec, const std::vector& patterns, int max_error, bool verbose); RcppExport SEXP _tcR_levenshtein_search(SEXP vecSEXP, SEXP patternsSEXP, SEXP max_errorSEXP, SEXP verboseSEXP) { BEGIN_RCPP Rcpp::RObject rcpp_result_gen; Rcpp::RNGScope rcpp_rngScope_gen; Rcpp::traits::input_parameter< const std::vector& >::type vec(vecSEXP); Rcpp::traits::input_parameter< const std::vector& >::type patterns(patternsSEXP); Rcpp::traits::input_parameter< int >::type max_error(max_errorSEXP); Rcpp::traits::input_parameter< bool >::type verbose(verboseSEXP); rcpp_result_gen = Rcpp::wrap(levenshtein_search(vec, patterns, max_error, verbose)); return rcpp_result_gen; END_RCPP } static const R_CallMethodDef CallEntries[] = { {"_tcR_exact_search", (DL_FUNC) &_tcR_exact_search, 4}, {"_tcR_exact_search_list", (DL_FUNC) &_tcR_exact_search_list, 4}, {"_tcR_hamming_search", (DL_FUNC) &_tcR_hamming_search, 4}, {"_tcR_levenshtein_search", (DL_FUNC) &_tcR_levenshtein_search, 4}, {NULL, NULL, 0} }; RcppExport void R_init_tcR(DllInfo *dll) { R_registerRoutines(dll, NULL, CallEntries, NULL, NULL); R_useDynamicSymbols(dll, FALSE); } tcR/vignettes/0000755000176200001440000000000013667551325013027 5ustar liggesuserstcR/vignettes/tcrvignette.Rmd0000644000176200001440000010676113667232050016033 0ustar liggesusers--- title: '

tcR: a package for T cell receptor and Immunoglobulin repertoires advanced data analysis

Vadim I. Nazarov

' author:

Laboratory of Comparative and Functional Genomics, IBCH RAS, Moscow, Russia

output: html_document: theme: spacelab toc: yes toc_depth: 4 pdf_document: toc: yes toc_depth: 4 word_document: default --- # IMPORTANT INFORMATION The tcR package WILL SOON BE ORPHANED AND REMOVED FROM CRAN. A new package is available that is designed to replace tcR: immunarch -- http://immunarch.com/ We will be happy to help you to move to the new package. Feel free to contact us: http://github.com/immunomind/immunarch Sincerely, immunarch dev team and Vadim I. Nazarov, lead developer of tcR ## Introduction The *tcR* package designed to help researchers in the immunology field to analyse T cell receptor (`TCR`) and immunoglobulin (`Ig`) repertoires. In this vignette, I will cover procedures for immune receptor repertoire analysis provided with the package. Terms: - Clonotype: a group of T / B cell clones with equal CDR3 nucleotide sequences and equal Variable genes. - Cloneset / repertoire: a set of clonotypes. Represented as a data frame in which each row corresponds to a unique clonotype. - UMI: Unique Molecular Identifier (see this [paper](http://www.nature.com/nmeth/journal/v9/n1/full/nmeth.1778.html) for details) ```{r eval=TRUE,echo=FALSE,warning=FALSE,message=FALSE} library(tcR) data(twa) data(twb) ``` ### Package features - Parsers for outputs of various tools for CDR3 extraction and genes alignment *(currently implemented parsers for MiTCR, MiGEC, VDJtools, ImmunoSEQ, IMSEQ and MiXCR)* - Data manipulation *(in-frame / out-of-frame sequences subsetting, clonotype motif search)* - Descriptive statistics *(number of reads, number of clonotypes, gene segment usage)* - Shared clonotypes statistics *(number of shared clonotypes, using V genes or not; sequential intersection among the most abundant clonotype ("top-cross"))* - Repertoire comparison *(Jaccard index, Morisita's overlap index, Horn's index, Tversky index, overlap coefficient)* - V- and J genes usage and it's analysis *(PCA, Shannon Entropy, Jensen-Shannon Divergence)* - Diversity evaluation *(ecological diversity index, Gini index, inverse Simpson index, rarefaction analysis)* - Artificial repertoire generation (beta chain only, for now) - Spectratyping - Various visualisation procedures - Mutation networks *(graphs, in which vertices represent CDR3 nucleotide / amino acid sequences and edges are connecting similar sequences with low hamming or edit distance between them)* ### Data in the package There are two datasets provided with the package - twins data and V(D)J recombination genes data. #### Downsampled twins data `twa.rda`, `twb.rda` - two lists with 4 data frames in each list. Every data frame is a sample downsampled to the 10000 most abundant clonotypes of twins data (alpha and beta chains). Full data is available here: [Twins TCR data at Laboratory of Comparative and Functional Genomics](http://labcfg.ibch.ru/tcr.html) Explore the data: ```{r eval=FALSE,echo=TRUE} # Load the package and load the data. library(tcR) data(twa) # "twa" - list of length 4 data(twb) # "twb" - list of length 4 # Explore the data. head(twa[[1]]) head(twb[[1]]) ``` #### Gene alphabets Gene alphabets - character vectors with names of genes for TCR and Ig. ```{r eval=FALSE,echo=TRUE} # Run help to see available alphabets. ?genealphabets ?genesegments data(genesegments) ``` ### Quick start / automatic report generation For the exploratory analysis of a single repertoire, use the RMarkdown report file at `"/inst/library.report.Rmd"` Analysis in the file include statistics and visualisation of number of clones, clonotypes, in- and out-of-frame sequences, unique amino acid CDR3 sequences, V- and J-usage, most frequent k-mers, rarefaction analysis. For the analysis of a group of repertoires ("cross-analysis"), use the RMarkdown report file at: `"/inst/crossanalysis.report.Rmd}"` Analysis in this file include statistics and visualisation of number of shared clones and clonotypes, V-usage for individuals and groups, J-usage for individuals, Jensen-Shannon divergence among V-usages of repertoires and top-cross. You need the *knitr* package installed in order to generate reports from default pipelines. In RStudio you can run a pipeline file as follows: `Run RStudio -> load the pipeline .Rmd files -> press the knitr button` ### Input parsing Currently in *tcR* there are implemented parser for the next software: - MiTCR - `parse.mitcr`; - MiTCR w/ UMIs - `parse.mitcrbc`; - MiGEC - `parse.migec`; - VDJtools - `parse.vdjtools`; - ImmunoSEQ - `parse.immunoseq`; - MiXCR - `parse.mixcr`; - IMSEQ - `parse.imseq`. Also a general parser `parse.cloneset` for a text table files is implemented. General wrapper for parsers is `parse.file`. User can also parse a list of files or the entire folder. Run `?parse.folder` to see a help on parsing input files and a list of functions for parsing a specific input format. ```{r eval=FALSE,echo=TRUE} # Parse file in "~/mitcr/immdata1.txt" as a MiTCR file. immdata1 <- parse.file("~/mitcr_data/immdata1.txt", 'mitcr') # equivalent to immdata1.eq <- parse.mitcr("~/mitcr_data/immdata1.txt") # Parse folder with MiGEC files. immdata <- parse.folder("~/migec_data/", 'migec') ``` ### Cloneset representation Clonesets represented in *tcR* as data frames with each row corresponding to the one nucleotide clonotype and with specific column names: - *Umi.count* - number of UMIs; - *Umi.proportion* - proportion of UMIs; - *Read.count* - number of reads; - *Read.proportion* - proportion of reads; - *CDR3.nucleotide.sequence* - CDR3 nucleotide sequence; - *CDR3.amino.acid.sequence* - CDR3 amino acid sequence; - *V.gene* - names of aligned Variable genes; - *J.gene* - names of aligned Joining genes; - *D.gene* - names of aligned Diversity genes; - *V.end* - last positions of aligned V genes (1-based); - *J.start* - first positions of aligned J genes (1-based); - *D5.end* - positions of D'5 end of aligned D genes (1-based); - *D3.end* - positions of D'3 end of aligned D genes (1-based); - *VD.insertions* - number of inserted nucleotides (N-nucleotides) at V-D junction (-1 for receptors with VJ recombination); - *DJ.insertions* - number of inserted nucleotides (N-nucleotides) at D-J junction (-1 for receptors with VJ recombination); - *Total.insertions* - total number of inserted nucleotides (number of N-nucleotides at V-J junction for receptors with VJ recombination). Any data frame with this columns and of this class is suitable for processing with the package, hence user can generate their own table files and load them for the further analysis using `read.csv`, `read.table` and other `base` R functions. Please note that *tcR* internally expects all strings to be of class "character", not "factor". Therefore you should use R parsing functions with parameter *stringsAsFactors=FALSE*. ```{r eval=TRUE, echo=TRUE} # No D genes is available here hence "" at "D.genes" and "-1" at positions. str(twa[[1]]) str(twb[[1]]) ``` ## Repertoire descriptive statistics For the exploratory analysis *tcR* provides various functions for computing descriptive statistics. ### Cloneset summary To get a general view of a subject's repertoire (overall count of sequences, in- and out-of-frames numbers and proportions) use the `cloneset.stats` function. It returns a `summary` of counts of nucleotide and amino acid clonotypes, as well as summary of read counts: ```{r eval=TRUE,echo=TRUE} cloneset.stats(twb) ``` For characterisation of a library use the `repseq.stats` function: ```{r eval=TRUE,echo=TRUE} repseq.stats(twb) ``` ### Most abundant clonotypes statistics Function `clonal.proportion` is used to get the number of most abundant by the count of reads clonotypes. E.g., compute number of clonotypes which fill up (approx.) the 25% from total repertoire's "Read.count": ```{r eval=TRUE,echo=TRUE} # How many clonotypes fill up approximately clonal.proportion(twb, 25) # the 25% of the sum of values in 'Read.count'? ``` To get a proportion of the most abundant clonotypes' sum of reads to the overall number of reads in a repertoire, use `top.proportion`, i.e. get ($\sum$ reads of top clonotypes)$/$($\sum$ reads for all clonotypes). E.g., get a proportion of the top-10 clonotypes' reads to the overall number of reads: ```{r echo=TRUE, eval=TRUE, fig=TRUE, fig.height=4, fig.width=5.5, message=FALSE, fig.align='center'} # What accounts a proportion of the top-10 clonotypes' reads top.proportion(twb, 10) # to the overall number of reads? vis.top.proportions(twb) # Plot this proportions. ``` Function `tailbound.proportion` with two arguments *.col* and *.bound* gets subset of the given data frame with clonotypes which have column *.col* with value $\leq$ *.bound* and computes the ratio of sums of count reads of such subset to the overall data frame. E.g., get proportion of sum of reads of sequences which has "Read.count" <= 100 to the overall number of reads: ```{r eval=TRUE,echo=TRUE} # What is a proportion of sequences which # have 'Read.count' <= 100 to the tailbound.proportion(twb, 100) # overall number of reads? ``` ### Clonal space homeostasis Clonal space homeostasis is a useful statistics of how many space occupied by clonotypes with specific proportions. ```{r eval=TRUE, echo=TRUE, fig.height=4, fig.width=6.5, fig.align='center'} # data(twb) # Compute summary space of clones, that occupy # [0, .05) and [.05, 1] proportion. clonal.space.homeostasis(twb, c(Low = .05, High = 1)) # Use default arguments: clonal.space.homeostasis(twb[[1]]) twb.space <- clonal.space.homeostasis(twb) vis.clonal.space(twb.space) ``` ### In-frame and out-of-frame sequences Functions for performing subsetting and counting number of in-frame and out-of-frame clonotypes are: `count.inframes`, `count.outframes`, `get.inframes`, `get.outframes`. Parameter *.head* for this functions is a parameter to the *.head* function, that applied to the input data frame or an input list of data frames before subsetting. Functions accept both data frames and list of data frames as parameters. E.g., get data frame with only in-frame sequences and count out-of-frame sequences in the first 5000 rows for this data frame: ```{r eval=TRUE,echo=TRUE} imm.in <- get.inframes(twb) # Return all in-frame sequences from the 'twb'. # Count the number of out-of-frame sequences count.outframes(twb, 5000) # from the first 5000 sequences. ``` General functions with parameter stands for 'all' (all sequences), 'in' (only in-frame sequences) or 'out' (only out-of-frame sequences) are *get.frames* and *count.frames*: ```{r eval=TRUE,echo=TRUE} imm.in <- get.frames(twb, 'in') # Similar to 'get.inframes(twb)'. count.frames(twb[[1]], 'all') # Just return number of rows. flag <- 'out' count.frames(twb, flag, 5000) # Similar to 'count.outframes(twb, 5000)'. ``` ### Search for a target CDR3 sequences For exact or fuzzy search of sequences the package employed a function `find.clonotypes`. Input arguments for this function are a data frame or a list of data frames, targets (a character vector or data frame having one column with sequences and additional columns with, e.g., V genes), a value of which column or columns to return, a method to be used to compare sequences among each other (either "exact" for exact matching, "hamm" for matching sequences by Hamming distance (two sequences are matched if H $\leq$ 1) or "lev" for matching sequences by Levenshtein distance (two sequences are matched if L $\leq$ 1)), and column name from which sequences for matching are obtained. Sounds very complex, but in practice it's very easy, therefore let's go to examples. Suppose we want to search for some CDR3 sequences in a number of repertoires: ```{r eval=TRUE,echo=TRUE} cmv <- data.frame(CDR3.amino.acid.sequence = c('CASSSANYGYTF', 'CSVGRAQNEQFF', 'CASSLTGNTEAFF', 'CASSALGGAGTGELFF', 'CASSLIGVSSYNEQFF'), V.genes = c('TRBV4-1', 'TRBV4-1', 'TRBV4-1', 'TRBV4-1', 'TRBV4-1'), stringsAsFactors = F) cmv ``` We will search for them using all methods of matching (exact, hamming or levenshtein) and with and without matching by V-segment. Also, for the first case (exact matching and without V gene) we return "Total.insertions" column along with the "Read.count" column, and for the second case output will be a "Rank" - rank (generated by `set.rank`) of a clone or a clonotype in a data frame. ```{r eval=TRUE,echo=TRUE} twb <- set.rank(twb) # Case 1. cmv.imm.ex <- find.clonotypes(.data = twb[1:2], .targets = cmv[,1], .method = 'exact', .col.name = c('Read.count', 'Total.insertions'), .verbose = F) head(cmv.imm.ex) # Case 2. # Search for CDR3 sequences with hamming distance <= 1 # to the one of the cmv$CDR3.amino.acid.sequence with # matching V genes. Return ranks of found sequences. cmv.imm.hamm.v <- find.clonotypes(twb[1:3], cmv, 'hamm', 'Rank', .target.col = c('CDR3.amino.acid.sequence', 'V.gene'), .verbose = F) head(cmv.imm.hamm.v) # Case 3. # Similar to the previous example, except # using levenshtein distance and the "Read.count" column. cmv.imm.lev.v <- find.clonotypes(twb[1:3], cmv, 'lev', .target.col = c('CDR3.amino.acid.sequence', 'V.gene'), .verbose = F) head(cmv.imm.lev.v) ``` ## Gene usage Variable and Joining gene usage (V-usage and J-usage) are important characteristics of repertoires. To access and compare them among repertoires *tcR* provides a few useful functions. ### Gene usage computing To access V- and J-usage of a repertoire *tcR* provides functions `geneUsage`. Function `geneUsage`, depending on parameters, computes frequencies or counts of the given elements (e.g., V genes) of the input data frame or the input list of data frames. V and J gene names for humans for TCR and Ig are stored in the .rda file `genesegments.rda` (they are identical to those form IMGT: \href{http://www.imgt.org/IMGTrepertoire/index.php?section=LocusGenes&repertoire=nomenclatures&species=human&group=TRBV}{link to beta genes (red ones)} and \href{http://www.imgt.org/IMGTrepertoire/index.php?section=LocusGenes&repertoire=nomenclatures&species=human&group=TRAV}{link to alpha genes (red ones)}). All of the mentioned functions are accept data frames as well as list of data frames. Output for those functions are data frames with the first column stands for a gene and the other for frequencies. ```{r eval=TRUE,echo=TRUE} imm1.vs <- geneUsage(twb[[1]], HUMAN_TRBV) head(imm1.vs) imm.vs.all <- geneUsage(twb, HUMAN_TRBV) imm.vs.all[1:10, 1:4] ``` You can also directly visualise gene usage with the function `vis.gene.usage` (if you pass the gene alphabet as a second argument): ```{r eval=TRUE, echo=TRUE, message=FALSE, fig.align='center', fig.height=5, fig.width=7} # Put ".dodge = F" to get distinct plot for every data frame in the given list. vis.gene.usage(twb, HUMAN_TRBJ, .main = 'twb J-usage dodge', .dodge = T) ``` ```{r eval=TRUE, echo=TRUE, message=FALSE, fig.align='center', fig.height=6, fig.width=9} vis.gene.usage(twb, HUMAN_TRBJ, .main = 'twb J-usage column', .dodge = F, .ncol = 2) ``` ```{r eval=TRUE, echo=TRUE, message=FALSE, fig.align='center', fig.height=5, fig.width=7} vis.gene.usage(imm1.vs, NA, .main = 'twb[[1]] V-usage', .coord.flip = F) ``` ### Gene usage comparing To evaluate V- and J genes usage of repertoires, the package implements subroutines for two approaches to the analysis: measures from the information theory and PCA (Principal Component Analysis). #### Shannon entropy and Jensen-Shannon divergence To assess the diversity of genes usage user can use the `entropy` function. Kullback-Leibler assymetric measure (function `kl.div`) and Jensen-Shannon symmetric measure (functions `js.div` for computing JS-divergence between the given distributions and `js.div.seg` for computing JS-divergence between genes distributions of two clonesets or a list with data frames) are provided to estimate distance among gene usage of different repertoires. To visualise distances *tcR* employed the `vis.radarlike` function, see Section "Plots" for more detailed information. ```{r eval=T, echo=TRUE, fig.align='center'} # Transform "0:100" to distribution with Laplace correction entropy(0:100, .laplace = 1) # (i.e., add "1" to every value before transformation). entropy.seg(twb, HUMAN_TRBV) # Compute entropy of V-segment usage for each data frame. js.div.seg(twb[1:2], HUMAN_TRBV, .verbose = F) imm.js <- js.div.seg(twb, HUMAN_TRBV, .verbose = F) vis.radarlike(imm.js, .ncol = 2) ``` #### Principal Component Analysis (PCA) Principal component analysis (PCA) is a statistical procedure for transforming a set of observations to a set of special values for analysis. In *tcR* implemented functions `pca.segments` for performing PCA on V- or J-usage, and `pca.segments.2D` for performing PCA on VJ-usage. For plotting the PCA results see the `vis.pca` function. ```{r eval=TRUE, echo=TRUE, fig.align='center', fig.height=4.5, fig.width=6} pca.segments(twb, .genes = HUMAN_TRBV) # Plot PCA results of V-segment usage. # Return object of class "prcomp" class(pca.segments(twb, .do.plot = F, .genes = HUMAN_TRBV)) ``` ## Repertoire overlap analysis *tcR* provides a number of functions for evaluating similarity of clonesets based on shared among clonesets clonotypes and working with data frames with shared clonotypes. ### Overlap quantification The general interface to all functions for computing cloneset overlap coefficients is the `repOverlap` function. #### Number of shared clonotypes The most straightforward yet a quite effective way to evaluate similarity of two clonesets is compute the number of shared clonotypes. *tcR* adds the new function `intersectClonesets` (`repOverlap(your_data, 'exact')`) which is by default computes the number of shared clonotypes using the "CDR3.nucleotide.sequence" columns of the given data frames, but user can change target columns by using arguments *.type* or *.col*. As in the `find.clonotypes`, user can choose which method apply to the elements: exact match of elements, match by Hamming distance or match by Levenshtein distance. Logical argument *.norm* is used to perform normalisation of the number of shared clonotypes by dividing this number by multiplication of clonesets' sizes (**strongly** recommended otherwise your results will be correlating with clonesets' sizes). ```{r eval=TRUE, echo=T, fig.align='center', warning=FALSE} # Equivalent to intersect(twb[[1]]$CDR3.nucleotide.sequence, # twb[[2]]$CDR3.nucleotide.sequence) repOverlap(twb[1:2], 'exact', 'nuc', .verbose = F) # Equivalent to intersectClonesets(twb, "n0e", .norm = T) repOverlap(twb, 'exact', 'nuc', .norm = T, .verbose = F) # Intersect by amino acid clonotypes + V genes repOverlap(twb, 'exact', 'aa', .vgene = T, .verbose = F) # Plot a heatmap of the number of shared clonotypes. vis.heatmap(repOverlap(twb, 'exact', 'aa', .vgene = T, .verbose = F), .title = 'twb - (ave)-intersection', .labs = '') ``` See the `vis.heatmap` function in the Section "Visualisation" for the visualisation of the intersection results. Functions `intersectCount`, `intersectLogic` and `intersectIndices` are more flexible in terms of choosing which columns to match. They all have parameter *.col* that specifies names of columns which will used in computing intersection. Function `intersectCount` returns number of similar elements; `intersectIndices(x, y)` returns 2-column matrix with the first column stands for an index of an element in the given *x*, and the second column stands for an index of that element of *y* which is similar to a relative element in *x*; `intersectLogic(x, y)` returns a logical vector of *length(x)* or *nrow(x)*, where TRUE at position *i* means that element with index {i} has been found in the *y*. ```{r eval=TRUE, echo=TRUE} # Get logic vector of shared elements, where # elements are tuples of CDR3 nucleotide sequence and corresponding V-segment imm.1.2 <- intersectLogic(twb[[1]], twb[[2]], .col = c('CDR3.amino.acid.sequence', 'V.gene')) # Get elements which are in both twb[[1]] and twb[[2]]. head(twb[[1]][imm.1.2, c('CDR3.amino.acid.sequence', 'V.gene')]) ``` #### "Top cross" Number of shared clonotypes among the most abundant clonotypes may differ signigicantly from those with lesses count. To support research *tcR* offers the `top.cross` function, that apply `tcR::intersectClonesets`, e.g., to the first 1000 clonotypes, 2000, 3000 and so on up to the first 100000 clones, if supplied `.n == seq(1000, 100000, 1000)`. ```{r eval=TRUE, echo=T, fig.align='center', fig.height=6.5, fig.width=10, warning=FALSE} twb.top <- top.cross(.data = twb, .n = seq(500, 10000, 500), .verbose = F, .norm = T) top.cross.plot(twb.top) ``` #### More complex similarity measures *tcR* also provides more complex similarity measures for evaluating the similarity of sets. - Tversky index (`repOverlap(your_data, 'tversky')` for clonesets or `tversky.index` for vectors) is an asymmetric similarity measure on sets that compares a variant to a prototype. If using default arguments, it's similar to Dice's coefficient. - Overlap coefficient (`repOverlap(your_data, 'overlap')` for clonesets or `overlap.coef` for vectors) is a similarity measure that measures the overlap between two sets, and is defined as the size of the intersection divided by the smaller of the size of the two sets. - Jaccard index (`repOverlap(your_data, 'jaccard')` for clonesets or `jaccard.index` for vectors) is a statistic used for comparing the similarity and diversity of sample sets. - Morisita's overlap index (`repOverlap(your_data, 'morisita')` for clonesets or `morisitas.index` for other data) is a statistical measure of dispersion of individuals in a population and is used to compare overlap among samples. The formula is based on the assumption that increasing the size of the samples will increase the diversity because it will include different habitats (i.e. different faunas) (Morisita, 1959). To visualise similarity among repertoires the `vis.heatmap` function is appropriate. ```{r eval=TRUE, echo=TRUE, results='hold'} # Apply the Morisitas overlap index to the each pair of repertoires. # Use information about V genes (i.e. one CDR3 clonotype is equal to another # if and only if their CDR3 aa sequences are equal and their V genes are equal) repOverlap(twb, 'morisita', 'aa', 'read.count', .vgene = T, .verbose = F) ``` ### Overlap statistics and tests #### Overlap Z-score (OZ-score) - a measure for ???abnormality??? in overlaps `ozScore` #### Monte Carlo permutation test for pairwise and one-vs-all-wise within- and inter-group differences in a set of repertoires `permutDistTest` `pca2euclid` ### Shared repertoire To investigate a shared among a several repertoires clonotypes ("shared repertoire") the package provided the `shared.repertoire` function along with functions for computing the shared repertoire statistics. The `shared.representation` function computes the number of shared clonotypes for each repertoire for each degree of sharing (i.e., number of people, in which indicated amount of clones have been found). The function `shared.summary` is equivalent to `repOverlap(, 'exact')` but applies to the shared repertoire data frame. Measuring distances among repertoires using the cosine similarity on vector of counts of shared sequences is also possible with the `cosine.sharing` function. ```{r eval=TRUE, echo=TRUE} # Compute shared repertoire of amino acid CDR3 sequences and V genes # which has been found in two or more people and return the Read.count column # of such clonotypes from each data frame in the input list. imm.shared <- shared.repertoire(.data = twb, .type = 'avrc', .min.ppl = 2, .verbose = F) head(imm.shared) shared.representation(imm.shared) # Number of shared sequences. ``` ## Diversity evaluation For assessing the distribution of clonotypes in the given repertoire, *tcR* provides functions for evaluating the diversity (functions `diversity` and `inverse.simpson`) and the skewness of the clonal distribution (functions `gini` and `gini.simpson`), and a general interface to all of this functions `repDiversity`, which user should use to estimate the diversity of clonesets. Function `diversity` (`repDiversity(your_clonesets, "div")`) computes the ecological diversity index (with parameter `.q` for penalties for clones with large count). Function `inverse.simpson` (`repDiversity(your_clonesets, "inv.simp")`) computes the Inverse Simpson Index (i.e., inverse probability of choosing two similar clonotypes). Function `gini` (`repDiversity(your_clonesets, "gini")`) computes the economical Gini index of clonal distribution. Function `gini.simpson` (`repDiversity(your_clonesets, "gini.simp")`) computes the Gini-Simpson index. Function `chao1` (`repDiversity(your_clonesets, "chao1")`) computes the Chao1 index, its SD and two 95 perc CI. Function `repDiversity` accepts single clonesets as well as a list of clonesets. Parameter `.quant` specifies which column to use for computing the diversity (print `?repDiversity` to see more information about input arguments). ```{r eval=TRUE, echo=TRUE, results='hold'} # Evaluate the diversity of clones by the ecological diversity index. repDiversity(twb, 'div', 'read.count') sapply(twb, function (x) diversity(x$Read.count)) ``` ```{r eval=TRUE, echo=TRUE, results='hold'} # Compute the diversity as the inverse probability of choosing two similar clonotypes. repDiversity(twb, 'inv.simp', 'read.prop') sapply(twb, function (x) inverse.simpson(x$Read.proportion)) ``` ```{r eval=TRUE, echo=TRUE, results='hold'} # Evaluate the skewness of clonal distribution. repDiversity(twb, 'gini.simp', 'read.prop') sapply(twb, function (x) gini.simpson(x$Read.proportion)) ``` ```{r eval=TRUE, echo=TRUE, results='hold'} # Compute diversity of repertoire using Chao index. repDiversity(twb, 'chao1', 'read.count') sapply(twb, function (x) chao1(x$Read.count)) ``` ## Visualisation ### CDR3 length and read count distributions plot Plots of the distribution of CDR3 nucleotide sequences length (function `vis.count.len`) and the histogram of counts (function `vis.number.count`). Input data is either a data frame or a list with data frames. Argument *.col* specifies column's name with clonotype counts. Argument *.ncol* specifies a number of columns in a plot with multiple distribution, i.e., if the input data is a list with data frames. ```{r eval=TRUE, echo=TRUE, fig.height=4, fig.width=5.5, fig.align='center'} vis.count.len(twb[[1]], .name = "twb[[1]] CDR3 lengths", .col = "Read.count") ``` ```{r eval=TRUE, echo=TRUE, fig.height=4, fig.width=5.5, fig.align='center', warning=FALSE, message=FALSE} # I comment this to avoid a strange bug in ggplot2. Will uncomment later. # vis.number.count(twb[[1]], .name = "twb[[1]] count distribution") ``` ### Top proportions bar plot For the visualisation of proportions of the most abundant clonotypes in a repertoire *tcR* offers the `vis.top.proportions` function. As input the function receives either data frame or a list with data frames (argument *.data*), an integer vector with number of clonotypes for computing proportions of count for this clonotypes (argument *.head*), and a column's name with clonotype counts (argument *.col*). ```{r echo=TRUE, eval=TRUE, fig.height=4, fig.width=5.5, message=FALSE, fig.align='center'} vis.top.proportions(twb, c(10, 500, 3000, 10000), .col = "Read.count") ``` ### Clonal space homeostasis bar plot For the visualisation of how much space occupied each group of clonotypes, divided into groups by their proportions in the data, use the `vis.clonal.space` function. As an input it receives the output of the `clonal.space.homeostasis` function. ```{r eval=TRUE, echo=TRUE, fig.height=4, fig.width=6.5, fig.align='center'} twb.space <- clonal.space.homeostasis(twb) vis.clonal.space(twb.space) ``` ### Heat map Pairwise distances or similarity of repertoires can be represented as qudratic matrices, in which each row and column represented a cloneset, and each value in every cell (i, j) is a distance between repertoires with indices i and j. One way to visalise such matrices is using "heatmaps". For plotting heatmaps in *tcR* implemented the `vis.heatmap` function. With changing input arguments user can change names of labs, title and legend. ```{r eval=TRUE, echo=TRUE, fig.align='center', warning=FALSE, message=FALSE} twb.shared <- repOverlap(twb, "exact", .norm = F, .verbose = F) vis.heatmap(twb.shared, .title = "Twins shared nuc clonotypes", .labs = c("Sample in x", "Sample in y"), .legend = "# clonotypes") ``` ### Radar-like plot Another way to repsent distances among objects is "radar-like" plots (because this plots is not exactly radar plots) realised in *tcR* throught the `vis.radarlike` function. Argument *.ncol* specifies a number of columns of radar-like plots in a viewport. ```{r eval=T, echo=TRUE, fig.align='center'} twb.js <- js.div.seg(twb, HUMAN_TRBV, .verbose = F) vis.radarlike(twb.js, .ncol = 2) ``` ### Gene usage histogram For the visualisation of gene usage *tcR* employes subroutines for making classical histograms using the `vis.gene.usage` function. The function accept clonesets, lists of clonesets or output from the `geneUsage` function. If input is a cloneset(s), then user should specify a gene alphabet (e.g., `HUMAN_TRBV`) in order to compute the gene usage. Using a parameter \code{.dodge}, user can change type of the output between an output as histograms for each cloneset in the input list (`.dodge = F`) or an output as an one histogram for all data, which is very useful for comparing distribution of genes (`.dodge = T`). If `.dodge=F` and input are lists of clonesets or a gene usage of a few clonesets, than user with argument `.ncol` can specify how many columns of histograms will be outputted. With `.coord.flip` user can flip coordinates so genes will be at the left side of the plot. ```{r eval=TRUE, echo=TRUE, message=FALSE, fig.align='center', fig.height=5, fig.width=7} vis.gene.usage(twb[[1]], HUMAN_TRBV, .main = 'Sample I V-usage') ``` ```{r eval=TRUE, echo=TRUE, message=FALSE, fig.align='center', fig.height=7, fig.width=5} vis.gene.usage(twb[[2]], HUMAN_TRBV, .main = 'Sample II V-usage', .coord.flip = T) ``` ```{r eval=TRUE, echo=TRUE, message=FALSE, fig.align='center', fig.height=5, fig.width=7} twb.jusage <- geneUsage(twb, HUMAN_TRBJ) vis.gene.usage(twb.jusage, .main = 'Twins J-usage', .dodge = T) ``` ```{r eval=TRUE, echo=TRUE, message=FALSE, fig.align='center', fig.height=6, fig.width=9} vis.gene.usage(twb, HUMAN_TRBJ, .main = 'Twins J-usage', .dodge = F, .ncol = 2) ``` ### PCA visualisation For the visualisation of results from the `prcomp` function (i.e., objects of class `prcomp`), *tcR* provides the `vis.pca` function. Input arguments for the function are an object of class `prcomp` and a (if needed) list with groups (vectors of indices of samples) for colouring points in the plot. ```{r eval=TRUE, echo=TRUE, fig.align='center', fig.height=4.5, fig.width=6} twb.pca <- pca.segments(twb, .do.plot = F) vis.pca(pca.segments(twb, .do.plot = F, .genes = HUMAN_TRBV), .groups = list(GroupA = c(1,2), GroupB = c(3,4))) ``` ### Logo-like plot Logo-like graphs for visualisation of nucleotide or amino acid motif sequences / profiles. ```{r eval=TRUE, echo=TRUE, fig.align='center', fig.width=6, fig.height=5.5, warning=FALSE, message=FALSE} km <- get.kmers(twb[[1]]$CDR3.amino.acid.sequence, .head = 100, .k = 7, .verbose = F) d <- kmer.profile(km) vis.logo(d) ``` ## Mutation networks Mutation network (or a mutation graph) is a graph with vertices representing nucleotide or in-frame amino acid sequences (out-of-frame amino acid sequences will be automatically filtered out by *tcR* functions for mutation network creating) and edges which connecting pairs of sequences with hamming distance (parameter *.method* = 'hamm') or edit distance (parameter *.method* = 'lev') between them no more than specified in the *.max.errors* function parameter of the `mutation.network` function. To create a mutation network first what you need is to make a shared repertoires and then apply the `mutation.network` function to this shared repertoire: ```{r eval=TRUE, echo=TRUE} # data(twb) twb.shared <- shared.repertoire(twb, .head = 1000, .verbose = F) G <- mutation.network(twb.shared) G ``` To manipulate vertex attributes functions \code{set.group.vector} and \code{get.group.names} are provided. ```{r eval=TRUE, echo=TRUE} # data(twb) # twb.shared <- shared.repertoire(twb, .head = 1000) # G <- mutation.network(twb.shared) G <- set.group.vector(G, "twins", list(A = c(1,2), B = c(3,4))) # <= refactor this get.group.names(G, "twins", 1) get.group.names(G, "twins", 300) get.group.names(G, "twins", c(1,2,3), F) get.group.names(G, "twins", 300, F) # Because we have only two groups, we can assign more readable attribute. V(G)$twin.names <- get.group.names(G, "twins") V(G)$twin.names[1] V(G)$twin.names[300] ``` To access neighbour vertices of vertices ("ego-network") use the \code{mutation.neighbours} function: ```{r eval=TRUE, echo=TRUE} # data(twb) # twb.shared <- shared.repertoire(twb, .head = 1000) # G <- mutation.network(twb.shared) head(mutated.neighbours(G, 1)[[1]]) ``` ## Conclusion Feel free to contact me for the package-related or immunoinformatics research-related questions. ## Appendix A: Kmers manipulation and processing In the package implemented functions for working with k-mers. Function `get.kmers` generates k-mers from the given chatacter vector or a data frame with columns for sequences and a count for each sequence. ```{r eval=TRUE, echo=TRUE} head(get.kmers(twb[[1]]$CDR3.amino.acid.sequence, 100, .meat = F, .verbose = F)) head(get.kmers(twb[[1]], .meat = T, .verbose = F)) ``` ## Appendix B: Nucleotide and amino acid sequences manipulation The package also provides a several number of functions for performing classic bioinformatics tasks on strings. For more powerful subroutines see the Bioconductor's *Biostrings* package. ### Nucleotide sequence manipulation Functions for basic nucleotide sequences manipulations: reverse-complement, translation and GC-content computation. All functions are vectorised. ```{r eval=TRUE, echo=TRUE} revcomp(c('AAATTT', 'ACGTTTGGA')) cbind(bunch.translate(twb[[1]]$CDR3.nucleotide.sequence[1:10]), twb[[1]]$CDR3.amino.acid.sequence[1:10]) gc.content(twb[[1]]$CDR3.nucleotide.sequence[1:10]) ``` ### Reverse translation subroutines Function `codon.variants` returns a list of vectors of nucleotide codons for each letter for each input amino acid sequence. Function `translated.nucl.sequences` returns the number of nucleotide sequences, which, when translated, will result in the given amino acid sequence(s). Function `reverse.translation` return all nucleotide sequences, which is translated to the given amino acid sequences. Optional argument `.nucseq` for each of this function provides restriction for nucleotides, which cannot be changed. All functions are vectorised. ```{r eval=TRUE, echo=TRUE} codon.variants('LQ') translated.nucl.sequences(c('LQ', 'CASSLQ')) reverse.translation('LQ') translated.nucl.sequences('LQ', 'XXXXXG') codon.variants('LQ', 'XXXXXG') reverse.translation('LQ', 'XXXXXG') ``` tcR/NEWS0000644000176200001440000000001313667026401011500 0ustar liggesusersVERSION 1.3tcR/R/0000755000176200001440000000000013667551225011217 5ustar liggesuserstcR/R/kmers.R0000644000176200001440000003314413667033467012473 0ustar liggesusers########## Statistics and analysis of k-mers usage ########## #' Get kmers from sequences. #' #' @aliases get.kmers #' #' @description #' Get vector of kmers from the given character vector or data frame. #' #' @param .data Either character vector or a data.frame. #' @param .head Parameter for head function applied to the given data before kmer generation. #' @param .k Size of the kmer. #' @param .clean if T then remove sequences which contain '~' or '*' symbols. Useful for deleting out-of-frame aminoacid sequnces. #' @param .meat if TRUE than .data must be data.frame with columns CDR3.amino.acid.sequence and Read.count. #' @param .verbose if T then print progress. #' @param .left.shift Cut all \code{.left.shift} symbols from the left side for each sequence. #' @param .right.shift Cut all \code{.right.shift} symbols from the right side for each sequence. #' #' @return Data.frame with 2 columns Kmers and Count / Rank / Proportion relatively to the .value param #' or a list with such data.frames if .data is a list. get.kmers <- function (.data, .head = -1, .k = 5, .clean = T, .meat = F, .verbose = T, .left.shift = 0, .right.shift = 0) { if (class(.data) == 'list') { ngrams <- lapply(.data, get.kmers, .head = .head, .k = .k, .clean = .clean, .meat = .meat, .left.shift = .left.shift, .right.shift = .right.shift, .verbose = .verbose) res <- ngrams[[1]] if (.verbose) cat('Merging all data.frames together...\n') for (i in 2:length(.data)) { cat(i, '/', length(.data), '\n') res <- merge(res, ngrams[[i]], by = 'Kmers', all = T) names(res) <- c('Kmers', names(.data)[1:i]) } if (.verbose) cat('Done.\n') res[is.na(res)] <- 0 return(res) } .n <- .k if (.head == -1) { .head <- dim(.data)[1] if (is.null(.head)) { .head <- length(.data) } } .data <- head(.data, .head) read.count <- rep.int(1, .head) if (.meat) { read.count <- .data$Read.count } if (class(.data) == 'data.frame') { .data <- .data$CDR3.amino.acid.sequence } if (.clean) { if (.verbose) cat('Cleaning bad sequences...\t') .data <- .data[grep('[*, ~]', .data, invert = T)] if (.verbose) cat('Sequences after cleaning:', length(.data),'\n') } if (.verbose) cat('Calculating space...\n') .data <- substr(.data, 1 + .left.shift, nchar(.data) - .right.shift) non.nchar <- nchar(.data) >= .n .data <- .data[non.nchar] read.count <- read.count[non.nchar] space <- sum(nchar(.data) -.n + 1) if (.verbose) cat('Number of k-mers:', space,'\n') if (space > 0) { if (.verbose) { cat('Generating k-mers...\n') pb <- set.pb(space) } res <- rep(x='', times=space) meat <- rep(1, times = space) j <- 1 for (i in 1:length(.data)) { ngrams <- sapply(1:(nchar(.data[i]) - .n + 1), function(j) substr(.data[i], j, j + .n - 1), USE.NAMES=F) kmer.meat <- read.count[i] for (ngram in ngrams) { res[j] <- ngram meat[j] <- kmer.meat j <- j + 1 if (.verbose) add.pb(pb) } } if (.verbose) close(pb) meat <- meat[order(res)] res <- sort(res) dup <- duplicated(res) res.unique <- res[!dup] res.dup <- res[dup] # res now is a vector for storing number of strings, i.e. res[i] == # of res.unique[i] res <- meat[!dup] meat <- meat[dup] # res <- rep.int(x=1, times=length(res.unique)) j <- 1 if (.verbose) cat('Unique k-mers:', length(res.unique), '\n') if (.verbose) cat('Merging k-mers...\n') for (i in 1:length(res.unique)) { while (res.dup[j] == res.unique[i] && j <= length(res.dup)) { # res[i] <- res[i] + 1 res[i] <- res[i] + meat[j] j <- j + 1 } } if (.verbose) cat('Done.\n') res <- data.frame(Kmers = res.unique, Count = res, stringsAsFactors=F) res <- res[order(res$Count, decreasing = T),] row.names(res) <- NULL res } else { data.frame(Kmers = NA, Count = NA) } } #' Make and manage the table of the most frequent k-mers. #' #' @aliases kmer.table get.kmer.column #' #' @description #' \code{kmer.table} - generate table with the most frequent k-mers. #' #' \code{get.kmer.column} - get vector of k-mers from the k-mer table from the function \code{kmer.table} #' #' @usage #' kmer.table(.data, .heads = c(10, 100, 300, 1000, 3000, 10000, 30000), .k = 5, .nrow = 20, #' .clean = T, .meat = F) #' #' get.kmer.column(.kmer.table.list, .head) #' #' @param .data tcR data.frame or a list with tcR data.frames. #' @param .heads Vector of parameter for the \code{head()} function, supplied sequentialy to the \code{get.kmers()} function. -1 means all rows. #' @param .k Size of the kmer. #' @param .nrow How many most frequent k-mers include to the output table. #' @param .clean Parameter for the \code{get.kmers()} function. #' @param .meat Parameter for the \code{get.kmers()} function. #' @param .kmer.table.list Result from the \code{kmer.table} function if \code{.data} supplied as a list. #' @param .head Which columns with this head return. #' #' @return #' \code{kmer.table} - if \code{.data} is a data frame, than data frame with columns like "Kmers.X", "Count.X" where X - element from \code{.heads}. #' If \code{.data} is a list, than list of such data frames. #' #' \code{get.kmer.column} - data frame with first column with kmers and other columns named as a names of data frames, from which \code{.kmer.table.list} #' was generated. #' #' @examples #' \dontrun{ #' twb.kmers <- kmer.table(twb, .heads = c(5000, 10000), .meat = T) #' head(get.kmer.column(twb.kmers, 10000)) #' } kmer.table <- function (.data, .heads = c(10, 100, 300, 1000, 3000, 10000, 30000), .k = 5, .nrow = 20, .clean=T, .meat = F) { if (class(.data) == 'list') { return(lapply(.data, kmer.table, .k = .k, .heads = .heads, .nrow = .nrow, .clean = .clean, .meat = .meat)) } res <- do.call(cbind, lapply(.heads, function (h) { head(get.kmers(.data=.data, .k = .k, .head=h, .clean=.clean, .meat = .meat), .nrow) })) names(res) <- sapply(1:length(names(res)), function (i) { if (.heads[(1+i)%/%2] == -1) { paste0(names(res)[i], '.', 'all', collapse = '') } else { paste0(names(res)[i], '.', .heads[(1+i)%/%2], collapse = '') } }) res } get.kmer.column <- function (.kmer.table.list, .head) { name.col <- strsplit(colnames(.kmer.table.list[[1]])[2], '.', fixed=T, useBytes=T)[[1]][1] if (.head == -1) { table.names <- paste0(c('Kmers', name.col), '.', 'all') } else { table.names <- paste0(c('Kmers', name.col), '.', .head) } kmers <- unique(unlist(lapply(.kmer.table.list, function (x) {x[table.names[1]]}))) res <- sapply(.kmer.table.list, function (tab) { indices <- match(tab[[table.names[1]]], kmers) tmp <- rep.int(0, times=length(kmers)) tmp[indices] <- tab[[table.names[2]]] tmp }) df <- data.frame(kmers, res, stringsAsFactors=F) names(df) <- c(table.names[1], names(.kmer.table.list)) df <- df[order(df[, table.names[1]]),] row.names(df) <- NULL df } #' Generate k-mers. #' #' @aliases generate.kmers generate.kmers.prob #' #' @description #' Generate all k-mers. starting with the given sequence on the given alphabet #' Generate k-mers with the given k and probabilities of nucleotides next to each other (markov chain). #' #' @usage #' generate.kmers(.k, .seq = '', .alphabet = c('A', 'C', 'G', 'T')) #' #' generate.kmers.prob(.k, .probs, .count = 1, .alphabet = c('A', 'C', 'G', 'T'), #' .last.nucl = 'X') #' #' @param .k Size of k-mers or either integer or vector with k-s for generate.kmers.prob. #' @param .seq Prefix of all generated k-mers. #' @param .probs Matrix with probabilities for generating adjacent symbol with |alphabet| X |alphabet| size. Order of letters is #' given in the \code{.alphabet} parameter. #' @param .count Number of kmers to be generated. #' @param .alphabet Alphabet. #' @param .last.nucl Adjacent nucleotide from which start generation. If 'X' than choose one of the nucleotides with equal probabilities. #' #' @return Vector of all possible k-mers for \code{generate.kmers} #' or a vector of generated kmers for \code{generate.kmers.prob}. generate.kmers <- function (.k, .seq = '', .alphabet = c('A', 'C', 'G', 'T')) { kmers.list <- .seq for (k in 1:.k) { kmers.list <- unlist(lapply(kmers.list, function (kmer) { paste0(kmer, .alphabet) })) } kmers.list } generate.kmers.prob <- function (.k, .probs, .count = 1, .alphabet = c('A', 'C', 'G', 'T'), .last.nucl = 'X') { if (length(.k) == 1) { .k <- rep.int(.k, .count) } if (length(.last.nucl) == 1) { .last.nucl <- rep(.last.nucl, times=.count) } nucls <- rep('', times = length(.k)) k.more0 <- .k > 0 k.more1 <- .k > 1 nucls[k.more0] <- sapply(.last.nucl[k.more0], function (ln) { if (ln == 'X' || ln == '') { sample(x=.alphabet, size=1) } else { sample(x=.alphabet, size=1, prob=.probs[,match(ln, .alphabet)+1], replace = T) } }) nucls[k.more1] <- sapply(which(k.more1), function (i) { nucl <- rep(nucls[i], times = .k[i]) for (j in 2:.k[i]) { nucl[j] <- sample(x=.alphabet, size=1, prob=.probs[,match(nucl[j-1], .alphabet)+1]) } paste0(nucl, collapse='') } ) unlist(nucls) } #' Profile of sequences of equal length. #' #' @aliases kmers.profile #' #' @description #' Return profile for the given character vector or a data frame with sequences #' of equal length or list with them. #' #' @usage #' kmer.profile(.data, .names = rep('Noname', times=length(.data)), .verbose = F) #' #' @param .data Either list with elements of one of the allowed classes or object with one of the class: #' data.frame with first column with character sequences and second column with number of sequences or character vector. #' @param .names Names for each sequence / row in the \code{.data}. #' @param .verbose if T then print processing output. #' #' @return Return data frame with first column "Symbol" with all possible symbols in the given sequences #' and other columns with names "1", "2", ... for each position with percentage for each symbol. #' #' @seealso \link{vis.logo} kmer.profile <- function (.data, .names = rep('Noname', times=length(.data)), .verbose = F) { .get.nth.letter.stats <- function (.data, .n) { res <- summarise(grouped_df(data.frame(Letter = substr(.data[, 1], .n, .n), Count = .data[,2]), "Letter"), Sum.count = sum(Count)) res$Sum.count <- res$Sum.count / sum(res$Sum.count) names(res) <- c("Sequence", as.character(.n)) res } if (class(.data) == 'list') { res <- kmer.profile(.data[[1]], .verbose = .verbose) names(res) <- c('Var1', paste0(.names[[1]], c(1,2,3,4,5))) for (i in 2:length(.data)) { old.names <- names(res) res <- merge(res, kmer.profile(.data[[i]]), by = 'Var1', all = T) names(res) <- c(old.names, paste0(.names[[i]], c(1,2,3,4,5))) } return(res) } if (class(.data) == 'character') { .data <- data.frame(Sequence = .data, Read.count = 1, stringsAsFactors=F) } tmp <- .get.nth.letter.stats(.data, 1) aa.profiles <- tmp # aa.profiles <- as.data.frame(prop.table(table(substr(kmers[,1], i, i))), stringsAsFactors=F) for (i in 2:nchar(.data[1,1])) { if (.verbose) { cat(i, '/', nchar(.data[1,1]), '\n') } tmp <- .get.nth.letter.stats(.data, i) aa.profiles <- merge(aa.profiles, tmp, all=T, by = 'Sequence') # aa.profiles <- merge(aa.profiles, as.data.frame(prop.table(table(substr(kmers[,1], i, i))), stringsAsFactors=F), all=T, by = 'Var1') names(aa.profiles) <- c('Sequence', 1:i) } aa.profiles <- as.data.frame(aa.profiles) names(aa.profiles)[1] <- 'Symbol' aa.profiles[is.na(aa.profiles)] <- 0 aa.profiles <- aa.profiles[order(aa.profiles[,1]),] row.names(aa.profiles) <- aa.profiles[,1] aa.profiles } #' Gibbs Sampler. #' #' @aliases gibbs.sampler #' #' @description #' Perform the Gibbs Sampler method for finding frequent motifs in the given vector of strings or data.frame. #' Each string splitted to kmers with the given length of motif. #' #' @param .data Vector of characters or data.frame of characters (1st col) and their numbers (2nd col) if .meat == T. #' @param .k Motif's length. #' @param .niter Number of iterations. #' #' @return Vector of possible motifs. gibbs.sampler <- function (.data, .k = 5, .niter = 500) { .n <- .k .get.best.motif <- function (.seq, .profile) { nc <- nchar(.seq) res <- rep(x='aaaaa', times=nc - .n + 1) for (i in 1:(nc - .n + 1)) { res[i] <- substr(.seq, i, i + .n - 1) } max.p <- 0 max.kmer <- res[1] for (km in res) { p <- 1 for (i in 1:.n) { tmp <- .profile[match(substr(km, i, i), .profile[,1]),i+1] if (!is.na(tmp)) { p <- p * tmp } else { p <- 0 break } } if (p > max.p) { max.p <- p max.kmer <- km } } max.kmer } .score <- function (.kmers) { sc <- rep.int(0, .n) for (i in 1:.n) { tab <- table(substr(.kmers, i, i)) sc[i] <- sum(tab) - max(tab) } sum(sc) } .data <- .data[nchar(.data) >= .n] tmp <- trunc(runif(length(.data), 1, nchar(.data) - .n + 1 + 0.999 )) kmers <- substr(.data, tmp, tmp + .n - 1) best.kmers <- kmers cat('Performing gibbs sampling...\n') pb <- set.pb(.niter) for (i in 1:.niter) { unused.motif.index <- sample(1:length(kmers), 1) prof <- kmer.profile(kmers[-unused.motif.index]) kmers[unused.motif.index] <- .get.best.motif(.data[unused.motif.index], prof) if (.score(kmers) < .score(best.kmers)) { best.kmers <- kmers } if (i %% 500 == 0) { save(best.kmers, file = paste0('gibbs.', i, date(), '.rda')) } add.pb(pb) } close(pb) unique(best.kmers) }tcR/R/datatools.R0000644000176200001440000004432413667026401013334 0ustar liggesusers########## Support functions for managing the data ########## #' Fix alleles / genes by removing allele information / unnecessary colons. #' #' @aliases fix.alleles fix.genes #' #' @description #' Fix alleles / genes by removing allele information / unnecessary colons. #' #' @param .data tcR data frame. fix.alleles <- function (.data) { if (has.class(.data, "list")) { return(lapply(.data, fix.alleles)) } .data$V.gene <- gsub("[*][[:digit:]]*", "", .data$V.gene) .data$D.gene <- gsub("[*][[:digit:]]*", "", .data$D.gene) .data$J.gene <- gsub("[*][[:digit:]]*", "", .data$J.gene) .data } fix.genes <- function (.data) { if (has.class(.data, "list")) { return(lapply(.data, fix.genes)) } .fix <- function (.col) { # it's not a mistake .col <- gsub(", ", ",", .col, fixed = T, useBytes = T) .col <- gsub(",", ", ", .col, fixed = T, useBytes = T) .col } .data$V.gene <- .fix(.data$V.gene) .data$D.gene <- .fix(.data$D.gene) .data$J.gene <- .fix(.data$J.gene) .data } #' Print the given message if second parameter is a TRUE. #' #' @param .message Character vector standing for a message. #' @param .verbose If T then print the given mesasge. #' @return Nothing. .verbose.msg <- function (.message, .verbose = T) { if (.verbose) cat(.message) } #' Choose the right column. #' #' @param x Character vector with column IDs. #' @param .verbose If T then print the error mesasge. #' @return Character. .column.choice <- function (x, .verbose = T) { x <- switch(x[1], read.count = "Read.count", umi.count = "Umi.count", read.prop = "Read.proportion", umi.prop = "Umi.proportion", { .verbose.msg("You have specified an invalid column identifier. Choosed column: Read.count\n", .verbose); "Read.count" }) x } #' Fix names in lists. #' #' @param .datalist List with data frames. #' @return List with fixed names. .fix.listnames <- function (.datalist) { if (is.null(names(.datalist))) { names(.datalist) <- paste0("Sample.", 1:length(.datalist)) } else { for (i in 1:length(.datalist)) { if (names(.datalist)[i] == "" || is.na(names(.datalist)[i])) { names(.datalist)[i] <- paste0("Sample.", i) } } } .datalist } #' Get all unique clonotypes. #' #' @description #' Get all unique clonotypes with merged counts. Unique clonotypes are those with #' either equal CDR3 sequence or with equal CDR3 sequence and equal gene segments. #' Counts of equal clonotypes will be summed up. #' #' @param .data Either tcR data frame or a list with data frames. #' @param .gene.col Either name of the column with gene segments used to compare clonotypes #' or NA if you don't need comparing using gene segments. #' @param .count.col Name of the column with counts for each clonotype. #' @param .prop.col Name of the column with proportions for each clonotype. #' @param .seq.col Name of the column with clonotypes' CDR3 sequences. #' #' @return Data frame or a list with data frames with updated counts and proportion columns #' and rows with unique clonotypes only. #' #' @examples #' \dontrun{ #' tmp <- data.frame(A = c('a','a','b','c', 'a') #' B = c('V1', 'V1','V1','V2', 'V3') #' C = c(10,20,30,40,50), stringsAsFactors = F) #' tmp #' # A B C #' # 1 a V1 10 #' # 2 a V1 20 #' # 3 b V1 30 #' # 4 c V2 40 #' # 5 a V3 50 #' group.clonotypes(tmp, 'B', 'C', 'A') #' # A B C #' # 1 a V1 30 #' # 3 b V1 50 #' # 4 c V2 30 #' # 5 a V3 40 #' group.clonotypes(tmp, NA, 'C', 'A') #' # A B C #' # 1 a V1 80 #' # 3 b V1 30 #' # 4 c V2 40 #' # For tcR data frame: #' data(twb) #' twb1.gr <- group.clonotypes(twb[[1]]) #' twb.gr <- group.clonotypes(twb) #' } group.clonotypes<-function (.data, .gene.col = "V.gene", .count.col = "Read.count", .prop.col = "Read.proportion", .seq.col = "CDR3.amino.acid.sequence") { if (has.class(.data, "list")) { return(lapply(.data, group.clonotypes, .gene.col = .gene.col, .count.col = .count.col, .seq.col = .seq.col)) } namesvec <- c(.seq.col) if (!is.na(.gene.col)) { namesvec <- c(namesvec, .gene.col) } val <- dplyr::summarise_(dplyr::grouped_df(.data, lapply(namesvec, as.name)), value = paste0("sum(", .count.col, ")", sep = "", collapse = ""))$value .data <- .data[!duplicated(.data[, namesvec]), ] .data <- .data[order(.data$CDR3.amino.acid.sequence),] .data[, .count.col] <- val .data[, .prop.col] <- val / sum(val) permutedf(.data) } #' Shuffling data frames. #' #' @aliases permutedf unpermutedf #' #' @description #' Shuffle the given data.frame and order it by the Read.count column or un-shuffle #' a data frame and return it to the initial order. #' #' @usage #' permutedf(.data) #' #' unpermutedf(.data) #' #' @param .data MiTCR data.frame or list of such data frames. #' #' @return Shuffled data.frame or un-shuffled data frame if \code{.data} is a data frame, else list of such data frames. permutedf <- function (.data) { if (has.class(.data, 'list')) { return(lapply(.data, permutedf)) } shuffle<-.data[sample(nrow(.data)),] shuffle[order(shuffle$Read.count, decreasing=T),] } unpermutedf <- function (.data) { if (has.class(.data, 'list')) { return(lapply(.data, unpermutedf)) } .data[do.call(order, .data),] } #' Get a random subset from a data.frame. #' #' @description #' Sample rows of the given data frame with replacement. #' #' @param .data Data.frame or a list with data.frames #' @param .n Sample size if integer. If in bounds [0;1] than percent of rows to extract. "1" is a percent, not one row! #' @param .replace if T then choose with replacement, else without. #' #' @return Data.frame of nrow .n or a list with such data.frames. sample.clones <- function (.data, .n, .replace = T) { if (has.class(.data, 'list')) { return(lapply(.data, sample.clones, .n = .n)) } .data[sample(1:nrow(.data), if (.n > 1) .n else round(nrow(.data) * .n), replace = .replace), ] } #' Check if a given object has a given class. #' #' @param .data Object. #' @param .class String naming a class. #' #' @return Logical. has.class <- function (.data, .class) { .class %in% class(.data) } #' Copy the up-triangle matrix values to low-triangle. #' #' @param mat Given up-triangle matrix. #' #' @return Full matrix. matrixdiagcopy<-function(mat){ for (i in 1:ncol(mat)) for (j in 1:nrow(mat)) if (i)) #' permutDistTest(mat.ov.pca.dist, list()) #' } pca2euclid <- function (.pcaobj, .num.comps = 2) { mat <- .pcaobj$x if (.num.comps > 0) { mat <- mat[,1:.num.comps] } as.matrix(dist(mat)) }tcR/R/strtools.R0000644000176200001440000002604713667026401013235 0ustar liggesusers########## Support functions for managing sequences ########## # Private function. Split the given string by ', ' to a list and return # a first element of the list. .split.get <- function (.str, .alphabet) { if (has.class(.str, 'list')) { return(lapply(.str, .split.get, .alphabet = .alphabet)) } if (has.class(.str, 'data.frame')) { res <- .str res$V.gene <- sapply(res$V.gene, .split.get, .alphabet = HUMAN_TRBV_MITCR) res$D.gene <- sapply(res$D.gene, .split.get, .alphabet = c('TRBD1', 'TRBD2')) res$J.gene <- sapply(res$J.gene, .split.get, .alphabet = HUMAN_TRBJ) return(res) } .alphabet2 <- sub(' ', '', .alphabet, fixed = T) if (.str %in% .alphabet || .str %in% .alphabet2) { .str } else { #strsplit(.str, ', ', fixed=T, useBytes=T)[[.get]][1] strsplit(.str, split="[,][ ]*")[[1]][1] } } .fix.segments <- function (.data) { if (has.class(.data, 'list')) { return(lapply(.data, .fix.segments)) } .data$V.gene <- sapply(strsplit(.data$V.gene, ',', fixed=T, useBytes=T), paste0, collapse = ', ') .data$D.gene <- sapply(strsplit(.data$D.gene, ',', fixed=T, useBytes=T), paste0, collapse = ', ') .data$J.gene <- sapply(strsplit(.data$J.gene, ',', fixed=T, useBytes=T), paste0, collapse = ', ') .data } #' Reverse given character vector by the given n-plets. #' #' @param .seq Sequences. #' @param .n By which n-plets we should reverse the given strings. #' #' @return Reversed strings. #' #' @examples #' reverse.string('abcde') # => "edcba" #' reverse.string('abcde', 2) # => "debca" reverse.string <- function (.seq, .n = 1) { lens <- nchar(.seq) sapply(1:length(.seq), function (i) { tmp <- substring(.seq[i], 1, ) paste0(c(substring(.seq[i], seq(lens[i] - .n + 1, 1, -.n), seq(lens[i], .n, -.n)), substr(.seq[i], 1, lens[i] %% .n)), collapse = '') }, USE.NAMES=F) } #' Get all substrings for the given sequence. #' #' @param .seq Sequence for splitting to substrings. #' @param .min.len Minimal length of output sequences. #' @param .table if T then return data frame with substrings and positions of their ends in the .seq. #' #' @return Character vector or data frame with columns "Substring", "Start" and "End". get.all.substrings <- function (.seq, .min.len = 3, .table = T) { nc <- nchar(.seq) if (.table) { seqs <- unlist(sapply(1:(nc - .min.len + 1), function (i) { substring(.seq, i, (i + .min.len - 1):nc) })) inds <- do.call(rbind, sapply(1:(nc - .min.len + 1), function (i) { cbind(i, (i + .min.len - 1):nc) })) data.frame(Substring = seqs, Start = inds[,1], End = inds[,2], stringsAsFactors=F) } else { unique(unlist(sapply(1:(nc - .min.len + 1), function (i) { substring(.seq, i, (i + .min.len - 1):nc) }))) } } #' DNA reverse complementing and translation. #' #' @aliases revcomp bunch.translate #' #' @usage #' revcomp(.seq) #' #' bunch.translate(.seq, .two.way = T) #' #' @description #' Functions for DNA reverse complementing and translation. #' #' @usage #' revcomp(.seq) #' #' bunch.translate(.seq, .two.way = T) #' #' @param .seq Vector of nucleotide sequences. #' @param .two.way if T then translate sequences from both ends (output differes for #' out-of-frame sequences). #' #' @return Vector of corresponding revese complemented or aminoacid sequences. revcomp <- function (.seq) { rc.table <- c(A = 'T', T = 'A', C = 'G', G = 'C') sapply(strsplit(toupper(.seq), '', T, F, T), function (l) paste0(rc.table[l][length(l):1], collapse = ''), USE.NAMES = F) } bunch.translate <- function(.seq, .two.way = T) { sapply(toupper(.seq), function (y) { ny <- nchar(y) ny3 <- ny %/% 3 tmp <- '' if (.two.way) { if (ny %% 3 != 0) { tmp <- paste0(rep('N', times = 3), collapse = '') } y <- paste0(substr(y, 1, 3*((ny3 %/% 2) + (ny %% 2))), tmp, substr(y, 3*((ny3 %/% 2) + (ny3 %% 2)) + (ny %% 3) + 1, ny), collapse = '') } else { y <- substring(y, seq(1, nchar(y) - 2, 3), seq(3, nchar(y), 3)) } paste0(AA_TABLE[unlist(strsplit(gsub("(...)", "\\1_", y), "_"))],collapse="") }, USE.NAMES = F) } #' Functions for working with aminoacid sequences. #' #' @aliases codon.variants translated.nucl.sequences reverse.translation #' #' @usage #' codon.variants(.aaseq, .nucseq = sapply(1:length(.aaseq), #' function (i) paste0(rep('XXX', times = nchar(.aaseq[i])), #' collapse = ''))) #' #' translated.nucl.sequences(.aaseq, .nucseq = sapply(1:length(.aaseq), #' function (i) paste0(rep('XXX', times = nchar(.aaseq[i])), #' collapse = ''))) #' #' reverse.translation(.aaseq, .nucseq = paste0(rep('XXX', times = nchar(.aaseq)), #' collapse = '')) #' #' @description #' \code{codon.variants} - get all codon variants for the given nucleotide sequence with known corresponding aminoacid sequence. #' #' \code{translated.nucl.variants} - get number of nucleotide sequences which can be translated to the given aminoacid sequence. #' #' \code{reverse.translation} - get all nucleotide sequences, which can be traslated to the given aminoacid sequence. #' #' @param .aaseq Amino acid sequence. #' @param .nucseq Nucleotide sequence with 'X' letter at non-fixed positions. Other positions will be fixed. #' #' @return List with all possible variants for every aminoacid in .aaseq, number of sequences or #' character vector of candidate sequences. #' #' @examples #' codon.variants('ACT') #' translated.nucl.sequences(c('ACT', 'CASSLQ')) #' reverse.translation('T') # -> "ACA" "ACC" "ACG" "ACT" #' reverse.translation('T', 'XXT') # -> "ACT" #' translated.nucl.sequences('ACT', 'XXXXXXXC') #' codon.variants('ACT', 'XXXXXXXC') #' reverse.translation('ACT', 'XXXXXXXC') codon.variants <- function (.aaseq, .nucseq = sapply(1:length(.aaseq), function (i) paste0(rep('XXX', times = nchar(.aaseq[i])), collapse = ''))) { aas <- strsplit(.aaseq, '') nuc.nchar <- nchar(.nucseq) lapply(1:length(aas), function (i) { if (nuc.nchar[i] > 2) { triplets <- substring(.nucseq[i], seq(1, nuc.nchar[i] - 2, 3), seq(3, nuc.nchar[i], 3)) lapply(1:min(length(aas[[i]]), nuc.nchar[i] %/% 3), function (j) grep(gsub('X', '[ACGT]', triplets[j]), AA_TABLE_REVERSED[[aas[[i]][j]]], value = T)) } else { list() } }) } translated.nucl.sequences <- function (.aaseq, .nucseq = sapply(1:length(.aaseq), function (i) paste0(rep('XXX', times = nchar(.aaseq[i])), collapse = ''))) { aas <- strsplit(.aaseq, '') nuc.nchar <- nchar(.nucseq) sapply(1:length(aas), function (i) { if (nuc.nchar[i] > 2) { triplets <- substring(.nucseq[i], seq(1, nuc.nchar[i] - 2, 3), seq(3, nuc.nchar[i], 3)) prod(sapply(1:min(length(aas[[i]]), nuc.nchar[i] %/% 3), function (j) length(grep(gsub('X', '[ACGT]', triplets[j]), AA_TABLE_REVERSED[[aas[[i]][j]]], value = T)))) } else { 0 } }) } reverse.translation <- function (.aaseq, .nucseq = paste0(rep('XXX', times = nchar(.aaseq)), collapse = '')) { apply(expand.grid(codon.variants(.aaseq, .nucseq)[[1]], stringsAsFactors=F), 1, paste0, collapse = '') } #' GC-content of a nucleotide sequences. #' #' @description #' Compute the GC-content (proportion of G-C nucleotide in a sequence). #' #' @param .nucseq Character vector of nucletoide sequences. #' @return Numeric vector of \code{length(.nucseq)}. gc.content <- function (.nucseq) { sapply(strsplit(.nucseq, '', fixed=T, useBytes=T), function (l) { l <- unlist(l) t <- table(c('A', 'C', 'G', 'T', l)) r <- (t['G'] + t['C'] - 2) / length(l) names(r) <- NULL r }, USE.NAMES=F) } #' Find similar sequences. #' #' @aliases find.similar.sequences exact.match hamming.match levenshtein.match #' #' @description #' Return matrix M with two columns. For each element in row i and column j M[i,j] => distance between pattern(i) and data(j) sequences equal to or less than .max.errors. #' This function will uppercase .data and remove all strings, which have anything than A-Z letters. #' #' @usage #' find.similar.sequences(.data, .patterns = c(), .method = c('exact', 'hamm', 'lev'), #' .max.errors = 1, .verbose = T, .clear = F) #' #' exact.match(.data, .patterns = c(), .verbose = T) #' #' hamming.match(.data, .patterns = c(), .max.errors = 1, .verbose = T) #' #' levenshtein.match(.data, .patterns = c(), .max.errors = 1, .verbose = T) #' #' @param .data Vector of strings. #' @param .patterns Character vector of sequences, which will be used for searching for neighbours. #' @param .method Which method use: 'exact' for exact matching, 'hamm' for Hamming Distance, 'lev' for Levenshtein distance. #' @param .max.errors Max Hamming or Levenshtein distance between strings. Doesn't use in 'exact' setting. #' @param .verbose Should function print progress or not. // DON'T USE IT #' @param .clear if T then remove all sequences with character "*" or "~". #' #' @return Matrix with two columns [i,j], dist(data(i), data(j)) <= .max.errors. find.similar.sequences <- function (.data, .patterns = c(), .method = c('exact', 'hamm', 'lev'), .max.errors = 1, .verbose = T, .clear = F) { if (.method[1] == 'lev') { .clear <- T } data.old.indices <- grep('[*, ~]', .data, invert = T) .data <- toupper(.data[data.old.indices]) pattern.old.indices <- data.old.indices if (length(.patterns) == 0) { .patterns <- .data } else { pattern.old.indices <- 1:length(.patterns) if (.clear) { pattern.old.indices <- grep('[*, ~]', .patterns, invert = T) } .patterns <- toupper(.patterns[pattern.old.indices]) } .fun <- switch(.method[1], exact = .exact_search, hamm = .hamming_search, lev = .levenshtein_search) res <- .fun(.data, .patterns, .max.errors, .verbose) if (length(res) == 0) { matrix(ncol = 2, nrow = 1) } else { res <- cbind(res[seq(from=1, to=length(res), by=2)], res[seq(from=2, to=length(res), by=2)]) res <- res[order(res[,1]), ] if (is.null(dim(res))) { res <- t(as.matrix(res)) } res[,1] <- data.old.indices[res[,1]] res[,2] <- pattern.old.indices[res[,2]] res } } .exact_search2 <- function (.data, .patterns, .max.errors, .verbose) { ps <- data.frame(P = .patterns, Ind = 1:length(.patterns), stringsAsFactors = F) agg <- aggregate(formula = Ind ~ P, data = ps, FUN = function (x) x, simplify = F) inds <- lapply(match(.data, agg$P), function (i) if (is.na(i)) NA else unlist(agg$Ind[i], use.names = F) ) t(do.call(rbind, sapply(1:length(inds), function (i) if (!is.na(inds[[i]][1])) cbind(i, inds[[i]]), USE.NAMES = F))) } exact.match <- function (.data, .patterns = c(), .verbose = T) { find.similar.sequences(.data, .patterns, 'exact', .verbose = .verbose, F) } hamming.match <- function (.data, .patterns = c(), .max.errors = 1, .verbose = T) { find.similar.sequences(.data, .patterns, 'hamm', .max.errors, .verbose, F) } levenshtein.match <- function (.data, .patterns = c(), .max.errors = 1, .verbose = T) { find.similar.sequences(.data, .patterns, 'lev', .max.errors, .verbose, T) }tcR/R/crosses.R0000644000176200001440000005330613667026401013023 0ustar liggesusers########## Intersections among sets of sequences ########## if (getRversion() >= "2.15.1") { utils::globalVariables(c("Resamp.values", "Fun.value", "P.value")) } #' Intersection between sets of sequences or any elements. #' #' @aliases intersectClonesets intersectCount intersectLogic intersectIndices #' #' @description #' Functions for the intersection of data frames with TCR / Ig data. #' See the \code{repOverlap} function for a general interface to all overlap analysis functions. #' #' \code{intersectClonesets} - returns number of similar elements in the given two clonesets / data frames or matrix #' with counts of similar elements among each pair of objects in the given list. #' #' \code{intersectCount} - similar to \code{tcR::intersectClonesets}, but with fewer parameters and only for two objects. #' #' \code{intersectIndices} - returns matrix M with two columns, where element with index M[i, 1] in the first #' given object is similar to an element with index M[i, 2] in the second given object. #' #' \code{intersectLogic} - returns logic vector with TRUE values in positions, where element in the first given data frame #' is found in the second given data frame. #' #' @usage #' intersectClonesets(.alpha = NULL, .beta = NULL, .type = "n0e", .head = -1, .norm = F, #' .verbose = F) #' #' intersectCount(.alpha, .beta, .method = c('exact', 'hamm', 'lev'), .col = NULL) #' #' intersectIndices(.alpha, .beta, .method = c('exact', 'hamm', 'lev'), .col = NULL) #' #' intersectLogic(.alpha, .beta, .method = c('exact', 'hamm', 'lev'), .col = NULL) #' #' @param .alpha Either first vector or data.frame or list with data.frames. #' @param .beta Second vector or data.frame or type of intersection procedure (see the \code{.type} parameter) if \code{.alpha} is a list. #' @param .type Types of intersection procedure if \code{.alpha} and \code{.beta} is data frames. String with 3 characters (see 'Details' for more information). #' @param .head Parameter for the \code{head} function, applied before intersecting. #' @param .method Method to use for intersecting string elements: 'exact' for exact matching, 'hamm' for matching strings which have <= 1 hamming distance, #' 'lev' for matching strings which have <= 1 levenshtein (edit) distance between them. #' @param .col Which columns use for fetching values to intersect. First supplied column matched with \code{.method}, others as exact values. #' @param .norm If TRUE than normalise result by product of length or nrows of the given data. #' @param .verbose if T then produce output of processing the data. #' #' @details #' Parameter \code{.type} of the \code{intersectClonesets} function is a string of length 3 #' [0an][0vja][ehl], where: #' \enumerate{ #' \item First character defines which elements intersect ("a" for elements from the column "CDR3.amino.acid.sequence", #' "n" for elements from the column "CDR3.nucleotide.sequence", other characters - intersect elements as specified); #' \item Second character defines which columns additionaly script should use #' ('0' for cross with no additional columns, 'v' for cross using the "V.gene" column, #' 'j' for cross using "J.gene" column, 'a' for cross using both "V.gene" and "J.gene" columns); #' \item Third character defines a method of search for similar sequences is use: #' "e" stands for the exact match of sequnces, "h" for match elements which have the Hamming distance between them #' equal to or less than 1, "l" for match elements which have the Levenshtein distance between tham equal to or less than 1. #' } #' #' @seealso \link{repOverlap}, \link{vis.heatmap}, \link{ozScore}, \link{permutDistTest}, \link{vis.group.boxplot} #' #' @return #' \code{intersectClonesets} returns (normalised) number of similar elements or matrix with numbers of elements. #' #' \code{intersectCount} returns number of similar elements. #' #' \code{intersectIndices} returns 2-row matrix with the first column stands for an index of an element in the given \code{x}, and the second column stands for an index of an element of \code{y} which is similar to a relative element in \code{x}; #' #' \code{intersectLogic} returns logical vector of \code{length(x)} or \code{nrow(x)}, where TRUE at position \code{i} means that element with index {i} has been found in the \code{y} #' #' @examples #' \dontrun{ #' data(twb) #' # Equivalent to intersectClonesets(twb[[1]]$CDR3.nucleotide.sequence, #' # twb[[2]]$CDR3.nucleotide.sequence) #' # or intersectCount(twb[[1]]$CDR3.nucleotide.sequence, #' # twb[[2]]$CDR3.nucleotide.sequence) #' # First "n" stands for a "CDR3.nucleotide.sequence" column, "e" for exact match. #' twb.12.n0e <- intersectClonesets(twb[[1]], twb[[2]], 'n0e') #' stopifnot(twb.12.n0e == 46) #' # First "a" stands for "CDR3.amino.acid.sequence" column. #' # Second "v" means that intersect should also use the "V.gene" column. #' intersectClonesets(twb[[1]], twb[[2]], 'ave') #' # Works also on lists, performs all possible pairwise intersections. #' intersectClonesets(twb, 'ave') #' # Plot results. #' vis.heatmap(intersectClonesets(twb, 'ave'), .title = 'twb - (ave)-intersection', .labs = '') #' # Get elements which are in both twb[[1]] and twb[[2]]. #' # Elements are tuples of CDR3 nucleotide sequence and corresponding V-segment #' imm.1.2 <- intersectLogic(twb[[1]], twb[[2]], #' .col = c('CDR3.amino.acid.sequence', 'V.gene')) #' head(twb[[1]][imm.1.2, c('CDR3.amino.acid.sequence', 'V.gene')]) #' data(twb) #' ov <- repOverlap(twb) #' sb <- matrixSubgroups(ov, list(tw1 = c('Subj.A', 'Subj.B'), tw2 = c('Subj.C', 'Subj.D'))); #' vis.group.boxplot(sb) #' } intersectClonesets <- function (.alpha = NULL, .beta = NULL, .type = 'n0e', .head = -1, .norm = F, .verbose = F) { if (class(.alpha) == 'list') { if (class(.beta) == 'character') { .type <- .beta } apply.symm(.alpha, intersectClonesets, .head = .head, .type = .type, .norm = .norm, .verbose = .verbose) } else { if (.head != -1) { .alpha <- head(.alpha, .head) .beta <- head(.beta, .head) } cols <- NULL if (class(.alpha) == 'data.frame') { if (substr(.type, 1, 1) == 'a' || substr(.type, 1, 1) == 'n') { if (substr(.type, 1, 1) == 'a') { cols <- 'CDR3.amino.acid.sequence' } else { cols <- 'CDR3.nucleotide.sequence' } if (substr(.type, 2, 2) == 'v') { cols <- c(cols, 'V.gene') } else if (substr(.type, 2, 2) == 'j') { cols <- c(cols, 'J.gene') } else if (substr(.type, 2, 2) == 'a') { cols <- c(cols, 'V.gene', 'J.gene') } else if (substr(.type, 2, 2) != '0') { cat("Second character in .type:", .type, 'is unknown!\n') } } } method <- switch(substr(.type, 3, 3), e = 'exact', h = 'hamm', l = 'lev') res <- intersectCount(.alpha, .beta, method, cols) if (.norm) { if (is.null(dim(.alpha))) { res <- res / (as.numeric(length(.alpha)) * length(.beta)) # res <- res * max(length(.alpha), length(.beta)) } else { res <- res / (as.numeric(nrow(.alpha)) * nrow(.beta)) # res <- res * max(nrow(.alpha), nrow(.beta)) } } res } } intersectCount <- function (.alpha, .beta, .method = c('exact', 'hamm', 'lev'), .col = NULL) { if (.method[1] == 'exact' && (is.null(.col) || length(.col) == 1)) { if (is.null(.col)) { length(base::intersect(.alpha, .beta)) } else { length(base::intersect(.alpha[,.col], .beta[,.col])) } } else { if (.method[1] == 'exact') { nrow(dplyr::intersect(.alpha[, .col], .beta[, .col])) } else { res <- intersectIndices(unique(.alpha), unique(.beta), .method, .col) if (!is.na(res[1,1])) { nrow(res) } else { 0 } } } } intersectIndices <- function (.alpha, .beta, .method = c('exact', 'hamm', 'lev'), .col = NULL) { if (!is.null(.col)) { .alpha <- as.data.frame(.alpha, stringsAsFactors = F) .beta <- as.data.frame(.beta, stringsAsFactors = F) if (length(.col) == 1) { .alpha <- .alpha[, .col] .beta <- .beta[, .col] } else { if (length(.col) == 2) { alpha.cols <- as.matrix(.alpha[, .col[2]]) beta.cols <- as.matrix(.beta[, .col[2]]) } else { alpha.cols <- .alpha[, .col[2:length(.col)]] beta.cols <- .beta[, .col[2:length(.col)]] } .alpha <- .alpha[, .col[1]] .beta <- .beta[, .col[1]] } } res <- find.similar.sequences(.alpha, .beta, .method, 1, F) if (is.na(res[1,1])) { return(res) } if (!is.null(.col) && length(.col) > 1) { for (i in 1:ncol(alpha.cols)) { res <- res[alpha.cols[res[,1], i] == beta.cols[res[,2], i], ] } } if(!is.matrix(res)) { res <- rbind(res) } if (dim(res)[1] == 0) { res <- matrix(c(NA, NA), 1, 2) } res } intersectLogic <- function (.alpha, .beta, .method = c('exact', 'hamm', 'lev'), .col = NULL) { ind <- intersectIndices(.alpha, .beta, .method, .col) if (is.null(.col)) { logic <- rep(FALSE, length(.alpha)) } else { logic <- rep(FALSE, nrow(.alpha)) } logic[ind[,1]] <- TRUE logic } #' Compute convergence characteristics of repertoires. #' #' @description #' Get a number of rows with similar aminoacid sequence but different nucleotide sequence. #' #' @param .alpha Either data frame with columns \code{.col.nuc} and \code{.col.aa} or list with such data frames. #' @param .beta Either data frame or none. #' @param .col.nuc Name of the column with nucleotide sequences. #' @param .col.aa Name of the columnw ith aminoacid sequences. #' @return If \code{.alpha} is data frame, than integer vector of length 2 with . If \code{.alpha} is a list #' than matrix M with M[i,j] = convergence.index(.alpha[[i]], .alpha[[j]]). convergence.index <- function (.alpha, .beta, .col.nuc = 'CDR3.nucleotide.sequence', .col.aa = 'CDR3.amino.acid.sequence') { if (has.class(.alpha, 'list')) { return(apply.asymm(.alpha, function (x,y) convergence.index(x, y)[1])) } a.nuc.logic <- .alpha[, .col.nuc] %in% .beta[, .col.nuc] b.nuc.logic <- .beta[, .col.nuc] %in% .alpha[, .col.nuc] a.aa.logic <- .alpha[, .col.aa] %in% .beta[, .col.aa] b.aa.logic <- .beta[, .col.aa] %in% .alpha[, .col.aa] c(Amino.acid.not.nucleotide.count.1 = length(unique(.alpha[a.aa.logic & !(a.nuc.logic), .col.aa])), Amino.acid.not.nucleotide.count.2 = length(unique(.beta[b.aa.logic & !(b.nuc.logic), .col.aa]))) } #' Overlap Z-score. #' #' @description #' Compute OZ-scores ("overlap Z scores") for values in the given matrix of overlaps, i.e.,. #' for each value compute the number of standart deviations from the mean of the matrix. #' #' @param .mat Matrix with overlap values. #' @param .symm If T then remove lower triangle matrix from counting. Doesn't work if the matrix #' has different number of rows and columns. #' @param .as.matrix If T then return #' @param .val.col If .as.matrix is T then this is a name of the column to build matrix upon: #' either "oz" for the OZ-score column, "abs" for the absolute OZ-score column, or "norm" for the #' normalised absolute OZ-score column. #' #' @seealso \link{repOverlap}, \link{intersectClonesets}, \link{permutDistTest} #' #' @examples #' \dontrun{ #' data(twb) #' mat <- repOverlap(twb) #' ozScore(mat) #' # Take 3x3 matrix #' ozScore(mat[1:3, 1:3]) #' # Return as matrix with OZ scores #' ozmat <- ozScore(mat, T, T, 'oz') #' # Return as matrix with normalised absolute OZ scores #' oznorm <- ozScore(mat, T, T, 'norm') #' # Plot it as boxplots #' sb <- matrixSubgroups(oznorm, list(tw1 = c('Subj.A', 'Subj.B'), tw2 = c('Subj.C', 'Subj.D'))); #' vis.group.boxplot(sb) #' } ozScore <- function (.mat, .symm = T, .as.matrix = F, .val.col = c('norm', 'abs', 'oz')) { if (.symm && nrow(.mat) == ncol(.mat)) { .mat[lower.tri(.mat)] <- NA } res <- melt(.mat, na.rm = T) res$OZ <- NA colnames(res) <- c("Rep1", "Rep2", "Overlap", "OZ") res$OZ <- (res$Overlap - mean(res$Overlap)) / sd(res$Overlap) res$Abs.OZ <- abs(res$OZ) res$Norm.abs.OZ <- (res$Abs.OZ - min(res$Abs.OZ)) / (max(res$Abs.OZ) - min(res$Abs.OZ)) res <- res[order(res$Abs.OZ, decreasing = T),] row.names(res) <- NULL if (.as.matrix) { res <- acast(res, Rep1 ~ Rep2, value.var = switch(.val.col[1], oz = 'OZ', abs = 'Abs.OZ', norm = 'Norm.abs.OZ')) if (sum(!colnames(.mat) %in% colnames(res))) { res <- cbind(NA, res) colnames(res)[1] <- colnames(.mat)[!(colnames(.mat) %in% colnames(res))] } if (sum(!row.names(.mat) %in% row.names(res))) { res <- rbind(res, NA) row.names(res)[nrow(res)] <- row.names(.mat)[!(row.names(.mat) %in% row.names(res))] } } res } #' Monte Carlo permutation test for pairwise and one-vs-all-wise within- and inter-group differences in a set of repertoires. #' #' @description #' WARNING: this is an experimental procedure, work is still in progress. #' #' Perform permutation tests of distances among groups for the given groups of samples and matrix of distances among all samples. #' #' @param .mat Symmetric matrix of repertoire distances. #' @param .groups Named list with names of repertoires in groups. #' @param .n Number of permutations for each pair of group. #' @param .fun A function to apply to distances. #' @param .signif Significance level. Below this value hypotheses counts as significant. #' @param .plot If T than plot the output results. Else return them as a data frame. #' @param .xlab X lab label. #' @param .title Main title of the plot. #' @param .hjust Value for adjusting the x coordinate of p-value labels on plots. #' @param .vjust Value for adjusting the y coordinate of p-value labels on plots. #' #' @seealso \link{repOverlap}, \link{intersectClonesets}, \link{ozScore}, \link{pca2euclid} #' #' @examples #' \dontrun{ #' data(twb) #' mat <- repOverlap(twb) #' permutDistTest(mat, list(tw1 = c('Subj.A', 'Subj.B'), tw2 = c('Subj.C', 'Subj.D'))) #' permutDistTest(mat, list(tw1 = c('Subj.A', 'Subj.B'), tw2 = c('Subj.C', 'Subj.D')), .fun = median) #' } permutDistTest <- function (.mat, .groups, .n = 1000, .fun = mean, .signif = .05, .plot = T, .xlab = "Values", .title = "Monte Carlo permutation testing of overlaps", .hjust = -.1, .vjust = -4) { cat("WARNING: this is an experimental procedure, work is still in progress \n") .pairwise.test <- function (.mat, .group.logic, .n, .fun) { within.val.gr1 = .fun(.mat[.group.logic, .group.logic][upper.tri(.mat[.group.logic, .group.logic])]) within.val.gr2 = .fun(.mat[!.group.logic, !.group.logic][upper.tri(.mat[!.group.logic, !.group.logic])]) inter.val = .fun(.mat[.group.logic, !.group.logic]) within.resamp.gr1 = c() within.resamp.gr2 = c() inter.resamp = c() gr1.size <- sum(.group.logic) gr2.size <- sum(!.group.logic) for (iter in 1:.n) { new.group.logic <- rep(F, nrow(.mat)) new.group.logic[ sample(1:nrow(.mat), gr1.size, F) ] <- T within.resamp.gr1 = c(within.resamp.gr1, .fun(.mat[new.group.logic, new.group.logic][upper.tri(.mat[new.group.logic, new.group.logic])])) within.resamp.gr2 = c(within.resamp.gr2, .fun(.mat[!new.group.logic, !new.group.logic][upper.tri(.mat[!new.group.logic, !new.group.logic])])) inter.resamp = c(inter.resamp, .fun(.mat[new.group.logic, !new.group.logic])) } list(within.val.gr1 = within.val.gr1, within.val.gr2 = within.val.gr2, inter.val = inter.val, within.resamp.gr1 = within.resamp.gr1, within.resamp.gr2 = within.resamp.gr2, inter.resamp = inter.resamp, within.p.gr1 = sum(within.val.gr1 > within.resamp.gr1) / .n, within.p.gr2 = sum(within.val.gr2 > within.resamp.gr2) / .n, inter.p = sum(inter.val > inter.resamp) / .n) } .intergroup.name <- function (.gr1, .gr2) { paste0(.gr1, ':', .gr2) } res <- list() pb <- set.pb((length(.groups) - 1) * length(.groups) / 2) k <- 1 p.vals <- list() for (gr in names(.groups)) { p.vals[[gr]] <- list(within = c(), inter = c()) } for (i in 1:(length(.groups)-1)) { gr1 <- names(.groups)[i] for (j in (i+1):length(.groups)) { gr2 <- names(.groups)[j] submat <- .mat[ row.names(.mat) %in% .groups[[i]] | row.names(.mat) %in% .groups[[j]] , colnames(.mat) %in% .groups[[i]] | colnames(.mat) %in% .groups[[j]] ] submat <- submat[, row.names(submat)] group.logic <- row.names(submat) %in% .groups[[i]] test.res.list <- .pairwise.test(submat, group.logic, .n, .fun) res[[k]] <- rbind(data.frame(Group1 = gr1, Group2 = gr1, Fun.value = test.res.list$within.val.gr1, Resamp.values = test.res.list$within.resamp.gr1, P.value = test.res.list$within.p.gr1, stringsAsFactors = F), data.frame(Group1 = gr1, Group2 = gr2, Fun.value = test.res.list$inter.val, Resamp.values = test.res.list$inter.resamp, P.value = test.res.list$inter.p, stringsAsFactors = F), data.frame(Group1 = gr2, Group2 = gr2, Fun.value = test.res.list$within.val.gr2, Resamp.values = test.res.list$within.resamp.gr2, P.value = test.res.list$within.p.gr2, stringsAsFactors = F)) k <- k + 1 p.vals[[gr1]][["within"]] <- c(p.vals[[gr1]][["within"]], test.res.list$within.p.gr1) names(p.vals[[gr1]][["within"]])[length(p.vals[[gr1]][["within"]])] <- gr2 p.vals[[gr2]][["within"]] <- c(p.vals[[gr2]][["within"]], test.res.list$within.p.gr2) names(p.vals[[gr2]][["within"]])[length(p.vals[[gr2]][["within"]])] <- gr1 p.vals[[gr1]][["inter"]] <- c(p.vals[[gr1]][["inter"]], test.res.list$inter.p) names(p.vals[[gr1]][["inter"]])[length(p.vals[[gr1]][["inter"]])] <- gr2 p.vals[[gr2]][["inter"]] <- c(p.vals[[gr2]][["inter"]], test.res.list$inter.p) names(p.vals[[gr2]][["inter"]])[length(p.vals[[gr2]][["inter"]])] <- gr1 add.pb(pb) } } close(pb) p <- list() for (i in 1:(k-1)) { faclevels <- unique(c(res[[i]]$Group1, res[[i]]$Group2)) faclevels <- c(faclevels[1], paste0(faclevels[1], " ~ ", faclevels[2]), faclevels[2]) res[[i]]$Group3 <- paste0(res[[i]]$Group1, " ~ ", res[[i]]$Group2) res[[i]]$Group3[res[[i]]$Group1 == res[[i]]$Group2] <- res[[i]]$Group1[res[[i]]$Group1 == res[[i]]$Group2] res[[i]]$Group3 <- factor(res[[i]]$Group3, faclevels) tmp <- do.call(rbind, lapply(split(res[[i]], res[[i]]$Group3), function (x) x[1,])) p[[i]] <- ggplot(res[[i]], aes(x = Resamp.values)) + geom_vline(aes(xintercept = Fun.value), size = 1, linetype = "twodash", colour = "blue") + geom_histogram(alpha = .4, colour = 'grey40') + geom_text(aes(x = 0, y = 0, label = paste0("P = ", P.value)), hjust = .hjust, vjust = .vjust, size = 5, data = tmp) + facet_wrap(~ Group3, ncol = 3) + ylab("Permutations, num") + xlab(.xlab) + theme_bw() } fmt.width <- 0 for (gr.name in names(.groups)) { fmt.width <- max(fmt.width, nchar(gr.name)) } fmt.width <- fmt.width + 2 flag <- F cat("Significant differences found (OBS - observed, SIM - simulated):\n") for (gr.name in names(p.vals)) { w.signs <- c() i.signs <- c() for (i in 1:length(p.vals[[gr.name]][["within"]])) { if (p.vals[[gr.name]][["within"]][i] < 1 - p.vals[[gr.name]][["within"]][i]) { w.signs <- c(w.signs, ">") } else { w.signs <- c(w.signs, "<") p.vals[[gr.name]][["within"]][i] <- 1 - p.vals[[gr.name]][["within"]][i] } } for (i in 1:length(p.vals[[gr.name]][["inter"]])) { if (p.vals[[gr.name]][["inter"]][i] < 1 - p.vals[[gr.name]][["inter"]][i]) { i.signs <- c(i.signs, ">") } else { i.signs <- c(i.signs, "<") p.vals[[gr.name]][["inter"]][i] <- 1 - p.vals[[gr.name]][["inter"]][i] } } p.vals[[gr.name]][["within"]] <- p.adjust(p.vals[[gr.name]][["within"]], "BH") p.vals[[gr.name]][["inter"]] <- p.adjust(p.vals[[gr.name]][["inter"]], "BH") # cat("\tThis groups may have come from different populations\n") # cat("\tThis groups may have non-random overlap and come from different populations\n") for (i in 1:length(p.vals[[gr.name]][["within"]])) { pval <- p.vals[[gr.name]][["within"]][i] if (pval <= .signif) { cat(' Within ', formatC(paste0('"', gr.name, '"'), width = -fmt.width), ' in a pool with ', formatC(paste0('"', names(p.vals[[gr.name]][["within"]])[i], '"'), width = fmt.width), ' : P(OBS ', w.signs[i], ' SIM) = ', pval, "\n", sep ='') flag <- T } } for (i in 1:length(p.vals[[gr.name]][["inter"]])) { pval <- p.vals[[gr.name]][["inter"]][i] if (pval <= .signif) { cat(' Between ', formatC(paste0('"', gr.name, '"'), width = -fmt.width), ' and ', formatC(paste0('"', names(p.vals[[gr.name]][["inter"]])[i], '"'), width = fmt.width + 11), ' : P(OBS ', i.signs[i], ' SIM) = ', pval, "\n", sep = '') flag <- T } } } if (!flag) { cat("No significant differences have been found.\n") } if (.plot) { suppressMessages(do.call(grid.arrange, c(p, ncol = 1, top = .title))) } else { res } }tcR/R/spectrum.R0000644000176200001440000000542613667026401013204 0ustar liggesusers########## Spectratyping ########## if (getRversion() >= "2.15.1") { utils::globalVariables(c("Length", "Val")) } #' Spectratype #' #' @description Plot a spectratype plot - a histogram of read counts / umi counts by CDR3 length. #' #' @param .data tcR data frame. #' @param .quant Either "read.count" or "umi.count" for choosing the corresponding columns, or "id" to compute avoid using counts. #' @param .gene Either NA for not using genes, "V" or "J" for corresponding genes. #' @param .plot If T than plot the spectratype plot, otherwise return a table with data for lengths and counts. #' @param .main Main title. #' @param .legend Legend title. #' @param .labs Character vector of length 2 for x-lab and y-lab. #' #' @examples #' \dontrun{ #' data(twb) #' tmp = twb[[1]] #' spectratype(tmp) #' spectratype(tmp, .quant = "id", .plot = T, .gene = 'V') #' spectratype(tmp, .quant = "read.count", .plot = F) #' } spectratype <- function (.data, .quant = c("read.count", "umi.count", "id"), .gene = "V", .plot = T, .main = "Spectratype", .legend = "Gene segment", .labs = c("CDR3 length", NA)) { .data$Length = nchar(.data$CDR3.nucleotide.sequence) if (.quant[1] == "id") { .data$Count = 1 } else { .data$Count = .data[[.column.choice(.quant[1])]] } if (is.na(.gene)) { df = summarise(group_by(do.call(select_, list(.data, "Length", "Count")), Length), Val = sum(Count)) p = ggplot() + geom_bar(aes(x = Length, y = Val), data = df, stat = "identity") } else { .gene = switch(tolower(substr(.gene, 1, 1)), v = "V.gene", j = "J.gene") df = do.call(select_, list(.data, "Length", "Count", .gene)) df = group_by_(df, "Length", .gene) df = summarise(df, Val = sum(Count)) df$Gene = df[[.gene]] df[[.gene]] = NULL df = df[order(df$Val, decreasing = T),] dup = which(cumsum(!duplicated(df$Gene)) == 12)[1] if (length(dup)) { uniq = unique(df$Gene[1:(dup - 1)]) df$Gene[!(df$Gene %in% uniq)] = "Z" # <- dirty hack to avoid factors } p = ggplot() + geom_bar(aes(x = Length, y = Val, fill = Gene), data = df, stat = "identity") + scale_fill_manual(name = .legend, breaks = c(sort(uniq), "Z"), labels=c(sort(uniq), "Other"), values = c("#9E0142", "#D53E4F", "#F46D43", "#FDAE61", "#FEE08B", "#FFFFBF", "#E6F598", "#ABDDA4", "#66C2A5", "#3288BD", "#5E4FA2", "grey75")) + ggtitle(.main) } if (.plot) { if (!is.na(.labs[2])) { p = p + ylab(.labs[2]) } else { p = p + ylab(switch(.quant[1], id = "Number of clonotypes", read.count = "Sum of reads", umi.count = "Sum of UMIs")) } p = p + xlab(.labs[1]) p + theme_linedraw() } else { as.data.frame(df) } }tcR/R/onload.R0000644000176200001440000000123113667027531012611 0ustar liggesusers.onAttach <- function(libname = find.package("tcR"), pkgname = "tcR"){ packageStartupMessage(" ======================================== !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !! The tcR package WILL SOON BE ORPHANED !! AND REMOVED FROM CRAN. !! !! A new package is available that is !! designed to replace tcR: !! immunarch -- https://immunarch.com/ !! !! We will be happy to help you to move !! to the new package. Feel free to contact us: !! http://github.com/immunomind/immunarch !! !! Sincerely, !! immunarch dev team and !! Vadim I. Nazarov, lead developer of tcR !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! =======================================") }tcR/R/io.R0000644000176200001440000001004213667027536011751 0ustar liggesusers#' Parse input files or folders with immune receptor repertoire data. #' #' @aliases repLoad #' #' @description #' Load the immune receptor repertoire data from the given input: either a file name, a list of file names, a name of the folder with repertoire files, #' or a list of folders with repertoire files. The folder / folders must contain only files with the specified format. #' Input files could be either text files or archived with gzip ("filename.txt.gz") or bzip2 ("filename.txt.bz2"). #' For a general parser of table files with cloneset data see \code{\link{parse.cloneset}}. #' #' Parsers are available for: #' MiTCR ("mitcr"), MiTCR w/ UMIs ("mitcrbc"), MiGEC ("migec"), VDJtools ("vdjtools"), #' ImmunoSEQ ("immunoseq" or 'immunoseq2' for old and new formats respectively), #' MiXCR ("mixcr"), IMSEQ ("imseq") and tcR ("tcr", data frames saved with the `repSave()` function). #' #' Output of MiXCR should contain either all hits or best hits for each gene segment. #' #' Output of IMSEQ should be generated with parameter "-on". In this case there will be no positions of aligned gene segments in the output data frame #' due to restrictions of IMSEQ output. #' #' tcR's data frames should be saved with the `repSave()` function. #' #' For details on the tcR data frame format see \link{parse.file}. #' #' @param .path Character vector with path to files and / or folders. #' @param .format String that specifies the input format. #' #' @seealso \link{parse.file} #' #' @examples #' \dontrun{ #' datalist <- repLoad(c("file1.txt", "folder_with_files1", "another_folder"), "mixcr") #' } repLoad <- function (.path, .format = c("mitcr", "migec")) { message(" ======================================== !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !! The tcR package WILL SOON BE ORPHANED !! AND REMOVED FROM CRAN. !! !! A new package is available that is !! designed to replace tcR: !! immunarch -- https://immunarch.com/ !! !! We will be happy to help you to move !! to the new package. Feel free to contact us: !! http://github.com/immunomind/immunarch !! !! Sincerely, !! immunarch dev team and !! Vadim I. Nazarov, lead developer of tcR !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! =======================================") res <- list() for (i in 1:length(.path)) { if (dir.exists(.path[i])) { res <- c(res, parse.folder(.path[i], .format[1])) } else if (file.exists(.path[i])) { res <- c(res, list(parse.file(.path[1], .format[1]))) } else { cat('Can\'t find folder or file:\t"', .path[i], '"', sep = '', end = '\n') } } res } #' Save tcR data frames to disk as text files or gzipped text files. #' #' @description #' Save repertoire files to either text files or gzipped text files. #' You can read them later by \code{repLoad} function with \code{.format = "tcr"}. #' #' @param .data Either tcR data frame or a list of tcR data frames. #' @param .format "txt" for simple tab-delimited text tables, "gz" for compressed (gzipped) tables. #' @param .names Names of output files. By default it's an empty string so names will be taken from names of the input list. #' @param .folder Path to the folder with output files. #' #' @seealso \link{repLoad} repSave <- function (.data, .format = c("txt", "gz"), .names = "", .folder = "./") { if (has.class(.data, 'data.frame')) { .data <- list(Sample = .data) } .folder <- paste0(.folder, "/") postfix <- ".txt" filefun <- function (...) file(...) if (.format[1] == "gz") { postfix <- ".txt.gz" filefun <- function (...) gzfile(...) } if (.names[1] == "") { .names = paste0(.folder, names(.data), postfix) } else { if (length(.data) != length(.names)) { cat("Number of input data frames isn't equal to number of names\n") return(NULL) } else { .names = paste0(.folder, .names, postfix) } } for (i in 1:length(.data)) { cat("Writing", .names[i], "file...\t") fc <- filefun(description = .names[i], open = "w") write.table(.data[[i]], fc, quote = F, row.names = F, sep = '\t') close(fc) cat("Done.\n") } }tcR/R/filters.R0000644000176200001440000000647513667026401013017 0ustar liggesusers########## Various ways to subset the data ########## #' Contamination filtering. #' #' @aliases contamination.stats decontamination #' #' @description #' Occasionally DNA or RNA libraries are contaminate each other. To address this issue and estimate contamination rate \code{tcR} offers #' \code{contamination.stats} and \code{decontamination} functions. The \code{decontamination} function received data #' (either data frame or a list with data frames) and a limit for clonal proportion as arguments. #' Script searches for a similar clones to the first data frame in the other (or performs pairwise searches if the given data is a list) #' and removes clones from the first data frame, which has been found in the second one with counts less or equal to 10 * counts of similar clones #' in the first one. Function \code{contamination.stats} will return the number of clones which will be removed with the \code{contamination.stats} function. #' #' @usage #' contamination.stats(.data1, .data2, .limit = 20, .col = 'Read.count') #' #' decontamination(.data1, .data2, .limit = 20, .col = 'Read.count', .symm = T) #' #' @param .data1 First data frame with columns 'CDR3.nucleotide.sequence' and 'Read.count'. Will be checked for contamination. #' @param .data2 Second data frame with such columns. Will be used for checking for sequences which contaminated the first one. #' @param .limit Parameter for filtering: all sequences from \code{.data1} which are presented in \code{.data2} and (count of in \code{.data2}) / (count of seq in \code{.data1}) >= \code{.limit} are removed. #' @param .col Column's name with clonal count. #' @param .symm if T then perform filtering out of sequences in .data1, and then from .data2. Else only from .data1. #' #' @return Filtered \code{.data1} or a list with filtered both \code{.data1} and \code{.data2}. contamination.stats <- function (.data1, .data2, .limit = 20, .col = 'Read.count') { if (has.class(.data1, 'list') && has.class(.data2, 'list')) { res1 <- sapply(1:length(.data1), function (i) contamination.stats(.data1[[i]], .data2[[i]], .limit, .col)) colnames(res1) <- paste0(names(.data1), ':', names(.data2)) res2 <- sapply(1:length(.data1), function (i) contamination.stats(.data2[[i]], .data1[[i]], .limit, .col)) colnames(res2) <- paste0(names(.data2), ':', names(.data1)) return(cbind(res1, res2)) } inds <- intersectIndices(.data1$CDR3.nucleotide.sequence, .data2$CDR3.nucleotide.sequence, 'exact') logic <- .data2[inds[,2], .col] / .data1[inds[,1], .col] >= .limit counts <- .data1[logic, .col] c(Nclones.del = length(counts), summary(counts)) } decontamination <- function (.data1, .data2, .limit = 20, .col = 'Read.count', .symm = T) { .filter <- function (.data1, .data2, .limit, .col) { inds <- intersectIndices(.data1$CDR3.nucleotide.sequence, .data2$CDR3.nucleotide.sequence, 'exact') logic <- .data2[inds[,2], .col] / .data1[inds[,1], .col] >= .limit .data1[!logic, ] } if (has.class(.data1, 'list') && has.class(.data2, 'list')) { res <- lapply(1:length(.data1), function (i) decontamination(.data1[[i]], .data2[[i]], .limit, .col, T)) return(res) } if (.symm) { list(First = .filter(.data1, .data2, .limit, .col), Second = .filter(.data2, .data1, .limit, .col)) } else { .filter(.data1, .data2, .limit, .col) } }tcR/R/stats.R0000644000176200001440000006025213667026401012476 0ustar liggesusers########## Repertoire statistics ########## #' In-frame / out-of-frame sequences filter. #' #' @aliases get.inframes get.outframes count.inframes count.outframes get.frames count.frames clonotypescount #' #' @description #' Return the given data frame with in-frame or out-of-frame sequences only. Nucleotide sequences in a column "CDR3.nucleotide.sequence" are checked if #' they length are divisible by 3 (len mod 3 == 0 => in-frame, else out-of-frame) #' #' @usage #' get.inframes(.data, .head = 0, .coding = T) #' #' get.outframes(.data, .head = 0) #' #' count.inframes(.data, .head = 0, .coding = T) #' #' count.outframes(.data, .head = 0) #' #' get.frames(.data, .frame = c('in', 'out', 'all'), .head = 0, .coding = T) #' #' count.frames(.data, .frame = c('in', 'out', 'all'), .head = 0, .coding = T) #' #' @param .data MiTCR data.frame or a list with mitcr data.frames. #' @param .frame Which *-frames to choose. #' @param .head Parameter to the head() function. Supply 0 to get all elements. \code{head} applied before subsetting, i.e. #' if .head == 500, you will get in-frames from the top 500 clonotypes. #' @param .coding if T then return only coding sequences, i.e. without stop-codon. #' #' @return Filtered data.frame or a list with such data.frames. get.inframes <- function (.data, .head = 0, .coding = T) { if (class(.data) == 'list') { return(lapply(.data, get.inframes, .head = .head, .coding = .coding)) } .data <- head(.data, if (.head == 0) {nrow(.data)} else {.head}) if (.coding) { d <- subset(.data, nchar(.data$CDR3.nucleotide.sequence) %% 3 == 0) d[grep('[*, ~]', d$CDR3.amino.acid.sequence, invert = T), ] } else { subset(.data, nchar(.data$CDR3.nucleotide.sequence) %% 3 == 0) } } get.outframes <- function (.data, .head = 0) { if (class(.data) == 'list') { return(lapply(.data, get.outframes, .head = .head)) } .data <- head(.data, if (.head == 0) {nrow(.data)} else {.head}) subset(.data, nchar(.data$CDR3.nucleotide.sequence) %% 3 != 0) } count.inframes <- function (.data, .head = 0, .coding = T) { if (class(.data) == 'list') { sapply(get.inframes(.data, .head, .coding), nrow) } else { nrow(get.inframes(.data, .head, .coding)) } } count.outframes <- function (.data, .head = 0) { if (class(.data) == 'list') { sapply(get.outframes(.data, .head), nrow) } else { nrow(get.outframes(.data, .head)) } } get.frames <- function (.data, .frame = c('in', 'out', 'all'), .head = 0, .coding = T) { if (.frame[1] == 'in') { get.inframes(.data, .head, .coding) } else if (.frame[1] == 'out') { get.outframes(.data, .head) } else { head(.data, if (.head == 0) {nrow(.data)} else {.head}) } } count.frames <- function (.data, .frame = c('in', 'out', 'all'), .head = 0, .coding = T) { if (.frame[1] == 'in') { count.inframes(.data, .head, .coding) } else if (.frame[1] == 'out') { count.outframes(.data, .head) } else { nrow(head(.data, if (.head == 0) {nrow(.data)} else {.head})) } } clonotypescount <- function(.data, .head = 0) { length(unique(as.character(head(.data, if (.head == 0) {nrow(.data)} else {.head})$CDR3.amino.acid.sequence))) } #' MiTCR data frame basic statistics. #' #' @aliases cloneset.stats repseq.stats #' #' @usage #' cloneset.stats(.data, .head = 0) #' #' repseq.stats(.data, .head = 0) #' #' @description #' Compute basic statistics of TCR repertoires: number of clones, number of clonotypes, #' number of in-frame and out-of-frame sequences, summary of "Read.count", "Umi.count" and other. #' #' @param .data tcR data frames or a list with tcR data frames. #' @param .head How many top clones use to comput summary. #' #' @return if \code{.data} is a data frame, than numeric vector with statistics. If \code{.data} is #' a list with data frames, than matrix with statistics for each data frame. #' #' @examples #' \dontrun{ #' # Compute basic statistics of list with data frames. #' cloneset.stats(immdata) #' repseq.stats(immdata) #' } cloneset.stats <- function (.data, .head = 0) { if (has.class(.data, 'list')) { res <- t(do.call(cbind, lapply(.data, cloneset.stats, .head = .head))) row.names(res) <- names(.data) return(res) } .head <- if (.head == 0) {nrow(.data)} else {.head} res <- c(as.numeric(.head), clonotypescount(.data, .head), clonotypescount(.data, .head) / .head, count.inframes(.data, .head), count.inframes(.data, .head) / .head, count.outframes(.data, .head), count.outframes(.data, .head) / .head) names(res) <- c('#Nucleotide clones','#Aminoacid clonotypes', '%Aminoacid clonotypes', '#In-frames', '%In-frames', '#Out-of-frames', '%Out-of-frames') .data <- head(.data, .head) res2 <- c(Sum = sum(.data$Read.count), summary(.data$Read.count)) names(res2) <- sub('.', '', names(res2), fixed = T) names(res2) <- paste0(names(res2), '.reads') if (!is.na(.data$Umi.count)[1]) { res3 <- c(Sum = sum(.data$Umi.count), summary(.data$Umi.count)) names(res3) <- sub('.', '', names(res3), fixed = T) names(res3) <- paste0(names(res3), '.UMIs') res2 <- c(res2, res3) } c(res, res2) } repseq.stats = function(.data, .head=0) { if (has.class(.data, "list")) { res=do.call(cbind, lapply(.data, repseq.stats, .head=.head)) dimnames(res)[[2]]=names(.data) return(t(res)) }else{ .umi <- !is.na(.data$Umi.count[1]) .head= if (.head==0){nrow(.data)} else {.head} .data=head(.data, .head) if (!.umi) { res=c(nrow(.data), sum(.data$'Read.count'), round(sum(.data$'Read.count')/nrow(.data), digits = 2)) names(res)=c('Clones', "Sum.reads", "Reads.per.clone") return(res) }else{ res=c(nrow(.data), sum(.data$'Read.count'), sum(.data$'Umi.count'), round(sum(.data$'Read.count') / sum(.data$'Umi.count'), digits = 2), round(sum(.data$'Umi.count') / nrow(.data), digits = 2)) names(res)=c('Clones', "Sum.reads", "Sum.UMIs", "Reads.per.UMI", "UMI.per.clone") return(res) } } } #' Columns statistics. #' #' @aliases column.summary insertion.stats #' #' @usage #' column.summary(.data, .factor.col, .target.col, .alphabet = NA, .remove.neg = T) #' #' insertion.stats(.data) #' #' @description #' \code{column.summary} - general function for computing summary statistics (using the \code{summary} function) for columns of the given mitcr data.frame: #' divide \code{.factor.column} by factors from \code{.alphabet} and compute statistics #' of correspondingly divided \code{.target.column}. #' #' \code{insertion.stats} - compute statistics of insertions for the given mitcr data.frame. #' #' @param .data Data frame with columns \code{.factor.col} and \code{target.col} #' @param .factor.col Columns with factors by which the data will be divided to subsets. #' @param .target.col Column with numeric values for computing summaries after dividing the data to subsets. #' @param .alphabet Character vector of factor levels. If NA than use all possible elements frim the \code{.factor.col} column. #' @param .remove.neg Remove all elements which >-1 from the \code{.target.col} column. #' #' @seealso \link{summary} #' #' @return Data.frame with first column with levels of factors and 5 columns with output from the \code{summary} function. #' #' @examples #' \dontrun{ #' # Compute summary statistics of VD insertions #' # for each V-segment using all V-segments in the given data frame. #' column.summary(immdata[[1]], 'V.gene', 'Total.insertions') #' # Compute summary statistics of VD insertions for each V-segment using only V-segments #' # from the HUMAN_TRBV_MITCR #' column.summary(immdata[[1]], 'V.gene', 'Total.insertions', HUMAN_TRBV_MITCR) #' } column.summary <- function (.data, .factor.col, .target.col, .alphabet = NA, .remove.neg = T) { if (length(.alphabet) != 0 && !is.na(.alphabet[1])) { .data[!(.data[, .factor.col] %in% .alphabet), .factor.col] <- 'Other' } if (.remove.neg) { .data <- .data[.data[, .target.col] > -1, ] } res <- do.call(rbind, tapply(.data[, .target.col], .data[, .factor.col], function (x) c(summary(x)))) res <- data.frame(A = row.names(res), res, stringsAsFactors=F) names(res)[1] <- .factor.col row.names(res) <- NULL res } insertion.stats <- function (.data) { if (class(.data) == 'list') { return(lapply(.data, insertion.stats)) } vd <- column.summary(.data, 'V.gene', 'VD.insertions', HUMAN_TRBV_MITCR) names(vd)[-1] <- paste0('VD.', names(vd)[-1]) dj <- column.summary(.data, 'V.gene', 'DJ.insertions', HUMAN_TRBV_MITCR) names(dj)[-1] <- paste0('DJ.', names(dj)[-1]) tot <- column.summary(.data, 'V.gene', 'Total.insertions', HUMAN_TRBV_MITCR) names(tot)[-1] <- paste0('Total.', names(tot)[-1]) res <- merge(vd, dj, by = 'V.gene', all = T) res <- merge(res, tot, by = 'V.gene', all = T) res } #' Find target clonotypes and get columns' value corresponded to that clonotypes. #' #' @description #' Find the given target clonotypes in the given list of data.frames and get corresponding values of desired columns. #' #' @param .data List with mitcr data.frames or a mitcr data.frame. #' @param .targets Target sequences or elements to search. Either character vector or a matrix / data frame (not a data table!) with two columns: first for sequences, second for V-segments. #' @param .method Method, which will be used to find clonotypes: #' #' - "exact" performs exact matching of targets; #' #' - "hamm" finds targets and close sequences using hamming distance <= 1; #' #' - "lev" finds targets and close sequences using levenshtein distance <= 1. #' #' @param .col.name Character vector with column names which values should be returned. #' @param .target.col Character vector specifying name of columns in which function will search for a targets. #' Only first column's name will be used for matching by different method, others will match exactly. #' \code{.targets} should be a two-column character matrix or data frame with second column for V-segments. #' @param .verbose if T then print messages about the search process. #' #' @return Data.frame. #' #' @examples #' \dontrun{ #' # Get ranks of all given sequences in a list of data frames. #' immdata <- set.rank(immdata) #' find.clonotypes(.data = immdata, .targets = head(immdata[[1]]$CDR3.amino.acid.sequence), #' .method = 'exact', .col.name = "Rank", .target.col = "CDR3.amino.acid.sequence") #' # Find close by levenhstein distance clonotypes with similar V-segments and return #' # their values in columns 'Read.count' and 'Total.insertions'. #' find.clonotypes(.data = twb, .targets = twb[[1]][, c('CDR3.amino.acid.sequence', 'V.gene')], #' .col.name = c('Read.count', 'Total.insertions'), .method = 'lev', #' .target.col = c('CDR3.amino.acid.sequence', 'V.gene')) #' } find.clonotypes <- function (.data, .targets, .method = c('exact', 'hamm', 'lev'), .col.name = 'Read.count', .target.col = 'CDR3.amino.acid.sequence', .verbose = T) { if (is.character(.targets) && length(.target.col) != 1) { cat("Target columns doesn't match the given .targets!\n") return() } if (!is.character(.targets) && ncol(.targets) != length(.target.col)) { cat("Target columns doesn't match the given .targets!\n") return() } if (has.class(.data, 'data.frame')) { .data <- list(Sample = .data) } if (.method[1] == 'lev') { .data <- lapply(.data, function (.data) .data[grep('[*, ~]', .data[, .target.col[1]], invert = T),]) } .verbose.msg('Searching for targets...\n', .verbose) if (.verbose) pb <- set.pb(length(.data)) dt.list <- list() for (i in 1:length(.data)) { if (.verbose) add.pb(pb) if (length(.target.col) == 1) { inds <- intersectIndices(.targets, .data[[i]][, .target.col], .method) } else { colnames(.targets) <- .target.col inds <- intersectIndices(.targets, .data[[i]][, .target.col], .method, .target.col) } inds <- inds[!duplicated(inds[,2]),] if(!is.matrix(inds)) { inds <- rbind(inds) } if (dim(inds)[1] == 0) { inds <- matrix(c(NA, NA), 1, 2) } res <- list() if (!is.na(inds[1,1])) { for (col.name in .col.name) { res[[col.name]] <- .data[[i]][inds[,2], col.name] } dt.list[[names(.data)[i]]] <- as.data.table(data.frame(.data[[i]][inds[,2], .target.col], res, stringsAsFactors = F), F) setnames(dt.list[[names(.data)[i]]], c(.target.col, .col.name)) setkeyv(dt.list[[names(.data)[i]]], .target.col) tc <- dt.list[[names(.data)[i]]][[.target.col[1]]] dups <- duplicated(tc) dups.i <- rep.int(0, length(dups)) k <- 1 for (j in 1:length(dups)) { if (dups[j]) { dups.i[j] <- k k <- k + 1 } else { k <- 1 } } dt.list[[names(.data)[i]]][[.target.col[1]]] <- sapply(1:length(tc), function (k) { if (k > 1) { if (tc[k] == tc[k-1]) { paste0(tc[k], '.', dups.i[k]) } else { tc[k] } } else { tc[k] } }, USE.NAMES = F) } else { dt.list[[names(.data)[i]]] <- do.call(data.table, sapply(c(.target.col, .col.name), function (cn) { x <- NA class(x) <- class(.data[[1]][1, cn]) if (length(.target.col) == 1) { rep(x, times = length(.targets)) } else { rep(x, times = nrow(.targets)) } }, simplify = F)) if (length(.target.col) == 1) { dt.list[[names(.data)[i]]][[.target.col]] <- .targets } else { for (tc in .target.col) { dt.list[[names(.data)[i]]][[tc]] <- .targets[[tc]] } } setnames(dt.list[[names(.data)[i]]], c(.target.col, .col.name)) setkeyv(dt.list[[names(.data)[i]]], .target.col) } } if (.verbose) close(pb) res <- dt.list[[1]] if (length(dt.list) > 1) { for (i in 2:length(dt.list)) { res <- merge(res, dt.list[[i]], by = .target.col, all = T, allow.cartesian = T, suffixes = paste0('.', c(names(dt.list)[i-1], names(dt.list)[i]))) } } for (i in 1:length(.col.name)) { if (.col.name[i] %in% names(res)) { setnames(res, .col.name[i], paste0(.col.name[i], '.', names(dt.list)[length(dt.list)])) } } res <- as.data.frame(res, stringsAsFactors = F) if (length(.col.name) > 1) { res <- res[, c(1:length(.target.col), cbind(seq(length(.target.col) + 1, ncol(res), 2), seq(length(.target.col) + 2, ncol(res), 2)))] } res[[.target.col[1]]] <- sapply(strsplit(res[[.target.col[1]]], '.', T, F, T), '[', 1, USE.NAMES = F) res <- res[order(res[[.target.col[1]]]),] tc <- res[[.target.col[1]]] dups <- duplicated(tc) dups.i <- rep('', length(dups)) k <- 1 for (j in 1:length(dups)) { if (dups[j]) { dups.i[j] <- paste0('.', as.character(k)) k <- k + 1 } else { k <- 1 } } row.names(res) <- paste0(res[[.target.col[1]]], dups.i) res } #' Perform sequential cross starting from the top of a data frame. #' #' @aliases top.cross top.cross.vec top.cross.plot #' #' @description #' \code{top.cross} - get top crosses of the given type between each pair of the given data.frames with \code{top.cross} function. #' #' \code{top.cross.vec} - get vector of cross values for each top with the \code{top.cross.vec} function. #' #' \code{top.cross.plot} - plot a plots with result with the \code{top.cross.plot} function. #' #' @usage #' top.cross(.data, .n = NA, .data2 = NULL, .type = 'ave', .norm = F, .verbose = T) #' #' top.cross.vec(.top.cross.res, .i, .j) #' #' top.cross.plot(.top.cross.res, .xlab = 'Top X clonotypes', #' .ylab = 'Normalised number of shared clonotypes', .nrow = 2, #' .legend.ncol = 1, .logx = T, .logy = T) #' #' @param .data Either list of data.frames or a data.frame. #' @param .n Integer vector of parameter appled to the head function; same as .n in the top.fun function. See "Details" for more information. #' @param .data2 Second data.frame or NULL if .data is a list. #' @param .type Parameter .type to the \code{tcR::intersect} function. #' @param .norm Parameter .norm to the \code{tcR::intersect} function. #' @param .top.cross.res Result from the \code{top.cross} function. #' @param .i,.j Coordinate of a cell in each matrix. #' @param .xlab Name for a x-lab. #' @param .ylab Name for a y-lab. #' @param .nrow Number of rows of sub-plots in the output plot. #' @param .legend.ncol Number of columns in the output legend. #' @param .logx if T then transform x-axis to log-scale. #' @param .logy if T then transform y-axis to log-scale. #' @param .verbose if T then plot a progress bar. #' #' @return #' \code{top.cross} - return list for each element in \code{.n} with intersection matrix (from \code{tcR::intersectClonesets}). #' #' \code{top.cross.vec} - vector of length \code{.n} with \code{.i}:\code{.j} elements of each matrix. #' #' \code{top.cross.plot} - grid / ggplot object. #' #' @details #' Parameter \code{.n} can have two possible values. It could be either integer vector of numbers (same as in the \code{top.fun} function) or #' NA and then it will be replaced internally by the value \code{.n <- seq(5000, min(sapply(.data, nrow)), 5000)}. #' #' @seealso \code{\link{intersect}} #' #' @examples #' \dontrun{ #' immdata.top <- top.cross(immdata) #' top.cross.plot(immdata.top) #' } top.cross <- function (.data, .n = NA, .data2 = NULL, .type = 'ave', .norm = F, .verbose = T) { if (!is.null(.data2)) { .data <- list(.data, .data2) } if (is.na(.n)[1]) { .n <- seq(5000, min(sapply(.data, nrow)), 5000) } # res <- lapply(.n, function(i) apply.symm(.data, cross, .head = i, .type = .type, .norm = .norm, .verbose=F)) res <- lapply(.n, function(i) { if (.verbose) cat('Head == ', i, ' :\n', sep = '') intersectClonesets(.data, .type, .head = i, .norm = .norm, .verbose = .verbose)}) names(res) <- .n res } top.cross.vec <- function (.top.cross.res, .i, .j) { sapply(.top.cross.res, function (mat) mat[.i, .j] ) } top.cross.plot <- function (.top.cross.res, .xlab = 'Top X clonotypes', .ylab = 'Normalised number of shared clonotypes', .nrow = 2, .legend.ncol = 1, .logx = T, .logy = T) { data.names <- colnames(.top.cross.res[[1]]) len <- length(data.names) ps <- lapply(1:len, function (i) { data <- data.frame(Top = as.numeric(names(.top.cross.res)), sapply((1:len), function (j) { res <- top.cross.vec(.top.cross.res, i, j) # res[is.na(res)] <- 0 res }), sapply((1:len), function (j) { rep(data.names[j], times=length(.top.cross.res)) })) names(data) <- c('Top', data.names, paste0(data.names, 'C')) p <- ggplot(data = data) for (j in (1:len)) { p <- p + geom_point(aes_string(x = 'Top', y = data.names[j], color = paste0(data.names[j], 'C'))) + geom_line(aes_string(x = 'Top', y = data.names[j], color = paste0(data.names[j], 'C'))) + xlab(.xlab) + ylab(.ylab) + theme_linedraw() } p + ggtitle(data.names[i]) + theme(legend.position = 'none') if (.logx) { p <- p + scale_x_log10() } if (.logy) { p <- p + scale_y_log10() } p <- p + .colourblind.discrete(len, T) } ) data <- data.frame(Top = as.numeric(names(.top.cross.res)), sapply((1:len), function (j) rep.int(1, length(.top.cross.res))), sapply((1:len), function (j) rep(data.names[j], times=length(.top.cross.res)))) names(data) <- c('Top', data.names, paste0(data.names, 'C')) p <- ggplot(data = data) for (j in (1:len)) { p <- p + geom_point(aes_string(x = 'Top', y = data.names[j], color = paste0(data.names[j], 'C'))) } # add.legend(ps, .nrow, .legend.ncol) sample.plot <- p + .colourblind.discrete(len, T) leg <- gtable_filter(ggplot_gtable(ggplot_build(sample.plot + guides(colour=guide_legend(title = 'Subject', ncol=.legend.ncol)))), "guide-box") grid.arrange(do.call(arrangeGrob, c(lapply(ps, function (x) x + theme(legend.position="none")), nrow = .nrow)), leg, widths=unit.c(unit(1, "npc") - leg$width, leg$width), nrow = 1, top ='Top crosses') # arrangeGrob(do.call(arrangeGrob, c(ps[1:2], nrow = .nrow)), leg, widths=unit.c(unit(1, "npc") - leg$width, leg$width), nrow = 1, top ='Top cross') } #' Bootstrap for data frames in package tcR. #' #' @description #' Resample rows (i.e., clones) in the given data frame and apply the given function to them. #' #' @param .data Data frame. #' @param .fun Function applied to each sample. #' @param .n Number of iterations (i.e., size of a resulting distribution). #' @param .size Size of samples. For \code{.sim} == "uniform" stands for number of rows to take. #' For \code{.sim} == "percentage" stands for number of UMIs / read counts to take. #' @param .sim A character string indicating the type of simulation required. Possible values are #' "uniform" or "percentage". See "Details" for more details of type of simulation. #' @param .postfun Function applied to the resulting list: list of results from each processed sample. #' @param .verbose if T then show progress bar. #' @param .prop.col Column with proportions for each clonotype. #' @param ... Further values passed to \code{.fun}. #' #' @return #' Either result from \code{.postfun} or list of length \code{.n} with values of \code{.fun}. #' #' @details #' Argument \code{.sim} can take two possible values: "uniform" (for uniform distribution), when #' each row can be taken with equal probability, and "perccentage" when each row can be taken with #' probability equal to its "Read.proportion" column. #' #' @examples #' \dontrun{ #' # Apply entropy.seg function to samples of size 20000 from immdata$B data frame for 100 iterations. #' bootstrap.tcr(immdata[[2]], .fun = entropy.seg, .n = 100, .size = 20000, .sim = 'uniform') #' } bootstrap.tcr <- function (.data, .fun = entropy.seg, .n = 1000, .size = nrow(.data), .sim = c('uniform', 'percentage'), .postfun = function (x) { unlist(x) }, .verbose = T, .prop.col = 'Read.proportion', ...) { .sample.fun <- function (d) { d[sample(1:nrow(d), .size, T),] } if (.sim[1] == 'percentage') { .sample.fun <- function (d) { new.reads <- rmultinom(1, .size, d[, .prop.col]) d$Read.count <- new.reads d[, .prop.col] <- new.reads / sum(new.reads) d[new.reads > 0,] } } if (.verbose) { pb <- set.pb(.n) } res <- lapply(1:.n, function (n) { if (.verbose) { add.pb(pb) } .fun(.sample.fun(.data), ...) }) if (.verbose) { close(pb) } .postfun(res) } # mean + IQR #' Clonal space homeostasis. #' #' @description #' Compute clonal space homeostatsis - statistics of how many space occupied by clones #' with specific proportions. #' #' @param .data Cloneset data frame or list with such data frames. #' @param .clone.types Named numeric vector. #' @param .prop.col Which column to use for counting proportions. #' #' @seealso \link{vis.clonal.space} #' #' @examples #' \dontrun{ #' data(twb) #' # Compute summary space of clones, that occupy #' # [0, .05) and [.05, 1] proportion. #' clonal.space.homeostasis(twb, c(Low = .05, High = 1))) #' # Low (0 < X <= 0.05) High (0.05 < X <= 1) #' # Subj.A 0.9421980 0.05780198 #' # Subj.B 0.9239454 0.07605463 #' # Subj.C 0.8279270 0.17207296 #' # Subj.D 1.0000000 0.00000000 #' # I.e., for Subj.D sum of all read proportions for clones #' # which have read proportion between 0 and .05 is equal to 1. #' } clonal.space.homeostasis <- function (.data, .clone.types = c(Rare = .00001, Small = .0001, Medium = .001, Large = .01, Hyperexpanded = 1), .prop.col = 'Read.proportion') { .clone.types <- c(None = 0, .clone.types) if (has.class(.data, 'data.frame')) { .data <- list(Sample = .data) } mat <- matrix(0, length(.data), length(.clone.types) - 1, dimnames = list(names(.data), names(.clone.types)[-1])) .data <- lapply(.data, '[[', .prop.col) for (i in 2:length(.clone.types)) { mat[,i-1] <- sapply(.data, function (x) sum(x[x > .clone.types[i-1] & x <= .clone.types[i]])) colnames(mat)[i-1] <- paste0(names(.clone.types[i]), ' (', .clone.types[i-1], ' < X <= ', .clone.types[i], ')') } mat }tcR/R/repdiversity.R0000644000176200001440000000671313667027733014104 0ustar liggesusers#' General function for the repertoire diversity estimation. #' #' @description #' General interface to all cloneset diversity functions. #' #' @param .data Cloneset or a list of clonesets. #' @param .method Which method to use for the diversity estimation. See "Details" for methods. #' @param .quant Which column to use for the quantity of clonotypes: "read.count" for the "Read.count" column, #' "umi.count" for the "Umi.count" column, "read.prop" for the "Read.proportion" column, "umi.prop" for #' the "Umi.proportion" column. #' @param .q q-parameter for the Diversity index. #' @param .norm If T than compute the normsalised entropy. #' @param .do.norm One of the three values - NA, T or F. If NA than check for distrubution (sum(.data) == 1) #' and normalise it with the given laplace correction value if needed. if T then do normalisation and laplace #' correction. If F than don't do normalisaton and laplace correction. #' @param .laplace Value for Laplace correction. #' #' @details #' You can see a more detailed description for each diversity method at \link{diversity}. #' #' Parameter \code{.method} can have one of the following value each corresponding to the specific method: #' #' - "div" for the true diversity, or the effective number of types (basic function \code{diversity}). #' #' - "inv.simp" for the inverse Simpson index (basic function \code{inverse.simpson}). #' #' - "gini" for the Gini coefficient (basic function \code{gini}). #' #' - "gini.simp" for the Gini-Simpson index (basic function \code{gini.simpson}). #' #' - "chao1" for the Chao1 estimator (basic function \code{chao1}). #' #' - "entropy" for the Shannon entropy measure (basic function \code{entropy}). #' #' @seealso \link{diversity}, \link{entropy} #' #' @examples #' \dontrun{ #' data(twb) #' twb.div <- repDiversity(twb, "chao1", "read.count") #' } repDiversity <- function (.data, .method = c("chao1", "gini.simp", "inv.simp", "gini", "div", "entropy"), .quant = c("read.count", "umi.count", "read.prop", "umi.prop"), .q = 5, .norm = F, .do.norm = NA, .laplace = 0) { message(" ======================================== !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !! The tcR package WILL SOON BE ORPHANED !! AND REMOVED FROM CRAN. !! !! A new package is available that is !! designed to replace tcR: !! immunarch -- https://immunarch.com/ !! !! We will be happy to help you to move !! to the new package. Feel free to contact us: !! http://github.com/immunomind/immunarch !! !! Sincerely, !! immunarch dev team and !! Vadim I. Nazarov, lead developer of tcR !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! =======================================") quant <- .column.choice(.quant, T) fun <- switch(.method[1], chao1 = function (x, ...) chao1(x), gini.simp = gini.simpson, inv.simp = inverse.simpson, gini = gini, div = function (x, ...) diversity(x, .q = .q, ...), entropy = function (x, ...) entropy(x, .norm = .norm, ...), { .verbose.msg("You have specified an invalid method identifier. Selected method: chao1\n", T); chao1 }) if (has.class(.data, 'data.frame')) { .data <- list(Sample = .data) } .data <- .fix.listnames(.data) sapply(.data, function (x) fun(x[[quant]], .do.norm = .do.norm, .laplace = .laplace)) }tcR/R/plots.R0000644000176200001440000011236113667026401012500 0ustar liggesusers########## Various plotting functions ########## if (getRversion() >= "2.15.1") { utils::globalVariables(c("Segment", 'Size', 'Freq', 'Sample', 'V.gene', 'J.gene', '..count..', 'Time.point', 'Proportion', 'Sequence', 'Lower', 'Upper', 'Lengths', 'Read.count', 'Var', 'Value', 'Group', 'variable', 'name', 'value', 'Kmers', 'Count', 'People', 'First', 'Second', 'Var1', 'Q0.025', 'Q0.975', 'Mean', 'Type', 'Clone.size', 'Q1', 'Q2', 'Symbol', 'Gene', 'Genes', 'Sample', 'label', 'Xrep', 'Yrep', 'Clonotype')) } # red - yellow - green .ryg.gradient <- function (.min = NA, .max = NA) { cs <- c('#66FF00', '#FFFF66', '#FF6633') if (!is.na(.min)) { scale_fill_gradientn(limits = c(.min, .max), colours = cs, na.value = 'grey60') } else { scale_fill_gradientn(colours = cs, na.value = 'grey60') } } # white/orange/yellow - green - blue # colourblind - friendly # for fill .colourblind.gradient <- function (.min = NA, .max = NA, .colour = F) { # cs <- c("#FFFFD9", "#41B6C4", "#225EA8") # cs <- c("#FFFFBB", "#41B6C4", "#225EA8") # cs <- c("#FFBB00", "#41B6C4", "#225EA8") <- old version # cs <- c("#FF4B20", "#FFB433", "#C6EDEC", "#85CFFF", "#0348A6") # cs <- c("#FF4B20", "#FFB433", "#C6FDEC", "#7AC5FF", "#0348A6") # scale_fill_gradientn(guide='colourbar', colours=c("#0072B2", "#EEEEEE", "#D55E00") cs <- c(c("#0072B2", "#EEEEEE", "#D55E00")) if (!is.na(.min)) { if (.colour) { scale_colour_gradientn(limits = c(.min, .max), guide='colorbar', colours = cs, na.value = 'grey60') } else { scale_fill_gradientn(limits = c(.min, .max), guide='colorbar', colours = cs, na.value = 'grey60') } } else { if (.colour) { scale_colour_gradientn(colours = cs, na.value = 'grey60') } else { scale_fill_gradientn(colours = cs, na.value = 'grey60') } } } # white/orange/yellow - green - blue # colourblind - friendly # for fill and colour .colourblind.vector <- function() { c("#FF4B20", "#FFB433", "#C6FDEC", "#7AC5FF", "#0348A6") } .colourblind.discrete <- function (.n, .colour = F) { # cs <- c("#FFFFD9", "#41B6C4", "#225EA8") # cs <- c("#FFFFBB", "#41B6C4", "#225EA8") # cs <- c("#FFBB00", "#41B6C4", "#225EA8") <- old version # cs <- c("#FF4B20", "#FFB433", "#C6FDEC", "#7AC5FF", "#0348A6") cs <- .colourblind.vector() if (.colour) { scale_colour_manual(values = colorRampPalette(cs)(.n)) } else { scale_fill_manual(values = colorRampPalette(cs)(.n)) } } .colourblind.discrete2 <- function (.n, .colour = F) { # cs <- c("#FFFFD9", "#41B6C4", "#225EA8") # cs <- c("#FFFFBB", "#41B6C4", "#225EA8") cs <- c("#FFAB00", "#41B6C4", "#225EA8") # <- old version # cs <- c("#FF4B20", "#FFB433", "#C6FDEC", "#7AC5FF", "#0348A6") # cs <- c("#FF4B20", "#FFB433", "#0348A6") if (.colour) { scale_colour_manual(values = colorRampPalette(cs)(.n)) } else { scale_fill_manual(values = colorRampPalette(cs)(.n)) } } # light blues - dark blues # for fill .blues.gradient <- function (.min = NA, .max = NA) { cs <- c("#F7FBFF", "#9ECAE1", "#2171B5") if (!is.na(.min)) { scale_fill_gradientn(limits = c(.min, .max), colours = cs, na.value = 'grey60') } else { scale_fill_gradientn(colours = cs, na.value = 'grey60') } } #' Plot a histogram of lengths. #' #' @description #' Plot a histogram of distribution of lengths of CDR3 nucleotide sequences. On y-axis are sum of read counts for each length. #' #' @param .data Data frame with columns 'CDR3.nucleotide.sequence' and 'Read.count' or list with such data frames. #' @param .ncol If .data is a list, than number of columns in a grid of histograms for each data frame in \code{.data}. Else not used. #' @param .name Title for this plot. #' @param .col Name of the column to use in computing the lengths distribution. #' #' @details #' If \code{.data} is a data frame, than one histogram will be plotted. Is \code{.data} is a list, than grid of histograms #' will be plotted. #' #' @return ggplot object. #' #' @examples #' \dontrun{ #' load('immdata.rda') #' # Plot one histogram with main title. #' vis.count.len(immdata[[1]], 'Main title here') #' # Plot a grid of histograms with 2 columns. #' vis.count.len(immdata, 2) #' } vis.count.len <- function (.data, .ncol = 3, .name = "", .col = 'Read.count') { if (has.class(.data, 'list')) { return(do.call(grid.arrange, c(lapply(1:length(.data), function (i) vis.count.len(.data[[i]], .col = .col, .name = names(.data)[i])), ncol = .ncol))) } tmp <- aggregate(as.formula(paste0(.col, " ~ nchar(CDR3.nucleotide.sequence)")), .data, sum) names(tmp) <- c('Lengths', "Count") ggplot() + geom_bar(aes(x = Lengths, y = Count, fill = Count), data = tmp, stat = 'identity', colour = 'black') + .colourblind.gradient(min(tmp$Count), max(tmp$Count)) + ggtitle(.name) + theme_linedraw() } #' Plot a histogram of counts. #' #' @description #' Plot a histogram of distribution of counts of CDR3 nucleotide sequences. On y-axis are number of counts. #' #' @param .data Cloneset data frame or a list of clonesets. #' @param .ncol If .data is a list, than number of columns in a grid of histograms for each data frame in \code{.data}. Else not used. #' @param .name Title for this plot. #' @param .col Name of the column with counts. #' #' @details #' If \code{.data} is a data frame, than one histogram will be plotted. Is \code{.data} is a list, than grid of histograms #' will be plotted. #' #' @return ggplot object. #' #' @examples #' \dontrun{ #' load('immdata.rda') #' # Plot one histogram with main title. #' vis.number.count(immdata[[1]], 'Main title here') #' # Plot a grid of histograms with 2 columns. #' vis.number.count(immdata, 2) #' } vis.number.count <- function (.data, .ncol = 3, .name = 'Histogram of clonotypes read counts', .col = "Read.count") { # cat('Limits for x-axis set to (0,50). Transform y-axis to sqrt(y).\n') if (has.class(.data, 'list')) { return(do.call(grid.arrange, c(lapply(1:length(.data), function (i) vis.number.count(.data[[i]], .col = .col, .name = names(.data)[i])), ncol = .ncol))) } counts <- data.frame(Count = .data[[.col]]) ggplot() + xlim(min(counts$Count), 300) + ylab('Frequency') + geom_histogram(aes(x = Count, fill = ..count..), data = counts, binwidth = 1, colour = 'black') + coord_trans(x = 'log10') + scale_y_log10() + ggtitle(.name) + .colourblind.gradient() + theme_linedraw() } #' Heatmap. #' #' @aliases vis.heatmap #' #' @description #' Plot a heatmap from a matrix or a data.frame #' #' @param .data Either a matrix with colnames and rownames specifyed or a data.frame with the first column of #' strings for row names and other columns stands for values. #' @param .title Main title of the plot. #' @param .labs Labs names. Character vector of length 2 (for naming x-axis and y-axis). #' @param .legend Title for the legend. #' @param .na.value Replace NAs with this values. #' @param .text if T then print \code{.data} values at tiles. #' @param .scientific If T then force show scientific values in the heatmap plot. #' @param .signif.digits Number of significant digits to show. Default - 4. #' @param .size.text Size for the text in the cells of the heatmap, 4 by default. #' @param .no.legend If T than remove the legend from the plot. #' @param .no.labs If T than remove x / y labels names from the plot. #' #' @return ggplot object. #' #' @examples #' \dontrun{ #' # Load your data. #' load('immdata.rda') #' # Perform cloneset overlap by amino acid sequences with V-segments. #' imm.av <- repOverlap(immdata, .seq = 'aa', .vgene = T) #' # Plot a heatmap. #' vis.heatmap(imm.av, .title = 'Immdata - (ave)-intersection') #' } vis.heatmap <- function (.data, .title = "Number of shared clonotypes", .labs = c('Sample', 'Sample'), .legend = 'Shared clonotypes', .na.value = NA, .text = T, .scientific = FALSE, .signif.digits = 4, .size.text = 4, .no.legend = F, .no.labs = F) { if (has.class(.data, 'data.frame')) { names <- .data[,1] .data <- as.matrix(.data[,-1]) row.names(.data) <- names } else if (is.null(dim(.data))) { .data = as.matrix(.data) } if (is.null(colnames(.data))) { colnames(.data) <- paste0('C', 1:ncol(.data)) } if (is.null(row.names(.data))) { row.names(.data) <- paste0('C', 1:nrow(.data)) } .data[is.na(.data)] <- .na.value tmp <- as.data.frame(.data) tmp$name <- row.names(.data) m <- melt(tmp, id.var = c('name')) m[,1] <- factor(m[,1], levels = rev(rownames(.data))) m[,2] <- factor(m[,2], levels = colnames(.data)) .cg <- .colourblind.gradient(min(m$value), max(m$value)) m$label <- format(m$value, scientific = .scientific, digits = .signif.digits) p <- ggplot(m, aes(x = variable, y = name, fill = value)) p <- p + geom_tile(aes(fill = value), colour = "white") if (.text) { p <- p + geom_text(aes(fill = value, label = label), size = .size.text) } # p <- p + geom_text(aes(fill = value, label = value)) # p <- p + .ryg.gradient(min(m$value), max(m$value)) p <- p + .cg # p <- p + .blues.gradient(min(m$value), max(m$value)) p <- p + ggtitle(.title) + guides(fill = guide_colourbar(title=.legend)) + xlab(.labs[1]) + ylab(.labs[2]) + coord_fixed() + theme_linedraw() + theme(axis.text.x = element_text(angle=90, vjust = .5)) + scale_x_discrete(expand=c(0,0)) + scale_y_discrete(expand=c(0,0)) if (.no.legend) { p <- p + theme(legend.position="none") } if (.no.labs) { p <- p + theme(axis.title.x = element_blank(), axis.title.y = element_blank()) } p } #' Boxplot for groups of observations. #' #' @aliases vis.group.boxplot #' #' @description #' Plot boxplots for each group. #' #' @param .data Either a matrix with colnames and rownames specifyed or a data frame with the first column of #' strings for row names and other columns stands for values. #' @param .groups Named list with character vectors for names of elements for each group. If NA than each #' member is in the individual group. #' @param .title Main title of the plot. #' @param .labs Labs names. Character vector of length 1 (for naming both axis with same name) or 2 (first elements stands for x-axis). #' @param .rotate.x if T then rotate x-axis. #' @param .violin If T then plot a violin plot. #' @param .notch "notch" parameter to the \code{geom_boxplot} ggplo2 function. #' @param ... Parameters passed to \code{melt}, applied to \code{.data} before plotting in \code{vis.group.boxplot}. #' #' @return ggplot object. #' #' @examples #' \dontrun{ #' names(immdata) # "A1" "A2" "B1" "B2" "C1" "C2" #' # Plot a boxplot for V-usage for each plot #' # three boxplots for each group. #' vis.group.boxplot(freq.Vb(immdata), #' list(A = c('A1', 'A2'), B = c('B1', 'B2'), C = c('C1', 'C2')), #' c('V segments', 'Frequency')) #' #' data(twb) #' ov <- repOverlap(twb) #' sb <- matrixSubgroups(ov, list(tw1 = c('Subj.A', 'Subj.B'), tw2 = c('Subj.C', 'Subj.D'))); #' vis.group.boxplot(sb) #' } vis.group.boxplot <- function (.data, .groups = NA, .labs = c('V genes', 'Frequency'), .title = '', .rotate.x = T, .violin = T, .notch = F, ...) { # if (has.class(.data, 'data.frame')) { # .data$Sample <- .data[,1] # .data <- .data[,c(1,3,2)] # } else { if (ncol(.data) > 2) { .data <- melt(.data, ...) } else { .data$Sample = .data[,1] .data = .data[,c(1,3,2)] } # } colnames(.data) <- c('Var', 'Sample', 'Value') .data$Group <- as.character(.data$Sample) if (!is.na(.groups)[1]) { for (i in 1:length(.groups)) { for (name in .groups[[i]]) { .data$Group[.data$Sample == name] <- names(.groups)[i] } } } p <- ggplot() + geom_boxplot(aes(x = Var, y = Value, fill = Group), data = .data, colour = 'black', notch = .notch) if (.violin) { p <- p +geom_violin(aes(x = Var, y = Value, fill = Group), alpha = .2, data = .data) } if (length(.labs) >= 2) { p <- p + xlab(.labs[1]) + ylab(.labs[2]) } p <- p + ggtitle(.title) + theme_linedraw() if (.rotate.x) { p <- p + theme(axis.text.x = element_text(angle=90)) } p + .colourblind.discrete(length(unique(.data$Group))) } #' Histogram of segments usage. #' #' @aliases vis.V.usage vis.J.usage #' #' @description #' Plot a histogram or a grid of histograms of V- / J-usage. #' #' @param .data Mitcr data frame or a list with mitcr data frames. #' @param .genes Gene alphabet passed to \link{geneUsage}. #' @param .main Main title of the plot. #' @param .ncol Number of columns in a grid of histograms if \code{.data} is a list and \code{.dodge} is F. #' @param .coord.flip if T then flip coordinates. #' @param .labs Character vector of length 2 with names for x-axis and y-axis. #' @param .dodge If \code{.data} is a list, than if this is T plot V-usage for all data frames to the one histogram. #' @param ... Parameter passed to \code{geneUsage}. By default the function compute V-usage or J-usage for beta chains #' w/o using read counts and w/ "Other" segments. #' #' @return ggplot object. #' #' @examples #' \dontrun{ #' # Load your data. #' load('immdata.rda') #' # Compute V-usage statistics. #' imm1.vs <- geneUsage(immdata[[1]], HUMAN_TRBV) #' vis.V.usage(immdata, HUMAN_TRBV, .main = 'Immdata V-usage [1]', .dodge = T) #' # Plot a histogram for one data frame using all gene segment data from V.gene column. #' vis.V.usage(imm1.vs, NA, .main = 'Immdata V-usage [1]') #' # Plot a grid of histograms - one histogram for V-usage for each data frame in .data. #' vis.V.usage(immdata, HUMAN_TRBV, .main = 'Immdata V-usage', .dodge = F, .other = F) #' } vis.gene.usage <- function (.data, .genes = NA, .main = "Gene usage", .ncol = 3, .coord.flip = F, .dodge = F, .labs = c("Gene", "Frequency"), ...) { if (!is.na(.genes[1])) { res <- geneUsage(.data, .genes, ...) } else { res <- .data } if (class(res[[2]]) != "factor") { res <- melt(res) res <- res[1:nrow(res), ] colnames(res) <- c('Gene', 'Sample', 'Freq') } if (length(unique(res$Sample)) > 1) { if (.dodge) { p = ggplot() + geom_bar(aes(x = Gene, y = Freq, fill = Sample), data = res, stat = 'identity', position = position_dodge(), colour = 'black') + theme_linedraw() + ggtitle(.main) + theme(axis.text.x = element_text(angle=90, vjust = .5)) + .colourblind.discrete(length(unique(res$Sample))) + scale_y_continuous(expand = c(.02,0)) + xlab(.labs[1]) + ylab(.labs[2]) if (.coord.flip) { p <- p + coord_flip() } p } else { res <- split(res, res$Sample) ps <- lapply(1:length(res), function (i) { vis.gene.usage(res[[i]], NA, names(res)[i], 0, .coord.flip, .labs = .labs, ...) }) do.call(grid.arrange, c(ps, ncol = .ncol, top = .main) ) } } else { p <- ggplot() + geom_bar(aes(x = Gene, y = Freq, fill = Freq), data = res, stat = 'identity', colour = 'black') if (.coord.flip) { p <- p + coord_flip() } p + theme_linedraw() + theme(axis.text.x = element_text(angle=90, vjust = .5)) + ggtitle(.main) + .colourblind.gradient() + scale_y_continuous(expand = c(.02,0)) + xlab(.labs[1]) + ylab(.labs[2]) } } #' PCA result visualisation #' #' @description #' Plot the given pca results with colour divided by the given groups. #' #' @param .data Result from prcomp() function or a data frame with two columns 'First' and 'Second' #' stands for the first PC and the second PC. #' @param .groups List with names for groups and indices of the group members. If NA than each #' member is in the individual group. #' @param .text If T than print the names of the subjects. #' #' @return ggplot object. #' #' @examples #' \dontrun{ #' data(twb) #' tmp = geneUsage(twb) #' vis.pca(prcomp(t(tmp[,-1]))) #' } vis.pca <- function (.data, .groups = NA, .text = T) { if (has.class(.data, 'data.frame')) { dnames <- row.names(.data) .data <- data.frame(First = .data[,1], Second = .data[,2], Sample = row.names(.data), Group = rep('group0', times = length(.data[,2])), stringsAsFactors=F) } else { dnames <- row.names(.data$x) .data <- data.frame(First = .data$x[,1], Second = .data$x[,2], Sample = row.names(.data$x), Group = rep('group0', times = length(.data$x[,2])), stringsAsFactors=F) } if (is.na(.groups[1])) { .groups <- lapply(1:nrow(.data), function (i) i) names(.groups) <- dnames } for (i in 1:length(.groups)) { for (j in 1:length(.groups[[i]])) { .data$Group[.groups[[i]][j]] <- names(.groups)[i] } } p = ggplot() + geom_point(aes(x = First, y = Second, colour = Group), size = 3, data = .data) if (.text) { p = p + geom_text(aes(x = First, y = Second, label = Sample, colour = Group), data = .data, hjust=0, vjust=0) } p = p + theme_linedraw() + .colourblind.discrete2(length(.groups), T) p } #' Radar-like / spider-like plots. #' #' @description #' Plot a grid of radar(-like) plots for visualising a distance among objects. #' #' @param .data Square data frame or matrix with row names and col names stands for objects and values for distances. #' @param .ncol Number of columns in the grid. #' @param .which Character vector, which datasets to show. #' @param .expand Integer vector of length 2, for \code{scale_y_continous(expand = .expand)} function. #' #' @seealso \link{repOverlap}, \link{js.div} #' #' @examples #' \dontrun{ #' load('immdata.rda') #' # Compute Jensen-Shannon divergence among V-usage of repertoires. #' imm.js <- js.div.seg(immdata, .verbose = F) #' # Plot it. #' vis.radarlike(imm.js) #' } vis.radarlike <- function (.data, .ncol = 3, .which = NA, .expand = c(.25, 0)) { step = ncol(.data) data.names <- colnames(.data) .data <- as.data.frame(melt(.data)) .data[is.na(.data[,3]),3] <- 0 if (!is.na(.which[1])) { .data = .data[.data$Var2 %in% .which, ] } ps <- lapply(seq(1, nrow(.data), step), function (l) { ggplot(.data[l:(l+step-1),], aes(x = Var1, y = value, fill = Var1)) + geom_bar(colour = 'black', stat = 'identity') + coord_polar() + ggtitle(names(.data)[l]) + scale_y_continuous(expand = .expand) + guides(fill = guide_legend(title="Sample")) + theme_linedraw() + xlab('') + ylab('') + ggtitle(.data$Var2[l]) + .colourblind.discrete(length(data.names)) }) do.call(grid.arrange, c(ps, ncol = .ncol)) } #' Visualisation of top clones proportions. #' #' @description #' Visualisation of proportion of the top clones. #' #' @param .data Data frame with clones. #' @param .head Integer vector of clones for the \code{.head} parameter for the \code{top.proportion} function. #' @param .col Parameter \code{.col} for the \code{top.proportion} function. #' #' @seealso \code{top.proportion} #' #' @examples #' \dontrun{ #' vis.top.proportions(immdata) #' } vis.top.proportions <- function (.data, .head = c(10, 100, 1000, 10000, 30000, 100000, 300000, 1000000), .col = "Read.count") { if (has.class(.data, 'data.frame')) { .data <- list(Sample = .data) } res <- sapply(.head, function (h) top.proportion(.data, h, .col)) tmp <- res if (is.null(dim(tmp))) { tmp <- t(as.matrix(tmp)) res <- t(as.matrix(res)) } for (i in 2:ncol(res)) { tmp[,i] <- res[,i] - res[,i-1] } res <- tmp colnames(res) <- paste0('[', c(1, .head[-length(.head)] + 1), ':', .head, ')') res <- as.data.frame(res) res$People <- factor(row.names(res), levels = row.names(res)) res <- melt(res) # res$variable <- factor(as.character(res$variable), labels = paste0('[', c(1, .head[-length(.head)] + 1), ':', .head, ')'), ordered = T) ggplot() + geom_bar(aes(x = People, y = value, fill = variable), data = res, stat = 'identity', position = 'stack', colour = 'black')+ theme_linedraw() + theme(axis.text.x = element_text(angle=90, vjust = .5)) + ylab("Clonal proportion") + xlab("Sample") + ggtitle("Summary proportion of the top N clones") + guides(fill = guide_legend("Top N clones")) + .colourblind.discrete(length(.head)) # scale_y_continuous(expand = c(0, 0)) } #' Rarefaction statistics visualisation. #' #' @description #' Plot a line with mean unique clones. #' #' @param .muc.res Output from the \code{muc} function. #' @param .groups List with names for groups and names of the group members. If NULL than each #' member is in the individual group. #' @param .log if T then log-scale the y axis. #' @param .names If T then print number of samples. #' #' @seealso \link{rarefaction} #' #' @examples #' \dontrun{ #' data(twb) #' names(twb) # "Subj.A" "Subj.B" "Subj.C" "Subj.D" #' twb.rar <- rarefaction(twb, .col = "Read.count") #' vis.rarefaction(twb.rar, list(A = c("Subj.A", "Subj.B"), B = c("Subj.C", "Subj.D"))) #' } vis.rarefaction <- function (.muc.res, .groups = NULL, .log = F, .names = T) { .muc.res$Group <- .muc.res$People if (!is.null(.groups)) { for (i in 1:length(.groups)) { for (j in 1:length(.groups[[i]])) { .muc.res$Group[.muc.res$People == .groups[[i]][j] ] <- names(.groups)[i] } } } .muc.res$Type <- factor(.muc.res$Type, levels = c('interpolation', 'extrapolation'), ordered = T) p <- ggplot() + # geom_point(aes(x = Size, y = Mean, colour = Group), data = .muc.res, size = 2) + geom_line(aes(x = Size, y = Mean, colour = Group, Group = People, linetype = Type), data = .muc.res) + # geom_errorbar(aes(x = Size, y = Mean, ymin = Q0.025, ymax = Q0.975, colour = Group), data = .muc.res) + xlab('Sample size') + ylab('Clones') + ggtitle("Rarefaction analysis") + theme_linedraw() + .colourblind.discrete(length(unique(.muc.res$Group)), T) if (.names) { for (subj in unique(.muc.res$People)) { tmp <- tail(.muc.res[.muc.res$People == subj, ], 1) p <- p + geom_text(aes(x = Size, y = Mean, label = People), data = tmp, hjust=1, vjust=1) } } if (.log) { p <- p + scale_x_log10() } p } #' Plot of the most frequent kmers. #' #' @description #' Plot a distribution (bar plot) of the most frequent kmers in a data. #' #' @param .kmers Data frame with two columns "Kmers" and "Count" or a list with such data frames. See Examples. #' @param .head Number of the most frequent kmers to choose for plotting from each data frame. #' @param .position Character vector of length 1. Position of bars for each kmers. Value for the \code{ggplot2} argument \code{position}. #' #' @seealso \code{get.kmers} #' #' @examples #' \dontrun{ #' # Load necessary data and package. #' library(gridExtra) #' load('immdata.rda') #' # Get 5-mers. #' imm.km <- get.kmers(immdata) #' # Plots for kmer proportions in each data frame in immdata. #' p1 <- vis.kmer.histogran(imm.km, .position = 'stack') #' p2 <- vis.kmer.histogran(imm.km, .position = 'fill') #' grid.arrange(p1, p2) #' } vis.kmer.histogram <- function (.kmers, .head = 100, .position = c('stack', 'dodge', 'fill')) { kmers.df <- data.frame(Kmers = '') for (i in 2:ncol(.kmers)) { kmers.df <- merge(head(.kmers[order(.kmers[, i], decreasing = T), c(1,i)], .head), kmers.df, all = T) } kmers.df[is.na(kmers.df)] <- 0 kmers.df <- melt(kmers.df[-1,]) names(kmers.df) <- c('Kmers', 'People', 'Count') p <- ggplot() + geom_bar(aes(x = Kmers, y = Count, fill = People), data = kmers.df, stat = 'identity', position = .position[1]) + theme_linedraw() if (.position[1] == 'stack' || .position[1] == 'dodge') { p <- p + ylab('Count') + theme(axis.text.x = element_text(angle=90, vjust = .5)) } else { p <- p + ylab('Proportions') + theme(axis.text.x = element_text(angle=90, vjust = .5)) } p + scale_y_continuous(expand = c(0, 0)) + .colourblind.discrete2(length(unique(kmers.df$People))) } #' Visualise clonal dynamics among time points. #' #' @description #' Visualise clonal dynamics (i.e., changes in frequency or count) with error bars of given #' clones among time points. #' #' @param .changed Result from the \code{find.clonotypes} function, i.e. data frame with first #' columns with sequences (nucleotide or amino acid) and other columns are columns with frequency / count #' for each time point for each clone. #' @param .lower Similar to .changed but values are lower bound for clonal count / frequency. #' @param .upper Similar to .changed but values are upper bound for clonal count / frequency. #' @param .log if T then log-scale y-axis. #' #' @return ggplot object. vis.clonal.dynamics <- function (.changed, .lower, .upper, .log = T) { .changed <- melt(.changed, id.vars = names(.changed)[1]) .lower <- melt(.lower, id.vars = names(.changed)[1]) .upper <- melt(.upper, id.vars = names(.changed)[1]) names(.changed) <- c('Sequence', 'Time.point', 'Proportion') d <- cbind(.changed, Lower = .lower[,3], Upper = .upper[,3]) p <- ggplot() + geom_line(aes(x = Time.point, y = Proportion, colour = Sequence, group = Sequence), data = d) + geom_errorbar(aes(x = Time.point, y = Proportion, colour = Sequence, ymin = Lower, ymax = Upper), data = d, width = .25) + theme_linedraw() + theme(axis.text.x = element_text(angle=90)) + .colourblind.discrete(length(unique(.changed$Sequence)), .colour = T) if (.log) { p <- p + scale_y_log10() } p } #' Visualise occupied by clones homeostatic space among Samples or groups. #' #' @description #' Visualise which clones how much space occupy. #' #' @param .clonal.space.data Data from the \code{fclonal.space.homeostasis} function. #' @param .groups List of named character vector with names of Samples #' in \code{.clonal.space.data} for grouping them together. #' #' @seealso \link{clonal.space.homeostasis} #' #' @return ggplot object. vis.clonal.space <- function (.clonal.space.data, .groups = NULL) { melted <- melt(.clonal.space.data) colnames(melted) <- c('Sample', 'Clone.size', 'Proportion') melted$Sample <- as.character(melted$Sample) melted$Proportion <- as.numeric(as.character(melted$Proportion)) melted$Group <- melted$Sample if (!is.null(.groups)) { for (i in 1:length(.groups)) { for (j in 1:length(.groups[[i]])) { melted$Group[melted$Sample == .groups[[i]][j] ] <- names(.groups)[i] } } perc <- melt(tapply(melted$Proportion, list(melted$Group, melted$Clone.size), function (x) c(quantile(x, probs = .25), mean(x), quantile(x, probs = .75)))) # return(perc) perc <- data.frame(row.names(perc), perc, stringsAsFactors = F) colnames(perc) <- c("Index", 'Group', "Clone.size", 'Q1', 'Mean', 'Q2') print(perc) p <- ggplot() + geom_bar(aes(x = Group, y = Mean, fill = Clone.size), data = perc, colour = 'black', stat = 'identity') + geom_errorbar(aes(x = Group, ymin = Q1, ymax = Q2), data = perc, colour = 'black') + xlab("Sample") } else { melted$Group = factor(melted$Group, levels = row.names(.clonal.space.data)) p <- ggplot() + geom_bar(aes(x = Group, y = Proportion, fill = Clone.size), data = melted, colour = 'black', stat = 'identity', position = 'stack') + xlab("Sample") } p + theme_linedraw() + theme(axis.text.x = element_text(angle=90, vjust = .5)) + ylab("Occupied homeostatic space, proportion") + ggtitle("Clonal space homeostasis") + guides(fill = guide_legend("Clone size")) + .colourblind.discrete(length(unique(melted$Clone.size))) + scale_y_continuous(expand = c(.01, .01)) + scale_x_discrete(expand = c(.02, .02)) } #' Logo - plots for amino acid and nucletide profiles. #' #' @description #' Plot logo-like graphs for visualising of nucleotide or amino acid motif sequences / profiles. #' #' @param .data Output from the \code{kmer.profile} function. #' @param .replace.zero.with.na if T then replace all zeros with NAs, therefore letters with #' zero frequency wont appear at the plot. #' @param .jitter.width,.jitter.height,.dodge.width Parameters to \code{position_jitterdodge} #' for aligning text labels of letters. #' #' @return ggplot2 object #' #' @examples #' \dontrun{ #' d <- kmer_profile(c('CASLL', 'CASSQ', 'CASGL')) #' vis.logo(d) #' } vis.logo <- function (.data, .replace.zero.with.na = T, .jitter.width = .01, .jitter.height = .01, .dodge.width = .15) { .data <- melt(.data) if (.replace.zero.with.na) { .data$value[.data$value == 0] <- NA } ggplot(aes(x = variable, y = value, fill = Symbol, colour = Symbol), data = .data) + geom_point(colour = 'black') + geom_text(aes(label = Symbol), size = 5, position = position_jitterdodge(jitter.width = .jitter.width, jitter.height = .jitter.height, dodge.width = .dodge.width)) + xlab("Position") + ylab("Proportion") + theme_linedraw() } #' Visualisation of shared clonotypes occurrences among repertoires. #' #' @description #' Visualise counts or proportions of shared clonotypes among repertoires. #' Code adapted from https://www.r-bloggers.com/ggplot2-cheatsheet-for-visualizing-distributions/. #' #' @param .shared.rep Shared repertoires, as from \link{shared.repertoire} function. #' @param .x.rep Which repertoire show on x-axis. Either a name or an index of a repertoire #' in the \code{.shared.rep} or NA to choose all repertoires. #' @param .y.rep Which repertoire show on y-axis. Either a name or an index of a repertoire #' in the \code{.shared.rep} or NA to choose all repertoires. #' @param .title Main title of the plot. #' @param .ncol Number of columns in the resulting plot. #' @param .point.size.modif Modify this to correct sizes of points. #' @param .cut.axes If T than cut axes' limits to show only frequencies that exists. #' @param .density If T than plot densities of shared and unique clonotypes. #' @param .lm If T than fit and plot a linear model to shared clonotypes. #' @param .radj.size Size of the text for R^2-adjusted. #' @param .plot If F than return grobs instead of plotting. #' #' @return ggplot2 object or plot #' #' @seealso \link{shared.repertoire} #' #' @examples #' \dontrun{ #' data(twb) #' # Show shared nucleotide clonotypes of all possible pairs #' # using the Read.proportion column #' twb.sh <- shared.repertoire(twb, "n0rp") #' vis.shared.clonotypes(twb.sh, .ncol = 4) #' #' # Show shared amino acid + Vseg clonotypes of pairs #' # including the Subj.A (the first one) using #' # the Read.count column. #' twb.sh <- shared.repertoire(twb, "avrc") #' vis.shared.clonotypes(twb.sh, 1, NA, .ncol = 4) #' # same, just another order of axis #' vis.shared.clonotypes(twb.sh, NA, 1, .ncol = 4) #' #' # Show shared nucleotide clonotypes of Subj.A (the first one) #' # Subj.B (the second one) using the Read.proportion column. #' twb.sh <- shared.repertoire(twb, "n0rp") #' vis.shared.clonotypes(twb.sh, 1, 2) #' #' # Show the same plot, but with much larget points. #' vis.shared.clonotypes(twb.sh, 1, 2, .point.size.modif = 3) #' } vis.shared.clonotypes <- function (.shared.rep, .x.rep = NA, .y.rep = NA, .title = NA, .ncol = 3, .point.size.modif = 1, .cut.axes = T, .density = T, .lm = T, .radj.size = 3.5, .plot = T) { mat <- shared.matrix(.shared.rep) if (is.na(.x.rep) && is.na(.y.rep)) { ps <- list() for (i in 1:ncol(mat)) { for (j in 1:ncol(mat)) { ps <- c(ps, list(vis.shared.clonotypes(.shared.rep, i, j, '', .point.size.modif = .point.size.modif, .cut.axes = .cut.axes, .density = .density, .lm = .lm, .radj.size = .radj.size, .plot = F))) } } grid.arrange(grobs = ps, ncol = .ncol, top = .title) } else if (is.na(.x.rep)) { ps <- lapply(1:ncol(mat), function (i) { vis.shared.clonotypes(.shared.rep, i, .y.rep, '', .point.size.modif = .point.size.modif, .cut.axes = .cut.axes, .density = .density, .lm = .lm) }) do.call(grid.arrange, c(ps, ncol = .ncol, top = .title)) } else if (is.na(.y.rep)) { ps <- lapply(1:ncol(mat), function (j) { vis.shared.clonotypes(.shared.rep, .x.rep, j, '', .point.size.modif = .point.size.modif, .cut.axes = .cut.axes, .density = .density, .lm = .lm) }) do.call(grid.arrange, c(ps, ncol = .ncol, top = .title)) } else { if (!is.character(.x.rep)) { .x.rep <- colnames(mat)[.x.rep] } if (!is.character(.y.rep)) { .y.rep <- colnames(mat)[.y.rep] } if (.x.rep == .y.rep) { return(rectGrob(gp=gpar(col="white"))) } df <- data.frame(cbind(mat[, .x.rep], mat[, .y.rep])) df[,1] = df[,1] / sum(df[,1], na.rm = T) df[,2] = df[,2] / sum(df[,2], na.rm = T) df_full = df df <- df[!is.na(df[,1]) & !is.na(df[,2]), ] freq <- log10(sqrt(as.numeric(df[, 1]) * df[, 2])) / 2 names(df) <- c("Xrep", "Yrep") names(df_full) <- c("Xrep", "Yrep") pnt.cols <- log(df[, 1] / df[, 2]) suppressWarnings(pnt.cols[pnt.cols > 0] <- pnt.cols[pnt.cols > 0] / max(pnt.cols[pnt.cols > 0])) suppressWarnings(pnt.cols[pnt.cols < 0] <- -pnt.cols[pnt.cols < 0] / min(pnt.cols[pnt.cols < 0])) if (.cut.axes) { mat.lims <- c(min(as.matrix(df_full), na.rm = T), max(as.matrix(df_full), na.rm = T)) } else { mat.lims <- c(min(as.matrix(df_full), na.rm = T), 1) } empty <- ggplot()+geom_point(aes(1,1), colour="white") + theme( plot.background = element_blank(), panel.grid.major = element_blank(), panel.grid.minor = element_blank(), panel.border = element_blank(), panel.background = element_blank(), axis.title.x = element_blank(), axis.title.y = element_blank(), axis.text.x = element_blank(), axis.text.y = element_blank(), axis.ticks = element_blank() ) min_df = min(floor(log10(min(df_full[,1], na.rm = T))), floor(log10(min(df_full[,2], na.rm = T)))) max_df = max(trunc(log10(max(df_full[,1], na.rm = T))), trunc(log10(max(df_full[,2], na.rm = T)))) breaks_values = 10**seq(min_df, 1) breaks_labels = format(log10(breaks_values), scientific = F) grey_col = "#CCCCCC" points = ggplot() + geom_point(aes(x = Xrep, y = Yrep, size = freq, fill = pnt.cols), data = df, shape=21) + scale_radius(range = c(.point.size.modif, .point.size.modif * 6)) + geom_abline(intercept = 0, slope = 1, linetype = "dashed") + theme_linedraw() + .colourblind.gradient(min(pnt.cols), max(pnt.cols)) + scale_x_log10(breaks = breaks_values, labels = breaks_labels, lim = mat.lims, expand = c(.015, .015)) + scale_y_log10(breaks = breaks_values, labels = breaks_labels, lim = mat.lims, expand = c(.015, .015)) + theme(legend.position="none") + xlab(.x.rep) + ylab(.y.rep) if (!is.na(.title)) { points = points + ggtitle(.title) } if (.lm) { adj.R.sq = summary(lm(Yrep ~ Xrep, df))$adj. points = points + geom_smooth(aes(x = Xrep, y = Yrep), method = "lm", data = df, fullrange = T, colour = "grey20", size = .5) + geom_text(aes(x = max(df_full, na.rm = T) / 4, y = min(df_full, na.rm = T), label = paste0("R^2(adj.) = ", as.character(round(adj.R.sq, 2)))), size = .radj.size) # ggtitle(paste0("R^2(adj.) = ", as.character(round(adj.R.sq, 2)))) } if (.density) { df2 = data.frame(Clonotype = df_full[!is.na(df_full[,1]) & is.na(df_full[,2]), 1], Type = "unique", stringsAsFactors = F) df2 = rbind(df2, data.frame(Clonotype = df_full[!is.na(df_full[,1]) & !is.na(df_full[,2]), 1], Type = "shared", stringsAsFactors = F)) top_plot = ggplot() + geom_density(aes(x = Clonotype, fill = Type), colour = "grey25", data = df2, alpha = .3) + scale_x_log10(breaks = 10**(seq(min_df, 0)), lim = mat.lims, expand = c(.12, .015)) + theme_bw() + theme(axis.title.x = element_blank(), axis.title.y = element_blank(), axis.text.x = element_blank(), axis.text.y = element_blank(), axis.ticks = element_blank(), legend.position = "none") + scale_fill_manual(values = colorRampPalette(c(.colourblind.vector()[5], grey_col))(2)) df2 = data.frame(Clonotype = df_full[!is.na(df_full[,2]) & is.na(df_full[,1]), 2], Type = "unique", stringsAsFactors = F) df2 = rbind(df2, data.frame(Clonotype = df_full[!is.na(df_full[,2]) & !is.na(df_full[,1]), 2], Type = "shared", stringsAsFactors = F)) right_plot = ggplot() + geom_density(aes(x = Clonotype, fill = Type), colour = "grey25", data = df2, alpha = .3) + scale_x_log10(breaks = 10**(seq(min_df, 0)), lim = mat.lims, expand = c(.12, .015)) + coord_flip() + theme_bw() + theme(axis.title.x = element_blank(), axis.title.y = element_blank(), axis.text.x = element_blank(), axis.text.y = element_blank(), axis.ticks = element_blank(), legend.position = "none") + scale_fill_manual(values = colorRampPalette(c(.colourblind.vector()[1], grey_col))(2)) if (.plot) { grid.arrange(top_plot, empty, points, right_plot, ncol=2, nrow=2, widths=c(4, 1), heights=c(1, 4)) } else { arrangeGrob(top_plot, empty, points, right_plot, ncol=2, nrow=2, widths=c(4, 1), heights=c(1, 4)) } } else { points } } } # vis.hill.numbers <- function (.hill.nums, .groups = NA) { # # } tcR/R/infoanalysis.R0000644000176200001440000001160413667026401014034 0ustar liggesusers#' Normalised log assymetry. #' #' @description #' Compute the value of the normalised log assymetry measure for the given data.frames #' of the counts of shared clones. #' #' @param .alpha First mitcr data.frame or a list with data.frames. #' @param .beta Second mitcr data.frame or NULL if \code{.alpha} is a list. #' @param .by Which column use to merge. See "Details". #' #' @details #' Merge two data frames by the given column and compute #' value Sum(Log((Percentage for shared clone S from alpha) / (Percentage for shared clone S from beta))) / (# of shared clones). #' #' @return Value of the normalised log assymetry measure for the given data.frames. assymetry<-function(.alpha, .beta = NULL, .by = 'CDR3.nucleotide.sequence'){ if (class(.alpha) == 'list') { return(apply.asymm(.alpha, assymetry, .by = .by)) } m<-merge(.alpha, .beta, by=.by) sum(log(m$Percentage.x/m$Percentage.y))/nrow(m) } #' Repertoires' analysis using information measures applied to V- and J- segment frequencies. #' #' @aliases entropy.seg js.div.seg #' #' @description #' Information approach to repertoire analysis. Function \code{entropy.seg} applies Shannon entropy to V-usage and hence measures variability of V-usage. #' Function \code{js.div.seg} applied Jensen-Shannon divergence to V-usage of two or more data frames and hence measures distance among this V-usages. #' #' @usage #' entropy.seg(.data, .genes = HUMAN_TRBV, .frame = c('all', 'in', 'out'), #' .quant = c(NA, "read.count", "umi.count", "read.prop", "umi.prop"), #' .ambig = F) #' #' js.div.seg(.data, .genes = HUMAN_TRBV, .frame = c('all', 'in', 'out'), #' .quant = c(NA, "read.count", "umi.count", "read.prop", "umi.prop"), #' .norm.entropy = T, .ambig = F, .verbose = F, .data2 = NULL) #' #' @param .data Mitcr data.frame or a list with mitcr data.frames. #' @param .data2 NULL if .data is a list, or a second mitcr data.frame. #' @param .genes Parameter to the \code{geneUsage} function. #' @param .frame Character vector of length 1 specified which *-frames should be used: #' only in-frame ('in'), out-of-frame ('out') or all sequences ('all'). #' @param .norm.entropy if T then divide result by mean entropy of 2 segments' frequencies. #' @param .ambig Parameter passed to \code{geneUsage}. #' @param .quant Which column to use for the quantity of clonotypes: NA for computing only number of genes without using clonotype counts, "read.count" for the "Read.count" column, #' "umi.count" for the "Umi.count" column, "read.prop" for the "Read.proportion" column, "umi.prop" for #' the "Umi.proportion" column. #' @param .verbose If T than output the data processing progress bar. #' #' @return For \code{entropy.seg} - numeric integer with entropy value(s). For \code{js.div.seg} - integer of vector one if \code{.data} and \code{.data2} are provided; #' esle matrix length(.data) X length(.data) if \code{.data} is a list. #' #' @seealso \link{vis.heatmap}, \link{vis.group.boxplot}, \link{geneUsage} entropy.seg <- function (.data, .genes = HUMAN_TRBV, .frame = c('all', 'in', 'out'), .quant = c(NA, "read.count", "umi.count", "read.prop", "umi.prop"), .ambig = F) { if (class(.data) == 'list') { return(sapply(.data, entropy.seg, .quant = .quant, .frame = .frame, .genes = .genes, .ambig = .ambig)) } .data <- get.frames(.data, .frame) if (has.class(.genes, "list") && length(.genes) == 2) { entropy(geneUsage(.data, .genes = .genes, .quant = .quant, .ambig = .ambig)) } else { entropy(as.matrix(geneUsage(.data, .genes = .genes, .quant = .quant, .ambig = .ambig)[,-1])) } } js.div.seg <- function (.data, .genes = HUMAN_TRBV, .frame = c('all', 'in', 'out'), .quant = c(NA, "read.count", "umi.count", "read.prop", "umi.prop"), .norm.entropy = T, .ambig = F, .verbose = F, .data2 = NULL) { if (class(.data) == 'list') { if (length(.data) == 2) { return(js.div.seg(.data[[1]], .genes, .frame, .quant, .norm.entropy, .ambig, .verbose, .data[[2]])) } else { return(apply.symm(.data, function (x, y) { js.div.seg(.data = x, .data2 = y, .quant = .quant, .frame = .frame, .ambig = .ambig, .norm.entropy = .norm.entropy, .genes = .genes) }, .verbose = .verbose)) } } .data <- get.frames(.data, .frame) .data2 <- get.frames(.data2, .frame) if (has.class(.genes, "list") && length(.genes) == 2) { freq.alpha <- geneUsage(.data, .genes = .genes, .quant = .quant, .ambig = .ambig) freq.beta <- geneUsage(.data2, .genes = .genes, .quant = .quant, .ambig = .ambig) } else { freq.alpha <- geneUsage(.data, .genes = .genes, .quant = .quant, .ambig = .ambig)[,-1] freq.beta <- geneUsage(.data2, .genes = .genes, .quant = .quant, .ambig = .ambig)[,-1] } nrm = if (.norm.entropy) 0.5 * (entropy(freq.alpha) + entropy(freq.beta)) else 1 js.div(freq.alpha, freq.beta) / nrm }tcR/R/RcppExports.R0000644000176200001440000000144713667551225013641 0ustar liggesusers# Generated by using Rcpp::compileAttributes() -> do not edit by hand # Generator token: 10BE3573-1514-4C36-9D1C-5A225CD40393 .exact_search <- function(vec, patterns, max_error = 1L, verbose = TRUE) { .Call('_tcR_exact_search', PACKAGE = 'tcR', vec, patterns, max_error, verbose) } .exact_search_list <- function(vec, patterns_list, max_error = 1L, verbose = TRUE) { .Call('_tcR_exact_search_list', PACKAGE = 'tcR', vec, patterns_list, max_error, verbose) } .hamming_search <- function(vec, patterns, max_error = 1L, verbose = TRUE) { .Call('_tcR_hamming_search', PACKAGE = 'tcR', vec, patterns, max_error, verbose) } .levenshtein_search <- function(vec, patterns, max_error = 1L, verbose = TRUE) { .Call('_tcR_levenshtein_search', PACKAGE = 'tcR', vec, patterns, max_error, verbose) } tcR/R/docdata.R0000644000176200001440000006512513667026401012743 0ustar liggesusers.set.attr <- function (.data, .attr, .value) { attr(.data, .attr) <- .value .data } #' Tables with genetic code. #' #' @docType data #' #' @aliases AA_TABLE AA_TABLE_REVERSED #' #' @description #' Tables with genetic code. #' #' @format #' AA_TABLE: #' #' \code{Class 'table' Named chr [1:65] "K" "N" "K" "N" ... #' ..- attr(*, "names")= chr [1:65] "AAA" "AAC" "AAG" "AAT" ...} #' #' AA_TABLE_REVERSED: #' #' \code{List of 22 #' $ *: chr [1:3] "TAA" "TAG" "TGA" #' $ A: chr [1:4] "GCA" "GCC" "GCG" "GCT" #' $ C: chr [1:2] "TGC" "TGT" #' $ D: chr [1:2] "GAC" "GAT" #' ... #' } #' #' @examples #' \dontrun{ #' AA_TABLE['ATG'] # => "M" #' AA_TABLE_REVERSED['K'] # => list(K = c("AAA", "AAG")) #' } AA_TABLE <- table(c('TCA', 'TCG', 'TCC', 'TCT', 'TTT', 'TTC', 'TTA', 'TTG', 'TAT', 'TAC', 'TAA', 'TAG', 'TGT', 'TGC', 'TGA', 'TGG', 'CTA', 'CTG', 'CTC', 'CTT', 'CCA', 'CCG', 'CCC', 'CCT', 'CAT', 'CAC', 'CAA', 'CAG', 'CGA', 'CGG', 'CGC', 'CGT', 'ATT', 'ATC', 'ATA', 'ATG', 'ACA', 'ACG', 'ACC', 'ACT', 'AAT', 'AAC', 'AAA', 'AAG', 'AGT', 'AGC', 'AGA', 'AGG', 'GTA', 'GTG', 'GTC', 'GTT', 'GCA', 'GCG', 'GCC', 'GCT', 'GAT', 'GAC', 'GAA', 'GAG', 'GGA', 'GGG', 'GGC', 'GGT', 'NNN')) AA_TABLE[c('TCA', 'TCG', 'TCC', 'TCT', 'TTT', 'TTC', 'TTA', 'TTG', 'TAT', 'TAC', 'TAA', 'TAG', 'TGT', 'TGC', 'TGA', 'TGG', 'CTA', 'CTG', 'CTC', 'CTT', 'CCA', 'CCG', 'CCC', 'CCT', 'CAT', 'CAC', 'CAA', 'CAG', 'CGA', 'CGG', 'CGC', 'CGT', 'ATT', 'ATC', 'ATA', 'ATG', 'ACA', 'ACG', 'ACC', 'ACT', 'AAT', 'AAC', 'AAA', 'AAG', 'AGT', 'AGC', 'AGA', 'AGG', 'GTA', 'GTG', 'GTC', 'GTT', 'GCA', 'GCG', 'GCC', 'GCT', 'GAT', 'GAC', 'GAA', 'GAG', 'GGA', 'GGG', 'GGC', 'GGT', 'NNN')] <- c('S', 'S', 'S', 'S', 'F', 'F', 'L', 'L', 'Y', 'Y', '*', '*', 'C', 'C', '*', 'W', 'L', 'L', 'L', 'L', 'P', 'P', 'P', 'P', 'H', 'H', 'Q', 'Q', 'R', 'R', 'R', 'R', 'I', 'I', 'I', 'M', 'T', 'T', 'T', 'T', 'N', 'N', 'K', 'K', 'S', 'S', 'R', 'R', 'V', 'V', 'V', 'V', 'A', 'A', 'A', 'A', 'D', 'D', 'E', 'E', 'G', 'G', 'G', 'G', '~') AA_TABLE_REVERSED <- sapply(unique(AA_TABLE), function (aa) { names(AA_TABLE)[AA_TABLE == aa] }) AA_TABLE_REVERSED <- AA_TABLE_REVERSED[order(names(AA_TABLE_REVERSED))] #' Alphabets of TCR and Ig gene segments. #' #' @docType data #' #' @name segments.alphabets #' #' @aliases genealphabets HUMAN_TRAV HUMAN_TRAJ HUMAN_TRBV HUMAN_TRBD HUMAN_TRBJ HUMAN_TRBV_MITCR HUMAN_TRGV HUMAN_TRGJ HUMAN_TRDV HUMAN_TRDD HUMAN_TRDJ HUMAN_IGHV HUMAN_IGHD HUMAN_IGHJ HUMAN_IGKV HUMAN_IGKJ HUMAN_IGLJ HUMAN_IGLV HUMAN_TRBV_ALS HUMAN_TRBV_FAM HUMAN_TRBV_GEN MACMUL_TRBJ MACMUL_TRBV MOUSE_TRBJ MOUSE_TRBV MOUSE_TRAV MOUSE_TRAJ MOUSE_IGKV MOUSE_IGKJ MOUSE_IGHV MOUSE_IGHD MOUSE_IGHJ MOUSE_TRDD MOUSE_TRDV MOUSE_TRDJ MOUSE_TRGV MOUSE_TRGJ MOUSE_IGLJ MOUSE_IGLV #' #' @usage #' HUMAN_TRAV #' #' HUMAN_TRAJ #' #' HUMAN_TRBV #' #' HUMAN_TRBD #' #' HUMAN_TRBJ #' #' HUMAN_TRBV_MITCR #' #' HUMAN_TRBV_ALS #' #' HUMAN_TRGV #' #' HUMAN_TRGJ #' #' HUMAN_TRDV #' #' HUMAN_TRDD #' #' HUMAN_TRDJ #' #' MOUSE_TRBV #' #' MOUSE_TRBJ #' #' MOUSE_TRAV #' #' MOUSE_TRAJ #' #' MOUSE_IGKV #' #' MOUSE_IGKJ #' #' MOUSE_IGHV #' #' MOUSE_IGHD #' #' MOUSE_IGHJ #' #' MACMUL_TRBV #' #' MACMUL_TRBJ #' #' HUMAN_IGHV #' #' HUMAN_IGHD #' #' HUMAN_IGHJ #' #' HUMAN_IGLV #' #' HUMAN_IGLJ #' #' MOUSE_IGLJ #' #' MOUSE_IGLV #' #' @description #' Character vector with names for segments. With \code{tcR} we provided alphabets for all alpha, beta, #' gamma and delta chains gene segments. #' #' @format #' Each \code{_} is a character vector. is an identifier of species, is concatenated three #' identifiers of cell type ("TR**" for TCR, "IG**" for Ig), chain (e.g., "**A*" for alpha chains) and gene segment ("***V" for V(ariable) gene segment, #' "***J" for J(oining) gene segment, "***D" for D(iversity) gene segment). #' #' @examples #' \dontrun{ #' HUMAN_TRBV[1] # => "TRBV10-1" #' } HUMAN_TRAV <- c('TRAV1-1', 'TRAV1-2', 'TRAV10', 'TRAV11', 'TRAV12-1', 'TRAV12-2', 'TRAV12-3', 'TRAV13-1', 'TRAV13-2', 'TRAV14/DV4', 'TRAV16', 'TRAV17', 'TRAV18', 'TRAV19', 'TRAV2', 'TRAV20', 'TRAV21', 'TRAV22', 'TRAV23/DV6', 'TRAV24', 'TRAV25', 'TRAV26-1', 'TRAV26-2', 'TRAV27', 'TRAV29/DV5', 'TRAV3', 'TRAV30', 'TRAV34', 'TRAV35', 'TRAV36/DV7', 'TRAV38-1', 'TRAV38-2/DV8', 'TRAV39', 'TRAV4', 'TRAV40', 'TRAV41', 'TRAV5', 'TRAV6', 'TRAV7', 'TRAV8-1', 'TRAV8-2', 'TRAV8-3', 'TRAV8-4', 'TRAV8-6', 'TRAV8-7', 'TRAV9-1', 'TRAV9-2') HUMAN_TRAJ <- c('TRAJ10', 'TRAJ11', 'TRAJ12', 'TRAJ13', 'TRAJ14', 'TRAJ15', 'TRAJ16', 'TRAJ17', 'TRAJ18', 'TRAJ20', 'TRAJ21', 'TRAJ22', 'TRAJ23', 'TRAJ24', 'TRAJ26', 'TRAJ27', 'TRAJ28', 'TRAJ29', 'TRAJ3', 'TRAJ30', 'TRAJ31', 'TRAJ32', 'TRAJ33', 'TRAJ34', 'TRAJ36', 'TRAJ37', 'TRAJ38', 'TRAJ39', 'TRAJ4', 'TRAJ40', 'TRAJ41', 'TRAJ42', 'TRAJ43', 'TRAJ44', 'TRAJ45', 'TRAJ46', 'TRAJ47', 'TRAJ48', 'TRAJ49', 'TRAJ5', 'TRAJ50', 'TRAJ52', 'TRAJ53', 'TRAJ54', 'TRAJ56', 'TRAJ57', 'TRAJ6', 'TRAJ7', 'TRAJ8', 'TRAJ9') HUMAN_TRBV <- c('TRBV10-1', 'TRBV10-2', 'TRBV10-3', 'TRBV11-1', 'TRBV11-2', 'TRBV11-3', 'TRBV12-4', 'TRBV12-3', 'TRBV12-5', 'TRBV13', 'TRBV14', 'TRBV15', 'TRBV16', 'TRBV18', 'TRBV19', 'TRBV2', 'TRBV20-1', 'TRBV21-1', 'TRBV23-1', 'TRBV24-1', 'TRBV25-1', 'TRBV27', 'TRBV28', 'TRBV29-1', 'TRBV3-1', 'TRBV30', 'TRBV4-1', 'TRBV4-2', 'TRBV4-3', 'TRBV5-1', 'TRBV5-4', 'TRBV5-5', 'TRBV5-6', 'TRBV5-8', 'TRBV6-1', 'TRBV6-3', 'TRBV6-2', 'TRBV6-4', 'TRBV6-5', 'TRBV6-6', 'TRBV6-7', 'TRBV7-1', 'TRBV7-2', 'TRBV7-3', 'TRBV7-4', 'TRBV7-6', 'TRBV7-7', 'TRBV7-8', 'TRBV7-9', 'TRBV9') HUMAN_TRBV <- .set.attr(HUMAN_TRBV, "column", "V.gene") HUMAN_TRBD <- c('TRBD1', 'TRBD2') HUMAN_TRBJ <- c('TRBJ1-1', 'TRBJ1-2', 'TRBJ1-3', 'TRBJ1-4', 'TRBJ1-5', 'TRBJ1-6', 'TRBJ2-1', 'TRBJ2-2', 'TRBJ2-3', 'TRBJ2-4', 'TRBJ2-5', 'TRBJ2-6', 'TRBJ2-7') HUMAN_TRBV_MITCR <- c('TRBV10-1', 'TRBV10-2', 'TRBV10-3', 'TRBV11-1', 'TRBV11-2', 'TRBV11-3', 'TRBV12-4, TRBV12-3', 'TRBV12-5', 'TRBV13', 'TRBV14', 'TRBV15', 'TRBV16', 'TRBV18', 'TRBV19', 'TRBV2', 'TRBV20-1', 'TRBV21-1', 'TRBV23-1', 'TRBV24-1', 'TRBV25-1', 'TRBV27', 'TRBV28', 'TRBV29-1', 'TRBV3-1', 'TRBV30', 'TRBV4-1', 'TRBV4-2', 'TRBV4-3', 'TRBV5-1', 'TRBV5-4', 'TRBV5-5', 'TRBV5-6', 'TRBV5-8', 'TRBV6-1', 'TRBV6-3, TRBV6-2', 'TRBV6-4', 'TRBV6-5', 'TRBV6-6', 'TRBV6-7', 'TRBV7-1', 'TRBV7-2', 'TRBV7-3', 'TRBV7-4', 'TRBV7-6', 'TRBV7-7', 'TRBV7-8', 'TRBV7-9', 'TRBV9') HUMAN_TRBV_ALS <- c('TRBV10-1', 'TRBV10-2', 'TRBV10-3', 'TRBV11-1', 'TRBV11-2', 'TRBV11-3', 'TRBV12-4', 'TRBV12-3', 'TRBV12-5', 'TRBV13', 'TRBV14', 'TRBV15', 'TRBV16', 'TRBV18', 'TRBV19', 'TRBV2*01', 'TRBV20-1', 'TRBV21-1', 'TRBV23-1', 'TRBV24-1', 'TRBV25-1', 'TRBV27', 'TRBV28', 'TRBV29-1', 'TRBV3-1*01', 'TRBV30', 'TRBV4-1', 'TRBV4-2', 'TRBV4-3', 'TRBV5-1', 'TRBV5-4', 'TRBV5-5', 'TRBV5-6', 'TRBV5-8', 'TRBV6-1', 'TRBV6-3', 'TRBV6-2', 'TRBV6-4', 'TRBV6-5', 'TRBV6-6', 'TRBV6-7', 'TRBV7-1', 'TRBV7-2', 'TRBV7-3', 'TRBV7-4', 'TRBV7-6', 'TRBV7-7', 'TRBV7-8', 'TRBV7-9', 'TRBV9') HUMAN_TRBV_ALS <- .set.attr(HUMAN_TRBV_ALS, "column", "V.allele") # HUMAN_TRBV_FAM <- c() # HUMAN_TRBV_GEN <- c() # HUMAN_TRBV_ALS <- c() HUMAN_TRDD = c('TRDD1', 'TRDD2', 'TRDD3') HUMAN_TRDJ = c('TRDJ1', 'TRDJ3', 'TRDJ4', 'TRDJ2') HUMAN_TRDV = c('TRDV3', 'TRAV38-2/DV8', 'TRDV2', 'TRAV23/DV6', 'TRAV29/DV5', 'TRAV36/DV7', 'TRAV14/DV4', 'TRDV1') HUMAN_TRGJ = c('TRGJ1', 'TRGJP1', 'TRGJ2', 'TRGJP', 'TRGJP2') HUMAN_TRGV = c('TRGV5P', 'TRGV10', 'TRGV5', 'TRGV3', 'TRGVA', 'TRGV8', 'TRGV4', 'TRGV11', 'TRGV2', 'TRGV9', 'TRGV1') HUMAN_IGHD = c('IGHD4-4', 'IGHD4-23', 'IGHD2-2', 'IGHD1-7', 'IGHD3-3', 'IGHD5-18', 'IGHD4/OR15-4a', 'IGHD2-21', 'IGHD4/OR15-4b', 'IGHD1/OR15-1a', 'IGHD1-14', 'IGHD6-13', 'IGHD5-24', 'IGHD2/OR15-2a', 'IGHD5-12', 'IGHD6-19', 'IGHD4-11', 'IGHD5-5', 'IGHD1/OR15-1b', 'IGHD3/OR15-3a', 'IGHD4-17', 'IGHD6-25', 'IGHD1-1', 'IGHD3-16', 'IGHD2-8', 'IGHD3-10', 'IGHD3/OR15-3b', 'IGHD5/OR15-5a', 'IGHD3-9', 'IGHD7-27', 'IGHD1-20', 'IGHD1-26', 'IGHD3-22', 'IGHD6-6', 'IGHD2-15', 'IGHD2/OR15-2b', 'IGHD5/OR15-5b') HUMAN_IGHJ = c('IGHJ4', 'IGHJ1', 'IGHJ6', 'IGHJ3', 'IGHJ2', 'IGHJ5') HUMAN_IGHV = c('IGHV4-4', 'IGHV7-40', 'IGHV2-5', 'IGHV4-28', 'IGHV6-1', 'IGHV3/OR16-6', 'IGHV1-69D', 'IGHV1-2', 'IGHV5-51', 'IGHV2/OR16-5', 'IGHV3-30-52', 'IGHV3-53', 'IGHV3/OR16-13', 'IGHV3-74', 'IGHV1-69-2', 'IGHV3-22', 'IGHV4-34', 'IGHV1-45', 'IGHV3-35', 'IGHV3-64', 'IGHV4-61', 'IGHV3-47', 'IGHV7-34-1', 'IGHV4-59', 'IGHV3-19', 'IGHV3-15', 'IGHV4-39', 'IGHV2-70D', 'IGHV3-20', 'IGHV1-18', 'IGHV3-30-22', 'IGHV4-38-2', 'IGHV3-54', 'IGHV5-10-1', 'IGHV3-33', 'IGHV3-21', 'IGHV3-7', 'IGHV1/OR15-2', 'IGHV4-31', 'IGHV3/OR16-8', 'IGHV3-23D', 'IGHV3-30-42', 'IGHV3-62', 'IGHV3-23', 'IGHV1-8', 'IGHV3/OR16-15', 'IGHV1/OR15-1', 'IGHV3-43D', 'IGHV4-30-2', 'IGHV3-NL1', 'IGHV3-64D', 'IGHV3-13', 'IGHV3-52', 'IGHV3-11', 'IGHV3-30-33', 'IGHV1/OR15-4', 'IGHV5-78', 'IGHV4-55', 'IGHV3-16', 'IGHV3-33-2', 'IGHV7-4-1', 'IGHV2-26', 'IGHV4-30-4', 'IGHV1/OR21-1', 'IGHV1/OR15-9', 'IGHV3/OR15-7', 'IGHV3-9', 'IGHV3-30', 'IGHV3-29', 'IGHV3-38', 'IGHV2-70', 'IGHV1-NL1', 'IGHV3-30-5', 'IGHV1/OR15-5', 'IGHV1-3', 'IGHV7-81', 'IGHV3/OR16-14', 'IGHV1-68', 'IGHV3-63', 'IGHV3/OR16-10', 'IGHV4/OR15-8', 'IGHV1-58', 'IGHV3-25', 'IGHV3-69-1', 'IGHV1-38-4', 'IGHV3/OR16-16', 'IGHV1-69', 'IGHV3-32', 'IGHV1-46', 'IGHV1-24', 'IGHV3/OR16-9', 'IGHV3-38-3', 'IGHV3-30-2', 'IGHV3-48', 'IGHV1/OR15-3', 'IGHV3-30-3', 'IGHV3-73', 'IGHV3-49', 'IGHV3-66', 'IGHV3-43', 'IGHV2-10', 'IGHV3/OR16-12', 'IGHV3-71', 'IGHV3-72') HUMAN_IGKJ = c('IGKJ5', 'IGKJ4', 'IGKJ3', 'IGKJ2', 'IGKJ1') HUMAN_IGKV = c('IGKV2-30', 'IGKV1-17', 'IGKV1-5', 'IGKV1/OR1-1', 'IGKV1/OR2-11', 'IGKV2D-30', 'IGKV1-9', 'IGKV2-40', 'IGKV6D-41', 'IGKV1D-43', 'IGKV3-7', 'IGKV6D-21', 'IGKV2-29', 'IGKV1/OR2-1', 'IGKV1-13', 'IGKV3D-20', 'IGKV1-NL1', 'IGKV1D-12', 'IGKV3D-7', 'IGKV1/OR10-1', 'IGKV1/OR2-108', 'IGKV1D-16', 'IGKV1/OR2-118', 'IGKV1-39', 'IGKV1/OR2-9', 'IGKV1D-17', 'IGKV1/ORY-1', 'IGKV1/OR-4', 'IGKV1D-8', 'IGKV1D-42', 'IGKV2D-24', 'IGKV1-27', 'IGKV1/OR15-118', 'IGKV1/OR22-5', 'IGKV1/OR9-1', 'IGKV2/OR2-7D', 'IGKV2D-18', 'IGKV1/OR-3', 'IGKV1/OR9-2', 'IGKV1D-37', 'IGKV1D-39', 'IGKV2D-29', 'IGKV5-2', 'IGKV2D-28', 'IGKV3/OR2-268', 'IGKV2D-26', 'IGKV3-20', 'IGKV1-8', 'IGKV2D-40', 'IGKV6-21', 'IGKV3-11', 'IGKV3-15', 'IGKV1/OR2-3', 'IGKV1-12', 'IGKV2/OR22-4', 'IGKV1/OR2-2', 'IGKV1/OR-2', 'IGKV7-3', 'IGKV1/OR2-0', 'IGKV3D-11', 'IGKV1-16', 'IGKV1D-33', 'IGKV1-33', 'IGKV3D-15', 'IGKV1D-13', 'IGKV2-18', 'IGKV1-6', 'IGKV2-28', 'IGKV4-1', 'IGKV1-37', 'IGKV2-4', 'IGKV2-24') HUMAN_IGLJ = c('IGLJ6', 'IGLJ5', 'IGLJ3', 'IGLJ4', 'IGLJ1', 'IGLJ7', 'IGLJ2') HUMAN_IGLV = c('IGLV2-11', 'IGLV7-46', 'IGLV1-44', 'IGLV5-52', 'IGLV4-3', 'IGLV3-19', 'IGLV3-27', 'IGLV2-18', 'IGLV2-8', 'IGLV3-21', 'IGLV2-33', 'IGLV3-16', 'IGLV3-13', 'IGLV2-14', 'IGLV1-62', 'IGLV3-31', 'IGLV3-9', 'IGLV4-60', 'IGLV1-51', 'IGLV7-43', 'IGLV5-45', 'IGLV8-61', 'IGLV3-1', 'IGLV1-40', 'IGLV3-25', 'IGLV4-69', 'IGLV9-49', 'IGLV5-39', 'IGLV1-47', 'IGLV2-NL1', 'IGLV2-34', 'IGLV11-55', 'IGLV2-5', 'IGLV8/OR8-1', 'IGLV10-54', 'IGLV3-12', 'IGLV3-22', 'IGLV1-41', 'IGLV5-37', 'IGLV5-48', 'IGLV1-36', 'IGLV3-10', 'IGLV3-32', 'IGLV6-57', 'IGLV2-23', 'IGLV1-50') MOUSE_TRAV <- c('TRAV1', 'TRAV10', 'TRAV10D', 'TRAV10N', 'TRAV11', 'TRAV11D', 'TRAV11N', 'TRAV12-1', 'TRAV12-2', 'TRAV12-3', 'TRAV12D-1', 'TRAV12D-2', 'TRAV12D-3', 'TRAV12N-1', 'TRAV12N-2', 'TRAV12N-3', 'TRAV13-1', 'TRAV13-2', 'TRAV13-3', 'TRAV13-4/DV7', 'TRAV13-5', 'TRAV13D-1', 'TRAV13D-2', 'TRAV13D-3', 'TRAV13D-4', 'TRAV13N-1', 'TRAV13N-2', 'TRAV13N-3', 'TRAV13N-4', 'TRAV14-1', 'TRAV14-2', 'TRAV14-3', 'TRAV14D-1', 'TRAV14D-2', 'TRAV14D-3/DV8', 'TRAV14N-1', 'TRAV14N-2', 'TRAV14N-3', 'TRAV15-1/DV6-1', 'TRAV15-2/DV6-2', 'TRAV15D-1/DV6D-1', 'TRAV15D-2/DV6D-2', 'TRAV15N-1', 'TRAV15N-2', 'TRAV16', 'TRAV16D/DV11', 'TRAV16N', 'TRAV17', 'TRAV18', 'TRAV19', 'TRAV2', 'TRAV20', 'TRAV21/DV12', 'TRAV3-1', 'TRAV3-3', 'TRAV3-4', 'TRAV3D-3', 'TRAV3N-3', 'TRAV4-2', 'TRAV4-3', 'TRAV4-4/DV10', 'TRAV4D-2', 'TRAV4D-3', 'TRAV4D-4', 'TRAV4N-3', 'TRAV4N-4', 'TRAV5-1', 'TRAV5-2', 'TRAV5-4', 'TRAV5D-4', 'TRAV5N-4', 'TRAV6-1', 'TRAV6-2', 'TRAV6-3', 'TRAV6-4', 'TRAV6-5', 'TRAV6-6', 'TRAV6-7/DV9', 'TRAV6D-3', 'TRAV6D-4', 'TRAV6D-5', 'TRAV6D-6', 'TRAV6D-7', 'TRAV6N-5', 'TRAV6N-6', 'TRAV6N-7', 'TRAV7-1', 'TRAV7-2', 'TRAV7-3', 'TRAV7-4', 'TRAV7-5', 'TRAV7-6', 'TRAV7D-2', 'TRAV7D-3', 'TRAV7D-4', 'TRAV7D-5', 'TRAV7D-6', 'TRAV7N-4', 'TRAV7N-5', 'TRAV7N-6', 'TRAV8-1', 'TRAV8-2', 'TRAV8D-1', 'TRAV8D-2', 'TRAV8N-2', 'TRAV9-1', 'TRAV9-2', 'TRAV9-3', 'TRAV9-4', 'TRAV9D-1', 'TRAV9D-2', 'TRAV9D-3', 'TRAV9D-4', 'TRAV9N-2', 'TRAV9N-3', 'TRAV9N-4') MOUSE_TRAJ <- c('TRAJ11', 'TRAJ12', 'TRAJ13', 'TRAJ15', 'TRAJ16', 'TRAJ17', 'TRAJ18', 'TRAJ2', 'TRAJ21', 'TRAJ22', 'TRAJ23', 'TRAJ24', 'TRAJ26', 'TRAJ27', 'TRAJ28', 'TRAJ30', 'TRAJ31', 'TRAJ32', 'TRAJ33', 'TRAJ34', 'TRAJ35', 'TRAJ37', 'TRAJ38', 'TRAJ39', 'TRAJ4', 'TRAJ40', 'TRAJ42', 'TRAJ43', 'TRAJ45', 'TRAJ46', 'TRAJ48', 'TRAJ49', 'TRAJ5', 'TRAJ50', 'TRAJ52', 'TRAJ53', 'TRAJ54', 'TRAJ56', 'TRAJ57', 'TRAJ58', 'TRAJ59', 'TRAJ6', 'TRAJ7', 'TRAJ9') MOUSE_TRBV <- c('TRBV1', 'TRBV12-1', 'TRBV12-2', 'TRBV13-1', 'TRBV13-2', 'TRBV13-3', 'TRBV14', 'TRBV15', 'TRBV16', 'TRBV17', 'TRBV19', 'TRBV2', 'TRBV20', 'TRBV23', 'TRBV24', 'TRBV26', 'TRBV29', 'TRBV3', 'TRBV30', 'TRBV31', 'TRBV4', 'TRBV5') MOUSE_TRBJ <- c('TRBJ1-1', 'TRBJ1-2', 'TRBJ1-3', 'TRBJ1-4', 'TRBJ1-5', 'TRBJ2-1', 'TRBJ2-2', 'TRBJ2-3', 'TRBJ2-4', 'TRBJ2-5', 'TRBJ2-7') MOUSE_IGKV <- c('IGKV4-54','IGKV4-59','IGKV4-60','IGKV4-61','IGKV8-16','IGKV9-123', 'IGKV9-128','IGKV1-131','IGKV14-130','IGKV12-89','IGKV1-132', 'IGKV3-4','IGKV4-91','IGKV8-23-1','IGKV4-77','IGKV6-15', 'IGKV6-25','IGKV6-14','IGKV9-119','IGKV4-58','IGKV4-74', 'IGKV3-10','IGKV1-35','IGKV9-124','IGKV3-7','IGKV8-19', 'IGKV1-88','IGKV8-34','IGKV7-33','IGKV13-76','IGKV4-63', 'IGKV2-a','IGKV3-3','IGKV4-62','IGKV18-36','IGKV1-133', 'IGKV3-9','IGKV6-23','IGKV12-98','IGKV3-8','IGKV1-110', 'IGKV4-57-1','IGKV12-47','IGKV12-44','IGKV4-70','IGKV4-90', 'IGKV4-73','IGKV4-79','IGKV6-32','IGKV4-56','IGKV2-137', 'IGKV14-126','IGKV5-48','IGKV4-69','IGKV1-115','IGKV4-57', 'IGKV6-13','IGKV3-12','IGKV4-72','IGKV11-125','IGKV3-2', 'IGKV12-38','IGKV6-29','IGKV6-b','IGKV20-101-2','IGKV6-20', 'IGKV14-111','IGKV10-95','IGKV4-81','IGKV4-92','IGKV15-103', 'IGKV19-93','IGKV4-52','IGKV2-109','IGKV5-45','IGKV5-39', 'IGKV8-26','IGKV1-122','IGKV1-135','IGKV6-c','IGKV12-46', 'IGKV17-121','IGKV6-17','IGKV13-84','IGKV4-50','IGKV1-117', 'IGKV14-100','IGKV4-55','IGKV4-80','IGKV12-e','IGKV8-18', 'IGKV4-68','IGKV5-43','IGKV6-d','IGKV3-1','IGKV10-94', 'IGKV9-120','IGKV13-82','IGKV8-28','IGKV8-21','IGKV4-51', 'IGKV12-40','IGKV8-30','IGKV9-129','IGKV15-101','IGKV4-86', 'IGKV2-112','IGKV4-75','IGKV8-24','IGKV12-41','IGKV13-85', 'IGKV17/OR19-2','IGKV4-83','IGKV4-71','IGKV8-27','IGKV15-102', 'IGKV5-37','IGKV4-78','IGKV17-127','IGKV17/OR16-3','IGKV1-99', 'IGKV3-5','IGKV4-53','IGKV10-96','IGKV16-104') MOUSE_IGKJ <- c('IGKJ5','IGKJ2','IGKJ1','IGKJ4','IGKJ3') MOUSE_IGHV = c('IGHV1-69','IGHV1S96','IGHV5-17','IGHV3-1','IGHV5-6-2','IGHV1-63', 'IGHV8-13','IGHV5-6','IGHV1-28','IGHV1-47','IGHV1-18', 'IGHV1S14','IGHV1S29','IGHV1S70','IGHV1S135','IGHV14S4', 'IGHV5-12-4','IGHV1-27','IGHV3-4','IGHV5-6-3','IGHV12-2', 'IGHV8-5','IGHV1-84','IGHV1S10','IGHV1S136','IGHV8-4', 'IGHV1-85','IGHV8-2','IGHV1-14','IGHV1S32','IGHV1-31', 'IGHV1-5','IGHV1-81','IGHV1-78','IGHV13-2','IGHV7-4', 'IGHV6-4','IGHV1-79','IGHV5-9-1','IGHV3S1','IGHV1-17-1', 'IGHV2-6-1','IGHV5-6-5','IGHV1S118','IGHV2-6','IGHV1-56', 'IGHV9-3-1','IGHV1S130','IGHV1-43','IGHV1-46','IGHV2-4-1', 'IGHV5-9-5','IGHV5-9-2','IGHV1S112','IGHV1-19','IGHV10-1', 'IGHV3-2','IGHV5S4','IGHV8-7','IGHV5-6-1','IGHV5S21', 'IGHV8-12','IGHV8-10','IGHV1S124','IGHV1-72','IGHV1S82', 'IGHV1S81','IGHV8-8','IGHV12-1-1','IGHV1-26','IGHV1S22', 'IGHV3-6','IGHV1-71','IGHV12-2-1','IGHV1S65','IGHV1-58', 'IGHV1-23','IGHV1-7','IGHV7-2','IGHV1-53','IGHV1S56', 'IGHV1-37','IGHV1-24','IGHV1S31','IGHV1S83','IGHV1S20', 'IGHV4-1','IGHV3-8','IGHV13-1','IGHV8S6','IGHV1S34', 'IGHV1S35','IGHV1-59','IGHV8S9','IGHV1S47','IGHV1-62-1', 'IGHV10-3','IGHV1S111','IGHV1S21','IGHV1S87','IGHV1-48', 'IGHV5-6-6','IGHV8-8-1','IGHV1S16','IGHV1-49','IGHV1S92', 'IGHV1-20','IGHV1-70','IGHV1-42','IGHV1S100','IGHV2-6-6', 'IGHV5-6-4','IGHV10S4','IGHV1S134','IGHV1S95','IGHV5-16', 'IGHV3-7','IGHV1S26','IGHV1-54','IGHV1-67','IGHV2-6-5', 'IGHV1S52','IGHV1-51','IGHV1-66','IGHV1-12','IGHV1S61', 'IGHV1S37','IGHV14-3','IGHV1S113','IGHV2-3-1','IGHV1-83', 'IGHV1-16','IGHV1S127','IGHV6-6','IGHV1-55','IGHV1S12', 'IGHV1-25','IGHV1S11','IGHV1S41','IGHV1S53','IGHV1S74', 'IGHV5-15','IGHV1-80','IGHV1-64','IGHV1S107','IGHV1S68', 'IGHV5S12','IGHV2-5-1','IGHV2S3','IGHV5-1','IGHV4-2', 'IGHV2-6-3','IGHV1S72','IGHV2-6-8','IGHV1S84','IGHV2-7', 'IGHV1S46','IGHV3S7','IGHV12-1','IGHV6S2','IGHV5-12-1', 'IGHV9-2','IGHV9-3','IGHV11-1','IGHV1-62-2','IGHV7-3', 'IGHV1-13','IGHV1-35','IGHV12-1-2','IGHV14-4','IGHV1S19', 'IGHV1-11','IGHV1S122','IGHV1S5','IGHV1S120','IGHV2-9', 'IGHV1-22','IGHV1-19-1','IGHV1-60','IGHV1-61','IGHV1S44', 'IGHV5S24','IGHV3-5','IGHV1S126','IGHV1S101','IGHV3-3', 'IGHV9-1','IGHV1-77','IGHV2-3','IGHV5-21','IGHV1S50', 'IGHV1S33','IGHV2-2','IGHV5-12','IGHV6-7','IGHV8-6', 'IGHV12-3','IGHV14-2','IGHV14-1','IGHV5-12-2','IGHV6-5', 'IGHV1S121','IGHV1S108','IGHV8-14','IGHV9-2-1','IGHV1-4', 'IGHV10S3','IGHV8-11','IGHV5-9','IGHV1S9','IGHV16-1', 'IGHV1-87','IGHV2-9-2','IGHV1-21-1','IGHV1-36','IGHV1-39', 'IGHV1S78','IGHV1-62-3','IGHV1-76','IGHV2-6-2','IGHV2-6-4', 'IGHV9S7','IGHV1-9','IGHV9-4','IGHV1S49','IGHV1-50', 'IGHV5-9-4','IGHV1S73','IGHV6-3','IGHV2-5','IGHV1-15', 'IGHV11-2','IGHV15-2','IGHV5-9-3','IGHV2-2-1','IGHV1S45', 'IGHV2-4','IGHV1S103','IGHV1-82','IGHV5-2','IGHV5-4', 'IGHV1S36','IGHV9S8','IGHV1S17','IGHV1S28','IGHV1-8', 'IGHV7-1','IGHV1S30','IGHV1-52','IGHV1S137','IGHV2-9-1', 'IGHV1-74','IGHV8-9','IGHV2-6-7','IGHV1S110','IGHV1S132', 'IGHV1-32','IGHV1S18','IGHV5S9','IGHV1S15','IGHV1-21', 'IGHV1-34','IGHV6S4','IGHV1S55','IGHV1S75','IGHV6S3', 'IGHV1S40','IGHV2-2-2','IGHV1S51','IGHV1S67','IGHV1-75', 'IGHV8S2') MOUSE_IGHJ = c('IGHJ1','IGHJ3','IGHJ2','IGHJ4') MOUSE_IGHD = c('IGHD2-10','IGHD5-4','IGHD2-13','IGHD2-4','IGHD1-3','IGHD2-2', 'IGHD2-6','IGHD3-2','IGHD3-3','IGHD4-1','IGHD5-6', 'IGHD2-11','IGHD2-7','IGHD2-5','IGHD5-5','IGHD6-4', 'IGHD5-2','IGHD5-3','IGHD2-14','IGHD6-1','IGHD1-1', 'IGHD6-3','IGHD1-2','IGHD2-9','IGHD2-1','IGHD2-8', 'IGHD3-1','IGHD5-1','IGHD6-2','IGHD2-3','IGHD2-12') MOUSE_IGLV = c('IGLV5','IGLV2','IGLV6','IGLV4','IGLV3','IGLV7', 'IGLV1','IGLV8') MOUSE_IGLJ = c('IGLJ1','IGLJ3P','IGLJ5','IGLJ3','IGLJ2','IGLJ4') MOUSE_TRDD = c('TRDD2', 'TRDD1') MOUSE_TRDJ = c('TRDJ1', 'TRDJ2') MOUSE_TRDV = c('TRAV15D-1/DV6D-1', 'TRAV16D/DV11', 'TRAV4-4/DV10', 'TRAV21/DV12', 'TRDV1', 'TRAV15D-2/DV6D-2', 'TRAV13-4/DV7', 'TRAV6-7/DV9', 'TRDV2-1', 'TRAV15-2/DV6-2', 'TRAV14D-3/DV8', 'TRDV5', 'TRDV2-2', 'TRDV4', 'TRAV15-1/DV6-1') MOUSE_TRGJ = c('TRGJ4', 'TRGJ2', 'TRGJ1', 'TRGJ3') MOUSE_TRGV = c('TRGV4', 'TRGV6', 'TRGV5', 'TRGV3', 'TRGV7', 'TRGV1', 'TRGV2') MACMUL_TRBV <- c('TRBD1', 'TRBD2', 'TRBJ1-1', 'TRBJ1-2', 'TRBJ1-3', 'TRBJ1-4', 'TRBJ1-5', 'TRBJ1-6', 'TRBJ2-1', 'TRBJ2-2', 'TRBJ2-2P', 'TRBJ2-3', 'TRBJ2-4', 'TRBJ2-5', 'TRBJ2-6', 'TRBJ2-7', 'TRBV1-1', 'TRBV10-1', 'TRBV10-2', 'TRBV10-3', 'TRBV11-1', 'TRBV11-2', 'TRBV11-3', 'TRBV12-1', 'TRBV12-2', 'TRBV12-3', 'TRBV12-4', 'TRBV13', 'TRBV14', 'TRBV15', 'TRBV16', 'TRBV18', 'TRBV19', 'TRBV2-1', 'TRBV2-2', 'TRBV2-3', 'TRBV20-1', 'TRBV21-1', 'TRBV22-1', 'TRBV23-1', 'TRBV24-1', 'TRBV25-1', 'TRBV27', 'TRBV28', 'TRBV29-1', 'TRBV3-1', 'TRBV3-2', 'TRBV3-3', 'TRBV3-4', 'TRBV30', 'TRBV4-1', 'TRBV4-2', 'TRBV4-3', 'TRBV5-1', 'TRBV5-10', 'TRBV5-2', 'TRBV5-3', 'TRBV5-4', 'TRBV5-5', 'TRBV5-6', 'TRBV5-7', 'TRBV5-8', 'TRBV5-9', 'TRBV6-1', 'TRBV6-2', 'TRBV6-3', 'TRBV6-4', 'TRBV6-5', 'TRBV6-6', 'TRBV6-7', 'TRBV7-10', 'TRBV7-2', 'TRBV7-3', 'TRBV7-4', 'TRBV7-5', 'TRBV7-6', 'TRBV7-7', 'TRBV7-9', 'TRBV9') MACMUL_TRBJ <- c('TRBJ1-1', 'TRBJ1-2', 'TRBJ1-3', 'TRBJ1-4', 'TRBJ1-5', 'TRBJ1-6', 'TRBJ2-1', 'TRBJ2-2', 'TRBJ2-3', 'TRBJ2-4', 'TRBJ2-5', 'TRBJ2-6', 'TRBJ2-7') #' Segment data. #' #' @docType data #' #' @aliases genesegments #' #' @name segments.list #' #' @description #' \code{segments} is a list with 5 data frames with data of human alpha-beta chain segments. #' Elements names as "TRAV", "TRAJ", "TRBV", "TRVJ", "TRVD". Each data frame consists of 5 columns: #' #' - V.allelles / J.allelles / D.allelles - character column with names of V/D/J-segments. #' #' - CDR3.position - position in the full nucleotide segment sequence where CDR3 starts. #' #' - Full.nucleotide.sequence - character column with segment CDR1-2-3 sequence. #' #' - Nucleotide.sequence - character column with segment CDR3 sequences. #' #' - Nucleotide.sequence.P - character column with segment CDR3 sequences with P-insertions. #' #' @format #' \code{genesegments} is a list with data frames. #' #' @examples #' \dontrun{ #' data(genesegments) #' genesegments$Nucleotide.sequence[segments$TRBV[,1] == "TRBV10-1"] #' } NULL #' List with assembling probabilities of beta chain TCRs. #' #' @docType data #' #' @name beta.prob #' #' @aliases beta.prob #' #' @description #' \code{beta.prob} is a list with probabilities of TCR assembling taken from #' \code{Murugan et al. Statistical inference of the generation probability #' of T-cell receptors from sequence repertoires}. It's a list with the following elements: #' #' - P.V - matrix with 1 column and row names stands for V-beta segments. Each element is #' a probability of choosing corresponding V-beta segment. #' #' - P.del.D1 - matrix 17x17 with probabilities of choosing D5-D3 deletions for TRBD1. #' #' - P.del.D1 - matrix 17x17 with probabilities of choosing D5-D3 deletions for TRBD2. #' #' - P.ins.len - matrix with first columns stands for number of insertions, second and third columns filled #' with probability values of choosing corresponding number of insertions in VD- and DJ-junctions #' correspondingly. #' #' - P.ins.nucl - data frame with probability of choosing a nucleotide in the insertion on junctions with known #' previous nucleotide. First column with names of nucleotides, 2-5 columns are probabilities of choosing #' adjacent nucleotide in VD-junction, 6-9 columns are probabilities of choosing adjacent nucleotide in DJ-junction. #' #' - P.del.J - matrix with the first column "P.del.V" with number of deletions, and other columns with #' names for V-segments and with probabilities of corresponding deletions. #' #' - P.del.J - matrix with the first column "P.del.J" with number of deletions, and other columns with #' names for J-segments and with probabilities of corresponding deletions. #' #' - P.J.D - matrix with two columns ("TRBD1" and "TRBD2") and 13 rows with row names stands for #' J-beta segments. Each element is a mutual probability of choosing J-D segments. #' #' @format #' \code{beta.prob} is a list of matrices and data frames. #' #' @examples #' \dontrun{ #' # Generate 10 kmers with adjacent nucleotide probability. #' generate.kmers.prob(rep.int(10, 10), .probs=beta.prob$P.ins.nucl[,c(1, 2:5)]) #' } NULL #' Twins alpha-beta chain data #' #' @docType data #' #' @name twinsdata #' #' @aliases twa twb #' #' @description #' \code{twa.rda}, \code{twb.rda} - data frames with downsampled to the 10000 most #' abundant clonesets and 4 samples data of twins data (alpha and beta chains). #' Link: http://labcfg.ibch.ru/tcr.html #' #' @format #' \code{twa} and \code{twb} are lists of 4 data frames with 10000 row in each. #' #' @examples #' \dontrun{ #' data(twa) #' data(twb) #' } NULLtcR/R/dataproc.R0000644000176200001440000006122513667026401013136 0ustar liggesusersif(getRversion() >= "2.15.1") utils::globalVariables(c("alpha.prob", "beta.prob", "fill_vec", "fill_reads")) #' Compute the number of deletions in MiTCR data frames. #' #' @aliases get.deletions.alpha get.deletions.beta #' #' @usage #' get.deletions.alpha(.data, .Vs = segments$TRAV, .Js = segments$TRAJ) #' #' get.deletions.beta(.data, .Vs = segments$TRBV, .Js = segments$TRBJ, .Ds = segments$TRBD) #' #' @description #' Get deletions for VD, DJ, 5'D and 3'D ends and two columns with #' total deletions for VD/DJ and 5'D/3'D deletions for the given mitcr data.frame #' with 0-indexes columns. Cases, in which deletions cannot be determined, will have -1 #' in their cell. #' #' @param .data Mitcr data.frame. #' @param .Vs Table of V segments; must have 'V.segment' and 'Nucleotide.sequence' columns. #' @param .Js Table of J segments; must have 'J.segment' and 'Nucleotide.sequence' columns. #' @param .Ds Table of D segments; must have 'D.segment' and 'Nucleotide.sequence' columns. #' #' @return Mitcr data.frame with 3 (for alpha chains) or 5 (for beta chains) new columns for deletions. #' #' @details By default, \code{*.table} parameters are taken from the \code{segments} data frame which #' can be loaded to your R environment with data(segments). Data for segments has been taken from IMGT. #' #' @examples #' \dontrun{ #' data(segments) #' immdata <- get.deletions.beta(.data) #' immdata.prob <- tcr.prob.df(immdata) #' } get.deletions.alpha <- function (.data, .Vs = segments$TRAV, .Js = segments$TRAJ) { cat('Preparing data...\n') Last.V.nucleotide.position <- .data$Last.V.nucleotide.position First.J.nucleotide.position <- .data$First.J.nucleotide.position seqs <- .data$CDR3.nucleotide.sequence cat('Computing V deletions...\n') pb <- txtProgressBar(max = length(seqs), style = 3) Vs <- sapply(.data$V.gene, function (x) { V <- .split.get(x) res <- .Vs$Nucleotide.sequence[.Vs$V.alleles == V][1] if (is.na(res)) { res <- .Vs$Nucleotide.sequence[.Vs$V.alleles == paste(V, '-1', sep = '')][1] } if (is.na(res)) { res <- .Vs$Nucleotide.sequence[.Vs$V.alleles == substr(V, 1, nchar(V) - 2)][1] } add.pb(pb) res } ) V.deletions <- nchar(Vs) - Last.V.nucleotide.position - 1 close(pb) cat('Computing J deletions...\n') pb <- txtProgressBar(max = length(seqs), style = 3) Js <- sapply(.data$J.gene, function (x) { J <- .split.get(x) res <- .Js$Nucleotide.sequence[.Js$J.alleles == J][1] if (is.na(res)) { res <- .Js$Nucleotide.sequence[.Js$J.alleles == paste(J, '-1', sep = '')][1] } if (is.na(res)) { res <- .Js$Nucleotide.sequence[.Js$J.alleles == substr(J, 1, nchar(J) - 2)][1] } add.pb(pb) res } ) J.deletions <- nchar(Js) - (nchar(seqs) - First.J.nucleotide.position) cat('Aligning J segments...\n') pb <- set.pb(length(Js)) tmp <- sapply(1:length(Js), function (j) { J.seq <- Js[j] data.nchar <- nchar(seqs[j]) .data <- seqs[j] J.nchar <- nchar(J.seq) add.pb(pb) flag <- F for (i in 1:(min(data.nchar, J.nchar))) { if (substr(J.seq, J.nchar - i + 1, J.nchar - i + 1) != substr(.data, data.nchar - i + 1, data.nchar - i + 1)) { flag <- T break } } if (flag) i <- i - 1 substr(J.seq, J.nchar - i + 1, J.nchar) }) close(pb) J.deletions <- nchar(Js) - nchar(tmp) close(pb) .data$V.deletions <- V.deletions .data$J.deletions <- J.deletions .data$Total.deletions <- V.deletions + J.deletions .data$Total.deletions[V.deletions < 0 | J.deletions < 0] <- -1 .data } get.deletions.beta <- function (.data, .Vs = segments$TRBV, .Js = segments$TRBJ, .Ds = segments$TRBD) { if (has.class(.data, 'list')) { res <- lapply(1:length(.data), function (i) { cat('Processing data from', paste0('"', names(.data)[i], '"...', collapse=''), i,'/',length(.data),'\n') get.deletions.beta(.data[[i]], .Vs = .Vs, .Js = .Js, .Ds = .Ds) } ) names(res) <- names(.data) return(res) } cat('Preparing data...\n') pb <- txtProgressBar(max = 5, style = 3) Last.V.nucleotide.position <- .data$Last.V.nucleotide.position add.pb(pb) First.D.nucleotide.position <- .data$First.D.nucleotide.position add.pb(pb) Last.D.nucleotide.position <- .data$Last.D.nucleotide.position add.pb(pb) First.J.nucleotide.position <- .data$First.J.nucleotide.position add.pb(pb) seqs <- .data$CDR3.nucleotide.sequence add.pb(pb) close(pb) cat('Computing VD deletions...\n') pb <- txtProgressBar(max = length(seqs), style = 3) Vs <- sapply(.data$V.gene, function (x) { V <- .split.get(x) res <- .Vs$Nucleotide.sequence[.Vs$V.segment == V][1] if (is.na(res)) { res <- .Vs$Nucleotide.sequence[.Vs$V.segment == paste(V, '-1', sep = '')][1] } if (is.na(res)) { res <- .Vs$Nucleotide.sequence[.Vs$V.segment == substr(V, 1, nchar(V) - 2)][1] } add.pb(pb) res } ) VD.deletions <- nchar(Vs) - Last.V.nucleotide.position - 1 close(pb) cat('Computing DJ deletions...\n') pb <- txtProgressBar(max = length(seqs), style = 3) Js <- sapply(.data$J.gene, function (x) { J <- .split.get(x) res <- .Js$Nucleotide.sequence[.Js$J.segment == J][1] if (is.na(res)) { res <- .Js$Nucleotide.sequence[.Js$J.segment == paste(J, '-1', sep = '')][1] } if (is.na(res)) { res <- .Js$Nucleotide.sequence[.Js$J.segment == substr(J, 1, nchar(J) - 2)][1] } add.pb(pb) res } ) DJ.deletions <- nchar(Js) - (nchar(seqs) - First.J.nucleotide.position) close(pb) cat("Computing D'5 and D'3 deletions...\n") pb <- txtProgressBar(max = length(seqs) * 2, style=3) D.gene <- .data$D.gene D.straight <- sapply(1:length(D.gene), function (i) { add.pb(pb) substr(seqs[i], First.D.nucleotide.position[i] + 1, Last.D.nucleotide.position[i] + 1) } ) D.rev <- revcomp(D.straight) D.deletions <- sapply(1:length(D.gene), function (i) { D <- .split.get(D.gene[i]) first.index <- -1 res <- c(-1, -1) if (D != '') { D.str <- .Ds$Nucleotide.sequence[.Ds[,1] == D] # D.sub <- substr(seqs[i], # First.D.nucleotide.position[i] + 1, # Last.D.nucleotide.position[i] + 1) D.sub <- D.straight[i] first.index <- regexpr(D.sub, D.str, fixed=T, useBytes=T)[1] if (first.index != -1) { res[1] <- first.index - 1 res[2] <- nchar(D.str) - (first.index + nchar(D.sub) - 1) } else { # first.index <- regexpr(rev.comp(D.sub), D.str, fixed=T, useBytes=T)[1] first.index <- regexpr(D.rev[i], D.str, fixed=T, useBytes=T)[1] if (first.index != -1) { res[1] <- first.index - 1 res[2] <- nchar(D.str) - (first.index + nchar(D.sub) - 1) } } } add.pb(pb) res } ) close(pb) .data$VD.deletions <- VD.deletions .data$DJ.deletions <- DJ.deletions .data$D5.deletions <- D.deletions[1,] .data$D3.deletions <- D.deletions[2,] .data$Total.deletions <- VD.deletions + DJ.deletions + D.deletions[1,] + D.deletions[2,] .data$Total.deletions[VD.deletions < 0 | DJ.deletions < 0 | D.deletions[1,] < 0 | D.deletions[2,] < 0] <- -1 .data } #' Generate random nucleotide TCR sequences. #' #' @description #' Given the list of probabilities and list of segments (see "Details"), generate a artificial TCR repertoire. #' #' @param .count Number of TCR sequences to generate. #' @param .chain Either "alpha" or "beta" for alpha and beta chain respectively. #' @param .segments List of segments (see "Details"). #' @param .P.list List of probabilities (see "Details"). #' #' @details #' For the generation of a artifical TCR repertoire user need to provide two objects: the list with segments and the list with probabilities. #' List with segments is a list of 5 elements with 5 names: "TRAV", "TRAJ", "TRBV", "TRBD", "TRBJ". Each element is a data frame with following columns #' (order is matters!): "V.allelles" with names for V-segments (for TRAV and TRBV; for others is "J.allelles" or "D.allelles"), "CDR3.position" (the function doesn't use it, but you #' should provide it, fill it with zeros, for example), "Full.nucleotide.sequence" (the function doesn't use it), "Nucleotide.sequence" (function uses it for getting nucleotide #' sequences of segments) and "Nucleotide.sequence.P" (the function doesn't use it). #' #' List with probabilities is quite complicated, so just call \code{data(beta.prob)} for beta chain probabilities (alpha chain probabilities will be added soon). #' #' @return Mitcr data.frame with generated sequences. #' #' @seealso \link{genesegments} \link{beta.prob} #' #' @examples #' \dontrun{ #' # Load list of segments provided along with tcR. #' data(genesegments) #' # Load list of probabilities provided along with tcR. #' data(beta.prob) #' # Generate repertoire of beta chian with 10000 sequences. #' artif.rep <- generate.tcR(10000, 'beta') #' View(artif.rep) #' } generate.tcr <- function (.count = 1, .chain = c('beta', 'alpha'), .segments, .P.list = if (.chain[1] == 'alpha') alpha.prob else beta.prob) { # .unique = -1 cat('Preparing necessary data...\n') ############### # ALPHA CHAIN # ############### if (.chain[1] == 'alpha') { pb <- set.pb(3) .V.J.prob <- .P.list$P.V.J V.J.sample <- sample2D(.V.J.prob, .count) V.sample <- V.J.sample[,1] add.pb(pb) J.sample <- V.J.sample[,2] add.pb(pb) .del.V.prob <- .P.list$P.del.V # names(.del.V.prob)[-1] <- sapply(names(.del.V.prob)[-1], function (x) { sub('.', '-', x, fixed=T) }) V.dels <- sapply(V.sample, function (x) { sample(x=0:(nrow(.del.V.prob) - 1), size=1, prob=.del.V.prob[,x]) } ) add.pb(pb) .del.J.prob <- .P.list$P.del.J # names(.del.J.prob)[-1] <- sapply(names(.del.J.prob)[-1], function (x) { sub('.', '-', x, fixed=T) }) J.dels <- sapply(J.sample, function (x) { sample(x=0:(nrow(.del.J.prob) - 1), size=1, prob=.del.J.prob[,x]) } ) add.pb(pb) cat('Generating segments and insertions...\n') pb <- set.pb(4) .Vs <- .segments$TRAV V <- .Vs$Nucleotide.sequence[match(V.sample, .Vs[,1])] add.pb(pb) .Js <- .segments$TRAJ J <- .Js$Nucleotide.sequence[match(J.sample, .Js[,1])] add.pb(pb) .ins.len.prob <- .P.list$P.ins.len VJ.ins.lens <- sample(x=0:(nrow(.ins.len.prob) - 1), size=.count, replace=T, prob=.ins.len.prob[,2]) add.pb(pb) .ins.nucl.prob <- .P.list$P.ins.nucl VJ.ins.nucls <- generate.kmers.prob(VJ.ins.lens, .probs=.ins.nucl.prob[,c(1, 2:5)], .last.nucl = substr(V, nchar(V) - V.dels, nchar(V) - V.dels)) add.pb(pb) close(pb) cat('Finalising sequences...\n') pb <- set.pb(.count) Vns <- nchar(V) Jns <- nchar(J) seqs <- sapply(1:.count, function (i) { add.pb(pb) paste0(substr(V[i], 1, Vns[i] - V.dels[i]), VJ.ins.nucls[i], substr(J[i], J.dels[i] + 1, Jns[i]), collapse = '') } ) close(pb) cat('Generating data frame...\n') res<-data.frame(Read.count = 1, CDR3.nucleotide.sequence = seqs, CDR3.amino.acid.sequence = bunch.translate(seqs), V.gene = V.sample, J.gene = J.sample, D.gene = '', VD.insertions = -1, DJ.insertions = -1, Total.insertions = VJ.ins.lens, VJ.inserted.sequence = VJ.ins.nucls, VD.deletions = V.dels, DJ.deletions = J.dels, Total.deletions = V.dels + J.dels, stringsAsFactors=F) # if (.inframe){ # res<-cbind(rep(1,nrow(res)),res) # names(res)[1]<-"Read.count" # res<-get.outframes((res),T) # } } ############## # BETA CHAIN # ############## else { pb <- set.pb(7) .V.prob <- .P.list$P.V V.sample <- sample(x=row.names(.V.prob), size=.count, replace=T, prob=.V.prob) add.pb(pb) .D.J.prob <-.P.list$P.J.D JD.sample <- sample2D(.D.J.prob, .count=.count) add.pb(pb) .del.V.prob <- .P.list$P.del.V # names(.del.V.prob)[-1] <- sapply(names(.del.V.prob)[-1], function (x) { sub('.', '-', x, fixed=T) }) VD.dels <- sapply(V.sample, function (x) { sample(x=0:(nrow(.del.V.prob) - 1), size=1, prob=.del.V.prob[,x]) } ) add.pb(pb) .del.J.prob <- .P.list$P.del.J # names(.del.J.prob)[-1] <- sapply(names(.del.J.prob)[-1], function (x) { sub('.', '-', x, fixed=T) }) DJ.dels <- apply(JD.sample, 1, function (x) { sample(x=0:(nrow(.del.J.prob) - 1), size=1, prob=.del.J.prob[,x[1]]) } ) add.pb(pb) D1s <- JD.sample[,2] == 'TRBD1' D5.D3.dels <- matrix(rep('', times=length(JD.sample)), ncol = 2) add.pb(pb) .del.D1.prob <- .P.list$P.del.D1 row.names(.del.D1.prob) <- 0:(nrow(.del.D1.prob) - 1) D5.D3.dels[D1s,] <- sample2D(.del.D1.prob, .count=length(which(D1s))) add.pb(pb) .del.D2.prob <- .P.list$P.del.D2 row.names(.del.D2.prob) <- 0:(nrow(.del.D2.prob) - 1) D5.D3.dels[!D1s,] <- sample2D(.del.D2.prob, .count=dim(JD.sample)[1] - length(which(D1s))) add.pb(pb) cat('Generating segments and insertions...\n') pb <- set.pb(7) .Vs <- .segments$TRBV V <- .Vs$Nucleotide.sequence[match(V.sample, .Vs[,1])] add.pb(pb) .Js <- .segments$TRBJ J <- .Js$Nucleotide.sequence[match(JD.sample[,1], .Js[,1])] add.pb(pb) .Ds <- .segments$TRBD D <- .Ds$Nucleotide.sequence[match(JD.sample[,2], .Ds[,1])] add.pb(pb) .ins.len.prob <- .P.list$P.ins.len VD.ins.lens <- sample(x=0:(nrow(.ins.len.prob) - 1), size=.count, replace=T, prob=.ins.len.prob[,2]) add.pb(pb) DJ.ins.lens <- sample(x=0:(nrow(.ins.len.prob) - 1), size=.count, replace=T, prob=.ins.len.prob[,3]) add.pb(pb) # Few secs here .ins.nucl.prob <- .P.list$P.ins.nucl VD.ins.nucls <- generate.kmers.prob(VD.ins.lens, .probs=.ins.nucl.prob[,c(1, 2:5)], .last.nucl = substr(V, nchar(V) - VD.dels, nchar(V) - VD.dels)) add.pb(pb) # Few secs here DJ.ins.nucls <- generate.kmers.prob(DJ.ins.lens, .probs=.ins.nucl.prob[,c(1, 6:9)], .last.nucl = substr(D, nchar(D) - as.integer(D5.D3.dels[,2]), nchar(D) - as.integer(D5.D3.dels[,2]))) add.pb(pb) close(pb) close(pb) cat('Finalising sequences...\n') pb <- set.pb(.count) Vns <- nchar(V) Dns <- nchar(D) Jns <- nchar(J) seqs <- sapply(1:.count, function (i) { add.pb(pb) paste0(substr(V[i], 1, Vns[i] - VD.dels[i]), VD.ins.nucls[i], substr(D[i], as.integer(D5.D3.dels[i,1]) + 1, Dns[i] - as.integer(D5.D3.dels[i,2])), DJ.ins.nucls[i], substr(J[i], DJ.dels[i] + 1, Jns[i]), collapse = '') } ) seqs.sep <- sapply(1:.count, function (i) { add.pb(pb) paste(substr(V[i], 1, Vns[i] - VD.dels[i]), VD.ins.nucls[i], substr(D[i], as.integer(D5.D3.dels[i,1]) + 1, Dns[i] - as.integer(D5.D3.dels[i,2])), DJ.ins.nucls[i], substr(J[i], DJ.dels[i] + 1, Jns[i]), sep = ':') } ) close(pb) cat('Generating data frame...\n') res<-data.frame(Read.count = 1, CDR3.nucleotide.sequence = seqs, CDR3.nucleotide.sequence.sep = seqs.sep, CDR3.amino.acid.sequence = bunch.translate(seqs), V.gene = V.sample, J.gene = JD.sample[,1], D.gene = JD.sample[,2], VD.insertions = VD.ins.lens, DJ.insertions = DJ.ins.lens, Total.insertions = VD.ins.lens + DJ.ins.lens, VJ.inserted.sequence = VD.ins.nucls, DJ.inserted.sequence = DJ.ins.nucls, VD.deletions = VD.dels, DJ.deletions = DJ.dels, Total.deletions = VD.dels + DJ.dels, stringsAsFactors=F) # if (.inframe){ # res<-cbind(rep(1,nrow(res)),res) # names(res)[1]<-"Read.count" # res<-get.outframes((res),T) # } } res$Inframe <- nchar(res$CDR3.nucleotide.sequence) %% 3 == 0 cat('Generated', sum(res$Inframe), 'in-frame sequences and', nrow(res) - sum(res$Inframe), 'out-of-frame sequences.') res } #' Proportions of specifyed subsets of clones. #' #' @aliases tailbound.proportion clonal.proportion top.proportion #' #' @usage #' tailbound.proportion(.data, .bound = 2, .col = 'Read.count') #' #' top.proportion(.data, .head = 10, .col = 'Read.count') #' #' clonal.proportion(.data, .perc = 10, .col = 'Read.count') #' #' @description #' Get a specifyed subset of the given repertiure and compute which proportion in counts #' it has comparing to the overall count. #' #' \code{tailbound.proportion} - subset by the count; #' #' \code{top.proportion} - subset by rank (top N clones); #' #' \code{clonal.proportion} - subset by a summary percentage (top N clones which in sum has the given percentage). #' #' @param .data Data frame or a list with data frames. #' @param .bound Subset the \code{.data} by \code{.col} <= \code{.bound}. #' @param .head How many top values to choose - parameter to the \code{.head} function. #' @param .perc Percentage (0 - 100). #' @param .col Column's name with counts of sequences. #' #' @return For \code{tailbound.proportion} - numeric vector of percentage. #' #' For \code{top.proportion} - numeric vector of percentage for top clones. #' For \code{clonal.proportion} - vector or matrix with values for number of clones, occupied percentage and proportion of the #' chosen clones to the overall count of clones. #' @seealso \link{vis.top.proportions}, \link{prop.sample} #' #' @examples #' \dontrun{ #' # How many clones fill up approximately #' clonal.proportion(immdata, 25) # the 25% of the sum of values in 'Read.count'? #' #' # What proportion of the top-10 clones' reads #" top.proportion(immdata, 10) # to the overall number of reads? #' vis.top.proportions(immdata) # Plot this proportions. #' #' # What proportion of sequences which #' # has 'Read.count' <= 100 to the #' tailbound.proportion(immdata, 100) # overall number of reads? #' } tailbound.proportion <- function (.data, .bound = 2, .col = 'Read.count') { if (has.class(.data, 'list')) { return(sapply(.data, tailbound.proportion, .bound = .bound, .col = .col)) } sum(.data[, .col] <= .bound) / nrow(.data) } top.proportion <- function (.data, .head = 10, .col = 'Read.count') { if (has.class(.data, 'list')) { return(sapply(.data, top.proportion, .head = .head, .col = .col)) } sum(head(.data[, .col], .head)) / sum(.data[, .col]) } clonal.proportion <- function (.data, .perc = 10, .col = 'Read.count') { if (has.class(.data, 'list')) { return(t(sapply(.data, clonal.proportion, .perc = .perc, .col = .col))) } prop <- 0 n <- 0 col <- .data[, .col] col.sum <- sum(col) while (prop < col.sum * (.perc / 100)) { n <- n + 1 prop <- prop + col[n] } c(Clones = n, Percentage = 100 * signif((prop / col.sum), 3), Clonal.count.prop = n / nrow(.data)) } #' Rearrange columns with counts for clonesets. #' #' @description #' Replace Read.count with Umi.count, recompute Percentage and sort data. #' #' @param .data Data frame with columns "Umi.count" and "Read.count". #' #' @return Data frame with new "Read.count" and "Percentage" columns. barcodes.to.reads <- function (.data) { if (has.class(.data, 'list')) { return(lapply(.data, barcodes.to.reads)) } .data$Read.count <- .data$Umi.count .data$Percentage <- .data$Read.count / sum(.data$Read.count) .data[order(.data$Percentage, decreasing = T),] } #' Resample data frame using values from the column with number of clonesets. #' #' @aliases resample downsample prop.sample #' #' @description #' Resample data frame using values from the column with number of clonesets. Number of clonestes (i.e., rows of a MiTCR data frame) #' are reads (usually the "Read.count" column) or UMIs (i.e., barcodes, usually the "Umi.count" column). #' #' @usage #' resample(.data, .n = -1, .col = c("read.count", "umi.count")) #' #' downsample(.data, .n, .col = c("read.count", "umi.count")) #' #' prop.sample(.data, .perc = 50, .col = c("read.count", "umi.count")) #' #' @param .data Data frame with the column \code{.col} or list of such data frames. #' @param .n Number of values / reads / UMIs to choose. #' @param .perc Percentage (0 - 100). See "Details" for more info. #' @param .col Which column choose to represent quanitites of clonotypes. See "Details". #' #' @return Subsampled data frame. #' #' @details #' \code{resample}. Using multinomial distribution, compute the number of occurences for each cloneset, than remove zero-number clonotypes and #' return resulting data frame. Probabilities for \code{rmultinom} for each cloneset is a percentage of this cloneset in #' the \code{.col} column. It's a some sort of simulation of how clonotypes are chosen from the organisms. For now it's not working #' very well, so use \code{downsample} instead. #' #' \code{downsample}. Choose \code{.n} clones (not clonotypes!) from the input repertoires without any probabilistic simulation, but #' exactly computing each choosed clones. Its output is same as for \code{resample} (repertoires), but is more consistent and #' biologically pleasant. #' #' \code{prop.sample}. Choose the first N clonotypes which occupies \code{.perc} percents of overall UMIs / reads. #' #' @seealso \link{rmultinom}, \link{clonal.proportion} #' #' @examples #' \dontrun{ #' # Get 100K reads (not clones!). #' immdata.1.100k <- resample(immdata[[1]], 100000, .col = "read.count") #' } resample <- function (.data, .n = -1, .col = c("read.count", "umi.count")) { if (has.class(.data, 'list')) { if (length(.n) != length(.data)) { .n <- c(.n, rep.int(-1, length(.data) - length(.n))) } return(lapply(.data, resample, .n = .n, .col = .col)) } .col <- .column.choice(.col[1]) if (.n == -1) { .n <- sum(.data[, .col]) } new.bc <- rmultinom(1, .n, .data[, .col] / sum(.data[, .col])) .data[, .col] <- new.bc non.zeros <- new.bc != 0 .data <- .data[non.zeros, ] perc.col <- paste0(strsplit(.col, ".", T)[[1]][1], ".proportion") .data[[perc.col]] <- new.bc[non.zeros] / sum(new.bc) .data[order(.data[[perc.col]], decreasing = T),] } downsample <- function (.data, .n, .col = c("read.count", "umi.count")) { if (has.class(.data, 'list')) { return(lapply(.data, downsample, .n = .n, .col = .col)) } col_current <- .column.choice(.col[1]) read_vec <- .data[, col_current] read_indices <- rep(0, sum(read_vec)) cppFunction( ' NumericVector fill_vec(NumericVector read_vec, NumericVector read_indices) { int dummy = 0; for (int i = 0; i < read_vec.size(); i++) { for (int j = dummy; j < (read_vec[i] + dummy); j++) { read_indices[j] = i; } dummy = dummy + read_vec[i]; } return read_indices; } ' ) read_indices <- fill_vec(read_vec, read_indices) new_counts <- sample(read_indices, .n) new_reads <- rep(0, length(read_vec)) cppFunction( ' NumericVector fill_reads(NumericVector new_reads, NumericVector new_counts) { for (int i = 0; i < new_counts.size(); i++) { new_reads[new_counts[i]] = new_reads[new_counts[i]] + 1; } return new_reads; } ' ) .data[, col_current] <- fill_reads(new_reads, new_counts) subset(.data, .data[, col_current] > 0) } prop.sample <- function (.data, .perc = 50, .col = c("read.count", "umi.count")) { if (has.class(.data, "data.frame")) { .data = list(Data = .data) } .col = .column.choice(.col[1]) res = lapply(.data, function (df) { df[1:(clonal.proportion(df, .perc, .col)[1]), ] }) if (length(res) == 1) { res[[1]] } else { res } } #' Set new columns "Rank" and "Index". #' #' @aliases set.rank set.index #' #' @description #' Set new columns "Rank" and "Index": #' #' set.rank <==> .data$Rank = rank(.data[, .col], ties.method = 'average') #' #' set.index <==> .data$Index = 1:nrow(.data) in a sorted data frame by \code{.col} #' #' @param .data Data frame or list with data frames. #' @param .col Character vector with name of the column to use for ranking or indexing. #' #' @return Data frame with new column "Rank" or "Index" or list with such data frames. set.rank <- function (.data, .col = "Read.count") { if (has.class(.data, 'list')) { lapply(.data, set.rank, .col = .col) } else { y <- 1 / .data[[.col]] .data$Rank <- rank(y, ties.method = 'average') .data } } set.index <- function (.data, .col = "Read.count") { if (has.class(.data, 'list')) { return(lapply(.data, set.index)) } .data <- .data[order(.data[, .col], decreasing = T), ] .data$Index <- 1:nrow(.data) .data }tcR/R/mitcr.R0000644000176200001440000000457313667026401012462 0ustar liggesusers#' Start MiTCR directly from the package. #' #' @description #' Start the MiTCR tools directly from the package with given settings. #' #' @param .input,.output Input and output files. #' @param .file.path Path prepending to \code{.input} and \code{.output}. #' If input and output is empty, but .file.path is specified, #' than process all files from the folder \code{.file.path} #' @param ... Specify input and output files and arguments #' of the MITCR without first '-' to run it. #' @param .mitcr.path Path to MiTCR .jar file. #' @param .mem Volume of memory available to MiTCR. #' #' @details #' Don't use spaces in paths! #' You should have insalled JDK 1.7 to make it works. #' #' @examples #' \dontrun{ #' # Equal to #' # java -Xmx8g -jar ~/programs/mitcr.jar -pset flex #' # -level 2 ~/data/raw/TwA1_B.fastq.gz ~/data/mitcr/TwA1_B.txt #' startmitcr('raw/TwA1_B.fastq.gz', 'mitcr/TwA1_B.txt', .file.path = '~/data/', #' pset = 'flex', level = 1, 'debug', .mitcr.path = '~/programs/', .mem = '8g') #' } startmitcr <- function (.input = '', .output = '', ..., .file.path = '', .mitcr.path = '~/programs/', .mem = '4g') { if (.input == '') { startmitcr(list.files(.file.path), paste0('/mitcr/', list.files(.file.path), '.txt'), ..., .file.path = .file.path, .mitcr.path = .mitcr.path, .mem = .mem) } else if (length(.input) > 1) { for (i in 1:length(.input)) { startmitcr(.input[i], .output[i], ..., .file.path = .file.path, .mitcr.path = .mitcr.path, .mem = .mem) } } else { if (.file.path[length(.file.path)] != '/' && .file.path != '') { .file.path <- paste(.file.path, '/', sep = '') } .input <- paste(.file.path, .input, sep = '') .output <- paste(.file.path, .output, sep = '') args <- list(...) args.names <- names(args) if (is.null(names(args))) { args.names <- rep('', length(args)) } args.str <- '' for (i in 1:length(args)) { if (args.names[i] == '') { args.str <- paste(args.str, paste('-', args[[i]], sep = '')) } else { args.str <- paste(args.str, paste('-', args.names[i], sep = ''), args[[i]]) } } args.str <- paste(args.str, .input, .output) system(paste('java', paste('-Xmx', .mem, sep = ''), '-jar', paste(.mitcr.path, 'mitcr.jar', sep = ''), args.str)) } }tcR/R/measures.R0000644000176200001440000002357313667026401013171 0ustar liggesusers########## Evaluation of distributions, vectors and sets ########## #' Information measures. #' #' @aliases entropy js.div kl.div #' #' @description #' Functions for information measures of and between distributions of values. #' #' Warning! #' Functions will check if \code{.data} if a distribution of random variable (sum == 1) or not. #' To force normalisation and / or to prevent this, set \code{.do.norm} to TRUE (do normalisation) #' or FALSE (don't do normalisation). For \code{js.div} and \code{kl.div} vectors of values must have #' equal length. #' #' Functions: #' #' - The Shannon entropy quantifies the uncertainty (entropy or degree of surprise) #' associated with this prediction. #' #' - Kullback-Leibler divergence (information gain, information divergence, #' relative entropy, KLIC) is a non-symmetric measure of the difference between #' two probability distributions P and Q (measure of information lost when Q is used to #' approximate P). #' #' - Jensen-Shannon divergence is a symmetric version of KLIC. Square root of this #' is a metric often referred to as Jensen-Shannon distance. #' #' @usage #' entropy(.data, .norm = F, .do.norm = NA, .laplace = 1e-12) #' #' kl.div(.alpha, .beta, .do.norm = NA, .laplace = 1e-12) #' #' js.div(.alpha, .beta, .do.norm = NA, .laplace = 1e-12, .norm.entropy = F) #' #' @param .data,.alpha,.beta Vector of values. #' @param .norm if T then compute normalised entropy (H / Hmax). #' @param .do.norm One of the three values - NA, T or F. If NA than check for distrubution \code{(sum(.data) == 1)}. #' and normalise if needed with the given laplace correction value. if T then do normalisation and laplace #' correction. If F than don't do normalisaton and laplace correction. #' @param .laplace Value for Laplace correction which will be added to every value in the .data. #' @param .norm.entropy if T then normalise JS-divergence by entropy. #' #' @return Shannon entropy, Jensen-Shannon divergence or Kullback-Leibler divergence values. #' #' @seealso \link{similarity}, \link{diversity} entropy <- function (.data, .norm = F, .do.norm = NA, .laplace = 1e-12) { .data <- check.distribution(.data, .do.norm, .laplace, .warn.zero = T) res <- - sum(.data * log2(.data)) if (.norm) { res / log2(length(.data)) } else { res } } kl.div <- function (.alpha, .beta, .do.norm = NA, .laplace = 1e-12) { .alpha <- check.distribution(.alpha, .do.norm, .laplace, .warn.zero = T) .beta <- check.distribution(.beta, .do.norm, .laplace, .warn.zero = T) sum(log2(.alpha / .beta) * .alpha) } js.div <- function (.alpha, .beta, .do.norm = NA, .laplace = 1e-12, .norm.entropy = F) { .alpha <- check.distribution(.alpha, .do.norm, .laplace, .warn.zero = T) .beta <- check.distribution(.beta, .do.norm, .laplace, .warn.zero = T) nrm = if (.norm.entropy) 0.5 * (entropy(.alpha, F) + entropy(.beta, F)) else 1 M <- (.alpha + .beta) / 2 0.5 * (kl.div(.alpha, M, F) + kl.div(.beta, M, F)) / nrm } #' Log-likelihood. #' #' @description #' Compute the log-likelihood of the given distribution or vector of counts. #' #' @param .data Vector for distribution or counts. #' @param .base Logarightm's base for the loglikelihood. #' @param .do.norm Parameter to the \code{check.distribution} function. #' @param .laplace Laplace correction, Parameter to the \code{check.distribution} function. #' #' @return Loglikelihood value. loglikelihood <- function (.data, .base = 2, .do.norm = NA, .laplace = 0.000000000001) { .data <- check.distribution(.data, .do.norm, .laplace) sum(log(.data, .base)) } #' Set and vector similarity measures. #' #' @aliases similarity cosine.similarity tversky.index overlap.coef morisitas.index jaccard.index horn.index #' #' @description #' Functions for computing similarity between two vectors or sets. See "Details" for exact formulas. #' #' - Cosine similarity is a measure of similarity between two vectors of an inner product space that measures the cosine of the angle between them. #' #' - Tversky index is an asymmetric similarity measure on sets that compares a variant to a prototype. #' #' - Overlap cofficient is a similarity measure related to the Jaccard index that measures the overlap between two sets, and is defined as the size of the intersection divided by the smaller of the size of the two sets. #' #' - Jaccard index is a statistic used for comparing the similarity and diversity of sample sets. #' #' - Morisita's overlap index is a statistical measure of dispersion of individuals in a population. It is used to compare overlap among samples (Morisita 1959). This formula is based on the assumption that increasing the size of the samples will increase the diversity because it will include different habitats (i.e. different faunas). #' #' - Horn's overlap index based on Shannon's entropy. #' #' Use the \link{repOverlap} function for computing similarities of clonesets. #' #' @usage #' cosine.similarity(.alpha, .beta, .do.norm = NA, .laplace = 0) #' #' tversky.index(x, y, .a = 0.5, .b = 0.5) #' #' overlap.coef(.alpha, .beta) #' #' jaccard.index(.alpha, .beta, .intersection.number = NA) #' #' morisitas.index(.alpha, .beta, .do.unique = T) #' #' horn.index(.alpha, .beta, .do.unique = T) #' #' @param .alpha,.beta,x,y Vector of numeric values for cosine similarity, vector of any values #' (like characters) for \code{tversky.index} and \code{overlap.coef}, matrix or data.frame with 2 columns for \code{morisitas.index} and \code{horn.index}, #' either two sets or two numbers of elements in sets for \code{jaccard.index}. #' @param .a,.b Alpha and beta parameters for Tversky Index. Default values gives the Jaccard index measure. #' @param .do.norm One of the three values - NA, T or F. If NA than check for distrubution (sum(.data) == 1) #' and normalise if needed with the given laplace correction value. if T then do normalisation and laplace #' correction. If F than don't do normalisaton and laplace correction. #' @param .laplace Value for Laplace correction. #' @param .do.unique if T then call unique on the first columns of the given data.frame or matrix. #' @param .intersection.number Number of intersected elements between two sets. See "Details" for more information. #' @details #' For \code{morisitas.index} input data are matrices or data.frames with two columns: first column is #' elements (species or individuals), second is a number of elements (species or individuals) in a population. #' #' Formulas: #' #' Cosine similarity: \code{cos(a, b) = a * b / (||a|| * ||b||)} #' #' Tversky index: \code{S(X, Y) = |X and Y| / (|X and Y| + a*|X - Y| + b*|Y - X|)} #' #' Overlap coefficient: \code{overlap(X, Y) = |X and Y| / min(|X|, |Y|)} #' #' Jaccard index: \code{J(A, B) = |A and B| / |A U B|} #' For Jaccard index user can provide |A and B| in \code{.intersection.number} otherwise it will be computed #' using \code{base::intersect} function. In this case \code{.alpha} and \code{.beta} expected to be vectors of elements. #' If \code{.intersection.number} is provided than \code{.alpha} and \code{.beta} are exptected to be numbers of elements. #' #' Formula for Morisita's overlap index is quite complicated and can't be easily shown here, so just look at this webpage: http://en.wikipedia.org/wiki/Morisita%27s_overlap_index #' #' #' @return Value of similarity between the given sets or vectors. #' #' @seealso \link{repOverlap}, \link{intersectClonesets}, \link{entropy}, \link{diversity} #' #' @examples #' \dontrun{ #' jaccard.index(1:10, 2:20) #' a <- length(unique(immdata[[1]][, c('CDR3.amino.acid.sequence', 'V.gene')])) #' b <- length(unique(immdata[[2]][, c('CDR3.amino.acid.sequence', 'V.gene')])) #' # Next #' jaccard.index(a, b, repOverlap(immdata[1:2], .seq = 'aa', .vgene = T)) #' # is equal to #' repOverlap(immdata[1:2], 'jaccard', seq = 'aa', .vgene = T) #' } cosine.similarity <- function (.alpha, .beta, .do.norm = NA, .laplace = 0) { .alpha <- check.distribution(.alpha, .do.norm, .laplace) .beta <- check.distribution(.beta, .do.norm, .laplace) sum(.alpha * .beta) / (sum(.alpha ^ 2) * sum(.beta ^ 2)) } tversky.index <- function (x, y, .a = 0.5, .b = 0.5) { XiY <- length(intersect(x, y)) XiY / (XiY + .a * length(setdiff(x, y)) + .b * length(setdiff(y, x))) } overlap.coef <- function (.alpha, .beta) { length(intersect(.alpha, .beta)) / min(length(.alpha), length(.beta)) } jaccard.index <- function (.alpha, .beta, .intersection.number = NA) { if (is.na(.intersection.number)) { abin <- length(intersect(.alpha, .beta)) abin / (length(unique(.alpha)) + length(unique(.beta)) - abin) } else { .intersection.number / (.alpha + .beta - .intersection.number) } } morisitas.index <- function (.alpha, .beta, .do.unique = T) { colnames(.alpha) <- c('Species', 'Count') colnames(.beta) <- c('Species', 'Count') if (.do.unique) { .alpha <- .alpha[!duplicated(.alpha[,1]),] .beta <- .beta[!duplicated(.beta[,1]),] } .alpha[,2] <- as.numeric(.alpha[,2]) .beta[,2] <- as.numeric(.beta[,2]) merged <- merge(.alpha, .beta, by = 'Species', all = T) merged[is.na(merged)] <- 0 sum.alpha <- sum(.alpha[,2]) sum.beta <- sum(.beta[,2]) 2 * sum(merged[,2] * merged[,3] / sum.alpha) / sum.beta / ( (sum((.alpha[,2] / sum.alpha)^2) + sum((.beta[,2] / sum.beta)^2))) } horn.index <- function (.alpha, .beta, .do.unique = T) { .alpha[,1] <- as.character(.alpha[,1]) .beta[,1] <- as.character(.beta[,1]) colnames(.alpha) <- c('Species', 'Count') colnames(.beta) <- c('Species', 'Count') if (.do.unique) { .alpha <- .alpha[!duplicated(.alpha[,1]),] .beta <- .beta[!duplicated(.beta[,1]),] } .alpha[,2] <- as.numeric(.alpha[,2]) / sum(.alpha[,2]) .beta[,2] <- as.numeric(.beta[,2]) / sum(.beta[,2]) merged <- merge(.alpha, .beta, by = 'Species', all = T) merged[is.na(merged)] <- 0 rel.12 <- merged[,2] / merged[,3] rel.12[merged[,3] == 0] <- 0 rel.21 <- merged[,3] / merged[,2] rel.21[merged[,2] == 0] <- 0 1 / log(2) * sum(merged[,2] / 2 * log(1 + rel.21) + merged[,3] / 2 * log(1 + rel.12)) }tcR/R/diversity.R0000644000176200001440000002502313667026401013357 0ustar liggesusers#' Distribution evaluation. #' #' @aliases inverse.simpson diversity gini chao1 gini.simpson #' #' @description #' Functions for evaluating the diversity of species or objects in the given distribution. #' See the \code{repOverlap} function for working with clonesets and a general interface to #' all of this functions. #' #' Warning! #' Functions will check if .data is a distribution of a random variable (sum == 1) or not. #' To force normalisation and / or to prevent this, set .do.norm to TRUE (do normalisation) #' or FALSE (don't do normalisation), respectively. #' #' - True diversity, or the effective number of types, refers to the number #' of equally-abundant types needed for the average proportional abundance #' of the types to equal that observed in the dataset of interest #' where all types may not be equally abundant. #' #' - Inverse Simpson index is the effective number of types that is obtained when #' the weighted arithmetic mean is used to quantify average #' proportional abundance of types in the dataset of interest. #' #' - The Gini coefficient measures the inequality among values #' of a frequency distribution (for example levels of income). A Gini coefficient of zero #' expresses perfect equality, where all values are the same (for example, where everyone #' has the same income). A Gini coefficient of one (or 100 percents ) expresses maximal inequality #' among values (for example where only one person has all the income). #' #' - The Gini-Simpson index is the probability of interspecific encounter, i.e., probability that two entities #' represent different types. #' #' - Chao1 estimator is a nonparameteric asymptotic estimator of species richness (number of species in a population). #' #' @usage #' inverse.simpson(.data, .do.norm = NA, .laplace = 0) #' #' diversity(.data, .q = 5, .do.norm = NA, .laplace = 0) #' #' gini(.data, .do.norm = NA, .laplace = 0) #' #' gini.simpson(.data, .do.norm = NA, .laplace = 0) #' #' chao1(.data) #' #' @param .data Numeric vector of values for proportions or for numbers of individuals. #' @param .q q-parameter for the Diversity index. #' @param .do.norm One of the three values - NA, T or F. If NA than check for distrubution (sum(.data) == 1) #' and normalise if needed with the given laplace correction value. if T then do normalisation and laplace #' correction. If F than don't do normalisaton and laplace correction. #' @param .laplace Value for Laplace correction which will be added to every value in the .data. #' #' @return Numeric vector of length 1 with value for all functions except \code{chao1}, which returns 4 values: #' estimated number of species, standart deviation of this number and two 95% confidence intervals for the species number. #' #' @seealso \link{repOverlap}, \link{entropy}, \link{similarity} #' #' @examples #' data(twb) #' # Next two are equal calls: #' stopifnot(gini(twb[[1]]$Read.count, TRUE, 0) - 0.7609971 < 1e-07) #' stopifnot(gini(twb[[1]]$Read.proportion, FALSE) - 0.7609971 < 1e-07) #' stopifnot(chao1(twb[[1]]$Read.count)[1] == 1e+04) inverse.simpson <- function (.data, .do.norm = NA, .laplace = 0) { .data <- check.distribution(.data, .do.norm, .laplace) 1 / sum(.data ^ 2) } diversity <- function (.data, .q = 5, .do.norm = NA, .laplace = 0) { .data <- check.distribution(.data, .do.norm, .laplace) if (.q == 0) { length(.data) } else if (.q == 1) { 1 / prod(.data ^ .data) } else if (.q > 1) { 1 / (sum(.data ^ .q) ^ (1 / (.q - 1))) } else { NA } } gini <- function (.data, .do.norm = NA, .laplace = 0) { .data <- sort(check.distribution(.data, .do.norm, .laplace, .warn.sum = F)) n <- length(.data) 1 / n * (n + 1 - 2 * sum((n + 1 - 1:n) * .data) / sum(.data)) } gini.simpson <- function (.data, .do.norm = NA, .laplace = 0) { 1 - 1 / inverse.simpson(.data, .do.norm, .laplace) } chao1 <- function (.data) { counts <- table(.data) e <- NA v <- NA lo <- NA hi <- NA n <- sum(.data) D <- length(.data) f1 <- counts['1'] f2 <- counts['2'] # f1 == 0 && f2 == 0 if (is.na(f1) && is.na(f2)) { e <- D i <- 1:max(.data) i <- i[unique(.data)] v <- sum(sapply(i, function(i) sum(.data == i) * (exp(-i) - exp(-2 * i)))) - (sum(sapply(i, function(i) i * exp(-i) * sum(.data == i))))^2/n P <- sum(sapply(i, function(i) sum(.data == i) * exp(-i)/D)) lo <- max(D, D/(1 - P) - qnorm(1 - .05/2) * sqrt(v)/(1 - P)) hi <- D/(1 - P) + qnorm(1 - .05/2) * sqrt(v)/(1 - P) } # f1 != 0 && f2 == 0 else if (is.na(f2)) { e <- D + f1 * (f1 - 1) / 2 * (n - 1) / n v <- (n-1)/n * f1 * (f1 - 1) /2 + ((n -1)/n)^2 * f1 * (2 * f1 - 1)^2/4 - ((n-1)/n)^2*f1^4/4/e t <- e - D K <- exp(qnorm(1 - .05/2) * sqrt(log(1 + v/t^2))) lo <- D + t/K hi <- D + t*K } # f1 != && f2 != 0 else { const <- (n - 1) / n e <- D + f1^2 / (2 * f2) * const f12 <- f1 / f2 v <- f2 * (const * f12^2 / 2 + const^2 * f12^3 + const^2 * f12^4 / 4) t <- e - D K <- exp(qnorm(.975) * sqrt(log(1 + v/t^2))) lo <- D + t/K hi <- D + t*K } c(Estimator = e, SD = sqrt(v), Conf.95.lo = lo, Conf.95.hi = hi) } # hill.numbers <- function (.data, .max.q = 6, .min.q = 1) { # print(head(.data)) # print(sum(.data)) # # .data <- check.distribution(.data) # print(head(.data)) # # if (.min.q < 0) { .min.q <- 0 } # res <- c() # # if (.min.q == 0) { # res <- length(.data) # .min.q <- 1 # } # # if (.min.q == 1) { # res <- c(res, exp(-sum(.data * log(.data)))) # .min.q <- 2 # } # # if (.max.q >= 2) { # for (q in .min.q:.max.q) { # res <- c(res, sum(.data ^ q)^(1 / (1 - q))) # } # } # # res # } #' Diversity evaluation using rarefaction. #' #' @description #' Sequentially resample the given data with growing sample size the given data and compute mean number of unique clones. #' For more details on the procedure see "Details". #' #' @param .data Data frame or a list with data frames. #' @param .step Step's size. By default - minimal repertoire size divided by 50. #' @param .quantile Numeric vector of length 2 with quantiles for confidence intervals. #' @param .extrapolation If N > 0 than perform extrapolation of all samples to the size of the max one +N reads or UMIs. By default - 200000. #' @param .col Column's name from which choose frequency of each clone. #' @param .verbose if T then print progress bar. #' #' @return #' Data frame with first column for sizes, second columns for the first quantile, #' third column for the mean, fourth columns for the second quantile, fifth columns #' for the name of subject. #' #' @details #' This subroutine is designed for diversity evaluation of repertoires. On each step it computes a #' mean unique clones from sample of fixed size using bootstrapping. Unique clones for each sample from bootstrap computed #' as a number of non-zero elements in a vector from multinomial distribution with input vector of probabilities from the \code{.col} column #' using function \code{rmultinom} with parameters n = .n, size = i * .step, prob = .data[, .col] (i is an index of current iteration) #' and choosing for lower and upper bound \code{quantile} bounds of the computed distribution of unique clones. #' #' @seealso \link{vis.rarefaction} \link{rmultinom} #' #' @examples #' \dontrun{ #' rarefaction(immdata, .col = "Read.count") #' } rarefaction <- function (.data, .step = NA, .quantile = c(.025, .975), .extrapolation = 200000, .col = 'Umi.count', .verbose = T) { if (has.class(.data, 'data.frame')) { .data <- list(Sample = .data) } if (is.na(.step)) { .step = min(sapply(.data, function (x) sum(x[[.col]]))) / 50. } # multinom # .alpha <- function (n, Xi, m) { # k <- Xi # if (k <= n - m) { # prod((n - k):(n - m - k + 1) / n:(n - m + 1)) # } else { # 0 # } # } # poisson .alpha <- function (n, Xi, m) { k <- Xi return((1 - m / n)^Xi) } if (.verbose) { pb <- set.pb(sum(sapply(1:length(.data), function (i) { bc.vec <- .data[[i]][, .col] bc.sum <- sum(.data[[i]][, .col]) sizes <- seq(.step, bc.sum, .step) if (sizes[length(sizes)] != bc.sum) { sizes <- c(sizes, bc.sum) } length(sizes) } ))) } muc.list <- lapply(1:length(.data), function (i) { Sobs <- nrow(.data[[i]]) bc.vec <- .data[[i]][, .col] Sest <- chao1(bc.vec) n <- sum(bc.vec) sizes <- seq(.step, n, .step) if (sizes[length(sizes)] != n) { sizes <- c(sizes, n) } counts <- table(bc.vec) muc.res <- t(sapply(sizes, function (sz) { freqs <- as.numeric(names(counts)) # multinom alphas <- sapply(freqs, function (k) .alpha(n, k, sz)) # Sind <- Sobs - sum(sapply(freqs, function (k) .alpha(n, k, sz) * counts[as.character(freqs)])) # SD <- sqrt(sum(sapply(freqs, function (k) (1 - .alpha(n, k, sz))^2 * counts[as.character(freqs)])) - Sind^2/Sest[1]) # poisson Sind <- sum(sapply(1:length(freqs), function (k) (1 - alphas[k]) * counts[k])) if (Sest[1] == Sobs) { SD <- 0 } else { SD <- sqrt(sum(sapply(1:length(freqs), function (k) (1 - alphas[k])^2 * counts[k])) - Sind^2/Sest[1]) } t <- Sind - Sobs K <- exp(qnorm(.975) * sqrt(log(1 + (SD / t)^2))) lo <- Sobs + t*K hi <- Sobs + t/K res <- c(sz, Sind, Sind, Sind) names(res) <- c('Size', paste0('Q', .quantile[1]), 'Mean', paste0('Q', .quantile[2])) if (.verbose) add.pb(pb) res })) if (.extrapolation > 0) { sizes <- seq(sum(.data[[i]][, .col]), .extrapolation + max(sapply(.data, function (x) sum(x[, .col]))), .step) if (length(sizes) != 1) { ex.res <- t(sapply(sizes, function (sz) { f0 <- Sest[1] - Sobs f1 <- counts['1'] if (is.na(f1) || f0 == 0) { Sind <- Sobs } else { Sind <- Sobs + f0 * (1 - exp(-(sz - n)/n * f1 / f0)) } res <- c(sz, Sind, Sind, Sind) names(res) <- c('Size', paste0('Q', .quantile[1]), 'Mean', paste0('Q', .quantile[2])) if (.verbose) add.pb(pb) res })) df1 <- data.frame(muc.res, People = names(.data)[i], Type = 'interpolation', stringsAsFactors = F) df2 <- data.frame(ex.res, People = names(.data)[i], Type = 'extrapolation', stringsAsFactors = F) rbind(df1, df2) } else { df1 <- data.frame(muc.res, People = names(.data)[i], Type = 'interpolation', stringsAsFactors = F) } } else { data.frame(muc.res, People = names(.data)[i], stringsAsFactors = F) } }) if (.verbose) close(pb) do.call(rbind, muc.list) }tcR/R/segments.R0000644000176200001440000002111113667033701013155 0ustar liggesusers########## Statistics and analysis of Variable and Joining genes usage ########## if (getRversion() >= "2.15.1") { utils::globalVariables(c('PC1', 'PC2', "Subject", "n")) } #' Gene usage. #' #' @aliases geneUsage #' #' @description #' Compute frequencies or counts of gene segments ("V / J - usage"). #' #' @param .data Cloneset data frame or a list with clonesets. #' @param .genes Either one of the gene alphabet (e.g., HUMAN_TRBV, \link{genealphabets}) or list with two gene alphabets for computing #' joint distribution. #' @param .quant Which column to use for the quantity of clonotypes: NA for computing only number of genes without using clonotype counts, #' "read.count" for the "Read.count" column, "umi.count" for the "Umi.count" column, "read.prop" for the "Read.proportion" column, #' "umi.prop" for the "Umi.proportion" column. #' @param .norm If T then return proportions of resulting counting of genes. #' @param .ambig If F than remove from counting genes which are not presented in the given gene alphabet(s). #' #' @return #' If \code{.data} is a cloneset and \code{.genes} is NOT a list than return a data frame with first column "Gene" with genes and second with counts / proportions. #' #' If \code{.data} is a list with clonesets and \code{.genes} is NOT a list than return a data frame with first column "Gene" #' with genes and other columns with counts / proportions for each cloneset in the input list. #' #' If \code{.data} is a cloneset and \code{.genes} IS a list than return a matrix with gene segments for the first gene in \code{.genes} #' and column names for the second gene in \code{.genes}. See "Examples". #' #' If \code{.data} is a list with clonesets and \code{.genes} IS a list than return a list with matrices like in the previous case. #' #' @seealso \code{\link{genealphabets}}, \code{\link{vis.gene.usage}}, \code{\link{pca.segments}} #' #' @examples #' \dontrun{ #' # Load your data #' data(twb) #' # compute V-segments frequencies of human TCR beta. #' seg <- geneUsage(twb, HUMAN_TRBV, .norm = T) #' # plot V-segments frequencies as a heatmap #' vis.heatmap(seg, .labs = c("Sample", "V gene")) #' # plot V-segments frequencies directly from clonesets #' vis.gene.usage(twb, HUMAN_TRBV) #' # plot V-segments frequencies from the gene frequencies #' vis.gene.usage(seg, NA) #' # Compute V-J joint usage. #' geneUsage(twb, list(HUMAN_TRBV, HUMAN_TRBJ)) #' # for future: #' # geneUsage(twb, "human", "trbv") #' } geneUsage <- function (.data, .genes = HUMAN_TRBV_MITCR, .quant = c(NA, "read.count", "umi.count", "read.prop", "umi.prop"), .norm = F, .ambig = F #, .species = c("human", "mouse"), .genes = c("trbv", "trbd", "trbj") ) { message(" ======================================== !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !! The tcR package WILL SOON BE ORPHANED !! AND REMOVED FROM CRAN. !! !! A new package is available that is !! designed to replace tcR: !! immunarch -- https://immunarch.com/ !! !! We will be happy to help you to move !! to the new package. Feel free to contact us: !! http://github.com/immunomind/immunarch !! !! Sincerely, !! immunarch dev team and !! Vadim I. Nazarov, lead developer of tcR !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! =======================================") .process.df <- function (.df, .quant, .cols) { cast.fun <- dcast if (length(.cols) == 2) { cast.fun <- acast; len <- 2 } for (i in 1:length(.cols)) { .df[ which(!(.df[[.cols[i]]] %in% .genes[[i]])), .cols[i] ] <- "Ambiguous" } if (length(.cols) == 1) { .cols <- c(.cols, '.'); len <- 1} .df = .df %>% select(na.exclude(c(.quant, .cols[1:len]))) .df = .df %>% grouped_df(.cols[1:len]) if (!is.na(.quant)) { .df = .df %>% summarise(Freq = sum(.quant)) } else { .df = .df %>% summarise(Freq = n()) } .df } .fix.ambig <- function (.res, .ambig) { if (length(.genes) == 2) { .res <- lapply(.res, function (x) { x[row.names(x) != "Ambiguous", ][, colnames(x) != "Ambiguous"] }) if (length(.data) == 1) { .res <- .res[[1]] } .res } else { .res[.res[,1] != "Ambiguous", ] } } quant <- NA if (!is.na(.quant[1])) { quant <- .column.choice(.quant, T) } if (has.class(.data, 'data.frame')) { .data <- list(Sample = .data) } if (has.class(.genes, 'list')) { genecols <- c(paste0(substr(.genes[[1]][1], 4, 4), ".gene"), paste0(substr(.genes[[2]][1], 4, 4), ".gene")) } else { genecols <- paste0(substr(.genes[1], 4, 4), ".gene") .genes <- list(.genes) } tbls <- lapply(.data, .process.df, .quant = quant, .cols = genecols) # JOINT GENE DISTRIBUTION if (length(.genes) == 2) { tbls <- lapply(tbls, function (x) { genrows <- .genes[[1]][is.na(match(.genes[[1]], row.names(x)))] gencols <- .genes[[2]][is.na(match(.genes[[2]], colnames(x)))] if (length(genrows) > 0) { x = rbind(x, matrix(0, ncol = ncol(x), nrow = length(genrows))) row.names(x)[(nrow(x) - length(genrows) + 1):nrow(x)] <- genrows } if (length(gencols) > 0) { x = cbind(x, matrix(0, nrow = nrow(x), ncol = length(gencols))) colnames(x)[(ncol(x) - length(gencols) + 1):ncol(x)] <- gencols } x[is.na(x)] <- 0 # x = x[order(.genes[[1]]), ][, order(.genes[[2]])] # View(x, "y") x }) if (.norm) { tbls <- lapply(tbls, function (x) x / sum(x)) } return(.fix.ambig(tbls, .ambig)) } # SINGLE GENE DISTRIBUTION res <- tbls[[1]] colnames(res) <- c("Gene", names(.data)[1]) if (length(.data) > 1) { for (i in 2:length(.data)) { colnames(tbls[[i]]) <- c("Gene", names(.data)[i]) res <- merge(res, tbls[[i]], by = "Gene", all = T) } } res <- merge(res, data.frame(Gene = .genes[[1]], Something = 0, stringsAsFactors = F), by = "Gene", all = T) res <- res[, -ncol(res)] res[is.na(res)] <- 0 if (!.ambig) { res <- .fix.ambig(res, .ambig) } if (.norm) { if (length(.genes) == 1) { res[,-1] <- apply(as.matrix(res[,-1]), 2, function (col) col / sum(col)) } else { res <- res / sum(res) } } res } #' Perform PCA on segments frequency data. #' #' @aliases pca.segments pca.segments.2D #' #' @description #' Perform PCA on gene segments frequency data for V- and J-segments and either return pca object or plot the results. #' #' @usage #' pca.segments(.data, .cast.freq.seg = T, ..., .text = T, .do.plot = T) #' #' pca.segments.2D(.data, .cast.freq.seg = T, ..., .text = T, .do.plot = T) #' #' @param .data Either data.frame or a list of data.frame or a result obtained from the \code{geneUsage} function. #' @param .cast.freq.seg if T then apply code{geneUsage} to the supplied data. #' @param ... Further arguments passed to \code{prcomp} or \code{geneUsage}. #' @param .text If T then plot sample names in the resulting plot. #' @param .do.plot if T then plot a graphic, else return a pca object. #' #' @return If .do.plot is T than ggplot object; else pca object. #' #' @examples #' \dontrun{ #' # Load the twins data. #' data(twb) #' # Plot a plot of results of PCA on V-segments usage. #' pca.segments(twb, T, scale. = T) #' } pca.segments <- function(.data, .cast.freq.seg = T, ..., .text = T, .do.plot = T){ if (.cast.freq.seg) { .data <- geneUsage(.data, ...)[,-1] } pca.res <- prcomp(t(as.matrix(.data)), ...) if (.do.plot) { pca.res <- data.frame(PC1 = pca.res$x[,1], PC2 = pca.res$x[,2], Subject = names(.data)) p <- ggplot() + geom_point(aes(x = PC1, y = PC2, colour = Subject), size = 3, data = pca.res) if (.text) { p <- p + geom_text(aes(x = PC1, y = PC2, label = Subject), data = pca.res, hjust=.5, vjust=-.3) } p + theme_linedraw() + guides(size=F) + ggtitle("VJ-usage: Principal Components Analysis") + .colourblind.discrete(length(pca.res$Subject), T) } else { pca.res } } pca.segments.2D <- function(.data, .cast.freq.seg = T, ..., .text = T, .do.plot = T){ if (.cast.freq.seg) { .data <- lapply(geneUsage(.data, ...), function (x) as.vector(x)) } pca.res <- prcomp(do.call(rbind, .data), ...) if (.do.plot) { pca.res <- data.frame(PC1 = pca.res$x[,1], PC2 = pca.res$x[,2], Subject = names(.data)) p <- ggplot() + geom_point(aes(x = PC1, y = PC2, colour = Subject), size = 3, data = pca.res) if (.text) { p <- p + geom_text(aes(x = PC1, y = PC2, label = Subject), data = pca.res, hjust=.5, vjust=-.3) } p <- p + theme_linedraw() + guides(size=F) + ggtitle("VJ-usage: Principal Components Analysis") + .colourblind.discrete(length(pca.res$Subject), T) } else { pca.res } }tcR/R/graph.R0000644000176200001440000002520713667026401012442 0ustar liggesusers######### MUTATION NETWORK MANAGING ########## #' Make mutation network for the given repertoire. #' #' @description #' Mutation network (or a mutation graph) is a graph with vertices representing nucleotide or in-frame amino acid sequences (out-of-frame amino acid sequences #' will automatically filtered out) and edges are connecting pairs of sequences with hamming distance or edit distance between them #' no more than specified in the \code{.max.errors} function parameter. #' #' @param .data Either character vector of sequences, data frame with \code{.label.col} #' or shared repertoire (result from the \code{shared.repertoire} function) constructed based on \code{.label.col}. #' @param .method Either "hamm" (for hamming distance) or "lev" (for edit distance). Passed to the \code{find.similar.sequences} function. #' @param .max.errors Passed to the \code{find.similar.sequences} function. #' @param .label.col Name of the column with CDR3 sequences (vertex labels). #' @param .seg.col Name of the column with V gene segments. #' @param .prob.col Name of the column with clonotype probability. #' #' @return Mutation network, i.e. igraph object with input sequences as vertices labels, ??? #' #' @seealso \link{shared.repertoire}, \link{find.similar.sequences}, \link{set.people.vector}, \link{get.people.names} #' #' @examples #' \dontrun{ #' data(twb) #' twb.shared <- shared.repertoire(twb) #' G <- mutation.network(twb.shared) #' get.people.names(G, 300, T) # "Subj.A|Subj.B" #' get.people.names(G, 300, F) # list(c("Subj.A", "Subj.B")) #' } mutation.network <- function (.data, .method = c('hamm', 'lev'), .max.errors = 1, .label.col = 'CDR3.amino.acid.sequence', .seg.col = 'V.gene', .prob.col = 'Probability') { # Make vertices and edges. if (has.class(.data, 'character')) { .data <- data.frame(A = .data, stringsAsFactors = F) colnames(.data) <- .label.col } G <- graph.empty(n = nrow(.data), directed=F) G <- add.edges(G, t(find.similar.sequences(.data[[.label.col]], .method = .method[1], .max.errors = .max.errors))) G <- simplify(G) # Every label is a sequence. G <- set.vertex.attribute(G, 'label', V(G), .data[[.label.col]]) # Add V-segments to vertices. if (.seg.col %in% colnames(.data)) { G <- set.vertex.attribute(G, 'vseg', V(G), .data[[.seg.col]]) } else { G <- set.vertex.attribute(G, 'vseg', V(G), 'nosegment') } # Set sequences' indices as in the given shared repertoire. G <- set.vertex.attribute(G, 'repind', V(G), 1:vcount(G)) # Set probabilities for sequences. if (.prob.col %in% colnames(.data)) { G <- set.vertex.attribute(G, 'prob', V(G), .data[[.prob.col]]) } else { G <- set.vertex.attribute(G, 'prob', V(G), rep.int(-1, vcount(G))) } # Add people to vertices. if ('People' %in% colnames(.data)) { attr(G, 'people') <- colnames(shared.matrix(.data)) G <- set.people.vector(G, .data) } else { attr(G, 'people') <- "Individual" G <- set.vertex.attribute(G, 'people', V(G), 1) G <- set.vertex.attribute(G, 'npeople', V(G), 1) } G } #' Set and get attributes of a mutation network related to source people. #' #' @aliases set.people.vector get.people.names #' #' @description #' Set vertice attributes 'people' and 'npeople' for every vertex in the given graph. #' Attribute 'people' is a binary string indicating in which repertoire sequence are #' found. Attribute 'npeople' is a integer indicating number of repertoires, in which #' this sequence has been found. #' #' @usage #' set.people.vector(.G, .shared.rep) #' #' get.people.names(.G, .V = V(.G), .paste = T) #' #' @param .G Mutation network. #' @param .shared.rep Shared repertoire. #' @param .V Indices of vertices. #' @param .paste If TRUE than concatenate people names to one string, else get a character vector of names. #' #' @return New graph with 'people' and 'npeople' vertex attributes or character vector of length .V or list of length .V. #' #' @examples #' \dontrun{ #' data(twb) #' twb.shared <- shared.repertoire(twb) #' G <- mutation.network(twb.shared) #' get.people.names(G, 300, T) # "Subj.A|Subj.B" #' get.people.names(G, 300, F) # list(c("Subj.A", "Subj.B")) #' } set.people.vector <- function (.G, .shared.rep) { .shared.rep[is.na(.shared.rep)] <- 0 .G <- set.vertex.attribute(.G, 'people', V(.G), apply(as.matrix(.shared.rep[, -(1:(match('People', colnames(.shared.rep))))]), 1, function (row) { paste0(as.integer(row > 0), collapse='') })) .G <- set.vertex.attribute(.G, 'npeople', V(.G), apply(as.matrix(.shared.rep[, -(1:(match('People', colnames(.shared.rep))))]), 1, function (row) { sum(row > 0) })) } get.people.names <- function (.G, .V = V(.G), .paste = T) { ppl <- attr(.G, 'people') if (!.paste) { lapply(strsplit(get.vertex.attribute(.G, 'people', .V), '', fixed=T, useBytes=T), function (l) { ppl[l == '1'] }) } else { sapply(strsplit(get.vertex.attribute(.G, 'people', .V), '', fixed=T, useBytes=T), function (l) { paste0(ppl[l == '1'], collapse='|') }, USE.NAMES = F) } } #' Set group attribute for vertices of a mutation network #' #' @aliases set.group.vector get.group.names #' #' @description #' asdasd #' #' @usage #' set.group.vector(.G, .attr.name, .groups) #' #' get.group.names(.G, .attr.name, .V = V(.G), .paste = T) #' #' @param .G Mutation network. #' @param .attr.name Name of the new vertex attribute. #' @param .V Indices of vertices. #' @param .groups List with integer vector with indices of subjects for each group. #' @param .paste if T then return character string with concatenated group names, else return list with character vectors #' with group names. #' #' @return igraph object with new vertex attribute \code{.attr.name} with binary strings for \code{set.group.vector}. #' Return character vector for \code{get.group.names}. #' #' @examples #' \dontrun{ #' data(twb) #' twb.shared <- shared.repertoire(twb) #' G <- mutation.network(twb.shared) #' G <- set.group.vector(G, "twins", list(A = c(1,2), B = c(3,4))) # <= refactor this #' get.group.names(G, "twins", 1) # "A|B" #' get.group.names(G, "twins", 300) # "A" #' get.group.names(G, "twins", 1, F) # list(c("A", "B")) #' get.group.names(G, "twins", 300, F) # list(c("A")) #' # Because we have only two groups, we can assign more readable attribute. #' V(G)$twin.names <- get.group.names(G, "twins") #' V(G)$twin.names[1] # "A|B" #' V(G)$twin.names[300] # "A" #' } set.group.vector <- function (.G, .attr.name, .groups) { d <- get.vertex.attribute(.G, 'people', V(.G)) d <- do.call(rbind, lapply(strsplit(d, '', T, useBytes = T), as.integer)) group.vec <- rep('nogroup', times = max(unlist(.groups))) for (gr.i in 1:length(.groups)) { for (elem in .groups[[gr.i]]) { group.vec[elem] <- names(.groups)[gr.i] } } grnames <- names(.groups) .G <- set.vertex.attribute(.G, .attr.name, V(.G), apply(d, 1, function (row) { paste0(as.integer(grnames %in% sort(group.vec[row > 0])), collapse='') })) attr(.G, .attr.name) <- names(.groups) .G } get.group.names <- function (.G, .attr.name, .V = V(.G), .paste = T) { grs <- attr(.G, .attr.name) if (!.paste) { lapply(strsplit(get.vertex.attribute(.G, .attr.name, .V), '', fixed=T, useBytes=T), function (l) { grs[l == '1'] }) } else { sapply(strsplit(get.vertex.attribute(.G, .attr.name, .V), '', fixed=T, useBytes=T), function (l) { paste0(grs[l == '1'], collapse='|') }, USE.NAMES = F) } } #' Get vertex neighbours. #' #' @description #' Get all properties of neighbour vertices in a mutation network of specific vertices. #' #' @param .G Mutation network. #' @param .V Indices of vertices for which return neighbours. #' @param .order Neighbours of which order return. #' #' @return List of length \code{.V} with data frames with vertex properties. First row in each data frame #' is the vertex for which neighbours was returned. #' #' @examples #' \dontrun{ #' data(twb) #' twb.shared <- shared.repertoire(twb) #' G <- mutation.network(twb.shared) #' head(mutated.neighbours(G, 1)[[1]]) #' # label vseg repind prob people npeople #' # 1 CASSDRDTGELFF TRBV6-4 1 -1 1111 4 #' # 2 CASSDSDTGELFF TRBV6-4 69 -1 1100 2 #' # 3 CASSYRDTGELFF TRBV6-3, TRBV6-2 315 -1 1001 2 #' # 4 CASKDRDTGELFF TRBV6-3, TRBV6-2 2584 -1 0100 1 #' # 5 CASSDGDTGELFF TRBV6-4 5653 -1 0010 1 #' # 6 CASSDRETGELFF TRBV6-4 5950 -1 0100 1 #' } mutated.neighbours <- function (.G, .V, .order = 1) { neis <- neighborhood(.G, .order, .V, mode = 'all') lapply(neis, function (l) { res <- as.data.frame(lapply(list.vertex.attributes(.G), function (vattr) { get.vertex.attribute(.G, vattr, l) } ), stringsAsFactors = F) colnames(res) <- list.vertex.attributes(.G) res } ) } # srcppl.distribution <- function (.G) { # one.count <- sapply(strsplit(V(.G)$people, '', fixed = T, useBytes = T), function (x) sum(x == '1')) # # mean(V(.G)$npeople) # mean(one.count) # } # # # neippl.distribution <- function (.G, .exclude.zeros = F) { # if (.exclude.zeros) { # .G <- induced.subgraph(.G, degree(.G) != 0) # } # # one.count <- sapply(strsplit(V(.G)$people, '', fixed = T, useBytes = T), function (x) sum(x == '1')) # # one.count <- V(.G)$npeople # quantile(sapply(neighborhood(.G, 1), function (x) { # if (length(x) == 1) { # 0 # } else { # mean(one.count[x[-1]]) / (length(x) - 1) # } # }), prob = c(.025, .975)) # } # # # pplvar.distribution <- function (.G, .exclude.zeros = F) { # if (.exclude.zeros) { # .G <- induced.subgraph(.G, degree(.G) != 0) # } # # ppl.inds <- lapply(strsplit(V(.G)$people, '', fixed = T, useBytes = T), function (x) which(x == '1')) # c1 <- quantile(sapply(neighborhood(.G, 1), function (x) { # if (length(x) == 1) { # 0 # } else { # # length(unique(unlist(ppl.inds[x[-1]]))) / length(x[-1]) # length(unique( unlist(ppl.inds[x[-1]]) [ !(unlist(ppl.inds[x[-1]]) %in% unlist(ppl.inds[x[1]])) ] )) # } # }), prob = c(.25, .75)) # # c2 <- mean(sapply(neighborhood(.G, 1), function (x) { # if (length(x) == 1) { # 0 # } else { # # length(unique(unlist(ppl.inds[x[-1]]))) / length(x[-1]) # length(unique( unlist(ppl.inds[x[-1]]) [ !(unlist(ppl.inds[x[-1]]) %in% unlist(ppl.inds[x[1]])) ] )) # } # })) # # c(c1[1], Mean = c2, c1[2]) # }tcR/R/shared.R0000644000176200001440000002467713667036141012623 0ustar liggesusers########## Shared TCR repertoire managing and analysis ########## #' Shared TCR repertoire managing and analysis #' #' @aliases shared.repertoire shared.matrix #' #' @description #' Generate a repertoire of shared sequences - sequences presented in more than one subject. If sequence is appeared more than once in the one #' repertoire, than only the first appeared one will be choosed for a shared repertoire. #' #' \code{shared.repertoire} - make a shared repertoire of sequences from the given list of data frames. #' #' \code{shared.matrix} - leave columns, which related to the count of sequences in people, and return them as a matrix. #' I.e., this functions will remove such columns as 'CDR3.amino.acid.sequence', 'V.gene', 'People'. #' #' @usage #' shared.repertoire(.datalist, .type = 'avrc', .min.ppl = 1, .head = -1, #' .clear = T, .verbose = T, .by.col = '', .sum.col = '', #' .max.ppl = length(.datalist)) #' #' shared.matrix(.shared.rep) #' #' @param .datalist List with data frames. #' @param .type String of length 4 denotes how to create a shared repertoire. See "Details" for #' more information. If supplied, than parameters \code{.by.col} and \code{.sum.col} will be ignored. If not supplied, than columns #' in \code{.by.col} and \code{.sum.col} will be used. #' @param .min.ppl At least how many people must have a sequence to leave this sequence in the shared repertoire. #' @param .head Parameter for the \code{head} function, applied to all data frames before clearing. #' @param .clear if T then remove all sequences which have symbols "~" or "*" (i.e., out-of-frame sequences for amino acid sequences). #' @param .verbose if T then output progress. #' @param .by.col Character vector with names of columns with sequences and their parameters (like segment) for using for creating a shared repertoire. #' @param .sum.col Character vector of length 1 with names of the column with count, percentage or any other numeric chaaracteristic of sequences for using for creating a shared repertoire. #' @param .max.ppl At most how many people must have a sequence to leave this sequence in the shared repertoire. #' @param .shared.rep Shared repertoire. #' #' @details #' Parameter \code{.type} is a string of length 4, where: #' \enumerate{ #' \item First character stands either for the letter 'a' for taking the "CDR3.amino.acid.sequence" column or #' for the letter 'n' for taking the "CDR3.nucleotide.sequence" column. #' \item Second character stands whether or not take the V.gene column. Possible values are '0' (zero) stands #' for taking no additional columns, 'v' stands for taking the "V.gene" column. #' \item Third character stands for using either UMIs or reads in choosing the column with numeric characterisitc (see the next letter). #' \item Fourth character stands for name of the column to choose as numeric characteristic of sequences. It depends on the third letter. Possible values are #' "c" for the "Umi.count" (if 3rd character is "u") / "Read.count" column (if 3rd character is "r"), "p" for the "Umi.proportion" / "Read.proportion" column, "r" for the "Rank" column or "i" for the "Index" column. #' If "Rank" or "Index" isn't in the given repertoire, than it will be created using \code{set.rank} function using "Umi.count" / "Read.count" column. #' } #' #' @return #' Data frame for \code{shared.repertoire}, matrix for \code{shared.matrix}. #' #' @seealso \link{shared.representation}, \link{set.rank} #' #' @examples #' \dontrun{ #' # Set "Rank" column in data by "Read.count" column. #' # This is doing automatically in shared.repertoire() function #' # if the "Rank" column hasn't been found. #' immdata <- set.rank(immdata) #' # Generate shared repertoire using "CDR3.amino.acid.sequence" and #' # "V.gene" columns and with rank. #' imm.shared.av <- shared.repertoire(immdata, 'avrc') #' } shared.repertoire <- function (.datalist, .type = 'avrc', .min.ppl = 1, .head = -1, .clear = T, .verbose = T, .by.col = '', .sum.col = '', .max.ppl = length(.datalist)) { .process.df <- function (.data, .bc, .sc) { if (.head != -1) { .data <- head(.data, .head) } if (.clear) { .data <- .data[grep('[*, ~]', .data[, .bc[1]], invert = T), ] } # If .data$Rank or .data$Index is NULL, than generate this columns # using the "Read.count" column. if (is.null(.data[[.sc]])) { if (.sc == 'Read.rank') { .data <- set.rank(.data, 'Read.count') .sc <- "Rank" } else if (.sc == 'Umi.rank') { .data <- set.rank(.data, 'Umi.count') .sc <- "Rank" } else if (.sc == 'Read.rank') { .data <- set.index(.data, 'Read.count') .sc <- "Index" } else { .data <- set.index(.data, 'Umi.count') .sc <- "Index" } } # minidata <- as.data.table(.data[.bc]) minidata <- as.data.table(.data[.bc]) minidata$value <- .data[, .sc] res <- as.data.table(dplyr::summarise(grouped_df(minidata, .bc), value = value[1])) class(res) <- c('data.table', 'data.frame') setnames(res, c(.bc, .sc)) res } if (nchar(.by.col[1]) == 0) { if (substr(.type, 1, 1) == 'a') { .by.col <- 'CDR3.amino.acid.sequence' } else { .by.col <- 'CDR3.nucleotide.sequence' } if (substr(.type, 2, 2) == 'v') { .by.col <- c(.by.col, 'V.gene') } } if (nchar(.sum.col) == 0) { # barcode count if (substr(.type, 3, 3) == 'u') { if (substr(.type, 4, 4) == 'c') { .sum.col <- 'Umi.count' } else if (substr(.type, 4, 4) == 'p') { .sum.col <- 'Umi.proportion' } else if (substr(.type, 4, 4) == 'r') { .sum.col <- 'Umi.rank' } else if (substr(.type, 4, 4) == 'i') { .sum.col <- 'Umi.index' } else { # As a default option. .sum.col <- 'Umi.count' } } else { # read count if (substr(.type, 4, 4) == 'c') { .sum.col <- 'Read.count' } else if (substr(.type, 4, 4) == 'p') { .sum.col <- 'Read.proportion' } else if (substr(.type, 4, 4) == 'r') { .sum.col <- 'Read.rank' } else if (substr(.type, 4, 4) == 'i') { .sum.col <- 'Read.index' } else { # As a default option. .sum.col <- 'Read.count' } } } if (.verbose) { cat("Aggregating sequences...\n"); pb <- set.pb(length(.datalist)) } l <- list() for (i in 1:length(.datalist)) { l[[i]] <- .process.df(.datalist[[i]], .by.col, .sum.col) if (.verbose) add.pb(pb) } names(l) <- names(.datalist) if (.verbose) close(pb) # l <- lapply(.datalist, .process.df, .bc = .by.col, .sc = .sum.col) res <- l[[1]] setnames(res, c(.by.col, names(.datalist)[1])) if (.verbose) { cat("Merging data tables...\n"); pb <- set.pb(length(.datalist) - 1) } if (length(l) > 1) { for (i in 2:length(l)) { res <- merge(res, l[[i]], by = .by.col, all=T, allow.cartesian=T) setnames(res, c(colnames(res)[-ncol(res)], names(.datalist)[i])) if (.verbose) add.pb(pb) } } if (.verbose) { close(pb)} res$People <- rowSums(!is.na(as.matrix(res[, (ncol(res) - length(l) + 1) : ncol(res), with = F]))) res <- res[People >= .min.ppl & People <= .max.ppl][order(People, decreasing=T)][, c(1:(ncol(res) - length(l) - 1), ncol(res), (ncol(res) - length(l)) : (ncol(res) - 1)), with = F] setattr(res, 'by.col', .by.col) setattr(res, 'sum.col', .sum.col) as.data.frame(res, stringsAsFactors = F, row.names = F) } shared.matrix <- function (.shared.rep) { as.matrix(.shared.rep[, -(1:(match('People', colnames(.shared.rep))))]) } #' Shared repertoire analysis. #' #' @aliases cosine.sharing shared.representation shared.clones.count shared.summary #' #' @description #' Functions for computing statistics and analysis of shared repertoire of sequences. #' #' \code{cosine.sharing} - apply the cosine similarity measure to the vectors of sequences' counts or indices. #' #' \code{shared.representation} - for every repertoire in the shared repetoire get a number of sequences in this repertoire which are in the other repertoires. #' Row names of the input matrix is the number of people. #' #' \code{shared.clones.count} - get the number of shared clones for every number of people. #' #' \code{shared.summary} - get a matrix with counts of pairwise shared sequences (like a result from \code{cross} function, applied to a list of data frames). #' #' @usage #' cosine.sharing(.shared.rep, .log = T) #' #' shared.representation(.shared.rep) #' #' shared.clones.count(.shared.rep) #' #' shared.summary(.shared.rep, .min.ppl = min(.shared.rep$People), #' .max.ppl = max(.shared.rep$People)) #' #' @param .shared.rep Shared repertoire, obtained from the function \code{shared.repertoire}. #' @param .log if T then apply log to the after adding laplace correction equal to one. #' @param .min.ppl Filter: get sequences with # people >= .min.ppl. #' @param .max.ppl Filter: get sequences with # people <= .max.ppl. #' #' @return Plot or PCA resulr for the \code{shared.seq.pca} function or a matrix with cosine similarity values for the \code{cosine.sharing} function. #' #' @seealso \link{shared.repertoire} #' #' @examples #' \dontrun{ #' # Load the twb data. #' data(twb) #' # Create shared repertoire on the twins data using CDR3 amino acid sequences with CDR1-2. #' twb.shared <- shared.repertoire(twb, 'av', .verbose = T) #' sh.repr <- shared.representation(twb.shared) #' sh.repr #' # Get proportion of represented shared sequences. #' apply(sh.repr, 2, function (col) col / col[1]) #' } cosine.sharing <- function (.shared.rep, .log = T) { x <- shared.matrix(.shared.rep) d <- lapply(seq_len(ncol(x)), function(i) x[,i]) d <- lapply(d, function (l) { l <- unlist(l) l[is.na(l)] <- 0 l <- l + 1 if (.log) { l <- log(l) } l }) apply.symm(d, cosine.similarity, .do.norm = F, .verbose = F) } shared.representation <- function (.shared.rep) { mat <- shared.matrix(.shared.rep) ppl <- as.integer(.shared.rep$People) apply(mat, 2, function (col) { table(c(1:ncol(mat), ppl[!is.na(col) & (col > 0)])) - 1 }) } shared.clones.count <- function (.shared.rep) { table(as.integer(.shared.rep$People)) } shared.summary <- function (.shared.rep, .min.ppl = min(.shared.rep$People), .max.ppl = max(.shared.rep$People)) { x <- apply(shared.matrix(.shared.rep), 2, function (col) which(!is.na(col) & col != 0)) if (class(x) != 'list') { x <- lapply(seq_len(ncol(x)), function(i) x[,i]) } apply.symm(x, function (a, b) length(intersect(x = a, y = b))) }tcR/R/repoverlap.R0000644000176200001440000001473113667033116013521 0ustar liggesusers#' General function for the repertoire overlap evaluation. #' #' @description #' General interface to all cloneset overlap functions. #' #' @param .data List of clonesets. #' @param .method Which method to use for the overlap evaluation. See "Details" for methods. #' @param .seq Which clonotype sequences to use for the overlap: "nuc" for "CDR3.nucleotide.sequence", "aa" for #' "CDR3.amino.acid.sequence". #' @param .quant Which column to use for the quantity of clonotypes: "read.count" for the "Read.count" column, #' "umi.count" for the "Umi.count" column, "read.prop" for the "Read.proportion" column, "umi.prop" for #' the "Umi.proportion" column. Used in "morisita" and "horn". #' @param .vgene If T than use V genes in computing shared or similar clonotypes. Used in all methods. #' @param .norm If T than compute the normalised number of shared clonotypes. Used in "exact". #' @param .a,.b Alpha and beta parameters for "tversky". Default values gives the Jaccard index measure. #' @param .do.unique If T than remove duplicates from the input data, but add their quantities to their clones. #' @param .verbose If T than output the data processing progress bar. #' #' @details #' You can see a more detailed description for each overlap method at \link{intersectClonesets} and \link{similarity}. #' #' Parameter \code{.method} can have one of the following value each corresponding to the specific method: #' #' - "exact" for the shared number of clonotypes (basic function \code{intersectClonesets(..., .type = "..e")}). #' #' - "hamm" for the number of similar clonotypes by the Hamming distance (basic function \code{intersectClonesets(..., .type = "..h")}). #' #' - "lev" for the number of similar clonotypes by the Levenshtein distance (basic function \code{intersectClonesets(..., .type = "..l")}). #' #' - "jaccard" for the Jaccard index (basic function \code{jaccard.index}). #' #' - "morisita" for the Morisita's overlap index (basic function \code{morisita.index}). #' #' - "tversky" for the Tversky index (basic function \code{tversky.index}). #' #' - "overlap" for the overlap coefficient (basic function \code{overlap.coef}). #' #' - "horn" for the Horn's index (basic function \code{horn.index}). #' #' @seealso \link{intersectClonesets}, \link{similarity}, \link{repDiversity} #' #' @examples #' \dontrun{ #' data(twb) #' repOverlap(twb, "exact", .seq = "nuc", .vgene = F) #' repOverlap(twb, "morisita", .seq = "aa", .vgene = T, .quant = "umi.count") #' ov <- repOverlap(twb) #' ov[is.na(ov)] <- 0 #' vis.pca(prcomp(ov, scale. = T), list(A = c(1, 2), B = c(3, 4))) #' } repOverlap <- function (.data, .method = c("exact", "hamm", "lev", "jaccard", "morisita", "tversky", "overlap", "horn"), .seq = c("nuc", "aa"), .quant = c("read.count", "umi.count", "read.prop", "umi.prop"), .vgene = F, .norm = T, .a = .5, .b = .5, .do.unique = T, .verbose = T) { message(" ======================================== !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !! The tcR package WILL SOON BE ORPHANED !! AND REMOVED FROM CRAN. !! !! A new package is available that is !! designed to replace tcR: !! immunarch -- https://immunarch.com/ !! !! We will be happy to help you to move !! to the new package. Feel free to contact us: !! http://github.com/immunomind/immunarch !! !! Sincerely, !! immunarch dev team and !! Vadim I. Nazarov, lead developer of tcR !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! =======================================") .merge.with.v <- function (.data, .seqcol, .vgene) { if (.vgene) { lapply(.data, function (x) paste0(x[[.seqcol]], x$V.gene) ) } else { lapply(.data, function (x) x[[.seqcol]] ) } } .pair.fun <- function (.data, .fun, .verbose) { if (length(.data) == 2) { .fun(.data[[1]], .data[[2]]) } else { apply.symm(.data, .fun, .verbose = .verbose) } } quant <- .column.choice(.quant, .verbose) if (!has.class(.data, 'list')) { cat("Error! Input data MUST be a list of clonesets!\n"); return(NA); } if (length(.data) < 2) { cat("Error! Input data MUST be a list of clonesets of minimum length 2!\n"); return(NA); } .data <- .fix.listnames(.data) .seqcol <- "CDR3.nucleotide.sequence" if (.seq[1] == "aa") { .seqcol <- "CDR3.amino.acid.sequence" } if (.method[1] %in% c("exact", "hamm", "lev")) { let1 <- "n" if (.seq[1] == "aa") { let1 <- "a" } let2 <- "0" if (.vgene) { let2 <- "v" } let3 <- substr(.method[1], 1, 1) .type <- paste0(let1, let2, let3) if (length(.data) != 2) { intersectClonesets(.data, .type = .type, .norm = .norm, .verbose = .verbose) } else { params <- list(.type = .type, .norm = .norm, .verbose = .verbose) do.call(intersectClonesets, c(list(.data[[1]], .data[[2]]), params)) } } else if (.method[1] %in% c("morisita", "horn")) { .fun <- function (x, y) { horn.index(x, y, F) } if (.method[1] == "morisita") { .fun <- function (x, y) { morisitas.index(x, y, F) } } .verbose.msg("Preprocessing data...\t", .verbose) new.data <- .merge.with.v(.data, .seqcol, .vgene) new.reads <- lapply(.data, "[[", quant) if (.do.unique) { if (.verbose) { pb <- set.pb(length(.data)) } for (i in 1:length(.data)) { .data[[i]] <- as.data.frame(summarise(grouped_df(data.frame(Sequence = new.data[[i]], Count = new.reads[[i]], stringsAsFactors = F), "Sequence"), Count = sum(Count)), stringsAsFactors = F) if (.verbose) { add.pb(pb) } } if (.verbose) { close(pb) } } .pair.fun(.data, function (x, y) { .fun(x, y) }, .verbose) } else if (.method[1] == "jaccard") { .pair.fun(.merge.with.v(.data, .seqcol, .vgene), function (x, y) { jaccard.index(x, y) }, .verbose) } else if (.method[1] == "overlap") { .pair.fun(.merge.with.v(.data, .seqcol, .vgene), function (x, y) { overlap.coef(x, y) }, .verbose) } else if (.method[1] == "tversky") { .pair.fun(.merge.with.v(.data, .seqcol, .vgene), function (x, y) { tversky.index(x, y, .a = .a, .b = .b) }, .verbose) } else { .verbose.msg("You have specified an invalid method identifier. Please check your input arguments.\n", .verbose) return(NA) } }tcR/R/parsing.R0000644000176200001440000010643213667026401013004 0ustar liggesusers########## Data processing functions ########## #' Parse input table files with the immune receptor repertoire data. #' #' @description #' General parser for cloneset table files. Each column name has specific purpose (e.g., column for #' CDR3 nucleotide sequence or aligned gene segments), so you need to supply column names which has this #' purpose in your input data. #' #' @param .filename Path to the input file with cloneset data. #' @param .nuc.seq Name of the column with CDR3 nucleotide sequences. #' @param .aa.seq Name of the column with CDR3 amino acid sequences. #' @param .reads Name of the column with counts of reads for each clonotype. #' @param .barcodes Name of the column with counts of barcodes (UMI, events) for each clonotype. #' @param .vgenes Name of the column with names of aligned Variable gene segments. #' @param .jgenes Name of the column with names of aligned Joining gene segments. #' @param .dgenes Name of the column with names of aligned Diversity gene segments. #' @param .vend Name of the column with last positions of aligned V gene segments. #' @param .jstart Name of the column with first positions of aligned J gene segments. #' @param .dalignments Character vector of length two that names columns with D5' and D3' end positions. #' @param .vd.insertions Name of the column with VD insertions for each clonotype. #' @param .dj.insertions Name of the column with DJ insertions for each clonotype. #' @param .total.insertions Name of the column with total number of insertions for each clonotype. #' @param .skip How many lines from beginning to skip. #' @param .sep Separator character. #' #' @return Data frame with immune receptor repertoire data. See \link{parse.file} for more details. #' #' @seealso \link{parse.file} #' #' @examples #' \dontrun{ #' # Parse file in "~/mitcr/immdata1.txt" as a MiTCR file. #' immdata1 <- parse.file("~/mitcr/immdata1.txt", 'mitcr') #' } parse.cloneset <- function (.filename, .nuc.seq, .aa.seq, .reads, .barcodes, .vgenes, .jgenes, .dgenes, .vend, .jstart, .dalignments, .vd.insertions, .dj.insertions, .total.insertions, .skip = 0, .sep = '\t') { .make.names <- function (.char) { if (is.na(.char[1])) { NA } else { tolower(make.names(.char)) } } .nuc.seq <- .make.names(.nuc.seq) .aa.seq <- .make.names(.aa.seq) .reads <- .make.names(.reads) .barcodes <- .make.names(.barcodes) .vgenes <- .make.names(.vgenes) .jgenes <- .make.names(.jgenes) .dgenes <- .make.names(.dgenes) .vend <- .make.names(.vend) .jstart <- .make.names(.jstart) .vd.insertions <- .make.names(.vd.insertions) .dj.insertions <- .make.names(.dj.insertions) .total.insertions <- .make.names(.total.insertions) .dalignments1 <- .make.names(.dalignments[1]) .dalignments2 <- .make.names(.dalignments[2]) .dalignments <- .make.names(.dalignments) f <- file(.filename, "r") l <- readLines(f, 1) # Check for different levels of the MiTCR output if (length(grep("MiTCRFullExportV1.1", l, fixed = T))) { .skip <- 1 } # Check for different VDJtools outputs if (length(strsplit(l, "-", T)) > 0) { if (length(strsplit(l, "-", T)[[1]]) == 3) { if (strsplit(l, "-", T)[[1]][2] == "header") { .reads <- "count" .barcodes <- "count" .skip <- 1 } } else if (substr(l, 1, 1) == "#") { .reads <- "X.count" .barcodes <- "X.count" } } close(f) table.colnames <- tolower(make.names(read.table(gzfile(.filename), sep = .sep, skip = .skip, nrows = 1, stringsAsFactors = F, strip.white = T, comment.char = "", quote = "")[1,])) swlist <- list('character', 'character', 'integer', 'integer', 'character', 'character', 'character', 'integer', 'integer', 'integer', 'integer', 'integer', 'integer', 'integer') names(swlist) <- c(.nuc.seq, .aa.seq, .reads, .barcodes, .vgenes, .jgenes, .dgenes, .vend, .jstart, .dalignments, .vd.insertions, .dj.insertions, .total.insertions) swlist <- c(swlist, 'NULL') col.classes <- unlist(sapply(table.colnames, function (x) { do.call(switch, c(x, swlist)) }, USE.NAMES = F)) suppressWarnings(df <- read.table(file = gzfile(.filename), header = T, colClasses = col.classes, sep = .sep, skip = .skip, strip.white = T, comment.char = "", quote = "")) names(df) = tolower(names(df)) df$Read.proportion <- df[, make.names(.reads)] / sum(df[, make.names(.reads)]) .read.prop <- 'Read.proportion' if(is.na(.barcodes)) { .barcodes <- "Umi.count" df$Umi.count <- NA df$Umi.proportion <- NA } else { df$Umi.proportion <- df[, make.names(.barcodes)] / sum(df[, make.names(.barcodes)]) } .umi.prop <- 'Umi.proportion' if (is.na(.aa.seq)) { df$CDR3.amino.acid.sequence <- bunch.translate(df$CDR3.nucleotide.sequence) .aa.seq <- 'CDR3.amino.acid.sequence' } # check for VJ or VDJ recombination # VJ / VDJ / Undeterm recomb_type = "Undeterm" if (sum(substr(head(df)[[.vgenes]], 1, 4) %in% c("TCRA", "TRAV", "TRGV", "IGKV", "IGLV"))) { recomb_type = "VJ" } else if (sum(substr(head(df)[[.vgenes]], 1, 4) %in% c("TCRB", "TRBV", "TRDV", "IGHV"))) { recomb_type = "VDJ" } if (!(.vd.insertions %in% table.colnames)) { .vd.insertions <- "VD.insertions" if (!is.na(.vend) && !is.na(.dalignments)) { if (recomb_type == "VJ") { df$VD.insertions <- -1 } else if (recomb_type == "VDJ") { df$VD.insertions <- df[[.dalignments1]] - df[[.vend]] - 1 df$VD.insertions[df[[.dalignments1]] == -1] <- -1 df$VD.insertions[df[[.vend]] == -1] <- -1 } else { df$VD.insertions <- -1 } } else { df$VD.insertions <- -1 df$V.end <- -1 df$D5.end <- -1 df$D3.end <- -1 .vend <- "V.end" .dalignments <- c("D5.end", "D3.end") } } if (!(.dj.insertions %in% table.colnames)) { .dj.insertions <- "DJ.insertions" if (!is.na(.jstart) && !is.na(.dalignments)) { if (recomb_type == "VJ") { df$DJ.insertions <- -1 } else if (recomb_type == "VDJ") { df$DJ.insertions <- df[[.jstart]] - df[[.dalignments2]] - 1 df$DJ.insertions[df[[.dalignments2]] == -1] <- -1 df$DJ.insertions[df[[.jstart]] == -1] <- -1 } else { df$DJ.insertions <- -1 } } else { df$DJ.insertions <- -1 df$J.start <- -1 df$D5.end <- -1 df$D3.end <- -1 .jstart <- "J.start" .dalignments <- c("D5.end", "D3.end") } } if (!(.total.insertions %in% table.colnames)) { .total.insertions <- "Total.insertions" df$Total.insertions <- -1 if (recomb_type == "VJ") { df$Total.insertions <- df[[.jstart]] - df[[.vend]] - 1 df$Total.insertions[df$Total.insertions < 0] <- 0 df$Total.insertions[df[[.vend]] == -1] <- -1 df$Total.insertions[df[[.jstart]] == -1] <- -1 } else if (recomb_type == "VDJ" ) { df$Total.insertions <- df[[.vd.insertions]] + df[[.dj.insertions]] } } df$Total.insertions[df$Total.insertions < 0] <- -1 if (is.na(.dgenes)) { df$D.gene <- '' .dgenes <- "D.gene" } df <- df[, make.names(c(.barcodes, .umi.prop, .reads, .read.prop, .nuc.seq, .aa.seq, .vgenes, .jgenes, .dgenes, .vend, .jstart, .dalignments, .vd.insertions, .dj.insertions, .total.insertions))] colnames(df) <- c('Umi.count', 'Umi.proportion', 'Read.count', 'Read.proportion', 'CDR3.nucleotide.sequence', 'CDR3.amino.acid.sequence', 'V.gene', 'J.gene', 'D.gene', 'V.end', 'J.start', 'D5.end', 'D3.end', 'VD.insertions', 'DJ.insertions', 'Total.insertions') df } #' Parse input table files with immune receptor repertoire data. #' #' @aliases parse.folder parse.file.list parse.file parse.mitcr parse.mitcrbc parse.migec parse.vdjtools parse.immunoseq parse.immunoseq2 parse.immunoseq3 parse.tcr parse.mixcr parse.imseq parse.migmap #' #' @description #' Load the TCR data from the file with the given filename to a data frame or load all #' files from the given folder to a list of data frames. The folder must contain onky files with the specified format. #' Input files could be either text files or archived with gzip ("filename.txt.gz") or bzip2 ("filename.txt.bz2"). #' For a general parser see \code{\link{parse.cloneset}}. #' #' Parsers are available for: #' MiTCR ("mitcr"), MiTCR w/ UMIs ("mitcrbc"), MiGEC ("migec"), VDJtools ("vdjtools"), #' ImmunoSEQ ("immunoseq" or 'immunoseq2' for old and new formats respectively), #' MiXCR ("mixcr"), IMSEQ ("imseq") and tcR ("tcr", data frames saved with the `repSave()` function). #' #' Output of MiXCR should contain either all hits or best hits for each gene segment. #' #' Output of IMSEQ should be generated with parameter "-on". In this case there will be no positions of aligned gene segments in the output data frame #' due to restrictions of IMSEQ output. #' #' tcR's data frames should be saved with the `repSave()` function. #' #' @usage #' parse.file(.filename, #' .format = c('mitcr', 'mitcrbc', 'migec', 'vdjtools', 'immunoseq', #' 'mixcr', 'imseq', 'tcr'), ...) #' #' parse.file.list(.filenames, #' .format = c('mitcr', 'mitcrbc', 'migec', 'vdjtools', 'immunoseq', #' 'mixcr', 'imseq', 'tcr'), .namelist = NA) #' #' parse.folder(.folderpath, #' .format = c('mitcr', 'mitcrbc', 'migec', 'vdjtools', 'immunoseq', #' 'mixcr', 'imseq', 'tcr'), ...) #' #' parse.mitcr(.filename) #' #' parse.mitcrbc(.filename) #' #' parse.migec(.filename) #' #' parse.vdjtools(.filename) #' #' parse.immunoseq(.filename) #' #' parse.immunoseq2(.filename) #' #' parse.immunoseq3(.filename) #' #' parse.mixcr(.filename) #' #' parse.imseq(.filename) #' #' parse.tcr(.filename) #' #' parse.migmap(.filename) #' #' @param .filename Path to the input file with cloneset data. #' @param .filenames Vector or list with paths to files with cloneset data. #' @param .folderpath Path to the folder with text cloneset files. #' @param .format String that specifies the input format. #' @param .namelist Either NA or character vector of length \code{.filenames} with names for output data frames. #' @param ... Parameters passed to \code{parse.cloneset}. #' #' @return Data frame with immune receptor repertoire data. Each row in this data frame corresponds to a clonotype. #' The data frame has following columns: #' #' - "Umi.count" - number of barcodes (events, UMIs); #' #' - "Umi.proportion" - proportion of barcodes (events, UMIs); #' #' - "Read.count" - number of reads; #' #' - "Read.proportion" - proportion of reads; #' #' - "CDR3.nucleotide.sequence" - CDR3 nucleotide sequence; #' #' - "CDR3.amino.acid.sequence" - CDR3 amino acid sequence; #' #' - "V.gene" - names of aligned Variable gene segments; #' #' - "J.gene" - names of aligned Joining gene segments; #' #' - "D.gene" - names of aligned Diversity gene segments; #' #' - "V.end" - last positions of aligned V gene segments (1-based); #' #' - "J.start" - first positions of aligned J gene segments (1-based); #' #' - "D5.end" - positions of D'5 end of aligned D gene segments (1-based); #' #' - "D3.end" - positions of D'3 end of aligned D gene segments (1-based); #' #' - "VD.insertions" - number of inserted nucleotides (N-nucleotides) at V-D junction (-1 for receptors with VJ recombination); #' #' - "DJ.insertions" - number of inserted nucleotides (N-nucleotides) at D-J junction (-1 for receptors with VJ recombination); #' #' - "Total.insertions" - total number of inserted nucleotides (number of N-nucleotides at V-J junction for receptors with VJ recombination). #' #' @seealso \link{parse.cloneset}, \link{repSave}, \link{repLoad} #' #' @examples #' \dontrun{ #' # Parse file in "~/mitcr/immdata1.txt" as a MiTCR file. #' immdata1 <- parse.file("~/mitcr/immdata1.txt", 'mitcr') #' # Parse VDJtools file archive as .gz file. #' immdata1 <- parse.file("~/mitcr/immdata3.txt.gz", 'vdjtools') #' # Parse files "~/data/immdata1.txt" and "~/data/immdat2.txt" as MiGEC files. #' immdata12 <- parse.file.list(c("~/data/immdata1.txt", #' "~/data/immdata2.txt"), 'migec') #' # Parse all files in "~/data/" as MiGEC files. #' immdata <- parse.folder("~/data/", 'migec') #' } parse.folder <- function (.folderpath, .format = c('mitcr', 'mitcrbc', 'migec', 'vdjtools', 'immunoseq', 'mixcr', 'imseq', 'tcr'), ...) { parse.file.list(list.files(.folderpath, full.names = T), .format) } parse.file.list <- function (.filenames, .format = c('mitcr', 'mitcrbc', 'migec', 'vdjtools', 'immunoseq', 'mixcr', 'imseq', 'tcr'), .namelist = NA) { # Remove full paths and extension from the given string. .remove.ext <- function (.str) { gsub(pattern = '.*/|[.].*$', replacement = '', x = .str) # .str } .filenames <- as.list(.filenames) datalist <- list() for (i in 1:length(.filenames)) { cat(i, "/", length(.filenames), ' Parsing "', .filenames[[i]], '"\n\t', sep = "") datalist[[i]] <- parse.file(.filenames[[i]], .format) cat("Done. Cloneset with", nrow(datalist[[i]]), "clonotypes.\n") flush.console() } if (is.na(.namelist)) { namelist <- lapply(X = .filenames, FUN = .remove.ext) names(datalist) <- unlist(namelist) } datalist } parse.file <- function(.filename, .format = c('mitcr', 'mitcrbc', 'migec', 'vdjtools', 'immunoseq', 'mixcr', 'imseq', 'tcr'), ...) { parse.fun <- switch(.format[1], mitcr = parse.mitcr, mitcrbc = parse.mitcrbc, migec = parse.migec, vdjtools = parse.vdjtools, immunoseq = parse.immunoseq, immunoseq2 = parse.immunoseq2, immunoseq3 = parse.immunoseq3, mixcr = parse.mixcr, imseq = parse.imseq, tcr = parse.tcr, parse.cloneset) parse.fun(.filename, ...) } parse.mitcr <- function (.filename) { filename <- .filename nuc.seq <- 'CDR3 nucleotide sequence' aa.seq <- 'CDR3 amino acid sequence' reads <- 'Read count' barcodes <- NA vgenes <- 'V segments' jgenes <- 'J segments' dgenes <- 'D segments' vend <- 'Last V nucleotide position' jstart <- 'First J nucleotide position' dalignments <- c('First D nucleotide position', 'Last D nucleotide position') vd.insertions <- 'VD insertions' dj.insertions <- 'DJ insertions' total.insertions <- 'Total insertions' .skip = 0 .sep = '\t' parse.cloneset(.filename = filename, .nuc.seq = nuc.seq, .aa.seq = aa.seq, .reads = reads, .barcodes = barcodes, .vgenes = vgenes, .jgenes = jgenes, .dgenes = dgenes, .vend = vend, .jstart = jstart, .dalignments = dalignments, .vd.insertions = vd.insertions, .dj.insertions = dj.insertions, .total.insertions = total.insertions, .skip = .skip, .sep = .sep) } parse.mitcrbc <- function (.filename) { filename <- .filename nuc.seq <- 'CDR3 nucleotide sequence' aa.seq <- 'CDR3 amino acid sequence' reads <- 'Count' barcodes <- 'NNNs' vgenes <- 'V segments' jgenes <- 'J segments' dgenes <- 'D segments' vend <- 'Last V nucleotide position' jstart <- 'First J nucleotide position' dalignments <- c('First D nucleotide position', 'Last D nucleotide position') vd.insertions <- 'VD insertions' dj.insertions <- 'DJ insertions' total.insertions <- 'Total insertions' .skip = 0 .sep = '\t' fix.genes(parse.cloneset(.filename = filename, .nuc.seq = nuc.seq, .aa.seq = aa.seq, .reads = reads, .barcodes = barcodes, .vgenes = vgenes, .jgenes = jgenes, .dgenes = dgenes, .vend = vend, .jstart = jstart, .dalignments = dalignments, .vd.insertions = vd.insertions, .dj.insertions = dj.insertions, .total.insertions = total.insertions, .skip = .skip, .sep = .sep)) } parse.migec <- function (.filename) { filename <- .filename nuc.seq <- 'CDR3 nucleotide sequence' aa.seq <- 'CDR3 amino acid sequence' reads <- 'Good reads' barcodes <- 'Good events' vgenes <- 'V segments' jgenes <- 'J segments' dgenes <- 'D segments' vend <- 'Last V nucleotide position' jstart <- 'First J nucleotide position' dalignments <- c('First D nucleotide position', 'Last D nucleotide position') vd.insertions <- 'VD insertions' dj.insertions <- 'DJ insertions' total.insertions <- 'Total insertions' .skip = 0 .sep = '\t' fix.genes(parse.cloneset(.filename = filename, .nuc.seq = nuc.seq, .aa.seq = aa.seq, .reads = reads, .barcodes = barcodes, .vgenes = vgenes, .jgenes = jgenes, .dgenes = dgenes, .vend = vend, .jstart = jstart, .dalignments = dalignments, .vd.insertions = vd.insertions, .dj.insertions = dj.insertions, .total.insertions = total.insertions, .skip = .skip, .sep = .sep)) } parse.vdjtools <- function (.filename) { filename <- .filename nuc.seq <- 'cdr3nt' aa.seq <- 'CDR3aa' reads <- 'count' barcodes <- 'count' vgenes <- 'V' jgenes <- 'J' dgenes <- 'D' vend <- 'Vend' jstart <- 'Jstart' dalignments <- c('Dstart', 'Dend') vd.insertions <- "NO SUCH COLUMN AT ALL 1" dj.insertions <- "NO SUCH COLUMN AT ALL 2" total.insertions <- "NO SUCH COLUMN AT ALL 3" .skip = 0 .sep = '\t' parse.cloneset(.filename = filename, .nuc.seq = nuc.seq, .aa.seq = aa.seq, .reads = reads, .barcodes = barcodes, .vgenes = vgenes, .jgenes = jgenes, .dgenes = dgenes, .vend = vend, .jstart = jstart, .dalignments = dalignments, .vd.insertions = vd.insertions, .dj.insertions = dj.insertions, .total.insertions = total.insertions, .skip = .skip, .sep = .sep) } parse.immunoseq <- function (.filename) { filename <- .filename nuc.seq <- 'nucleotide' aa.seq <- 'aminoAcid' reads <- 'count' barcodes <- 'vIndex' vgenes <- 'vGeneName' jgenes <- 'jGeneName' dgenes <- 'dFamilyName' vend <- 'n1Index' jstart <- 'jIndex' dalignments <- c('dIndex', 'n2Index') vd.insertions <- "n1Insertion" dj.insertions <- "n2Insertion" total.insertions <- "NO SUCH COLUMN AT ALL 3" .skip = 0 .sep = '\t' df <- parse.cloneset(.filename = filename, .nuc.seq = nuc.seq, .aa.seq = aa.seq, .reads = reads, .barcodes = barcodes, .vgenes = vgenes, .jgenes = jgenes, .dgenes = dgenes, .vend = vend, .jstart = jstart, .dalignments = dalignments, .vd.insertions = vd.insertions, .dj.insertions = dj.insertions, .total.insertions = total.insertions, .skip = .skip, .sep = .sep) # fix nucleotide sequences df$CDR3.nucleotide.sequence <- substr(df$CDR3.nucleotide.sequence, df$Umi.count + 1, nchar(df$CDR3.nucleotide.sequence) - 6) # add out-of-frame amino acid sequences df$CDR3.amino.acid.sequence <- bunch.translate(df$CDR3.nucleotide.sequence) # df <- fix.alleles(df) # fix genes names and "," .fix.genes <- function (.col) { # fix "," .col <- gsub(",", ", ", .col, fixed = T, useBytes = T) # fix forward zeros .col <- gsub("([0])([0-9])", "\\2", .col, useBytes = T) # fix gene names .col <- gsub("TCR", "TR", .col, fixed = T, useBytes = T) .col } df$V.gene <- .fix.genes(df$V.gene) df$D.gene <- .fix.genes(df$D.gene) df$J.gene <- .fix.genes(df$J.gene) # update V, D and J positions .fix.poses <- function (.col) { df[df[[.col]] != -1, .col] <- df[df[[.col]] != -1, .col] - df$Umi.count[df[[.col]] != -1] df } df <- .fix.poses("V.end") df <- .fix.poses("D3.end") df <- .fix.poses("D5.end") df <- .fix.poses("J.start") # nullify barcodes df$Umi.count <- NA df$Umi.proportion <- NA df } parse.immunoseq2 <- function (.filename) { filename <- .filename nuc.seq <- 'nucleotide' aa.seq <- 'aminoAcid' reads <- 'count (templates)' barcodes <- 'vIndex' vgenes <- 'vGeneName' jgenes <- 'jGeneName' dgenes <- 'dFamilyName' vend <- 'n1Index' jstart <- 'jIndex' dalignments <- c('dIndex', 'n2Index') vd.insertions <- "n1Insertion" dj.insertions <- "n2Insertion" total.insertions <- "NO SUCH COLUMN AT ALL 3" .skip = 0 .sep = '\t' df <- parse.cloneset(.filename = filename, .nuc.seq = nuc.seq, .aa.seq = aa.seq, .reads = reads, .barcodes = barcodes, .vgenes = vgenes, .jgenes = jgenes, .dgenes = dgenes, .vend = vend, .jstart = jstart, .dalignments = dalignments, .vd.insertions = vd.insertions, .dj.insertions = dj.insertions, .total.insertions = total.insertions, .skip = .skip, .sep = .sep) # fix nucleotide sequences df$CDR3.nucleotide.sequence <- substr(df$CDR3.nucleotide.sequence, df$Umi.count + 1, nchar(df$CDR3.nucleotide.sequence) - 6) # add out-of-frame amino acid sequences df$CDR3.amino.acid.sequence <- bunch.translate(df$CDR3.nucleotide.sequence) # df <- fix.alleles(df) # fix genes names and "," .fix.genes <- function (.col) { # fix "," .col <- gsub(",", ", ", .col, fixed = T, useBytes = T) # fix forward zeros .col <- gsub("([0])([0-9])", "\\2", .col, useBytes = T) # fix gene names .col <- gsub("TCR", "TR", .col, fixed = T, useBytes = T) .col } df$V.gene <- .fix.genes(df$V.gene) df$D.gene <- .fix.genes(df$D.gene) df$J.gene <- .fix.genes(df$J.gene) # update V, D and J positions .fix.poses <- function (.col) { df[df[[.col]] != -1, .col] <- df[df[[.col]] != -1, .col] - df$Umi.count[df[[.col]] != -1] df } df <- .fix.poses("V.end") df <- .fix.poses("D3.end") df <- .fix.poses("D5.end") df <- .fix.poses("J.start") # nullify barcodes df$Umi.count <- NA df$Umi.proportion <- NA df } parse.immunoseq3 <- function (.filename) { filename <- .filename nuc.seq <- 'nucleotide' aa.seq <- 'aminoAcid' reads <- 'count (reads)' barcodes <- 'vIndex' vgenes <- 'vGeneName' jgenes <- 'jGeneName' dgenes <- 'dFamilyName' vend <- 'n1Index' jstart <- 'jIndex' dalignments <- c('dIndex', 'n2Index') vd.insertions <- "n1Insertion" dj.insertions <- "n2Insertion" total.insertions <- "NO SUCH COLUMN AT ALL 3" .skip = 0 .sep = '\t' df <- parse.cloneset(.filename = filename, .nuc.seq = nuc.seq, .aa.seq = aa.seq, .reads = reads, .barcodes = barcodes, .vgenes = vgenes, .jgenes = jgenes, .dgenes = dgenes, .vend = vend, .jstart = jstart, .dalignments = dalignments, .vd.insertions = vd.insertions, .dj.insertions = dj.insertions, .total.insertions = total.insertions, .skip = .skip, .sep = .sep) # fix nucleotide sequences df$CDR3.nucleotide.sequence <- substr(df$CDR3.nucleotide.sequence, df$Umi.count + 1, nchar(df$CDR3.nucleotide.sequence) - 6) # add out-of-frame amino acid sequences df$CDR3.amino.acid.sequence <- bunch.translate(df$CDR3.nucleotide.sequence) # df <- fix.alleles(df) # fix genes names and "," .fix.genes <- function (.col) { # fix "," .col <- gsub(",", ", ", .col, fixed = T, useBytes = T) # fix forward zeros .col <- gsub("([0])([0-9])", "\\2", .col, useBytes = T) # fix gene names .col <- gsub("TCR", "TR", .col, fixed = T, useBytes = T) .col } df$V.gene <- .fix.genes(df$V.gene) df$D.gene <- .fix.genes(df$D.gene) df$J.gene <- .fix.genes(df$J.gene) # update V, D and J positions .fix.poses <- function (.col) { df[df[[.col]] != -1, .col] <- df[df[[.col]] != -1, .col] - df$Umi.count[df[[.col]] != -1] df } df <- .fix.poses("V.end") df <- .fix.poses("D3.end") df <- .fix.poses("D5.end") df <- .fix.poses("J.start") # nullify barcodes df$Umi.count <- NA df$Umi.proportion <- NA df } parse.mixcr <- function (.filename) { .filename <- .filename .nuc.seq <- 'nseqcdr3' .aa.seq <- 'aaseqcdr3' .reads <- 'clonecount' .barcodes <- 'clonecount' .sep = '\t' .vend <- "allvalignments" .jstart <- "alljalignments" .dalignments <- "alldalignments" .vd.insertions <- "VD.insertions" .dj.insertions <- "DJ.insertions" .total.insertions <- "Total.insertions" table.colnames <- tolower(make.names(read.table(gzfile(.filename), sep = .sep, skip = 0, nrows = 1, stringsAsFactors = F, strip.white = T, comment.char = "", quote = "")[1,])) table.colnames <- gsub(".", "", table.colnames, fixed = T) if ("bestvhit" %in% table.colnames) { .vgenes <- 'bestvhit' } else if ('allvhits' %in% table.colnames) { .vgenes <- 'allvhits' } else if ('vhits' %in% table.colnames) { .vgenes <- 'vhits' } else if ('allvhitswithscore' %in% table.colnames) { .vgenes <- 'allvhitswithscore' } else { cat("Error: can't find a column with V genes\n") } if ("bestjhit" %in% table.colnames) { .jgenes <- 'bestjhit' } else if ('alljhits' %in% table.colnames) { .jgenes <- 'alljhits' } else if ('jhits' %in% table.colnames) { .jgenes <- 'jhits' } else if ('alljhitswithscore' %in% table.colnames) { .jgenes <- 'alljhitswithscore' } else { cat("Error: can't find a column with J genes\n") } if ("bestdhit" %in% table.colnames) { .dgenes <- 'bestdhit' } else if ('alldhits' %in% table.colnames) { .dgenes <- 'alldhits' } else if ('dhits' %in% table.colnames) { .dgenes <- 'dhits' } else if ('alldhitswithscore' %in% table.colnames) { .dgenes <- 'alldhitswithscore' } else { cat("Error: can't find a column with D genes\n") } swlist <- list('character', 'character', 'integer', 'integer', 'character', 'character', 'character', 'character', 'character', 'character', 'character', 'character', 'character') names(swlist) <- c(.nuc.seq, .aa.seq, .reads, .barcodes, .vgenes, .jgenes, .dgenes, .vend, .jstart, .dalignments, .vd.insertions, .dj.insertions, .total.insertions) swlist <- c(swlist, 'NULL') col.classes <- unlist(sapply(table.colnames, function (x) { do.call(switch, c(x, swlist)) }, USE.NAMES = F)) suppressWarnings(df <- read.table(file = gzfile(.filename), header = T, colClasses = col.classes, sep = .sep, skip = 0, strip.white = T, comment.char = "", quote = "", fill = T)) names(df) <- tolower(gsub(".", "", names(df), fixed = T)) df$Read.proportion <- df[, make.names(.reads)] / sum(df[, make.names(.reads)]) .read.prop <- 'Read.proportion' df$Umi.count <- df[, .reads] df$Umi.proportion <- df$Umi.count / sum(df$Umi.count) .barcodes <- 'Umi.count' .umi.prop <- 'Umi.proportion' df$CDR3.amino.acid.sequence <- bunch.translate(df[[.nuc.seq]]) .aa.seq <- 'CDR3.amino.acid.sequence' # check for VJ or VDJ recombination # VJ / VDJ / Undeterm recomb_type = "Undeterm" if (sum(substr(head(df)[[.vgenes]], 1, 4) %in% c("TCRA", "TRAV", "TRGV", "IGKV", "IGLV"))) { recomb_type = "VJ" } else if (sum(substr(head(df)[[.vgenes]], 1, 4) %in% c("TCRB", "TRBV", "TRDV", "IGHV"))) { recomb_type = "VDJ" } .vd.insertions <- "VD.insertions" df$VD.insertions <- -1 if (recomb_type == "VJ") { df$VD.insertions <- -1 } else if (recomb_type == "VDJ") { logic <- sapply(strsplit(df[[.dalignments]], "|", T, F, T), length) >= 4 & sapply(strsplit(df[[.vend]], "|", T, F, T), length) >= 5 df$VD.insertions[logic] <- as.numeric(sapply(strsplit(df[[.dalignments]][logic], "|", T, F, T), "[[", 4)) - as.numeric(sapply(strsplit(df[[.vend]][logic], "|", T, F, T), "[[", 5)) - 1 } .dj.insertions <- "DJ.insertions" df$DJ.insertions <- -1 if (recomb_type == "VJ") { df$DJ.insertions <- -1 } else if (recomb_type == "VDJ") { logic <- sapply(strsplit(df[[.jstart]], "|", T, F, T), length) >= 4 & sapply(strsplit(df[[.dalignments]], "|", T, F, T), length) >= 5 df$DJ.insertions[logic] <- as.numeric(sapply(strsplit(df[[.jstart]][logic], "|", T, F, T), "[[", 4)) - as.numeric(sapply(strsplit(df[[.dalignments]][logic], "|", T, F, T), "[[", 5)) - 1 } logic <- (sapply(strsplit(df[[.vend]], "|", T, F, T), length) > 4) & (sapply(strsplit(df[[.jstart]], "|", T, F, T), length) >= 4) .total.insertions <- "Total.insertions" if (recomb_type == "VJ") { df$Total.insertions <- -1 if (length(which(logic)) > 0) { df$Total.insertions[logic] <- as.numeric(sapply(strsplit(df[[.jstart]][logic], "|", T, F, T), "[[", 4)) - as.numeric(sapply(strsplit(df[[.vend]][logic], "|", T, F, T), "[[", 5)) - 1 } } else if (recomb_type == "VDJ") { df$Total.insertions <- df[[.vd.insertions]] + df[[.dj.insertions]] } else { df$Total.insertions <- -1 } df$Total.insertions[df$Total.insertions < 0] <- -1 df$V.end <- -1 df$J.start <- -1 df[[.vend]] = gsub(";", "", df[[.vend]], fixed = T) logic = sapply(strsplit(df[[.vend]], "|", T, F, T), length) >= 5 df$V.end[logic] <- sapply(strsplit(df[[.vend]][logic], "|", T, F, T), "[[", 5) logic = sapply(strsplit(df[[.jstart]], "|", T, F, T), length) >= 4 df$J.start[logic] <- sapply(strsplit(df[[.jstart]][logic], "|", T, F, T), "[[", 4) .vend <- "V.end" .jstart <- "J.start" logic <- sapply(strsplit(df[[.dalignments]], "|", T, F, T), length) >= 5 df$D5.end <- -1 df$D3.end <- -1 df$D5.end[logic] <- sapply(strsplit(df[[.dalignments]][logic], "|", T, F, T), "[[", 4) df$D3.end[logic] <- sapply(strsplit(df[[.dalignments]][logic], "|", T, F, T), "[[", 5) .dalignments <- c('D5.end', 'D3.end') df <- df[, make.names(c(.barcodes, .umi.prop, .reads, .read.prop, .nuc.seq, .aa.seq, .vgenes, .jgenes, .dgenes, .vend, .jstart, .dalignments, .vd.insertions, .dj.insertions, .total.insertions))] colnames(df) <- c('Umi.count', 'Umi.proportion', 'Read.count', 'Read.proportion', 'CDR3.nucleotide.sequence', 'CDR3.amino.acid.sequence', 'V.gene', 'J.gene', 'D.gene', 'V.end', 'J.start', 'D5.end', 'D3.end', 'VD.insertions', 'DJ.insertions', 'Total.insertions') df$V.gene <- gsub("([*][[:digit:]]*)([(][[:digit:]]*[.]*[[:digit:]]*[)])", "", df$V.gene) df$V.gene <- gsub(",", ", ", df$V.gene) df$D.gene <- gsub("([*][[:digit:]]*)([(][[:digit:]]*[.]*[[:digit:]]*[)])", "", df$D.gene) df$D.gene <- gsub(",", ", ", df$D.gene) df$J.gene <- gsub("([*][[:digit:]]*)([(][[:digit:]]*[.]*[[:digit:]]*[)])", "", df$J.gene) df$J.gene <- gsub(",", ", ", df$J.gene) fix.alleles(df) } parse.imseq <- function (.filename) { f <- gzfile(.filename) all.lines <- strsplit(readLines(f), ":", T, useBytes = T) close(f) df <- data.frame(Umi.count = NA, Umi.proportion = NA, Read.count = as.integer(sapply(all.lines, function (x) strsplit(x[3], "\t", T, useBytes = T)[[1]][2])), CDR3.nucleotide.sequence = sapply(all.lines, "[[", 2), CDR3.amino.acid.sequence = bunch.translate(sapply(all.lines, "[[", 2)), V.gene = sapply(all.lines, "[[", 1), J.gene = sapply(all.lines, function (x) strsplit(x[3], "\t", T, useBytes = T)[[1]][1]), D.gene = "", V.end = -1, J.start = -1, D5.end = -1, D3.end = -1, VD.insertions = -1, DJ.insertions = -1, Total.insertions = -1, stringsAsFactors = F) df$Read.proportion <- df$Read.count / sum(df$Read.count) df <- df[, c('Umi.count', 'Umi.proportion', 'Read.count', 'Read.proportion', 'CDR3.nucleotide.sequence', 'CDR3.amino.acid.sequence', 'V.gene', 'J.gene', 'D.gene', 'V.end', 'J.start', 'D5.end', 'D3.end', 'VD.insertions', 'DJ.insertions', 'Total.insertions')] cls <- c("as.integer", "as.numeric", "as.integer", 'as.numeric', "as.character", "as.character", "as.character", "as.character", "as.character", "as.integer", "as.integer", "as.integer", "as.integer", "as.integer", "as.integer", "as.integer") for (i in 1:ncol(df)) { df[[i]] <- do.call(cls[i], list(df[[i]])) } df } parse.tcr <- function (.filename) { suppressWarnings(df <- read.table(file = gzfile(.filename), header = T, sep = "\t", skip = 0, strip.white = T, comment.char = "", quote = "", fill = T, stringsAsFactors = F)) df } parse.migmap <- function (.filename) { filename <- .filename nuc.seq <- 'cdr3nt' aa.seq <- 'cdr3aa' reads <- 'count' barcodes <- 'count' vgenes <- 'v' jgenes <- 'j' dgenes <- 'd' vend <- 'v.end.in.cdr3' jstart <- 'j.start.in.cdr3' dalignments <- c('d.start.in.cdr3', 'd.end.in.cdr3') vd.insertions <- "NONE" dj.insertions <- "NONE" total.insertions <- "NONE" .skip = 0 .sep = '\t' parse.cloneset(.filename = filename, .nuc.seq = nuc.seq, .aa.seq = aa.seq, .reads = reads, .barcodes = barcodes, .vgenes = vgenes, .jgenes = jgenes, .dgenes = dgenes, .vend = vend, .jstart = jstart, .dalignments = dalignments, .vd.insertions = vd.insertions, .dj.insertions = dj.insertions, .total.insertions = total.insertions, .skip = .skip, .sep = .sep) }tcR/MD50000644000176200001440000001546713667667012011345 0ustar liggesusersbc3b52abf136e20b0149999afc337f4e *DESCRIPTION 67262988fde0cfff764df4ccf857c884 *NAMESPACE e96382dfc876ba6af180a79ed52adbda *NEWS d5ee0a88c2ecbc39128e4d3e789978c9 *R/RcppExports.R bf70513564d8952a6b7a190be1a41391 *R/crosses.R 26eb53f75787d5c81f1aa352b963bc5c *R/dataproc.R 7466268d60a9c6ed13fa0f9e19ca9978 *R/datatools.R 72061eb9659ec0b721a87c5f8e31a175 *R/diversity.R 0988123ae30afe8c10aeda24fbe53a78 *R/docdata.R a186e0ffef28efdc7076680391c58c2d *R/filters.R 18d7cf76bf4e751aefadf8a6f64e3347 *R/graph.R 18d779083054a272f663d525dad32d09 *R/infoanalysis.R 36c9fe5103b6fbf28de7272b4f113c74 *R/io.R 8a38b40da44b04299acceb1507117a35 *R/kmers.R ef81c66aa4f2c28c94dd9b4dd0b0bb7c *R/measures.R f29f5cddfe3ab5afebd426d69233010f *R/mitcr.R 2e63b6f0972f8d0431f28487f1bddc81 *R/onload.R 003ddf6d201f3e1cadd53bb71f8c3ca2 *R/parsing.R 4342989bb5ea7e315739151672da1e26 *R/plots.R 08af695f10104cf351686127c1893def *R/repdiversity.R 2cbafde8bd34f89777ef0658e113207c *R/repoverlap.R edfd9270866b8578a6d85e371c5874d9 *R/segments.R 37d37da14e85bb2f35e2975d397db13c *R/shared.R 0abf024069438d5e1acc615284782a44 *R/spectrum.R 385c4c5a70bb2b36eb2df94e89bd02c2 *R/stats.R 3257c9831e8d13fbe1d9773f3bddd5ed *R/strtools.R 8168ae00d93f10e79e97ea344da03860 *README.md 96606310b774d068c3bf7a1fa5c77ee2 *build/vignette.rds 89d6d3f555bed92c5ed36af98b04c7a4 *data/beta.prob.rda 0b472b1afd448af9612974a7033a82bb *data/datalist 3e5199fd3d3acb248adfe09b59f39bfd *data/genesegments.rda 802f976ee11eb67c9d8f3be6669004f2 *data/twa.rda 8253da4f56f8eee73ad14945e15ab374 *data/twb.rda 9beb0651b51d566bb9ba008ae0bf49ac *inst/CITATION 32815f3b1b3683089c10c05523e2a13c *inst/crossanalysis.report.Rmd 71c9862006c8c4830ae45e2cfad8459d *inst/doc/tcrvignette.R 6b5ddc9d7590c7c0e16b88f16d6c722c *inst/doc/tcrvignette.Rmd 714dd18d3a7d142722b98887b61d8c50 *inst/doc/tcrvignette.html 0d8030aaef0685c2f34fc53cce1adfac *inst/library.report.Rmd c435bdc2bef11becfb39297473965a6f *man/AA_TABLE.Rd 90a723ba4e3f02626c45b15f01575c79 *man/apply.symm.Rd 5238a0694a0b87afc116cbb2a4612fcf *man/assymetry.Rd 4a75153ef1837fc632bb89c0d380a23e *man/barcodes.to.reads.Rd 1c4e2d94a67cb971879ff3cc9e957e86 *man/beta.prob.Rd ddb4199aa5fb662ec8b4acd1ad861ef9 *man/bootstrap.tcr.Rd 9cdcde0cea8c593d9008116bccecad49 *man/check.distribution.Rd 4f72abaed15f5d84cf3bc8d082ff3c97 *man/clonal.space.homeostasis.Rd b7bfe4dcfc9ad8ff6beb0c832fe3a05c *man/cloneset.stats.Rd cb2a04e9548ca95b0bd6c4182add8d96 *man/codon.variants.Rd c58ea39a436a784b22264c3a994e775f *man/column.summary.Rd eda87e8c588a04b5db3aa951a161da73 *man/contamination.stats.Rd 5b0fd2d2eefac9e721b50ba01031390a *man/convergence.index.Rd 5cf534c8f4b8345056b288334f156e5a *man/cosine.sharing.Rd cae33fe63680da872daf510c39e56440 *man/cosine.similarity.Rd fe13a6e7fe9c0ddb8da70d2f4a0d04d6 *man/dot-add.legend.Rd 45a9fd13d13c843fb5f1a2cf77fe72af *man/dot-column.choice.Rd 1adff722e109f9c7b1920c1fcce11f53 *man/dot-fix.listnames.Rd 7268c9769743640c41e0de7aad697c80 *man/dot-verbose.msg.Rd c317ef8bd85fbbceb5e7f0b673e804e0 *man/entropy.Rd ba90872f88c7f11218828fd806c44877 *man/entropy.seg.Rd 42eb3b21c6f698c0490294a86af35daf *man/find.clonotypes.Rd f24fcd3b87d5d1af3f9b24fb989836bd *man/find.similar.sequences.Rd e1dac959fd2d6125725835399f96ba38 *man/fix.alleles.Rd 69c32ef27966d5b68855d74b7d059890 *man/gc.content.Rd 5ecfd113b6aa8af4a75894f394e45594 *man/geneUsage.Rd a41e2b66d4d58ebc706f06ad9ea38e82 *man/generate.kmers.Rd fa670137405d50fbf4e10af9be30bcb9 *man/generate.tcr.Rd 77d869dd81f03a18c9b13f4cc6f60718 *man/get.all.substrings.Rd d050e0d04851896b80848db375d12497 *man/get.deletions.alpha.Rd 75d3126f6c18a8aefb8244d314b342f3 *man/get.inframes.Rd 752bae53e58fd8db0bbd89a59a5ca8a8 *man/get.kmers.Rd 8bf4a3e542a5fbc70c1eade55ad3b3af *man/gibbs.sampler.Rd 80ed39ff37aa19524e6c26f72b3bf2db *man/group.clonotypes.Rd 224edc9f1d69178168b9ab1f96c45a59 *man/has.class.Rd 2d2d486f075d7c509e48f238aa6ad400 *man/intersectClonesets.Rd c9622086734076b437c6edfe091a185b *man/inverse.simpson.Rd b61fdb16f4f0008069b9ec243bef86b1 *man/kmer.profile.Rd 7275fa10b7a105901d44d68d3d115f49 *man/kmer.table.Rd b5096e2299c2a9bfd42a7f502d51b783 *man/loglikelihood.Rd 24bd4592bb2206ac57b98904c46f3069 *man/matrixSubgroups.Rd 15f4bc51a432da7c7f470bfe5b4a190d *man/matrixdiagcopy.Rd 80dced59953149a95fb739289228db28 *man/mutated.neighbours.Rd 8fae995180d68ed5d7bd949005a22882 *man/mutation.network.Rd 21a2fd34b0dfaa7c562f87eb95103253 *man/ozScore.Rd 57d3e854e2be1397e328abb4e1d7413d *man/parse.cloneset.Rd b2d955a325dbd67be5ed0fa4735fe6a5 *man/parse.folder.Rd 60ffe7cab7d8d53ab3c20b551423c1c2 *man/pca.segments.Rd 4b86d56ff3d5dd0823580cc8fafe1c93 *man/pca2euclid.Rd aa1d8777719192402e4492adef44811c *man/permutDistTest.Rd 3008fa41aebb5bb4f66cb29d9ff2faeb *man/permutedf.Rd 507fb9e5d3cddd4a7b442adbbd5b788e *man/rarefaction.Rd 7be0d6a29b4f9a96c0ded480a591817c *man/repDiversity.Rd 9a4fbea17c030f054c736203b6e8068e *man/repLoad.Rd c21c460980d8f7152855938c3390c675 *man/repOverlap.Rd a9de808bd49dddf8f992d838b04c40b7 *man/repSave.Rd 80d9930f1b2beb81e03b095c187dafc5 *man/resample.Rd e81568d029b718a8d6feddb5b765d9c0 *man/revcomp.Rd adeceae0833a6c459ab6749a9f10fdee *man/reverse.string.Rd e46c4ee7e2c4181135b64f183619aa24 *man/sample.clones.Rd 8954424a5a7ecff72c01ba52a102b4d5 *man/sample2D.Rd 810e07ead9e26541f0ebceaf740bd6e9 *man/segments.alphabets.Rd d6efddff8f2903791b7df1a37147ec67 *man/segments.list.Rd c01802b5e78f0654615f046cace2d83a *man/set.group.vector.Rd 3f3ba65839cc9cdb90dbf8b09da7abc8 *man/set.pb.Rd 6845de0d4ddd068621ed7e8f5a969b65 *man/set.people.vector.Rd 92d9582d8cd9dc7141f5d8f637024f53 *man/set.rank.Rd 43aff234930d14d353a773e88b1da72f *man/shared.repertoire.Rd 156279a726fd1a47d1adc5b0bc312498 *man/spectratype.Rd 475d3feda165f1a631cedc3edb0d0ea0 *man/startmitcr.Rd 74a61db9271c466bd24ccdfdda3bedec *man/tailbound.proportion.Rd 698e3e45ff0bf8a7398686c9bc8c0913 *man/top.cross.Rd 1782facd22b9ac8771fcd07c87482d86 *man/top.fun.Rd 6d12f87c7b96bfb095a526970e901154 *man/twinsdata.Rd 876ed3d1f6c6eae70f286a33fe54a6ef *man/vis.clonal.dynamics.Rd 7554171f87709835f7ca77c15be6501e *man/vis.clonal.space.Rd d7c0f006c4601622f70b577b300f82e0 *man/vis.count.len.Rd 55cfc879425f317692ff748958fcf57d *man/vis.gene.usage.Rd 5512bb5426b0717eb5ed84b006cace68 *man/vis.group.boxplot.Rd dbd71235f03ca2046bae03483ee778ea *man/vis.heatmap.Rd 28dcac8cb544c9d99d629af1a66cde01 *man/vis.kmer.histogram.Rd f7e68343dba989624d96ab04921db617 *man/vis.logo.Rd e140ddca96c69a7b792072a77b7e9ad5 *man/vis.number.count.Rd 2eafe6f2544ac207a33fa289ab8bac53 *man/vis.pca.Rd 48d0d03c171f07c8ac9bd0a80bd13a69 *man/vis.radarlike.Rd a400389cae7e4d0ae2e2ff2770e96649 *man/vis.rarefaction.Rd 59367ba73ee78bd4270671180c1110f2 *man/vis.shared.clonotypes.Rd 60ab1c6d69a2e78b8edbb1b12e743e2f *man/vis.top.proportions.Rd e3d3cb360fbfdb3c6974e14eb5f09870 *src/Makevars 2460e6e93c37da9409c7b4c1959a28a4 *src/RcppExports.cpp 8613b0d97d73171a1f6a526d93a87ee9 *src/neighbour.search.cpp 6b5ddc9d7590c7c0e16b88f16d6c722c *vignettes/tcrvignette.Rmd tcR/inst/0000755000176200001440000000000013667551325011774 5ustar liggesuserstcR/inst/crossanalysis.report.Rmd0000644000176200001440000001173313667026401016644 0ustar liggesusers--- title: "TCR beta repertoire intergroup analysis" output: html_document: theme: spacelab toc: yes --- ## Before analysis Before running this pipeline you should do next steps: 1. Save your parsed MiTCR data to the `immdata` variable (**it must be a list with mitcr data frames**). ``` immdata <- parse.folder('/home/username/mitcrdata/') ``` 2. Save the `immdata` variable to the some folder as the `.rda` file. ``` save(immdata, file = '/home/username/immdata.rda') ``` 3. In the code block below change the path string to the path to yours `immdata.rda` file. After that click the **Knit HTML** button to start analysis and make an output .html file with it's results. ```{r loaddata,warning=FALSE,message=F} load('../data/twb.rda') immdata <- twb library(tcR) ``` 4. Friendly advice: run the pipeline on first N top sequences first and then set up the size of figures. ```{r lapplyhead,warning=FALSE,message=F} N <- 10000 immdata <- lapply(immdata, head, N) ``` ## Number of shared clones and clonotypes ### Number of shared clones (CDR3 nucleotide sequences) #### -- without and with normalisation ```{r nuc0crosses, fig.width=13,warning=FALSE,message=F} crs1 <- repOverlap(immdata, .norm=F, .verbose=F) crs2 <- repOverlap(immdata, .norm=T, .verbose=F) do.call(grid.arrange, list(vis.heatmap(crs1, .title = 'Number of shared clones', .legend = 'Shared clones'), vis.heatmap(crs2, .title = 'Number of shared clones', .legend = 'Shared clones'), nrow = 1)) ``` ### Number of shared clonotypes (CDR3 amino acid sequences) #### -- without and with normalisation ```{r aa0crosses, fig.width=13,warning=FALSE,message=F} crs1 <- repOverlap(immdata, .seq = "aa", .norm=F, .verbose=F) crs2 <- repOverlap(immdata, .seq = "aa", .norm=T, .verbose=F) do.call(grid.arrange, list(vis.heatmap(crs1), vis.heatmap(crs2), nrow = 1)) ``` ### Number of shared clones using V-segments #### -- without and with normalisation ```{r nucvcrosses, fig.width=13,warning=FALSE,message=F} crs1 <- repOverlap(immdata, .vgene = T, .norm=F, .verbose=F) crs2 <- repOverlap(immdata, .vgene = T, .norm=T, .verbose=F) do.call(grid.arrange, list(vis.heatmap(crs1, .title = 'Number of shared clones + V', .legend = 'Shared clones'), vis.heatmap(crs2, .title = 'Number of shared clones + V'), nrow = 1)) ``` ### Number of shared clonotypes using V-segments #### -- without and with normalisation ```{r aavcrosses, fig.width=13,warning=FALSE,message=F} crs1 <- repOverlap(immdata, .seq = "aa", .vgene = T, .norm=F, .verbose=F) crs2 <- repOverlap(immdata, .seq = "aa", .vgene = T, .norm=T, .verbose=F) do.call(grid.arrange, list(vis.heatmap(crs1, .title = 'Number of shared clonotypes + V'), vis.heatmap(crs2, .title = 'Number of shared clonotypes + V'), nrow = 1)) ``` ## Segments statistics ### V-segments usage ```{r vusagehist, fig.width=16, fig.height=10,warning=FALSE,message=F} vis.gene.usage(immdata, HUMAN_TRBV, .ncol = 2, .coord.flip = F) ``` ### V-segments summary statistics ```{r vseboxplot, fig.width = 13, fig.height=10,warning=FALSE,message=F} # Change the groups variable for plotting V-usage boxplot for groups. groups <- list(Group.A = names(immdata)[1:(length(immdata) / 2)], Group.B = names(immdata)[(length(immdata) / 2 + 1) : length(immdata)]) vis.group.boxplot(geneUsage(immdata, HUMAN_TRBV, .norm = T), groups, .rotate.x = T) ``` ### J-segments usage ```{r jusagehist, fig.width=16, fig.height=10,warning=FALSE,message=F} vis.gene.usage(immdata, HUMAN_TRBJ, .coord.flip=F, .ncol = 2) ``` ## Jennsen - Shannon Divergence applied to the segments frequency of supplied data frames ### V-segments Jennsen - Shannon Divergence among repertoires ```{r vdiv, fig.width=13,warning=FALSE,message=F,prompt=FALSE} res <- js.div.seg(immdata, HUMAN_TRBV, .frame='all', .verbose = F) vis.heatmap(round(res, 5)) ``` ### V-segments Jennsen - Shannon Divergence radarplot ```{r radars, fig.width=13,warning=FALSE,message=F,prompt=FALSE} res <- js.div.seg(immdata, HUMAN_TRBV, .frame='all', .verbose = F) vis.radarlike(res, .ncol = 2) ``` ## PCA on segments' frequencies ### PCA on V-segments statistics ```{r pcav,warning=FALSE,message=F} pca.segments(immdata) ``` ### PCA on V-J segments statistics ```{r pcavj,warning=FALSE,message=F} pca.segments.2D(immdata, .genes = list(HUMAN_TRBV, HUMAN_TRBJ)) ``` ## Top cross ```{r topcross, fig.width=16, fig.height=16,warning=FALSE,message=F} top.cross.plot(top.cross(permutedf(immdata), seq(500, min(sapply(immdata, nrow)), 500), .verbose = F)) ``` ## Shared repertoire statistics by clonotypes using V-segments ```{r shared,warning=FALSE,message=F} imm.sh <- shared.repertoire(immdata, 'av', .verbose = F) shared.clones.count(imm.sh) shared.representation(imm.sh) ``` ## Rarefaction group analysis ```{r muc, fig.width=11,warning=FALSE,message=F} clmn <- 'Read.count' if (!is.na(immdata[[1]]$Umi.count[1])) { clmn <- 'Umi.count' } vis.rarefaction(rarefaction(immdata, .col = clmn, .verbose = F), list(A = c("Subj.A", "Subj.B"), B = c("Subj.C", "Subj.D")), .log = T) ```tcR/inst/doc/0000755000176200001440000000000013667551325012541 5ustar liggesuserstcR/inst/doc/tcrvignette.R0000644000176200001440000003200313667551324015217 0ustar liggesusers## ----eval=TRUE,echo=FALSE,warning=FALSE,message=FALSE------------------------- library(tcR) data(twa) data(twb) ## ----eval=FALSE,echo=TRUE----------------------------------------------------- # # Load the package and load the data. # library(tcR) # data(twa) # "twa" - list of length 4 # data(twb) # "twb" - list of length 4 # # # Explore the data. # head(twa[[1]]) # head(twb[[1]]) ## ----eval=FALSE,echo=TRUE----------------------------------------------------- # # Run help to see available alphabets. # ?genealphabets # ?genesegments # data(genesegments) ## ----eval=FALSE,echo=TRUE----------------------------------------------------- # # Parse file in "~/mitcr/immdata1.txt" as a MiTCR file. # immdata1 <- parse.file("~/mitcr_data/immdata1.txt", 'mitcr') # # equivalent to # immdata1.eq <- parse.mitcr("~/mitcr_data/immdata1.txt") # # # Parse folder with MiGEC files. # immdata <- parse.folder("~/migec_data/", 'migec') ## ----eval=TRUE, echo=TRUE----------------------------------------------------- # No D genes is available here hence "" at "D.genes" and "-1" at positions. str(twa[[1]]) str(twb[[1]]) ## ----eval=TRUE,echo=TRUE------------------------------------------------------ cloneset.stats(twb) ## ----eval=TRUE,echo=TRUE------------------------------------------------------ repseq.stats(twb) ## ----eval=TRUE,echo=TRUE------------------------------------------------------ # How many clonotypes fill up approximately clonal.proportion(twb, 25) # the 25% of the sum of values in 'Read.count'? ## ----echo=TRUE, eval=TRUE, fig=TRUE, fig.height=4, fig.width=5.5, message=FALSE, fig.align='center'---- # What accounts a proportion of the top-10 clonotypes' reads top.proportion(twb, 10) # to the overall number of reads? vis.top.proportions(twb) # Plot this proportions. ## ----eval=TRUE,echo=TRUE------------------------------------------------------ # What is a proportion of sequences which # have 'Read.count' <= 100 to the tailbound.proportion(twb, 100) # overall number of reads? ## ----eval=TRUE, echo=TRUE, fig.height=4, fig.width=6.5, fig.align='center'---- # data(twb) # Compute summary space of clones, that occupy # [0, .05) and [.05, 1] proportion. clonal.space.homeostasis(twb, c(Low = .05, High = 1)) # Use default arguments: clonal.space.homeostasis(twb[[1]]) twb.space <- clonal.space.homeostasis(twb) vis.clonal.space(twb.space) ## ----eval=TRUE,echo=TRUE------------------------------------------------------ imm.in <- get.inframes(twb) # Return all in-frame sequences from the 'twb'. # Count the number of out-of-frame sequences count.outframes(twb, 5000) # from the first 5000 sequences. ## ----eval=TRUE,echo=TRUE------------------------------------------------------ imm.in <- get.frames(twb, 'in') # Similar to 'get.inframes(twb)'. count.frames(twb[[1]], 'all') # Just return number of rows. flag <- 'out' count.frames(twb, flag, 5000) # Similar to 'count.outframes(twb, 5000)'. ## ----eval=TRUE,echo=TRUE------------------------------------------------------ cmv <- data.frame(CDR3.amino.acid.sequence = c('CASSSANYGYTF', 'CSVGRAQNEQFF', 'CASSLTGNTEAFF', 'CASSALGGAGTGELFF', 'CASSLIGVSSYNEQFF'), V.genes = c('TRBV4-1', 'TRBV4-1', 'TRBV4-1', 'TRBV4-1', 'TRBV4-1'), stringsAsFactors = F) cmv ## ----eval=TRUE,echo=TRUE------------------------------------------------------ twb <- set.rank(twb) # Case 1. cmv.imm.ex <- find.clonotypes(.data = twb[1:2], .targets = cmv[,1], .method = 'exact', .col.name = c('Read.count', 'Total.insertions'), .verbose = F) head(cmv.imm.ex) # Case 2. # Search for CDR3 sequences with hamming distance <= 1 # to the one of the cmv$CDR3.amino.acid.sequence with # matching V genes. Return ranks of found sequences. cmv.imm.hamm.v <- find.clonotypes(twb[1:3], cmv, 'hamm', 'Rank', .target.col = c('CDR3.amino.acid.sequence', 'V.gene'), .verbose = F) head(cmv.imm.hamm.v) # Case 3. # Similar to the previous example, except # using levenshtein distance and the "Read.count" column. cmv.imm.lev.v <- find.clonotypes(twb[1:3], cmv, 'lev', .target.col = c('CDR3.amino.acid.sequence', 'V.gene'), .verbose = F) head(cmv.imm.lev.v) ## ----eval=TRUE,echo=TRUE------------------------------------------------------ imm1.vs <- geneUsage(twb[[1]], HUMAN_TRBV) head(imm1.vs) imm.vs.all <- geneUsage(twb, HUMAN_TRBV) imm.vs.all[1:10, 1:4] ## ----eval=TRUE, echo=TRUE, message=FALSE, fig.align='center', fig.height=5, fig.width=7---- # Put ".dodge = F" to get distinct plot for every data frame in the given list. vis.gene.usage(twb, HUMAN_TRBJ, .main = 'twb J-usage dodge', .dodge = T) ## ----eval=TRUE, echo=TRUE, message=FALSE, fig.align='center', fig.height=6, fig.width=9---- vis.gene.usage(twb, HUMAN_TRBJ, .main = 'twb J-usage column', .dodge = F, .ncol = 2) ## ----eval=TRUE, echo=TRUE, message=FALSE, fig.align='center', fig.height=5, fig.width=7---- vis.gene.usage(imm1.vs, NA, .main = 'twb[[1]] V-usage', .coord.flip = F) ## ----eval=T, echo=TRUE, fig.align='center'------------------------------------ # Transform "0:100" to distribution with Laplace correction entropy(0:100, .laplace = 1) # (i.e., add "1" to every value before transformation). entropy.seg(twb, HUMAN_TRBV) # Compute entropy of V-segment usage for each data frame. js.div.seg(twb[1:2], HUMAN_TRBV, .verbose = F) imm.js <- js.div.seg(twb, HUMAN_TRBV, .verbose = F) vis.radarlike(imm.js, .ncol = 2) ## ----eval=TRUE, echo=TRUE, fig.align='center', fig.height=4.5, fig.width=6---- pca.segments(twb, .genes = HUMAN_TRBV) # Plot PCA results of V-segment usage. # Return object of class "prcomp" class(pca.segments(twb, .do.plot = F, .genes = HUMAN_TRBV)) ## ----eval=TRUE, echo=T, fig.align='center', warning=FALSE--------------------- # Equivalent to intersect(twb[[1]]$CDR3.nucleotide.sequence, # twb[[2]]$CDR3.nucleotide.sequence) repOverlap(twb[1:2], 'exact', 'nuc', .verbose = F) # Equivalent to intersectClonesets(twb, "n0e", .norm = T) repOverlap(twb, 'exact', 'nuc', .norm = T, .verbose = F) # Intersect by amino acid clonotypes + V genes repOverlap(twb, 'exact', 'aa', .vgene = T, .verbose = F) # Plot a heatmap of the number of shared clonotypes. vis.heatmap(repOverlap(twb, 'exact', 'aa', .vgene = T, .verbose = F), .title = 'twb - (ave)-intersection', .labs = '') ## ----eval=TRUE, echo=TRUE----------------------------------------------------- # Get logic vector of shared elements, where # elements are tuples of CDR3 nucleotide sequence and corresponding V-segment imm.1.2 <- intersectLogic(twb[[1]], twb[[2]], .col = c('CDR3.amino.acid.sequence', 'V.gene')) # Get elements which are in both twb[[1]] and twb[[2]]. head(twb[[1]][imm.1.2, c('CDR3.amino.acid.sequence', 'V.gene')]) ## ----eval=TRUE, echo=T, fig.align='center', fig.height=6.5, fig.width=10, warning=FALSE---- twb.top <- top.cross(.data = twb, .n = seq(500, 10000, 500), .verbose = F, .norm = T) top.cross.plot(twb.top) ## ----eval=TRUE, echo=TRUE, results='hold'------------------------------------- # Apply the Morisitas overlap index to the each pair of repertoires. # Use information about V genes (i.e. one CDR3 clonotype is equal to another # if and only if their CDR3 aa sequences are equal and their V genes are equal) repOverlap(twb, 'morisita', 'aa', 'read.count', .vgene = T, .verbose = F) ## ----eval=TRUE, echo=TRUE----------------------------------------------------- # Compute shared repertoire of amino acid CDR3 sequences and V genes # which has been found in two or more people and return the Read.count column # of such clonotypes from each data frame in the input list. imm.shared <- shared.repertoire(.data = twb, .type = 'avrc', .min.ppl = 2, .verbose = F) head(imm.shared) shared.representation(imm.shared) # Number of shared sequences. ## ----eval=TRUE, echo=TRUE, results='hold'------------------------------------- # Evaluate the diversity of clones by the ecological diversity index. repDiversity(twb, 'div', 'read.count') sapply(twb, function (x) diversity(x$Read.count)) ## ----eval=TRUE, echo=TRUE, results='hold'------------------------------------- # Compute the diversity as the inverse probability of choosing two similar clonotypes. repDiversity(twb, 'inv.simp', 'read.prop') sapply(twb, function (x) inverse.simpson(x$Read.proportion)) ## ----eval=TRUE, echo=TRUE, results='hold'------------------------------------- # Evaluate the skewness of clonal distribution. repDiversity(twb, 'gini.simp', 'read.prop') sapply(twb, function (x) gini.simpson(x$Read.proportion)) ## ----eval=TRUE, echo=TRUE, results='hold'------------------------------------- # Compute diversity of repertoire using Chao index. repDiversity(twb, 'chao1', 'read.count') sapply(twb, function (x) chao1(x$Read.count)) ## ----eval=TRUE, echo=TRUE, fig.height=4, fig.width=5.5, fig.align='center'---- vis.count.len(twb[[1]], .name = "twb[[1]] CDR3 lengths", .col = "Read.count") ## ----eval=TRUE, echo=TRUE, fig.height=4, fig.width=5.5, fig.align='center', warning=FALSE, message=FALSE---- # I comment this to avoid a strange bug in ggplot2. Will uncomment later. # vis.number.count(twb[[1]], .name = "twb[[1]] count distribution") ## ----echo=TRUE, eval=TRUE, fig.height=4, fig.width=5.5, message=FALSE, fig.align='center'---- vis.top.proportions(twb, c(10, 500, 3000, 10000), .col = "Read.count") ## ----eval=TRUE, echo=TRUE, fig.height=4, fig.width=6.5, fig.align='center'---- twb.space <- clonal.space.homeostasis(twb) vis.clonal.space(twb.space) ## ----eval=TRUE, echo=TRUE, fig.align='center', warning=FALSE, message=FALSE---- twb.shared <- repOverlap(twb, "exact", .norm = F, .verbose = F) vis.heatmap(twb.shared, .title = "Twins shared nuc clonotypes", .labs = c("Sample in x", "Sample in y"), .legend = "# clonotypes") ## ----eval=T, echo=TRUE, fig.align='center'------------------------------------ twb.js <- js.div.seg(twb, HUMAN_TRBV, .verbose = F) vis.radarlike(twb.js, .ncol = 2) ## ----eval=TRUE, echo=TRUE, message=FALSE, fig.align='center', fig.height=5, fig.width=7---- vis.gene.usage(twb[[1]], HUMAN_TRBV, .main = 'Sample I V-usage') ## ----eval=TRUE, echo=TRUE, message=FALSE, fig.align='center', fig.height=7, fig.width=5---- vis.gene.usage(twb[[2]], HUMAN_TRBV, .main = 'Sample II V-usage', .coord.flip = T) ## ----eval=TRUE, echo=TRUE, message=FALSE, fig.align='center', fig.height=5, fig.width=7---- twb.jusage <- geneUsage(twb, HUMAN_TRBJ) vis.gene.usage(twb.jusage, .main = 'Twins J-usage', .dodge = T) ## ----eval=TRUE, echo=TRUE, message=FALSE, fig.align='center', fig.height=6, fig.width=9---- vis.gene.usage(twb, HUMAN_TRBJ, .main = 'Twins J-usage', .dodge = F, .ncol = 2) ## ----eval=TRUE, echo=TRUE, fig.align='center', fig.height=4.5, fig.width=6---- twb.pca <- pca.segments(twb, .do.plot = F) vis.pca(pca.segments(twb, .do.plot = F, .genes = HUMAN_TRBV), .groups = list(GroupA = c(1,2), GroupB = c(3,4))) ## ----eval=TRUE, echo=TRUE, fig.align='center', fig.width=6, fig.height=5.5, warning=FALSE, message=FALSE---- km <- get.kmers(twb[[1]]$CDR3.amino.acid.sequence, .head = 100, .k = 7, .verbose = F) d <- kmer.profile(km) vis.logo(d) ## ----eval=TRUE, echo=TRUE----------------------------------------------------- # data(twb) twb.shared <- shared.repertoire(twb, .head = 1000, .verbose = F) G <- mutation.network(twb.shared) G ## ----eval=TRUE, echo=TRUE----------------------------------------------------- # data(twb) # twb.shared <- shared.repertoire(twb, .head = 1000) # G <- mutation.network(twb.shared) G <- set.group.vector(G, "twins", list(A = c(1,2), B = c(3,4))) # <= refactor this get.group.names(G, "twins", 1) get.group.names(G, "twins", 300) get.group.names(G, "twins", c(1,2,3), F) get.group.names(G, "twins", 300, F) # Because we have only two groups, we can assign more readable attribute. V(G)$twin.names <- get.group.names(G, "twins") V(G)$twin.names[1] V(G)$twin.names[300] ## ----eval=TRUE, echo=TRUE----------------------------------------------------- # data(twb) # twb.shared <- shared.repertoire(twb, .head = 1000) # G <- mutation.network(twb.shared) head(mutated.neighbours(G, 1)[[1]]) ## ----eval=TRUE, echo=TRUE----------------------------------------------------- head(get.kmers(twb[[1]]$CDR3.amino.acid.sequence, 100, .meat = F, .verbose = F)) head(get.kmers(twb[[1]], .meat = T, .verbose = F)) ## ----eval=TRUE, echo=TRUE----------------------------------------------------- revcomp(c('AAATTT', 'ACGTTTGGA')) cbind(bunch.translate(twb[[1]]$CDR3.nucleotide.sequence[1:10]), twb[[1]]$CDR3.amino.acid.sequence[1:10]) gc.content(twb[[1]]$CDR3.nucleotide.sequence[1:10]) ## ----eval=TRUE, echo=TRUE----------------------------------------------------- codon.variants('LQ') translated.nucl.sequences(c('LQ', 'CASSLQ')) reverse.translation('LQ') translated.nucl.sequences('LQ', 'XXXXXG') codon.variants('LQ', 'XXXXXG') reverse.translation('LQ', 'XXXXXG') tcR/inst/doc/tcrvignette.Rmd0000644000176200001440000010676113667232050015545 0ustar liggesusers--- title: '

tcR: a package for T cell receptor and Immunoglobulin repertoires advanced data analysis

Vadim I. Nazarov

' author:

Laboratory of Comparative and Functional Genomics, IBCH RAS, Moscow, Russia

output: html_document: theme: spacelab toc: yes toc_depth: 4 pdf_document: toc: yes toc_depth: 4 word_document: default --- # IMPORTANT INFORMATION The tcR package WILL SOON BE ORPHANED AND REMOVED FROM CRAN. A new package is available that is designed to replace tcR: immunarch -- http://immunarch.com/ We will be happy to help you to move to the new package. Feel free to contact us: http://github.com/immunomind/immunarch Sincerely, immunarch dev team and Vadim I. Nazarov, lead developer of tcR ## Introduction The *tcR* package designed to help researchers in the immunology field to analyse T cell receptor (`TCR`) and immunoglobulin (`Ig`) repertoires. In this vignette, I will cover procedures for immune receptor repertoire analysis provided with the package. Terms: - Clonotype: a group of T / B cell clones with equal CDR3 nucleotide sequences and equal Variable genes. - Cloneset / repertoire: a set of clonotypes. Represented as a data frame in which each row corresponds to a unique clonotype. - UMI: Unique Molecular Identifier (see this [paper](http://www.nature.com/nmeth/journal/v9/n1/full/nmeth.1778.html) for details) ```{r eval=TRUE,echo=FALSE,warning=FALSE,message=FALSE} library(tcR) data(twa) data(twb) ``` ### Package features - Parsers for outputs of various tools for CDR3 extraction and genes alignment *(currently implemented parsers for MiTCR, MiGEC, VDJtools, ImmunoSEQ, IMSEQ and MiXCR)* - Data manipulation *(in-frame / out-of-frame sequences subsetting, clonotype motif search)* - Descriptive statistics *(number of reads, number of clonotypes, gene segment usage)* - Shared clonotypes statistics *(number of shared clonotypes, using V genes or not; sequential intersection among the most abundant clonotype ("top-cross"))* - Repertoire comparison *(Jaccard index, Morisita's overlap index, Horn's index, Tversky index, overlap coefficient)* - V- and J genes usage and it's analysis *(PCA, Shannon Entropy, Jensen-Shannon Divergence)* - Diversity evaluation *(ecological diversity index, Gini index, inverse Simpson index, rarefaction analysis)* - Artificial repertoire generation (beta chain only, for now) - Spectratyping - Various visualisation procedures - Mutation networks *(graphs, in which vertices represent CDR3 nucleotide / amino acid sequences and edges are connecting similar sequences with low hamming or edit distance between them)* ### Data in the package There are two datasets provided with the package - twins data and V(D)J recombination genes data. #### Downsampled twins data `twa.rda`, `twb.rda` - two lists with 4 data frames in each list. Every data frame is a sample downsampled to the 10000 most abundant clonotypes of twins data (alpha and beta chains). Full data is available here: [Twins TCR data at Laboratory of Comparative and Functional Genomics](http://labcfg.ibch.ru/tcr.html) Explore the data: ```{r eval=FALSE,echo=TRUE} # Load the package and load the data. library(tcR) data(twa) # "twa" - list of length 4 data(twb) # "twb" - list of length 4 # Explore the data. head(twa[[1]]) head(twb[[1]]) ``` #### Gene alphabets Gene alphabets - character vectors with names of genes for TCR and Ig. ```{r eval=FALSE,echo=TRUE} # Run help to see available alphabets. ?genealphabets ?genesegments data(genesegments) ``` ### Quick start / automatic report generation For the exploratory analysis of a single repertoire, use the RMarkdown report file at `"/inst/library.report.Rmd"` Analysis in the file include statistics and visualisation of number of clones, clonotypes, in- and out-of-frame sequences, unique amino acid CDR3 sequences, V- and J-usage, most frequent k-mers, rarefaction analysis. For the analysis of a group of repertoires ("cross-analysis"), use the RMarkdown report file at: `"/inst/crossanalysis.report.Rmd}"` Analysis in this file include statistics and visualisation of number of shared clones and clonotypes, V-usage for individuals and groups, J-usage for individuals, Jensen-Shannon divergence among V-usages of repertoires and top-cross. You need the *knitr* package installed in order to generate reports from default pipelines. In RStudio you can run a pipeline file as follows: `Run RStudio -> load the pipeline .Rmd files -> press the knitr button` ### Input parsing Currently in *tcR* there are implemented parser for the next software: - MiTCR - `parse.mitcr`; - MiTCR w/ UMIs - `parse.mitcrbc`; - MiGEC - `parse.migec`; - VDJtools - `parse.vdjtools`; - ImmunoSEQ - `parse.immunoseq`; - MiXCR - `parse.mixcr`; - IMSEQ - `parse.imseq`. Also a general parser `parse.cloneset` for a text table files is implemented. General wrapper for parsers is `parse.file`. User can also parse a list of files or the entire folder. Run `?parse.folder` to see a help on parsing input files and a list of functions for parsing a specific input format. ```{r eval=FALSE,echo=TRUE} # Parse file in "~/mitcr/immdata1.txt" as a MiTCR file. immdata1 <- parse.file("~/mitcr_data/immdata1.txt", 'mitcr') # equivalent to immdata1.eq <- parse.mitcr("~/mitcr_data/immdata1.txt") # Parse folder with MiGEC files. immdata <- parse.folder("~/migec_data/", 'migec') ``` ### Cloneset representation Clonesets represented in *tcR* as data frames with each row corresponding to the one nucleotide clonotype and with specific column names: - *Umi.count* - number of UMIs; - *Umi.proportion* - proportion of UMIs; - *Read.count* - number of reads; - *Read.proportion* - proportion of reads; - *CDR3.nucleotide.sequence* - CDR3 nucleotide sequence; - *CDR3.amino.acid.sequence* - CDR3 amino acid sequence; - *V.gene* - names of aligned Variable genes; - *J.gene* - names of aligned Joining genes; - *D.gene* - names of aligned Diversity genes; - *V.end* - last positions of aligned V genes (1-based); - *J.start* - first positions of aligned J genes (1-based); - *D5.end* - positions of D'5 end of aligned D genes (1-based); - *D3.end* - positions of D'3 end of aligned D genes (1-based); - *VD.insertions* - number of inserted nucleotides (N-nucleotides) at V-D junction (-1 for receptors with VJ recombination); - *DJ.insertions* - number of inserted nucleotides (N-nucleotides) at D-J junction (-1 for receptors with VJ recombination); - *Total.insertions* - total number of inserted nucleotides (number of N-nucleotides at V-J junction for receptors with VJ recombination). Any data frame with this columns and of this class is suitable for processing with the package, hence user can generate their own table files and load them for the further analysis using `read.csv`, `read.table` and other `base` R functions. Please note that *tcR* internally expects all strings to be of class "character", not "factor". Therefore you should use R parsing functions with parameter *stringsAsFactors=FALSE*. ```{r eval=TRUE, echo=TRUE} # No D genes is available here hence "" at "D.genes" and "-1" at positions. str(twa[[1]]) str(twb[[1]]) ``` ## Repertoire descriptive statistics For the exploratory analysis *tcR* provides various functions for computing descriptive statistics. ### Cloneset summary To get a general view of a subject's repertoire (overall count of sequences, in- and out-of-frames numbers and proportions) use the `cloneset.stats` function. It returns a `summary` of counts of nucleotide and amino acid clonotypes, as well as summary of read counts: ```{r eval=TRUE,echo=TRUE} cloneset.stats(twb) ``` For characterisation of a library use the `repseq.stats` function: ```{r eval=TRUE,echo=TRUE} repseq.stats(twb) ``` ### Most abundant clonotypes statistics Function `clonal.proportion` is used to get the number of most abundant by the count of reads clonotypes. E.g., compute number of clonotypes which fill up (approx.) the 25% from total repertoire's "Read.count": ```{r eval=TRUE,echo=TRUE} # How many clonotypes fill up approximately clonal.proportion(twb, 25) # the 25% of the sum of values in 'Read.count'? ``` To get a proportion of the most abundant clonotypes' sum of reads to the overall number of reads in a repertoire, use `top.proportion`, i.e. get ($\sum$ reads of top clonotypes)$/$($\sum$ reads for all clonotypes). E.g., get a proportion of the top-10 clonotypes' reads to the overall number of reads: ```{r echo=TRUE, eval=TRUE, fig=TRUE, fig.height=4, fig.width=5.5, message=FALSE, fig.align='center'} # What accounts a proportion of the top-10 clonotypes' reads top.proportion(twb, 10) # to the overall number of reads? vis.top.proportions(twb) # Plot this proportions. ``` Function `tailbound.proportion` with two arguments *.col* and *.bound* gets subset of the given data frame with clonotypes which have column *.col* with value $\leq$ *.bound* and computes the ratio of sums of count reads of such subset to the overall data frame. E.g., get proportion of sum of reads of sequences which has "Read.count" <= 100 to the overall number of reads: ```{r eval=TRUE,echo=TRUE} # What is a proportion of sequences which # have 'Read.count' <= 100 to the tailbound.proportion(twb, 100) # overall number of reads? ``` ### Clonal space homeostasis Clonal space homeostasis is a useful statistics of how many space occupied by clonotypes with specific proportions. ```{r eval=TRUE, echo=TRUE, fig.height=4, fig.width=6.5, fig.align='center'} # data(twb) # Compute summary space of clones, that occupy # [0, .05) and [.05, 1] proportion. clonal.space.homeostasis(twb, c(Low = .05, High = 1)) # Use default arguments: clonal.space.homeostasis(twb[[1]]) twb.space <- clonal.space.homeostasis(twb) vis.clonal.space(twb.space) ``` ### In-frame and out-of-frame sequences Functions for performing subsetting and counting number of in-frame and out-of-frame clonotypes are: `count.inframes`, `count.outframes`, `get.inframes`, `get.outframes`. Parameter *.head* for this functions is a parameter to the *.head* function, that applied to the input data frame or an input list of data frames before subsetting. Functions accept both data frames and list of data frames as parameters. E.g., get data frame with only in-frame sequences and count out-of-frame sequences in the first 5000 rows for this data frame: ```{r eval=TRUE,echo=TRUE} imm.in <- get.inframes(twb) # Return all in-frame sequences from the 'twb'. # Count the number of out-of-frame sequences count.outframes(twb, 5000) # from the first 5000 sequences. ``` General functions with parameter stands for 'all' (all sequences), 'in' (only in-frame sequences) or 'out' (only out-of-frame sequences) are *get.frames* and *count.frames*: ```{r eval=TRUE,echo=TRUE} imm.in <- get.frames(twb, 'in') # Similar to 'get.inframes(twb)'. count.frames(twb[[1]], 'all') # Just return number of rows. flag <- 'out' count.frames(twb, flag, 5000) # Similar to 'count.outframes(twb, 5000)'. ``` ### Search for a target CDR3 sequences For exact or fuzzy search of sequences the package employed a function `find.clonotypes`. Input arguments for this function are a data frame or a list of data frames, targets (a character vector or data frame having one column with sequences and additional columns with, e.g., V genes), a value of which column or columns to return, a method to be used to compare sequences among each other (either "exact" for exact matching, "hamm" for matching sequences by Hamming distance (two sequences are matched if H $\leq$ 1) or "lev" for matching sequences by Levenshtein distance (two sequences are matched if L $\leq$ 1)), and column name from which sequences for matching are obtained. Sounds very complex, but in practice it's very easy, therefore let's go to examples. Suppose we want to search for some CDR3 sequences in a number of repertoires: ```{r eval=TRUE,echo=TRUE} cmv <- data.frame(CDR3.amino.acid.sequence = c('CASSSANYGYTF', 'CSVGRAQNEQFF', 'CASSLTGNTEAFF', 'CASSALGGAGTGELFF', 'CASSLIGVSSYNEQFF'), V.genes = c('TRBV4-1', 'TRBV4-1', 'TRBV4-1', 'TRBV4-1', 'TRBV4-1'), stringsAsFactors = F) cmv ``` We will search for them using all methods of matching (exact, hamming or levenshtein) and with and without matching by V-segment. Also, for the first case (exact matching and without V gene) we return "Total.insertions" column along with the "Read.count" column, and for the second case output will be a "Rank" - rank (generated by `set.rank`) of a clone or a clonotype in a data frame. ```{r eval=TRUE,echo=TRUE} twb <- set.rank(twb) # Case 1. cmv.imm.ex <- find.clonotypes(.data = twb[1:2], .targets = cmv[,1], .method = 'exact', .col.name = c('Read.count', 'Total.insertions'), .verbose = F) head(cmv.imm.ex) # Case 2. # Search for CDR3 sequences with hamming distance <= 1 # to the one of the cmv$CDR3.amino.acid.sequence with # matching V genes. Return ranks of found sequences. cmv.imm.hamm.v <- find.clonotypes(twb[1:3], cmv, 'hamm', 'Rank', .target.col = c('CDR3.amino.acid.sequence', 'V.gene'), .verbose = F) head(cmv.imm.hamm.v) # Case 3. # Similar to the previous example, except # using levenshtein distance and the "Read.count" column. cmv.imm.lev.v <- find.clonotypes(twb[1:3], cmv, 'lev', .target.col = c('CDR3.amino.acid.sequence', 'V.gene'), .verbose = F) head(cmv.imm.lev.v) ``` ## Gene usage Variable and Joining gene usage (V-usage and J-usage) are important characteristics of repertoires. To access and compare them among repertoires *tcR* provides a few useful functions. ### Gene usage computing To access V- and J-usage of a repertoire *tcR* provides functions `geneUsage`. Function `geneUsage`, depending on parameters, computes frequencies or counts of the given elements (e.g., V genes) of the input data frame or the input list of data frames. V and J gene names for humans for TCR and Ig are stored in the .rda file `genesegments.rda` (they are identical to those form IMGT: \href{http://www.imgt.org/IMGTrepertoire/index.php?section=LocusGenes&repertoire=nomenclatures&species=human&group=TRBV}{link to beta genes (red ones)} and \href{http://www.imgt.org/IMGTrepertoire/index.php?section=LocusGenes&repertoire=nomenclatures&species=human&group=TRAV}{link to alpha genes (red ones)}). All of the mentioned functions are accept data frames as well as list of data frames. Output for those functions are data frames with the first column stands for a gene and the other for frequencies. ```{r eval=TRUE,echo=TRUE} imm1.vs <- geneUsage(twb[[1]], HUMAN_TRBV) head(imm1.vs) imm.vs.all <- geneUsage(twb, HUMAN_TRBV) imm.vs.all[1:10, 1:4] ``` You can also directly visualise gene usage with the function `vis.gene.usage` (if you pass the gene alphabet as a second argument): ```{r eval=TRUE, echo=TRUE, message=FALSE, fig.align='center', fig.height=5, fig.width=7} # Put ".dodge = F" to get distinct plot for every data frame in the given list. vis.gene.usage(twb, HUMAN_TRBJ, .main = 'twb J-usage dodge', .dodge = T) ``` ```{r eval=TRUE, echo=TRUE, message=FALSE, fig.align='center', fig.height=6, fig.width=9} vis.gene.usage(twb, HUMAN_TRBJ, .main = 'twb J-usage column', .dodge = F, .ncol = 2) ``` ```{r eval=TRUE, echo=TRUE, message=FALSE, fig.align='center', fig.height=5, fig.width=7} vis.gene.usage(imm1.vs, NA, .main = 'twb[[1]] V-usage', .coord.flip = F) ``` ### Gene usage comparing To evaluate V- and J genes usage of repertoires, the package implements subroutines for two approaches to the analysis: measures from the information theory and PCA (Principal Component Analysis). #### Shannon entropy and Jensen-Shannon divergence To assess the diversity of genes usage user can use the `entropy` function. Kullback-Leibler assymetric measure (function `kl.div`) and Jensen-Shannon symmetric measure (functions `js.div` for computing JS-divergence between the given distributions and `js.div.seg` for computing JS-divergence between genes distributions of two clonesets or a list with data frames) are provided to estimate distance among gene usage of different repertoires. To visualise distances *tcR* employed the `vis.radarlike` function, see Section "Plots" for more detailed information. ```{r eval=T, echo=TRUE, fig.align='center'} # Transform "0:100" to distribution with Laplace correction entropy(0:100, .laplace = 1) # (i.e., add "1" to every value before transformation). entropy.seg(twb, HUMAN_TRBV) # Compute entropy of V-segment usage for each data frame. js.div.seg(twb[1:2], HUMAN_TRBV, .verbose = F) imm.js <- js.div.seg(twb, HUMAN_TRBV, .verbose = F) vis.radarlike(imm.js, .ncol = 2) ``` #### Principal Component Analysis (PCA) Principal component analysis (PCA) is a statistical procedure for transforming a set of observations to a set of special values for analysis. In *tcR* implemented functions `pca.segments` for performing PCA on V- or J-usage, and `pca.segments.2D` for performing PCA on VJ-usage. For plotting the PCA results see the `vis.pca` function. ```{r eval=TRUE, echo=TRUE, fig.align='center', fig.height=4.5, fig.width=6} pca.segments(twb, .genes = HUMAN_TRBV) # Plot PCA results of V-segment usage. # Return object of class "prcomp" class(pca.segments(twb, .do.plot = F, .genes = HUMAN_TRBV)) ``` ## Repertoire overlap analysis *tcR* provides a number of functions for evaluating similarity of clonesets based on shared among clonesets clonotypes and working with data frames with shared clonotypes. ### Overlap quantification The general interface to all functions for computing cloneset overlap coefficients is the `repOverlap` function. #### Number of shared clonotypes The most straightforward yet a quite effective way to evaluate similarity of two clonesets is compute the number of shared clonotypes. *tcR* adds the new function `intersectClonesets` (`repOverlap(your_data, 'exact')`) which is by default computes the number of shared clonotypes using the "CDR3.nucleotide.sequence" columns of the given data frames, but user can change target columns by using arguments *.type* or *.col*. As in the `find.clonotypes`, user can choose which method apply to the elements: exact match of elements, match by Hamming distance or match by Levenshtein distance. Logical argument *.norm* is used to perform normalisation of the number of shared clonotypes by dividing this number by multiplication of clonesets' sizes (**strongly** recommended otherwise your results will be correlating with clonesets' sizes). ```{r eval=TRUE, echo=T, fig.align='center', warning=FALSE} # Equivalent to intersect(twb[[1]]$CDR3.nucleotide.sequence, # twb[[2]]$CDR3.nucleotide.sequence) repOverlap(twb[1:2], 'exact', 'nuc', .verbose = F) # Equivalent to intersectClonesets(twb, "n0e", .norm = T) repOverlap(twb, 'exact', 'nuc', .norm = T, .verbose = F) # Intersect by amino acid clonotypes + V genes repOverlap(twb, 'exact', 'aa', .vgene = T, .verbose = F) # Plot a heatmap of the number of shared clonotypes. vis.heatmap(repOverlap(twb, 'exact', 'aa', .vgene = T, .verbose = F), .title = 'twb - (ave)-intersection', .labs = '') ``` See the `vis.heatmap` function in the Section "Visualisation" for the visualisation of the intersection results. Functions `intersectCount`, `intersectLogic` and `intersectIndices` are more flexible in terms of choosing which columns to match. They all have parameter *.col* that specifies names of columns which will used in computing intersection. Function `intersectCount` returns number of similar elements; `intersectIndices(x, y)` returns 2-column matrix with the first column stands for an index of an element in the given *x*, and the second column stands for an index of that element of *y* which is similar to a relative element in *x*; `intersectLogic(x, y)` returns a logical vector of *length(x)* or *nrow(x)*, where TRUE at position *i* means that element with index {i} has been found in the *y*. ```{r eval=TRUE, echo=TRUE} # Get logic vector of shared elements, where # elements are tuples of CDR3 nucleotide sequence and corresponding V-segment imm.1.2 <- intersectLogic(twb[[1]], twb[[2]], .col = c('CDR3.amino.acid.sequence', 'V.gene')) # Get elements which are in both twb[[1]] and twb[[2]]. head(twb[[1]][imm.1.2, c('CDR3.amino.acid.sequence', 'V.gene')]) ``` #### "Top cross" Number of shared clonotypes among the most abundant clonotypes may differ signigicantly from those with lesses count. To support research *tcR* offers the `top.cross` function, that apply `tcR::intersectClonesets`, e.g., to the first 1000 clonotypes, 2000, 3000 and so on up to the first 100000 clones, if supplied `.n == seq(1000, 100000, 1000)`. ```{r eval=TRUE, echo=T, fig.align='center', fig.height=6.5, fig.width=10, warning=FALSE} twb.top <- top.cross(.data = twb, .n = seq(500, 10000, 500), .verbose = F, .norm = T) top.cross.plot(twb.top) ``` #### More complex similarity measures *tcR* also provides more complex similarity measures for evaluating the similarity of sets. - Tversky index (`repOverlap(your_data, 'tversky')` for clonesets or `tversky.index` for vectors) is an asymmetric similarity measure on sets that compares a variant to a prototype. If using default arguments, it's similar to Dice's coefficient. - Overlap coefficient (`repOverlap(your_data, 'overlap')` for clonesets or `overlap.coef` for vectors) is a similarity measure that measures the overlap between two sets, and is defined as the size of the intersection divided by the smaller of the size of the two sets. - Jaccard index (`repOverlap(your_data, 'jaccard')` for clonesets or `jaccard.index` for vectors) is a statistic used for comparing the similarity and diversity of sample sets. - Morisita's overlap index (`repOverlap(your_data, 'morisita')` for clonesets or `morisitas.index` for other data) is a statistical measure of dispersion of individuals in a population and is used to compare overlap among samples. The formula is based on the assumption that increasing the size of the samples will increase the diversity because it will include different habitats (i.e. different faunas) (Morisita, 1959). To visualise similarity among repertoires the `vis.heatmap` function is appropriate. ```{r eval=TRUE, echo=TRUE, results='hold'} # Apply the Morisitas overlap index to the each pair of repertoires. # Use information about V genes (i.e. one CDR3 clonotype is equal to another # if and only if their CDR3 aa sequences are equal and their V genes are equal) repOverlap(twb, 'morisita', 'aa', 'read.count', .vgene = T, .verbose = F) ``` ### Overlap statistics and tests #### Overlap Z-score (OZ-score) - a measure for ???abnormality??? in overlaps `ozScore` #### Monte Carlo permutation test for pairwise and one-vs-all-wise within- and inter-group differences in a set of repertoires `permutDistTest` `pca2euclid` ### Shared repertoire To investigate a shared among a several repertoires clonotypes ("shared repertoire") the package provided the `shared.repertoire` function along with functions for computing the shared repertoire statistics. The `shared.representation` function computes the number of shared clonotypes for each repertoire for each degree of sharing (i.e., number of people, in which indicated amount of clones have been found). The function `shared.summary` is equivalent to `repOverlap(, 'exact')` but applies to the shared repertoire data frame. Measuring distances among repertoires using the cosine similarity on vector of counts of shared sequences is also possible with the `cosine.sharing` function. ```{r eval=TRUE, echo=TRUE} # Compute shared repertoire of amino acid CDR3 sequences and V genes # which has been found in two or more people and return the Read.count column # of such clonotypes from each data frame in the input list. imm.shared <- shared.repertoire(.data = twb, .type = 'avrc', .min.ppl = 2, .verbose = F) head(imm.shared) shared.representation(imm.shared) # Number of shared sequences. ``` ## Diversity evaluation For assessing the distribution of clonotypes in the given repertoire, *tcR* provides functions for evaluating the diversity (functions `diversity` and `inverse.simpson`) and the skewness of the clonal distribution (functions `gini` and `gini.simpson`), and a general interface to all of this functions `repDiversity`, which user should use to estimate the diversity of clonesets. Function `diversity` (`repDiversity(your_clonesets, "div")`) computes the ecological diversity index (with parameter `.q` for penalties for clones with large count). Function `inverse.simpson` (`repDiversity(your_clonesets, "inv.simp")`) computes the Inverse Simpson Index (i.e., inverse probability of choosing two similar clonotypes). Function `gini` (`repDiversity(your_clonesets, "gini")`) computes the economical Gini index of clonal distribution. Function `gini.simpson` (`repDiversity(your_clonesets, "gini.simp")`) computes the Gini-Simpson index. Function `chao1` (`repDiversity(your_clonesets, "chao1")`) computes the Chao1 index, its SD and two 95 perc CI. Function `repDiversity` accepts single clonesets as well as a list of clonesets. Parameter `.quant` specifies which column to use for computing the diversity (print `?repDiversity` to see more information about input arguments). ```{r eval=TRUE, echo=TRUE, results='hold'} # Evaluate the diversity of clones by the ecological diversity index. repDiversity(twb, 'div', 'read.count') sapply(twb, function (x) diversity(x$Read.count)) ``` ```{r eval=TRUE, echo=TRUE, results='hold'} # Compute the diversity as the inverse probability of choosing two similar clonotypes. repDiversity(twb, 'inv.simp', 'read.prop') sapply(twb, function (x) inverse.simpson(x$Read.proportion)) ``` ```{r eval=TRUE, echo=TRUE, results='hold'} # Evaluate the skewness of clonal distribution. repDiversity(twb, 'gini.simp', 'read.prop') sapply(twb, function (x) gini.simpson(x$Read.proportion)) ``` ```{r eval=TRUE, echo=TRUE, results='hold'} # Compute diversity of repertoire using Chao index. repDiversity(twb, 'chao1', 'read.count') sapply(twb, function (x) chao1(x$Read.count)) ``` ## Visualisation ### CDR3 length and read count distributions plot Plots of the distribution of CDR3 nucleotide sequences length (function `vis.count.len`) and the histogram of counts (function `vis.number.count`). Input data is either a data frame or a list with data frames. Argument *.col* specifies column's name with clonotype counts. Argument *.ncol* specifies a number of columns in a plot with multiple distribution, i.e., if the input data is a list with data frames. ```{r eval=TRUE, echo=TRUE, fig.height=4, fig.width=5.5, fig.align='center'} vis.count.len(twb[[1]], .name = "twb[[1]] CDR3 lengths", .col = "Read.count") ``` ```{r eval=TRUE, echo=TRUE, fig.height=4, fig.width=5.5, fig.align='center', warning=FALSE, message=FALSE} # I comment this to avoid a strange bug in ggplot2. Will uncomment later. # vis.number.count(twb[[1]], .name = "twb[[1]] count distribution") ``` ### Top proportions bar plot For the visualisation of proportions of the most abundant clonotypes in a repertoire *tcR* offers the `vis.top.proportions` function. As input the function receives either data frame or a list with data frames (argument *.data*), an integer vector with number of clonotypes for computing proportions of count for this clonotypes (argument *.head*), and a column's name with clonotype counts (argument *.col*). ```{r echo=TRUE, eval=TRUE, fig.height=4, fig.width=5.5, message=FALSE, fig.align='center'} vis.top.proportions(twb, c(10, 500, 3000, 10000), .col = "Read.count") ``` ### Clonal space homeostasis bar plot For the visualisation of how much space occupied each group of clonotypes, divided into groups by their proportions in the data, use the `vis.clonal.space` function. As an input it receives the output of the `clonal.space.homeostasis` function. ```{r eval=TRUE, echo=TRUE, fig.height=4, fig.width=6.5, fig.align='center'} twb.space <- clonal.space.homeostasis(twb) vis.clonal.space(twb.space) ``` ### Heat map Pairwise distances or similarity of repertoires can be represented as qudratic matrices, in which each row and column represented a cloneset, and each value in every cell (i, j) is a distance between repertoires with indices i and j. One way to visalise such matrices is using "heatmaps". For plotting heatmaps in *tcR* implemented the `vis.heatmap` function. With changing input arguments user can change names of labs, title and legend. ```{r eval=TRUE, echo=TRUE, fig.align='center', warning=FALSE, message=FALSE} twb.shared <- repOverlap(twb, "exact", .norm = F, .verbose = F) vis.heatmap(twb.shared, .title = "Twins shared nuc clonotypes", .labs = c("Sample in x", "Sample in y"), .legend = "# clonotypes") ``` ### Radar-like plot Another way to repsent distances among objects is "radar-like" plots (because this plots is not exactly radar plots) realised in *tcR* throught the `vis.radarlike` function. Argument *.ncol* specifies a number of columns of radar-like plots in a viewport. ```{r eval=T, echo=TRUE, fig.align='center'} twb.js <- js.div.seg(twb, HUMAN_TRBV, .verbose = F) vis.radarlike(twb.js, .ncol = 2) ``` ### Gene usage histogram For the visualisation of gene usage *tcR* employes subroutines for making classical histograms using the `vis.gene.usage` function. The function accept clonesets, lists of clonesets or output from the `geneUsage` function. If input is a cloneset(s), then user should specify a gene alphabet (e.g., `HUMAN_TRBV`) in order to compute the gene usage. Using a parameter \code{.dodge}, user can change type of the output between an output as histograms for each cloneset in the input list (`.dodge = F`) or an output as an one histogram for all data, which is very useful for comparing distribution of genes (`.dodge = T`). If `.dodge=F` and input are lists of clonesets or a gene usage of a few clonesets, than user with argument `.ncol` can specify how many columns of histograms will be outputted. With `.coord.flip` user can flip coordinates so genes will be at the left side of the plot. ```{r eval=TRUE, echo=TRUE, message=FALSE, fig.align='center', fig.height=5, fig.width=7} vis.gene.usage(twb[[1]], HUMAN_TRBV, .main = 'Sample I V-usage') ``` ```{r eval=TRUE, echo=TRUE, message=FALSE, fig.align='center', fig.height=7, fig.width=5} vis.gene.usage(twb[[2]], HUMAN_TRBV, .main = 'Sample II V-usage', .coord.flip = T) ``` ```{r eval=TRUE, echo=TRUE, message=FALSE, fig.align='center', fig.height=5, fig.width=7} twb.jusage <- geneUsage(twb, HUMAN_TRBJ) vis.gene.usage(twb.jusage, .main = 'Twins J-usage', .dodge = T) ``` ```{r eval=TRUE, echo=TRUE, message=FALSE, fig.align='center', fig.height=6, fig.width=9} vis.gene.usage(twb, HUMAN_TRBJ, .main = 'Twins J-usage', .dodge = F, .ncol = 2) ``` ### PCA visualisation For the visualisation of results from the `prcomp` function (i.e., objects of class `prcomp`), *tcR* provides the `vis.pca` function. Input arguments for the function are an object of class `prcomp` and a (if needed) list with groups (vectors of indices of samples) for colouring points in the plot. ```{r eval=TRUE, echo=TRUE, fig.align='center', fig.height=4.5, fig.width=6} twb.pca <- pca.segments(twb, .do.plot = F) vis.pca(pca.segments(twb, .do.plot = F, .genes = HUMAN_TRBV), .groups = list(GroupA = c(1,2), GroupB = c(3,4))) ``` ### Logo-like plot Logo-like graphs for visualisation of nucleotide or amino acid motif sequences / profiles. ```{r eval=TRUE, echo=TRUE, fig.align='center', fig.width=6, fig.height=5.5, warning=FALSE, message=FALSE} km <- get.kmers(twb[[1]]$CDR3.amino.acid.sequence, .head = 100, .k = 7, .verbose = F) d <- kmer.profile(km) vis.logo(d) ``` ## Mutation networks Mutation network (or a mutation graph) is a graph with vertices representing nucleotide or in-frame amino acid sequences (out-of-frame amino acid sequences will be automatically filtered out by *tcR* functions for mutation network creating) and edges which connecting pairs of sequences with hamming distance (parameter *.method* = 'hamm') or edit distance (parameter *.method* = 'lev') between them no more than specified in the *.max.errors* function parameter of the `mutation.network` function. To create a mutation network first what you need is to make a shared repertoires and then apply the `mutation.network` function to this shared repertoire: ```{r eval=TRUE, echo=TRUE} # data(twb) twb.shared <- shared.repertoire(twb, .head = 1000, .verbose = F) G <- mutation.network(twb.shared) G ``` To manipulate vertex attributes functions \code{set.group.vector} and \code{get.group.names} are provided. ```{r eval=TRUE, echo=TRUE} # data(twb) # twb.shared <- shared.repertoire(twb, .head = 1000) # G <- mutation.network(twb.shared) G <- set.group.vector(G, "twins", list(A = c(1,2), B = c(3,4))) # <= refactor this get.group.names(G, "twins", 1) get.group.names(G, "twins", 300) get.group.names(G, "twins", c(1,2,3), F) get.group.names(G, "twins", 300, F) # Because we have only two groups, we can assign more readable attribute. V(G)$twin.names <- get.group.names(G, "twins") V(G)$twin.names[1] V(G)$twin.names[300] ``` To access neighbour vertices of vertices ("ego-network") use the \code{mutation.neighbours} function: ```{r eval=TRUE, echo=TRUE} # data(twb) # twb.shared <- shared.repertoire(twb, .head = 1000) # G <- mutation.network(twb.shared) head(mutated.neighbours(G, 1)[[1]]) ``` ## Conclusion Feel free to contact me for the package-related or immunoinformatics research-related questions. ## Appendix A: Kmers manipulation and processing In the package implemented functions for working with k-mers. Function `get.kmers` generates k-mers from the given chatacter vector or a data frame with columns for sequences and a count for each sequence. ```{r eval=TRUE, echo=TRUE} head(get.kmers(twb[[1]]$CDR3.amino.acid.sequence, 100, .meat = F, .verbose = F)) head(get.kmers(twb[[1]], .meat = T, .verbose = F)) ``` ## Appendix B: Nucleotide and amino acid sequences manipulation The package also provides a several number of functions for performing classic bioinformatics tasks on strings. For more powerful subroutines see the Bioconductor's *Biostrings* package. ### Nucleotide sequence manipulation Functions for basic nucleotide sequences manipulations: reverse-complement, translation and GC-content computation. All functions are vectorised. ```{r eval=TRUE, echo=TRUE} revcomp(c('AAATTT', 'ACGTTTGGA')) cbind(bunch.translate(twb[[1]]$CDR3.nucleotide.sequence[1:10]), twb[[1]]$CDR3.amino.acid.sequence[1:10]) gc.content(twb[[1]]$CDR3.nucleotide.sequence[1:10]) ``` ### Reverse translation subroutines Function `codon.variants` returns a list of vectors of nucleotide codons for each letter for each input amino acid sequence. Function `translated.nucl.sequences` returns the number of nucleotide sequences, which, when translated, will result in the given amino acid sequence(s). Function `reverse.translation` return all nucleotide sequences, which is translated to the given amino acid sequences. Optional argument `.nucseq` for each of this function provides restriction for nucleotides, which cannot be changed. All functions are vectorised. ```{r eval=TRUE, echo=TRUE} codon.variants('LQ') translated.nucl.sequences(c('LQ', 'CASSLQ')) reverse.translation('LQ') translated.nucl.sequences('LQ', 'XXXXXG') codon.variants('LQ', 'XXXXXG') reverse.translation('LQ', 'XXXXXG') ``` tcR/inst/CITATION0000644000176200001440000000110113667026401013112 0ustar liggesusersbibentry('Article', title = 'tcR: an R package for T-cell receptor repertoire data analysis', author = as.person("Vadim I. Nazarov [aut], Mikhail V. Pogorelyy [aut], Ekaterina A. Komech [aut], Ivan V. Zvyagin [aut], Dmitry A. Bolotin [aut], Mikhail Shugay [aut], Dmitry M. Chudakov [aut], Yury B. Lebedev and Ilgar Z. Mamedov [aut]"), year = 2015, url = "http://www.biomedcentral.com/1471-2105/16/175", journal = "BMC Bioinformatics", pages = 175, volume = 16, doi = "10.1186/s12859-015-0613-1" )tcR/inst/library.report.Rmd0000644000176200001440000000573213667026401015415 0ustar liggesusers--- title: "TCR beta repertoire exploratory analysis" output: html_document: theme: spacelab toc: yes --- ## Before analysis Before running this pipeline you should do next steps: 1. Save your parsed MiTCR data to the `immdata` variable (it could be **a mitcr data frame or a list**). ``` immdata <- parse.folder('/home/username/mitcrdata/') ``` 2. Save the `immdata` variable to the some folder as the `.rda` file. ``` save(immdata, file = '/home/username/immdata.rda') ``` 3. In the code block below change the path string to the path to yours `immdata.rda` file. After that click the **Knit HTML** button to start analysis and the script will make a html report. ```{r loaddata,warning=FALSE,message=F} load('../data/twb.rda') immdata <- twb[1:2] library(tcR) ``` 4. Friendly advice: run the pipeline on the top N sequences first and configure sizes of figures. ```{r lapplyhead,warning=FALSE,message=F} N <- 50000 immdata <- head(immdata, N) ``` ## Data statistics ```{r seqstats,warning=FALSE,message=F} cloneset.stats(immdata) repseq.stats(immdata) ``` ## Segments' statistics ### V-segment usage ```{r vusagehist, fig.width=16, fig.height=5,warning=FALSE,message=F} if (has.class(immdata, 'list')) { for (i in 1:length(immdata)) { plot(vis.gene.usage(immdata[[i]], HUMAN_TRBV, .main = paste0(names(immdata)[i], ' ', 'V-usage'))) } } else { vis.gene.usage(immdata, HUMAN_TRBV, .coord.flip=F) } ``` ### J-segment usage ```{r jusagehist, fig.width=14, fig.height=5,warning=FALSE,message=F} if (has.class(immdata, 'list')) { for (i in 1:length(immdata)) { plot(vis.gene.usage(immdata[[i]], HUMAN_TRBJ, .main = paste0(names(immdata)[i], ' ', 'J-usage'))) } } else { vis.gene.usage(immdata, HUMAN_TRBJ, .coord.flip=F) } ``` ## CDR3 length and read distributions ```{r cdr3len, fig.width=10, fig.height=5,warning=FALSE,message=F} if (has.class(immdata, 'list')) { for (i in 1:length(immdata)) { plot(vis.count.len(immdata[[i]], .name = paste0(names(immdata)[i], ' ', 'CDR3 length'))) } } else { vis.count.len(immdata) } ``` ```{r readdistr, fig.width=10, fig.height=5,warning=FALSE,message=F} if (has.class(immdata, 'list')) { for (i in 1:length(immdata)) { plot(vis.number.count(immdata[[i]], .name = paste0(names(immdata)[i], ' ', 'read histogram'))) } } else { vis.number.count(immdata) } ``` ## Proportions of the most abundant clones ```{r topprop, fig.width=13,warning=FALSE,message=F} vis.top.proportions(immdata) ``` ## Most frequent kmers ```{r kmers, fig.width=14,warning=FALSE,message=F} kms <- get.kmers(immdata, .verbose = F) vis.kmer.histogram(kms, .position = 'fill') ``` ## Rarefaction analysis ```{r muc, fig.width=11,warning=FALSE,message=F} clmn <- 'Read.count' if (has.class(immdata, 'list')) { if (!is.na(immdata[[1]]$Umi.count[1])) { clmn <- 'Umi.count' } } else { if (!is.na(immdata$Umi.count[1])) { clmn <- 'Umi.count' } } vis.rarefaction(rarefaction(immdata, .col = clmn, .verbose = F), .log = T) ```