intervals/0000755000176200001440000000000013642055242012264 5ustar liggesusersintervals/NAMESPACE0000644000176200001440000000227413642043061013504 0ustar liggesusers######## Compiled code useDynLib( "intervals" ) ######## Imports # Class, method, and regular imports from the methods package are not listed # here, since we depend on the package. import("methods") importFrom( "utils", "head", "tail" ) importFrom( "graphics", "par", "points", "text", "axis", "segments" ) ######## Exports export( "Intervals", "Intervals_full" ) S3method( "split", "Intervals_virtual" ) S3method( "as.matrix", "Intervals_virtual" ) S3method( "c", "Intervals" ) S3method( "c", "Intervals_full" ) S3method( "plot", "Intervals" ) S3method( "plot", "Intervals_full" ) exportClasses( "Intervals", "Intervals_full", "Intervals_virtual", "Intervals_virtual_or_numeric" ) exportMethods( "[", "[<-", "as.matrix", "adjust_closure", "close_intervals", "closed", "closed<-", "clusters", "coerce", "contract", "distance_to_nearest", "empty", "expand", "head", "initialize", "interval_complement", "interval_difference", "interval_included", "interval_intersection", "interval_overlap", "interval_union", "is.na", "open_intervals", "plot", "reduce", "show", "size", "split", "t", "tail", "type", "type<-", "which_nearest" ) intervals/data/0000755000176200001440000000000013642043061013171 5ustar liggesusersintervals/data/sgd.rdata0000755000176200001440000050530313642043061014774 0ustar liggesuserslM4[*$Z%1#: 0 'yS'-<[~q/?__^:wl{~xx_͵~Ws~~}/;> 6ugx~ks<]쟛:.&}y]?\w]~]s}rz?y_swwm99w7k칾t}vXVq}/qf;y>?5]]ϗ}ڽ|>=w|<'iuz?wѽ\<ϰ>}~9l ξͽ'pv]^?{y_ g<}{}Mc}^5o{c/o>$-b͏wwz61]o,qV׹{Wf,uFhרr5ZO茶~VڰiLhpa:G{.I^:OJ1KTpl1g=yb &Kzmݯf/?=/>?OG?S#=7W~{]y_룯}}Q׷G 긺Ʀ{>Omr?S75iq5/xsZy8z}os|vOsoĢwe߮F,]XsˎiS4j~z6zwrų>ýgӛ/w={ݓzUo߀V!>-_OW{MϯՌu>EԦ׹5>oxfvcz§xqa/~} Z{jV[k׭m Nkya+|lj'LU0uoXgZXX'nk~~Pl$zI vn/j ^kN޵q=즽kj|lZC~ CdoEK<޽?s+gGczG_gGUiSoliCGخSD|5~V[1+9H`STA)ϧZgL~|5Af̧^6řvKlRb&'0I]H.j/^?f =SϿ_ׇS/uzR= f{uw7N˼kChFxу@j9ZX'ouE}>G36hm u9{?LAȜG~fjƆt_#j#G+o=׋^⦧ ]N1""⨿3s[8*ěAuB ס q;U{>+'kSCY>ZMLJ)y?TjmsMf<kϝn3su5ޓP&l:Zya"ݳfdMG`Z;32li+'l} +'t*'"CkDg_:%hu岻}42- SL=̅csh:ty as@y8|<:zrw.rlSluMMO⯬vdž7bAL~BiQ_ջt|ykq_ V3Ʀk+o9[xSsCG?jƲzMYcTI)Gô8Fo gӺj<7:Y3ve>EL|P9/Z93[Ʀx5}mg~@t~lf&jOkDLt_:%S \n1KcSZp6-ڰqxu+o־nz,#}2!"Qs7":ۮkc,_3Gښ ;?sf}jgk oߵzHvNy5 WÇ^#݊Zxc~FV ق8_96T\o&%hv'Jٿv%ܡu'l]sv=Ԭ.8/-9eNMfKj)o5d{~{qqc}ڹ9S0ء+{9.ctlOw8[SƦy72zQec9~>}t EKy kl]b+zlZoKluiӳu%x.q~@>O~oN}9p2 vOLnP^gž-avSlqv!>[X]/f3A;uV_Mϔyg2V ǧyvq6lMQg?r.VrƦVdž55v7]jie_\=WϸGz{v{v,ϠzGMo՘,؀y5F::o5$L//}ƫC?jܻu𾈱S>cys5/ KٮFhcC7)c9݊~Fy5g~='iW9:=ߋ32MתjFw']  ]!fr{3kZ' ,0Ӂ)lg0B.*N͊<)2dl|GAzǸ<@A8`aJvRn_p¨Nؐt߲axZq2}{gVL82u!e{6pe:8v֎g屾=z_`O2a1#f&鱖|qg>1{78Ο S%=dzj!~~u NX~/8lp2|Vt3w<\2`ɴk6mL$^-KEtL.!3olLmy!&w1gLB<c , vcӵY40FЊks+#ӳroGNkOS#з˽D'9)^DM`9/~][*ܭcG[KY):}YιN_oz[z[?8Ymo3 S]Xt*̧ GK⟻\^-V~M[/:6}ϏQ?F|8s\\g\< q3swzcsV`\/;x <vQj|~0Eb?]i?hbrƙ>g]9];$;Lx)&];*<1T?37q}Qaz`9pփ>Io&56]rdzsR;;'^;s@;{ pz.{;,K5WajTP*~ugױG_^ZVWƦgAcÏoWzlp_\ix~gNojgn g|a=͝yxlFEw8;l <6ͅA=wS9XIwfdSTn1Laû26mulr[{򠝷wJ}x\)O5ƦQ\ƬQŢ ю;vb ,vn8wn*wN[M=Ɖ q}0rt'w=5 aa#٫<6 #/eabYp0 ܆TwA3Ԫ]󰈠&|vobvXǏj`M lmFF|0/00;ϗzϣe8P僗h ƹ.T`){/P; 3twt^?cU TQ\|)kX(vq^AT)~vlOD]0Ǻ`aflKt2hlK V>8/{ؙƆYCE_Xsw ``;ˀx'\vOj;6-0ش"}REG/鄵cGw@eGh=6L3O[+8KEclZl/rlZl06d- =Anjv;#MQ ]z9[Žc~q~%v7o׵a^*(/Ld궗Uil;t[R:Vn) ܻzM4Qw9Zr5ϪbԪ6;0\Ui\p^P_ENmcGDbG~*򡒎=zts\^D:hl|m oPu7a_86c_<̊緫Y(Ȍqc=7?e˵)w5Z&^&I0"Vʼ h}x-5kQէ`[gSq/̊rZì5&`Vj46%S P'֚ƆN>vdžΈ̊50+^cēU]fEr0">"aD|aD\?PQ lul}_)0Lu%̧tgl"ד562߫D^(Y<ìxìxìx<<єaVYvB8x裏0:b;<_;s?:Pgw4@wMnt]wt=^v]͎van1QQOe2u#|iLڥjl<6 wesˤ.& D] ~U~쉍YuͩN,{s~^ǭin滣WyTiEaQE_xp0ɾãxuIxZwEݝ=ptsD}P_}p8XOT]dL7%A,5bjlD?!XNeM])\ʗ8Iw5Ͻ/Es4{^Ub.}ڀw߻9_g4]x }f(UMqN=M?Ў٫3)faܬqR <#niV{6כ۩ve6]pqyntw6wynV;6 ;bpug'y<<;76=OyuwlɤUK686cC~ ͻӔcSQV}t񹛟4g.{GE<ϭLGyavtl5b26a#@k z6"vOʨʎ2(ut;ܡW'V^ q$h;ܡ)wOnj5%icӪ ?E]ܡr㞙M~@H۹;tF ^ixA:]ŝ 5F*^pxA/ޝ~86Q{061V|lZcW#; \/:78Y=kul÷I06 yi.شColZׂ}o͛Ջ}OyQq&G2*kqlebQS Çi89;m:χ9Ʌ̷ P㻳xcSRI'0% ز0Z:\[" 9,i:\4%. ;:q/kbǦynq;cÔ=sOyi+xO|'?m6qׁQ<Ax)>g$x`DD)rlC(}l枍Ʀټe;elZ xL3DFL4xL486R:6ԄcT? dw)t兀P`nYcߟvƦ%{ziMkŴ")<8X~luI:~LM׼6e0h. DL+WOal]`Waxt{?}Lsr|GǕ8KH?_czTdK%Z8ENm,OS<~W=8WƆ~<_fŸ~ѕÜ_x$?rZogl`KNؘn46%瞧q|;6>:w:\͗N Wzmsǝ{4^І\&19p;D`&b;nA {xx8deN\W!$_f36| =O|09l#EOe?w>˥"thOi#]΍Msa4T&6.;.} [͕syRϮnyAMϲ;BbYޝ8aٛ`n} {+acs~nK,{@EMEOiUdlȉ2 /=#l`ѯ6ԑݧ-'E_ƦySPs(q+=6@:O^ kf `kmJE?!h̶@PydžXk B-wy`!^Rp |wos  bbk*Pv_zV9b5ZpG,MF!/TƦ}v}53A<6=˻;ׁqtlk5_ڋj/2]z`ymVCez{~:[PHNuibBO|l$FuT%pb?|fkM ʼcӽ\^DZaƧ\^ Tu1;k]`iŽ.t/pV` ՂmZ<.pVou/~X=e6L[`2Gӂk-Z.Z`x-bcCMX%^ 7xs 1]DԵ}>שF\DbqKl3G k5| #~?s{By.~[T`V+]"ۣ+fXlem.0fCOϹg%9>84SƆ:8Y퀯rC;{}W0:@~H=ט}'0z̲]eY`.$XۚX[̧Zuƛ)S۲*_;pbl+H'p~.tO !{E՞jxDLfÿ hPhfY𯖁y~1Xs06ՒF,@ذ.z@ęp$n2 o ໸Q[/8FQ EFٴ?<8 33jN>#| vh}m8w:^d-oO- z~??6D?C埨㣇ةٕTȎA6* U dٸD6f.Ӟ_ Q݁ EF&9{@?;Џ.Џt^@?>L߄^ %㖺蟷rT鹠f[^k^ZrrcDrlk^6]ȗK Y?rgr]?r+x_d[Uos9jwQ͹q<yX`&\^J{zVpU-Џ|)Kݮc  b^C}~f_xoQ~oɿunOF_$s =a_0o쯍Anmons gA㟍>Cч}:160sdžo;:ӫ^tlS͍ ,*o>ռ c<%v:( 0D 6cI~lT| e+29sчn?@:oYn~lmc}>?J/lF*}L@Ffd?7~:260#F7m4Ɔ9>Uvx7z'j3Zan{n}ʯsp;d<6h޲Y+ay36·og}ύ>purmMAkzFuȎF*=FDWqGv%#]1,ˬbۏcUYkjYxЋ|b`RL(At;<6p?c}XvNoUhA쾵:6p?܏ƓVZ i}lua##{k'6Y#Ypu|ˮ3bmء+tFkI|ERO&ӔpYDU.h e7:AFp;l?:}l?:}z?;}?!>W1_ZSa*NIn^GK! NN']<;S$ۯN6T<`]zVEV8ssz樆`NlZQ>_' u]EV9j5YcjQA2s:<ʍ9J: *(L16{_ BbMۯ LP?Bw EĦ2WN]2+=CZ.*? ]JY>O<~@W/-rc/L|՗9.#s8gN,*QvӉ?TQ8WІe#2E( 8kghAr MkDN aBx&[/J.ќ}1jD?b"Cl/9d51~Ľt020U&)^-H;C }upf~ʛ1PBu6%&ңO^.np&;A'Ú=7~@1lHFkon`ap;5{;߉\{G)sFX?65^X;89sPr4|j.s2hOerO |8=|yCiZك0K=v&^z);>p/V}]}WOcC!}(ip7 E݃~z梢8b@')NNĴB8cx4=+dLjTw Cr[Ef?F /Ŏrj.@0;,>P=Xj[sXim,CqKozՠyJO %/8bӮrM<63Ѡ_~ gc~])'RAnC+jl8+[`lRj Zle/vll8ASG8p$ޖ8=vX&Nٴ 'Q;SΜ٥GUWtl.';UǝC@Bѡ;3Ps?47\j1ḱ?Z-;Sa&ٜ83 w 9 rm<:Q#=jpζ4X<$ΚI=(]_s{pM%oIɗiN2Wd,:6]26tfC12FkPצsvG=|Sf\`!2̧U*pNqo-leS"X .PZ?!NS_\1?vQϿ|)PL;:2eL<7v^=Sg;Z6]FݙwN 7C$LEv5;N 56ׁ9~?{Vc8qϰ5Jщ יitJ_/ ?sU~W F!A^rY-<|վ~ܬ f v/QI.??_s,7Nn3}xr}̉t_T {7S'S=4"rL7y>75س1Shө*.TXR۫W(M]~c_wz1[p3i^Fօ*8?\ߓ V9Ʀ“kVU"kd=BtCUvܱ}5 >4|:>g?ᣖdPݥq |c=7jyo(46}Ze,tش,B`ꬍf٧zm_Fzee2sNDj&~w5{Gg5Z( 꾱Vg']Ghx&ҏ;/?VL/@vTD>:4UbpM3QANPKR3)w'=7>b77#ށ{? Yvdž+e iemZ5qV· S{y͗_3[<4_9/w/̾/?gzĴ~?~v5R7 ?/Lb_s{N\8j.ϰ21GTU֦3sgBdžj*:CI r~pMEV)8ю=Pg.}Ѿ_X8ᙑ|j{mLkC]ܪ}d4]5bk3lo\7ݠ)0"lqTɉTsmfFV󗲿2uj w R NAN${ONY.46xS['%sUAyϰv̤^ޘdmNAa Z$Qfyeud8> _1)9LM)WƦ NS|؜вa ;OcGitkSY%ռ/p03y{06;N\΁=7F::~ō)L\Knձ!^`~ylzvql/_5mjdڐ:)p煚͉ =!*ӾvA6ީ+`Q{~ zٮUjU:{m3ѳ2PQЭylv:x:8x|ү>0=  *L'1g9_1vWR9,ZP씓me} >*cR+Nr;ckQ(_ϻV)0+6Tr CRjflZð=:6χ~. S0߮UǦϹcÔ>F!^؀X͎N\{:L6Z׎\I XOlFz]=Ǧ.$WaPR~nN 6tꀿjQ|<&FCAjD%O2عNn(GU9V::6e@. ׆Ow@}BjCbwC~ZPys4 LE"J(j좱0Ć ̛̲p]Ĵh X} _Wx+B) eP#:F=6LcEjUd{;`w| fj@lU\wں݆*Jchñ_7>O_ཡζLPy[lŭ] 8 e{bu6ٞ[q}\| SuZx46NiyUA`Ci j2O'7$/fa6(y%5+4/I3k_LXo _EMc ԍoTo6Ԗ2ߎh޳hvzu|!!Mgvl6V[5՘݁ilLaC|zC|/Gy9OQNG_ol` ;cU. `r=Myslޝ/nB,;.cfdNZ.'ı{./֐kl;\wƆwyϭBj1whV2r{f|3Cu!.7r| _~u&kK_.\:o~ߵۓS)3#*L. 7q$v[.|X~ıGQZ9Ck TE:_0K<vEVNmuOAN̕kS抱q{;}3zz 6`n{0q]} Oy96MtflIr,sHo?`{`C`ϻ[Z?|mmMxl).>a< Y-iy J[Mog3倕tq%Ҁ r n̝JUT6Qpy"C&Z wQa`,>ä-S>EUMB?8Zث6^Mz6rM߲.p2MOǦU=dV}2e]"r *aT3d* ^> ~8a)?:Xo6x>  ^tq2֗:\F.}ڼo xNn2ۏa x wu^tuh4N&:AV'MsƦ1hg$ʙڴ°7OAUfln|_~/l|W_~W{JFJgH-. )Y jj̈́gUk"Щ]V˱060FCt|\d@{M #3h]VvQh3&zhE_6 6tqnC+ZZǦu6߫616}}C}vuR`l@FlfgJ2*M A2̧9sJ.eE}kqVwfMc8ӠqtC= pC}{Zp26L.~(?r *X滨009Sa/dy>91OjlU|K"k s*5XvxǦxHO8Q7Ot7/eh!סz6('ΏfϏZy5~ ߭2̾`m%Fgiw%P4=Ê=gc0Q_FQ?zuO;PQ_EMOj+QERaggVı#-LW,:Y$|ԏo2끾t grNe"g5;y@y>exC.F;uk/؀ׂoGԞ_yѫFڴ;0L|}cSLrgx|U}ClW |O%bh\ñiB5l(09UdTo\e9<`9HC A?3;%:r\Gm*d( 0k \%: 1qBFjw>̛.:G 9{I^هECLPłݷ7Tahl<6KMLGG"WÏ;$/Я/:G7÷:T<ï:[ wnl F ,?LlTd~Zx×NQrWql@>~Phٸ|m{j)~Țawћ Jڠ{\ l9VNTԑ3M.x=::>U(ʿREl)qr'FP 7#[x2V 1k<ƤDV7!P9|t: 4豁 [ {FrM9dž9ì"gSyew1_9X :46'wb$|B ooMұ!7yU.eJYj*T H/ǎÚG(>]?~?Ͻ`xyn( ^MʏMhOsشj&I:(u: ,ej\Ӝq:6 6Pr?ycZzGޜjشn,z탢J55Uz!4BQeס5l=`^wvB@YTilϗ hsJ wxvkex3"PEh+ l`߸vFaezc&F|g{TRN4jbrX`Oi.|=6;cCL =4o:􌣱6//2 CDgO8Ǧ{ΐrblV+(cթQU(|lNe6'2d`"Y!+FiU՜Ȑ߉ ȠO1t{lZoQDd `"̉ P%inc?ۏcTiSv-3>^IC$fcS=íSoLhcJbyl yjSkU9sQ\CD,YٙX}{\/]*Y s · ڪ,Ν9AX ͠79[{Q6* LNAbO3p elm~.u`g7L-s\ EͲ`aW26 `2Dd~dd⑇IYI  jƴݾhWZcc׵+׷3eGOu_oajF?V|MY^aڋƿ1WSqx2'91s`S78*l8/l0g)"J ;o۫jU$b+i^yəcA 36f1ւƬQݷ).q?̃`P׆9ashM͓!qІ 868jn \868р:/aƗvƦY30ӕ~59~jl}Ѹ~h51=6ánţ%SV7f46#|f4Eˌ3;/sEE?̎YUt얽9)N-%sw+cS?fjhl6`, elǘژ76F^ܘ87~G#gFckfl6of TEVwE Mql{{/=j;~Uc{5Folln׋GF\[UfSx9AY`L>Y_Eg3h}s=y\ݽl=sl豪|/_Q굑^02㳫|[2;aJ2=T<3fh4H}1<iϧ9]q>(ܪ̧i׃يSɂtUщ±i<'W_t3gӼ)Ioo;0̉o0t6}Q6̭03d樓 c ,&'zlozujul/Nmnu0oxob 7*-9O6/wXv>{a?憵*Nfl}!z8~\ YtT UO_׺p76x6Tyњ jhc| u9 Z-c5B5'q 9ߴ"_?&ʫՕ Y7'nj2w+0) Ÿ&|d8/~AN8hblhtl7{2acՕ ~5 N̍ Q%9l& {ܬt`'>6]PMRr6 Z]N ?o\xi;prs7.x6.*U` x*Ou‰qFXUꜙG&QK1?[*:}lwָU[?61 5jymȗo5X5N  5 N/ŇX:aY"{?7HEd&\o3,gbc)_Ui`K(r-s103Xb4sI\fRnlqZӃ/Bi}5MtaK2{蟾†f/3^đІy+x4&~AcZ;cCص\_~!p8ck.T(U487􆐼 1Pg9 1"]/*|K0ot=˱ .,{WMLj_C09rĺ/{ۙ9)L Oq4|m:mgχnbdȻܳ}O<bb ǃ4'L= eofZm rSohFe86eklzT5cls8y87Ϫ(('^Yת_x>hI_hIJd/ЛW7㽣x{7BKצfcjIS1U@#c'Vo7͛+=:ݧEONwHM^ (| 7|O}<0NGؾQ(Ö`z[]ce|O$wƦlF6ϰ~̼SU }щ8쭁06]?@ʗ;6C*Ŵxΰ5zmUrylw@!{9O@CMqhe~gl&:]tq:me~WkSQc39mΟ.XׇYccxޘbLncVVYz^CNlw;|3Uc|cu̧n&z.dٌ5s|Heoxm7:MχPg߈nmphY 䌰잭GY@+'^Q ]? g Z8lgllk2+v~d[b:Sy`nV``*;y'<8N- 132Z}tZ PSd'SƐSt0k FXم6TyQ叚K)qd bfؘk/TgsSt9SƐ*NwCX/eHtTSy8ŤȊTcl~#9gkOOǦ1_mg=ڴ"]Lbh/ C}SΧZyTsgl2~&M'tf]Wxu?=@Ug"s5_ f̱cc}[J7 ~W:M+ɝΛ1;ּ?L9 ?,?9Ji S_:LYt: ^.KA η3eAqayrRj*glXvSU=En홂%z ܡcS*Q>1CԄNԄgFuFƆi/ 2 Ə!n Me\o5_2w6O= ]0 wW3hlZϿwralcq:)zII}N9V9uǦ}"[ Z˝;[ e(4dx|cB<xi_IU$@G) 976>0h?((A9yѠꐠQ F {l`mZO4G[hS>>>:Χw3Tvl]N|Î{|S#~xu0d" _|m3_e&|uwlɌ0|cÜ&:vا9Rċ5joѳ(r6us66z)?61秎M X4TusƦGXާzcޱ?];?PyN8||@&|xLqiwPu7 f"/ԑDF)xCckl< xc&D[,*0 O#\ 9Z(h ޭucs`*a؏ҙ(DcCm 7\'p=vKS2Rz8E$[שVMadF)(3 L| + >gs>0ergMrcӘI% Mc$~Y!:$μƫHX8ׁ S˦!g]醻g顩(嬳D3U )Vmzly܍W/C,B@ƦC ^OXe<jjE,Z 7q`{ϝ}.`)شv'G]ͩKZuc}6Lb=O7fΕ d)D6{Vrr 읮UX Qym`)|Ox1fVyF;ܻ(yL+TS(.Z=d/e&Q_n'__2rTtb~{+h~j0K r>cӛ1[u'g,iIx_( Q^ڽ]-cӘz9arҌ:)uBXsC97f&d![sR `O1B`S+Wo&~~3>܍A5ǦCnEQMjƪ.k275"k2O=ؐSڱW#ll `0x ^~7EMQQ(ìuڅi56]3:t]u-m{6.1 J.XM8 gu=6-e ܜ 1g56ߛN=9(ԷX[-ѱoAy,|`ug+s|ĘOQ#fke-~;8F"U^~diT0̊C:IzsM=Ek\0v7ymJ#}lcC﫹*҇Ð{S(]=QGWhnEs͹ c= < .;Ul:l"ngvlZq> iC&+sl Sͩo䛹 O|ٸ!)h]}Uok !mo[wû;6\LyyǦkG-syQ= ee'jF:6Ȩ3j\[1ε=>C?Es#f^:I\yhݕ ䷓w@uNυaG]ɉ6eGJnD)'ӆ\=;}e0qؾ(t7cUS9'&p?k0L^wf=>%)}bj!g])>gfc<#{І[ĴdQZ pmJ {| =hu|t" SQ-i}lɌtȖUfQ5jٌRLn|#iݦiٻ~ٌdgyJ]]tlZ(Yt+æVƦ97R3V\)9$4me$4/"hqtǦѻ-W44Vx_2'8CjWX>Lvw>0M*NK|3ֱGႳ!omylsnΰArʐ/rVAǦ9~3t~=6[&:c#Er! #C ?bcT&;3;1&۷ î1x7Ͳj/o.o'6x闼[MɲzEc<,ptlt?{8em{C6@2HiGE"lS0@ چa8G]YU+3PP刹$F0.3eL[Pye,_-7٫^FϑxmͶ:q틠-N5.%cfu066x55,W^xQR{fw5޲^*GaXD88\X]+Oz/7V`:cqǖLԑJ5MsNv~hu UǞ^UZd\ƪ~ZX5+;5slJRV--nRu*—ƴ_D鯢ţpȪ2cf\rbNd_7)`|ݓ0^g"u@єf;d4}4; JgѐLh_mbF8Υic]2uTђ<{Q 9VYғ!ؾQ ?Z%Xxnl|dMƸMU!ﻱJd 8=-d,.&8-_ogd,Nש^ZJO2_s|1zV2C;fjKb팋5'DHkWuLY5Ic_m8^c;`Ir,wXcLϴx&ZsI};ld"as5xLq/L[`ge wx\@Z?@٧Unvlt2|XG{{n-KI$c)Dv/ȼ_/|%|{i3홍6Z% lr:| 3x'3yh\ƹ7lyMUH&g5\nmk0D:읆{/^YDA2ƩA&8nUZribI&U6V,'s(59L<A O2u=1kJ&VqwOs>Y'L\V{hn\G Ey}Md:mM̗fXLJ Ldxx*MP[6*{bބE4t8gj" MLij;ΝI2WhMoY|= ?ZMґlwa_;Yjv12_2}cw8{_Yâ8]0~Zd,St:0>hgyI2q $cvQ7 I& X}I&ڨ-Cq"xL\0Dͣ%P[nVy 1o(Z]dJoGr 2?A D+EV7^CͲ?XU6Yd,n(cּdI^xGS2"O3^V8kc)%>8ŵL kN,Xc ,":Z&eǢzKhhb41-^=sN"2Vd͈XSd-Iª:c0 V81^=2/y}xZdieymem&x;.,ꬎ b-D{w{x"LԽWIWn\2jѮl]H37V xUE^TV 6ږ [!bȠQ媜Tgg"ǻCjfk7ĩ㜷oʎxjm1gMuxVVPY++hapkFu Y=86LCIԵjc2l|7s#FJ&ޛXų`o:'x0v&icy[ %EOOǾG?c< jhh[NUH,ffNvLsD>m}7d,MM*M2UeYn} 㢝M{o[C{pa \=J(3޻U vu2KE>1;c X4e@{{,Ӭv+#gdQԙeN).yW.sr+c-*x/d=-e&28ù{E$$,ޣ)'{ZnO" .⦳U.]ŸDbH<~6YUKi≦<-X$a7q :yxcJjUd< 9/3:mm1ƪ7ƨX3}s%c\l:XUC̕'V3Q2mvcP_̖U~hcU+7o%m!`U#Lvw%{c y]{=}̪cug6fE˘*lV,(bo;d̎m{յ%5i\˾JUOS2f=*#Gy].QZ~駧|)=4Ƌ?v[#$c~xw0.h9Uꔌo'UYj}{q4V~o rV3Z>x^X{͑vWkUC[2nV>}*'c-k}rɫG"ij ֻLԟcDyP_ĝ1XbEiQL}f G Q-iM\'1EA8g$c,|L䬖L9@2M#_+E[M+du$cw9XCij;Fb?_.\[I&ΟxI&qukZEź۪X﹑I2NdeL@X9t=3ץ"&Ľcb~Ӥc۝(CTƓO\_"=%f$oL\_Va=[lV1ɬk'ZlAg|qҟmZ`̹gͻvgJsGףUx_"d$\K&=Zw_թYD E'XּAc=q]O6uO~+9)Z*e,"hvvv1?W2 w=w\*'޻!▧m)3{^b@ߊXk^2CLmvQ(L$,nЬұ;D>It{oQ2fk;c+,/ހ$)y$|YWouK~":❺ؓDXm㝺֒1ŪEzzߊk'QK&YERw=;wl|#P{~=7ŻުgN2qXEXE2Q E5w7И/;z%|VMw"Dݸj,rFh7&F?Nw|xO| >ei]1G4^uۥ 7ߛx^(f|2]#oҘ*87bD_[*+}Hz>3VRkIH&F4WlDap}lDV(LX6wA#c]e!O<1W2k*+9w8b.a6ȇ/n:6Q)O4ٺy⺰\IƘM_ɳe[Jf˾ y 'd9M]#c'0UzU&=S1"H2Vd&mw]<2r)պݏoպݷx]NlU&h׊%)bd,[cMґZјm'f7ny)F)r,sD $ -tLdC߲ci~cg_:fvH<+n-~5|alH~F]*yoQ^do%hspFx;+#XgZ[168XWc ib"d> ѲQ2c,OvG[j!j&;ld,dq1J{=OxLQ|L#18{Lbn#[d,;7I&7l4&!)_͟x_.=(R5jx_">ޗȱ)#9Cb=.*Vž )fdHw/o[avVJ2CekXm.d<+˪*T'U8VJgxc oU:ٱX?E2^%cn΍`wظk{G$i"w,%㬤юb^}`wE9؝:z%c,`,$=%cq˶}yr\Phx_޻-y }|j,}ϧ6!ޗnˇUJxi|wCL,؎d:!ޅ #źӒFѤo0Xr^q6>vRX~\ficƁtc7;xaF-]ҍ]&x]_ Y8~b67,?4`7x\0.'l{mBzoʒ2%y04זcueihYNWߞj;vH<ƊsqZL<=#Za\*el}v kVCꎷVU|0ƿ&VS/cU8%c^FWD>85*9Vԝd5E~$8󀍳X~Y;lK{|vF5J{1X2fy/S7xc-K1VM29ؽO214OAxW kV#ZG ӳ"de^G,Y^XD×x<8{gc lu8Ý.3̋ڈqM7Wq=x-ݒoed.\O⍵x1"ݢ}L3(S=K=J˵~Ydש\^kje 4ڱE#;͓s,X+3Vq08bjnFb},VkRx|y~fl7߸qxN{fܱXcEoVvёdn1[bv >r K&A Els5Qұ{ĬƼTD.ek[c='ϔ|[!]:rV+֖fF1Dd{_VOʽ9/v_$c E>8 $ȨL\΀!Y1`IN}pcd-t-LZSq6IƢ5D=jXO2qlky:㺈+yVA:[|Q+H1N217K&ꙑJ2vG]WUpd,e,Ѣ'$c> I&`9G~=bVOJd.cF*+?W{\cLNb@1\w'KNNJ V:VNL `}W%-y^B^{o]fL\_diYlG _2q}YEI&P!zWA& h*F6J&jDpZEbijhGic1i {I&Z#)-2}O[>FgM'ue[L GU\)1^2v=(j5}f]6v$ų$cCܗcۨ1Fo+&JdPƨ}?=#X]TVt?&u0+>>j:s]O4u}ⅱmh_} h=؛m0 X_Daj+{i-KT16NL%c* 1=*bI&FĬc{e|{ոd8Z/'5%"[dbԇy-[{cuT^yĢ6dyWE.b XV<+{=f`c^e2m0ږU}~ˬjd՟ٸ(]{/:d,ȴxߑF2a0NO"}Mg⟣gvrUο#u~ht6o99KVB9&cИ!; E?N2,q l~Sa\^kEYe(f٢dce=u͓YO=z-FPL2aoUpǘ70<(uuC?$5QtFáV׵4N}dgǸ MA2Qdywj>ڻ&F1%Ӛ$6W㽻(}/HV]]јqþau'#+$c\1[2qX>V푗֗V12msTOwWњ!aq˅1U̚θ8[*cȴI&Up¼ѳ?eQ L>fa {kΓE]:!2Xya c5N} ?Gdbnq^b EbĈh{/BQU.s cllcht>=2VvGqxĦ "|&cz]ǘ=*IƸg͖s'x8}%&[e2*6G̲-#lcPYE1 07jV&N2 uB2Q1nw֒V29c׎{-dsn^Gĵٙ$c< }uԱ%홓Xݳ|W:fHtcL{R5ZDkeYmjUvj<‘lTM|Y%cQ2Sm̷XND/yM2G#%UGX[m-[5hGL1[2OԱ"k3G]+ eHKho)cMUI!;,j1ʊLxWrcdnxeqpeԖ1:wzU,V6w@)ra6=*{ˢ-~_HeEf<87-V[Ws9H&W) 1;IX[7(uaM?2]aFk-s}u]&xx +z֞ǪbEmP̵eOk9/W:z|CLEE6-;pTNACZ q}+Hv̠WSsINF_Ļ4'8jl1GLws[;vǏZd,J1L%.ju cMV_X2{XV]dޞd|ό.6*<1e| -ogǛf9)*T~2]7^ ,2?u ϵz篻>ϵ~v%/.~u?o}}x~ss>G}oyq~9??oֿ6[||9~~~~~ߍ|~<;_磽Ǐ[>~=Ͽt_w{~~_j={s{_|__jGK??K9~9>{m\ Ϲ??q99c^}O~οosn>޿sϷ?|}|kÏ|ןۯO(߯<᣽GǏ,v.}y?ɺ?>}^K/}_q|>羷=9>_}O̅؏_گ}Q[ǿt~yc|>חj_9?V?mkȕ}_X~(s={h_K=w[緹nxRk=Os^}۟~y{G2ouy9_?{^H/x=c}u~;|΁8=?̓w=s=?oڷ޿˟?}g~~~kK=#8._#=oGs<~VK?k~~q(裌G|Ϸ=>_G>Z[NJi>ן/_|zo?>$xw?wo{4ſ0O~?Or?b???,rDÚ!gx6 {? Ǖ[iM>cV%h򣍍}_kk_c4 &4~/yrkQQk=U篩V9PL?xt8|W>d:$dS#{kCxOTȧr(lhx+ V-G9aw)67?y2%: R XɻTVA݉fޝ;oǂWHw>MEcdY!ק2L.aڑŁcx>/K8gl]6o,ٷ׊zsˣ47H H0Eai U"`ş_xU%`X+Έ_Zͫ[nn. /n6'Ŷe͎e3   Β4d8pp8p^p-%1W7yJ҉^ y|U=7 ȴ3c灣k`_tc\W~kvyx-U|̫]n.6"{pQ󼳞zvm~4'φB3.ݞ`2J R-[]~?K0 ޚ|Ǻ4k]L0ygxe;OZհé= 6lqxYrfwhUOoaRa_W/UK1V$^yrZyzeE-wN0N'afS0;e';؍3Lw\qK7ܻ_o6ƊfY)Y,mܼKr/ &S uqgY9:KaKaKaKr l %0ey&mI yl$P/Y-Y-k>& [[6KN0B&:kv ^:KWIw^yhO`>':j^ %:j:j TFs/]C0 s/_LSZ{Y#-]#Ͱ-+}85o\6Zwffg%뙥wוpO߫I3#SxN0ϰ bgΊ5٪VX fbgEQaw.fc+YlFbW& 롕k8bfjuVogyXݬ(KϢEO*p 8muWW]+K+K+ :`K+K3̫ ]ng ^7T~V~V~V~~m3LzjKwjydj!sъъja-bububububububhEaubuˆ{v H ^bfben c&{Fg,+ N0*)Y:| KP 9ȚyaG<0#9fG0;rّ#Ɏ=Ëa0xCs> GN:rؑŽ%&őq#G9 AcGN:R:V6"c^g#GSy #Y2ςTq`4`+Wf+7 R0 O0aeyؕ'_<\ B0w$a9 Y0s/I/` -F0lH74ũy+MͰU ^Z0[^H0[r O0]s/i{3.yS`%]{Kڐ ˒,₱%{7KԼ ({|!]0Fk 8KrƗ_RҼ`%qqc4`~̽}: ^O0t{]aԜ`%]>s/b3ϫI\vo0;7S`5 ޞ%/@;VKV!M%ü\\6o/&V xI0o81҉NDa5+ `N̯tb~%8ՁW)K͜.DtI^ q̉`Nqt88q0'8:mh̽fPeL32}_VyX3D10kr" l`Ddxs@ѱ-B<S3inoiFB4: py @#!s8ÐŐa}3rDQ7f4wS&?LGQ;ٶC5 (*ᰜ"'fE:q,`^[*Gʜ8R,I'_>1YsHA,IL9nnDaQLy62'9q`ڼWq0'U0|"w@T$9.]Rķ`[a[19q `܌l^h2g2ڜ8dH'&C:qΉ#pNytbΣS )L7 !#vsPΉrNs旌V&*:q͉coN;l޲p,ΉcqNCtb"k-g}g1(3'f#:1щ؈fs"0d;a\tbq0X =`gd]L"tbfR q7ʲy0C0y4*ه%{^;YE@ƞHf̽f==bAw2ӏ`%a%üqQ~Ns" LsbBKֳ byb ~KR?a 3c$ 12=?2 |;a8"UU6Wlӕa^Jexe#I>Qf99$y2G*wļ;%s&wG0u69Nq*W&{&49NUlB_f̽d C|0h&̽dBsܜ7'91͉9n8z91Ǎ`%z g71N#`ߜD~0w55 fv%c!s^͉9ms/Μ6'91y`%kdis JbūbWai%ӆaޖXBN|b8m^6]$N.Y[P0 ZD5w 5'f36aX[/͛JRbdb%)ذذXIJ$%/7-DYF/Y58'@ֿ_]W"Z f+2XJ%ֿM0WbWbWbWb++2+XJf%VYլj.+WbXb+E,""{OVg:5oo%V[Ȓ[v^yL%Hviͩhռz&X~;V+Dyyشش06~lZKLlAK,.7{c^Кǚ-j5[jlQݢ{8k6լEVY{f-f-f-f-f-fS[yE̽Ĝ jz՛$`UfUfUfUfgͪ`ͪ`k55DkVkVk'555jVk6լ n[6onc5q. [Ụb}5k5k5Hkլ֬֘-Mu5;OkV߾)׬*֘3`^.fv֬lYëkZS} f]ƻw5GDH-{ƻjjjjjjj6Ѭ9f]O7-jXkؘװ>pTZƻծծծ= ҰURw75pZ9 a}agXXæSO+ DhHN OVذNװNp@[3͛u&{:^ֆuuu}[wIrt]9 _?83#`B0Μ|39̙g?33Ϝ|f8"(̩NϜ|3>GDcs9;<:sl3'K6`cϜ-'?ꜹs\9т.y3D/RDzoWF8S9t^q3ej/7gJ0M; .8Ɣ;˿3SϜ}3t9L)݋Ua}-iqST`!?/S}%M(3'؟FyRH`pPexYx$)0\ˊ†dg"C0'ܡ[ry_C (1Ǵ`xz70PcO`Xoia2Co\<1[~o7 ݣo}csIq7v1eqCfg-7&^/;2?z؟U[Tߘ\fp!711S'=o?a^'T]0޼ߘo?Fxi|o_3Vcu) %k5+I\IcRIÂ[.tj//Bw5Y-ϗ-C`hS-[v Y^3N.nm޲ۼ%yy-P(en-[v&oMa%zr-{2ﶜrEt[N̽tt[ rDU vsmI-' Mse[ʕ0wє:xE -Wn9 -籶\A L$^E9 s/[r"hˉ-U0Miw6q@[-s'.1Jтn?[N*E/7HaV`0uP :cV˕[r^h˕[ sB[r>h˕[0?riKV0\N<0\N =`@oA%e3]Rfy8xgG.Wn9D Rg ۻ ;anYr0[Nl9 RZ3G=a>ʚa EĜ̰]f(ʲ\6b`ͭDn9t@ư%.$r!i|ÏE\/Z0\/zтqjcET/za^fDž[.$r! I*$0dnC(yӈa*,O4¬q(*Srmټbf5+l|a.4r M\hBӂq(;ls MThzyQ^IJgY2Bӂ%[.4r M\hBӂybnt{.4-wm6a M ^b}b;exe*Sa^qan4u˥[.M-8cccX-s-g_X-s-gXZ0d-7fx4.?%v~p;}!50E.L` S_)¡pDžC?.qa*KZz ļp ȅb@bzy.pa 3_8D0}]8B<5 yTJLr0Å3':Å/ G\8: PtHyS  s6\($(/l(cw!rܼ-xa @7Na#L]x˝_gyzhhvȲy{7ǍQ.ۼ"X6˝7"X6o%͸(eW$Ж \8|"ȏ _8D a=`P.* Ojֿ7DybQ,˅( =﷘.l`.s!Έ qA0P.+/CwxEJfQm^:*" #6p΅#p.s]W,͹~yRr`A0?"$fxML3&S6ܩ{'_8.BqARl#.2s#9sLra 3 泂 ToB/ytavLc0/a_]8k.DMj S_82L053S2/t$12I0".t!B _oBGd ]830`\g$LBs)WN Ttaz<.$gYb҅wf[[.emPl<n@`a^NF#…Y/:ᘦL/0Or]8ipL`4]p`~22%(1M%¡K'0* ]03 Fx'.D%fP:Y:QO昿0.L%!* r!ۅvGqs|k\T~)-qx0\Rp`.up)rT:.ӱ{L0U.tuTg7 鸨Oβt'ֱO#<6'gYE}sYqQt,Y6wkw\j?{:uTg~u50O~V91KG/(ڢ: YO^b]52*mY C;f>/>4+sc#ز>VZ=+[q%R{ͦ3d1%KNW:r:eW' lZDaz̛1oJG]q2oJN'OGN]W'ɝձ7#> Ӕ"S[<(JnـӒf]2FNy2ϥo:tyMǥo:b0bW:fMǥo:fcŽ=2{ jUwq雎Ktȑa~2FhCY s/Qg~Kt̯ 22̽D73YwvpSŲߩd=1y61Od*Ev\ڦc &:.m#{Oܼiqe&kt\c扎':b0ii83Mt4q &:1ӄ`|Gk,QfJ <x `J)):.1%EǔQRd_::lf a^MSPt\ꦻÁK^R &;M 5A,5F8Ny3lټyγ".@o.+ vL(1DDŽJb& 2 Dw }% 8FI0L( ^f/ɍcnt`x󂹗dh\dDR[anL$kƺ7 "5oX nDt sݓl޻zat8H0N.Z6o nma]t"<ȑu[d3q"wGhqэÎ6|;/:2x:زy5l)Q`n^& Mq<9,y k?&5*8V0 op@:8I0B8IT͛Z Fh\1mdB cqӍØna\ X0&Z+da4򷯜qӍnt&G"ntz+W!݈ }2.ݨU/uU7cqݪ1ݸnՍso\9%ꆞfK 2LɊ{%g>ttT7Nq*s?ݧg(i~qݪߨnUyZP7пq,ԍcn uX(yH{6آn\nTjټ f.NпqՍͫ~ե؆w 7q,Սcnw2u㐩L Y}x'8dƥn2u ~I2̽D'8U^0K܋<_8W7QF.xq\`~hDḬg8#qY7ݧWc/*˺q\֍TLP0OufnHU3Om8NqZ⅁n%-ހ"{;8NqZ7ӺQš]W0%mJ 0$_2q Mq\7:ʸPVq1/=k}=7nu㸮u8q]7quݸ`̦O wLɂO~nfal=JgI֓'=[Ozl=9;'It,Dl,9)gIF&al4h31`_{6s XF&=Mz&F6ҳmԯ s/gH϶R2̽{Dϙ\=@z90oK @f sO)gkG֎{v\gqkŸ{!ٚѳ5田gzSzN^gD։{:S s/:ѳu焮z.lݳuB0W'['zNճugD։z*KaZkl̽$D|}=׳g#DFiz6Bl艖/.)g#DFÖ)7=%;nD=%w9d0[J̽vIJ߹kfdHs2Yd='Ls2YF*,gg8y{N&9'[IJy-礲m=W79ǬgD϶m=&zM\ĸgD϶m=-3> ^ɡbu> ^wG~g_:2l!: cW0caܶ0ԱSKԱJw_2Dž%dg=5q9e=-7OocS sYâyzN%hqq?TJg6z*9a""gxeQuϩc==`vr"\X0}݁k FݏfmF%=m=o^]YsAg<`sAgR(=t05pȁ&km`~3P e&m ^ӹ50y@m*nx`V7 6piɁYfumҒ L60ymG[@5'<Jptoӽ Da0bwmXHfym`Yކ#fymrY|y_VjL60oӿ L60@otખy?m : ohGCifJW8]Y0O}JW̽&{@Ljo<,:ܰ9|lq0 <"2]L7p9́8vr ށN[=w̻!%fpH sb3'+7peu2y6D_YL(iYBɂ7p-΁kq\sN(zC'7\ipFgd=pF@73̣ O .909p\s*ƙae>^ܙan`sanV۷H^6g>pYDTty/p/pсKsQQ}d QƃKwaH9x<8;Ta40sJJ0 % =pN9т(7*w^y,{+<.LlfгjyމՂy{yY;?FyuDyމDY4Y m]7J^lS{h SSYC yڷQXSc1{R3Ss/ِXO)l=p)lafteh/׬VBOG3. }]-VLSRN8{PJ7J^  J _^,辥wxkxsOYX(UgA @Aal4oKWVYVYB.4h m%sx\XgDpb=b=̛aNF8Fq@ڻ 孪jޠ8[0z@_y(cg|o+K8^2ݑ]"`%s/YiOo4!`%U wIN.K2 wɺQI!LyR`% wIVͻƈ` [2Sy8Xi*҄(&ҕe4ms?kSN'VB`܋x˿iC!vyX+U';_Ųy0$pud 22['+nH!Wź31`:YqCwxgwX6oa;a^"ڂyKpEn~Fy P;^xw>[7h/;J &3`',VδL{δq`I>8Mܟ`%0gE0.uDdxg6 Kaz`%h{Ţue3=pqlQNjMxgދw"V;}' swĆ~;- Ųy؟Y{w&xg )jHy'yΜi!w:-78^މ#<< EyR.^mӞ߉"KWXaDn@Ua-8~>`~ɬawe3t6!w;Nd{͞bW> ygw暘a3wx52 `Zw;H(X^$PI$DBa%NvxgJwxgJ;/;ow.D)K2;SJ3;SJ3;QJdf\b0Dexkx\B)$P;SH3;SH3;QHd8@`{T s/l:ba~hew&xg; ^-{;ܜ2-L>L>L>F>$(m#~(w܀0 ɏ0?  f`/!u +? T0 ](v\ ~)C#;ÚAa%aYNgvǒ#G̽$sH +<؂:kٖͫK 3(?>]G6ḷ@G/=F6lzdG S|$ c/Ѫ?Ud+}m 1~dc#KyT4HY~6 H1d#Xdjv\.Ho=udّ,zKG ^mb$: f#G2s}V WՖͫRlY< j#PgD#bG?; "{H3-'?Gfad?´4zd{IG׏D{Cȵ9'Ӕcx `ȦM#G22O]'02>iI>Aݱ> ;EÑأwxkx *<.73O`d>}#F ɏ;fM}#F d{I>Kw;ߌL@=2>}#F&zdL#;0`TaB5`%Nm#SV iAAvyZP9)Gzd);C2̽Dӌ(YF"QNpw\lȝzd jJʺxߑ)c1$Y0m.|&;3gd G0wu46Y׍yqC sY5"KL --0z$ FƝ]]wv1/H^C^ks/Y¬+KV9.,#8a%[ f]cn{Ec 󾎶;= #;Da%e i; ϊf 9y̽f sGbexf ӜGhB=2G`r 楀N;意̨,̠<2 #3(̠,{Ɋ/wYb #3(̠,{Ɋ]^u33s/YFLF iEBGfH!yټA$fؐe$e3 E5ry.- yu[fX<Ce,H#Ln,{*r="7Fi edrc.1R e ɍG&7xdrq&+F{zRLU,{,*X0\DU0 XHw72U`~.Uqyquiټr0d-/Oϲb B񎤍qU@/arLQ%2G&xxdᑈ͛G""=`vk |V,/yP`6LlKC &WU}! Ƀbl1b|-&Uucd:|PJZH#K!B6+}1JDF3*2yu0fEAi!Hd1|w 1 zC_\Əjy>O K6/]ew/N0p9n54gl)ڕmq}Ÿ\\Uy0irxh]o)ڥi{RĠO.CR}ixh񯌇v) NS<͙]]f)ڥxh€Ҩ_R.->r4 8D|ីn!.I>/??4\]ˡ;wq.H.Zoۡs;tQ|9g_X+2N)8p9sq*HtDN]湋8C|]aWױ*|V FLM""q>ɗGqKM!DLǿ2#6냐|9me.ME9"ϡY|b?tӪkԐop<8Yʓ/k_ڹ-rQ2;-H۟4\ة7o<)9z.Nz| ps]^)WglNh`GJ5\({3VVV<׳/~y/x}zc "d@ #??gys2:32ߦь@{"LsF*ˁ5}|dd]ԪQZ[~`LsD7i0n0[v'Gti[nGyƨn J~ᤕt5Ok{u3@oK85FK6jtHmőoS;渱OGm{G+M3Zi22/n2wX3Ōm)Vϩ;34UvYwaYkeֺIֺu'\Nzt{˲EeS]L[}GwQa&(H$sz]V_l GT{;Z2Fҋ^*#[ #Ղ]jͽ~zuEz|<ȧH ȨչQQrh]rY uG[YFii61໖(ZoD"[EdT [,"J%S](Qa /b[)#aTA!Iv#i/.'@].!]1 Zg[[T6]]]6Hؗ#˚.ptn/ktdUDr$|!o6:Aw/qD-v÷aN~| c="ZjݮjuD ꋲdA'\85_m *kxDtaD (qhuٷck]7].V>j 1X4cc7׏~zDc:"zt'h=5N~ Dp|G OuB;;э0v!aPGDwq5mb?Z#߈貏}eѝv;T3w;dD`ܣͪm*FہQmU!U9{]t}"#J}.Zu/r`%fDn<.]ٙDtλ/pD56[j=kFDUѥOO#KW "qcG"hwI8".83āGҕUO) KľCx$ ]s]kB/<%3"*QE%Qz\Nx2Lw4;C:EDZ{I2"ͦ"2eĨ,ҩ8WAZ=uZErz\˟Oue_ov|:Y>d'9$rҔ 8?z_dR1mlڱ; r7t繡92CĄFdf,#.h2GIdD z3˧zЗp]!YZ~9.򩴜jZw񈈨$e higB=Lȿ0 2 j햨[nz|%#cYF e+/LZq`("goer$g3$TšhhGՄ#ZVvarR}H|"vaHpDNҝ׉v<2УLBx("tǽm@ *ӮpD@j.ڵPkB] xZFt!ʜ,ǚ.]WO)N] N]E ke^;t1e~w;6Pl;cDdv#ZCgKD7 y#z$&bK;DjHßcpPfoh_De!G  heҭ Tb!GMx, MӇjn7ЌG%a3h-ji":&~w2b[ҍP;1Q4sЌ/9h=v 42|F;7qZDtxNF;hS}O I ujȈ xFDt/v4mЬӞF 6h۠nF 6htA#Wm"۠nFrLh@;sѥ+Wn"V}m7r&KWO7gFw#Wno"nѝU0nOϖQROIDdt{> EB$l(` ADmHNB$ 8re$#Dᇅ=!K89EDWx$HPGPx(SDt J6"ml!H )!GD]ď<"b_" f lKqh "c"LıϩuƑHεte Swj/$CD7X2+/.VzVq}͖QLuTU|X/>,#+WVO2D"Z[yjl% [y.8d+/QCcO2]G5G-!ē4"k=I_d>,_l("ZlfΖ^K_qʙTL\mޡmi"@TI>G78]Dtg?gkQVB")D )Dt%p*U){-ADv$1"+#K'4$eDD64.:شǑsoqC{gQ%>'6=/"aG$,_DW"aH/`k@وhUAY 8 ;DD ѥgJDDnl#+xD.H؝!2Z3Rޛ(#cg<"fǎ7DtN@Dt͎Cݚҍ_$~#v"8G!"tc78"ᠡDx聈7Ddq "txHsʒ@ЫJNxDFU1[ $[dP!"Z#벯cאѥBDEK.8R]k$ ѥѥ=:IxN9d>GVT.D#K溩+ KW۫$}"#g$M%ADwj@)Zuxk@.ش;*EM$>GK$ ~b ک ;Cuq*6F;tgh)ѝYnx5)"㥱`imFiCDmM6)DD@mN}V_)~Q[8#"˞l;|W'""Kl;zV%^hdEDĨ 7DNe/Tkl`whmcľCmsThm~NЭO$mdو7AD$T ľCxAD)C""BD"^VE]ѵNl!" JRHdNZs MOb*6=mӓpQDt_gADnF.]mhklƈ}.{=LCdg1Z u~IԇZԆ8ٱ F!NVB )=QMv Vf|{ry~il:4UNd;8D\7YfVf![V`(\Lz]ؖ~-,CDP:z'"rDe~>CD@la"Z2jX_}.{9`"]q=Dt StF.vOѥ+ ;iDHvCDra'1VI ]wuݍwCDkѥ)=OI6 CD]mБtnw7㥛OeI&5;ۤo6MKKz2iˤͽͽT66OeQ Ǎᖉ8nVV6!jm{&m{&Ǜ홴fҶgqI۞I۞I۞I۞I&Dtj3i3 Τ'8LLz3ۤ'86+6+6+6+6+6+Mf,#F'mϤgA=MLz4i3Y4> :["|V VƯ۹C+HIϑ9YFyqӸ1;lkҳI϶&m'󛜘ߴ^A%@Kd,ôʟ{Um'm'mL56ɓMz"6<@.]=tpsic.]`ou$q VzՑĭmg`gKDVOӶnoV7njv{Vmeʜ}+3n"mS<%ٴS<8j3fvVn岭6[ej3fvt%D٭6[=j3S6^m`#[nuDqwhh3Anj1ȭmj뻕D[==@v|%l6&z+m"j=[.VA3AbߡØ[m5zVsc[Dzoq[=}Eup[mzlmV۪U[mVmVmqQz@;d0׶\O.ϵ:s=}G)v?!2 򷩜o3CD7?H8v@D)"* ;8  :"t1T*UO 2mH%>G7Dl/|Vf<(ED+3 #8#"ZO1n*a*"x#SfdtiHt UU"L9$8>Gk<6جG>9jn!=&P3ʈcZ/F@DسH Gcľ#4{QcŞdG=Cw"CutC6x*oYOʔCYwOR2y8g-PvXP~|Gr#7GpH`/:#ZqZ I 7\"ޝ,="ZOrQ^?E vJ"K7^.80ҝeDXz|T#;09>j-OuWB]'gP|nqnQN X8>"-QʜB͚k1B]>C~6#{ rkDio#Dt\u/8Cx5>GUmJ+m0mnn%%\_Mש8 ՏϊeDwkNW|88 >ѯ8 ~Ӻ8 mD89j.z%/ӣ8 |Ԇ%du|Nk+Uly'Y ]+ĆT7 bWT*B䨡.-3"euDtCD;k!"+s/Bdj}KrchjVG ҮZȦަr*,6Cu&;fKDםxDDtcVV&tI'l:m X dDњj [se)`ח!_Q~YF/,c0.N?&Eh=+"|ff1 %de Rk tϰ_({DѲlS D5<؆wPq =*׮Q"zyCD+(ςgx8nhCǡ z>""a#7DB}#}DºHY!6@ DtS%ҍ^FDn]]4" ]w+"cmD7>G޶ȓxv#HDY ~aO6DTV8Dl\u!AD8c"6g*C]z`kh=Qdʌ7;"(|h!68>GH("DD@HfD"@Dq 2"E@dD"Y1"G$ZG4 -QU'IJll,@D+ss̈bY0"`DtS#9^ $ ʟ5  )rxUϖR]Ԙ5v'\KxX2"-0}JO-Gh'|nND(#8Do1AwV(!^:X0"]'8BDʤSN!7B֎#O8]v%HX-eEd@Ȝ>'VB$T"y90;C+(n貏~]qDtǎADa"t "tW"tF-WSݑ7]S^4Dt7j1Ⱥ++D" @$!wҍ#HBD7ا..~b"."DtKLG8#"Ku#^ >>G7ED7*ED`}co|JK cCW"k{S~l#u?W+A?T/^/N"S6К:Nчn:q"Qh袋S!{8T1ᄈvoz͈.]mڤI[ DYEnu7VhJuW$]qYD֡NbľC6ikmҒ%~Cu<76Zx]I kvc26I8xxe"Z$IZS&)Ya6I8"sҭp])Ŵ%R{*""_dy0"xwDdR; "n\]gFEé~Dt{ ^$Y b DdR$ȧrR ;:ӭ"^iL4mfL>'^$+"!YАeIۢd"Zzzp#meնh'PxU+"$]tzv, q>g.+mVd%'U{NuO;#CD+J۷$&8A*"sC9}6]I*"tJR"Kwtex)WՌ~)WQ,~6K?S~he1w%)I_穮')Q} [ʀR[ʀz]*DT? KWDtޒ-@DܽDtfD5v8]QXؒqg=Y Zt| >GGws D|Dk#Tzrc JNz~Dti\.8:]c'!KWZXn@ۇeFD dPŐa[]w&ҍ/A?؀9*>=Zf *vF2D,C4"s{Cgҍ"!KWNg 5KWN y5KWN9ƈ+'QY^cDd3}-^OSd2֜1D[:T1FDnYwu Ȑx/꒬emP3ˈ~Nx#ZzyYcDU:D$1"uL.]9 Gr]p$)ѥ+'{:["inƧml.g{K^uҍM5?\β#U #JXB`D cdfKD>m"%Y*Seh$FDKl-+Q$N~5z,w-F;t7ZFzi\bi{p_:^,̈66tʘMDb^/Dd6ڨmƧNg^ `^Ddodx}׍zy_aϧuZ n-_aeզֶiw֬N4}#z2׉G6]ښmd`ӵ:&"_:MߌWΖL=3UMFϕ6zT#uV^Fuk#7]zTgDtjUDtNSdgF/Dt-Fϕ62m4h3nt2btMsFPm*MDIO62mdMDm62m-wѥmF۞Pm F۞Pm*MDlj5Ouw2"SeDQȵYm˗9cH>%Ƀ9aB$Q$rD^  ."aS|1$[n#q$"zʿpD5~FjQoĺCGggK9rPǁP;P&9ɈV##!ŁoYi?Ui?Y2~h٥ɪ*~ .c #kKc.Ak _l#8 qM7,>DDzy^kӝADD'm5heq.-EDVDk)EDUpPD q^9[ꆱ%> "5@JO/]BB%MiqUl#"B0-YI|ZB{u=N~#]wUGeLjqlڔӦæE0'6FmHnC$-+qs-DшqDŽ5H؍ vFĶ"aEd:,T#)'؝ud<H2FDk݀{6bľC78]DF[Ѣd W ]oHD P,DFU(DPsZBSu#F;F_-(^HFD8dx,xacn , "ZDta׺Tu{x"ZeT1bߡ/@D+qclmĈ}*GDF՗?yɄG*|T5@DHbDD[ "T>&DdOGPѥѥGDnDDnN]DdC]I1HNu1ZjbX${?"|9mq⻲ AH>G7mM#ѪcZ ٸ̴M6a$^h/vKb?9 x) "%2ngDId$@ nJd"+ѥjT*s3ZGFQo,8 ?L4y|Q$ ,w2-- rd;#Lw9*#x,lm TL$"vy7[C{wY O'9Le4[c&Fޕ~{Y75Y߹6^a4g\\5a fxei5-Z -lyGJ>atm/|i[6-md(BGbg| `[*u8A]uY:S/ʨQΕQ+]FJ̙\D}0q#."s2"s9na!#QΆA[Ē0]X [9b#~#5=@-rr0V oeEc+a.jǪ3eP-0(QFreɕ03chcnTsCZƼ1́0L# HuՕaJW)]t:=U[:-]Ft1O;%>J1J8a Vltpƨ:eiU#{w|15,"fwW[˘|.—FELc{Iʰq+cҸ2lʰq 赍iʘ.Wk[zmj%ӫeF)V#|E#{2r~n]JLtQ`0uQ# 9ĭ+7|c-GzW\0ҮXV3KOd1#/@qFO:;0F9F9kKb`>U[HG#ъ}vfoث3cgm?l$d<Ǩڛ^𮔻 0F9kRo͂F>Yz>M)aCz):ulǬW{w|QF 됸ҡu6#c=ޘ9ޘ*7S=w[,E虾ޘ1,aj< K6,ڰkR6˭nFClٗ݌08>hh$#>d mxiݩdTdBOd4UCF[mˇQ΍Q$e]a׆u̼xV#c 6c6ˀѻ1[_ =E(ga/zzɒ,d m5d m>dZO|RE!uV }`V*mf٬22?H$df=2?c:3{%Q όQ^8ՍBݻyAЂah dt?Vr"ch0Y2F9DFg{<Y6Udž`w- EHDFmAFCd'2F0튤;#{Ex_8\d m68[6ZCόQ Ń#c3FXי1ja7}dr& ֧e$F5[ a]u A}{^h  Ahbzj3!c7 KBSzeXl26 KExX(P'P'\ȏ5 -F 4fˋP\\[{UۑOeaÓTu6KW"#BSddOLמ"c(N{{.ЌQ[1ߜtu)287C1]1=CW"3^g#X&1&msB"chCdtM,2F9k[7lV&=M"c.$a22FB"}Y(!qbk]1QEOfrH.s+,|۳8}<ɉ YH`LCX"cz!k1Y?յՆյc tq̖Fʻ-MCdmɨhmh{eiFFtj>KЌ]˔$[jM6ۿ<83x mv!R`L2qf(g2D(g2E(2,|:Č} Y5Lw!Z V2qLw!chd^B(g 2F92dN澐1ʙV1ʹ13!c3,E(gSCU&Z% 2B}mY!cd xQď #ciQD|QɨCd 2*.:le4)2 ޞ !#[XfO57ZBF :3QduOֳ`t/Mg1Y}2F9!d2ٳҙ!dr&3CY2F99dr֣_:烌QzTO|1Y[+tIAS61bhAی}E2 cy_o1tD"c$*2V+PvLwǷ=/B.GH;2HUd@ cHd 2@f j ɼČ1!D5daE'BƨdN!cF5$ibƿ†22,怤ݳ(=[BFk6lYF fÖe{"a˲7˜,s*2F9 [ve}dZoX,#26 ȯOu_0-g[s#chZ0a {e5A{H $2F901x92uC.-xJd燇̩3Yf,M 'P'>΢oP{z.-c"<b |Yd}ԹeqoeIL+~^tȐW) ߈ OoUIlU(>x/^DDh1W%+DHFdr6",)$2F9~QXd(SH2!{ c :QI,2 Gm=jQVdW 6ƽ1E| ߢuN#u(FFf%Xj&f[ -MY~/f YQ 2[2z4$O2F0#:1#:1!АulD471! i oHcxC i oHcD4$s/2F}6ÃѐdB(gnoƘoMƨd'2F!Vl̖ы3i֧:3,ư|#1~moc4k`5[0-~o\#Yư#!y91z(a2>7[vݖ?= )C5xcXa75xcD!4d)y&*OF}2Wl2ZL4O4ռe\WXe]ɰݓɐ < |I xT+- s}9k9;:yIj2DvEБa'òOe >aC2B ƾŰa'O H"dE$ Ep$ 7@2IE̖э ^\2-I^~j$ C2B&pH!d8pH!IL/ᐄad!&3ړ5՞$hOs\iǃkt _-Fj'c>>diH#kH"^dx)H}2V-$K /E2Xɘc| gKh冋 q1&EȦp$cB*5*z&SmekI(ْqOZcCkZ 82jbYf_o,h AkL 1a淆f~ka â/C ~ka淆f~ka׷]v}+ْ1ڱ4@3#@zm2zm k[Ô/`ֈh1̀w#o0X( %Z42 7 5[#5vܔ0G3s2o#LacsA.{ɟ{6rɜ.d) <3k B`H2[Xo?dP\$QC $PC d-0ddL7!3E Y>)Q 2F V26ud mL֑1ʙ#3^΋T1_4>)ᓘOZ'X*dfYj dfY e-)f[t+d{f5`CW$ 2{T7o1@!谅+CW5+=`w  *ŌbH2+d -(d֡c yR:"3K2 sζ'$ 'I^3-Ff[%Yi Yirֳڐo9 Ӵ$}?ˌv^a;dH1JD1C1޼F7<@(gU c3YQڷK7<@hgM7<@fgqZ"Li=Rط4" 1ڄSE061ˌO&m 1?t{dJAf3˙m|hAY7c¶G@Fz#fnaG0C:6n85\ޢ<q-̖Qwt<9K00724 .pBC$2Fs c*5Pq sF ػEkj=ϵؤ5zVmئ(CWd0\o3ˏEGqS>5ע[ }ԇl+I&!2ʬ\yʿdt 2FDQ@Е1ߐԠ@[ѠA2ˌs>lŠkXgC" ##nǀx- Uqld6|hHEdc!M1z)#mǀKqldr6Ï~5/mڀ6a[ lW!h*O-2F9.6SЌt `?ˌo{p+.-7%1Za7FLCtIUζQ@Fk#YfT2lw~6]'IMmhֈ`. N'&-E$|& ۄ6a@h!\C& sPRcgF2^:zLyg&k2qmE&.AdbM k#0d> c3^!72dr&-x܊L#C|Lz:dr&+1ʹNl몍7.0$C dFW!$d -T ۘ O/g[tKa!{̽!uԐ@dtߐTdt[`!c381ʙ#c3G(g!@(g@F9lcKdy`dhvAg!czCƨw A"czEf8՝}S&uo1@"Ӑ1C#l!+#1ʙv"cv2FO֩"cs5L1bhl6C dVK,uF(g2 QΆ-lcزa˲d^VQ{Q$K2F9lCdlز $"cU [!~Tdr6U'a5dr& 13C(ggQddj2S~KhOdt9d& ],~],]Y|32>׆ⶑ1ٰ8Y<:2zW'#c3xQIL2I2F}6lɚA7Hdr&yG1곰g 0 ƿhd0֯!c=$v CWYxOPduc'5ך셎6ٚ]҆n;uIi- +KGhd7%d }aslz 1te ׆%]tm #5ÒfY71fYdr6,i2Fa>mƌcVAЂag<>ag/zV7㓌6aX5XA\PȌkc`H>im|u+È/Xv/dF+ e?dQCFMXV7dt/r!{9ydt?Vv? dr6+cDƨkU `[kUt/P 6,*2zXc8*c21̒"ct3KI !Ɍƌ}&` ۂ9jXf p?԰ ƿФaֳm1teLndZ 1&YJd~0>HPTd! o#2 ʘ ý"B1aL>pn_I3-F0&-Z0¹+# zƌpP-V>0ߨW,Ԡ!#ި=FDsdm!#[݈YAȾn|s̓1Yz]a 9F9k'9<Hn̓ϳqm̖i@}큀6ҡt{ d>HۉBc{ÎdrKnBmQ<݀2ƛ@lnd7?m؀`rցIrefƨ:n@ѫ@22,3[GD!LuǟTLL\;5X5/nIėL>lfߚ%'k63Έ7xL$G(i/Ff3c! DL 1ʙ,UBF_ QĦX!SI>RcƿIb"6:&S{iB<-x51z$eAI*R 2F9,dr&^Cdr&aW62F9aaWȌl|~)d6*T  2~?)`H2W$=%hlݱ7gE]!N, H dh,BF7ľ e4>hgD1Ji!c4Iцuf,BF9X2F9/25:3 "1ٰoYDB;>Іa)300m3CSo1-F!^{d MV6@F* jVbᓌvE憐1ڕa1dayAdDhF$m2F7m6Qd~ItbxGІaWd m(u@edgd)dwaW$!62FOE"i1tf,B EZL1W\GiFvBFxXRϓ}ih?%#[4BЬ2#{4ai<26GvیFm!#  =sj2re*Y̸m=[2Χ}QQ[cL FѨ-dDm!c mho4j mӨ-d>Hx(2#=JC\gk1Y{zE㲐1Y{z^~-`e!3o̖1ƣ:#1^iEF#1ZYz1"KY7di:2F s51d>2F9TeHdC&cqHzdUJél1-F%3$DFk9AFk6k]F\&#ձ0lb#Ze1A!#g]皙2g1b ֳ4_Z0lڰk=3гk跨}QQ CFFhoDF&caQ=KQ:ڸg.1ٰ_YOdr6ڰ_HވhYRVd#zc]@V!dfg1lf(5,fccozbCd%0d%2F ұRQ$62F qb=KS+KLh85:[ --KH\40XްY:~d @Ǽld& =dd mrmˍ1^f {Ƙf {( 2F90ۼ]n Kml!` Km~Q:g:!ưum [1}c޷'u285 ~o1tel7d9j1@tC0cjQ Ӹ! 91cj܈Q ӘHQu Ӹ1v4f;cƍ^߳M1N`lL6Ӷl[`].2F9AQΆjclWfdl1vF7 SƍQbbfl1FfqӿN9MFcN5L8& d[$E Е0I<[2Χ9<6O {w|tMh}r2aV'ìNF8uҋ6=>Hb yɘhNYpdL4'1<ˌ u &7/<7m6w2ldLG'Ntt2©1tR>6w2ld܉D(gNz!&cas'@OF8u2ldL'N͝tBM(U0&19 ;6wZ3٘N͝ ; {dNe <!I$~-{"{#c̰ߓa'~O =ihF0u2$lYf1 ooHUX87`(yg&5Ly`H{F&5X5|H#d!_d~E&=2h O?2F=$3 dzHfT L(1ʙu"cQ+jYeͫrm~ҌUb!ch,}Eh=d).2 t$z5f[/0d&C 2񏌡ч{Fw0$AfC(vTDfgq EFJ&˅Vcƿ;+wD2D0dB/肱o!9ɐm?CF &*zamȳ3-Ì.=wwO>5ԁwA7+f/1`X,'2FE2 c3ɍQ$I#2FdXld 2g1ļcW1^R5#cToÈ #F(g1#ԤuöAh#c4È.SS[0+cGh$!2 #ؙ1n/_w=7̿'Ȓ uFI"VXWߣW*쾜 қ͓ w阎ݧc:c:c:c:c:c:c:cq411c:c:c:c:c:c:c:c:c:c:c:c:c:阎阎阎阎阎B=c:c: NtLtLtLtLtLtLtLtLt =N阎阎阎阎'țc:c:c:_q阎阎阎阎阎阎ǗMtLtLtLtLtLǗ|k:c:c:c:c:c:c:c:c:_q阎阎阎阎阎阎阎阎1111111tLtLtLtLtLtLtLtLtLǿ阎阎阎阎阎阎阎阎&}_qWV-1wʳ/~~U 'MT%6/OV˓d<(N<)Aݔ'<)A]~Z'}m+K}~eƶ=[E'נPKS_{@{ ȣ߲y;v ?(zP~{kH= ?v|aWEm[ooy>뎀@reՇA~(%(_3ur~!>ߒ.f\AC(yeQ( w\y9 (o@~vA^Ay_x?u O.cVCmglK v(߾;sv,_vȻNoPU(?v;ȓ|w_ o&_w_\ S.GyA<sC(h7w(v Ե}(x|#@sQ U (ބ2z}g_\SJ%_R|(_s C_ey/EƛQ( Qʷ_~/? QMA~>{P~%uG=(MA~RE=(,m]AGA|'~e)䧪 }Q7MO\]@ ?K|1o9g~{\~aW]M{={AC(^?uW9>Eʣ+ wf?;(Cyk.;Ε=(;ܝ1/P^ׁkEْݏ= ?P\ gߎ(_Mro</S_XAv (_;/Gy g8P^F@KP^ڡ@~[y7<.C] QzwyQ>|7g|A9{;'<&p%ʧߎWDƏR=((v1 +~-Q~f.};Q(".BQ;{oB(C7=ɳrύ(KQ>-뒿0+/E˧|e(">+NۏDy7oG»P.򍗣QO;3BW|6W/A7ȍ(?/d=:9]z3oރ?ʷ_ݹw ̃(p._/𥳐oFk?oAyl?O_'Fyʅ(O;s(pګP>2/>7sQr%ȯ>U(ϼ #WP~Ӆ(r/8ʃP||yݮG#(wYk=tFY.Y{|~/_sQ~ /A+\._YGuy>`K1\AW|E(}/ےw|Q}69}GC(_x;ʃByQكA~m/AC@ wQ|_\(7(t;oygނ9gGP%(_7헢Џ tDWGwDu(GP^@^ůCנ|sQgP(#GyÛQ~(?|!/t |5(g>> 忻BMף|懳ܿ<(w6[۲|Px68קCF@+߉NG@yם//E -?N:W<(w ez:'?;GDUA{ nCmA>WQʧ /Cy1/jP\?c(Nw.7=呋Py7_ a'/DyEyP~u(~-ʯRQkQ>z?ygףw|u(/9ʗ=+nGy5(B9kGDyM(YQ6g쎡|GQ>(_(z)١3@yC(ܝY?2nʫw ʗ( {P~R>f塗쏠,[VP~2w;v9eKnȻڏEP^ _A(o=ӟrm /F](?xO_|n3@r(t8ˇ,׎|a?^>#GAOyޣ(s.FӾrKC(p}(_~٣.GzBC(=򭧡=O?ABKPj]oɏ<=ʋZ{=v8 g݇P~i(=P^s;?qʿ@gؙ?ϯkQ^w:_+Q~ͽP>(PQo| ]򾻮Gy*& :r|\v}o^rl+@AP^x)gw(9(_*B}(lw?GP>RjѬo\@^f5+ = 0}3w= {GySc(V@펢 Yx ;{>U+ oZG~0ȏʏݶ'n|G}7E_VPް } Cc ?3(o %m'Ҏ8.y=|A?Oٍy}ɳy7A3@v3=Yސ;_{ ?Qz?_?Gw@iYy1|(Nۅ#(]W/wW|6zI/GF]mOyP~QϺsWP._yע< OCףuWV(|;{/'UQm>RFN=tq$5m/-{HM2OqNH*vie=tX)TIgfW|}~O){yS&wD8>x2إ{ Ⱥ<,o%[0G-K?ɣٴ8_Dэe\ѳ^{b>GS Fay@:CO_wPY'=gp_HGj[tn(;~_jˠ u/YBt~GR#%[ݩGR<OfF?-]B?6.$jgcz JŅipAǎM/i T4?ݢrQto=:#mL-ɴW)>YJe~#}e6ErZAw#;?7&42jiY:\'ylp)Bj}L3+h:zE.ލ!nhPNٛhz4]q[KheZ:ZJz*ţ{ v.;UY2PD!Ĺ%-}%L:zDƙV~Z,zu' U-yth$nON<\Zͩv)ZAJM;ZhItRޑ oj\l5]DWF-OGhe%^/0[ M OQ"-ɠekY1zsm [SuEGͧӉTB4|*Zw2觗鷃iQ ݕHuFz&ϧuh`8=I>w= ]LQm8NGgivt$g,&87f_?ia:E/PGmp>A#Oh?g 鋩tl@W.HS/*V_u!K1@tD*ѸR:L7/%GKZwIwWъpЄ |:9.ʡ_t =UH=F? oO{ЕT;FҘxf?ALHdbo͢<_CӁw":NsgQRq}CgJlKvKBe4g*]g,Ki=󑋻~Jzi(œneIt4|(}x zni?яnӏǭ5=L'M\.M3h(ڥvMݽ]2bX}6}<^Bcϗѩ#}7E/t2\CkϸA_tctoOh0=5zA~JuІ)pHt굊vYJh^*]AKŸҗN\\O睥 /hY_߉űEkh}zV t1]LkWÈ6& \C{ѧ]aH) ?JAn]n>OӸtU:'ߌ8g-}×wݥA._ooЂqFl&;ɝZ(q{;K+_;hE qNvza-[iH8 HGGt$:>}I:ٍ&VwQ%|u+ە.WҜ`jB帶btˋt7iBzstz>^~4k_Oశ |T춒jbdX<9D~I#q4n?C_AXi-:w85yij].~\FלE~yM7t.^re+Ez2P[ߣݾY '|-vb ɦ:*G1ѱ t|0f{P\<'̫̓?Ғt9=tz-ǽtZ<馃v:m6x=Tr詢l. =je^|5]Tķ*^os? t,҃FxF`[!;7t4FO;`83-^x7Q lۡ ,t3^qa } ¦DA,7L ߺhZMUq$}TS?qWu?o\_L7Zت>THenuZzDZFq>7d[L`!j:*&h=G~a%<iWoDO}Qlf>e4)n1>fs2H|^;fض-6nsht%(~I7vrbB%]jzlF{WR]!]^!*c =v16w5G=*\a8b]ܒ@wIxyem5]L?H?BjO7isM;>lIE]IhOItc$Gϗi}:q:J14QOߎp?=O./LΤJzv_h ==fj ϯNMb< qygtQ؛)ChU>.>Ic#%zmZ*W0&0"`7-;EG{mK\mdvz-ȣE1+UN*0Jq-k9%6aʗ.2Z(V^F*΢r=f~vA:w!.O?L7f- HW.pfz(V$*={6z>[iH }r=sa#]~2Au7StM*~WO?нyFXD=BѿZPix4=Jj'Tx=Wbm3Fz/<f=c[ pO3q5̰۽%~u.vjqө&xZln6^ kr1/fGLA_9@OqV:DerF뀍kD5;5-l1R1.tj!{1is_ AGt<e݆dg+z=*+l)a9 4TCzC62Xstj}?]VH0BO|:nC<IFjȤavfjiMlC/^=Tg8}JE>|ks;- w=W '6ءG2}NN=]%޿.;z:N?RQUOrPۃ6,xYN-=hRt#=mèV|փOj=BGҺbΕdTKkУх tG&=km|Yu#ݐ =N4Etw$l7Aˡ[a`-}2*o.-z}Ci ES}$VM1tʼw-vC&腧SB:L2Lȇ9y ty ]IϤתKbg3Efhq4ן#jz)tjC|]f&*Y?N.\2B1(Fjz2ѡTΗ(~UAzOd%Txt*_]Ÿ{ׇr:+feӟ*UMϕPG"zXiTY񛩣KV@e :2ZoݼrTG߮KK\x:L[C{hxϥoUF*+~OKc(ؽeqtV]E?ҕl:~AmT+m175tM1LW@gݐNN P*[UأK}"&T&j*=+No6s,}(|3ʺF_Q.AFF}\_@z%l2߰9  :6A |)&SPɺRA32(B4z KRa1s OVI"$5 Ս.cqtL#ugjhl t8:'fUh~Z[Foѻ~02mo&^Fqq.}z)Aӹ;tu _Rӧ 3Kiuq7]GFZ\J-5ˤE&z16T~H2Fuq ![FSxh]枥{SImۧS\ϗFg*Fj.5G ._;b~iVS[MMaxE ;<$aT+' tK8ao43r?ΈKx1zimp>!ﭴAxϦO)r: ]IW[YK-G:z! u~u_8}b-FS|;Ge4GG vjYH/ttяυ ˴g>}͢OVӸ G]LUTT=NKFcyTWBZU5ah4}89KTW54e}9*]+o\<.\j|Pݢ_{&/yU ZdeUp|]Ӄ9zFU:q|I*hl2oFgD\ifxWEWxHbIR^.WmjWew~M4LMh`]mTć(^fXfTfފ4ShMK5FxKO-}GO߫5q>'ywV;1qt6 wD=*5sZz^=jWҍfe݃RCe Ӣ:/IU5V4T'+·n+;|+[#0k%t@_ˤo/sqlVFe8řZ>AhGkە yωHm47 vf:ha2=eitt2mӧ#;ܟX5e?}@4:.WoT VNqC5cgbhҡM8ZK.z:VxRŕ8z8vQ[lѷ]Bt' ϡ{u􄉞j@颸w$ O-z*O[|ߝ.7o - 7}TКD>JS2C*x]OGi9W b=nFqqXZQ5Sܜ[u t^2͍4-L6*;qQ }[{aZ*Sk{/|NwSd6M:KG7F+ݙIxT:頥&*۹ŶtbBmz) 8^IebGOzsNw?~K9ThZ^E R&ac4N\s}1v62i뵴kSڧaT;$SM~9(K&K6b2љ4F+D? dڜ;zTD ?ѿmJ}kiR*(&PC ͬCл5K@ڳ-Jctr{eh.s*BZ`ǓxA ԐNK\#}(zvDr9N8V']'4їL]MK <*(NH2nQzN/a.v/Xl5A_uw1.HITn_t>Q@')atVXKevEAq?kawV1ԝ1ҡq4ά5xo F̣սsٜ~h?^nI{BQ.Χ^5B_Vz};= e<#+zJ3b3]W>6ۨcij?#t|NM&zH3k)qBZhb{uOY*֚z> ַҗt4KfxCt8tś\|\͉b{7h .p*-lqO?iߨ lqh=M_h}Jnjb3i]tf*|JUxN)a_3EKG;k%vzE [] }\GX}6k:[1tq#,\m667@TgP/O>ۆd:#&R'Jq?a:Sܫl0'itvIA_v堍9_!d`'=/2mvF;}NѯJ/vv:)VJe޴.60FCMu] ZEDѿh/PNXOGѨL:6if8-GTQJiβRc<*nHӋ9(ϔ)z*:=H롟+>M߻? RS(>+ٹ.kˡ)<+U#}'~MiAu"in,]_@ӟ螽\Sx0Btzb=5OA)5V{D*>@WQYzY/o7D~$Jf%)~e *>KCL3hP \ 6 Qû*MRS9bsޓb5:JatΡ2/VBjnmrhTn|Uzabs~&XN-mȧ{o+O{omzmf~ TRXG%mqtO>2F0k2=VLo٠B#= uI'VnhiOmk@ 1~Z**^4U,^,mCd; i>oN)\CefiͤGuTôMRO[PFWeMz>̆[IWJGQ8t'ڧSL˥_$z“'IWMMRz^]SY\qL$_J_2UFrmC{37*hèO8n T(v^E tN ]QJn3=KoC40>[hf,]@ tVnK')jޗJЫyvtD hn"ˠ]N!tO)=᢬rTe֜,U[G9LatM:IMXG3m4{-]?nGЭtxZL Vh껑jwQ!c5t&zMAWЍ薍z~Z*޿Oy 4i/M_C3+$"->n۔ tspt';y +g~+~wsU-yXgG?2TXǨ+LvQ|oώ0sX;SlI gtQ[mt]nxi^ifh:5}HwiᵑFZubQNK`}ޘbmVo3 l4Zz 6v/ZZaM)xw0 Vx/XCWt]C}4N, ˁ"T#q*s(uȤ m-lݷ>L?4]V.9ζQYZqI l@[9=GoXavQx| 2RM-y<@9ίn2*** =UWchYIʤtN+sksaPyC #}_< >6Ѵtl*#j:)i1z%tP3ұitj M);u@s+Dh0*1ˇl4`NRAPJ7,cݕJOBB=th}|JcSTYU&|UV"}OOץҟb_iU$v(i48Fcұ4OKOv#;}q!}=AuO+VfY’X\⾹*X =`M:xKZ1f1?=f'bZo^mb=<+AqJ?5 r] fU{4^yk[aJ ti^0^f:Rz6^Kh R?-& ) mcMWqf[N /D70^M_Szx[Xߪhx>kij4JN4殅T5?ki~{Qr=uoVC@0DGzZeAeZ[DNSi+TSS*7Z7{Ba694ZORLv&视mkw'j. vk7P|v]u:銇GowҾtN4qK)F&h?^d~Z{E^"(.@o/-}4.ɤ9EPS !).e@>[襡}cvʟ~C_8dDm٩lվ5o*CЏ4s=Aհj"tV4C0@jԛim!N7-Cɢ9+mbLǕ׬mwHxW2$z8C+YtF!SAOG*'>Eg۩@w:DUәdߔQOP% Ѩ8T$O<5O trg+5ӥ>"; tNߋi|yICg軁F+iAz-yon2 =1VGӻHڣC<:w }fo7Awz!^L ~.bdد=Z|S̥쥉atv8]PJWl=)p̯ع-ZO'/et^Wќ4~F XJl'hVQbNC iXxRN9gEpE2N^2<-vx+=&"ZgتUj#<5IO؊QfzzJC/๣z裏,B/=B~^\/o2K : /W>zW{Ck=-Tbnbb;Wӄ***ז`Wj^BTOLe7-3.flot`S%`JKo{_it*'|QN/V4$ƍ[hm&tOku_Lej/,H_St?utN УNoi[pw=OͰT;mLER?Gqshv2Je=GfE^պh^UTF v'ފ2NFQWd:4tA2PCYo@!=N[K)Oiil8}UG"*`Okз t*\g| ݙFyҿJz;vH6:їN4h lH3+iV.砲늡_D.v{AߌD$~I_TjO݂3qdnM4&NIWԪ ߯>B'х.i|#-v HH6}">'Sw}^15*z.^u^GՅЬj|"Ӌԡג`GhzV$ͨvo=|8<7ҥ0Kź ŞTKҘ$ME^^8*E R1A{4TsJPSQ*#Z"ثCAǧR|4Uؑ#d*ƯNzēiJ:]Y{'ve'"nL[t'=7:&{;aov]I_XC_t͜B?L?/_PY]qK#;ue{gҀP}>FH`5* zr+7ҝXz0hxzq[#h#YOU4ԝs1{$:&I4*9(~I7DJx0^EkiF5g0:s5[aTqV朠7MOwFoЦoPtX 1iũ TLgUt&~KJ2ӽK *_0U)1K%28F+/'4}>EK-Ufz!S-h:؃G-i AMq񕴪:"SCuy i{w~Vҿ O#.oT/)މ0zgҦ8j+iy=4;XCjiv*It<z8F̚ќJkWޝR"**onbR6?ʺ9Y7i~{Zdۇ=)^Zb9 VtjM* b;I= ]FsSIq7N//}Er5O[FŸS?}#MwCh**e/o],OvVo[0YFQw:1˩W4ѭzM΋nӿJ+=AO7Sb_WM{7ttZIDzّ66Цh7Pac:G #A24 աTSMjZ)SOJhP4<:%4:%% %`)~Ah0""F|99g絮dg{?u]ͦmhJ'zP[ wy3lݚէӠ!B DW{!_t5t;ЭP'虱"ʥ>T+ʢWCd:a-hSEePhO6'cִ6>izSlCLA ٕZFoRYOQqc43]边X=ՓѲz>D:`z:ڤW*tF7|2Aw'BtFd:TI2_lzau7WGzأ}*D}@ޟ=ONY=ܯ=d~ wүTt7[VP[=6Ku?y+C+N!tZ]rbv;F&>a?}n'}'ɡfojzt3 4j;}{ Kˠ_R鱳Z {iBh$:=TֻTۇm4~6=}@3|ߏu+yHqI:m1|N+qиtjOqs:A?9J/?2(rE$zD]·tz3wBN6CɴS /‹^WJ3,ë ̰V]۵БRDЛoUgA*4Q-뫷[;`MPD/iFaw:HeΕvUJPCfx/TERYk;\MEr7pn7GM-|< _9}BMnVEz%F(d"C@H*(qaг~ mN_K o>ns߭3 RG=Bi`:<~Ez#O8>*_RM_h'eOCF*_J}/:/M=MO2'Uh@G8|Z@O{*Z[jth4L ]C3iQ4RY8tΥ`*Y.{;:@&ѡt[Kc폣G2eJmi̧R|ʺmzPMp -33(Be~X}/.4v̴o8]i^N!ӥqӔA?2T7m\(} 7/hNOQV-TD1 ldۈ!yp'9@ #ءw%(8MҶ&Mt!:·:0UtGCzp?-YM/he1 ;6ho$ёtBMHӇQk,뎅2/]iq=;yXh˥b}[3ht*iSt[-k7`FnLjIFq/3]AӟXMΠ/}zLuS3t7Mўh0 jF5 lV}jȥׇQcIW0~f7M?xItEX;}z(=H|hE5674h:}@C ntjr(-NOv }xvךZ:,cח됾nΦj!9Mo$O=M;KwCz&<ngЮF:Ջ.]3C7w5 KR 7L/!bKc/q;;4BZd'Ӳ2z7 xN9{)McrilW7Wиnt0>]ډfk`'YIѧ_=tXҿ(V5oǺ)N;fK{oiCw7I+iR>H?_2蟃nS9~x:֮!n>9m{*4+Lbًʺa?7MN )Cjzl#Ov˜Ut>3/]ߣOyl?{T ?o-npm O6R'oTD(-GQKw4#6x? MS/~o`r@eeWKAb"#bfxVLAV׳^:CoN"1ϡI[5\>纾 :SlZMJ0 CPWsy z cC{++i緫v /6R}l*x^diFڟaV~i[aU+-M5ބ#YC2 db\[:LE[q6:WGmI)G9tޖIuw[(xP9NZ f363=r^F(LhcR·T=\覚-ׯOҏЋ:Ic< NCYmXN3o-l(y)ˡCNZad}řE4VCV8.&`ZMe}5tbE7h>?>I˯tZ+g2v|ھGЂovl'Yx`%6j7 }ݼhCNnV=Z[5R V>2X^_͸B#F ov0ѷ,75vXTo:KGwy\-#5Oiu˟y77:x{9&z :<.Ou~>s>Ak#Fkut >*>Jȟr VT1t.vS^!FUBMjƋܔs JǤЏ-z˹f*ځ.KSLv>Ns+=7ߺ ~YB 5o9Y#􏥣tz-]Is3P[hkzf>]ZLhQw Чy?:l;+'о:*N(C+^΂]PL_NZKl435ӭ1TU=_'Jt3ZB|>(z::ǭQJ'YC-:j *sR]tNV<^Mr%L_[q}\xD-ϵrRo;U)!nۼFR#h5ty =RIZ6U됿F7;@~&2tM]Jo$v-U;4!N-JS UT;3^0m]Juy:^E@DnB?*?Q /zArA|y>J<.PY'QqiMtP ;Yna'itL2@'ҕ7pғ!JEc2i~Zp^Oho }J#G}il(|&M7џqt{5-ivT۩o1 А%z:h<5짓t tf?;hAOL'Wҋ% O}e}6b~QwwKCiX }D'TdUtZ*.wI:}\XD-ŰtH>۝&я#['㷊94[D14`p{}:b%OY ij]IA75[?W?k2G f2ZGEfxONӷjlt WH-0^E3,`"t^u+ߙaB+3svxuVkʵ6xݳVXeF:*ōETL0+EZ VU:@;-auЙkEs9O,#7NgY`[h_#(Uv?!&n rV *'vT-mYS.CSL/гa j버5y47ʺu6]]R`'YN { ۚ14JZH^.n̓YN̢&1qc I/M>P&d;8#xwy6mIG':G}zuf#Jh:i?q|$ڛ³O,z[%~v?ؼxh$srB*M ̣!:ғ!5h&tLFH7=z> hsvi&^.4?[iZCe ŇЧu M#S:=0nŸ>q} c/YO,.c祽̌GZv*m],bθO=i**͟K2G|W)wӂr*E)تY-4=җiD.<ފ9y4LWJDئm*)^N? "рzV9_bFF:A~m'1H'=Jm6]ttISQ֓> h<+빌+:GtN)kQDQtJNsbzVCk}m~n! hxg[,*پY$L{ѰT:HS"4'>)gǢPZ_Y;KqT_u2nK"zv)zVBGm]BxQd:Fܡ t7Y`,=WF/ӛAب;K<3i]O':1ȸti$,QU[3#C#EbZNMK$ZHs& n@MeSEtU8ΤT4=_EΥ5&='~N.>ԯ5 hPN>@s.Gtǭgإx++he5}z眴_yL=<MKЪ,* nU@帲ba8'cw_*u+OKkhuDWgQUKGcPZB˦_xetHt_wj_B/{D櫩Ն.'h|ˏ5VwYszBe:{6/Ҩ:-.rtӇjԞK+,0hޡd:}55ŸItv6"~eV?DO:Pz>PJPMn t#:,Otz/L̠{#ѥB0:1O?OӆiZEO ǹYCD|9𦏃`ɏ<4rNOgUJ73Ӎ!Nt*ZO#zi-TTNݧ>~GOooDMmߤ'/ otu9rnmDO 'E;WW*t%-hz @gMbh2=ܥ=еttXc:f0|&yRYKq^ؗ.C-hf4͛DMǛӧ)b%pjG[<~hԿ? Jbg9nstD:sʺgyn%\ ο>3b:M +Q4!]-ݸnOiFԖ@Hѣ8o\v}do%,}wEV[s&O+ڶ; z>9aҁiteJKd<~)}/~3:e?6 W3taM]{_F-кكJ]R\j9 B5B7aHKR38Hki^vA>O_{M;G'D_KUӏW@ t蚅yt 5㭽i~OjI蟢?6t‡*zb3=;^oI[MiG=:;OXO7ӲޑfX*yvZXfާd=:/+b\]jw# ^J_=j7D~dG1mW5f77b&" =LkL3`LTmAFzFin7ӴԮ,TqP|@U1n>4m+ӍZp|@ yh4;-Dz<횧zҜ/{CU5tCl>vPK:ݑE+4@ۈ~`0EYNO'WH11bőгuC5-:E14&нPL'z%R>ȡr{v~ ,EwC-Tȡ tm 4:ʼg`6IѥvCGj?:D7*(޷B/=e. ͚9^|fll;9١˫8N;y3 sܔC|:5~4NE038fNT8@2Rz?htƸ1)w_7#UHu4>΋kfm8>2. Cg8}D=A>}K[v]}"*;P~C3 JZCoзamhd}UG c=N?+4OGe Qj88[`zeZ 1Dӯts=D+"IۺO!_@e'L7ҳ%c8:[OЯQmO{ji ^JdVGDσhZTVοS|%:Ha-̢2tK\/޿hs4/n,u`;S:]l7)de@r3v>NS# GSw!x*^K ҤPX6tR)Z;wsPIB'lڦ'7oY1~A9t]Jߊ1nK|;2>PC'RyS赖-=VZ_Vo~5w6šx[u6ѿn]a)򺸔yqN0R0nQNvp>tc9Vmt9B+Q"xq \SH;hB:1~ZNMRKyG;]O5UCYUQzVKLL&sU^kOߨ,,9@OT9u^ fzK/fX /Vx[0-*謂+e}:ѱ}T)mE|Cc!s]^[<"7KE?*ƏV-՛*=5?e]i9oz`-=j4-t<=.+UKzZcb, n)8#;t8Tr[H?PY?TL:uVBC;hw1>*$Agg,?nq]? q9N[df|>Sj4YtҝiVGbM˩@;JLؾ^΢/xҏ'FNҩ~[gRh?/:qw(Pm ?O)0PAeTD_3ӨJg 5t*=cWPcmS>@;Aj:l>LGq괹~i/_;Qzc+#~O[G[Ҏi{7NL]BwrY\BzNETC}jڵ;UF1өo8{>|,]4Le?ӅԇVd{'`!TVlvɧ/oqh|6}I*"~BП莡to&=OOARid:f+h#7ʼkjH_z=v=M{{Ӿ{+!Ԡc[c-]0~Ei` iXKuyk#4:^M1i14+\OWl0N˴Z:Vo:J[itl:,֐=+OUʇf̠G Ioq6f{L+/ӡG!9~&Eү|鏧Ze5τGWh0z}7~KgNShJ2]{nM;a8 e1 ر>wOIٌYij>-*=V&Q!أQЮ}i~FhH-4c]C?Awޡ{|!h'$*ֻJFiX'! ҔL=Jl&Lz?|iyr9CU/'; lۚvC6kil': M _ӕitX+zGr zIao. pv:KgLsM蚹47XEKչz(6F^CNпϩ!QOUlzd V2OG%fxʢsfhO05XWx^|L[*xE~:7sb^;fX7CPYDݼo7X-C?sxKknoU`@ T𮏕j th?L3v:soܾ܎~_yl+>74gU4CkUT+> RnCiDWs%?Vk/<R55~tI/tQK4H:NCGX0BQ1RI4љ)t f ]n6UHR迓xQ6iF3PRW -C~l_h dz ԷANPɅtڢBz>~t~,jYb|bZ؞O9;lO:GRK?K}in$6 `{MtEMe!yu)$3rVF4Q9_Nz~>_BEЙQ4%.`[G 3r&]X{;1n=I1]h* UL?+_DP9_^q'Bf[f#7_:?rbUD \8L߯evJd?xʋV`vtN)&q.Rϥ+b =!_ﴜw:q4b"ETVNK :NOPs)l,MM^?-^Aݹq%;q cj MOTltlnC"zTp9TO5s}G!4J쟮N'QyQD 3TW+K'ҳ[SOc9_PRr{zxѵ!05@_2:HߌS|t*#.' Wvy/ ja#ZiX˦K ts -4QY']3Ke h-I`~/$l:IE.N~2Oo9 4W˩!=2'M I17󱰭vi?7GNҏn;0z@.˝B6M**iid~m´d}nݽLsU𨿛"bq PI_,3<d\WAo b\e ^\e3ZX>N;#⫷"zxm*f''񩛝 t)]mE=e bTa<@~j1Ϊ^-~CoYD[` ;aǍk+}w^ rQw<3V:EE-4̴ps^4tПim 7_𑧊;7N:H~SD[f F'"z^19TuV:F7h|>NE/̣=8LP9(alG{a&F*dZ-lX?uV,*٨1)-3Mȡ"wt 5Zxt]1dQ!1¦KxzzSOQ̻Vl&)~jn]Jo:ؼy0}36AM(l XNgRqu.һE`Z>}?"M#>c3 //O8'Bo[aV54j `PBcɦзc:DR-!>)W`+`**b#<[u#5c'6AR8ئڧTku4S<1Sxs$oW⨣5pzjڹ>fK(*Ήr?z.>8 rc8͏G ?NTS"V/\/lWv-1|:/.ٵIT3Im[IC"i?7_/qt^$ t.IOZƛ3vSsiM1 lL,n/NI2t^8Ԫ|]OUWTIw^*MC ϧkw?wiA#khh*ߺCRϪXk~ͣi>~GP-NzBa6%TSP/ԙN))Ջz?8q8͏ aHp*r)>7Eq l)Lzrfd"cOK92^C-tS=W:F0/:"fB!]Cwѳfؾa, !]#Do/= |N1949Zbz5TӻѰg}!F-A]s`zk9TSCsb4ۇ>AiDӚzOvc“}=Ǹ".`G/5mEv1tp82wTwůi*VKߧв^WةqO@e34BMqTRK`֓LKs:qq;*LhT0yiݠOA*i2*KVI:>0-[?)ך} _S<GD=Zcmz#,ɥcQ^̫Pyϭ8F׈碬}7;@3,+޳+!n:B.w[շtV7Z thoџRSRT.HhrL+;B+3\2?@Ύ:*=*=v0ѕ9Fk7s#1>Xu9A/vI}KCz=-tfm۠Gx:HM4zֳR]!r{tM b0妜(lMO1Oti9=i5X}P=utnwҫ6W]giYΦh+M΢WW$DC;Zh]<>o2MfgAoYOEQcV11{qzσޫ aITr@iq>Ո&@5eܮˠt:,z KVAe>:[K]lTC_#4ҩv,c9fi"cYDq]*=^>>tNMj`!tz=Z@˦W#=."}(HrN1/u?**>0VciT [?@*\qZ-4+mdbhKb"OTE7H-u/e{ $yґ6:F|d>TƖ2S2-ΠWMmHڣZ(IhI!=SF@e:>~Gtn]`2hDov iPeԪ;dz87nt=L:} *=*N Jhf9]EwS1`z3R9RJNI8Mѯ"iZ%]k tO=AxAtD_ UuAQQѐ a??=52QQkIFF^HƥɸjD5RBgCJE:))8館HϬ~u>Zk}=9}AΜ3]{d y wԮ}jq۳~kL^kgԞsvF{j{փztqDу<{x>@n{<]kֶvh?~P<1jOM[=DmmZ;krW˗i/ݴAj@ SN]=jF^zO.^!hAHR׃ko~ mWj ~inuk7<NZڃNxm~~1~3:=E{wްL{z=C־k!㵛VH7hMu#k~c ߜv"mZ矪ZO6jޢ-QC9EgoGhH.[kN:9ۚ?O|[wXvk8,Q3:No_=3?EɹN=^q]}@;xgmZS~a kcr?}=R4Tu n/bhFv-zK~}vxߓV_Y{kڏ_H{jvR%k^b7Ѯ}q;~?{3y֣7j@SzkgYEv흆C>w!ҠevQ=_ovRZɼf~~/p;k^{k;~CW'EWkov_?]G ︭[=l!/NWxn}`vڟv.z'vD[S ֺci?h=ive'xjoD{#ˇjo;U[xϖƽztRЃ×k~t3i9Mڛz4t|w~q|^mGMdko>M{,/iW>9Ie k"M\tڏu|IzD˔~%^_q~MK,^'>uftͤ6Gtk>3et-ס-~{krB=zNon֗+lN!`-PvB+S{tMtcvjuAşO.q&}Yi[^lw1s^"t=>q' oϴ6]ҷi?ҭJtI.nl[%oה-~cL??^핿!WԎXKBIwpkޮ1?9G%ivk}19wȏSz;ܮ]ڥ-zkw~Kx>ܫv<)LZCxi`vwuפxYJgtkO¼O_9rjEFj-އ?dڗ:۳qE?|v/qot8__y?)c6Z=kvA V~_!{Lo^H{_tzK;tv0 7i Sk])}߇{4m}q_ZcvLv&j-[o;,ݫom~?~]?nsho/߲J;dvb{ڳj!}k<_~yLҮ^}[:`Zw1k\l>yPڀ+}˵-Ҿ>]3V{lGkOwi]ǓGhONݨ߇}F׎=iU+3mm~͏Fj}tРI#gkOH;}vqU?mt+gd[ uskա8GWo.]?A!_G{cWZxȵcWi?A{ivE?[h^/}]gi=Gծ]}etH:?T;M{Zzk'׺reޠujOlvthѮ Z;Qtm2M{Dm|Z Ӟ-v*=Fh_}{O:"۴'-^:O[wxKmaԥ=Z _M} z|diڛh́ڇ}2?_De z@TkvmYN{{iOZ=g Ԟ7NuK;k W>m:zcRcgXjǬ /՞@݁=zӴ ڴ i[OW'/,nZ(9Z7Y=VhO7ZvD~z/{o*w\Lح=dvډ^:[{fk?IӮ;Ee!Ƣzڴ=v8WO=ewhf+gh]hBm*{j'u[u>8=jgiNU7AѶN9F5C˵ 6kv3w޽^3~K;xL[>[GgWh.~}v֛KkGk^Pk:[}˓;=4m0Yړ:_Y~vVoSs更iܫ}q}[HT?mzk= kۇh'ҞmiQ{UNmb{SWhӵ'5Mۚm-y}Ep;1w~Czo}uH|EڵJGi!}[-?!}|lm~fvh&} >w"]n}ڴn3_(}߯-rܨAtݸv_E~Bm-[/ѩj[_QCyxxði囦+av^tӥf?+SӡEq~ujTi7Nў1L;Eq9ͧ^IkvY-nY;Ev:EiGؠ4i}iE+aZV|~_ێP^k;׭١-^-~__vRNlٮ]HMڣ/^J{¼w䏏v<=ʴOr톑>~KcNڴ?ܤ[[vg3ioXLѺ-ڸK{nK}wE{ ;h=E$K{9Fϓv/Z[&I7|SKlΙ-I7Fگ5H;zک]R{sҽ5H{DW{kV{-ڮy՛w j,~v}x}Zv<#zt[#h=vhϚh˴lҮ[!`OF+#ypxO hqZcJI=]{bgho~q {_gM\̱ڟj}v"{knq)^ώ^fioج]O(Q[ZG88>]G~jiﵴ/^#Կ6}m;G{d7:Lvn>.ݷj3A{`omZ?U||R=eOkZ|. KkkYӵڃkgn0^۹LJm~F>7Qv.~-^x=ks_C?3k#rB픩گQkzۚ^D>6=x:]-z7iݨ]7@[u>5YO-~oMyP{յkO-.oE뵷GWM>EP߫ﴤ8^;PԶT[lxvC-4OjX]=OvxGzQcjzISNѯ`B>"?4_Ƿ&Oiמ-׺e!߳=Zs6=4~v|oОi|hO{Z W?]t>5S)7HEv5wNОqhߠeY~gc=mZ׽4DQh h״ɡc#5D;8mm:RۺB;qy#r1=gjWneRg{=|ve~GG˴Kjoߢ}t)Rev[ڑiz^~{%w['h;mpXtZQ%wܬkY;k9EzcZm|CILvn?i|TtM:>H[Lq;u޷M>wwtg9Oڤ+H_,~_{k7Paҗ~a%k}LJa/N╇yeio!}KI~{^+Gv\~_0=`6馣[?꒾-Wo~S[M+Iڡ[;G,|t--5ZH{{HKԯGs7h߯w}ox^ ҞJ[nyվJaesOx$ًޱI{id6cw,"=OL^ѭ]{ ._ua/;H{5KKh]-6+;vzvY=qv^os~d$m=B/c9=sU~|?0^簋ǶkZjx]Z7I7S;]{0纴 iA~jMڃjyڳzs"->i_+ݫxZ/߯(_nvik-}֓VjOYAN]cWhߠ}]~ڏmӦ]8B{Gh_:`oO;bSieciݰH4 =!}Kjs"]7hGNH{(S7޻Yato:`6X=xyڳhg,._}|nSiBMMO5]m}zq}[6hyuB㴧]vvJi7 w=5[IӵW>O~;=pvX+ެvoWj6D4GӵN[YCzmGWMЮݸB}j?6^{q_lNFaWGJXMh?mi_]zvsd myoH{2k1R;kۋ?ܣkjK7Co&jeړjOA{\v(/v:c*}x=^txSžUk~v~hxi'ߠ>vh٭]sv[˥öhO~P{گ/ѻ,~vyj۩}`=zqj?}kϺA{Hc߿T{*uiӵk^|}ϓZ'k{{ڄک9R{yޜϓuۀ{ϗiߩzMzD:umRA=O=_{ ړ3ܩڕiѮ?EL-ڷۥ'h8EXm@;)o~^mztڻ;:?NҾK{iY='ڎWCs{vZn;'%sW6Q?鯋lw>Wm׹-UI"7Sݻ]~'[_'֧.Y(]Hiٕڵo;-]0Itatҗw-^֏n7cWl?ss ֋{wԮOZN#j|>C7 =]{so>7kI_'vW)Ss[.o>E{ak6G{&폻OԫwG~49u^?fOOўG{cթZ6ڥ&'+khztsfsvTw,>ؒcK?=H{RcҝҎ?ML]Kzʹ3honϛ}Ui6R?o]b[oΟ}ctcZO|v 9޽u5IƋOmKs{Ҧôk_j[%s}k]:O=g6h>OoZwx?ZǍ^Dkj.ݫ=U;x^j[z5EG=iyA:B[T[v&j/]0S{uyWkCOϖ߾OОi~okwڷo7Q{ .~oڇڤ{vv|`>{^=aM{hk/.ut^ tșC'N֞i=M{흫Ook6=C^t6Y>R{8etkGL3^{]Vc?4]L۾R{$Ns7wi>;H[-վevΗ@6qֽ@{('kǷiҭ}|פƮ'iR&'#n^t7=Ձ5;k_XjRiyڸ}zN1;|kOM{ϵ[ڧk_ݢݼvZo6E{ޥ| }yG?Ňj\{q_uKQ?OL~vigtv5WO/:`?wQ;-փ=\k9Qi+oZ=^ueh7mFkim[\Əi9Cz'[C>.yn2c u{nyο٭sΝ3Z[C,_UЪ:M|o!}(퓻>nnػ]sU~+-[]gO"]rvU{yzjäk>ܶsvJ_I7җ[iooӊϻ8p+jn\޶GKˁy=hiv߿WuonilԻyhf5SϟW=UOY>uuo,;UO>UVUY}y+UsVZqQ,UMkVe_ꝗ^=fݿgߧY۬\*ʞF_՟htnoU=Vziu]~ktT|{=+ߍ^WގFo_>T=UW:Ue}.WuM6\V5VeޛnYsU\6TxUU?GjH96V~ߪkӨח]U;]UE_ykt4k=6k=7Q?QeSuUuކF[UemkZ^rOjY|eKS+{ꝏǷ{˞f_߷Yϯw]T]eY[vTFجQ?:Un{ϲ^ʺ4:Ui:lzg[vuwVFuZv4:/UoO[vn/Zl﻽{\T]eCʺm({__zwޚޯzh~^EifkW7U_Zken리{]5z^uUQ{]sZQ~UfYQTu˞~YUv}7{~f>FYk(F^e^m/+UU{z/{:ntWf9wzy>Uo_y.j){;o=oU}~W~fϪkiz_3]յ_ZkT깫ޟ=O͚zjtݗ]߿ӬRu u^Vڮ~6k=7mow7.F糬zѯkֺotlt~k^z,{߿YN=eUZwu[]r_=̟5z>o:m6<6z^'|zo^f]7=eo^U_u>_en{{TwaY<7|4>uRvܿe5l e)s_ކfۿw;v]ry({~Fow}.n5USu=uUGկ^iϫu]vily){?ʮFޟWW4Yޏ=޿F]k~-yUk]USuWW]ez)hUIiy+.Ӳ?{T|FT]eo>eooYeyAרf::w^uUv]U(c{zW~~VU]oeQYW~;Ugu4k=6ksl/CZ{e۬ot]eb>h|7TUCWYQϩˮFc]oe7k}5eCb{]:^緪Ǫnu\<5zʮתMW5zY?׉ި_:^/Pu]FyLKT5)sf(.ײPUDz׌sTJ5Xkc{[h/{;5Quz^uܨg{}^|]UuX>ˮFYu.uڬw7~Wv]U|S?zz;}ޯmt~]?F=Uy=߷mz~eEsШe?)k^UV=)'ӧ~oюtoթ'9u3li_zɧOqv=s7mݖm{w[Y˞1b10f dؗ1cc(c0pɰ6a3=FȈ>#`Č22F+ƿ0d|1aA0F1>hc81ơwN!3r8c (#G3q ㌱O2>8qSqO3gZ>8o '1>hg8y'勌I N_˩/1Nc|13g8-g1aLc85t0f08ML2.`\ȸ-,Ʒea|q1ƥ12qc2.g\Xqja\ZƏ1gߌøSƭ3~XF'.Ɲ_33eǸAC.o3~3IS50ccPa 2ꅡ^ꅡ^ꅡ^μ gކ̸|g>3Ùpq/3a`g3wÙ3a(1b3Ùw`> `. `> `> `. `. `. `. O)4Wk5d0k0k0kp2c96sl0sl0sl0slp}2^\ S'zep2F\ Q(k5ep2&m U(k5ep2F\ Q&k5ep2F\ M*k5ep2>\ S(k5Zep2N\v)u:ep}2>\ W)u:ep2V\ U)5Zep2V\ S)u:ep2N_gt0^\ U,k5zep2N\ [-uep2^\ W+>k5Zep2v\ Y,k5ep2f\ [+ep2f\ Wƍ30g`={ 3pg`:fZffp-384php 3X4hp-3i`I& L40i`E띁M=6 X50j`G|6hbĢK&&M,4hģE&M,84hģC &L2ebĖ-[&Ll21ebĘc 31fbĘ1c&L2ebĚ1c&L31fbĖ5k&L31fbĘ1W&L\x2qeĕ)S&LL21ebĔ)S&L2cbď;&L2cčG&L1cď;&Lܘ11cbĊ+&VLX1bbĊ+&VLX1qbĉ#&FL̘1bċ/&3&VL̘x1bċ/&^Lx1bċ/&VL̘X11cbČ3&^Lw3L2č/&~L1qcČ3&vLܘ11cbĊ;&fL#<60c1c _h&~h|;l; w,Ypg;}ž= {,Yسgabgb/ -B}b?-C}bOoqC,ZX -Zxj«W ^-ZX0ka¬W N-Zpk«S n-ZXjaªU V-ZXjaªU V-ZXjZ^ha¬a v-Zصka®] v-ZصkZ- [~h³g -<[X0ma´g -[pm³g -<[xlZ-\[žha¸q -[0na¸q -[0n¹o -l[Xna¸q -[0na¶u -[ضmaºq -[pn¹q -[pna¸q -[<޷xjbn¼y {{ -[xoa½{¾} -[ط0oa`q oa¼}k{ -[طpo½{ -[po½{6m۸qoƽ{6mlضmcƶm6mlۘmcƸi6mLۘ1nCm۸qmƹm6mlضqmcưs6mۘ1ncƶm6mًmlmcƷo6m=:>=:N=z8péSN=z8péSN=?c}1cǸq>}X1cǸq>}SǸu>}8qǹs>}8qǹsǹs>}8qǹs>}8_}W>}W>}cǺ}>}1cǼy>}1cǼy>}1cǼw>}XqcǾ{>}1cgqǻ>}1s ǻw>}1cǸq>}XcǺu>}x1cǼy>}XcǺu>}1cǼm>}lcǶm>}lcǶm>}1cǸq>}L1cǶm>}lcǶi>}yLcǸo>}lǹq>}\8qǵs>}lcDzk>}L1cǴg;Οz`:tL:q0`:`8s~ 7o5k^x 5kVx 5i>x p4iN8 p4iN8 p`4h> p3i6l `3f6l 2g{r`4hπ8hk `+V[l `+V[lgc 0`,X[X +WW8 +WW8 `+Q?  0`(PSx 0)SO, 0`*TCL<x O< *UW\ p*x;zOW!B\ q*TS!B0a!Bx 0a!C8 qυX υs!\>2g!6Cl b3f!C  1b0`!C  1b0`!C  1b0`!C  1b0`u# Fa/b# F0a0bO",FXa1b#Fxp1b#,FXa1aÈ/eLj=/b`DǬ{`F{_F{W# F0a0`{#,F0a/^# F0a0`"E/_{"E؋a/^/_"E؋0a/`"E2e"EX0a-\o"Ex-[o"Ey"E0ww"Ex/]w"Ep.]w"lD؈a#FVľgE]{Va&J;v"D0a&L3f"D0a&L'N"D8p$I#F1c$F+1Vb1c#D+16bX1c$H#1Fb1c$H1>b|"E'1>b|scc؈1#G1Z̾m1{[m1{[m1{[m1{[c31fbĸ&L31fbXc'L̾c&L31fbĘٳbĸq&M71nbĸq&M71nbĸq&M71nbx'fٿb}+PC1b؉c'N31fbĘ1c&L#1Fb1c$H#1Fb'X7M1{S'I1{T7M1{S7M1{R̞'I1{R̞c*TW1b\Xc+TS1bLŘ1c*TS1bLŘهb}(W_1b|+f1c,X+jwg %Jp`,X[ %J+W_ |%J+Wޓ`+V[ l%J`+VW L%JpC|%J$9 %K0`,W_ |%J+W_ |%J;X},aK},aK},aK01a <&K1c W  &xLp`2b ,&XL`1b L&L`1b ,&XL`1b ,&XL`1bcʄǔ {[ .\&Lp1c>%L2e &l&c Y^%8Mp4i >|&xM4i ^&8Mp4i ^&8Mp4i !C&xM5k d>O& {d^G& 'N8q '8Np8q '8Np8q '8Np8q '8Npb71)S,N8q){d)S,XNq9q)S,XNW)SLN1b:o)vS XN7M7m)SM#S N1b8p)S Mb9r)~SM7o)nSܦ8Nq6m~b7s甽4p)S N1b8o)vS,M7q)vSXNb8n)~SM5k)6SlLb2d){d^b2h)ESMb4j)S8Lq0a)S&M W~2des[)c2 [\ _2|e+W _2\e8p+W _2|e*U W2\e0a*T S2-T c2leʰa+VǬ2|ees\>es\>/_ 2 f0/_ 2e/_+Z֊VbkXkX+Z1֊Vܵoxk[+Z֊VVܵ{k\+Z1~~~֊Vk_+Z׊Vk]+{Z+ZZZ׊Vb{k^+[׊Vb{k^+Zq׊VVbXl_+[1~֊VV,b=ﺎk؞ۢ);:HJ78p,`N~О&]&_%5ܣO<>y|'O.\>Y|d'O,>Y|dgO{SǞl>|d'O&L>9}2d'O&>}rϧ=u'O>>}ݓ'O|ޓ'O6>|2'Ol>|r'O.\>|'O.\>|rԽ=|'O{2d'ON>}2d'OV>}2d'O>|>|'O>|>|'O.\>9|㋿/^{݋o/^yq͋7/n^ܼyqK^ҫ^yqӋO/~^xzϋO/^yb΋G/v^ y1b͋C/~^yqы?/zbƋ/6^lxbċ#/6^lxqŋ/^^|xNj/>^\ybe/_6Ϳle/_6Ϳle/_v-l7/{~˞_=e/{~˞_=le/~iKs^v]ݳ]{^yk[s6Ϳmmok[smo3f;oy[wޚ֞u9oyk[{ޚ֞ư73of޼y˛73of̼Yyyf̛7+ov켙y3f̛漙y֠7;ofysɛ7'oN>G}z̼y3f̛ח޼?oy[wz֛sԛ7colzfқ7[oZ224Ѩ!,,,,,,,,,,nQWFuftsz3ڨ7ktcnQgFFFFFM5ekԘQ[FFFFFeFeFFFFFFFFNxxxxxxxxxxxfҚIg&xx88xxeқIo&tfrMZ3iFh{{{{~M5888888q88q8888ioҾI&||4nbqbqrM788181819198888888887q87q8u?{yyun333333w3w3w3w3w3w3w3w3w3w3w3w3w3wFF μͼͼͼͼͼ͌͌͌͌͌͌͌͜͜Z7s6s65566s6s6435435444444444354354444443543544333333s3s3s4s43\4kڬi͚6kӬo\\:75%gff9njfmfmfmfmfmfmfmfmfmfmfmfmlllּYffff ۇ}0a܇s>}0aڇ{>}xaǍqc~ЇC>|}pG>χCv> }χ?~>|LJ>>||tK=aʇ+V>|Xaȇ3f>|XhG>Ѥ&}4ЇC> }0aЇC~>|a·7> }aG>ZaG>aԇK> }0aЇS>,}Xa҇K>,}Xa҇K>,}Xa҇K>,}XaG>:aЇC> }0aЇC> }܊>>}|&Ӈ[>L}0aԇS>|a·/ _ |2ek_n/_l|e/_,|u?_W՟|9_f|YWg|y˗//_^|yeʗ//_^|y˗//_^/ž>}}W՟|:ա/K_,}Yeҗ/K_,}Yeҗ/K_~|ϗ/?_~|ϗ}ա/O_}9k_޿k_{οvk_;οvmk_W':mk_[ֿmk_׮}mk_׶mmk_jצ6mu _]¢,z, , ,zb/L,L,L,L,,,,,,<,,<,,,,,,,,,nm0000000YXtdѓM66666666..YgџEYgџEwYtgffffffffffffffffaeagagafaeњE{Y4gќEkYgўEkYfњE ZfњE{Y4gaoaoaoanњEsY4gaqaqaqaqaqaqaqaqaqaqaqaqќEsY\\\\\\\\\\\\\\\\gўE-Z8]8]8]8]\]X]]8]8]eљ0wn[x\\\X]\\\1cs?~ cޏ{?~cޏ{?~cޏ{?~ߏ?~1ӧ?:өNXc?,tS?ԏ?&,c?7>7.7.7N7N7>7>7>7>7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.777>7>7.7.7.7.7&767&767.7.7&767&767&767&767&7&77.77.7&7&7&7&7&7&7&7&7&7&7&7&7&7&7&7&7777777777777776ܴsMK7wM#vvvvvvvvvvvvvfvyYٙٙ5m״ݝ33k?jdddccee׳]vVvfv^v^v^v^v^v^v^v^v^v^v^v^v^v^v^v^vFvVvfvvv^v^v^v^v^v^v^v^v^v^vMYٹٹٙٙٙٙٙٙٙٙٙٙٙٙٙٙٙٙyyym׶]v}ٙٙٵm׶]vvvvvvvvvvvvvvvvvvvvvnv-ۙٙ5lװ]v kױ]v5ljjjjjwzٮgzٮg\\thӡK.tҡK.t-]:t``````ЧC7QЫC66&&&&&&&&&&&&66:ܚv0x0x0x0x0x0x0x0x0xwpxwpx0x0x0x0x0xw0w0wvvvpvvpvv0v0v0wpvpwvuuhӡMcc[[kk_g_gcccc>tvvuupupupupupuաW^>||||||||ٟ͟wٟ{ϽikL1^?.??&?.?.c?&?.?6c?&c?&c?&cz11'y'}}O;~'魯'|{}O'O̟?Q'Ox?~'Oܟ?~'Ox?~b'Ox?~'O?1~b'O|>|'=iIkOx?q~'O8?q~'OX?~b'O̟?q~'Ox?q~'=iIsO?IoOހ7'O?b 8ړ֞'{p'{p'o[p';p';p'=iIsO{. '=yNކm8yNކ᤹'oɛp& 'oɛp& 'o?&GM 7!&ބxoA- !&ރxBM 7!&ބ[x oCm 7!&ބxoBM 7!&ބxoBM 7!&ބ@..FV6A=X  އxA=888711111111110022111`0`0/0`/`/`/`/`/`/`/`/`/`/@k 8 8 8 8 8 8 8 8 6`1`1`0`0`2`2`1`1/0`2`201`1`101/111`1`1`1`1`1`1`0`0`2`2`0`01000000`0`1`0`1//1100000`0`01ŀŀŀŀŀŀŀŀŀŀŀŀŀgǀǀǀǀ@} X X X X Crw?83wՙ3Sg,Y:tfҙ3Kg,9:tә3Kg,:3tfЙ3Cg :3tљ3Ggvά9tf̙3Kgv9sf笁g C>C>Cm?C>ԐPCB?CBB?Cm?d ԐP;B?!!]C` ݃{0tjPA!/!/!/!/!+!3:jPA!?!?!?!?{0d(d(d(d(d(&%/ 5(d(d(d(d(d(d(ԠPBBBBBB y y 9 9 y y y y y y 9 9 9 9 9 y 9      'ԞP{B 'ԞP{B 'ԞPsB 5(ԠP{B 'd0d0d0d0d/d/d1d1d0d0d0d/d/d1d1d/0//1d0d0d0d0d0d0d0ԞP{B Y Y Y Y Y ݂LLLLLLL<c>c^c^cNcNcNcNcNcNc݌YYYYYYYYYY53X3cncncncncncncncncncncncncfcvcfcvc͌2͘ߘߘnnn1111111eb8f7f6f6f5f5f5f5f4f4f4f4f2f2f2f2f2f2f2f2f2f2f2f2Xc6c6c6c6c6c6c.c.c.c=ٌٌٌٌٌٌٌٌٌٌ1XcNcNcNcNcNcNcFcFc^cNcNcNcNc>c>c^c^c>c>c>c>c.c.cNcNc>c>c>c>c>c>c.c.c.c.c.c.c.c.c.c.c.c.cc6c6c&c&c=51XcFcFcFcFcFcFcFcFcFcF'a4ʄӄӄӄӄ̈́Մ$\\kkkkkkkkjljlhjhjiiiiiihjhjiieeccggcecececedddddddd____]]aa__________^`^`&&&&&&&&&&&%%%%ڙf^&z0eddbb n&f   F&,&,&,&,&,&,&,&,&,&,&,&,&,&,&,&,&,&,&,&,&,&,&,&&<&&<&,&,&,&,&,&,&,&,& & & & & &Zhebbbb``ddbbbbbbV&L& & &%%,&,&z00000000000000000000000?)))))))))))))))))))){))))frr򘲘rr22rre)k){.̥ ܥ|̥̥ڗ򖲖2j\oΥ:2222222222aܥܥza<<ܥܥ̥||Zj]YYYYYYYYYYYYYYYYYYYYYYYY}ڗj_Zs)g)g)c)c)c)c)c)c)c)c)c)c)c)c)c)c)c)c)W)Wqqqqqqq222222222222222222222222}˸ʸʸʸʸʸʸʸʸʸܡ;4ӻL222222mt-ӵL2222wfܙ;3ӹL2}-0ӼÌnjŌŌŌŌŌŌŌŌŌŌÌnjÌnjŌŌŌŌŌŌŌŌŌŌŌÌɌÌÌÌ͌ŌŌŌŌŌɌɌŌŌŌŌŌŌŌŌŌŌŌŌŌŌŌŌŌŌŌŌŌÌnjÌnjŌŌŌŌÌÌÌÌÌL3=0L3=̘X0L3=xxxxxxxxxxxxxxxxxx888841L 3-̴155c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4L3xx ^/^xz V/ f/^xz ^/^xz V/^tf/^0{a f/^Xzamzq^ܦE/x /_8p| ~/<_xp|/^0{ F/l^ؼsab{Ş/v}-_tb{Ş/6{ً^lbF/yˋ}^lbۼ&/6yɋ-^lbۼ&/6yɋM^lb&/6yɋv\lb-6/yѐ\4b;N/vzӋ^lbES.rq]tbf/6{׋^bf/6{ً^lbfMfsm6fsm6fs{˹vlnmn6lnmnvmnvmnvmnvm3䶛pnononvqnonononZkQEZkQn׹]zH~zI^GvZkGv云~nn云Fn云Fn云Fn云Fn云FN:333333D9[9[9[9[9[9[VZkE9c9_9_9_9_\r yyyy99˹˹yyyy99˹˹yyyyu g,g,g,g,g,g,g,g+g+g-g-g,g,g,+,+g+g+-g-g,g,+,+,g,g  `````````````````ЅB ](tpn]W (tpnB/ (r;`pVpW  &  WUU**c{````pwV wW*4дUpWpWh[^^^^^^^^^^^^^^^^^^^^^^^^^^\\``^^m  Wh_ada_a`````````^\bb^bb`X\^\^\\[][]:\yvە+oWޮ]2w/_9rvٕ+gWή]9rvٕ+gW-jUˮZvղ+{W]ٻjUˮZv+W,^xղ+W^yxe+W,^Yxeו+sWƮ|]yvٕ+gWή]uە+gWήl]ٺueU׮vչ+kW֮\]yuekWƮvն]5qWjUۮvߕ]jڕ+Wrxߕ+wW\^xe+W ^2xո]5+W&^yxe+W.<^92ye+W,^Yxe+W]rw+W]wԕ+WW\]y2ueU:wؕ+SWL]te]W 2ueԕ]5͕n JvJvJvJvJvJvJvJnJnJJ*)KJJJJJJJJJJ~J~J~J~J~J~JnJnJJJ~J~J~J~J~J~J~J~J~J~J~J~JvJJvJJ~J~J~J~J~J~J~J~J +5԰RJ +5԰RJ**************Y*Y**9+*9+*5԰RJJJJJJJJJJ-+5ԲRJ]+++++++++y+y+++++++++++y+y+++5dddd’RJJJJJJJJJJJJJJJJJJJJJJJJJ+dddԸRJ+5ԸRJ+5ԶÒÒ˒˒RJ +uԥRJ]**+&t؍c7n|1ucٍ[7׍_7n|uc֍_7u׍_7n1vc؍c7n1vc׍_7n1vc؍c7n1vӨFXvcڍk7nXvcڍk7nX1vc؍S7nxuӍO7nnlظqMn|4I7Miҍ/7^nxrˍ/7^nqӨFt[7m1scE7-iMnT1PP1PPQQPPqPqPqQqQPPPPPPPPP1QP1QP1QP1QP1QP1QPPPPPPPPPPPPP1QP1QPPPPPPqPqPqPqP1PP1PPqPqPqPqPqPqPqPqPqPqPqPqPqPqPiN9TLTLTLTLTLTLTSiN9TTTTTTTTTT\T\T\T\TLTLTLTLTLT:SqQqQL3TTTlTRJ+TRiK)TRJ+CCrU,U,U,UTUTU U U U URiHKKKKKKKKKKKKKKHJLNKKKKJLJLKKKKKKIKIKJJH)33TRiKNNNNNNƫxQ;bbҡJ*י{rUJ*ݪ|Ϊ|үJ* 0ff kFkFkFkFkFkFkFkFkFk6k6k6k6k6k6k6k6k6k6k6k6k6k6k6k6k6k6k6k6k6k6k6k6k6k6k6k٬٬yy5֨ɚ͚ɚ͚ǚZj.k.k.k.k.k.k.k.k.k.k.k.k.k.k.kuv:VYYYYYYYYYYYYYYYYk]u55555555ZWk]uZWk]pppppppppppppoqnqqoqpppppoqoqpppppy555555555555555555555555555555555555555555555000000000hj 6666Qkkkkkkkk66666666666l6l666666666|6|6nɆцццццццццццццццˆˆˆˆˆˆˆF/666&&FF66.>llllllllxmxmܔv66666666666666666666666zikkkkkkkkkkkkjjjjjjjjjjjjjjhhlljjjjjjjjjjjjjjjiff^bfffecfdd__[[[[n65555555555555555555555hf__f6ٰذذذhfcccc#B<<,L,L<<<<<<<<<<<;>;.;.;.;.;.;.;.;.;.;.;.;.;.;.;촳ccЎՎюююN3;X4}۹o;mggvZii۝vZ1qq1111111111111111111111111111qq1qq1ޱݱݱޱ1111111111qq111iyyyyyyyyuutvuutvuuuuuuםvqqqqqqqqioxvvzzg<#ϝ;wly|;w|0` >{`m|p7~pw={p݃k={׃_|=z׃_|=z`iL=z0`Cе={0`Cе=tg={C>8|p݃w:б{={`ۃo=x{ۃo|=z׃_|=ze={0`փk={0`؃c={0`؃c={0`؃c={0`؃c={0`؃c={0`y{0=4ۃo=x{{{p݃w={0`ڃ{=x{SVUaDOO9}"#AQo}Jk;/_|/__Wp\gY|օgYpgYpgYpgYh[h\h[h\|o[5`-X BBス`. BBB߂`/.X `0 `/ `/- BBB<c,b0<c<c<c<c<g|g|h0h0kkkooonl0l0nl0nl0_wapqq_< 7h<c<c<c<c<w]p\ep\c<c``````pip*S?ir&h2&h2&c<&cЧ%h&er&er\&er\&er\&c|&ez%cX2%_Y%cX2%cX2%cX2%cX2%cX2|%_W|%_W|%_W|%_W|%_W|%_W|%_W|%_WL%[Ur\%WUr\%WT2L&&WUr\&&&_W|%[X%WU<%GQ2,%GSڗڗڗڗڗڗڗڗڗڗڗڗ%{^%s`2%{^%{^%{^%{^%{^%{^%s`2%s\2,&^%{^%{\2%s\2%s?\1WgYqVg[ibiaiaW{^W{^yxW[Vw\W{]qWw]qWw\1Ws_Wx-^x-^x-^X-fbx-^x-^x-^x-Vb-^x-^x-^8-nx-^x-Nⶸ-^K ⵴-^-^K-vb-vb-vb-v,6x,8,8,8,8,8,8,8,8,8,x,8,8,8,8,KKx,x,G\~55ݪg|6g\6is|6g|6g|6g{a|.>6e,6bsך<6c6Z֬5kZ֬5kZ֬5kVl5[Vl5WWs|5[Vl5[Vl5[UsZl5[UsL5gWl5[VL4Bl4Bl4C<4C3,4EL4C<4C<݌VlbZ[Z[f^Z:L5SX3l5[Vl5[V3|5_Us\5WUs\5WUs\5WUs\5WUs\5WUs\5WRl5SWs\5WUs\5WUs\5WUs\5WUs\5WUs\5WUs\5W&3\ Wp5\ Wp5\ S4l S4< O4< O4< Oe4<[sooooFFloFamXֆm8GFFFapappGFFFar&ar&ar&ar&ar&Gr.rxs.r4o4o4o4o4onnoo4o4o4o4o4o4onno{yazXayxyxyxyxayXazxzyxyxyxzrazazazayXxxy8ayXayXaxayXayXayXayXYeyY^xy^y9^y5ry^yy^yy^ezY^/^ey^yy^x9^ey^ewY^ezY^eyݲ]ee{^e{^{^e{^fev]fev]fev]^eu]^euY]VeuY]VeuY]Veu]FevY]VeuY]VeuY]Veuxxxxy]nx]vew]~w]~v9^w]~w]~w]~v]new]vew]vew]vew]vew]vew]vew]vew]vew]vev]^s\>es\.q\>eqY\eqY\c<c<8<c<sqxqx1x,8cX<cx;c;;;;8;;;c;======OSOSOSOSOSOSOS<.8=><>OScx=N8=Nc=Fc=6c=Fc<c=.<.<.<.<.<]=6c<6c=Fc<c<c;;c<c<stt<&c4t<>=8|>q8|>c8|>M|zcx|<>6cX{=cc1z|=[qz\=Wqxz<=_cz\=WqzL=ӦM?gO?,<c1x <Ϯ]?[lgޟ?;vӢEO=-zZ8x<cx,<xx<<c8x<q8x<=ܓx >tөO>}xxO#> 0 ) from[ ii_match[1:3], ] lapply( ii[ ii_match[1:3] ], function(x) to[x,] ) included <- to[ unlist( ii ), ] dim( included ) interval_intersection( included, interval_complement( from ) ) } intervals/man/Intervals_virtual_or_numeric-class.Rd0000644000176200001440000000122413642043061022363 0ustar liggesusers\name{Intervals_virtual_or_numeric-class} \docType{class} \alias{Intervals_virtual_or_numeric-class} \title{Class "Intervals_virtual_or_numeric"} \description{ A class union combining \code{"\linkS4class{Intervals_virtual}"} and \code{"\linkS4class{numeric}"}. Used by, e.g., \code{\link{distance_to_nearest}} and \code{\link{which_nearest}}. } \section{Methods}{ \describe{ \item{distance_to_nearest}{\code{signature(from = "Intervals_virtual_or_numeric", to = "Intervals_virtual_or_numeric")}} \item{interval_overlap}{\code{signature(from = "Intervals_virtual_or_numeric", to = "Intervals_virtual_or_numeric")}} } } \keyword{classes}intervals/man/expand-methods.Rd0000644000176200001440000000554013642043061016246 0ustar liggesusers\name{expand} \alias{expand} \alias{expand,Intervals_virtual-method} \alias{contract} \alias{contract,Intervals_virtual-method} \title{Expand or contract intervals} \description{ It is often useful to shrink or grow each interval in a set of intervals: to smooth over small, uninteresting gaps, or to address possible imprecision resulting from floating point arithmetic. The \code{expand} and \code{contract} methods implement this, using either absolute or relative difference. } \usage{ \S4method{expand}{Intervals_virtual}(x, delta = 0, type = c("absolute", "relative")) \S4method{contract}{Intervals_virtual}(x, delta = 0, type = c("absolute", "relative")) } \arguments{ \item{x}{ An \code{"Intervals"} or \code{"Intervals_full"} object.} \item{delta}{ A non-negative adjustement value. A vector is permitted, and its entries will be recycled if necessary. } \item{type}{ Should adjustment be based on relative or absolute difference. When \code{type == "relative"} intervals are expanded/contracted to include/exclude points for which a relative difference with respect to the nominal value is less than or equal to \code{delta}. (See the note below.) When \code{type == "absolute"}, absolute rather than relative difference is used, i.e., all intervals are expanded or contracted by the same amount. } } \value{ A single object of appropriate class, with endpoint positions adjusted as requested. Expansion returns an object with the same dimension as \code{x}; contraction may lead to the elimination of now-empty rows. } \note{ Here, the relative difference between \emph{x} and \emph{y} is |\emph{x} - \emph{y}|/max(|\emph{x}|, |\emph{y}|). } \examples{ # Using adjustment to remove small gaps x <- Intervals( c(1,10,100,8,50,200), type = "Z" ) close_intervals( contract( reduce( expand(x, 1) ), 1 ) ) # Finding points for which, as a result of possible floating point # error, intersection may be ambiguous. Whether y1 intersects y2[2,] # depends on precision. delta <- .Machine$double.eps^0.5 y1 <- Intervals( c( .5, 1 - delta / 2 ) ) y2 <- Intervals( c( .25, 1, .75, 2 ) ) # Nominal interval_intersection( y1, y2 ) # Inner limit inner <- interval_intersection( contract( y1, delta, "relative" ), contract( y2, delta, "relative" ) ) # Outer limit outer <- interval_intersection( expand( y1, delta, "relative" ), expand( y2, delta, "relative" ) ) # The ambiguous set, corresponding to points which may or may not be in # the intersection -- depending on numerical values for endpoints # which are, with respect to relative difference, indistinguishable from # the nominal values. interval_difference( outer, inner ) }intervals/man/close_intervals-methods.Rd0000644000176200001440000000456313642043061020167 0ustar liggesusers\name{close_intervals} \alias{close_intervals} \alias{close_intervals,Intervals_virtual-method} \alias{open_intervals} \alias{open_intervals,Intervals_virtual-method} \alias{adjust_closure} \alias{adjust_closure,Intervals-method} \alias{adjust_closure,Intervals_full-method} \title{Re-represent integer intervals with open or closed endpoints} \description{ Given an integer interval matrix, adjust endpoints so that all intervals have the requested closure status. } \usage{ \S4method{close_intervals}{Intervals_virtual}(x) \S4method{open_intervals}{Intervals_virtual}(x) \S4method{adjust_closure}{Intervals}(x, close_left = TRUE, close_right = TRUE) \S4method{adjust_closure}{Intervals_full}(x, close_left = TRUE, close_right = TRUE) } \arguments{ \item{x}{ An object of appropriate class, and for which \code{x@type == "Z"}. If \code{x@type == "R"}, an error is generated. } \item{close_left}{ Should the left endpoints be closed or open? } \item{close_right}{ Should the right endpoints be closed or open? } } \value{ An object of the same class as \code{x}, with endpoints adjusted as necessary and all \code{closed(x)} set to either \code{TRUE} or \code{FALSE}, as appropriate. } \note{ The \code{close_intervals} and \code{open_intervals} are for convenience, and just call \code{adjust_closure} with the approriate arguments. The \code{x} object may contain empty intervals, with at least one open endpoint, and still be valid. (Intervals are invalid if their second endpoint is less than their first.) The \code{close_intervals} method would, in such cases, create an invalid result; to prevent this, empty intervals are detected and removed, with a warning. This package does not make a distinction between closed and open infinite endpoints: an interval with an infinite endpoint extends to (plus or minus) infinity regardless of the closure state. For example, \code{\link{distance_to_nearest}} will return a \code{0} when \code{Inf} is compared to both \code{"[0, Inf)"} and \code{"[0, Inf]"}. } \examples{ x <- Intervals( c( 1, 5, 10, 1, 6, 20 ), closed = c( TRUE, FALSE ), type = "Z" ) # Empties are dropped close_intervals(x) adjust_closure(x, FALSE, TRUE) # Intervals_full y <- as( x, "Intervals_full" ) closed(y)[1,2] <- TRUE open_intervals(y) }intervals/man/empty-methods.Rd0000644000176200001440000000324613642043061016126 0ustar liggesusers\name{empty} \alias{empty} \alias{empty,Intervals-method} \alias{empty,Intervals_full-method} \title{Identify empty interval rows} \description{ A valid interval matrix may contain empty intervals: those with common endpoints, at least one of which is open. The \code{empty} method identifies these rows. } \usage{ \S4method{empty}{Intervals}(x) \S4method{empty}{Intervals_full}(x) } \arguments{ \item{x}{An \code{"Intervals"} or \code{"Intervals_full"} object.} } \details{ Intervals are deemed to be empty when their endpoints are equal and not both closed, or for \code{type == "Z"}, when their endpoints differ by 1 and both are open. The matrices \code{x} and \code{x[!empty(x),]} represent the same subset of the integers or the real line. } \value{ A boolean vector with length equal to \code{nrow(x)}. } \section{Warning}{ Exact equality (\code{==}) comparisons are used by \code{empty}. See the package vignette for a discussion of equality and floating point numbers. } \note{ Note that intervals of size 0 may not be empty over the reals, and intervals whose second endpoint is strictly greater than the first \emph{may} be empty over the integers, if both endpoints are open. } \seealso{ See \code{\link{size}} to compute the size of each interval in an object. } \examples{ z1 <- Intervals( cbind( 1, 1:3 ), type = "Z" ) z2 <- z1; closed(z2)[1] <- FALSE z3 <- z1; closed(z3) <- FALSE empty(z1) empty(z2) empty(z3) r1 <- z1; type(r1) <- "R" r2 <- z2; type(r2) <- "R" r3 <- z3; type(r3) <- "R" empty(r1) empty(r2) empty(r3) s1 <- Intervals_full( matrix( 1, 3, 2 ), type = "Z" ) closed(s1)[2,2] <- FALSE closed(s1)[3,] <- FALSE empty(s1) } intervals/man/reduce-methods.Rd0000644000176200001440000000234513642043061016236 0ustar liggesusers\name{reduce} \alias{reduce} \alias{reduce,Intervals_virtual-method} \title{Compactly re-represent the points in a set of intervals} \description{ In general, \code{"\linkS4class{Intervals}"} and \code{"\linkS4class{Intervals_full}"} objects may be redundant, the intervals they contain may be in arbitrary order, and they may contain non-informative intervals for which one or both endpoints are \code{NA}. The \code{reduce} function re-represents the underlying subsets of the integers or the real line in the unique, minimal form, removing intervals with \code{NA} endpoints (with warning). } \usage{ \S4method{reduce}{Intervals_virtual}( x, check_valid = TRUE ) } \arguments{ \item{x}{ An \code{"Intervals"} or \code{"Intervals_full"} object.} \item{check_valid}{ Should \code{\link{validObject}} be called before passing to compiled code? Also see \code{\link{interval_overlap}}. } } \value{ A single object of appropriate class, compactly representing the union of all intervals in \code{x}. All intervals in \code{reduce(x)} have numeric (i.e., not \code{NA}) endpoints. } \seealso{ See \code{\link{interval_union}}, which is really just concatenates its arguments and then calls \code{reduce}. }intervals/man/clusters-methods.Rd0000644000176200001440000000574513642043061016642 0ustar liggesusers\name{clusters} \alias{clusters} \alias{clusters,numeric-method} \alias{clusters,Intervals_virtual-method} \title{Identify clusters in a collection of positions or intervals} \description{ This function uses tools in the \pkg{intervals} package to quickly identify clusters -- contiguous collections of positions or intervals which are separated by no more than a given distance from their neighbors to either side. } \usage{ \S4method{clusters}{numeric}(x, w, which = FALSE, check_valid = TRUE) \S4method{clusters}{Intervals_virtual}(x, w, which = FALSE, check_valid = TRUE) } \arguments{ \item{x}{An appropriate object.} \item{w}{ Maximum permitted distance between a cluster member and its neighbors to either side. } \item{which}{ Should indices into the \code{x} object be returned instead of actual subsets? } \item{check_valid}{ Should \code{\link{validObject}} be called before passing to compiled code? Also see \code{\link{interval_overlap}} and \code{\link{reduce}}. } } \details{ A cluster is defined to be a maximal collection, with at least two members, of components of \code{x} which are separated by no more than \code{w}. Note that when \code{x} represents intervals, an interval must actually \emph{contain a point} at distance \code{w} or less from a neighboring interval to be assigned to the same cluster. If the ends of both intervals in question are open and exactly at distance \code{w}, they will not be deemed to be cluster co-members. See the example below. } \note{ Implementation is by a call to \code{\link{reduce}} followed by a call to \code{\link{interval_overlap}}. The \code{clusters} methods are included to illustrate the utility of the core functions in the \pkg{intervals} package, although they are also useful in their own right. } \value{ A list whose components are the clusters. Each component is thus a subset of \code{x}, or, if \code{which == TRUE}, a vector of indices into the \code{x} object. (The indices correspond to row numbers when \code{x} is of class \code{"Intervals_virtual"}.) } \examples{ # Numeric method w <- 20 x <- sample( 1000, 100 ) c1 <- clusters( x, w ) # Check results sapply( c1, function( x ) all( diff(x) <= w ) ) d1 <- diff( sort(x) ) all.equal( as.numeric( d1[ d1 <= w ] ), unlist( sapply( c1, diff ) ) ) # Intervals method, starting with a reduced object so we know that all # intervals are disjoint and sorted. B <- 100 left <- runif( B, 0, 1e4 ) right <- left + rexp( B, rate = 1/10 ) y <- reduce( Intervals( cbind( left, right ) ) ) gaps <- function(x) x[-1,1] - x[-nrow(x),2] hist( gaps(y), breaks = 30 ) w <- 200 c2 <- clusters( y, w ) head( c2 ) sapply( c2, function(x) all( gaps(x) <= w ) ) # Clusters and open end points. See "Details". z <- Intervals( matrix( 1:4, 2, 2, byrow = TRUE ), closed = c( TRUE, FALSE ) ) z clusters( z, 1 ) closed(z)[1] <- FALSE z clusters( z, 1 ) }intervals/man/interval_complement-methods.Rd0000644000176200001440000000203413642043061021031 0ustar liggesusers\name{interval_complement} \alias{interval_complement} \alias{interval_complement,Intervals_virtual-method} \title{Compute the complement of a set of intervals} \description{ Compute the complement of a set of intervals. } \usage{ \S4method{interval_complement}{Intervals_virtual}(x, check_valid = TRUE) } \arguments{ \item{x}{An \code{"Intervals"} or \code{"Intervals_full"} object.} \item{check_valid}{ Should \code{\link{validObject}} be called before passing to compiled code? Also see \code{\link{interval_overlap}}. } } \value{ An object of the same class as \code{x}, compactly representing the complement of the intervals described in \code{x}. } \note{ For objects of class \code{"Intervals"}, closure on \code{-Inf} or \code{Inf} endpoints is set to match that of all the intervals with finite endpoints. For objects of class \code{"Intervals_full"}, non-finite endpoints are left open (although in general, this package does not make a distinction between closed and open infinite endpoints). } intervals/man/c.Intervals.Rd0000644000176200001440000000333213642043061015513 0ustar liggesusers\name{c} \alias{c} \alias{c.Intervals} \alias{c.Intervals_full} \title{Combine different interval matrix objects} \description{ S3 methods for concatenating sets of intervals into a single set. } \usage{ \S3method{c}{Intervals}(...) \S3method{c}{Intervals_full}(...) } \arguments{ \item{...}{\code{"Intervals"} or \code{"Intervals_full"} objects.} } \details{ All objects are expected to have the same value in the \code{type} slot. If the \code{closed} slots differ for \code{"\linkS4class{Intervals}"} objects and \code{type == "Z"}, the objects will be adjusted to have \code{closed} values matching that of \code{x}; if \code{type == "R"}, however, then all objects must first be coerced to class \code{"\linkS4class{Intervals_full}"}, with a warning. This coercion also occurs when a mixture of object types is passed in. A \code{NULL} in any argument is ignored. } \value{ A single \code{"\linkS4class{Intervals}"} or \code{"\linkS4class{Intervals_full}"} object. Input objects are concatenated in their order of appearance in the the argument list. If any input argument is not a set of intervals, \code{list(...)} is returned instead. } \note{ These methods will be converted to S4 once the necessary dispatch on \code{...} is supported. } \examples{ f1 <- Intervals( 1:2, type = "Z" ) g1 <- open_intervals( f1 + 5 ) # Combining Intervals objects over Z may require closure adjustment c( f1, g1 ) f2 <- f1; g2 <- g1 type( f2 ) <- type( g2 ) <- "R" # Combine Intervals objects over R which have different closure requires # coercion h <- c( f2, g2 ) # Coercion for mixed combinations as well c( h, g2 + 10 ) \dontrun{ # Combining different types is not permitted c( h, g1 + 10 ) } }intervals/man/plot.Intervals.Rd0000644000176200001440000000711413642043061016251 0ustar liggesusers\name{plot.Intervals} \alias{plot} \alias{plot.Intervals} \alias{plot.Intervals_full} \alias{plot,Intervals,missing-method} \alias{plot,Intervals_full,missing-method} \alias{plot,Intervals,ANY-method} \alias{plot,Intervals_full,ANY-method} \title{Plotting methods for interval objects} \description{ S3 methods for plotting \code{"Intervals"} and \code{"Intervals_full"} objects. } \usage{ \S3method{plot}{Intervals}(x, y, ...) \S3method{plot}{Intervals_full}( x, y = NULL, axes = TRUE, xlab = "", ylab = "", xlim = NULL, ylim = NULL, col = "black", lwd = 1, cex = 1, use_points = TRUE, use_names = TRUE, names_cex = 1, ... ) \S4method{plot}{Intervals,missing}(x, y, ...) \S4method{plot}{Intervals_full,missing}(x, y, ...) \S4method{plot}{Intervals,ANY}(x, y, ...) \S4method{plot}{Intervals_full,ANY}(x, y, ...) } \arguments{ \item{x}{An \code{"Intervals"} or \code{"Intervals_full"} object.} \item{y}{ Optional vector of heights at which to plot intervals. If omitted, \code{y} will be automatically computed to generate a compact plot but with no overlap. } \item{axes}{As for \code{\link{plot.default}}.} \item{xlab}{As for \code{\link{plot.default}}.} \item{ylab}{As for \code{\link{plot.default}}.} \item{xlim}{As for \code{\link{plot.default}}.} \item{ylim}{ If not explicitly supplied, \code{ylim} is set to the maximum value required for intervals which are visible for the given \code{xlim}. } \item{col}{ Color used for segments and endpoint points and interiors. Recycled if necessary. } \item{lwd}{Line width for segments. See \code{\link{par}}.} \item{cex}{ Endpoint magnification. Only relevant if \code{use_points = TRUE}. See \code{\link{par}}. } \item{use_points}{Should points be plotted at interval endpoints?} \item{use_names}{ Should \code{rownames(x)} by used for segment labels in the plot? } \item{names_cex}{ Segment label magnification. Only relevant if \code{use_names = TRUE}. } \item{...}{Other arguments for \code{\link{plot.default}}.} } \details{ Intervals with \code{NA} for either endpoint are not plotted. Vertical placement is on the integers, beginning with 0. } \value{None.} \examples{ # Note plot symbol for empty interval in 'from'. from <- Intervals( matrix( c( 2, 8, 8, 9, 6, 9, 11, 12, 3, 3 ), ncol = 2, byrow = TRUE ), closed = c( FALSE, TRUE ), type = "Z" ) rownames(from) <- c("a","b","c","d","e") to <- Intervals( matrix( c( 2, 8, 3, 4, 5, 10 ), ncol = 2, byrow = TRUE ), closed = c( FALSE, TRUE ), type = "Z" ) rownames(to) <- c("x","y","z") empty(from) plot( c(from,to), col = rep(1:2, c(nrow(from), nrow(to))) ) legend("topright", c("from","to"), col=1:2, lwd=1) # More intervals. The maximal height shown is adapted to the plotting # window. B <- 10000 left <- runif( B, 0, 1e5 ) right <- left + rexp( B, rate = 1/10 ) x <- Intervals( cbind( left, right ) ) plot(x, use_points=FALSE) plot(x, use_points=FALSE, xlim = c(0, 500)) }intervals/man/interval_overlap-methods.Rd0000644000176200001440000000721613642043110020340 0ustar liggesusers\name{interval_overlap} \alias{interval_overlap} \alias{interval_overlap,Intervals_virtual_or_numeric,Intervals_virtual_or_numeric-method} \alias{interval_overlap,missing,ANY-method} \alias{interval_overlap,ANY,missing-method} \title{Assess overlap from one set of intervals to another} \description{ Assess overlap from intervals in one set to intervals in another set, and return the relevant indices. } \usage{ \S4method{interval_overlap}{Intervals_virtual_or_numeric,Intervals_virtual_or_numeric}(from, to, check_valid = TRUE) } \arguments{ \item{from}{ An \code{"Intervals"} or \code{"Intervals_full"} object, or a vector of class \code{"numeric"}. \emph{Note!} Prior to v. 0.11.1, this argument was called \code{target}. } \item{to}{ An \code{"Intervals"} or \code{"Intervals_full"} object, or a vector of class \code{"numeric"}. \emph{Note!} Prior to v. 0.11.1, this argument was called \code{query}. } \item{check_valid}{ Should \code{\link{validObject}} be called before passing to compiled code? This, among other things, verifies that endpoints are of data type \code{"numeric"} and the \code{closed} vector/matrix is appropriately sized and of the correct data type. (Compiled code does no further checking.) } } \details{ Intervals which meet at endpoints overlap only if both endpoints are closed. Intervals in \code{to} with \code{NA} endpoints are ignored, with a warning; in \code{from}, such intervals produce no matches. Intervals in either \code{to} or \code{from} which are actually empty have their endpoints set to \code{NA} before proceeding, with warning, and so do not generate matches. If eith \code{to} or \code{from} is a vector of class \code{"numeric"}, overlap will be assess for the corresponding set of points. } \value{ A list, with one element for each row/component of \code{from}. The elements are vectors of indices, indicating which \code{to} rows (or components, for the \code{"numeric"} method) overlap each interval in \code{from}. A list element of length 0 indicates no overlapping elements. } \note{ If you want real (\code{type == "R"}) intervals that overlap in a set of positive measure --- not just at endpoints --- set all endpoints to open (i.e., \code{close(from) <- FALSE; closed(to) <- FALSE}) first. This function is now just a wrapper for \code{\link{which_nearest}}. } \seealso{ See \code{\link{which_nearest}} for details on nearby as well as overlapping intervals in \code{to}. } \examples{ # Note that 'from' contains a valid but empty interval. to <- Intervals( matrix( c( 2, 8, 3, 4, 5, 10 ), ncol = 2, byrow = TRUE ), closed = c( TRUE, FALSE ), type = "Z" ) from <- Intervals( matrix( c( 2, 8, 8, 9, 6, 9, 11, 12, 3, 3 ), ncol = 2, byrow = TRUE ), closed = c( TRUE, FALSE ), type = "Z" ) rownames(from) <- letters[1:nrow(from)] empty(to) empty(from) interval_overlap(from, to) # Non-empty real intevals of size 0 can overlap other intervals. u <- to type(u) <- "R" v <- Intervals_full( rep(3,4) ) closed(v)[2,] <- FALSE v empty(v) size(v) interval_overlap(v, u) # Working with points interval_overlap( from, c( 2, 3, 6, NA ) ) } intervals/man/intervals-package.Rd0000644000176200001440000000573113642043061016730 0ustar liggesusers\name{intervals-package} \alias{intervals-package} \alias{intervals} \docType{package} \title{ Tools for working with points and intervals } \description{ Tools for working with and comparing sets of points and intervals. } \details{ Index: \describe{ \item{\code{\link{Intervals-class}}}{Classes \code{"Intervals"} and \code{"Intervals_full"}.} \item{\code{\link{Intervals_virtual-class}}}{Class \code{"Intervals_virtual"}.} \item{\code{\link{Intervals_virtual_or_numeric-class}}}{Class union \code{"Intervals_virtual_or_numeric"}.} \item{\code{\link[=as.matrix.Intervals_virtual]{as.matrix}}}{Coerce endpoints to a matrix.} \item{\code{\link[=c.Intervals]{c}}}{Concatenate different sets of intervals.} \item{\code{\link{close_intervals}}}{Re-represent integer intervals with open or closed endpoints.} \item{\code{\link{closed}}}{Accessor for \code{closed} slot: closure vector/matrix.} \item{\code{\link{clusters}}}{Identify clusters in a collection of positions or intervals.} \item{\code{\link{contract}}}{Contract sets.} \item{\code{\link{distance_to_nearest}}}{Compute distance to nearest position in a set of intervals.} \item{\code{\link{empty}}}{Identify empty interval rows.} \item{\code{\link{expand}}}{Expand sets.} \item{\code{\link{interval_complement}}}{Compute the complement of a set of intervals.} \item{\code{\link{interval_difference}}}{Compute set difference.} \item{\code{\link{interval_included}}}{Assess inclusion of one set of intervals with respect to another.} \item{\code{\link{interval_intersection}}}{Compute the intersection of one or more sets of intervals.} \item{\code{\link{interval_overlap}}}{Assess which query intervals overlap which targets.} \item{\code{\link{interval_union}}}{Compute the union of intervals in one or more interval matrices.} \item{\code{\link{is.na}}}{Identify interval rows with \code{NA} endpoints.} \item{\code{\link[=plot.Intervals]{plot}}}{S3 plotting methods for intervals objects.} \item{\code{\link{reduce}}}{Compactly re-represent the points in a set of intervals.} \item{\code{\link{sgd}}}{Yeast gene model sample data.} \item{\code{\link{size}}}{Compute interval sizes.} \item{\code{\link[=split.Intervals_virtual]{split}}}{Split an intervals object according to a factor.} \item{\code{\link{type}}}{Accessor for \code{type} slot: Z or R.} \item{\code{\link{which_nearest}}}{Identify nearest member(s) in a set of intervals.} } Further information is available in the following vignettes: \describe{ \item{\code{intervals_overview}}{Overview of the intervals package.} } } \author{ Richard Bourgon } \keyword{ package } \section{Acknowledgments}{ Thanks to Julien Gagneur, Simon Anders, and Wolfgang Huber for numerous helpful suggestions about the package content and code. } \seealso{ See the \pkg{genomeIntervals} package in Bioconductor, which extends the functionality of this package. } intervals/man/sgd.Rd0000644000176200001440000000530013642043061014075 0ustar liggesusers\name{sgd} \alias{sgd} \docType{data} \title{Yeast gene model sample data} \description{ This data set contains a data frame describing a subset of the chromosome feature data represented in Fall 2007 version of \file{saccharomyces\_cerevisiae.gff}, available for download from the \emph{Saccharomyces} Genome Database (\url{http://www.yeastgenome.org}). } \usage{data(sgd)} \format{ A data frame with 14080 observations on the following 8 variables. \describe{ \item{\code{SGDID}}{SGD feature ID.} \item{\code{type}}{ Only four feature types have been retatined: \code{"CDS"}, \code{"five_prime_UTR_intron"}, \code{"intron"}, and \code{"ORF"}. Note that \code{"ORF"} correspond to a whole gene while \code{"CDS"}, to an exon. \emph{S. cerevisae} does not, however, have many multi-exonic genes. } \item{\code{feature_name}}{A character vector} \item{\code{parent_feature_name}}{ The \code{feature_name} of the a larger element to which the current feature belongs. All retained \code{"CDS"} entries, for example, belong to an \code{"ORF"} entry. } \item{\code{chr}}{ The chromosome on which the feature occurs. } \item{\code{start}}{Feature start base.} \item{\code{stop}}{Feature stop base.} \item{\code{strand}}{Is the feature on the Watson or Crick strand?} } } \examples{ # An example to compute "promoters", defined to be the 500 bases # upstream from an ORF annotation, provided these bases don't intersect # another orf. See documentation for the sgd data set for more details # on the annotation set. use_chr <- "chr01" data( sgd ) sgd <- subset( sgd, chr == use_chr ) orf <- Intervals( subset( sgd, type == "ORF", c( "start", "stop" ) ), type = "Z" ) rownames( orf ) <- subset( sgd, type == "ORF" )$feature_name W <- subset( sgd, type == "ORF", "strand" ) == "W" promoters_W <- Intervals( cbind( orf[W,1] - 500, orf[W,1] - 1 ), type = "Z" ) promoters_W <- interval_intersection( promoters_W, interval_complement( orf ) ) # Many Watson-strand genes have another ORF upstream at a distance of # less than 500 bp hist( size( promoters_W ) ) # All CDS entries are completely within their corresponding ORF entry. cds_W <- Intervals( subset( sgd, type == "CDS" & strand == "W", c( "start", "stop" ) ), type = "Z" ) rownames( cds_W ) <- NULL interval_intersection( cds_W, interval_complement( orf[W,] ) ) } \keyword{datasets} intervals/man/as.matrix.Intervals.Rd0000644000176200001440000000111213642043061017171 0ustar liggesusers\name{as.matrix} \alias{as.matrix} \alias{as.matrix.Intervals_virtual} \alias{as.matrix,Intervals_virtual-method} \title{Extract matrix of endpoints} \description{ S3 and S4 methods for extracting the matrix of endpoints from S4 objects. } \usage{ \S3method{as.matrix}{Intervals_virtual}(x, ...) \S4method{as.matrix}{Intervals_virtual}(x, ...) } \arguments{ \item{x}{\code{"Intervals"} or \code{"Intervals_full"} objects.} \item{...}{Unused, but required by the S3 generic.} } \value{ A two-column matrix, equivalent to \code{x@.Data} or \code{as(x, "matrix")}. } intervals/man/size-methods.Rd0000644000176200001440000000302713642043061015737 0ustar liggesusers\name{size} \alias{size} \alias{size,Intervals-method} \alias{size,Intervals_full-method} \title{Compute interval sizes} \description{ Compute the size, in either Z or R as appropriate, for each interval in an interval matrix. } \usage{ \S4method{size}{Intervals}(x, as = type(x)) \S4method{size}{Intervals_full}(x, as = type(x)) } \arguments{ \item{x}{An \code{"Intervals"} or \code{"Intervals_full"} object.} \item{as}{ Should the intervals be thought of as in Z or R? This is usually determined automatically from the \code{type} slot, but because changing type may cause object copying, it is sometimes convenient to temporarily override this slot without actually resetting it. } } \details{ For type \code{"Z"} objects, counting measure; for type \code{"R"} objects, Lebesgue measure. For type \code{"Z"} objects, intervals of form (\emph{a},\emph{a}] and (\emph{a},\emph{a}) are both of length 0. } \value{ A numeric vector with length equal to \code{nrow(x)}. } \seealso{ See \code{\link{empty}} to identify empty intervals. Note that when \code{type(x) == "R"}, a size of 0 does not imply that an interval is empty. } \examples{ z1 <- Intervals( cbind( 1, 1:3 ), type = "Z" ) z2 <- z1; closed(z2)[1] <- FALSE z3 <- z1; closed(z3) <- FALSE size(z1) size(z2) size(z3) r1 <- z1; type(r1) <- "R" r2 <- z2; type(r2) <- "R" r3 <- z3; type(r3) <- "R" size(r1) size(r2) size(r3) s1 <- Intervals_full( matrix( 1, 3, 2 ), type = "Z" ) closed(s1)[2,2] <- FALSE closed(s1)[3,] <- FALSE size(s1) } intervals/man/interval_intersection-methods.Rd0000644000176200001440000000216613642043061021402 0ustar liggesusers\name{interval_intersection} \alias{interval_intersection} \alias{interval_intersection,Intervals_virtual-method} \alias{interval_intersection,missing-method} \title{Compute the intersection of one or more sets of intervals} \description{ Given one or more sets of intervals, produce a new set compactly representing points contained in at least one interval of each input object. } \usage{ \S4method{interval_intersection}{Intervals_virtual}(x, ..., check_valid = TRUE) \S4method{interval_intersection}{missing}(x, ..., check_valid = TRUE) } \arguments{ \item{x}{ An \code{"Intervals"} or \code{"Intervals_full"} object.} \item{\dots}{Additional objects of the same classes permitted for \code{x}.} \item{check_valid}{ Should \code{\link{validObject}} be called before passing to compiled code? Also see \code{\link{interval_overlap}}. } } \value{ A single object representing points contained in each of the objects supplied in the \code{x} and \code{...} arguments. } \seealso{ See \code{\link{interval_union}} and \code{\link{interval_complement}}, which are used to produce the results. }intervals/man/interval_difference-methods.Rd0000644000176200001440000000176713642043061020774 0ustar liggesusers\name{interval_difference} \alias{interval_difference} \alias{interval_difference,Intervals_virtual,Intervals_virtual-method} \title{Compute set difference} \description{ Compute the set difference between two objects. } \usage{ \S4method{interval_difference}{Intervals_virtual,Intervals_virtual}(x, y, check_valid = TRUE) } \arguments{ \item{x}{An \code{"Intervals"} or \code{"Intervals_full"} object.} \item{y}{ An \code{"Intervals"} or \code{"Intervals_full"} object, with a \code{type} slot matching that of \code{x}. } \item{check_valid}{ Should \code{\link{validObject}} be called on \code{x} and \code{y} before passing to compiled code? Also see \code{\link{interval_overlap}}. } } \value{ An object representing the subset of the integers or real line, as determined by \code{type(x)}, found in \code{x} but not in \code{y}. } \seealso{ These methods are just wrappers for \code{\link{interval_intersection}} and \code{\link{interval_complement}}. }intervals/man/split.Intervals_virtual.Rd0000644000176200001440000000175013642043061020174 0ustar liggesusers\name{split} \alias{split} \alias{split.Intervals_virtual} \alias{split,Intervals_virtual-method} \title{Split an intervals object according to a factor} \description{ S3 and S4 methods for splitting \code{"Intervals"} or \code{"Intervals_full"} objects. } \usage{ \S3method{split}{Intervals_virtual}(x, f, drop = FALSE, ...) \S4method{split}{Intervals_virtual}(x, f, drop = FALSE, ...) } \arguments{ \item{x}{ \code{"Intervals"} or \code{"Intervals_full"} objects. } \item{f}{ Passed to \code{\link{split.data.frame}}. } \item{drop}{ Passed to \code{\link{split.data.frame}}. } \item{...}{ Passed to \code{\link{split.data.frame}}. } } \value{ A list of objects of the same class as \code{x}, split by the levels of \code{f}. Until R 2.15, special handling was not required. Subsequent changes to the \pkg{base} package \code{\link{split}} function required an explicit method here, but code already provided by \code{\link{split.data.frame}} was sufficient. } intervals/man/distance_to_nearest-methods.Rd0000644000176200001440000000277413642043061021012 0ustar liggesusers\name{distance_to_nearest} \alias{distance_to_nearest} \alias{distance_to_nearest,Intervals_virtual_or_numeric,Intervals_virtual_or_numeric-method} \title{Compute distance to nearest position in a set of intervals} \description{ For each point or interval in the \code{from} argument, compute the distance to the nearest position in the \code{to} argument. } \usage{ \S4method{distance_to_nearest}{Intervals_virtual_or_numeric,Intervals_virtual_or_numeric}(from, to, check_valid = TRUE) } \arguments{ \item{from}{An object of appropriate type.} \item{to}{An object of appropriate type.} \item{check_valid}{ Should \code{\link{validObject}} be called before passing to compiled code? Also see \code{\link{interval_overlap}}. } } \value{ A vector of distances, with one entry per point or interval in \code{from}. Any intervals in \code{from} which are either empty (see \code{\link{empty}}) or have \code{NA} endpoints produce a \code{NA} result. } \note{ This function is now just a wrapper for \code{\link{which_nearest}}. } \seealso{ See \code{\link{which_nearest}}, which also returns indices for the interval or intervals (in case of ties) at the distance reported. } \examples{ # Point to interval to <- Intervals( c(0,5,3,Inf) ) from <- -5:10 plot( from, distance_to_nearest( from, to ), type = "l" ) segments( to[,1], 1, pmin(to[,2], par("usr")[2]), 1, col = "red" ) # Interval to interval from <- Intervals( c(-Inf,-Inf,3.5,-1,1,4) ) distance_to_nearest( from, to ) } intervals/DESCRIPTION0000755000176200001440000000103613642055242013775 0ustar liggesusersPackage: intervals Version: 0.15.2 Type: Package Title: Tools for Working with Points and Intervals Author: Richard Bourgon Maintainer: Edzer Pebesma Depends: R (>= 2.9.0) Imports: utils, graphics, methods Description: Tools for working with and comparing sets of points and intervals. License: Artistic-2.0 LazyLoad: yes URL: http://github.com/edzer/intervals NeedsCompilation: yes Packaged: 2020-04-04 09:41:39 UTC; edzer Repository: CRAN Date/Publication: 2020-04-04 10:00:02 UTC intervals/build/0000755000176200001440000000000013642053123013357 5ustar liggesusersintervals/build/vignette.rds0000644000176200001440000000033713642053123015721 0ustar liggesusersb```b`fcf`b2 1# '+I-*K)/22ST)CJ2R S0 % M6ہ&$=yh楀aM wjey~L6̜T!%ps QY_/( @hrNb1GRKҊAaintervals/tests/0000755000176200001440000000000013642043061013422 5ustar liggesusersintervals/tests/intervals_test_code.R0000644000176200001440000000404413642043061017607 0ustar liggesuserslibrary( "intervals" ) ######## NAs and empty intervals u <- Intervals_full( as.numeric(NA), type = "Z" ) u <- c( u, u ) v <- Intervals_full( c(1,3,1,Inf), type = "Z" ) x <- Intervals( 1, closed = FALSE, type = "Z" ) # empty w <- c( x, u, v ) rownames(w) <- letters[ 1:nrow(w) ] x u v w is.na(w) empty(w) distance_to_nearest( u, v ) distance_to_nearest( w, v ) pts <- c( -Inf, Inf, NA, NaN, 0:2 ) distance_to_nearest( pts, v ) identical( distance_to_nearest( pts, v ), distance_to_nearest( pts, open_intervals( v ) ) ) interval_overlap( w, v ) reduce( w ) open_intervals(w) ######## Subset assignment u <- Intervals( 1:8, type = "Z" ) rownames( u ) <- letters[ 1:nrow(u) ] v <- Intervals( -4:-1, type = "Z" ) rownames( v ) <- letters[ nrow(u) + 1:nrow(v) ] w <- open_intervals(u) u v w # Basic z <- u; z[2:3,] <- v z # With names z <- u; z[c("a","d"),] <- v z # Missing row name result <- try( { z <- u; z[c("a","e"),] <- v }, TRUE ) result # Closure adjustment z <- w; z[2:3,] <- v z # Size mismatch error result <- try( { z <- w; z[2:3,] <- v[1,] }, TRUE ) result # Intervals_full method x <- Intervals_full( 1:6, c(TRUE,FALSE) ) rownames( x ) <- letters[ 1:nrow(x) ] y <- Intervals_full( -4:-1 ) x y # Missing value names z <- x; z[2,] <- y[1,] z # Missing x names z <- y; z[1,] <- x[1,] z # Type mismatch error result <- try( { z <- x; z[2:3,] <- v }, TRUE ) result # Coercion up type(v) <- "R" closed(v) <- c( FALSE, TRUE ) x v z <- x; z[2:3,] <- v z # With warning due to assignment z <- v; z[1,] <- x[3,] z # No row name copying with matrices A <- matrix( 0, 2, 2 ) rownames(A) <- c("1","2") z <- x; z[1:2,] <- A z ######## distance_to_nearest() behavior a <- Intervals_full( c(2,5), FALSE ) b <- Intervals_full( c(1,5,2,10), matrix(c(TRUE,FALSE,FALSE,TRUE),2,2) ) a b distance_to_nearest(a,b) type(a) <- "Z" type(b) <- "Z" distance_to_nearest(a,b) a <- as( a, "Intervals" ) b <- as( open_intervals( b ), "Intervals" ) a b distance_to_nearest(a,b) type(a) <- "R" type(b) <- "R" distance_to_nearest(a,b) intervals/src/0000755000176200001440000000000013642053123013047 5ustar liggesusersintervals/src/Endpoint.cpp0000644000176200001440000000422113642043061015332 0ustar liggesusers#include "Endpoint.h" //////// Ordering for tied endpoints /* We use two different tied endpoint orderings, one for reduce, and a different one for interval_overlap. These should be set by any code that uses sorting, so we initialize to -1, and have the sort method check this and throw an error if it's still found. Let Q/T be query/target, L/R be left/right, and O/C be open/closed. Our ordering, when pos is effectively tied, is then: QRO < TRO ... < TLC < QLC < QRC < TRC ... < TLO < QLO 0 1 2 3 4 5 6 7 The basic principals are, for similar closure, start targets before queries but finish them after queries. For abutting intervals, start new intervals before finishing old ones, unless one or both endpoints are open, in which case we should finish old intervals first. */ int Endpoint::state_array[2][2][2] = {{{0,0},{0,0}},{{0,0},{0,0}}}; //////// Endpoint methods Endpoint::Endpoint(int i, double p, bool q, bool l, bool c) { index = i; pos = p; query = q; left = l; closed = c; } void Endpoint::R_print() const { Rprintf( "index = %i, pos = %f (%s, %s, %s)\n", index, pos, query ? "query" : "target", left ? "left" : "right", closed ? "closed" : "open" ); } //////// Endpoints methods Endpoints::Endpoints( const double * pos, const int * closed, int n, bool query, bool is_full ) { /* The pos pointer should point to an n x 2 array of endpoints, and the closed pointer, to either an array of booleans of the same size (if full = true) or an array of two booleans (if full = false). Note that R uses int, not bool, for logicals. Intervals with R numeric NA in either slot are dropped. */ int i; this->reserve( 2 * n ); for ( i = 0; i < n; i++ ) { if ( ISNA( pos[i] ) || ISNA( pos[i+n] ) ) continue; this->push_back( Endpoint( i, pos[i], query, true, (bool) closed[ is_full ? i : 0 ] ) ); this->push_back( Endpoint( i, pos[i+n], query, false, (bool) closed[ is_full ? i+n : 1 ] ) ); } } void Endpoints::R_print() const { Endpoints::const_iterator it; for ( it = this->begin(); it < this->end(); it++ ) it->R_print(); } intervals/src/Endpoint.h0000644000176200001440000000266513642043061015011 0ustar liggesusers#ifndef ENDPOINT_H #define ENDPOINT_H #include #include #include //////// Endpoint class class Endpoint{ private: static int state_array[2][2][2]; inline int state() const { return( state_array[query][left][closed] ); } public: int index; double pos; bool query, left, closed; Endpoint(int i, double p, bool q, bool l, bool c); inline bool operator< (const Endpoint& other) const { /* We assume that the calling code is aware of the difficulty in assessing equality for floating point numbers and that values are passed in as exactly equal (in their floating point representation) if and only if exact equality is intended by the calling code. Given this assumption, there is no need for a relative difference approach here. */ if ( this->pos == other.pos ) return( this->state() < other.state() ); else return( this->pos < other.pos ); } static void set_state_array( const int new_array[2][2][2] ) { int i, j, k; for( i = 0; i < 2; i++ ) for( j = 0; j < 2; j++ ) for( k = 0; k < 2; k++ ) Endpoint::state_array[i][j][k] = new_array[i][j][k]; } void R_print() const; }; //////// Endpoints class class Endpoints : public std::vector< Endpoint > { public: Endpoints( const double * pos, const int * closed, int n, bool query, bool is_full ); void R_print() const; }; #endif // #ifndef ENDPOINT_H intervals/src/init.c0000644000176200001440000000122613642045602014162 0ustar liggesusers#include #include #include extern SEXP _which_nearest(SEXP qe, SEXP te, SEXP qc, SEXP tc, SEXP q_full, SEXP t_full); extern SEXP _plot_overlap(SEXP e, SEXP c, SEXP full); extern SEXP _reduce(SEXP e, SEXP c, SEXP full); #define CALLDEF(name, n) {#name, (DL_FUNC) &name, n} const static R_CallMethodDef R_CallDef[] = { CALLDEF(_which_nearest, 6), CALLDEF(_plot_overlap, 3), CALLDEF(_reduce, 3), {NULL, NULL, 0} }; void // attribute_visible // optional R_init_intervals(DllInfo *dll) { R_registerRoutines(dll, NULL, R_CallDef, NULL, NULL); R_useDynamicSymbols(dll, FALSE); R_forceSymbols(dll, TRUE); } intervals/src/plot_overlap.cpp0000644000176200001440000000403013642043061016256 0ustar liggesusers#include #include #include "Endpoint.h" #include #include #include /* What we require to prevent segfaults is the same as for interval_overlap.cpp. See details there. Everything should be checked by the calling code in R. For plotting without visual overlap, we do not care about endpoint closure, and we always open new intervals before closing old ones. When an interval opens, we assign it the minimal free interior option, if there is one; otherwise, we assign it the current count of open intervals. When an interval closes, if it does not have the current maximum y, its y gets added to the free_interior set. */ const int reduce_order[2][2][2] = { {{2,2},{1,1}}, // Target: {{ ), ] }, { (, [ }} {{0,0},{0,0}} // Query: {{ ), ] }, { (, [ }} }; extern "C" { SEXP _plot_overlap(SEXP e, SEXP c, SEXP full) { // Load data and sort int n = nrows(e); bool full_bool = *LOGICAL(full); Endpoints ep ( REAL(e), LOGICAL(c), n, false, full_bool ); // Set sorting order, then sort Endpoint::set_state_array( reduce_order ); sort( ep.begin(), ep.end() ); // Process int i; int active_count = 0; std::set free_interior; std::vector y (n); Endpoints::const_iterator it; // Initialize to NA for ( i = 0; i < n; i++ ) y[i] = R_NaInt; for ( it = ep.begin(); it < ep.end(); it++ ) { if ( it->left ) { // Opening an interval if ( free_interior.size() > 0 ) { y[ it->index ] = *free_interior.begin(); free_interior.erase( free_interior.begin() ); } else y[ it->index ] = active_count; active_count++; } else{ // Closing an interval active_count--; if ( y[ it->index ] < active_count + free_interior.size() ) free_interior.insert( y[ it->index ] ); } } // Prepare and return result. SEXP result; PROTECT( result = allocVector( INTSXP, n ) ); copy( y.begin(), y.end(), INTEGER( result ) ); UNPROTECT(1); return( result ); } } intervals/src/reduce.cpp0000644000176200001440000000461613642043061015031 0ustar liggesusers#include #include #include "Endpoint.h" #include #include /* What we require to prevent segfaults is the same as for interval_overlap.cpp. See details there. Everything should be checked by the calling code in R. */ const int reduce_order[2][2][2] = { {{2,4},{3,1}}, // Target: {{ ), ] }, { (, [ }} {{0,0},{0,0}} // Query: {{ ), ] }, { (, [ }} }; extern "C" { SEXP _reduce(SEXP e, SEXP c, SEXP full) { // Load data and sort int n = nrows(e); bool full_bool = *LOGICAL(full); Endpoints ep ( REAL(e), LOGICAL(c), n, false, full_bool ); // Set sorting order, then sort Endpoint::set_state_array( reduce_order ); sort( ep.begin(), ep.end() ); // Process int score = 0; std::vector start, end; std::vector start_c, end_c; Endpoints::const_iterator it; for ( it = ep.begin(); it < ep.end(); it++ ) { if ( score == 0 ) { if ( !it->left ) error("Internal error: unexpected endpoint type when score = 0."); start.push_back( it->pos ); if ( full_bool ) start_c.push_back( (int) it->closed ); } score += ( it->left ? +1 : -1 ); if ( score == 0 ) { if ( it->left ) error("Internal error: unexpected endpoint type when score = 0."); end.push_back( it->pos ); if ( full_bool ) end_c.push_back( (int) it->closed ); } } if ( start.size() != end.size() ) error("Internal error: mismatched start and end endpoint sets."); // Prepare and return result. SEXP result; PROTECT( result = allocVector( VECSXP, 2 ) ); SET_VECTOR_ELT( result, 0, allocMatrix( REALSXP, start.size(), 2 ) ); copy( start.begin(), start.end(), REAL( VECTOR_ELT( result, 0 ) ) ); copy( end.begin(), end.end(), REAL( VECTOR_ELT( result, 0 ) ) + start.size() ); if ( full_bool ) { SET_VECTOR_ELT( result, 1, allocMatrix( LGLSXP, start.size(), 2 ) ); copy( start_c.begin(), start_c.end(), LOGICAL( VECTOR_ELT( result, 1 ) ) ); copy( end_c.begin(), end_c.end(), LOGICAL( VECTOR_ELT( result, 1 ) ) + start.size() ); } else { SET_VECTOR_ELT( result, 1, allocVector( LGLSXP, 2 ) ); LOGICAL( VECTOR_ELT( result, 1 ) )[0] = LOGICAL(c)[0]; LOGICAL( VECTOR_ELT( result, 1 ) )[1] = LOGICAL(c)[1]; } UNPROTECT(1); return( result ); } } intervals/src/which_nearest.cpp0000644000176200001440000001620013642043061016375 0ustar liggesusers#include #include #include "Endpoint.h" #include #include #include #include /* #### What we require to prevent segfaults: 1. For Intervals_full objects, the endpoint and closure matrices must be of the same dimension, and have two columns each. For Intervals objects, we expect a closure vector of length 2. 2. Endpoints must be type double, and closure must be R logical, which ends up as int in C++. The validity function for the classes should verify both of these properties, so we do no additional checks here, i.e., we assume that we've been passed valid objects. #### To-do - Try hash_set instead of set, if it compiles OK. #### The "active" and "pending" sets - The q_active and t_active sets record indices of intervals which are currently open as we proceed through the list of points. - The q_pending set records the query interval (or intervals, in the case of ties) which has closed most recently to the left. If multiple target intervals come by before the next query interval is opened, each will need to be compare to the right endpoint of the intervals in q_pending. Once we open a new query interval, q_pending is cleared. - The t_pending set records indices of target intervals which have closed since the last time a query interval opened -- and distances to the left were therefor checked. Each of these target intervals needs to be checked against the next query interval to become active, as well as any additional query intervals that start at the same location. The t_pending set will be cleared when we get ready to add a new index to it but see that (i) a query interval has been opened since the last time we tried to add an index, and (ii) that pos has changed. the last closure of a query interval. When we open a new query interval, each of these target intervals needs to be compared to the new query interval's left endpoint. Once we do this -- and provided that the next query interval does not start in the same place -- then t_pending is cleared. */ const int overlap_order[2][2][2] = { {{1,5},{6,2}}, // Target: {{ ), ] }, { (, [ }} {{0,4},{7,3}} // Query: {{ ), ] }, { (, [ }} }; extern "C" { SEXP _which_nearest(SEXP qe, SEXP te, SEXP qc, SEXP tc, SEXP q_full, SEXP t_full) { // Load data, combine int qn = nrows(qe); int tn = nrows(te); Endpoints q ( REAL(qe), LOGICAL(qc), qn, true, *LOGICAL(q_full) ); Endpoints t ( REAL(te), LOGICAL(tc), tn, false, *LOGICAL(t_full) ); double* q_right = REAL(qe) + qn; double* t_right = REAL(te) + tn; q.insert( q.end(), t.begin(), t.end() ); // Set sorting order, then sort Endpoint::set_state_array( overlap_order ); sort(q.begin(), q.end()); // Process overlaps std::set q_active, t_active; std::vector< std::set > indices ( tn ); // For distance_to_nearest and which_nearest double q_check_pos = std::numeric_limits::infinity(); std::set q_pending, t_pending; std::vector delta ( tn ); std::vector< std::set > which ( tn ); double diff; // For looping Endpoints::const_iterator it; std::set::iterator set_it; int i; // Initialize delta for ( i = 0; i < tn; i++ ) delta[i] = std::numeric_limits::infinity(); for ( it = q.begin(); it < q.end(); it++ ) { if ( it->query ) { if ( it->left ) { // Query left for( set_it = t_active.begin(); set_it != t_active.end(); set_it++ ) { indices[ *set_it ].insert( it->index + 1 ); if ( delta[ *set_it ] > 0 ) which[ *set_it ].clear(); delta[ *set_it ] = 0; which[ *set_it ].insert( it->index + 1 ); } for( set_it = t_pending.begin(); set_it != t_pending.end(); set_it++ ) { diff = it->pos - t_right[ *set_it ]; if ( delta[ *set_it ] == diff ) which[ *set_it ].insert( it->index + 1 ); if ( delta[ *set_it ] > diff ) { which[ *set_it ].clear(); delta[ *set_it ] = diff; which[ *set_it ].insert( it->index + 1 ); } } q_active.insert( it->index ); q_check_pos = it->pos; q_pending.clear(); } else { // Query right q_active.erase( it->index ); // if ( q_right[ it->index ] > q_right[ *q_pending.begin() ] ) // q_pending.clear(); // EJP: trying to fix the clang-ASAN error, // EJP: replace these to lines with if (!q_pending.empty()) { if (it->index < length(qe) && *q_pending.begin() < length(qe) ) { if ( q_right[ it->index ] > q_right[ *q_pending.begin() ] ) q_pending.clear(); } } q_pending.insert( it->index ); } } else { if ( it->left ) { // Target left /* Note that some care is required here. It is possible that there is another interval at distance 0 to the left, but which, due to endpoint closure, does not actually overlap the target interval we are activating. In this case, q_active could be empty but we should still set delta to 0 for this target interval and add the index of the query interval immediately to the left to the which set. Similarly, if there are both overlapping and non-overlapping distance-zero query intervals, we want to return delta = 0 and the indices for both types. */ if ( q_active.size() > 0 ) { delta[ it->index ] = 0; for( set_it = q_active.begin(); set_it != q_active.end(); set_it++ ) { indices[ it->index ].insert( *set_it + 1 ); which[ it->index ].insert( *set_it + 1 ); } } for ( set_it = q_pending.begin(); set_it != q_pending.end(); set_it++ ) { diff = it->pos - q_right[ *set_it ]; if ( delta[ it->index ] == diff ) which[ it->index ].insert( *set_it + 1 ); if ( delta[ it->index ] > diff ) { which[ it->index ].clear(); delta[ it->index ] = diff; which[ it->index ].insert( *set_it + 1 ); } } t_active.insert( it->index ); } else { // Target right t_active.erase( it->index ); if ( it->pos > q_check_pos ) { t_pending.clear(); q_check_pos = std::numeric_limits::infinity(); } t_pending.insert( it->index ); } } } // Prepare and return result. SEXP result; PROTECT( result = allocVector( VECSXP, 3 ) ); SET_VECTOR_ELT( result, 0, allocVector( REALSXP, tn ) ); // delta SET_VECTOR_ELT( result, 1, allocVector( VECSXP, tn ) ); // which SET_VECTOR_ELT( result, 2, allocVector( VECSXP, tn ) ); // which_overlap copy( delta.begin(), delta.end(), REAL( VECTOR_ELT( result, 0 ) ) ); for( i = 0; i < tn; i++ ) { SET_VECTOR_ELT( VECTOR_ELT( result, 1 ), i, allocVector( INTSXP, which[i].size() ) ); copy( which[i].begin(), which[i].end(), INTEGER( VECTOR_ELT( VECTOR_ELT( result, 1 ), i ) ) ); SET_VECTOR_ELT( VECTOR_ELT( result, 2 ), i, allocVector( INTSXP, indices[i].size() ) ); copy( indices[i].begin(), indices[i].end(), INTEGER( VECTOR_ELT( VECTOR_ELT( result, 2 ), i ) ) ); } UNPROTECT(1); return( result ); } } intervals/vignettes/0000755000176200001440000000000013642053123014270 5ustar liggesusersintervals/vignettes/intervals_overview.Rnw0000644000176200001440000003421313642043061020720 0ustar liggesusers@ \documentclass[a4paper]{article} \usepackage{Sweave, amssymb, amsmath} \usepackage[ pdftex, pdfpagelabels, plainpages=false, pdfborder={0 0 0}, pdfstartview=FitH, bookmarks=true, bookmarksnumbered=true, bookmarksopen=true ] {hyperref} \title{Overview of the \emph{intervals} package} \author{Richard Bourgon} \date{06 June 2009} % The is for R CMD check, which finds it in spite of the "%", and also for % automatic creation of links in the HTML documentation for the package: % \VignetteIndexEntry{Overview of the intervals package.} \begin{document} %%%%%%%% Setup % Don't reform code \SweaveOpts{keep.source=TRUE, eps=FALSE} % Size for figures \setkeys{Gin}{width=.7\textwidth} % Fonts \DefineVerbatimEnvironment{Sinput}{Verbatim}{xleftmargin=1cm,fontshape=sl,fontsize=\small} \DefineVerbatimEnvironment{Soutput}{Verbatim}{xleftmargin=1cm,fontsize=\small} % Reduce characters per line in R output @ <>= options( width = 80 ) @ % Make title \maketitle % Typesetting commands \newcommand{\R}{\mathbb{R}} \newcommand{\Z}{\mathbb{Z}} %%%%%%%% TOC \tableofcontents \vspace{.25in} %%%%%%%% Main text \section{Introduction} The \emph{intervals} packages defines two S4 classes which represent collections of intervals over either the integers ($\Z$) or the real number line ($\R$). An instance of either class consists of a two-column matrix of endpoints, plus additional slots describing endpoint closure and whether the intervals are to be thought of as being over $\Z$ or $\R$. @ <>= library( intervals ) x <- Intervals( matrix( 1:6, ncol = 2 ) ) x x[2,2] <- NA x[3,1] <- 6 x @ Objects of class \texttt{Intervals} represent collections of intervals with common endpoint closure, e.g., all left-closed, right-open. More control over endpoints is permitted with the \texttt{Intervals\_full} class. (Both classes are derived from \texttt{Intervals\_virtual}, which is not intended for use by package users.) @ <>= y <- as( x, "Intervals_full" ) y <- c( y, Intervals_full( c(2,3,5,7) ) ) closed(y)[2:3,1] <- FALSE closed(y)[4,2] <- FALSE rownames(y) <- letters[1:5] y @ The \texttt{size} method gives measure --- counting measure over $\Z$ or Lebesgue measure over $\R$ --- for each interval represented in an object. The \texttt{empty} method identifies intervals that are in fact empty sets, which over $\R$ is not the same thing as having size 0. (Valid objects must have each right endpoint no less than the corresponding left endpoint. When one or both endpoints are open, however, valid intervals may be empty.) @ <>= size(x) empty(x) empty(y) @ \begin{figure}[!tb] \centering @ <>= plot( y ) @ \caption{The \texttt{Intervals\_full} object \texttt{y}, plotted with \texttt{plot(y)}. The second row contains an \texttt{NA} endpoint, and is not shown in the plot. The empty interval is plotted as a hollow point. By default, vertical placement avoids overlaps but is compact. } \label{fig:plotting} \end{figure} \section{Interpretation of objects} An \texttt{Intervals} or \texttt{Intervals\_full} object can be thought of in two different modes, each of which is useful in certain contexts: \begin{enumerate} \item As a (non-unique) representation of a subset of $\Z$ or $\R$. \item As a collection of (possibly overlapping) intervals, each of which has a meaningful identity. \end{enumerate} \subsection{As a subset of $\Z$ or $\R$} The \emph{intervals} package provides a number of basic tools for working in the first mode, where an object represents a subset of $\Z$ or $\R$ but the rows of the endpoint matrix do not have any external identity. Basic tools include \texttt{reduce}, which returns a sorted minimal representation equivalent to the original (dropping any intervals with \texttt{NA} endpoints), as well as \texttt{interval\_union}, \texttt{interval\_complement}, and \texttt{interval\_intersection}. @ <>= reduce( y ) interval_intersection( x, x + 2 ) interval_complement( x ) @ Note that combining \texttt{x} and its complement in order to compute a union requires mixing endpoint closure types; coercion to \texttt{Intervals\_full} is automatic. @ <>= interval_union( x, interval_complement( x ) ) @ The \texttt{distance\_to\_nearest} function treats its \texttt{to} argument in the first mode, as just a subset of $\Z$ or $\R$; it treats its \texttt{from} argument, however, in the second mode, returning one distance for every row of the \texttt{from} object. In the example below, we also look at performance for large data sets (less than one second on a 2 GHz Intel Core 2 Duo Macintosh, although the time shown below will likely differ). A histogram of \texttt{d} is given in Figure~\ref{fig:distance}. @ <>= B <- 100000 left <- runif( B, 0, 1e8 ) right <- left + rexp( B, rate = 1/10 ) v <- Intervals( cbind( left, right ) ) head( v ) mean( size( v ) ) dim( reduce( v ) ) system.time( d <- distance_to_nearest( sample( 1e8, B ), v ) ) @ \begin{figure}[!tb] \centering @ <>= hist( d, main = "Distance to nearest interval" ) @ \caption{Histogram of distances from a random set of points to the nearest point in \texttt{v}. There is also a \texttt{distance\_to\_nearest} method for comparing two sets of intervals.} \label{fig:distance} \end{figure} \subsection{As a set of meaningful, possibly overlapping intervals} In some applications, each row of an object's endpoint matrix has a meaningful identity, and particular points from $\Z$ or $\R$ may be found in more than one row. To support this mode, objects may be given row names, which are propagated through calculations when appropriate. The \texttt{c} methods simply stack objects (like \texttt{rbind}), preserving row names and retaining redundancy, if any. The \texttt{interval\_overlap} method works in this mode. In the next example we use it to identify rows of \texttt{v} which are at least partially redundant, i.e., which intersect at least one other row of \texttt{v}. All rows overlap themselves, so we look for rows that overlap at least two rows: @ <>= rownames(v) <- sprintf( "%06i", 1:nrow(v) ) io <- interval_overlap( v, v ) head( io, n = 3 ) n <- sapply( io, length ) sum( n > 1 ) k <- which.max( n ) io[ k ] v[ k, ] v[ io[[ k ]], ] @ The \texttt{which\_nearest} method also respects row identity, for both its \texttt{to} and \texttt{from} arguments. In addition to computing the distance from each \texttt{from} interval to the nearest point in \texttt{to}, it also returns the row index of the \texttt{to} interval (or intervals, in case of ties) located at the indicated distance. Another function which operates in this mode is \texttt{clusters}, which takes a set of points or intervals and identifies maximal groups which cluster together --- which are separated from one another by no more than a user-specified threshold. The following code is taken from the \texttt{clusters} documentation: @ <>= B <- 100 left <- runif( B, 0, 1e4 ) right <- left + rexp( B, rate = 1/10 ) y <- reduce( Intervals( cbind( left, right ) ) ) w <- 100 c2 <- clusters( y, w ) c2[1:3] @ \section{Floating point and intervals over $\R$} When \texttt{type == "R"}, interval endpoints are not truly in $\R$, but rather, in the subset which can be represented by floating point arithmetic. (For the moment, this is also true when \texttt{type == "Z"}. See Section~\ref{sec:representation}.) This limits the endpoint values which can be represented; more importantly, if computations are performed on interval endpoints, it means that floating point error can affect whether or not endpoints coincide, whether intervals which meet at or near endpoints overlap one another, etc. In spite of this potentially serious limitation, it is still often convenient to work with intervals with non-integer endpoints, including data where adjacent intervals exactly meet at a non-integer endpoint. To address this, the \emph{intervals} package takes the following approach: \begin{itemize} \item Floating point representations of interval endpoints are assumed to be \emph{exactly equal} (in the sense of \texttt{==} in R or C++) if and only if the user intends the real values corresponding to these representations to be exactly equal. \item For cases where floating point error and approximate equality are a concern, tools are provided to permit distinguishing between ambiguous and unambiguous intersection, union, etc. \end{itemize} In the next example, \texttt{y1} does not literally overlap \texttt{y2[2,]}, although R's \texttt{all.equal} function asserts that the gap between them is smaller than the default tolerance for equivalence up to floating point precision. @ <>= delta <- .Machine[[ "double.eps" ]]^0.5 y1 <- Intervals( c( .5, 1 - delta / 2 ) ) y2 <- Intervals( c( .25, 1, .75, 2 ) ) y1 y2 all.equal( y1[1,2], y2[2,1] ) interval_intersection( y1, y2 ) @ The \texttt{expand} and \texttt{contract} methods, used with \texttt{type = "relative"}, permit consideration of the maximal and minimal interval sets which are consistent with the nominal endpoints --- from the point of view of endpoint relative difference. The \texttt{contract} method, for example, contracts each interval in a collection so that the relative difference between original and contracted endpoints is equal to tolerance \texttt{delta}. Thus, if a relative difference less than or equal to \texttt{delta} is our criterion for approximate floating point equality, the contracted object has endpoints which are approximately equal to those of the original --- even though the contracted object is a proper subset of the original. The \texttt{expand} method is similar, but generates a proper superset. @ <>= contract( y1, delta, "relative" ) @ We compute two separate intersections which bound the nominal intersection: @ <>= inner <- interval_intersection( contract( y1, delta, "relative" ), contract( y2, delta, "relative" ) ) inner outer <- interval_intersection( expand( y1, delta, "relative" ), expand( y2, delta, "relative" ) ) outer @ Finally, we identify points which may or may not be in the intersection, depending on whether we make a conservative, literal, or anti-conservative interpretation of the nominal endpoints. @ <>= interval_difference( outer, inner ) @ The \texttt{expand} and \texttt{contract} methods have other uses as well. Here, we eliminate gaps of size 2 or smaller: @ <>= x <- Intervals( c(1,10,100,8,50,200), type = "Z" ) x w <- 2 close_intervals( contract( reduce( expand(x, w/2) ), w/2 ) ) @ \section{Notes on implementation} \subsection{Endpoint representation} \label{sec:representation} For the moment, interval endpoints are always stored using R's \emph{numeric} data type. Although this is wasteful from an memory and speed point of view, we do it for two reasons. First, use of R's \texttt{Inf} and \texttt{-Inf} --- not possible with the \emph{integer} type --- is very convenient when computing complements. Second, the range of integers which can be represented using the \emph{numeric} data type is considerably greater: @ <>= .Machine$integer.max numeric_max <- with( .Machine, double.base^double.digits ) options( digits = ceiling( log10( numeric_max ) ) ) numeric_max @ \subsection{Efficiency} All computations are accomplished by treating intervals as pairs of tagged endpoints, sorting these endpoints (along with their tags), and then making a single pass through the results. Computational complexity for set operations is therefore $O(n \log n)$, where input object $i$ contains $n_i$ rows and $n = \sum_i n_i$. The same sorting approach is also used for \texttt{interval\_overlap}, although if every interval in a query object of $m$ rows overlaps every intervals in a target object of $n$ rows, generating output alone must of necessity be $O(mn)$. Sorted endpoint vectors are not retained in memory. If one wishes to query a particular object over and over, repeated sorting would be inefficient; in practice so far, however, such repeated querying has not been needed. \subsection{Checking validity} The code behind \texttt{which\_nearest} and \texttt{reduce} (key methods in the \emph{intervals} package, which may be directly called by the user and are also used internally in numerous locations) is written in C++ for efficiency. The compiled code makes a number of assumptions about the \texttt{SEXP} objects passed in as arguments, but does not explicitly check these assumptions. Nonetheless, when the R wrappers for the compiled code are applied to \emph{valid} objects from the \texttt{Intervals} or \texttt{Intervals\_full} classes, all assumptions will always be met. This design decision was taken so that the requirements for individual objects and their contents could be gathered together in a single, natural location: the classes' \texttt{validity} functions. The \emph{intervals} package provides replacement methods --- e.g., \texttt{type} and \texttt{closed} --- which implement error checking and preserve object validity. R's implementation of S4 classes, however, leaves object data slots exposed to the user. As a consequence, a user can directly manipulate the data slots of a valid \texttt{Intervals} or \texttt{Intervals\_full} object in a way that invalidates the object, but does not generate any warning or error. To prevent invalid objects from being passed to compiled code --- and potentially generating segmentation faults or other problems --- all wrapper code in this package includes a \texttt{check\_valid} argument. This argument is set to \texttt{TRUE} by default, so that \texttt{validObject} is called on relevant objects before handing them off to the compiled code. For efficiency, users may choose to override this extra check if they are certain they have not manually assigned inappropriate content to objects' data slots. \section{Session information} @ <>= si <- as.character( toLatex( sessionInfo() ) ) cat( si[ -grep( "Locale", si ) ], sep = "\n" ) @ \end{document} intervals/NEWS0000644000176200001440000000505513642043061012764 0ustar liggesusers ******** VERSION 0.13.3 ******** BUG FIXES - The S3 plot() method for class Intervals was ignoring the y argument. (The method for class Intervals_full did, however, use the argument properly.) This has been fixed. ******** VERSION 0.13.2 ******** BUG FIXES - The initialization method for the Intervals class threw errors when empty objects were created. This has been fixed. ******** VERSION 0.13.0 ******** NEW FEATURES - New interval_included methods, similar to interval_overlap, but requiring full inclusion. ******** VERSION 0.12.3 ******** NEW FEATURES - S3 as.matrix methods for Intervals and Intervals_full objects. ******** VERSION 0.12.0 ******** NEW FEATURES - S3 plot methods for Intervals and Intervals_full objects. ******** VERSION 0.11.1 ******** SIGNIFICANT USER-VISIBLE CHANGES - The interval_overlap and distance_to_nearest methods are now just wrappers for which_nearest. Because of this, the argument names for interval_overlap, have been changed from 'target' and 'query' to 'from' and 'to', respectively, in order to match the other two functions. Argument order is the same as before, but functions which call arguments by name and use the old names will now generate an (informative) error message. BUG FIXES - The C++ code for interval_overlap correctly handles all varieties of endpoint closure, but does not handle cases like (0,2) vs. (1,3) over Z. (These intervals do not overlap, even though the right endpoint of the first interval is nominally after the left endpoint of the second interval.) This should have been handled by the R wrapper -- by applying close_intervals before passing on to compiled code -- but this step had previously been omitted. This is now fixed. NEW FEATURES - The interval_overlap, which_nearest, and distance_to_nearest methods now all accept a numeric vector in both the 'from' and 'to' arguments. IMPROVEMENTS - The distance_to_nearest methods were previously based on old code using approxfun(). They now work of the same algorithm used for interval_overlap and which_nearest. This algorithm simultaneously generates all three types of information: identity of overlaps and nearest neighbors, as well as distance to nearest neighbors. ******** VERSION 0.11.0 ******** NEW FEATURES - Adding a NEWS file! - Added which_nearest methods, as a complement to distance_to_nearest. The C++ code previously used for interval_overlap calculations was augmented to provide this functionality.intervals/R/0000755000176200001440000000000013642045000012454 5ustar liggesusersintervals/R/head-methods.R0000644000176200001440000000103413642043061015144 0ustar liggesuserssetGeneric( "head", function( x, ... ) standardGeneric( "head" ) ) setMethod( "head", signature( "Intervals_virtual" ), function( x, n = 6 ) { if ( nrow(x) > 0 ) x[ 1:min( n, nrow(x) ), ] else x } ) setGeneric( "tail", function( x, ... ) standardGeneric( "tail" ) ) setMethod( "tail", signature( "Intervals_virtual" ), function( x, n = 6 ) { if ( nrow(x) > 0 ) x[ max( 1, nrow(x) - n + 1 ):nrow(x), ] else x } ) intervals/R/interval_included-methods.R0000644000176200001440000000541313642043061017743 0ustar liggesuserssetGeneric( "interval_included", def = function( from, to, ... ) standardGeneric( "interval_included" ) ) setMethod( "interval_included", signature( "Intervals", "Intervals" ), function( from, to, check_valid = TRUE ) { # For inclusion, both endpoints from a "to" interval should be # inside an particular "from" interval. Because interval_overlap # treats numerics as double-closed single-point intervals, some care # is required with open endpoints for "to": these should be # considered to overlap closed OR open "from" endpoints with which # they coincide. We handle this, over R, by adjusting the "from" # closure. if ( any( empty(to) ) ) { warning( "Some empty 'to' intervals encountered. Setting to NA...", call. = FALSE ) to[ empty(to), ] <- NA } if ( type(to) == "Z" ) to <- close_intervals(to) else closed( from ) <- closed( from ) | !closed( to ) mapply( intersect, interval_overlap( from, to[,1], check_valid ), interval_overlap( from, to[,2], check_valid ) ) } ) setMethod( "interval_included", signature( "Intervals_full", "Intervals_full" ), function( from, to, check_valid = TRUE ) { # For the same reasons given above, open endpoints in "to" need to # be re-checked against open endpoints in "from", since equality of # the endpoint value is consistent with inclusion. if ( any( empty(to) ) ) { warning( "Some empty 'to' intervals encountered. Setting to NA...", call. = FALSE ) to[ empty(to), ] <- NA } if ( type(to) == "Z" ) to <- close_intervals(to) # Left side left <- interval_overlap( from, to[,1], check_valid ) to[ closed(to)[,1], 1 ] <- NA left_open <- interval_overlap( from[,1], to[,1], check_valid ) # Right side right <- interval_overlap( from, to[,2], check_valid ) to[ closed(to)[,2], 2 ] <- NA right_open <- interval_overlap( from[,2], to[,2], check_valid ) mapply( function(l,lo,r,ro) intersect( c(l,lo), c(r,ro) ), left, left_open, right, right_open ) } ) # Note: there isn't much sense in asking what's included in a set of # points. Further, overlap and inclusion are the same when "from" contains # actual intervals while "to" contains point. For these reasons, there are no # methods for class "numeric." intervals/R/interval_intersection-methods.R0000644000176200001440000000274613642043061020670 0ustar liggesuserssetGeneric( "interval_intersection", def = function( x, ... ) standardGeneric( "interval_intersection" ) ) setMethod( "interval_intersection", signature( "Intervals_virtual" ), function( x, ..., check_valid = TRUE ) { args <- c( list(x), list(...) ) if ( check_valid ) for ( y in args ) validObject( y ) complements <- lapply( args, interval_complement, check_valid = FALSE ) interval_complement( do.call( interval_union, c( complements, list( check_valid = FALSE ) ) ) ) } ) setMethod( "interval_intersection", signature( "missing" ), function( x, ..., check_valid = TRUE ) { # Permitting do.call use with named lists, since do.call will put # elements whose names are not "x" into the ... argument. Stripping # names, however, puts arguments in place positionally. args <- list(...) names( args ) <- NULL if ( length( args ) == 0 ) return ( NULL ) else return( do.call( interval_intersection, c( args, list( check_valid = check_valid ) ) ) ) } ) intervals/R/type-methods.R0000644000176200001440000000141113642043061015223 0ustar liggesuserssetGeneric( "type", function(x) standardGeneric( "type" ) ) setMethod( "type", signature( "Intervals_virtual" ), function( x ) x@type ) setGeneric( "type<-", function( x, value ) standardGeneric( "type<-" ) ) setReplaceMethod( "type", "Intervals_virtual", function( x, value ) { if ( length( value ) != 1 || !( value %in% c( "Z", "R" ) ) ) stop( "The 'type' slot should be 'Z' or 'R'." ) if ( value == "Z" && !all( x@.Data %% 1 == 0, na.rm = TRUE ) ) stop( "Non-integer-valued endpoints not permitted for type 'Z'." ) x@type <- value return(x) } ) intervals/R/split.R0000644000176200001440000000036113642043061013737 0ustar liggesusers# Cause split.data.frame to be used. See "Methods for S3 Generic Functions" in # help for "Methods", for guidance and examples. split.Intervals_virtual <- split.data.frame setMethod( "split", "Intervals_virtual", split.Intervals_virtual ) intervals/R/reduce-methods.R0000644000176200001440000000174013642043061015516 0ustar liggesuserssetGeneric( "reduce", def = function( x, ... ) standardGeneric( "reduce" ) ) setMethod( "reduce", signature( "Intervals_virtual" ), function( x, check_valid = TRUE ) { if ( check_valid ) validObject( x ) has_na <- is.na( x[,1] ) | is.na( x[,2] ) if ( any( has_na ) ) { warning( "Intervals with NA endpoints removed.", call. = FALSE ) x <- x[ !has_na, ] } if ( any( empty( x ) ) ) x <- x[ !empty(x), ] # In order to collapse over abutting intervals over Z if ( type(x) == "Z" ) x <- open_intervals( x ) result <- .Call( "_reduce", x@.Data, closed( x ), is( x, "Intervals_full" ) ) new( class(x), result[[1]], closed = result[[2]], type = type(x) ) } ) intervals/R/size-methods.R0000644000176200001440000000245113642043061015221 0ustar liggesusers# For R, size is Lebesgue measure, so closure is irrelevant. Note that we don't # use the close_intervals method here, which is important since this method # requires empty, and empty currently uses size. We need to avoid circular # dependency. setGeneric( "size", def = function( x, ... ) standardGeneric( "size" ) ) setMethod( "size", signature( "Intervals" ), function( x, as = type(x) ) { result <- x[,2] - x[,1] if ( as == "Z" ) { ties <- x[,2] == x[,1] ties[ is.na( ties ) ] <- FALSE result[ ties ] <- ifelse( all( closed(x) ), 1, 0 ) result[ !ties ] <- result[ !ties ] + sum( closed(x) ) - 1 # NAs just stay NA } return( result ) } ) setMethod( "size", signature( "Intervals_full" ), function( x, as = type(x) ) { result <- x[,2] - x[,1] if ( as == "Z" ) { ties <- x[,2] == x[,1] ties[ is.na( ties ) ] <- FALSE rs <- rowSums( closed(x) ) result[ ties ] <- ifelse( rs[ ties ] == 2, 1, 0 ) result[ !ties ] <- result[ !ties ] + rs[ !ties ] - 1 } return( result ) } ) intervals/R/expand-methods.R0000644000176200001440000000422213642043061015524 0ustar liggesusers# Not exported adjust <- function( x, delta, type, direction = 1 ) { signs <- rep( c( direction, -direction ), c( nrow(x), nrow(x) ) ) if ( nrow(x) %% length(delta) != 0 ) warning( "Length of 'delta' does not evenly divide number of intervals.", call. = FALSE ) delta <- rep( delta, length = nrow( x ) ) switch( type, relative = x * ( 1 - delta ) ^ ( sign(x) * signs ), absolute = x - delta * signs ) } setGeneric( "expand", def = function( x, ... ) standardGeneric( "expand" ) ) setMethod( "expand", signature( "Intervals_virtual" ), function( x, delta = 0, type = c( "absolute", "relative" ) ) { if ( any( delta < 0, na.rm = TRUE ) ) stop( "The 'delta' argument should not contain negative values." ) type = match.arg( type ) if ( type(x) == "Z" && ( type == "relative" || any( delta %% 1 != 0, na.rm = TRUE ) ) ) stop( "Only absolute, integer-valued expansion permitted for type 'Z'." ) x@.Data <- adjust( x, delta, type, 1 ) return( x ) } ) setGeneric( "contract", def = function( x, ... ) standardGeneric( "contract" ) ) setMethod( "contract", signature( "Intervals_virtual" ), function( x, delta = 0, type = c( "absolute", "relative" ) ) { if ( any( delta < 0, na.rm = TRUE ) ) stop( "The 'delta' argument should not contain negative values." ) type = match.arg( type ) if ( type(x) == "Z" && ( type == "relative" || any( delta %% 1 != 0, na.rm = TRUE ) ) ) stop( "Only absolute, integer-valued contraction permitted for type 'Z'." ) x@.Data <- adjust( x, delta, type, -1 ) drop <- x[,1] > x[,2] | empty(x) if ( any( drop ) ) { warning( "Some empty intervals eliminated.", call. = FALSE ) x <- x[ !drop, ] } return( x ) } ) intervals/R/closed-methods.R0000644000176200001440000000303513642043061015517 0ustar liggesuserssetGeneric( "closed", function(x) standardGeneric( "closed" ) ) setMethod( "closed", signature( "Intervals_virtual" ), function( x ) x@closed ) setGeneric( "closed<-", function( x, value ) standardGeneric( "closed<-" ) ) setReplaceMethod( "closed", "Intervals", function( x, value ) { if ( !is.vector( value ) || !( length( value ) %in% 1:2 ) ) stop( "The 'closed' argument should be a vector of length 1 or 2." ) x@closed[ 1:2 ] <- value return(x) } ) setReplaceMethod( "closed", "Intervals_full", function( x, value ) { error_msg <- "The 'value' argument should be a matrix, or a vector of length 1 or 2." if ( is.vector( value ) ) { if ( length( value ) > 2 ) stop( error_msg ) value <- matrix( if ( nrow( x ) == 0 ) logical() else value, nrow( x ), 2, byrow = TRUE ) } if ( !is.matrix( value ) || nrow( value ) != nrow( x ) || ncol( value ) != 2 ) stop( error_msg ) x@closed <- value return(x) } ) intervals/R/clusters.R0000644000176200001440000000271113642043061014451 0ustar liggesuserssetGeneric( "clusters", function( x, ... ) standardGeneric( "clusters" ) ) setMethod( "clusters", signature( "numeric" ), function( x, w, which = FALSE, check_valid = TRUE ) { if ( is.integer(x) ) x <- as.numeric(x) regions <- reduce( Intervals( cbind( x, x + w ), type = "R" ), check_valid ) clusters <- interval_overlap( regions, x, check_valid ) clusters <- clusters[ sapply( clusters, length ) > 1 ] if ( which ) return( clusters ) else return( lapply( clusters, function(i) x[i] ) ) } ) setMethod( "clusters", signature( "Intervals_virtual" ), function( x, w, which = FALSE, check_valid = TRUE ) { if ( type(x) == "Z" && ( w %% 1 != 0 ) ) stop( "Non-integer 'w' supplied for intervals over Z.", call. = FALSE ) regions <- reduce( new( class(x), cbind( x[,1], x[,2] + w ), closed = closed(x), type = type(x) ), check_valid ) clusters <- interval_overlap( regions, x, check_valid ) clusters <- clusters[ sapply( clusters, length ) > 1 ] if ( which ) return( clusters ) else return( lapply( clusters, function(i) x[i,] ) ) } ) intervals/R/plot.Intervals_virtual.R0000644000176200001440000000457213642043061017306 0ustar liggesusersplot.Intervals_full <- function( x, y = NULL, axes = TRUE, xlab = "", ylab = "", xlim = NULL, ylim = NULL, col = "black", lwd = 1, cex = 1, use_points = TRUE, use_names = TRUE, names_cex = 1, ... ) { # Subset first, for efficiency, and so that the maximal y plotted is # appropriate for the region shown. if ( any( is.na( x ) ) ) x <- x[ !is.na(x), ] if ( is.null(xlim) ) xlim <- range( x@.Data ) else x <- x[ x[,2] >= xlim[1] & x[,1] <= xlim[2], ] if ( is.null(y) ) y <- .Call( "_plot_overlap", x@.Data, closed(x), is( x, "Intervals_full" ) ) if ( is.null(ylim) ) ylim <- c( 0, max( y ) ) plot( 0, 0, type = "n", xlim = xlim, ylim = ylim, axes = FALSE, xlab = xlab, ylab = ylab, ... ) # Careful with non-finite endpoints, which segments() ignores. segments( pmax( x[,1], par("usr")[1] ), y, pmin( x[,2], par("usr")[2] ), y, col = col, lwd = lwd ) if ( use_points ) { # Careful with points... adjust <- ( x[,1] == x[,2] ) & !closed(x)[,1] closed(x)[ adjust, 2 ] <- FALSE points( x@.Data, rep( y, 2 ), pch = 21, cex = cex, col = col, bg = ifelse( closed(x), col, "white" ) ) } if ( use_names && !is.null( rownames(x) ) ) { mids <- ( x[,1] + x[,2] ) / 2 text( mids, y, rownames( x ), pos = 3, offset = .5, cex = names_cex, xpd = NA ) } if ( axes ) axis( 1 ) } plot.Intervals <- function( x, y = NULL, ... ) { plot( as( x, "Intervals_full" ), y, ... ) } setMethod( "plot", c( "Intervals", "missing" ), function( x, y, ... ) plot.Intervals( x, ... ) ) setMethod( "plot", c( "Intervals", "ANY" ), function( x, y, ... ) plot.Intervals( x, y, ... ) ) setMethod( "plot", c( "Intervals_full", "missing" ), function( x, y, ... ) plot.Intervals_full( x, ... ) ) setMethod( "plot", c( "Intervals_full", "ANY" ), function( x, y, ... ) plot.Intervals_full( x, y, ... ) ) intervals/R/interval_difference-methods.R0000644000176200001440000000117613642043061020250 0ustar liggesuserssetGeneric( "interval_difference", def = function(x, y, ...) standardGeneric( "interval_difference" ) ) setMethod( "interval_difference", signature( "Intervals_virtual", "Intervals_virtual" ), function(x, y, check_valid = TRUE) { if ( check_valid ) { validObject( x ) validObject( y ) } interval_intersection( x, interval_complement( y, check_valid = FALSE ), check_valid = FALSE ) } ) intervals/R/Intervals-class.R0000644000176200001440000003015713642045000015657 0ustar liggesusers# We define two classes for two-column interval endpoint matrices. The basic class # has a two-element boolean vector indicating whether endpoints are closed or # not. The full class caries a matrix with one boolean per endpoint, permitting # full control. ######## Class definitions #### Virtual # (R 2.6.2) If I add the "VIRTUAL" tag to the representation, I am not able to # extend this class! I believe this arises because I am already extending a base # class, but I am not sure. This tag would be more appropriate, but I leave it # off... setClass( "Intervals_virtual", representation( type = "character" ), prototype( matrix( 0, 0, 2 ), type = "R" ), contains = "matrix", validity = function( object ) { # Check main matrix if ( !is.double( object@.Data ) || ncol( object@.Data ) != 2 ) return( "The 'Intervals' classes are based on two-column, numeric matrices." ) # Check 'type' string if ( length( object@type ) != 1 || !( object@type %in% c( "Z", "R" ) ) ) return( "The 'type' slot should be 'Z' or 'R'." ) # For type 'Z', check for integral endpoints if ( object@type == "Z" && !all( object@.Data[ is.finite( object@.Data ) ] %% 1 == 0 ) ) return( "Non-integer-valued endpoints not permitted for type 'Z'." ) # Check for valid intervals if ( any( object@.Data[,2] < object@.Data[,1], na.rm = TRUE ) ) return( "One or more intervals with second endpoint before first." ) return( TRUE ) } ) setMethod( "initialize", signature( "Intervals_virtual" ), function( .Object, .Data, ... ) { if ( missing( .Data ) ) callNextMethod( .Object, ... ) else { if ( is.data.frame( .Data ) ) .Data <- as.matrix( .Data ) if ( !is.matrix( .Data ) ) .Data <- matrix( .Data, ncol = 2 ) if ( is.integer( .Data ) ) { # warning( "Converting endpoints from 'integer' to 'numeric' data type. See class documentation.", call. = FALSE ) .Data <- matrix( as.numeric( .Data ), nrow( .Data ), ncol( .Data ) ) } callNextMethod( .Object, .Data, ... ) } } ) #### Intervals # Common endpoint closure state for all intervals setClass( "Intervals", representation( closed = "logical" ), prototype( closed = c( TRUE, TRUE ) ), contains = "Intervals_virtual", validity = function( object ) { # Check 'closed' slot if ( length( object@closed ) != 2 || any( is.na( object@closed ) ) ) return( "The 'closed' slot should be a logical of length 2. NA values are not permitted." ) return( TRUE ) } ) setMethod( "initialize", signature( "Intervals" ), function( .Object, .Data, closed, ... ) { if ( missing( .Data ) ) callNextMethod( .Object, ... ) else { if ( missing( closed ) ) callNextMethod( .Object, .Data, ... ) else { if ( length( closed ) == 1 ) closed <- c( closed, closed ) callNextMethod( .Object, .Data, closed = closed, ... ) } } } ) #### Intervals_full # Full control of endpoint closure. Note that if the 'closed' slot is omitted, # we use an 'initialize' method to create an appropriately sized matrix of TRUE # values. We also permit vector input, with recycling, for the 'closed' slot. setClass( "Intervals_full", representation( closed = "matrix" ), prototype( closed = matrix( TRUE, 0, 2 ) ), contains = "Intervals_virtual", validity = function( object ) { # Check 'closed' slot if ( !is.logical( object@closed ) || any( dim( object@.Data ) != dim( object@closed )) || any( is.na( object@closed ) ) ) return( "The 'closed' slot should be a logical matrix with the same dimensions as the main endpoints matrix. NA values are not permitted." ) return( TRUE ) } ) setMethod( "initialize", signature( "Intervals_full" ), function( .Object, .Data, closed, ... ) { if ( missing( .Data ) ) callNextMethod( .Object, ... ) else { if ( !is.matrix( .Data ) ) .Data <- matrix( .Data, ncol = 2 ) if ( missing( closed ) ) closed <- matrix( TRUE, nrow( .Data ), 2 ) if ( is.vector( closed ) ) { if ( length( closed ) > 2 ) stop( "The 'closed' argument should be a matrix, or a vector of length 1 or 2." ) closed <- matrix( if ( nrow( .Data ) == 0 ) logical() else closed, nrow( .Data ), 2, byrow = TRUE ) } callNextMethod( .Object, .Data, closed = closed, ... ) } } ) ######## Constructor functions Intervals <- function( ... ) new( "Intervals", ... ) Intervals_full <- function( ... ) new( "Intervals_full", ... ) ######## Subsetting setMethod( "[", signature( "Intervals" ), function( x, i, j, ..., drop ) { if ( missing(i) ) i <- rep( TRUE, nrow(x) ) if ( missing(j) ) { # Preserve class. Note that both [i,] and [i] syntax subset rows. if ( any( is.na( i ) ) ) warning( "NA indices encountered.", call. = FALSE ) x@.Data <- x@.Data[i,,drop=FALSE] return( x ) } else return( x@.Data[i,j] ) } ) # Note: row name handling for matices is completely inadequate for our purposes # here. Lots of obviously desirable behavior (like setting rownames(x)[i] when x # doesn't yet have rownames) tends to produce errors. setMethod( "[<-", signature( x = "Intervals", i = "ANY", j = "missing", value = "Intervals_virtual" ), function( x, i, j, value ) { #### Error checking if ( type(x) != type(value) ) stop( "Types do not match (Z vs. R)." ) if ( is.character(i) ) i <- match( i, rownames( x ) ) if ( any( is.na( i ) ) ) stop( "Cannot assign to NA indices or row names which do not exist." ) n <- length( (1:nrow(x))[i] ) if ( n != nrow( value ) ) stop( "Replacement object is of the wrong size." ) #### Coerce up? coerce_x <- FALSE if ( is( value, "Intervals_full" ) ) coerce_x <- TRUE else { matches <- all( closed(x) == closed(value) ) if ( !matches ) { if ( type(x) == "Z" ) value <- adjust_closure( value, closed(x)[1], closed(x)[2] ) else coerce_x <- TRUE } } if ( coerce_x ) { warning( "Coercion to 'Intervals_full' required.", call. = FALSE ) x <- as( x, "Intervals_full" ) x[ i, ] <- value return(x) } #### Data x@.Data[i,] <- value@.Data #### Rownames has_names_x <- !is.null( rownames(x) ) has_names_value <- !is.null( rownames(value) ) if ( has_names_x ) { if ( has_names_value ) rownames(x)[i] <- rownames(value) else rownames(x)[i] <- "" } else { if ( has_names_value ) { rownames(x) <- rep( "", nrow(x) ) rownames(x)[i] <- rownames(value) } } return(x) } ) setMethod( "[", signature( "Intervals_full" ), function( x, i, j, ..., drop ) { if ( missing(i) ) i <- rep( TRUE, nrow(x) ) if ( missing(j) ) { # Preserve class. Note that both [i,] and [i] syntax subset rows. if ( is.character(i) ) i <- match( i, rownames( x ) ) if ( any( is.na( i ) ) ) warning( "NA indices encountered.", call. = FALSE ) x@.Data <- x@.Data[i,,drop=FALSE] x@closed <- x@closed[i,,drop=FALSE] # We may have NAs in closed if present in i, if any(is.na(i)) == TRUE x@closed[ is.na(x@closed) ] <- TRUE return( x ) } else return( x@.Data[i,j] ) } ) setMethod( "[<-", signature( x = "Intervals_full", i = "ANY", j = "missing", value = "Intervals_virtual" ), function( x, i, j, value ) { #### Error checking if ( type(x) != type(value) ) stop( "Types do not match (Z vs. R)." ) if ( is.character(i) ) i <- match( i, rownames( x ) ) if ( any( is.na( i ) ) ) stop( "Cannot assign to NA indices or row names which do not exist." ) n <- length( (1:nrow(x))[i] ) if ( n != nrow( value ) ) stop( "Replacement object is of the wrong size." ) #### Data x@.Data[i,] <- value@.Data if ( is( value, "Intervals" ) ) x@closed[i,] <- matrix( value@closed, n, 2, byrow = TRUE ) else x@closed[i,] <- value@closed #### Rownames has_names_x <- !is.null( rownames(x) ) has_names_value <- !is.null( rownames(value) ) if ( has_names_x ) { if ( has_names_value ) rownames(x)[i] <- rownames(value) else rownames(x)[i] <- "" } else { if ( has_names_value ) { rownames(x) <- rep( "", nrow(x) ) rownames(x)[i] <- rownames(value) } } return(x) } ) ######## Coercion setMethod( "coerce", signature( from = "Intervals", to = "Intervals_full" ), function( from, to, strict ) { new( "Intervals_full", from@.Data, type = type( from ), closed = cbind( rep( closed(from)[1], nrow( from ) ), rep( closed(from)[2], nrow( from ) ) ) ) } ) setMethod( "coerce", signature( from = "Intervals_full", to = "Intervals" ), function( from, to, strict ) { if ( nrow( from ) == 0 ) new_closed <- rep( TRUE, 2 ) else new_closed <- closed( from )[1,] if ( !all( t( closed( from ) ) == new_closed ) ) stop( "Intervals do not all have the same endpoint closure." ) new( "Intervals", from@.Data, type = type( from ), closed = new_closed ) } ) setMethod( "coerce", signature( from = "Intervals_virtual", to = "character" ), function( from, to, strict ) { if ( nrow( from ) == 0 ) return( character() ) else { cl <- closed( from ) # So we only write main code once if ( is( from, "Intervals" ) ) cl <- matrix( cl, nrow(from), 2, byrow = TRUE ) result <- paste( ifelse( cl[,1], "[", "(" ), from[,1], ", ", from[,2], ifelse( cl[,2], "]", ")" ), sep = "" ) names( result ) <- rownames( from ) return( result ) } } ) ######## Union setClassUnion( "Intervals_virtual_or_numeric", c( "Intervals_virtual", "numeric" ) ) intervals/R/interval_union-methods.R0000644000176200001440000000201413642043061017276 0ustar liggesuserssetGeneric( "interval_union", def = function( x, ... ) standardGeneric( "interval_union" ) ) setMethod( "interval_union", signature( "Intervals_virtual" ), function( x, ..., check_valid = TRUE ) { reduce( c( x, ... ), check_valid ) } ) setMethod( "interval_union", signature( "missing" ), function( x, ..., check_valid = TRUE ) { # Permitting do.call use with named lists, since do.call will put # elements whose names are not "x" into the ... argument. Stripping # names, however, puts arguments in place positionally. args <- list(...) names( args ) <- NULL if ( length( args ) == 0 ) return ( NULL ) else return( do.call( interval_union, c( args, list( check_valid = check_valid ) ) ) ) } ) intervals/R/interval_complement-methods.R0000644000176200001440000000365413642043061020324 0ustar liggesuserssetGeneric( "interval_complement", def = function(x, ...) standardGeneric( "interval_complement" ) ) setMethod( "interval_complement", signature( "Intervals_virtual" ), function(x, check_valid = TRUE) { # Sort and clean up x <- reduce( x, check_valid ) # When the data type of the endpoints matrix is integer, # complications arise from maximum/minimum representable integer # values. For Intervals objects, the complement will often # need to include the minimal/maximal represenable integer, but one # or both endpoints may be open. In such cases, we adjust close with # a warning. For the moment, we force numeric endpoints throughout # the package. endpoints <- if ( nrow(x) == 0 ) matrix( c( -Inf, Inf ), 1 ) else rbind( if ( is.finite( x[1,1] ) ) c( -Inf, x[1,1] ) else NULL, cbind( x[-nrow(x),2], x[-1,1] ), if ( is.finite( x[nrow(x),2] ) ) c( x[nrow(x),2], Inf ) else NULL ) closed <- if ( class(x) == "Intervals" ) # Note that we ignore closure for non-finite endpoints. !closed(x)[2:1] else if ( nrow(x) == 0 ) TRUE else !rbind( if ( is.finite( x[1,1] ) ) c( TRUE, closed(x)[1,1] ) else NULL, cbind( closed(x)[-nrow(x),2], closed(x)[-1,1] ), if ( is.finite( x[nrow(x),2] ) ) c( closed(x)[nrow(x),2], TRUE ) else NULL ) new( class(x), endpoints, type = type(x), closed = closed ) } ) intervals/R/which_nearest-methods.R0000644000176200001440000000671313642043061017077 0ustar liggesuserssetGeneric( "which_nearest", def = function( from, to, ... ) standardGeneric( "which_nearest" ) ) setMethod( "which_nearest", signature( "Intervals_virtual", "Intervals_virtual" ), function( from, to, check_valid = TRUE ) { if ( check_valid && !( validObject(to) && validObject(from) ) ) stop( "The 'to' and/or 'from' objects are invalid." ) if ( type(to) != type(from) ) stop( "Both 'to' and 'from' should have the same type." ) if ( any( empty( to ), na.rm = TRUE ) ) { warning( "Some empty 'to' intervals encountered. Setting to NA...", call. = FALSE ) to[ empty(to), ] <- NA } if ( any( empty( from ), na.rm = TRUE ) ) { warning( "Some empty 'from' intervals encountered. Setting to NA...", call. = FALSE ) from[ empty(from), ] <- NA } if( type(to) == "Z" ) { to <- close_intervals( to ) from <- close_intervals( from ) } result <- .Call( "_which_nearest", to@.Data, from@.Data, closed(to), closed(from), class(to) == "Intervals_full", class(from) == "Intervals_full" ) result[[1]][ !is.finite( result[[1]] ) ] <- as.numeric( NA ) data.frame( distance_to_nearest = result[[1]], which_nearest = I( result[[2]] ), which_overlap = I( result[[3]] ), row.names = rownames( from ) ) } ) setMethod( "which_nearest", signature( "numeric", "Intervals_virtual" ), function( from, to, check_valid = TRUE ) { if ( type( to ) == "Z" ) { non_int <- ( from %% 1 != 0 ) if ( any( non_int, na.rm = TRUE ) ) stop( "The 'to' object is of type 'Z'. Non-integral values are not permitted in 'from'.", call. = FALSE ) } which_nearest( new( class( to ), cbind( from, from ), closed = TRUE, type = type( to ) ), to, check_valid = check_valid ) } ) setMethod( "which_nearest", signature( "Intervals_virtual", "numeric" ), function( from, to, check_valid = TRUE ) { if ( type( from ) == "Z" ) { non_int <- ( to %% 1 != 0 ) if ( any( non_int, na.rm = TRUE ) ) stop( "The 'from' object is of type 'Z'. Non-integral values are not permitted in 'to'.", call. = FALSE ) } which_nearest( from, new( class( from ), cbind( to, to ), closed = TRUE, type = type( from ) ), check_valid = check_valid ) } ) setMethod( "which_nearest", signature( "numeric", "numeric" ), function( from, to, check_valid = TRUE ) { which_nearest( Intervals( cbind( from, from ) ), Intervals( cbind( to, to ) ), check_valid = FALSE ) } ) intervals/R/show-methods.R0000644000176200001440000000140213642043061015222 0ustar liggesuserssetMethod( "show", signature( "Intervals_virtual" ), function( object ) { cat( "Object of class ", class( object ), "\n", nrow( object ), " interval", ifelse( nrow( object ) == 1, "", "s" ), " over ", type(object), ":\n", sep = "" ) ints <- as( object, "character") if ( !is.null( rownames( object ) ) ) { fmt <- sprintf( "%%%is", max( nchar( rownames( object ) ) ) ) ints <- paste( sprintf( fmt, rownames( object ) ), ints ) } cat( ints, sep = "\n" ) } ) intervals/R/close_intervals-methods.R0000644000176200001440000000436713642043061017453 0ustar liggesuserssetGeneric( "close_intervals", def = function(x) standardGeneric( "close_intervals" ) ) setMethod( "close_intervals", signature( "Intervals_virtual" ), function( x ) adjust_closure( x, close_left = TRUE, close_right = TRUE ) ) setGeneric( "open_intervals", def = function(x) standardGeneric( "open_intervals" ) ) setMethod( "open_intervals", signature( "Intervals_virtual" ), function( x ) adjust_closure( x, close_left = FALSE, close_right = FALSE ) ) setGeneric( "adjust_closure", def = function(x, ...) standardGeneric( "adjust_closure" ) ) setMethod( "adjust_closure", signature( "Intervals" ), function(x, close_left = TRUE, close_right = TRUE) { if ( type(x) == "R" ) stop( "Only applicable to type 'Z'." ) if ( any( empty(x), na.rm = TRUE ) ) { warning( "Empty intervals encountered and removed.", call. = FALSE ) x <- x[ is.na(x) | !empty(x), ] } if ( !closed(x)[1] && close_left ) x[,1] <- x[,1] + 1 if ( closed(x)[1] && !close_left ) x[,1] <- x[,1] - 1 if ( !closed(x)[2] && close_right ) x[,2] <- x[,2] - 1 if ( closed(x)[2] && !close_right ) x[,2] <- x[,2] + 1 closed(x) <- c( close_left, close_right ) return( x ) } ) setMethod( "adjust_closure", signature( "Intervals_full" ), function(x, close_left = TRUE, close_right = TRUE) { if ( type(x) == "R" ) stop( "Only applicable to type 'Z'." ) if ( any( empty(x), na.rm = TRUE ) ) { warning( "Empty intervals encountered and removed.", call. = FALSE ) x <- x[ is.na(x) | !empty(x), ] } # Left side if ( close_left ) x[ !closed(x)[,1], 1 ] <- x[ !closed(x)[,1], 1 ] + 1 else x[ closed(x)[,1], 1 ] <- x[ closed(x)[,1], 1 ] - 1 # Right side if ( close_right ) x[ !closed(x)[,2], 2 ] <- x[ !closed(x)[,2], 2 ] - 1 else x[ closed(x)[,2], 2 ] <- x[ closed(x)[,2], 2 ] + 1 closed(x) <- c( close_left, close_right ) return( x ) } ) intervals/R/is.na-methods.R0000644000176200001440000000022013642043061015247 0ustar liggesuserssetMethod( "is.na", signature( x = "Intervals_virtual" ), function(x) is.na( x[,1] ) | is.na( x[,2] ) ) intervals/R/t-methods.R0000644000176200001440000000025413642043061014511 0ustar liggesuserssetGeneric( "t", function(x) standardGeneric( "t" ) ) setMethod( "t", signature( "Intervals_virtual" ), function(x) t( x@.Data ) ) intervals/R/distance_to_nearest-methods.R0000644000176200001440000000072713642043061020270 0ustar liggesuserssetGeneric( "distance_to_nearest", function( from, to, ... ) standardGeneric( "distance_to_nearest" ) ) setMethod( "distance_to_nearest", signature( "Intervals_virtual_or_numeric", "Intervals_virtual_or_numeric" ), function( from, to, check_valid = TRUE ) { result <- which_nearest( from, to, check_valid )$distance_to_nearest names( result ) <- rownames( from ) return( result ) } ) intervals/R/as.matrix.R0000644000176200001440000000023613642043061014513 0ustar liggesusers# S3 methods as.matrix.Intervals_virtual <- function( x, ... ) as( x, "matrix" ) setMethod( "as.matrix", "Intervals_virtual", as.matrix.Intervals_virtual ) intervals/R/empty-methods.R0000644000176200001440000000216413642043061015406 0ustar liggesuserssetGeneric( "empty", def = function(x) standardGeneric( "empty" ) ) setMethod( "empty", signature( "Intervals" ), function(x) { result <- rep( FALSE, nrow(x) ) result[ is.na( x[,1] ) | is.na( x[,2] ) ] <- NA if ( !all( closed(x) ) ) { # Valid objects have x[,1] <= x[,2], so we only check this case. result[ x[,1] == x[,2] ] <- TRUE if ( type(x) == "Z" && !any( closed( x ) ) ) result[ x[,1] + 1 == x[,2] ] <- TRUE } return( result ) } ) setMethod( "empty", signature( "Intervals_full" ), function(x) { result <- rep( FALSE, nrow(x) ) result[ is.na( x[,1] ) | is.na( x[,2] ) ] <- NA any_open <- !( closed(x)[,1] & closed(x)[,2] ) both_open <- !closed(x)[,1] & !closed(x)[,2] result[ any_open & ( x[,1] == x[,2] ) ] <- TRUE if ( type(x) == "Z" ) result[ both_open & ( x[,1] + 1 == x[,2] ) ] <- TRUE return( result ) } ) intervals/R/interval_overlap-methods.R0000644000176200001440000000217213642043061017623 0ustar liggesuserssetGeneric( "interval_overlap", def = function( from, to, ... ) standardGeneric( "interval_overlap" ) ) setMethod( "interval_overlap", signature( "Intervals_virtual_or_numeric", "Intervals_virtual_or_numeric" ), function( from, to, check_valid = TRUE ) { result <- which_nearest( from, to, check_valid )$which_overlap names( result ) <- rownames( from ) return( result ) } ) argument_error <- paste( "The 'from' and 'to' arguments are required. Note that the", " interval_overlap argument names changed at v. 0.11.1.", " See documentation.", sep = "\n" ) setMethod( "interval_overlap", signature( from = "missing", to = "ANY" ), function( from, to, check_valid, ... ) stop( argument_error ) ) setMethod( "interval_overlap", signature( from = "ANY", to = "missing" ), function( from, to, check_valid, ... ) stop( argument_error ) ) intervals/R/c.R0000644000176200001440000000537713642043061013042 0ustar liggesusers# As of 2.8.1, we are still not able to write S4 methods for rbind(). Our # original plan was to use combine() as in biobase, but this seems to be causing # clashes for the generic function when both packages are loaded. Improved S4 # support for functions whose first argument is ... seems to be on the way, so # we'll just do S3 for now, and move up to S4 once it's implemented. Note that # as of 2.8.1, rbind.data.frame() still exists and is used for data frames. # Update! S3 method dispatch for rbind() is non-standard (see its documentation) # and it produced unexpected dispatch to the matrix method when presented with a # mix of Intervals and Intervals_full objects. As a consequence, we switched to # c(), which uses standard S3 dispatch. c.Intervals <- function( ... ) { args <- list(...) # Drop NULL arguments if ( any( sapply( args, is.null ) ) ) args <- args[ !sapply( args, is.null ) ] # Check if we should just return a list classes <- sapply( args, class ) if ( !all( classes %in% c( "Intervals", "Intervals_full" ) ) ) return( list( ... ) ) same_class <- all( classes == "Intervals" ) # We are in fact dealing with intervals only... if ( !all( sapply( args, type ) == type( args[[1]] ) ) ) stop( "All arguments should have the same 'type' slot." ) # Check for common closure same_closed <- all( sapply( args[-1], function(x) identical( closed( args[[1]] ), closed( x ) ) ) ) # Coerce up if necessary if ( !same_class || ( type( args[[1]] ) == "R" & !same_closed ) ) { warning( "Coercion to 'Intervals_full' required.", call. = FALSE ) return( do.call( c, lapply( args, as, "Intervals_full" ) ) ) } # Convert to common closure for Z if ( type( args[[1]] ) == "Z" & !same_closed ) args <- lapply( args, adjust_closure, close_left = closed( args[[1]] )[1], close_right = closed( args[[1]] )[2] ) result <- args[[1]] result@.Data <- do.call( rbind, lapply( args, function(x) x@.Data ) ) return( result ) } c.Intervals_full <- function( ... ) { args <- list(...) if ( any( sapply( args, is.null ) ) ) args <- args[ !sapply( args, is.null ) ] classes <- sapply( args, class ) if ( !all( classes %in% c( "Intervals", "Intervals_full" ) ) ) return( list( ... ) ) if ( !all( sapply( args, type ) == type( args[[1]] ) ) ) stop( "All arguments should have the same 'type' slot." ) if ( !all( classes == "Intervals_full" ) ) { warning( "Coercion to 'Intervals_full' required.", call. = FALSE ) args <- lapply( args, as, "Intervals_full" ) } result <- args[[1]] result@.Data <- do.call( rbind, lapply( args, function(y) y@.Data ) ) closed(result) <- do.call( rbind, lapply( args, closed ) ) return(result) } intervals/MD50000644000176200001440000000712113642055242012575 0ustar liggesuserse65f90fdb7fb60396bdd5661b763151a *DESCRIPTION c6e176fe4cd6683b2d365f8eb34ac7aa *NAMESPACE 395419ebcf2325cd51382cf869b7ce5c *NEWS c1464bdb0e8865f61d0512cb8a0441c1 *R/Intervals-class.R b324268152a9423e6c65c0c988d6c54b *R/as.matrix.R 38bfefc3e9a840c8c923c89880c1587c *R/c.R 34cd12ab4fe68a81147862e97b15949f *R/close_intervals-methods.R b3eb24412f49233d264cfa4b59d7e2e4 *R/closed-methods.R ff9d706b9f496d57e129b6900b73f897 *R/clusters.R bf6fd3b2e3d8a0423e0d5cc56886861b *R/distance_to_nearest-methods.R eab17d98c078805adf0e123cb637cc15 *R/empty-methods.R fc7e40041f4ae6b2796830c2fa03fd59 *R/expand-methods.R af2a9dcabf565023997fdd01481ebd1c *R/head-methods.R 36b33045bde48137c282a6019157e0c9 *R/interval_complement-methods.R 90cc9b22d5562826c992b7e8afb189d6 *R/interval_difference-methods.R 521baba587949ec360abde100182c525 *R/interval_included-methods.R 1564356296f5c31f7f4b8e2af3f81198 *R/interval_intersection-methods.R 22e0554a7dd6017d28ed6af0b739a005 *R/interval_overlap-methods.R c4db0a892e9af14025c7140d24cbc146 *R/interval_union-methods.R 606491d4aac135785542a9ccfc8a3070 *R/is.na-methods.R c0676ed4c23fb7e3ddbc2943706e449e *R/plot.Intervals_virtual.R c98be2c3ff6e8bb290722d3b0d7cb40f *R/reduce-methods.R dd2d5638db27a01280f3ba7b51499ca2 *R/show-methods.R 9fb026e61d588212f18e5ce675e25b6d *R/size-methods.R f60a5d3db5f7ffdc7b2e2f89ad73aa8e *R/split.R 1f063de2558da95b89939fe6ded3cb17 *R/t-methods.R 269d9904ee4f9077977318a06c0ea80b *R/type-methods.R 68f0dd826dd4eacc4f1dd5b9563ca0a6 *R/which_nearest-methods.R 5e996aad9e13f0d0948c3c0f7d0b9aa2 *build/vignette.rds 92331b5a7c5d0c6c690134be22d279fd *data/sgd.rdata a2f1dae28510f0ca5a3cb5089741ff79 *inst/doc/intervals_overview.R 61b77aed42f5d4a9517527dfd20dcd9f *inst/doc/intervals_overview.Rnw 225f133c054b5dad01c81a7264385796 *inst/doc/intervals_overview.pdf 35de4238afd3ef852acdffeaee785700 *man/Intervals-class.Rd 0177e9e1b85eacda57458bfe8298c35c *man/Intervals_virtual-class.Rd e3e3202f6d824d8f23a435eb9ebf58d1 *man/Intervals_virtual_or_numeric-class.Rd fa157f068564f9751e7a820fd76113cc *man/as.matrix.Intervals.Rd fbfe10a5da6b8e08f574a14e7f6a3e5e *man/c.Intervals.Rd 90ca50aa8682d0b5d29a7296a7ae6452 *man/close_intervals-methods.Rd 2abf435889e72a82124c8500f4be5c98 *man/clusters-methods.Rd 75da89fdf7d4e884ff0d8d194d6e1f01 *man/distance_to_nearest-methods.Rd 1dba3b2837c85159bbaf2688ae0adbad *man/empty-methods.Rd e382cd554673c0068670a67278c6115a *man/expand-methods.Rd 096699acb78d27aa015bfcf956f4f557 *man/interval_complement-methods.Rd d5e010258d8a735cf40deb9f5a46dfaf *man/interval_difference-methods.Rd f294dea1388f4faa935666279c852ceb *man/interval_included-methods.Rd 5795101b91efd8d1858b2a883716d9da *man/interval_intersection-methods.Rd 97d415407f45afca6e23199e86def39f *man/interval_overlap-methods.Rd 8c3d9577d7b5ee414115951dc669f921 *man/interval_union-methods.Rd e4fe3b5b457265fdfc8bf6b6ff82ae8b *man/intervals-package.Rd a0f85d87af5844eb046f54e67d62331a *man/plot.Intervals.Rd 5c627704aac7e9dcaea89534d6a7a6fe *man/reduce-methods.Rd 27dce9eb576a05a2deaa48fd10c8c4d2 *man/sgd.Rd c02935db7a4e097bf4316e967f41cb67 *man/size-methods.Rd 4a9e6b81bd312461016f35fa3b3909b0 *man/split.Intervals_virtual.Rd 32a4b517594cd57c13e31a54ce542808 *man/which_nearest-methods.Rd 8e00c2c424c18850880d2273098bfa60 *src/Endpoint.cpp 7a32b00c4f944861c37a65658958b93c *src/Endpoint.h 60813f1ca40525d22e04f8e141623b12 *src/init.c 21e3c6ce0a8cb6f07ce6e0e0cc049316 *src/plot_overlap.cpp 07904a7e49cad3fa6b13cb957818460b *src/reduce.cpp 83547bba3939f547c08581e70bfed484 *src/which_nearest.cpp 477a72cf673ae334fb367f84bc7870e0 *tests/intervals_test_code.R 61b77aed42f5d4a9517527dfd20dcd9f *vignettes/intervals_overview.Rnw intervals/inst/0000755000176200001440000000000013642053123013235 5ustar liggesusersintervals/inst/doc/0000755000176200001440000000000013642053123014002 5ustar liggesusersintervals/inst/doc/intervals_overview.pdf0000644000176200001440000060012713642053123020440 0ustar liggesusers%PDF-1.5 % 55 0 obj << /Length 1467 /Filter /FlateDecode >> stream xW[o6~ Loa)>@yQ[߹+4yx٫_vJgBi=s b){?W\YnS<7Re-t/+;PFJٙdufWoQeuEEj=/LVh E( r%0O0H"p 5t[*n7yPƃ"#LiYi\liNl8ͭVw3*ۡ"E:\v\ 8NO`vED*CX]\;4(#%tH/vWb;}5Rh? vz%Ɏ`1pt~ lwɊh(}2;Cl/η J z[<| ZVv;ùoQ:G 4'аn0+ޔ> UA8"o"vi08"A>R c~ b̃2U=>tĜiLZ~yI<Ǥw,F^ ?랛aAݓgQLIFozUV1]i|^cRG&pa>Tv/%c jp0:%&4scrz/W<%gr.=0Ĩzl9T|C-60JJHRr^Lb endstream endobj 73 0 obj << /Length 1817 /Filter /FlateDecode >> stream xڵXێ6}W}J-( $@H ݶ@ڭmmWn\;7R,;y D3 3|vqevr\eN|&zu+hA͠.ib ZF?@wK | NDljLT$]}+qIh5t&4Lg] ݧh6stI M2tTتd2MT6t4Mٹ31 3~׶EmjnbRЈ{j`vH_ #r5-ۤ7 [l[g}[RXi&_Kf7fK_N?g]͡\LA&k>vL-ZEu  U,Y:SW@92EAKgдA_L3'4F4;ƒ.H+5Vxh7`L:wK?"Ta?h/c-*A[*}*2Ul"ib_v.n)Fjھ3j=͑E6w&CD h7m#NnwͧcaQyjE{v _aDiUuo5kAf  {Ni|]ii}Ő^Z)9̵'9t|"b~iW4(͝_;bXG-@ܪף'pMfR^BM˽7ߎr%h7V4Ta'8@29H_ U -HڬgV+or%Y_1j6@ФJ8˽jqd/@풴jK[ th;Mpyd݂aRW&%X)#w.=rG2 Pp.S(>!-8OH_p9 Kf 4O "!X"j7bbtb1C$J,^5M;Nn)KeI/K_ {{^ce_H"!#2L+`5kjM0UbǟgZLg8njSip ڸ,xD65, $˓C"Vty {ygN)Zm xKwIaz([cm,ȭ#[Ii{ < ۪A2ۋ |y!'d\c5paދwR+|~c>ƽTgnSő&"q%\&qĢso|g'48 ibZzl}Ї3K~ s$R`_^a`ܠ.rχ0o0I endstream endobj 80 0 obj << /Length 1400 /Filter /FlateDecode >> stream xW[o6~ϯУլHa@@ab[r-'M΍kiV0?;uVtʺ*+See˅rW8KrN_ouKs'iœ@/g_ŬR7>}̴)U,LV:\("{| iil_LޔlE@ p7a#qna060Z`|q#@CP L]BqDU+a?sʘ +]Ǜ@ku-՘NUi/4r] y^KMAw[ұّ8puG.> Dh0e  ^A>=H(/(d7ڛ+?W!Q>S+d1(|ۛ  MF͌R2ᑣ'E+5V&a_o>Ok 2 >BLn_Q*9Wu+s8RRnĻ@8lWA=>5Х(r$MV ~O[t`w**e'@9tл)i z`hG b^uAF} Kyc'4<@(l|$ J^F8j`ɤW=-pF둲 oxh}ǔBtW'EN*+~,RMDV&$wa9_O@ ` [G $n";1˖y|Gv9|2df]s$Xُ)EaMM-Zơ:IZ!mG~ Qc=6ИTI HKrZMl@T G}R_?KZVQu~-t"XEԇE-K^vߔRڸň2[+񴲞  ꢂU*s,l*3Nh]_ZtiШBP O'@C?gh9Om2QoV+B3/P†X1w1j CbOIFLjfe{Yc|?ܩO9$bo?g* nZ2uv76& endstream endobj 70 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (/tmp/RtmpAX8cn8/Rbuild13ea214973da/intervals/vignettes/intervals_overview-plotting.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 83 0 R /BBox [0 0 432 432] /Resources << /ProcSet [ /PDF /Text ] /Font << /F1 84 0 R/F2 85 0 R>> /ExtGState << >>/ColorSpace << /sRGB 86 0 R >>>> /Length 468 /Filter /FlateDecode >> stream xTMOA ϯ\gv<{A%VYR{g?,8h_>b5x?wShZ0FQmaoxvpvDJ/_ s:o'%@xkBB' 4sĤ q@& q6BBdGFl_7woyVW^Mہ`Z Q6BϠ*e|>Ofc~*MSRc\6r9X|K2ʄ!S&I]7 q Qb#cwSj3Y9]D5j~L|?(im1:&V|YF_lʾ˙rҌat[f;kyVV2kÂNUA]6k%cM Κ2jo+| endstream endobj 88 0 obj << /Alternate /DeviceRGB /N 3 /Length 2596 /Filter /FlateDecode >> stream xwTSϽ7PkhRH H.*1 J"6DTpDQ2(C"QDqpId߼y͛~kg}ֺLX Xňg` lpBF|،l *?Y"1P\8=W%Oɘ4M0J"Y2Vs,[|e92<se'9`2&ctI@o|N6(.sSdl-c(2-yH_/XZ.$&\SM07#1ؙYrfYym";8980m-m(]v^DW~ emi]P`/u}q|^R,g+\Kk)/C_|Rax8t1C^7nfzDp 柇u$/ED˦L L[B@ٹЖX!@~(* {d+} G͋љς}WL$cGD2QZ4 E@@A(q`1D `'u46ptc48.`R0) @Rt CXCP%CBH@Rf[(t CQhz#0 Zl`O828.p|O×X ?:0FBx$ !i@ڐH[EE1PL ⢖V6QP>U(j MFkt,:.FW8c1L&ӎ9ƌaX: rbl1 {{{;}#tp8_\8"Ey.,X%%Gщ1-9ҀKl.oo/O$&'=JvMޞxǥ{=Vs\x ‰N柜>ucKz=s/ol|ϝ?y ^d]ps~:;/;]7|WpQoH!ɻVsnYs}ҽ~4] =>=:`;cܱ'?e~!ańD#G&}'/?^xI֓?+\wx20;5\ӯ_etWf^Qs-mw3+?~O~ endstream endobj 93 0 obj << /Length 2048 /Filter /FlateDecode >> stream xڽYY~ׯ[8$URr*>ER KB"ழk R$XMwO_ًx"MvgY*mj6z'\G ^w "16ЄzY<[XxVONq~ ؤxr-VΙ/6T6R>g#gLL\7HM//qWD ޥ`zz)*#~N8lϦ7H3`(mZ ؑ#O lIL(CoN6N97!"/i22=݈B6csٲodT*] k'BHG1o&5栰7WCOZfn[r#{BmYJ.ɰ/#YD̈>k< yaĄ4p`#-8xlM>J").^MHn]ŧ&h~/wZ dT&7Γɠ\t|g߄g >*$(KH ?H1P?x>c@a7 KHCYv 3pׄoXF㋎.0(M*(wz]}{Tԓp2<%N֥2bLWoKlp0 zlyt /ɅmHeQ|,."`:C-{L\B">xBkjY##bM=_4Şp&m`2- Kd@E*Si_nX\v7 dc/65-nf*s~sk$| r^br |vCmJDO/`ms2ev~>9Ds+\)ׅuGϱHF]l.K9f̠[MS e9ԁ:I鵁,1əSʙc8>ǥIR|7QCW@8qNuݨ</T*;bE{ShO_GiJں.;B@$ryHPIP$iq_+LSqr()ym䶾Vp=BԖ26>5pMZr "#sKp9·ԳP# 3'.vRz |MKRfRQMIzA:":,(\=RIK+N:-MYpٿnv endstream endobj 98 0 obj << /Length 1266 /Filter /FlateDecode >> stream xڵWێ6}WA @Ĉ(Q6@6hVo"Ul]r-_Q4ZQpx̡tL%ܪ0|3o K!MiY'/޼ߘzzNM޼sAd.&U.6Aje4-ứWpFCs32?pW}/7<_]q¿yEdr}-%d@_2T䜜SxF& vjm, C7\ Vܸ* <# DZZ()Ec )8<ʓX 2FyD:1 78,r-$#2{˸I ĉY S%39L1yzCx;sIr<qVlθCNZ* <т$ب"1%i<-AQ^lϑ| }Fֆ"yK&Js7dx@WCE>nq&7ncm4ؽt\{Jw(7UËQh@NZTHP)aOFHd-YBWXbiY49T0|[Zq6r`^hZ \dSq|KΡ^FcI?I7IUv[%;KxRWFIlaT| o:Q2}!Đ_}S !ъxT&ﻣ\R/'xQVGѥν@zK+uX<\Pr Zҗ;F>ῈݍșMoG~>mM'&&_ endstream endobj 90 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (/tmp/RtmpAX8cn8/Rbuild13ea214973da/intervals/vignettes/intervals_overview-distanceplot.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 101 0 R /BBox [0 0 432 432] /Resources << /ProcSet [ /PDF /Text ] /Font << /F2 102 0 R/F3 103 0 R>> /ExtGState << >>/ColorSpace << /sRGB 104 0 R >>>> /Length 614 /Filter /FlateDecode >> stream xMo0 <6}m ]PР$۰?ʒ-Ȋ:v/eQ( 斯Usu6Fak_}1tKTjgx8w?`׮cpkďV9ah4L9GGqcm%ڠN<߷/?O$"fy˛/3𻹻_Fv|nD)Ay.,G8E"%*IΡpRx+R(<+eQ)x=avDo5O+-8RJ$_i%9An5JWidg"W6`Е\O+"irgn*r[ (^)m:%a 䣏zÊ>Tx 'iPat^feL|ߖ}Sk3R=#AvNO@Pg$;=ПN =6u-_Qtyq ⾬TLlB_ce~J IxԽC/t.԰bƖ=Cx yuP0(!%#ˠ,0m` endstream endobj 106 0 obj << /Alternate /DeviceRGB /N 3 /Length 2596 /Filter /FlateDecode >> stream xwTSϽ7PkhRH H.*1 J"6DTpDQ2(C"QDqpId߼y͛~kg}ֺLX Xňg` lpBF|،l *?Y"1P\8=W%Oɘ4M0J"Y2Vs,[|e92<se'9`2&ctI@o|N6(.sSdl-c(2-yH_/XZ.$&\SM07#1ؙYrfYym";8980m-m(]v^DW~ emi]P`/u}q|^R,g+\Kk)/C_|Rax8t1C^7nfzDp 柇u$/ED˦L L[B@ٹЖX!@~(* {d+} G͋љς}WL$cGD2QZ4 E@@A(q`1D `'u46ptc48.`R0) @Rt CXCP%CBH@Rf[(t CQhz#0 Zl`O828.p|O×X ?:0FBx$ !i@ڐH[EE1PL ⢖V6QP>U(j MFkt,:.FW8c1L&ӎ9ƌaX: rbl1 {{{;}#tp8_\8"Ey.,X%%Gщ1-9ҀKl.oo/O$&'=JvMޞxǥ{=Vs\x ‰N柜>ucKz=s/ol|ϝ?y ^d]ps~:;/;]7|WpQoH!ɻVsnYs}ҽ~4] =>=:`;cܱ'?e~!ańD#G&}'/?^xI֓?+\wx20;5\ӯ_etWf^Qs-mw3+?~O~ endstream endobj 110 0 obj << /Length 1685 /Filter /FlateDecode >> stream xXK6WЃV ߒ@4@z)Pmh?vY[ ۻN3CjdKME{ D7Or7TN.VP br9jvu75'D"oHP D g*7O+ZRM %EeBʕ|i3kB+aGCʊm''i}+%v?7ؽ+\s~-Cm记GBkBAᷡx#Y?Upk3< C!5kIي$mG Bi:`6̘]=aP5fШ~ɾ 3̭)s;o5tMc4f4qa'FgAW#+ALj jRH2JAZ( 8[Fe@)o)dbW%y;K% KvVrƕB b-| a".toiV٨YMf~%XApЩ$6?SY!Sfѥ f pWǘ֧'x)=wbV UմY,ny?hk,&طˆ|dd"\O(gS1^Q'Kjl  ˣP ƚյW\&XAKS^ǁRm7ÑjN㮟u$-Y훰ٲmF)ҝ&ƊG:5Ts'6IJNG>Q(RG7#bJ=XƺbA 6 6E&Iq+{M,`R2Ǒ̾:bN,"[ 8ˬO0 cX=yRߜE b"E_)iaن43W}|+qtX?˜3U—p'^Qw% 2b#݋/^ xn endstream endobj 114 0 obj << /Length 2165 /Filter /FlateDecode >> stream xYKoFWD,|M-b u܂($dRe@1;V48T.3 , @bv]z?WᝯZ_y%| \(K-|)=.DY0P^ӈ6Wx#z_];< N ։asc{l2+W^ͮAi6crjxq~XlzTqVXڧXTc6(<hI;䉼9ʻA|+AL5uFdڲ3CӅ{UҒʬXNPֵڠ6?ϣX&!<sNxPlN5݋b9H5+)ÒKĢ9y*F!ӳY6`} Ms +0Q<ō?0n%u#Qyh(AES(! [U⭎W+ X{% >RLJqq[ ^5R;1Ǹ:!a^"^m93vC>qH7] NZ 4p щ'Rxr# `j{z=-k"&Mv5/P,pP.SuÐi%n@[!>0lK۠0jFT m((4nnS咂=5EB~gż}ז ^.EBLڄpp*M#c˷OYҝ:3Tsf#j<aTŠU \R]0žo"1>6k1A N $Kh87ThA EcȺNf1 I,c6 d:QfL/`Ef,܈bi8hC1 xMPB4vjC5ȡ$-HushQudc)ei`ف-30>E],ؚƕ9炛+WT>"uTsb] =.s/ؘиLg-44 􋹘Kj=%ЊRe:6 UnE;+9€z@ Vj!M sl^7DWdg|JsI8YH"etQf反(U̟0i65eA 5g[4q.H}\_o/4wmBT*]n6L{܎cu[LS]ⶀ݉װʂ(/\4|. >Wc=#DZ;$*t6nj7 M7! ˡ1G/8 H1*m% asYv>gA"pV6uq:sO|sk :J\T%ve* hZ%/rb3tV[%y7Z#e\SN";bSB5=Ⲑd*y;<ĬYgj"N&Nrma\Q+Bؾ&@_cߊ>8lUX"( I/__U>)uvpq= tR*f/Ob2^3IJ iOoN mZ&j RDŽ"yLDa/4\?V?I䫇+7˿ߏ߁n݋^yVԵdPr{9olci.M7)[n슳Q{{12Oިqѻ%Cgo. 0 endstream endobj 120 0 obj << /Length 1790 /Filter /FlateDecode >> stream xɎ60rXEJ ^ bcZLя(Qcɳ$@(o'ŋ߸IyO.ؚ|b^7L-DswzR޷Ek_u~m靧'lZ;]#bqOpk*)!/DU{jeͳsaj {=egtN7-I5 LO:fL_)HU 4MDžSI>m 9BZBhB }OQ7D`Q}@KX@ ^[Fs҅O9TX8nX5< T ۡݜ:UŰe ɡN)j<8> [8dhZ|.4 ]4>wފodN!Lt1E츈3c<[3q8=Wdh mSwf.kA+R~5KG]dHC\"@qFz NzdL[3HLJ.pRqb@!,&M%!WvRN%nuf:J^n&$ pU7W@sa!즻_]RwoJ8W(CziXv4SQS}A'Nݩ4`1ܞ4Ib g}ڳ|}uMK9'@g9"mob XR!dT${Y0&ӄӂo*W$88!C5gY)؝[mӚWLnrPL>K p݂iW HE &3'v" ؽ;uұFREat7m2[ Ku&(ew87л5>K8r ('-q}ZN?jy'xtrgHdL\4*¨$OKlu(IOɸ[/l}.{^;ܦK_x s?4O?4X?f'?1teա6sLK0qӭ")^WBS ot;%L{Y0/kJw)jdAy-b⇋] endstream endobj 124 0 obj << /Length 2180 /Filter /FlateDecode >> stream xڽY[o6~0XIu6@l< Ŗ/me~΍e+N}`L也O^IAƃ@%&Tq6H#*.'QMp?U0[计m6nЖjh$bRv!Q}gxcڣxY8@!Vh)G"@G<`5Ӓt(~.P jtŚWsς ԬlZѪjӷ"dMɓʆ.<=tE oq-IE]!5*HY9>q$ƃm8k:6͜ŞTv&sizj[v6 / (B63{BƎ_f)+шh&4'a_w\̝PIdm9U&QU=nt\HWnTɸ /-~ HVP܉qݩJS GTc&OLI5y=!}R3 Ü d΃!93-7'LQ64=i N3]7/ZY!%}K5%:m0RQ֭x\񆠲aPozC Fw%5_ĺmǣ]YւV ScܺJ-F|H?W&Kw5Tg'rc~%0.>e2uq`~!v8ˏ'<-s|2Kr]6 4nav0cz|xA@w[r]b^Q0)S/T5% \s\g4قƒ 09I{S,d@v/f3a2HIu9bS(@ jP/ȝN6'twfbVwAdXOR|MU6!Ig<'8JV1Uo8LHkstn-<9چmn^0"۪ٚ#iT;qF*̹ 2GC.Je8==%ƞeq#+١DYZJNGj[Ց>Lh<Cq)U)/O.C88Mruo9L;E-+D rbp1Iu:s]蓔[o=M\V7`^e{wi  yK,ɼP^:M?z}Qwd}p|MoJX6]\0=dV!=~\\rN΍7%a'W6MBmS^_>Z endstream endobj 131 0 obj << /Length 2619 /Filter /FlateDecode >> stream xYK۸WT&f;$Nv˞JUH֒Ԍ?>Jrً7\yZʕI]MsU^ݬYz6ϡ5y}_/g:O>B~lE0:bM?*y//޸2-Bv5]]sCz672YB"YQKn&5qZD,E|^D[J7IVs * K,uaY? ~GY>Z4+!+ZR~bw5 %HN2Y{,MkQ Dk!ogMu} mlf14ceȾ﷤A/Ȇ̴ Q$WX027nE˭`taHVْsF{ǹlo.^i;ݜldJ^~~#?@.t-qYn$ :L`d-;'ͳ<imY]R+g`Sv;,HlئT]G=ۣF{${[3ia~?uN|GWB' }C` @ Qy5qs$~MMFsTr e{ek:œ2. ~8 }X}J$;ucEff?0*O~;u5# {Umϧෞ"ˇpE/l8s_,b+= 8;tYMIˬJw;VgG>(RYRL@YZ.N,1ұ6c}-NywZӜMK"DEXn:n܄@>?sFnH QYص"l=gN9 FD*pPnQtK?5k2TE誗aשֿŘc~>p a+A fIjDy=XZQ /T.AJKc fk#hy&,V< 䏢H!-! 2og6Qi(EUogO4Ro)60'~vs~e ~exwvwz'lzRok]&ę?󣦀K')/^J6qNRՓi9+Wy4ߗYmc^M%'iy3^1>AY":*0łߏ0|V[=@{*Q]qpsABŜv;dNCp +'(5{#+4a A@X2go<m f0"fgeXϩX>ĭ$ 풗2O5 {!!w˄U&J[0+\XmY34hّckHk#2<]"f.+lb{#Wi췯mlcĞPFFo9PbOZh8"I`?ø'Jm TdMϜ'u"шxr՞`F,n9Z ;̃Hp8Lsv8F%A'/د 'X^\stn:Z M.f]ʦ}m ˻H+]*is%6(IEGLTy >yZhu\5I(;`\àj*q"Nrw|f:!,UjH|ލv ᭍c$RJIʪ@o;JAԩ<m [%&#C=2=S[d/ípwD ު:@Lu~5De֎H U$͇,\Р4^@ l3o C̜"{0߃)6\ *78j1tPrZjsʉ?|xhWw!jeEw&$ ]^@D鹰t !Hö _`J$䇌U0.{I ~Εڥăr9X[8GYq>METU0#8I.Z!386"SJ9X:߬߼÷2$ĐǏJxB t~,z=]L܎T!: 3sT]v%띮u{Ҟʳg.u63_0CDX| 36b*9 Z{^ azk4쟘w:~]d5d' ƟOoL'-gIV>AP<(XzV͜ Y fEҘ(EceCK.z="kH y؆ū 4ubVO7kH endstream endobj 136 0 obj << /Length 149 /Filter /FlateDecode >> stream x3135R0P0Bc3csCB.c46K$r9yr+p{E=}JJS ]  b<]00 @0?`d=0s@f d'n.WO@.sud endstream endobj 140 0 obj << /Length 113 /Filter /FlateDecode >> stream x332V0PP06S02U01SH1*24 (Bes< ͸=\ %E\N \. ц \.  33qzrrJi` endstream endobj 2 0 obj << /Type /ObjStm /N 100 /First 797 /Length 2218 /Filter /FlateDecode >> stream xZ[o:~إx,4IsZ8gAT[rF9ĹXIH7ᐬ"I$O6PHI0/@Z:RZ1ndEYu( Y4KN)2Y$VrId yZ跎RXOJȲ)!WtIiɼ3` 805_:A82@k %oo"ACP#IG 5/f4@PH|PĄΦA^.W|{`"Jt&G W*J0TVKlHGh %5RP:n  H̄Qc&)63Q-@;(6Pc[8`yhcRh@@)\b$^@u`%f 3 8ǶXf˞؊-J'|< W`>&5Pp.$a%$g N [s%<%0x[orA|I{~>TӋE1lj& F˶d/5.۩Su/-v]^zΆw _/jx7vZrv3^NFj('ߨRԓ|>G,|دXTP Q>orv\,V5gTNbZ:gBgN΋#5MrX{ƘCggʖ_S׍rl\B^%l\/هo?bUx,Hr+ղD,bTWa-Z%bO X6٬Kz'>(}~X s8spVpg#t$Ͽj$8@*\:$SK Axs8~-r9!ϖ^ZbH:,%QP حZ.9pHpiUG媎^בB$vUŶݪMu4aMT"\b=C񵹻KZ7 )]ZV1BQnnܰ2v޷ͭ)i(loh)?RZi&i5l&yG?S9\flNZp@^#9Y?P|HڒID~|8Ň0;_Vܷs^Beķ?<[tGCVuj~]qG۔ 8b%ԾwǾ ;QreԶeK| e<&$<, s_ . 2x-xȟ!& )\4hO["{&Z{7{XZo=7-G-7}~M7.xP÷xjEI3(Y)¥k%{m (֯:scw쫾ibv <&(Es)~,GͧEXzmhVqi}\|iw(b,W|'๏z{mL+c٪ qXRC̪YXw?"fdĐP穇H5J endstream endobj 156 0 obj << /Length1 1829 /Length2 13167 /Length3 0 /Length 14312 /Filter /FlateDecode >> stream xڍP  |up-kp' e9{yWP)1$Xyb ,ff6FffV$JJuKgH b`&t~#*d]l,lN^.^ff+33`^89!Q;x--@mB`3 b [ @g [E @?)-xN`sAz@L PڂnnaC  6& ;;SV&#PrE@p,,Mw, :<,f6 <3=hghdtZJ$ETldiGLy;f ;S1{[[- s`r,LhŁI$#7̈́ `ff w ? {8ta~` t. ;!L-M sK;Af[tƏOofjog+fVR:EE^ Vf ';(-X;3{_r?]&g9M޾X?!,IZxx\-PK6' |;s;TqˮǢXځ,xXmL^No3 <[R-c}a  @z7by[GSS `bw~ 50#q\&?L!6?_S/0AoL菮LYLAV![3K] x r,9LVolߔքRo-ٽoR ߂_/,oœIEx᭖9+M˿[o{C _0Eoed`odU~W-Bư7!0KLpy@OJIXݑ^&}:nmMPi{~2SkC1np2XnA]x[3K2хM9έ_ʽnte,daOeSt!J#R/h28cΙ}v+kT6$Kg5~s\թ>1 4WYE Ly9Mr_e|pP @|,74ɤ"#iW0eYB%Ha3Z6)]GIəFw| >/K [[ _Χ{82ഔ-v\R/T5eD ?RI7HQh Zqnf ,ɵLTAQ#e~ @(Y\$/s>:G;fÁ܅,)*FB2JpB77nDͫF=|sL[1D*FE%Y(N o5:L̉7#0>/F>|5ei{2C;Hg>D:%N`R>YaR|'u[gmh:u*?U]d>(X|*zdZvel-YX^dfm*DkCNyRFkuI{~v`^Me-c]QJDP ZK/ 1O~%1rqާu4$P 6G*(PN2?mWmn y},*J, ` ::ߨ_|ㅩv*ɚk$>::á P!{FO:m\Glnt_je$YE'4t!Ml L;*>??S}IQlꬳ&HR(j LYE||_9$YG&efEw28k$ܝtنB ҈L-"=k_ٽL8/pm6WQ(5t[ReXoZjs[)JSazBZZPU*lz+h*oKp$Z,(=S; K4c_.:#'elKA ӣ]YD'.)42zC#R y#4]_rQ` gxe[c'Zq@*jɢn<ٚ42d& }9bߑ\YT/GV)/ ['(DME6ie&t{ļDD/*#VY/*38q)3M)|b} \RcI5 J":X{Ի'6"]n>[- YGpZ}4V9CB& lp;\s}~@+<$dy6Qo<FA)w+mK+&^ᆊJt.64EK8gIOf}4caO֜%{wE\}( :{Ư'Qڪ(FL+^} idʮ)R7VunS&3q_]{xs5)*&^J$%v}ToG(G8>n L^y̌%vtv#Q?߾xz,Ѽ>V.nr'w4lgRX!LgL%Ǭ}~$yOm{1Q{ %1_b|1\W>O)>k!vWLSӇK lAOĒYR}x8VTg4&KяR#˒*;v{MYp3␍ Ž \$-HwVPԝ`%ZѡTK?$U1{ͤXg0F,wp:D3 ]){`N>ҰӼL̉U^.# }>Samb&{?)}m׾kK IM,Cϻϸ#ij4VJ@\@?9 l{[ ϡ2.~~bk +reo"w~y/'!N>}? RL|Swb{ZX3B?S&Ap)N\|5%h+'# \$xg_XiϨ2cWe-=niCEp A7T$Dsq<`ߢ Y쨝lTwF=GH\ֻ?g?f6`&ф#_V.N9/'N82cz?W(1tJM]DplM/2]|wUf2bu-HL' 9n_/jrYT\nR?2?ljO+txtdՓ ٺ 1uO& dGFT:#b*[߸4t"Q|уVMAsGdt{yAޏM~=z\ !xɳ-)×uۋۚE2٥窏s wh>>,두- ;ǢȢ@''|3gc)qV\ZGiu3pu#CR~x2EZ";i՜BU؇PGJr9n &I\0DCr.>@!HT5ˑi_Nu`!Cȫݓ<Jd$5c@(I>V/qq6cI~5gJ^=f>CVkmP[kٍiƅ'_|(}`ltAXy+UoDPsxCMn^-S{j 7# [u۴C#]CoI 0Y8 "/uD31^XFy#x9>YmЄUUDY6JUKU~,ހQ%k ـ.s(/dK@@IBikLUo?2Uo2\B\j۳RJf>P*cuC "^ۺ=z@(OgFpߒ]<\/oi|tgq2,)'ca]EMpzY}ζSܑ>an ]Mz y {YYc#nx ||ʓhrcu6Db$OjdTG)"U!-TRrO\EZ/m3G );tukCBx+g62wna\oV!j4NϊUSe sS$)]*X{pΌf?ߟ,i Z|1vvIYg Ŋw v$eFX uM00Y#q G[ r*d$sG2һöjy[$ V3 3 3yy=4u>f=}1kXZEg䒬-  ojOPfEsIYE7?gbZ`Rq2*h1XPm}˹t!uG;XafS\d(K&WC5}g*WX;DCre?K%!==%CsekV>"| 5i@q0Aԇn`(n8$oEѼr<6g{\'| 0ӵlK>3/SJqP5fTmBe'D ߳}Je1 Y0Z%و3pjا =5$WcQګݷ>Z)9k JT&7z&(Jh&y5biqm !cm&i 7yo(PE^uV-|'UFLb|,fin1dqp_,Wfǀرt95Igc ,=(A;vR,_PMPShQo3ҥ̏sl,5W@B40"~5Z<qǻj$Lyn,wH&.P$S%lE0Ό|љы}, &X~ oF1dk 3mtgX rA+S5Fb{d ,z\& u:ҜuicƧ3w1Z}&! me%P&ze>Cr:55҆}lҦ KctGjԧm>`{y MUHS61ZjSկkC2cR=)G<Şz5Ӯf w3XcY9%ں|$LS i|ﵮ]iζ Ç|ŠR7SXq6x|yY`7^ݏ/놆>U#Ol_`y>B㛂9abH6SK7@5:kA⡜Rv?cV|7{u/C5E:#(NIA 15a}.UH")z\4Iوm#$ݗ)f A~B5'&%.~zu2Q:f@7]e0@cbhֵt͌N+ lPrT79bp<TN-I<1;W(9_ecG~;wvW:Kv?*?2uxvG}lִ#ze~\Wk֣#8,d xdQ G&pcnKB; ?uzf*WXt^xY,h]ZǴ7H*ѷV4#c1)AJT^FC-KŖ͹wĩ|m{? Em˜0~<1 \@ƠƘggcnEf_!慄u%Y#^g +CLx.<3 *+ӫ??xUX h59"Q-]ee^rZkjn :"̅LTt(b/n7)GޭU]$mE! %:2?&Kѻw=#? [^Pp"9CZ3x/[Y>ݶ(c-D8A' 'Dt❃Ŗg1xzYv1s8F~qk[},0Z*9MjZBٌrdGꠃ@t tA M0: +eDs0U~\03.)^b&oX,NgÉk0V.V#`2#د[$ݳ5=ٮ։Wd9ḞzNUKt?Bw\mWZ ;»\V^22\@;iQ}0~bNiKm rU%99ݝ ((5N b֏I9X_z6TnDuV1MD ϙʶ-FE,DG@4_D% n4bb눯;R gu1%C6`3S<ـNMbK^4FBR|~ U# sxu#Cq_CPYt. )0'$" $$Z]ۗ(5b?f 󘅀ju" Bs+ɘ31Z,uQL4_2A h+#U [$X #2gEgsu+Obf7QJs^ eү~zDdԁ ³ʄF 3LPiAc;6,V~Q1@a:~{Ik] bZ[=K*Q3`:䑊'z3EƁjל8U:qH vYEV)yŹwď|hzGcPv94B_FX.rYh4\:k @)R;XRO?JxsJM=-L #ǛR:\]ËeM<ɻ^NB %ݤݬm2 %!X TV4/>-PYąCf *5WXɴd W:FqͮnI&m틺b0gsȅg!]sF )Lĭ X$̀t,<8w;e31ܷfJX "_hOe\o럯0Z~ 08d߀,?QHYv6 Bk&^h%n7q)h.u[MJ 3MiVFf_GuFj_ֽov$k$:$Ķc资zz-Yak? sLaKE_ 5bÁ_l|k[ x8v-Z`Ƴ,WPRhK^L!(f*S(7jS\yCZQ6S8nLJ]5P :7m32JgEfj p 31i ӾSA5f?PiRVKSwj7*旧"%<( M9~T7:袅n A&1:xvEE uh;⯓5uE%:>V2&GL|W\kN fӚ_щ6,G#:8%o=;ٲX+Uai Y0]~[w4?ҤFe2nHW zl%εJu%Z=!#*ism'1?{H-4#6D%.goJ#s} wĎ8Hf hq ,wkD͍,E*"l}}Taukec4xNADo&7PמZcEk]a9ǢvNeى/n^jI 6N硖KBq'Ws.a^Pxab(-pYu+AQ UӋSMjxxKkκF%]Kً8A;E4%z#Dޅ&"M0\ arȯ䓞q|_:-Gyۈmc&{QE)Sf2qgJ(Z![Nb|3Y4Tec3\}ebd_AaY%l%?+jpwsqE;q xwVp e}4yaБ/҆}~A߶33+2j$jfڰxGsP O'K 8Knl#@~/lx ͅLlIQ1f-s[h.ؾ .ky#YSs6V9o_cF?V%)AgTAM{eFPhE|LŲfVhzY*AS;FL9'Ec4u1DJ`2rXf~WZ25_<@~IَS7%#\ZA -7w&b:O r8rDݢ^؃铞O>`٨) !~ka?ݶ%W"7{;Ҳ)oO/{?n*5DIv&Io4nFhwnF۸p3r OFL.ݺBn_ :&ma|AJɎRU 8CǤhkH^?S[ü`:KIrz  0/{J$ђW4$DgAqrP8GCuR8̝wOe wfѬ |? MZpV\XZKQ ޕ2|f]c34>EH P"scxW p֑,A]J|:^tYpK8 wY'C'~-/ߩ&5opJvg0] VS3C#tسhl)Yڨ:MxDdVY^u˼ɮ)? m?Ba;~ Ӻ/G0/rEt4O|ܷ4!8Bq 4yiIO1i ^Jo2$ZO9n?+:iˆE}6(V1G MCvrXT+{"6}&)~wb:o@[C$Pjfb ՚EK-.B6?Sdm!NZdQW.}h"lYSѦAU'Ho ;`tNNcP= Dv-_vڅH̐!1h*MH[<^:I3I{SK jp >ibպ1D R#7c:GdP-_!'2E 9ՓzϢ8W*Ȓ#=|/޲Lpv 5#WJPୀܶ|֩su&+TFaA>A訲bӽEAG߹Cuq2eV,n} a7[" endstream endobj 158 0 obj << /Length1 1917 /Length2 12398 /Length3 0 /Length 13583 /Filter /FlateDecode >> stream xڍP C+ŝŋ Hpw/nNqwwRȽͼd&k?P*2$m L,|1yQ-V6 ; "% ;"lW=j:@2NVVv++7 ?6|q3 )llf掯+Ƙg:@d6B@Gs@+1?%hm]\\L6fB 9@w PZƄH P3;P1utڃ+11^OJmA `=+G!0d-LV #1#h`tFH( `lut`r[2cX[ 'ݍk qx!&0qeV@Ǽ,,,\jljn?_9xyL_iD3h"++l0!T5L¯ ay+*bOYRIFIFouڸ<9lVVv^7' (O4WsOko-W4]L? v$de毀?lwīr_@u 7TX_#uD fV#A 2Q;%,RqqYYXu-_WM.)11c8@{{"˫89hrSf&k ' `0xE,A<f"WkM?5z+zɿ +/`6_l v'p'x 1|`/: _+1Wf@WW6~}QܯھnͿ`}_5گ9ۃ5n]l_?۟gdozy9?r#.Z|l!paLeXosGOL_IF[ٖLqT h2ۂ8?w(RGQ瓝&,;'T[^)ך{\H%ӌ~FsdpDt觮gg3'^Hdb~G{hoE͹9tQiB=HY(* /0%ҟoj{&X(i'V~{*8XyRt觕jf;.zV wA.r{xl}p[HrOq0\AA"^N4um܋E6lG.+Q3 )BΥ#!I(!r09i&?Q`4AqYuwԗCe}o6vMJt@SQ)|2]ه0r6՜*}F£e6߹+j%"ک/H?M*EM|_Q:"?aM/e׌ eaZ%HRÓMV'hKW?@*Ԡmum3TGRrXK3$O1{GvVD͡X>X=TխhshX!mT`L*N[ѣ?tj$Çcl[(X!XU<,h[W|Xt:xXÊ[FzG L ؇2 L?R!c^57cهdΪk_L٭oV@;.I4c'[<=ȳrWE_ oyo<g/+ 55RU W|].PJz@/{{gY@w~ P5oZ^DLFL@ol1)ཻtV(ߗ}BڥǣkQc<[J1p q˩/\_x %: hbnix qL8rִ8J`[81HOR$eJtg1qk+RgG >1 q_'45?,jg y X]]$1H0V"QOy5< ʑVRu[(P$o7JPej|Da9X0O-h)rT+j|qp&DhSg$=p(`|u17t yo&A떂hDFP OTw-~E@iؽxk9ukホ]jC!Sz 6 "S\9j(򅦛+@e4ߴJV: 1ʴ}@2" ɽ6>-6I+pTf IJwI1\"s&r0(jYT^qP w#jڏ N`(>ݥv 80ryo, V:^ J,a.AdoS~rVRxU]^߶7y`=:]))֝8mn$Z [0mFzu r6@lRXv@sV&ЗgQbrM{INu\g`UݓY>,Ca푗aoI;wl U7E@yLg!-q7x0!!{^,EfVUtqn5zQjR߱~nTy?-*GΥۛ^J?rr$o/9c}ǖQ'4%k=0PrQM(& ;2k-Mtt"\q4*z. Ai~-k.%A?*ɽE{]’quFʑ(idjOxR-ʚ*_(֪T2ւ^}2#ΝUJ",7:A^gJ{TDiUkrQѽX!$VMNy1h/BX3T6\J|r,gza*9\( 5m|8F%Q_ 'l s=G!}Q"Tꂤ :JܧVSiv:jaRxP)8~\.-A1ևv)|5h}hH'Лy,F5vyEJqew~mjk lx Q})E#P.0l^e_L)}u}m\H}Zh uܘUIz5f*KybH"H݈mZwMZ!l;:;\pĆq_7loH(#ZO%ۼSE*Sm#&*b=(ƇoҼ*ZŢs(y7e/R[ p†||2 [>[PY#ot /D"`lo '!L Y!f'FGd U"+H^MP(. <|!Ђmrx$oKw#o:S\TRhu؉7 ۮ܉g\/@ҋ0/OHC CN8F9R5+OJ7źFsc17Q6h+8qEU5@2\ Rm*"f{evI #ڬtN*Rv$oU?NֻO?9 Ft^N} ѣ:YF=5 OaxenKeg |ןmUv9Xjj3mК~?* -`t(||xq 'JA DٴA^t>qIE{%+)pͶ)KnGTlBM8E`#VB~^ kCY$Q 7h)he~ "Br#Ha?aoN:q|Ɓ}<'ߠ!5_;Nб ]}65jDY{.ɎhN#h=Sr0R7Dh$B`~h#i0lly:~K1̹w^eKICA~u7|XUQ+|[VǬv(Ȃ;] ik,.NJJgIJHd"3c;^њMgk{T(r,#_mL$ S*=LμJM;k~Vhyʜj0Uʵi8퐟קfHB=2`a86t2:kbFkH&i!8l~'ls]Z{.ʴ9m8ܪ~Fׁ8:~BbiIIY"XJ,p2J4B޼[T=k][/dm!Zo hߋ)#YaXW̜}9j>]b>_)\>uYl)ra.5EB;fK^Qx\(k5"7m~D:ٶ0[C$LT*ak?Vt*徤ˢ扒(`S/0][vz( vޥ`6٦4V ބldbb򄑬(w2PKZLBuL SЧ*t g)#CC1Q?-/PwR$Xx!<=?'z?Cʂ a )J?r)gd^]mטŻ'h@VsP==:'|X!=8A0 :c%T_i Kl%5=q/ ]6M CӸ>zgP(NO/.A#J'%p&ؘr"m.2pz@4 *#PBu@@P,/7bs%3te(uy[#Qk[HV% Xi{ BVvv Cq1«P= {6y\*U*iEl;(&V'mY~ w\$EeWK s6tesdk-{]Ut DTYsyhCNk 砏 Ir8 $#|"bZ{I*R;"zak&(Y|a_T'U:*VYOy1gu>Ee>+fQ}~cVsZ6]VȚ/}zr3m3P}![z`23G|<M ~4:üjҒN; idZY)cp=m$jbg>n)Pb)黌xRIGX އ$8K!-nO@[N4-[ݻH3K5G*> -C wJ`prHiG=:JV 묇1 O>?$2L^tpD&U.v4Kt@IMc}BF iI"#R u%|D-FEZ啅 #/[$Ҡwޅk9Z!ߠd = )]>ӿz*=Z>.EEk|섏x-UCRڻPr 5Rނ6`6Bp M- b{Ɖ=\H4%ʈkҖPLgrGcP]%otܞfZ ?Y·J>Jw ̟J{/= et%GXEXvv#!ebۅM,)N0l)Uݍި^VV*;y1>=6Z,e\$Qb .a:Z\vzd_`?;1[:{F+ 6"{)>čyF_;iZc=?9|l%S = g{Mf柊;iuMhv4DlHE z(I0i匬Ru}z;0$p^{?p\DC+`h֫:;%kXw)+N*1OcP4ymz岨j|grSچHyܙٜ9RD%{9ErVDk]N!W8g/sHyFo%4X97F%'ɴ[<'PWS|.6ܥ1k|LCNSj`,(xuףb9Y\aB<k{]2Td!ھ-Kd4Q^&3,A< AxX֊C):1*mtߣ5NU7q}9rr~tCb7m~S١^(n۰arfZ%w|X ZaDh` T)CvC:ֆV5d%}UKY*Q>qiK"PRq‚v=-m?,k?5Mn>bu)WSb+!nl?]k$."`R3?|GFcj`w _#"NKjWw; rI- /{i NJލ|pN_dNxXd>sH f~/_ ~S[F8q( RĂlOk,Ƚ'bxZJ99=U42TCUB=.E%V[W;Pd"TؑtWh ΰ . բII} f@&VzkNFrD+b [jnla1ik-CfOR;Y@R͐lB#sBN:/~h}:SEgAoמ̧dx!Q#8Doa*nj_Co1P..pX,`o( ў<ի # LXA~?o@Zᤎ{W,԰LI/[zLPCl=i/]vS)Xg?z!uBW,iX; qgf׉@ԟ}8r9it *JݹcߦQIVmuB^&(0'9<^#K2 4jǫ:^TK~'GԆ*&n@>3[4p'fVlj2?9>xf«Ҏ>*H@+-@QOȇ|(ǜ1/@*NtêRϝ#s7.#VU,~ӝ.7M4܇křEZX31/udB~&NX^y%G|gk;B޵ "BRrqjyAU">]NeĽ_ ;ޱQ&d84SL6HcMjiwE>EجVw9Ӟ#yTs MOh<LA ^t#>{gh!˷' QAYɞ3|n}ܔjCn9FǼ n:6ߍU_n,Il=4έm_pPP,B}3MɝBRPAUWtZNd_e2Ref X[xѴ==cwKJe;{Vh#fôOpPjsûlW \UCJ6'C8ǔF4G0Q:\ z {!=s!H?PG)0 yN̎&v|K )Ŧ̭/'{,߲ȬAǂXJi{P1:e5!UᯊF2=q^Z0Qb^Dt6|/2i%ؗ%<3]-uB}T ]*Q5sͼY4 5u pM%VaDiWp*(bsqDS(QO̓dQ6gBL OG#B ~Qk헫a)L>tSTĮx;KX}~ULrC {w==3;RJzϱm# fq"l?H1FM)3{78NKC"f,'S\%y%*?Jz'_:D:yVsASzWDA%rw;(]7-^a:Ă+y1BFݎ A>-]s|1ASQKrIЁMA¤Qȑp[Cc4i37د.y:&&wo94?c MK޺|e>ZyF?բeC_'@'2R*>?;kȓ]sTwA76uyf=gE<;yw; [ޑp/j1MH*S%b{w]* q41u1$@%4XntGkho X`#+)sakq gp,f1c~V0M 'zDS, W{iq9cV3cA00gԩ>R8!{r(6pgBIFt} %0]Fu*([ȊejIO-4d+.`m.DFD ݅],m5fiL-ɟeNpZBȿK8UϻCDʌLpʫ\e8=Z谅<> 㖣wt.z5_#Ǎ򝬮 GR|c| ?*Ah HdA*^8 =_xXc=*)-OC$joa~E?硌pBUb lK^'@CהЄ:U~E= pvC9x2k#{I]d{UM3CRIurI<&էà >w#rz`Gz}$n g%Ԣz #@TY`Q>ń\rУhUy gCdB̻c3к䍥r8yP`vzڏ#(0(l1Ư_D֢yuhM""DKu}ؚ9Zt3=twuf츮"K,Rq%yi 'á!iվ:(p^"=W:<.,bLfd ef,EZ"kJ,'W: " t8 #C'}L K\PQ`V嫖nӔ+ ,rbYhm7oݖʒEP%t _E,_:1$?/*ExQǛpK:=qLzF1Ҫ$8DD#/f?bT~&Gھύ8dx]AQD&^H]Wx |C+BI&q46_b( }tԵϵ^cHoOIddu{g#eix2ÈRi f0 /-+nck[|j{>cM~$+aI 3]zI'nx<8·=zqRx5|4Pldxc#FQAїKU;$1i$~9X\Ϛ3uSy:oɊ@E*vZ+Sr\iX%(3MO³P8ԛQz6s<W٘@F{M*lh$QSR9d:2ϥ>/P}ބ(WrKzd%6,p&xwaIXY7mˈ{TAJxC"Vfq:} |nk͑Rx2r8,GwdejD&}cLv-dH7&ٴj$%H̥Nt%V&zn'Q;,P(/7ѪTیzsêHn*RWSQճ\](Ku E)?sњVl,qj'c%)點+#mW~H1zDMu9JYFC3?ROsrՄeT&]>~Ө.Kף,6?B'?4@GυE|Gu}_Ve'b잟~@DjwSe #Pon7ƈX6}:bpDɗ1)^aBz_y C$?xO|( jvfg@˺\ e7ߐe Y[^|Э5%nJBiUڣ)-11R$W4}>zɢY;<.;B ʲy Ōּ@>/@kV`,I *V~ b&d];k*`s޹bq"C=G3G*.=' $CƽmEdåCs (g õ&֣,h6)AOP "$2\M[hyulbjе!ً[qy>U.n2#`2㉗5`Uo}HͰ>^XFw QHqDZaUՍm Axo sb]`/]ԫK6')_ǴRO ؇i sUag0)'K>Mp۸*2U7qLdӚ?aJ['&D?" gcY8yz? 2SS>D")^be~ŁR 2fEg_Ыȴ=i;E\\T D\EKdq^MMeRc2AuM%crs+ 7AYI|!S9P<=fv {"M6jaXcqi endstream endobj 160 0 obj << /Length1 1384 /Length2 5931 /Length3 0 /Length 6879 /Filter /FlateDecode >> stream xڍtT6)t(1H "ݭ C0"* H tHK}{y}Yy}]{_fg5SE@Up( PR1@?(HnC9CC0\?JH(ucSnZ8ࡇ3$J$@ (7(=a-~CNȮpAP7upB 1(Z`" 0@@`P?RpJ;P^^^`w~^C9P'kd6g4~Bv/FB7g w BuM+X//@+ ; \\p`stT5Q(^n vvGă=0g w`|3!H+ʝkF_inYnpqQS!}sNp5UW1fEDb qU ep݌Ao>hw'Bz@ ( 'w3#a @_V7 E} }&&<FSQ @ %D0@LLD`؟F#XnHFݳpQ7ԅ8tKr;G_YWwGο?qC]ԍ 7b7v07rP;k#a0o. q1ٍ~i"an/ߍ N77 -7gI8aKh"0 !9曕 Q-7p&p3?$u@ Fro{[P7B85H9V5V*[¾b=lIU2CUK7?`'̶9n⤺y^]j5_?EVj]YdѱB1sSy=:BSBx`٘l{{tGRN ^$ع^Y<28DhtuSO=5W?7*ij1`Gܷ43Dy|4RkT % .)'ԝI#yC;Jq!(󼃓[C uRU\'s.%N|K^pzxz"+8?[jtCţ\fPн0?Zô͸;- I.wMR`pئ3YU04[I^/=KF^Q6610]:!pI[Q+gGX \qnJQx,J\ΐѸJ;( Czx;gEn9kW )x-v#x6 :.M݊rAw6Ƽ?O(B[-FTk%9ڈ NW^r 2,t ڃNep/r1;*ȒZ?W=y^Z=$.q)~*oqt2;wV[nKhgxM|uahJI]?ލ[W ٓcFR뒃2VcL[/oFn<-}-ܶx(1ITERɤ=oj4) J;pv $zogKӮEdrR2KOcFŧ鏤ʖ)r1϶NP]ֹz U?2a̚"c/.0Gx ;6Gis`ZJx}< -v}rph+\ƥ+QBiYߵZ1\|#G%*꜏f,nFZmYn]G!ɔ ߔ{q KʰV.iq+Mg~S8\}+t`י5Mm(Ǫ'69NC /W^dӾsg`q|=zQM1TxְM/fh^^%_i%8|Y ?zPT,nēDIvC2k[e<‰ )mnRb95p9,B)Es+g%{8q\ƟjryA@s+F1%A*9 QB?1^!<}MII8"ý5D_$_ut]Q:JҖh= >xGlꛖKH%t ל}ma[4z fX )q"AKo=T9)1QYgxrxG>@NZCA}YyF'%x<*>0BsOzs,U VIIUnm {84kъOy? T{YKVʓ{J9==VV4եwo$nXX=V6, bGGZUlY}ճb_ϒd[|굧qD2MYqiڥp8-Dە/Vse~YHXmZ@vd"yN pRمUIu 2;( 36 vN5%;׶/W*R/b#uwcWYaX=-2%P-Wʈt0'e %/-۶μ2/c;[ a=RQOQRL;#aw`1ћ>*>\Ւ`z~IPʐc3/VsJF|,wq= ?"}KI }`B.{ (?uJN M_77-۰JEB2U^Q>*սuI ӱuoZY?yce´\򠳾5Rf&ڨޥdWUv9c(#;r!ǩ΄:6fj?競+IVEUIT6O1 H>!kMޖM{8F&鸳BX+FT^6Gu9ZZq)_PkG cY̸$ jL)B[څ3'8$3N689ԺPwR߱6Óu0Ukݍ:i5'K"iۧ)!dPF^$0l882Q,0<CcJRgjT(!80UWJ ^,&)OxLη0́faY<Nf{Gm`jY8nҒ󀺊XEM~0.UDNyY{6m xOD6WiɱN Ǐd, Xcwt&iiv 5&^ojLϣߺ+逬;8 %uGP$lE19lJHXn TV*0f!p8?!G3n[EpR-r6<|&6fa=HDh3!fal]bmryj]qJ#%[+5A t%yY&]Q+vP `_Ӊ8ley*:$G.T,:/rmIܭH<Í(~SHPU[d>=B72Vw)qā5bR*-NSڵ{(IfZjg嫘4)TgRfcJ$"Lҏqʍl2,T<:4 :W^Nh_mhOq/<;{6A`"J~'V/c 红c:*%?;@UvgT" ` fAE0/bR/kO3,ژiٌ_'ۯM~@/S UŨՁ\Da)ܷI@+_ǝ3@?Ȝ k),>?~ZyYYWsAFc>ҾRVJg`]8i[я4kb&x1)?#嘹G`%;u`%뀷N2#|yP!4`m0|@*KOblwP~֭=RmxҸ&wM.Xs;"zMStubM6lrEĹ T.h!瀮EdmlvJ |Oa ۑk;Q.ꊾhf, `,wzrX@ok9h5RR>bط2c:+yԼ º9'|+-$5ɾ91f+ݴz,wZH2ӑ=y}?MM_YϦ8 p@c>i$8&㗼?LJr}^߳"Jw#3 _C\t5^{UhPAQ}εcϗdWL/vu'Al&xC smejnvlDt/2x3[7* Rz'|)Ah|"fYI,} gi'vm7͈]%ʐجn䧚ɗcc;F YbzeB  : ˳ej:6ʐc8yʖeh.Rz,S1bR> stream xڍwTm?!H" ҢԲ,tRRJwIKwH!>>>\3:rܹo̯dah~!4@EOOKE@ab(򷞘 DA0@ ! 4F Bczp@ $@@8R pE̡G Nh>/\`now `=  rP!dh %G:sh'AzBJ J 8AQh/(\` qCc-] pBB W (3 !@0(u uh>f rE1 OdNPW20FBh F_a0ǬWA`hTHs>{0{_e{ MaPw FEo# JJH 7I&>o/5?p :@0/b?@#= ~iD,$;#F5/$ 0{8-4UU6Spo0_X J$0ƹ?|`p`9{!ן 3>C]L3h+H/cA]} 0@c@C!ͮV-43J0G D(u7> v6M +GA]1/ l)`@(ȡ7 ?POXLB"A>Ęc$1fL!޿ IRA_ߒP cua H$&$:@!`)8X&Թ.Fы}Do/0H5!Wmf%8;kVL}GHڹS_4gӁZ=k1?#]D&)),%^]D 꺧8iJ%;jJti̾~6B c?=tRr%]U} hxv&rM6{;!$5{+l\dS|Th[JROhZ)`~"c?_ѫeYhX,UrF=!w _/cj+~7xQ@oطOb֜۝Qtmls=OX*Ji۱D=Kcw|/w3Ĉ_d;{Igȷi)/DZyh:xi֨(W zIkNs\Hl%l͍枨evT.P@嗬CGF,92G6vp[ߕ 4훳~^k| ߂?TGs&r z迪Д?R 8N8kLVaUc)~]Gkv߶)1/=#NsX>iNaxWSŔ q/&`&X]σlh~֟nl %2Ku]BwߡVBP265Eȹ, uƒxEVy$N'GV&jo3y/Hhi kuٚwN4؋ψI{<癟E ʗppbɫWg'.u:C$^Ckwg&]Z\9lح(ҥV{Bot3̟L@ˋ|1G}p~oy~;OdK/6.+SϮ5Mw2&V#X2!{ĂDmLoh}.E7f䇴IC6ƒk%q&$ܦB5;'XQpt|n'?+WQR xmωVT>*K"Оg^VlT D܄0+*1C..Xn⌱Uꀷ6li+any7tS4sAϞn:* 3~("M8 k1'tz 6ӢA걝F샂Bw…Pʱ{d+Oj'k7:3^ԍ z;"|<=QbeERŷkrA d8:!]ڑW1sÂ%]C}儧}W^ e?kZz{RZSgd˴jhd'r.lv!Yӧ?=K?\vVɴu0,#*"3\cHj|(sڭ%TM3,Xa.-*r|jinp$>E0ZҳƏDKf쾊>y4 vWt K7Eijq*@/Di6~1 Sϊ[6}[84> )6 JaiUMb/2q LC\PDSS|.%ECsnwA4KFnm'M,g.GiATx9aQъLpsxYE^VdiN =KΎv7&78P n W9C|+ ZO2J'7ս?x[_jX#t#|2e?Dx>95Vݖ܌fߟϹӬ48rŰ5(c0E[-bk}@]B_Jx6B^W;/+L)M.r=Yս:~NJgGuMq"΄F*nN6eM yb Fh[xBp|%T /[(@h8Ĥ6Lr\\7h`5lY~+LwFddJ;}Q]GGKϼ+ bzS̼,X ?z3=mN7"bYcqPkς+(6,1f6 52c4i)X{'^1~o]JiQM/{?te9yor<NeAcF^ƠHgcC>  kpXǩlzDR:e9 |{yHD[0*t2`jgc8 eLpіUK+Tµ]ҥUkN_K+*EB{MtQA&UTv"W}$0t);s% ׾C_m-=,~z^E,(QCnͳ%8EdZ mσL9x-7Vgeǰ#p+aEhUvdNIkӢޡMl簀|b˷hMm3tAbՕuA"?(gf:NjƎK~Sೂ\%Uxw30կEw;}z?'aoA;bwrڀQg4Mܕ~ 9zFQ{~|C'_Xvd fbu 'IK gigϔ؏~бg48!ɏB*d6Ȃ{JO4ji+#DXBkMEК(2-IS/7|,QnW 9E:M2~GG&O(»r>/ߛXpY_~&R* 0I mzr-Sx.iQnv#T `KVS`e8I`$cP'^rm.my~֭RMfH AL.gfo2s4ᩗ<]VpG *Ρk1:&̉Ə" [=#v`Jȵ*+S\3|4~&aoZPjp H|o I%*Q噵rJf 2n6e&սKj3]˜gP2J9AbOFs~5µنcf&g=AdҒ]ѧA)Hg !x<ضyH%DSɾ^xuTեNf{0,cI i `y5cfr\a%&'&53F"I:ڊ,.bVN7ؘS]6UM61M+v"iw\ھ'+uYa?˛&)MŬ{J=v k P K}}Q˦ ?`'l+.wrI5-qi=MTeR 3/ w_}OM"Vs O4V$Ms\9[q>0`^rN&J1.+jŋ%.蕻NM7ZW {aIcM'mʳ a _U^b3=zv裚4If^ls7.tMeL^ A}&6%E h?O<J ?G1x$H4iڜ y ZCLnϹ|K:O|VbbXw1gY&;|Sc&Ƣu>yX= f6UjrDNSH$@Gȋc&N $"ՖX^"%[:'LYDjk̮Y|ѫSA+$=~C_֥ =l0 κf=g,}5Sչ-B9l"Q.8"nr_k[I[Mu[/1s9^ۭc@^k^M{YVEx V!sg}b!E8j/9iL>mP6,\5UDbQH["kWD@k&LE ٽPxv>bQRGfX'x ~[l}x*ݏoλSsK{IEqn"ETO{z<`ձQ^>&2[ TB宱{[K kFvc栴M(q՞@4" rA;4HZY0wc&[=7xFΉK=ujkxckxd 폗M[\? NDKBC-Uß2i*7R+%]8l0 ù"(lӳCHاŝA[A;;#qjZO.LްG^dD&LA@[7N9VtsK/Ի[Rn"*]MM@[NgM=W`zkOs.1& /$)Ɯ=zVok9mYQ"? /xyB_EO/ubo2ވg7%\k9J*0/O(Jpj K̙sCK&Z0_pԽ'?8dZ4˵w_>ô:lV2{!#ͫ-)rHNunEs+/ "fbK Q[ktMAu')MD0V`i#qmWѧc)$N3-G5E`VCqYkGXI)qP͗lҧW[=$RuvW LpPPk W^ [ďiK)_'=p|˨hpo9ДAX@!o>^i|4F9r̫/`kdNMQ'8f$ Wȼ>;6z%U HE$NKKμ.'n9yG3-.֙<"}gRDŷ6.32Ѓ s*M'&LD1)?%5ic#l'(IVS6;LpQ(?,r?߸].6S͆q?}L-geזbզvk H:0ߝ8$yRXpU (m:|oyAq;9KyOD)5_XMz^᭘<]/\UՃl8t%MVŎ"T $ʖ(nHvkEn*{)SOMbqͽfP)TIqa,Ym.?B9d,Ϻ=QAGszyNWHoO:_xg8s``rUXf_^=+ ZN'h|め8[xBSGvZ[/Ҽ +3ςَ]G#~ '25Z!yN5- Ú@뭅(C Z endstream endobj 164 0 obj << /Length1 1385 /Length2 6140 /Length3 0 /Length 7097 /Filter /FlateDecode >> stream xڍxuT6)HC ] ݩ CC4 H7ݍ4ҠR";9[֬5콯}]d㑵BZ”$P@ ?G9 0W8!.0 S8 $ `q t(@V ^*s%#\6(1zC9`11YG  A4 ([#D(a(`E<< k8VnN|LE/"DED0gjwˍ F[?>w߁Z`0 E,a6p0?6z.pO{`OOB"_>ǚzF\&wLN x@0X A?6 RUH[5c`+?i"ѬCrSSwῪH )98a#/MZ7ZH  5 Q-Y <`A^?U ҆(oKjpL nAg@C j~y'qE {lZNCEZ0"@m |hZ<3Nj@)̾k 5AB>/?B\\ٿ y sHD]MPi,ڨ$^1?h>Wq|9V/#}^Didfס)|ygKA e dO:i&lD.ݖ?c鞍`%/RQ nlWUNI'fj_:fZq~ixf*dAG/}$=k,!(E~:AJˬBTRGdrO&8bzqB+_Jtm\~ &vJ~(`Qf;VktL惝CV]CO)`9,~z{ۀ?lf`m3Dxquט*InOUgI6ۏ|9.?几 ( w]ӻT&/+T#ɟ.r:Ȳ ?ӔK> MМwhZic_rXy3^>>a@AÊu>NwzgǏsA'0_;1<"):BbƔC`4YEU˂sv+ks3#0 XTjC7'zՏrs䉇7eF٘nF0Qc.1~?$b`z qXh.\H>p]}X˗FGJDvq-554 6WZ_¼xy[_riKgK|6;{Htq#ẁEb WœٌHZY%mra W߈cY9_o?)O4zʔcHj^F\yg-a\H64?V/<Ů3xAN 3ϑw03 99v2]vSn_VrѤ#mI.Bo߇nWM収K f ]_ Sa=펩k{F m]w)o>+/L]UZ3NTXY$d),r@GEEB-OLIac װӜg1g)ɴw>Uy}k)&⏊կ緱 [;Lj3Dq_]8tTnlM=l}AM(e g3^.U$H0`e8N~w9g!BF9/FfS} ¤z&ˀϿJ{Z "G*;tg5odPV߭|E ) Iz{b1BYmi(FO/P+cm\S/=DV >kb'TDh,_VKJ:7c!f`طn;&$4]{%shHaj'5Pɨ¨GD_ rS%21'#~;˳pV\2 54R S4j\:$鷴j5Bxo*VV" ',/9W)Y%-^,ˆp9F+ 65l:3Ӝ{<'b۔iŘ}:́a@Jek G wݾ\GÓ$*S ȰNw-ZQcϳt 93{E!v c]Nڵ:yU.^J50n mx kւ BԾq R,!mJ〈Ma ȆV[82h7JvOG#cD#5\~ fG~xi)mg +2g% mk{nR}w7<qkFO<Z0NO̯k_U V}NߙrwvCLqٻOs]\֌dD9ћԍy5~wݗ3c7m B/GJ>4JafヘQ{<1+O8Nk6?}Q`JAnr޺$/ʱ9XYy*f49.ruxgeJS} I%;$3Wzh_d_cHyޗGŏ1W ?Ek|?p(0눩pgÃ34G=4Wk@s}̤絁Ā׻|JVqcڈR l5"W1ntb (XE9/ U_]&Dk?D:1/U[(E_6;>ٯy2'iv) Q%y3Qޣ*7)ʨ / #9ʯU+5*$J##oXyj`,oT5{)wO؄D֊E*/Ί>τL=W[?'ؒ:t6[= 8 YVmq$pӹy8ɾ .^`x޵=k'qVeFiV9gV--oiWH}Jx/8"̔}UyO? z/̓*`Ptի@EqKGUѽqR//K韵,5yXUfi/[{y,h{'wt9yߐxubAAI+ʟt`vf4J~a i!?`"\V8tF s~X IAGr .N> d43+y n3"]p#ap7ǚ݂ykmdr&8 Zjp';S!wusg󦍳j 먘K-wQҮ=֠ݍ(Nĺ}rI VTZ?SX%Kxr~R1BJUtrvi$f%Ki0=zb6K»-'Exy+h"&O}X Z_צxGBFX8ӯrHWQi*|YΊ&3zش;ǒSoϏmoӒ:k'qGq*LY!2!uV|^iprLB.;ITBgi3ᢘ:%gT6i$Y,TOD[8BWXWg)PM)j$RG~~v#?+FЍ8! ҁI]w򎱬,{.FmWʩQCG:w7*|q=d? 2yZ,)\ɡ2ѕ&fk r }FT>NaLXQ@N^R:,:׭+;z՘Z* ~HGD}(N`yPkvssbfl1L~DFsPjXsr|)"PCe~+V&|GEO?p\i+ܖgrk nh˓yY]ϊH gf׌2d.9Bܼk~ECH`(D^Mw g|N ?77 9ݘ5mτW/ hɅ{?HY[8OTG6JЋUh޹^\Gm 8w!kF'ǶBun!()8ϛN" :ī vyaNo1ƕ\]W> P$rƹ||S{ߩܒG9eP]5h`>7sᣊYACfnG=M‹ܟ# 4aFוЄkj g%Avu?>/U2$'QNtqP)z"S "ֆD(3'g 풕~Y}S'剤q> MžZz:gesz&E(Ӏ G~ȦD>-Ad.ūi<z0LQsh&3SnL>CPq<>bfs_:sxWBjLB Gd7%n}J?cjkO wҁ:5] n7u@%:zvY4, ) hm9e!aD)xwoE(ߝ}Ypx:R!w{~z&Kdb#>Mqh,M1r<189 6w~[U'-~ۮEOF>hV.M%Vx  :%[1՝!  :54z.1gm42n'UD`?^J07ߊu'4 [wt;^B-E14U}˧ovٝˈM~!?YHR ;ߓJ yLx1QIޛIs0{V2c2I}'`C$]#yO3KBrQTܕ@-7@画1F)> gi,d33ƭ>k1^?ٵonɐ&L0.| &a[VU]g W87`bC_zů|٪'G7ȡ&3Sqqk\/ߌݿ9&q>z0lZP0"7sjy a1jvע.Ν}rx}ڴe"쾫UroݭZD -3 l[©n[VI=v/"PPX+/aGw xB!(V@!IE8 Ռb/g^V~&NW^xY@X#CnoUWq~ҹ 'a;;S[I*euf,w6G&x"[1=Qa_tfME8A=GMyl`H!e"9(N endstream endobj 166 0 obj << /Length1 2466 /Length2 21566 /Length3 0 /Length 22992 /Filter /FlateDecode >> stream xڌT6L7H%!HCwwH(%JwwIKtwww#Z߷Xk33랡P`3J:p $9\(44 g0bmV/ G3D&i SȻ\^>vv';;9 $M]A%V- Fde ?zs??b6@G-@hhn hؙEA/dl/jjjh% p9[ԁN@GWweS?4AN5,L 2:A<\l-Hp"@h?̀{&dkiEVgwgfoCS65+sSRs2w;;:KdM鲔 w~ G9lL׿%w.lZ M "?2+3 tͭ~kz-TeogY!PL]gGߊF( 3 hE-;ϓ!d,l5_6yu)E%*N\`ap^2>ȃӨ_rv2vp0K@%7`a7|p?\67mwB.`Ԧ6 ǿ K 9Jvc`MuZ%kM!A 6A@ U?\)lvN 2- R!'CJٚY>b<SGGSȐ!9@-1sD=Q^o?&$76?&`8l2'MA $A+A*Ao U HnH#.NC$\.vK俇{"Ҟ?<'' W @H ?4ܰl֎ R_!w Bpki {!}'PuK8B o@;e~\0}up]Imo ,^._*RWoľwb.mJ_.?y6"5ū5~4UnF=!E&a~r&OC5έ[ƽxq(tf[mWx%Z+ `&,m$v |,Q4WiRMNԯIai f z3Й.`qT#m뻪\ple~lW;RU4G8Wq}_n|d0k}a6k]fNH~Ң@ Wbav.&7!B^Dzo໠HNx2?՝)Xša*}=;}m%eJ"1k3`5n*l Uȃ\1ng:[Nk{? =vVs OQ$^]Onq#};2pO|Yg;$ɈEnNw!QkR~as=эXN.o^Ga_({pN2u(zV;z(TO4;TƭDwTkP]Û^2 OT,8bv?r-}TijeDÊXIUT/p8b+;ȑ, .uE1 e&>g熷N+B!%o uW%EµvydLd'GU$S̎(rBT'c]m1PDY D2ÊDY9\GK*"E kyL CU+|ws1mB o UXX4qe$[4Ogspj;5ݑ&߅8؋^mNkRWV2W*+SD_\%eq]Uc,+tAޤG}_ZPdZYIBg_s2USnnW [ӚGH"UҒ %{ ]ҡϮ^ 3w] dJooa4'tX: dL%e[QH=1"B8U'ʩRS?6N#^+ rX%UxNbvU*&\qK eLnfGD/o)\QH7g ]78p.)4}AЭ5~:B@!%wdAffT4Oӝ|D&ݡ6[OUWqYvc}4emxn+뜆v]r'9W.{Y6'uHsHE?=xoV<nE,2wom==Z+?xm`0q*OiR*tL,Ѱg|0I>DΊ_gJҨJqf i1h+Kަ˽Q驚J#Q"EB} ~>gѭI@esc&mj33Uk$cKi׿$ʨ9IT0- J<;UҦ+%1e}Xҗ&(i?dlp} ep9nN[8Ϯ6C ܒEkӀSulf>V4ֽVEq;|BcwX}Wj蚪/׮A(8 G?x(&-Pv&XԒHvUu0qe0n^ cV_4vg%>3{PA!25.=mmI trV5s˛7%3dAG]!Vo ޮRJ=(HifC;lUޑ`6QLѰW<8=htoʭAP9 (pk(9}8vbہX+0CY#jD^vqH%>~j9E3m؜-:LJ݅p'11x p6nݝl-vm{6{5^24?lN)SL6o: ŃB?ӽqcٙC̥8 ^lU;Gc-\{ $"&^FL *d7us!b#U>MaԘ(Sw~OO&?0Yzzt9Op),x_;Nb\S :'S{_WV6uu XiT_ ]/:HCcnz Y?R6JIpQz7sp,NKAnuCJ/bE!ҢiVtcc8ƩRN6w7j?G/zIonRpDb=fP($$#̑XuآهX9~f7JUonxAnM}ߝrӣ5|ݸZܳ| ,#Su z6iśӹ6(aVn(Hw|Ⱥ!0Ie`;xd4W @Շ"US@;UwnِL<DZE\L]J.+ǝuY};đcs;b{aN>f:'6ؓVWExjoezթ yqil<@u#\wF*vk3guy *VwNqO#q>5#+>7dg>g$PVg֌ڻFjՂWCre-~?YuIElJ1l:\)}2EXetJNSt|ot뢍PfiQ8T}ADn|=Rp/z/vC5 :p z"HOPi`eǹh|arii? nyD>NV3#T}բ옭E.o0+iI8ob1zRs+!A{=#Ԁ9C&i')wheo\<//X;t1txR<-N=ߵah1Apd ^dP ^/7JkxvC.u[f_? JI3u:E>iD6(A㯬-a5\;|I[R欬RLhӇuÔ'W:>VlaNy#9!_<~6DMY~ cĻy_٢Pע6Pָ?VqنG`ڱ,ⷦ&}(6=U73hQ)Au;lےst8+ \w.ou]M`:bJ^|^ CTσ]ċ9c02l47YoO i+ĽT(2}Gf]%H=ء/(N>=&bA\y5Y;uhg[n4SSnhnO*GEoNmr' C WzD7WkK|–1, ;'z~Hď!N7#S2b,Ѕi0~_9>=~vNu#&mۆ9}nˈQ+2)ܰܞEqg/SaIm!MIbr[SH`sG8'Be3Ŗ+vZ-VVæ[b\j3Ǔp=x,7<0yyi](<2{l1Nu|v7'|Л{$kTX&G%.wuﴝܻ8˜q؍ѧ_L8癩 1SuQ2/ja/U _D'ۓGc* oklF^~{MZAj\ HɮH (m׽4 3.^s[CCm\ uTϫ{=R`"gQ4[ vrJƞҜ{!k-puڱצw| $#~jjI-'.AG>rEfj$V3C`h*U0 @ i.24.M맙;U'rKr!fXNj4 lY*/'+ +Z6N3: i?d)ւgy˖t%|nȵjTLWZyn gV8xSk+­PR[YEP`e>oRy?l.Vn^ ꨁ.NNoY22+ABXfD!1EDo*S8uz 8~ 6a Aay4_zHU&bP`y=9\.V,Cԍ߽@P361$u97&APAvR-ݏ-;kSF569'ZΆ:Q_NBEx0)t@n?e9ëaxVx?c&EM^-OY] V.IGբwHbw래Q9jD LH3SN~NÈ8$; =bIp_'[گ,{$<%el7Q0%hёd@2/ΫAY"*7gģOR$HIdߟfM߼\BH$}ߐbVR}F U Fq.k Nyﮄ.n8Mz^ >>@4*e C㇨B-s[Z&@a)>hxkY\)Zш #Ѵ:<o3XZ0>}nɱ<9oo9J݄L6 0JK3q.O*y~;jEh]"Qͥ7 *o t#sV']K;d{Plj=!:;+l^êku?"FSW!eɹD{*}WY9Y|>aMri 3O AT,۶MՖĜ+^"5.jU'+8$Bg&-V2QԶ.ݽ4lP#խ @DkN(I ]czRGGsZ `R&%}NI_(fCB䦗[|)}$rd5lji+Q!{>7b[wT# ߓts2eyYY jU ]:!aptH歖vLwp@MV]㷿!h&wB^v ! [}x `{NMUfaJtF[-MCCD[Fu$Է=炼+ۥ'#4Qu2ԅ?.eP< ̴+c4 :Gg83"R 7r͜c7ݛ~`c$3HJDr23EZ7⦄ %?Tig32ŝ@3#ʳ. Өy?f:n"5m8ݙz 6:}q+\1Vxe B0GtMUuz6ț8rqZ^Gc"00]CZVGb쾮“ZwY, nad†KOjCCIu>P_8S+M.]&?<.[$((S=4tGu&1Rgr`}.uٟmF/"uaB> |iC 96:3?'(Cq-2KJRL0Vlpb;̙3Jfɨwͳ`5=sJ?ȕ VuO ߵaYk Dqgض-]8{3Z*m$7Bkg}ɬ*-* 7)=s4SiYm 8J<{w^tس+;B# 8tW?hTg\orhZ0) "zlktm:OBdѭQBiuɣ_$?^hX` &UWE*g0J7#LF[הgP-,TyqZoΐ%II C%,΅Z\wKff>`򝏘{FO =;Uq~ :UK웒cBmdڗd발)i1[V'x)Ptpy0R.q *>9YUD wxOl(Fq ؋_?0z,/@ќM]*M%O_޲1b"2&?<%֐3V،؍V X!Xq.ҪM+sȊDJdj/:dLwv9v^7fwrtn. r4<~(\tUliN0KajO@4r.WYP/RyVė$Q#\)^~v.yٖ8ӆt`-$6.*y<XkWpcyxɵ{ʼnGRoW%AKSl(hҊ9X/%J~J)䅥kUoU`V㯋|[5;ds0&r#6t豨sg> u iҿvȚ#}#a|{J"3,HD&-w3BnGvwY,alyZNm{>DMWgҎXh.ߠגwfc_0፸⫆Z'.M}b5#TQǥB$3I|\fB8VSuz8v 8i Ld9 b6 =ЉA"@vbhU킫~SglLA,Y?bMP[+}5Ȯz9%IY>E .ZZZu_/-=ohjXqK'!tG;"o#:da:b,F>w(29Zٕv3?.7 >0yȚAQ0]lc 9F(wљWA|p:h[wG2ΑE&.:4[};+Ԃh-3'3$TR:ʚ`<5I+|F}ư>K:ajuD3%anAg9 RGUVQ}^Mev,Mw:B_ v_Vs/Pwiݩ-(Cz(T.vzJ.N̪Z8nؿuۖgm}>FczV7EPSK0[|r԰6/LyfQ><&I%@v>:U-\d%"~OU$%fZ_) # R~2m7A{Ǔ" bNgF`)x-Dߚx _W6Us&Zzv$N>[oZp2TC0$8t2gIw@:\km(0yӑ*ݻ0|sӄ*.X?v ͏8Ks_0۱p=Q}_:x78^އakBk_DZIľ'}rM9Vc10+aD,So")7ҍ}pr6.c}݅)=82~L ,`M_4W1vn^gЙQjQ&/(wT'z2Rk6h`y,t}}WL!SN>M%R->F8qG\4}W̶[b*ki?Htƶ T~B`}۸*Y~V4 鉰LW Ԛњa4gi6Bvm8wVھK tcf1 9H!ٹѼL 5} ca<ۤ%@fu -DJ}!r/`0J}S_>Cc[.{| wS+YSf85YTǼ_6IRB!F^eҌ/nw'ǔw*F׮8qPyTAPr6t㴠V%6<"ݺga[VK/ģ>ˆ'ZS{;Ao7sPsọӣO!HiCڽɅ+φ=ڀ%"B;"y@]e<շ93]njJ;gt= mq՚ug%Z'mۣ\(8+7͈Y&?AE,Ղܫs(vW'v# ׫Ey%"b=\}wƒ*1ﵼ`ز78YvPHJ0ᝁq4y4ԖJsiܩy,n!o.֕p[Hze1E5FW頝3-M ܦHu|#Hk NLd +`jvZRe>O,bO|cr%ZO"&~zNp>l>uQoԘd //Y DfR°qT焤nJxB.;\8G7H4#py[*d$wc9UYh:U}DXeEBu"k%~*=li''H{20t4hS`+h`[-'3|F ގ[ږ'3 $82YI3oG* UNyG":}'I\`"$D$_X^;x_Q}Wvy0讀ހ{%⮓>Y&EXzmA /4zF4 "u7oܨ:5Kp9f2}kFpɆBo?,eo8t83p^pJ ֻ&p !]~ݬ쎽uEߞo@~z5*ǰ 68l6 hH wc3z)|nβlҎ t],FӸnVA8e8/G@ܜ<ҹ-1FLG{'9Sf9%T2tmkwpP*'6m}=BteEg2W},9?aLH~^g3ygd~CU]>5%IlZm8B9bpQ4UF_q}|=E(NT;=b kvGxh~+.z1a gB/*ۜ co6)}Qa5y# "6;x_JEtU@1⬄֥]CCF"J,- c?8 X4r^ݧր%M& m\+|\ZKn JTSХbsFEXNlp`9}n"/Cp: kP=7V*F@3R*T$y&"NFELE0}KPOZz{`4*b0 w6M% GB|4/:YLRlM(E-UUoGapOtvS]!81-bɊc$xO=gT"z+] I i\?8QJ,KO_5CHדɮy{jՂk:>̷et%ѻLQ^\u++gB24䳇z2&"Zk nڣb޴|BFN Nfpr >iv` W2yaEcV_٭>jui}:\!uw&2~ed|TV]pp7G<"qIh-nA?0b\# ʮSqbz(bB^:$ bүWMbIy&BXv9 ٸɱ`}t7DDUK64~sQh{W+_S0h16atC[9OolyuTq:_1 ~۱4#mLM@LKw{^" P"`Z\GaIW{`o# eQc(ٕ[4aW4ʷ(B;;٩~l[}5MPn[7X"0à Ѱ3G2c6ҭxlۈqqxPG@.pckIЛ7{ V6[ucCtP6Y<>pv։+oq "›xգg?L"nK`G9 I\K2jfGyb|"&M׿=zu3Ms3ò-r8<i=#NQ]Mpv@7|DAi^fTR+w-zސ23%q0>lzF+WAD fa>Ǐzy!eۭ&Um;o:2 +)4s_]&ʲmPn*^36!Lثbhm r^1WKC8%BU?[tܝ!J܎n%Tλi.)j17<>4y;7(J= W4I64 >1Nb-kr+UN-fo7vq> UgGs'Oj5B>cKIr4Jz %}z)zHuu7SLa2A(I;?g" ܉Ox7wp; 9-9&uL AesޏVI q >X#12߁W>g}zH|^ɫ-vQA!0mt/I)L)p>IjAhV "-Ҟj6 "eSJ>VS8K88 d$dM-sA^l"By= RH1TK*|=Wxhra7xש+~d |wNi~աoVL6bAٌ3=&nFbAQ41Y]z&E{˲ v=>v\h!޲#U0zG+ ݱͳ"7l ?/:D*KO{5ttsu"M|/V l vg?꾖$ȟ)7+\l7jSdm~LHSQ_䡻mCdfKm0#C E(~vC»ߟt]< C2y*&E=⴨x1x_*lo@t1vZyekr??{p̘v‘^ɃЊmtke-8Y> Cq%d:ۇ?M<\B.qQs;:5P! A]Cɚj-+aцj!X3%B| 8Hd ;V/\ ˴tH6x z-4 m wG%Õ.vp.hEC|hzR7Z qh!Χ<m('؛^@: <X-  Ir3rDIԩ~n-YEN`σɵXU c]FF)eU˫+'R޸nc{0\i#|R?A( m/n[= bZy:&soU!moە4[lӊv7LL)7;5 @Y`~b62aZ` +.p9nY@}[WشZ 8?|o&!P#vf6Z 0Z |唝I^ȲFK9R5MKtp)V?-D8`Gl- gl =ٔ?;4|uWT 5Gfc*y'SěV!OM تVTCB2ݎ]5xpXCCY#C~`~]5Еr)^f<}~ ,hgc@[}x*pɞ}u M6/h1h^dv {k~̶wYKChV-7c7IXiuڌfȌ_u5c-TM3Ḿfz냘zRWI#$Rܔ3SM"8d{:bϿwXvk,5nA(P-'&7$W:k5,lj2@/#h9 ZuZ@6IQqWO6-K!zc,Ata8+G~}^b>ʹ̗Y\&\@Ϭ@mWXifn8UٹlDoL3k "#NvFaX(B)}HJH_/G$aNXo` Qh/Dmu *;9'\Ɍ"Tg^*̩[:$`fh0Wʊ 0ƣXlM&%ǞT2"7_C=;x=oKbTB:-V)ĕ@rMM5ԋ{pt û>|d^~\pTʗ,ugٞ|J:3YthnTgHߙ\ua.=Yc`mIqT/pJCf>g\kcAXp]]\ӹN,%o5fD4\t{iCήp{$jWu{ eԣzL64xŮ̶ qر炥gIqWx]n\-@㼣ȞXO LtRLq.Kw6CsUô]9-7=)0&SW\d̈0wW9|{BJdF&kKm)h{0Q/uMLQ{Ly[T1gb :[cebJ ?@&Nzd:~ R~k襘%wڙŎFS4R~c0ڑu9yھ_%&6&Pa)fQ& (_d* Q@оLnхVf.T&햴w4׶Zqz~HBAʎhl:4ʲY!cT  gǘ[+\z,'X!I>UnW2 h5/z_VA- k_>ZͥG 48) v e،8b1qz5kօ$<P-ͣZpM PH OPkW 0R~%)YgOG_BL2 񕮱LwTm7\9Uص+xz$%+0Fhy.}t⾩ƨPNkwup.i "$Jq*ɛQT0Ňnvim@[+yɑ6 jL]hyZmi\;sc,DGNW06LǞ>j|SA aO?Tz%~۰`{גSjzƼw^r%FK$UmBmrp_Bí7,ͥ͊ +%sDPYo!\LuB$gxv4;Bᚿ_I8lb?zcެ@Ic{$q4sˏ0x;DO%*z}|(`lZNB+V5_$g+ZM\|8)BEFwkv :pˢ=[?vpMKIz%tTu+ĜmGgJXE:E" s 7H%2A0[ˎ Zt)cʠ8nS$Xk!V{.JK"| _-#IU)9>߇68P*1lt",}Ǻa:ϫU">fTRVBG%W2ts5V8AL jY|$g;,aj߱_{!P~dGȊﴔikg%b߄ۄƹ-*Va(/>@-?*BHy@EYW-v蹟߳!~!`-ʐs㙝o\aF>X]5"#NYX`*OڬQL5Fx>3J/c* )jnY_Zq TѤlʪ]vS@k;~&w_?‚nngb}WQT:tDtE}8Rb9+]S\^,nf+^1{aNsM(UT9Jm!ⵑ!yr޳W)($H#NKJos/վ.}5tRNAtMBAw|{9t!.YXQwݝt1v!=ZJWK͝ Mb2jSEUY#5IRjhALj kx1~Z i8ԇ=7e]0닓/BykpW_WCgHS"+qTm>g.ɥ#u'OOD.NcL"(H( ~j4^dL@h :DUx|G>h;CߋhL`K,!?$5(YyʱSMsKvSŔoTKZ2Z:jI(4l!a]7ݜCy9H"+w(l!8o!8MHs .wPf|`N067Gt%2XnwƠ\lҸfSp׷HfI0)dqm\@`mזLv!*!9:H"@UM3^n^ 2=u_d;3;iuJ +pC 1ѵ\LI/Od}:\ tԀVCΠiq_2(!彐{Aq/vzr@Wv;vlNc{YI9sw'{;_OXaҚy.nA e!̫!-Z|f "*^sۛXe/s!?+H^0pZ.UUv<d\ |/ZV\I@ty'HFlOxoF 2Dli[n-QBq\ֈEK\ aA̼eSO_ug ,|ƫL}/=b;8+)4kHxg࣢[$~KɆp(yXA*0ia9L纆h!RUfWAF7-Kx? #|-io>66R'K9N endstream endobj 168 0 obj << /Length1 1619 /Length2 8905 /Length3 0 /Length 9964 /Filter /FlateDecode >> stream xڍTk6LHw J ݍ)=0 10tw#ݍ ")Ht"9=}k֚y׽5̌:ܲ'KS'8ȫi@ ?ȇ̬ C:@20C0'ؿP0ަFǩ9n?$$|@b; P:8N^-<ج QQa?P P'+_lH/ѕ a#!mPW( nv3@]F@z@:*P 57_ٿ`?VVN` n9@O =\0;tvT<=W+ s"o)+!NP8w} 0~^ެ=!ֿ9a.nPBM8lH @]PO+[^?|M@`W;DA|o 0+$j~oZ/~2 O˫Tώ9y|| @XoM0*{?Rw-M@/Hon`G_uC_~ jsgՠzU=8=FS' CZ)?zj:~U |eepW.p+' ^H|*BhwBާX;!p~ߨW$,p/Wo$* DVߕBA^ ?_AA/ OO_{n{2?~odH DPğqfCC5zBp眬CB;.kdi=>HN3ods,":ݮ R٫sW粩#D6dn}6`E%k1OԞjYH18l#n]m[_ {V.U7"K~%-jg7Sqz&Ag -sgc"r|$9;&ɟcPM;/15BϵڈdlGn7Mrާd1>K9reR׾D0cacE'S]mSNr|͘)ꪧVKW.$؝p6Vu~.y!G-yj=O05 xf&rdgQ Eu:Ϻ#ȵJӥRh5Nkaa^XToDhD `Bv=(HGXiJ9 pĜ8O'GN>B yD+l?qx2.3Izڇ2Gޅ#欋6lCƒTtb^Gãߠ4:*{:'ONL){Hs7[i' '[_?q8b̉ KN*?Q-'K>! g9[(ʋ"8؃[c:&X'YeSSنoVΰgx={Ÿz2X(g⤉rg%Z[P,l*M>f0d]qO@>MK%ټ{5ɖMm6[`<كrľS)4qO{gfhKԿrAܛܔ5!SÚa7a|HTgKn =\(8[P͋g6¸,N/O(J9{vER!`G[iB0k7u"H;YOb5O6 Tʁ:(ފk} WVvBUv(3C5{t-#eJ (=846X۳1ةq\Ե)]@S5!_Id? /7C BW#ʕ*%\XB_J&³qB5xQG5toq53662\,c4$3O0 eeAsĢ^Mj^z`]jMO@d+۳`F@hDa gPK8EdQڵehl87Ub^5AƒAihYz%n tCC[0VO{h;9; |vW:"1xَ%͟1I΅CH+yقu`v|]`` YֽHj.;M5iʴ(\Z9>~ B\mR}\`߳՜9)3A kv h0WN ‰Kia"r8C=;ez)hI@TΖZ`R䗅EOTyH85܍'ݮ!s)薻A~Χ<%Ôs)3Z~л N`}W8l-C `e§͏Er5o'Hn֡6~>wBLI $|0 S%!N|&l\18z[THz:""T2(=:"_" p㙷`^2!]k˻O&1TIPY6*MSR&>N/yR՘3)x!!GPʏMDLcEE &+"*K2 h{#<Tp:O+ FsDWxS}v_a<;:hmrX ksY Y|6^ݐ }YIJBd0XN4>^QAz4)e߬IRJyax5-),!E(OTFCS2f0t1%P`>6CmzJ5НK7 .E)C_דv1ڣurX }iP0 nM4 %/{%amT>]|#(8 i)9I?0D=Ce|0(8:4.*rwD+s`!Lo<":5F|De}My#?[r]m`'(B{M'<:?wjQDRW8[c MՃ+=Qq2KTh0Q+|wXz7N%%PP$UG>E;lS2]OVHj|244c{FFu wOZ$ I?a'Džx(ÝjX_O6֯BrdyPW11&|5~q15 &%#h ;c\_xg!iDGJi+B*V/rmÝ%}§ 33Rl :K}u6U69VCzɱƬv$sݹ=8^F^J`қEraԹ_KѰ`>OlqP hm;pDqu\dSDmS`⪥jV[9DZxbΉċ:"JyO)M9$3ꠢLW5OJX3><HC7ύ3\9ldE>:ɼ4#DZvn~הmp+nf iϝct mi'͟)7('e4f^zf-;ݛnQۧ;5CJ^&(v;E1>(2y q쇰|EA$%rslmb;!JlwuvRꛍ-M*f:kSȠ[TX$R#sak ~M2uwoN Xv1\}ɊYH4 3|#⑩ސn`dl[hGUcՖ-#pd| Ic>]9p"~bI=yk`i&yi50yGz>tܱMerQ'p"ƘF$pe t_>u3E,j7Bj׾}6?/^ʍk~9u,ad:(x$7̅r8B ^*1)[A+80eCOVtEI6y!fWaPv/zfoč(H35iT׷ @-ZgG&!N&d>*WCLn\%l^K:w#h͸Z$+$' 3'?/]ӊl,qo4k5[Gq RMJeFl6~*=9 KO K',j8Qlp u&c%+xWgk#=dSD(as>N m![j )_WL:[n)-_({F ӭz;GE ']Tji=-_&Ѧ3dzEō@}b=lˣϻޓQ{i6vY=#,4!%fS\ӌ}[ U:uhýhjc~tkײ|!Q a+%~6RWVa"-e lGJp*G5'Vx@׬L FnGo/Z:Rΰ+-ncSRK^s9WCaC.zTAi*٘y,x#q,"v^A[B2T;K&يF گp*^ 7K{O; ^WE~>- a!N44ε4X-d,R_)q^$}&Ypx>+;9#ޚ9"z YK>kHN!C(,ެEk\mZNBl7]Kax[^:isZ!3;,LiWNYݻXZ/x1>DJ$X |ʅ"n[ؘ)q:yI<~Bh/ ,:xyYT:Ii<ᮃcm~"qYh0lt ZD@ē:ؙG +`?5 fC=3LyLf)p ͧ'NM zlZvcN"v*v&8%Lʅ9Bewbp!#Xr uC1-n(C3}7+r3-isRߨK;DKewlPxd6`9)H,^_xe}ۻO7hr^z2Zxkprt^9 }, .Q~7+'OMg ;bp6gkS²{ (#<uKf z&[ZL 0V c `M&ƽb8g#da*yVl@M^Gq^f`Lg:&F@ Џ# {ز_k)F<>;7MDeE&G]& ?}n͔[Ik&ɍP +/|4C=TodgIϰ. GsCvg^ĮA_͙ 2lu<* j:/fxil`AGiZx)^[.A3O-)mG &Cew쇔 3C,F񘷩ӓec5J2N4~oydqw|.?mܡ;gř\etEhbFYLyB';,)Vdn ͔$8T'[bx.Ӛ}YbN=ӥQ5c&]oJ$ua7clܒAJGIKrhs(>ܯbF EU)t%lDoU?-$2ҫw]T9.AꌼҠeXEﮎ1PuG5F%wUI=a/wfGRÎoRͤ2!i5t%͜tUe|c_Hmdnz!ڮEMW NWBY&sy!EΗ֒; ]2w[^U V'zs@I+Q'L:@n`/㤬׻ߞ~g) l0Y)swҝlt/F/AM`g?&,齛E#[f#nV&ߩ6r,h&lWQ>VkT-q8Cء8gB8)ڦ8VLJASG'4E& I+؉0f(G0sٍn*q:cyAqk>6f :q1}ϼ+G\d5.4>38 4Q2FɼUoO-A*J1e7yl o|>U3ԗQoQ^P=p7xUsU|W]`-}m0#VX=nr^xU# PCG?oq66Gj1>v&&Sڊ/v9O1 ͍䶡6L̘~B5Nn{&=%d GO\Y _i1:{K_bl =!ccRP?0_A}#+k(Fe0Zŕ(&?Czd۬4A+z>U;zP؃Q %+ӅTYq#W,4wJӴi̊(mlW4UقLޅUrNF_a]Dvf^7fZ9nv *粘aO4\F#Fk,&v#10\b[\A@rO̽5vOFEh“eZhMk/~3`HTg_ XP%y\d)~5S5%zx2e'\Ve6iɔ7L籒 3~C=%-ӉMaC!:$yt&kM#ȓFuuAD!+:t z)|ZPqDb ~[f'K;WU㽪6$?]M7'R#?gqL&TO1Eb*Tv/flDѦ/j^5MG^#ߎH}-d>PO~cMȄwtN%jb(1( aҾq$yޛp6q2{/m3!@a[$q]VۋօLQk–datGk"jz&#*<z9m7WS&/<)oǓ%7JAUe㥜($1M< x/]fyU^tfeA;בg/l`> stream xڍP\.Cp4-]w ![Hι{U׶{}5ZlP )Vprsrrk]AuA.`(D sg볝 Ptp^ q qr99euȘ-*E(F/ ur[۸>O# %( r!sW@s{zWFWWG!vsv+jAT@UƎFж%ׂZz;{0qypXχj _  lB!^`5 l)z! ]`{sg?$5] ]"0]XJC@WɀA{quvo`XZ.͑Cvr)m,B  O ^?J |"@~`+ puvS ` ,@`?AVw{8^P/_['%ظ8|~^AGQ7\ VP_>w_ }cBI 0Ɯ|gq#(7oBrnԌogκ>_<55* Kj\͟@bm6] Ku+/%=d`HUl\{,pyfypHYj{¸^̝ͽ8zEK8!Pgsy~+3pAg߈}@n? a>c<Ȏϡ_8\9{&C J ' 6vIyO3:wa!c|%c?,գϏFd{D(Pٴ%>:(; `x {~4C[NqP}E"1 + 3ީ'<^b" aOEjmn^:Cb KYoD>18܅9&Qh+Ԍ>SJ}2W[ /ׁ~H(rҍ(1_ =D4ȡ)qفp8W=7nGe`@ Ͷ/t s+Xϋ_+Aߍ%MM8a,`%9miݒrp۴{˳^])Xj:k?k;'xD>5>7b7aG zA߮=wl:?F4Q(x:b%,}s}@وi0Qhf}|0Үrƪab&٫;\F;rMA ʥ_Zׁ,ySk4"9LI$a^ՊH+NjS`e혗X uA0}St ;~:9 :oXR?dLǴ0X?O4F,INu_e)H7/ъ04Q$Lr=]-u[i@Cs}xGrw}sЎ+i2 {H^Dea#"BlWHVuxX +eXlBqm0Ƶ&oƾ GP[}lNqp*k3ڋ!'i{v7H lz5YeI1J[ T_(=Kڄ/U=&IHkӱuгd9GjWG&z3j1yyhoNӡ;Ιv46 .P)7 }k1ݘz@{鵍 gc_(J[[W7⮤BR Y=fE%Xsi|K2$㲖\5tǩDE>:$kox k5ҌAoW ^lL`G t(nZ|_$Rc88d0+;,yJk*%ZtJtww[i7~ur/SYN+/8!0޸bGc-$bk}zg9q FFg>w78=ܡ'%bٖh]}nQ.6 E[a&"1x kf.+/cD]庵OjBޔ!y{HZC̻ق5W$(:>n7w1^MKU0z0NQYJf&U"kQF% l$${ /G |ϕ LY޸ /mdsў=@8&~Fu8aN:+P_r=chZ%AlbFѣ*:=/C謭P-n)8Dn<3ZU#wiz*7 9*|fN)]T@(fOEl*)?*ܤh^^y' 15}N[eZKGGgS' ?{㣴kl2?K.eT8N9Ic/!̳O՝lk)ܳz |Mњ4꼡]o Clnoʠ3Ϛ/ 6nk ;GUJtinfM0l=iv+3nQ=":ߙlb0ٚPW\S0#"^K;BH}n7HMJ6CkXD# xlM_{:EճSZμpP1"ō{g?DcDO}VOw)v"y>lcf抹# lWj>(LVL?a7bgQl7#(Nw`H x{O$t"ԅ։n{,X-"nqoS%:Fp:Y.IdҼbRZ+On S ۪:C o2*_V| qg]3U̱!7bWLJ #U"26i̕%5ojWZM߶^d'd":P 8m騳MN>6rн ef#:z b_Zx Ssx)cka/\]-.upx 9]{!'kg"3#DŽIjn\:딖@Twtw1<~q}|s2YhǗ@q 3fEw[~d3ؚY8E7HL;R$4ݮFQ°% aݞtֱűi:cMV"jQYV)KԥWou^ٰe@f eՀ~B}9~+pOq>M !v3DǵC쓡pQUq#&k¼Ԡ4M\wN9η~'KhW|⃻aEb-\nKksFʯzH>Kh֟2BAZف3o <+zTSm>d//!Eȭ o [R&PuSl+%D /ag)5UYry]{ Ak6ݍ/T3k)7ئ,"OmcT@ IN+s/%oHp L[?E=e4:ixX;vU~jeTx 7/z,EI騨)HPum}-wX;i3 Ϊڏ֢ŚmA 2-(~m;7DY^._Na?5/_ gCpCdVrwQ2snj2YzaUiB{QL"-VuF,P<6:z]JΪ rQ)e҃J~ơT{S&[3M˲\ʴ–,ܜDIYk4{$9>s/$9y3bzz's)uN^o%8xPp{7mcy!Yy%x}e^@זeO / M쓱#ىKZ Ṃ~$#YAv6~s`FbThK]snƋW'`^3K ɃڤQk\0{|r^2:J&KNbD@:b6"M[Q21Jg?3)^ea3du]Ln p42(kɢ8[Gb̠FvF\9Ɍ?ܝ5NiOIG$f *e *ZCl ulB)g2}@"aN:C #"Ol ٕ_a(y&͍~V ͓OÏc6|VYlke8S9pM2+G.=҃W=T%~%.]*R,R v~4TA8_ LPp4ǡF8h۫\e `4%o;j:B/ b#4Yr6ouկdVѷRԫR?Ií_3UBUA!W]T.S h8tцC&m5Nm>~Q3x8^ w$) er腿9g^5\ߕ9Sn3Z y*)VdЦ?zrd#:ɮ1tr/CC}ya`}YSν]Lė/ yJ gAZXoP[/G7DMy&jTEon(|9>7\V.$OHf'"K率QGb$5߳kjto!1C6HzRTT^WO4|\,6#<ܹPOt\,w.M-"= ,"Np3X2R`jӵ?h3'Z% ΉNbR$Y;f&QEێnЩƵC< 7-cWj (UN]6LӮKUu9ybզ0fiF b .0 XU\(te$a8)xa% X&Y'yAB,vAmHj|o+~uk+:&C%h<ƦO䱫'Q`㎤DӗmIJXLe Symj)Y }+\K`q_ XK3%\xls|y*7"^VcOd~xfc#džz~ ȏp]]SJҐ}4 u~s+XfWG#i 3ʘ?0hLX̝`_R0?){]e25u|B27ʹ'$K:{_2^%^PU"FHs2ݨ= oƮK(kkAן< 'Q%+ŘlDqB\fdd G,k-ѓ|x%1MU uTKOlp3-&Xa*'_U:m̢ey( BTMVJݴJ**u 4At^/0zpD=];NۨSőM,nO}-Wɿ$7Vٹ9jbSRHƂ~%72x4J'qnڡ r$-c PeXb!.^ $ҤdY*Z.9ƝM$yHyr}sk4a.sУ} _acԽX 7 6 Ip_eFmG gnZ.՚"ۉu`YYSPGDY޻Omkjx~|Nn)ےW Jq܍,)ť_||KH\+lb}yŅs7@R ̛lH؝fL]Ĕ+_z؟5&{(B|BU1صƔ%Fsr%궓C <[}hu Torlj-; @E2A̯X Cr4>U?kG^-:YX!dkiX a^h=Q&jT9c8xV!lȟδ҄|un}SzCT?UVν-Bڇ)(L#;ྷiq-AN{le+ Tz+` 2.`AJ-_Fˇdn# Lx x3\2Zf*{sTdszQB =XF+G ;p_qv͙$fZ j+C?Fn%. اCUfDp~"DP\\Gvny2Шz%]lu.P*c1+Db_DiwTKI(,V;ƵZx9Jc`ԉ0PَGnR;BѓDNoJTT:+E{*ڗr{wWBSK؆L}ScH8~͐GC V՗dE805-pl0umY@I+3[#*N}V;;6$#Qr: fݙߤ*;TZvQk/5kezV1 鮔/]Qj[naZ,xv<.N(>'?۩ endstream endobj 172 0 obj << /Length1 2405 /Length2 14849 /Length3 0 /Length 16265 /Filter /FlateDecode >> stream xڍeTضSw]-ݝ!xpm*vj-mg9P)2%\YXbrjj,v&6JJ5Kގ_2bN@#M$*ooqXXXXl,,wY2v@gJ1{O'Ks I 1r3:Y\,Ml&@1AŁݝ֙\nbP:܀alDŽ@ Ptjon6&@;g) :*-Pt-,?2c?ڿ Yldbbo`diig0%\<\FvlAFnF6F 7H(@1'Bg'Kg&gKQ26J-N@P=)lfigj;SWfu;KGW@$?4s TX#ab5O_LdP3P(@_K3 pqrz`ji0[!"Ơ.p貀/}Px"[T`dcgprxkH?KUDg4A w=N]WO66IW%adkiP A4vWTM-]m/W4"vfel,i4Ut1M&;K;U`dea?<ЬX։3;bAJؙ؛96N.' 89ެ4zf&;{ / wi8"I#. `q% vғYSlA =?M,-M,L\mA Vr22:?[(('Ș (ppqwYMXMml%(H?r;  ]3KͶw ?A|w" -D*_ (lq O!XAۆ_A YM/6c?l*q5ct]9fi2 9ظaЅ (=.@SDWYAc7+ qgЖPo6F2r폣bWmAKdORv6wwAq%yfAЩ{d NL\@wkv_94AX7鸯!tgܝ`R}s%@fg]FȑwÓ%4f!X ) O(n+!Ip^f꒥ !sΡ9Yŭ68j=?" !IEA<-/cЙ2̏.qψ22:'wUsȜ?> _jquw=Zt w0ER_3-A&S8q+|~K.?gkQwpA7fox\d!u]v<5+Es1m9ݐ|*G{^JD@,)(# juW %KrǔISy 6C]$|cc~ > -+n4gղ>`fL ƂeZic&/:9,<E7% I&75ݞ iu%sRҭ5 IF (G_7Y -| O$$OM^0/w1ߏlylrpfyR|yUtơ("S!h%կzJ8똉$)Xj:䳮n^xV JqԺ#wn7_< oWӨGX `/`UЕ=*vS1敫u&Dx1UdK KC}2ZDQ͙y+XU 7蘃鴤Pw:G%-*aMnX #0'b=㸕A(~3Ā[%]r$&G7(jw j ӭg=B سżbDa ܈g>i_$Ԕ>ӥO͢u8PbN RP7y<#0`A ױG=I ]{N;lxJsc,6_8+t_5]\FW4ֳ@1 ^cfq1kS1@1Sa11'VM[pnȞ=T >&A im: uul=zUYQQku2y" Hūb&8spft*OcUQ= 2%7,sMN{ZM^^ySxit]Yׂץٺy%6{+`T.?$bt_9eYOes\:lFCB/ #O2[lȌ:$_`Xw*d.CaS}X 3)H qMf\اp}ِETp6YZx1^KM#پh(NRMsKFwn-Uf?ڵ{ơ}UӮUmwn2棿-6|5e U'h`[L}g+DwC~\{LRz\0@|8jǑZ(WG`j5}!aF\̒NQAy@<9b̺A n9BO2gX#0yk@ϑڸ;M2a$G< 2e t2 㬊,zx쥼5]t0f< %;TǙEe-yϹB l i,滣%'Wɳ\:f0'Bm %kݲ܁ L??}՞=Ug\bNmFW+Pxov?a(K0H#A18d2pl U>5pD/BzT;~[y$ &,xB'"ffLQzr7)}hK'/5ӈ4꒰l)̓4P{Sw$4K%#}B9Kbrpɓ*)2 h'j9^M#9ZϺ/5$0WzPl~?4DX*I^K:;p鸠J*iۥ |{ `+ pQf܉͓1yn1Qϩ{ \mbKR10KH.nqª\P bI͚Z(ʟay1Izr-Pub6ier%axW iWX2a 3EU>]!kpFPO|V۟^Nw $fթ̑hu albb=xi+Rswk;cKNk-T-˓5-Xs\Qg້@"0D ݢql>6֟r&L*L7/gJ6h9`\uU ^=泯u0s#x L\׈8Ad2j?m^'B{XnUc;"E8MC;]eT(wۤKi6%J͐k,SE#~*m' +14ݐT^ `{h۹ztZJG" zض5ot{5E킄F^t <pX`No yfszО\X]'Kz?&uܲyP. o!dcmEl\+Hbi䕻;|P[.3 tұ ڥPPkWC}mo5txDs i볊 C-N@Eb6Ľ3vFj֎>į{N}ha< f&ʄjPuSrp̞"#s102ФRRtr`S9_VI m|Lp Mƻ Su(-ݲ@q45ӝo6_"GuޜܹcVRM"Le]z"H;[0\l_Pzf}N''CP `_eaaƨa@ VQ_"$uaO!nqO\y&ʕNc1%C1^o^80W[v`u nέ-3b nv2GrA i*r`~>Km_Z9A7bL:Ιʾ4˳VA@=`Szk!B ?8]tqw' WkӉMÂ호73,*$W: w yctQkeS{dp|<-oB5 4P;s%pFA~G˿VRA'u9ř줶Ƥ2}zA.}vi&bWh5䗜r7NAn"^pV0$\hHU(&g~d<& 454^q$WvϽ☣Nup8on;lU^m kMњ2{z de MY5"Ê=>A}-04wBzx[ [ 1^}^Yi;h5uǴp~i&e911*3OIdOMvP^~Ffo[J]ba+VM;*,JeY$xtQn0Y`#<Enat߯GM%ۤ>&y PJ\n@|cyڒN 9Va$!&5b8~2E٧LV]Wu݆i` qƒy2=n[ahY/FjUP}¨97e&gS;H/?e>#*o3V{o >M{uE>5Z=ݑzdCJ0.[ǣ~3 kY\":śׇԭ`S4L)RvEӼVͻ.gps>ǜq٬뇠- KI{vP.՟ e5+aZSH(盍 lW,d]]%ҍpo=җ%lklIm 67=t@7YPXK$7gD‹` cDhzV0p9A}[pGQZ5i2yvku bkQvP ?맣\ӜܞC OD}Vq{H$`ؽ/Oy;j+Yzz.zHSS&gxq H[y'/biwǭ*[+ǡqxr_h?|$*lO0:j^5|0HrI*4Mܨ ϑۋcHs=Ҏ;0~Zq$i 4]> Z".lۊ4p5叽ܲۥPlPŵeꊋ [J˸ũ\!ȑ'%+ڔ/K>^S;e[3.g'Ԍ.bO:Գv\QV%=Z-g*:bAjŮNǰx6V%3S~Đi>bØoJGʉP?NV.q\{2E¬!3VKW ,i-ּ>7, >ŋPve=If {Cuzz}"䡋Wcbe,iPԷΒvoH&&0aRp7Kd&W[=g9eN:bfVըd5[eVt2\{C^y0 8f}J5kԭOp/7~F m+ ~h;q1XƌA$qS~1Lm>Q`8nMA>>(v)l,x:)!MOC:4rh0?=2FȖDZ$bdeW?CKҪ|mӳ[gv%TPVh> =@@X\hpV2(I][_~pF[8(?vdAYfZ*OʐK%FcMI_ v|yp%z^9ȡJl%A4%/yu须O<#Ơ; X4棼b>s݌'ggQ&08:I=u!l  ;h'.tB-6{F: \&vΛ-e]0 ' =:ԍELJu"%nZg2_cn/ݑ[Ҩ-z+ƌ_z1TŗŤ@U` m@(76|^AGk>.,NHdK(E"ɼ$]GAT_>TR ÐtkS"̮vN%8f,̖(>`&PƉ,Ϥi!S Wq EH |kG*lV"Q_v7,NV$#s6>y (QIK\j ^c';HzY| |%ړ&X9M`97<2ZrZ| nt#c!D- V\6L2@t0Lب#-C㸫{0y9F r01_͛m- ↱RJQZU2? yVPLK)!YR{Le'ŨaA 綶N8`#zyo*}AD.NBF0.φ(B8 RTP/Z:N0rU4rXhe:ty`p2h> ^|`$iFYD!T!~7$ZaWwOHʗ YZ (R#אuQN_8j'JUzb q$h BH>h+a+1$9sX8* U> 1E=Գa'2ݹrU'jhU@,%} Nee(+ЙՂ 0C'(/!FV BZ:F%00]rxVE8iZ`LzZp>]^vq}H"˗3kH0ѯzA"`A^a1}̃ho[Q[e(ܗzVa^c3` ]$}cGUH ϕ]Nx'CtwLfu7XG˹j7Uֿj*W3K$}u(r*Z;4i,3N HQAfFD :AhO4ě$,>[.å1zw3+lm8\y&Kt9֋zL8OiOFHw·ўB Jh5iy|Z3<~t.K_FHUĤLc1"BgYlȎ![up &#=8 #qAyz‰N^WMa~|~!rK8,F71  1v#-Tin.d~mĉ^{H4i*RwW6ȄHɆm.F릕>tfgQhWdӌhL18/##/p\z,a! ޷]قeLbYiR !U! uC#Bȋ٦ľXk2~ビV8ul}:Cx @ ETT)ԡ:cbzR D ׁw\.xҍp[eR4~Ŕ[ξWL`$<|KGkbC-DZyFPj9 2}'頮h34^ AVKBpwb5~ P%:^gzԟHGi~6ef Ie:9zUzG:>C}$*ـU;k^܇k5-G &)Sz̨䷅uw:e~s Xt[ 쐯'Khk $޲ 8hueFd4>ׇlceZ4، r'zjp1֡¨hw|yrrU{uɡzt CakŖĔ AVc":QhJmD ^{py:܏m;o2D 8_Na4p,N9y ZP?rEoԻwH3cmgHvyLQ͚̇箺[iЮ 0gE OU[Rv+F7~\u2쇓 ڬ0 ς&g؁c3'B%5 ?N%䉏hCh*F 3ޗifQu~Ct7)q*Ռ}Y~1D*.-Z ?@1ڠT=M:VW +V:2\'WEJ4k^?<(D)C&xz*}EGA>/`J~Ot} O1 7̍v!70fdbbh+k\ՉRp(/=҇>)֡v"*DY(睒|Ӭ-9ފ;"͠1&p ZkoU z;x-Ӳ~$ Uۇ0*'Z(;(7-q+w%JN\!|Va)U|8T@i4fXӥ 2 ݘ>X,I,b֕tVry^2GMq}0"FVϿQ {\lz> wv=rJƯj8/&4Ph E*Bݥ\8]ƒqeKej/\1V$2R)iF}ܦXA{.^ngnw(x&I^-9xCAi"ޝ:\TGJ) oҩ"{&`d L|J&1 ;0wXА@:ӋWZ ^cӊsItpP[ZC}odfyHfm$W,Bc)"̴񟈞юdtO{(_$h9udbfrj:fp ٛQkCF[4C/.QoHlX1U>Nvi#Pu$/Oև!՚~YR˥v#;I¼;h^cFhr(kg~ AQ0\yߏC*<6L T)K+P uǜLvduO΍I2oXA uls)U:J/Y5E7EvdٳtZ_Hݩ).3c(S^c5JdLESZY&wfmE"[v Ѡ&`DM!s0,0^6dT)P]S/\9a)%Cw<ƘBHgLN}1;Golz7SyWvic0#+ڐR@9!b'(3|ܔ1!]@]\E5PNŕ*lǧٳ q( %t]`auXCˉIdpL˔2cx6*do% ;9Oʨ'=K_7s|'a9?Y$VY>Ԭ D`J@@SqSZ\oC2δ40@z} 7'adRsI}S9?[j Z  qkiyzٽz;nP2${,o0x/Y}PL?Z]Yo?]Zҝ-!Z_B|؏Y˓3rH-QoRRV5x_1ήv> ŸuPF v_C;C,LI^C.kXEn8OosHls׷1nQ_7}4A{{n%ܠHm{M#9̀Qo"s~lE<1)s6&6aYgoǁ(R9R1KnEkiLI - =uT4X"rXq ~xAYG86RSҥn{dLm+y:qԲspo$I3?⩯+mxRf}}ObP!;kMnOH{V] I kFL0* Ŝ=SSJp6Z[%Q\Xf* 1-=?-q t7( `|^wgJ!?}kYb/~5Wٺ@em}`|DEI~T) IND,{q^eAY741ƹ?YM@|OTinhJ}zy- ~+4syW0@{HaKCٙpųضߏ⹎k* $ `*imٓgKN_.7˥{Pg~O潯an&!`z`7|{^6o`d3-qn|{W15U#I?m 2Lq4 gp:fX w>ŖogKAYExE(۲-}Y >Q)1M=Qyˋ[m@ѥBGYSSMRf 'YT0DCgl#RDž~gr`KWDH(BlPq#XH})C(w]u.P m FFqp1vLOÑ/@'IfoCM[.P\KpjЌ4DyíW/(=rPY|,NUJ.rzFַH j;W3V;d3)_`9[OĜ:x\%`2:σIEpNojחt>݈>~I JEeZ :񢞺J)SR}p6 gomeMtaKb!5ETGcFߙ(ȁD9g2YHQQǷW d*-vVKj;)ӬkT&,v-eh&'UY#SVS/A؊4~>A ґ&MhRija0#T;籶{ض$dÐT FCaMeCfsHH-C9vg~r5"#JsȨYş=YXKsND}R[nn=<^M 0lc/^Hj*V0% +S#P$5hR O&BIZCjfA/-w"yM7txJF1)  SOߧ3P518U|;"(H|ף| fh 'hMxOo[_n)!u_u ϭO1V1xM6Qqk[G3I,̐xXp*\ǷFV" ?] endstream endobj 174 0 obj << /Length1 1615 /Length2 10193 /Length3 0 /Length 11243 /Filter /FlateDecode >> stream xڍP.C!  HR-Cqw+R -8r={d3a唶q+@<\"Yu=en7777/&#@Ea!dr rs ] Թ*.P0 Qbg#Ś#,Ow3b Ap{SFk@W1{8U9ø\$X9^=@ {m 9n gu{' =x@m]e5+_w vqvA} P;- TP{9  '˓?qY=Y: =uw0kw+8#0OcȺ8;pAOs}P/߿-jcG6@}(,͓?2;0 -+?T!~!`8b ~<8F<<5`@1I ?ݿ;~<?>>=1?(%wVȸx8^~˧CAP[_>_%{߱4\ O_oc fRC;&4>L̓jW%ƎEgLjx{>{WQ6d\,6RXtvGL\2Djw ́1^Lʽ箪g{?{)T-[doYB^Xu%EsONuZ֑ґecHy[17e+W'\[YH(տ0++__vd&\3Y1IK ό5Xl{\%,FZܘ[}"*qEaHq-:LG= 곹wY97P_έa{ѹuo8J4EO6șR˧gs,1CWg TcfabHQdw Ҝr _׎&`ULř[sK}H <\Q "IJI:ºvUi]}eh\V'ÕAmgm.S)$Xɫ3M5:ifC&W@#" 6aaܝ7`3|zư7z(Ѽ4,黣4եzP*Lb# s^;VNtos΀3%| OYM"xf;F=I>DԽY_y07! ڈ#\Gҡ 숾8%juXT }`Zluɡݩ(eI2#D{3p29 SZa)"q`z{H(B:"} ۸/eBœkORdE !&FBSs.~_jPѼm_keLAG~-5U[0"0M(I"' nYZs)9PSD|r, Mӭv"x2(]$` Cdf hFag 9!L}fmgm d_FT|[R&Sp~m! 3v\g!>D$T'ܘLC ۮ9! $& mOu-Jʱc'nKt8G#.hEaPa|>cF%: *,ada*P*D|H }L^S,MyQuIq> Z}6(:TMF5"^U$kCrPÐU*sRB{r@!Ǿ'E y%b zvjMά}%f}jYD?֮;\ |YE:`wzbϽI; w3fF?$ͨc!W?7߯2ܳtI&fNp==jj"¿)UU>^qZډSU~eKW$S' uTÚ W$&4M+0,杪mu\u%ۋ;`dm[SE 9Rq]8wO.V^f2gjal@/gk0LeE S7d3sB|‰cr)4`[詉:tTWR4ʃ=$hmQ\yGXEUD[fUx>q\o"0߿aA0-#PP%^·@RWFRz ,퇌#n?r鷏;m=tmvSֆȭJ~8ĵJ_}_ oagtx&?៙+-m^ovH3 ^LVrbF J]Ȟs!'XF'dsLtp3N}޷`u$+j렣Vg%hJ -^ _#QcuZ.%;xoaf{K<;Y[xj13ú{Fwݸ yoᙋójFz.W"|O0`U}iӼ}ڭ|ѕp'ڸ< 1ϵsT 72%\wLIڛM ԵEǻM'J.ڀR-ⓏjRŗ^}[PVmD[Gcb~N2~YP[YQ{_;$> &'`LWs6C)hۘ8)N L`PņNwQXa{uv σm$ڢ_Uߛ/ϙPf9Ygpf\Nwš(aM-BoXaH1uHq>m}$d2i~ox1.Pwͯ^^Ѯ&kD;NfxXvMv²Ջ.^0GoIݣI;`0(w8X1YkV GGjcK{JJƦ䯵#m&8ĝcxcС{ї;4(d00,~x~3,n;`ͺc.oy\ѼDEy0_V ;@){hg ZFsH酆zUb=\ϑ|n-]'_#uL::m]+Y[2]bNŮ(-)g膏3w;TlVhdwGjsW1^DDoex IiQ:0멋I΄Uw8j ْWJHV< l!7vTLKcH[VMW@7AZ/B`ʼn9TT mURS}黮x1) цGa&|H·i/f^瞟}jc%3IJUREMhUQi 6:,Ȃ.|qA-g^~ G񚭯" g|F;ZU4B/" wUf|(i޷پk,`񾇹4Zvm6⯘Z~5Ҟ9).Nn%C1yA-X[[!Rۉ ul71iJm4~~kI#.2f'u\~FS ])Ayzg@Iz;Q{TF,oq@/) ~Wl ~'>7S&1›}9QunуsAT $RQow9F ^LxdK" ea]x/q$#8AO}l,E5p|P_X-\cݴS ^޹)/}dϾbZNwUa5en$tIN)yT9R 7~5L}DA7R!6YIr b^e3;:T5KojuL* B5$WR)fz￷|iNi($s]3~-Mz7yIn?u_C{;ku48>KwL++' 3Z;T}FŝkASef<= =+LIc)߶R7K<Ĝ`3>u`B դBFE68%ĵ46F,o%}fhY5lu+-P;wQnkEN#Lc*GoX )'xSL)8K߂UVUZnjT1~b(R՚^SbxriDU1_s™^~,] ajG%d2.zd3!A֛y_ &&Ƙ7| җpSXˋǁ3I@P4+eU0w+K7 KRUik2.F]-qʆė ='"]#Un YX>RYؖ\t%c~st!=ψkJ`a0cD d$#%c$ΐvC"NVzϮ| V>׌/Te~T*\f/{'?e]s< }:ET(vbE)doU $x_J/I t_P+n7^,- '7 y/$j^_C?D.2i ܽbF&F%{ !#^Ezid]v[#BO+쑴ɪ:u*֘*PU8z# 9 /.Nd-5 'o)4eae%fDpqW%V0N Q% 9{%ecDAH>nX38~sbjrP߳G *3YAAYq;%xi%-E7oX?4 ϝT|%)7^g&oH w"Rk Z[kJh OudPOlL~!5S 5/)x#?3uEԒn^]{v=FraTcb. M,.#Uʞ*o _6PB^JŦB(ݖfEdRMpano+,wXezG51~gA1^\r3Fj4)xg}gfIk̄G{èڶWRD=/Cpn} é֢+tvWI1('SiN~99Q6(ͅceΨ> qd0*,9=(✰\`ry䆧u+j>{nӻ?ٮq\c2n6׎')Mõ0ZrMqz'>|aGZO0؈}JğeͣL^,#uj3ye >"05rQM| ^+ Z-֜ ` T}mX{,;&?q]Y0C0n.jpUN´||鯇Ajا&" qE gdWKp~GlD`z4YU5|5Ê("Xz׼~ʳVHbZZ8͢19G)$x#+*O( uHۢx?zU%gqCV?2QlL8 #pe"c0QE܋B~*FgP\ #9K3{]􄰠sJ*9],l>!j&|jy2?[FDDe5>-ݓ4UĹ9TK sӣ83lup%bP6rjw6IKs#3BS6} ;J o?I$(h_)|ɕڪk%)xX*7۰ƑQzgBκU>"bT] <: ,kEMhؿf ;fm<S9\'z'P )\T3uvH i{K)C80 )hz8` qjQ̍6mJ ,12d߁2\WR=wh|%l/GӸ nǃsNfODtB@Aisfbp|vg4p#jmExIFN@.`D6rt9\ٵvCyA,  H endstream endobj 176 0 obj << /Length1 1496 /Length2 7359 /Length3 0 /Length 8364 /Filter /FlateDecode >> stream xڍuT- MzGz@B/!t!@(I K/ґ EJGDދҥÏs{}oFH\k\_xn+;($VXL( P3@(Nc' PH0TPuL &ꡐmow &)+&% ā@Q^5'F!U 삽^_~@LFFJO9@A=(q" 0ApwbѲ"PYQ@[2@[ +arB;GbKp/. GE pb"bߍ?P 偆"Hg0aPo"@PkŸCF¿a`^4#A(1#UQp$C{j/8E\7$/@::5C"<9!ǜX=p?L?Ik Aht-p_b>p"11#8HwÝX'͵QHw\=;Kߤ ( KĀ } w-sז}"^k65Pww'C=3덽=, z`ӠtvX+h ,/7=o$A~\W2[sm?) HKH^^Pൣ%$bScf.\k 8H~_@;][M(EJD ŀQ?  x]b[!u=|w_ϋHƿ`r ,}`򎽸KL>F'19MZ7sxY'E4 ]ofK{љa!F!uMyeG.D|5["dx}DAdxٍe* ܘ=il' %BL rAӵO:!O4D;`zL?'覅8o/A@wV3vS"& }Myo'4|i,nog9^B]Y *Ԛ/Yy$qd]+Zu`y ~H <,ەnz s&oVvڳgVOF' L݅r)U= 4ݞCJMuy|IؚKͼjS-{ษ!ۯ򵣸7Ɗxjr++k7̈_ м$䤩qFc1z)@nb`~̷: ;K!& L7{-K^Pp}ߝ8nT!JY.vw/" ZZ{5շ5+hr`R{1ϗ))m MdA>a:yd?\M]b0)*~\*Ll|H|?VC⫘ ~~D=Nܪ9 F2/Y^|Q7.f ӮO{]Ljk@sVPFPuL>6)M4$Rx4BѢtOI '@eq(҂mVOUl^- R85twˋ o<1`:toq*+>׹Swb<9T^nHcvq`&'^ow:w( B튬wٕצi" mt:ReIeʠs'ZœC19i\zWu lQ))oV(n^Km9}mE!J ': +wͩj}_bOwިmK鑪-qm`pgaqb3Ҧ4Z.*iM ă2z|؊1䫻玼V;wNrzm=y[ij쫡[]zF^<$7ب 5 )IW;!qAwɔb$….qC/)V+y촊58yѳs$j FECbm e6tb"iY&d|W\TM-oQ,<55w7M'wª!os5-X6w_}l[S-ޗiV~X&QݺKG? ̃ xMOcʏl /I($sGX@ R3ٱ_"a }}$Ib'tw Ix;!rPaLWBFEO B ztV@x~KF6O"ze Mda{)iӷխacx~:d-Ih㚏ʋߗrKzdmoQŃ*(]cM蓘\]nR׬|V# =0,ΤB}}: 8{6(\H]`#))9] 2 G=Igtq2ܰdR 8HXQ;|^ܦ#`BraZ2PEqFQpU _QOFr/?^N?f7:CsQxwtֹ#{)co93`EAOҎ/i 9E]YX ^ÜszB@ Šo9QoBnE_L0!:)MV{耜.M6H(9Ldԋͯ癳s/j/RpFicJ]bń179oմj8=^63-}/~qd! ~DQ$S+zJOD@Ƒ0 հ{N_c?f=(OK%U7`;~fA8(WQg]n>EcGYa^M4Ia9*Tо}fᤝRIzŭ֪,&(g~ߟ, &58oj!G5(."%KQilY ^^;Xcl! 'Ia.pc:_1"߻}5[LeG;ujLvom÷ٛ KV|QN䯍G/42$ pzvjF"y'.'?UN8-G2@ _*C2o)}p@|42YXDpf91Czjr Z;J)cAd1_۪l96z:5!py̙*#h:F(EwO #TOl:6͇3GvB-44.ab'[*I\=Ȁx|Mc!cd ;rc/5Y|2TԽ#Et:qnҤڵ&ⴷO$RE=} :4ASw"uA2ů<&/* 'V_,S3Kl "bndkTKI-.heWe =%1zxѿ"rv77N{" "됊f1JU 6}Ns9ﭷq9I͈v 2uZ%.u6- qʊ7Srh?QÓzσ.>'.9pQONl=P?H6J8*JDY`?xO|vZwRmEE}3.*/k`&ĸ9W@NWjxʸb]*էc0$5SCH;nۣ9aOZKˍ> /o+4^զer6}nVҝW_t'fɀ[Eź5FXRZh-k ?b}XwYE=:dE\L>@g-œtd T G?pun n%&Qu?CIc$C3ыV/`[%U&̉֌ =Oyo}kTY;#z/51>CJɫR}Cb_̳y!!Av4`L9_ :Kq,TEKG*{sS*KX΋S„;{ O䰎UP΄Wq;B]&d*IlJRl{Pzavi{)')'q-!θ{/M6s}3Ơ!k P7DPP&EB>~g8-f >iM5O?Ud+3;&/kV(~c2Njt>E@}M[?j-S'n8s7pxn%~rߦWoo˝gÇ, ]3cV&=x7.$s!d!+F0LڋRR WqO~G} ^!s@]Ŝ,Tgv_-6҈b6}Ѧ;%WpڲlKشOidEM\~DX@fخ2GǍ'n98ŻTRT=xB'#s1 c":X#I -scHHo39$pڎS&:$:Iz=dA')Ot] {]& )ç'a| &f)24Z=doc)Mtk3[jrꚨKW. ;\|7)hfV@#]fszîј*~+I=waGᨴ;8u,|^x$͘iBښ]ڝK潣Pu X)N1zw:z?㇗3xci%*o䅏 +ߏbTw*ŸTq] >ptZɀi>>-AU /+-%m \N}kn'R@55̌vn&?N':Xѩ@ b4etXcIcCN^DgS.<Z)jNA*fWnڸſxU-@F5|!ZhC遹l-yk.V6TYֿH!w#K>9<@SGE'i0ùY\\@@M̎|Go'bf{lu:5:ԐGrOWi zs!6}WLsv)/)h0䡝J M{mWT#xa+e m p$$14Xt^ʼnhZ(>&fL"ɦ]3 rZشwVw7uYMU fνINѦXJ _A5_$Ǻd}4ǁwUy&l =#}>q>+LXB-G4L4ŸƠ#ӨX`XFV*׀r2 YMFdGU?[?}Ϗ%.V ͮ0 F&j_Nm}CV!&x !s7FnTF%4rFj ; 71osBz&-yVfK Q_D Ӗ B|`?Ň2n6KFk+Cƈ쏧T÷e^E'٭ b9yHft|Iq9Ȯ7>n-7罳d+ "aN;Mחڭ7KՌ֏JRd;{J${Kd=m<ډ\Jqn( JQSN:Ik_.7sMZѧF6;{2+hyDiۗ9 Ͳ˓^3xJ!@jV A@3/SÄ%SxR/];h;3xx@$IĵZr&nY?6HUutu .D?-6[[X͒2 = ɣuZLk4U c]5vsZxf:{;䤙r80T\"4 qoZ[&FX{PR^UiT"{ww5P z%NݺKlƻ 5>Ki#B`ll,[[RuD>v0_cY ŗSQ6ƭZy:@=QgDžuM2V0XoJ4Zxpy%9}E҅#|XYK}$&Ih\.&uw HsjԚj|k< =*yҨ@T;)OsjR#Bt ;5LZ͡b}#,c,(uN(:2VKG\Y7rTnܒ"Rؼ(!Un7uLǝ&˫YI)S߬@}t/ܠ.;` zRXӤFyAf'`<""ә)j [g5R&#,HdM{{WYm sKwفd7CX\<RŦ}iE_g#rz3Gci&1ɡ6"<=X۶wj*z"&)$d;opg: e݋/؎=)zFEv{P 9,դG t/f~V'iBP_wE3)_eQ_pA)/zẲl-.f*Hd:%p8~}OnO~(P2ʆ06ž (2fQT!:yQ(>?𝅦Z$Y GHFV'j*oǒlM矧qϪ9)|%I<>@B>с> cm{eQ> stream xڌeP nݝapww݂wwMpww^>}﫺^kXA^(fgLUQaf01201X8[##W::YBh!1t0HXY<̜\\lMeI=_229f_,lv64675ZXb2 tC[ > ] - > nT~T-읝,0m5:;Ohw_e3Z8%Em!#3:ؙXY@؜*?j񲷳~0~|y9Ύ.@*13L,F@3 [??@wph3}3~L󿏘QVF^PN%W)$dgгY9`ho5pGC@o,9;+_Fb.e7ܺ8쀬&_SuWhbbΆ hkfFZ8YM,U3k [_7 >pɿUߌv&- ;cX^ht{ v.|vp);Q/ѿ7Q(qe .'_`TXJGL? }pQ>2hq8Ї w9*>}PlXM? ?x\>fGL\f{؛,>d$,?cџ*rb b?fcAcˏῐn;g?2H+ҝCqS7GNֆNpl ~f.#ߏ?;UN,A?z~tH@16vqh@cE;u&̑逸Q{-9vKP2OgCL y~-gH*4KkϵJn\2\-Owh3^B)R?J7D1>@=E|ƣ-#d->NVчl`OSgML<_GqpC#k,ĝɝYݔ稶6,6jКk,>WwefYWԩr` tar:2 zaF'H]-:l wN Y޸VAuT$Z3qf%Rz$]"gNHt-#ԊIL)lC~y޳ *mɗCHy0Cͩrw욌;ZuyaXEc1l ѻP)8VrUYXB/#5bfJeqs ?ߑc+ܕok%.~'Mך1>\]V;N!?wIָ׺𙄛-DOgFWߌݢ%dLQ~[Ȝl͏}TqUD=8{S/&noϺnj5S %J#ߥmV)Wֆ/_m.*>e7v//ƉIJbq `p >+ E2|-1JkQO]7}M;џ.DCm+qB[y\N{Ŏ6&cPKSD7͎o{,ӳ#) Y?h>Ù DBB2#xPHsʨy\ DbC@i,t~D7I-R>qGTxnC~b!𞊵>J :>2:-vTœ,:8ۼ/8͌WP'ğB}[ E FlpҝXKb[;犡 3uD3fM@{&ep1{[NEc87fCVIݰu<_wMVKMNɻy- (bƐ*ޔ\"Wc3,S>bUB vs1gzA=Z9P'KqUH^3bi}[ϏSײ lis~z$dc (Q}s\Y.\$ WMz+xE?$tBv:D},PSBNO&4 ^K0i,Dg ^z@7Y!JrնTfp:g@@\5G e ^Yz{/5KtSAG+RUE IC'grAK#O <A?:аm|IZ~Ġv;CjWClȍx;aݩ?`Te6 J(pG݁Xb0ϭ- :r`\AE%VV"h۔1p/m~q' >| D&s}EDjLe) )W0ń4w~=<>;a^lRKdF?mkvJ15{|C-X99~kHh E$yFp0h3_N. X#y4)Uʅ ޴'~*·1\o,4Re.YP_qj7AV_)25N-nBǼKqC]k;b1GbARoyC} \YvKI0UAo~U4&q Β? is[kk0TaXc79坛Yc.oZ=HVO#phzfP8l▄3Q\ݓ9PS,8b $d!WLA-侮0^52}jh[VA*v/¶>l|Z߽{T޹Esū\ٸ6 p:' |ܷSbCL~Vwk\1 0~I.n613{>hA6)'Jwʩzj|7]B fCy:}9:X}} t]m,M}5Cjmc4;stNW?ɻXSp?HY_ha=e߈?d3}Z;+bu4^`)v%&J% gf' LM^]vUvp ʘ%|ƝHc #gs %e˙oe!,8R 홑 nS>"[?sy F Z78Q8v "IC. 2++@ނiPV䁌:JFՅTBӝVr̴43&h@׳}QE= J^hU~ˇWɧwN쥗0a똹aWr7^,*:,ya;@7Ǐfp;GD/Md 4QHhOO&NX rMm%ρ~z|Y>͛TF9yRv M 6½l|"T~J*jƲ>=RK}G4ɹ3Dʽ>רڻ6f8>Qc-Q kOxKg΂m`Q[ukXUe|=ueWj^>m:oaکLvA-51-g\JSj,ᴛʄTJ]ad Өd\ࢳԸyz.DZ7"5]FzKޕ @x>4f*1vkԸ˾ٮ_k^9%utҞ.}yɍN)F8=Oz wDSq'4Nūs e;9x^-'FEsV F0 j{'dZڴ(4hդq/im\m]PM,m۰qx?eP1jB]h@gTo8ͅjgS:"UX7x|Xf*U []w ~$|_hzTa5nj7'lrhWBYq(4ۖr:i1 k:we1{jm)0G^˫DC)?z afQj J*9M ('OZfb&.k0?+l+v@杢{arNÚZWxZp|wuT_3J9 ,70cLwo.7s68m&|PAj) -{ sA0BIaZʂA]t/0q yR>VfIxW)'~ k wAw\>}j(;6\n}tW;}0Pź;rXxE #b U냥b6S1f9oS6vQOĜB-Qxc{n|EXYO=k3_F#ae`n.%8L8E]6}_7n]Lo(%a ۶G,˯ҩFd~kD4혿VA!1$̽hXv#'ZwL\޷]J_z{}gSI3Dd,Gi3'arƆjKخaK6JЛ7[3aj47~dc-猊)!;xibW X˻LxX{"'2~ns3`ؖ&۽:/e4oGԾY%F]}W1s6ZD Iy^8K1<}(H'u ӂ%Z L%Ӂ=ț)幛H'$ 'HFc^̀hj!,ZN.}\G8 {8ar&%sKKh5*VK+ts2okYov`[I&@iD=ߡfZXbM^3&nB3*ddꈐJs¼51V՚̻NdnGI1> s tkP:4,3zHkP1t$Dٚm͏Nc%qwʜT;1=h47{LoWD8]JneڎՈ.(z3?xZ/p9F{# '1X*F~ ; w?څ"A@#O#4 J j6 Kй?0\O ww>T]du%JzIgJΨw[0t͚г yTiNrQMzEbQl8*F[CQ2-R Y6V5.r$\EVa;)M6닋2#M >~<-O}qZ_vŘ/dJsV+ kr(x-YMYyX>ˣa s3Lxzklٷu.)b[Qߤe1:.%sc>fhY1yڭt=}X5x?r2<]=@eܔ>Fq4]v UO]+XazGP(ЬNIKxd03R۱r? Sa,vkbw+Ԟrp-dgD }O& IX/Pȴ ]j\Gx*qx<44"|n #TW:"BJ7^DD=::K#uzI#S̖t աA(3Mځ!ge ?($p2O c-P!zj2Ȏ!ft$]=n^L Q[=gv?Ϙqi (sye#-dkVJYa:\R9f:gsRSoPDɨ+#p&RW՛7o"an7fl!ǖ$ijLG('n,`mqvV@Gƭ;zq&4csͬ 8.ԫ;&N θ#&]ͦ=~w]"@? ?եݠWU:W!AXrV?kfA~ΎMnV`-*[՛ΏxЪinϝ.5P_b{k-! ;z탷K#cV2]IEnTV%XBg(H 8ck] GaY幎!38(x࿗MNӳpn3rTvzPVEE"RP<\v-<=DQiWWdz`]i*UHT9Z2P2i^NTAsY+IЭ` 9x8dΕ_\%SL\Čb69[Rޏ^X~ @q%((\xTHaO:;P2B̑)/-߀;&H2SI3~FwZ/MU+r@X^ ' * c-) X_|wU %wkUFҭ .RL$(WG}/&Y gˆ DedP7I97x jʕ_"f/Pp eYf}9)rJvQrrXr3BhGO3P}~x Dm39 %:Y5Pi jx0-jET8*ygX02_4\nKjIvB%T– ̣sC`iؔwAHK~>\11x &rGÕh.zع?Ğ4R7@fW1W=J=Mc2^ZWtc& ͽAor nf"<3\qvE'r#]Mm_ǿ.XfGgx.@]]HlN`lڏTBe@ʕh[Bl晽&Kc]JKަp),C:ӶQ|8 fQ`HN| BE *%: ǔG{NBhQj ~ RVfLJ;g<K?WMo0jpEMĺb*ȸU:1f)rneFJy]2?ou\mAdg*ɒn}#X}c\kn ˨K%3x>0] )Ưv!.X;=/_hgn~_O{⦼o 4ʙEt~ʘ~y%ߨnI MGjݪ42W\ i΃4o>tC¯|U7HШ. ٳ{SݽB\Rg7,#ЙR(16qטz^f;rNF/r͙fι_x,~ӂK8 xX|z #`&/%&'ilk$blo2IYN]24~qo@B G1ar dpզ(rEbmЃ,RX]XwB!א6,2X.rvŗUٟ]ML2I]h  ͮFR9?ڰKu¿B!`Q%m|龡\zDܦ&Z~u:Ew0& A0=əD|>4!_dFHӕF2I(V UzJ;oѸbP귙`l;FpsN8jӋd/"f"Vdz_ܲrqw\M |$Y^{R5q! C X j0岹B,"5vPphC4>խt"D&o@ݞH=#Pj jͨU:?Sod $0TdD*x~1\twW[캉)DJj: 9҃{asA}^DWedh1*hq6rD Ҳ{Tc L? 8Za 6e;’{G33 {WN_SjFn$]f:^g+rt\zE`l ]>Cn:$ߠlʕW.Z+ OEDiQ%3f>V4ꒆBmF< \|(d| 6*! $`ʥT|o6ZG3H ? 7Tjߨկg%s0 ((KF*taۭ)pFˍzؒ+@pSލU7ʷul@UwkjŅ^hQg gIqR`B2JH].#քxv!͛{!c--' ;V$* 37(u;iHoz50xB=|+E*f Bgƻãh\>1v7(abۆVD=4zJ MZ2ècm]FɥQ  ˻a*5uY%rPGgϧ0um_y]!K9:|'J bzJv>( aI Rux}31Rqr$*; :?5Ɠ׃Y'-}]6#%kJ Ҥ B -PE֩: JOȥw@/l(lYˑ5#xƥ蒬dxP KS}ejz*s?851@YF;d'Ihֽihp<+#WRק9,K?yux^M,$x }&6&&+^d^ JS./cP /0zv䲑]7MV8kz1/1Iw/S ]]˸9ݗcvkJ"N58<5Dֱr&h0^nhG" =c^LbuRې)M_Av]L %ӞN!~<!T :fI }oA>x c A**ږZy|t==}~O)A9+SFEׯC_`R-"Nfw!.~1<2{썶;uj2[n!Q#؀mɨy0in䣍ΒE|r~c%G:qvmV҇k *`B|w70r܆6>C={B& sұuxMG^nѶ.䦶4bQO87)D<ˣsou/7ɩw!koBimxmb H=Pv9֌L=&\NTF$ov{"ZHR am."aeD|T RA#3=뮨AϠ 邔siH幻7uAa9-ڂ wN[R[.T)𫨪ȸ!'.f1HaEbbT/.s@T ~aɸ0 RJJdyK)z8Q8;оvF"1 ҕN&"wH+CU/÷u؆s)}4*dk7 J'-3m-PcBRqLcdG; ֦NHM ׏3ݣwg2VcU|- W$oΟB/|Hsvߤ؈SY~|<"E>ئxz"|m~dƳ2;&hk9nOsA-swwWwEre5dOz%$6%-Z,7{QӹWxkͳ;[-;P2L"Bؾd.(] l/tC}.h~;C fBVՔFPP]: :'5kP H Akx':Yp&uo5[knfsZZpUG ,k5zy, 1BI e~.ҼiW/7q&Lu#,0^hpjEʥl| F{#/ 홉 mEy!CZclCZ2^o:aIe6 dn|=+96@r]*Rl03}* Td=YsU6oBtnStY31A3yafW8['yGpDM9 <ot K;؈^aX8dvŦ 剴 L2g&("aJrqm,Fݦ]EnQ[c{*dItbfO3Tn*-0 qWoC;8Fa8GdړN0ڇG})ޞXrWCʊjgΈLH(~qN;ۣG!g IUCgFFDMRZW6!V)|z/fIs)%-E97BXFCK`_++ "V|q3<]GP(B?ϼUe/2Yy%m>xD$u|>;<!◷:ލu}ݑAuofJ*Ul|X @3 ͝p, up"qFԕ2=n;)Ns"E XP}vc0ap{/WQrTrh3P7\hr CXٛb9n|:š^S(_owYAçz8H4n|ߓR,΍gm$/ 0Q|$-6b!Z}놷%՘<69-lh?`[z2c)qv#2>̦=ݙCT$~ĺr {PbxĮ([Ŵ%g0ӯmbSUZVp7Gh M˦ #鸐k4F_N*;r+ZDĈ< ?&)f,rNnrl{R+e c.ɩ@럦S\&lX6tAr)ELr%6˽Vs,֛f|_7Io$Ra<[pvhXƛ5 ?i5%1܁:0P Q4Y5 ]̼/A#AyiYOCE,O$*']]8!3G=H|{l]='jtU/Ls24fq؈$Q;s[Q͂܇Q?|c8)9'OfQ|XL@Zĝ>4#BBZ.×M|EΧsPyZ4l^"ǧ{M}i Dv{nVX>tj-Ĝzm qx.ˍk2:|Q@JhPKtuJ&gGbqzvGubG^CD|qDOuϪgxFڞksB6kߝ2ZO< oTFnRZq^[8P]` jQ Tg| [E=+45Pn*?j]i g!?XKl~6=BAو:cO㕮7`-ӭ| GCp>MW^OqJ㠅LmQɷYd8n6 ]+-}zIfF?aů4QQ V*$"AeL4l\:ȥ8IoZ"ۘWKDS/ѝy1FZhz0w)Օsە%q-#itpc *qjPHÀPmkV61xr~>ȎW6Ð:SYX)0NDW**{~HWT0%;d w *@Vo@XwXd>8- 6oU)"{8SkpfPqWŜ7;{ s2O{C}de >jzVRWBDKѮܺ.?(>`Chk_B5 "g R^$]y.?cv(Kd>b<|(D89k9|_qb`JvzR&lGEߥ mQie>m Qi=qQ,6eC:K0iӋ@G"a)8\q1@Dx,La14f\31όq\bsruh|~aw "ZN(#]%3.^%"1΋%`s|_n)RFT{ƚ{i endstream endobj 180 0 obj << /Length1 2176 /Length2 12905 /Length3 0 /Length 14213 /Filter /FlateDecode >> stream xڍP[.mqw(ť;\"8)š;7Gsw2g %U&S;c- &`e`feeGQCAQh4@N`;[9Ldl6n~6~VV;++9ā.`S<3@B#fg6@# Ow l! hF5@ '[A ĞՕhlh XT@N G) /f(45 _rU;3+ & [')MP(ڃl2ˀwoll@`?&&v6@[w9 l (J1C @k';?C Qd81;Gh%lMll@'?;Lmwgdl\m=f`[S?H:۳ۂA2@E(e  rL,XnS`%?(N@  ` 6A`[ѡb_z`7.+t|y҇o?ϗE]CKBM/DEL&v'; J@E5U+ISՠ7tfAG\<Qo# tSOG [mYgtK`M5A<l2 t Dlͭi#I2UCL,5dN0/tLtTkߌ&v;7tGa; ?'lkfv((7E_"aHF߈"X~#h/;E7FQ8,j4o`F|ƿ9M@ [!G- fbg =pr!a1r@ٛY[e;(lF6gvj;9p+Tf2Ҵ ٠~6:bC uZo54=as-o9eCW_=WؠĜ~9 zvz@,Aj'@ݿ4ßo9';7du9?khe ?y e~D Ȳ2\ؕikDhfK3sޱ1,9`J$kiCG_ Ո TƷPzGT"0ztomIwpPĽqr)\8]p)\=L?o&8e% sj'm\6 #Sg=vcXݩPghSt7N3?7lUh6fζ#D%Ij,x pCkd wƎC~x A„H1FWErmW; " J)`TUlQڥ4:_DV̩lN1 nGa`"4%QS<=El@m$_/:&'c"*Ў:\:P$F^ %)sqz$BU6/z7 0>)h' DdIԥ]Ahl+/aT'{Α#'5-9_M̻7ap%blyHP";HByr/Ϥpؘ7ܑH}i%"9xS/_~KF'^h**zo4$.3"o~͏mqժr#Z-T]$:i5Gw&L>Нk-(A \:E\UKfOBh?S?dl3F|3fNfEd?_Mavʱj~a/,33OC$^gge Qq1׏&G33lXDrN"FT Ŕ9ܛB"V~`lz:G(KXW*egu vܭ]Q]C_f޵a-;{VmHx_%qDa vH?$DlLQyւ)x n1 y~ãłO* **~mGl3 `eUmJ.u;גG XM/7{px`=P!UekB)9U@Y jE3hv@lB"|_>sut} lBVQ?^&+&Tb?{BpIL(xÑo\ʇp"i°a=a;<=@ٟ}Ӂ c =b'ՂoOn(ţo#aP݅" /qnekJKiC&Ѓ0-i͊GT_~G\sHxl}9xsy2񓰵tus"YobYv-chYjK1Q17i9Mc4e뼩[jJY5SYq}V0˯}+Q_L &P >7I XlݣX^#TYDVv+YVrwE%ro(度ОBSU-bOQ=m=`W픴Z&c|#_6+(kH(UTh+wX?{Ynoc,ts3uNI|ͤU_xuֻ`ӺWT#6|KC D=nNVMz8O"$V~zQ3N;0'NAAg?+ 4x>( w%WjM|8%Pb ^5eZ='@ouyx#$mz#21lg @ٶ7jj تeb7MR; T2}L1$4FǂAo6wKцn+F(Nb\AQy))}BW7/$[y}x\4.ơծ"z kLLPVAAD֨ Ӣռ#M#L~\V(mD-vVIY{sl!\> })13 vwiyf? 2i&&͉J`{_JX",!Xg~L?GRbS&p _l0e+ƀɜho;a(Wp c9>Q|2O39xw$)m+BVE&Ny; hMM6¬'X^@3gA`MRU?'xfCE&{:ahډ~ krU)1iޛz#`x{Õ]c M1l#H=&7UFIźeqX4M+?! E6]ʯ1i."c:~N\90ѥ4u,M#1)JFmc7c*r6/oy6rtKdk9).b]V'y Mv'܏/.TU Sa G4T[crmj7)ɿ5̴A@<*7btq{ HXcrw>%= >˸\Ke~YUqa!s1)|¨hΘƜ/B\74 )ҡf~n_zUHX4x6NA/G[򂾖}D &t@C+}qR\M,"x6)A*{QIw|LQ ET%xOcDi[; AأL򡛆T\ ʳҪhlgA0v+MWuoJNcBiϘJx苈Xݢ$ bm@J6n}]*kf]!sNkjE:Ct%! !ztNZdѾ?;:WB6IIjc2bV (hs#&N=8k$3GR$:FpbC^qMEw}NB,[?21.;>a]gͬK+Ƞ~a{TXWd6|NMw#ޣsuֈ3σ3))kN7^j=w$Z8ՉQkSd~߃ϗ;kNwyN|W|=:=PebCStq>/BE1]i NVlɍJMח;֠l_0`j/CZV=EctVĺe8,@BXյ}ڍ }wظ)$g#ŠIۖ[50աN FɆs`w0B1Z\XĖ(.1*%I AبfStEBKfOLIVXhs.:RlyrjP`rtdщ6݆l3)xV׸g(jK8%C]zŰ߬I ? ?,H!ӵ@u4>+d=)~J B's1 -zp1dnQ?D̦z vFm=wCs%5yg.ZKQ1 PPM*O,X Od~*3p+BdTwZ/Ԍr6Z1iotKHȣ?,@]ާenG/2b5O1t2e۸L}ׇ ? -`UDŽjJi/{QR0jTu5ãfL9<sŴb!@šBOD QSfqSj n\;4oG8 v&&EnJmbL$5,DgY-&u~ofAX–v[`\fWH$ Low]*(1`tOm^-l^<84ϵfY%ᔦ?e-)1z$ o;qpjRQhz#CK(>}SmW&ved)~PHT@z%hI,wk:[<0q`5eTR`O)5CIAhڈIm:]NhJS*s{@7P.8mKFO,F饳l],x1DbFR|ueLQ.]U߲ O ʝZe0Ic( i ~ ʦtYj/pj黤x5=ttF.+O!(/# xу `#9 Po6lDB!>F'xk  o>~b4%bl>=rZ꿎bj\ . ~"iM*ެw[RX~03`؁FF0A5ݸ9FT94w ]+ 娀eDR+5]qP+AVMѨ 2BQ@>,v Ay׊_qV;e,5n^Ӿ9y\Y{qa ` CJ8(v<8ՙ%c]S |sm)U SX}75+`n ` Wx3 Ok-؁Z~XADbl;.$wphXY_dp͌m.7bO$oM;N e ޑ-Y@$Mz_&Oqhg6JFga[E6Ig"Ӵ{vZsrYщfյh5E]u*-K-/<:ݤ+4`sVKW%E-w2c ȆrG 508B7]@ #L8߲DTiOeSz>p2ct"0j s*zwV<hu رՍ3ҫZ@kjJ DWk`l֕,-_iF3py@ϬMxVqW G+F>&r8eSIDEWZKa:_MD~w:_(9<c}A +qIbrQ[ϤbՅ3QqH~hu3Tf;AF&[oU/VBLL 4;GP`qgdJ7un(]׭KƐ1\fTkPAm_ZTH2F$$Pya2%lG>W_O%>ܘX\yM60*%$2Ӝ/aFڨM!XG7&'ɛ/G}DmΨV0jq ,A8H+I[H6L_,Ig𱼍rLM ꣴ1vs'lAU +!?p7[ weK_ k ~F)BGGj1^!졋 ݘx'Fg:Ϯgj <>F;F*~2Ha+Y1Io_aodH^Z]ϴ/R628\ !vUA!@` %QV+ϻ$̼3SbnrOvYse?$WPC23vXĜt=U =:Hegoa8ES7'0&x0]լğ-7 N oh+2,8}nJ$M]'zƪ8sV[7b+}P6LPNCzחsLڃ6o؂ }ؼV+iuҘ&m3ׇv-:w ҸG"z,WU-W'VjQJja7^agꉷJ7D2Se{DEEO!*bŅGYW~.n6 Jx6VoƮHkC@G䁣!s% k0\o$"h[3*"f‡o|Drhho`eK()Ɵ;Sn \Pimm l!^LmHd2'%:01Ɉ~R j' @bFpڴ3UζF :"8MS|UbЍsikH% Ӳu#g2K$i2\8.E;CaghDixCGz_zrH*7O%~]6-'`N /2uf"{sPPx{۩T_xJ:xܞ[x>Tڔ[B5}vc{KW0d]Kڌ`Rfj$|31 ⁔.zA3V"A"#_:>G5=pSHxQ eNK;^iAI뺓_PWR^ZNfceI9;Cv)Z]0 2*jWuS[V)ĬbGM*p8Ρ9=3n ҨM:TIwohh9mkIF7LDw|__ 4)]?+Lq{P+9X $h)]V޷iy7r" !A%O"@nsˑDµ_Q\^ &|U{Sfh{ޫ`{O2enf ix<O~vc?;_ViœHE_`RKCjD89zJ]\>wd\Z%ʉ_G GWN%/lxqH{ч֥eeGBk'+`FĪ Hr"{k$͢b;Nü8 bǶ3u _Wi)zR C^ L.;o6hfhvЋl?<^PK]b*Q9^i~ ?Gy|!^4󝚋 tw{HY8Q\[^ E K*[~hr0"|}ۜ,Ӭ=cPy۪F8p˼Cy7b.VP2Zha&-ڛDOI#uCf.[];C)lYK~4OA"Fnkaz'f^99S|61dZq4i'-:zsQO|Ro4&Z_lEGQBf3+1K$}T2t#|E닚qH=0qx86`&)Y}Ÿ@WNw^ m/Srgjlj&c5^vDJrqo$.UkY][ꕂ^INDt,ZRXm_sJ=q]SgyO Φ"`CjmۏtR5Ki?םcɽ"Zu /?*>K'?w\_9p!0+hJ4\smps$'n]~Ge*շ e- 2p*$VUTJbtMZGnQn+U*6kg WMnF['#{4)t(ߜ}6u}ySZW}d] jN3*jroZ4<>.?N|/Eݜ^a#\iDz)SnHiuiՀ#X8Ǝ1 \?% ^m@y#?sf+m+>q:L=$юm%I @}ާ"ˤ{Pm,iU wE.XRy ?΢zz“AK0`4uHf71&ʃٌӼH:7o8[XX6W2K; fNL[z6gg%ag&.WzuM!GAYFE|4{rWG$!|K-PgPq `dGb"?Û8{zT_eK\֭ pCA!VUKCH rC\r܂ ˜Y~dYW [~ &6aY_zacgNo:jfrSNo4bp?R[ v *j`InÏPf%Y;>fp<2B0on]S!!:xY_{Q%mY}$FFe|{~n@IcҠ9IE˹v2f]i^S.8:G/kq9 ܑ Q9)^OtGv\mk` aJ\Av)qw=-w:ń[>c>t'% oXO^fֆ;pV#Ńf68SՂ+XYVHdF];Z,,ɊxM)Uo9ÝLVԨ^MY-~͌"`_cin ӕDjY/|U-ynЊ3*a*ixl.=O:c]|A8UgzjSsuKA̞c.":T@$zY֛rqK3C[ʬHo"N]DiJÛ!]VPwo;\xEI? XItH-n=mcYe}l͠:|_v/aNj$zE;T~i*춠،슛+o$0Ě&.y髻%Kr3Z V){i"W=I -w p,a8 C<),a+-Z󐖷3GW+.+'u29O`K͟Хu$5󆈗fSgB5+Q^vӯ۷&1զhJ4t:9w,4jap!+r2m;*\f*,*-(?Ť\軩.85B4bqya,<-mskL}pCw<?ƮUa0e;0U*j#iq1-昊|>p-O~:,!׿ڍ 9jm˿5z)C]6Y4Un#! 5:Y…72 HZ`U,]_%Kڸsb];%=*ltgb XXqQQ6EFc/6ja" O)I@M򱰘M\zIKx5[^[=QҜ_-399ִPx @~d̜v(  ]>u+̲qKlҭw:J d7drB4[$c35C>F_?#r+0VE}Vva>j9v`%4c4{949 K*L0iE ͝lye+lz8^x+g,r,WS䮭R:'LRͅ!6u!'^_Dg*([2a'Y0.ޟy< >< Y!_on.^"Qˍ6p]t $|zބwucWگjT:M_~$&pE{^}A%ki;'Qp/HCj)u6/d#5f/(d q>rڼ`uRqxa 4 wA; &J7Y)g䫍Z/%g 5Qv䣹xhPz O~B%/&R~+.qzA :Ƙt~4/'i)"znkHmI*TDۨ3?dhr$hE =W)U&PY=<4}IM W WMy*:˃]@Z h M2| *Yrb~2uzep@ڗ`tV~H)/si{>GA:{ ZSe?SNk]Q\XiV@hd@'f?8랅Elho'x]sg미WG\rr2{ak\;Ҡas9: FRY +,7n'T|L\n֏lO Ī!N7K]:yVgѐ&Z r( {,}%XF( h[ rp󠦦S%Jy@)g)7Qp9sRAZX"_dQ*FGo1%,?Ŀz5ù ַe]'ċ_^4Χ~"wQ!v=-Zl?JLVG 5G|~룓Wcd`Ulj˷&3TDZ "D iBxV1 2xȟlveM_^/%l!\ıht]|̺ume}ख़!Z&r*mѹ]ȵׁqE q?kusC \`L7/,!m<Ҭ'$Xp)ӎt5)uRLlj EKi^%5ϖ+VWW4@{@oN+WS}D&O<ѪZ+> stream xڍS 8/vcnҿȘQ&Y2#|3sXvFj=*+J!Z$NiF[盡9^˕A,>ƅ(LG NPhKKo˭L`(/W )p1x+ŀJT{&u=B4 -1 xc(,'XbR *Xa=QXX A !,3 1xP}QPHdrLL I,ɚbrX eӭ#DS Ld0brEa /_/)$p@sxT*#<‘JxWÂ)߿ SpQE{ڎ3b{nd[=m[~gtqbA-lh8Ovt?>!u ``Tޖ=ڌ̅{St׹7kO"R,٭a$X5pWa!|D)K7B#ƇH,@<Mtzg(kτưL 4|aqTpLB1JE`2v%8OɁZNrrN O)ᷢ#^[Yw0 ]1ugXKcl.=K3 s_xKwXn|`VZ̈́"~|n:Ӥln/1u&͐WIihH5WbƜۭ?%F>p\SSsä9z-6%׳\Y{Yȟ9d/gmNce+ѪOhyv%U6>?_fe7_?D+%&‹omj?-ÅQW IbvA?]1+=7ʘ<9PcXEb|ϣ9\/uݜ[jbm̾8x< +7`0tt̩ȏ.z;Ψ]qJdM6ߨ)`*_vF\Ka,p;u׮b9N!)3H/.lLؖ2rV2gUTiUv Gu%K۝[%5}+q6Լ=o!irߪ&NPYh!%s'ՌC{ۜO87eK7~{Ef>ļ;Gün^&+Rq^}ΚAi7\K^Eֶ\w0xuP vmbO?yzjm8qF]rARˊ&՚D^1ʅo6P3Wlfmjq7*$9q~}\ia@\ȣm}B-YT}ͺm@UC2,?1;9>V۔>;/);69e>x2#3qXcϟC a2+b9eF3 Ñ'B #Sccntf^S6|{m~IA^u--7c=s31꡹* & K`Ayx8b]bQ2Uf#$ڃc>C\pp{Pz3B߃[,J8e3Ҽ!_}da4$tDM>i92px&Rm¢`  endstream endobj 194 0 obj << /Author()/Title()/Subject()/Creator(LaTeX with hyperref)/Producer(pdfTeX-1.40.20)/Keywords() /CreationDate (D:20200404114139+02'00') /ModDate (D:20200404114139+02'00') /Trapped /False /PTEX.Fullbanner (This is pdfTeX, Version 3.14159265-2.6-1.40.20 (TeX Live 2019) kpathsea version 6.3.1) >> endobj 145 0 obj << /Type /ObjStm /N 61 /First 533 /Length 3004 /Filter /FlateDecode >> stream xZYs9~_a'JG鈘7`ccc xhRCUո P*2%԰I)IM,[$X-a q J\ @Zf8 3sZH,\J!9롄gC*2y6xz |.I+ͼɀPxy+b;4P PbJd[™z`LA%D f;Pd C5UHg}.s?}>?,9 =Hef&sq̢ Xn,~RmvP6TPn>8A+Mk Qƙ"f@B8mufb+-) "{jM >;eIR* ӵDu=rEU[R=qL@_Ufߜ NʠS&xar.-×G8QjTÁh I?^mT6`CE#V8;ӹ,wԑB[]ՖBY';tSV 2QWP:Oj(tZG;z oI(1R~CX' Yû%D`!RKh"ډLaPt&:7]lrh$p-wʓ$@nlk|ErR4RrM'ҩiuOm^ jڸovKZD(C3]^~,* Վ8cEauȯ(it#*P)|St KUΒl7Q)>D TlnGFT{+];\؉roMT8bʑ5JT}5c5cIi5,1`.‡؇d:\7sH2JR'#u5t&rHX՗-ע)E!ޔgQ6&WP`чo ٷۂq1?o ٓ'>:&9ӑb8~e=$՚ ߝ7 `Gۧ CgCAd|{s9)؟.הbm u~oS>E{g|ŗ/jV|ה/w1>쏡9{9;AGd]uP:^_*>[x],1-fE@׷6Xno$5W k: Z:KL@m)R%PY!h[u:>3J2B2sԦ#fea'p)6IncGoIvE y+~AN4n2˽c9:>sZˇ!Bg#VO {_7uN7Iͯxy9.c IWno%Ѭ7 п,3.S8j|u%AſojJOOOUc^~CxgTV5k0g`[%ק{Ã`tO)O׸XkgsLE#'lJ '[%?ӣ:@Q cuśN!ZvҰSJI0QkfSxvF4~,!Z~ n^L'Ѭ*L{9+F4B)>'|ޮ=IӋCr>TюE1OgŦ`[G/NN^¥g50J?d&Te\f(E}bV%l]4/5Ge?X"ySmVid9ghȼ[ AWmdfVQ4ޥ*vBl۽pz/ZS~z_kT~W6$4E&Nmn*v߯Nz|:<0Fʣ^K2to\)%l%׶'y" i>~ '|~ǯĻ <;( t]+G۾n{ݛ\W,qwx߹QtL/qש]+'DOR_.9JtI3;b oF|[+?l` #N[c}'Ark,\%NO0/ fXrt]b46AbV|؆[ukN%Tά,z^|]VH_f-s2wMVg Ljp\TXudMƮC[h6.a"*jEnc([k6"-[DD !T;C:]t /~N d!?]18X2V$$8^ռhjmq4`NL8S endstream endobj 195 0 obj << /Type /XRef /Index [0 196] /Size 196 /W [1 3 1] /Root 193 0 R /Info 194 0 R /ID [<0588D91840683041FCC963D88D9EAD6C> <0588D91840683041FCC963D88D9EAD6C>] /Length 493 /Filter /FlateDecode >> stream x%WaTS:q"EItCn‘K\nĿ``b`3,7o-kZFL5V?ygg53̒=&q䐠q < id$c.Q vT upZ?) pZ) @)h]{`/>rL E[8%8/x7F7guav]C x-Z[DuWWUum}e/J#09a8 g`ԭ1 t}uWmftYp2amn]spUw*}Ч j܄;pݞ|BÒ=G m0h0`F۫zW: JY?݋J9[wߔWFܿWڗ=ͬ*xzKiOϒE091e૆2>w1>= options( width = 80 ) @ % Make title \maketitle % Typesetting commands \newcommand{\R}{\mathbb{R}} \newcommand{\Z}{\mathbb{Z}} %%%%%%%% TOC \tableofcontents \vspace{.25in} %%%%%%%% Main text \section{Introduction} The \emph{intervals} packages defines two S4 classes which represent collections of intervals over either the integers ($\Z$) or the real number line ($\R$). An instance of either class consists of a two-column matrix of endpoints, plus additional slots describing endpoint closure and whether the intervals are to be thought of as being over $\Z$ or $\R$. @ <>= library( intervals ) x <- Intervals( matrix( 1:6, ncol = 2 ) ) x x[2,2] <- NA x[3,1] <- 6 x @ Objects of class \texttt{Intervals} represent collections of intervals with common endpoint closure, e.g., all left-closed, right-open. More control over endpoints is permitted with the \texttt{Intervals\_full} class. (Both classes are derived from \texttt{Intervals\_virtual}, which is not intended for use by package users.) @ <>= y <- as( x, "Intervals_full" ) y <- c( y, Intervals_full( c(2,3,5,7) ) ) closed(y)[2:3,1] <- FALSE closed(y)[4,2] <- FALSE rownames(y) <- letters[1:5] y @ The \texttt{size} method gives measure --- counting measure over $\Z$ or Lebesgue measure over $\R$ --- for each interval represented in an object. The \texttt{empty} method identifies intervals that are in fact empty sets, which over $\R$ is not the same thing as having size 0. (Valid objects must have each right endpoint no less than the corresponding left endpoint. When one or both endpoints are open, however, valid intervals may be empty.) @ <>= size(x) empty(x) empty(y) @ \begin{figure}[!tb] \centering @ <>= plot( y ) @ \caption{The \texttt{Intervals\_full} object \texttt{y}, plotted with \texttt{plot(y)}. The second row contains an \texttt{NA} endpoint, and is not shown in the plot. The empty interval is plotted as a hollow point. By default, vertical placement avoids overlaps but is compact. } \label{fig:plotting} \end{figure} \section{Interpretation of objects} An \texttt{Intervals} or \texttt{Intervals\_full} object can be thought of in two different modes, each of which is useful in certain contexts: \begin{enumerate} \item As a (non-unique) representation of a subset of $\Z$ or $\R$. \item As a collection of (possibly overlapping) intervals, each of which has a meaningful identity. \end{enumerate} \subsection{As a subset of $\Z$ or $\R$} The \emph{intervals} package provides a number of basic tools for working in the first mode, where an object represents a subset of $\Z$ or $\R$ but the rows of the endpoint matrix do not have any external identity. Basic tools include \texttt{reduce}, which returns a sorted minimal representation equivalent to the original (dropping any intervals with \texttt{NA} endpoints), as well as \texttt{interval\_union}, \texttt{interval\_complement}, and \texttt{interval\_intersection}. @ <>= reduce( y ) interval_intersection( x, x + 2 ) interval_complement( x ) @ Note that combining \texttt{x} and its complement in order to compute a union requires mixing endpoint closure types; coercion to \texttt{Intervals\_full} is automatic. @ <>= interval_union( x, interval_complement( x ) ) @ The \texttt{distance\_to\_nearest} function treats its \texttt{to} argument in the first mode, as just a subset of $\Z$ or $\R$; it treats its \texttt{from} argument, however, in the second mode, returning one distance for every row of the \texttt{from} object. In the example below, we also look at performance for large data sets (less than one second on a 2 GHz Intel Core 2 Duo Macintosh, although the time shown below will likely differ). A histogram of \texttt{d} is given in Figure~\ref{fig:distance}. @ <>= B <- 100000 left <- runif( B, 0, 1e8 ) right <- left + rexp( B, rate = 1/10 ) v <- Intervals( cbind( left, right ) ) head( v ) mean( size( v ) ) dim( reduce( v ) ) system.time( d <- distance_to_nearest( sample( 1e8, B ), v ) ) @ \begin{figure}[!tb] \centering @ <>= hist( d, main = "Distance to nearest interval" ) @ \caption{Histogram of distances from a random set of points to the nearest point in \texttt{v}. There is also a \texttt{distance\_to\_nearest} method for comparing two sets of intervals.} \label{fig:distance} \end{figure} \subsection{As a set of meaningful, possibly overlapping intervals} In some applications, each row of an object's endpoint matrix has a meaningful identity, and particular points from $\Z$ or $\R$ may be found in more than one row. To support this mode, objects may be given row names, which are propagated through calculations when appropriate. The \texttt{c} methods simply stack objects (like \texttt{rbind}), preserving row names and retaining redundancy, if any. The \texttt{interval\_overlap} method works in this mode. In the next example we use it to identify rows of \texttt{v} which are at least partially redundant, i.e., which intersect at least one other row of \texttt{v}. All rows overlap themselves, so we look for rows that overlap at least two rows: @ <>= rownames(v) <- sprintf( "%06i", 1:nrow(v) ) io <- interval_overlap( v, v ) head( io, n = 3 ) n <- sapply( io, length ) sum( n > 1 ) k <- which.max( n ) io[ k ] v[ k, ] v[ io[[ k ]], ] @ The \texttt{which\_nearest} method also respects row identity, for both its \texttt{to} and \texttt{from} arguments. In addition to computing the distance from each \texttt{from} interval to the nearest point in \texttt{to}, it also returns the row index of the \texttt{to} interval (or intervals, in case of ties) located at the indicated distance. Another function which operates in this mode is \texttt{clusters}, which takes a set of points or intervals and identifies maximal groups which cluster together --- which are separated from one another by no more than a user-specified threshold. The following code is taken from the \texttt{clusters} documentation: @ <>= B <- 100 left <- runif( B, 0, 1e4 ) right <- left + rexp( B, rate = 1/10 ) y <- reduce( Intervals( cbind( left, right ) ) ) w <- 100 c2 <- clusters( y, w ) c2[1:3] @ \section{Floating point and intervals over $\R$} When \texttt{type == "R"}, interval endpoints are not truly in $\R$, but rather, in the subset which can be represented by floating point arithmetic. (For the moment, this is also true when \texttt{type == "Z"}. See Section~\ref{sec:representation}.) This limits the endpoint values which can be represented; more importantly, if computations are performed on interval endpoints, it means that floating point error can affect whether or not endpoints coincide, whether intervals which meet at or near endpoints overlap one another, etc. In spite of this potentially serious limitation, it is still often convenient to work with intervals with non-integer endpoints, including data where adjacent intervals exactly meet at a non-integer endpoint. To address this, the \emph{intervals} package takes the following approach: \begin{itemize} \item Floating point representations of interval endpoints are assumed to be \emph{exactly equal} (in the sense of \texttt{==} in R or C++) if and only if the user intends the real values corresponding to these representations to be exactly equal. \item For cases where floating point error and approximate equality are a concern, tools are provided to permit distinguishing between ambiguous and unambiguous intersection, union, etc. \end{itemize} In the next example, \texttt{y1} does not literally overlap \texttt{y2[2,]}, although R's \texttt{all.equal} function asserts that the gap between them is smaller than the default tolerance for equivalence up to floating point precision. @ <>= delta <- .Machine[[ "double.eps" ]]^0.5 y1 <- Intervals( c( .5, 1 - delta / 2 ) ) y2 <- Intervals( c( .25, 1, .75, 2 ) ) y1 y2 all.equal( y1[1,2], y2[2,1] ) interval_intersection( y1, y2 ) @ The \texttt{expand} and \texttt{contract} methods, used with \texttt{type = "relative"}, permit consideration of the maximal and minimal interval sets which are consistent with the nominal endpoints --- from the point of view of endpoint relative difference. The \texttt{contract} method, for example, contracts each interval in a collection so that the relative difference between original and contracted endpoints is equal to tolerance \texttt{delta}. Thus, if a relative difference less than or equal to \texttt{delta} is our criterion for approximate floating point equality, the contracted object has endpoints which are approximately equal to those of the original --- even though the contracted object is a proper subset of the original. The \texttt{expand} method is similar, but generates a proper superset. @ <>= contract( y1, delta, "relative" ) @ We compute two separate intersections which bound the nominal intersection: @ <>= inner <- interval_intersection( contract( y1, delta, "relative" ), contract( y2, delta, "relative" ) ) inner outer <- interval_intersection( expand( y1, delta, "relative" ), expand( y2, delta, "relative" ) ) outer @ Finally, we identify points which may or may not be in the intersection, depending on whether we make a conservative, literal, or anti-conservative interpretation of the nominal endpoints. @ <>= interval_difference( outer, inner ) @ The \texttt{expand} and \texttt{contract} methods have other uses as well. Here, we eliminate gaps of size 2 or smaller: @ <>= x <- Intervals( c(1,10,100,8,50,200), type = "Z" ) x w <- 2 close_intervals( contract( reduce( expand(x, w/2) ), w/2 ) ) @ \section{Notes on implementation} \subsection{Endpoint representation} \label{sec:representation} For the moment, interval endpoints are always stored using R's \emph{numeric} data type. Although this is wasteful from an memory and speed point of view, we do it for two reasons. First, use of R's \texttt{Inf} and \texttt{-Inf} --- not possible with the \emph{integer} type --- is very convenient when computing complements. Second, the range of integers which can be represented using the \emph{numeric} data type is considerably greater: @ <>= .Machine$integer.max numeric_max <- with( .Machine, double.base^double.digits ) options( digits = ceiling( log10( numeric_max ) ) ) numeric_max @ \subsection{Efficiency} All computations are accomplished by treating intervals as pairs of tagged endpoints, sorting these endpoints (along with their tags), and then making a single pass through the results. Computational complexity for set operations is therefore $O(n \log n)$, where input object $i$ contains $n_i$ rows and $n = \sum_i n_i$. The same sorting approach is also used for \texttt{interval\_overlap}, although if every interval in a query object of $m$ rows overlaps every intervals in a target object of $n$ rows, generating output alone must of necessity be $O(mn)$. Sorted endpoint vectors are not retained in memory. If one wishes to query a particular object over and over, repeated sorting would be inefficient; in practice so far, however, such repeated querying has not been needed. \subsection{Checking validity} The code behind \texttt{which\_nearest} and \texttt{reduce} (key methods in the \emph{intervals} package, which may be directly called by the user and are also used internally in numerous locations) is written in C++ for efficiency. The compiled code makes a number of assumptions about the \texttt{SEXP} objects passed in as arguments, but does not explicitly check these assumptions. Nonetheless, when the R wrappers for the compiled code are applied to \emph{valid} objects from the \texttt{Intervals} or \texttt{Intervals\_full} classes, all assumptions will always be met. This design decision was taken so that the requirements for individual objects and their contents could be gathered together in a single, natural location: the classes' \texttt{validity} functions. The \emph{intervals} package provides replacement methods --- e.g., \texttt{type} and \texttt{closed} --- which implement error checking and preserve object validity. R's implementation of S4 classes, however, leaves object data slots exposed to the user. As a consequence, a user can directly manipulate the data slots of a valid \texttt{Intervals} or \texttt{Intervals\_full} object in a way that invalidates the object, but does not generate any warning or error. To prevent invalid objects from being passed to compiled code --- and potentially generating segmentation faults or other problems --- all wrapper code in this package includes a \texttt{check\_valid} argument. This argument is set to \texttt{TRUE} by default, so that \texttt{validObject} is called on relevant objects before handing them off to the compiled code. For efficiency, users may choose to override this extra check if they are certain they have not manually assigned inappropriate content to objects' data slots. \section{Session information} @ <>= si <- as.character( toLatex( sessionInfo() ) ) cat( si[ -grep( "Locale", si ) ], sep = "\n" ) @ \end{document} intervals/inst/doc/intervals_overview.R0000644000176200001440000001106413642053123020064 0ustar liggesusers### R code from vignette source 'intervals_overview.Rnw' ################################################### ### code chunk number 1: width ################################################### options( width = 80 ) ################################################### ### code chunk number 2: Intervals ################################################### library( intervals ) x <- Intervals( matrix( 1:6, ncol = 2 ) ) x x[2,2] <- NA x[3,1] <- 6 x ################################################### ### code chunk number 3: Intervals_full ################################################### y <- as( x, "Intervals_full" ) y <- c( y, Intervals_full( c(2,3,5,7) ) ) closed(y)[2:3,1] <- FALSE closed(y)[4,2] <- FALSE rownames(y) <- letters[1:5] y ################################################### ### code chunk number 4: size ################################################### size(x) empty(x) empty(y) ################################################### ### code chunk number 5: plotting ################################################### plot( y ) ################################################### ### code chunk number 6: set_operations ################################################### reduce( y ) interval_intersection( x, x + 2 ) interval_complement( x ) ################################################### ### code chunk number 7: set_operations ################################################### interval_union( x, interval_complement( x ) ) ################################################### ### code chunk number 8: distance ################################################### B <- 100000 left <- runif( B, 0, 1e8 ) right <- left + rexp( B, rate = 1/10 ) v <- Intervals( cbind( left, right ) ) head( v ) mean( size( v ) ) dim( reduce( v ) ) system.time( d <- distance_to_nearest( sample( 1e8, B ), v ) ) ################################################### ### code chunk number 9: distanceplot ################################################### hist( d, main = "Distance to nearest interval" ) ################################################### ### code chunk number 10: overlap ################################################### rownames(v) <- sprintf( "%06i", 1:nrow(v) ) io <- interval_overlap( v, v ) head( io, n = 3 ) n <- sapply( io, length ) sum( n > 1 ) k <- which.max( n ) io[ k ] v[ k, ] v[ io[[ k ]], ] ################################################### ### code chunk number 11: clusters ################################################### B <- 100 left <- runif( B, 0, 1e4 ) right <- left + rexp( B, rate = 1/10 ) y <- reduce( Intervals( cbind( left, right ) ) ) w <- 100 c2 <- clusters( y, w ) c2[1:3] ################################################### ### code chunk number 12: expand ################################################### delta <- .Machine[[ "double.eps" ]]^0.5 y1 <- Intervals( c( .5, 1 - delta / 2 ) ) y2 <- Intervals( c( .25, 1, .75, 2 ) ) y1 y2 all.equal( y1[1,2], y2[2,1] ) interval_intersection( y1, y2 ) ################################################### ### code chunk number 13: expand ################################################### contract( y1, delta, "relative" ) ################################################### ### code chunk number 14: expand ################################################### inner <- interval_intersection( contract( y1, delta, "relative" ), contract( y2, delta, "relative" ) ) inner outer <- interval_intersection( expand( y1, delta, "relative" ), expand( y2, delta, "relative" ) ) outer ################################################### ### code chunk number 15: expand ################################################### interval_difference( outer, inner ) ################################################### ### code chunk number 16: gaps ################################################### x <- Intervals( c(1,10,100,8,50,200), type = "Z" ) x w <- 2 close_intervals( contract( reduce( expand(x, w/2) ), w/2 ) ) ################################################### ### code chunk number 17: integer_range ################################################### .Machine$integer.max numeric_max <- with( .Machine, double.base^double.digits ) options( digits = ceiling( log10( numeric_max ) ) ) numeric_max ################################################### ### code chunk number 18: sessionInfo ################################################### si <- as.character( toLatex( sessionInfo() ) ) cat( si[ -grep( "Locale", si ) ], sep = "\n" )