intervals/0000755000175100001440000000000012567545302012310 5ustar hornikusersintervals/inst/0000755000175100001440000000000012567542610013264 5ustar hornikusersintervals/inst/doc/0000755000175100001440000000000012567542610014031 5ustar hornikusersintervals/inst/doc/intervals_overview.pdf0000644000175100001440000064367712567542610020510 0ustar hornikusers%PDF-1.4 % 1 0 obj << /S /GoTo /D (section.1) >> endobj 4 0 obj (1 Introduction) endobj 5 0 obj << /S /GoTo /D (section.2) >> endobj 8 0 obj (2 Interpretation of objects) endobj 9 0 obj << /S /GoTo /D (subsection.2.1) >> endobj 12 0 obj (2.1 As a subset of Z or R) endobj 13 0 obj << /S /GoTo /D (subsection.2.2) >> endobj 16 0 obj (2.2 As a set of meaningful, possibly overlapping intervals) endobj 17 0 obj << /S /GoTo /D (section.3) >> endobj 20 0 obj (3 Floating point and intervals over R) endobj 21 0 obj << /S /GoTo /D (section.4) >> endobj 24 0 obj (4 Notes on implementation) endobj 25 0 obj << /S /GoTo /D (subsection.4.1) >> endobj 28 0 obj (4.1 Endpoint representation) endobj 29 0 obj << /S /GoTo /D (subsection.4.2) >> endobj 32 0 obj (4.2 Efficiency) endobj 33 0 obj << /S /GoTo /D (subsection.4.3) >> endobj 36 0 obj (4.3 Checking validity) endobj 37 0 obj << /S /GoTo /D (section.5) >> endobj 40 0 obj (5 Session information) endobj 41 0 obj << /S /GoTo /D [42 0 R /FitH] >> endobj 54 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 42 0 obj << /Type /Page /Contents 54 0 R /Resources 53 0 R /MediaBox [0 0 595.276 841.89] /Parent 68 0 R /Annots [ 43 0 R 44 0 R 45 0 R 46 0 R 47 0 R 48 0 R 49 0 R 50 0 R 51 0 R 52 0 R ] >> endobj 43 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [123.806 546.217 203.835 555.084] /A << /S /GoTo /D (section.1) >> >> endobj 44 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [123.806 522.366 263.948 533.166] /A << /S /GoTo /D (section.2) >> >> endobj 45 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [138.75 512.344 257.871 521.25] /A << /S /GoTo /D (subsection.2.1) >> >> endobj 46 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [138.75 498.456 395.663 509.295] /A << /S /GoTo /D (subsection.2.2) >> >> endobj 47 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [123.806 476.538 316.145 487.338] /A << /S /GoTo /D (section.3) >> >> endobj 48 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [123.806 454.62 267.416 465.42] /A << /S /GoTo /D (section.4) >> >> endobj 49 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [138.75 442.665 269.229 453.504] /A << /S /GoTo /D (subsection.4.1) >> >> endobj 50 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [138.75 430.71 205.539 441.549] /A << /S /GoTo /D (subsection.4.2) >> >> endobj 51 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [138.75 418.755 239.132 429.594] /A << /S /GoTo /D (subsection.4.3) >> >> endobj 52 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [123.806 398.77 238.723 407.636] /A << /S /GoTo /D (section.5) >> >> endobj 55 0 obj << /D [42 0 R /XYZ 123.802 753.953 null] >> endobj 56 0 obj << /D [42 0 R /XYZ 124.802 716.092 null] >> endobj 60 0 obj << /D [42 0 R /XYZ 124.802 587.064 null] >> endobj 2 0 obj << /D [42 0 R /XYZ 124.802 366.773 null] >> endobj 53 0 obj << /Font << /F54 57 0 R /F59 58 0 R /F20 59 0 R /F64 61 0 R /F69 62 0 R /F8 63 0 R /F46 64 0 R /F76 65 0 R /F78 66 0 R /F80 67 0 R >> /ProcSet [ /PDF /Text ] >> endobj 72 0 obj << /Length 1815 /Filter /FlateDecode >> stream xڵXY6~ϯ0bIAQ E֖nmkw"?s:,;y D3Ù|vqvrhgbmIX'r>yUfvS8VBk3B5q&S‰Dü% ,tߝKZmҦ|;)Ij[L]NcX06ג_FU3@#ZAAFn*Z.pIk(6;[#|gڶw*BSw.l_ Y&%X)#> =krK0 Pnp.(>!-8c_zpΛPje3eԈJ~8}F7hxP=T0kB_y@m1*5>B, |,Xx)ɮW5gu9~,e4e >x+Oc YlK4wpȈ '6 /qlyZE3L V%3[z28rj9wB6, 71WfMCЂ `F":F3ZWLyއKIaz([cm,-#[Ii{ < AkwAʛ 4#B:K3ȸ {k9|{8+lǬ ϬOx[8\aRWu`[,z&rv=.{MG]pBK/pfob6(2c۩psq|3_> endstream endobj 71 0 obj << /Type /Page /Contents 72 0 R /Resources 70 0 R /MediaBox [0 0 595.276 841.89] /Parent 68 0 R >> endobj 73 0 obj << /D [71 0 R /XYZ 124.798 753.953 null] >> endobj 6 0 obj << /D [71 0 R /XYZ 124.802 225.025 null] >> endobj 75 0 obj << /D [71 0 R /XYZ 124.802 167.296 null] >> endobj 76 0 obj << /D [71 0 R /XYZ 124.802 147.38 null] >> endobj 70 0 obj << /Font << /F80 67 0 R /F8 63 0 R /F84 74 0 R /F78 66 0 R /F46 64 0 R /F64 61 0 R >> /ProcSet [ /PDF /Text ] >> endobj 79 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 78 0 obj << /Type /Page /Contents 79 0 R /Resources 77 0 R /MediaBox [0 0 595.276 841.89] /Parent 68 0 R >> endobj 69 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (./intervals_overview-plotting.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 82 0 R /BBox [0 0 432 432] /Resources << /ProcSet [ /PDF /Text ] /Font << /F1 83 0 R/F2 84 0 R>> /ExtGState << >>/ColorSpace << /sRGB 85 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 82 0 obj << /CreationDate (D:20150827100836) /ModDate (D:20150827100836) /Title (R Graphics Output) /Producer (R 3.2.2) /Creator (R) >> endobj 83 0 obj << /Type /Font /Subtype /Type1 /Name /F1 /BaseFont /ZapfDingbats >> endobj 84 0 obj << /Type /Font /Subtype /Type1 /Name /F2 /BaseFont /Helvetica /Encoding 86 0 R >> endobj 85 0 obj [/ICCBased 87 0 R] endobj 86 0 obj << /Type /Encoding /BaseEncoding /WinAnsiEncoding /Differences [ 45/minus 96/quoteleft 144/dotlessi/grave/acute/circumflex/tilde/macron/breve/dotaccent/dieresis/.notdef/ring/cedilla/.notdef/hungarumlaut/ogonek/caron/space] >> endobj 87 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 80 0 obj << /D [78 0 R /XYZ 123.802 753.953 null] >> endobj 81 0 obj << /D [78 0 R /XYZ 171.067 465.529 null] >> endobj 10 0 obj << /D [78 0 R /XYZ 124.802 396.306 null] >> endobj 77 0 obj << /Font << /F8 63 0 R /F84 74 0 R /F64 61 0 R /F46 64 0 R /F76 65 0 R /F78 66 0 R /F80 67 0 R >> /XObject << /Im1 69 0 R >> /ProcSet [ /PDF /Text ] >> endobj 92 0 obj << /Length 2045 /Filter /FlateDecode >> stream xڽYYD~ϯrCW U@OTJdk-o xzΞ}vx"MvgY*mj"=N⹎=Ebl +͏xб*N7N߿:V]xV`"f0Z:gB?GP-dkv- HVq s8K$#k<n%@:UQl-6Ja) :SqarN_H4vH⭗ -nVg,jyY} k;gW<Ȯ ~9!BDjܹ6ʤHW Wb3w2=W^,֞h C%ɸEyتbYܕI  0b%J_AJ5"Vt\Cl)Dv$t_bA>! 3 ^a"Вة͢t ;i>.xn6taHMp% ;dv#㥿3X:*  Htqtc#Mre{^lrgz/({/a +nk;#w O12y>vr%$#3cPVh]Ei2x.ނ}oSU&'~N$l/_'\E΀i!r'`G⎄-R $PՇ3lrN?} Ʌ˼F(36-"GډRq5Qf9lōЕ!ۖ: Yz'ӻpY bk^kp .wN./Vb΁cu3nYK.ɱ7GB# = ,ۋLJvZ:_rsh0V)4޲f{O^o@[d46 b$e-O岏{@rdrŒ- h o /U"ؼ8qߏv} vM_vx^MHn]CWM NxZ dT.7Γɠ|NOt|g.|Tt;-IPv; @.r90aw KHC_ @?Ev 3pׄo<>H[fnjyz&_%ʝ^wվ Qt$Udm&H[sߦme;‰lD];;%cǟCc2Y]pzAcd$Eqd d( C)+[m 9@fph0|t>FE$ p,0j7w_/[ϋWˉ1| w:dŴE/ћ`nnпq+y=mB3]((u_kQүˀ~u{i ՠa,h?xSq~'ұ.ȍ(WkJTZ`llĸ]1pna(ʜZ> w($7ZBlڔJ/tY7k_>R-e}}sVc_S +g>濟c2,::\\̗rΘA`{#A,r uk,1ɡSʡcaI }R}$U>)H-b`GE8':CnT.  ,T}&Sz.}5Fy͎ǩ0@I\=RL*T &kIZe#$:Ji>3NV%%p p'=B26>5&eJ ;yJo湥bKn{A[n~\NAx)]fds礙ipT~Sutl/ J)`{OkҊN eS{y͓- endstream endobj 91 0 obj << /Type /Page /Contents 92 0 R /Resources 90 0 R /MediaBox [0 0 595.276 841.89] /Parent 68 0 R /Annots [ 88 0 R ] >> endobj 88 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [314.239 501.397 321.213 513.257] /A << /S /GoTo /D (figure.2) >> >> endobj 93 0 obj << /D [91 0 R /XYZ 124.798 753.953 null] >> endobj 14 0 obj << /D [91 0 R /XYZ 124.802 182.119 null] >> endobj 90 0 obj << /Font << /F80 67 0 R /F8 63 0 R /F84 74 0 R /F78 66 0 R /F46 64 0 R /F64 61 0 R >> /ProcSet [ /PDF /Text ] >> endobj 97 0 obj << /Length 1265 /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+uXez)%f%?θc/bw#rrۑO)|B/o E3}6y endstream endobj 96 0 obj << /Type /Page /Contents 97 0 R /Resources 95 0 R /MediaBox [0 0 595.276 841.89] /Parent 68 0 R >> endobj 89 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (./intervals_overview-distanceplot.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 100 0 R /BBox [0 0 432 432] /Resources << /ProcSet [ /PDF /Text ] /Font << /F2 101 0 R/F3 102 0 R>> /ExtGState << >>/ColorSpace << /sRGB 103 0 R >>>> /Length 683 /Filter /FlateDecode >> stream xMo0 <6"}m(]PPТ$۰?ʒm@`;I"{xj.:]5'_Nak*֛\W? o&QYѣzOwflڛmfnpL ,q󰸆EyEqe- 9rt\[ +?36 oۧfwRp|!˳o[\]ۆB6kGAΖsș(q1+:?l#9r还{김FhsK{YJLjdJHJkyp9LmjQn+"eKkFͰ$FJ wɎ<#g%uu/fMDG͊GJ6l|Nϫ{Ǧ7J[՞{SKƪg*4~h֨ж;$ Uո+6cLml>b憓\NΗ7SJAmQ9JU"@Xj6Vƾ/4O֚_"h!N6ipe)%*0SBO$yOBN 'gdQ@RДDh r~P[^9U3X(L3%iR9P9fwrAU2e gw40@PW^6 endstream endobj 100 0 obj << /CreationDate (D:20150827100837) /ModDate (D:20150827100837) /Title (R Graphics Output) /Producer (R 3.2.2) /Creator (R) >> endobj 101 0 obj << /Type /Font /Subtype /Type1 /Name /F2 /BaseFont /Helvetica /Encoding 104 0 R >> endobj 102 0 obj << /Type /Font /Subtype /Type1 /Name /F3 /BaseFont /Helvetica-Bold /Encoding 104 0 R >> endobj 103 0 obj [/ICCBased 105 0 R] endobj 104 0 obj << /Type /Encoding /BaseEncoding /WinAnsiEncoding /Differences [ 45/minus 96/quoteleft 144/dotlessi/grave/acute/circumflex/tilde/macron/breve/dotaccent/dieresis/.notdef/ring/cedilla/.notdef/hungarumlaut/ogonek/caron/space] >> endobj 105 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 98 0 obj << /D [96 0 R /XYZ 123.802 753.953 null] >> endobj 94 0 obj << /D [96 0 R /XYZ 170.976 465.529 null] >> endobj 95 0 obj << /Font << /F8 63 0 R /F84 74 0 R /F78 66 0 R /F80 67 0 R /F90 99 0 R >> /XObject << /Im2 89 0 R >> /ProcSet [ /PDF /Text ] >> endobj 109 0 obj << /Length 1655 /Filter /FlateDecode >> stream xn7С k  @b=l7dHgҮH[bgyq^ŋoB1 *]F[]UEh6jry7Q":U8*7B]a`T=\MPQS[)h =7n]u"eꍅFV$t MYQdb45 =Q>~Ceʙ^π000DpE`Qnw0@~(ͣQFf~U~"Mg Gp:JX`qؘ},K,\d\* ag!g&+mW}qzWR aSڮ3YVea~In&6DM˷d`<},9}pG`Nd-Ҧ=dl#N R-I=-o(:JJ>FTA$[7չﴪJ+ [n-aeuJY8"J] cẞ3KXZT yO Ī7sI3 i]51L]a9k8fkBC[![us9֚3F㔘80%ؑ 6u# B577-M}@7[BTNzj4L p eTWMYΕ3rQoﴇ+Zw">M66-|"1\ 2m3YUh+Q_rW=TWΉ5})\M_}-nXfp\A/a;|Ŷ?סGï[Z:ҝo@8C8]fe?h{.;<J9́Y횢 obh=))"YjιɏFyL]moX?_iekZa3c+ZgR/Za/:R<\<ńqڶG&sWB7,v ݀1 _h&V^)uRG%|/<7g"2 EdY*\C$'SDDF" Soh "Gxu,Ime- f~$P0~%VoM$կlnw!*Q [n@K6V$j ݘb˄Njڷ endstream endobj 108 0 obj << /Type /Page /Contents 109 0 R /Resources 107 0 R /MediaBox [0 0 595.276 841.89] /Parent 68 0 R >> endobj 110 0 obj << /D [108 0 R /XYZ 124.798 753.953 null] >> endobj 107 0 obj << /Font << /F80 67 0 R /F90 99 0 R /F78 66 0 R /F8 63 0 R /F84 74 0 R >> /ProcSet [ /PDF /Text ] >> endobj 113 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 112 0 obj << /Type /Page /Contents 113 0 R /Resources 111 0 R /MediaBox [0 0 595.276 841.89] /Parent 116 0 R /Annots [ 106 0 R ] >> endobj 106 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [375.127 656.924 389.842 668.784] /A << /S /GoTo /D (subsection.4.1) >> >> endobj 114 0 obj << /D [112 0 R /XYZ 123.802 753.953 null] >> endobj 18 0 obj << /D [112 0 R /XYZ 124.802 716.092 null] >> endobj 111 0 obj << /Font << /F64 61 0 R /F46 64 0 R /F8 63 0 R /F84 74 0 R /F76 65 0 R /F97 115 0 R /F78 66 0 R /F80 67 0 R >> /ProcSet [ /PDF /Text ] >> endobj 119 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 118 0 obj << /Type /Page /Contents 119 0 R /Resources 117 0 R /MediaBox [0 0 595.276 841.89] /Parent 116 0 R >> endobj 120 0 obj << /D [118 0 R /XYZ 124.798 753.953 null] >> endobj 117 0 obj << /Font << /F8 63 0 R /F84 74 0 R /F78 66 0 R /F80 67 0 R >> /ProcSet [ /PDF /Text ] >> endobj 123 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 122 0 obj << /Type /Page /Contents 123 0 R /Resources 121 0 R /MediaBox [0 0 595.276 841.89] /Parent 116 0 R >> endobj 124 0 obj << /D [122 0 R /XYZ 123.802 753.953 null] >> endobj 22 0 obj << /D [122 0 R /XYZ 124.802 528.503 null] >> endobj 26 0 obj << /D [122 0 R /XYZ 124.802 499.172 null] >> endobj 30 0 obj << /D [122 0 R /XYZ 124.802 289.58 null] >> endobj 121 0 obj << /Font << /F78 66 0 R /F80 67 0 R /F64 61 0 R /F8 63 0 R /F76 65 0 R /F84 74 0 R /F11 125 0 R /F10 126 0 R /F1 127 0 R >> /ProcSet [ /PDF /Text ] >> endobj 130 0 obj << /Length 2408 /Filter /FlateDecode >> stream xڭYm~b(ߒ4( @+kٖ+iwo7R-'W4dQ|3޽7Y<7w7ʧHtyswbWYjAkcSL|;9C(tg9}WP8]e\Cz'?֤AoZԎΔ[vI۳qzi1`/}+V6ZO{xϏ [X_A*^5)*7t4t֩WږsGwGa5|qOvs7N5.hԍm,g{0҄q-J6lr8c0\=WtN^S8zRh4EP83"=ְb4R0ЀKCCImp͂XU @}`pvfELf,mESg>n[Xbm cc8=H,bh sN†k%"blG,f7Bbƾ=sDn qhPYص"lI%ZΎr-̔ˮ@59,F klHQ-頫AzS6 ZeBB >S["1P'5/bWd G55 ^_rѺ GO~ɶ2v`v;ÍJlbHȫX2Jc?!_NS0)iEԠ4B1h؊Tp3;FR*weS;ƻ@ZS=6=q)wMΊab& ę?!S6av,崴ȣ!#([f2jvYB- !(g0 eB@U2mm6/y:sНeܟEzc$5`N4n9Dv-ȃH#y7&'F o_\sGaMX_L}Degn`0o!wKK,kG4"Xsqn'm t8%>_3)LTy5<`6LnzZ^݋3nqPfQLS3-d*`ϙav^k6oOOII82)#!n. D]‹6Ĉ\ӭ# ]{xn~zeʕ3&uF37=cF*9Ǿ9i;nF7,UQB75n;N|}rOb;p o%^;w+W΄BwW8|c4Qk.8&=E K- TI6] ΌWD[#Td筜;eBf[T_9oN?Pr]dİ" c'RXRVI*ReQ3h򟊑<>E;$6@!t (/=,9%vP;7d"bϜ0+KUxHwo~<4 endstream endobj 129 0 obj << /Type /Page /Contents 130 0 R /Resources 128 0 R /MediaBox [0 0 595.276 841.89] /Parent 116 0 R >> endobj 131 0 obj << /D [129 0 R /XYZ 124.798 753.953 null] >> endobj 34 0 obj << /D [129 0 R /XYZ 124.802 716.092 null] >> endobj 38 0 obj << /D [129 0 R /XYZ 124.802 407.808 null] >> endobj 128 0 obj << /Font << /F64 61 0 R /F8 63 0 R /F84 74 0 R /F76 65 0 R /F97 115 0 R >> /ProcSet [ /PDF /Text ] >> endobj 132 0 obj [1055.6] endobj 133 0 obj [404.2] endobj 134 0 obj [762.8 642 790.6 759.3 613.2 584.4 682.8 583.3 944.4 828.5 580.6 682.6 388.9 388.9 388.9 1000 1000 416.7 528.6 429.2 432.8 520.5 465.6 489.6 477 576.2 344.5 411.8 520.6 298.4 878 600.2] endobj 135 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 115 0 obj << /Type /Font /Subtype /Type3 /Name /F97 /FontMatrix [0.01204 0 0 0.01204 0 0] /FontBBox [ 5 5 36 37 ] /Resources << /ProcSet [ /PDF /ImageB ] >> /FirstChar 136 /LastChar 136 /Widths 136 0 R /Encoding 137 0 R /CharProcs 138 0 R >> endobj 136 0 obj [41.52 ] endobj 137 0 obj << /Type /Encoding /Differences [136/a136] >> endobj 138 0 obj << /a136 135 0 R >> endobj 139 0 obj << /Length 113 /Filter /FlateDecode >> stream x332V0PP06S02U01SH1*24 (Bes< ͸=\ %E\N \. ц \.  33qzrrJi` endstream endobj 99 0 obj << /Type /Font /Subtype /Type3 /Name /F90 /FontMatrix [0.01338 0 0 0.01338 0 0] /FontBBox [ 8 36 25 46 ] /Resources << /ProcSet [ /PDF /ImageB ] >> /FirstChar 96 /LastChar 96 /Widths 140 0 R /Encoding 141 0 R /CharProcs 142 0 R >> endobj 140 0 obj [39.23 ] endobj 141 0 obj << /Type /Encoding /Differences [96/a96] >> endobj 142 0 obj << /a96 139 0 R >> endobj 143 0 obj [525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525] endobj 144 0 obj [525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525] endobj 145 0 obj [525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525] endobj 146 0 obj [511.1 460 460 511.1 460 306.7 460 511.1 306.7 306.7 460 255.6 817.8 562.2 511.1 511.1 460 421.7 408.9 332.2 536.7 460 664.4 463.9 485.6] endobj 147 0 obj [722.2 555.6 666.7 722.2 722.2 1000 722.2 722.2 666.7] endobj 148 0 obj [583.3 555.6 555.6 833.3 833.3 277.8 305.6 500 500 500 500 500 750 444.4 500 722.2 777.8 500 902.8 1013.9 777.8 277.8 277.8 500 833.3 500 833.3 777.8 277.8 388.9 388.9 500 777.8 277.8 333.3 277.8 500 500 500 500 500 500 500 500 500 500 500 277.8 277.8 277.8 777.8 472.2 472.2 777.8 750 708.3 722.2 763.9 680.6 652.8 784.7 750 361.1 513.9 777.8 625 916.7 750 777.8 680.6 777.8 736.1 555.6 722.2 750 750 1027.8 750 750 611.1 277.8 500 277.8 500 277.8 277.8 500 555.6 444.4 555.6 444.4 305.6 500 555.6 277.8 305.6 527.8 277.8 833.3 555.6 500 555.6 527.8 391.7 394.4 388.9 555.6 527.8 722.2 527.8 527.8 444.4 500 1000] endobj 149 0 obj [575 575 575 575 575 575 575 575 575 575 319.4 319.4 350 894.4 543.1 543.1 894.4 869.4 818.1 830.6 881.9 755.6 723.6 904.2 900 436.1 594.4 901.4 691.7 1091.7 900 863.9 786.1 863.9 862.5 638.9 800 884.7 869.4 1188.9 869.4 869.4 702.8 319.4 602.8 319.4 575 319.4 319.4 559 638.9 511.1 638.9 527.1 351.4 575 638.9 319.4 351.4 606.9 319.4 958.3 638.9 575 638.9 606.9 473.6 453.6 447.2 638.9 606.9] endobj 150 0 obj [937.5 937.5 312.5 343.7 562.5 562.5 562.5 562.5 562.5 849.5 500 574.1 812.5 875 562.5 1018.5 1143.5 875 312.5 342.6 581 937.5 562.5 937.5 875 312.5 437.5 437.5 562.5 875 312.5 375 312.5 562.5 562.5 562.5 562.5 562.5 562.5 562.5 562.5 562.5 562.5 562.5 312.5 312.5 342.6 875 531.2 531.2 875 849.5 799.8 812.5 862.3 738.4 707.2 884.3 879.6 419 581 880.8 675.9 1067.1 879.6 844.9 768.5 844.9 839.1 625 782.4 864.6 849.5 1162 849.5 849.5 687.5 312.5 581 312.5 562.5 312.5 312.5 546.9 625 500 625 513.3 343.7 562.5 625 312.5 343.7 593.7 312.5 937.5 625 562.5 625 593.7 459.5 443.8 437.5 625 593.7 812.5 593.7 593.7] endobj 151 0 obj [489.6 489.6 489.6 489.6 489.6 489.6 489.6 489.6 489.6 489.6 272 272 272 761.6 462.4 462.4 761.6 734 693.4 707.2 747.8 666.2 639 768.3 734 353.2 503 761.2 611.8 897.2 734 761.6 666.2 761.6 720.6 544 707.2 734 734 1006 734 734 598.4 272 489.6 272 489.6 272 272 489.6 544 435.2 544 435.2 299.2 489.6 544 272 299.2 516.8 272 816 544 489.6 544 516.8 380.8 386.2 380.8 544] endobj 152 0 obj [500 450 450 500 450 300 450 500 300 300 450 250 800 550 500 500 450 412.5 400 325 525 450] endobj 153 0 obj [719.8 628.2 719.8 680.5 510.9 667.6 693.3 693.3 954.5 693.3 693.3 563.1 249.6 458.6 249.6 458.6 249.6 249.6 458.6 510.9 406.4 510.9 406.4 275.8 458.6 510.9 249.6 275.8 484.7 249.6 772.1 510.9 458.6 510.9 484.7 354.1 359.4 354.1 510.9 484.7 667.6] endobj 154 0 obj << /Length1 1851 /Length2 13167 /Length3 0 /Length 14317 /Filter /FlateDecode >> stream xڍP  |up-kp' e9{yWjYP)1$Xyb ,ff6FffV$JJuKgH b`&t~#*d]l,lN^.^ff+33`^89!Q;x--@mB`3 b [ @g [E @?)-xN`sAz@LH(mAKcD[X:P7svA7 -U@v"> #G"K?&&@;K;s $)LڙA8ٿ]6@7Ÿ"*¿9-,mGc39;!џ%dvL_2L]4,]@2sLHAfff.Nnr7`O'7 >^7 K3p|_04q-fle~?>M??I[]NJJouڻ88 Nvۃ GVe+=/o!OkC o P3z&o_,ϐGIZxxgPKТ6' |;s;T!-%);Y003ΙXTOmv@0vo򶤦 ?ghgx0#q\&?L!6?_S/0AoLUL,&п +쿐㭈?~?.Q9L&l:-?$ٽo7Avӿdyk +_V!r%;g75/ސ'F ~{}or --؛YU1MRi%0x-;\h?ooEFz1Vw$oI[C[T Tڐ~L? F$bP~v n쒥vtFSžsr(] YSٯC~*a҈ (1Θ'sf FźpGʚ|%C9b+d\+Wgu&@O }56M%zUoѫ0rC`1+Kw57Uw:o?;7ģrAsAWňnC5 na'OΔ3 [B#e +(iYl<֔ʃ sFiЊ )H5B: Y c8Pz.Y&!o{|]a`7kw{TZn@s,eG-ԉwV4N5SUCOn⦤gX9?e8do T>iFEjGyY:im$OrK = h~xG @6͍FrjǶ({${-V~{JQtIVz54HwʹN3SxGNc'&Oyi>0J%a7x+ֻ߱][wKVg"#(YE QڐqCx`ޯ~#FƦWSEc-l},XlWAgT{iC`lb~qI̴\\{] /͑ 9J'ԨO[Uۥz7[wl 8 .X}预NN7xaJNpBs658{ߞѓ=mx[=ۄݗlIu 'yqmjk'3ri"S!(JϏT_Rj1[0:l<聉99>vVw,WGN$GGѷ_Y%Ɲvvt}= wgmA]+uD4b*'AHpeqvoA-AH&&d ]#U uyTjUJ;{|z:^ xy&tVvd4|FL0RvLt]BTA.ooH0bm[lY>  EqdbOcvb ꖭזwZL{BrF#9Kτ>|]q  U=Ǐ%+vLcnimԅ EXHћ4Cl5TŘTx~>?S*Y΂= znbJvUVkAK0+.=Cq&H èJWT2s^rV(^N}Mq{S7W'98L%"6@Ϊ*!. y[( UT2Jb8%ms֛Ŭ"zVfJTXPw`&(}U ۵ʬ44h= Jt}b6Bؗ NeIY![Rb576z״xV# e'{ʫb( LЈlC{9 ?shǗgy1H$^;cYİ~ǘCV<Хu?+@bj)O&? & ;/}%Y clw$r)˃%!4q: }o5|Q$MF. 1k>yQQ3g|D=0iUqrɔSmPUs=L2.WvMlHC,9։ D^6hGOO?N}},p3AnEBDe}ugg |h#HEa&Let$c \S(2RYϟCh/$I&1[9tQ10{Q~"H' c\h!63t/t.E~Ve|QBcz]y gkbr 7"i? UauƙŶd}9^>l0D]f#v'F5jB͖#!t~3'ROskxy qԍ}c1۔LWޜ(yM A1=x9a/d$}B*.&bd3qɷ+2ha}Ϸ/ 6s4䵀ɝ5 [3%|o>4;?=6y 1k~߬Iޓ"f^ bdHɣ{/sX9~v ϽDp%hJ,Zȷa`*[S:#jb>dj%dT^+U'=; RfȲdqN/)k0t܌8d#EBq>tc#9bc 9|$Ry:"9%u3 GAt.UR/r??x/kUD^3)+L%2?6BW*|x44/sbkࢗBBhO c_Gy@[eo-҄+Cmox A3'l"R2D5x2.~s2mXZ(qzJ\ٛ{IsB+}?nn؞d<=֌ϔI<\<}c z{@ +?!9Ai&I5h x3UoYKϣ[ZP(H U= t\h6طh7l;j'i?q71GhfO(ŪME. 8w4tˉ̘>g8 >lAe~6\"s uD$FDcX]} :IBt׋Z@i7cۼ3ӊ9?^llg8YdB6EBw䓇 h!dHaXJ=i%7G1)HGT(yjk}S\+'auPbFE?cj_^;B3~oKe?i"Dцzv)|{>C(]+3'O_&z$d5&tyl Nh`(( _Yb`XayVEZL<,|hPߦ.LpN@5P9fTQcfE'y%8y+/ ѐ 憮PHU̓24rdlڗnX*~$;O oMDD{>B)`{Kkp X=h͙ʏ(8VÉ&Zr+ڃP2\ݷ[Ų&ۼ#tj$]mpԀo a'}oU+Wj'/VwߓUwZLMe=xi=;ry8jҨrYxT(&(L[H1`j7E>q {xb'Nj{d./^[ʑEU8DLśF- jl4L=V8dcWZ,ZvhqaIJ߇'54o9]VxAxQ^Pj!s*?A `yq6H["rBѽ0q!G`!j1hc L ֊UZ&FypV,]9m?P0wƨ5#@ݿ4v9'ZT!Qp^^W07D0ofRy 5=Yw@'cf֗[:G"7(~Cpe^7.;X4>_R[JioxT6nFlMyGNyȚ|SQGq3^G_IHtk/>n^*+z% \%V~}[LX< uLn{LPp׍b*~ A]ZߙLEN%aK j.;7iw^NO.+yy04acEz4fښ% Sۏ l[`ע'!RY'g>:9sxlݐfF׶n?k7|dO)Kkb%?Y K XGwtv;ugW~mgDֻ46rm:|}wO줺[CeS@rw^`ž,iVGy؈.Ƈ/.^¼2+2ZC+'o C1#ӺFQHzHK\EK `qy3Dݼ5^dYM÷`š!U㼚.ӳ)EtF5*IDʱ43c' 9}8cl/ Z=@ Tq[rn ( `HD#qV|miYk:; qE{ulFߙ,8?;QPܵxACRɢDmaO BoB4gnc]b]VIG[Y Ԇf?N |fAۼuÅX7}(b1AZ7ixO=@ABSU-TMyT9 Tc+!+?DGyhǴk݌VXֲ}zGc2B.SdCDC{kW@bm<8 V%A,oAo <_ަaEXoW%?˺dzPq)2B|xuERo͆%PMZЯx(ԲϘc5_^PM`QGRPBm g,)eMXKtqʇMR6/r[ȹ=I{eBio~8A #頩 xFi^]`|MW)4X(u-]3 6/ԭUe΃r<#=Oi>1SKONJ?/|٘?QN5C]҆}Fz JL;Qf+5>DlD,՚hd&3 z*;uf)a.]p}/bB݃^׶$ ! :lƌm-(ϴ}!Pإ4贾]KE(IrŰ#0e+e@7愁ݾ^=swtgT((,S+-? 3OLꏺA0^2AUx¯4:l wgwA@eaځ¢s'A!+:ؽ t>wkv xx/GQB{5EC`hkĭHW¸.1WUr9">x;ppĥ{&NZTB/E>_꫽XS})ܥFU%A"FNwg 2JMsөcDcG֗^ @i!hUsLSF8gs0xѹe4A9m3M!uC[o/:kHY]L 8y6SҭT+}5v|U~^xPPd,sB1 a@|%JcOBEC@ iH1h(}!z6 VȰYm|\$?bӇX h#CH;p+%ix7A("$?u`C22<zdTZb~؎ KG_oT Pw-NDh>^ZyV|qG҆J N>y"|,ɃޮLq g5g}3NNz`i%>0]VrJvqnc3|F*88p|DPVbV;1 7ZRNm;AҊBlr҉ۊq4=l a(Ah!eTNԬs.Ҿ)L*:LK r X\ 3tq .eWtŒm |vk,OmϭY!z%]~)7jD Smnm2S/=$1 D*Dj7lcKfi9G !V۫,Ҁn!P7b {/8SGޜcSO)6SdC|1i洔_abY(x.(O|jn*Dt*殓%@}G7i7k p)%CnjB # ahfssy6Y6lcԱgI5]T4e&AZXQ nr{xVlm/h{(ԜQ u0M,O){aQ, XR(Ed"osU!< ojFk_ o;$e=SmW-`w XpW%>91ξp,xT<jS#*ʔ1JrTgfDde2kkaW NM{ |faëGf~DZôTPn+TZhTÒT )z .%g?GS?ƨ2ፎn-h"=@иIrnQ?(FqN"deG]AQ ↎o綕? I'Zjٴ&kt"Or| ];v <3t͑4nʣ_{VC^Cah`o}WrJnɴfk~ZB kkң[oʺR;դ] nlmQ /o\O ~6r(dwvEM/75uݸrDy\̊"jSҼԀ/&Vz@J=  YF!)0u,lg]G.k*!fk^2,@T3Y Xp-?+h`1BK9|~Γ}VGr[K&p50+IcVx+3aAi 0JTFcg(!F*[hz҃{*dEԸt{-fDnLf:̤(,FQƛYSjE? џ\[|9d$1灤j)P!g*fJmzwBK!M"ø"oY lkR'V]8yĵsm0b/I||i"؎&|E4ju? kJJax>.LoUŏbp5zS: OϡC1 ~,p36P~|(GNg-qsEQ;M/eiƺ:FL\8,M#_ J,ayT9 x;Xm*~0rS)~Y>qiow1;F1Nw[ \fEպEq)EbPE r:-:qVE/j֢4'?+I=jC)M\ v ш{ [j|y&N,{JU`dp4L&0A4}Q)2l[;ށ"'3[Ies-R]sO0uȦm@p\I||h|f A ;QI[H{_gc#ҲZa\Ơ-68CEA&Zf=zscKJǣ[ƪs~$i<`_9Um"EXZDM-vћ5ԵXB0dEgoWsα]SGv"鷛pSyһd\I pd$>C%J?\VJPjB}TSRڟ~uQ x|?@gR"NNGm2MɃѸw4v gCs20$.gD*eA+mKQ6bؼ^Tx"=>Bѥi#L9ʸy=喓@M3U|E*$+6U~NW瀑&lIhF1qf^6T<,{Q!ShCeh^orT30~j?SIX%*Ma;F Q29X$'&<U6⪖Lk7}F-Oa;w2_RMן~~ ᝀoC-hȠ\m!=&u-4`cӢ?}6j*FB|ȱZp ȍtm0GEKO[J+QI6*o69 E'ӡ AChNɻF[oqgcTghUt15<叇0off,R$zCKsR@)IB?2 Yx)p}ch3?}QPN?sDSY{4B*߅Oq?cC>|E4/GF##֒A}~`şw _8rG،{6Oek=ȭ!U\u$KPץR;߽E7]V|"&΃k]kzII_ w*IM!&?Y)>v=Lk;TL][p r6s%c&n2Uac]2/?j+fBj%1m;Mw*S vpyvmbM^ZaSL=noZW[/"I䥖dkSϊNnj0bd*x =JD*džőw=iǐb\=s?c iG4%M| ~!OBU]k蕤y//{S}k-+fjyZ70vo,31z|dH?tѩ8EJ,0` 랴G2VmwKj>ZGe͎Ub$ͅ~ffkm)#I+)%I)ԼcQ,ElN G{pa|OGzn_[b_G%ݡ /1ƄքL,!M}WZ#`Hzk[AA=&SZ>D`I9>wG;`{6aYT* z+tBgIZ-?ޠ*$_9o25,anb3 Ȑhj60lt#YX83 xnLZǿ_Ͳ.} ʡ$xA@ЩO ;6ݵЁ#eVI"z=~fچHfRPaϔ!A[u=Ycԕomo6KZ=[tEiciwUm ۂ6#TgO2QpG]˗]:vR:3_H JoCbW>N|L,$ޔs҂Zg*":#qgjn CͤbwFlW~zILтqN޳(NfU n1ߋ,\0 d=HHձ;+.x+3-_uĜG x"(UQt@xov):,towqtwP*F_f+.bX;zMb? H8 endstream endobj 155 0 obj << /Type /FontDescriptor /FontName /XTKGGS+CMBX10 /Flags 4 /FontBBox [-56 -250 1164 750] /Ascent 694 /CapHeight 686 /Descent -194 /ItalicAngle 0 /StemV 114 /XHeight 444 /CharSet (/F/I/N/S/a/b/c/d/e/f/five/four/g/i/j/l/m/n/nine/o/one/p/r/s/seven/t/three/two/u/v/zero) /FontFile 154 0 R >> endobj 156 0 obj << /Length1 1939 /Length2 12398 /Length3 0 /Length 13592 /Filter /FlateDecode >> stream xڍP C ݃w > - ޽{W5U3sOw?P*2$m L,|1yQ-V6 ; "% _;"lCt|_6`ca/ƞ t26"=hi DA`c  t4YV4ZTm GIA#`hv`7e* 3d4&DJ9?USG=j !N=:@UZh ,XXNW?6ֶ@b0[rL "5 [^ Q_lC#i^,1A88dw7.b/2CLLadˬ9⼚,,,\jlG57[ПN?̯^d4och=Jqw\prW3cɾ>2Z$ame[2ɓaS-|Hsr˃An $vDޡHM;BF{Ov~o;d(xPr0n]z\kJ~*Ur"=L3FGRf92!СAϜx!Gɞu7ZЉGK }tC Qg Z&8HA=ЎcIddbsXhc-JѡVY5܅OOiGJl!=qVāW4p! \x9}Եq/>cٌu<(Gooϼ&& :j&ȁì椙pG/BőSod-Fe:Q_z2>"XSu \4)MEXtA`FdTst C~,CsC. ok 45.<E}E\\5]3>3itC kbH I O~7YP=. ^VF"VyPE׵yP}K6c-ENX>ƴaV[w#TYs+4b`(7SUc=NDQJ[1U NrNQsӃK]J^ $;Etc??*o!Ac:e\&]@[ k1SlJ lhNea| C9آ(s~OY/M*z(uiکD֞86!1~CҺ Pސ䯿vXtLSaaZ{_WǎR;C^#eZȜo-@l oh#Ԕ@HWd^u^FB}.G|+;: EK *mo@]mN$H}\k%LX(Dh;}(P;1 ]3`uuwUb̚7w0#e@l[FU?e'(GZJUopC򓼁v+=CM9{|cl?9MFQe:OheM!`%Fr$ܨ;X+пN}o[ Ƿ:YA*̚w?Qߵ aK@ԭ:v Lb,N97DۨJv0Lsa$稡XnK$}|*Zc0(uɈh<7$B$<$1{xtQqΚvۂ&)9%|s˙ìtNeSz]kqB.nK2tXw2ca$kl -4u(XJIa=Y][@_nnEᗊ]5:!'9qA#1GUwObgHjG^Nr%d3Hoo[wWy1yYΆLK{  x[ >SWzqZ6fT^BP}GK~P=~Px:noz)U@䌥yk[vG5_Ҕ\.C D7xȬ6ы[pQѨ,A$8)j"bjd'bYvMn K!*G5nZl<}wDK#(k~ok@0[SX ziɌ8wBV)mrPjhywʟ+]ǃS5b=UGFbc9x[58>2qǠaPpy,f*Xɱ酩,s0R.WQi ʖ/G+w6Tز*yEsP .>' N(sZN1bA訅JA`qxjƷ}XJWnإՠS!Bo橳Sa||W$o]b*dF k<=7\UhV(8OG=i X68AAy!aS2٧JYRqQ"1njjԩrcV%՘&,Yh!IJ"ZDw#jM5yzkنSfvJDfr}J߰ H"h=G nNLIުLydSKh}LEߔ1op4_Hm :7 mɀlUGlBEd |с ~/X{u9Ѿ9⾃ 0)>gIDtff9T^_B Q[x5A,TB E퓼=/srdLqSIEBc' 3wnr'qtI/lb<)mnQ\ ӎ 0F `:\`,V$p5H1\?%Y&&`hGV~9HّmVu8 Y?Fd{$ax;U-.vF&do֜'<-9;_U}p`]yZ#̴RCkJa4aq?!6*1fy҉%䯤5۞Z6b̦^/iZQ !7E!hVo|[ FYzwF d!6,&F1@x/kReq4=c|+ukz E#c9aQz~:Ԍ~8D @"70tԨse$;ޣZ~fZ8U⏢ALqAsHL{'3pAq(TBl- 0yk-%Gr ݔ cVEoM"_cDJWXY .|t1Y8}K+'nW( Ih')!siPhn>CvmG$` ?LT:׀>DKp&4#vjԬn TCoU+ zi,3~qv:s_xGk6-흯R.Q|][ nZ Fz{3JK.'8O|d0=T;*5D\^ܶIZ)s*%T)צȷC~^! ˀsTʯQU#w)హy wEk5rv"P*| 2rn_c i&'eߊ`+F(a{ynQ9wm鿐!ӶhqU*-~/dݚwc]1st}H|QpeATԆn -yvW{uFuq᢬C&c׈Hߴd°n!0FF*R"T)ZӝrS.Gכ'JZ҇ +vO tm!4Mx(gX/xJ C}͋F@-W k=2 1,(OAI.e  :GBJLbhPP2G$Y+ &ԇ'+mȞ5@\#zw]c@J3YC,saki$nP~vnp',=h֔7[ƽ,v4M, MIA8> &кej*<]}'2>{גs {u-( h&ÙccȉԶ8Ь&Ï@ _Ce^ܾܔl.oFEЯ=?o"UtXuJz,0`]"bP3Xj}2 :f@[}lHڰ'i褾'a3֢7KjW!u _3Ai%}7Eh?Qwzʋ)<3A|u-*/\1l˸1ШRGBxӓi ْ5(>h㠉qLUTTuQPH J lS')P>yuK{MNew5 #J'Y hQug~brjl15}e]@a_>DTeiضoT}萸][Vܥ#@ZeN; L5UboXg=ĽWx%d*D&2rv _JjNmմ/N2Z84OtMj+$ o1(-,m_y$m,.X/ I5p%sUxe禧\p 4O)I-SўֲAt)*][d'|LoǓo}#P୑[hj_;ϼ7N mBڦ)dVF\܀ g8<;DgPu.yC5P:UT*fTث-}i)+9B.IJk ).lb9oMqzOaM)nFZR{b9 ("2Kp $XLs#+6.Fݚ $6ZYO1pNn'n3IkU}7 p0Kf+j`U8mr^Vo5G4TIkFkAN~Ҹa>zu6.=̎YeufUPfGl'`y$=#͆jHKbVx:[&8(;8cK7o'6þENd~;x(bl1&1B XBd&;v8 UoY]M&A 2wិe dO2VJy}TXn;-(qb1f;=|~ˑKKZ~iBqۆ 3c*~+hGb #BD;gmP-N{ұ6'-Q @(XZWэ,H] oni]Laяx XIirKҞm$N__1vcZ+%qq /4>:-4$Sc/vsZR+yOKomx!K[=VnDw"pl=0(׸%!;&oDd0c~R2'C00nd"d{Z gA>>R5:'q9(.W/ځ"'RTm$XǎjFT]tMpiXMJr7Z7\s2#Z!Rs0f O[kyH|R%5{vzUrmdχubܐקּ>wuXi}eDՙ,r=KE zTd>5', WXČ! =8x KT lbHkITĨpf=c7;_N;̑dM.ƧoPPZ6 LrMl22AAo9a8/!X^r@8OhV?^ yZ+<= M6We7qKe\&䍝Iޚ'm<1?N!o9 6^v$oYeWAZqm)ʎT=VX Զ[| Ć*G-yKZrI \,Mh=z6uj *}MX>z_`N< D':> Z"= sRT|"3!sQA[!74i$q;\{>T?zt^`.U"E09&bm 7~ l87-8ZJ 0ܶqδ{޹0`8Tׯ &oNSij9uG}&-]c+᫪JLFݣ!!QB Q~#&3YUzkVsqJ7YW䳳B6_k7LsmwߠJ*%گDDd+2+T,TP)B&4f}'{΢lIX.D늫?N|YlGj.ז0@Ċr\ n37Р)9iGJtC׊D7c!\glB 㧎"Z(p\6U%>db'?m#- fv3%cMrwá, n!'ѶҠ[[H8 qoq(yw "XJ y`zμBٟj[:~w\-zND!/w5BgoUb22~dT[B\ s ;&Nh<̘dJ72eqяޡMTm|U@sCa:U0-Dy ZoCuW8дzeɞ-RVzs1GhOa֞{rZ05%Ɔ'^Ï8wd r o=drh*#BS1ݸnPH5\=:޳0K8-&N&;D EI>9\RqC0VUzLqYof׬rfǞh v ?̿i>^s,乫a~h1=2S7)P/G= @!lp$QBhð=.jx2EVxd  sh!)&":@dtɆE  %/^,^ϊH{~ݎP>L;>,Xd7E1wW.В&re#Yݭ$kK_!g9s^1jJ73y(QM|:;18H,.gs/ٟk0^CG>FKb5$ErKcŝI⇻Tbdeѯ!mԹA{ܐ3Rط/u;MTZ ASa-Ҋ?|Ēpyq#7 D7vj[u.9jf;[xdMPRS'.vR-#wh񎍢6q +š'e2E@,3mRHd+"t)f u7,h9D$S>Z>&cYLͣ{4hz@qO?(e_` bN;kD _M%>e OpOg㦜PKrtLDUU1: hpӱ)n- rc)Nbqnm"W`QXlJ*? W=jOt".LE*3+` ³w`X[ϯLW*Bp1}҆RecT8-wP9*>4q8o֡b ܳ$-qtEٽ?zH=݇IÌtbvg-87 -.s]RH-6enmE}9cY}dGfV>VJk.3 !TU<<5rA쁎;_҂#&rS|I ,TW,鰄噙LopB[ ͍1B,VIҮ]3mOߖa)Ưhk. c%rVN[OLSAA͞c>(#Bzb$#<^o<2l7`d|:rL@Zk\ +L1=gÈPĦp$v/ۙ-XŠc+:f?JH޻ّT${o;p1g6_4aOGu5jJ6QݻqZ1g8*,ۍ-pV m_TB?!rՙ,̳ J}dv901Y}ˡghZ(/ eZ3p}o/ G=> 5:V`^GvG"BԯK 꼱1K79a_%OLFװ&i/wac}nV,e4S\mӧ<[,A ڰT{-ɻz\~{Q imBR)-aۻ#žx<POyD q'*Av{ D;Zct@{sG_kYHC _\ (麷0SFzDV̰(WHǗ}n|o$[qksta'5 M&I@.TReis쬩/6H4d @hN,Cvо"@]֯~ޥ"PUflf"S^}8*{EOF-TmmY{]~PWt)X9ndu5YPx>86dQ9m~:GoPTGb'RjiQIm&}2$Q;M~ $w,9eTg [oa?e[.<8&dtxѮ#ů.RQxgl<8>SY{L$ zob2J#pLz F1>& o |/;27#/p[O'<+Ƞc)&T~F9$\dlLf%օg-&o,K\ ~AIF g>P,x6~J~&R=ȫGk$ZZѢSyS0cu5PY&ы6«#6)gc%D7Ҍ ,_ߎr!I#}֜9|ˇ- MV*RZOZ-Ai|*-ǀ2V? Գ(2mݻ~mRydCS&ِZʱ$IŰ>hx.y&D+ ~^#$+a3Cm mNJ\$}l[Ft[ R6cWDSw]oBɝ%1o?±u&lNSAj4=*.a9b^jl(8([Ȋ5Ⓠn50(qSJs<MiQ"=hҠ|TE`='D/-%-Z͇STٲpуȕ"w4]j$CF^dcыx[[DL . rK G~}=Fng1o^[#S&Yyrlj .XvjJ~7^kU;6L}# ^w ݊sL_ r1vaO*~GUo2BtרlB; cwnnk(W ƃdT~O_sL§^_ IaOL<̘ ;.HѸɃN(Z,!*Ia+.+|]2&6sw7uM-=Z^FI')¨W \}$Z,]*$phj4o*u m*'[lUصYJ aʁ 4cOl xe/W7]bo endstream endobj 157 0 obj << /Type /FontDescriptor /FontName /FPJPJI+CMBX12 /Flags 4 /FontBBox [-53 -251 1139 750] /Ascent 694 /CapHeight 686 /Descent -194 /ItalicAngle 0 /StemV 109 /XHeight 444 /CharSet (/A/C/E/F/I/N/S/a/b/c/comma/d/e/f/ffi/five/four/g/h/i/j/k/l/m/n/o/one/p/period/r/s/t/three/two/u/v/y) /FontFile 156 0 R >> endobj 158 0 obj << /Length1 1406 /Length2 5931 /Length3 0 /Length 6889 /Filter /FlateDecode >> stream xڍuT6U:ҋ {/"!%j轋HQt邂T))s>ֽ+k%;XPi@"Ђ ! @UWB@) NeCy@`4֦AcH$ IȀ$e@(7A|]!=$EʥG:?xp; B]掭P8  }u@C2 {n8 Jm:ACHO A}3\WG88!l{zô`&ۜ`h8PZDRB¿ {~;AXAKwaH1^a)pC{AX33v(]?'0v7XXG\E͜9UT~@PDZ$%EALMsHpDbmL|YA]hoB_ ~WuFnn<?]ho4VHD 5h]ZhV$'59P9`ӻ0; ˇ^N U?K#H_@P(?)vؓ8{B$ 8"Qf*{y~a~_nzPX^lϿ3SHlK]dIM_\y13vD cneu#OlGgV[IGm)4QZ 4 soǕ-EiPH{۫WW]ԪZ6yٸ`iMXW}$5 1͞4y=' N-X-$NUxflĂDnFe=GLi dG+MEc0w68>}ZJeP%}[ Lxg$Ӕ {7oQ6-;6&N A@5uqrpQ⨧}9 2w *+$`dE#>g<4_b$hQj Z=w {POi/EbLӝ ]:~JsŅzI?g\`TR".Uru&Qzbj{b[Rӧ4 “//9+n>20sIjܺ!wgzĕ nrOD;o|g,o,I)GS@ C3_pkя)V;oZ9} EtX}uīcP]%ʾv 0VDݺz(T{a`SuRc`[XfoW<-鷤5!6eJkSo~܍zQ;6挐p˰h%kץe~lKNP^筚/>*8f jO!3%d~2y!fHQB%sɎ/)b3 ˾7HM{Q}SQ}XAəc\Dam\^t-'ؤѼAocDu`t/p.kQ:5jôc Xrg#+_bl>Ib-~\!=N*n\Y(*|-vmz̸Ņ߫ۆZ+> 9 O}[t\]lx-R뎭Λo60d(*)Nվ JS SJ]'-tEdQTsN_{ӏ` 7OR>T[&ިdc|kXfP?h#rOW{.%vW2gҩo;? *UP8L_wQp4@7]!Di.*75ەb)*|8;=łe%Qx?Z|M/߷Y9-?޻ύI<75{\"ZYLΒ&UE`J$?%H&YgԩrURPHEEkKh3 w`@r6{x &ܐ:ՖSCIk 6iUY)2O OdBW|+stUe!˫ʘcN2<ԋ$74)Y~Q{fUl$᯸>&PNÄDjI'1ɮ)hmկ=_ujb.P5O1q|SMөSnwCv<Y&]r"f=nN dDbQJiiCZvXnnǝj46+)8fSH+` '& -z$eɓdfORFWH$\aTiHNd5.' r՚ώٷ81K I1%*қȚvdm3QN,kO:\H:yiwpqš3Z{;krz|*uuU 8J' ]Y{Lb\x/h߲xxKw@,ё9b&)ζHʀfcq6oحi.|jƃ,Hc f$ŠD\A{+N)[<Ӻ磰:f a,,w%o(vgg7hXJ kR\ꣀSԁKjR0pc)uHd }Lտ[S^*!8ᤒq]%m$+~-xF>, EF)qPs9#W k'9lT㫇vVFv&NwĖr>r(f\s_3/SQ.5K"[\K4zMlܽo6G4>rS]FLtc9z- v7,ud4YUq'x1jz=}5}G*ZOOqeAж9Qoj| D3ʒiF7hp%f顭Jkʛ[yF%g4f÷VT 0Uژ+&';lc]'q[#VdW.'MBJR:Dd5P2*a[,QMLnH6()%(D?E4GA; 23l~fO3NIH\t'&9~˴̛SVGpWCw-L0RZ3 W,i]?QǨ 砅We.}aʠZCy󊪪BXv"f@L f7r͙G@4gʪBWPlؗ~'ƕGD )խ̦-ya4,R7oUS 22FWʜݞ @mTfWwfۀK}{u\uEUExa)CDO)_"{5\Q=]?,1x]{=~0L[ycB *`%NGe^ ܯ'2U,[}hߊQ>y$D3`6 r .S{vlTuslr;6HҖd3BCJ5,6G>Q̌=_kPj)p_ab1N>)dNM]? Y}:1&d`Wg9M a nOFCvXNXث,338^Dh, ?iY|jĕXr4&'"E GxF̭{К4F<ꩤ.2Q+dJ٪pB ~E9&m6|{xV֪]!CM'|Btv "`WK8Zfv-^~sOȈw 5 *'{y77gH|diA#/%hF6I$嫗%I3jOžÃw e2rbZS16 =bD6W5PzrWd!x$6"Ou=[g7*~C(u qBFFLX\5&L|$!!/ z%ev\2x"ev^ fÕih@^[ -NZZS/fLc` ^?v%%͋>\-k8gOK\~\d)i6ޥ!̂+77Wx*8 Tf:H}4W=$=Lc8ǔB2#"(WXՋWE!\lfŏq$֒+D1^V6ͮ^_(n.I3xg aO NsQ,eNGrtvњ9B98ZG%^j̼U1.REfd ԜL-j/ʰT*Oj cUv%neNȱ'4-/ȧ.F0CsFW,*4_?2#(iqQMP(b@3p:_Χ}7f+_=zB*deɹKyPIwYL3)sqWSP-G'+嗭q`@d/u/>d_Y@4j zP8㨵Av:ZG'ɭ}el>+V#N3 1;7/+oI0sk9pʊKm]cpZViqL9CIqG~&oMP} endstream endobj 159 0 obj << /Type /FontDescriptor /FontName /LBWBDW+CMEX10 /Flags 4 /FontBBox [-24 -2960 1454 772] /Ascent 40 /CapHeight 0 /Descent -600 /ItalicAngle 0 /StemV 47 /XHeight 431 /CharSet (/summationtext) /FontFile 158 0 R >> endobj 160 0 obj << /Length1 1460 /Length2 6756 /Length3 0 /Length 7738 /Filter /FlateDecode >> stream xڍwT}?!HD@ҢFlc5ZA$D@RBBAxt%d%e@(#)PyA8 "T#|P'g4ߏn0@XZZw8@A0> qV&p0G n9g4!#$-rG ‘N <o(` AA^/;4ARN3!! PO Vh _z9@XP_DJpw 9n ~9Ppl< uc~h(@XH(DA~a{0U;FO +g07o sp!dzxB`U9Aq8~0E@~p u`HP /0 F!NP鿳cǿdPC ~Ͽ s|{B&zj*| ˨ Dāa@<:AtapP`o$^gox,a7@0KCwcC|x` .>"v[ (ÜD4>{P4/2= l 7( rxQ@ٰv^.(2PED/]~D|IJ?a:@|~s $!,#IkВ!_ߒ0P kueH$6@| `ҙ)8X6̥.V[`mD`7侈H 1W}v9$7gV\cGXƥ@$oj=[ؑƆ}ѵdc)i*dJ8XcHzM8)uO'{sѕiHꄷttՖѳHln0]?`IJUtA\)iw RuGk9",jbD5s?Kh5iz+yN WostI:ۥ8 ŜR#T2E1"QݙP7 UY]u"u}g'ǖ~zk? O\*1nm:}Vcha[wC vSgsamEEɽfB_J,0b*\5x8RVӳ]a qo#ek~wxI@]Gqp[ΘxhO+=Q*qp *BqDIBζ1۸YRD YN'^2\ m:b cѦV^BUipڨ~ʪs'B7ĵ+/L`vL>XPQ'fy lWWpUX̋ 5Y}c]m~ۄ?@&s:zR8T 8N)72[ aաNe9: R ޖ\@uq$}OHi3M h[S6-i/|sfjQ%Z@ygfD<^D>yZog3J " U!\٢%;9FբNdQ;ϩQtUTK@L9* +jMjs. Qwux.ġvSXai 匸 ʙ޹)Y> q54rWbE^GĚpY.W"D-&.?Op-psXSeJt 1͝f{BD+~!Ocp#aoU~z\Q]]sW-4.*(ή6Lw&eH#oeCZwIH6XY^3k+D/ mc @-9tѬFHOOI#jqI5i_m,-|Oa2^湪;|q 8Y?gz1"ogߕ F=x[ ͒Rg"1:TT.DUr~~:{.xsݖ@۟1b^ږCg3wf#,guF"Der,5OڌxܶH}htCpp|v5 Z>ۿe}|ن ihoF&"Q~ƞ/g7k%@ ͬ<"[ZqDJ%{*IQ}n; I >kYxѼ ^f϶݈qU32GSl互0UMf,](f9G#~Ev(ֈ܌-LaNI[Gɥ;gi3x$N̷6ۃp"qGCb+eexWjoN?LXԳ4PnU~a k]p]z M'OkWngZ,KY_OT2\N <\mߚ PcΌi 7JeJ`&!($+?}mkT#lZHR+/iwGZZBgS]k~ZorI)3ygؖgH)!+(!=fn1E0MGGm4+~bO(D1lJyw׍ъ޵Q6]$]J t [qK, fӦ^Qjm"(@Z؉0o'n G H5׻ﯤmB8lWcfDgLtu4^~*Df-ʳZ 7236kD0~$DʙHz^ghoӏ>ܟPSK_ߩ.+>S詽TΈi 5xޘ-DZg]D;0nv*t.|ty{=> r־x_)6BB0֞ (9JTpbȴ>rk2獏{JQv!IYm/K7]PlKs-Y>8{=v^iXǮm]4IxU]ߣ%+_H+cf;tȲf2%u ۏo0j>N6x_g_K#AեxhX|2$YIwԆe[Kx@!L!R5A?(gz&^掭 7~H(R U w,-,3Z.TR$ xwś ŢE5hjLzcJ_U!ҔﱩpqnHO$(lnh^ &FSn3Gd=qYѠ3kO e2T{rLi(*r _G/VߊߍW抸O]7|eͣWύ!p;6M#7_ɟm4+Tۨ,n#rg`^E"$5큩[ͮrV{Q[% D}IVj k4~1l8}k|AIՁ>3!]ʸOPڮuqENI65SN&i2?Zɒgm/o'GK&r- ?MoFwKV<_SPFJv=\}B,#&&ݝ:yƁ}[dzRc/Q[x=ޯQiI q}Jz bgɧٮ_%S]׌JE( 3<"[{]aFIS CH)pŰ/kj/qY>>UK$rxf{'>tCmDY A}W:ve%u_W?O<"$ J =A1 J6jڞ0{ [CMr puEBrx\ֲ@WOQZ 8sfT|jR/+m)K䈼 N.a uOKM8Y[|,USHOWZ({-"=~`J!)RXeu@F]2YFea=W4%uY W,_Gv`O ͹b;c,{5b1sKk8TB*0(2NR_[)MluZuΛ.`)v_㥗G1Ǔ4@چw(96o~llO4Cʺ?՟Ra%sxTA\t JOZ VfMT+5LP.Ո=pGJ?ڠ Oco|iw.eBGWZ,䝎K>?Z B2%6jO/m}NJ8N*KϘөLpqY/Qc7|RU @bo"יCv-V?52N!S TkL9t{2L2Aq,P)Jk:H%ۀeJZހLaEV X;/Hy"*q'%-b/!= ʟŢm2zLI+{fzDe}Ҏ0ӛUuSc'4ΦIJA}7FIw͈yIcv.,c5+=U^xk_>} ˬZ_Mr^"}DuoF(yq1ೋ^ogC PM\T$HFXbu99/^DPC]ۖJ5oqשow,`Y}q|VY/9)FOgxH<÷SDo45plYXK`uñ$,Dbv_w1~j6JAeiQb6=.wj%/ޯE5e~_Ř4 9m\}H翅F@etc^sȣəx껪,W'N(h)ks߀{`\ )vwn娚>de ĥ+p:~4h(YxFAuhGR{+/S^rMůj6VIsK񎋐%pnšejx׬"g'<]2(tQFSU-|Z`l\p0x㩟Ru6 v61cgx1>֚ *Y.HsQWyC *ZxkJҗ4lw7fU)eMF-)qNbZ1Y#{B3#ǙDdmCF% z endstream endobj 161 0 obj << /Type /FontDescriptor /FontName /SYLDBT+CMMI10 /Flags 4 /FontBBox [-32 -250 1048 750] /Ascent 694 /CapHeight 683 /Descent -194 /ItalicAngle -14 /StemV 72 /XHeight 431 /CharSet (/O/i/m/n) /FontFile 160 0 R >> endobj 162 0 obj << /Length1 1407 /Length2 6140 /Length3 0 /Length 7100 /Filter /FlateDecode >> stream xڍxuTk.)HC ] ݩ CC4 H7ݍ4ҠR"7{ZYk}ݿz Dx q @}8hsq#+AA} :O98XD@b'"] w@D\ H'/- =G;]u@9'B!=$Cy- $ qtEHqp<([. Є8 %mzHk@;P]ᆰz*-'On_w_(Ax6k ΋Dq _W$;@, O( hsPp_~A߲"JC\ ~O݋fH_5ae SQ+"gC@"3 ^ ;F#qB: `pk\`>;o X(% ; c<~}M/+$S}nbrrHO/"`]o쿽_gPaA0/oт/p=B2 MAB ( -%7HwwC^%BBS`9wTACa8X$wU{¬(" 8tz㠫@UGU\%_6 -CEZR#0"@m |hZ<Nj@%4f_5҅ך !_}n..[0' J07JVzJ%z'̗c2JzJfvrΧg|VkOx0XLߜ`Nc&n6J{ ^ҋMymi+^= 38V"%VwUEtb;+f~5cj__'i2IzT7ؿHC"QSī4\!*tN%|D&d#(f-h/rqպ[Dve짠:zabt kkUnnFWd>;TnU: V#ǩg f+ ֆ0wHXw⟔<춉T5qdZߊJΗ:\cQ?P\~<&1ے'zy36nn#jcDˮ zizǩ[bIrUxa#6 y=ɇ*CF2Abg:Eu>PH.u>L R< Z.OQ P~5+HeBe1,ˊ,k *+1MyQ ! ͹}ufa+{^`:%7#~֟:x 4Xct|qX>tŻCCHxٺ-b#/v;nL9$I#* ^Tu{,8ghgB673B E6tZϾ{|י^( =Ix{s_)ifNQ:<:J"-EAggQ|at81A jWۢ=^[L os%̋B-3}!!dz_}xtM^踤`v 5 ;:5֣kȺʾg@Ưugɑ„ekII]u]9DEB-,tT]$Δf-0p h}{궻cbJB=@Zٵw_?v |lv"Z^. Eᚌ* /}qDL-7U(Ss2GJ< g(ȕ)P3M#0uaLƥ#Hr~K [c+FѨ hk%je )2oY:p y~2s%_Ųlh cҠnSSfӝ>3͹s"M&A\٧C@\ƞpDp'Hj?,x4<)( L.8ŀ {TzѢ;<;:IP:WdbM@0/][\%AXT*춾`:؈g f-`L!D eȒOЦ$ΘZDplȼqx>j*n#^9xdx8<|K4bZ#M@0mvG/fzb)sV濽!e78qw\fĺpM^Z:QũذnG)wg;dg[4ȅ(hȋ.NFTIݘ Pw}yaX9{B6'@{I_m|cɕ 0<z<潠@.l yKcw>5- [識wyJ+/!gF㭤?xwfS96KMSЦF}¼^zvӆ*J)heLJ +&x;6@/eCg<%X_|.BC@K> >#7rx3x-O&oω)8lbV w˯=rW[W<~fr&blA ۇe̠EQ |mWy$do!c1 ܸ/tgP^QZ9h1 zg Ju~qrYs(zspӍZcL8{6\s.IDud>D XvťqT =Po Z@}7oqrl+T疌AA2b9$bsIJ ow A#`\e} o E(a[?-y_xյ_s3> ->d!ڨ{ԃDh+9"iMmt]MH`/X;!{&p]k_R%@rLG k/hᘨ'9*nmyNxq b0srj.YH=Z՗*=>e9}RHjDQKU_|sfZ&>\oR2 }}lzKLXʚJɳqca==a u.>fү:C;35{i#fF=%: OӺˈ>gg~qK'Q" 1(&9i]aZNw簟^ ?,ї%+o< -#rwz+gtL)6g/D?s gNװk3x%0Q>_PgZld>~fTnW[!~-Qc;^sQ]m׸{^ ۻr+[~I2Sp40`#[/L]=~~F#[{RM5Y ^GyB̰uG%DRsM\׉ɯm..|*jݹt'#$հ=iT)ZDŽC(Y4Ig/;&| w[ 6D 5g;=O(T E{YzMzQ] 0} T:ZIh zɑVb M?c;cJSm] iLcNLʷi6eU]Zup}p1P̌s6!6Wɗ|"xtzk99:J>Qf~;MMqcGSJ)QY )+r3vlg{-# =zaq Y ZFU01߭ MA'`|υf-*IQS R|[ -ާM{|08Z<_!ZE+'ݪI 2`V%ֽečcG" H=vy;̀'b2 XRH)X}Ong~E92$P?0VexX.pnx6>5ըRVaƒ}G8msti~H/EU)9Ig4x\Έ\{txߔ7P^ P6 &R&R^C endstream endobj 163 0 obj << /Type /FontDescriptor /FontName /JZNSLW+CMMI7 /Flags 4 /FontBBox [-1 -250 1171 750] /Ascent 694 /CapHeight 683 /Descent -194 /ItalicAngle -14 /StemV 81 /XHeight 431 /CharSet (/i) /FontFile 162 0 R >> endobj 164 0 obj << /Length1 2460 /Length2 21066 /Length3 0 /Length 22488 /Filter /FlateDecode >> stream xڌto Ǎ$mFcsƶm1۶ L/}kfsm\޺ 2PƉ "B OFbdL hak $5tL,&vn&nFF3## m.&9z L ?Jc*?!k @h hlhP5:%7+#?- tp~' 7+3zx2ʶN@H`ea qy8ۘe)Y_Ʋ26&z7?Άƶv66fS + @A\͉`hcobhaeh2q!%!(h`aHha;E4*٘Z[mOh *;ÿ:w&v 6@)Ddf@'### h3Wqd-eigk0%0= ]'gߊELL c';H 45 =&tAebkc2h ˈ)+ꄅmt:f6F!=x/ *Zp1J٘xcAoy[,F_o=?j?jCk +F rj A!dcf2Z8[M-5ChhЁt3 PAG15xlCCwxPA P? `u@yLmw [/`8 "'A0q0 & `X R('Ax E OSb0Aj(AxF(Hglkj$%w/0(&h@ ӿ oh'l,˟S0!gmnW4_tY1w3e_TAPN TcR3A9 ԠdAdvOY-uVNmlT;+gǿABPx{g[EMݑ*6#G 寪HA/?4 EM(['Wۿ@s yDO]@L@TXk?@~y֘'Ȳ.Fϕnol_=s١]"UuFíPpڮ ыIKx'gOmKSX'B Tx{l&˱wDVCwp_:]l.Z5Jǿx,(sƉ,Zt, i4Ky f.\R\-irO$iEϒµ%Bl$5:CjO6M.cߙrAx{M$ mN,MoպM-Wf4O=ׇGB[FvՋ\̵#V ˜!ԁR(+.Іv 8{r.xW6\ߚC]rE | d3L(5g3M݈P61\lUbы-]JI/V G[>pӟU}eW";?l 59ܹ-/X..UN1k_3-**xq/z2*4yCU~6}ny:4%] #ĩ$"cCm!>r#S(Qn7OKtST Ln3{bD`9^ZE5BB4,3vvVB_*(`XCHX]y O,bAtܵ[SB顗D'{=9`W:_Njd(A_4s%gKqT#~U8HF@6i$db,M}m;>ozX6 ڬr}8q9simEH=Ho\%}2 XT8w:fN_&~=vh'1iN/XQ],Tgv#:'5ų=cRc1[3ݠY_e06mY&JE@|a8 6w2R l;]@@$GֆMʕd:K㾄o"nr]\~sO )bD"wzl'ؤ>RSPifDƸMhv/7~37ӪLQ9PMJYXozHP]Oh% hq8H NOKq}*ؔ{FB2^r ꨛH{ro~9zwNYD L' `D ,Sw-NIkkCZWzLFY=HWԄcԅԨB)ZoBj*h,P̤?쐅s*מP CSv{]ku5(ʀPn᫾)6;MECi\qLqr&B경h9A#;18J%C55Yd$*z- vNސ`l>-AG{\j_(̪3Wf*׉Gu_ Yk|\;jc8G?M {vþ?(^zQQW"/=RNTJ<^h oƊX? duaW Ts[=\ve7ZbJ!Ewz;sLڄNm+qM0u_@%!6Wj<='medl樘bBJ7s[=1N.k ѫ'~/tbý%h[Nأj$4;\;, ubha>1'|5|j(2;x{}q8MAwe]l+[ᅣx8LbƇædzRMC{E7V?Lw< ($,¿ؖoK̖k3%M4f*gn~npdv~_`/rʃID ?_ׇ8 /I)0>^϶#i+Ți(;5%JxuJ5"7)?g#d6 JZ:b:`%_ZΝ\bCT`% tzO#ݠiI oWLPY< = bƉ)V[mX)D޾}9KeLv`4)`Ͳ~2Z4K"QZy@a*8nHC]Y!Zonr|Xy"Hк+f\:ݵޯR )ɄK3H59Uqk*j8eijeBPeJ!eUK_{33rꙐ#Vr7agxd~ ,}}*i:ؾ݇e]w>YS nɫ }U@#qS0X·[}taۗ}YZ:d1?]B⅜POʾbP Lri;*pȔj 7*j@ECIQ&[Iu7x{vzN|umӌx8?,`j]v 8 B|8%\X ;O;cr~20E+BЮ@1>&Ԑ1ŕa6HS~ľwRmB0P#{"W[ hz\G&E7p$&<1ԗ$坭w; sIi3/͘y|yA_.;-NB?&%^U@Z$?>\E" Y:F)w$ORAE5*NlDف@:$]8-#fkCs}}/-yT- R'AD; ZZzܒ %\{b6p맚Wrk{b!!CSEovُ*9Mw:^! >@"uy I:ϱ)LPd* }lBrM<]fisI:HYچnM L;?yvwU$w)qZy tZyn+ɹ_SD]*?ϱ)kt3VPo/w6Ǭ/}SS# q~EӒoÜU} 3w{>߸Us [G?ݭ;:R5+B#a04HB Qj-30|7l&9x)rAf0ϪTUfs[& [0"f;"ѵ@JpTz)MB({h]y8zx+Gr[,\(#0.h3iZYEXe| f%@ЁkfUt+K 8U}dׯ)JAkP+4d[p?քٸBGe.e|3;T9j_3*UY&DTRaFDa;Tjzc;$H0{Y=tFޏDdȰ~]\W/TW*[{653&vμ4%э]MSsO}N|ML.vQ7mH8|' LWǎHsmݣ+&EvA`D\㪞6ʺ|?TJ*vJ򟴋#l ^M+?,& }>AZi!sZ[ncLӬލ݌ @:AD ]8Fq}D GJTKjqNYXDŘ6fSVht J.FAJե9`f-5e%d^)?q]2)B(]Fd>_ l2mI^g~sGi| /&cE- sA"rE{&b=wV_#|az!8l1Rqd7QIfDχ Lob/ \vE_`֧G6 P<$!*n"ndnH4skp׹i޳I[_q)R@Qь-V_uޚPB c`8A ΞS-:Ff$xqc7ÂdJE&($ 1ڛe 0=e7簭; 4f&T6 ݒ1}V׭߄۠SЏ6vͪ+fDtnSϟ 2QӼ beVUƆB1*I1 ;w^>A>V}_p\{Vt±| P#'v'#~%h8 >2fLjK)i 4@p,e3RN_S):=j ّC-Lz gVI;nQ\4 c᭼v| uO L?[X%hpC_ N=t, d:U uYc6Uq)nb:3PSe+fi*w{<+p%)t[ǥEFCE48a5_޼hIp+j7X#W:_Uuګ{I41csoQ$fO*iYQZCLbS&呀ޕ=t)d̶/LJiW9Eݚ$GЈqY-ڵB5ߦUZ ,3okb+L-ᶐrꜩH[F5A"l0IY6! 4mih*E s~ɒq%Wt NlI elA& XѪmt agRDم_ zk6/ҙ9rc~{J__v DǙ St 6jWF%\@BN*<6m>$0Z!(vuz;:FP7Zh) 7PyO8d<=5L]e_ǻkוN~׋*6e=' r%qܥehi#\@yF=$'ʖU#E /1+NiX&-G _k{j:0|ҳ;d#ĕӸCŤ3Ǘ)C,u`S@uGA&9k]R=(#ye{ͪ5|R"IԌRz/HZT.[٘X!z5;U7|t[(pwiE/I߈mkG`̀'2Wu\5bnԤx%jk^$<: ܼQ 0k.`?_%^Liט~8:96ϏlĥTMq@Uī, Bm1J߫A#?ugB'5UlH@ Ѯ $Mj#ψC2ś?~|߅tx_szD;wdfZyPHU XL_RuK'*۪3WT3Dd)n^R%Yp?gF.ˇ\PD:Dӹ}ǨF&*U8^ z"zx{~zuZ:U02R Ō_:(Dj} r~K $n7(]RfP}D>wY @\}DwlGlK8AV H!{K:# c.zfGX % 0e69=:즠0}*=,Y;5emB u4.2 ?l.WH}kE2B`+YGǏ9"Ѐ9!ЎJmp:_ OWNmm5gGZW(aEDtlNIZX>s%>#"8WW @W4Or88fgOOLՆg>*ȧ4v1nj!$`جYtf)x&׹-eeNRz%r\6-9H(volŐƌU5.!> ;Y(0CO(\?2T ϚvmER|0g/,qFLSV\ITE%#B^F5,)7UfH!%ХY) hAiKA!`Ad ?Gi"ٻZ7v+ =^g%Ϣ`μ͇/B0KZPNQ?Eڍk6(u7)}^t?MTNw$!>:1&YFB Ĩ px1?4VMtWu ~ (myrUY aW:y:= uUvQV]j#d3OwLٹ"-L] 2xx8?lITfK3 w&.aDJϾȧo֎<#pn]Y|$U>=p&S%o io t@t::O{ !gG`:0+4u,G+ÒŇNiJXDTT8ZlfU23)\pC%E[hGO5qNQc:GlTJ躟wGDg[Zwxb ?79˹\۾O`}ʇF7Xع)GUT)4dͮFy4gz]jn;0|MįU~r~)YWё DNo&XJ`^*:vukIⶓۣFg[xB Xg"5'>t\\Yqm>GdwqtP&(k8͜/.c8f7})>txqxYZ^-NCQHh)9gCHr 0b \/~dK Tv,?J^ukZsؑ|NpQ.'/cs7=;&}/I^˂/[(3Ө|BXc? i I+d4۝sr!I7Hp!{uչ|Fޓfw2J,! sb]F{ҧF*χCog,e0XUM9P F'!XES[:t'#n)tK.bQUS#~ {庯 ;|{Pzx°-U׮M UWf7aڏFEٖJєZ[qB&y>酑XR/@uJ z*ӭwYx#zx^{8_@\d cX/:dAtiMU˔?gN9mŻS?C H_u}<}\\z "02VN5hjlfUiI7v:v7(!=PiB8) +Qg wa"}~J)(MzJn<˷I$G`NTk谳w6Q4ĖW%ΐ_bnyԯ =I.xYr{Ǖ-dB;^hjU{~i@{2ݲ6(O!lQZy\ߍ Vo5НհEa/]O4i\'/~T lI7Ն (*P |riqyeMwjzsiiu,5PăqcƵ}^W1Ξr?-tBRM`?&oYy#ቆh qSUx3 2ߘmS*W$~GCR|(;ķ h3GDX!p|WDSeTsqיxUnDgMK;sƃ&? p*; ܊fcENi(Wױ?ueŤ#Z%"rț<,'DmJ}Zi!v96$k.-:g &"9I,< 8%w:{C\FdODTձg%@6,6?X幥_k&"$qiO3>_ދ7BZx\#BzgȽ8MԢN!~@RcWtun΍~'9{*;}='ɛ ڃϹSU,H^v}I3h-+Ϙ<:Q j'Px3&&Uy:7n jH͏빨YޱMi«0Hm,1eg1+<-?AGz -].n) saEԴI`$B20.JCMM\xnͻM+f?kETR}^dߦc:rwr/H-dW1g-t&ڦ䃾%1f=K:*(QI[0taY%+{>`UE+<t<{<2ѣ ~i܃ۇzluG8&f۸;d7K/toyM>G&Cס\UWn M4H=S 7q{1>|b̿RMLpT,*k[uiwꑔfl^gš۔S~-Xm4pF,,2%BAM(y9.owahUnȐl AWѯ {B߼)uM=q[ʨ!oX|=#ȐY c7Z Iג>&@^͍4nk=v<ڗo2v6pj7^JM@cx'~ Ţ'ԇѮOyjOtq?FH]AW7u# W8/y ] h <|YMbkyXT$ sV[+!pNd HpVi͉>b0YSIKxZ_aFdO f@b - `./A޶c)|[tԾ1q7RE!ΈRB7I}<~]њ71YЀI};BH $V0wAxZD?eVN/MJ8D%(^-jSk(>~PbQ8+:CtTͮD [cD䴎q3trgyz[&܅<$5 }G3H#L_oei݉M^/6!"'w:;θ ?IufZnX4{>g>UiW*z{0?%=xG yaPFz V|>zg8ut,y%{Or&0Ei[minjtd^" oZ릀}Az>ƍgD,뷄 T$ 9^bK/ʴ-Ѻ%է[gՄq>вSu<+)?֦sm`Iڀ!gW] Ig>Zc.|c) LBZmYH#]U J YJމxFyƆglKPa )3kzJqB잉;k Xh; wK#t]brưc DZ7_-zGD{)G0q1`:9KRR*O$86gyuߕ꿗tcuF5y7}Ot|PsP;زc Բx`'Aŵ`oVh]urLjzǒ5mH[ouLn圵 1XOmgY,k=ʠpQN1`К {c'[CW,`M?1̐r+Q@T?s_ܝI:ˣ<+)5͎b?FY+ch)u43+\2f3R]EI 1la_EfSg^LXTmbB+Lgq4NX]͕OT83cUR*oK_28zm)Ο=B B:|0}昆KE(Qqyd#S m!gsp;~_ܧ+)dH*t.Tf/5dM2gTX>|WA? 0veb(/U!]]kK=^K1-}AhPS-2J#n f 'I(,&qk1cтz:5CS }ԈJ63ڜcVkZ 8**]*I 9"͵la]v䨘SP)0u?rq5AMz&puCtEp6 ok Q'M@/T4(ad\y="MmW!1Sg+w{GSPeDD(`j~I齢2}[״`M/Z J*Z]Y~`42f%B֦dK1S6?huխ^ѡvR0 *I5+etȻ%\Iv>,pve>v+DC6ؒHߤORx|JitXV1]1)> APV_ʜoh^ɔ0~~u/S&pYuc'*)`e6!S&D:Bv?#qS~Y#.]ߛaȏ;\tҷz% c߬ ̰d\W=VD:t9vYÝV QBNB?LZK2-۱3qBOMi\_苞JzZ:OTV[&R27 ^HR =%~Nm$ʚLMjoƒ?/U"VQ<cs_  gl} '$5_sq/XYXݬen}nJH7hx*N^@]ɽJrVĻ $ ;Kؐ8E %Uuԍtǹ~ Ez c`L ޠm#ir@ItGBF*K*8#p ^g2o,Re4T# .tT=JK2^9SbM#1ߠ7.24MpRo~-H >n7~ͭL?}'QR'u0T/ɏ) %N>"vswkeT%nD_ؾ>Px21Œ@p]h)ֈ) /JA_aӋ<>6iF'C-@}EFЅt'jİEU~L%c.=p NMIn^ofm'>?f-ҞU>@q::s2^{10Hn8UQ{˨HXlO ߕ19moI&HS95A Yu~ŎZm" H1ܛFE~3.ę%֥0({4x-c&yyc) `NQbC^׉%l(Ju_ P*R 0Z-4(j r _RO ]P| eJ,^=Δǩ. qzl?' FId1鿢 Ki âW6H]0CVwjs)L0;ڟnΈbB63,QK)f\dD6 |P(H BNN(/=>TrT?H+?m_*FRuL˻i3'7E෫8l{ kz$t _$[?dԙQX lV Ղ7ن*e1 7?Dݒ  <N7d,~-x-Nd#Mz~08Yʀ^uAAJZiCbZy8TD'ҿpyv0;gO**$FI¯%E)H`st*1ϫRSbIf*!~m?+H`cyePe+4:"~ zv>9ǁilx9 jEVMr7v48'ݡ-O1;ᣜ OTfC7\(`1p=یUkNaG$!XjE" 5pް8=,;=`Sђl5tN>gX!V^.nz[$q֕)d#BJ% 1 v?]h6͕Y"4/&@' ˛H.vIo_[)Ed-5Wv3c9yweݵn=]ݩy+f/9}W@V 腁t1ڕp*AK;Wv~E>ůH^L'O ^]Wқ}c7^2 pahsֻG1J7Uj5 |µ[%(]q"T[vލ* CA;@.\@dI4=RծGqNLNp6I|N'!Cp( BLpr?^cLHW䎟+;$%+I?gUo/;UAMh:(2"j>ߐoq8Oh'#&߭$mc+69f5¿խ1BdpKZaxxK!DD-] _3fe~H"2A.R{z|}a{ 'LU|&^z\0瞅ks=O/ƭnEJ_M/-YB'lE*1Zt@e2+[χŜψE#i._ldbu$q%{*rքn:}k6ɑp.+jPdL:Q]zCR#gɹ0~Y;$s >7tU$He1 [e$FȖ 3/,IVHͮ-nt>%L5㚪l5}>JB-?JRQǞ?fWEA(LvwzvKIú* niE%x)0b|(|r { m=_:y_~Գ)WU:"'XW.R m؂P&h h@%,EqPPPAiQl ;g]6?qta}8bVilv[3uTpҸrӜ{ޟ^qF-HofIh^fl ұ5*+nI?"fxPS龐0[s$94y3qXОhUehۙ_<zGv")4JT4$b Oas&D,<m^Sű_=SzgBa/367TW)mZPɦDM2u,{zNJ K0FW$7cr6pBp,'@Lᇩ4dhTv$Foz!m9zs)^|JXʛ*(])˿G&77ס"vE%>&YaOHʍΘPƁ8Vs%rZp=&Ӭ h@z(HuAdv0z(<ћMBo6&kMupļ!y3e%+tzg9wS:B^G{wo^@*Ӓ *P8GeGY,?Mbxsa7Ψ!fXoT^_qT`%kx ^Qj! ;/qAPTQ7#3""{Sp#BLh#ZCn@c7Bwyd *iKQ-3h/4(z0j? ME3ٙ@9&Ram(ˋ 洋 CZ1[Q2643-I@6kg(^zȼ./#b1͔}C;AwkVvRS-A9j&)"sϡ/|C8_*YW]]R-m Ĝ_TP$MƦJ:E=-'P~dg$.ǂP?xݚWo|+ endstream endobj 165 0 obj << /Type /FontDescriptor /FontName /ZBKEQV+CMR10 /Flags 4 /FontBBox [-40 -250 1009 750] /Ascent 694 /CapHeight 683 /Descent -194 /ItalicAngle 0 /StemV 69 /XHeight 431 /CharSet (/A/B/C/D/E/F/G/H/I/L/M/N/O/R/S/T/V/W/a/b/c/colon/comma/d/e/eight/emdash/equal/f/ff/ffi/fi/five/fl/four/g/h/hyphen/i/j/k/l/m/n/nine/o/one/p/parenleft/parenright/period/plus/q/quoteright/r/s/semicolon/seven/six/t/three/two/u/v/w/x/y/z/zero) /FontFile 164 0 R >> endobj 166 0 obj << /Length1 1641 /Length2 8905 /Length3 0 /Length 9971 /Filter /FlateDecode >> stream xڍTk6LHw J ݍ)=0 10tw#ݍ ")Ht"9=}k֚y׾5̌:ܲ'KS'8ȫi@ ?ȇ̬ C:@20C0'ؿP0ަFǩ9n?$$|@b; P:8N^-lV0YG(fH[}E+@ Ez-,vtqBHs<`H[6pBvƃ еiqFzPfg!P8@G9@ 3\f+7 G2 m0(@s' C~\`>Oej sF~~ʊp#t}>ju?v/?o XM@ܜy07_!&l6P$@ .-oz]/gNo}~>N&~0k+ @"ܠ~>v7` qa7Cy?? w'UUxg<>n>A@TD ,7?`_gCvӆ_`kc]A^P?7 @#OYo=usp; W~+Ԝw?7Y 9W Yc>yB!0-;PM'Ww ~߬'w zN]Rnw|B0ˋOP_PexyN}{~k'67jD(o伐A/b/(AT}U$v'C~\o|Ow=P@ EZ!???^nP' gqJ<Ԯ.Fփ{4A;"+:'xq.:KiCLfkkVD[VODɭva?֕uGoERe.pq!,"W(_ ڮz{S>kz2w1&!wO™i;DN8/|Wޟ+t\H&Y|vT)}JVck) ]6-uK3 16j*^t26$׌I?zntHi8 jn\{brDhے3#PY"ln(WL>~&kl%Pk \ɩ8sXeX{*}oÁU`+đ 51Xr-5_6>\&IjNVA+&iW\ȁ r;WX/㯚"(>)DFb /:1=wrdZ )ё#SwH!5Hx~4]/Hk&GK6 oOqC|Ks\y?]:(:f_~EuFĩF4ϐ-6(j>9ЃtkP^vO @y GY>ñp0A#GJ'3:Tah}(s]8bκi6$ʡޗiF8ŊI>Re0~d&vVidfyoT+qԻS8Nu蛝4Gjjh`a&`-Yh6Koqc~=wӬuM_fvmosHH$Y:8;}tcuI^4>EqB yr/T.h(#3indQ72dpePؒuH~3XMٲ:WLmpzInj++Љ5l,O`i8v^@{ݬ B ^f똏o1;a-5qʴMBVejb4F{E#DW56$EڱS˅yҵUNbm5s=};)$6"̰E@ј4S#3n}=[X 5xt fiB-S%~_̖ON4|xzk'gnBs14/tXOchP@tjp^r|O;fq!3?EB>"V T/fl l29lb BE+DbE3ġ֌ 20$Kkr3d 4qEY=ѯ\R¥ь%zmء!<'.\]cj'{TC7w;[3jc;/U2FjO2i,taWY BH'94ktm?;wӚ^P19gg ~#ckQǞX\8:h-XfVVe`KfTLK¥.E&W={QX2Zя$* "oH+`C}t &"'c{04 SG'T[Ll }Q.E~YXdKtsZxr1n |Jn xI\S2?L9; [>zU]ώcq-2Ԙ V&|Xz.Wvfj_}-tΔ@q0UgFSOU@eg}#"bl*yJKX(BC#2%B8 9y vA%#ET1>(lBCԻ ՝e0\M-mQ㸟^W,U9m|y^ ޴HN=fQTDn""$Ó_NZdzP]澊OO[JȐ 2aAg ,Ƨ;81\6;Hq#ؐ^Yh>S-A Ҙ o4Gt7g%8(a: 坰65ؘg PїqK,+DCDAUa1] GCB]͚(䡁gPCRb}MRO=tN%^a44%)#mV CcP FcS?Ԧd]݉|Î0 ^?8uz=ih=Z'ŀGv sKFL+ -P`WH=-/^~F׭}?s8̞0<Ӥݎo Ƽ9Oq#ACԳ K3␱Aס0a|MZ ׽rokJ/;9K?9,Nr=ؖvʺ2!jx}rXFCha oxn!۲((ؽ麘ُy}JS:TiR*J{jZ3탍.,]=~;W?MR* <;'>*vv\g'UҤb&6e~ xٺA`!k^H"52$i>\qĀeՇعL# |07r, ZqMƶ6`p^5Vm[;/ MƇa: 2,ğ8*58,^ -6,C7Nqj/||&^0sg*}CT6,E{ȏ qY*,[hlDA20 W>ѠO1Ni_7s[~{#.v;g#ܸSL M"GrsK\(g`l)dЁ쥂YQn+%+:? ^6iMW됤hbx+NegM节4_#OMu}'݀_ Ԣuv$kOനiB쳯=q^2=]o49حsW|=֌^EBrP;5V)",1FߎY*exDQ!yФ4Zfnf߰Dۺtˢ30_NjZh=Vb{7^~u{v1C:EQl~:@rṳ%8Rg Ž=ݺ# }:o{ \pEE=V>m^m:s<ۜ_tXX<^a'fKm< 1K=)iM~ic'93RN"QQb65HW>帀ʘX!QU˫S6܋&6&gHgͿv-ǩxYai#u`Z[*b_vbxٞ]OKqbp {ʔ`f# 865*%x<53m}56.G&2ǂ>;ǂx8 2o%e {O.Cs>_9nhԠZ pP$Gͼ/Puy5A\ǏӢ ,LaJDI\KB"Erp7`8 qx X:⭙-ś(dc">z Z_UF$vY /е%ȍ (68ʲd1vuᔝսeew3KD\판.2e01x93mDi'I-!%?LD_8I::8'Ո3ƝNE4O! 4J<^cq4Ҹ^^I`!d,b1hIbm҉Z¤\p#\6zGj)f2E* R7T\ꖋ"<>:?0ӪG{!.'1cIѲ6'с HϨDZf!z' p|7KNfNًIak+3X0 Ŏ\ƻ۾[t&gk(oG**xG)F,G畣{rK 'xCyā*.TK|0.f g#z6%,̾WX R_<<_d gk$Z͠ cիn0~zdb+cIz&O;BIgujfta2o ԮJ=8W-bÝsDԚ\VDj2K|ebisFLiܘ ׁH3$ɓdQ.9$bx;&(>+A7O73^z b {셐5ҥ>#nS|vi{ʱ,dLmt;ƼB\t~/Mx؛:T},rz1]6Q ``veЅpe3e+y' _)޼lPr+xD?T@^6^}hUI/p$G(oUHw<9.^w\Oqd.ԯ*kbzVtf5aLluTPJ~$RU򢓸Ij?2|$Ƥ كNFFkyd b rt91^nwE՜y Vc>pP6(cbF U2ॱO03Zؒv~~~Ϙ`9Tv~H01h;!"8oYyL?=Y DcGfWL6qc&v\)9XF_6 lU;̔7J)_xb8žbA?q8L(ZNhOu)R9ّLї%3]U+N+)>f檤(JR_vc*`=&-y?Ott$7Ȍ80"AYC*mPTQ;NX:FV XsB".:{Ѯ׵LCQt-ț* _Ud[급o3 5_WA|\c qXr,] }gV|K*5&L*#3^40<19$6 m;œR:u8qf;w6_AN]Am0ZbiN[UƧ<eN0ѦJ־W2zX4۴1~ht5iKK}|.de^:wY |`- {.s'Ueak1_~Ra:7 .OuĮ2NjY}+yw p6%/N9wg.݉FW+idO|ۤ &~I(`r PX޻Y4[/0/m6vn%l!i#ǩȢfl ~%IS`F)0sv+c-~mncq|8ztBA8L#Qd /`*of8Rqt3V3^4;^c}ak8̻rNVB3QJ݁(;* "o B%`ˡ]q\i$S|pλ&ʷSu1ZJ@}I/5{wW5'Zyq-!ۮ;rlŌUS&gY%8ou:D)ygcs$63C[nkb2xRkHnjc@Č /4\tgSBvyܰ~+>,ĕSC5!fɖP]r<6&EC '*WGDrQo}kS0y;L\L-X`Z~A׬ygZ~Ni2hzL3cT&ޑGLny4ariyAm]T o|5;rMx_y W;T LxGT)6{+WQA `/gC'*6R? EAehlOn]&l9{OH Q{TF,i8ɮ`펠KxseQ?=Uo"³^{<Zs; d=TUv=^ʉ= KRY㮀w1ePELgV/s zۯ1S.;4vM/]cÚae)b&w*.tn:$u.A?:iW7.g2 M^mdi9%_}xxH^m]DŰR {޼B7*8 g&r"ӂpK|͔,+D=z-V0qnI)c endstream endobj 167 0 obj << /Type /FontDescriptor /FontName /JHSOFG+CMR12 /Flags 4 /FontBBox [-34 -251 988 750] /Ascent 694 /CapHeight 683 /Descent -194 /ItalicAngle 0 /StemV 65 /XHeight 431 /CharSet (/B/J/R/a/c/d/e/g/h/i/n/nine/o/r/six/two/u/zero) /FontFile 166 0 R >> endobj 168 0 obj << /Length1 1592 /Length2 8617 /Length3 0 /Length 9651 /Filter /FlateDecode >> stream xڍP\-Cpi4-]w ![Hι{zvU=5sUSkIZB-@rP+;@ZEɍFO vmF9H;]m2q*P@z%/ W Y c 4lm̿>@& ?t 4T]m@+ZP _%El\]88<<<\ءbL @rvY~;bƎFжeׂZz;{0qypXϋj _ ] lB!^`5 l)z!]`{s?;7Ij̟ M vtuawse!Pd s۽8:Y;7C,~tsЁ@ 2|g'Y{\ϿLe {'rj)J)>))'  ʿ9q sEoU0=1L^A,e?7>p?OW)7$foq;xVT@gz&Yd vs_tHBFdv%sy{0ukl\{7}|V\q%e!@{0wv6B|7y@-A `@]SVPg'/PmA>׳&9@@? /|^?yJ8ϕK9p 8Wn!?_]yhKPpmChM$<^:Ϫs;W>2^JQ=hkDhO}0KԜ@[!.!aM[n|l"}z!Ǡ燡OK_j_)?Tα-X, Q0zb/\^M?Q)&nq]ިv%#1$ěeHS^>]crHh8c;ԇ,sx r臄r-)݈E/@޳OAcx{v8[IĜl~9QH02SkԺPv(y@I;|OY}_Ę r]Vٹ-)Wy MyL,r @>LȳVLa.k}skXWax5OY^B: 6U V֎y)1ՠ?ZCi7EW?󞃠W.CtLhQ EDaǒDh[lQU6x#x1@ IEoEQyV<˔1.3 U"/e-N"b ]se6Qq|Li:cSz$clau}A%5]q)m?b(qe+0^$-^V$\nbl̔tkb<5fA9w)CbLVe?(_]<%׶)n䒪Z~/* Ma;|駫͔Vy$QdMvM# |(.ŏly{P#t` tO&!.Vi:u}H:G>jB`ק#oh"s5-Ked]Yf8C5:K9&A%|徘Eyɮc,Ģ= 7Cv].Lٌ 3>bxUyKpm26mY<#Z.ӵ"[׺44 g.T ΨB*?3~rgwĿѾ$C2.kZCw:NT㫪CO]9-vu~1 $ v@檡ʇO"5cఏCû[˒^ȭOrQEǡTAww7HevW'2<O (v47rK@|.֧w/ዘ`ta4{vx/ _~wC:R"Vmf1'Xm`P@fb/f2>FWQU[&|M͜%o9ļ-Ws_~U AbCwOp3ITթ >_K cedfRO[5*od^ڀ96H"L[b~1`\YoΔҶJ6Gs [DcroTV$pY%1%C`8UZ&`=S24hڊ"pﰸVC˳y[I:3U8B_yW"}C<1ڌgf0TEu mZkvLO3!NM ,zwBp3YwE QttxF?uX/0SO7>J˨F)r^FA㔃48+RݢER-24Umťwb!kx>d]Ls]v0| IM 5\'Q}ꎙ.8]C@_Bҷo43.#oSF?[T?(Naly ԏl[3RhiGw4JQ!Spڹۓ:v86Wg,J\!0*wTATy\b4ЂpMK6vCYCȬ,_0VRj}-.40.ՍvUi~4vII>5Wb5dz.}!I /*>㥔E4#]H6 .i( Po* Q5AeMK2ྖ*4Qk8nʡz{TvؓPŅm86/uԕԎf}@w@VI(f>UɈHi>+ŸəoƅTMΑl`OtO:/9~ !پ)0 nF踶C}2_12Nzdr_)'z~/X|p7LUGjh @*,{'fƭCG=0J5Nf$jv,xSۖ?F,ELȰJKNt~m1+ hKnPPtѧCLV yAB~6V{N݈(qJ"\;c X De6@x:z'8&h[43_]I& 笴ʚ[ehM'wKYw<|I 4ᣉytu_ݏc$_9+QonPO㕊ϭuxq$v~5yP4 `8 f8~TKFGXd ^,hRG웼;æsCDiv+J=_,g&ث,lFNkvMAΕF&emw2}5Y'C|+CTLըը+GPC>:1⇻I8m 2Hٞ{#8,yA,AVE>zb~^ .A(8\OH$It<HR9zRw"鐢W-A;0[@!Ӌ&K#02b`jW}fw##Qk!:5^!EڊB:@B qqlD]2ٕ|43@eh@1=o9 9>½/ cʹ7v repr3!Or,Y +wt膨i:ϤSmZ<ͭo!ƕt% =TwجD$z)40j(Wd9:x!ѳfr{vM-N0$& rSfIV Ioq&b'; iΥ "e6C!_}E n+TFUmrb愂A䓁9{>I,URdt7kD?9#r :ոvFePM3尾ʉ&Ձi5\^SsjN"9"8RCtƌ_8-ӈa0Z F<K Eӝl$ 'R6Eo#Yq $$/0(=PюC0h X<~OnxE;@d-Tysğ {7rRE3FW j یԞ`4vpWϯ8x~PT~&!4ob߬z$6mR|F& WAS g"E~ "L?\]]_ơd)Q'zK5‹$ _i^gvau eM`-p$J$|R{(4]kԌl}zEa%zoz^$0fDNa iPmnˀ L[~ _͙Ytp,oCU rJ_?UI֜^aݒ7R"?v~1CGM} UbXد|[нF$.wэ\;]z!Cn][eA K,$ c@bvDԒ,"KT5OП`ԸS $B!YYutz}"?̥cvzPd+ b>AW&w8&! è툡 A˥ZS$~;NL ;k ᨖ(> q\{a=m CMϏ_ґo|6rp[*AB)%EKb@~/Cbb kM<;բpRf(CʕyӌIR%+U5dOEOȹ#;ј2$hNXSvrSag.MSme'!hha]&yD|@&ҧ*a뽥_'KB+l" AXa7̞+u_}{'*W>*gr XݬSeoQ`JR/JGX˨c4aq8K>C׮9PL+Am%tgӨ|ӭd;ҥtOs\kPKВi` ɸ3n҃ơg[6ʨʘ/7'gQډ3$O_]ߣXs0O&?C\Ef)6^<@3V/"*,>-e_I W2@4^dDH3@ЋǠՌ]3ߙ_q彧G-6oμ>qkS_~hZ Zջ~0@IG*LefՂE pA,BHiUw!.rK[a7E_/_vIuїZ=<턃Qw^22WDQJ93/$~k}Ґ(9Yly\ *νYx$ VF,"N)@ҕe4{G=ҭ=TCTx^%s,pX,k^h3-3".WjW:13ުrxǸRkOY5=S?H6x2"|-sF歞[fBU1sLZM86[DzDF%_\zMr'IWFr{='[Ε<:x W\ lK}VW[&؞iSOM6a~Ġ0Xu(u=.6Haf9ېxjL^'_ #`а}H!pۊ2gΗ 0 (Iue}&ukd_Z7өO ugrgGԋ:y:d$E>\1Ʀ({\K0)wlkh4Y$d-l'p+볱v"'V:EѬ[`;$%gi#뢰.xİbY;VTɸK[7lhSݖoaSw¾w/Y@Hw k`]( - (&$yd"BNQج;TzJ.jm`Q~W*U5!ݕ3sK#1 Wp-L6^]֎ d:k endstream endobj 169 0 obj << /Type /FontDescriptor /FontName /VSJEBI+CMR17 /Flags 4 /FontBBox [-33 -250 945 749] /Ascent 694 /CapHeight 683 /Descent -195 /ItalicAngle 0 /StemV 53 /XHeight 430 /CharSet (/O/a/c/e/f/g/h/i/k/o/p/r/t/v/w) /FontFile 168 0 R >> endobj 170 0 obj << /Length1 2427 /Length2 14849 /Length3 0 /Length 16272 /Filter /FlateDecode >> stream xڍeTX-Sw]-ݝ!xpVwt2wZT%*1P΅ &*`aagbaaCTt Pj-shF. Qy{; `ca@ :#P;x:Y[<'Ƅ:@dibd7rڂ<TM,.c潅3;3 -t:M P0%@"XAJv@'?@UZGX`eb2di9Pcrpaٙ%hdl7r312 @RD`?:8Y:839[%_f@3ڹ8#TyO[lmgnYڙ+PZ?R o9j,0`ˉo&_dP3P*@_K3 pqrz_ 04q-~[f`8YztY@C `/}Мx"&/[T`dcgprxk7JF vf￙g#],VAeetO0:1 E9}@p0&.f{a(ʥ޿f([L#pVp\,.9:~#.8.o) =B,+x$kV<cr!.T§8aybQR"m-'o6 \  ᵟ璇\6Pd4*O N⽳FD>S4_d7$$ty:Xی< Lgu.z+=&YʴNI&D_R$O-'yVua[D4m# J􂽕|F4\@/0eBMeG`ypbEle6&}qLJ:tHcpYRDJMc"5:Àb'&@ۼFߊ>ACWI~SL J1hWHLtPW2e\ bj^iI۵Bg[QPky/'\qD3ysYwO(N㳦k vϨ#0XbBxNCI e>/A8Sj1&*\M߂طu3][odzkکjTPFMf&C|>0fE=6wׁ4XRQnGI`7V ۙCQD"BJ_/N7q1+IR:t8g] jǏ4/uGb܄1nx߮QJ^R5+{UJc+W=4@3MP36 'bΗ8]eԥC'3iVܫj%o1iIفIH/tJ[TšDg)ܰF`pNNAK,{Q?-q+P&g(J=t0I}MxίJ&xrH 2"VjK"pCI/W ΃(X_O"ifm g}Rux^8m5ݫ+jYVT۠H =APB>;:|nPfs} G8[[;[{&rgMykňd\_}>G}ҾH<)}dK:1؛EpĮ5.4znpxQy`Ga1PGkٱc{v@" v|Xl+pHW蠿j( %hgɁbQ*b$֦cb&"K5c cN={.|MMt)ȫ^@AeHEWlMpdT><%&{zdJox+#Y 疛.2Hǻ2b%K Tu3,Jm(V\~$]=Hl阣."sn˲L,Pt$ٌ^0FduH-ɕ>4&T\e7  fR'&깰O9(!AlsbD.ЛF} P[HB [s.m ~ȵk'C+;. ]nbdG[lfkndN?5&V`F3ٙ4 da$pKՎ#,QIkhB*dÄ=㍋%5םx>Fs7Řu`oܾsB(e1^ 9T`G8!aI⣁#qEawjd5IxtdNe;Je*l7AYYKyQskaxVwJv[3Z&.s! ٸٹ4 XwGKN"Mg$ *E9"g'u`N`)KSeś58~ ={Eθy7ŜڢӍ@Wx"cy#Oh2j|[B_l*>Gd(|*PX)'/P\Maə)ٞN$):h߀7o҂0Z%LC< [ICjHkIx1'mR_!U/g)wrHy4&KF?L;/7ov= 6CK$>.1"IBWI0n?-tV<{Q&4"~U|:<ޘn&L%(P6`Fb cqdR| k8~#^^S'vPKxI?E?LEY NEVI̘ rnRіN_ki%a ףSz1'i88 Q:=uHh440Jz{uGz=r~0 'UR҅3&2e" >3ZOr՛Fru-_*kHa:֡6h=߉pcUŽV twqAI*Th KAd=(DW4pl';cl?:t_bKS"Ŗb`\f5Uvk!%=,S5P?WbBZl;=TJ´+EaӮ6ϗelg1|N&e%BRoXጘ?#bٟ0?@i[%D Ir5\%S#LG6n{z:Ұ}I5VjCv1_.1׮[ Z]-'jZ3;+渢ϚwفDa$DE}l\k?'/!M~U0걙n^nmr &,3>6sc{g_'\?eoaXWG=gb4  :.'q&d(n3^sq4ڼNuݪNv=E4qk *vˮ/bQ7`IlK!-XhbG\7vTbS[۔O.Ol;V bqi׻!W жs.yÕݏE2=DZmkj0B 9dx(1%=O6F/~L$:1Թe\&B ]ظ'V589+w v\fcKӭ* v jg?|HW'Z80mm{g(좳ҭ}_ʝ6y:L* Հ2̙=EFbBa4dI.4*ܧV/sĭzmV-|rܛ>\wi2P[ e t遞㸩_ ԰Nw|OV$:|ysrB=J4[I70u]q op}CAe:H BI@/D}UF9nw0[EFb_>|{=̻yX{&nXLB0Kѕ4sdN~@Ye*x{I%FS>|5M?zT'sBDZf,_^RQRmV)HHdlJiHsN'㥹:겥7+A3,oI[TAO7H%+dPsǩpٟۺ8OdfZˏ֏jg.$vE: %qI?WVj:gC6!(Cya٤8ou7UoOdy+ h+T~;\>n[9sʲZ,GjIg灂A M{(Do%J&}KY]xpx{)z0 RVix4mʓMi{r9g];^:Pn#d""ϽHTu12q8xR^?xYS#S!>UAq;jܺN;Kn2~?q(W8'}Ljv|zy]O\l%9Q;:̈郸k%0NV݆t/)H-ơPxf:;`ڎ'?WvwXAZc񪅈UhE=IbH wĊ2v>D-Ȕp^o\ǁո5nJ$ Ώ#n[r߳Aˊ`q," ejnLH.C&?rN.p\Swܱ7D ; k~-kXOCJ,/hb+D_r /UIj;-5|+ zHH>з}Nk b \I:u 2U W8;g*JltZ.Z]QVXuNyy1Λq<9J'7]2;eaj9qJ-h .jJzίoE~v/lPl jcO!ǐV?lDxEtrw"ITU䏹+"]sbyYsOa4UecȊo‡g-. Unt+X0K٪s##y3U~Ӊ^jPeI:ݎYY9c'mZG0HAAWL|d/WfpXC"^#E=Ϩskת;< ʉuq "΃SHOebwWS +{|FCwD G\gí5Ǟ|S~;HS]8*–]N̿LiJ+IYSyV}{ 0M1fxH \"ϐ4˹mfw ,U1fLy8B!ҷXlь&G LdaF=T}y3/*&RJݓ8Z)דθknO<4!37 Vo[F%Z? -*}2ʹ)6#f7F(c\Yśv*r47;tAiޝ$^iggM'6 cH̰_w1Eap$*N흒 4[PLH~Ɇ 4@<̕!1F-Zi2J_E`{wtE23~59Cڥ`]պk8א_r{cqf D8m^xYZSÐsaV}#U!Tۛt6ROKxƑh]an?c;Qu^"κ~ؗSUy[4EkCt58 O&7eըc+.4c\p&z~( !o7l-XǨ{ye)lV=P:ӾG_^ C)g8UdDh>&m=5eAyAlFm:PZ|+wR@[U7[()f eDYJ4di8"y}m7]Ηl:k5z<+ޖ]E=FtewZH7ýqH_>ȗnv\l%%=&܈boBuAAז+.7oQ*-޲.s GLs(UyoI:#JDMrچ4wSx do߷[*^׈O TfIzJghЉJN zEӠ#yA^]o*hA@8ϺiqwoaęLOb4/݌&jMI8Y1)b*.Lk+AS4jAES4'et\kc*diqoN\N*&+*1^R'[`O3ݮ5ۿlŗLLó6TUU[DV/b ᐘLhS,x2zMIUvlT_HJxS3I?y@|SqE FZӗkѷfڪ .peuV8-ZmXBZwPLQ0C" cƿ))'FB\& :[yq!64 LfB(;jX-]-xtbXbfܰ0x/Bەh' 5%.^AZ#V|zCQ:KڽI#KU{ߔ[/ \Yn 19xh[S# xg:`7lדnﳋ)լR?L0%կ2 [ `3Vd}O82m"GFi6]d jO|s(Xjt4?t> (l![iXd(]`/J%Nϒo۵_oJSwB[G$c[+s.Yɠ$ummW~}m ՓB:eNojB˫?(C~.E5 '}m(M~az}#+ dLєs?ȪvMk%>(0/`ј=gϙw3`}) WG͚LG$ ׅT2 (:hܪ?F]$4r8otudH78'P7N\w^Ds4^[3z+/C׉Ji1t~tGFwl6K JG9d @nH2 փU /k+N,QT8* a%|0V.Z-\~C] JVVAӿ#C?=5YmSfIMOy^ñ&jCbݟ)U)`[Cwșq&:ط17اJìMsp7Z9 㱘Wkyy۳p^>qxR|E.wJS"X1 T0a@>Th^].܀X>?:~Vv -:x3 <2Bƶc폺GB7=^3_YqS#qO]ai;d,: {3Ng|5kP_j>VI7y:{ՂiHF;"y-):9{&v%Q}lzSMdHK3ܶ2CҭeNۻ0;I2[@'~>/N)\ufƥV/04!%r00^Y}D}3߰8귷[ s:ب,1PXNDag &}В/r%h`oxfG| QCe1}jO:Db4axO*hɝkr-4߻|rӍhx[q!0ʬRFR2b'O}IlX}$|5o·\/DbH)F!k >Wu{([pYa,B[t 3M.C@:˫2HDvV!*3C?>oLl ^`i[ܵvcϬY8r|&.{[/1EsD"_bX#"%V(әEU]M33Qx GLE'ΰw6{_*ϦGE9 qaߤET3Ve _.ǔ֖aVhM,^k[5a O=xBh6r8!/rOYChfwaSf¯@f )IT}0yJ4okO#S4Xeow^&dOXs껞\*Ҭz $l YaQ)>]%?$37E{4bbh>rU'KE^ȣHNXNߦX%nRĊ]cd)JwJNBbn0Mbܶ{+bhv4>`ڛpg)kSz=U%s>OvzWm¨؞hm( j숢tYޕ(;rYJoTiaVP%țibM2$wCmiTSEI#EG_\Yz|x־ \2"zrF;"ϓ=|E/ʩU%foFA 1mфj -z zDR^.!ųasVe 8ڥ@ב>YȳG8Tk*BsleOH-ڍP*$ q{ =ˡuc$GaLJrS*s-?[ê0{P@.s[<ZBz/P]fs2ۑE 0o33m>:7&ɼc5} N>_Ti6*g5vp2ߏY'eevk} "urďLM{E(1}MieJ"lzmq?_ l٥.|Fjr7A̖F[r(ֲx(.{iڐ]S9vCuNp"ןP Lc !1;M 7׾uu$TWOI]_ͧ|hCJHWqS^8ƨwMl+uAcA.'b&=m39,SȌiX<y+p<)bxHh.D>/B~hHdXeNS)OOcCjqڃ5Uoˠc8F|?=D0p/K!'JJO|n-j1F;0 %ine^0Ξv Aʔ{x\P.O$gC9{#C1hjuetEkIwj} ub?nf]B.Oww(W#_6D9;DGHYJZ0}q8", bRAJW *}k^B~ #40%y;`oaQws4w1y"YZv-&%3D$sbCWN O)} |jm}Dzs9cPG@`n4Pö)<$ă2{ ޝ)hzUegǒYL5(_eX~&9RY`&4'e8;y!g: zd5}ԋ7k=Qມ)k-0/]!!-u egr6b~?:v\(07 ydO:N//O;YI,Aagן=h] cؼO*=6 UlBtfWK;nW/]QgT-$=J6o["0x0\!u a5MYa4m?wc:Dxm`&$ws :IR\[f-zf5o˂{ڷga$P旧G#Ĥ6Df-/n]E Y0e!NOM7JJm6PfRI47=͎TH-Fn7/^S D bVC3 b!!0 5wݺ@k(<]2=G$m 5m@q).A3`^nCAe9γ0W8U+uʻY#5&\Xo|Y n=s C.o\S1A7ۖMcDH_# [_!"} ؝Qֈ8("#"*f_gMZc}.ύ2;g:*1JoUXx75tb°=%bxrk#uҪ=X#З&L-BUxI n2L?%j 5H]m:8Z'-C R]s2A! ^q^ b~cIvdPu 9AT Vu T'CT Zfa|&j3%0DE3b6 #8O)q>f HqT+BbhWA67sߌ {u*qHŤ|,2N>5nfpB0W컣#_>vbMJ3%onca4=]m}AԻU|L9 ~%ׁ?>_N[Ŭ6KGͯ oILFdFπ&3CU C0&bͪKrA=O\;hYz G*LskN`wm진xCɓ_>D{l9r^n~R8'gr.|olnwLWd{zGC/P+ 6E~!PF҃/E3kl)7zZ@&0}g endstream endobj 171 0 obj << /Type /FontDescriptor /FontName /YMIDMA+CMSLTT10 /Flags 4 /FontBBox [-20 -233 617 696] /Ascent 611 /CapHeight 611 /Descent -222 /ItalicAngle -9 /StemV 69 /XHeight 431 /CharSet (/A/B/E/F/I/L/M/N/S/Z/a/asciicircum/b/bracketleft/bracketright/c/colon/comma/d/dollar/e/eight/equal/f/five/four/g/greater/h/hyphen/i/k/l/less/m/n/o/one/p/parenleft/parenright/percent/period/plus/q/quotedbl/r/s/seven/six/slash/t/three/two/u/underscore/v/w/x/y/z/zero) /FontFile 170 0 R >> endobj 172 0 obj << /Length1 1637 /Length2 10193 /Length3 0 /Length 11250 /Filter /FlateDecode >> stream xڍP-C!  HR-Cqw+R -8r={dO{}{&Z6.V`([ ddԃc2a?"d M TwT<<|A"^nn@:@ a2ʺCO}Xx_rvCAP:nv~h rXCp*"f^^^\ g+ a`wO  3oj\={/- < `()jv/@mla ԇBaΰי,+)|SKe!s/.lɸX42!!>ljZٹNe؉ יc+8!{{]Uϲ$2~ RZNfzn߲fJҋ(oM(l)ص( ##ˮ;Zǐbn.%W)f)UؗORP\CaWXWZL,5g6cakPxLNj P84/N_CE}JX1Ƿ!ETS[`;3u P{@>gss:o8kտ[ Ts!ޤqi mH3OϞXF+c@lg[7"Ő|jAߥ9?ЯM *p3U?&x&UW_yΐRc8|>&`I;QrOt^|Eecuuߩ6 ӄϻj'lNf+7)ڞ+Rb7z]0GJSHI|W )gjԳu<_͆L$گOGD@m0;oIfa Zao/JQ5yi4Y/M=wGiKo7ܡ$U2F9漚}Uuɭ2$xmsCZ W藆 XX}csz秬-^7؛@ FCHuxe(h"¨1,[GaAl:vy˃xEWST0dnl_p} U:Y?l F4˵;;v1T"fz͸ 2d %P&YcͦPc;, sd<qF70X󼼺O]u#4]&nD:݌Acc˗hzSS1pgjv9sttޯ[X%ݿT,1@s  y[Xχ.lʧ 6̪ $J$OCԶ*5ӆZ؎*ڳ ʄ5|hK{gJ  韲 D%uy1O~wz|{` nC*8>GX9⏤C }qJ*갸~CSQe.F>8gnd rzRDtC3:PvtD~qo/_ʄ9 rɊX%BL. ^O-@Juu5wf]Ԡ8y?Pʘ2󃎼![j`D(Aa덓sQD 9NZzݲSro%>UX=6§[9.hKEdPH^0P}wђI!¤"%sB= %n+`ַ(p'xlN6[1۱ V슘~ 3NqWMmλ#Zl5VTOe0HE a$uplhЏ8kGXRڤ?GŻ|L"C^gPٹ@Ϯ Bn}H:O)1A]s45UCHj3MڞZ"Dc9NڝqF\- (|1 KtjT'X@Ȫ8jUhɡC}?)O.,p>;.(2mK -J<Y K7ղ~(]w6ιxt Ğ{U)vWfrm~H6yQBZ2A%n__emg֓L$͜"zQ{4ES|ؽ㴴 Eʊ\'tI ~!O"@i5+HLh >V4v aX(8;U"JwxȖ۶r:p]Ӌ䏏]^Zed2؀^]a:-nf眅/ 7JShSu|8%R Bi>{VI$"޹6"NufD6}1FD`̽`ZGJxm׽68S9d=o7RAVGY++G~?北o vzzUe%(&x8dR/?:Re'~[-vH|^%3:LO"5/.f,lS@ueQ.MǷ1/pRSpxY7ġ ᗝv:i3I{Eÿd7_3 s#ܳ~7͸CAQRCZ0>c|q)[tH(%ɂe޴c]; '8µ_+<]_M*)rw҅*/L?I9XeG <"G]=xka@ԓGw`P>#0qbx1P{Zs)[N2 DGd-;ttںVd MǿŜ]'PZR42  gFv&=جȄ4 50,7簡b.߉4fύtzItaSҝ p%lyZ>C V6ntv>X{ǐ>4ews^oу_#sv H-"e9(+w](6bR _07 DM ԝ!*Q_k =?J .6Kԛg%ȥ0*Z=#`ѪmtY6][vazh-?d5[_EV^=?`w-)v$^ϫ?hޅ9_ E2Z' >~Q"o}Y}sh8l_1F9k=sb%$S\RasKLb[C¥ Bt1nbBR߯ i_-7=F!=]~e9OSƃ\6.ՅF *vhߣJ_,yodÒ(Qv hx!W2Ὰ͈pP}M |EgjC;_Qk^7TJA9|zH&`"sHwCU@7p/E@º_H .G^q(|*Yܛj('ӱR?[Pǂ˻iAsS_aȞ}Ŗ$knL}IؓR󨺯sґnj +KntCmjgv tj8~Upk HLIlS oҜ=PQH .f;#[Ho*~t.LIwCpi ]q|dxLpiW" hC/³[٠'j]>PY rU#wS_پLpaWc*~ V9P]ơBN3(jN+so=mO6_H 7BS]~0~DkhK5x,1qي|o2oJFe>;.1Pn EQdro7 ;(: l=LURimNi!FmȊ{0m ?6ɗ:P"!ۜbB,3Iϑ)~!{yS(8. p]E@.o LUZ@s d ㇰcOHgΉ\.X=n=|]I>\}!X<L VQ%$㧙w  O+ZObD r2 mG4c)6kIKf y-X+"FK6-Um^^nw!$ \*4 MOt{v 8覉hWJʖk*^dar~.!YSC/Xr`2c{P>]ܷ#\3K8HKOiPo0n]WENȊs*AdPY)O{^G)[99Zd3[A8J{ rIJG 4䙣ͰT(!iUu{4gKEWܹ| 6-@SV{]fHz~Dc'ٻ /J+3 ;؎e\ߖt>Ikt =3ѭCVA>*gĔϲQϖqkkghSP!bhwm77o3KW`IXw8QTe BrN Iɷ qC-8O_]?_pMkUGgL 9 trVOT Y:rHy?ܓY_~NꊠtvhpcMݭKT>l.̶1Ҽ#e3tQ%$|4WHeWN(f~w;Iy{zVrSmro(y9gj}?JIlqJ"kiem>XޚKB!aѲk؎!,q/1V["7pv4yMGT䃱A R.8Nb$)ß;\)*S"qF*\ [907k?쭵c4.1P+Y55ߵ6/҈x:S!]~ !i~ K֚p%D3E!ol>/Xd%%'"2Kqn(Ef[5] :sW5kK7+Vqk.ad&k Ү(^<x'[t%%>OգB3wxiI[L,J,A0>YGґjn]7KWagʭp}" $ڳGhj3Q~%nCDBk(,K0o:_5SA4sBJkx;^'^ +{{'=IHQkt~v%3߸w^m. ?9:NWOmDCf& Jl׍)i٩HZ v aύVjptG*Fm/np)] ,<(u9*Žzm?{HDXMaNi ^u2iwx`[U֪nx%e# XqSdeʍMTg;CPؤ]s$XlCg!ѰT'j,9 *A $Tr>7>470Ym^dRX_e;.N].{)4znGˑ#"@%;YT"YR)5C6Am=ZJzO=,"zGk繯H[ Q*YQ*G#]+ yiwF>6,[ ebERbբ@@1o#ġrDՠx#jЙsPe][_4YB=jǫt@"z3_`kU:Lnƺ̎kIil]ևשy5]TʳGϜ"]Mʇ.hYo]q蠍?qEqbk`vx -e'1V6zDx266i Ig=K = FQ5o[FV;qm$I4_[7[=WHt>RZH9_W6OzX-ZK:DHYX0| /gL9hVNG`Wt+onIŵ,Ve\dHZ^1ĕ YW /}{N#EF[|,&/`å7-҃Jv5r!9Bs{ך4a  HFJjI!W:D~u6 ]|,^ 4Tp_DOF W:ەy@yZ#M\-:=@k_aaSY/Հ|t>Q6W/4R|H6~ǿffm2_8?GZ+V(5ngiYZ5N^o 0^H;Լ~ \~e.ӰAZ/{aFuL37JC2GQV)Ⱥ$|C1!K`YA(JXr-^K ƈʃ|G7>dfqh墡gUfvJ(KT[hn/)ް~h7v ػbŷ~Vsr jqsauRbiW gB0#Ȋy~_&y@'@~I*`$Ȳwgr|_. f""u4 gY\Vi~._~BG205ȅSIElǺ.Lvcn }=ƋMP-͊ɤ0!+3VX2kc_3Z1΂c E)l/f6 *r+ԎiRl#&ט yQq5ҵm{_>2!E3qkV*npbQOҜsslh5P> ?˸%ǝQ9<}pa5+`TڡYrzQ9aj O 9CW N}:ݦw 2]CdmCORka{<"1N|@gijvd#a2ו ?˚GoA;VřYF6sWf"Z}NoEaj墒#L8g)W([9PR7="Nt7 XvZeMA\]㺲B``\\᪜iC_7 w*vOMD0՟xnT{2vt#DŽ_SVŽ)ֵ)sbK+z>('B83B7.- q04-\w^Ŷ óC2;J6>"sOKȏ6"` ):藥R/Tr5@3ϔry?cx=w3JQ=oMm着U\c^eR{c~Ŕv32'> [n#񍰇) J|>2ɮ6\=<݉z7ijkQxE:y7"gqs-Z4/q4MEcs>SIFCWT[3Q: >E*~̫'K֭8$A~d0٘0 35qF8D,1)`$r#M3ATH57ϠչFls*f:+ aA_VT0rY7 }B&VMnx_Մke~2pl5䉈˔)4k}h-2 [2''i&2s-\s"PD"Gqf3J 3ll96FXa3g:AmlIY1Ryw@~pK?I*Q*М= 67xR+U-J;SV/.=vU2?nKa#8慜u9j%|E-Ĩ('xXuX׊,аv$ڮѣy *.5sNJO 3@RʹfW/xAT>i}:{3S_pVaRp1 բ+șm۔Yb8e*veH{J8^J-&q @ ݎ3͞2脀҂=~78rm`iFEy ۰iҁ\:FlNr\k8򠃬)%Y|UzG[ endstream endobj 173 0 obj << /Type /FontDescriptor /FontName /CPEOOR+CMTI10 /Flags 4 /FontBBox [-35 -250 1124 750] /Ascent 694 /CapHeight 683 /Descent -194 /ItalicAngle -14 /StemV 68 /XHeight 431 /CharSet (/a/c/d/e/g/i/l/m/n/q/r/s/t/u/v/x/y) /FontFile 172 0 R >> endobj 174 0 obj << /Length1 1518 /Length2 7359 /Length3 0 /Length 8367 /Filter /FlateDecode >> stream xڍu8>jj65BbĞMD#Abժ*-5JFQZ[Uhڼs}\W?|u[HPeWC!1"B@i1DD@Q"..c@! bm*Pu r""@ @+) Pz#:BM&RFy"0}z"RRnpO @1Np0+C1~*+K AB(OGy>0p{/]OjBD\c' NB=Fm;G?/ "$rf*@N`(7w(t8 \=5m!/FE QPo(jwPzO~h'B#\qUU(778&u>'v}~AH{_4܅M/8DϘk6G8 %Ep$;SC`;pMp_p Oǿ$կp?= D_sCK 㺇+ G;Y@WrnA_ ~Y8 #^LTL  rp !Q5@ʓ`$_HZ@10P 7`?u.P .z_Èƿ`2Ε L>}`ҎK ޫaʲ'1Ŗᕸ9MZS:8i<ETrhm/fs[ޑng!>zuuYeGN<5[B$8} q$%A$8ٍeJo =,j'ݢb %؈L Rw 'klC\KUo= ;hCɾ74LN Z< sIމ_M9*/6񕋹Ȋ|=Kgs{c?qַ '@@!]ƈ#a3wGg\?'I*^yMo׺Xِl~GˣHaήdųx#iעOT=~7Ҕ0g*LQ6KD Rj4n'kN}275cn׌PȬ,b0!|9LBv4oWo|8 X^2ގT/\El?ȃ0`$7Ne5K*i{NC!>+"lwJQi E0]_:$Xcs Tn֔Z`0vB KGSѢ.O5*$;lrNts> c5WΨآr9Z=>Y#[ /ONY[]Kl=qfFI=gzy{1Cf}jf=YA^MOMBʨ{Mu>{ => C,N0^be©?S!O %hV>(3yq;0zN:"•Nfl4ajW,b@||qus/ĦrgnMym&ܐFW.U+lf Z~|/-9dSFIug8wY0"po%bT[悟^DjSݭpQK0sqݜj9iG,xqdY2x.& gz.@X;#Jer-ZL@H*(LJ-zkc|cw(Մy]ْf$Z ;eQ@;XOIJk R&.9?j'8V,0Pe4W\8p%͇D!]!2.ILKGXP0.*oT4"%Jc7'kV (sPfB^[ohzL;؋:}ڏ]: >'#OTe 3_o+nM2D|(T\,ȑVs#h{~20@ZANcDT7s#f_Ե._aY|U}>dr$0;Ӻ3brD%cC `|Bl&S-cO+qU39,zJ+C";z$ֽE3oi<Ɨ(L(5gWX$[dNr83[b{doTa6֙;yahWG7qKH@ .=o~qnz7ns+!J !}Y'3 ͬ(wHl8MHǪ6 8,j[Gf*d'^T`#׃4Oumx/Ep4>N& =TNy+9FNm%]O\FwtvTcy|, R|acɆܙ}f?svj<K*8dlBEJ`xhX\,aO}QVDRYW78E3s9p[È-{EDnVAX@2}޺1]_c$t;2cf5Y*=.{=U<K=@, wFL{<^vwF~ZΔ1OytQ/(ݯ޾9w(:^zlJa(53튀.%6C)/1+~WU9HEV=T=طIܼb%RF8$GKd] zONWD(Ke`9Oܷh<#6!L$6itH;Y4*߀~ nn N5-&=D O< ,d2A9;EJBn d2M'Vh=a߈mۊ}3.*'k`&ĸ)-N7GJxʸb"M*ŻcΰZ?$%SM@ 3nݣ9aK\K> O*y^֦dss6|jFVҜV_t'dɀ*FŸ4Bi, >b~XwYE9*xELֿ>_g-4d$ rfG>?^stn l$&Qt2> EDC2-_9J{ @M{_c(2XQwF^'6,Wn| ?+g{mN('5RTe+Shc{%P% -JJF:dUnkruw`IX΢PK|JM$I'Y@R&ٛ:w uCB(WcvZ;ZEn ^m&lˣcZyN\1vyCU[*KyS?v >_T JS8|8vZ{I]&I/2tҚb4v*#5Rtgw:U _\sר*@e}2:5!/ jw:QJdEǢy, ֊}>/v2w$ >`YXsH/po]O .τcE ANᡫ)I4%$:.?LS bs N6NE|4*,15Iqc# %Jr6Ҁl6m+9optSwidE\~Xzخ2[ۍ|.9X=ҧƖj8̔B'#sћdd;4#tso2İq&:m:YzݤA'f( {& æ'a< Fl&2ԫZ%?>`goa*Mpip2[<!l*2a5mΊ]ɾE2kJw9lcyz-=STSϬd~$/E8E ]?~WP:.zRjsX`H>C݈9(5;)>$;{S&B8+W"'1p9; +gB3zSqTߦ 1&ZTɲ[jQg}eaD'ȗu2<6q˃^37[N?-A|uV +6+,$m]N}mn'@1%Ԅzn*?V;2Hޡ@C/b4edX mImCgv^6Dgj dJNA hFg.?8E?˾Y-@J9l.J'h]適t-ik. Vx=Y?yڈ!#K9n\h-c{EqݹIḶl@ׅu̎lgo&g{:-ZSԐFpNWh6tCdxu[>)|e* Qbob&PoE="ۦZ¸A sOZk0뼒9 R7N'O$ʦ]3tXشuTu5vZUd̽NJ֤XJ _Bվ_$8`~$ǎgUq*l} Fz(~Zֱrsm&= fk(Duia^AGJg{Q0GA\18iU $j~34RXiIj}~¿S?;jx6[L0E7qo95IoPAy(fPw!=o"aj,s;E \\W, z_$@yG)H]yNpFMi3,bs_3<[2D d8U4[D9m,>nM|Lo"$&Or@*?J7N'ͼO OJtN|gH籦e&.h14Pye[0@'tQ `$$S}Irݺ7r gTOn(W:itQpܨlko\l(S2Wץs͐X5р۱9'՘MˎtVzܷ7!֍D*@ٻ㥦Yj-w l}br7-qֈ#@^&4$c٢^.z߫""uI5Sycϒ>17nHqne2A\v&֝"I`kb*FJDgYdJ'a{g-Iԛ47OFas0(|S@3|TCsWᓮ>,(Uf aGohZ> ͩHKKoNJܩwȠ1H"ҧ=4al\{ᄬ{/âjj5Pd._^uc)S)).$KQD+J"Z J|5 ӖfixI1S;n@L/(iƏUD{|w{DFa0P6GKy,9Y|E%0֦j4~fցbzWЗwIxxI?,4?ժ'J (fW֏2~hO,exnV'~(Rl]k 6+jl/2DI}DbOm5YT(wuB h񩟑z^VV !w0G<uN\UC `$]{Nzdb5p^4/-eb8{5[J\VԢqJ O(i t4ecvuɛV e[sw*B(R"*/S&*q!/~?> endobj 176 0 obj << /Length1 2226 /Length2 14977 /Length3 0 /Length 16302 /Filter /FlateDecode >> stream xڍT%l&:ymۮɝlۚlLd&&ۚy^oVk{_}"'VT23:13rDTU,̰aՁNvq:D ? l.&;77##?vQCW =@K.bghaf?L\\lƆ9CgsGFcCkB|5wvf`pss7qs4㧢Y8N@GW ௖6FKP5pBX[m>\\lM)Y=_Ʋ2=@;zXؚL-qYzgwgZ_NvֆFnR~t-읝,04ٚm`Ohÿ?6L\l-\Rl,nlWU{J=xL?X?z9Ύ.@*21L,F@3 [??@wp0~~0;[k?1 Ϳ[RXE cfapع>lM\j჻率oyi>/l?.&(+w[_?zC k[|Lf}5k&.6W+l!Bf%Ihhll>[[,otLGrVwa~lf53kbQߣ `sp|t0sH B bE,? }X*q2 fEb0A E\1 ai1} GCc+nG_𿊏X?Jl L? ?xfO<.?.!;?j3OE{؛,>dEX~c?2bv?_feyf(cC_ѷ32}HGNP:}ܘYXg7?qs~c,A]<.8}{~O$4]Y3 nsۛ#HZqpyFN tJE^|'Ju֖~i|:U}Wo+V.i\ND|G~ 㡋{J2pfբϓe-`@9|FtGC͙z'9f^ԍCM~:>C%|"URɷHE9>@=E|ƭ#+h%1N!@&sOq M\"__o8 !ܑD5Zk{NNnJsTtvcYx]5] vۻ2֫r~}]c\09 [H]-jF 0_ztFpV~;\kqʼx7zX'MI6YǟicT!G&r.r? J4!~ :!vУ_bBjFS||1fҜ!!ɦŰ˫]7XxX6'6]gl"7Z p!T isNe&9j^3tzݯq*s-HvtWtkH}Ƶz=F݇j4(Du@2(PxH(r-j]3% ϐ^eEN-&d%\w~ϳ殴O{]lcFi4f@"yOPH9؆}vp l]K1{97a;HAnD?52!ˀ~Nv%0g7 {^gͮ~Yer͑,dGqdw2ڑV .+,t6I;^9NTUnOWiH]5arME,oNHpV_,132H4Łϥܤ}~j? *;vfP8l▄ !Мy(I٩Mu$}Yn3p+&vPy<</ǦWJ߃:9KPi]o[VfwX=j\be9U.\[v8 ۾G;)*!ޙ\DKݚW.Fb4x^Bha ZY4zAs~23M j}]Nю?(7lH]0Ov˕tCo  =̶Ei:})A`tʻ|i  *+J޷MJD;^$ c7|O fm!Χ-A{@?$F2Vwy"#"3kh.WcjT{^UQIP50NDϼNPzgD܄2戴M0'vU0mP`FތJAMWBijTzK}&ND2,pk$359{{T6IxXm(cjw"I(\&b-m֔=dLgR¾-L֙d.H`tӜ*Yܒ9SpB0띧KaQL{ກOT |Dc(XV}~OL**& {Zd!Tw3Kܐ](pʨRUVfFْ&?s\gGM;tcUyӮz%L:fU56 oT8K&N-xvt9=ZdL*(>wAOԑe&N"M?IN-d̑&FN]{SB e4`El.|҄ϕ%Z͘-hS^k?e;(>Mr/vO\SMke]#'4ۂV1N[丕:˾/׼sdJV=.}V)8=O: lwSqgT͙ūॹ]\"%,nI*u*{OOqP)9eAf ?jgԘDѕIa}eti;.lj,x4TA N 'YޫzQaT $^˕υdLJy?{lHlEXxM27 @ulg]J\y2,KI:pfC;ndb*4)Z;Ԍ$x6?mc'XeqnwJboMmX3n qx R]S.`:X)bXxEIXK 9 jS5O0m2<0<| #c,ۥf>sS3"fŮqRMn|y"Xiʒ 5сrHX):[@186>&6w.>>pM?z۝|+J)y;#heWT1'hPfw~SHN'p-8Bzq8֡HEXT k7)9e9G;bAG0\]aeU&yگ/x5M 2zC[40Ĉ[6f\ $LGEg_*RM*N(#RQ ר+<"VdޕJ 3vJ鮞WA+Xq`CZ@:e%!|/&PH=UIw$2&UDzg=F_t_x銘jd6PP0ALH3Q)ҥbCHkSf1M?Q@iJ*15lMB|\ҍ+] Yiۭ/ɩ5 .āf|qΙu]gU ғz 0, >SB3EgIoC5n+'}c]JQ }ec9qUXxш}`fl\f%2,PhmUSUлbKylP/\oY lSN7maH}163'e8mѤ2u jt,<$ k>o 5/8 ȱ;(Qʺ"ݶ+d$DłBΒysQM$E3۝OFpÈNC"6+Sb)zF`)rv(~p턥5R/BYuޤ 0)/٣csl%QۈWx  P)e!.b*>qh^ ҲFʩBbyHA[6dIQcS˰ԏ[^Hps2@{O&j A{W* @4L='V9 a&n$&/=+þDiaKe|z> HU~4yߧ]1ԈvC)rCzͲP=4ɖ$EGxgRع[.)ubZ;Z^'y7 h9jJa3H(hA5i!&[~m9bZP@dAS1ujX=ȉ~=}4ԭT+i$R<7=5eD|RސBstReā (]@y UBIΛPHK/[<ai&N;EvN@ X}@Ӿ[FhO2uoIʣ%H9Z7m7O{x4Opq2s ο[9 &sL8ْj`sXVv_뺠Xuat1ȋfUb)KCԨ G2 ^%a=0KPM7C;nTLM&U#=4}TӀ$44p`eHy?m>,4 "lhυ@1ґ9$*) adH;$#}ǁdg@m7ϣ>Wd4LUϜ9 ~ tG(˙jt6+cU(lMLJ3{q]Kf>dީ@}S/]Yc@uϒe7YRv_.t|E 暵' om!6U# 0u<0h-cD{PWKgg9?:9{Ucrj/!Pjbj<(f$nuj_Eh}(J+eςA2{(бbփ py9b_GcdiTY/Q27QBuv!G+^I./ ` __'vڭ3m' vZ!skuk*yֲK52f!%ˮ׻ Q֝_[ $'G-O H1ep,Zmy.݄xXb\.&\Wp75)E F{h2 &jIY*u淌,d0#qCu5Q$pL5ȹꃪ\ 'eCW k8v hskɽGtFߋjwЏ~8N$[%frֻ00ϩ^><ec>LN ]P gei_sX\sk4ԒifU)/崡61Tj%15q*,jp(1Á^o@U$‘|Mi}P*k`(e$71tu)-c&F}-dCsEkg?07#wD7e!TR+=cHs{OS*i}tWROm<':žo+7ϻvKxލk[5=&Fn@6/xzYV`dI|[*6Sɚo(/` q T3AHg;.8x#jݝ~?qm>o`s6Xɭk}ODϺ9+&ڔ2K~e S Y>s4J|.p(wAc,R<;Y'ưuȓJ\[iK;dWBZ$(P.gDP.Fm#wA ? 妡$|`O:B⏇#3PT[k `bGf>a"ݺoa'-ON:7L!~=KMF`r@CUŲRCIB(S@뛧p,WEEbTj>`-Sr?d(CT.AjYyTwޣ ֢6 GN^Ep0o%{CAy $O"#˺86^(/KH T\  bB :;2GIzI]dHt)A]`ɰbL476^+Ӏ: M3dȱN]"2IW4iRj!2ܳmЀ0ϼ'OjB(XP6qDjbEEJVL_HP3mֶ5(I2Qb 讓lC"QdZʢHbvf`l{GxTN1BZikK\Z&S\!;ÏOOÚeMywfojJRˉ$&8gMNMj$( O{$]oiapk;q\O`XD"EDXQQN KK9RKhOospp$'yNkOL~(C}sӂ;mkp\DGƒ2ɔxdjqa1YjO$_v?yV&J+ܙ㯷 a@83/wt;~gX3ԁ ln|? d=/?k )X֌TԡӬktN"|a-nXڡI'FTfU/mp5m;L[=K@}z߉[{~9 #xRަ)>EKx (8AaVբz l@Pk$kԞܵ2}9ӧ5ܹfgGn )4Jq+e*uvUe4lz tT> (^8\NlkŔ^D D'CZi_g҈rΘ5{n.6SD$m ?RBB s@4ywB{z B/0&|paԨ1JÅV{ٚg&/"ׄRe 퇡$s.o i_K"HZ%E+QjgWGzMU>>y7yVr IeG:Ëu.W(ohO2,N%a֎D*1$PH=xjӎkv~s.a?"/O{ b"9 l#6ѬUeNIu,%nx0h T]}+smlń W , z$/!qj&4%KMIJ" 6, uhoώ*p4՟_boKGϢE:sӹC>/=#> W(Y.@j,30MV̍PL6H(.4JVe ,& cA,mQDg>B9rbeT0JÜ㧟dzl/e3"k m_JNUl A- T|ޥ3 (Kjv_PlVD%|hi0W]e}VIK-jb#f-bM\)gp[>dl3)׷ C~nT ´&SPLfl*]q"G9I}g͈P5%1{c5T'ሺ " tz!::V|IkrX6:+xAPc s4Z)8l4c*q|I/)F9 ΀RqImbca 2+-!'Eve>W ~SwطakGg$ MFM#:([}Q^e{ cH뼻S l9vfJ_uK$p*h"~,s=l!@*@w4Cc|v~`9~̐אf#W6} НCYT4L@fW VL2=l$I^YfIq+Uw{^_e)hw-r!2$dx^L{B1V՝bv;E \. &0RZZ!d{#<UPyA?7,DJydi$oˉvQ$r|5rƘ1TTltQ@oᖴ%Yέـ\#OȻmeM^SU<|ա_8ESaT~Rt‐eRig.ޥRw iևTm"H`9V;C YaT"Pc\f#j0OC,EIB*b0t5&< 4*7 ^(mu>4a(F^!]o4 yfGRd_r khm 8zz!pk6/M2Y[zL a ZTnIk7/6S(Y߸ 1QAK?8ti~6墾ݙZ3$"xsw ; ̟Ca:Op[ʦ}R |XU[rۅ\¤? Kّw 9>Fke|h:KhͰyْxYn[ RIefkhoJ{ܸv+i 5SRtYVGο*D~6w%)({oX:Fz}.jgPg7{4#^_в1f$w^&39:ہ]4V:_TԚ(Ēm={V2p,ͻ`Fxۼ{.!f @Xvr]PD}VJ>Ee}0sAO1(JS X&&!6,ÅC[r3BtT=ԗf.|!7 [ŌnOWʽ0C۸fa+sjhG72E/7MXA`!-_JK T/HaխS?i&%H1dÄ2*> endobj 178 0 obj << /Length1 2198 /Length2 12905 /Length3 0 /Length 14222 /Filter /FlateDecode >> stream xڍP[ c .&;`p-! Npw ݹs=9{aVwսzw?P(2$l!Ll̬1y55>++3++; b یBrt+@@m@4N l `qYYhMY;[ #M󿯀&t6>>?Dl@`-@@3v&`?o- {~WWWf;:F+bP9]@?61,NU @Gjl'mMAhr@dW_{`cfm< 41ںmf`k@QRamMZ;A]`k14ʁIe*oyN&`{,@,ak*fgc8Q8dm;_7kekj70ۚ!ٞE ;jBm3A\lfb=OfoO{;{TlCtGgE(llS ` 2ۢfAfa;c7}xZ~Y5$tROT `bpqx%GiU.7/OC7tA_yn(=ebsmo9eCW_t{lPaN\ }H>\aX8NhW v= LBߐ[r?khU 9 ?߄ 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+> endobj 180 0 obj << /Length1 1342 /Length2 1550 /Length3 0 /Length 2413 /Filter /FlateDecode >> stream xڍS TSgVhF"**(HJP"RvA"+/ y&y/d"` +[E Z*EPDJAD"Eb:/v朙s^{w~re@-qa6*l$ Q)B(Ғ([?r+,# UC )@ J1՞I]ϤPBqx dLE#|G T%C" &xwV(a(T(L29&&I$LdM1Ba9,@Kl$45p|* 1 C`T(Q>, Kat ; *t!H!T@a%)bD|-1<1C 4?9OHrk9e6|WL"Q}"yxUP,{k /+`R^nExAS6Xº U9$I1)4D89 L '5ER)DPLeH,ˏ (߻v\a| u#&{oi3M]q :с~Hλe@R `` {oDO+jzm7lp=) P%Х7kOElX[M#Ij òB5R7FߵX(x)0溣<]@2"Pp1Q-ñ:q2 x * @ڑ#j]:ˁa:KxJ u ñ0umLY\7q4Q ҳ1Ð>%я$:|N?~uV hoEL(/3M},[l }~:ʏ4yZx%f̹Sb裎55e/N =7Lגn`a}^r=+̥~뼗sHrܦ4KwK3ܥFRAO|"ZAe_dUX]ڊ+oʆ'RvhQܮcMzly=]m_.l[|%nΉ<"r;r+LuRNdMl1%3 IlGf3wδ֫87k=kSƽFgWYUj=?_jyZvc w{޽GH[ra"vs;n2\uΛ$i`NiTsɓ5Ua+<s5R.q&Iܶ``h싓7Yðzc F CGǜ όkG zaGIa|*eg%F ױSx*V<_s-47 4Ɣkm)#{l5-S|,4s^\#~e|>,8ek]~#)[?y(rѓ^iOsak R=g9?^"p]F,I@voOo]Ժјe;lwwƏ.E}5_Nt'x壁zZexKVe }d _\+0]rݹYR9ܷB?ioC͛&k4 mnޯ_ݾ|RA:wrOP8IIijsPtCWWdF}#I̫~4v|_-=k"e0X!/[p3-̵Wtlmu'_n&$ުsyMֆ[g%$hr[iyOc\Vh3h5>i(yuʖkߦwSBG7! ٗON ąփ?>20`f^'͌>#.%/Se6ُ8J=88s@_PP> w9.TY=XE:ϢS6#G;>ICSf/}7cKxkj*gv쭨v1MݝE'+^+61 acn eig~} By-9߳(J\ͱCo}ڍ6yCGtޡ)!3| kg<.Ɵ*, 6^>e endstream endobj 181 0 obj << /Type /FontDescriptor /FontName /JVQUOH+MSBM10 /Flags 4 /FontBBox [-55 -420 2343 920] /Ascent 464 /CapHeight 689 /Descent 0 /ItalicAngle 0 /StemV 40 /XHeight 463 /CharSet (/R/Z) /FontFile 180 0 R >> endobj 62 0 obj << /Type /Font /Subtype /Type1 /BaseFont /XTKGGS+CMBX10 /FontDescriptor 155 0 R /FirstChar 48 /LastChar 118 /Widths 149 0 R >> endobj 61 0 obj << /Type /Font /Subtype /Type1 /BaseFont /FPJPJI+CMBX12 /FontDescriptor 157 0 R /FirstChar 14 /LastChar 121 /Widths 150 0 R >> endobj 127 0 obj << /Type /Font /Subtype /Type1 /BaseFont /LBWBDW+CMEX10 /FontDescriptor 159 0 R /FirstChar 80 /LastChar 80 /Widths 132 0 R >> endobj 125 0 obj << /Type /Font /Subtype /Type1 /BaseFont /SYLDBT+CMMI10 /FontDescriptor 161 0 R /FirstChar 79 /LastChar 110 /Widths 134 0 R >> endobj 126 0 obj << /Type /Font /Subtype /Type1 /BaseFont /JZNSLW+CMMI7 /FontDescriptor 163 0 R /FirstChar 105 /LastChar 105 /Widths 133 0 R >> endobj 63 0 obj << /Type /Font /Subtype /Type1 /BaseFont /ZBKEQV+CMR10 /FontDescriptor 165 0 R /FirstChar 11 /LastChar 124 /Widths 148 0 R >> endobj 59 0 obj << /Type /Font /Subtype /Type1 /BaseFont /JHSOFG+CMR12 /FontDescriptor 167 0 R /FirstChar 48 /LastChar 117 /Widths 151 0 R >> endobj 57 0 obj << /Type /Font /Subtype /Type1 /BaseFont /VSJEBI+CMR17 /FontDescriptor 169 0 R /FirstChar 79 /LastChar 119 /Widths 153 0 R >> endobj 66 0 obj << /Type /Font /Subtype /Type1 /BaseFont /YMIDMA+CMSLTT10 /FontDescriptor 171 0 R /FirstChar 34 /LastChar 122 /Widths 145 0 R >> endobj 65 0 obj << /Type /Font /Subtype /Type1 /BaseFont /CPEOOR+CMTI10 /FontDescriptor 173 0 R /FirstChar 97 /LastChar 121 /Widths 146 0 R >> endobj 58 0 obj << /Type /Font /Subtype /Type1 /BaseFont /TBGVBZ+CMTI12 /FontDescriptor 175 0 R /FirstChar 97 /LastChar 118 /Widths 152 0 R >> endobj 74 0 obj << /Type /Font /Subtype /Type1 /BaseFont /SPEFGK+CMTT10 /FontDescriptor 177 0 R /FirstChar 34 /LastChar 122 /Widths 143 0 R >> endobj 67 0 obj << /Type /Font /Subtype /Type1 /BaseFont /UVXETZ+CMTT9 /FontDescriptor 179 0 R /FirstChar 36 /LastChar 121 /Widths 144 0 R >> endobj 64 0 obj << /Type /Font /Subtype /Type1 /BaseFont /JVQUOH+MSBM10 /FontDescriptor 181 0 R /FirstChar 82 /LastChar 90 /Widths 147 0 R >> endobj 68 0 obj << /Type /Pages /Count 6 /Parent 182 0 R /Kids [42 0 R 71 0 R 78 0 R 91 0 R 96 0 R 108 0 R] >> endobj 116 0 obj << /Type /Pages /Count 4 /Parent 182 0 R /Kids [112 0 R 118 0 R 122 0 R 129 0 R] >> endobj 182 0 obj << /Type /Pages /Count 10 /Kids [68 0 R 116 0 R] >> endobj 183 0 obj << /Type /Outlines /First 3 0 R /Last 39 0 R /Count 10 >> endobj 39 0 obj << /Title 40 0 R /A 37 0 R /Parent 183 0 R /Prev 23 0 R >> endobj 35 0 obj << /Title 36 0 R /A 33 0 R /Parent 23 0 R /Prev 31 0 R >> endobj 31 0 obj << /Title 32 0 R /A 29 0 R /Parent 23 0 R /Prev 27 0 R /Next 35 0 R >> endobj 27 0 obj << /Title 28 0 R /A 25 0 R /Parent 23 0 R /Next 31 0 R >> endobj 23 0 obj << /Title 24 0 R /A 21 0 R /Parent 183 0 R /Prev 19 0 R /Next 39 0 R /First 27 0 R /Last 35 0 R /Count 3 >> endobj 19 0 obj << /Title 20 0 R /A 17 0 R /Parent 183 0 R /Prev 7 0 R /Next 23 0 R >> endobj 15 0 obj << /Title 16 0 R /A 13 0 R /Parent 7 0 R /Prev 11 0 R >> endobj 11 0 obj << /Title 12 0 R /A 9 0 R /Parent 7 0 R /Next 15 0 R >> endobj 7 0 obj << /Title 8 0 R /A 5 0 R /Parent 183 0 R /Prev 3 0 R /Next 19 0 R /First 11 0 R /Last 15 0 R /Count 2 >> endobj 3 0 obj << /Title 4 0 R /A 1 0 R /Parent 183 0 R /Next 7 0 R >> endobj 184 0 obj << /Names [(Doc-Start) 56 0 R (Item.1) 75 0 R (Item.2) 76 0 R (figure.1) 81 0 R (figure.2) 94 0 R (page.1) 55 0 R] /Limits [(Doc-Start) (page.1)] >> endobj 185 0 obj << /Names [(page.10) 131 0 R (page.2) 73 0 R (page.3) 80 0 R (page.4) 93 0 R (page.5) 98 0 R (page.6) 110 0 R] /Limits [(page.10) (page.6)] >> endobj 186 0 obj << /Names [(page.7) 114 0 R (page.8) 120 0 R (page.9) 124 0 R (section*.1) 60 0 R (section.1) 2 0 R (section.2) 6 0 R] /Limits [(page.7) (section.2)] >> endobj 187 0 obj << /Names [(section.3) 18 0 R (section.4) 22 0 R (section.5) 38 0 R (subsection.2.1) 10 0 R (subsection.2.2) 14 0 R (subsection.4.1) 26 0 R] /Limits [(section.3) (subsection.4.1)] >> endobj 188 0 obj << /Names [(subsection.4.2) 30 0 R (subsection.4.3) 34 0 R] /Limits [(subsection.4.2) (subsection.4.3)] >> endobj 189 0 obj << /Kids [184 0 R 185 0 R 186 0 R 187 0 R 188 0 R] /Limits [(Doc-Start) (subsection.4.3)] >> endobj 190 0 obj << /Dests 189 0 R >> endobj 191 0 obj << /Type /Catalog /Pages 182 0 R /Outlines 183 0 R /Names 190 0 R /PageMode/UseOutlines /OpenAction 41 0 R >> endobj 192 0 obj << /Author()/Title()/Subject()/Creator(LaTeX with hyperref package)/Producer(pdfTeX-1.40.14)/Keywords() /CreationDate (D:20150827100840+02'00') /ModDate (D:20150827100840+02'00') /Trapped /False /PTEX.Fullbanner (This is pdfTeX, Version 3.1415926-2.5-1.40.14 (TeX Live 2013/Debian) kpathsea version 6.1.1) >> endobj xref 0 193 0000000000 65535 f 0000000015 00000 n 0000004452 00000 n 0000209461 00000 n 0000000060 00000 n 0000000092 00000 n 0000006758 00000 n 0000209341 00000 n 0000000137 00000 n 0000000182 00000 n 0000012893 00000 n 0000209269 00000 n 0000000232 00000 n 0000000276 00000 n 0000015590 00000 n 0000209196 00000 n 0000000327 00000 n 0000000404 00000 n 0000026505 00000 n 0000209109 00000 n 0000000450 00000 n 0000000506 00000 n 0000031321 00000 n 0000208985 00000 n 0000000552 00000 n 0000000596 00000 n 0000031382 00000 n 0000208911 00000 n 0000000647 00000 n 0000000693 00000 n 0000031443 00000 n 0000208824 00000 n 0000000744 00000 n 0000000777 00000 n 0000034341 00000 n 0000208750 00000 n 0000000828 00000 n 0000000868 00000 n 0000034402 00000 n 0000208675 00000 n 0000000914 00000 n 0000000954 00000 n 0000002550 00000 n 0000002747 00000 n 0000002898 00000 n 0000003049 00000 n 0000003203 00000 n 0000003358 00000 n 0000003509 00000 n 0000003658 00000 n 0000003813 00000 n 0000003967 00000 n 0000004122 00000 n 0000004511 00000 n 0000001003 00000 n 0000004272 00000 n 0000004332 00000 n 0000207319 00000 n 0000207749 00000 n 0000207177 00000 n 0000004392 00000 n 0000206461 00000 n 0000206318 00000 n 0000207035 00000 n 0000208177 00000 n 0000207606 00000 n 0000207461 00000 n 0000208035 00000 n 0000208319 00000 n 0000008660 00000 n 0000006936 00000 n 0000006583 00000 n 0000004688 00000 n 0000006698 00000 n 0000207892 00000 n 0000006817 00000 n 0000006877 00000 n 0000012953 00000 n 0000008545 00000 n 0000007065 00000 n 0000012773 00000 n 0000012833 00000 n 0000009474 00000 n 0000009617 00000 n 0000009701 00000 n 0000009799 00000 n 0000009834 00000 n 0000010076 00000 n 0000015380 00000 n 0000017239 00000 n 0000015650 00000 n 0000015246 00000 n 0000013121 00000 n 0000015530 00000 n 0000021663 00000 n 0000021723 00000 n 0000017124 00000 n 0000015779 00000 n 0000021603 00000 n 0000035635 00000 n 0000018276 00000 n 0000018420 00000 n 0000018520 00000 n 0000018625 00000 n 0000018662 00000 n 0000018905 00000 n 0000026286 00000 n 0000023783 00000 n 0000023603 00000 n 0000021867 00000 n 0000023721 00000 n 0000026566 00000 n 0000026147 00000 n 0000023901 00000 n 0000026443 00000 n 0000035066 00000 n 0000208430 00000 n 0000028773 00000 n 0000028592 00000 n 0000026721 00000 n 0000028711 00000 n 0000031503 00000 n 0000031140 00000 n 0000028879 00000 n 0000031259 00000 n 0000206747 00000 n 0000206891 00000 n 0000206604 00000 n 0000034463 00000 n 0000034160 00000 n 0000031671 00000 n 0000034279 00000 n 0000034582 00000 n 0000034608 00000 n 0000034633 00000 n 0000034836 00000 n 0000035315 00000 n 0000035341 00000 n 0000035404 00000 n 0000035441 00000 n 0000035882 00000 n 0000035908 00000 n 0000035969 00000 n 0000036005 00000 n 0000036380 00000 n 0000036743 00000 n 0000037118 00000 n 0000037273 00000 n 0000037345 00000 n 0000037977 00000 n 0000038388 00000 n 0000039017 00000 n 0000039403 00000 n 0000039512 00000 n 0000039777 00000 n 0000054215 00000 n 0000054520 00000 n 0000068233 00000 n 0000068551 00000 n 0000075560 00000 n 0000075790 00000 n 0000083648 00000 n 0000083876 00000 n 0000091096 00000 n 0000091316 00000 n 0000113925 00000 n 0000114379 00000 n 0000124470 00000 n 0000124732 00000 n 0000134503 00000 n 0000134749 00000 n 0000151142 00000 n 0000151626 00000 n 0000162997 00000 n 0000163251 00000 n 0000171738 00000 n 0000171976 00000 n 0000188399 00000 n 0000188806 00000 n 0000203149 00000 n 0000203566 00000 n 0000206099 00000 n 0000208531 00000 n 0000208600 00000 n 0000209532 00000 n 0000209698 00000 n 0000209858 00000 n 0000210028 00000 n 0000210228 00000 n 0000210352 00000 n 0000210462 00000 n 0000210500 00000 n 0000210627 00000 n trailer << /Size 193 /Root 191 0 R /Info 192 0 R /ID [ ] >> startxref 210953 %%EOF intervals/inst/doc/intervals_overview.Rnw0000644000175100001440000003421312567542610020461 0ustar hornikusers@ \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/inst/doc/intervals_overview.R0000644000175100001440000001106412567542610020113 0ustar hornikusers### 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" ) intervals/tests/0000755000175100001440000000000011754252126013446 5ustar hornikusersintervals/tests/intervals_test_code.R0000644000175100001440000000404411754252126017633 0ustar hornikuserslibrary( "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/0000755000175100001440000000000012567542610013076 5ustar hornikusersintervals/src/Endpoint.cpp0000644000175100001440000000422112567542610015361 0ustar hornikusers#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/which_nearest.cpp0000644000175100001440000001620012567542610016424 0ustar hornikusers#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/src/reduce.cpp0000644000175100001440000000461612567542610015060 0ustar hornikusers#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/plot_overlap.cpp0000644000175100001440000000403012567542610016305 0ustar hornikusers#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/Endpoint.h0000644000175100001440000000266512567542610015040 0ustar hornikusers#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/NAMESPACE0000644000175100001440000000227412546723714013536 0ustar hornikusers######## 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/NEWS0000644000175100001440000000505511754252126013010 0ustar hornikusers ******** 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/data/0000755000175100001440000000000011754252126013215 5ustar hornikusersintervals/data/sgd.rdata0000755000175100001440000050530311754252126015020 0ustar hornikuserslM4[*$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#> 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/show-methods.R0000644000175100001440000000140211754252126015246 0ustar hornikuserssetMethod( "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/interval_included-methods.R0000644000175100001440000000541311754252126017767 0ustar hornikuserssetGeneric( "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_overlap-methods.R0000644000175100001440000000217211754252126017647 0ustar hornikuserssetGeneric( "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/interval_complement-methods.R0000644000175100001440000000365411754252126020350 0ustar hornikuserssetGeneric( "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/as.matrix.R0000644000175100001440000000023612115741735014540 0ustar hornikusers# S3 methods as.matrix.Intervals_virtual <- function( x, ... ) as( x, "matrix" ) setMethod( "as.matrix", "Intervals_virtual", as.matrix.Intervals_virtual ) intervals/R/c.R0000644000175100001440000000537712115731737013070 0ustar hornikusers# 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/R/distance_to_nearest-methods.R0000644000175100001440000000072711754252126020314 0ustar hornikuserssetGeneric( "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/interval_intersection-methods.R0000644000175100001440000000274611754252126020714 0ustar hornikuserssetGeneric( "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/which_nearest-methods.R0000644000175100001440000000671311754252126017123 0ustar hornikuserssetGeneric( "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/head-methods.R0000644000175100001440000000103411754252126015170 0ustar hornikuserssetGeneric( "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/plot.Intervals_virtual.R0000644000175100001440000000457212116125217017323 0ustar hornikusersplot.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/Intervals-class.R0000644000175100001440000003015111754252126015702 0ustar hornikusers# 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 ) || 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/expand-methods.R0000644000175100001440000000422211754252126015550 0ustar hornikusers# 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.R0000644000175100001440000000303511754252126015543 0ustar hornikuserssetGeneric( "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/interval_difference-methods.R0000644000175100001440000000117611754252126020274 0ustar hornikuserssetGeneric( "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/t-methods.R0000644000175100001440000000025411754252126014535 0ustar hornikuserssetGeneric( "t", function(x) standardGeneric( "t" ) ) setMethod( "t", signature( "Intervals_virtual" ), function(x) t( x@.Data ) ) intervals/R/split.R0000644000175100001440000000036112115741463013762 0ustar hornikusers# 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/empty-methods.R0000644000175100001440000000216411754252126015432 0ustar hornikuserssetGeneric( "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/type-methods.R0000644000175100001440000000141111754252126015247 0ustar hornikuserssetGeneric( "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/interval_union-methods.R0000644000175100001440000000201411754252126017322 0ustar hornikuserssetGeneric( "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/close_intervals-methods.R0000644000175100001440000000436711754252126017477 0ustar hornikuserssetGeneric( "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/size-methods.R0000644000175100001440000000245111754252126015245 0ustar hornikusers# 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/is.na-methods.R0000644000175100001440000000022011754252126015273 0ustar hornikuserssetMethod( "is.na", signature( x = "Intervals_virtual" ), function(x) is.na( x[,1] ) | is.na( x[,2] ) ) intervals/vignettes/0000755000175100001440000000000012567542610014317 5ustar hornikusersintervals/vignettes/intervals_overview.Rnw0000644000175100001440000003421311754252126020744 0ustar hornikusers@ \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/README.md0000644000175100001440000000023312542077565013571 0ustar hornikusersintervals ========= [![Build Status](https://travis-ci.org/edzer/intervals.png?branch=master)](https://travis-ci.org/edzer/intervals) R package intervals intervals/MD50000644000175100001440000000712012567545302012620 0ustar hornikusersa74894e575795e85a5653f34ba4422c2 *DESCRIPTION c6e176fe4cd6683b2d365f8eb34ac7aa *NAMESPACE 395419ebcf2325cd51382cf869b7ce5c *NEWS 5d3f4dfbcb8c9119dd1562ccbc412467 *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 60793fb2d261c953e3439bcc2a604cd3 *README.md b7e37f83b50853dfd3204cd25ed5718d *build/vignette.rds 92331b5a7c5d0c6c690134be22d279fd *data/sgd.rdata a2f1dae28510f0ca5a3cb5089741ff79 *inst/doc/intervals_overview.R 61b77aed42f5d4a9517527dfd20dcd9f *inst/doc/intervals_overview.Rnw cc027c079cdfa5acb1690a5f30e6e615 *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 0800a00a632882b9723a3df5d80d3160 *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 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/build/0000755000175100001440000000000012567542610013406 5ustar hornikusersintervals/build/vignette.rds0000644000175100001440000000033712567542610015750 0ustar hornikusersb```b`fbb`b2 1# '+I-*K)/22ST)CJ2R S0 % M6ہ&$=yh楀aM wjey~L6̜T!%ps QY_/( @hrNb1GRKҊAOintervals/DESCRIPTION0000755000175100001440000000105312567545302014020 0ustar hornikusersPackage: intervals Version: 0.15.1 Date: 2015-06-21 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: 2015-08-27 08:08:40 UTC; edzer Repository: CRAN Date/Publication: 2015-08-27 10:30:58 intervals/man/0000755000175100001440000000000012116125361013050 5ustar hornikusersintervals/man/interval_difference-methods.Rd0000644000175100001440000000176711754252126021020 0ustar hornikusers\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/interval_union-methods.Rd0000644000175100001440000000320011754252126020036 0ustar hornikusers\name{interval_union} \alias{interval_union} \alias{interval_union,Intervals_virtual-method} \alias{interval_union,missing-method} \title{Compute the union of intervals in one or more interval matrices} \description{ Compute the union of intervals in one or more interval matrices. The intervals contained in a single interval matrix object need not, in general, be disjoint; \code{interval_union}, however, always returns a matrix with sorted, disjoint intervals. } \usage{ \S4method{interval_union}{Intervals_virtual}(x, ..., check_valid = TRUE) \S4method{interval_union}{missing}(x, ..., check_valid = TRUE) } \arguments{ \item{x}{ An \code{"Intervals"} or \code{"Intervals_full"} object.} \item{\dots}{ Optionally, additional objects which can be combined with \code{x}. See \code{\link{c.Intervals}} for details on mixing different types of objects. } \item{check_valid}{ Should \code{\link{validObject}} be called before passing to compiled code? Also see \code{\link{interval_overlap}}. } } \details{ All supplied objects are combined using \code{\link[=c.Intervals]{c}} and then then passed to \code{\link{reduce}}. The \code{missing} method is only to permit use of \code{\link{do.call}} with named list, since no named element will typically match \code{x}. } \value{ A single object of appropriate class, compactly representing the union of all intervals in \code{x}, and optionally, in \code{...} as well. For class \code{"Intervals"}, the result will have the same \code{closed} values as \code{x}. } \seealso{ See \code{\link{reduce}}, which is used to produce the results. }intervals/man/interval_intersection-methods.Rd0000644000175100001440000000216611754252126021426 0ustar hornikusers\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_included-methods.Rd0000644000175100001440000000670511754252126020512 0ustar hornikusers\name{interval_included} \alias{interval_included} \alias{interval_included,Intervals,Intervals-method} \alias{interval_included,Intervals_full,Intervals_full-method} \title{Assess inclusion of one set of intervals with respect to another} \description{ Determine which intervals in the one set are completely included in the intervals of a second set. } \usage{ \S4method{interval_included}{Intervals,Intervals}(from, to, check_valid = TRUE) \S4method{interval_included}{Intervals_full,Intervals_full}(from, to, check_valid = TRUE) } \arguments{ \item{from}{ An \code{"Intervals"} or \code{"Intervals_full"} object, or a vector of class \code{"numeric"}. } \item{to}{ An \code{"Intervals"} or \code{"Intervals_full"} object, or a vector of class \code{"numeric"}. } \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.) } } \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) are completely included within each interval in \code{from}. A list element of length 0 indicates no included elements. Note that empty \code{to} elements are not included in anything, and empty \code{from} elements do not include anything. } \seealso{ See \code{\link{interval_overlap}} for partial overlaps -- i.e., at at least a point. } \examples{ # Note that 'from' and 'to' contain valid but empty intervals. to <- Intervals( matrix( c( 2, 6, 2, 8, 2, 9, 4, 4, 6, 8 ), 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)] from to interval_included(from, to) closed(to) <- TRUE to interval_included(from, to) # Intervals_full F <- FALSE T <- TRUE to <- Intervals_full( rep( c(2,8), c(4,4) ), closed = matrix( c(F,F,T,T,F,T,F,T), ncol = 2 ), type = "R" ) type( from ) <- "R" from <- as( from, "Intervals_full" ) from to interval_included(from, to) # Testing B <- 1000 x1 <- rexp( B, 1/1000 ) s1 <- runif( B, max=5 ) x2 <- rexp( B, 1/1000 ) s2 <- runif( B, max=3 ) from <- Intervals_full( cbind( x1, x1 + s1 ) ) to <- Intervals_full( cbind( x2, x2 + s2 ) ) ii <- interval_included( from, to ) ii_match <- which( sapply( ii, length ) > 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/c.Intervals.Rd0000644000175100001440000000333211754252126015537 0ustar hornikusers\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/Intervals_virtual_or_numeric-class.Rd0000644000175100001440000000122411754252126022407 0ustar hornikusers\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/interval_complement-methods.Rd0000644000175100001440000000203411754252126021055 0ustar hornikusers\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/intervals-package.Rd0000644000175100001440000000573112115732374016754 0ustar hornikusers\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/as.matrix.Intervals.Rd0000644000175100001440000000111212115732452017212 0ustar hornikusers\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/clusters-methods.Rd0000644000175100001440000000574511754252126016666 0ustar hornikusers\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/distance_to_nearest-methods.Rd0000644000175100001440000000277411754252126021036 0ustar hornikusers\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/man/sgd.Rd0000644000175100001440000000530011754252126014121 0ustar hornikusers\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/which_nearest-methods.Rd0000644000175100001440000000604511754252126017637 0ustar hornikusers\name{which_nearest} \alias{which_nearest} \alias{which_nearest,numeric,Intervals_virtual-method} \alias{which_nearest,Intervals_virtual,Intervals_virtual-method} \alias{which_nearest,Intervals_virtual,numeric-method} \alias{which_nearest,numeric,numeric-method} \title{Identify nearest member(s) in a set of intervals} \description{ For each point or interval in the \code{from} argument, identify the nearest member or members (in case of ties) of the interval set in the \code{to} argument. } \usage{ \S4method{which_nearest}{numeric,Intervals_virtual}(from, to, check_valid = TRUE) \S4method{which_nearest}{Intervals_virtual,numeric}(from, to, check_valid = TRUE) \S4method{which_nearest}{Intervals_virtual,Intervals_virtual}(from, to, check_valid = TRUE) \S4method{which_nearest}{numeric,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 data frame with three columns: \code{distance_to_nearest}, \code{which_nearest}, and \code{which_overlap}. The last two are actually lists, since there may be zero, one, or more nearest/overlapping intervals in the \code{to} object for any given interval in \code{from}. Empty intervals in \code{to}, or intervals with \code{NA} endpoints, produce a \code{NA} distance result, and no nearest or overlapping hits. } \note{ (v. 0.11.0) The code used for the \code{distance_to_nearest} column here is completely distinct from that used for the original \code{\link{distance_to_nearest}} function. For the moment, they will co-exist for testing purposes, but this function's code will eventually replace the older code. Note that a naive way of implementing \code{which_nearest} would be to use the simpler, old implementation of \code{distance_to_nearest}, use \code{expand} to grow all intervals by the correspnoding amount, and then use \code{interval_overlap} to identify target. This approach, however, will miss a small fraction of targets due to floating point issues. } \examples{ # Point to interval. Empty rows, or those with NA endpoints, do not # generate hits. Note that distance_to_nearest can be 0 but without # overlap, depending on endpoint closure. to <- Intervals_full( c(-1,0,NA,5,-1,3,10,Inf) ) closed(to)[1,] <- FALSE closed(to)[2,2] <- FALSE from <- c( NA, -3:5 ) to cbind( from, which_nearest( from, to ) ) # Completely empty to object which_nearest( from, to[1,] ) # Interval to interval from <- Intervals( c(-Inf,-Inf,3.5,-1,1,4) ) from which_nearest( from, to ) # Checking behavior with ties from <- Intervals_full( c(2,2,4,4,3,3,5,5) ) closed( from )[2:3,] <- FALSE to <- Intervals_full( c(0,0,6,6,1,1,7,8) ) closed( to )[2:3,] <- FALSE from to which_nearest( from, to ) from <- Intervals_full( c(1,3,6,2,4,7) ) to <- Intervals_full( c(4,4,5,5) ) closed( to )[1,] <- FALSE from to which_nearest( from, to ) } intervals/man/expand-methods.Rd0000644000175100001440000000554011754252126016272 0ustar hornikusers\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/empty-methods.Rd0000644000175100001440000000324611754252126016152 0ustar hornikusers\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/size-methods.Rd0000644000175100001440000000302711754252126015763 0ustar hornikusers\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/reduce-methods.Rd0000644000175100001440000000234511754252126016262 0ustar hornikusers\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/plot.Intervals.Rd0000644000175100001440000000711412116125361016266 0ustar hornikusers\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/split.Intervals_virtual.Rd0000644000175100001440000000175012115734353020217 0ustar hornikusers\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/Intervals-class.Rd0000644000175100001440000001601311754252126016421 0ustar hornikusers\name{Intervals-class} \docType{class} \alias{Intervals} \alias{Intervals_full} \alias{Intervals-class} \alias{Intervals_full-class} \alias{[,Intervals-method} \alias{[,Intervals_full-method} \alias{[<-,Intervals,ANY,missing,Intervals_virtual-method} \alias{[<-,Intervals_full,ANY,missing,Intervals_virtual-method} \alias{closed<-} \alias{closed<-,Intervals-method} \alias{closed<-,Intervals_full-method} \alias{coerce,Intervals,Intervals_full-method} \alias{coerce,Intervals_full,Intervals-method} \alias{initialize,Intervals-method} \alias{initialize,Intervals_full-method} \title{Classes "Intervals" and "Intervals_full"} \description{ \code{"Intervals"} objects are two-column matrices which represent sets, possibly non-disjoint and in no particular order, of intervals on either the integers or the real line. All intervals in each object have the same endpoint closure pattern. \code{"Intervals_full"} objects are similar, but permit interval-by-interval endpoint closure specification. } \section{Objects from the Class}{ Objects can be created by calls of the form \code{new("Intervals", \dots)}, or better, by using the constructor functions \code{\link{Intervals}(\dots)} and \code{\link{Intervals_full}(\dots)}. } \section{Slots}{ \describe{ \item{\code{.Data}:}{See \code{"\linkS4class{Intervals_virtual}"}.} \item{\code{closed}:}{ For \code{"Intervals"} objects, a two-element logical vector. For \code{"Intervals_full"} objects, a two-column logical matrix with the same dimensions as \code{.Data}. If omitted in a \code{new} call, the \code{closed} slot will be initialized to an object of appropriate type and size, with all entries \code{TRUE}. If \code{closed} is a vector of length 1, or a vector of length 2 for the \code{"Intervals_full"} class, an appropriate object will be made by reusing the supplied values row-wise. See the example below. } \item{\code{type}:}{See \code{"\linkS4class{Intervals_virtual}"}.} } } \section{Extends}{ Class \code{"\linkS4class{Intervals_virtual}"}, directly. Class \code{"\linkS4class{matrix}"}, by class \code{"Intervals_virtual"}, distance 2. Class \code{"\linkS4class{array}"}, by class \code{"Intervals_virtual"}, distance 3. Class \code{"\linkS4class{structure}"}, by class \code{"Intervals_virtual"}, distance 4. Class \code{"\linkS4class{vector}"}, by class \code{"Intervals_virtual"}, distance 5, with explicit coerce. } \seealso{ See \code{"\linkS4class{Intervals_virtual}"}. } \section{S3 methods}{ As of R 2.8.1, it still does not seem possible to write S4 methods for \code{rbind} or \code{c}. To concatenate sets of intervals into a single sets, the S3 methods \code{\link{c.Intervals}} and \code{\link{c.Intervals_full}} are provided. While \code{rbind} might seem more natural, its S3 dispatch is non-standard and it could not be used. Both methods are documented separately. } \section{S4 methods}{ \describe{ \item{[}{\code{ signature(x = "Intervals")} } \item{[}{\code{ signature(x = "Intervals_full")} } \item{[<-}{\code{ signature(x = "Intervals", i = "ANY", j = "missing", value = "Intervals_virtual")} } \item{[<-}{\code{ signature(x = "Intervals_full", i = "ANY", j = "missing", value = "Intervals_virtual")} } \item{adjust\_closure}{\code{ signature(x = "Intervals")} } \item{adjust\_closure}{\code{ signature(x = "Intervals_full")} } \item{closed<-}{\code{ signature(x = "Intervals")} } \item{closed<-}{\code{ signature(x = "Intervals_full")} } \item{coerce}{\code{ signature(from = "Intervals", to = "Intervals_full")} } \item{coerce}{\code{ signature(from = "Intervals_full", to = "Intervals")} } \item{empty}{\code{ signature(x = "Intervals")} } \item{empty}{\code{ signature(x = "Intervals_full")} } \item{initialize}{\code{ signature(.Object = "Intervals")} } \item{initialize}{\code{ signature(.Object = "Intervals_full")} } \item{size}{\code{ signature(x = "Intervals")} } \item{size}{\code{ signature(x = "Intervals_full")} } % \item{\code{[}:}{ % When used to subset rows, class is preserved; when used to subset % columns, the \code{closed} and \code{type} slots are discarded and % an appropriately subset version of \code{.Data} is returned. See % example below. % } % % \item{\code{closed<-}:}{ % Replacement accessor for \code{closed} slot. See the example % below. See description of the \code{closed} slot above for details % on how one- or two-element logical vectors are interpreted. % } % % \item{\code{coerce}:}{ % Coercion methods are provided for converting back and forth % between \code{"Intervals"} and \code{"Intervals_full"} % objects. See example below. An error will be generated when % attemption to down-class a \code{"Intervals_full"} object which % does not have the same closure settings for every interval. % % A coercion method is also provided for pretty character strings. % } } } \note{ We do not currently permit an integer data type for the endpoints matrix, even when \code{type == "Z"}, because this creates complications when taking complements -- which is most easily handled through the use of \code{-Inf} and \code{Inf}. This is particularly awkward for objects of class \code{"Intervals"}, since current endpoint closure settings may not permit inclusion of the minimal/maximal integer. This issue may be addressed, however, in future updates. (We do, however, check that endpoints are congruent to 0 mod 1 when \code{type == "Z"}.) When creating object, non-matrix endpoint sources will be converted to a two-column matrix, for convenience. Recycling is supported for the \code{closed} slot when creating new objects. } \section{Warning}{ Validity checking takes place when, for example, using the \code{type<-} replacement accessor: if one attempts to set type to \code{"Z"} but the endpoint matrix contains non-integer values, an error is generated. Because accessors are not used for the endpoint matrix itself, though, it is possible to create invalid \code{"Z"} objects by setting endpoints to inappropriate values. } \examples{ # The "Intervals" class i <- Intervals( matrix( c(1,2, 3,5, 4,6, 8,9 ), byrow = TRUE, ncol = 2 ), closed = c( TRUE, TRUE ), type = "Z" ) # Row subsetting preserves class. Column subsetting causes coercion to # "matrix" class. i i[1:2,] i[,1:2] # Full endpoint control j <- as( i, "Intervals_full" ) closed(j)[ 3:4, 2 ] <- FALSE closed(j)[ 4, 1 ] <- FALSE j # Rownames may be used rownames(j) <- c( "apple", "banana", "cherry", "date" ) j # Assignment preserves class, coercing if necessary j[2:3] <- i[1:2,] j } \keyword{classes} intervals/man/interval_overlap-methods.Rd0000644000175100001440000000721511754252126020370 0ustar hornikusers\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{ Asses 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_virtual-class.Rd0000644000175100001440000000710111754252126020165 0ustar hornikusers\name{Intervals_virtual-class} \docType{class} \alias{Intervals_virtual-class} \alias{closed} \alias{closed,Intervals_virtual-method} \alias{closed,Intervals_virtual-method} \alias{coerce,Intervals_virtual,character-method} \alias{head,Intervals_virtual-method} \alias{initialize,Intervals_virtual-method} \alias{is.na,Intervals_virtual-method} \alias{show,Intervals_virtual-method} \alias{t,Intervals_virtual-method} \alias{tail,Intervals_virtual-method} \alias{type} \alias{type,Intervals_virtual-method} \alias{type<-} \alias{type<-,Intervals_virtual-method} \title{Class "Intervals_virtual"} \description{ A virtual class from which the \code{"Intervals"} and \code{"Intervals_full"} classes derive. } \section{Slots}{ \describe{ \item{\code{.Data}:}{ Object of class \code{"matrix"}. A two-column, numeric (see below) format is required. For a valid object, no value in the first column may exceed its partner in the second column. (Note that this \emph{does} permit empty interval rows, when both endpoints are of equal value and not both closed.) Only integral (though not \code{"integer"} class) endpoints are permitted if \code{type} is \code{"Z"}. See the note on this point in documentation for \code{"\linkS4class{Intervals}"}. } \item{\code{type}:}{ Object of class \code{"character"}. A one-element character vector with either \code{"Z"} or \code{"R"} is required. } } } \section{Extends}{ Class \code{"\linkS4class{matrix}"}, from data part. Class \code{"\linkS4class{array}"}, by class "matrix", distance 2. Class \code{"\linkS4class{structure}"}, by class "matrix", distance 3. Class \code{"\linkS4class{vector}"}, by class "matrix", distance 4, with explicit coerce. } \section{Methods}{ \describe{ \item{close\_intervals}{ \code{signature(x = "Intervals_virtual")} } \item{closed}{ \code{signature(x = "Intervals_virtual")} } \item{clusters}{ \code{signature(x = "Intervals_virtual")} } \item{coerce}{ \code{signature(from = "Intervals_virtual", to = "character")} } \item{contract}{ \code{signature(x = "Intervals_virtual")} } \item{expand}{ \code{signature(x = "Intervals_virtual")} } \item{head}{ \code{signature(x = "Intervals_virtual")} } \item{initialize}{ \code{signature(.Object = "Intervals_virtual")} } \item{interval\_complement}{ \code{signature(x = "Intervals_virtual")} } \item{interval\_difference}{ \code{signature(x = "Intervals_virtual", y = "Intervals_virtual")} } \item{interval\_intersection}{ \code{signature(x = "Intervals_virtual")} } \item{interval\_union}{ \code{signature(x = "Intervals_virtual")} } \item{is.na}{ \code{signature(x = "Intervals_virtual")} } \item{open\_intervals}{ \code{signature(x = "Intervals_virtual")} } \item{reduce}{ \code{signature(x = "Intervals_virtual")} } \item{show}{ \code{signature(object = "Intervals_virtual")} } \item{t}{ \code{signature(x = "Intervals_virtual")} } \item{tail}{ \code{signature(x = "Intervals_virtual")} } \item{type}{ \code{signature(x = "Intervals_virtual")} } \item{type<-}{ \code{signature(x = "Intervals_virtual")} } \item{which\_nearest}{ \code{signature(from = "numeric", to = "Intervals_virtual")} } \item{which\_nearest}{ \code{signature(from = "Intervals_virtual", to = "numeric")} } \item{which\_nearest}{ \code{signature(from = "Intervals_virtual", to = "Intervals_virtual")} } } } \seealso{ See the \code{"\linkS4class{Intervals}"} and \code{"\linkS4class{Intervals_full}"} classes. } \keyword{classes} intervals/man/close_intervals-methods.Rd0000644000175100001440000000456311754252126020213 0ustar hornikusers\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) }