fields/0000755000176200001440000000000014467505347011537 5ustar liggesusersfields/NAMESPACE0000644000176200001440000000412314407206762012747 0ustar liggesusersexportPattern("^[^\\.]") importFrom("grDevices", "chull", "col2rgb", "colors", "palette", "rgb", "trans3d") importFrom("graphics", "abline", "arrows", "axis", "box", "boxplot", "contour", "hist", "lines", "locator", "matlines", "matplot", "mtext", "pairs", "par", "persp", "plot", "points", "polygon", "rect", "segments", "text", "title") importFrom("stats", "D", "approx", "coef", "cor", "dist", "fft", "mad", "median", "optim", "optimize", "predict", "quantile", "rnorm", "sd", "var","qchisq","pnorm") importFrom("utils", "object.size") importFrom("maps","map") importFrom("viridisLite","viridis") importFrom("stats", "qnorm") importFrom("stats", "lsfit") S3method("[",spatialDesign) S3method(coef, Krig) S3method(fitted, Krig) S3method(image, plot) S3method(image, smooth) S3method(print, Krig) S3method(print, mKrig) S3method(print,spatialDesign) S3method(print,spatialProcess) S3method(print,sreg) S3method(print,qsreg) S3method(print,summary.Krig) S3method(print,summarySpatialDesign) S3method(print,mKrigSummary) S3method(print,spatialProcessSummary) S3method(print,summary.sreg) S3method(summary,Krig) S3method(summary,sreg) S3method(summary,ncdf) S3method(summary,qsreg) S3method(summary,spatialDesign) S3method(summary,spatialProcess) S3method(summary,mKrig) S3method(plot,Krig) S3method(plot,spatialProcess) S3method(plot,surface) S3method(plot,spatialDesign) S3method(plot,sreg) S3method(plot,qsreg) S3method(plot,vgram.matrix) S3method(plot,vgram) S3method(surface,Krig) S3method(surface,mKrig) S3method(surface,default) S3method(predict,fastTps) S3method(predict,interp.surface) S3method(predict,Krig) S3method(predict,mKrig) S3method(predict,qsreg) S3method(predict,sreg) S3method(predict,surface) S3method(predict,surface.default) S3method(predict,Tps) S3method(predictSE,Krig) S3method(predictSE,mKrig) S3method(predictSurface,default) S3method(predictSurface,fastTps) S3method(predictSurface,Krig) S3method(predictSurface,mKrig) S3method(predictSurfaceSE,default) useDynLib(fields,.registration=TRUE) import("spam", "methods") fields/LICENSE.note0000644000176200001440000000100313754255070013473 0ustar liggesusersAll R code and documentation in this package (fields) is licensed under the terms of the GPL license. NOTE: The sparse matrix methods used in fields are supported by the package spam. The spam package contains some FORTRAN routines where some licensing issues are unclear. Please refer to the spam license information for details. Note that many functions in fields e.g. Tps, Krig, all the graphical functions, function indepedently of the spam package so much of fields will be functional under a GPL license. fields/data/0000755000176200001440000000000014260313037012430 5ustar liggesusersfields/data/datalist0000644000176200001440000000053614260313037014164 0ustar liggesusersCO2: CO2 CO2.true COmonthlyMet: CO.Grid CO.elev CO.elevGrid CO.id CO.loc CO.names CO.ppt CO.ppt.MAM CO.ppt.MAM.climate CO.tmax CO.tmax.MAM CO.tmax.MAM.climate CO.tmean.MAM.climate CO.tmin CO.tmin.MAM CO.tmin.MAM.climate CO.years NorthAmericanRainfall PRISMelevation RCMexample RMelevation US.dat WorldBankCO2 lennon ozone2 rat.diet world.dat glacier fields/data/CO2.rda0000644000176200001440000157131413754255070013530 0ustar liggesusers7zXZi"6!X煯])TW"nRʟX\qjnj-&Z@6ca4ߢyZM@s0+@ eY8|E&-}14TzrkQuLț8竧 sԬ(Nc銤(6rjQdۯg_W`=3,TUwjfbFha}!Y:<ѝT5vfW 5C2\x dqyVҬ-O:CeV5ekE[3W,k]7 ſd;JH] ({P7$ߢ:M]iJ_biϩ@!:8F dbQ'ĥtl;[8G,FC]Sِ6'ԷQ9UHGh'-RLI9K(7kڕ!*,9|UwJO5ke>>8AC;yCvL~B נU=C1,+ <=[1# * ƑR`"Դ֣2XRdC Лp:q@sJHoyUKy4Q,wJj(ۢl#[?tMǚ7ȡ/|tq,|Kap8> ݙ:Ņd!3NI%z!a^U`(<1|nuD TH Z(E/y!N H>Q &$7Wzl;dRc6dekO.ONFZ}ޠ`joF,|[ z89[ 8kv8.[ߚX>hQ pU.IlƲ2YK;B-./9nv VqfnZuh0꼁u#5:0j{X)$,d2JDmVl*M[9D~E.s6xt ;\?&PΚ|.,լ59~.gk1lBM7By; y Wg>]YyZ ^>L\j݊#S8Mn9Ǧ%͵(߲ώ2'[AVRތTYc){Wh8m_S& .vok3+ KV*q;h֪冟`b_M MDg*vs=!n1SPאۃ`9XeAemLvP)ZȽ5«:ڑlxCShuŋ,1=MXxco0ź<2Ԗ>dC{&4 (گ._/*8o1`:p Tij@-#PCY޷3ճҳ 6uw$2\* $qwlGG%Gxf>(,0}Xu7]X cG2XOhyg372о:è*<%g$qb$tvP5:vC{:-~gn )E`ÎΧĀP_!'F7Um ŵ~+uz``Uccdڮ @FnөߕJ$,y]j\bָ:kKm<)9 6RUuZFu4T#lewHWc)~?DZ꒫ >ƧR2:D~7F ?vۗ3S$+ss)~.DTGM\+4AwFeMpXbS[@?Bq"@2u yĺ!mz& SGכ. y=.E}p9KzJCJkdV~`",+(%f`>\Ave(c{=DΚu4r K.uvsMkݍ/2\ע2D} ?x' Wg!=0 q;^uJ@3QZ5 =eM?S yGbhDt4Z2KFDVJ*\EULy͓ (iL'u"paj͸ː Ν[zu^M3zԌ{c׉>tP,d|TKUw1C ,[Iaأm)#Swj)NT*`?˂-<44bDKRU&W <%CgSٚ$X3:}p guΆ{SIW?6K\ {"x70&E5:Rg5zI'u|t3Qeg-O~z'7C4ɚ0I^L#si 0\""d︈s {; ¶;ƐNA BMFRJmHGGG`vTMWa ҩu M݅2W=́4!>5Seoo?25=g ʌOq1l̾]Z9OWD>e74ؐM\L 3q-}ש[^X 3q'ɩ$Ue=A =IdZǢkB~q8z6a:/z%_|Y VSGy{CZD֛=]w5!Iޕo6VI:5K[\i\֐4J4e ܲ0`k%lz~ƓJesR >U{/:Zh=P,q4 (iH,@ Sk4m= (T>1p H}h^ֺ+o!rt*+oj$~ ʹt wRg؉rVu nv@;WXx?IaTEٺ.-T $iΚ}^<2оAwp1b[mGm˃㸾$\s,P oJml%W ֿIHĦs:[8;i`v60ڏk&,gyUwtiHtq# Oy-'B*3K(lPo|a2EStW*Ē|a;WZG)8'Y.#NYoz/T-7(?$Y*W#c}d ޴pD@7 n-2ȑףH]m*IY.0Ua%ʨb !%`Ԉz"'3՝=NPw6&Vo}.uTn^ ۻO)ukB#Jյgkm?cB80ΨPJjMψ!Rl#b'X?xfka4ұqK؞u_Qiأ[]2q{%[|Ii(n7ᶈ<:Z䘼/FZb֖^]L֕u%:&*lj^hOcTɻw"є&-MȟU4YIc0{UlzMZ8B~t,`=C&tXP]G#oy`=<;mճ:ǯύ1;w_n` y{fAz hZ#t͝<&z3ΧN DUUQ>\=bw|FI{bnK?mٯfBZU彎kRLc{nx (sY >NXӞfCؒ-g&wL|uA#'-Lަnk*f&j*?zӀ/gSX={=95V߃L-*QqgWWZD63[)m?u&H`֞)f6'R9;E@W7AT$E|&Rzd nUw6ovLіqp7W'Uz+W;1:p1?)MAi)INb<4Y-eE:-dCB -{KPOyiRlwɹvĻ\U12^< 0VOAa0;ߧl?,r0*ؚKCr.@[c->@$~< 8MZ2_ŵs0A9D3Ȥ:sH!pȣKŴJ&AMNMr2`2A*(g:[ɶIW~$Ց2l &hzoL!~؎ex{Kzu[;L񞮤'{rܞWTAJzԱPqu'uh_LƗzJFߟțZzM7 15JWeSL6?I0,9@,gC[ua] nx *aV瑱]uBۍdFj$^ijt^j}b8j'-^85;V*+/m$'TdT:k0+hѶBsS":&2@O9wJ/ڻ 3^4 WZxQՈ]ݰU]~^F,bɉkUDdFyP<|)|U6&d뒾FDm^o{Z&,(<( !KH"Ru{{ wQ{B5 nۺ`^\TئCMw&L ^Ca+zu% 2H͇oV]%>5s>CK\_Ty&>PHFa`+Vat\XVB-ɳ ]굨|htg7~&\!}BvIʝ9 αJgi*| NwRQJQݍtHeRTZV'GȢ;DY)ud@'j2*S,.p>/(s'"t2d 萒?É8%͋otX[>=Dqwk83X -<{/-CLWM׎;AVMp?[+TJ!K" |]uzO2Z+I3dZ9[bA᥏+[V@ȭ2Tsz?&f{Z18zu'Bd'SH\)xxcht嗸őa!H'tc`BINHl왬j̍]]Q)#PWx_K^rm.E'ʄ!Qtz Ty}t3/ g KcvgRn%k6@@yDj Rqz.V DZlm\@ QPGgt8I7ҕWr'C^C8y]@s r"H'әD`Ȏ9q %ew~TdNG[0^c' [.lΐ,ʻ8E6a"nTF[DbD*] 9"Wab_ ^lgq K:.2nnQzO#e\5蜷\px;,YR:Mm(:R1K_vY$ ϛ7AYOqv+y^C3׏Sw}%L,Ǚ!G , gW;Lt$wxt#V3Ft,gxG;2'h*(S \rG֧z}:j2JsBivI̮.c jʱ-9Zi-rgVG9~'.?ndW-4R[qyGjhR *x'X}Зb{b006|[ʀH_xʟc1|UYnDb\!Nl@n57|Q#9B!$z9Q4H]X+fGuT1R 5ö{L3B-Mms s%S1CY훾IG &WMʴlpJ揥q*\}'tM% z^k2JCHM-2'dz~Yz0K37$UJ49I!׋N,z12^ `32~vW14NĝƼשrurh4`2`x7s3_}VX7&$)U1d>ؾk@ܴAKf(~R e 4hh!j*Cn6K%jguj6RD U]M|f9L"MO7YmXAʺ/4Uĺ\Z5YIr=[!XHϖC_4GVjR‚k\9vē'*Pv3)^mR+ 9v 0eg|^| "`ܻXujY?MzΥ5KsBj)TlHGeZAн ަUS6WiEGGm_ӟ9r&XG 0F|>e0!kc~{Jqp.MH{ἶ:\'h*9.宗o8W9Ap%`?DI:ƻYOPj>YG&߇xDgey CkbjV1< Ma(bZ&Gq,uiFR+ 9O$q7LFf7BU&8axGHӆ!dO!+"byUFPzp7OMǸI5ɱ+L.a5TY!潅yb^x DXĎSZ^}O'cDB^A{XHP' +ӣ}":YFUIp_\pd4YnC,i&35CBEl+LHTϘ.sK ">qa1Bձ8dIū\D,V3>?}w@N٫f<ӭ/QVFW`ŭZT0E$}q4׾Q4 E(sMݎޗ:Yl]1N%7אZRjN`4Q_Q2yKx'qoAć] qK72cXNGN^[< *`Рvr%Yy66A6'BΜTb9H}dܟA!qۏ-Ul %(>7nv2eN;9MtDJz\= @F3mܧfˡ;NT5 D`8!1S}&̗9B˓Is˚ C@)H_Rru%TnPPV8k;׃ ڄٶ u:#"rƤotak 8U#Þvb ("ٽSD0z4yMͨ̄iO^~Cuv :3#XTW4&PoP\MC'D,幡&g5xmܯ,忱ӭ$jn4ZO5̎D8y% $&Ooޝ?Y]T67c+%Z vo,վJ)MZbϋA6(zak1xـqD]f20>DeJ}p#nTYԀ-' QXfNiXcCub5n hd;{3a4iFg_rmR?L$ s^6gւU ^>gs7(}꫃ D+iݦNѦ_&G |[Z^ZQo^aOrؖy;ّ|_, 2zP?]UȹvڋWOt(Z|u&WPfzlq<=\H9di9WB:wjCmr+F8^D b/y *6Լp;qB\O hXą`iKV]GJL;739x J IxF"o>SMq^I`+|3c3aF͑+DF|xIg 3' 1pzphe I1rK3g,<1 lkwxd{0Htu< ,)Y'ߐw /Dl xߵJ 'S{)eBn/g'lEZvp@Mę]@ ournƎ7GP&c!Qﺘr%^q>7 pŨ844=U_tS-k$' 9V`g킒"{YK<~;4 @VP@<,*tl8uMkg^H{g{bY(rwsYpN!dyab2 ո*^dGI$o&1s(n7Τmz2Lͷ#6r3>d1,lԸ1jySA$ZlB!FiMI-IѢM*ʒ 9Sȇ02ajxZ)v:kfҾNZt)זf@)*#i󸊂Ozg4bG5}Ei.f X2nt{ Qtɤ頴.kh:cw< L¾g:1To1p5j~_Ǖ*%*of`cd9@fq-1WEPMv} &\_ Qb#[m6C5/',gG),!B<|KLv?f'lf4dlE]"1|GQ5Ad-kc$;,1Zm NeuB⟔eԛT!̓bKf찁2 㿥c}6j香u˹]ROkExL~;F'r-*2K6[IH?@q3g?i7ZsD)N5fkp3&4F$$]=+Rq~)u(l!a1d };DؕgXy9&E=xFV4Cs( 3-Y?a!:`2ZAd) w Gfa} vuœŔď &x"(^٧rܢy*2/]%SŕeA J(,ko9,NݮAȪ$hU,&6cS-?ZS$td-z**4>r^;ti*N[hx?ľ;k$D> % qI4ĤZs q6(bq-_W<ǟaOMQ_-'vy˂}Cڃ|hwťq!4Q߂>̺1zA3^dqcQwwLkQ0xU)8$+8Sۮӳ]zlv["<@Lu[2$s)("$PB@ı?ًU@#46^\w>9Okvr{i7u椥B4T+>5f7*'$n@ )7l @r}bƿ5rɦ`c;F;MTm~!&١m'bIYvR/>|l.SW60yy'ZKJDaCiks'_M\r=Pϒ:诬K{C6?LupA%qɱ\=v9E =d (Ǵ2ŤUc@@aAnC$!rR;# Da汱 jf+o%I*lK9@3Ps2j݋!Q@eGPХg 8[FFNd_""˜1+~Y Ajz9 af`c92WX[,d ◓_<#[V>|ڷu+)gvv{d 7, vJ")N##bD!ٗP{"h I;bU?X{KJY %_s;b f 5⡍s(V^m t8%I,hPH9aH纕9QnӐ5$Ex~"-}_?+oޜ >qKG1QCA£| G]&^r1a kE::tlgiɸ`T6*£(`DN@/ɡ`l xg,v"޸P-V!}ۧ|&apчs4@؟gErė8wd.>A'5䳈ǧc4'ۻV38MnS,ߥXCOs٠b^&ղGR(SRz=~0ːX{!6׵zxU2rcJ{پ# qSM65A J bOLge)w"4ng0G UJ`TW{RCL˴z֧I* Μ(7R\yŭo7y,I0yD>/߯PHnH-SY] 1v|x;Q_ 08(X` U]G- k>6%=uHGxނ:,5s4nɇ^,%pzF\={|ZW4hߖڳ_u3^ j1 1s!5->JN^2U?pn0ϨQOi~nw?Oiz8dCƵ^Ŋf@pN.54ݻv߰&b%KkK^F,3X"J2#g7v|XyQPלϤ3|W՗^&a3^RՎ LLZx7̓gZzi?w܉- gcz%V-3iY9X&jL&or;<gbXŻRiY[X-zkYSedxfМUx^?Xiy&*IK^J嗪 3ş,bDм fbC NDlq P=f\$=kNӟ^vjjpģ+@~oS2Oj:=~~;:%.G dTk8ӈ, Hw2;ӠA° _*/A<Ә< 6gh+Lx>dz2GloN]790i邅?H~.nM3]1静< Gn_+(&82 xyTR^ m-:B.d-068ARqA \vz)"[7J-R~wceׇ)hu%c${oXŐSsɔnpa—1ZwH+[i>}u,O\ӝ<oM{%%ug4K8ΠV5Yq_8AJd?mt @dQ8ֈmb U L {15Oqj"~fP5HX7.xT}G( `L@ \ҷW-ԎL nJrU }QӗSуu'rkZ1q4LݠRT~.b 868G8 ϞH8뚜,)9H!j#sa^>//̦ԿykpDT7=<3W:\R]|b[R~+NP#T2 i)+@n_O )jKC%K%sASzy#{>,zA!iE8j𝑝gn@o"Xl} 8/{P2BQLQHCP( qDGA{bxlQ3Qhx,)J2Y \B^>6 +dOaӭ?ջrj襳\_꧆@)KGo |=3Z '/Ԕ:U ВV"!EPiԄxTC ms"a 0cuGaFR+<0 w0Y޼xazбv !2|-񯳢7S`׌Gebָ~;$bf{"Eu8%MNiw Ա#sj\(m,YUÒP1_s7޼&cP><?O(3w$}0`={hopC).]s5 2E!5iӊ \s0 5&7A7 H@)+q래ru~Ew0w@Ѹ՜4:}g[Wl*6o5_5T@ Kǃ ྨ/!'bוmUq59ؗ hӞKxeBS<ϙ?~^l=6B<CV%m m8ɖҲUgPj4g_t#V/o-HW'}%G=~KfFN&ΛNfxAxe"xJtlT"d˴2-p|~>Q9\$ U<:SGVGGa:Yo: tlfe7(De*?&"&|V8]sf+UH ϶8kکEʉ]Hη@!@ VvIbn/6`qoSs5_I,"ehbb݋6f^oh?ఓ+eW2瘷/1d1ϫ[|9FJJL.nH@Zh$54іޡXm]/Mȫ[ 8Ej]I;S8B9lZz> ~O .Ѣʝ41G ox^Q_<)|8WJA%zT/b{f .2ǛڍG`hD02xNz݂V1<7NmPdĢiLe!Xh*<:Rwr_cNgZ'Dۉn:\{&T̽zִxg 58rs#klݓ'{YFnWf$iQmmAkl,r']UfuN)!E5-8RnV>/~/Vbɂ \5ѕVvFb o'#,-/ȃF߫P[_-Tn8X .Vf(k]x_ƅ2D1<%^]Uh d,"B3ȼc *=@:uy%OqNFBr%"y |m?Ix K\B- Fy\cB% D֋NKyFD`ꕩ$D%o+ýb!4iuQ֍u*g[}^)/#wYX.Clrc6/2+Q;!.H|_HIEl>x"B.ט0U^pҠaczPkR7"w=-JZ3LG!( d@{yzTftܟX#kthmA$XpZ+h3xWcar+s#+6R1"5f2HұC'LT$g)cg ԙBf TnW'#FYs6Xag645ֹ7z#-5 辍D6}rt mg#I DnUuAQI㐊O;\!ԟ\$%L1YAz:ORᵰ9` 7D!\Y*R*${ 2Ȁ+!6 8&Rhʺkr6(uJү $u ?b@Ļ+r[>ROXqt']T$.LPsLqƶS]-?H ACV+>xW:ѾycU H? jl*C6יծC8a ˋ8<?*>ΫbΠ[+D0ɟqrIA ?-[IoH{5fɼU?p%FXOl֩}-f[_16 0k.H{{HZ~gq=xт}uSѬıDL0is@-9-^?spH~S!GFA28a&.]lŽ'mVL#Xe?z,U-~q>R+v61~%)ޯ.YwHXunZf펋n;kf#TVH߯I{rS6<PjeDCkBD\,׮ru9jwmGzY `f;GA26U=ON͋UVP$6$[ܿ( 䥒Gy`=3 ' g}OXP]i''6*Jǀ{SwBk[Et c˵pS,`[&yz4"7a:xtX_-0$$12DGikڮ靛lQW~{b=핶^mSWy,9Po$P!Ay:[-'y~y{ziqC2 >[¹.Z~x:eݣj w+19%VqS7~сyMϐם<\Rİ$>z8s`leXC*M[][NKK9˘lcbRMx 47t= Y'J:1R*PM9 A _nCR@ոf\¾_z${;~obM։ ً~$_RuWJZT`STg~5lf.w [&\RQ1{%Ɓ_)*/&héiEh7S1Gd}Ba g{wY;dYwK>d3ck}]gTzc$_ F $`e<63cQN!rn?3ck_<2}QrrϝD|uh&91I??Ðh576 -gx~+C4e,b8|l)hx͠ڢr5&-@9ZКW !*f 렸\ f79b1g ^\O\k ;ypzM~&,$qQ)F|tR4H&sZYP;1g18Q+iMDvl.bNGvsod5H)>MWY|]"#j*bC}c. Shf 9ň?Vkg|hIL뭁0,Fz, tO*W+%ži멊 ոuSw"ԃ3c`yțC ^3;C*:fApo=vHGC"y$\!ep qt#D(b6-Wo$&'ؘ;"ǎCx/Π9!d\W6p K(gw2jxY jT0ѻd s+֋ $J"d Xq>ȫ'|o>%EwP|M_5Y]hQ/ZppśikW^dΊ_tc뺏J:+)঩[5tIiD#w_X:\Ȁ*BC!.v0l2ǰZt2~%Obn90ZAy*EN :nB́G݇OIb?gTie H%g}o*XZmV!fB =-FYVfI >D8DUqjSN8JsOgX!g!} *yMޢ\ſ-hm\Lo<=Z# [x/D8TSj|bۯ!rl.fB;:ýXbWbvfvY#J}{g^AA_!ulDcHaڐ5^uZK%a![yp1Z䆰*E0$rd Xc>$9@,Q,6j7@)d2WMFcl?z0MyikJvg{27Lok&!OgnvM>k?ϰ! }CH:yp+ysVǢ1CुCG{2pe&ħ`8vfn{# ;6 KQ渘p?-sI,{jN~ {շc!î߾L$2f2q`ˋƕH\[:A%ܡ>+6kН8wJ\ˏAn4U:Q'VE'q>pE ̉aWFM=20v)E68$\ן4޻8Lm0Zq rϚ @H!c2m_>bF <c%rwk hBRdel+S|)i8؀i }LrZ鈍o{/eՠ85@l8Iaz&mϣ @zޞ)5)2ٿ m5n/DvA)-c3KMO$Fta{ u`2mʑ""rSRgH=K.Ci-Pmr֕Due&t$A7 fȋ'wXl+ze5S^nB|`+ub1v0uQ@5w0 #N3aKͺɹ.]<+߲ҖtTR ń5C9{KH4XTV{$%=duvy'g c P>?\}P,`B\#9!z?}qok%7:$0JftC]Oxߟ O'<.@T0׋`e.7*s]H1Йuw1[|0f]/'f kĄ>?(J[|%7bd!qQIJk;K@3m~`Mx aR٩P2hu@Q LSu DG>A3t\TQ?TEb9x4-_ϯHL0G|ޯưwib/LaY\iS7;`Z ƞEV'zkDIJ{#U2It)r+?cuGk myBp.<3\d5Ǡ|ؠHMb4V.}?4ĸ)K5LKXrK 0Q*mfS6GK.7ۚ fAOD|OOX?z^,;u2'{WE/İJ2R)] OCfeGQ:Kp&sΏK+u6cg_g51[yBZO]Oobd\\Ǜf<řbSjC@f0cŒӥ1Z`UvXYN>(6kSTY}pLwb!k ~% 634%ڿ>:,H t-#`W~]Wr僨r@+ [IhAgO*x=sFgb5C77xW_τw_Jח:%B23McAO',ٌ퓡_S48!r|!_|z3=%~Gj_ֲgt+ fj[65wܒW")F\LzHZ݂z)AҰT){+ةB-@4.Qʠơ Ϸ?x="vL׮cϛ{OP ↷ (jwVdc 5:m[sY]K|9RCJV|Ѣ2yԡt>9A3@J(SE+O4XDwOg dPOj2wϢyw@$`FS,zgGB4#+GÝv-w%ZgGo,k#¡.&<ֳ˄g/ϔd"9>oQw܉ se P='4a12L޳_T/z`Z31"|!@ϧ*jAŦ3R۳׎tNNlnM̔iTN;[8$T[?wCb Occ] A ?A60w x[hYe8Gua\5q6jǎřg0 ϨWνp/狀юفM ̱VƔU ?p2D)aX0㶗 rdJvaJ7S`w"4FHvF?u^˞r=/Fq:2";[9fHi* 4v-#=jΐ_x%~ǻO )P^[iٝHt+FȪ{*݂$, >HdAʅB4]كZ~dz|ڻC[Btq8?%REs{fLk<,,?LW{]IpPa- EixN+~ > ;^i\#Ab 'ok/=)3+xkϞϐ9oeXyk]6O]ozTZ{88@T}m8QE *iX毾jv{ Z%^|!DL*}2:Z"j8ZגR<rS4YgK5kc[|i,Ƈ ?"9OT-H_\p52uLiduLL;N7YXnvFEg6"wKA2=:X6|VNU;< ң8|e1jIuEI՘H[dvI啗^KwW=?Pw /0s RW?]! = Rv1:j SCYSw7 lJE{S=E\vK~D4=IߗZ =Uh fNd{LS x7|hγĎ6w"[eB$$Ob*,h:0-6kix^dTo]rc.|Î2 ]hR)9ǔ0:;xrkznަLIL)I-7L-l(hi1L)5..eJ*ԇpiy ՙ 2/b. ;WaB%ߓ–Iߴp6B˿ y©;i`+ExKV9av9p . h}#P !(ك+t,ZlXz] EU))N!vk}|!/G$LachJD?jjǑ\$ru*{ʏjM聒"+dLNeFީpN"2޴rԼ*K~?"dIc`$|mH8eeNlH"b.-( hۂz 8;!q2Ҍߴ˪4 !{WZh $M7@O?np=ȃpby4UDcw0i42ļ G@*tV]1E1B0A:爕߈qc|reTdH'PiQQ;u=Ps!Z3[@đ}+Ug+bm\|G Ky57oо zX8ƾ_NZUzqO !+gdKbuE{i&N1J#5Zn5~=@<]\`4a( 1YC4}`l]dTv~a~*:h ok/f#&Phl6s0p8J?V!t,ZzTRaySEKg@ub'KXEU(m@9 I,19(Q% ҸA%W_"tџc.ѕO֢`2C!&N}]ZFXnR;R0*]F[ ZTr- f ֏Sv/S6IpQ&/l?,pd}Tf!U;Zy-*HxqjL#SRlH˽G ;7}LL^YV,u VpL .G.ZW[/5A'<o$j6wT7{KKgh~ߚ,HsJxm,N^q1a7ze BY}m r߂YfY<7إ:/VSdz2/(~L+ azTGt2<GR;SAt lwT!4W{% l$мb [1\ǎIK@(LF=Ent=Ck}bxRG!qKIv1 %|'| 30^ -y}C M-R@5R h;=@%qygSH Ǽ6m~9l-fx6i=MB*VDuY>=3,Aa]e徟@mx|qc*HdY{XNWk/赃M\BJc7_E5‹V{ W Ʀх+-:Uq$!]C0@"v^sp8 F)1r__1!v7bRj썂Z_oHX<ܕ>6,^} f)!B& 7-_]|l8dͭ0ads*FYQHȒ+}+oYlEUǠRiD)nLqejx#lo>hNWf\rTJ uݲ4$jsdH8",l\%kzqC$~1dd; TlZcC"HSsTw/Gaa:xWX4:IZZ8XxF95 ;>kd .QhQSy7t6t`xAPpj:~5>} h츪 p]9g |_ *Q43ijҢZÍZG~c̵vwv鰹UG$ W#4!|#g6_Vl(hb#P7S$0͔4NHGap:% /̝pw&;<7%pRgqwXJ{P "|*! ơDc/}D{Тq_B|SǼ45:fELQҹ_ l',0q4yO`$:{ *:(9͎M y[3 ^|GA:ႝs#8gGf]ZE[l2euh&CNxRi&ąnGt0,]%BWG!!5u3RF lo)\LxUias8/i~zq-$2b|} vSa&8PIU",>Np[ Qؚdj"XJ}*[p1Y h9~mndrml>CgH>^k(eKeybRtcbRӔk14E| Fp.uޔ:`,wiYت k\dWMM|%Q]O<%Yr@ӆʥ7DQ@Yt}؋PqUIsC$Q(r5. +P#geU*"xiݧDn%j>j)'%3_ /_ڹ_5ґBIZ48X%Z+D1[`knArW9S&-3id^m NS@W}'٤σ?+x F( :SCzDw= 5-քfuŤ&ulU0<Ѽj;TSX 8fvhaњ^H`ZIWk*4bI0 XJ6` Qj +I-x$[۶*CX梁RkӾۤj.@ې@?j$a`wפx@RP3DNO%$> [qAuf_z;d[7_ꄓ#I%?n;w澏$ȼho6w Hݰ%=Kq~*]*N)ALl3+ưȔOn]/É yhVVYE#uT_%/GOQW\3gVMF}%OxխHZSB߬ 90X=Ast!s_XK!֭rh|][7apEyYZ{ #ݶvkuo:aa/'I0xEBo[e Bc[{pmJ{ZP,4|) /iy[h9s뻻|k ʱg]ڽOt+?OD鴀pf=٨O> v<~jEy7584URZdghQqzF7ӣT>"HWw>B9wv}ؙy8_Q4z2U)4V>(h'̢MCJ部RoD8\1׭{s8o|Zč\Kف]>]+Vt]yQ:5-#k{6{di&́^#鱰ƚGhr2c,IfU5%mź!u###eD+5B3(іnX0cGx oEJ;wW~FȄ(n.9Z hqd=m8;Td:0T=vfv`o^BVRi-v!VDG;SM[LUx!BL.'zVM=YV/րèƠB2L4{Y7pJf{j| $Gt]!YP~Vџx>^PX 6 2LYwI3^G+dEb0W,3!~7D2f7j!l}$t%cttm2AzJB^[iyOM.E v4}%f~Y+ٻYf^oxZՄDG&4lfc[No٭2:V,+6lpkoy$`d<0.D.wz2G\&[d+NhqPOWA9 2m= ifh$y"1LNlz_,Lj:]P2-LS SMUj^E:aN*jWUno(M55Wf l9ӦW|vJ;LOg]Ё% o6i& lRUUvX ,jx:e`C)A::$Qb^%[.?s{J'Y~D hs[f{*-4ݶt5=SD%i{"UL^Ӂ:AaBZgcNݡB@U@eah g'*c-?~}.sGrh孾djOʤ&jOV4k0#r0ĞNhZ7]9w|Dd-})3*4k]]͵#_ZX6\\td[kl]qGɫHWbunqȪG7Gb<gU~7PsfHr-9~ \ 6X_T.Gv'!H A#ٍxm-ncrqK%"jI"u f""ݰ^T(Jg+F:OL텉cZ H: T$nĚ^K$v,m` \4Mӄ F7pwVDٿB\Lʡ'-6e*``4?>bCXY~s P5JaaeTMy:y3Qv o;jSt0DZIMKva1=n"UMROdM-th`~B1be %S.cr ֣75k[cș>0_wYDl;]Юzrkdcŷ/IT;iZ}Gwܼwe5Kh3чUYWy#am7qn0CV@s-+ Zw5m+좛eJrar\CR2ͮAPҿO?W洹W;%i/uV¹A2Ej&LSkU3c?(ӈaN`eTª+QIĤ" )UC8[M2e iQ \9ac lvv<604}Ar3P%TE]AF*CmubףBx)ϲ&J %cq*?]7^O 0=I,{n4oj(*uEX(yiqFv2؝4FyA4l voݜ6ཀصt;NB?ʸ-׳Y`hΣ72DrEҸ,"SlJ6/+4Z;6foV\ޏTw4u,wǍbI߻"/<7Z՚/gidzz֜waz5Yc6/g_c.ʧA%/ܣMy,plBRes94Kx :x`Lff4 膮!Vw@,Ν DYxL(Tz./>RVmj3iYc:>c'emSZ{/ݺBqY+gf$CX\3.epoЬ%Wa N2_ۗ1(^!޹KY vbiOTLTT\ĝX :-='vVYtWkq GQ5ñJHw2P4t,^)/Y[g|`}0D.7c: Q9ՆvdnLr&Φ|K3{CVEaV_o" >v'f$VRrQ5ZۀQO(͏PZxiL >,*jc_`9fe 8rY9F@F,5ݍ0J[G}6D[=rRsį@/"#s+]7(&M&6Ƥu .RapHG/Ӌ)e̐-Q@R2٫XsUu%;^d ?M2Vl"AdJ[ջ넬*dUN&*tVCy.[GV9`\*zYZ9zxټ;"KG('Z ͡4I 4rACDZǭ*y1t>kIEB,]E8UioL=)n;2zp9钳h*<[J/D혓>}}ԌT|/ZޞV"$iSDOPǦrbp.ˎz%OM1ט(?xM>Yٕr z]:HfL>>܌s凂؀e-n]ߔWJ*д^|>꼔})UC>/)0-`35Y/u.ڿk '}nt"_ $|^:㳾4 jJ GW qHCN=(U GiQf(AK*6$%݈  :ژh}\0ov|y@nfM.Af8dn>x}ZDĄ& ӯڑ+JA)4Y SK3|&5)xX@cvA:p5t3tI+ؚ(LS4umV:GUڼcK{Ja:)Pf/Pֿ&xBOrJ@|Vfg] ˙޾xe?O1Q~zѿM<˓0IvֲR2i=c"NI|S{48)w!Ӻ]S.@N}*:ey86mHa2jIurˉ.(O84JbfaÇ}_]劧Om25n6_"Nl ;--_/K-_"}1r5,X 8ӟ*6AGk$'*H8Ȋ&XiViI&sܲiUGfne sNL;j!;H^9Bv3ݛE]{NKs莜Ŏt uѭ fVU T$4RdKKmڷ/5G3'`msIOoiy`Y͒O 4-LLJv4!V_v[86ǻ-+ ejGpm2w|h@يo\Ɵ`gvd}' 8kDl,>Ӻ/N[1A.1Ǫ,z,:_fXIn&Ըۗ=$g" K(ۚrg#n)_C܄a Oi1^Lv[zLIt $DD fԪ˦di\ 8hj6"V0U ieGQr-x$h3]:y}VT 0LSΐѪa}=.ba|JK*~fFWJ[MicVzE\4]pnoѼ+G̢aj,ԟ:UplN*"%H,i\ٔ UMgAg'BkS wn[M)I[sy`<˴ /28a(Ďx4[W.%<*m{iK=jܢN  W_zqV qO(n XZF^yL-yoT"_C纖1Q#Hp ;:m (Ѓ.FL`Sꇝ`hsg @< Z THݦT \,]u@H_ԧ h:WV&H_GwTPMTHTsmk*KGf q)hKS DƤc4pS4qT8}E_9Z;zs&ٳ8q?=C.}Ies'M$ܫAz0aq&VDO2#ΦDpx'=;AB%@``MFZ&@7JSx]Lp+@5"Epcmy5n$9pHXFDaD~A2xK摪 Լ½vFPȿ 3ue72]'_K Q;Ѳ i2;IwDJ:Y^.ZdHobU `QaQN:2!nrәvt?bȨ.6|M ֢\V@sB+74>>#"PH[<0,+c +[ͰPd{"D0q)W/Qq'Ʉ QkIOh:fR^o4/礔9\2zs9Yf/ MeDF6W/u7tY\Z8!br*$ZVzӷwDK)Vls| o:EB_?o/^,PԎKrك LHcu1s̴"JB-=C#[56m'hXYdch4zh Q4W; +0SޗxN-D|r'VEI\V)٠Ԯ'՟ߒ n6VAպ"צּLi-f j(e9@ /_#MK!;9^߾ qJ :G6Jv'(%@8R$ f 1S}7X&Xfa~.0 Dw`Ofb$p}zNG.{H-kKo@ɧ@p`q#)R;n'7"^Iq=ͥrb?cb[Fn 0!#'ѩaJ4%CD P'FgT#A`V$gU9h5[DF# NLX DcMkvo+(+Y] B`/+d'>xi@+0ri8'?z2QD:\Ȼ $P7} Oei1'[57a(+7Ն;rho2YL12})blpM2zYQfw:s0ҵkCԂGfE`٘G:IyT6 |r͉mc\{$쏭xM ̩V֐* k% t=#/pm1(Q(oni7ROpQ;28)I =. ؂ Vkp0d^bp`qoBɎ77BJpiAl9Mh7[2L~LiyƖz_n\q2ކ9Z\=Iݚs<=ٟ +1Xndsm~/Ѥ6T@r dj ^qҁRB f8T(KfGj_'xz"wߥl R}G4tK`|sk]f1;d 9=-e#B{!A>9|x$5GΎ(\;^}.P2B_Q&ӛYǝh+)}BHgR_xA JױAQ/mîjp¶񡡹瘠׳WXC-N+/a(^%Բ7dtȬdtI|q1+ms|xOzz5֤^[ӠgZF‹qe^5Dmg̀ڳj9̎4a,'4B^W1^7CoςS%҅xe5]eih,\c .j_ XCo),E39(Y$%"_뜻5s8G-yDS)Q%Vw焈uE)I]Pkc\ q"{rmt+:aH%:G}mC`\9 &8޶rzpo YUh;> !]P`~tc;NtNs`: c :.tʵbV:C-V_F^I*I{FV~@ MJgJ2WmE;R`^'bA$_o&LS >'b!XiG~~E9i6mq^_BrânEf,&K^F8mɭݻɑ-[4 .pQVaPSyτ#Bw6[Rr #w)S$*I3$fFQyifYy*Vl@1שd yI ȖHN(9oݵ i=uk>'q1Ɓgک5N;#(YF?AWHX gC5 o8"N];LK,@_m}3,˭ʎ#l :ʛ ǀrl=":"vV5Qڬ㻈z)^].q$OKd56) RbܼWX,JvBF4?W u$jUr$1SErRӘpץ2 s" 7ml|Y,EY-?bt-XBJ͘y\Mz679`ٛ#IhG-D<#S[% 6B/D*NY G|ȃpPHX>?YӢ6YهX>/AH)vP,{uamrnȄ=cڱ]fpo_U !ga;RD먩xuXBt+-{EmL0B2.΢ɿ=:nlxdo[V`>h7~.ܚQ"'...~K 91٦xc ˥zոi4[+IΨaLfIZ|m:[*E8&dJfLx B=%+T&|4Ϗ Zdb"U?)6$*9wC{$ܞFb} C>Mw!WG8gŹ=wSAqCK> p eވbRIr]o|yC@77>ah #iHcojIOQCy]|v(s\A*l0!\MƕLMz 2St .7rx >IcҀPt}XFcO3hq@<-?$Xׅ<'biI1j4~zp?rwP ns@UF6*ŀ0sSF/5YD;5y >^XjA'] IpĀk>H"kJ զC~md&;jYDTQ7TN׎)/§[May*$ÜAh>+gr3eV^{ih1 ? $gCS %30An s}EsG%l${qj(rVs5EU|ZOIP|*0Q g;sa /9C2#%ټHƍv(P^K,┩fuܙgSEҤ׷pp:Qa=}mfXƳj8Ƴe_oЮs{ʄ 4.ɡS"%koosQ3e^al,vn[\q$MqwUp ׎9`KZ5f`7O˱ J6K6*OpieQWɯl>4-3 ospsn*oXlNGZiYg}]M|N?q'#N/"!B[hO"c{5o|+j[MZo=;(&< @ W 鷴6DTcSxK. g Ο$.@a>}dK4.Et#.Ng1.*RȐg8`FE9Y$!pF%kTdB2nGoz|D}Z3%׫$Y ZT*r_G,|s"W%pJς7ւ׎-:wֹ&%% eh}Eeæf_&&5VE1wL#ys)ЫO۟^;m:< +s[$.ѬSBAx:p~XWo,M5)6Qb`7sHWA+:Oz_2RZ&\z8g]+2=pݍ޼:Dr"rKfC"_J&&L釰,rJb]CKP w{T'9Cڽ4ǧIOt-=3& %K26ݝ~8Y}]N}B}rVo)?Q}S,$Yr.x"ÙY̓Vpdqà6[>J8Z$LUu(8Fw.ι/!9w7_v^u&L,^\V7C]`|^U QXid[) *xGc/,BVSi2R^tDj2[bv* 0I$"3l-eIsP(CEY0JG`1EﮅHMKz"_sA.tݪ {R"^]\NXm_q{3wAYK63J,9(oEo @EONHJj csm: ?f,dk`k8UljL1G ݡD WOdҧtf668(gd;j)AW a!&z KE!ZT/?ge G#5wnX+e(aÍR ?ŕ6w,^T 's_ݖOx޴WiAsIZW" 'r_(?"Ƞoگ!upAf"{Hsx{0%gt |2`8ޓ`ؐ=7bwACD*n1`ܭ7܀# ('h/bjT!v`8xh>;1˄ֲ4ȰYS A,6eD4|^U=ˣ]auYivi( nZ-;w0J俸$@[vfRui%ymUN=Ӻ{0:ooCZUq8!o9l@;ל~=TL'lg p @A^ i'dӮ(eB/ DȆp QA'[vU_6MO *< vV G,Op >j Bjam~WoK& L4TESq0r*7&5ɁB< hwA)2+0 ӒF EKUyܹ|i,Ҏ}N7Տx)zrE!4>K?b!c.ס<LJzH1bn#!w|D/W͍I<݉91줗qnw`0%=%<]u}i[["Brf? #IKK?yR5FSBRqr;\ /GU1(ϭCè]7"颙(RI6鳋4<Тt:'i _O';d)e5 4@ē|!t0Ut p]\R9l}f' < ;XTRFb?VuňP: Hz9?- 8#)Imj`/8 :cI9x]byo!Os'[8bgѸʅcI.r;v? _Ltt+빖֩qOSBcMcBOFD6%C(02Y3әijF\42\_S \u؞_Ӹ×0nٜ,sʚAZ a#A%Tش,J,WI=saIHVmcEbQfseG ZV\Zx1 gzsnqim{GuR0vT)B.O؝[`M! \8S`Lg;׃[u/GOpJ+ @,LgUBG2A>[l΃%:&ij e ڃ{HLEӸ0b{JaT7ݎ\V"6Gi%8)Qr±Hx_a18r:6цJ2D 3R=7i*,+-+=FteF3cgdJБ񴾣W*FH- =,^]#kqpt5-`B bnўS_ +㧑*q JDZ6mc ; b>ꕠf2jAEʰK&pG[$Iӈ2LG|iקp@Beq[#[9vep“x<{9JCAVT#zifL~|.Nk~Z1"Bz~T/ jxڭZ&7n4[.Պ+Νg` k\ ̯8BӲy+(RAq`W/V@Tbؠ!uVVWᚇ6n[$/P`m Q=!*qf`tvb9+oJ>Eeӑ7LAQs.n@6ʤqCv7m]a2V:1Gumqʿ!՘_0c<KC)EQ5|O*b:`8X$t~q%B?rB꧉}mheu0@Wo='Zj_Ma7%y-EbgVaA[ 15o3xluQȕsSMF ?vAǀrȻVŕ?^c+M,3; z6[&05~t~ktqWT}@$eW&R㾗xad%S QsZXWڅ (L:J$ <+υd'fmEIٌWyB|eA36$UX(IGdGa+>Iky 4(-Z7"5n8@z\ADhHvv`CdJxꛅ{H^ì2s.sGx?>PwpLfmvȐ%Ϝ'r: mt8@CE&ub5eFpxOmO30>gOIOT>2,h>[plPjh]~Dvoո\phWp_P`1Ie'$1H:%b㑡־-a㝰ޑb\0N} 4:C!hD^1R[;YyfTZ }!14F ކHerGsF;VHFh}uC('XKO?F*|__ejKTGa`#'ѣ!(x'b{'0= }+Chqj2ϑ>VhtF<c6>_'^g=54g֩1 a!)e6KRXU^ 5Ht֓!?t uB!J'g.+_G0rs3 \>T#Rle~}.nm D |ñ6ݚ }ppʣ@ /Crc-A /5a4Иejtu6-:)F2.0TޜKRA'da4jw2AbvQO`W u_@5MV &pJN ` bwKFmP*7Ҩ2z Zk:A— ^UzRv%w$6orxW}ogl [NwD)R34BH[ҠnzsNJ@K$K҄ۇ٪(\CGkkknl:ub Ь$xe/ DhK'oKې$^%!dz>_OwU%_+ gA?2H>bʶ!I4~ՆB-P<ȕ4)s"Md~~p:^zlNY!KivecΓt_?]ʋK5c5SiY'IwO}yFRPS]p]EQ0v PWQ~Qtw絞>d2[Ǝp Od> H2e%|u5q0BO (Nm@fӨ<v[JwC0 G[ iem">& \/ 쾓d#Q\{`笐Q]'~c~;F2m.T՞_$boFoY Ʌ]'%W޲t't#&g4@cMuʼo|\qMnڣ55iǖ8 `<>aɵ:տJd1"Wp~|=#W$;=8."EemF|rixM̘{㦷_3S:]Q&dl{G 6>yn_HVl"Of]^czpGvQ`pT(vXWW{'gjZ`j-@ 1ayTڙowR=%--RW첮 3tq2`QGZ r nШҧ3Ot'dLyAê{w-dѡ% *ٟ^A.8>n?9,xxD$bǣuq@rë[Q:掲fgU)ԑ^NwRtb܎m>kUz>N༻SP% KaҞ:0z 9܎f_h8.8#GA М< +0#Z4$)rk1y}ws@89شVPSM#UO$ ,ϓ4$+ cML}b &XFye 3CmV RIiEhX(m |Ahƫ=6>N]]݋+ZwJ]Ckm,FAp^TYǦZ 9Av 5(3wIaY9׫ -Iy>SQŕ4tpE?WnR>зJkLaU.ak,dn|P[ELtNF3 mK6eII?~ ~($)s vrKh­x-wz"oRhnF.*³0y;vv6: =Pe31wyVҦmG 5yCۀo{)5j+zW|[r8/I'w z}kq(9R0J&lJufdth H;pCF^;rB [FzI^Ē}'{|zdsu+<ͦDGWzܭ(mN5Z6JQN:jrbEvTilQc|g'O`Q͒[]1ߤeeVy9D_ۊ'f^&9E$=Ť0S*j@c Cfx*=ZnJn.҅^mI")R̲-{XÁfPz=^Qͱ)PކJ%˽{k5@ rMqWmWGQ2KŪ?(|)Z涜9Ŋp/[K="(ʠը px-d,Z."͌D2:*g+OO d`wwٰgωt 7/]_IRec9zXegEJ@m]TR2^{C_m7od%X+QmdOZ`\i .!g@9%{}ș ~0Zy jC͚[f~VSeSmY8/?Jhj`c,0 o;@tSY֍Y-ΜtȇX˞ bTdigx99.Ge}z>j8`D'RvQb-{nOw3"ut«zZŘ9աAǑ CT3!,![Yb%({mLg*WV~iz!] }#\BƲe<٨n4վݍ\Մ\Ԓʧk~](:=_q0WA <|h%,hr&zla'{"/3y3k^-lL@P;52B TGCh1 ?WhJLWd/D!T?P#<0xT9>-kxx_D!K7\5oV_P@{1P\;.(3\WgA^:oĮrUN bcf1TLwLP9'H&0 4k9q,9g΅zo:}"q`zd8欁*&=9/s[+#_Sl!&A?n7^pq LGѹu|\DhjA3bBJ~+ȀP+GoƸ*GZ[שݫ%Fq&X&^X"HFl ZYl](:ԞYQ+, ϥ4E)XߤCqoE7}h"S_Ftam郰.p 55! T"VRgfcY1Na n}8iMXK>I V=UcWO 6ju˜-Kj^ ͧ[0o _^^vvijVsRY%&FmK:E&E0Cȷǽ/㲕ܹv8CZNnf&|olxUF״YڏʎQvRJQ'@#k7DbKi/]'.<@=r%ܶ&C.9tr뮕yȊ(=cטP9D "d|nO.OXXl6IP6^a7$a!pҮT8CKHqvUOITjހtZ8yf0A {r(QJ^Vj诪>,ZR7?9\ Ǒuyo- !8{I 14")'_?8XIr -oT) \rbqb$Aܷ1a Y(X \GӨYRqx@GfK6xJf>8Va6J.?9۶ޗW`0tt@ӏI{ Y4RI0B| ҡsY)YC( /N'LnXF.[l)pdЮ˚$3Ϋeoզ,_~|h'JSt@gl`&Lt0!G-vko]\JJˆT s#+eKWW[hA(AVZU;׿S_ۑ g'YsBZʾs ?,0T~́ۺnm=%A{@g5SW_$:pEkACQ(*3׈.痴 HAW/+#`ivXwϬv #ߌ,wFgf{y$  :y2fYtf,4\Z@,l /v]DE6GW#p;;Ծ_:2\-DV Z#Hm͋< q r@"u$u{>[&ۀkɫ4OK4\4L dOңwT+R_cA!y/ BXx)/EoBk| "FnXʨM_jo,zcNͅ:rkG.|Z WXa+lbb1AjO(ꊑ8itE'=_+T$p>nh>kyp,IΖstl icFaGjbw`>%md&"EDPw5ZW(i̦Ф脵VX|KC?roWZp)ڱwNV7SFCAh12M&r f|T(dpĉr,k6D2oE~禴g.3Q*"exԐG0g;k_m i!"{}8N! qigXHx2Wg}QG0"X"sC*SQ8tgX43e]򖙆uc"؄\ U5n;xpޤ3FVk7!cN\kfeuo7"8):< :Eb߆}vt_)Φѓs R&8W{"]Ѽ}_aq& ^Uqu>6:DiMV!FBzѿܔ;^%qCR yqrT td\_onq0sku}N g&\kutvudv+ځN%ll MYV>uI2TNU%"!BS=_W݀YEt,x3ȷE=? I7 gZs\'2 (Qi*"I q5RKfGV+V}a~edn)ڊbNX\1BvHlL៫HN,#չ*38گԧ(οIbUK1yH;҈acE#+P&qT͡z,ı "[jIΒp(Q˵)LL qxUe'Ȱ&~G7ڊ=H_L?K $D K gQV9XB~G.r4LdT?TDǯF{22B*=}6RHZ$ ԥUr yt˒~siP<^_2/Ƒ#RY-'ҡc#H~ |&E>щ^*1|bɣU}_ɢߍe^ xn_ny' 7o3`%gŰWQ{kZˋrC^WHߜ@)T[eq6tQ7zd ͍-e rb9pDyVbޒu%ΜĹI^ab/'j>f^{ӥ7^2Q/ZvzSN}+::'[N|zn+5(b+`AA:ʾ 8P·>QSRLK:3%ڰMN`w3 7eG^O᷋8RۃwO[3%#&$> 蠡RB[|O;3:*iVQnYθMϬEdv();wV⼔͝k^B0I@7="m#0%=oO&_ܛ(+4/WIB,;VnB~g0[JaBґ6z$V0 Z7F"`3nN(]xGQhAy8.]Ju͑z-%!~1=M8E| #a IpWWVɠ6.N*I!WW$Eve3L1 3a|]8k!Ej4W`sr4BɿoHg, Щ'+r1HC9s9x.?J~]`oKF7)TNP^ym"2XD!sz69]wd(%.'MSE.ygvR+gԵ G^6pgRCXiPH'{ [#_-%/-saY 3H~:XPh3ӱ4ZRfto!/`4 DqIAS(Ap2݀F`cWs J1 tnId r|trG )D〶&$l@(=Fkq\f`\E&7N_kk3QP]͔)Ռ*ӑ!=P1 ŵ*d?O*/ka5KgZi?^%VbPDR%򄆏!]yF\.vY .I(̐!~#6FBU_7Eޡ"T 59ƹ~`c|!@i~Aќ`6"{I})/KlBd,zV؛(;8}s$X&eHg 2 x y'8۱6peS=U4Deaa{L"`˽KtO^OOו6Ԃi_ijÂ}o'*bx<2.R- uF{W) ^&n+zmk^knJ"=r/dfǬ=7!luUu}1ڂɥDw/(Es1ꕚe:xfҿOAh SA,p?<`5vո}TNUq2_č›d$t4|Uăɩ k]-5b`׃yֺ:wPÉq}Ok,GQmnYRpʀX7<^F>yR8㪗(93 cj0\GO?Ѝƻ[¦<,HE_^8ԙscxh GQ E$-?HaL"[oNq>coe^I<WC#H7Q H^Ls0pw: 4 ^ءMkdzi4;ܼ d秅';}(ʍ-JƁdAe%۲K$bcGw$Ȯl̩W7<4PB e;:sC1F󃎧T>]gM܎ay4~|"++ H,` WHƪlc5x&THnNa<"0>@ ɫXTطJE櫺6w. agmv' v 59섴IbX|WNv$!}ce@] G,FЕ\Ee;_w~pM0ĥ+dW0ڿ4\1lⴟ;%:Xw\,ENt3@~=N_r}yM)h:tu wA\9nɜ)Ј"[M2S̯d3;yC~OS0FgO8Q5c E3}jPn?g 13$xR5#XX /vYf\s-\HoYEc(' 9Ũ)豄V「HU446/^۠Sa( cIjCý.`J9ʀ-ۥ.^zƬ1@!ppASu`< A|x.6BM'͙1}2a'ě Ib uo0މ\nɚg7G~u$7-x ndɍus,a-u{0(D*AxST_UP8|7,  ԶT}B!ZҀXI8gz8%} kqe`0m)h֣Eu/x-A:͚]wkXd@KqR6l}?l`VW^tmAEv;\#HIZ9^0{R;ŹgV;_^Or}LGlJxB8]b A  =ق" Gr2q ,t?up=SujAY*;/cvzyRfz8Cp Hz"n"赾 ؉VjK h*nw9qy0=K  =ܸSɳ+5%hNugܺGy S2gkwF@fpB2N}ǸFwoH:C{J JfPA%&.k0j+H1lrM&@Up-bB_DWsseyaKY 99]ټMtnr>ÄXen<~xYڢyf&mitDnX "h eVTݔ XX#@%aӡ:([f4xa)ҋz<ߧg f Noh+QID>n[d(krG+vW%GviDq+I?HA5y1Ҋ%V%6U4-t4b*6;rlPE&aA(>i,tBً4:oox8eg笑 8Ϊzco.0}(Z9Dž񰅐defAEdĠFI5I皇)9.m7V'#JѳR#!!׼g:Fw%X:$d1}p)swJlOP7e) U=3ИU#iɩD rxmɀqd @rbi536濼-^yrK";.NJ r01~i0|H"t=]PS ?>֎CᝃIb[k/2*﹥/Մ 3Ӿ@i"yAa'뇀EӖ*DqSux]!aL[XEˀ&21Q0'7LT  7>pwHYP z>wQ̶+M9B:?!3\ީ]3.-cG0졯(&ժ}vЮ/!Aϣ?au ^Ji ^96`h!gQrJ;Ʋ}.Þ,& k$͆>>}nþ@;?=^aN少ՐT['K9ס'ű"([[6CnlKFWi~x̂sU#aTPa܅1{fm$#_Ht=g63^uoiL+חxBa[9(3s >eh<%pHxK}ڽld< Ec9kdJj_-1k sUQďh`iMf4tefW*)AB'7ZL9>87&BUےȿ$|3*TB AfH5ͽI*Vy(Jrȯ|;}_,co;ĕ!mA>M8SZvۙNȿx`;y}T'6[b(rvD m1\?:\7tm*ekoh7Bq`SނJ tXCNY"C}b)}zDwN~SEA][HrRRQSĆF=FFֶSΞ` hj7_M;kuO(ߕ.Ct!YY__C]/{hG^aa+xm~L؄`ܥK+Hq i=ur<|SK#^TRo Z"$@V!>FH<2ܣ!-Ɩ}O6@J#f%W#]2o|jUQ/HfE:Qc#b"ȵnvQ@4.τp%yy:\SBbDIw?RF4W K間~g3ثJUbk~ S760ߦ|;uPq~h8V:dJ31=aN&{2]IBI=su\+2'GpΔmYrT@#o<^cռP-Ă%Muj`;J,`"$gD[B@@wEq\fNe䨺ov(:?:*7k\Պ,+)8V;i:ܚLMDYl'"HVlZr}NB{k~ @ 21˟>SszY{ī^tHnsZ"$F6VdykB T+NNܯ|0c*8la)yH]wu]:Sd<3Ck/x5|@ϑRuL&V7/gSoc%U#ZrMMOǝtFJb,7?nHB5|>N* m=I?~wuMFakl(LB='MDvm w],'۩ vҸVOI MS^zMV¡)qH$'݇'oCMXZb|*S6rC0MS53 ٌRs,[aPCjc9JGQ$_VK4s ,B}J퉻MAϘ(c>cV x~-WGk,m zRUwIQ@MI+Bfqa (6@Nj5X8&i -z_S9;a 5k{x]X6Yg Lbjc|h݆+5-jK.Qj{;z ȸ4\}"sf'^2%/e!%Tg#;iqM[\$Q4TW& lHdQbGW^nst;0()96Mzvz .3y;*A+WӶ=[{d ah-Ok+GfK%|c- dES'Q-gN7nMX>unP۝-5/N>O!XM[&,93rHPft"(q1=8).lP(^ (4َ H1:d*BOQ* >te*ZT J%U1?Oؗ9!2S D]Jߩ#&rÀ*r+3pI7~!cG6*XV=ƀ(XsaVR:b3RKՑâ!8衋E}E;Eb&;n3mV?$H3M 6/)[%خ >y`ӥ ]6"`-՗=n ?0(In3(27Ȣ7On\ LB+Vc?v{%2u3sx]n}S-x VlM49@:9nЈj9C_%vo3&&Dl;vr2‣[X>I]wfb`W.C|*/>BPްY(\ǝ1'x>[dQ5VDp!ӛ7M0I'w G\oIP" LJVGbsp:yXǜ>rx4~ =G ۄ*vZ^-578*|@f;=H[o m+_L&6g^?^NlJ(b'6%>(3PE揓)?4Va&hnG!L E䟤\ 1v:KWQx:QSfa0i+PU^DNǰʸW]*8Z:؁ 58 Nr#'qe,-Gr4ta4r3,"=n!tF ӳ)R[Ӭ!zĈed2pvGA Ox,*Ef:87?5CL=ⲽPN"H;^,h$?3N ۇDG=Wp4_;:.|5 _1@D٘ WZr.G0#h+%@&(֣x_$/;k\jΜ/1iyߏ a^q6Zk P]C")`pٴp+,N񾆣;lnI4oƅdqﯨ,*8`fI႘?h6 ^ݍ!ךϖjp>a]RĦPǫ8awo\lKM}Zo$1uRo^wVoSl?_&=Kk\tuW#]4 7':NB; g<7,TN#y$\Z F]ֶgwGOԨZ6,RON HGhUWG&)M킬lcoۭoiE4_A-M-e`]{ 𯚣#:?F*tǵ*ĿM8.wU3js~$E֎Pݼ|^z}qݒlXPA1)NHwFH;];S(b'+Y+%ZZ/ـd頑۝a0Md5C6h0r;U5BV&tX4'2{,)e`Ѝa$-ZLkiU`T7e[6{mu( hrX"4_COu8;P#($  '!UH0;&U=ɛ%/*#(k<[]|;:T{7,$SOAш`+5/eZ%"21Tvn9ƿ{;OX(IQ&#t`dqX#̚әӠ#Lo))TC ñYx)Oè =՜l^9j2]KIm!(QWo`-VF:>䐎O h |:Y.ASo=]񄮧.MSCwN5CFXfp]8:jScC8~o<$<1Zu !="5P8@t"ePcәGΊ:۳MVߢ7AdNpȎ/KʗȄny9嬁Jb"4;1 IWc+oy"E& Bf0%]:@(u(w+'TŒ OSCBt3C|Fgz7\LG +q T{1%CrdDnK݄"n¦ ^o_?kH٠Og7|aP<ZHf"3A&:H%qVw{ah?}q  ϭVbEe-}L {UvAb+,S:@Aǩ4Y,2N66|,?]3I:d=yC]0`Ol )QE'yA`40 MZX6'j'I"=N>ZkNuM)a8SPdAtp]QQ6ʍe-@PΗM vSA Y-:sY(ZҠi蚩x7YfUxw`\RFYF@2R:7Dg|31,Bv@3"SQa z;B?nQ{b$xódxu|Z4U"g"I=J.#)`&L=ġ(E˧MUŕ/͞[d qxFF0Ah-Zq`aHpc(n\Rtg"휷AJ1~ébR_s VتPr@=9a3nlϖܗ`EPD_5/ ؗ.t3l2@kuu4+&Rn.8\?P&I78 nMk>'H.Dʁk|zX?9O73CsL(' k+AvS;-AU -Ώo~xu]Zod.w*UU)\G{3l[z>?QpU(N*N 6Ox;+{xY[e:j*"{Ѷs'ٝM;Zxa0rJ`F%=Sh;yK FTƨ?\  @DD]55dȱ%Z+즤D>4d0$tZHvãqV$$ӫ_F9pGZ.w_8!tJAЧA}&G!΁Wi: ≰Fh5խYV2W_Y[U"risr<)O~mЉgN0-92g=}擷ylg çt%s:@i묏4L\}&אOG.&F!܉D,_HMEFrEYrQGM]< PMldY=H@?:gG W8/X'vlP+mӐQUV;e&5QjS2\Ӿ/(*}=#e};<@D|#lAgIM/NY ͱ{ 5o5ZR[STL]\}Va0+% A As"1sPcG=z9·dP*mxb m)|K=s6N[p$ (dpBjcB\eiE,@$6Yd5ʟm+ڡF\Ҽn\]j{s?tɏBAbdhp{p:`.5|<ثvuSN>F3v,@BjM*SȵB}lRIbRԩc_Б!Y( %z`ZCڨ貏elkf؈хdx*q̍-M'ݼq!UӅ( 36U#}} Jӆ67*vՓs}nl 4L3*=_@r2(kxl ep^hbei}T*9I[Yq$Ǐo+ cڙ&"qV)LrVlB 'PWĦ91l %/6vG}iTWGkBFY>"#湽zw"'.캍b1-WRbi#.{6QbaGA.i"|YQ]|1&$Ԧ+ f`ē.穬Ӣ[IC? A,lG}'W\/{2L%.X~('n:D~TH@)OFKPGx$P<8d:C"]"L5c2%| @z|DC|/`31@L7)^(8tG$WUp umE;t#cnǟjCw6iǾ{Fop,k[`ܽ+EGKm2/ˬ t :kGyfLMl$[dY95$5C_Fs\l5!GㅈLsw\` VIM@r{%vQQK'dߣe@u4q H%g \HbQeNB 5Jr;1 `Q7m_CYUlGet 뜧;(_N}EshO==GVΩ`(S |Kf2~;4Ei$W}9x(D^'$Wɹ%䯚?!\2lvI_IX\[$†H]7j>{dCgɰ@dŎ [Zֽ8s.$+b* O0;`m&r\c{yzn Q7QFݢ,uã{zZJGqϿ8;9X8H.4Ӹ#7j疕y|S*Is8Y2r# r܅# )gs`2!v' ǭYF0kO2'JA8iYx'Tf$cߐ"):jeKrU? ESە!lpurIif ۬?˔ȋ&|z&p\w Wj`<15Rw|bb]1#Nk&Ub';LBeUT/bRi :l&w`*WߗQ?֭,LSrY" ׳s ~R\SgӢ ,Td,ԕBGTiPi(طo!Ѝ) G{&&RTw+o%`ל~\ތLq zuYu 7ӓkd۷{^F*i81J_ \ :dVfƿJKgRY=W;f.}`{)5E˟kiXZ9I1%-z kXz ;l{rv}# kЕoO5DyNz)GUUYk(CX;: M"C(X} k~5SdkfSzuR݅QuMB2{O 6Q ‚0<\nIQݞ\R!lpiHc@;+vі bl[ #ޥ_+ӽ';|l/72!#݊'PS/9>VuC:)%\xĬqB/;pFno\/$ʆ4UQf1} HX̘n)&f-" G?2lƛ db yQv~Qc$ H6zLwBF^: "@jyj厚/l",.ф9xߣڸQf$D.b~N͚݇ 8R҆󙢚fW?ژ;_3F8ev|8 ]y37?M ngc0a ȷjo p*G .OzjSèu~+U6Ҡ|Kt[5wzr(+pIj,J%NJ K1V i7o"HK [獱ghΐJa& |i)DhQW7+l" Mq]<㆏?l3R-)wmCthxg)btk̺ pUbCEW9;7D7sLA|W JXvAaWcc?aæLJ/| P ~4*UrKϨM_I}"vW/=,l'?4`[QڳmVg mB ^}EfifV~9R5rFZ;nHoC_X7O+AB%CbSxPrtEr6\`(k-;}96< FtxZ#8PbmAW^-cI0@ 쎅-/Mk\#ki3kxG8vEn2(b{¨>66/tq="կ_ԅᐰd܂e-s9AG>n-{cvQwqfdoOՌds6p#%D$9riè;L q2|VH:2F=~VS &:bMMߐI/g39OuҠ(iiOpy/RM0̌m[xP .9s5ֵ:a$}_ˆ^^_WXc{6 9$&.Oϸ>*'m`qqs:lY؅ TfvC~#vMtօ2F( |i&9~ZNO<ԭl-&R&D.o~Q{ǚ7yAևsM,rb}B{:8d:m 9# pM`iŹ?_JYL+2GE飾KСm Kj9=$ëBbծ0xɼn#UL멽"#K-喠dbC:Mh?N UϷ4_&tryHC<u^v:u[ւ{I gSY3͉+ pC—KP&]YW{0I9o\_@&"5nCdֱ%R%Њ.[j%MeCdv.qsL1E4]Q{3OL"Hu̮=#,6&B5IΜD*:p84 X?@2QscRxs K"liPпbʾ.ER,@ ^٢]P&1F.S})` t/)0=]U 9p;aU\|R@n Ar ڬRu õIѡ}yym~X_|߮67!dX-~ ?<D-qBqu̺KCtF@$jJ9+tG9 }jr4t=V? iy ☌L)am#zuޑ,IQ o?SOwF[8Z4uq]=`L#7KڞO7İtīx zgE^u8'KU2L;JK "-td6jToQY9Ȟ˟]>Zp,Rh8Å%XsUSnt(YgA۩#v֗(^3lWKOaNqf Xt"N㴷Z$zwEY[ tpꪏʗ  SMe{])աmTp[\dxч^' 1Eܗ"}ˤ$֗2h(f2[|=B)#@'Ixݼ ɘt.IDsoG6l;_׏6þ½u~pA\#9Ar:%'z?fQ@okOr?НDD\.eOOn:%N3Ԅ19 ӱ1>cDu.Z6 /櫖Ml(A:3uzPtJDs >V8 I|mf/W ' 6MGH@1 Z71U0ޒy>:]>H-!]e} $ '?J\CŸqDONptahlM9Bsn~M >i]knTAU"_SZ\`W ÚfEx`Wy(-ζolܥe;04NI/{QFA=YB*}*`RkQ+Eo =B E7\ù޸nb `..āsՉk  N[/d#nW౦s (n!9Ǚ`=HӰkrmtf8[ o'6ZС.NIcȈϵ!-Sh%X. 8,L$BIM7/vԄKրS=v~]%XSټ-iD*y!2ߍJ9WbB,ieO4o'MZLnai݃ q6B,Z%-R,9u;eThsV3xk+eQTAvCsE킰{:JkBx#WA@L5rib2"/ #]sk !}qJjR@+8n(t2}db 1}YN<\Sǜ4-ssBŁj/)o V) q΀Ǟp_5Aydzyn5kRѪ O~GL ›9Ƅ8m@h縃vR\kK( y5zTSbasRAlIv]'5 K;ʺ\6ET;5<֫k|s.ʄ=(sn6'>z-M(%L\ ~¥^)Ԫ<-y{IP(ãkz*z`Q8T%zV J;RZ \}&_c@d,Qy`7*`Gv \g] \tbuؤ>ʧ @g?.A3_N؄?q R sEh,ODm+m-zL #c6 HK|z[@L1[%\@pYkV.XٌXՑkb3|Z91!TSgx&%#wIIą?u#4-v H16*R_Y10r>%銤s T`P6j0/j[o{k"G(.~%A|[DYbLXZ{K8O{d`OHCo No9lZ ?(ZUSx1ԛ31%bڢ8Os$kQ/n)|ls, Z3'HB6J~o1;tߩ9Y֞%8vg|÷iGAc0s 4Ԝ̀#h7Ql<o2'Gl^$EΩEQ(G/%}M=Q-RJzDSܤBsd&)ji؆¸: .;$o"/"jGxJ@Q1c(ctziJojM ڥ{c"Yz 5}-Tfy̿dqQ "2SU^CţWVON-b6c<`$\X3/V%0Rɨʔ,hv͎06~"aH/o&~+8$vmYJϛcn2k~p/^ӐZcqԄo1NБt$$Fm^ .S- ,(j%~R!h(@f$Ʀxї:&76~W5I%D8%Q~PNhkA|0ĒJj)Bqt-sA,Av~d V?G" 1@pDE[ŗՇ\b܅IѸȽ3=e U+R/! ;VKt;^D]K@ٙߤj%Zv+!tElwB@lQcOǠQ\櫿dzlR~85vL8BmB!u6jU061ghF CEa:e9^ďҐcT !@q׽]|oK 2;D<Ӧ.'ĔIzmѧO\t!$D+&g#6Bc^&%#ƛ&1ht6:  Mo{:TPeL,i&HNaÎB/-s u,#^Ŭ(=VNڊúDݱPSW;kYnnZ'Ž[hNI9 ESX"sO]NvPD,C U)Z0hq#[N+oH6u+Μ=vn_XcZ=yiZSb卤$=9釷ڌ3sW]<4wB4r<l#'W^@`Bߠ^KTE|q0g8n>]A&ET)pB?n`pQyʺ"68JBRBHٕP2MvЧ n܇/崢mMzP&"5tOK\;mIFMew(og}˨yq͸^!da$ I(U (吽+ t)0NMLfzdZ8ue2wI qwoS,(ef|("(pafX(q06@h4\nBTB @̰|^g&|9:cԗitI?èo0^"tix(atHg$e.;& qbNwaهuO= a& ]+P1d;1IڟeGXi!3ū1;gP'y-f<. ^l+ap{J04g_',x1 { *#qCAJb jeV4% a{o<Zz*L1U#ROx2ϊ"twM{Ϯ!v0`t3+bm1OWop츆MnaX'|;w3gE9pPMi*..OšKn,dHZ;nHT}Ps be_f0M1&?[F 纬t>٥zf)R_ k:SESenP1s{XgCljxjh+YޔJ˳嵈{vDI`N_<^0U"1ۜ()+7vlħP4jϝ9t 𤀻< Aed ?WIz?]ZX&}k$g:D(XvS'31|o|p/=Z X`.ud^&N}c8(눒gnO_YA[G 5B T瓑`KG%$WJaJJ_?Ac!kdBNm; ء?x$K _r -[y*HO DZfޙ.I'_=?%m1A]PXl*OԐ`E Gϯ{% xc_n;;dըfǯXf4;Wnwn(j'6q-fW2E q5֝VͲ^nSOహzP:z62i:zI`^J%Y4X]Y/d7*Y Wh D2Bdl?NyIϸ>!4dL3KR>00r !GQL4JEl͑)_j|?='$zd?bw"՝I׉>Ax4&<{&.ڐ%QeQM6AK۶ǟ@m٢=AOW}Ě6NWAY-ZX PYN\m0v=c D+݊:NRks۟?sLG~M=,Uh(m!u<5NRI`9 P~Iǁ*:${ә@z*}pjJf}KE#Do/e!F_*]7yx?TK l Mq]cvAЛôfﱥW<*IÁ<> W?̒ws댿yJNl^ޜ;iz/ UU1ח\g#oNsדT.[iZe"6ŀ0a1S"z'_0D\)R ?4E ,}]mNagct]ۨhQpy5ٰ7W+hX}!f /WqOtqP#'c;gL0+:!&IuW{& m+9 $ސISH9xzVCNqq2;, u3~^w-+p%F.Lyl[{{b9GNJP*3)O `D >Wf.=zQ!;Jǵ9ݞI)rt nh+7ӦR` Ug1.EJa,<^Jq&e@(1fK+A.TqIYWY-fwW6dN៉r`R˪J".R{jذ)aE(bm2\ơo,Q0oO|AȯM ;oop(V#HƳ,njٟSPU?m(d\5JNokgfV2>ߩ?6>=FIRw-}4l80Bs}]zk7@!߾QU2 vFE @^OrPۯPFs41zƑ)(&#P3?d5g^!2[Î(F(0$sB.3s,dTQZ@J47:ٟva=L9(03kbKxˌxKR=A|s[bYRҮu-d@0a}J!Nt'nvKXW9?43ЛA]Ԓ"2l7EKF2 }Ln=DٜJd/u%75R .K]3ɽAT^Ԩ>ܦĮWۨ[s#:=Ln:WI%7Гު JO')ü=*0p1jFa[!Uܬt?Fg i8#}'_ϗfǻ!THBn@t]Hk /lsD@}kS!Ow?g3b@qFTgn>ga8u}FyQp͝ʻRԃY+>NcL¿/9"bZB݄IŽ6uhkы%! ߱&Em \q;KbyS{@({FOGJ/~Ԓvb y@w̍̕͸E8o &7ԅdZN8lj3<zGMvZېzH6"@%P;EO4ul_caU#zE/W='E34b6݃30s`>,Rqu߷x#$hEZ~x2L=j9r#t60%aobe*IRߺPZ4Fr[&j.R"B's\6=s?ԓbd ]X@U<ǞC6{ PBO}h礘E#P? t1Bx6`9:PXPƆ'#Ve[f'j= -g]ISKJ٨f>;:<*|T%swqqxA:R˔kC@ZيUbV~=F/X8 juDvѫ|t8~w@cq}Pċ(Uk%tlw6}q&վͧ!h3A q0 Sul/Bc[\@}$N1QGr3jp5|bTʿ1'Ur[.6 IvbL)A]4 |tVD.z(qf%pF[s*U$P, ޤ:LCe+H=̵'|}3925.N9gL J"ҾLڈsyA;jh`m:.n 4VHQ=W'Xˇ̰DcPɐ;PettpgWZ D}{@ʹ.p&\<]>Ւݲ,JXGMfNi"UiDv ˨o~UV#yOVAXAmո6<3'JPaץ{tH Ust3'-f̣!U#}E_IRjxB +$ s.xOĂ'e37Xs,?;>ӒG)c#q,ѹ7%.l2}uAIj[m l9-EtUâ]T$[G wM}w3\9!\_ӛX.ض~^Y+bakT7E7q,Uq}kB(yB"F9b>y^k~rgm`j@ J.AAZsbp>t/~𥮠:WV`d}ɽ!qakpK53]8ޝU_DPC֮{F뙙8,geC) /dx6$/]8=\]zi`p!X XhN&l8-||w\C6+l 9[$uzg-L|NNx%NP zֻ[ls[H/A T(^Ba(zƲ-uEV ;wz J#r82Z./FlLhgaڥ =<,50WG23 #c_ s,r]S\Wo(-7O'g榆l, o8pb D˔uꁱ=4޶p|̨b]m \NzL}rV>5*\ }udlRqOYn`< xY.ER(iht#|EpHΙ*5:GuT}rK(iw5sV ucmAzps07 [w9`N v$ma1ٓml^IhV JծٝlR;릢 Zvu#Xz-?2Yc\=ZL54=Jh1d1p~Ƚ q Y$'_|MػQ'S:: 7hiy5sAR#)ϲEY4|{O9X'8m1q]5@H}VCyeEyοƨAj~_K$"k}g< .R 꾑e5LTnnd3I5[Ӎ(We6CT2iZ{[$|{?й~. <5gXMiE:oMkrjHfβ}M,U5>)\Zɑ<;p>}g}B8{z) E1fg{B0KmAәÎL.Ɍ>Eil&zbHY圬хF Mؤ(۵|/?k9t<[9Mxdz ٠Qbض./EAis|S Mqн5K7o]ٙŅ{[!ZU zHVgϜu}t6&o%2#R)s*61]b%9g#fJLF^-n bY6h¯)<QO_*fri y11h$ٺ0UJbh&+f"j5QLysU>'wK9F;nO~?s@Pe]TqDԣ'|ʍy&Ya̧4w=CcR/FaZI{8#}->p_;/ru:^wE| 2Us. j]֟7-XyQ>ޒ**gDƜ;N[_١RnCtM/㤕{S_hO X\ ?2ڎM'鹕 QMKH$RZb/ TӋB̢d֮rq@{#3rܤTeX Vj`B|9ˌjPǂSr.^8ʹs+%+; tB:qe1l4o "0t~i;n?] /4/R>[s{nӖma~Gן i)KpAPB%`O9ˆx>x xN+⹇co7G>R֖k70/B+ȍq?t}k,sn"sFz6V?'p5#L.ߵk!=RŰ{V_[\, 7O5,!A0I`v~ UB gU3ԁb5lj"~>c-7H\%PMX#Xic#R=D=nMa|neid3{aaҞ} ۓxHr)J BIxгScwl[{ GOt3 DQ3Ҙ8RұpznDNڡ*oL\hC$=ḯO"sVSIsLňO:"*NP8:jꔥ)F;d+"WiD\E߫]ue36Dfa=}$ɲXɽ"R`B? >T(?} 8cު)8}y >s)͘.!LoAgǂ,+?`DʒUÑa?ӹ|:R{7򏚐$8^5Q:if׈f%k U߭h |ϖJg;G^sCLՃ.V1Q6N g)i*=D4?VK? } e{Yyy/@8w>xBc*ܴ^Be1|QEHtCK3m4F9Ojم>a]3`jE%c58Ĝ+7lmw+#Y3Of*lt#Y\ZpG ͟T^F7+6cفEӨ4$-Sj:BGJ**/G{~N?U0fW |L}]WÚ,A[4t~4 ]?%lcƫG83ʤ./6bM]Eqڗ}Ymk{y~p u\ˉcfBѹkЂO-ʸKѵqO  %zlYI-J;ۍa'BPbӉ:'!AFro靝f>TOiO='^;9j,@wVN% wYJwCxUɉ暒`*Yy6tV6B=swFbTs_dnqDν\)CO~w{6"⌉PZ_:7%УZD!'܀Yq$كb]j<LAubMrE{B7 IfPtmՕ_h.KN<5jj?Pxהp\Q)ٝdqVXwĘ:HLl =!@<"jb6;.8ɵȡuٲRZڈ^T No~<ޗ RtcQЙ-3OTI h ^ ]ysyޔw7.{K"Z0xåu&]lbkc[|l'5x=(&asr߳AILV:i嫔B"l3Ex h]D~nv4EUTK! P¹w(F| ."{v^)Q%nm:>cC/{6e+_jFl6ec7f-ZՒ}2^8u&} J"Igxk>SaE:̋@]< }aRvh|ߪj7'H=Ra2h FV'*R7o6҉X~MnHao ٴL8Q|*,I_~ M']$a:6KG*5WS ܿN.Fp_W$e:}>8nAɱf_*o8ڃ1_js^Y-^-Y3ƢR{,>V`, EPBV! %oJ]" } ڨU`U4FV'F h sV'ZV$onS'0YN" doX7OzVo!0ib"83ImȖ,)h ^Ntd葰Ok\~ go[qwԯ"K&RS4FsTaQi^#lR'n իaUlX P䑂3|Hr@yƴkքB*=Z席JQϏҠ-}&T]GBGWW\1𱟻I01Β:$-h)_0Q16Lf&3Pi@o9/xO@.7Xzf:nt/!7Ǖ[A8vnj^B&|e oa|[tM_:FkaYzc? ?3DB(igyȡL[ׅV~/;K0ʮ /D1gO*2cff!j( Yדk(,uK{D޵ NzKfw&9TbӧGϊ Y<$&)v:(jdr i pƈ9ଈ@ӱm[wR7tm}ui\g2t2.3WebiC;RNa;_ۊmN4.&t_0-!D򋐖_XӅ[ᵉsû9^gSMq?paIOpS}XǓg-lZW2K_N\d5s5 oyzPIyx 0#nCQw$ȥ=cfg"rk.c#Z/znh 䘀)t]RX#%ʋ"5~"EljGQXЖ{XY<0JW*^Cq)"s]e (̌49+F|Dst2xߟJ5 ^eańQzajV) sv+\,H=,YbʵG;Mu Dv^=İMiJN2 Ua`LFI.a yFp)k(yl))'X"PiQelloYXA#ߡaū >B>}HB>6h)@_ yoL$ ȟ^LkL|z] Cq#H8Py=4r.hʅH*?|GT| +xIX&PEz=mw_-g'mu7̣>pdhFEiqMte=0?Y 8 y5!ҭM2N7CyPZLUY߲h{_5֗ZY7ukJsŊPꑫw?إQVʑ%!K3ː4́~KY>̤.D/8Iҁ@b {* "g_u&My0o[#j`w(R, Μix_ [UFQEʰ.-9%uS:>pj(%@;~ij-j(UAwB m@z4$|x3@;銆+lu}UKj2<ӌqgss'BPyl`ڿsϐytzByO5(<[2E*]mٱO D4BO7VHvv!~ug~, y0> t?jVYtY,_Höd9*_ hLƃIJ4r]?qS6%!L`!hxtn.8]>A3 |(7pX1°2vh6hܥo`|F Wr|b7|٬H-\작[ե_Dt$mDz[wo PD^G Y; [H%||6Oֲ႞ P;O0SQ-'elG$l@ ?܄jƅJ:mXȄ%%CD aU^ 6d{hVԚ^!PNSFMÌ4&5WNPW"E`mЩq#,b 4I\!s}(tG\JlM%h2)i ?وӱ4VG*RZKTsQ1NzVi%H/ ؿ ?0Q*aIj:215H v2*0HCr>qԮ;Acv.5M5" 4߷MaYuss쓰՝zڃST?5 5SDȮY{<ݎ.Qjfeݽ\MEEY0xc;3i43eĻ+ok8dBji1HiuBAÝJ-jfh 5Ek+H.CU@4FInpa,!'VU*uҚ9,z9_<(n/gݳK]RfL 8Ck8%jUtP0ĩ2'Y&QycXPSœE]OJDʭ ˎxYըJ|@٪ 0ǔɾdqg h1^j |[U1.xEQ?gK_VQ1*: |z6ig`3hleWBGݎ Ϡ91dP v[?/pԥ MV;ƚvRԀ4ZHvKAwtY1EYQg۔{[Œ5{ lyydM,ɲK-s~߿(z]r}xOgr3|A+cr%H7gv!O7(FgBoƣyWgڞNH fQC5:aˎ~()-}X4 NVLpG%I!^mJKd{jreOk0s8N΂O\3"Ƥ#itI|t@r| z}"rFlo|aq\avWBv|ة׆-l ,aa;+/-s߫YzY1 Km@=7lH ƞK=UښҲO5oC eX"z?!IgD7mE%‚> Rvl4"LE"Rc+A{ ʌXz4JMsSsWK=#b )r`# ejʍ4ePOٹLW_BRcGffg 4$W::NBo(y\xwenٟWE?kn0`}-IG`l־gv` D[ѹj@«x5s&rp'!4ir6J]ZC^TT]s0*LI`qysJoD5Ц\Z ~v 8YP Ya܁9` IMLE:fΞCd1r؜ݔ56<݄ ߰P( ]T-㻧xP(8qbu. ٞXcqU>9P~FHFӃs?a036<w&ݪzϧi`m[ZJ~﹧.AT,b-pi(K9}?"EDߕ.}8^;"{ɽt8ש'F)5Xg ۤ) GALp۳Jݥp6jRO+dLD/r!-˵CAނ >LnOr ĖeVn_=#3R7᧯`l=I[{)x d_n|i>@LjyC pSwg3Sw?ؑ׾5g}:ޙl׷,AV}U}>wYH;̓$gOHM_>RgPY.O(R鳐= 0m.>{3ٻ&)<ӥQ,L6s[3.zTYڨ b,HDRZ.Fg| .\~KImT|备%\iÎZ_Izu"UP$ܗaऒW7q$SkGl*>7ۅPW5 1h:͌+i3d,Z_.2+0Kc!K!%P0zqSf"Hhpsqf M}3% }7;UL*KXdPJ) sG3ۋ$q>0Q%F½!C{3/G{Dnb 2zl!c 7Tkɗp % D6:◇%S51 '3]+ a|nU'q.Z&xFtݼt`87ؔB7鴾v1WVsOifPYa|$yXtt@=߼/:Ul#lW;Τ3Qt´;${i[UFPaN D#Yi-GdM n*uöwMCH9  t9}կ<!]C835%/$!_*WΠ xtc:ӞF:d3x}ۈ_a v}4ʍw?`ݞBhYCd8Ԙe,u{X^^&%t,P!S|9 V9Ns /jnLܣS !c%a(9R阼c,8Y vszVC N?r3vܙw=HUW*3K?`MYrrc&@ݞjP3#CSF[Iջ5{U6@ExJLʠ(xoҠrXEb<4D)fLlWcN({+'RZx44s=LZ? }B [#- 7л`c%8w<$& Jy/}] MIڋTl>rY8R9@UxhJs/)H?6-XᤩeC,]C9˲ʏ|gCCq,Lf h PSQfLSH,E h$I / ;Rܶ=E%ͮaoC r*c1R) cUI9Œ)ˋ=a2gU|/RR!d˃. )\ s48c%Vnyבʴ*p$Rb:]@$+bx] \F61 əzM[!u );Jl f{Ęࣄǩ[nfZdu1--c8 10tRZ&?#yC@2D{g2RQ03qx X2rmT!pѵՈGBR K4us<|ڲv;-0}+?Yخ#u}TN NJO۞>uUAObҮK?NU?~A0Qg\tj._ev:A`YVuH'{C7ZO5aDOFu`d>@ϨV,t_yho@=UvSU|FV3W78f?m?Bn9e⎻#kF blndx՚>ڶ>m'LDq$tJaUef_4IbAMή| <kx tdm<׀̓:{cƐʱռ($R*CM@[)NZ.M=a1I-RDZPjsfgvxYYkD\ۨSՎȯtc6VC u|bòLN'VO5Ŀ>w>+:{ю!+!N9zVdLwp'uط`|ԦFL^@^G숙 t(=e,"FGf[3Y'*}uƶ$^#qrKV4\ف2[WD0r3K%duovV`^FADPкo<~p_ô#2D3-):s׀˖{$`'"#M~qR. @I+͓{$O:BPBskj@dLO쪉,.$ep?_.!0o8@Mkd%olۊF@S[^V1K UvVs`p8x vX&B[9HND}p ,KyaF%K^n~DdYi'9-]I;&pDN[͢G :ڗpB@O&pU|>?|sAj&Kcɴmg]vk[ @2wSoN]x7-O3ZfXyuN2 <g)QKI|'Gܤ&D *ӗM X-(_s ެ2I0*VDV|Gf  c{wbѯXMSW6n8|:/'6C.eAy .(LjQݲӰO*\ bӾS0[)%` 4T;@e{Yϐs$f [[&Uhv?vw n0I8ܺ f C>!,֠eǓ7)"+\'yO3}/bCReo6$PFs{2<}\qg !s +GgKޢl_Ţ&0דzvB+O?L%*}G3F|r]55{pɥ?VP,'\)4ٖqǺ9>͔Jlً_3;E2L8Gau#d57WH\3ݻNj}঑WƘa8~7RwUw[jf#Mu810ȓ&/0EGl{hp4 ݁ǚ#&~h2Ng]"a^p H\پڊm. (caF| wnXG2S R-U 6Pbi$1ħ;<)Ȏ#u '\Md 934k2q !>7ZeTҧv HP몾,htsD~ЊyK[!D> pi?<3-sgwڼ+E"m)G+t(8̗~Of]@s?Iid rqK* ?ٚfCP>8^6w{ztmukiX;mѲcq4I=݆?J8Lnx* ze?h\O UX  0QSiKN\N"\q IΞak"1ޤt˓A0-pϟ'3ȴNƄo"v.@wސDg[O\l57?w,dW1TtLj]/ 8]) !{z*8I3blߙK?jQ]^}D̆B *ұ\mJ H;}4f{B0AsK`p_'Yοέg`7;pↆ']@ LE{ -mUCkry}8Ѷ׹34ygaCPܩ'OpX`V1 P\f~BW2 5 Fm?H7?봤UBq1RyKLn $>?;$~>I)I &@UvJ[ǮKeDP'Z\L~T/><3!|S3WҸ4ƶuCD-I4"XYÒR^U343b@ּ+˾r &pf']#ra3@4'ksEAm_ r|M oG$ydVXG p.ȶi9ږg<+뻿ӻn`U5e%hܥ>B d|4E>I W6I7yjr| ]Z'> əuaVU!O#g ]dN!H8d#3f2-XmxY[S_TE*)C77Zb_O \+*p-Q3wsvFȒM rp *O[RN"C"$&ʽN,`Q9g=i]MY]A D-" qiK߲ H'V@Yݝ1Wb^*H<|%bm)9P1BA.9'OA=a&_B Swu* d}YS["Be}TU\\GДV/DTG:oVw6O>"yXN>}m4&40?ƦGFQ!Gh> pN~(p]Vm~3${]eSvWݰ)x@%MhR25_~6:vˍZo!V5ݢx Ӓs ^ۥgr&eKV)~fKD͍+^\|NnRJ^e@z AW T >hSe4Cy^a$ͮűGCn\H~MM9zBJAֱ9,ʇKes+?L~Z4 [f=h JMHt'H2Ѝe>:oQ]I+{nNT"س4,Nyܜ[OG*XAM=nESd.$99Ԅ*`* bc|:P~R?~hP/Si N C{HXQ9xRxd_m]S$< #q7C;GI:s^z쒠ܩȈ73˴o:7Lm|q ׏>a86uZ;VfTLה)$-A)2͍><_WAD'X-E_HcvE}*TڲHu -o*w4Ip6vH5|?ĕݗ)yܜ"X?'Ci ]-iuRE%~ .(\@U;MRЩʌ{}vɞ^Oa.IA2KCkdlcW#dsXIra8 A9ba4CX-`F ^8ni۵hZL294Pbbjߟ/T_[S>j Ly >= vIs49L?>Zq3_>{DejgltլxJp4Yͻ:)Q |q@@;wI_3ҥ,OKz[%{ZY|F6l#P݁ RfXF\&i]U7p˩ljTY LT|_tHs#W.* Ih:DSY1MI~޸$Q&Պܽ.@?oA*Q!+ඃ0(fYiD;JSNup_/5p)~xS&_]r%l8#P’(Xw }[Cn\̹ n@Ȗݹ٪fFSA%Z(1qd_ -PQVlŠ7j<`J#0aw{?`ѳz FD[,^kmmirOv`%HLx4&Ma6,U哄gda~~;<♕,;߈\ xw0t D~ deM$ʜ|J!ˑO|]$n_>Bżq͛^.Qh޼2is3` Lq|G1Aym;D- [ӄ2ټ7ĚnR2riӣD2`s!Ⱥ"খ6 cjtK0v9K? 0nbyVGd <.DCAC j%>bT-Kx?2 $%aÏ^ZW߽ AKmMrƎY*R;^.aߎrm2rfb97Kwb\@WT35 d;ʧqzA3vh=b{!Y©Ё'`FɳmRnx' 8o(y %L*EZd\["FpKHk c Fujmr9X6[璣K/GVFkMAv߮oD$N(?=-%!,R}7VCx׍nGo,hz1lQ[~v/Ak TԴyt=z5RFYt܃ >&OS<_Rb #pqq'd3;"XlFl։"fBzP4x 5Yd"VG,!`]PY۫%a;X&z[$`BY"]uu ٔbum&) O.;~=\#vS֒Tч2ԉ|FKK/7m4p;ůyR@;\4 ѱB*OC7ngdw LBHܖ.tNF^yo ^ԑU:H~r53Lm/XyZ&IUzHS;ÛcDe l_7S8gT@}Ww^Fz(`C*}8!UP4^<֯uB |#Jϐ'HfQZJx6U,ݫ58 {ώiodsnA8/0Zhf$ Mx !ʓn &72Nn6wQ ʌ~ ~p5*n;"9MǗٙiB"z%pj*S,Gg$ToPZ[0 d83=$BDjy.,mA >E5V;:(J.ZP5]JÖ!*/5}$e$#uYT;̡6&ѫJx\߿ f7d]Q _3} ϫj nLY5-,v>ɾlL$UId*p74q݊Ś}}wtuNUae;z[tZżv`x.=_W%NNe#F`8pIC}6\prqvӷ)j AvWuzbO: ty5T,M@je^T1iL8r7!N81>pƷ9ӥc ݮⲌhi}pX񗯭7IpV'U P"b\/tg-&5MD@Z,z<uŏKDًYq[>F,upuu~3iנ+=(Xsљ_*ȱPU_)h ~]KjR*~U$sy<m2*VE͊gM\K`@)f͢kL+nID p.[ǵ9t0DS܄Wf7$@MpIKPӨ+JP k93Kګ);nЁb2G~b;w5S>v{5j 9y+s" t>URGdz Ldʠo9bw"kON<|l{*Z(`V,#O*H+Ւ;, 2Nb]~ɺXVL^ezYݷ=Yfr{`z|r}ܺ"SSd'oMF1K -_gba1d^JEZI@;94\+*5+De t]z$9%M#^0IyJH5c8/U"NR+)bV$ghW[_)mwU!kpEIǜ_Qs8w 4/3EUnihI0'R$|\г=`6$5Pwk&řX)F/x;?' ;s_uނ?Y  An_YK-dEP߲A>{f Co ]Nmϰ$5nF*~p# 2!z1r.O Ua=v7(,v yBe8OA=NBkqɆˋ.M`"|~!BbM>7矑/,:\D<HsHޥ@DJZ-UnـܻI3mW׳M- Y_oQl%Ģ^8\&H3Frk"5<g:jQql{w<^y_W*$51*u+N-=!k7,#%K\3 HDOX#MޤuqE&/h2}a"S ){tW4#.=D~Mazhv-Kz8e/uNIxC瑌C;"'ZJ!b"龁D0/W'h:Y܀E oq`$^8m6 aQ:e4>S_:zk(̹/Z$2.ʜ-G綽aypX}aѩb{l7Z0} t<-4#cɓF*MXaTܝv:I(Yh[d0>E?ꊅ3& MhDo`>6Ľ]턲UX=m)W!a*lJ4[@OMz<,O^@M'(\V5>.bw36ޮDL8H7<rT3m;ɤ]Wg־DA>Zַ4T38JtGl @#@?ۼ a6~HSM!Ň NЋ~'CQM]dh4(ɟv=8 X7J{DDF^⤋9,+f g|ilr|nE+(gDaɔ։eӑ^j#jzXGOTBVoQ>xOZWXEt/b?YDYLܿ 3=wCoWFPÆ>ʌ[ǘo9Ն$툹7?An7C(/ޠi/5hitZ`|@xO!)R)7vX5~H ]C͔ -DY 9ciQ~مu řs|u) u $_T 6kTXpRh+;?|߇K@{rG.= S8ݼ}[u#ιP-o= fm{ CTxcg4Ըы;F4L-̾yR=zL6VVw"봻#4Gm_]Rb9`, |xxߣ{ӘJ?_l 5&06KYK2SLʯJCWĠ?7=]*K+BPυo+m<ثI+Qj !rQ M ^1I%v<$̫GPF YT!k>tvB|ezBHqM២yj"VG\mkW2%\j:bh;=_/>JB4l j. 6xj&@,_kS %U"^S6dH٠?V,#W')U|VV#VX,arJ® }[!M%gR-[pdbWXac4fJv .My芍Rh F쀎qQHq Mڦ{| ]ރyD!Ww0PC|#3EO6.,~v= w]%B*߻jl2Ԟ};^Oo<"^nZtiɅMaTƸ`tPkgYp KJ/-Y20`n/WCTa*wXl! 8nz6`ި) #8'l2օDLЀ L̊ao7J-~YjhJB>1܇a= ˄N,aQSC݌|؀2Aq}-xʺC[.rq_j|(aV9pA˛$Yު/bi  GOΣe.f2t [آS J-"'U9A$1% !82`8=3G֙{!\fcsͬay 1.ߪ fYq"+濣wY 1:"U )&kM5bjo7-(*fF<` X)_ >5}q>SMګ/SQӊ:X.#icLS3*9q%@E0CBy3ċW27-)6vy||'_j4#v{ySh(;36?Pq~g.D&4s~Rj,p2sd_G ~!$˕{o>}F@*=:B&+(n5d5QLD:mb9:Q-w9(z寐xJ/ؔ1g-=mitSk L3#R'gk#SCݛ6E{` "ЂHl%WE .za(KvPkeWptA09~@ٞ(K7ǵ%.f^Pj [u|+ZP!sTE]0V%k `ӢP0ϝVǷ.g`sEMWj_]U}>+h2C.F: cc8 /;1+G$4Ҋ,_/k%G˪+XrD$q$G@KG]۫J֡ACX[d[({80ܙs}_9֑Zb9n. *j,6UԿא[0 {=buc )[ed_{觧( Nb _ ;<_s>LbCαzz$/C버;9Row@')&Ld;A2Z`5(T_TAW<~s6`)٫c}1'XozWCsT@-|Vh)}D(_~BͪpPx5цؘYr[N 1gFw[;d^ L9 v%z;[(+@"hVI'>iς8ӮKFMtSiTGw2 đ'% ܿݭLm =ߟ>*ZbC i?6#êJFnRd_И|>GT!2 37LR )4K@mrpb&ER&@WcN@-pp,k&U~] mt`crD8c6[H6Ngu]7̨+f%uK鉸˙; CU~X$rmm#ɞ`[^5`k2O7F \+] /T Ⱦ7`I^"GMhZ+X XM$o mԿ]wbqȗAdb`oy9%N`lsc'S%Ws{E_5jF_ ^!C-.,։Pg>K-fل<5[1țp&_jy;|Q3K:&mb4GcdN\~ e ?Yfm ÈSz #! ѳ bvP'Ѓqg)$,; hAx}Zet;X}}YX;sO&%l`NW60XS PuLgJ#v0,ԇ0oב j܊5>GG-_ѧ|*}0cA9eM$auh*!@%ɾߝ"ɾ^))4gQj4ܣ230݋l9%CX*B<6M헸j78%إn)oʂON-8KǨ 7NTiQwx|lve?Gm5n ,O- fsb t-nwąPي7ERQ0Gp#Wsf9:n a<ƱBQl_J9P`V㙬P+!*t9ʈر?CR2AT)]~L EMolhX\N_oKir3v ^p=hY9#W:xD`!ŀHQYG>#]@P `}W6xp'։$D4X3ƐsJo/Ffte~(ؤ#1޶޶r "Bw`Fs4saE'NWޡq7_wQs~1G^xЎqɪ1k0;0{|ZAIaYBydžm#"Mһ HQaZ$L[j:::gBt:&UQMk4.ddr5=]ܠXj]9_6c9邃\"bggLϣ"SlqgU+R1Lt ECʵ@n 2POtv 5_y?OȨdr!B=^0m , IJeW,CL(eiS- ܼ 1)j_٠H,7ENWH˰!:X<^5QHsAvI2"V(r d=~9lCg :-sIjyV>Ծa0eqed~{ەKn=ӏ&7'ʃO]n"^bRJ ķB<`#_]b/(WcGץEWQTY 15:_u)f ƨ /z4&׃XG|st Xm{;waA4Zq~Sq3Ҫ=kk0F( \ᮅ ڕI `r5%L By_'4ٺ)۩$=i4OZoy&./a~靠w)a ͽS'0tz!g/!k OŅ}XB60EIP39%wK#hyDGw/ΚzMF1Q5j'I 股-& ʥ(m?MG`^* =CԠl.΅Po=Zޓ 񍗦3砀}k%)Zӧg6>&&-:[CLIYt|,7ӿ#zY}_0= =.@w!UA2>SP*rc=˗ "@(Wr^Q-ce:2JXS&qvP71rֳ4[rJ;Dɗm#U]6]8u541@Tgoڜ}}:!C0H$[3ajȁ=#.4'O+MS8DKm\f$v%T)~ٰ &&kL%>dz܂V4!72a(U4tv g @ 6\v(A x 7#$1nf-N C;YH.AirQE'# ,;l=2"-`=leCx3p[@rٱ67݇3l)C LF7ùevpK9dM1zN$d"#/@E:6Uf )>-W3<9ϫj2 l&Yd^| W;I ֳwxdXa;U"K s~ 5q|1\qDhGMWsZQ&k5G'e_RSi%K̛x'WٛJ/+@,nn5rouMD"WY U`ycJV*w(eQl({j/Z L9<FHiFG?BF}޷! pUc!1VZ'2oQM_ 1.}ξ-ouw n-x LlH*&&YbK$i{ OeN;*=$ήɽ,`c z'aF2U,?Yir%s;Ouk!t@;L>Tɗs3_Yn@C졪UҖ\ y3k'N]!˚qZm4ދOӑ9L 7ŏۢ-v7*/ೈtSޣ'OVtրpitH6Y˽s9A!7zC^pk[ax58fMd\ͤKcyANWŸs['@6Th9لh< ]p\j(!q#و \ߠU`U(V^ SN`!ݿ/'!OD%_&4 3V~JsMXL>X%uO*BR(;. -Ne+?Lju&T+LPCN|I`ϣOk˭QA.%UwT7{U#QS=C7Is; <+UZ(O" RHtw6fCB!eeu( 3gea& )wfZhed. Sc Hs+菗z{Z#N4 KtK,Ý"kBsʒ $Ŏ};[$ URm~wjUqfx0>{h֛P:;^A.m,W4 K~#~ULtu 9-:\ Ln ɚ[vMLaoxnmMݪU7}1xrEhK#] Qi9a-ņե@IKF'LZ3ubau+ Omx.[$H+0O T[tWJp&lN'8;@FKkG̴*3|8 U~@_H[`ٺy>`A.PfjI9 tՃvIFތIƢz3Q]CS}$AȆeVyte%R\{Buͧ'^Dut,PN4SLJ@MdÜEqk焎^CQ;f Ȼ_^H.zm]2iu<&#d`rw 4Ҥs6Mh&XE#ō:Z>OȗqvkFq9M}_xt05+8ڸˤFRA Yoe(ymu3rFJDڸY,s  TR5S%p:ݖ|Fhm0~9Nz,91R*bSISfjS6("e>r`-ZxP"X9 .3Bm~l݌_kg&ə,O6sl3Jo>mi;dDC G"L}ܲ}$_vÿO`طܱUEUl:Q?S I%-Йb1@zd,Q=nXK!ZԨG8wC;F䕈K_PCTVGuGGKhbAК# ; wG,&d0QZrA-! lO- XC_r['=r0^#"t*s2v#LӋ2O5#H ϑCd8n4-u~A&KޥJ72(h{ij欻sEͬc 't!xBRïhyVr YTu4Ծ' He+*c`KTLI婊3M}On''*QluTK\E'!DJiܽ82ҵRmE]T) By[9.YV~dC$JX3&}o4Ȇ2|T{PAtnA-aF)k`=UI?\g5ev8 2dSvL Z/h36;j}T$7tIJ2ldm ptc. u!iؒKAqNT=W2o!bl9R򮟩ЧOt$u($RC3pAƚ2_ о`֘)RH;fvl>9 ֳ!IÏ$Z6/ -H`%B&o#<}c%J&Uj[vG 䟫K(amx aA\`p@F{g;iGLJ(FnnDLiwc(zTH#3>+pHC8pn`y(aJ'` {Kj骨5٣Gc$ 0چYyitn"F:8/y 4BOGJIrf|-f_-:+ >Uk&Q8_{ըl>9G0p$9HYp6d=iaSQ߸K(C  Qe`w왦q8vͭ :\fYZt@{UJDzq9wܶlaτD }x߯2Tz,'klfF3DV2TZM d-ڣ'Zc@!iTƆK=>ޠmLwv,Xـs5}rRLe~W mv2[s3\ `KJt!SoUHJ8Ъst.-'ĶG%,XڈٔL5#\N}W羚i jPH=[O}05pB[Mi=6`kJx Ǻeȝ uy2;.]=?J*$} 9\4j%/>*,.|82w=]HUDh'_ pưP 2>2\14mD8Y d_FYU#_vػ l= FL ,⮶~yU&OQJUշdoy_[Βk{}Y簇c=%kFv|[guu!8U?qCu2,UJ[ P ]{ .(TױV7k$Լ$-PWɈ_wU̿śT *m5 #(݂9.~(+V#ߧ׭PU 65sTYL9CpG d]ŀk63KS y.~?SOq85j3zYԷx'u"RZ}DQm߱ uP_lӖ-(0 ڤ#K%ήMKXv J_4>͍GDgzЁ2G.Y¶ )ﳑ>ܱ鉺.ky SB4b8=8kU&AõBkEXQE[[GAP`!/srr#DE+C[xO-gGy [< B'PxzѮ"/B6SHa`Ϭ*%LFB ( :{!o]2$zylydS6e]w;>dۮBM2 uҶh4g;+{z_qIefqV]c,}GdX}PMy'8aaϋR K[|s~KZ(7h7SmJRFe\PtoEƭ*gL7IHpO+DȡKjF[46F'h `q+7>9H <^>#5j&4P:|o7 U=Q;#EbRbm~ʪ8d^uSj#V"_?'VOhjQ7iWAfONÓGA']`w_Շ9lҡYe\,ear[ΨwUs'%B14bzm(r9=K R[aWU.QI ާYf'x}2B X?s:|Fl#!DPBwx~D l2&k hmU5#]ϐmn㊨mϑtfgE."|@q47Ҏ<NJV/GFämsifdG.hnH" PMܠlRwKhaO=}kPsnLMQk{Q=jJly.V!N1EjJ@%hC8Ib =XQ:kN 6;Е6檶5S/1́T9ƯD+e}jl̯܇ƓݗpBϔx+JVA.7<6ǽ=a]idZbH=_eQ byT#x8 M鶓\OGH_3#mGK$G{H=;STn2xA0RRj}&Jw*rڊg$W:Tv^ń-2Ix"2ܹʼoPVOAKs%bG IJɃݺkT:ĐLK aq_]DOt]>tV% mY}a`@9i52m_d-Rf̅Ѱ=U(+Ɲi9lG~>Y7 ̛:>'%_QԆ&( }/%e T}˽:\rfXV2y7Zo[8;G4HhGM>ӿ~ SSg"V_[ .3p?HJ 6( (ta.:otVdblSAFFh4t51O߹TE`={vphyOt'9+ >o!N|>uŵMQWTxqsgCx#1I]FBcڑ^* ̆`0EyU BC* kV"N~:qlz ٜ‘yrR<]k.o-\)[n}OY9xn)u:HC G7llyO-u>]vM)CVz͗aĊcBJPK? 匳>'ӿXn C ) `#eƬab _3(ڈϿ)u4 `"B/\E_'#{su{"țH0F4gAx-9.){?dZ0x?+F]? _PN`1uYʌC5+}iX 4=_t i5OUu1].r/}KfF weբi׍zt')$l(k}3,,ETY"TAhU)`rTMHɟK0gOU^, Y酂[ |l^,-/1v d $Bob/yo{#Ti:U=E-/+GUw"N$W]?r^xlG;ƣ@HP4NS#S])Z!g8dGs0 02 ?ͳ4~bCl }ח,1sQ4d͟7h $KѼ6u2MZG+Nl4qGexy2Sy@OL352;d;&o{}O" [֖aS 'eDpGyG"I["}@/; p;fM̦D[@] VÁ[ +bڕɏfyz| Kׯتlstw`sv0pǓO -+(`_8,?ۃ,,(4?!Z] t{~ I:ԉ{KvLJ#\7]Н߲'ߎxwRzhE8>xxѳi7m~ElVz`;j<~ƞ|ڳ_4'`V@V`O3{qm=ɝsԐD1ucvڊ㿝&H osL5[ekdWTS"~x~c~L-C!iym*d͓v@%5+'rHGY8Dvק%+ g'FoŁFQ뽯+㬣 ZTϋBD^UCmy0k'|>^ M皳9jt * 3RZͼMr/JEdŊ!6 u!0W+E"K,`y\qĦE P#V]|k>m_ 9vJIiYBJ뮌͟yMN`]x@H r>Baif|@Uy˓&n>Q,"6@xr$Llw gnɭ ҙ\`+^r-|sahxgग6%"u3(Ev;/prƨ9% Zxntd}o\T.zB̸7=s6xw G*[ecMkqWTHJ`A2hI %Mn-.v,&i+WI ?Bƾ7v>=E%|}J ӹ<`нvrTJ{^rRAc}l^GDa-ĐfpˮB+}ڴmD}KlHẢ$ XI8r8OšY&qf=pt႟<>c u7PuI[`{8@;'$el \"2VlnZ8< ^~O=Pkt plU3u,i0&wISҷ3 |z5ubsE3yv " c"c 4.rve~@BBiUuХׁI@a;&=fe_P?1U'v*(Řv,@D:g%2y?IrLji*}e}X}CF@T/N_Qs8թ=ܰ:I?fG-ȭ䊠-Ar+mwlI%18+ kQ߅ LZ2{ ^M_F#M8di*C7=þ+9"[]DBOJt7?4Hiӊ1bgDULSjc96r^/auietEuKh3Kmʲ{+RV6ziqT!S,->EPZ ԗW[>u),ѽBQ(ij ==i$:xtʕ2{ww[MFd;Y}(%Ά>h;Uf4ΡY`H5:tV]=-<ĺF$/6|e+XAt~^eouaNyEu÷.nx?Ym0N#0RZ"B 3q\87XU* rG/ft'ʐNH]QI?D)‹T2cڷxZwsvKφ cߚ=fjQpNR7 ҅A {"QԧP}$+"ȃtGXK !JCTɤAAWᘴ摒 inڀ=!&W[y l [pWXhŔ-2qDF'IՓ- _tKR?e 扙V'q=@WqO@KGz`8vht7d019 0qكB(2t / (~PçqʙPij񍩹 !=~,"6riI!uY2(.S;ߨW*]A9Yj_J,FW̥p,.+ɟL.w/lcݧX/\&\ 7ۇDõa0"o3d~qƟVZ =-2Q &M?ţ{;[ W؝1QA3Wcxv犷Z |IZJC>3uG,fLuҢTp YH6VLAU.'nPz= sHt$*:;sz4뛥Q9T)-b?E~Y س) & (jyBObC“I&eΉ c[ub:X ]M+H)Y ,O Oqދ`+R[я.GeP/ myG'Q ,EHuhVe-(y4X8tq_덁cJ?p}JTl<8ZǥI") .{j1ք'L#;=W9yv!SNWͯw'$ٶubP+pyp<ȳAړa&EBZIðHu]-j_\Ѳ1'A rzʐJI1&m9 1Nȸ֡P@n[D 7I+rO<&O6okU'Wcn}9ggy׹ 'AKXgQ`xVI+F(de{ u5j=m~)]7"@4:1&>{;}4'\^o'U :MQ]Kz Kޙ0|z1T15TLd %打i $ cY"an[#ղ!э^ҍT]KكJTn)vZw'(^1$ձɘ ܞ0 t^>MB_9QWHs>w:' )&4\rCӈBٟ֒bR#&+ 2gh >ISn-'~| XS|/[%ثf@Fɱ& R8R5E3r3iio$Qb" 3^Edv"<@ Y0}y sQ k7Ex]BX"4qSLnK5Ok1ig4춂PAIҕ44ⶩуҾ0ӥʎȓTq 5(|+ Jxw(q&drΚ%!7OKǽңa3ـDbbʍㄾ#z3 E@9Z^Gk(EY?)9@9JW y Bz${x%1M Kh؊_7XYa~)H RW3b>EϬ j7,´ocH(>ws$Ş1r573x9wX ,i"?A]\{4f^u,?<=˵7JRӞ> &;Mp+`r:@J[F|5(LЬ U=Ak?PR<<&;& ~4,yS5odPd~B{?P[M][V[ |*9Bư<ć[cʢ-81!/jA] 0`%=AF!CLׂC#2BOQKݾ S:ǺnUpz;@Mɛ="f*䁽;} 6/Q35RqnIc -cÎkL2Bt{%m~3{bikhS8J䋢7 =>_ }w%rԔ {!^姶nx /M#o{;^˺=jeBw--ˠY˖~Ip;R4 1bP8g,nsΊ] 9iP]yARUxK;pȵIa·6W.mOe4^Y6y?$׈ҳn'OeRGM޳+{d"dNGU_\hp˻+w~`7zv.vE5дq\euriY)IJ~m6)s21`^=;\,a}_X4f%FE/Pob8#װ&ej蝍Ӓc_H ]R=4hYFMQ+وq@Wبe<ֲb{/$Gkj12p'Me qO7r3 ؅)h|6pj!qx %KQocn'%iTŷRSvj"QDeMd KMQ[oUICi@s$oĻDEDM$t %3̵,[VNd?o*A(E_FD?0l912H\7Vɠ[ hȝyP`z0JAgCQ7'{)|dPlZ]L>j8Әo. ۃfӓ"k52m:5cK?xբ;+ss=w99ȿ,9?b"Ka8oǨQxkBiV@t9~~}: i$tY{o/XwchYz@<Rˁ]?&GNC%X/^:3vKYwS|L0E#%d^b[+Uu3*>YkH8< D's0C~9ᙥh׳^505i69N 6,TE85>F)W8aV2{ӤŕRр8e4 ׺mU2[!MvumAďi%xߴiW~Vvp Mwe0_r)yEܳMYV6u|58qZ /y_Ly.а]%u(1K uX[)oZ#%*()L w4Hq}RMWzy#D/pɜJ_IZ{1م++al7:]Gb6h&ymgoh뇲=i/hmCU ί7cR rQ.vs-M9K8;}`}ڦCl/cō{C~~Ļ'#/1` vʩ\qv Ԙs\qL7Ex͌uwgYHT*B#% \3aEfZ jб$]ZN)ijr`/Z6+!lBxg7is 5t0]kSVsM0VO:Á\}οj2xLaW MQ {}=˵ë́bY5Pς:\rBi1wB>Pw5!( $yOie,̬݉@(.R)(),k{{_BVL|P#+}_P\.azӭ'+-_l38U3}b8v^c&-}{2 DžilR_'Cpe9ova@n^^ң?9;r/6=EWB2?Rg˃8L ǠuH4=`wda4MLBRf&-eW%ovTˤ[Ax,NJt%N咒XbW7ȃ@S$r0B`a ^j O?^3{CN|]{peV\oaGouyDHEwzGBuQtmYZ8UC^h=K^(6<ƘNV~6|$Fgfe'yU0w51l7[X<S#S6F..߆fP(;KJck_ꮩ WQ_,~L[ps,@ sKsÁfackb Q0 @&j8$I` eA̼A}7WLpg^.jub_g 2pۦµn._H[gXZLs<h v78<=CHgov=gav^<؁؊yS%!I^0FDos)o9 Z"KQmq3 w*XoqcAثٙ!ˈBq C+9.gȨiiRQ('`)w(|#Z<AT9_2x9Yb+7`TW9ܱ%:kƥYT9-oV?t=p.ؤE!SZ^3n 9Ri~C DCmRE}kM:r7g!" :3r%?PEJd}ށ4ϪXsE׋Oᰇ[K$tW\o RHNLj~,chY*C\YI X&r.#ڏ3I5[!]%6{!3dG%7S@*pHQ¶\)8JD+8yA.7dunHy3ML p?gιGO+#䎼s˫-yݞ=T@S_ez{fr[̈́3vÑZ{{-:\=$ָFVc r孊VvQ|]Sx;S kOIվ K4,\0g>ZRNB-),D}9yivVDX֖/Tգ1]m!ܒyfEF-ܷ n]: %b ]bT/ɛž 5W'zK(2"'F ƒ:U]ǿdeQ(`EV4>ZΦ[?.OhNڊ}!kx0^tir^BT}CpRf ȷ; =|3Sd7l&Э$WU˨;|^I齨U T:cnn|uYP7'&WZγyD2y0ݗO܌0 Z̚u,I0=Z;vב-1r"螠K}pOFxSҕB#)=ZKiBH?g[~df"^EAQ5 HLCdp\X>Ѧ+K<$}EAt)B|(HeQ{퀢?Gfr~u62ӓ }W;+Hb'ZuMs*L;:qOg52˛pPV5`b-A<9Q"@p;aуZJo!v A3d{eӝ3#E;jT_莇TdXcQ ـ6fD 3ul_ "kAThQKrV>0T%@K%ڃsی.vy08d[R$YB2˜-5ʟ+b|ӈpUdFXKmpqjC(_`if$n^0"sHȟj_M찠 Lh@vh|OD;)g] G}zf!63HO\[Q,IVV0+8\qNZTFxQ |x?vB5<;Rߗ}vY.K9XK6_,#JЃEX]|= &LCo^!AH$587GWw!@px|+dld<'GHrrmmhHۋJ`k q6E1n]ѐĨ{.F,/Be ^g:ClF { 4{#R  `DC/  9tK"~%,b1_}*=+S3n Bޚ6Vc3h g!.ztґ҈)R*F^5jcy(MSin8ս$ ]fqf`ML,8nK*G❬8dLMp$"ahj$Xqȵj+up9Z`}6RSv-G#Sc8#RW4.ԴbeVLB/֡rueH$sģ!8*A3~S3 8=ɚ|5D4SC7'kdW-^d|]Ag0ƹ5oco݄.! 1u׃ a!9,͵:M$er v[m9Dڋ🞮` $M07 }dgNp.کL % D9κ쓤7$72;SM^Ђj20wH-oo'D%=#7 +u&ΝNrB qگ:uZM:t٢[$-5 ,sτi 'bm)" ܡIhOqS?L=t;1ijYm1Z{;@.ցqm=7%ͤJaZxVUcW3*_KU8@+vWw(R#猜j]l3Zԓ;~3O;@T/Q&Y3k՘ ͌އߏE2?FX4x3X%)#ؐoN@7}ïc/1#7jx@A8 >0"15^ԧ}P?2s co9! JX=*jl[8?ʮ3Cyܬ;x~X^ĩ{8F4`L*Aiyhn2?0-^X)N*h;\vH]'[a6ݳ&*q"LVV b{QA'Z@63 ۻ (@Q VAL1 @ӯS/ʭ @f+znQP5}GߟLhbBDJ‰^>3aMFl#0џlt-^X\ʍ QfցM%RDoqnG _s3ˡa]CT!IW"RiJ^KK ikɲ*~ h,8|X<-LP7o7A\\ **@Go/l֘Dö] QPwĤd{ePb;ZHTI~s*s3%TeMdpGz{2m2DxJ!kr//fBeU d|9oęh, >+ӳQ:jyc1fK͍}ZʊX-lFb]j++RhGƳx>HZ4;\S"Iعe.R5lՒBlCױ',^+l 1չ߁/ leݐ1lW_̉ dr"U`>Χo<vpg]RN{|crdѨLl@Ɇ(l {Yxo|*Ƭ6MZܲ(gquN𰴝ى>-~#jkŢؙ+>3PXܽa6U na~쒒Bߤ6>@ZaIuA||챑e7r98#KXLĔ hp@"龤(,6]MfA.O#M'X<k?5մ-]6GxHF>- կI.0lWA2 v.p-L/pTRSZ HEۍ0FP7bz{em۠  נG%Ι7 TT;S쾼}HqcY7Å#e?Y"Yr\Fj&6i_MR iDIFѧyPi(B1bbHpFJ 6aGC[n)/:"m>@Vռ^{%`K&OA:-+yWFA`]||WsDsn n%mKè&EC`l8`ź_nfzNw!O"{6h,U _E-Z(UU+5" Ura/teڐ!WEg{HSGkzml8.]~|C3%ƂB5EHNIW2Fp)I`#N"9Z{ 1oIrDxJ W\4Rr\V_t >nv il"6?4?"@] !]gi7Yz٧ыu~_8h\0N-#QMJudK&PGoB%Ft w 3rYX2olCmPyM%,?V9HGf*SdiV44&/#`ci\_ ^S,oU3sB UgZ!~)o^슾xZ,Nw g+osC%0_aHΌa6kݓ,:7r*)#L&J B?4 Έ2Y]82IU Bhyg]O J`M]Rk2?}E%ĪSXި!OD5 BvbkB z''ئ~ʖ1qbPWTCq\j8X%e_DtjT_roט|U͒1IZr+q8t Ps22=p>]|)`<mfEԂy[;Qg`%) (QnňSw{[ f>؎#LrO!#Vo^ɺ)5@յ=7Pzѓj?ۭTłz8[4{5! Ŷ#ڸ}a::8SA!D9D@b#BB CюOG|ˬ&_ܾu?EFh.;o@5lSUN`оۯ'\O)epV8T<faj,Xq߫yQ_:ze}Y9toY]+7^:msH9[[,ZȊ hOZw?J)@Vr|/%Plv"&lYElt0+Bފ~y skPKlD,Z80+bP_`(v7>gx Vwyɉk_js}E4sgi>wnt\kvDܗ:>H0,lоq6PɦF :nqĀ 7fz11187w A:cvjCS c,v˅"NRk=]E0SK\SSTGkl"i!TD"۫+>ܙsN§N@$ӈsy|N]Ӡnj3#"`#bc"J<~5Һx#uqy>0FωLJ͛(>YIaH`ݜwKNr{}rȽq޽Cgj0"7_nF,E+/P)X)od:X+k 0-Z^wws̠sA>7E|~"0>ABREߋzKU`aLVAڶ{ˊbzn Z#`0[W=s#C5j^(C7sIu ob7k *>>$5a,BYUl'Zok5#6F4+-MwqEQ8' $z=zA _ #ijYnz~{$Ta soF٫jz/hZ LᔊO4GvoNQ_*XpLvDm;8i {}A>]yAkOwtxP"9GdADO%cfA8]mW ^?o! 9 _e]F9^r'$'k!U`i砮Ur~;qج'z`ȫoh#`]1d7TrWy_ϡ |-ӳO#Yc;V|(s)Q]_r7 -?OVu n xT(^&hiͅkq :D#Qav-KБ0UEॖ A(דd>z,TcZUx2^H HܫCuܘZ <2EJSA[^mSk/]) Ex;uwZj,[hG#:S}V.K$xvqYUHFYDjN>eN&yZmu+/ȺANJaA I%7X0i2(?߻x՗ ,,hqw)G \O\6 H܆A d(c }\V C`oȻ[,y'a(^=1B3$Ë2w)mj,PWrW0T8 ˞Cj?v4k8KyrVYkK3MH er< e {v.&=k}izޥfȒSU΋.$kb|sc 6䨔]fL ǕB<+N&çwZT3h<UJp4hX$%Uٲ뒶%E*'[,O%ͭX,NOQNLs;w~(cƸ8=knQ*t_+s%Q0+UJP KqvӵLK="XPt5bxZMkC!񹆦XW~.pg6j6˫R$_("Cgvʦ8d>#Ζq U)(qY^ v ʭ  %J1}@O޷ׇ4UE놃NJ~b7j"6M&ǐT$Te)t9_lU䏉#U"HH_:|>sgK90i3jtN7: Rb*z 1 bQf[2FMpկQ-+u{HFi"tbwv8nPl1z:JA$֌@6,Cኧ&8:tm6ıe{CNd-:(FUIx̪ZBMN$\ ?֓hb hf3lA;Eg7863Ҷ/FXh3mBR>_&wjf[oᅯ{[@(Gj3- <\#'~Xp?F:?h1XϽ EY s겑xIC1 9EPqfQ}[L$frM`cBJ lv&4[[9K%!fs!Z@'ٴ]a۸z=e3f _&Εm@-Poo !{VW'l^7~̅Z?]R5Y?|L+LLSbd[.tguxB ո|Dx `b.z;Fg^nM;-rDiㆁG_KUj'z$ѯ?r$';hO^H8p?cMà#ņYNc!2-/}1eIEgLpWjP:j:wWe8$sۈ\{+GJWNՋ3Ӎ* cV5Q&dA rqΚ`j`q-e:c ϧ 6;Z{534_uQ ~ZKD$of!=Sne֯\BeKe89%wt*(5bQES`@h^+1XĪ"!ocQx F&tfD"rލU·BQ0\'D7 gTnބ "Y/i*摙yx3cr1P?hxkңEG;e @(+[wv]BC-wfkY/.a(.2;i2,؍R5| k_ CGj#2q4ܶ5mlc#i8Zcyus-Vl Kus:AXbr[r|;#3J ԯh G-u #Dik_(y"`rR?Jd~#HqL@`X8ɇ,XE C\u ,R!Dcȑ6.VaCT-bRY[H!T˃c8Z^.R-Gv4%lC #fa^? X_f_Zw\*n*~]UTi0MOs ˔[ߘI4e#x9 G}P5=X\<8AGn* L$耊[O Aۄ3ShWc(! -w.$&%#cߛəj֮6UF9eTR璵~z4"5`y&l ;e fh=*JkFq߉IO4@:Q|ʝ5.%I8zqEkŭ飃UTwHHwg„w:# Y7fء`t:qP#Sg3u]Vr6lΎ-M 4:|-n -x~nѪEUo&Q2'84!!q'i-X ?"vʬPJWJnp Xx!6<ۧ!}C3-P!L Qn}EQ#6ʻ|>njy{VnI`?<m`MPqwpS=,ze3< X8%jգJV=sav? +46>qmb;!xbkVSXdB.mVn 0X5;`C/2)~l@&;6KC;%fW]7ܛ Gӑa6&y]mkZ)L2َ"ɘ+/%dxT M˖:OmRJw#AyZ K7qGjd"eNyWF A/C-:\P9'[*)r.} |g{v<"(!ؽT]6+66\35X@Eiy_VeO;Kqgm U2 խO7]Y$̙"tO^1 ծ\I{D` FD+-`O@RHAkPy\]6RS@?H*if5 q&ٮpZY`?IȋYiYR#% #O:&M[Jq[9U2NF46PA/`JmKj/uc7t0ñ߬ Zҋɼ]\3/8bHb4AkD*0f>Y]V傍 cÀ`;`w@l␒CjMµ:6sMճ3z:8h{DDw+X'+4@>Y7d䮒AhHVRLp_D[ Dgt0ɓ&1!1!" O_nZI Y>E$%PG'W7qmT? Ӻ\A: FIxJ$b-/kt'+A^cy=L'-j>|1߱QVS\rj0 >Ζt8b 7Gҳܯ7ϪO?0F w;M8p@/f?ZUB$:Lrv}uGSVqQ̀?PϱƇe1jj[t@=\ /y n> 1!eocð~V{|w%VnӉ@|+& ⥴|+S΃ي?&D#Z և"!Zi3w9Pֹ\ίk@)Y8:p_)ĺ px:3YrJ+B}B4_~m48Bn@bѳ3 ش4* ktJa^(,b 9J9:2sD~' /AqX/AAɪ;k:L*y6S[ŒGrft*5Bn[w>B8:|^#xW=v3G3 >;^H*k1/赔 LDB Ԉ=ZAHx1A}!mf kYU0E+;vp`NBE9l ;vc5=a{[ϾģִZ5uh0*'ٟvf_beɲC]ӦTYxY[d|ohvGgXs@~nа)9C, QC@L?lw}Ú' ƇD'K, cmL8E<tKVNxE ʯJ*ET ~ U"3)w)`G{%SDY$N b:a뛰(ߺuI[tOW@qg,ozu]'Hݺ,}]9*`^-Mc`^-T? >VMc_sDB1Y(Ep|c%gP;˜r7{˽ ĜEz~E|q;Mvp]mE[]$ts1Yʔ/veM1Z|<)n8ͱz(sg/.5 &?퓙 i쁴isE^El]kg M O(omt )X`I&[?}+\6GdcyvX=);+%]va$ḀQ 9?o5 ׀!o ;q2G>\38H(` e>9"BSklAݍH"Q8j{M5;1ߏ9r> Xb*1K|2SRJcZ(-X1z6ѯS@E'=#ʶ[O{E]-լp1[IfD7^)iͅ.{=4}'`")z3b| G4.iA`/23%:иZ;wG׿h5xc#RUm嗲4Xu]_ݚDߍC "hDgbZ$$fMwE>C&Is@]`q|dS5p8WLS+ǖ:ћ,-,n e_m ˆٰ2.6`\!f.x5З$sEqNn. -u,SPi0ZWwgh?S e1rʅBCy k)A BRF8=x~Vo-"P}`'\CIq Oi_NdBǏ0"N"έV9X}On켹Z,2׆A ,Lu*L۷^=oASϛX}s}ʁui=3ށ}Br3eM?9PN^kD}8 o%SEs"y|0Y&Z+߾P,3co GC*fVjwt|ДTiE↞:nz '1& װlR΢lhl1MSMi;H{yDxQUV*!v P{~H^6&NИIT[?E0ιNUm8{e#Su`5B&Rnp)1%^f]x:pK]ꔍ(oDr/0qTH@5"YM3zWaBYvxeG2Q0Uu' z:(.ב wtȖuS}vamQϸk`:nB7@| L>*y'BAʋWeIo$I}%$1$`WSq45f26y& |n8СN&k҉T욮o=8YO373!܇9SiVwik?. : ;V M 09@@z@z3z<vV=E<:C 3O6v' bpH 92^zݛUWH>Қ3vح^ $8nk0+p~hOhgt%vG% \#{I֘qG?r20_^t&>Яz M+}NJ[1 G5_Z@}O.~@klYhNըM~F,`P/̀'(syBs;=ÎvVnZ{{b xuִ[tS6Jb&WQ\dkd1'`)= 5z4|r E^sO )]6kx᮸44#:399*vpdw Vp(JMO%PGk1 .FۑCs7!_Τ jqӹ 2$CM! 0!R?|"*DTFp&t@o$d5h6}=g}G0/tMd50;7ah8٧mD1 #CFb"<БHl*_CA_#$d0e%]T"AU`xˡB#4$6(PhN 2tJbL'%JWwH F^,"v)r!ԍx?rR %xPhi'g9 ]?͙lT=?>-m"4@uF)#HdAjG6w(`gL4]+>p1qsŎBA{ ܽ V)\ %nJBN5l(3qSNϯʏ¡@V+>5ْrN$uEX7[#^BݳnyARȕg@L[(u^{ou$KUnǎ} _ cPw Ij oIJ *9IMѴQ^m9nmp~빜#`ѰThPK;k XSs̒)P2Yvp^F[1MjŲ^a*\,XnKy;h.@V@]d㡷j$KofA湝WW2>fTձSJ(d6{`ɳ} -sfOΌoRkFYHCG-M+ ]s^f,16֪zzopEwW(yA6ba/Xr |B ] I ׵~M |XY$1}:?.w| -rv,XXg ~cR[Ӟx ߹H]3$Ւ@XLzEZ:juA}1#=YI B`[W)҃Xw Gt/O&BJ$j柔o&6}b<'si,[HU4Y8U|ƨg9(bnq$L#ڜE>1e$C Y|^.(*}<{OV""LFl>9{9n+ٚ9K Ou]BQ<\mVaj(2 (N D4xVzЬF:bNbV'%\.gB yp&vF琊s% ?+̚ L?ሑMJj8bs>Tu.2@l'2#C2(*F_U078 g𵮬'~ rZ; اE,wQ5aju0Q"AS> 6LD7GS+ZLcSWxVL\N[[Ў'ؓtHQ+\,ExL͑80I)|%ayzMӔs,b*UmRA x Ozj(sy"{keKzL"NI4Dqp%"SfIPliAʣBշc3f8Mf*e$T; pLupsjuwAe-8'G{Wi=5EgEX,*V0O8DUSQqMnLsPu8{؃NsZvϏcO=o2GSRQOvP"ba6Q8O^7k) n.5xO?]vam}Tu'; -'fWWԫTp Nq:gpDkhLt|5=H6zP:?Z>|kKOz{nfX^6x=TYj,wNNg3nI)2$7ц.tRbʮ]3+{d`a[wíUDɔG3"E8H{%-n~u]\lWs9+GLl m 6XaiAɔFƬQж.QL5;\ ?so2O(˛n/+^7[\W5wSda^lsD14`,/=Jzm=-5- c6RjY i۞λRDpo-|㫻17*.h/_@tĎ 59!-(hjTn)O'7 H-Sk ueanݻ?G$d*%SMNk?`/?^f->(mtL3y|(+zlC,5^HUgEJ1F4n ʽ+_ R@M="dI"ICP\ R=YYRfzJ8dT"ɗ)ƹVFX 8巛vT I`&LȀ^3N+}ueUXM2}U%QC>Q C-O/hO𢣳ҒD)׏'=6E.cq;dц7*_գc1n5VYkh ''lfߟN7wƳ;p1 ӹ%:x (nWr4^o+Tdnj5`l5U!5$ = %#{ٓt-i~Xog{z˘&sIl>Ƿ):Hb~QLwLyJ49\ÿ$ +?ߋhuT/{t[8|6Wl󇩣mЀB 9c.r b(kЍ;X ;/CBl(Jr,턐lDpGTqFM&Cy&ՋȞHϱCCHzI[KqdzYzΗ-;$ǓO`:#%7>Wkyk(c}[&H}Yi9"AS ۘ+^h1šYe7FwdXW.Щj(ئªz:)ؿ{\|7d<K%3+5yFuQW7(8vv)! YڃaNb?'9=YXQ2XZd 6 W:OQApVo@$ ^ G5!!-jsT hr-:ѹn֟ j5FX2) s 7B tl>T ϱi6>5Ŝ@f 4Zv!KpXT2sy?~yG,\ڮP4x10,.l3G3,|i=Id믔h ߿~גpa-׷d>"2Ҭr=Q{e ELf܎uV6Ӏ/[0ʓ? IrH˅6x'_>CqԁGԭټd1E1x*fQ* d,/"8#%$1$A\wE9DOnU%9b"#FHeӞ < K4Յ.Roy/Rq.7Na4wTm ҡ8cB{-%1%i(e钮`>=&v޹YQ&vQ;q%n@-`>a"], F90pnζh㚧̅|FK&SAB~rk(CG'*?1r`iP0z}EB>.3ƽ R,%3>QS_1# ml]p1}GP-K?YQZ,& >Y8ti;2=W]Qo ghu oXf\IYLG‰:I1Y#;}/&htm"2//H~?QO@;#oϼ ˂bv#2K dO-~c&S5ѵ[HlwwyڞM8Ėp$@N19b"Luw(*pَ RE7k[OT'Ytp;P&DtۛC_V;w{S[ՙK|tXu-zB c ͅ`^aR#ߘE=YcK.DZpvLcjr򔤑kV 2mPܦ4.;; /+A \Ru =ϡq`LG G@U/՗H> /3R̔0فa^UgiО>h|\ .n~F#l1.v/-l]Dvo&``H J30/]4Ӭ }v􇥍_JtR6EA6P˹i"`%( `G=^48[=;n+DioN)/KEGI%'=On +bў  H[ad8,Է)) mϚn!͍BnIML) 8'p/Yst_ky .gf] KU07 u3Ds%WD*AiтyXK &2,rN, ɣC-#G _7R]x@9dv +؝O 3c*rӀb_NImGmw&G.K %f!i4y/4bC*Zxywi"*@=\`B[p1ArVo ;W G^pU4mOʼlwLOz^zZ `*|TW4[::{'lh%5Jok>gh@ѩ>6_Y7Ϣ#9S|FnuBd6v1bmjgilA^C|GWw}[ĞH VP;N  dGդ["e) н!ePK= vANJ-!6QqQ<كڵgܫ[[pFUGte -ts̔goD&Ċ 5ڧ)'mVK, ql#&ш y8NzM gJL|)BzrgG}moM5x|6NRʄr|FRBcddt}3jĖ6yQBοa^Gkj- 5iz~R8*wSK<12)AZ@%2)o9WmflYtzBH\ )X G=Oۍi? -˹ G)C"}q#(GY -CJ 5A$A)Y2@C)CY;PRI5ka۲TN !si/6f,GkwIr]S@_䔛1"dIB#wr_/)Q $UBwRyٞ?xH/ֻ<|}|O)ۢJ){jz=yHH``u"%') |O=2' 7 +!4lGPKsˉSzO+^e6g2.\3Cy̢Z%$QB^(p\^/eX) -p</Ũ?'gG fr5U [Ǫt"?KpG'{C rҸ Vޓ^6s\{L0?&{U^~5@;|nD;}fݏxf^݁fʨ h};IuwspltTZVe &B1 rDp/R;S;f6QɸP~͉P"p'd7 Vg{쎎&s̏M1Rk/ӗwMZZT 2K):GN>il < Ku5(ƳyZ*'gÎ26HZ 7.-*q_8祖0]0'xX댦q ??>I-ZE^sgZ *qcXܒ3k&V @*ز9*˹!Cxdg\m-wNb5[gX{GMM #,uz+a-TlmVQ tJG;Ӥ̴"}!AsYKZE*у6KˇlX7 AV! y/A)JHępnakM^2(s6_UQJ_Fk%ZH8s5g<ۣy=_,eΡ;z , 3=k8U "(c)4L7dvV"Ѝ޸agۯ!=kyc#w:U@!kV~n=]Hwl^7 nkn6I 噐W<%(ߵ5tܾ/|0$CS *ghO=S~9+W h2|'%Θ vw˷ׇp(GJlU8aN_p&6O%FI(,.~@7Rꒄ͜dYJnRߟPs?@sʒKdKO(@MæKR~A aL WPMrG*6[[eqߡZV"%A F.a 3xϵPm%vޭ9%B(k"{ 3]&:ظ`_CaTiClJNAlQ^V^^ hB>g~D6яZXT vZ9I^,]X4]Η2xK"ͭJ* W`[@wxf ߙ8/$۬tiI$W=~b蹝3I%_%7 Rle9; 0~-l%psqqRLbTo%$*Z<#c}JOO pPnd ;X6w#}E7`l(w8mJyA n"g,2Sf=`vW{Q~CPr8mۨ#7B6𿨥3yYWmj% 'SZ`mR:; ce8I9(p~<'HM~z1suX)R"?rĂXݧ ty5ߒ`icmāّ~$YNq|e"s&t癩0Lĩ@.nBR+v,oߵV;s/ϛ(9cRj-FËt즎:#_8ʬ[R_W%j<)ZC :gǸQA<.BU@Mi,Dؖ }Ca 82,-<*V?n!ڣm. "]0]dQXΥ#Sa fG;:Ӷ|Fa;-("1ie -.U/$U$3}n FnHiJ=]NXP 8j$4#E;hG΀P$}jSl!0cDsA>VѯT7jRoE!S/MU=vFCrj#B䜼,#^5Oc?ioKIȞ *H]3SHcCR)&%ay`Pٽ=cVY?B!zd bѢ>)<{1w@*x.dWP[QL޽{2EX(,huȷd'v+:9J`_=rCk08)`XՂP,ԅGmsPvg2YyR3q(̽lg,&tQ"*bC:qvqx5]k2fq 6+JYvW_dt^[y1iP$G/9 vL( yW\Wp6 mPdG x> O.V&$vƼ=WqM!B y s ځɊh: 6H6GCIP1ND\Qj*N# PZA*s 8{gg]g & &bE"8ɟ՜UN0>˼ Ǔa:Gro_9]̎B֑ Ū w0j^AώJ #Ҫ.yXϻ"[A>s_)炾4YK$^?M$v}KC-/1(R|\Y=dT #;{ĜfLTu\hw,wbOHREp+1D6 쟆A{q:jtH N5@XݗU_9fk_}ҹ'z~\9 [7tpYp+A͵mJeYc,^Ճ 49g'S~~)|(4?hfRH}xMz%I lWj㥢.1~ C%IŮιӍ}HTSMPloVhO)K;xB 5:Vmذъ < *:xo_ E)3/[.&9g+P\?5kwW-s;cii<JX42n e] iD<6"}cISguoXPC!!z_-)EM7X|b[<q2DNZ7nPWϫlDukKiOiV}ᠶkgFw $o_ 0YTEM`ōl~v&nDWxs'#n*{x m"~?i{AS ieO]a!HkB,~"Q#4 x58FWfaIU$9*7lvYue$۔c3ҳ4-Go){U@߸dQѰ3L'@RD5aR{.chYˤ7'w/ë]22P2  Ҹ.)/[].q$0pO ʾ|iϪԊm;SS\Ew[4۲MvŶq|KF).xjFV" B.$G&]C[k>ǶTRN!OβG_ڇKRΪsUL־[,zy~=|09V'-ԙ[lT+֮[fl/a92 ojwyui(EEc6 ToF]dH'w $D7a&~`@C~)`p\ljˤ14'GQA>d钠ŢΘܜ4WuժJV7(_}ӸPkE뢮n*MluKhu0lO>xPmI% (ܯT'>í1͛Rچfh'$6MiHQ)fS[iY 8yc;kߧ"]u[\dKܳa^.9/:AKm>7GX`TDQ493hg3-:[Ӑ94f3o*5]cm c+Z6_+oh&<9)6445TUӷN H6ÿ0%| ^34bE@l&Z4xHbۇ'yz|ԍ?XR.yXA:ʭTs9p\=m}ՁD hDXd4R4Rʭ."T=#Tn`fע& L]O3\2Ӹ>;G!T _޵bA&"Iyq[S]|́@Ұt(͕X"SG}'lLolZ=E2IT^ Ͽ?7gg ,GF%6<MsؘOOAEǑXj!Aq2o=~7 *rz?+f[ ,ÎM1sU_I݊z4Dn$F HB۳cJ0d{Z*қ#&eEe# ({+7R;X2]^ |~HWXL<!nnkr?mn 4s5mlL- QЩBx6QvXv;?4?>h7xs* ;r%j*?<2_!0lL>ڢ,l3K#E3eن͠IM D 0]¼;!B#l#9z4 C@PJdcAc.'v:Wlv\sf ;\9tbX͞HgjYxuy;wZcg>fMuAR:# n+-li oV~dE : x[36ْѕvԟ#Sl4 M`.٥xVc~NYy+HǙf_4Byqp2 2lKJ}J֖Ǧx06p{1DchLpc_5)== ClWQ ~U2.gA E;Zc{ҕ)~ObX|7Eb )y gz$tv,wgGO}v?OO)Qx/T(PIibWTbH߆oytQ}B(RuLK鶣>Q.WLK=*{d2~rTTe|*6`EZ.PAn2o kVyo(%&|4M tw,M@'ӂ|mz[F[ /:j@@D${i8_Ͼ+ci[Ռ9BGYkR:ǮXR lư-@<*5"؟4\{)H8@LPŷ{z1]f94a,=lb^|QC; F 6aW#B2FYOufX&*9b#*jE<«:F\iMxOc{OxZ glޜP_%Fj |WbWb s k3#[)Yh0thΫw~A|/@Ŭ0zz3"Td41a453xq-n'UːUnrCPju*>u–':>3}yN l` yiڗ# Cm?Ѹ~rm$+*kfR`$5lxm V!~%q*E2ccP)ؒznd{xbɌar p4:|a${XHmZݎͯxڪFGUr[>vD,@wJU%R+OkVTP~޸_^ޚw]neB\uh:.TlH1L;Ap8AaHa+lF6QrRF-fr~jFDomkKegԐ,.A厐h[䟛UWLZU+cKJ B{h}m;<>rxbb*>H2GÎ앁fXX|omzQi=OQ̘>;Gʡc8[w!Th/ӈl݅3+sEٮWbmGX!.SҧEa7K\{nJm+wnjڪPeCjq9~t]8oM4\!::9? 3ЭNnؔQT^RdbCU):?l/ ɇZ6|c/>+z/ԶވeЍ}oDҡNށw͕ .Ͼ7!|&zr KKe08`!,U8OwrZ"^F8 Zjv%Ogh LlJw苑+2i+{7<z<~ɠ |εzd!1dpýᷧTrhKǙ#̬@w 9DcezIe h?jHUY Zщ@`CKfX:AnoyFa]*(C1 _o0H2^hnRAU]U.auOІME8$O~%0cAvBq^FxPWŷ½ckBD nk996妮X&B7o {th0J/'Y(c\#gݻW"oOOe4ly]18J&2Dzp,pt?U{5yz@&I];lpxX'GD <(D2I2G@'л==ޠqf5?:$a Ғ+*mm3赇{X'#vDbՑtS/f܏zwC V^` HyrJ곕ho H/lVj ?NN*#)DMۑѯ  7 F7bFǸlHP:gړz3 Y,p4wS IPv,BIHN^ y,>tvo T6 @/}= aTK?aL^x]8i?l+?E0[(M<!Rw@Q=KI4eCN;q|}9/ږcΏxrEkOJڰOaeq2b~K5v^QMVKծ9+ >yfP'^ 2Ie[DC ax$>zR3 )X:jTL8uZ `MXVp萼^(ľYGў9ʑ]Xx9~&ZtzQpX,w{ҙ3J%GI緉ZѸ>'j PZpOC>v6!UB Ѹ%`"jsF>8DxΏqT^Ī Rfl gif2m$sQ& ~ r[: L\qC5 n%S :8lG̷Y2k*Ut:&>#@VgHe^I Aj/8ܨ='&B(;F3m&row5&djg6IXNa ^a wndv-:x_, Ҵ5|q = KS*.͔ ; RV5cuNQ˼gUuO +Ge,0:ŀ#wv~C妬vfK{}sm/_,.i|x xn^x2Xcݻ2uKzSKt1lY:_R{, ׉*w)uq#~%c&dGbPEԦtYN3,:?˲Wj,?w8bja=; 6AOܷ)L[|b'---6דZ2Nニn'8jndZChBOCwpثIFǖpÑp]>}~q٠V15q\ʗ\$' Ϝ%ꭽ N2u2e\%N{@Y~$4 ,cW#=K K榎`@yEv:;AqpҳY@|RC .2ɽL4;h1p CFWqH~,eBu4'1PEoMޜZ _J WƍqV\ =`v+$ z u:Y-ȋ$s~y{e1Ƽ n3ab;?开###(UԢ>V>=#,}2|,dԧG;U&)gJW/U(@qYT6`96FB>c{s+LDQ֚۟ͤNW(v.dκΡL7Ge_\Eŧ-TA#EMT?<#^մhηBs,77aQ(azRTPS }T-Lď V&wFFxᣟb)oDp2?OQRpÿ;X և|6L`Qln׬/F55Fa-gy *DF["=o>_~mAqOLPqlW RN&8p>6rt-@gפ3ۂ ͈g]i.`yqƏ.( dTPK!Q 0_dέh˝-8"jKw7dc2E9)&pŧv~_h`r'1TX>lsfֲ%Y:vp27LMnU:8ivJW^Τ@C5~Oe@2Za+:roi~fc1<лjGt:N2+o+ج@j@şqe$Aؤtlu=>׈o ek2R}sLȦC6&o\xN4<Mrd+`3'k_JֱMX;Â~yT[z{p.]P$C8lf{Bfəz7'BӀt`)m *r6-ۂR#$z EypңvjP ]3_mP޾X!_*\ <4HojS>:~:.X0+Y,ys͒4n~)1Xr~cQ -2^qp(/e/ˠ`l6ٸa0˒TCO> `ݪ'D۾jRHz`uٕtE -!*>4*Mx0tkY,$c73E (1LKψ% GajvuRh*.%*SKNhv,%*Fp'm!ON ^kⱦ⽠Hh6<[ lO(=%%X'B'k'O{KK/TIe~#ho}85g)\_ץ9+qm\x!iF%n0EIa^v&fEw ee-IqJ֗"VZ8\!IOd) &($Is!@|j=*@V  jTP$X(v*Ro4x&M=Bk3kPևA܄G$N)91oK`-# OiioF oU&w>\1:*brN8jg&s.B`܅Ni(J: osm@)Иc nZ{Ǯg4.25y>zxw-CR! 6_DV?ELC.r[rn#H?Ipd_AʘrED`I=> NJR{Zc{|Bn wG7VsnGYiJ}RШ:XlV,t͉e-Ny1@V(bK&2rj59}$&^.~?)m 'Y&[3leѺkfs&G~r8ڏ٫}mC1ěm63m9 @o4lp!>d:/[ۯUfcpDJJn|QgL1B++C厷NJ|P<" &rʏCfRT9%k8[^Vjp( 'bk8^G}*օnZ5U0kuRhA1G&=fLYLcǗ԰?}ĥԅoe9^KPZn KD$-T@jXYu+ {H`(K}.{ [|uiz:x<\29vO6cpywėiTpBwx" HEfkmb;Y~Qa1BC oi^P-!O%L'e#|ZҼ97tX4-.KB \K#_oQѢkK{Dr PNr丹9mM8'h(kE'޿4-3D#Yvczq^i:lv\{d\Bi ̩Neޅ,Ny.@Rw0fSAlq bc%ih;)Z| PtQ3p)[[y;'Hr+4+A޼"&ULFy3&frҍ%ߧY=bdoH+ qݓj49%'KoE,~"s#zU3$})u7[鏢+R=kF&,w|}yr"oH&C&7誠y[Fq*/C !iRNVpU6ehi[ 419P]Jy u2%$ P<4stcN߳6jϱc-+Ķ0@6yfA}PT ʗnb0>z6קw D|҅uPSX# 1p}4zj?:;5S«ÅC4]ĂqUz/l X6C@IZv l8$,+*j(=>- ZЩ1/0FY[WFo$ru%5D %'or+iDddnj1Q'DSSH٭ҿv&>:Qg"ō0h:KiƫrZW=lrUn+6-r7Gu+/f2'Q2zrNvܴ<#<3a[6ٖsti4ms^N^0 8kDz399+Za9.[RV:HXs<0cDw7# Sx/@U%d2ƈ8˽$~nB*fz]0ːtyCKF {/n#񢁆1ȕuX&)k#FHb3YCC+V< FUz7{LtiD`دw yH IN _r~IH{  {{}^UZRD"rNgxOfeZ_6E؜2~GrNZAGjgVߔIA}26M b&W0>{7eHi^ϖR.94m)J.Ri2j0n)oHx 5MzzP3W_p2%8ךT2UMH:4L]kkţ*|hl hMi@rT3Qo(<4_񥵁-al/h0 ܅UW <@kʡ n:JT0a+P$ ϫM.rsj-,pJwn.Զw&GV񅐣,nhu(;G*wJpՖ=cd:W4'R-ftu=wbg\ZxQ&Lk((l`:@I~Y@niFf1mkDNۇL>Gr]h kE|ۇW;f!XA")kE" Qy{Nyڡ.TAfTJIx. T$S̐m6o%D b v)&\Dꬢ"D#A8e6FKg)keLI+(< 5y(q dA5<4yzTt4(kwrR$ڟe10n]eVgoˀ'<ɐU{ަ:-Q %$ =nN/53Ln/: qKwÐftSEC>̀sZ3 N]˛xЧo[wg~ ||85e e6Vb2Ι(nQ!t͕!(j,ՒKisȴ3C13H-3b\P uDlnI/yne S?<߅zC# Z; nB1MF/wbXg>qr{:2QEp\Xu(彰(Diq8lݥ]IXRn qsAd%*Ƈ<  3nz%1ѽADAҳ^qIn+ZqN/+Yfka'M`›WWBKa͒@!^XW1`Jn-xVXɴSX %5|RNUt`5g|#+[OkYX K8N;,`@zlO%6ӕЊI&lͿ5zk.#@)92ř_q7"5`&1gw eZlM0~/9Sn!O_+# 5Kg|07#$RX,iS#۰jTrH?mDuiDot Ѿ6Is&\qMN$qV*>/ ,g6R>] 9@>]frA}w#4Dh&Q9_1mFнWE.qT\)ӣ`]Dm#^ʎ,@x!vN-a̞Acgt ,Dt(P?Qź=$[v-VeJ0Ɓ b'n$|[ϣܓmX%.l3f$^ˤKQF|Hh~6$uW[Ѱk%? aijTj cqR_QFP" +lP?22F֡i%G"[($f"`^hʕ{~ұ9=[/۱eNiR+~|:Թ?TK;-ӷY DŽ< RZ[Ww#\[ϊ+ERJB'c|IW[\FaB (TEFnw=1y9e~ '-XnZaڬ!,XlNC9x-v3RVgN3 xޯ#uByEO}2Se/hA9̼xZ f(-^_S(~{yPPVɄص/řƓ{X1/Gfurֽm߁.kJ9 #wj" NMWKЍؑl32TPw=5vE ("%+ *P}-Vι YTp%{M.f6`jljYq{^ Me YGiAcM_R&A>AF)a#cDBO!;AP>_GCag&)L@?Fr  tmD(Dt~hj!3\e9_Jg ZTn>:%2VNZ'qؠJdƅtdP^3<`Q>7z%z#~h Ι)-Xb>=#J۔@aC{Ò0Ir1C'e=h6 -YL (OgqLH ܑ%vc 9!rBC9\)8zdm@EpuX|ʐa3@49<(AB^#G6~עQ H>0H6. uiPC·V [ qdhMm)nPqSK(LXEyu$'-B9+ Kmf.,_/P|q_}˱9ɇ̴ۧvJ5nL5q jYݼi?SHGoS6׌juJz{Km'"# ,К{`>1]Z5ҹ/Iշ,VY {lm?OJTjZ_U0a~4tU:%q F)epw({tF=6%51A,]ٱ@56uEй@4} 9gJK%\"ta %**wQ%ʘ#i ?cя-v yaCX|^`z='w&LsT<<_7̚H6%1+ ynqxD_ԏNp2D#ڣxqUǬZ9d'BO5~#`)oKlT%#Yٕo0J2lƵgo\2T#w4s[==}ٯEUDȵ tezRIxO q=X"ĊHa~K-e<"ve3iBbyV2Ed;HAqğ,%@c^#P@Uq{47 =|(M'A z$_`(y;m~<=E X. Z2jķtEF<.;peEm'-ƙؗJq7y~uOsQD?tl 5P׌.nMӕ. qrk$6RyhH1

>ж*XIJ /Pb+BnaH :>M.M4sY! }Dd rx6चju]bfjE&?sbg)R>WunW<'h}!xr'G"`kW m؁x`sLA(И,͈3cdxnOt68( 6gTNb9kHFzU4e}+-%-irEϴ۝7k9 j@]l#Pߞu4F9Ŏڜnm2΀NDo﷢a`6\wXۢJͦƨIv =(H[ G{RkKM G07^|H9LZ9lCeGv5~~Uf%~W$A$Ҷ}$BKSU =x>X-3ь|{NϨqm5?!ZZ̧D [RURz@3t S'BF:Dwfɍ?d^#Y(mp7#嫞sYyg.>ѓ0xB ]0&lHn V ˁ~ض' 2")HZo(:L+ &NB f O4g>:!y=u7-h@`uiɻb%:ϣ24K'ePc- doɫR(Nr%,_Iźlu4FsXg{`jJJy%)b eL+52{(ٴ71d?w5gCl>n)wZX`oD\))(DL*9?+vF9G`aXxfcv r[RrQZsUSxKZCaܘn tcHy.8yEMIVc 9 1TR~_|Fbʟw~evF7)nŕ^{`NS/rN Zpus:14 ur7m7&ubBȌMU ;R'x0VuJyLG,YzmW_L r$tUjpj@NܘF,EmWLx'jo&+e8Uk r?1õCd tZt45rW+~y$ M!%+|3![ڳߙ "xL9v|c*[`sP%Hkxձ[ρRNA T7#w M|.r'fd|w/>.xv3{@NH=Ai€vUpf=%?@!1P?kBky6P~vw P^pÄ?wyLz07y kݬRY|ҩ"Zfy-)0\ PL[,sj"5Ņъ[.Zf@#xo2 lw1^<àU ʼʸo!&-iJ!Ś4:yF/Nx>t&I A(Km_xZQHh%8 ?N?@-l X VsXL,7UM,3Z3PtǽyG ebHOh,›?t+[mbVM0][:C"RV/o]U5+Bd98(vi&Q8MrEmp焞gX835S4{8.8 @+}gQwfP 4 ;=>{Ox)< ٩L5üwp+yڲ()X2$Wfh[7_yᑋU/./(۶7gIc3LAB8旡{U]ѿt N pexacZ|u'Fڈ+hIRpWefN_1u:?.hkW 8SU? $n3vpdOlCyV Uv>1'L8`Lh+ D+ Nr[:'Tׂ׮+ 9iV- rk1H^ֱ`BwnF!Ns Yh<ȭ7ڠǏlvDT$Q&8]PYȍF佰5I xC)鏉g`h6#Yn'\&͒yÅチbCWҀ4jZ7mx!1Aͯߢl(FexS)T(r=Mck#  &x)D%fcP>M+DRcUؽW ~D ~ oٚ)I˜6"A^NIapES2uLQ%ηj=\"N͏%G_$[?Ng`3^^R0p{gcI Le xJc!9)5I.$mO8SֈSaM _Bs\\+B[+tKK ]CHjQn`a#+;/T3᭙mdh!YÝqem6++ƿ VԽj]ϩ Dnfo8 vԸ4I]odHZվCcBr1^r%.GFiߓW'qV-|t 3eFeDf,̈fsj@t܏9@H$ eg!8'iSS,b:„_M* B?%b ԠOQ|dM+X zvSSg}8]Hww{ {'vce$WJ},2Xb!d[cmlQ 4Ssw E<;)=@32~aFў [Q<{k5YF' 9[Y8ѶK,ܬ 񇁻NPTR_IURAQCOò1DhYMzh\a,q_*^̯X~*qg-O9EoJ YIş֮Ԧ8j6[=Q@' d>1]IR'BG]E )_=uAx^Ÿ k!rAR9hYWÿC1)w㍶ :$9آm<ߜ)a\vʵ{;'_]E$\$À/E+x/*#D 4"+xL#I?Ep%RCAl&#lDf"E㒇 ø|1Sԯ7AKs,baIXZZ}um(tQu;ܮl]֫l}%Q4~l-%o& ݽAS7?뛥qILvCRTSE/<9dn%c(`;_}EA'K RښYq1-W<L1`ЩsyŸ R.ٗs­. .;aB.əynřk~ h04X)DXc1ݹ24wyi '㱨B jZj֣|qOcJ z1IWӗ'%8Ȃ޸^19`䅚:ȏq/NdMKzp1BfW}k.`Eg5.P+g?yOf@q|}v(DߩկۗH({WvOc9aF,٨ZJNH1Jlf^S̟*&cGj-CEZ2> >P0\#757yP/7h|l9; UP9߮SK/#4t6T&b`,6kQED4{v" Aw"RfGz4:uFޑtXSJq`e%DF`I$M3_V[p6[9|AdOkɚ&JY?4N*ԯg{`ڮi=X\̻Ė9Lɬ[wl r+395TZ3MIϴ_W"~)gL:yGk!Z% M${BBL5srm8(ބZ2=ẋhmOcu[?L(#ȿ',[ݪK(A64n"Ly&Xt9cq)w )Qo2 M1{%Pevoۃb 713jy)lc8dc$NWGjl *Ⱦչ}Dd}hhE^NV_rEcLMwP^0 (zdonȪ0te Ϻ&+4eN=o: $>1m s8 p :zf&n(ڱ%RoI\LT#ziŶ,Ptqv`Vi"۩y}jrF-p-f&':Sqa&w&lxUedZ`+\1Z MW֛l%:'&];i 0ufv/l !++DYXXqw#D>Wy%6/Gh ڱ3?,mUQѥlTSp,"8nJ2Y _\oT&岗1k{PcL,h}JBP.;MX#mMq :\!Ǫ)?Q3F{i~ sRi4^Ш)Bs#2{%+t>/e,r|v7m!Ҵε³&f3Sn TFjl]*4=buH$)jgic0 JQ2De/`z sNj CMU=>f0:| ye31KOR1s=xl 8a|oG[&H7MpB5R\cF/69^xZy¡*sg[ɠP3{bN Y%D-b4Ka&/ E;*-,?ӟ{t3p`Bdo Y$pM'uWCtK h  t_q+:Æn,I<8i#oiPwgxϨhRŹV1I^n>v* y>|D㾃+s V$忼AR@7|W d98CtF l@wiMðMaU^ ::4T&:Y,~ބg0w-t;n0W]+lRA_!9bQ9AcQHlzga!.l7][,U9WO`cNcUd S_JqGMޡDdžI^y9KU> R?8R-˯^J ̣ΔZgXZdb\2` V (X /3jL,(ZAxSK1O}nЍBCZ!0_Wcg؁l'3.8U+nGƦKzN.U_łxðnb3 /jKv ("K1Њ+ E|LŎnkiFહv埧g2͛{ A3@"ͤZt+,~y(yǍ8x*Éu^wJU:mH`ֲ-jikX\r-` y+am㼁lKl)^LAvB=$ڻh|"R#\[ )/1ʷ7:95P/E0xD' + UT> ;Nϓ84Cn| Y^0 iFs &)44%ם=虼gb37Y _VAp|CuAȚk9@ `;7ޕ7b;qyurj9XhWπ!~7;<%ৗF3.!15$x㍫OfmB܉= K+y'ݏL./_`GUaS(e 4Vv).WGp" TH}L;F̎$|4vd_()g+J |gy]D8)-[ŏޕUnU'QD|>c9dHyձpk# 0TaoNF\E+S߫iAXFk$\81(POJE _Z fcї߽}pT]I 2uT  NUze`jb\$HPi[C]RY5e$"ce✫X1VKq^竫,VNkZL:7c:usGjfes'uOnyb>s 6#8PC`/=+X5*p\g@u Azz8ªP?ëlmh/xU`8m߯ӗ0OҔՈN'hXօZPGIj`M%5ݲIGL3X!VpY`3DM-fAaR0$ &!7rtzo A|$;^TT||Z n ;QTyQՔZ= 1ߙ驋]AmjPU=NCv?/k$C:H/\n9+[$ρF̼ v]0hN$T5S WVkhuW3SlVU/ngr{@٦_m(']=A$3V(_WN!v*shk2(q#r;WQIhiwh qsbCD~v +EƓ K? ۤO2)Z=T intQv3>C&VAOfzlIܥMa6L4< IbAf gx y|rL>^(N㈥˖RI%Ɲ;+~KF DŎ% Mw ÿb#|͞,g{S۩;bSGb;h~ wr7E|R<3yֽ3y$*rvٯQ ]F*;c6wjw9X!x}짔<`u58əNUMT`GksVt9He39vyM6fh⑎:;/Ё3#TEv} Y8 y9;Nǹb2-.vcTSJgE<dm[+1s*BJG*L] P'nP}ad 8C᜴o731.^ڂibG=ݮG;RY4#Z'e"Pg"JoYj Arhn+Z$4p;@@6Afn[a.fK[#fc@6~AC5L/NEWޤsG/h&0GLhs4ŋS !Ju Lf#|<2yxd$@;6:#b)iw:]T欦+>%*Brgh8˹"'}r`YCS)|Qw;E ú^w]ERkHf!&rmZKS;օv38 a-[OŸ&گ2>3;si F(2xs2CP!z+>6_ZQd$Ը%MQ]Fp{.H4UDG/ Qd&2e]$=.+Kۈacp *)tC8Io~>Ȍ{"GOI`lT~LéSy$>fkTŠpxY\ܵ& ^=Px$aRglosV0@XR'1-Cw5C?vBtq9hv @ҩI5,cxu -M39NsH\D4;0HiIwFe R廿)Y+a)|>y3 ^vWva{>{}Vq݋6"ә*h e:C7 E%Y|}_U4^oobĉ^J%3jGg9yѨIJ,62V|?ttEj#faUUY„Ackj#6(۪6'$&P9X\2t5rڙ/^AhPsKOkOâi#qĢkǦExj6#4[﷞[ÒD$ ay,pE>L:Jh|*ʺ[lEyB`i|ǵ» -G/޿ B2UUkt#rPt|֐ ?`]OҨrlu+jy(7+u1Y#ߝhJ:3Sf dZK-%/S$hO`BC~L y%n@H)NkPKW︒)TO%z@ ALT 8ysDKV*k~eZoVÖ.ak>E]찀-$"Mi{2ed~|8~m5]P:EoIyk$c ^yvйz&^tA8^Y*dP)N mrS D]mʹڐzXW1F<)ۈh(-mT*5v6srу ŚN ,G'΂.^. u4p=_?h)Ϸ?N]'$ CvT;~|lGӋpiO|p:YJ1JO|z/8'bH4=9՜[d[}-Ŭ^+? ÓG3ÖG(?q~B)ʷۛA /v?Ac,s>p!m@@@'fGxfK'2OW"Vxz|9$,vm_R;}׎"I[2H3 zHDs.N7x9ėN"IFb! 09ȷݭȞ 3p?V U5;a e4t4.@+wz88_.Z)F),[ONhamZ OT{U@m22Jt3mDb.}Pbj1Qo:ة!% ~>YM 2G"RNg7:#^ V=@2}]n|VS%wyHDQaLQAqxPSDBZ`c[Β3Ym6Q?O,ḫX0@UEUʊЎcp[A" bn@oww}I,eo)Yzխ 8\tx _w_gWܣ2YX]͙%.*mPӀZi4]S@nu!dE>"y4Pd-hY)t'4j"y/9 E(C5煪&OD9Lc~ I,7C}i˜،cB*68 B0lGW-?sCy\ddxS"SR|8&S ӕԣ` E0;;JTN̔7a8 (+A6IB^Mkb ?_;n0Q&&ˏ;sJgZRXC6(t ZsFwbǠ%Xkjpx#?3J7Z%:|RQ#v )nʢ||End=OjIIB>uwlRK?kK_MΚń¼>0z9껡t'(L:v3EW}Uf@!|"6tW}rŐ*b9<>(?P겋Ħ28I &̯\ޛ>3W)X.P#C-2.4Fc4.0!C- xo^،2.^M0:6͓DZ,f`Kw8ٞs5WI>srv&{ Wڦkە6Ziv ~cCh3΀VlޖjMO SƷwcߝx$: xgfU3t_S O9sͳ|kkʵK&Ga>pBvRd<uE~: \E5YN~N'd #|ʒ>Rk`VJ.ւqpN|y ۾Z(.߉CP|T MY|QA0ܠGy$ѺY-V*D Nh5bSˉ MD]5QA#rq/&N fv;B:&>^zIØ$*߷0 i}K]拏~ᚂD (rd2{Cy3{)dY25G8]Tm 3R^Xi`>l^;J?d$҆xb^bś,^CT}w{5T5܃ 3BJo%ه)EAǦ݃4tUO7wR2Ƈ3h}D͊V[z=z!֌5Nk)0GbQL N ѩ/(:S-ωK C8?8`sCϿ8jbK>Vc-'~ލ5Iz fZv(l}|ud_K`}WZOڹJs݉M%>;{t%mqAt7 $GUo8AK5ywرq^,]#0MHqL"`h§i{.dD_Vr+-'}gUΥta {@3 nCOI\:տعm4鐝5rhjNO/yڡiZ1QIJYCM"kt, z1%*7p#FD Mv\xsbo0cq8;A^bĝS; ϒUdWCĄ62Ͱ*[e t6=z$֞_A$ks0^3|FG'-0_^7hmPv'6١AI翪%k'aVKE z$`*3 lG-i;ˤW<^cl1'e{f,X zxL9Դ'wsɴGe"='˰^ŠK : 4vU^Pw/]/B-LJ{+[DF;Ww#s {P2}o9i-Ol)ht◇+t/-k*=~xs}G ^wHp#AB vhKgy/T$e]VA9ϵNN""ky)D™ˆ 1t2u R7>QUMR/"cf}ίk3\3y+cTIv <  䅔~$kpX}oJ:iA:ףT!W;z"N{x8&˨!=l4P7htrsj ۏEn]rL@ᬰ\FLdeS?'t"yWt$VIj_ɍGl6YO7ƾߦT1DZW#|WM2^0'n(@hߑހL՘҃C`6]瓞"IroY*Xv}P9R C(@eWwF%mQ%ݴO%Z\E%θ-52v7ExbX%O!xh\PVU (o%~z P^ FّH7}Ή@>%e {ƛz~s/SI0/zK01YjEE~hQTܗGG_$U \$y2.H'}׌uǓo@sIƽ-%ɷn'p@%,+/v}HTm j 6Uu"y{<G'j-+64aBJȷt"Ƽ-?y ȶ`@HY لCO̮8^`T$x_N}~r<)V־][a?R;)H%G0(.)Fd>T[ 2)W? 9^4bhuq˨5OX_+ճ>\Jnl6RXVD;`Q!Rt:صU8Nc&L2ケv17VlBb#o(˂֊чTDGVO( ; jYspxgXHg.|T p Tzk(%Xvzbc J[Ltd֩c=Xz=Gפj:gR AX?nKFMRŔL Mz,^n8BX-N&{Ɩ'}!:IMSb]ȺGMͻ9ٛfeuWr1S%1w C2m[h<ۣm˕6N7tb)_J ;ܖBع kI rɢ2&%S3C̠ohb6@MeWSn$O׶u`ͱ"D|zNmo.Jp- d_ ;Շ# /ܑ/i@cSﺆǒ5dir/6`hHK.L(5`:P )aa^1eM29:M-Zye=:g? ߪ߄3E9?Ң~6o,hp?HXT9C{aZ|-XF:+gH GZWvѪz{#mLkͼXfNy\լ0rÁǐ_.Gf#`u&Ϻ$aΎCy6Oϛ44fKDyz I͌ˊQSތm %tfJݷFTǙ{K+jvFx) x:1!4/DWj8##휛&s]&dа^,>XKKB+z,LGȆ"(LqSs?~,Mo)4J5C_,%c'ɃypRk,tMsbɯTv&z'la o|(PT>BŲ|ϊ1t[pWZQl)ТWav-ьP_pN%C)uA:47@]+jOd*jٝH߇k8˗돀]?}0ܷO^ڛ jWm !+KP~|b@$sz,]gR &XXz=kid`;=Ga _q[{Pϋu(|Bt'E{~Ed.eD .oB!qE;s+9Lz"`M2(13Z=m/ oh &:6k҅cp,r$k19VI>TI% 2H)짢]|M>HgfgX9jm-LA*\^ ,J79J ϫ 33i"?.`l!xW { LAB.~oB &d\cETe#}E!e$ke1!VD& PMZq4 . +~XM:+Gcw `w4#nkh8a=e+9M2USfaD!`qXTrco=,8UYM%#-BJ{)bZ_ʍ>/gU8 cylKWK;C&I7i׎?faaݖyiw"t^ՠuD],LjI\2~ &7~@ eɈ[CMW|%V ٰg CXyX,_a̩V]6qk %~u~suIpAjψybu rF#LɚE$g H끌ΔGC8R.\A7=: LȟIÉnc%ZE%AX9?r5@&vN>|WAp55Rpe E6)hY-)$NN_/{:f7\P;bk8;WK2C)/w%)DIٶ)2%mCe75Em91f5 Ǒ5k0ۢd5cR70_hu EXL Ber9GIut^1* >7l4$ s,CꁇO #$/#AeK&Gim;,FΛWG(zGqn2Dp>hYUϽ\Nt"T:bR^!j)]~鉸i+iDK&8NN9ЉT_Ld.V8wF L r+-[ ғӣ.JEdBƕV&؎?C>.C"4!' kB!ކT"4ЫEoS'9UB|üT !$a=~K1;t~^08噀}Fd.wL+X ^=d^bY Xbe3Vizr%Y!JCY_TK7yfUya,kqxcg߷ņ! fr-8 Ixj wt+l4BȰRLdz>I43V L[ d9q.P="Ϫ5*" Q$I[v)9Ӽ KXМӕ5t`$}6eH$ nGEv顋Z`rٓ4oU>ԢrՋC37p)Ώ' Wp,`1K|8t~T"`0=,qw[\ ̊U5'\$P}X~{t༔.E fs@NVٝ@I5z3# XAR  1w厭С v %rP163s0kS:ȴ]„5U]0~͉m?r.pKl(}Q>hR_.*Ls1A\<*DR9{Ϻ9/>{r^xrU&+;=­}p?qlL!(n'[ }ƑΏ^2K\=y5. "2̜3wXe$`_Z|(Ci4zY/g"z*]]]INV,nDU:`87@h8d(EM&[}Lފ.|53%S?'[$7Ĕ-WIҞ#=."%$w{RuxZ>2Ÿ"h*z'y|DtXOt&">}Z[\3Hd}Qé \ρFC8fЪ#chp"[!}LIW:!ǯkӜ='5=u{vj=}䀳h@TtA_$`5 Ƙ MBۻMGv*K}Ũ aԇ6L?E)`c*RM!^_Ju}4)vQp8~mȆ3 ;2TNPG˸=Y67R[mSU%}CӋ;1r(ۯ゙$#cH$ `/1ĤEm(4CzsɶB`õ( k^TӎX<['wHnVb184&Iݠؙ-|'íN\dY.+oɗeUuOltNEו)pJ#wpfIR(kL]ot=K-$'os.C 0Ra#BᜮP8󖰁Y.땃>Kufsmngd~zd$nhp}bF/]5irT:VuwWTI\5止sŻ뒮6GdDͣY#[1^*T6BBX{nǾOZ%tM:Rb+ Tm>i7{JyQ;+`+|Z aj "Xa~մ=^6;Vk`^Wo.IIr?JT%%,FsyDQo~VX\]9V%0 O~Ÿ5;am]CiKe93sH/:'Y=κ bH iM,Mc$Lnu Ypd%d[]6:͓=qoB~Y4P/ hZCtwi|Mka͟2oog.͛o?Hxx_js >~T.zL߹~:մ4;5c{4whA)]挃0$;S r'з ^{a4ډ11qCpav+u7- ĭ_5LlP5XG>]yK{>.ЯE (^VxCb1l6y3e0j=@/QkQoK&˖#Μ( {>!9qK:afTׅ gXRpehj9qTtO$k,R쟖[(lj_"}>N2\wTGaG P5W/Ѹ"cBGSWV~Q(7#(dHyRe̓ vO& Ƨ/ZygQ+ž\/r6܂hd1(E%!H0.J8_tPըmDPYd;:q$4 'Xcy#fF!\mAC #'AW^ivP0z{ёV @Qw"3 _eKv}HůI۝\MLx٢:z@6I Z,Fi "j|r<רlG6+?Ef+  [zdgb,f `dPW S=@0b 8MG!SG]s@,Q6lg@˞qk-c'nmAO[Njd$|E^c)HEЭ&"y3%v d%&v̈́v^\~Rv~br4 !NtpZS˽oζ2XBL\; x8S*BtH2)'H(.xc)>;"sɾԉ=ٸ* > |h3=ƒxfϝ-ׇX_UsGvqzʟ~p!iXv=]fi}]Ū;TMSR]xz Õlo:>(U |s")WG.z)2w×J00$p1fi᪎o#ewA$3rz:;?(*Lgׇlc &=J4wKd0((&\\Ze8Hc\H?*8;90>0 nYU f]@AiφY^#9)ۤu։<0 vn}?-ceim3#oބm㕎ZzC]j!C$s ocp0 R0) YRғ[+(8sr>ؽhj;&(?>Os 9YIDG! >a,>[kFfCP "z h}NJX^^H΋_slkWf)Rߨ> |h~?SsfiL*oV`έ6oܚoYCQ{-12kKUUtmmM<7g rTgTWlL}3܎S-ܛ a'xU`5AP"J<OCߵ plJcqDTMb~ T}mPeٌNcRP_7e˞@C~,B]Y{Ҕ!a O(]AHMէ^rXd_H:4ƬxiK#Pʫ—HamfƑd_hF~s>~  G-P03ΪZ5Rgڞtx4iaK8gY!@30cwd nP/~xz#]sE]_4qL:4jko._C'1aLhjf6}'{8%v,*0 Ds_0c,ibO&BXuJ4SՕ0i2s.&8+{+uzwRZ"t8\E13ҳusb9n"S"e0>/*& 4nS1.P6ĩ|t+8T5 [/ q~,T3:,F8A]phӘW'⢚;OQ™ T+E·kkojܸ JIC$GZXÈ=y} G)}[c:gc秫}6 D!zQ‘JGke\T"t'8un[0NW V( Ii@Fy4Ť;Hv<^T)x򬃿 cgžiz3hV@y6={SEʅ21DZ97A׶#Y9\Dl*r8"&%)<yz[Ofr8IA-{5zQYʴG*u$OJ% 7EOλGE YwiMF4BH_xxh1/>aȸ:&7n.h%#}h!Yi 3ףHS,cEJz( TXVMzq?)XzB:'a^W],DŽQzj$$:'fp"#4}QA>^<_cW4ɦmBO+M!ZkVEaW<#~#3#N?'J- z R޾cCGBK{7|Tr.=v:JTԯ_5FWw)?tw0/T`-ɬxuIȡGda{I R@njqWۄ9Zr±{H9qWl5UxY9 %ˎ~`}܅=P/=Y|َ8E=B)K5h6! QAzi:5w9^e qFBX JO=E$\J|[|@&*yb9n4;K;gUʚJH# mv u Qc]3T‰D_-o}d5+$<"d{cJOFEc#\[|N}?PߞC)?KibiHdn :rq R_I/Uy>ɴ@ ":ʡ [䱪{i =,ۙk؇C+XՄFQեE;X˓^GZ?\Veg=EEi ^-#p 65Ȟ-m@SF$$-V[c5ދ z) ώrZj7k;l\A'CFa@7TB5D|ϴ<KJ?ۘݒp;, LUԲ&i<402$}LloddT68.bePؠ{PK{(NBI+Yp>H? 郹"Oݾ#GE gbL:t-#*/#"8o5h*q!(@: g)j؄ė2g_y}U}eNuk~o=[UȚz6od" iGp\ ؘw'^yGֲ Ato(% f&hv>s[ڻm-chp gG5ۍ \)O kmNp["ϲ`\YJ ӂ:m S- cC|Ѫ&yIzhVxPb{/-||}w$dЦZ Se 8~' 5V$gocjV$vqyurM b',NA^ ^{z޼0?Y$PXK{5({ً?-rρmP@^[QQʳ_56+j$m_'ٰ^5 T@d )k;L\^ Dy!t "lkj:w (X3P8 &˟ (Q; R?ӸPM{C4|>v>>U!ΜidJF>uH2 $92o#w^a":uAW2g9d"y1pqKAq7z/Fmc!H8BA(iQ|Ɔe6mBFw%||J$GAPY&CḻN늹kVZ2ۑ7{7׆x^)9JMl>_ yԙVD4m7,Kx"r,9KDπꦮEV"kM~9sp! %8Jx Fdj*L5 $hORi q[g,VB{s<cK6dUڐQ8,+4‷A=sE̋"Lglijb?d }/sjI>cOa> /;uc}J u=go*\|0t^sYRce̖Rr2@Rӗ^;qG*AdY`zW՛TIKqDM}>?JR$wG 5F Cr,TL! /NhkQ=)7?|EfO 6)inosTGY 仝CN+Tv7:Iʒ> 0/ˇ_3-3S ֣ u]畋n™wt1匇z oPBC]d>YqOuV 5U9Eb܋$SQut:'+p"?l**amRPn|3O(3-}7ɭmGQVv3Q| yYl`w2LWKodzaL\ v:I93W<&\Wƣn^52vƓu34|E#ټ$ (9RfpFE{唭L0%M*΄H3W#kveaN#N7썒vkة?#)Z=<%O֛T՗{},Qke ˼T="[1'Xz34 4Y: lޘ+ kQZ%w[w.o얦Jc+ogIxgE-7D+BlPe3jިrLov69L,UPN yTs)ӭ.@%7əsG"m5C<&qNj#Nnn8\K5|JTU%wmBzS bT(92I ? lPB q`rRTǸ "<4KGQ4*^REEa@s:w0M Y&DƧ0h~JLX$щGX+& `OVqpi|aTJ%)my{J$L26jTp٨̑sK .tw)ƒ>jԳ:s"Pycb佷΂QI"Mm;2lw ;*!uW^tYޟ`$eN@8.aW*w^Q۸1| Iza mRe!)mICt*R:I մ~},'t;Ӵ"t *3u޼g,WӞ.7RVnb5$P913ݷ*.:og-3T} .p;6M"&}8_zX_l9dY]!7޻y%pq1>[yι)#<b$ZQHRV>Cwj&s~{.PE#۞_;|Bjnp s"jHM 5[S3H+ޮdeb3[RZ*[,њçS3>g:bVb՝mՙCƵex$+S q)') Ҷ׺+9%WR& 2==OEjMS>6eAČ2)ONZ8)>ފٿLD@YS(x5$Liᤈn)Q)6~U3yx{֑-yIdu(=d<{u8Ɋd⨩9As)qkBZd:_HeX3 $o*(+|G%VTv"")Ix9S3۞Ù(2w3[L0vtd]qW@SDHwfT8QJ #M#VpBՈKNZ&'=(T ]Olf2$KK(t$)p@8߹\тd1DuaI.ʡ >m"Et:ǖtc5'3|a[wCTˈsh]6=oy]eXԓf#,JX@҄V5$5{ߐw*Ip.`#.'cM"xc5`5M0pX1&D=y)dZǃu<;'jOHOA;.1J ci@CZHgĀtOr7F+>|7ۯSg:FV zՄ1h Jނm3I1T52E҄`*Z?)p}t0=f030Yp ,x]"֢ g2~3[\Z͐>/eYSo"&:/htYQ#ysimyt$N>{ M^2ݽ~2{"@@S[Mla-n_oSSK5էMSfɘH]Y{Eӱ7V$^scڡ5Glh07oIԏx|}#adi٘Wg2K=)+R.FpcMb'/ȋ8+nv"+5ig/M"-| -z^(aihZx5VZEJַOD0,Mɤ*Ѐ<>C=yOᆹp(Sng`nTfD4tyc9Q"&ɸXY9(#;mo#K􆀎0ڀuqMzXh=o} "Fr۰CeM,g!]v_zIJzxnm_NX1iiE+ž>D ]Ȃ=;{uVSJJC)/mp,մO )m',,wap+6=2+_3+wYGP-‡u5W=vϖ_~\T f GujǦ<>חt]vfhh'mpZCrsT 2[\["Ho{A|jF?KQz~52iKU<tfc]kN}ߵޱ9D?K9S 6-i/Kbm~G 񶽏M"׀w3>~KCd8i[\3<[㿥y$10*V16nAb %ɿ^d*gÎa[7GQTeAfƠ"'cJ!7 =qwT%OϜ{B٨k.ۍ ]S){-<ѪY55O_ۿ!ZG ٟ1~Z Icæ۷jjMvκK: } Bi7Ѣ8'CLxI7SL1d袡/{X|KVwH, i0w" 0D8>_4a C9K`+m̏."Q)>\)cjVgXv˜˪(UJLͰ\+j 2!n.Jo%` ۘɘGi3^S,N}iDω4"#uZ'dB4JI`v$;?.4@}(m/R su Z('yVKF2KsīY.P?y4_f;c=sE 98vfs>k y^' u 3 Qf=$FA,l4/V=q*}F"~kwFg+3# 'B^N ׻A"ӿ "$D6QBD=11AMUO`R`c?Vno4X@ldV &ϲC< fcv q f: CyGٰp6<_`:~y$.8p'>lBw[|:x0% Uc5&EnYoORIr Z5a Kdax R2ȣ}GE XU2qS -p\uT5PiԪ!.9NQӲp%-] ]*Z5kfW3s.fqե._3"瓾 CZMQ匕$b+2>ZC荛#docUP#Tڗ}O.rXb7 e7D>%[h9|sˇ0;Ws4 c-wZf1Taa+5,p{%0%KPȯG\شJx / z)ƒc{g}s }>aher6@R #L<"BKdxhpUQȿWQpA<˟),顓>+ kHZ4/0t-:2srR UrGBSg`V PJV Z}- xT0w)3WLĕh?'n xiHO6Zj謺O*Ƶ-2ԑwPGU_|å eʼn't8::T:gn.%ͩwvaІa0*gւ[@s\0/,8}fql넫UzY3H41MkMgÆ~t.9BSWh,eC T[h;rFaO3u6T8U Ry ;:Z4Üݟfbo0_/# JVDGLJ8gsh]Sݏh{IDwFߟ؂tHCa;29̛uR\>n~&)c8 b+qcYtd$0.M2!AQkDTm1p„иG{2 &% vDN}uҪM$[=ݶ-`hR4'Jt7g|`D; ˳%%EoCeeJCv*(LÜ; J{ȐOqOp8[ depk~ ۜ7q a^ѾT7 Ծ[iKaz}}SZ-mxkf!$$&w iMp5bghAP_|i=\s8 f4f F+פ,rE!vp3c.e/%{EΜ^aOr>ro(h˼G ܐ2gr_C,ǫ4Dl)G;(IqN:MIoo8\/fk"yQj ef3z#Aǧ6>eFR1q4C/(#p.M~ZR7Q"ef zE>v++M0T!EOlO"o=TX&V 7^k'-*f.=,D"jo U Ҧчc1)FZ .,"r೜+Uov-~ެ;2BQ%.l7EG@:buQ-^Rl{hieϕ乧_֟1in1=g GHS+T~]]D0xRwW찟D?B~ܙG48[Fuo 7H56Iw mB ZL"Sw.RSP|]0> nKk+ɢM%?fB-@w `>iR7]Pذc\uOL]y=Ѳaor 릿5BZ@ǔΦTZ$آ'] +wF6pOd qpiћ݀!56 [] ~*B4Iq"em2Ǹ(I^HDD d#/PkX;LP*k ,Phe[x?[Y*h`PhHoة{BBC8t> n0PhsfM=1@QIHd%hGA3Cs.!^se}.ʇ/VogAkrjyWi CRi*k6%`w ϩ ](I׺ʏ?D~!d)-oړ|ܹKkbXxJܨt*fLIeQCN5 zǒˎ^"$8=G<;=> >/anzAMTy$w٬QZ~,.GGqn|_e.E1+Z"36v M4ЍUIf6~:VVq:ˑÕxz2or];GlVKӋm5^P7|cswR%bM"E3lnk [!.z@aA,U:w4~xL ǑԧPJHg>@ס֤o"2!|JbrkĹHD?VS|FLvTsWZqFnH um!n맖jn!h2޳/Z_"k4hE+¢! ^۹o} jцtɖdW5=,0NIևx] q&k<џO;t%ew>8F_%1ۥKF_匔 >nd[DbDbic2z42~4ːCmyH_Y>Ha-<a Lf 2e`⚫ޮDy\~̧;U' s=mɀ\b9:VL;*Pѯ n6ߦI7;HE %6A e f`դA͑_Ͷ 2FBG_>ҭ⺵aoVjeS^,9^?WH (,>6tg\Nuk}~l;$ {[}IҦ(z*ҫN'= -u5)0+0Yjmf|)y0܅xcQLo4Kt4 kF<YSYIJeoD Uej8Wկ2\Yǻ?D?VshsX轡ʚ JaX^,1ݼ.>uM4tm̾ L?uFxVJ/`ct][qD&s'E#vbLX90gkhwY+]=;q# AŢ&f7VWe28>x真OڃAjPj0gDЌYBLSX!Fv\H.9<[ɢ^,2 @J22Igiil;i-%LJyc d&ޔKiAM{$ŧ2(5d+S`E^ n Ե)I^CA[;[9MmOj~X9cWJS(uy,^: ALV-x C,dG!/5j |OA(F:PA|MSH.xSl0yNTt qdJK0t!O$d Ffҵ=1EP1_99:[/z$תj" >c'oaxc ͨWXXs d4<y:8d8 a߄gX1C/a )C~)a)zͻs6mx:=7gJ@GS& 2Wz\f0ON`C33 F8x-:gu~u洧ڹvO*A{0ôY B-+gzDYx\hd$e|ýXUq*ufӘ/]='~6+ aS-"*r:η+O1P:=QzMuz.\4Μ0C{ UK7X\?2 3_ۉlsP@bE D1Bu͂mȫ J/7 3ynx,P:,N̄s x\tˤPkŢK6 ~2QG?h٠ `i բe+LMkŕ M7L]z2,)%c=t Veu]ٖySd{?ҊWA$#ņ g6 !RI㆔(̩h q8Xt3:/A,TBP%_eKBĴg-J.+cO{ B/6`᭯S`2%9 uBQzg%ff˦"> as4ܳADG%]`r9o;!db5F D@')Q` ;l)8'e,[ZE[IUۇ64Lu 1HT.U 7wqYNgKZY0 *u P{} ZI+ӎ]L)q3P7v>96$S!w d=,r Al֐~J$or&ZUoWA=Ǿj.wʚp?x0_VWxnH}. -]%ÀA5WFeێ6 Le<É13w윁_ye"?bYFN;:愾Xac߶cZ$4;iR92vѱ2 DRhBm;`Zv^NOΛ w}%K Iחa׮>1 )}U7_]qD/pפu;Dn%dH}d>m@C@Yh}/nwSORht?ۓ{f;`-0vg_Xq6H!*%oX2'DV1?VM'  A7'5J'?Bi SGHr<)):f^lOd…*NC=Dpl a>M˟d/E_|i9&P<(Ĭ/ᮤ薄<f +9|ʊuS^soD,])>L+?m =p7x-:[۾̀jncV7 k:gNb^䍇N7һm>k$Mf@6`zlk1u k'<_ F~+;J -blδ&cM,"CC>9p!ɂ"ia2O2|?k%lQ+hգ~1ai>7zVZ|=]U^f²Df}YEY6~[))2 dqc 0^"񚸁[z5{@1@Yd0Ftdg` Sclgv=g' pQ9_@AWSu_!x{ag= A_|Lf@Gi6ڄץt[l*!7 ?"c.:bxRcr*77 [MdL5iSB7l%g]EOa`l| hvZ?3:^TI9wgYp J X2un஼b1ǃ7Dt ̔tR%n.+ BtjJgzXu >L,}yLä|)/tmB'`Rdt³WLb ySI(J:s=& ʷzbJbijfy;$~ŚAifUGT3$ n{Uaٕjaa0bR7#"aO~jWVV~&!+ "HOm-M6!޲#(&IaDBXfrvEͽ0c<_ *B|͓͂|o)g ͿYd(ݶ^ .x`)(w,lĶ7\BYڥ][/;I9K }/Wr`:ʎ9f9P~&=Ba[E{14p@U o=@ W/VL%sש~b*UgI(Xh tLW6aG֤BwTNI.L-/PG<L</#gޱ{̷l}i%GK>~FKa$\5F! g F}sM؏sST/P%a+OLeƞO\0¾ɟ:6 7l;8]^@~uJ}^Z\n #={ ݏG*ts$x.A%lصt%Y^\+reBu]%giFqXCK >ԬʅR{{3h~0UzJvV*2% ~mJfwd;UB2Mxm-O ^–@݈L AOi ƅ:?\WIXR] 8 )$JIi@ G \DPPϹV5>( 8D\K;TBQuV92qp]J=7B|sMh>ðf= ~?'@‰-,{,c|K!1C!GC{B'|'/ p~ɇV.,vuh 񉀙~b(b0'tGǓc|QˮY9^[ T+yE]TTVZ{Q7]tnrzQ`yx' ޘAӔ~Zu-NG5:a^7G i]!zӑ2d@7~9Qsv K(% 4[D䢺Ġ`?tx?:,F_ fRzB^?XSlEJB~ᓪ?'5fFsBQ$kn+[ AGaezr jN|ׂ2׷#6Yfatвo"y vzSndX"yF܅4J;̂Z䑗\~yvh"gԁ7 փZ0Oݭ&+8?&{G\/Gn7Rmn^X!CS,H'[ën*U}I緸t|eno`hq66}~cqбFrA6_ ^O4q尳D6L[될|ě8%e䗎!<@QA\yiZB zCmU3sj>.>dwm *$،FsIB{ hÞQO7 =gд'?ˀieeSG(2~+P$.ȺPhpy͵ amOŏEVbӰ.gȇ.TܩFiKP6SpWF@w 2j  i#b v<ϟU*sXYD\0Gal[XZCs9z|7)@"r1" ZC+ 'ɍOs`.>9h} !{b{Bb: B8|d@%?+u#6PŠoB_@ Мe_QA̗W [v0rm56Ф)*Ú`av~&CfڐT6B:%Y|wο7uWVWY<8M~ s/ +\kfoR9`消A.ȑLUvdd3 '(c`\ !Q(4>l#!߸զaZFmWׯ(Cz}Sg8>~&Eo]7X6-G"[當awp$'g3&ҏt};HxobzPrCAq]rFnCISB;H5}|h#6%E*ԛ{Һ| ɂ3C%H~81a6kAWr[/$&/",",Ggze82`lqJ2@ _ K>{/ʯ'T|wN0Wo.4ٴ4(xxl(*Gsh}{~$O%_x&~a/{U IӪ`6[BHHXĊ5UMR@vO=(Jmg'k3#Vthf:(@iNc4$^kNsË6h!Y}cNɸBaNb.*E&P㹘CeT0[6eGpXz@>ZMq MGɂ`g饗U[0bYKC ĭZFgqiZez]Jv?d:d}|Y|+Kw<~@7}p06f^wRzZ߷㼷U:یoEz%w™:0/Bd E{8?Qy^P]fD-Dcl y֕W6SdCG./43%, .!c$ϭM;+~Ax 39V7KUYs"wVgi&3ݫư^Zr$CNm5l`PǑyiamӇ[ K`$*w|γz(PL_|zS kJ̤vY vqRmZ|E3 Kdl8QѸSaһ3Yt{c)]]%4~=CI&}]kLW&w(KdұUŎ ?۱XI5@;g$t)y1h,-}jx0HZO!!ypsLrim/@1 PZCFxz}Ν pn:1`G:_gЭVq&jKf3n햮6utqX}L{X\5Wةe6'E8N5\VK\.sgq>ZIf d_o튇WW ZHK f>́|&Q\uS{4GƑ,=#x*bIIʪPl|:BVl!WuAi,]P9]6mZ$ƲIDx4) Ir4" E.Fdҵ Y^V{e)]fx/*zaΚo$b芄x˥.w6蠶Adϒ@NQ gA2B,8媯 .澩'Yf 0! D B&}?`OQ`ڛEflVl߾@\!6ըGGCt Drdy V,;\ &?E)pTɓcpݴ5ho5 (ݝthpJX%(4-JNԐO07',4T6h fH)FuDf!ڱN䆿0+Fe:WSN  {p8{ʲ}Yfg{aZ3hQNJuhS_؋t?և%))i.;כa:_473> !!=.˯撉H rTj:azaAIp whnSli3i62T1d\S V<G?/ԆviQ|;/(Qʷ#Q꺏>?̱Q8Hx2'<|V9IVxyIE9iR#8u;a~XxO0l2m#mwnD 0k'0BV3җ@]. o]k11{A]yMQɹ1w \0``8fg"wKWVd.qRN*́P9ȥ]~#83Ohe^AP_ l4&/悏~64\ tv(ZGS5X[#6_8-g"ĻR-Ҙ 7| 'E'.`(ОQLǑrHY^jA0F"SzkßRI;GJ$5q=b<54$ 8n C/ôAo,}ߩo>3'7>70>JE?+kqǎ^7<$Uг\U%5kg0I!ԯB/a`*'*4X84Dbf;WiS'=|LB9`5 0E3/r&os0t%ܔ;\/**7cb]'Mnр+7d2w5rX)p \g9 *Jz:U,<83G Y:Nn~Qڝ[#y^73$fPv0i;A+tO)(B6@$t dɒGrdAЎzl_++"a vgªHs, LdE!qŸ-gOJl?m[qgYef\xU IzL3u6)5͛y_\@LR|b챬N.t|6xXAs}u%UH)AL5qN4nKMrvVZ|IfFEAb"bֻK@Nv6sT5=/ãMP}{CdC֠=H'f$XU`E SҲV>1+"Wcl< QO W#xe}"'#:Psf?Ӵ=+rQX&tZ>u>+/'ru( qǹIp^ȅw,T:JuKɃ?uo4b!/#w 3%wlx~pOYy/VxSwlleAh¸@Ot#zS^*p.WTk )ed~F ;1`0~?:|\f' ۲jUiSQ"w8ϛ_{5Q%a$2|С  G 寢Q f@TϽUa_2!koe ('To9#"#Z*(;Xy9u>O5Ib!Հ'$V[+v^iOVt\>" 0p54;)-#91pUՊV&HZ{Xbi>RES?jt?]E8=:3GZ2[|zP;;Wgp01m@バӿԺ؉}˨I+^NwO7&:ݵZ5r׻;{|5`E9f7eCA"~MިB' i"I ,:S{҆VnCyeȳÝ)ɛCn@`!z`R^o8|Zt"Ȁah yp>Dj5]O)c后 iK# S#| m*GϤmsG6~ʟqxU`}LbdOw19dluwO+1ą-AvuWη3gZ?sDg]խ[k7mL+qZFbEJ`E԰Z.>:3Ԫ㷧9!dŢB]̎Q &2q.xUiזf):MßV8,O(Gx7L2-x%]vLr"I4tƷ[H*&s<<e0=Oɸe !]Vxa?P,)$\fVth h~QwJ ǽbQE/yFw5j)QOb$=luzmdr{gWm]uHۚ7i szwo*s jQ$D,&x* Q\Xm4~/'*$v-݄JF~S MKyzvRic3pKAryRF!+O$)ܼ `Stł]ee [U cV_䚒IP";u)eijGJַ W0yiA325ǰ};/  Xk/BI?gqo7wj=.b*+ҪV<ʥ72%m p߼s*8z3,F|uV5 C})~0g1 \ :;ʾA.#}, oA ׷,zx{fDI.gSm ! `5*{p"x36xI h nC?lkH/Ăz=y:2FG8_ܾum_- :oC7e1ZQ%੸d5ьYs qpvgOa&~K I`91Q* ]-dz,(6Iuz]if,B!kÔ,\*G<(`UaaWL_'*WS?O]eKf3R e hwAj~&+M#$eZt —ť嶒h;nW3?2؃D32ߥzxmVYX'gX)>7z¨40|F<_J<@qะ~6US"?J'zI#G~7C5=S/T1\ckAں.@+GutRF7UgESZ 9{UZ䳩3J0 D]}wŶi2:.rp6UK@N=4/b2椠.f 5'T9Uyl@6^Ȍҳ qfkK4CmvD(`QϦi7JLV*Tr%\fj,ăPE |w7ba ɼ/!\qe0(]Dv ~*XVg_-V(7||{h5++̘q1W)9S#1&*d^t߿.2'p{_Ei7M5RHAiewu$1׬-5#j?kIH*+N]PF0*!pҘ~Һ~ smL)dQbh{Ccխ927/5`G80"ÊOJQJ`@G6{3Df\Ks3 s/ih,\c5~UЙQS|Bxϓbiڄ%LC ul02`,@ucޭ/*o#BBc@0'LZ+=_l&Ƕx 3DZyN7䞈Ǘ%rP1=<ۥrLTSZxB"ajFdT}j8`H}{|zlVdxt~їX--u` xvgz"[!wWvcuYN*~k"/~8M}gkY)ID̢WVYF"IM:W>]ҘPpwpgh uf\IX,]JU}gXS0ŶSD Hs8Pđbdvs] !ˤ1=݇fTsgX.qM4FJm2uoDiEW19Kh5P27Gʸ9vK8[]JcUoNxlz/Y]>Sc!G` `AB]Qوz@F W. frj('AO-n`AwīizL@wIuQl?ZBbJ:׌%C#R]:ewRV]Up «Pv{%Ew\6PG*\cKQdvwi.{ia)khz$]y?_QRsy\G["饛\8#1s籓- eKW[%Kv) " q 6-llgjCEZ~]45 r:-L9~}~TW?4^*z|0j1+X 1D3gTxizRA}h(z3{z(I.^/*+-TvÐtwmbɈVPևhꀗ<\*ūq^j}GK&I igsػX>Q\HM.1IP#6UE@Dfb X̃X6"72W7fE!=dm |.g_x@UpqİMvFfu w=-j5*݃wj=U`Hlx rnjs'CV-ŤT˟.Sh:g'8.MNXx__24ƭ(g9VVlB]g8h'7PwhJY2C3wQK8#g?wI{ 뺜Aؔ_X.B"2"J鱗qNq44Q$惀]ũPh#-#Ln|Ffxj\ubیJqCoՎdƘl߫xf׏kjYanee. 2wQK._/HֶD=2/ꊋ6?Ku#{@mtS~=) yݔMV{5)~PU^DKu|lxrWm>售̋{^bw(Ц~(K`RRȘ*.3F^\ )47y VyW1_ T;Nǭs&y!b)#x1Ĥ)>73n|(,d?`bt!oKV.~]fG(DŃ#Ptʿ>P'XN{#R_ՍkM<`ԠX'd#󣂑\s?6e'Pl 3|Y|,l1xh'I@>+ N5NZ㛥gIJ=a_0q3}jP$!boSkͨi ](i`w s7\7)5 pxvزPִJBcD$BV`4ҳLeE%"r5&:H7E,|7uz* e_(s 4#_6y*dko\d/փࠃSB&L(E"HZ-sҪQ>ɦޘ2qDPPBAA-. R"#"Rh ]Ëӕ}V>FLt/]Ցȇ{WhرԼs%5ɽlV16*낀Ӝ$9".,x+LzN|JPYغm4@6v/F%JK,Hz:{C pm R RY!rtqcVnbx(GCM΂} 1SjsVd'@kIԞKKco1 97tWSb Q4ӄdC}$cgѱ5A&Z6hqͨʫGlשQ\QeEjhG,^l'ȫ j 2 paƻGvPZӘHRZyHG2׵T`3%Z?kSC<;TF1W69Pi; : 2Eoobn˛U1~rM/}L'%Ry@1zi)`! /}vNb@ۄXWF_J9FiZ6SGxNQ~ҍxpOq9 +V ,04y:hi=>=Zqad19+cbB d6x*;k;%uy|Z!ImW ~{8'~=0q]0.GWrR $O 9 [rz8=KPyDCGW;ܽf噝_tF|v|پS}Ǒh""uQ%=Mes" K/CFtDЮ"' O#7_oQ5nd]}#@rPBl U&hxTufap Ȋ><~@*ULN`h&DDF>VB_e=G蠭^6zhwgֺ=\&f?dFoToM G֤.!df&*IR:d)s[ sP댰aW䫋7&SU=(wD?D! I?ʾ`%Ýr֨ໍl3k;gɢMQM2:xV ,3$DREɠU?,ڑܔڴ}I3^Js3F u?. 6a~w,FET5k̙@y|KBKl-6A?^!}"ʷ`@fg#BvOJԮ":ZA{C\e}jٚQn€5Es>\N`٣Xcq*x"96ٔ$;2/q8 k\h7yx֩ n]~VЛ Y:Xھ$S_Mt˙#6( OHDcI]rQs o6 gx\ɅI8irr"vz~wzXoT1!m>Ox`Ƚ0h;ە,u:o欃iĚl<6<)]3=Et&!!?P=#\[*BJ8JGqMѯk#|cN]%yDo3*dLYژ'~gœ%s:ڕnaç"FUg)HIج X'0/=v_watG[0p~?KcF9y5nCsPݒ@ީLJI<2M w0T,v0/5LxNT6 WcAid:j"uQ[A8Hc^Pa| {ngƾ:S5rM&F pŻ 1̓wuf JxX꾇  *{;msC0j"8LTzltEPp`2VG{U+($6ZSU*L K[1MQw͐eq NikMu0hbD(d$'k~Z0U8VHfBu泛NEՍ>%ŭ Tw-Nc/uSٵ+eUY0$IM[앾V nA$C3cqڬ-#G?M3ӀJ-*3=8,T28`9`BT Jm xee "mΧwNr\j ЃAv@γXZY \0LƎY+J*&>޹_To!A!^?=j|B9Ȱ*WD40LpnϳLŋ_=K؀D[$לfS jq=L/^uddJ5.̐Va#ccQ4?Eg 2B X<z^wq#D_C]ɮ ,PQDU$+) k7iq⸂ͧ`+mפ_ҋhu[߾krv BSܿ!Iu B$*ރ?=q$tq#^gb&m%lɚ,ZyshGQ:^4F]6v|/+LJĦO''!;ϬL]gt` U6K@N&6S{aG;>j ܾ-iI( $9Fx XM }3T |6bVU=ss]ِFyя5^6N v5xDA):4VÓ ș pxW?u-zDѹ=CCߦ铊td|< aM$$?uq,YiŰ!—wrk65傒[aAV ہlZ݌q@i}jŽ>=šBlq0HVh`lvνV9 D{Fu4d !WE\hsԎo}YQm#Ef_վ/a -M ^%o R?Y{A{7J&FASjr KGT3uqC!ٖxl๞+H>i5Anpt-ywA\ [|'H4.ژZK[au2LEVN1V/!^8茓U.?Zj%txpGfGYyFS7ԨX!L]~ ̮o[L{T6Uʸ Rvz7 L~%\7[Շ9{P%ٿ~u ^u 44[5N6H ͗͌{lZ%wjFr 'ݗIMyX\#,vTS[֝zCsJq7xcO밄N_sg [_`w3#eKej}Hn'vNX9 N \Z+Rl9-Efא8HDHWsA/h d݈!DWGjEtbzŊ1t *{,";&8<;@`fH .i, m?p}{3CiL{/G+Pѡ@=%(R@2IcQ/h٨^]8s:w%o\p@Nw&>sBQ= ԔXsz ~ՕY[i_'#UXwuˁf?/}2D6D^ d7N(Ÿ%KJeTRbN[ɧHC~Y)>abؘ_HH2  Y'zhhBm@̗OJMѵ&Dtwn J54Uu:5;T5/ݡ3'K&((=f`hpz^5sNh~!6̠ƙVL1/Ԁt4<ҋ~߼ ҟ[C+{ce>)DHQ9) DpK G?<9%9obg9=;_IBt]xāl*o>[jN!Ɲ{ׯPݥ3oW|$45 G50#*D8D$/f7Byef5z"0uːPQ?{A 9UUF7#PdaYUd7`!a$ݿI<.b\uWЁJ7pMQ@p=1RNW CqK'>R) #ks&YV:y0"hn7<{*&"`dHޘN.SRSgȾRryN'iˎA/Ř:gbжJA.'u\0/I1WPM} ^@q#j*WJPpZʇ|W><,*C2F逿瘣XQa3M,[A!oo ,$ LJ-y}!ZW!ًJaV .5顩b"3nZ⍕M󹠪Nkk ȹp(r‚e 8 DH`)֛5So3 u"Aٿ"X$邨f(hXF% %fy8e0c} ()͇=/ BtcWCR0́aXff/l`z.j]ܒ80ڑX3TVEƵ\kDXEMֈp/c-^DZ ,߿NDN>(IF!Z<Z")HTk;AH#-d5as@ ab{G~h`e#WjϘMs"I2h$~C rciH_^=Ê"l oE0n43*(YAA]c'[|P)-T?,kzB`5efdVPzH cM z+GMpکHrˏO״6`0'H}(6E]R2pGm5Sn0D,GA (]pޗ[+ ^lDHI&fȞv$ɗ&wr˧ bꭟ`;Cnb S] s*Lg5K:m5M}? d4 i2AvQZd(Ӣ<ۆmQ"pSBnz`P4OLp Dmw£CMe7UaӶR{G#׏Y_R0ЇȂ',Fq;SS#W"ۉa { Q]DRnFw2TW˓ɠRϽ:G_.[YO*ΰ}">4Qښ3^<1eA  ǔ#QpA)ч@#1hP֞KBw/=Mig'ɜ$V y=PZXgFL.Mnm35Pb+>ӫ*Boe 8-fD}iܬFszfr -F[mpj@h H[Wq؂{>{FI=CY5pqA?#^- xB`@1&5+Xp')ofZ1'}5he; ]rm #Ud&O='36%CxTj%ݻL%v lkh5bUE :(W{WOX<-o{¶Kk#AGߌ<[ R Ǵa\A-;hêTd)v; /q m~Nj5T.=IDa+T-9n  eN\voxD;b,ДG$9Þt!Kl˷8tkWtI 6_#ie)&Mfjwwo5HKs8 YM b_ZWԑ誤1oRt2uMA3ٔpNveilQDcc#I^}Ӻ B.:_my5 ~ĥ/`RL,=J׺a3$'>}<%>&)EDZ-io:pgDcns ի:=<s$i0t0撿 ]`vV1㎦g@} PUHp(G\n n1gT?˲jjtU_ (Mx9c6OMD ~Høo@[C 4bG'm  KMZ(⷟ʍ48kUݱr18XE4H+42x΂)dW)k;%MӯGaӈݐVt=}b  44rdbEyA]E:2Xy\NVzma6m:@~ɇqD0>PW_Fh.h2|Ga<qwjl%kR.xOx6IBY[~@ӡ&OƫRVlIy㱘x)D2`Һ oG P0:DZȲW^.v` vVE\ y~h-r\ Z5AEh~.ֆWf"SM؇Yp GtX'iq'Tz1l8^*:=nQL,c&2󭬓ȹ*P<8[Dr꛲I[}(-/|\6 .U"MLGj}|D*sۣP*G sP[m@>i+zNyzL64&s8AG.?; 46Y+Fw9A.k^MWKfQ3W9ZMkP"3RG̰h 5Pk! 2 "rsbI RDeCc䡐rWM0c# uɅ,l5E:b퐀#B4d1>HF>4ĜK C*Y2u dN"c)6[!~uz^6asHs"G#TFWW+"ճKR K(r:Mu\& Z\\_sPQÚz%_X מSB\E:V;+;aYCIceGU'fMAkCVs0>X*@g@pRVk {5c썇Nz [+C(  Iֆ:>1o;W⓸/߹+C֨  k.o0GQM$Bh(Y%16D{c@,TK m:kcn[V  d!Zns'7&cWo_ >9wn0Mlzϊ?˪)K: Rnϥ^Ma͗{@LM;DGm)?|Ux -oH] K<)v x*<[ l&,Xfwf_oǘ.t,$LC{h> "xqd37 !(R":|40-I<0TWD@9cLg} şKwƉyך0Z/֖pE"Fǔ}$I ؗ(SZt>U1?77!G6Psd_쨉ӻ؁ )pMa^[d`#8'Ar;E 2d4+y(K!PbX뵏, )R}LԥU(k_>v# hlm7#iŀ.CZۜwIc l'͐a L%Xi{J/l\]TEhπֱݽ + L C!ōFjmEX˝ŐGx%~<i1; Y @ ߑ|:048Q]M M3'׃#w< Zʹp{C69aW?y.q㶵^0e4=Qg4dEpd,RPH -x)\[FO_+qJik7sy,u4^(C٩T {Y# XOW^xI^fG7F,?!FD\E !K)p =)1F,J}<:/xi ½`'Vz>fFUW* .v8+?yZeThXb`jwgJ?WOvRTx` .i^lz:T؂j#ϕ&;8v9&pwXe@Dzޖ Ϯ6ae6ԞȱmVe3xcjdD+K(|N,=uשA,fгM[Δ${} Ի/;V8ƅdgUbM騡 ޚ 61nP'V Pvg}Z4#XdZI9ifYKpbjED?Dq r1b͇֥qnRPaPdUE37-wE0}a4Hm R06l=8qICDh&x>3@}rtLR.#qw=ð{.X)q=ڗcz^^#%4+P#0l9fSXw#8. 2"`pFhJ=zx_I[Ye^0$Կ-Hpt~V˦Tiv KሧxjJGiFoQr?IM5W(0u*cirRS͉ 0e<߫T )S?.Q8;]33BNVU;B\B:̠q'4S\C0z "]4轗v#WpbEWN5Ul0bə {,'wk'Hlw4`l#ݶv3]wgc-/^K:ů>zfQX?LE0Tj>g<TZVOHlؐ^};R\fY*ߴ5=doo _30g_!"ɟC?Ya &x5~F3mmo1I2MY^du5C+ՇCLҗϭͩ ",;EҸz eƧxOxj ! a!,jE>53+( xKa J9 h39U SѢge^w*)0[:vx2L Sg`#%y`NL_[z"FuΩJ`gGv] ^G,qU|%[D%ۦ9$9HOuGnA"*%<_i2׬?a+*M̃qnW&ZEsO$8M%Q&cħc@ ZX(ѣ+ E!2J˜x4  ]AƴnHЭbXX?|ȑiӯF=E\SkaEdH<$y^-|agQhP *`X8'\~|"+/Q}]`8|QD(k^Ϝbԣ2Oׁն98 L2a"9,ShIqIh 9DʦSë-r-J_Q̐C(A5]i[SffXPNJ@LL'?^1ۊ G 嬔4^B7t f9R9w&~2,s>J1F>5Գl[D^#9*R*PngqN_c'ӚޅNl׍Py(C- 5)~ecI3[,z0s.R1k3, o`[6۾0U12W1cr qtU'Qi`}g%[ \QUz׍y0oGq^?W" |=+aØKmЄr4)ݶ?Q5QώKb6pg2gP  1u2!."6V R\~dᴖ\E- f58)L#}ⲩ:Bl/(0[$q#7{A͖^^ۧ~[1A&?ȴx4cy͔bIJ OO% nƀ ާR5Ĵ?Gu>U@G 2oK=!C2LՐQč,b{ca_ٶAq1exb 9O<߫ꞓ_/&7Ǻ>nw]HWqυ&PӾf'-ÙQY*za$kJ{>uӗ?Aٴi}8>ψA$5˞fμ3DxvcNSh5z) p^:Iǧ4f+.?giyR9Ԗp=WU*> ^6+⣆йYJyk+cAWӆ~j;HIi[ J{ȴ,K/<$WeZpc 6Z Rʀ[ B~ҲetL+@Hzl ZUuDo>Ź8Z5* e&*y,/!Wp_De-TN5 '_^}~ev3TcPF)vו=/q PfOa"Y'*KfGˡyHFOw򕬤 2+9HCQ8 bѨ;o< 7++.,w{ =wu9.ۨ8aB ,-^sH$%RyG]N|J aO;6pH2:6QtØħ,OrovWqtP Մ+BGXĠ[XOҥKMHĀ%m6/]qhY ꞢH1ˢ0KdyhF\4gQ!z]w1N2#L0 's^o(5lR7mb2 ÁN|: Ara9^N_ȋ.:?ݡKx<\xL8߃9_Q 6"?lȈWWJy8^ )*c7Ft]aC*$KHҏ i[FAr9xAT-ƚ/_"CO BZ'kˏ{*%CSS{FQx ǵ%Β Y7| }_yɨ1<,ONECpH\릪z)=ri8%0 sM@&D/J6 0)!OhD9dlsd`ȱ&SiXI)YgOc2 q7h;z~@ڕ N ;'UQmwe75! ȣ-@TumM-7=6_G;̵3iOw+EdYBdыow-Wf̙XnM@pfHfaVD;?i#ab ǥ$l'1]“e3YG{`lƜ :s@+W%"17#&M<.s[ !yXk4ئ _sp8@:jC"'gt>nQΪܤͦGRo AdI#m "&dE%uDz!G@ʙ˗KvY1xԟh#sxM@K) 2KH5ϛ8z4D9A5_m.MH]<`PsDzy ܒ/؁B5O4?FMEn4 mS yBGwoÆXa5̜϶U_x|?1 hGc)h9ܭ  Ƥp8:8%H!]l~P%lIv{&8Wp+=޹>h+goB9 ^Az0~U\ e]SZ(ZxkS4^NV@?b}R.rxOryX" 0 j@jk4|ۣ'<~~LCܘ͠,h8PĞ |%6sy& QU~kyV1E%FNP?KƤ벗Bi.vȈeI&Z2zqWkKq鯺Ma ! ʞ*WXM .G)Cd 5y;`t"v Y+ՀnP.Bbl*(<::}YS{A0 4Ų1e9~MӘޓ@3?X+u֛+Ww=^61RkaLor%2?z< (2Zn&K]_`n4EXalx~Hֹԙ7>C)?*)xcܲivBr@FBQ9x uPəX2`lRWB&}׎w0ꁼm !gΚQ2F]`>N QE0 C"I늵GzQ;\̊aaeJCJ9R%+ (]3H8O\%"@o G:ރvfd2/5rl4w̅䑃gUg}t{e]eqk@NRbY3̔idFAqF_._NA$i5=) 4_D-k CaیõY:ώ1ëwb]t!FVkGi{6-~-%ͥ-}5zr0Z6}S7G֘']K'Wfls2"6PՉll t+%ŮDQTJa}2sLT)9}8ž N#_5;B;kVӝPPWnտWLSTLVK"'q龺3E);ON2v_=U8fC,*, %VgI!o!p~~Yi=5u _|ڋUVёٍ-H>$fk Dxڪ^*R5-vrcinwMafKxı޺_,*/CP}<*^q-f~p%Qy;Jf*edYd.s,s"i1t'%,iW `i Ϝeu8R A(H' CD4eN!nGJ^**[Ư}P2WR˽Cء(Zchq~)k՟FHɵ̂Cw`dGM*+aMϢ\ u-Z}bPy,s)oH~q}&dʵ[KԩJH`I}]x-+3/);͇m cῡb I" Mڀy^`WnY}O? q;uz$twf{\n66.TA@M-1!}M?[JT}6* MXUf22ϰθ8M>\D $uVXsVdz%5$M1:zpۙ_UjCP&l-yӥtJ U>8H`p 4|߆ d_aוOw*zh^&QnGc_\ők>Te4=.JP<ٹLE:p?#Nk\G*l2eVkwbB![H+C̸4~Pyڍ֦@!^-dK7/)D |vV*b`Z@Իeߺc_O"l81x SS)#N# 'WfXFw/Bv0 t`:}llux[2h\ا]*h"GA@ptEBE-B$R9Q0={E {Ϯ6tڒZ4d1܂> 3ԚUݿj? _=hժ||H.:]=8>:(`O NZ6a E8 ;Q=/} HLWĞeTր_٥Q"!X_ӟp ,Muy_GOVRE(a;c;- no-6Pbt? |ZrphC*mOYR 'B@Mkx G ![2^ rÁC_L&D4݌ѦV:hj 2*!{=R۽"/FěLl]`s4f baJ:v&^<~e%xF̬Ic& ֫ t`T.9l-3QOɅ"2csh$M CVJq/ǐMRCjF5>gu7n+d4S^%h)Kz sF_e 5DkomHEʿV`4jXDM~>dxg2bF5Mg6}Sl'F(Y%bwE&J2@}F0@HBʬ[ ۋHfɰL3 6Y^2M;*b;[#2/1NMY˥Gj/N[ XsƏ|eqUA<,lE8J[4S9wbyqGxXCXY%*x)0߯=}8ZF̆wpWæ L;GR1b=MxAfZ0$%uc]\6zh'U,ͻL .5wE>2E>vz+vD0JʓYJ }׶6! !Os-d5sWX+iEb_)?)+SgGAJ{$.l;8\/ev!t6Uk_R¶fO3Mם1o?*/ v+ю|_{bj;`h!(~X.!(DJ=WQ| ^4A[H;kB7Ґ$Ѳ$O=a󻶵.V;ʹ%`7uh$dRu9G?V.7 M0L'Wq~ :үAV'ƥuHC%P‘D@K6xtBu3-A+ `iᎵ~=^CX1/toMkMtc/J1T,<3Px$X%h/~uQmHA"nj3B kgH;d]Rw\1JO"blojw(K!l>"etEݵ@[( wFI19]aƎф\#-vC'SU$ sƯV)F3%Y *6~1` xyҤu,%|ĵW=P$O.-&7ep< 3{m11#ڜS^!?ni@SVW{b}sx~i\sI> =m6Ϗ4Nk{$Ԏ?ƭiTن3]C`\e]9jL ]~ems;H䖘 .p\k5B!\uԗM{V6ݏ9[)l4}I-7(Jki6̽\ }B?]$s0&&Ijmc3 ?ImUt)=oNVԖWzܷۤ#HƉ{ OU`T(佨}H@{C3VpX(qhA Ҽ({0;N^@ZRo*Z>~$w& _^u  M{892[xtuR82|/lisNL|%+j;5!4eз_H*E//:3؋[-c_!>^\DMO:7#66ʎ !fv\žjۭJ \9߬RvٰF+Ҏ="URvS%JE\ ئz0w UBb>,S4[y$㢈ws7W-^J?\ŝRJo}W1RiA$1NpLb6y_j/X<'ΪVFƵqX['!44qsH9hAL|YZapZJxgME6 +E* a6&u߈r}+Mr{񪒞^|(L 3B+V.sq.,| ؂3VUB[ c KlUUu|wL_]5}VT\>ڃSU9Gǥy?R8M 5s+g\N ح2 @ '$&zŽq~}'1X >($vGK3OZtzR y 5 "/2pl_߯в>Ng9$GgYI֮m[놎#F#yEku楢L{,_])$F01ۤj)P^mtSz*$ by"`ڬ 1ARj"0_"6 ɉ_T }f%SkI5#A/Evx j Ǝue\5 7YQo00XM{~'nn rDSJ\OG/bpuCV? *+uA翤ϟŃpOGX)S3,A֏*U^x-)Tӫڅ4TDM̭5HBde}-3qS%71IfZIbD/*/Xe𾰪h+,t9Z\Ly:p+9Gt}8g:Jb1X"Ǟ)~<># >c[Ƥ}D={ /9Q@ܙ&#A!dؐi# d߳`(%=y3؝lYD?cH*όj(wCT>LQˤGWmn(e/=}ۘ@Nyu= F:f3wߟRmċ@Z5.V uf%,l-lqgx!.ݟPZZ!N n'/3z[ VvPԒ<`¡E=B-S m-}7:U`ZY^&]Q^ݞ8v_?'☉nҲ%bc w|o!S: d(m(*jKrd*Q3__k1`1F,ZehrQ5`[?sFoT6I8,lڥa~Au\pLO .ŭ9ڿت5\ vo3P:q!P]#ФD_ ՊݟN,V)F[6"4WPT u0@qblW7&3[@wZs^aYyV655MCPޜ/l=eBSA*$VWjbר 5Iͪ q+?sđ@ƴZI"#h%I2-LAt8 "˻WϙNtEI֊GSOyoR1FmQ8cAU{~۝2+hb(Uǜ<"(nP ꘚHXX# X|޼f[Dlib+FHkH]òsXLZbXEdx}h }X|-}Ƒb б|!6 5z0R*udě8]&Na該8&%NFr[-'˛.O,6u}|Ղa"U%2Nb~Xnҩ ֗L,ݠۯ G4sdxo 0beP;~;`20Ȉ;ƿ"^b;ޑ R8d1 'v-_)ˌ0C)^v@=U3KJPnjEKF2{ps*|&n's$d2ħ7 lمN;*N reӕ!6"/ $Qk:يC1qV$m;mY#8R/^ &[[w#cE""?5 E4C"uC&(*LA &8-w@,R7:lSG {VX62 Tե,saKulI/j,!(}PV |kmT|tYםi>wu:ߺRhe*cU] ѫs@ %)3=n9~g՛GL]#,w >lAo#_w޻M=d'QCTQJbq,Lu.myI%f~+" XB0Ӡ̓Sr >:]k^BXk MGc^_",ߴ.Q`<N=sMTeCv`EL53s REAŴdGe ")_" V{zJ~l iO^鸂dZBn 9vZJud8wTٔȐvLg/w:5v'#QV1, X<=fCAA-_i#k-eaG`E bU=ASec;֑PL$BF0}(* E@ָ-̈mygvłk98޿ySmw$nCj'Zsr& Yd?/t|^c,<+ͫ-md$~- NMZ]4a?lJa~l[uU[{F ϑhp2 @پpɾoT{RvbٹMඏۃ 3#YzrŪ"b@d}zCTA??N"n!ԐI:A5BWCI7{B̕H%+?R;J\3;M74hͅF0L~) AVN^q+"nJH)'Q [ 8^!bӕEZWJ:JS1jirHx bC}fY9.-HOf-O!.{yzUiVJM"1sq 2\vOJl=fP>nʌE5\7v}9tΧSyB'%<5W|t!%m߂EEO1C+s7T=b j;` ~9aoG= ;L4&gևz xA+w V}6ꦫA]Ĺ GGE'{[S|tJ#NjqC7ucZmY\nv5p@̓ER DUzlqJKrHu I@/9h\{8b)Ѿ&E.?* p@nyҫ_SY5 JBfh/Jk춠M4x5vf#&?80 NbPH5sWXɋ"8fĉ5gV*Ŗ_R׻{ooߎ| {m)挫<wۭrfyO@-c<.o(,$aGi'6h}^eL$˘4;HXT!Gd(tj6k w O=$w 6MZ-'92,P%EDk90M`y`lx>ror;gA#O({JUn¥%R\R=QiTBZx fN/,8 x2woG31)ϟz 0}< >T 2/~S:Z@?HOW39dfz{~\vCv8R_س:EoGV#ʂ%qg]<^' zNSa coÿ$6n(mDX=kEx?hXڸGpi$߿7so@}|:D.gc6,it]<8[ZP;O;C%oN$4|F^#\fa*/d<_"&Co !P9} }{];1Dj4:j%-IʅsȗMn@9sܫh> Hku}JQB;_}Z!k6㐹Q%=ʒޘ6$}id3Yў|&]FtТ {R+eNG}$oYu3|.+yҳ?cgwM)zv i.,HYJ?VP#rkh)*2@չ)'jgN{Xm!ǜwN&,BTȍ4{_Y~%>Gn?~>_׮]lRw_ۯ=xFRU2.ݩLͪvEѕi=tTLe o2xrbBV_t?Q*Xciu۰# XL(KfDL__?ܡS<6Jf$TՄk9ĖX?PNܵ%¶ Pu~Xe"7ܠہep?y+R=\]Kd'˝}[ꝭ9*ulO:R F<$}: N׸2"Z8N\UݥM>r\N-S߁6-c !mަG7^;K/G@ cij7G>aYiCS'T刺 b,GxuP< dЬVg~(S"u SEՌ^\@:A6s<H7 äg]-U<e"Pɵh^/N+|FbwjU, #+ D;ݲX\3ߜ#*svUX<cO+UUM筼/).QmxI(b%N &E":ûҨj|$GdO/C~ R2s,-/_*+6?D ۛA{&=o6Y}~7>"'{xѱS Y"- S7 ][/  IUCr LRw>eKA/~ T+@ܬ(+M6JBB֟Fjr Y*G=m*q_ U䑈׃Hmyi#FXr cojJ$f N|*a">`@Hё]ӖoE:X}Ĵt@/I_f$a3!xrw{-8:b?֣g*_{VHZ)q2,݂T^@1L#5.3{i|*MK;y!MJѯP #Ƶ(,XwYs$VA We˶Y=f|$!˻gjMM/ \"{w|ɥ%en\< 9q#R *A7#0M9%>&^A,8?F;- 4WFƀҞ1?@4Zv.5)\>!n{G#gM!EqM('Ӈ]6'35ݟ?m&D]0_ ,^53I&.=BdA7!0A+!+ >ҢM[hstu7g8"!Tyq)v("r=ev?-28?<V48`߽Ky6B?t13nX[48:&Y:ŋUB=_`bN°dM~"<_CyրpR4[. ©+G7XQ#B9Frا}{ ,j;F;۾:QMΙ\+ gH\ܻWr&ӎ7GYkP[!d;1?>XGsY}ZᅠƱIFN{h`US.}h” m9S:oov"[gH2'FPM 2(c*g:'`pp5Nl&D,\OEtt{N:jn'Dȶ(}\m@<Hm}`״ϳN˅5eĄ FCv vnXGit[4V.fN̆ lUl_Эg0" yvMTnmSLhd>=ɢf~c{亢3-qT Kb^SIY漍T-/js2%!ˇ-篍ɞ^jJ]q׆ K`OGcQΎD-~;/[ u1W4 #i VoXGB|MloK1Q`ł,M;MV' ?eb~/4mu0;ς].7[bJB킵?Wun]eWwf# #oç,cജ;ڥ\}w QfFnU\"U?PˡH}rCzc6"YԐ;`fN! p^n@g&7i-:g x37v>nO ͉g= YwhI0F)oP@n;-yдĪ\qcGN~Y ! 3O /#!Ꚋ+`_C;Y.v]X391#_[;JiǣLX+,5F#Q ਜ਼RQcGHT|4J@xJ 7ƈG3P_78^N)ye~({oj-:q#ȹ:VY Z#5Td9띍}X@7q hjVk܅-]l5 VJ ~naPC9!'XՒ橉1DjڄCN٫)]{ R]€29 "nP0`4nw+TC~mr$lN7it8C5r *xqe!fQVL[ :M G]8c|U|ȞA7o0P Lyivp5fRIQRV ]x1o:Rr6l5P?oĈMhjYk%%~(ʠ#Nshr9c' JvNFS2\ n߃1Iw] ,7<.z3ғzK/ ͤxuz}k /nH@7sS\4]o ᷸`|IX8rR.=tA:cr+X!9(^؍NR0"kV3? n,o5A~4. ˅Q5z(:],drR ^) no%1F!dzd˩\ Sq !CT[?kuG >h[frwwaW\?ٵNZIÓk]x8M.*kkSyt }"S8±s5i MtŲݧ`Ĺ$YyDJ#G%4&HYB#͟T v=AǬyy2ZtdY`z} C`.)Vݛcg` M L= =ktˎn"|v(8B{ #G?Yᐳ s]"M-(RzOBޯOZs;>&Wuxԋ';Q6N2׋8scC}>>wBO>A|ZxE-2oo}+Q)xH{]Idȩ|`Nמ:815B4.5w o$av2?yh}F=w#U7I T&E[4!oblP?M,, w8Mt9',O +L2$2ꪩ'ߖ@UΈ'1D;PW##q-7\?WM.xȹ~sTiޘ9DC~~fd~x{k:&.G烠'hb>yY͏{`B\YWQ\覃CLTln02o)ۋz)~ë*7Y㢑-7?+ x'q!DŽؿFP<?rSzqx3 _\3Fܩ(81:mOYhC IwKĎ%ןPv&vIOw 3KǶfV9jP֍bm\gLW¡ N˸t*JQD1^^WA|g4_~B\2 LXy`c?Zj /#ˆ676\/!щӶ wKO 𷻞Ql݋N遊3~ _7$oX3Z҈G `3rǕ[\^9wbWO7J*?rFAUjW) 5 Sp&"I.[V몍H5`QAt $4g/7G'xl_|PcoZtɼG0:) ^&u#ls3j?&I*Tӭ\10˱B`T;l-gvc_[\D) N}kXv޼a`QW<kYw3$o0sUn}jq۴}$؏ޫ&5@2Z+l"Vh^bR-\fy15)'0_so0tS 'E$yuAP(g}ŽDCǤwDcw.[ hR/LTM9 6C:C}wXyn dDμ<>&SװE"\ zl'$NGX?5>.7M#a)n_'Sw2юh@Q2:Dרocwi^XJvo2Pa|Tʲ.E_yn:BvjD=%Ȇ=,crJCAFt}[ͭf7,)rv* &3l9B1€@rP!DB, 9YC+*?th4V/tdLDzNJaP,;6zjDHO9;o~<6\@a!¤@+Uצ@-a|4jT r}j,[]$J<~)Rz<_8W&5IIPBSqzd* qEݎj!ePC8幪Vk|glΈޝT?-pfô!֓EE7vu[Et\V2QgD쿻nf_ljSD+Apb2Z"NS㾆G@OI~JO\@`DIcӭei:۝XW+l%rdx#}uN:D6HR'Ircq]^(#i4쭈=Bt SS?.`#@uBc8!bm~X`6S(ٍ(7qcQb7_$p> EU*.uidouѫ{-)EDԜ2[#1ގV4A=R`(P'FMOV@9uHR"3j{W a#ҀnA4~]AV [\T,uM`&U_-D't?[IS_ɚm 1Uǰ>M gHG(f.W'DFXfIV"lxC4'yp`lE̿ b K~"vi-K= L#<$G͓(;)ϨtoItmy[ ,dIˮP'`˺_\*3vC4A_R)l͢raoOz[ | GVq,yU-E$0!w Dp*#zߵ0Fx"WTgLɌ>$ep)ɏR,Df&bڏP|gIӜ %qg4ӡb9 [/6·A3>"PtPu\+t-%Žb%tu aGP6{mUu`.LP\p^zr'aT5wȂ5%dUjqA 'TN)PB=$wEFԆXgw0-Fs_~'P /Ǘ0O ύqT+=S鋰 yh|VoJc/(Jc=؋Ԕ vb,y_ORLbQt`J[_5]뼀fɰ kӥ !zF{:o"ĉ/tY&Ax~nR7vɌ[VJs9tQ򼿒.gpEK*&,ǦQ|!4 ⬜AԊ$d8qޤC]~ \yi:;nvwiqJ|pV>ss[O؝Yg( Tȵ@6zt|~>)A;E6CDf*_oFӜHQV( pL{^[H*̓akVd :BISf4Wd_ʎ'CZ͞/ ~|YX_,Hlz1S\RcmCSC*ӊX [ruTv9d޴nbo!kO^|<iБQG'fEg3/eĦ$%<(kSx.N}3]WO(ER͌|g& +BVXAU^ԝ ]4o0h z̅y*,,{pt3 *JdT(胇m6HPr&n m:}O-m[)LT{Eڢy;:QdCyH:쌨#iP-1ev|*9˱ C[Nt B :$ w[Os֌7#Usw\44k z?I9bpXXLT/`*)ȂKHE偽Q|ܻSq }х8q:'~1\L {q!*WT}S [@ ,44{&OFK O J[HY4lκnϣf_;~v:DyJ"t[PsRybrv]ƞQGrm2wﴖ)W;D`n+k.@0_CEǼx3FqlQO^+8] @}'|q5t=fPDEegO12A%S ^Kat,i0}Rz,?lBRe*IkT7˂k:aҖF*lg!f.q"G[-{ZӺcv{1XHlvAݺ=Qت< ^- WX־Jn&E;f\<%VyUj+B&:d0Q_d}v]6$pdu,V}Qjf+I D  >fD/ ȟdŸcHٞMR0N:ho25D$_=O1|}vIkGTS8cyb6a),2X.guDm}h:wU2!o?xx{ESy҃2:7X#i,. X[+^:W3?fhSD^Xhsg3L᳊$`N#1gQs02$.yJ``2lTԖYE!^ƱQH2x 28Ak QQ06rY)@-J~<\aix6q [s[T!l.E˥DN΄g;x5p.., dSSQa}HAP!x~^>1@ۚ7'l)qgރcx4Tp1J $mY <$7:=]@aoZsΝ:sh%6[Fq w|Xf;P&/coι4dĖzQ(/H g{\!9+$kxA|.6"]n_`Jj|ժ|}PB:|4*Y(:c,Wh̬ τK﹕I:sBK3ӓ߮4g'BB҆)brcJP /M ^#n@nO$(Oz KQx1`O$0?&R?\t\m,wleؚ'0ל]N)Oާ~9%M ҭx E;gC0m@9K~ <6n-9.qЙMP? D:'7 =S^ڄK"e}\rd*^PLk6WZ<"ʇ|p1s55uWiHM+Pljmp%h+ԫ漡{'xLDEמQCM<1n:u1J.C\NяupidceI\d[+z,*7hIkCC웫_k$r"|pHڔDyi ^|۵ek8"[eH!I\"ٖBH4v^0?z.EIeS97XD1ya J\(<'y )Kߢ]0p+ݶ_,5Q , ;Ԧ8\y{n0IeoY962cn-pH^G=a ٠{1e!VIȮ`6Ԉ5Bjy[!%MG<%BT̔Gq0eC!e;J%R0ƃCJuͿu+ɪj{ObVdILuN};vE.8l\!65: $yD$ԐzZلד 3Do7}’/}u n*XUά%pKO!}#{%A۲ )IN)yX:FJf%ЂͿyϽ pbep@I/Jކ%q@x'掮ڣ#q菷2`f#4 ]kKVŝcZ٨n>@FkѺg .$9b,(\0<[]tx7)N5 ҅]+딘 :..⢦^b!rE)տI5gjػ0#']*U _FRteC0ӸT 0>@akg';弚>R?h2BN=?uKĖ€Q؞Q7Y)pYZ s3ɴtT;k^bǷM=q^ ?Zek LKcr5RSԞqin"ud?( q9t< h?#&DŽ O]dXA`L9C$ax#D>!教G}}yE 9{QZȐmfMr~'5Z YVT36ãݍ(9ltﯘ4L[Qɑ7o &Vt‹{2teJv( uKi˽fX/KfWs=K:ig۸bݧTݭLe4UQ` ڴݗ>3jJjf-d#$)Ԯ9pv k?S9q9͆nﴢ x|.K2 JE*W\0 nW.//o eRϺo«+ i£z66?*5 $ඕp~SkF?eȨX^Y9ҴНc48D'}>~u.so@ J :;/ 4R9d7QS`z/;>3ߞ0xpP{^[5=l-ГDITsm!;D.J9Ag-K피W$kU5!3Uh&}tv'hV1 >s(ZK# XP̞~VkgewbfP\FM9ƌS׼DZN4${u@Gʠj o@v<] {{(y:3ayt߉I@ WJ:y`?}kźBB;Ƭl:Ds^ :]OQW$Tט0RкLz"Qч$ W+_5Qg]A%**DB]\Gm l`Sه[_RWfr2:}c:4ej PR'p葸^ʻ&s ^ g664.阅4R&mdyrR+fު*Lk ֮?zÚؾ33{`7߿lqԺ5?yz 6]P²&ԕWfrSԥ>LgD+Æ#/HL9ű)?H{!o-"D2aq,!"ΟX@r\ÃY4A2M08}7QkpsK4K[ɂU/F06Wpj5.%(qg!ZFYĹSU@ nOFj Qa@`^}Tuەy3N#%f;}itGqunLطV>U\w[,xU>HC(g IT.9i[l^ \RYi<%.8M7DV@"4znAAxGt`?+3GcJDV9Q"daprOd\gW\J^%B6c)3~+9fRj~\ԔZtPصv+?Q:]"4R-Dha(޴0},W8y  X(!ffo)l]$0hU]d#3d;n;'uojCts P{C#'s2=h_)oʞ`:ϤfIYqI8??IeWe7[eQҹmϝaRx 3) KOF9m[ZX l ;w_@ =~wKŃ.նj7:|""[!#NDdF.;HGEplXeb!W8 ICz0jigud S''v7 >W*v-ZK4;uZǏ|PYsW6TP ޮ ~aS>j))ISfsJM׏;XدާQX&MJӒuVKz~_F$z^ڹvMbu k XsR/1:Ione]Lf4b-> V@̶b6g fHI4&Dq P_X>l&ASfQG6 XBZlVnSzKc܁Fp]E$Φ0&<䑙Vv (ZǦQ 'QRxcOo13, ĴN Z |WP7 ©Qqժ8ж(==6")Bה,mKӓ󊮯=$a"3_@Yo<LPͨ$j7N8plmZva#aB.V~RPJ 4ІhuZp~}`y.(=0V?OqmQFj\1A9g.|n` jP./T9)Nx*gI 84ͩ ]`ӣ2d=A8NQކ 1 C85h&әN+]W,N ZcLʵsdE/axlذN4|\ݣYh$2%~5339|X2G]ʉ"h_n g`{ix8=&L}w5wXX 1OjZ"y6.xJ'sifl`]GǀN-y!Ș%ȸ[6܎1ɟ'@}g%_MC47UEǑQȐEQYN Qu)O: Yyҟ6,(\%T ,uڈB2§2Z&^9. lX!ÍE噸qվ! 5i wI0\-.9ݎl$=M6D7}<h6LGQP-MOPV#QPeͰ0!m`Rw<ꘓB\D+q39Zi$ `H!ϴ/q 1r8 U0$3tx>&d i "dy4FԻT=;"}/ک2hEm# +S0Ő!y {^(rKY Qjޖ 7G aS݆9}5|'Kte Țpf=6ϕqN>:$䉈՝w-T.v%?'W]rr(7VpǻmLl{{2_{jhsMzGJWK\&9N9cW;X&=egB K3ًA 7WRʉR[MqD;ZY_ݦ{ޭH1=ɛxW lalf\C-!n Ac\QwJB"rq(om13_X!^ m3Z~AR`7"!\XVfq8%*!u.# ;*@.?+v+P"IrI47`5Z?VK85U\08z]Y̿^mY;401t-#leG,vGGg/,:Hr8W GEdns p;E:WD5HSLZV%ӃN ywA2a }%>U?5jb:_/6g0fA")? %c(s:Yb4Y c0pq,- ﹻK1>(l2L( @F×+}A!)%0di !,IU@X-֙hjY㈾Jt:zUkI`I{oQLj:*!$j^+db_S+'-ǀS"LZJЌUlH|.Gr'm\vA' /D[_ C^hUBkj`ӟ˅5TG5 -%YgpǐcQ. ا.& 3yGfhˀ. ›Ϻh f1)!Si$4gJX%b`] D<-\~OLr rQlby?sԟV[[_đ4~Ӵ.a4ϻ&W}eoqx=}j AhPe),hvw\jl!m3q)q2 .FB &'v*Wex̻)쑭[u?{g=4$նCh!-%گer\@^.&bߙ؃lY h} NgP+>" &^@gUTwc)a! o y^bi_Ia9ګL(*!ƚ6Tc]1M',cF̒ fs Q`@E"IK;l5Zz 񿥳;#|qYgvMoN4f)\1f}A,̛O]~߲9I|^G~'yQ}MlkZlK>H!TS' fg{o%0H2?*~۶܅Ww=$[Z#{Ot7L6[ mWS翰>Q@_Ubj42KD`Zp*5 uxp5nzRi)32ήfSYMZ1pSiٰD65$7Ց^42ZHb! W]E uqIq)Qfv!},)5CnL,LQes-mS] <}IvqJsYko@%r:aȾqaw|Ve4 O7tJ93[e^Z%zxT62(PC08#ڸ¶&s[ͪq5ǟ;j=e͖B 9ԃ_p(Vm YנS.;xph54wIks$sQk d/FõJ.)xUؖƛhM(E;y"bP˵=6dQ fNB7IaSΨ'HuW8J+FlN0]ZvFCrN tZ{ޙ eD{|r#}kx/^gZ.o\(_$%CZU͒m>XXβnäaϖ%ETE޸ޙF/,22ހC=y6c\γ_xUA\2\'6,y$ J$5(~5=)/Yt] PBc%6]PѬxMNZXJMVĄpRb] -4՚3D$QԳJP&AMBǿ/3 d`U]!rsFJe{j”f%[Txz fUT8Mvx4kC<|@$Q֤?64X.,0 |%MB{Qg;hw6X0?+gk$DrJ&j2yٜCdԬVQ%{\V"2a!kx2[m*-ۆYNo }0v] '*bM ThK] <,|0&X~QbYႊ]z-W\աj2SIe03$~WuWHrP@|Z3o<W#|}f}:>h_$6bN{+nBBU,W̿]]o3 MHK US9S39f\fubj *\lIL"gLL"f\S61]jJ"8N1ʢvS58nx>0$^%BA$UP 2M^; K}eȴh8Eड़o'{4y(NJ *+Oh10%q!a=G@䘆~{?Pozy 4O XQ{JuTiP2cr,$NVRf|A"C<Ճc0o]XYUgه5t+ĝQ,LˏT'5W)C&#dC^Pm$~)CXPYdW->VQ~XgOfw)+xw2FNW»?I!tǽLEUthMy;!Nfq(EJLuPn$*#E%P0K7"uAPu0Xaq=uR;bD;̟7F̀k;+2SE#ITsw_WHd1OeHeϠejݕ2DWp/ҝ&0iF;0C01-">b텦 ScM}%a }RExWXEݧFW0QNU.D n*)(Z=٠ LS1 OE$Z=ԄdI#DIFc`'iPHGkSLClQ͚cs2a$G⾏_\+1吔zO具FI>kq;g€[mMx?"^ cLzfq 2)6IV!,`窖58=Y64)eci G P<`RL|*Z?PpP\ڟ\Wa/,&F$UZu V^3GgRLcCM! 0^׿22/Z5 1lʂbqCq@6ŖA ˏ^VAz wˈ7Np}OCU !GfK3JݯHXv9|OP4^|qƪ?0=Z:1(ZYTu%7-S6:XZ{P?\j0ϕ+룟 k1 +oݙt2R&kq9^T}R§1g W(rgS;*Khzk%D׎>hI0յ_Mε#wPHz!@|˃w\JM+z0> pAiX*5./W{ mӺ" i6^}@(6%m$~}?qHvXӐ:PD,䪋,WS9^$u&!69}maJ. &cZWvWNH.5xp iz6 9QdO`n=tG-Z{|+I'rQF^AC,xʧĉ>OtY$6y3s~ V92Qf'.ZE{6+$l{*V3Rwdȱ*sgX[Q.4a@Q[lNP2;^+zZ7j: JG%z|%]} 8wғu%!Îʘyaܑl{1J) xXV~tG^R TcN76nx37O%fQvptENꕋ4 Ł- uKhZO9"4 ȦǛ6 4JSM$qQַpTauQgA8Мx/эs`|֨-vuz=^3GNҘSO]ek(:?nė.sH/D術Z-r)sO'<9X&q&?Uxvw}$ 5]8ynN!(EoC/h Vޝ {G3&,ЄWbDᒰOI$Jyz?zjij^EXA@`&RGS^ 76d«9z fv΄K4Z #A522]1Eqh% @ԥ} Wa.fz }68qńv Ty ˝@ruCӤesZ%-i]Վϫ#8.Fe+7nFMGjc\tb$rEȺF.r(8쪰(=? 7 xg?曔5~=vxW5&G"bxBEo晝q V o&T.}+G+A8Z?^5EDyYGH {o4G7(1ڀ8E%%pX[yp6v? 6Asr<2N-q_4 LDP|}j',H@=9?hGJ4z{7x)4]N OjR + FA Y L!q+EvHKDGN/g12P23H9h֖nƝV^E7pG 4}CXtmi @X\Ϲ7d:bZ<'G6ϡV9s8U9^T2aU$ k9 4ߋ #dNѤiECqciRG|hțI-NF%1,h2\_M&ZQD3kdGп{N]Ĕ"su.7>_]Oö>rU~qYVѴtJR3 3vV{+̍H-!u'9a3EP4GBS?!&w|k>˩=4  .ZڇLH.=^rcn#.o3G+ LH9NRWzNq/Z#bpFc{VCqٵQv ~3jPOe-j+pk|ە~/907窤7Ȝ?h.4}T.ib;T֦ju:<ë6$F7wqaU"/2s&/(^I>iZvTɟ d0-C">׷;J/"O3jq(9Uڹi݀W+Kv(:^S~pieҳzӲJZӨ21K-!^8G77|_/dPy,fG?^,xꄔH1ӱYpe[Oe©"agު<73f4ъ`wRӶ*ȼ a\z<xDEҿS@q+_nXtΙl^XyO\o'oqx(e[hcU/mA)p7Ƹx,āe],d2k*HDZ#J}t `|Xn8H8Z_qSXaLE+0 5q-oJU!aR|w~^<t. `}oo혧#6Hlx`&p]_1s>nԫ\xLR4^gҤyՑŃlq+i칗l~Can 0| &mȏUhbȤ)[jPq&n 1ȡ WWеyv@Ij05oִ EQ.ܘB6eI={BVx.ɞ <i{D (b짋7 RBc4 Ă &xapDzRuDY+92YvݨA|:V 2B<|tV͉BTj֏o)S Gi퉕/N#CErL;suKFsu ]pGd7}rJFHC݈sR`? 8[^8l5hȻ;-=[hkLʐۅhܗq<]rYC'SG9vzD+?Fhxg_Ṕ8>Xdd6n$ޣh Z誖?)zT:FjiP"Vm3[ cCMj!p1>jN8p ub]?t{p [IrXs*~QRsai&"6yv O ڳ |tHVWĢDuJmNvfXC$ Rɠ?$B1 9r)wӳEQW|, S}-no`0m-$D074;W8LW3mIZmZZ oXaDY Tġ4I'#ny٩y+ "5'/鞜c4j"'-Fĸ!qT\q_o`saBI)`趌1iJN;)hf2*><YZTϲ~6煪V!,sz\{IߴRa 9"p3i&H|prKz)$/E\Lm(K-"j6"S >" uʽX 5+~M[ZnƀVú.:rxܫmK[^Q+X[_"W橤CVCrw7 }o2BZ@^nɫEu&DwbM,BdĒ4陵/%bc.*Il=LY۬<78^F'TMe$8Kz3GM3Vgg3&P68r̰Ps=h\\IMգ|>D 害.ŭڢnӓ8~_H Db!; qTo2bpo ߺRr(Af씖Tgq{eΦ";)4!zyO9Y^5 v}qXb|.TJGygƇ}_{pIedzHfQ`I( k7ctHFkJXȚ N&}nh+R':ql@K1P;PvR[UF> %~kmV)mI<3|c3&hG8ʮM9w903]Ho/#'@v^M)p1]?\L8řjtX|?J2ϙ7t$hVKKaifl9E()Ҧȏ7hjZ8闋zA4svM[!I 80:: {ەC0G[WbZ^'gm(CWat aO @*֛Fϵ2`&JY]dҬ6UvO /9[1fPN孾y4IY<5hASK748v[ZC<&*KG 2<%kSuJYx6I_,_0lJP]gKx5ҒqwBnqKn :o;?.=fpL.ԉCKi;;Cl,aM;Ql{|xH}(컨#陌Pv){qZo.Dg11*8`へ 4gþUF=<[1QtO[0U,uƨX]wi,A˃xkVs_Ao}iZD/,sYGk=(vh`8K-gZ'12w(jW| t?K5BU0|oF 5sę—~*Ck!pu"n!)*,Knh ]RC1}uF^'.hd%q-eOW 7m硖|dO_m5b}pnpn<+%pQ_ڐ6Y=V:p2UûN= .vB)y?ӊ:B]I)$fP=xk::ց/Y2<# ͜?:IC'ge4b1hx#&CU~[C+U~hNPs G%I}@U+KekJB$e|J>D| ( #7rg#o4B&_ ̈wtbV 2S4ɣ]aϮ=Sƌ9S!`y_Ĵ>$kw a@c޺R1I/|} 3lc)H~c!$ǿq5G|$F!~L`/fVJ'<>ѽ|m6oYS@ߩI'rdO#nrS>X$btty( 4U.l jt6ڴ}݋/sz8Wu3{&/xq8_ Է$l%!pW|x,M!vwo[?Sk4!kZER.X.*&4^m}UX= )b˶X $N^EQ0#Y790k7ƅT/;H[ b g"4d|(GY&t-g1[]4sVfxɈyp{[EH}0Q8g3<%'WgpO⡪.q532< Kp&ӁFbsh8,VRKo nc[/''"seqb# ɹN0 B{^*yHNycV5+>F2%q[X*{sPJRm]9~$#o-l.=t&bdY ĉڶ]nA )>=je(D|yFĀ#y1:#9? 7 fg:ZbcDSjFil%(-B?*pCZ zEIwǽ-@ndyxYV|g_*qʚwÊ&lrQ(ky&;o H@}蔗=~MJ.B~KA"Y<}gFHIg#)O$sQT/ɧ\&'V0L"K@^!;(VL;D|}z/jδ,)! #@WAyda+N!THe }^e:*~ݩv)[(iߣ® 嶄ӑ慒faw\q*ڶǨOawB *8?\܈gx@L cK p?˖6&;f 97u—$ & zIJ|s6uB# `-brGЉ:ƍ9b9vqwsy>J:?;XVp-.%U3t 5XZvџ_qdNoT!f2,.ZEt&C *QV] D+7˷D)pʄɂ2ynYJPa}va%HhПn.=u~Ou'&n=/+<%XFiE=X8 GUQ*8JuxJ)]EcAW I60*Ax\@x9e vkw}6=9ЯYG d_ɘxuRwG֜Y+y*DGqKEfG>dS'Oe0QIOz(+DN2VWJZ 綵}k=: Y뿕(S[9YlEqM*Mm 'ED>=ɗ ZɱDM i+ KVpR *ӊ3uli/c[o,3KnF72# 2rȆe5UF-1a 0Kc8?,oе;`I+T _һYj B=7^^ڸVJ:ҍ|?87=NJ6T߀|V9ȮȣwXΏ =þR{xCᙻg0xØZy;yv҅!W}q32%h=:uev uV֡$P/H,w(rF?n@ 4Wuhʍ;  rFtoмI}\HPQT&8ҫxo Z5%k=@z"`{sgZ7hoYmӭP27je7B(9.rX y*,ʳ 2;fCYޭZNLTzhGW(h2D=p,^`%кm=tm2 (5TBd8kJ o-jj B_c=| ![I}&04G NL0u\+n:r1gOgq?@J5wG[\q$oZB OK։rҝܝ\g6C; Iz#NӨWx>fo悫z`tQ8(>]7iv"ViNDQ̫vEoFniRݩ떍^PavRCuWM;~:??jt6ɻΉiV[TƥhPIA@-kI'ߤ[9%y^5bQ2ٓTnI i~?ɫ՚ejts^cQ gb_ o vigN(ap]{u Mx $gpBahmu h||[Kr]hu|Q[zYܕ9HW"CGym;Iܐ%_`.ia:5"0!@x4ziL 6 M E{BxMt³r]$Nv9؂chdss wbd6!|՚ץƏHo'!N˽(=L͔_%UǐH9#,P> 0*FFHMچg -f) kH;c #k֘Xk}G0Y `-޼uYVׄrykxû4&9&K,!EOm)l(8ZH%f'}Mَ 1 pƴ&fc[tL$ #.Qjâa"%J.($PN͡ __N0RJ6jǓ 'T oC`:ե4 %Yox>4ܒEqķمۃh%8R E~屯KvlF>d H4 ]4AXQc:xڣsW~Z觡iqas!6)9)cAs3V((S}?S$E:22)ֻ~"Ga>9֧g]YBJq&JV@emg9l[sMrWW%]+sF 1WQL>V\%r,Xi%h^`%X9f=Iwrrd ݹdܵܵYLX癋o⚎v8iϘ-. 536|T+z@]ӷܸP,4)̯@*܊'_d 'HQ\d'\W$v}>?%1SN}PhOߪ5=]~]5ryO*D:ec m_%:Wö 7Z9Lr7͌ȈKn=hl@`Py  OzHPgp J/Ӆ_NCz}",+*]@tVu|=L*xmXfY>‹N9gBv6ƾW{6l9AHޕyg&2A'dܳ)81lx?TrV ciymk̃?dWÈx=" %RIabq*%Pb+wxKq-GQ^L4I"D-UdRFd/ Ѥ4H_e&F3݂s1 T<*,w5䫎n#'F"3X*jrvTj:R#< 4韯 -c.$FaDռt\n@ۗ ð*dpkrtZQPoHU':_U 4!'{jg{Q|vfZ+i+ 7Ќ!/}N.滺 gׄv>CGroShCS,@nmVRIqu@9a\3Q~l9)d)륏=c,yI Ҥr\a>d|h@!6X;KI NH50(GG5`]%RA"Q-2 P aIE" MpJ0bCR/r}CPbn{\ؙ-O;ĺϵO+S4+I{QedK2!r8iN?waȲ_-s@d 5@BP4a;<#"d@<6-߲ ++ Ȳ RяW?0DqɎohoL,˩3 c28*gcuc1Uӷl m}f 让o5XoGjcEjl!| 'EXkQ-\81473tF+ MQCnMa*1WjieG׳nA*F6/ JBK\&j#rb23wͻQ,Hlf'|SÖ/&ŵ[8 2rWiy~O*$y}EJȔ)/,G8(qEs VM0 7:ThGȎ?TWuBҖSDz_(ל f~5Kw'hvċKغ\ 4SHl0 Q@ң eۋU{W\WRX?<&"c{4σҲ[*XZa9 9NTx&vJnoA)< ϥigSUqP}l6ryg;*6QN9;D)oi%lK= %;d{?kgt-D6'Mૈ֨/+fY 0( y˱c߅QQNg/gKK}"-Lw:9Z݋tv-OW7W ?(u w(y50Ⱥ:Ҋ`foxAydQgUi r%& tfȌ ᇐ$F7#9 тgJPcX/%f6U{ΐ IsIDj%B!86Z}WNgq@oVٌ s\ʔbp v9>]:uJ"4QJ]hB*.EŕKClE0j+{Oj-:Uf%JuQ<2'i? ^a_e!7lF8F :+ %,cuGnJ__AiҖ41Cn%p@*Z.WvR4 ?C* Z$u5o}ցNP_|$ǡA5U5yDSڛqLa fl"{@=y)>*p`N@;/Ƽ?g'H̺aan߈'27lz\tt]I(l_n,!<%ȵzp[?-7/Ԯݧ-~g?+ސY/AG2%YN mff6冤)^8y'HLz{f`^&5<:{ʭ tSma߭pd̰ܺ|؋:̒ߏSɍ@M}ٙ9`o$J9DJ0F:%} DlT_~M{qzn*ٛ8BfKNp0 A=Ew4"yV޾ Ӌ!* Jm/i?j]Pi -N&{΄= ִ66yX8J Aykkf')SmX'qXek?혜l67f nd{\@&fgwu#z#eC~+r䢔nǰGF (|d{ĸdSwvCHA 9_jҤ?hƒ'^>+3ZאOaSb]Azqo5zqȀV^ůæ^hU|!M\\-â8x-G aaД'|n]DU;T+6P\jڂK>J51.IjgHE2?pAчx 0݁qpCjX^av1Aؘ>`(V,ړYIZkY1Y嵛TDje:-4COP6>F{Eefi(~[I'+o4~S6BfQi'r3`YAȬlBҲpg߱"iVvCvbS!CmӉuz|mLK/ޏRƯXaݱO* f E6FNÃpFoدib1&c7Ͷ΍[sSIdL[ ޙo>D,I2o5^07yTi֓?2=2A!K'th]u9Ӹ2 B~es_ +\8Pa#u$fHqQo:u .qfAHz;>E']gEui <:ЙQ6Kx'HbvE.U륟Gؿwr^^m<z|ak Rd Y+>FM5{GeM3d+Mi֎wYSlE@9@׽\4?}W+C,>x $sUƿ S,#xs>Y{G.Sv^.x PwGi'Pwc|,wr" Bf*>&7vw]A꽋v[{bVo=#dVW;|SD,K>oc|0,څ|fodÑE;/8f F:ZFş4Zן\QC&ćz,7F@B,xȞi2%Ez_j$0gqKO<3S3\RIr 6@PJ(La0vWԬ,S " t~5T+thtS'(bOof ΄L AyS(f1i^r;i%:=7gc¦7"ۼ YR3IoS]MB)!`y -LG\q&._ԥP'A.>8ӶU@F:#(6|@ ?ԃnRB'䝿Bw){$ҭ>r8or6/wiD?xF G|Qʉ3pꀂfWx 0P\SQlb]^p`=ӥhG㲦1iJQ-(om"rZZQ*ĮM w@R~&n<8es'QB3]Q8ϛ~2ri}`wlۃZnY*:T̢#O!FS?-fudsxlޔ nYzߗ:QK%cͶ{~Bwh&sQ"zܿD7C|`?CX&U)MCG{9{e0K g[=h@3.z=%Z$Cĝya FU:;fFcyy*0P5.hh"5n2;=-_ ?!Skv2LcO]%jzp{4SW|@/0̌鴐_dO>%KnԱ{M̶ft?ҥ !q ܃=ٮ , Fޯ(_i9b!eM`?|4\3Y|!rِz%a|4Cu5OWH4M|]23(^lSU>Mm/Mb2t[pjW"y-Gt;C>riKx DRV$oЛg\LfsfZ H2}*"GRl4M34JQ [璪cŒ;"ZFl-Q,($>q@7cj?Gx}.$j ߝ2/WWZTK_={ΆTRk"I8$lv-f`"9Jm^Zq;R9=flY`n5Ī lWECn. Hyx"Yur3sQ>J%~y81\g..i9(Ѫgv{;cCRؙl* kAXQy׃bȇGq25ixi툳ȜS2eIB*{s 9<6B e_qg~n.}^i"Abee4],Pbk4]^TY6tAwt/D> -:/.gdy\E([VG0)m5Ou'o+?vw8g!& ~4] S&DW }1(HQnc&uf xDhI^X!o'-j}_5 b}!\a DwT[p}ƀ/f댔SQ}Cmc{r>}H%\ugp 6 3s Ou *T0XB7^HM Ƞ 1|rlly\:e8_;}m25bN,-FbmБ s LWt.U\ZI hce+'R؂r93*5謟e k0y9n-i R"egJ66*l` IzMgfpe6~v\]%Auۘ @-&cQ;IZ@*JPcҔ a%֛7$ЃG$e7}Sp`/q+h\涅q|.?p߿(Beb[Oݵ7^6M+#{.[v/ީ+XX {`&rFYh,ݷ~t%.-`XK\X" 0jx{ $$m^.VYGJy `Չ̰>W(::?mY%pqt:#لsXQ[O^'$KMy/fȃeyIȔ¼eUןHvAo }ًtd+ XH-B ƳܠYiC"{["t. V <]E㴀֜ޭ8{HWuY!uҹ++#>1w$ōu2;O9譛o(x3YPo{E͛X,%縉bֻĔf#-~)w=J|4`8C#*>RknvKL ]ƱP_Ain߼9.a 2,#)O:~հ赯5XtQ댔{Y; K?ζBl< qy W@\2ڔ2\q-% k֟Փ6{*"*(/4iF-ȣ2@QG"9|_eQŸ*kb!b'yg\2^g։DH~[G3\(B6ΰ_Ʋ@G GiC%_m8C ~V6o5n<)$zg u@ fd~ ( 093chS/ e5 K^Y2isa Ùą3l='a/^} &?o,e`C sdZ)fSqHQ)Cjw `:.z`T-$>*2ZHxlb!!HݨTW_r G#M][:[>Rm, <}11[2m2g:0Ɗx Wwx72OXLS66^ 1v d)y+lfO8W>w1`Whj "ݹq+Ww<$ 3I|d3g;T-\QtJeXڷDa{2CiGѮ|Bf.Ń6al,af;@~P,>8`F S@1mI ntgDj!lO^nbSMddSX:g8GM_ZˮA]zYlսI4F~j:ѡYr5j"9ZN{aHkX۲3A(F@ iNPe?*hhd jJ24;ꍟsU(qtsj̨<&\}%/(|oIƁ{T?*~F$[Iv۫Y}j(6cQXt+0WHVOrU_Z '8`FG)?/o ww=&ލYR:褟z<v3͇L !גi‚m ( Tz32>v:NLFW{Ā5q(3ЪOr3'?1?u绶x o(02cgt:k9LP yĚ6mE)?D̉| ^}EFbè~8bk¨K!5R6>":z+jddwa_j9%ϼ{Қ+rr 7B5NC^ξ[uIJ]N\cދzgX i tq!f,YZ o®[ѴE1=w 4`VlvQOv т yɧa=/kWPEj厱w]K9$1<@ ?KV4,Ğh%bsL4$r%.rIA{[muS)D8yBF3dƍ ->a<=:D}jV6~g,@(&_A=Q]˖B ZYd)is'PW7C3٠-Ge>(g7mL7ϵc9bk_Bs13tvbFF+/ƔSq[+L6HJc@b1q}îb;&2D2*&Y8-( N]p>"TeD?a9gD%}\ۊ8K_\==n*_7:1jH=\%1(H|`BR(i^~"8n2~[2biROvJ޹s5EJ"čak](@7 Z[Ѳ^NDOׁQ< b9p:lb[ >ŀ p̃\O͌ uLkRx~$tr&E-3L 3mf#v$ԽBܪ6 fB3ӸoZ34G~~3tDDԺ"v>: ~ژ8{"rr*ڔ#E'ʈB-{6t)%™oFSdRcظӷ>'Gݬ}uUX2YEss&l=%N˚`u )|WC9,alYI{kOh9PAoeI*`-d(3Ѻ.IlxhhPܠ>yiw09X'9yQ#zG 3eI&&\:K"Q.D"JwzXaCO"-k_'jew8 帚Asup,K.Y}XE/@N6#o>=,aO*v<]<; o$TFFKɿdXQҫr3^#3̼ u95S!g9; 2\PvLfݢ"nqYDٱb(?$\2y <F׋#y\MBoMȽt&;C`!*dWϓwL@jJ㦃`3"#]Մ7 +Ժm^Og) wt,<<.zQ[uܼQE ߍ]*V8Р8h)J/Ab99YPnp> q]CsIKzļ@'WxxqN`tBUsY!Km*P(EJknًъyEo:N` ]I vmg _ݍ|Z97m#ݿsN<]92ENj JAEJ~}(Hl,ckatlV5=?VQ2g!2oPZ5r1"\]롃 +n?-MŮ#*vgxwMLLN$E wUpW˩<.1L wM1agq<[߷Dɿ.PڛP>=`7' ~'{}gQX1C`iT,>{efH}I\Ss5Ȍ8b5aF*B&NV]ac4'~O'y_{~셓c Q'zO>óY=0cnJ96*ŏmLD%! \{۰-t"ᬻ=㋬?G=:iq\bH@95FbDv b^Jx[ѝax#;RxNJB|N'n3ҦR+WP@K%_~*}cNUg+6@6mp{6 ʆCq௉SȿMH _[WD]K.>JѣHG"WI6gYIF |fƈ %Pr}c?F&gZP;XS?ܾLe MM3!^9ree`T'_5Sġޔ tُGjaFL?|M|_-= Ph:z~굣B(Xy.Uf[z/o1W2/9'hv4f,{4S_/n-,A縶4WçNfCe#x/\(Ꙏ9-PJQ3I>L嗀*iš,E_vi.]Uw Ҧ 4;]8s$Y3%"3 eeM}%+gWӌbe{nDQK9Nb&N@F[Z˾.MA'E&RL/}m.y]h6d?͔]7܆d`@vHU/JZ5cI3<=AoiᅽgOvNզ}Yc=YR!{b<|Hf*k0IR 0C(Ak @ *6:~}4P!AdTyx|9 1k1 !]d=sR5wԊCl=\a-ԳxCZwY9HJú$ et\--g@;FjuV"6x'e 85 w5gý5V;ظI!VB="Dr3 U1N~ja:.ۚ<#?նvYƷR6_a:o}BQ:R@UiVK8ɻ?ah˃~;ȞhrȎJ͞>> `3,ɲ6"@͡E(lwU/$DƊe1T7Қh DGaDB0ھu>> ~lQ; fkQ~Dno3l/wE_9J/}ezB`P%8&_.\0_<;p6|?l *CWfoΣ ⾢?HT;/hZ#/J^>nj P sAaҥd]z'};E2+Wê-ccF+, yO=,r$,SU| GS bKF\yKŃQ oѧ'+ztN"WBcR#SBHuYJEC;\% 歙SitYr| *:MMݽ+-ڬέ~:J)^2]?];`miPp4vZw]`Ua$ؕ-6 $Y4,([wM>@$=§B %xm{,]hy:ܮ٧~LddsPSiҤ$ѹDah+Zme{W*4snY%gCf۞V~F~ 9uSڋ-8rTN***5IS6zVao-0 y!+@z@0]%\GR{,>yI`Nr=[bt] VaKʇ 4xD/vz F{9@25a-?c1Տ[]WKf;CyFdzsܒ6O5i3K¶ h .[5%I*u5؟ R&۞RWf/`fBZ3tR0ʉBte2*Ui'zXoToVA (jHnX+E3K`Y-#GbiVֳ(K*>Q8tk?u-/`~sԈĿ,Ԕ=^?ؗVxG^_O6B>84RJlӥZK>]s?0\ޑ995hJ]oTUޜ/U.~}^ ~b|3 =SAURƏxmPUXIK 7D X^;Ŝ>r#\-:F 28gCrz@E ut>~5q鎈ȶ|K~Fcn|ȿf8y_"+\NxZ4\c>4y[C=q׋]}T8zOYbMДv4+KSx$'`!_9^=WNɟM)46R8/q`cH!x= 6;"( >jCb^e$9󵊽3-1>%i:ԻlZ~4D֐u0$uہ: 0V>a`MA>2_] -ȫNqys1P,;9[ %ہ MB`c^ ln0$n#Hז44!f5qսAULLW}!usAA&C?N82Ռ1U>ɠAb}4=N^Wim_o &)R.;,nQ4(tvԇߖ&)R==!TI4ʄA8¹-J<7k,\R[|-fj,"`hX=G7uwb\@4dgE ,JɢE֭?֔"Y;k!C~UQ*{R*ŧ99(x45ˡ |#"'F:0nkD]a 0Oəie+ufwS欐hR\@ą6`^jƢ0INOX)Qiᯠ-]%*phZmw`3S/OEE2 jIU{V-z,Ns=XJ]ݳ9*/O]uvg<0)U dF{+ѓ aF2c3WWgx;G%Qڏj%b-d *"=){~y1e(4vyXO} sOzRրsH)u.ٵ૩jEֲSJ 08ޥ?("M}SFR2 MY,2ӷεi Jr(8Ex<V/  ?J /2gID/wυs19"% (6!<tW% ܓ)dmpR,PY-KCaS-qޞo6-xzyKL WruBW\w VJNԂsxبIYDW*ɟjq"F2*d]ť~%ȍĿr7rOd%@XӮB6Gd7uh9Z-B.F XfPWV+ra^jBA]Ë#1AfvYn$+hP%)!h˝ C)#cZdkL>s. 3ojlq%F[dxM$iڣ6y^}RŰX%3b{qC9X몑a2X%W˘Pצysmd݀ $cz. P65ЍV"lKU>WJ`G"6@1_=9GNa[T9Z;LoqF/E}9[a | ZOb躨^zƘ&FJMӫу!QOI%\4;P1O"`'vYg6CJ+6X`7,{?7EK[,v,5B=93d| hEMVm"6}xi#I].iUa_^Ho!0ӾqUFF-2g!F]51$$NX)G2e%Nˎ3Qp%3qy>q 'g|ǃ;?p/|-M|,뾗DcR.I-uLwT(Mnu[r)lߠD>18kVԳ7;tͲ Kk8(F4E=J#Uo+maؾU@ufIv#d6f 1x}y,/ʮHǀ0v6/qҎ4C.+||][S\y k隌6EXyUΩR04KUit9ʼnE#G˦F9Yt%D E]cP2љ;+RP Tixb 3:s#ћt Q? ֦ZDA3ϼXWm3[klsQ3D)pyFģ$K5 &C!)oy_',c's&R [Fuo]JbW!3-61=PK@~%E>RԟBU9 U3R84lo\\0 LA a \U,K}ܱ0}cJp*$HveU3ȾX>rFK+[U. D4+1*9lϽ-b&PXd&{hYK'h >IP;̘9# (%|lRs:ͮ\iaz tBGf{Z9⑳p$ɝЅ"v 9?qY>Qh5(nu }X\(e' 6 k٦dE޾eW8uGK7_?S'EgǞM; /R"tWKY0<)[lǀMh12;$,|lufZp.䎣Fs B[h|W%rQ]ڋG<`A-mXd4u%Qzz& #fXp 6~rgY^ J[[Gy4Ec2MUsM%K۶(G2ڐ{8r[M)pD߭>"V̚!+wL(hS53EE1UQ86 XQIFZVM!k0O(Z<{2ky| O9BdH.xl$^К$?56X>Kڦ>F7:zl?QF3kSQ},tՙ%0ɷ/ J(B"B[ko0An619$%_~r2h q_27f75&GݼmdFIQ lԿGPܼ5UAkr?:Ձq8c$k1$-MʱD&3mn!O:7}Z?7·&4Wb u";#x%] zKPY M8 $ߊ_eHoYf.YU9QчbȎw~wa(X&qr.9)׫`v+B`=4 v)mv–#Z jYt晰6а)nVȋZxBnoDqxbZ"/FQGp%tb :-/ ,9$o6 Z@KKz;@z~^zP5I*qfNn?yB#\0wŲK\$HՂofnҥ='wO0h#; 1 B7V8@kz!Zm pz)fr;KpM{i"=rD-on?ZH`E[zIR5*kTp>7M+6(XX3k7u~Rqx j`uj蟖ŭ^k֝._,}:6ugo$s:M8 f {dA$r4gXu(T:cV O\;&Xۘ;_6:/^9ﴠ*nĸ*w,56űH f]bpn\ ʼnхϬFd0t# WO&oM?YItydW[*^U T]iGYLnb䏲GwA)UH^ՙbFszE!A+@tTCaW7 k~ֆnPΉoއL)򴰵/_?#/D/tJB@QO?h}+&\F"ssG]W;gv%"#s/]!E񏑬O,D/4זlSS[=ÑȆtt߮b'gpmCjۈM>b!vtO Ƕ`cfu+ W]F!32dEJz>apJ!|y@ݗ^3V˯osb䅻?$+UoU׋n!)TII&W#! Y(;\y"wk]EPK@xKE"1"BC38U(@'O j bk?||vJE䍌s2rF4u\h&|ñ.&: +~t"y<{ϓTd}Xg:@Uϰ!};lm|6\U8Sſp$21g?ObҞ@/3S)\T}ꑍ-9%ɡw Gs{`+Waq. qUEOp1/3*kw`#:z{Hg]?T/.ʙ48o)%lfJ)CAs%Z [!6xw(I8U}*|NۂB)KVWʊ?72i%^)M- ĩ }Ue/j{6?y3I750qp%G#x'd_p:I)6 8(DDǷK#qz/_ɜcaN<"2<9+^ H.*~xal^E[_5:OZ8DP{Q X6C !L(;d@}.6u}2ӭ4/LrMl;'=6}8Fs\|zVۧJcI iiڍ-A`.gt"e(}i{*Z@&CE}c!rwJUK%4㘡/H}PDc:t a,QR=8j`?; 81 OSۗa˳!\|(J~]EW,\[q:eP 1͵3;8/^Wtݶ7%n}@҃'% 0k/-EDfUZz:o^V!͕3yYc}LyHЖ\(Q1R%ԛ1ЗSL%;"i]ط><a~ΟP}Ka6'47(xݢ -Rۄ`*VaV.;#Y?JN*Uu 86WO2EstU!x j>W00 E5G(֩MP_n[E>`Te<"/~oO53~H]åCf6 _u%L{^U?wN \~tXiB6QiĦoZJO иMjQ:2e'i]8X@ 0fԿJW<OKΜQ`) /݃T\9"Cxhe^Puh.mM@[`43XǍޒFɱHĸ寲`9[;zZfཆ_Kw 06-ʷ~"K{;fRT gvY$!lfd-j(`f2 *n MŔy1!N ~zm)hb5䑳K*Qf1IPh’6#Mڬ )Jޟ=W;%1IP P(ޞK{UY>L (]= ab̻3-NDq1):,sJ>:=Uz*&"+Mc==X@ N,g "_Ϳn"eGIɧ\t~oѣzxW&UUIpm=8s;  ȓuIp5Ȃ݂$Fș2P.cj9b D"eBlԈ=T{qT%屯w=Cɓzv+`e&,HlRi { /o5uAzEveib]S"`xHFWߌ"k%PsƎvjVa.Ezg&x'17x;ܤu˯A+168-M']>Î8m52mOPZ!O1.E%q\qJS?\$ob -{뭰?JL8)` #L@@י}ǯE dW=?+$u[嗂k >1DmM)qXC0\ݧ̀RО,(+Ay!i\r^ITA4Inx33+T+8iX !1?}@+T_ h<xJlZ͢UrN,ΖlxV[FT ,2+цO)Zdn! & _o4=~^T] @mJ>Ё]|,QU*P/䅆&܄ZX OڅS׮_lB']ݥכܬi-g8rIs:qR{ zy#wp:*O=Ol71xz%OT2ʦ(@n7U5@`pP7L z![žޟ8<W0m6ʨ)pf_9u{摅F܊cįQfW`[cMZƏ;2Bz-^0Ĕ2QY#Z4d>hHPzVrW%::9pR;^[](2#X:[E@|} c+1lҼ9Bsi#JpO}iSsM)ܩ-@r4oXQV^711{4ڰik֍}mk1Wq:;/d+@E 챦U!|1^A (!ge 2wݦeL !M5FOBq"ɓˌw^_q%ԹGr]yDrdUFqI6hd2хbC{0KXJc(pS҃'g֒<*t6-i7HKȳm^dVžE$Uv4Os~l0 /T4vs,dNXm89r 3k"ţ/i_L o?wG2gj[;i7?I7NJMzJ;kr A:޻4c#zQɝV|r ԽCt8~cZ(׽Jg)9g6^Leӂ-+#wo$S&]h䝽 8Cc_7x!xT0& Fg\+|׉ƿC(8s.t _/sS`|>|0E>メ* g@L Ī+"S[S(l"J",\2 I0ۉJUG7= Aϧ5>h"?_k&AK"VQU}P򼅇O$UKY!3scB6kpNJ” +%)g;\26(lRZ?gfJkK/J+r93=-仔,4)\5HgEL8;ۭqB쒱fVPY%?mW 7x_KG7ј@fM-Oo0/ 8B YDZ^9ڇ '4tl|.ѯMmɕ"K M؀t#Ι_"z`:Y,+͓z%p; Ċn!x*o 2s*xVHݨNu(\O:jW&+S%LLؿenl :߻RjXJic)`ҖZ4 !3Hd Ȩ3':9!V &OkU֧;eɼ~nJjVjrl]-4%ej!a% Lhn_q.ijjp؄?l6*†HF  ⟘`d)b28^NfͷG @J-^z9^~Qgxs,xgrhvkX650IPhNV*)[06&s<Ͳ\wXGVOqKa΅aM/T~gta)B߆设`촶3K kYᷟq}2hK|g{, ~=*&a[#i=$oKTa'*)h{Ԩf֭sܺ. wѬGc/*?݇o/#rݼvm֩9Ǭj_-Nك7µtM6^7 7TJlQFpn$:h/ pb8a}mKX!X ?)1trTE{n  ~%7p'8 lwܩsTn~Ķ)2yޠo4 =rt\ !s"wh+9}́{ ͞WvQ!@Qo Š9C|J)H/N=upFoS[)h>)p(_os3L7ݳUuIj4:{mH1ȺHC5$|L}dnKnb2x{ ~-쳋ЂyԎ뒋p\b<$:=,pSm%_оwɗ< 3j)P ^/kDq\{>G=zV[fJ Gm'%ކ=f[ǩӮg:)ݦ&]3r )_8hbQJf#nά R^3Os;pE.yO~wN7^c،ջj[$c!v;M-Z؁M & L&!P,#)Ys?ꀋa H4&.Gz-U|(l#Ur#DAAX wNoox pzs8kPBA?@A^#`u37=)drK./;& 8xvm}U?$Ϗ. -OrÌoQZD^hpaA' JSLjMC־у +`զJ}n^ F YG-E"(4cbjw19! Ngt|]v C'iYaP!Y;D)}l`هBD"RRM`Es? l$ vC[bzw=Tf1,M(K0*]_XYk[ 8K\3Jl=ň+u!nmD'):q}.)}I"hz hŊ7A\A/'sM͝1\_?agĕ A mr> | z1#{t`*jǜz.z)otWBm_ݰ}pՇ󞢖Br0"<[5]A(4Z{?F9r8 DORC횈l)%d)UP7oh;pKv}:^1iM55RxXfLdG﹒WD#pV%ck o$ߪ_1cVM wx2yCKt GV Dv@; :7wֶ\ 7̱zRKG!ǁ..T^GuY:G/if 18B^J;IyZ#7%i[̋?Bb^Į知JHt`j߿>4#rƭ+Sn5}Ӆ=Aeڢ+n5'w^vl~|~>zu@꤬a0AÉJ*UY) pPr?~fjpFAI)4#EckVċ5*`!A $I/o* ULHnlyĽN 70UmfEUZTTA-W8 CyrC"8EKI-{v .w*Zbi@*[Ltڹ2Co"8=I~_2}'SgtPQ9xn஝Si{qF]XbQUe~}Hi7A~N:&e]:eصZĻH)6wi^DDˠYo'>3%T"RG6y]ǡDnfkZ3ܗnK@_QLD8S7ia~;(IN.wwƈ+bǵ))R3|5u,%8FG7Y1Yvk=j]nu7R0ԍ@{2._ΰNQ)kXΨ!+r ;S,׋MCh(j+am+ OU8'*OE6U" Y i^2"d+)<{sXh{/@HO-^1iJF*#jR[$xΈtS1Uta#XQ5͎dlrǰS-`:l2s>Nn[6PKyOꑲW "!LiYQDSs@q ̂yʑѹA| N@>Ὰ%Mco]us- P")u,v;\*s8r@60U"kRl4!pŕѮm0 *&kb *,/؄b˼0`4 )kIOhyhwӐ3 T\\ rj)* e8TG . 癸YC_|{0+ǙLS +_Óqɧwz3z*@^p@,[{k }Fֳ~eҐiAWcZA3aE6" ,fOƤV zQW/np}b>J/i$?P;hH|34{-Ţ7RVZuЪ;%x!*qAUUp l0Nr֔R2kJ5MAN@}AR[TM6Ӓ0^Q|OKΈ#ó( RD;X 苀(^wRMG PgҺ@:}-vO3ϝr 9a\iQp:|h7#ai Bph7yQDę姌a{VZd_?x˜w源8/B dB%c,BKl6gͅ:|LJXJtǀ]T @_זAC:b Ti=G Z1BEp5"4݀^z墚\-io{a Ll3-XBk?keݲ"*&n%(WCK]%-ɀ^iw!x൝ lr\ź7zx"rV-:#ܐauj4,Rh!/Q';MD \HBecd:C牅AH9 Oy./mTLf%ɁuBWfCq2W'Qe$"kw3怠'ԛeRh*[IL裶"_&5y%&I|R8JHp‘Hݤ$8_ԞX]}8f7`57DJgz̄rLIop+[$˙eTUA\Lux tGv}39*.N'C&oo@RӮOآ4&CųAI ڋ73[pc5pOh-CD@vT5hG\;8s19GHP{?٧m̸l3n%<BBG#e7@q̆xDzW%$\aCbȁ'U@(auh-ݦׄĸZ{!7!H㡴5DP[9khSm xǀsa? .vJ1L 31} go3 TvKD L .JaG4pygsDy3rK^"DWaȭOLd` Ҹb)f|5o00|?o6}- 0ښu:K%|VF/^o|ƥ-S @{ Wb7Vh*hwKRORkWA0ǹп>o\;9>AIVZ9RUwMvs/6P\^e_nDIغ Q~?_{ @gK x@a4g "Xտ`Ȑ o|`}T(zg(}o޾u6Awx%q3b6jXkG5|n9WhA]nq̼zzn}im!:'K5Q >]Ezs)+PW bVLL/`P=U;ߍ?$-9: L&7O0Sok PNZ(@3Vnsg^qcX]6f|δG^ }BMq,JZpxbD-/(R}`ixdDMqNߴ_f.|IeR)͖'n4aMϗ$f': zc,hei-jS[=qF< !{(qTOfy ݝlcVFL\"91)$ĺnLk;Տ߉`FX1SV1^رw;pyrL2gHC kŒ= ֆ3/ ` 6y:^3':gkqTLϹ-V4@E׽YψH.*I[k47)خ<n YG$f^}G)ZӬ;i{/J..X6;#,1SEy p\Q0X|j*<1qr3 9cLYmp^ y"xZ} yIt7U[Mt3`"yoС۞I$|PV \t՛6agWjpkf$2$. 3CzW$֌>䚃_]+_tuW&./iھEX5ʵZ)"E#|.X_c~X40;gF\,E,1 ",}orj9| 'qz-K{͔1;)ʱ&KE$p84}U|qģܞX'_cFxQz_TBeȯcK}ʾjS+iUv\(uq[+C0G9.B e"E`,ҴȠ Rbإ=*Zַ}`9$E/‚mři'R `t,T (<ՑF4ZЪ|1Ru77WrXVZS\QJ&6ey^pg-*J]so+,^t-^9[}O?;O$3+R/1`M;X]oQ10yyhC~* .Gv6 ܧJa*5f)oHPNI՟1LAo|PoՊNwEJFDh?Fŭ ov ~I~':9b("#>Xp hWq:r@ NBR=Fs4|  *527ݬ81M"`RH*ˮ(}i%+c;! ^35LRL]tԶǜ?'-0fCdQ?Xs )>3)FW{DTl@7] ؉ ȷVxq/횞x\2ֈp㍚\Bwu]"Q}T<ŘQmM]!#cGQ]ڮaKKd INIT ;.㷙u0qӽO@TD6,.m Q~Bbτ+]eDѥY|OK@tS 򃾂~`~c7[fɉQ^k$LTqws4 gYz$v0gD56}E)DTE$Z3`^q>EΖ?iA-kNȪXMD@;u xp08N"AcD}](wy'CgN/$43!HHgq D7a_xRDWCѶ״j)wef ,v&Db/K`? 2D9WFuyNhK8}ER߭BO\BIpTE R6UeFF0JQH@%Nd `>|)DN:9Ԛdto2~xšWg[3uLj=rW)I/u BWm-$EVe`PQ=l!Ą9B+[Ac+cO}g)En a̬6Ѕ9%xGbh#>qA?wpBeUݦ"v3`>p2]uK KG cNePQEIgбg ޴!Z0|h(t/z?srڢ黠{ ,LxzD攃E y/  c/=V\^#FJ"+1"`Y7uǺQRy?Fy a$]Pm-2 ?]2f0\=;2a9?؀ 1y?y&$ amxA$d^nm!*Y٫ɪ. Zz} Ί w2˻(~=]-lqHvPv3mkh-tKj' _<|I}P/dAOC .]|(G܍`<V%GF J>*Ww,ijWt j.0];sNquTJ"ܓymڔb}_7Z~?+ǣ8.`lQPaA6֖|XJCm1ʇ@Z-A/#Û_e3os QqN:<3b "gꍧH8UyEs Rl^xឦt@+p۹.(Bz68%rN%SߒbܝV_-Jb9*Fhy,*J⣩2˛1B{^РOs˸yLy(v=%=(SJpIOir`ӛ e':^R_Ɗ*nжC(G94-Fh GwkƠ)֧Pk#)0Θz%|,r 0X#S4rDM eݸ}hV|a`ͳ}^#؈jKb:l,\c8䈇E~_A|Cu%\}H:z*qEi{ԇDnrp}bO-!MiBMS@,iHΫ,}Xg@G5vLisA.B<i.x52")'d0 Y+srJ5dqpyn$yُɠ9Q)#/{; eL6InPx w&K Ɇ=iƁY}IFe6Xd]q`Yd9s<ֺEb%51 Tj`(%]!s(D%| u(މc <8ڱP1w-},zrߟ- BUhU=p鋕wCɄy'KMCz+x-03`b_v0tchc߲nȡ^ DztwNw >{Z9LXE\̯+ ;\OS-YПޠ|Qe51B)m"q ]gL8o 궥<%!dPҋ}N}HREa@떋ce$+"icUޝպldPnYHh96brt>%L_X/))kU 닳m$o)$Qb=L SC6 ;XxA gNj)jcD*0$X#gyX+G1i#ЙŢrRbth0,>B^'ܙyy?c,:AfcʷD+5 )U-lq^N ϓv9=/ɥgaR隆'P}?U}1NE>"$"q{m:2#0;!' Fz)=❙,}}BB#9:lPS˙jQ;[QJ*PM?{.D(k6`j57Un^Tϣ QuIi Ul3jxrƨ;zɝExQ TH&"}9\m*QrVZ/(f!q15^\E)JbKBWLm h^Hh zvir]kN?Ue;2AH7;s;nq31$_I-e0uO[ӿv|<ɏ?)#fCK3u )I8޶s$Vu`UuQW+Zs[NU?tkMX $:Jޖb>d%nƅCEμ<^-!pR`,.PG10G܎DY@y  EkB6ݏ.ƻ-"5f:ZK()fM0Sy,.;q"Z*^8T;|4o;٨Gm !rq;gcd+|!~EӂjwC'ުD|teԈ{`KI=¦6>--S,hSYK;.u MYG`gXb }L`_7pCk4b&:i|RÖyj:T &s ]]OItl+e[(p$-]KZuw/]D]T*DC wX,\+ $ 9PC$F~s+k<0u48INsh626?i՚45M-E-M6\SUR~L_*).a¦c4ojR? O lt6!a{Ւlİ^eI"V a:96"hZDszGj/]kՅT1HQjᖄ;AvMO^\)NaƳ-z`leYl)w*>Ϥ &Ӑ%eJ4 @o Wa+Ͽ:fE<'!'F ?r!\eӣ`#JI@ϘY]hŌu+$27;xG ck@)WwndP98(eH.#oxn,4+lO0$ mx|̲Mt\cc@mn#$Gs[2v"lQ8J:An? :A R ?-3' XgYKliqx+cXv[0Q&vX}}y)sy*3"rC3LV_ӹ>,||XjD+T;~ђ[ +3M2چGHՙo_ & 9O3LÊۢ*cD#'ey,[f̓ZK>q2ɱ/ԓDd5k8Dh߹GcP|(+6feW^Yr&[NX3`oE(<rh<* SFK3&i*VǓK 14HHLH731d/c$I%!z׾܀ T۩Tfv#yCR0E[q͋F7%ZzSA{j p~2:XvU?g0ErJ/3I _H o9_'fUyrjpM{B_'=:z$'/>7Q/TkDljӔ |o1 w{EFeՊ+gi:` w{'4';E`C"ѷwXBMxo%r *o`\e@kdeD ׈((I`BJ*ҥYNړ.0c̎@GIbg jn_Yk-]C>zy?-Ƿ%e`3Gw|iQȮ[&D_qgK{,dP-mU|5QnJzuWhMH.Ħy9O Ѫy)b,|K@MzT$5Uc8jO#a8>n%o'BZg+5 jJQe\`-F9i8*"0kKj YRC߂iG @e뢗D"\O0QwpuDOYGxg+UCJi)0tTOxLdzyLGoN4g\/߳Xuy)x' Y a0QB5NA%@/B"UT`cܲ^Dks 'Ӹc[,'XE4h-̉-A6 is-Fwmj̝\ +T?Y>jTph!*-D?]CMsyF:_ T/ǎjV;Vuw22pH̶@V.>g][m}{kyJVS"޾fW2csc e/:q^µm#O﹖Qy~2+79l4ORThɰ~*ԍ%ɑu.FbIC<*lSyXݍe8+z)!XD E,n6bτu,=8"u~+[m"h 8T?VrS ˳# ?׿7Ghkd600ā~{nP}F&݂I/lwZop]E-#KXlٟtFb}ӍKs>ڣ?kŴM9H/pDW3j\D8 Nwk8ih 8JXN-ϟgEgYР7K[WGJB׿,3Œ|EΧ!CҡY i$ZBp %D_W$ ]ʟxƭx3_fb|FqiD Qb)[/Fx=޺*GEpaw“uU2޶c浟怶@=0p|o4ֶENш:3*GHsY&|ҲXH I=i-HR r\sQ8kNZlDBITjhE#NI&nebްɁ 3G3P/?JO~! .)s<8I=^0yLTҞoy}I0@h(~\h(Okb.Kh`Ȓ@,<9}~ߓ2{~ ]8΄fUW웩6(w6({g0Y)L1JYyR7M75"2X"7}ux42mEǀʐz H`bu D)zM{C!b7,NOhu1`'?^k7Ȇp3S8AG: .fEl7}%ssiIݘn5^aD9dke;kC }-S?A:Ҳè1/dq5Zm ?ɞ#_ 6؂ Vr`LSle:DŎ[eI5a ([t =#'<0M@<P,aNgjS_nq`B5H^ЀkNAM$!"N`7qb2_,=[^ޑK5.s^Z"5f <8ZkIjb $M/o؟;XV#Adh8pJp-3!΃8W7yrTJV9%YHulH\^/Ɓ%Pvh(װ]6)Ezk|YKgvpa…HzC0(78 3}`{H'R=cAHly{ʉO᫖>''!wO9! اo7pG32zl19$W(J qi `9`z$Z}5.S+ht3\FO.@4w< p'[Kd$ [ 5Oc$ P\t[e- ѯaTQ:G3C/]qϒ>î.xFFļMt3r,Q/8;mnsط(ieVW7Xi2#V)gUinp:G;n|H`]}Z ;Ĉ%FѣprľZgWqTi!*XSI-8 wE&Ba% 3䀃0yXWak?g.7~ja F)MRlؚl/mK R:8Py] ntC} ǟ}R; P{"z'Rq*.PH0[yp*T8s+`o%p>QX ͷc&%&{JǐCk)ignAr(4_҅rhhIbHt]iLhֳb~>&[0i+D mT,Y׫Qh0'#K L}ekZQ$N V)Ƞ\ANh$!^*=Z2vS{:y#88kLAʩ `}hʙH{~;+P@AXXDqL>=slfvKf+!(1V|<:#fYqW^4{v2"~Fq*M}IU_Q9N9ة>71ؽNM߮wL|GwK^c϶0 oĀm/biRyx!C)l/Ӳ |ߤSO SJU#0DXrFT+ "ylУ}5ESˡZW)+hX r({oz ӺtqBm~  g! ¼%$NEj+?Ǖ1_7Աy2}OϘuuY].A;♖&BA*AJi_K+c*\]j1 [&sHܢѓI5/]D-+j c(Z.hwfب+[q۵0VjQM3Ug ,)&˵Ab!ymQNﵐ !o{F6т*Kx o&t2>lS?%  '3@ݿ,B Z p^b)ϟ +@ʇ5),K$KJ1.CJi<ujh="d6?m  "K"vFFOGTa]Ѽ&G=ƤQ>m;jz-ƗFmS^yَ0`:Ys)iL& "ߖՆ1Cq,:=>*{K]tko|X pƼsM:&=5!\zt4~H@>ªm::Iu(nm4}'7$ʟ9%4g;a<% ];RMՎ^P@8Α0 dai2@T~I;COV`<݋\;Y)ʔ~_ظNF |FÒL, gʑ * uR8j/>"=&, mۛm콟Ʌ B|;% ^bdL_ CP4/'Xt RW: ;~HGaZ*՘P 8 nʣxp בۚ=ߐ4<e$䡑Nw$:` W<S:~B_ 7Fqk=#N+K]6{%8r'y`BJbFZDHIh3s0p29> 5D)`Cbw (| (!oQT~܁ ^_WDШ4)dne x7Imrj{\la'6EYЏSbjh2߲=tװ$4<%t0w։ʒ J a|\N'TXZuT]NOu*wX07$:yfR Ab{a؜2e÷O\lsjaD:zX&}V%ɞt +pGCS`3Bl,oyq LbpKNjfH?,H:i\/fC+ >F#K;+ p_eqiHoXcX80~g|(m{I4Ä ӦiӛQ%c4bg+@MN prH,׻{3}8* @~,j̦SJg3ΊFpQO&/SS{aL`qto2 μ!̷Ҙvٴ"M8k 9qsJ6\\~l}Z$U7&U^5CX.[ʔ{bs݆E;b{)zrr1 lC{]\]N ;!34Os!p] : f)xyuhBT, RFuEpn޼X%FDzN<^{!DDEJWc3݊0EM=UVEav.+F[#z0>_06`dFSѾvqPVxf qrdYoljH)t* 1]goeucy&ŋG={ȃT5'|#ny18N*KȸS`D9Fqe"Kf />B&-=;ia8r_?]i8pqЌ5]kC֐%-C飜PIbiCi^wS]ºhUf/gb۳!& SwSP){5j˯ ݄ !i?Cac}&4PZ_ᎁޭaDh2~[5pJ=Sy ~KPV\Ͱ ϘKH_`#N!aڹǚIagKrkTbB _gwg JbW5J<rgk_.۬ ׻{ :Y$RY[9i©zQ. eaD4 WXgC, 'ӂr(YhPvڲ^ƫZ/!Q<[U?Uk'TjEiPIcEID9o9 |3YG`zv j{&ҥ)ѫND4S&fC#kY*A)bSvD`28/~H͞Pz3R '҅h$Q7kҪ/kƮpkR]\Oy635DWT} 4 ǔ"q!`)e ("$̐7EK3 ,(I l}=e?es8` 2޶,qg0pȋBa=kSfu84u5Kqu4N Ɵw4ĵ0{"[%PUD@R@n9J-:4"񹣄1|p`m܄]Unxƍ+X-Ug0x(gm/ _tp@]m ”B&+'zFt `9 TVmeX}/2GF_e=J#c}OXIaLF +VNcHԾ- <("0-S`s6.)’&I4T.# ]N%ftK̄mދ7ЯRN~A7Pd2$pJ9:~D= Rܛ)օZr/.iKw!]F3.䠟d ԠxG-%eP08K`na3!^tB$55>߹y|I6Tɍ)#_jlC Ff]5>Wz(R_k7Uޯo*\ BuEH+'liZuMC'2fs瞇NM#O EUFJ4Uԫ }:ˑ\d%Yع%VȒfT.6iM^5ty<Qa*ۇ/[%qQ6C: e@L뚾s &ʂ|gџDF+%޿/Ǩ 5"uʿJGd UH0c$5}ە>@71GeBKcӧO-8@B"S `|M8yI)&݋_:>tjJs3^BT JsAwʟQ3TʹZRgqpвS/Ghb\k(|:" ۹v.FZj"Hدb}6BPP0 /.Z Z#3kc93xNgg`rF~C#!|ehIfΑYlNA. *q.n)Y*٧)4SbGER،{(šPyEϛ9)tM ݊x^[Ql L6iX5P*Wg M54[̐je[/H6Sfr}%:6,P @e_-i!򧒱 %uj)D  o*ꡅt7oCeѲ0)ik ~Jfpbw!n0k2Wf)0iYo!9>'t.s~0Qc@8 {ӏҊPau\_ц!+3'F ^|J4igTD9{@E"8fx7&+|u{RME#En9DѕCܰa޻?6;KsLh50i$2rݬ~|^xA9o$D$q)?pjHQ&ޕq[&wk\3Wxpꟃ큻 {r=c}p_b +U-=ҳ5R>` z&b|MZzϯ$N/ϴ6hnၮKD8 x/2wd+qtl9NrX"%@N&ڇW(X<@M>9YjPӮ F|6J4"hN87(Om<@ ?pcaap*&<( d] :rۼ/Wx}ՏA`";hbőB3}pHiz4|hhnC a?iIM{XwR;@<0"XE$.NUJ:⯡d@KS=Ao75Wb?޳!dOu(M'JR64*\.a^)R!voi'6H1p=%?}c-ZZoK,+,Gj#LwQG|ӟ6Ht@q6K.yzDrFZ//+K٬܃oC^T>4x?5_La.rlR0GZxal5σPc-|c,wF瘣 bR`><8EoS엇շu.MDaq ):Tp7ַLLC@NWvqQ!֝ 3e@rJ<~o!XC& 6`E+n!/Bh"Ο-dkaZyI=-Z[哫M }f -^OZc:L8kf$!#yFY {ZO ! 8K1`ׄm4yF<3I@>c Buˎ7#]h&LbG5u⭡ZTRwB Q'髌I 6|@Óe!SH{073B#nvj ^EYJnu$vu (v z*˫xybF>wfM>EjYl?j! / Yl|ZCsڈ~`Gt! Mnr;RǶf 0О\ZT_,'dӣqZ6|G\I%'ZZ_Jq!(ӭk%#@ $6ߥZ.Y5-H)ф!ĸo^ǵD_Z4od/&Ikg4'ֹ|H),/aIZH@]0'܍^"[G+ݒe,t׸kKAGܵ7~Y'[}_`DO5:cPRh_{#m+d%Ko3 ѳz̞p ggw%lо̖]A"#tJe,RD[| ͪy|UMczQ)>ŘKa-3x@Q2>(8t}#ʴQa!S1y+ TH#&`m+EF?*G}K=|pF Ni{zOĤހie2h$v]ߨᑳ[ڳqkO#mѯl'ކY4[W?W; |}%ΣCQ[U&@Ƹu#^31kɟ(} 68&h sGzsG"E^~ LIL ̺n+Mkx balR҈:A9$Ep\bkSnBNviBa- 7.0H&g-<?*#F^Ӏçqґ?r 5¦~TH|D`cj0QjUXgLH15VB%NbRPms?_bZyúp؇KyK5X-v)^}YME|nKY '] Qٺ^q=+Xfԓܵ+ B X3LIdRQ}f 6#rR>#`=>Ċp_.j؏ޯ됙 sw9nNld5͝!g8P7g/8X ; -ݴԪՒ>PضnbpθزE{c~&*1VsBہvmkұ+m >uD:qWeAјvzD%T Q jɘLnn">&؅i>I_ H)϶ @_zȀ{3TDXx>2(#s=^sjj EXupnfHoBsp8cI?M8]֛f0R ?&(z]h/Drn$g[9A4~#7s"\3J${a;s?#Jip2XLg jSsgWDQw CwS&3d*̍dat h!0G}SVueet\ДUVb+7&<.(jm"F`ߕ邜G3*Z)6n|h^  }LbfI빨$N.G"CLP(KtڽS9o+R g"'HF.Ou sA߹ϟK(!HB  onLN,vVG=p%HlBQu 5ڶYqo&^„*:WX;i3lQf+^E_+FzEl bXX -)ɢ-3ªjz`r, 8Fp3 䄡J4KG?FXn=W/'/|4(ۤVJ:T*" kP|(uԊִ6O!41 ^fJ,51;UZΥ zн1n2@@ Cf|Q;1w3ͮ@5‰kO$q,c AJ~]5[@s۽ݙQs,bbBBF9Vi^tDjՐ osF",Ĭ^ٹHZp$ sFdit;P[3W*݊w.k8GD8逻 n=чX%ʳ2ݗZΛSzh>L1RuAEݓs{z_l2}I 4Cv6ļ֠2VJuͰ ٙ7N FIJJDMHeV(7F7}E;9_-<ӛ}l-5Ie.u=K3CeS~Tq R0Vc@l4ԶA4)/*1,\-l;Н@L`q9沙6$G?x¯b -mf]dZƘLBFiY @&/POcI?mNh+>3{doB-)h S#9«Yq䁂!% &5Gx%+DʊHgVXX T;T΋7?l1M?#>ԓp[.X\*?YdMtSbHV(1rdS`a8߽߄:$ؑ# h󃅪Pcv=%Ǵhe 턅Ytoa\j5cˀOݷzchCFALJ\(a)<#GJ L^Xc7&nx@5*/dG%8Y3_|Gû8"c&CAˢB?Y 89`̢P0g>VVʳ:dN3_RgdH@Gb~&4>W[ZsAQzfA$nanH>jtwy;M؉Ya歸Tw؂o Ωv^rx5 m0v4W?^l/grvogP&pM2@XBa`Y|^e n.xoGL7.#U4şǰwFL4}b 5(a ߺ@re;m2#ȺPnXoW"g2Ra/FfY)51@&R;uw+o0TGO>" -^!H d'yu>! nl8ZzӉv)׍[BߎLcu3<nNrvPq 7XFJ?EMat,<ŕ~<~B-Q!D_Yi "=a=D_-/(/mw¾MzK7Hl3 oUY7_)ņ)4_l#ҊwAćJ({4@'I4 QPaGSʞA#LNs.zel A []VD+-r:ݐGյ׷h 6H, o^-FOË񂊒|cɘm$21-bkǬEl׫|dȁW BEd2q;72*ߤQUSoK2U;4[HID'>:}0s)K^#5OT-b] IuڃۀULlp%]~&³[w6"aȶ$vt;稛/s=b@~po ïQk( /vRo+(A!NU'$, т(Td+!IWFp8ޔWs]A˨s ӢSLMsOone,2a=- = ?>O)m cb (-Sv 1x?!>B(dˉKAw)QQӾsG`IgC>"?α/jK5$%L&,^C`)6/Fy<# pwAY0ºp!gxJZ0ye>I 1=>r!A9H_LQ lWIm@w v_{3/l.\`:t.?2 F_1w"Tf63j㤠/ rx#dq8`jv DlLhfGxS Wa1#SD4paMІ'm@8yB;mN1Hcw\uZZ"\AUp @Y?YAdkT*+-8P"E|4\yL@mΣ* DMUwkr{@֌~AӜ0FWŹ\C[nTҋ|Rr^crW^Z-)Ԃo kpHdiHp;FT -L$=4Z5*DcD; iG}3^uSiCK_<.i_ԡf4,n*D͛_DFB{F4[i`H\އ =L[#sM:SA\EUЎd/¿:h.%ohN1|YCO0{-Ix11T5Lk>ER6iDܤhDxP^T!2Ur%-Fs-=,J7P )]Xw}.ҁI%f`Бj)AET.<w9BۅrMwSJ^z ؙ MRɚ9ߎO菤u-. # dC C~W[(^`iKF(YO'vtu& W(9b}1u--6՘j]@Kju.;ɘSe 2x+qلxtl?ChUZ(FdR#R:1ҴcUJ+.4jIBYpLmhZ&ڏZrc VWjEMDA6n-V)㹐m$_$c$NVwΚYZSdDd&MKY I89bN$gR&G+_) x%ß\`%8#y3fnn!1$9P%*ڒ?QI  im;Ml'@v0۫p;2dXm}QU!gEU~" bŤ8' $e=jVuH:mYK; + 0J]<uͥ6}|FyErvw.&3*7`\mA ïA_T|޾'hakL{׫oU'mEYi-u?͢^%`|j/5=@Q+ m%r4ل,KXW*U(bEclI.JZ%0 *gYznBvBY]0>C:"A ?m\V-5grZo%ꐸFйz( z*D ^~zpxv7?_.u)+Jv԰ȓ~LO\ dy*ۮ{lB,(v"&(&ϞZ#/yQHŸN=қwv`׻k%v΂ }Sy?n@D@`Ex*O Yb.']=tE.zLb<97"QƆR s~ϓD}hN_ IRXuO$O]"9=a[G%8yE}6 Ȍ[tn}X|n %8.QJׯ!(+:8~xu܀9-oZUqݡ$J BM*?[NHg 7DW9&z"NPDR tV  T[ERƁ|)j1*RrยJI)qnQ$r$m]J>Nʏ%$kZQFaD/~uȊ{Vz/5ChR+cR匰MQgp"!#G|'mw[ ִ\?kw9kiUqR4fb~pz-3 :>\ f+φ"Ʒ'?rlRFܓX·ΙWtXo=ug:D Va-*󮊷[kf$},cDZrEA+L*6'`A`3m|YDI#G{4ؔ WcT?ļ, y[5z#:x9k7yRlƿcعX n UK2aLj" (畯ep-? VR>Ѝ󓺭> Us1()fGَthlTͲ뉭sYe!"2+80`}g7KQzo p _13f u"0 s 4Ei8%#a(epLRPݵ&j &Xp34|^ő΄SͺD-h\SC}h.4Mpa?*-^[zw0VK'k$1fF?}k*WL OIϷ&JяͶ>J4C6*?;1(*jH+- Kb@E6;@ ַ:HKHE-U!轑df q WTӳUEgt!++ ?V i ył&-&IU! "}T=SٓHnOeW-/3~Zi(0{ZD](uV%LӟQwdvʦijuWq:&ozYӰ !w]lZRBfNGQB[ c?-AoT:kX^,Ӹ+ϳAg l (ދA7E8hu%P鰹;5YݟF#VKsFp_!d`x[ZM{+#xmz'Ӛ/Ǧp^c(fSSm,.gs[F,+as5>@BrR Q^@qx9wǀ4c)1cE;sX 65?&Rv+H,'* *$li}䓩sG Fh>!5հU(G&\1`ńKsQ`F3tǒ &]J[l1j2 l:#Q}~=Nr:k3X%<7 E w<|~뫒țѪ-x?1hpa-s>#g[^|\O/G7.j4nn*x?b[7F-]n*ΕOuM2nZpǐ|Q_4*TqM&"BI:@F.@"BGn R7qFC ̋i|W1aZ?NipHrv r~C9c+!apu{3AݭbE6֫ʳ"O^~mã䃑S7 ;"d!gcVMP2e8bD(a> ub4E #{J/^l QOqs)`*3BIfy6p!1 A{(~jc ʳWZZnOJ[SR*~&K۟F<$ox!r*tUDRC 7/8ZH >A`H\,~̹񫨥LDBF&K$xӛdՃwW?VVן|s#r~^,JCj&|K FepQ`tM]osp^ՠI!\RirE8!UIҜT1]XH0A(]6SgˤbwʠeTcۀe^&Cp{#[SC/L;z$hhJl9H'!)) rA\/ڎgi  XOxk1Tlj6̸ړK =AZxz ':Iby+SջALгv~0y6bR)ngO*juj~=W 0XPߣQ$E c )io9wW| "_fsFVoKLXʙz_d(EVΊNd\d%87.@>M>KmStkCfzC &`20qcͣw&/mOdX衠 TD#EKk4ir:Mf@Q_߸nbuA`Vbސ[ s;bt_ABIn\ʽaY[,:#g+CG7OcGoB5\ DK1gH2QUG5!d'^<f3_o1wڕohz3 !ST6yMP(!`MA5\c WyF? x4 opl 8| 'nniY(GX:'mG$K8_➮[?," 0Qod -G#^~ {-6Tb9-ՊG13o5⚰+Mt@[T7owGE}'%֙ho|hݏ?@^F]̹T814j =[xQѯ4dB gqP wJ_?,6H咲irhZXA2#{>RJJ6FczM pD&O#P􃸦x?RPS"~5!9lI6nc" |Φ7i A|g͇g~|׳A.@!I YsM167MIARK'MxIOyUogKo[k~A 3Xg=3aOBDw,SX٠z 1$W5m+xi4j}gU$D.&?\I3 .YF &dͥ`M˯Aĉy6{}Ǵ#֓HJ˦CV@*&Ek\pY,4hQ0gWyH{mxB`CmQ [-%5M)KIݒߝB uj#x::|n#ԩIzм/)-YT9Ƙ ӗ1ayټ}4C"pe ̍b;k[4)pMW&-T|̰硜*[w:wD3-83LqdS %)6}ݗSs;@hL%*3m)B}*~t?xy#';e۝Šh}ܷmQj_&3kQ?*d1͢:1Mf-L<W5_&s=[8L>K0k;  604$gR)## $;j|pCa\SXW r\ݬ8 ZO_v/f7әd4bl,oВˈ7u\jZ>5&od H"=oe<"3Ε!j1Ktq>0~^БO][iCɳl"<C`t%zzL1Bv^̣=e(ͮZ&]['sz(S~p:MAy3pS¶`vnb4]Fja; Ј rF\uY"-#î`b{ DBįwjH2rÔJ H `fO7:o{(q^)$iTRBmwGx؄Ѐf[xڎYT`6?x(! 2JV|+.v? _c t}/Mu #R4a.Ap{b LҖ @7[z/ G=\v_JY%feidF#6s.S2+}s!\A* nYE=c`mױPCV &@ tfuV0fe;;:`B)(:İqZg=Ё )աkHD} l;Cj) m16"ȉA?B"S:F r[TTu!Mxyv. Jʬ!rB15,F?#2@~&"Lס6~}3e6u,t\@)0DX~$B;z&l.j]O"),,sQ/@u/\v [đ6V#xPvrbPֳ><.^:#d% _gPvy@ eҤQ)ܳtxnv<Ǒ3Ff8_S3Cۑ'[$^6!8H;.hGfwNbTz~q*RcQSLdW)im9* Y6 ;yzhk=8/wXRP;t.8neʰ)ky|vTH3OY;i Iκ09ru'LBt$,S̷DӡE2~t˖pŠsJzrӜfH: F$1%v#*E<' *i%f)]lB FX?wEKYto_]7\t>i{%`@i'A6u/:Rv]>mOz^醯ݹ1Vf.mJvZHO ˷30iuC} (02ZgGv`K?=g$):dk AyW#{"Irg){UөI>KY m5AfFnqɺrRӡJIr+wʸ }TU&tʬ-=S1m }OB (c֡ңt"8zjh:1n Li3%"b.S?qUdw]@p9\xW[q&~"@r;weiPED6&WMTSi,`&;w(^x^܊~gˬ $ KpKֽ~b z3%F\Hy::y]V:omv q8{"v;<< ޮO]5%xek<":(dEp|6MT 0 ,T+1v퓪\fCNdvXw8-+~l ȦdfӇ/ ~%0D/=VܞJ|Y&+̫&=z4W С Ey!D¨BwlpQ:.c\i 30p"̌Jb|%t^5%\ #k,t]ЕӁ(s@fA*x4BڵE;\RU[(Jqaz|2%0aU`,|Ur;s5aWPD<[{j^TwZn>PVs Fp0\{E+wX?Lǣ.Dda7s?&$z-V߸1Ã|ԯp'0xAmu!nIe+@jA%zw:?Pu){p{^M)([ Մ+=2{|X8YS=W'H5C\=Rn芆w4*GGᆴeGڛfk8vnіߵr6Mv}ñP%y45%Z/hiZ71@ .i' :hEз`';P:h ^RGI5|qOv)+(I%HW&cW O( 0*5V-QkZ1&VˋNF;P#$Mg;[."dh~f d0ni? Rs>\ 'rhCӚ6>H[_ ́neFH)jQbvV Foo-\z!6~Ԍ-|Pql%~%.^#.S ;c3pжtޘW4p'by.CwN[x(7TiT>qd !gr7Y q\ж. cG3Q Jt1ޙȌanBQ&j5dXe\1Jk~ $GXo #-P]Z!FlM\ ߍr^zQ+Dld/,BcSj]'z+7'DZZזGbnQfJ{]TKְ=Om6]iV  kոDΕ1Әz{Y\$hSx|쇌\cSkqɍY:o)ILQ,? e?p<)F7'r #/Nj6xljk%zr?*; +0k{ڶeiX;Z#C v0Sh̶`jܨr70^>5hBeS_B^l5o1W-@לcɢ+cdo:)s>9etM8p- L W%s-D~% [y ) +ǝ>~jS^*۴T願 n\6qjsZkգ"_^ƎNxi8nEC!r^QDiԍ.1>s5Bb,>-^.Fvٲ&F 2aⳢ u,o8R[jE<:זz&cW,Mg@줸/EELd#M Nw13),SЗς @=laL2!c©dk36ejx r ņҋ!+x:a{mX'0,>:TzR1J,6Q3(.\)w-D9 PQb5 VYE.gѸ?È #ALFRۖ8׳y7Q'JD'廧 = }nIjH!fun{K: [I(؊Hhwul ӥY|9Lh8A߭ejw 'zTjV7񄔟$6u"hԄC nBD Ni鮑!>7 3Jtnz+V +LyXUP@ߗBE:PG!5"IdQX[ C/hj銶NnmA2{|bb!>)H,xQi Sَ)oUq c`|-Q#F#_IPHWf'H*#mB>$w:*6Lߙ )< 8Ia{Yץm\Hywj[WL[hshf,(qas0'( g{e_*KRt\u'Eo$ÅgGfeӧI5LHH bn+ae~V <Sʡ{F.ZNBMKF$[j6(pz%gXN:67m`-E/wuR)rPI$V*\Ŷ{s^,Rq: -9ڏf.t՜Jn|zH3]\V=|zٶ۱$s~$ݧ"H YΦ 6Y0E WGaϖb CF$.ꜣfh82Ui.ܽ'9)q#@w}\F$\1ڈO 3]ꄣ夅|@# :O5 _4ǮV\ IA\%f mX4B "ňl2`\R q LF1p5JuxIz_hxfr#Аi3?&M4H'C>W31b϶bۧV A< OH+TWe% P'.mo A)V{gxD#az-2JH_`v^T{5V5R70xO$l [a;R)X+vk43}PoAZ3u;jXd]v!ѸyuVԒDV{<`/T_@x]!VYx2qxNn7č"t[+d$HJ∆qI6ı1K%[  qk@\*9+vМ%?g$A7?g=G@bsvx93BJ;sp.V4,2{;7mG ̀cWQmT % 5w. ҷJ@C_ar%qhWёeZc2VimV[;_#zcV<"qJդŜMk#f8 J"-|.Zó8zA~ pakmcK>6~|Zg<įbs$4~+ ݪaN# Hu2HF݀L#eH1rN>1)-"Ach#Rʢp[8NIDV@A:1L،JaBr<7L[ſ1,=Ԩ́{-.)[A{㤨#s,Fyasn|{b=-'8(xz!YA.b y*ZX-л"~p܈Qѫu3o:R?`rSlZK;<[zKۮL)ڒ^j3/K؄RֿNoz!ďhZ?< "49i \Ռі#{Q>2RNǑiHϥj2F<pLQ5mӷ-v7hM4収 Ef@;ͅJٸ3}!V;ᖞTja|>cP 7mwigaq@cD*FD1T aRܡG$@sڴn:uHS_ JdɆ8*e7 G "0ŒR8|72,/ %*@~,Qw."Zuڼ # nfz QMF /X)By ;Dq獎O,v̥S2ݮ ETXTozfQ'{?;wcN;p BBKT:0mvMR'tA}#L4GvM̫\g[[ἭֹŰ>}in2`X(1*3oo/]^>_X=ᮅ#V(~Gri^GdCʻ;}t`bNvm%?SN9R6*wFG1?; sǽrKcI' q=& fq⌞괟ΗvБ+rSS葺2Ɂ`xpEuxzaeZOOИr>XH,lpS \b2Ҽ6~_iƧ|u=w(!kBLFޥaQ?o]C0# &ÏY+zgU%ڽ[ux/Pޡkno0V$FZi1Z{i#Eȟpt{ԌRʈS>7#;uK;@3IVM_3Ά})폗D[=hL$'o8n[|oe-xKb½ S&FeԂLPy;Sd]ЯI]n&9w-;T[kx_[e7R&fof˾ j+%MKOtY]to55ۼ_ďt-oPn ~QsH#k_A֭DtTgxnT *Mu eu5 4s:mɾ;$`$%6~R:O-*\p#߇i%eE)`Yˡ#ǖp3m$sCW ;42XMsHEaJ:t]'ۮ #qjNfeM{'Px y}I2?%͆_żE,i ` ~ Rip(NchC_3(T+<#<@y߾JL$ty7]bYLY缣^mz;tqxU@NdM7 Ɋ39I2/S:@fP Al)R2kdmv\]ғ, x[8  P\`"bA <"lßWSQ歞4tyt*4^SR {]l%aDġy[(e<ܧϪ]D!֎"mz?hr'(Fr[NrCa:#b9Pz[Cnը,ʁ;00HMi_h`7Նxx ̈iy*R &&}^{k@nY֍ Z4I쥿 ^yK )dxuϥa^[z#2(z2DԬ+vpUjG0G_gSּ1E҈ ʢXe:A٤]0Ds&n䫧 9mE0</ n$')RЃ/#@SO4$$twMshNR; QH`1w/;prBo ~?ň,a?:ͨu3"()(yڙ!I7}?ZJ}b&}zd\h4|JUIEmQ+ݦh?ű-;安;@څe5 8 K^Vi5 Q㬌 8^K^̓Rҍ-eE}K973#f9@;hzdgY < ~UPl,-SlCdN_MNv)O(JRyۀd6c6m: a"P>,x,ŦE29()G6T'tFh[EeꛋwءNGށq@ Gg?,S4] Y|RnHI}*jS+_0&} /,׾"սŲڼ 5:ZAA1.g4~*iiHGn~f }`>@w{Tw_v~xϱ(a/dw4+w3>HokC~Po|񒹾H~RḳȬ'^yy zzPQZ)w*ᔪm6YG-4q ;;JIBŶ.[ ?~vl%׻(zFwnjX0TJQ0`P_G딟Sux&p7$jFcHld%Ġ IpLQiFbqD'~nyEؓd%?E9\39@͉${0};(Cb<;)´x~37p'킈l'Jeu [^Ί[6jdо$~Mt؅!x&KP'-<uHla*q!7I,gn=+_ tnmG/χi+%Ch54K((dGFaeOi̘p}]Ⱥ@ +}6q_LL5- ׭x'|Ŷ5d)KmOZ5 N16Lhp 8fɴ ?O#]z0/:jPkRԓ+8}r^*ɭ.MգSM2 RW^aa='R\fvT%YWY4"GɽV  uē e  >1#QahYa_M Jt]{-zޡҫŗDya4[l)7\djzC3w6j31cgwrϸK2KtVKWdRh=. Y8~D.3Azl"J/*Bp1MCw| R4UkٴD=VGs{d[ N={%_mh{80 C+pc,-\xKt&p 82UЛ@GFgoZI:@rZ4]+F za7TҗRGiwWk򊴯#^ʞ- SvPV6ND |9uH-@%x3D5.؏GxuD_ט鶄~gOPx< q jK3pށ+cPJenyZGEP'r- yk\bX61Aw~SԌ<= WaDi Tٳ7\;W7?mʤ(ԦH?I)\")W6Cد.`Jޖwndۀ UOX(&gkoRct{K}bP/Xb%tMLDX>հ2 rŊ@3]V~qP]^Ly@Q;w?+tFzi)1w;69}4ԐL cBF0)/h?ÞGbr#JBJk9T'^LH׫oῌQl ]=Fi8DoO'30#<]^}ͩt|Fr 4'ϟ*KoQSk `XYhPXL11b*?eDV`e;@2ЮѳyXeJ}o_O"|TXzL؉`MUɽ <ׇ~VۙO0v_=tG>IxG ;@x| !Y--ҮHJ7z9,xer8/&r_Nʁ!Gâ>J"Rbk߳i ܽ oÍޅظu?9Hї]&d dTѠD.r$dK^-z(´iS*a"j3-Օܨdtj@֎WmՉ>_9 _|u^1xYJbAT׎ GܽW2[@8\QץD#ɤᅴ kߟ֙RŻ.1M+Щ}pA(-oFÏz=(wlKV^@!V\׽E!VԾd8鶊LFJ3}#Gnr)~-jh9P gԏ$IDK hoP mv'=}t̿cVb5PATŔUti bztT ԡe@v y~ V)_J:'I3eڜ(ږI9(N#M@CeR}jOɠHwy;].:Ɠ#Ȁ-Gqy-Ǐ{t'cߑ7tĿv;%p: zWaEԸ~4o n@z.7w5-~FłHH!Q|qߙ2Up ]2ΐz˻SokZKD{+yZD1 b&+kO $a\/G6I&2Z5EiY3R̬ K?S&yll|)hij󠀠L~UArN\G8(&U?,sϰ\\}8  HFTIpC c9х|2AN.Ms+R1`tscpmLU k0?<!`w]f-F|O/y8u^aH*r}Y-/sק2ݫx 9Iq,ȬzD3V*m_swVVFImbkk0ǡhxOt,Fe`e~F -jnF+^4"lMS1ɼ EMҰhl=@ٴ߁(4ԍ#哢㌝S;>8蹿a=:nA o Lg S]S/~n@ N/>$MPT' ٜYesS0쥂Mr<:RR!&)$tbƮd`fJgFoEi,.apHƉo|U:V;FBF:$I٢USo C*,(lFGUݲ0-(֢tⳚI̱iy8AXSFmGkqY֚4wg\-#Frk Үu#D!w9'[~&w:tL7t iK"53Kv ?#?^Dc=r؊@c[drcK1l w3l+џFP뤢s6FCg__ͨW%$B;`o'o*h A! 5RCaMGܶ*zoB[y_̢d(_ 咆Rwv|w=O3cXJ9mS} QˡmiY ŢdY69 GVa% yP6_28ԆV,7ͮʤa n8mttڦeůMˡ yN*Иt>{[< vov1==Jee F "oiߪrO*]:bRZi*m6LBy9&CNU_6dFu (1wk4)qao&ݦ>HuQ'_Vx5 #qt9V\^v,_ ̍GENL#s%6ww Ѩ)7#6eq:զ!#@=EvP#uXAUۖC ɔިo@.LzI^n+0[䂃ە ن*@34i{eBG},C`7&t¿(Eq#&qWY=GZKr8`r/2aU#xTS8sc.G-vo{Nv ;QP/C&Z !E(c+n bP%īY\Ín7ml) QR: xh<"9NOXE{{\{6SH(?#>Z=pՁJSk}3M3-'"fRp"&ֹ~x+R)oxEjhAZԏ$y{2$svh%C1f1d "u<0=6;Ot].u+mb'Uߖvfw PE)X cw0^ 2AfWл˯q" WWn9g_ #{ 7z˾2 8enڙntƴ"&380M.}P vn1]+YJ8?^\g8}1yvMuS efZĩ~|a1?1CJArR;ۡ18S%~o F! sr & 'Θkh҇szGo$d+kdR+|D U#Yϊɶ!tj?׻d:|-ZR|jnHuؒ^V FH>[X=–QڰCJPL>ɛQC8dQ|zMӑ{sχj{4Lk# {NDŽ\\$z5'jg{R<\+5L,Iؖ94N;mSgoʇ.K35aV$BiGy9s6,41%@Nє?CF)"ekBprh$O(uCpsC Nvg]0h]wLUS=MxJ*_V'yM :;QwpLwa; zGNg3idy+5vgvUu5J b-,yf, D8oI\Cd.VC&pA9@hN":`>B(Wp?']v)(yACm_ClpbJ/D CgtyqI7DF*Rg#A&\kXX{eyεKƠqD阊:<S*-dO?ӑ㇔\.+kIXXޜgeH6jO;Υl.-heߛ@̚> Txl\CI,APPة~ϔ0n}`nO,[}-(w/P0 ߰`19}K43bМ&@}jϯ9yv4@N\=W ۻf# tZ i|`NT %]/QwWS0HkSx9v)70*-AG3ČSMMlٰΫh]$5iã"d}x ldǹO"mUy9\."qouKL1hG Vw7ɁF(i)L8?hў8/j̲J#O1۞g1-u|u#AP7S"-IT-$sGi=s"ŝ̸fd<іl9F4v{gL3b@\`v!Y(_gv6Rœ- ic?x©o-@8ሤAu;d|=s֞{y;Pٕey:rx=>SP&(>fM h4l/30N-C|?*cdG\hMz^#+BQ.~(@L&S{F9bc$Yi%oN[Z0s)L.jHW[+"Ke7x<Ji =DnG hOVw#wa6) "979`<Ms|ڢs05 5{-2;4=֌I2D`M x% 8*8DIH􏱃G`&r$S"uSTBKgWS 50Ѐ7 QdTKhF{t9%/쮚uP5ՑWG{hAZE9놯b5k&Ok6" J  DTC ρg9vv.:g(Wh 00B $bP/U[D=XMeҖ#elZL`-[[AxˢHrDMj75rPM*u|#gf:H?[ƚR3LIGB?K*6JmvJ}n"٥.Z3p"4 >)dU̥{>p9bN:j.ս._'Vg~G5~u۾F,,Q!0cm$r,Dnj!d!a+E *'!F5P[Egڞ*TRM^Fx@sU w-_\t˾6۲n/\S?xP%ĂͧZN'qwp(M>YT.v'jݶMHIo-KFhCod|參2wh3DH|O~ŐKgB /`!^dh@K"5ATnǓ\Խz/7AݍHV*7zġ@wb ,  ڣC Hئl %ǣko*D ʷ>%tZ5<친Z`k`{;K$Xȸn./$:)|F +c[D,سp8%c||T \-_srbݯDŽ(Qt J f5s75u40#SٕnpEB ;{=)ƃ10K@v&zT(5d+FQ *J: ʰM_5>7*QJl 8hu,uegN+Yq *2֎/i"~B1*}m"O/򅾄wAd!-["aV3:GuW-T?+ͅ`٠pib=?c0B݁ C;*e8!Y`V:"Q)+UF%GJLEk}]G"OZJH/%ߊAq2CоD푑LA5mA rb7ѣE=~L hFz s&ߴHqCg,ze_#tHCn`,]RZs:%ª%X廄rRXY)bg(( `@" QkjV1Sgոpfn4y7eIdS82wPjߜY)7tI (F΅`S nGc0Y#^X@&P @w}dk7Pũ{M1K|^ "|^p{xQP,aSO7\ޯsR!q4ZZY%S3o._ >xy@&E+'Kq/>CA.qSmmf,9v{->?U{-u!nPX<utOm ̑x^OHhȿП&5i4#wVPm(akZ A1[RS!p~A;@l{=`yfV/u=-A|=opJ\a2 a8`Ła*P->?QܬzGǽ4“*"\ 2e@@| d}ep$xD}88m%e۶OoV%~&x_Gh0y2?"HVxbhgJBo%5)C&xbfQ=sxy BRIO^(~t¶Da;O:Z܈_*I4JG]W 寢Ǐ4ք0`AybM i-bCΥT9p͓5^:<;mP{{kPm `9ҜE;MnsTOMc8pRw)m^. 7yDt|` FyG8,뀽~z(xϺ[|o8VOxTlҜ/KTV7vZŔ^IxZh0ZH6ո0,O勇Jw-+%>_S*TzoB~K9KkUf횊e~$|ѳ-'Ω__b=pL!8hS\!zo5n?9COvM/)aR YкLqTzJP}”w5 _yehOw]$ 2 6CaQZ P3H nC2-=xP5Y>*;YU{dCTnos`!c 5ڂ۱hӾ[n14po&4ڢsLt#(~N< w|ohTn$RCx_{P4%Я6a=;5f=WN7/>UR[$Phe9'IGz㏐t-D@O U4]gb7#?Zi 6x.- srIoj>+/ɰCKi71B7"{":)zq0}n*q3|'l!U`Vc%2WfQ!I;MHk  I+-DF7F~ViFf[Kp7_E; }a|Ņ6d[|lc*e ]: 0q19v9;tv]2ͺ=aMŰ dsҩ1jwɈz'Ckc+8➂n"31 0̰=ZܲDd*\-\  (rjK$q[V~ }@d01]0^9?d R:~D~66@<el ;ڸ#rl$~3rnd< [U=SyZ r&Un<֍bʈVh RcDc/1G^C1',|BߔZP +‹vaZV@Cat[o P`0 Q0wnЗF):rY峱vwo h|yq_)*0]~eHK2 é:qN l$rKiӀt:E zՉjaѡ9f|@D^v,|4o殶Ԗ9AKd\>';L%2(i=[edʳ,㉵Տ@qV*;&F/X_nhymC鄩 v,I }y|Uiq*0SNxL^6eEc'GG~TrOmH?MjEBFl 9qqۍFx'-QdMXCxφDOF:fE׽aH ߑy,/)fǣ\gG DmOqwv[Ӵ" 2]o a޼gFXP \ECYy~r{*HRhDM#*w֒|[bo೤lf+F.yNOfpIES %{i0a >ԧjjR'(bbP*io}.""29mܨG8؂@ds7c64Ћ,ĆҎ)__]!Ѵ;!O J$Mv9B,\Bֶh]d>]H{^Dz+=]lƲw0ЙZ {KE6oO=_0lf\4D QryлzB|S{G # % kQFBB wvmH:<߯džd︙^*~?܄o>eSmLn8f>Siu{-28c4ԏ:(znKk}'L;oPc1M"UխFoz{xird5,OYY'1ۏ4k~EVs/p&bk'7pTfpUp WwP u@`DO3$NjH"ZK=T+ wkWy~ApǦu@ <>8؟Ya"k*o wH4i߆>-N;żukVIPxkOWj\Qxro/{iRHpcb;dtVԠh2c5 p@ѨGRLhEăhgL&8uf_B@31 , 91I _y!:` pwY`y\ׁ\vCzAX>mFSDM9q9Ǿsk[.|Ǖ š̥f[\ic"*]#:uQ+X:ߘN!톄r7 &$qW`L0D¢e5iޙ~_zw ]:{֝IGV* wU7Oԕ2YT\8X#DHY;fPނiƗ飮*bX&W;(+cbu}zL\^>jMbQ5jc*usʜO1'*X .c4trC&TAEP&f~wMnw(_|S5K- r2WL4w[X*DIRz89\rFx@, 1ERtH?7(a8N[?xveI_~)p{RȊ1+)nac7x35r1JNEv)U#Nܣ__P+{xκpµ}K_Tⴈv20bG}?2':o>׼lm||!F٭vk3o'FSk`׮T S  F8¬6'jʜZ.>o0l5;ɁPP)?|!TsU6XH|}D{"||hĥn ӡФ 7Tp=ôdR4aD0B9ʜ.6 aEhʁI{iKόQ*Rĝ*\ .EE;j Th+ɊX[{A Z+b7S,o4mk|6YAN\1=jO(u۞}6] w@1eԖodlȵ.҂U; 0;/{Rbgc4C[,aA Χ@_I KNRxp#W?{DñpmwB }yt> QFTh RĚx1r#GCJ4P..xkUl>`A\e5 sT:[^^8q-|[ ?& q7t[#-Cu22YuM 2s $Ll9? Y?ƿ%3Jbj¶OƆMդz&ZS1oC5sz)O˭7ڐbE$ 6M16+ mru-uֳdVo J ?){;hyޝ`Vq=ñDw\Ep!TJ۲^B{-4T 99&k:0_Nq66;)Ut%Y'U|7<6 ,%?ν`> JLui/Oʞd &>噢=djs&2'wLɿWe[ $.%X^\X3vö:xW߃491#GlO2nۘ}բ%ʽw^&*vKtlWиJƛQvg^x=$?MD#ihuq'%"UҖ2h04KRK\3GPS.6_4{m\DA^oL5,4{>ũ~\dҗ~uD@4uowlPFf@gs \f8x}YQ_Y;< ? T%lB?Ӣn yl}olh}^G#?Ϥ'Snifehe8A&\YpPV9uiZmPbV&Y7!z}R)RFʥ96 o)^ZGD?< \)G!UR ymXՐtCVΨnJ8'H*\#F?6;-Kdo{& սߝᖨ IWʁ'0-WM"PKKӨ$/=Z}D 佇= STИ: !U)eL"߰- 'u;Nଶ테|5L55S8<lf0@ 4\}bJ BϴdhTa}8[QCYp ͑]yjכNúwOIk|]U&+nF!DRNc'DU1FixA`.1$Y4̃ FZ`aVj㼡άhKjL܄{%=䎁4O?5:NWaAJ.B".F_hmSU{S7YvM7hziT {jC6A-2ƪ) * ېl$_Ypd :n񆟽<3#7A5(zTCj7x "yfqfZ74t!ׇ*@פzMcYNv[qN~vcJartJR*d)O5^ vA+.<j4{Q(=BT_}?k[d`M~`iɹ׿9O"SXQΦ-r-=e]}޸{6hwqIdlWFa-͌I}EQc4FoP|1P>Z`Af?d0v!u.zHM (&z)S|d{kzv=O=nriHzk);A"GrsSFfsbC#MK!+Sn8kn_ O?M G`?] ,55x+o5`&3)ƒ@#كKak]f`2Nk.(82P[آN&WUE(ox^v)%r-m:Xb,lc#i-OqfEImC1R(9 %fLka{:3i7&nu⹧n1HvugO,DŽak ؄7{6iq/P1cm֙$n,ƣ> ?'m,V9WÄ},K0|8f12 _Nd0TOO,dBo%"a7Y:ܽ#UN|wpt4."we1HFHJAà.4sԑ@tBw,wLZVTYF%w?=‚ ˆHz6F3PN|J;(苌!*OZA &ZYbdo7[oQ#b٨zR~r0!w\/yg:XC!~mrqC;#ja&)miXw+6z:}"κzjj 夙Dtߠ/WQp0 IU2?jA>0fQm*vzƲ۽Z1${"dR\#Gy֠_):תt2uŇ aV.`eIы EΚ5d\ƅ-5W+F͛kYOVh,dis*}R8zPS>7-c0fZ%EX1^CǔP;o/X\?M {-Jmd=_eYEi`Wp<$r{~#(Ga,wϜr, 9KSF>ay4d5gF1_j^/O pRDg~ J̃P~|%TDҁS~d׺!aNTVHzB2kX?%3=|WyH=ru:A0bF ^MV)PMoVzF`nb%:>)(鞔B~F *ږ`@%gż!Z:~,!A6EyhR +^/2OՁnҙgZBƹj`I7[#2r1졶;gٹ9ʞ-sOgt1o.&8g!nBQwH I*]IG>e`|a잩BQuMORJZU,:Xw83/4gSE/9wuuX<ŠK41\:@/[HݓvA/3xz(zZB=5aL1U%W6R8X*\)/w$6OۡCBf[΋p,9OsK0e7 $i3CE TެzMTUA2>__gc^OClq!i,;)#隳1 ZN J BFpz#os/Eb"M#V;N1>S>ȱrf~4@y^u_j>{,&F ΍Zotʸ>!&>07RކգgD7(4a hNϖ,$=iS4&8a8֮{R!4)oP߃K#6Lo[w:nI]Fk< Q*fڀ*p9?+5wSn X iPasQ)҆CۻO.8B3赾d7=l=!WGϟ*!V(%-uE|k7>vB~O`W<0GcW:^“cd_S 0/I@jnؕ:Ff;uOX_m>T[vNu<:r*uqXNrQ%v( iöq# 1,xNI 0.*j1h-dlzuNp+˸޽%WaP {[D$뼰GT|x}^]|y7ӑ!dR5t;oyQl?Nm1hψL-YSc~P: _j{=M%UJmS SF]:Ⅴ9p57ɟ)C1} t!I8 n@0=џ4O!¿ZM=3qh$e+~0`!9g,ButgQ\rtn1\%Ԫ;ցR N|i\PXYDϚq9p1D ۍhyL!gv{G Y*gPS,Z5/cpę2Pdqov~$\n @R͞}@Kh_ej6bS + oM*Y9)LuГ7VR HyB9COH~|* GW$Q(h?{䭌pВ#~yGz9"fIDi r1?5e DX+rK'DO ͷl”IG!-Qf6\vYYSiuZV։_J_sců3?cYP##V(OxilD!|hCGt [M1(%&3n,KfWw[8WI@logj/^Kg3B[l@|M5cMb,cT@Pt{,Q8z 9/OIC`.A(6tGʓBȟps38ށx@. #g3,˓^OL ])gVHs%(v!Kfw1aj_CL>HndPDE5QܷYa6="i |FI. Jǻ:sq' `=۸4nۅ=Y4 w<;{^sB^. -)K iQ] \+13J$/k nZ`c62{vXX챞SX07_Numj@u-wX*Gwoo/.p%W:J~l,pYޛ=>4V6|vz^tEpoSԾA;8>3]7 Tվ^Qf1U.P^|:`7uό8;* z٨F=7!f-QMVO}'FIo>؅IweQ&KP\P;GL=@~bF\Y6DZ (`8K)ߣ-T>2qo\`{?{` Ie.V9icA>#sNQ;TpvJs#M;~XUf63tv6dN-RwҦ3"U:B~WTIw|Il^Ct,@BqJЅFTXKu6i鞫yFCڎ}`*Pw$Huogjkv~ }Tum^*/m0dl8Gea׺}:gpbJ( wAl}G)E>&lచU^ٻk6MN8'AGzTmIQ!~*QPlFymp8tE@`S~L{~]sذ[wr<%cP y߻n"i#DZFg">h7Um=~/V>:N1]5PKFԯ,ZW6:0]8,wOZ-Ї A&3{zGE2<%},i% B;8ʬu 6ԶhIe0"P#*>[.$|#eSlVy6YQ aV$aSn;+a*mE(+|,IClH+׺uBpL8vNn\ zn!Jg&Rۡ7:2!ĤQmF_ٰuy5"mmY~4-8wj.M^% r UP, tR1/% i :eYyt2^O#~ 7>5J5@?8p7|! `2P>@{.L W^^)>QK4Ϋ;\/sd͏[|!+!ەZ iKO28nµS?)ivkIAn*\b߷ nt\ ň7CPJ_tsP!`<RHbOXHXsC< Z+*r6ZzjB{9z"(DR:9Fo\&\%t򸗛FThO,7|D|J6_EDtMm?gc9iW48Nv5v*@.9=A Wɺ ~H2B7f{ 烲|K'',3b11NX? BspCp]Ӗ+ITԛC|oV~9!^q~`·Ӯ!`] ZÕP$8{6zsorVS' F[dViL3dRF;MXQ,kZ7}TGkSy$ zW"swG4QB*ϥ C{+Vǣ9\[Q[^B"[tP11-wcj/^-m8 MH3 8șZ}gTdLe촗y_^Er0xbuDpW'ߋU) r&cu$mה?m:Ób-qf5O'gt SO);i_Mu=ig͝0?Qc4_s(>RBu]KUA x[k l sB1>QłR^r)ƫрǓ Hj`@F"[9 H*쯼#T 02 񭂸~ ȁLexZ(h'O bMJ34pedI6\0R_'^gw ,Ę2}>muaL1fTF8K}J tƨy!@'~ CbDdtwAGPRHjPae1JUFu,#̷9TŎfRH_S4%.`F|O}H:3|r1bor%T613޶H^3H xDy8r`P/amVD ^rqDV X{# !5I[ÿ=` s= q??|X,v\@bS(U;Zj!{xz$N oh:J-l#~-.#ɉesC;|̰M1\ŧQ2ՙg嗥&p$b3pLMuH ,K'm@0Sa %HCӧb젉ʢI`F 翋jxmZq=el˫AEqGBwE9xwSv+C~_'m= 2@@'aO%W'ѩ `O.X8C팥lJAiyx>}4c+ԛdj!@g >L G3l~O}>ލw,mU)[ȸۙJ] w$; YW&1hB.N-P/ZD\ik6fx V-d =_z$GSĉ~ g<^ɃzLF=tSF6ӈ@.!eL!*9A!k\|֏a42tćSO┸mEA֚W٢_F#^}sٺoVv w? >[ZVIFX \W0~eW1vMMdAj[amİDAah X(r+g2rX# JYEВ{k^rnpu ˏ9$K/g 6 9و?&t N  shF4<߲ͤ/#_u)2m39z2 75V-Ev04F!GjWXE;yVv GqxHз)eZIcR?Sf AQٛ;2$^s ;^m7wOĹI9sn)v79֙ q?JyJ~gW%g+hAHO=5pwKM ~qAtJpNB=\KQ7A "!2nj\؂C4qĴ.2VJ`WOg\{+-Bru"R σʠeQRhOTuyy>d[u]wePHUdUBrF3?6{P{˕wP1/ytFdV 8EPE:&јlY< Gikl.\RЕ|U.&*Zx/1(@CO.A-Vwr2H2hc큸f Զ79IxrZB>G3wcJ/{b4m ΐrHEP-lԨs׿+bFn"PVJK!UO^ j ;R DojewB)~ L3^. YajbjBlirb>dS\;p"E0"SulpUyek Y3 ܌hjGn}j ]TS%ⲩ4-X?] t 5V[AUG0ɈC? MN~|>lCdrT%A=!]Pve^Z2 .P25H󩝟:\lXz $IeeBCGRǚ.%u[C[us/t8!!/9I Ӂ_8 и'yYp^(:ʐ"~r>>3ҡH #u0>`p/x[[5gwu2ћtr'Lϒ}wGfuyӲ@ۿ.@km ^7$b;YNB#~U;KI )DBj3rA}[<ՠWT3:3ȳKFŰgR3eHe, 5Mg}16 uĿ8SD$9L%_AOK^PPǓH!}Ȕuї=PҝD.)R6nO=mq/jz2ȪnX`TC^s868a9ȸgm+e#@X{..?_k@cE8@*< _UU\J##nljq) f_ϟp.U/܍"Gb%}B-PEr8ZU%]KD!Ɵ`F -r)/;3»^dr7B\վ4z IߺY@l,E6nZf/=*b][~aYMQkiQP5J+|F9;'tcչ@z9`['7>pSɚS 1/E y0|O3xZ5x9+Zԕ3~()eռy cl1ySDŽبtR6bF3g3 lQXhlD]sUDnŧ@+E/ }| }9W`? 2$qn|FVp:hv'Ol( |EC695wBHcB/X&IUie 5C0j_~'K.Ë uV5S޳5ZʢXz2ѥ$T8?>Al6k !*ant!5 ^U'AP[9#\e?JHk05s?P&~CrH!!9s$?&Qy@>Ej&S:>4`| A)^g2{"K4nkۚ.0"xF01Mz_\=D}3i0AL\WC:{@k7+sp|݈k;fRL%Z$Nƕ艱$͖ x6`4a)t0#I!~h|"̰ߌ9P?&b9SENhv+ P(]FykA:Ceܗ3зFZb6jRe@FF3h:n%'VHMDThŒ[yפ7-/Aނ{Œb ͈Z~^V)ك2Y{ [x_V6@Vy KQq%J_- L~>|j\^+08'~l9,ِHV45C؏kL:?>{ ˥>6W74H'ZUѝZw˘< όS%`Xv 0Hm#ʢp6fjC74E#S>uaH,B= 5p͑< D $/ĺ7Ȱ8 ,qfUɟ,,,TbkR{۳wZJdktZ'AcGG-hk[џ7QΪOJ*տ/ʰEe:bu(FB% |ARZ۽L_%+#hOД1xaJxFtWhggN9o[HIPZ۪PPF7iO/$Zl{4TIx1ʛv@R79 oUO?3s!MzV4}&Z +29~Figqsd*Ot 2üq(dK58CG?@6L` J[tHl0Rڪ MVfjҨk 5js5򿺅p (yYcna劌#rx͹o.N I2c Qfo!y\za$|QddFcLWs϶MP+]¥c$;#-g9pb`gz@(N:,uRMTO_1.0YI q ۊ2q2j/f_;d׋GR'h=Gk7>qUVu_ŒrQiԜ~hgb@k #ZR[0 K%>׊N'i rxuی7@d=ިb=l`"Ղ mQ4 &}o+(uz-UnbRV%/<^R 5}EmW U/AYЋ&ƹIX4\Jc (=19643)W J%/ׇh ڨ3WO x[k[F!׌WW% Č+J}Uٳ_؊qљ1dTak=*" &8#3Lʭ&Ć|8 \2>IBDZr:gŽAse9 A0H3vcզbNx'u2(bH,'}'}34ڌ LW$TxiQMͽ6QcE" 4|@S0:'x#Cl"v4".oG2tљ;u%zƚ~qBK1p{D^6w<٨7#h VF 4)Ri E]mM^D^6al=q BB}0M [}6# (lБ6_8+w2J @2cʶt @{.\4(ʈQDY2,83 91=M<3Z N@8bE6^UkWz=*M}=Q|aX8u3\ I'%@t= *y(ۈ/M[sV$Z8@v‡6Á>W^r*$>*D5;v$Csr'+nݼ"u&9"/\9{s=}\GLw_6JدSh]IG8M\gCzrWMQAVZR.*m5{0 ,֎s-.>~t4ޡʞ.hi'r"Dⅾ4zU-2!nSQy[}l֣6F&Pܗڽ,^z P5]UWs>qf4 *昸QRs1cJ,o.f|j`&HTqtɱ'[Gͻá|f`  _$彃e _7xl)kWw ]Dk#a "1bf\Z\eN6Sb='L~gc{]`7>|\zʄfV#wp}rY 5@͔I(J}wO4n%ց|SPV%Cn[xfكF C{K\0=L\f^=aZq$^ma5,l]t/'EO]zAҺ̻w5)4rP]5- ʔҠlրfTzmQFe\Kv a%h&/CBbHm fAl}vF7:C3$! NХ1|dgyŁ9Cj-fs?ёKv ~~0Ʊy}=:q3/>$2n)G՝qOpWIz ĨLp?YHuEeh8~2.iZvl$;MU"*o#6ǔ(no%! lTMkՂS2F): )#۪d꺶^_3 Rk\vQ Y1n"ڠT\Km7X=z _µEIէ bj\>}KҌ`t )nV^ _gM徛ayq|* m hόdG҅'C{QBs`1 @|0\ilDIHx8nՈg7PI#S+d!抱NNX1oM!8rT_mI x_̇ f53iٷL͏L +$h 0wt;-deWs^kJG5&49u(X[^^:(TXaF_BzN$y~/5A:Ei%G,'mDtțhri"pE3)ki&[Ð ӴRgb: f]A5{ I;B[;bطTHq&Ԑ"܁ k-tއD(zIh y Zs,&} X'ׂJr!$Y;7u_4hoz^ 8r餲Wn_e̫6v#1 H"4H !]bYCorzYMueUBS㬀0vuyBDdžU(LOVm5Φxɠʉ.PpB~[Mh2\85 G' m6vFϰތ,9x$FiJ>=5k9wu'ㆭ-V2RFRB*ێ*M}'GhWVv\9unZ OFԬ6h0dZ/K2UZbp^+^~$-\*nGtkH&{ 7{Y@W/Π4= / (fۦP w2<ܔl*FO'0 : O)mv:q!V^NˤX"je׻έY#>,L N^i+zMqNf'bRɚY!XcA93.\H{893~T.خvJ hEj'+r)H9ԽTȷYD{Q;;oCO[ρ!eGX8;`Ɂ#V ^csoO9)p[&ani5pf|rKIsxʪC0 dzW> I.ctevWXYO,_K, 6ˎY\>tEؼZ51 xALBXY2J/N N:I|m'tgT^m.*6!( <4\8jZ# ΕgGiy-jTHç,E ]^4_,jF\u6i]ߵcm!}P O"[Qt#?_kT| ]OOxX k `-V|pČz"q#aZאVόZWިSh< g뎸P"M9, sc4|Rri-@}Ocߎ?Df{ҡcVueBZ-a˰,16ױO+|>~jːWdgajҕ<@ޓ08P6ݨf-0e#;Zvq ׷)icoM̳9rlWmZ$*,,Kq?/5iMuY Z$ .3&z4lI [!e:\oXgW6rl> UBv_F5O&uJ tZ3X7#Z~}'*+MqpK:~_f7}~TADyg2(hH>> ˜9Aͻ›xD-cŠ7 U/[R;GUa{dFgh3=sDՊIByG$PY[Uk\`^FIxZFw`Hvx#fbn+] nʑpRLI6 p346Rk=|%YoZ6`FQQq]Lvu!>jGܱ`uJcp %Zԙ{=\# w C7QwR gTygKD`+@AÕ܌ rW >3i?}u>'-L؟q`4ISHnz%arFxolR`)9?3\] ߔYN]2%P~Sv0ciomŌfu2Sw#wJXXa5?b,|.cp + *y(Փ?!$DlZs|yɛUo+ υ>ySh3cb26kkW9oJNџSߝÐ%6 (O/gܪM>m,"~4La'}HuT.-?P+HiVJ6_zmgL;E.|I,=Ȫ${1l6_AH^P.9\9DD_0!$[ T4єOV v iQ'9u izT jAҕi_&q {]b:K쌨+4ػBБrkaO_r{xWX5hs6s'6/0a'#,2vDo_@elĴr( aɋ?-YaU 9xuTMyF_7nGԵR{ejyAEȜ?<\iw;mm_Y|* a--'ZwiFgEp7˖%$R) Eil>/$DT|SV\¯FCGW颤_H#:9Trm~ԍ }1?A&h,,խA;Uֽ$@u3Ԭn@seGQdɇ'rkt}&) O'ׂZd`P$l˧A3ڸB^A֚' X~i1o4>N M]txZjeD% lx԰pErەnJ0R0 c 6Bf^I{#|8,9y 9gLPE`SKpCcׇ Y,4&&2 QSPł3s7o` `fLP|N匫cjhg9 f.J,δ0C`N!@Lm՘Ē'|xO<; eU ~سC Mmԕq7E^nTBWhG !_XCAIXƻtǷAjVe F%EJZ+=qM߱Y8NƐQbݼr6ݝGB7"rQzb %C>DydW=mZhՑ_ 3$B6]u? 㨙|~ӆAm;P3gq@+l|<UP L6 69{$F=*5 yj15m'ɐ ӀPkBHt181,mnϔwm1ȼ6uTuEj T(Ob@إoS"7fi~RJi;_D%:QunP )G)ART)9W< D>0K:y} 椩߃*[Ç+-n%Ό J ǹ; @+zcUHQ7O|L"/>çh Lc<猜rw9- 5ӎz}2m}:x] WäqS*|D`%wg&pa>alt%i9 Mn^UǾه\ -%wN%8ЊQ#9pVif yE1VvBu26P39 ǏX7X ptﮑ9ʶI_X ٠Yв*84Iqɛ}LIVAFQ[6nBJ6'Cp-Wigvg6/QNX/56DL9p,1 X3u92j \'s 7z͋6zUbT[7 ٭ܟ`O"U%E3G$S58r)nd4ӼN/Tp=/>(]s) M_pRI\߂' pwkzjɻrӋ>ݐ@, iH VK.(~`\(cTKn@}|n-XDyFir:\h뺳Mx)Bo9[$ZAzه7(%(;|gluNEUxvۅ^=ԠVLǥk~]Nj6_s =dǭOۜ'l7w嬟{!O5;x;xGHȾ{gv2E&}8u\Ixt֟ j)4:,ʙɠ {V~`3[G^(L Krܿ `JEAW8㸽F2ͦ g9Joyg@-F] 'c'0tmaqPEf i5d#:vn$pDkNZr2y'= 3 MZx W&!7L[1_U4$t>;N f1CfF%ٿF;0f 8XjbOia[[ @wc՝u4A/57wxIIKLslx6uAb$<%2hEbl﬷)wcN HW Dvu,#P_1j'%CW X6ikʲL^b(G 4ԆT1Wg=<+3mÕ!ĜA'¦5E+Rt ~4J5Q@gj^nd6y""mjd 'sHW\hpP!*7͑b⋒h0/c1ՀRO?NUg{Xt2|ܳAQŢpg q}H1A@a#4)|VTp9eiujљ9t}pnԢu5T#كnNxu3DR K ЀQtf |גI)SĘcP?^&tn2|5b =6̠yPm঻"2f١ʭ 59_(p'S ^i\ {6'7bPS\ Fǐ81gڸy"ՙO۟TpQe}qWm]MN?{*'q:N%V[x^}*Mm2|/R뇅ve%2snթ}*~̬n)D3kI؁s!֋VU7DִG!<߯L55 .7ЗD5/ͬo7'kME9| =x8 ݨDYy;-yaGr1ēܢu+b8?*XTgamWSucWA2K#DEWŀw n_^ Zu7]ɋ`RhQjn{Eii"q7|;d8Uy-MBV*V@;E}^mCat&$EjzH|a.hYZ8v RC[}@{Ik-se1Ӏ+J͖H8 3q1 d":+|T'!-ñ~~*d`LmW)^eQ/5ZU ?Гl$rh)a2]-+ =ǭ^Oy}u"j31q){ c :x !"5U'%%N>dT9Xm5,XV}z7̸ecE5!9{(m|g|wNͤD8 .N_ڐ^dBrx7'oA l'`NKQ ķ+N.R,%`/E4JoSUnGd@x'0+"*6 mVf{s!R^bKHK8/|Zۉrw{÷aD.+ߞJ~aJRZFЍ 﫯Yw`H{NM7׆ t!h{7vK/Kä )0Zs6Pҁ-Z+jQ9[Y*N팻b5ik?N:z!?!WHJx8Y8~w䟀( C6_B\Vv(N{Zu"X4$b}DHFaAR眕[]υqсoVLIo25kk̳{8[F}Cz[3q@PׅA~fb@E读G]=jj_L)2Ipuꅁ<S5SEAooϥ" M,.z7N5f < 1{@_sC+-x3bK,cRH i{s_&2 T٣":Nx( Vcw Kz;dy\VmR#;ts˺%Y)bJCgqowLG]YHмA6!dM;$톝P$C#F,;Ns )`^^di M1sp Z4_ CyԜœ8pӛ6(nϪmqmx/8i(e_ũy_ڱ#AVI쫴ηq_И8z?ċIo⥻| a3QZhsyeUuKy`Ki'{0n~ ESh<>eUЊrzMx=,8>*AT>5O'aji2qĆ/GŻ*<FiC7}䧃G~kA *2]0(=۩B^<uǛr`JV- !k-4;BfMOYtW4մyo |(KU`B|) PpE8 Q Cg\!'l]WyqM&VKCQS`ډ]@I@3Q.bc &/󾛩DeZmƋU~׳lU xJdP]^!F9턟 u"PSE1`(ReX>1yxBtI9qt2H:;Oz}td'MTfZKQ+gʦ@?UҚ@|}QlcRЄBJBOI]U#$F4SL5y |GF4fv1r%ΡS'(r:kmz Zy}bLY]Դ<+zeau8Q`O鞶 {1W3’}q|ƵCI?6H/3u*$:=MhQSz|g~ۗbP(َ8QfH߱4ɣk1XpPȢPQ ʑi# \ ۼuGYjwt`?kF㧉~i>[uU!#_nu 'n_T_B"PiSE(Xi_XEs3,+GO $,]5 ʦFa#2Hg |a{aDhgS )V[CPSUO*i7t,0tŠ C 6vސ[I''se8f%H=j/w;u~MN ȣBryg\(&t>ߴ+Nݾ4iT^&c]Ū=O폜\kLd5XZ`ת6Ai6 תƅ"*U;=x;P"1fGY]KهI0R<6n2s6z SNI/eZ\k8`ZZwKSUԞWLItEi'%vrk vBA+ey(#0|ӝDVV )9*蕚:;iEhT5Krx[:WgR3=tJ=04MK%"OTq"XQ1t_$ۚޣ'{xѡӚG8،r?#_Y_(!<zElɡ3 ^kd%Pxt?zgJd'38gI^S\,dWQ`䣛hK#&GR'ն4c6.=_Z6^hlm5dG(v4ϻk:Ւ8ijϜT$ N 34{PQ/i 5#7oRgK^Kfy3'r'"M3U8\I{pecv>ͭ( I][zs!%OAzy}< +)椉 2@jʔς9}Ӎ*+E^IQ&)ڢ?i'J`ǒ>n?ޮ0nOEL\8i͑2EG/ۄ~< }:{d 4 kljd7Uj/Rt|Y5@A(\EqlPQoi"ϤH%"h}b8D&l_!s|R@v6X̔;`j;j]qme+5}-Z#>JNx)T?~Mwn~+]M~pgjotHG4t ]h$g/{ўABOJ;CɅH?%pv2N 2C:/v|! Es M,{??YNj,^mq)Cۣ}ɁgQf~ oF%8^Bk/"IgCǬjeo2[+)pK9xcķb(۰n#7ub1ē/O+\儇zNvnzG! 4C[ߙF4cІh26"Ev쪢qLѭIF䓴L e2ow1(Z]]׏$\zz ؂[Vˉkvۡ^Sf E=mZn1 [tW@vʀL TUgەDm_:1)cD,m`o/TuGѨOP~UyFZVM_$j.ĐW<5[oî#Bԝ@LsҊƶ@9L%wﶡƳ뵪 ȴ6HVGE!Վ̈́ua?z K?`^S

}_e \|JP)فi}M]y%xy1.;wCė33|c!xPׄ+N(͂&i`ᛁْZPi@Kw3)nBJOܠa}WKf;h"F(;7ۃ;G 6$.>OdS:l1.KO)^ʆiӮ4H~(vRtZHޕ5Q!tde0R!"odOVGaҧSg}CF/@B8*pʙ Ӭohڡ,k!ޅI$r`ڭ+^b]5Z-chŭx`xZ4f+PzOV _N`1Xd59`_(C.:0_pm7*B Γ/pENs틐)/NL*]$},ITMmH^ 3W6O۽ J u(c.Dg2WfEN_:P5zoBF )\Ȋ]rCSP|bWbdO#2Ѧ8k׳L{Ӝ\@U@(4岊9=r9"dE$)|Y:kͬa' D ~b^d6e aaVo2OaluyiEOter|PS1@DV3JN]ޏys!I&^KH蜵^ʏs^rT7"QV c3'be[l\Fug2y8٬,AaLNE;b!ȱbI7׿co+)|>ohz EI *˵mCojXZ36#HjD@jŐ0rځw,a&V5.j^nkK3 \l!ܷS5Iȵ*Y8R_:"YX gDWҿnTiҚWru9ɾ߂'NG pHdpE.MhfLbTmȮBG;̒y=|qe~*3=v3;XyGNk 3KH;(\~qN5mnqxFS5'+r ly3X\TI ar O&]ϴ-~>Y|- ك/HpGSarv+i-\V y$$/rĘ4^1ezZmڻMŒWM.r&ͭZRל}C|0[Z/ҁi.^m69_Ufv8 noKK4=}C[CѪb?pElttr_W*nZZW9X^&`܀VE ubXDd2_w٢'"$X3acR)-N `y;ʼT\T>M?Wk[bLa/>Ew߶vf}whnz=HU- Q|Kdr%&WB5h!z.lmg* _E޽nyZO(OeQi+!牆[59 3lD7!%\tXl=@69/孎n5+g}qEdJfheM[[_RAw@" {OYMN×a<~觪%סjl_` A ○6C)Lw-S=b ]Ffm)eWPeL|9K:_ϙUawo.]3"r4$HlH]2˨[ Aj4$dNVr%}#pIF>/U+Q{ m{a]:n;njK!Z+6>$]"`6>\NxLOSz!J0ZWp h.M 8kB,t'6*X8Pt@ y\pt M^}τ^"|˫дvoCq lOf͐9 h%~2b㻟G1sMЕ=F7$'n T#EGȁkT~ owIwfAX{5xYRo\5l` -7b5`Nz>hhg&Bq5;οNfd̺1s$gе|Ǥԓxߒ"/KlJvZ0cL331ڣDEuXt3˔A3^dC%]6>&chARc|ez06&Eu-/iAAd>ySyH. O hndZDfw=J+<1AS|Yv䂒/].nSR Oajܭ{Q̜ dТ[18逻A.=Rҁ@76ueM b_iX\˥~F>_:caX܅ 8k5l@ ԪB6vR,O%0_6ÌWSRkSxG(|Px>w`՜Ͽ"ꋻ3.qۃW;5a0J3Iv2ITqlsJ P3e}:~ۧl ns&=mhYzz_xґ8MSr_%E< x@-ph" VsQ:]rFBv_SdͿY#t.7꧌yxĶg0V'osC vR`kyv'?XGN B FhũW;7B guMX? &~Fu[x`H :BQi#tG C4;AAc:`qD =3Do3~m|H|IMm"cG]*+\.؃[I#xtE.4ogzI/ww?v1_בAE%qr^"d%gqf«@{n]4=׎0cQTh}tTC)`lnBO"_4)Kb™U?q8` .l~BL~p^؆#å^zrn]O5QI} mzWU>ԂCfYͧ{-GK7k?QB2Ǭc7zxߵ`z4pS1?7LgbeFM8P?jEK tTUo~C0 tÙ" Œz@< eY^?7e`:G8LlOX 6[l]pR ` D ]7B?r?0K -:]6t42Fp?8gM 뚉jŲg J:EOQW_1%τ4AaIroip%eeZWÍ.9mVMCE 4$H{K:-yϿѲFkg#|3̅cI,qȶfX2aCIv[ "b#O9(7Ȩ(G\ԕ$:2k Qdt*:K&jLU1|RdKƆܣkpۓB߯-TzO,yyoaD`1Tv+<^;-,hfb1k ba[  CrZGc6J@`)w{404mie2nm'[οցJ~6d(ūR-$zDf] lR McEKHXRT$_k莧zWyZyG{ptį8nfPīiveR+2CFÇ{B* sUʴ?={9+ߘtZu r&YaJTt2G*$cɧ)*!uzR9P4 `͂,ॵ@2OK16- x#>^0=חqfЏJt>}9;AE/П;tSYPi7Ӂ]nDmB\zmA))%/ Ex,h&R\~7C]cށ\: .hI^9OzKnLG26*tʹyܸICٽN Qb .kd5/}ezf;[e/+iPUzCQȔQKqBZ'eS:3Sz^1{1EK}G*x2 Fe-1؃٪OShO+{j%E{$4gqʹ3vI?5vJ>Zսl*=~W'YV ]y3;T|q¥bEe)&:M_Tf6̾zyQ:YgUx`|bA4 ?6"tkPo{:.0oҧ $+ &X]%72[f1!BJlN]m J h;,^$^\4u]#tG%EtԾtūUIv쯬ҏYܲp}Ģ/*o9: K蹞QfEޔ#,˸?h]f{C tMgfY Y.(WlM#.o}Ǫk5~ox1Z]= adȇݜVS͡]̈́08OLA* W izz4؝L-!B R <= rpL=<{f -ɭn&|/@=5cd&]oKDL66Xɿq*liT#}\2G!lhl7*-|KDOBv y ^UƉ {Dls=. qL',@@AlCi\8~gX-xQ4զ?!SkPǣ~$ʆ?]tܬU2!QD@oDNA wVEŀ.u,۠Q+WqjZ!7Q^JY_2gd6HA*(&YY!hvQhpaMd8#6خ^Zۼ*Bu/Z&`l- Dn!V:{8UX+vKQ~dz%>6=h!Vsh{[Jq{ ]c PN ;C;#+}S[Ǎ( S_*ts_S4f R mnff+l9,ז׭xhm}&chr:C{s4 }I)t̛.A;5,D<7NUoz&cD;ߞ^[bF1ȋu%BZgF럄D ]q9c2J(jSuX"A%,FQJ<={PK#M}O/GKp5eN^9 N#Jm>DJe n[Vֵe|GLQ@]jLȭͼꂟŤral6U>.kئZs($Fԅ.dJ4T%B/( >sAâoFM.N۱>k-y9l!-1;JOJz,xMヹѱK {P;ߕO-(?c]&2҉8Z2}pqs\3K(Z[:?3`EC!'y>c YhKmo 4OF{a0|daTW '']) ϕr]EyMj0 YZfields/data/NorthAmericanRainfall.rda0000644000176200001440000030470113754255070017341 0ustar liggesuserswX]6bV̊lTElD BHJQ(fŌ9abVҷjܹ|1g9;ާ]YV<O׉'Óβ:3ek|ݴ<]|Wt2q\%r``bokC&߅Fb_ns?hq_h?Whd3ѡg+$ЧG똿¡c&?C]ұCsD:?h zch]ڇˁՏ?EDuP>/d_מk/4OL}CDv\ۑ\vۑ_ۓ~vh>k>'oG#|ؑ^4zAzq#ؓ=vsv>ˍdg;юoډ]wF!+/˖mIn[ƒ%$;uMKlIO!FHz| N +ۖS^nBZώ+ٍwٓ ҟ7mzhM Śې<քok5gMv!}.z6Gk ՆǖlN_[I? ͷ!}mɮdw[ gM!&ZS|[|kznEZzVaEZ+_h]+K^[h_KӊfMĊߒ^[s+ƒ],ȟsZߒ`I~$,ќpjN }mFv4#;}S‹ό※&HNS¹)ōׄmB3%}LI7;}[lFz>HzBzeG1#qf3;'oJz{&dG« kB$1Icӄ6&MX^Lh]ά<$)c,gL1838_JF/#LjhL7&2fƬטɀHiݿqጝGqnJs`}mD4ψpgD3bB1{_#%>7ًOYN8\FxcYNvYqpb>s9͈͈݇p]N}Ӹ코g=NӸ5$-!{K.Ki:t bXF-e82bڛJmǒfV h]3%vJ*o4WmoXP3Oz=iFSi^?(41Or74F)e:7WӵG5{@]ѵWӱXb;5aO%;1g$e:3'?E>[;ַA=Xb}~&X$|%бűMGFBCn=,HNK4ȦuVh7!\Zעc}- V:m1ߒn!ގ}OVdXzNkUG;[=~.wϊ`UGÊcE~JnjCv찷ˎִ c~!Ha]C^;ψFflsl;Fmi8鰿ulpB z/ڞXW8C!ŋSHxx܎kܱo<O&)oJ02%|FqfJ5%^F|WhoO3=‹Y]%޹NތeH'i;,ş/3?ô7K~/Sʿf:1E87$$}Y1H|D86sc3 sy8ų99o!aAv Xq D9]G}½c_9U "GcB(.-)XVvkx=,VonPߣkŋ*xJ@H|CZu)l(ɮ)-Æs@؆xOHxQR} $~Bܖ-![#wBunKSv;ӎ*߱pǻ(Ov)p+գ&4ϔ) S/ w7_H~S) 0ߡ7CՎф3!>3!<=Lo&M&_… ϔ)Δ)'FcN#fÎıE@׃iz(ޡLɏds]s.Gs5")҈')On)73ofT[?R\uai/,Y)sugNӡˉXc/# g{s5WO_ O_ "9(YR$~| 1Kǒגvα$9,OӺ,ϲu5v-GI+ +;KJ"?[Z{֔ O:jCkcC|Jؐ]lH7mHzΞ[Z'SG!{R]#ŷ-Ƕgp|Iv>m_SՅ+t=e~m7l)m ʔvTǰK;»=]H~:ӾvW?ٓ})S^7!~#`k8~'7&dwnd}MHopz5zԘ31ϘטԘx¤oL, /&,X73%HWL鉑WH6\&7ߙߘPiBمxՄ.R?cJɞ3R5՝l>| ғbJ~7Y_S&?q|ك;Tǚ~k9)L_|K_L>7~ϔLS˂0 {͉,34|9ÞKp)s< 9xό7;GRč{.C~4'?7[R~b"˞/{]S=`d,Q^Ey⓫dy\ s=n'btϊaEu N9ޱ"Vt+H?}͋ć쾖O[R]EjW@aE|bExck?w~@j#{[l(nl56$yla wAu mFH~_gS=dO} }6Oۓ g+ȾTߤLx'|S]=:҄cL80&|FS<QnBx0&1a Q&k&ń̈́xc6R<O#z˜շs_s«J|flM,GSxiIBTcAGNA9q ,>tkb7]s+g5/ XQ|[QcE5ӊ >š[yZmiJJ~$?Y߭*sk~~'֔wRNp!ylNܹ[SnEq`GG+&|oBx49Mū11[HMHBw._xͷ6̚xϊ"Yk; V9GbSdE8dO ̩^x+I2smsЎw&Կx݄x> ')?P6&r3Q\pBvaװ'9Oċ$/{.ȞR}mC "eք[ 3m(qklmI#}!;;7M _zk):p{;Y^HyΔn;UO67;5cCʊ՟1wC‰ ȮC+ҟnJF;wY, VO+3[x#0ǜ,)#3Sz=,c;#;65iMcӕJyĆ չ6dWߊ=dϳ(OYX["fIu,møs@u*oͩ1،xƌx܌peFu>lBsdoZόǝRC`cG8FcZ$rtn~7.$}}¯v#F[ZώpmKCa4Gc߷H~n4wM}ĮGq~3!BI^}Ο)~/ݷu-9gV>-]:;cg%ڲĿFvom6jӁ;{Z^ّ9:;kGCmI>gCGr#+wsV^6GlXܑYX?XMr~5֊f؇Gq_wܦ=i>^X$rgg0H"麉?{v"^L,} IF ;py!>;>"ɿp^cq֥]s<}?+>֎$!+/+8u?ؓ]XeCZo1ɳՋX>'}}X}YwyKH9>+?kOV^֏x_ve%kV>n?%ysڟk1xgڍ'_lvcŽ8p|eq#g ~'k?',i=.Xbccy X=IC@ .ZOzNd}9ٝ&N>فǎ$>ɭO$>h=ڗf#;~z$ف ?V֎mGVNVV_n4`Dzrb~l#Փ5+ZXGV6~Ysk?VoV.9gy ]r҃J+'?,.'?,x}_}v]ǿcq .}G,/v:?v]?[ByZOA0GHit9qk Vח.8`?(<Bd\@].B v.&5qn l$:~_q~ t[rɳChvCYگwhu6$Wa4';qn.${.$kBk/M4ّjSiǍw38O:xs; YR<.dqGx`8|?, ^5H8i>^5j;cDž[ G#cC5w$E;_ő}$kc7hlS\\Z];RY|PsZ@ÞZ1C?;~'6[{h~ ZdGV^nZ>(nztKxIk1]Z);Eբ8"^r+pZF%IhQh>Z {_U[^$v73X?ZQtCv&|k~ɏmvo/rhĻڳ?=IYv'\jQ|hko(|Z3-o;9=Y~`ή1`yux8J&~>;~/k?q-SncfInmgڬ}(}W}XyfKH_6H?'#X$XߴّCr#ɫCv!ӡCo_tto:CS!űCC|C!8?u't)uu>gיHȍ[C:_)i#NX;`o6C89XHqKMMzC]6/loRdĝR\zğz?I.Οڗ_9o+z.7=WYvXLpGcm+^+ԗs8f%H.ſ.Ż. _N7]YQڟ/k7oԯpzķ#.~8 .ظ%>՗OPI=[z_}v?/ĻX8c#$Gg)qO;Ͽ"7>s(_sٝ6nغ:l=Ug:l?ڙͯ>,9_|G8FZ_#|BrQ=OO|}()&'/)N)~_ W$>+\dJ^\#;1ӗ9X~'SG|O<ͭڑ_'}?]ӋJuƒ1/ = =S=‹ݜei['q8Ч:L>'wFKPOOŭG~dO>fӧ8rzSp}, }=ҏ'1W>>C3.acy;ī~TOzp<k/}IN}ʻ,<<,~YOrqC8f%Ždo}җYG՝>cgq% ];/ >d7ՙswMkY@@3]'xP& .:{ƀxӀ‹-84 {> o XX)NҏFX} N4 ; 5 \P ѧ:]pHx:8ŀ}Nrf /d3ܬ$7"`Gqٙٝٛ'+?Ň9g G8|Ds[wM~P6C:ٺW/!%=~Oqğ:?оܹ!;W:\J=ߤz;g$~e='fm6wJ~ {pw>O;$3PCU-$k#7=%!ӡe?~g"dwaG֦=-꛴h>;7Ճ$6c~d}ndo-҇G~wxТM9dզ|EҢ`~!SIZG穀 x(Or#wfG⾓^zw|pA~~%?sypxHxq!}ga`B8~'{"/dQz;~ȨcEv /w7}kŅAߓפᏻ& ;p#}AJxV`k_v:cQ'rXyi^G$|j{K:|zOu|O/ 9]Y=~{>ɹ\@/`eDŽ`e}]suX}h͟GWkWQejdUSskzOG1TcK>>֭Î\5}k_Ocw\Ϝs^Xc"'k#/CQ\#; S][ԢA}~j޹|rҕCjz]N?Er}pbPmNU+ho.ݝJ#Qf|i)o|4?rF^-ظ]31BťÐ)M:-ct=YA =^F ܇'GAGW[76a̕ SQl2z5*.߿^G#UVh=/-V;}dg=t ߧO=sGIq~E<<8uj)4SR(>iaw(qt/E[αLJ[qoa=!a9ײ/2/m"^\ [9tCeHQ(vkwiE.>e"qYiHn5`O$_UtqE/@͍fvGO#bd-@ oݘB:t3wDo g^^$k0%GD73֠Go!g~?QSq{,*8q?-Ȗh#_Y~2*`~cvO\$X 9U6 E˧I^!0csq'}n}">ع\8 %yIjQsc"_C(htC^96VPp[c3gPvzjQ,jG!#J_';!1GQ:Mo{rJ#@½i z?(~>2b ÖP}P4rQkubo_ (0y#JwO ZC %ܗ ]4 79뮎C.@jˣo6.)c&r];QDm7!7)g\=|s?κE]CmGWgFɥ]AiL4,mr3Q<`wQdx+@8xJW ?>DTqfdYT:%mCTQ\Kd(J|<^m(=_]%9.ڹ e&WQ k Qz(lvVhBF$[;(7Zjety \gPq˻梳(k83˧(ɢ !g2rq$3ꉪ rT2mcQ$1` *#*z'Ҡ5t T[=׺~I_E?8Ɍ[Ιxg"3ȹf#ψ%(Or59,r{^|b켶 Qq/OOl|Kx(8eȤ} s򾢎7_ DR;SR9f}*T&񇣤M( 3{s1yF݃ż~EQR򟁒a(ti#J|,/r2qz(<4~t '5<;mmggtEzA(fnk,)}x ejDy?=}i ey(rf]#P.S&qVnblqO;}W,}P9m9P{CN -zpHΈmCu9fSQ36bCy}puT~05aaT%]`+Og Y9)z:&Ȝމ^mDwHśoȁo DN^999He *&N=<0PS O?|oAH}OY]o^?!zի4R߅} o^}WYBd˨ȵ3< @]zh]$ϯ>FhM2XI'}&~^ *w?۽yܔZ)ʂgsw{}צ~ s?dߌ ywݍ빐'iV^- C͉FΧ j;Tn^56cKe*R1$W,Guaְ= #:4Լ`ZTi bxSj w wy}ZN ^+\cQUϋع&iДjl7F<6cïwF> 6.oO=mcOg%f3Sr}=p ]{yMKbyz a;:ڙLcmQnwg)jצ%$nTE3w~GM̢Pu^3<:l"j3zi[Ž U1R."ۇFe"^V!v٩U cO6^l6EBr䰥i7=su2 -UC^*P=jDa~+rћ+S:ڸ1v"vp d^Lw3Cqk9||lfq?ԟO>uSf7/@݊Frl_ /Yv5% ^Jx:c;ubzPyd*N*u=@}eE7w+7j yjI=$nmsSNl]-;j痷Ǥ(w7g(V[q,LXʪk`٩qmᯂ(ٟcxoHn!GiNLr Mpo=ܶ½G/aɺU}ÎRI׵.%%>A}6Y9/˪q J79e_@}1?Q'y`1+_g!M"fHos$o.rwI~'"}!ersH}u֮ .?怢޿8W=E\Eb>9PndN(Ks)ks渴A٫)GRQ烼[x$~rX2&с^u5vZ6w&iaݖǍB᭼a UuxBlҫ>n{72ϯQ9gOz$f L"KޙCGػ=AޠjRQUT5>2UQebkUP5ӭhߨtS;h-* &ނʩ 6U@xEc ߧac/@e[Nߠ,AS_2g}/2NWusQ^ޙr_8DeTMB%n2OӾcyj[8I Z٭/{f_eIQlusQ[PԩDX/vB߻sAb׫JnCє {ړP3"%{;8>gtғQS_P:eХ?$dj3{}Q+5?u< W W%3\{f(ٳrDzQ2AH c8LՎJ(.I[7ᇮ>'a| ֨#qkCh Bn]g9,lD㱣&7|vZӔة=+ h|wZI{#jt0s5.@|'j#uYєփHn*=Zw*oXy=>gU& ia/0 .]y"A(ڟW.y72/ (r| 6] *xQT;$!Vahf<ʯ& IɳzUm8-U^*}'ŭQ< =L2k#c^ʴW3$13.Jԏ$v?NS_m[T{s+2'0E|vfQ:٭SXNyjhzՑ'.6 zdSͦ0Xg ʿ0V9jmQF_P}NZ.\po]wTl8εKT6XWjY/*q*SkL|WLc^GǘS+ug,[$۽uQ7f;jpYR/LD%ubη] CP0ɟǨ]!Tv-nͧUgi_L#3. FƨRϿ䧆iqSʰML_Ƕ\TmTN:Ƀ:Bb<ުOԓLV'_QmFxH +^~ A+3vip6/Q>(T,1wql j@Fޏ=>*q\bj9+z=W$ y# <^xz''0rZDJ/zX?`R^O3e3КaL_1ظ1#f![Pel*OOQ#)LvRqE*v<0UxcniEe$2|Ҩ ռ9xib T2yH^/{j*ϝ|'OBMZOFdL?bW{mj/mms@U̵}*Q.xsT}16% ӟ/K gv(P𮮨8'ҟ}*Q~Fӻfռ->D٣Q9"H P(|ggT>Ѩ2 %_2뗾Po~yb"*-Y;x7Qlh`Ļ'V#e Ǟ:T͆UUSo:航u Bz+2Zs$MS6j@T5 O#5K2r*Wt[+?e3o7^#ȷBgkPQfTn4(u>o FU݇>#6*83]sK%vQu\WaH{3T~ OyjP5rYTܳ6;$7.QZ޶r|v'zjMD1#7BrS-h?? Ev֡^1=8m_ ZίxN/:4p*{G窨)4}yhjSgrf4W>L0OjK&?R>U[)Q^N:fУ:|>]45n|>ڒsۇVvNk3<_vHTgHV&dc= DMIo@N7 Q?$b":E25U}DnLT'rqVچFE_/ Y|TCŪzcћE8eYooNIGźFn#Q(adFϝSՍ T.wg 'z;"Pϻz*ACoķwX& *FΖW2")ErɾQX]3 xb_ه2I1}GJfle~pm*R/IK&^ 2!lɹx"mu>O"GFTZ^E(<QiqkBKĦ:/b}jU&{%y6X=%q&6 vV9t]t6F7f_U"xOsCňݳ?bz ċGca-/">Cǭ{^:҈@ľҤ .u^aחfː^IK>{܆wú:ֹp=n1Gd7fӟORM0#do3?!j[՟uauZ;pYyN8M_:/L@xٳAWiWÛv[wص(o+޵ k_EW"P~](6[> !I+sޞyP8#V芘WTf`v?A)L3=QdhT` /R=6A$CJO-eU=Q-8U/}|Me!\9,eb4ӿ{.4PuԾ_?2ϟ ZX)Z1kQ]Ԛ/95XoGb׃t9[|?l @eL !(ozP!%d^֎Qu^lڦxYGAvU(Rl]NQCC%$)[C\j9Ρ'Pտ%F9 DHaPhpD:J&l!a6 d 9'',UBI؛טkL3(|j9oe#xم߼䟩ںvݽ Ӹ$џE{Phj J{]Ao2Q {)},C֐=!oC¨(NO|MAJQ?# l`jdi,2ԗ&#jVbTL}y Һɝv_̸|:dY`<3n=C'w)w]Ϟ3y֧!:-dΗ{%b,T` bd-€ ;M82? mH?w<>uͫڳhȌP;52Aە^Nsҋk}D=6WV k_:dwaw+o*+"6|Ð}0ʹz-D-{9G QI}zyH_{g({K y%#k{ ~Џpp-9{w|^or;Yu$z';U@T3=͑q󍌅O\?؄:,6lSyW.AeBC߄g7aʨصA ^L;,PU-W_d~NA#X0uۿ]FŧOj+>"N*q⾱娺+m[(չz%ivE)y Ȩ;G5Qܠw}8֑jz0m, WY\ף0U#^Ȓo ߋ"[<3uB:єDjýs @+=g7")+/GoR{Xʿ %w4"{֩/2H3hKDg?&m.6Yvf  =VyJjufwC~Qv>25 gexǿ"ǐ}ELq`E7djiLNZ"ch)ųyeG{"+#it~7^Leyw-xw{Fvř5Z6x]w{4Uy׀l3caNMt]sa1wb҂{Vl[0y߾Hߪ~i49yߣGKW ?~_4rz!Mm!V= pqʼ~8E{N!uXtӃ>P~DfAA0 wVώh?]~w^]V^GTGwEЅȡL|bU/BΪyB Z6+ќlXg&X W3%t6|bVҊW|𙚷P3w2TujR:ui7HF (oAŖCm>(B;Tw,*~l,nRn_?>#OCIYd.|~ 6ŚY)ˎ-R@)7oGGF}QD~M[dx&El3y'DB7Ⱥ-rXMQ}@ܡ?`UޚC2}ŝ2oVT?Seߘ׻V=_;y_*< :%'Z[KB;^AͰcMQ^ux6ߏY uI}mQZǜ74/v3]e+e 1}rD5M;`&븨Wu솪 vx=A;SA&+pq}Lח}[- 'խLN^<1g*?~SwۼLWTmZm * vԣ2:toڨɬgZ2a#ǠL?tͶa1;%g~|xSHf^:`$"Cxf||ΚDTMg2ӿ'J9%DmҦm (j;L#m@exٰT]NR'K%?'c$d}Wxɏ_isPIup1 L$;A+`r"nI;`6XcvQ?uӹNz{75$x֩o7=Su\/~9onjJew$f߮ꃫsWP;Dʴk+fEyџ^֐x0n&$J)QVcw\< U?2ڙ{ @ր}Q1ErmgґӈZ%)?]mD&PNԼ.>N1IlQy"ӧ4߷QAUeM+T}lN_ /ؑ{Ovi)W3ۻ..rްYI|b[ЯW>?6S<~9F#4Kmw(&lK qQMR)(g}v-إ2׻:Jɥ(uPmd_Ef2*p9)2IRH*.9nն82Tf0qf}0]ߜ'QP-j/SM d`T.X1fa$>6:e̚خmVle+K?F}nYv zU%u (徯2BӻuE/4?n;B3-;PpJ]js~B mrsldi|v&o:$ ~ڹ`+f4xeBɗ^]{"8w1?ߧ[f kP.Zh[M,}x5:c)A*uÞ_}բ.?oy 6F0jL}(3y3vE9-s;{N=*oeFxѽl}]7o&Gm ؒÓkKTG )0ܑ߱crI/Q|sb69{[G0[~V+H\}W? *=?_yq'T?_ jLeN|N{BOnAGr5vMXկr:ouZ7/X3 o$b1㚆`BLd&Gm9+Gm`FO2zx3_~i9r?eNG_F}53PwHlseueb4Mx51V8Jj̋ۉkFUhq=\T qԖ,qEM\CrY *]G3_kk4,Dξ?=oo f8fua֛Xr-'nb8p<- ]n\=aͰ oZ9s-֫ʂ=[]#HuQtկj(u~+ǭƎmomG͵XG.媑{g O)pSJSV,JE@aز!A}0ל~{375l{l;[^㨎m'~^&|IPS>1{d}׎7f^lըe{p< {/yKliBM 3-5܀ڵUbPUP$+n^v)CGOOCմk~[>nA HЩ@(6N{lk͏!:]t;ᄼEf!#zG‡X3lA qBԥX/~1 ev/Ek!Ank϶uڳqοO?u't22Ž CwcNBc9V~n}2[=W Q[85|3TT ^ۆg3ݍ6MÖ~Ζ>4 ) [Q|anjf]t-Y=ajJ;U ٚ'CqhKK;P}^ H+̭;\;.הb\& ˥OUp-x]m{#}AxVp$.6]|ΓT.ln &#VT&Dy&Z*]xɥm3ExV3 )mx<+$HAZ#^WHU 1S]\0z@i3v-m?L:AF?y$$JQ`Ri{ J`w rWs2\</0v{n+Mog EFXO*~oJ|yS uBViaV1qq_Y#dc&|#xGt\y"Fxu~p]1I2Xm~^GCdޗyDMcaV$< x>GOה x>no6$K?9*i VOa h/rG< x?Z0]^_ *&AtRdfÛ@ھ$<'AjҔo%cT톕ҶSs:dG4r{E >!eFu(k TfK)pY0)͓w]BÝ8Ys4F%3$1ka]oAO͊}5ݛ?iC~SPc 0F^?z$p~1S*qF >ES?NU2<w!%G*}~ ~mL!`m5ߕXuB^:DOJ g+c.i^0kJBS&o%gl/u|xG'st>~ӿxWǓmc'#NI<^,8)dݯL鷀\H޴u=};w]_^ރHKۢrYaLzMvZa0q|ݸ8!}.@otq(LxS`RˏAL<Ê0|sby˥Ew:ٹJ4̏H[hguPW1||?1 CV-'_xg^v>osPioZƾ|H d\JkA"GsER7&zfwaZwE$sK!缺fu*t$u6XlJD{bpY3̖g坅@f#X얢lg '߅"*\z3u+p:?3:ήWFXe~.R55- $o٥}횿J?CS"ӕFMi2fEv6R/f ߢo;C٨pB~z_h4,t `F&f8[F%55] m>}ł ap-n]k8t2P+>AwsѪ[aGEm{8:$F\Q7өY+T%: R_ڎٝxwAdobFv)}|I`qn:_6 |Wr8'oB:cֱ WjKg-;{H+ދp;z5o:/0 Ɔưu>{HS_&Da(Lz.r}fNC9Ob?ljtVipjpޣEyEqn,y[*bqp8n8sὦ+r57XMm[] 35ø5X Ӟb}YVKZE+qwkzf"!鞀׎. R EŦ)HRtaDqn|{̡gF ' }zprI>2x?}$"x!YS'=Q ҧz`#|~eL=>pʘ6["a⮔w4j2}Q]$m7ߕE9f~uVOJ]Ȯri0vLmYpZcV!y{x]l_pG)ivG&ﮂ=D.sD(\Ӆ' /<g/Ke,S_)Q]ێmCi_UԚ?fgQ?!}V "%/٦Ey4g"'\_SRj7]Twd(^mj)?Rۉ Alxz[P7i l^kȇ0| \.#彽wمa`{[ss-Ī*l3ʮI8 #X磟s]8+&ɼ B gL_]N[%(΀suksׂy[_[i8 t%繘8醊]$'!:j$"COKZq04rLAYǨdː,+kPwLx,Y4t6XMc" >qN\$6Dt=s*hEM|~e7>[u[6leYɻlȈ%[e0,4~uwBcw842^B_(+$5wBdS(ncZBbT ݬj}+ҙcmD_E+ Bh|/2D%xMkcXXv~|65ŝ͕yY-T I9p}T)Tjg3{B@wu<;$7ֺn׭  m  =+|+Uk7[' ש =!`P'K$*YftVgHV:/[e>f HY>ʔuOPzwI "\[ÐT%f#n G<@A7o[Ar9~r~^Zrse@^&ء~GW^jEi3(E/[5]DŽZjVȽ1߻19{?ݪH8mfE;]dz*k:ܓ (뭽<  ":G t7g! 啾vyLp4rcapR^s ϩ4,3㷕]g]x6Hzg7-Fy&MYy 0Ү+G3Iڞ5g/a:xӧ Qj;s"c~s|6Go3%E͗ݞûFl]6<ܜC/ o:6R׾3aw'^䣙ˢ"Ttzq;S]px]%ȑwČ-rl*^f e^'72+O'ͼLk|;jfUV٩a#+Hgc{X% {זgj'O~Fl2[+ʟHˏ` x@X}M^a__c2GN>`f?O\ctPkls䥂mL~iGd$O?`}x G4dfxӽw/7n9nMg߀o|44Rj[qkC$wM=5WF`y_%jF_B妫͹)u,XV]CB=> }yVK?^mǪowzEPP@YxL0T}?i} ?y׷c8 CAS2~Ry$ &<'Du%O<^l8oH^wۗgjL1u;OqzoV^/+;wMx˚Hn.rSÆpx_"95ٹ\oQ_fxmY^[ĭ?+9k%5]\_6x׆y Qxfꞅii(V a e3i="d)2q#?AԸ‰{!~RR!b}y5J!"VI_Z js?q]ذ>b6wmNG¿pRM gYN#lk;B(]#!t!aBqF`_ոᢞ: +rzExrm~:9DY;(]-|m6X]9ݰ.NAQ5."~CLٵA#=!55dzG:"K'Uc@% 9իuxH;wpr t5kYi IȺƟ!B恡JmF"$Gçduyŵom{."w\qQ.x?'YBtU/ B^Hof"h"/ #qpeuiR5vCƯrP/ ,y}k8v44{? q'A8ʫg~F*yK@Zrk\ALcifYpf-y$ iܱlZf0}'l:? Nf v}?@O1q1~։43N}gL>,&b[פ-?]M"Y Ž'8~+d,Jr@>U6'BޢS彅%NJsd8?e̳pV~,lM"Ww6~˥_s@F Oٴ7nQBؠaӰ.dZ-zf6,2Q'~Zmd߱2R~Ay!tbq }9^SכZ{qJ|:mRDPVwK )6T DE3<<$rL_ Dq Fs{Z5w4R[81\+Ge7 MB妓qxj(6mGds7lo>@H>B`!JmKL9Xq9N`ξ5CZ^DzW? o]MU'""iuBؽX6 Nq5굎L(zX}a~E.^aM~|F.=~RV e& 8#ڧuO߭0ݰ8ŨHQ#+RiYvˠe!w zO~d7,ӖCKS۱HzB?Z]Ge"iKAGv˃?| Q*9E\5lF3J%FªWQd.*r=Qlk 5CW;Pͺe(K.+!!n<աg;YKJBL"bӚ "{7U$ڨM.f`g!#~xAl74hBVqelȟ3 E+"rYWc]](6fi0꬀¶g#;gÞȔq,`mNNC[Obcku6nh;\v}73xHg7~n(aEByֲ:N|W7~zf҇SIz4a^CuL#/Vr0ot-=tyCM!xRO,t=^{V1<3a66.׷lI>"<½,D"XQZ!hb&jxGg!RA݁ lwW\綤"g yG(6hՈƓyjM9Ci82T uuXl iSw$)BR<1H,nDʙ>ÐbWԤ]XO_J1HX];I1>Ri߲h&x{9!iҜciw_#J:_!x5"ʫ6!NKľ~I6׳3e3¿_~[s6"]X~EC_YDL mj?C[#dzW7@hDө|xz-$_E<_WqYS%#ǓրYK-^k"y(#vt1ň:3ndi$ԍm;ia ZEj]P>. Q7LM"~[࣢%=w 2KrqHlޭMSe}C2bp _QA]/pݏ%>_QһchZ-U^s?/exLͻT:p 4| Lj;^MM.?ʼU8'nY[1"l67oۍEMq'A7Z%/S\uǩ@[M#wզsͰ~`p>{><N90q^MT55C@2 |}hk&'|W>R^sX :7]8 >5"'|[&6%*51"FQO9"N*O3}U0<5|dFH=jDZ͏׿OBixMXM^ 5/_E"XPtwfjKvxBw5Y8q:"B6+CE oS$U8i'\ӭȱ+?zT+$mwfp54EDdKȄQ h,MǪkq pӿ$T(h<)WZA=ROqWg`Kv@Q_d5LA [ eXqQ!1uhE۷1bq^麳8 FƭӼFDU8Vp؉/[\2y*U:t:&fVa>9@;'c<#̌[=ly1Ic|Mk65andHL_#ko%r)}F^H4% if)"=B_*]5"Ѩ} ꕂ4Yk\o?Dtj0n7EԒn h2+k MM%g-<3[*}x25W$Z|+_| ê?Ӕ4d=\[ɟ>ڶ5WebYimـ|!Xy/Wxgc0.X8ny[ʇoe|]̏.>c23c7MvC5`BDH.wI σTk{閃ڎy1~]5T$򦫑ː8΋Q #c@>Fɶ^pXnTv{>z V[>/N9K\1755^ ƉDu1b(`p:xNk'ʷ$0:/Tz1CbMh6L?40Vl|sHG! V66op2iSy= Ꚛ\SL b[pJ8*/bGaCPbhy|H]O!'Y?置|%Td8XQ ?Z&}@L)bf:V|Y3g_2WuV}jxbGy oi$UW5\:OGo&_/W%Xo?\iT Jd:1Ad,9Eb4yyjw!J}%&y:yl킈3:X$la-;6Cy}|韲Go*λ6y]laQ(~knҟGU"p1'?<|W;zD#ȴR{BV[JlwS^{`Za,<:Sv}!xdƪB lRx5n9(q37%A5ҍab"GG`gfI۵N`=i-gjI'mC`Z AMj,'p)<G XɿNi&=hp';^ĺLŁaLqu}6NkU˓{ oyǠUʿ%e`nW0WjOT9iLc!WAحY0n޷f>4m0zjY"q f#m/ig sr`-u~)I zu'l萄gON,_*ֽafLѨ!0(2X6 }[KR>񳐟7>N`%{ W =nK&ř;z#,`?Ii,6\rGuҭqEfgF*`Pw0jx=X_z+F[^syo2uz*2]C.\]AZ7Bcǰ`I+V)q+TN&A繰g*?1,>TJ]kaR!E{SIy ឍ{?>h׃p0~qN0;?irl Nܴi$ /m`(xl*.Z .].e ˷Z3Gc/A=j̇Wsg/a6o,YCdͬ[`0E.X2en -LͰ q8,OvHSF08ܛ'k`]<:>>[ylҥ붿mE'`e~΋HXj5,.=XMd~e[#Xݯo^3M'߁ewtCIW-ka!*vdm\匓nA7$륿 _{üޝ:v&Ym Yx: %] {hi.1A@,JQ1s H* "w{9swQW{`GD i;_ +lg]U|V`9#NK9E|vYdkGUljr^;O%M6A2orӦn2sldW>?_8%ﱩ39vΙ}O35x|6odhk7#(eA* S+RF- ɍ\:!ʾW ڬa11%G;sg); ;D6 ­X5ݝUuXS# Q|.1w!7{!p A4\zե3#8Kjߦ,tW(yN~UJ&S8n$;skxfG||C{Z~hxr?x>^2MDN_k|ƶ 愗՝J{=Ϲ/}<7[k6JDQ靑" /i/2JWv?cf43Ŀ'iӡW?%_MA($~ȦWKr|(pdZtaG"jIu.kƓi&t1K &^9cJ3Lsv輏(gw/fcãS>}REn:~;%JJ;|El;U!}sNN5 vk:ů^o mx#bn)8|Iu4yWW=/"%5eBz$ It~MRN#,59n/c Jw!uәExݰb)O]a6o|um?=^YZ"g oO0"l~Pwk{oHJeƗ=<졆 oMPr7vvs'Y بo7!1qqS}ɈW._%wu;hs!|/wc5 |`m]JN @)"Rf6gSΞc;,tl&$v7/u-M/fVu Dʐw~CU2{q#JH.۱8\S()JK>xC0ʾ_%2N!?^_! +uiPs7 !{)|p!x󠫁73mBƶqS p<A{ `Pvh(#yw'bݸ"W1b,i@ԛfDOt ɯnF̷j#1ֲ;'u8N ?3!J."O6Dt 5kkĒ'42, W8Bwc=Z?xܕ1Y ^#Tr47p tIBP3=>DY^Wla595i,ʿ4{%<=Xd,&x=,F TqG6TS2?xG"6!Zh3^7+ލh׽Y1r6%XT>0/I#r&͓)czx4ڏ&[" l.YR 0\9[mBqa|:B=DG*'e2C#-$ ynV i~b;&딴h|Tâ]:[io9gxD,N/wlBh>&""e0BAtAhCYvp?|v+yŞGO 3+Ga'BPq"g”uk)H$\'Yd(=xߠ̃rp:pUɮڻtncsHgQ\9]=Yg3W Ljdxl7;F=ڽc-;T#/"\#M~ nk|,_naۦM:v#A[m po.Pߊ #p/xoQ80Y֌\Kiph8>6HߥF>aT>27Ķsa%E)X2f{ ~jiӅyhQlVΦ$(e5KšZUJZgˮޙn_P҃BD;H}su&M!bQ/l5tUN8ȀCsV2\kW:R]exzG[ڼzTgLk5* Dœ=rϗ"2j[aD&bOQoExƳ"y2jCrKj\@앱1!D?wpF7>D-T!/rfe2_}?: Now cT҅Us- |8"9<Ueg4A(\QSҿL <[M:ڎ+ēv*^\8gH|/,Y/!|$Og[c^ek8 M17fLD_Hy_*s))sO&Bxt^C`YhH'|N5]pg֩OK$tm>: ˇvDM[Y]a;*%}wv 487ע2ӇڟBM$ N ~n.j"PD J{P+R7iØ{[wޏЌ{ysE6e"/T~b-`[|##ϵ2F7JZ-?qŸ!4? U> 椢$OJk"ԩDM;"_;SU"EM;ˋ"0{Nj[rl*+Mi L7&:6jp5r#Xi*ロ?+І{]Π\;[3¶x(B#gᡢkmi R?%i qd''Sea "N<U}~ 7c'`\ ;$Iٻ#wE3kNߥicI)އpz)\4wBh:hw(zz$OUfC@mWKv&DJ J[Fv1r^^SSwdC C(ym!*XϪ9ϸ!e\C~WuV/t,fEmS$6la>OB0?_*Eĭfvof$u{ა++GR[Uq+)rho[(=\]V3x%v)< .Adkk:m"G#*5>k̜D '.=dVSuӼ <:Qpe&]?̺J}z~ C-a.m2 P#zqN* $v bo2rB0\NGO+vU+-D ,r0+o|{ ?zU=B4L,@d8ebE&@yj̿h7{Bդ]f,cĊ n&2g.o4 89x+_=s3SKc1×KGN^D=YDl)+ J/ĺh v"t%3ݴ+Ry}Na"ru IES|Eg\VyOBHJ(mg:~F'GpdDԹ]dDpVpa'"Yk-GG;}V5횈{fX3dM D4܇mÞa|3oF?Yq;bIge!x ݍY0PD-څHݫM2)}|\pY:;|NFeT96=,f/CܢcD];~^]FxRӎw?ې- al1Dϛ;Gip!wM߀ՇL8QJ[ ΆTI4;a WJW ŗrs8ex2c8 +ol?k`3!~m>|^ؽLI]DŮ.J?tsz .; CXTwl}Oܥ jE6ucFX5'/yvq=p:j,v%NֿԿ GADa͋a5;y/7>Boy&)o Ӟϭ ˠm"?wZN8/MhHy{0Sw`4pƔYh|tbty]*)ʹ~l\B_HC؉N;/ܝYYjP W|yLU ]ˆK5HY ?@C]_yJ3vYG۟Il:.W"t"kȦa|XOK_IRMDIb)G/DпS"n%!js~A{[KLOM")p\\i]*yn!I\E@.Oqh1#&t=ۮ?} ^E;/I1+m[CG~\><{b_o O Oi _x]O/F)5-0Y޳{5*f1׿ tו9^5&o3&#Q"0=>K> If@s9<;HaGtjp3=Es>FPGw.W6u"ӽ{̻$|` 'A(ox59}Eؕ~\{-AFG^XZ(.qyՏҗv%Q(MGP D~*o Aug8?jngfe|䕫-8һKz vV[U3Ku]BFf~]%MQ976v̠໻r7=izNj_5M5r|ܜʀOXyжf]-?gnTLg|3?Z4sш8fyK´>T7 1[局ÿk)9fbMɷ,g&[jC},6Bɼl4N3P5<SX?D<<%֋ޙo\ ,!q +̄ RO2!e pĹƔܩ8)1B5/hOa%{2Q?]$ЯT8"ZY'9(83?A9/=dL5 ]KKyɓ/ЇLuIrAף8VtnR8tc+3݃8Zzhf]PQAdjyR&;_@Hfc~m-e.;]iL{"DJ^iLWg9_%Ԕ?6J<;']TnKjF˥_-}e8/}u[`O>vxBfa;zzkvdssNySb= =Oee/m%]挤Csҭ!Np(T ~ _U)p e>ة;w.퍴=#Ǻ`X2QOֆa'vbҬ,~ad(۱*sS3QKg{O \b7kC;,x|ѴE2 &?B+M>'e?oѳ)iXE,e+\36XwǑ;O>5#XO:2$/}> ~/]y{gS6i8wyz'\<홯/*.\GR҃s;]7~݆Z"ۅSNd3`ס vw*FwJ[ |~DG-*yx' lʋ(iX8ok(*wu/uD8eCqOZxs߼bXPMFy|їQy5FT7R|tE+r\Qլ9 \]ˋy?K\ =~u54VpIS'3]1FOeQ*zI 1w#XzS٩eJ;BfTk_CmR IhotDL6P|gx σg Fn?S~8,|J? ]>Q3"o!L.A-> a¯rM. \C­`"C[WDj?Sߡ/Zn`&B2_!x2 >uzJWFQrr:n3'l!o$f9{H">wS<7Aܙ yv 3W.m#kyk/׺.!X*?F)v [$NJ# \=~f`=Rsl;.o3K31PfǮ2 1V> e+ /k)wʔU;a7Q}*W 9_2yvAls"99pN~1Og˱U}Opm[oZ 9yљ=s|gc:Qx'uoJ\2ms.rb:]2<=j ;Ç`#\Q -{i1~k{H~W5E~ҠG`}<͒l,yyfX/]yށK =zsMzibU;a09bd,;M1EEX{ӆJR'g!u~,ϔ<$]]pJׅtE[aըPjb ZuJ9zXZ7փM߈[38XzdE6 rxퟹ0+D獘*Kz4]xki{g׫w vGᒷYI:~#H#^8.%;xd~,"V׾W!i#3kk Ip.Ɩt>?wC߾N8OYd.s@ͩ9_ˁ!Fu G 6[ZV{ž#JnN2^?aԿ=K+p;սt:o W۠W.l}܏p}tσɤyaqn=+ F8h5PCep xQ|}Q= &Z=l5ݓf7!La+"|ռ ~ڂpMvͿrH3e-|r@V *0Qh9d)O7W%ޜ6ʹl}1V*X=ȟn ۰;_V]9%uQjn|}P/7pi*&2xk vPc+И@]eD?2ۏ po^ɛM-]H?PI} YBU5{)kufU!!Os߲+9Z;$e0L$Em?:(϶V[+?pb፝!?3VD%ZyE ~;fgp>ie7+[>4vlNyQk5H^i!~x\RwPm #7DGWalg@E.p}iz`:[{ptn]:w `^2[s2@k? ?h>oKwu|י o@}ݧt{s+U-s7V[Bp??bs tdơ ~G¿:TlA-.#(ɗrb6FD@J?=sTKI!܉9o4Uk-mzT_Z%^[xCE7iA[we|MFMPY+}2ͻ&z`{7H=@#K\S#.ՋGVݺ̏z CCա}5)TԊw~  5`+0+4 7vSk!B^1\)=/|M,ᝣ֛I M%Jo4&z;Pvx~ບg/wCՠ +t,xO~!B>p{5 7"4w.G!oʎL#o ؊Y"H廇Q c80ԥY}BTlY2t>6o!n3>_0p nU,?QzlOE8$o0fڟD?vo976i>4}Qq!c#VuSwHP;_lkr$CoG lK _-ąp+C~10s b:B6-p"a^X,=> 2-]F$G@N )DU:L ]*N- /Ax{f\6¿UA'ee7R%qw{!1'7<&7,3hr, =)kvs[F8+#5 Nl&>6;JJSO*5ԇBgabB0_`lդoGڤwvh+gHABT85;[u$o6 gzPC "~'Gtiޖiy?=ꈝ 0BBF&BG̯"?[5 *yM9e<\2BAؠ/DZ?h[GpF_BByr="~K'KǻZ})!C>۞,}=l__m&4wKٱ()P@kJZw3{(9$3(j BN9H`pJm󝇬ScNjйGMɊ;|zrt9$>Μ$9#mH*;F3Mnݾ㦁aK $^W{ni8T"=)r͜ʏ =91댔k#;|LjX"2!'ܮ ɮۺ8IV"85wIQo'f <{Ɲ~"c8c{a){J.)?Z#!27gz)▎{ ,L@dkFDGgŚ J%.PVw!QNvBR dbI)BO+m.LDdAgһ)$<M7h`؞ci鋔Lo+ߵw4Xx&G!#w$ZT?>hssHvcke9ƂXiړ؀$8 %NiZ;A`,qB]v(8tCMUٚ+b Wq !AP|q8NXק} y)hv`.!kG9L/n<a!vqm WTc˥F+0͜F#ZDU_R'k,#frܻS_אx^vY6s-nKa=aF9}u u>D^{ MZ!5O̠Z<66Czs06!2D^3i]sۉ;U;ȱm:"!0l/^"fT@ʃS$+*ϼBpmGOZF ^tV/5^Fn<6m +~Aٖ>!H yUCEP?)db drѐc7^sevv/^i>kM=~PU5G}o]lۻ?\JQ=IO"tG)0pn[.9p&2 oN0NA~|;/߶vSU+ 9'!v.r#Byq)H{v1"2r$-)HXZm% " ]F1h\]-դKd<$q5ƹRr Z#s;]yT%8bt* /ԤN?o'oPTWDOMq U4%R9BT yw/B墥P hL?$_WBV94Wz \$ΞyIfR7`拾oYB oVMdaL"-{Kv;Ͼ5'*ٻkyEآh!tm\c8CZ19% w}\Z=B¸(܀0zO%J$ezF5-<<|"e}(TWִҁk!{{DH=IUjґ":(4R }Ǔ7-6upytJ<שvia֦Ib禒Nt^IP6*o'$n2f2N54 b^Tew~p@A&?YB!FB!I![Z>S+h9a?FV`/xrҒi[ Wc|DiZpĩҦ]U7{y*Dt="~9,oAfEUCTA}җwAHԂ+vzSAwD3DAЬHgB[x7*yzտP^]ZJpjo~\!#o;!}S_TL:(8!&-灢)[PD(1 R%qAzMȰ3,*DоGCnfoH¸N/ `O |m7JYw{ӧ|@86h2$^KJxQ̝-#gHgϛCmkB{SCBU[zX> EYE3)*2oIg;vsQɠo{@걬<6^^th ^&"CkgJ׮/J4TJU= Ez yׄU-~4G|bHIMh;䒋ؓ-%tm+wӂ"77 ^ x0Ck/}klJCth6i}ԉʋdž V?lPO;H3|'JuaHX _{:ʝC@$>͑!3ku\N^WУ"cUc!>Hj;v q+g[ $}(dĞ%-?T%t@3mU|'~p 7ߒ턶}88 Eڕc'Y}9|kKpb|%H?$,o$jn.ΆAJ(̳i9z 3 Aulqb?i)B5˝v7ǖ0mPWm.2̅ʏBݤS*aX)Ezt,_*qh *"X趵'pBpe^n"6jk9DxB4ګ73&y{ihm1 :'k/4;-̚Qt 5e%BRhŸ̳ri{[->h݇&v٪Yr)KHXW ['/W5<Ҵkxu7 giBj*B]_r/Bè=X) MAccpވ#ΏWw]y ]LCNN$-5[9PA"iYۛ+C\OE55( vf|`qiρ:Zp1:Xp^n $xb5+w`o|Wy-+%T8iBQoGww>$i'CGjӓ &dG.{W0Ν!7B5 HݟjU߅r,?I& "/ڑD1^a o .!Ba]4f-+=|FgG#$i9d~|'pr>X#Kjt nr.4o܀ciX2j!"U[FUZпyN#j oJՙ{ 8jpMo,]˃7щ4MY]rVN>Ec߹.w6su!GKKD{vt^YP5SBHSF9O !x \919E)~hr>d gFb) !_q$Rv̘о֦H&)̥L $Ω~>M]BXEJ[h'ޒ%ԫh@^b-==@9e!HJSJ 6 3!t;mKH \z+HZ\ւG%iO06R&@p?D7ڷٶP [ֽEW?F[ U;tսӴJ5;OƧ~ʚ/ 8Ypc ^ ]$xHAvϖR=\= >3;HsWE:C|k?UsXz09˝Sz䱙!}c'oh=`C%t~/ۮ~TR*4-QoE@MpW)i?yمL~q+HwN;s>Z .2UʱoAWF8?ѷ3=SEWzz[mP>{_i!z5דcۮKf lbgե^}dg:\*S~G/&dczL+CnNBuWad .@^۠rWйq?˯8SzYb? 1D !%G^tDhP?v9~Px`}W/"tJbqF3 /n@4 &f(=Z_x'kqgJckk hE"BX7IЋ՟KjT+D283!፷5ixG ?q(|=`aO{:P& wg MAgHmW/$/ޟbJt@%+Ag왇 wzL$:u rw.^3,3J6 MO,X4J_@mCt9't?B?I^IsM+%GOS!~j7$F_cӏF]I 玉XI %]!A6SR;--bf P7kFwF.3dyyV 㟌UNIP YU'h'|*Q/M9˩={Hq3&֥M`oZ*]< 8 >~!1j((* p<рGe|0icjcȋ ϓ̓ h~ɜnouz=ɺqAq`qr. qpH&?R~j;'Qo%wFUzA.cS!q*̘~ !cSKQI*HC ޗL3#.- d(h.=^Ʀ+WDt(QBh*w_N wi j5_lauM*i{]QyȪo~lG.YEBE(kho6 g̚* }wB;2)Γd zvgv5uT=4!Tm3YgBZ󿅛toW ~i2-fPxyo_↟N0KBݬ!w ZBڇY@'חm Y+k!u~w/һl~ʁ~}`^6[GmH+4̿幒սY}%I'G'REV`p@co×`VT}0i 1eP?t*2_EM?O3\!.{67Yz5iOo4vF|"}xקo_ԌȚBOZ5SZO٥O(S}S5sJoM 3N4QGnAwsb=6⓿ &\9S6W )`Bv %2 %}JTzUџa9`ŅzZ_ Hp7W=zzv6P8m~0V شB|&Zzؔ4{һ~l*촬]z,4x'ȽN,X%= B֋Q9e?XcҔIU5Y̦QRO_1J#3딢CAe2lsTsAX)ٚ`e4Hy:OKzֲR@-C1 bxl[]+':%GKꑟ[۷_=uWD<:6M.ؒݬ 4?khTh#"{9^ ?pxw$yei l↗IYGn8:y퇩P%Pr"iUVNE a%{56H-7Yi9kOHk m۽L>R(#O* =$lkO9lb´mXfLӌLsW=lmDXVURDvdqC1X>iߛz3c;_A34X5<ow?~:-HP`1 6]PUh96玗!ֱ8WWU U3 5鐡~}cٚ<喴};J6Hc A Xp9= m_.b#FE9 vŃi0q>*It'k Ngcm#~CY!Pi< o~+GI'L57"/ِ c'l ?GKJ¦֏whqf`W m.Zгo`! Z["rk3Mռ3 `^ Q.MhuE1v~]/*, B-z[ {zozs6ԃ߅c+o"E 0 d ǻ`q^x)qYS3I/ {^W΁FA,Ԗ4DjDu~=$#/AI?::5!F,_:E.hwJP8j~RIBOTKi:K:Iռ>ԌfUO[Ƀ+C, {똀(Һ6XO Ӭ[G;$ %$R7뤄]}!ts]IN&sD-C zm+>TL..ҊI!)G+r5{a)?I+^>!7{?1iXk~+}[#oۊVHG:6 $Vmb ^2[+-Kt!Jheg*^!E%9~N_ gtdҒsS椞&f;I+'}S qFi}zWJy֙~{qu3AP{o&A0N+kAw U>mj"-U=C^~[MYރU<?] &V~Tl!f["kjr:Chr9GgS^y8NBhϖz+bدDΒ?]OeI?eBHh:qt}xaBVʴ8zԸ&vzģ^vV{s_g^B.gz-!=6puqM+9SAJҷdT-b-|h;:lpN-AR\*a]Ar)ewཱb__QDeţ!iWtMO%X1)fMUg⿐w 9l`ݑRyj}^ҜanM*7K{[Fէ\.!(B=q?țlҰ深n 6~< i[dOLN>$,WIb.- ZP'u1-]}74<{OOY> R/O<sҹI xBjm }/s =mith{s^Q/yK>m^_%K}n IAgpuը#sHMN4M_Zٲ2Cm5!fv2 =i~Q3LMϰD*||qt<:>EpmΣ!bv"d ghr˃go *Mҝ7%.9L|#.Tơn/Os{*Bh=rJYvjNvd1x7gk|:[pj_n~4>?.t$ .ڶLPoxcd W:u)mN{")L{6#3!P*< e飇}٠!)A{>b2%0yri\e u=4?i'+Cuަ[ H2oQ-25uO%1!o޷`^> \}7^ZK{#DZ?<moMe헺ٴ/(Ե;Yz|I!XjV?A\Ψ:p9L"mS],&l78bExv:1vrrwDcƢ 1L k鲤Yy⏠QO9_ENjٛD8ApT? {3%IcߊCD|:82V[?O,~ +k/^A~MgjmfSO֡<!^T/ʅ;BHe,h?8H/WfuX@%cghį>w֟;r2dٚ/y+AēVN6^mUgL;8~[T_+/<9 [)o#7*=6eҒ_Y*vέgGEzyPގ|~Ғ$}[Oμ jz[ɿ ,&Z~%ZOJBG-W'@OC%z= On& y|pݼ2(.*Ewʮ_8!HR>}R6`Ypa?'['*tg% m8&H_V`Ơ1;Zk,rYʭ7ӎ?pD>ϡ˦LloH<do5!KUhs:B~Jz(<%7t^:z"8:>[RrNTL EFS7z<;{fys}o@ov|Ɖ쓄̄f=}>w'Rt`Rss7~ܼW1$_} |5h͔pR}k sE̕H{ANb~S^MH/H lvoA6>4eÀ<}eA{B)'fS[6d!Ѥlc_ o=j1C^c9'iXyBNO !%o@^\߯ T(ˡ.sS0p"o:0 ϽLePqy\ z۞f1c{Rąx%?:ԁ zO ܃]qʵ4^0$tJ %U~~"Oz^EN; uv9:"D𝡍>5,ފ%OI3r)8ǖ<>Ft4.?[6Hc I%pJ!0^U9qR兿kB#Rars3M dkx(Bˏ%]뛺7y 'b/noZI8]jj"dN޴=;;lr*y y͐!~1ͫFD?kC{]ۨ&8L}Ұkc$(ՇSG >Ns¹n2xCoЊ7QC,d/ip)3g&[B i9 z[.Ԥ>aW˥;6I-&S<" 3M$mlR{dE,B5巘sU", |V1 pƇ:ݤ˻MM;祝@2䞿:bOWW(2?&>-uć~5I(M! ubYX!48%Z^-ұU} F鬾y5,h%7+l[뎟%4]^`L WުEWY-NalO{g/Hbx[\sFu_ Qϵ3:$eb`e>DԂ*o@Ä,H]Q%~I-%olmfPiM6 wT44;:sӾ}U~z X3.O=+JއXoŴ.[pCfx$rdjUwG).ܺ_Z)TFrdU>fKݭע{C=#zzm~|0W;B5]||*$BVL&GOkm~MapiӚU^)BZldRֱwJ+F_}&+7JnTln_ᲸpuZgɥhu 2Z6vA-.  YCByܻxH=+a1MS~M!٪(1~va۞m .]BBi32b-`qfՊO"ك/GmADk!(PP vHih}kzL#!1.: {|pX|m^Q-Jf 30+tqу`0hq|oa#iǯ$.ߧ/D!pi b RRBF!FN1 R};v"3_9U!xssZjeT ^J|95'9!=!e [ߖg~A,"[$>B7J!q4'˺6xMO[ps(n׹޶۷?]/3%听z5k27^v\ og?1w~n˦;)-xH<fZ~ {+B֐ߒdWk;fWJl'SogBMMtۍfq9hR9xlGݧ'߃qFFB?7>u_ޝ ʞIէg0Ն ufWЀTU*B09lg>щĀك?4SA{7xidR sV*ok^cճ[]qBۿsYܫ ZR֫ Z-u@`m-%1~d]`٠/,DRB*mTd[AIbe+Ev%4!@7)= ϛ_S?"7ANՀ*"T?AԟM _z%/9N/~y'&jCI.-h "a/w7g.B/;'{&{J&d{piйOsM5S W6"Ru<{^ {jV!CP9->dK\$[ YHQz`<s٬B08sd#d ҇ߙ=w D{/<LvgBlm7&CFxlk D_1_D2s!Fz^[ru|H)?̫i!M#"CEht-i`bҖO?4ܦj #{)VoV$DEZyБώ gD[W/vs,P#|oy᷐YyBetwr*2$ʬXoA׺Ǣ6hV!`IG{!ɭyK눂t!6ݐ#!c_ݡ>}Q*s;GNBysfP2 a+8#(z5>.Q-;{ۓ:?(~NVZcȴ!BX#V"ʻEׅs3*+=Tف{Վ[ ~xj(׆2gPJ[@ %A;#]iC='dBr$WJ[4d^BB2dyBӫo5֬/Kٓۖr&*̿?)4np=ntߑ7=_ľל\<R]9Kޏ ^&xB2M|nË4|2$/]Q鵦OCnڐu3~WK錝Y?,bJf V(|f4Xxo(}%O2eo삼=@jM㊐}͔i A+#n4bw{H }T t}}8QJCE2, U{SaȰ6h>+9+ |z f9gH}O;ɯԊ%_ t1dUWqܨ?օtyIr_ 'Jz~@:%^D'wJBrO< k 2>B,Aj u?>6GBzډL ÝAGA?v!qP9 ;O;i Z12PWXnksS9:P8˱r#a:mQ:.FCʜfb$?KLk<%&3m+33ۘ!TՌg󝩆-Rd" דVA̚|şi/Z@K-N;!zPo#2j-=-֚-bn觫Q } VݯM^h lu7σ1R .pu=4>37h>ݟU,LPr[=\2D<*yj.<ÏHXDf3{q4}cd=5iH+yKΤ Kq~gH=A/o@=k+"d!7d{麀4؃ =CQ` b1y6zͽ{{Pt}f.CJ%5 l7nB0Igu7O6SCB 8Lߨ[]g!ޔv_rL 'C a^hCgȊSq)6<۷oևA>{^7Dl_WUC$߭%WjUTϼ[!~nˋ b5dv/;W U9=LukbWZBvp$,-f)a[me[,2w)+rx?d[pZ׷moѶQ:$1@ZT&W =d89N?H1)n: rܪ kIw䫬yk:Y?P󢬇a 6IHVjjc<.as gMI0mhr'7H67+S恡ݗu{uAr ?=E{+2V cey` y2ܮٯ@Zl1l)CRS"!}~CY ɔg4̐(n|uڪ a/S.<[ʃM/G L\"mfs &-gmMvv07o$lO,yFOCO0_s0!$(n.cQ֏!_3%hot߷%`_[o Έ_ىNǹHOmL4UzhW0 \3 8~JG27Y&Ž&w5}Hը|1䥤zuAJڅ`ɕF C;)=7 C1.BeXÝ.h:Ve,Iȼ \HLŸ>>"h7aR+ZglRQb I͢/z3/|M,ϱXg/)I{Š7uK27eAIyoȟ) #gX!^i7@y~HH|.;='!)jɪmO~mt?C`^訁ЇQ!LJ/ gY!b0‰V S3sh)HyhK_TK,f$/8h.C,EP27|7 msĢ_Wؖ}@TIMS  )Mǃ`Tp~r˄D iUҍ&Rt:v 1 !5<&r{CORZ-%(}ł=j{}{2U7_Qoݻ n59e' |-#›풻@2R4qH(fBˆ\UH }+/ZA"0|I\/{Rx,*zc&͐ O]'( 1BN[wչAc_ N-_lyK!+% TOwdȷZf,Aa)'sdP_ ^w;m(#^(,$(ϧALA(E %?[狍/ qoxwG+ʾͫPx EG`u)uzJ}O;vA)97NwYdPmշkf-A-IqEAf "*Cvs*ė, R! ״> Ÿ;-',;RUr[ݷ08Z^BY756w%MwUw| v]uy*2p8'Ht$9fF#c!ۨo.X(/XՂUmy,2x^,7wB.r&,n@PV[3>֭`t.: &oR|0~ Aorq^YY/fyEo/}5%ilSP?($uu!x(5px3m iÍywoM%͟"7UAZ}^ i9lPTwnWUfsaY:)̤GOY!!Ge23?F!Q&c?BߣS!#;9r˜s/OBQg+,]MlkbE.g=у7báPVʐ{R*ڟfi!6{$G?@g̟鞰*ArpJޮHlGuacJh+KV ݷ< !+{_@#O&@|gQc=6x'+ 2*}qmS: r"&]_A1L;eŸZč }EECTtR|(' ב(F:ƴ6{@lnG &' 1Vcd>5!WCQmGWE~CZBED:"CA%P{Yl/vAM[/A|5˿qNrLw/bffeJN8B(iPoHxp✆1!{ 8zoKխ4 $sAj!1ѢDgS"cBbRIHHkcK* @{`CD+EJB |iJ0DAxU@F`n(Lw5f+r& ZC:Ԅu"%CBCxKڪ?3t!h ɶtͧ 8 7.@"fuCfl}xL Ҍ7 N\Ûr!ks/ҫ%5=Bev$Ă߿BeG 6'6A> dւ[.&9$R9ݟ§ ::PJcO@pcN 6#gv¥ol_0"&?-&Ȩ- 8ia!&(?6ב7<1EW濏w4\;Z-ucۇfcnrvv-ǘSDl0'׎H)~c,urg&@L Fc1(kf=5(՗!oxeф1廻b+ײnb,J{m0Pz@d@tz 9o"pw"`nr0;D;ŵ*ļtWSEŏV\ޛ]ďw ц-忣~aKl1CMОѵ[A%_Q`)h,K|`f1"7[GZקEՏ]naGt0sf4 }O:KvEqӤkq[RTL3bgE?eH| s8ÿ 1ޡՄ “7ڍ(uz6mA'ޯ쥙a=0ڎt71U`ƏqjQW8>_ lǘ Oӑ-V3-gDdh}y"Fom~N ld7|Xω4'clT.xL9}ƪqstb1=7+n ZٰyG&wڣ 9)W^ϫG}g,|{Q˦ ƑRIѷnnaoNƸuxl"/a|ռ0.&FcxNO17o n8tU1^#*YSg!ɂ W2aQn606E|<շ+E/&}EƧF#crwb4<1ѪL0_@缙ZI )˷ފgrQƘ%æ:QqHoL`ܕݨc8cl6oc4J0ǘ](?m1`Xjlǘ*RaITFeKH0k l0Ff?Ϲ'0*܏\mbq>lG9c1|QqlEJRȹHۊcܻ51oYY3LRZKѳSm%g>Mwr$ySbVmY1 /=yw@8FN, FM/vL,"v~")љ10̼y1XqH| `Wߙ^cE|0ZwtЁ`;iVeTFaou#b={9 nq9q#`#;~ #" OcO&QχRH $>-ڂ$gC0C~nFǫQ0J{8mJ[#e`]ʥW1^[HigaؑĂ/1|43A+TcMphzMx?wڈ9FĽq*^6XF,ovc,.Ԗw.agi|1J0kh.30,_&4pŧ~ LdO+ Ae{9`E/,\IT區UGh{x=v~Nxc:| c쟤SUxk[0&OT18]q^>ƩX//J{6dYCS2A[=HV~ξ^>P ^^u{r;ݹQt1)Ja_ 1"Wd#Ņݴ`vEްO)mN'ѻܿ&u6rclY1\RwK=$#lFƄ~4\SHcZ31&?'R2_1Wz&0BK;OJ3ED$#q Y<ȿx;o% c,g Ǧ0c:gK1sϾ?˜ӪƞTT{\c6ڗҙ?gz`J:RIf^yL߽J &n- _Zon?e5b*'Ly~5af1&~7ۺ/}n1>cTY3aÎ|)b޹$ad0df]m6>LqN5a9nchM`Ѭ1=vqj1Թ1^ÃKJދ xC(^]f*J}cܴU"kŻ8޻^˧X"O}ٖH^#RUc Ÿ.R>9fOkG] ;)%S#r絠^'·&#U{L ;$oO}V3U8uݬKoQaD%NPcDlg1"3riV"'WK271oC^ r/7A1KwIx% sEC0MGkNjcMI)sHAyL[cYҥFO $PbY 9S3BP#x_(&6Hx\?"T<<׿ \O#Ѐpɻxb&>`\`)'ӭBQGlƍ,1)A4OKMzz.}&Ɩ[@ }Ng*riƄ^;agϒ~HʯxcP0 &=.Ԇ_=Ƹ)?'_V(r>`1^a)9nګtqbv̛< 5ᕪE JJ3hvaOZY4G 2H͈90^A+dGrL-J͆ d_K5]&Jr!{qz5c4zp3#RIVT!xcc;#_G1󆃊b{_01_?c dWGLq) &aŇ`"Yd40NA'. :(Db7)*\1Hy/?l"L &3v,&`,-25%.* YJ1Aʹgq+1Ď39ҿTM&:1 p1kM'۫0?#g:8;}=ٍ߫Bߥ5q<,׫_Vn>xmree@/@DCL&Q&Q4)} r `aZRńR"0o/qf4/ TJGVߧ0̉,ML :J,cHkPJc)"Š&xlMOaT# 0a0!H0tN4ĄF.)aՎt!ŵ7п5hUNE2c {f#0&gU/[\V)Ƒz)ƾ~Au-Ƭ5)%2O2`oص~bv@'/iCϗsݲPUL^Ս/K0aQr'LZ~&Qv &Yuٻ/)0H`Ϩ0Ƴ/Zb<?Gc‡+b/`WHx00S-7ĊgW]12 71ҬKST1y&3{J3Wi1)@ P`LF8v KVX#.LHFX&v\Nwb3 &أ嬎I~7w-#ńY^9la &iɏ5}AbLo4p9B[T U秬XJO^Q ycWJva6?d1*7x~dev+ب+~/o1k_c2G0=KuD|M_;饦/sw-$a6WO"7/_ɼhy;1ɐr9;QQ&8&NFY$]=nI$zIIW-܃R~`d/F;t_(oyF`z|óI &2ݡ 92tɠDL6WmI"&Z}Dw;Kt -lG6Z51!Y 1ۊ1>C݁ԏtcG7b' ;Eβ2&3.Qͱ}&<ԍ)loƅ7yvm-L-Gr>d׿:tD6/9D_Iٙ=}DSr_5{?M$nMZ?7c |fMlY("t>ʵ24r!sfm-D\؋yBeMoq46:Gz>>rpzj7+,LS_- zR񁞾nwmXr6T!3+Y.>g'\0O&x7FAç2' $E 9˦НdQKaOz m~%BFV-n~v .kn{C_Des]f ="YSms{f==\Q[F]Oo_D71=ٍw{Ĭht nyB\D 'U~ tuAW+XR t-d&tːn5Nj@ǣeЩK%Uw+ͳ/SW4 kOZHN]_sCwVM e6#-tet})ƦuNF.tƓi3CaI|!J:3&|TP&KSu tJ%(nmg?9#\20Gz;hgT0g>_FzF6BDvv%Shl659u:h(Jihmk=3䷡b9q>Aܹ;!:ƫ2C'_b`損(S&cԠC`-$tJzGYMV@[ih `"vfᙟ~;nȲK/ ȍX9MU@#QPzjwG]' vwteO fU+e1uj' ~~ !wh!\M,*4-lg+]YՒC@ -g\7Mh\+hɟoC4Z:Yo5BC'Zhy 5GM@~χ_ЪaiiHn-MĨM@uJtlD#+AeCYVd _|6^*>B_2NCqm}Vw x@?2Bn{b?&GGQY`x\QYxQmglo*7ڰb(T8F>lOʙsS[ܴ!6P9ă5E{l5PY]ݚ:\0y6jqe.DM"Jz`^"O캚?I|C55O=o[ZC?#TxYS:Հ*}YĞE+2ﶦQwYTa73P-FT}!r^U^○.im/PUtJTmt?5԰g(]Oj*Trp=%-PmqT:?^r1=pBrW_CC)s1@Օ YEm%:zϵ]@me7Vrdro7m ,):f&f R)N>Jo,ޱLCG~J*?.:;7:?xPwʨ?6(Y:{(Jռmr}_oE]gP.O+~b>.jQ& 0G]d5bQ9>%5ڕ^籋J.uWNk켉 8 Uٱ/+ S:u/.G#}=suJ~izRw]wPO7ԷhC|8/zuZ,6QC}QE(KcɁz>c+zŝFU{`X¡M"Իa6]PFL P^Me.ӭMPz5\E}U2<.è #%;r%l>Y[L7hsMPuU[9"*؋e ͉+|OQwè&]TUќ@ VDEP̸PJm4R8=5ob_Yj~Vi^Gu Pe1,nUlVCy5/DI_PY_JTj'rz$껂#4ye_wf1v5 :фa6psэ8}5lC]˦I.;\J~|9y 历 B9;' QyP=fT.YˈJs?HHz4y<2׼p̉ @UtWIEwgQ SL3wozn*)yjOQWŐH;' ve]>b2ԋb>DĨmP|!jbvJ社<J@z Сp|{@$(܂XBRCܣE0cѝ?kV݄0GB!F וc(~2qr󸉜nTE+_ࣀ;##SKǡPRsE@tlqK=J+2TZ?!ݗB2]ԥ/33C^IYI&䓏Lކ/ V$hwNqٗ+@*=p0GPyeKJά2C=1~/i.eEh^θԯz ]wf yˍ]Ks:u/NBZ,qS-7t vA~%h#n{]i22A{L*tfHu'@GٹZ߀N3*Agi&?}Î've<Ya=IEks:i}HoUzK:#-]7an QdyBPs`f5S`DA\WyQShOj޳qyJ E[|'Q뤢8Gr ݅PwQB.jaQ 9i '9CP-v :* F5 b+*P1 wJPG^Nw+M=)|sF :gwEcIB*mWNOB%) l] /JW_B.k|r]za =9QOFDq".Zag9Tu U{Z\Uz 9QTʡpg_a(vCi l-kyCv¢*9:*{PycQ6q.=qg(όry Pn>ko%~ ePQWG97#FdPv2MdO 'PΗ%B(09vzLS((Udx'Tpc w/u'{"M:3rǣ<Zy!Tѽ걂hRUdQgJfMCT#ϛx.CTCj S 3oC(7X=y*U~n:C(M[qz8K6It?-|ƙQKh14Z;T=^W۟Av}HW ʕ^[ɿ*@EPk/^J&Ji>Aê'}hZj/7BsCbyWզSrħv`:.IAy'a;hq|cqL%th 2pH Z#{ }8G>e~]kJ|g`Nx3wv<[v.݌e'3 kf@k8}}|R0@X{[U)%RxJ߾ȟ89jCmSԖsLt(ӧͅ޽&]1ڸDz,AvQٲx~DR2jkwQz=1j!͂ʨH)@mbN@rXk@ Iި;czIJ**u^6jJ'<C<59j]KƐ6j!>s1j9aM<΃ 5L-WѤ)?@-7^?Zҙ$Qs9ۨ yoeV4jx] 낺Z-ԦugxڶČlֵAnMPqt r/lɢ6 ^YTBQkkeBQjuO1xZl$]B5ZPaNs*y>nO@el6.!؍bT5/rJU5 U}nܽT'C3#rC($jz`Ya5zD{p5*?}g 7~;?Bu&PXN15 uLF5f?xLPuT]罳Nق*tA[P[&y&Tel9;ln9'3NٖaǻPý{=\G:#!|nn SEO/Dt3dg5Q7J=aH UI8&Kz/T4GTb`} *8AgcE *h=h If ܍=T(_T8t g3T#q %s wS$op>t聁* Qcs-:|83g8ʎRDEIӖ݅XC \5bu;?DO(@ &"(Mۓ(ab= WmNG=rBG;Vcb<)"&t)R[r4VvfX/߿&7M"Q[sj(FDsO?d7O=vjh+ZF}3;g$i,6 =[O=oysj%RB|BJSGH "vRX4\ЂxHMH+bӐԁ&ᐻp5C¶_Q" d"jmJtI>*qcҵb*~$BGR+YT|t/=/ ìV>2%]RG m$`z )j,LA $9oPmk;>,LP<~o5+E ӈOƓEb|COuTu{C{rks T(Mf3~Bӧd:2iX1_Sp g翎~_Y٪ӈjvfZslL}shKM1Nvd+VC[ZmENh?3֋v ޥ'}⯟נ R9hk2{:4uhTuӄ}ҙЮp){\'8<'Gd;N]2 =ɳagBoac/yŴ߸6{\A_?aH^I{3^^[WFÀYW`ȘE; jֹ`MA?0`Qp6{!_ ?7>SDmי}=/xIEd #;ט_g[-?݇>*Q&9[g;j&E:*9zS~C)"%oP7b7yye7PWE.,Soo=r)Z&$XOt_Q[۱c]*UQتtWlȃ{{ӸIwSpQQnPy Vq֐Rid 9pQQ@EѮP>W( >o[vԩ!>s6 J>K< Ͻ,7B7}6YhqEnDVRcVSOxEh+.FHFhuѦIeCwh ;S4g--'%fڠu^d`ZuZ[G[в-ˆЮͨpΰb٭ȄӘD&?gCA$Pum]}*ܶ:",?|.jO0 hw=8t;Ҟ([~w?ug1$1?Ǹ}\MK;л"&zUGlnAiSrYz:wY&z24_!t_: 0@n"~Iz B joM=)g <}RFܢqђ&b7;0Bߊ;PpSVy?v @_bWS.T_Ao/sп3_ {jѨݔ =CQ> 2|)'~*VRO^b2GQ)ZW,6/IsP[4Fd'\Ai1-^~D~c^+_L6lm=@̃U~r/ʅx`*sm!nR=$F%@d AH|JW#Pۡl0Ll/ׁ_7; QwcR*?sAPi{x{ @;w[!ODzoH設AbF^2yl5Og#>PUjn -א=3(dte )ю4Į8Jz y Byz]B(vRq' Jϕldj3"P߯|l*DO)BMYoN7Z˜޾ρʗC*x5kZ};"w9S:gN d8? {I~8J .Bk'+F/ $91˜$pf{b,'',>XahN8Cnp ּ7M7-ԏZhaj*zG-;<>3z.ʿqAYl -H֡cR|[݂Nr.qN<7:_%6a1gqt{S@M#:LXɂPɗSkڊ3 e0uNAM*hViagP@HȢ7I~ΒL_8R9E]K=͡33|*t~N"tBש(ut> ΂%5loPA;/w#>ޱICx3zH K}R, m8VYO^ 77/X T_"ږ#-j l=WZfPK2fo>-#jy%êO^ubBw.%x- Bwazٽ*&IH'k띳nBqe==k]ס1m{T -TVJ:q!PˏG&% u,C8~s\|buK Aci4D&zW_Ppf~<J[G-4k!ӨC> ( 5f8#曉ȆMֻ|K?tu*q3OVz!q6ZzhkOvY#$"Z:)(% [S XBϚ9=(mVYBɊRX9(gTkroJv7 `X 2xYV prb$dR;WA q  6j7pMР4?ק\<'eVCy~1KA:- %?u8wrм`YI #s6*"SBEۓVjP޻ {gmjP75;>Z F)qۨ]"M.9/u+}핁:UBY?Lk]\gG,߇SQr"t u-qzadbY5 Kg qD]C N,c2 pㄡ?yW`(Y4z x&k>CU h% M^;d%(eԷ T9Jq8T,ׇ/J.c/oụ/ċ"h!6G-Bu!LS#~qb3.Yx-« 4Vq}@nSgҐ*H8&X; u:.~/<$D!%{'Qt`~LOFT!?vZsE %+y~#o͟Rۯ{ֳPb!/?rx(Gڌ%Mo֢j#w^Yh!/ - s [;h`j^dJ=BNPȓϏ=w E{g1B^kPTz0#dKYܲv/ۋgADWkrZ;lDHwVfH8-D+{RT!c"ck2/3ϬޑW1@~*f[|8Q{&#D|~ W{"/k[Dh>XP* >I^FYaNj JOxRt(Dt6bN"]rT˷`xk>|J% LI>+J:fnT}X@-5>>FU9Ƞ]Eeڭ<sjC aky:{_EM&\q5djLȞG>iHjbmcBU߷ fוA7{'{_)od[wQ@P/G*=a޼KEqtv0NO;+t o}];eAgvvB-t=lnFaЙ=]g 07C׋\;8s/)Hd.[bt%Юg!y: 䠓MjP褵0~J:r=C>w5fhgeI[c5]e#N ^^/-Z!t-τ> pwh[v0T:pFcY캏`I⺗Q`tg0N*omÒ.06zZ,+F9 G;wa_wlw6ðEE}> 4Kl}R$ St7j)jk)8 {o/mpt7 0&M[( + 9£ 5Tc U3Iv0QdHtRMהnz=_~#N#(4 'i1!ʋ-ox]5K7~%O6`܉(:0v /8 U EXam%|| }_̏1sq :?aBIx>B2Lp*8;la<󔶋LȤdk,ďM&> +{-0!{WЋڄWgԾ| yQs0[qLKfe01t턎eLrz1[肉c*e=0~[D~ZYO1`Eߩ ߞyU0Ԁ$:1.? qgk7Ȼ'k'aN_ ?uP.GZ>EVwQ7S'߯iarj I,[ZsD+]<~ى0~ D'h|Gپzli4b9˷ߺ}ĭZ-َP3I) ф%G9۹&)iFQa Ĺ: 0ސGXRk0qN V[']hW< Ʈ 7`01A$ STimd-wU L~iт&,e^`r!)Q:LO %&XRp9N"0gyoݽC[A5ܗN0SW0&lr`R1я7Fga\HX/u>-&0^mr}&.y{ٱKa,Z0eOc攚M0~JCq4 u( Π/ aBW(EwG?Jd3ck)0%:[s^V%)OotCWBL 2SߊnԇuJbDRL}+)uG=dCLFɾ.ûbv`roPL}vJԡ)cq6? s*2a9^D3 u,9Ӓ-q{$C_ƌfaK{ iܧFa| 0L.>I( _ ;B1;4m0Z qUlo'10eQ^LSg8h,[a*6b.j)I~0mƩ2S^!o̅~{ôV֗*0{(LE_鉥m%g澬>wf/r {&L]ƀFtD L8sTZDcQ]c т j9`"E~MMIH]ӽ'yazrį0-.XHSsac=6Mbd\eGIqXkF?:aj"3ӬJ!_aZ[ZԶ÷Û0Q[3G:zu[f?q=VJb`4~IPxX+ )x8Ua~0iD0,k}fwK5؉6yc$8=%<=3 PIx7(j Rd緔g&z϶'<VpFFOAz <]P\4mT[0tDk2n7CoaZЍL\R/q;1#x&׷WzOTk_:S RTvVSRWFgjU#;{d͹ K&֙þH>I#C¶\0xս :!|0b\\um)':^\6Cy`7$ W_tM@(>uL>6r_]l߉kM _VW3Jw^Q>05$nH=Muj`ҫ&XRn?c({uyH+oFkd@{C)Y)?"aÅڔ0ekL4֑s?dG&vFqy1\1;8Afx=TTщ{P Χ .hQJJrI>}cJgW7~j&K=o D0[.#K*oa!/~?^| Fd}Y8 Kٚiiڻ9-F!&r{qESԛjG,$Wo={ +r|wy C4orrfXh r|odE2UL) XL$ vE))|bΉrҰl:Q +vSv\,S>R&"\a_ޒmXN,-5se=z2;%QX漲16n˸>'NGJ SpX1;oXQ1u!~^"7WqX>%Jl^1rJN^xQ-9a9@z !>te:^'i L2l`%Xx*vjvXyu(>nΰ뗡=+7>+ '+"9;Xo ]/3ayU+h@&aQ~n6GoR:X\!ˣ):ay8q.,gh rwm\?Zo;q=թ?XaY'$-XV7 eg=!% /-)Vj/Ê_zmXvW Q[OWfJCZ$ZPd. 9ÅXEITe`eEN&VYwqg,Vl04l+wR(4dtͩ8%p1]hH/t V?E*S^e+D3r/ Mh,_5͋vXrSp_ CR`es+4g|X>b`95& j ,~Ѿ͸x[V ? QvGpKb@X4[\ *5,E42)"X6ԔHPBfW Ԍ~}wq*W!we" z?!P 5O\"pVz~i/ʸA#,hv@ 6HH1xXV4e|xywSP)X<ɩfkIB,qm. :#Z<_9?q:-ūG`)HJ&,}xs#rnyKқsbt#^[ ,xӚ&QY";.;#1:Mye$} ~]j@ph{'{@Ȍmu\ҟ"3`>:W#y ϊԥu@#[W)d hb27|? xMpeeα *u< `){?KFzt}sKUg) ,YGUANEM /!% 2̫@Z#r?ƭ|X׸7F]5!n4]zQKۊ¬5(49 ˷!@~.}{k< L &3\K:@Pf>x' KrXIPɲV䫖csZDzbnxc-X ݍg`t G ѐqw+.390o+>̋r<{B~wa1싶 ,:;mEyi(#CwXb6E3b״ְ$3Q~UX"]˔EM?;7q H ;`ᣂoN,,ؿ= IqЗq`+,T QħMvyi'~ v7O3S`aUL}QgE wގb;ո반ͪ,Jq*NwaJUXzɘV8K~+kynfiA.-<v/8GS h1s?Y؄&a!V0tǙs6,yx.x a_>,]_+nb q,,ښ<| ,?-c95`1Ӹg|&]oXp7!MG8EY!,Z\J(㭏,,&_3U B,Pի)UX-?,fXp[x9~X ,J!ѮE`irF',E4K+/UT<@o2a۳pƵ$3ج ?<)n^:z$q%ZoF= A%gɮ?]sXrbֶlf X}rO\SW3`~p̷S.GWZS\n%w`aſQX$<[h̀m `z)٫<>| =x!f$2x3\7ނyLA0G2)eŒa\l;T;jcvAF\+Q sң50k%FɫnǻanB5>[<[9-'v0bRt [<s7ers-ͫ/`.{!fbXw9gpnX}swܓq1qSJу9'}H 7lO?a6>3u~PfJ/ٿ΃ق!;̢Ǣ50]۠ 0ȭyPi0u_M }' sKIm^sƮ~ٽV0GD6߁/)f Vk5`ༀ6, i6%?oIwW@`0lQ'+y =!zI/1 ٦?cp>;<(20/WB_N;?Dai/ e^6Q~-؇C~k0IPJF*qH>;8$Ked yzUl sGB4Ooڮʥavu<tZ,6kSBٳ8O0i/^-uX^,98zjٜM 3( |~R+T;·}2X>Ir :CooKO5/`v'o?kf7JcB_¬C.sxk-E7f87<̄fU"fI`V71ju䔞Ywia&9[Wx~fR{}ѐ03z>f?qljo0r6:^?Lۨa:ʏ0,y|`oa|^dI0Mjj_:Wx~$LTX>=zzdh)IMŒ٧JA_>獙cI0Mx7zծ ޛY>Y0vZ0̨$9>'$nv[l'3?\ &ȋe) Y2gkt+}:VXjy Sլy|[0U{k:H 7O|bq͔: owN5c'[+a6EFM9\ҖZ¿2xuT%%31mR* flƥp%pX9}˸0I5֦a0!]SC7Ys}M̺쮩YD{/y+cO ɀffbl,yl*?0̹u^g=Қr]3_)ynan'70NUs\ruxёp!6 2#^mLynp'ߦ¸7#̦ZE=[ Z0. s <waoZ: pst#v4bsXuJ؄Ul^-EesMI#WJ֓\}J0E R,I52sq\=Dw_fB̌a7^b8JȤmۑn EE8颳3;ܒ| 0X8N-,B](.|o ~)2ȕ_0sGx \}pӗv/0"%(ph'%%|ٹRv0YtBu fa!L%-)AG`*KlBϱ 'P|C0+tU'zLN쁩sWW`[or4L%go+cʼ0ő  WudrL̗`y.L]5I\)4oaIr 6acwMl"؋6ݰfyMG}`3%&V S3VIUL8t-ڪxˣ+]hb,;3]|7BQxesA5/409LL:Ntb*T3G#YpRف;i[0=va}[n6bi*HLQ S{nKs905b|u@߫~ݺ SۿDf.Վ`&শ'\ܠWؿg`F7٘5M.6qc{%L?=x~ .Lx>ixwݽ8gi feۣÇ9L:LXF[faneJ 5gY.)>[0@}.r`jeJ5LSWY?{ 8 ]ku 0[Sڸc^ge4}o TW?4>MGs&H`&U!3L6YqE`$n |^ &4Zܿh&W`R}2rb`SM5|0uj;Nsʀ)ɓ9]0f/[lb|= "x|[ ~&=C]`2OhYԭzl00 ߤDf0.kݶHL* eG`bѝ~u2<~(:WfO1u/Xš5[ڃūq!`mWJM :RBj#,E2}>}Kz4`?_1i"^G#_77Â>cpCf-fl͔aCF.,;_~~EM>Bx;k ޔm4;/g;wWak7fA R.[LX|XH_\0X?Rfdbeax6;A :2bafKSXt'K(P93MX"H`Q/%ç`јPz|/Dڅŋ4aQf#K:,=pvm>3:BW Om,NBRx].BfNWc0ɻ _|r8 ,xoqA ,Hl'Eko~[,hR~So_\%Z?>b $'ף/^֏@u. @;h mƁ~2@N1i-Wݍ@;! !)grg,M?0S{@x4lˎK+'' ύU@o D!6|BݩS[l`)#;,!-> X"W@` KW"idAPN],~6 .ƜeDNٗ0`Ed=g QڝM@¾CVn.vk-pɚ!ؙW[Oe͈^XNXeu^{̲7Z x.3,?yB ˻<2U#+Om(>l3RY;߃I%!a\sVȳѱ݇գ$V2뎝҇VR8aBɶLwN4uՀ`B!:9lJUX6 ^vLKeeO_r^` Zd W;V l_nԱɻ_-)9ay/[3,[.s' -a׮?aE`!5=? V~)+t6aⰢn +2>JCTt<͉j +^,ʡa5Xy~gJAv!W\cau?˽Qa9MIX.us gT{`98.kx_/uM9wXIJʼZX8hLL*8XxH̄W% Vy埒Z^U8YK[faus-Xk~xV}`%(rUZ^WiX!93V*nҿ|UX[%gp|E,7JJ;)sX58Z_b +43> `e޿kZ'V >-UFRZ|Ñb8 _/ڕgy`Q}B+>ElN +ٟ`x؅'mZƮ< kGs۴x`uԐ3VZKW #`u`;k|laJտoh`oD ȲaB'RA ZRP#5?>ҤzcIjw=Tݭ\eX{k4R1R`MxZX;-8sc N57-WaMf7YkU7ŋ^Zؙ#1 kn7ߟ=#_76f_8FJ|lw2fields/data/world.dat.rda0000644000176200001440000003562613754255070015043 0ustar liggesusersBZh91AY&SY| '$I4Y$I$&I$I$mm`m% `orR)@QE%A *JBEJo / #_}VIH4Bf@F(y7,F4P'xД0=_'9}a9Ȅ]xH w/}ud"EI46i%?))$P 5Q3T i@@A)Q%iz56UTCAM&BUPU47S~4DM ')I[ϼU{?/?l7sey^1o%y5-6kcxuw,ИF7.8ՖMYwQbmv6n-m )MneZh L *e=۱,y6pcC-fz,DŽFMnVGCodwړc2Y7]ٓdX+[6MWf=[ޝ\xΟ |u;>|oc=ߒ^9x}'ߏ>Z3,å8'1uzS^s.|^ޚ(> q/Ӣ4~.Wo{S]N[t^ {I {ce[gEF*eT؎^C>~'<%~hMZߛUzҿ U#nMf`pxc`b* 3塌a^$~]Ӛ/`AvG_fGcCvB!uAcJ' 'ZxGbL77/M;q?>o_{g{=j( ^.:N%y7=|su#0$'޹ED]_q/҉}k|:@:[5 g޺u^nzB/D|y9@G琀{3*![|>sw_7'~DSʀ=6:omoEߺu߻bLfmRO(-"LLKJQSC70\5(fkfNmh;sc-glcJf$ZVXaz(b乑V3[[vfgfmٸvgmKnijf"AHhz,`[Nm3L:%kNI$eh6nٔ`fE@k͑f6YI,Z-juZi$7-i32n6hufIkcn-9i6F͡F"TQϻ\WR9VuQQ4PXVuT,]ըJ&BmEKE*AFƂA `訰 Zl)4 ە". (DG*dvK XK)U@Պhbn5EA" &L)R Yhk?]zkҝZAX|tW]Qk\Y\beuKkz Ϟy}Ӏ8I@4!7HiNlF,kNo#vLˆBB*2'ՈR SYJb8 l STs ha/TrES5 V=ѧhDYvHoXyjϧe; /tkgovi?_ܥȿ$_});O}Mr-_>]󸏟/|*=vl,vnj`PlMu RA'0s] l (tҧJx'<}?tϿ{c}O<杛קrpTPK RPM(v|8K'Veg%Q'9 @JRBB$UaϙbSI 3#D2гjmegGVtO4t]J$M)DTYAvZDQ`Y3r\;"˄'_'{܁%{VYٶ$q&Fj!*n$BKEi1MݚD]t=T S -*LIC+D=3H[Β͎ZQCv4D֢219ٞQe[Xavl&XیERF5N>{ףM窜C=XQ3ETjr9,(F Wɹ|3Q.^3v&6hK-|LI.QE&,Գ&Fۑt[P" )lO.v=m\**UVRΕ؁(5.ٱp.:\вarl8Ɩ3FWCȃvT"⧬=c9Eh7Q9)t;;dl˜+qjcjunDVXήlŹqaJ"cknC 2Fpbc2at)]щm7yTKg)6Qa3:3da mIT)/Hg;[FIlkuYtPvS(g{Nؔ?7/n&!!:.͍г,k*B\FسbS)Y3݇en$8"tɐys67e)%`XW;/w,jx_E؛P(J0[܂+;68bE3 !PuI//.AEhly4:wR')f*5p3vuSl.1gaUAWgUFҪ(Xa{maVM4.L8xrE^}Oj}sE.ӎ͢w*M.yy(&ZԚ !^ە¯VĪQ5FEMDn^Uݒx7q4CI  rm(BNcvWPU͇VRL r8NMۻWYb{v #]q&{3[Z!XwAʩ*gLXi싫Tzq{,WNQIgeX6k[OvӶgNw43;ApIA3iJ8),Hā2*J$B3 $J4mY[%eHTd+%,`[-lDjissέϟyylj-m!dmBF,P,-26dXS$,HR$JP&a-fVkBhQ2&BP;$σV+z[<#xQ^`<"uӜNpNq99לyu^u\;M۽>;ۻɷxoy7A߿n۝۶0zγ6 l g<5)d4-H,D[VkXS-2 [kF["5b-B!Z$k",[Z&ZbE-,iB,1!>9GY ,ɖքk-4hY2bk5&֘5MlB!m25L,& bEM Bmk5-kd&E,,[eLFMhA2M4lBk&,L +eV[A2d,DhLcrYeK- Y%eea-d,KhE$-bXHkDDMdwÿ0obj &$,!  {/CRhBiY%H &ee Y%Y֋4M6Y4M YidZ,DMd"5F d)e [BDZ(Օ+6jeSZEQX#w=Yie56*"N9'NˈQ~ZZɢH54,ZS+R/q)Ҝ] TJJ*:5XfZti4Ϝ*j*.UTTT JR} Tӿ;{ $BSJi+-fZm&IYY"B(٭miTtqr"YM,ZKE sj$)%bZƬͫbZֶVH bmXje5*98RIȊHZ(S+2BЄH 2 HHX68%0L684x "a)a Nsz77=v Ԡ6i2ʬVIĝPVSV)J[ZI~nѥ[dVڂLMY[QY&S%4Z5%i-S+?yuyniR)8$ΜG:~wĐ8~VrI\))$H'9G]W'8[++P1NQLZ𫻯`V;YI@ul츁'X97Gr&݈;;fc#pڰGXKN.n)al .Vw-bJ KUA PD뺨 µ %fmjV+ԖPJIʉEwwf&ZON%6Ef֑eIup04DP )jިYm/?<'\r,ht^{\:v龫yWpzjZ l@6 hfrIXk m9a4Cbg-Jb D:1Ed 5DD:wJmEޠMk[`+RAWYb(ijijͽOrf͵06mD6]ӵ6Im;f6vm*6ğvmj@GjmPmOzGρoO_}x|z+ 3uy/'yx//o=z޽:^]m=}(Wpxpx ۿ<7Ç Cp>8-˄_:3N8dπN1$jFkc\dཋ~$=qf-P[P-ѵKa-- Bѵ4i@.H5WBt@5Y9/hBhsϟ;ϟ8g8gIμ9 h"afeI`&aB#+*Ku%e%bp (r-F%0!4' dy9| A̴'1K)@('p#̜r((PܽǤ{|sc'ބ;BnŃlc+NŊ1dFX+,F ,Yjș3&A,5FNF{I)ైʟEB 2Q.FY99w,;48۸%By'g$0_8!`9|y",V &4!ѠК@C#W:+j4%M @TTҕj)ih(h4: ͛\Mۑ7/_oм^5%U2Pȓ-2,pdYRX;rl9מ>@G診U"eN6`& "Źi0ܣ/]bCPDTQ]ڍ(#MDH@hLn(d{O,XFfvݽwu~/8uwE/׎מ@>B߬ӰŃjO':meeE{>۾qBnØ61Y1nOnmZ>h_6;4|&"%A݈~sne;;}#gՎwmݻq۶mnP:P6)v!Jt)G@t'Gl;luv@cl]Kf>9Vw)H +r&~4 WD(#{^IO{r{Y^zg|F~~_~>>>}ca}o|<<<Q~H8G") 9ӣ9r"'!8\'PwD\ErJWAT,RLJS']E\T\wqI wEܒ*hRf*iUejIf-HjZ*ښ&ĉ"Y)M b֬+mJlBUR5T*fBVSu\$よN9#.*XUbiE6Ν6- _K|x/=== L04Ą}1{?t] hB4HT4N8NSNIlhkh,C9 (hBCCCAaG6c0f \dqP` rvVtefYeϼ_󷷳DjJC y r"FRUO"3Q;w:;;N05 HJju) BwDwS;wVo nɺm۸klB6lv ͆ǫimmhZ-ן;b/)zyr]yR622F)/yuNכ1UD_aMc:z\]mJ6ٚm1F=7W}^ޝm0Mz7u[x``-A6@6Hu-6|^ij+[>&Z7AER+ t+bu@MN Ϯ>}?}?}OԊyƉÉRIk"C#C=lL:IGGckK,㣩rQQ72,"]EyAezDi6YbmdM+;:Dekk)):bәn+;:ʜ2ˊmhf3m"TqlmtdH "h^33 CY nj;)KMYL+Y"(%"b%"[mZ +cd\罽>Qyٜ<(8ԟ&knˬtXXMJ+aɰALZ3M+sm&Li JjgmY] \Pk5K4D'.W-Y:T3ٺp%;FEenΌd4gTeF'i\d+"!i:`]A"5/d,mt𦛼y]IIZ$hu4m]%tdP3=;Dk+ʭU<]- h6ckZKc5ɡC (d1O96}|QgEuNyRi2.{$kUc[ԋd4-S ì;AgDR]x G=<>x'k3IR]&Pٱ#e,&|HT{mO/ Ht"U-nf&堸麡DHܼ"E~OUWwB\ E ".tÈ@pJr 8$8rtIܡD$N.tNq$JRڍ Ȓ;8.H)NP+S舋I ATUP+-3ZaS% ĩ2JҔU 1C[jU(pIĉI9,YZ+Tt qur*j)(iJi+5eio1۹׺vuuunW}AC S$$/|/ xƄsP2Iow §y4.lyMaJ*Fug9Y:Z9frLW+C #Ȗ^nltH0 :Mqj8 $cHB$ yy $ Aff$wyކ7"(Hfields/data/PRISMelevation.rda0000644000176200001440000242771113754255070015750 0ustar liggesusersBZh91AY&SY tQ@3ѵfXa-XMm fDDҫ4 bjleZlm0H%lcUZlV[h l͆6lQjcfT V -epګqqAtvpRJB}Q@ACСEPB%J( R$TA"(RDR*(ITBHD RPP(RP(JTU}V!B ,)Qaٌ&c0ü}̖IЃdldVڈ`-haca 5Lh2jц̙0Ģ6"ͫh ձ6TE Zd"6mQmVRFYiڬ3dJmضf!Z5m eVcMe)Ej3ccc6iemHmՂ6,6Y ַN0uY6[Qq,͔PlKYb,1mKmdٛ6 vbvA26hE 5Φ`ͬ6Yl0h1h! Vn:Lhh4hdh@=@3@ A@LM2&CCM 4ɂaMeT& 0&@IzɦCFj{QO#I$ɩ=FSڣjj&GiB)d@#@AA0h&1 4=Ga=@M MMP14Mhh $J$1h bz`E?TJ{T))M'I4==SڦQ=#5'4mMꍩO@FOSjm)Hz<LM iC dL5M#lM4d M3D&0&aizM$&FjIDfaF&53 h/C/K:zjGU\ʠߦ6ީCۄznAkDBxnj`PӸgQڧHۤ mq<+_uol[_QbkӧGSѱg)f>y ")1f$kkhPJD*9jJ7V(O{|Tj*gDskTCo'Vŧ7SD@{ww@#!ԅ)"W:8(Z6PW[gr5RwKr.f,9vhwtW9s@"R$kgU5y V{0`h X-Tr[^'o]X8#*xHd; GT>3U#XA)2"P1<2[VK%d|?0fwC̥PK P FepE gr=>dbFID@$jCv},K{5>;*D:J7h1CW6E1[ BJ(]y9P?/$IƑi A@,a}P (.{??Wm{KP艋Eѐ @(mP=ٝ 4Q^h?Ƨe邠>]kkG4%m4/@3`=P f {` ($"52J"bh"}bm\ۜۖM1FZ$ b55o\k5dCw^ zbDP`A f?栄Lo8:Z" $ 5#QT80<}6Z<<FF(EqmQח5&VChvl 5W4cU^z *+Q|=?Z6z:3A@"ID) B(ۅ3[b!AXXLNUT R[ۺ˄\/W`IDe]Py{Y6 9CUF#!$$ B[J"hc$ʶ -5՟U98kr0Q$5hEchI&5F-mcXUQmc[E Hh1-wv[j+cc'u˖Z뺷5.47wE.(b,%׏ݛrf-bj6nIo xUg.-xk`!.o?EsUy1h;X5yUlKd"7vvXElc1bLQSnnNz{VM* D$dZ?]{nxW9m[U]q wlN=0T  'B2-5!4 %) 2A"e Bh4b lL 1fQ$@BBH0&M) &10D"PdXQ"SLL2b J eiH$DJhX6Pζ B@8CE 8XW:uPUM'\"B/3U*A94Yuje]1Qlp+=~8g J"75]3 k,KhX۫,upo4ut.6]e6ÜzC o`RXm V{cWQ( {\(&LSLk -qr+1# Jtǡ*Q5*{zS1"XHudRF@ ߷|]ELEL%o?ս_4I+mr˲mrͻQam*˶èM`Xx58Q<@}NEcD{CV-TACƪ⊋ f:1mZߒJ!PtmTUqqq.>k\\\m}-O7jmF@&$}.}Q !"~a4p-?.*>NSLgli "=]z {6. uLYx^fRt!"(j&(Ԣ%\zR6تy FUKx|PU?#>FBB:4AO/xz_^~9_k1Y|%η~O Se)EiT aC'nG̮G#G#!eӊ̘0?4!zکZ@ cX#hE_500E}NQoQ6O# n}SLA=·~gݯUMS:QbV(rm`T;4DNrDթ{7{h` *,ZӺs\\Nsws}M>Vvتm`—H͹C⯛|my!眂ka:`D¨xAwdHEHr8ݳ]G/p]7oo8N;[-gP&PGШ[6C;UZ%ne2BL` xΨ' ֪;}@OGd~x@nBtn֠kyz|N-4L]TWH"aTh*pۑ#Q"љwwv%h,+kГR`DںP:-rdaMZݎT$iEC} k6+sa; "H!5^QFVEPX0J&I5E-FXD[%Dd$Yިs@=EW\K4"( 8@[|Mf#߻6ہ_"{8q}se+,st:N{[$UĄóPY-;-iT *b`c|JSA5oެjpw@!~Md|o!j=P@"pUw;n/츼^]v{gnvsDHL)e:j,m5Q$5; Ef+bAEMFKN@8Rd4*gI b9.tHȡ8Խ"~őL Q^%M"<QsuF. : 1>E/PDD4 ) ;;"v. v8Zh=y}W O"_1W!P?sBMTC=(C爙F&_"lo*V\U#ȗ~mX"شKi \G(q!"B@$D606 73yo7{ux©lו2_=3\)qȈW l#$̡Pu_6[DZ)5璸r‚4I[}Ul рSǟN+"̅Vf-^ajWj phK4yNUι{*פnG(H&J*!7b-΀\Y4 sJRA9ѹcVOzBwT$Am\hcP/[&r-{|njDNc7p xDdy4^?ZH*?ase7oz~؁$`Td EJk3Ć?y@Aj~_[;kOiUv6h(XD+CD$a#!v'ݸhs:1f`mWUΊB'wNN+Aw?mJ9 h^wãӢ,!?!\}%}Y,KY,x9t_u¯&)B` 丝a-V "HHB~4j&GM{ `u>ߋ9m`m5QQ@#"LM04J"51|mLwj0rO栏[pA{=ۦ-D̂fvWI!,m R5<ۑr]\fiI %Ym! @' Ln.ncxn7tqhxosw=S]53z=v7c.M_ }X v@(o1$et0UKD.nY4,r1K;\œ%ݝvt.K7}ֿw+#I@ /Cz)u˶0>g>d( H! D(}i*((kEʶB%Wfi:CP,t_;ezw#/v??׈<&j$A /thC& M%_lL &A0&$1k(&EDL5Nd̙!~J,&b,"jX!DCl0f4,R4b)&&PFdR؆6r۵1QH2! Hx}7 h4 jh4 "}qLTd>nq:H2J1 8USUjMH c 16QH0$I"3/8\"aD5Gd* F1^~WDz"oS@"xg=?Ľ76 E:E"U61T6gQ`qT@uy;q*~1^ ~[~>ݏu?׈t*B;~  >^V:mE :N@jT9PxPK1]njE=~>;oDY DBYEk 獵;ЛErn50Ȣܫ3;9uu.ӈb{ZTD.O; ٢l (Qxth ?GuBɂp&j+$=Kk{OV٭EHmlaE}\I)@Bϐ~ nwH^mCg4:C5Y{z Ad2; ,M6@ maE o)ZZ)ʢkp_`E/Da! 2(L1"Y +(;x+@T=m2]*<7]x {;/o5.# IaLu~OX(`!gEDW?}N+\B1PppEtP$C. }v.je04Dmj+vh*sEDwn0ŕi9,{}xgo[Ya}nÓ:s3a8\I]\ ^O]|XI }I@=iUn@,dY3h̓Q|sy_6{5[~v?k\Kh6"I]QD{Cp˲A! I{j {o䭿GY$Qz ~1w gY181f3c},-x D+LT7Ra@`%41:[t4n;Iʑiط4Q2Tl2HRR  ֧ 95[J\ztNjEO vʼ5 V/Tc*t:??QDТp<1 VQ/\'!)_?\StU-h"Q85hv}E7HI *U IkF@zXR%.w,}>9B4u-DPjgI*(I C}T*T䧡YE Tyh7 ECrR˶`&FhFC.L'NtFѠn/'4A!#Tuoa7q~/d4'ۍt|qDЬ@ ,uxJR o*mFmQQ4m"F"1`6ߌͣXh m-sj2-[ DcLoQjh黵 B}62爹+D .[iT6=]*Z"-?O*y D+({7UQbHkIN$֧]B呷.p!ѤdaC$" LE $U-:v3m6N!;o^|lE!UШ| M%BP8ONǛl҄d)]S(5jL ĒJdr4^AX(xvfo$Q ,@F$4lJ*NhCM6)Hkh@US<ʿL%kɔP4V،gde?Ddc#(tlDDA$ 3R5r?9LxޣdPg GF( L92L1 j愈4USdP fc#FFEa2d33" UM0I21%cAQޝ)$ѷfM%ΪB(&flV JA>=q;8˵dm8&& {\)b+*[cZVS`K(7S)V"ΕFDgiZ!.6q6 ,uR.2VJ'Gdkki[VzRO)}a fLRs)@i[ܢ%]d#}1Sdl:y#!/Pe,JY?aiC>&Ztӌ]ʢ9_Ojuҧ!TS54G&m}fugY}߲w>O[C{oݷ}F܈|o؄J1/Hs2&PP,@YXb!b?lj&UCgMA n* ƊJp#7E da*@) hC喵WWҼ[%$$2m df_z2G3?A BBG?.Z] Bz$J57W~ϩkߺBF+MȈs;<<NsyGc )b)b"V1#G~zOiuBNs{ܿT iBAI2jk`.j_h֫EDȌh $0B#22fe.Ï2E$RPj˒+ INxgyx񼗏+˻˻w]\CD#3C%dfj+!bEh%Ce8,"CPQE#TEJסsz[n*/ihp|Md) .245(D0rTx23c34W c%$hq0HT3+*0̢H@=dn< @Ɉ"NIZ@pUPnQ)Ag$X3*A\PCcDT644AƤZ1' E[ dFPBFLD2L+IUx:U*“ʌ YpFvDy( f񈬏RsF 獊hRDw!-?b4pڈҕg`cYu*B,%n""($sU Lc#S55G7B@2A3`JCDu2pRa(, I,@q6V$djF8, btĀB4 4!q.A2xΌfP"+21!)<8FN3gZ÷&^2uZi7ZSUU$с2SHţYY҆tIk]ٙS2`f;$3ARhM%PFtDAţPHEȍ8TpfFYQ&%L:t(ufB@o£=$(L$jM<(Meg>2f(BL3qlΕHT~`-3BPS'ۇXAEX1β='APXj C;0V'frBbc*i&+ lE$ @ PJQ DkebHf4 4o)MbIp]r 2RG vD2rbVX;t 4%"F:&H00fK(;k!MP(A>{ hfآ9Bz#Jb%lWYR~JD~dm X L#hACHES!1;.WVF}ՏjG5ٚBv5 Ti#^Pz-uZ!=oݽ{d~?ybtBBB 8Aă5BCDKg{jܢnKp+H9JI?UN8BEoVCh =WWF< k&VFcQ`ɨz(Akv+MuGv x IclK1u5jujO/yϽ/õ4{ |>P4HcɖxA|%)5Rզ-Z)kCRƏh-Y$CaY)*>ZHLd p>I<Bg5(+niU6w4I-$R 2VΕؑ0a3yrĢOgx;A3B/Z/~wG߄M--/SXt  $(Pͼ=W (i&2:Z:K{8b#)Ec){t$#EӔ(0{Y";Yte1g >hR7}^IKQmc$" 6 N3G<{A 撚X荶Aې\0 /a3?&BV|U/eOD>Lh03m#Y73 7)X53XKJGTZՁK\z<ޑx>z2xzh8bѳғd^ `Z\NvsUTufo-oN,|PujQb ``ƃZ< :g\ԭJ^v@1f! ]ذh,7ݜ~iO<4$k$b[mL`jk r^u2ZEKgKh8V; Bu%'J6&hMmwpxU;U8( /˗~on?QǏ0k4SNj{|~U#fO1z4\QZMֿV٠%X78a!qGy1ѳ=DbzQ)Fn }QbB?Su'^J[vgS=鳊_T5,´2nkyY[>5-}w}}}}}whD2ԽEh2k󜽕bՎˬut }wHu}{ҎO.>ߖ__ETؕW5U%*@r;dqbH ;W˷]'K3-_@IliL(C0l?/t6|k4Wx/n\o΋yD}Mԑi.&k48!oB>cɷ!sGVcemЉ+ tZәN5Zr75/IOGsҽ$_,ad" ٧g[Ymmmk ]]]]^飯V"LB>@z=8?|DI/C OujXbyE-mbͲEcv)6m@f$ &Ϊt+DZ4XMI"^a”XT;q8iIbyt4uW߻tiv&@ֵή]MMMMMN]^<4IS{V:!kWc93/oC52}TV1P{> B٬SF7dDJ:5}%,f|0RI=$xs. )2`$( = ^{ j X#,U#pܾ&awJV}idk?]yc-`>I%{iHlbIYs#Nb7K9g!a+[-tTOKnՖW6hqݻN-;W|{z3stvO;&'~OvlllllZllll"Du#tB[H! kT!r8Tإ g|rxImH:Qy:ѐC9g~" v^TvDZ"篽i]e!,h} גgD+J:@KV6}Ҽ.8æ]3gD(Fw[>~!=_cb@$hH$.&!׭4!ծ$[M9{6nSzjVrfnrktu`j zKD2LMBubdU$t+'SBJUcn":_WYIbE{$~ kO"]js Ƅ)(i066 llCkk-5Y@l*bT#ȾVGw54xȎwo\=MʢnͩV7%$*N#f씆_ r݋`ypW|ؗ~i[G^gYLio3>>O¿\󰉶O< :0YEG g[[[[[[[[[U.TlքVYIע2!\tXSVtH]wJ|o[k֊Xo&!9SJbF3biv q3@ [K1ob˙&;>x(1SZ;GX󤗇?/9b]EJ+KmGjR](@uT?]iqqsv]R`}u.Dv̼(6,^0ĺ%}Z\#'vvگ C:ן)Kk ?J{$ 㡎#ɘ%:tow,yϾ}=&xwWtG;ϧGfn%:[Rax)jSx6uĚ;Uv&Ϸ>dYg8yn;7Gv,",.ݥgWcGZ҅3 tzK:a)z:x4m)CĶ#{3whU(uOr~zg<\]yt).q>J%G)'tS@Ⱥ@(> ;4 nOt:|DiEm=Swq=ɟs(K{o[iMM# Z[t ,۽ j=))q޸,SmZvsϹz3iBD9 U!؅MG!B˾}:l閖, )y24S֓OI a8d&*zCMDm2ngcAyӪVhwvt:3FwzsԼ%$̍fiqZߡIuM?L+|bn8JZs;ݿӯLG5ڰu5!)g.!OnήwkDc.@tCRDjfUi9HdFxؙ3g=,lۮ4Kk`X^\ {^+[na"y_wvݵ2ע4.]/kwJB~]F^u΢~s֝7cv1o ϔ`9{'Q.g~yD_eDD㳻uz:v/& fXS1~>mvm-8ov=7]x,o?t|[Ts TRb=m]^i!f#R}$q,̸:w\Ws+-z:*y'6f> vu~㹯 dL tlq${@}>*_w;j.4ïug|w<υofP}45Jwn$!٣nLmźL*r yi$ˉVAhWbcFI!RU](v(hlHj\0a JUEPz)<:#54; sЉZ7iAC[w/@iFR0cNo(I?_g=:xq=qjMѡį uQeל{rc2y1S w++AxHth,% Pvoz?2T@H"'iLQ=%!~=ﲡ>cd+>ߌ/NOE>s6'NPf|:|#oV#:F6%a/EcIWbIpRJQIt$bA6%ӝGo]^~&ymYPoeih0'q)jFD2I",A1H& :D$LY`""cRax[RBA7smE5e2<+\D-O],'6MKwP1)B d(o},Q;[K{ivt=muLk5e RٰAzIϩb۱9ubW6)mKͯcl_;uC,2.ܥ{FÇ-֏Tjm +M(nV]^9%=IljRggT7e xK9QA gBCUAU1Rɗr1fJ7LzAV}xl.]?umß )#9ls.msν9|xo/tʑK){8tSo}3yay<= ccSn̳,Y@ñf>J.M_ Lt.j~uzwӤu>Y߰'_"Ǟ:3ݞX>dH*UL%:1 qR̖;=ӋLԼv3bː&|Y ˃W]Mn{}rی](`|XKO]!Ѐ9 ,^ecLH4}Jh b8 x.A-AG#MI4V;P4gM9ֿ-xtj[z兗B^\&ٞGVюI^+7gd\$^ qβOzcyz7tͻ+qnfkHD5nLJ>\kݳ!i(uQX{/+}a܌`VQm䭚.\(նiqR><s ldU $m&B3!E!3X[  8usDT*Ez͍d ƵqHJ6U9ߙ~mע 쯒/Suiro. . 8D4:c02Nq:lB%KMnOB>OL ui%uU.MEʒ-Q#5.TKWnݙ _X1s'7ԫ@e&3j58 4Tbښ uTܡ_2zoω9ʡ_YcWĐ/uۈ\ <U15Y1$-n͑zn|ͪzDI1#p'ʟ% As ӧ|Qj%m_>S^~Ի{s/g1Gl.)Жץzf]ŏW%.۷w]zv[m4zú^ɁEVT3\OJ%0;*)w[19GPR)*1,R .2vYgˮ9xק%ڞ0gN&7o[^?_# ewZ'\Y'{}پ`tyV0 [t:m)y<㾗gvMkn~_Ȉ}zZKw\gZq8׾=Quo}6O^hjZlԒk<']Cn?.7|i|k.5S1(O\G>QN'& F ׁ) mL\W,]A,ܕqɓ40͞!B 2ӷedW5Z%y4Td8erT m%R=;8tۏ_vc4z[-5.OgK~}'H{xu;>&,?{nQoWلGo܎/)Rjʴ~Y!cB}pkvvqBmzց}x !yE@&2`#!IF?YSar1.)BsN߮R>ݦ̕pdsMmY̳g ґ)1xEuuJ.$~#5ǰ/RO8/B(u*J1v,bAԊeԩ'e>Ӆdz^=oEES~fWM,T)fC9 n2N㑶rDA+ 4P|^Р-U%Mv6)DBHQI k%yr8+(ȜAoMJ e;XEe!*\5DKǀ-Vc'8c BqeIs+mv<{;[hyx7|-q>E-)*m~ -u!jݾuݻiީW5CI9yF4*@M0쵇A3\u]# ـpg]QRܻZ|+ .W: 1KFhE]5'bdPS~{:u.+d6'Q9r2uHl灔YVi"dףQ QU{ļ)IjsԱ:˸dݩeEN ˬk|RPFcVIgg;ʼni0Frs&PNd#4;xQ|Pi&`uimn6:\ |r`;^g&*]!pʼ"O'I[*ʨcF۩;XU#]hv>MaIYL& Y|B0cr9=^^lpnOWޔp X:cBٔ. 15rV5&:kC.z*niV,e NV44hyb MuN;* @Q B̍·jRAE'cHpzzyn{UX.bJݫtXeqĽL+dnvhŐ} hThh QK&8F X'-<۶ӟCq,33>/M#Lp+$ڦ4ɩ)nJ”3&'6)QZXO0d!c"gJc!5Ƴ2`,Dɔjd+N%pf=-za_7* cM:&'.BE#|V0bgZV@sbO^'qEluFj CS*.zEBb =Q]`̘N^豳 Ut:GE~MNX_VNkOH{%`qy32*4ˋ|+~IN]uɩvɩ$ōe8x2>xM X24a8.Z4F㫓 =!b(CcDHZ F6jX˪'kiIρyFqĭIKlT39^nԜ\"R"60ZgXbx+H-d zDp7ȁ&Wug#J֑b"Mr8O7̌l- 1mr.0\1a/cCFG&ڊ3+,ٺ2]O% S+ QS%eXi,y!k=%6 #ƶVZ"FTHAa<(EN),Z I]Q(@8L'՘ ?Mvi(Ʋh@%"IABa֚*02RxHHB1e:ND#=+z.5",(r52YhlK&Hb ]ؑu/n#"1] gbM 8$"Wٿ`^lM)n2P :,Fh"Bm:2Xe>-|(.EL̍4En+fFHR~XuL+ KhrIwD񛃵 F%⍎y& Ԩ]9,-]pcMX r!alU$f%weT6 S"Hį>xiI'k"t^I%U!r[$Z(,_YϨKK!;-PUV<Ʉ$ѻnkgWj\`cn&28 GW)tdpl}nBਰys, A a 6×b*`iEAALla b![䫖z0K8{S80;W%KG5:b W)4ʸ%EO9AO+ަ&d>Bi8O:H9d#a3.H)u"E2c.t,p^SFΡ#e,I'Ԃ$٬"+ S7 ]%&iy^6.qXskFsZ| P5:OSTQva ۃHIu`*(pknZIRE6 93qq=5mi9%EB-OD@Hwnw^6vA;haoxg 'V98xb|g27x6E摏>l|Ico`y\C9Q!.Јhl &hvњd{7,zUR N}]4w-ilܪzUSq<[ e_&x3L%! RX uZAv.  fHf#3;[M342Q 2<.tURkS=KpyzdM1J/μd_/3TK}m ȞAQI*[²j "oYa1:=ui,dfKILK44 drcF9rYt447SRdpBƭrU~9R9f\t!Q6Eu+Z]п91w8שW]kN㞧췼J^Ū)EܯA͸lUH2:xX“?h1ΦRՒ^'.Di{ 'XN^]-FCj=[=y7莛PF)9uyh8hxTLR ^{"!ȋ-u%. ()^Zzf}*Pv9ُԺR Pf"b |{m$xTua&ϵqg] %`A1Σ.ɠgsA,Ϊ ᙓ̃ >d4#X3dL!]v{ZKZH2*F*hVC!* rYʨ]J@Bb ܻq T1z$%Fui!|vM0V/jѥ^OW*KJV9s\ i9yήZ8"դBNڧ=fqRaÒjBhN靖8B[ ܸFf>m $i5w>9j?4d)}95-yKeΪ1#8a B ( Mʸ@C794ќT,2e ȭ7)r9;pdisՖ*L6lE3JF؇%J !o?Kk5Lv<H= ㄻ1Fˢgڲ_/!KuKۖM|K΍fÂHq's?%U)MqEjѶ323+xH].F'ئ7/F zT"p`"ܪ7aPͥy"dt%:Q}i'.PKs'&*VJM=^#v7oNraɲ͝ziMɬK zki_CksjbYӋ8/zik hPP No$$NR9VkI(YΤנ/Hç8ٲ݋R]"18c2SFTa3# MtjʵƷt,Q6jP - AZ7Ku4lhMe&  㾇y(naS,fdwžn eE՞w>:Š[42 SY8,ƒ9`|LvTUƆV9m4RQm|h/vRmMKir &N; QMp{4%Z-+IɵܫLDqra;Tv7G7 /ys 5 #6ES"Q5%!3x^;U8GPl' 7R#Wdg[Yv6HMm~.ګde,k`ݹt&Rq9ɬ;koZ !K"2xdqWV -T夐.d\YʲMCPNs6{!|3}s+Z_WN*-Nxkn Ixh5\Uty71 ̀fjՓ=Z8]5#Tp衖Z>L)ZXB"&u[I/uO\ЯEFЋ]6\٤Y72ͪ~o2g8{0U u8 \Z.V<+f(y_L/`;$Fͦ4.~\xWio7&`{NO_|vU +VK[Rqn Bc\M2Xo4;Ur^ZniM66FI'SLF_Z4]^3n BQyM<@0qܡo 1U90+ 68-nd~ĝ>f~=mBNtk:>E˶uA<.[I!I'S6ˈP ]ОXM%Mӛ)w#ɉ[rsط U:5U?)W.C&ݢ {R1Uj'y"[$7!(KMwNG_wu s" vYMjzѦBv5xY4e(a^ Z,VfWzrgҾ{uaTW;6=C\XYrIHIse6F.Mz7Q$"Q*FU=HJ>-l_!쀟`Ԝ;SJi!6馍MLE$(RS#6ZQ{4 0|*n]^KEgM͘&Cy/@ItFSf=e(vRIϐqۏ"7묁1^("5= EDLTi]eeuB+ cx" "!ºyKu04(TsrM—CvzCs=XC)XL΂ZMC>)aZ:aU'WT?`^Xm r)0Z0H;96^v؉z,ZEƣFE <&͑ٛgh k{ y7,30!ӓ m2H(q(\z._vCwjý G(Nwn=C?l])&g!_ՆB*.Uhh$jw/ E]tbh#LH##)fl*pRi ;pOفؽD߹6dzZ/NLӗKǡ!]ĬԵ ,gYQ+[擋)q4,{[l &/ah.98ƃ@[c8 >;7y!|DoQNE1uQ{dMd]Fx5o9 27A 'tRz.jUyݲA>g ii{woEfb2lvMeX>jM+TA8Y/+&23:#^U5s2_0M  *M9w~Lm0fXQb}T"F)Q _Q$qyE󭗌݆i5 ]l*{ .G8o|%3zG?V Yܤ#,gĮv5QF^/u¡Qqmq8q> ҵYpv/X.X^S]iQN_"Bq^s~kyHۅ6쏖t*^ʼnyF-a_{jVvl&!ChfڃWyVJ<r3MB=rUB ;ZZ>5n<1o4DzfBƸܰ!`6LJUlۢD]ӐC[4R@ه#Z9 r^fL(zC7=:Uz ~aAhGa_ɪH)*-A,(x g&gcY-LnOC;ăDT9XmΫ81=;k>M-B.O>6XW1s 8z4YOA`o|?5,r!<яG5? Wb8V0[p΢nQn0bYMxyi=ԏ-/p(V ǣOG7%VmLߠ߯JJ|ǖErc'U ,Dnw;M  zz}R@rG=| 滑{bB7(]әn.e'i;n mnj2 $p=u+Dl¡ v! T'9Q;ai,]Gev>R&Me-j"&q -q5 >4#!a߃AljkUvg? 7uך#gc7Z3kęM(3TĘsRg^cu^UЫ=WS5VoU<6a%Ri!̸mTQEJԹ%[Ҏchs{dj{Yf\:<rcnY0*/Cv;Nz{$ xdlsZMӯiu͸Nյ{ڎNSuBN~MQ[i_iy]L4W7]+vS-B6g-Mws,?^x `F+Y6fI5*.fѼĕVNd;M6PYV#Mp!#:\2f'!-椣l\aAg N9wed_`˞3ud1/FLK'or;ߠsb<2cT`>H+- ,ħq;I^C7/[-~.Q>f恏xh~<<\/W6]FEyEU_gu72g Ư=KT\:vϔQkmY3=:)- -]mm.tc? V>fuqqׇ=}Dʼv Vw:{)x͍ѪTt#;{ LLZJf6H*r*ݹP +)ecm%'ѵڶLf5nX{t)8RZGU%|4sPk]֧wcc6?lkܸLq]oӃj<3NXqLOo2_v5N XHj]~ 7&+fM/G~V8?|c=ub;Q.>ZOj򼦷P9эßCYӼ7tE>AKJbů=sߊOQUz AK#Qghvy$l<%QwtW=ek\#ܯWgt膋үN Cq^yczna@Wf+=I{ނ\ֲ]Nގ+*4em.?ͱݴf'<;);7 qglnd6ͽtz&JX^@x|WXoi5{}FnqK{τ=Jϧ ]N%-|| ]w]е쇗oo(\y Ҳ⊣kRVp:~Qm!xNj5B|VRp*s%Г}MS{I9l;w\$+/G]S#4@ 9Hƈa? WH-J=Mw&c$cӎ66rݐl%֒u,Lp\k=TЧW(ؙ|L~ -+_ZFr= j@'}d[ 'ne W0g-se qlW_Q63/O{jOkio9jG.'v{ؽ4,u%YHJ#Tb0Nb%_ovjJB16J-껯9>WFyʐΝ~ waTzz >]}ShKxh/}(&EGZh߁yt3FGke<))kD.V1d73߽̌;Ψ3ϵ{sܑuW]f-ݣ&M$.%BQsF$Jp~(tsʥoC9ۅVOHX"\QӪG׿(+TvWI/$NuG8Kqr}5!:D]m⥛.\&ASKyL R(l#g~ǭE b[K[Ku۫;`GD"jB9( +)z!hdRnfr{NHi]53K4Z6:J>fY2EfL ,0֐:I IJ(N8UuTDu 1Y3(fP+Ȳ&C!*(F'#L Z,@33C-Ǜ2"ܐO4>=PˁQCiW޽bd'IPFzz%<8)+N!=ZnRM^ ϰ#B #p1>H*aʮgl{8\)@TsKg6jJ`,ެ1>!_.Ɩ j]#?Esno}\,ǿݼP5Ihg3댎ʱ8r#$^X&/'>QQm}N/TtZ-'u\6م|ҸV|Ub$7]i Zm֬,ݎ$ONOi>~[`r1G`ZQJS_×wX"w)ƃobC,rӗ?d06Sd8Ssۿ 7]'m/"sQé ?L?y2]mNE&}ߞB+\)\gw9NAC J;Z}b}ێ8SEC3 _cIi"}Y1$Pݧ{ӰۦϮ+ST}׺&,p!w|ɣ2ZŐH;Q 5,0io bJNdHgRA5i$ӍSۘ=:LMώ $W<1sjˣ7|>ݪ{Hb- Q^ޠ jg}3P=bs</6Eo_3W^|uuk'x~Y2Şu_=|pddS֪exuR^Ҫ_bκW}]cGN!;eK(M|ɪ~j#+ZY̍omiv.A0 E0,"¨̓&JOνƄUDoY<:#I

6ɣhBP5rH}O_"B;TF>N:Sc!1K/wtԒm#$ىkHo^oeA' 7^Mj|g 5ο=F3wbhڟRdҔj'&Z rtKfXSwn}6}u&U?IH|nr4h_-׬,^iwGOW2n'c ?(ڬ}O~;ag v9#W__yڂ`B(ES'ҬzE80 Pd:GEVF+0B P0i' b -R,:KSL2Ĩ|]+ɗ!sӑ~vbwf$݇oRz7u9=L32 Gi b{:!U *W_7½ wao",d_p`dž5a(4^űq8)zf}c]?X! xm:ZE|Ua;*&B5b?/p)GJ+b,@r]2ox3vY5u9:ׯуϻY]S>0TL%|gwCvn_c/Dv l'wL:eWE?.2xЦ|9gP"6r>OHˇ9d&O7Y0c"1@T^%2+e (yK LR ڳo H9nM dhHDAs-w6@1]v}UzlTtAU< }&X\4q)8f[Ck.%#wԪ9dKzϺ! W2ۄ横(!cmUnI@,+?L@K׽V,02ѪG;: SARdu@U0foT*m[7 j(2uSӳe2\cU*>\ܜqI\ !pB)D>OPe +w6_kݽ |~\yZn$7-[wk:MOI_Sf:c[?B-_1'Q3J%&LA=*! \TZAM/$ru wY tIx /p"1#8ep".AH)0Xa"Z=A5,ΎO>8 p|z2-^gW?_|#+W 0KNeg4(qr%W5/Kf` &_tm BDG-S31K5*ND!*d,ē#\^c7{d+ޮdq#ȧ_w3њ?<`uH*ULR-zW)Q迂Ab Km%5h">Ȧ=2E&\P3KaYMO V_6 }P|T 0aҴ# ~P7IAE\5 i)"ϻ3*Z"56=9ebECDp1rL2- G"`sх;+/ڵNWnrXa шd>V\]=9 *zS"E@\Pup9*8yDL9sNYdH l'\*,v4"%"!)WH<6lSwkFn`"{*%K Bqd%ĒL|]35M'^`3WP&a՝7d,SwFӅUBd|(X $+/h~XNPSG& EHKg *h&H,=1ڶ6 mkF{BFHN|L=$ٙA6eiqq uBO+YHw0I0l0,‘* jv>l2EQYMΟ'%륱Dzvm=>a-` g'Mf EcJL .MkIp#S74;xt#߂@tųʙLMH[$ J+SnL-GW1hl{h#UKtY21C8uq%ʲ,%7X H4c*`:FV WTA$oHLI2(!VX8+$R-fuPB7J8睅{OG>JU/~)rWN o!I9}~Y $>s  g)"%J6` 샗K@ YfSp&f^Ŵ ܀ǰ@5V~K!~;_}O~W?߅!jJYc̝D;ڟ] `7 |"Xg5>]eG'[6JDKYgL狪 ~[vnogSc WzSCK)3MN7K]OTt4N(?S~nL$@&j_Ɠ}^z=40c.~3d wI"uNx8pvEs˂Ctx|weyuA4 M;\XR)60o(ODC-+#x7xݑǰ5>i%Oxm͗AsAB'7U'پFSKQWG(N"$">S(`OHCưl]⥨fK@HckbXI=/Tfe[@@BfIi`8) 9h>ˇDTR󡛮9[o6\7!|?C5/hes ? pv>ެY <֛oSc7D{P67pSw^jDjW2ܛ sїuxoxlU}_WӃ!>0{ַ;} [Ƴ{<;/6ZJr^(hv#o1i/NfKU ivK9U#z/\Hzj.0[KCa;c/F__N-qfG?3lj h|}dhrOsm*6py8ntA<$"籿C 9ZjmʶSF2o__e}cmnG6tdq=Nmez]3L‰ɫwVzfp =޾r'#R8뿸0x= ˒G9˯:&dЗ3>%ssӹUEj7yZ˪Nc`ބ ϓ|$VwՃK1Lmn (KrNb{z6E>*xh_/}[n?ެ١IN;)x]ݟ{Q]wx޾-Lǀ'r#LDYnr RqN e$Shm%ƁU\HbdöJ\7,J!p]{FûWtf<|EOjgAȎ=<Gj.n&^f=-5orN:AUAS0ZZ)z^hl]gi}9ԟ&ޜ4{l y>gkݎz;e|8Nqɽ>%Bv09;||Q;&y>wOg78^uqmϦFgOpmѠRQ_Rv/V" זjq} ?C'3.\C>-; /]O&0it {N~]~0_p#'̿)|l$f=|9;O^+>ޜ6t/]-; n_~5r_? 9Fc?/y_1 iDWkV{[P˛ȗև6y?jI7HTrȟEfcߦP0D'['/~x{gϔmtvnLz9i躿nDIŹ1=Ƿ= |:l=_`S}]xZBׇfMˎ8r):>^k[V/7k)J7<72[;󍗆l">%l`(k#noyvhƏwwGn U'eKmn-EYN7<_d9.|wj#&w,bB߂,vvs4g9!U*'s5x' sb5|{x`uk+[KXxܰyQƕ}t:gNxf¤Ayu/%;_n|wo| qr6<x.Ajǽ~/wV4j)+ͳO#/2D|K@cN>+_gu~mmo3ъ-{^:~j0LyY/k]Mq> մLJfi_|mdI>n6S~osH||X 8vg;Cn*@soDుP j(&c`XP 2!EC'v,<5KJI$eN $)Іx̢&REoBu^۫1^1;5\CES~o=|m}6G;=>[ωҋAkƜ- 롩VY_gYZ'krIsnq{Il5yO2Ԯۭ0%zLWk2'3l|Uѽדo֠YE7>q79ɝ!?{<ٗup\/o[ }KpAq;4{ŻeIK1hz5LbQnaSlᛆ7Bˈ8OIBW7- p Tkm'01jBf V>~zTtn]|L_^qgOG7f0@ ,)=x* GKl(W/AN&x&i7 8\g3z WN6Y1=σ vGrHɪ}w힃WF*_-M]D0 #gVSXG3jKydR7۪(t"~}xFVI3E(ZTF3œ+虑rMMV^K( @$H#&X#E!T xW{ֻ)kwRsøu̘3vJTjݓbI$cDg^=5Pb\qWY_F-IHbN}~6GmI.O]eL"i20R1Ɗ8k[^VR('c9oe59YBi(X $^:M,{(*5Ó\:8C!,&8*al9>2Lo(iz#W TSrkd+w|}+J[ūQ=-t\R9rB!H(7zъŴ>i[[1 jGPP^<}ų#)Lm*w,q;%cW˺h"Н(,_FI'fMFVA i%X*% TXVM mo၂WK82BIVkפC[&꿨D}:rHyȵcL?aJLi5+I$=G ̴ICGEH,wSßwNA&lD g1DS6sPtE<%i/.Mzr LMA5}MS 1⺱JIF.}*rQCg(0a: 8 b#@B®F&@@ra! >dQ*MѦ?z #FdRN!;ot8{x'iiqe5U43Y"3{I<qR``W& Qa9bZ L]ڜ]:C/{RSHT"D!siۋ)٩KzG?K|ѻQ.УZ'j @<. [4# (|XA_U.qFJ X&={WԷLb]dD%Ĭ9x'@j_򤪤+S|>/=uf7"/"YT䱋GgŢ|n# Ni5IfqW@*HNW2e9 Y=ݞ5ww5M2Lo آgYݎi?{2Mh5F4)INJ8Y,A 0# e.7tae[nuug\Xá9? 75kPDTozaWbG^E_5ۯZ!FGn}? |tw֊j CRAe+'44-(&{$5Gs VA$D-'i͊ZTE!j"Q2QE]"Eޚ8S=ZN^oFQͦtG$_+}N{l ŎK5iQ3"v ԗ;RR/Y+2W!|XI ^, (P=t((0QBА{7_v4m c>usCALn2B/p/ٻ!Z %2 A$IcuoK]Kߧ5gA3"'vCW4y KX̄zh1RlĄ,Є@ҹwC$ c1ūZp<U^y&?Nr[A?ExSPqg ۤHyi)ć &!C_e;@[5\CD(Esb_~?"׏[IEcoOkKϹ/TfOV{hd jU] `LVz!,r;79f_%`!"|wOfn_UvgyX&}O&ŗ:N9s`X:'c;XQYZniU+DC}|ZpEl{y{}&+eV/&u 6uaQv}tƂ'Ѽl< w~&3aܡ\Cw4;W5\绻$??YjiBv1Ns' G&@Pti$w0>+b9:ޖ:X[/}7ya5H4Cw~BSUmX>'ł2 &(=lz~o㦾(q#,pC'k_&v]isG/G;q6O}+| D{>z=+Y'i;qnxd'*y}?7wr ֗ݱH u-'Sg-xcc I䌁?OͼVjYsi͝~kZ.w{o!*"s<$zhYd ҟ+*o)y/#uR6DDc^i5Д9r}۰qsKFBcM`|+2_3h*ݡ$~^ڤO.PԆSm~j3sH_wVŻS־QV|~zwlgN+ubא-q )Z~]8wyZᑤ<q+:+g)̄/\VPj{P[6*iIzZ W Mp#xwa||}V0Fa#ɮm9{C!F@O?཭e"vzQ/~.ܫ~ :r4 \/+>_w^kldc 8IQ ӡ7{?&k_h J@|#%YvT+}t}@7ؑ>|s YHU@'$J  MPՐ->& s|UggJD"|_lwPjPE=&cx;g6t{_Og.g:Űeo"|EWF _Zv'sI * #Żb"Jʏ\:0ҮaGQq5o[5RpΚF߉7gsGyAa&w}7=σGojʸ.F1QR&NTX"!ƍBQg#D&|~:83FY%_&|uRbCF/"FV;:-peiLV%cZ'AoNH$FVo-8x h.Đq ץ!{{YiuE݈-n{)aVe3D?=ul&QdyWp0PC&ϖUk؊D/+%_yʓ Z_1_$8aXQ!҄P(`Cc)62,Dlчb+GX*O$H 54Bq*SbTVq2!ja]ӎF_+\w DJ*yy.iv/?x'E>zJ33[yECvM|c85 ։Y,J\G ^aaЈ%jrl+DSn6K!!K(D"(+& zث7DR ;%TA:4B>APu!?fF)R5:@ Tʢb9dߦŒoCDti鈲gbjj4X|G v=X+HN2- =,Y q>Xe0\KJn/m)>QaMK5</WVv%,8-"aȻۓ4 ( l_F}JEN䷉pPӂ22lUU?ZSbfG4GKVs|hSLބ>sAbu<4ckq6Tv ɹqc"׵f$j-Zpv>u}?|Y1jw[;_'ac۪DPHaRb\gݯ,hhB|?e[U#t,y/U`oW?dOiV Uc-!e :»!HQnG!N-;TqNc,eR~Z_{S>/AԣO -UxV#0@yd- UsPo8^1Zky-guqg;M7eRI73oT:*&KIp(> a1Xv9+ qPǮl5 +=4ЮKyļ j.E>GWdTs^g: _ JH/Yh.J}?ȄIoo$Di.6D:^WІ god/bQ-N[)D:MqrR4@g-H ߷V\g/LMX6Z$19@J pOS(c&["\ 0ɌDiTг8Vstob@\:XūŐ±t.GY YSIs*%\?3oW( l~62V|'ALɘ2-~i\Ȑep%|nB'drDhܣ~WcMDHe ; ?1G7&`(b DqkW.X[,_Z? .}:UE#~:M냲~7k^eOs#g5uM*PJ u,O'r'n;v_܄UaOͲXdyC6VuOL1.nlGk0H l2ĺY#%PtpѠ&I|R .,x4ao<6X(kq)VHՋw: *m6jֆqP~m_-K`z (Eo].k+8ݧC٣P:snAB:I.&|FY׬)gA#iae[/%zTVBiBkɗX֡ #}rv(pF*O~rs<{~h`d(+Y"ż{:-@&V;WQt;},қ<YvR4촛옒)xi5nB^ ISe+ 9J~C\+Jhzl0JrRcw!cS%34aaLe'^n$E^(xVY '_j*|LU; JVo'<_mj['Ν"Wto9Օ ^c&ז9($Pfo B֡틫 *4~Xݑ]Ťewt~}љ0l/f 1]~}jeLclB#ft}ОmV=x VI~(=2m S>ϝhbgeISn(,-ݪó[R}߽:M) cacrO84ٟyI)IO+Y!8ޕܤ֪B۫WVZ;A˝2Biˌ9|J8EX(T:# U7n8B4>]rVܹ=;|[QRMG t^;JFK ]!\Kp+q IW ܡ5U>GIC_jn2>iP&9DNc0k9(0o]QѺ~C:yP] D&N*gak[D5Ct4٩N󶈏ޓw2# -*ʘZUk2*(ߌ”WdPN͹5wv?xYk6Q6y1TrV J bx'io{7 pX\%D:oWd~)0!A \C.?ۮzHRіڒ&r'_&Z $0CcO m6EFb~O՛;:`0ha:rl\<< xX).ZUͻ]2v Tho6iY^/x^Uq1KctzaF}; ^ɨ!V^7Sw8̧?҉-l~Msx6_>l3I W}5!{lFŹ]GB&;'Kguumpk(U)998/*BһcKg㸻)s X{UgY>P1GP3GzhĊ_ҧ (֫,3bK5o4K D:[JN/JԭT}]~?" k-&exΌmXޠ} 6}H<n#i:]DnR&7=*"f,f5ulє 7/і~$~=^x3CX4ش=!,h)٤pFB|:OsjZzmrTLjȝ;t`bDQ/.FMBXy<̪64)U5ammw8ë Kuܬŧ76Ћ恑9ERFF^?FKsKj#! ClLl35jEY>t&22+ޖ[[Kys&-}-C#(^Ka^Qbfaj?b*0#[Sڹ[-n+#p:mu9b$;O7VWnNqUQJeP kwp5(>] {аbxǼ!<[jUBHݝ֓CPQ8|@P5pcH!2+8E*^@H4zF>&bH{4}jbrOP:⑘8 @iPO:fuQ$|zᨌ39*ӥ-~^a=Ju)EwD䥃EW}? WW_t4tlƦEXt[L).֭#Ց{ޠЭr cWSGu+SuS'и==y:LܼN>X1B٣M38(zUN6O f1[.B- +W~3^\W{-S%<9VpjԋɜqYPl"T|p)0]MA wpƊ6x9ЁҪaܵO̺ 5uoR P|OֶEcQݺmz;[ ǃz;0Η5=IqeK$fSrP펨2׿]U.vЦН>lV hztK  7blk_]O!oE;{uP4 '䡎= i>Qy}A#mfK`"뺑H\k)r,RF%]¦X-<Ŝ3=T1s5(˸M !,͕_;;W=2unbsFE 4:BqbӞϙWXa0z儗h |c UE:\ gn%65wy6+YN.]ϫha%4`c{GjCvᢎ| ƐyT"v( n߾n6'{Dt{$bc8Taz{wŹ)m錹KJ!Ǐ2ݳxD۟-ɤ3TG'K}g-YkYJ P)R^6s6NX\3UV$PS ]ȜuMYow2˧T KVьUX } nm6imgG茚^U}Lt /AIz%y!\M顎{95mqg.0)v20/c$8rZJx^]>\ʷҽ@\UKqӁG8w< ;KܘBT[_A%՗F[SF$1J?S,Os aJ6Rn?Uʔ##ر MV\k,(+Hht5YgxҐ g۱ @D_Ck3vVQK.sc334Nf^*=|i 0{n7eYS=Q03DGwnP7=)qDڙC@͆6T䢍Zϩ"x`jb3\'Q8̻=y]k2GoWH6f1A >X{=$!*( 3l PK3%#[X3DEtz&3V:'i]Fq'|ONT^#:7QCwyϴ}훂(1-C*2 `^Gdhv}_lŲ4[d|2fFHSEqv@+izh՟ZvlBRD  -l,SbH[]RmYqN?$`TVRvZ:8R* qą;""A*VmӲ-kU#3wؠ*1!ll'yڋҰQڡ.bH3̥m'$d;A39% X5eMQT'O昜N/?[q?S^Z;16>)7"C}GvPbXAIRnp+PkY:Z0+75=3BW/9Lq0#CfauugʪMܩKn\acdsPgc1/t^_l 1úB~N'xs6֪ )d⚭ڡ^%rTb:מspR2.m(]OK@ck &dg%㳹۪O2@/$1bpl QD]5̜ͷtVC%kۜ19qއF!{Er6y!z ȇ)|߶is0Ȋ7RoPc:|͟ 3v ;b6u`[RI[]H+ y#rOC*)a9jaM Ohңs7kc鬾U$10> |kIm+u0Bdlц{њ :C *:tIQ<9<~ٴञF5:̈́³8DlUzQ3`Fd&#YvI6ɁCS =3VKB\!S19d!<Z`!9N(sN^gnNGX?Y:ψhO~T48f;E1Cm=I}'K^ .oF̈6)ܽ; ġeGXsuBN2E^u?;,̥ʀўӏ#,TX$Cr!2#81c+cFfCu5JXo!P@ʬN=йQZ4J &*]zo96i[*z4nciln0)^J{‚w|!„aWBD>4DWm)Gɹ"hquXf6 ?ufxV%0v :].new콳`垗JU?YLg`S-u`F?th)7 װԚa/mռNה|1H2zZ6hnI`L)5$JtC])s쩲  f[S)GYoci\'Mf2t%M@XQ#PB |?r'^sy IEtcO|Ngh>΄,m0{&HtFL]LVbnc$|eWO"ڤi7u}._n+TdsTq$1V$dWQ-/*NN.V`¾1gIΨJ|g[VJ diպռ)2$sMZ`k".V}%#kT$4@9U1vC$񛑟7s8+5kW {9nrV)2޸DJ2쮊3Q38%^_ߵE Y.KjK5y8tn =cп~nU,ЉH@֟]-B<+I pY5J+9 I7$$tnR}80q58|i) y2w6h-3.SRBz> d0⽍87jkzLL\Dvcaku kңԒXTxWG (}:`"WQwÆ6`Zz⾤x&X;58_;6MXm4WFWE/=_8K#+h^R-'Tgg&=A9q ~zMbFT b@SC I>kEl>a&.3]nRKrp8VOw8mQ]M .,T]aby/A/"szΧwX͒M}<,#SM{9 |&6̄WBF5.M@>Dqãb]nJc+`[CT~sq:Ń)l b1}5$[Eu9ע/AIGF* 'Iܬ>~D-XÁ z?KMG9m3řv8L?g]cQ՞>6Yh`Jm1Z;9Ha H%<[\+f*6ށckMp\Heew&P_{n5UZ5t-aX>?kV}|q*jNc {e2/0/\C鄂 pv3EZ+= ,I J껬t3M"`ʞr$?ӷ9UȎeKQS z+rvfBse Lq?hM{7АueuFbJ&!2Q,{qaߌT=.dFz]Xi4X6&qZ3>ҫ /0E;r'`YTA0[gpBT(Znlf%A'ғ4єL8Q~H2&P4gS!-$7t!.|VgSc)OVЗ)ޒ Wp}){S౭[* sBRpSj`¢J\UiNݖ"j5:ԑۅ6W ],/o+"JoT&m%g,WLo'{B3ҧ-Ts: WySe9Fm4EҒ/y{ɩSd Ǒ7gHD_P{ڳ4P 'oȾ'Οu99p1>b`FI8Z 's }WngSts.ZS#{9{'F:8+Ui)::9yub ǃYDe76wY4$rm/=-o1Wbw_cddJp,4v^Z4'cs4f/VDj$ܪnY]kZs.?Ll y]=INt/ SľTh[5 Wj`ަ=\j:l15Vc'벱|^3qegUlgo } ҄%'ȔA%o0O+e $Zib Yv]nVQ,M>Zԛ׬LR|u|xylOo6)ҝ^malyz0<0x9*QN@gYȇI %]^0uxZCaK'?fxm6> PAv[z^EDo% 8>ڤDq[&0=ȡrSޯ3qdmPģ gCMvV q=92!7u_feft0T:Y'zwzS;n\3 I!#!:ObVv"<&Du~:u*9e=;boZ_o%2Ȅ2|x*r? /:!Ru0>.vþ{px,MJu1b&,cHDtE }mY|ӯ6H༣MT"4VPf  I<ނL 5Sl;P"qYNW p)9[;+lYܚ}uȭڊ5!AK cp:l1j@bfa48HzOWF\>HVkFS}ZYJ8* ͅ`bKҹ=R3$йX;]]09*z1+% Zr^Ux;5W`0\VCQ҃~ isRyFD+c2NJHX*QFfpm%_;Ӊ@)y~9 L3:DMZ Cne&QE(v_ L؃ܤlBϽGNP8)#g6|)R;OyN:/PvxMIy=Ṭ0EDkN-<;֏u_<ɨ"o[v ;)c6PA1]HURM$,P'}7CN)ߡW̖'23~tw ','O!U5meʃgmk8?\<p7+{'nȵsSb7BaC:'>kO'Ky濶=N_8yi ӑl[lL81X'ؕYxaɱN#[ڸˌ%ZZҠEOvЅ>љ־ۘW3$Vg0l/qt̄r7Z#6/g"Qs_1*TΔ] ՗}=f!X*ۚ* lA Cdٱդ{W*3:ɧyO16@hA |>uFO8]YKZ,N#r66LS9L(+%<p=c7icQQI;19]K2ՆqTF[zRҘ}f u1#K 2o:59 NT玂[m~\AeLb _a4/v[& ښw)5ᖥ[_o_ʬ@J*3b!s-3MpCzr;feK=1r2P)Fy%6RdPg|`CCF_Ž%qG1]-0TLn=.]TvĚAx7pV_WcugDuxEG8JaT0 oe$ZIkI;Ss21+-.죯iO^;I(c<%TCVa $Mq8ZK'](!` ^moYeeTQhNO?PIςvmdrpQa}e,cǝm .+a]Y?#b? ip#T̝ =VpkRuMV=z ^˩Obp*O vգ}'\%Hudn<~Y([R}+ evm%%@1w\2p75.LY?Ouލp@.’R7RJ= P:Ƒl$(nJ6|Ztd3R2BcP*+Z-_1 7=OؓY2Է400oDiӜY'uvcpho%}L o+^5W ۚB>onkc٫?6l@4=y`rظ;^~u04H_H~|󚖤eaMOVoz#OJ|%EG.N!\ dZk:v!7{ ͇NY?Vl.S hHvu`jg)xYz~ mU*aFrϾӭGBr"iE؝ޅs̭PEOmCDu+_ߦ8k N/Ihrv}ov<ֱ@E#v[*Ue.|3Qsء,wP1cO⬡bH AS" )~ۢĽlwTD}!1pvà֩ θ.mx Ce UyGA=v"@EFdJӒg|5d4*!V/oJsNFG &'AM$sh.b޷SR_:c|-]KgV{)Źe%n;95ɰqjo7c6\[G\/ `>GNZTF1n B~J?=wZkT%S,ŷ f!4츧Y fFR&:vh٣$Sk{Y*捻z^xɌ~:iV= i]^q8~)pCJ _rNOJ%XV{뮷Iq%y+Ur }m4'{,lh@qM᚟|L#m~TxUL4MQz/o=G{DGouE[ր]DH#am/:;XM*ӫyW?-n=ci*m0ĭ(E9S~^êOtx4}>a) n#@X.Z( ڹ^\cVv&]ZƏpїLݔ$ZXPQWe٢e/&lDD+0mcg< 2ApNF ν=|ta~~^̊lLVz'M=x[R .t6GnhFM;~I*u^ѣѴh 4,]=y&5W%-z|<3p!;Rl\Y>X/CPɩС]Ճ^O#i#J'.k` wMM͘.s^_w4:, xW|U'L} |4E6_|i%u:Qpio^9^6 T#+*xs?|R3;} ޣ/F!! ^d}EBgsM]}m}>GL9! *R:? w0U|=ݚ+`#*5;(rד]BH*oa+0?h攖Uts'P o]2cT|% 1wJt9#eȗr1k `3\<2o.^|kq` `+psQ=zgJ|q*h]Cy|6:*p=# O'7wOw3h/%-Ȝs>Y+'W>8[]N"&}RDrƈfjRpvErM3+ne6`Q-ހxAfmϢ?Uw߸&%Z؆nϙ_&b? t 15:Q%[qaZ,S9WA7XU$6D9(>ߒwy5Fʝ6~v]6syg\׾$Ɓ q~|Gr!x?D⼇{U#uR@#A@D9'{9_촒QN;\M/Vx7S[ h}|Ϟ9<+f~ DWgv'_`*;_SO/ʓ[WWqE/Aǥ7ݔWOFwHyC&ԓyN'DqkJ2"N ֭kNR_S+U7eh~i]ޔhzuewۜWsFIڒ>]vO~׭ yIK%KsqO]ߚd{$1f:K>۾Kj!huf g7WDe~C)O|R:qz>[?W`d?TU#tO6z/`[?j822s~q(;D7<ߛEʂG ƌ~mʲM }x?,K#z8׈(<[i]T[n$٧2!fȐM֌Ggܳԟֶ݄[^7cRQ{/{C5M4^8脕:w=Jt0{:X`GrW&dG렟]xivP#a!7%Sڭ=O52G3I%FF~RVռ,|[^ |4tOt(c}+%zX.2to8U?hȊF?=}ܶ$6E 3m7ALѬnQ W9X ~55p2A#$ ptFȈ˜w8I)8Hnԧ) 2!uVPC#) u(INƪ(IF$d+Jt5pG#CT$̿=kw'B]0MVJ*)wDpUWBiʧO>AdJ/݊k|=?okЦƘm3>>Ղ!" ,H(: $dI}jl{$< PhR!'])d@&'QG{}ƫup;),j3;1hsW+ugw3T,g(ON7*S]5VRS`#OWLT%*u85CU/y%S N*P A>8Bgz g/ '9Ug^?U|Ɗf"Rd(S$JdD! d$dBD)Jb1ĀX׳QCX\gvw:EuܗjZ$_.o[G}VZwJBMR1h*PH(BB杢-FuѬ-fآDmIMX#&-$$uD{jQSsjYӅGXJZ}#EiJnb@iT@e= ifC횅[KR\BKuPE 2lZ[-ev[-xKmj! " b,X$%!>2Moh %R;.m\fuvS HIlHIJCj%{" g%=Μr5P'Ԉ?1#H"21\IQv`ݘķ FOOaP~J_dHґ(^oL'յkiTV9$wgO>tXtSxx[ANC ;>"E $ >IPB5O;^B|1 P"*$PE5ݸ뮻nvg߫[AI kA 2k\2o 8T+ʩ%"+f?G.jsWHn[var䱱nL1,\toW>Vb'v!o:`@6YD!$e( )BA@_36H$9K(8koU'*m p7Nφ,75˒-Hnjd,j ]/GFu*MJR%5q#>rȴ"muḦ;\3 3.1[zc\v+c]\>f"&!ĚDJ4'GwARao;HEIE,wqB#k>:TM˘u9~"LdJsn$Pe:xq׳~ d[( MU)G>+)aUJ}2D(TX$6OHFʣU>M$uYekӊTahQ:aJH .>~4`Ƥ>G5fuF.msndE'$^vIj, R4`Peiʥ|E} mMiqm[[xmE(B`T5Gߔ IT?t:ZlT8R!* `_}KٵXdd!hZހAzUA4BH)<De?T¨@&KQcTSB9\7+_+r\3+qͲT/` fA * 3#w?WnncH7ro }W(5_53a&$ȓhokA]轋V^J7Wmn2#%f^-@R?(yQ,sPUUyg )YXR(e!T}Vᴒ;)Cyd B *&cd׷hqt]ۆ4nscnW'[TGp춹M_SmHu0؀}^VV;? -‘ HgUCߝ2vUh[p f?<Cr٫@RRW N_ZX5XoѤcMHe @@ b%))AJQHeEmR+MsswvK;Zs\i)lhRs-;ر H\rH}G_æ?s{/Ύ5u̢D$H"D$HYD!# B!B!B!B!@!B!B!B!B B!B!B!B!!B!B!B!B>!B!B!B! AK)"!B!B!B!!B!B!B!B4Q/b/|V|g˽?QP'&_gɆƚikywl8㐾zX}zձ}<|+ܯr+ܯrc0Xc0W^{W^{X1c1c{{1c1c{{1c1c_c,"ȏe=#øXA޸PHet"P 5  %(G+^ި$|TT el=o qL4msEssk5r,izklM$!OM۽ Y&fV՚ l"$M$+  $ E*K@e -AT/xso6.nnnnpWHr0Q@ʁk eHq5SUTEa,O4Q rnm\wtv? ~yoq@' Qu<0N6$8:[4Ąk:Aa!WB􊤹6:1(KZP^tAxq՛Oai ?(עC_ ^ LlDBduB=xV,?p! "IMbHc X!9">M7hcty"kkhAu/̠(V+K]D<|n؆aHi@wBH$obC Pe@K`@n% JPnMh&Bm|1RmݯZD)dYI@L^J\t (_z  Kt3 )7X Y DԸ*VT6^, GlHpbmS's1E+8֌6LAQ'6͉c"ZbdTmEwwNv)$rwRrttmGP, wHS 0ɦRYJKx C'7u@D/p!BeHֱ:!f"):ۗKoܭ- V)׀yaP~D "D@HupCՉVʖb ZIHI5sr.s UDBط 8_eny.pa /FKt=UE{qB"Ȍ&Uk HPVyb&%=(J@ PAL}j>V ԢW )ΖN*4wQ{2U)0G#uRPQ;<8W`D߳V mѫvBۗQku7vHp Jе\/LJ'IGT(a}S^(4EZmnj)9Z HTBf-ƒD,B$]Q-ƚ5BEcJ+4_D?GmTvϫg4^(i$ hs7"ur`z?P@(vU{1t6~#(}4/ځ5y{nYD x;2=$X2@S )Xݏ)e1L;3q3,kR! b ߷\ BHӢ f"MOc9jZ@»oج xxEaw`o_z6Vua!!i6[_Ęj4b#`l[ "`SFXh4,Pkj ,XQj6KY с1QRQcFQcLj#dj54TH&d#d 0C&! iP I "5(Bbc@c %AF1XƋch*ŭD ,ZL*Dcdآ FiA2E+h xZߦ FBP₟n+ozUTmد+ 8N"ֵmmmmmx\}Q7 -|fvQ{U[((>B RRRsFusW4Mgv+\*0ӺƧ\Ds w wwbnww\ܻq$IL.~Z = 2YX j0XJmZBsTJ6XW-uUjW۸ط v. RR;rƍ&nV$Xvum޵= d+/PHd; 7pp~{qB)OYH;">l .b~[;ت:Y~S.ckMJʏà ~?w+HE2mPd`̓DKLJd!6e&EIA dHF,cDkLc$]W6HA FXnBs9߳!x볽w]/)iu[?YZYU22, TA'ivPwP; Y Yz|ukos]۰͸6.UI0@|{#XpE: R#]n[U@{x}⫂kw6ww=_P e@ z qJPA7$"9pjޮ|[cI5JX[(ud#$lw;H)*HDuuݻCUD{<ڲ jub~:%V&2d2 l&YCR#@Vk@@ϫMſC8nyDg/y-e79"A$d$H4a$60@1=Mƨ^{+!S8X%]Ʒ,]4@ cg=;AFca#$HRTZ_1mm{Q#UܘB!%R)sVEg}Y@B = TuB:@ԨvV*J붜NNVtB}Zqn2)%%E)w]76tӻgv-:/M[ުH4NPxpGi[{{~Cm;3ݯ7 λ۸wvQ:"($#nT8 յHjopdqE9AM ]݋[_n(* 2HJ {*!t 5C0(|W@CʪsP[!=p{mLN%ڤKM [~k췹|GW;nRDϯ RP&?(4cZ I(Wi lbBF &L2I3*(fQS X̍[Q֭Q(ۙ%Ȗ7\=bˀ\J q $~._o%{(-؈7o5;,_ҡN+Q2 2k*1B?TO"CsW.;p%ډ %)-Fw[7.ˡ\4 .O_2>ڎ_l(ا'r* r)$OE*|K{f.ޣp|XGI(spP$A$FHFdv{0CiDO)B1O(D X2^8U6{5 }UP]AG^x _^߄-+{{#Qo,eӒ*T܋Vڊ$BPA_|֯FcE&EVA066>ﵷb|)ˆxzAl8OvLGȃd9?܈( n>ʏ*z` |Sa"~eAiSN``2I6(QZI !)ݪ \o!T! 5@mBHo{rqwuN˺ۂeR6&cBK\g'(w@swR;]^+oa;)EO)MTϫ .E_7}tCڔ%CΑ_JQ+*d#1Mdd~èM4hFc`i"Ib ogCRmE<.WJ2yR!ޢ.@ hHPU]:"%qOҸa0Rf4i)L.\:Gvܹn뻴mtGuܢ+\Y ǧj­]oooo>'8FF3s\˞!"ڀ#"$$@s@Ul^;E^ۘtU{~2*NY!R"{?-\L@qۃRbeK<&K`BB !$ yB"<-8:v:HA/VAu;('f:,*%x(WPGCJet"aRJu:(}޷"svQ XɩP-agHG6PG0JxDP)ɎΨSɸ'cD@yTB~(6@vV]"ۦt;p:nn d) ]Cj<Z%I7Jx%;?w( L 1dR i*THFF#X5lTh"滯D(habת)ZI1& CA%C%c B C3cC&ab4 dIH"0Cad#VjIёJmmoTZZn 5KG >x p@`0aDSyDSh>dE8@8!@b2D)E)`">Cھ8k0p0!J=ܴ ֢9Mk- )}Wj= T~Fq1g*?혧iϠf;"a", 94D"H KH[DF"f{h|NR_1CnT|ZʚSo*{v86"HB@V!ȣ*7cыlTтiJ".QBZ tQ.U<Mdљ!-EZ6 RIxEt>J}DMrD")vFH9ʞ eXus( @KT;]}*PCc6BT늨UABEEޢmUV1W͍jۚ *Ȉ>H*sQd $TFE,RR-UwwUV}OUVDzfAS"" q^Z7x#kKh½Q5xo/~^mshQDĔ(6D""U6ڽ-h7-UyIQ m"(*!""^"0%$J-D,wZ|w{s7} okb^8=6O" `q XTw"QW]܎ ۸rHn '|(0AL!@OCAOM cW+>HUN1w(|_+@C\iʄ~|ϊ6W쨋SH H r)]h'Om{_F:᱖"-uPY"2RAE@ ;D!$&,> WN6x߯v>(pB}[k\ڮk#Q$@14chֵQFhP;₼ ~#$GA: ~T. ҉VUr0CC!oύ-|x QJfcRI$AS4ȎI@Z1D߇S "**f#D(hi  4z=h.waR˿m^75WjsEcLTg, Ec)?j[`E7wr4V;Eu wut3ZV@[ BWx fb'q>X?VW]A~*"/mj1D^SU$`H,E/|RHF2HBFŽdP@lQw,\ꁞ΂G:)w`y .U )$$dDLWTSr9l5Zϔ'Bt\3>٨b`rn"抇 T J;8(%Ȥ$d߸7g?1(y؀ +XD=4T7G|@bET!\ZCꊘ?/k_2վsbʒQPXD-誯_5d!"!F0 )X^Z~Ȣ&նRmhUcTFAB!mEdD)O݋,"0I$ TDQ}(ƈqJ X T-W {b(I= 8J@ƐN"K\5꠻]PSLBL;wt`J?vT EC ` @J"W6q/4Dq< H0}PS@:uAqfͳoc1̈́*DL@\>0C=o D D\@OA ܄@H1En^ ԭ}+_eHS5.Pq[A3RzWy<(S`SnLTb^AS%dMr Pj,Q*uF~TUl*H#}]o@xF)sa  &MTUlmU,AU=`HwA'OY">؅5qW)M0q @# ٪'tp1FP@G Dm"mdɣSRRXœ %Jmh!wF(~)]\U 点ޮnnrv;ẍ>r}3YPuv7-JE^:蠮g(DdcTI) ^սd** @ݠ"ت NED[yk`%7g8 `C{o-/ne7↲wJ>r!iAU+*PH` @~N߶ھ+[VD[5r띆KزCcPuj~(p1buSBCdD }{,2-C*P@"E$XQ(f ^w+8yUo-S{zډQd"$VhWHnjꊛ-H%.kkkkk\ b ;} zUsE"v"q̼ ߙkrphwvUȻ4@1@Ax!PEDCwI DW6ZD $0 4eݸչRҍw ul`nr3s.u]7~뮡ԪCQtFKMh6BU`F\ %]WsJ./)P U >O}cDm%MĺI!R"k 7"+;/R*l^ U{F_QUC qXM-e]-_U?W{1EQDҁ BFr(-@qD-~mE$[A6(מ~ߜp:n qlG 'R̠qJ<.tB0~]V(. xPZ!Չ"r`zY(uGTՈ!Rފfg.?R9vBuz*'^! aT5p"9j" o3hBDMa4BDOZ %'W,/TDƣ&ض6_'w0L\ہ\ͅȴQQS\t򧡊*D(!@G _V:ҸA`s aPDQ `6آfddS@ @hk/iL=FI!" I$ ,8[DSQk ]d{H | Ay꣔yLS)e2g\DPCh; h)!/W4(,LlALBPQ T"EI $P.(@?8  \HPAU=h @c]QCϊ g>|@Nj H!f 9̠tT Ae?z{hX2sHNi"꠪WȉC@0] {d( `"LPC ':hG>m_9`(=i .TX HCv")U?k[os=\ںѻr\&4s\.DuE\]ptcLu vE-jҰ3c1mf2x {jo+gױmA^(l@/"U[j* i gk.qTǤHR+#I ?_C݈cuPlm`֌@63Z6X%@~ Q>آrPl10J@88*_ i\(d~uS@DE DGХ[>{šXb4@OF&`Kh$lP] 8H-^ @lPS犴;(HkJ?.ŀ|SA}D@11 Dq@_jHhӧ@V^ھ>m{^u]ݷ:pkvr墻c) [gd0J@3 D J k%" .#^Y{ |Z.'1뫁cz ER@YQPT"1$6BTC$Dp1b VRA;^+0tHHJE()ܤbkeDSo^țli3i Q5Ad@::Ps938g35=Gi % R&?]pRA+ǴQBK_TEiEĤWAnPv^۾ErAΘ5;ڄsk˝b8詋dj+ϭZ寬kr.k6V+Fկ WuRk"UQ@+MD)1Q*H<ب _@+EeAQSUFe$ @ zVmm]"Ԗ-Iz1B0RK2F&أc[Fo[MW ضڙj![ҝNJ`N6eӗWAqr㨃@JM޲+滵|ۙ{tKXoGelE!\`hbiӵEnVGDrkcHyfް@4] oV@EEը"@[ D8PhȂ4pJPLElFc(*koj&huem---6KKuiiir/P $(/3LdJ@$4y?P+EmU|x*0=]eY Q8R . @;2EX|ȚIv4*i90nvW6ѻj(F`$oܿzH~1Mڎ>'?*JCV & d@ZڀvO|D$zH/ꢇ^(RB5)z9 $P30GB#XzB giT!ajP5ɏYh(A0:4 ^ HE?Z@dDܔuA"S[$.w:QH Ql@獹ofݟsv|[Ũm@YϢ|pPX"=  uyGΗLXh4Ww$ޝf5[e PA7tkR!:Nu"Q :ΨJ5p# ! ȯ\ vjV PJ: eRD@̀R'JE=~_, Ȇ-DLR ˪*(ȩ>ⴊWUD)Z%#AiPJHD%f"1kgЃC´CUKȍݭEIQkOfAh5CPP BD7_;e󞈌,-L8U-Pu5DHz*ߠUH:ʨp !9"n(E(WYs ۰>=7dFB! P(B:x"gq\rѵ˜n`,Ջnߨ" )iDi tGEEj QRK]Ct:Ys?K9A9/A"H먜j `y@C2"}qJy誅B 08kUsrr+];'s^M?.z U9JS-{i$dz\ ϲ3\HPA ƿ -=X2("]47J NuA/%j۲H з\`lV`,A6+j{ ַk'fEq.*ᩤͷc% +{?@dʋ0I)Z?9 dF>Z*)J_߳-NVE'PI'JwߠTZI:cﵮ ŢTww&|oonvLv5nVfv!:aB œا)}PWhRoTi:Nv"Dwj*! DJZ}j; l| `˶ΆSV(^{mnJ8@h1*[˪ 0*2 ĤsGwJFݮKv ;\,np}y0 È-hwHUvzNS4M:HNߟƔByglpgE/JӸz=oT!#$Q\H˝6_~_IOkE?_C+~xY)R $K{5|P8D+{ >U; +[A0Y*k)ТAOրy矽}իTi5* jVV-|F4wq7-]89jk9mYI%FBi<<:46QR.}SaE-DzPm%C1s㮵m߈a!($)B)F"Dfm,Cx~Z  6~3N?ѿϯ:25ߖ4T} @ !B!B!B!B0^W{}~3gG^~B!B!B %E2/R_r+ܯr+ܯr+ܯr+ܯr+ܯr+ܯ{{{{{{{{{ܮW+r\W+{}*Y}B(l=Wǖ)IpwT#Hd?]+66wuEdb Y_}mHQϫyZ[y0)܂z~zrnu~=1 # 0W\L 4M#!E"#0TjhQ!2B HR Q S\j\T.] ZNtvG,lkuto?WC=D^ YB f@EϠl\W`(b zT c2[vú(WU|I!Pq}oS_wwI `Đ7r݌qZZ7TWRٓ/yO'LŇG[$Nnsp\uwp!@"BDa$B =|<:hm(J*+r̤ژ|խU 'Ψ\Ml}ܭ71@WD&C7w %sΞLFɠZ_>z=˥顥Q]pbNkFwrw\wh]ާ?j/;B#ndXB\Q@vW+er\J}e]~}_mwU|6=2$RHb1WbDlmF\6F΅cZ5bjbI֣X,Y(IcDːd&kFH#kwmbrZ+5srTrبۛb6-θaPss9\ٙ9][FخsEb6\ŴV幫tܷwhKInj惻κOUolE"L/GmgM$9+1vc #l;wnk~倒mȲFk;%9 _B=GU, LLҁ3ޛe ĤGvt62i?RgD[H 4YN@J{/KJj*fqF ȑF>eB/C5;>On(vJ]GYjcdU!$F@ n9s #3%qnú]뻻@/۷O7{o7ݷ/ym%$8&YWTTI/[U8DD6Б$HД-t][M^d>5fmLQI$a@pUJ:*z/ _3[]3:^׊ "H E{`\7@zW6BE8+PT l"!g_Vp˯~R2Gn$ڊo_?^E<؄CTQ)mm2hX$4jwniDDa %dh(fbj"Th%II"65uUPb!`5?k{yc...>W|E3q"d}ayQ"^$iD(&өK}>VcVh `ިV Õ3\W_mz J 8hK p:WPDgl{8O !$bbSIZlQhH'e$H]`*_l.W0QMSqLG-H  Q̉O2f,//._..]L~fu` @Vҽgtণ&+Fv@%:CU@έ=0W) 1$M}I61awp.h.\76!Ӫs1quuȐNv_|?wN)Bk뮚Y}:t泙={]f\ [-U̇6k?/I~<;Jg:ϖuOWz/7|XKݽr ΦsLyqu@?onvu;`5>O{@SwσP O}SS_@5>]@9yyyyu<}@G}j|?˨///.r^^^P;r'''#rrrr<ii\>>7q 08 ?>>7>>7q`q999yNNNG>>7H dY d䁒OD 2聐@d聐@2{ 292s#ww 27wr#t 2 7w@ ܀2@ndF@dnndFc0nn0c0c0l0cc3_gq޿w7 m$-:|zoWOk_ 2I%>}I(@u P"rțSuU͍+thB%j?|"P{"".[ y[ Q"Ji*T(yHҦ jQ 񝒿~ZyrI! E}on! -oo,*'pCUe)R gSq>=sޮk'{Nw~챟 0?܈~{ ,DTMԖ[q d渗v9H_WM0` їߺ1W:r NA*[Q`2;C!(Ֆڮɹȧ-7QrƖHIVo x\o[_}CEPD;$ )ZϒKPX 3\gdCņ:(4e[bI5Vؤh(}yO0 #IR$+k.FI$$AdI #!q*%P.փuFlJXػkb݇ˑ~->YN__{$@wD D:$k aV_\71\2qphJ~ߙWvHT`Wy QK%wڕ2! ʾ<+@TQKKH(ElBRI@9x7C˥Bx}6e+%2Y;\&˦~3{.ou8Aq@2B@X qۼ _گ3c11hHE Ȃb c2FD4B3C W\Y 64JH$?kHFAbX͒Z"f,UcjŷlY(IRj+hdkF,A # HiF m-8;ngm----./KwzTXOwyV=x|*c;þcp] #FIH #ʣpەq\s]sf]}܇<$+eN#Cղq;?m|*!pP DzZP4=aU=ߪ62+!$! a@ !cܐr/1-?"NP{@لr? 2'6eyÛOC{"@Z$%QJ]_BΜC^(i49$ Ü] ŢE! uBSʥ(r9DGFBHk m??8=whTƛ\*-+0$-Y K2{W5Iof8E4_V7] Ȳ,yP~l Dr"7W 3E\j)eEFuۊnD7qûQEz֋r?PWWQ$(jo\nVۀE/ yq_)-o7ۋ!#QQvj~&;36UE\|fDO*$VF R "4On;Nq^ħ)'nqB 0!&KcH $,LЍ MM Q"$bJRɱhI+@67(W*sLE_78ֶn "DS[ OYxԀF6' (D@ŀoV+lVh2KF*FML$ܨHQ BFen C!~LC!{^Ǹ8?3Q"XB %;j$KܷQAǡ{|ضmm}ߒ"dZȍcJ22HV$v߇}oXȠh_x'}ڊ#j@) qSLi4m({>6&(ۘ3wuƍ`W#w[S)\DҊ(GrРw觠|@q.Q!ȣc p~ws;]𛧟KFB HH+Ϡz |@^@z@s@ b' !PC{|`lo5==m"&jȪd *i[Z Bn]ݺ5.7.qqs1ۻ]~o児MM s|?=ϊ&QMӇGX[Ks%Gm!!$ *Ǒ6o;V3s9g3}?K4~pAzϠy/sH sd8(=~XpiIB$_wdX2 "dIjAĠ޹8 D} "Y?yC%㨏.q|yu9p<2jW:IJR2 >'Fi(kpF̌LMBF"؅)IB"$ HBbH({ F0Tb2ck6A컻ruG4G&닻wwk A% 4fDl,$AЃH#)*&3"d4(H2LQh,65sUk]5EK(4%)BoKchU2hdx| wCn{7ƒx >9DHlQSJշo_jm-FV+|h SXEFK2b%[[[ kkmmmE|ː 0g=ڿ|rހDo^$^wq2I3}UA]EXQҒ2IXb A8 bB*sltH?ȡ #FŶƊI-dKRj h*(+EchڣQ(B[~6mkLO ƣsٴC (Q[篫 H6% Rs^޿t목s見nT >mvhZ,EhSwn=0x$e`AC_6vh(BHf։D@љS{J/mP}==ΩP`;8  t? 0!FF@$2B#Ky ,hW+NtswvMDYHQI$&Sᇡ95*Z]OTt5_y\qu ñ: _$DK޿=X^h"j$m"Hg}gbO^wNc:U1; a@wg6Ik (bIk$NPf~-3?$ {av0HHRR/o狙}̥G A<$$Y5*Omz]|̮k::U=>Sy}@0B5)v;:.qH[yur8?O5R7f3'hf3nyl#SMR% ݐtYT P."R$/<ٟ "ʉ3MG6 o(֤z!@Zb )50H=`UAz̼ĪP3||5p'(DJ4h $dAK^r$չ6b6>$AjU7|@=2:a@Aa! }qC64" 3{^'`_cQx ՊiO8G47 rZݒˈPن,KdY,Kwdyu]ևʉԂ![35dOߣĊab@H%Pf GSk(lUu.`w:[oUiؠ8"DA*t37,٥ǝo_j#fQrL[unD#;hehsv"[^2 =f:졶 BƢ5V8^NRov 302B Jcj-VeEEҶljY"bR)JUBE-kp+Z&wNꈵnq@ 0$Tnnhm[bJbŵo  }נj16Hؘ4W63-'tkw]f.U]].nfi˷)sp:]zkDxZ|'5uuuu]]`=z7 >cs6ςPNwؠ dv E H$d)VcF+_OSQc.DB)DxO[e06=*"DZ+Wy-DLŊ V) 24Ќ(0TI^T[}&%1tم Ɋ68L 2omKFQݹ?\0,s_Ff,锖%<Ο5"ւZ5QF4Md6kb*w;pui*u;(-2o:9udPX" <}%%$]%%%$۷4_B_J^˚s؂ =^@xH5J4$IRx1aL}*lQ5*HSʐ st6 Ϊ@Ӎ`~Km7M-EM!W =<}+#@Fhq~_|e|~zQڍXCh0U$drR\U6+,MQs;^NlVf[ HJRHNBN̑R~PQ4T/,4TCy(BDdȑU XyDn63fs7L%Ǡ/W u"SLt‡[{b:LZdOTGO U[؁]$5lK]w]Z"bbQѢƘ`R$e@I6YP L[3]T?$H%<+I|>SX?>{!@=$ s(y8Y^X&$LF T[>;mwvs+ݹtõҮ.nTT1&CnkS-]/Kܧ\|QJe(B U=AwVW4T$!! Y`Q·|Kzz[ ODUo}o~^HQww:AjmB߉[~"@1ⰩL>7;Bsssss\gWft1DWeOWqݿ}v~cGbm3Mk%mE-mEhV(խ5(EDTjN]W$+) IB05#^"բз( ~EwKl! JN%G9mRtf)7(H2Z[ojVœ ڍhhٕ]ݠm(u$l%E4krs[!H;) 1Dl}kUӈ0&P(^bݖ&N* *1Ai A66_Ͻ2nX}="@^[AaX2ן_wjث[ cVE d FɌ[mսm*] A4VQhQ)1+TCT{3" 0U*3ϟDр[DQ!7 ;A^ ]72$/;3R x `+Q`K_\˝Xո R,x'Sz"Vi*M" WӢ=p @0Ͼ[*\׻O_Uwyѽ9OB!B!B!B!0D!B!B!B!B=B!B!B!B!01B!zW}TֶfmmmUdMd/抌Еa)Vc3f@%[1@Xl Bld(Za61S#l–Mf6B-k6Ж 5e`MLX2&k6bϝwaȠ@>(@ $Q%($!JP(HRI 4(@h PPP H( ( @$((*J(@ P J64H5Z4@6Ma`Z" Lٖjƭb[E M@-[kT!l,`+KF+lmc4&԰"S `F[4LBmQ$4j jيeae6ٳj)-Y Li ceXƊBĄ&l1 1l6مF5XMG5vY# " CMi- D"fA(D`bͬ[6Z2hmh-0fZ6`lZcKYTڍ@B($huT Mhhh&M4ѠL0M 24#@2&di`&4m&iFLjh=#&zMyAɣh ShBD i4bQL244 =@4ѠѣdF4ѦRDb4S4 2zLCIi4&i5(fɡr|p*;M2m?r?nkSh\mW#UikDQ+7UܢOԒW[gm6FIq[&ȫިZ,jHbU/UfFfj58l!Ч_$=Z6lKA [az8Ӊ6(====ڝ1R}?@ڬ6T2iaa#L"ВQ"&"-hκuTbflXYb)nUc]件eEːh6( 1;m}%o譞^⮛IzNjW,?@${%=/ZŽ!oWPNwlٶ́APE%# ٛllO y^x#ĻXr}i~KV-AV-TUẹ'{)?|96muyz+FwnrtwQʤHܵF,i6d *4m\εt%֯XdH͌l %hV4jOJS x<ٿq4%yrkG.Ӻs1 9WK[ÌJP0Hk)E*KZ̗6j#ÊC]BmJt(j*GJ'cMK ~ƐMhdbZUFlV6F6~+g#Wuz;^Oasף)_k2)FI ZBbٸ}rq "2KT~mmW[qlWg;FkE|][Cv*׬SV> Syk禾iW+s\]NFrj6wFG#F0A#t%rW.h;wu2ܹ+FBEw5r2T̝[nhVm PJN\]./k+ d[6CH..m5e# Id2bH&Te QfUPQTEi1(2bE#FRbP, )FMI"I&,Ć#W5ԡm6mM&P`.By<]vyʼnCx UnߋCmffmm] -Z$$EwX5lwbP%F6lgE̽ _RS)P:yӧN`.6z\ܝ1mΗ9\pwvwn@Fr뛩rr&ua2l[wu4r8wpJfFDR"l%u3?\W:Vf o9ʺۚ[|yZO_k66Mڹ\Wi u[~W8ֹE@btvevݹͻÝw4`͋ͣ,+bԊK(䛨"w5S5hj,j[_oU:k6hhGUu"(ڗ[m>`Wv'zŸhwҝڍk#E7co;*IW/FN2Ĺ5?R [|[wW6)#[r6!mjFۚF(I孹[E\-mɛY!*3]U/">/T~D.щ[- NBH𞎏:]}36*(ۚ s.hu.,Dnێ7w W64d%5b-&[8r[ȔU;ЕP66uhٲq8qJAEݫsuw̛SkmScQ#ڍ-$ޥ,m [ "تy i'{~I%:O$Myzu;QI:u>fBMiơ ƈ-s+LaҘ,&Z+b{WNj3ns':tE\vN%Y0]PTUR6'־`{{{==\N]m<=q򄓪CRI"s6RR2 ؍i&"(*XE bDUk_t`Î2>m ;?:̤GxNyѶ )d*7lA˘#hw\Zb[*ҤdR$A%wIjmo{PN%F،DYFѤ=b톈z3Iۖ.mwvledr;m%$wY:]_$;Yڬ_פ:z.W'HH"6H.PN'Y-NF]~[[WSj*h#H2lZ0h+wbhmf 2k65r/W,=𩙦k7C$ٳlNڮ;N8K bv_m]uR_dfߩdx/ʫe+ƨAHj b4m#BHQJ((v4 ݝ\D3.reߪվE>OT/]JEr::}$+}!tNP;VzkuSQ,h0Vm.qKqڕڇm_Uko;moQwc,WI$mv6j}*]'!We +۶q3UĜGqRUICNyyP Z m`Z-QFQ=r-ˮsh&FE\ۗmlK3*{{?uCގN3o^O|N{{{{=|_3j߶T.UFƢ),`2m%cQ&Ѵ[$RJ0ȌF-"#z˱aXsnj9sD!Nnk9wwI79EcF-;dûȹnluۮNrs%wh#F6l (1Y__t+6ڟvQ ǥj+›MN'uQX,llBHcEQmcQ[mWcq\j..}FAF?6JST ]|z?V-EQ¼r^|[^jq]is?)NAy<sڭfɱсh5&W{WS=R͚gFBWJBzϮ\ʹA%QEZ5 Q&YTQlAdQ(ІlKYmgegvʞ򓲡eTBV~z%jkFt)%٨SANNi]ܝz/S%܇^'窧Gl7}{Vlۉt2tFiz[ VTY:&Q٠x}6u{I%{=x_絵ll,E6J7ޔi؂Őf!J-$E4T|rR_v4OWSfE^:J$;l_p~ڭo}p}e6FFm k,VZ+6 ʍEIcPE|FܳkN-yUzΖ[y$צhҚ`FC1FZ+rj5ȹ'N%\볫λr1clRWSwuͣpcYw]Nmηwsn];Tj囜ṷJɀKl츗p`ۍɫo?褮T5^$l&;=Vc~y%*AmrS.R;q;j_QWmZXųfe(tR:%^b]E=N$i[ ogZvJ~Q2{p򽴞W%]Nq2ern#OѭU`"H#EFKfbaQl2c$ $VDڄFLhX54bCRc-0ыH)C  FM 5,XQ4dlXL(AF,c"$1·K.msg"؊FѨ[E4lJc!9tbN[Zqy[Uﵲ&LPhDQcH#fdB,шHhVDȾmk;̼iI+Kzy\lnqn7x>^Ԯ=Wi:;s7*>+de}_2OHê9fԳn7NmLjE6ۚ66|zO=Uvmk/ǻ)Unñ#v1(Qt<=


{C]G[ sUAHNJ|Ug=e'|͖Ԉ~_5o%*WmܫQvvܕ;_ߩJIT"5ʙh/: ᕱ3femszr'w$O?_Lq^OZkjlz>0QIpbw;mS\r~-mbcDSQ1F+(h*#IlDJQ@ b4j1QY6&*\]7+7 nnhlFwtHdmŽswv2RJJHwQswvۛ\$QȒDFisr.vܔ|}ߗ~ʕ%^FjZLb"w.Z vc"ǧxM0$Ѵ2ɲͳR1hAk3wG-YF"jr)zn H5 cjP%00lOZ/jeT E)v8dڸ3Ķ%v+ׇ*R?6vv7bQoG[<>`l[el DESDJe&,Z6(6n5u-"&;㺜Tgu؈#9͹kv؈mdʮF5sV%[ƍȻ ehbk7\B]R_+gJm|{R=1mK}_O5'ڧͩ̻7A%G;9^KhADl[HlLl5d3B3+-]i9Ѧ Nk#Ƶ";v1q-u WX۷J`<XI.m}^Qz+uz/pj3w\Ůl[ݵuը ٚڝ,:TgJNqd+WkfkjQqQH>D`56ӿ?f:#~F)@i5|FW&;յQ~ڶ吹a{ƶ1hHPBL(PhMc1hTlQę,(P0aMXƫmhJ5I@C*dSg\h0»ڮ˂&XF9%.( Ӎ ^WÕS%u)y`;xz;U÷2!ّ򋏕ꃷK?ssޣk ^%9\3ccfi"6ikj52f`d(ƠHcUd'\bnT~&Z}5`u\o?Z*~A͔7C?RK;GmAq.Rz7zѲkru2Z%T D($}QvU R/uu^C9ٯ:OJiѵN 9p96MIݷN\w\蝮W,\kBKL2ܻ}^j;?_\6%O8mʄ{D.5 cb__5NOro͂4a}B?y P>@JAm46  2bpTtJC湗xDžy84HH-dSFnoZ?S=j]_[XA!qHp{qų;lA@N(*#x~E4D _$ Y`!x@Bh(9C~L?'tWa¼ vR0Z O`$-^]#N8׋>oK^kNɓxz]8v랿 2d© e;  ,(%df-b"$ >,"X@XEg"FVȀTEfb= c#8vhqGsyyO7PLj 5R2ɕȑYaw~C,° XVYKE~.|jW}׽,PQg @݁3 BLa,8C!Ab ]QI f(+3"Y#t%!@գFe632^! Mh(w̜#A  jowS::H f3،"֎?\I謩j+bx9t$fDd C2r3@ŐX1' 1AG6b0n̈nBu0tiOa$_6! f !yYXA̢2EQ,02HBS#&e33PN 膩d f)D iX75VxWKYJobk" (CEG8BDAC%!^?{?Ut"U C<g`H!"ȢQ`(JbĎőc(lhAb9G7r5 dP lwN*-Hշ¬hʤiH(Hؔ9+!ظv,8"aׅɪ+ ,-IN ά5 XVֶ(VΖ;9uZ AT!E@c Kk;^RPJbHsf;+Z1YkblJLF:K;#!F--F+AL)"VX,  D,]5Kkm[w6PWm[2.u C02XЍHXHDUM~, "qZwy.s^9mVqN`j.ZFYJ(h[măK\0He`H G*E4]Pu!kE?^R<(c(Iz_ؐ}vE3שAl&6$@  @osr 72R&A*ti [cAxhKV PRH bXuXܩ/V@b1~ F$U>[ΔiQ$6l۪de6ҒRkHd* #IG[z(u(É0T2tv;+R6 x{hVX_-TJ:jS9b{5UVgm[=A9%Ws"fPItJ2rT9m$7S2\ci;o՞Ylǥ5BtX؁!(,I &GG}ѕ\1 D%IFD]gӭK92kGq~]ʡE_=m`[D) ʦfcL!(Xp=2 3GC4LvDEwq%c3Dҁ%ez2 1bDLZA( "ҬnD#7݄蘮\)& ]e1ﺍcɒ&hȄ,eKT 9 i  3+% eU6XP]vݾk#Mm׍~}%AʪdHY.jZFH#4 %>W^*M Ϧ AL` 9e8x#Yam8Hzof un]Kn:WD<>W[`PE(׊1$TSh1Fe3UcBXF, ȡ24 B#8_<Qvo?V=w=x횽r4 J/~|]O@v[$Ԯ2#; \ 1beZ"0aMJQCɱl!I$H1ovWKm4ؽRըxXEeVBZ7}QX)A"ā##Ώ[~r)vNM"7\l>Sp=QR/M@H-@l鼫/ut5(lZg<>7vr+x{T״Ioyia9R3)@¤IN5WrQ;LAM;sIʨbGذ[:5G ?_}߉>{L}H|)eYW\'G9cwV^!_B0HCEuJ~ViBU/iThLZ:VE?Ju+[%ip󤾆ijSs̶mu;qe!(q=gj*ebnK"i[n5Ze[j7B˩E~)||`Il"PFM9 ezI Vײ6]_`Ӿ֜ ܻ]۴z̸ۖ(\Z{9O=W'?\>4Zm`O' 5\Ca*^Ҥ#tJfy*ڥXm!^6YרJn wEpYRGXJg~V$r5WZR8Cݾ \~s䬲V ;KvXVCƿ?݇=˹njwrxiז{ӫXa]~а+xmz.ZI_8BG g;'xCp-!]zR@[SAod=/ MZ,y?۫Aq-<­6!\-NjCMVd?~""iKj O >OV[6/X`59y=˻h٫wcR\<{ړ8ԗ/LķޤxÒeUSixn>o(0 Y6,7<66zط-:ۅonGuM X[݉}Vٗ~ώenʝcgGo[LێXsj𤋧#t|f;PBwX7[9Ky] _k.]m\W];mT}|!p*%$@ -@yqG`,PĜ4f9ԏ:q,HJwjktԋ9B=4t<ɬ55 ŮZp`K=9ŵɷ©-' {zmZ ub膽צ̱rî儧[mw^^YnKD57+eǟWUv/6:qP39iܸ6`8gO5LA0L NSI "Kc%迪2~Ǿ5oJ]=~zl;G\cϷ~jffox9ڏ}x?STLϴ4(LáD; v94e(p7 Ij|QҾJrLK-yv4m&RO.p V44h tR"랭zWMW/ e7ێrwNZܑPjj і=8Lb(f++e8ﹷ߳ekHg-:ӴlL!>y+Dud黪iН۰.ƱG_LuLFr)2&kKB &>}en3Ѹ~rD DI `C%F\dRspShY#.Tn,^L) _q뮹ʽ~#xmɻ︆>h x[7hGg{}e}嗖QFaVPnr'{5ϕ f@  "mY|^Q Eti!8υ (lebV; q_).WCN^S8SϞ\Z|s>>}gߕ}UjZg|sK#s-lz^}^]և(-6&Z@U#bWXeã3i;p=i ϢLS3Kq*9O.4תdWT)*ȼu e=CNBE8ZS 2ly˹IFX;:һ{x-|IyiMϱw8/sf&ܽ>sVlDN._qUʩb3f-"tC FFɁB 7xMw׵|i\|TIl.OT\8j*Oe2hӓ}a}͗3nVΞ]{4S{g/g:iwQQ,6?͗4CìɓKZhoX8E&LKրDFCZI.qʇ-gn*8Ԃqdп☸+,̈*v׆zkЧ,W>-is[S*>7{]l.~zU#:8$y50%Ќr;A𮨑 ~I3 [>,.'Y {&+R󥐝 r 2EaU?>auw1Q`bXz}I@+C*y#÷GDwº EEDpB~V1Vune~`UB57oH8k#Ѭq)"=zg?5PLa[: l_G {[9o/,"]B}<0cQ 8X4OU2I<;RD=z,*z[TA@uwaa(Ė`"E7ؔ{׌Mqҷ~|;[O굗Im>}~L_ʫ6w DPhpNZ9E0>RQdyVO>ϲ˯^bQA/h{׶{NuCTRKA`ĭ`>zwbӗy!IA'3qqLxib}KX\8QLb&'l罌@;5] "^Ia! P ha/<=R|TOL'b3Al wc% `hJE^ 0Ԑl6&> uC:D&9 (y7G^7{g۴2ZS*V_H%f0OWU"8O2VJa秇p$ %vyO`b;UpۊkwuPD=hV%"v&nxۇGO4VX 1 2pϼ,$ʃJ8ZL˴K^z +UXrCX*pHHiM< P DrDJYB Y| al[&Hjv\O~z.0Q,I5_MQݐ}$=ZK Ǔz_ߎp{oʴ}V]};Rjk>7MLㄝjW{ [$%n+KӕP`PD!xM̭Tj`AHlRTU"lB|ՠLy ʥd!9 ܆j_è6lَkNg.%"U^/v=e驯aw^N[/=)d$ӎ~襰ϯ=^{pV2Qr;t[ur8K4A@"LďBY70m,(9KaLKjг9Kǫn_׮o_aʝxwTTCEܣK.d`噭=:azlMx".3#mRD|a"ԇNv'^gZt=Ev󞈔:p<r5OOV(/g"gvIRW) "V~b ƥu)Eu|^÷>!/U/ވTOĽw4xaLv}de!hɺOظ麫!!QhPXU| }ϧȻpcV-]KkM-[ۄ;LٻD MˢS. [EA5<;I.^ۖwQ_+/[y [t@׮u.U\Y 5 },?C=ՍM৩qwZ>Ong}s  ~_rw7!wMu3-f<8'j,5跲+o2ӝ7:sD>. fsiR_KحEv ~gp?Ú.(DB*`eMbȞ%HX5 hC"h-f1 PA#aEH9x5 ;v58?s_-%gm0~փ.b|,vLM50c~2]j.$NӜNUr3a`F@pTl3GAFOI "-&1JsNfԨ!!+ZaNW P"- -p dtW\gP1(Zc?PJ\_J(:V6GCe%3yY-9'[L (`u*$<)nZ&%K yR /zJ-7+ S56v>J;"O39yz}]b6lH.?-I8^~m'`?+f>DBy fr Ei.o+TV(yaD3]긗3 @WP4Y eq.oj%4~Vs,΃❶fZ9 H۞WQ is]*u/w\5Wvuk_a^^4c(AR&@ -'! LIA%1]Md/^[K]hWM .H!+Ы * ބH$6 IHBJ:V)|!pneFg (98`Ttle7bn9P AIĚrOR`I&cQ2.N֏q2G 4`#3n=ÎYF+*)!osěB7=M KLK" BYiܢG aq1mF ?\^<:lNz d1XhzuB -畼 e?1Ul2*sSdґd1`x77P|Xti"@sLkߞR[:y~NZ}}5A5S@;u2{Yhf"wzέu_{t²W[^R}AKSl}zyYTXn0QEƨ@6&qQ5J|$\PA &Nc]<@dUfynS+X&=} *qA%tEł)RH`R& d鷊0%q աjLL*%CRcbC#di?jDEYXq0"(fv%Z ИH]?[!n˖Ka)aHa47/$8pӝma$JP =JQb_!b-E2EV ]™@u"X& !Js ̻6el=2ê"i[n QGEcH#Eć-|8L.&õ#zp6`GR6\hl!W `o" Ml0P|`uƂ.lZ I:)D=W)_(VP3֔N8MWa YBx8i9*EVV "c ;kHJ̈e\}'a0)0Md$A+'ii6R6s54P$Y]`dn3z&+iO|OW"Fɂ YLH _vaGKy?" P,Slĭs B#80x0. J̤ǔA-&X0#f)xᮞrw6 Ȯ -/H-P*to~Gϻ}ܒ(3Vq},.FcN]`43 >UЉUC=@ &N2 3b0),!W w%!3ěz~ Ⱦѥ*Z3\Hvaj12!L Hr DAT&) .@Q(I(vo5m4_IUE34@NOK'CaEA($M XwDEʹ7$S6?/N8Fxxx{B ť\ rZDgUÓ稐CACGR[t<@CWQlGb]U93Z/Jw"1EZd4ɠCJЮ1:c0j*oB^uo&;U`^x̆W!LJQ sRXz1 pfd xFI0!ŀUi_ZO#(%<ț!(aS66Ffyu+ `ev[N' jNHIkny>*A04:)&@qӱ#Tt{|AcdJ BBJ0L%B(؁!Fst)]ÕV̔JurMk[Hq g7#7wrcݟi*K3VR&J!QR9j*5|s{.@xˢՈK6&O1v;)X8A;zL~ʽM]+F:h5$o4a*|8lkvq<طeג[xҌN+շfvܼ_5WdPH%01M8ġx<'o%sD#s#K颰@a:>$ eĨ`0a9 g=t8H4ߒLJ8].}$W> e`)xCzb&m hF!9;pyկ}S֬FSqf fibv60u\ m71*8eU llg#GdeCMusq ys(A@5A#B P"d! @nsJ%V(L"xh}9ZXį) 1J(`Ta5Gfno %CJF?% &ypHT&E۞WH A3C}I$=+z dwwX.83'b 6!:^i6E6A͌@iAZlI `+`?2e!@uy jyH13ʵu/+x5]LF= kQAL˛6Е'#Yxp} !4!4ԮTبi{_[n7ܜp0~Sa;"UD0&=u^IDXA $4m`[~a_wc*gn{,'KaG}R޸ $-9pH&.*j$ PwC>+[Qn҈laK5699U]aosHVfLk!%@@$T8_4ح}u!Y"Oۡx B׎D_g6Bo*9 қbeR8 nazQI_$y>W_14e)Nx0%1ʢWO H#7Z3E37*@NTgÇ+v<DُVG >]"7FF!&8 ln=I8eP2e~'*8 6R1i"-9 kndqsSVKl2p$Ɔ%^dq2v#ご1& {?V/֣D9OcͷȵP2Hܡ N7r-xZX[o~;Qf1T*Fu҅9hptBR. ?s\x\ lհ1(G`9h?h{y[F|g@1{y× lW?*_;YBcZV쐴thu|+˴[:NuI%*K̀ 4j#bpSr&m [kSEVwC`/4bu=og5,$ӂ{P3 ,Luk8nр!LD2 x ĵt4;ʜc AF%xX01FeQ:{!m!ZR7tPX$@ZȸcEsoeD}5H lXʕM]$}5JXkP>$njȀ@suVB%#Q渣 qu15뙊_O O&h+,8ۀ)x@xFh -@oXK;"ߑ '~'NYN# T@Lב(B#Y<͇ )]qo0$''p5FzDMse#\\kƔʀjIR8q&C]O6\ iJ]{!F[4cs^@Y$BFU F tadBRewtXsYq )C2@w6l-> :]-"%u°=Jʣ[_w)0IMvq ٝ@OK` E&).!]LWRJ{,aYَcė/em]ʚBєN6/[XݵYqYJ%j:%1L'7 9o#n(vM:bo- f>h4_cI#ynr} ad >@|ڰ}XޕZKH+%rrhe͆dE*ѼW~v2gE8GĠV 8ȶu | i0BB"f^ l>Ŵpe4So1hV}Һ8m[߸) .\!߲$ݡ9+- Qo&ਨ LnD`>LUG=i&|ͬmBj)ɎMy3*e6Gp@ Oh'f<}1fKХ\ҷ" :>ܓ* e7mT5CEpiRj}PLV ca7p2r;|@)I?+8{E0mô鶅v%T^۶eHz7roo-E<|=mF#gM1Ppa;1yZj"GI8hP5Yz;UqyX/*uãnI5vDy(w,ݧ h![ BtOK ]NJ]z_I I H a^lP) ͐!2dt5MD0X;έ7FgV˥2tk4s 7qTDFc漩B$Pqr8/'rgMZQ81,&!BbWd!" Q(`7"\I֐FL-ib/Qiܓ*HL#l¦[p$[L&ORNq>yU{bMe>%g6ocN,e&但"*NRİ A`ЉN ݔ4s&`G_tlxxuɀniC%W=óuA3&J$NAZ"%Ie1iri`x.FBϨǓкCzm Ww ؞J FCNCH6۪a޽oo<:"8QMlZ^0T Bż&0 ƒfQ5O8vY{ /)Pst  ׾>M$m#*CW,Ӌ$8 [%HTƄdX!B7cȞ}7dQ ւr@X+}TRƃd vE0ggcB|YuB&NoTe27.k*- VW4lhO.^"D/,LE$T #ӧm SM eD"b[q͊9C7BlY~6u;WL>u+Y$Jd'68"Z7UJk2h1#8.{M'Y1ɑ5"ɏ!`[76dSi SX[ qB**0UWݞ NS\PC FO|>$C b$έ!PMxKIy,ΠRP"坋! 9T1qA̩"qK<}vKʳDE{:A|Ezgr$08>J\JXK\ sWSBО = Hײц( gPlYv ҳ&&=8Q%0!vXT+,^S#$<+BkCwNAKm~ 񺧡¸ԭ>R.Wp /[ҕ1n\ jV>bAJNAĭhيL& p"8Bla]YEċ]Kw #AVZ9cԧO8.ґxgT|4<M zULb=>s{U; N pr3 # ^caŘ9M,аiK2Un}/ 'ӯ h72۽>oG;ܗ|p˓k!qܝB2d׫ pi]9tgwT2d>1>—tՃ ].x5!Ԫ*;! "ȯ(Y)W rNJZʘCT Be8"pi;j]`!RfIchgt~Fd@aNIԲ;鼧v鯮H,~B!ld4p$+DZvKua1MEO B)SɜG(*kufdƴb0ϥv5*fAbxN.Q'R>WƈG䪞ޡ@EQ_$bpb锰< ě2'X|Jr<rGӆ1_Q:7Oo6V<9^}t ~. & )P %$Dxvx]E$ ]!G]E Hy#.;6mNj/H*rXbm,c2U ]S jv}"hAJiG*0?hԊ>WkBθ HfVF2MHb4e@4d>V-]`uI#3-FwBzzSIk_;&rpZt`dWIE4lje\'Ý&g7c"Eeׂlphs2en:lSZϓp},Dirr0*,&"绻7q;S{%~0`*]m,jf,R`* 38 b yy2x-h7!edKo$d\X+cda3":!JdۗW#BGyd=Yߔi,uen+T[*K`샷}Z0Ts#(݉568xvon38ME)Hpnga,VeeCaƄv,jPkK}/@ϮuщA%w`KAr"@NVe"(FrB<%ޑ}Dj75DBd{@A+ԟ6uOreU >eyǮ&ze 'f/QP8a-ۺFs-ABT-{վp2DTL &2@Y]QFԗ̽PpY&ڏ?L;H2FLKƄ9nC6baS{"g@X-FVq]57ۡ#.1 㜢M]4 3f&IS\AkG@R?pNvy}6>L{}7oH~KWTٿ! BIR.䪰 I%)ػeiL־IGM;[Nܭ#P_ o&փ0 6Cn yXH@V\J %j#':ϔW|ʑvK/77 B׹¯={_o7'186dVj2I0 vveX;a*Wz^͎8Q) QD):CӦ3/9A3+txZ#2W-dmbwjt? *nI@c=$|J-; x /I&r$;X eb\H9ftKkI 2S#\;o \!2sjSlJ%-gw4 <^_\jo8.&q(z9`47n.c{k;ߘI1:|Xdqv72c͆4($tYW" q֔:n*^BM'N@/&+~aZ"R(Ƚd5p`פHtQ/g6lN,O]g.j3'3w/&>ʼnGy :r@ q8R`ǃ)EAIE |S P\"HHmǑJ$բɸPǂj+g,b -(.SB L!y^-V<"pyKFGHjx0զ^Nec{)Z^GV$aIÜcͱrDDZu*yջV,<̔E֟Ww`:72.Ou5$BLяWoQj{|ug$tbra *ƣǟV3s98oԍ("03BEQ7 IYkڄ L:Z8d7DS)=.ok$kZ"FUYPwJ4om yNLxU~O;j3WAws]!C<VDeȶSt3ܞRٟ M=pjZZhyw{gx#%35_5|yF8jg@ި3ɖ`tl$;lMM7HHƓq'v$Ɍ/VE0t43)N w0vMK| 59wpUՕWLk)"\ /sPwSQ˶yV6ۥir;g%[Ĵ UB34#=~cϵ?݈Tx4>+/ά.i%,ݻ3>dţn^cgvOh?ڔ;(44FGyb ;*C5UDK|W ڴ<횓 Y ݎr RɞlΟ yMLi<,-߽{.e/ m K#[zl=$!xgV v^x(;ܬtp5*h`Â[ hȢ龱Cדujpo&xI? ʏ0l` ޯ(]BB'[Bt&e.#.r3fM^7C4%t'jYF>rY3O  {XLs0U`C]ȸ븶Ȋlu = e񨈈f/ZwG & <B_a^L>*×QWǏ㸽V[D\*QXx-j|i)Ba Yfx ϐ[ɶ{mY:r @ wY8ʒƅv{(@w1z8 4AЪ`Pɘ-t6c&_%n ?1mPH*8#1yB[;)g?Fy"vKH>!B4 <hI(kќuaqIBl,E}u\A-?Gu3F Pe@'R  _.$wR؁n:%+do7 a؏ g_!sgoǜD33ϻm&cpիTJ5st-?%t-6o2%"#)ģ`>#0s'ljgZ,Y)hC9(ܬIl ?FT~)1Zɍ+F$B nˋcꖾ}劺(N@1r߂ %mWkvMa?6i(z 5YC=<#.: C49n] ͯ%0㳄f~E#~okB˻T S+8$ {-NPZQ- Ƅe D<$5:g RQ{^~=<ÊeC`(l"p;%]ߧ'z'+*UD ε[_:A"*iEIA A#~%qܬ;7/5N)Tee|ߎ9܍ojl L +OP n+!9 w~j&3OI=aDHۿ*orΥ6JaDrzr9dchcK:s"VIJH A1(@ ;J^i@.G8h9_+lr1S61a a8r Q;1Q7+^fݐP,m:d1B7})s{K"Ji>rD0'( ٧KIHORZuo ^Ѡ *D5]6|v-iC ԲVQg핸ښ.,*Z)h BT F8M*I[d 烫g1;{4.mAnф{ۼk5 6T'J7}ǂع _8^~a{BJ~Ya_Q]ǿdw']rM(2] !#q+*KwJ{ү(}SսmNZ%(ޤ+Ҩ.>+ɦ\spgO/`sED!?;c+!Tg+*ġzfBOoF> 'O-Fݜm$C>q<` ̼0 f7$x|'sC>C L8'/rQٵL {pZ}JP?maOZw[AQ8hb6i=bڈP [y\Z'β >H#9e^Yל@tkJ*-n}5")9ǩmʺL}(:!bD;jQBa͏ڎZ d0J0ɼ/6HT@p!{g <0WZV]6P}ۋHy٘Mkr{wPV`ț2C;[#pT"SA'd}-V$Mns褮/93rF8H{?;;3xJ3=~\?30f}آèE$Շ"ofݙэY`B)?'Pw%_u^,wWZvL>/:zyt2 R*pḧ́.+TL \((K+:0 kX>|k~`3ўeT8<+ËFvdv:$%5$רe[OO $]RBvW}&kѾ¬Zc4$,m-N|.o7`S4KGvш>1{m?awSr",,sj԰)gSWK~ 7E!"BDa+]ruJ~Cw0=2:冒a_@D *9sJyRUe9N#CL<Zz!swp w9e돃@>VV.R,CU'PfOR<.K$2]-r pR$Q>Kh#K€nJ-Y,5'̝@؝ Zx |.p旗6q] iR7z4R~?WI;X 78iS!~h3˺$UP5-QI_E@ :[! u%1\#!xSDo{ݾBq>M&8 &<"s8x]?/ݥbb&X4cnNsٜZrb'G|u|]c-tF:.x 9':cu&Py_7?N65W1J@npJs)S6DkYQ-QvS7[vorbζT_lN~U, vޝE]D d^ۆ)&68AhHFz/8i=}q.?~q/qSt 'z>MAia`D  ;Y6|5nx;m- #d sD8!"BLJp(p(fiS\$q}`.Î 3&/ R1*ݛ&DDDлQ , 3w;aɎpv;'^h-i\(nXMXKxYy;Ϭoޞ/;T#˴x}[L.6T"+?%RI ]s6^z߾Cr{F:4w2?:o/gu5l[{z!h|<%J6*r2~ďXlesB;0![xmkw n9Gk;ܛCoܿvdKo0ygtϺ-O #:Ŗ2aJJ["qcֆ0|ɳټaC"H`7(Ag.lp-YHɦk0!5j#>G9yԌO;yD\{UC rCP/kn {@9&׋{sB@<\]Fsa<% G؆2ǗvBqou;ո?:}IVcdzkGy~O$$gVNWa; lI`X= "tmr(:ܦPկЩk.V5 L' 4'cwݘlKRK}3𮬙9Z];pNf .P zbZgd’B-ȳ3`xn0 B{dW&B2VaVҜ\@J J?G| .1F<(b?a O0]p ^]:+t9mfCyջ0'6!<^Xy\,.ҋzҔ%:^e=Ԇ~g? [Յ7VXu4Jzbins}] QQ s?D-![huo|b VI\C7C]LUOn]My}7$7co}@Kq=}fsvܗlk9xӹ~UsGԮ5w$ͮP#k Fsd -| '##țe82Btͭ;n?7֧sEm:6tTG>+ 8mo[~{2fV{#x fzoGC3TN)SyQHQ2lR/\?w1{ 48w~r]uDQF&xst|NYK B9^s7;|Ip+Ϲ[0vڞg˹w]uyZ7d?5Dg㳠3!&'7),@($(K v(w+ 3WEGD,5APt K+gk]rL0"`p][Ee9^0Yqԧ/(kL/˦&)P5vp3V"l9}Bax'sF|%D/]o|;Fr:Sx|Ҳwwq<- **|2fqſI~P4i$o :GOz|#w_C[IGEC.>>zHZ35ϟ[iU(u~r \zTO*/GdWSEO&i`99s6^׉8a9L,dV(g(n@,S=}CKN5k 3{}TsG'ޞ-lǰ"7rro8D5iʟηP^]kcqb73&"_.ҷ1axX^5CRBD{ՖC1~ss0:?xe!iEPΰ.iF'JriyAM~>UΠ*~-Һz8싩ܱ[my~LMn5أtT^m+C5CphB`+;#l vfc!Uѩ3X[zD2MPߝE20B<+_Tg8Hb#0}OSœ)Plݘ0rۃ5ϛ,Pb׮N Ctx]g/?vܜD|b[_KmwܷuD>8k][ ݺ|$]`9ueaJ {P6ٗV'b5GZ׵!pcﻩf!q_TbB .@/aHlT^a}yIgLd>le^_p^0P@2Cԃ*HKNA!"ckWq"-*N '\6SZ${q[Az PV<[. x~>̽#w:L,7Q‹ZfbqZkHU>&T" ʴ{ٸJ.aXlH8QM,a;v LF7,OAޫ=z.be;_/[ !m/Vd03\/o'<WWS{_C(s{CK=O[|~Q<<8 L4q.0gbʷ;(1?֦2ƃO#{2{9 Z!)i{>&+J# Ml>S2L|ȩ32<ˣE h[6/N,0~EU3+=O3{Aա?>z׍c_,#*,mk'vpݚ JhsM(4X[o?9Ʀpa-|U̾E` {SOhU_2={w|7pBg^dCnO4R Yr N]( ΄W7 7WӠAS^͡5O6-~r;}L7rށRDW9}fWpx3Sayͮf 'ނ_G0-2<~C:?}?זb,QLja'ƆOu0u~I }@MW +ʺK3fh>= 7qj3jql SxW*}4/{{Oy;K쟲ct=˝ Vpx1˶{TE4Y[ lFh¹d VبqIu%Ҕ>ۦ"4e{0nr_֎>p xj 9Z)D7Ej72ީ*ݰNNS?&}Z[ʡG%]VTwފ"/ܚ0;D%sx{[:: t0D~c ZtCtϮq:o·_i:Q[]y<|V~\,~7oM:P@.'Ez3 J;|/\mL8}ƞ?65}wwaˤJu!1nl^<hB犞MW lAG/ӯ[vT?>j=IZ!9sf= }FAg7ݯ3)8ly74{ Z`$c}9px%|^G;Y(B~ࡳ <}'ox޿I_Ds=ZnR8z>j}XM܉qT1PQzI]g<7]0YQF12vEHTtEAʛL+i4L#\)G5\QsI fyOۓsv7W@v*(Z{y8dz@zDؖ/qoXv({}q3<>q >Zdf:=|vK*&^U~nz#ϋӎ_Ss’ !Wxhr"F4Rp*K>ń! I%d`#%%ym?JuUH7/mk+ Їp\& UEg ycps6_>h//x'.Eb2!m09q(GG)`.!J?l܄,TBd!^Sez垗w8_O|܈.$h7_\$>Lj`T13TXb!n~(=G؎OJӿl3r廼;q= zQCy︄FU8A5>OXA#/PçS71kL'>b'V<׷THo|7M݀]!1:>Ѿzonk"; ^_/óqo]*;|J5RZ4\u0tOV?}C'Ct67E;Z7VhRSyO`i֧@yJg" H3lK&JL^7B]8q8s+9f~d^bBkz;+բ.~֮ AS _Po/p/nh5ɒ?98P䯃O>-@%9E[m'Q75uÙ:3_|5aƣ0\]-eQj yHm/"M%d7XoEقߏZgχWK 'Ď } 5~Ą>Y!2<{8ޭP}3&iK;eު|9 ͇J>?_-/W j񏶵!ΫW-G ~eY|3&ܚ8F;"@pܧ#优ޝ3Nt[K`MA}c_ZϢ! hp&YAӱMу"|}qw|REU~[{h f0]P\Ye/j?t79da$緸˴P X[ZTMlPar"¯&[quv#.JwIK1޾Rqu zmʼn͘ۿFH0,|'$dZV>% o$QYr0~V6LXP!MPgpzRjT;MdzAa:<27pW6%ni"fN.=/(;0 ȿ4$9^My%#]ݞddh}e0׃7dd,˜qϏ?N]nP(FuG*T~ @Ǥ}lJ1m /bRnT0oLt zn?0r˴ +wIbj;ʇTBs/oU\6F5vKA 6$|Ho/ן)[q{r7yrz!vt"u { @Dē&TQ$HpWs\^꼑V kCW_n;]okn#1z) p|UK4j vS &AK-vxe^,l45][exQYs:͛ÚXU3O>ղslQG\=օ! ȩ9.>-y˜|g{/t׮ATxlsъ@JsawϽSyuVp:np&!"o?&_ Y&z]X$ZhzZ@߿;[#Kb=ܜΓx/#d" ")\Ϯ"k+ nxiچ]2'tXa!6GyT1ѥH}qO31]}ě%G'N)<HL T'Y J .Cd ׮!7e"a@y|nwG>z1[s{qCor G.qifH.'_/!MPΉȊWhbKp ]GM/n捙jFQNXKVARi-*yԶLjR_P5,~D\lsJ %y ^7\'FjزqγL=6_Q5eT|KC<0ڍSL ~H{Gّ,|%"J9~f+lMCkVQ%j+^K3% I;@8&:7ފnL(xLwvme? cNf_o 1238 C`n\$Ք9@b1Ud s<@p\w\)/*ʋeo_x:~ Cxs -H{{~NR X[yN廜\Z5i_ /  w Te;^#[37-+2>蜋j {U-*,T*\>!;JFO@4D/6O]w'kI-~VtYJ:q3 DmNjtV/Ex #wOUrR"D`S8{^*Nu?R=`ʌGއ&}"3'62\TŨ&xOS"[8~kHG$%M˭#m`%|eՑXOssymۛ<,3DU ma=\nIjB7ř C0t.|7[^}Hynp;.(8A^k Jq8&8pۀ<'0l楱_"A6F=RY$1@Vl4#`? @I: jח٥QVNΎ(~E(.QBGRIW]9M#+LIibW T9?~H5uUMJaDȀ#M8[0}gGSO䦪:Y=뼕n P/&baKr͖+*S+^iX(L{;^l%ܿxoE1~akSD꺦po~D8LP^:iU̇B o}r 9357ij;'Čs26_g0Me$?/?ԟ}Ҟ;̦#sf33^HfxdRq^=)Ȳ-[{xˑΰKõ}pUdUJxEzM'?yr^Lmù E~A.}9XFUd(aBb$9]ъ5.q#G_E.;._>hHaxӉ,8 '> ZcX/0N:j*H|5m$Vȶt VGutKns:b3T`ƋpBpU6 :g?YWJAM\=Cf֎&>aXt:1.sQj2s|PTwŗؘx\Oas-4&.gWIrقnt\odqQCAk)d66,u]aJvEd)Y2HO>zπe?a:mѾ*]zaXe{<28DU+9QdG<}2pgqUzpX&UuUO@r 68ؘWdˤ7qb\"] kU(LqR5I=rO HzRɲf Vu',~):5jwz2]v ۶ڗ9wP,eT} h(̈́%Z:"X>1&1DDJe!F*C DQwp l~'# ƺ5;LSQP1ViDϘ.G015z{4ŏz0_ˍytJwufwG?vᆸL0n7cB^O/߼''} ݬ\^?[@8$&(@* 0Q/ j(] 񈻗F$Ti' 'c{#wg H2|` ijSSCe)GuuE i0G z KE1d8Ԭy^%2FL zm@#6fEP;V* ٓ47N>ά"(q@YrnO@[<ѩ=`!&ȽԫСV> ^E+>UVlՏp$y2CЃ%%9ϖYz?wrYyϲd^b@(*b¨Tþ+ <=cK0]v |42f0J!Wmt#{z=PcO~{z\o7grW Ҳ{qXR<bX{ 3HZ`&)ۡox8MQqt (ź8;PD`R(i$8P6և jw?@WI]dZuz"Qߔi1x6>5*n"s TC֎ ;$().o#-X!  K/ܖbh b6[_^WM8y &t XAAڍˉ0叢8Ux VOfFe7S)e mɀr.t,Cu FU6O+ r囿>ʪ5``F}њyK"J \e]{T7kv {P}<(#^w?ҤWs8G|$$gg`i7Bt)H)QYD21.!a}Eu潄v@ec hP.bͪw]$r7 ɑՆ#ۤt(a8W $򈸓"[ Th G}JW]-8QjzfTU(vmrn 9TѼ0:Z BF|(*iS6f9g } ڕaNMʀIh,4X k(5/0 7ރTި sƖ,3JоNO'' gECBLVfdq1Q'WLD*jH'yWB`ͦ)*45EdN!U1'(5YFlR 4JK"ٌ1{!4)ø08mԄԉ#^&'=?%˾ȫߚhwC 6o-!.%Y$RijH w;"𝅍&)"m6|];Dn)cI7R'7BpÍ杽r[s)e|ʀxTx v28z \+UƮQq=ȡ6r+X#Fg^#,߀5+3 ._@KK+6tr(xJK݃z@>h:tM>nΞ3RR:Apdn_cF n|zzd8W}qm!F+& -k;j<ִ$'yO{&)WHT Iۻ4D)hZp%f?aqh?i}Rm $KØ(lh\[8 ʻ;7k 1]q֙ g,b5忔?mY-v "D=%yW^ P<^fsm殆C o* 䒐kڴ.I,ϙMm_(|AMs:]{4|NS^ ^G}| #䎿9K;"2K[go㳭$;UnPՁ֪Gzg\)-Eq?7SeEHfE$  j 12VdK>-߇s}m~/WNHT8n%HtH#zCrx`,t%Jd!Ѩg^x9;r= >s l >MlKe `5֭іGțy헺NjUjebOCVRd0$sesܙ]N~6U"GYe~1TBX]$]9FL%@v@L`N}I⸕XAJJ-,&^!{u FL`61P1&ACq׷t;<F\6'hwݺzG(g@ćMrvg!%=Hy`0^/xdїJ<4BɼT\Chߗa\*>(w\ۛ"aa*,y$#y^1* N](. zÄYbASquaUg+PC&52:MNɴe>݁6= s}k}?k4%0}#7 3 =jPsE\l4_54pxG?^|cgz'W8y 8L7_^lڃӆ']+yoAH6τ3r j=F!_Hp2/GmcoyU=!a SV9D1:wD[.Ӓ&:gRT=Uޚbܙc?2pIlo0s%KH='>P/"]PE!XW>vOAo_Rwn9X0?!f-m1n^NN{k5=%[ L3Yb$5V)|g_"sy '/ck]B;p8;gܡ+/{0I#NG%?{yl1zr|/<_W !QWָ@O)Ff@OfAIy`pih/Ѻw@@-Y ?M!>.~3m}BT5 jɰR,@<|W楚ȹ B~~͜(Mp"]ȯ(@زA.Q@յ *-(=~wq: vfL *Jo}sLkn~wJ߀L WD 8hl l*X rA@{ I] sb{k<]،A_m{|{YȽx#'Ht!#:?TlD|z) ]44 :H~i3oQsWl"DJ( ڏu-6~vݘ6L,b"$QQ@~+x@UU$< f(h$qAO%^\L}V) Tup+kvyʪDuF'cۋ2 P`:x|wt`bHPWw/$,M[tik:|4n_^0?  ի v{I5qY†&=V:M< EjXBYhcjb5 o ||%v?bűL+leՓ併Nk/Gx.Tx=@@bNȋE bԤ89iak Wa/|?W=3EtŇ;vsVT犄. rS>cRZ4A;{6qbɵ.[o۲3ݢjԮv㙥Vc_Fp;7\;+{I?И߸ i^<8'ε{kɂNe$AM~%G;oq?bпg^棕4F/E3E 1QCTWQ- k]'-ţ鯔]*#_-$2pb$tN>]$#v@w_gP~{^(2r~\?}h$7ߌbn6w27|//g~0lye;v\A4hڞfhΛǬAMĝn#Uo6F̮R9pC_pA>y8=7#-آ+hA ձ?1I_J fڵx6>`"'Ũ,R&"^m >D@(:nIteYry0Ml흫?J,u>qb^=й8ߎVϮ-]IChpIpP@εA$SPAl.;k_Cg[nNjIZc 9RNh}AAܺ澝4{!ܳ-2 IouSXk1RL9+X <;<^QOCÁ1ܘoue2g: Zt3n|G[$=nJv=VNNpBU~ϫ8<>vro}D$_AzZ` @+iq ,ړ n1~7}3@\`Yr?\ %4b*at39%BaAUBep n\Y`*՝d55dJDXur̹EͫNd'nMWTRWp՘:=ȇ|Z5O4#l8 "a;z~`eOL56R]eI?L٩ `>=sbh'*:&Ŭw)1wʃ uu`F ش6 9E"bOk%/'n!Һ7s\hkeթ,@-@)|79* Y^d |1UE+bmao[oWqRW49aY4ԭ!J1_N#;izKB@PvaG!c<|m~gL~aK.Q~3 S:cŢb$9Šx- A4n]{x[7F/.^W_7nφqI):ҍ:k8m\7W2Gp\(^?+LG*.QP^WO_Y$ 9s1 Zl2 :Ѥ; ùi.P jMI1!aNg b"=jQJǘjy*m6RCZ㸗b~">Cm.lmw,ں}X} 9C{/fOo:AΑ|buX/Nu^ISxʦ"m]Mk~^"ͱqhq<խ1ș6~Ċ߫T}ql~'0dۋ/ʯO?0?}7Ww{/?F͵}#mR|\O}Kyž#<;# ֓BHe<"7#OT<>ꊉ}\^L]$et2ÖN[ I6^$VPDžɢF掳GOl43. = D+AHX$0UJ D×n4MDbԖU')DoF@4jqAo6x؋^ )l@r#q =/Gܸ tUDFnhJTJ+$vFEh$ eҗq6*?\( ʾ"meYbpsoߓiԝpkހmK'o(H]{U4 =ؘjP:OT0[@"N'PfM:[W mE8ǍOzQPɡ87xm"Ϝo*_k?ė`~LnDN]n=ݽQb-g[, "]qQHp$ĐX>=j1Ϻ[*0AuQ7s}@*/OO-g}鷃>lh› ?u0yR/^¥/2T97[ӓjDhk?Lwdce$θߐCM%Xov4\PVpMYJAaIB^Hmgˏ.ܹ*[ ҹ+CO@͑}z*;N ;8̵ Nt4#KJ t5m#I H"܈ή.|%LarB<%x,닅W= JnmVt-h6ÃLBȢy4-cr㗸(#pv63o 8Ў=+aÞL!fT}՗zW=/& n_H#rhZDrEUe,J)߿nIfnG:e:.1 zډ tJW32αA:R`dT8R^tiy_A@ goSQrbxbCoPYy|]VpK@ C!`xna˹odRw2TsD$n`iNOAb)WgvhR u'Jh 0 jR$&d(\RB~8]yGc?HhmpR/aT(̱'!@2}p49mjpS_:m6Ql^]MIpԏsjY @%UW(pZf2< Pib<`r*UrEɤ LP4͑":Kl³G|erFcQKz ':L-2wC^y*ְTiL@4s:!W{u7B_0 vVKU#v(LE{BQN.8hTpA.쬳^3kbJWf+b)cD&;(Gn^EgFQ|J)}0JTy 'AF𓓳(a~7NV`E~ # )&BmJ\˘kz|mHeW/8CxB%=}rz;D-72eԽB:371$#eY?9}w3fS7qezOV! GU&[ (ȧBL;srЏO8do;g PDb/+olaYf2.%Y!+8qKIx^3R0QI1\E A.ҩ)ig%ᕔ2 m7GXS%c?h1fWn]_U|K~ &8v1TΦIN0NM _ 2wQ ? fJCA՜N)-<DPmR]Oc˾p\Qq Zj Q+{q[;4 ^O;ܼ k$)(ݍ4(}6RYAEu}XFjVÄvv+Y@!Bc)KOwmnUQ+~%->|M!ea\HdB[Hҝ[J`3'6ץ;$N 7({e'RRU0M H tq#qY3$`zXfJ 8IெΩI+TD&8w&vӥd*c5PCKF|pmER!%lUoީ+%1.wN`"F"nz=GdA+:m=pk&*"mڽP{5U_Lfj̳u 4zWO4sXYuV?^Z{1Gt9u&/:r/ok&3 p5"D VU[tuWv%SBmdI&'/Ich4s!&}ב0ANJҋSߏ9)gQѭNK[[ ܹx]g|fj *H7 sa9ld= 0~}OGC y$`vi~(u|{~x^$xX4׶k{vJe(3 ҆=9yBEmPlRl&mHm}Z5S+M~P'?:ڍ6jjЎ(0\ f;ޔR//Ʀ1j AnC2qAgɂ`'ֵx=}$Փ-yz18) Z"GO~YC!s:H2Gͥ#P,Qfq=Wtp ?V4@z`͞$ i uHěu-{+;N#xj*Hi" =u6ZZ (ͪ'K 2㘃0f |_vq=3ĻDQF S |6GH8-˓YR*_&H$)#I;IG=iI&[Q -MLQI@ E oyEBF N+.IxEU.Fm q9#G8H.ׅĄo$C* \=n6-էyN_f_ cʐAxu;j5swwKe&7E pJ+s@7v{dyE OXɮ? L(X:>mȪ:f,C Md69E"TR2D :!S^J-IcrZK@}7.ԯUcx ,d%\3EY;VOQ/|dR癆S`OK4DQQ,ˡ\-1E9yTLɐ|7%?k_Mƫ)8E=LG\zj sրpQ]DJU-* ij@e4x.~7ʯ5]lz܁%*mr"̐uo ҂ziR~AM7C4%2HsCEuXK^D~f]1͓WWJ&a&dFǘ t:K!Fnջ}{4Yԛ9< B֙DC bㅾ_v'I,:?GX7Z@\At~X Ow]4^]$IX$ i[@I8/*|AFeԙ~hi٦W0^0&QFϙB] ;Җ& C8K_6*g&>cAĿm&cV NVIm gO6.i%ȡ~=8 9cTDdB1:hD0U ,b`Kvd[Q֦O0 73H14 Kw2h6T,SףN[4d\Вn#"H"Z-|>]J`],;G+`5d-+A2-1 ;LK ('&Nbǡ$Dfjn>N$,t$DecT0Laca"Ul&]A`ɎvdPsVѲ-̢ hZk`Tu,)Ӹ@10`DDjZ&HvI{wmB"NEt1W\$*:?BeЬ_Q5w{ئ'tǜ_Z5PPXHo)ӫP\L~Lrx "# F-ydz$N.h+L^K޳GAΪ}߀paK޻PP{Ύ띹}j?zLLc2Ǘs(RP~yןu:S:Dx*;')Gnٺc$.deule*p&'oNO>tx1YB*1!NaVX$P)75a  n5"i4^DY&ˊ9#GL1zd M'&|X0mbǫlcZ=nv^$'.@e`.ϤX3Ab+U`IZ0cTG*&câQ3+G۬(n^XiOG-6ARѠ:{  )mȃAdKJc(fԊ{+O-qXl\#= ]30NTaZ47 WU~Wl· !@}=)WS(h0͂pkz_9w#CԮIQK4r0”25MGZʙhRrb',󛙢tSp`Rߋo Yĵ<{3/Iz"Xw qVӽz=v+塽ՐOL%L4Jq˨9IʔKJDV^1Ħ6z}bBh#eW5XqQKX NeV¹e`XtהnQo _nϡ?5^~%2l&` M>u|lowM>.tF?-r ɬ@k`3@ꘑt1GgrZ[:9 ~ObɞU:! LDnh&&N V^XlLl%*qtO`M5xDgt WVݟ ?ѩNhT~"69Q,P6ߘ(⦯ ߕ$lKW\9QQ-it=dlR:`F)?bM9sd[}R-8p% j"({/ZKs0Z&#@c3]pGі1xL/۝4lұ)~:Zgvk55m,Α1. 3tL#SMzRvDX'1QM.uA0Bl f̈́ 2 !f:dm(•BN\ΎMGJhؓݦgɝ@kkC#p]SB*h -^|h ʕlt͝0A;n.S.Y#쪊'X$>E}-EfeP- Aﴫsw'nP y:Hf6>F;LؗUaVlhElW.TuCڣVvjV+o,~/Y#H BIG.ֆ Wd-V%OȥuW$ A TuHyh,VVB1gDBZ[I\W_8kTɮ!L\'P+* Y0Y}1&lPQ[Oas|PD~ʀਾ;]} b%\@1oG'NҊy@w26AṂ|A&h˪U0l$* ,Vv :ӄcSba~`/vQ-O ' Bާ4ȕegbJ(T۬Jރ>YDJqLR"RMp^`V%\uHh/f*_pxG3tzZ%>é (ZXϽW3Zq:xn/#1TD<! {pWG5&( n)!L0~3'jH<0l^л4h}μ b>+ Ѷb~8GI\L3vyTX,9#-A3SäM6\$.q}{&w)&^.R;c*NT6H\@' daJ5\l$ /xn#st/%oҪ>(| Xg*#quù,CgӒH!7TYO!'7'K%G!6QH:$M?z 9=9xTC w>Du>GUl_ZBučVkBM$;矬w/E0"ܦS1aqhDq~I_uKȒ9)XݥWwo]qtR-5S!#PɘůT: d0x̀kQ? =l7]00@IGnUJIq Rdl++M-Q– |"M[jFU_%TéS;Fcu!0ln 7|o)m',#~af&rpވ|PĘPG fl"%a8NEG08HWɴJQ0'fG<#GP- qs(ua@tmtH0zltV,(]! 6@D2 ل h%>%s̝  2HDn|:0quC-<~E!|Xh?itSs[ZnSN5M3^ppHx8gSy;9׊[L("F:Q\3bO`EOUC|SuAGyO CkDg.TWd8)ׇ7po3i@KJgӘ闉2MqmY~n_X,bv56ePCWbKp5-jvJ& } 4D|?G{֣+S NdvRsmjL`,bKX!7ScOZYyr}V3HEg:]h ZxU1IׅkHD"`,ŕ %%b~b|-3Aƚe9 TT/E ~asՋ\ټ Eps=ѡ~^OeXJV<bB'2b?N!/P<:&/ 5  rwE#=ScY}騺sL{LtFo=u4m+Sš7U865w%zfi 3㽓ϥF 4&Pb-֘$1ů2*M˜G_ {iQZ~ࢠ"#v#Ԙ?ȤUB3e)7Wki6͌\?P*:UjV12@XBPY;tR+fG .x&߆xRV}mviP'huXj<>lꉪU`{L>R?Ɓ]0p*T`\ZqL>3RόjH"2k<e)#pJ7|QN: 2A.h Ka&րc~g##PǕ]G*R`MciTzDyuO<0WwE ! &THbLlT()s3W!0pL9K>ך,0UESQ|ZDR2KSU"R_BtiZm/Cl>0 dm RdV]6dXRr0 U[T7 //+9A}SO ٱ0 V.SsU#mm :JހE6Аtt&`G0^ ^ý?vh1A~sYF)*`W愖-YL홥# vj _\|+v0~ b_l{3Ŭ\bj42ۡtfv.I kFHHtM4'zDX{j:u" KP$2VY1C.4>c40ִW wrohrӺ)MZ^K\H OJVyymd؇s# yɜ`qx|pt,Jɳ$]i(Z} U>QEL*I;j1-,mҧ(0w.+ղ]:G2x>.k^~Cu`3@MJ(״wٛ؅6!42qy)?ddUvpCyv"&Bfj XǥUM0^V[hYH|^ՀWɵyK$6 ):*Bx{{b!|e} gR@c`d+-(5,!ʕOJYT =2KKjRYOi*$ΓH"wp}AcM /"rp*kT)'l(3E`2&\*pf ((U8e5RBR:'fD@7uXZmyE>9:a䦟z̦L%C™~rht?@Ӯ[^U5U-,dsjV,su@bM )1 v`g(nG]9J.zoA5 1dM[94 yq~>X0㓮m2A⢘k벃+.T1@U i[vP*гl1by|dOg-[QE@U!-@JQo=FTC>V츱NmvgB_cQ蕏7T2AܾKF3=HȋZLt~3u(3 ь59u2f%uG &9FWWS"5$gZ&A_@bl-:ibD:1Զ/ט 3ٲ*P$@`MY=ut9nO_˿<зYe%$(!J"6nٖ:x}> ʈ<)=΍#K`ND`Zʠkcg%G;&c 43x YCeHYa`.nǂ` ƒ!!lWlyÅȩ3Dž]2r>.x/H̒RSsO*m)/E TiT($ +|q-&iw$Jŵ,]‘3}0P Kf콂sg{UiRLʛHit"VEn̓r7d2T5+ʺy\ Ħb/>fA_k㒯|@#ZgV%uv]WEZ_^jE!QoVtQPǠkma&6baPNMiC}rgUIH0(ƌcT8@T1qf';^CՁ h:,funZ^6U 3;+XQE=SRRC%F;3芏s{ElOYޠ;$%TU!_ݔPs?%SdVH153/hrJV 65)~zջ)d}$qI0iBr~;&t=嫜5%6?SpZWRS>P#-`D ԟBD'A[K {V 70n?z>Si!1&gulbD 9I`+K" iK*QSpN %eBd]q{i NJQ FM}9n5( W %zJ:Ml׍ jqp_hqsAc&Pxa΁W:*B8/w4|ռ爦^?W!i@p0K 7 $hb fʮaz*ΌO^XūJmc}L4tk9Tphj\]7) j ` {&w4PbcPYAI)b>VsWa̞2`f~WZ&6Z"<&F|+xjOahJ&'%Ps!s$X"o%O5q o9:V}z廜~PTPz("U$d5cG+2f&20 C/ :0$boO37jmC`t$DB);meDE:)I-Iy+zX)<_V4lj~BGx±9ҹk2NϏYIvri+;Eʿ~bN`eϙG8¯iEV`,NGME34qSO>p~Uxu'ŧH fi@:#Qc?KTaʘB1")4w L vU=&'x;VoXe!=3/5!vit:-ZAkv!IVᥐ۲Af)4 zT LY~!ݖ$U^<Ls.):/c&F |ʳmU{L@};囶@U^̯H9bH-7Zb x)\*RC|r>\:JS/Aݝcwl%IW{)۔˨^ 7-G?{%bԡrj:qiɩg/3Uvz.f0 ZUI;RH}F^ h_%+bF30ȮAfE 0Hv"EZ` e8ڪc QJP?["?r:3CT8Fh*5h"XMԷP)bjɐ1G+޳x ^?}Av&4`8B eT'ОXEKUK*ןr 01ID'o!ʴPۘJ]3!0H!.3HkUÔ^,NX7M m?ux'&h9dY$-jv}c?9kC*P᫟!=<ϲ'')B$1R ѿHȃJ M]oDIh aLYiS$36 "#*Z}<7~@ _L(2Hɗ41pX™FV OᵊczbV 4:0b<#M3jlF`ep+V}#AZ{+H=Fo%70 )4]6$һ+X߹XylPV'=wjL]ٴkܧl )w0?EbB5ň ,A`|O^6_;68/5Rc;ݜƠx #\*%UN .b'iKkJ(`B:sp-1jܾ:#n "2tc'ٕ̯(wy_)m|6:*IsP*ixĩ|H8D@ Z <_,Re@FD Pf@vXBKII=u9R]cp5|`?9=A2BC4W] gȊsk_ _SQ^. R~]|}W|L% Y+iW.*M15]/i$~en8ٹ,XvR]LvNn~Y[ m x)/LC}WIru~`xp @׈5?""Eo.N! tC0.$xߔܹ`=S X2G]sCIP?HBG`{r%ЕquCJ#DEgUTrch Fԟ`\ 4 "rS %pm\86T1pA:r\eeTiŘF>I7ԈviNΖԘzC`KŅ JA)Ą{掗m}QOd?.c'ߩ [fݐ)k¦43@A{W!.@_bB,ۢ̀@DR  #˫yrHUxCz= }{e/Q(h¨~F`Y^ 5dx++?B " H13{PⷍCuױ X 2ƸY&5LA&F;!Lw ؊N΂7#]?WYexW2ـ 2fv]M\wηD7Xr ̺v+~|>xl֚hgk8R9]Ǒd30y4kAPY#);z#T)\Ұ­b("Jl'~zǁ~Odž| @H;ig #DjjV],iХ!KhI9qwć1.l_:`5rO{J?wII22xJ{)AU%?3ҮXd#kƸ8K#3WMOz7_e ` "&ˆ_fj_mt8wQ ^؃:*ie8nq. |Ur+.,h0o9a׌C#xĐX_,ɂM1 "b9ߍl`\W-("{9CEUq@J39^z8:w~7K362>RCwl fMhOZ{3UV> 5h$ 5C tDVџ\OONցw! G# hcmW;EU/B6a@ TIؿWe4X-0 (C}?3 v5"͆j$ F5K-Fy F=wM.]PwT#IY)qRpkuҮqþ$zk "SSp04AM\g1{8vMLtJVka(p)^S`:Kp TwRT$ Н*PJlncw<^/t¼B*hLOtGyۈa+ח b @Ģ|p|< &GCO/}y/@#Γ& FZ1!ް%XL.- h'sGO^7ZGKp Jí 4-p<;g|'"xqteJ`P.}ų vTDl$QD%v[2 )/_oȔw Ɇ $ġg<])?'1vu[!@P4hVֿa:<;e"Qmv_AY{W UtBO_V 9P ǒ7Wtpx Ў<-F;4cγٚHT~ts~zS 7 p.WMc1''V PL!1n@GfGv*^2䛐PK}wJ]Ѫ2ӌ9VSdž ' gh׷CDJ@)4 *pι2AEfiCˋ-e FQ%C4 6m C(hR+C!y]Ѽų 1IAqMtDҙki=)vӧ˟Wf"i'mE2KA;a\ C{x{@+2O^2@7RV@@^$)Ϡ6)d4& 6$PY3K% k %_3\5A _p _Q%*j2SBwRVV,G)85Ulh]kd^-YrJkT]@ PaUZ|ڧ Y Uzy6O/dKţ16??#)l|~׻ [ S԰Q>ShDѠ~Ȼ%Ҟ*ZH!0/>`;^ۈgmmGׁ*T4 @m.`g/b A˗ $`A597;C贡h&T& 4Yk,^B7,rb.'\:-T0ڙGS~%rI[|a#'aEnM둦dUP Rl-@Om$L4~Ҡi{\1, uxeWӈʚ(yr@ `O?ƕ݂IO2FI \;ps@Nt~1BG&eԃ  #ʭ{]KJ oaa Zҋj_0p $B@-M߿VE1" UA*|,2oqAIJ> 8UwxÙ{&/4|^^@O:mʤ{.ԭ, *6KH}` 1kYZ8t%8 qMIw~D 2/c@E($&-?U}M&Xɚ\_3;czuz!T"N=?, e/;K&DtJxl a#<~4LAl.+ç8rh%$s h@*鳙[ \-]|숮(LWL+`N'|dިq/)P@Kۥ$ڗ, ήr1w|$ٯ=WX. ocZ#?wm5Dgdт985~˷ݷfis7#0`,Po=U($E o2NjvzoW)vPJ)@q v!fDHLR^%y07rxt$FQ0Ad'%,B H׋ 0 5c<8T%,p=sDI:K M@M c[߰ f2]6nN9ZAMiulSEr; B{A_o Oge,MIB @%Q@̑>i~Y4 'r_i,qcHo:bSL1@9w;dr3-,ReL} ?4[|%_kFXD,0]9ʑ  :봹Fca>/fc34d0*l'O"B)M<3C=8( 򤕾D4e@?_1 6ŪOP}>X;gKYEiC)MvDn4P PszXNR$ nN\tj@-; 縢D)~e*|O9V0l⌌ly<ع)4eS`2i=]ַþNs@Lv] bosIXɡ a80Lv{-c_Ԥ@an3"2!& ǭ,ai6a6!UߡZ( ~f{:ZT@46R>h&g2^saNV}':~|_(g Zf< á?k(ʬN.k@R;f% >@ia'{X)v=VY"Udfo*Xmr(HBЃ$t9d@ж-O'/FX  0%B=i΅]ܨ];V@ 6?.󾗒ny +*a@#˜ _^9i .֪\%$D /s9l#=^{,2XB…# QS ҳŠdd-&8m1@4E_rY# ]57Bhx9.I5wܗ,^Fr*X0XF|1Z3fG⸿$eփ~ |jсs]}tɕ/ZTzc!& 9-΃ /|G踿f0a Q.p%t$hj>f{rf1X*ݴʆ9:ѯʋų\Ųf:Nw;n5oij@[),*c<+`|[n ^__T@&u¥oZau_K#7ÕЧ8\&keu*~j0hl7tdsgH  5A_N((8 1#l{0 + b Q7k>MwκY1E2kB ן7DH@D}t{xσ#MzSu?n}q& K|Z%.iGSb % Qd+~/1Z#M+ke;[$Uvг@dw~,H`E0@ YTX*eH0`gҁ/%M4cBG`Gѧ#Ex % (6M^#9΢_JsrWO?އoepD}^Xr ㉔1m]))Zv c` I1Q:a`JT;5ܙ u;uem x$sIMZ3KB]O Y@A*D]s`cQa٨@ Ё8=i,yNRƓ$b@#>P'9u=)`_+FEOqVK)0zNyl[hP2X$ `@6"v~!$!\ r3)f1h"o(w_Iysd)4X"%D-'9p;CA|^l ꃩl+sJH@ d6lY:QitLȉm)͕`С F/n6؞O9u'wwnjl~ӢGRCZDBU0 Qzg6_OxCfwZ^'X6e if̾2@W{OM^׍BcP9JF@ ,$,sɠJj@Ԋ{ 8>YTQP\||ji.SY|Աp,dP",T)n=9gI$, T#.$DOnXh=zDՓ,o0?W/n lȞ%U+0?f4l2ݬj˿2l?ǿ"{Z0 P4 *ҤBȉF".Q <ۺ nrO6Gey=JufZ Ai @mCbnyjz[M 9f9V4O 7DDj ^/V<}l3T3`WBlUw=o@QHR d 4S,VV@or!-c !3T٣hO!2ݩ(u\y:2}◆e)s*\4 2mRNYR& M|ckT^e}P: v5ZzNGX!MWY0ֺ0!Jp2Ǔй]9Mǫ"p(8=@Q3g ts`8ړ1$rF>E)+;=ˍ_ `a@Ngឨb-p =0$ /G$ U;P?l&D5:CXK+|N^Q(T7 }IMd50I hM6 ecz`?'BeM~B%ejf>Ft΃06Dā=}mZ/MwMd W w>weC& 0(n}-_'ɔ`lPE>띁qB@6#筁̞R վz (`M _rߘ`7!$'^:v놭vupOqSk X |v+ ,- #<1%)P 4""Iɖt U}c\'EF%P^ɂ6Sώb,l#"Uހ FR a GM[B+Vk@xl)ЭoWfieUo,`FJLȡИg뺆|€=±: őx`ThB2!2Ul^zDa l0%fFiDAP )q$1{❧槾s* t“ÛZ5"N6C5Cŋ-˨'c7B.iZ3 ?0ՑTeSū],A')QUǴo>J3r$B&T!2DLkM(m;u_ދJkNX\ЩH݂2m Х?8IZy(RC۟p`s;ak$6!Lr&Tł,T|`iy\2M &ʵvQ;nGaZz}{ &-EI;uĩP Ĥ} }6р1nas(af'6NX&"c T@.5J_a}}npzA<֩= N đC]ÆEoM', 2*8 &z%{9LQQ!~客.eX#.Ӡ^#%,NҐtI oE6$'8M"aɄ>i,$Z.>t7~£3 [oRD`=EҾg0 eW`䥡NYnU,eF$q8]gQuD}8n],x:$\e١ZN{4BWh9ɇuIf BɩRk*΁I[D!.MYEo@If̈YnPx#daݢ @5щW?ۙbSYcJ"c^yv?f"x ϰqm|~  H{|$O"H jkets<[WŔs3|wަ] g$V`1[uR~Gd#Bi65vU,\,h6%*U-oX]܇rUK`5IW˵_h~v x7={,/aQGj|Kv凫3庝I28JL:tR#+ (Xr7}R}gNϢYfmrĕەc]cV!TuxfN]θƷ$1W^DD,0ۘ3۔,B ),i"2G V׵P!*IgJUsM$MYy5G?J.' PYe!K^m&'Gz^V;dx<+a>q0n&GN80C8$ ˵. mO+nGv^D]DqoUe~K̎oSޅ*Dw9&H3y=[z:ovQ@V#q1؜XN m? Ɲht"h*q#Y9 'DWZƄgֻ(BH6qUC途=#_ys_X'K sUDkAp}"%KƀYʹecZg`t[Y1_1aê(9ۚeխ*PK 3or({~_?uѰS ,l+J F_[R+6gђcCSt @Te\mKL> Sѽ9WvCN$Uz+m2'5봯б|~|A[eo3{ 'V-{~&\jRdGsB( er h|:{{AaVvj+2XO#D637%27̞T*[wW VvLlBXFo2Zu?n뒈̒:ڛfK-Ǔ9Tzɍ3$ǂw9ʐF{8+P~nlH1ٸݜœ %`^UI"؅Q>l*/{ &_2FS6︞eT'mX,e„@E[d%ư8ks7Z/-i] 72 ݱbuK{<k՚vGQq:nD,O'VӷQ9q!J2iJLsd/qP]dNKPp/I$6}A"!7'^>l ]N )t%r̩ںU(b6􎥦[JR5uL~vaK7#qqG ԙqPٓ;WB{\7Ib &TO3If)2v-Ax[w+6֡ ɉ)MCz0p {7(* l1p*c6^~itR*PpiCϵuj_ζΠ/;eBG*pWo';%appOD]+tX*ċ<h²+9_ ȣl#1↭eq((@Z=CK[%74&n%`N*΅Ӫ__RĨQ< @]Ŏ@@ yk8kt-0 ZgJҗD~fw!uIVh>y`1GK4Dkutu{UjRIL8il[h'wi=Y XyI-FH- JvLNS֠v)Q:~{&]A)SA 2#õqChGgng-8(th%)ZlQ@׃Ӷ,'e"h5¤ .C.Cko$tY}ΘZBnPBRH.·e.B>03Luf/0r&X1tI0$Ǩ}Q:CFs]QO#AD*yQ\5+b&)oX 8GSz~ `>eܻd$*J >צ+kEwL:jZUqZw/KHXݑEa:}S !(.z.*b91/ nEwv=?{?Um%Q#(Bqɔ!ٷ,? N6 80`vu ~#y硞FX:0s]&(A3C 0lDNrWLm n!Ըգī5dv; q#}^LsZ?'Ўgz,%m% U$S,6kףc/+ຽ/#JPgư^ [aD\q$rVy,z:`RKΌtk"U[\.>iڍRy5(fi2V]cf B( ^y `=n;n{-Eod` W64tALrD4͉Q)Tjʤ9] aR:/g-7<E9s7+쨮',ǫ'6Kͳ{ͅisU&UЄu6]9g=ϝ]`}6*G nc^6WaYW~cUfo-(p'RqfJ|sctpMkwW *]^ S)Ig;c)gG_qԱÒ,%ڎʪi FBڴF my⽦7=k${Ɍ7Q>{:5;0q7Uuqi8U~#%5Vbu-yUXmZZ[e2`j@z\UҴM)O3= =CTk}`h(W.f>g b望O:+Fzj¾LGE%h"I@ 0 uHBhrkYdVn.#õcIGMx{L z{FT$;70j:LKj Jn m3o: U'DYqah:>8}y@+3\+ޥ+upCSP\^x'#bshiu ⃜`&Ttė 3|p=OH>l]']?饐@?(1E+5 t;G'uM[{nǃ!S|>UٵJhpg 7?b<TٴR@bC8ۑrf0]rNdοø$P/m?}p!sax1E V6h<هM}7Q\~?|^)a!t~%"/ gX)ǗL6m j,"x'KGnVΫ|µ[F86mkk ڝOҡ\ꈳnwXw_Krq\`]#ij/ৃQ+W9.1vCpjhTkg#y$J"JAqjW8߲`|@S .Eޢ2U'$7lV39z_l;iHwGJ:Ce5WY"ڟC"L)؏ [pe > dP%iݘcCk{Rg/X{z,oꌂ Idƕ?BӑDx#ݣqG=׫Jᥤ=c_2#CRJ^ۛIHhbjgdsy[1(W}UF#(57){W{;4Uə [hDBe2LBs#.*s2Su{ڬ=އSGeբu81D+ͳ{KxznٱIHYF\\I)I!x䜍=HqfN_\ˬ.' ^:Jir@%碎ř t`8 ~+eikx%@݇ˉaߢCӥ,Z UjhT)j[>2biCvoed]÷uj/I̟P @ cN. H2u#ϱG#:9Zl衅ɇ6 D1>x)#)a32T0HuDr#gBs+'g\ӛ'/д&GaF-l;ەcIrZ!%bA:^Xa7&vf壒-<dZϐZ&Us]eUN Lm栋9bS  _K< wXjwbeN?x0mQ7ь3iKࡕ0&_w3ݐr Vc `˜s%PJsSClܨ_azl)kWlݢfɕ&o,7Tv<yW'YAf ðchw&j7Χ1e,ԛx'5o L䄐7Q1%ku@=EENr2ttWE:oZ &>%.P8m}aCw[Y !y̖vD-xtA:G©$Fϋ\^0:G⳵s/Dq pTcՋ 9o9z=5 u"!T(3K}-A%mv3I.\.|2(_3՜%NSϦs~־n\P2r LS*fAX4X*s2-wO)AmǔΔ6n|ɗ'`ݴiwLL u-[}C-7r^&V!M=q{4%1_[DD(Fl0LY5l+~OKCY6尪 yGNKEd]ފ|TnϸkUyF$L/mc{U±}ԑS3M+eafhc:o[8YQr5,*{sn4m(^pqE@i̘0C:Kg#? {YJ^Ё2q?iS"9ӗ-c0~HH2zɵs3vH ?_=n!]j˭EQ`xIuɼΗȪ5=2e)NBSoǧ˪ˈaao(0WC4s+3vӕeJpw? `Qs%p>骛QQ&p6d9PkٯYfmbIy5-o,o] 7BB>Fg'iF!eTx =].Skg|S(qDrz"prU=A^S|Ɏ&޶ajp8911OekNcֆi̕ d(F'#tc / NJ=V[] F_kE,~l*H{R^-ϥD"=}5깮9X}+!6͉ +cy.8:߂sL(ÓLVL^ 4_aEn-EL 0楽]a]  Ŕ.ń4#3)کYWm\g >[M٩os$ilZtwӇYsG•of6Bn1 CS_d 6k`70 Y`E,Qq\>Xbqu91HCb`ЧSMg$)|ځ}G.9}W{8`¡ՔBGbk G䒋8,7eSy%E ?@8U,y럔9X5&K[ZG >bru.[S SXeK3 jL:]x4 ۥ?|l. *yn|0%, ɬ,fs^?fN=WoO)-9cMRɅl_d 'Q,*{9W1Sׁ幫oɦ'9մ0{5MC>2fv902AVNi.ۛ}M70"3%ΙeƶYyad.Aߖq V;3tKU ]UHXͿ CJ,eͽ7 ҶD፸fX8e8{3v1ڨr9)3oKqjӠ@+'ӿ1+1I׼X{*XB%n&2U: I_cʎZrq7Ao+SkJ@=ÙMaŶBVѸW "-&Ӈgj|Y9x{C~ )S}ŕxUӹ=X,sijMK83Jث[=J"88}h"p,`h7L/O鐱{(Ua!>S}[SR$DȊ{'q3 U> ] $@ftGS&-(:FqRG +xB|C,;% Tk-2΃NOsbSp¤^s=@D:uMqssj/!Wu%}E/ӱu Lgc $vn$Fzk |kf6aqux.s,]Fs}+ͧiȶ(;j9Eu7ًb=f:˝Fw#s6z#$LOQsNDY!%Ϛ#]!'žЂxu.ϮZdu{t*d몟fPgU:} }" kM@jvYCRRGN+zf{hzj O n#{yYз_NH* %?DYn# v: %v#1mUd-|]`.3p;sa>֢`ȹXtʒq!SVY'd.x&vW!YMr:ijbsR_ڟYLsYhe^bn|$V]A^JƝ\e'R hlZmD l/2OݱkIm2L[ǏAu=6`>U-6A+R0ȟ*7?9`> @$쎞Mm*ho(CdPr}]2ft^_~msܣ3ưQϧ`61ODuOzE0FKCLu Z/t]"Pë>{՜ 햻Ghy-@w.g,EEC #Woq `y]N':}.D%e'qm|+y,B\Y.lg0KٯPU5w-QSMWRig̤o&vv^4Tne{Ţ& ɞK%նk*6\SAWuVsCkD;h+HfOjT]RB T鈺S H!*_&m|V+4n+-S\1/PYV/d͓fuT wv/tH(";bj\Bj5:ĸm"9a;17R?;+4f2[>YhpS0FF]JkbpS)΢vnt"ePrv~fYֳp| >%*eBV. }F8HUHI /ɾFܱ~Z8@nqZ.>|_gw LGz[Jb5O`wVONcjg”ZT=[]URu[y  a^CMEs!gzúeh=M6fE%jC= h|׭eyZD4Bݞ YnP[,bRTU&,G#SRI{<2g~>$f}aOkf2ֳZ<9 2 eP:ν#-*n;lne8UH/%|k՜@&N;eav[ϥnY0ÐE4#ѬSA~yrYCPdŶS`OrǺ a*QUO]$c$N7 ~Ĺ^66s>U5A >K3G7YTYA3k"Y.w[wfزm:َ)TNoayw` Z:+``քL~ e}kϡ9cCuigm8RuhD f"u38kրԪNڒÓ͖*A\'"P} Q$'3yx6PԥF26vaNX9hЍ" !\cwiCon6o KP9jO8 FĜsd׃77SϷ-Un.<ݺY (jLk kArn%qT]4HhUI0[~^懽R4PfWի1307yis$G/ U^Epjq'BhcE4lz2nwdA gM2H\Eˆ/^@i~5(7[kgc<ݎ[)>śas?%Uȅl kjv&/>R^8SJx|oU7Wo\ua< 1;nʗOQWl_ 'Sm¶a7T~i*<}*E\P#ųޯ%Kwg3ZNi5=Kim\ ,J%dnFc!a ذq*3lf=˧/,ClGIv7q^x* 㠚}ea! e2DOΆ%NOKQ5zg_0rw@NcӬzrbI`QɌr.{4B?7z tU|:=Pj8z76x0h$P+Om7زdiyE(fy j;ѭ-tQ9~O_ƈl+8HLsy<%82^s _E tQΖyqo&T'>%7S_t0}Db%G&(Y.{8X0`_zwҝő^0HodCpOVnLo߉L]6V;o6H'xd1/$WeObln?ԼпzQ'C[=@N!rM-BAk?Txdz]._Em3X 4hYΩR^I :ltfMMd%j]/[q%yΉ\SRw:1KxN7G|4 ~{)UB 6E`h[^RבkbM(ǐصR.GzU($;ّ~LI =F/ەy8O/vX!_UQ.VCјltd8,0EOvQS/zail=SwhPqvkĚ)XxW7~țz\_^$S@=z9Re'ȴW,ܓ2 5:4-d$(Jg]֍6wU_o{z46`mO! n0ڮyn_!xc}U+^TFUC~1yȶtrP?vM~vʌjޜ}5/(v- J҆%hgR+@w 6.McBcMfbARɣlX{'L-Uvֺ{>4GxfcApz> z1^쫏Zze'*-y> BǼ*.~9GVJ?!h'-X\[[%Kzg!4J:,Db^,Ps7G鱗)s16_j|-Xʩ^ާK|Yމ/`",p$ X{Jɚ= S5܏쓛h7nV ֨ ;a"Rz\N2m Tǘ}lI) E3`wƫڋ~R)-ة@HktseĵFj/{CzĨ94/a3B;S>-Rr//yNZ3kKrңS IhfUi4}F~m)k_K*/Mh*Hc~jX8oSO)+ju !dT%}.Y(mN=S}iq}%_ ><V7GNZJ ŭ!FNo[ oXpi|2w 8v\lr yn#}N DճvlHvԢJ3GSҵ~>4fsedxxʸQ^$;W5wЦM?U"C5>I3[%eZga]c$x}|)QdL#9BF8oW6F֨w jY-6\ܺFQhI8K_!vwmhmP3!5+DSaUy䥟rz}SkF|:.{^{5X+'#K=UXpv^RnVRa!4P%a#&9WUj̍_}R|>7ͲμSϛ9 *Bm|V촟';U! kVˆorzB|_\|]e!]:iuC?]-,rCY#Av6wM'D\.Y:;dN0C"@%I!s>ø84*d@6+NE5t.9@2ҭY;yv<¹IUQ>,2/%/]L&Xmm+F(Z-ed\_ϴ:GE4e9&$/z+Y*Klh1=:He/1& x~pj컅 Ǽgv[]poD2o흜.dŵr15oqo].T&gn>|^sNLd0eZf[)yK hH5z=79:Fr;e8I}X#jɪb~Foo8َ?7٦\Y<=*'7Ja,tM@%Ѫo?;ܶEԣ,/9XJBǗYCI6 ,?$XpA+)K5?Cx=vWssY\ڽ\l&Ai+)SnԘl:~m׿=244o#= %/=`J**U~~?Қ0N3C /ηP&JЭ)O,n#Z[%'=^䳵y=KPܓS[aXWϓE3?a̍:~ "B%]z٬_Ns ;Y'Rk]99㦓zsؗ!+[PygRI kOHs_7M/Wۚk`ԉ09]ܤUye#_ 74`y`Dw93:pq[y:܌M.sv%I TyFyE%+Ƞ-U8%! ߣt=j߼YP݁q ڍx{W@扴uioJ:Vܦ,YE"p /cnS Mq2p< +0;aTDr4pGHm9Ҳ1`3l?{ ͅ0Ikj# /YtWSQ_;'yeCT9Atփ x's {^B_˄N98 ~$UnLٌvsH}h< ߰nN"c7[!/%r]bghk~T36k_Gy()Uech[)wk$Y9}La藌}Nn'X c5Gf,d&6!iiQ^ &-.q)>pmI5#{#u>K /ڣ:~lA7ڕ^ 6_d ;l@ }?͢h!b|ʯdm?1{ ڟV1Y mb<"ͯlQ: 5Y=[.+c)O&:WPAكt剚[3{NKy,TpvKI<}mD&- 7ȷVCB+K_?.{ww.t=n'RSO~}Pαj\)6|a$@B|\'Ͼ8.M3-wͱ셠vFr:Uyy˿%4 y~GżopR33p |YGG]8rO/(;bؒ2?;RΞ#QnE!3{m%(xFAtOHZˆUeW耼LcOvc'GrBgK]ͷVWl=qnz?1^#vJB|{iK-`bocI\-}Ek8%vLUR}b}H}~>?B+ToBsT'*5ʇ_)Rs;onW̟3`3WC{Vᗾ #꾞ǛVKG/[ ɺRgވO݊,=C:ou!/Xlᓇ?-xR,f6.-Cu*\(Q[6 $V?Sdu. A𞑧t8넔/GED܉1xjP."Qg}w+)O.ګ,!5=~&W| \^⟛`'~qE٭b:櫿 *|D|i<̧E2r>B@+yO C g 7Tq~!퉓7eO62WBՎݸJΧ*I%w&Q{Զe?/+|]a?5PVC6@V#_J<o)NN5'j*9R+s74eʇMe퀑v]]$-=19tKq5/>Sk5-^Pܬ D W *#⹒-UR+'1 ?jo+fwsW?p:!ۉ7'LgOiC,Wb5x/` mq?h+mK7Z|g?NK  ^3I^$335$0鴞R_Wg^t,rcU.蓶/aN'Z+ݎ.ho]$oh4m>Z9/u6ǵKu# >Wb~O錓Fׁ֘̋#Ķ~`17q?Gi}.sv~c^=x? ^]O9n+7{w??4JjCDK1c{c~n;@ۓz?׼ޘV:u̲?0{R pjV}B"ZC|3W]sK_ m3QT:{Av$D`$vNo-zW{OORԿ}1M Y~Pt+AGYHI_T56sn3F{[^빽/~^]`?Oa>oKkYϷ"fיG>dcu_1W ;w3w[Г (d+#CA "sX'iEH_VЭ6 jijwK"ʟT[_c>R?s:V}8 PV֨Z--pړmGopKk)M\k Ab.pm\MuQEl)smsrr.78ˋW:EIc 49gvb;&BhZ:)S_+#KDN+_)^Vk[W۷+_)xW/a=FQQQHF$ȓ&FhP(Y0FI6B)(ИIP@0Pd#X #$Fz4Ռ+ۨG\7,j\wwdQaca]^!> P,Ahطք?fO"^Ջe&6-G^ CJW6mcj]XѢ,Db#QK2ƌd,Lf!b H1QEd*"2%DMhm)# U{Eĸ*8sT'5uPޏ=K.ʯy^^Lm ܒ(.#aw#\knQwHNswJ9K7QwY,uӕI\+!2hll-mq\{_RB"w]5kDx4޿ݓcl׸;m^kbh#E66M$ DIdTmD0f,c,lU 0"jWz HT?Q"~'U}x&[2`?0_To E~D_ȥy4J+v7GD;o0*t}WZIsrDbӻs]#WtXѤs\ ]Ȫ]dsbKvmqk}wpKTDmIks׊rn5ͳ ԐD?ґ9IK߀9M6npG;\`eۮi"\۱%RR1غ6R66==j8__1'Qi l^0a'pou_"'h..җBh{4vu^ؽNt5v$ KZd*R5! S)d-^X\z%u]a:#+#NKg%)\aqAq?@dٶ[OWVPxmcn)\ QWUO#_GXRIyK*Ř1h,Ʉ!#C6J# Mhڊ1;rV FC$i ɣXE;.[6w-W\䝆(MIt1nFc[}Q^UKT?QC )*>I??\%jKI}_l.?9J/NW3mlkmQ!EbzV= u/JxllڶmļO yI/7nzX NԝN;Y\%_īķI/KN鞁/נQhbf $ҍLѵ&؊+D׵\9.N\ӜۆK9uB#wqݝW4W5ݜsr4[Y4\tcڮwm6R=~lًaK<#_ >|:9*t?z]qJTUWT{Pw[pq@Bn[}]VHW"ܨBj62L(wsb-;)˻rKL3(2nX.7:;rF%\4Ws4.]w +vђ؈SV,,M z:zL`xջn\.yKT^/5W qfBFV޷̑l]n;;-fa.nۚw\ՒM>R>zrqpP|U0=W;j?f/~uRE;z_\z-V6eb\mkקur,ܮ[AQtŊ WYN5~EP."ƴeSFMkjqlp7%Q\F9a929^6]28xޖB ڮ^Bw^Ȟ3Zэcj2Q+ƣF(b)4(1°QF4bb-${뻩PU39R;ܦMSBѬÛ51II9rpd-5s&)0 %z/УQ6ڎ0mpfmNɹaK?I׏$waߤU̒_")W=\Ơ.w1FU8tw[;($(EpMڋ;)ci'[mWm"Nĉwؓ#3f$.d^BBVŶɝ8˾f9?b ѣQ4YJj wnwnm&N;_ ϵm.<4NȧnD^|֓. Rd.5K[4"LXdX۽I]v.mwd)iCi6Q} {ګf/!%{]R_m8}IvY6Mά/\q[}TB;-l6V|Nܯy'q{仉i^*z$6l͛Fʾmu Tz OmKuuu)y6ke!"M>Gmi;Voo\G"n\CTǶDdmbC/Ujs"M3615웢$(nn1X)NBҝpN5Ɨ8Ty?;봵wD^l|__bT|Q|OG9}L6qVG{|4_Ɗ>_9u6UTWsumX֛h"Ek˿kkZlRa1L4iD4Ƣ!V&FLD1JJHBHfR[DB0d@K Er܌$`Mw]6+]X]\ܻ6`۞>3eWg%B9aDxWBjCǯhL\ɜQ+1\!Ú˻sFw.c1ط QH諛!>ª(6-Kn]\_Bz_KT_b'}gߡh*ury;uN%'GSh؆TQm[6 ˹;M͖ʈZl%AR0!G sqZ6#%5Dn rn`Hv\T]vۙ˗4Eu\Cw Βjg+ܕve0=ľ9W%G1w>⭩^U'5@=Y_|Dj:}+ԼByVc`g6mtMm36m^w#^NUWV.ҧr^. @{*ʗL.ECبīm[_ז#k[\[caXuð9Gب}J }6[Sc>,s)LCˠ:e>N~DgA;j}/Uzww;sk;˻'erΎvn:knknۛr2swts_0Ivrv{Fmhp~i";$S[kg#zNcۣ[rErl#2&Ô\@3zܴ}H-ܝLGwG?ʪ`:W@GMCTtԹ=QW}*TWU>Ha#u.ղ]~!%:atɼfFDP*ͱh(db I"Qb`dLhI ID66G|ƫS0ldQXaeIj$Xk "FGw,b6n[7tJ]+]ݷwVޥV(x=r"=5`k{k_kTzBm_)J/jq{/(1Fm,mҭdѲVC[[>9*zQ: ^Ulō\q*N/%'=P:RK[[qn*;W1kNk-]8 b6q~\|x0ȞR~Z.C\Qt_I?1'u߱5SX!q}0QЩW)wHD H?W6T=[llڍ_0EdmmqrЗRKil8EG2硥W'E̿$; :SJq@ -\R=)yyĕ-:Iaq*Vmmeh1Fle1fbQ!Al3M{A/2ʪ;P ;m7$vvԾd9«[[`;"i7j:\DvuXz [ IRVcT62ujQ(vjUҒ*-[گ@5'pclҫU=]ORWܡAP}mwZmpѪ5FE0b;T뻭˛Ɠ90W5捹wutIKI˹wlvt9)Eqrۘɨrt9\̛w\Tpwvݝ0$4ӕ &;;üճ]Ġ9%O>IW6WSb&*ȫb%ӫqHQpOyiQϯ!IFVF1F!jBcHiiE)Ҷ~ yx.Tu'|Aj*OIF.\]rxsBZąJx2/#dW9Mݸ4XEIrI9-Mh1ƩvKM$?^b]l6lcg-RJ\©v%y-hޢܢm6-4fuع`ѺR;niư+al@Z?*/ӪyH>RC.X/ +]*3%ȝjQ){-U_Q=x b?5UUJ Yl>'5 xW5kTmET$II"R$hѵۥEQ˝v 6\ۚ-m͍rt29˝+бwpjNnѱgt7;nbs*掹MhFQWwd'rMˋ;wM嵭Mhl6G֧uUKs rE6墓^^T򣀜[lЋ辆Hs"#ZsP$*|XF͋8 qTN؏vSs{z1 +fuӮnvmm_ mlTޭ"H͠PvN(R=Q)z9*rtyw\G؞f:CE_ᵵ6IMU|vIvNWQ&F66 ڋEA3I!cIkZ(EFNF9Qm[EQkwNEr.ED .s[y]Mߚ!j{$u{=r]󜪺=_C軝&lM Tv%;=9@.v9uP吶W@,jjyO`ЈoUT Ѥl\ms;;a\ 50Qk3/)N;kQDst;ffj}EW撏mNuj5ەv#lcv\\ȣbc5[\6ܢKէ(6>x* zӽPu oyP8ނ:fmkiŋXڴKk}CKf';eR礛R%*\Ds;oT⣠пtUG=+\]8%둠{؞ҎJ;SbؚI ^ v2:@dO,Zt9Mn;q3r옋]urvNꍒ9".wvb613u_ګj엘KeKrln~{mKe#%Jw;kLm%.YΔ9-z+c+4m#dW[M-p"}*)̧MCamfQ)PbjBF"`MIh+(iXF+[2E-WɇkalmKNJף(Nm(w'wUNeCU9Hҝ0)Wϫ`#ZefS284*Sqlk\ֹW.ZsrS0.Jp˻ur̝ܐ#5e˸QͮѺLI.iH]smÏ5rʫ!;sz~TY/qqNOE F+A dhXd35)QMAeF !lPKE!JwϋdتG#U/Q/mҪ?^8#mةŲڋjc狯B}xBvShmC).A=us[i[AE8 Kalyە)W2)kMۿ'gZv~CEWwrѷ?svK!ݫ,xxmW0:'2/HҞ?aO~JU~OݲT @}[^IsscWw]̜Ƌn:6J#-6ZR_1 Kj}ʧR"5؈ksJ:eBܧ^. :SS'G^,'^QɔueNҞԚ~:s)#R6j 5;\JqwwpnQE6mٱ\6r|zPs Pb#ukV1B c[X_w\6ѫ6 qmNN8$}dVϽ(DQ5#Ci)#F֋jUci!0~R&?VHڇ[oaѶ6ѡA6R`!_Zߗm_Ʈ658q4mɿ]D.d:uueA=^̢݇S꾯)9T|ڿhffگ8܃ NeJqTNM^Ɏb汬PlTҐ5tlӺdU˃kBc$Nr2r77.\swn.DZW5.Drk7*Gws6vaӺ$l+݄&A<%~d>mE㪼-WNl.UTz$*/c~ 4m WgUbRaF*,P6mkW6 O%ހR*J'K'*t~_ =^e fhي]VҜg6M?0p{/sFE`H:⏈LΓ66_7埗o9@ys VǏB@F̒Y1YÖ}t~L~O2"Io}Jť^dzh,EdD[JضU?6MjI*ivmp㋍"0~V@Ij6گĿ̌T*)jY-ˢ_+}46x{Er5^}U|Hcc wNv4Z".w]FDwUN \+3 J3n'UW/UZ*rUIWbLO=^^AKfl3{9axS**x:0WM&<cH֋cRTj``Ę@1`L4llbkolYQ- &Ba4_Y[ykoyV[oEbg>TNXOEV+-UBWom'Q.HjCm_JKOnFxvw2sHRLҾ܌/UPȞA)zSj[Y?҄_um+v,kj5wWMc]j6lryP^U4WLC6W2vܞz#Cv{K[a@#M%=.lh+UħQGeUƠ9H`z0v%` »2]a Sک{Qb4Jӊ.O) y$rU]5214]5yܐW5stҝvعs )IE:sG [0۝Ӻ8w%F.95\mmrȯAwp+RHAD2+IыQu٭׿Drī8qF~LN5#QQ#Q.vBm%$DlTdʃ%&ʍrUu/u"r_'[#cW:)B ξK-ZK. /%ORw7 /Թ` WğOKm|U\WCá+G%@KƧ5lW rq]P2V4m&a 3` EFɵb#QhhQ-DU;hRhHIn\;b3ݒd9J "wk.b$j܁nWw[W IӺGsۈwGl6U/ rᢞKlWCZ.[ȊrIΜ"f eIGm6zZ/;a_`=cQz(|ل,qHGīvwi K^z&IF$ӻٲ6-.;lmi6͉ěQNRB]` WISK;"yqT^6CZiY-?)Hs9Zm[[[mCܻ]9wjuR>gˎ2Ų܅T9J(\\V"s'USW e8 RGѶ];bq)96/R(1q*@'á ](8Itp`eqESm׬ځQQaŎ5r :N4m$[DZck{ G-K4.d`]_!\$AIU:6i?D^jzjoVW-nrnFͮnb# H2ll4Xшcr)+"ȸQ'Bxe66.b#ĩ:'G4adVbaꫧ;)N]%rnuq[n]˛Y&Wוh;D9K}HrPYJWU񥭛m[S7(s# 9(2—FĝI2Oa&TU.,*(TpKTa>|C\M#3 RVƍRH1dm$m%xjlDrIIAt1DS1In8_eCBwqb@Xܻ4&㸅sݹwqsp.mΜKͲjͻ&Z6&Mb1Ƒیn.8ے<@AέDij|HJll٢'%e0NMlG!L'ʧmW6q qE!=ʭ̀٪r%}ksAQQLhFh0T (bhfjg6G6Sn{X=&چrJQ֡]OҸK¯Ӑ_J~y%|ש͑JK!Q !1+B]Umnן^MU{YNn\s:D TjSRR%qJNAIu4 #Ў:=_'pCRhWfw([Mw $&*q!I>Z)dO JU?Λ6Fgm*պi| Rf뵭[%z7$LbBBDC( 41BB")Xbf$͈ǒU,Xn\6,jA S6M"BNX1Z\6HAw,c&ݹE&;9ݺ\wW$3KusY'*&w\ֺ% ^UxqPdڴm*yxs<=qeyN_[&޶;;張Eub WSmJPd..YE|eV́Đ+BAL"4k;1r(@7Xhhj,CLmS)ݐ_j\E;!)j bkdoLrW9>d ~v{j״޺JWNw[W9nN܄#q'(r;rţ]rP]9;}} ~Nj6풧_;"s)WUv6\q6EuhҊxG;h8f\]˹ncW"qӎ `UdƎ\f5r(J0$S?xR:I44دIG%Omǿ}sLX X%hi%.u)%\uQ]0wk]w\N\kwe9F]`nEƢrdw\8QDt6hmzkwldcLpdqK,yZ-/dGR"ԥI냨')zu8^O$8ղf QDžG@x36?Ȉ2|+moc[!&M6&ѭ;t:\TnsWw9nu*-kW n {WY~E&}kr,j95t_V=k^*5li6jl'bfc5_QO0'~ƾ65lSSE6֯LQmQ6#FwHssr㻪;\6.E '3nmܹp;v6]:W snT$mr29qϰWo`ìʢSƒ$NȨ|x::_ ^_PGneO/ϥkl[_*:+| ^K/}5kݹW.- F#ݢ-_'k^%mk)_U;Y;YWj#${{{㥾дkuzifUH'uݺ 6C͈ۖ Tbhᙔksw;cq]rQDmHLҊkomm~j~)գ֍ued/X[[__ױz4cQkt s-˦Ӻ\Q]Puw;ȩ!˃Iu[n-Z[ @qNG* 6 Zu$G!mavm5A5I2rq f\nnZE`[cN\汱ċh*QLU͗!9ne\F$ KiؒŃd Q,̘,A$0,6Ҭb=6G0B]+vW+h[od7SKs6amC`:7K[mkZmޥj-4R&McQ0FM 6oyk̕_56bqÍU%v}ZVDv<Оy򽢽4|l"d ??z? ٮ!?Wo~ ¿bW_hG,,DVntsY=?q!_ѽߙ"+9K];5EeYC) ڮwktt'scv7DSr.sIێv,k#;W vw7pk˧vns;r.]@_N)fm³d?{?垽>^;l+ ۿ{.uBG {,ZQ1^@TiwwԽ>Jj8A9p9,klTkU~XZ߉EEOɇ)/][m]38Ct[b[&ٛQ?)M$/PN#zH!͵I+ѥflk66-ȍVvmw+6vMENmmgS2 ß %uiECWCض[0I.ZFE $NtIr8uqx1/0]e}yU~lձm*#Y'sGr@]Ƚ)>um~RR/*?(ml|>i..(x{a{e=<ZP~Ly-wfjU T @D B"6*dvXܮTsk76hsnXřy2GuWU66MM<&/ʃ~B#Vr<3FlXѨ-IHnv "J"1KDV* X6͢B75QnF`wC ̗].N̋pEkTQ.:+6IPdъimU|?D[Ko!CS).AL)渿-^UhQE4ڹW?KU_7NRiɹq6RsW-EKtN$롵iwbO֠m[}NQ};6T;ڹD2h \эňbܢ\惻](sqW&j܉j49\w5]λSs.IѢrѨrw.rtqb>mЇm:E]%Us6[kfdhe*,hАLlBljR/c-H\s4[GZHO:j^R/엕 N]vdΨ^Od:<UضKg*ZWGدUmJt{^5M@êj-}[ܤE4w\m9tn;7#ͷbN"vlMЄё)'tL|{mkk-mTgRx00U ׅ1lEmmlkadtTID/FWB/YUlچm.g82EVկ={H%Tb@(dS$BdEIJ-r4d[1R$DD IE1bV,YۆM&;G&ۗvuiƗ3foQգMyT幞Q\y:8ȼa)ӺgK}x/Wqm50j \*7rͮRw +]͹`kHblP]ED%6GY^DT|l J]-\S-[k k f<&ٶEBQںN8/+S|U6N|R>]KT'Qbil*/*{^؟Usb4^4,c lS6R!g7{ZTOiGիՎutmJ_Cr*jnkym1hSl2m:Yz@Hxlh*^OAN ; ^W˓Uú뛨]Qd9ww&$\&nݛ"w\Zwrsrۺ+wtrd1nK"(PQY$MO*{BUx^{&e^m ˆ~SQ;k_lmhhvmkIس(& ,hh"dQX6,+q}U5~~-bFع]Սp6&^OM+{j[ [N+im`jte/_S铦W"ȎxΟ/%,X jM6 FTUj6#cFci (CRiL،(KS2 h(L)XS {EsZ\9vS[ZwQv]5ʺ^½] [?<:4 {OjB/d/T|em_;e2HElUQQ@[wtA-u338ګl_8_I;>{[anڐFyȞ=z/>Vm&\u؛Y#TQllQֳ4TZb &(A&%Q"QFD4Z4^hL:tLi?lnHՉs8ѷWgOkQE|Wö޷둮Qv+s`#IcM&bܮܱFŧn$n汹j 7W wKdU]9U6m3qq{=Ωc\i?_9<2~{ZUwr*Ē(AL]h_Z_kQr]8h6ɴQVA|(_!/#Cϩ⋟HGTO8uRy˪I}+-BOa`ѱf%TXѨ6=gwJH*ͣIU-Tl$iݹ$ӝIp ܁ ᄆ-VJ`(;L&%1L I3R@EƊӻmsm-Tb$F$,t E,+B "˶2SRbe1g ލ/J'z@}_t)%EpGxf*:<.ԟD<"_hVZF1`RHP E&-bFҌi#QF eP%" JjYFYelm-G4zNWѷ!=7|sk`F܂,bvefͶb]_l6ɩ(lTCt AOVm Cjy"mcm"2$"`)4m%6[mEUw--$ڣ^ ]*{:MmVѫcaqҥyF lT_+:'ԥu%vtvUWdG`=|]tWVϏeix*]0ck_O^lQTmh"ōHV"Ҙ&9 e*66rK9$Lk.fcW:n9p;4\wp\uۨ$\7#L.\wh]L$W&V[~+jkmmW!D{/K%32uR2lf|yfCMChmC ҝݵ,m[fwsv؟?CĴ#"'/Uj(-5شlQ+,dkXL.~)W)/ݡe۴UvYNˉ/b5]K}RSwEm+7vir9uV-%")1ZjQ~-+h+Mj;w6Ŵ9j!s5 i&P)4ԅ{ss$E6Gm ăyW:u+ů\q[_Z4iF˛gUm^^9uӷMkr6DQrf\ݹs\r8psrwNsrm\sj5PksnFfѲ<^]j;ddvU]]=OtW'CN: OyO*:=@٬͍V FFM40,PEX*(D (Th6b6Ѳ Iڵ~ᶰE(i+-XֿV}2Fll͛+ *D X?  XMFoeW}{~{_#6 BVߞ6^nnDnk74ӗ .(t]s[Euû1݇u6 [Ky(|1_TS˕ۊdelG/SukԱqJrG[ej/P5CTU [x eoWG'?T5:::T /U+}op.\]0><ՇI=lF/m2ٲ|Tn3lͳVHj|7wmjZdi[lͤH4JSchٛ Q37]76`]uAѹ-v.sIOF z^˚sY3fUQXh6!e _zzcjmF[q [&;#'cl8{>Tw;.b9! sMwm掛qh.$ûBfGdۑEuıX$(`dmv}I>Fe8گPȒW&A.]-AgF$rv豊1 .TFnWss ȮkP[ddV TZBEAFs&M]x U# |E^l-ijRuJ>|i]0wlp]TTwu{U=0\յN§6+S6'p֕!ơ<0O9WEtGE\ߜmk\]v뫦ml88=>< G k.lhv{&ˍqÌ~"kJC"W-~h-(d" DD0LI`ɦ"d#PҌR252ъ5Vlm\gvG'G 2]AJYWgUmHVlٷH+OO'ooTlQ`ت6axʜ8f~v!G@ȼ[3cjefH-3Ea)lN̻#l\jmF3F1%m'?Jv6ixjyAϗw1m i l"a% ^|&_?w{jL OFĶlckjأe,9/BHڍ_ %!x<ֶR:J_!OKwqڶ8;w5@" Jh;A ..ʹ; 'Hz!N:A9)sHIy<ч(_)쐝!^eW+7\-ܤ\lE-+srʎH,i*ݱ]չhYUҩҩIS'HWH.抾aLN5\=|*{ҭ[K[^Xل I$4FŊ661m &ܻsYN7.\q+qʸbۛm#ݝv7 b1#qRp}:E|VffCn3/ rr[ &J:~8#b]c&am\TSlMy NukjߋU6[*m!6UV[Jl=Rعmmgr۔2sClP#'[5[+Z[~Slm[Tbje5&sbѷ얮m^ŨܮNW&KKgQWh.^]/(ykn#qWq |L2PڢTou4h%2 f*6 J3m=Ɨ`JOe+,)S iHaI)B&ȚDRI1Kd15cQ6 %ba" TkEh-TmBL6#lVō 2d dF#XQ"ͣU)nA.&FD;u8fLV2ն MaQ~xKμzC>U;j6+stmݵ[^k&$oSh6z-Lż]Xd[kE8Znۡ;r.;:;Էw".nNƂėw[)(2svf'9a"wW4L2`M5rQJ'uɝ9tvsuѹ˜*湋nfhӧ!\j.u76ؗ;Tgvt$эw\m\۔VܹLlӺ+NܢNαg][sZ86&8\jVr;sQ\ֹTk*1uwm˻r6wh7.s"$F,kFwktwp$ɭ d c[VWˑݬXkoW磺N[$W<󻌎+U*?Iqeض>.G&~QA|C[-^^#P I$F "3_U[`lXh6vsQ۔nkVȯ f^kwr6Qmxy|_'oQChww hUzf6=Oې!]ͥݶN/΅ ڠq$(-Qi.u.)Mwrk%bh9QZCssg]]W7\sd_Aݭө+_PVI~Yi'*w:z%UHPE-M &[j-`mcSFmT[PlS@B lPj% a- mH@TQSc 3,jچR l&Zd\(d>k( PAJ*jHA*U(*P)TUTPT@T$I)J RI(I$I"P$TEJ(Q@ (RDP)")UJDEJJJ($)B PRPBJ R U (PPP6!( h(M@*))RHh%*ҕ $jDJR&!I@¨ PTTa44ll [5kP f i lʤmU3X R mIf) #[bZVPFm-VՄRT*&&[l6aYTB`fX" jjA4m6Xcm HhVi2 Ykk6XlZk,̈́fc l 2!1jk,YbK bhl&`ai!@CX e B @,Yfژ[440l%[#c6a T 3ZmMP lM1l Ya0э$Z&l&`$4dk` UE$ن%UR d5&FCF i& b4jTh40Mh4@0Mhdbbi20 *m#S2@M ѓSM6&L(M4e?DSSl L&L4ڍM M ih 4 =R &Dd&F%6ORxS6z1~ThM=4&1d1ɣODzL)zP4= QԩHhO4)oF{ȧ2jxM4LdOJl'Si23L$ɧd 5T4ThT&M=LCi6h6TzCd聦zRTL0 dh2dѡ4ɴ4LMO#M0M20Qj<Ѧ=&424 MdIhi?UOVi @۹w5:ܻo~#y/aD!-+A@H 11$F!DA}S9r=/{Gkwz#!?c0*C`>0#.4c*L2 6ЎaGP% z5hUF 5%j6)sAtw\:]67.(kuu9y^[Vm0lj?Jq.G֭oϪ1#+2"5"ű%4ZHYBd(ڶշ\ps窗c%Q_ѭa%˩_kAb`Xqv+[W--rj-˼sdT_ŮG!lW7mj&\WrJ.+m%rOK(p=S qqUƍSkPr.8l62l9 ~U_̕$_9d[_ϕr?UmD?SWG>G'[m[_QbX6(J j4cߵʠ1A0xUK WTLxp"l\eAd滝lnmwvۛSK$37FRht-;R2+ xWb.nW<97ExNo ׉xm6wtmf،hDhę^:s ;;wǏD#E{-js1Bdk4gdFRxY%'Rv5m_ۼ 9*/liWlᅪ5ʳW{PF(Bk$Ƌ(&ldMmeDoM86'R!/DlM==G7$mm~lm&̋76+emk_},^tP\CFѳZ-ADRiIQ@XXcSEU &ѱ$Uw[b\: Eh.9V)0J-HL  ![շBƉA'UkͨOk#ѹۉ?OfL12;Zى{:_%}JֶZ]HW3q3aɵUCbKlE `# Pf&k,ֶg6S?խ®'7qSigSBr&6O]ܖlrEÍpۇܟrN^œx%[mn<ࠧ[!W:m8mW†n[2hk" 6k1l-Κhwk4JR)0iٚ*E@sUuW\Wwb\#ۦv.[]Bnv9ٚ.˜‰΂(e 2\ r'&6m&qI*({Woܞ+ǐ车ϑԔzVc-⸱fܟ`@#:[/?<;`渚)AI4hcntq܍;%:jmⱌ'qZt)-D fj 0;w9F].:Eۻӻ,؄N_M_ֽdK5;?Z}88k/{Kmmz[Kl3~V­^6B FI%t鱄Q@wnEtg-;L d̢(55;ru+.Tua[r(BdVW' ̗'AIwl¯i*_Kh};_mooRsܮm רüxsש=ʭ>6/Iʽ="!HzCxf`ma1ÝnI_ڷ|t_]EDv.Zk~Rvdvw'd; N~b?0U~bO#<*y96ƔMAUݲm/DٱWEis&i*3iwQTW.#urD.wW#s]6:\nK_W؍.Z-E3fLq!snkL]0Ӈ+eݓsֶVh9[9޶:Rފ_Tʿ^^K p~ *R"]Y/0 >Xe h^U9w8w;mWzVEQ5Wܻ0&bIJKH4?6IrU d'ۡzo|*5t^7&nVË vBb AKU̓yҧwtdV]e{'yn 'ªEQVɍ1PP[57.W,Nrjaʹuwc86ՙN:z=;5vgg]vUj㍥'; wCJս]+oxGƕ~Gިeه֭44k؊ƌkEF(-Dł̈JcmQ"*V7[.N廸"Ngg]tӝ:qrvv+ N5!#sk5{,Z!UM̻lg+Hd'{Wi;ٻ{SUK/#mYqwz%u&!X6+f6alz/A=uWHzC]M˺lw^E^ [6ϑW[ljjjӢ"ww[rwm`Y5Z=Y%_`"moMAnFD4E~Z;^Oht*'HI.}9~ϦbE1cU혤Ų[FREPj(%Y)LQ5qݙSFӺ`]ݝ9 F" ߣߨ],9y+UWJ])S~.w]٘6,7 kq֊' $wwywpq 7QT*T%-iM33KQbQ[dwswv9[5\v`K)2w;͢F4nκCrFE's\];nX;wQEmKfs!wu͒,44("(I-%ǭF%Er3ÆFr^;73>|SU+jCchOvamf62(Tl$Z EQkkx[@r`tgδ*]PeDyW}R5l[[C>VMliL 4RD!([WoVzm77m\ܢRZsܿ_d"q+Nޮ.4c 'mU_ WΡ.cx[mmaQ"9tX%ɮ 9ܝMVz*mq88c~U^+tt(y %V{9sGmF66"EEY$U6QFDSRm{b).[\ܮḰEݴF̍PA\a%۸wwF37]q$9:J6f~}W9W 'mSm4\_Th^|jEF Qbʝ_qlg~Ib\UGUtu4GR6lfg^U/}UO¨AU^H?TVFЏl[JxRW]^=>I_I?M ŬObϙ}[Vױoa{ ]ZZȦF"uF6Xjm(maU#m~f;z=U== z៉is uq̲Xr 81+f+Q=*tt!!Oڜ^zGIsP/*/(x-x ߕjGmVj<::V#-fI(D2c.:Pr! *>e[W|ٟ5q~fJaEh#)ңE!v6ZJ*Mg^!>+P]ܫԂ)^}uRB]Mf[^2-G͋ikEc4fF6.ґQ͉7+̓G=>}_wmԚ,"][񭭵θyOflz lmjEFcdeEF6 Q !1Eb`ѨIUF[SAAEL @UUmz}}_\eՓGKoaB{o\.\@}zYZ};da^'{:?H;jNڧWlNr.)w療m;ɜ5:HכvU5u5ztṙ[T8٬N===:zqIzI{NiY׿qrr_J@m_DZ|N;ӻݝU54miƌ& LhH,miWת3+m.g({ N5mM͝Viʾ *tJtBЗBЯ ߥ'8w|\gvtĪeN~C6mfF4V+AS#l]XX6Qfwq%ط*utHKfM֦]A:tO)趍[-;&g>kk[Nm)(%cd^?aWlUJܦdLB1ݷ ]u!LHa3tۚs[qQ.v'gNJwvˮskRnmBƻK\cn\.H:pq.#5;$GjگÍ46"🆮g._ZmǭwWumtno㔓~=^vOxvՆ.6sVcgu˛pIx6yGVmWڋl2 d\7.b"..+'S[#S(v^m{ y#{}UݩWx>Pkx;sFxA|ny}[m "Qdщ$2ɠ$Q Ţg;w:'nsHvL`$XA ,QGZ/ھ[fͶ TG/m3+E|GS򪭷kOշ봻wdbWa)w__XTGOvWTj:uQu7=Sb^Ѩň Dh4UQݪo Ywhq9/Nr_խe[$Nߣ f͵/,C8./ mEic&4Rk& #EEd4Cb8L[\rlEKrDZn(ĐEiL':ݻQb۩\#bY$d'u͍QӭͥYX2f]݈wιutˮ;]Ӻz[ܲ~-\i;w/*1{WUenN]s\4#frR}/<_/ }}xͭ\o*S!DQP1.o-m[Q0L **k , صL&63nmsۻHG;s˷R,PWwn-zldh4_"3ǛMmTwi}mm)uW_u]uta6[81fH_ xWr<=dyl8Xb9ιܡ"h$[\ )S<"Wn8g^bI? ^jdޤ"^JxS[lԹA8%GP3iamki^fWmUUߎd́oDžUVCun-$-8=DxOuYK쫼 ]75!6p%ơ B"bQkV5QHm%TQEA"ʎ\;h$.t;n1\\SΝYqm)(dyЫ#׷li}R}.v(엱Ư/)mml+\km\8-xw=/Q`B}>ymD<)fT~8^.]q]m?Nw;˚F.Mk "S614Vت#mTܸb1WDWu^͇{]kf{9*}}5n5rn'PrN%dOwbW5u$FM "K IB )QӤ]ݮȓK-|om_ ڙoJ޳&rq}TmXZ+zĆdg{ɹ%;t]һMqQ08?K]!A<G@C9kΗ/4E,1̢NQ*Q"T$q_IJ,c&b>\%}r$1-LC_QJEp:bcoW \BƯfpE횶B}m=;0`.#0b&!m?zJ$wa`p1F/#F aȄp9 ϣ1̃є# )]R0 !`)'g?V `0}!lzyM r_h (,09 9/qXF B.qU xJL%ӔX '[,&1?S_ `` % QEJLg ш-j) P)Q1 `1B2 j1b df T\:.F' 0wD\a#8WQ4J֔AS`cy1 ^) DYH1[v7s#Jd(RDBh þ BAcDQ`@)@!/.;zɋ^_C|_U_jm滸EE~0G r\' D A BAF#S8 xa ! HQtX"\Vqሀ뎃@AHPAJ3,`D Q!@!F2!INQ?hNhA,L!?z b`ȃc1dF3(!#LȴEPg*Y_DqH|H9$H!`B2Aȁ`H$d@rʧV|Ό!3L!#j83d91 $a31,b EIK~T8 @i2LAhFGPD3)ڈE/dq:TeACr)GRd#?Zޟ+[#Ôrrܯq' F"2D4d!@ !@"!8(ʼn A#PSr5Q2@V`&#p"I(uDDEp:,H e*aIsb "-헝7wo58' 1C)i , +W0QCpdA@Y5 u?\!NA7ĥ 7,CB!0FC1 kLTs$8%Չ 4bHF e#J/Nww;dHy GsIux8Rpt B0A$9r)UK@JVQ_8{ku ti@RHȆe ;xyD8+_`44 6D!G0P(a`9LA^t+h(X, (@ aba@a $(Xp)!>_#>PS`&F42L%'6`R6 oLWЬz1FjE00R"RS S1D"J~᎝S8&B6vj^, cb,W p ?VC:DPfϊ '(\\4(JZ_?ߜ F5hZIZ6 i$LFb Q1AQ׾^&ryRR{m ;:gnљTIU`e+dri}ECa+B$F?,s\8,\- %`[X_>b yjLhqC/` 0`yD!yba~)5uch]%jz< So#*݂ϛ^}+? W4\D\k^u?e-k hL9t̫p@-q[zHn =Iztcf>M'IN8k_l,& ըĆݣc=N&q>7?N8|R0P|5U\'BK\BA+a$3JBֺBӒ+.ʤ5W0rs}̳mi\3^:"[H(f^S$K9otȽ8L}=/9hA\O>jYlp1q_Qf\'? D(dܝ.G`Nn]g%L4Vݜ7"ΏҽtD{^Uߓ2!bW}"/Yu5tR2f gX` GIܪ  d85R:tx!\Y1ve8gBCx1d+X+ \oUF}Hhb St-za1X/Eqv &=w(“[Rŀ#D:uBDxS=CYk'=+ !bfd9Z5W+| n>zɺUvi95ߜ J-,=cIƎ:THO!A 5MW]mG ة}3)Big]"2@FcТXxM;/֋BdØOBI[^1B|[yGvɬtӹ1].8׸:)\t6nO? ,xTK(lAX,U 9x7 veTA`Ǽf˙) \/!kFbVZm"M"iTn9MhmcׇN!Vw >ykR/zZ[9qYv_=,JN(v#%,n:SVnm :SB !qf?O̻D=: mo~֡8QOSz.ޏq~spȀ1nw9'x()ATGƏolzm鷏hI(A;_SE1g*sNt|]狺#J3b0L,Y dxa}ͧ^ta-^W&Yil0D$Up@<4{):(Pf>~:Ȏx5PL4|L.<^0etQ`y SgQ-#u@:Ȳ@lt + :u)6;;t(ZfK1AL`@ZCHY-CDςareH˄M,AEYFOflq8Öatd懳A >IK3aTVZnY<"4Vb3Ҥ@Pa-AmǦr37. 6Q #LiLPoyXy_P nz n-濆V,u y*W#V)cA,#1MLw23bY&nkP٠ߴCIuzl a [*ZJmHX 9*A$0jLZ(CwtI(vG9M ZsCJҥEȼSS)ZH&k2 .T"g0^E w6'EiEگIe1#OK=cލS-Z 8Rwz5=!$mħ_ u-foC$l>6v! f=&c4KUZu'ʇ} hnYSc#yHl , ^m_Q+cUZsXG@'DeN ϠpE |xy4@*E)>C:xݾ;||jjk馺sA&%:@y`6: K*1o l6X\Ts8l9h {4+-4$yپ+yKۨǸA8DĦa(q U 47 dwXfIEX e,aG$ɒldAHYЊE]2sCb62@\џh%5AH8,2\u蕧`RD0H WRgo r5ym^ !O..27t-Y;*ғ_]ZμJ"âZ3=>x7`*5h.9R,ftVc#1]m\:D/-9-O J2C:<ge0,QYJpG2d^-5 TBv-Eꑭ PmӻJB/ly.TMp.582 [5 9`wtV"vL Ժ9]R樈serB ϒYTQ_ZV\i&MB'RQ8/aR5qg`a(pAKo3q_9**xd1oÉ8J xrr zUm,QIHGy#n'in.5(a:fVbl&lw}&-ZWp: 7Wv =; D tA2m:メRx4c˓ ־ɛ Lc2ɸӶ~<+x"dG,,|fCEr(t~Dt >)sIq{GblI얮%*h_xEA^:g/ ݌]m)blQDZQ 睙/DifDi VLq͚k)hV$6GBLlêȓ zQ; XU"8O:>v^GџG&j--.?gt4zMwE=Q-QrnC )d{SF;Ν.;)T+Lfh_常淿]}X?|f2_{KlsEfȌ'2OV% /dL`uF0w9ٮ NwuAm;vbV*RA Jtu$*Aac>7\lt +W\3q3^ݪJ0r-q+h &W/+]?;\ (uCO̔ϟ!UAg-;nmE,R $LGB ӧz+&~n7E?\G XM hkRWͶ3FYAĭyL6ٗ\yh玧wtzQ>P,zbmAuZ-mb,*D&܏2'c*#rk_*@]aIƜ5l%r^|^Am}z1'"X:(b{-OgI^?{]/UӹuŴ nœnX 32\b]1MuX;ɮ;Go:Pj6=d:1!EZ*)&ƆfuMNsPfhM!Dd~36Aυ[(u֧%Q>(VJiC.H9q%t4PcOZz(e 9#NMA_!/L0`Եl^(" J=,1uƎxcOL]!t"21NH!u:LhJGғH0j (=l yF!_ڽG]ٶ15`7<;|R<' 'ߕ:.ğaCv#6IK^f52~ʾds/cGvsSbVҾUZq1ĕ;01TWy}((X\'%]>ye5 sO#OoT6gq{ i5[QhȠ#9{İtrFčWDAJt"t9bzX:(,;1~A9MSXC;r)m#Bc] &p)@Ϣl?m^fzhB[1btO zbf][c^DOun aWETcq{Sy:ɷEFU.(viaݵF¦}xTSXEC9&xa- qdFd?J@!a@΃-TSAM5zVҧO񩧨8㵜wnL۳ɻ?Cr,os.AAoҩͼmrsezEDQb>E8JK 𓭑7l޻YWʡUʩvA CX۷yE;3Lf-aE"]4nF`ΈJgx*Yx]+U7_*lϦf]s}j[mls+.2L (26p ` :bUpVlvmh\tl~@U:dR/2|}X\'?B/[/NDTlik0Խ@S`[5%8TQ#Jϛ&j7Ll{TgOsu>[}%V\,犖HsڒTM7)sKN_`'=3CT=j&gONz99eYk/Z_&Q:ׯ[_,2E1jǻRGC^Lvư}cXǩ*XZ3ѫft*q]Zc=l}Xn3VdmDu&?>[';vIB +tRgu6(]+[)Wo\ڷT=6 ZV &Bݔ@٨s,In8$!VlЫeŇ|`o>\`enαR'Rɧ\"A4е4$CON1g&ժ7̚J6[Qs,|#y{\5 ÷t# w;\+P;Ѝ.SP MȴE HskVЈJaJb1Sh|6.L-(LZGĢQ!ӃGpՇlR{Bͧ%%"s'ԲMW(5J(nxtmB%1+|CdѺ*(qA7+8p$Q-ݫzx.qK* hm7EQ/ߥB*kbr:\LNBE 5%=̶Ogu闉LӒR/dǘG~ Rԩ'Sgkym Ъr6VU42PuA͒jqQ?.4TnX U$VGSl͢Oo:\͢?TOgo~.S N'y!g+x .%Qxt˷~( ;CMK^TJjs^)Tsc.Ns;CwACTn>iJqJ FpBCd!O3E1 @1 [<I)h[1Wשw_RdhY[7O}>{;[B⯔E[,vX :Ψl5O PXNl#dDwGru2ˊ%_U#@P O"ȍjl 9*YI2}")I?}S *5a#Ф0Ux;eI!žQg L;mtd,qoCu*S\IYbZFE9b~zT y<67͞Fw뻷SrsrX"C\ :N~.BhL٥dzxzWs`K"#d~ ($*s˨6f4bz$;ɆT:\ƦV7>Cַ6@`!D.30|ޮ5: 5Ὄ[JЂ>X)ދ'c:/Z1},†C)$RbRd_&|;!՜8Rk_~65m׽ L jsߦɥ5(k"ǒQdH k@tX%.KsA}Qhe@_4PE2'LeU1 llC(Zs@X_@CeīJy4n`^!{ԈHHK"#(oꃺ1mEX"Aj-Ȩβ݁…9`&ٵuX+xY~wi1jƐ#//P.*y+dxcx 2ΐZa# mBXdlGQ P̹x^fZᖑ[0m{td.X6SB#{s̑XKyXcX?cܥ շt/c `ΈQ-QYJ1WzOcЀkv·l.O'{,jvO z!/=DU2#FYJQU&1Ŝ*"y02(K*p"31I(6֙7316<2+Si2ҩz 䣬@:ŒȝozRY!t"ٵ`HK7|BŐxjlI3d28 KhQhQ$I7`uE3zIbkQ[ΦU( mJ`wS6,=g(E6{lh]ѣVUo`zs2ͳ4|UyC{r#a$7{09OqĶPI2-'uRvA m$:E@S}^ņpy$'ɖ~75K-^|`)[WboN:ك7KƠzARgVz}ζAkؔU3mm}M7oYV{Ysdc]7anJX_ %= E +U{^oTP2DDiāޓL1Áq!L.{|MIn[\P^<-m>w=&[y+E)!I:v_K U>ﴭtA TBvF>9ۋ zTЈ3/c-¦'%҆ hYJ3ZgvJѹrr/Sl#>eyLg[zLA]QԚ*PA")Hqʸ*VɌޑ3>P׫ď|uܡƟ32ٛ }r-)6M#rZBh-Իg]` b_jփD ^2H pf Nb+;LJڍLCq //x"1=ďݱ)P8Ci6{/eH0W pBBgG`0-:;0>1f78["HH? DZ7V#i44t]Z OU 5:fѨ0=/'cJ-bz|c~K髞c9NxxE "@=ԋᴸ CfҨ}ΏiA$@<ЊfRPQ/L:Hg2A*ccctK,ziB *hdNy9|"F:5^y X  #fI^5C Z `bz`lZ& [ȈA'RD$[!\̫œdO$XXэNGH#41+(9ݘ`O"S$ƼZt2F芣vLO7/v-*{Zc0> UN"ջBaԚ%n[{/E܎VzgPbqIAxwwN1(rLTD[PYp`%XaYW#;LEKˆׇfyKkQ0H㽴#-M$0tl֏I$:p7qM{Dceh%JŇ ;T4W6)ݾg96)Vk@+ jW)B5Pa_jd#{aUa  QP#"&Tlҗdq԰=Kev$:a p`qpdutQm)҃ǥ[Pp5YquRYg7byM^8|_3 #B #Tf GOrwytƖxxaT|pgT vjҊ)7!SU\-M&`!I$8q4cm`@u"ۮ/횥 W֋Uӧe~Ōoz;‘D. MVbw)(aM3Ja|9tq&+M?'$L@frv4u2{Npє#N&ߥūGVG ޮpÍ4&>|;R3%׊tjޛ[SۻgY.x Ziv>>|Oi?ܗoOUhC n:Sʣ* ;1q4 xTȓJ,lBq[96{C a>ԀIw5; ä[V"}$8tijwZzO3[&&%ß,{ <:bvptzb rLf! }aCx}vPG#tI"X6^AJ?b}Pԓ9 ^Wy_gs0Fw(c8<E3oCWR ~ D-rWdX)"Y)|5CtjFrG1݌4=粑DkqX [MN, )g\{_kttr@4/knAu_ h<;>ʬ->o d(~(#KkR!a|FchH6hW`deMKsdCf8@EPׅ3sWpGq R^HgquqtgoB ]yp0_V_ `aA= rKMzt #d{dϯi[ub$AC\?C%^"& `c5/7`WE7IU)R,] @vj˩j}&%A*[. \~baN[Sx^xq>E.#D] Oӏ&.O rA%иx h^K _Xc1.vOKKRwa|53Q!` g S?[4 #sDEtݻo;.a-a.1ʼnUw8K b`VH^#cD 0B cD;$3Ss%WZ(նe0"ަVhKo_R<0-{5s礢u$d%Vso vBBdF74=];%(:t5RB8fR6{&L$.ם<˵u |d/΍̘]螾^SA-B)d7fP[_њUR guw!9[+љ&SZ&Zi=U|C0&'C(v=שCsh:'ag>!Z)kCTK(!PF7RnˢS9җ\SMsP0Q6OP/ǝ]q**T2}s xyyx6(]s.[{瓹09uL,Q\/e|T"^6!NƽzxIy8ϨI V/*rV2z,\5ve.8=#`ŗ_v[@-JLܽfz\GIWQ.ђ=.duG4Ԕ!$?iWFa-S 0~ƳJW8ca߮8*NֹlA"Pϯcܡ@M=8ab4ls T2mɩRj{Q9tGS d ǟ=bPi %nNWJU}&4:PB#l&SSq! 2ξ#oL%9xwdٲhhbH) i&<7DR㢞0 SˌY9זW|Pu.ɞ%YN!XqF@:b*icY,HxHA2E`7] >tL ^JHQ ^ʶ&t6p1P~6}|'N#'Z`Xsܢ1;ct+ Ire6DZ7wv?Rx!Z) U/A,vղH [& W2 bdA,V5hcth[LCh}_Ojmwu[r8Yi0欏`%`KZت9E®<?"VX%/[(>Nf9\t5 +bwGD&ZԉCL ֈԕh[p&;mrO'ܨ,3}ήpHPͲ!c:Pda3ujqOPp(\7;QEɉ3 'FuNq%^3s^eY=qnD,RW/ҔodtWk 5c~Z.0P5-H:\o|Lݮ,6f5A<v%QF lb-,2RZ *Q~idŖ[:嶝fOs;W)a(4iedbo6w)U(o,ھ^}`j;jb Q'͘hhޅ kO"+(쨭 @N|<0ͦy%{c L@fHOChI*tMIG^HsD޺Χ,L""ЛNF?E[Ӌ]Gob`A;s~:]\-E=Pjދ~~|brxJmDIVXDP/JPa,q<@bl{qLΞ}ir|Yo!@wtصo~'Q,4©o^=f6=(QC[09z!h3feR#D2YCUa8W%F%nb[@dEy5ls޸57C@eh:,RЈ11"As& IUnw촘d:v+LuGJRN`(e*~>ΫO$ =ezt挎vvߊj45>⟓z*X zq"-?ՊZ?iWgX>Qٷs,4 ( Vv5]K϶^/dFc4ҊrY$ Gzzږ FJnMg|.{7h݇gON^ʻY|>H[Ԗj噎x"]F)FI6l0La801#;Nt[MXi5m:@i+Gn>۹K*Wn/ur@vdGlJ41#뀫7fwq?Hޤz(TK@122A EDICxvM!WL"ы8vL #N/BJ RGն6*GJ͚{LWGG} ~ hMֵRAw4,qN~요]H0 Jo|B\i1 w!~$x0DH (>~mf[iq'P6<2v$VMCjB>Je"Fvm"plo h2í+<-h? a{+j2Sso ]5}ޝ]~٩WKˤV98LuCU N /_ybz^*!0/Q^Wnix_Ϩ!t;HYp,\k"M#)!Ydc9 yP", (*ǜh ͐P}@ǺgZ5WN# R@d:*V^DtXMWPe ${F_-uQJ+R?2\3 [W sLVK5WYtxmfSaЭ]XAE!M~ nYZ,{l1!pSV,[}6#:fÔgxAㆢ tЭVXvyпSҪ+Yv "]MݡZKoHa)g6]35N;3*&&:o:PG{ؽXqn&8NqO_WXn.N*z9}{4747}z۟S6cGyeUGd5ZQ) i7}^uB$9\' V*TߤgH:TƘgO<]RŖ9Q9đ{ЪZJyJμcQQsk$hUΥ9\ ?bxqp}UgJKpjGAK|IĺkX#tkFte_,ԋgyvbqP$^ H\wgLaݫr@$"޺' E(<|MUSՄMF0}4wR8x& yYHӜU$kBQ !$BhMYMBf )u3ac`dJ'*a h,h"s锾_{¾ޜ\ ~yq::|ԼKtp@q.kkT74&GҮxEє6ҡ||f_JcTqZf(|?Aj3j;~|eqS&g,-!IXCmh~MʆKGʢ+jķ3΢/gەll&;b2k `b%0%m}F8f.^aq储7J"٣ c([/wC< iϐ=07 5Ȋ">.zS<7_c|ZV\Ye.ޏc)Hvs (Z8W2;&avzZc@ EvE ή7>=hW (nPIcD40=[U cүrOd'x+b76gYL Fk3bXBOfG8cjw_7C L5y[ [浦4o-4r yG buwƑ?J 7[ .RkNqiԈy;Fz_D/sT8|.bH7Ϊ5BVㄗFi{óZ^%oy38~lZC *E> {$4yVsȹK=Y<%؆.}hah7IRW[(Rz+7uFִN^c"Yb*A\+M?3>.UN=h[mǣ1_]0za/5cojU5MϠ:5H`a3x+Ps855+MZe# {2ߕe]Q|Vd,@0:mЁ*riR81f!:z\u(Tw<>Ұ==, ƍ̚&cW7s\X8Rꗂbɢ܃ zq]}e@EDu!wV_q1Ym}`q֟+ຄ5nSr]2ucK~BP!ZWKxW\trq0.]zO(+c8 G)[%2ֱFo^W,Sr′0BRg1 ښ\7=^Ά=:IRbSH|FoyX*sqe9( R3y }G֪|Ƞ`D9s R~z RLݦb~uAVȳS%@mZls ,&7O>)bfa-tŽUBчhhQz7#a#tx0"I ,D`aFRoA:!lJ>5i TSw*aAOIcG_]TR|!| Q,+`oR A/{Ҹ]`m /|͎w6xxr!elE[>\@Ehv 57(yC`\_@50d7O:4&H ܐi{;VY Y;Ô:Ӡ5']ixD v#3i*,@u+o5*$βz,AYKid4) 9H6pĮ:£yF^E$;I!) H:v&;: FL ;oфujՌQDDɘ3.h콗|qA@u%痿q}ʆ;$WQT,;:Nn_=6KK|My7WGbG0(Gz=8؎ "b|,GspuѮ Z9Wtj}6CTH=)(⃟u{q+\JO=v٥a>_bC^O}\wz!ҳvvgy@bxuq4N߯7p-EEX6-BߜH~J6c]EUu̝Gv+țT 2/65YlEi+vr=}4}=ڶ/u,&vAoCG.%aiyk6ױo<>)%M3oejb#IԱUnRgaRf:pq+<3{TFa7"禮rcZb򸅶-׃7'*Keu+Y1HJ(w@ s=hQ٩zԮ3]-,]"X=)>ImͧA%r"3gCt<5.5)$K+v,1νAުصcedH=K;r[6i^lgqr)cINC(PFG V5#e$PHeaNwwṈk)e0mLBeI:jǗPlK!TBtU7{[=/O!񤣊O .Zpo;hsi4%0BW%[!GZN[{b(G=iOn@yMNs`J A"nh5qqOoڪ78^~r+_kg֫1Rflg|΅UBV rmS`YY|ܺ. f;+aSc q[J<`imYqt oZXiѯݮT &IFw8V;N׬.(XE󨻌LZHAg-3Jz\΅No5@XzE[L11CrjBR#Ԯպv>5 '9 q3}vWRxWayoxgfSSe;JظG4;rCuG-1zlCq;Ǒ2 ʧx LLgFL$U/Zv8=L7pUK2Ѝ˵asd EeXP ő:[j|/ao/tkmp9J׮E!Z؂U(?1MLx54s s:~ g"YqP3c0JE]^Gݪ8_#&Cqcv>sy.mNh4#Ss#+$Gˑ1JW1ф Q6T_ L̤q|A`awj 4-hF8mrZ;) *7s޸~ǻ=313+Ébg4L!{ۤx'}+CYt|íJ( ϿLK.˷?nQZ*'t1XkKAJ4 =,=Dtfs/L8MƵI du.OLE!·^ B*b2HD"nx~flU\՝]!tm Ѵ_*!NQ$gm٫piOr(/6)FcsƘDR +#IAa鎡qӧ@r ;Q[ֻsYn8SX2dS[j5OQuK|kYupzދSQeN@cae1E{S(PXGhLj{Ugc:Tǥ_;HYbLgǷd3$=KxqC=jtng˻Փ* mhK1{Y@uR;WJI64Mh#ʷq>sRhx~}'ދ4:ùy_'-0~]A$Ν J1٤ 7B]'W [t?ķ;~@{=Վ.QJWHgpągBxD~ݢj2v{e}%Cwb5"#Oܡk.we%:mCpV&+ϙ?zn [M)d_N!>ei\̸qh8G9>9:$n0ͪ 2Ot3Ub53/tCJB1oR)^^8OnPnKM/_yDpfr%jDcbdX2=.h8:g3bdHsbq!"vܙ{ QdF6I)6BdVE>b׉IAidVlAvʟbx|toxCcphqs.~a"-q1VV͔G)V8Kl # Vj]nb#915`\[漯AQ9z\.W$Uڙ`B펽s)Iΐ%jj^UN;q#B]~|ܱM9.QHF0w ȔzS7ߡ߆b"Wv8ɮGEwVWL2ۖPg ųMj gyBJT{)LTU2 E;L:(0Lh x_:bH!T E2F gYJ !vFT$Y6F̼Ms8K/Ȏ#yr˛ REIW b٥׈jw$-%X8u:".R~FCtˠkSٯvakו udji|;K)p}nQO$14|$, QptTd4JEN** e/5&D0^Rbunxtș[Z& 2O\dZbD$mD*VD䉀zF4::1r3\Qz"(\)xH۔L ئϸEX3ۜAHNJF8vwזj+60)S2YϠW o:Vqh˽AY-1V"sn}y6mi_Vtf8Ppf y*ޢMȆvk1.1Vj_nQߕ_i!khYA|^$D%G\b$ puL%ɇ2{N}~C M$V aG"t0f"$ӻZV2Z<ȎXdʚ?cg %e'Jу!U_an5(wNJ 1ƫ n1L.(HFYƓ{5nFzT*Pb#,) F'1j" r4d.HG# }q;,CEycC˰*{S3-,hBIEZdB}{󖬿ϼ!ky2g$M1M^B\i\D^!{%ό(gύYX-bN˂1K>0/6@DWi#MSՈuLta@ cw@L;E.A,L@`aYFq '9,$ZEona$ܩQ,d00 ,ȠqER()F:g (pcQmL! galϜcMtOȿ׊ YtGZ,WFz.]; ?ooڬ*|_z" UܠfG6}mܥVv֨ @בI(ktaXP;(#?2P0%@R~"lѤtvqG8 2aZ,&LP8p]Uev()Uhz]۝z/j_`MW7 AXn~.]QY;]^ Y(çf[~ܣ%ϹuKyOٓ1dfNKKt&K$(#-P*t4G'}Qf'/-v?plӛJ䖬Z]oݐVRVF |a1^k:%S&t8YQ\T=ײcVTUU* EhB1Nj:^\'":LT@«"Q2R2/e# FMX'5~]˯E Q`@&sG05cp1j@E>L ո(.m-\) ‚IEzŪVR*PD(`~ןToĔܬ ?';ɝXemް%C*4OI,(E)pJUZ%0d͸e"|O:eʴNវ* $ؤadX$"gew~h4PTd32-V ꀈB6X떭iv2El#hl])ά.lKO04}I2{7v+_ \s{vi]VhELԛJ]zbtz5ġ?`qsvm5l~?88 ˆ5Y3$00 7ӯ dxd"^znϷӣLI+Щ޽ .D&:sP5AYBiyWϯY.I5lEz#!,,J-5D[3n I1D'2jn\K}f1]x⟅ᢚqS? ؝թG6ZqjNǕ"qҍrGqI$D.Tyk+o9nQgv&Q-ЈGgPQ$ ݯDԾNt. 4#L{2Y,= ݿ6^ h0 .hE ɯKQ۶$h߾Dq*wgK>8w[*51!Y#-Yg݀eXxDd@96YNM"GV,M6%[) ܷL'{bi蹐a;x&6`A:"_C9qS}ug"Sjv|[1kd0IF|z.ʨ:3fB۹4Cdɐu9VaE-r< oN?TMָvgi{R- >dD®fL4~":jZ6|]3]=}lPu&[;oY4 #ug\uш&,55N*u`2^gVC"mX^.QaI5ݙ)yQB6b|ABlb V0 ѦZ\]*CGd`W3A`*M .2hz'aFR8c, qE$*W4.3sb65 XR DbUvbka ޾K ְE"褲P0Qix^V.ca+5t[RMW3#*@]3Ţ)%[8_PK^-LtkRu1*b#"Nִ%h@nNk9lYBSZ>7mw˩ޅ,r[z+x4<uGT;JxI]{'LB(d{u'6E5C?FeTOk̢̦l5k0Qb ui1~;)S+W?oB&e!c2[LG<#]\#7^J9~,T 2Dbkkm" 1M+^jDz L=y9Rh+L{.h#(wKddGMU $Ӓ]߳ע)4,[W#qוY$kn>FϠ$B&נjN,j#TE:tYX0avFǎ7.ȫ:Tvw쬳K "W!e٘ bX4* !9k6 +5I[>C]cՄC ;o~&H,#-y[UtS0Vr梒 Mb 'XAR8RN5xإ<`_p`'F]zxqc]E8W~keFAW X1Ʊƶ%9F@=. #m]$1Y0QRFܠjݘBDBj[CH+ҳU_w"爢O'GJ/HWBU\y&X)"h%m0\ ⥐eIVZk&r+tSXe6xg% Kؐ9А'.ͺ6b0/qx?̎;0;#(L:67[Jb拉lDW^9X9#Cڧ +"d.qIŭ[e'U)ThHQEpզǨ@g<qe<]m[/nc,e+h.a42cjeJ=DagYQnfiH"5]wXz= a{ 6&fEkmԔ@ҵV]tCi} Yrq[s"QTF;VJFHD<&?tW% Md^[E1q;B2hUP2-sSRelLe6l Ҹ{V5l$X6cn-hˢ;Ww) qfh?}@VHĢ쉮 D%FgmDo~ZJj752c}*שiͯJ^$1L.sѩŶeؓFV/WnX萮%U Rr+z@L2EQJ#O,ߧɃ[5FR1RKm,tiT f5]ɍkRY W1|%_˛wÐr,laC0%f{Z[kF_PUoU uP\]Dw>]:0#Ya5x>OܽMyVP jvvٳtd/Hm[T[S"xcX n{xiŝ\A"yTPpϓUSAL!auI-P,ʍhjTFl7vW/p&Xm<e?h\- OyInr:_q`2ǫ5Т%CMo9M`Y1/?!ug_FT-(r4&zvOs0kfGh@7kXiGsYDjְdY֫CLJȆW@nHLw« Up@iԱl=rc鹿Ĵn Fb T 1w g2&ѻ8 :dQbtZhYwVv[;]%7!5Q'!N]L AeAZzdGZ,)Y*U;A}C\\WQ2W=,dM4pngBf~ArC_i- 5oh:frokBp sG6e1v"/xRM.[`^e;BgCgG.MhyUObAPe/mm3V7Y%l1@ɹi\Cm':,ZٕMM[wgK^YeJ-D_[H:9p5nۅ&wJҤhxI>N ݢݭƢĊWnla\;؂%,w[HG47gBw_gAhe,\~L8eOQ~Eמb&sA X&쿠l# ۺkRB -2TBV0`Wٟxj)7SŸ"@EM&/N*С`L?fdlLT&F(t\=E{/K/A3%|M-Q](j1~!vZrdy!qv ޼@n]}z)&=WB7S"8QQ%PH4 MNd1߁:{ LkÔc㸍lՉ"UmIN_ZVߖM硈گ]:؏  tP &fbDuR^Lq_sܭ'tO%m(E/A՞-E+=ecę; n:j8q WbOp`wK3gӣ3K]I!Q`ڨs\k[yJ`$MqkeرldPޠtN i c-pj=J>iPʿlNiVW\uìnrk=ýdX>D{~<ض}{%F4/#es^6D+p+ME3N7" T> 񣠲WށIT& +l\ݧ<)3xxgw_RZ]JJћ6HarX?%H9̄헷G[ uͯg ccصtJxDvUv{kWGBoNzu rP SBSDJ޹>J@mX5ka9iNmz@cďzt&+e;lӕiԮB(IJ<^eOֶofA{+L`KT|Ϛ8l Ul[%Tjפ^]ŕ2i6ӂ>*?u"rtJ=,'9BlF4m3-*@Z"6pg-0!RRB$2y/W؄EYԄZnj"+.8IZsV(-$ӎ=c'YeS2P Vb'7|a6 ANrJIf8 zCXho'u7i>,-5[5^| H l jYcFS)h6.[lnNik@: E>g1n"J (l X:Ϳ x.V.b ĵsKi#6/ɠsJTAʵwu/"0.mM)E@bu-rVU'W,8UKy4uqZ%0w-dUz7v,a&(-W"zގѳlxxÿ-z+a۪T2-`MZP#Ze s#++bq+d{ *lCT S(6N)犔p͏F"t[OىmڝJ5tN>U/4V225ѥ0ƧE \2奞CSu PH$R:p`j,@@ ȆhTL($O׎:M ϡ /^̓?v=Fu4o6FN M uպ"ռ?s/Y ՈV#uM4&D&\~䄫TZ\i^*2t_o|rAz H4ÂY؄*qKQyUEr4HE&A"$ebhT(H”d@c)%Zxun_~-|{Wyթ:rj9vSX2&UaluT!I{?~SaUc h;8U𢐘i\'&-;[<^:{Pn+#X",`Ǟ<!bFCOR\SwٔvfP*#uډRjXMJ0b3T^UR_ 9X2ˬbWzЅAuha;3>z^l6]-*qQK 84 HPj݄L *5P>Ooj{+}Oғ=c;YbUbD|81js#I[5ǑBrcIETN,-T.qxN8>+-hEIO[\q 7):b EZDZ/ g/ʁ"-*v;sW1k ].K8h:z̦_ d5FI8]zcN'!CGtM3G]a+aqY3:bS!brDG9/޷hW䩂@6hQ#`}Cd8O\ks*p,~I" ҳAB\ ~e~bO;C H D WZ'BBlp̚}0n/LčJQKKGn#)ި`[F=V%(Op ʖ:a 5JY5|Ϯn~ͤ~D:3ȜTu9Kv \^1T/~ݽ_YUNR|HyUMX HxKz3 TE5|E vVk74"@^bs c*h>%.>j!D/ߚJqn:%u+CJ`;a/[| !/eZfŎB"\]w ƱF3IѳNfi:_P|w̜bInZ{$`FJH8 cMn T#g ^<[h[MOM*jCVp e=`2_ujϧn;K,BM .Q_Îo귗C17G-8` ,v+f.祐WxHVvy0Y(Gb'nH-f OT[qz˛A׆O.jv汖$1Ke(ף&?9!i?57[ˏHXvghI"==m-N݃>Ě;@9@GX)A~P?Q`ړ> Fءo}j^U-~] Xy`q#s=,y^;Tg6r>w`!ZӉY"emwuX&:S'a&A*th 0yA# owNDWP4WЂJ 0BEg󴂹h)UZtcI~#F︃PW&4"5Ke[r/^#?Y PҒEui <\>ç}w7=6؛Mx01DEoSfұGbW$^yS G6{mi7:F qA/-<<魂1&9m;2}pc:F:q; b]7sى.bi+FXiy@h-BkP<ٵ.'W[zL *V~,2&hgsA^EnW#da+:bе Y7l7L"]./[|}vs\`$%A&YI-fo ]OlQUARW.+Zw<{+;ڬ-ie-Lڽn^ kP&H%K~y/mZe&x Ip+2ŋx12x_k}kD|p2.هAaVZNˮ簹^{~}OC@Bh0H/L~(0̩#igAo~xtHkW'#LDyUvJ~+CMF B߿%7k,_ģ\!.>?>ctHZ^?p-:M\<>ͫGJ31UcځCu4M>",^W,{(zmbvd ;?Rl38qv|P4> j^jEȋƥt/n%rűN0m#A( {>Jlh{AEcX Ắ1oC^R9?N6 @ ?'$!sU<})G37QTX'K[?\X0]tH/{$h6g $oxyx[3b߭I2.}Օg+W bJ!a1Q>&lq*WWyg& ˲֌|si+'@OjwFm_Pz1no_%{X&0+۬!8)$O+FP@$kϭ&K@i3Ek25J耘HL2NGa!}*wݡL]l&z3᣿Q >:ƪ?rLPٔ!AO?sm \|MN'psjn ivf'$.; k0Lh$h8S s+`avxڂYpma|@^U|ggWs޻sսayWMgʌK m`  ʟ3n|?"6"Sp =MTIS|y/iRPEFc,~R Bg|U_!4H PXTb^Zj}CUVzёۜ67MQa|nZ7|(SԢ < *>U#\:^1E&%l{Wf/C\yi((xBx}nOxu l!i[Bs$r4".- b.` J G;ڂY]"&@xDIȮjf*q0|CjXЂ g0)LbKS¡L\Rꁀ+PЀPy-Sg&|9 G' ";u`]E=]]8R tfkQM?NBaK@p:U] z z"o[ l$*[^g M$w˩hhI*meχb_0Ob}#.J,3 [s UT,y%AY:8V fui}%Bs"¢0%aT+ꝷ@mWkDII4"=mSQCh#t^XF8=FRfo QKSB^[[yŭ{c #+W$ dIn<ݏ3{n]j}\ZooY@R*.I:KDFC ]pg\u =}{N.}܃`!]/x[?v/]=aq{S!-0efj|O˽{ل03rۻo+]ӽÂ/G!>+qc!eYgD瘇P|Ƿ#˗cBh8(VPbvח/B+N`@9O?rt)ۂT7bXZ4\NauWPQ Jí<*;g;bqVP@j0h_9>5Z|[_팾S:S܅خ!\ߩqZXku5#;jCM@<IF,Fj|6;ޟL;oҔ^03~byBd ! E2ӊ 'eڽ U^{ l>oŏ~:4YfqUTG$"DW XLHa,l kT?}Bб4&.EU, sԫ\y&=|w}C'> XOFn?*_Soz^w]˭t}u; o@Ms,\B?NxQ~C*(.`485ĄAU|Ia:i@ δ=NAh%L5T;P@|9kU]N^99jS zVxAs1 .Y|2sp/_[1!!eo̾xS8νMhAQ(H\BG0JA#J3@ać 1EѻCDD 0~N]Z~00-j"R_.j+#C͗,?zGoN}`RP~yz+k*Є¡KΝ>C/TR8$;KlPof$kGs'/->h>=4ړ.#[,6 xdw?cNj)$ epXJ$r: G5 P -}_3G_@W0F K5VW(m EXmkV栍.!4B?Br49ԌT.)Ԕ*jU~}58e7I). st ( t'E>sdOg&wOO .娽>O+@ȍOV2*@$qʲ?ıY?Wh?CU9X}(oPwQbn`p[we統կ4]m;;/j==C]\BjGa uIc 6ްkIbMGCv"A?C&kl3-xC}noW_?{$,N먣NuDz|3Oސ:}gT9.dp-0檌ِ3$P@E'I 藔L=׮kRnTF%3<?vjdN nnGB gmn6LX7XVԀ57gP^O|07 <_KOtpyCI*%V'U8rm{=O`G}r55e_ĨX,wIrt7t 9JTc[- ՟2znvǮp *!4Fq yq f),')t&WZbvf`GY `nmCdH"zyѿ#xidd=@RfJko^ۑ(v#UED%Iljݤh"‚B%a G#hxB@ PA\^kas^"tNu(~޾ "0tm(>4aA"XN?OϗFѭfkYpΓ_e;:"@~<p2!{ fVlb>m@Ei-L?ڮ+{ ]8olM45uUcQw5_ǽOHlod֘A i}Y :*=.g'nOډ_CA7Oh}0`"QSw+:6@ ( L kmu&ʡ|cjd!߉jLln(uq:u$FhPeU*jtV]m^$4$̭v?Z^h0 Gb0%zR.h%FtYEɛwk4f%'f=Ҿcih=~:%w{yw8AN򭭼 w/?{n?-s5Mc! +Y4(6a䊬E'xҊWLnld*+.-?C%Fm2%@-,5|.ŴNN-h ǂlp_C^$|j/5 k!f$KJXpؕx@V~6Zb[|U8kU5zecrY#Ozͼ+2`sg+. <<"Pa,- 4b;]On9n-ȳ@є;<=uH*bR.OFE#9' #v%-`wrL$I9 \EB"O7?۔Sw~]g*t(ɣ ~}|[^XKaw^Kd+,q"Jx; ]>/4(XeA~u@1x/7;x3֑u@ tH`"nOa-d2*2Qxq1$T2 ]||utխxQ- FtC5|J0v} ]pKjʳc[sZP'>DDp1AG[~Χ"iI\O{/Oͩ*5_ƄR;Mq;CcN٫KzODe=ѫM[g_w݂qۦ>>\k(xCsza/vXBP &,cHhC&l1RaT19 `n3'Ogr>o/p5ځXe&zSW};v nYX8Gnw:Hˢ$Um*y]# 0/VF#ڏM KTBSv$fNĐ(ԥe03ʃw]NDx7p`U"F@tDh^nߞZ\;ҐUah[P/$% `eLn62M 4%a 84u ǹ8I A2KM/T˳#-jT?K~ߓ1˭[?#]Uq[k`|H@ɦulg2>#h,-' -SPP@P !}Wag5ҵ.5jPly[ccҫ]ZUH6F}&G ڥH2vp|gJF İJºPbt(].3(qp{ Ps+I@EξY%{PLzaΈ @6ڼ4t9fQ‘H4!tnsHIU' [>_[snR/~\ȧPRs}/k2 ܇k?fM 3jdnzirNnSq91 W“) Yd%oL+ZH8'׏#dGzFn[:ԁE¦Ju0bOqFM_oyQa~dED 9}i8\}4ΰU1i$#ߥLMe\^8ޠ2ʔ˦CZ`ax oxH2u:gnu2bMHy67KK֞@/r  x5ʗb)ѵ04o,;s`n p%t\D/ Hw-(;MSyt[ ٜ>i:装Iq, aok-lJG;V$'_Ƈeߝ9zE\~#՛ܗe}z03̗ue5O]eH%kR^GyK SA @QȚ?/Æx?4iCVgq/BDMmk!YTz¸IkWxDE<+գs~u00+Ժ3w8hYVlԒb>&h5:F̖' d4΅`cc/`'W"[7cV6Z(Fu{kF|A0 ,.gM}*߶ś]4:a|??tftJ5IiT+.ް6^:wI ΐ$ ͇A1>. @ĸ%,$ 1e/}^/C=tmɓVWmZ.S4ڢ!`@Znpsr,ϧit%ԟ!ӗ`WVe-m^Tj -huUU/ O^>aRؿd}ɉ(uK*?meKϨADHw/{21Y’E*tt}k'Mh&Hc.(0Bx/u#/Y2Y׮Ʋ@g/롷d造|هCwW]u\«+ WֹeWi5pZ|>Z?s)~@ C+ʺe? K?\(-G|L#x8P?^BIʠB>{(M7ug>,W?-# %KAJA+O}~tJz9 K vD,iϤnah4o٭^9C` ,ew'gke{Pm|?A{kHCʙQj c8ataB>>C(|o"9fD{cxD6>/K͒y r<MZ@. | KCH_@1wQ5U>N Fq7}Ei!A0^ߴ;-X*=ETuHOBU5 '&Nu K 9$?PxF;d'( d_:NRA5Hxnjd&owO"|8ѓFLd/C,bCTO?qºq=H(ЦACV4&6-B%POeDR 8fc: pߧ)s^ȤCP|j W֪C,]Lnb&u 7gti߳} $)Wԓ&P.FY/[U,hgŋqcɏH<fdf5PZ`wq4{N>gFF0R3S9vin ÓsѕtB}EfW'@ |{_oo>\5XX0Wۧ\ D_=2 { YY3Ńi?g5M3Hdq՗ v37r$% g[ZrOs.z+^gkGL'$zXz;d_ s4 %|Z"OcWduQ/xm#ᔇ3S0K'c~A= ͑\=I2"ldnw g_ m PP0. p*]+A@Nj)rmy{ KH~Ju`F{1+tDpk$|dJQG F݀@/Xg7[7P}|Cs[ΟN>kq x,vfš6g th&ra,@ >=j59[8Gv@Gۦh8a-`[ˉB6AR( `L ;l,KVB6H[::qXr஑;v;:jQ"D[Ϫrѱݍd{I%Oc+~#'}Ǜu6 ϣR ѡx`-@#68'C@ 5lHBgA)a\b8?9}ψ$浜 m?Vht#$c`^ɌܤI'/EA ;.%ZGl0^ Oχۧ=kU .˝U~g(=PiU{nO8c!GWU/LY"Y_S~ߋ~8|?z[`P'7s #a$3p)ɻqKjE]cЭ4BﯯyuO 1=b>,vg,?* px#|8B }ACD&9#+u#M=+Y\izXj ?&8ˇ츉==/@y(O=sӳsmtwG~߮iJfpF!!;IKsHW̊¿Tʺtj̖: D1nOƹ xf Xpʦ"ķXv@}6]9S8>Wi !XM% 01M$WQiˈ #3syq"BNiW< 'ط4JbW&C?bNʜRǨbN?i a?sX" t~{f+Gk߭Ci$.HJ¶ `@P0";/)K K)|ZhSh$&v?[}T,i >_* ?2)߹4xgPHaT_dyP퐾g+s' KK>15ߟA0dJEFN%21+_yܐK]ı,]_f?ou{4Ɵ YqC*_G'e'f-E(@ZL Ɨ;5hA?֥0#?aҔ$# ґ d.A&*>OG^guVf v<)&8nWCXE׌pxPOزT±Z X8]x| Slm4%E?T'Pxn1Ifʉ'& QG K߁ Y }b2ӁEo~yѳz_,\ ٗ4 _}~@"=% Z$ VL0&`' $xpFdžn¥Cҫd3ATMs_笄SǑ~oNqƇM E"_ʀDMXԔAPkc'~?z(m5`8|9m"8@Q a8YŠxM>(C3MfXX`Kߤ?kcѥJ`84__ ˲"u{4:0Yvc0wp`Jʭȑ)P@+f Ǜނl cpB7YH>%sйC_Ug?M9nYDŽp MCd +hg GW(BuOQW?8`θ(wq?6K xCNZ='"YpG+?;ҿ>[`~iiFϊH|ϗmO䠋Π`XK`N\_W튌AL{A XV'PSZ p`dҚbU%T})T+OѠɕ"a>OysA}V,N]u Vw/BPSGݕ_SבP#_'jG \e;rhd`f!׹0M=4Lfhrv=/e,ncT/ pN@G9XZ'PW2L7ȱ#;gnz5MGۦ= jGbcG!~fT0 K X&Y ̧>T؉ i`슑k!q Ԫ; 4HD^r6y sHziwĬn#,³h҅ )iɃuhǍeyjTy#^Cv1*gsrSMf ߏȯ׶Y 4aI>j8Гz1.m"A%<̗!B!_| 40V|m`$AO5+!G+e[b~h2KwxOgE[S1J;ᨥ',rI [Fh~ &M!?wޤ4`#q<Ӄ2 dN|@egC־KɒaNI㏶+ĮT`ٟᨣh><<^^aύE;8 CkT5Y H@>lbW oa:$Rɸ9.7;G3-ȃ̟j% P|f2>h!".E swR !# =R,EM=x,C3Ft|h]KxIĐF&I(S.\NpyK"¹2tS؄L; qPAT|0(dQP|Yz+d Wg6@8Y#ΌExЧ|n09Tnu| uiҰE;@bXSpO'MpXsŧ@fh+Pw;}+}} =?tzeH p}ۢX1WױpJI'pNh/zLa|_='1d^ }$ 1e )D!Yj j_< 8} ,p^BN ,#TCKHLoɅLhX7S8>ks? e 5wՒ:,}^( -{c+iH-EO{":isQ&iEpvWD氙L]ėuin4El_|,?o6X4֥z@3t*xH!b"hOŌDC#r.Un&ub]h5aڿpn[)ۼ ;UrO0g)%jbߵm'|v5n"}yJOH; qsZ),AYT?qLaFGT/w5~`=:3zΦܠQet4i ?G0Cu`fft(/$кʳ9[ <2 P$QX@1L$'?w! 1oZkG,"y>eQθ(`&XX:F\[y8AmH;p-XTH ,}jHKR{bĆ4N r6t>ŅIL/7J/8 Z͢]قETd(y UAkwjyu`@E>H?(P,xe0"W޼>͟xۚ;y`C;kjH{DatDFԲrd9& 80!CLxZw* u0I9!,TڏJ~<XOj 5&$A64C )=t7tF;|}nJy{_68[k h~?0qbOL}_c1fWXX32#oAJL(&O/_\1NGW;Dň1Da$XgҶx`-**6WosOm4z>2RpL7<u)&cK@. zá+*|ik1cٲ)K-$ wbY tlԑqp,@u +ӣ?_Vo B9wA^1&Dk8GOFnUn?Qiؑ:&6_^_汚FN5>alrq -16E-fUhBvoŠeqZ6PU]~#[I7|! hk v/~ߋ_+"T%oߝ={R5_CB5*2OF6s+ͯ$SӧxD3-Sf _By+WdqJh2TCq$ZHfUG*$y&8sTV-4U w\upiXZ|KW pߨlC<\ߜ2:jIoSWԋU>'7 \~Fhf$7V9jiۥ]≤CЅZhkqʳh>>E#__uG2X`( I\ B|w\@׹ `rzQ:Ύ{u^]JC^^U>Pw?nk*uCh~`v+ zޖNEq1?[G._D95]uZ]:T@0A>ߥ|~ uR.C 3_S|V4`Iy{\8U@؊ a,U0 \ zA8S[N6tXъn=y%"yEH*!X:60e 6R$[9(\3&`rFrr@XWIRΰ+ޢ)@fFZ;k +GCi};cf_@^45"]MƶoD-CNws4oov>PF`Erp C*ZiCk͡Y`iA! D^*nXЩ}r=MY4C!T [['pAJJ}V+!@X,(΢ ?{߫rx\:b3@ <_$ I0DEp6s~+0_I.Ɍ 0X }n]N4;[ܾ5<l(5"`Zx +A#3_W"|ca=|1B K눞ZX!@a@ ݳwrUmZ<_wɦ@ IJ ߗ+?#e=:w_co/?_k稙syK.!1zO!B \Fh} ë[L 0)z[N},^@0_>'yDSȚg!=]_.64 {}'&C~A #Fܿgы;|YtR 64^.=//vTbQ'a&E|$,ā:_{ p S]~D}|ƫꞃ]oxf[kB`=O|<}\+#sK(iUk*KqU2_rXVMꮣ % (eZX[`'#>||^T8׮A˼ 0 f0Ȏ((IƆeS1>2=k'ġ!ڂ{_n[@p .qNfLU2V={}.gCrh >Iy1m[a>t+6IOEXvT?B2Q2;eB/ +`YF6~wxo[M'Bp*BJPr,qa,Ƿ,@qx--.xNeiHIJM29O[n_1~-ޑαius5mA hRf``,$U]p|8.kttg(nT^;d!);+>…ݑ2lH@I3VLGnD^87fJ-Py< KFd\J+ŲH?H u8S EHHV`*R3Mk$VB V&JQ``QYwK3Ȋ %ԥYQ̀8s.K:)H ẂlVϠR\l`RHD>mxIM)287"ċݘ$(ybU.j6Gd==B)Q%YL pWC~RS:dm$o+k^ d I̕qx|R ` aXgՁ -0oDoPf7MNϡ4҉܎i БK3)/j){P\ V#[bog&pc,^Uy:1M-Aa6MÖ;}˹he[V@9ρnTǽ*ppe-đID&m$`Mko@03() <0:1q\t_ /!wQ]_ ag0"d9*_ Z1@Ӿ%AxTcuW7 P5PHzF w ]yRӏ,Ex@faYT&eVh`_:!h˪h &ur`$.;*huMv.F#޳ rsXD|"v$"#c=DvrkGxPBs*l2h7Q9I\J PmO0JgBOm!g[& C G<%`cp=?Dr04~]+%kVCD˭fN@r$a#Y ͺ18DrWTT;GfEs$SfaȠ2E$fO!tf ג4g0GwU\T$/#]dq-Q7V$ f(nl,~.  $Gb~ƍ,ó}v.O"4:ԂKQ#un+v$CuE(ep pv0FF#6 R&ܧJ&6\Ljic`03B"⇄f`VFU~xG.5+VX5DH;اhR[.߸7n21 b( | g\G0NJN.ESHԬ2nI,)S#P8--+Xq 6gqhR Y^-D? -}l;|LDO:'B¨6Z GfnjO-^@7ݛ^X[X|})&roK.5@JTֿ,ߑl)wtzgiU?9 ;JPs# Udk1^یӹSN$X37LedjvznKՊz@yxY7Ȉ¦m8:>3ԙb|IQqw]a2Y@2!>ǵES3たOYls#Zj:xVU;!`uz`kdidBM뙻Xם+!@-]z@~YmTF^zPvP<&˯g 7^2(uȇBayyb2'%fwNWZw *! f|2 :mh~İJ7q4˥`߱rw _Œ~YȒfop>$\$:@뙫O0N"gMBp @( Nl7 GU<6] б>"O>YRfvVr%8I"n)ُ_R;[ vQ?T\=*̴< $NRR@ D:o @l8-3QfiIˀ֋KU9‰`v|lH:qqԪzV ܚ KQwh{ERLo '1C[ u\<.hmMT.%iwT@{k,`RĎ+/DxLE3 V[W 4\_<#.\ DEΣ`BDx wZ qTJg=e=3לJO RF<3(3 bp7P8e'nAf{fOCGN>z)TK&);bdOs3a YP ߫1-Bb5lDCɈ\ZU [_ ,De `+-N / g-(ʴ$]9+@ {=YxxkYjק(izh"۪k$WҧKxOʂgӦtX `1ՄF, pΰ^>G&~q5hIJ+_؀`GA`f8EetK;(zkf9lr Yr'[YC'E,`#0 pj7IHGP)_È".y{4SXaWFg5,’}뢧n]ceQpo`Lk%UOo}VZX<*?8y綗'/G3}nWa)`Mf\]DfV^9w[E%/ OwD~=_ w=n^y[\3z7 j.-'?> p6"8P++#* H]C _$؋^8Pۥ-+`"+8uj𺿢9ґE|ÁnFG$Z}]!9B`䧛!>JF sĻ LTy*Mbt]̱՛%\iʾ@ͼw _{HvL]QYKT'Y )6<2tH`,#\yܢW^HNiᜏX:,9h̡0ÄqI 򷡊@x ʼل` $ل1 o:FHP&UbaAHF̌Ƅ0zx }B;JZ0l Nӻ!|dѕR&WFZJ{F |*0XCs7B:Bl|rIFµ 6)lV㋵(!6 @&%fJd\ӎv\k7pԀtHoH1Cz ԚwYW[mR9TU`Lb_µ!.i~n2ZpДc .f% }q&oh CLt[L{8}U{w;$8G1 Cv+ U4zEo<́ YfV*/h^mB@Kw5FjU;z3l!b_r\nn? "mfWXp mFm>#vY+jҎ~_RV<\ -ְrplˊ$YmZ^c@ۢb* 2TedRjOc (nb-cTZp:c۾=K V#X8>4lJoǒV0Z9gkټHZG8;sg&f\rPERpF{3;l!ciŸr_ɡk@c)5*$f |V3nsK vLxu٬;9U˵9Ȇ>벼p &j;5|/a1OH{ڂaL@KXS2MpD3bB ukB@A8cDos.]v@Q&%j-ݢ#Q/[! c sk,dbխﲀZ+,Ġeb-,l 8 Ih$o2Sj]fSVy[VaMFs>kbo2`d.U(JU4,ŒYiY:mZUΛSN)bepHcT@"cLJSj`r^A9^X!,x+t)\aR5zMN2`e?B3"9q䂍v|jYcŰYя#Vka.h,VNFY3sVcyN7!5Jeɲ8Jj=rH:e>%ף0 za 0lJA)q$9ra%z1xإ7YßۻP*6?xix |g~E/ 7KSIH&!4Tץ3GDߪ%¬qm> rt8[;%p"Տ XiJJ*Ik20x@t<˼xׇCa r\ m6%Dv)) +Z &:v"rѵ v.~*+i8=SJJ _x4^6e*^$a% [r fv']cpH~DA+[JF@dT9D baqΆv܍mѪ!WtoT-J$ٱo\ &RF=y!mB?oU_L,ZDfCf[#uRгێzm,R*WP)&|,./+'k%К}vep;i܋)nR>m橇Z63c\ӗUfzXpND[E7Za" U` E%+@%m^ ^qcЎA30B^j&-pY1Lm5瓫Yl]F;.3ܗg~k[yC8جBwBUŒG:V7|AmT-6B៸\r z6ÀUjU ̴`r\kW1 Eōͪj 3>Pg[>GW[z+yH@/ZKiiAymc{;!I$fbIe9W [j{2ZlV#JRet^,D5M_ 6oczzX'D*c+Q3GDW؉2b'Odfdh\$cvqjcJ2ߩHce͠nbe  X$ïב] wT w׳~%q:.+p4%sA Bu .sq"0i#kXyكz 6^vxQ_\gN] ">l+Iemoccl5Am8i'@ mr+agcNT'XN @8lZe-[gʤyzۺp.ȴw&e]pD|[yּKi1w?H5B:N6%YLY#: vd=;E&h8BW>/E,i[BŠi1*$<>ZSS;A:zƙCD&Q8 f)e8F/R8iaRN9!;HEoY }g拶Uփ vv3A"3XrYFbslŤ&BPJ6ܛ\z4WsmP_ >n*RM+ANG l0"{|U5H R˫H t8Fӊ>&)_^X6 j520kblɭOWq+9f0O^)s}V=Ɇ؎rX,̸0KԱMNo`ܻ]6y R>P= YXWQ] '`YG.Ve۹7t)vhL274@K~uҖy\ѹaHkeiV1ε)DvH6%m7r#D> :ț+W.vN`'.Ν 9TH#(1Vɏj4In``Xs:lIР/)nieK 3~,3T Q$l61,ղ&Wb r&\ w(iܐ%0eCZjqC +r[q p@2k~hfqϨ;|WMcyaݙ΁.wI7bO-QkM'&Yg.RؿliJUZJm=ݵ¿4Ļ+*)2TѨ^]H0A,A&U?@QVu-,[xYrK<%= P,T}n9fK9yji_sKؙ"E諆7Ы#2%P؇0'e `Aa%{@fʒHĻ> V%cR&p<=DēGb.NI[v5A0m؄/[6%[܆Ϸ{z,@].1#0[޳7l^<ubEME[4|aYRh Y~s }| _~QʼgIh8 ]Ʊ3Θ?-âj~^ "1`t`_dH B.2T$aFaCt;*-P+J[I0AkY[E7ЯEhHb*2qrTVuߟ\ZbabYAtjt [.{V>݃bXLBM6,[-L AYB4hc7vt|[y.տ_c}rQ89歶TEejPP\lpÇf+V/y:'t琎@2Mmc`qx!R8>>_a |4ϓH.6.,DYvg#x'F߉kvU]v?L 'WYhD1c9|iJFsJZk6CxА^;C);H'hXms6z*2qxaie;[A}1i_ !؋(vOG߲H9dWH:zD`"nb5-$ogS;hQoV'Č:gc3C4Ye8M6R8,5b5>N9A8@9or\d ˸J] N\˷ϚW{~GA5\NYwFo`j!h5:f}vgw:mR_En}1]B#杺̚q',eeC3+)kZRƒt (|ǽ1x{i#"$l;"'WiZl=ϓ[_qQ[wԟ:TԚ( !o2ޛn/.p:{0K1KO&NYBĘ8"lm׋몭HaM(Ej9D0I/LR[W/ !lp-J4[N٩ T{!d9n\Nh;Ze5! .U[ꙢfAPrJ]jiJ \săԠȑ7 D;dzrV!e #mW_+cP"s/xBu&gb38S(7'U ʒJ F{\)E㈩n'yXlyk#2m$+# qN e[FvnFs~+PqUij&79-sp;[j}ux9駇^qBJ͹N@e;>ew&uw %d_IsO»иxkk4.3u%j>LK*ΰ'i4Dl% 4NiX@'tdٶQ SQJHUaDs ز[.u0 I ,3. `_'Ƣ~&ZT`kFGlLL=Z Y8ia:S*d98!˗}X[krBQӍ6KZstŋVt\I+!`TDؖYy10C, _bvu,IQ[toCs*+--,.lNīouqO_ҫ#mܱJڸmM#xjZXa5A_(TqcJ/<ż? 6-`SahıCV֎ٿbs1L6Ę4YP~6f|4a$pn#:fG_y)v=\@KW"ǏڜYW՝45z6LIӅ 9Y3nξuBa!n5Jz_FL ͇(Dqb3|Ql` j96η6s*t*yO-rՓ ]5aOٵԯ > BXyD.v$ʴ4 ]41F,cذ`jq›3%ys:J d̷^aGzjŌ ;%:tcU,(m' 2Z R- q1c1FCLY%ښM1пZ7,u$IsoORDqEtgv^ds[b9LkBZR8Z#]ѵ_]2Yq GS(z{۫n;8,:B/8_%&"gAiQMJJ֍͛0Ba/j=!hNVN힣hr/2YMGg[~fV־vn6:>=H-[K"|(XSS"̜MCG8n!-KZuPƻft"5+rX׾U1$K2Tܳe nsmOӣOJD}f,@Ԡ aӒу^Ym^ӁuG̲~A` 9ޥ,pS^|mϬ`ZXUgjft6,1x¿J2j T2\ 8@"#ݠѿ\KTYsK`noqt!^.B :qw%c}[ ѨN=SzA;-M}qx\9Nʇ-`Ώ6n$\I3dbјzC s!CR\Ifh`?_څ{/Z0{գlGj{g"hqel&hg`حbȾJTcI!vGK*"?Bh(wH$V@`c*-r vh'X ,z!a(;VP-3ְh5n C0f`ɃK3Z}o ky-9؊ZkiOۄsZyd$ScEkMU_ZGD`-ªA2R;,Y'"]- ~4L~%+X(zι;XpIOY~= '(\PM_3 ctlS,2TW(7XQ__mP6;vXo=h#`5:eP9torʋwwk΂߸d Hl;,Y+N \OXZzܺmpJ2%'Cŭ@]γ/b/:e,gp Q? Rro P?yuv;RhQNp;GZ;;Qjc5.[uޚ<;KnL :]f-'Va7DjlNY*NYoվwq夺ߍV%3QnR@GE4T2M?{drH/+ ݼ ?^TZ+D֢w,DԶ(`v2[^loUG#Ԥ*O=MV\tv'<%/BPy&$RuȕPjuv$X+dht+8 tJJȋuc.| BEdYxY*I{ H ^amS>$ #Vv 5Dg Us_k)ixRԋͭ3F1mb)k4+tc5\N direUԅ@5!9 z__jB+jb"rH!Q8WMVdz`Go1ZrmwŌBۧ:|T@b㫷4L2[lVt42% {!J5p#n)&}0tCI=mr#3@#V!j7C4KOZ t9#Iߊ鋣YV}S(ؤm/"\ x"ߜv ?a-c a0#Z.zFJQKSXo~JZ(!1S*d#6 8/#{UQRZ NEO5gAg8LvH޼hjX1`*'*RAǰ rhnR/heG#iygZ3m=j35Iunaq4Iuv;-Ȃte@umo QiÎɳJ*jsdzkаR앭**z .F;|}ƂهaY-2~| p *J=D*FPr٩&ٸ5n3N^9**P75-MadL8[6P /-ˋ3IfWrnk''UTx:w!ĢsB测X$i r c-FTc{a ; Lw-fnQg]ك?z+}Smv<YOaH`,Z;=hRœnv态paI΋q{@ y}o͊&P7wL4̑vnuqn[o5- WoKgh3q,1Py;\զ9Vj<2BcY %1Ӫ{+-|?wjɍ_t5 ˫E4ς2QJw0+GSN!codڡ[_>k+~hb^3S`Cqg>tQ.o4"4RzݟqknMqwg[ P@໳!A`GZ*KI5L&'&3y;06Dk>]%a ULX6=T ~\_wĻ1c)[F5 B`p&5 w.7;nqMRlX,p5pZΠ/XXYC wɂZ6~<"YJ@V۶rtr۵ ,_cdM;+@ WIt/)$0F+GNH`y ~MSܐM$`^1Řj 6`_ltܨ*EQ޵$w9Ԡc~LxmX-ᔑMFAYM%@!5zU6#{R^Gi~YS1E]+x[e~ȼO!~ 2٤$[fFs/pGi/_ʼng9;=B2&.=Qwa>2b/J޾+3J+]uDԌ M6#g̝+3uX1Eo}Wn \JEfoR.P E^Hc$ NwHbO"fѦ_㵖m6axG KpX6XV囮j "aUWKDό 7_ W]4k/8X5CGpsEJ~aly zՒ0fxœ5pA~hAAZ~ OPc,[-FCKk Ґ׹2n$e`i1j/wD**NU7,rg{YFWyXk'I(]0I #K@v-]aaipņGz0LC/-wh<չL+suZ9m5s y`cH-uM{dr/ͦ1[el/ZWރJTa0h|ؑhE' =ɔ|(\C NJݓ[< kD0  ֛Z͛_P 7acd¶b(nkvS"-RkDc*z1 dZy4^{s+PR21ʃ9`ilXjֆ~2\7 +N_b}*4\}ssj!˜91Wىj.8s!aɛ^Pޮ}kI{ g AAP[Ԭ^CP'U8SZGեt ɍiLUk491z/JӍ+3Vڌ1(&v]:0aS#^,VޝV4)W&A ZǕO~P$lE3- JHk(,<~K&x+,\+6R)2 Sװtv5AGD8xZIwfuV֚rWT47 [VP=f^u%V]{7Rz?4Ӈ2gv#'!lKK8+vAvg on{QwYD69E7C㽀}}pW-+l'خ`_e> F_I1WNYI3+%_G+Gb1 7LUEl֔XP-W H"-{Fr[FҲut?;ϝ۠Ŵ2&UH’E=|CVc^bصeS7=FsV &!2)KKaΦwP5ʍ"sL!w.4P< 6q%pp:oilS^Ae1NHg=G0E{q oDM’?A+/Hv^[+e ũbn:0Qv յOx\u/=9TwN{8~ehgh_,l)f誑hn3yJ geާL(955e2.4}j_V& *~1sd1 LY1ğ0οe"R`ރwV9cd_E/=χ,ҸFIm c/mbP^¡؆MSm mhW'o] v\h:`r%jya` @ZO^2.lhQ6䪐i"K ՎzsvJߓB|= XArކɪg h > @y'5XKMl\$K_WM9CB!7aI~*pQgWXu5Q#zz|3dOnCOG G5FP\ƚF{jK:TuN+cF"mT~*oX9MǮ9ޮY,Ϫ _D6_BOƛGS+r!j.o7b%WՔ!"(r𸾟ߨ -r]&#o$Onw٧ްW5UWd}ΓrZ)F|lyY# \vTyyTPd\ο:ӱmmO|2tH}4Os?ұiɎ0A#i%W]ՆK ' f UYӺG|W~܂(be^f AGhugoʈ R@QTlj2&v$eڔdntWGE/[Rόssoajg1EaAD[Eyt"b@Ց?2Rbc66(v#=<=j3aaZHD΄}șʣ9,~Ƹ4\T C*CףL;g*CF1s۽.:QI_58GV,Ka*ژL5iBd(V_H`lD:Ln륑mzܥ?7ιWͨA݆r߰apyυ=*0R;:ݸlۜmmUh k;XtR&ˁ?WrY,8QYovW?Xv;9E[_WGZgf@; 6XzbqWWmFʶAulo$ ?e}m*'ԓ7Q kb# w5k?knP 漄I.jJ(Tm鎴:jWwnas7v9/[ 'Ll+; Ǖ/V+~s;(:`[ &*rŁnyzi i=O{ +^Cʻ;$bnfzRVʫN>(ӻK }/[=1mhӼ6(pg]53ox5,&Z{mRt{olUBNڕR6~ږ-mv' lIhs J.}06Mw%L+1K?R˹&2)Ow3eVJv|zSf(:BS؟|ijTO>cCGH[dZw3j͞}([u`CĔi~ *g\rd=ь44m+q/ǿڏljByysGU9ႤքWCM iжۿ{jKٟC_!1:go[ŎEC]TNFv+zmMnE޿G*K.(80n s{+O/UY#ݩ\?K)'!贞>w|kecNbY Ny{^rE1|!tjf>^5_Pb,~O(-{eDWy8ݲ]TV,NWOBt ۔ˮE 'ýER8U>+õ~܅Z,#$~Wj^ISs*[~$(z(.H¡G`JAZVT2h+팍9sώ b -ynG 앙-՘j!MLc#xGf^I S ?H}f ^Ks}m ''~@KN,<,jiP4O<l뵢Sa{/ 39v ,Js̐HIMʒef^+,JkjVYs^>qv[۾[ Ylb\e,?lOUAr%n9{!ǟaŲI%r ߳ݜQOMYDfwWE;~4NV(.y&ZaJJYQ$>gmw,IJOv5tY'*nir(ExE|)"3kuwT}.g6^(d9i|d~/ռo"*Nywx jmroCiM}Q {1t>.rJn׎c0.brf̥hݚQE&Wb\5-?Lׅtw_Y!D}_wb˽04kO*DK2=u AW-rh*Ys ܼ' c>m%2uS,/ooVWKxbw=/߬#[eDGxҾewc*VN0cp3SnȨX)o _qB!,,jSyqG@S}q` Y.%ui rv2f>6jN 9&  j81נj.WEd #~ Gx|.\'2~ w`a<(+x'rzn]VjMd^zs%LE=1NF l~m`޸g2X kذLl`o74@^wÙzGJ[,]H7.<;#.ft( VĄn+歆c~(}jzP[Lٟ9$k8'5>&~74 h x^|)& ,g# #l[T_f3';Oܷ{a]3}Eޓ~>GP>csY_=Li)\xԤA,޴,/]dc@I'z;Ǧ(l5.;o*n4́yv 2:0X],UDtLt>i6_NVg\bއ?U]^+p[dok?ha1X:`/\ͧvi%ۡƲ|R^AOn!o55} }οдYܮ\5O_`iϛwMMx\즐1_|{4?_ zI?T_W/ \_-,Vg \?of1D"O^$ooyg]i+"RhqD WA KCl|#c[Go..y2/ *C@r\/ ue,fSje6=vE C ]:ѳM߫`;O+i? , 5Uh θKW,o{1j25J7zٿJ,zs@‘N CzuV.5ƙ`n7>,* }Wã#c1^ˆcǪۦT^5$rURu0Bq$yun)c1~sN87}<ʶْ!UZ-LJLmU.x5ړbzv8?eϸuoFߋ5?h8Wi}߫iqϏ=C%7 P!7N)lw2)e}w.mdyӮ_E[˦w?A# "7IiNy >*Hbx=5y.}y=wO_Ƀ쭑+\+][РxH]?AA^tc֜N Vd-x.'ޟ~zZR-3v$h},|ݿDnz@Eg2l55u@ Q8e+ȹA ?QJ~B8И6CD@-jv @D4DNڀ5`z8 S# ):zMn^|l[c?**f."!@@r eJV~;֐?(NM^iCҍfq{ʋF]_l7#۬oMSįhr9q6́]j#)b5fY ծ!*@4UŰ7ʦy=X[{k.w&zb•.5-I.k.Lu%(Zfs#4;Q}5V:ݖ 02?[<CdKo  keS9yF\;Yb2:@,`;?eq9d"C#91ۥ hVX/)0_[Qe>+A)y=2|EZ5Kl,>(0e.jz?kxfkߴ=((] a6n#J4M$)ި74t #X±F8W]`jO I#=~O yⵕ12J|THϪȅM(IVLz蟞[k+:[K+|x1W wl;0&.CY<%LOhYbHx.hm#̇A':˕oS>P^avA8}k.&NLgDcg5~oean'^iV`-W_3ؔm+Z`}r/Nu^: y恶$ 01i</{ kGދ@Xͦb06XW]3$Li^3G<Ҋ8=\.S8XV߹0GvL i~ )g>3euK{RvUK9wIðǁ%C +i `hGR}|mDע;T)M(SUw~\?}@Y@-6Τ^/!<邡>/%lf H'`>_~X.g' l u, W+ŕq>Zs8ug:?JɫnxωV!?o&+,%[Ƌ?o\x>Ea4:pe&Cqچd{Ljy5ENl8sME]㠗dF= ڮ+5 9m/f rWa١t~ql`>>`O4MfŽ֟m6{EF <ˡ!α$Ywnn.ftaU &k =x7ϻs"cjIvwfJ_U[O҈QW}Uִ ~ܬP?_京}sN¾;dlj$5hkJTՄL65tA|},`dz]6no]G~'=GRnVQ`W1zG$=CQ3Չh@Z˘q2;|*J~nq/Ԛ[m?hW{v-C?LGnbZjztYo`Âc3>Ңy{&~ Z6'pOYbEb5R@U#7ղIWfuF͖vVT\+n:kf z^WTb y1+^{8 hL>~^ŀi>Rqb ?[/?m% ^`4{ ߅k[$|H|53T~*%f6hؠxJ?6*^P5kuu ;jأ?}A)bk3X|<3}g$}ҵ\W$ }̈gG1;n)9m)%Rd:]r]2?_]Ohv<n\uϑצL)4J@Pqm1 J# }oJi%טxy^|1w}X~5,BZ'w!&ٻSܟj>雵̂^~*4c>;UÇ;i ׺A$u#BZ.(L5,>}܎6K>?__.b$zv)ZJzX:D͛Ix x&a-_~Yڰˎk01 ptI3 6Z%lNKMS犰+a<7n"mLw?GW9mۮa֦XwqcxOM!Ow79oMNP'M~b.@o,yt,cwa>H`|[x MNEb\V(#0/_r݋et2Cr ~?󐃯Wק] 9T )a}o tC|{E 2]Zʻֳ>axa kpf~p譬/3ZJ,>D. _5m(LHNQc xQeM3I O9Wee/_a`KU,NV%ƇS?GV+s\_];.4g=r R(խf3~ifޯgvMmyQ7I }@SK߮I+)ƌ0H94{3jY`lf ->}^ o}VGF *_,|D{O㐺zaY\5-).V'GOLwVOWMy~xj?5@?I;ZQ|rj{BCv]08Da}\;ʬ>S w@Qv(EyC*i:r*bRſ~LCӷq)BPʰ+xX+ƒ0!),]+>i cя)5rAR5ݕ:RJMrehu IJdyad :{| ,ov'iH#*m^+&&} i4@lA΂AB˾cϿ/[uWz:-W-u99оF2P3=K|)CtƲuEz4UK'r[ik]f;Zj8%޹[~쬇RL'6cTFYy,l x'g+2J$Kl}~:~&=/d,# Û >U^v|h {nEu/~O~)j4u>dZWHص-*FkmoVbQ]{z-&VU6ts_WfJK*{=uΪH|O6.tc I7Y߭tWèR,4_ ͿrM":prSojb0|}>4) >:>b3Kd+V`ΪX[o'2φVUomws8.o3E=?s3ngFZœ^jlٲ>{TA9 zdg攛M8 1G""MJ}h#i{r4tm`VRe@UYlG9u&5Fέ sk!CCMOi}(kAئt^1gF-Kf=y1r](,%E [kbrx16ALaҒ"ŕ669E1ʬMclrMHt< `7gtEg¾j|ĝ:|' lv=CWSd+K3uF{S|ds$꽴\U/G9d;7YV3VBa̝"X-e![-j>{xﻖeȒ֚̕"rGG`kXm:r4d|T\V/ -u{%zE z!Fy>2*¹kw{U^l4bX}^=lV맧 E "VD!kʵ}> V:L[S3pEnȫz]J˽٨C:fJxhl4<<_Kitn&{vd1pYX\dT8~Da~LZ=GPXl_nf 斧"c܅ILQ6Uut2oZeCyOm`m#ZWca.Kmąк7~qhw^Pg] [q9(b||5_p:8]G, =8dׅVj;&O֘b@1Dt d|y S]H:)㣤d HZfM~FBҨ:TInZ*zoUSs7 § mQ21:P!\%I8?uSP5ڸ#Ubl5h!MQZ(A42wyK1Qyߛk zl{jTaqaEry1ܢ5$60Aa?'zW'7Af(xi6t/lC>?0 j ?|;3{Vwܢ=AM{aE7{;iu?lF?zٝJ.nYvTGhygs]iGyzpԝd6g86ܗ&p{ ҅޻Qd\ѥƄmQ])c o DLd?/A:2Ei'GJFIyH ~P+;<":Jlh1b.q3d^x Df%!oxP@}{$g#uUJ΋ǘw&mp2Yy 'xnG냜/&^z.-y^ɉ oO2z՘thva ?4'4zؠb:k^մik;xo_spn8BR2o+ySOê4xH۞Xi|[q OTXI:^-MnwlGwEj/r ͑}ŖXv~Vyi#7DMRWn b+@ѐZn77/!SO4'ӏ7|9?ҥmd&H74̷?߭ o:Z!,>GiPx^_xrnmtvvmOi߽HB#]<^;GЦ3yՎ#,5iј47Z?x#xO ҆if+Q=R^CmGfx}?v T XR"yzю>A6"aEN?em{f=??Pl@UEDX3oj7^;[o ZT_Qksio|+x·xB~ {=?yCշ,!{Ό0w濼5Kr nOxk~GRHR Ǎ=HnQZ,X^a WVXC`>s7pSƶ.;~{'o'"mV ':Gb ]ҌU}&Zm!C~}mF<'V;|x LZ#d3yJTVz.rP}73qދjec[sAk uK\8@|;XǗI/jqLE^-) #Z ƇjT I\ ])>" օ w+{WE%3bFǵյriJ#wLqǻ[lv4VOkiΥYKJG. ڠO=kb:_beeK:<?JʎjZ7;fl@,(z:6 uhk ?O 6;ZE&*|f CWwZ9mTN˚#X^&p s6wFL3 -J;R/=VaBK1ܼũˈ]D fq5z4Bۡ)UѰ o4Z6R ѡ"Kh\S!K V <a"JءZ҄ad4+ۃQ_مtm6\.{Q 8cu@9>9|ܿf Ԛ׻"i>\}J&ؾ~V'BS W;bs%(p_i>6h{\ﭬzOs ð08cl-9eCN59bw?cE- [u0hit|?WAq{ LdzIN!BFSYgi?AVkjX%~cqNL` s %E'Vwڬ Y3W5p{I7"5+sU*<+^鞓G_uw|vf#)7 AWY.S-9V]r]ZˎkBS`ivyCeUE's~=~|cS{y| )u85@SZMQHm=isG ^VF%nXh6oC5NhpFTɯ7='cq_])/\%B._/4Rt4v*9)wfeSұn.wiemz(x|,Hz% |5>"=>깂8wha;n}ڬ -W!*ISZz&[h!Nyj/|ON"Bs{\gȿjqp(ds2h~65rjx*!6MFNu6˸:s!u$v5jF|,YKS!vQ]S+R}ZU؍26(^9R ˁܼ(FyKY 㛲wXY;U]T*!P$^|CH=,( /uycu=7o'>6Sj';]oь)6_GB-_wjե32n~_=ײO>t4c|: puMI"^]=y%\`[i핞Cы\Bxs.^g` 2?KέC~w_} O|}M<˭EZ]|_m (Nvڞ w@Ӿ(7J?ˆ{ 3OW R,27ن;^틻ƹ!( 8̼٬Ɣv#9eܓU~_w (yK(?(ynq9ᮖ:H-.a`^/^)Оwb\ ]{"uӝ&Yu)d;ړ-*ea[rJlHj7[j]ZMC|=sP[?;)Auy z M|icx95ڛѲH7x/T^:kG'W_mO|)/ck%mӋ_a#K-8-.?iD V;2$ =t+Y=oqiSwԶu! IFSxиM`Ōja>&ĥj[\'lWhclN?˺ h3 {w {VkjAGǦjEy|7,c`=!W '%eQy2݅?Sy{S>O~{使cP~F^6xIw!pؗ(ciŢFE̠ldXjƊ4VvӣrrkUm2-Al(3iouo / Ayr*{͇k줽(%?sW^},bi֛[vcU6SlIs)㰼_Z_يzMж6mS/hOD./1mBׄ#~V|Tw e.ŹZ*jߩ_v?!-?rkyٓ 4o\m8rQj5+D،S)4 "+*\ƹrFHA#K4jm.s.;r۴W4Z")m%rsIb-ؚJ6sw.t'7M;JM܊ۋgs؀O'R|@/Њꔽ.+#u>[K<).L5%9Vd%k2Qͱd^Xss\ܹW,EEwtrp.t.kbAIm6чu"?v_ٵ_-woG$/b{5оz2 Js6ߕA_M6\fqQ$ J3ב0B?љ5.:q\Bm*mM(@ J&b45l[&2&іml-4Z $#X4PXIF&f_Py?oZMf~Q}&uKƫ};]rp":m.794!UxN]e:#Jʽㅳ\rNsu1?"W֝iį08 ƨm\k[Yl>WcfEvTy_/Z>=/C|z]_|WT(36Ӓ89\3T/'y&m *HA5m[_~"0 O7Z >#f̶m^ԙ_om9 *X~ _?q&oo[ު(skrEnlKݹ\PHQ$EkdSnN+ 9ɶmkjͭgX/H/F;ivGUO Ka\gմǤ5$ګvUc D Ug޳xܓTsy=*أebdcPbɃH)H b+ƢQ5@OkӝrIN9v;vW79LhZHҶkQ6i_%-իd^Zëw-$4yvrKwRw;ccmlͻMja(ѣMBHdKѮ_hň5R(6_Nu;o^mS{BOӮS{B]K!s@b$.o8QyqbRx~"l3*Mrmn8q4Phus]-<ǧ?s;ʊ̶5Km[[76kPbwWYvb4[$Q )ӧ7%\N˻"$L5tGC J|s5imZOqG%qsnry&|NI*W,?+(siΩim;Tkr6F$h$A4mEۈd0"WUk\oF#l[*9]l=OWS a~؄ji;T2QI뵡NڇBz[wIy2wJ~)Z5HLa1`&4ȕ ē؃l\8jvNNKE ̇G/YOW}ϯľF7i񿯭{5Ud/Ȯݫ*+psX&Õ#*4Kp~A?)Ux⾠s*sZmm Aj#&a(bD[F5rۖksmr4ĕE&fiD&Ʊۚ*.ѣչ'unt3s1t9.Rsr"Bstvv_J߇iS(8[/=7%NSƭH|ˮ[滑\'=,[566MId@J13ڧպ֗[/WlMm&f'\ȽH)zQSَOe{a<^s^֗M]68?ECUů}qo[ cQ@ 1TZڹ[:&dɘ3cgTD׃ܥ/P/!{{9Vẹ]C_%O.;#W|}8fc $|Z#Ny9OaPg?+5]UՇhͅlc1mr&w˾Ŷ͵ '\]u.x/Ncmg[53\%r_Dl%~Mjލm鵣ElX,+tݎJi;DW7.fuaJֽ]kWm-XO^kes@9[1t^oqoom*^rx6KgnBh7+FcD\-"]qۚr Q;;\7.wwWqٳkfֶutvHWSn*/GWAR`U'e Qѕxe^=m"~ԗT*{4|2&51|vV%}:]}=emSU׉hF"Ml,U;r͛%D>M*_I68wpn E[D<<骗B\Z?󗵒6,QRllEEh-, 5 hȡIR-^0QDB1Dd[ I,(bĤZƊگ̪5[6­<-?hGMVrڍ}lpoݯ/\%sqӍ86b-wvUF6XI3AE\rwu;\90%b 7(l77*]W66JUڮt]\n屮뚍]wqÌ4s@;g8:des\wiݹtX M)Ū?1ey%9!^mUXV^#rjta;r^<.s;N9[f?_WVA˩%, ==u+POmÁjm¸6A#iMs*svw;;sww]1VnJx+IT-. > ze~‡'- 4># *mk ExߋEUuR(!%FRU_Z6j[_M4f/u*<{~b ݡ*4ݍ$Y!lSq5qw Pt;\r]\)KkV[kZؖ+c1x9'#D.YfѶ%?[Zmַoy=3rZᱹ4P%딴NkXv]htZ"I!S(F$4Sj)P;%RWQWrLhߓ`G`; v%Q?f[_]m߱Hq"|ZZ~/٫Y__l߲Jk\b4(~؋JmJwf+6l1Ɍٸۆ3j9yQu§Zi]\Ƹ7 T]h0.uqҮJRů-Y;Һ]6*9ݛ֝uuuԜwcpNΘs-4`dͮ5ƌٶkZ0B _'mXPNwU.YDs!̧2k\iE#1qm9c[uXF2#tKt8p8Kq%ݓ[[bIͣA)4ڸmɲu W<^- }˼uX(ҧGN9(.2"x娗EƓ/btO#Cw-+X0+\"O.UQ;S.g5`ĊQ4{\ŨmEBh`653$IZ5dحmIBwEb,\4knDf)DcE.t쓲BvJνjU@Cj*cXWVfg P}ZՊՔrss\\grSTpV^rł5!Lƣm.Dŕx.mٳ5xϺ%S+lkCqs8㋍ɵW, ^J>9۫v?O99*֭m o-ccr͌m&K(.9p#;sqW]苧4mk6k5)G=Or W>*_Q׎$Jz(wTw]*먼x˹Kzo)_M'$B`O?uB.aTojZX[(5E e&i2%eNJЮ;ٶ؜ʺVռd! Aؤ?~fͣn3;P.Gl=N/C"NN]R~ju&m]b3oV8mU?PlMڍhbAŊDUb"4iBS$'Z(mո+P'ݻl͞+j_E/EO˅ԖнJ*i/ˈQ=M\/SH~Tͤ0K٪~<c-Z=q˪>i=ܯKޠ\lQQ"FZ_ ]OтQT Ѷ6&Uṅێ(ȿ"+&K'z==eY+JZ^T>}v N{j&*ƚ,QcL3"5%3Z*MDaF"A&_-VfG+J?M/0-W\sl*xgNhB*@BNB#A(p(hAF|TjWJHx?y@8 -mnwFۚ+r;N"Q1X\TiND'0l-f똮m57ݾV֯6eb%k-[+ͯ1-oNV~+ǣGz쭞>88=xTB_~5ll3WXOP.,Z&ٵT rR )=08KxXlfj)5I2L(H #oU?[_k5s2ULxۏϾI!]Zbw#A eMd0Na[UIm1Ow_ӫ̕/ږ2?7߶Z~j'/Q9~c&$׽scUQj6kp]یXWwf"wn39nr wn hFܹ`Ƣ"wnkwʹ\pX\Q(Fr.DTDI;飗,R[뻅vI̍ 嶵oλ*CH6.l~ȉ9rG?^aR31lh[U-!F0Y#$I$F6͈◷)V9?J"BWiD8+9 bt='\ +7Ll+h[(q!-/z/y)ڒQGKR>w6jqų G&@sJ)2?~~7+ RI,j,B#s8I-ScW"QsU<_)rxWeە 9`v)bEV%uX:0t)9mlƴkAL$̶ce^rtv'_~BJKQd2~>.ZɝQu%Հs:U2QH-.k7S6)N=V*'֮V\oUjU=6fn`s'tܮZ.Vt1suf k7ssr9TW Er뻮dGw@-U_.OU_[~s=c{!eNҎ]:%ʪQv;Ԑ+J]LNSy؝9]B̦٨+]WKߎ Fœmب1H b56#-fۖN[7wX\ۓ\cWzN\:U _'}Nj{*zdzjWf5$x.Vڮfn7l6nV㓑I+uD!JrK`? rN6ݛ=bR9`i10bQA-oKom6fjr'F(ʾ48OBkm#.gM+;~YNgs(riZ_<ݸ-r5LmtwGW ьhwstpeDgo*rC51^,VTb5ZOqCQ$h#ܕK fldcc϶?T9epWTuRԏ92QGn5nVr&AHRrL 11Q .֗t*2l)fR9HxQGGX:6GF`AvcɿQˡ=I|*p_ FMMk\U_,$rS$;n6RKc[FEѨJ I`AP)*TIF,`D5fBmT,ȍWֿ4w;l8H',ďV66[?H\K'D*:9rtrEe؊@UG0+'M'NqVSLcAsvi*u\65'4T;s:\srX;4P*&ɻ\w].Gw9ۆ\qr2WLq/Z+J3qj7wqwy "NmmGsVRvk-mlj"*"$m8rHx[l͵Mqٹi) IWZֶQJR:F%*RL\?J-.B?J]OW')\*Y]ŽB>N"ڧRTW)]8G|ڽ9 W(v[Q59+$ukfU ĈmTF*(֢"1OcW5mtTS(0Dh64 9E]+ӻpw[wWδ2hmsSW[(";]wpgrs,ܙLɗNt擫j!$^Dʔ.;Z ?uXJy$9s6ٵ̶NpߡޔbR kAL%2СL$Fl][=Uɕz(uPUM#eN`])=+kb[1'**^ M xUv@A_byCSj誋kJshEMF)򩏗S&A˔S}ޮr'8%=2M%|{q؅#\>Z.'g+)pQ)xxeke6mrvwnus6v[mE-H+ U_YK[Fl[[M-odA\Kv=]z*=\z=Z=YGuq!zU(|Կ>Zj(ws-s`wvD$H*"$Ņ m$F2Vնڶ܉B>nLJr2dިuZT_3#k5|/^*Np*=vHT6׆^߭guEd1cc]ݍLL$a"r&ۘ4wZ5PbN]sur4,srXk\]H9uqgtdc嫝-Ȝbmr(ʾVٍյ0:ZT҃*._hʹaU΍PVMRNfY[V6fmU5[o~خ]ێkuW7s:6N&N\EA˻0%ӄw\w]p໸w]Йrsh0JM\KI4ę%!1# WQWrl.a^Oyrq]A\Ab&|OkSs $iOoU~MJ{y)z0b#!ȣx%U// KWV*Dbe#hSYTLlkRWͥ`Kj>o*G*)>fЃv6e[U=Ij|o7Hr){XuW-pE.mnWv`*.W#b wp9ۮێw\uDIl5GZt]wI}\Duj OZR[pQJz'j'k\ĩ_OU?Ҥ=O/8J{q?OK*1b RƭMxKA͚1l%I>|9d~Q\XJZD[(ڍ* xxeU_VW6cg^?BN],ҏڣETZGUYP4M.1[5+ $a]Y/tH*|vnw;U`%& XHQaA`ɵ$aVxkkn WUqF';#ܵ[XKhSQ&ѠI1[VoKJ/_/^%TZV"~E`l-t$}\RO) aq:EwmnB( F"hw]ܙ׍Vcٔzڗż@Ui>ՠ\AƱS'>}>_G"AʦI2B9beVGXt&ORr>zԲUr- bels7w]+3IswNuh]û]7wdݸ\㮸gsw\wN]qv\:g[5H W^VQud BKEL'#)ԡ1fplcmqh ZKTJҗJ2](SWEk#kQBŨw;Xlnuq 5o9bss/(j}5W?bsjt'JʏwR,u`/(W*\O>^8W5_=i~0t_ ,,,O&_$?brM7ª>|7o[cXbhmF5bŹȰmVN\[lFđDĚM$hn!Fm\W'w64\tiC","m\渚+9;qH-sf-sq%˒-I#$ɠ)A "[Zk5FT%胛T$LrNMNZ^)4tRھ+qDaۤTvVI ]ػ].w&+IV/-}=[tV.KHU+ٵ[6E#Pޗ$jI7em/"]Ze,Um.sF]*պmQHɬR"d11m[3)ȉЋ Qi> 26P.Vb8^\ZlVm$@vq2w]jdmY4h,VDE@P5dEbڈAî\:[;r6ba1brE61Yw\!tة'5vucbܣQfQh^6))Pka)}r㭫+vQsaEʣF$d,^WG<`:i6J%˽Zj/hLR+Wε\ZXTin 2d)ӆ\䛓sh-TnrPtZ-.BP4m\R@܇.(9DwWkFuId?K|r=1yx[NX33&9sW9:㫦ṮXw.r.$wvcwwwW ӎw:W'upQt8wcu2vv.뻻>m~gU!\u+%6ͲS_R@`8*>M]J(sUOm2`<ཱུ?K/!N.n_W.b!ųǪ zr1'Ɋy͹̝vܷ9snDκpӻ;;\]9\^򧩃^G@>SA1z *m:G‡M~d`==j?)^/Ҥ|1qVcmVGq'l^J"/ J:uReӧt辑Rr j-f M&ֶ}LZGU'Uu_#WhWhƕ9R;TS||6_Є/:lf6uhW+v-ܴwmZLq[91gqw71].\%ݮN"5e)02! OB:8TK]#qbJlU!>.HҧZivm5f"QKUl i|G5ESK0>bvj[E/6>9>8|yLt}}Hu[h&[.cp!uOһ_Cدfmi<gcedQF 1hbcvRv}͉IUPIfͭFIL( ڍ/uΗsnvK.kK#wsKcխ~m[ F)/VlmdQl*DGtwC}u ~SXmlS#(IJ{j=]t5/ ̛iPKNWffl+f `Db(۝QG0Nӻj7tnQi6$H!"c:*$苢]NպMb66lڟ֕OIOڍUޤN 3IF6(ZLZDg0ʍ`mb6bt5ѳ7-b2lbQSLb4]F+9\n@ĤB&]sn%2]ʦ hЉ $S.mck~U?z mUhJK/0oRwܮ" jHvI v5UmnZ.S"kTZضQ\ bJd;w\I!˘j*#ʒw]`n."';lQT[S9ҋbRWwr1%$&sqʹ|PIUatƶv¡{NMYd"Jm01XD5b}Lljٿ Kvuvgf]ݛv}~}\bMQs+k&ڶmlԶ̫qc5esW6ܢcQRV,X" 4HL6QC!DwW{l^rPt+ͩR_IIAEϏ8;iy)zytՋk(-6yU6DE$F2l1ꪼyyyfĽEmM"zYO<眰9뜩B:OEG6 +DfSᵖbjwu˶ SF6YTibfkwuwvi6)1k3b)EQkj5rwvv֮dŤ ՊK-y ":ߕ>S(tEЧ=^z|QmТ+g8sX˱kr5rNf nn]9WHˮ\]w];u8w#I#!˥. \KoĤ>&j;42*65+\sTj-q+l6MV3l[[KJ >$!4mߡJ]n-'Uۥ%}DO/]#y=q¿;i[fͣjAt6WO|(vUN ٥讓66QC0=p볝ݘ$L%%  |[j{!vvԻbl͋o_j_g%Sl3`?lLFA(FơL!Z[ҭmUЇz/3Ȼ^*D.sX^TWRWm^w4XՊ"h0k\4\:fsu(Nۗ,svnTk\VI;mN+];Lۑ9QuØƺBIwP Bdն W{jITmQScm@E+lYkEnU&ey0Ծ-Wť$;6XZsQb(Mi-wrJcrÕ͹r$0ӻQ!v鹮QcXwNhܻEsDG7%k6Qcsv;eqŭqq80J){=Kɟ'-ff/UwN>? 8[bZ-P$mfrNL;*՟'-Bp++=rh풺;zv+ ]z-[JmE=ԯk#áٶdo>~]\Q\vW6 ;'.fwu`.[#9Nv39f#dϹ־_rmbq+|=8WW;QCNT&FZ* C:6UvfmGBvѰ0AJq尝Y m"dԙ.[Dlm^ٵI"iELWy(o [#",e]YyIQu涿ATTso9F޷ɮ%.d"[&ز&(خؐf%n+V7;"jk2[(,۵$滺\wrw\"ĈDJ~mUz SOEWz֛F~ E*v0TlSªQ͌UU{DU65TFƄ$fQEEEyU"XF65+RMb44dё,+W66UMUyڿOO;yyv}*뭸;颔BgweŭpqӥS|?,˳+mʥ# 㫧DVɵmi6Տ$T-6 *~0n:V+%cD[LMPlfPd,jmbjER2ڭ~ 5FH=j6U[f%It[J4BJft:멉m{JQ;Ey^/eT^O]Rz=UG%l͵[C];AzazT:bVkU b)2ZW-j*rln\B9wvIwh7"1ɢuwkuۦ賗 k]W,QEut2N\鋥2wnw'usnswrNr]vwwc1q5mK.:HI|O)'-adQj Q^J3(7q\w;nuۺ -ϟQQ]TU딗K+U18q-8ն&݊bG:=M~ZQg]UU#flnHupƍۗW"h6"v\ʮ*vŹvt(h ) #I!m}u_Ijj||- m(w'vݑЋ%wh~5\P<䶆ӵkQRLm16ƭM2cAb!"L2Ѷ-%KX3+MaH (̖dR1|V1F¬X/ U𐫨GÎ8͖(+sz?:͛1<G.Vmmx3 hڹ"oBtG>iKJsfTStflD_kj%z}slg.D1I87.; )tsscurW.dww:9t1:L]]nK%U~em> {jDT/'K+ 5WY,hmkՉon]a5bW*srsەs+Qʺyè_ШIv]DJz:Dz^W.GGa/񶠶l_Fm`AON">/p7lҎ]0kWӭVbزPJ$2E%,b5BmF/3qEnsnIFm֮hA+N6mlKH^.—\"t:!dڭdFV4&F()"h14ߕ /gvGJ+ XFcb~<">~vٵln -ǑZ-xmcks`-nquʙ3!\9+u+p۹ۚ*hC& @fM(vz*&fjr^&i?mQ|*_U)4w>C+{۪2Nbx{B:x/eCñ_OVSKª_e)|f!R,=*=,)zQ'/赱vM\Q!w]I$wFΜp:厸뫮WI<6kI3MjlRWd/pp~xB՘r]%3lݷ$Ѫqs]#%nUܺZ*QjHjN\366mSmT+Ccel٦\\V @sNvKR鎘fMf;r#AwW&mrђq/t/jWժlie./tهiٶ^eL6lm#E!njrehѨQQ&222DTllZ+ыbD$6J-if8>jzD_5گޫ@ Aci U/*{$ṢRq|>,lLI-AT[[FּQ5XrwnQWwkjĺpt*zq:HΡ_0l6Er,ޝӆ/ wm"%z]LǪ3 _mZUC%m3Rʯ^:4VƔb5ؤAbŊb-$L2A 2O GKhk[Uqmɍ8bjҾj@+^TWϹi,Mm9RRz'fͣjvm(Jssy5.d4m1H BBD&̷;\sǧGQtKgU s[Kd/[o[_eih.hr\868ÌrĢ^/=*x/28 ÌŸ$% fA@%:G;5jF61.Uj[ayۗ+Y&<) ЕQ.z]zՑS?" tR:輱T`I7*.]婒+u;QFΒ-lmҹ$#YܺwtEmD5zNuO%u<k~m`$U}XĢ>@ɱЧVjQQQ3D(lK[X\q"y`)x{K6[bmOW@m->vfkTU]LOo5QTإFÝXZU6ч,shzRaU$[j[1E0iG^3mel\3oܢ"<~ux<𒋘@xp[6ʒA"}v ˪~[Vwl6CIj]֋.[o,g&SQ+=GdDOgMipθ!jmO]Jv;B<͛lّ,&DhMjaƻAvt V~my| L"0b3","% $QmE(У bI-$ƠXLZ-XD4L̡dP FڍQo\w]kR\ԕJ..5-\,QƱt[(Lm0a5&iĔ4љ)&:X?Gm?6 t'zKïzG΂|l[+񴶴pn$^^~ wn\wnWwsv ԶD`b?^o:n45ۖBq6]rw]]%.vtw: g]tܙwn)-:JIwvS.wv"2 uܓPܳZ\:E[Z-DmD\$IMHZ+2nɑtM"LcݹTW2bgv۵$%h(BfDi0X h$kj?m{a1/ws+֫yc@>n85iH]?aS5qA8\sBSZYju{K ŢĊ( &(3%)@)ba/w3mk{7VcTXESmx[¯ xk--1%%|65fleƭB2?lٶn _ĵˆZ2ܤo<(Md\feQHwmc]t ശF"L #'ذ_VZ~ ݐZ.Le5y@:47 }OZ!A"jYšl͌Hɶ"[BCViK@`mmb5MJ)cA͡ʤQ*`&͵@i(@PqC`t(TU}:yJR()TRE)AJRJ4E)*)I*RQI)E)J(JJI)%JQ$E%$RE$Q@(EU))($ RJRR**)JT*PmURU)RUR)RED*RPR*QE$(4P@QF P@( hj5TP*@РRH"*Y@*!*!U@J@*I jBlj@ʚB( $**@>1l4kMa)Ŗ@B@k[0&5Ai Qm *Tͦ cm &LƶTTMfkPmXV6khX,Mm4cla1LL6 K,Mb3``Flم5Xc lK f`ZYb!)jщ5bтKMK0 l Z -VY "[f̀Zc`0ٶk i"ʥ6mkilll``-TͰ*!Zm%-5ɖ̠ mL6:`FLL!4L##CLL U?  @@h12`LA xMLC (4ji! @4&M0* 'M1O#L0M)M'g=#'ꞓhhd4izCM6dɠ*I454ѓ"Oa@&6hѩM=& d2M=GI4CL@4 Ph R)M4&F=h453S1&4 Sѡ3I6L!4#Sa'S =54mOI=F2?Pl)M 4jf CCC#d&i4I1M2LM2hjeO`hl)`'OVmb`.G.rضmcdmC6ƭaI]h\' Ej[X\814A< ?K2-/9͛@U_'3hapZIJxuEˀiIE۶PѢMY5nW*66W,k&GwljΗuܮ ڼJ%^g]LrNtt܎nE-xcFo xk']xr .cm7n;x]ּwnj5vQH5^ůW%jO Ỻ\"֍cE!iL>ˎ]ۼ"LJF}6|6+Ǐ,YD6]뤕6"SrkQ^"\kmT__ :_*7^7{/q?IT~ٟƤJ~[[\֠WCZ 5&&U{ l'6Ο?$~6iki+b[W= (SݟfmrmGT:HzD9O#VZ6k@di$5k`(׬FDns$,$Ɗ!1̒6vshkƮrS&˓- !(**+R6ðG/u^bynK] {p{=dhIzjƧx/ -_v6#Fu^/֫ԛ!j4!DFh1R`-mly<76O36Gyzj$fb-mTWS\Qjy.={KbbɆ6:]Pfc,cTY!#Fg4TR#W1].5Icack)m+~[lqOIb'ßm^J9i6dj94+41 Iv7h$&Is5j ?lށ>ymovoq1CC*)b{(OTݓՃ͟?k-fٶlk)܋ '{*>U%{ɩ}+k%<6OT#G{/vNEy-r*51WDU0ﵶK vE'O ^t{=%Վa}LVgALyR-mmmħQʏ ǂ{pU^J_+w[89^%[ ȬjDb@H6,X44!h-6QQc`f&fU%-8qKO(^鯸^Ou}/' x;lxx(xxxOګlW[g\Ry˪ɷ?Um^z*#-Q\Enr4(L4[66-607w ;+\ݎlm;wTK5s%lmi1]ѹ\ܹ\:n sn9\AnnQc$_kf֒m^=qkjW)'fSթ=9n\.N-:Rgw&M3L@i-LacF(֯8{a7{.5|knX[%GQC'jQ}$D8ߓ*|pٵ i5!MiMʮ\(ܛ[VH4K%h1E mW}.RWSHM6VT65"/EoW'}VPm(wZ %ݷ5r.TG1W(\wrI3%t,Dݍr9uDɶRFuhMQ[msdrswtk8nCdW+֤~Oߞ}56amKe\les[g:UK]89Pw WUN٬STwnBl6-t$NsDW u-˗wQ7.;]QZu\5˗Kusr .m sW7%b,h%m$kDUvc[%׶Gq!iz;>|dY/=uZ6֛ m9|||w"͛uU [3lYk^_.vJ8(窕mٛ#hޑRvt"!Ͷ aetQ׊cF0_/}EoZ[&@Ս,Am&-Uظ(a:dwv6m psm_-~cVhbEړEe`١w@K%Wsn>_BUZ h0L̅eF2L}ŭtX.3>V/CAϫo2Q^xu^jqʭ^YUn\6D)SfфRlDMՓ#luO lSi3 #VE[;]PXԍw+6j/_*kѵ4&4Tl H5mw?(YbS%ȹjۻ\wۼx1oKmk__ѫm}V}3#34v*߻TmsUs{/W]ޛ-ff6Vʮ{DudmW^V0h1XLdR_gp7j>\'gK#N;%;)Sޗ ] l&q?ZHrllضMl׫̂b Ιc6mex3ϩJھ捵UssR;bZ WlU<7f&mKd[P2idъ4QVj-j(r9ہ6Uҹ((ۓF*4PW-r,'wE9k]nc'\Z-FDlnAn땎03klq_/)W$SmllAtf^]|jر[j "(M[LqS=#U:Bu.͡[wu~'@ G%w]0E&3caV~Wz _D6!>-a)66-mMcʋT_XI)G-K ipE7[m_)j 5횂kk>¡=Oad]I/Esx6ՋeƮ19ͫ]s|7_w[}M,c6~ }:I?iW_g^#PdCQ۠~NYm6>8ܜ7TkMfrUƋbm(4("jIJ1ڿF_?b^j;"*<`WLuSNR6l\6pБ'܏Dz9;lv=O[lrqI%br vTIj:urvWWnrnu16llM+I֤4cw?}.H?%?b'_J&* D},ltZW[YW9]e6.c^ˆ^˺G^Ria[Z5ccXȣQ [rV5s~s&ˉ*R7#dٛ]K*I+IZ EFj"5" 6 Ŵbm([RI$ƊQEE4j4a,Fo_Efka}iƭ}mXTu/Kݥ/ZڋEmjgzĪ:.WxګGХ)z|vI{D*// 63r!1ׅwMÅҠUK<Γg6͡1OT=SGWx%e֤ܥj{{S٪NqƥZsb֪Ejł,TThK"F47{{إBv:ڮbY)+c:]76U}h+666 i4j6"0Pr]j b:C14h]m dd !}}U} 5Z6m36GZ$-P wh]ZNjwwqncs\hZW+r4E]w]@;Z2QnTW6]9s+v; *u`ps3rh4snkՍ\-N溊@lY6*w]"fers+Wbۑ?jmWm7.k4X7W9f+Ӿ؟qs%s"ɳM85Yl^9koYlub$8\2bz=bl>eAfmҎVU Gත{Q~}E(ut^] ܏!ԺOK>9ɬ۔){x^ާ# {`zʏ !G?IGKPE{j=O&ZֽmschlXђ]LHOJmUM7YHCuLׄ-)qvO OxI[w/VԈcL,'-0wQrcjjmt7.&1HEEm"+YLhwnmj-͵u©6cXEC܁]ZӮw\B3o WS—|/P_ Z5jmWk!l܍li)A*%XQmS%Qo7{m{mbxhLJVK Ex[~/_3CZʶs #sړ6ƨF >|//~mFUscl8idQz=TFGF/y*uKrճ||HZѨZMlU kj6\(w3sc\0؝p戺i T7*nhtZQk+ѹ6˻5nk.+fӍGI*5?C[*|t~hQzzll/E2;=d|_+#`vu]W£f ݋]wzw~S/y^Yԇʗ7#6F[Fj00 (ؒ6lIAhQU(F*2&67mۻҹsr;N\蓋9]&XDj5[ޘNl[\6f=}?pއý?^:=;ӽ=;Ru^6ym8^;\twvV+mrp $_Ek-i]rlV֩kf8n9R"++U5ElU- o]mzԕ;6KnĔ '\G&3}jD v]O҇4ުI (Fԥ@i+Edk(*4j*6($[wm9ƢksnWKnV7!5˹\Ә(wml.n!^g*)/f'Uv:ԎԮHJwe\n8ٞd{Ժi:$\}%KVmNp^:懴3m$DhTZѱQQFѵ"JdE!bV*6(5jJ6" Ur6)BN]R_Ґw;݈뙶ɛA*_iI+ uӛy*W&m(V+mn-U]e]`usϝM_<^*m/)bѤɍ6lMVn᷃!=.w w];iɹ8*<',y<(+58'gunmn5HE`d˻[L;P{k^dm? B>,N--*oxkWk[_fƘRg/}7|~w.#s9.Q#/'\XDB# i "$?q%+JUΏUz~C~DGm -R~:zqs+yO)ǝWC. .YD_,%@!5(qxɈi > qq}p냋Q0@($ܯyy^;9^/<_W9s:F=Hڦ]_,FEa$E0 ,MQ(_o]X䃈>q-p^A:J拰sh?|\S|HX|`X@@ B}L4\5f#a[8SdBr^$ JU:R "A >/ GL`$h>e@qOlS`P0J, +"P@R aNt5F PVШoDCĕnW_xwt6C<<_=q a MfА$6% ㏼.u$=gppSKDdR >q|UHV8.:pJAY,˦UA x~80bz M0 M!I' P`S#J#b@.XOfzFy ' & 9@e``'c-U _\߉:FۙLx!A@L:%p<8},**yJOr[㈅٫jLc+L,Wݍq29Ozn[̏uZ8xm;<}1\@_;|9}^@J(D[۶nYEOTDaέ]:W*.ٍ9D6Mo/ck¢<T(K)|;ES!߫vv7!&5Q>aE>KJѣMz'h\ r_?G:srxW9xx/i[Ur9GtW;t_?ĶsqdesZ;=.oUk+znOyE(4'v$f A`@y%vI+1<`CO3A]K&hC<2@8!-8#(13 ӦԓNG :QAxA 1z qD6jS^ $,$Ib2yݹP{LqxK lKzmhG^K̖f숇dPVR 6AFZ.76̃ S9a c:TfȒ}W;ln{: Kyb1EMFl]\!V|;݆[foo++ ¬W^oŚφGLuz;'l/|$(-?o跣'~n2Py>+ߟGr,{PpP>  e;J2_tMWTM/͎4ߣ~>0T=Qb ReV!U@hTftnٴtz"fHɜq# f&g"+gU2P6"WVb"$&X>0Ӈ(@E=#"(65.^}Rj8`F-Hp[G5(Ɉ [YSw@YV+~^^A#FžQb4ppOw1U\}R 5NlʝTvلRO H~S#/M[]" |uiffu$z[>^o@n/笯?,կ{G./ 1~W6se!RC  q䷺>On+Y![w2ڒJXܝ2-#'}ݲ|\nzNZj OtԔzsq},磈P4XQlSS(n.~07* ׅ>fφunzAFL{*ЧJahQރg/RLK#tޥdU RyTԋ;s`t ݚ?$Ih !@J;'!C ")w (;= ZE( XbE뙒uqn Ƣق3tj*0Jfx+ \Zēu%G{do](-jzC 2PƢMH}뛏I6kQG`)5KL,1Չx!rے ,v<{2_Ke bh]xtB;I>ۍ[;NC6(( ~ P .tƋ_xhCIRȑSzN*R9͈XfI{ӣ;C@q>ʒF~7u1\9aMz9ymLŻ$ɫ+^ {D;sm ʏ0uP+ΜS z-QkwϋTSthb,2sEW\ei05۰)gVgW]S+ 9 BRJ1'c͘wfͿCYЇ 0^(aޏFA;|q:VZt)aշw&kOժTZB˳R8STfhͥ ܵ{F ^zz i x*M1l1>~[JRWHe8A<wZYynzV\ןzNA/I~GSkӛ Mp {i1%# 0FJP a"s{yVy49sb0< HDVyf\(@BS>M5*\w3S^%uvhHnx5DA1P_M=1KRM̴29]@} Oʕi|iKTOhAg ][DeFq9+k*$F+Qt+k;}04O͌fշU,;Ξ.dn:DSZ3QJY+! zRAgpݱ_.:m2/IOӉqĄ9R ! aYrƥL@ZN~oveF[k߀7M%'ٟ| %yZ`p^+-)m[AyѱFfqj),=De ="65xF@](..˕oiqZZX{d"葷0 nN_%e&|iLM{D̃Vۯwf-%B/=\6r|x:Gj= 砱?QU7|qp#|{9ѵ3OzdV斂C![j8~8wOL~=Ʌ @02W̫m)sY׫ӗ`W+PڶTD9Kl)W;73U)ㄛT'\j\E*xj+i^c^cKת%d3?@@ @@@B,.U\$t:Fdj1)L ¢ؾ CPl(D c(@1 !A`CYGHN@X踊{I{_?~pGS ː-#~;|uz/QwWku_?W@! P`{B"?C՞.7X~كd ND_ >Ȋb^|s_ ,b qq1d1Q^r4M(88Kno^S^7'^91"v 1K@t@$&+e 9|"6>$׆7q2[=SoZ(&\2[浕ZބT\z@J( c @-2St% sP=x7õPPg/G'c}S` E\@8rd,0Od DąEmg N0qA1)2id, He1T /Zo;} % $@ G;|><]|p"Л{E<QxN8CIB=9BAT'.N!" ' dd-d8Āxf38 3C|x?8R&x]{B |od3U[ptX\Ʉ@Z1dK9Kx52sB10d -bC{fC(mgdh+}{Z Ґ%څCn#O#Wht*%X`KW_\31ٰL3fWG|6& ștg0׍IQްdj::uDaV C&D/$c=<|5%*!{_oM BF.xvgH~{0P%H}'Ӟ`4s$wS^4v=gcx\n#0J!PQ2 PGtIH1j:4bR#]hPF jr !6@Bx1li r'ԔZK<[KO:۠+" P $.lM.C;q~ufĸ9F E&"!i^MXP^8hECD" 1Q0\yw 3kG:üag-ޖSx/]M.?sR5hv8"{ky6KP'I$pt6D`GEN4C | BTaX(r! ":m+h.m,lKH򞤸}w3¡ Z K-(J?_7n&ͥ"LXIX z ֔@@K>_S׈6킧7+~f &E YwcUĄH/XyD84וy:zeb;cB7 ~KOwH/рʀS l<00Rռ#X7#9"_Ƞ)ka)Xo{[Ư+(xs}h~-6gKz]]AW;o}DE 羈K|PBlyBBDT5M@,C32~\adp'ߓs l V? DM^%骦W%Hs(gʑf}@({%xČ1J 9 f Ʀ` Q}2tbk#]$#Uߠr&$c횁:DJTCiqք=[; Onl3wN8Ww/baʄbPVh0Ƒs~8.H[xgOQB{7.,><.h,˰/Kv^}xZ(e<ê䤊EJ˦\$؄ /`ۭ^uY5"@ ͕!}倎`.py`Ke,`5%GLCiy28j2~Vy}XP$B TRmM4[<$ЎHlP')hv*r 9slQ><*1E7?VۻOz.0[Axڮ{{tw mV_~FdE#i``gR^tSttD\VzNHI( 4<=4-s._a>?1Ž0w㟟MzpӔ1ɟ`:weRNY[.*Pȍ{pg9b EaPft$h0|(亹b4-\:^E2P!مQ%'ʭ]QL9p'۞L:hH n,$H;/ "gQmB{_w{{T~4* Q01."jG$JRNwFy\7-'>^S2qr6uC͈ ȯb͓< Ut ]z[HV# ccr6"rDGT'4}P9SZھGձ`>/+T{g`. Р<`^DH<ӝK Ìp#I ۵:=/lH2KxgqsgؑRc66Kw_a;_L>Z)^Yc9ƣ6L‹1$`Ք! tN0$nkdְХt X-ڢ(")R0!#>>'()D[#fB<01 6>:o>zr=(Laߛw$[0:{kGNX%p46BYņ#Ԡ_-$y!1@4ԵJ8~1DqGTkE;P 7CYMA9j?'y|Y~Ecr Pvm*be trB: K(S)r@g nxRkpFKL'A:bVɕx8P}C_+sz-B1֎m6 p*V}Xgpud*uVcJ<=`i$H"s:8RQc7SZ ޫzzk=-|z~nϡWKP/x}kO0||j)2`e<` i+Mt;>du&϶) r8Mu>)<J"Iy!?l` 7Xh<K[ ؕc)>BAevqْn8Ҷ B?nL{AR->PCU2P@ze.g5{0€M>+K˵V|rAd>-bk،sݝڹ6P:a8t*ȣbiEҳZxM}C;} ]̐;~i=0> r_v~WV_&Mf0o:qE^5K~Wvx/EO'rɍ5U]4l!*a4iFE/̘MvyƓ9VH2EQ{N2bi01xϱ8O3~1)׎jyĄ0N.­kRCtv3;8}=[}^6V}$x\ )CȨr]lpo"+~~Rz5Ƀ٭ڣG%K~2đ%?[ѰȶJ+>e9΍y-&Y;udDp:EE b% x(Q!+p P4x\`2Q`P)7UND;1p[znr({D!CtҢ⁔0AV9ffhzGbsBLDLj0cLj&ga!@3J#800 (.|2Ƹ܅נx\Vgp m\fAF2ly۴qOФX,-Hsئ:vj> `o QFB{8J@a8Tm=hi8|ۥW!@UdY5 -/X+B1!jJ* DRZiYS 8;_M+s?q0ePߙ|t4Um:rQz?777Wj@EJ() +TδvF|Kn 5 -5N>ݻp ba)ZBm ⰇQyD DB P`]u[z6=\5]gR^ϟuڝ VHm[z!<:\syK_q"&jbܑy,DPViT)l/^.t˲A02a+a`MLWgCh2CN/KirU]vjlX+}\m8sX$ \> 4cϵk廦߭4{@lIЊ9,VϞ/]2oj H"%Vu=F2(v[~[$ 7!u9_y^L~,S# [03Go Jq2$v^w :&"O, Y8<~mcQB:m%GM[CtZO31cFAvMIp{O*L eҒ˗bEZ$P6tBkl=.eYT. ijS'QOQzz=(}UT%cw=ݩCt m!+]&0:C&~[IPyPtepzSZ }eyNBc%%f2?,ݡtB.BpByR;A ?;S<0^tcǬ,FO9=v#՗9u۳9}>>6"C`~yfO㩞Mѵjt#PgAv6{옴 @#C~> "!b|0ILl0;5xVVA=QIB/T(FPBg>W[%zj3m.[9[;J?}5f;~^\ ReSzTߓvY]W :3o/c'UWRDģQoٷp#Ra1rS!G5k{;uR"% Te+B>@Px+7> ڴ6 ŵYS{r o:E'cj\O`fPa's뙴(72b ehGt*oC ,.cDd ]h %y6&RXqP^=?JZs2{~\YdQ?;!IB. bξSW 07zZA~dH6643:J[Xԥ8>jzL֌!FshQh> @3礫 -.uޤ0/KPA་bV:AzC{%y"L}=VW/jH1Q0 bVKcV&uYJ2Ɯc|i2n@gs,s˦8™7UWs9+w&qnbp4&G1b7e@2[C;Xe쾊=!jHc15TeHO*MH<va *"2,8A}処@0ZN]|Çc|b4"du g\7,y9y @m,Me5 D#g\n6E݆B  /$=֘ a"pX "؁3M\HaerfrJ$ 8FR<Q.j$ E.:㽁|OL"gWXH"BDkRG7uFW xeHɆpIrO0"vzٳ_ dngL.9NgD EDbSڥ3P1Aik7P8-G끪IYwlTۘ\Ocw,\*Q`Œd|gMqqyękmtNY,D}#pDň)11@ fs6*%QCWN#MBs3)ʫ(z3}:M isZڢW8mhFe *3,-2%,*2wZ5į2fywrYF2yod]|{1 ;TR-{Yk ^(2׌BrDd'۹7LKkJ6}(qz!i2ReQybT 0 Ii`]]pSS e ݊&/:7<W_C V(GPCxҩ4#uWX~\q^* 9aYг3}';[<@Cjҧ-ߣPV gΟ2(ti#vnA"mǰ9.8?t/"y*w+\X@G0{>}0E/$v LP| oQ(Qn==ڪ>aǥ#b[8Xכ> ZnC E!;K%'8)_u{^46}<ڪG8 ҪmG%feEBsaX=f$ !@x 2w!R"vR?fA|B0CplP>9cjE\z$k)CGr!WVu"bk&!41~7ҡQBoa&dd^[0[NrK='H1>\S֑@m\Ħ˅or믽vWMC:ZK&F泍T #Uqޢ%p19^~r)чCE LD$>;̤ވICmS-*aSѽ)=`j?n^9iR+vBhG* pG'ބD5T 7lT")yjAΫw^̐A9Lj &mZ9,q_ovj9Tr،nyW9jGzg;CA ~Q 8$ /h,&7r*+#! |V7ҒaNܵZi u.Ll>64Vu\4Am!;Ϝ*qxڢš@V),$߸>g ].t/0S%!Pp9mFrkm &>ʈ9Lx'RlWgmA/9ZV.9ԩ9N+FPM{\(' ȾuoQ<Vq8(}$?a>;4A|& kO _E"SɦVvCaɲ\TB߃jW6'B~/]x^dRbXTGd (PD# }o[f!j h9R +}-[Ƽ+ V; fBT_f!j,M a$gF}XΗ -}Yal?̕絬ĭAΒR#E2UMx䜃~&uNѱzDv8R*uC#jMВ]&?Zܠ_cA\-lr1ʵ@F-w;6q3ޝ q25(³e sV(v$O /WUsc[ s8JD8kzsqU8]rvFۂ9&Xg[74? {4߈JH|WM.p8".ǠOo$ `4)Wn8X v_(۹LgyG9+CX:1o(0t-j:;Ӑ7`Ct ha)wliҶAlv wF.mђww梂zy^{/);wڷ2fsJ۳}uqmZU{wCꏅq*}>CV`ܨge,Ak#R"Y9'CVHWJ>eh-֊`:*Ee.QYVQ >&KlgfJ+ mcNh<Zu۽T|*eGK* _vGCzHz^eL^*@Or?sHI^l0bBǘ }M?ҎROsYIٓ1Aaj/A5+X+.{ʳ z_,LHunJ~q&2N7ظSvI֡ދ](="7<3 ʕq JJFn]c+B!rLRG31cՅK0aVP0y=%޽xqd +?w^(uknXk7ߎQ1m4NOێ q]Ko`r䳎's{S-aK~tc`hñLI)& Y,ӧS^&ɨuX\Յ:ܩorut*sɹ C 5=J|1S]9y!3*-̑MqoY} Ӎ`tW-LE2?"ugyΘC9.+7PKAOq\oC|xϾ Yҗ5)y‡ػ 20j1f_ŐOte=N7U`)$…Af )>'#M)ˁtn~P'Ab=bÊ䞗<0ÞTA^9UȈc;Vpb뽩ǃ ;4U 6Ԛ h6 "cE X˘TpVv(6CMYm $]0 V9 t 4)kQ yA;g?T" ,Е>xE[K qY4k8]-RO$CR$Ʋ=GUV3G˺_2MN^ LHX≪&4C$>?9 'G0ɨUm_g*>7&> v Oua\ql _z]6EZyaE39{)_Lpstز!iB:M% {dgE밊\JlՁ[0˚Swa: Ì)4r.MInk Ir9Kx߁5ۡ` 7*.Eׂ+o+98Ŋd êϕ^KgU~PWX,2!6vE^ 9_">%߱ذ6^]#=_8GFgZ^$ƈ2sk6%{xky8j|)30YWh:*7g&0i8ð]; wKUyL lT*=Rq*9 [zv-fAW)ޝXvuGÆ|M1Blz'Zƻ-ygh8Ď>Ԟy!QǢh辏 ?$0{nU$Pns2ܐX6h*vj^\'S}"|"FژH+mG)n&i;FɈs$£TVW_woGg^ٿcDlŖQ$,w[O{ x4oprauev?#eX;?xMeWi6!-:׵V;JScl6j,X7IVR/6+AEW@YRD}05MuhWc(אFwWձ]zT7ܲEզn:V`AYe}g ptwO Uz60KW:AzL-EdUܗMU"\3BE}7}|I)rX* ENMI VHjb6ܗCt>Y}7=T* 8x&hݸnGo􏣿dm [%AB6Mi{X%D2+4c,&yᮆM cL6 ށoYU-y-R+'L5P(yZ!"bqcå3wtX DGt–lE./\Z#I"*dvgv ^Յ3#R&KD.LvreiC9x0cM~{+`i%.GK P}JO{77 ԕj uB/uŌ,~[rO;v^kxAiTA?0TtNɞ+mx7}bZBnj)ǂg{LW#.>}IVM"RaذH,Ç(PA5q̮s6'L&ij[ݚ#[Jn4Ci٘Nl.O_kgd_#HNM7"Hd5m׸M&tַt'$oR_5qo}uhRA^rCv\v }q&\vApNg[7&<]D%.V!TkJuN0mM3k+Z>ZMR0N J[z֤TGtYf2H"c/DOhUMTnjHJ g[$XN^W;EPBMrPW)BW뚙q2QSFZ:Dϒ[aK)3kyܻ_ꅏ=l24Uvs"/9}Cp=xjM(Z^#23ݍkK暈"Qcq)F5m-yj$"C2Os톨9vYC=}=fK/dKdTzkK{ ާwt~=\'E/}SgOXL߻}Tve8jcqJXG1dخ N/|הL)i1`)y˶S-rXLEdc ġ'Dyb41inUa(HAAGsUmxIxnpG-L /Ujɝb,O@*u)W%a@1`ZcjUGuI.k2Jqx;2mC*kw<6WfQID>AH$ @$p#aܺ&LպG nwTkXHzW@,uN㡗Y~ҋh|ȩ(䓞 ˏ(K''XSŞ^jߌJ`eNh %!3uH*J`=sVhZNDn+,϶hs{tEz[ %BRD}8o2ۍ2dzrKq: S-ƅ<Gs(<6ۯGDr-S81Ŗ҈6Qc @L`%N˯%,’D<,.h M6B[ɜn.@9LqZ 똀R]CCW 6^>J)e`+T`Es \ gcʭ?J-vӂa6V{'%Jjo) MX3ͽ ()GAQƭAfqvpwA%)*+XJG BDG;jc1d~X>Ј:W!܏b:)}>Q>7Qd59cS\}NvKoV@o%#D-1+ȱejΕ?WjJ5¼Q&}fw#!- v^ V!N1(̉Va͙.)j|U2h¡ۊwf W-[(ӧCb3Ů&UЧ2' vgQnD34ʩp␹FCnõ ҃N!$ɶ Ɯ# muut5>,Sݠ;pk/?ї[|caKJ"+T:EIBY_ޮp+dF^hng{I7^,bD7-qU)FL;Dڵf+Y:bqub2@"V< RzU/w!)&u)p 7$0V{W)qE[L L+q]qksSj+r|Әw]wQrZ~ J ~aӎߙU~v> ~ܳ:8VR0|$Nv7Eg(Ùp5tKXRsDQ ʗ*)"bqC~s-\Iz9.}.Œ6auw2׵UfhT(r\c22.E ^{ )( o1|?ky5} =BOi+S5Ŀ@7\x,/<  ,Ct #; #),f\-*!\`2޶ yLCDh.c{4Hye\ }U_:b=QYҦ'4ޡ8Q4RZe)U!}JE'&ϣɳhRGv#)$R&i#plAW,֡yx`^\o| GWE5LjֆݲTjLX,;}x Wlp:Uy=1mPH]G`z:%\f{6H6#`WO1DTvG+Z@E+!MSoϔ6Kn!>@1%KN控yr3$wr%æ{7u"Fw9n!]&,Pt檙›/&77j<ֲT8Db#%sV\N6mشX>MY4Z#Sݨ*,OhOjRhwYU 6&~)Zenz-8E?Skj n_K{G]Ja:[p3RdׇBy2lRPHgk>@g, ,-01Rl:9ZpD10nfS6tj U!i؁3y b?̖$|eƏ6($1:6DDj S.eJT3E 4a?b eeI4)| Tٗ砵Y'ԼJ}9m/RӒU oKDED%8OhrN80!#4֡T& uLθɓ< cD) W#)\ʼn6pڇ_>]r31]6EuөHBg*XA( _ji" rf | lO5&R:7PnWUyrqޚWb%'I I nPQ9Do De 3KxuR_pQ¶R$)gB#|¢DJ(ž۳q4 Gnq6+#>.h,Iz^TSZ"S- tQYQ<kB&* }nL}&l q77 UnM\%+:+n(84TB)[%;ckUv0l/Tdg-F֚Lq5؆ٿEtUWZ9jEm໋ne4󚙎mJ7/ HΛIJꏈ2 ,G 'YĽq!F 2[BRѤ!?~Ŧ'l蝖b\ }pBH)j/"2Osm `Bj|2dHMY]ExOi {iY<ouu9b&xњ0T#%Q=rojvy(WI)'Ε g3"yt%hl2wvGq&SE];T"X}D=[Y"c)qk`{ #נfelbg7_hX+ o{і&㆜H"银->D k1<1B1.E e2Y.k73-ZeU@χg]vF rr?b.6dʩa6~sw]^L.cPk0[+ V .rdߔ&-'jLRˮS(x-YX 0 \ tx hc\3XC+2PY*!"Aw%Mn_z|0k=У-X v qF/@^C9ۊl@͝ vHkij>B@.sP,%Lݝs-VSW*gb#ؖԉ0΋efʜ *&U5RX_b:3p |kYj(fK O>f\@Qt" 6q.ɥ ZSKدvj&YrQV;qÐ :Yn'aӻ&$% }82yܜv`dBlmp7~V76YK`&mIŠ ]!3@-peSƘ:o; #ݼ(PʹH Y0y;[csݶMໟњ-Ucc~P;{ d-jvl;k S(Jng;kG ne9$ȩN΢\GBX_ג\ݑ-5(Ҧ_zWV3!rSF kR|wֽq17&$Z*9q@G B*fG-`ׇJ>2aIrq(&4&y* L, wۃHoffhK1T~j0?NKNK Ut/xyƀ1JBe<YLvLm4粒Dҏg #̰'B qb,`Ɨ>6 N~B("Eb1=@j[\S}\, (0ۢr%cH(<\EPۛjp6 y3k;SYTBIMuDl-) bwofTvR2^sSVÞ`AKD7Dv<fg!2[5&PJe(Cko<鴽'ք:-߰*15bWM8ˁ& |X΍m*NH  ¬y6LRշB6km.=aOlwqq۷Pb0,r +jP>+sXbSǜKu=IrE`BA#ᐍ:ik&X2DI{TOk KpF8l%#[!EmH6]HGsǀ"MM!|fƆc7^mAymOwԠ9WS,Q#d!>Ds(W/E){6//oB?kٓ [ ^{mͺ0f7銗f[JO>0?Hh# y5E0X_c[u06Qvu,"Pvf@0O9Wn]|T1 |"U s2 'ܶ :'S>KĤHz6.0L% ! Y"J)QTP[,\0=}5xf"3)uaJ 3;7.91(KLw&/W&<:u}hPS%:8 Vv#,,H C0Xw|QO@a ړ3, CӞ`='J_uh˟Qy,usS`{*Qj+!2+ɶǗ\npqfT<mNWP? ;hV$Gfl*h2GG7Te#\xNaN_޷]'mIS ۲I-zM60Avgdg͕`LЭԋstmͳb0SNJ20)d"9UI9ML'w7cM~u_+bys\xB*)eRDPEZ\dЏtէl{\8:9b )9v$n*Vza2Akhg1LnYi ã5 ܭ0~;`۸~x paʍhX77Kxͺ80/?GUM&Cςqkd/_Ý/ŁgD@nIN?G/YG՗5:TCe@U2itiy7߉\s3fӟCIE׏_:`4c7U܃g5!:~MY&_Xj/^t?N 74}ߵg̥jK]UkZBJůإ1NA8_maOS"׀vmYhVk^Es;0!\${x9bX49i;qvL6 LM@2j}~j1rrUC|}#ת5<\Q4FyBGװҹ$2e?z;3NND]UP*`v%PNq@cd*Z}ZE@[nԨCʺgMոXwJ?mk_'c3º6Liϧ(\W_%E֙wyO%. WuU а:YDUŇ}6 9! E&j#L3ط>gý;Z6f,h@e}8ǻbW- ƣGTO+ hYR/>|;۩HY1lG!@`& tZ[ %`-tAWL-tZVϟ ;Xef͛ ˯ -<ѿ e* ,;ި@>r]a}1U6_uݢ|W֦WTÐ_t=H٠|t1>Vݰ9-$8oo?7Rs&ȃ&{*ť;iRDڍCo|`O[&At<,I8/=r5}ɶcJ[-A,doi>6a9B_{˵ vN/~:̀u;;=+0R!k9C @R%" )l2TJg=*5aƎA5=$3⃱~6>8~dhD*A$^(ԬH5 |{9 FXzA YݮVݮfx 줈ƋPJT_2;4uR?oɑL`.]Oh0ɿfuc2{s[ʧ$|Np$XɊ^igOlvq?1[Z# =^3_KshJ~`FCF>EC8 shl,CݷqY;J?`bf[U ʧx41;_=QfK׋ZHs)I6סF$lؤYCz;2az9oJxo#lTZr@]m NPLA~(Qx~Gc !(R;[d}  wfHt.6K,i"9P>($Q`oRoc_uYXgMqٶ볅MznbE1^n 9$hWb̪eGwy۟I9"pn.M{DbACW}Ƃ|\OCfutjl!b9&JtlHu@v$KtZS6 m›ɫf wbZ|~ڋܡÑCN2ʳ4'B5̠.A* Ԫ(wsn | OUtIV OYE*p:4{#سG\nس?SXù |.6^ UeS-<u738m5ݠ,{%?"5nNU<xQ~k_"&/OUNR|ѻs\{-8=9-3Zr\y/%p(4Ce<>6)M9z!`BW t&Df4FǼfd{n]V S-.]7/&@9GJ;kOnt݅_$z1sϽGnQrY;X^JGq)^uf^Ư E:$6!y5+R" b ~F4>hi,wzuR= ɕ02 q% d2A+ ?F'=(K sɆo61:Y(L{N+ѦYÅDd5whۉȽ{8{fe<]>tֽ$X_rB&(ْ/TnxUpʜٙR/4#Jl;r#D\@=x̧C rQe'Bʈ.f\&b=fȦLٷ Kbk^D_j@F^EpŖ)"s,KK KQw9Y;Jw5;'SCĹtTc4Uܨ +-D$M$@ AEx~ۗ&[0_d+ 3JHQr&Pز5gk϶0!  7W1\=HCV*CIKTf(VqHw xF]ǃSB ͮvrqGXdᖚ ".HzsP"hܸD&CM֝? gZ }oס+>A0ލ}U;H$5CI"Xypr'FUD>Ro계L@vwp<ʠ Cs{ /j0{T5r> 9Zo  ] f-izN y&݃@9ЫЯ5L-p:C`8p>+w])[xӌP(`{H20fM Bg8Vd-|%zUXJOR#p̐sbH-Lg{V7R@({;fԢW6WgoYL0qHڶ\DD[ɸYZ7H&Il1 dm_2!J瀚2k%JuE/!a#9> ěqFID` 9};d,QNXܔ%`v^S_eAbX\*˛a fHaa,A};BَB ч ;PađHM3UxsAis](gN6d^yaVp%R~q`wE wKZNsN9 AqӀ%PZ9H1腄o`cwѲ$?x B$iSfȽ |gLAl۬|d9R9էJ[Dt%Fo߲xOyM΁#(-BѐFBzhP;:@D3!C. Spt=>.Yǣu >7q;1c޲$roJW0gbc`fծ+_DŖ?/i#T4,[P&B&jl}8FDdn|SaF4 M_{ﴯgO,prʁ=|`R69<}~n:S2zf- (Ɖz_Dr,::Y- 3 m 5#z bX G%#:"_aӗ>Lul͛Sd( qImLs^8By<2r]v'X>H-Hxܷ:*nWc`G _z GI0_|N$A.v#ng[y=$NS,:Qj /h[O2&/9/26Ҋ,pg\wa %9cW1i#܏#n#_oqDA7UK]ܲ_ xzտGȵMqnvSOn:,n' 'c!`nC_%-m{5Bȯ.O&٥7vII0cO%0t:܇KpmwAC{Ϩ"U <|O^ Bv‹܊t0́Xs,9{LѸ:0>9a٦v>-s%6 {`v_)?9# /;1I\Oz(!mEPǟ6ײUN|}0֚pdbDS~Zҍn&k⺨d>eaQ;ҷMI C  u|҅"SObL85`4dVYeA9x_ >$thܠi-HRcF X.xETJTC,0l.i#R{oWxu6z+g{L|w sפ[X1mP6.vlͲϹ(5~'yI'B^cDV!0ؙGNz][m}/ߔ{MP̣JOd{`_oxD8Q$i!ڦU%{S+ҧ59窻tCJ ZwQ6,.ɯ_:\2` 94+Z< !cr6ҧO48>oпZ~"%_1BGfeg5pJW%)F@i0Q(xAW,?U.UakȌsaef5s%fP8^^,NVzwďe> sdO ͛^֞M{A>Պ22ÒOp??]f-ߍ3O ~DZ+>=8lUxphqR$_?,_Dv+ E7K '1ɡs¿3h:C3%Fx7AC'jlcn wÐ{d)hIi>l66fbɚFZ`L63[,Ew{Ϣ,ǐ0}F''"2La&<#<R gȏZ{:,W)?[ZmQڰQؗeCHkS8OC:׃zsg`4Z}<54"g⛙SqoV\fQs5%!jt2|΄(O -U < !tA4)r},{IŴ.Ũ IBlxzG7*Dߟvge%.q:Y+QuVq9@o/<`IH@Ɯ PG?:."p͊z'ϧ`PCCEE+G6; j4׺jаh3*!=lꚷ$xA ? Q/ks(9;Kj@(!B=7scF_Wa٫nz[ zXhJ>mx$B3,zaHN}8$L8ϪW~o5>;Gh>:$B,xw@lGչ5AJ3 \j-ձ'1ru=Y@mLih#qg:nToX_@D˥ hI MK>{wFZ{ËO+N\%f0{biR_&~ӻ@瞍mH9̦e&K1j Rmc zNL~JaZ̫~a ̗`hlG:XfnbS`y?ufۏw nu|)cNLLqL 2jHZQ-MB3Q(H0TIiDSrdԅy6vOgh'hZ_3JyX=ɼ 歅[K1K^ pBB\>wbQ #|\$܌Eݍ;0+STָj}/A_GHpfԗ,P#*ɤIٙ*3+tCzGQ?Ht99JB ס7xZjzbN,앆+/pfoWh[W}ۨ˰*M.: stn܃F&+GͦR?@,6N$Xg쟡$ҟ2<CF0̠r S~cUSy*}+gϯ.ԣJοԨPyCz ᗿG.9[SgIf&ݣOeAD;t{w?3~]2 _g@33>+LU&S( 'E|',r=m)i[%/|M7_ul,L?Lue"]m(_SFg0 sIeӶt+ jUa3D:Gh;kg2Ss;!t*R4p?ޅ#]v;Q)k,O!N,D$3Ɯ9|:_ 1w}Ym(OI~i=a*L}3^z}ΐa]L닶|@ 27$?vg>I05Y]w s.:'iqWѨDrws u-1fY^(wzq@ӍbMC;4ҡ̮Z1cTȚb-8 O*]C#dvb jxŐՑ[zE,w$*ViTT@ ,]0O&RU ]P9 %$S|c31{|[)a"8p(D=aGVsT[oVa3Ys|?fȄ] H״cZ[̝}Q l8Q0u ;Wɚ7_o|'+XUyrӿ5剾؃=rQGZtjD֑n|2xuBt ]nJ1:+byzaH֐ S˞G:RvY׊ |fL#͗Qh,O$n=P6m 'vrU ovBHBwDm-|/mOx೩wMӦ9vvڱ;3"Dtb $0$sgQ+ LJ1BۺUpU*ǨL鰑ӬHjcLƆIBqJ C`]z}{A}_fWg~v˜\ dpO~aGd)v8&bXxb 8S)%KCIz),P3.@ U\* ZBf'7HM^fTm]q.t%Ɋ :oOBQ!f;5,W̾`s8A摓&̅8T&ˣ%ƞp7#* 1Pz8w JB4l {(#т5Q>5rϔ+ 56vyDMj+KSont9K}is~鞸.͘|zqY^|~C8ɑ_mxRd]V~<@oPKAOwir9Yj9ܟ֗#1p@ إ*mh1zәΪPȁz9na ìTZT!jmȘ <5Eܓ]ƉGSO{^0 EO≡d. ᑗUTi6H9;כ_y"V^cOڧ+(JARKTv;ZOM?^&͍CBv0J[XYDت6L/jZ JIԇ~yxm*GO=kxقl5Jٰ#<=lЖCKfD{˺bs,óKO#"^~>ȕN,gMVF1h{O? |;Xa@~@$'.X̷?1ᇉ~-Nuo'0Gvu`+-X߱k5 ~|YwF9NZζm\,sd5||vU1}K̑:>GXiw}oǜb_vOuP"\pD1ݤ1oG ۨ5E~{ou}^_Kō8l1Ckc!|1 ple: P;<͈# (zpBL1DX*=ydFGwO cCL{y|+P,h ݌0N5)iRt}ۅWꁎŝE|]+C]e~6H̺j/] V;Ca3G_Izj?ȩWFD͊D(y "0lF*+#QaoAi}UI55 lpo< <4&>X G%ʡk7Mw~?]h}fAF؏>5Q, ǔIOњ{i}/8afٹ#رhK1ғ"boaA?_tEWB'^Nl$wnpJs!Jt"Xv Ss^%J_D$>'LC 3=nex$Ch'cmLBLo~(7;r@_#Dδt"ϛ-+9Hk@޿<0$4}X`@(՘N("K"U2uxnۚ `Y@( F7ItP.nvx":/]nWYnr3Zq @˰}oHͷayFA*(74˽ML+ 5mh׏2\n,XXrfs|i?Y?Gk-!w" 7:ppJ~ʈT=oKJB߱ەGcsm=~Ԥ&Tnatf2H?R\aVvLg/MR RXx|(L tk47N}j2%,1LpOR3*(ٚxuB[QԄ)ӗhSjzlFSi 9](zvZͷ<ۨYH`yןnvwycWŝr=A1L޸mIl|bf".Ѭ皽@#pp5ӽ 6H^zSkc 9W<0ă\q'&OC3w)ҁs:mDxT탗-)fNGG$? g2GBϘA8 f w=tGXM+,93m[]mP:igoJMrpn6QJҖ5}bfqP&*:y|:;KġT؇KU*TK`,9\L”(s(2Q \Hƿkb$~%x❯!Χ_"$Foŧ6pCc|4 n~| ' -TmQ[wrjVS2 u5 5]KIy"@J'v2{<@Co͟HHVǹ)2RQΒ" ?&\ݟyLTRwN-.FM^5נ~{ ߁!f̺7WRhؗL:] /N=w{>fǴJpsU2v!Vk_h:a3Ko*er9]foX:$7l1%\=i̋2y5)Ly60 jYusK>|4ʘzVPIZ֯/>MRx>.f>[lԨyؗ]Ź[V%I{_Q*:W'8]v2x1xY"NVUgr?onX ŷ+rbF(ZԵ on\pҒTiTa?NdiGcǙ$4{9n9’20i% =ިhL:,7؋ςס7w!I(q ФVzmeZmBa)۝Mi3F,-4( iΏ/C`c2>3cZ礐+,{bw.)Wq,tgav Z1԰;iHo %yq⽼xVU@,DIEٚ8ty},vSqb G!BN+M.(dH35Ŗ`kay1N.Tts,oS^[r2}ڡ|hȆESK@r;K&곉bWl-7U` v8m596\Q[$e3]"V@ѕ#k#/蟓wc!A;&kc s(%)7LS(/CM4][S1W{/_~;<$VmiJ'+ :^AUUCaEH:9ɩQ;5q%瘬Mq1IfRlP8!FA%]~{ {Ǯp|aJ˛;-xlb7ŗ8s.l-sҜbЛ8P -0.dZ݁4Lsb7"z;vrë P6u*nzkO- + zy^ΫO*3o.6nf=g:GϢ7Qq'2`J$@oӧ|+{lN{Lܽ*31=w0=z~ gW Gu2T6tc6WȡlXhPiY}Q]C)ܹíBJ+n4QFǑF ;>%xט&djZZ&T(+Sl_eg'AmY?iߋ ӑ?Jag jJQȍD(̃lSY:V|yµOͤ R8Z gE؝M34~yy4rϲ)or& wy>|u@Fգ~Tz(|p;W WRV$j[ SP Ȥ<7KQ<ԩ9#t}D2#GXX.r.^ܨ-*Sˬߧ9P_50dɞ~L]冑N2Kr76,ĴbC %Y +o/â28_ZPqGu%fcUD*Mq/#v("JT$9el+;( f)T^l3tvsd)IZ 36;s.3cU{ 5g $T 7bC &"TefJ,-6וJ4 fcQBtUiC piAT'J :īW@W䩩֛w (saH*M#}~اN^T>YVF;k%F-U-+=eKLͪc*JQMC0]t,UD0$AB"֯}&Oa 9GD5&DI_fKU4jA7H&u4eDVU7Nhі>W6ɹ\Ơ2T&Eɵk˰ђpB7. PEU*}Z(b_ ?2QUR׆C VvoJJf@VB/˧ίQ(\裼7hhx؛nX3y_[Zgv_R fl8ca!.}b4-Բα.\Ƶ̇ De7^/gAD ^dܨ}_ύv*h]SK7@EKҵm2a:c2^ss]F $@_K$xf?/d7k ΩgqIՍN2#FWgӁ͸r+k?Ӥ3ܦyy8 _WKVßwMoJB* EFHS_k@=)rv:C3fg?i,]TP;e(%;NTaYr?~67`t UvSgl%Àx+צwXIHqy(jX܍TQYS4U(:\LN*l\~mcgN UJ@qb L9dPڦGǮB>]4#51G]8faiZS෧6'DbH^Ylj[349ᨕ:qFMJVNc󹖭M0M^UDw[|)YUfHO޹NO! Tf ROc\jC;DhЈv nRRNhŁDߍ 針OaYQ޷U;" 0Aéf=M]y c>Wq,kW-8-+LjKR-hedɀRr}YO- Sק$F1 g̰jM ? Ey6 K*JdFA BiKya IkIzs:q;:^+A4E%Z!t@ҕޤr Ӻ LCZ9e1(2.!RX/FɼLG/w|bYVF@osRq_:*p*[|nv|P.D9vKQЮPl-.%<2Н1*q5_k;G,4{0XbϒTj5H!hֵ'fRfD@ ۟b#edex\vݙɜ˫| b{-eD2`Pʘ&\ nh(--)2l9h4 XSDk>E9Xn~*kQF-@Q 't_'ٰ l?w?n54_w`K Ѫ0l.JOx%gjhC2&䛌T\FD^ǝ>'=herqXX& Z~VC܄ b 9fˢG )ݾaYGO 3@jz7)W+A" <[z;ryY]c% ^ xkLEŤ;_%i(*Ih>tK?W蠊#ҩx΍(]E̗s?'TS ,UN^HyJ$WRRҁep3Gy4PE̛;nͲ3z]*I1)+ʕ+Kʣ>>\,nc8Ze\\tc!AмxO#A1v*ר^Qk"7J0AД1Tp+75=b:CծCˁEBVun[%z A(?tJflAڴ"<+UAJ HJJ)#, fUxi>ɤEKw ~_G8uM%tt+CSS^ ;\\qfD{G2c:N\;'ELFLP}݉E JHi^v őbQR/A)_>~TxTW j0%TW ⩺NQH.pr 8YqtoƻҨ =3פSO1rp$Ѫxɼ^rP툹s1so$~Cb=̝SίMvzAL(Mɒs<^+DxNaR>EMqڻjʤG6M7+*ffؾS'_=lXm_kk`{1x{Z>AaP/7o;bJP"yێLx{Cϯ"]}n:SD(B  Zd= a  j%@+PҝfKĊ3qg04$9 W5Ԣ("BgpM;Uԫ-I! Dvjq)@H' :%Qbd*.cmoz1sRM+^+H!4 &<{k\BNkQT,>shhZcxWk"hׁiwkҨ!~xt3G02?z7&|t.C~4Eb X?Tɭ&<]Le-KWt,(W!AZ.p事yāc!$ۺ57 +k`*7}(Iʃ?jL^F9P&8> л[d*Terf"4Þt\bC>2kS+VZ0G-=Ak5n?ZS-r?vmi`x̧>[^Xupۃ=̝QY@yx3)eLx?֏աRvg-JD}.vA{koyڢhe~/q bq *`sOL:P _hCbGՑˀ@@3}<\&^&ĉo4)z',*+9>%3٠^ 5Qv%)r4/:c<~卟82sԵ>hdtݙ0%ѮtFks_ "?ލ\-ucHq:n-Oځu3JBb>ĸa)Mh{es㹗{og3ywr%+q-˛#V`AB@/Y鿪Q0)"Tzg<U e&v3ĎF^of74QgCG| Bsn%LE 4yh㢛e ~_x%ef]K;Na#f~n< C$ ~1X"AtV[v匛D=q1U2QDE$$Fx ܻ3* 0ߊXIjS"1Hа2[Pވ:H##Yc?QA3 tsʍ?؍?(>S劔[@E u u%rX $]"AXuYO>~aF11&WO"1Fɥfl!sA8_%ВF5GZ>ȁa& p#`B󢀕5)\U}UP>:wEJ:g<Z!\1;0ICf`:~( ngQcpkBd`68]h~dS<|D>h>T5D,jo=^e\..x`Lh JϏER$[#ٍVeꩣϖsͩD!d4A鯄%bOWY@A qkq H"tb z0p-2GK&N9UD(>P{oE j.]'k[$q!ؚ5T| G_fO|2hƩH0ĐO wGnCTpr= _:gĚcp od>o/ D!@ ,^?~&b|yp=Mgo-ە 4;G KCރEW(U   cj S ֍xWV^wܒL#Ls7hC @t+gG%S #v"l@ uկ"ܩ5)};dP/ Beh%h9C1?%dOXt[ձ&V(aw رDc+_T~z:_̞`&d4=_?BT $g@4ht>9}yU4̭= [B(d{F$Ѫ!w˥}"G+K`W-^TC)]tЅK`]zk[CYuN85n$EtߏLvcѕ VF]X~ ^$v}LQ*f$zV#RC:9X'mMB$,_wGf2!Orb @lkSz^ %sk7x;/"c"֌(vF/` rTeC- _0khcGCcIQQ.'I¢9 bHVb<Zִ.!Y_>Lᎋ#Ձ/zqZD:b2Kx[Je!Xy'mv N IbQQ",H!3ڨFWUOK; [_V;)@'%2?ͼIZ5OZjAADhI~dla({C.x3oՠa߈13rlK?.VŅq&dcToxۇ|%jFQ=(tKgHL%&`)5 HD`jbw°@\a1([_U7!uE:7#"eb%/MeR Qզ, 擿_->a a OxXm~3P1չrd`&JzZý`,EA7p-뗏*J(IVá a !pV(T?KW6?4' ׶6e+Y[OZu6aA%i7aA!͖ʄr؄9f/Qw7}8TCKHa"E ވ*Ȱ\dk̷'8v8˰شqŋp)e]q8mʾP=z$P04sXMT>d}Ac <vG%x¯=~x u,)%PX䱠;ZB '@N74 рb;n@+]h> ;8PWY}֪=W7 +جoI6Q2Pf)KSC`\쮮 D Z .:(DK:?I]zPR Dseť5m߳1e٦#0^fmn|:Q6 fV DF-w?w 0ei_O6a5$$x?|v~(yc*V_{SPI Mw^z$GlȚ2.̬  yĹR0jBsI{.X6Q ){D$\pGW> 1IS(<=P}}$D%ˆԒSzeWIrc`\Ȣ|쿛٨~K@R04PS fPz玙/?$꟣.&&3@[%Y@&(a@a\nGAj^V$q_aNF^Oȇ^2{'yN~ɷc& #xBGYeү@|3`u2w|=,"pɘ(=TM5o0 1 KĵC\-@Mޖ]ءI=\ ̖ɠ0ײV}aff3 n~JS&.-\֔!xkؓ@*ry+QcV(TQn ~`JB' csGǼ6O t?%MXE”KFO0 jԓεσY[LZbU!'^qюWҠ*@U[YINdUKrjO' 1LNb@4$\gG'LNưy#,4 HPѕsSNC)@O%.Ǯ dž]õҡ9Pxa`!>ǣIiڧ D!J38#൥ n!"E2%Vuy{*ֳ%UӰUX"| 䓀YL8hr0!C0@蓍i|pN/NjڄAM|M[?ya $lSB -,oM(bytbKrjĘSv~YUzWe )W|39j#;CAu,W2qvʺoS=/FU\˿W6q[0mtVWH&,LuRqQI0) Xs=v TXZK=QB.Q7X0* ]\nquעS+#aF~< 4̒JߗP"yPsr<|ݨS"ԋGkofD&f$fGτrNq_`sH 33 4O (QajtgU%cq\:)OG( 0j+͛m7N @F؝?}Ԇiu|%\x!(EW10̙E*%r$~sYh,|8\Q1tcĶt7F!'X(YHEYi6VÐ*d4 kHۈlYeK;3>ǿhaKvd(?RpA5%Hj*3.TNxsXgk O5 TF'U oL8 Hi~S9B~.U}$^1UOOUs1OzvW,(|834Z1U@@EPC 3GPnM Sm`QeWTE*#RQPGoZ<'FASP8Pl_cg@{4>:Wg<}xc4O0TfAFԎ:IF0c*|G(8(kLZݩ3ȅ)uf/͢4ߗ1Bζ2}aC8atiѦSpt)eA'xbQs(+,g(UO2w:j?5^І-Ȣ{ d ϺYE88:J>6YqVZæh\8؞a4bư)B(CƗ[y4`ԍDFV^8yGnaL0. (>bް #%0Nf~2506 4(Q[Dcf{*T$Z uD#hz ,t>"327ۇI\2NЀψ#᎕;W^>C+ ftrF eB Yֆ 8+өQH"̣ T IP)M"|mcE ش}`YM a/"5VxsSKqX_K^v "q`dRltB5^ȼ9d?N??d Qί9uEiՏO6n@>ŕ9GG?Ư oͩi7ڵ:e =uY3=GMxV2QP$!S(pfRDgvod~@&h }C~OYX hV2OW[f`YUb%1jd?lɶ寲c!s(8u&W@Wp'q਍@%Jk_8?3 `v]4 D@C]$&.,oz(ٷ ʈޣv\m>a~rm\Êٟ5[{Tq'+ .! A=w~O8Wx~p근n۱n?uG5ࣟ@<)XGpB'W}m'oJsc J* 'O ME<;riP|9D9O/҅55r%šH.; 4Sg38drP͝~Kj0KQ m@u]*3NæmW !…z lky$ קR.zV0&ʷ;m$Q!垇jZn0k{aAo̊ !YVoVfCS\3뒬>]K{Z~"m,*1.xPВN]u)Sa)30YE@UմyZ;$+7ȇAa}Ӥ@3@CC!B9bmן!}W/?sT/Su &>1F jt&j.gh Мa?P͔fa1@qf:!@M~bX[w>f ?=]wl `xqkښ?ϼTP u_Cӛ#yz:S7vR_b]R;t}Ux^ h!o$ϘA `+S2V@b}S='*|j'ċ3^|˚6OP4@'T4уJJ< R=*P[/Q ҠGE-&Wک,6FM<y@!CqS*{U8ݼDHp%Ыl8dNK~)ȱǥɕլAdSMO X,L̕hP~T9#yVmFTs6qq"} #cqiʋσ~?zJ0 vE5p1cJ)lwCR9<ĵa'J%4ǝ5|gxWBr MtQy%e|$v{[ SsCoJ@;).1U9M^d`JFE@WN @<(7c~0tDKC.fyPc u{i^SԒ`xU؎NT,ln+@B ԃZl xX_]HŌN؀>ajn."RPLr)pMXIs=k# EųY¶yh$ \Hc|=M"ڴM?-vX"b_! \WAE9y4n?bX+gG?SA^[( Cc6iz7!'JuK9R .V/M\['E0a[]D7plP" t)^+fEA$}̻lՊ*;ޞܫJs/οڀ5Ob&"G j1qՠf {2lRk%q*yRT2R/VHqHE69̈?>"hYaT'pn,xD&AրpӦ0\-`auVN5ElrDeAU[ H7݇tTo'$]6'gr$@10-+DC0Es)dTdfE;)a(8a\^[{Ո}i5mvيmŸy@@zڴϪЋ8++[cL@W&I 0 4wjh|c,GKEl ( R)J[C3VRj`GgXf?& rUP[̣ )KB?G;9|fvGm`e@\ =ddmX""L=s#}).me@M^ ؆q%aFO34gSC.Y̍Z=;.=2XN_sF'gzk*}%0%bE0L"U`0Cx0!<|N\8G>ta-s=<êSC'75&ȚJ؆8hutEc4A –/ۘuϘŨh_I\~j-%8"ǐ V-=s"ބbn hUꀶPr7J LET>XK؅*>t%1B1pa<>akƖ܍EuQ2XhjB{_**(c5 N> DNlPJD]lqʨklG;.` ʐҹ5TdHC漀VT᚜X":T`c">5IpvRaTߜ2 چqϱ|<@wMuNIPTWK ᥗ8UDepݦHuI$܇\+.l;nHFp2jyHYO^ :/Bh"ŗ<5)I-*(hquWC0s5^`i5!|A $JB֍;7\MtE&#Eǩp׈o=gF$z]VV ^$pbTd2"j2"O?MG)\CēFx '-1`ܬR\NOi8v¥TYt A`(vUXfGR暜9qE%![\&)Kx7eҚzN%"Ї*8{!?8*JvWf)W>&zNN,$ ^3똇il\ls$ M4Ә]b̟^,*e"!| %-ldPAVx2jWptk^*TP+ nX~dn~-{eB "Ɔ^2eC rQ{h.+U7oYO:y;)3#Gbh +-?j]P_Bpv>qcZ"l4T8g:һN吏.9d872+?Z`Q2" hY8Pytd"˩>KdHcJ< U*V-foj賱k:BFWNwX](ϑsni4,ѧX!|dOt`~d\N Bt؆ E"P=IZ w>|ɤj̥K zE<~ѾIҔLN*wn^ԕV[(xA"М2VJ sHd$kԋ$8pfC 尅 #5`@(VSmF]D0zN^˩}Of `v?cn |/^? 4k]g2wZ@dIl0)sg׹lXBo|y%ez~Ihg ξ# ,ˣ7]HSk?yxm̛z!DCDB.)Ԍ>N.2ցYV>FM"Xv6셍dx ^ȤSS|%$΂'kWN=PQ(/xA$ @˓wXruq8`Ah7gcčW|3BU?| 3Hzqx>Wm:hd12u6y Bnj@@@8{ [XϺ١n$nC{榓׻'  (,h;%kRw^Y᫹{x,D:WIb:yPT&(>njXWr5*@2AbI1?L|8\ۑDD1,d4toȍP!JX{3fԄvUf@]E9ⷥJBq+WKP.Ov 5guK߃bru>sP4ˇp~.-Ձ-ިSG +\|"H[LnX)w|3Ι,M;I2h5LJ [&X)9pƣj{+J LF҇Q*k.0ItXC7GIbJKYÔ10}^E \M qẍ́8A'D'Z'WR )Ǩz}bs:sBX[$BmBei-3=8oIYJGܯt61zw΀REb`Z$f"e Eds#E)LJ*1bӳ' ̔TR+ӐSJb@&#Y@a#FQIEA1#K[H(khc( Gu4e݂h6;Cl*O=jU**Ynfj:mYk%6ەUX$Šh<$J״|BluPTNED¶l/.&1*R 5>_Q|ƥk،})wy]{HX~U#v `<Ϸ=[.V 3B7J!+xP$AciBѹKJAz*Qb5Y#GS)-o$ ߢ0L %a@r L k# q˽')lj}U!k1~N2d|V)h$t]I-"L6R6 92=!pv7 \f'MJ޷9MOMT*Ƶ|J|7O" Hh";bB6WAcMX {iw`N8%,y/\VYɪԑ0A0Q87(SiC!6 5HAMPA a \}K 7W8NsZmW5@VR,i鋻fAP7*Rrm-s!Fl1@"ey"xw{@MzX0Ri2pn"ѽw-a kKr|=eTg8')Tv%NlT!4k a-mPi,ZBsnek#A5x )LK0d#H&ԶQ=&X/ցXGS`k,fy%pO[B&"u-*hg-K$:`@ %xPN=xQ ֏ 'Wʈ/ʆ5AQt) pYT[28{d"Z=>%Nns㛵&-E4p,UY`h1\)@!+XWI?.1&M?F6GzyՎCEL l;(-A^PzpXH< U_)qd+9>ɅSDQ=OrU*1cdW˰K C9=]C.UYI>W$}ss ]䗊ꋌEێ\> j:]mi,n:bV< K#<p2:YZs rEbs96鴪`ܫzMC&h]փ/aX1BW%M38,'KKXUP^yyt Õ(4 AQ-Tu) ; UA #B;>L 9"(v9i e?*I#p\G6f_ԟ׏#lyŶDEHHy&l_e]~Ձ|cDWb}q-k h_woJX RP9"уo}ƭ!ᾤQ N3HpK1wL_1!R??6dmi7sbF5k2MAsDPM5f 5zxBs6csv)O0$[NeO^˳}xxc>VpV8+(Sy@pyo(,mmb'$C.^bsS{bYףB:M6@*>X 5DH6l{~}phg'ϡ ^큡2Gb9N7zZN\iV*W\}vLc%E\DN*mԥn`)chQ"hqș2f2657BU oiˣ~q diϫ_Ù/ΰ:UsGTGfBQ&\e| i`tۖʇL0V} J)-cƪe ɠvTդ%"Ycb6㘪X2+ғGj6^)iAt@Oi&ԭO H1:<<:x̛JG˥84T@,p1q:^v1 FRC k`鲮qSлQZ<^aͶʋZz M2"O]vgS!8H'+H9A*sTg([P4r#LGPZu\Ҿf믢Ơ (ۗO3uY #]|kX*OHG<`^Pޞ#m8qTLe>C%OqSg$f:hY+.3፝-p͏sLpXz\Ϊq52vmwXd(,n[injt.k'uEGBS159"0b KQۡT5e#VjM ^SnhSJ1$ۄ)DX]ٰRn͉V&z$.l,| y*4[gwjUIwddH4qv [АbPOAmp>," ̤3`9vcD1'g"o2vSCMӝoހ*(Ԯ%߱D7qJngq2q TH"ߊ^spb>}b75*y(]r1^~ m5va'CeS:E욭*jÌ]ZAnu"0iQ %v@K>1Jta_pc0`e2 ) cJ\4L"k^ח:y `ӽj  wh8)V6apD`V>G 4|^rfR/XQfV}OVzԜHPp8\cqf5В1k`΢-eWnB ړ6dsaqMUpgU8iY.y9nӳ~ @~<$ '*͌ey&6/:S%ҧ'[4=̖z=ʣ&T5A|q?:FK˻#VcoEW(8k,eʗxl  qWh$O^J.UO.뉅Ս׽7J~)-;fR4eddm W9wer2ddSI=d戬,KD]M2Pebz!=F9":u7M8eW0sEMR(`9ᯯY[m|jG_y8p[㼼ջ]s֍>mqpJeȅǍgdRxCk"nLhp(cyѕF|W͂jE}hfpOhP$ߢ~~ "z!Awc&.69^gBFewŴ+XL\^4$V8` L掻_lVȌzinf$iI0\a-̘)oomς)Џ39.Df߫R /pikJҋo!6=ۢL^ 1WMF@É D꫞ (%*A7'pDޔDKzpZ@Sq/jaS=J#ngN8j}-TBJē% hB7Z0c~ !f1څ Q2xg/Vf3BiMVE` ,Qo"!][--HU3r~jomE 4PF"_!]۷ ч[!>9p-u! tk%.ݢ6'I*h <,`yuE ++0ݔİkv4q`0c:E:/'5y/`/p&"}[QLS>H0⫍U%, .yt kFI0qNr E#^اE|) AY0n sʁ)\žON?rE@Jƨm!Bp=.E72:4)7m[Kp1!V0%Q@7\gSH Z8`[,1 t5SoҖp[GiE>s^ ¼|&wKߎ#|no!ZxJs:644OX2t ) B{sW* 7$GfٰoX"6s]kUX /RJ_qfRޭ303dR?t*{o#[y@͜)Ouvݸ_Zk} ygUg _]W~ '[ A`wR>zKg,S=L$7t(X]I,~1(v7Šc8ƨF\ʩF *˞um.l|dX҃mŞdMNh&9hN{Ԁn4WU `r4/f*[ H}vwa1Y nao_e)hyZ5}XV6V<:QM{kLi7ʽ|L^wZH>SRջꙋfCaIfÈW̼C;21ىL&zwm18WF E0'dlZ[tEnlSK0zŊsϠq_ƣk dl&2&{37(5O|:Tg(cGeε;}!/pb Mb|QOv XNvy5ı찎 cM2J%=u5p҇P&^$B ߜ0)ˣ 3nOȒ Pm/! CBL42|\qXHcJLa5Az]KBk8$ݏљH'0C\3DyIx+TPHp(`<`UQJ͜=l dm| LCh&ئ2ھ`\i&6-]!6L0C=~2FyyFwR~oV/f9u+dX\B4Ҭx_),_fD_7VNqzh]sMȮG36kL"H\mzN݂(NHk TH0+_QsS3hN)g7 ؅)BQ(w(2{n4LgApԳISƩfU:ڜլfżIXb rMhPw=F|4Sݵܴubci2l|`yT& e2&} |p3P0!|ԅkc{`.3&,I:~aKGnz0 2f "CEȱ{iNSwy}Iw!g۞j+1SpyZhZ]bw g /i\k,D<iuNe*UJӠa֬M1ڻ//^qqiG3US:[_fŽ Kƴҷ/iv mYnXVH+CE47L2x:)\Eg=61 D(mAJRn)b'! B7]# g.L%W>ͭaݕ\}}c0O& z];CnNPˁPq,'St2{G,E;Ʃ'+{;- |㽳~af{fy}ymʿi T#v꾗DSqZ&nz+ZxS;z1}U︶t4[cA17mtR<I.t+n]>#^4̈́#&B|6Mdc f#u*@x# ;uocu \>X- TX'7}^'4٭|gs1gY8{NZΙD́GMv_îfJ5594H`;SrSc~Q@14~6_ F>s@79<|U<ǷN_V[֍h\XQ=4zŻ1t90(vmx/4EPMZEۋ-'%,vqRg)R _tl i  $#k%f_) 7L>|&_Y%͌k{IhDH(߱KY²` ` $s*"jfS!cDVcW;m)28'gz%% dm"530Jk\_&}LuM/ C $7`i(-&IU&˳NZzz60[Ǩx2!0 yY x{SYД6˻4m\r=HkٟMǠ?ȏR<;ITJ׻d{w m؋y|sږOA-?֮S;xSzՁ9۾ .F8O`U]P"l|8Pu٪0b"7O=q1妷wgw=4{[;t.JwAH0S2J#h R"h0Yp/x?)Ue͚IT>>l0`=noP91)ie1GrT Π|AX8X-g,MXiήJ %RD;\ U"aSTe>Wu%:)OgP*4M/;8J$>{0YENpXsVHor3͚ėc@QN {0`|1)S#!jR~Rg/˿f\5LC|,IGhMuc s܍R-Q~~V<&/Oʸv6_B|+Zak xeH[ZZ7鲱fJJzkI4Spy++Av[ v-uBZn 췖^lW0ϟ1q Hh5NGŐ:aStwNV2lAQnuϋ:r%2b~&.>P^e>5^֥B& Ț0W*G8Xr 4!İRDF|FlmyɊ3 swi"N]HX7Rg>Xgbl%;x;Yzs zZ4+V bymfx"-yZ=#Qo"9@u\_,Yf%ONO u.U$J;̰|xvxop>_ԗۭ=Ը\U"OqxL'+'-;:.+eC$?Jrª;MlY+ԉW /] \oc  e}‘1On^φ?$zr{;nul -J=j%6 _ok#{Pܗ Q ZN9R=򱐄@RGj2.\7~S{'I ]OT6on~^J(P.hЈxz8{nGս)'o`_[A CIOUo|b{[ʯÌbt$\Й_v&RC(; HV?D/|0-bvX.%=kxV0=Դi`-@0eM~S ߷R/-\g?zdv:*'{S+GP%ZtJƴ]'}17̼n"l;3(N[D.Y')bҰet6Ԁՠ t G W6E)2xFRe)5)Vpa.$2SAX7zWgyE)ܡՖ>hM˗63k!̥We%;Bk/]Tq_ObmJ@wBh~3E;=Lwᔛ+~ K^%ם?_ܗG'"m)\svb7rV_ /zi4<4Kg 7ے&x `)Lx^ɌXo{ȧUR:u3;^o֛wU+ȷ IoM֣1MP2ML??}60U_5N3Z'+u5!e=– T/ oq|?;zobݜqbG\Wē7zJGxeqU`Vy? f(f ByƊg?eV)Z;`DP▅rH_ϙWFڻj2e+o]8yDNIǰ EΐΈ6#Ms+Twkg-?S1}DϦTdIl/cR[u>Rqn{ԡ YԅVɴd'sxkrKUd̮g͏wh'U!?3M7Ml-v>(]\dOS%!ŏNx9T>m F`v\(Lx)˺[?\r?@ľ÷?4718v/:˙Oex ~ĆpO l+x4^;I(pO8Ek@_j$ 3zO{/Ü+ 񻔓923i$i%(B`)K@T*>Ձ+ g # q;`jVʕS*9M |Ԉ\^^O%eVd n$7CEY|SV#S?ÚX|O[Tnfaօ(Wok#@ ie?Nh/֔6b͚|wa'jӬ 誨>Dvp;K]]U(WY&[rخcv&co0mRS֡QG!9$)آ|_3 %c[XKYL{7VP=T|ɴZ*fcepaC'k:nLx_h9Yu 1rX"{VRTȫ98c8[I^l͛՟ IuA8YBcsr'2^ѷ~cT?j;8U#"ւzSviHp?wokQ>D4GŋqhSO^M*>6zn<<=$0X*'LK +業lr k8|_Sgc790#x@2p+hS[Ԉ$1ZmXAƖ1?ͅ^޵6xG߀Td'?T$_Rz[{4<pʴt5_ŽH/vM 勧HV^RhU8@k`|u>ۤL(/ڤʯrTļheX &>&)ѣsQ٩cwIY 2ayTw SSm.z8̶ɿip}ZWēbW%/F1<~V9Fp3EVqޒA6!zɯ2[u;d*s{6Y F @Q_ YTOҧ o*w9haG۰E<@LڛKߜ1(k@l4ZnTPu0!H4T`1ŒAH 'pM`X:?]뛦<(>NlY@qEk0KE=_ _ fV, EБ59lNCߖ:B=MJf p&<7ZuK? 4(V^ Yewsc-/(օ{GFW( |-DqD0AJNk7CyCZ8aNd?$0^LLÔ3a"jv#=mBk{57G$=, 0Ơ& /d0l!F{1Au$G|f4Q(Q[]9S$xة }D<9~ s$8:t)F|#[+)ʤ#/Ufa)G b)c FPy"EszcU]J,<* hy߿T%&5Y.b7#my9/%gٹ zI|}+ζD*r.aݿkcXMg/`yV2kYO+ًb !ux;P .kt! M.+j:gZp6PIR:8xd"aXNA@¥o`d=z,~׀9.SU"\h?;V}&;"J)p0W`w":L͇BTS6Qܨ~{,tӆru^_]4x5DF@6\ւ !PkhO5~˃> Š$0Sg-MS1M BNˀuNbvP3!!a+ RSO^/(O_ ޸@nǟR|?Sд1׷5_Uq-kaĘ\6%Q-7uΝbnG{wv+@=$m̯3hn(e9ux'qsVW[_M:-lσ)?vhvYb-GtGI4Q0%vߺWX ik}{ȾI.cn<ԍǽ~$'RKoJ~oD}{ aAgKhD~cɤ>ө+FHj}ߖw ʀjj^m徲JL㼔0@㧲uN2:$TmqmU5/N j4wkn5AUC1`2pӪLt$X_#"i]f}d(jѦ=7sȖ#R#Ta( /lrC}{KR*ݟ2œa$W~/Y$C4\!c%kBhAj`C՛?puzLR/ M)/ K1*Fl1˃ ,<\0#wa F(J[ss:8=֕wp)CB ~6uGAbD9JģM3 uT4Hۗ1c8ZwVLbk䅺\qdKh62nQw%V1cp{ýpP]t;w<Y?[ڔp4/ /.sƥeh-/S׿4U]iŇް`0Y&QbTႵ۔ {IAnoBUl OrwpKx>{<|"0]qR|%z`E WyFJ&ZumUEߚjgZ2!P)I?bsNuҍxzlSi;?g1_y7J;šT]?r^yߵ>C&2<' q5:谥RZ֊إ_]ዕ,up0ד~we#R ގj&M֥=PHA#Z61?f?#Η<gm,[^ oWUA['pp 4gfI;EU!ʱ`lX!)P0}6"%o(-A3iplZs:k;0TչhuqN O^Bp)Os?g. j)`GFq 9v 0;@U|٫G`}'_1}Fsyn:b"nq_F[`}{7L£>[>ŌumЯɸ/} 0R_-  %Zu;v+kK=+Q~ _bR@e qkМogw JT> 2t5T,#'&Ht)q#U @|(`dm>V=4|pmZ×ŕQ*JBHYB-˦Q9;=no蓿j[ bg!/ 6I9{/fd(j;Eg-l[kD<)#'7+Na",W֔0ts\re>( Ip.\c?TKUh#cNJОSnh6KXpmunˎS(R m~GjѥE ,&w)tt厤Hmvf8E[57-BJ&wײbu3D(:l @?eY/֍R=?sSQnwZ`M=gXyEi'>G]XrOt~8IgY4{k D8A5T5` qvJ Ӆ;8Q>a!0ҊC Alc}-gB9m2J:$_X|' hv:;-T #h*ZYM,bJNFnWAíhL7Zv;1IN[TtQLQpֹ) .( w4$]MݗϮt-9Xv1MUڱԠ)}1I F4t1NRLqrŴM> mz/ӕT;,^OxQScpīm\K[ތPھ)D6,fS;L^a83)-Q z(I]^,BҼLoK0S!9~Pc{6mn 4$K/~*4|B9>g۵w6ã-Ne-OKL7 ~x[<38a$bt!) y;6(BI͍m1l+MX)9:K(`aF/ GsVnXn_5bklICd-/"?J/4ؚw[QE7mi΂u6,q/, #?UuSG5]2tҜ":6!Y_?FA_3R'<ߗ'3 "?&D4͐B,#Rb3hi:%A_( 67y$s FUV usr]g#G~-4BGG╢ 4d RBhF6,bwg-𵱕QϜڰ4> fS^jĨ?u5gTz@iq!3A R V롁"Txw# ~q=mت0t(uOzؑS8"QO6bkAur*GZi}S+nט36xTC = էiXmm҆Wʒno q(ب*M VL)MߌlwX' `S9]e\ŕ;e1P4YN6&m"GY0dsCjAnEG_TD釗X 1>{S?AL" T$ttw] p}C>v:q>OژqLI|X!\PO?N%C8lO!=m G@Jˈ9}L˓C|:H9ѻ62 x#n YK,]{;1,pZV``Qu)_=_%8b(ġ$53psnǨgU,HIRDbsړUu^`M:֩GkŃF歧4 ::?\98}w~H c2>ޯA~V{+V[~k hE)]M74~R_߳Ps[/OY{$qwV0SyչzQWMAS+A^~9R.Qd'i|RMQ I?".uZhř[K0k)x.t3?/?٫\ƻUˢ)%~>W9TB]p^vSlэSO~ )w;ƩM& 6Rɪ~A7tP4wLc"35j!R~3 VS-O xHn NS)uolkJc?п-DW1ww]~χ j[U`r c%3!dzN< @[ƉEBAGiiɠ^B81i>E١imJJU@D[Awxm>lޝ* F,5/ 7!ܑ~BpV~Ъ/U5 ^;ѠHWNVoKX%T,,Gبx2; _ÿ2[͡F8w7R/u>0Sҧ=~UO{(7V~魫C CY*uڇs<;"-1uе-h=v崞tTv<L<޾obU30+y{iеK{J؂2/7_j%mOul$C; ˬssgәM%:Hׇ%>QN&tס궿#_:OHMFN%y+|?7S\%~ 96vC̨G_MX{Կ[`F9t*{qsXtU~hV|; jO Y*8t-+Kqw o՗~Y9 A>/U_][Pm\q[ÛNTG'~*)*oU߶iG3ߗFt^r] fs]ub}~uM}}TbM#o] i_1{z0ſtu;?Т ꪍ՝ $=pO/ꊶ}8=/o5\)6;v~.HR$o[Pc[<5ŧbgk~[ G:` muN@K"AX~<2V@.V}zw{CK2c-U4  Yו* Ax>9Lf9k78Pϖ4?z? Sw ^}.8/<4 wcm~><+ކt>'Ͽg Z9UH;*tȓoև8yBOwTY!ep{a.hd{D'0/O| KcX':y̓?X߻O5'n kr?Oos%yc-TD ybP_Kc3wr2r߳#k.) '# PpS]fs_oOաDvQH?0j^Yz<1熊:_LϨg*5(~y&a6_C{(S[}{\ ?GmbiIul;~Vv}y&~;Bq{TLVo.mD}nE'}}N剤{yd܂Ĉ-ǵy{c5s#%$ =ߓy̮Wfh&vbfc+6+j:/~R>\철wT_ #\PvhL?V+x\]σEUMn thC!ɸ-mp\Z~vu Y >y nף=lIbd@y2 QŎtg{zD(i+ H\M[WVߍaFWY)|6巶?;wǞ(E%.If92'(_lk?PgJH%퐎wț9K%iQk/ֈ5&WvnL&S3_H16 ̋r1:W걙LIZpGrěHF0Sf0lkCN]0/PwL.U2i14jʿ15ր-2RS:xk MǧA3o=f >'*n nS&au~?Ft3/ {)&-ΟO"Vw<~sm4 }?v9}U\=ދiim=/zG}ߓ|_;dC<` DYw,&y'5^c|O_ycpFR.vge),9Z-FsJx:cW/%!sti]}ߣs;:IS-_330 Fh^9|U83^&AұMЬo}j/ IVH6QјfKƫ4]\(Lu+}rw ~_Gҗa*C}{4ĐC{q/3Mv49^{jl5h+y$&*}~7`ݯ3+rk7Zz8^44^iULtwQƗw,kXCk:Zܩ-Z5ҥ,07/=nq13|l1K|?Nޜޯ/R[O7M^ߠЬz&°;rg|z~+EPK ŽI;WNt* *8_;+Ӓzpi쇘8p/)SCSH_a[DV=TW} (> g)aifnjo Ԕϔİ/=$ֽ9Ck Eɧ))+g!-bf/87٣EJ׹ei#9pc)>S𗤲筼7 k6|6~MWi.a]ViPw4ZrT5^tF5LzD{Toűߺ1#G mWOwҀ-K%ޭb𱸐I3?xMwD{{[|5|߻_0U3gލAc}܋D) Ēw/<5+ xs8yA5OT\}:p]&Nd76t7:/os#nӽ[bnQo- ],i]ZABxn(i9KX`T30"}@j?F圫+r8j[~C+p_9_[a^v<7t awy- #mGgwWXZys/סW'Ƙ_9 ,_ΔL*Ao_Rt/_!Tl4OgܧXĻhq7"g8C#8BKV&]/MgJQ5 f?7)59!lM4Ә3@>HB /[2Fbtd )2gvzH⮭[Ƃiw%_kBP{89Z>⻥>60բZaG;v~w">ƈ|j"A"4? -vz?3+tg9H/q{ou>aN&,=l#.)eOogӬɍ'NLwczvʱ]:lcp !K{wGs*_c]g~H/nS2sM~7+a]@q=8ΎuY}iB=˦^Y suAk:.[`uͭ_r~?ؐ?գ66DXUѵkSi6Tڗ?'[m1Z [6-l\!2&}O/֠B__?ȅzQIX(1R[3/fOP^g+i8^7j־hm W/W vzm+!Ki!cf[Jb'w2mjkݼ.-j'҉azzϪ?K5>-kU{tvEQ%skr66m5]3CnQrʹn+F)twWF!\ֹk6أI njSZ]趧v˺mr.tm&$rwu ș"FJ~~* zzS_\'s]_ߵW.wq'j˜U/%@tæ%|& &"D0m]kd5uI78),1gL%6,"Mbۮ:OAt2|y;ى [mm;K zc" UQn[mURjս@! $mEQA +Fdؚ2QRonuoZez q6f͵JG,%/1m}M(v_tSr].AVcw9LGwWHV9Q%tjsD%ww,W(˚;rʺWAX6űT (J1 kqWCߊ6Ż[}_Z\rO߹9cZ*ض "J1b)3Hj*#F&$֌ƴkMQ[&J&EѤ!DLV;Ub [Xj}oʀ_"SQ<?Oԩx<>ܾʯ^OJQe"}%:O e^4DB6F`lp\v־kEWLjJ}ʣi%8DR_?۪mWm~k[(-\嫻d4ر;wGuƑnb%\\щ+rp7tm,nIr6n3lQֈD\N]+m@,n]:z%o[v3׹mƃ53g*I᲍,0.^.,dl63*+e1)4R* $Q -cdTb-KF]+lXEt@9t+:Ͱ4Pje.U#lW 5ʩԥKѫ)E+Qͧ*-VMp혯p{ :3AޑyѶ6mDRh41m7 9SIz`K^b*yuB"xB^x$Qx2xMe#E\Z0/VV\̪v܍jEf"n kWjyi= BC$Nk-e3ܔTuudӚy}/wf|glW6NEst5# QW0w6Q`d6!$ې]hݺwudw9H/Rh_!ّ :wX ~ 4BT|P<UxWlo7I8o+n-kڠFYQld_um}L\h'$j h[qw^֊^0]9/zzXWQpq_䒼0^6m8gPJiͧ)(fMh E$ڛlŶ6NreZ1mXLj-6O>fg?V:yBާS-͢{4SmN*9JS߾#!-,V1cb$Il$E6mwbLA z&$ꤍIs*D}m[a K]-tx_VZ!09\5&դmBvwuȢݮ\֤AS-%mnXAH%.snX;wswN9mY(ѪLtmr@aIimFtÊٲ>ͳ'UGerGuS+'tĿTlߪz)|5.È}qcjGi9xڶڽ=خkwdVw\ŢjIFvbLbrQV-\ثFwUԻIr(ܪ]8[ssۮˮ[b0aW5-+4j᢮&Qm24HlKwIhADR4s|-mZBry/?>xy\V*;|*ՎpOD*!\8n4\V;`X)V>_ |?F8ˊGPipEW*xl( _\Ccl6;R#w6H>׃ضnE(\6SmMVo?m^js!bImh\rDnwwwEZ5wG7wvku\hۜwq7lnWJѷ6d2ӋvMe7 h]OZBGRvUu苳N.+k)8tRK{ŻS)ڃ'JF(FEK4Y-F,V,Bk=Vȉ W*F͛Fc6˖g7hT-sF1DW5T.-pnnBMVZm<\FUNSQ^^mm~Uww|bD>z[^b U] \rmڸ&r\i.67Pa,iR4K&?ymleD{ֵg5)'R$%<]{rE9^yIKl_Sm_nJ!c^o[еKxؒ-b`gFW53w.wNHC{WZ 稞?^J9)SųC)kdLb[3f5lN<$S©UkfSsO{_$Co{GSb}>ޢ6ٍxR{xBhO8K+/ISQ4hhճig+QWtޔtS/h=ʑE'"ʽ󡅵5mF_`NYEf3J 2Ѷ-%TTQzm S _jC8\cklr+$}OFMS)ʣ$:r mm6&-8:oWAd Ѭ(Q6J,fKQiLb UެE)FA$C6Q~HwکŲql?'c*'x?QRe$6j-~M/I.`G^J*,4BܲEոБ5k-VsnEF(ɋ91n] rDn *TmѢwk42`wscmDr[4t-qw9$j0]lkӶGu5F9Er8r0Elm30h˘0^**VI?]/Ȥ6_wxV #D3rGJt=%rͻ),MqֹpbZ 5Aw\rwknq;wwwE:sr4mZg[U~WIE˒R+*a %/~)CNKP>^St}Ⱦ66IRx#C*uG)'Op/%s[_YKTmF*ALmc;ͭI14r.\ Vƈwv** Fֹδr[\Χs;/_De[WcDP,AJQQ?d֖2ܨ2E9wʑ!?:sqlډݹE66a(ۜ&hawjj.]nn[mksh͹]]Ag;-+E&DEv.۶\h J62H8ùTw;9q]n-]wj{axтS~!r§d_إ7 l?Υ.:U; z z1zH}WTkdFchs(cmjo׹)Iֽ̧5zl] "uu]'٪]\/aDN}ޯfp.nGZI.Z}Wm^Z4j0#k6[l%Eqͥ)09 >#]GOhg"r#Y:u#דc_?uW:!\el Q)t-m2bhw;nvSdwvwr]8eΆ#шIgZڭ;Slخ6mGJR ̋W3s5(9I#/9Tz&rTPLZ)t;dv 띣ku^׻cm[+mJ^t޿R'WHvrTЯW Q{샔Ex}xSSc8mnczxvu]6h-krQmdfiQ-JVcQD]m]5 r.c Xl33o%;8E>𮺯HDIWK\lm mj-zo*']siy1K'{8Q+Q9)`y*5dmlSDdw~wؚw߸u6j2;eyɶrrryJ娇i+κ}G:Pyo?U[^*6Ө.#QB((BMg9]'q8urw+%#GD .j<~ϯA*\Se/Q}T#'ԸqjDiSJHxp'^ T٪C6jDRKEA]Pa5bٛn8\Ty0zJ_]ۼٸ]9I%dpYKN%RVqJtw͕p̎7{ʔ\N,m#` LI!hѤ6bcLZ4A501YK`.wGJs? _$kiO}W8P{d'q]ȓJKN.Z ܅]\ T.T -HUω%mme6KjshCR>e7_r-%\/W K7ڛ:Y8$Fѷ9EwRh,R)B9CB\dm(Urܭ\r1k͋ ܭs\ۉq(vw\خkRZUu(.2*ەjaιrbœA])#ѹs;sw6qmB_6>ocm|ՈrƕN%xi/8mlrclgTZEzz8; v`v/NS@.HJ5j0٨͓eZ60X66hEOf{$W7ҫHEf}}g8DE!x/Vv5 )}PrםV[bƠ`*K1&LPh֋jt&lٶ1ICJ-ɪ%H_R娥ڽOVިNaz/k99XeY"ktͱmbJ)Kswc':d5wq\+n3dN1lR>BƷej:j{ {tuR^^u5ʢ;0y_+Tt{\{|? دXoTPIrEIj M^jZr诳ȶkC xFzI2MIcsnەW5cQN]qvnr3w]\ыcn \Qk\wVuIX N݉6\))RtQn\RI.q򶶵>%b66Zm(qC"_aSk&ձrdtbO:W. b^UkjCϯRsRCHw ;-me62rˢ'5Oʶ9!+̹xMQh.[\r:wtMp5cuPBy\]NHW^vo|[yhRyگ!N(_&WmC4fS6mFFQuGQֹ+غVlSY5X4lU3:"D둹t1IW\X4V7.m:#W].)]Um4Br֪yvj%۫Px)<&b%Ԉ9SR؇*RA/}O N]"< fmCj_6bW6[I&%x=Wڷk^ 6sT]EQ`Ib*ddF3Lj{?vP\U]cI:e֍ jui^UR/\+}j8w scTm1W!qٳdm8]/ۆg;H;*/]K "=m4ڽcEoN7G0R#28"}qͭ]G)QWDY[#){=NmvpՃzWQÑE瞨4Gǹ͘.,)⽾jٱl1Fė2r[8N뮘+"stwAGb )C-\2oּm^WW^vQYC`b]+j陮;ޑʧ{Զ6d[qAs3꿘-urѭr>#@15lkM5kl46,Y~ME\_*5[;hUT5%!\܉—(U{ >}ޢT~y\cjcV&C,fZͶfnI_ u!5OKd?U}j8NM8裝mUv\Hڕv]WV%Ie2lLSP-ͯ^mkfׯk(1 (sue[ZXX\bDI]ؖlؼ~ӌjqzMƽI#"YIpR2hw\Qj4Tr7mۚ]e-_R|J))$_;6baGD]QSdSm4Kh$P2(/kckEV53e-lXڒ6Ѣ $2bB( J~nͅrpܟܨGTMJꅢduUj.duK$Q9`]z_+'~Tr#ᢗ0}9V6').R opb܊$scFmbŹp؝BW*6cm+mJŌZ-`X5wMnvW70L%;t-.Z ; 'SL8ݚ,wtSDe5[oտo{(4/-ё=m҇.Dq'G~\>Ч([Ƈ:m ژh($LfLOh>VOÍJWC9|N◨$"RD>+j.mKqUɒɔҲ])OVk ፰6f~lߛ!y{{jύ`2w]Y!)mkZ#_m\m'?(\TԗݟtU^M[SL{5_/*ގmF1bɶة&YQ[xﯽZA"1jmx92%DJXmkl@HX0{ !Lf3lsBTDȧKJ}<EƲxmf.~T9i_{hgr9lq˹\kh܂1r4&$74SE3r6*#%IpLoKZ!RN.*ȺtTy]>jO]Q.:^mq+y 7qXvVNGFV3Efٚ"ōljh(2kcoh+Ai[sbBjNe8ӍO`*-/a+(;|rrTubt]޵G%rv>.I:,A cƨNeWՖRFD1) 2J"ʭvj1U |Pd}b0b}O&JyMYl6'! Ԏi]Ur_VzUӛAWJТ#bwvs4F͌] l\k\%J.uJvLEmᾃy`-W^>(RJojŵmd3-[3cilغw w 7U6;e>_6r1=5OkG+#*pe{54;jXSÂątrګefjZ:TRO$qSkkmQŌ{.6,UAb h-&+7wD&-NݹTQ]bA\Qcwc7וfWWKl.^VU}V23h|fmMmYtVi4L&)QI4ZEh5"HK%j6ѴR-Q*ٰmqGρ IHЇ]GT48sx5V)I"QFj6fbdɨc[EQ@3u׭/S9rrE' TOD9B"zp#%m §T9T;;doXm#ri='ZWЩAE.!3kQ쓐"fT~`.̭W%+K\_oB|ZUC?6PDީʃU^TUerw;6Ͷ938=rғ=HѱF0Vur䈢EXŹر[W.A 8 rʹەqpar s[nlAcusW;;Zurm!E1Uu@sr)*n6ː%RPx+i&yjbCF*o݄.klؒbŒh̄Z(m6.d=VQ'ed*Gʉ|71~B)PvR*-9YXؼoZ\GL,"3 ƶ~rmL5m|8+6+_6)\@HUREI<ʼȸBs tN/0yW89Q5%l-ՌlLlw)'I6ح( !JU^YEueGN,zBNC&J2_iQ_P.T;2حeWbT/Yf.8RB)%*]_e7ZQpjەbj峻DXWuͨBLjZѣBcm[6ېNl)E8<6kcѴml~Rʉ]CU: iW[y=ot"n+j6$rܮtsRnH-wvd5Fu"mvK5k[Vy)Vz"{)R&D_i!܃6#O|rrC 5DVkU4TFRCbwnsdܠƍrb(ܺlb;LƮkFƱcb*4 ]-WMmsWwN@f 6%[NJ"xߥi[_Q6nmo֪9U)DujIёy9X/&e/&xKH*r&)ZS`Epױ6bhk5ەwuW QW.R#fUwmwb"rdcsEf4DkŪ#kk~{mqw>C%3[[ LjZ*pGI=r;Oh{4lS bb]Qڕ:XO—VԮ؉Jxjmj#EhJ,EPQ(3MpGkb{r'qS%Q貎 YGOzn8qkbj5r/[\ƍQͷ6ܹr.X9\۔l +Jsi)ݝ] $N-ݬ\E9&9w[pcP9Lw]78r(^u-Qɔȯ<_%^2̋!h&մ^AQĹKf6ilQj#͆Ԧ{8'%+K)wymk/&Tli/\yLљ6F[[eL#Em4j(h*165ccFLٳeC|Ki؜%?P~')`T~ė-ٱSፑrR4\Hbٛ$ÒO'B/؝J|u/<*U2 hdRy6*ض;Rܬ7wAY5l9 n:.ss"!gn@ВO[oںߚzYIbÀ^ևRGqU=S{YKΡ"{T;.(WiOCJӊ&LPtIF (P ٰ}4db+#EFگc ql~B9Ti$?(T#mͪ N | `6Z_TdOWKl6ہ>LԅO)bux{6ChEz50]U+FUbzSГʇqlfͥ}¨rLU%&ۚ5Γ sw'9]ΩsfR.fjl0x֫<*y XJȥ==e(&҆^/)θŶچ].r.;L.ku.Ewp9wsF9qI&'yj!XTSةFַ.땷ZUÔ.,/x9 t#_|+.W?\%Bs"^Gq';"8ʣUv$cmlbyUcy+ra1Rj.s4nmͲpsE-QE33km"u2E;:8MGf *ujͣ涨VҒ\YTmq; LTYλśkkZ|u;xi#u\b*\+ ؜S%;y;}oͫ-!)- ^1^uV.4tVe4~KǽT|ŕ>2Tֲ|V޽y s(ѭûnwq\;ݎ;8se:ndDtk]ۦtܹtI31v.ym>ɫkn֩[#G =-^uj2ecT=жsJ;m'Kt]XNtQDc'#K\9sgu2j\`Q$;NIW6rƍtMr vWw5eɶ9ԓđ9 Hiۤh8+mt\8RdE$A>db|Wʑ yʱb׾?,~4lGM"EæʭceUjչ;"b+p9ETT`69($DWM[sW5wu,PDsDXb6r*h;Fw9ܸrenmrfۜL((m#&1}rӺڥڗHNU'K)T]`:1gFѭ^)g{JGVTnNqIF/+U|5m8/sHӱxO'm Hkyל܊*6)4i$D6z0F`4VF6;KF  1YIF+x5/'O v4KL3 cky:QKlh"a*4k6*Ʊd*.DW*.QrNb Ciwwv.sI]g9DnkXntQwKٍsj\mjJpY#]4@iyZ]*9ZO;9jKYNGjjhvp^G~ڮT=.rP{!`7w[bQZ4Y9cIEV-s\ڣҍ]uC*jcr7s؍5Vͭ#گTԡ{UJmh)RBvH'؍Q*{ /&m~]y;rm˒ZkT6w]݋1nwk,mܹN9uџ.}taְOꃭRxxHrKiMW!=m[y2{PTWXmokUhu2Tګ5E{"y $yyICqᶪڅ%* !ntr\ 0~YN=lN%~=MSG+$9;U? _0m'j UU'q6f&NĢk2S̎6-+L;5X(cu8cI6W RU;2m~Q/LJW^r_Tdv.5(Q;w5[H-;#;.XKL͊%ʹREF&6}Qe=l64U6a6gtuw2q\Hs?UYj0i=A1nzٵN6w[!~Cڥy/ΣI{$]N'C |`.~ROOSZTX}zչm CḽhUQȞFfSIG)Ma@JԜ%(&1&h2L\Ԯd5 J"5wuwv@5cA\.vGf0\]]rwr;p\Uԛ((?Sd K(-6M2b_*O)UzmEmIld4ha SFjm XN$xcto)>zCF:~S`x&>7ɭ*壒[FHBDwvEgvurFFHwr %Μwq*梹S-w]IF"2TQ[ f:]9mY".Ws# eZcC ĉIITwd>=E_SCz~,?+eE.Y\z{<ٵ\mju$QEldaJھoyDt_L')bʽO1*{!^ʋBI]nQvD< &[Eb"JdNH+rF-&ʝڤcsmZL:"Dܨ7 w]6AmFȳD/BZ&Ksvb]}dG:;~̧+xi\af5n60]\]ݹw:qʄi5۲]ٹ\ܮܨhUo $]ts] 'l D(3dmU$H-QhآەW6-Qsːiͭwurи;أRV櫛F"r#rֵ]uYEdex$~Sjtb~տlUmm[f$Ȩkce(nr F(뮻*)QhAvZLw$/ Ny!_fl[%ՕGSQot6UAzRt'E^:ҟuK5i!^/^NT*w1^i/ ]=C*rlZͱb2 hlkFC!k!Mh)h5Dj?%/ɲd|>6jM?WPt{z>rFP"Qk Uw]w|)~/oըj"״З$ 6u l$C6׼{m{ 딻6mm[*$klZnUv{xʕ:vvv%zҹfh[^Uڶ0j FLQkF5&ѬZ MIhɢxmF:ےts\!lPIDatGLtΙ➃%G %fڶUIEܥNk~[oTjEF-QlVCG:h5\1kEs)wt\+usUstrB.Dph;bch˛r#ݱT-4jhHha{}m}Kݛ!٨?\Ͼ?SV6=OCl4[;/.: Ucl yjlmmyUEz!^@./Lq6Wl9%AڽEUr\;^-ecjj^/Jm \QS QGGY66jz-Ŷ1RфE% lbE Ff6U{0ARr 7+{mbqęmA部U|B$jZKn 0x\\^/M=^x菎ٴ7hM6M(J2,"6QZ7wW-EEbEak1iCy@+%.I=̏q)zt=mSdeM-V^QebV2Qi5rr;SnW87;5BD}~ҿ6 mx|EjQNyZ駔_M1OOQ*[EF#2QdcXm  lhY$i$4B)myu_2?|*>1EbZ[7 5دCD`dխzшeֹHMѓw[nk&*йbq:hkܫcrvtkECHc[..FbI1wwwEVk*I=/e*_ >)!T( Qam6EQz Z6!(-(6$A:8.86g~%U9eCNN]"vu:م{:/GJI]RO^Gߓ[ZM{t{x/AIJ]8qpWݓV:XƎ݄9;Nus8vwp A1wR[[Yw0i;26^I=GinNӠNw1ZU}Ƚ)Q*럼 m"T{{浱\I͉⸲k+i˛\S(!d_7jދh-Ul>ҠKe_儧.1NW Ug[)殴_=-%r'oW[;w\e6)5E99EEmmr"Ki))fdLF9Y\ww\э"Guіͽ-G))CB;zT]<]:^-ؾ*klkE kV -"&(E@mdzܲfi)O7z~mSl̶l?):1xV"lZu٫s2Hp8J(/;TfѱkVkEFdMb6uuRF]m)mGwOf1W-h1fY;im+jW@|}6l 6V߁JȫZ#Z#Q~[Sqi_I.Qjl Fl`!A./E;bv]֨au4uBj3$uI=t=r]b^YʞOqڶi1".kn[V+%w7* m ӝNn.w!j-cI 櫅JcWwlr;Ljw tλu]\NfEhruۺqv-Vju%o^Vm=M'%tE ғ j{_ auҔ; l3mO+I*='wmE٭T>^jye]~1QoֽcV-TX)$cUREkRIm~Ui)x0>`J||J գDxmlٛ*C:JGHx+1W2\5nkWqlfͮպl^UxBC|Yj9HV5 ֭Z DesF˻끱ME6W6z=ʼz?\_ \O-JB$^L:ǖ}=5BZ=MA+V-hلD'uMmcJʝJ+F7v5G1ˮuݜj.ۥ˛;\w+\Z,1EDh2TF6^<=ľT%}; N'`v5..ŽWB=yAcmܕCy0ffdژQEŪ6J&$IcV&b#Q1 i5VdH K%?]UkF2ږ6*,[i~|?zlյ_ 슕|m6jشMlF#F7"+#&MO!:t:K:sIȑKك{UڼՉ\m]D湮Snc价.1v9\Erwq1wW]ͦmmKz2R5_e;Aۊ붣U=<:puyR*nmJNymJm leXlJڵ^>SC{)O`xv_N3j{]7GdO0*z !I{]`:]/mkF4jM̢vUll_\cmSjSjakm{V6-O7nV6ÍzX _ 'akmjF~;s/ZƍY%FZJƱ5,fZ6r@|Lڍ/>lIž |(;mm UsbڎJ[Nmkr\뻢 rw9:⻝F6 sq&$LR $&Q"#$$,DWhmO^_.'TqujMD)yZS^VGesy]S#\\.#mouۻmtX&ڌ) mmm6j/k]‹mkfzWGt ߷/Twz]3 =J/lGʹ6A Js5l6m/?'sRd=- ާi.fVY:칹mj1V*LDQLƢt;du+g;̮]49*ɵXEss nksN")"%n⹹ &gZz{^ίgkoF6PC;]ʮjl\kZ66IlJU GiknjFG6Ir]L)CRwjqݪ97w HZ*ݢ;Ѥ$m.pm XbԖF6ڛdr^l;5.GVmCJО'tQIU{sehOrlWi#NFS֪;J]^=E`eڋI6|sc+=Hzz1g:&[4bk_9ֹuU9cu-Zkm|mClJ)'^^Ol2|i?6>ے{Aom#(cňb(uWwZ5rsrws5Rw];XT@b-..puVE_ڏ 2b塨URyjί;?ፍMewt1qܡNEyTO['A^jh{}M7:(1lhFډ1srEQ[* \,wv"sqnw]3gwk˛r\ۻ%]sspd;\5&bvup\w]8v\Dm5am}دQC̖S֫+Uko&mEF0,ئbѣZ6k(QHhj(FԒos2kjCngsQk}ŋQ> "za}0r[dF$Ekhmʤkk+%`m:z$uEեӮ/JK ]3m- W~" KdS)W%ѻ~ KͿbDRV//caإ$?¯[Ee)Ƣf2T҅# Lk_gjƯUW+6ɞ-UoV4mFjuk~lfITS\'6lem6kPhŢ1&b[̌C-{oE}ΗՏP^~N6mگVU;6l4ٴ6!@]|/\䟇Sԫpٴq8li#t5*~wtVa@.GQ ƍmҗ*]D 㲥#y!/Cv:S1cm_nE8mi6lEquW\\0(mI1bQ@F!#Fk(._w)JvQvQvU;ҕ*]lqׁWÕS/ڭe j b-6;1j#ȒZ\+;\nqd4ۻܮ] v9۔s\\l$nOKVm];ߥ ODƢZU&bߵ%+٥9ϑś :Vޝ+xkەgsbU۝mdǶ\kmܢ?P?;ko bLm[m}Ѫ11mqd-BKEi8k<@戹43Mn!Kỻ~ׁ슶qrmح^P#ڪyR?U5#c[ l[>mHWޡj6՞-^kd1X%m~lTy=9k-Ȇb"4DR4!j [eQEEKsW.Zj-wks*t`ڃ21nnlkE˔\t.k-w\\v4hICE@$P`faNNu9[mk|'|Kv֭z?ݍt"k6ض?ֵyWwwvwnuussvE#uvNN;$]J;ΝSwwnrʹ+XN@LXEsj͹--իQ.n\*nZtQsFeukUW*h-U(KU%RV'*h=|8l7mu4]1uVm.g(' -JǷ{}oUSO>~fM566*oY&+F"dSI%&h% ~m6BDS;rÃillN5)_pSUml[m8ޚ)?9 ԏ(ڏu Yk\*Bvax9'>R $ٴm[ LLJJɬ` QBmZ4cim6 Es뫩s3i \p3aW[6^J/6/7NbLXhë>,[h fZha6  CY U$V6-mA L@kJD$$6ik-XFcLوZ0Ic"m}T} T"`D(({* NJU@_`CM 4@ RUTJU*BT)J(UJJE*JPJRTR)RJJIIB*@T@REP PP @ P*R U U)JP(P(P%*PiTi(@A@e@2h(PD! !@")) ((@TJP@@@D@P}U`Xƭ" X" 5clh -Vօ%L F ƲUQiRi1ѳрm +A lA,V)a͖(PlaE`$ "h&Zj#-Yl5hťbѦK L$61c!@ VkL QŬD6ʉ̖6lbԆ#+e  h$D5mfa#`m`&Z̖ ըCclfm`X2A&(d6Uf-ڥH@%DAUOɀdɉѦ4&LF@И4hLC*F#M4#M F2444`!514&dg6yAT@h=OQT jdG='z#fFhzim5z R06hbB1S@'d@i=#hɦzI1=ChhHhCA4h@ @2 R&LM<4jx&=iBzLbF1 SiOOOU 0zc5=)鑦M=O~=O!=OP{TmCMC0T JI 4hhd LF 6i3FODѦS` M蘞LѩFR~əj3iCEP#ff8mܜnm>o''e^NZt\xi/&O~Kg{]S%~o=pXPӎ^no!^rw˞_=GAu/NWO]vtIUKFWUKwkcjbaDCh,mRXX*4hVD6I1)d]֭}W[UE1FeE."n~ق?wBh!m~֥r?>~䟾y mVi ?WJ;mH`?RBTjq/߇4[lMghK<}_W<6q/o骏6Q+a?U\= me[U;%dxiԿuKjkU,QP۸4ׄ\!\sѢ" F˻i㷄F7x䌎Fh\.6v4T\%^&lgNЕ㷎umŮEݻ\+xU;cv**ir9Uar4ۑ'IHH^Nx]wt춢[gtxo-۔],/:QъlI.~ kvq8g'&t({W_}HpGPQZKZފm54@I&m&4[Z0^s*f5m*SbI[_/x3 ̼m;m=.:\MQFi4[ F-KڢōmMEQa,A 3E1DZKD.\G8Ɍ`!0$٦66֧.Wtk'{AӺ t ª]zϨ:D[E o:o;~_mWVUhٵ35)|ٗ/kk[OmVi4l~.N5f:+?BKo$KZQѨ7 sUՓ.kn\n ;Zh+,ѩ.b; 4X$`6Z;(ÖWv]Vj6?Cbs6W+uۗ.Ft:n+P)D]w]wt3\d5V߼ZChNm섇TU]Gӓ[oR..+.zWOAl~73W 1t3\ڷxf'u;mWTvTwEG~Յq٤w#Фv9_Fuͷ5ήbsV嬛CaݨUSSױz>oICʧW6xJ+񭱵(!QcF]hk֥.rJ8+ :#3#; -ei4 !* ݩw>n~u]z~ Q=/}+xO'[㪼lkfmf9Rkm5^\JܫR77$r梢vح;Q拕j6(ds5mk}_=mWDk:yӺ_s|wFSÌAEIscq-ΘWw.bnmSlWwi$nɔ&JŨ4m DjX'vJXUp]A.ݐwnwq酶o} 蜕RN&̭wƸӅÿȁSdlG7ʪ.GEN'EyoIwtbEX"\@rFJwTw;]).vRlkhSܨ1c]%usXܮmmQnW.ŮQ7;EM2h ֯lͨt׬ЌڣEOu"J_܅W~K)Ae>GȻ8xq6n2x;gH's /PKx?R!6rln;8:$W*hzdsx?skkWo֞~OX{j |E|H縫H+w(٫gq'+ mPSNw]ܧv$wn"2fwpt̿}ESq.܍FƸ3tD R+e ܐv R_*zOY ~GG{֛63+1*4&MЃ,j5drŋ[Z\3sW6[phWӎ1QwvAiʺ싎ܒ8wNlӓy_>m{Dkbhnܡ+m Uf[/_clTG0:JٔyUNtS-mo`R}GH^as'|Gp;KO'K#xʞ]oIm K$V 5QAFOU\2\j5Fw\-ssa.E"6,`-](C\^;N;4#~ciufxgȮ{0E&M$"kSh5Fqp3Q<"_[g<ϪxTkgp=)j;lU%E;MHQ3(FFr5 $A+_wPx5E㌓ini|%8oﵵk2+FN 8$l\FO­o%ߩ+i+_6ûqf5b;;vR쪻%S<]K>NfѨKjKjm[Q4Ulcd(5hE%k,[Eb/rw84 /?{5^'uOZ7ſ8R_b"Ohm~wUxd}U>iSWmzaAAFFlTTP#,dȴmdAQ,,b`opNwtn%3us}^]^W=aE^>&m;]:} Ϳ}R%DDa&D&(-VF1wvK\ʹRww:Qrˣ3wunkRSNca i\DXcnUW+27u$W2ep,Uh6") Usb,lJJf$dS+\5dؘ굾El].{ْ__ tQk C2twby~BN[jG խYxٶ6lka1 zU~aUWz&O\uε^}*t_?m[VjbQ%DԞwqv˛o[o63oԨ^No 1ۆ pPz6GUiKו'5pke3Ff1XHR1&CGkr \vF5ڊh1wmʍn,qpdܱbrэq\-͹$blr5s\]kc4R2D0NG]wwvmȕZ%أb,S_1K jjEIj}ET<ONЧRP?m.$^ʏ!r_~.Rمl֔?l|$wG$F¯Z_MT}:fl(%E9 zD6ʼճkl'^lͮ $OQOV=Uzw e86bŻE,[Գwkő~r|M1R<_};oT$^YO[/q*jO/ܿZގj,$DλVmlCV+`||^]jǤ}Eۧø%O_>j`}^~ymmk|~뻽{u n]xU^:B8k5-c=Ct/>7w"hh+)3fm7 R(tV1 lF mm2;W{~nܐaD%z}iDqy=yb/;e/Pi⇎͛memQ"0@d5c[ƬQcHMئvs;ɹnmu2ERW)̄o&Wݶ51wmx(IOW[k^F4`\[;a# .'.QskFܮ .kV;nmQ9\kskwnUΓ \FImdыvvKq.oڿq[|Wū9t8ֹ5'$Gwy<͓kov2'xr_Sy/Bڭ%mz1حKJ筵yAM+S:ۏЄvzZ*U/Icҗp{u?w%;˽͘x:?jb 2De2I77MY66ѣ*5h[hBѪHc:ߵRG}Sllػ;rsl6XVҕQ( ֍,l’$kHń 4$)RsumNzKҾeýwlƈwťTovj) *umynU\-q$ƣD@kW6ml]N|^mmKSs sj z]l{{](T4uмDSih)dVl1^7VsCܫܧs{#Ѣy~Vnn:{[/ZhѤC&0fړ5avm\8cw\,m6ZײQ,F N컜k:N5;Gn봓.|MIc"oW*ͩ^ OϠzL3$vIw!zRO_Oo%HCD:Whmz]" u/+m͢`FMîn;׸׻JoOjߒ1OuԮws:ɷD.d[OI#^~cDxfm*m ٙ\l#zwr sRGю̻3óy 6ka3lycz Jz-6{6P_U0O%yw.^Lkkk8־3bS[iXld"& Ə`!wRru.mh2WNXۛ]5LZ鋑F.Icc]ֺZr7J4lL"..'q&'շ6*_mWGSUb4M)Yq88k8"QKxlX,@chWI?9G+Tuɳmy6:Z{%VQZj$6Qҳ]~G^(_>"w-[6]gnA;eNPp96fm, "Uso'T/e)T&=O;"ڽm[[u]C feEIhV5)45&֋EFkIA QhV5Z 1 ƻ4 Lt;so[_=n<5S'W.Uwi: mmlwm%OO^<5c;ͥy#xS6ɰBL3%Pر* "ѩ5b-a+BZVQ@K\qq3~BIWW9Edp.l-_TKPܟ6Mٵ& h:Uy/Clhrrr5rm":[Eկ' ͤi|/yZQ;Sٵ38\Rs h66m͌dV-\9urܻCAWc$%6qqDW=f߳E<56flc7TU{/6=t6|ogrWCtj@5pc^pNQ( ".D29Q2hB0 E>^X˗cVz'38CQ  .\.~[^"}y004 !D8*kL1Z鿮e QCi`)I^0ct DB r)sκT/\A.K)%06gTip5Jj)[f#ƽTJ ?`.j 0S44K6`҃JBo16\aQlL征ȸhn,Aq/ \}BOJHCם>gާ|(+1ע:G6,\Ȝu|>+h飆GC-ޯzQbE&J*K2 fp&y"6>~xXN.KRn<.  e#. W- Y#O/d| o*'=мkOG .΋$m/&Ra%ȍ*qbEz2w!KF4t]hbqrn?gw6,(260-^'j >2rwJ&^oi0]:)xc㞠^PmB <(5A$CU'XnQ.32XݖhJbsv~ރ|ؠ,5ѽCF` Gvw\!KNxcBe<lnar8z#^=U[= XQN-T 7NvK++KZgD$IגY@Ψ-䨫͘ȹOʐ:> ۦO^1%{fE?Y'sb tE/]J 7'fZ,qb ߎ݅AӈD\x¸5$zN:r>8ݨY쮀Ouږy f]PY|Y07ܡh=D |JWKgZog$+hvKW{5 N&~_zٟ;_绶+ցr4O^0^X~}l;}ķռ{2fyd.j׋q1{ÿhCBsGF@f> .]M%b,ՔP K8dx@[Sp/9>}^ ēcdʻ@Ps])p<RPHaBAANzX, ! tÄE"A4bBn !H _(Sx]zXG E%fzi `u٘CD_ٌگRA[mHVZs3Pc 42sM w*Ð?shFPU|n9/Q5(?n*GN7sh@چr<[TX'yPǯt YU?V-@D!RVS{"v <|xr'NR=Mժ@#L\ (A2 | 谇#觨|}.AMc kASB:taKO XDƑpN۫cPw  Q->oU?VwgOƾA!>ުe!c,H:iXv wnV)ʺıYP+{[ը.Ug^Ir#օ}kEQQ_|HЬ9:pE_90$N_{Jlڟ#uڌj[6 >jO2[ݙQHJHwxb u&hT4Ah@e]}elCf@ P+Y1͇ЧKf5]f*'O BLJ12Ce/ u*ճ%2&T'9A `J}v@L#7*:]..Q09T3 1(ǠER'q JN^A4aQT1YhvQ3DxҶA\OkA@3`^ڌp9. IVYÚ׬&qc1Z*ӄ ]q,OZ/"yCY,njL*`< 5䒲K_3,g h%Z*hk nETFM|B Z_ -o|7 6׉XS3H{T+OGMt<,7(LQ5ǂT \BN'Z>>zgrJ$vX[3C>C`DרmP*lnr#cWKT[nqqQ}7XjSrĴ4)"k{:[tcN:⺬{[BiB3Ւ IjvraxeӁ,:g\qb{*SF#ًV4LL.YMKO&_> r);! S8Fɏxސ'b@=bCZ&͚XnQcr $7 CꦪPeᵎIgHe^@d\*#I]4ZUМ`cZ^ny5f5{䃷ȤYzo\=2u 2Fk9{BDBjnp ˈfZGaZ,HSЋ6;%_\[1 J&ro"=+UMرDVq.*}\ (X)vI^bȺ1뗥$LJntDźΓB&S/\Ș*Сau!E9$ 6ְZ~-"x.^s-{`ѹVV灥Yp,vzv{5qgm>:xHQY4'fQ{\"ԈNpd,J jڝQEU^M P5Мgq^C!y[5RGgP6Yweu!.rL 5gPc0fHj]`=NC(3C7eэ;,@,8TSr-+ڠ$ fza`A ׀tt/pPX67c4_r ڰZ8a[Vhc[:  ?\>ҏ^ݼ_dxXkc*hIxP9Э]yՁ?8bN@K]уY6tR_};N9B?TRzNx-iԙ8AZ{ws/jꚰڰlۑ]@z\VDGȻh] S)jp OBgn%aQPEM6~Չ.iQOUT{=k]fj`˽h"tMB2xŦMEԓְsaEE D*@h͙LfCP h!|?6z.i`g>/Bj$SA]~6ǝ\\G;mEbE̚TsDWZyǣHy<Ýsm ʺBP+[jsA|I~/DU,_O ŁK}kpQVGDv|r\i?TDA[%L=s^.`mM5坳έ85_S2 `|opEՋA[Yjel)rQџLmM1L?'~F=hFx])6{/5Mt h$ahv%M=vA{BѾYx.XsBqjZ aT 0tǷBr7/.fҼ=Ʊ%%&\mNnwD)"t}MZVk$DbElY9_,?[Ou%x`0?b*|5fOy<:`jR- ,Y2!U۳Q-q n] 6:r-^y;峖}EҙOP= +UǮZjn(]-;k+I*!u Ħ;^X-|ESl4;U'NG{<@NcE\{lޮ-WN.~b 0\8Dg/\[;]-!Zb` 0qw!X a#V{F /j/#/=עצo*ەW6+KWyWOm;!rex.ɪ43f&5k5{6yއmsW$jnyhnt!@6^e#|e?{Wd_.mV"^MB{CH  Fȅt%xdC!0Fi9Ap/\=_[3+;b Ja (DH{(1P "4HB oR 0HVԱ~i܇:ը-NāW!"?^C#E]kP H!PB>AثGa=k ~Ψe74u;wV|yk0vǴ<@' @P<;eaaĿoR. ӳ%q!БċFG3CtWQ]vNV#S.L^/N\ysqvk\sg×-+Uɋj4at< xr90m%jdsܘj.vItOC0iW:-EԞcEa͊=&S8\_It.NU.{Oi{o3ؼ9WO>qAz^ߊ垧 . G*YD p=(n4? mJ Z <0BYï֫5\PiA.H7-;dNXp1q'?tDwSڑrp  q|QÊ8OF5и?h\z>U0?2z r* Əd`vuNqH\OHh˛O0N ]'A8X`N(Rn=˻&%{  I<=4އҙO)F(َmHF:˂}OCRJf@@GYM}Ke}e% eQe+t,~K;ҍ8U"`5otĂBp*0 F\-(Lr CbO ^Y~P1U)P !֠8/+<̃[Pr #4jtqtC\ FɚIz^W,tVC0=Lfz%Z5}~!a{. {d: }' ~WǪ#p1[}vxd=wܵyoX:~d8mf Ӣw7#)MAj.;+D N{"9gKp<޲TƜi L%l˓5!ܙ%*EHQ TVaYwY3 ||;+!mOt1F\4JrYh)$ES*M@`6(tZ*b\6 _DҜWj72Rvh /VXݩk:}=j&Vz N*"o![0m;pfTa-}Rգ+ .~#bҩ0&B`ֱV)QA.asCzEًw/z|s''2!RUST8͢dx{fXy}%Zm'肸G._/Й$$%R^7D smIr|75ٔXR8̞c~9 Z>.8AI׋kAEWC7O\q^yg.NRATخy"n!C](j|6 5e3MZT0w_R8dJnF["tG õSn Yh9r쇿̠~H@9LYXQ I y)(o\0s>)(HK{ž u|^x7Q.^ ny D}k o×L?1ih ~[Bڧ/fn~0j-bo?9P胸>ǯ ŏ|Sn8p@eifYԁG4\p)gD(X諣89vԗ{HB8Oo'eϏذd_%ɇT43qARTmWbmT S,Xl@g n4 FvVJ U4x;/& \Ӵ๎ i&x_k6sB`&1<CЅRCӇL$vUC<1GdFEhkai)e]}sȋ%A8Vx>iPm>6z2gvy&ޢWvcF"_xۮ0e D14R6X"Q~`m-e ~6~[![{zoV4G/̉]u9`X,ݴ:Pun>ȹq_6Y[B9KZ,8}.l'T*0+UYJ|^UlCk3|[Xnt) oO'+w\6ueƐrъ# hvGai<ϭ *]e~([??'߶l^tL 9B:s8Rj jRT~* +Y" *(gҗ`͘%ZpV )C; /kVb,a.7~G#'{Ĵ`R:AB`q8i~w42rfM9-nlٹDyke&cR^*46Qpgݼ˾<( jw"ؼ[a-%C:޽~}#d='d sUeP4f[8y"ikEWu:u#wGMa8= -X'Q5 ZԳ9sE{;Hqw0cFtO*7f= h-jူP@)2 fs!Rx0x܍[8Ų{wɽա:qUlHfkj!lÜOt^1{%۪jKH"wɨ7o|!zlw\|bHz]' Ӥ4yD15V??䫢8_TIKuOWEKn3mb" 0!$mWlԟe׸;fVZrk3ò#"=O %S_}Wyv7:@/rܼwgPXfrԑOqI8 lRg\ u2n2^(#Tw6ɥ|O@I-x7fqڋ8Id#L q0!^ǢPT;NC* >urI'{8eX9KP‾^,  4! 8B#U09.m݄\۩% k `9.;{, zF|h<>!goXGLͪ%_OMḲ{ T2D;nξ.$а;26lR2VpT l TQP+|ڝ,0 }Q4!)ֶ'DoP''h>9z^}ܱݘK43ĭSLq+ ;euqBE*fe|D؂ޠ4J8vеt ;tLJts̄k ?|RqŪ,sQbIJ^s`3hGl&M3iIx|§t#0[4~1:#]Nay[]1˫ƞFo~^NBjǬP:Y&Z5vj@T!v'`A⥳Liڿ99zvWnxa\'Ъ bt `؞gJ4m )vL"?]REi S WX܋x['7b/ivDk+4XKޟe7Iۑ,|7vS'WK[Q'AdNcf')7:6*sGN}!%6{u1 BOKP ȃ2nΤfs rT(+]W#w 'y2PڠP"uk((VH-YτHAOkS_%[cWVs"!Ԩn=Kd`|Ʒ[N.~aqxȯد_?9 gM]\7+ZB@5]'l[ZHfΠ:g!_-KDCk|{}f)"D GwpW:hDKMmQ>tY 5=pzi ەݢ[%q87!kT |1C2\<A8 NR N`K# QzLKG[>5>\xA;Jayؕݡ1W=3U\|R}'aKVXk(G@nD{İ!Ta+M X5t bo#'uԈ!ϴ؊=V(UMXKo.d[oLZ""HdG[}cUFn|sy}rJ]$B,ṕJ&Gώ$-WJ {"4>ՑjO[ѹ /Qpwmҏ她7@ (bL4X^V9ze #aC@Ro_zz9\z>5+Ƿpd>Ӌa Jـ4u^?7Osk5o(Vi&( vSq<ɂ@2v)M ا r{=a ۔ON*/qx I K}@u tׯD+(A@@sϛ>Mk Ͷ9\b`.b)켙e?Oh\ǫ $ɑ[TI1Yu#@cψg)!9TC0Z XSC"YbC/}I*|Ke*){:Ww>Ϛu57khFyȢT8 Jz- 8,ĉ!!^oJzB_`>Eڀs^|/'7<\D^$-,ϧ!~/ׇ*{㍙La;pTk R,+l2^vV[&}Jaɟd'",!ĠbrbdG0Ktĕ@p'3 uFcH`pRMk~*鮵W^zQda1G-5bsIâXkmeP.\)KE=p} Rq)ip<VP^8:nJ7S:2irK~ ocQӨQ@P0}@uOp`gN.A1 ҫ~N<$7q>"QiB}z;sӏchKM=q:J\ ʽNia)(\Wo\Mxg X|/;s_u޿Gkݞ[MES+ՋC:͚š%b1 i0r149 2%?R@ݝ̃T>~Q+kZ}ƻ!Nߞ) ۏИ웈|H䵎1iWD1?ggDڜvV #F.]ySWk٧J4Kx9Ȕ)F2k01+ n&+iǚƋ] hT4jZ~L"W "(qT*4Xd"CI(0h| ؞ 97PT, {+UNќ.5h|]?|U5塥mwV:& t?N{?b[G{vn\D'H .$!ARbdEiDvuӖ?E0C :e 73!|:Y|l*iH&&;k@|A(ɌHBLUqN }~!RN? ND(d 6^㮈aäKݚq5縰h g ~&N޴egGI .e$GP4$WdB8h.)W LOLNy(5>Qu=aiI8Oc}$fru 1?/ˆ-;ލ|p'^SXcҝ̞&i2jDs9i xG'<林z[vG}M yU{~> ]9ytp0Ku !%!0c#+)tGV@pS1AnTP! C* }zt6kbb:n4K rGQpBϪP'E9B =?zK~#cLmjOv#č#|nZwϠo?a}|fu͊&Ib MEH%4KhpGAAS=me-PEg^XIwS'+.эPDPY6le`9>=B0 /cB BtQpkK7QL5gB= X ^4N!i1bϼdLloƗ=s^]sNp\[&5UFY$;q'GM(?\+r#ƤLY軙i]R/^I`[k3@ RRD&10ua ϕ#:TH":t$t l)F͂KUկ>靇ޏ,o6a< m̉p| -K,3Hs--,d"oR6cx0-u uD J? u_F3ca uvQ-5obSz4GHB}CFqWxTR޼|yg3{K6Z.apuxzĔMp,W `xE1rG&,f]ˈ+bY}~2QO 6ǹp3 F5jm@pb [W HBZW3W O\J"c~0܋30Ven-;x58]LN|糦Bhe$GW1E[R~Hg]XB\Fq7Lq/2Tf;̕gÅP]ûGa#}-%[7F`ǐٜܶQNk0S5OJI.|/졋 vn'"aX*)~@J(*he)\*\ڤA3=ׂX$bCkC"1!%ݺPt/ꃪN55WΏ/L6$>T$`OW'llٲ8Te0-9L ~z.|Gn?YH5,EQ9'rk+Y30'>w"Fۻga8 5_gē; $$p)pR=6ai[g02 7N&Uic]`yӸ_ ;@-#‘U јv$}Tm~ mSqA'Xnά2#F,}aAoq^)Z]Z#(F_aU@8VtFПiO4VDa炙p!0O4A` l\5E#T-52|Ф##oD6dz g0LCj?~OQj2H8{oAgh`ůn.@|f/S؆-7F}`Ne@BNWA) .@!ؐ8?Oo,h/|ow4C&*a"D$Q #>1p^Q&H:LT8i:x &́ (|OZSN" ĩwMpks1gi0͞6MXϥV5h2%ԑh >::rXщ>~s̃j;;贱L\oV3FAofPpc&˯2w۬,tG(a`y4p h%]J 6;[䞗jPM?O^lp`.\]q ~Ou, z 6`ʝν4lׯY@ChآX΀zeȃކK=xhܢ>E r[VR/>$&*˩tT c&.A*'"xnQLAA._ &D>AWk| }]vR7 kg,J~kG8X=CRQ|eZ%/j ǨIь8zckUP &@ >U5blXӘ!jlzď/g!\>Q[F\OpJRpy,\t"Ca8dҮ%H4`((KC1A [o[җ>[0qMWF GswiìpN? _]-jZS`(,ݍ>x=|2[E탩Y :hߐޱ/C@Ue[Hgf-?H^DZSGc )=pb܊l yz8֜:9!MFaQx@L}C(Ai#vO=%z; ;ł9?wژVɰZgN]plP3j.{.nk+ѵIW^&"\t(͠›P;-FGxːBGcprsW2ǥH)VY"w+~}ŚgO x#eXyY^]1̄ARQvMVيZ'wS%b6ACNH&W=~ &XerϢ2C0jाG/WǛKŤo3%ohD E݃F0†@%n}@W"_ZTF,d|5> 'Xx;ԱB$̣>TJ8a [QF@X8aߤ0bkGk\QJ.C&o^4>olt-\ϣF:0ymѻKf f[rD6hs/v[vHK=Rɺ.<ؚ A!cxޥ+< &,$ATd"GX(q]_g^X .\Y|_}:#BrTdja&-ѧMD-{@'G-=}k~׺˘~{`iX2|K:O8$YpT}+Ƅ<ᏼ#CZ&=4uĄ iI!C["{QO~H9NlOJ6Œfn4橻ٳo]u ɕ8-noïzDF=M|{=-姕Ue y2M I@-ncK&鄞/ 8}H8 [ORyOIƭ&6".[C0uP5 =o-dtauEH vaHe*u/ /u'yn=hdM|oaL3|OLzPǠD?_WhA{}?HQ6F11*8‘Eh$j2usܒ߃x!/ݜ:HX<=ZGYeU=P:I,ܽV}N?m3  xz@K"6 6&0ӊUޑDˎ@#ʏ=JEt߄]X+ϱ/g{,OQ<º՞!}W}p9a LHӞlvv f&ζRedJ0nX } jMڋ-RKҹ&> YKfF!8f@.WIT4d@iR95XXd5GXz;.OKi iZ$Aag[@UI?עX~v&NL&01'R:ٙn3T~YN?}^ğ { b]KoV( x5'T$Qлb{_|Pͭh)L=|+W>?շRu`e3,+mxrL5axH9AoSE:)g\hlu&_Nh[-"kEQȍ /7)jx?{2Hp}jd.5@xR='jPZA7(0*c4 pU3yRwFA۲-v3 hpX0fqWuxt<"sdEFm\Mh=RICި'$Xߪ]:4ԤVe(.c:JW/̛clf'Aj /{K,?**1c/(8TIpj\0KA5z#hmEX =9J"zŇl'njB8W5Sou`|O$k߃D w=[q^%ڑc_eC ^ ߜtKu~tt;_|1=j<ϓqqLXL=3 ˨QI_&-a|ZC# j-בffu0)9 c hCqk0,lTZIqi=J&8:l/QiuzӜ6E-)_4z1F5(/ )"'N`3HhX1 ^߾^K{u'4YajaO{!QR$5پHuK!#vpZpmf|H/t(XB"gnl N]5 >n9Rr1cz?c|aERѽAKn4='ke`u:YS[o= }YǃbNc'U$qᒴi>AB.bͳjZZtzeV| C".յʂ߄J,BTgJzl{=tӃfxcX@=AI/ss9 NmCPf߃qC B@$/tpC:huEF+`|sSU-T 9\-rO_9':Y(߆5XgܝThp-=}9S-PC=aI d$r:ћTep-V8"x$0UIiqZEq>ѫ0zH4#l€i8H k5ZTf9ܒMdI Y}(=; 8| ergv,Wű1359D+C3٬PѺEHwh%rRyBPfnBa37eE~Q TL_5x(~({x(z%uw0IDsx$KWvz׌XM=S<ʄQH-f+Z.@߽ Ч&vi+9 )ɛ}Ǔ'Csna_ B`!yB7CF!^V?a9@<1\"F}SHpC%٢ )W%#k6r:C)6(cq`MVvƘSOahadOէ65Ll%i.O@7d B1 h'k;qA$j9m6ǿ u7EWݿ;$nɍfV$\WgktwѾ0i>'k':0!nI/җwL~#i ௧A{,By'Cr& _=aeWo3G|{92#N}1 1pI8R5ZDgPnoaоq~݃jndƍtV(@)Bvg4H t"ꗎ Ov QPrTf &Fs=0/tzDdY 5[ԨbU|g(8#bSYC[`CT+$ .ءpˆ{NF^ îױN M2%:i1/L}Hy_3'UYp2t0%:ZWz) lBj~ϱnQ|NהL}EӷWn(;n_ՈL94HLriq> *ƃ&t 9,.3_kէnh[9PTr8蔚OT;L(N'hkOcoO*|Xղ;B N=iX'{.5LoS`[:%T ȒIe? ܣwIvSM?c$܋tlYڦȟ._T?}1-nD 5l>&婠߱onnuotJS9,βz |pH3;1o5Wf`CxhsyY 9U6#oj09П&H <Ӛ[~? >F1faSgJtzG M6s瑑T@5ﯟ1< ԓz#–hJ_Lt.$PQ +A1 a2r JJX#;SSi]&@=zȇ`bI_Hإ~b`+(gdy,a$^ C]A-r?gLۂJݕ'ט_k(5Kg㕺Y!6Cp( nmҹ)B@lx6grGeEq(0JFNE) Pcύ)v`~4B)l >.H0ʀOwCЃ6J/Eu,E0r/б4UU޾F7\(yֳWHn)̓uZ<Q]J`< 0@5 Ij 1 .vZbElHMJa8W'"EC %<] 8ERPYo3jkqmE jAnMJ U^? 1RXK LLa `BzJAU@@6#b8/2.FjB H)0KR gD76q HFWLth!K 0fdt V RȀ+!VDF.Ǣ߀1%=DRQ60_%ehN=HϒbGQxLE~hJ;^Iapz+x $q1B <(kdb&#$4!i7!@ELh4Ha>IpNwz'^p(:EXk;;|'cA Ud!}u":ed/ B-7U\+EB0oZ@Rmw&mǠ8:@;63RǢ}2%)R?+\= GM ,,ʷ ji$GHK۱ //~/>5Qj/bZ&n+|Ӱ[r?NV'6jB)^^A7eɏƨEgB|[MKHDžA}K P8#D?37SP& 4a0(L1+@p=Myv}]tm:{B Hnbh3jVE{p6{$X6%>R&:.Tщn"gX| M_~@pkP3qz|Vh?ڮ!ϳ]ƋɃy` L'#J!FA/9@y>RqG( +swAʉ2x[9bI,;? 7*Af*xpF1j^p! \yhƆeD&&htrn w :k/!9j0N LfV{wH#jr,FK{0[qa A&SS! ?t?L޻4lf6ӍoӫӋUmطtwSb<dT7y9|/d*%}B;G*# b$ *^)x0S̼zS(-~ip&E mt=}:/q5aWu`@آjhՙ8|wL,/VTǏT:)7sK&: z zgfs`k'kR`J$Br+2L&K9{ms7F>Us[x?x?x&58s| Kn=%64 fhrll2\hcC$J=V$v/ȶFKsؔpSEq#읈Td2s{kקb6-Nɿ 76]x#zbg#ڕ)>wQrP0a@cAzM1k@blQ-Fa8AwG?ڜxO< 蚍"7o|(}-{,|5O!NÀBhdATڋcz :˴IԟA|vsdϥ ]o]7 .;dňU$XEv9"%&LKnl?y+8*>(//ǿW{t,@6v2MBB}1"j!fl4v fjOx2V Y$/FQ e'N<\pU=$#rAъ:3]ʺ})=/Cկ!%]vMfl^pA$d>Dy܋=#|PMXArzx2-nJH;a bc&[H?&EB p3bڏ{#2O}ÖE fc*XJK3. Df݅H3iR /B̼6<kNEkZG OadAX.hbRdg$SU.A.(8e%fG_$;@ s7̑nFkE'6ϧTzZǥ=ݻBҦ;@;Y/Akbs5VK˃vr/?TƳѪXgM%N}}7f obl> d;!d4ݱpLv=1Dh4&da@_Sj H4,]5㓄[kG\ӒiVt^0Q5k 'K_ :@ʇlŕ$WKd) &GE$аh܂M[,S5X+X@>qE62 \/&X쫻BK$L͐"]bN#.봼P.j4aՌws[w7ϊ%:oΌﻛj |\ru9;r>K,y © /f8_庡v":gu)H7$rD67oWWۮGsؔHvhoL!P ]F S.9tVeoբM ˛vYO-Z*HTXJ*z'!Dlr]8o:"BC:K6SD|TZUfT…mjvkCzL9.撑j xL1MV@et0pQ(3_LI#8xAuY@xOw<t:3K ?zU$5{ wDр&\EK"knj"Zuh3 I+7SݬĪ~W.PnKSTl-:x|b2uW晖tOgVўk!N6(!T^tpbwV"2: TiM4_YZَ_vX.?ACN-ykAXeMv[C$g?]Jgw"0)64T͈ |qu LMHt9DJM)˝Wr׎JϓdRkqrʝ5Q$"D6G"RN>P+,xAnlr2ݭӯʻ b ˍӧA}z̑GAGVk"RV=OE c,WLl+xk`eށ+;^};N'_(oF?bS>*2tU)RX_*CRPA8,/#*CC`fhJԨ$7c'U232ܡ/[¦8]{vDWexwedS >+/[i~(PvP*H*{V$랗Q~ ۸.7H乷.AmSώ-Iۃ{vq%8F"%Z^͵.`i܆ BЮUj m-ÅL[:@Jl(/lw>W%0J]wb3_Ƈ?#Zyk;\ 3vN紤-ïxfc0L9( G^e qmu)7.V8 ': I#KnG ҙg{|N!h`c~1H*hAtN*ĿhCA$8A@@X]xH}e_x1i.k{Q|e}= ffmr%d<#\yB $g P*)thdXm̮sF4YP(*ב(%AI\'Z9nHO=X}Y^E Td؍&5V`pdwf*A3Em4 m*N6o+WYq~AG\J U1AX.Np@YlQ:4M}WY{D)х2vkiܳ'>pשMpx2eUzi6/׎aF|vMc ,pwdTao~LdnGsdY2+N=K& gcaAP FspԬkd@DhA№\EUZQ5䴀cuиbJ~{>(>_;~0pVpzRXʨ#EO6fGtK9`Ite1g#Hqj;7YC)AgE& Ueuw~7YxT6f]$}z>+R0ڍ[2rǐʢ;?ĠfOPjB8<ǀ0 a4=:L SͥA!TA&sF ǜx oOct=]XϿ.2S?NIvã~hߍv#Ԭ/<~ťKϗj)]o{F<:};k0.ĎšW_ ?|!"dlurѓ4/95h'! ڰ,!]ӛV%WbXD@伃B4`Tx)hV]X8Pćf)~XD2ϣ $egie~QQ cIhҌIAN"^s#
hȸƚ\x$ۏ %^/5~aT. iM p$jE}]RnZlwW v2+9!\>CQ燱|GAr5D..A>4T[·k^4B&U5m-\猻 q$&pA]$ \ЮKoɟ峳`~lځWf+or۶].{qu|tV*8IZB5B@6(lK,dF F 2S$Oyм "m}f ͂̆ڻ)6;UNegrԈrJ:^ Qmr> i·<6Hj} _B̤㟋 XE Yx koQ{yGYc{xWe}xw2Y0Fm27U φ-CRajwkkiۢ 7-e`1U38|0!vmQa#IWrHGȁphE[YZY*R9ulXkMDoCU4ԏ+F -1H"R piӔy>x݉DH0i=[!?2fr/w 9JvtF{Pm?ݷO~σ V;^G~UƑ:+KDu߫= rww"n{Eaq|h.ʻ/l_H!/͇oclMBS1H W5K [lORD㥹+!/ojXߺ w;|{>Mj}OQ0 M(:SԐΓ%H\O.< 5p?N&YQo#%LY5T" 4 "mѺeرu/Bɒ3|gj*yov~ZkȈsq$1 ayObbP~XX2:^Ëry+uk ]DZmtz " 'PS)l9uٳ{e BY9Q݋6JMYੳe0͗> 1g1kjIJsBNQӹ# 7ʉP |nLʱ38BmnU3Zˣl w0hdOg3Y゜#a؊L | k~;HN3 1GF߇Dz[aAeAbEs0 Øb# JCb'ATwQ:".4c-Y1 I/Ⱦwye7x'$;C$4/*Z9gA t~|-3$k o Qzl㤥&g(5H4 xAs;7Rz N3{KE4|i͘x/^U÷(D@16pJ61r6ނ7n#xI1i^{o7(mų!.SV#ar 6/X ӛ~;Zi Uʗ^*[yO%/ל@:z;+n@!G g?8yljܡR:T 9V%]w܋rI ɅDiI Y0HUpٵihWY;{sS܁ɔ_ VJUyθЏ b&lUң'u~St&Kt~8lO4L_?)*F`a{w^+7bX7^UD<vj^rJ^VoTmy9#3{ qt'Hvۭ +Bd{ pԈ'~sk1SbO^ZXƪ_\h;}eu.MS۹VB>N'FPF3_s?knzߪA;_ߢk PwS؊X˯NrABtCY2]B&S^II9WQ-T҂Ltе]RF \˿,DJʢ ,B~${?FTדK$dzzv{bmv^Ɵ]. 2yZ03y]93<3׫bG#mEE[݇^_ 1Ea+ 3(U |9ZdpSxӓfctYtD;2 9H[3|u,z5Y`XXs3qE7gB#)ʀeEF`*0 0EXfX*RȍF}zbZ]g>m&e.H43Jr&TX?XwN%ot_{j˛(m'Fnߤ:Tz !(/ biс)FLmQBX("w[ :-u⟿sQLѱDzDQQ|z{B| Oizx|I$)` qHuu$O-p.&?m<1xkrB BMF-r&a슈.Ѣs3/&}nv>~j䪴6_U glJգYKS] k|pJ VNuzH5VJ< iIޯZ1D !"*bǼ.urZ_a2`̣(AϜ$?Fճl}d'=/5o=%wC ";w pkt# _Ǽ~x6Ęz|72r\) }AC ^e}~/6f8hjzW^kzÄ-uOCL /B 7Fu}!TYFBM, H?~E"Iſy;%W㴦O}"d[H5W(\,TI0E!l[>7Wt^=2].nEޥ Wnm  t"hO-: 4i80>/ |_ʹ}'5.W}Mg6vĿ$5t$`֞"wSazHk*~,Ny,tovQ C^-r#6h&"I *6j/Aᘬ;B5O rCK^8`e>̡v1.Mt)OO' 5bD^;<ugCYe_X԰C pf>%_| p6]A L50=O{-KϘsW;0}Gsă5'r& $$)5i '~I;.j&K^3 ٣+jpU%R;!r69L-@r`3Al6vS@R9&TXp>C+nq"=Hvߩ@䈽U<ХtPГ: E)`}ߞ!ͮ$4 ӷGS?YMzes$$jd=4Dlv^so^$}8Ϥ닦QڢYZH!z|<G 'yP4+ޜɘuP#Xхm`,-i ae_?`£1/x *00g͖6BڰsP,/>/qy$Dwwx',-_y7'ș4+ yb:=ֱ 3b>CD&a681zcbݯnޅ\*QLvPdJR.:% >OjWpsi?1@yltHˬs"5^R :JsO8@~H.:zM=$$^NH Mb ƒ_ ~׭Ҿ2=5{{uE`'Rv@[ \8⟔|C)Xh{G? ws @?*4i4-7tmhĠd61R=Ѵ:DbYs咽wG4Rt 2$A{&h&[ 5/Q:x`iO}p.mPT}IV}Mi͝/\d"3v9>+\mWװ.G.mzqH}Wx>MZ;k/ڝ3SY)fMtΉY+qF2lб뙯6}ߏZir#3xxke 0RSdp*R@K{PHI1T!_ UH"IBTx/-QCZyԑyB!m0I.Jq3x/G̑5>umZ8V\版6<^CDd2FB[]A!d/;hIdLW)E> .?DsfS09vu#g_oؒY6=NdǘGodدNG0l[#?Ips)v&+.0bn ;ph;hNsB`DGC Q0?RS5 ؄u#%{>o[/Yk=r[ţI2@Cz|Hy|i;O x<Җ}u?u=?I7)MX!ɮ24h`о' "]Kw!~kWW뤃A!@ up\ v_9Fctupy]m]z#D⬷h;E:pDZ $—D_z`&T;^`vCj5q.0h 2d$ʩΰOU71/ MhԺE#?Ki1 o3K{nôtmnXi{-cF>V4š%1^$w„p_cʔra09b 00%NqfË.ϋP=Rmj=CM,(9#=!03֫^l?{ Y} ղJyB.[o48 \Ev'AN 9+0o 藍3%=QO}??rϴ´p$[V no|jFޢ3ar4kw+qY1 G%߃DunHT߈{;3oj6KVҝAԈtLV@:d|QH"@k2OYq!|N!Ф$-?8hI1  mDwRSRUSZm՜6;xO֫TdT Pxl/Qp-ݔY|,zbKhP͵e^R_?vLͷ:>Vr\+ 8ig V«H7ƖWy1<Mp˩~eChja߉\'}@GAۋuΈ N? m#c2<">ѐ}0ߏ!VWݵ>,{}l%wwA Vi?Dp޵qJ(/x'0g87:6 At{>[AS~| kZ-4H-:hK(0}rC̯{p]hzpvy+8˾s@[Ts\>ϏNM~̘“,FX`V ͩz}{]I%ܫ?2hMJEû~4:Y|V<00 F\"OB>;86sԀ=nOrVNY3χ%+!,L35؊qHʄU #ՠD'qz:i9z^t343zD5H{V{Qf/ƾMXT(LAg( *ShBT2N7BMsF#`qZ#~{>UiAb)FI3H5SL ȣ˝ ,a$ȪDž=>$E ~ q>#+ݕq[Q`K|+y]~ )E+h~Jݭ5VFávgs=G=F#q}*d4f#@@87O,AD: ad/sbK}ީC|=M'kR]H@EZɎ[ڒḦ́+tґԣJ7t[ս(+g r\Ů ?0"m}Ow/哺NFKK%"U[P7(4kԃ<'5G И}U nȣ[sac`D $FRp`:_#]* TΟ/mcq1Gy"#=96-MZ>~G=th."7~1@sG8RLz`WgJMz<`\WX|b 66ii :!?9mo?c~LР=mk‚4lNq&ΐ+$$-]bSsvXK^՚`\.e| }##+>u:Wˡg ώ G0LՙY(b=fk%2CD$06(Z f?N%ϔFC³ThBYW|[A>& IK#Uv$YWBV!T3kڢ?x砬,Iи?rh7GT,i6JGCב{ _Wž)!v+ܨҨ8Fө6'L:Wz{?K0dzjZTu u@xnx);dw[~F0+jog:2hR]btm1N=/q{a_bk 6cLd&Ώ+_շfż ⾨n|HۮxB {g4á,щ%҅ i!Fp]l\&8~Z d.tqk6Wv cm VmR;WZ2']%<:7,%Vk:l!23FH_B@C+_:<)՟~UeͺSl6RHFjA~v5ٯI ] k҈؃[`0K>HX((1lB_5`=xF4 0.Ɂl"ԁK;5V 4Ʉl."k>@şY#!@0d;6@5T%&,Qz$_0z"!h5>Zh(AH}tsHWLc\9MΩg8)UN r{F'ixx;< |YiGLVYW`xP_6}t A6X҂(A"e+{22~_\Uw: j]Eȵvyp&\`(cyq0u(7OՎ~5I=V-WY׾hY䩳ѵqhI#+F}O'Iwue.f.5_'NhpgNdz7 ܿ۩+!HyI2,9|[k޵^l{|y6E.v!}'i-WkTb{N>$ezXQ+MʖzIsA;r7.PzԸOϞLF&›׃NGA;YZ)lN*_{Ȟѡbz>G.I'J;{=Z ro#'S,@QTRIKT :B)?b/q]7㟨QVDz!8_R"[GHGѸzO><#6XxS- OER)kݟ6gQyڐj4(35QO#`D*IH=+j"ɵ}JE͘x٧STwF85p 5H$&um,Stb֘gPBfB^%AkUɖ m}$_V{s4mC?Skc`y' O=,b*`4kճr"ą{?uuYa>P;ChpZF]GIP:]2~=qLRW{|*pP6d7V,# Ǽϣ ?:_1L.mAB!P(:D!ݍiҞ*+ c)NkOd,a,4IɴN~cفodgnώ#6fPcrseT5bDģl{iL,pMJ vLN罒j($cz^6􅰎 OrMӖw'La{h'Z'b4刧v'!9%Xͣ zKhvVNI;!oHzo)3?{G x{Br =0+D$C@BđL qZC$ɏT"kbX4cB@-[h>{QRpTY=O$٩uU0qǜC|U@/ގѴևԼr(F9~VGiC@dmkd~<2P&X(WU6j9_ЛtAwn5%,x%p3*Lp3u?ws'VhIP\f7pCߒf|wXx #ZvX)nS-{m5VaV9>+t*K^nE`+e'()Rqɏ܀Ux&iIDL:ly1vP2dY5jqL[_,OF6:.m3`!yީNYէ!1t9 ]WػNl%Q7w}Џ?edd-QG4' pcAzzoh~;UD*q=v}6Av456$v;n|y"-m[.,!`Ͷk|掇'eg +`DeAF. ϕEĘƀA!q詸1gF{ ޯhK_)ES`0#nTmJR 2=ّ'^Dؒ? q*@|F(fJؙ9̛6j_SKM>H̪C@Bn#vd7&@)0<ý=b(:p8Vq̓wA"u-+"d!/+2n#)$I'bS8"iWo%pस [VkN}Fmz~~?&5̺=\i<zAZo8  X-GyjU駸v%gᏧC{')GסifPktR=}IS8}_Ѣ/qц1UCv%զ~*V5XZops_Dx VH+Nl^^@x ,&Aݤ LLxbbk»@/84)v`trv1M^Iu|T5!zSK8yfhnqZ;::C~WG:ڴ9&YCP G\_s'5 :(ZԿsszf@YizVM;vmM%Jꈳ=mɺIFf)CE5*vּ,)TxU,6&MFP`yLRv{]IDL}-12Bѽ2jXc9·޶:QX^a8sTi >>6UGXO|qmtAeCBLП/B!~o=02aIs+Ny]`O|כH$tC06`?I,Њ:fEOJDe TJfA(L*`(9<zs^GĦ,D#` NKn;`/b}^Wò|a*KH aS/?!lBFQ&{&.>B;^A:WDUm v-sSh-.EM^=0k=b-ۜ_d- 3 REU?ѩ+Sv}sVt)qTf Ӳ:_:~3Kd)=X겙F5.[wd| h} B7@1_ E q}էmcHo?A85pp `xq_v4ӲgվBFM9P GƯgA:cwָ_nH1zAc.Asxk7 MfiO./R;Y%_*(X.ZTJ J}XzWniWU$<ir4 kO%'uAfWY4KT,<w#PU~1x/4Ӄd9y6$c< UdYx, jg{'Akر՜4̽kShYFPbpӎ5٘J Zug:(X J,߹/8p@x^4O \0u!oFw^1}z `IY^KGk,[" YA/z'$|x{>.׃f&!Y7g{t Fxatz|^ng;4\Yv7ّ\42&jDc6tNDWoғշ2㵺#1ۙz|] o T^O/ϙ-o𹡦! 8Fb`iB&TW^7/| LV}{¦`yePr=e(=ལƤEZM{5+y__?hqkBu)&$Hɧ ?A~`8 ָl'%=c睞|!RD^6{V#4TM3 b K$c@X*: 5ܯB$ T.}/^Ev%sni%n؜U?qmP П߰6М|%Ķi"MMrVv~^ޘ cSMXVyN5Q~to83.[kc*2܅ ̜qdwqdT(20m}.ְX!)QRpP{u;v5vh7FK5iOU!BH|։,wA@GK`M (eLP*)$)4S` ,3]=r Z!Y>R 12SLhi.(^Asdɾ:pk[Zy{>[S&q.kH[J$Pթ*U _#ny{'|u%M~=֋go .7$ %`@kZ'#?m?/G jָ R}ϭZ8iJPuV 47x>jʎ=19V`tLhh@oaw5;thmû-IZp$<M>=)~Rǯf- W+!R\rHj /Wi%w?3Y?y!vꘞbK]KsSv>fMwHX ShSqGE@0%29bWrRs'JHs$tk_,TLr\ HzTNyA]aEj,콋V=؊up5rcU#NhlxQT-uNTOj|3\kNMхdUCe|; ܣkEKC=Kƹ xR6WNWm ]nѰBHyRu|e.ICQ`~r TcatcB2UC+D>+!:#ea+<bȥ%mo rS@c&u5ݽ+#f|An sx ˰L3ꆬ {CtlL=U㲈PiGf.Ud!zQrvwr,[֝ ]׼}>_/b9-˘!s9<\DO:z|֥(؊_s;ղy4ىsg?joٝ_:pY:[ufC-t,MAyeCt~Tcy 3TJ%ݼCPy-ɇ߻~ξyfʻjO K؅ղKɹipv] 9Tcz>a#gv`  <(yzZYG}/FM",G&-ˈHÁXI$.5q_퉩D$3UlM2,T bBǁW-^xѐ(`b9;o&  >Rݑ;[ 6D߯RR`ު8(I :㏒G{jo3_%Pҭ;c̴8H+v cëA:y2;ͥ qc~XmP *mkiL 8}W2GLѠȳKb hL<[wjYH>PY6 w&!1F+ns۞@֙ Os%7,zv56c&Y@t oQ|]۳'·q_l@7!&5p \j@g'egWN#qV±#O2o~-_ӟ x<Ьl2M4 `TNx[/4_63 9&Z PmjeȢ'D/ߚk+FmmkR3O?w6TP5 $ҥJB0x0; K64e:jܐ&ü06n l{!rɰxST×S^dj _v6>qv>G Sib6Ҝ *j^DL{eG|]"cη0֍y/ -b|/_9 et߁RMt4C>`O&m wq+~~-[a$C\kMd)Z?/Եlm^J/[k 0xv@ [뗹'A*4 q*:&+V4a[E t69'dΉ8 Y_sfo%wnP ^Kc"O@I“ӊ7?VWWz =ū6[F]=cH^s׏7k<g=/qqV !FLKWh֠kb9D;ٷ-&-PDE:pB=_=Wp"r35Sw.vjC#H^6xeI#]3 [eh¿c~-%KM@'}WDZ+ #// ˞dֿSrS{tV'A-mX) L;0}#qNTtɟ&f :>h1pɫSdnjq }moVUe-Vm1"-f\b3?P^a:zOo 9?SB4LodWW619БȄ;=# ~ޔO'g埇^߆A1b5ԫZ󁾟w~I]٧ɻz~(\U[%|\mR"$R~hw>UY#W8hqHvvNB_3D^ɸ)M D{ P9iz58{Pi 9}8$_erMtl]27Ԉ'%j2N}I ^{ZU4TΤ4eszO0w*~u?u|5g,"gO06~z_ihdOzPj(nnpO+݁;a6ⱹ%}ҘAx_w&O?pNUR3@! C?c{wC#׈<͝H*`B2Kw_BJ>L /ܒúG<T}_{V$#٤(0A$sR ĢOqT:eAsr`>~0?Ӏ?9Ie F x\vDuP?=,T b+h^6֋0xpAP91_}E'69zGKLWWD\w?7߅Vun0ECjEJL>""utߩ;iB gUz׽yV~UQDg~(W3e,0JViF<#GsQxJp3!r)A)Y ?" ws"C{xl3CsA&Qc,#fZXzu˵4Io>]~)ՓdM=S*m=^G܈5= mz1R!@ã,XI*$$$;$[(}m$< n"ǗE?39#Y=kM :58X g׊Hqe8¡]\1]3VZ1:qPz0ן$/{$wR{sR{ZWN&b$cX{G7;2R1فǽr܎~cŮټ>; i6Y(X ԧ1:mMH:L~%YƙOmq}.1{ud#)|I>_@() ;"(vN IxȺ9d5lս5!/Glk-Hx3Ek$*ڑVG\'Ŕfڏ $hʠaF_kf1"BvP:WTRӍϼlV(I[(7EQ6[VӠ,,Cx0c,54Pp 3NBOsq"KRv ^qՀ$3RrPn/@P@p$њĨ؅Xc{^,YRD wYtҵaAB@ P 5zoٝ;<-]I[(~l?hPYb6¬sF'ﭡNqā#5 (r|Kbb_=᪋J<^Y8? 4M) ݅KӍ8sݾ_I*l5[a)Y P :<~2 Y.p)QzR?%ըn=ǔH`wP M<{4Pr}Ҵ`݉7 b1)Q4ޓgWNO:J,#x6?9 L7 Xc8$G'TxJ4ՈuΜ Rg{י:lS=O|*wAd8C}(N„O<4#n=uWgd'>)b,4@U2ԯ(W'X,5L4}1Þ#̩{QldeW\iSwdp{tiȁPEf!x+e>v g.#:p!Pɟ;R(@9L=>Fe5ʶϚT6(CJjs6Lcbl 'в( ?x]*`d敉WPkA I]Et (G/6XvtN~4ׇDs63>- J,h6k$Ѽ+{aX(B:zryʕbʐpIK ,dz>L%~8NG0DƋ% /,2T UR:rzkiō~TC|ѢY:B#ޜڹQɂ}qtE!n {lDpz y vTK)-Djz1N)8HxYCԳ'i)hAŴcRj{ouWT&L (X ֝O0OtxZ4ǾY8*jL 5k\cbauxw-W77 -4`_j{rXS HR5jWB^<Q+ +ѬF8]NMVE;aIQ BQ6Q nsQtH>^ Խ&鎕Bu֠@ s S?&#;˹F. V< Ua{EM°(Df AR?:OQ'_}*B a+ 4UcZ矶<4+|+da@P2L{G-6ryt̩!WK`ei9A <+oZf2GqZ-712eśK(A: 8k!I ⷚlT[ǕO%ڇ)O=`;0'jIL!$CѳBhV捸u,rMp(0|YWB)GO؊M)'UJAdVFMWOXwoXsh$lXbn{g)qm8lBo+ҟL \GxTp\;&B|+N^<ŬyڷA3)ŷ%5x1U"EpuI%ߌ w}t7ENE۾h Ne^AƒubR4ә9ِx)v#u %} T9&G RN}U)U6y3UkcFE^PEO270f}39|L5]' %(5;CߠyZH>l'&?4@2 aT_y>7ɐrwAو6 ,)?䏗?iWMC)(׍#L1غ<8(Iғ_/Rr۾J>7QvoY1mDs u)` l0vnO.zZ价>EӼЃf\<3L%*L((K꼰&'*)r ^)p\tc61s ϥcb/bְֳkpx _Cha:u}WNRXD3ťI9IB3d(<0ٲ098fjk.X7JkOh ނAA紌!!&%>'r'lUD}Mj=u6-1*$|A~y pe/\?cF}k(x)S[EF2"bZSUohvd.| fڌTD[y)%0 kM*lH9;ٕtJq0uzu",{2GF{3qPE5v>%Ô^e|ܻ I]G#Mq M1<dBOTxTHH)>p3`T%)  (‣JZO0~IS=&޳f_;wpV=NAZ^p ԭ|"^;͕4yr"GXՓJR'u3]),q [+t*ob,$)Kҭ–e1䆎C+F/nLCPhԸ%v] Ll=]awNzCp RF}{;-=f[üԦJ"˺tCBH&P :!0NsTLm 9i0jbkI5i.v yTEI.8Iz[XɕEaGϽy/3f'HbVy׏WUl <|w,v?*V"Ăȹ&#2w҄1tA'x: EjȣFU396 y@l$ڎ&LKfj+kb^HjTrϯ6nDUX<mJ z@ ~Q0"<{GL͡n|BJk_- liw?b"JNΫڜߖP\ooI$f FO*F芝J$ﮱZ)9pi;p.9M6]Z^ߗj΍#pLdJ8fHR93UP J\),=격wzE+HIJwtoCM[?x% 6z ñI$lLRȾ_źA[92|oYܯϯ`su4p0,QUSo E^ԣၹko*SO@2s9"2KYȲG=զ_*.$w+rMFC|qm{dF3u!pbqOg5^Ipٙ%RKz:4y.DM45< 2\68/=wѫꔇ5fE =,%yWQ!}AÒ lC.˝LPNfJuN@/JY ʢCH,= [BvVw֜!֮ZTk (z @TtDtHIŁ^slH|НGbo+z^ܵb QWÆ|1K)A Ǭs䰠O:r0U*sD &h"q:.Qxb1'&;ׇ(UK4͟'Nz)2N_%Zw,@ohuē,K^*: kaQ )ݠ0@jOrWeC/5^|հx91-]|<;[&Gz^ǿgyG_ RvρEṉF9WTǀCC}?l}RF ȏBO;8/$;cT~({{E"ـ|95ⷒ2v.5̻˰3a@!ZU7R#, k(d灣ȻSfhk̿|,|LΔL}px$Wל6w%'eI8Xqs&lP;)EVCnBQlXCm4p_E8\;agW̸aHo7%;avHyǓ/cz>.T1mqB=PX t +9fcgpy ym M-ێr?q13[!'8љZN*8bem˺ -|&["̓9(JC-SJ:ܼŽ5t=̗;cw4 ?!qV."g z8g8A.[Uϲ ]۸71k\ |rbc1,?O풇@WR>í_:%F*pKwun`A;S3 wB')_tЈ\,RF;Fju ׊ԍyl#!{e!`57n)I,A;R1xS%]ktvX{\H )08ݨWoZƑX;|DF΃zʝڟ@V.67ypTGGBҀ{6Vl*^Mr ֩&N r kl%%bQs~[oGȠ7}4RR&A45zsӚrq~,uwgLE(] > }us/A`& ,ˬ:.ny5\8CW1#p0Z&!eθ͆ȥΘ4J.ž2_F'dsrؖxc`.hҷ7r&K6iHe4h{KqطW8Tz+9p>N6#u7t '$ #1r-Iqrlܱ-"%l>]]qXi٦Asۈ ?!ߛ!9(бZ!͸4@Z`xcSx;6Ɵop>R|Xi<2iao5~UfI|.~[ \z"2НgfL{pp$2yNaK3N~/m!;saZv'i1iw5I|bQ9"qmv:h G]:J`<+_b"`~$HMF;%w+'G#ךŊ%pfl/IY7XWZHN_^ 0`gĿXr._5˙14*nŅw{ Dw L~#=*Y,:9 EiiƎZHcwm*)˖,SQ}iny!LA LںHna k ⍓&Z& Όep~Qlp}9NpTqTT\xnOFaEqN\ ؋{hM&\$-hz#4aŏ9%˞<8@yNWN\ >)I7 vK4? $ud:yǗ$Wx4ӹ{1Z}(/Wݭa-B 'rxD1"]#߱Wk1`~r^#r~8k+_!kEX2h "?8jZOמ2.oK6PȿіqV4tʼ%DU 0h7J;F0:'+״ъ߷=+rҦ݅tp@DMhQݒ6IE߹g뽤A" I2BEfIlv%Ԗmal$ ፳a?uǛuƎg+]-SU.jhߝs[B~p;l>t֗bp=h2&6xρm?w'*B,Aܙ_#H>ƧݮDB Zd_RN,z/ym"u@(S}ohRt`}:4SNU=<ޓ,'};cU g _ eH5yE|;T%h+:gIcj툤p,WK_FOrS:ha]˞K rD_b) ƀIVBvGQ}3%hlh,SAKXU&.m'KsBcrL-Y}m>:&LJmn>:ǭT _mTu;$;5* X+6֣6]v:,B0YmWo=uPd6&1YKx-APZ@gɫJg:'g~3?+yL׉Gb2M7k`5=WM7MmtpieEW;LLi6}uwSI9w@BWߤS9;"^3#+8or2Q>|֒AdbEրVRb@\7r̜#c:γ^4[JCWZ+'3~٧ߝYɐ,>Njwyڟp&oCq4>l1(BJ ) j8̥)j0pNj?{8prXw 7sNx`T%-a'_l'Aם5!iI9ĩE*FBS~isww85u<x 8H+..o&n/f5F Rf\9Ϊ%W̃HzI4g?섐5 a&E樘 CM/\UXO bݧRz[#$7WLŏ|aZ3ȘJA/]@(ضBo~;|N)>( L ^9!oc?]>Lb7QʚPgNİ;L*"z%10iN5msMT0X$D6_5œ.5Z^ Z ` "]qS)nPn uMɓ9sdaٙ3}B`V|:DiqyXq-Y^9TG>x$e nj㎺:Dt%0Z`b=úf7lWvzr* ݮ;-S!COEV|TO\,;eϲN`4}J"*8N/5'l桨IԼIFwUՑ0!I,6+3uB5AݩnH;osUҺ?XƬ_(=Y9x _~DC#>1ᙜKX7SC[ڋIkDW h9IgWHq"}' DՂUh0u^7"(n"[2EOqx2flgPtlWd%~[>k{18opU(GϼTf" }3\><%ٯgɌTɆP`.#.WW qdNZi,]Y3^˜lv7e&ODE;ƛO`u`iԲ:die.<(Y.D]@O^*Z[ -ԪCSLSyzdg l FB-Ig0PO׺Ux⑬HhE8fjjnD?a>pqCַqȔ]ȁ EG?Ksϐ곻0)u]MacQ7i|f%RN& I(<Ũay?G-.C| {֧7wcڲ;TuNЄஅ |YС?)=3h_-ӉTFdDɵ Jc:EKc+҈ iQ7[bS94-|| m.H-UU{=?iw^i5ºaWcC-KHyOSrx`"b$D5D'u$O X<+yٴXS[Q"6(ޢ%Q;ZI30]5x 0=c7_vL=9u4S*Qi2~lN!h&1rr][Z^zGBhxL'"Z _.- @/<,nb(訰utiNqE}YQ'qR)̴p @K|c"m4FlM |ueVQ >ȴM E4,[=IC[wPC3פJ#v62vw6}Mab䠖WZ΋#jD<Ėo4I-ޕ]I! rL=!:kHy7yA tnlfx"P%/t\|0b kk/vxF71)Y^yM݆E=UN{p4p.S)$jz5:|]Z\zT|(TvFv ǞfG,纉 #]. %Ҫvyi S|cìKJ;:MgK/gKDhmH $r 8o7,$rJVQW yHa&S+lЋfA$s-S%`xyWhvip9R0**MfɌn,͜D ~RxC<s`KS?RB§it; /l%#!ڸ{]`?,?'W.lC¥߉i& %ryw˯]n˦ëwpKI*ɀF/%(n{% r0`EdH}CE K-ZFCmJjMݯr }ʼn {/??8;Seq4^7A0}r9#}U)uqù٫qxu0/C wҟGSV/K|uη֤!mk/AUB'i=3Q0Ѱ؏p~ ,j˙t3p&[3βܜ {qF40'W})-nVT]X|17VR}q>v%3؟'>2n"ŷr❿.ʎehj!idN gaZӒw,g:0S?HA|puxV &2\ }Vfh֡(A`5f.woPzŨmK ݢg0Uuax\QWxPVvx´~b !kY,>sT0O۝?CU@բU B YF E%z )zD]%4@s^S@msȾ?XAr^-9 )Wl} rLQŒx/ok)i:tQ648E<~ɫ2Y5Τe).VX}}39Z!f(pՓT`ͦxەnZЦv΁ÁpjVd9*7r0@ H XܣBD'xPr UrKeu8v-8iX'2O==.[R=J+ ~{WyٶmjlkDL#<"^\cF# #PZ^wb=3? 9ʗ'?2&f=T$A/wUHr ZI<,X7Te IKOE+p jq%yI ֔$9QFnYK|WåpQJqz\Gޞ͉kryhZLX $zpv4{Ҷ0@CmD0mko&W#ڜ"h |}W#E)}W$LOnP_vlP;=; v^V.C|ryAmC4-&mt] BqK>1.g  EO|D.=* -S?7'#^Rg0`PR,`@  ڷztj;ʻY6A[ %+"*y+ͫi^oTY޽^W;vÒ n"X*Xn+f ޝ-$ N5CKÛz6 3^!DOZ{<9v:xb$mat=sj%s*\ċ2/~*eG1OS is*YZQq%4|u)ĚP.%5eJw AȤ]2!~UU;.L\_U\+YtT-dKdz]\ɖ/=Rl]Nf %؉ ́-k ɫcXX63ٕDǁ'Ew އk 7.BWJ !0IS>j`82Wmx}f]FW%wKa6}J:^W +ӼSΜ]tnk8Kh)µ4; gx$JxB؂k?ovKsE/K!׊lm%fWh8ri[ nVEPvS@n[F 35$&{KT!L뾊N (CuJ9:ڹq O.*g? 9P^z{]AlG!GcEQzʂ7i.L>9 9kגcP;c5ڿ_?}#b|P)vFV9J 琍!έ|'#&~.%'bZoI;qzVhqe{A]])3M9|^.89]sQZX@[rhCs8x-v lrعhxj nM.03-JPM82/(*'Nw[!@a٬k/cyY¥Ờ2g,**j PgY>PǴJbLt)7!8{C[us` MAAHr<Й[}Yb^a~LDJ0@nܑPե蒁YB0t .3i9 xWZcNL_{$aKR_ګɣyel)Z{z^^%q8iEGr1fC[9|ayKh,3%Iu/PE=4* 'aaw- r5M|t}Q=Go;NWa'.B6'[=L9&)^mUձ^! ̶iMA`re[ P"{oýƘt-Af'Sg]MiM@E{//~WfqHnsj޹{Y(:a:92~OuξQW֊O4|(妾vPʈdG n|d&3u}`Ǯa_,m*돍Z@]J>Iwp3E BN2ؚ̖Psx& EC$)mÇZGBy36)%L(|}MDRIskx gRb*R+['8913dblYx ( )ȿTqGh=WIF2Y}{WCs _qEFW͟{xOv**G)vYV=}4aD1GP R-hpF?S :WGYwץq7wf>\{4֎0*L5IJ)BXEƧ7xݮ^ymp[;o2(g r~~Ԛ%F6b;J)4,j8WIcx]#V`I akWre|h]Sѵv[ӧ[:y| ɏc%̯oNGv햯:ђX5,kx_,khm$gχ__kr;$.|kX0!QE ( ճ%-KA +}arPD[ޭG$3 )q=kiW͜Zg 5}F|#RGIF@c&pDY+R֚:Ut[->^ rtVVt-Ѯsh`7"Y^<{{-}^G>Eq+Odm-]+6tf+R]Wn"GE|h> a7Kg&/}=BOX;'/ZE088 CQVV`_3K΢G݌޼">O]' ;*Lnڎت] 7Ñp#͸ygkl{@OKuo}(s{rJ''2o4xvn *9n8d7vOii~yIt-'siKNj(Ã#?ۜf4zJ&(O{f<ժ{K`/8YJims->h>n,t+n4y=N[G|^ n6#nS[*J=Y$S3wuKۜ?qM2&i̡[URb&G8[0j1Zl%kzxs hoG0.z2Ʋ[ & oXŗj!x0[GTd|vwRyqn0ɈF ,ex^ (gXWZʺY e~(j4vra^YݫJQs-sBz7 {gYs8Nm}ȾNK;mnc.K0d.w-И8j$xCAs)+]3 z͠jtz|~ņgChK銗jwCl׺7N%'x'd,ΆYEb inBϢi~HVg:;0 +q;Ԡ A繗 .+Wz~ Qs}dRW7v]K`EgI>])MGys;7EՎ}Pؤ)s~q^މ7Sㆍ 6~o]WmZ N07V TG`cр5A,S/a&XE߄moVkva?yV :[_a֡ykOQm6rsrH[߀᱀:?Ru2#{mЎG u_sGй_:8kzrѤƾO{ sȻqI:ǍܛѤ+}ފV~C62U Y:M|T7oIF|59&^s?Oqc|C; pI[f7Bi߇*w*G |;SoXk++?Cg`&Øc)0U%&Z)?M%b A!ۙk|=dY~3g~c:/xۏ~&`?5xOѰ>Wք {`ԕ'yg#3z^?E /nKNe-my=5~Ch`N HyCJ%蛿rN?a?8]28K߶Zmgn6hz,_IU: cLkrqqM뚅qB\c5 Ht٤Õp̄}Wu3ylbU)1P@3p|mpJ[| {E •ӽX0T7ϿwLi#XmCUM.r"m7*_-|sy,zf&zCn"Уt{4[jT]?lDW[H{9 ;z Srʮ|X@nЧoDN'T_fC^ rOy6)>-OU$>wn筢d" zXk$W֏9 8I/ķaKSۢyǏ~uv=@oÚ.u[`  Ac I|{XX ˽rlIj%va#%>fUr Dɹ!SP}6z?cBԠ%g~o`1I]oC[X!o1^ uf#ΆfTd@r-{y-\_-FfkQA0=6 %rkbVdW~3#2;CuO~Z?` ާ]xۛ؆h/S8*wQi>$}?G>[svЊ2+I˷ ʌ"ڎʬ7~*]?vBz='MKgC-jB%n=V8!?F΂vIrzw2D87ۤ,^ku$lLzk>_inyMUhZ޶i4qżg|ϊe^aHAGk_mf>bR4-JiI5MJ^b>?&7 { -}e ̿'9}#oWoLe kTeDYN~DTAc=RÑH٫lBei!Dg(wL+{䵪X;o-JZþJ,zߣq.}~=_gt7AKr^:tZ ȡM]l:>Bq_JʿU}7 Ɇ53?-OO6QM"4gHq6>hTZ^kp5Axp21c1D7B6O/E57mY{zU? !7 JT`9].w'GRDp@F7DgJ]#*G+>-BRTtkD6e#}v#) wxigqv}^߳=F ;֟Y=>wny((!I'+t'p.epMw*Qs dx>z=y= m9?˧v!Wi@og8Gfԗvտ Ω/o-ƽSa)=-IK[}Р46um)Š|TD\Yeq8hmJO>ɃCq5lw9ka\?nOP<|na%)eC([AOYUtbYylo(ԽR,{>0𢲆i^@1 *P|!8,"98(ϖS%@F>㚳VhRnvxچCL 9,|Ao~HURB ~r x9<hެsqP|xꮧ`IucC8 f᝝#f,֩;.-KP6)S?$~䐦54Nǯ2dV.H8df'w: vxCϡv/vK_qd~8Nfx? dޟtP$ԿܧxLtuFs?ROc_k%e$Hè 9z9}/6-ݚ~w*rozP2ۿsjPlLhP{[toDe~swKvYRL(?*?ۥ>KW]57`A%9j@}x $sVFj_EXM}e|T4*,W[2rǾl'/Y|< 6$IPM/˹lU=@a0Jگ_q1T0v~ ?P' epoA!,6XuOj(}&zVߝܫ?7stYU Op~lo Y6?R|Z:)`zZ/ҏy߶}ﲞK߉΃VЬ IA '?7kN ': >_盀 h!БSTw\6syp2N\s0>O|>6[ՙvu ))R;\T2Hw&U|V78JEZo3q}[#†LY6C]a/¼M~WBkLJtUypAGл=2޸7{ȏ謿M(|u:mo5׌}lþ\?xO E[9 ٘3o#wf_:Z=}Bn']}{_˹ρOW }ĿnzirԼ^%^3΀4}^5nv`Fs{)QZ8N/ғs]J\}K"6id ܟuI%ZlO=O[޺/[va")]ȹh[Ю,1-zMiqt{Y*CZ%nqsU%p>:_,$obLz 2x?Ubtw#7^]:ևe{ҾK5uLCbA򖺢O>_V0P!uODMxWI k܌,q#мa8QrGo}᳍P%G V5w&׮ݖ_/N@NeiwSR+w XC]pwrO07G^.wCvԛU;&CHǮ%rH|,iJC7j?W=?(VyYm;lߵO4A֮^wϨ4}݈G{̯>:X}ZWK?h{?c["I.8{,7Z-mQ)9=9F.iW1nH4O? ]O#ڽɣB!m>qքoMk.F8_U~>^Pwijϗ?ޝw[Io}]?Nu @8ıX6I9-_PKUh.ƛ)䄍Di*L?j )@SֆamPzi_S :{bS܃5/?!^x9{D19BMgp]w$Ԇ9=}U=fuwb//Bfo6cs[!6 z>3D9?QZh]]W<̱4@ɟ|uD=z۟N.dgԻrz1œ]Nxb&٠ λߕ}L뗵 }^[|X\ϸ~]* d\#بN#L~R>3rkVy.SJ}wKs1Bx5?-턲;&%۬*ߌmEiO^%ǩ.^Gnh5az?~=sifJ-9@o PRm|ɤ`:k!3@_WϤlTߞ !pX#58#㤩7jt"XP܏(|gW#o=ЂeZTΣHS]W98t հ5[_ soMDHvSDWB4L70WI(q?C r*D|v9%JXlEu=t[}K@am?8o0e…}'λu}[vegjw=-{@qz//Rm^Ub% 3lJQVl[usVmnkJlZݗU_G4m6&5uܣw3w>DQ__*s䦶g_aនrR~ʵfЭTz~ԛm6f͖q؆+IQ{cdSԯT6L|#f!9H# BO3IZ[kiZl.8uz(j7+D\[s[J5r&wwQwW5.\QW6T+wJ+.sv6w]Ntlk8_+%&)?O'kG'WWF'HWMvɷrnCDOSϹ>yOs\lֳMlI4,ER^rܪdd㝻3g.&E_O_O}/ozQ_}s;?KzF {mm~-[_6*FkBQ~嶛y: Mmle #1i"hѴ2 [c%@>WUmlqUtүg]5v]{b6-7r.]Ɗ.srnU79w[ -GvvK,nFV[\,ZΒcv776ѴuqѢ5r撜w\؊TC"0/lVͶ9U]ݮ_rVֽZO ~{ſn\_Aɴ"TFLb" #cEmc"%XH4i(+$$J&P(d$Mkz*p߲g)O _4 _aʟ}BڵoQyfɱ[Hh(F5tTō͍bӻ5FsKݦEl\-mȹ.r]gu%\;$d)r[6pl۪.ӧz4Cmomg.*'E,m[[%57*Qt+im#%dS2FdDl[ElZ61E[I+whp9~-[^KjM<ä.*^xϦB#g򣮫!ߪQzf]"WJix̨ֈF ">ﱎ;וb%ExNSԃWhl__Zyu6Z+E{{ꢮnEcFHS j~&J?RE^(en3NꎪsUO:yo{>pNs ^mKtr+rbM\&EjDw.qwnr Wum~.a4گ>0ܜm8ͮw&_=(O٤2+Q>hKI|Gmj(YA""+Ed"lXwvzX_ Yw\Rʻ0vju*{>zBvGe'e&QGeNʮ;"쫚"kbmU =_@"Inu:_w]"a#? WƤȿ5*𵶪7^/\i66<* >bW5WP"حcRwrHvb*殛lj &#!EQ `ܫW9\7;qӱw\86lGTT~UeO{Tj/;'ת>x>|y6[[m1*\uu͋6hdH5yh:Z}@a5m GڟkxKս_#¶y+';Z@>ʭU}~jyRd"XmKbƶ)#j{ {Uz#fkOn]w5w)˹^\VP!5]1/Ufl`1Fa (,MzrkbmQ4)u.,jKs$đQss-QlbUL,us&DlYX&-rˈcd6 VZ]Qaq§2+!bEiz%_kHVvx;Խ wٿM[oPio">mV kDb\rsUsrVN4nkܵtInm45W6ەq%DI4E4Er,mX .r븹\ۦ.mMR,KПytmgs<]זko:ڷy/Jkܣ65`ݱm;QsDcr'7.ZٙcgJNsb@w}2R]=6<~A*ث6e[m\q..8q88wJZ1۳T2w ?]{xs·66li4WQlQruӡA6-%nTdW,nE1E+-خbf+\4guq9˻r˧ī[Tyd%z:SzuOP]}=Umu<%U; 0zKv2=^r]tb^/l+1=tt;u^yw֯5Vb#5ZƳ6Ѳ)1j,kbA2b HI&FH|mW66wq 1R'?C*wœOh&L>t=:OE^Ԝjmnl#V7~>xk~e:I͖ki;檪V^n[[nTjH\..wfV[lU¾d_pڍk$-!|5\FZH>񾶨:Z;e<<ڋ=>dOQq@9'zN}i5Ԥ9EIF)ms[-bZw"1p3{_/GzCO{*_S8G("mf6+&o) mR(A%Cszʴ-oZ/AU1_U[BG7I]f{I>uj/6ɱV]vxȝ~E% U1S8ٮ>J;r)ti]}ls UWɱƵMd_"wK L1 FfFA9˔X-ءQբ] 5cGrm[[PiBZlEr҈}KU7bS֭yUaQch#rbɍhFQH4bۜhQES9&Urݑ˕ʝ:Mf`1dE=PC%kfۓ:ˬˬ}+'AU*6S'"CȤe>Oma,٧f g_Kml69].F -Z,a"Ȯ\+k.nmw2m1W5rb.uΤ[\g]1nWsf(˻NNt||%ʾCBE _xsʃ">/暽xYIW<)Tu[z:^G`M,攻bnSյ{quZzvk>y${{ Ey+ubfrzzDkT8[l).8n n@%={sd}tPI>'"U'9~9(+"PϤvyk+//JH97ˆح\7#h#n\s.8뻢utMn6\.죽6޶#bKm˪wݮrgpmM(m\:W9u,+vDDwws;W*ikEW?wK+}9!;5x:u=Iuׇ^BO.Zs[8s+N]}uߒUHA2LdQj*ԘZƴmJ"Ĥ%RV6(F1JR Ur[;#"I1fm)Sz#;F,Ze) ml6؍woOF wj;͛l7m%)9yj1^Zm]""KEk*- 9)Ez0lNqmnOB] T'\uK)U h%(U!a4Myֶ\BD(c2QJck_cڥb!<+ˢ(r I&kXi89W4uW-CI0hvH܁"Џ<<֯Up8sSU\縁OŲL*.#adڢkbFNLӻu.Z\i14nj4EEdÇ(J(n6-+ё,jCUr cq*Ѫ㵩ԯDKW=U1CPG><"ކV|6#(+6C6ڙr jZkm5a/#mgm+u`Dv0y\^gnZT@+cJS] s#ыܑUh]=WtGd[%ܨu'5!6mh؍1XJ4&+FأMk\%\ֹ\N6LȒRq:F_.k/m./+z#l!SW8jPzp;tȢ"O74Fֶ&MJn2G!:7MBxT78 1\D!89:\.D MZll*]|z9UL쯆WQAy-mWmoaV6-P-ʷLm5sW50\ s#5jͪ;Cԥ|#sb'aZ*u_)0ڳHبgVf52ۜmǸ&yA'E}\?}jmZuݧw&m&&pllNb!zyݟ"onp&|t:d}u\C86QFЛ*\i.5+؂x_~'/{:.O}^E;jUEJ?GeWM'rzx9ϋZ'>UuJ¼(xC _/tKVylIsSLc0l\nѫ[!C&1ݢc[kWZVfC/O!_oe!W*;d.z2/UNڃfF{B KS &)RzԿ'Sjޏ$h4Z* MbQ$$65a3)--~Oy-V Ez'-R唺Juu#+l/ex٫e ̢j\,Qj4.qQ}*d#Qx^=G.filp5 S%[ͪWՉ%!a_ EbxF 4T}ܬ]pKC®Z!hb?"%#jsdwhN]87]ˎ8[kl2+а']:(c頝N>r?U@6Rm:-ddL6D4XuUO'WT9T9vIw*ww wvQ{Ľ?U+"cirO?Z?<|FF[bF,mIcb(v]t 4sQ[\\κ\ tj-Q+Xرm͹mmvdV3 CR! {8T/uF>o`2"c`oޫ[j^mE#Q hU*E&ŲRlm4hQ(C2mb6lUh,,]k_ oEQ*d*p_F۸ciqcp`̤˄y.@^z"=?#_ +B4.*dK\+rW-nZ-m#J-qқW];N-]]trj$Ѹw&٨_U|4DIDQXе:ռ %*N66>PP9V=dei^5LV9kL[|VfWj/T>P|l0~*U?Ghdة^~UZ'$*͠q2OKd[5m_hO)TFw £hp[4Z:V+𞢫afظfjkz:J× ǎ#k1Es]]o Txr9\&4ܩ&$RRXEC5KޅBrA_~M=h%yvVUכꍵPr\Qbswwusw;ˡ#fӧpuc6kWɵ{MY_J\IN"2﹵p56ky+^K|rGDV:S+'؅Eݜj<W,=\SYW-xO6[bm6mʃ'Z[ל{}O532a4lmʝLlln˗IJj+Ap ђS6fd\ۘ56\\[QZ0R.GLھ꠼%)e'zR*ClF ]jOxѺI5s7]ܹhܺw\컝ۻ%͏(dOmmmv͛]>TNT:W_\s}jǏ(;:ļr{H+W@:oS.SۏQm5١W_̶S^ks3n6V+%&]rQ':CF)ݢwú4.\sr֮EQTX5 KF.I%Ŷmke!IjmظٳmD/4J$)u:QW.(x666a[m8;}'! 5a,IdBFns]j.Dh،13mڷ7wIh3nd1F4TW6F7U_KUֵyd*lxrR9:._QQ8Ŋ堥㶱ݪΒvrU]5s:b\ewUUS[|h`5V-li"ɍF$ʥn?m"6Kb5D5mҏKj~=i'EcD8.5pj_*@7a-㾪̮zpl֫Pim/ٵO} ES̅{OeJwUy!^Or/amW]YFb1\\lA/]v=[64ͧ*/]w^FL}_(QXc`h"z7Ӎ.EPLO# lOJ^+[6[m{yѹtú¬V-]@t]LlL5\1j \sksE2Wuɢ clXƹsNn5wۻDk뜒`"tD۷:Py'h˄?((ԯȢ)II'qq?Nnfkk6 EX%#&M65PQRI$b^!(־ֿ>lj6 8qŵ^$Gkv5ƆlOU.~NS{-(KA%Zѩ11!&6^]6ܪӝur4W1Q5tеi'ٙS's2mm|_VX4icjR&Dhuév|03/1`#Q6*f#1Rbv2@tɱ6[FF$Q36lb4bōKI0fbE"BCHFنXXJ {TkeWKxZ i652n]x=/Uޣt.ieÛn]r* [c+\䔻5s+[W(#$h("-#nPm;Ʊlmۙ6!-͵ǂx!w{=OzwF3OjU.+܇^Xq59xU^lF!H%Ԥ/[joj}e =bpaz y~cmMbr\];㺚HH$2L,\"$"\;*歰մB(h2Is !ˉw;wvW&I4)GWm?ȄUtW\'Mm9KvaeDL(-M ] Qii5L 6kv UmNtm_SGmm#XդzTll65@S`tǂr/Eͭf oB*= 8[mDZP__*m[6 ?7f56j6d[6*}[jS_=w95Mw1F_o-l$kZ6pʗ ;=]Ԯ.Wp;vˏaqN-PoooEh( cX,m*,c6\,mEQCsE!uݱ6Fܣc]guB`4hi.W.\N5s\DQw9t븜wvdP_I5go5aDPmUyjh_)2/6fm,><(;̶6+wu}ճa-x[KI6C%tKd<2/JIۤC`FklIdDѓi5XcIFjM-lXmmKGÊ>G}]FUחkIG uӧUv׏_$nځmRڮm.;y 5i[խy%%&B*TוQicQk6dn9CGc^uAרvIh#lm̊ 2Hŵokmm:mL53 Gxi{ mҴm%vų.t#ssEs 2s9.\Cuܝv듍q4hdģ_-[fWhNҗdl:nl:^d]G]uӥ=`xG.1\jli ׫cjI[E-Smj f&Ka8یԢMz<(S)=x}8دxKT㵆ʽ|p{4Q'ȥهkflQ.uMs:mul[9j5tȍbڝb?A{m^ҭڕ ໍ,A ||_Ə#m[OiIN=o"J4[F#cLQ 0k-rbA[rllb$\nv cJF1Ӆ1Rr"3OP](O wu۝t踧ww!Udw5Z%m2q|~*y~SkˆFܫsnYwvwt4rr5\ҹm[]-X˗0;5\nUōdXSqݮ]ݵwm.i!wu͌kw7-;rw.; K =oZv'rKj=4q mEړb*ՍhcEX [fQJ_Fi)K;Iepٷn w߶mm^!)"P"%iqљ'\t:zqv'9AR텭486l>f\,xuU}¯?-jll7/p;CÏkj6AE% 4,D)j޵2q.O&ʴր1/yW,:wmhGqxG?h؄j1*"$c(mۋkA>6 ?##jimlvrT|"," ھVv^KG[a]&k6*4ʈ[owJTmqٴlbbLyl: ‚ڗ]DWNނ?LSϛly76m[-͢jB&h$];e% nA(_W==izK֧Tm:ȩ^]Uo/6M2JӣskZԣkG;t[sk)]w]7.u1zk/U_/mQ[3mn-fDx* '>bAZzm}8|:>!VmfV]nZjjk|jlw ǩuu;N;oUP{N6٩HM?խƪm'gpݒ]}<9{8=|ߕع$"mͻߊxV4tra\ H(Rii;5>&N1[)'/VͦU7^ڜΑj6gڿ)yikI)&"iDգ" DLA4h+ld|qF4Vm&wWMwnwSX,MU(1t7w hЋTllnr;V2Db!k7^=$O.mbK]Y>g:amqdI0Vyumy|۹svvbItw;.qnۓq(fs94h6cQى-cZ$WvEn5ź\nkbBnk1Dsb2X5r3VBM ͓~JxW;$خ3lbUc6͊Fƣ[FU[UcU%'̡ͦdC=IZ,c"߷߉%(ܣwo \ׅ΍l) O)_f3mzP*4SlmJCafoTWZѵRhűXэKQF1F5C 4UwuN.hXZRQc':g:=/Rz:< 2*/d vT`m%ElmbHhb2Y-Z$fR-#@&j ՖҞ{|0>TPPPTUU *PPJAUR*TUU*QB)$$*TPRUEU@UJ% J$ *$UQ$UPPEHEѡTB@A%$ PI)60lHkf!",Q$4-!l) MA2d4ٶm*lamf-hRF@f dZ[,KB Ee"%ГmlMd)C$PX4(PK*ųhR* ̒Ѷ6$- XVBmb*ʴ4أ*Z4iZЁAm:0LLL 14i @0`F &Lɦ h4OET hd# d4hИ4 &FM444hL2zhd dɣT SL2{Jz4& 3CQ~5O OFzA=MO() DG&A'ꇨyOSF4 =RSFi?S=bSz(ީ2z2h#*?PifzAhi= ih @M=A?TR 5==i6Hm&i ?!CMI잦HmMLi?OQ*D]3[ 6"kiؤd lJ=W~ěN8~"%tsWK#f̛Hjr/T?P?#鴧f9cпu/SA|-l_Oߔ ~&UEI之f~$% /h}?VߌONg-=>߯-/.d+e_ZٝjLQEEo'vBox4x4[nEcIQh/ VFtj8uw6Bo$5?IEͺ}}g=)~t;gQt7m㋍rv%'i>)>$f=hǎ֯1#m)@6 , Oտ+]/=B{DG|Sq7WwG!Ѫ\3mY:V˅EbF21\9Nٽ ;n=ՕwS}u'+2xS8m9h r>w,3՝{UUҵݵt5\ 1bϽ[hmlTZSqvq쐿:=G.q**L5pwq˻tMmfW+OUJ}:3]-uQO"/ھc:mmv#evQȥ׈i1^x;QHϥ{%ffo*v}yw7'n#6x|@9ٿ{O}qzf3n6-bln8?nyG3|_9RhDdĠ w]mg=.sug<]}{;|}g 94q[Ql幈آMj-b7]wrwaۻn=/jٛz1]kڟG'W/Vtު>r0豍N; U5TǶk[}N]_Н-9ũkl6o[^InhʮmvtiFE.F)<}i5A77BL\m\2QZ1m;w9m ڮLkGƈwvwz{o/j*zRZ>{Mk-Q<};Y/Gű6kv5wvډbDj5lwutXhɉ\vp4~ Ggʼ+ G՛!-ámK/@7qmqۜ|*x%%וUj3lVv9Gfm}*((オ];B wuӻvu7u~"KJbH_mm9ЪU{6bub'4]ݧ:D.8zMRd…:#gRɲw_ߤ/U bbcoc܄ ZK1wqܶK㋻n9뻮䙻LG%'Ӣaqq):j:x IuT^i=j)zuu%֗Z:;m=Slwj"嫕˱Y?"Yy]yιj=o|)ʶ4Q"MF!cziVT7wuxa}Q&gىuU+qhmE!$I6_OzlڭokoR,>7%kO'\+WlWno_Gyg9럛qNK]buꎩuQuQQ{?yRmh-Qbi#F*5::2wnuY^k{ hKhܣntQh{gsL]9sm򪯋㰡חmq34+> IЧٛ}ԶhqDߎ{m^6e;W.ksT[qn23u9}|$+o^ ]\utֶwW|/T"%hccZ" )m6 ш\mzR;]_.Ez=w%܏@gs]w/e[GnJ坣E$$jnssMu]ݷ&6\݋U#DdcI-cm8NFON]\*+͵ٚJrrt:0됿_.ӨT O=27_kqѥ='¼Gm6Jٲhlwv߻Ok%=>qC%U}ƩƂ.7SlhR]/JѼT33g /=]/pM'hf>>&ֳ[^;CS_zG!9]#qXFnWsvnIۓ]X!_־N;Uzz$B9ͪj٘q8**0uǴx+{%yjss;ٌ]ۛsq\g~ّl,6)O_|l|,Ƞjl[oUꇋVk=ٿԤzX{fJ{QM)gҽGT"ɵlShzZכ$tww}w'eʾ_:8-T7Gf6W9|I:cOJsOHz=)܏|te/moږ ޤԧDe5"7h1]UP{4ۚtkz+ӠO [-qU}iֻw.]ylMak;CVmyN;)щ^Xz-nFz,ks*9g,NtwM;]UGɫ-OG҉]EW+Ɗ|m]:^Bv—Ҩ}D:ֳJ:t|6 &66ki_sR=.M/>FnNErKWGG[&,c |e||km9R̻9vTGd;v%R1Ugc;Eػ;&m#3S]>>Eh̳W!oxݖ:խz^ۢx4R.[\\5jP8f[mT}s4Qc#U;uVgy[H)3I";_Vʵ9xLkj$W[½=JevVճVofkuWQ:WOy-+z&kli) 9p&*665cQPliK˻gvb.FncZW{rv{β|5u;GڶyX!6Wr/R[.<;w;W"9R_uv.oi[clţmhTR#Q3]vn]Λw56<>m̼R IIuVfnII\64q3rOE'H3ff'ӃW`nWJz%2I mcnS56( m#/7usv.s湷ێ8^W`=Euӝf:Uw< IU,s>^hlz2U9kej6$Z mhRh]7dr뻓ߍ)f mHll~rp-6 m ^8Mqo9K'Wt[mm⪼ֈݴlep7;Ah?|swg@[MV֗CTez>N>O+x :>OwzoG!%}w7q؃pI}z_\?t>O%:yEfG9 8>w<>B~?۳.@Wui[܈- F;xU$ᅲ(YnZH Z$t=?|<(Db-[F jҾ˞zWW?UͶ/9گyY]5ǥî^Ept}:mrqWN9z.:L?g3>NM9pc'Db;]1|1&CS2b.O![؉ _֋e:@ވ}ݟjTqE8MC8!y }8&)S4'#(ۚ艢Lg1rY&Oe']"YW.LRjĵd2Y?,e4;ʺI`h+&]!! +1S~U: #*-,*7UfIS)#!3!,\0KLql' uK7qhg!WP6v.Q ͸J0Čz}mfց [=tG›q48zϣ n/og =R(TF~ ^zHN~)!m ~wȠxH@ Nb j-3 fSNG[4I`']IJ:Db(M-PG&0AȊHCV-h)Z0}NkuX/_ g%;zZ[^Vە|NV "`)%dB .\R;ئB$q C0y JbX΀D}|xZ/د>F(ECI  nzy|@wcd" !"p}`Dp0A (>/ hD=BxJEJ@BAc9's~ǁw $G'7#[.:]oeDP@a#$^x5>ߦ5P$5SQ~'tD>#Đ@t A >ĿIch@>LNED$0[*{d߄Dn9pNr VCZ7Pr5]/F_ gT~M69pc1XF0Ae|c/1pFǂwG*٢"dro!Dr2 #?H3H? -B"!foS_("soFAB|s3AJS-dǼ*j;8;7ZO߇A_|D9 b{l".y- g&xiDr 8 ~oT09m& 3E}]m[ۖzG@Y΃"<[9G拦#Dtfc!S RbTrR*2w4GP6wJw[:+4h mȀ!1"q\@`G8 ?aA˖Oq~E5f`mi]nV>F?PNY\ҏ\c/j PdWu,- tU`V\9¿v:%m*?BopǓDOkZWW0~}HBXitaq Q;I&e^ #63HZe|YXu y\$ sJٖ8%sY{ʼnMdAw!ZxY Vߪ7Ag M~R:`"FDEdXhFD?Sq *Qx;RQ|j M^Ir0N,BQqj.|QrE 4qFJ$fٳMnQ(*4)<@3e6r>gw6{u5*9ݭYڼL&xVcPHM ?Jѽ+VcFC?F3dcc O vNc!vH2Iup\ zKyE~>{I+ ZL/ZXV1 1i ->+]f%W$(Yp%qVjyo0 LRȤ#&kn>G oΧ<]| wQX)-YlVoަ'tiP͂ECLq2,B6k3~͛w14Ql2$%GRN纀.8X;s( jGb2EIuɝ\U{m.XΔ"B| ;ѮNϏQkDʊr0q 8vl635۰t|jL7篞tqg)MElYZ @ڤ KTx LLA(b!`-P'q ~%dK';% S@ZѪ"*AnU]K4sD܂F:,LmV\QiF6ج[tN[}dK]K }.CIOKߏ{`ޏZYzBQᓊC)$U0јyR}Ko!dWUȹsZT i #uo^mZm>WiɌGH.\`n WuZcI4MҦ ;NU@!'6@.  qpBE]Wj''rfRQ84`;!hp$:[}=&e }4}tX^߇}{6Ij$E1,|'@&\m0S8t_tTI5"ٹݯX1ț 5'bNԁ)b`3<-V-; ۚla_h~|nj #0e꒨/%%TRDK798 f`T Zuf_9qmj^Lj1#D)hś}:$*w{yN[I$#P YE2R3ʯ )%5xr> Є1pNڠlOw_^tU߳!t]chԡ(-:naM ͨ@9yš8q\'7E"rPΚV>&QB8{x*w0ȸ|$2" ,F,7`_-?6{RFy%^ L v;j>j[bAb4I@ĕI)ţAZ$+@\qCZ3}I~ LIʱ Ct!@ɱ% gx%ƱW(ε-tƢ(]ڒ{BgDo WyGD7Nm$G Z BԦUFoyVY۷1:*(BЬ 0AmvaІCQk #9 1&nhT!H zl)_iS5xٷNFe ,0ȵ@`9p.Qj^K_ %Pj,PP|ZhR>O TiLve'i1gy^ԾgCƨkwt|{5񎀽U1muRPU•;)@3}d(D*̊pl#~]<ݩgh'N"6z:Jh=mkDYR͛Ȗo `@ 8E>]tS&JS(= cӟ+RA oamf:[uDdlY7y-8O]Q@gghpR3;k0@"! 8 b q$B!5Ԯ> v"8-?7[q8Yp3̬jcLu9Çnz̸H&%vLp)`O $>+iRyvZnsy|3dww7L]㳰vS}T <4:/`JLJ8'3 RvZyE7]D$*ϰ, :#&h4؇ֿS0IW̽Zgn"鄸ytWu԰ {TӷR$P% JVs|]}B]6_47fce+ <ư-JưU%__D8op@M9eѽqJht[zcn*&yq#3/;;a| |Jq)?GRZ旰+gwN ^KNPa~|q@ٍV;9鰕VarRN[5phŷߣN6h2j[RLo:&Őш>>·g dQ"˔'K&#\qLfދ/dD-In4-ũ&*>`~Mϲ5aB4ڪH #LeyxU~.|uQ+8ө9%#N(ThQjr|>+Cب3UQ:`ߒ*y EYPhGūDEGdߚjD-(9:7IU>0)f `\SD6Lȁ*" #nq{J! O@A\dSvËvKi$2tj"Б.w|v`w ѩGPxfNNč0goPjͧ;z)۬" K%բlR@ 4kŰF1G9m)Ntl ]j(*odB2D*-d+TgVk,tyCDuusPGL;39!qnzljI:uCxALi9 ]~V//|W|YR00NvhJP(F>VU֕BgwLCasS/2ӽ|ޝq |e1+^ԧ]ml%yO_NH' < J1 HacY͸x#$٘/KFv.`EK949h2/6yjȝ 0 <[u\([I@y4}irxe`BH@Z A"Pѿo{z,y]zueSffN7;jDˆ,qc ڡ^ezx,D@! ?" bݠ=@v^0F8g@haUbR@$gTiHKDh@L]oMꆢQ7PcLt`ǨCsh p ":=kY}}࢝n̞fz!jn B vQG$qk;ي )z:l]=Ś_bᚺ$d2v~h݀QE35ܧRFs^F4p}R1/>}GѥJLM] ]5\_x 7r}WQ|Nlz]J"]YXԵ) 曪By@J7*'$S2O4 ;<>EXk[@kk!xN T""8_A\kXlFyKb):F>{4}C_]ʎIJ`}[I]\ TXʍ"+CiK2mhmͲLP@G_Ë́тx#;,w*GU!z(1j&ɰ2M>öS5翹ߛՌ2B}"&JU؅bBlN޶?0Ty6u"c\Q3G 8 R 3#n[!eQ8w+|$n&SȊ*7E< x<#w0X a$P9;-:5$9"蜺ʧ 1" q>#䂞9lF6dc$e"黉A\FUk3EVv=yc 3R'NѕfF2[J(5(Pn#=SVV,ظ%aIE\734"X&z$ɳie>$ dߦt[F'T)Y?a$ G+\as\dmg2?bsI1G1盩b8ICY4+q dƛ2Ljrf^8zVRۓ%{yx$nlMW:rJy^<Dž$ad»OnzmbϷfd 4::tԜ~L5љzq6;;@缹V4JJk)h|LN̻EiU)Pk#5ٵde]R6a͙d,tWPS<`xǫ;(4~_FK 6e% |{L|jm}Is/a|nacQ>kH{Vf4,}=G'(OENcPW?%7̩s_Q쵺uP,4StdyKutQ&]A]I0FkyfP@|2ё$Wu[Pӫ˴3 ~T [Bs/:8fe̮on]8oֿγ9ASVҕ=ƻJMLyez2= \Sr$Jwy *L# m:Ջ8ɖV$674f)k]'L;:R+%9C2@-4;RQ\jU7NtuشSs ^_lh48o${QM$]0p3v)BBGyvFT~ػsj^];=(MjJ'[mIQ=|gĪYP:4TPbIyDS-rsFaL\"A=߽PZ4꺊0Dq)͝N{:u^2.mg|!ol9gK6Pi~Ʋ%ET)2Ū ]=摪f3iɚ{5P\$k'^ æS^vϜjH)CKlWDT˯,uA *%>ed칥!_e[9:{: A!Ee%Mƽ*x{907sa&['_h bmz~v쩏+rS޷^",ٙX+ ޼sqܽ&fțY&tO|jf S XKzh|p\Ap29p 9wxe·eZ0g>9jqZh#R8{n\F#"1/'Y|i՗41 uQhu輶=&pr1*3f˨ t(FGxRtj's PvE_RJl 8JRJU4*iwj#ҚeYMHQ6r^dAiHJtkjl%HNˍv>N|?2fJtvy+B_5W,Xm)K⾔ \9LZ*AO Y'RI~;' /EF;n})rFrh>rIÕZ2> j@3Da7UqZM!zoc4YGwL BG2׬U#AVǬ"fU?BIaA Z:=OL&I&+3%$-~tCїrB΃4̭ %dq_*nɎ|d6!?Mv5_)+$&l W2 &Br0bKcr:yńUh c{Aj}C>;IS# e|vir-wt1FQ]#pI-a. 0/IJ\ʀH3 ;lArr#*0nPM= 'M:3byhRrB@)ҭ{-ºjù]˄uܔ$N:ջ>hb@ǔQQ\3kvh4)VHs#ƱuڠA2$T3D Ug3ヌ߄4hƃpMMꙺ990O?gkg3c~kt:l}3D0(0䉖o4%rRPt a д(--x&]Qگ]hHچ\ L9ɺŐAOY-P3PEy)|HދGM7mD[[u]?ƒ{e:TXBM`C2'J):*={`@Z(^` )@²#Z.*oZ:J=;U[ٱcr)0xk) NQ[PBّvk9l-L1rDCt21Nܸɣ]ܶpPܒ7`p0a?Sh`HX fAp#74/Iu=*ki^[-_Vz#)qHgQhE?0et ENzרx3!D(cj [[/W5cBU5,+lX%ޔ)a'(2RLJߡسf[;(Յ_s$!Ěu'zzCY 1GG .p1^Kt[v5*:\Yb]م>BDn*Z6$)Tԏ?d}Ww THdU E@I@֧2(6\m]Oo&0푻q7<YG>KBce.^&0eK.~z嶭 PFe* \Fӑܒ&O]#.|O5PQ_aĪ/`n%l``hSfP0JY*PР9ScK'1wd(A)4w P_s1f, %n=D*aЦqc-xLzWp`e8'tSmjNc @6ۂ[V ҼM4c玃QpɎ-~F>/j$˛leӰ058 A!U4\ F9rduEw徸 X ("^{rƈ">I'-]ۃv'E 3#SqZ1{+ d^mErѶӓvo^&;ֵQF=2L-ɮbcȆI&L3]3:k0$,#[`O^{ EaV؂g=&'JDŽ$aRME5'U(AN|%$yӴޏr&nMv(($HOgL$i PzY-[Gh x;ٷtDJBfFWu{uYqIHie?秘n&Cq.HIMCA۵'fZ5A^Id f0Jd(W4+$;ΠF1aeAz)wd!n]G&LmYǰ}+P@|3JD21ÂK$'F/ZC:$ 5(a ze2 !̘ MRZc,͒c`†emԐM+>@iFUlo;3$GeF7D˨K&.V3>TW ,8K۽0o뚧jЯlV4Q]i b\G;l2jK#a ~8ĸ=ҘD'*b$q"MxKk=gL xxmQVJz \ Rh+wK qeSҡy7aד6ZC@  Y\u-{Lq@44jP&oCx<6ץ6'ɦK4r%Z ;ZaUO)X r=UT< ! @FyHϡ(Q(!@D  ԐZD HCa;!3"A4>l^uC҈Hr7 18-6kyL/(C @ X4LP?$SkU@yK,@U8iC>lFq3fm2T7[dbtNJ`#&\(bBr]za)8x@֬ aD^"`5sBA9&iUQdC?C#~sӿY@HQ&4 7w8QGkOÂa5;' ggƣgsa4ti6aXdЃȑXP"旾J*vG,z;?N0Еq>_<^TdDZ ;# 'Zj?uj^B9h(0[_-0"XG]_ϭߡw g|f Zg;f sd{p0TcGC3dñ:e`F^H\Gox)ŠIdnءŁVck )Q!5!d>7C'WoD B-nn @ zC3fg Ur~OS W@Fq96.^:vp7NM׺ǚ[3w4RO4΀g(`: JoT3? e>*+ZeV+؈?ll * tur%Dv%}Un@b*azN\~t(sk .MnJMym"!MS 2q2͛BNpYk LrX^^vA;.:JXj7"K'XR?F-_X*眐 ܿ~7ktDŽcT@1`%DZ   tB,"עSrh4zW(($L Qeqt =w9j>W ϙ~S`k?׶T6G\:H rYP |dB(´k*:o@#UKX߹J"ZI#k`yU;==)<¥&cND3 ]meh\5֫){n4}li&?w,ݭљ)PD[r:Й 8m}|Lfց |$8”< 흪kET]tX/bv,n(Ay W F(L8mb܍97{擐r *0|/?.٣!]IS,y0|)iDDMZ0Yy ԡ puOMrCiRMuFsQK 5wǞ!(L";C4ݣ]5hX#SY9[Xg;x}~.}lrv+HXSGҿ|zI2`xBHc`uPr(H LПW~֗D'cE]w|蘏(BD,x|LJAQ?6Ctw/,@;C(_ؾSJSAL=mh]wdD,JoH)g}Ư/ҳJ\a!H] A8{#\vx럋۽e_/#pf((L p7i "ii+GRů~?GNvτJOIdy%Ӄ5uYϷlSE;'C">.i jV/T["u|ߓ&Cp> BξԾo_uNCڊy 3$l$-!9  u8wN5Wj,b^k%6Ȝwc{&-OsBL9 >ωhk}oḿ^0c4=[+VňQ ""^DPF \[g~Ga_W 4,eZW!j+8~A5 ۿԸ@#Ѳmw)|)zGUH@u0D5̄(sj Űx" h4ӀU飇0"kS^Jiw0/ւ.tk1yRkVc5Jדfidlg4W͕)v4Ô";PS=(Vǥd*~˳ݝ-REa5$dX̄0&lޝ*p 8|j %2Kh7Dq "=#ao@idJNBە2;fKƢXSvg6~b7~e/97Di*<C ۉRaϲ)ù;M,ÙǓ/ԻlC6u[FK ;exPjSm]pP!YE9. 0:B%ĭgJA2{2nT#i{4 Ri;ʊ},huG9>f\ϫCG0B<3@milMV,Q*~Ɔp̒N xǤ7+#ɕb{!-Q2%+tua`KU$v3?tW9_ڳC~=Gz`! .frPo~Oc23h䱕JSjn{2`߄$?<}ѫ8ߡ~CV h [yODV. ftLw=K|b['*aP4R]3e*\̥G:i^@)غ:O%>bە]/<ӹmxy kcN%7.% pE$wxGjA-ߠfMp:U9{Y߭ȷ=U !\ v wիljxJf`ŏcM~(8ddH3{bbM{)\Rnh _ho\?P[6Zh}f'Cp];3f}Ņtg m @$xLo1& p4^ 1'{ 1ɀDojil| aQfOGi"1RdQ4ټ㋫!֑r?O/$aFVH ٧_LEGI(1^ܚFkp)v 9z;uӕ=e f)*3u|At{~\<g9~lhu4)SiB#ù:EO HP ()C>T"+[7b-ˋ7,>+o)>u=ލBG+_B)Bv)Iwf;ZKS>ݯs@6O(\b:n G)qJp6j3bƢkIoދ6쌢dMLJ{{WE#y+ Oi =v3Cr][ }~}-|XlvH8TDI\+dKP(:2lKY~G(m`+8)h^?P'[9.>_85#'7iyN]dج}#%~E 0qOz2Wp,{RŎO5|㽔Gw{9pLACg]#5A#m6Ȟ.ڷQ~)J6C]YDjpB6SL}ra k Bjj#Fio #tLF>dy j"BI(2o¢ ;#x3/⅑% 33k"^-HYCE |**z$Z X]b\^ 'ӟ:cL~AV7z5ҳ\#|)L t9JP+{^ \p21a7臓f8DwͿ{hV8}1EsuzB8z;mvʇ{§U$P:d`dlٳRK˭rĀ[[Yw:zcTgQI@\ p"+3TG9i׿k1TQz_0(czGÎڪ ix6c3b.p9vO4K16=Ï'Zem!'dNJN7SC{59ᕗL8%ɺPoU1@{2UߴLO5".L('H^k{ xػO3\GqA{gweHf?Ț g<:7njYH ŬVn>iW_]}zL#,اtlK86b*~ |}7_WOس:ֈEr8}~'@ȅJ;LSXO򟟡bɥB綈m PM\aA>~Mo|Bڏ^v5yztd <3gb*h,=77Br =1r @LV.Cf.{ziΖb5qv:nvWW<,5Eyd0w$/\`Bz8ԗ֊H=1dYB-ψt`+pU/(k.m-,Wa9UO}Uimmj'4q:d*E16{[%6-:\a K'0YDF;+D9&FHL2uNw&ʅʣ^Oϭ~4twikY1XU{q_*'nZAԷ29ҽ4Sm>ٮ ZjHQР` fx&x"t1W5i`hg࢝*41N<|X ֐h t2#!xh+JB:ԣ}4 ʒ!ΥZn&)fYw&@z`/PPd¤ƣ3rLQe *VԆ!NvXe%2ujw.tJ=3,|9^`r[oʨKJQR`RdY%Гn6ӕ_`dB?Abe.<nՃ/*Zċ%l6*,më (*'LVVak5EX't rBmtAIN*D)㸩8s" ;ׅKR`-9 VB?4x1B*_"MšI@=dt6Z%DO RĔ6R >G:gY  *L eppi/Qvc;\'j[8`(; ߓ#CF_ o3s0Z3.oUH .m9HmPJlf"0@XIR/'&ïݪFyO#_.wa @`E@!@* `8 (1ƅ!/LځbasX˷ڣdoټI;\> x&OӵD%|Ruؤ<fDm380)S'{&vna1aDy7Ŏ^T>_lm0pyy7722X zS1dgbO-3-ܯk9EGƥ2xςϳ`Jyܶ_g? jgԩObr mf/PcMϭ³sP>A&"g u \Y,B?}TPYE@Hb5UPCQJTZhq&F%hE SB^$G*xt6wk#pE J}w Cݫ *X6upqgFJ9_\hRK)E-Ήu%?o@RO -Ri0olsY1Ny2~0pZ3"q!5'&PwO'%IGs=2W?wΑuQVJ(P:5gc*U/]ZWjˮ`FƝzv~ +.D;aÐ'.kKN76XDL"tw*2 vixwBDH{j$NFX$jQw+!A^1y65! iez^'kG47;Z\;+5+ؐO!嫅z$/[L}H'9H nafXu&!knW慠Ttlނjw% CLxţQJ2SGN{F.k% ϖIE61 O4w<_&I@]75E~JhD}ZFȱKdR$͖VidF\iE7@갲6$9ROC4W8 RwblJn6ܺ1SZY p8;񹟛3wkWͦlVMKN7/dϿ"FyhO2f-F qtucDN F;6Yc9}W\.UA5Lq< xNXiG)\\KQt{ )"J ^Pfd*M}\7uZK3XyM% a> Q;hP3Z`e LHپIQ.UW7b8FZriէ _UVTatfε98s-(3tx_Z\> ΅KU&"y"o\=Yl.ZSechi~7*v:F~jO .!dIJ0OҭtӽEL+uaAO ] $59+7w |#8Oq8t(Eڭdct`z`kC}]_8<̀"AY b(+HO>>"q_(sȧa'<Ί<5;MBMJϕ 5)<~1i& X@pp)2kh0TH.KSsD{N=«^1̚|Ƀ4` qoWx9C" ial]_lsUt\#*yǵxS]7,o{ : Yx.]mdx;[4Z߅w MC{ ˂Lx IZ3ȖG:M!yD Es}Mt_ѫlu3EEs5 wYJOB;is(mª G1vc1v1~S*lG\aCpg~Hgd:wO3`Q`_{]syU AVȎNxζb0^iI :1aQɁ|j|3v%͏xaVgow#}vh׽ԵAq+(m@u!=jzkqߛ"\ a(vC,eK{eY佐c>1(F׊rA x>|)M65prTݟI& 1RN̈́N̐v0nb*,VZHZ(ǥ'bcd|O5Eb]U{.Q6ez |&V *A>fC8yD0=iYu{LR;ʕy*4F/ayߵ"?WpL ìJzv__h:tmD0{q( M7vc@;="ˑ1ooߝT|z[RAt"b]r$^D,c% Yb.6Zfًw΁($wK)S(XHXUwI10HJ'>~LObıXMyF3aְF?:Ϲ祯 D*Gaπ8#M:hu Q2f3І ֭Cj3^]düc$4ڹ,~{j\QyN:p6g7QQ7g` :9x.~K`D&N~ S'D:'Wi'KY@NuI2/Hzyѐ#b%H@F(Jnzj=R qF:T@r |Б'$`,굿  NR;` Ô H+):ԟfpqnl/Ή%VbtL=&0p/\/ꡐney c^u>l I0Ck 6DKhm$&zBV0Ѓ&t: tSq$N.;hlAJp 4r/USox+cfX+v(6vHx0*0J̪3QUn_?d`{u[q;{z Ӊ6k(TҒB5oVed RZI>M[Q @sԩ tx ڝ=fi5>Xz変0h9$F(a6_8æ* YKGc(cw0W%Q!wPS5فݼV\[]7A pCgy0&%@\  E|~ukx3J–>A;Bou NaF*h,9l9ft (Ԫk 99Wx|@6Ÿb/W( C2Wmmթ7PMhG>6g_N(R`BHz=C]xHq2+ݲpa}߼b@(B[ L:PzюouԴIϾM:ƅ,Y#9 3 IoZ;jȭ?mz=NUXXv?4)IČ{߃uJ]Ҹc׽=Yht %Ϩc Ơ-;Uq/b<܂pa J>Q[rI ~ݑN 1y{{edh$c(\0Ek`hZ2C6ԹG4ELM}γiz8uU1Ż {;ҝ7L,.4mTYV?J$VQg^3gzR'Dō01fRl#׮i8wXxfumgN, !(p<$УW&7>[_!Zۢ[2| W(?)OG !P뾯s$[(]#y" J涞yWNO׬۽R('&HaXE2# Bupf~gq d3W˪ǻ .yX+"==/lLoeuQ ŀR9;Q7$Tڻ,$bXkk[ylEتEJ70|h:VhϪ[lW=|7,Nc5yǥy\62Y~S}#Zm՘X 8 n%pBnԄL׻xգڤ#xGLnAMEJqi&  kc5[ ·&Io R_Oml^?m 8{cu<IQ+[b,of N^ǶI d;`%<^"U2,ƣ"V$.|BHAEs^q3a`yvu> zK$ȋtAmeחYtw,wxSBM!ypIVKk v/+濩Y8^ɻ+k0G,ezg3xJ)M77 _^u7n)%MU0<H>I*2/loG v)li.a#WF> ј>r'ps#6*+q,hm8 PXY]Y1[Z;(Wh2=_MTƚVuUa ƨ"́'[7FbVdf Oikנ{>Eh? u؁[ֶwiil P\˸2l59_8=~ N*=TW71]lN'kO7w Dɗ+G- P'{>Z1EdNGOֆ[&L%n4$aI;&f<Ѐ q]|ZndD=<4ʪrXpī>J Kr6)%%{B"W=÷ʛ|QW7P0܉|G+b:s_D7 DQ^9j(Iv3 C pOtey]B}m@m3Iǥs)Z@V{rG]}xQ#U3J&W!Ų Y=qDֿਢC)#:ÉMa؇/v7'u\#x5/gmWǽyDM{; /K)ҤU[sO̢?%uZ v.]P?<O"3ו͂G+w`֫ϿgQ: YSŇϽڡt͝u>7782͠ aOSgMkf'b_;3bX7^lbF; n2r$BKtc${,%0w'6&Wa^+:ܗ4Q9ǫYGC yRu'%HPL 1{c1TDU?jj.ʣ;Rkw(mK;;.p=O*.;~LrYYIQYeJno~ЇQ'߭JKT~f-DH\p1 ~ISso=k[79ZI˷Ж[ :|.aRg\=s gͽqT䷳cWd?1nh"r2$$%wNjP7vCq}L_=U\}ykOxed53>rZ3$㾃}X>#|Be0r=9K…O*(-Y\O~cw?y?[4Ň߼Lw>R$&hM6~$dqeuZn5!ē3_O,~uc[S *-1Z,n-p'Y-\pg ͷIȿmo.,^oZIp0-1I`|_Z\t,N҇xy%$bjw`ˏu|)[0ѳ!|jL^TFsdp_w;{1OR}6W))g8c||/~?QR@U:yC)]<8t;}UhNjvz=r̞8~c( ^{jJ)p`g;Ӂ1:χrn;.E3# aI.^6p,*|warTH#2l#GT#&[qwF;@!O:>7-{]+[f i>H{,̛1v\Jښ`=+G,ѷF% ϗ&ѿ}'Tw9NީQ~ ;p\U+\nE<]s$Z<4YFDKptxmݦYT"-r \T[F2;BH@5I-MMBcTrePNWޅʊyVJ|q{}91igy/td"OМ9Q))hlMEZ:LDWW>OxI(ܘm2pOS54C/;U.uӾ s6)}kbTSgV}݊yjݵ{ϋ9QpOK[x<̏ʵk|?m8*V[M*\\ Z,I TIQyYb4@AwE {\D' Y Gix@BG+8m3ig"y9m3~?yXrҊ 4v.D>$r<}8ۮ{=d1$_P,}'^"'u;x7YY<.nHGccڗdDjage3ڮ*@I&f8caެ)C|v[[QH(RSSKajaB}9Q3!n%។o5 ̂c\1nòkOBq8fԼVkU*ςqv3WU}T.&5J%b -CB&UԞ睽𤴹KG}i.ߣtq-{*EZ cF7"9t'H_Eߥ`PbgeBy0G"_ _/:OՁվ|!q[օs\ "Z3 *!"$@{l7KlyŽVK0uv t2hƸ4[_V&\ N2sz\Bz ֙۬a)jEH׊a+iMeu=&/e^ԃ}DBo #Y(_}'&r^l/@׉>լ QYVv7<$ۜ"ucLnNR#d;"SxdW z *#xXTk%:PkuxgIxɊ!Ҫa7I\t9ճrT RZ=Ƙ`7l@oF衈d^S8v6u8g_mQY_GOrJ 򱅅ƚr~ZzGwͬ>o Ձkgjd3MGFj&Q-|ñ }0V/S#3EZmI ;3׽~v9w#`!L~ĒeHn8]`jOygm?UӂS=DoWpCM#}ty׎xlA^;"Gq9/KȯAtuft_EW';hkk#Ղ'^c[F])B5NWj+XcN |{} g~x ê/Rv`{tWYz}g[Cȇ)F٤Nء"֢ϴ^#uTHpJ 쬈aWoh3kYLDk. wz_}3[7'/xql8}s]&=vl}w{>ϠWHxGX7긴컸V<_eSsI?v]"EMmcՑ5j)| ><~[GrQl7ꗵ9 3Ð{щxHS~P0h@)89v4C?GuJ[u'_$ֻhMNbffM^VCսmu-9C˱H/x5)?5ێ87oʿ`fRn#~{ʭ&%aGڶfOlSs8k!*l'].ZZ;݇wKwuwkv?߽m?;'S)c7O_!36y|qˍog}-9O'V#9zj}U9~Yxa~o .fkRc%Ok]n㏹QxCzOnl_J;|X=If&+\74G5&Bm5[\η"-H 蹉Y,WU T]\, n?4'K&%QhC5 (I /kq{ T#˪[R]y)׼)>@ ?"Wu;ü+]x'yw%_-m(<"mϨoUG63mʟ*ipWW4ilǭוmbFF\0D6)ȓBn4wmvf׶ݷVߺ53J6O!D:b5[hA3Ϻr6|t"Qu#W+!~u1M粧}ڭmy"zD^sm9ι\\x"tP-mm@V6[nW)rLhkҵ^ռ'^Ġӕxq.nsnwN4 շ$V56~`G.eXԪy5[jUڻcr2RE|6_.V5Kĺ~*:cҟ[jg[u8sENu icmRt 9A %y2L_-DžCR+d:i|H mFÃnVw#;W\mq ⣽eUmU{bOP^3myh^޿U<>(2EV km-HE:%|v|P[URV0->. q+RWb;3;kIo(zxnM󹱛U6ioTZ,U*(mAKiܬ]ws1!WVi׎Ի;.zyOzwcNtmK3 Yیw UiO_ָ[Bۛ\Hb;V#sMblUsn]Y.tͶsKx9/Z%׎דͼ k cunm]Gvnc^vc<*^.fIW"vmlP˗yZ~Ⱦݍ=[g5<2`[iȭ\kt)wQչFZj(ӧw8{k^Zmr:T;wԺx[lmohi"zZ}2zV;}>˺YWSͯ\RRoGjlͶFFC*K@ DΎ= Wp{IWJAZ^~nmsڛ;)qѮZmo;INU8m[1K lc3nC+¡3*ʐje[m_WUz~y_YQ;EBv-E6BX@5skr ;u㋇؏6|C>''#rҧ5 A(mo&ma-mu;$qW̾FIlf>*'2s8Q!ĕrO6kn8 mO?F1 ocsOS# 5{Vʫi"ωfG㐥9~I|4nƟd>܁WWڟ|6K;qy5ϩ^hmSWx{qȁxm;->pGuЃ8M<:du"1Gvagmff}FMr΅^UmlͶm`9elrM"5ӝ7wqmW㒽o~g[q sSχrD5EkDةmy%mAFf f*]$l ]҈PڽY3{]ݜtso` ؿ}}*d=@cp5P]wD Q7Iskr1Γrs:uw]wvm.#ia]Xx nrܷw9w]4\;79q˜@9jφ_4KOGҏ[gvt>?}o}swGAS_0ҏU1\kf6譍ۼ_k~1ZEr:S~QOsN6PXKmb*aƻc[뜙X+'q|lk愧T.ć%.^nN/?23q8?PHR.Dm4ض^6[s\w`1]%ub[mǏ+S ѧ'':ۍ/*(? +ɧsٿ=Ts%wǙ^' q8m`v-;s 5Rv˶{wsJv=j;OVoضn+[1TEɴEsbԗ)KdUJW^-x+ϭ<`I[c]\ĻDZ䚹uKR퍘fͶ\[v\x"x/'G&flj\ICveΟoVؖ7EUyhTz/\zz{ItKgS:^n] i*fg=n[k8&mp5ʚiݵr~t־n<T5-_2S*W ?J9x>G.~͢ 6\t9e?H< j.AWt k'Y\8q 9qƶjkUߢ}ȓ}7*̟|]ŷD)4NW O$ͪbڼr ªkkUzjD[mG͓dmTjGڊ5mh1V[[Vӕ'+Z&(wn5xV|o_mx[i^tYI|͟'lḷ**m+kfMT# jm^ԟU N(y9g )e-ثUҎRd*sj崠SCX m:UmL=w7씜6/]U)/%uڼsbT 4NZn¬q)QMV_ N[;+KGps* ?J\D^kZODF֋#b㹧P[=Wbݭs.u].wW8why-kkUtA;9'(KstNj8͛6ɚ9eᶵ{j6/Z.DUmwlfzRVCS*.4kVIAiWDC;8,W^'LaTuk@Ԯ\%t\%4+LwNvι6cqq̒5sHK_1%`mW-Ro͘7 q%<iF7m_[\tgKVm W5DuD45mqÌ', s5m6Lh]0Bbضˎ1MN@UҮ[Bmg+Cںr]a^ G`yT+Efڛgσa+#chm_AZN!j؃崨gE%~OD=~R>_ G)\}+y8_H=oO}~OGyn(ë%?wC_Ye@|."ts8,%o V߮!yomq?]J||Z_>||Ư< O4}\TB q uܗvw9DžQkRifyJ#UTϫ>דrbqa\g)T?Dm(I0EoϓƩqH>J+ *Mh 6"E'jk/wuPi=.D\!p(Ä|]-[ UU͍XG E Ud؛ ;s᭵}!Ĕ~}8m*=_yyzt|y[[f[3lg v5~yr{Zʻ8j]ҿĿgve(vJM'kT?+{[[VqǎrCu_p6l1ȡ}4_(A-A)RFڍ0LjZhIo;jmW_H(mePm^҉r*2Ab~5IUΧ uhGT̸mٳ ^Y/kMSڌ/k5/kOiZNuSzDk׵SkvW*ZGq q%!}Iw) zrPzYC*ENAyXOM'k=t2 ^J{h}xMB9GэrmG%W$olob8㒧Qym"?/P8$YG&F2@$H4sUV |D'Wx.SG[-'ZX]iփ09%i_]iI;Miٟ r נ/q؜e\&I 64ɹ UͮVˮZmk\p͢n"wpqUj=u^8# A!#IE66jZZZV4`dmh3(6 qJ\$Wwk;㠮jR:G{s\iOWx_襤W#t+m,mٺQ"\7uwtw;^)h_ȢQ^Nukkūjx"RI9uR͊&7:x[U4o"r.zUK)9 mX$#iE֍F4VZ*nm6*Oc.9*>'bW%Dg9 ;='}&ܭr*<^8NR6 nX|Ov8,0kW+poԞ_|GK9I'q^uO;@?W <^8p6Ve}A&`?-bWj2]&E#U]J+jZLu˖sZ[kWC(pa. {d`vRvRv1M^o+:Ab38Itr̲ͧT9)׌[ZNtbuc'Ժb媎U0#j3^&oB(.etȁE*hn[v#Z.Gq\\\mq Ȕ$_atvGqQʟ..kKT-1H<ߞS?o_%\AwlmQqH}ғw?6m*.lm>N+I˄|uUlٸįdC9VzUZ8b\|NkSy υ.u}:I]}qGyqs0ўq89$tSV1تYTJΊ=>E^֭{m孼mJ^Lqqһso 2U8)=Q2[{?I}FjVQDG5skHIm\r^N Ks.ZiΨX㛜1]9r$X‰ƪaks(.Q:Uݍ ׅ[W-Ukn8q-ڽsIXO<缾ȏ*i#Uz7R^rcvĻ!r;qqwNtf [U~mw[e^a?L'oL^4'W =Gj{vt4GXkh64U!I [گXm lɸ 9!_B%\l1UFW PwvDhf`,Z `wq$=F^%*T KjڂrQ~LMpU]u8M~Wim!cceEm ^x/jRP0UHr/Fʼq<dz7hTfSţYWWĢ6B{-rt\f׾ܫSSw+NgsLw54 f(~_NiϬ{N}jNċЅ8*טI o«W w.)j}2pz#!$I_T> FWC5,~ө}{k@]ۗ^Uwr[up-)lg&ENZ$Z}w~L#ɑEj[vn[NWG&3\mfW6mVKe-įCG:HCv#Z;"쓯%jjې&6F'&Tq^ <Aqm{{Xpm`ELlښڛ֍)y,ZyK^^qp܉O5>sG4٦y'ZVb˦뺮nw8[\뻻 ZƭSE'Q]@ /Gf^rrN,OtOzisM uj,Q.86M/\Ҫ3=nn3_]7_w_O&HSH|tWAxV}|vmv?Vm|hʠ Wv.Ea_wI{0Fk6صxppͩ[M tsU˻l\www|[[^5U͕jx;3mn7,zmն1WQ]˛![nuΓ~EU6ߑ#V˺s%.rawFcF&NUڢ7%c tӧt!׏'m'qſ.=J˱;̯ЮA|حmf>8z5^zmmoB/Ɓ6ŭ[ZٷBEmmkiVW:un;|_iֽ:Vmk rZ)zWz5*IPj+EXZw֡!x}$'r o`^U[FITm-%<)tBW3ѡ56fvt]] <*#)կ'W[x"맀N~^C&^\{Lr=&6e8clLhMZJUvםWnny۫8<[kTs)v6]tn\͵UFSwwwGKtNI^-kЫWeE\ŽOmj@6Ű2&uoeUhO7w6tWEf͗A_E}%Z^U%Swsv#-Yfc㗭Dpylkf\~ GN?GOo+ٶ[[6\2˴_]o]s+sPbWtbwm:#K..\ێ7qٝvkӜm{,'x\*-*V׎\e[?ZWyV]+HQG][?QRm*N ٱ^b2Cy,}ڏړv/jK붠T|_pSĚl6t\N8̸ ?#ͽ {[B_U͹%~%3_ڶ[r.8+e5A~^4EG#ǹ'a`P<)׻=~)o|Ÿ7qyo.>Gfѱm3m1 ׃V3nptt˻5jL߃qS)_q&mϨ֋a¼krJ5QnXkjSֶi'wqf=?dϙ0ڭQ1]p'Z kFZl-6߄~$)G6|tn5Ƨ mͨ Z*;mqnZMDmqx@ww˨_$VdZ"56J4Ƭb"ѳjMWk_),S\k88/hꮗ탶/ 1lU;zx]< xR; yNtJxj[1GYi6>.uG{SwGcf.ھQ橲죾RнzRgϪwlxgғTj;uD/rF= ammnܮf[S7Jqm}=%ƶLHFm/xkQІfm]$v>TٸRNKaly-VJbwUwvEr!֢mhr˻r\uҸwsyړ t_!<}kC($o=^om4%喰E+U6-ckz=ޯm_hղY\os]ta&mG8q6Ў%sY{G|4Ǚ^lXŜUɣnk[Ywww{Q0Y E)ݓޯy{{_ץ4M6/_LdggԯصxάJҏm^.Kմ^=դ9IeBbmkchȵlSD$JDm؁mk[m|m1I㍷m׏'E)!ڷo9oZ2Eh-u՜\uj/+GkmR/ <2x5=uWkf4$aww@ {Evh]vv]گ͝ }(01mݫw:t 㮋t^wRt5Urm HY%:[uI_7s6UEܭ6Gm^ sÞ2c/c/cOc?OتLzd}]km@BԍWldz.ȏ={Y5.gG<\-|^67St,QQDH%l6kҝ}[_>nUyrӺkW[[oM/OZ~I6'*?7xKR?ƶe'i ;A5famkݠ<\n6n_>ޅvlSvS.NORvhNܹ=#68eU qn&5IMΙh՝;tV7stDS͚c*MKwٶmvQG/&{=*U/~j<} Ǔ Sk˕~Ci}[Mf M6 My^>FgR]MMƸOwy֬BMD[][;s\\~j.{KEvt۔(+iJ!Z*$YykusZm<jzqS>u7hqێ3go'EESRƹgumrr\Ɖrr㻈oޯ>n%Nz'x˼}r/iҩ.cMM[i2[M6o=Uf]YO+V[ iĠWˏyhֶ:Ln34>]|6mERn_ 66x6;9uu[ԯV=j\*悔FO{ZT-zm]:ϨiRQG3'z.ĿI;Ꝟ|i>˽S>"|J=ob Vگzmkaizs(|^kŷvԎmnzy-@kɽjK\UMbMbml֛? #T=x[fƳ6]qK^\g nnk]tUsW8nsCNww9v㻠cwRK~]{N\yrGZOi:?eymQƜ3+{ڦ+?z;^6TWࢿz+Bz=7sU^1Q>x#>b+^=;fj-CD(6wnW3nnrbT[[t6Eۺ#_{n[m_y}㿙QϨ{[f5h棵-Qm`F* Z;IԶ|~[[\K|Wkͷ*(t^w3Tv]/ϣn/ug C[m'jqeU'L'Mf`xM`c;9 ˝WtS[RT*W<1"Cޑny/' p9k+W| r'OƁ眒tGŭ'wPh cVŢ˦[\cb6u.Qn;w2e7oYͭY?rѴ-&Qlmm#VtyՄr~':|mJPegń]^vhe4687VYzޞoU˹kB5gt8IzC맭Wl6ڷ;cW54m٭˼9 <-mtٷ |mofheUym[FͶl͛~ UŽ}&~)<3~O8fs"'W{+e{IsHyoUjP൛if3GR:D:ں+G.{R<#q;Wܴvn;˻&G:P]RN~{-z!9 ,r0LXWm*]&eæC&;u1_+4($QШfq\k`uQ屶=!<Ӥ d^oK<[Z=.N5/dWa?sqK6~J$\d66ח=wog38ve٧]v/WSf3ѕڿs|"$"k+-^QC0,DBBd#65{UcF!2Q2jԖQmEra wWCVfͺQ6qݸ\=[_Z@nN]ݝ.HwAܹ6jsWkQmIҔ1MM%L~ o p㍞=G&VwTOK ޒUm籩E$kZ~eѥ}ԏ&$ΦT}G̤$WUU+\GIێ' pl]7:7Q~guG.p!-dfields/data/US.dat.rda0000644000176200001440000012767413754255070014250 0ustar liggesusers7zXZi"6!X~])TW"nRʟX\qjnj-&銻PC^qbJ0J8[܄ܛ@=8],{S %Q8hҀ,:E7:>g⹼l O[KHǭk2ēN [Z~HػK)˦vK><$?l~$rm\Y@@_(gWH;sch^hhR,x 9}6|8PN4 Ѥ+zyЙ#bQS(/Yœȥ)`zc2Nh)͔d(,k5G\Xl[iԸL?6[jy>6S Øx;7U clKVhMW!1nWF O'RGs\ˍ3\rf&oUЀ{AkW;>?[2/t[7Q٤>Az d֟Y8hzѴBk^cݿ}1,s"MR]nLJZ€|*u2;B)nxqI>` )%G+ JOP,ࡤ\\Etp-HƫBC7LX7~Lt"vԹ1Y'6G7?ШʳXNt mPEB7g{J2x5z- _0qOONj:eVQ0b0oAmW{Ulb5nMޜ0wLU&7ŗnSc007UM̐A)#N}/ΟwNTc:\TmD[կdw2 }p{f_T%KˣD0@ΪM3iEk@Hnքzz5^oIZZRJrjq A:YfON%7=8RIraF^om-LlNrVe/6/xu4Px]zNL-*c?L5vTg 1*;[钒qڷ{w 27l(znb@6[6Xuiwfʸ8q7Z0>k_>]}j'<&^) 6G_UʮfCc"nDz;0?s͐DGT0pR޴ZCԨʶ9/ulAcM;Oqd,hv@#'@vwx (^"MJ (-] P ov^YLe8,(7ɖf{vci@q7Z:F@;͠h5RtRd=4ÙuyIi@ʋac4)%Yv~}Z[Tf"Y߳La|b>bg6LJ-@@ &CkZԌ-llU.~]"p\Tq1lYk3$fg$ @jEdp{:6>:ڀ zL.:>^7['z Ef=@;0^;tLyl}r/ ׊םbĊ9U6BK|tLLK9t*_M8[ջw anKXFn׮l?ǥsOq eUp4''JVhq<j=i}繚4C4Ya̻$sktfl+7q'Y,=,I/W_}jIWx1%H٭>TN> r*'k>3zVzdޥEP0P݌TtM3J?hm{_66DCfj,"m1y-:0);MmM-.)Yk(4xo1 jޕ0^kTh~F _9؈ GP "OjO9va]|ph.7rJ̜$` ZM %tGCu¤qbY -Ef/yU( %O?%/Nvy$)$8qN8!;+җpg1;rYNd .If&^y2][DK/'1XPT?v.+)(b?__7j++;@뺎 ρ.k! nr&oU~8 nFJ P4n"XeO#H+Ax{hm,"1;;ulP5a&ƛttbXvId5z7GmKt8(B s{h}n1)WmoCg4j*7tb h@ee[lc_FU}*<SsSrS7)R|v`Ov1ɒ_3w&U}90]ű}6YsҠ#i.%*h 6[Tyhɉ28>jRU(:8tIhydyHiüp![ieϞHAZզByk$-Y~TJWEV[<f@Gx>N_qt%rP}^CDY:ǒ^FRl *ɄѸqma+J CPY y@oDVEE陵=:P,b&n0>b% [M zSY,1H0i%F?8LBN/> tOixS+A(j`pzo-JS,McBj Fu aGvQ>i :w3"_mQrqKik4~(|G񛐠df?U!"jqEl>< < @HQL\]^s Rj^j -Uнu: G& ސ!A,YN<>DjHXLi2BlQU;)!)p}Uxn/*ClCfb{4\_&pk7S (u&]ɀ|-y 7bhb֝Fj q¬XHҶOPT@l(HOb*H&)o"mr C} "2B^ aX7O{CGxR_!{&J:I6]%3-$C t, wxS-h TEvof,9ky/ ^BѨ"sMhAW/]d8Ph=2UW.P5 1[as NjH I-S@Ѣ^S&7m$fKAZTl <)B~Y_Aɗ7WȦ &bL2ԛRUzz:kEÀ_qN%{"/x 4 :4f^ܩQgs(U4*;rAv73T*&ҢskqD%6@n8 BPHM%;t 1,YqW42 ? A@a?_#G"@>LIc W䶊 D@(ّmؖCcxzݠxiѝ%G0  P Pꬶ5|`V-?MpQZjH/kM_*v>%·= !.gT Į/hK %PmLk5 ='L9Itg [V14x ~MY72fmS. T)Cpf>=uRic8[+:Jj"OXr!BNQ@,$+uSY7}xP/-uPb)h(n!WqoL1DĶ̜*,]Y#jf"JϦhO!fb-=J\U[7lLl*S0f k\ [o ?,Ҷ-SAǧQ|~nQE[: ySAbk '$kL/\4]Mr|Wss<<[>y <$V \#?VfY UxW#M,Rĸܔ%=Y/EɈ!>uz[J`[9f,㏅x)܅yONDUd73\$X{@_mr7xr~z^2ASf|G.QcMzt!N`[ᅁZPw#BW%/4ߘ+B>P$ɥL◐imf7rhJ}pTL&|P}+)ŌKF@П^ug` +k0_7cPu[Ƅ|w`V2}hj[YM5%Skjq>>%Fyú3E~z盜Olw3m ir:C@WJyz];<ڽP4QD/'9*h2GD?7H_o6l M@b \k%0`=~^sU4형aOrҔVG mL:-h6&GW`(P~"',:i+ܡg0R5tkѠ1} 1^@鯏7i;Lb[s<ɘ>D V6PV5)Z  i\!i"-+VИ9fz.Om5k1ύ}=V~7*L![ Dyh ;ϫƓ?߭I'㨾 ป!K*(tf#>y)^H/;wlt pH~[=*6]tzٯ=0NvР1i\Dz_;bfUMޮ۶i]ֵy/ ':7#'6s'/w=t~lxi//l3dCB!ъ0ka_L i5.M0+SS֌8b6icB#IUx\,}c dgH2g qpB`ڰh2X%?Xi}ON9f'CNxU*#ݟ_CEVcnާW*漍w>`Gt N:Fo)J. ;8Ԛ tJ>o"UCּ98j\ZޞpcNB,rsb~<Iוҕ?A+G|>6У3}sQe:*"b/EelaŜy`/`'mfօc69\}r ?H[pZLrrv)?d_Î֊ݜ2Wddx@*js+JQF62/G6h߽%B'U% F1 wL Y>!q@>G!(AQ޳L*usqY2ttTŶZs8ߵW8NAl W%jDd3~ ̟vqziT)80)gN[O/Q4GƄcؓ ԣ,\3@b|~t`cҲ1j*>a.*×lOl_#X+9 Y.%pqtʏ5G QfG {O,jA㉽mpCڷQ֪z+u}t]XR]Z+0K>蛧 ,9 aR%#sw]GX}{%Șj)ʏWa\ʊNքx>΅8` :J @ ,Zq6Xb${:"%X-;*{u?yrSYwi29cyʍ~f9 ߶:>9IkHql+ۥ oY-7( gܔЪNk }\p_\JV+#\Xe%U yG~|4P_[񇳤7Iy1OgSN7 Cw/b@PɢHn:Φ'[ hbsDAkdSw.Gd!=Dc̓7 v%I{LH6kBtKaAV hY &ip#/EMF.r9ׯӞ.H_pįCA˘LZ)^sx?.G(Ԓ wĪ ;i{v\A_xWU+XaH)Jo)Z/KuhM{JcvG1d_sBMFT"z\_s[OtNrQtFkӦWPW(Iv=LSX m0p\~;M#t99iҭ)`B2U,Ml28o^\XUW|q ꭽlD`5jehp N bRß)I3dp>j!ؒX+f.=Ca]j\L֔k۹ȕq7a}GBAPlŚ:-r.z ,7Xֿb.|nʕ=p[@"-W7 v#`!SW@W|bѲS<jT< /uN@~f9xM1gg3Ut5;{>ºD%0Z"#E4T;mVlTËhc^2dYz;.A32o;ZFjڨ9cdOgzͼ+у zZ1R'1_9ϫ_NQ WxGAz?LpWl,JnNŮ\5du S.|z$a~=eZ7؝Ou[M@G7b5 HY(qm 7[\թnb)XTːr!gדHg78KZwF- zwHY| .8xT_=z\> i[Agceuv*T7Gr^~po.@dtfL~yԍ-&h3,W ߺ f -[c1 p-RBJV0hF6.GG{vcSQړ~ N bHRϠLzk PN쫿L\.(#s`$@_|GyX7%OAqܢ VOX,)' "j!tB#mJ`k|3y(pl2z tYۤ? +B;^o*j[,7M[Uěoh[slޚV *ULl6#Al,mwn%z:9iֵ]\)<' y\ۯ!#e%4d ;DEN}9 3)栫PvM0G8^/]믠vnyr\FIZ{}P|k`R-4xT-UsT 1oE9V%D}WݞB$fXž==cVeɌ GܦTj\"(/Ni%~NOXT.0;e4~xD ՄR!_$J4^7[4h[nx:1~i'?d 9H @ŵ!QdK Z.$\/I(ʲiY RǘF4J(5;ۇsE0M1@ZN4vx b=j~K ki(x :kq"jmMBjfP%n @[fJήv3<_& ;W7k"-JGԍ&:_8Vfziͤ'*A (geKcKF-*0nG; c'jE &͝6Mb܅+*9vւn+HIw<Ki1*2'>}B?~P<h}WW}&'1f#lU a".z#YDi#܍U? biQ܍U/}4s6r;D~Ȧ #\<wZs-03+*qSqywkԬJaqw—q#?d#ڜ9:E8ShI[nH2gUf}mD%濴9* 7qu1#CYkafbD/Jv\Idc3_N􍟒tT_!kZ_XS*d0©w*c;X_̰YhSqoE}}4M[7'7 *H_0gkN) 9nxzdh1~275o{voL ZI.d7`x { 8uyDŶWuSPFKY҈D纄6䩖}v% kH[6JzXu?GNhJGDB/'AM#LԸIxPB {7aqED|L{lR_um(lvm>j7P{1ڢ;%ƫpCPZHg&1̱nTKUyl|Z9LAĊl}8篯NRoM&Z6`Uh$BE!{˿L a ,F #u `;zVm(u{oڄRt:E,ro_KCNX@8.0n)n{Wai[p`Ak~ etrba'2fͼq<Й2]A𥕵 ޹WΖH* lS9ܦVPћ22j~!Э:^?&AN^XqA22䟡-;"u8+@eAT0T#/Ҭb47RK&䉚i+dZ`5FpT;qUrf7۟ *X#сJӗәom?Q_tr?Vӂk+ fU6utHMZBe6Kۛ5E?36&2;,H iV?>6^J P%1)AEmOT8&`$u^lD> M ۉ9VCJ imH g2Hm9-Sk;)<]Yh5I`ؑqDRx h̥63$xW p}jm]b]/vUy-71^닙ռc*~3^vg LH$5i#.Ěmj e<?Yin5Ԫoc|QN} e}Cl-<Oz({浤4aRRѐ)_qL3,F~Ԍ&;KJ颛tLqn~ W:"=A_q||=5w ;=Fζjh``I7H,%"Ƭ%Uo1 [@.MiK0n#ăuNP߇x Ա" OmwSX HړPJi?M lH2|Z([( &AEZ)[+_JOPS_];"+_Ұ8n3ɿߞVkJ$;HD%o^cl摯 F->E\SQLrSDIz$7yeX Vqp7^AGUלNS)fȻihP߄?y9Ef'U(=?Q/%5ɤ<4)o_#3d2ZQp3r??[QPU>o>!'-퀙+-M+rx*oqJ؅!St7;{204r'AK6e6s=[ŗJ-}@۬`ou1HKD!Ν1ۈA|cjߒBN GH) %Yͅj$郐RS hHq<ХLJ*DTtˬ9b xNӷ ?KƖ b\oy}"=0qf.QJ :CdEOphF;d5Kpgt4O|sDvKVIjȏ̅iu]vxB;sP4n<#f ΎRUS!rOLt3-) Cuu'"B5rY"5 >v_Z<~$ ٳJۋ/gᩭU 2%(c?qۆ74e8% RaBX 31{ -a+_uV[OΖt4j$tf%ʓ=汀Lxi\/>-͔nϠt\^jw'EX#3[`(l;+?s^ uMd:Yþj 6`x䨴sQ0.}l`;:LH1.GFrRWU8AX9c7o;Bf#Ѧ z(u =eK8ࣀWW<_RFa2y6=N~zZKpT]xA@;гjR3Xc&EP"At/n.2T%3c i]f Z ,Қ$I"-:${pW ku=;[H:g'_;)OlWUWbm#|YU餻?d+(KG<>f!%:)WݔC7.fD[R/Ea*yq:u.N%BBNTdאm;P s:sN;oa$*5bي532xjDI'S\֫$]Pؿ6!JBMp&NIUu5iU(tL[\Vw=+i{Fnt]4*469M!~ rB\v@?8qb뭌+=SOXt*>؜E )lCo ^|$e؈L,Ah!V贄!3t%tHv5-:C6f2xL }Z\J{n;ffVy%6`\-:7L]E{(s#cCECX19ؘ. F1WP|aU>>dB38}$_̰mjukԴ]7Ȝ/kAO a--5O zꮨh)p굲|p['^}qs>0W]|tλ:-k3B7L$y6pCv%?2wcد5^9̃Emmodoy4y}xSX/')=m͗d3.|Iw79Yf{RwrHL4/q=O`Dr)ɸH{sSe\"h0_,U5sc% TIA#97Y뇂'>|׽㖃GCz"/}-HQde>J{G49<,I@.6eCV}OFw\3x'5{ g %_^W si3Sr{3;]h&J01A֍AiVM;\U@wxqgstX>*7.JcLe9 @1vbvVyv^i[R&׺ Wry#|tl:ki^c6Fl4tKFH(uKϡt:(h/GC?`!DCݞ6rIzh?ۣʄ/{?ߎTeF&0ą&A0AVWbK˭%ӊb UtC`x{§}s~e[aZbYD)V5J>B揳̣*AX>K/M[=hMs E`b 26]Kq0 W%iˌaf~?hYDW/Bd%C$.{]qMLr F+􂃿p.M|IZ_ Itڙaٮ21%P%׸=KP$f( j#eo/ x/{T 2P] wF>ޮEXKrM l8{Łk:EDtoiwP /OPE:m&ݐfϊ SV353M5JcйAp 4!_?=L?^P9J&4~Pl%fUq3d@*:.7+p5QNvk`ͺ B ]Kg+jϻȆ8O(vA9͎ !1c#s+c"|Qz2)wjeIW4I%J^G ?e QX<4iB/ 9FBEV 8ߨILw/'a/lS4@[3Y~H">sĻw*GhpixW[k;N6 4I":rڡqM ͫPCFዴ'*a۲3 5N;[/~s2,O5Ӝ AWgnkH۷viY??.XMv5}ǔStwpOY@6bB&Pdm4 E6ULf]BMJ]N;X-0E\\bt?a=Ov>?#+\X0BgVS:N\G[1NWX=awuq$MMV&(Zo[?x6}9QE ww̸;߽6sXh?ƽh dE.?Ni?2LIbׄy,x3t%fсz^ 1^a>ڔ`Y j5[6q0Ɖ;\.}SRTo >vssyo>_{n1{>vO}.Ml ֆD2 +Ab^$bV?WǺ/W.xkb7Ӣ{1i6 Z>H6ugW8.S(my. 6#դ $4l6jGUՁ,s6%9eJ.q$2"MUa uKcx^t/DE癧;&G6P|_D 9Z8Kx)["e$PM,!} 3=cjjwA>T[MP*NyWß{__P.= ) oۆ sTIN{#j*},A׬KAŸ>IZJ=l+,o69#'+!(BCux꽒3A5\FʉVR% 0o2XzRUC]$JYm୩ۢuLMo͕ #Ίx{]y<[PԔ( Ņrڿ0Gj1[R%` 똱^uy%ʣE5W2͈R"xY~xQj{P >LVzULJnOWbZSgtBw2?Y$X濪Gx2P&Mu){Kb!ud /,M@_\GRD. BQZLo37RNAI$˂zڂC2$MdÅzJ4D1涂^ K{2K|gHL>cA)EGqZ.Az.5j8I46AQj`Sgqw?Vy[VrQ[^q&g*KGj0TBoMvkܰ(vzAO)\+ Zk0TKj>+tW1{* \U(])1(]~0ă Ţ@OLK`D]Le) Kl/Q! 3`yw T"IHDcd&E-z} QLFCn;8, NV@w}-u;Gł!)^7˵|G>@%Oe@ ͇)g~j6Y<^YVoTmP!FD/!QlcfoV%0k9'SH馃, 1+ٻ;æLc Y եײSZJ ΗBӤ0Nl!5GߕAFFpO }(/"BSOI0/_t:I~ZXݡ$Ofɨ\#) Э&,2}ӣ5sr*sw\cevotg/ǫ:/jϹ_+]]u!gQWtvy]VZE6=_l*tg(>9?_4}Ay>y!+cƭ3(p|}Ha@37[! `9CXτZ8\e,5x*t#9uFrN\l Is߻ k1>!_>J<H%vcU%>).eATQgsqz0'8~6X8-" wG H]t4Vqo= Ձc&578Nz!:wv9nmCG3VAPkSy_h4h0r{'@f\zbbu) <yWM*DŽ0#b5.On@7!/rN~"~mEHʷӷ,0[-+z&]+lBN[C(ZG.lFa UR Θ$)/>7\^xEmf&Rizz10r< \#¤eu+L8KXԊvSi/Mz6OWL pF*R{n)B*bR6)} 1(ܩ~;V"7h+X6طw@%&HrA|B/H,@ ք, =&ϲ=9٧1?,?ud2-UY*<@|ҧ",|^=3y+ީ]`jTrREqZNQd{ cilQ[2!ϏD:p11zeZ!YK n?&:bLÝwLOrХ"K39KSbPz|GmF`3ߏ\dZ5:oa}Ҕl.}z"e;Be1⎗ooh;/5x 1$퓗2RX dEPv3%-91E7!;G_: 8G}sdfډ<',.ӎ )zQ8뻘XEoi{rwXlzX)k/]Tg׺b J3"4=KV)pS .Pkt`ldX@Uqu `ݱ49Lx[:Efie nsջuDۦՍZl U ~$ͻϚ]3bjڦi,qVyYjl wʚR~g6`;ӵM! ֏eoˤ<4RKP,r] [KD] v~3i',_.dҁNxwIU3#WK{WO_Xn0SAzSC 9[r.d*-׸diolux+sHr>tv7Q4({ma蟩Z U-y÷i&0mQ%.Hk-$mHӧq Jɯ5#շ+K)0+9# +hd ڬ+o߮e`n[ب|ҞbU$]Xp#vH&Ń-n$ƭaLp12;]7B" qs7.ݙV~^QyV~jG_P"Kk~[1ܷ2y{kҋa /%6^v1_1e#Ʒ#B,#- fc8ЄA+S;el%S݋#j~$\Z\%yS:"nضP X< `~2A˯Ru".敊-bUmqs(9[;P=Z'xDSƐwZ#NӲCK4_R| S +S R&U@I|q =Қ\_V-82zT' a%A=;#ץ&Dޥ V8]#A,p'=;}uvfQ PJ߮6Yו¼ cHB2'Lu}k-3m3Z?瀊!<.VSxs3TQ^] Jkv";lQ̠/c)YQ,2錅 m.}'cQņb(s:9c-X*ح?͐eO҄u{ͣ-+/HUJNY<˾RC*`vെT򬗻24a]uŒ1 O$WʿZF3]'\-T=r m< `|U ~DPqBZ7~\uzO\c"P>?OCF@%g_")uLY%XW.]<@0rmQ8UzwdR$0DʙO~rv~g w[)ݺmluϽTǰeG׊M 6_Bh^FTr]o /?.I6aJ|s\Nq<HW 4]Xϧp.0qk>*-(C8-D7 ݵG-/⎂9OΩ?^qEPD:/. sJ0XMTIhU3sYK! JIa:X}K/9CˋѤU&{ߺ:Y sWǁ,MIY\|R i1k.!2%{}"?,bbL?:*}z@O ;Ö5 \abR  e(}Fh:4RA5@h OS6FKiо"$ƭ-z[m fk MqGN0LI-ٿ:)(m4"41x/^;Ϗt7(V)2Ï1Y)KmȆ89E)uuS2Uˣ{fg$<QQ8cU998c)"MT*6ڣN hc_~av|5פ z.[da8ez<=Rj Bu}o^z"އtPH]"Q na 5+ @=E&zzi7Z#rCG%Tձ#`OyՊ&FН-r1ڎS`Gу.b@/0EQ75aRl!=&UV%ۭ^ꮰBy:n ҅AEIzai.omRN7kDr`{mNgZsQ6#?]cOT$+\ϔl8Z;U˞ʸ݃)W ?ŧ!'e2C07Xv>c@z^c \TiWG[(mD`PkbwmO1%Zfpoa C0#i96&Qd~qpf5L5rv1g _b61ySY+Oq.V *hޡʵ.N D-<"xKr?3.n59x}YC*SG%XhNؒC[V/6k_>lmMh 6^~1զ'' @y'GKZZCl=)qYb؞RG5dui`"xDc6q҅?,nS`w0a>R+9hL&SiKr/>:o/R՚QGudRMGdm,c+Ck*9=*h7lFl8:_4}>+\~%xDtZ}A7Jc;B\KѨi$KU%/(ݏ4&;g*!Rq!ԠekJgy+,]a`?'7ѱ mb:Ɲ2l}alf"fv3gLN׺EK5GVif =@'ݦ5i<`t֪#('VW`LИN5N*dL,GbYynd[pxBo;cQ2t"TW1}S_4f Oa\) yͯ5(Ss :MwxLJ0Ijle Ddۨue͟QC a8b7GkQD ?ϱz?"'w[3uØ] z/2OؖWڢ7 _T`JdUGOW(%9Z|r|}jU#\v7?%:mA:RLWV,?7k t~2U' KE谾w`ROܝ>{4nJhPʪc!}}hoԕP#ޏҘ~YKT!2}mԥ` Y2'Jvh[ ݾ;mB8W޴1*Ѕ;7R]}p pF ѤY0e.t) l2`iWT|/!Sj8߃+-%*,!'<ڔT}<B%ݘҍgkoEӕ&d ;51}<@,mW.="~eCưHU4"ay_hM+-MUw>s; v,nw6>YBȇ>DyP^˄fMp̢;=иm 6}4$&- iZ}Z<#[Sp$ަS[p\S\@.ŭobX~bxe#Fގ,ÐP샊妼Xd3p^S?y0)>f@u"H}Fl>$f 'f|٣f|`1nV?^3"Sk=Nvy0wFp uf:XSZ.І\+Ldy#"+9ŴQ͛a^\54"C}C(y}'Gc"ê(` S%g+%p0gQIdU=_QϱJ cw! >wg$Iָ~(e7v'VD)sh70㟳U. J.;YD&Y2аh1+1H,?&ϯ;: xf5[?B3t%T,GQ1\:njLA"}ysK3@ C?NODHED:Cm.k!&7*{FC71|+qMOK~y{K3*Ĩki%10mzk<_8}FĴby`J/ݜ]Xft2Sֽh8e,R6CLJ6|hE!多/iF܀f?[a/QY7I7؎p['<˃5X^+6- c7^%~圲%6Ӄu$&I o3Ss+)S EQ3 w-]"`]4X#j\y"LzԊA!++]{GT?T:C^lGr#Hin<[:~q(؋dp9"TMS ;1exdMc Ubl& oե"6-rD?EM$w6ʹY_ָLCy (}< ּ/KnCTM'/_CQ=ㅓ#IjK /<Ʀ+Zql]PԪҀefgvRAW SHjuhV_߶',Ve`+e oUݾA>vl|J^H5@Q'jGOj&g# v$UۄkBOi-|\Mfͩy]ybe}1fY8LAai^rx QGp73聟F v0ԁ-~;yL,4񞡣J%ɬ~^yԝTWF0Q~l $S*['cNM88$e+ȧMDa)Sovr ^P0UتW] ;cDzr(|Nv>e4YB ퟍQњ@&`cD,!p#T=*@Sc7 s >'O̅%TT':XB{wFinFnu?h|b<])h%l&G.b GͯlL%oaaz%PaWmbދeuӛ<WC&ߝY 6FVQ R@6Syjr,`Wz玍^nNǑL[{n7)@羄 &92J{S\@Ely3]qd_R5wC\}U$lZЫƇJLL" gE'@Td^G|~Pv˴@3J.:۴0" ,OHpRuXЬ _+'4:EPHG#pYjz^-`>_e󉉆.x558Iz`V)[`>_FTF3opEֆ~Lvt:eac"Cu}>;08V`$Yw"VTKcD qYbO"p25K.I&޷M CFN>q9r"/ˢ  }Ʀ2]w>hѾgu(c _).}n3*PC>|[ȭ5LsX/6޸3uY`S{ z@GbP#BJrЁ J|p]KAOlvyeL}K+2e-n'?=Hy#qypS{K3/S:oRߣ\ul XXSNZuzuEE& NbؼZۚ,@.fvVpHL/] td}Vo"$C\ r!f-IK["FDo=Zꏟj/C >k;,zh_[gsT 0t`'< X&{\?:aCMiFw#ј,Ȓړ(RTQ)P;Fv0|+,חЊD䫆ya͋>+ `y\ MJDGF?e{cU6M,bNo:얄ঐ$f4faCV#տ_@_#[Rvv)9A7 U'N\Fܱ:g/q)-?@FfVa;~$Қ &g]ȵ86\NbrF*?{?%;Ƭa2(7CSXLۧV IUc8LiN%!H_ 0 g[-@zA{:q~ڷ@snr#s5 /zLC$r]EueU 0YrEn[7DL:yݣoYBɦEC=}L$I3"yW } %,pitLiN 0|F8J!PQ.!"_Ds5rNVudDWvDEYf@uIsWqH6Ixb(GGOt>Lܴᷩxƃ/ gsddE' ɜ&KA[ H< Z1I*">QYP3ʽjAI{H'ɷg8U\TaF׭# e%L'ͦ)/A">نY OvW-NJsJjuq쑻%:,6bt";fّVOl`;ב6)3J~;~gg.xu'E/"R@ р+mvo4\!QE[xX^O!c9܈c0`d~x QւoxH߃f,խET5͎ M/@Y`Q<)7:uG$}<TG#Q5Laq [řira"My2wyNlLRl!K06m^gxp} ` ۻ";#8zs8Y"-1*TsŭP6(pi@ |RGE5Fե; v7#Dŷf:ք4%Ega&%J1JLMNTLq4fNEaJ YY>c#dJMF2O*s7*^@Ws|_|,0n?@hUM܊95@1D8M7n,ur&>#RB}6daU udz/$ue6z{eS*ĢY7ر7ژH\,ؙ`*d7Hh7W R>G/tіSp N`gӀZXMLJQ"YNά:B1uH r!l ?It/D`?/i-A0ەpNgUj֬ !UJӖ JCj*tQ FOE ol2 Pb\dv.]v /@nZ^n$4ɬhM-Y:9@*ǮA!ejg5@EP-*P|Zja?YN[o+$hGu!hYv\у!ǒ>kG ">z7;RSH_߈ $#g$Zѱܶzqiva_=aC6* e%%Jdl fF)8Rt1?+6Ձk) ??!*;U^C2;8Wa4'`[=u͓R'-5'7a_DPWٹ5ܬHV}+o|b]ӽ' CnгyKY ZkE~fhCVmS(Ƕİ~4EqD:g}eR9Z]<ȓxFQ%(['YI{昬[.?RvaFnUX*Ƀ9ʺ(LsCp*w: K*D~wt+{ΔZDH{{ RVĔ+X[a>kjq  ~gVrB̲t>!O=.GlmXH2S[*qZ)H3Gh58SC#dB"*!ߨ'3nӔX4~+zFz.1@)1!YHEg .܆KhF?Zmz߂,`}jg]Xj 68泞 ƶ_g8Τrs{ŷ^f@ZCSU 80)@ҋZ&c f,qTyϡȣ6eDs7, S)|Нao&u8#+Ok姳 ܅9(ME)UdG:RJN$8 U/¼dAeY}8 X+fw\kJ8 LQ .OH@4k<ɣ6^"/>ӬO&yMUSA?Ted4-)G$nX vpÕʣs9nDF<.*G Х2\@&h$A1,#WXzJ{a[xr"m]!pKCQm P4%ǡR&C+ɰ'`E5kx Uxt' >MSH9ݑ.L^ 1m7xrNOW=[J:canu;##lfrBzU!JҪjD/>F I ~{ijUh% W@g8 k )B(9lbi5  )I01n.z<`.#\S:K&v*R~F/%qB7+\c6Ta=r&G^${[9`Y R->k q$R)3;NNvem j!ƿhSMe˖AۯӫG+ M|U{. 4q ӯAY ߾$q+U ߵ)a58 c e Ad3m&.LCnE9U;Se[~c / v-COvOYE)]*72P`QʠP#R7R`c |bEx|Dem-p IM$_"F @uN0*u&~H x?+[OČ]dl$\ la09Z[{n c/IGBhN]-2C?r`j'z9=I֦E&v1y(D*SBu,Nj+MlHJvGN񂝽Xv %̑+TGus Nhz'$fH~)[{RF*3a[-&$? pLSj/ޮ:"LUʬ^Cf@ 3QlEp*Z"A}ɷ-G^G dS'v}dX/v㹹{mK=~; r~NYp 5N>i8 EQ9:qPκ.f8Pv2 `)1QˡDoQZ!{R%<*lJ$%IXs Ÿ3q 5dWz  wԴ 9ZhŨKskaFq/l?$ЉCB x5JX[!jbּJ•TgՉ{4HG ns{iIJzG PI&7F gZ ?u$޵"W.ԗ֥^Fֲμ EtRD p"7X_2},h䕇x#:&[*T_h炖H^![32\MʉW$PD4 t^qi=oՙdM1`XGӁGYAkBehl+op;}QGd []9IkS}۪u)I0jma6Sno&rBÐ`S]/(Wͺ\FɄ4 Z?AsA3/ƤK+?0LW~;ۃ"龰L|8WdceƌR0iJ_g%b0ѯVmp:r¯H}cKwy S=Y3IiPQ l1Fe-9[QvFX\i86i{D,uZg:z=w E5V)<:E#tpN\sQi{3`j ;tn\:B8Z(ʞY)+ z{8iٺ`mf"9"-}*c..COT`c2MG/nmdxb֮.O̳#8+m͋I0}jM (qTNj_-i#bkI 7tJ8 lYFεOE|ˎJ1]0UBBQx7Cm˄4 c; )aEde5N/c>WǷդP~H-;bJyL|,qR` ߔQ(,]7;#nߍU}˞<${>}.tHf\+#MZ CT]]g'k+.!(?躳vX螌kdS2ᅇd RFREt{T <tW֧T]{Zhš1`Nf3%ufqs:T8dQ`E/B{p)wVڧEKS}g&=W^r8]#_g?@zDwHVi`omsn1?"v b0ӽ&$kʠ?rI1HT=N^LЋAzJ}/3"?Wg SV7B>ᑃdv9 3HQ&[dC-<OuIVX޿.PiI7UhYYz^$p!C*̒+Ua 1)Qqp!W!5Pŭ`3 ;o)/+luh?ApxCcr43}MWs~'Ao97iA %wb-J `L0ܔ\moI+1(ƘdN ~W`JCW9ӷE6nzBqr[T uXJvl=a 6ԆҭEˣL$OK/Oɗ],<1o!7ΒEBPrmʍ˫ZYb ۾ȭiDx:~!rAATJt^$x_.Z@s|֩YPHȆ/\jq`^ ԟ~̿ `tAN U 0/A ;r:p'33ӾbT g5Yp=8ߑ"V;``4?FKc4jNeBl_~'<"v0n?nxSu6Ѓ>#Yb7OTdӞ7w?x7[ <~r(ث#5X3ELwc>wcq5gw~99HBoa~pwdQbƑ4Tlcv\f@6dfRJ0g1d)ۊ+ g:[@ц_qNiŠG~:T,u-l9Fb2 >k)| ݴWx\ m\鬕F;>Ln̞a [cLMl`O7幈'U¬k Fā։JjsV^dWa|/;ﴩ~K.iW6,#6 .6Ek[F,lgɔKn۲PWup_LnjqJ@c9d~SeMhLd5*t=jJ3Z36+ҁ_ 9ndZ8)C < ŽfRTMWٿohj-B} g"jTR/UBC DԲsU'"$͐-E?qE7ų4Mk q1\s6=a[׳*d7$i"j'P@tU%'[[u2!rbf0K4 U1̵.]S]>g7/~M'ʏ",ðy2wF_ޓIdXPl }4PGu>Ls"^h;,A)%aǗd_kϬ16ŴVpzωN=0vuG 6պ8  y\*։Q8 THR uoM["\~67Щ#J= qXAĺ|wfQhɻE*^*a\g>f9Zzjbc,>ʽ2wZ @y>0 YZfields/data/RCMexample.rda0000644000176200001440000061114613754255070015137 0ustar liggesusers\yM͢Ih2k"<'Cx{9{9(IH!PI%DL)PBDe,%دG-{9ZkmCQDbŊ(VXb%JggWXbVn u'U:s+pxQ8dَ)ŔVI%앥d=~]?p]]xlFòg=:?x_G/u]/VSC'٪&Z #W 9>_s#;\NUǽӟ~阮/.⽴_湽F2xZ^Y!Nl}q1-0'8LSy}1\{fζr.Ɲ0 ُоd:߻zC#CWB}E2_cBEv.ƮhOw6F="s?'"OJڧ >ۛnG~d~#Ǭ.l̩lZ Y:/Q::= E2 9>uBX>Kɹ)9 }yV`WP'y,-G9oD}wd6k_o?$bѫW2O>C>t#oy=/-OA'kdc\$EȻ@lG6nyUG.Iu{=MczO;ȳ^+I*}Od<%^9*Foo»yi"/FǘWw㐫wcnvn}Y*uV29->C S箥݄qz"dy%cScޱy/;^g. )v ?*#zwwKڡ:]3;:9NUmSw 7 ^:eb?s5!1C__/5h:Ϛۘմ? |@~{ucq @^u+8vm["WK{T?'.uyWdu`j[GHhY@;~\W {"yrroe亩Švu]^n,y_jToyt7|Edy#ˣD:rEbvCdrh{J5?{ =K7qwm?yؽLk?G9y z+~A H;΍4Lw~waO!Ǐٻifj?EwDﮞ|L n]'oVYm'ee>gz[s' vw;{[1N:+h_wN`7Y{X߬/kؽ(),,droTA K;K-a9Apd Rm@>&̦_]ִg^ pzȫx~$PV'4|yW=.lu)5/ ؉Vb*r^\CBeH5Ū?Q'm]9;0kcGOQY]E('^:;ۃ_[; XwX>z6֬~4;#xg}Lӷ62};eѾ/7c?y/oY/~ގhh <'ooީ]e ş`]epEJ~rx8u: _2K0d^S]{o5XrǞH!E}wq?s/OI&k_+|x`:yu'G~k}qcJzG|w#Vov7-c]O𧽋TG䷌D)hڣ`'>xag3/c?2v߈މW=f=y{u&6iq}+b{[oA^z+&/j=Wc;a8:ß<u }z">"gn? c?]49~Ӯ$xة?cYˬ"gNZkS.Gυ)YJ_nёynؕv>\W=8.l;cYAJփ;W;+v w@aGa[=_kX/A~T^ObI Oyw\Eg%vccyoȱGa}|B%9͎-clTb =1}S>c@ثoC:kOF/ڃ&оn`/-sV%}Uu =템gtg"{է? [bW?xB8i=rvlxĿ nd O /8o3?AA7lAޛ\}f]G[ 3}Ymo2dzֿdO;%wI{5Br.v}rl")֑dzSYwOo\7{8Ѿq%K>(m$p:+ǖ(>vwi\|tgG;n+Ɖ[-?H;egOn,BV5NI7cm9cJ#|+e-1;?9d <*eZ,d%O~{ XYaBħEV8[}y'#`*H޷gY!Չne] C:,K88tB#lx ~u%;׿`岮kqޣ.a^#ϟ>Cg~~#c_OyZ'Lbrq_ĮO_춍㹌d#pUvzijNPNI|_"@oXOIɉsO5Dyp]Pr+{>3Ĺ2}Do 8ͺl){ud)7K6_M%= ~4D6].qbN|*<ѷ %LH nNJyI<@pW%>= ӽ-@_M6_C x@|?n|Du^|_9g ~nNi>|xvJNB O$5=6^Y}֍X{p؍/ n/g{᛭>pn:>@>Nt: ˉ/ڧ$o{c/ _ RN_w{>ǿޅWjMﳞΰc;c1>cXbcb#oψƿ|?qc%5JF; Ɠs;qbKǙ7Dpړ=;=G&&N]J ֶR?$fƎVwaX}VS:8U\'uԥ)`w^'^OP xNXGq<8yǮ 悯]AF3w"; Eߞ9ϸ#NOt2?#C}s,E yT.1n ?˨ŏW=58W⢉S{!ߖD_Ꜭv9~窰Y v;;Խ|J}㟊|q{Go.:d? =% eZJ)p+7DF==_>r 'މ OשR]o^co1Oپgg'JqI08-k5uźay?inՓ\:=8K5[d)}o8RBf?t>aGoo //;>wӿ<t.oMy/S!=鿄!nwA;o NW< .%vrɬ4\`o$>d Ot} xp^~}TU'tE'~Dp/q/qsO5qD9ޟ;w7ODG} >)y7n6m Q~A{e^wQ[5oO]l#Oli / ?sb.u9ͼpy ;ng[{v}F]^{1'/#~.\y'W m$?Z+؃A_f&w1yïRm"mƱ߂uܯD'uɯw mK>5yWw܉vEx R}"5o78A&5GN7LE$!~h=?s7Kܩ wwG/K =::q-ߺf>8<ΘYž΍+w>HqݜC9}Jkĸu*Ezi ~=u~qiwnwaڷ¿Hq޿7.Y@~%nY{H+ ?jzd.d8wGxpTYJJ>  [֓cPx xa# Nr#]S#>ח]` Ez(F3a n+TOyۀ炛]O쏽vs^ חɣ7J3?%{^ { 8w [s/7XxN#]]5u^Iɳy+r>՟:x5g=?v=H~<] NwE?gđ݋6*? :L}Wď .~oa}W?0 ;0&8bo0^,k N+: t#yku3Txh /}}!y]p,(7wߋcgwS"v'gq33[xOBN\d<1b߂V=>$6\ppEуf ˘ؽ:.?9gStּ2#~~[' 8x8u'E)yϱY/hwXD:_}—.~wŽe~L偃b?%/#UZ/Cn\ _ Gំ`IoO&d?ljOo'ɧ :A]x3 9U:~4_z7>'Oo{%I%j^c& 7_Owysn@u/@`7/b݈/Yg>ů?_?;(Ex(2P=oOLx-ο#8 gx3y$yثN]YG^)|1m?^f.M-w]ooE{ĚK5z?J^m!^YWX%yуoeݏ~(CSNean qeHeY u<|qqlVpJ~pv_=C3;-εrUo'%I{}/~xS. rat{yΣdݱǯ*`EOͺ] ]Nzyzv6|T#Zk/AMpYگ>P)KIg >gXCwYo4`|>UP <&A+U?޲x?Oc>\W_ {Ura=Ex-$/<ͬRMw{xJ^{w~WO.6›N<}&ᩜj^ L;~!+w"x nP:|A? ?tOL,LJ<ޘx׵#_/uzWLB]'ŕu-8[LNg|~wZ"u|xaj| qu ^EL:oKPJM=] d~_l]Eǵnq.fGyvC<{1LV,{ %uoX&%l;Iu{GׁEF_Bߧ&CMwNeXRS0RW 4qpP^C>_'#o:l\\dp͠X0;8|Z?x\ĵ;dѾ.yzDW:L^'?5,F[g%R'?O Gmڹ"{EpH8-I^r7 λ Ի{&'xLb3hb x@ω>y-؋/W;:7ȍ-]4⧥.npO#gşo? qt1+~'?=z&SN\=&5 ^GĮsnwv|'C-8뜣q 綗~ICG*;Wxv$ Il-bYCx\xձc2?Cȯ~$l;^F/Y{/I٬gV3uYjvxx[ gϊ5l]JEne{+WPeAw ju Oxvg!g '߂G7_0* w O|u~r6Tk,y]WAz;%_#Lk+oı_y]XϽYK7;,^*) b3}[p?,mv3*?`ĥI|&x\GoJ-;N)Z zyt,<&v3=ɼe^FwRwI0ޤOjı#JΧ:Jܼ<_ ?#2||p2x}f֍N<2/潱Njў}P:,|u_y O+ Y.Ϋn旐)ɵ%h-*%>Cَl**x*ჿN<.=XU (q8[b <{ӉK%Bp)Լw(UI'?Go=\}86 _;񕻐ѯDow#~>DCc_KRLΌ |fCbuY*w*f{9$/ש {RGb ϴ KK<qUkwZNoMcXO ~&WZ+X5 F1_{Gg>L-"nz ;;5lǿ_jSJ8fŖc 0wx~BX95Y58_ _cOg _ !\.Į7V  y~w7!/L 1.Er} _5oZ/3>^l7S9g^C"^E[kn?z?121)p93kk%Jq=J3\ :V˿Oķ?`_ >^<0>l:x9+ػ51cĒj&~FW8vK|/y \ 8ޝ~{ |T[K$xݍx}b7ľ/N l78լ+{ YwNV]8bD_.N2z)?+EJ&+5_60/S_qz.K;y!O2/G%^'5<:YNO!7?'e> ?.LEP_߰"MVCn;ע]I N>BW}"yj ~]{-d)'4s7W^OH* uYx-o`xXb9bU|g7Fu&v3J-5_ԖYy58}mc|ڟykO,A/~ O:^(XG[3X#񧬇fЎ  ᇖ'5zBtdQWlց8w1hvj=O-<\T;k*j _&uCW5% KdMO#5qē›ϘhwTqE `;DWN<K~,Z| 'q3?R_{Ur9 gLަc ^'cxg2 OJ׼{9u?%gbR&j]q~SS7\5O*:?f!~nxfşb:/5qcSǬ?lk$k2]V7gWOǾ0yިyeG/bļ0i:eV:.i{28gdxOlH]2*Ko2y= jcצa\>"^z^\j4q#z,MJ1#/f)1g.#ȟXB6C1`?V&և^GAIpȵIxB:o?WYv#Œ%y:u+y!sϒ}|yV]ޗuQև|h蛬q /<#^CuGRS9=I5K]I-<ة<{M%?! ֨w}ú. 6 >U].$-Bz/y|٧ȿmǫ {[G%gK%qbz\/z$j1~-y!aꛩ?dܥ^?ranR&u'n2ᗽ"_:?;qzނ^ +{#מ?kBz?OVIu|r<[u73zɷYG<(|d#4QI,^`~y'LG+yNQNx 3KL_N(֝<M1[ ^{%$Nk#ؚ;Tu<9]i]QCIױoI>wr?ގH}&_o9dTz[ޣXEdw6ݛE^e)mEJ^4 yTUϜWYo\.|3 ЮDo?uWϷ!&כ8qls}S]ɍ{Fp{>._w*N)yfIgrdl廒;}}+]z?>x}-d@{xfibwJeޟ{Z53Xf']7}?AGT_ xT{{sW&oBAcӛ/8xoG).v2yگ~3T}: nv`w#RK}›$h߄m; nm}CZ6=>c˨;5/. y)ѯE~==|h_4zPnSM}ӵHɕ3їCR{bjR^ꂯ.ջHz_ꥆѾkS!uB?n wD`Ƥ.#%a=/G.pGaZ?ѿ_Fwb/DWaDdOaDۋ~8b"|J)z{: |*lGSgSu ?. g}䕘I =!sS7iX=c]3z_%uKĺ/O.S'ji՟a}~A֐.]igE%($x]"3:{xv?JUt4q>v1ꌧYGpSUU|27͒:G5ǙzG_baݰoMR9:|AyGFY{i&yZUe}b}/.Ǿ!?^4>w2u<͑XՈ[$?KE7~E`5{%%sׂGK:'SɏH}CBje)u<5AbA-i9~d?U숒~CVOհW O*l< c%~~sE)_ Ł7~o;Ceԅ)&_'w /|vZr{)o):gs8 ӝ ;"VF{{j/ ׳;??Lk)qlk*za%=>~qi௑ҷbRvH.Rr~w䏐SRW(}`uqVpq)xL\Ny_> 6y>VI]쟙wcg?{&wß7y^q?,ze}dM`I Nl]7qY;]oH&Ka{}}fLyM|=-z{2/9w:ZqU!.W}~qkW:u>fľ3n<~y6LVUპ$d1~4I'k%?) ngZ~Djs7,G݆uђMVkta5zz|hw|M~5e~Wv~.gBcGoZJ6XzSO /ۥy25]o|(\`/dTMWH?`:`| cб%]',x+|m%>ZsӾ}rO{C')K%s!A^zxsy{#7޽N|G:^~֥'k%|D!맙o)cw'\C/|Q|m_^I&HVx%d#߸oL\5^YLUc/-MfYbb} ,<xiE|>}ڲ/JU/u ;na-}*U)ķ* QjpXɧ~u7=EW;#'NEJ6&!]R4zu</5 ,g7"`:/<58}}ap'RLkv㼒`?8L y&(3o[$SKef봿pΟt-e7f4Q= tQC'2w7NԹWޙ7e7}Ľb23%OscFב7?7u& 4\ȋJ@IR⏦* OEJ~| ?JR0ቅ]$U8vxeOp`I{! 2OUgr?ɟ?/O.U['ƒMs@\/ RՓqɦ;:mz8?(\g^YJ&~=f:?:S5+;~ n_Wvo˄},>/߉>"yvSuoFaC~WvoqMdW%o!ueZoK}a7WQ$+ўn &d,xJJ=#HS .kf\\걙}~Z O'|dOY,a܌?h*",Ʉ/y >';Ofe>:)zۣyƒYQF^Ļ />=%%nqɋ0 &>K ϬDPS}ejϦSO17{7 O;.IŬOfoG;Nu<)ÛR'%Սa=6Gn8{E?Dc~Cvf)yz.}1N঩mpSH4P<)!'* bOۦ)~#u<|Iiu״K~F>c lD{=>φ?ܔF'M:#ɳ{;?ף2GI=I|99m2lH^ ;}=罇={DBW-|GbpykS$ސ: F"vDk{>MXws'3˺["Q7Ws #. +~BbՎ&I|<z!o'bͱGcWN9lztsN1o*+[7h/þ_/`]C%/Y?Fs5Vz)%<)|עsDDzE{K~+Zu5"y-Uў.qg鞿)fcWG:~[pG{S.? =(UL;ROlp#I-%?!l&t!`Q=L~&hp]%?I,|ĩ 6^8=7ż:֋䛒9>ٍߑl&e%۲\YSk~sޥ=H<#%1Qi+ѕy~^nF\r'Gv{1?|Ʊ[Oo? 5<6Ү*y'o$RelѽyXTY i%?:_s9O6\޹_ڹN}"Jw%KpI{qkGYؕ3YIz??} Ak0*| W"~wO iǺB hhe?D>e*<㌇t a&FbKlc>WL~٩N̫MW:&G{"/=_N1!:݁|n7'h>kIt@.zk*&$z!ۯ ~n&Ŀፘ<X[.i|څ_5zux#xT&wbe>ρ7n&cc5&C/K޷# ֩^l:%f~ӑDڭϙ8*Z3#̾NqHdtwDv.ˆ+8D;Ώ| >y<2??!,%g҃z Ns2.ӗ``ޤONL"5T_^Ip=|pcYw‡K oPč4^AĻvOp8ߍo?C]OOʾɝG|a:/هn/MނH^zf'bR7v'a$dϐw o_Q;=!uorEOck> };{>8Vy#̯xDGQX !ve8u޺Yѭ3,uj-vw5p1GtksW2f:ah JPλxCd?GTY.y| ]ӫNd)9EJ> 0c=MN_Yl:~^oK<{.r*_j \_KM=YSEB5l#aN7rV'A ѣR5F]pSwx//}F/Wxނ',GM6_IV~{x7}㥅ok+Hl[y|>{;s >{S CO n-vU|)Q(#v UҽUu[c.<˜ԿU$M {y>3 ud_S/O߮'7~gںNB{pn~]8%ek0ں>H}OL]̿2W=ݐvWےzћ$OÑ LጇcӛR=˂?>M JK=VIԭAT:ga?j^oxwr2>vǾ ;  3In%hς_ #ty~z2wO 8oo/b~&%N\#Lx-'#%e_dK{K9?^!ym:*q֝&ح̃+̼7DE2o{[vg~o#^_}= ~'8E60vfjv <~JC,xRIA9~;C/ VI|/m IѮN~ɭ($7OeC$#<o{֖8kjy6w6' ]-sN)w/k4/m4fwgѾkk:nxfݎ#Lꘙ2~cDok3|X].:گ~j]߿Wv?_aE:e/J~5 g=5u]J£bc=hTC"/xgd ^dA"ei/5}^rK?%^f _ o&qԋOlj+T^ _ ?Bu<&Aji5IpDžGLa}9l$0/:?]Aox*mOr%5<=5\8u 鋬/qo:$}~ghaϑ䣘 {𡃙֛ ]BĽlRb/ ^mj'wGO.F{c#]io^̺O :+ı$3I>?{:G-~aS9^9Kq`#yF;]v.@p6#(I^~O~2FpX4K^ p 3퍟 [JwǼI= ygIqoeNvxDuCcnsơ[Qhτ'0>Fg7ߋ /.DW^=.X#p%o|/g x3<rcWp?D^==`ď{c˒j$ϲ9niw?^Ȳ_XksO?ZUD%o &z7OdxE$/z'Ҕ Wpf]J]tN;7b/1&7IX,O7󥆓dwn۾@x(G~{;&:}qW['1yڏ}TO Ϟ{Z_aW/3'.Iͬg&-|o십yٌ#8M`qiuɷ> .luÇ7yM;1pj+0qkz_k&曩 .&`ON_V:57ާ:-w[[8IɗKyߏa<;ηއ[xcFObw>GD˰~D&q/:# vnT2Sy9>5/K݌'YiyIߟფ]u%d,m]O/}*.@3_Qzcp |m]?~d?:'}IOw_r^%bS/iĹf N6TuIzəuL}d#y?-Q.Tw=*y;CA<7H12uGX\Ɲk%F %z?=zQ^>9׃ߘzG;Ŗ.=Ax/uj~Sl킃-f3ݩ#'e-'ڞyvH[gt)b4uz7.yji]h]o[ђĭuݢ[D+'F;FY.qi7=ul" '^\^)>Jo%~^&񯩂:%y"Ykuc 8uj8Kih;GcHWׇV=u' (v_.?=)~v7_k%? {goN{c%u<95R7LXϒPI^^nO|9&>(ޙqI/v6;66< wEN2VUcB|5Sˇgd;YU=J݃H~I4$.z;)y%?"LYsO6F]E߈57ɳ+x:SAV O1S|Ůs2/"%bN˾DGӍn] v(vLjO{1z=5 }yמ1uُ+pm^aG{np:nqd쯠~׿u%}v߇OZ7v̾&|LO}}N~?qpOzfRӑz\Q%3/kzP/}f?ȇ_2n_Axs4ކr\w{wրߛ}nOrPثf_[m?I϶}~Vֻ>a2^ߏx}u9:`4Ox`GG+ȼ}#["Ky@׈'N+`6q̂G2MNWz+Uj(Y~ع]* L|y.~y;x&%ŏ6z\/~u;fJx#nq({^q['aNfg[EM]bg ^%fKX՘:T%OO#>} /ޛNcs^+4G^d;8yM=D~cH]_<7d _ >5'|HcΛ:¯ 5#| Wn܈oK^`OA:QVfm>L5nd]f/^w: ?ϰ.DvY-YEF`Fc}# >|/@'.%1v.%~gjd^ӕ,qLؑ䗿 ulz -RR4&&]YxڪԖE'<K ߛo#K<{Pu~HZs/Kl`ouB @וIz=q ״u>'FeE̓+6G5y :U|^I9gxC$KJf>$Iަ2ͼ םEߺ?-y\ۆ~<ıu|Kyr126{y,yNybXp^pkת{2y[‹Gcb>B |}粞#`YQV-EH{;xatE{JZ#`W8BpdH_#i# *x|@׃ f:1O3-g]Kkd#ui?N*RRI3$/DW6yu'/FoƞO`^4M[};6i:+>uȷ gaX~CD|IU1y[y>Ҋ82\.>MS4i@|M]7ez_ +J湿eNc|Ej]'Eg?_px3|L^<| 68 ' ^&s#83a:(-]W;x9 ܗ4uO4N6u^ Լ {]>Y^m& Ct&-I,re^ĺT )h.(ߓ#eڑi"~vj(ydٟUHu^z3ybO>~U$Y;Z$(ݢ۠bïvs>ospzvʢ_=\g8mɣވ/uOnnKXY/YVo5[ O*/yѷQECF_|z:_4fz_RKu.0} %e^׃˛}=-߽>vO̾}G?:n;>}%ߓ;|#%+2]PK=fCU{E{sr~{/][U!_eS7WICH,bO} zEhyr/o>y ph1f_%~ioO9glct92/!W=h 4T2$qjC%d[dzoF۵{(s묬F/gKǔRnVuNgx05PzjJAuYõ9?|}<᫇IaKV+^ <.xF^vnu:&2/drPu^xrGLOV/MF/{=ۙ^eϿ+%>M<>qyM޾-sgop +пǒwCB=bk^a=*rϮtr619GpN#-BP{qN{%<:~sDeňCYRmkYlu؋VIg]O=^]mvy9C85m&v R%sɴӾ'8r:~oz H:I^p%iJSR L]hwDjw%^l1hmQ{{M ڭVOޚ V'.s->=R6ppz`-<|//y%ª^gl˺`? OI }%|r"'$nnB+ɮ"lgg>:o!%?-Z8*p{SAcRO!Ҟs~VDBl W0I& wГ ^  (nKνEJ6'?2sq]J^K>Q^~9Wze+m-MDX~Vƿif/]0󘼯H=Lܫ2~uٺC5&uSPqGLZeocy:*_z&&"7yZz{Y߳n"웥 ~_o7>Y7q,q_4;<}]]Аxhq~WrC'; %3tF'~Hb.d3v)ydz[3nM,qj^ӫK_CCtkUu|r#;i? #uwc8E&ց?-ׇa)?U?~ ^HUPq!z{fE'~ ^U''H'oTǽw^tVQx^g*!'c ɫHmu%~3]=펓x]5s/E^#,dbg'}G)ۏ uѱ2_SEWg$7Б2Rp%'BCK>CݑvMs_k &wuE-UEpl"";`DkI\C +֒O} h?˂3] | .j| ĭ2#fQR85l6+Yx暺/Swo9ҋe?΃WR']"K䋦BJ'⏇ASa5Mv ` MܴvqQx^fߞW#XQGW>=2 dy|$EnCǣ̴ ϩ"Rckfߝɺn n`zcx'אO\#FGJJӎ3ZMvolمeHS;HcVbH>{]9x ##.&DC%>W7yw)9Mr%3HfE>/R2k58qK_T<;x\ <| B(ńo &?58[ )mAmx0 6>C_xKJ>Zr5~ty7{&[ÓI^ ȼVB;&|(g(r}Cu.u~%cO" ka!': i: [ qW o0h{]&/ć4lG.4 _kY`pqrvQu(> KAw&NQm4C'_>| þwcL&oK|/zO4޶mq[f$~f_ 6Qԁa:2ާ#"xuث&c 6ٗ#@YM?5y?gE?dt_oLz}g>Pfߍiއh^\W}x= X}浃WWNVf)Ǚ]JN?LhB{HcOf ɏDcdnZlFɋz&6lx7~&Z̷SүM>_~rNO nxGRa+y#:{{?߿{/N|Jgɾ*o|oo9ICHߐ8m!_NL<nt~^wUmw~.;k0Q}ķ]dleibf9g8/ _TǵOmTI=GkZ𝬗"u<+^CqVɣ|:/:?zxa6zL4tH?!#_`%`8FA+x&~5v28ou:_dWu@$z>?'f?EiS_Ko'6u1b/6xm;K^WmS!o_G2uOںMoƛfBoD=[s#з^γ|j:#Do1X8b|Xz5b]WfY_y^xVwl^=Y>w vE@]#=a(zt%JN >nscb\&b]=QV+ Opk>K~sWva6˾lj[?Z%^=!]xf{*c'D~kQOHxɳȼZ[j(%?P1 o 3-2ʲ~O>vDz2UApt~X=O,bj?~I9}Sg\6yusT;Gp/b?,y%{)6F^ɿkЛ'&dM[w;2q7/@3u5w_=#gof}0w_cv6&N랬&fxOމ=?a=g9UކoGJ[5qi݅q]mdol %_ɫ{zr <ܐZ_E $ZXdı~!8'!#!3.aəG$.%#W#ۖCT!8SFOtj/⇦Z3ȚNNmzHE3꒏$wH;5AV_ +;N^_ݿZ/v,'*ڗHw}ޛ9z}?{+%v`/&f`y}~¿qƮs2;_<ͶǸOہފVqJ#gw8C 9QéI>ºc&hOߴex}a_ն~$o=OJG[0_RUs;hh3K7A#q(0/#yY#7^#߂~̯[/D|ϿK𲚜Өې̫KKYy5Oܜ%\_X;2yɅ$G/-aFEO!uVto7fD έov :RMh]W)WHjz8$I~{yg$^\5Z ~ {+?55ziU᢯mo6XQ:_9}Hy^p/g~\cfV{/{Tp3nzjW_^Ӱ}=$έ3\82z{ːO1|Tƙ0u<}[7uV`yWg ecg A-o ><&3]oayM&k^: ț.C=+HE6yn!Nc)4*m/fג8pk557zAZG)A; /6ڐ#Z"r!|ȳىtgzE`.zOHA< ;^@7yn\3g˙{qYr!n8W^( Qx5\X]99A<'u^fAw _P t`I{M$[OK2;b.'?#=N[S_#]!<+l7mz!5.JGx{\1{v{ҝni[x~z+ոxwSj_MIcSϽKeU^!$~揮@O}uQ_5o/ٟ^dhb+X'ZA:z(qI=6k=@|BuB]D 8ݺ.5<&KyDΆ?/ĩipnWxdWwruVN%.ϸΞ_=R袏 ;d]b%ːbpk?Tg^;{$8|_y7b+Rrqy&_zԿԗԫu&Ou* h:?$Zvu f^:/L57拿>g_7W&3(魥.7c?jMJSbz)я8eJyx%n  RgnfW3y Sf,xt&ye#L6vpV33^O2y׵W> X7LvpeyօAzkQ_=>ٷZɫ^dz&N[/2Ɵ5gY>ky= _teɛ^:3?ĥJa<2g'ƏLy-K̝ͽkĻu:g6"^친ce?ʺݒy^G;P;*lOƷRxSe3~Zg,k{bWu&6Hvk9~s#KP;:+eK=IR_=Lފ}Ǻ_7u޹gze^e긩oy*7I=C]}Ur<ﺔ<6Ou {~bx?]y]]0 ]Ɠ{-~S(kicl 목Ky(;ĵ.&nox{16gSwp_gxT:)Ege .h&::;ҟl <ݮ MAKF} >o%gʾù}ĭ?ú ~IN]Jf;g/dfK,z;D 2]G[] -xԅwRᗜW<-of>m,yU%$uϕ)`ȴz Yd}d٧Wm?0f_Z~Jه7>},R;{9i$MKf_{TO7zm)q-nw77qX/w|F3K4m!6Δ-s flUs{Vokb1Nn{cxٿV6}k'ፘjԶi;of?ڦЮfg jo;?ߌ#7Ng}se>_Vdl#qer_ri,vowv?|)PxWГC~J ##+y;y D_Ag L|՟zo33Ve^\yZÒOg:/dIZL7^x2GLA&{'y"RM}A>F%/Knih!lzOx> k;tP'"/*9InOpji=Czbz $I=e@;'^uiQnWo'Bx!;(~਱$J?8$%qj^*8v6}9|#k7k=qu~׊|EVѧwQG8gu.2H/H ȪY?B/hI_d^x2?%']yH5ċrs x`ŹoJ+qpO~e/>~9 <3?e$~h)t%ǟA>)zVy ;ܼ6@|:s򕜯yj=+!]zOӼr<+- M~Wyb9m?W`?gȾռ.^ 8^W8{p JMvsfzԔT7RN;$ ,;|U=:o$?/];%?*9[p4 Oo d_Wy_ ⷉ'&&~>8v;t~_bģC.8 X^Wޛ3F ~RX8q_'נz[7HH~{332}N^ٿ/6Ew/y&zfG9O着hoT×8E>o0떙fO>{_;z⏚ƣG>zWa{7&fț4݉=k'WxOi] 7uTwןusw@vϒ_a^([G{ o lSoK.yo9957*J'Yof> >)CN].Dw ^,p8?篙^c6(ٓEaxtagՅM?݊*H?:ٚg.k-i׊u.by٦uRXS\uT_G|Qhg.g{\M8VPKZDu'/UǓ+#u}#d1~$8 RC*xUk ~QWtJ0LݣeGzG9/6 ;9*|86S5}ux1Wk<9;oײ>d?M~ev b|.tEܾKIkGu_Z,)*<47ȍy? oeK\8zU4|k%oLQ5dK^R7ᙖW >|Q[A>~nŽ'>6qi^D'(d+( 4\++C7wsO xn?ps)q}7z-U2;|xY}s~N *qcC2h)MbX>xt)ǣCEs^~"5>g~_(|< ~^'qMָm9Yr{[>+ %.qf>2ܧmO= oHY]}t]ό\d~ pRߏ>?Wa~DƃGML}Sf^nnuRdߞ>Jwp8OYZCaO`a¾ u?rZ]aid/)y|u,ٍz1ɚ_.N+P_yf.A_p끇gwOWſ}M=']Η~g z%ڹ%h{y8vycW'׬WK`uLE~~}RX];#?g'uGℑ9.<<m~W޿蝼! mw}A3LMo+iyU5uG%KI3CY|Am?{LG ?y6xǏ5گv3yHOGk9Q̾ ui=}N 1m\a}o5>'쫡h}4rOM~FQNc+6yߢ׳ewb|.\]`_viYg|νЃOt^\߭SpǮ6ŏZw)Y׽wPr+ _gчɼo ^t! K+d b/\kߜ)G|i-qL}bU;ٺ.C^j7O : yb/\!|/B6[gyHM+^aS_apxdf^uL=ġJ2]G!Gx{88Mx~V~xu`Zy>}RM]eWn.l<,]ne#KSiL%yUrWs/{5צA֓zm?Ȟ(q 3t ^ڥxcw}FItzS _w?^NϮ͉ouv+Uxpsn>S7©߇)| _a3$`>^dp~ .B} 4OMO'|7/A O|+yz#ę &uaY̾:nHr?}I~7-ygz?Vm?af^x6>gA_(u 5^V< ׼2],󗺇'LJĕM~u*i/C|L˿v:R׼1S,o7o m+{ϕњ'v+Ew^|~K/.7awL֑΅5wuڍ}iFdw@;#/wڃqգil ܻsWw.]J}*|J3} {oWa(ߝǪb ~WCo?Xx-sטxX?txM\ 8]M/.5רHpTN_uK}8~d68_xٟs0qO<_Kx;ѓxwzr1w;-LlxDZOݹأnZxf,>DYڱ-7q)"Qz#w<#Lc~^TdǕlC[}3RYxS?%o?}庖Jvޅe{:{i' v)ػ)>ܹ7wuuc7w >(KܪkӕGeתǮ-ћf~-~paطw;wCi\yXڙ-gbϛ::[孻8wުmx:[)_7XWL]ryoH׮iq뎗۩}-uM^8 O\a:⣻2(~5/|5[>78γuK~u_曮n[ǩ%u-qDM]o7yޏU_ǥeݏ`??z>xm5}ĩtz"vq<?bo{RSĭ;?sKx4ܿS>ߩ-7wyw^+9^yb[Jvu35Ι6Ϛ g5:ۑլ]JkK=%ٖ3J)7l~Jj^O-oY;7}Jj>8|ju@~_:jQ* 6jlΧiW]עo_臐4KVk6=̩2JEgjycjeu~-}oy-q|čKl939 筨K{yZ~_>wBCYmE^kud\7Z]}=5n:ҾAZ;۪,۪Q1UGkO[_?~>g~}ߗ~}߷~{~{﫿|=E=M?=UƯf|ǿz~'=|OG=?|my*_`.܋|W] ݻ\-|TWVe[URyV* &Fdjzvef{mmKwzV?ې{La|VpH~GQ獾q}^O_=ϫ_տ_~Oާ~}>{刺{ǃzɌ/=QO=^Yoz燞/z痞o2|4Sߪ4ufu?69kv\YtM|ק=lSբ~핑ɒ-EݿE>l3u~nV [Vx7oKwZ>;:}O-1.[gx*оAgZ5DݯU[>V׷J~ ?1fz{!w"r3wڜw!۔???m}\O}<׿G>{CS_C^>S_A=^I/=dhƧzǷz C3|K7=|ko뛽 f++٣;W֍wg0qV5;-J,Ը-~Oߛ9>{*{?SN}Vp|cڣ}^| ǿ܅򘂑ډuѬV7+=U]Ȉ*pV@RZ=YUVcWک{-}gX?[{߶% Y/t;樿Ӻuop/\p45DyZvCo¬ַpY|q}^O_=ϫ_}߯߇~?}ߧ~}>{刺{=^I/=QOzǷz燞/z|7=|S۫4|~V}Vlf_X|49Q{e۬4ϧ޷?!{)Z^^nGlAWr蝜77_W0ݙy|Z ^sXZ6sj{GyΖjK~e8x^?:Ύ[Ej]u]k yo|&اf>u9q{*vnnei߿I֏IVjzǎ gd2_}qkq}^O_=ϫ_տ_~OOy}>{刺{ǃzɌ/=QO=^Yoz燞/z7=|S׾D7Vݥ~W~@FZ(x }py7<^4\}Hݯeyo6v[ˇZ^Y+}S'[5[Ew+wތkoK?>[=勵ﭿz|ǏOz|G3>xWg=x_惞f瓞_zO=_j:͇q[[x7r{o1FkD~*{7]~e|ז?t@j⧼ƿ _;yRjvϜE61oCYȎy*zQVo^҇Nq|8e* 68OϟS}۔ŞjSa:MU$MMEOjsz ilYm]ڴ=>x'p6]~?Wg[}w xG'=xOG=>e^g=x_=?|瓙_z磞z^qo~Lô_#zqq߿PќZ;#{ϯk9U<)BVF;h罆cZ4U޳{72,ۇV׷?zZ pڬʝdӊ}{M\N\h7YmnTa6ͪ9W@=g;0wƝmq|3.>yos>뿧~|yߣߏ~_߯oG/WoxC?K7=xSW=~xǻz>狞?z>%M?3iw* um[ JuQD*z>ϗ_?~>ѿO^{_Gd-%5̒333efffff;l9fvBY+!2|(/ʏ|)oʟ~/?Sx!~'xS'J7NK{Pw D=>r}\va-%~xW=顗W_'3_Xw-44GEcr7mPYځuҵ!_ ,~K?N}_:erV)S8h~-RoxS}@{q{[}A;u~|3,9yA=<ŷd[@1Ko74++n*i k6D@uj)=O~%RGyR7O}P?G}R7ć C<_G<į3MEڏП+{i%o/^쬏`zx#KLX?)ez~m''SjG/qj at<|o^_G dȟR 2yAV-tTK>8ݪ[ˋrכ 8R7m~=op>p.e/"]1ҍm;G nHi:s!ȷWxVy@~hO/ioj}HV4>R}(׫'\o4Wox^B?.o Vit>X|g/jN/{AkQ ~NwWgļϨ_gn dޮ_)&yJY>囟|,X?ۓ%CyQ~'KySC}Qox >x"7?@|/L|?>~hO/O#S"q%zKI|eG(eYz]V_Gy7?qx-|z }LL2bAI_ޠcb"z`k^|to|Cz.]U=|Zv^c<嗫^ޯH~_Rmu@/G??Ń<  "= f|r,_ν6/}7b'Aos?"޾OnȂ燀g+@ҜY_z/~WFg _eՇ_ku0KMwoϗ] F/PCg7~{ynxuBwrg|,X?c_/OyP>GyR/P?G}R7O< #G<kĻ?A{О}yI{M(z}j/J'Lvr} >[E=VcC?6>q0% & K8L/y1^u\t.#|uN4_eލtz~.=>ůN[oC -؊|벂(~G.g{'ȣoºR`wY#'ޅ #5h1Vig~g}}C$_cʃ(?ʓ)?OW'!/MxT$^_&މie/Fi|*{^&yxf?R_Gp/৤q~qj&%| }k&|?(^j6UҏZepsAc]ow%~p6OaϹHoϿh~K<Ώ,D-~ o;:a,=ߧ50K(?\lqGf?Y~#a_|(/)?SɗOEx"7x$>%^ L|?A{h_7sOѿFSOAQ?VS'p+#2(cq#|w_G.N9b[|/>b^G\z8h=N^a}8?7Pao5^.\S?A_2yYÙX[yWh;Yc~/qWgDz w}SYg{l?Ke)ʇ(Oʗ>Ox!~$/7x$>Wx&i yhOګҩkFӿOf8c ˾7=~f/ަƹy Pn,}\NyX,lIIoEKtȗ܉*yZ/K_4cM<]oߒ밖9%]iY~#cU)ʇ(OʗO_[x >x"7OTx%~gx'=>~hO/Ns=ï?y/i,z){;(/<|a@-~|\Y^K=;5zZ_f{8ގ:zs8 "'Q(e-0߲.!M^KHg;ђsQ >Ki-xow%ɖPSoBH?Z_0R!5N=x"Gx%~go~OhIMI{- 7tyʢë߿q[ }Sc{>rF| !o{>&7j=|M,%.Xz_ǗYfyQz@`w,\̠p~toK5xqj,=ߡ\Z2*2~ c|~eR_x[cYVoɲ뚃uSN=b1Msx, aC/Wtv=i p92^Cȍ{k;-d#6~%8j ax@|GBZVB}qز /P\|>AY#x [c YaњVo7Y'[}pk"Xk=,{4sYg{lHȯa_|(/ʏ|)oʟ~/~ox >x"Gx%~gye $KhOk>ĉ2כ2k,@@6ߌgUI&_x~Ġ\!COrz* L@vOtmzsF*_q^_J?s jXpU/'-%gq{{: , A7D=>߁GXu8kEZ_˚b571NuoH|+yWBuv69Hk=z?V,[B7=v~*=O~%CyQ~'KyKSJ?G}R7O< C<_G<ī/MEڏڏ}hGiW߳v>E`=ͯ&̍p"#/>G_z#`= !wR\:} nk?KHF\ix q[,g鏸߀\.'O K1x>Frr%Y[.> 5~{dklWϚ #يrQXO`f=5`i={HiXzPig~g}}C/g?<(ʋ<)_ʛ>>_x >^"ވ?$^_&މijB=Ѿhoh>i]/(X'smiLZ?CjH9j_X<|~~uxQSe9\A {kM˼z.xYjx i=8NZ uӷ.@[J>[7¯ c8d={2xf, Ǭo_!vaQB/gF/gѶx?5'@|2[?Yٞj?Ke)ʇ(OʗOx!7x$>Wx&w@p?x/(Sq}y^F~C&|_4{]'y~F?Ӗ n9>K3E~O=kOdVmM(^S#>TJ}[zC<z)Uނ[^XMD9~n`f}Y_8@oE=py6SgK[j+mO`˒ s`jYl#NW4mG8i+xOig~g}}C/g?WP(?ʓ)? ^x#O%o=>h/ړ/F=>i'Eα!Lە`cMM_XmMy,c(ocIЃrrI'=>r%u*7j+u6+oP_hr ?K[ͱUy#[u#e9V!ixFX5&NsYg{l?Ke)ʇ(O)_5^Ox!~'x#GO}'~gx'i DI=*v!ez &AX#FI ׶r~10ﹿە)*𛰖X|+7m[5?]X ƹ55ۆqr~yx;'Kc3CT>կνF6W>[dQ+i[{9VB=/:[oY_@`ix`Q8g'@Ow~2ڦ4M=43?˳>>!?SEQ/MSԏIR?@|/D|oH|/8GoW@~hO/(Vyv.(ܒXGq?\Z9i ?g^ys4ޖ~"XV Evm5qE֐AШgL?/m+mӠ8Og[wFĶql;wc k; av"NY?Y~#a_|(/ʏ|)oʟ~/~x!~'x#Gx%~g[W@~hO/H|zS0/B=r}{2~ aۢ_㜚5%@|Zk.7V߬-q<Xׅ^'oocb}8HیurT/qx:Uo ۮVql"Kx޵-`߷Y8Gd[ ?j6D>Nv5;ήB.} ?+KH5PKfE;6 jY?Y~#a_|(/ʏ|)oʟ~/~ox ^~'x#Gx%~gx'i>h/~hO/HQ7}4 duH{f%F%GAgiD:ԩ (O<ߖDr΄zi/?p?^~Zd=gcϊ=ɞwycþ=?G `^[Oig~g}}C/gd_ʃ(?ʓ)? ^IxS#O%o=>h/~hOʾho?#y=<\z9cٜ/B;0 _ s"(u֣G/Bjx^wX8j4^`60ޞmFkAHVWpVO^מԷr̈k5C^*PPz=tE"<]^va!_-k+{CV*=O~%CyQ~R7O}P?G}R7O< C<_?OWx&w@~hOҾhohOpĕPw~¹2Gߒ[!nǐ2xUQϞSQ!'hZS~EܜZi9zqtD{NyϹlk{sw#vsIMoמ&sA^{ _q3ձ.d&8GaoU=ly{N>Pπ1H߇}aѸ>c|f)=O~%CyQ~'KySԇG}R7O< C<_G<jx&w@~hO/ڛ?ڣO&~:õŹr+,үTIЈxO.zq*<5zmq ;9)O/o _i!煔?g#>m+)mGvql/E{lz}v%{zy{G9O^qհd'{Kw>'paTgc¾Y}O*!.}1^5( N}g'~J=#? AOY~#a_|(/ʏ|)oʟ~/~o_Px!~'x#Gx%~gxWz DhO+gluV[ði8n֮Sv߷͂'?<_̌8ʿ)$r >F_ӅWίl@//ϸ)%"v-Q˖z=NE׋a_ v nOeDK/~"?v!+W~Zm>hNz)͈, Ȇ9p7 WssȀ<43?˳>>!?AP^IRޔ?AP_IR?@|/?ēF'J7N}^Оh_7I{c~N)|~lCbi_%~g??WG~DglCߣ3_";8:m\O{!.oK=~[@U@9'cp?}&xߓ~bΏ2g#Ou$eN{'2\m@z "@@ M/^޻}h/_~P*Qo5@<ယ8P+UOig~g}}C/g?<(KO'(_ʛ>>_'!/7O<+K<;O{}^(:G{}^Fx;Cb%5t@<POh/\CX7 6G .^(i/~0}*=O~%CyQ~'KySRԏG}R7O< C<_Ga"=wU-CT>aܯ8>~Ny^ lJC\gxҊA{)8g_8͈`?8\?Q> U9-D?bU߻X h@G@g+Da0hJ7/`zU37D;`ï7` 6`6`Kێ;]r|=}[SYg{l?Ke)ʇ(Oʗ>_ox >x"7x$>W_Yx'i D{.Q'u=z;ay#˨1~A0mnѐ# (#Qr?v r6s9ڣ)H]@z}r#Nj+ AܝXO mtrH̏&#>UJxk{Vo7YՓXG 8W0 ya$<ˍv^"Nek x{G9x||v43?˳>>!?SEQ/MSEQ/-BOF'J7$=>h/F=r~.zSSrܖ jR/\Pĕȷ2ҟr {xoZl*ztQX>Oq}bf~xރ7 'Y (pw7~C ^|l 󥀍( #͑,u!M9d_W|ƱzVy$)^6hz=wfk ~{ 穄t ?Y~#_Se)ʇ(OʗOCEOF'J7NK{}({Оh_7I{z;.b6-p>0^[l|®oGB8OjwDz1q7?z w~܏Q'ȉ}ɀR٠_CH7|;>_+pV}_|k9\W{4j8^O`FV 2?!U߉({F=>i@z n[{:o χÿ(p86 c!=UYg{l?Ke)ʇ(Oʗ>~/~ox >x"7wOWx&w@~=9G{}^k!N:Ixuے]P?Ǻ;ǯ\?!;"ޒ/fXHsqҜyp?_5J|\I߶"{u(w2?;9 QO&ʠ>9sZVz_ l W32 to1pq]W:p-֧7^w\R.7p/3a7C h/Kڛi![y/Qy<(y >ڒ \3GMr=m&ܨVoɋrG9s>/um L{s4Vǀz8wXMcOzr!߬xO @}[{҇x*́rx-}rFww󓁟~A_d)=O~%CyQ~'KySC}Q'+M+< C<_G<++L|+C{}ޤqO+ϻMyOF8$xޞIv;|=؇u HKn&O8/ {wptiz=_C_=yO:LCZ'//#=|NA"\{_w NWࡂwq.Dc%} s;Zdv:ҿud|ȃ{(p_#?T: XGKRig~g}}C/aTʃ(?ʓ)?AC;C<_G<+K<ĿC{}hGi_qö mO?-q}gW@"7ڻo!2}-ׯϞ)T8g{}+"sj}{`C} ]"8W7'ܯxCGvzͤw6ؗt伉;y\O::_H/ᨌvj39 j@.ӡ񼁬ig~g}}C/g?<()/5<)_ʛ>>_'xRy$^_&މie/F=>i^8f{)ϷNƷQq7!'η:C]ۿnC?}Oۢ*IVWOr~_~ϸ>}x [Zv|ndu3.p;/WW:#UFĉt\wdyW߿ב>4G Ѓq4:99! Ƒ^Po?1hex> cӀ.pL}8&#.c2ITYg{l?Ke)ʇ(Oʗ>~/~ox >x"7?^G|/L|Ŀ- iڇڏ'G{}^lpϒ:O;n M] O\CDCv~5!4ӣKpn%R2<*}Hsw7w8 +#qٱ_(2Coa|E߳z&G ^::a%q>Վ'U5 CBٱ*lw;8vx~,;Dh~?6 xM;>wOig~g}}C/g?<(ʋ<)_ʛ>/O ^"ވ?QxU%o=>h/iOF=>iḃh׀Yӂr>Aߖ?ӱ?91L{!WrOW9Z줜WݒT|أDWPC?9 KUQz pN4vi?W!H{8?gtzK>-Ekuy:~|3ƥؽ3Δ?^gyUg{l?Ke)ʇ(OʗOWWx >x"7x$>W_Yx'i DFSH4oCvZ_Y)Xg 덷95W\Џ!DFqA|Z/x́ø!Zs#9?Ewz{f._G/q _c-={3#{wV_o$@>¹wg%8cKRoשMv&Lq3SjlRċ ,ij~%k&_+\){I~9kq>1~K䛇{$k8DB}I|΄?9#xO{)i?rXgQeY)1U笝zXr6x%fmn~t@J{gy'?cʃ<)_ʛ>>_'EG_ěH|/L|?A{Оh_7QڧO1]ίҿ]+i^gnOo7@=_'!/x$>^_&މ"F=>i<.q1Fr>H'l{{F##r~,=vf>ߡ7r-s!w\B=-tFOiyǗU%SFtwNA\9VHJ{p(e犢5;b>|_<=p~wy|`_2 >ˈ.SKI)ؾ_/OyP>GyR7O}P?G}JRJA?E#)J*<;O{}^h?'i_7eG'p&7.5ܟw~^>ē * >K?VvA>'scgȇ oCA".Z"ıw(z{j|q4 :bޣ{[8[}s28@=SHos4< s/A?w ./Ǖ+Gϕm'yĽ8/*8._v{#c_|~N=ioo#P~'|(se9@9*].~{΂oKB=GE->2 cUI<߇j=B|u{ŝ8-Sps,Sj1ʡ<{]1I~b?{.hfĝr坌|.'c3pU}T5\uS6*rp q\0uu8ꄸ.o ΛSYg{l?Ke)ʇSʗOx!7x$>Wx&=?-A{Оh_7C{Dj?Cet>~uܧsps'-p ߼\8?8o<ȅ-/%kN͏n:qݙ!'%(o[7go+ϓr=ĵq=SW>)@!ޝ+w1^W6xn+Wީ窋)]͓K~u ] :p\隞g#>kjKqk%]+'"/[G*=O~%CyQ~'KyKSJ?G}R7O< CWx&wsi^h?'G{ۯg56q>x>;?DGU}Ph ߻iQ Qeq/γ:!÷ux~Oig~g}}C/g?<(ʋ<)_ʛ>/O ^"$~W_&މ"GӾho?#Zx'üHůϕ?de܀{y:sy+];@\OW/B\'=N{$O }o8\"(63 'be+g *B㭠(BAe|>SYg{l?K<|(/ʏ|)oʟ~/~o_A/D|oH|{N|?A{О})8I{y53s2@a ~_yD{:."]c79?6c=ƙzNYܿl{}C 坳ܦxS|:S9ruVW IwFJWWJz}yZk/\gz*O߶pLP2IeB٠|A%j0? |7_,$^'x#Gx%~go5?'i DFSH<Dҏx w9\?Yj{d7T__~'%8yWRiU-*d˻ }s>$ Na|> >=2T^PKIuΌq~8hH-{.`<4 :-,0O Z7$_om횊^|,X?c_/OyP>GyRS?G}R7O< #D|)#I3M Dx~MڧW0~]+@5_X|2y>PG%8J8ˍB#?i3?~+^Np=Wumv͌MżDr~w;(yOjg/La|PUoPj4ÿ@y\''C}s1 Zl\򴯃1^pC=O#r 蛙>'#b}J=>!_?AP^IRޔ?AP_)K}+BOF%o=>:E{i=RRƓQr95ܿo<#=ӿ-|8F?VyzV74?"n?~;_>_d7hzy:nQAP~<|/h}A|`Ч\~!MȂy;C`_\mP4䯆q\p{WׇdpCܨAY~#a__C(/ʏ|)oʟ~/~o_Px!~'x#GSUx&w@~=7I{soN폟BՒA-U8j}+:t=tĥBpoHG|{]ЁSN?Kq*x-/N+rp9{>39 >43?˳>>!?SEQ/-O}(P_IR?@|/_ oH|/L|KhE{ah~5vze[]yPįs6z ѿNqȃҼ-j=G\PMKEy~Or+r#Vr=u<`E'8cq M۫飷\O{Ga?W}߈k(w½!hWB_1 ^H<'!+ 1} CLMk{gy'g{}C/g?<(ʋ<)_ʛ>/O ^x#O%o8i^h?''ڹ޾NB<8@=]kQ-C'zT ɸs`}9$\Hį )'C|X_b<7$" 8LY~#_Se)ʇ(OʗO_[x >x"7OQ/L|?AEE{}^6#2>_Eƻ[A看S؏p1Joו>>O+ogOuϋyO>Aq?A/ҿ-v@eA7wTýA_Pr׏: 9\x~p/[H>_[xP ^"ވ?x%~o=>h/~hOʾho?#x27:o*՝!àBD9GT8.&wp yxu>r?M1?S3?}`m)Og~V|:S+!qprH"'W~ EWCz6?^H ~M(GL2#t[<_R!=v(65ʯjȆ9=O~%CyQ~/O}P?G}R7O</ďE#IJ ;O{}^h?Ҟh_hG'5T8ƇU| un=}΋\9;M:yG' z%z^BJX]T)c#N$h'|'|NCM7a|7G/3 $!%B\ːJ;0=p1$ !"d2{P".琍8"A9.>A{WރބW=ˆ<\ċy>#>s=Rig~g}}C/g?<(ʋ<)_ʛPN}Q'K}SA?Ox#Gx%~go]@~hOҾhohO/#W^s3T:1ogA|DiqW[Roz{8yӠ-D< [ 2|P^n*`gyrW&{8ϧ_W ?kqB|BSC^TO|?$weϐ187GQ 9{&MдO*{X7_BC"]ꩀybhĝ x59ZX'Sig~g}}C/g?__Ƀ(?ʓ)?SV'!/MxT$^_&މie/FYiz0>t:Wԛv=ٮJK {P5_n[z;AeOJ~r\|xFw Yҏ7}|!z=j&'@ }Cg߫/o41gj=GS?/-0POw~ȡYZCXg Lp65chO ۆ:9ޏAܜqNx?tR'[Y~#a_|(?%OʗO'>x"7x$^~gx'i>|C{}hGiWuli7> :C=zWi c u)G :v J-,\ϬBF^ߛzz4_k@Uϯ{`ƃ#d_mЋw ;|{jǹ}z{&ax2Fzp'teԷ㡫'1o{4yÇR?>u)TYg{l?Ke)ʇ(O)_[ɟ~/~oxPD|oH|&މjgChOir3Bx*Tz\m(.qW. =fj?s߷" '?W|a__ΏKWqY Y:˩ytB`"$F!ƫzO%^ޫp6wόc: H˱^93ޢ\C 7C}}wA ~e: 3G~[a D#̫ig~Y'?cʃ(?ʓ)}? ^$~'/#O~?A{H{}){i2A3>j&E?WȌC8|ȯO5,Q z)ҏg?D'/Rje'<_zx.{q$4[|vI[x-(Oӱ m7zޞ(_KPXJe4X>ܻVSa%^Vrg'?0{|,X?c_?CyQ~'KySC}I;K}SA?ēė#Gx%~ghIڗ:oN=>i·/㽪w"8(O?GT_/(,o}x.)jmw5x($#noWopC7ӆf¾Lh +Rz|r(Cg ]9^=}Rk/ 4M΁?ܫ0߰*@kAFˆty筨+u/t97J=|Gį Iz'Z< wB>>_iYzF?\p9 ClVK, uЏ8WƷpTXN>_'$>"ވ??<߉gx'iDh>iz*~{~yKt>*<_G=2;W>WsyM V6<:s8_JKd4$ m眿͗:\=\;I;_5~N&2ǯr8B{5f&%] ܳ DZς/A_WU}߽yRdwo#sr7+ahGW?P_:~;z񥸾ևҟýa!X?Qߗ t\o/lr.?~؉2wب#5! O{B"΄ _qx_R2jz5yKHC<~J=KOQ7O< #D|)#I3%i Gړ:_N{iWS+~Cv_ڷ/;Wo N5끌P^i2Bm#=/y#q|_:6뱯q?sh^+[Wb(|*qK~1Gܫ8o~vʝcާ|,X?c_/OyP>'I*ySC}Q'K}K  C<_'H|*3MK DFSH2~;o9>ZuOu^=~yu{e_<}K*X\ȉq3ȷ~[H_aF7.~++ D9CqZ6Eo'l&ᱰn78窾_q{8}WwiOz|XzW¿/)".G$\!G q.#4ܻ9>֯c_/OyP>GyR?C}Q'K}SăC<_G</L|ĿڇE{G{TI{}9˘_ƗV UXNH,Ӆdmp{oпe__'?y߁sW_J(/_Z޹?3·] Xg{sYg{l?K<|(/ʏ|)oʟ~/?>OR?@|/ďF'JJ< ?A{ΓӾho?#o9\?Wm>qQS7ýc!ׁv92A< /G[- UUza]1TqU߆{a=A˩68>᳎oD<5 ןlzyWQWXzX?qGD u|?ϗ];e1o:r Gy'{gy'?cʃ<)_ʛ>>~~=O< Ch/KRFS-sοs?Bٳ傈R -?Ƃ#4zwyC禂]Fez܈î;4Tp=:Fxz:<_WLx> $/HARw##«?7{V6c+x }ϟ*xz?.{gy'?cʃ(?SʗV>>_[xP ^"$|$^_xWjh J=>i\_9s|ʞwҟnȱOlߠ?{e^^uwqVe(߹u#]&3gVu~w|ee"ƗXsFL4&俌\M̑q!Ȅ_')Ȕt|,X?c%CyQ~'KyKSJ?G}R7/@|(?Eʿx%~gxW DR-ߴG'oQqs6O=xUzOƿz?J*~O/$\o\8joG φ^c#{>mt^ϯc`D_BFƶ#={js4Efĸ.2+-EddyˆY"ucY|BOig~g}}C/gdx<(ʋ<)_ʛ>~|>_'G"ވ?QS_#~gx'=>~hOʾq|71k?(۹09^ WJ}:C[$DysKyP(럟B?, ??u9oMq"9=>\qq?('帔h~Y:|FגּKOQ7O<ċE#Iij7N}peҾho?qo+4_:97gƻp>0x<?Uqi\ĹP\wNt39^x_}qW#2Wr|8 # }nP͗q#T[~rU-wp!2H҈Gz~Yj'A;qLd:,omȶ%SYg{l?Ke)ʇ<|)oʟ~/x!~'I)'JJ<;O{}H{QM{}hGq-_*ϿTq=ws~6x"$ޔ;H|/,Λoi_7Q'U?U%!Wq}y\ |9*F(fCȣ%oo [?/pC8Oʟ!hY/1hO0_\?_Of|Y8R2#" EE١9;)Ut~"gF}sp0r\ϗBz/ȿ4-sYg{l?Ke)ʇ(OʗWEQ/MK< /D|oʟ$^_xWh ohGڧWz(^:_"Ϗ)7p?oܯ68xOg$ĺ}9{ Su~Ё=0]"ދDuR0T/xxj,^zorjSٳ::_9#ꛉ lޯv7J܆B@<=Ҏo0`M??H ?Y~#a_|(/ʏ|)oʟOEx"7OTx%~gxWM~hO\?H&WKx~ C=<#HݢD}Nqf<5ݞBw>Ä/rȴIaX9k/^x9=ZxMʙ?OE^(Jwٽi3a [޿^.Yzb}w LS{LOH5eT N`0yeҼ0zI߇0U5 Ӡ ;骵&̋˴qϛdCn"qob9-?g=KhMK/Ǫ;־3wr'~Ò sLkEza>l37c_ UG]:UaL'ϴtLx]D#㶃ƏO]?20^[6=phi[>BK^xT쬥c׍hXA=;|Q~67i5V\v{a4|Bf+B~7_q~'ն0,L?X`|Goa+1T8P0>ޭ8A"m c Z-|j]ܷʨ&4Oo-\ i0:<{҆nQ>aAqVZgŚǭ-kfX>nd Ԭ4Uw=Za68_@h)[mo뉲a4栗jFmntBya&9:W! csݙ'r0}vۃ47RUn~bOeęγⰡyüM*LRl.Xa S |_177uӿj'lpڭ7S2 SO),.t2vmߟb]vX>{YvpcaJ{څӄ)dx}{ 㗤O c5~E?n>0c5: q搋{۹^Z;j;,ߘwT>hޏwu9\=iU?ѾdOOVƮ' 6.u0p=?WVyt4_f<)1TKr_ݏm\<{H[a6 ;{}*MF ;76Sx o!»ik5zz^|J츔𱾼<׋?%B?^9wx=w_ѝŅɰbFMteo-?^=tXbcΧ rʢ=KRGw ^F3 ,Lx4,4;sU6}wVhmmrS7޷ ^~Ҏ.<+]^j\86n/„lQs麾#k0m\PV»e;qۇy ,Gx5(<40xj=~ q °+A]Nec_7uS7V"ӑ,DϯԨ0RWJvH_ng&GmCax-U[mFYn>؞ϯq>MOuXqc*XiJ -8\?z@ݟNB7|)gI60Y1z+-\+sS7WPQ{2v]( qF$.5 & ӈ|kcR=}|5|]eokn O߭t ^ #鸵Pn?5Z2{P㤥פ '~Ov~l0h=]%|tu]1ioUUO"976ẕ81Eiw#o6Z<'!?..|^>bn?Q/;B) %5d|Q\W M'=!ts(YJ]v>lkoQd Za=Jary,_lş7uS7TNsީ/ _(0 JxY1Ο0nC tfo'SmPhW?knvwڇ1mWqn6q&_')z1Ο勇%M .Yod>+˪,L߮/L6sS7uFT10^93atJ L)=8nn<ͯ-L~V~~P $w{)f 8S[[esM( )1s0^x& ]r|t0_XFhKֶMU+ǿA{'V݄iK"[[Ix/Yǽ0cȒ gO_7 ^]# H0yI>Z ceV &v(W>צ9h<XtaJF[Pw0^J8o.$ aiuύ!:GƉzLnCYLjOj&^jMwS7]Bm6a\(xna8UpYio,l<aXD؎ij\(\|ngP*}q>]oG>[ZP5(ŲCml^xRܼyښwW%o?,Nlź"H%} ʳ*S\x6=0Qia?[Deڜse3zP oƸ\?jKt9-zAT#0]4?QDMwI$QD9& J3='zμVt°訹fNXa]:mɓ(H8ƚG ϨϷ S;{ ?yNh6QY^$63vaW|񸛺韂ж._GŞޞɱsKfah w4"*vv|Dļ\M簾/iUZ8OuƟ4MnmBt~BguUuc/7uS7uS7u?YB[مO.'U(|\7=l~;|y>b|J-W<Gh -Y) W Y.~ 󃫺שB=p̋>q[I}FxMokG;=3L'|JZ~_ey0]e͢O͗zG1ΧgSs)-wx"_ۻMh3(fe1EΜ`;NhNh4Ђ"&lK1ޟ? -gKc7Z)v -V=UZQ~YMhcEZ_~-qF+ y:kAtfM_1"a0_ §xgm;<\}O9٘3gqߍ_/?{܁KRcW>a1go sNjo|%]\=WQm#3)N90 ?YaVy;yB]_w[+g_qx/jvT>u.WO]L5QO)B[ܹB17sQmYQ!O3WOfצ%'cwn+LC\ SAVW"L#'p;#9ÙυO ogĝpStj#07J{B+?xl~m۷BKSz?,7$' ?ߵF$M1g%a*QKÅqqV=[ mr{4Іxٹq=Rn}yd7z,|*mZnxx)е0>rwKh/]ggJ+L/KU4驸*D]׺0M\7R'M/yFS!r_ 6n_ٜ\en{YwV0KԊI1ηgPSM*7^*QҜm9\ED71ە|Ts> /kX"LKݦks! ӽؕ+Ueo:W:}Tka0}0?4|Ie.1]gtu0?qQ5~_.L-N6|+LAGj;>::Y /.stDheډiwvY!|"ZL|[omZE_+̭ʞLy0;]j=>go-LCM+>n)Oz q0u\8^CoaB2VІn*&RJ$5zƂaTk47 ok},-״uqhOQhG|Q'晹<8x+ sSs}汛WN~&f\[s0*=PvX\)+9w樇; t'|o?:zHӯv=t*ۏ fYOb?;ޝ,hq+nev1ϟíC+ i~ތvsx2C KӪ/aZv+߀aoj6C .&_mq7:&/ jه^gy~1Jgx[Uѭ%Sn'<&T{=o̳vmũ\c>Nտ֘ZoJH/^M'oNOscn<}/Y}&nH5t]=/O-z\*L!yv=.̅6՛mk^aeUFwRnuls+,ƛ 3uۯ6Ĵ ;*ճ=^/a5( w2[N}a9ߢ#1otϜ8v֖BpWG?EMڦi,M -˚Ͽ:L.|*Qk1d:z߄ji<6F{[Ѡ}ZobYra`}oda_CB+|yT'yʆ~ߤ*k'߼>fsrtbl4٫Αyc\rwmkՄ3*z7]hϩ1/+{7*O5e_]Gh׺71hޕ]wwJgn09sXv=:KJ[?= ,0p_n2І?^mk1}-=jvPRӸ\/{ WaUUl6D^>/Ya|h녩mʹ:v@ u[bˋPDZ'4֌="N'5/>A$BS;;B;~mx'AٛN<"u=SkI =/~ռf;avb0[vbtۘʧ* 4,kF;VU=5" 7Ko_9;Qb\a~q=6eR-8T{ucS˿&:嚽@hM-[=-k6qvmhk/84j+,u̱yəfVdD۾̷,s[ImmeyRW*|\9Mh]fCߞgO=Ms -Iowv $xCM X sOdyO#6]i/8nT0fmꝓei aDrU w{oxF %Q1{=+<鲼3M;Xa{x:”݇JS cU-|~.L{4Ghjo^}qs73?"I/K5z|u{ioW ӢCI+vlZ'{=ַqNC\~АAg>9:\hOK"ѨMϣM.R0j\.;Vw beŊơou;a B.N߭ӯ4汕^n5SFzLN19S>+YA.]sE:3[㹗mZ$%|y??YFgMV0l\5a*lÄβs酹eWF3`{8vš@ˈbBXӎ3^ebQ_ VF˓/-IZYo@4kGٕ{|'>´<2Ki\7&= SՎ[Y90_60 ]sO?}zZqx#mj]`JjՄzE;ONם5}l3O{4(폷z[ E4/]"w7=]hʎ?o=iG}=ZiTp&JhZN7U1m4hN*<ZqZ mr>~}bDx+8WkSl],z^7l1)O݆qj FqsFa|wg,œP+-K㷎~٨V!3iuވS û?u=ƜtZ?z l߈~?B; Uv]0*or4+|F|0**ΉhkOܙy k}WS gƐocϿU}m}o5=b&9ӄTkڛ፽ZNg -+;E;+ ,CSZ[=چMQt䈖Vs\ N6ՄO?/5nDdm~ΏQ F6-G *,[.Z}J_f'k2W(*[Ʈ^^|)-[?M~vn&ar |aJ#Waʺu<ل)Y׼B_F/ O00F Z-k*=H|;O1Ͽկ8ĽPmxH_357Xy;N§Kg@|ll4iR !+ߕ]J%1%oMQSU'և" L o.LEJv+|0ja*ЉjӅܻ{žΓhG|40Y{!˃˜3Eb%)wMwڝ 4ǵv1Vh+JT\~gΩb7CQNDӖν2t&L4|Gv;^It1a6Ns0݉0u Ya|yݨmR'A]0,,7zޝ%\S!:<$L$B[QkWO͛vߝ6z% |ef9F̫Zl +ZrPGnzudC3a'ila:fʏ;)TX '! WfشKδw& ' *̙.\kб9T|,ǯ-đ5=81Fœb/O'wyӳV&ٖN$yaZkYJPhy/E>4_Nd|Sa[,. {~y|-asok 1" ܍9^¿y^v+TMSގ¼!s{mJ sd+Mojjνkg|ЦQ}ƣBl ]e%08+i»ͳ^j4pv`_l;w sǼM&N)BhK3{;UJ3ò$>sm\GAvI/9.lUWs{-KnKwEXr8c/l0Ӣ4<Ӈq˴xH+zm=8Nay4Xyaʽ3{ ܌ݸodYswcۿ^ tmWn*ix}+rϯs.~ͮG5$L 2>,݉/ao*aX{hɅaOW'K4KqMAt{{cЂ7ShM^Ya0l3dwDwju*osy}T>j݅KO8?T;:ONa0XR)0-S0嚵I~ifk-Bw] :͒K>+ha8ۧeQ_aه^ C1#T]& q ~>WMۅF>f>2VxK礏wQ#wͪSSF _NtG7n;y|Z!]ƕ׳wZ>-3s].{VCFm ,.^P8' sFo ;O8w0.9x_pc7 į< %/yzˣ_k'JvGjaqhɴBK7WBǹ0}D?9ea^5`%OvY>x]h;0a9Cܣ+6-ޕr!u&^e" / ^[fj\xKꖵ_ayYLMIWCx}G5N82d{dg /fg FK8r)Hh\Rh& Q˸#Naa=ՍkB۰0Ǭc_o͓z mYGƅ8?1N D{&0GsC«½Sˎ^vAxQ )O^f;jR|P,~ޯ/%ύGhTKaZ£AœpO' ]64k*|J/pNp}4e_вU-R=/~/65Ui텹Vrq~7"4k?]9=?Ivvת]>W3j>h>ƖOZqʽY#:A=|*y+z'y>^=6mar"aNarPc?7iC/,]%>>_%ypn<;o~CBp핦O> 6uG)=V=yj?ÓC-?B~Nj"}CKiĜ\$5mt9Pn1Ώ!;٩\hL݇;6]Y'lӲ-{,|~Rz[hmǼѴݮeٽm?xE5?ˣ \>Ի)K\uZxU[va+մɍqM 2RzY+?ƾ_'|g2N)#SN>5+N);:Jj^\S%}힤[sMK}Hx]zs{Ϙ,u 6RC|^wna0[޶XOѬwL!BkswE~~ ==opazf~\Ony=iPEWZի#gM Dd/ m{B x2I[-y L80J0jw_xۻ2d0LNvu vcW bΡ7C rY jTֵ_?a?n?o^%NAhn7{zоuWwIqG^Sʼnޥ=& U ο0 ~08קL^žr=dn5_&r@aoR-cvY se/pߌV?04 Wξe6c_T[>Hq0a\`'S&/_4jkrFfŖ e|ZE>/ ~][#M%B,(5qS7?(UV:DV}% %/u~0LnqSzٍ>,Oq5]z}M~y6mA=c7u:&n* #F>8_x͛Š\¸3cl_ c!co~°L%& CN3yvv+LYzaMMU KƂ=ޟ{_C}0-^_/833&Q:w̧k .J09M9[" G㜣qS7O kVGZd+ cw*p0GxR moa\DɄaΓ{އ[HAii4Uʵ)Ѱ#W÷MG{ws'vkF&CV9ֿVKqS7#Q!ý2d+S=qnǻ~W4S_yv妔݅)WV cꦭm7uS7Qsv֔Sωg'L'Ԛ`0mtx TUf/,v&,-Vy30HmpS7uR-v6!O Sw7{.#8rIZoO wne#Zz15noϺ] 02ȓʖ{ oG~-ݡD<q_6բM^U]\A~:q둩D!`^v<"np+ׁؽs0s{n*g({z_Emɑ#ǿL6xx[Sk *'{^a)#&wV\(v9r$;{hmXU Ԟ.vA^Ů#GTas@=Nq N9etz0#771Iyur񯓽SM0-GUTOAj %sq3jVy%H =.vvY~GU8rȑ#G = x`yClj#Gqz)߷缱 /V-v=?*IԢ=!4wXFz8rȿ]yvE`hxNz8rIuo})Y`=ẓ8N]G9I)F498>ٲ|v>ȝ/瞃HU `e ꂾ#+w!w_: [į#GdX>,VmFw:w'cyAbɑ#ǿץ6UG0myzc#!p uf&a[Az9rQ-A1zMI ŷ6]GA\߰(1!LxbOȑWɛĮ#GߎIܗ9~=Ҏ>]Gb\m>i/s=ƈ]G9I =U'o\ v=9rȑ#G9rȑ$?&P#v9rzdg:FMQ!%@je-FywI;Y*qqbpo4/'륀<<5wؓ_OY#>`Κs#ivҥ/ z6[,͑ mۅP ۭFÈ^ ݰi#f@oZɫqA*wdkg&~*^׳xDyyD`P~e~%h$ 0I`!~I96@ze L}Vߩ%|^#>aH[MbYyV#e+ϟ8XQx'??jn`yQgf'ˎ~=}˛#z2RnzW) s]rM+<˰ywAz;:а#vwxa5!>&]3'zcX/#oB(Zrővo:ش+FAY߭< bi nV_7n x;LhorR*Q{ > :G P-rՂM[t*3[{k:'U&:߹yٞkyƠ]Zo2]or)G_ܭTյx/ O^% OtW2NP٢.UtueɵRsoPn/'kk}WzS(!JIFN %9Y`ZF ,ߒ&\)m 9j^5:s8вrxKDv}Hd;bɮ ^kɀc|-̾[}ƻL^rQ/8r.8LHCfkjڣk0Z'Hd{SjnU'~)SV}0BBI(#lW˧!~RG++7ݦݦLd{>?_Tx櫥b?ǟG[a9\deзA;ʹeu)SӾ&B;YdHr*lܠGŮ/F}]G]Q[zGowSyy׋-3}juՍMG'~pȪ6df_׊DLC% b!d`]{$DY>}.xunn"YS. sZ=t߿53$ͳ.O XBϢ8b0B^ԘA]o=qV;k9i} v6N#d헝^ۭ%z1Xziz UNU\x#J)Gƚ^pHa`JS()T,eM=}^L.r ;6q{+=zСa) jA[4)1L^u`^l/c 6B*@Dpf{`(o${1n tӈ项 Nj]&QOn~M?؜v T3妠F=MV]M vZ0/69z#{׭.s?b_ux ךA ,U fb)W|:ȹ(/ԟ7 uʛ%P T_Z2tꨁcA3ϋPp~CPZjf&wīM-zc ށy]UAK~9$OvqIhާG,H$#uٜ'ʳogurCZe }?zOS:ɦ]1X`6m,/oxq[_o/j38-՛jP{Kǜ}#kŭ-{T~dnZ B%rmzѲh X:Ve)%1}/~9o["4p>¼× ?M\cˠsB}eMwxRO0 1@OQ9YJ t6HF,R4ߜt>Do zN%dF>Vب_Φy˕ԭ?Y֔|-]\n]0dPըU9 ѳs?;*-ퟋUIL0 #y{ AFNt4RW}$AE8w {, Mīx -&Au6R7XjY|7w^L*ב{LQ;9nacx6ۚĮ绳ߠCg6~=zTY(Y6_Y9~uLhCDzv՝캷2: |)9V{ԫ_qz:`q4[xWXPiDˣM ]})zb E-6O=ȭ5v+ R?+v}ߌNEq՟ ;$]VSד'=f& UF?9Pd)Y}z%$͢v={~'LZk}l`uDjhtS 1qgIZJX.7@:y- 5\<'r㎃3ha>x׎3L| ޹"$U0~>#>K fహ5I۹u}NZ%kR1u #wVoJFQKR[]Yx}j&h4:1m'NoyJ$xv`Uf@VV$fr[W7g܊Tc^~WCz"A!< Jc(eM!?,|Fe?yj𠺷zJ`:]}#Jb#~ZA+dükk?,`i 3a8.gT'5uW8R LBX}Iӎo]MN<߲ąowtEy` )o*X9{`3*{Lգ V~88h5D9Ҋ āޕJ?ؐG #?k3y:KM>y_0h2}:nW]ZNhׅ̕'C2_8N (q?=uX!1Nf (zM,Noޫ鳿YnozFt-/&vS}ۤ= jJ e@ӽɠ[[]tߨsYx6gA~w#%/HFc38OP[p/uy.;z[^A}-O UB'NuvYƬXP UĮrѭů[ H䉻@ߪ7j)1jUu:Wf jzOv5SzRy2@$,i̫n}W|8XpgV ~ yVEys OV_}ݫ6S:at~GI+X#j{RCe/*%θ)~=ߚե`T|+ꜛ4ni}Tւ`F}Yv@lp[7|鍵X֝A2vu q74eES-ӬIZ'fgz=wO }s .E!'Yۆ[?+瀘7]yXyuX_S;mh0>Z:w'ZҠ$P2GtPj poF@Gl="my[@z][=֏sHl-{i3VM}G1qaW:*aӕ_.yzW#WL\u.vWDϳà-t{sʗ'o u^oTu;p^UFBW{ՍĮ]@}|R'S40#Π3TD:P+ξNdQ9}7R[B@*n֙"G?*8B5NO `p^.us R{H<-a6;O <C$ sc<Zs}}',P}WEl+2Y_+,=]N TXZ{8 ǖΑd޾'_]+6 D{ ]`v c+@^`*:OpF\Wek?yN8hO@*18rрʕ> {=0S/j8܎Og 'd#$2buϡ^ uR_hԖw[F}R'~}븸zۮ 'FyrE~yFft9l- ' u}J4OzX}C朢|G*O3%Qțn}_W?715D+ޡ!ƂN t)9AIQѮC@hA,8%wq3?fԎ?xESd<\ړVn-;͢^޳]y.pVڳ`\-\=C+@`8Tna ;;[AjdF9|pu2I"gRp5ᾨuZj@UÎԺ18jT 23]еe)^J?ٍ`!~]?9ɇ'~EYãF[?>Pv_< ol[sxʍ<7jL`U^VDt_jAFvX rOIMgxLsugEyɌ@M|%#Phl# O@d5Gt3bؒ>Mсmvw19kkAϹih%/$@%o(5-D8QP8z*}HoP8ee%jۢgMNs[m s!ּ͢ 퓣z0rlpTSo~?/49_y\:cQ>k'lk  *ZMv `6赾##7Ϻ:=pRl C(=]BW.h̨濆#E~^|yiHl3 wjxd[V!k jڎS[D۔Wf\XcP(ގ6WL'P: :OHL7^wh?Qd7UkGXnVk{7-=Ճ.Be`ӫ{g-E;^yr?>/آ|Bׇҭ~~?Ros|%͊U]:-̤N&O2GƽEՇEʽ~>?.;ؓGN vi]&~.7]C{ls~Q# AuǾJy J^lPmkغ@O2﮳Tk΂hX Z|]_4ݜ=n1PoCẫ"SPF=< Ab(Fc9Q^?`u?{P$<`:3t.V`iVog%W9."<!$o ߯&͋l R b3t2|V&Ԝ{6ɖ EG>yQU:wc@x٬[rTs{Oȼ3r=;гF@W lt_VW_xٻ)8c5f+~W*{G\P$ׯlڸ?Mg;BhlFw?qo̖K&:3v8kitU-5'rNxq}wzQzӪ׻E :pSi^*ʻw8ml(sij] @ι:h>^@V\vYc {e~UB$S䪴x)xZdO}^.kK杠$TMGF\zi0uO=;^/N6}yIO IY]!仵s?'Q?SI0s`imYRa֪;+ҟwvcci򝾺W6#\#ˇQ_:o$-t3}8[<r{9HܸF3,NJG:*H+;_222נ^ 45;|66wRk!y xn |1?#( B/zf; &S`Gmݏg$ zRb{,+qt բ~c)1 A1V 삠+lK0p9^Ŗ2+M,1d3^jYL'3wޢx <\DUge UDNw|>/@paUOgg0w (&DȤm FZ}|vpDz.߹~?aI='WʎJуtΕ]vsVB˄U0;R]%v{8=RmkM󗽯d"Wx UpKG0f l4|V*:%]Sl |7%@~* `6l]T HUy:*~-21!ʮ] 8\0ô ]%ٿ#ڝiQwH[OW}p״.'&OU#+9_tURԩ֏ =T y~BQsAfUab{dGYw|T<;|R+1WS^E𭘊ŭ!}g[tM5k?|v e'm]&AujBH RemRA4P @_̄Nw !oql45?Μ9 \>Ωia๻sMO!q$X/NIxxc;"5奩g nLZ$z*U2AJYAICm NW8lB~7$ʿ+yb m@IM5=>C{z 2ASZytyy`Ypwu=ǻ~a rM'4c9A~Guu m -(? F=7 Ew/1e%%U;?!t&59m{>8[CK_ lh?,!2 y5!χ# ŮOփںh`[l{4䴅`݀8gd rqԍ!Im @I}óBt5&M#A^$e\KzaY{x>>])ۣ!`[7gK1^%i%˅oCtѴ9 v  97,{{_sȊ!L޾Ů5?3*9츌 o> d`Ts;KFG\UjΏ?cK-z>9jMGS-4^ܸJ:9;FﭱW ܥ¾`CN+&O>=Rq̤AvDyjI]Kƫ u zf@r>=̖7ޤڑ8\zvߏ~#Elb5 v ͢r/GߓL[su!X{ ۇ* 4< xIU3e_bE/9*Pv[|Fٽ&1 &"mOʎ.ՕA{3Av Jǿ̑LXś7A'kO3p`-򼔩E^.{#G[Xk&m痂-߾t?t{FEagl|UgZÑ#GQ\ M;ԥ}۫yğ>d[,xrp 3R_^M(%S]Ƿ"{홇6u>X""5loɉj竍:ԇ^ {0|W|I//ڣC;+68GϾv!إ _n r j ~MUs悘]bi7E&u)ݒK6 |8# ȮզA7v?#swhoـ/zoF;@Դ x-v}ltϟf7qxfHĮ#͎mVvY7dLf)\-9B.O>S8r)xvb{Lcl>i2M34Fvs+n YSʑEiL?@YO悥uH`xE}W~r`$He^L鼩_g;\ni\,V"|y>:V%>HY% Td=2BAovpڂ]J w7{O#ǯI^?_{-Ʌp@'$U1eYm_ꑟ]g&=z%oA9r$gjMϯ70o=W6`6b_y};Tjs= !]߳>oz$ "IgףĮq߰Cbkhȑ#G9rQd q<؀Lׂ /\Ǐ#__c ,XW/̳@Rg}+v]9r m;D!r cBWڒagǢ;Į#GS{6E?z3ltGa9K'uŪS {=]G5irY>}oX՜on1HzWH/ȑߧ4Fx${hXju/ &yO.8Gɾ Į#?1%aS?:dKů#?A:,>:L~8{lu*+jį#Gc=`Oڥ5noĮ#G_}?󺼅}8rH;|÷qr{7qoP#9g 'RR5YǑ#%7UtH'^{ܾ^jd"HƇ*Ƿl"ȑז2N-A"N'4!9v,au]@O1lŮ#GOZNrSA7, B}Jx :*Zd5Qo$н̳w~9~Iݱw@iI ߓ07i߇kjIch\?h)'=@ہD^2:~LvpKu6wIV4;oڬR?L[zb7AO]b.ʛ/v9rc8SE9GɽNNX/Ə/ ?kA/a:%=^9n:3²]1?jn#:֫,v9ryd/LMcY0]m=኉vo0{A+u7Į#GL3UH}#;5W"iW8CG^'v9rck 2N50b6a5~ .}e nZ9 ߎq}4d&rÕJnxI ̃%J<S}O`yĮ#G"Oj:Gdo: {u^'U`[r#d]/G9rȑ#G9ro&y޼?DNwOMbÑ#ǿOyϼ,!Z0]kj1#Į#ǟd A.<<|a$W O؀w!ޜ`zu~kɑ_w.n=[\&ܶwnԄwO9_J <%v?{|dZuبuٱ~;iW 8rLNa } lJS7pZ a;ZuVRbTLxN(>('A{N/Ղ}+axد@`lg< LU3%#A|TfBaIf\`^txl0%]!6DkP"t@('1c$`䆾6kւ =ura>wW_#d8~'|爞7> `q9oVG:!zAQfS=~fǞ5 ӿCzܬv +N]׼]LW/mھ38jQۖ0y7:0PB]Q>xsh!bo@^{ӐBfW/sa AmI.=!xp@xL5sAۭ`:\̑㷈oĪ!}#eB P8in6ۺ^EhFfvlI Ӭ[|q=)o :j? s@ۡh,j3W;y,6_-u ,M:|f>OnJ5j s)p1hzP>;E 7ya+'87tn!W=Mj b;G_e}ܿ糏sKh[X)Eu,qkzI=z׫ޫSqd()NLȌ; M޶ % [tө%5g!l@x^q@ΰ/AQHgZ1ո'PWqœà4d(컷QV'㿓6\>?轶O_jߘ{j~`?@z44O خճcYrHQ~VbyfIqc˞!k~;憻u}3>*ֶJ^ c딵.M&q@zhGKurP ka |77Q~5vW&_L2uu?LJ*RtJjf˳Mt@hx_ʥ ~o2t.>2~Qyyv]t4̾0X8J1^ؖ;},xFځt6#q\z#n1/̐xvҼ95@V4|>קMv [lgdq{_0:K'[ :;P>[%̻]s}QbW!\t}Fru; :]~F-ȭt89K7|Nc۪>/:I~ѳ%5`= RUI{(~fJֺr~A߈m2@j7UKAK)}x八OAwnLo\>W^LVаҟ;[O@ _ 恰X+)%0޼ I`PSw 34)#aYAnw:>&FC;wX @fuWy"6d}sS'~`e4k©6n@8C⮚sun͊dn/fJ z4LM2"S)C}ʽt @}<^^>N8V[ɿ,v9~v6Mh\|~E/3oQ=X=qaG\_8Wh،J=)]]Øםϸՠ|'-``{r;%ud anv:]8-6=3z[O7AT $`4ʉxp6I Kc=5 Ȏ˯1P8=: #.0^¤ CۍÒAy^1C߂wk \8ON"}g-Q%U}/rsЅ% GBX[:Yw}Ϝ[Id%͍v6<~=PE8j+/~Ͽv`IELT׎ͮX(wy6`͇wۥt :(o~ %üua_.yfR"Q}c]O=Z>} Ώ  4y?,L yl;[׃m]lЋR}V=4⫠7*ce^0ĩ_;`H]ItQb7fOZ/Ы^a&HPUkA~ރ/{'v.xǕ鑟?#/˽?eW$W- l62NvqHvTiMѪe HƸS@L^fE7~ =ˇ2 iX5bۅ}bʎ7|!H1ހ.׼rv'f=WziZ&[𼖖\ 3VژX;P$0瀶1ChkD7GsQ{ 5~$\YU%6KGlv}v >FN6o̊MA 3f? ,OA oVTvqzw$x]'>@7'rfwc =qw~'z\ݚЊ)_dӖ7g@f:*$˙x>HHѮ@5w3ӊyta Eʞ-䂎w~uPqcf(˱;kN>Ѕ)JAk"v;8X$wٲd-z`7=W]yvl]}>k[ŧ{;>x:ϟ/Sج^`AמEuyfkNwA>aj9l+AS4s/ssh|}fh/!QWا_Xd=lWvN]b; VHR|z:+?f7̸XQ‡|7)}_pǧ"|įgᄚ !)ckjMz"D ` o+Uܜ |eV<~ rK᠃t.6&a7;֖b;]w<0w%0;ZyZ7k9hc՞ k]rדVkc,sH^› u/fV0̚ߐZ ɎeŮ%kfP/DDPxW}X80p{G@C|6zΒ`zi}|GJ H 7۲];9$}h8-񁆢;;V ;^]tK@%{-y6H:~r߾Q5EuL@~blOpW瀛상]RJ饉62VR|u Wk-{iΡ;~z`6 js۷/; A[hТysԲ{,mYC&1w%i;0tNoutP+A0JVJΫ|?Hex(T `Zu[?vβ`*&+gt{F9ұq@?Б˞>5y.EIjZ * 36A gB遝a3鯻I[j[ish}`]0ϣsn`]2?s muN@3yM=:Jk Gmk˩~aM鿾o_ԷU7^l ӂ+7׭9:.Fehf&nY0_}/PO3TB!47Ji?oٌOG3mLā~3E3c+^?4H -'yL8R&u[l&/_vJ}CM:leS#`ߚ,{Hf;vk 0m)]y?l6uUU хIxhfýCIzʠ*^NA_ʻIֹ^^G<0+5k`\ҭ[w}ϹVɠ]t}rg3`<lҝ6:}4gh~Z5r`\v#
V #|:h ➱,lȟ7TvfU2]rAAx*Ѹuv=x2Pgm:賫^Fz҃u;^8(t<ǯ;P2%H8;jNiȺ%cS߃(-R~MI|(nY4˂'20 dgG>( M{ ix ¶y+>M^oG^MQ8OR4hW;(0kB4St6H|.;sFTڀ%1FqxmHyu|m#5Q~<3\>r,33 cƤUqJ a_*_o_#o~K0.uq)rh~)ϓ}l8vs Mۼݛ AVGnzE CmFv0q&r~.*wPjŞ ?(B,__m7NY&+O笠Yz~}7@` fʔMʠSkiƴ`>R;A ;#L7h?͏.Vz}0MhШLu-8# |$4̈́vr-!Xrk3TL㳗Q[Z U=Y*D;yL#˽3 gBh=l~Ν?UasybS{ H?96GPDֱ F?js O|͈֋uZr;u /*Y~`%zk,6i3Q`);~u)/<`/;vb#ݫC`d:wx` &k& lZph jutJr; )(lIsu9بMCE1 ϢAzudA̵Y$7F6ng ivb mD>}Q#ȹD츸eQou@=kx[BܝDl]=c)?yNL}6ا.Olo6Oy Zw 3?BMx[? 7+=$f@_o(w93~2 p6(j?fm4p$H2>}AU>jʸ=.6yy~Fu0-eI`= l]FFf?!h3 AFa(OW8R O͋x -;Y`- iu_0cي+807 @v'Ԇ'l|c~txˀ#`z z|Q~.7xceԅb]+FɈO" `Z{d7?ո2dFCs+Hj vA/a;{Q>ӭ^.;xnB!bi:@>ߐSؒw ZΤƇ +{s;Pʎ&QQN^߮&i*}^ H DOU ={D:;==('Ymjm}I))B]ّ!t^V2dBkg֢LPa2;p,i iCb믒odj! Eqy`9d]٬l82`&^6&i?؉^OZ+{l!\]sKkޔ{\Nl^h#v;q;?8Nl@bU]7M˞NAx虁]x$G=oF<]85Uyƫ lJ3FFNRbܴpi2j@dS}n0(cģ` ? XԹ_j37m5!#;U]7kzܨg,!0Bh/b/i]-c {Jо`#ǟ&h6;//lZijs5:2`һ ֋]7 kA<ܻm!v=F%ٹT=}g'[k!3@xmX)^Pېbw2pFY|ߒA+n=}|37p.Ŧ-5@ݙ0$I8Aڝ 'X7؛$rq|y 5Λm]Rz_b7uu7vq"`6Ώ AQy߲Gd% *ڄ?s4^1O\b?_>4Cb#?o,CQQOUrc7ZHVns-34l獉cn>y -Rs7{fn1A.Z4. 용?nB`mW?_٥Vjݨƫ 7Yʹd 6[g~rVnr[㿋N=nN<6Ujy&.x2\^o eloע[F`bi"io T8zh \!}_;KH>yv~}XV% ~2߹do=+=d`|)F\N6'm<:U]f{=qKiVq__CVS /푙 bǔ2e4a܊#!?oFuחoy9NŒQW^l5)hzV_osojܼ.b<֜n2f7E9tNje~s5d6>?.;Ud7u3g1[;6Ă׼##Ym6=Aw,[ TAѶA`濉qyV.?W:9rI:]hRڌ2/ܽe}z9vy6I,MQ;{dH}LpW N91[? ?O5d_f7 z`8\;#v9r_h?MdG6eUX?%;:.m|jbd%*szB50ޛNRvpwHv0aLq 2m52Tyշ`E?*>}}[9rI6.=Wtǚ6V`>v2}\Rf2 6Fb#5^,?;tVsv`Gɦ\ zPjڥ > 0'uitoB8>cM9~72_>Z$E/k%lZJe5ꤍW]7G+N &Ԯja߂c ;k/8?fܛ?ȑ#G9~iIL:8rTZ}A4}5)iooG?sʴ=ր<8 j}Mő#G9r6&?>9rlPup^lquq("sa>`sYu㫢揷ނwi|yMvW  5uߎ^qiNs|,v9r 욱q?G9r'y"H:8rȑ#GҞ-Q~$~=9rC2 ޸ ;|={hsfSKV-^9>us-hPrM @kyP3(O4#>i77혋s.#zm%`׷:U70GNa~B:Y]A;ż@*wȑg] (ȱ;S{/1y)t{6G=w~>_tP㭮`$KU pnȑ$G[wԍU~fIZƂ4w=n;j{كbϑ#g샋[&cuPo ^u_rXMo0'v;8r%MaKNO|8ٴ?\,>m+0Orp3ČҾh嘔"Az9rs~Vvb@Ok] VdCz9 dRROmLB&V4~SLzDUql(w&]f<A)ԁݺaw uW,v9rS=#!} Y`O*xBU? ѼřŽ'ۜ ڽj N]ǟdízo?0Fg8HS'>#v}vʂVܺ!z!~d|]up94um0﷯a2Ů#G"M2N[aj75 ̺;:7\zJ[9~&@Џw-:̄IQ<7LA,9.QiϬE+PY &]4h^ni._[a%wWwx5x6nR`/?U~3kmA/Rő7޼̛.AG]9{4A żwz%pC>} ҙj.]Al8W$,3>ϧNzDy׃WuVV'=Fu+xӣ.K-`^+/qYVAM Z]2m!^~΂yzuD\` {}l$7XVA}^a0y]o/J۹d>UHnW5u۪< sEy=:6eקh}}Xhx1/;w6~D{oZ e[\U( %~;Θ{|e/DF5R:]FCsP5sj[KJl.PzGCpR`gPg9*aB6?_r;ëł_2.ؒ5s`+m_QS/3*(>Bw8(>\b]ViqGO7|zCO^0tԄXK'W_IN*i'I|t^3@mr{r{ki_lWezכց+I:^~X2]G > u$'9|`GvkJ+Uy4rvƝvC( #g偶P9*+v|2`"zۻĩW~;1(c| _B)}Fg}l1, v]a+ʳ]z^-(wahMJ{x*IM`_hR+cnFt|7'\RIUc- TQ[UgD4}a)^b?#sco$Nν@vTe0COEy8j_R`j?qLEޠ;ο!&Bg=aou"vV%s*vpB٬l.v8~];MԺQ ;?iω2TΩ/qh9CP] =}`s켴l-RpRvl$W\nz]|vFFg}%naG,;cuR )ɱwEw~Kh016z`u zgL@?:B]R/LL@fn`geڠB6孫_ռ<>>?m+aJM~;n=`mP(^=eMN^?y ] kYz &O ]b ~jMT1^qIAuUsGX Aa!ט̂\+n]Vv$Eʀ@^ LmU D9Hؖզ#Ův}|~W`ȱ"/=ej@%5.y~%Z:: hE^* :f/NO0 9OYQIԦ.wKuHC,T{{ےVV&>"*EP%!$l]n|0+Ⱦ̼٧A;]Oز' kIx r*{: Ugvo#vCʵ[M׻[ f'4uqZFQmh>`+fXOux&+ D+EVbWJ~^LJ4-4n}X!$r{1TnAN`'Lk ŢS3zpd:Pe&vjԬ%ۃf~BxwC7 ߨ"[ؼc.Z!3QT{joM`cob%ל@{`}X=nKտ%Q?Z:9+H^t_>r05lU`_-f̖,4sB A /Հ`ylCJ{_[e'tZCËErREoA ex=Bŀg}$nQ('k~I__M8U*aJ{ &z^ 0;y}skP%4 ޏ"K)E4bsluQRWl}[/J.l]F2P~ژ:Өů#[;>E0UmGÂwa"l;LpI{E1}~` x OsVǦ]z?skZw5>H=έ򯧙rН m$h? NGgHϟgX}Ò}Hk!$rv,ihǩG;~3y+3ERUevpHQElyoG v͉ ވy if(s~s?8?2<2ޭ3%Q[&wj}h[9`T7r`H•t a:6#W肬(=?u8XV3bDCTX2Uʯ/`o؆`x:%])&>{AǣKd!5JҢӃWexﷲH9r;yvT"X ]' kiAxEcJVc26m* xqܾ7LFd"əğ@JZ 3H}pBjOsQ`$C[9r?i)m\=$^%ۇ`޳׀Zm ?#(Yz-2G5ʰ'~r51dt;lEi_. Pqܬe;HAEy5f7U6իGm.X,~|iVAN(sRh(_.}ȁ umm'Tތ:ouL9ؘ7.3gl+v,IJx絠E9[@0"%ިxd5;‚vR~ï32TwhJ#v=_c3W̃ pۿw}v3cU[PڤTR'jmd;GsF E kQ̫GWcQ֠ حf߹ (1WC'zxL|*䡛iS~)ZtE|{yJ$<;b%oM9#Pur[9kWxwZ(7ou=#d-`)LAc`<*HdsJ@&uV6{bnWk<Նbs(k69rbWyiuj =7āeqI{C/TK'OqȑOFMԖO_^퐓{l`1ڶ4onq ~8]uzP9fc+5$U>Łݒ| w5JqTvm7׀_G\>]eZa X-o@TZI5}ѓ]<`cϛA/[]Z#Q\%>;UI7!8DK+vḓ wr)\8t^ 6BU>01vs@>t<6Oz.sWuBņQP8y/V X`~% 6+0QoqLs^2~G|v Lލ- -tEy]-k,vݕ*FdwgcU@۫ ]$@gN*e `nʦhg@{ ]l/]N??A탽/T)% 4UrdN+EMWVڥL?|u8 k3"e`uf9P蛂cp/}HR=5 > X &4"h(ضAYt]_PZn"pxz_Ye_oo_(ġ[љϟ=.ϻ;e;6dVwo#h%_<<fOTAd\ up0(B-: ȣFKVLӳsA}OGIw]x I]hWT@-Q<*Rs򉠶gAf]SO9[$Rc1P# l)E`;ZrQߚz{/HjGs+~_ĬC<`2murj5`%4}q78?z#, LꕟK0o&+4 /8vAq{?HҶf^ůwHNoEd@[ aTr[ Y/*g3kEziA }OL4>}䤿«Z<j#q{vl ksgZ%22@]͖e}y;HÐĮ~wW`j9 tWl Ⱥu8_N`.RV]7g%a+Q :]`f 0l"k9`J6 ޫvyVYVNN,8 R%XAbB@z9]볂 l[a9h<^5[4ϛTaȾC #+,g{^&c4-eng0&㔤[lKd횗?[9Bbctyˮ/ G|o1q_掙+[G=7jy%׿(+tZ*֦uɸ5ʱD߿$ZKO􉝻Ƽ{nf0 ڎN?^3*iĦ>3ʅ'Xf@1:W- Ǖogi2ֺ55t?t{=$QvP{;ԪIi;h算,{YIٵzƥ=\!XutDR5\|y=Nk=h5`C .4}qm(Q<:n}LV&K5jZs "!;;[/}+kTh^}jL˸`sw8O)ʛ) mfB͏}w ۛEn& ro S}S;(PTe|t=l\2gA+7h<ml ?zfy lժHj(ӓYw*H|)QW~=ɠ-sĀ~jQyָ9v1{*2eH9; K#{M ˥[G>5[)e4kg3CpyaP.nzLHNlbA̵>FgՉ\0.E1dNXD<.c[@t=$jh;݂R5ݹEq`mO9,RsNQѐ_m:{mA8x9ӫ7a%9RS߂D](`L # ӕ_xְjNP='Jq.(Ƒ\W f~~ V NIc<$hNg-I^u;f4zu2@FmRm۷?UF3_УD@d|^g]{{Hة όD6L7[>JG>XDG=߷?I8QۺU4HL Ѹp_Sz_`W imfM0Ez^6;zص#m'1(4n}hAŠ`ϵ<eEE ];^w!  P[ ҭBQȂg"Mvw}AZX:q]J toegxY=ϔk8̩ex[y zE\ncWin z~((y7Og76z xp50eUj;9$S _Us)mkhYwqRց1: tΛAy,223/ؖ! fʛXl5h0N<J4]ϋ򹮫4)s$x5`;HiKk4,Q~ߋ)σv]Tཽ[3^ 1h'~RP}l }5[uxDh>{T~s"ZĪIHʦOAh~bWd8qh|;Wh7EkVnyAjnkwzL A,&ف__{sBP[٨`RMO^=9:;NE{9WtxKXCVI vXpueRMIjӽ2`L(j~~͒MUsh$ Y> vw\xYn?|Ȁ'V~n6`̧Ɓt;]y[0C(5@%2Y\=~献60 ~ bmpuR׀ph0c(+Aֻvu50e5ؠ)sڃ7vՐ>z.=!mzQi2WRJ'GgjWqG@Dڵ`SRoOF2E5ѸetBk(-h9o룣|PoϹ) 2[ < ǣT缦}h4H2$JT$RQ(S3$d(i"4H$2^y{?>ޮ{ǽ|sZk^u@^۲ĥj@bc'>b<ځ,z/C60&"Y2Y? 'Fqs2w>Y#aݣls3-M߆y`Tzq 2“ WCg1g!;kfdΘ_\(%a@޷9! .`nj( 0<;xjz? g*Yf;cH V}EIJ ~L;='1nB SYtqJ@S jBQBɯ:?dAm@.ayYv2W8Mvh`-z;" g{N5sl}ƈi6 z|8O*/͍=“Z:hx6׿ϛk*K{xCh 7T#`]55g/2} ujxՅsJVmW};><"2~.`/ +'ty$rÙ<0rHn@rp?TP5LE7w=^+±iL_'ޑp? 5$ޕכώHԽu)sKn_6uȭcEvS-nc7#U*$ܥ1咀z9!  :Ij czǾ{YLgl2{@D!63oq'i~r4+9' 7.a~8Hio܉Mk;Ԟw@yÝ7V]N97sWy/C?3Ph<.)a+/zWO]lC9/ԉ>W"Ыxpj9<:.p[}(rO5 igƯϣ}c!'Rv?rHY,摕v]Dߦ?,EɃ^~p!SNK{ao__*br^Qu7jp;7{lJ) [Tϣ2u11.sm9LԿM0Pd{<=Ny 9u@̒w\f&]_vI؎wRgd>\~CKsg bp' ,u5MVfN> [pXVzQw}Qw㓀LFIC%VrݺN) {.e4U <|?oGg0s.;gW[2ٯ'ԧ^**t\TVгV`1F4c1S-~e{˷w5NL6t֦[Bٮ'CDrTb9~hrh h95\жAB#M#aڿ+Ѕy^C?b?C3ZmI18|.SX2>>7E;mllV2V6j<tl̠|62 $<u3>5۟_u,ޏY9ɜ2?0?_ɯX\7Q/eV>1(0a@-ˉdbqD.bu@J/5$`܌T!~ǫ {bfseO1L Kz$\Rs ڐreiy#E9Rů^V\oȫ86_\ ,+ؿ?"6fE y$(*ky?T ]<}¯$ZO6 (uX㜑ߞokJ/M=گ;RrķnZpw˫k.߯Bt``:Rw\ jOOzxPo7YvQz+h5m@x}e^HxٟZsZgtsz0'KY.u9]1M>ݔU>!tc 8;w5~,'8J}G.ּ|!_އCPFm /y;.\`;5}ndHܛӀ?үd&.uJ vYA?~ kV[ HwT Q S7mgxkǕ8 t 38XM΀:ri[ޟMtds .7 GZ} Xi㷟}124S$hH+-wN&ck?e|O$ g|:QъΟST@oܳF>|?ctߓտQƀ6L H8*ZoA%_W pp맫{.ǯNԽ_ЃNn~M:oT}̠ᦍ\l׋C9ݹZж6Mވq^X-ȗf{U1k_9t}@:7͋{|OYrw P3լjn7L@K7]Y$< _H3Qw]vϸ-c(ԀM ;/%kiKÉ/M#I1)@-<܁2ON%߿'XYv8%`)uf}mXh˧o}A@9Ƹm12`YgEu}e-nt2Pf-as.7l ǜX 1=I;XÓU?<6PE/N߬g.rI-Om#wD'k*OWQyv8'ZjQ.u^@Ũ.OtKhԳ$z]c4`gv]nZDۭ;] Q*zt_PY/ z,뙑Z { Drs Jlir m{vyK7uٌGlBd$sU܍(9Pjs2t@S0@3kĵ./6Ѧ(: ۏWz * L-pdNYlG [It,q-@'|NZ~8K +y1 ;G@+v{$`^v\ al'wAilFX]'IA*\SDO+E| n|c1y@6 ˎrS Pa[Xt.Yv8k|jJZf@vO{tG5;e|lS~4Q.@W,$^s袇Mh01_Hqp("}L7zvy8ĮM- z?/c@'<_ek^'2*vlư/"oZf{=yjf9u3ɇ ڻ1Zby(K_}(ї2_~VCz`jaFMپ `d{NU=P4F"s:9yp߉.?qo%uo ^= ?lD00Sx GHI0]48vue\9}/>IaFK+u~q-H+yL>Fmsi2{ dy0M``owjaO \Oq~U6|LY?J; u1kSjl l+d?ݯ%'Z7 )p\N$mK^ގgu; HQG Mp>Mۦ&]d7&3[3`[40 ~=yfZ`\oWMc*ŀ-M\ 3M?_*Iz\ i20 }&esB%W݃44N"KitmJ)0Z 6MrL=L\f)k Ro ?6bhJ738;`ߢc QP0 z$O?⇿ )!@)S2Ѭ{4Йɥm9w$^XByzmOoz]Ͽ#&$Zޯ]8_Ȥovr{J-Ml[wnKna%+ZwN E eTw1AFW'1x~R{5yKslqLe>:K`8y^(O韎p¹@ oo5zle3wL|E1,Ӎg.`f'f3^ ȹ>cW>l(ͣ沗֟*6V;PD&lJ~/j p+ߖ {U.& H7c]`z`Nc^8 ܫkܕmKd-i<sE *Vg[lw ޯ199ϧJzV=;`oc0[y:H)2qPK̹ڀ\ȯr Hdbξ!`):^*kg{(|Kt6gu[: H*i!@UҞFĮbJX+ =sa+μF+;ϻw?.*0lֶsolR6ʋgܕ>d9` -~aun )cM5aGedE4`ˏL*$~MTnGk;S7\6cT"H}_'G-Ӏ:@c܊ٓfwYɎWJ9KY' ^⑧LW'5ewf!wGn{ _9d!ڏm\;Ԛ펟>xR7BK= R\%0w~{O;)z 1mVMPJiy\=3v;p IWNȵTgV鿪zO@c'l:Ji/Uq V*C\[+]=nW/)uE5f[">{y;Ua{Gn)j$i׭(k#!){o/T7G?{2 Dn͞)Nt (aO$84zƴQ=?P"v }RQ_80Ƿ1g-+rW3L~9逍8O8;]LTsٮ_7:^> j<sv-p L0a=:Ͱ]L밇{.7r;㖐8hmNUO>qϠ5[D2z1Y[կ&n}{b zeq#Y9xn:03K+Vz% ɏ$KKi%s>>ShݜMz?!tڮp w01iJS%|ۛ,GK=jlׇß^_>׼^6L[YyDz?dH6 }i7PyǼ=1ӅK1y%`e `&n,F M3_":vJ7ְxHܮ痡6@^*>EO5O^gPuLW9.̘g뗆1r}νU@z d3#{%I:MW %]>k6~`ej\|Yلc@ՋJ?20:PGRhq涣չylϟΕ/nw_ 'Pw߰^*za%/ځ(iż:`2^a1V|6K_N<]CV&_\)C0d 5Qhd;/?:ϓ8Fg`t_)z1OH>ٶ`iLZxI F>w-)kKXYK1aG>?B,owJ~o,P>w>~(fbމ?&dOfKi tqڱCm.ۅ5W5"~3ݏغ7]cՀvl03ĝfqo Ӄڸr=ZHJ|S=+=,=jw>Tٞg$nM}-m@vpYO&@{vTqV TSXJ% }hۇYo'v+;BGB^~MoГ/ wcD`~p% M eJ}*b@ U5f2uFy `9+!lm17O͑F s+0UOsds@Vi$g8R~m/1y6 tCw/֒S|sp4[WvaثP`D>zA r x#07Y<@75 MPs9nDN9Xs rtg ت@XN{O|} WLmm8дC܌lׇC ᠹǵ0g7K?)U9U+ԔEuœMz &YL DpXX{jI5l^|`џ$P*a|IMwZStwZ'~~o>5 em|kCހ> OcҭޱPL-aK@egQW[`z9pkړμ>r}\m]Ϟ{u;!ZI)޼=o6PίJv9?Wl*c# о ҙ,TB"@Ws׹(º~|Whc7Apqw{￞ܽkd 6`yg.|;PcٮﶃE;6@ <0]| |zZ]Ӡu}%+@`DlHAF@iTKiLt;F;ޠfn@dH@NoL ;oO]7ZWkඔBW՝7?2->Q$\)ۓWД(%Q4=*bٹE :y+REa.wQ! τe\Ql_XT-~cz8gҋ1n3k~Ǹ=6hɎk`Zivոd`l^0D~~CN =e=D7Δ:8 JY ?٫ xUMӀЩSP?fha yjTatu :62-땐휋6o[ym$e@,\U̸@\"\fVW:N[-G^°a@gyc{gS5Nm 7 ȁuL)+2Nh}{ʮ5Cg Ȃ̻P'N9y %[V Y\Q8ؙdPc1\"ڍ{:MnzMx>sрmշ𜴇@D{5 ~+@񿺳lP63:Lqo$1~6dn7 Uo'ɿ9`InJN)̾yoiNo.uɘ@$w/ Zy}b"5Y;@ I)<K}jri?gxhrA@ZJ硛5K\|E+ڦS=c wǽD@^d_޹Hv@O8%`cV )#oGfNv>]g6:vG>宀_>sy=0֘* E/1xDXÓfgU[-Xښ`<XrC=]hw@R'17%@:NSK4.ٔMj0yX+j>@tfZs_ȰxmCs~X5tĎz:?o M3/-rҤIqbuɧTxx,T`RHeTk9q Q-Y;رsYsOǮ]غ(%f1Ӹ1U]tܬtñ@ m~PV{%yI<9, gb x>(m|Ht_j} z?5kVWȝKlWl))OԡuAn*L`Uyjz7۔R$P:̧.NgOu$9\ ЃY{nhڨ.aϻw׵'nhĭ@"j(-)K\pbZxɖ̀zBܥgSn n>AKz癵?viA':e0 uy4ݿHX͵)Hš6#]G]?%y5nFh5ܬw+F!i]Ox@ w(sS$p8`붴X$*|}_xƶ)BsCe8>7P]yǮ/ c4vDqljPʣ:c=+F #|iA@˕lҴvqsE$ ^+(}@:4E>s3!! 8ho;,Z\ Iwx lwZ]WFj"PKqSIN_F|sQܮOyS;^~3ăuơ֏R[ΈMSL۫)Ug>DYe }["ۚuFCܧ@xa#_C+ (q.Ң6at[TF p+>O6)C@vsǤ$ v Ip^ RW d>mgqดv; m ]۞>c:12t4Cg9FG૎;\XXg;@UؿY@ـ Թ^sڑq%xV y nH*ǀc|۽\[GÀ^]ݥHckK) jBnkl`JO1'Vr%pQy-@m }sQvt,z0XO8yabt܌;28:pˀ$RLjvHk^@8KtrNdX:o3_*FUh(JfqpV=QaUC\^E >v|=5F XRr^.׈k|_wZn\er%ಷy=_q#Ju0D7xٰp15;͇t^^,UH[X]/k%sԇ=@ܮ^|6p5ӸT# ]vX11yR:soYY,\Jf{}qcH^Ӷ2OD}I`it6r~^7y y9ׁZ2;+{.7V^_Yr*y!]SCq : |K;,}ûfQuH0%/"l9M9]4C͟zkco-?v5yC_<,>/њRu2y~6'3XOn݇jH? ꩏<>G]΍[sܫWm ND|1;^8T付U~y4`,;b͡iɭP G }k+p`>vFHNsn7$戗xR#y,^dhPKl׏ϵ^F+4ndUfL=zP@Hcs|y]܁-Flw!KOX`e(KJ&+x|6͚glW. h3ٮW)2N-OPykR , TNzN8դXk ̜|[rhi@}Cm\t?r1z?*L"r) y̢nrؚ\c'`qht--d]ZuIVs{*UQUHn[|m4M>=;̶O86H3@}ٴ/D-5>}zFTJT}\i;cOÔ:tKAW'!Rmh醨v?RϋBw8 wo_76Wxjٍ/ZÕ) D4pjZBC>n+ DݻzGr +Md}qSҔxOhRH0=.p^=g'DoWKfO1a{wiMN3sy3`9oӰrp8q%Y9]`S@0-qhX:7/'q.ʩ@ǻTCuqvޒ#!@:=be^}<+DyxiC@TVeʑ|=`*m?}I痼Xd`wvOjmUŞ1#D{ 2S(Fa:tF/?7p鯄zY{1*ՀqlZV%'[;pCo.(o|i/dQ5e`%VOTޫmgʥ/IF>1L1uc]I5)n?整yƨҼ(R+x%@\P6(P]F\s^_ѩ\Dfm'z'&_ug _8 qik۶ZiX0#f^w)Úwa1\V\SS <loyvg&L2^tCN In^aS"r{`0ckyI.%1ZhW:\0z5yV60ڿ9ȭnDz`6G<9>_muPY@jGq?揎rV_n@|p,P۶ʜr@, 5M-۲rS9|ßߗF.uu48vE ZקL\bf k95 Zr\p M@,^i>]M仴r1 1&EY ۭ;mH@,In[B0{td*]s0+@6|ʓrMgva=q$*pgX7]<䃆 r*S?b,xBg?4  e^ynQm~'PTS`>nj hr/SSg,Q; CĆS_S/*.zG8f||s3Tb?&3PViu2(hd{ 渙gV6 H*&q? u^8QPu?p=c "9jPd 5<n 6'~a >KJû5RO;9fj̏&اPٶ}߉1nMySAL冁=oXp >.~7r5,u׋p79Nj{.qy@IĈ)h*0wN|$PN6l o\i^D@YFA3s6kb=ސ>{X33Skjr/M͂e8~coaykގeߞKg%N_Z+@8oe $F320ʤadVmb =[poM4fWH>:@\~Xa VYK7V 'KJ.(.x!Q [T D9;[%|}=bLyPwL26-K|o IMbqR@^5a&ovecTΘCMZRpd ɱA/u)dY Jq㐖l+o&oI^.Ͽi58 `N>f*⬊3zq_ٰg'iӿ] 5nøq@, ~~y"Uk OYSTK!YJP}H<߿7?M{QidzVa,N@k,iϥt{R<8l `s xxQ|ٯǥ܅VƹkXnm u^&&R .|:?(9ވ%]}+2M Է&j/)7 ~7}rK;s"LÇ߱? $NgojdAHC $_>G!}?*W+;6s ,mJ#?'XdwAU@Y}`f>X`ŝS >kjӭ{_?FrOn>VvI_iqi8 t:QMB!v6p~_kZ-\|ߛG^/2| _1 |K,y~4%;9Mceۀ:rkYg󉨤#N'~=-_J-׀Ur5ߪÍ2C; yX6ÆNΙ``|v)gc޽8" ZOŸiYn2x!%>AQ_M|%ڭf^@0DS/\ !D^U2o-580w<';6b:aȭxi Jk:6{ߗ\z,𴨵2TKѤ߭OyT?jz=}9@Lo$ vx|䈉 Ԡx1 'Ɲo"r|N+{-@:eusS@DYIߚ$G|s>B1'z&[uʧ@h_0H'֓u1quH|0SFـxLU}ёBRL5@0d5 TҀsF+@ I<ihˇD[>SAbK>wEjde\DnIrl)/,9I}ps+<3i7/^h ;DŽ#8 E5\WfF&e4`@䙞to:MMyl`aQzsyZV67~ӀEe Tȃ>޹h[L=WۙCL"]AzsPE_jRRcFW2VCoĮrݞ˅@Iݾ9C bϨo4tbן}->3+jҩp ]Ư.RnUƢJOy~l-s^{K{=q@nL>!?'\w>{_|Oɖ_b$ExDLEU c펶jz<XHh[WMX|`r _Ro.RM?5 T`?t`ɫ9@.W*@NuZU~sϤ0^*:Z5w~יηJlcn5%ʐsMj؞b;YڂʁH|^}Gdn}Yy[c-7n!SDM6:(:@/mco/V^6Gpՙ6qϕriGa=k&jle>s# 78?v=J{lh_oAȱy:,V2}ecRwJ6&P7y<Gܗ! $P:xoQlwlR4E rX?l3Z@HdYLx n#g|`ʹ0_! }Nl/q~Z"f3 cKG/PVua@`60O'Б 35or:oe%x%^P|'G%_]oxCh$_Y`gXZwuخ>pQ(%OwIelqڤϽ>B輇Wm63iw6w9D,{?xtqPbd~IMO62Ô ܀hӚϿxi-`FmM37FrHnq+e2KǟgxxYSgi] fS(cjҝPng$_v8DyxKu/r}*rWjo7W!ycu]0P%"BWX}u!3)8s()ssBZI: Q?p/F݁-Zq{EßA<>5gQlßKyLܙas 璐ym ֐rYrX`4n7jzG*xş15R7Y~g;iZZ@Dﻠr#{?e~hm|&&ZNE qgI@mիWR`)4 ]$خp|_hخ@ISpG/?Zh`UI9(_r@u/`)-7rs߉Mm-cǽ HӴ{";麎.%w+|`[;u/ׯ~r^+wqą5ܝ@Mj1d`8C21Ұi]>`nr 9*Λ73VVyK"mP΀䍚~lSSl@crR ._)- s逰6!J\GVTs/^1y~!eYKW$/5bɀT:gj*h8v=wy8DSW5+YX>ՀxtݝN]N jLဩ|RXC؛>@TK,_;bjvO']z^M L3cf}l%m:l?ZŮ{FFWomh㸈}o7yF.dy7ܬR\RuLIk̢,OZ}lO!y5*vV-v9d/kQU@~t\lPO"]TS/W̒d6ПYKD.]޿Q][u`>8HT?ߏ# Ѝ Zep_lrk.+78 Leԉqr7u.G "P˷lNa가y%@Y{ZϽltv`R l|>8SqG~t"{}0i'- yVꝛXrP|]95Hr8v8I~māAn}z!M K.ԏxg hZ7l/KFVϯE#lg]ȥZ H W'%]TT3yk\D JXkߨNٮ/Ն=%`X\Ʒ80~s4 4wǽPCi+&{w9}/YDqޅy_ h| "%N|t) žlǥc9Da/kg12ϘU^^Tb?5~=_(Yjvd*6|h t,vnD7)ᤴ=h j[~iXbC YK3"/7zXܽFsk9vz#-@fLQrb^_PW'kW^^It&a չt?z3OҺ൛'fa?oa3l';O [O-~DN'H}9~@[Ҁo=upc8ѺyHzeZxvn6 =+ (@ (4Pg/,&WC`/ ܏5lzpWY (;uk3_(弾-X8Ӆ j` ~@Ö w @l G=||bA}ӕjDWO3հ<e"޲:ݸO]Sݑ0jbf J[G,ϣFeINRߖC`10m׋'v,Z~xR#>6cryJG7{l}yY5 W>o\d$gҌ+za\c:NhjR=.}? D"ϲcߐo_+򷑏sFq(FE1%xwsѨwV۹:)nYC~3PkN R튯^ecu,k/Vag5pԣPkn6oH/ {2k򺄝yQy:0֫ ٦d~7ž+_8*/_fUxn?8vv <|dk&8-+j-av  8H'38[P$-`fYzc xKO/υYGlr{AN +һ;q0KD/|b'oq ^SҞh-ElW'*9VteΥ^fhJ(O:P7_o> K#O˾*k\# efrs̶( ^.||gsV}1CgsL)~pK4`PkLǽ g, .$d&rt9P9Ӻrf"Ů>9vS\> nR ළU*FJf-:.vK+[?_'sºiPTD=])ڀZmĎO܋~HO年{Ǣ:ԡ,1˙t=*os2 w4廉nwJa;{Ff̟'\l>r10׿ hIycد7^guopڰkMxXDͱ/ 5mSski-75~s~)ur1X,v`NHVϩR|w"խb2h huihӢ/FthgѲ@nSdp*lxJ_xwla:&B'%_ٞk6y[N+@32x+]8ЋX_Á8yJ8";L;_@)dZmU4!Z0S^EBKr80om.Ys&#:+Zbs zo_BN^9|jP>7@7=A[vXP/_xwtv).pG1zˠ7@<0HlCׯ#1?跛ٷ!e;倿7 W3oƝCV/;Gncm\0s] N|M/Jy1N;xޝNjzq/go7D{j Qֳ}PMV;]خlp5Pa` z"@|.#}62 5X$oxKic`$|uyk`._}ٯ,jz/gs0ղ_+#:Fz%93ee@%[*A93h|Don 7XXYHd[=/ÿ",@wO*=tI==#2Ig: X*bGu]s#YϫWk `a֞kqesnqꈡ! ko#enF Aw:aX h{ᬊyNXy{6 w֦/jY5subۇ_Ľ Ӆ3Jv40? {p L1]\ xT߼@N!ۿޮP.ls~a@L,bEA@{OKXj49ח0n@.t~{]x5 X+&~(Ldӎ o xW;1SlyI9]כ*E5}{h*J=Xּ~;t<*t72]yvK> Am@:zʏ4SQtӄ^8SԁʓOxYQ[9tVuzl;>@obKB/xm_fLWNa, fbɛ@&+Hv㳁- Cˁl[ n yK=`dx!# O켾x }K%ټ{:f_kj@ ppb7dhߟY5HߞTS9Bْ+w_hm??V,QEK-Xe$/BwVS'l %wx簻~5}_XfMU`kD$\e@~\=zs?!˄DGx vg`NfĠ`LgvFd)&&aIU~`֬@ :s2QOY8ß@ܬe@5\J[ڟ@NFnM:'{F?s4`Mt gF|fY}?w Ꙍ(#(8;^9ü Ȋ͍@$&U@kZV{߰[4No!=9 =ڵz,jnn׾ 1k̀?%,oki\+G#`GANv9W`)_uG\3]GvQ*tk<1kr~JSN[9:{4 Mlo@*޳xcԾYt~8+/Z߻Ծ~uMökɒo`_KKK KS_3'|W/rՋ9|Lfr+`[n<ټf'6OiϫY~E`z$Z:p|OIG^9c0]v PE-Lb?/ x%M.O(qϐRSz=ץվ@ ?37Jdd Oو]D"0n:w дKNִ*eL,)%5P]rh9Ek˙[b/Oceʮ9WrfY&HHcoн09ہɧ~d60^>`9;&aNFVW"~ʁj[IO: (-$?[Ohk~9_i6BjV\\ g"׍M@ {J.\9PUTq], N/|hDһ#{t_e4Uk߉C##M0ϿEfB!otݳi'ه|AKg6`I&a A`BK/v֜ ؽ%w!,.j\J[^ N3?iZ/H2`'@hҼ0!>97N~y,x7o =d;ʓy?%iHpl@b! @V9|#sC#Īrrʀ**θ'P1#/qޛ˿[nAMfz4dmFbgV:/xe(qR[JeNu3[n ݫZˁګja7PG<F.(1 L3KiDsU5d佥.==}Łio{]D"\&ygC* 7m7RI@׷J/ϣӳ3:Qmt>/n*yWIvvZo,krqMN@#++.| eMtPx,dzꁥ8㼣}]eAm844s~9#ƈ_j?L/B`nd `,M۪98>|$j"w-XJ!ML=- 69?lLvԬ}(ddPGfQmY@m; D$g>L-Z~@:/KO-z@[' (1bzٺ~,.'Lh}Xf@ b]x'L`˓~=Ut&-Lľ{:` 5ćN@ew. ^SxP_eB !v~ߘY9{?p(bZըO(0 &0(N=x6^CT k`ʎR@ֽ߻k2ϋqm 6)YKt$Wf }?6O[ P^OwnuHi|*^1˦!HYu.Yw*" iJ?Ё8fseX4Im:a xRuI sKUjf΁<Y͏[K'R+v}S_|`l#uܗ]29fm`< ([ڏTDE])Rk|$.)mHSE@}+.Q3qz)uP_ 5g SՄ+BPI@d]19{! ;E/\^n5_er+P2s/t~!u1PzxÌlt%$Ny05 =\KU8۰ܭU8?cy@5s ?>hY ƗWnpc. k&Às^~l76 ߍz*۫/ Ԉ#_dy)@l.`TNWqD=s2[:Tk[Zvv /VB)}В6=+çXσÀ5$kM~,sӹ> vȄKKs:s6d`"JA~rYʋY9~@Y^(]em >3%lIOU Ԕ#[L6mt j%Sr|r?Q`6Yj=mF I`Q]^3_WȾ~v#Zl )`XY0t ;W\_@-z,4g7Ԥ5@ȍ=ȑ۸c.oz.{Z#pJR2k̹?=O뭅J^yM灗 ;ugFZ>c_;r\|pWa.h-J@b\dSDnN`h`!`0P}@O3KqZ>/@csz%{Naݥ:>5Ҳ ׺xX h}1_O 7nt9;IҎpΡ!l" H[e^5!G¬HYfGsti*}?.ǨNI1ngۢBȬ(ɭ>nv>ʓ*~K7-|vEw2P˖j= fN:3&5 ,S}@-1Yi ,@}3L2Obz^"_~^ #?Yjk߾tpCsz}6:€V׹ȡq>w,N-n B;)</LGjQޙ+E]I?m,>sTژ% ІՁr+^O7f/鸸;eygKˌ2ּGiiZnd_?,-7Gykd9š}3j}NyUh墢2@xrZg5&w^]?L?gWfzu]CZϳy.|jJ VGǽDsEڜz֓9-{ڬn0~c|/΃:`.}ydY r^MUxq_~_T*K 74cuš^@Ɂc~I?~iIiuֽ) farSvfoi/rSH5O/xt*[Qŗ^${@ =sz_H% WW.3ksVbOǛ]l "! $ wt?M7)LqE?vˆlXq2*`Ղ;&rAp]Wʁusn!^gtEHO1[$-ͺ?o=U?=iF}hL^__B fe^tߎ@nǪC9F&`/DG@$Nd{=$@yso a>l뇷-U "YߪW]3u6|mE(~fU8\?>!︠~йq 5S|e{v7M3KIDL2$JBJ$3MBI3 "L"4R4P;x~_3t~sg{s^H^_%:Ӛ'!Q7c4Mkv]HߺǁxYy>8Klcs@Ӌye2/ϟ?NƁMu|&0ssE˄/cx{˅xK*o"-Zd? 9qCE(=y ·/+=I: 0ĀZ4p;NuYu]"g=\t, ЧGײ/E=0xx/eg@n͗ Dۄ7qѤ< tM +br6@ک'm]$\nêM<x0`v&E[\V~W+"¿DΒ/@N[_rb |ˎ5|o,*rbyny=]rǯMeh}R=<{WΉ[*P„_1،0@5߄h|Rqe se ϪVjsVr'`QF.PԪ xUm4Z^S}wyX /dbD\%Aa5<44ڄHCb!&|qȾ9"UuyV/X0 XfK͌rqi^S56)n]_hsCLUI7 )=vq"U3| 8_kHnN S)/8'̣I srl`a/n?G9܀ e((LfW{kڝHOߍ%ϙnǀHy"rbo.:yo _ He7Ki?XN 3/kc[/_7ih xش8'k-3hoםs^`gN Hfu[!&O~wGK@ Te;aRԳ_TUxpȓ aY=ZH֭?ic!9E3'S@;z派Ws׵҈g'_ 飼 M<^Yi0Lytg*:a$hPJHkxB|7P # UM$+g/v}OעCRk]L?ulHi24F~ ۘ[kHj9\PGL:^QF]Ϫ8wK9PFǽFF څ=tf*`/z|ŊLv`a}*9UW|qGV?7|o{NY "M"o(@݆^Jx[-ԉUԗeԖMKhO߿!oK#5S%;X&1Zwҳ3䔊ӛ3 9t;E17D>.ۯN 5!?GۗlW*G1NzZ^\*`6_'HoNlG`mnѼ:=(aOBk?$⡪؂l;*dwP %g<[meoIC7FBy>Ao_0t~F۝)7c8Z}b)iw]P$1Vb.?6%myxJ5xxa tbMި786p&uuiYA hXV5,C\t̩߫'} SQ9tJ<0?J3Sf[ `۲y ĈVW _0sҌf$\[@+կTW:o&}=2R-pTֵ%@Ώ(k?8x #t;ҁ\@w$_H_i2,ܘv}pwW:})@ia+q;Ge#-o{1^\@6X Z4>`tgYvJr{՚yf߼Ֆ,77Pqzr@Zv<MKQ5Td'8I ߙ|^KP`n F 2mWKqxm^iA%ڊ\K@Pjo椥&ߙl8``Y ]r;~vٶI[*su#nw ({~&ɘ #|eo;a޸N~^'@M^fOh+Y IV ev\,#EVq(TCy~@lp!:O<%h ϫ:ĸ|7oXZAp=u@Q58 ,Lpk@`vDž[$qsQg-`8 Ugũt\ptxCά9  4FP5Ь ˞|zC ׹g}~ܩ k,lzfN[ :YEtuai_@K弯_B} w~O?,lBm^ T?F紮&6uaqsfm9)FǿC@#`Mi nj @dyg o*(bTR Gs\5%No.E -{kI6hܴǥ _ 2)sRqs$|ܧ3?:vROcU#{/8'"8c{&` OQ65r!~#P^ \Ԟ~} V˚\h˟|+]Xt12;/!qhnom1Ӏ^\c O#[>+@`ۛ;yan'>998 Ԩ5//K͆+#(lPD g&:&@.Tlxl P弊HYQh(̷_uFF'|>mća8|AH/S˵y<7> ut)*.ތe1s- 羅5K`97ͦ/^ʟn0o[ oJdm!@弮+tvzowx=5ig, dtD{ hXI~ׇsM6ì@$}ٲЧ/9]r=jfݷmêaϣ2qsmUNyrϳ.%yF=6-SezqȯwBN*;bTd| zܐ8.QQf9w cW͍R[/\/}h?Ld%P'Q1l!{>q9J@X2'HeYnY|fm]O!9޷ԅI5cͻ7N+_9h*^{Pu\>gJB]]h?A͓HW[_pNi޽f`(o>Uxc*Xެ8 F 9ѓzQܹȂGsRP ԡ]纆oOX;خ?9Y٘ Dqo=Yw'PWvdhG#-V>/ǣ֪D]?(<|р>J.*~.{[s ࡉOSv} ? Uv'CSd)P;BzҁMuB"zz|зǁ>?׾ PKjBy*|;Ǵ"=w*"]t6\G7jb\^ ߢ&hô_@}yd 8.RqcEdۼfjŪZFT1y)vv{wλuBtrH(Iyޡ1t\-|#bn@AZ" ȘǭM\?Y$\j܀j}vQI{tHyZɎpۊ<1 J ڧ?\Ŋ[7qUEJXȥ8,h`yxq֜ VӦ|%JX:]nRNtҚDEP݇DYf#zʹ|M;/ڀQdr)cgKĮOlZB{K<rue׋I@ʚwr}rӓ9oL V2F#D)j^uCoÿ 9 Kõ6ϗ&yG-M&7qՃ0VMɏ(lT$*H ڃȮ@ξռ([潭' -/7TwI@u ^, :-6Lsζn$}'; Lv擦s(ܢ91'y G O{VC}M}륹9vl?L⣧5WD(:+- &{q;Wwg^o󐮸HwvX>*lqxG, 9]l磎i_3˒2=__jܤ?ڳk%#Ƨ.e=O,kՒ#U-҇AxCybF+bDBw劍HV " imxvs$muv 0J*ڿɚwH?}CQ;Dyy7gzoDLc~ eOg\($nA/'N-NbWd4mX)>VM\7S9[r`~_-9c5_ćS݀|Y"<(A  ߀ jY@?-kֽ)<EF}vs qYt;Q@4/˞= |jqW?M֤wc=4MI<.Kq C/!P` xOn~wCzBP5fr{kjG8^(N=R7YjWƋ<mFS'XRBnՐr 2^#?sja﷩Y'o`@,s:-P/'hJnQ0U7ObĖq@$&)˯.<;:fl=a$zC'5cE-\@f^R|MSFV 7 ]ͅ&߸7 e@^=*ug#/V\@ff [Rb4A#mK]gH @5yr^վk|.*` X.`&"q%Ax|$ϐrps"Z:믷> d48e/2q]w/5>ܸ͚{drѭ8Jy˿ ٮ wgx !_8t=jGl?xuKv`ZnѦ"v~gi丹Bw7^?h[ĕ4 ^_mA HqT@cG`CMEGE$vPRN!z^$}y!?_R;]#z>u  DY^k`VxFH~x97ySwGԱ>tiΐ@ό8,On*Ԟeqɂ}=ٹGPak6Bx8=4; "ZײrT{ɫ*﫱g⑔0R@f%"Hdso͠ Rxe{}$ 3vo5hil(Z xC@l@WzS\^]>$O>wMoߚzg=_7e[$/|0l( 3_gM;#L͡s\dnNf0m\oLqJtn^`"^T 3[ hV;y*2̗K'b{8[&x;`e/#pAx`AVȕ\tG|Dx{b PZVUPNK1lJȈnF^+ Gŵu3a ^04_ Ds@.-{/oE{lDN6{>p^u/*3JVEƻu(E Ct_m?%/YxɄcLoUy0 Ooo| =U^}2CU@b򳚭x+@*<.)٠'%8{^a{=8u|z6n,"PJŇym|t4`cR23U߄Y-V dҞw^; b L I)% 蓷ZwoO(xC@}+Ըvɞr ݓEoz/lt<]{h Hjo),aݎSζaŧ[eNj"[Fq]o5RJbgn{W>yxZO(\9$Q;W (P]SHjT˚=AQ/#tm`YNhK}Yu4G%l74|q4@[/Jz֚~n'e9K<b}k/ʛ$d^W#9f5Hj\k{&nѕoձV#7<(5 chc'=|e o>D\?qpYg?~:hR~\h;hC |.D>K/JrgVVou4 pzD`Wb /@:E2g^7pz@\>[FךW5xS#q:sMl9N{l/A95{_vE>A2r?=[ztkRا_F佦Hڮ]t_:.f-}.~G(˓"}yV4iCŅGr*ro|S6@SYdr-oXeOC7I`,?slo; u|"ǚGy=gj>ܰט-l߻9s\\H*X_m=<}峛Ԏː:fJ~Yx 5g"Ӈ Oki=) =qwBF0Y7N7;scf ; x76y]w]* =[@ǻU{+~~SI{ʡ€,Gwg*ZnTZL{@(4纸RYijVr݉fh2 l0bBJkρCx;kyN<.fmy-Y:q1[S=r9ip\`89&e@.nPn{v nH*i1v՗V{PCwVO2R=gڷYVC^\}uU>y`9 NUyV$o"K߳νc?.L/gܷg x<0h1F)uWhƑ0]{UdFV|u^&n9 …o%p-bĊ߾nKB* +,y%e~zt]) ۞xmo#h@{4ZuJNkNsۡxjQ= Љsk'6a{=.DqgFi$\(Py;61xLdQ_{>Y6^)b!Ėc218qSY5Eo}3!axه]< LJG=q'v+׳o< ]8Xŭ6]TR C*- ' hYz' ,-qCT1JLQQ`d0>Y3ϩ H!B{o"H: 7_kOay×}U{:V ]@-9.:);VNl~@{]`64!0Zi'e\BˏTKn< jQA' ZDA1@oxYefD^_;4k}Xsjݺ$_ܗ\$Νug0$qP {%aIdWbb|PH}qs:N{xy n]yDe86t ȝ=R~hr;OX@ۻзI1vCjiS@b*b b)ɝL囒^W=5}L Tg\;K7ԯ瀓 *E+/ #kDY|._z2 u}# >f -x ΣPDpS\)U!zm\f% ݗ"sl<@("ZãTL  P~ 7 v2zC!OeZ7 MWByYo5&+tO T2@&lGt <2KoND@i]4=[(@9V%T\Yu=Ϟ.>)RU|(M'&J['E3g39=;Q mV;WsDROk-f×/GFXN~NΓ4 ='\*ǹx{it*nOGl,?=oyd4Pǫ,{ɨђC|5=8u?;n0Nۼ*C_qM;+} G/ŧu& j#Oҽ@r*bIsn62K+%14`Oj50n6|@u{(l)j )݊_FLU@>:ocF{=Ҳk@}%urL}ìg3Mt7/mMa@-*߮P;}hy~Ӊ$k>_n|J-EÓ^ /hzI})s.HbIKl៣iΎ8!I@E}}R4>է]rgs< ^+. K;cvC@+`Y 񈵚e ,'";hx0`CSEϯ~o&.]3VH$z:rc/0__:p^;E|f"df:O!KxP@h^ǎ)7Lr!0P]D㜁%,<Pc-\ľMF]'uyQzPcvM]Yy/ Lƕ2zL`^ylw*s.S\QCC5Y_=bD7=ގihJ! =jz(+0!ڛ3eB `~|5>OR> )Oz^Lы\7`Zf cl9&05s.RIs~e@^λ*#4"J/D<D~4|ka B!tG?V_xqJc6~#kA {_"XLo`rr^d|.NM:[=>lOL(R{"`KOMߨK400[;=ӴeN+Eq%{sgucy`i]x 9{Zlfw|A_ 9@{mn@]Pȋ8J |j7SumoEѺi*+$]ތq`E,7c}k&.*f6xI]rX Hs4O `>]VGC0`Uvzʼn2a.@Y (y7^nlo:I}6 !/XBM# IּVn?z,Ю3)1-{`>Uo~lM"o4ƹirlm],'yMpvU VOZ /u{X*i>( 'O,y\v B' kg低lֹ)gWTȃ-k ?}m=ӻi}1n I|Zl׿hI=[ aG^̓ ر='m߭6E~M= T6[ub{h`tl1<0}Mӊz0kJSU}+c;vG!MCd#Q жށG?8wj8OfJvfM9:2]u5 ;0%q;q7]ktܽ_v Sk5D`ol^#-b0j'qsUpfN` x?M+L/u,%*}>k,Y'xcՎv_ʲcm?W= ̴="Gc!Ҷo"*Ϛ,ugx5fG)@:LqrZd?Sڐሃ[\uofd<PP엟l"Z^)tX%2Dy?<`㟬6̩l{xj.\m@5;y+.FA-mQ`^K@ :;~߉HoßUDмc7,p^Xv9wDLITv&$y;/guآ]VacOzW`x&pr''"^>8dbSyr| ,‡1vS>ß6UZހʝƸ9ST~VSxW|k8c@/ MmKlݎ€yףgMQ6.$y3F%) x`>$|i! tۼ]ZqgP؆%j->te>-w"etk믃(hP`$U6bh@|\v"2Vj"І [?eh=k/F_2}/Sl;}|ԺЫR\ğ~zA ѓx;4HԒnל9عifm CKa~% LO\lԀ"ҎkemJ99 5o\25Ҙg@;qr |ze7麣e%g֔m8#:w・aeZ# Dcx5PnھŖ0:u޵t͋{u<ÿ6M߿.|(TWщ$1*a8 ,m͗ynyzpῑ,{s~oY}9L^{@Dbsju(A <k]mZ@"%fZiiW]yyh7%tL\Nw۟G =>(BMg3f_Ozz  ؙ-'nx3]#+{]y I~yUL7~'>@/1c_9,-| f5X{Fᦽ:ꁬߦ03Fydkx\͠+_|79s?~uL?dNlQgFo.\1Fxhێ 0*{{ۀYzr175o|6:۸bOW76xIsSg.Ɵ~y%6pGʪ⑱PH8byQo<h\nݑ2ٝ}@Q J=;[姁2U5;uE2+DO|9#hї iy@ιY7٢,rD)2E9omNg;ÎtQX7 .U3kԣguqu7#xVY`>+ߑ'ޚdxV:<|bܳJ/D~Sv *ӉJHj{@>15O%rA PFi4u,?7!zhQ^(}enEa眈 ('Mf;e?/5 ȫۦV痩$^Um&x=dφl_Kcz#4gK`wtt'y2 .Mӧv4 N=:aIŌ=@Z9Iu3kmԀHgQQg@tF, D%rZUOt=u,ȭw7U}%W:X99=SW%y{DOh(m\`sNj5rƙ7g{O QTeE/4`e/]:"X>I;܄cs-oMrlTS\e zbpM|fJOF#4f?{}s~ݴ7@6_jzFrAfM+qV;5Rx@t]r_STNtbwu|IDA˩t<3:3+6 @zZzݟNvot>% $(olv~̵&SɳQo`)߻|n?'ߞe_Wzu=xqNG@A|& ¡2#XA}x7`i}Si̶t<=ZHhji/Pޏ0mIƝRY;%8".1 ȏS?Q@~s'&(75 Cc X 4$ JĩW"?6wK$CQ듺)tԎM~r1P =K,r ?֔K Eܺr|n*/ΐ&H&u~2:9P쾪sE@r>UBXd% T^:iz^r[sKZ@ ?!7ٳzm7ʻg_-;twp`y }7w i'C{;P>ۯ1ͥϿp ͌=wஊL.~ ©(g =ZN_;[ݲi8ٯ W'{zD~\Pt\pU7sO7꜕OmQɾ^j׹-crxɉȺ [);cdQ<; ťϘhPQ|L1VJh Zx{?_Bk{D_YVY54Δ@e]1+cP{fĵz@ֶ2akEpV_ ϻf:;*RԾHeI-fA'.Sqg" +s."9zz6晖'"ͽ'8zCkzV ޓXT.XƎ[UWmoR ũxt}zuGi@T@%kϭsı@VAsret(%lwޤ~w|,IZ|/[ y9TP[/r ۩y%I_\S8k5ҶZDn99^DgeKF*Ř# f \ :SgS`E!z :~nݢZ xf,M"f.?}ǀx~ϱh;\P@<'ݔ͙i9Д5uJT||~Q,d*Rꚼ Xߟ-CAv:wgݮmP'~>c{451) 둇 ҨsU?hGI`͹R9@Bj8Ѫb}$=?$TPJ;$\> /tmRPM W5@#ZH:%X6hnf`ikXhLzꦙ BU7@]uz|rLO{^TIGu+<T(많sp_^=ۏI(viPz=?:^߯L]4!3$zi+83>?Y1Ls rmnӡLީR2~ .ww"Y?"=8V<zh֚opa;E:Y>}|n06KY A0VI ز[I7a=qu6=|,7~YTY a dgs뢋9'c7L#W fH齚Q+iwt,dXY[t@f=_V(/.ʑ9bbv9/QF TH`Bj*"5l^tG~)eɍnF8/ HSxOd`< 9!/BlO xi"~4~^q)EVKCמlJ¢Ky`\$K#x,O` q.b掠zom׊?,lQ̠pl]a!vN-[> ~/]*7,hv P7z}BcB:#/%`ۥgh$_<'w*Cm@Ov6:gtQ[,TyM1:-2PQŋ@pMUj?ToYO V(#Hkʝt~07)iE='KX4bM-=g<:0 O׸>4dѳ%$׌RִbQpyhPeWʖG:v9X 0 bdJy?AσR6S5b1%;%|ޞ9 Nq85(z>nW_SyP%֞//c˷TXٸh#ה^ua,0Ǭ>D6H?w 0\!K$$:ΗgxOxNUye;c:|o'sFuR7&hy7OLEŴ_ hv IyiӮ4$w^z /e2Za4- =~#lz9 n^T߷kH7׫y/m Zk$)kEQοhZ O\,?_3ǑuCxtJeN\8Dl</y[vy(/ -Ioҩ'ʼu;D_^+?WI9?^DךCT@| dm|/k*)vԡh #;sRKήN/2) w] 5*kĩ9 43S$O> ʚ@+KSHrip?Dqi@{d^%?-~|~fUf>{ sdb*AxPݛxwYo=,eJg&Qas@{B>0`a=jg!o G>R_u::nU*.z;Ӌt|Αi3T97hK! '<[ [|W>/@7jF*G@^BL~09[sG= Xd=WiqSsFԭ4pa=I.eNxeg__UKmrwGix;[)-}6/ =ǒ#5JX,Us-k+P%-w~@_P A@5R;n~ wݏ*+d!:|>=/W0t(oW RIA=1M+ŀsn_/%f?Ӹ7ǯi7b~?IЦ~.me86rиEXwPtthi/W5x]rP.̛z_ڿhZǚd}rGϻ"}Zu_UevQ{Cue's/j>j6ٟWu|42HPjc,x!"\HB0 'JaZ<Y7&,;3{p1VW"g]~dl&\|\ `~WNx/vp xEE3 ՝SՑ-:^eE ?۳$rB`%,\lXɑtM&jiu=!:qd&j,@QLIlvy۫Zx-%WԨ4 @(`)aKtu@< ^N:,^qaUbmsTh]? }K/'bvRr8a mo2x ͽ@i9~(*Jgv9 }ij?fd7/izW@V#5)eIÞOXzϤk˧ع.CAFMۗNl{Rjhە`yK3?WhwC:>n;Xv=q͋Fs} ]DUOo/Iy)@YԸp$Pުhir59 ߢw@p%6U~`헨^R'pCWI TSϵ xڌTχjO ;vCwt`V@&g<}; G?:Ԩt>>1=g# Xabe '2$xY7b; pTp9c<~=5vH"6GYz__s_A4qd~^@c][B*~rɀ]*)}cƻ-u0v=ȔI}*O5 {X/!fdt1e3/=ŗئ9v}4~Ѻm@N?Tѯo%1% ^@ƞם:5J Oe~})<@/tm*͝#PfJh_YW@> ?,a<'P1~J;ľ}>!D"d&pHP2zi@m*h+H5>@"z6~u< X3n>xy!o5N\q/kqYg^Io[~(3nȩ߶9@fefx:7(ih^CeUN! ޷r7C5l[޻EVm~ Tz>f|/Gڵ޲:S bR[>z @v/JR`p~?XݺH9Ǿľ@MXʝ]pڤk\Wzh?I)x j4A:d,'K`-зm!9:pF=4jK1I@.QQFl =ls6\HM@Wҿ_>y9v-}!`SgEQp2xŽ*8¦wxdm_=̶;C˓ qGF^"O/1Cm_/5KUrOx@/$v|2yG[&3c[~3|֧oy&@y ײ]rWVi@7O{8XQ]+ Ζ _~|DF =7;ʇC6C#ٮZHx HL-?j Fg-XД׶#FdK [&47e;r eQn?:w 3IzV[xWZ5Kf◣nb׺R@?eed1,9?:#6)<0 DԥҀbGBiY%Sf}՘A9n*I6gF NWN|9XkM=Zkخg)z|n`I$Ro9D36m%8rr!jMk kjwt oy/vMR!F#T+_bL@|'kMϵ,-QO D.q+쿲Hs_x} o2wNq#cRYa8$@!e_rG=3lZ`G\‹]og&і#quYέ4r dRl02o] Jr')F ߅~ [.x~q  <_ꔥ-rn]5 XH=xPw{x.p/6,X[*9z{`W)b&993"w]…Vz<@w[<#C _h/a##j5G[ʖÿ&ݮlSEc@ȦAX-ҡH`a2I+ivs\GtM3˙i nf%2'Wk_9=&PS X^GE5{ٻ/p*"0%^p4رb[8o$sޜʅ`>rwd_sNgÿ"ιٖ୫U +o ɀ,u<aP7q}l2vy0 sv`I\$Õ&}&V _#89x6y834|!=MTg3}\/%1jHs 9,r%/oYG^67ˀj٬\ LH%r[Pta JjJbȑ'yKm#w~RnOԈ+O޾8;ԾA}wtR'4|pjݤ^qCB 0t&PUamW[ᨓk c=%)S;#A $YUxxCg\JX;ɑ{ zr￝BaLu 鳠;ŒZFocfj O6xn^h$wL9%]%ܓo?ݩ;j2`K>,{ӗ}xݥ mOF\.ÿу}{>zx~ Ha&U3;w o/px+rܿ cevQz^ѯdkY牄5<j㥏 Pke&|qhWVq6~Ʈ*K[W)L v]@ stq WG}D,_fhWXV㕺gs䈯6q{yeK@=``Xι[6ڨKƯB|?%(!,ˀl_]>9P^PD<CG`=<{eˋMt\}׺os101ʻ0UZ夓l%0lO:OlKV8cj;͌*cV_9\Įp-QSRT6sjVJ5 \:_Wlo ^#1 Ӥĕ`̘,s.q8I"x:ן9j ^yՊG:RG:e׫5y{RΨ&Zn[xu3RoJ]~<\0`{<4g%-*}F٫<1O]_ #cvGc{=Z/ F|xchc˲Ƀv H@4[bY@Qv,@Sf4M>hq^s;ggUQTnjВEﺁi_tsZ%̀e$rYjuD0M:c‹i}.>y݉4/)YK1:C4ہ:Nk޾o~w%PnkJ"~D@aQaQ@ ORwvC׾sKlo/[]&j/y5+Qq| 8\i#0Rt-oeͧCU8 {,0N~77cGqE4`]9J^|`ײt*QsLjWk/] 9'b^&epuE7>~6&`_7 up;Ers"twuc+4V֑5X\:49o.&HᨽF ۏ?7ᯇuv>~00x {‰Rv@MW.ZxY)N h@Fm 2^;n%!dž`&\ OY-nJOiU wℨw@L53y"`UԸ"c2bXPz7j;?j~l3:,zFc 3*`~R<6<&/rm݋ݵaKxVo"C *R~Dׯw C NVZ\0{'ّ@5+vy)j78/a.XLYױX0i͏2vԅa%/.}i(MB=wkj_'L;?ϥ{{C?rE9)u`X ws^]W I }u|F1姷aDRTI0t] WmOv??Z]c7g/`H4-O<c\ A0~lSXwѳ}n;w,K=# E@_\moG $$eYMGw;pˇ>wk#qT`5p{ ȾX΀r>L7凟HhK@mXpj:8/!.v .W!i5q^ nھ{Eqz~EO;g| ; LsQGY]ԶXcb&M:WGN,y"@o&7>-`}/`C}Dž'LvQ8G Do/0p (d.MF?^w]^LK v/BL+@ʱғ5Cɍm7|M8x u),[7rRC =5ͳoKt'~`10 VSbBˀ@UrS{%X*{(2N~z Yf{ZD^_\'?P(<!UPtÀ7.;w2P2n6/|EO5O>LP֒ޘ6~@,q(} 6'oz֘ߎS=_~o֒{ho. +W߃R>Hև!?Re30lo֯;h}LxV\49r qQJj.]{~շH M."vՀ דOR:1x\-"\0FT295J# u:η9f.l Պi9N6ĕ#j1U,]T]oGnads0 _]_`3}g7O\{"i9Yc.گr~u{ҐqeL*{eѳƏm :kw>d~%{/52ڎuB"rv Rl|_B|{**_(=J@{BPjYcoRV|>vʐ1߅_ܪ؂+Ev7j?mwVvf|\|t4vLDs(T7b{P) ';u{ivxd;*=KF'JXSX>ؓH kc,ӻ9w"ⷣ|USsroSim@.IYE1_ɟ^!U]KhfYa(`*Yq"XX^cMOxcQ@D)|Mt>D/G}С7autU0$mLI:K]v^,͘ܓ/?A3ĝ 6S-aEk`leR Ip7`|u40On #ɗW󾣛^V3O&geLK;T;橐8`)mg4eNyAi}>j|lK8EG0Zߞibln0/jT~݈:J zRʼ[h|T-JzS=00ݽg~a/V.p$WY|!\vC-62ގ32ue;?o #Yҵw~ fMqtUzjޣۺ Xw>̿ߋi+?z[z`)n +O67W2ĺ @̖*!왦<9ro[n( ;R( ȉMN_򈄭7S酣엃GbڇdAkk͂۲) 0 K1+[Z`K+ 䂋θ-ugQx*w8_Id{r!;H ;ZdwxD4<2o!U>6&0+W[Nd40ZMs #y(ioqZPkY*ۗCA2g @Y{ϾuT,FHnT{@Rrg]zSv 4jxXb]ҝ|}߮fFy}?7"G{V7jQˁ%t]k%JZqoF̹oBl/ (O~ÜbK/oJ.h7}".?PDKA,ȡshB9{_}T R%\;Xa`a7̾4Yz)76\ߟ߁Yr*P/z\4mhCܦ4/]9n-@1 \@J?i=EMU7|gETo4Jw]2Lx nYJ?]y8U]? aIJ4+dJɜEe*C e*҄!@*7 RJB$\{}is{^^>k{em4WN5}tz.@s֧+f否M[)9}urg@3ٜ}ob` ޹P <~LW(;VP]onkHzwg~-]  D )<'m+{g 럈GjRï9PJΒܸM";`?v1"^m`{VvZ#QjE ڔSx~P֘s/|2zym}. }|V0巬ֶoJ1LL lFgT<4ԟސa*Ù'+~+"Za#? ͼIN@u=UpRq@[o6t9)Ӄ9lZ[;_oyW iB'xL)gsm2Im _Yyωzsc`Y-=ؐx]öe:!ݥث@J;5ū;R*&c྿o~fH6r_ L^.mN3ڈD 䬹Z~͚4@UnOxLV`YeTX!ebPIT'xĝ0~xnϺ/#3)e+7 rsF/|Oź2N`+r")X07f&R=rV84 8>%Inx9Wk֏l[dEvh\wC|NJ\Kb4YcQZk!vL~p8ʐkkr'5^_BTÖdu6Y<\jWVMH "RX:pftn?r;}6v"s+Q}|'AdskTߍKdyW,I^?C2?q:B-(i*f~w{V.LQ:8*3(GN?슐l*k\b|cŅ.ϊhAdo .9;= qƒ9u2gxāe:c֏ԡd))}v]6H39@6țҊjOMCőҢ@TV H~@V H(u{xpUQ*#͠%Ф/ nYӂ|zL9qgX7HQ::a60 &.pە$iFӨGǢa 32՗>۵SB; 9-iؿ7:"~ç+ps%~ZIav*+)r;w90x2kUd5 7PxkC'4@Cј^JJ$</߲Si]ů]U&oO9IjEߠ |5xZ60%oE*.꟠VMANS0FFy`Dվ.lN<#u[j2[.Y Q9t>Dt_H8ؙjoƳKjOHW4Āܟ+O=qir.bIcY#HGy@>G%rkML0*~$+7c2Y[(BJjH@uCL_d^>E r99M:Jqf[C/{x"yyM.<O$MH]I21kU?vɪLp#0.̙Y eӀ0NM2"}2?;ZjO8F;,N\R쬁( |bj>': oB'bv漷Ev.p00NT_y-gI@.0(Mzo.N,Ux12l/nm!m5~WwRiʎH6%V YY$f|e)|ո \۝򤁡\ Xlgv9B.ek4p[̞EEbʿ;L F ? UFѽ!@U;&hQ վxn -YTI2tlBس(hѵ޳1ö)畀Qo\w,o~:ڟoյ/[[tYYT(pTR=|EujqH \Hy6:}{E'IkSu`H╩4&3.tK@flxNgv0 0 Ou@>N?xSis~^az$`WX0ޅ #}w1`8(NzeRƅV(Ssys~}wXϵK-:(E)YwLrBM^^zE"q>Bp ~竳#cpK6+1Z~ݣ!^hі2N~U#q9އ;EO$obYb넓@b mxX-ӽ#1:m7~AųA<b<&l/$8u45}('TD NgH:S~'ۮ Ղ9Z7_F)05*/YܝB`7NMq}ѝD#y<h(Wn`WIY5ūl;2nv}w^Wag8eb@\jH8>ܗicc'wIٲ^-(1*ڪT1+4qFA0c~ Tgxqh.0 uwS}.A^lM΀ vg xr]sJ.٫;#ؽjKހn+G}~o4XY@;ݼUUm ncSӎY?1ǡ{ $o |0Z; - *o"1 K5]ޠƟ;vO)t{K`]~Fs;ɀx) z(~+ Դm{7o8*6 F,t.6$|׵E VÇ)vlO/J PdoguЇ 7$Jxj& ⨸=e9**uƕD~Bw=;?slK\;+4';FA~@<146'1n%l҆ʾ +fields/data/COmonthlyMet.rda0000644000176200001440000474067613754255070015543 0ustar liggesusers{uOfԌ̔̔)1&LMLMn38 sY dJnԌmn%e))IM~zz?Ź5k}>9G=iwVwݛ=9qڱ߼蛗~^tT/Y&=_6=Nc~:yҏ鱲_bcv=v$~?wqf=vnc[SncoEzZ=KOf?!.Gcߓ5~8}|GcX+Z=w\ץcϷs;W'{sc1sN?f畿؟RGmo+7ۿwʷ?=_{~u/8܏͞_ǔˮD{+c?̯sDQ=r߭ls+k*~RSk/>q z~+vd|p]gϯCW?}Q{G+;WX<ԏ2ߏ>K9޽9}~[y;Q޲op?> O.ꟷ2_O+?K[ܯ>:Ggo_ץxyGYeC|-VuXӽY=>ӳܢ~+?9~uϣNmiϽ~?N]}|PҾQ~=|.%ݯW^~ߨuo_s_JM5gOzםs^=uJIy}c_JJcC{.vz=OG9;wgWgTO:k;wT:yXQuf%Źi;wvYg4OsTg?Tui;wTob󴷾[uքJ~\󴿵TuR%?yju֧wXuO5O{YW;ofvUg}ySUgSwwWgsǵVg}y|}Ku{:;w,<:O:Js:x ><:sYYTϯ9]Uo:kD% =wQ^Wi ڭ'-;wK/U[{/L-i6 gV[v^W;x+-l6Ֆ{*-?ƶ=nW/j˝\ǍW[ƟbiVJnɃW[~󍧗QmY<-J'W[;x쑖jKyGV\\mTr?sae`Ֆin,T[+Vt|j6৫-mܿmzڲ|v^mY<],6jˏwQՖ5O?r]%ws-|U[~˪-jU[d7쬶|bW+Ֆ7O﮶S>>j;-Ֆ4O}U[d}Ֆ||y%{[m9j;8`ьj{Ֆ*G^Ym{fie3-#*iT[ܹyTm٭MTsWvu?Nzﻫ3wT?:qbuߛ~)ՙVwNu+;?̿6O=+م笪~T~* s]Ugy~[h%;S3޹::7SYW@%Wgj13|UgSN:;~j>cμ+/Tgޱs߬μ?\_u-NPuOvna۸5glJ%{-ՙŝۯEՙ3~L%Ug~镹̾3Jعz:sUZVɎHY|sqPu33:sQ%?N_4:Ggdunuu̶Tg^s?qu]ye%Cՙ߹T3|ŏVg^VuՙgV2fnΜs>YyF_ՙS*r_Sui;_s{3|<:sB%ӿy|uw5} _lm'!0r;0iw&%Z*=dܦ㖣 lޑLrk~LߴWnO&|/&z$66dg&UnVdBk^X2aU{&+ dBy}.P~p2榽^yߒ 5 wVn-[H&T}d/g-Ʉ*׏?LxiCߵ2ͳ/Ʉ'+>t_2asޟ?ًߺ"b<3iI?L{{&vTn=Lljڻһj}+#*QM{_/'.xLe)s%kڻ󓉟j9'U}$o/6GS*աd?7$1mn2|68i}o6WTֵ@2q~[%< $+WN&.l)'$<ܻM&.gLlm;I&jsŧzݕuo4rۅ{N&j?Lzo#w{O2m k2OWɤ4Ud1Vqu2鸦~kɤO5ϝO&N6}II>{nc2s]\M&MV};4i\ </LK&Tn{&6sw&tA嶿<>4i_oK&}ynw%%6'>LQ;gLZTGLjmoN&jCIݕǞ>/j>L7%*ۿK&ܴO$nkdҝۿ<[뢃gIWzG7&_agNzޑ?H/|?_$=7|yv:o|pIfČy&˿~ӏ I_J63oΤwӏХg+yԒ9'no{COzڤk_+po7n檤>O5p'x]ԊǪIIϦ}6?v|qg%}~\;7NFjԯ?:'Mj?W|ʖ}o/>-43g:wj?tqHҿIΩ/|(韻䒤/+bg' ̾EkȲd`Ĉ뚺㚏?7I=rk$}Ϻh\ܱtTzGmI=\If}Ϟݟ_Mzi$uwkO<򊋎86 >imz2z=+=mm̌mdmI$.޲u$c/ZyaycJ2}ϖ\dB&{l$!+ua>Sߑ[T֝Iғܿu]Ifu ?G:p'wyT2xrƱ'$Cm'7K_Kr#ǿ2Lmʹ|⥳~.Z<)X{o_ԔSkqISj7@Wdns}WE[u٤vI_'w?|osg!n{NϜлϓ9;I]Y{=^{OBJқk׿]=}}Vԉc݇Cq%/2啤?'~2]ugP ~~?qh*g6'=~{͉qkOcI׺1$Z{kV'ͧJ3gWt~'_~d9>Y;%n78Y5mٞ:}eI?v%Kjc%]{d{iMן`krͯ^ud۶ny'mc&mWݽ?eW+OɊמΥ'+>gIIq??vKzU}X~!Y~2W˾U;>R_g>GqoM3vK]Hm?~dcW^d@v;Y\wmL=si MO^dѵ7|ŧIq^3sߋ5uԾz۫vT+ %?]Ijv?g\I7:R]~)Hz_B:S}MSjIz3ܥ#U9wIvl`:,IvAM~Ow>ٚd~J-?]{=!rcIA t]:/>djʇ?sE{;:oȎ]h3gL2{e}1IZcfRQo^g1I~ݿQIq]j??&k_=rd2xw~'7}=^k?uAZ?$Ki˓Qȩ#IQٳ~z~꿮v2wïsfڍ>\o܏-kNwrE\~zs{j&I/}$u!oM|pwԖM[ki$&<3Iyқ׬h!uq}v`|q]Ic|SjLuKI箮Ms7ky/9D}PwU|{] utut]tvV{œ7 Ih/?pQw5ͽɪgOoOV~ѵde7/n%g[/tI[_xWrap[rO$mvͶOML$m}-'mc«lJV<\KV,w&+Yp+c8v!,Luԧ>/m?MozᲛ7Ǯg\{AI^=_Sa'齷~ݘS{{{20R -j]=^IϽ:zo~p~/_:srv_K@q3lIo{y| 3tެskǮ^YE=Go N\s^^ܧ1ݮGvM/[_m䂘o&:{cqS@K>vaܟlۓΏ>q`^Z}km{q]>9SϨ=I1s͎$}K$Z ϫ]IR/v*֙^;aMSOOQߒ[{zU[/Iv9dǪ<.lPT.)BR[1%C&:OgΝT?$=|O;v${rڼ0~(,8_m 4Io\?!'%)Ҫ|~ߜ .?ZkIԉIOUSLrjŋ_NUuoלB/%3]!d:Is_7MqI7.%}E/}~S/Kz雨!Hݠ-!Q|uw`:6^uktV}/sM{oWΩo'+)7$+zm }fIzwv~k[v抭zVcUkkmzlkĤu}oBJ:Klڏd+gG&ߧut2{u q˾sv =,}D{[zZ$KU}F%K܏r.ΝEO^aћjoڤ֎}?~{}O߶mY;0cx9{ګ,^4O`~wGܸZkM;;^ٮ>7ic>5ne՟p`oGu/ԜܽNWwz冤F3:ԹgFk_UvB Y31l{dVuݜdڭL2;kɂIkeqeId+)U{[T54V~qwRKDaƑg$Ss{borI~pfk_EsZz<;Lo}z5j^톻-|kE_CF۷=xCOz+Q}sUOڍJRj^Rc&} ϫSߟ>3>9Hc̻۞x{_{k'̻nÛ%ץ'Q^\',ޛSg6߾']ӵW|??Y'z.i?P c{][5ts̆k/Bͧ+_'+FuyKkń嗪,Dml|3Y}I1>ޡiiYҳdc낃%w_|dŞ'ݻ_,V}:jxcW>;9 ]?7}E}_ژyISv{#Ok^sj7gߒ4q~20ppwyy*[;\srIUw& :O&]=~~=QII$yխxݽH]#<'ΉߏT>vl3z_n<2u\`U>F>^'/Hғ)Izsr=IPe}ŋ*V_,&n':Wh,?_,}0ݭ8R :'r{oc>|Xvߢx8ie~I\8.:4PUq;q=:weڃέJR9b=ͱI_7^П>}rW[o^S= tᄋV&.O; P9Youܨ9cF9fk}Ǜ'NHսoh}HZ;:8 ud|xO^Ӱ7`H͓+w9ژܡ1ϴy_Mg+:4_b}[OZ~o=_O5g]*<4K'K 3Yܪyes{ Z ԟEt.B4ޥ~1J}ZXtױ%r=:P}{S+SnI:/)4/tlu`/Gwި}O%c++]{VV?D8Ϯ }xxsoI)kPwb_9=ZxO~{$}v>-bO5gOKҏצdWx~gOkÜivC<ľ]u7;j|1js>4W/sD% ho9Ϟ*3>XoԒLE%w2#T2hW[}Ϸ@cNt_=Wy=:W~Ύ?6Jz$Rk$s~nf>Iy'YzmW3|;Qc`\@1Guc/շj.ogV>iuUk9*;ֺ}G33sējOOك/W0n׶]k۽Zz8ik9/:/Vm WVZ%LZ kޡui<꿖}l_'-K?SO<[,6N24ܤ<ſ=͵~:bl{؟Wj,݆OzL]&W5ϫ<z}q>بs/]y榮&`~|I'O0Qxdd}=n_óL7ӏi{3' 8/_FN7S;jK~۷=p3_~rc\k$̓ D'֐d|sfw*]œ2j/)^Pilt#/*5i/&|?慶o֞؝I2rSd7k=Uϟ ̸zh_+׹>4RϠ^}eㄥN-M>*{K[&ɮS}>3>7vZ}@M%ۂvOxLK*xj_dITs $c=cZ3s=;v@z>Y)۶nbJv^£ sw`LһWlǶaܟ{!gMџOf%:NymDa~!cpUjLS9@DuXjz\:sΡ3{l޶f/~L mk0W\qyjwENZΞ;jwRl)ެ'jj_t@xկY!fqŏh 7īYTVչE!3oӵ'\>_暂87u=v.K:^s)_5gtl V0?Z2ṛm)to\.]ozGՎ?3֛|7Ys|',d ASՇ ^u?$s⋒!gΨ缙d.eN׼\sBa^߬NI~>.V*yY|޿??7zoֿ/s>H?/|CȜ963vRBÏ7ģx c xf3J>4e\9d`z/|;I}`j/!I8҇yۮ=O܇gyv+OLUu2 (`?/z2voI[^ea1++=tϴ.r֕Wh^\yΥ}Y.fyBԙ9wK$+GX} Ԏ6 t>|Oh_|n7 nɲiusE4ӌ/9;34K5W|V@W tR{y>!iɞpgx7j~cuXca3ucG;FO<ܷ]_9W0ׁTOw H_96y'曓g ft~˜%\%) ;mT:V?t?5)ys\l_y)L}DCi S1;c1_4se&_ݹ:.z_9.YŭIay+nn&w,Knx15kEsů͸ߍ=ߌH~җ_:<3wr&>ll࿥gJ'~1;}f3sOg w֞~գysՐxe+m~Α:|޿:Y>,xejL դͺo{S]>/`6u :Yt4ٺ~dl|={m0̼kNe<y@a 1\[_Ǟ,6~}(\:__w}J%?\iGC:?_c?x~~y}X鮨 !!xcƣ~0Uǽy H7.}X_yfpSx}8Jvl?A{էjUhSrz}^ߗr]%i?AW-b؇-՛hۦ9|_mќs x?|3FK?Mp:cf|6 3gZ/ qGs貛a/hp6l5aڳng5!Cu`=n|z\HWQ:Yczǰ={G >+Qp>Ǟ8dY.Ëa~>uGu[:aۡ=9:$t5gR' 7a\,tS3[RKtN.u%&[Ҽz7_8qneu𫁗Ҟԭ9t+ z/[1{ 3O GP64{A}eYY3t?7k>+#o߮ߓ;J漗a?;_{)x c>{J{7o9|iṯw^YG{ b!2 _e/jO }~}|ާxyHϹC=+{ x=zxkYItt,=ɪU'x71ۅތ^q͛ |؃=(H4~5Wl|BY^+k/͍u_Ikk/b{ju\_>zY-Qoأy^9ހ;Tl7OhO|=aQgSгܥzgu^ 8^s_?ydp>ȩ ]{l :?Pu5hofO ΒR/A[˭O2yMkKrOiU~xtGM))3wGRp. 2Jǒqέ{3}ˠe~T:ytј{nUw^рϙ؃ }bo %czg>]:/>O:_\vbkY/bsVݫ}^7lo427^}e#q{2 G!_ ] Z!˭?`᪓~Qk/x!<]vESgNS?mK XSGund]ϨA1OK̳>/s ^6ם'~KF5Ƌ~0{U¿u>uQ}C6/T 2p.t˷gsyoANO}I<Uޓ><3-ߛ9SH c_^(‰K뵟ϥlҺ#.&*Y'wޠy,k4pC^x:w: h?M}]~$#v g_9"yㄫ~Þ.\ ~>CgK﫹 x AO} kwt=4?21|3[+h&kozpWK3co 3Oɒr:c0^:a~#QЩ:u|1Փ! _%u{ =gS_S\C?~8t+>c~.QW^}f6#kOnϣ_ HjR{zx [No^% ֱq/2E}O{qAѹTn]~ +_a ^2ޗNlՁ#j?)iPDY̩>\~+K\ABO:%~/בlܞ3):;Dr?^7|O.x>bgּKȽju==>!Ƣ(|wW(=t{Aϰ?X7φ7╮Ng|hm/N]zހO 2|geُY ,2 Qv3VŗƾQgk fuKo^! ~h3ԙHuڜ̡7y:4u}9{Ҙ_k9QHx纱}Io mC=r328I⯁1{}AbFUb$`$;IdRӵI]o+~v/l\}Q^O{0exgA-| 7ke1?wɽ=[)_ ϊ92u8lno&N {&B xcFwFc9͓k.ﱸ(xs蘣|]c/L_#"U8?~~s||_~{vt1Wӄ?o!>ܿ/UPչCħ~ߑ9[&߰y}2k:N|ۼQ{U:ԙ1X+ͷ~3:MIk<=y8{I^ ^O3fND]Ws@|g߉9+!,Q<Mcoq4x 灏}*uG ?跉E6 w6zF怘WgDߏ=~gf|s- _A]S·jYs\_氁Iτ?q`t5w/^c/CҀ.f '|]/+`f u7'Ue+kcu?_~f|'_$|>/؋7$#9/ _(t| ~w<(pXQCkh~?9=>{txϏOM7=*SĜ&uMp}sf&$ ˼_\q oRg N<. CC+='~c?>oʀ8}p{/_fcbW#?_|=HWēOϐ/tjIg|[9c<̘g~+>;w|Yf9˾y _gA'|eB7sD{|ICjoSy]~(pom{6E ? ooГ+]:KM\kĻ(_=Rion滬qb=unfj&W _n͘B@'~bܭ c?q~k3>~IO'w'ΐe^ts#=+ꢟw7vx91[qz8-۬Jy!V F^uש[+AWy9&C\7_xto)|:A=#]K,u,E_&V#gWj,7w4/aNG~P֥vtc\N6^/M G-͋\yrp!!(ŧgҲځxo/_-_1,|Mӛ.ho'_zis}q]~k?o~PS?]' PQ[o~Ϩ÷6t8K>Ηȧ2ku.<21|j؟*GW#7X.Z9 ^3iZ~bޘ3" MH# ?ggMr<zY|S5ބdk6 ]Foߤ:d2N4rpu {#ѷgfֹ{xfcl_W7Q99.Y9W)xTi W#B?9]]n"|G!%ǝҮ`p|h*>Zk{+h(~D#}~uީ1‡9uy|]B0ChN瑏~:CO٬yCf퇋g*\_7+L*3J~"^x|0 ϒ6>qç8Nχ_x xq]kgw>ܨJ3ҳ:7mtxC?yw37䉸{!!RԙvsǚࣵG?c<ތyUgg`i/zfxl<]e/θ/@9 3L<~!e\x18F__d-G^֝9/qsmD7OG9te+Už8*/WG N?<fIN[z:I䚅d':#~: )'~V]9E879<]?90~"r9j؃/j5Γ/en~QzHsys:roLJ9|_9{J ˘GxʢG  J+: :,О|HY0 |ks{Dqv_ɇnњ[?gOsvy?/?{.Ri;%G*Xַ?s:y??.~J1o  otܪ")F/0.Ń7i:c\5LCLGܨaao8gf&gƼݨ/fQWؓQ_.a3.2>,~Or*ɠ4? ?fɮws"FJtp|^ @r?UIly)Zح8AX |3xғ7IGߏ|E~<)z]^s\õeThr>Y{ҙz1zg8׽ u݇ހƩpY[@0A }<?{{ux%C~%s ~8!rE÷o?6gb?3r438 <3ofw=ye1l<&3d?F > ~7>1sO,|ٴJ}>u:#}p^y%r,̻!񽀏~&|ؼjU'{pANܧ`}ZUOAY:QecTn>J<H^}Pᢅ! h|#W~%dtG.*=SSfk-<[\>Dc5׃{nQ^ᓼ^o,Wċo^7ײN>xa_rCGC~, ?)e{?1fu߅':;cJt[QkD!G#n|3|ٛ|1vo |=Hx]WG7cs9_v}bN]^%ab>yIDKͰjW9joӜk,ake u>3f箶n9t^fc9<u%皥>[X:x9/7y.o:EkSv }Ҟ5ϋpI<%C#>ʏV/v~)m\}19V0=DqA+cxdbރ({OP0.>9rX:IxF#xȉUyzvƔj}b*(/yu<_M1yVXs2Z?h ~,uF/o5^Oؗ[>\d?|s #T_s4;T{>p/o gO\q?Y@acGA'2[:?]o2Rr񝆦LwKTz4UV]%Ru>o+vOD$9_'^0Pg^*zys,;|w&w=|"D㡓9B}L3Opu9.+|*uNEY'ΫG>35?}}qxAyN3ߐWKޘ[#s!kf+ؗ=,x3C%Πv=;9Yi‹w@~{~ f Z1 _fpf) ܟgt25OtdԥC׭`͇nQ7Qȫ /2rTy*Q_QWBH\qι<ٺNݢ>0BEiUPH n- |z_J֜jWuUS^d.xO#g=Smr/ ߇+ct@ygޯs=tK;^2_آ?IOgg`\"tsoGZ٧>R{w} ^qWm94Y>3«G٠\u$^lx+o/4fѼUmfoa0u2f1/Wu{yüQoޒ:a]9'w._de֟_?OF:S3_gzLs1/=uL3K-y.'wBc\1X~lyᷭ9^o*7h7 "baJ_xsdOʜ;Sg8#V} biÿPG _ǡ;*(fzρ: |6g G-] o)7.ӹcy#//rW?ߟG}[<*/Go #?*"_ ||]qC8GƐ oYUվwVCa!Θ7o&~'/N&:ƏG ur|4mی&yhgr\:Mxf䙝pG|w LfC1{2P'w?#C9"t+~}m?p} ,fco!>-䨳]CK| /йwݰH"ݧ%˭ˣQ8KT? Uٗ,\_CO\:Eh{n262^{UC5קtJ]vwD6>6!(t/3%/#VJz7rm/V]>1V0r,17ܨ;i~'y/_d]C |{^܏ =AEi7coPgBN6?[:fgOz33<33 9füA[ͨeA&h} sQjpM跼/7D7~7鼤gL^y_k1Ưsέؗ5|]3g!/3|e|=ތAW/|uϗ9 x^1G}_1ĩQb̤ߗzK|١LJMŸ"ryم>ȉ/tރ>?߯9he8`׮~YkK.r)+'ʏt{/JbkOlTQk䘕|>e~~99>3HS_ǥTd1xf!:C8Cpf5]w;2#[,_Qv/V&zX~'w,%ƒ ^?r +| ⹀9%_7e~f s[SK|}}`!ؾ^Å?4ovh-?31kf NšiR~y37\qfƣ?Kc<{5emු+/} a|"y8g<~;R_?\aA>4G|rT_cԷ?S)dKW߇wWy“k_zZ+ң߇ i!2x):/Zs,TڢnpB]?r^ #!Zx,tާ\;])~IБgGxxK[v>x78VTs~lJ7}$>f쵼' ~pu}zLxh#>p r !';ԡ\:o%{NKԍKo:CϿN-=l2Ngҹ+bNa~Q xy>7}˘;9oܝW7^B^t/F+|a=z3MGi9CӤp_Sb1c&f >p/GO,5>??ͺA_;3D{٢k733}rXaCǘu^P%]!~2k6nbz(7F ߭V {yx¾leεrmec~ƚu2zÄwƾld񱡪硫})?Ҥs-_uT/~AEx7GS>x|S?sSM:AcOԺago_~ H14=*>˅cu~L{?/I:JϏK[)e?i]f$ۗ_!/~1!' 2S<~ܰ'^:S\wb>OldE QO ??<c?__ X9^6D-X3WG1c~c!U'C_CN@~QK2t7[-iN9Nu~9Dsc~9ETpyqKWɘ[Ȼ?\9;u|\l)3g >ϸLnػ;5'Wޫr`C{ ZU6j:Qn/c̓/<3~h̾ d48#WxzcVCchG?Ki~_o̓6z>㯡wl%tUoLcgl};=#9Spy =.,C7o?!pv~7++=ƹo#>O ~+ow ;C_kYYگ6rJw/t2K1cd3#׌:C |f|4\1Z=RgGL뀃;{~gx/#Lþ u/)ꇙ?"˹s|3a}Q侌n#9 >gHujO}_xKKdށ^;WQ=G$Dwh&dz Ha5:^ 5>\skN^`NpxΥ^״?C}`E7sSzԻYfRA~qy@PJPyE?p;/Of=%W"9|_LA?)t̓WT_Ox|³/Ӿ}Aܜ;cBz}P!z~0,^-lퟌ: Y5[y_/I]a1.>Mȟ$][FJn c_.bޠ^/Wٟ2~^cJ6>yeh?s :p3h |:s4#k+"׬U0rg˴? |ԝ]s~\친_"ESz?#O"P_{Xoi|7Cƾz@Ow6F_y4?)id9 o_:#р{$Jh^4G>  sn {GuknѾyxqrr(W~b߶0|Gy d&Hex{ǟo|&rÌwtJwy^P?'{.~'no^\/#Gy9UaA+L2X^V_y:Ms5i"&xe+g<|>/GΌat/Cˣ:*\>Bc6 ~pe6 m5? _Lq?rxDTO' iz#Jyj쇂/a^xR)!@3: L#G[Hg_9xuv#Oaew~X\>E⹢tp&桘_5x`Â/ :˱7u~0g/)f?;p}2^,tOi ޖVsD`oKaOa#]3"SOx'W1s\#31/Ƽ/ Dn~_o>xdKB>`>4h䡑Kÿ񭱞8Gc7Or<<~_R^ZwzN ~$ciѹ9M N_gb?e~痜Dt5΁'G27zKo<^˖_#>?[\?`)d+G9! Z^)& }b/1t,}hyIn/1bǂ0^<9>Z3k:9𫁏 y0ci&zޫ{!tnV=r_)/}J/rzW >5fx;Juҧ)JbfxƑkBϭ0x'*o4 O\ldhkƯ˚הKIu_)>~t3jGt[nG'Mmq!'BFuzT{<剡Yy- O?xᕁ_>s(OO kOꐛTSfxm}v;1\OC7C_M>"?B/yw' ^2 zyxgnAߠ8<b:Gܘ_ȣ$c-׋|b|+7ϺԷD.ΗIxa 4N .|77|8_;}kn|aCss|iICc.ʛS:\ ׎Y{t2/_`z; zP9DhxR79<:!tȅn<$8+1U9CG 0rsгʿ#&iȍAgQ7׌x6Kay}/Nq΀Ԟߨ+yxk2_,~]u;؇'7.7zC0<t,KI~✪ +yKh ߁{I<+p|im! l̏a䐢<P$ɫ.ҹ_ C7 =iF ? ,߄sɁNKpNƸ>{2cNqN]skW.bc_b/Kc1,/Sg <2x71źa^24ܫs(xYs= >q-waqb_Qko |<{84uFlb:C>|g#gT}mp|o~eg74 O_59\k{7woS>ݮz3Iy 䳁xr{g8Eޗ`Sue+8 [0Cѵy~)]|9?ѣ׀P8 sψn(/ZL.yu޿~0grrJ3σ N']"u_ڼwWls0r ]׉W>e~L+d7DQG35t yrs'ܴN>y9|#ASKK:l9zo7xgwΰc#]΁;>Z>|8xPP)}hE_7ݡ9bŅ:OW'|8 3晔pK0~}{g&h橅/' 7@Oΰ_m#yEk/0/ יz_6?iyk\NpD'ÇƼ.7.}}[F-:Ӈ7>j>ߏ uyBEØg"O|䩧TwS&/>3 G? 3xqGw// Wvr٣_~OC6gKF9ɟ&^0u9J%>1}":tD&y_u.$tfwކ:ymԧcŃ5yxgʴqwn?r|p;鵚?zKucu^Ճiwȷ@#5/\ƹ|Lq yGs[o$'a >t1Ɵ&p[cG.O|zN׌nԾ :O lܖy)t臘}.|kgQg3h14SC{3r؟lx>z~Ed70|C~7uc_fre|_Zo * n031y:r7g~DN(ݼ'L> 6wLr9Wg_y}N3w|Mr~"DnOϠ ό)is'_0U|r~ʓ,~<ɏ _P|wнDn%BmᇇvNAtا\9㤯@X>'|չA}qw:*oK<#}D;3Op|*?_~#zNY+O[WT?9~~}oF|Oٿn#|8:uD.5bE ѡ2 ?{ŗ:t~Gf?:V-prdţ /4/熹9'wd>}wܾIO]~\yd=>ݽ뱖.n#b[~2] 5}t%|D|Nϋ79KȽd1oH:gl$ M2wE^&|yz FA8{24'5OPw`o~Ŀ^@O:<  |8ϑOCa}\~֋_u}5\ _4Ҙg+~G¯|NE.g\C1ܣk5+pz=*B9e;Z-)}|:zڵ?Ps)w{w=r#gؼU|sO_M_}F.0?ǥnp\k>WCb>1%/ _z)X^o[ pgK`^<GȚ/{n,zwόqWjUܣ2}?l{3R@}M#ߌ _Nr Gumw^u)q=~0tsYitFN:x>)|=:K3@ |{Kx}7>|<|:VPN'=Yv7!7/o2nc=FE?'cЃFݼAX9dTw#L c6mXYu|[,̿rLi,˪ i)د>t>޻e 㳏xy_i7CYiX<t94gڿxA\1 }vl >xڋ:/(fG.^A?>uua|L]`/G}cΪο.HQw:{:r ҹGĿW ^L8&t:y}:Ԩ3k¾}UCa\O _5mfY=|<߄9:WCwx}e:.^--6Q_Qz}Qbiӌļ_'7/ >3`O |nxN7+v:a>49ddc~"u O svۘtvA<}BG :xg5>gXxCo6,x u\= lA a!'1~__B^39CW>cfU(]ݜwD''|#斯jKkm|n#^{{k| o&y#84Wy8^{A҇rv< px__ w d- oܤ`9HL3cbaG{G~kj|="^ԡ&%5WI֓~9~}ؐ^:>+tC)xӴGz߀=sc~sib?ߧ8c?<9?/lB?{%6v*pp?MΠi33I]o&~$^߂ F&惒ٽ@zsoioZT+kDž=Ng_?}3y! e-O^w~1OgFw<:{\ >lG~/|=)=']ޭS>U39ڃrt{]9KWd?Mk1wD^8|c2{7q?ASy -=DOt+y}7_yeDL=ldzם{gvmй|jw蜋r|#w}U䥡+u=yǸm(wy; ~3;曣!3|>|\i8C >~58g~sdW"gv+7>=r ୡiKgp|w:\O'h3 61ɳ鼚_>, cO?Ds3>'v. ;᫤ޥ=y6 ^Q'o_Uzk|y6kqVK}o?":Fn|7kECK1+_2isOs{隲3/1[ƿr没QKP^Tw2J:'`=4FsAYȻ ] %8yih^7roCoI=!]o9C5wOȜ/u+>{/_1ݛԗBGCl|44.?+|==Գ}yyo cౡlC]3`.E]o@٤>(|๱?s.to tL?cA >Θkao\|؛.<0_N u{ M]˅NyK‹|X7RoޓOV?y)|Gw^Bn y<ܷ]h?Gw|潁t_ _q_߬_3/_f}W5wX1&ٗ;-1t@~+}TLOGuoﳸ^u|¡Ƨ|'OS'}t< |t57 {Nk?9&j >ęΟW2 ^ 6u@wUl;Ժ7)}lvRv׾&?|8ד50Dvp;@MQ)GI8_1u; 8 <P"F]!oJ䩑opf ffxȣ >+#<rh /^$X^z2^|N_8`>{ixD൥O}xǿ<JO{f~=Gm쏹ޙ牿Ga>8cI)~Wata-ym5t4( ~@~t}Ż甽*ϕ! ~ZCCzi' ${t>w>)yxB |mu#4tK?AUCM(<t#5oY4:/s}?ܧ!O4t-9zMlϨ7m7k1.:M ~_5775jAg1π&᠋׍a5cs7Bedaq^393r5/1(_p t -쯯^Π^3pRvO9<88EEmT}3')M|_}xV u~(^"Lr௑6xHeR|^'ou⡋!~)6C-^ch| }4ok}T 3F(z[\(7uzo0~'\&5,PN@G-ڇ8QIs$/un>}}P3P;=OcN3?`_mu^Süx]X;mx/ y_jp^n}` ?+/WUJCz]KyT-o3t筜ѹ]"xol·#=ݪu=9ws{4 =aƞ 9o9>tq:c>N Flϐw _MxfˀϰGkܟ|3Μ{3f;TbY=xQM|E[f`_yܯ/ޭs!OϘZ3D8wgk/LJ,9>689$/o~Wґ:9>ƃCo <4|v)lynյz#i~v؏r~e}yK:#/1L\x[pI+Q9I J˜ǃ48 y /WGf3>>jx')b #.obrxo^~:ჁtAq}IђgoΏȑR4g ޸oyzB} ~?>s("p c'Ǐ]o| ^} #U]ܟ =#/GChq } |gwXw4#,}.kqo̼ }e8?dc֪fʐg-V_οEObs| x4xko%Q|'ӞbϵN{$H#~]ten'9x4s{x~ܲ/o>$ /}_m[«&g'soQ_[\߸9:xp'cJTm7:+ ϫ`>({BF'//{n#e5ޣͨ㟍>kjn]3Eڑ=T#W/|Ay2}ԕ7kn78L0=1/ JGmO8ymS"/|uq79s8J ^u>_ޥ>_n}:֑4]힣uΒ[E.:UnyPO}1+FpKE>R8wT?sC.g-霏|_o7{wwQC0>:KuTҿP+8(3|M2?%4%y$m1t}?`ǧ>Ѽ_p?y1CFN_kG\00rRмoZ"hTVlxCS\>3eS-CM!,ӼKLQ_.]e<8NGyC#tx]¾<_91'{g~Q_K3z"6Q{gܕ>7ZԱ_p9OiH7}2x'?`?6 9yboҜ{4#7ʹyOcY9r<| x :5:t~O:GȇfB3YsȻ_kxlE=ԘùINu7 <֎nO'+y 8OcOpu/}=ёy8o\'5\Gu%\xeNSb>(:9=rœI_<,ˣ-:#ṋ{f|ڋK{4oV\~[8:UbCk[7LsЙ:G#0޷zzO[9W8 '4]8OC>#|ȿ!>gEr=͹^'ユ #/:0 9e_nra*>J+3Ij|~uz2`=ҹ~hύȵDv :x=Lh`z&r 턏f^;YEq9:Ѓҧ23zJ^a |ݿ׍B{?pu#g/ ?zn=dhsfy`O' _>ؐy rסM,)ҧ\q⋚3,/>1t;ʿ HEbOf>:1oXJ(~4?ԾyUɆ{7r~ ~;g9C/U־ 0ݯ=e5>͚)w?ntS?B>OF E kЕ:7MGcieos~Ai@xi3=6 5px#?lȇnS ||h+<=:t3enf5\c&Kط5Ѡ7` 1ٟ1gr_90OR##td[oEg>,9(貸>B_y{|6Qz>[; JR<'oߘS|D ~)/S 9g1.][:f }:o+Zc bxޕ4,O$ʉڷ F+k/D7SLe?"g-Q ˄wwç3|2{8^Seō:O:)S!۾v|.˜`¥qը#=cGS G4Bg׆9ΘcؗdF3<| uHVo^"'Qg{+9y[l?~+axCzc5u$#<}RO!xߍ'~߬? 4tk?&\*@gDo~/7m!NI6ƅ3?,Tѯ#<9Mi({N*?/[~U|.TӞbp\?pלmyUt~2oEv>Q]Y{I:'*c{`W⟣C L榍#5.Z 4B#;—$>!s_?;H>8/!\(}^'& $\(x>+3 z1-]=7o܅|x?7y' uu|;W!kC43gOy&fcC O?~5Lc'эu&fyjRgs iQੑ< ^ma>4su6‡ ػwl_{v(O~suy?/4 b5u ~&>#rv=21/?o=5{o%E>|Xƹ O?_}N[x\ty]|5&i`9N$54/Wy~99o!bodpA!y7]_ + @c^ϕ圮L1 P_e_~Y>8 ~\CO/iciGgR_y// 9j04jm:')r:بiEi EK/Bw:Q-&gsg?|"#< ~"} mz~\穂%߄c?ۘCgľ 3cOn6iAO11|U|G:&,"qynYҞ.&J=/r9|U7O* 0hr/)cw_\x[UK(N~)|u30Zu;GV/_xߕ=ׁON&|' }KxVMZ6ڦ &aM6Ss.t@OGg.}nɨG?SoHsiy>C@(XO1y-g5Ksd_Ϟfb?؏ɞ0oe|7 r0}_!?D/r5{vοc_D3s 44k/`xPga ӹR1:89t,w BgxȥCK|ixbpn_q+ǞWƯټ ytG%;śMYyuC(wD߽}!щ]wV+1~5+EΧ#{9UqoO絔 |fNԙct'}1p' ^=Oc -iQ7GO𸙇bi>*xמ. kckV#>I7+ ǧ8N{ʁ'1r?8}#φYxc_R9107 >-`T |ُϦB3<3I/ 9gނ׌fCiYCxZz:c7C_zMt7kuDCH^}k{I;,rg29RkocѼ_|&gH.g~AԏU!~`XeA<ѲbRRokN |@s͇Ͻ/&4)E륧E:|xud?ʓV/D{ P׹N=&:i /q_u~8~)CU*wg~~.> [C~g꼹o q}y>+'={C4#ѳ>!t{:~_ݧkuƺiWy/qMȣanY>?|ŜCnc~癜Oow4u'O^{Ap؋i?ap]˨31/{2fĞp:_33rُQO؛=,cN:K>@Nȏ? (ҕ݄y>MɄ_g3E>8(汝9ߵ:*- _;@ϛ.U#n:xyߊwD?Hf|h G>,"ob?&>oIwxј}Ӑ;2iF#$ž ƞ ^9惐[g-Bg3djh1,?}敉 $tQg+<62ɝ!wY#OFgjcΣaoHc3<+L}1ӘoF^ }1{س0GxN)h} pA 0G|{rs@1} z4Ee(=ן=bE{Ӟ݅2Dh={ȫ1O!utcG痽+S=pv[tţ7%r`Ⱦ1Ch]-yf?|fϪ\\JŔS>H8nָޗZ?{vuu?< ӄo}@7p̋ʣ:gԧ8Hr;G~>|xe:M[?zħW[,+:xaB'|r݁/5vJ9pt/"}q_ӐSyM:?CC}~:p~|ÀÀLJm[5w2Ğ8E~ԗ|F\<E1ǀ3y}ϥ<3|þy3>oϯȹy*n\O_| I} );Eu`]< sRiD.wy`$U9~}7 yjk%'-pWb74#{ȿ7Mܗ#̙9T$+;@E_@}}46)-_REu|iO) t*TioOXazJǶNŸm85y*o)mQ{7*/_Y {RCG=sg̙k 5{#ަz<>Ƚ&_>>'1W s=<1pp V}D=!o} FƼDG1V|axd_F!gtCC9.p}/£YR݌L{YW/"pt2䝑 o >Ƈ8|x.X=wo 8?]Ћ_i>%4|`ƛ+y+dE\)FsdvM{Ie| =oًC`u|!8g1wwo=jBI "tIc[) 4مȃC8#(+r7orW/}ls-*+܇<ܯ2B7 KHGBtI}/v;n<:E{ܡcCu׹cUF;%N*x])o!x(= _w%GA"? }{ޘOKyʡs5/~cAt-)ۧ0|< ^}6> ?u&[f_ >$/%ss x Lu_}8?~fXeguFM+w&<>vuVs?Gjg}@)~aSϞ'Yx*9諳|GB]';IsRNRS~џNb~|#O':[?1o;tr'3SQ / Љzہ;̹$[Con\,ϗuZc;O/ao>֧o||ʷ1O7mYsmYC9y7+ϭ>*3y lK[WN=#,5~]K9#<2S}BGI}{MV~ҹ]O(D2:mtI ?3p|ؗar.|/p_x3ʵ\G1b_Ƨ 2{4b-P\ž >0|cW]!l]|fVBipz>}.H󡓴R#;󍻍[N|e_O1wygŞl'/ A^;ȉa>E}c\&dͻ=V sLC} ~d542r2*^Qy }%sw^ <ي=O}a ˢ4ُ1D 79ўC87NY7? ^=\]{¥ћ?9=q6[ >Kf:K}c2Gee]\ ?ɜ.~ifr2ɧ-{b>)YW\.( ?c竑sxם=sr*o%g =QVϒA{AyپyI?289@'Zoc2-Qy^ޢ<*rhО rK ȶ19s'Cb>0 tDiqہ3'݊秞9S<}zsat)؃yE'%/cQ'ȕ/?/>΀ ܟ:cUkS8쳌o#<3xxWQz]C~dcU2/p}{%W|a<ƾț/[w:c>ҳ_,GtA|GWLp!O3e.[FGIB_]B_?1xEN:ꡫ?Rc&͵[/X G4b7#r/>ϊTּ>fT3H^DZ($2^O>U ߗzO1+<`c^wi0RW2GP_Wߠy.puSG9xd~a^*e䔐 _˨3m<>sMOVz<c#Ç L{_֘[F-*3P1ѿ:s yj~G/Ө\}uůvŒo )C{z[ \zު5U]ԓԩ'zy x\S4c]N$Eo~7>|qΑ6|mtn;*r~8c'j*7C3q'x]>q*^)]WfH |1fuo1~1;M(1O_]\<˅.ee*s?o=-A^b 瀏M>u"uyf/%d'Ga?xvn>+]3s8 <`x~EGu o,cK{.?P*Vg"%ϋyq';X|ԗ=<%il]Ι ?y'ˇ ܏OМ-[o3ft1W5= s ˛kK|cx4><3 y2whdNYzxKZ\n}0OAٮe Ko`;C?o>>4.AI!$)uKEo|i3S_Rs}=0d6Kϑ1. +_,MA? X^:xN5%_9|!_Sei>3OD^e1 4^Sه"2߫}]XO9M^'{lA:|e 3?Ɂ\F|*roJ'^YqG;5*~u/=<>85O:+c0/?oݹ?zu; | |]OסWL=ܤ=5<1楨/ xFz+"|A>%8{NsC;pxf3[]&uD{pc[foό:B׻-8x_-Sg_nݢf^1_r^{B/ >c^_p\]g6^{ ϳc>&oUsƀ=طgOnYof Xfd؏y~. T^)L# ca?>WlBgWzrtU~UKy淲%%?+ƍ+tVT]sT'$o'~2yxߋyu^o(ÿ|EsY,{߅AyHxQOx}̈́_Q\\^cZkwh8/ȏ"W;]1/h9E{o,EgB88szyM[Gp!9o>GXw _~6KOǼOs}3%sR$'Ij?B,rw?)wP~C2y5֋ ̼ )_r pG;_xvI rkg>">u}N7̣Ñ8,]f% w 0u=2~04Eu^0x:2|95f/zyr![xW+߳'طɾ ?86ԕ7&̊usǠg?C.}gBL͋ x=?sueKs},9/#/1Ǖ7>WB8:^?/}5~k=l0?Oy 28x7w`xE l֞$yZ 1og9sSe y,-Ԝ/?~.k_Cgq|ѹG|y<|.kÐ"zӽg ~u7[׵NeU]wCG1F}1~~# < '{yH{|zo0OEgKb4CgqKO_u}uX1>-=or||'}/1G{3Ogogo5Y}gUR<0QVwZ#UyQuO+kdcu1-Ic%uo.s  - K[ԃ%ϊO̼,x2N]O/ۿ<;u~0?$g=«0d }P23:4wx2'X{'Og~?Юs$m/[K¯'dd'Hi]E'ͫ `|7ױBFsX[27g O4WJ3+Gi24Y< 4^6D;Uş|'/ЙP'yg`$pﻂ <_AsK䪓ss|]p՛:>P/#(\[E1nh[9|_Q{9e32:Lḋ$[ 3+ 9m{fSҸr: J{-eGo[s8xA'[l7)`^EW+뿑OHzg:ə=7R>㆖e's O7xT;?&t:4s٧ C8/gJ)࣒77Cρ0±c:wct_U ydӀz/ Jn"y߯QUx[{Cs ` ́G?Z$\?|yhD=1X1?p~?9s=֓uY0y1+ {7F~2 Ga󈿥2{/K_l_%Zrp)EyI,9M{%Оy&xޗgb!ۄ|a? }@69Cɇ;#| g K|6Cz/?h-%'_FKk$[A8xUβ87:v)o~ u\[Q( 8Gt,yPc5@Csqٳjc`~Aݐk\at6wV2_&=^ 3Ox1Kfe~@H}a9A|G :#L%œsY|Ϯ?,?bFyd#9~o|~Wq_?ø {-F^Eqcs8W#rKyzu-Ц> rc*|k3/N~Z~c΍ ?þag89 3FR]ß и+~ah̩4syޗ#CO.Ϟϛw8:|cǹO`q_@d'#q u?\KpQoN0'<xegOޏ޿_2u 2~2F_zw ]%fטw\_}xŌG~~a|}'2,~EΖMwu 1[GNcvfԃu&r!G)Cߺynا|tGk$x6eEHo?*g1c1TuGs?_9y[ޓw|_+)VOX ۞_+Oo_ü}{oŜ/pxS~99^ ܝĸJWa>9A}D؃\R|y.j,ǜKF3s <3YI1czpp&ˍ|_O3 ΠD}ͺ>^2s#N9_2tmb?f_t1aC#td) [Yԅy⹰"'3|q y't w:#P' rZ+[d2k;rcN >q%_6r C\}x8,SQ =Ga} O<;w^_>dFl^[Opx70篫='z9-Fs§yqvW <~~9kuzfO{U^ACo]茼##v/n<|ep߀3 cH!Q771KKtn.~/OWi̕'NB}'/v=ZX6Řs̜da{UA~q?yt>ykON?3R}H0x]_WB7'"r ۜ߬˾\C|vg| }\T$ЂEƅ+ct=~8 cYiu_O~t:S:JAQ_{0o ޲c<Ϗ9=7¯qn4a]qN_4S7_Kq/txOsW95sjs ϻI! -c s 2ٛQg؛5ccF/}f䖱7߬a %M.7C3ؘwx7~K^^/)ݤ}MC}BN},srcoO<<|CDBE"' yC|Z3oӕH}SP i&׆=1rxt'.{lb*'U*#*@AoY||*cU9^({bJj')Hzso2t-\x?3 E\Os$z]t'i{iv/b3})1xocɞ O 9ͦ9Pg&kƒavs$׌^3|g1[/S[\C2{4C1װ7ç_?d (>5?3|csoX}k5O+gg=ˁOo?2|fbjFkGɴIM{ҴsO<7Gh}jm\瀄 y2Uz/go|ȳs1oMC_/8}IzYcN%|:s)\ο_j^0\4.@X[+,>t 1ߠ{1opO@e )g2Fx*<^9g!?Ozf3ǝyKrAwǓ: sx)Ko8x[|?ϽyBI}qp<_y~|L~,>fe>:UރFA'C}crZ׻v%+_n>L; ʍF|Wό^|n<1{wcgvH ~1?dQg'y\L?y=svWWiyF't_f.:0BϪ~rNy =dx+|z=/HX=[jE^8 ]p1wKSWB[W缓ȵ>D<\pESA[ M\a=ҝN%~9GG??B)B>o o ?39T? gU4i0$mi;}AwI$CpCEԊ?+m*ڂ $nA0F;|ͥ.Ӕ^7O۳9<Wm#5%#?Y to$q37ȟy8)zUi"~ߤ8c:>8γ "v5o[}Iw{8K p/۰gGa"@5?w)R' vsOx3?d>BLf!I} 9Ǚ84O+9@#Ź)%䗁z)[ߟ=#Liğ&Y' 7Ot^'wI_yѥo=;{<%%y!ÿ-OsFq"_?~ qd3|H:qkz9 W+~ƾ<#~s@\7)U>{"=7𧏥25Jo|߼ ?0靶"'ħIiu8}qa]Fs.ro~> ~'-IGH%y~}xRm;}qkw#mX\?+2ybECyL~♡7&|1gfF~g>,/s$&eFЃRŹM ycyn@t|fݾ>yF~oloD7 2f._s/r𲿨+?˿2I&v;w؝$ϙ6OWZgE^N#n ){w5Y[0~}h\1$?'=.{_G>i|^M%oG|<ϑZȧ}PyK!}oI~E'$-`? _߬|IID)9ȧ ?;>q~Kqx7'y2q~o2v}×Fy$>o ?GS:~#r~i_qӣ~%h$o~KzDS7'3L~i?^þFg⼦88Qo&=w$ 3gIf 4ݟs4͈wFf5?ޯY2h?HzfѰ߉f#N:^sďOHy?O9I$^ſ+ʫvK:wrK]=}AAO3C/. sY·;IvЋ}gSTBF|NHrM>pNۂ_A~Jw(=)쇛寿$90A-9kܯxC +8Wƾ^ay˛Rjlr mDO|kӾ$nClc8%Ixi7R `$_=. ?q+;e;$ <,!1 ?g%jTo9ɟ- ;_x؅'iz?{Ԃ'ߠ?㜨b߄s49Mم?cq69_333/.|Tw*npˌxeό<8 &v_M?3oFq?3My4l3w)C胠ÒɏeAD|-L~ ď?  7qeɗ~~y¹k^7jq +I&y;Z'ȣ~nÿ{!^gO^i)#|'g?NO'Fpmwޯ-ۿQ>BN<:'F8#}>7:9GgzKK9OF<%~sR戇= ^qgC_ /q"~;x]ľ83aGb_~!{0;{=γa!& ~ epއ|:GG3 {١kN٥O(1Oy3#͈>ǹM { v}9 M"/<?e8#=!ItΉP|=1Gys)uh$B/cJ,_u"]Nv;}ːGwmMYyC:qԹ?'?#1o/w>sMv%oMҹʛ Ɉ3ɮק0[6&Ʌ[}ƭKz/NUA"> rҧy[[]/ǹ> N[ nZFn6KS sZӠ?#e7Jc?;\5L>f6Fo(J)&v@[^͈I>4 ۟O-<~I[f&;0לc$r/92y{NWⶰO'iJ~򤧸Iд{(XGu'Q?5pך'[~޲E e?<">H|)nL<+2_8';UMtNsIޝ-OINq偻?|f@Ч)nQo|G0 cw{\তD<>]8O`4^&9JqOIG>pnG\ϐ/-g$/':FR\(x\Dg b?}w!&yg'; `_NF~C 'Qo*bMгq^So&>Sq3$.d f372sTNCMן@oAfh ~"zī]';PУ$wm'N-t.tUˎy2HN8G8g?IMSrIo}Q:q^q3oXxȖ'm_Jr?b^-bA\}ōST>3 q+o>řo810<~Mc2!l)r/-o9׷DGNv!m%B_W&;QUGM_z8k@>Q'ZO?eij!U<%vG\~s>|Au% ?cD_337;9{31cy3z4׌ғ_x4Fyg8 ſ3 R;#վgM n}[܆ΗGCsռ/V~S'E]{,t,oĮ Ӆ)Qăp?G!Po8w!tuƹ{g9{^;zM'7#[m)e Pf[R|}AĻ>o97o\kUi}}zW ;:Pvmb}ҫ焗ij#^M-#=ɼ_}W<~[|$;~C}b?]8_PK?1 7}gpI&m Myί" Eyub_C vo^WW*~LjkHih!nD9OΕ!2%yb8]8Ox >-A/V|w:xʒC ?4ks`dW{7Mzˈ!34yƿ|sx8; I=Yz<['yd q!>sO|1}~+.8o gBDނ=(Ņ-k%Yʤ73z򓊸q<z44˫M]"N %^1`NB䜈qÉ>4 Aܧ ?4o7F{OMt Ngqޅs!ŻIuu#<\MOt|b.%^2y#I^q Я?yKγ1~ i<寍ؽ&K/񜡇MͿsJ?y҈C%~>nO$'_}mɾvL1m-uQiз?3-ܔ □_i_z~pΧo8cOפ`3jg8+y:'pǪ$ߡcÜwCoW<ѐϔ}moMp{֤?mUS>~h;O} ΈfAo~Fmx;#wP*%qvsS\#z̔/ΥC#ϊϊ;E1#~#=NL|}Ԕ$ባÏ@ܟdˑ.>s.zA/ypt^<䁖 `_ǔ7rq¿v#I'MmI/͹?KzN OcW߾44C ?I=y Nzߦs[g&~[;Qݚq'ooH'E?ǏI%9'+׾us֝%;~=sGIw\qZcI~'nGAUoI~mMw/>: W'Mo%|v=漩D2~#L|罉oG5OC/dka? ybaGB?N=|Mo~'&3?SS3/>'/ל9P5_Oqȓrϥ ^A.n/WыKcyGd;vt;c>z'snEt?)vNYMq9//~Pz\3MSOr~.o0&'8)ž|¯EPOqnX96y;ӑ/jq7ۑDZC]Gr~r z;k"=}ΫFwE^I@qT#γO׆'m bDL"as2M?]@eĠת%oy{;x/cϰAo&x ?giǙ} ygЛ?sϠ'pN5ɮS? *;&dww]K]GW|y?P^q?as.#:܉'Ꮚs;⟊,JЏ|0Tßs=8|u"ȕsύĮ%yP7!TI{oJ鳉IcIڪOoGN$o[{ yN#tA l=}9ٷ)%rX{P\^g'廎|vBn"yN㜘#'시?^0|wϾ-^侰(`Cw؏$?~%@ 9}_MSCFIG|4TrgSįq>$f,fw&}>~πKxz0-׈2|_\ ϕ,j! i_of?LvЧY//2_4mt<q/]-#eҏl8?ιP[Co OѾAg>)?Qȧc#o Fi}&n7(]?wI ;4伋iG6>- [?ސb ~>!-?xq>G~ՑM~6ĕ >~y-ĵO}ս_Xz+țq /ۢsw<;IyV{%G+M9vJ{?$Sqr+y~0pȾsW~~C3?_w|?4`!w;qmCjyɧF=\ݲwRq3sB%i?/>Ryu~~:%8ϴsiėߚO|}_H QoHt_87&~$o'S$Eӷ} / ?slۚa?Lq⼧ %KDyHq#Essħ{s!ȾG/O8EA젲W} ~vC}Iι3Sؗ`A3qGq?e1`C⫵3I#1/'9{1f N}G"3Dd_y&?г ѳ8ߏ~ 0η>3=Ι %LMs"&g{I/KvЇ7d_ 9cjCW/嗱G^( GK!dwC#ߔa=G~؟"o 2_Ñ_q`BN1'F?^sW돞 Yewo?{?2#~~z:GC2o-oV f^VA賠WΣl$o_AOxj۔}[9&gt<֡""^Ź.+.fCD6~qt(Pӓ žVXËW]ӌ<aQ;Kr}SlG{Gy)Jѣ_ ΅r>8ea}ob]; |x][_ȓ@减|Ɉ+x5LI_6 Вc&ؿ h83=^3|< fwyG'cyL{GOc]w?>D\q.e|[>-oK;t6_}CPwGmݲk879ȓvKKm{SNyg BpɿzQ3'fnٛdhφj=#OwՉxg@?PWp:u&7 y׆ĿϹ'w#~ǾEqNK~&9ʿ:W8ɓfzL\3عlym8+}2!Ǚ} ~J9g N|HH&iY4W}͑WFcr۔|osju&_W'.~,oC=FzЏ*a׹_7D|L7\(z3ܳ1UJX >+8$(Jbʾ䋹ɞw?%}v ^⥒V͠&9"4W9m|n3нW_c_;%F~}1~S¾J>Vܐ_8g3a2! μ'3%^Sg# vD5s;?J|pM_k嘟}ս%3cq=߫soBN-?|w~G㼌Ʉݟ7c(`GƹO3' ~woἍ%Jq>|Jp~қՅ݆3O93c'^ i"> cG>M&fп7@ #omkO}$?,9q zM?r'#/ ߋ^>E~O `'LkhPu 9} |vk>ÿAvȯI9ɾ'3i'$/qN2K/ž}auˮq¿wg10-%_&7ry!(ގޱq| ;y;9 ;d׊g[x6 ؠG|!s2;#2K?1?fϏFgX|>e&~ ˈIMu! 31Ke}٢'Ĥߊ} q-9Bpqdwvx5`! qgfMݑ"?(Ou^q~0U/>r?%Hrc n>#ZK|{ yqГ?ǡq>؁ό${w 1 {ͻ7cqΝa:y]:?y1oMe ӹS( kCɹI~+.Ndܶ4Ł:/8ҡŞ/ȃkggd/ ?ˈ$&/K?¿DqN|7#g >3ķi|5PЈ3F9#cWvICLOK)5q7ї8h3.oVpoȗ>} <3[S92o_C|f3W& R8)~qٟo,8 x[[5yNvƟMrx$s7a*o\rqܙ );>ts бJv7ȓ7oYqV8v:?zz'_s77YyC>Ez5]:Wd?Wج{aW<{Vqf"GN|qNI~B>g~̹έ`9%WKt< y3iJe##oz3||?:yN9ȿ$L5OIp t 9]U ?8zw(CgnNIt^1ԛfǹa 7SПaykG!y԰ Q+oG3}98! fD y4`_ ~a!>qd7ڿp?)O`?y?a'^h$^9I</ CNu.nfՈGIz?΁Ȏf΅~w@~7OP1a_(d5ιWk~$9 =2? ~>_>~#@Nž#~: INyފ q2SyŽ9燔`uΥbB>gzt. =֋Mzm+%޷*}Ι_3sps6 | qS<2ٗpҏ~hxd~3| gŭG@3/~z2WF<8w @a8Һ,p8$s75qp3?y<8ff}y^O>C}aSÏJ" k98F;"  ?@'#[\8/G|*=|9]'zl& ~NAw9^Hrv3Ǔs3G ?͸?3;D\Iuahr?X/ÏdMy}icF/}4W&N8iz]:~+9d+Ob_B_;7Co yOg Zm jӊr+~G7v/Oɯ/1ng=W_c?􊢅YjycM56||Ʀ k/mlUnl#i?40ygcm֭MG46Xwil~xK?M}d7FV<隣ץM5wEz}=oilZ2пoiƦ}-56]5g~mW'.9/Ʀet zcӹGMg޳68ȫ.nl:}Kfo;u66=#7gNK~iƦ>&oէNz/5}d㷏6GQck o߿1GY75sW1[kף\j @?G91᭟هC{Ӿ_cg68>2zc/7uo }fxoП=؟tcO[C޺yݍ?:z)j @?Tcc[i V{c1Hco _~߷14~Kchs?Z2/-#Gz Í~?|xt1t×NE}?󩃍:1tg_71t@k^:sxKcgwc茣geccW[>2 =|_1t@>:tch@__]c-kcC#[76~пwick}+^z}cu49woj [==zg ? o1양{ށjϔ=s=￲1-\]I1-?S?;zӁ'\5;䓍?X_WMcc[k CУck %k Co_r=en nX~1yx˹;|C?w|1xӎ|1ޣ^_n g`G~1-q01Ko|1kG}wo_cWn7?h Cگ5n`V|O=i4r` oʚ=CXϟ|z98z?=1;w1xCgU 767h xPnn  }j 7rk~xw7j X܋ÛYG]#~S/ww_? >z,_{`eȏջdz-Իe#Owjw6+>RɁ}wԻ0K^Uᄉ6wwM\pn-M9ߩw>ϝz=zzzզ ZM7g~S׻i'zӆݟ~mI igN~~nzջ4ڧ#i/2p[t߇7w֦}GXզ =nVgC~uڴ n]T9sKt֦+v{.z_̯M?XY2p׿6|zO6C7~޳rzІ{զ_jg`o ?[j=?p?zϫz6mS[=?9pa/Z>ŋ=2p?~j-ъ6?d=7;=?WsOm=n~^Q~߯\Pm_|x-~ᇎnwQ=7tzg?|z/Ԧ][끛?w{4ozHmzϿ ܼ=볺=wzn>{۾Pզz[_NOQg{-8{ov֦Y[Vz~7{צOX]2pK{_4)z픓G޻rWQ~Í{N9U?Qg;4ye[j,I7{_5G뽯e-[7 꽷NyߞW[>z[?2]}G_z{nR}#WyE)o5m˪tzj_GnMI<騤!}C`-1sxs/]WK/j֫KZoZj֫E[[XKZ[Xjٲ-W~|Q˳hZ+Բ`eW\-X]-[zg .lsኖ-X<ŋ[\ ,̮l:тK[\`Q֗-[]-ͮZ[_l+ֲbIk_Vd\/ pŭW+Z\gqj쪥g lٳV8[dɲ֫\:Ve7W,iي-u.?avuv_}e-h]E ZGhҖX-Ϯg+ZkY2~vݒEٳVX*ZsIj.ʠuŭo.]3bIK{緮xZrN,^؊-ϯ^ŭx_qV|X1,lqk ˲^/[=k3XA~Wdof4 ղjyjIˈ rlY+,2lj@K2.=[,jk LjZ6e0dY+,YJh%+hK zB.hKqҗ [aiVntVεta+\/]:jYUJW-,jϥKZ1`ӭ-,[$jmay+M^/fjnYubβsl~+v,[0Q,ֱ֫/[({gUk{[|Y6/Uk)&LbY|i,ÊV`يVYI3bX|~+%*Dsyƙ/]ŭvV|Iܳ|I|쪕z/(esV_kZZB q[ߊ8bAk +2vU+̯(֫-W_j֫Ղ/ͮV^-hsmvշ`AvRU,]`Qv=[8?Z]~wUlIvڗd~CV 34jyՂͅբU^:,]3av:5tmlm6KkYꛟ_VY\ZlYYnhleгo\?zvjYvֹ.e-,jlg|Vdbm˛ŎkqWK?~u`q\-o.e\\-njҖ7M `W^hioY`]Aqpђ֫ohJIi͞-,\[Zv ~A˳ ϮZ\ܲZ݊-ϊwU!۴^-ZݲgW-ϖ/]2+rA6 AW-jiK Җg -oZKW\-kCUܨբŭW[zhavhqk-K2mq".\Ѻc(▹^t~spŲ˖eW+ZϮIJE [ lQhX! /oZܔ{remu_5Z{RPq"W˚S\-o/\p֫&W|תYp^ܼZ"Y-UK? -FxLrpYUˮgV=Qqt֫eKZZ\h7`GX /^^~ Zzje> A\Y9WjI-~ڱl 1wNOahchxM.{߫?|k*n9]/I7T=9zKt>lUGί՟oiӿw}UYi^6tY*ߨ/ n'k=4GҼniJN]޽R|Ҽ?C=M/hCƻitEU;5e߽j~ nyiҵb ^RL?8E/>x5S9Bg|q{o*7@u{:)8|_G7|SFC~]8?P~]:׏zj 5~l nhC?q踋]1/.s1m ӺuET=яwwk m?rձo Ctkź*}cwjmGCoQow-;R!Эm{T~|_Q{G/?zPJz}j5=+&&I74E__:M >]^w_߯v4CȍCY*?NwO.\{9{'=M{L$6MG!z>MY~S:ܻA8&8*)ٮjU_nGIܙ`:RFq!o{K}*];݉{W_ռi=h_~~?O{v{T۸zKjn:^.t;OtXyc?i>z:v_;>#W^%p/jݚ7 bf^XXZo4ǬU/''nмO~oQwoz~@x>AQ=W7>u:P/pF5]~+X_kZoWw Y'iaf>{GCн?݃. o3G7pVn~LuG#u^%}Lt$wq =ٻ,RIrgkcG~ŔgX# u1G4?Izg,T{ǎX=,y,zB͕hOӫʹwB޼#R|bL\zSRzޚBHxt7CcG^~C =׻7oq nzOO3z$WԻw_Iy}{(#~,םzk'Btg/ŒjVrBhtE.> O%E.? o?g?󭠷Vo oDzŗz')c{)4Ox.-:ԽJ$-ҍ\=w7 sN%OtCwW:k=꣟//}ڕx>O ~Ay vgϥO~U?yk^~%r&wm'~ONڏܩNȵw}.~GߑW4yRI'Iů8irRSߌWl7Nz~+y 7[N/~oN[,~gywN;rIwQ]R.-~ˋwU/~ ߢⷸ-)~K߲ⷼ(~/*~U^\)~=uWi',~ߪⷺ]_n(~kW_'<黋߆7Pn,~/-~o}O{Y+p-~//~W^Q@CoW)~)~-~+~?Z~k{d{}WIo(~?[X~|WۓJ{s?-m׋owww,~.~)~U[WwW4{ⷥm-~ۊw_=Po)~_,~?(~-~;NJ-~/~X>Q2I\>Y}itogLloW7oK?/,~T.~R-~VM.mr <\&x0L.`r \&80L.p`r \&80L.p`r \'? O;P ؝\v'p;N.ur x0;yc+vK_A&*~MRƔ64XiŜO+|Z1ӊů Z1 :0? \^6w: (ྣˎ_*~luQKG'tQQWGFE[w_̂,rf1g39Y(~>,ڙYb3 Yuf1֙XgYf5_ng6,mfo3 xYbg;N/`W 8}+YŜUY*>ɳ < ;6*?N*b\s}NAoe[ɹ|[ǹzowmܘŽ"jU6 \׵~M׵h5ut.lƮB'+ )._(Fl\` W XĽ5} DZl\>oWh\b*xcwcA#nYټ$6KLުqnWL \{{ l^9&r4 ku cz|uck\ 5Ib1U̽[9]=7Zo;΍k%LX~li}` #mo6[zhWcܖ{0荫Vo(Р'ѫuoظzMsV|س߰fl('Gy}׎UVy_ܤ%-{b[{؁ݫ3Xk^tIl݃ݠB+]^[߿al%Wݙw]_3mWYP.U.Cw;_h-4}/߀'G3xF~yNO!T}j_M^|v'wYp?p AP\t|ݓ;| v8*Wt>6?.GJgfZx}gc 3b1y>vЫ𗑼1Q >OUDOU>;,IG9 >FvOt=-ѯ%#< ~b73#9^OT峳f3 O}N<|b S}wE;ng%9%q?#y*[KదS7L}7r*o/xE;8]p{3?CG}sX~<_cˋ>U͕/|;>ֱq{5>S% ݯ+k Q~#=rCopjNWJ˙U\h=>z\|G^T>3ߧ}Iao΅OcDc'sCߟo0=z~_L ( #Vt;i ?S- LVzGs%Z3m$϶2~X)}wƋb ~ON>{)"=F/c)}<^oJM.Gv;>TU2 N^p|cGыuq~MH]^s#|yp1Uʀ/^)D:a>糟ɟ7w_=UJ?^6x񔞛t/<깝K7!q ^wT?› B<峵 ~!2?Y{w/mDs}8xαF ';M _Qrǣ~!_u윿-_μ=.氵z9?7jx&G//_E59~y׉z?Q_s8a:5] N{z}B^o)%V{=<Xכ(<_G]pv;|EŹC O'?~K}g'-{PkqJN ~ކs{ }) NɾS0og&3:Vgos^SB~Sg'Ư#^-Ѷz~ #6^0\qCW'<9k uC#蘟 ODs 8L돿yOFAJzE/G~֡kN8fy5r]cg|%c>l|4/B'[^GEPpºu 0@m]Ez; rIes +x~^N]'o6m]C!? oΰyw'x%:2\-d tN>+CۂطG|Zޑ9 nc_p<_sylk}"^y]yxA/y>y0G=}RUS^Kt<9 "O%=v nO]#LCr\o~;5s8JxCG1t2q~~K1p\/>)h]C.z)8 9 $ӡpOP9wXX~%=j%="6_sվDve)~.ןhzaߐQ[X7s~U?yl|^xD{?qWǰYǛAU>=e~|i O|?lh|%]=8=iSw%el+WI?.UsJ8&zs3A~ .yxuʪ<ʶSޖ׎Ow{I=UYϓ7 KN }5gM_?DGUV)ÎI- x/;k* GJ3*~ yL|)oq«*e-Ji9{ёNe <{)k^Ul.C΂o8|i|g6Wb_G=UYOoFk;vIsfDgC9pa_nӪ)k p/9-4}\Vk;Xʪ|"e-~PM%?݆?az>3pmj*x(K~_rzZ\y{c}kQkG^ 5m/_]W峳tk ^s_ ` 3awBoA;n\tݛ#WOons|ⰹDCU>2q y^g-C+/(X ;>̯kRf5Q|cyؓOm*}U6 t/u؍jk*Jx"x߄Wxq vD]nޫ/qdi2 BW3ψ6 ?#.`Mߖ/xiO}lٶQ3 =qG#~4>|b%['%N{6Dxqb_5qә19yJ1?h2&Oϸ+9R0AÓK ~{k:=ta%M-_s |ytD^[~c ]%%;F ݞR_'mޛ% T7s;#/y~5TCw~0POtRixS=ەdo^IΟ!o@YMx~%@ǻx Uʶ~Gw|A>|] rDϩ:v?ӶSH~U>;ʐϵN4xv} JGïGzٟWy @b\R GHrYTQ3s z<2#3/@ss'f~|cxs|xgB^-AWU峻(e< _ܧzN-sz? _^z#o{<lj dn}|䡛 m!ڿDSX7z |}}<~},u|A> _DߓJ/J߃/Ko-q{+9W_pl|) re.5yʸ&?\e'߹߬>DaA/}{_SI\6|*=a+B8xV2B_wzJqoF7S#Ӭ~Y+'ؗW=)+U'~KOzHG7ú/|t=|z2)'4fWx,C~~jZ! tEž\FC?GYry; V!g]dx_dO39<9k>uc?5r=py܆~ d_X!%qWS!L^;qCW'ԯ?7cb$'D17"aÏ||gס}7?UU7p/ݹUxs_4z_ߗz%/v979i9nbO'5ߛh8'V~Θ<(GkO;wb_n7u?o!+%8t:wm<^{U*~z^Cη fQ]Ng&^>o6Hp?CN~oY-ߪ󯉆<>KV׶#EGuǞS=yI=彝n7eʪ<&ތ#+x)mIh~z9T'7'䡒|pZ~=|ϱX~b; 8PmUYg+ǝ k/ş9OB wszS8,v{ץ*e)>~1=!5{ބ~b.U.C/5;> ;5vE#!]O]/sCGjNiUV8`Wa6Ub7Ob)ngOR~zσٳ o#Mȍ OvU~{؃^kb|{-:5E+c  Շ}b)<`;-}?+^|vAyYxSxO!7"GҎ(Ƈ~ 86ۻl0eg.fߋ͸ <iyZxq뻹F9~UgYOhwGm p~> kOkyOKy%C{xR'zU_)ߓY*={dwQ;Tz\vyp]KӞvVxDʚJ4q|9'Wx ;֗~y CMVsty6|k==_IQ=?`PB_wxXMU>x3R>0CsH^_L~搾_i#OJ*y*2u<~`'.t^yH.ES< ?\"'z~YF|v.~9v; ;k/B=vƥC_|J?P/3*ʧo8/Oc؟"_>kj*YSxp7i,^:^NVs ?c.+K^k_/}㝺O r} w!YUTKo<=/Y4>q,69y ,~1GU4~=OG\vn~ e~J=+'\|:m; =mt{f>`-/vN>ix1S5QEn9;>aRS>9B^T^N>rà/Cφ>]Fop=׌q0yo*ox+d)1UG3&Vp^,W|Ӏ#{>M9Hn>>||wULX?e3-|*A~ùvr w证?;卍}\&D ? =8?h)&f~U>oØO&Si'w\?;mC 7p=Yq% 7K<Ng:4_ؙ't]tڹg~n=qx<`srs7 sG>+sx<Ψvzϐ̿~c~?uh|ubU 8b||w'⁩'=C}䷳s8 8F6Fŵ,坊vׁ9oM4<~tu"Lpހ'}|g9_Ry?@@I&E#ng~<Wz:}G<@\;T+:>D3_sO,j«ʚʈ}]A.1>8Q{%>_eu0Q؛r/ zw~O4|qQ>X5猉u~7}:zdOYܓrx|{L=X_Ї}1B{x|O =i {|] 4UY+!=Gl9z/3k}aF2O@͎,9ɇKrE_%q2|L|(wPIoN#}Nwkۏ.r~xz<𦴯D?#CAϢs*=աޫkKy sG3T}TOxIP2. qJBwG{mM4\=|ON3˗|1_zzW3}6>ߐyWC~ y}&jwoϙ?kcʧ|y xdh<19 y8x|CpeNUG:%߁_/' =D}&r+x=w/uzԎ˝=\-Kpz$֯N^m?}1ps#~u@'/!n\/vAz?|qƱ>f<+_qndD%x=; |.p}Z^=gq.ߟhz_2p~3tU%YZWO3G%aE'; },9G _2|:>OZXo!9v&ڇ_la+rJ' "w/ /q#W7t"7?6c4kʉjr| ޿J[}w?=e«Яgy:<'~/=12>~V?m܌o5vuؕ'=1*%N4|=W8YӺC.\LW!`DBdaC SN ۏ~=+]җ88K ޛCȭEAw|O7?N4|=W˒Gnuslp;[px]1B xS}%{ 8sszyywϓ,흑%zb;J#ZOxvu" 89!=6Ez|>|Gw/Wv=0oS?>6w;~Oc {KWDZ _~{.BqEz*38>^.oy*Zϱ@ ?3zjQ8/g\=*/|Tзϻ SKU݂^Xtβ*:s~/eN\y_;hw>3|*2䣫m_~=?|!;s>P}dqG#[x<@WrZU>{g5|<D<]Ke"N|UeU 2 DP rJ/>9|/r,?p Лoz{t'z*?g _8}q^|ɭۡ/}N]VU{C{tWrSuW];TY|R4/tD=?jz}J(7?O(KX^; >j 8!8)Rv7߾Է5tz#Li \]q o&QO8G.d|a_cs Gne)7?` FT"7289JOMg_)탁H.gv{S^G?}WoR~-)׈SqMz/-bu^-^/x0_tutbD ~Q>Ç'/C]/cߴEiVl>Bo_f<\o|.џL4<}nO fRJ8o{~\h6g^Is7?Ї~T&׵<'JrpN:kvx]| 8lƻ7KAw#6>Wx?[\(>*[,i4]7 86)G=vUVX >|zBޱJG'zUYO ތJz-M /?"z#cvw-?`qjJ>'DϩM&zUYJy,Or-Sg)?)n/??#<#~LrZBY:gn?/B dyo+< hП!_뒟 3(Uy%Q7~h^:/91#з GUY>m%JAv3$~o'ÓWJf=|zh}v_{9SAs=Ωe}7j>'Q?Op{-NXĹ||G?05?];o#:y<_pf޿?MIGtn;7D>/1ϵ*c\?GJȆ\݇o~N;s9rUO$r9pO5 Dh|$#~ *nU;zU‡S`|[`>ů'+c_䈒.rB6:M~ jWxUĭy\Ћ G) |#.yqξ|'y{ \ !| ~K~\>㣌0]xA#6y |HtL3//~} VU?y7'J7>kf\sG'yT·βs*~s<5yxE<יP#Cw[8%7Jͼ'G֕u?3k楔?8̇?cy;0ê΃{ޟO+ş>0Ng!9Uy0&_OƉ|qW78׺GS1u |A={^|1x;x ӮC aqKnO0sy<7f>K}oV={:+ǯhbog!w؟o=cU3nޛHCA:U'~]=‹N{_ zͶ+y{OB?UF_LzNe^e|'O3:\~։~W^ﱷ-ZK| {z`n*Pȗ/em~ou ]^`ÿONGE}o<Gn7E8n.3sGC/Me-W:LG.—'߁״x<9>\%yN_𼉼<@o1>n~g)csu:#Wwo@#_N0EAڿ NG@e%p b=1? ]o~TA9)>)DN[ƼgG״KAǑoKCt'tga'<.g+Kxiy0[)8jv-1i}QkCys //~ng_|<1~'_o#ӿ(7yCUF> ||K{w"' 3 ?@tS%qenڕ"DC]]6nQn'/b\Fry |ϼ}⫝g|.sti7J~;,k%>uX]q~7I7w9ryӃnB2WEݧ?~P/zK|w?s|5- K װN35k{i]<۵cgC 3xy*Y _`¼§Ry!t>-|^ee]/7΃Y+ }(a9uO=:xnt]45ء|<y 9̀=̓ 9S_O3@7fp\zyϳ/xMc܇~e]_3!<~i}{$.G/7!~crW7Y/g'dJigOXk_>C >u~'ǺП.W3SD\?ψyk_?9䋝9<>P?dt9;ޚ_P`~]U C^<}xO"/eM%R{;3RA8] x#9 ;ZW<9~MS%?ows^ ~NWU~lʥ=h?!aOMπB@vry1_ޭ;R2W~tJI+{no+7G5yP+Y2쎪zafVc++eK搮|zs)k' +xWSiyo_U_?aס*2*>}rv83-;tOvw^'x=rr'/yv.UeU>!y 1q^xk8/W}Vǹ5 z[`ﻂvTϹt͹8ס*2"]#gṦ?k?wvOz ~GޔZ9kW/*o 8fNS_os7C'?J8*ù%xw]9)ǟ*?aU~3e)O9q!w?g)|*㍪w)/A{~YyS^*?P~59;?!E~]q?;o3'y?ЛFx>]2> jsx96?^~Y׋&˱oWO< S7oǨJA(A8xf\ᷭvKMKq8ß KL4T7WI3-䐞[k]<>ʈ+fqv#_'/ŭ>nN*vMQ~/S㿀֯V& x%~=cg#h㣀/'0yUy|!|~8ߙ8#{/GoԌzO%4GEĻ:k2:t IWeߌik=?(StM3>mxy<. yh8Jqq?[2/鴼l-ǥysDϐ\\OMo~OwqsDa+ >OBYӟ(5M/ֱZىKJ/yONUN`qߗ >@\ا{n!ۨrHSo/ JY*ɲtWj >ߦ ,H_}<[~-4zwOxM|ʉ(oSk8`zfhK]Q៹ȧޏ~.| WU qGjaoط !?~).߱?goz*8'mhFJyuNɏTp=|WԮ?c7^wY_)Ϸ;oč^G:? tnHcKN~^չ>}3*ekG_%_[or*ָ/ <47GR+I&/wVxSOqt1p_gރ_c @?N#ҧU^>}My)b}-?9Uρocw?ՠ0<}?oF-x&z,,ȣ9_huSqwn,MΪ/#9q<\ߟy <N6| SۗZMU>?9K%qD;>4k8Q/I\Ǎy,CO7/&~~v 7v}u)Nr\sHߡ7brr_ѪɗA/"kh'~~jĞRaGx6~q冒O&@xpH SOyۛqc=8hRM#wv )whx<^Wa.suݱ%#_8<3Æ/pYJLJix? l\NK]|Pϣ KS{7h|._%YGc^&Ï b}r/85'~Ns'?Lxw8+#zSkpH7Gdy ?6*]a{cRNס!99\/C>:^xHKG_6)/s_dCOD3rP|ft<nq:_g{Y#|u\nȋScv?Ռ×GLRֲ??G㧟AyHcW6OH>AWSǑ o@/9\|! G>4F_Kr֟|?Sx|Q? O'¯M'}4ڇz~r~a "Lף*5_?qnovA}=,orzv;4W4>ȻO.QI< Tk6;ho)NjxOݩ>څ~_r_mXG\cU 8:ht*yM%ݯ_|E!o~:K%r y'/rz*cGN?϶%{ H?#UsJ^_ȃ yg}wvYKvZ9Bn=;ӡݘTˀsaO|qx9ᒿ_So ybJ~4ܧ?7ŀNϰԿӮvr$q?wڧ vY~_y}L{<| 2#O[~^8@/~sǣjw7FO_i?49׻27j3>E]8A?J`vkjd|~E?)+GC].fgq/[W؟Xl{;v0ـ/젬3 wsu ;6y,~!ת̶<>ɧGbK ?k.x:"YC?Χ]w}12o~~c{ |?۩ @=:Wim;c,Pzt8ox0#=KU,8>sbtj~c|^nOaP}8vnѿ#9yokwn^F<>:v6i韮C_7N Z#zȺ?mεŭ?O!Bqiq >Z=?%zzP?fzJ^:)ͣs |A_;oVw9<;=$}q=jոcy|<Ÿ}gIw{<Ӫet>֛$_Nz=ߔzgσApo1#y}.F7okS]/Oou9`tethNm/F8pQza[3TxǞ5#W?`ͱTlP9]_5ip3WoQxWG# {#|jGpPM݇n_~UgЅyj*͟Ov˸OzR/=]fw 2Qy "*+X̀3%@سSy5y8#hJY}×2}_zyjG|VrȔA{& t|<T.KvZ/ z/XY\wxG ]F~Cϩ2}q{;pB/^ NOqMO!D{i7~fGڄ{jO⋞00}?pl/c4qF+;5Tw?_g-#w龟2;ufc ԏ7_o^t ~2[IO|xO : spҊG;Ϙon+e;ҵߴz 1?~n=;k6 q5 +fu.&J5\j]ycktgpY?9sND{n_o7/8|g='6_|'z<7|e|]9$a_{s"{^2Y7gg|-X3n y@-NZS~QZ oI?/&acw|.Nlfwia[<qO{!Ky"_0yz7UԕaSkzSރˑ?}nP95OIWŇʧo<^;Y W2py!=Y> ?߅ׄ'_—cQt:YO%hq\_I5U%zjN?;觮C%N;c/*BSݾ W|ΈtJkS_\WJr*ɔ +zar~N68Ɵz33rPcxܛ+ʧ _Aq?U-'ƅ`=_Q/; qvα:OW5ڡ^Wkvj*ewbSu$A+ q=g_s+ėo_3#ny9ƾvyXOʧoy |0+KjJqctsn9Brc8qyW*B~?rmpˣp| $s$_q~DwU>75GWS9}}gvNvN1GG?l_voy UYO s6s8gg_|ՖWWܟ S{H.O;ǧğT u1ү|=oqV &zUYO)@O xz?maUVs,<𙃹\є{›|q>򒥲#q',YIϯ||-Þ<اٯz>0v9_o*KeCa<}+~׬&z|UYOGzT-XJ m##y՜t=ʪ|:ʐYX >G<&s[)*eؽׇ ?$YmTeU>JUR^/Ѳ{?O:CWs }3v왻ܕkƿo[|{6N0#}&z|U%*C/yεŗJy.v7gy^^Sn䟶@w96?Qkv#,wIy}(l#?z=!r/~x=S%ι_1񨵿/O ~Y>k]Aeķb},V2~![~C_v78yO|?_7c;H^ک=/ڝ;n6Kxqۉ>@}?"a>v8Ow \8<<#xt$ixxgZ|i/v<_'&M3$_53S_0O ͡cxa}A^_)쓼E~[y` "kgR>_߉縠/*X}/Ttyd=u-OL O?a/ya71)G{z/cH}˛y1̫ | g?ü`ec{ÏDZxM \[և:*Ւ^y"ovçrE,ԋ4e(#~ `>??a^-z?D;wv-kƭ{Wυ\?sI>1>'s/kGxy|8 ;q< `. #Bg#\<ÓK/{W3ĺ鹭_Ib\w|K|R~]3B~y !8/Kmp#'~3'cO?γaZR^8᳄7P;7d8Bģ~7tB[_ ;>/{|izs.)Gc=9|_ 7>-n%<{C||)t_65^i?z\Dbk\OIȻ;mL~σ\Ro ooG̗7.Ga/ tjyqBW[u q7vAG:l]mjwCרc<|]{qv'z}G1t::''W9cMS.:wio3ٿǖ!m ݁/OS>ltBu{^|F>%{돾E 9z7ENO)nu^1=Y\]ү꽘?Ycļq>I> 躏q7SKq+Ûmb _`OV;) Q}(ٟvT/ _7.8>=>Ҵb|qzvߌ o/\ӘO/0=y|yUe./ϯ.70xNލޗ)y{!8⻽FiywU>=e)ӌ7%=4|H:/)ɡ5}iP}|?;:rW=2"Mӟ^ z$ׇ\O;9j!;{M匼<%{JOIDAU~seIpԑS]t_~3+-㛠':tv O#' ]LewVyvz_\\4?O_bwȇj*XyO܂);A yՀCT\zG iE_<|R~~yJϯxzUԖawPZvOPOgjocc?}7+ţp{n\J=v<y{U|,w=rv/W%}L7F^C_?ů!7ޜO}&Uj'O7K|;DCU>A8>$8<۳̗_k;_q~)߇C/90^ַu;5r,:gtYO]]#8~_am|g`/3=Ó'>fݟ:oQOp|B﨟͖q> |?F=qn(ٗ# TѫSGrx Lfoxw1/ۇtމx2Ggցpvka~;bOx^?7;U%6qݏR7:ZSxNzҹfe~+{J`6vkWUKggKF_y# ݢ)z; ў/_u|@8Jy9=稡K_;ƛ)^9ޖsFЗOzjrI39pd=js tS:]ybo%zzp1L߃|=o8kΏK%zq5Ox ΏA/4<ֺ~xScNolόqbvt !gE\ '|n_vy^vGϲz++ҹZk'S =G>evJ~I=6~oqOC"GOqgMƉyns[7>̧/EZ'?/Yb89Ѧ=dް"?zhx|ޞ카Xǃ9}xrxӌ Ч1|9}m%DbtF_Yo7K/_'Y?="~? ]Vy{O]qz|`6~)$M: (`o)›}o፝-猧z5xO>fr|;7[~!x?L~r)<4@z^о=E^Lo|0$r"W:dzР;W'-7?+ǡqs9ob+_>+뎝zJ kOK>ig?;eqbS2:q_CXo_/??#.5x>"_rS_M3g>F%$/;cWC2# cJ8#O>wukc|֯R\ob>#:zKx}8ꁟ_2qi|X^ -K,ޙǁV>OMG%Yraouh!?i3<$}O^IF?#Oڡ6]RU-eI s&(#N}9=VߎqUI7|RzJ}_[J{6.߿L4|u:r-x 8opoxq8ٓWʳ~^NIqm*wy8[E;|fR׵~)pO'=uXrNG?k5=vqc>R\\WUMF-=.3 lZ%>X_gin/D;kVww~F;x=N)1xQiώz}wTx3e?:y.\Oz9z͟xݾ_ο[r=Q!C:qK~~j9_W3[>}v-D;yexI=&yܘ~߬Dec>轝diaﱼ1w[<_POvn7 gk9#_Wk\AO) zno<"|]3w ;_ywǞ>=JO=1e)WpىѨާ^Q?rEv~"moo\? ruKv[ϰv0pVތu}_ _}+}NI^nOxU蓮yoƯ⩽GYo=]U3S?~' _S7³ ǻ_=p4޷||xCA~zy8={K~o{-ok/_x1*dd<}.;bT/{%45bf<OɯP+9 ]^3˞orHׁ_}9w~9?0yq>r+H}oy8h{>oϓXGy>;g~G ?6ϥH-+ogv,R)=DZto=q0YG=!|O9b1?֨g}o^=V|^bx|R?^ڧ^ W?i~:OYn7߱n&φq}"#f稴s"?-gd{o G 8{ɋE>%/qnyz9G;O\2>иs>nF G i8aT',d1.T?ìf5JE78f4OoYj;zAʹ軀W }X/SxO/|L94'R}?y;Oob~\=6__w)]C ^y!  v#^WNmN +~S<އP_;'.~;ί>x<Я UW}=xi\DϹ6Od#ϋغ=ia~,OkM3X[ҾzDKm]C \RcBT}G\#wCqA\*rYt]j5͸GV2a@-xpty}59|wX .b_"1_]|zzWe|!Aa=3bŹ+g~gLpjrq) r( /齂o>(pz9z'~9?Dz]~o[-+Ӑ/qцn1IG{ya=|^u;;gE(#B^7K|=grb=o|ooKpzg+|8w9,ӳ~1>iD%臯)Td?MykߝӕRM5vs>nguaںwkm|6X Cm{ˠ7ܞ&Wuc~3/1->~r*1a.5sk V{Jv9gJ0OyvR4s}ɾyAT/jϰ7^Ɖލv#y; Yr, ؼ{Qy:s-A NyNoϧK N=x Ⱥ eJL~Ӿ/3}n4eZ_ʸPuмc܂߈OK=6?ͼk-vndžN.k]~EdUy|g)C<iWxs8/rGtT<'8N%$].c{uUe g,z)/rG'[;/s7ܯe\9Q=/]TSe 7O)5>>-އ^jAewQ1._zEgBx6wUy|_Qas"v b)AM?Lj|vY˟v(1~noN- ,'{hy_&z)ZwB?BJϛvlOm#~_zC^jzO.͓mo~T]~}9v|F^ \_Ktl=P~][K?sfF\_roȝ|ZΟk}c9*2L~O~c.yް]Wk~~ʹv/2yJcTבIy_j|򝄿\1ڷxĎGUy|aH'_AeqP;/B k#vOAޯqP˃srx߱<ʧ,3:)sqNVXp='͏/83͟t[7A=+GطX|D'YҮU]$? n_ x܂!/i~ x^!'O__ _Bî4zw؍hDNx75Mɯ,C~iykxw?ǫ8~!x8WS93WGLN<9? 8Y9jSɹq׽*\Y+|Bn䘒W}v Jqb/z6_G-v﵋7q-j_xJOv~7a\<5qMK}|۾xO=6õKs?_qe#7}Ǐo{kA)> ||NBG>y[~C=/v^4S_t̋}Kڗw-o /׌}ε9t8]ޛC쏰KF/Sg"~}?κI!1˘?[%"ψwfa~C-. xuxſӹv%{3z|2ğ]ŠaޠؿvDN}q^`O0O~.M3bJ?71_y9ϠtnG~&qmp!88 u?Mu M;̣j}9R8/pqvC;8.qub|R%qc>9q~7 }nuދ}q= v>B <'bރ_5<ʲz~o7CR}<}|}8Yo+8q# cwgN3Lwܿ\3.ƭyhʁF '/ yWXoI1~k_L1[wT{yr4f/# \'Zΰus ȕ=֟yA J.- x=1qx n]gf<"=N}'JzeRp>7u^Ray~ ĉφO|['L;'gS+ksϳVton ?5s=#OɎkvq9"~|>Jq,K1gq+sE} 6R|*.g3~Q]/imfiAL,ǼAd>z/ç'~mCymxc'KPyw,Oÿ<9s:!>j~'1~r3۴# _y?&?{Ҿ >_Qߒ oKe鞗wmb\t>p5xwxՠ|!7gky=/|wF>M|*n_?!aB\ Yzm ohw϶}:xc9g7-R};ܷrZqWo[er99QamcWّ;̆rt]&=Sv$)ktV+iωOcMU,/ۆiVE>U8O} ;->СrJ>;??f~ՋWص 5>-u'Wb?,>Q?21:^_;;k} Q8!eS#__o׽*\YʣvDݖ3>k7䱓#KhXxon.|[nQ껇~3ND{U~r=K͹9u|'ν!#>(-B3>#xOwy1^~hodx<ʀ' [#9Ry@-zJ%rٙI=$SgYBm_g=JyoeoGIyy_K*ӉxF<]G/ʾ|Jѯ ow|~@?m@UQz7`j'^3xJaBw|Kמ::}O?"^_ˉUy|\u o{F "'O|H_E7׾3K4ǸP ޯuw?_bqyG nfǪ+k'v&`ltf>~U_UɡS<8szZqѦB)Jd^m4lkws7s lS>`{އK(ngdۥy_Sy(o/gg{ ۊn{副 4)H[y 9g߃wACGΤqFW?~^yQ|Do=9;_,8+o+x@\iVI=%rq^m[ UDU5n|cwCVxJt/tW{H=cs~(YW!N} P%w'bC/!I?Ꜵa]W7 %~a?i߸m#^~BָRП/=y? >>zi[P?|Dr9E~/{bɋBoS5~mɅ+)[i-g!?C+Ol}9P|ǁ$ϸ_ H6>,` y{S8S\Zq'r+&:^?:AǙ'KmḈm :o_.ʗ_߀O:]+]:KGXCr z&b_v>#g#"9m|X'qCf*yLF'B}Y}|S>Lʮ\?_qj<-z4'էvǁ7VӜW/q% ;=6_w4ʹ)Bש?㮝![y@><yS띑.:p>߰W%Nxz0{)Ͼ7~OO[xTU>2zL@h| e((b8Ņg2oJz#lh|ȑV"8o;K;?cRg_{{p |ᔟ8 :?]_^q~|z8Xr=s+<cs^(0^)t<8+Bqx~S|#>:Mqه#"!h'=tD*}Oz=Q-g^*w뿗k [Ix=0^:_lo~;ӹ{}5LK/OۧI}Ut m/|XqgYO735ڞ(k:7~9wC{aS"4|=gwx4Σa~ݯqvWO'S ANO}+Ӿn#c;)~LyK|E?ow_d/~NG/ʁZ^5vWב@G}%_d+-r$MO7Dg|Go {k#߈ m{~a`|<?U/3)üR?sA;|wi|q*H_'e߄β.kkl89[+4w#|Ƶ3|XOlC~g|-|~ ^ q=ָm␮5:<(v}yr9dԾm֑ﯦ^;IǓ_})yc?uM_2O^\%|yb=qo~q=e_t3n/7t e^O?EsX4/Pʵx /Ug~:^-Yi起+eK7.'ay|~:.θXS~/<'MB~*7A]˯Zυ<@#f/j;/k8:;~zm=h |EˎF:wq|Ht~ŏҽC'ȦmHz#c|y61?v#? st]׳#~޸>c%:zɳ!/|X_.j'2ta=yDſ<:x~ LvI{8^gyc9}ϼpc:+\'|Uz9,&3PS"cDv'߫}oC'V# d:NڿySbCD?#Sc\)N9W ߞvo}8K5=̻'^qQ<~!>~e|gNz}-z3x{0޳S^:08֏~8m~ o ȸke]_qYa%S?!z)~O">q+|y/dֺ;o޽=oڧ_}0/S_y}qS ֓qMޟS??{ #ΫI>Xf!/~/}yv7=ڃ/$?}7|zڇS/֛Gt:Yya:C7S2)W~zya7I~.9 _ xӾ|ZEh ?b~WBjqWUAwy8W<?> ]MRVZ?XI~)7uj_ίӏWA=̿r@w4sc<C1}#Ѧ#>¯>|WS/hSAב[ :?ﵵn/,S8|]i:7C|)G+GwA;LWԟdBOу}ԙN/~W3mo z?jy=)glo>Σ<ڧ GOC7B;'+/xY&:)@ʋSze>n6V`׃w?lG7[Ѿv4FvI?2Ώ3(pGB't >WpRql~+{_՟43|{r]݀?;]g'B?0) AOK%ۑu"+Oz{Ω<;wy |p>~ϋ|apī%?C~;t~bO{}} Q|{}>:=yҾRMvЅ!_x֒B 7]jbCJGc_S|ZߔOq*mۡUΉ{wQ?U?㹚uC^@=SXyIᱞuz?=1t_S>]"/Rϓf>ү%2H9t:_zH0DX}G}7w0+>Y t|DZ_=ŝ*4?nkwzПWQ|~ϔG {~%\8j>w/0ߣw+'xq_Q8Nbǡ\ߺiyj]@N8~ڵE?҉[E v8z!|"OF>2Zu>S8B GħsU0/V< ھ߯ԨT:OGal;\EZ~Pq*iw[]t)/TW{i:Y{9y_~Bg'ʭi<мPҨUZ~·ç-:Cyg>xK }hݦ{|/_=ʑÑw|OS9G$v <,p?oN.I\[=uއIڻ&ݶa Yt;&dphyJ>D~E^Mt8۞.g SF}lzw'|8)_r/ ,Ń+ _ЫGa,WՉB\^||<ڙKW/w}_\hݕ~9qG@?zE,Ņ*&x)N:T;w?p_;%e{$oxB7 \+߯*?iMl#}a-}ɉ>i?]m<$3ݏ<;߆GA?廃 &^ 47BGS7ݑl|T+J9Or3#^n0s^vyxV'A>ˁHsR +onM r{Iƃ~a5|x77粮ky85!,7&_ȹ?F_^ |F_3;zNxK!xO~< cg 6.M?mA_~͋w? |쓡3vU x~9刧F99o >_~_n'z#+w/| t~/O͋|\WվD<|gk9(p6i@-}~{yد"7/8C)'Ž:focqWz]m{^WK7oߥ7Lrt~@̶e QY=?Q Ô}9φNi+?ț8ptO)æ8r( v!U~Zh#Ac9,pM^,:;>=r5^:,pA"ttz>zȅoy'{Qh :.~_{?s{#ٗytzζg |h?~q߂k{T{0/}؏sz?X_+)zu`߿9O|_< #nZ?V~ ~ou%V_x[![|qm~6?׽wy}j0>2N\)Y#}qX:s<~zώ}{=Dq^_^&BWs;#4Qiq嘇q+gcdݏq̟ZNygY'7D{WʟxF3|{ču1}}Qگ_xXM:gYW{˿8ʼl/7K}ۋN7)4w>d7 ֝}r$r]MxN!P/xc#O7z/>CѪ_B>g ܸ3os,WԸs6zʖ#||/+Y\֑W= W\w_qklg p4_')Q_>T=˴^ o5uyK;_}|nMxg#>=~o|{xe>%r"!&zzOz!r|GQ|)GA3@'a_:GxT{U:o#A7 S||g`;w 8m4OFOxܙWL+?߮B'W:ޮˊB/Kge?A ֫yu<7O[n1|~``ry}M=7 > 8M'T3>y]w?B3uC.PϹ |ΏPF|v -cr軗lNyBp~㺔=u!_Üqjiz9/l/)Dϡ>|G0O?9׆_@gT/p;qqwYW!;:9pt?}. /G^wУq:Oп{=/ \ QA''Hr}ՅQT>zG<\>q'?Bg9Ƌ|#waxgs=O#k7k}yL=Zf/~s+y&Y#yF>vwϛtQn͟Ykoǎu_^cP= yqns\:_Rj/i^oV_b?9:{TCYf#,g2ݧfHJ7gu}"_mtW3Stt ?r+vm8Ww~AKCG>뢯sz(߶=O \@7Sfoةѿ~x j>_tIz?ϴkwߠGF~sRsdW9`FSΩ-?c='s이]%sﰗ&_R^S?|}%ر> >הo^0q_?߻2~Ct8J7?qiO#W5:_73{/}ݯN7a?ϕsW~<7_T\3z^ؽýQżG_bY#~7)xMnR~vc^_CόK{-?~9='?.g6%?#~cxyךG>^qi y> >?|\2=Cڡ2//x'_^}go_U;374.Ӽ^.t_\'3|=~~ag/ 83.'ob)N ]lmsg?LfPty3z]kU n.n.{ _;>d|)#W?q}j#(AyFtB/ok\_8_3;A]t}(+W&'c:"n s~x4>8U(~E>܀2=ڿ?'x3^#|qY8(}1C+πݍQK[ﺚnv_ߍ~y;LJ_^A1Hތ_g} xYlz hڻ~2U_qI@Ogu2|;>0xuȩi^n ^>?d^'iCo~70? }gHocOcC~AWӅ'Oݏw# =gtR\N:0.(c}0~ |xqfXC}eCgǺ=􎛚Wս~_zxQ\x)ǎo t>V.qOO}mv2_ټ=$z/r9۵S 7|G<ۍxS|rwI#x]rQ>b}wT?W{wVn`w.ą=y?|zc;4Ozy,r|"{]5/H 8_ѧ'[(S'ʼn.],\qJ'm(Ӽ Î^a<{:O~W#]z^N){Aa~/Og^Σ8?KqX:^OY[9] =rb+?|xcw;I[M^Yc<"!}v핏,=_ώy 9N3XwԞ|:_Gw }]Yd=>RWU^~S^'myЙ*!^W?1/? ݃W=_g3|sR9s \1ns@9CϜ d~i'r[{Hʡ}9ߓ ,p#|zU#_;)9: nw@ǫǿ){C۾7[f/GN8췜OvIG:_׹xξ<"쟕lQ__wW'+<}ՙ R%_`{zux<{o+[|ǿ3tT=y2إ9g/zkY {yt~9gs p.yE,Ņoǯ ;ځ7[ŬN~:'hE,ߓ'5.qo =.C`O$gne_ \Sǿ3wF'Oyr.{yu|pw>3O8e|q\\:ǁGkX[#mž2u_k_ ,.jWt>}gέp~NG= |9;'{h/\s׊Ǵ>țoq{vӣ6W8~.pxǻy@聸yq6N/կ/~~4g!S? t'w3W[Y}gꅊZw[-^?= m qLG3v ARWu{϶u/7=|O/>#+ݏNzg?:,S/7_gV},'yFx͵o>u?n^Ãe߲g稡 R~=~΋|.Ww>)qYvuh-U~sS~o8yF:!Yc3tSS.Y@}_ >r%+ArqeGCs#.3R?o-t- WE/s]a>{ c}ѿDo$=MԳy] ]ya'n|gpA_ݎZ~BGعo= |amy{Iɮ*] #.^O#=#νEO[ೇȗazbG+kׇ}|/z]O ^gK== mڋ[F})gwGvnW{S/C;>g.:1k= p_\oj?|-O}i\]I9مj{rG|BU8op\C`7v=G{ac<?gouaq>p5i?`}{yoxEsJݓ+~bW>} ]TncNzH_#c/~d:q74ktc!9pGx</y Prp6,n?+}f} =᧊yxw?|eXv\0//ugCvb+|_8xP{ZNO3yNDx5:Rǹ@75٪+$h UA?*$7']5{3~?`~1]?HQxN㗟h\|quӋ#SYO|mKgWU?zrJ"e{Gt;+iz%&2_?,]{q>?'݃0*oǿ'?>Q{#~-t8UfoU(~R?#Z> ֟r}DmoL~>|[y2uޓ܆_g7rn P#SgߺCߖK^ 妸kҮ;QNa*.{ <'&JSe}]K;eD`8؞q>smÌ/f[&wkAgNB_|*|CW#]>2 Nʁ/ϓ9?+|&xW~"y3ot^RӸ<z{tz_bǫ7!zBwP>}~R:☋nOx%=ex|7g}g5ߟ[n_wtv'Ճ|[i <NI{q>>Uɣ^Z8^M<+0/XAo[qz=I1_Ѹ.Wi$ʟn|m6^>p}y~}'gy_ʧ^׹FC{Z_l4J O&CE\=yޮ7%ϏT;|~nwɧχWs0>؅J[7b?vN]u6'>X@缕ua܉@g~i+E6^>XL?G睓dk>oS}ӽ/t_ O]jIN;kٍt>§(~{g u9生t^k?]N.P _ﱞ<_p[%Oqwi@Ñ?i~Xz} 8~.>v'>7+ƙqTOjmg ?~>u; fG:\ mF|9 i?BNO@ҿ/ooiyx:yм=m N.x~w統'bP(mWzMqMqy8Ν~ԣ}o.uD~<:#y_9^yR=j?{~W>qng)?Z {:>=~]~oWv?IWȭv.$RC ݶ[x u.];S@6wd'w|-jM=߂ğ!x ]F|[#~&!wG=wRܿz]H~r- 6nzsg`yG 90`vAC{j9p.țr:,#1CG%m|WFnetŷ^HOɮ?W?{W_)列ñu~QsϚ%x$:t1t# |a߿{3 ?/}|<|?y+ "'uS9~|).|=z'<ۛ%)o֑ڹC_:gpOrAqj'~Z~=SD?1m!<<{s6xE|߳<{ڡm[Tq'+}oy'_ⱗ~(܀'= mAsIw~6]sE)GIF:<.{{x<ݯHyvbϹԟws^{c?W?XR_>c'&/sCtS[rns~ G|;v`= mMîT(g[ ρ|jis-?`m&Uq:v1|{٧7Ni>zLrH~o;_zc-pt?#>W/zGt|Bzc~>2>Ezݔ/:c9 typRAg۞6Oqɯr'Alڗ^{Z.?Ϋ۞69#8OrFs/?x e1xgK|ٷO9F0^o\߳8ymWмn2_9ggw<紛9OHs=qLfW5[x0~|Lử}.k:e~sRqX8}ny90[{!~s^O1v7Zxq|)>:~G C?=tSYot=aIܒ)??;Oq<8{\1~&|k\}us=ܝ$@;?;.ӛk[/<żi_+>PAOہ9oU*/t_E R>M~JYG>O>q3?3~g|pN_=Nhwgco;zyH_>>==~2Fz2gi˷y ~ wW5IѫdG*E_Q!0){ }3WF=+[t v]C{v/} ;۰~_*}U 'z3o=cʫ[H}qނ^ߴbo}t8dX#?Yo7is<5ݧO`?[wf\]և0__̯\'993~u_~Cvo5/T9=߱*| g+=Q>qkWo_᳗F@+?Kxo@#p8o=J<' h1~Q~|Rި>ݼ:O*M<;u>]<OC;j ]K<'|A8^~_;߯y/?aWfy5 Kk#q^ǭg M t>nug_&Y+-'ǯ񃼣wk:\qj-_7Vf%|~m'ߜ/9b^|vӎ9^?NAϨ<l8ϼ*smL籢7W^g.o'pw ף7/@y~'<ǻ>o@/б tg}:t^ ~:k ՑL8|{*Q.'z*/*,R^yn{#ճ2ߎc#}NvAKS^ĴurgM7 |9wtz+9<r[y7/!zjajsֈQ{ܛW9v$pN퓦<GzX|}ݒp ??i?8KIocʟX}}Q8D;SM7#.p?n$/6~ߓٱ\툊;]sx[< P~ѶgNu/!]*JG/$yDo?IWFGX/{iл+@ R3F:]aw:_~{Af_B7ǣ|d|gB6U*9]ogtEO[/W^7 ǺfB9dB{}7CWaޒJݠ.ľ$u_~0笩)kHi:E>.+B.I`%=ϫ_ɿrdgy]e? b_ko{b!^8Ά?k:;. 7W0[zN't ~n?iޠȗt>18K_ꇞ7Gyʋg3tG7/W=ǿx\99m_{38\2c?_`^<.~/POv|vy/<=Y1ߧyv\zLty︍IL$N8J?vj_|~qf௺oz]_]ռ_Z /z^ot5tCߋ;_0ɥ^ϼ=jxm4.O2ߗ.Ǎa^и_ ~=eo~w^tox[E{;.r^ԗiꝩ_~py.zCy?37WG?;*"W2#>x ~k}v<akXGف*3M/ϹBaǀ^BG7 Mxz÷X'N?z4YX>zNy"zvqǞĸXcד^筁ϊk9zX>W7Ƈ~'}<WǸo廜S~(ҵAnH?6e|t+^3KOԋTf? :.~Ň<7 8<|-O3O'3~C7ĝc2Ճe_금x zL9kmO־<o$fxvb?z/>#x8|}nl >nza^=v? C?ztW#Oyg]O'כ6XxɸYc<0 ,%z{Qzc*>kعMٞSf]*9tX d:Ƈ=;zoO$_̴og9~h-v>˸?V}ޡfGjr.G?sflt{oVƣވ^^zK /A>/9!ϝ:Dob'|gCc'|.^{,<+bYg?; xQ"p v@y8rfBS~a<ގ_M}&At_BOL#]S3>7~8/Z^^ \~Q/ ~ `Į_@/ NyZώri?_.3X1>ǣ]?oQ>M<#~0 NIq ݀wY՟Fp[_㣏{y?wIy۵o3S'ǎyCx=kۭ8o^ﱟT.cM1Sbn6gp<:7y>/uGhg]ս53ƧKX[=GN7建]tigz<\KCȣ:#H5eq^9zŷϜeiys\ڹx& =?$?g[;Gw_3oTv^6>}jt><^>_K^;]~BrA"'Qy 2O>ȡ^9Y |¯|4t|7a2>|t1ߟx囌x/?[φn/f#+6msHs} xu>Tƺ!GOu||Gzc>yʹJq]wʣ1ɓQt ?It_':_R>:>mc]u5]nκN-b[GOwrΓyv'e?~)yxg _;tq/_sGٳ:nRJ?dge}fSCMe;q/]|/|霒u^+'voKt=Oؿļ2/:?Rybw |8ŅN+>N7ý.iZݓyߙ\>SoX7i~gG?| ;5>:SܑZ/ |FŏXGH{s<ΛI@nAo;3Me}8g:HokI4Ɠ{-Ymx/:gNny'};4)FQ97>V~Rp73oawd,B.?>d؟.J>(E~)'}|v zyq{ 4w_= ~gqc8x6re /}j;ם/qQΧIyn?uBy";>g< @χy3~G _WS^>@"4x=;KW>^iOL;tGTye>cs|S֍sYd/:}EM~];21bF]rmazQ5zqo|?3vЮ!=Ore=|o _KzS<<:\ۿ^*;8Asltܑ)t?>^*~}^|ʯ~O_?PC3=5}__Ɠu;>_W9N-ȝ ~COLq {'~H.8ԇ?"tx~ .Ən^~5ɯ8?Sat?riʛ/zϏԎCc:;L9!qޣoW2mO+)tg{9.MvFԯ~X_+ 9卂~U<n:$:V-߃^σSmX)||p5}'9T:r{c=-~{[@> O8St~\+/^uW|(Aw5mxYS<# x'Zx_nگ4^LmוKwF. GF_ ^y9N{.<.z8ñ$~P=|AG8{E7_\g#2@g"yrnɾڇnc~P;5zY[t~ᷕ|Q32܇L~U5+A4NrqqVgs9/_D7ćƧH\)gN9D_-~*_+t{r{[g }!ռ~N^f.{Ňh =$w)zNGO]6v߅} :#N:[s?][g捑l{buٓt?a]t^9Ⱦ}ѹڞ}w>d)s/ K}أt~ h?BS?/uGXx_*ߏq r__%l?tyWf+)ǫL:t&=wٟ&y(7*}Xz#яl{b /gͬd0yJߏkzocp=l]GlGn߿:.u)h'qcp^FΙɎX~}|s(]ur{ƶc |d=wGPz𿻡|)Z{Zg :J30 j8E;w]`m^~o9ԣ] ?O ,Ł7_z VS^Pğ+bX_?˫ǿBWߝO$;O)j>m{>'/S܅{A#9j >;w;]56\G:Lx 6G8mԯqS6+|{h Prt'syb|?ݛZz=^)sFx~ROt_zsН'?oQKm5ݑW3>t3tׄtyV~w)׳F);t{Nʁȧ[!9Fu~ʇnSy/oy{;yCYos<e`OR~ԏ=t9&{.~Px]{Mq';9[cPGN_(_Hq>&΋n#"=M7"^! >č9_#9ⵔ+s /=t 缴oR?>ts@O#wK\_N8# ]_ WpS'&Gz_yoo<<;/"/:"*f^y]x߂:?ٙq[A_׏ˋ"镱7ׁgO+cuP^TI9l5ֻWs_Mh{>ko= ƉPz|E~)[롿wFj?W/M~m݋YOoz;Nʳ'\ )z O#Ma߇.G·qO$Yyk|gg\/K.W:t>S"o~UX_|?7\o3OηC)ك~~3.Ǎ:Pxvyo|yk_rNܽL W/F|=8)>Lzxp4Wb|+;oc4?؟繯rD$ﭱƻpwu^dzEݿFyDX0=v^ߋm?++ٯ<.or"A;O{y]z]_UKwmOXv05K>@_`π|s[Tn}=UkR~|2a|^ Ďqf#t:_8.4I<5uQr8Վ}^9qWo 9Ƚ|\ T"tsg~ N}PKb_yE߁S>c qlJ. ]kx~^>_p:'<φo2O{G/:N9ݏ[w72笠Ry?,zgXx?3wȗڇ}1E(N@RO{㥤۩?;v 7-]/px}aB>9//J,KSwQ8z~ڥskw3z'=w߃/io|n{ۆS~hytuog':rC*)fy[oV@OǾ~~*{fʿ^/sN>~tqnEGӶmm_|8v(~3✞/WFS%NזcFnnZ=~,:ާ֞S(8GoR_8/nvNB?i߶oMX[BgP㼇^Wxmoho? [|'6n{^jepkۀs٣&ۋx?&H7 yu|(sQ>YSܿ3>h(d_\=膸z{{='> p |:ocCӡ<H"ou||~opB#$5ɫY /"s7ͥ|G 7 3,p--9!:eʝyrb-W9\I%_Go{^[f|?Wn{^z^ùn6ҍj~jm{^'jïB?tsM:^MrXs)N~Գ[ǁ~_wML~='-n/Mz߷N7n{ 6gnvj|;rĿQ@}U~DÙkܒ?EBgruNz.~0ۓ/O{ì?x u.nÆq.:w/q%Goǁ{w;z#>9?/ |tgW |ts]86;whSs} mϚkϹ.;Vc=R_ynbɺo_9~q;G9U>_K?YWk>JG4O%Kt|4K!ζ x}GP/\n/}._W8/G(.;R}oF5Ŀoo~> e_ke|[c|Srzx\;!&YI?A's?YE_P{gGE?yIzJy6mZc7G9[r{_ 7{_8y?@cZ~(klyC|@Nvr/CVH'Kc? o?<,p?n8codg/Yt/ ,Ń=GxGuܡ<ۮ} t.a 9p_G~}G;?aZ>.=揍xsɞOnI_ہNU/L9_]NTR/_vI;|OOq۲?wz~3gq֍qث' yx$Ⱥ;} @9{S<=}~5>4N3cMgCy(?C =QI^x~}Wɺd8/tK;w^z>Hy깬dŏ#ґbx(xK9x_ ~ Ⱥ)ߔ_DӸG]^0Ƶ`/q>2.<_^xf_d4oW >:y͹dP*O/cʑo5Aq:|8u.~|)]J@JG5yaMQ=N/Y7.x>^}=:5_{y:R??x|~5iw⣯տvooz_o zC+ Mg~sp~2tazpxs/W9L>7M,0ێNgazOt/}0ϵ'9Ʌq}m:0[?+=Jyet<2~_y?)O@ yP;Nz#OC]_Q?!oXr'|//~0oCta{3 |'s㸋Ootj|B!d=Z=r h8G쬝Oo{Nm_8}|j{E}x~@;ȑڷ5!{AIq_xwoa|?w_qdݝsw\{{xt#:W넝^3CCRtʾ>pY#'Cq/m?Ը~7A?Omwzny癕_!nCD^;ӔspvǦ.ϱN8 >`_ >~#hzS.ѣ>Q+w@.>صON85_ϱm+^ItAKoߢ:*O#:=ظׇ=y}3ԽkUȳoo/ja|ygyi|bz&d8S9Bb~Uįsx̟[֏0^zUU9߹O=<_>rozKW=;'_G#>ouOyٔ˺^}{/'y6^> y ^^u{ꧼg3A}W} sü?#{g7?g3=^{yq~֑ SWf|xw߶yow'e#_m}샬Aߐg_"~~Z|GCYi|}qg"r_|}ڈs͸@|h7|}{[#XE<d:{0u@ gX9agۏsF"oo7iji{k_lXtr4D?#Y,χ[d?nˊ[~yo7~ަ%pG#>/+7ߔ?qMr1WqM?r=g:cc^;u~ȶ{L]K_U6K$|g'WE7cK` }b.J43e_֮ 8 ?t/Q7C~+a۝O~Sy]N;Eo'aWĹ7s !v㣑,ӹׂM)v+/;tJ<5[7Ł8/<9i킍oq3F>\#t'nG`_X|F^7Fϩ}@c"3RrsZ^ț! Wo= ,WGގgɗR1z/)xx'S}?~)W=Iwq1RϦtz @> z&ޔG>m{L*.Of#U~Oo.n=qV=tp-|x9O9|%gٯ^:Nyo:A:>YԞ|u^ 8 ~aC)<+9Cw^ߡO} swm=CЙoSx}iaʼ2 u?Qlg)%xθoh=OwO/}q?3ib_tF^sBC6 <}ߡ;rl:tyS~V<'cͯ˫_㠽czތO`?[bO|G_yl_P{>yF: ǺL?zK|rwǼq.[/9+d}Y߻?j~SNNJg4_?뼋ZƩ=/RyUq;RqucƱ{4zI7?gʡAw|Nף8䍗r۟;*vy5EW]oyGg'vYO_81j/g-@G4^ikּ? ;qqhkyo7uwWþ`4_2^+O\_mc~|3uMM^;O;L9q2 v'Iy;/ ?_gC/)||\+rc݉qg|ؽWg82#{'xk?д >o+g5Q֋0n=hr}VcMyJ'tWy yfyw  ɧP?k/[qxvΠ;6g08UȼП;~+jן-b a)3>ucj\ώ۝g'>gxl/?"~R=xS^@s7^N9~C o#h'?⣱>tɳCqӹ:|-yVʁE=CXǫ)/=vgG_Wt>u?R|gc{U}PeOaG4˼^x G>屆Bʯt<:Vt\ }_:GH=EoKݧҹJ'y+_ޡ#=~f^/tiw@?Ω x<Юu_Bo<=9#!v0{uߞ91JSν>/n:9~Tñ<ߏ:+ͧOxwFΡEOǾfЭg>U>I7PXZs:MUϑG:=z& }P?[c=_s:_3:ү3OzkoGP?/~;~rЁ׉y#`6Qߞ -'`]qW|GeިW~%Ə>?SW*_wʽ5@_ |)'q2C| ™^\#1>Oqd? z{vW;'p:7g Ѻvu]ӅkxT}:rgqg~[)G=ol_ D.j+c=^>]h>"x!Nϛ9 qCAvo_Կzo_OS'Z@~ :'ǣ_ m*z71yaF<]߫ Kݳjb;wߨ:Uq =Qzw/'I.kFQ5^cǓY|iA^730Qu|=s>Se |3ˑ޳8;wk??|^٧ #fsnʟ~#G L=O?m붡t]c}(\wu8QU~ӽ3c(_7>:D8 r(&?l`zY7GluwrLqn9V<7rӟ)OU}?&pGg xQ}ubOf y|_?KWwyǥ{|yQTN}O~<ן}ڥIo?qϕ +zu6#yHϽ=ݳ3{<Ǝ~lCJ#ߟ[o!p_ߛ6D._|0jGcA=R}o~_Msw\I(>j~gF\t:0 8gq~\~~q/xwSB :Lq+>^x5_)s"Ǻ yަBȺ:NCt|?G1񀗊Ru7=-YS|9Ce~_G<>#}fn _3iuB/e_8LӽxƗyݏdXOF|u~31o_fcy:F8S|B(A !ƹNߜG>%gz3剛}>1/~çB/o^K<[,] |{4λց:C(Wܰ^6ڞI?7>>%nh~}=e'+#т|}/Mxlfw_׆yH?Or\Ob9q:My~7ΧӾ&x1u7+κ|_H>/n)czd+>Xr$#OO~S^v=98's/ڞIMqy_t1%_gyO5] -d\~ܚyO}8gz^,S>sWG{/>8~%2޶|ǩբ> L/;|G_my{g?؏{w sq&^g:ld7yF^C'[3~ꜬCgۚ{}_,8g+WN.zkRtT'r[?KƗ]gҺG?Y=?:cwo.}3t;ɓG#^M-/x[bb]#.=1{K^/oa'z ko]ots4]`y"ÞsynOw@?wNN~A/cϞ v I-\;~^(OǨ r4'}pq\zko[|@/_xm$/q5n?Q|F.=z ߣOO<3>^ky"%쇹?J_N[!N=Jų݀^QَHόnv4G6>,W-'Ecs}g_vSBmuэ*_aOXz9^PC+O/=ޞYzSqTx6-ݱ Ǝ98X뺒)xlS9])ُtCy9O9I~.?O)N>h'ܼ43= ܯo8'a?|9៍|^ډI}wsӌŔ[yqgvKh7:ッy!v^0!gfle{lLS֍?_'nF4q}It|RgN;$/ 'S?tEŇ#7iz?˗~7= Wq.֧|p rxOEw~nF|mθ]o>-8g go3(s#MrL;'z'_nU3SïT!|#|GZ|y~)5Fp?+Kx:}BWR.WЇ>>pqVx)OܵgAhۜ?av.uQx ]rrO:??W`=ミ-<~ {G|SU;zf]3^+b8َ\ˣ2š='8ى<<'}G/ _<72G:nyׄ''w4 *gv d!+׭~bGQ)}2Oou!RIܗ{>߄7]Wζ<5D{{~ڝ7\!7@_ptM 4N!KڿO1oƍ|;Gv)>%YnӾ8 z󴾎Jq[ ɋ4Q7Yٙ<`³^NSh 0Շn×ix)>,`~G(PE' 8:7GyV=U㴾/پQ^.p@'_wwW;vc |Zqus_| ?K7ti|~Q~LyS^¹'`Gx["_sW=yq <Nd}Ѓ[W:[;2ȱ[f=,*My{϶*Ӕ/}tl?=YE}+|Hx:\e=3xU~z:Qk#U~P|Qyť5ݔO#wK6~OxWr0sT"?A/Cϓ=P\n+x o.#${甿~S>sTag~GOqUzC} '8hZҕc\i:21WUM-3s< wG(^~5ǔ/yq|AWr|'Py iymMq3{˺y@Ӿyhqgйq^ԼNp|.??t P;.=6uz8ñ)_"ĸo=+<1ݰi;dd>{9Z.PшOm^:+E#<uq~8v}BR.S|iɁLx|5o9wOgj7@xج3 #zw_,=aoy`=t/S<3 IޤSqq 4 ~j~ļe~k|u<>[S~Nη_;Gkio3^?Wq;~RX| `]Ty`} ʃavFz|R?;?|s75̇n)o۾Gtx+j]wηN7]K΋~h~z.!75/8Lj'StI<:2~6CT>GOJ~] َIߨ>i$>wo|EOO+oi~$/_w/?JoG3yg~Կ7suMLq8~8N<]+\˺>Y韓[ԅ}=VEl7D/Hz zdqW<|9w8єvS6\.^Q߁sghgƁ*]@}|uy{uO|yf#O's|xWlzp{`p~N ?Q}[<Begt4w~nNqkwUރ߇ *;PutL}B7 ptyނ{?p}nw9Vz?> ^1r|'TgO{'pnozy_:/Fҩ^'>"ǜ-pDW;9 Fz+)t ~}^7'B O)6g'?dB~_#x co}{w?9D<pǴ?bK(>8 euF~Dϲ\)gAر{&?% {C_cѻ&Y_:]n'WI~#7˵looC:ot>{ 7z%|z8G*F9;]Y|qaw|k|ߜGדj{X}xǦ77țn>\WH<`WǭgA[_+tGAHS*Uuݶg7̈׃~?_x<񓿶L諾]^=s#T0.{?7>prs{Gr:X7å]|#r,t_9uهEĺǎ1;[_s4;.RC|7v/~*g#^7twH콵7_C ]5oy'x{d\Ef}Yw@=w=x 8,r&)pOSا=%S.ߗ~3H>I>7}B# x"$~'#S|"0_潱_ߟ)ݎtЯ Ưr?'Mz.?K?/tLu!g}#()07YG~Ny>zN{'gawOyqtAKAg^yqH+й@:_[=YYG>~4.\7zt\ ߏx·g)<9F;?m |n/BC}? =/u.~(M|#q>(Nꄟg}ٷ?)Qߴr<W5NڽI G ٷ̸E+4F4R0l[]GNŬ#m7x\8-߱GS9ߩ_´ ^2^z\~>P#qw%!Sy%=/Їhmҿ lneoxлS=ۍ?]o*mc勾>GռpB {(qn87Կ ~ceW>E7z§+/8oX~ʻ]w?84뼧zCWݯ^ˁ<<ЕͳS_w}YO?x=oMy.Se3qI_+u<رP<&:D#~u|]ϼ޷W e\cH|q:^cSw7cNg?)0X{Ek1Ňu|Gz.{ƕ/Aٯr^\a礜8ү° =gRjwOJ9e&; "O,od>#>j+C7?zSʫj{N쇆/AC{N/t$r'u Gs)}Zyp&}I;Tィ` ~~=@^@նaO+,W߈Q/zziz}g[? '>NsxBBP@^:-?c{:=s']?u<;?t?E/Sk:t@yzgG{#:d;c;)rcmGm|XS9u#賚>{sGcQܥqD+ڟ(;Wot^d?(gUOf+#a_^,8F(\=9*P)[iQyXR_a{.FX@3oW8aO@o_r_O;tGt|= =_ry3RqOgG9qe^Ezm|X /<1mU~\ _`'=.My8K~asg>p_<9{w_y#lΥ |dP\ l9w}oqm{ \ρ=Gz=ݧq5~{5;9`7 |qxL;'p}ޓwڃ|/:_D7yosxRp77-p7ӿ1E?l/asj}B7 |!~S~57CGowسOm{ \/s=^̉oX: pqS<ޥ89+#J;_D7zs>a}7Y^?~ds`/ʋPn>.ou0Oo#}ʇߏa}m5.~> Yt}KR ?}<Ǟ|(z<; @G߫^wK;S\G9] :Z+T} z*(O.H>|Xz~(~ oʗs`Oq69*_Z;G8nwm{=bY|z]߬3Doj?ON|Iݲ87_}-p?ķ;qUq_Aџ|q%)kla{{(rtsm7 |rX>Yy@Rn\=rhZ$+o[)|o, a_x5ǿa4CwwzlKC W,ry^tC6Ͻ1pc7 t|$<@~=ë*]r*{I񵟁 -p x8ޠJ9A[8?zz=G:3qLyWԛ. `?V(@zJ?ՃF{};yB;'m}j?*]ROӟ+?m38끞Oǯ'xawoǨ}  Lw*~;E701NڃKqu_xj=ko?[05 ޵/H}wS7rX'/*=ac_;Gc} |1aMWY@?/]QT3څ[3mܡW_S|ѮtvE{ !Z / 3\ߐf́}⑯QK;3zrzr~W4GƳ?wD#/_O#t})ʏ=dW 7+J+<F|~aԋ'&).·Lmӯw=ekW9g?c8)o:3ӈy 8 :^ yYKrn ^~;O7G_b[S*9{w_{*?}z^xva.9EK'j@gN= }Y4/yĴ|zR&}z^㣧_g{ƃ]~!P㭽mþ}RgoBU~{GAi:Q>ڵd@<:BwM=ï8/'(a/ӽhwګ_ȝK |1do~>L9@(?iyq{D?y^<ζy]q]\Yۣ~v HϦw[x,>G~r?]ɹ<8{*犯>Ϥ~l{?Ӷiz4x~=.oq9cvN=U([Ǖȯ.z2.C_e?J7{,8/~!)wqճ{fs9*;R<;@TϞoJ2nyflw_q&8:xHjsH{8<+S'_0+ߨv?{jx}/~nV'\gwU#t )w/tO='z[dz_ 5Dr}l=~0?=qy'c=#B7  F<)޽GO9+{-?Y O\rplmOX>{9xFS<}~?ֈm/ӿG}#-G&_îB7 }od:?SUN\|L}S@Q r}{|8  ,p3Jz܀ƿCS}۽=ʙ)of㏥}'zSܿC;tY 'r_ u߷xJ.Q~@_)ӽm?BY_d)~7CCu_"'.ߣ/D_rԏ]ƥm_8/߰ǃ ǧxЙCsG,שX꽷 P{S?+~<üJ~}|Zf}:5nK2ų=khΎtA ;E*;˛q\^^=qfo~H^'yECyoo@]㽅.ؿ>mn+ 29*Jo %Ձ:rRr*^; ǒ{[")/OW|{+?ݿAg?C7y e7?z˝7$Se_nK[k=akοؿ~r f3W:g{!GyO.zsXׁ^"'<_YW;r%>aX.9pjo }{엖tsOr{x s"K} ^}8T燩v/=-W߂p<<=WPρx/:kj~(G{{ U=)xَI"g=k)Zqv-l%w\G 4:.]d]ٯbg?|SqO@;qK7織}l獆^9rh}q*GqL:K z7=滔#3g#.+ԋx ׈~lsOޗ/><1|Xk|'zGu>b2߶on%yW}Ӌ#Bm:|/gK=g짏FgwukJ9|k<iaۃG:· OX~ R~ڟϻ属/Oy y%GЫ=|sP)8'VO_*wݙ-GUu0[Go~+x yW9z;þ)-;ri#b;|Nt:]8Sz5'/y\ʓ4yb ?7:ϽzC@oqG=:1NRo 6^LW>B7kA7؇SU~3y>_fHoz cc)N'bPrSqt~}0ʋ /^x\&>>sO|#|Ƿ4v}>TXjI2ΟXS/gg6^NSDGo|ZkOq[JG$ߣ'g._aPu_x ? X識^΃o{ۂ>ST}+*7&_nkq X9=g 3=d^{An{>ۀO_ }pA? bf9[6O\Y=힀uuEqb/Zೇk_췱;n|ȡ;)ySj?-p?ʾ~߱x=,;'\ }`yy7{^~ lx/X|Խ ^ [ ?A8:ؔ7So{g>{1k=/2' y5|OȽmVC+} ?Kx֟Ls=~G֛R&>yЧφzrI~}ke:UρKit}r09㡿Y31}Kύݍnpn1q}zσ ~_C}z L=Aٟ~ "zXw3q7Wv< |Fo:w9[üc#Mͭ yu5߷?ȥ|@yOo{]u[Q_{(>9o}/> ?5wR}Ʊ'cm 'aʡ\Jֳu<~+3_L%_ݭ<VqD^4n=qp6Ğ |Twݧ1.G֟} qFM;o@Nj>_ulo/{R.K;轢'1^P{q\#gԋq/W|[zďG;ߎg7|,Y} sk=W~5_HrCOua>ƽ?ΣN;ZQ^] ~؝CyGG>Wzedn9;>z[ަ7>:=|UD?9Z_)KS8ߚ?7KS<'}~|qDWз|~zTy 8 2ϖγPӾ8Cc~~os׃;|c?ch}9[>8wUvܥOKWUqN)TS+H@=.FV/x}WC;X7v'6_9}xp8Γ>G=<`;HgӽuFCۃq˯*.߅Ja>A+u0_`;Ath}Cg.k>Ml{v ':7دN7tļ<GvC+oOze#;j;3~O*oSw~[~E c.E`bγ3OStezw:/0/ˆ_?~Oyk7ϑ &;p>_ Eg3zBi(Ŏ ^v]5'ɕMy?gr?knǙMƐ7ѓ#x't}:AR#OvHes^[~4ԫ8G^ϋ=3#x_Ss/ﶿp |ߠg؞k=y P~k΍t|u?B_Dg|o5\svw?>'~kV>Y;Ea~#/nqe>GG |om>'*r;<UN_ z`+|.>G+hq~7|z1 c2c<8^S?}~Ǒ=gCQ:mG^M{Eqiuz4WNNЕ:'Yёgt.?A_d~?|e3xߤ}]D軇y3UF!݂yN|c^(JScP~7{mѣ6%] x|žþvcOgGXd;NA{;c;V#]}fxB^1^z|'w?}GSK>ހ;it+Q~5\zKadد~@5qesnuFuzv2WZ'џ@VN9Rӹ2oW7n5f_o|u>^HX8G?F:]G3<Ǡ0A_|g4y#SS?!z|q{W^ڻF~y]twЫ88'@Uc=:ߢL[O~$'o:9YWz/<Gm/>n)q7;ψ֯8~t}C'/k=8K*|зGSm+7WD|@N/lZ/9:/SO4+iԇ~ :7?3DAC>= q7qt?'7ЙQo>gDYߝ@MEG^_zB>^9~ /'g;toޯF|U|oq_ oc6~ֿ.S>>w); e^ OY%%K߀7.}k>T;O?8"ώ@CWD?ćGr<`xؗoO | >əq~3S9 ~&>~/9+>|]9xl{y< np?x}U߁|Ϻg#uKt fSS|?siҭI:KxÎ3](:nG x;tI}S]7_G=qn5ZNzO.X5Wו{8#=~6Dgs<m_د/U_7zn[OOp~"ioGN ǺH1MqNۯC/yno }i7cG圊%__}w{_)?g^[}ٯxo%< ^߿ď.y? G|WGh|<eׄϺ/*qzI}_zq~}vU=k֧#T/eK;S*:}7 !Gʱ'X֣!StC{ >9du{OXU S#h?(/t{3xV@9 uu|^'8/C9+v[<ފM+S 󽊖.0; Go|t׭'=k 7 㿬e<-~(ȳ>Gs)!>T2Nَ@_?v3c?&;~"O#D6Ϲ&,3uܔgs,Ç7΁]^*'3#O?yw9ھ7i_|+u͟g2yjxοwO9t{=>{|^we53ynbT;?egKGq'?{wϧnlc3r=}Ka;XmٿS~#zxioh9ky-UퟍwR{b3u\q~"ڻ g\-aM&y" }# -pONqUKb}I@߷).Eiߗ_> } .'ŧB7-ޒ}_y8vmd]nDZ/g̯Y<<߹hMxy4^LXoxM+ΏDy{D:%8m<Uq$WЙ߈N>{%tfSF1L^S_7Ow̃~꿧qOŻSq!;WAjrs$nעb}$tk390+w|&9m_#No*n@[G[N_Yo峟4rq?kuqvcufɵ?<P{n5qOם-x7_>~ [r{8+/%~n\~άU~?;r.UO??GUތkƁ~ S^6$ϦxA)?[ߧ~M#U^uynG9&]`3OO{Gx|C7qu{缊m+ZW}}r<_Fr@+y5Pc}#ywz^4 2>g*:ɣ֧q?x#hݏMWy9'W|&. p"x'P:~ygO''M./s6~x}3C'ǩubiw'?L?#W[|ou9~|Nwoe[;ָy~G?qu_SꁯuE?a){\/ct~ckz;.$t8Q\)L5wR㨼36^Dsn\y7xn oM'?8o^>7~6<[Sй¼2+:`;n^/|$օ q ѧ}Oίp)Svזq9>O>Yw=WUNq7o oؗȎ=ŽdwЕڎٞz}#| tKz(Gi@۽&~{x;Oh}04o$_/#ǿT=woEp:D^з ׷M~B?ѸGS$6-I{z~c79l{9O{{eדi:\~I=AyxUz0y|p_<?u{x[|/8>=|x|)yv^2E87/?|#!>:?r_n/wX<=}W؜Oq~]l@.$.e}yoΡWerڟ=@C/C<x|aqV%.tDpye>H?U>X.υGV\u_cy ۿÔ.E+dO`yx>ߦvc+^|_gHz#~][{<> ߨ7||19a<3KO'">s =O|zoʟu|uuhGvn!O:.tK%!D^)~:L3~H7O7ȽƓ\|c]{*bߥ_{4mV_y /C?'*ߡE/{`O#{/ \ 폿g|Ҹ{'Y뾆} 8>ya~ao>S/FI9WOnzK'zX(ysŏXLWyl׷K#v.!?捱CSMg/ܙ𳣑?{H=ɦ0zL~?Үu1yO`QukDkG3YֹL;Ux5j~yX`-yN/YW_wOqSwk_ >=SkSaw(϶_Et'GgyzEx A~I/6_?v S! r~Qz`_}En0}_ou6Z6ethӔ-^mw}k E=#^yij @@` a}1MKVKd*++7ȈǤuWsޘ1KxOP]4^4 eaf9eU3oy?~޳xwޗ>qׁ/17yȷ?l8O^>O8 1>j#s>~[/5w3:~ϋ gyO*w*~N>x%T< ^Gy~3ccCoyUU/>3K~g :ps; 7Jg!8g3ħ@?D[w)#|ya6}hW3Nâ@/'xL\.#|>d=z_9^#t{73w>~\^祫z,Ǒo_~A9V}6m_z'M'ry%`7\Qy`uj^yEߘƕ{ZU:x)Q<%]#\[U?Xq27:OK?#OwYQ4`2xN7?=!.呓g1o+6jNG ?˼q#}y!zA]kK?:o{6|]-=_EOz/2y -fcQJszQ՜sfH<\2Q ~I4yS#ϮG}ot_.jon9rcxV{7$o_Y=xx3/c'W5My>QyY[3 |%6=ry>i %_|yfu<U|>CY^%G >~_5o}yK _}W>zwT3!W|'5z@pU:;ʛXg[A zg|h 1o3_߃sC^D߼OC#',Wi< (zH>>~춷^WuqwΝ?&ۙ|/%2N9WY?7_ߵU/jC5qp߫xe}1FOs$d|]).>!v?GW9hG糚ux^*xHjgÐcBZ'ig=??+[-Gèszm? 8ýVzb>s]޼8ގ*7<|UA65̧eqy7W=='E ~w}gʥFqo-ߌ <ϧɩW݋ƻxIrFO,A7S÷g!{uMa13Y#??7D;ɗT|P/|!: 8k8=7|E3u9Z ~U2^ _/nIx/'/om]X_1wW>9]/I,N%iΕs~9##cy.hY̧hvUG\Y|eϳkU5k9W_aSC}1~ Lj#bWmƳQ{?1.g"O:=Ǒ;wG1*txa9To?!<7k}:š K9E"9zqq_oPtG|eޥ+=r̯Oêe!XWOf8 MZCj;gv;KIm7vB7r?Nh|@[nK_@~/=9uagU5o3XA\} #wzŗ^=Dc-}om&_%`ݱ=;ZŸSėZtv_-^7w!25jZ{v-8sFye#5{sǮq3~֢ǣ×YMY/]oo[)l Yrhq]a7o*OP.)ʁew|Wx}x͍zz|5\nNG+頖o3<%}{<nttE w^fE=|9/*_M'tz]?Tyie;a?ό lƝv>Fi7|JOb|z@qsޓ^W u{_sgXon4VdGAIyq?dbөz'z>btk_jC9kob|"ּU'Os>s88 ]<—3 _>M7+\*??/K1r.[R=!Cw>RݯfP_D˴>ׂ3yOozK8{델g~3<|U >Umڊrw6M;e|W jLw;,6w[WzOl<#]P/t>A_[A<,'/xJ̇5XtЙ O{=qyYmo'Qxy{f<>/U<з}[C=t7͍v}JuG0&<]䟳\:ySs;wUy쳳^ݏ9Wy~gW$e{Da~hm:`F҅=߲`k]sB9zA rfRڕǵ?3[B'~NOOn&ßs3o<8'έH=>Ѹ߸첏[w;E_aܡaq0 4E=\>Wt =fyi޿җ}ƛv6/wI2 k g9sMw*9?o-7WܭQO|9')?hn<΍?}sg}3эt}>9EE>|k\ŧo=#y#nրz͹f3N7#O>FٿУk>=! xAϜwOw-9b=-ퟂW qhr+zsuw5#O%Gk?k> :)>ˏN7uOzN`?w|>S|H'ς%qA $TgR|oxt#Aʑw{ :ᷜFy{'_^de#ڍ ~W9N=Bj}k\,?rbqȓ<\8;/O\.o^nޢeUGK@WWĹABo z9C> W?Sd?OxqH堻<è72O=s|q=7*55 zQkPX񇎐K#- cA_mK]UY~݁wƯv {x/y59|@ar~gYˋ3e|F?ּ##X/G%}ҩ׽ۮ>%q?Oğҽ귽 yD;Ki;kat<a|ƫ>=.}2h>yEs)|w+H1?'c8 +ǞqCte;4An9 _awOJ7Mh`Ƀ͟.qp*:<>:|g/`?=Մ^"N_Cv_ѫ 8kpy}a??qf/|BOċG{)׸z<ǚ 5|Ofy7+7u>7߉q&*griN&pS|'I7Ca xEܨ'3nȓ;j?YWQqBuy)y:#^OzAkfx|G/̥Kyޣ7A_vZ_}] ɓo U=8Q/X[z81_G///:4zt⟏>%io%Uz W#X=~x}LgrU9>v8_cv}Zj_7t𴶻?~~tKi=g2_ aT{]W4v^}Fꇮg8!r"܈q1;1vbv!W9fg_) o퇫{Wwz'n)xQ _R|ZAkUny\JP>>: =N_G"Y׍tO;{_g~yS攃{٧o/N_W|3tq=Oj{ ߯7|*~7~o'Q?~d94-A/*>VDžok}O|`.3z"N7owzJ?g>ƚ_E8Cw7' vƯZ;Ѯ ;7[0nWwvx|-ہO+9[u㨗{jCgsS|Kzލ{(wY~xCS7`b}1BW ]T<tR >j9P׋|AO; ?Kj3gܭ߳~e#rw4>Ƈ_zYŃ&>q.^#|@}ؗ`}?NT)^:>Q+v?~kAeN\/&]8H?{/W|{"edw=ֽ>{+|aT ځ_p<-g_D?aO<>xu<0\z|xU ppG_? CB?yC&LӽtO5=g9DS瑏VUr˛J? rzTO;=g_ @ΗzؗU?zKOSG!뉉s5y~ zd=}z|[^?R}[{}mgƏ2ݧXϑ#ϔ6_Oљaô_ oB^>{A'rgƝ3se6ۤ7IENjƋnj0{Gz7jqgN{я'R=~.)[7a??M]4^t {^NۓE죸= }p{^[Rm_4Nx&f h>[ϫ~x3K>WY.ٍ.& 㿻zwȗq\wt-W:0F5ϾP/NO> }~?'_aSzTz=>q?i?|`^OyM[ݸ*үit]`l3̯夏(g{?2x7yݒyySΔs&﷣|o]>m? '=3iKz>֗Ƨ3SqMW?Ovڤ7 ?oe{_nſD5wzx)Gptg|ʼc=G@_ODx"ȕaZ}}kῦ/^hޛ/aOA|ٯS׼|tݰ]}G4?쫂7O ry{xO?~k~5e1'|><^j/=q*vc7L7K_.ܳmWP}1r^_+[=<r> gqC|;nr(/=訟OxOwy~g>jQK9&n ظP9C>9U{:<qMqs?rxK8=9_ޞO@ Col /$/2׀'_ z#,z"zSoѐ+jv;=.K r*Ael=~*w{niȋkN-Z@/_㻡?&rqrUO6 GE{h[uCѾ\G5DyZz}vS3/|vW^4^]u87v~ߗu>ތUOƧƟkη4zϑG~;Qz1 l^_~miq>AoW~^f xWy|~ Yȋ>OצwH;?Ku|2n?Q}?B_b@klO ~^on2u؇>&u;,v ?B?i?crËLj̽0ѼrNOE^n^0ݤ\?7kɇH}O2>gygxai_}6U2oBXon8_{g![Aon;TO"*z~ps8qt/ x=CGAm[F^ݚBڟi3Wzɧ .,O:y4&!5y݄,ڏ\a^Z.pEv{lVx|N 3.o>7=G_ ]f>A/gtC?9~aٞ~M[(A_n߬>n?u?Qqş&yNL8P Co&}o dkmu/xIƋ60O~;CRFy!M<گzjEvS^/o9r!׉~~82AEE/Xk9!) = ?Df_׬Cnwe򸶫Cz vobCf]?Fz)k?x<'*?8<^͓7~_gn.4Wy6Ncx*(zs X@g=f~/=7\ :& Kt9D8x78_ڗ3g㜼`~ }ίË ͯ͟hŏ?2mE3n٧oS'!'WM!2_# ?G?rCGqn28?s\~v3 ^4>tr|^ai% 3n%9<۪8o#aSt?=I87t.\7Bq;P9V}Ew]>AAG7ww54DޅksoOABYg/Ë ^^+~'CM#tC[7V}o; (6&rqގvn;8٭ ]pH킏]sX4>trpy? dzou?x~ɹ>&Jxp+?tnv4yo>l?yjvGSgR׈Wɕ2ƯJM}wN]$RM;ROvckgN׸k8w7ԢvqCɟ}}! yXo@Ϣ&?!SB.{a ޯQtį5^@:4Y5^KD#zȋ*G[lC|/GNAŧ_c7z_FͯU8[wgx͉sա7 ѸAܦg3ADok_'_XbCn;bdQӍ;c#~G=QZc|ׯ z]Y_!2y?ERsĻ1>AWC0k9xQ!r#u3zwF<_ӑ,(~2~>ϜvW cB1(5!+UjX>'&*XN<\u^Cef5G_3/CHv>(O9zk7IQV;Ao7Sb~Y"kOc?#'دBar[k{h/ ;9_ ?vj2Sk|'EfםwrЕbG~7ܭoM|̳;m_EgG;w2;K_W;s%2I\v&6q;c|txaƣ\kSL>ܬ'U4po ȧ:1[g^`E;+#Oՠ+zi[1yC>e띯*oxW۝xjx/.:svi٣;֛&qYZ¤{[?9\A vu-: Oxϯz_ GF^r@ m®y [.&̠k]?S8~Zkt'?'?4ȹEA/O 8޿(|"_:g\[}@'=c䙇~Wf}r"?.o.W{&:ܧvvnTAuG;#~3|?am==WǪru|ureZݐq I2l/Z':'N모9mzs}???AwƇ_6^sCɁA^0r|;~Cn^mע×yL7Ǫw,!ϓbre+zi \͡,ܓ(|[5UƓ_Dtdz!Fx3/~xaγ_Zg^ūAC?n+Ayn x[j)&ZL_}GEC gIC_5re;'!W>>iin^SoMW؏ij?o);~pvy_ aᱞ=㘨;==4qY8_z7 ȝN7݀<.3t>|scWIׇ_ /BOg-IAg𻺮mFktwo:|yx ^}g&I* ~U-#m8倊A/7?i=/Ozq_CSN}rȭ*?ϡ'=o} ? }ݐƟ^!"v?z!b84򑣗OEC ZGŸxI\Jž,XOoA0q+=\9qݧ%o~ t tx+)gqğ}ܱy+k~.7MhB5\f%;Cw2 ENτ="13?nA7oT~F#ڡEG2?.ׄ_χ}_Bn<^t0q seo=n@NP?lM7_ tqAh5Ax _&ޯOo7_ PyO^g!7ԃ_7r} t#.w:|1l}g'j}tS=~gx ~U?sozK!għ^tx1L?.Oл;w_QO?{A/kc86ߠ'G ivY_{C>!'Ycńź}YKUld~=I47ڡfv}@~q@׬ψ; kGdzgݯ|3ANʜ]&?"k;3۵:/&W :L߻\mb]>b/@>_|߱Zy~*~AWz=,|ńM|pvz,:Gx_8dW$#BLIp{O"NCꓪo>{k?]??يrثD _~JmsG2ko 4ͺ7 9@}?ٌ D~'gxܘ?uw~nvgy|"e{=~/Oky8zkHz+?\Mƣx?]_T+a?>'| woGݸO@{'ugv?9>tyݍx78)qs罎y I 5>^?^맻KqѾGz9Ws}ǒ_Ƶ?3e~2Oa>>M+،|n|dߓQFrI0;OgqXdqw=3| ʸ0I~_.^+~ٱ}FK<5 ٹ =g/8gpEqM[Kρ_໿xzg89ON{<O0ho_=v'CO5M7O7]3%|qcnmL#v|Rg=2%@)qߨk</㓁K w>gQ|{OUe⼩SƋv@'?F'fGa<ϣ8L|++tCzџؙ^+x0?=<ЏCsCy~;|9=dJ恼]_ ,WC`~'/Ծ1 q/?=ÇDDG吋K T!UŦ%{oq>7o-ȿQĵ >q#0|WO>J?3_G<fTy|`qI|ZO[q\a?+M'׋^xzz/ޣ z˸)vyD[y8I/aGt;pf/i;:S0/3q=SWIug{zs>򢗙S{1l=0zy٫7<ό#v8|o'e:eﱾU:z]c}úk紏$.˸Үn{Bm0AOk4]?yj&C[8}[w Əwj?\yI;a~c_oww;5oGO1yxZ/!]?;􌭊η@9s?۟`[7>?ǹ֦|{rU`C<09]s}0]OK9Iq0]u]~*]gUk&ֿ߃XW^>SoX3I1zIcoOۤkڹ%vq[o8YS3_36ǯig{QpB˱y?_zxf>̣C-Ɵ}<θ;9|}Oqc~vǭ~3#k߃ѿf\:`\۬3W}^_EM>u?Lg/?1>}7g-qr!xTs]OY? :iX_ԓczˑWe'1?j;?^7 /{9P?fsMn@оWFRףz?8|v2/u}-ڛz:CAj߁|w#qQ~v>Ce}!J۱Ƹ̟ou/m%Q?:+㴃MYvJ@7 ^!7mӞ/x|Lf_vd݇K |}jC3?aG c<'{x+wj<|;Ӿo<҃~~S~^mo'3K| 2Q}Б>69"gyރ<R/b벽;ΗI=_~k{ BOky/UgiFwFTz[dwLcW=X"/b|Ӟ|2<>y8 EeO<Ҿ >6?#`߹xĹ} x0׋fq&*oFzі7d_7ϛN=س>j:s@۽P'>O?71dx3e}bGlj<~ZΘ*waӿ0&g?3- _~Q{g#{_ zǿ ?@E_IHL{hkY\hq/?ӬOo޿D{|EK_E{\WezOny6N`9tN{VasdЧtG+5v)ߡ?0~蕱ϕqg~;8B1_\>I~_=N7C.s_u1Ys^;ݯU=׆ryPK!fݩzM7Oq/^xy'|,U49ncnEx>jwOgAw/ yrfvX(>~yWl>:O/![5~gSs^6gt1Mgēsd>y?~~c+sX~;=3_Ŀ1?俔s{g+ځ|T7;Vv2U4g-ve`}W -AĮoZ_߫|y_ 6Sތ%zqY٬۠+_%ͅu3=ȓO/>޳ߘ ֡C w#v WxN=}-PTo> Y ?'z^Q={< {G}ہc</m`AXI'vT_c[>xEjZ{˼eȃx7߫_7uqo>Ox}Gz $ :8s ]W9$S9_j'yl߉C Z/Ož ݰN?r*BǛ#)źg7ݳQcɉcI5=-|G?+_G;"O`!/Ig=X7A_ːc?=/=_er9:7+5^5۷VyKz*]5~!S蟼~g[y;w;_E8;_ym“_@Wº wz᭗庝5ͲO{o/=zz,z$0e9闞gx FnC[?A'z}rF +r ]9'?!<;R<;L߽|ݺ÷ 8Ii9ƔKynAAG{2v+>oAg99ЁқCwg4uM|ɠTsM\E~KM?tŃL/ߙo%2S6usxvn ?\/ouvFF#|igǩ ~0 {22'_(%:xU anE\tc_;򧉟~/5#'}3Vy;@[E>Y=՗*C)* /Eg{w (Gq?8i]YX߭=w[mn<Eχ; _^ La<祟^ {EWс?gg+'qkGKe]xuG Gzwȟ}s{M6=|ROtA\}{۳.o:y$gyB^x E8Ϣ}8/~w@3,6v=Xw)/? v4?࿞!jgnuxag `:uj'X~g5/ˢaġs^Y;.pvE\E7'o 7.GO^~Ss?9d?//LP<}ڥȧ]`7z.S//2gs#W}f{Tϧn:__Egq/{9bf//<~?{rq]m<{WyTFECyn~aq >|P|}pYK=v5q(y=xiDvj{ '=}'\?ڷ~xq<(OY.ڿh079?sydїWo -0f#y?CS{ڧrމ{?>O:?wSMoy#Ɓy)Ytq}9*G8'~Z&-9/f??a)Z߫x{@-_2KݙO]q5_b\𧡞ڡ~fEEC6u$^xL)2:(Ϻ:=vXuOY?tM^]N,_k8z!(xJT?|ZN?3J7GqG[٣*:<bϷ>ľx}0o㇞b#ȿ!}7s^r->c}vϿ{7#3YcB='tv/O;C~/oB\ef e~v}/y@?W3T~wO^m{(<U%C?n|=|{ob>~W[dCsȸHxc5{QzE_͟gK==t|^~8N÷99>_\|Y#?R+2탮WIg8t~ {o񫁞w)p{ϟ9g,'EE^|ㇿ,x]GoW ȹw#= z//ϖO{nK?A^`_=guRj TxκP>a7/G7Q*>x uYCa^: ?ONh07/in3?J~8 >*ybyx淣O^}V#_1Bk5o@/;_vYX륬>O0ˠm?? OHtsQC؝?s!9uX?oT:s5?4o|~ny҉}3{_}I?*g}x> A9~杊Z=O.o3?$Ur?O}~g D ßw~{Um=w/8zGUzA z>}m<]+~f{?? "?w7>}qWOd)=_x0b:A 4EM첟S|ߤ^G=AOR}w.W}/ z\s%/W,E;Su<=.85_Po}?~7Ϯ}&>v+с@톾Ҡw3Ya }P"E=.Ux3e<ߟ rsNr2]J'^˝H7\_luWt\~O|ËƺF!W;K[>qx\7eɴ%qzC#^}y% 1N+58̾֠vt{Z6~kЋ'b?f=>[v:f|ܿR?翿Y}/C@O7>7{7zL?]d=n^ohy1]ӑ;3ΔBw~} -78_`~>x-z:tn ;NX][ތtԫc?83p0|EGb2]ޗ9^'f]3J5=t@y҇@/{8+gg8Y0.o:\;QdZaޓN7.^"m@\Sy\!噟O~~Sd\:x~g1Mן|^;i؏0j?ҭߏ} YW%}'ûAa|r q_zA@7\jMGOܻk}G;|t?yUu9_C''z,x'膸OnXtۄÏn^G|٦AAw=GAُ*O>]|uM ֣V+>&{kce_;QԿW"^UﶟD|aoz)0z/y8|\8d{OCѥ5ǯ 3w2]? (͸^NmeqGGptt]+9rᝠc<=5KAgck;n.3d}}Sx^`"^FʇUc?=qm{w\?B{hC~繅ȧ#_/#&oד}s>W4ėg'vxzIOz⻠ƿ Jz;+=S3i}M!ۯx-z;|xs;`y6}`%OdZ>]ϻlJ>whA|/쏒o:vh(P4,']\E'w?'6Cnw#~3绁v=ìAqtf#=y8jW3GyBO;cD_Bw_<-,5qL)T~}ZBGi4G;zO>,C?>Fv%0#&^-z<bzoaˎǺȷK\6Ko#YA>ɸv*V ؏D/qyUv6렔 Ii^5ҹM솢&0~zXu끎 Bw\O{AC{;A4};x{7~Z颡}fYZzo< qyݏr[DtvD*|S}_?A-/|{*Wsu\cC7W o eIq;|9$?bCJwa}Xo wg?H>Ͻ2V}#A'ϠWKV=o`?W<>/q_@o:>LCzo7ȁ+=Iar}}-ެt]mh~ ~`/':bs~țC&YI9~|MEэ q3=vK~guxua\?<3ݥĢaD72^y-gc MSi;O{'=K=wNDk%-v vr2d䷺wl|٧u د9sD^E_^".ڠ)G^^{^.ljB^|]m;=Q/1@W(O0ܹu:YUw]7ߖt ~g?7?T/OTn2'O"=]+Cɾ϶ߩ[#O3_װ#ĹE_jaO3ί*iПAK@^gOHQbJ9Νt/18M>W֥ەw|f_\乗\_.2~ez|.ֳ g!oD=kyha!_GLMC/Uě௸w+ 9׏\a>fq,H؉t᥄3~rs{دqUS$^q%Gzv纞兎:y|A!O|~8L/O&#<,vJtzQL]ܯvegî: te;?׾g㲼ύlTEu/3L?/}AA9gբa]߃ z_Q <[t;Xpg NC뛽ZM@S;r~띴~eۣjt}u=)$َ~3_q|O{2_jڏ=㱲N ]9^( ^6_&C3'fduKS ކq#'i^'y̧P?<>]Ck/ވ3qgz^ g/%7'v^i|h5yCYď>Ӡj;Af9?W{Tzhg? "nӧz^~L/|Fvtx@ǴHu*:C7 xQ]_wwza㯖c/Z.[@\'//[y'?<{࡞=#.d39iy8sȣ9: a>a3ߜ/|€'|~ϢoHx9'ctAy=~^/vJ~,}"9y>ۈySۿh3w/Nސ3s <n˹7?I?pNi)3y^x=zZ)ɢCVO573Sk$\?ߛ_.vymr<m/^"o!}"ю{C;%rOTnз-XWj/g|V)83xxAf}nOQ#:t5V9s#q,<߮_0ͧ1^5>3"oK .ƚ'u>iO!쿅}țiEG@7`WyYӭ~@wK2c' ]aF;`}a ڎ+P/~az 4} vebؗ~+^hzomwws{9VyQn>־)saX8t២ =N.&*Wۜ~^)8 <#S8"?bB)O}^z|^.V~7zp/w'Ưz+gM`[o~Gyև,To3&>Av|/!E?V?vmwg;r+_YOvmQ.=Xm}~3#8]/%=Qg?7NoKt{IN}Ё yzC4q]#.=m=}g3Oz)q<8C 'ݻSn<|T{_;uOG{}=~/#38xI9۩9C_CnUlcEf{^j'wq8^،w?s=a07l~7>o3ۥkļ~siS_o$f\#y9=>z?|M|ym|;=ϰ̼CvMqa^џ8j;[ӫB'(k9.'ޫ@?*>ϳX/NDJ=q2NyWxqƪ?c}^ųOlVTK|_qz,i8 ?3)yjy'?kS~31_>rއxAtf%ryI9q7y_#^r,oվ|9:^O)n+?f^G|uAIh/㨸sؤO._"kUI'*r>x??7sb<+Q9t&Mo%+tļntV7!zeȹBnlU_)U_y,ǁw) ?'vҭ80|zbw/"ons |/<Cy>r( 2bo|?|qxWM܆xO=g%<3?t<Ϡ?vW^/x|tY~^mncZ?и;=']YJA~v /yyE??oy-xTݬoh/~#+wb7y|w`ϘGV۫K5/&3ny|v꼣q{(d޳9 y|KmR3|' ƅqR3!"{_}rA+GAxP\.W/RWRy]vf|?8?M/<fO[o=l>w=_65oEc>vϵ=My|?{P3ݤqĸ^/~~#wO3a1=]xn9ᛁo|{?f="Nr/g A젟w9;|+tC?qﴡ7u}ݮh׉ce޷?q wLr؁w[Uj+E_>Nޤ|sB6q?r&Wwepv9_'Ͻ앎?]p~DAS pv5װ{a^Ž5}co^7U{@u[8Uaײ<]7 bΆ|W{Oj[4Ǝ\)yf_;4#AUA <-nOpt] 0b?7e9>#C'e&N]Ope+}3`Oy; Q?v9SN߲w;Z/&c灿o2onn7D?=>َ0gߧ;| gC.n~'nyL0 {V_ǁ`k։?^J{;\ ݰ g 'gSo]U礡;䧞N=[BվԢǯ >?ŞC U}U92=;A};|+t:Ui'ߵdO uُB ~ց>-qzAE3.}1P}+AF~7=^fȉy~>ozȓAχ$ϬOu zn/]O-5]Oz{fsG:gWu ?*ӿM4IS?yw~#A77Map]ty`i⤝[x}7nຠ~3F~ 7$L?h>\UlU_1EᅬUo1߶s=vF?M^=ƐwwsE}G->,eO|^.h}u g/y:^A?zza { CWiL'+U~v  x<|wx} _m[c8>Ško|G>t]ku7t {7'A; ϣG.̥εcn?ӠNrٗ N=.nOo-oDGOq=׾ >۷ m\X z*h+}ܞ_a!0 ft޼^k}>2d}'ߣߏU<Br K>-}GS1vAI7#'~ > ]a vލmC_zr,O.:0+ м0 {GM!֣7U.8O4z=x ywn'|8(b}~gv^7hu9,HX@dAQ}C؟tܾp?Xx!E\U?vo^bd:[KQ_Ҽ_L;{Ç3iv\Nl>{e\̼87Q>wT]p֭ғG܉ tt7ӐEG>>BN/z9c_in`_ ;#Ny2ːwWA| &UPNԇDodW'\ xn|WVkZW+ʡw9 :4}ދz_n9sUcG/Kf~Wr|i ۠MKq􆑾ּ4݉9ޅ zzrI 7 p@BN~|n)z|' W.;u-c95 ]—[.z_y~F/f! O9g7/y+JgtA~gŸyL7rf:/׀V|z4膸`3wU!wnOՇ~nAF<_pY`j\<%O÷I6'NaQo/[ή<_}agO-<\k[Ka||z`]gy?;|teA瞝A/ uYa=''o?Ëg@V۬2d^w9 f~xu:mB۹rj/ŹS~{C*>MuxةY`'zfe? B>O.:ط"اk;A `?vN ٱuA%wzrW =z!g7=Ήk}#7,z:)|=^Z" )/ٹcsKՄ֗XpGiH={c= g;i|矑W/ȫaon#/Uyb?{Az9;H>ͱ+CU;ޢǫ3a?f=yir_箑?(':<=ەjϙ?ce  L9 ?y|z7sUh OO/R/=NQ6g2]7s&:`_y]{*,ϗ#M9: zՆ +ܘ>;Qv}>9u= skUypv\<<;#&~T^'ݮ-z:|c]?_|y\:AB~=A?ᏺϕߝyƳjGp+,{(3ww>wx47E#5 %?z gM=m5rwb}=э Xr\*ŁraB/IGzZQӴzKΰ>0txkagtúe^^G,U;WXs= ?O8I]侦[=Ë=qn]{5tNZ=3ϥkXa6lΗ^EBUȺ#ws>:B{"5~֓ԋ waq?E7Aȍ:=ēBȕcA+/A##o_v;St?Rn#vt"O# :<v<\Q=']t'<.mse-r>s_}}`úzszBneey8fr\s^)__b|\$LG#\~I~߭Dy@3.Ľi/69"W.s:`VS^s~>Oc=GE#/;tK0lozTK.~bG^w)?7#?u; O} h^:^;en%{c8p<'` z_4qBTz(z? *~XCz+wm}l+Gg=yr{T ~>KϿs8)lN5OntٟtK*|/Ohۇ\XB>??/~R|E)Ѝkj'@`+aƞz#t| ?uKż7g×UG<{̫ "ֻ/ty)<^\`|_*;?o>#Wgk +/(*G@č˼ @'_'b˲h~ct{ƛqEļ0~|= x?[mX h=Zy.:=~7?X.1}=w~3 >x\#=B\cs qŏm/߂:?]AG9_ m݃mEíi7[7f2qG ^oNpVs ;*VNjև~߬r>v>e%x{;on;kR8?P.1t: ЮfgLQ}r'<ɻjǟs@Gџʣwџo8y=;]AIſ'QZ?Arh ^{m޵:N~v[U>x=O>X^}O39.+O)9La{u*Y7{^y3^o^"~zoy?)Ͱk9iSw^;1/v^g.f5D޸h~S߾6^`DϬOsyor{Q'ުb8n|{sK~3{4 x{(zACG y qcfTz0|FҌ?;COc|??Jߌ[^58˛h~Wس'{|NCD/@-{y^>go°zg瑃| f\S>F;2_VP|.[`<|dEtk~=wqzo %+Љm7}- O<<SRvWy ؁YwA[=ba5>2O}l!;te]x\ܡc(~28ӟOjϫbkrWN6iޔ;9?3k"q/di;3[ᛁI3Ç}nKxYҍAOďg*}r5G=r`F}zSNd]ȅq+de7v+N+Cm;n|1 O:in7{ h3G qY^q wREЫw=@^'׹vœ9 ~V7\c=Þ} )G~k;NrïBޤᛁ針Vo(,G}*~[|xy.]o9Oץz`% <>s?Q+n?Sf r]޼]hA^ x;!r1 ƺx}ow?Mg~2AgI?y}wU*O|׵>cjꍼ>] 8Q;|3Kqnk|+,w_rbٷ~Y-v*~Yᯔ/8>ot(gSR3?9ԏ%T:|3XxV^7㍰o3I <ǧzCՍ<yTz.'ۤ=[{_$'䤎1>a48ᛁ -W}3+k}f*;/ '>IAos)?y ~}C3yssҙPG=O|^$/'?m=9>e%>'|9 |į|y:/sy>٫tdr紏n?0){ݰ^ۛv;CzA?B/:<Mt]5F^XywN-}GwaH7·;;#e9' UnSSz:rp]ߡOr>Hν?A7/k-BO^}O}ςN8g_*78̹,ΛU/no:ta< ~'DY|d969.#Ÿ~[~-Wtg _3EX?)/=䑞gnq29z/3'=G>A_G:EuXoA՟u?R:t txfAVzW~x8 @ҳ]ݳ8l' ee;ݰ.V޷>뱞!>޿a}|>vBw#OڣOoq/l?o¯S { O+4jqN+-z:\05__|}<8DA;U/KAW{?臾~^M^U؜#~r/AuqzkWwygAYPy<}Z;2) ߉x熟 dl<vxqwy6w_!=tӝb {)X<8pvWd;첟v?w})yuٴE_ /ow/ǫbyE<q.^_5Խ]T75;|-tC'!/Usu> 9w+7)W=sE],gWZ8g+} 9Ĺ%Uyݫv:K / ϡ 3gsZ,ϱe{< |@M?;ߪ/?w;|q2"ݜˈxәwgqz|$B_4B~}m/|"j K؇Y :sܬߌLn.!.(gӑۈ=нO=vRtz|y?"Yn8þ 6Tj~nG@g ,gb/yOG+4+vz\/o'OyuEvBAGut%Ox7nU<}e^Q7$=v2ɣ\fyP+} 5):_‘< -=wO~yoJTQ?ߗ} ˱&CnGCxgP)v{S7Ӿw}b2An^B^-0g/ʫA⏎|S㌞ṂZ=|Q'<j'~Z7_x]n:t/v}nQ{<53vy^5=ޫczkxY}6>|}xnI <ȑW*Xy<*d'~g]-I{?><~1o7+y>/o/5_N~};!#2"oO(^Yҩywmwk=tRfr_.onl~sY_,fU|1 Yc^s8f_[χNi?/7bc= _W1>3!CoMǬ_4Ճ}qr; ~E<- qC.o?x͟U>u[u>n=+o/{U1E@}+[_BO]xc\o|A/>U.?/*'~/o3y|#roAg|7~g}|PW^:~z1)ϴ~vkpv%pM.o:zYϧt]a]C?ëg5s#|C;T+*|:zpvm>z"c黌u{aWZ. 7<-9v=9ӿ~4_=ĭx8(7^zˏσs< DXnMW\3j`oW˯`]^`WDǏ ;~5zz^qp2N0OrH3/:3OON4ތ#o[ ώK=s|Hrn;=ߊZa✵{ e#f7Lc7*~؎x}o3^yFXE$;>$}vj}yȺb|2Aq*S597yC{ryvgg9EW}UhrqTc:{|%}=+Hh87^_4>trnc9:>x@O;e6b?(>cA#"?>񛼯ȹ3'7jDCnJ.zK{]\&hyrj]x*H>1=xox?zz?=wAkӷ8m?IBߟQS:U;|NEC/) OyFn!~j=;#GkLgF~q/A XwzκyXƸ09|!o'p?(dM ~{~^yAgK^c}3'ފ>,VU|DOo=^N#gytGE{#˺ }Mh|`= sWp4}qzt]?w'#:}Е׭GqnqB?|FEψv@ǬwQ/z)8ާd^*y1?@'_#.س#JUO|2ўyT(x&4M&z' џ;{kvEC/3HUYÇs/|Ч>t3SpQFoK$,:|9ӡSwϱq7Y2Η] ?Aàۑ#[F{"TOL5yv]vy |wg| _Oz*sD;G~")N|`\O; E*ܣ7s>;Oyq 9? Th}>J+QxMt!<<oM';[@@#'|vF\FFt \/,N_4>^h=;m?g@n/FcT5~^تl~|:A._·!<|{x%_}5 TfKjQ.AO2~'(w_߭cxY|c'֗6m؟짣z߉}:~Xxq*7!_fTn|i̯}~|!ћ̇SDZa BA?~ļXo<`=kU;2/>۷xk9Ӿ^z~>gIGp$h_{GA~-o tcU]~2z9q;p׺_4[k KP'g{v=w*zs=o'D?_+ޣ|~)#=x |UI} Πx&׷Q|h@qP<Œk/qq!"ttsxO+,]oWq]s^O;CwE^a7}rUi?srW. ܎ÊnN?<m׈G:dHљ3&qq?Őv '^Y~Z\8Яī4q$Ϫ?߹W>B>=~McA7y~y'gܲWOR!zHus]A[y8ǧW0#A7nyU(ʯ|^ zƕF}z3ҟe\/& :{zYm^v7jy|h8f'/7q _#ߚ!21~| n^n ==}{O4+-<gЧƚA^_6ެDW%3;%3:~G7'syQtq9rcF*qwлi2qE ^s1ό|Пor_{ϯ nqܭ|{A[3S@Cͷ ?:&ae~ q5~ {ZD+yn덫+1}ˋ=?Dqg=>@O;/'_{o7T}u>K.1 ى-2sA-g}>4~Gwrnëss>͟UPN:2ԗX#NCEy?}/}<]?>ZE~9G<{/#s 4ZTOks >rإ?zZzߔpve7ޟ<o I>tx`A?kȑlA=7U~# $?Rg;|hyfc8W-6ywOE3tiǝn:Run&Ȇq%7g~ibrۺ>ۇW;_'OɹgQgg|4ڷZp~Ѫ>lƗ5M>/<ߐgzb=ΟW"~ |g}O+>6q8W / jg7qnDff#Ƒ~뛋}ye_Q81ާss;A?:#Q`qՌ9r @OHW9 <¿-1.zEz^R}|8ݴ zpfȕz~!h7>?zӂ*{}^oG{?݉bb+}X3]c[o }/ۏ)?#Hu=_YP\Og!ʿ-?Pzo>h7z+z@{^/wxO';y:Oֻq~׮Xx<_{pf*Jgxrt>v{nX@7U_3Vu r;I?3 z3?"&^'z7k~zܪ%|8aCNQ9:ΠQ qkqKw'g}e3{| e >ƹ{U>v \# `=xgS9g?g]qC<' t:<x)=Ө?[3Pd<u :|x 3.?|[u7cu5ч_~v>囼-z&v6w`?,[A|Ǿr}jϋE>hدY+_ߪ^dK='~bG>qmb7Xwtsyշ\ﭷ7'/}qqᛅc/|y_`2=y{A ;˧?֗"3t6zo߰m\ݠQsÐ#b<"b{]oz]@F =,u:>::+3C\SB;zM\y;{_{NmԏV?=#O7DV[0~?мb_B_3A_;<g؁b=8qywYw=--%z?{I= r(ufg$n؍oΡϟ__aGM+ڳR #''75CQDsO1̾#z+&_$rFM~K g?9W[ E<˵.Dohx FrME+=nLrY.0#dy?f[KllBnufP㎝<`v0ED1/L<|y5  :a}]ʧ_vf`2?ǕƎ^8D;K4ϩ,iﺾ|xOE/R=<Su%oZ~xuաE4=&~@7r5iB~gg~=|A@ >=1?pVo=!'g _O(hp^ּx:Ҽ۰ٮ+94}s?Ny9>_"cGj'zlv!g\U9 韄 _#4y@s9w'8_e<ϸ0o}Ci\'9g]#|<ρFZUgK ~п?0.ȝ:N'8:|3!kC<x~؟οΡP;,|~'3t幱\2/Ї֢]>WާZ[Όwu}RˈM!X~EE1_Ɲ>) g#Qw].f){po{o_/WO8|>vdy7GODAw<աn_^ >,O/l}Γ<<<\gq?O cW+??穗5v=_]I?jۍ@ўSN83~v?Ql-9/*uqs~kGۃ[-o$z |āS~G~E''E{'96뿪v{vjGUf~fw"xXrrW7nAߝxI|/yb|ЃCN]cG*wGu:Y|~||8Ӏ)O[͇%yd?H.έYL}EokAGU~N<vS'㏽y4?tzaS z\`㉞WG1NHK}׉2ny=esΕ۵;Wʷ\/8V~~__O Pqu>f.3?[?t|zݞg<=f?;>1~Wցs?Ԟ`ƫc|ġJc?_}#tGxRlj}=}{:ީ^ݧu^}oد%cx[|, ] A΅*>]c~_o a^fSzfgx  6uލ?9{RyS7<7-ԓa}^[܏]r)G3~xy^4{' ˛s o_f$O(OwA7׿Iovw|hvR.zeVUg< ٭vo-.$>l_B@.ݣz#C*W~[Ͽ'jWTh}ʼns=צËG}W޵.Ⱦ:t$93ÏiEk.`?.bOĺ^Ubڹ 9ދ^0Ͽܢx\gaWs['1N>An-cz%@zLy^nukG1dM9 M{č.{!o.|AzAttbs tO^Kͣ?㋭oOL??ϱd'_T|Ev]쫓^qn0(8^ϴ3}țBŔ3/ǸG95=t9 iy]Siryq#ݘo|}Z~O7j/x?ع]T=߫ĥΈJGσSEs651zwhΣ_8ٶOe^ O>g>BVpj}O7i>Ba`7a7t1Ozmz<ҾroYgb;d\B!:"A[DtrT}tG}?L-z|:ҋw O៓tv8C~`/O g~ yv˛/> = {? 9W}TGٙ}ڣioUN7^<_G!787磌:y3V7]M;,t[vLGؽ$~D9o#o}t<T/'˛/lWykϛIxmY>Ov&:nՆ>OJؙ9}TC據}C?>D_;X}6q ˉSC]ߩth}1/z:\ 48?aN5oW&_ "yDg!ڑ\ߛ~S3ux9xy'VOo߂k9Q5ϩػاYW/oz,ν gW_/HU=?8y?2C`_ϭEQ=#M㧵̣c;!r/z,z:\ <&\[C?1z$߯z܈S1~ ޳~OCtNj5r^$!)N=]hVB#mz!] 9t~+7"\2c`EKa_=:~X7Z. [ޫK{I~"X磇N z5#?t^ݘ^TO˲͹ps^7?W#6F߱@N~c/P͙ tnrM莸q.;5s_qssbwG#z8yk3zc~0ϖeWS*z2&mⱿgOBB뱶; 3>71?Ki>h=W Yw'ivz@oNҕ yg LO s_|aCO=(1/|MӐW]YGoI˫ܷ{^łޥtgESz*uUn[n;ZxJ^~y(UUo䕃oj9q0]ZËq(KĹ\:/b{ tȥo~=v!/C+xk~XYtsao|7Yo[瞸qi 9AŹ&ڷ ~mG|y]?5mjX F׬*h|hܧ]|/\#fsPy-1@9vteMIw;+߇X͛3"h \'mOS2'NC_R= ?{#9^o|{L~^ч1NR'r;YG08;(:g\D/j5+г+#>s |=Gxz?'cC@kA/ce.z{?# XybG= {4-h|uŅ?]~0 x SCޏ=rtۯ@S_ 7vl^g@8eq_~/47)te3AO9=B_n(߁ao\EN⯴P7~g%DDž>a~'d/C?UN@??S&2x}`2z+{ ݮz =Qr~>ݟImu_H/J=/9t|8xe| =3 G'j/!*N_p=?^l2. nfvJaȑB_nrB.q΃yz fr'=/^L/az݄_xv,?X!ϞM|@j)큞}Csf+= ]88}!믃>}NIruTz>wq+iy۫M/ܬ CH賨o+Zgyy _ɟ{?zY!ybaz5y&.q^{Gϱ@';Yo rڎ?ꅮh?sߌaz5<稏brT5-: 􆼡=v" EO63сWطxO{ȧa'SXGGgxGL<czq5%EGotc׾߮vMңmJЉ\'}9Ժݰr\#{oUs}i5qh:؉/Wb_nzsRtsz37xSsf~~7yngehxF[TU:'?`vFf<'?t2%#L/Yf(R_ºs_/L)s|xu>z̸7v,θUosG<zzXm'3NSh>yUk<~sGO/{MKMN+~?Vp}q33~C|7.qFݱq fC=g<8fqWrǫz98t73A&8-g&>3x_/!{w9xs*x}M;~S#瘱Fu#xιkՏ_uΠq=OTx@pC>V9<_< B#|f\J3?7+GNq%]<Omt|לw AӶӏ%A)Cϝ;a5 yZ3ۯ=*]޼asb CBo/t?/#ӘWcm>+(c?<[_V2^#ǬOD^oR3=w\5ϼkA7ׇz=>w叴=|UY^/|a]^:~%'^$[úyqAߙo^Osn}8D|6EEO2__]d~@RP~^ޭvG³&uig⧿;vcy lE?c'_^v+kjL_G\χ"t?[}g?=x]'cޛ}: ~r6עe7)bvxxK ~#yc5,6yo?R0T2~JOG?يk;r]Ҝs3 n+>7hGOю\yاv;۪M5|"{οg+}q?zg?u8`?z, }t6sO9ú^z$s6b.=m.+:5>ƛ?'cO^ρ^W= @I^)rn`ʛlJa7:Hx[gA7|[rN彞o9_(|D;}s]a?^x_}yQ-'t?\ߗC$A9҃}A;AW#?U:~Z B>-+_H^?N=͜gz|?2 E \=zthid݋v8_H퉸w ~#CYoM-'C\({J?[WAͣ'Wzvc͟AgC\4\whicz8`˂eW%IWñ]aX7)Q.Oxns?o`Acbߕ&~LWy/^/OSx};e}JA2#;/GO"^ƛ=oS#O4c_0|^, 9tK N"NC7 ?]' 10x|#߀g4>gμ|v/o:Lϭo 85<{SΜ3&юݨ{O;5rv[0Dj n˼nc0(t]Yߩ'Shi]zrՂy!) *{48 66{+G&D'=u<`^bܼ.|W z<;= |3ʏ]u}sރ@X-ls{Гv!G>ڢ7mG`};!Wk?_wJ~ȍdN5+[m˸w'iMƁb?7=h> <<Cw+ ?}y$OcLaC~(OM3\3}n B0vxyxzM(%>/< >T}Ǖnfso}G. qV:3"7ע7B?y1ux+7FX9&=t*f &&ϱԟckȇ :٪%]͕C?M/] yCycagt7:A~o#z_xu݀}3$r_Bo> Sw;< w{GocSyK^:r!3=; vN7^h?bɵ~!A#X@W{sZZ? ;>]k'`H_H !p|OT߽.o:x <.Ӏ&E~@w*_Lg=qDGwW,+f^g !>=g^?go(E[? 8xgY~g+W,ߪ*?9mC!=+ZGqq3~= XOMt?"W0D9 t|i.~GS۸ϼ!Ew}ȝyqK3wl%^ͨtxu`s~ ̤b~e#ts4~̠{.C[F*7zrës?wby֐G=DguMW:.~+!G)ޠm+4U~y4c<.Lg~\OtSrB7q<]OaMڙ~&ë}_TħaA$]ue#;Uo{U_O7| ;0q]&F|<'6;Q=P/w+wݬ~q>8;~vG[!n"9C>/f=@.C?i WYOK:#9ھ/'4>* >H<;_vş'ߠHȣxaϷ^G?My~ z)vy{)]@͟i_olSĿC^JM>[ˇ|MЇ#zAmg+_Zwjg_6^zt?z>WQM~7t{o ='O~Pos=꡿_傛CG!R_7>*߬ |~MAaԋ&κ8WUەUto']\fA&0֯~җ xQŷcHߣgһ9rFnv9瑮zje?򙿗xb=t: 3 ߆ߕ~PH{x]Ӻ~Av3&ڞ~@oyɱorCyZXrv=|sЧ>kBo?f*~j.GC^8z<=]n\FHߣ̛[`yGn^Y÷{AGFs~w;!}!73O~wx1!rY {ß;v1Jo~Ļ۩Dk'NܜyJw/[?Ot倛G~?{o_{QOajy+7$.lNv9YL[A>MT(tU_Jh;#c)/L=)ȳFޠ@gOc}O|C>cl>*QmP9ů86wةeXxD|cGa}=|uYd Mۇ/LkE {:==^0^g#Ju}^p ?cC?8e;z_x4-g;rz}Q#?o~~WUMRC[OC?/'[?ÏGzgG"&KKD>#b|:x l߲ҋ]?p%Ѻu5*qϑo3'>&zvy.I^u>݌a:\FhWv<}n?l'[[=Osg"K}s#b_sR&9k;g_؃YX=t}KQx;>a8@}sSfOg-Ԏr&$r<=)ICO7Uy9snTľ?t9typSe|ѮC{]jxaoz}Ft2xM_`G!O%~+G_C?E3ꏶSO{z}Lp]/M gG=u /Zw ྎr/Ë -?X=}O$g pxwk)ˏrQ Vch4nKnN; }keaӰǯH~w. i!-vJts6~Oz//y=4nnkՠݓS{ž0/7W=~\PЅlMZL!>G ;GQw?G;;9ϊv޿udkiӤSΤ%&m٦g[{W}|ud@zlG@j,C@"DzwxKGˋKsƌq#`4~mk8uu89|`=NǏPtэkUs;?:&?{򟵟u:*GܐcOFtbjw탶/N_UﳿQ{MozBOA_GoY:|{'YE <9oK.ͺv >w=_>J|,}Ə'kSy̺vMWd~2ux7÷6yg?PO^Ƶ $*2a `#h8lnb"/ߧoyN^ׅSrI;;W>vtp{%y=?%z-!2ΜV8xV%&ycٗ{oM#uMS9?Xxf$Ma2.ׁ]k2rܳ޿wcqg.~Vs|m4>ιwx~9 [1|I= :qN.}ꃮx࿈|9H%5h&q+~Nx4/LJl_U|~g1Ax>z@s'4x ߸s7F7OLYυ<~nށOq'xIȎb;>OᇌxN#}s˱7,o짭6y(,us^"߬ߏ+>ȓwAOY5Zm?Qg|NXD</1nyi(G{oo͸9@/E~j g%ì߮2oAnj~d膿 x|1o8xAA> q1#ޖxnV}KK|QdC+OyEcaEOoMB\ta;/=y&'~-9b`^~BOW9Bߴ= v?%1cē߼ v 'SmϔuC{<z?~_9}%?> ׂ|`Xo\.|x]l=M3;u zB!}0Re|+ߝn 쓊Sy ;jcFYGPy0N }| v4rz^wc9 ~ g{iΟ|G? ;"U/v9/ߠ>=k{̋K;9ͼ1!O k/Oy&J\&}˿k|>G8C;| 'Pqoyz k\⦅r H}Λ>ރ}|-ϙ |}tWii/My^>5j9ډ]_kaB=r 8ٯuTc'Nk7}zf1wOM)߱T G;S1~5 ^OI|r} :@}zq {!Nxsg'zO~!3 |:xr-[/UY=P 0{Ks: 9^OGNr:paόxaMc.w:b/=n(:ڼpׄ~>;n^}omx"_GO;T=rcpJo_v#8_`o|'M elGV";9Z_~h=x[9XCA?~?3w+M>sȣr-h?rc_{ty\BOι {t!_O||ù֫X !787E5!ЫsQ? ௌ&xriO?a}^{Ə56y1rڧ7~' /ˍoeO{){wWtlDeoy4@_J~U*oxΈgcAg`~S+zryby$:|SX?c!;}ƁF`O>V6MOM="߬q^Vgr'g#1oo9)ϧ鯕WW:]ܸ'cAǟr/.>Fig~=#u>N3> v:?|wx\{W vO墿t\ڠ< O M_iSo >*ƿࣺϸ7<*Bk4\/@xOUuv<> ?|x{N7%w 9#> 8˕Lc m<]eDs3>eڪ<.S^=Hu,TzʸXۍv? >iY:<nا:dO~`+GyD9'#ѓ"gj^'3nh 8[cb}I_Ɓ~RׂDks[ת^޸~%7xfh{y 2oe[?48;Intt`p ?oU]/s }O:ɟmN;}Z4׏_(r:<AW1Ot+vQ|:ty8p~a Z_Ÿ=;Bސߎ>ծl:8 Wvi׾ǧO֗Sr^Ao$(U_^Pm{7viM'`r\&ԑwُzO#+GӰvaz}p|Y_BNx;@Πk6vN7>h܀_]TWQvuPԋvO!%mV* O;f/CIq޽~=wjwn헟D=??o+٭r)7xj>FuOyތJpWj΃Rfb^}{voۮ>gx^8~O|A}&ڋdIO1N.78>ܓxtqFo++ڳ0Ɵv2N I|Zvxq>{=p{sQ IσlO[D\B??|?yê|vFǑq^3$qA^:+3|BXC}lir\w;e|)1Ю'ulns퇵Wp~}4; _8?G?!WE/0<|@Wo]=[>=>Tnγ&xL?mY{?<͸L~?̛Ʒo_Qq:3zlϙorwT'" --?uMpVyι???uA_ꛠh3=7yzW$X0pN0]q4dsJD}.紏q򸃏؍9qA+3DC_(_R;[#NA͛}_;C*=6qV7~}C~|;# _=`#z{|5W0z1oj@y0O̻𠉳w)N6j}/(/|;~E]GOH\eyJ&E{ao{Lqa\cu'ݫ?yN98Y?o\;5xlno>AoCە'ܧ>`4<_xߎEv߇Ox>eem{xNar8Ռ#vʡI(_vGr?a<1`q b~O iZ+{Qn;k3ȇ=w;osYv4+q_c'}\6q)u7zxN[|7> >xQ9Qߪ:z=?G}G./zǹE0k{4xh/||;pJ ^Q}e]/}_IٟNI>}fW)Ǜ,EGQSTx1늜ߩ }<N<܃/xs fgx8o/ͧymʍw3c>#_?lM/{dww+Ng.Rs<}Wi|sx8o0fy_W#zgA^ӯ,ϋsL?hǨ3d\=;ks1}C 6 YOiwFܨxk;柢Cv}>x B+߫}va#fj{]-T'?b[{1h;-݂yi} 4_o?;=/ > *-}o #ϛrOs?I>91?=gٯ zUho$==tqb>yC^MtޏӱQ&U ?c08 |9%s>wηxH>wO2+CMZs·Vbo}oC= !['9D_F>x]]矍gd2=A?B{/OI7Y~w8e^?% O>"G2oBwAxsG|as$pݠG9A pUi{.7n4/kx|#oݟǰ K߲qR#_&|cAL/ď[ _~)\N_J7_MΗw9|y=brG3W-wx2Tm4M3|Mۜ8.B |b_otV$>jzMj">tWYOOy>Nƿʿ=Law/rξQ~>rOߩ'a 7Mט]6=AA||xJ})tW㧐tmOxH(A֔3QtL `}-qrh9GBWk&Q;EO?styq>>f=_h{ D~?ٗvxwqdDOc]>6]XM؜=v=C+^Dρϳt f3W{'አ5}wZtg{6ɹNZ7tIߖٷ|ExE}|Eؿ]>؇ٿZ&!v]yI]EmTtowynؿ|/zrg=ǐ"_C1~N:#WxG?wnᷜ^G9gn=eztÍgإq^ni8?  |=;|{ݧ Vo9#O?oxjg 3.Pɞ#3 v猛zȼW]㻐;w:<]y2/M?ts]zA^ ?SHT4Qn'qcrgq\}Ztzӎo#l..'S&yg싇|Hz}rΩy.i6T/z ,s6a󪜼<3Y{5r;N}9ߡG1;7O)8yX_g>rJy<~߈K;O5U,OWLBOɏz:#`r=!·&h}oz=3N2ODn!>Bc^ּS>z;|=}j/!/! (! xcWަ<;4?5.רJ71d}ЋU^Ov,zh|A.L\ۂ$doM(G'A)YylP{Cd%G~zo}9!ǒ(r[][_A9zs|9cCo?[O>pWz!ovy`c'Oda\7&/$t)>r}+6=._ȋgS{G/{gyG=r*=/[6Wxe<|se⻬|߃+;.ߴsDZIM?oRO{9;G>gr7_?U6?t5}<_{{e^wbjf^}G'ϓ=i3vx?藿~5>P?4yS.xxD8 j_W~&jn;(681M(l~GM>_ Aw++59j6|vdzMMcB=75''F<'M| `]Y>loO·1L}-y+q利Wiij<9n.:hW2eoN8n[iM=o:u$ѥ_t,r+K}&-x|gM9tNS5y(yxGۋWyu|*=x>ucZ?ygUеWʝp-~-Kخz7?>Oˇ+d܁w@5ɏ=䍦|^kn N ߉spS z|tqe>ǎy~Qz^ߵYg:¸?y}|Ok{ezW8J7|wM]QoMܧ;癷nJ>͛m?9vQt'7L>c_Fن/,~>d7t+S6/~utEBC  _)@|{713W?) U1LS~÷+O>;;?׫nMVoUpзELr-ӡ3k<-~y$|o9v{FzoU#N堣3'w GM fOt5FN'c(%!K~|~vo7~#vѳ)8Pد1_5'Nxk>}ao ]ЎkzshA~L/Aȴz7Q>Ჿo+A]mۚ2<"; x^E}iכ&?:_\Q i.owr>.:O{;x=m_To9rzr9\LKig0~.?gD\*5r7Z/!x2-%E;F1^Yoڹ?4ewY2ݶCo/!atQOM^y:y'Φڗb_)O{ zܪtJ/:{É4?9~GWԇ MoŽf'o)x>u)ۗq.G=||?zl"n<яqt~  ~c_=q,ރߔcރ.~ W51|ݘ~xxF7~c!v7U&nvRtV>sZ =8_%#j' MQQ{^^\Grk `~ΫȖ?=2_ls>Ao31~\Oat_2!Ɠ8sO?%ȕP?t@ȃy5|83uO[ZPKj}|esl¾j|zܖ'AM4XZ/8K6=~#tys||- 0j~"u-xK-ǫaTF.M[_NU=hGB?[_6q6^tO[Zp_kyv>h1:y# ^/FG[H'h~̿>_<?S?VuJ7+?tyi\>t-x\ \Gͺ_v&a/=~'aYf7J7&.*؛*=~4?);p4G=eƺi~s=ϝr7?Y(qطp|5ϥ˛p|5 w>ԫogwiÈu1jdz|9Y$=g6qa?:|ᠫ],NCq!v=y|ASaq32no/'Aǹm#Z;=<˸ַY^l:rN|"A҇v~ }ފ)xKM.aAnqsSwo!:=ܼ9_|4Iwv z'!xq"Ԋs~=sץu8{s[Zw[7ronʓIAAwe}4%j˽j.\~m\}AWmhRc_ni}+ p{WÓk-O".;ޛNy#Nעu=oʲ=:ctrVt>Y !5_mwMߕn"i_8o37:|`gf}\:>:vF&{ r&|'o;w:}z#+A<7(E&~xGo_/Ysc:0޳މug3=Ĺ>08vnAMؗa^Lo> /WyQP9ހ÷r|72qn S[;wciD?{j~u`t55EGM~jGhyniUy?\_~?juIyS Ʒ;joru2>{࿙ߑ<OuYoo'l~x/D]|^/m{Zאk6CQ?ᛃ9+a׾cG靇 {*w;.@C7$W.~]ino^ C^~ǹ*G.s}_CS;+ra+o^h]_E>Uq'm9ź<%߇U>R6w!W'_9 g=[0Ɖ;_x<`Wf}3ߋuOԽEy?~Z|i]wvn´_ L !7*_h~ :)ϸg*Uo|TqmO>zz`o8.YA%.y ?ɗraF7nݞsSOj{o]tʛϫ8 Pc)Gx.|+`?OoyY_!Mރ1lIsfܕ'^ׇcrN5b_"z "ܯ W$Pe䈞u^{?NӠ+rEp|֓g 7 _~ uÅ~?7{~_׋>k_U$g!]}G*':=})q|nVbVsg o%~uwWǗ~ _oC~BG5(h'q/O^l^UUh ?g WӐ7#l]~4_5 FNz^UtTtR_9xO;\U`~?&(t Y_swgmSD^=k =rg8n^qP?+_ ?x} 9tg٧n׬!wV~xY-ܺ|Ô/=OƁ8Z/߆*]u ~_v)GU>Q|z;GgqYtV~mb_+A7gi.v }n` cgFYڏf<>7׃+*?+$q :Gu,zu/ 1O1;/<<,t[\iΣN'c<|>^zp\ }G>71{<|N9|HT~ErHr>}-ۧ9 ]/?}k܊6q? ~NMƼ9] x1(q9zt "{Gjog'x^ǁ''ȗ:Ӝ-e=_9{m\+z%,ß Cߗt\ !s;ȧ?=Sv>dK7u\N/L5=M7:Oj>q30۞{Ǽk\}Y0V!I^EQ?/? 2EЏOr |C|A}o zx uYoLiq'r0Kah# K*lza]qR?4x+:oݞWd=$ٍ{CGz/8RɃes3]u0F|LUe~-.d]X[NkƋW?w:="r_ T9Uw*?4=\{K+3z㷪<u|Ӹ6ywʕ?4fFbar=zNIv7v2^3%} 0oȳo-^n+{˵=G'"t&z7+m|?o.|\w:# jsJ<~^UK_= 71/7sQ==^TK0|J95a✁83agctxOn^g%˂n`/*^5e4Jn~m'n-_=m!*E.A7 ]0n)]_!<^Q1qܧ/O{Q i7}ʫߝn C_~^=zgo?7HCE<; ;n3rqO}'3>8 ^{xLT`?D;>I ^{f맞E7^bW^By멧h_G9c//b$=~'^nV5O3j_w/% ^n,?=< 8^z3]`l/_'gjpjmZv: ]1D۟o#טWχf .\=|xh'3oXx_Kйߕh?z֏bз[;.G"q{Ǖ.c}xF|I|p/\q`|_WX!cGq`1)~fDg7+#:08NAџ:on80o 4΄|I[xT<עHCϛw-Z_{Ƈ|?Q ƙqE>oA?+_{)Ro^ٗ5^vhƐ7Ŋ˕MNe4_;Pxt ,9q-isWz|3_pG^w>r5^v¯5Yh=@xu%Qsu^yW~Ϲo ]#D;"/n?3i|1K_xL;/g|i'?ޭo~OOJy_ s}@Ϳ8Wکl_:7EN_ocЧX/.W|z?Dsu8nolkO>x#?r^>3_>t~.vDsb{e?}޻?ao[v(g}g'*|~S3/}{.xi|x!d5A+Lkދn; _#ơaTاh3~ot~j^zDܧ |hxyڡUf~gλ"ι ??#CN:tA"}{7~?My?wBoFnC׌^nC[1!r_2S3NwCAySA;CހGW/YǙOޯEUyj;U y = ]펱Au_//qO9ga'0gVBgbʉ/z8 ?V7d5뗪߱_sq!cOǾ_7,78X΀ꁏAgc~@ ?-95?+t~׬+x)~S~~>rog_>Ay |ۃ> :~G (N: <ٛGu>y0>rrRωr@pteſ.> =ĺq2.A!O|ܟ}i ~;~+݀ ^x|%O_bЅ=A/0#|7܎ik!ψc2[8[zР+R<Է[!߇E==䯵{̧4,:|7ZxuzeVyؿU9u9A{/=MIǞʅߺGzy[wڮ$|`<~h\㎬>3φo#%r9젓Xx}s[vϚvw흄kac]Nsx%/y#Ϻ WtkqJyu:Uܼ>^~A}KꑳX89)<Ů'yc{6m烯#_GؽDw֯Xhyj9F|į9y~',rϺ'F]oM'`B%UAS.+r. _})CzrUR]4~ /pO'^_Ȅ_CC/G<]:}E27TQ}ɹ@r .hzT]O{v^KG0=L=v,~E|) y#ye;4t>=zQO1Φ{ﲎ"W!o>qب|v@[çtކahډԏA/\$1 C}H.z0߫A:O澧÷ zovw"_+wAw*LL۹?r}Bnm9&ͻ@,G?AC\ =乼g>} -wRTx~PCJ?̛tY{z:e`t_z^;e7oE;|)q8ؾNއRIzf!g'l9 ~# L9ﰛ= z܏'}BY/oc:H?%Ae}ABF>ϼw:t8yӿ%yn\ZoX ˈ;;q×-3}Xyw#v[0y]DYCݐ qJ׶egrMf;|%>bOb`CG*άaws ]1YokWƟ=?9.4>Y7K?sn,<̽j:(z:_;?I< [Ə'FGdXsSN7yUt r( z:=+4' yR_̏y a31qӽOseg{f?H||pGKz:fo8qp}#>`z:e!#_`' qYi=oes g9 1{9^-v7/dEu;ZYe_M#\ `4wsm¿1ì Wcڛ?| ǞpMW߲vAE(G2lOat8iWC?_0e?{ޓs+cב>_0Jn߀oRx*؃XkOַF?UYNFg]J~\o$0kz^VX߻߹g|9l'Avv~;k\3DyeX2D?*eAK^Bz'yv}k9M^]9wo~dgOh~ހ9oG^~Q~_a~_Wl;]e_|W<Ԟ?'/<_RY~/nDS ;]RZ?C'5WQM;gAnIɌC05K?& ~vߵ=̷SP^/3?{R)@<+?8|1?WWc^h_үP_L7Qyve'x~(xu@+恼R3ѿ _vs'aj|w~yq}Yiǯ?O#z/fcmkq.g.=r{vE?nͼW7d~_O+1?M/wx=|yK=|vw}QxB.}8/_D;b|GuU^?⳰.arJ~]{C49Q|ǸD(ɅxO^ڇ'gcG nn5xsrg(7v?G1SZĹ|l?jn;Wn)ϼo>MŸYs#9ybƙqeXG'ǿN ~gøgz].y~cmrz@?3awۘ_}wyCg=k)G=A |&A?X3؁w~%aY5xzn< :~ =|cb|h"? M{ .G{_3/'zTY_E{ߨo󔿇1w>>"7ԋ>`ryݝ^uwm :](~~ qjI{-| sa8ż7o >~1_9z">|fUu!y|/3 [dmOV9^x%T8i7_Y/uq i>̃pח1Q~)a#oO>Ͽ ~|MG™hxi?2O̷ _2Co/˴'˕'tϱY| x@uAh_n?(r&: svsc|Ui/<> |wc<[\oS/tj`u*3~ _E?:<؅#=\-szxehO2_|r]ߝW=+ӝ:֯*zg磝;Ճԟ7__n8=*~>+xr ΙK;P:4j>4_#=ܮrUc!ȫNyν\o_zz^eqrznxiQE{i?z~~~8/O;Mn=;AK_~e}N'R~g n?lE?Z.zT_g_urL#7Gs>rI;hN-7뚏{ۡ/Iwxy;J}Gj=4聒.}?Kqu? >Eγ{V[oG΋H.ڟ;WUu{Jqu;vz?tsw}~˪J)v-}q }yE '_xP)3xi)^ ħNnE5/н,;Ga c04rtx7UpzVT? ]п~mux28Ïȯ[e.~ޯsY{^/??zЅ<:NFe9Q ozb}Rѽ2|pc'Cz&o ~9ǾRc?|Ff} <Ovǹl>iE-1yGKwz5n^g1N^nV}M>ߧ]xY8x/3k<|WC_=c}D8 ѣ"~[_l@^v^>ZpC =+1 /LyL?zifڎ%R{0wj~%[Nxe3wWB<Ǯv𴟁7۵]xwz ~QO 赑wxyڡfauwIQJ͹:S(>~&hN@gn C)Uc<=Կ#>y~=.k=5^vy6̯|B?n}I_ļ'ӎZ]?$>lyN:7ASGpz/_o'_ 6r&? 3[妇#g>C~ubo9_л?vnniӌA $G!_|;.G}Oo#~O^o]݁v7>:tPɾnޡ{v֛oy 'n淉R}= zvr' A/͒8>5_8d> }xw)&ԿU\-8:|9J;Fؗ}N xB'^ ȹ0d |F{uGϫݔc_{A7'>/t?NÏ?/+~r?cm;:={(s2Eܘ8Wq9<DAg La6'9aԏ tl?2j\+~_v>сk{.o}/B9Nrmq7nzdz`yAʼ?.paaeEh~aҳ&j^I<гU|~8'.y\tPac_vݩaNrc}_#h7ΉmK/I7!n6?y^?ߠsͼƳ^]w㿴G l7"'7yA|F{giټrr?-4qtrxq~'؅7̋}?>{# ?aکte $aWNswsv Ǖ|C zܠm#oj{:|IaF1 '|=#&i^=lkGUq~?)߫_gV:{>08"?4_ f/GQO+n~con/i~]e|zߔ?c})$d|gv3A4_C6wwM>Kj9 9QC?O9qу*=7`kw^Hճ4~>~vJ78;#kyɿ]÷z m_>G%; ?dD3?@3ı[{@8b{WMo:$q~F^.K~t<p]M>;]O{~л҉#s:p8~ OsKzlCϻ=;|]>ι@aK&Gg0 {?5;Yyֻ9yHXr;O'oSx*Nm?~> ^瓮nSk>/Co/\_zi^9o= ӱB7o?nT񻉗3^#9y ty:<_7wp>|WΫ9:kz#>Zd]'QߔM?>U+rM~x%tAН$[< 9\DAd?/>BKL=R.!9qg>6W&'MXC> >^yq*KX{v~oAC{7d̋I7ܳƋ އo"OXg@mG< ro6z_A=gl;?Wk3?۫#(ANAw8*9Om% <؃wX{-6;v׵^뙎o @=O1N}`!lv{xM\:aV$}'.Q@yms+O;&#̇kM<ݤgoS)v>8W1s x)Tz:MW~7&;s{g`Jg^dzg=vxיqѥ7ٿ\N9M&'A3T3q^g ?MgoFzoee\3؝e/)^a9:~ғ'u]t7=v~a!:? i@/_Μؼn]tx 7~ |C?_á\{BAo]sfe9_磀Ǐ{vg)gzYy;4@_Eh8xDN0+atBڕa zz~_ y~֓ms+_~ao[ٯMG'r}=\#jylO7}Z׹~5K?z~|a%G kK| |w;34yB?k=ޓ'K?3ǪwmXdsWǺ7=Ë*'=u+g~ׅk{&qrP1Haekg=18祸9s갛soU>^ga/{Łq w6ɯQm?so@>sԟWhR >:%ho74^yjZq91#O> }AZzZGk>(y9Sf!^硿':t}]x杂?ք}=xd)'[i{Jӓ$yS߰^8ǠkqEON/GBG}+܅]it_#7=/˒gA9m]M /MǠ+s8s+j?r8џz>;|P<[)@5z?LMο^K]8  s\{;= +>Ԟ^OO'=iy>;.~}9x:r~w:ԓ王)Bݿ靀I7 |_ߚ(zsɞNr|-^яwb=a'Nji|f=W>6A/xqL7`\w~k_H{yX>Xyl^WD\4ۉ<{O_9zرȋPx+i?o_}4lϪ:^a^ql4vj|L73K|﵊7ɅO/Љ?4}(ޯEF^{ю%C8ώ>tK9?zr6=gA5?5k0L4W |43~?i~x6|P)+'D3⏤{s?@na-ƁP|x)n7KgG$[>OZ̛|}=EG>x~O{-ͺjSc ~e٠zy~>gtY}P{wYѻ]k^a%/N|Hy C.GYxv-w}p2GE^J?PA}Pm|=x~XQ\O^q3ì]֗=$=r!y>{f. ]>#g?3 4O?se.=`nr} ܪzn~MX~  !tRoa|sUX>E,=&G;6x~y>:'xy'ǽ2a~{O^I7?-+ux9 _K1>AOY쿭sy|ރ^9z"x { z!z>%> C=|qF?hA#Lg=S? OX?C߫8y\n85~_W>:|?yxۍ8Ⱥ畯{Vbg98k Ҝgdy}H?AƏ1 ^6?~~z^S7ԇ]34ݨ]-G;W:Jc^wWe]c|>qJ';6 #9ׁsy9,vd&|~^:3xe5w߈DhobV!y>Gr5TxiDNI{dl τǖ5z@og?;UCg赬C7s3d}-?G_M?g^.PG<' '_1?+3LCc#f.'ߌG.;/'ƙ{q:/"|v!gwFa=tPH72=5iayeսI|\G|+I j@ 43/ ~܎qa=%I:Þ=}~< >;Doh?ty+?#|{/cH<2A'z. 9H{y<' 3j5A]? ʼ2~W?Ӯ#~޻9ktv!Y sK_O?$wxN-ѿ|.׻C7 |CxIo}jO{ |^x-vI=O}@>3O,9g :?Q퀿E;,gi7)|4wd1~F|I<7A; QNyZx vEu:ZI$Su~oǓܵ8zv8-L7un2yOm{-EV',ט.%cYGcWʏAWs>z3˸Nzʯ^mo|_G/ЃO󻳵]ir98zBWkrLe٘o!O6~p_E<&` $)j|xܖcr'o3^Կh뜈qyc:bwwO?z2|&swQ8U_I>/wgw٪t{ch~>b#ddya}4;r9uׇn~\u;u5g.G] O7M['Qıy_AyЍ>wlH;F9m?>폀Qgw`W[zXI\ϐiVyd_mu;}g]@/{59UcYuSu;fe87~23Ircr~P 7/؍YhvЕz4}op\ϬaE7ȑO>Ÿ! z:&N}]Cۙo z=r+m7_XM/KM?w7ߌ۪wo\wk]>q8|}qozj?8ƪ?B?ۓyRw|/}+\=򽙿?r2$wq|eB<ÿ3mx)ϸp|лeVVry|7+=rq5~ehGQ7x ~&}{kٮ52k\=}g(^0^g&t~x.+/a?8&9GSwNO8qnY?ydwD1IsLߠr//9L7QUsri~8:~x9XX_<ךV /x~*OƳjx,ϐb_9#9rS:. 痠W⋨7؎|/Ǭy=3p-o{9G܍8}/y7j_Y=svFLeev9?J^G^o:$In)8*~ɻB#/]]?V\{` <V<:#%> F|'sÈ[|!*I|}_yb~܈cg<4ؿ p9#|8TGOTOH&|> y`f|rۜ;~/|Ϥ_ h&A|Uٯ/@%Cg/¼e~Ѭats$Dʃmadg'3jC/'ό |~9q7T31os N+#ʫ #@x=gt~hMEm"2.IO\q;-o:|EzOc|gljQŏOn$ݥ?mohg2~ֻUx{TX+^ރ~LٟZPyOnocem׍v-z/C`f?n{or?;d {+_+ޛ<ǰ+yk6߱%ڟC.o`;Շa 6}̷39 ȋ̗ )qnrg'vAǴrH c}<9[ǡG(H^ v_`2?y+<7; roȼI3#/8߁k_'# 77Z~/|vo=|:|1h=><"1GO}A'8w0`وυ2,:tOt>.z/Ƈq$O(CqNA>/zۜ7 ϻ_gɛf?%96`gl'[Mڑ'a=xrϬޛ W9j]!q.Qck= k҅ɑgzs_yMP.-'{znW:4aW/+ufz|5D^='OwnWɾ]J{szqK8?CF>S8M~(u 'YG?&?Mp}ӓIvyF<Ӽ=eދCD=1 x =nGQZ 9xs!j;(re~P0?(ߠˋq5ujp~ly[E~\ǡ݃_3+>x[H_9zϓ^^zp>` sUG[NH0}/# |~?_|y[C77qafal&Ӏ'KC/>wM_/v9J9Oӏ_ǃRD[3ܸ _?? }kBr=}a쿄UfSq=0~+yhUρ`E\=!C`7gvN]:k&>'}dh4~nKz /ρOC__<_/]sJv=m>bM<+h'zAĩ&zπv4q>{3<az|BۛjfOVhscθo4ȇ/{kƛ \yx?g\'9{x8wxK|EM~$]Q?zQ24sѦto;g\2+g"(4\Œ9ivq\~ ž.INF}S>9ɐlG'`b=|Ê}Cԗe|P{>#G׍_x!?{^ϥJmo8Lz0>_?%3 _>cs@\"=t}Nx^z>;c`IϡE_rOBG`=ǎuSq>%mVȵ'Џ`ƍ| ׃z:<]0q4s63z7ZA_#G/#N񿴯v GAg9wUϨ*_>+=quG\ktd~6~p @OǢ>5qd}fN;lauꓢYS NͿWOgŽL|!??S|tC$ߡ7Bi=zRY!W{=K'A-Aו]Gf(g_jz/ezy$}ú8_;o~>|uyTOģ<"]{zD|>XMϠ ]飉Wk:|Syrɸb 9/zk₝#<z;cydzD~j-vC3^B=;Ϡzaxӊg~6_țSPoM)}YO#㛝tM+֣޷ OG~Ny:r_PϡW7Xs9}/oYzϋ pЕq7SmQF#Gb]Ct.a?rQ<#V7$Un- ;=8ytA7~r+qmސĽwtyhӏN|΁{?AG>_0-M' g[с SMػkKe<-;ݧgyXݠ^}ƾ{9~lkt1^ <9yCmGÎL=k2@楻$&(>Q_񷅎8_#vOs+y@6=X|tDC}y@ V #;o؟< wEjz)hK"u慶r+9AΉP{I2ԏ:8}]^u}O0\,ӉqF#9LnzRvwYTaCG %3H>JC9>B3.¯qף?*9G_g7.]z/G!xr^vsڡ,@mb |[>UTt|Q`b=v(O}!wXwgq.Qk!d= ~s>x7v4έ_r3}+g^YKbM =9ߑC>O CaVR߲C}'z5OUX "[ڕݟ{~nYUܺ c}"k붓rLoU/7: _@;?@󪙇tGIײ&rȻs-oGnkz8}F}}D{wK[^x_Ocbݟ \Qw6 v\R؟Ҿ[o 9<;G= vi^ }ֳfa[ ݃N覞߆  o^ǐ~:Sc}ַ?{џǓq!(υΰ;.6#Лw8v=*gǹ`]M~:yƟs:/^%qTM|FE|N~ni\_㜟2ob88i ;> t}O>GtJq&'^qcwDŽy'LW!SC9}e^m1t{>rsNӼx>>z?d|3|{!/k^BHyBW++4.R}ot_;P.괓~>>>f='A֥/y1.@.V~n4tDc#g^t/W0B/DwUO uyğjg?˷]{as.8;.?՛3ڗښԎ[nw|ա0gIC/5HMꑾ=|^ǰOpJ=_Lku5`ӛ䛪r'e+o)tºbPy?Eza/E7+|3zt::X8eC }'kA7X~;|8e']%] ~{p|?o<__=-M\iyw8xGaH#bg|K8T8Ca{íh/~E ?5p>O,/G,{_9!#W9.Q?GU.}r!Ow8p糮Cׁ@'G7P}z}=O}ubgn:| Ɨ3t柎8Fo :?y34sصb}]nvom^? {5ݪoٞ}s|Yqwg<S M/1hM&"kO?+ΉyIo}ۜwg/҃x ~y [~n㿮ZzH6AԷ_ٗZr\(_ۑǍ:}a2;tʥ?K!*7hgѮ֬w"/isPiOYS%=^>kz[Y3ғxe|]I?2~lxKk_iWU1;3z2Qv_E.N7onGi?c~CDv^wB/I>?;|:~S﯁g7DN?S^K;2}qsk3F?<9a Q~ ~R?shE 3:ȼ6)oI }G_9[3E FƑRmϬm{1?|܊"K?o]tF#@|G2/ g&r5ڇx=8=z՞1ٗV{+}wF|2L&U=&Ӯx+@? Eiȸy!|.~r!ϓZυWzσNO/ZhVh?x^*yk%͊ʃԃxrzo9#B/@ߙo y4ڃg{_ pɡ6?O^rp;c#TmCoO>xg7O~N~uAy#8e*;yj=?7ONƇF=ნ =^'t"< }.93z^wy'hth< W p΢O,EI~ ~|y?Z{M=82CN"QH_CAzXr?ina~iU]|/#g)ͬr> /)!v]Ѿ_c~9𾡳:>+/7 %iFE7W1'z$Dgƿyg+/Y?#|27#WЏBxlxolD~x<mm}.IW.?r8qyNiy[ ߡ_I.¹ o^aׁ'ͽ>_ _YCA;@=ϩa/ yGL|%s*='O~PByNB͸qv5kW}Fyް~W;uyhxk$S?5=FAMƫٟym86]s=q]|f^WG ng;)o(߅3|9M73kbw?]_s?P /'59?Ϯ5kWh<#0C0,_>?n.o: =xM~y-72~?[?(tЯO9w{rzQ.1vnr{f=z=A GCzuNzެ7G]gt㧽U0̬S-zao86`b_o~~M߫|ҩ]nÞnzQ}' n͹}7 3oG.j7 `b*_!7u/X'd`}vo# = KaOVF۩|S#A;q>/}~U+`gF7717*w} :^Aϣx7lo? }RkG7U;k׃%~qus8`d|Aڸ܃COl|¾>.瀠/ΫAc^χƹnN7ot͌^?}(B|%-zu ],o-W$, )?(ڰϥ`saWن>t?Aƫ rh9̇þ}yD;w*="[4qp mIc}e6?P/zG*wPy/2߁7M|#_ued:9{S.C3!rWGd8= >N7d?Uq!s(q?:I^6~Ё:O|U5~C>n'|$s粉#+-rf'ntr*0:f<Ϯr ֜[YV9BwOQCo͹=$y⸞_La%>imhWНqeqٯc?P ='n˃Wφ'/e<sWpħ;CAxr΃Rۇu/F7k? 瀙#x}<_'xC.M@oqw*]}f7@$[Q9xf񏿌]co]v8=G@1ncrYi7keyf>I|1L_ v?>r?dz!爑[aOx9'=x 퇞gj;nsh)i;9387w˛Sl=p7Cy/</ć\;31k|3ɯkxvqc|oWV߫\oA+H{|%LOy!y竚| ? |Vxĕ_[e>K:~ID>9v_}DƉ$eY{]\h7 j/㌼_5^vh֖eg{? W&~w{#o$//s_ >-]_.W8/v:vLq"^Om.o^HD>&{>o/7y];o?g/ >";~\CA{ўC|/!jVb4bo?C? r7DgC voЙo1zM_d>2~rȃ=A7hJ_<uxܨ6}}]zH3 t$wcz"8BNLQU>[<O y#rǣd;Z13/S1S@N8cyEw7)S3Tz5Dd[}8"''s!Unu<z_uʃ/Q<+6ߥ<ǺI7'?2w=~aC ?E揪xk#zc݋n|!IQ?t}~z#nMfWpt#N@'y9M6qЧЗГjC"?MG>3ik |^84;<^v={H㔸7>k|h:<45P=<_ݧ K~ ߘQ/>g-emIWz69YWEտiy&zlOǺr8/vԈs1-Q zNs]{0G^x_7/G7G>^yNxz~ 9tAxyڡkgzC_eI|&wU?j`wT9-c9#gvO<<[g{~:<}pZށ?mo8p>쟠r1}\ϳs_:<}y>陪[N!g^{z>z$.TfB)z_;@^1 Ag=u/<+zvr:pt3%29+7`}sٱ^®r Y7tRdy~xk|(vAa_fEpMN;/"wr.5 "⦱!Gr:SYOYw4'mi\v20Ǖ:нink}4wG9ȿna'p|5هzwG8uh?8×L؇q5mz=_sϣ]e|Е=8o2lo yXkaϤn?&r?te9=~7v8o0漞>nW~382~ws~Ѡkґt>ZlFz{bE_K x{8!"p{ע, ܄xCۼ<~E;'89/ S(pd\l#joNaMuY_#BͺvJt)ucX B\GA?G ?&]t8eā\~r+߯t8vp~0 '/~ߑI$_xݷ}!XϺv*xN4km!)G!kowU}z׼pƟ*>l]WC>[Wa_D?|Nmv#W~T}g=~2N]8ώ_1T~݆7Gız [z{]SG&Fݷ>G~\ }QϖCΩvD{ezz: 4/MǗ <Jy0O &*}X.En/t}z#3<聡)N}l~R8p61#?w|~S!˙3OZ}o't^!x'߲Y }bWy:\p|Y˗z y k]+[]9$ !X\Na]C˹[~euʾ nн?jv0VA'!F+#_8װ}z㍠ETM}ܹSmg!/'a_?mT } ;gjGA > zD"r\@9>Ioty>mt*nzAC!S=ڡI?;ثGվ cu8h}m8߉=tYQ2o*G؏r}NlsM_wU] iG}B Gg񣾻Z~f >wq|}|OݠNɍ 6K;/)~š GoAuoS9tܺ]^K-ty ͔M+ (|þ%!؋]>1R(}@oUr(I9 }aݠ:נ'}c87"%Ŏ `%Ak^Ozϩt"w>8A'- )cuc؏}>z~y$m?wqCD/O}sQ{M!:|]L9?kuCY\)[ v5C\weA S!zprgwuW7tB>>돕wVX~WSOQq^F? N:ȳr'SY^BBo~\fs8s+FO{rjClXoョ=B:|8n;]Kye{/y[Ƭ#*_o؉9"_^Ec@.!GΠ^ta'_e Y ??"yz{ `ǟIWdŹ>>WN#o t\[W Jta_$oճz۵>FQ6|\|OO+}"E9=9 {,bo( 9vpO3v> >_O ^%"SZO~]o lǼb?09.)q>߆*|(>} x>+=sP9lxx~N=_=L:~|?x#2]ab^ߘ>>o@/;—'z6d~Xsܟاx49=otH9HM8ǹIˀ/xN>'~8u71o<^Yߜ=H ƙsxw#߉yrq9Ӈ9~s{}Ggi|Rg?1/O_O<<x>ݱz;S~.Q]k∂ώ?N}=P?`gvp3腶Gb{=~mH[mU˸i|\vG[7of/|6^ǜq__>尿qn{/:>]t>ƅ_۵~xI8O韌:n'S^_ݮ80G4_ѭW;^5ϓ_iO]tEӏ紇߫k# nAEY<+Ǹ_f;8߃7ܗNڟR?/|>WkL;"g?aܸߌ3x<<_g'_s;/cߋy`~?G;:?oq5o)xƁq>gnygYoBm:E^,W4^B+zN.: } >HXW`Wz?t?:%Mkg7:/^1~A Unٞ:ux\A!?(2.~MB_ȓC^uy_șO'tGoƛwB/\JﰯGہH9?[CS;GREȟF?o AOM_Ƴ/is=kyWaI_nwc_GJc~lֹ?K;<6<~]E>Î 3/st|?O7Ey?tO}+=nzSyVۮvamoMM꡽{:nY}__~ay>c ~'9 c#69or^@%v='{Q̿Kyl_#"oOb*O <FO-7 }</Η+޷X+%􌾷ɺ3Ol7Ci?sߛpy?uyx~>ZSޣ/:|=<Ϝ~yҏUv>C[YQnxKgh3胜[y>vErçQ:={y5=q)sh} qWD吇s>`ݾ }ƃ@]!>sO> 3>}Wڗ,?۬JN'_xm:ݪg?z?C~z[n:| Ǘ:}Yx1.F12cW8be]O4q p5W.OŸw^ogM8`xۈ_:##cݳ؁x_`X5.p}sߜK>nC:xH><'&qӅZd|xKx?!N Y:}I'o*u|1P2ɚ};8<-0zߤȏCp}Vz2]ڭ8ak3O{Ǚ|ߘrG=<CAsE;H;oI}7޺|4v3۵~qsH ?ȸ|z|Xvx2luo3.%KwO?ob~X_A~z˃JO͹۹ć?[DP1+uܸ;SnU˺'{Uڜ[uKkMoUG,h<9ʣ_=y.^7#Nгȫ{쿋Н<@%>vTgwsW^zݬ^T;KHŋЧ3~(ׂn wNiG-V|g=xEB2z s|弈1A{;iOg~8Oƅzq"ƍ<)>Wy#y!#Us5^vج~y<~!y_hzY@a;?= F :xjw_(`'xЍܛ_)yLro}w)sA|?vyBt/<څ Utm'.P~`mEnAss!32~SXs2>3Ϧni\+d4k+|?3_WPk ?><k2Nۼ!qqV|1~=<:3oB>F>'=v8e>G2AgO|f^NwgÏ+C-/s<΃Y.%:<ҷnK}GzE9Bz>3Π߭j#rn+'tpa 6r83~B:t8r}}bp|FutAaS{Y_n2_~_xt>z~]t8 Au?z^˟N7~wkMݱ_wqR?6K5~wkэxJ]o!?F*7Bw|>b=zf;|8s՟n_A?S㳱޹\Ϻv:vf=릧ۡA?V{5qݨgt81sؑrzn}o:<-A⻿[sԃA Ta|@}_O34݀玏ʺ%+0=@oy.z=?Up~:@<(݌{ݏ 3dFGs O3A)|E~WCbr#7 xN<Zς^V+^;~v\z}aGH®y:paw*t2wͺvZt<͟~/ &^YÙu;}>%_}e_'ϭϬǡ_n|p|5rr5Xׄyb_S=.6gгkf}s fA9s!a@O9~TCO-Ďzt8w~ 9I]ROxN7d2j;e'3^ԟ+|~np7A} x, Ǘ!ȝA3}}Aˋ)кwOtج{0<#|7_ςxw؝nK8t@=/_!7+{/=z%yTp0wqzAbOѠ`_t8뒳G] :t]a9aꅾO߬ǡ_~؇? ˥jε!'zLU;z`w@"/KY3 t 6;<_?qg &ɺ&Φ7 tuUܠ7A z&ހA?~.\xf=.vLAgzߐa_n.~6޻Uz\:t#tGNHd9DO?G>edgxp8.7qgҍ<3c} v8g avT:n/ߑS!H׻tf83_GpC2^1yR}>qÓKeze9p9s˞e\p9sf=.vLa/nloa/~șg<;|&dhr|4/9kBn4qga/?{^LgDZ׃sIڥ7:t8?4ȏ<^~c9? >f=vRt>% qt]^{qb3 r+z1uP<[I÷n_F˸r =;z&>-A'Ruf;|%a&^u 'o=%C>u;ۊV+sx614>/ Ǘc7?2O?';ԇvi/t5σDW^}zʹ8m &rz`rk/};gݼZ-t} > thĻu;fi8|<9N94l"XiQzoa併+st v8ǰ }t9^~Fdu]t8+|C 1]μb5w@ۏ'屻z\֛tZsM72~WN[\u_Oq;#S/5OEszܨh8f=vRtxzOi5QS<طMs3nc6iq:{r}`]C 'c1SzC/uz?^kۙ}4]v{Zsm?n86:x]uxye> }}@ܧʷu3n"GO砻s]tx;;}}'[erhi\t:#u9 ;=u h:bz缢's;|!tD '?G>ΖtE7=peytְ+l?>~w@ۻ2? ϑ˰] 4sp|Mlwy7Bΰn9j5ص;t{_ym'gAWBO yD~\ZBO ~fӰJ=;z?TFwע4_ A/y6WMUwݤ3FΠ]޽q=wdۥڟA@G#nNcu;}Ё}nub tF}~a {~ 7X5L+ϼ> t{rϬaE7s4fҫOch^Jy\Ϭa O^s1XPZ_w _>+?t(rjM7Z|?c݂]ϬaE7Gß gŠ 9t~sʱY_n[oowA=Onolx:.ts_t?)iUSN7?|syyrXMg '8gƺ˓ɋ; )o6]ޏϹGoш<7r÷6Ћn nžuv@m.W> h?bF.N7=q+]`/c_MwK;5J_t80L :Bc߇6B^P߿-^n=Z2z? q;!WG?wUO=/AolZu6~Zȩ+7[c77?<8u>v)i'`݂b4̺vZt\], Ǘ?S9g衞 κv d̼<=-E=@!̺vZtúf#-o:TM5vc'}qy֫зG- ߭E>Ζ:X?x#syneCӟw9C{f߆}|ȑ3%C]?p"r˺ qns)OǡI'Wȸc'ĵA?@\59[? Zs Oďs 设' g?VoaϤ rgǗ=kǜ_Z??~jȑոG/C>EYKH/ȃ;6*gα9t}o9?_ aU.4=/N7r:;cs˲{9Ư~vWϑG_=tiCz_duQ.w:|92rˮ}a7J7{g8,OcO;ACw@N= y ?i+m]O>܉O_C'z>}ۣ;| o'5ؿ:; V]÷NtY`?s<?;tC`G ozu:MBgoMusMo16ֻv[ fݯ;|tuK se:|07e|(C:ӲGϺ_vGړ3'v;w[H~[-ܴ[FX 8>h;?~? G+)E( uAhc[krrn9O_PӊjH?M=ßaOG{t]/n?5ߧ?Yn,(=byc׻h_BWJ8~ڬsτt9> 7Ef<(_៶?.6D7a/TOy{߱#_LNe'.Z'㟉\~Eޏt>OZr돻[j<&`}s96@?0񹞺/ۡhס]gfr^\(Q>~m̏x:ҭ{3^@3Y z㴇go>-{Ze\Z9cWпRN!o?ҥv:߳ҭ{-nr_ Ԇ vg!=;ov(Zpŵl,ϋ"?X=ʫۡh b9pW.{~lCķypSt~FWo3~i?pzrj|˞Vtqy NʗṠN!MݾN-}g' N.~y]Av_kE8gr8mg(Oؙ/8:Qٟ!}pH;o#ˠ/_g̛npPP`׺|X翫|NGsSrS#O39ȉZe9Gzە_nX_oo+|osۈgE5.^!G#:ϳSW3QX_A.WDwnok~St~_qȡqMR#pUҊj{1xvZi g >ڧVt0n.|?w~kƏǮѢo+C3'4o-N9}O{p)u,:`}}~29{-O:7}WK?!o+7w~gqX$_ܡ:߳cj<쟦g)?._J?+:v.0A-b?|=Nl^ )hOnE79|{o̓V"pbJnv)Zgq ௙43o87W")zq3L~ݺ&|rg_]AQ-Zj>F^0n[Co'g^@OZ<.E,n$/ך;NǢҁSK/nE7 ?3| >;8R<C.Auv)Zgqa˯_)'~eoG ݭCQ3^A?=3^'x+Tcsʌˁ, ~·\.Z8R9R7q5 _{b ۥhџV?{px'n̋Y]y/pyJ?+:b6SRzf5U\sL<yzYڱs@]6v;-Zɸ3 |0~L>_Tx}- gs >Z;_ OsA|v(Zp ιn"!,<x~G/д3#\σ;胃M9y.mq'Doޖq#==-E"܈O-7uț<:,sHs7w(fsrtGw! 5>Ыl/u7# v+/?jܠg1g|o: ?Ԙ`wZPP֐GŃhC>2^'ڊ=pϟsyq8 96]sN:v-aFGډ߈[\?G_އz^Qtgptk89~FKJPǟY.d ױrCpq׸͸_n_:a_byzyނ`r]qaXa'Y_tCo?Ͽx=}%ܤ?vaUлR97K;McL=绢Cns-f~Ozƾit[QۛoL0]95ϲW G ;gSt~'[Y])c3=s mRϙg`W><v]O .ZPðuy y>vakew.:v kReܵM@GO? {zZƱε8q: ƮwѢ7s85v,n{ъ/\ N`h7#wǰE~l-&tzZ!hu7kr 3EOWr vEjyq8Wgȣv狾;E351|=C2y.ǹoQc)<3@`_c~5X [x}-kׄ  ~hgc=ȥ<_tpSt\>رG禮wpSt |#п> @cC( ?j{azI?8tѕPk}4y~ ϑps9C[;|ϢsHm qk^wgOȭO#_ge(:z?kؙ5ypOu_GCK{kv(Z?g|۵7ȍa3;n{EYaeիr8|6=J/Cj >_ 4@-?ku'Y? !Ѵ OѓK'=㰁 Q~{DZW[ z/.68p^`-Vphe݇y4_=bɥֻ)2In:AUSr~3=kc_=r#3Zm/' \c98 tkV 7EO.n% @7CT<'vFOGq+Z2ɓ7_f?v}+?v;B鯖_gp|$/8tq/~Vt|榞t4:{ڇz[ů)z_.|űe>i?4 ߥj>ף ^?~g=Њk[P ?g۝>F$ξc׻h_0y|~?id\1!_ϙ7E:N!G f9t~jò _j1OِBb=zJRC.|;|O[N<չ;utykE.D[^lEj? yn\P].z(C ?;篃3-wyrSˉ<_=)`4k|xa]J6 7EN8= XD |ƮѢo5crZ&uct BHs?5rGxE^ЧMۑhgOċE[p`ޟ2>;G=;g'Ϝ3Z): /eGi~o  e.:t/xn?E[k~ҥr'GKj~G.z x.}l!9; %g5^i}/"o0};վG[N`j8YN~ՠtؗѻb]#K=Atkɼ%Ͻ,5ϱSsTth7y }- b'P>׭En.|u=?['=\M);[9yf'?2ntƏ!eszj̛Ex[}-Gir}I?jv(Zp~6 1{19yC 'ύE^oyLK;GnC {Z١yn'|kƹk i/Guna9[CK?'vcXAޠDZO:eG+:&E#ϲ Oŵ):GԸ2PW#_&l̇gCPk9u\QzC] ʾn?_ߪyM9Cs3-?tM|uG&i _3v'#Ut3{p~O-5i?9z }_sGY5vAg| ~~+ .Vt蠟q.t||u-9]Ln!M.L㴜X/ySי$Mѹ~ O(f AS|~Z'~5~hK2= =?~sH=`]&b';l:p~p=7~#j>Om[C 5l4 ۡh|& fEݏ׻qse+9TtBC3g\"np6v;-Zac?Ð |6[w.E<ۡh rbE= <}r˙#%ϗn5?3Ht3u|;_vsHy~5_B1osA/ySt]k;g9'](nE_ 7>Oaf/9Z)J<2*>G9֫y~-Nsّ7?-9)Ϡ+ʵ[=;|Vԋ!}pHbׂ7B.`o_șO"=vfxYt30nл|%#g }z[ E 5#? z8WÙpe\>~J?ڝw;>L;1NWs uަ}-0\O \e|6Q;v;-ZIyYgQ<" q w><}-|Ԏ47#'2{ <{E/J?Cz~33@~m7PthG |ڞ ȓbD>i>^# vbXTtE\CIE|D,?n?w%vCΙ7 7En.+|a An|ev?̕؛ Ǟ7s sq!? a>L; q} et}>v;-ZA7 ^~&!O|5~!4sv(Zp繸#W/y9t-Af8En$_l;yނO@+Ώm%nE_/ G~ 7G'u_qoS~ Cj;pdW{Xג]܀}i GcCѢCr;Ǐbא9ȭokPsGƧwv:o\4>ßx'~kipicCѢy r\q`sr ܡorpSQ=?v-9cP롿!0y~Tt~?96_?7= 8}/Zp_ZyrqBz;(#/ZpУ zτ| H9TȭK%o/x#iϹñ}OӚ_j>f/~} rI$}a֠mGxE Sbqqgٞ^G)ɟ|t9aO >_Ni-FY3|ιء:ιz&8|9T(:7Уz0پqӿܝ |~.:t ?3=s7b^s3ߋuэxb}T]E7N ?\(G(= [Ͽ}=E^g>F? ?KO#N9x~y?{z_zNk3lM:v;-Zckb]1/8X->8WʎVt֭uI)2;紋1!4yMG 7Ep!;U|orM9>oc8y(ʼ;4zq3y>aOcv(Zpa>>L=<'x@wK:e'փZP.&zǥ}t@Î< <÷zsD- ћk?K>r}ѷJ?u=J|   |o yحașVt?ңQ5)ߺ5[AʎVQ=r"E.!WXy}!CUZ^|I]E7.Jއ^)^r.nͽo7/к;6vEAb]𹮱xnmegEO}pH7[,9!6gٴOj'hnE_v++ 6|b5v;-Za^G;8¾똖#؝ XG>7v;-Z~_ ͐K끟? ?҃WwSt۰.-σ~p|Hq)}-~Ɖ'^Y7o/7u>nJ3 Ư;4k?g/n\?8N}BYy?_wW#}-z88bS<D_˸srOV):?g˼ FKݢҁ_\S>/]+?; |OHxgŸx^):[n9/-qf9灢!V 7EZ/"9?}wȑ#|coAۣhW a;ޛ BɋA?Q?@RۣhW +^ˠWگwհC)\~6E<ν0'w0\!_~TE 53Ǟa}5\~?mn>xCmςC }u2i7WCR):?d,o#1Z`oFТE#&CXF^>A?k6B*Q?П0'rgGSd)YɛsHô} 0~3_jaa3DK[?zAOCo8̯*.G9w 4񛰗489||^(^E炦=p]iW[oqiw~q^#qG.zѯپ>XAC_S龞ɗY?Jq?huA9[ٝR/uމ\np5f)y??Э~g\$-nure.Pt~?r'ar RBΰOp _:\ ~.; ⇆|gyr9Ez?s|+9]}$lЯ':: my8_gHcGѢB﹟  _Ό<`ܰΓripSt.+/xqzt?吞J0o-:G!(3`GÏyq6?(I5):aGx}SrB鍇O|Nr*_ֺMkhWXA_} L'! ,*}Ņ.:G~4n:͟zhڡ/Y?3iˡwQ[Y 9GGN!$Ʈ_Ѣo7't2x^v'Z/þn +!_;xž m-Vpv4_rZ\mq4v}+A? ;v>xypg;Iiɧowoy_}p.,Z$2n@[GÎ~+'2?4v7@Hz%s>viџW[3t10}أϦɥޟ6L~_׀O~SYѓO8oz(rkY/=;~cVr\ɥг'_mRSZoZ;=[̸_̃6Zuo=`j<_*/>/ψc׊`j!L~o.8Nd]E nzgB!hة>ϖ)zr). E]CWB4 GoS$.-񟱣y_sn?vRR@&2~!7ܰy=_'ЌA/pSc:` ܤ'=r?7E' (z؂#BCf|jEngsp9 j}:Ij?|k.ؿvŏFu?󮕞Vt&:=Z٤3 [AέnIk~y|y}mcCѢCҟ?lUtvi@>Sٟ}Pkf8Yi}yJ+h9~q5_ 乸7us"_f}'On7EZ?oLc?Y}韖QcO:g{AwC>wß-y='TvsH7q8˺J3ؗ_X?w/}g\e\[p3xڜy*Z݀uNй>JܵoM^EUW<&?@!wtz-Vq@ Mnn|u߀ҥס])=4lQ( , Ϧ;@=?Aޤ_򆸸';_zpSS=~kzYƵŏ'7녛'vqr'BA鰫aQ)zrdҫpNQ~[gI;5z:5)zp0oAGrKaG?-Z߂!I?3 _`z-Z߂oiF\_ 9ļk"8EOg E#_w[-Zq9|%߰6L~z祘,_j~SЌDAǭsn?<{jojF ? gκxPq~3(@9o -/䃜Y|+>g9|3Ǻ $qe]E_3a_&5i97E琦?XK7#g3_bo85Y*nM9)_3~>v9p }}#pog1_8ȟpy7gzv(Zp̟v iaNsb~6-JWC8P?kM2>OMG0?T|ۢsH557u u~ĵZҭ|1>qر7zAc۰#,*we(:~/OF{׃~䎟׾sL;c#g5s' (]Z<RO=v;-:tjt]ksvɝutM~uewruNkNٿ}9Ao^}iY E7ÎoCY? +Hf?j3&*S:҃u 'p ?ҢE:N vn|a7xKhGȥXE" K!гXsnY~6~igz-p<_߀'!~I#gXG.б]/ *Q?fuk7iGϕ7EZ/|XBޜ.m48Mؑjd{p0NyZ ڝ'~ -l>k%o/5ßWE}__E˰<0m =s=A/7\/Vt~ N7鮴|OZ;/Jy ϰNz5wXxkc׻h_.gw}@}Zbɛ~^𳾿𫾯v OEO,n!~?s< 荸q \ڝs{99هOYjq8y8EO2<{B[sy /N]E n229}ucC|]9͓Ʈ_Ѣo7%>meFN yT'z/?iyځҳ ԺNѓKgކ}bAgUIؑr oGkc>|Ǯ_ѢV {aoj%(z?_'v4l0? ;(a݆~Eܰ}lS|0oap+AXC'C\A[gsd;[7K_+z*,ȍ<y|!N'x ?Zq8/b=tNO ? ۉ-{A#7I5A.<>| 9\29y#=r)ss@=\wupjr>qLb/?C>yq܋=y~r9(ven\yp`WC):4zF06-xq/G:]9$aA/c?ې/w㤿'AMK(zh_z_ ;P>`v)ZgquM ~?Կ˾C w|/rFəǟ|hpwt}[z!nI:?pGx$ҾWI]ڕV_4D|ݢEO"/CzW9c׫hѷO7q۟MׁƮWѢo7 {]f\o;G%o|7̇_}'ҿ~X.vi.VRg(=wZqՋ`j= 0 ^?)w<]E*nXs~bSqk :=St!yg8ٿ \'.7{~?5#ף!zp|΢'|Au?eg}y q+.3a#{.Z&gi]|a]x]t> ܀,z -<'ל~lgO@ޗ3<\y_v6|[S,.Xa= _s^aiEZ/[F3AӼD|8]O;yr~ʟap)zr ` p |jҧ(rhS+@9Ӡ7c ` }uP}~wv(Zp] hպТo#v[;Pk;[o˼XޖjZQumn}k?7v;-Z0~$go|Z= 6v;-Za /:MH<\hq7EncV= % rEgj~ڃߜȋ`WK}6A?kۣhW f+~^c'C7m cCѢ- zVՃH~kEz~<$kwŠq^3ȗ Z):tkn/x] zۊe<)C?@ח~Vtiw3rdq8_niN@(G+zL뉟xa]'iS%pxPc׻h_G7|>A4#s< jldz׬P-ޏ} E#E5+bC<5⥱7ۃI>3?S> rkNm?~_岧_j?goßY6e=7ZTLOނpc=@oKIqHERۅSnaƎvyJ{ϊ?`2Wyz{L֯Xόsg !\K=94/?8?Ł;>CEڮ<b{ғ=ӐS%wj<|VNx?GCe:9أ_#H,9St]|ɾO依mSد>86bPz tz-: л {zjs8uR!n_x*z倏yCz͓ƮWѢo7w*\if\,PטOp[yxANalEO>|&qG7 =~8%ov結/ O't?򼷱Uۤ֯0'FۯՄLTq ?;5/*mw>8ֹ޿zQ̋G(*ZmPcz'뚟|AI=`GMw/ɵiAxqq*Z~ŏ1@oLi{UKQCד}Wy ?Q8MݿU):/ |#{z|+;xxGj_`=D!ϰ3'Z~ 't&ʕEI\(yStOsSOKz٥'xVEz=jWc@1'݆S9trӊ?yʟdcq.EgxM?v}# 󴇡g1 ~Sqz-psgϒ7Xt9ܹ}mNE"|K[ϱO3pNGuƏ.Z|~" n w۰+`_?KE"܀ a3a'+V-:m$C\M@{ᗳ?.Z q)O`q8Og#r_pSS#@_[e>JOWaW vۣhWMdr ސC PrP/v1p̃|O,pr6_0_Y):-җGrr6bރEnp.; P-~8!C^qNz{-&0؝;E}C.t&v݀kuܛ]s%7pn8ɥ unX߼yt=tz3espHaAvIW[ 0Ơ_g/uNϟ?ϋ.<ɥϧ_ZR7ښX\ <-VsMWzӵ "N+Zm.Mkzͧ~,Ʈ_Ѣo7`Ox5@uP ȭUSdv2Năs]+zK?8|~DZ9EO0%> >LvGoj-Vp1[7_>ſ&_RAO&kEwti+U{/ ?"}ǔ>j߃{?{ؖgV{ۢ=(o ߪ<"!~{4o-}mO=ε]ol<~iS?viVۖ9h+O.ys=#VҌ [\ߊ?^ ?/om| _+_(_|(~Ǹj7kIp;76_wj;YE?jwW\q;QΛ؁t _ȍ'L ,xCp!B|b|kKO9ğlh\z(8k56_wj.yC_g{އ_ǡ!On#'OԵ4[~MWc|g.>g?Wz/z45`=B}k9vfܥ_ȃ'{~ ;WOoM |2  n5_0^)2~R;I/rx!{5D7o ݒC_C J"on[Я?/G+'}~:lB>2.Sz>ow_W\?Ux~y~ [ycnWcM8E ONh\yvz'}|׶'#qxK/|swI׼XN-{J?/|G|.}\=ݸ/1;8_*yJ<_g`]Q?bFH^u~ Gk^~s}|ζw~ю?GA.?ˌ[w:~}3,R|>ߌy㭿$=G>7NUwa;>'YEzh_G8T_;m~փi/]<ϏgѷKooWx G>A^_7!~\ 9ҍ |#W¿%iE%A_'0kw ~?;i3puvx~47m;f;9дy=~M1>:/ؕVEckkI۟EΑ~_܎׾%?{yrבӓ͓v<5jw {_YA|V-o,\^r&6CSA1u/t5|-|~vGQ/"J|AsA:NuIMzκ:7n/;XtSYb9)OQK`E}{OC폿v&-Ԕίsf)v#oX_Xϫ`]>]!r9VCY?凟|z /6w'X(?<⏊w7많rBJ}h\| ߣ/}~cy_0/mN[o>_/c]:{EOEo((#*')!/XQ6+pK_7?~]*^cQzS-[o *}LcwaGwb`>wCwiG{W.z#>>jgb~Oemb篰|yN~ؿ÷ޒ wCo ?";3!E+GJ둯O|XO47~79:lßⓐݺ&>D:}6w|O9d?yԒ8Oiyl~zW*EwuZގǖ7)C/92=tڸ^+߁K6߸E=hӕEU-6QkP|f}% wSNn<5۟\ݮEO6G-N_}Eހ^o<M9OCnݮEO6~gKt'bz+=r|||>zvxwnX`l%{c ~acEכz8e7]|泧ofkq4v{}7ϱò]W?3˺f/?ǥ`]>$_vfx,nPD<.] Ak}{{?rhѷ.wDvyCN(ȋR(yǏ[{A-Vqf%sVm#e^ܸkP};F;Ծ"= q'`8{C5ȇqkh~{7o~y_ͨ[,7'|kQE|A?o)4#hqm ty"aߢA/$O֙;z[yߗ&|1yua&_y᷊}8G?qCvI9nz|}s O|8 .|)^KKKYslON yqU:n'ߋ/MOs-'E3/U/ ᗊ|c2/ߒOߝ&H9v}3?N87$KOHeIGyZ=-(7p 3Ov}Syc>P{^w[6¯~~/=ރGpr|#HOiJ_FyRBQ/h_i0#=%~ .oXێ&GK^?l7?KgJo|rfKN.xu(9{&>g?Iڍyja6wsq~߉ +qfvqmNߋCP7Ō?}Jf{( /ĉ敤FQo|§9q>/|:=9Ϯ+1!!U#سҏM0g=ryQ3dYΊ==_1ڑh8ii^ sRzX_m2nKu6/G?mˍǙHt؝_:;*nSyS>~qM_z7Um:KBAc(hƝV+?"cyІ ߭onDZnqgqq9˸ ~n&x'׫DOy^o=CP?ϴ sh 7LԛHkq~G|+b;>+o8^xFO00f~/'7 mJǺ5H|L7қutE=]n3d> h/I/%yIc)RSL+ 7 >-'b^(1ur׃M?W~Z!8\Oԋ;o(rx }z|Cʟςqޥ8As~o=ɶ~?ޭS=9r9zQy~}pDћryȇy M?Du]rマ# ]Nعhǐ;xWQ}5MO~?b^kad~݌_w87iMo;7uGv6)p]sާW%Ol7cVX-=>Л[>Hmk9|_\yQbN\wzTBި} n~=Ro> ^z+qÜ0~V#gz-|swuBciă0Nv/rU^ۙʇAgFb7:{Oa\gNץ|q:kݼRy䟴.Յqz? m9y rfIu=uGv\ /4e\XQwWz&']\17mԦs?n/pyǍr J"g8tyWz_?'mZPw _8ݵsC?EgM|dP._֧rt8>PҏKxc<%GGw^3DgQ)]vοy.sssfw/Wxޙ3kpţ~wR7ݖ3ηS{?f;lc=~^x̣?p%Myq}]"$[g"!}s˸~}p>>#nMWPxig| ~]oQ{vizp6??=Q=tJY¾#̐k.~FX.EݠPh?OGk\v@d*7f3xȇec"7X^촗A[G{]u>t3t}ϫzod7yc1[<~g|ix9?ɺ y똔u=Gn|Łav_.=m'pS7<,/2޳~Kֱ:9;TwA֗#ugxF vOzoUO;=Qƃ$Qcq޺׈gȐS%# /z _#'.B|rmG^>og<2Ukc랾zڦ\/z|0~Hq\~ֳ'!7U{#qm@|o ?A阏!XwAބ?!f?w=ߴͷ]lP⇹'Psxئ3*_>ŸyyBq{ʳ|߰cu#8:뭶o e/;0!w?gRx%pc??a߉dzg?qa{\'t'vl~(j4tq#{Z>8H-8۾|_dtȵ;_Xb=1zqQ7j=+xgE7jGGx9rbh={?qIz y~Cqȩ{ˑDNݎm_l>qГH3׎soy83I}|w~[jsG~(8=ܳ-R^7}yۯc+Ook%_>rQNy.g[D*L]<'˿Gg?GuQ~SnQr^pt:?s_P΃~q^2>_/[urg(}yvLq ']j˸^yC:S_#q^hKEu/[ߴ:9n1j\xþlt}?m_|kʇrğR~.\۰=Li\*{ګQoE<|\duOX?_|+_ -"6/~_=% i~qY'd{~p.~z/8MOmV{ݜq&OnS7~L`9A xr y.!=q}9^qt?Ur7qKw8 4rh{]hq XQ'$S'¸GzuGί}Ugy |͸ _U?o*r 9I .b>O3 $pC9"7"nw"~qv\w7]!G=WJ~*9>чǞ8n7}xL'~*g-_LS"9iܡ#}ٝ]o=\4GCˎ5qmO]+8R?۞>qMm=__vOI3nϷl i?h\w5x^;}w+h;hwKzg_^'=~ފWGX3o3^ylw뎤|[jʏ[ܘ¾}s5n;=]_ӝ?vo]- ,y$q^Da];`ק|WG|:۱CgWKwN< =xZO9k邿='埮7?Cܞ#>wʛ2Q?(>~ }_|OgR}cݸ3#Gѣi[֝G{Os/ǃOCM_+;ö)xQ'Jz8M{<{; = >v vCOst(p66_wJ{g.|v'ŧy.c|?R:(<~m !fܟz:kWg_״E'srݽ;?mt:ƹZtr1q}?u W~Z-EMY'EN0>nŏ玜d9ŏai^w>;#FC3u8T|LE_qq.͹SK_k[z>b\g]q|M;YQ[c}efhƟAsg\0ӽ' q~ȥ뢛?LZ,}O8߱"Ĉg񧠒ϒ) _qGZ~?'[ϗ/n=Nosy6~o[qb';|hI}wTݩ %t4G"?haG(g_Xx_D<CX?8WS젟M>'@쾞?Oz˹]GҟKȵOGK5g̏z: 뿴U'~֝ڮyz" ?c~ 価igh~Ж3qrtg/q .Kuq`Ɲ:;Os_~e7 ?|zԾ?c!tt`h~ȷ!~ݺ*;ܧ-=ɣ.Ail~(j7?UC?^>&&~ݹh|qdh,Kf|iE~8cBukwD{˸\9w H~AD_>/+ʳ ({x3-E,kQoݞwy+(G3I{89I9t*ʃO `\l"ϛ ?ϙr9?_n"^.^ӿynkOa{'h3 st׳%cPqGq&=lq2?ȇ33ĸx<_Lz#h?ϛ?ns=|,9/|qY. ?\gQQ}F{g}s vz?i_82._|>ch8wmcg;tk]_q{>#b/4i4I<goFbO'^Ͷ[~!H5k>7{8O7!8֧<)?z7彮_:؟|4_[c= ]wwh/5Orr>GEG3wA?sρո`Bws=H<I9_]8-唋us~oHq|3s@oz _B|C~Ҟ y7c㤯yO2-8Gԟue8yq]ƣ:r>K}?q~̟'{|+o S~+m?;_9QA=KrN"ћޜ^~.R\3ь-rL_Sp>>݉9 JhOn}cUsc,s+D:; f<=|[N;x>sxh_%o = >qy8_HvQ94.#!\XNi>R<{_'@Π/)1zowqB2>gO35v@vGNެsӯ/+ɸtr=>؝G>ᳰ_ogam9*x"%2 _S½u''zn}fSmW؟}״?P3%h_(׾CO]ZRZ#)$s7C\sGqA.u8FC=~c{/CڃqvRQ>o<-;t ?zSu~lK;>ϣ'rr>Qvl,*ׁ_xAߡ>IYBߓǽh\>_^y:|JŸ8h7E~_ %#NaozY~c]n_m;&,׾(X[:K~Y0ި'|E Ocw~Yӟ9&޴?bS95hx.Jy^x~0~8p|iG=}xO>{Vycg0en~l<ϋ///8:?^?_wOt99? BxƩv9hGp%vx>~@?8ǭhKsc5_dܦտ0X;[N~HC<>8vTz4!}'(va'];_mU;^bm'/;g;oe[{-äe<<1&?a oN<|ae<`]z!-.{M/na[ޮ|^B -8/z~t9F;/}>x9}oasuBF[tn "57ֻn;.'tOr5Y9q8=x/sCY#?ο7txw? 'AE+QAM ]G/qv` tߠ}.Yw<)/~yx#x9q'r,)z4+c>P3 ;?M87})?;A)Go[mA˺n?3k\hy3~;yNG3->iyJNOݯD9 7g? p: _=^zV`#N- Hy+ vzA? {GdJ'yeyxvA.nUҞ}ri2W7rl<4׃cLj2n?x|k\'TŃS_#ߙ7w9o}w޷&C<8moпhY~`ٌT\yC`*?㋥(n ng{rˏ|-="NOrлB{'Q. 7?S;t9b_菢\_16_wj2ߪ.~ uvp.^N>qtP~\xn:$|(8svs >i3D'GQ~;]yێWrl<4f3}Wxy"zb|3vk%W^8ɰ}? c8"+3p=:nN_. ICEO&aGZ#C8ttqty | ?6u >6ǿe}?U͉|4_u?L|ʯq4?>'Qw~\N:sd<-"?|#q>OKǷxZ"h~7xw溎 ̇@'ooT0Z#'Eށg z{Qg2nr_~jܿ{ɤW.cO3k|~3mʰ#?R~/WLA?WG^ ,~MO~nC$ u%X$SsyO3~vwK!_}|,Gˀ/};xuG/y4v};J:1ݹ;(6rꂮO;k |o_zx*ߝucl䷨%">yaѓE;Rw2[Nx/OQ[iQCCri]o_Con_)yw= ՝gBP>/}TϱSqqяoqe/m;9xQ~ = WZ?;2KMzQ.KyFh3숾Ԏnٹǝf\~]|(C3{?9yn!ޅA?ʁz?mqe~ 1pQwm=>ObCƿ;U,װ<=Zz=?RϱOi~czu~^nQϝn'c%~.߱u|[uV^>؎+?̸_h>wr7cE_kpx(X1p W}uK#/O'؟Lv}Gukd3ÿ溞o(_|Wh5N|빓Qhl?hwjo)A7/uyh'J><8z 8(|θސ'wVćxv]hmCᴋw>8v#8jǿq?օM^0 >WωG !4W)E?n/~/y>ʟqkp3 ݼ}sM2<x1M<*?{Rߴv;b˙ͫP%ve6NVO.;ϥ~K7~\ɵ-_OqC/QE kRe[/&#~j >Q;W}v4n:}Uz+i/4i|w{fKEmZOȃGJs;)4`n!~Maw~O!r}q.rd/Y/j碦|oO[ܻw'ܯwѴ7.~=+`?RƾH7?3OZߝB3yH4k1^ehţݏqM=7۝+uS-ss'q_?w2e=qa}^c @#n95IGy<]ڕ+Q[\5z'Ӄ_E9]gb\ܙN>I.qU]zؾ||fgh~u^yyTQ|\im^_ f>w^xY?vDwOz8q7kO[Mz4cV|M|gQϹifqvз2gyk'}GC%oryk0kLj_q~'s6uͺvl|͋n _qsbguݿ -!V/X;FџDc[QΙ[~u0R~sJOB+_8u/fqbr]_? q)g>k|G{z=G>8xπxX}pA/$(~ӖzO~5=_oqE:., *v0<1ߎ~|8 } >^ =0?r ȸo}N-%AC/tZ_PG{kB_d<7w؇}8#7h/(z SGŃ yg3^_ `[}k>&Ku+ٗ%>~Kɋ!~`9qզw.ME_:o߃>νl(ei[OGz~'8hys x"~'=Oz4x%߲C%߄>cd_A?8ḊP={3|&ʟ<$ʵrZe9^pQső!=u9.ou[W~'/O~oVQG{rF}r9_zCo y OE;fCe< ?珛4uS>sf;(?qnfgM|81CO[5fzQ>rO$}d\Yq~n,/_OpMVz[Sy ;0B)G'L Wh#_EyWmlW8B$i!lx>;jnc?${Un?ɗnhяK*_ģ|<uɾA+w_Fo~c-.~kz]m|/ 1s⌓T/؃q8Ӹ⧿׮JyONTe˗~|?ձ~}~g\?ZqH[~p;.;NsIqɸ;qGEQ;>|ޡ[S6Vz)גt ~Y?dznC+j]cw݈G9(^ ?z ??M؝3x I/;w)N~ /忽uϯ_o Dvc{z'mQ>t7qXφ}.ʻDz~B9~3.Hq Νi$}7{u3 [7/[Ɵ<<qʿWW~ʟq*uQ ~.M5܀7jioŸqz(i}EcqK?/ Ss-pGU=gC?g˙'!Fo\?!g둋~|e/2n3~zg_g7 ]v|q{~5"\ӸMz|~vO_á?79CV"K{>(/\:7I`v}]vD2?~;~c|///"{#Py){ sY|iou俙벌gjGN|`~5+ԇ('xk{r~u=-<?5WOvmyz|q=(v؎z' GjQ(|({||wtw,~]-?][wܳk3 _~[pl<4 f?I'诔/9!:{y/m?/QQTΆ\njf(GG[s?^g= `o/r͗ǝ9 ۽>v8|_s͐#M9N㿨pτ+I砞nO֏XXgcW{iη:Ňpf{(HkڱͿ틽~?ѿD\T=kы>[|sr\~ u_d\j5~w?>{-bJzF;bf9UC]X_xucq\g|]C?}O=wOMV^NnGorPg}~Aqק7 mj? x1?d=~mOPOVE)귱SK#~Q~c=:/Hz?K~th>#mku[rgM'7i?쐳~.!\nx?xR͗ǝz%9\1gC灡7#"]98wζY/]W>ŷiQ?1_KuWk}o!w5r8~k|Z+?Ms}뾮^5- wDow/F<|iQ?|8O|y븺z>^>3yێ^{e"Ε5s-_[Oާތ[|yiga~p=k27gq$SޭӒaCL8Rf]磋b_a} *a `TA??sCYlv+֡GhN}k?ȏQ<6ۡNlw;. ߢ߁_8z+d࣋kNGEclgO[ʅv;:,~v?3Un|/:?3]im? XkVܼYMW3:#_GzQEbI7K^2n(w]=NjGg?O$r3o8Eߠ_1xm>xCǾˍ|l q=G<Nqy9?OĞv z<{JXDRSRԮˎ$  ?n/.~}ؓ3\C^VuGw~[/Nqu1M3pE~K{?BS4rG?7t=O(NnXdg\?ܱ{'$|pr(qG|#bbf||^ yuZMn0^,͐7nM݌ĺ0ru"⠬-8'KC ߇^q ~e A;p\ѽF>pn (oKo~e`>9&n8qj/x~G; vN? +8R_wY֎{E/J3]GQ:/k=>7C;, ?ď oqI%pt_+밌KD/:>_7?W~[M֋q.v)OUzky84qF7Ȭlj/*{p-pxIN Ƀ:w(o\^Sgڸ}!뿈g<+su`9uEExeƇp.]O9JIc=C?xb!Qʿ|wA_(Ο ԃSNАwiϢ]c_wU}EȍgmuOž~~{/4]~|"1O|Ŷ9e| 8n ~?AvAhov{͗Bs5Fԭ{\x/ȡ~X)_7O'O39KIw"2|?vNh?pË uPi|B]c;|冿xi}[<pCɿB˷3A;ChGˇ;s~;/>Y}Ay^?mqa}B8]cqnhOKo(?o=~Ouox/:ߧy|(pO)Ew]\8[^F~K9΃'3hUM)7+`f_o'?p@7*}+QЮ#EJQ;uw/OY:T`=;'e[?ځ_7G<'AOy+@ɟ~D#@|_hl<E}niȃ̇Qϕ^;OqI9JwA3wTI=oiwx^u`ۡcW7Nw/Mmv<_ } /;igoq^՟pXKKs>%|w~Pp5N<ʇ`n~G<_j_{3f{Co9KmM;{W9E7,3VWO wb|>|q['R}!.rMع. c\j叿K[O|U.p%N=G/Ƒ_§8џo+2 ^@/5r/=gf><?8?sLg臎vEn3{+_ΓqW@\T͸x1yl<q9⧌Ka.9@e<+K?O=N)]׺8h=r2~pl 7eϳ)dw0!m778m͗ǝZ߆_| ߰~;|x5=ڈG`$2^}V|#.).@t:.w~3ݾWJ޼nC'ߋkW^?^[}lV=/nY1oe7p_&3R\\SӜѸ >gԗ۴' t*w?igѣsY:g#eA+81>8 @+t:ߜbd>;Q_pwF_uצiu^?B+oiIp&z2qw!:K\(KN|?Xşrqb\YhK܅u͹a 낎?tg]8DW!#z} X燏2noEs8ωqm|O>m^ZsxȏRE{THcRݿXy% Ή[9}KK3SOwg<~-#⑆ڃ+oK|!n*{ WK7%Y/egt/J~/;7Ow^4q_O ># Xsff]nf'C;sov[LWz" ㌞]>Cq =x-͗ǝ#޿i /uCS+xm|Ǻ_Gڭ^=x'8{tzZ3c%N;?K#||~Hq*IV0fǽ(?%.y{<_f6\|v{~r{-n?ZzBw_Xס]<ׇ8q;g\ӟq|9[w(ʛה\/E{u;b_F~']^}?׃_hT|Q y9>b_^|1"^T(Q1`1R]įP`&ޚPzj\1n|s1cEY?TJz!rᛖn(uʩ7z#?zu+1Q~M[ޢoS2>LjNu<wf5UOv&(ۺTS:=8,/tR/օϷ߱~EKo|+my]q8b+O|ާyQ_~[ o1+=qs-?t\σ_oz3R"oek#;iG޿:OC|+k.v4~lȏ;?N_xoO\7 ^OGyzGi7~^GN \,* |1FBe]-'q]Og;wƅH/<{yM;K}OcӻBvWX ,)=Z9~@G6ˀ ~ӯ|_kar [m_r {hGҌխυN93.?sݓ)[qv2^v~7ey׶HG}GsƧ6N3*x*yPeGy|=xM"vȅx8Z;eҨyqG2hG~7vEяOunNJWOϞ 8Ѯ/H9zQEx]+=|}{S>Gs&]$76_wqY֫ 1r1W`!]ઋr.{7CB;G_ ;=7x_l3qqr,ptQߢ3G r3ˎұ_ 9@<-?e}>V;XA?Y;}1e_{6g?6_?۶_Wi7]ը^AoA<`Rv\{Wa$=kqOO\ȋ85Duq"q+p%φc>Ϻ ~y?WTM;̰9Eg|Q~_8o~&<~VUY۴?4zEYWOtkK3(G] cm6wkk?{q}_cѣJ:5]3;N~/_?Dჯ[u<'i9Q~:|K9OBzO?iSQG Gӎ9[9KN(ϒ77qm[1FZFp4Ք7*| >[Rzz:_?48V|v3ʫ8`B|rWJ,%N*-^h*n?>~_xI_0yw}c$>!p 瞗_R^}o3Dg{(?Ax=SsSN͗ǝ2v39)[N8]Z 'OO?T~ryn//o<Ǯs[>u}5ˋ|>DiKDO|>ߥ]wl<4~?s=뼗c|ގ?ϰ;m;p=_'5XO=vW?~\]Rzvyu{pvqs|b=Tw\ .Ngv+|?3s._W93ct ?<;#C:|8>.ag>/9ee)!= v=̿J9nKy'Y>]֭玜r ~ _usؗ\Oϓe?7?〨1YOdco\O"^m;W|3ݮ7ۡs&tl~zWKC_/~4Ng>T>kJ(OzmwwΩ?\.\ng:.ߴ#w:WO/KrEw=痱."9D\#pJ\#ph\?j5ENrz/!~NKw[:m}ٝtĩqq}_?~ѷCe|( )_no@1;~s_yFGE-{pYXuE|&Q 2~Ÿqt~E.>??>'/i~>_ʺzτqc_Og7綣WD"WuMg OaB^1O ~%?>b!D  y?g̓ON9n)s}e\Xo.z4u{O3k>fsCqG]"eqDA oaƋnyy~B9E=<{{|yܩGyt~*y48b\T?w~ŌCp+2% Gy9;m9;n+\{'!r?YNCGK~n6ߢGS#E ocC7~aړ R.nO:1*y~ou@Uº<_ma=v~K=p{3GI;?NqeԾ8s8%fuƍ/{q޿DYa+^s٧1YN;|J: syݸzv|cѣYoXWE{/wvW:)_OngCq-ȇt9b܊rp~߈W? W/֣C`a]Q~nG^Fyxq.Ki/pr!9 |τ}ݴnZ͗ǝYuuQ of,Nɹ'c=%]w8~<r|wJG50] 놴#|w%{qgw~ ʇr vNYc<~Ky?S=կӐ wc%ϔ?8vq.|mqSpJ{1,9ԃy+8,4}Ģ|';EJ}g#dDjG3 8po;?r'nvq}H:'~{=r\WW/wYC{ޖ|S$ȗMQɼw]ٟ_L;M=XY/_Y4${GF_D:]QU]]֡C'뿛ӅDw^*=|rxWJwQtr5#]Gcyf?#QaV)\/?F;*:7d )β#sr 6C~w}Ͱ_%r?8O\GP۫_lݹܝϋ_E1^`?d^ƺe]&UEK*s.h:+VcA/snNwgb|v8r# uqHƯ_czv3;껯k V;P~8 8hA{^.Ծ;p4a)?mottKS7yLSm]4uw~[yvx۝o5qY;~gwss;9C9R^gv[Ot'^fEqC^^E9x|ҹQB^5t=Snm_D~kwwNk[2-^cŇ9Zuq?8hwC4؎2 Ѹ[e}OZRGgs/{\U:S>G;>D>`rI1_OC9y~vg=ck|q?М}G9e{?q==gT`|)Y z}CٝsgM4|/r<_rS9ǹ6S`9Y?zsɼt7?<#2'TGN/9eyŹE?[ߪ+9۶N(>x?kMoﯴ|2(ߙAu>?1 ?rZo>~OIS$:A{|堽K a|؋~^ 7h%ЬygKӌsgI~O?#_7yŹֿzmݗm='5_\S|_x)1pB:(_~DV|WdmvOL3{Ӌ~~)y9d=~`wv'ܣgWz9]eڏqQ:Q \˯ze?\]:?ܾӜg{ƸXhv/kds6 m+Yˣ+'2~sy;= ?,_Mk?z"Dc@?5<@r0z$Ɨ跢G<'̋?5 _~Ӷبx׭~bDuF(%~RdyϹߧ7~m*'߰[^JykNk=3W:'n\Y1^O4עѽ˷u;34YqΟ~o\{b=1_D,F=sZgyŸ~n56_w5$kرXnۿԟ_%|"yW湉7|@@yIx'<7/#a7P/{?(g}ߥ\|ߺswTÀl{3ү3އ>kۥ'd_X!G==(|>f5Pk]3ݒhşaqҶr>~vw_1-IG?+7_j #1zqw>hR9 '9^֝/?3ߤvz'8Hyxy _9]\مO_=-(qf_nޔ%ى||v>7}hivͷ8X8C~D?OwvTkiׂ?)z~m?~J|'hO/!KWX!IƷf]?T78tWc{v ډv 5UK'k!ۑ->zq]YNxFǫw7B51K-^㶾߅h ?-m? I=<5Q֡(7390d7^O#~#N9We%P{sxq^$A {;x%Wz?|IPuS"s|]*G'f<11#}>z׷|0qWI' ^dy:ʁAЯ>km^VzIf(<Y.B}XQ/.֣ܧ + 9:8r Or#/)ߥ~#=߁OKhgvL/=Le|#fg|)?1.gh~zyg<97Zέ[y#7m9ݎ-iW|C/[x5B|@=Ճc}~O/o$SoCq%ӑ/:q__5鹣*s3Iþ޷@#څE_iyKKTϔ_iu=޸q^淖<\G*N}U.ju.-|)vࣽ_n;#=ho{v[vN}ҶOW9`ჶGرnB.X\ |EW돣>3tWpKg|4걣t5rSǿV}(oQLZ[>ߧ1>Ky'X7?߾|.3߇Q/.Bȸe'=rsNmOOHݙvxuhWv) 3 \c`8~Zb~CO~&~Sw>n<_2.$.]8I./[utW c~|"/V?|>G~^ӿ>Y.w?\^oB)O;MNM;S;EY~ٮ'|۾g2ϡzT7v|3+\vyw~/ڕqvO>O#~:do!<=o>C3w~wyT+ilɢv>'31-?gy~#ߊT8N5<h=]WG` D촧e+z뇬 n?M;'7Ig↱.&'?᧤u۩h7 ։YB׫(z[( \ncSѢ nXgrScŸ뼎1Ige|Kg=nv*Z ȰgW!7`s_ǺnDt^ĉu:ׯqzעn<3~rwLӔ/8 3~~1~7v;-S~My;4`}ޝ N2.M/rNEQv\k~ѝ}g>|Y'(z~wwӭACi럇ޏ]g,ÏyR//QJ7:|]%8ۏz+vݾWyțm<_ۧԃE/Z9>G.R7ދreHE9_? }mҡGG滴zq2Nkk;>2=3~M8eK__>5|u}C?0~hw#ϹOGE;%?#9c爸+qo?]V;W ŶݹSV|%K{e >ܺ:kw?C 3>=O]QWϗxݘs" q?(>6$???YG{?-s}q~}|g(w #n!-r\q6t>]v8'~jğe V)rG=O>HyK{\S<O@8^es6|l}1N(W;=Ui`m=g\grϜK͸.}#\Pw\92?aD_HqW]r"_qY)׭(ҋ/?u|ޝ|q@/=߇ߘi]+]ƍ<$#Lϟt\Lm3._+M=]2>P^|MoŸ8M97W> 3q纑>(]`\$w뇪x=! NE?ˡ P!UÙvkSk_CigmC9=⹤݅q+DZ[EhǢ/gm}>>O~,)7z ƕkѾQƸ:'kwcħ'Q_p:DW?}t)s=k/CN '|/֑G~/i_Nr8G-1ep{cT=_|/hxCn'ڕ)zqM?nםUKxJ>E~O?c}_u.0ηq=^F>yR';W6n~<$@={/~ƳKz/ɗ/vymS?"p>_/ɟr=_"}%8|x~o_;r~I}rW`"O+#=BSu`;ާ}Ctq*Ns>>hݩ]=~#?_")?);?sbfο ~4?+]^]q"a퇉yjv\櫓N8ȌUΏW9.g[;;4?띁'gr9rrϧm~9x?C/E>t!/R>~oϋ l/v} >s=ocKfɵq Rb[,~zCGwl//_GW;|uҩ+-?-?HUg|5Cs7TY:Sº#>Gd18ϠX@;|pl:SaeK=d>C'$qDQ'I$T1~5q`l\猋wJVD7c38 9I;E9I?櫓N-'#۟]-~j?ܠGN>mc|?{u#c?[ ɸ=rNi_e|3;^z WcISE7;{_y.'|¸"i=!/ ^`# r|?luGGOsmFv6ߠ8VWsU< |-ܼU9>gW{cq:|V[yL佁x/ɟ=$|}9 LxE$ϣ'c'<+NP.nm}kQe^K5c_mS\K+ywutmܭ{vtw ῰w~Z7׽\p~Kzxpove+2>!q,fO .'WYl,CqaFS!v:Y+3ҿ毓Js*_{q W}q<9{{m/|$ S?Y/C9gmn=+诌OsnˑQ;mmcFy?&FEBi؏h[ow~ߔ? q?gE7\ ~Uߍ(tr=0G{=t 'O?s !5=7|.mxEs|swtB>| ~yE_8?xv$_TS9Q.=O~d ?/|_O>ҙ?r[q9L0;G o7zls>1.KvTW^_ٸ^nKg!ם俬Wc‹S~EQ=7'h5QcW<18};|G?d5Iy9(ǠX`mtgr~Mh&Fjf@ŧIvYv?TPnI{3Gփ!So i~}oMǥVN7}Ɖlkq+͸*IL_ǾD;t}ocÿ `_6/=g?߫u >]YO/x9")_o/a^џQ0^׹q"^ጏ>0 u!UNMY`\x(O#ǡw_\rKwwvu^/SSxøFg܌sZǶr I^O{gɏqSo(ŸG5pc8%+1PoʩuqIո ~}Vb</q[z_'麴øo(WҡRNg)Gg~8d{Fy.!ڿvvg|xi_g\+=#3z |\hAE]\DZ/aw_zk#=^o'Iv;{aOGw:G=/ڋ@/.E;܏?x? ~Do9#n|oW_8L8 P{ZyM?+ݾaԛ߶3of( NEqTU~ix ;=7/'1!' d+Ӡ"]g/WC'.͸u|![?8pL3xGgQ_KLrx"7 rtsq$,|'\gK':3~$?}UyxSx08WrmY;Gґo wvH;:Iq Q|K|<|\n_CSϮwn;#y,y^ry'2)_<1_dxU5(R7 3 |t>q N\O͊Q~-J7r1z w*WK/UhN39ϭŨ/[{/fr|/>\Sףj{qPRrzκ*z,d4sSiCdgcqno։W|%0u9Ygaޅ ~,vd-~niʇ];?nyLC>׈?-('~<Ǯz<#'?mߝw-n.~Z\ XW)Rz1&؇58m"7usNM/֙~u#Qo9?&gucCŶ\'/9~GqYN/~/o?3|8f}/Joѣڙ9яDQ[ǯvȧ('>#ݧ^3>@5Zi8N\.S>[|m9u|?vSk+Ns\a * ~w{r?x|5a}wv-ϛF9> <8~7#G_~_PgP?|yܩ~ )RS7}r_|I9}%"? 9v3_lϔE}>y,?4 FS>w[^53!KʓMNO?*Gؗ-ݹ2W|METso4pHy7vT/\w>C23>!>Be?36_w].~ߤ<<һu <"Ƕ)8w9iu_DG@gPƕ!_G'[R.>r+pc:J7+L{_m-z4u~$鞴O$߳\w=IC?esK,hgՓN-[ \9j#թa~N<1^'}yt:.;<r~Zx|M'D43||,(ppGq}?Pm<߳mĻImz(zniY_z2c^xv=Th} W%n]mWA1 '2^xl1O|AgK8?3~[-ŸkQKG7s}#YaΙv,/y>#Lіz|f܍s궾qrusK>Ya]vooyCaf7CʇuD*qs78DN:W?o>z);\;kq8_Kz8~u?!x| ϢGSv|sֿ3kz߁/9Ng%_)1no*÷OʏRi#C.|m}(1F}n{rue)x}/my zzWy9~z~P{o|籼tE=+9-"O8&_>'>YOƝO?hcRGOߐ̟%8BoѣkV]/r;qZǫ 9¿<ѾzgៀbŃ%-z;"r2K?88'r5/Fs~Ҍ{mcThCz Rs]㯈8>_gyC.]aO| g퍶][̸yP}%'w%~j+f;r&D ĸ9gG+9v/R~ /c|rs\ɓ<;π(Q}$њ^_}'U3Xf >r+Ǐmwޟyh'Po"^1|y.N;mx_A|s ~lNvuG\e\q6v6o9.nę)ٍJv-Ur-2i˲,YCP̅խZb/  Pϛ_S"%QI#;4q1bD>ڳ:Q>[4^^t؜C/k^e_h!Ó<u/>rczNƋ˫m0%%\<=>YXدg|+51>G:~cOQIW}yXտ+2J7ޡƕu"_~_9#慸,؛E//_CؓE' .~(>:s, x{&oS_O?8ڝvK;ۻ0 o;k~? <o?gR>B7[٧/[Q{QG%_ q?ȧC$#.C?C:WdwU.gx$8z[w?U~ _oNnC c_>}(? C~W9"#8d_n_Of7WO .@;n8zK9AohGȕS;&?;}-~hOb?OF2<ϩ|< SX n'M#O+-C;~ZJ_u}s=3EsRu=E$R}U;<j<᳙gqntbO}TN$(/)/vE< D#s{arxμ损X!M۵= Q^O/׶+N?ߓuTy^!dZ܁~x?>ON-ϕlL?ܠ}:뫊G/z?#w_VwY:߬;qez3|l']UWw;o v}\ agMg^xn> 0O=̃m~tys:^bM/)74}< nOq5񎜟:s~#nv>~|o瘙;"yďYr*0.ˋv\f_4gߞye#cx ༲x0_ط=?+gGN~ 9 L:x%a"IPȕg~:J g#q72i=~ ͈j5,{=zk}oϑ5齔't;~~Cw_&t #aѩߋ< Br<ƝxG|a>/d|<;'Y7C?9q~g=!/wڍ_!㻌Fà 5 #n>:_r98zG.ge>8}N@%xb>?@.w*5zm}>D.E74_S_QOqv7Qh_u0rWb?n2<^ғ#_SSo~?Ϝ>:>LKw cCqg??ƺ8־nr?OOpSc?c38g;/v  gGnǾO]uTikce_}'r߆Bgo ohŀc!_'ħyO _߫|!xL&7%,/xqgš'J~yޢB'Qƿ,? V|%}q~Gr*fG_??=zZΓ|ס'*ngC_.<ћ wEGg';#rg׋ ?3/ G?>"Xxlkd_*vIt}f>Ny>ǧ_uXh9ug1uGGQ15>ͮמ8gj&> F A&𳡋*<%]G;TGTy~za?۪AQ}4_}~ Rzt)ދ^ߨ^z>'d}]7vmqr@oewF&[3hQ}nia;U9Oi ;X<&|U9r/51q_go}&|b񪩇g^g G~a#m&ϥVyq|}%깉|kr´Sy1ZO/$%zH-vѮ7zrٗa;{1lkG8/K=s뙏7k'X{>-|+Xq vtx9/{j'c< _ q7#YA]<_#o#~{ZotY/l;/w{#\ W$O| =%9CO{+*'yS=_9ڙ/:¾]Wm#ZD>vt"'8ϑ^Jhnd6~gx|f?B|mc#\2yߠyO{T?M>ڃ<8jC_~'=G~!߫l1}RCr /U.Y/S[Nz/證 rt3Kjq~12C A?zAs? |.oSշU)7N@$cy?>~{|?Q;KK>t]jvu"";u;H<=y z >Wfهt~#d\t81k]\N~$xՊKW=^i3R}N~mG<x˛ ?gx(yCH~.!8.ڏODgz~]܉>kIנw>_r/軳.Џߟ~\w $9Seo=Y=rDnQ߲ ~7_wp[ (v(}"=s) ߍ˄~y_Zg\PB2?f'>H^NF|w =xʎZ#[>E\5}[{ >߱zvBNހrqhcOdy-~~)t9 |;p_Oߙ~@ؑ_e|ױ܎8#no+e\ECgCЉ5|A~Lfm>TS;Lsb|zz?'U3룽[濦_{A[8=~<څ>O~k%xq"M~[b3O+z}5(|ت4VD z_/>xO ؃+=k϶]OYޟj\4ɯnb~AwgCqHgK`W?@o *6yi/Oы Cbݑ39f=0~84zWIWO^uA\k ;cܘG xA?B?G$;.}#|Pg4tf?r?c~_x3~أ/ƓomVUNڪ䯝DIPAy o8ԏ}>xțGK}^/n̗|tE~L7g`ngac^cq*iŧ<7=4csUAM}{ڣOSzQ3_7vП?$}G}[n/5Z~~ýhx 0_7sL`KXw|۩Քyr>w{3?UAro͸$ӏi}FOdztx Vb"ҍ~}=q=)34A_?dӕ:s=lD_^_џcA9ݷ|k Okj;o |tA/h/fG}"NRK]^Bx?uYO$+lE}Ti(G ]q)a^ߩNg[IyV<_11v%G*u~Ή_oTm߭ީ Fbr8&?ϛ$?!~#z3{|t |i-bүmUhr/~6{m㭠#.pg(FgܹF;Mgz\D7 /1oA.00B窞|Z+~gPdOW~V3#O|ܿi#Ssnv//E`z/Az> |Z <`]8AC'T+ $G?!GR?p.A~ɱg^Fڻ_]x:tJF~5|;7:#|ўݬ:=vZr-k; rZE?rkq=SpO_1O2ɭg=OC;+3|"y,goJ?ӟd~E;?|qRs!YOHRG:nm0^*g%8c(˖^/xa~?%ff }yuM\\v@ؑtYm*/΍?Ó!댆OO^]ٍI\lpλ/u2Ź-o/,;ύiYB;zMr=õhO7ryKm5UmE.O|"Wios}xvP?>7_O};|{`sn}:<5~o}K dGƧ>/;\zn2.՞e?+K3e)vx&_÷n<r\g<{C2y9]h=8]@;q:b}GG9"N=}j^t?; ~o7vkg)9G A7vipnDvѼ>O:ݼ q|mU̯Cy;zT?"_v#Wj9E{Cbߒv{s^r22GΧeƩ_Qr'd~O_84W&|rl>7w3O'[-oMYwϦԟ(73(|970IGqi/:no䙵]E=OOq;>xl&ΘvpQs+>Ei>M}Y8Ǜcyȋ1&G?y4>DkOO?r<_WߧGGq3% zb<̛+3^}sǢ??r8 |#r| nϵ&9?&~xyZK8ߋ|: =Cq^8nc[dzd^fz=SAI7φnv=)?;yV-(Eÿ^ǣECiMc>3>6w>̃bmFκɸW]=:nO>KF{{nq @v:Ƌ߉Nc2ju'f' +|N rIA(^.4s=}UZO9%yh|]|/tg?e>Syd|“vOF_yW<<ط"_dC7)>?U#q_T|?7 tE9Rk{oIl]Bgriw,zCT'wN0")ϰn^NE~W/A-%Vg˔^gݎq{3uuM#|j&2f;86vw+_i'y{qr3OLoDD~Yk ~a]C+M|K?ЁyZ~`3_tL?+| >60E./tv㊗'K~]򁮑# \DA]'.833 vBB  ] za?IeXߘ>vdw3vm%~*>s?<t ?K-3Bt<> ztqaSzqxطs~w ^V#6t| _\Lklw_w~ ߡ?_zva'˹]EG._{/yxk\:|^~;y)77; i_^Ni~4Q-,Wn!x{?j?y(W|3__^?{oڏ幰0KkΡBvuR8Cy.Zn0{Sc ~D>z[1o}]+=DBv3d:{61(GR۱wO57~0?{~!>vA/}Ru1ތ?zq>%|y>x(/8㏾= m\ƃ =z>Ƈvb=e?}a7ƃ~7t'3ym3R1;bC: (Џ?'A_?Y?_h׷൮_e7w=8#'~y4և7zY?y}i'OCLA {]Oүu vD#=uD/1z4Nu>|K߃ `gב9ox:{7|2z:PyWa֗4z9WW/t']0s7/Zq78 ._~2Nw[@AahGh18±>J"g2>ވ?s>ls~{/o=ƎCr?yX_BϿ GiFCXq>J><{ ލS}8|fc;3^_kU|(Wl vҾ׬+'yO?!vޮ='},~#_}5Rboo_R܏/g=诱qDo[+y?߯i%g7i`a7snǾp;˾z%~<9|-p. <5S}*_{[^R-5|У|bEyʱ%ڍZs`GA@A?@;4Ɵ< _d^?|o ,_: zR;gCҏuy>O2T3W7 >/z.~V?Əqr-o.ńM+]7yG}}$R򱌷opxEy3z./@)r+ #[xh95D)ȓS˚]G`:o:,>~\؍ٿ/~&uŪwُٷO~'?.9Oў?}YO-ܥ/Wc"ϱQBOvX*=x}sSwS׻>W}|9+;]7wC >ꡮbz\뱎o7>?M?U!ӿdgO۵^ǵ]{Ѹq'}iz_d"x4h|+LH&V맩l_ϥr~b4.jt\ od Q/bߢÓa18xMz< eylw~?kA)/Erߵ÷ 6K:^+ }O{{Ō7㔤ޢ(mrݟU}N"{ Rcģ{}N7i<nnYr/q}C\ӾhϢz|o ~76ϧ3hv5f?~7Vth?whFZ|.Xv;H~y1|ciyA~ޟ燫+>0yt^)\sjI5ǭğmkYxOn}akAo| ㊜FFhėmʋi G2>W7|6)oeFnq^:$×A%_~6ysE?Ϳ]O_aG'1cد>)xz 8ߊ#o x]=\>:/O2Øȫո%Aﻳʺ G'}зǣocy/*t%AqWc 5]I:$.n2~rE+|e4rrzWq{}ya1/$Nxw5>7ļ9 ~[FʼMg4x!|eF䍳x߲_\F`\;*⛱Ozu) "ׅj_\.=;z|8.//_1?2zNkWc!g!=fte+F8={%u3"סwS{ ܼ _x2]}G)ƕWTy]XZN~\x:<# }M\i'䵊MG%#ۇ5d^˅ onWךwc/f51+;lk1Jz[ڿ72|#/w'r&y65&.ߧC}LW!n\/|e&?`dۑH?3ƽ#`=#v/:l|go3mƩ}&z9"2mÌGh}J~ yn<r 45vzQ~Ů{2>5m_%GXwv{Γ=B.a&$ߠ_{wɾY$]aO0z^ʣ5AOza^3?rߒ}_ ZuOAܿYAy4zfާ݋Ɨg:u;[; ?3? >x~`BܧYz2?uoeE[毬&ó_s Wa$.;t՗VzΦë  )0HuuοX |}W Ht= rvԣlG d=y 'VH;|/ B7 g* 'ӊ'M\:Y?q[co;!qۃ}wD,tx1'ٯ9KX?u1=w!f]]Pm =ghP׬_D}t,y|o*^7HXۮ0+9 <џƠ$L93/*PnX@ةM"BMW3>O}9'v9#Sx8Qy'܏;X^^I=n'^_W3%y~;B?(ۯԾEe֏b~?z\}"?"O]/|ZԳ|r=o%F@/oVŷyl'2W!ݠin'^W%/t`;ЋoݰX?%[v~0#re@癧Xth: snDR1.(a,A!:>sW`w 1qoqFt _>h/z?#0 '߇yĻni-!O[A{9HޤC oN#2>u#Ww^ϰW}٘SuAk?3twy?[_ɇ/#3u\@3ϋr[4~^4hxduTu?k繓Oy7ta;7v Ir}G4aY87+{iᷰh3^qx+`utͺ h4?[;OGؗ@ළ{3cH;gyJGDs^Fߗsn+z(wZ)#Gw3:# 3o[}O zi XWc⑾%~w(8[j_~56Aif}FL:~ϐq'R7TPo>tMoN;<皟v%]qG`?NM3M\0}*n|]|!&p9)_+_Ƿ 9s/<~=5]k]zKK>}vÇ+zFNd'\?%{G7cw{;+=5~Fv`ǟDgkTc'c^ߩ}wB_|/i_WWz~سЫĿ<>-G#yS#܎|[N|*;`\uh<\Z gD'v ?Xax<cEkyCN>no5^  ͺ= {Ef~>@{TOuC_.Ϝ>NRoK8?go׋XXzutt}T9KA_;=w0߼~yqǎql{@K<~wş U붞?}"1zݜ@<|h15"}rYU>8n/ ~B{W{/tYxzn&Byޔq7_/y >ه-O>i㥫<=Kr;y?u[}ѫ:|9hyxfc7nV~v'ȅ24Scmǎ|^;5rHr!'<5}q·^]3DtDlzmWև׍7Z;o3~^_3|Vy2K>S9℄sïi9 \C:LTNec;-{=_i#|y3Oy^O—񃤝Zo _dl$wЃ3á/_3:~~Ϧ>g'y,Kƿuhl/+|3- MCe' [>OnVerC/bƥ~5͛تxyr朲ʛE=7>ƍruS䓂xMڹh|v1+*;0'ו/M>qsߢ9׳>t~f<115|~+ }n<|cKGqbo1y-:|;t y =׉_>_I~x>_Uʁ!7\`?_k}?q%2K_9;Gy[l~VxTvO }6qh_W msw% Vx¿h`ǮuCynqKg$+Yޥ_ s1~'Xtč1y|as.:G\8߿.ZqKq'צw|첑7Q{lA^r7^[޲I?L󅩏7y5k7|rݲY{8z^N::Am~jG_xS/ڿl/z^;<_~!b?YzaAᇂn2ځ{o󾞋6S3{~o{'o÷hg ?X8N{ӇsDb=_gzˡTNq |X'ύ<t9s|ig~=d<-um?$]=&َ0tC;m/}9_4T+/lص9r:Xx7xWgeS/?o|9A0iy= BDZn*;D/2ϱWH{=/t/aCc~t2gV9'#ٮĕ8`oX`w;U<ѓ g{^ 80 L|oq=DoHE>FnE|!~c\GۛCt=MAT{Ys1-oǧv-O~uuvA&$,"Φ"D?h З]vvB;,~ާVK$uX!WN?<v:1q]ySN]Z^ ސ͹ȏr靈Eoo'LIGߧ5!~㝠K܇7ݎ9A??q}jzD*/GslV\c?U Ϯ&N?u*.Q]?{~ȱ_xvx*ƿioqZuӳэ漙AGcnkMlU˂׺au/>m]~9ȏCz~evkë Woy[#ϚACJO+H{zv+ЩO?9|9׼ ;sCq=aK{on<l1rpY=*e>Ϫ߿I?ɼz~*Ѝ%/,/S/gk踉C7wA?z/WE<_KwmyU/uK_ƟM^m~3MkyׂA'OQtGq\P#X',~$x>}P|Ghv{zqs}!xGx~/{i<3/Rs׃N稾oݩ\4-0|dt{2۩b>S>_S:ΧN۠^~7+~n{oO~9=/85߰?FUgjz>%?~ jSx`/`^+\ez Ӯ^[݀TO+Xo[߀?W$/!w`6s>\ ~ft/ao}1~t&i]Ҡ_gu)2ϻBg#S~=9Wkezbqj/U#g=U:n >8'\}%7O !wu_9SQ|B;+4~덏=;?4z/0Sd(?;2._~l+څ="vitrs2DA/gzz^Wzꅦ3w ECnX N:`5k&oz譋;< X]|Y@+Ǟwxt_Ǣ}ܷ7!GtNy[9(г_)籣;g߲.HϿwUϧ]OA1ZDѯ6:q!oq/0/_GG;U[t;Uu;PiMSW>c2k:@O6n(ORa;s/Y,G|ao3|ȩA7?? 3ۓyY]Zn#<2>콅ql3Z|~8>?y,;Ey\gע7'*?5}Ѫx V+?~ۿgzǻGFԣr3^l3_ğǠ1/}oL_C~183{';E|?3ڕDYݸ=;'s -Mknz9[ew0tuzjoV|5tT)>;;}quw)s;&oMsB?wun?2FLz AȋXOOgv<^+bvl|D^i/OI׋ diw濁,8E37i'˟y>/a'R^ ={b)/v-ڹ|\?zon1nn"~PF?0^]8Y^1E'󸫝׿XiS~~J9񷸆o#t>-8Q G 6{lw3c3Nw5~j1'׫^eԎ?2.ZVLPou~+|Xxk~+hؽaŷ& יQry|<}GY~%DWlF+}'/oy2Nü|_#|썵?Vۦx_gz-qى;Ta܃Oe|C{Uy|UqwIwo?>T̛jqq8D8,GQϮ?ۋrb/q"rɂ%xN;+yb>7yuoi/vi|wjϡOâ^iCe>Kszo7\Uygc?vg''Rm*_zط?ՍA_/nˈ ݱn~%i&:|YSu%4s_¿}g ={N3#݌M2oקTiډ?1}>g]_[o7ܸ{:=x}9U|,On]pc:er){f7F:A>hx;aON;o6jvM^L߾f]9/֯;|>ccA߭ bG#.د^}>/ߕ<_O)=-~xuinأa&>6៟rOg?;4x˳~ |^/h6:}Z߸/=rk/?ta/ii7~Ciwdz~7a<@gxi~xV=?TTT=_5z q*3vaG^/Qlx0aO޾딌{֜gbwD~㗗<=a?ٮ_ >03d]4):68b3b^Bv=xǼlY:|=!j^}djrqY4{<.'mV@Cn,|yΆaT81hsz] =mZrJڞ#9EUz<W]l|)xjΓ*Eye3׼+:-~Gn̷׻;Ae,`8?ygb7<07a>qE ~Mo}{>h< ^h>g?_^yf|cq]f> WUz U][\58XׯIWC-y?f2O4_C/{B3>px^s_0h}?fJtOǺ?DG|f \h>_8E/CN[gGemAU>c{U;{ 3;]sg]my;O^6=oc7cf#1=#X(AIGwvRtþ vաlGg:3o/ ;zw%[g{)h?6sC {GgQǠkKӻ=~;zQ'Ϗvܸh}xN__ ?l|#۪GYGOf#ۭ]9;O/qz |y=qmdw;)1^Cx (͞x^ҍIW3~Os\;=t0z7k}85~|a_f'78Z$o:Ml·u<,)<=%6Ҟ/x5QxO ۮCy^37 >ufʹI <XoXt2_s|Rxvt>yۯxA|~CWT~8OÊ;΋_ч!g |Oe]:AƝ>B ΝNR_eN#e>xjިOM}+v^8#S㗂컬~XOp~>v4Sg7?G8Uϑ?O13Iѷ૔O:ދ<o~tE#-b\#Q܃ݨNq#(΃}Y۽h?[s9=}K=xJ%_/'p<4v} ow=?y}Q 7vھ*ioyEd~yι4|} ^o|n'YPO񀯀]w71ȣ/<|v|x9q7Ulj#Δ/ _\dnW ʃ=M; e;O/dy͓Y^8g\kfā\^ᗔǼxsfQ=MIO<xK's9ITrn|)ьo^e>2;xs&yZØ'gӟgGy={/tůsO3kY?}|1ys;ql'{+=2No~gqQ&y=rO/ ="gFV͸^_7OO+q/F|vz7}'<\sڟf^ƙ砧lg!a'9:/*|;¸¯ǚ9YldΗvvӦO6%SxX0.]Z>x;Ͻ7"yMOjˋ֛vXf2<%guoeio ۀה `W,ю1*@vxh<{zn3ήsk;Ӏ ׈{SտVn7 % ~^_ WޯmG됉aCQrp~[O}U=vBok]txA,~͹7CVWaZ%sU3B菿]/_GKzEFvx62uXG.`= PLc_I}KvF:sPy˂=S G xsonǺg|kVuΓ{|_}/ºp'GMOtFvx" '..cx3@'GrFP.?t.yA&`fg]Ot#3G~ur|dE~^ߪf|ٿ|/ w4}~@l{a-z^:ƾѷУA?t-_qne 9GicVϦyU/ {A:|14]x"|k AOGuBw37t 'ݜ5u:4}Jwdq[1/[>'?I+7bAk`5_mqq7_dǡXͿ8 }wEt(e_i;Y.d9LfptT?Oq/޼0r~NPz;OYcdR||C39˺ϺE3VټJj/9zXg"󉃢8/zQ< ]]h ^^sޏ%,hOcCo^ }obBG>k'Ek W7/]z/i>roG y>W2{ot׵ؽk vQ7>lW:Jyn7]}aF/?O盀n2%RGOt×I~s8`Y<zxG%zA\'f歛NǾGn/Kf4o=}+k}'C7'w+~<~@zy7E?SD2 {'C^tRG R5k~=~[ -7&#s wyT?z"C*sUoBCC.7W{GO87=3=(âuxNN>Dn>f>iGq r,%yv7ws樂۬Ugy8܌ɟrБ__+uvAWc7x DYF^KCu.qӜWXA7Fd^h([ =-1y_uߏ冿jǣ0 y}?Mi:jy0,78 ]"O'Y]C}ǎiWQO~9q=;|;iKM<_uP~GވM).K^ɷf_ [!?X`ȸS+4QcAOm!_;low*^Qʑ8R@wE~<^y !~@/ȋ&/rxt$ x,=|4=gz'|>]7{nytx E<0x އ_=4t~Dr_-z\:yp_9%vq1eՀjE?>쇽wj={SAYρux5`c@Oͮ)gc{SˑdsIwx5<#%ÿGg`&ngU?bgQpMz_}_&:~u?LOu=dݮ;ݞŅs?t}R㾞;ΥzzË/_sq? y=/EG:_`Wʻko:txquo:U=rT?\tŅ?3]:b]7dmV9zg^\<[; x쯣rYh?Dl?}/.4C'c?{U^cn==~y ѯV>U5~q>~/7~nT|ɇ׃~IԋzE_W\9 n*~;ފDŽ7޹z2⵸)ʢǯë>y|/r4kzA/{>u<\ w.~o7B7'߱?g=gUOq$^}b݀~W_e9x#!;/]!tG;ہGq^=^-h jwz8{y4l?c}dKıY8vxx-iv}}o'ߐ??xE<'qjA]-=sGWGnAWcǢ=@]SlW?; }8|?aoڮl ;<5q>C4c]:Zd^.yiy'7yS"C_M~kn)/rl9?EcWڟ8y\y @ؽ^59_۳]=#C|{';S{9Ad(Su: zG}>آǷ÷6ٯ3gWߧ\~9zTr6]sv:3Ow_78k>Qy]bV-6qD;U̐q=?? ΀˼侏80+w t0&W]vON_wՃ6Stf;!yWyͪ/:s z^ϓn?P"A7a'< nd?!?]vvCo9R+gx+D5AF|Kɐ}u~svv$M|3iwO~/_y/x\WV]o衮^W44v^zD1e3ݰg%>nm9vϑn/ 9#j~պfQ9\vviᜃ2X3>wkN~3zH,TPD-uv''1;/~3sw c<< 7Rt:xgv$gW,B9RytqoWb'/ߌ3v[B{J? >D;o <|qbA}||62݌v?z`h~vwku><3._5-xlo!sNx[a> ޣ=3Xv֢<]}OyQ>o͛zhx0k!8K-o×5gQxy'<7!oN@W:e'O^2.F!Ƀ~0q%;%ܧ(ƍWٯ[(Fg}߁zg(?q]c<Gg|=K:6Wȃk vD(; :ǘ=yy<,'3ʅ]C߷o.|aoW|2@3x ]w R?<p2n th|]*y"OKx;Ɖq?/tGO ~;7?v m!'ƁGNnm9 n7xr>I۱0|| C;z r }񆯯}ړvj禧A菙;xuOAa\CW8#{1gQv~?_Ao9y+W zg)F\8\|9ƋuQqzc_E+Sp? }tqЁ炗3]|y97a^7$v/h?;7xLZ}yzk𜸅U> .x T};a>OYGX?1nr=zI8>.k3 "o<7CUY7A>WW s $'<ύn4z0~ֳc#?F|o_C}G~?`|O~:}[{B}Ǻ?Tz3E$ܗIs| [/)1VugO]>q/ʁ~KմvY5gV=qD5'׫7=>gw]3adUx ߕ:u3g ?wyXG5{v}S']#/{f^O"s3}Xz{7'zGPNac<ﯝnb]l<_ϻ1oOB ᧓oy!'\~倞3]_4}Thy8ß~^FsOxntOj}oڏig!ߢ_OhXͻ)rF^/_T:3>_k}T/6\[_y}[d\XNhaoƏXh7Z,#|e:[=Dߝ ?#:̀v/MĸS_UKOh}}$iQ٩/?}>vc|Gt.LImKx$_4._/=ZNwQ!y{5+y~=rU@}\opw6Zo-[n/4@c䄟nܩj+l'Q(3_͓֫v@t.t>#^m|U>~zo}?iz:F/c^q6q_AOӘװr?_䇞qzNum[O rXw0fm_^s"C$ :7AqN6qx7k+~8~TǸmOçFz ygu\d\.wZK{qu׋_;u_c=j.0/F-a||=O 0P>|6| Q1'1~6O77D\{}v&]=)xH?)ݼW۳h] ߏN-}Tۋcpv^ ~OOlΙծ/~Ͱ}}Mr2߻*nkVos9'Ms.NWr١|Aq侀f1cE?ﵝ;JWkAַ>2?Gy<=oA#{g۹^DoU< `l|-7qmY8ox)? v1? FA_9 :V7 =c~Miw0f]Mwk1NC6X5XO̻Km~ρ_=cݏv!g/SQmo_y7!1 1.O玚Z| =f7'MG|v'K٧Sx7{o7 <ɣ- t|M2ȓ紿CG~;E;F0㠱)?ςhKkz#/bnvySqϙ+|*o|ݪjmңCa3oT|Wykt? W{'Sۗ4~ /85ÕN7o0|קF D;)L>RmCϱ `gOu3.ևZWE m===*r?Ñ}ub9O(~b9&ruvzQ 5<J:|::;AFee>N :"3.V}WM BO}y_t c^8p-ohȼ[_Oy]|~xtWx{0vn|C>p\ƿWxפ y/]8'>]B7wֳԾwj?M?!Q # r 9t])Axb/Oc1 {0מ?O=Eavv;?xcfK "dOjr'G~tE?CīAj-)iO8w֥7/ŘWcm=3iگPxkwk]z&Nj~d<&㆞#/,?Vn{rynf̺6Αx|Uϧe}%|uOqMҎS5˦*tW>]旃:-5hUgnw'zv>9j7ia2n0|:skiG7D O'3Ƀ&~g&O2g&Ogb=O1p?oCI? u|Uz>Ҝo<cn~|5qH?nϙnC/|E.k\+_5~fU׏zygsߤJ;ѮojRxpN|_{㠶3AAi} kyOfj'-ȿ<789䫛/c=:/yx?_|fy>S?x 拚ܗ6}6w?w7f:}ƈ/tȻܜw&/ GyY.vf:^؎ГIxh33˒<`<&Nh_b[/' t{7> rB9vo'<ܮ7rvײǴO8f&v̇S\iίnV~c}vDwMO=ӛc(ԇݮ~OD0?qymYU7B㛹،tC:(>;^rC8ǹfg{D9tlz^>x|@?e|>|ekWKA!9d?~<~Zrw<|~=UlZmJ5??!q6Qe<|i[=*"}b3}!?}=g| ?tqfyCW}tq9|%y8EzJKA'C~\TktgbPy~n׊M~b_V}$UjS a<26ԣ-F=s}?oa?x)q9sH ^'NZI̧?T ^g0_ ~|F|P_[+x2 ^'wFs~qY^y7]z2d~C}[?u-Oy:/|zOݾ[C~~cqe&?tƵ\^mS?z>őn~~q>v^Ǵ7G4<\cw=݃:>W4ϩ5TQC!VS=z+?9GƉi_A7!k5>M ބ}3&t^\՜W 'K5?0iyu\?9웰2痣.>]35,0M6qNj2㡄<=7:e|UG wU}?iy0aZ UǸ齈sUN74Qܘ}x3_9ލ_k\񣙟~.h~usoؿdrc_|#eG9Y%3da¯awd}c^.:4>)??Uzk[w$i9Ee:MN}CSO{We8|WĿˑkuxf@zyf\ƴYi_Fn< f>͊'~<_&&ҏqU>Ϻ$eпK=`RoZDOxy5ٟv22q}V6<:x?J>rهJ>y=Ss^s]M^s(OO=8 yK?y/8ad~]vD> d8fJn?Oz%/la r+w~%_P)Wfԓ;~s.v]h?U%KTM|izR9E'n&Qiw!}xҡϯ]䱶ӣy}x /oqy u|Nzs%s2FOe\"?~mwj߽Jyl~wXS4:.TU[T9:d8?]Cd>Տz\oi[ў0N ~Dþ'tI}t70q"P¿+jʛ |ߐO.9quw\qs'q$o|8ޡٵǁvݭ qk/km}?E织O^]zT?1_й?=q77zϏ*ވ3\D#&%7]w<ǎgc@kƃB^Ag}#}k{PƠ[GSWאH_0z*Ϣ |=Y/㎞x7Tk?^ƼImY >8D-]_1( B ~ e>sE˯*_7q y>T /H{fpx醸Peb%Axyz.{G惚-]\k'zO<7 X۱y03;esy:n1q~>uעM&xCGϺG#=;Ѝ佦oNwč1ɯx~F|_1O 3]_뷼SѓW*6>ܭny0/*F-80 VNj3lM6bu1{o]ЏIc x:8ux>BvSq;"/~g>frͼa71绽|jgo#ռ{M<1zr󋝂gY$Enk27u#>tti}dڳF=ڪ[x ^[qحd0ߛ;<ߤG>y8ث߹/=Ϻv &}l]{߃^3 2^#JGϸg{}w:\vd͓e۲=/׌7kS?`kν1/w>xieW1~sy\?if{>3 l >4Fm]L?7M8}[zA^ɮr:ㅯd «Fgoom4 @|Ixq̷5?C9ese9B#k>v0+|q|s?8>~~~3/97lwM}|,LސO:?3%i\`xr= mWfπ?>P}K*iba2ϏU|ȓ7N𿢝ča_=~G|&_c>;ASwxٿ+ 8$Ƒyvm =][{ ܮ1ޡ2_}y u_OFWo댔?Ga;.;3|HۋWўڿ*h ~Y}DtժCs |E/=sgGOeR[zE3^yt>dPB=w>: |y{~o>[e =?<ՎZ>uGĩhV-'eR!]9fwid3O,?nxߝx<5yBW4M yI}/󷺽g.\Vyc3L8?$=7~S=Eߒ>ǫ +AGoY W'9`={R}9C'=~~ɖ;wAWՏ!~^;_r~}mtzyoC푞gOyD9']>aDwyPa>xr{v &⥭>d;2؉K}~3ج?cD>fpN_~v͓ H?kF?]x.vr!3 ;{ rL>|S]#ݷk>. t8w}r;j~~/GOn8f_[X:):YkaWu4ܿ~z;A'|~J[f9@~@'xB q{L>}uB~?>Oo=m~.Nx_+~z~ϑ#> ;AI}~M?շNsYGŁ,ݯoÊMCo{Oa7]aG"\?x;e˒}~;ˑ ӏ=;br~&9 /u{eXPK9sF{޲EU ?e[YW#s3~Kˏ7 wG嚮W^ߪmy zIƕ7s*xv܉«#m?~Z<h@Xz;EM<OaT~q8U78xblMp=~gƝo/rqߘ?ϑ_g/ڹ><}Ox>Q;үOo >DWN'ܗKyIjxKюisлѡ;<9fcOq1~@ Io}I{c^r~xmq4ORc? _=#oA[~>G'v^ ?-Ɵ7[~Lk߅8,U[~1o)c#>bs<|✍Gy62O5k҉6Gokq*Bvz ٧a{bw#snz~Kѭ3[]yҹ5EӇru|<`}Y_}~x<zBO_g#h~ToZ.r;;]BKG<"k?' n=8[>݀owoA?]x?. y㸨o>0O尟l7B̟] o[VmzizUyquyqx5 }R#zjط;5Qy}4<'Uql6|:WW >u:|$0r5OOR_x'{_^q[ƇA/- ~Is(>ao x<>wx&x%Wk첎NAs0նC/#1b~ϐ'#Vz hG?+t븷?znB7+m;|!~󬆜V7+>ҹMqt?ѳ6u3W75~5&^1 ߃#</}qCv|)*s_/=Qi= κq<࡞۞|g܀| >5;@w9#[YQ83X9}O?t_a\.a~xDf>) <<{_ (qW2V2^LgM4NZ'0n'zٿ?^5BTxz1ZzG >;۪ye\kv|1OϹL>ڃ~LI+t}ZKO'ῑ}>^^1m' ??<&U4 ϔJ3>Ïxz :J}}/^/OyDM~ ߱`2͓wǚ$e>Ag7Ʃ_y\y',M\0o[1w9kdƃ@߷tl ?GfޒG>W|SfmO3i\?>f~isƙ~秦18Qnݟ=@w_Vď |@T.zz4N̋3u5^_@ie/o4~;G)qA;QO0&ڮ0ƅ'1ܧ݌}'S 5EyzAC?<*$E&|}=} Έ+kEn Y`g/nA3՘WEmaX_7SП';_꥽p0nODO7!7_~&c x)>8!Gsc]=?jkI׌WAtZ;{{W>7|C]؝'3Ɖ vKe>xS4]>'\][G쟬N_g19W~m' {b܉Ene|__kؗtA7uÊ_gqS@o)=gn5S}9O?/~?{gߏ3ω71=?i7çwzO <|z/OwQ*oKW^ ˪?ُSAB'|7^=~D|&]~g,U//Bw/O+ ~x7AOO0*^|'%3Cg7k xO{oc/Zk-O1 ^3*u|P|Nn`1~C_a#ui'j(OCF9J)G`<95r}|rs {kI6o7>5|\_>f~j;r_ψ`zZϽ.U3-x~ 8ikYRv'Ak |nܧT>Gj7|y:RT테7k/}S$AL<~{;~\L{f^V&_3t:kY)'!t?oyjig߻oGc;+gKy|7z}?9?鿛t{;i2/*R-ƽCH:Ǻ(w+ާ]Co[_{ԓhh2G쯀i%㿤~6;~o7ͩ3P]kqevvyO3_Oix{YUj/`|XƋ#nl1W5|r6k?g|^_y'Ih;=:٩7__GKqM=|㋞q :0T^2ԟӔ )FEz#ŢGkV$X!ҿ4o;=<qgxM kw\>@N}u3a_s߈yhϟΆ//z^:p?43H{bߗ7篦ӟ;9<Tz:/daowo`vݜ+g;Yx;rxczcHG>/ #:txss/vW }\W`>F|M'Orq҅DZΩ;y=/o![ԃAԻ2}wֿ3hOf8N^CoyX<}(9rCu?/ϝ@ƅBA7U|lίGٿyve~ȉslч} ׺9tTl0y^%zVTnȍa:xڮAwEraos7*O&Fě/j_{2󰾿O=A#jP9>ut|t: ~gǟ|:?zH=}kQx_Xl ^W6x~v&?}Hwݓ_ϸ~ȟA&bș̿Yw|Z_N?lgޗ>Oc{v\=ykfB?VzqJG[b?gy4cłCc|흌ovyqSiË a ue:v;??-԰nQ; =yvL-t1GXG߆<y.f$ぁ,Bf>vX/v^4y"ςqsS/z3~F(;xúCx~wqvz߃qE >G~Uǫ#O]qnȿ: L;8*>sK0_!MD]~QG*x\,u >UydGF@g3uEExն7A3s*,&7q}~yeu;K:z{>x M~/*?I <3ykƉ$n?/_븼v!#yӛj?>r܇Nп2K^ |>k}u=+WᕏX߈v?In+ݥMOz2cnGxϠ .ȿ_g:>8ל>|A5CwZT<7ӥtNF::g x>y2 苴b\Sϋ<\k3ySg֟(*N|gcA8]6xRQxm1f+oU0ϫP|90? yX1M ':q=Ѽ?\x6O#ρ#sI;C{n4wC>35G:-23w\;xZ^@wƴ!yک-w?r#ClQ2¯S^GO;_(} &@]`y >(_J;'vy~8_YW?N^No97瘠;oG=L*9_|^ oi}|^3u2GwH;G=s(=qFqh}Ǽa!3 z{̫ur?nfs|>VQ*{$xx3q=Ɠ|:'&§<^#hjy;%kҎ7OXG~+?rc(O |?2>4yñߓ m=ƃqw|7YmD_TyK}Y/rʯsh44{C ~0%"2+=MU^y2/Qwޠ9yW*ߡnn{3~z=x|=~Y'h^_ | }!~μ0UA? E?k!~[h=!(z+72GF~hn|GsC/EuS\/B?د&u\-o:&W=reүNœ<#t|rq-i^GK |`;4^=W?3>sZtxJ|BN/yݪxę;)ryr2oX|ִ@wgVm}Wl?CGՒ?5녰~)5_ _C#WWC66!+45G~f'𣠝^,qqe'.ڐs=/:Z4\uu9Xρ/؉,gPO>1JWڃ]R Vg>x?MX?-o:*&8/A35ҋ}@g"'כNػk7M &q>o\ \ym.L?A̾s {}lw /e-nЫωΞ~ ~zikd]4@_#xO4|mGz>O?>Cs9tS?4 =/7$c}qވH<,Lo=ODyx8BT ~)%㳸q{#r0?p^ z i=-α5yїvU D/g,|H~\2yO? :A 1_=ӑGDϗ+^q<γƺfsxsա]WSt^G<4׼Fr|DB;XN_P38o~r%&}z|O\ sȇX{9xe<~|ݳ<g%0d3AM z\OLMԷrr|r={U{|2An2 xO*K?\g캫/-S'óJػbę;>y jka_f}7qاM ڷʉN$|+:tC÷! ~I>'}u?ۿ^ܺ z|2an_U&f]77}˾_[-r瑏tG_3O]}/:03V t zi·"OcvqAY}}>;ąf??~5sqϕr7eM6"<bmxsc}ϢǧOskFz W|Ë 8'\kڗtܝ/ϯ2юN7Wn>ؿhKOg_Į_ ;ZR97Msz\m2X<<ǽNzV_cvo"\DwWu!ȿgܯXk;2[OEcoc3jYϾzs^eGת0'"o>z!'Pwc*{%ϴVg~U_3ó_*n))Oס+Iz?u t}Y}7Jhj4=͕~Cٗ}Aq-w置}4A= hWr/gΈ;Jl>riWn|) GZ׵V2&?cCا71Y{GD{\dzϪg{x:ߣZ7 m|͹X#X7N~u?s [ؓތA.߆ҴKcz9 =n^ ''Wo|lSywďn]xEvˑD'C2M1]+@iON`qq/6qѯv;ux9r--!BDx˟ͪ7]oC/X7CG@1]hn'b9#=?[t;K'?Ha91óy;9w v!h߱?~.Wc۟/?LlЯѻBL;^ȫb_㓾Cc&ݠE !nhE0m ~xc> dO}-vJcvO;Oi9O>v\t;Uࠟ'>NUzC8- 6o&t(yJOwz> t'_sq(;5.o:!s ^@)#~?{nD`sKEC)݀G>t5}ޟήx7ܮx/輎#UAN !~%Og#oq"L?MǹϞggs#Ӂ\ta8rzN;>NK;!~kOXQ{]e~:txtsptqx>OE򨉷B\Cy?:_tz>a!ߌ;U~<;e|uai .z;|;`L;6 AuT)oXioz uӴV=r)xkʑ%7}h1ۙuz~`FO$VϷ넃~#gC|.swawktD|<Ny> ~=wyCc9C=ǮnA#rCd>ﻐڵJSK?Ma×%}Ѓg>y̻CԇYyyV988뛵];|%ay1,'80A_UN:iG]ׁy,z;\ lԈz%?rᙯe<:v\U{\z/ړ|?k;3_v1/4 ~S  zJ4~/Awv~ѢaW=xʤo>=:̺(AęF?|πuwU_kb:x0<9>9r)㥃OOa/+e!v_ѯ7'~6_O#bq=.%/ 7\~4֯t~.x=,T/v/}L*y̟krs>_*Ht7WZ/s1y?aoF!7Vu;9rȽ?556rJruD}}P%|O}^KyD9;Q_O:Mf\@#k1wGޘn]OU,_!'s} y<72<@'C=>{z: vtv#4gH.z:\ 3>+T?ŮNWaѵqr~Tq3z"?`}^ih ~|:|z߃An3;toQ/Ӑ_9-F1<~=.&?;՟*4z&a_@~ vk=gu={|?3d,-f/z:\ zu{6CПo?tAϑUzU~^?3vr=f:[fKp1.m<r F!]~Bo4~m_N:i'>r/↑?[]OʰDC|f\L!뵹~L=LG9ԃ| ݋:sºA;?Î!}=uᛅޏ7aœ7~bX ٠WnUz5ƽ^>q{[o6U9ˢoӿoϭ]Mқ$7uVg5yɻ[p1;'ݧ^ɁfD9+oPmnץNcwXAT{Fu^&>H;ї#{T^oiz{k;-X࿀\{MߴGƅއ:^ Qd.kw$5= k"ƴ*\J]4 g2ZWz3AW/_sE[ nw}y}/؇<7qUϨ?{3<~?)~D87B_jIUNXbgx௼7 13^;,|f>^i}POަr]7xL>?M}#sO/;xqǕ_y>Bu'x9~d4</H9Ci&jۯSZK =?;'91Ttn/??^5u%$Luzk wOğm_?}Gjߠ?9zwsѐ7w#D81Ξ<~Lo 3u7;x5&k;6ύ_7=zv!}G6[?y?]^3_|Q}@uo%?H<`> X/؉Z^g@SͣͿo 7GzbgJgeFyz|E&h|?gB7uS._8Kz/ :<Zn_ڋ|Z1Ƽ0 }qN5x!xv_&N߈qcG&tT렛f+~MF? <^?%gȍ';lׯ55qq͸Y|6BwWMw{4n!4u' ?ni3~>z |x,׫5?G'@ך_sayk^ ]Hfӯپ2Alrg_fybu*%xȖأ֠O6"FtbƮmCHKq; r9_f\W͸_/5W"kta9a[9dI1?KQ߳z|u#??2Ư3dS3x:e}OIAq&5H<OGڳzi } `Z|#F:s;M_T9n^Qߧ%ODhpSE-G'.UP+۫ Usz̫_ۉة[~X?F{M^f䭾7]_8GO?Mxux9!~/u@^^՜;Г8V>mֻw#_ǃj=𛉞#wC<+=[_i%O<{k,3⻠w#J~v:}BA'C7=j馮qu !/GokZwjo~MWo;m|'|\c.J h7-r))ښI5ŏ(q詧/6l&1ߜ_71_d݁|c~qD}˵[*7eGG<ΆwJ}Ë s!gLtHv&ၯ֗CQ cxv|u:?Sap7Aw~~A\0Q{vWu@fz6z~yuaZ9oG/n }9y/e^ދޏ®r?je4=#v?/4ߍu!u#KvKg O"PrTzvx̼)x,|҃zVk|z#B9u^ٯ3m;䊊ۛ%G>ݢǧO#g0`?Ys6qXdޝ).p8?qMD܏xR؏G71g?|8C'c"<~ޟFČ;v>v[9ojׂ?}3O5O(Kv|GGs7]O;8?G'~?s9#_ XOU޵羟rf"߉>|?_'x/o/rHG}9ܭ?REy[4^^th>k~޷fWu_ c?=(E<ñ<7}@ϑ[[_#/뇏SN%x{xn^ިt`rϥ7gKyne*o73?R/SF1YyM1=,y>w| >O֗:~9{]~s^xg?٪+UkA'#5~齝kI?U/j۱YrgWwe}-U'ËˋkWWty6 :oG^eLkrAoB;E;{oYN]ӃOyޠʧ^΍ o'3w}<*ϸ>ź~Э///:41䕔||>WM<)CJ\? ics-4s~?3#wzyOF_{@N.~_Z/ i<<t^|?_(}݊k+ic}O^׺[3`úO:+)bc?#U{JA>oNoͺvRS>X~>'!o+XVWa6BϙCx?σ~ s3|tO`8WzZ-7@!ugGxxhO/GX!MG{"||l.g=>St^g#/VoG^ L?̟n=yb:?{u<~z<?>-ѓzecO6rO[w^7oD's@聜{9!-_lok#!!_U~m#?ΥjӚ@?k]Cׁ<2>hf!t3͇g<"Evyg} x磑O~5tMfh N;X/E<#h7B.w/vE1n:f]yrpxtՠcG[O /kzw?q^ZށCvB~ k9)'Ks_ڬ7,75ϯ1ϼTt~$__&u(kxI؝y]u2cEVzht ]f:`6bH}ޟ]~kҷ~|PIN?ˋS~"C ;q?⸐_S9ϡkQ?_lixF?O-^~ {瀠K컎!=q;3ʃ$h^oskshM}g\?d8?? ^^}Y}3koʿ @ye|@[&}%܈S9sn%u1^s+wFx ߫\!Kd~(ƏTy/>_穠˪5G񓞣W+x?sCNW-@g |# nhMݥ3ԏ<o\d(x)Im}V|Tt~3xj{o/>BGz^xT^嚟/f^%uMO._ی~_?rg}.[cz)tE;{zON7-?,3هy+ƃkgq=.U%`=!4rz[I>yz<'@?G?`}]///:x_{͗1o#aG:]xz8Wμ֣ؕ~;Sx90f d\2UڱOR;ێ8^Fm-vg˱\4^^tK>u~ m:?Gq]@C浙Ӂꋼen+7 e|iu~&jWst;/M!ȵ/¼o,//:l75@"P|Gg?;/D߫'<^ϳ_OM#G z}v ?3oF 9?~@ў?\g-G{9݀W+o<_g:b>vO0݋Q|V9qel'q_3߉nﱸ9]CEe:P7wN]㿆^t8}~vxaGl_3koiL?ϦrD/w,?;]txw:Y~x2^5'!.=.v<8Ͽ>;#gn _[Mkk~zzW~m;| ~|s3W|:{n$g\[zZz}qs]9A?۟#<ߪ[eOg?ߪymgfAW[oaϥݠȄ [<¶7gDoW6puHo7<4vɷ͸O[q?9r_HhxxyiG[ㇽ{Ɵ =oJ%^nW=?9ǚϑ-黏+;8PzN'샐g <zNIG}3=?p/' "/K*91K5F7x-*7~W#؍?WX~ĉz(>wzk^B?okr : ^#N?'wM-|geyÞ |O'x.]0_k(iS*T-,ٲɺXe[%خTw$Ä?0^_z 9қ)=:ٴR2od`ˣV~ Jɷ+3?|u=<%9=i+m׆x!<0Ɵ%?6#o`^}?ug&S/:j{oV,KDn-]aYݳ]Ư*UOj&⣷fK奄 ^ͬw7==-goqkF7/u\Cץ?4>t7yN_f%ty1~w6<|ǭgxȝ/m9Or~ߠK~U)ݷ+~o8k?h,jmUGӛMn~k߻^Ync=[~«˒gy&?ZM80)=ͻ ^[|5]F?r| X.7J>iXϥOWnBW7:,SCw5k{o|VyA? t|'pug~;}ZOV| }'2doM7Y0w|\XO7^?c[\{+֓|?'~[eVR>F6,5vNO(~z;|D7״mcvd~8.75-ŃY~v _~fCG}랧ư;c?W^s{\?7͗$oiAߧ~̺ӣ:Ч_W돿._?x{#B{_@/}@}yy7x/[񔜮@z@S֔@_{&y38wV^wW#J+M[%?yƹi/d}Pyt㥖%׷1/~|L~/Ӂ|Na{sk7s߭n~.y^׭FG=OENo1-ݷ]o]:]z \W4/]~ݸ~okiʽ?믟7Oz+g޹z¯nZ׌_{ݟ&oq/r(?3O;́}~g:]u oA7}[1yat|/߿iݔqY]7~g 8;?~e6;Y%I`c:x^toݦ?`<-oPA W/>Rgwq}g#t%/պ<ߪ*;w*/Ѿ< %;}ڵ+G.  ?Xڼ~{{<_Y;k`{+oYI<\h VT~<`~;~rx>Pͳ}? 3.3]׏_N6hoՏaC`6כO4gvP3<.-4OoWͻ~YG^3v'r⻵zJT|c#Kq[*oQʣw٘XowɔCM~kmşny?s<x<}U|V~_}W˳sGk}ox{|u#=];ojSG1Bky1w[;Mkάkg~}_jcOY,_/hP Ӹɝ_|5K~.~$re[zYM+|[~c7:T}xtrznm|"Ē59/4踝Xҟе'ϴc^ $G_b]o֧<r>K7|5N͗u4.>Yot?Sxo?%*f{گ8@zDݯc_)OW)zj'zSZ1,6¾}3{OύnR8`}yOiυ}/d-Η͗PO?7^?{>Zo[Ko0.hm:~o?ƥ?]|)[_4v y޳[ȉ[;(=5NR׶UZ^_ǭmE5m*8j]6O!L6{COkޣ`^//>_<{5o-⫵|+=6"~s}ʣ?Uoz×gn8!=xux=\=o~+Glq8}Xwn-μX(?RY{;/?oyr]>w/m4xFwKD]w})˭?xc_J?_nXǙ,α7>\/?{m(}P֯ 7U:}w/Wc/Y|ӏo-w_jx_ƍqmܠ~obn|Kڞ}o=؛jߞv}F?1=~}?m~>K;=⡉n&x +a&z<%ŭ-mq_o!Mp(l?/e"}ŭSzz1-cW=On6 sE閱)_s \|MpW`_M:P~{Ɗn>vxs^OV=On=ORPqkK&ӷZޥa?񧡿۪g*ݼ2[M1/s廪G!OR_w~(j5.G7}.nX/y}kz>Y#-.ܼXO|^Y ^o=-n7X7G|6vSYq鯍`˯Xq io>ve~\Lp55NϺs~^{z[D}f|7p+[ZyU<˭ =w49gMx7x4MMy#w)P\M$'g򴟫OCY;[?~~{}mlquROt)Q?仞oQ|󮵼Kyvޫ "?uL~76+S6ύqgjށϾ ?o-YʽuzK]і#ݨ|yݽ~>ړL?v>=osNYu`|toz~➏XmnZ~W{@|wE z|iyk"W89tuGGc>tZ,:8zS^yken)^aŸ_KaoU?,>^lH??ot_RW/zRw޴WtOڣ;=VަoNςO~D/5׼>ӥ~9=~y#gJ|Sy[򳛧&?j|ڧMN Xr~A~8R{Bx^ V=57A7_)F#1}*d={cyZvɯo$l<%GrZr׹mׯ/|;c:[yO|,jaÎ/}]o|[^.t)+F}F6~/IU~?p){t//e\o%tMo'+g-9o훿K/7:Okخ/ott߭ {+}>/x~ǯ5|FR|&==pj_]3wqoB =ṡU8k|vEq}܀nz܋yf:ZWt-9 }U|5^|qWx]FYW^͚..?fs}U~+z__-ů|ϊny"'8-Y_? WCѣU}cx /v>R\8-z"?Tx^kK=I?O]M?K_oW~od#=~Pv=xOr \G-_Ԓ޲N|s3ZR7gH?!٫'_|#y6~gD?m^2WKmmc|+wgcx^I{x̮ömCyo\h#=1?~O^u]#>~Y=뎿?9'߽>4:q'xn?/7Ly#)] ^K[xnC;懼#g=+5ǶN=k~<~oIɭ|ͼV|u55 >}6yeW{w:W_GO=y@Y2_֗=ε|a,Qz\]73=eoY)z#k|Yuy3/mƥsMuֵ };+qKOyA1>tni_#_-ko>/w?W=?y_[c%/V;Εr?=W8k=NdimxxNj}zOW'D׿6Ƈ-{>b]?xg~q+):vƫ^tc]ɪF>֧;^+v7:G_V>LԹE'xw6~po| zge?3=_#/\xch}+;[N7=M:]n?>oX뿻,pk`1޾oL{m}x^z\%;=yz &.uIސoL6y>԰19s3oLNm[gk@_ꑴ9S~>ͼ S$GfH==4O%7z_w^qܫ^ ~8GQb=meNʳ;I?}צߕ\[K;/yNIt8W~n|%|_tKz}?kGw ^{?~E}][>y^rGʝ ߗ 3hnߥ8~k?G}ѓ|q&fG}?RGĉnntc<3ߋ^SvǪk\~^=ɗ: ٖ&Z>ť5S/H3~G[|6}_{r/4fm * {j?4lO6 }N3>|5KH9E7Kz~яRϪk =Nx)򕔃{.^^ yؗz@_kxɾB7Er+zV^ ߿H@Z=w\OKXegWtQ{W}y7R[c}v{8f>ȥ;nJY~W}@9=2P}rfgޫ4MpD76^jO+_!z"U|WD/X.nI?K{ N8O(pW~kJ.7zƕOzLw_qz9S^ ~tz}/!G>c#zޖck_%.2ˊczML𓠛x*.xzB=={|xD'6×Z{Mi ܰe!~\Ky%1rֱq^p~z'8.wg=N[n?|Q~no4ag>n^oM{߆>W= NxwM'v;݇=/; ~,ty߫ߘ~=vՖW7^x'8V>ț~Om%Z[o97}۸}sk&ف^w]EZ77aDȱ oFX4q$.cx_z8r_+t&فe'cZw==gct k6tD7?*tJ[//0xv}0qۚ)n!?gq4FW׺퇾:?;DdbչY%^}z=?/3e^WY#'﯏s)w.c[֣._ƫ[~_j7Ο 4_/ۯsk|{)ork.OJOco746ܗ8_j_q ^i]:g?_n]Z Oyן7Z{_yR?go>Wu7޷s8gm_[VOK:mڹʋ졥?+-m],wwz_WBht-u,4ϳ{]gAwOC}C͋i[8 yi]6X-:%_Fj壒?Woint[Oa}Wƻ-^ޢyW _ht77}#'Vqƿˋ}T_wqo?i%}}}W ?iyvSgx\~/1O'bWW| -ߢ>^ z(>e[ۺsyo~hs_8>ҟ~]xeCoZY{qZ;^ΟVJOY/}>Џ)nGtb~z7Zgޣx[[C%BKxnK?hE{~W3]3WFgOϫ_?~GR@|1nZWޕ1q{>q?i{<u{޼8 %GtWØDŽgoyvO%:>%{Cg;v|O<Ɵ5GzWG1OƋg ;j益>_>qVXv^=+ߛe<}` E? }6E4>/]yF_~Zٸ>w}k܏8]^׳>Uyl޼yB3-W᭭y_yJwgg53~?U_gt辯i}Z/ǷF?yg4Rm}#[xkU\tX߾ߙ6K7Z=m [z;VRxş;óimpmt X;֯[m g9ύwy-;~7X3>ky&ق޽2[[~#;N{i?ݞ}h:5.,Lp\qxFO^ntӚ|Zo]#\vٻ<(?Sʡ+M?^xc.{*nɎ:~^q;U?[M~f.œfri Tc`߯!wb/UoNﭮ#T;SQ؝gn~8H4>H~z#﫞 ޜpW4So ZWޚg90.C;}5r?[FiyoCg呛?4-:hC^_ۊ%\J~\q^Zޓ+NYz'xslOo?j<ܔ7zqP5r4qh9BDJ3;'fv.u?r)@|{.=z>'^EOGӷ&G?lƅ_i߿ Y'KÇoI?gʪi\π|8-N=Rϵ5C>vCʷfޓ/l- 5= ~zoxD)O!qO+}sMcVq0W@{[;C?.yo?]O}/L;j¢[Cܠk-N(j{I+|[~owűֿwUӒ?e//~|oy'7~wVJ7_|>>Ork~숞ggo)WYk-z(y'ʋqPz_˓[uԃ4̇>yVJ7=<,q'mɲcΊZ`g$ȧ_[;{8rgϘF?!$ o~>ȝ%8?9o/-qy~%RfK$Lyّ~7ȝvz|:_p`yeGߙz3?'t@r㋍>_8gԣ?^gxήJm7뻼n1}ӠoNgVr!oi{=kib_;UqqrU=z#O|9ey{z~xO7~I(‡QǷc?]~|z9%~r׳z_nik>{{YkiZ|qQ<:~oxO=w:`/.ջ=|~ <7kO1}W7X|R|mrw{G7ưy@guu}>]y|mto;~`5)>mO+q{Gp3[m|煆g^_U'|9~3ڗ7!_CU̿o=P^^~h!sŧ]~0ŧ->{3/o_g_)\])[yC)wϸwk,wj7z|(?8oit^ʷ{]yOm~{ǧ|Y~ϗ֭KW<>y}/$Ryb=;zn5ww4N4zEi-wy@CcOMt8(S;gG~XC{ ωOY?x@?S}=o}M^T}A3RMVbA zיwͶSӧk\<~Ϩ:Hy[ 4~t3ŧ ^MV`[t_|zh5~nW};|hȾ<[A/T,(/y~v]_.?Ŷ.#8;n OoOّS|ZIj3:lVb8CgK7tO—^G˧i}?zW_{˦)>-$iKqL}}G~ui=ݴߥ_&[}k>[|Li=aC4x};Y JdoG^Nʁ߼+^tz]]MrNsvk_7|{EF\G`=>Aox: ~|ozHWKwAW[WG9twÿKq]~|K|+z>38#=[vmi\-%mYt/4y7xyzzSSܮOc~g(7?ew8Jx\:.W_x)oĿoImj>.WGϛmzyS_@9u[*o^9MnWNbGv5~It}{7zy?m|};Z9n^/q{iE/͋q#nx v~>7s;rM|˜_mߧ? t(y;gǁG7%7OJ?S|_Co4:.<ƅmo?6޾O ߌ>؎sg6?_i~xc|ZWzKגI~O^c^z*lK_[]o7)Ŀڏm~>ϙ~yrUJ^{jw^}]|^?~A 9>ƫ%{:Kgwǵ4ehu_,:, zrKq=O/{r'S^g毠qђw/ini魋x1X]umz| |_x]{ l_+܌Ϥ_@yK'mh{gz |x%ksc=w=:G=5~1Won9tyL'fKΠ3Zw/QY}_+RtΡ-K륛}.+3kk_QO1IHotz-ţu;WnKy(6y6ߗtり.iO_ix.'A~=Nw~ߡD/b~ξ<^%wrYWq =g[{w{{ރ?~}aWG~~ᑟzf/~c6߽Vʛ:8D^ F_ Gz07*ǞRƅy1?i8I|"h G2?:riأ{4q*ias އNѼCbe~ep ~(" Nj'{(EN;l=2$t^_;8b鿕I6 wg9FH+Bn{~'"ϓŲn{~|{d&?oe>.r@U߹r6.-<ܛ`=qihgxl-8^~,7ŸU[&_~צ~j Tf9p4ژs쏢?_^6?H ~4ѯJ?揌۝gΏ띌/.si'3ᓌ-" S~\~t:)>F/vx32:1Xkt\|Hry)3p"]ud?Zg?uc5 < >>zj' OPD?}uw8џ)?A? lmG%GomWyrygMX'Wg}_8SϪ?7,S+1|qʇ xx6?;w~Bԣ{nyt̟KSk쎓y'Į;S=#(~j=~s`Oh:IS{ʱأ'{!r6~Ucy|}-K;H޹|w:=dݰo~>=Sؓ6;>x#|U=)w,dY/7I*-}g>3'?pd$)}!knjA'O束D<HYg=O3K>qq{Ze]x8[5c6T.S T7 Un-l{>{uG+'FUJ>e?i?' }XrS:GPKwŭٯ/NOts2I?{ch~yg.WsO_c59_b?FO|l1ngy7 E%_x=?k_gW>a쌝[;F\~mN9/w4Əc6ᷣ_^ޟߎs.,ߓxCC?9V~>sSmco#;_姹-$onv5<`g?wSů==,AnNyv-.s>Fe؏Oov~ɾ{s͵?$|;Px^Yɷ N l/z;' _!gQ#gĿi:݄OU?<kV6e_s}{_|'[r~>yrp`?9>=?o>sS?ٺйWk9H+8M8y~87V|wwzL' x/ WKo?zq~8g>k>GMI0v7~nwA&hu=x5xI͐G ތK9K;ίD-Ӵ)^kW[m\W>~ M"G51vitgtWw(~g|W7\kSogρ5'#yo;?l:>@+&q_qB. 8BΈ?=ôA"u62}c~ }BNCcRvZxhD~37ҿK#ۈoqIi|l7',~V|xlq|v;s BMUvSwv8n;bOMiuUj;O9PZR|ߔ+]s:2eR^<~*uw#o?=_ >gg$yO?3^v$;9Gg5ϴ~y ?;}ݤt)?ɁV3zSv^Ǐ@~oNX[gCߠݚvsyу<*ߒ:'fۯGm{|[#^?U'xsœ7~~vg_؟' u.2{OO#G[Ѻ^F~#ϥr9/.O_y]|X'M9=_s?}LƆ/M&_Oݑ Koޏ3 ?;;.7w~7"~e=!W+:=~A[_;Z}&_s>}c#?}uW;=x[{Z?=?xK|#~[ۺzN|ζ/O]o\;=wwe~~߉߀ۍ;Vnrak@ ?/} U@?xY棟X~~_[ɶ8Vr3|d^@ʵ}Z~G't)_)o|7/@ڱOOy=yA+=+]5>:o+twN|ϙ\&ʭz&8mAwyO=z] )|{].g[{g>HW^<3;pXGz; ?>>׊/GȳB_/Ө~OϿ]ƪ;:l/'m˺izx_x=?UN\-NO ?cge/)n ݰ_:Ǭ󅔿-vO(bũE5;Zы}#yQ!/Px^8*ߓ%}zXoa㟬s~ ~/Ž/[{,{KBsRuaO^8*{_ٞsEKWˣ[zeC~8W6Xvxg:mYw.O?X(?'{vmqu/z_йPqtYıCűG,ϯwTCX5>LZo<;'|??'EUScy8\[9ᯏƂoŧ__W13Ϟ 8OEobp6;K]}ڈ=SMTO8~ry#}"h?|-ȓ[IqҟvF%nO9^1ԯ~ʝw(E~&yzu݁'}wtBsz {<ѼGWuHYNSƋ[pJזGG_k_:gh ~-,/9~[Y}응/{Un)?k?zu&ɳ$ wzy?w}/+|Yw]y*1(Epd>?5C=j?טܥz{~+G3YκrknOF|zcz +,]ex_u.^<}|:~om׹PƿoL姘i7,g L7"u>@i{EIiǾ-y&ݖmyT~|*/P=IЙbΝ]I5U6/O:{;۽˺23꥗|L;4<Fz_h;=-߯ -'}ּ5Q{? ^o؎_w~_?Y''tN'ǐ7 v.ssxW ։33?3r#/v} v z;Z>;^Ͼy +?ȮxIo^y-渝 NF_}h斧ۡϞuk<ؑg?=Ш\s/ֹ}qu?\s#yq&'8 q1>I|/<=#ob_ߏ_}4s(7Y\ȳCNVvx$`g\[<샫g)Ǐ$S٥' {Z?*Ͼz\B<\|/o^\*)_R<U'a_4|G3~qM _5ao3~Py2q{ :Y_yo뾽e>kv?|D?[|4xG |O:d=+_}s̗yOΧG*-RKt=;/>KXyy n@7?.9+?o9䘸b<oǗzWM7:yr6֕\@`:WD7|Ox0xAߩex R|v^3 Aݮ,>>|OoBѣ>kcT^ *|ۃ(߫ߺ. Δڂ9gp#r|-tkgSoV=N qhu+oGi<>H]ЫOH9/z{E^Bsѭgz5|e ȏ=8秵7i{[s}ܶ{Gu[(tG{~:F8?X7/W߭ɩ ~Jxg} !O~@S}o7z<*~?*|í_7^w0Ux? AOOAg>v{65;g_a~œo!N>;佘K_ ]{}oz8Pv{D=>zߪC+~NWoPy{5}>V~N&w`+?O=0 N=e]~ow~4}qr|&+ߧD|Co:*Vr]u[U>Rr)~']^: p1/Y ;ώAӓ{< o=<|0{C'쟖_ozì|y_ޓ`@w!Px)ȳ+wۄ<|hy8hpkǻGRH"/88}^ Nf*Z {9~/-VvvO|S'|.~-O<`𫱧v7*~xF.8oU\{U޽wl/}_&~yCn@yĿl&g+o&{$A\iW\u毟Go]zxO>jӓ\@[қ)G߯}O>~G[MK䞯OO+n8W;gů79=@i|}}R ][K^}[7;"_%2?'=~{×?܄ov~_W2x'퓫ֿǁ9',di2zDpC^I?kVT~8W#eNo3+O_MO|~/пFE~Css.>_^__S|(/>P}p{sl-o3?fuްOs6unxħ8pt{Bg}yϟ_[GnK߲+Лyw:MwA<g9]$ /~o_`?}~o.n^h-%[c>sv }?s-)w8}AgOu>~~M/~>cGxzW?:r1kY\1&շ>/Ww%HtG/P~_ =t'x3Òy<_;'ϋOʏgz/9 /rg%{v*o0r)\S^? owwj<)G߯a?I&G/uK)r>D?w|~d˛BwAECʚ3}k:V~&7h揼N}Y7;DfuVc>|?<ғNg=3M'|}B@;~#e?_l!.t}ﰿn<Я>bB-!~%~"unV߯wyo y I~cg .p~z2gq{| w=y=>Dϡ$iiU'^ۣ:_5a O=9'-3L^>Oxf]Փb zF྿a#w7?kq1-cίr^u/W ~6acF7b[@$OR>{b'=o]x;k^׺-mM9Jv,{BnVoT$*^c?>اe_ٗb'Xvey~eƻ ~2pqWݟOmܧ|d?Sřs;17ϳs9~c9hq <#=O?<ѵC3_w$|I<g^Naϳ;#iyj'j=|́t:<}ixωS`_ֵ.\y ~>V>'.:{~*\?$^z~>ٵ/>Rq;I[6#}<$uZ@Tdҿ'~~tt~4ߣs)_q})ge|?gO.2~e]Z ~LtV <}N8ί wJdǮRNo%~_ֆ_}mcvwC 'jy2qj|GOOdmױs1_SMqQ־y8z+ã~ zwo^~<:׾8rKQLϥok"N9ߓfzo $?vyYZ3(~2pǸB[\/4?}xsZ(jYvxM{ /MK9<k X^β 轍?KOg2*ϟݦ^@ziU'M:~~!_qq 9N:ů7/cOz;lŽ_= ?ؽ/;g'ҋ{r{(/oK}~2O zٱ{_rO6~a_ˑ{f7~?u5_o~9ӗdn:Cߟ<%M=Y8nKy% }^ 6>{;juxlw?Sy99_)^Jݭ_e G݋kvzw<|FM?gs0ߡgoktÞϭWw᷃F>~׽{]U'x#-= _W}n;K_z-pt> Hp)G}-rU8.]N{^ۺг1Sѹc~}]=΁9~yʎe] /X9s<`{_¤RtG=")ew` v_5}|.nawֽ:/8s5_>d^;SOg/otXv}58Y/*lB=auFa-=L`4q^_V~|o+sH.+=loq{?wO~Rtw~ė'8Mp[Mo+eq:7[T ^'ѳ#y>|9ү\h곯VySJ~stmr~|_3z&ԛ;]eOШ"^z\:Op+s/W!y+\VO&:X Osy/B{1 gpk<8 ވe%_ocV{(?^@z=D}S۞gmC\ܙ~1F7 }zwv{f g"xo{.ⱝW#roOHq;oq}=Q?շw #u~I|a[;<=M-G>|Wly/<cXg|}s>ΑW- v4~jXqD'?CR^?{ ]HEoM׮Oˋ޾:^ڿgq>^bgճyqOntX<;/v6 2l{$|^M>{R#4h_]U">p8!=߰:36 ~CO<@U,R]?=W'G#{ɳ|%gcE~׹qG/׻ʯWGU< }*>w7sIٵs:vxv;!Nřn _?E&HOOwiLw]S6}==aߝ\82dab.u?p-qU_ Eq-۟v}־偧עWq{$Moeߘ#{|ScM-=ͣKv+=+M慎<@_]=#EW>8~+/nmx2r/ro_='H|6\f-`'~S t>L)'|K"~_n(z+xX!l/"@zt\c N^R`qi߉~F:%JK؟=x3&\&o/NR xB?tN 3yq0uϛ.t^y6u5-POl)c7o7 ?y/uLy9z{w۵h76xFN9̵%~ݝ~ݫ\(v;|6 Nfν{FM}]~Ow;Y|aFB>'WqCrnyV׌w&8Oė+CcKoL9~ ]I|ۛ=_7Xq+ч{*|G{zJxP;?/)O/>E{9rH}[/o\{.#{y~_DY̻{ӃV?z(]_NY3ρ ε7>P2t ٿb`m[yJDtaEܿ8 -vIL𑝐}tּuf| G{+.|sv9;>'ypwaR7'5y܊ ҼԽO~ y;k WW8|S;uc<{U]Cv'Rsdxa?c3`GcȿN7/ݛMn:0Կ߰\zx~/Qqmyܧ3 ~`C<ȋ3oOM σ;EOǟzڰ}r}CޝO,p%8pq/ߐu9>%^!B_̿c͹-e_/7ӓ<ԋ?L;扌˾e_~t/^.|7;oZyb$yKc[:o3O3w~u<]/}Yy eݐsϔp$o&x O|?'/kgߔKOx 9?^qXt잗Kι3w/^o}+w7}!=+M?r5/!}̏,nK3(١%uwZ=Ƌ÷'kʛgZ֣仙&/^;dzgȣm_瞜˅worl^wy/xUVs1[\v8zá#Y'wk̓IVV^cc]J蓞Ac ;|wYW?^Ż~.Hm ޘ쮇}w=r?)^yk4G{̙|H{GRo gsy/o ?+9,/{#?5ֹ*/?4>b>~vctw~{ޔ߫gL9Go=%]?zp~iΟC `_\x.g\^r>ORʏ/Λڕo9_g(ząNk 5|nx+~Kw`Owl;ko'}*ucnWj^O9[+p~.=劳7ӓ١g+a/8_=(;yዼ=d?'Y}xzXx2g =-ѥ~c'v:X'x|>sHWSm!Gt {Xc}E_@''~c7%=%m?yD__w]Zqa7:\YAO'qWщkyGߚup1T;s[q~o{V6~_3׳=W<`ơދC} ,x~w˗4>CdVMXrp~)h _5W<9OȯU^@cQ*Ϡri_/gG{p76,y~iqy"{ݾk 膾Uǩr"xcoߗ>1:=}ŃT;qxj'Zg+y{9*x8 x{n߻QB_'R~l_3~*Uf~s:~;u:R~`?Uقu~jUKٓMgy7tEu$W[?;݂Oov]貞gt`k=S~A<|pxyÚr0'\Ǐc!ߎ=9xjߞv78vՃ~=eq =o~վa ;'XzS.&hqX_ W=; ̰ȉ3[rw\{u^Rlě?Z?(o,WKn Wz,pS)_X6i΅u~ovhw1ߦ}(c9{n]ƯUqE?`Ӈr7/=~. Ygv}Lq#;Io?9oGltnKNu^pNt-Ovx ~OR&y|SG[:]em`LӁ7=H_WKR.TΞL.;w_ >ſ\>7t+wzJN'ާ!g7*rG u|N_k|N߯`=c-Y<G+?=9Ǖ³>Gwi RgR>fxgC^͔sO{gq{DcYw^~\5qf`~.C^G53OǮ(lցڟ[/I=Gg~?quOQn?r8߻g\|FgϦC4[[!؏xSbhcj>1n>S|›}v̟+V7*ޑr% 79r$~vC yuoCTa gS7Fz9U޸>vZ0˚z6,2{;?x5;3OE}9x2Uy^Ч_>#yo)'>C_onϳxʛN|K]7yEVeSћ; y<4^kfU|Es?%~j~S/\c ޘ[^?w}GW6:ux7ԗ'~vowE8/Qos!OWqQ.˗Cؗ㇥?Wc579\c|CyX:Mp+α5~~"gm^/F^49ƟMyb<_߾vꧧKm\|y'#^(Qyv(#ʾ|#XZÛc~?)*K^\& пCn:ow"&njWW6/ SCMH}J\5|^a}g?=gCnMyx|2sڧ[|Wy`/7~5v mc91 ^}Ǎyʲ+l]]y~vMgyzg}*zW #(:C{>Vb z'؅kg>CO}O|Ư҃$`{4zdžr;/e=?>:W;v |8reis?~A_"7Ż_I+7gGsK?L]3 {8o{ őLmG1l =Orm}!ga3r}h[9On|t~; fUJNOصM?c5EGX|^ 0i_tOqn~UIg^'%o<"O~߭~Jcy&7O;g{#lvr7dV7 ,{XTs)^~O~"?q3Ň5gtI8sG곟}DAo>>Ru ̼彼X#_-z&:׶68nϳ4<'΅o~ȷЧ{2~^!x_PqEo yFz{?~5|Cz,whlLpu<Lgl։ܗL~vEȳc _ӫ}'~Ϝs+o2`;S]t>z<+Mc=.ϧt>yD'<=?a=q{߻Lޡz)?=yo?GOOۂuO{j}{sXw᜗\??(V>q~"oN;&>/Kxccѫ%Bm>}ϕ¾7T>ެo!Εwq%>(~{sSN<;DzSS؅gt{?{E<:zi^&ΓL^Pm~Oĭ|g\;um|gT8nWmKkk=ɯxU'x]|=j^JN߂^x*tpb7%A zuщ0~CCW #.]y1?vy(w/n;:{bxy>~ʋ'lOE^+u_'q G}/Of7L֋'~fcScS]OEN>=>9 ]I}?N7Sޑ Tp~>-N%Λ/?Uy<~rI8ݪe.:IfK;t7xgGŎ ;?3'xoxL Ar l {998'su(UPtޞo{>fWG\G Wi<\unbqM O!랱yiH#)?;+.tS\~_'8D7?=q' !Y CU{Ht~U^OJ.kủޙ~~~iُyЇ'/OY|{=}_z}Xy>x~{z<ydrPʯz\G`wDn`ǟ |!o.C3|[OONt3gs'W gdDn8W n:WcA}V=5ы}cb| 9gqk'x?v`>0~80#p<_ݹ4yޜǖ= ߎ9v^n`ݲ)o:9OPysD>d_T>(qoW^W=҉3 ߏn_^os~Oϙ#y>cSo8!.yW~},qߍp>@~Tqs/~Ï Ϗ?=;`U1qhս\XiO$R~߭zGYf4G^לQ^kw/6.,>y+{ `;φ嫎[&8뢇GUڼ-ɔ>~?гmy>gw}=MV= Nt'%lo~9z %dB7OMo~ߖ_]":#ߺb7AǦ} plhD/?S:OK'o/cW=G#@><ߎ5>)k}w܃"ۡ;㝞&x:\7O#<fC9aUC#><[@েV=Gi'^cڷ!wWGW`naigr@;<&x{b/o8|?)_O-OFk.z>&8kEG.,^90[+?~~~m| gCm"ӥ+/FYt®wf_®q|a_uO&م).>~ЅmέMymMp݈90[xBz4}MZ]&8E^ORɡ~d8gf޳)_ʿwGoy?Q:7`3GZt}}'t+>r\;/ {_s~0}q7.xx-y֟2?Fsg0>}'7| Dx_z*9Ư}4wLs?ۋ܈^pԓy'':k2Ȱ/sȫ^<rx@ܳzg̣3Թf}'%n&x81q9oo/Uț!ҕfȕ=OCw''g>'ϼ;tP yv>}8좻>ynV=d?9kq~|[я[G6D>>]x,P|?FO}y(vx^Yu왔O`=C KZޟOy˺:MKrK_#>js sgC Zotwxoi_KoN=Ι8B95Sn-;G?=C/}Eo=7߭c>7o}<ì=/?r6y(W D>y_5їlzRֻcy/Oٸ=f\#t=s޳nzShgƱI|w[y4ygO~ =Ȏ`O+ }C}y~$ Dɽc|\rُSCCݑ)x?xX{^y4f3~zO riyx Η/{ۋwK}hcW{"f^C. NƗG/C[ ȑ2o|w}<]o]{~'~iLg?Gޫ˛;-Y߇#i.=<ot6ELݯ '{Nt7쬯8z%?^#v f*G~X|cgӓ;7ןt@ʛcjH7StQ8)t{~9Wv|gu wٕ׸?&}TRk=y/kpÏ|.yrOʙvSܑ<d?3N8t#Ǵ`k)gpWDž2?ݓ&뾳#m7s(xvX.o-bߴ1?ֻMvٙuT6/{2~wf퇲;ǃGzv3|wa)t%)/<(5/>z =;CbKCѹh~өѬq+u;zOj}BOaxڍ%&7M/N߼- m+ $Ю?1s^{n_6KO~4o/],P J,=KO#7}h֋>ߕiozcߟo8›c}yBqJz ~8{yA;}dz G^W%y`G\ofW1?'tv\!R^٧CG懮y2.BsͻV=~ڟwrC\?~|HC+a7.F~~§Ja+&yr ^?ٝ~7IO^=orj]1z4<=ԛX+v'uwBz:y˿1[5߼aٷMπ={zwzu׆um>_|e#q[g_O|]?y9+=Ǘ[q{=z⏨Nӎxi}kp]\CYd}ȳ@lkv-=G{Y9G?"oqBy o2 vrOM̗xy&w1A]ZӖ~g؉6g(jan}Y#~E;ܯgkq'bk\w7|of?yFqxC7^?CϏqJOgB> Tq'׾>w;>F?9P}A;oxyF;.A&^Gx:xoSo;=Ï/v{qk⟾{<UK"eW<|G[qMgLt:dψ8;P3ȉq3n_:9:iwgcǑڳ r#7Gҿ̥zʿ,ߺH"_2~ُK=9Z ?k_=igqG֗'gQ%?Cr9# YkM/?Bkŏ#qS7]Kr/(2ý/yW\Y~=^(./?/!{U<։ =#GN- K~'r}܇_ P/9Ay}>3wړ}%w&r<_1e3_WO_3qղ}}UӍk '|?uŊM/‡+.3ǚ/Ó>*?WYChc~~w.9O)?컰;yz&WSo\zgn˽/&xskg9X=h~!čStH?ݰﳈnGS3=r4;8q iq6}]ߟHvM?7hLno7oc=@ 'fwޓ7=+zq<4eϬ}l_?=es_ZF8h1oNM | S[?J%_'~'/j_ޤXҞ}.y䉇'e+6?^ah;!^:?i_~%{̟U~T^|G6?uǢ}ƾoJyanc⨬(0z/5BO)2@y<|v3?goQٯ[5?Ggq" :$73bo _C_$'ѯ t3tL/cz>1=?o9|?][:8z8F^_{Yyg|'h}̃8i1vy ߯8Rvsڇ}~_q?xo7gܢ:*=.|q3563L~n?A+?uDyc+zOԇ/ _Xg?:/N==۾KC~?gHrR?M_K}Pq>~Ϛ '$<_^oxXGu Wޗ5n"|~x.h~Ǐ<>A~wc{4vg9 jqp~y/.|'j?('BX:j69xg@󅁛W'\'8NB/F>[<ӟ䟤wE?ٞ;B#LOI{sIЇZ8򡡫eO~|}WotQ~ѫOB>< ~z[5^ yu[y]OO+7>#NOŅS&_ ~}t#Ћ;9?={0벖d]; "GaowWgqtVSNd8FpƷ6GW~jKٯ?g3E K~:1|7_֧<,C^oĭ]|} %O`G}5?}}e=^8>wIBEg+Aڡ|>zz~aH/l:GpS…ߘ!Gї/ +!k˱ O)=wy',~Gmet5tN>QJ^{Sv2>;C}?~K~wvEO@1i軏ΫɑK6_}$H~ʯ& {kw®&.4||<ڿn[΍>~ֽ:i1r&tMCG.oj_Fwk}o\r^γ}]2sW3-硎>,@yd<אɹ{Z|3;ki+D`Foކo?~'h?rEgWGnxwO\{ Cx_QyRO t$x`+\q ?qj|7>B^W\p~=XW:ռfr50oehwwk)g?'wyU\󇙟;—==z?Xz߳_6Fu8WrezD}{qS#>gWV=׼>Cˏ[_H[3GW폒SEzz'xcÒJ.krA?O̞gU-N§}`_M#M/Aස}3OU^ Xߩswg [ zus\H%ŔaGr\V]WEԾ=x)\ ~n ֋?޴[v{3%WOW~'";}3w)CŻoD^yv)"G@=ǎ7(?o^ۑAzoܭ{r>ʟG׆}C~X}_,O'''Of&8־!)C7$"W틋äGO!v~LJ+~\`hO-'^z]^Z}quk5^.`)&ZqhE#jOD+-9Ʒ NfeG1ȿ|O/;ѯ[]f8Z|gK:==ѐxٟٟ^SKr.}6 ^}o}P9zm}Oy-8犟xg┴NϮql ڜ~qoM[Z>\x;W9yygwt.C\D9~yzuOўB|ȫM>>z֫]ȼoX~s߿b rzЉxaq[⧬1~Lp73Lދ㋼G@_}wY7{‡shykfw8ǽ>jQ̺9Бx~s~=>zz5q~6'w; /]:oo  2<5tT{qn%]K9rB~' f'Whk+#|TR=cWgT~-/ƣ{]3|kx\7 ,~&^'2yYu'83,Ho=n ߢ_$W[e}{"޼sN=L%>HkxO,¡V޹ :_WJk{t.EGt%;:*`;pfu+ee7hiW|8t~˃o_ ~7|~5yC߉`u7/Rz{f/qx|?6y~?K>^o9qZߺ'<<^dyK?c+@]> x-/l#:gJpq/ }:3{nH?9h޵8J>3GK8ovʹ,WS6R۰syُwU=?) rr/myZ>7SV uc"b'o!ٚ l}ȿ)v΁ys/6r&q/F/֯:Tzͩz;4_÷~C\쎴#_\ f[ri\f<&<9;:'g݇ƾkyf/* <2nqX;t]v]W&wNbT\Cξc[/|l+Oq:KmL_4> vf+Cڧ #ĽW6q|(~(ޕvEEl5*<SxžpK_':78{bMֶn(B_ыK;+t?*zxOw_Ⱦ'{P?^/cݷO# JåzZ|~!| f=t_\={z ;7ػPgҎzz[_gQvyCmM~$^ti>~FÝ}^2*g~/=_U(襡?V^Ց~XxG8B*_" kŒI^^'yr9[֏|_ON>r%XQz?ߩQ?O|iHq|G)G'`݋T%Ùg'x=ɿ:?tP'G|Gxp`(_xo>u)lƇO/墛O7s!t?<<Xݾ~3?> 8Iv{ŗr^sYCG7֔3lϨgvy ;G~g>xEΆ^;VzO^vzyrsyá#AC/l[` ~{{OSDOs?ox }ҽۅ~ri76,;gdOjK=E>8H γncO'~B?3,_;Kޘ_i@WS<3Y T =OY[y<7}F`hCv.V=[B'xx_2|'r}xC[?!^ʹ~cn~d~K}w iݣ'NLO5u Ɠrs\[/xNcǰ# o;~NGDbcKRڷnKwy?JYdq;%gz~~?yݖQj?8ojY5΃}!wz_YS=?/#|i <.6ǹ{8k*xi(yGER9=p Nce1~qnYhS N}M^vM7_Ali~Fz^&}=c^ g$q[SGؑ7wiWW,}$f?G\IH98ͩ>Eߥˏz'²wű}Svo?o;87k߷q=^,i>wz[~Թ]v&x\l=O B'Ч?޾&:8h@Kťܓ*}#8jvK{xSt.ힱ_r/i1>=rF}O?ɱW.n_/.$Ga? u_RѾn3YkV|'|~XYrŊk6}W8B?cyyQ&8 ~E<J/[N>c9=y;ϫ<}bWӗylNヒ5:oݛJ߰_r88ƅ>#^"j\GxzǸ'.3m+{jFzڧ/W%'w{DŊ \x{U >s4ߝ{9\ sq'RJ@k#G~?z;ޖ';'?g՗[}W;g#ߑfɛ×yxQt;8pG^5m=_UGn9wuhg\b~*O+)Xx~ `#+ܽ x\y+aVc{ܧTL5U>ޔ~>,hyUkԷ6jŪ|OW^^q6g~Zkc^[ɫ}vxyÅȮGںv}==}#"y~* _ĉHt@β|b[~zP}6be?7\me_*ؿ+Mg;]oWyS}=+_v+G|}h|Ŋo?':|qЖc?K9ts C'>c,~g~zJs֡Pi@r\ ~#lgXg=c;ΞMw ~[cߡZ>W:>])/}b_Ϲ3@/ۚr4 "qCoyޞߵcWuh\8=5ogJ??Gݟ;9^/ ^un^#O|UE73M?r/{C%c)=>>ergݔGwx@O|ϺoI{>;KK9,9-1}A?/">}tb#Tٞr>`W;C+oЎ{(ӟς50_iwveַ#O劣K_n}.f_=;0l{~_x䧞G_ƕCO?CK5H7_޿  ^~|͇}??ӿ~?? |?t?:]GjO?/=޿~W*84ÿbwuol:޿w7?П_=u_oM|wo?¥=ϯrow?u򎿹}l?޿z>_߷ w-ޚo}=?5wӡ= mwӿ7~ωJ߸p4Oh~ro?gE?Ϸ]4_w |p?r_+ KaoOwޫߚWa1sr~h}Xs~'?_~#?C~?^Cg몭 ΏOџ[C{ޓ?O,4xrƿ9w}_a0|oX}\ᷞ~}W~{H++:|?>>}ҕ߳#GWԔ9Yg4Kv:2\d{j/?T®/Ko7ݽ>}o,쿶>~w?-?6W07{-1qu~W7_{oVn]A^~׿vc {soY>z 9]QC|߿8wE|{o߿'?O/sϬW{ F~zZ}wЃ4_{޳1ʝ|76$;L3&^K\b[]=Ќ~9 &~I&+'[>Sm/Xθ\-RywLu&'7;\Is8pع8\.-'&g\6n0r𩒗&MZ}ߴ^NyiHp0M"t %ۨ$y#HC6ǎLt3k?!X!1%r&F'G9<ۄC@06]}'ˑg3S3O|گ~n~?ΉXOJ7Ox  ~ ^^>gNd{jKsПc3N:sٔ4x>=ɛ ~0\^^ <ӣK /ϟx9\lxusn)v۹{bK/%=y|g2ΟxO< kOL^~Ջ^9tfCsyo~KO_.׻ |~{ˈ_/?C~G 9Pɗȇ zɟ \w%П~W^ ޘpIy=Þ _7_Z~>NQYU{G~scר_9]gdLpcɡ'{ >႔_[Ae;+ O$By/yN. ~]'!L?㓼Ѝ&a(u9LnV]4KsHc=8 @ؿJwu&X? .=g7&,|g"š$8l57ua~fImbjgG\ڸ:#!a*FRP8!y~m NcA.Aš6:$|]x5z ^x3xޫhNf?|x7x_?EgiW%u>^qhC #nMu.^~8ve`x=Bmy/^"_M角1$[[|N Oёt3,wJ5q;I6;ʥ,wKHϫ ~>`EGy xffO6ϝv>]{OH{\NTq ~>`3ڷ<O~b> O}osc[\`s^T͞?u\5Ё$gC; =~8BzS>xvڿH7Qrs[SlyuŽxHb-=zؓ§/[RNƩq^m _˛xN=N[2{WF%x`Kɏ?P18Ayӫn%yپ%K? .PEσNCN~5t_;K-zY/+z5 ۥ-eԥ>m7vy?!s]~χN'\X.ϳ<|ΑYq!* LS+q^=\9vj|D7 ȣ'.|Y\5$ʾ8+}tx*LK9+_3gQ>Ayjqy8v?hl>ߊ'nI=Q롼83mW=]IOTF>.P~Uy/?}+VTEʷ(8x" >Dž'~/=?qoGSy FW-V|ԟ 5?7EZ~v͋<6}œ^'I7G+uDx ^}/'Wo= \6U^3>6*O'}o oq^ųGű݊k_{[<Ǹ ӎn>^q=_k-`~3^8<7||Z.#wzŷ Nz`A.{b~)ȅ;,%WB\XxM+OJ`GT<8WqMf7 ,:Qq"!':ҎХ&=m74VWO<{cM_NM7y"~_ m@qlR)Nt3./vcɳ}dĕ(~ʾs"ɾk~x8(qd;f7\Nyy/8m N^~zmkOx[~gqO^iW} o^Ӿj畡~ GN{ăWA^^+~P?jOqծyޠ ޘp)?M~rc`oܔw)=g9}t"qU+.1/ObkS_˧Vl^W\yq&xm9T*_Oo/uΤʳ8~F4yd?Pszuo總K:Nƽ4q<ռOyn*XĒpo/(tܜGx:牣sK>>~[qSӹ:q;\Я^<2|MQ + Usؾ|oFg?|g/ɝY 88ÊR&ys)_tWgϭߧ-OWyf |'=~oogCɣsṾtcjFCwm^Nz}ltP0K ߭&xm~_z0'?]CI;V^yS{#KR[\6>3cxWovk<oh[_Qs=TT\\ʱՎoyI{cϠ<;.ZRX=N;n晟i< s1aOȿ> o?"Am_iGo*/s3˳%o~ʫMo_w8>X~ˣukdۍW$on&Xrc||~XYf>䶼 f_^>3q1ߒ׈#_b}[ԗf~9y4Se\u/c*.I\_;AGߩ|p緎OƀCŹ*%y)+&~My|~>o罼pͿy/V޷w%q5c/noCԙ~U)?M +c(|#H|,ǫ<N]yH{~irCȓG>CKCzr)S/޳9So)y{ZY=ǑTԳ<5nvo˩zMf叵uT"xweq8g~WL>;[G78:t5O~LioJ˄GYwq3>V=3+ObS5S}O{{>sʓiMWf?XS.6赵7 V|{_œ~z~8gGVtC<޼w՞zϸz>kӛ/[3z݉qIOҽuo2<ޡxXq,7|8UzqI|~,O}ׂ޵\~?џXNlvE 뗸[ˋ#(/R=Otzk~MSn߸~ωO{uLwqLpx=*^XTO^qU?t_DC-W>5<ry>/Џzn󝊃o|iT1F-U\óx̊qn@|.9:~۪On~xqhgOuOμGƛҿUoLXo+^y|+aQ܀28!q+zsif^ qeۀ~!;^1+~m_τ'NOɬ~td$옭[qx_S;C=K;2R(7OlO?O\N g%_5s{lύ~ɷЕaϓ'tX˜&8O~WK.}+x~3~/~squoƿ=ƍ^TRʧ>;3&) sKw:#&^'OV=ÑgtpdLO'B7-PчG ïl݅.G{uVoۿeӾуMެygǨYvOw_eqݹv4a//{;W_ɠϴ'@^@q;Wf77t/x A|xѕ{^_W]8w?o|-.{}nڑM]q6ʯr~ݱg'79<~ig+~_tSߤ\{u`/T[3U%Whj{{g%E}ηxg> ֿ>l<_lk=O}~o(:WrZv=wC?_(x]=XyOv_{ޕOnO?b'\8fGƓߏq]"˼X;N~vRu~xa??1V[;~ΊW΁ZDSpǼVQǹj>=g^ǵ~?o&X~sqi;.ϗ|d+uI֫:SvUpɖ96a!}!$$#54 NܢG(7 OwGt}\2{20{ˣ9 ''N΍kجK;:#wz)/wmG~ x!Go?E\ ⷈ?$?RWʋw1Y'+NGue)ýa7tq_o2E\NuӼsG|Ƈ"ױS^-ѭ3r_?5~\<^\ |?ցlOv@R^1vmo<뽍oǙv/΃oK~N<3U\WgcO?I]j;xȹgSy,WzyںZܧj~l庽[8\laǧ:989=qSs2vV>[{Ii#|;bߌ6{xc>ofGvW}w3U#y87&\vqތwCY/J Tw;/x'|O?H7w8V_}o?ߗCoa`i;6u W z4%)C#sda~O<=5}`Dw޹!3g~9'>}wk x4|[i3҇_П]yfDG~YQ߄? [OiO?t惪<_J9kx->$Kf| +}|nw*~5/,~Cov_ K ˶yr))?5a~/>J2y \R5?p_=_?i yEo]Q#<~şϮp s]hC_iځS(`<O9ϛ]i/ ~=wo%Ol[^8!G|#?zj_H9xv5;p˖ҷaKƇ ')>{zV+~{33Ďj~;㰞+|~ǏuV{{1}8.8Wi7wI8i5d9.oq4WHPc8ɡoq__hyPxW}8%oⶽ6>W\Gi~?Ŏ;+4)å\؉uoz=ơ /}k@dy:^2R.筕K;73ßd?~G=C=fw~>qڏֿ|voa(>7{`ϣr0֏쿳/q_ԟO+~M|SKl|Oٕuw#Uo|ڿ6ڹ>>87I(kߑ|]~O=gΐv޵~}[iǼ9wr4?3}v4%>}cW޷>XQqkpm<ˣ]v# oOn(.xO+pJb9)e*#{.-k8绖蹬/g__.j}re .N_؇(.{ϧd:үn/'{r<_^]K;wɏAO>CU̻}T~8Yku?6c>zps<;z#[/__SB( ZqnnZ;^7+GCŧwăh*{y!wO%}y5珆>M?ߏÿ߀O;^9R/Cp2 wi?T>ϏS S~\8P+|zͮ{/n0yuҟ+ѷN?ʹs0NsYI7_ޓr<'0aK?z^m'ڡ<~lsgO&/ü9Ps9j_˾;ދ~h?qWҝ |/CjgnwnރA)*קWYG?n ov>/⟤]i+] 9=a yQkM?Xڙzoq|ta/gñmwu3ރ=qBx|b+݉8?^nߏg_Snr~q<"c~8Jz~zZ}f)j{\+2?;i^Z~d6^^Aۯ}#XU>?%VNEI'83g8]|hp +:_ԙnVqearN_+C+N㪥=v5i6k7.kK;~sܸo_nVwq7_*9MƏrV.t>׏si9j7ugO~~{+n =l}Jq?&Be;=,xR'ߓ&񣎎)\W☈sMM7g5.}m>PGRڰEʉKƷRxvӺ0l>V]yZAޏѓy~.ۣhH;1Frm:ž8Y9rakkOm{ͫ}5Y7li48k5~: _JǶjAc]J Z\7>e95^z;k@m_|pܟOWΦS?Zf[<܇Tս.lpˈti7~|_D9͏CkJy}8S,. 8û߼*87xU;iv&/\8p1}qMU\r\#Jq0݋~*E?WZܙ@~U۳=x7mo +}z~G|Mj7+}j;~?yrboW;;/hԓoҧ܈~߈>ÝDc']>޿Y{-φ?JW4!oޏ{/^lO=^RL}>to=zoVf|糆Տr}{p#WT⾜'k>\=GiNyΑ_^\VҞ/=r('O'ܘxk/𣥝V4/ƂkךWG+lI@z=1.x伌uvo|xNr8gΫx/ &y4˧7穇?/O{ɟWN9njOo>lO&'58Nlk5Y9xqKCC朧kq)%/j G{6^iǹT K/~ݝWKE.?ͫgsnfJz=oG/#^WY茗15觸/nFw6vQkq{i==_wJ?W6|]N{⁈r~A{ᯇoG< =;aJ;77_/8wrnp7-8o}cxϛ#r,>wy@l)wks+|| =[z;L9x[Ov\q_; ~CovKGqy}vo `_vϼѷf~J{D\`7=zгuI/. _>^7/Dz`_nGa_3}JK~D~'~r\= {x~#5ݴȴÎ>lAd|mZVh}G/B?%/,z"Ns7γhiun/-_ _s;9ic=ou'hwr]voCw+bq'^ +ZJ7E([>NCvCSO}-^enn|ŝ;*oz/FGfӫS'xZ}]8hWyj'㟤w&_4~:}T'|OE\+}qzw&|XO nK>=8r~E:NxۓiG#a~6.y?]OijOUя ߺwza<6_ S]YqgkުGO^4Wz!/"K-;~7rz:Oq}>~ݷky&4 ǩ1.ӿScCOi)> ǵy}={95~[?+{-+1N{x>3sޓY m߸ŦR>1.y1&W{2~(<v\|ޱ;%/~P1yeՏ?k c//EGra"|Y?No'\;O􆾏ż4NGK=8alځK>>B.Sy>n<7ԯ\ۼCI{y| }qsWqV]=ovÙ!Myhr88grz}9z>c=|+JƼ+C?;Nߵc̿}Go~d5v!15}0zwq}[)߼)ᗽ|}`}ek+ <+}xo'I~Ɵz+9x|6ng7oC8{=eQ}6>LJ\7Y\.#zs}Ϯ;\\cޭܿ2ab9.c^r* f~7֭F{G#d?~cQvβcrAc~gzS|koY84i!{%r {罫s-/܌E_7=w>y ̧qeoYnua ~{=77G{xw><NH_pG}h9Syߘ/c>' .ތWo>} ߩmB~W9Dُjվ}Y{rm>KA)-Gߺ/>_]uwk=W4o<ђHN_r%cd~~Oy|}nq<v sϲl_n#?}P~E3}u?/4!8n߾9}M෱o_ť\/h_?v5~YTQ?dքW#P8z/GɌcz5 /{qp= HO ?"'5i_}1ʵsJ_!W8K,ރ~ /?>mo4G|yȥ~akʭ~onB՟v_b#YC~YaG _7T/Rz9/ gc73H*1.+糆jBR\J9g˾aOGŻ/S{7#_WB|΃v/2)~&myWŹ}Mq[sy:xQ߸xdxhwr~'W>׼+2vSrhq-K=7\?\Ob_ v$H~o5p=/a7}|gW}-.~{J.ߣݓO|\Y){եzVtd^r}`_{W+N]}\](|o8]ҕ>T _]G{/T>-zwy?:w@xkYc}x{oc=֟zg5N͒in~Ck vPܛ8T|I?W8tZz\y\rn/vZk ,~'{d޼zo\W>{{؏r8~?}I߉=oV9/^]ϱ(c,C~?@O9Kw~3\ۏ|{w9]J?nk_q8=?'{r}xn|>z>;G-or uZC>j((<-=Ʒn{îw$7/~Cŭgσ_8e?>ٴy=;iDilo^Dv>]꿼|\7_aoFWnffءҕ.>5?xn4/hMCcgG|̼~ߌ Ɏ4ډ6ܰsyO_VM|vc~yM[~|jWT\~;X/<뽳>J[t2_sH\;9=kK NӚ37lH?tmst}z~r3U#c|}a~ƷJKR_F/P~(Wj''WU5 z{;ah=6~&x N8jټzS׭y=߉/JWUқ=o+(?$ډx隷<~~JWu\;+㓞c{UToڹxn^H9A'ҕ~v#Tq2n|ϧh7y-78Yxsn[9_g߭W;nO2&/K~K_N~_l?c+JF<s̼ʉ屃Yr.\n?|+Z}bp.;hޱԗ'+Sy$nO|i_JQ)>&^Ywyvn>yl/gw_5זaڋ~޸k|ǹ=#vR]3n.,Z~+n+OE'_~˔ۑRWzfN483>OqOzun{kq/)1|¹\̽}y܇zNRow. 4~ڗطxkSU[V؍sΕ9|VaoW~A~O.wq.޹AYDoc7}.nk^ҕ~v# ~_'9ÓL}!Hy~'gʫ(ym}ެo7?սF)Gy;׽ߤ;zJ^EozW0&/<{wQ_jM]i`/a GgR= Q7/[F>cR(WG|vKO84/&Nqx庍^38PBgg,}_e\v1>sȵ/#֭>n>ޣG9'x#姝Xt{t.+6XWݧwdrq7ݾQ>SߵiqOnB}wk:b>ecp;Pr<~pr|of|Dž?Co_\J4J(|?}ƕ/;a7Ό/vjWK>P? ܙq Qx)?ko|r*n-KA 񿽲JP {?p<LJLz8G ~|rM?7y.Qzǟ~o{bs PpͿ<9\~\不CzϤyf!7eߴҿb7?|̓: 7ușf>n9[_xu^G/ѓ緣?z g;onu75g zv8cDg` Ux|];urv?EW3E=S:%~Z㳥|㤡ysg]Noh9G#F6W~緾}n>) 6+C1*.&pz1qB-oon_f~yu*zﱫx`~o^̏*L=ﭴs+- uy =ulNH;*n%H~wqK9oh6Sz?m|G߮I۸s;zJv+ߢez6^C|:R7zuswzC;a]~|N/|sT{^y[:7fYOySgmKQv}0o_A^=s@{գG)ZaqkWσF|ak]=Rʍstxgr/.ކ]Nq"Gߣ#O})gF=C3<]2 =/ٯ¿#sM9ݩW9.;visq1ޟ]f|įcf/vkȣ:1ݭvȏc_~(ecߢs9;sKC?W.Z=$/B-(wz='*e;Ԏ~6#(/h-v><_~0pJ3w&ƿ[{z#84r9>?n <1ڡ{NyyzN󾨿}}]>wK\v^s<}:;~o<\ó3.ׅ~.;3pnwک9.ݍ<S\VnL;쭸ܧޯ{1/O(\s8eo?ndˋiix o=Wrj{§\c}(-M]sv'䚜{ntJ7 w~zm־/fg~/~qRqǢŏr=/#݈Mƙvm_ϩN;'Dnx-v_:5n<''?׹wO 7>g_R`hz6pml?-ϋoH}qqԿG }87Ik?,;gc~%߮M38BLZڼTڹXVWV ޥO#/NҼwxcac܇;Cr=6tw1m{K8 Sv;r:||W~_SşϝŸVWd<ԯ;GQχ é>M>^za';Xa\|9}_Oqo_i)_\|lx׎3o ٍuq#ϞG|6`]Ʒ^hIz1i/+$^\\=8}Uܙr S1c܍zg9y}d*<5yyWW{Rv?}7w0au>Αx.a/_>]뇯>\۸G;3~Q\\om_[O<9oHe锳_f~yNz)/q؝<9{y8BrO_)k=|(?u x ZA~5=gCk/$\"<kqtz=q?3q?N_ﴧK=ܟO+#BCompEدz[ϤmQa\4Oq?=v;_{溮%SV= kyA!nVQ=}nXc?C_]?^a>Zu<^pJW {yYc#V+k)m{+6ƟsY<13;g>yねϛ~{6^C170G<(|J/Cϛ~{6V/4ރ!Gy?ϟkW]鷘ni6̏x)'~|z|+]b7쟽jʽƅ}쾸kӷJ8r/ h>BpGڳvn߬K_AҮ K~);<a{4-}y'~i }ҿu^!KE u]iQ^2_Jĕ1^wWO_9ںeފ'O_\y<huoŮ&y/z٫BK~NЯ{5^n#\SĹa}I9['♈8ݼ7m_3=`''j (׸JC#zGM??-}\̯y2?}YOܑ5y·'C͓8!xBNvrH;Ο6{h㥞s򉲃#sm9%!ƝUR:l\;o~wn;g^{!Ӿ[oqˮc_]y]\#yn1k~o|㻳>_yg/p3/9o^^ӫ ?GDo_SS/!|"Wx޲yc#Oz\\3< _v%fCg?ORN'?8/z4˨2U;KhGNybf|5iկOJcO{҃*Y)" ~$?cړ?ƨMF͟7痗nl^('}p2\r|ǒ_MWG/T!oGEOD ;4O~-Gr!?x%r|\Ç3o<Gɓ'xוu|D7iJWgi193^|gk%~,i煞/6O{}y#]7毜ze$YzУʗ]ЏnGzC_rks#|.XyD_M?\<|>`ZӣS~^ wþ71xC+}󒧜h}便}~gY~_L/4=H;w3.ߵqa'Go\_կ|z?.WLt,7z.>l}~Ϗva>yҾHgʋ*)?[^&9!Y:1M+Gc??mӟyon~{y7CK?*?WJϥIKpϾ8?w~m:W^ʵ|/~So?h&ݾsQhJ8ӎ |?w A~cPξ8 9LwM/B͛񹶯nM0~s?z:vd_xI;K篦ꛯ14vIMx Gx/.%T~a~:zƿF/GBC~e \prq"s]˰#DrW~\GГc|Ωq8Gx/p&=j8C~cx}~gx_Ɨݧw+$ǭɦ$ϒu@>cOZ/m _rA_t؁^TxVwKf;ϥ{SK]7=}+}_S7842{k<_z?Ծ} zo~ǿ|vl_f*nw=/+}2iʵuGpwvvcoyoKic:Jcھw_ڗ}/q+]  #&<-|֕a7-!G/4|OP_{'7珍_w'R|ڿOpaѿ+N1zPhB[k/>iQͰU\gSnV9vC_/-z]~cWׇԮg~1:Xڰw>xN{ߵVY7W82 G{m>M\˕-n?=a}DWR|Ǭwuio+]n^/{ȷw?g8<ף}cxps7ftvnVhK?qL(?#\MZ{O}5<}b/ )N, ?JWkף}eKkp<)=pp?Z3|]Gq|Ǚ_#v ~na+xn~ׯB͏ӽ8g?3)2r|^W뵽Gޑ\g49m׿o k~嗕w yp1sM/|pGN<ء//\U b. n;$g?M{G9G{KYnܭ<#%9ι]7~`k5u>'jG_ÓM ;}6t[S8uvџus5μqC7pmo_g⦒|rO{u ?G I#~v̘/ǻ}xN:5uP_ }G7yR~?zpz9-K{8{={s;zyc=bGj'yW|_Kr\5}nok\/e^UO/{}λ_7nݥ1rn<aΏ9e߅=Gϻ|CwTcy6r=77&n߹n ŵ~WrL}%_z>4n)/۸Xnϳn\z}O'h~c':/N_{\.h/:/|]WqBU?7y<ȹCMk~Yn<@vo" .\p:\[ Ӹ`i^6\EX\ɣk|㸥8,:G>W-̟3N9 ϰcKx|S?_mn 6._i7r#)'d~?_rϸTpJ_0^ڒ-"l\Gň;vʋk>eSk9o;v~sRVOr޷8.ȑ}gI,7v35>Z?qf|ƁD7r#qa75_#q"x|nqQ,Vmvޘoqo/zkعI~H!qyh1v^{^{t}Ss\mʃݐ:91/S>}~ƙoixzFoȣ3+C/ҏwvn } Ÿk4s{7>Z?ky}8Owu%#P׍gv|=yş)yoϸ⏕ԯ\\s۸ƝJ?thr~7öErG7~MqÌ3׸)owx©)K?ڗ_u)_4'8xn)O3om_]ȋ<LqM9?M 6 ~)g!CH{_ßr6ze9io[_7oY5()RO|H_ƥ^<j~Q xysigj~֔h7{?~p.7?y oTO!Em=Ӹϟ|bԇz>0/?rn柆5oWs̵_9&_evɟ3vrK؇vS|q<~c8 ?r]Ӈʍ}9c`6%N,?#{~)/+zi;z=i@'v}ҿ/[ìsq/!=ן%x6t=d|{lk?EPT]-82ɽYO'szsgŲ|Ow~Uyq8?Y noAg"}28:Z>;cGys[7l7/.o'и')kw{wvy2|x*?o >g~/GNzߟծҾGry+4|KyZԾGg|jU{{#sΛg׾cgw7˥>$fa?}͇kz}<׌8?rlM1y[7l7p[;y-}H=8+tWl>/>տx5z:/cWo|֟j#ya[zv{[7l7?fUor]m~⻢mmO+zQbF{yMy\^^^Uks?ކKK~) Ìa7GWV٩TK.q\2G;zQ|zqrv- r~=k9O_#ۼh%W;GN;~gyye9c]7l7GKG~cgGSP{iyR?NaMڳw}RHK~w?U9pk/Efeanl~MIC}w]O޿N=cn|܌q'JkGNI8ܟ>ϱ#{ǼlƱkq.>RRξsūWQ,5O;ş/*Z{7i>gls9/7;;ƍy~<8E|I{8%pU#_6Ed)Oo#N į7W~:N~ߧ]!qW_"^L??q3h\6o'uBF]wn#ma$~ N>fpWǏ_\ߕ=8M׺˜}r}x5p/bSoI =9~禧SNסgUnv#^"; n>~ g6v<տq$[}s~=z_!}]\Xz~ ' >_5e=n4/m7ɾy >Nt`z"_qt=Sg~a'{"ּc==[/~:Zocᇜc3znOoݯC);J~#~jG3=_nΦ3䢟kqR8}z$N\ϋ {wS{.C㓜9H o?F8~OfeMyo,|5MnFu!_a}2RZM.ʇoի ~羢},^DϘƟS˜ozHNok̼\|n\?ag;7ߙp{ڃ[4ذؼ<忀*..{Csy5#}eO8_;ЎC_zyC{<[ꏟS)q7gd㚿Zw{?z<7CYɵ8 GR?>}3_;~RL{5x6ŏu}r&ϫ)Qi@|u\C.^/G7n/_n?i7`7Gи";buSC_'L?7n%m0OIux.5H< _wf;oK_8.hf!?홧1у17d3+Z9_r}WߌGC>F/˘GY?E_y1O\!cMїƷo8ivozZ0ʑ帬S]COFSOO䣡'|Qw1@*X~~2}v-76sڹJC^rpgVœgq+~mqRN_nΧ߃޾pk =ߗ~))_yyu|i?x[;VnؽyiqzĻwk?\ʭ/RNq SAOu_rOsm?eCMۥ_,'GmMӯzh#/m7# = վ"}b»~7W_cqv> Aa)g~k忳h^H8㏟ξyuGz~Ύm3^ѓQri\h1Y?ό[rO͏v3$?CgB},<;%;S2JM 9WF=XOqvc >O'zjPooiinWR'O5~?YC0pK)w6YE;3qO)y49h:a{no^Y)>9X__=s^ﳟ[֕_qүvGx-h'qayѿ@q󼟸ۑ7g\6O\6f\~5Rzse}o(|N{ڷwxj }}}#gv)v}6ZrnwBqh~TRbz׋+c/ڍxo7mi=#Ϲ|Ok<yVd-*zQZʘW~(R~Aw6_5yNCo^_o?^7{;moe<#JnC xQѷ'/ gO#||yme~lgs.w\y=Oqױ9-G/F_{TԼy}{P=Pliܲ378޿{d毇+qV~3|@.ǽҧQBKy8TՏ=jPx(st,';:9g}ѷ)3hdY38N/ߛzt#&Ў+q/5^}8+}hp/=SؙU f~ޓC;>;]vI p6rGҨO1(>>xGoihzr嚿>O.uyj/xJ&/J=y_q<<]rʻ?C>}LN_5Kғ׭y;{|i)#V׼o曞rZOi|sM)_<\<Jw&x1Y+l<ìN{,;pC'p/~~>^wP}Osg5is_<6|Y7̷ɭwc]^<7~_+oIybW֛wXɉq~kO^59Og&]{GfwJz_O8\i7I{zr|?KqmGy0P}Ћ~7? Ghm #yn9${IH L%z/r5N߭8v;w0 Ocű %k7ߴcyooڱ_C_pK.~"3#Wz|yNڇ')ފÏ=w_qpA G;d^|t.R׬rH}]=י[Z}r<5ƕs?:;yZ~.MriǮpq3O#yBҎkB"7x ݿzyU?cgioθ]K8L-sK#g{wF773W!՗ܿE?] O5W~Gg<7%`] _^珞9o~|ԷJ7^J{ӯdko܌)^'JP;#7ސr 8)i>RR_X?OH׸()Ͽ}-ks}}ȭ̳qVx28vĭ[qO_\K9ׯWq 䇲_#?}?=hL^6.oa~[r1.Ky83䠿xLqYzEσôkI{NӺT?u8?۽l|n<,}g %ua_S/n9?G{X6x6Nyk{$%O§}Kr_ ݿ>5~vyB3N{Ǐ+k˜WEO㟸 i~no/ۯ<o/[<me6^kҞڛ5~^葼{Foɣxy6yhfo>ZvL^5\oDP>V{rƽ/h_\wz8_-oҮ߽7_];C/v'r9=뻦qӾ7߫0ƑvΧ~dei;V3NP~ȉ]~ʋ;R|A}݋ƿ3^>o?ڿ^,i?C[>ү/4.>M}}?G_~u|OO<}S<dmx on߰_z/x2=nM_9oc?qҮkr?~/WK?3T?#ɋ_~Ϗr*\gNh/Sr|w#73YABȽCe O y;ې%u~38wK>vK\WC:^ztiOGBzKp_ʃ{=o^F=;:K~cNʑKj'x.|}N4cg\-2g_ D ~ni7{'r%}O{bWӲ]JZ=(n L׍\]}x\4?xox~G߉{ai?G|OW5ޛǹ>to5?>shc=ܶt!ٷ_byL;~|7o~ ;;/T{<\<}7zW۷~w]io_ypz=s;h{q~_\phĆ =?ތʿ}o<'9y^WKk޺CeKRכoOs6h?H^=^˅[7Zkq9f=~ݴq? ~tOWy DyO7/3o`gm*+WJڙy]OWʇv=Q.~H^ϙ8apӴS#~#}M3;>kw}Ϗ+8%ߕm[igΟЯ[>GڏsEs&phR?wzݤ8|7cSwZy;{ڷnϟF|6nX~o^\/r}3{]siJ~@oΪwqfg?Iyswk~ڋ-+}6Y9Q4Ehs=.sN98񛼘3:/8~6#gz.T\7j7& R<_6'SW矗?G,?PosMpmVI?_Kc<8pߴ?WpA"v4[鷋/v܌9UXpy&a0Yfc.p?CvRr?vs֡8a.ϱk?ZӲzWۍ x}{ e}cO>0EuK=>ɸؽap? 𜭿 x}xÿ_H=p>=|[{,C8\{y |iO/-=oobګx=,w]C{?.|y<'gU{y8P3=;/'~G3?G9}_y>[p.6GSiOEn_C_~~=gʫygdڃdž>_۟;zCe;+v-!᝝nމ; )\; w|CᘝG9/[A'_|5_ M!+vo7z(.-?0ɸ0("?$ܲm7]wv:mԟ f~..Y鷋nyP}oz3ε4s6^jyύxjڣ9|Nl7q-4>|w_-'y_IgsOy.IEr'#RqΝ5Ox8=Ocݔש?GB\y_=/$wnZ\|ag؟W~}G=ڳ_qʵ8O[ϔAK:^#=TO~ߟyo Op|O-?qX!įnP/wd:.Bq17~܎G\><<~>u0㇌Kzkvr]i?yW.qli)D_?RCtエ^ʓKe} {w_{u\<׍cW{oS/v^{G`7vOSm; /'~O{{fύ]]J/gH@K;\ND{#+CÑ|b87 }w|;܇|76.vOn8և>[' ׂO~!.4qτ'nP8 GڅKGP|>/6g.iշh_~>u妾nO;gCw+}mĩh.F|7ΠV_iO\4>a5ť_(x]|qh<4Jyø%}h'Ev+}<7Fr|ǙxM3jϚ˴4_i=am*|a^SS<4{x̷h/sډ'('j_ԇ3O}?1/}k晴\~}ay(?0_s9_ћ'oq]ѯ%@'1O<]W ξ?Ks?뉸'߅'u16uM̛r~j<ߣy7xe<7_8B.c|Sa^6?rpθa7{K~9X]ʱ_W83uX|B gP8}r_uiSiytv9bg=kDqsuGy|!?lyyyμ~me9iύyxC K.z'yǾ`8j'Neޯ 5~uOP~Xr_?:}hW=C|NAcMťL{:66/v72+}pN~r/^->G㸠iOyɡW_E?_{ǺeO+\0q Cq~h}q>|W _㚿 F}ㆿ>4n;cl[~;ӣיѮ`^όky+{<7Oڇi\7}O?w_e<;S}#pfp17Gp0֯@ŇQ|͐+|O 4F%|~9vs9|+r_Fٯz[N\4׿㛯By|k8|5_&~;P FޯF_oz_~בsH98 㸡7yɫwuor5#;?מe\nrʧC+K9x2Ly|Pۼj6]GViC.Mn=3/co?LƗ~Gnͻ8Foyy M>˻~cCi<;{JFӎKß|}s\n:_}+ r ;9 ?ww;r—y7mk1W_מv\nq =1㢗7ZpG0~n}lKsdGx՗|\g]r}oun|зkcK~q?\򺶿G e]vX=ҟǺ;:w=+i?U?ԛz3ڝyw]u'G{XjesvuX=MEN͗\7Z1ѯNX߷ZO{Ǹ年{-!|2\jxi̯R|Aܿn~' .z 9;#Oc=^/f7"_ߋ|GjICG2h|}_Ǽ޳_dh>x4sUơ_oj_w17~kۣ݋C^3rͣwȏj~FEnϗ/۸i|_6)?q04&Ly=ʵ4wqnǎ>XkMǶw~ܟ<za֨?b__>Qq#?(~簏O~r%%f/ ? >|Hq./n)+\sOp<5F_\8mc8?'<"?hޅ?[ -~e;߱WԧoocswnR_NC *ܙ8Ttڭmx_J{_.\ *WC?Yõ_ϹtGp#e7b'nu*Oyʼ_o(ϋ{>^߷ynay 5>UyǗOPx8P߬4ИS2GE!;߼c]x{fW$ҟ8}{N>"/1-'}'y{\Yvb7wFr$8)?+\Eގ^dOtD. _gkyo x.|4~}HrПqٜ'gs}WiS]zYm~/.k{gz}x׎'NnkeWz}6xzŎ2c]ћ73/ϧ\ha=vަ]\B/{;=4~2~=Ok=B3j2-kwk}О 6X]\S˥^O]Lzz᱋o?{ʧOSX|ڦ=oq/Sgąߵ>}Wh% >ñ~vG_i~wx(\K ?'yyWB'.' ?J38ŗc6~@?>3󏽔s\_^z׋ɼogx9I=<Œßq?-O6oَvZn9rlqGO8iNOϏiG}rGpG1]ӓN0/bݶEp\/S/6G1Yw- ٍ+мo{࡬o޷x?{i>sBk}:w-p^ZߧW 9׸z9o>zZgҞsf^IS7w- M }a7=ŷk\6Wzw]e_trXJ;{5ރmQqb/RnqEB<]k9t_nf2|'wnqbSN~]iuyO/=y`{>=q{vġk5~Гݬp0w5򃊯Lt6.Ԋ|*iቷ.̳Ⓡ>[y׼#^sM{^^Peq_h7ᑆ=y`w5^}DC:k=Xnً%Qqssա/g7[?\Nn;kD ?|~gpG^{M;Q=>p;??k=XGa79xv t-~Y(Q've?s-keQS?GO7a7iG_>'n?g{8'n}K)oDS+ϑrSʧV<]qRr_^45.x I\ƻP/+Er)ߛ?*x:||f^8ș\C|/r[O!џC3~w8x{㷅FSao=k>cϨܟHoxG 97?XMٺj}fOq7w3,}jom\1HC9_;nGKy4x5*Efipi/߾#s~ӧM^܇GI;+,K6T>%ȓ8oާ;Ӿj.7xBiǴ~.<h=g_K>gO~м< d>|ڌ.~ɾ08inGiùy4ik^~mKwTR~~_[ ǿ.ߕ_|)J9yjf93oڐ ['?~և>M_InrM?8s~y><\?~$]wg=z}SS.xG-YT?I;fS~YJFٸ-QoZY}xvFm۴j7+}zhߧ}4ރOy\?rGj'v$a\sW~4f|#P?}߻ݙj7+}zhfo4Zo5pgS8Ξ? {{w-v_ yZCo䧁/;i\? 9ݵo3JW$sq6v2JegWJ\:m!\;8k;>@hx'H9aKf}'nEEoq%->,Vę۲_}* 9'k:vp/xE&)z n+n8;|%;>ݴn7Z}:^!=%;r9 xKeʉ!<[CppcgsZ\砸cp>׃ i/xGNŷxp{qc9#*\Dq*p`3i's7Ns^E< ϵ)8#']l;ʆ=<> ~s;]?Çvo{r.8ơ~6ڳ$Nz}ɟDΟ8"㹡Ω%.0p2΁ UO5K5g_/S:ϝ'M;g;r~w}ri9w뜚#Ƹ[99:'.Cۚkv8֓qpg|.F>_oxe$.vԿyqz٤܌Լ|65y;K>ύZ/Y?Ά^s֏Pg?=,(ܐ}Ş22ΞtRuܙ8Ora79#XL{.=z<>;X=Л-~N9WF|6ӟE. >kCy)ߎsFʕ~sM0z^MKc}4a3ZS^[9h7~`D}>7/2N.[=?5`vH9g>}uy9//iR-ym|}r__ո)/-䰜#NqM>O3c9|3ougLjmo9?rbq#Oq|'=j?y>3?.|=Kო^S}oy|7^9}/|}ܞ ~~㵓f Ǵoz5>tݾj gf_ q)Oonޗo\G/ھ1?/#o[w_P|k.Z[|45ԯbM?%s?0_vƼzG7/lT{(Rȹy"ov8ڵt;{6l6lGAv#qڿ_y8gR7y>ϰvEt?|kn:3?vҕ~Faqb0ؓ0Ԭ{<\J$yм𚇉z?ܲҮ/oʮv- /Зy}C/sK?ze7 +]闲93?͵EBjo ۴O;{fO>}vm~q~ kb?~8Aui}ɥ|w~[k8G?[u_~[K]e+\>ω~/㚾ԃ *~HPkJ>EGޗ;U.-je{GC^Oҕn=kҁ+ޯc'DyK=jo칧weYC=\Rq2xZ9}9{͇5ߵ|V҇ 84_9:a3C޽ENQp)xIBOSOY2?ioz6W}v<֋Nn,oe{Ή}8fo)o,:vߵÞKzyOKOȕr~e]?"7t?&~ȵ^ߛEO >#o{>+Y<9a7}MOvT9X{C_}υO3~ʼn:zX;q#c/糸ȟ\㊦uyݼǹ?K>^vpޓtWz.Kw2:?|ZK)ߍsa}.vN9A/ yoS}W߃?!WuR.ŽO*!GW//YwGBݟk ~<3~2@^}Dn^ysm{:8󸾽{ ܢ!G|mMoRIojgپ}Ms ԃ#>;R~vI.~煵.9iqx'sc~9PzI">$?rr=9[x\?Υۋs-qŗN)\fCogC{RSw..?"vZg:y2?9^P?Oiz~ܬO̓b}KyuJ.ևKrEw\5n"}3_ձ4XqSдo^{_|m\vkw|.C ҰƏa9OSyJ$z~Q|\[\oz1W3'i}4~c_7IT+ nfB#|#ַM:3iz5s__=V.(z5J>n/mAz3mz>ux.96~臼r ~= eog>垧 ߔqqȯ8 >^1뚞6~{q!|iO&q\߅qMOzź~ ? ڸyr^m°u~<>%ruoטWg][l7Gg~*>ζDG\~O6ҋ=;üF+WC ;>KTjLя ^񱆾#Q_\3A3k5K9=뾱8JIٛ/eS_qDZ's_;E^i?־eZ+z~xg+?sޟuĐs?J_S^e?޾M~p 藿HGw~Ki׾<sw|G$ל?Q!>O$dS[Q\ i׿aDOGw_7OW?9{^ng?01q7S|5v1%})N2x;GZ|щep@/RRp >ó p$ӟ{{SyTj7+}i}gv?{ރmII|E}S)j7+}ziqayq4a~}6h?j7+}zi\<5~P8+~|mĞӆ·C\]B˅-<y 8OOxIk>VG?i+G{_g泾5\[I0/܉kvKwZ!nwnV| K8JG.^1x_z?:;Asz9=)O(n`Esވok>V}0ӊ#P(߂!9s\JRn8~;iܢŌWn,xq~~iyqNP>7fo{z߸\J sT=l_ϑ4^ؙ8fz[o!ycW!e_8bN}GϜ>_nsD8/7W r%ϮոG~;hfW(]#?֮MS8#vJ[y䉓JQၽ'*֙Q^ԃ[>\+?IٵVw *܌Kuُxg]j_98Ƌ 7zD˕tv#n} ocf?0ėo~@vhPsn}ZKq'Ͽ|l׳gsۼE±w-vs5kb⿈$8;/#b74Vsuˬɥ09uFxH7bף7|Ѓ ǦAS9cYG>u@-:CAwp'A_ZeO=8zy`I='kϑOc{nzn\󆽰sjyҕn~i>CŻs=z.ޥ^~GOަ޵ Zn+ndw񔛧پglZ|wz~K6\GoFE__8T'm=;x+T<2~)lOm~m ~G|Wrr9pp;<7==i?yO m#WyxjFuÃ뇏E~m|C/c-.\Y\[٦ytog<]rv||~>g\<1c./_W-yKZw'q_șg^N_)wyu n8BsßQ;6W5+3;{?vmK?h<6.jߐ<+F.kuźWr_v_/ϻ_Q&̋Y)oq/|<ٕ/=MpW_9]8SŔ9~~WC8KC偄;<O}|qx1'Q޳wW<><8/<||Pe]a>ԃSC;f|pwGz;|w^V: un~6|<Øk@RLs9i_yvv|'j~|W|=Χ_վǠ[=jw7=>5*BR^ܪj;>~[={>|]5ŷ S/8Gg?*c s]o1`/e_l<x%톟ƉqI// &%q,s\gGz33_I꫗W9aF_4h./1.~jMyhtrǻ;[z=|r}UA;9ȳ~4hǔy{\}''9i{yՏy/n< Z~?On)wM_w'ߏ/zGuβ]O|s푞gȿnMy>wq}/SwԳn;[}OX;yyyF-Ǯ~m}|7(}38 yw4鸕O}qff7ꛟjW{rF#+s嵫'aGf_䢞hqٔӼ_:=\{v#G#} |wG9?ѿ޶g?wNGSCj/;,&Njv}/]vc^^/UyU/=|zΓ)?}9'hg+Oi/;>^+.]ל˼K~ޜ|#}G,>SM'w4.~zvٗ#o3|7k/~coڧ?eE?iq7Wl7-[{K#g6hǼ/Ýk``ϣ]$?q2O_w:'UӸy/ xuPi\/7>G".'>?oe;9|,__h/?oP2}ۈͼ~d^q'oS?~什o]w^[?$qsB??x~O&= 7;:r?֝^s-3WF7VG^#Wvdp3Ỹ!v;t|?u3 9SvUy/zߑ{/y}TOr=D~ַz 8ϭc?=??Rӎh7C\:Yus2Mvk<)>.zO3?^GUy<y ޣMK1-=~N=<__ {rg'?|x~..Nw{?yc7y49= c!Wl zی%_+}^_CA'q}|{S/|J }k4}'S~?;Gr<"osO{䅟77Ϲ-nz1s}]Ӽ4>tO}G+W_~Xe_v/μnJ?5~Zn_!ۿp9#od;.ox?F1uMծ>y,<=W;>˧~ {?T|ziX_g3~|ֿ>?}iG4nͯ+냸gצ݄ 7x5߸:hI^=m ֩)|s>AڴG1ȷެƃ8SwV\__rn\IzB{gt-^Xd7CG}牸h޵|I"î+~&3:3qvO:='{wGϯwԯ^)=X}_=JkO;g;"_BkS/Gk >|'}mIrgwg9]9sz{ϚKkqOf>Q 5oT}*huoAϥ:"˟/9 +9د/~IiƉTqZ/tZ\3=Gk! ׍Cyz~>y7_#o?\Oޘj'O>r=\I}|z:3CNF~]Nm|£}< |??/DN7/ؼ \y,DZ'{3Αq:mzFӰ.0e>G]4NV+]W?S~/_Gd~IкSE;EXwOJ|}xNx|d7ޫҎuq/884{tnL{ދ}+Fʟ<8ە>ٴ<8w+8*zcOd㵍r<^.G κ{n_(+9F\N4wJJ^P$8L_Fŋr^=.ߋ.܉^K{'eϻ'srٴ|}Kbk^rh\tߴozKm7Bgu(^Ʌ<+ros..֑>ٴ~7g;8?RZUT>K`ɟ7g~ZOh㹇ҔOև>GGwVt>X\<?"/8\m7{/_o_srϿԼ(~ࠚ(o$`O6EoW~%+Cf+ Ҹ,6dL}Pi_uwx~+i!ě۵>N54Nٴ8Ԏdw{rŋKOLG_φGSc=i~gd]z@:r|v~//d5SgKi;=garhok^'C'|ō5_e1nLS̾]ק+l~2~{'Kͫuj{"PruӸ-gS8RЉ<e;xD?qhkܽ8ry\wo^N'o8EFCoRys̿kMr}&Qq)#'g>7n`|}4yʁo^s_@NC.3Mͻc~rkWnzN=? r9ۛߛw%uqnySN<^ڇ"|_>GW1ùyr~Ҟߛwgwoqfu#Ճ03s4N]}\wai|Gcye/O3?c3~iʸd>[l'o6_Ҷ}uOykfwv<5nlͮ>rvu.!gϸx3~GC3weȡqA>TN~o6烈ͻc\>Rۺȋ}·7v2Kuθk!Y/ۭ/=WsH4> gKv׏yV}=џkw%&З58K?h\t>Mf׍cs$DoҞk7sgnǿqA17eeur?ay/~OOkG5^=?B=A?X~óiɴ{lvco8pc;$NW{ߣI?|Õ}1߄W?3KsY ?,=?|J MSfWy!|>\m'BO?-)+|ww[']JnZu鹥湟0,z?Zړ>ϭ?|x@KQܜ6/1]O'{1=zP+ߜoݵWt{Wez:O 2qRqݢg6orx4MN\oq~qqZ+}hS>M#8l!^ag86bG{Ҿ<|o~j\(ʏYVDzq[ܧkLT|r[ŎnJ9SNC n.GnK{~n oj 9p+},7Oރ=z9۱}UϏ-oO?|8so]u֍]J.ˌ~‰ۼGnxo>]}{<{IPq{8yPS>JWxv3=f?~Y|Kݹi?OsiPomQ<\ǟ}]J.˹8HN~q -C'yzZWOd蹸Toq~moVt;9ѫCS86N=Xv }7qp {3'ߥWå6^<\ K;~xT~>&S KN(F'xW8- j]*ns/oljBm-zRJZ OޡK>ZI_'=gސy<(7qw^yjOg85|/gffXVssݼÏГOy?/5;7zyL9KCk]vԃow3 9ScF;˞!v?iJП7Ըup7yC\ #/]\s;1p΅l=tJBQG=_FBA'So5yc#oG|0ǧ~6_3RqsO#gB+g7:KAk|̫Ck5>;3iGy p3μsv8;xxA~xB?\q_㶯\q9(>y'?r:~!կqgg_E8昏|;>s}=}'y9>tfBp<ȍ>69Pq6Z.]FJk~w )g_q yg_R;=?~{9Ψq)dx$9· 3I)qpv{]6NGn~͸9G!3^U!OzHzn\N_14|4o)/97T38>3(室䮎r:mK4.R˻%VJi?=S`|i^qcN$ĸyfWrh>7R1v6ֿ>'tMu6^Q=wc_㷮G$sݙm }T_\Ηv3g9~r,h|q}o˺9˛Nqy #^x{\?WO'<Z?h)SwFƽ7^dq*SSƟk6渞?}'y!߫chy;3R+cmq)1g {Vo'\7~2 klmS;r߸k.MN/8/9^|4~qo8˿~RכsSpTͣ9ǵ{~`R~Zxw<\"U?V>~jgl=ŕH쫹>ÜW^ن\.MHy-1O/ߧySzٵr3/;N9 o7o盗"G0S5;!~>?V?T}-C ~~hΎӋ焖O)WFyz`y3fM{?߸)ouՎ~Z_л/<yod7g͛yω_\.y]d=ͼYɫ|{˸u?Hi>}Q{~hwh?v;eMNOqci~MXߞ >|O@Ӎ\7>QqFc9ٟ/)Of9@m}۾RK5Ehs+/ߌø?eֻ/ 9b<ώ~>Y;וy5}vs1r#~Q_"Om~(~ MyR\W%?P&=B O <hiOŵepOzy܏<7?[Ɛk_|$ /yWyw׌C/Ό1o͋cR<߀~~;W?`[/lSk~gqEnW3Sw#+z(ϝv>ȍ_V!n 47B(x[Ϊq>^=!S}ʉ_^߁uwr8 C7G򺿔sL#r.Jy|~CloqDC'~18ZII_FZyzJ{z*n[B-c8]Ə y_4د|w8?|!;>u~ز\qZ'G ?Yz_݃-k;dыaglDgݭYO\\WG|=ʼWan׃_|1/]G2ny%Wrr_;Gz8R_>g)7KWs;c{dz>:nx+NikK~$z;)~v㻭>z.s|f`)ϱ?m?Fs\ͧ?v~. qsk\K}|6Gסųihw\:}Ky9yڼ5ysǟ=C+]u!~i(?g~\|߅{'2̸6̈́7y$Qzw~C9Ŏߵ|}fmP >[6˴=L_Ӟ8Jp c 7ǼiwBMW߿XMܮ f{~pS{p!_ݬigǡynpbKIoasKL޼]K+¿5q)U^ M;X}>>z{-;>1묣֏>yb{~hϧ;WNs[\Oҟ ?ʏ,57yE.÷.ߖLW_9~v+|3oC23s㳍7z'nG^I|e{\e3Sig⑽Wz_|w9r ޗSXI93վϖ, ;}oτMs7pppyԟ# nrwK~}ۗ3%!Y>ؗdoov$Gf-2廯Z='}n\\~ ?=q#u(7Lş~ ߞCW?7.O~8D.nG ?.\㫙goW^o/{x)x .|#?/;lvL_7roY?$~C6C)-g?yיylgѓqɢŹEϋ73O~ӍrpPmu)-?f\cKl |4ԦޮbnfEN|4qj88kS>yy:q܍?Gk>/&՟zh<~?{ssy ϕl}%zQ/R/g\7I?W7X2x~唟q/2}RRk?K+N.=szϧ=_߹}/z\݋q;[q\iSժ=uRos]Z 2ߍk~ѳw+F)w|\7>roГR?ޥ~d-+x[G_ӿol~w+}ݘwJ8c$4y7p8ͻm]?!nkӋQ=5},߳^|wq@Cܽ?}zm'Ǩ6׍Ϛx[ek Ϸ>6nWڧm%12\v/iG<~k =d[x(||2\Wli/gF>g^#tN^}3|uH&G/ҋ1gG/.?aE<__zƸ TxƝ ٓ-';}{[Γ k{u<1+=o\OĞwΰ)I˺qz=OC#ӑQm)ɔ˓FY"Tn w;{f6/i5~Z |<e5j%?}ŋyj75O=7<{~Qo\[rXCʷ̷bGevą{ɴ:<7Gi\_R%ƺxy~{R[*y6)Wy7_q6׻ÓN{\7]7ДYV=8)x_w6?<_^~_jOz}ʋ?7'Owgߠ/n./w ˼?k\1⁝kZ?K7wc7ҜϋCNTydϯ.{hɣ2:5['qO_I+˧Fg[~g8a'ŝO9~i?a7Ї5[7]4Z?p]ܑq4}}q Xk9ɦG<İk8gl?*\H}x{l5J"uٽ|Y+~:~u~O }{b_G᭝ke\׿xW҅eg~BھI= ݮҕ>4Ɲnl{㘍ryg6vn./ƎF Z+]c͕8%-dH{fkYSC񤢿EޅyRn}7Ιz)Q{Jo>D}DSkܶkSWڵڃ?OcW^yץWF7~Gp{v^~W²?zyS~]=wʼn/|\fc惼ﱮO%xw_k{ZizL_xϖY}19x_vG6镸/?z?^ԣ=߽_'r8 *('㋝q|3Q֝]JW9&}WP{w\O͍tι<É5nbϰ\;wz7|Y>z~/=wFi׸?ѸB<|V.=g~B&ßW+}Lq..8K.n]Fݾy~͵=Oԃ"wn>?1~CVˀ#/~ϋhW%$oK5~:R4oH\>X'?ٵQGq8nϔόc{?G}ף\n7r}vSIzݸ;vpuG/} y$_]-l~jG7ub[go}=t:}e)G{e>v/i7w?3yhϔ{{~wy>_0^r<ڗӎrVg,Y |5v|N)y/cD?oRrA?zv ˬ%_<)W}ekN~:=xsM.p?\7_į}>| Dȟ|$r3'{?4zZ = v ЧI}I\~5_vM}5gBُ\s; ڇ|zA^'rߺ6q+]؍x7I/=>z~:Ls;r` }w|q^*-S@z<!_w+]؍"vc|*^x}wg;<>|l{}Q,Ma?wy>oV9vb_nGpuh]=SQۿn /kP8۟8\+<%zd? ϲ/Iۮ}fڿnp>p͛#W}85֗zn{8>+w6nZߠQwRa7p菽+ly{g-.a}ެ!vw&xfO~o O/^]qH~ogLk^{Dc?g'z-|.z}=hvgS7vv '=Y\K;.#JW@?/w|C2y.ߋڞspi}W<;í%y?9 |w{Zq{Js-.3iXS2yiwpn=ǖ [j ƃL{ű7+}8O{o(~H j_W?9s:srϯڼy?>?p+]?N/Y |naW3Ԍ628W~ԑt&0h\p zV:;WoowřJW$iys>_|ud޸v>yc]>3ӼY)+}vizr|^Źq SžH+}iq*yp9岯o0(^3ro޵Vz_8~זzzp=Uڍۈ܈_ 7CUM?9ҕnޏ=?I?B?ޔ^69MܿaF(w-tvpk\[R>σ[ n9;|;U'ߣ|Hߺ?{ʾܹG~?O-sprZJ~ ==ÿNj[V~$vu=Wv-~6whtG5~n-+{z>qwgS[J97twv^|o)~2v kPFݵVL p~kvi R|o(N_)tC3w%[="#+G|ui/+]H^[ G<9<_'_Lr޵kt3w<=O{k_x};|߮ҕ~:<} w>+׸._E0/>qmMJWkW>~W}@&=޻xD+}-|2|ͽ~p]G_jp7VYK8;+< XpGGoy?><_?vJW0ϋ7vytC߻j'7?\GkCɥGo߻ٍ/5_a7`]bWyw>*ߚ7KzU]ݦVۍ e da}X*>N' 8'#Ք#FA"` p4Ag0$ΏkuZ/Ͻ' 6~nW;wҕTo~?c:}/jT;s?w/_^5'P\N蛫ެɡ).U>xKN<זzKB oJ5SMqC>WOyӞ7|6.4?7(N!8h~j+ۃmv|/(o§wn_W~L>w+xkȹ|3~gCs97O3=1=9k;~<=io~?{tp(`ݷ=q`;_z"^J=^8I/wﯔ?AدfPNZ?p/C{!g7# M$;,?)O9++AoFNPޏGvi_rFl/Dsg~ؼ7$_z7Ydi״U}wnG*n5z~Iyߛ}z|1]M?h䞟kok"n k/?:w8Sɷ~Y#;q-l鋏[uv!Ͽԥq{a2}wre}vϕ]JynJWƽ՞AD?y`o܈{q]ɥ S(<pճZ+]Myg?q38V3?Z{?ٿ򾾡7~_wP~U|{~Z6GxME~;G|;Izc}7'|~Kie<8~v?~Nqs7TS+S{gǸW|mo+j7xS5h'C䫿ю .}j=8"_ɗxw7~~=O).v7yD;K@n?x7{z9_|m3p[1nyKZӎ]_mP>?x=Ƈ>tS_O3׼Lɳq#/g\㘇J:ȋ{~ó?*Ga~|餋Wa>6.S//D~ϑ;Ї'\;<y;HzȻ8snd ?x&{ヨ{&/xTzsn ='pU9g)U&{j83|v?X[ߵ(r??޹t˼}/}\I~܃'QYWS^J:^Pxk\tSAz_N#shOW W|΋ٸ'=?zMC| z;C?տyKW۝tac*7|@xSK_y_=<_/ jRy~vr8)=q}q?#/y濡zg~Ӡ\I;ro>)wܫwO?я3vkWqY#_2kOSoʩ3ɁgZ{9=>B/g5~ŗѧ?2.)zB#c<:I_}WU/琏'z/yCr_ yϘ?oՋ1_OnγcC~`ekw޲+COwRwoӼ6ꭾ?y8޼c~%$uu\oXoZ+uq,{_՟(~)O:)z+Oko~:qFz 9exR.Ƶr֑Cځ?O/֧ґOjG O~|V/ȗy|%#]ʷ'yw'{v>\tcs~9WF9QkI93gD~ؽر;=samv:^$r޳S;g'0.Or;*q<{7\2A7{qRvxVPvڹ\N3^{e/J^%Ogʽ r>.>,!mKŽoO_Od\ٍɭ<;:|b8nq;σ ,~ >O:o#ksURߑߔ̃m/<4raȡv>|񛔓ܣg.|1&߮qì3ox)'f|w2xCȅwVNlc!Ow#zD+_,!y,O_||o>`~~1(-ϣ>@o9zºI}Tqy4gG1qk~]Ӽ'7ū~z~Kog_hgCO7o_/ۇxodjֲVWS"' ¿ڗg|ۛ'3yTgg/xq}ohc÷u_tg(yvNxi~1|.o;+0sw.Z77e\ K]荛^d-./yvJ7|9g-nuYN[{Ch/>J}';v~M(Ϋ8m߶7k~sNOٙ2ǝn==7nhgBm5X|ʏ#_vnەz/WrG(}=G};|Jʁ,^$ {I?'_h7W?|߭>@oQqtcxq};wDK}Sr<>z͋+|=)!*yuR|eO5z%_O|Q%];ZxO>g>ʫ};/=]N8{類Ì\tݽd}3օohQMy'H/)q j25nȇ(G]H#~Mw]NoӰt>x˹u`?{o_ަkw8?M~S_~zo{oYqy~ pZ}yLp~ ?4aUz|8 Vi9}NƮPV?(W}>kdp^<}FyT s/w^1]ϕU{nGՎ/>|UJok({sq x\$}q<幥<C?&yOG/8jH[;i#.h3p ~~+7E~?<\J?Go8|_ y.H~8O~X7$rTkcޤwr< S|S,qlΠ/t1p,~988/ǹ 2o8SwzSǘu?=}/+|2}+/ }[׺iMg^CN۪P~W!߽oб޷u><ȟG~ɵ{A>Fǹs;N9%?)?\AO]7tkǼC͒t잘sZH,'=?ߥG#8zyq{IRVt/ho#O ŷ䙽>6IǮ _.{삽ge[icv]J\Z?HDG^ؕGOt#/8~ZЛüTRd=+{"v_8xRN6{{suَ>0~i&rrRnw$L?_R_;7wv=+ƺr}-%w iwXzQz/4=G5NlKֿ]0~/n컔q^K"G鷬C,>6/cSrn*9`҇#xW_a~M>4yޅj<䣗5f\␓^ygoI87Ɲ~ x1~ S7~w\_#?>/E>PvMr>*/du^1Yh 桤k<W":E>A~yg6Z/8?>j<7z31OXi/$}^N~| .w_=K滪][ yH&fܯ~ytqså\׏o%37i;O#'_yى)qG:vG'tSrn|'p.w,Ρ~JJzo pWap4Q~/N-5N_7">WvwkYN}77CLE>%O7啦O^~7=d8ycenJvH_|RgOK; ßԏ~ŧ£iȷEڿyZ1>%oū)G?.څ[i~֏oL9^WT=^Fyя1~Xq`SwC.'qD=yzj6OュӫO((_w<|FoFRe=c}xoɲS~ҟg_9yp~)NOK 5.Ϸן1r\oRuV⨒KCkoM9KQy|&xww,{uw5v?z2? ũ{)q}UfU}ڕʜGOXc;tn3}rs޼gy|[ڣ?R|?>錓ã9?2.uzrz~#z呣H7χsfu_{Ӥ7?4i|8w^O1!qܓea?8ٓyqzyޯWsf硍DcOO ԓ-=;s_{bhHѾ{pEO~+I=橁ݒ|B9`!݁]r/(v2Ywiv].G}yY~i^gR5c @;WJ9%{x"vp8x".vk^NN+쌍Gp ]Ǘsqc;ڣ ]|wj8]w u|Q^=&x4L?} +N,鏂:V~p)RQrrR"'G?(y?:L?;zvCw=+}4%i;=u'rytM>IAOzv=+}DzerQ|tfl&pn=W5DÏ]9'.|~+HĦKl^ڕs]J O"OgFQ+^3a&Qzؑj?Jq UG}nAgo9Z Տ@k_ۮ;.X<\6nN>vvC/Gޝnm.Q?\Cߧ>W/zQ{|K}GK"_3]҇+r4m>qߧ{ѾHQяmz\W;2lcBn려:M䔼_>/;7ҟ:-|/*qS}{`uWVJۇ9y}n緒Ϲ9|zᯜw?"麿OquNOKcGKky19,{~(/켖q]z![_'lð]~tŝW{S)~kUFm= J.WBOh';)|<̯<~^9'M~D|6tC0弸~R/|쏣%C8w>}:7w>YqlqCk2?8?7$vEkI棣gK3g\͟'ƭvW|3~O|ŝ> a[è4^|'(isH9'8BegnֿzE|Z|d8rNl_\F~7k5>13v Okbg]|{%}rG𫼯P9ǎ~ˆc/я/z}p ]?Gva8m X?uŗ?'5x|!.yɑ}ۛZHy97Kkwf}K޻yWS,j?\~[{o$;g֠/.ihǸ=C,w0V_n\~?R뭴9ȯ>4 uN\"R.K9+sJN?a9ߣ]}rzj~Oy[wһxI=_<,ԏV];DS;}܍~znmɁzG_p679|ONzՓAGn%|)'{k9Y^G)ّR,+ǽs^K:Wxv9ӮϦKi elioޫ`W_K]<_>[^WRI~oI^?h;WٗYLȉN}UNr=˿#CS^K&5ߔrz,`K=x;#O7vR%Iioxׯ~d}_~L6Ɠ~-{j~>^jɗ7A^:n>y/o-_Y҉_tLƕ|r/r;_~I_t7O'^3%x|?O-WЯGe{p7o|2ΞɍKli/9W"y95~~ȑq8yƗrȏ晟~gx}ɘ~|妜/q'RO//[ļå&?szY~xS|,~F_q`76jyrgucYf#ׇ?z?oQz_kC~{ӟsez?> ~BWK_\7-+WOV?\ڑkB7GM&'@PmYEUoیCjU?M? W >u߷vuw)uqT٩W)9}sH֛o-2|((__ڕٞT?Jz1mk;ԏxn>/l=s켥FSSo%}qmcWT?/S;SaB{M9_ڏwI G?>ibsyW9osJ(x1s$Wwv=Ҏ~o"ji?磯 > ~yrjŧ eco8wvoB=BϞ$9^o(~匃rBjȕ{Oڨ_![kyy8x;?xDr >˞@%s*?˵ 0kGvl=;6?o ΧJ(cَuWz_{8_|,ơ :?E7v_o]'SU+7Ϋ?'9ڐo\u^2_H:rCgŇcuG4k<ɴ~:K=;Hl_<;go?_ ijiqݺ._&}#["KXϼՐ~7t| gFڻW9߽=pgk#{sS5+ 7 _˹{ſFM9r{9 O^zwJ?îQOh=r8NW;R] %yʿ7~_{x(Vo2W#qmqy_{:}зQK+6呧~ydOp>~Z=C =xO|q{۸ioS}h!f`g{zg.tMSm\PvJr_n|;|ʅ[s/}pݏi?w}}F"Λ˨P+͹rq?{_F: _W8#yƭz6r%~Z /~^{调 tD?ڮ |z:_65ޮ|oʫF^o3߃c~,N{<];i ]ox۴^~>K;]S=x g$} }{s^߾7p<UmK>93W/uC{3{?Yu@2έz2ݫ=H?78HݳPiDӞF>k/ s䜛Hy8 g\x+Ϗ0; P?|nwX􆽤+? _|K޳CHzvƓJ˃x^rj CS ~0/)e]#kոqYՎK;w?b+MOW3wUd<7 ~ P^$}hkyA~>M=Jȇ|'+ίڧ?ᧃk?wdo>ZF+{sո#qxzPzS-dtr3~rT?R~#ܟ3nկ|I"%՟v3`j~^_,|C?.)_'~镓zqЛ\ِQM~꿍~'|{Vy.|0u3|IF_?Z~_?zwi;2][!Gw#'yzWl\%u{wWW8gKx)7|'7פ;wKq_ow-;>]Lθ3NmΥ[=/5nҗϚs9喏<ܬϩy~uo~N>D?7N /~v⼯q#Rټw x9>[1?~?6%5i?.s0-G<7_=h;c?0U eyc7b@C2쳯] .3kK\piOhqƞo;kntI?ve6& x?Ï{:8I_ՏınFC[yݴ^xQ;/t}gr_|<9Iyʯ\񩼷.I}[wxŕ?F<#O_a^~g㷖rY=&Woj~6[Y7\CGL\_w䄿WO>z}pl<ÃlLҟv_p~(']+U~ԓ?G:~`O{=3GҸyR?ڗ]~sEN~Cە'#433zuq8!ϯ~͹@O7<o~C(l|Nn/.jϓRs*~r3T^<:U~oI m<ǡ{IH¡8Gqnx.1GK~h|qw3iO׍~h9-ύsr=?s/ڕv=q'ܑoǣO|ZaqhɹW ;qqS3x\Ux-gn?ݼr27` yOߛ3ݦ o\ČSa/r'2},g8o_~o\͏4_E{ʗr_ㅒɇq(_<7_?h_7竽xv7>iqqNGK+3J~3~}iϽ|˧?_G'?Xz+GtN?~ՃKqq?;ybY5dy%'^;|Pr⧛нRoRO%S [{']oy5-^\rK&ɏwfh[jgT*'|z.Q-,+xzsy{q |w\?k7O~zO1}ok_V-7~琣utyv?a}{pG)#{~w^|ιE'|m⬊+r=,۩?4|6i(2{{>>~Q!鵳qDO?3Q)''^-&۰6+>em|M|Y{79}g}~×c/Vqey%/egx<sYKy|q/O8./D~ ~8W1pH 8;I$Y}688B8_o+c8?5{\Dqevr9߱GߟD_K pIP|AhqA=\[~~9o1|k |Jp{r1O/+}uG8NF\]qo߻Wrۼ/My"{c?on~|]_7 cj]bj}utm0t?GO=[KwZJY;W#xɠ}BxDJgc8?~˃1squ~>歔|]9x!9xΡ| y =r]HǯU<;H>埿yʕ8S[h-SΥkS/+}=sjƫ֟AywߓrKH~0KIw~ OJ|Jpp>k(/ׯ7銯|WYmMy_Vq)/>9-Fp'K*᧑#}w?~yrWq{^9>޴Z|y|<íR'XǜKq-멞zC\.o#j"{)q׆3|"~ }{bg M\-.r]|ZRg8KOcs{]!/~<=<^H?\~Wҿ?ppdwr*zVx_dҡIȞn:4"[??w?Se]J Z._{ۋJG&.4BdN$|K4~z= nU5nh|5=pwgc晔y( Sʁӂ ;:)(W.|d뒿clogP??g^;Se]飥/cqjbYϳqrT-{0ϑN#Xy\K7 .C#} O~bgoq*.gU!Z?Xߒoy.ߝ?3߅;__R>> {qtz9k=OrA#c<>_0Tz/a~%_+}z>})?w!WeqdO(rb~zym[r0ɵz V?s:ɿGpʙ{2Ͻ~/B23+=j׽{S4s!Q";%?u~ ?~.~<8L|{?ܻ֛ctmO5ohܷ6޷yo~UoW&;Ʊ2p#k85vO׿"~3?wyw9<]?|ߠqW2sF{{h]ӯkym *W>\^֏ԛoio=~+.}sYyiK?oF#5Z]U~_~{c^y7iyݕ>b~x$|w[.wȓyKˏ|K))/[6,_xm%;z1׎W|ԃɽ7yüUowg<_I~gBXg(_ITY&uQy%]ԣHW?5#?F{>8KO\\.R}7}"p,Οȩo 9s~}|yOv/򭑎$rx}6?V;O=s#zw?R}CWw|$~qErƫ}$xEMIngی#?'.\?3o~µ4U8ҳ_&釃ߩi/?vm_Wżg.ynqstUo.zc\N C>v;Ń8gY=r]K4/|󧤏ԟ*.ۅc|FS=>g_U7>;\@q4x ص\Q~!n72O&ٞvE>hQ#~i#8yQ(~Ԋw (~3gʃ4O__ ~qox@2yȸ+}rpqo.?8̯WA<ߑ~|iWO;v~} sɲWdѹ{~-+F׬3w/zbBTK):p3|kqq~gOǭ[|ww]=ɴ zcs#NB݃WTSp`nF.&[S_݇:q9\|ɢ=62αcŷyNgCJyݛ9e7O|ڜsţoѝ_ڃc?{Sz{{G9lznm==#Ot\잍sr_&|̸/ kK:J#9^ٙAŻ $[ɸ_g;rS 9>mkIț򒏼JW$yn|g|+'|g3亸c|-Ծ韴z$Q}&7^kYqpr].\h-~}E;CORϻ]{҇ԛo 늤Nx)<ݷzg<ߕk\erq)wƑTNߖtppr.yXߵ}}/s&yO_ᷜ ɳs7P9os6/UӎQzzqkyX?_OwoEw=Χ^NyΩzcoBv"4O;v}n{,;3%~ܒG`G'>Z7Oӌ1<Lכ.쓥>>Yo7qcJD~/b~AoJ ODޛ_p>7V<~ >~j|~|޼Ǥ=Pn[|Bҝt_Ho[W E~gk^{V]۝G|!;o`ެɥo<8Gv}i7O'SwJ8ZiwF/^~Yy/|%}qov+]_7^{עO=iϬK'7h9J\F %l/zH|VmUoFwI<ƹ=?[g+}bi7޽ǴwS n='^{:mO.~^L_*om'|j$=eΞ?uJ\|a7G}󞝆]ƽe8K_\s> ~y3x,?OgnJWI>poW?5jCRpLR*C;k<K aw7)=~xɠӏe??DO;4lgs{奔SN̷XA=1! P~7~nw6zOoJkp3^ßO;|:icOw?q2#goW,N3}~ѷ|O8P2zWNTT#JWF~{2EiP~sk~wc3Lҝr޽cq:޸x=)O;NVW 9I__KP~g'֟+yOG{o_ʁ/m%_>.!p/R5L[,/7 F3>tg֟_m${t9NHw{3A+z߸UoVW  dsm[E#C{s[M㐢)>8ò_)g߻\r҇~/>gyK3f__y~у3w r>P~ݳ~fuކ}+]}F ߋ9{ƾL^#_Y?Mg~nx@ u͟,t+mܦO"77~LjY}O"?([\Mq1O}Z1\vLv=.+h!_qdk>kEo/ͪO6[ ? (n`'~؂7Wdޯ_M~}775^iӨ/u4Юp`W+ދzR~ޱRWGyb麆/7NEm}~](:P}Rgmk{4!paùHBwyeȿ??C^ _rz:<,^_G,\[yk^yhVIS?rP#o\=RNS%O)_z5`Ŀ8w|y.?g/9;7Om\ 3'&rS݄=q ;#B4H88Iz'~oW}9Hӎ8Cob5zW7 ;[?Pv>rv9+vr{v6Y]N=Ũx~ROR[[vщv5qߛq*9_SN|mw%r"wcɝW>xO?&TUʡ򽿬S}6u4M~C?:)ysDg\\{V~>^5Qnm?v^+s{[Ex7zi3feӍ~9)s7#wG_T^Igqi{mӴ{k쯎[i7/_(|ܥJ Zp}ߢΙ3w5^=&zܓt]{z~۴C\n-ۭ'}ztٞ]JyCG.b(% ?:.Q) vKy#_|H/{i(;ɢy7f|q9A{;W'6rGY{y&c(헑gJ.im'<#kp5n6>~uW<͌?]N;O|9>"o;d#8W=ȳz4%D)&ߑAYqkŏm,gNjv"Ϻ"zS0\wT!8g/^o K\e0w^NɺENI?^]f+? >~!Ͻ=u5ʾ/ 5yc'e }:IYI{w5r/w7rȽHR^~w|yNñ8q:ϯ+9r< ^R=o'rw;ϳy[Fݙ>!?Ògaqcg3gRoE^I/w=>+}K[NtK?nQ?I[o-G0z"!ϻ>rI䙼9^㼊cYTЇyQ>xVN?#=>h}|7z|VxҮgZ߇?i=.+_b+n^RbCGWRn2 oǓ<3118gFv}vr '>3*߳g7NEݫϛ |>8GSC?&~D~'I7T3~̮y2Mjbw/{D~ếYJw\>ٴ~':~"rg Ͼ_N<7/;&گ(_oZ/^6^zҿ]oz.eq­?'+^N~~ 9rpro=ѝurCX?~:_߹~_Mk`do)ݻWjy|/pqgV;fxw>? Th/yeni[飥pZy:7ǣgr$'G~ӤW"G_&pw4x6m#{u YdY^=g_Gho}Gg8џ%/~IJ--.4 ͓9r_o^*3KoqgһK>7r]gqqn4st9ҋylh__w]П_oZ*o~'Y7j`>r Ͼ@:?7ނx ~잂p+fz|!>nCoAAP[ɯ)y~#g~ÏFw-O_sUfpSwy{9U73Ĺ5E\ \@;"sGt~m~NmgO xj]OO`Cp՛j&4^q9ϗ.2r^^gqX 1qlxg^.8VywS/|%~giGлci)|K_z/3|џCoJy\8UNxp#dvKIp$|%=}c=գ]weG|N[~LßGlGCq+s'k~M̧C^|z@O1 9 h1Wˣ~oMwG;w7?Xl}>"=/7ɗƛ4_.\/rcǏPL;޾R~jO뵤?mƺB7`7~Oї⑾\krӞt?<(_DK~ЛrsACLm_uZ|7dz~9Cޟ\ey-9s?BޟxvG7[d#wc/}>vãKq.ijw> %yϮ~eyF_#kzZzҏK㻒'y0>*~o+d>zfv=I1XW8+IW~fQ |Kp5Ǖ~֟PX{h?C?HЖuM{}HOO:[ƽ^f;G18K)pų{>}ub~5~UޗZmGn :>Z֮q_-Z.ÁzMh=~y]tzï|"l~Lqt{CxUʴ{A3t*A{{Ãgo!ӟg߳>c{oKd>(.?Bј/ =ʴ>?$/9ywy {Yt^I}3+}(F?ma̼|^Y^^3+yS"'1{9gvNQ=O~q^ǟ9.B?wԽJAvZ@+}2~v5={{7%"OsK9{KK9>#Ao?~7|/ª?_eZJ4.$oy&f%M7^΀>zw-I_|<T6)}W;UoyN\ã?';K9yz#GLRnuzt}Co'7m/]ܴgЭf晼}O$kG/[w1}ˉ^('@:9gT{6|n+}7GzV[Z\wt9rT@țuOGߗ~?Yֿ_)Ad]K&g2~{ktp9r*gg¿|ţs'}zUx^eߗ/?})/Zy?~>XƲ~5᩽{<$#| ?XοoZ>C ^ɞ?)]߽أ}ڗ|?/oz+GwW=" ¿{ NN)_WRJ⿊;v }_TW_^=j*xGiQe/ɯ8.= /zYRkQp'K>W_{/8__c\[L'K4.UCۯυɏ?Z2/oqc+4.G~/GNHk%#]p#h^igHoܙ|s=7~7i\U\_o,0#zxJyp_e||o!#.fqii[̗|v^o/ؾ}e]t_zO{/g'?9yC?'R~Qgm~7[F#mHtgO"?mj|ˏz.c/d_#qۛq{_xVO9OA减+.8#+/_텧S^U#}J[ |վpQ{-{_r}0(P9>o|!WǼW>~-.q~׸SnK]7|r `,?~O9~O|WG}G|%jbL~<4<y}(Ug =NO߱c롗,ANܴ_r19I|\x?.^Ʌ练uֿڡ<3K/y 7]1OLy3~7?{Isc|/s=Z+{!}(P=KwGSuݸCΏn*?Wv*U3[F]/f~y<Ư;ɓ~Jsݥ~i{[Qo/|gY9jR'{{G:~,7_ר߰_ΦzPd~.}si{s^%Ïo>5o3ŕ<vN }W; yV>,yQ3{3n⃽=2v/)546l{G)~&{xUb_)]_}p1iԻm3P2ūf:v߆!?c\ҏjL߲K|{8I'JҎ#@6jg?=v ӾULǞy-n$?I>8/ZΈZ|9|vϳgGWw{RhsgAƵrqlNC"ť$_Oq!'3n~emPtŵƓy%?Q~?ӎ˧gEryPRc|qV:'&/8p\\q!}i;\c.gl7\axSR.InzK|=oy~AUo+LF'~6>.ӕeɳuq)*/#ľz~>RpٙqKy[Տa;acm^YG׏Uyº>QnlFeUzȾ9|s3_of|ොS{PysΈ«9W=/^-;tU?pyVcŴWѳ ?o||P{'^KΜe{w-O e~gjj?;CT']_>>v]Ζt%G}KI1;ז}ʽ0?zCo.)W3ڃs[9]gЭwd~]N B( Q?y?+(řY;Qn^/o~'"K:^g|RU<֠ky|R?FwPAşXgL<6"5Ǥ n|8zreTyC^a]9S~\>e>fy|]Fӌy%}åTNɇ$W-y9]L^7{D<§G~WM?tW+O?-nF_C^ϝv|ߢ?]/.gKxןc>^o/~qs{YOqox38HŮ^>!凜g{q9S\+4hg㒦?юG}xߵ=)1s'.sny|ɾQog\)=φ*0O=9qO.D'_O;RsI7(h{&>x_wP>+IsgxRN|mb7_®>vvc<==Ƚo83O}%+}uv-8OF?ŧ)~d§khqVpړӿ67R{efb+C>o7U3:S'yN /Jy ͝?nZ"itDO&Tf'e?n|ǂS2n[>ׯ/pmO?Wko'~)G|{~_Vѓʝ'\/^ϲ:omט*/->>4c?{o<♵W}cٮoeo'C}J"G= oiŲ~ȯ< _鹥~_{gG{yaYGN\~鼇"ma<'ʽW,~yQ~:[Z/x/.ȍB]G/rZRßhqϧ߹X޼LNS^a~gqog7oy>`!GG=}k<ԣ~a߉H8'oU#ߝ|h?Kw>4 O~~r0l/[y{ƱD~M~8ǗC񧦼U3g>t7ol(>jO>0Ɲqc|r|'t~wԽtA ֟zkI%]񓡽=\LdsC/֟[~o?k?G;9?㼸OscWZf;켙W2>o©'m~3ӛc\=N狣b߀߉3H~­5N|b\S@Oطǐ^e=3,RG{m~~SVN=+˗.8o{ђwgzg<})~EO9Ɲ}`7ƣRNGlvl}N(g _O>rtsk?ӟy]&/<]~?/i~<޿;+?r+HG%/7>o^RNJ9e}P0׿~W~VɟLNdԿo_Iqӟ)81to1}$|Iۃ*7;%y+=5?/j?e{m9lGy@1OMq>w|ov$ԟgk96.c>h?G!] =6_l|I;\>:OR{{yzf]DޗH¯VCw|F=>}uY /8w]Y?*[Ɂo/iOOx=} 3)?Srr`4/h~RIgݓ#'>{_E:/r>Si}}Uy}ٔcoj] {?[H߸yyV_b}Ȕ;iGyz\8WU5}vӅQ~fļN'Ҕ[nC.|r?#h=<;#g=o!7P>rW_8w<88ΗS<} n i?w:]!cKМ0g_?We;\ yģiZN>f|8&M;S_4?AfNjhmC׸Z"Hz( c*.,};ی˧=VGkߢ=恜~/ǣ\|,(Q?NO-8x:`xKѿ/vMߔSe;XWT.|]v\@q<-h[9K;#ş+_lq+]飠Św58e^uVG7ID}}W8}o?۔ctDo_ *y-_Y7+}ziqz~gY7Ή9cuVG7i͆X v!&5}+]#ћ)Ɍ[Y"î۷ҕ>i7~mBuEWt߬~4.-=[.h uVG7+F'.3T>щ p[J8O  uJ^^N:BG޽]o+2iwKŝMű>IWfz?Aޕ~xwӡ= S+qQمg |w+= B,ڣ?r_~yOqvnB͓Ο?vWO\92\4G%/_3[aOqO"x>߸$wP;懿?8ڟu_c2> |lw3S[YzԯCmz}rOn$zy)'޿q^[?Hʣ>~!n|_ W>7랕KEdw֧6\{>{쾙|sk]n~wL,w1Wzn>vҮw_\;ozK_~n{?T|,xc_b_7E;K>{|5=\w~%\,ig:o$QOH_[T-yf??o?oȝL*m?>I9G?{?h8I1sxV(?{cI))5N`ţRnstOQό{#8DWDSz#^8{?Pq}>ś|9T|ßix~ j5'z߻>a{77ÇV^5^`^f8<|cS/7w3=9r݇e<+z1C7CoNOosʹ~~w{ҵs~/_sy3-w)G;>>/gk?mM"#_niJnߴ}s~rU~g|[OzT _7F{yqcikqs>`[vtY~a]e_cU #G+zRЍ޳rx.c\i;>IexC8֣?O{rhߣϮɫN7?Wo1~~ż~Vd/c ~C//;'v>+/pdLH'^7[oJ~O8G9W>|gY>~vs}8yo({@qs6ǝϳ۱ggt95f>v~s~{vB\2?dwvGH9~F^9Wfdc9uO9cN;Ix4xbNN$zC ~do;ez'!{՛gU>;q`%+y. \dz΁Z+^\K{O~vxx|5̦L7^O_z|j^No;]ߐoyyзQL18- >v/4q#Gg8/{ z?18mS;mF~U9haF^w{Rhqk{j\^.tD(?N/(~nȓvW4?]'(wbܸs 3?GiN^=#w-;o/婿gGrZ\#?0~:ӿ⮖\qxF]\[k]~ey?:c|#]SfSc߫ۮq3~Oֳsu]h]/SS/Ӌe];D?o1鬛GIeI?Jۇ:ʵ?.(5[?5RO1]Dի>o4W),1.ݗFn+>38 I|yXyv ٹ{[|Q~rZԗY3>ߋK慃}ɳ%@wi7oO_Q;>oclٵ\>tx}4Z;fƓjvG ǨiOe'gvD80|Ou15rs{uhG>%=1Sg2Ǯ{}<_KGyO܎P{۾}<1ӛ.d|/[J9]/DO/opMq98mڝͦC noV>X},n"<Gpmrc\x~}ϥ?]?ߥߵ\>ryeo]?]6+|7Ʊ;da=uQ<7s!gW×}LjݣIo_".xi,罕>@ok4>t r̾zY{8hҫՓ'Py+NǜOky=w|qoS~Ň3\G;?_zo/﹨vrk|i ;cqV~}91yOŮnwP81v ;fȳs fGs>~~oגzJ~ׯoaBkJy^&KnqJg\7yG=^}'RG#?{qgw,n+]'^vWQOx8W|ǒOGx1W~_tm1%NhH{_{4mg7~2Otrw⧩qiR[+k<E_"G;8%}ە>B .ŭ^ۥ\ QY;./6o^ۨwwb=YJO]E]NXeV:?Iz} \fʩ}޽⏻Z懟'wh+Ro{wNP+}$zsֽ{=uss_`r:?焟ď8|%9tDo1{8;Q &]q<6􊝉'0\a-4z{ԮwO]e"w']q~)# U?1{sφ6?-g]!p4CO>ZMT :>Л⍔x0ߓK//+ߕ>t>6"&mXurߢt+q3xΪ7+}zc c9g>t޿?,}w,|4 +{GGG:v8ΕG/oh<(Dgcm|8_V/FE*^9rp.;ۻZ|@_Zq2N_s3^djM ~yH:oyo18 v'NpSQF?="ELL,d?O[wj)dfӋ}f/m ~gwӱoߏw=p\k9}\6>b8<߻>0)1/%_pk /{3.3ΏоҒ:=of3pӟ_mqak<ՔW?t3^@.K]Ig~ac7 [F%ݥg[i=q<~oTh=>`G^|qҾe|i[b3pI4~*ʐ &xe OOy 7]R=!~eW^8eA3.twɧPR%5ޚOYOJސQ1J^ÐYI:/]!eߥwn.;΁QwԜ#4^(~/:9}v|W`5gON~2g2_14b|'; {Bo)!Ngl~#qdq#\Uq.=wR@ɭy\vX^RgCOSzyO|էz?3?㬾k\ߗxy~WG6[C)~yO'gQ׉/Jኢ?po,_OBr5+xS}١O>1\*>q/EoƼVUfܬ#u~uj]xfϦ߉G~i_| >Xo{C7;6mOS/~^|juuM0g<ؿߺȳo!(88H/O38?$gۯhz{n<|p%S}yIgzs p9_~Aq\ ea]V)Ӽϭ'x {~q@]YpF_ .jE{֏ov>Uov{-/u5+򖸓WR}mQ3{HƍO_@޷Oha#F9QQޟGe4`'4)G\3y޵=q$ kC(Ξg|M^'}"~oR+Kjԣ|ŕ5}on~k,'8]B'ɱI}-Ozq+Ѭ{NAV~;!|~y9o͡9m_]ZɱK#|S?ocT|S?~u/c͝FZ_7OI.=<^W`y+\ks8^Gg<rC^]ܿzz/7~g cuR{r~ ]boy}2Yߨ7 of nq0{aa''9k%{ qN֨_\3}G|?NvŔW;Qmt-xu3WvJ7ƃ}jm[C7r!͞kǴK>!zD^ߙD+#ϡe>8yͿi=i'aծ t g*]ҕ>Mߧx.>ʼd7C:EJ<֫7ܺ*\7r+]@W>7ݹ[gσK5Όkܷ>yoܐߛB+;\~gs>y^<a9ogr>.ҕ> .避܇M;SKîa+s;npk[\#Mp ׆ңv+]_7|TmqчkяaLO6_Vѹ:{R+]C[7Dcte]ɣs7x{/ *'~=4; ;M(\hp=x@y. 7tO%(?.7K7qpϯyqۄk_'QEޛgK?tpp#NZqܯ >^g`_/4w~{!9w >yR{/$\7uPGгyG9p.W|Iz77U{`K>5mgV}yVn2ƙ?'#OO6FyWܐ痒Ͻ2V ?Ro/}q1|eow&ߩ>X/:>Hݫ_P|NJn㐘w޻Ku??5~Hҹg)O9O9w—1/ׯR(Uγz>(YYW>WV&ݱ~~xHwi+ s8ֿf.E |o?ƍJƏI/{a7L? 3zsgo~w>;Gr}m57#HԏK&(Ɇ&=o^?V'7\oFnD~_;K/d8$|} iͼG/<}u[4o\tzCnfaO~>'#GIO)%~?J>yR~Wԋ-}zko1K睽E+Ү%BfܭӻxȵS@_/~/M~ݷW9y~G=[.!ֻg5ʡ{oՓljn#F>?]D.緯^qp#_7|Կ_;l|.]P;gQ,GtQpBGϭҧF;qј7%=zwo +w[J٬Gt<?~I'۷ҕ> ZЌg8WҝMϋ}y8"?ػjۜ{uҧn,ǮS=a~O?uUJ~ZE)G/.Eoz(՟[.po?[J&s`Gάv>x8AZK߅_>q۞߻W}J~Z9<[ĆtyMzq'uVGAb'G7:1G @;mJDv ~ߌn1rW?fppp(n{gP3U]>~Ĭ3z#8{쥡'~up''lqsқgR Kr(c姐Gsqn_G1 4)zW{Cẕ8vVK}S?>fo WCp(y4:gW!gΥ޾W67?m(5SF37 h?'*g;o_nu<=xQ3?\֟Jx׸o/Iҝrܻtݽ~|E]H5s??5坽P~/}?|~~sm17sz zcorxiWwCVw~݃?{lɕO}%fͽj j+v^1a?=KI<~/-8f[?w/zPzOx]xOs5*"qw)2ZЗ~,/rTC+cWFzU?z &_< $z [3~q?/8}S3^G??\[f7)?(0r[S)7gK}~jꡏړ~~OwrW~_sk;nߛޤ_)k^'~wr飗;^`{ӇY.9:c~{Io9w~7o+~|^藟.}}]_z@t]{~Dng.q-鼯3&)Y|צ 6|ogVhwW{'_\~?KWб8r5}7=.菫~>wO;r^eZdɤSn{T aSϳ{_1ݯ;o"g9gm?<կ(oi+~<6>f\vPS?vyq9H=9ٵ\>׽.0vvq_j|i~gs^~q!Kv?"o$?jGoIw:QqvufP?{#͸?g*vvbSgve?JG%Wo]eI{^wp_'g(<>Bo-+~' 4M!I  ~hϘr^ZX}}o<=7yq][1{yt0 Đwrg^_Nçw)yy_K៯?A{j{|WaJc>0aQ{ dy1Z3SwWy(yscf[ב'\kW.\5z>XzOZ}~fǺ̸m$~xc)=xho+}W]I?=|#/ݽ{8ӒOΉSI9++别+]qfyO+ޤ<;Q,y~K;O =t7LwT'|w[>Z_ZWz>̹/2=K?Lr89.*1nˑ(CsK9|[H/ឣG/= o?Wry$-Z}j(Hp#^ ;${vΨ>NNz9h^)u%턗sH}Kʞ~.k~WKΎ~R/oz~~oFoI5_q[iY+/^~-ުD_~ c()qqg~)ns'Ev('mz}Oeog*YlZ.wZ| |oʇ!ޛ9w鍿qC_;R<[W\~ාgWީ+W=Hz/_? )\q ߻ǝ \KSI}}@l5MyFry~_{|`ޣG9w[rS3>|iOqmow-;-g⿲ԞʮOyj<z۳_893U/>ozj.žܷG{կw&C>|]װ.^S{v={@qWxpcgE'S4_I;>^0C؇íͳM%w'{G/ ÿzݖ^3}+g[㓆iG/2/fo7 ^!}>93~?G58U8n'؉gF_w\N5z\ryT| ?_8Px_jzR. '廃^-o:'zeķש^S~7kXM㘇÷|3Z_?ux'WFNZ?|+#uP#}Qe5Xgh{&qުoyfZy}Ί#{h7O|p= rg {>?t^EɑCYjI9tn 7G/->ų|ŏ%^9`qyv~a7ս2/=_|KJ3S﨟F}ç<9|qN;{=0a;.>->7[ç'nq3pUwvNvv˙]T+;;'<*[x? (-kgr}&E>7?r%}䰸K>ߊ¡\P~+T_[?fE=/\̮aG+Wri|ew'OMS=>n/N^cџ K!{_o ݵK y#ύ .Znio㢕P|stbnqzճkXFŋ-nz4!TөL-8Lgx5r /~Q+I_j^sN߉ρt~Áσ+}.tfYޑwDύ7IQwp't7z3NI[8g7ܚ=ΐ:no=O=ogޜ_zWG{|?r'[Z*ri?b}_݌}L~p}PxWkyƧ"qGq+Lg|Bq?og~,iziOzBΫWM|/;N9ŃEw{4;q6=>TS^s*ΎčS?n~<GOPqiՌ=~uy"'nJ=WG}Wz)G zc[?n Oq߷뿏]jGye)]HFʧ=K[#қ=<݃qɺAS۹o8Ky0epo^ޓw>b9oGQ&_U?j#7+!+W^r.T叆~?υ-8xZ>V:Xٌ{񪽄]!G; OOrIضsvSqjO6_^v5^P>Ϳrh秕~Ad淩vYq|wz0!&r8x@Gs~u'޲m?JOvU|ZNV: 9|vL \ŗyR_ z׸qFcU깺M{O=Q)Z7#ݮ?2m~?o=:R{d~5p=7YxWo_~qo/qlW ojўww}_ȹ}s'rx3:ߊ |Wc໶qw~yo-0yi('Bτ}Oq[Rp@p2`;sߋ{ߞ敤;t/ y3cgaOz~_WZ;a? ά+v'p2rI~{Kl:~~[SDꇃkCްZNVz{K-n2R=|>|']웍9M܋ԿTh?ELZ}p2ҽ ;'&~>ϞG餷83_G^ѳ*`cӿ}p5| ?oP}.{h~^7x/}{.Gy}!'=/#tG?7!=J:_kho+Eo;Yߙ'^nEN=QrR|Jҿwv!R6]S~={;Unq?zxKyt7h\{}kyXCͼ\GwqjI7ӟ޴cW#'7_G>n&_%-4ߓ6 ?W=hʻyrY>?>mϖ1[s^\R$>|YM/$ZDsO~ȇߣSߏ>7T> U~㋒Oi钿S_S~껩~u/~5?|ÌS-y&h]FB'[4ʹ>4{ѸNY:Lu=}\m׏i%U{}l/w-+}8Za5f/fɫ7Οw{oD9;~[q^ݓ.~ۣΡ3+9-^2HW)9ޥԣ0zOs/r緽}.t}#v}ݓc876;8ҳyzaT?hWp/|Ͼ~Ďzf|qOد/o+}ii'p8&/? n'.n2P^rȎ |j W?oIyOrxt{o/? yЎg.gҕ~˩=#qъC0/Pq+]H~?gg>z fqF9}+}iAoeᇊ_sCo_|ۮ۽ҕMzNyټͯS-˶q+>^VӞO׿G{ uq@Gt֟ߛ>Ѵx68Ư; 􉧍3 Y\Ї xaj'7>tO-N?,zӊ^lJOn8M]+Bz_W]z׆zxw=+]D7nO\O58O_.qRb<?!d\xZMyᏳq_$/GO; >6.艥oz_/ߗ6‰.g])G篯ߛG75Ϝ\E?-^dKgKҨ;wgO3xϖ{UNg@19܃ptz5OowŬ/7a]Ϗg)ӽ)wgt_~~} 8hi ~31PW߅{K 7xqm9G]nm lp\{_-X!~h6o:8OĤs/ݼ^8^;xxE~񽁓qxl|ߓw̸7.V_N:~ ?/-NWaK5ћl>Kw>鎗{rK8Cnv?.#gڕpʣv'G#[igzo<ܿY~Ϸs+E.Cn/Ǎ<^N{c҅)ض~E~y锫^|f^Nz vOqݯ]|4W<}'7)'vwſ}o?qϔr㺍[:[ф ·zsr9q'!WgGZVq9nC\L~_Xoɮs|om~cy9K<ٹO)G;N^L%_ؽ湸 q7k]Jk6N5~x㏛)q_'][;׸޿ԯ[3‘!Gx'·8m>Og+N'F>h߯V\Q\uIg?@? ޥ_qd (?hU G/-gߩ|?TWk'r5Ԓg]q^+ЮuX+)ߗUo&NN9SON}Wd⻾>ERKk$o4d^eyY}ƽ~&֟-׋~䃣pzj]>zÏ*q劉IO :/?o~sNO1CowvNz)>^\k Uِ'祏9u =9 =yxa8G89/\Gyok|Oo9g|<a?]LƯ|4^tʇcT==/$L~:q\-wR\MRV{rQ|?4k+.-\M%']>mۦwRN13unxX |JWzO.|_}7;t &}_AݸkϥtoNjvcb}eO#9E7/W=)q죬r|rv7ݲOzVxދ?1O;v.>t߽Nx0{ކ? =Q >g9:sԿZAIե̟o?c_Ε[bGwv%vK\t/%+7۸=>^ni"ŗm鷑3xx;ܤ?:rO$?/GGmr&]4&QB3pp p>}e;j}~Փ/$G_qRosh|#WG{߁"'C3磯-ӵ<~zB&ޓ8o߮yO?SqX*#t_rb)ǖCo|_F>yO ~Og;='wd]S$Q/36xIzp+21ܟutM<{pg,]췳(Ѻx=9 )VҿIozO0Y:G=}ܻW<{Y[^C3+S~sVr]>yO-=. ~c_{dPz1Jyga'{kҧ>]?'KC>/F&v礇]qoCIʝc|~kYfTo*ߑc~^{w&r['ަ|tKO?Gi>]{{(7I?QžR_?/XNu?[?OpN3N 9pB?G`|?~C_'ndXJ?Rm<.pSαGz`n~z\3hc_Xַҕ~x8@3g<&"9/n fy@g?k=-.wߺ]{J?v\?[+Gz޽sO<787_t?~x>z$]灬 e^ҕWo"!m'|S87,!['gII7Jo3.">_7C?_QiYC {P2r}Q IΌZR~L_:w3UopPL< j^Se=wQsq/e71JܟcaG8J}=Qw簓z~­'» ĎqYAk7'WϿLIŽ' ~j S)z!w@P|kMﴟQpE~g_bG<+=`?ppW_O>ս>7~ɰ#/}w|K<6?? vq;xc\#=>ԼMyO>E?] EF1%?}x>^Όh2~>סD?#_՘/*I\{Zve~ؓ}'hl쾘7nuN7\S7޳Or ܉qBg3'B.Ź$= RW'g̷v~8WFyGw9$=p ×UƓ.>~)>!'"_ek|w7nw}uQy8j?v z]W/dQn>Xy:7!~_ȇq݃WG͏䙾.vZ>ϸw{_ָ4hr/7$|yG;_rs<yzi1N;#\\;~WkX9xWPWǵQ.<5 岷]sYa#_ҳo#Cz%SbO@7Lҍ=3Y.Qki?4޵W_'kq'_{tiMn/S~Ը^ !W\ e_ySMp MIMdAzx3Ծ|~Nm<? q}.^ucyrYkmL=8{~AnB'N;ofۛ?P~#|V~K?{|cܨ?p]{G&_q1y=?R{!VvM|Kۭ?|'t|r;P|JGy/ާG)~}?Or=OS?y|iډOU~?sCc|<~6َ{IdGszɷվlYN"OWsq}·3VN?^8[ꏙ_WGywƕ܄µYg?KuPsO}_)\ؗC}{$9/9Voľ9n=P~qK//8rg\(yCOy_iӍG&߱x)~§#i|Çzzqq]#hܯ;w^.mΥŏ\\̸;yoڡ=nIznor/Pο;{{=kH8oj<ߓى١UòKLɏ޳՞zZ^s?v-ĮZFˎrFv4yx5~Jyx{o_MהǞ]G4s~T܍Z;N'+ywGrI>ϿOpw"}n?>xr{Lůt(*y'TǸ/~'m}QgƷR?<#/J?/Q99=>X|V2*Q39!gO%,y&73.(6g- >zr_oVkCoz:7oW{GdGmQ§#9Êv^ѿpnKfڸ!Ϥ\4zaiQ-N33Mpkern>:~'rٺioރ#egןwqx;{w$xGC/}L;߯ߧ-cH>l/>A9p2A?_|9$9*6%_7?X[G3_Ѿo2q't.8q_š%gƻܚv9s~~_? ߹?;9_O9L.8#JB~X ]P~1W:~_Rį}/9ݡ?>MM/š g'wQN z?w96E7\ܔWAw.{U Sұ۪~E?m~g;?j⪔_~7/sDy|OO ?ɦ]Y>vgx1Ʃ8qG&R~S]9i(/]\N.Cvyφ<_CԿgg}Kurx(d|*ٸOLS_C87('VL/)g\O8]=⮦m&Y[|Лs_<~2c8 $_I}m\~}~/\_r|Eok-کr`NnWݭѿC~7W2\|Ol~Lȝ]9wIϐY2^rG)S?8/1ƥ]aP~\yg~OGg&mGiuiTy&ݏd>-j`}Hna\\~Kʵ>:]Qkպ!O/f*뛏X7hiO轌ܠn}#)-KϾtAKyݏ~㼵lq?3.Oyw9.8..3"%s @^yM${0~/*ӣ3ܐsVG9_bs?&ρŸp]7ҠCiО_ߞ&sއ4>y|P :? '9&gyߔ㜸x_?kWV'晽9~裏<~g~Ocъ? ks.\;jٳ:^(}3Cb_ѨW?87{s\W7Go:;ƫ_bL?~N?*)ŧ?L~4amle;w_;r<΁]8?zxҥc978ŰߒQ{*qس,ߥ?J9~&#ߡ3x%{?I/R׮K~"o/g޸áLō<r93CC0ۜ3@pBkn((пē:QdxX?K?lƥmks(=^|_Rz>Q(~Ύ2MWNKv\kXix"r?:<1; }>g|S'z#T3>|Wo~)zY%^L;oWggg=9Wԟ(}]^CqKOx]?nۮ0?o~滗z/7>`|Kɽ/r_6^UwF~P~շG_^|_73yv/7q98{C;t^(xyyw2[砽O5;~45S97p}J}KUogZt+c<9y{~}zE|/3=Ww'ώv()^/7ڽkXg_qipNwj?K9]Z;^GSO?,_EqاyG*ȡv\Fp=okcx[whq4Q8Gҽ#~8QA<8owIJ|1' %)]7y8岏6~,ֿ ;v?޳_K;ov^o}1}[ߗb,N*vjCe=8?lꙸ}vEv~8>~o pѻ?n(> ϵwZo~__']JW8ѣ|wᙎ^{/;ɘ? KVis/w\/uD}/]f]J}\A黯}c9Oug$ zo{i]'{37\9wN^Zi;q1sZѮi+]nv>_s9{gyJWH^8?ء֟k^=c8Olh/e~VҿKԯƭ?c~=?{xċu\Ԯk+'pC_$0~^uLJNe)ͺ0ރ{R=tzLJ6N?@C}Y6~r'8o '=CӠ㯣ϡI1pw9VGA?Aſna}ÆN|B,ҕ-H]wQȣ{'䳡'}+]ߦ7Sa:ż+SO?'y'{'W7Ïq1Z /~r{+]~Wu9ZAv=7~tޯMWU_h|_<ϔƾx nJWb^qooo+O]%8_Z7+}ri`p7Vqom_/7ڥ]+BzWO"⻋Wv3~Y'G1r_JU~q$O_Ѥ+:_wVJ\ZC5BA:7_8O7+}ri745װW7ޙ/9\`O.-N?8U#Oeq7c_#~ }՛gs)+2/.w9OhqQ;#sc7=N<̝?&w_'݈#W\uwZyqү{o]v<#qsϥKn+?39{|eaM~^'_}P_T)/w|ƿv㯇{|gy~{izレwzwvj\GOq/z~:/=T\˽f.Tҝ_zfL 9=o\ӯã͌͌͟o?MZ7x~>O6J?{lWu '_7زedN@ BB#tpj@vd(Su_%"3#_?~~5`'uڕZ>ǘ1~>~c9'7=~(+uU /?G?M^񼜷}|N=ru$;DWfW~kew+~PϾj_x3LNX=|/67:˽;ז/xP#帙pVzLWӟgY~ ?V{iG }3v6^e*>]HBۙK3RkH?jNXço3'<y.syoPG|^>t\#*nxIn'!?ENH7=wv!s;]Gv/mxcW>r_Yp‘}G'W{n<ʐl=\r̹u=M?| |ͮe>ܚt.s;M}rN|";,%}pbw*Q/x,^pD+ 79*Bg\_ nJizv-] kگF{{3<;n})>rppҽ5ң_P^9zEܛt[_ϓ/dK߄ut7 x')(4QkX;GqRy?ڤ 2;`Nk#?ŋkƇ#^.|M[S!~"_L:tF|@Jg'g'||ᦜA/)7O%;|ƽ+7w+ ⡬?Lq TKIާkKy^9Z범zSוCc?ut7o潼^>;xPP9{s;K~=o{{?e6bOyg};(kv+ GJ_*}ńq++#8)~ҡW>Fÿ &zvJ<}UR~ J/JOgC_"g}U?9K=yߣ}ԮolJOϯkS9 @._HK1W G&^K'KuI"/M i}g"'̳wjW\y)-[zm;ᑍp@U] 뮱n4X ឳv~ tt :y x+9cGܹ<{糛 79uM{\r8NyI ~?Ѹ_ݰsv[7VJIO/G[{-?sFO P\ZNh}\V{Z \Kq1|M%7jW&=x׻:mşOhOq_6PxOk0Li*7+}hAeŧ?RQNܬf ;pl[3oVC{x7=;s]^¿ܧls8/mʱv[7V < }(;bi3/pqγmj'.s=k:műFB޳W |=KyOةOcJi/*x/9+]J=~X<OtM=!~nz7*1/$b޿Lg+ZT-q{/"F>CFͣA͗| 993n}?Zכ+݁\?wk8*tqoBgooeOg Tܬtrs)| OO| _N.:9 GteyZ<'i+Z=z}#|]%{_;rppqϩ{jj[7w3| Ww.OkC많<?py_;j9{c]Mۿ/O3;LE<;gGp)>'OybaN?rP\h˕\*O#xϧ~g7N'| ~dK??' a1N[א;rj=Eɗza|)4vSkj/]88ʯ{mHNvyr|Z\yr?1~δ+}c_B=7~r{qa+&c:K1x~3*,͝?c'4ϟ,m<{Gƞ ʝxYVw҈/m⳧h0h/uՇ2>v v?>g~;jz_t[hWR.} ݳ9pph?pch鑇!'wg7F~ÿJ'V>>=iMxkj&{;rV2Gyé==U 1u}-PU7… W7[ŅI~“/~䃽e#+c8+m{*g n/nކ?Aז|UZ[<#Y/]'C.K&i'Ҕ`-NTzc>O_JO6ra gZ~I]{{7¬w܄kΫ} |Ziʛ|>n﷖|rǮͱN3vw+rhUM >y9O8f\N<doz%9p>|]/}L~ڋ+{~w}x+}:֏a( 9y-Ts[v2΋a7B_ N*=}h0S_OF~У6>]z6|ǟgG:3 ҏ~^S.N/i>b?|Oq8ǯG;)/\\B;_lO/emkO\GgBɍqd2#h\z~܏0Os!r*/+=t͛{28w`g-# ^kܬioyp$}}?]ZSt'Z=6 F1=N9:^ϭtO2-V?/;9mOq%JWz+n >oc\\PwYntn+= tkg-_c)^4Ko/-nc祕$ &| ;8?%x_:pvB{ L/yJO.-.]pCRl|p{7p3yH_p}?\/ԋv?گ{)q ?(,븷LQ"/1rvS~.rғK+筯0opp!X.}2ҕMrsyK1O9O}ڻO|9/ܰfsx_J& rWskJ+yI݀uWҿInI_/]vjco^s[=ɕ`ONmO7d؏G?Yƻ;o|E^/׃+]IG-_RIe^t'gJO.-۷y3\mᲞv}}SuWҿIngrn^99GƋ|?u5^Y헯rғKkW;&\ q.\`'C=;)pazeW D|'￷Vz{ou/~ة<yB‘'MN(Qr9}f5|Z^~4## Hџ?/Hw詵3;,o>Iş'?; ?;p~?K[?y.SwW|@N;թFϘ z~G˗>%_>F9:nOw{j/-7x([_Ln_@~c7W/;{lpG8F~-/ɽyߘwu(y&s8YG;grîtUOO?_hx{ovӾW< nm>0x{ e;~܋©;Laxr&z1/i'ch}''}m{ڭ{zgP>H^WBrϼߗLڿ~1I _r[yvIևgW^ӯ&9=׎C~,ǿQ!dmwn,篕#7Ҿ_^v3~~g_&]O 6iK1c֯*/_j')DZ;0wC_M?j&~?lr/blImC۟~}QڙBWz짽ɍM{ߴ;<(> $[u~[|W>)|#=ϖk='/v{~$J~?M ~ʓ\WY]N?!NXBI߯-?3~+O oaU^Ty?\7^yK;!'G-rf zokS. MOz+EAfeҕ~!wc>|w~\sXJKY?|8ϥ/o u}W/En g~釭~]z<8zyfo>=t?g藫/^&<|VS=j<~6_y_?' OxGN:ey_>7ga)Wl.p^S=ڮ|)';M}o^=\Dw#]ۚ{{Bhpix*Ŕe;wܤ' V:7~'ԟp/.޺m '?T8WO꧜gx4iÇG߯\R}cG/n8Qgg8D~RUOLaskPHdž_/xԳ1{ ;h9f(#{/j'撮!Ҳjg.{#'jG8twd~u=|R{yG73+qnǩ'5(K;WW^K'ړ$n^hvt.(g(jo${o%?_9k|#v>k,{&~'?GWGÉvzSo;v<=^@)9|ve?>ה7pҙ~*[Y,>2|sIҤ/>7njڿx/^)'Ti/M+{K]ဦ4e]5wIGe{o%(Gsi'=#鄗* ٕܳS_G.^8C`0'ȇڻH8v}2=c哎tR[ʭR>v* >鳳6u(G8M9k zՎj‘7߇xGן'^cyS^߆3%{nϙޭO跟Fz)?jjG5 JGy[n[vci˛z"oxIy4}s\ Wra}Bo=ֱ;Ut[IooqϾx^>c:j{}mʩ~M>4>ҾWjo ~mQnQc,vF~W{tΑs3/S~ CԞxt'=O;x=;V;'SWnI:=H=O?^֟l+3^~~ _m,۾]?;?j}c6|[:wk_gi9gyJ|{ˡ?ݻ{Dz38wqcߩwaC.|_]^}ϠW_ʳ|?_|7(g GS/ WJh%]zs~C=3Uϐpʥ~!Szo_{homڔz #3L=uzcO^R}w*&xzWv-CyWpzz}^O7UeO?*W}5=y&oCeԿٙ!_ ^g/M\gƉG~,_k*L}ꉏlĻOOpiG/|>[;$߃/C ޛq%|xSJx|ҧv\6Z<}ЋX7u\2JW4##[G&Թ m:ﺞ+]*7q{wlrnw]ߕKEr?C>nu-M8яVYSGyNb䢸P1V?Ϯҕ~)r/ާYC.[zҧ5 f\JT9ĭŅ ʾT_s+(>պ\Ok7_.8K[pK]68Sv#?[yǥrUnVq~_١ 3#Gؗ_CQs/s;c;Nf9ݿ 9:gy]sBWt<.=VүUnܛv^Qy.ϳ{=i~P?yN?Zow~+f#d^\X: .KgE~j%Ȏm픈7+݁^_xgݧ#S;R;|jI/=L UnV*?O8vpÎSߓKrJϮh+Jv]e l<׎|#Dk-eVүEnry~xRS9p?ÅyCso]VWzl~;d=_U*ptM;Z>_v*,Gq?O:ώtlW͢>~Y?OP9}<~p MۃD^RnvyVߨ_f~\ {]dg<|k9o[{yf9"/m=ؐMgNķ%R /JxLsb-g9yaOK<ۍ w:o淸S;(7{Ze?=4v?\//< `qy|sĎg+gr'wa;w_+}2C(?@RKx8zs/Ƒpȃz|~k.=ϖ~h$p.ZD Wl:.tO(9rS?6?駆ކ_~\7z]}{yN]J Z;>sCW .}<[.9&΀ةj{}v/?V\_J7Bk^_U_7=|woW}ϙoF^|I9*3zz_|]VNޘofu37~#o5]>/s;㜂<(1?Sϔ^?@'n~%''7ڻ{yc塸x۟N*^ysBG,sc+fW_ËMiǙt&J9~޹[νk1q󵇛vۣ~NooM-ཪ^/F/ܸ, SڔOx z_fK~w\׾ ??|n<2?|j84Fj'ćbu%.{:y_J|o^e{ǔ N%xM:I[꧝w]o=?IA$JUKOrUܱx-;3쑙:\=NzY7W%/; ey?{ewx&P.s WO*bɬBk ~M]ʳs#vXU΍oswM#tIC{dɞGO:=9-p+7§jYEIR=94\ǧq F\خAZWåЯRXoģǫ~?p?z/+kǤ?v+ϭ:h{o]J/[R?ܼy>.ȌW&ė}4r˯' 1%qd[|q!p*7;xx{='}(Ǘ9}҅i)u}W?b[{}l'5vut{.fw޷J' =;<viϽ,a?SN;q޻q|‹Q)Kݏ({Α%\0k/_@?^i;gçL?§ &^'O#?W8g/;>/د2^Vz2iI'Rs8÷pps޿A+NN.ܮk+=Oy ˼h /Ž_ם֯g\a/hyrO'=i9~4K}psy8O܏?wVjeO-nι߅ps#p|դp}r|uYCû<~޹{=_O88 Nai'~}JZ)})=,OZ#9=𝤷Q[Hcc ka g Wj7}J<מk<V݇#ސ\Fznt~ZZoi ?__CX<~uĿ{fO98Ocvǖx?s6\9c]]7+}rh0#" / ; n[JCoîKǜ?~wYJw"7a×lVw+v&ޭ7 ҅"{:%}Co|o봕_ _9|ȝ/`ޘ'G%UnV{/L·Rս_~ڐv[+5lY9ۤv[7n>Z/;} ~~{zeP醲^YmnPnsy޳w}swv={1?ǟSt;v-jW}+fvܣg}z8ȹsݻ??ɡ/?xb}?;v/' <yM Vn2ߖ7oP%~7>l._OF~Ԑߎu.\.ՙ#,^ JW8x \2o?z_طZ YSFuvrhrCN.-ߝ~.|n{is%pFfmx {p/qUnVWM>sن6>6|y-yio^Yɟ K{9wapGu/.7kToe(r//\]cXn/YkKcg~\uWoXɠ:_ŭ;L\,Nu#$Կ\(kprc~9K%_m+Wc>jʕx3:`˯}^o'v}bbu׆=$TܳNPPzo/X?T'7t'v=}սß{t{/+R7S_yvn~l#"7=wK|o/ Vsie&xO/l(RΙlsR*iuɦ~w+nxRh\BWߕvpzR.1vv[Wz=yq0҇coPk;OO\B|E|?]]W.7pR((`2}?zͺQwo=@?~~ȑ \ʍWMbMy͋IF\\rW #\bx?^1ν2)[Ƌ+;Ş oݛpL‡Lt=…#~@kcP?+#ÕG}S2<w.&KK_/s;߯Oȕ2,x}(/s}F{SGpoW^rJ޻ ZekW(΁ꍑʍGq>xxu̹zʇk}׹9㗠̶SCniю|6v_7_ ~"j_)w҃_?S&<==|z>S#zL9IMgT=WߛZжs+.'ڲq =Ǧn)7I;_J\Ʋ]]N{Lp'!CFg~îSw?TmK~sԯ~9.ᗐvw%vƼPEԾ|n%[cտ<7ya(w_k,VMw;y9ش>H?OKc^H9p/;p!+t~:ɁVy;_y??Sr6=mhMn7ƻqQUnҎ~iӄfCJ>/?r%3:# 7E8ʭybLov2 ?ȿ_ |=9xէTTڭs|Ox/u xtorK: 7~vI+^>` ߰+qw wVqbKƸڣ8wsW;c\NC[KwM'x_7~s9=mǝ8_˹6\Yծ紣-K_L'؍yYNzל_tm=wt8͍󹧍ܟyzo3|16΅sy+HgLOwE|rC?^Gj/+Ü{]^GWz\[7ˌ~z1S?2^W^K[{&nM}O}|IgUoptŻǙH_k}~xp( Wߣro< _G/$=xe۟iw:ᤣ;үAvKG^Q _k:K[pV25N9ȘgÞ^/lүט7Kd*>X{ooK(Q8GXc_-G%vB(n9Uudvu'<\oW<@_Oz|_c_ڄ)g~xctvR_6ސۯy}˥]o/|%us>~O}?N,>=圳N}ecwWO;OJW9r.s|7#缷7>Mx'_G|_O>kCOϸw!^ӗ7/M|'õĿ;r{m8@tm~_ ^O6}#v\~?rվKk,T?+W'ԇ>|[8៴?r[ɷ~zm+e}']i_//ŗ{C{S!>!' 97rxL^g[I+?[_4C:%ݖ_=1֟\E˥[1wG>M7N{e)~Cދwݗ*NhY#znց%~ҺNZ̹,rӟEnz/m?עwNpjpRiGzOkz)~>`wI}2"wG͞X{C^~y),8xԋB8xt𳃄/nK?\\̆KrHrM=ON+bq4?+-xqf/Dg* ݸ*3#᣽?ud پJ5++]gMg´_[{3uv: eݻ27:c9pCԤ7uY_!7= _yw^A8>R.XOcG~Ô?l#ud{z/z 1|;ѯ~a_c'xK> ?Q_'uJ ]9j'pgpō'>f\F6!{jkw*߇ej)Pvb'jғA8-rdA-kk73|X|;&9*^\=Wɇ?vwrTܩ|v+=Yt鋽-~%iγ?yb/rF>ǺY|{It7v+=Yc<>Xf 9G/44_{NpnHG[kV7Mp7Ǹw^^ ?ÞSN ?x0ѐǼרs+= 8`bg`}/?vvpI\JO"\O56#:߬)Q#OWvOoƕ$Ut}4sFx]v@НJZ{;ʮyO=#߭V޻ /=0}ƾ'ū-_]JWziqe[wDnKGxrƎNy顽WK{Y/re_w3ﺾ+]A{lۀ{ ?oJWzG/b)9zϜ/?:O{~Ni O߷$eةvAcR~n >5r:ΟvMc>sk[ܬct޳K~vI/w|kOiϏj7q'o{?/α^;wrG_CNkܬɧ3JA?R73YpbÎ_Joʕ>t)\sv彯g?6j1rn MDžYk WWBkę>[ɡOEn0(?DɟyKKhRNw+]v;ZWُF~"sgwXg]JWx7k{K9'9YE=v^i+=9zżsKbEо'tew3Z@^o&{LG>?'spOsM8hv4J ]-͎ p"ώ~ڒ_b~e .Ny=\~iI+璟r{%g|Gza`xu]p9/?`AK9Q#7Nlux_{/*/QDu|zIYKqvx_}LR~G/pko3Q%GG8_vO|=_:_Ln;qt=iovQI{/ї;.y[~Mw^r,o&s[]M;{N9؏qOjȟk|^ r]{\vͯjF;»y_3|ӾO?㠽?zڟ#}zIݾt)n%o ~1^DyK&_oh0c\Qv^c_?h;~q)_ӯϮE~gҾGO};Th/Ǟ 3jƟ[%R驧gg减jҗQ/+ǝz:gϹ/}{?gbҧs)PA_9uNL{A?GCQK+(焓I2tgύ|cԦ]ki_ 7 -N}+?WNu|J'Xv=\O}+9zZO ϟOziS}B}3NŴ#v=wv]ϕKutsG™KK'W+} i?UϏ~qhs/x9\JO2ݞ9/ ;Pš9ys:7uJ>Z9αp8ݤ{coV-.<_uS3;fO-oC{rVT-0^_{M.VғL?;ٴ ^Cw?pJ|7x۹?zm]Jyf^|g^ӽxїfO==/0|O끯)6x~q6me.| |U{Kߙ|FR߿ҕTn¿xa8i7{m䎼8n܆E*w8'Kq3 |w{.K<kp`_Jw*7=3̄w7;ծ"]L<~;7+}r4a5+} vy.6#:WPIo']{7+}r{{-1d~^ZWCv:<']FxJi+]M Q?[C/>Pa?]+}hzHکw]|w3O-˱vYJ?Snυ5?4G{+ DorIOȞߋoz;O8Cvzfq^gwgD|{.3?Mw* 忳/\ w;}^ϡvVԻ>|࿵v\,a2¡w~%Ѳ+iNgknWF<.x0Mnk`_a xy!w|Qt|xf)oc?Q~.uFq eC'/|^|_Y? }~>3C֊yeZ?쿴;9oxVN+f~}y'_>ϫNn.ݴ ry |7yTCn}s_g_qzzy6] ?|C.m#5Of;ϑ8+B~/޼VKIkA'EH^=}#Yz\vм0'ᯏ_I>>gg>>+$폏荪_qJ~h]ITis>mㅿ?‡{|>{WO-. M:՟'\x|gW>ϊ(~i*~Դo˛ZK[=?Ҷ#C鸹7_H^ ?ɮ] w$LK>·ç _x{s'⟖DD[?rY|8R?jw)F)h<Ż-c[9Nqᒞy|ӭfOmiO1ojS:~ѿ[N||.|-<9]9O~k[:yMF+ڝ\J7ȗ{MgBH_Sv͗O:: <^v#jߝϔ'"es䞘s쫷|w}{ץtZ|__tMw|/zuȍv=;{2#7ZE_ӑxg$]Ν%='ܗ^^f\Bq/yW=];USOx]JyU_9Rzʮ=;xY]N;cڍL.|6z6en/?k)Gӝ R|Rxz~8vn /$ߏ&8}O||ώ;9pL~ڙSRԿzmq6<\ >Ǟ oQƵ'γqť]JWW\_XWrCxd!EYgw4?Yf=t؟ga?n#Rt7rZޟ_癕\?}Wn9s^oi򹷞 7<)? ۉ߇{n7Bw߹8_^7+=yzN|?l4 9<(P 'G zғKKɺ8Ky+T¯\JOvm>Zwd=¥3p+]I߻~{'d☏Y%W$WQ{p+]I7S?xq.r<9]JWMLpv>"DؗqVzrig(Z׷/{pKO;|uWҿJ^?D~NE"~`o'po`ۄ~Wbl}g_ŽMgo#?Iogos[^_-_x/饾p},u c=~xq bq=I?evX$9]Lb/Mr ''g~[5.+׿O|d5?~c)wNg|O+_Rή{^źGy\·{MW^3:ty$ްk~XK~>K+Bצ;7H}s~e[dK|a|ɫ}r.|ۄ'+ޛo h'|5?<J?7^I_{~_coW.?7qU^J'ʧڋwG:Ro@RrshI1~~;r=;I&yKx鑃S|g9{/ɷG;$=\?j徶'_|KtN]$z|7շ~5sN N _S(sbM@L9_9ߑsSz#pŗ$|S~2r\[!O8]gCd.9ҞQxӡ{o)-߳c{~-׭c#!?{Oo]W |49yzlS|u[|n>31^u}j^ᨷPϺrӮB/o9sqy~ gf쎽21v*{%}A6ʛ|G=zۇx?\kӏXgʿCϜ|13N_[7:L<̷814qeݖ?O-P:W;3&].Ïh_ ǺVc}~R^9Kz}o<~bnROx.u gCIN~Q뱴ZqMz&\]c\߮i=/Η}ǏcWGWl=y{Z o?^|tsp/5_=zSNټϹ|'7[={?&}^QW 5ldE*_zQ/svR.ыgp]pٮs:O^vY~Ers.8^<Ħ_I|O~(~H>pXIH}Wx!gF^HyIomŹc|M>7҃[ y_;6~<5ޮI&i?K_},^O >]'vG_sỼWeyZ2~"ȓxGڋӒ+D[~w^NUn+7{2/Y'Ԏu~7OT.|COᩍ3O0e^=$修KqM;Õk۟WéGTG}rL.'?q'f?0r;s^%Ii>ݰc#s + SvԿiT}_J{ߝ:!zz__޹*w%evcgƚ9OwSNg9u;g$=Ү{S/{6yz_dG;W艂5>O7~#Uwow?ř$;~~$꯯~YϾz<7. ΆrO#_ ;xw{_e}\H{\[~OlY{mSyƣii7ai߯~UZWM+.:;!,#_|쟺`)7'}|||ۮ/ÏYiD o-\q;ڃϺA)O~-eޅ*Ev J8ywKcڷ޾J \kڄse(?gTӹE2]Ӯ}mwڭxR)IkO='U.ӎi^#yv'W:.q5#Scз7@@oSV..ϒ =rѧoȇރG߯ަ MI8ҧO7PvmP[jK??|/'5OXMv,>~ڿc^D>n\v<']x4;~Go=^zgދ#ɜK8|mop5롳W~#Lǎ |OӁ~OȰws?=ڇ{?C=+ogGKx_Ǯ˿ ]:A~mxи8gJw++7O^3<ܙu=$oz^W9su\|l;k߽>v˦r$>awl{#}Kk?? r|$ҭqR|oN!>X|u4Z|q}Yg7-_^IO=־];owbs|zRS.7<{\I[[1d7OܲNM;8vvxz4UrډSԞ'[>JνOl1dݶQ(Og|s N>y s#wPDn['$? 7RHXÁKYϟGK{j+nM]c+}hqp;{95?gcF.᩾qOwutY8h븁S+C8t:Iڕ>0w>1O?~Lt½wco{.J\q4lo#7q?R} \bO.=c=/rw oq/v7/]fO,-Zy0v?kOpU wu'w{=ZoC3.봕>ytk n-˿ C'ه~??³CL?we:+]@˟_'3 n~h {3~-.{?9| %ypw&7-^'֊{#}6v!O%==?v==gߪ'Loڽe'qe^“}~LJi(>|"?xp;cօs <|CǼgrB_yiϮo[{?v>up۹o+CewȽrqP~7}9^U+oֹrԏk+\,#v.@=gߪ?\HGkgA4Մ)Mϔ_zU#aKJpS;F~F?5Oի&ZFO Ǖ~~g*|sg ~_+eg6yY?MyBg[޼OJCre~畛M:M׼0Y3*M} Z;ݞoo6mR&CMx.;}6wݏ+zi*z$8˞/ӣ^J|wZ?3gzz̋y?(#ɏV|  e BN_Gz*7u?륵C/6ßAD_|?^c|N|: \,Wgpny%Wp|eoߏI+ܔWҟ;$GQ |ֹe;>ҞmJ;)IgRȿq4X~^qk9>#I%ܷj'鉤]ZwA_Xoɛ(kO}'y_^O.ʾz{ /7o}E0V>K9`iU }cY]J>'~ pIx}\J_tv ob(~% )וS+??~[']}YZE߅7Wǭ=#Q'JgO-=_S%Ն=? xr q'YI))xq>SK>޶˦>.C9JKSOWRL?Vxz'4n6_rgNOWnA3G##93o|{aGC;MI}?ZQy޼GkX;^}{۾>:G:pFŷgzLR-|lx淄gS/}-K9?+k?Y=v\A{T|O x ܧs'엥%5G.W{ʕx+ 9Sj|>-ow}Yz*~m ?[8Ou?|ؙ;?_ =|-yಪI^n+xNE%[{[=qc3[Ak'>Ԧ^Oニ+rlK:\ u#>Hzvvj|O?^gKz. {B{9k~ hOx..OׁxvoV+p:SCN͗Ə;cW ׊ow#E(\ߙ3_ܔW=|2_VdsS\OZo~gWۄ%z҃g߉Q~^4N~q~z1ݧ̹x|W|PjIx7t#C'ɟ;C%JW9߻ZXL[ģ!'D^cI~NⱇޘoWۄuɦ[Cv5w‡w7A3%~$|CO过^.U/pz~YNLʿO~=v/+}#Y8|WpK 'VcHW *~ ]rVyH/9_O}J?_n:8{mA퀙3?-xB'ğvk̼pSn8|p-z.ҕ>Vn_ӬuGKa\FCϺ3۷ܜ?YW\aҹ5Qҷ:߬Fef9Z=kßS_M:G%9n:G~jsE>\fˋ䙞 6OJJoHOz)Ÿ)9uak}Coӆ}3|;߅pSF>89hsxҕ~!9z=|z3??mk~Uq}]Э]>XM|#^~k? w{]|jg6?;pD?Awj)_ וI[|]xǼ{[?C^#ry.k/UnVzb{0q-Hiys_>=VYɡ[ι~a~sÿվeՏ8GVzr~O:x!~8Gy}zz /|Sn M~}aW䈟F~I|Nz}p9PٴҿϤ]Mˠf%8GȳxKV<թ>ѵ;;M~ bw8(;p,6o&D5߁zu(ߏ?tt>~W~ڛK{׏\,I?7ݬWGG{/)?X}²?gK1>_?8iv̬c/Gy_2Q^^v_J>!ZQn=~G_$I_Q_ǴOɛ#χI|g?]3eF[g/r̸u8<> ~N:n/z$}R ee?u3r.^L!_yUkMdG:;̮~o?~X% Q3^#O³6N`픥+;y/#{rg^R!wO*?{k7? 1^h~UCKڮz?lk7}ÑxQ;[epO[ŻH'h ?ő)MzC8T|gSMo͘6*7_HnjY;_='eor$#7or&M OQNo1ke;Hzr[[4TzXsm:P9o-#7sCI:/eu?&oy%ٯ#z-k,yC\/b(H:;ɷz]N(~M=PRUH'yΕM]N_Թ}sQzAFGOwsb͢wxq)L ΍ZF7F5_>z迴?><|MO/w ~8? }&}!~<7#=;C4߽2\ ?2-q2<߾Ž_燼v0yM~(HϾRVҝʍ{γ#N5yok0|yxom7?w9slJwO(5rCqsԋ^~H/Nҡߢ/~,*/+}rhV{itxx#wK'}~m~SZ;5Iv9/yJwN|B{w 7d~"/SחS~N|y}hq^5z^ҕ5zRe|谗V=|׏^SKZ{7%Ɖ=} @2ޮw_ } qǽ_j>q;IKKJywF,P}=]4ʑs]Js~5AY7R;yUҥ_=L%^Jxn鞷r+ Gʭ)WזǶIj!g+};WYi»@j)|6+I^8ڗJSoJnI=كsծ²vg;n.u+}nSݪڳ V{P7k; a}.@m+_S>v|nH>onʳtг||~!%;OM}Y=&܃|< /lSٟ-Lg;MkI}u|=ԾcүETRvN޳[cY;綛}{/]WC{~Λs9TqvӝK;r\唃)+_hퟧε95H9Cn׮J/ï颵WyOO\_ z1ȹ1G>.GYO_ywϡ-OⱳHr Mxxb.8|رuG|L/b ~wcFY~M8MxP&b{j Ӧ͝xNO7@WJOqOf> :g=Qn#8yut|f[{{Οzf̋bvA ^1YJ:xiz6x ΎL+:mOhC9|]=9mɯG݈VDMV<y>Yi+}bvaçpvmҡ;/?;Vͦ[G ]϶pjJW9y<gy-. ޿+ݍd\?Q6ȅ{~+^/|=i1rn~iqcpa-C_{G6rfg{ n~iq;˜og;'pv}^z΀FKs&9eVҝ{5_-3xwO8s¿)_q ?Zf_|\dҞ }mGNv]ߕK_ycˆ+;:iu>XC{B.q #Gd]9L:JW͵=~g=˞%Շpν=8+]"7E>'ZK=t[G~[fOK}{ݍޅ82U6.=+]I[e{K}{56W̿-#% \Og98;Qp15/籕$TnX܋ag};WZ{kYZϟWЭ߁ +-ϚY|:߬g`?}7"=}]w+RΒ&_@~ki9ӭJ Z?<R>}+\<<;p'xc,_ڦ?&g"fb~w¡ľ|iS3þ(~'8-vF~_3sqQxȬWrOczE^^&Gr~] \'3;Yl~ߺ@əM9];QGinک rc? <` : Ξ[~3i6}]{a4gK.ۦk~ ? SB 7zao%yM?gsmv&|bΫ]zots.^z 7nZ\rsM/hS?6H[z4~7u±=`p|= =2ߓ{"9`,}_FϽ[K)O\^$}c9de7oϋW=E/.FV,G|\{f-iyb Ow79iM1j}Ү]M"7M?n?/]9yWOfC5_))(Mq ?{֮Ӑ8TK]ɢp^[92N|߰4`ˇŋ=ܤy59aϜ7jBz?yyc_{cٕ, G;}^yw#?×/OOY_zi7][\:7g`w9}~1qxs9TsOZ|k,}+Q/e\})oߒp4Jx%ﯬrs#ԾEpa~Q Gп\ N{ΏmY]WOG^ݲHe}|.C>Vىό_ZEÿ|7ʟYO|Lȼ:C3_xμQ]7}cǗgl9&..}÷w>'n!v*?+ﮌynZ(c'8LwWSn+G!YI(d˗7'Ɂ?G;=+=zrb_қXe|mϰS5&}Yז1}ʥܷ[ q4?ˏh]J6}ξѱ.H>B[S=~^n[v)CϮJLugmoWboH:RQ󿾜/nit}::S. ohge^]5ŧ'l}s0Ǭ~x~1\z;Ǻ@n0y6^\ޤpK{^O͜8_~m3/V9z v#m޼]x|\9 z#їt~Gos>麏<~>7>wnNҲ{y7\գjeU\vZM۟E?GI_9 }fWRIg!oǖ2z#zY #~v~ǖGB.>nrٕiSoa >8g{=ҕ$Zn9-\ |+~l+}h':fW~]D+9:߬5A}y} OqSp}JZ<\(QhV?F$-ͼa^<ɽ}"W*7+}zhNs pqu9yJO>->9Yph=s9\qv!_ '+]I1#zx36}9y|БJW4P~w+^y{vqQu=Wү·³֮6Upp'ܩ弳IfwҧuW=8s=vy|J>W>gW h^P ^srҧO޺7B/e-kgUnV֮ӿDISJ;N7>}v@%]_,vk$r5tO[?}WroD?/3:߬[C$/{=c875뽄g1rt_L7G^[c0︇p5٥n+=x5Ԝ {y^^i+}zhܘ]6zOkp:釪Od+=tkf>nyziv؉;g|v>+j)={£w6~^3K~{( >=w?cO7@ N~n^HM;Is!xOnxJ/Wto'7dڽsC~]@{5{8MxvxgC~ZO\/Ghí37n_෦?A~s,\h훑<SN;gs7QGNoD>78i7o|=~?{~ ߓ9/wGyʁrnd_wu/^|#~_p_}cvmwk]Y\Zҫ]PB|6{$ܗuk~>OzW{+Ϟ_:wfόcBw䒾9g $3u#p98Ԋ!GE~Xi?t>z9olJ^/yЕ$R>ÉYϷ8\[yևV<˻ҕDz'Rgbmt߱_=|e];9,z^Byc)+]IΗ|D_3TR2|Kαu}W/EnnM?aǩxۑ~ؕgxWYCo?vV]aڋb0'wW9YK~to.rW|gUVziq3MDnj>}ܬSؽ7ōz=6x;i'9{g=^ɧӿsCpty|z$jGj,>5O/vjgC.u>)T{Wt賛pO8Joc~r6%G&/d\~{|%<_<\sϗ, fpijo}nFMiii#7ӎ]e}vi̺^/?y,7;e?__ͫc1q3!*?8+iSܰtj>2Bo] iWGxǓB{}>_agB_rU]?kh<ËvܼwƼ)- -ߐxOcWyrkyqe(osJ?Gn"T{ s<;tGcJo߾>NҐ3V/+ɟ%Q_/^]{m+M>ⸯ]{N?~ Sߒr8o±rmͰ'QW O:rKR^y]գvvhoįx x?tǓB7 gn~^?履?n9]No7e;C=/C#oc^ҭ=N!~IO~gPOˏnr도AF;twײ}v͏'?M?짟44<3%"_~{rx]c˅O}>9r?'4_OǽWƃ/yƟhX~ʑvn={>m9ҮBgڻ< 6*yNޫoqe)o׿'ߑOQ]7*ǭ~AqSyfo\mzy_{GƳs <ҹQ{ >Ⱦi9sB'qڳt>:'sl}?r;6I=4t.W sdٮ7~6!ז/(/)pk/'`ҹfMgS鑿W-C^#{~߫3cG;N^~1v\ Ǯ!UO%|&<=#'ءcw?7kD~>5g=xWɷӎߟ]+J|ﳛpp2rIQh3iFCtBOkϔ~zJ9:JW$Q8=ð')|&ˏ6^_!|r}Vown3#c||IɯD#p{xI8PqW><+]DïG^z(Ov3rMկUɗ>~"_fO.ڕ 9'=[7^{΋[|#G[yAo pܕI8G_|E<^7wGyn+}nuYOgx e>4ὭZ뵄~>.뼕IϽj<  xߑoaW+}iqG(Epd~>rwARQzO G_Go/VNV;hͰ/WS<t~H8 aQ^^#'t(ߋkc'¹CÏ)*]zνk$y ޴!s%|ƝU VK;?Ƨq>zWzG/¶^g8^(;.rY;'/;{lAK ܪR}Y'`'Xַ(WѣsԏS=Л>-O/zkwvg}CE޿7GVdqsIo%Ozezzx;xmo׮vb/hz$NUxmM:%oyKG|}O?_?vdYC9_(m>=}"Ĵc>ڵ4EN{oL N͙߈_s)žS~0jK_~Aڲ޳T{ p;wGؕN;o~eQ>Ie7Axv#jgԆ;W7홤 [;+KkL #_9-ǔgvj_&v_Ǿh~>-rv9H>RvEj_Sg+ܵl;O%_ecnF}7UB=?4>(¿ϓgZ7,!n~^^T~M9r'97OΕߖijg<~~c7g~~g\ݴK{<+Ot?џ\?I>ڻ|N_z/.ݔr|[?|t\$?x9J՟trWdޗ8]po<_)_'H!7گ-\*]!̳;;.?Z4yV|6H_=ҟ9~/'W9~Vn|ȍuJo>ە+nukk>4zut+4PڋMik]+uuae e=uq,u|س2=W>^M8]Wᵻzjo7>WRU?>S;idݙF'>L[|,숶}c9NqiOLzQ|ijyM8Aj;9׶`>9r;/=r哯|Ͼ9Bo~,וN>\O%vtIk`w29i_Un˳r8o~7 _{p) A{;?w{y97=3^顤OoG\Qxz 軫Jxz8GuQHwE;&<ۅ9w%6*4|Crs&$~Wn򫽁kJGn$r$|sNM[ܾCn_= O).38/?ŽW(}PW.zxX/Z[)'&}}_C~[niχ9y..+oY p )5^qo7_y{Gq!i2~3 7W|: 7?̋|88My #3&]JwC~8>4rpOk|Hn|>guZXo%~f_ԧF|i&Ŧ=d/\O8Pzyɿ:"Gߎz5?xU rϓHߧ}pΗػy}sE<!+y\ס9>(/JYzx|7q.| ~7%|` N eرdiUN~Gb(xvVd;~q~sInjGټ|Ox/Je.Pv-U$_+?~o~ܰOf1<wG~ǚ~G>484>u^eg҅f<k~tqzX=? f9i^|Vƾt?}0bÞ{G^ir|w~Rʁݧi|酞元vy`j'6t'{g7|/|s\uٝ=S}m9}^&ߋq^|9SC{4kttɣuJL{pOISA|K1UsM~9oⷜɲ?/Q~z"v;~ygY~i|=ռ>[|2ӌi׵}H@/#ߤsC|Ӯr֮g@h캿Vdk@Qrw|ΐC%[&<|4s+^'n$io3{gڽO~oIOu&ݖ׺Pk7hAejOiY~3iϑ^;u~%9w/;*9bvKzo{Y{sQO%9ym߬Ώ¿Q[ >zUKΑŠ<T.r+ٵI{]x=I67^7vo+-{= ~f/~I?G߆5#wp7.G?e+'ut1* ~1ϙuJ(2&~l~0NӣN<8P#g1zFG=I~u{pm?rnyOףּk`]E֒~ut "|+/"ұ.$ǭ ˾xOC.3]O'S܇a9xe'Ǔ3>}`)мq1m"= c>{c<:K"m?rS~߅ozUQ̆|.}}į]< sWIN^|HO"?(r?~-%|>`<;Y|F~.6u oI!Iy,' R5Wxy[ɦk7|pok%Ib.;++W5_/IWi븒 x7︱]uF7wr1:|twiݻ#$Ǯ ?De҃#/QA?白aikOJ;O.Cr4Э1/:'CjK|r`~ʏ#n o8֏Ń L~w4eo̳ҫV];t>ڐv+k,ej 66i߹uuYWf}PiW|rQI}o0 {ͯv?Z~wJOhC.>|`_ \{pn9gtN}%}N3[f#g5G0鿞x9/8ҾW1ߤ޻m }p[ZM;w.<$|@_&7ߓ7_^ҳO}|>Sɟ"=MYyυ#{7bmz N~>ߟK#|?yL#~wۏy}ㆲsUUgR_;?ل珱 [(^ZWVI~~aٟxڥy诓߲o^<ՁIxuIvC6mɧx\xa?${*#AtgLiQb1jqY#pSOIxvvO ƞrOZv xػy|]twn;QOp[?ƙ<{#|ɿt'g1O9Rʩx{גhW\:>.37뿌pB}7+|Տro[\i+G}3m }ieڭvynٯ[;Vj)on|y .~"+OWKR]^;^:źNE9:(~Ճ}y? l?a}> +|#xe ߓWT?'Z/||s'٣~\쉇jm/䧽~4k{C)wʡ?SiV<_'nG?ط]J-E.|>*>)9|ğxBX{B}{Sx#̵7~h)|Y^鐫Ѯpe-'9 _Q/x.کkW.ӮOڏ,)rgGJjğ]aCOxxЄoP8;i[Of9rGT\9E?P?L!pԯv yo՞RmCÍr^H8T._q?G|[YP9>)^HxGܣ_˩gKPڕcc5I}7>q8BwG~ݑv g%4~HȸH 9>c1)gLJ!s,G|>eEi/mvP.7>+ю\wWz3꧎{kNI|<>9~V1>|G[[ZvL^Y9?_C Awڏc2>R>A=<ڱ-wGQ*\69O|: _I~f崟\;g}9m;9V)'ISUP ;_:W:se'od~=O_%\9P7g=_{y⿄{k~(p]]ͳG^~~rd_~ش'9vrz9_yz+os7AWL]i'_gSo'S:ϿJC\=LsyvnLߣ~}93%?O@RxI:%;SM^VZ{|]ᇉCjNJq!(xyz_W/|v~RIvķp0O'yiy'?Ax7"!s'~S疴H;WީOy4/>|Bկƫo/_N<7y%M9?#27yY#g?z~aܥ~TNl̒WO0~q8/yxydȍWbgggW]k!4N9rW OB;NXOiOxrߩ<dѨ7^mh s?Hߺv |nYKo^i2ϓ~D^LެOqO/-zg?*g7vގතO.Hn̷օ֥cdѮ= ynnc-:ږ)e$>3NEhjg\~ʡ=Fj>~\3`Ӯu/3-z~z~438q } W;΃U+>MU#>yt/)*_gS'֘|R{ϡ>ٴ;r{ڕ'|-yT>~L\o/roq#套Gs>;@PtR+_vLx]{}:]2J_#^6rϓtPTo,NjMnʏKk^+|L'_~qinlJ\'ot~?h9g {FRڕIji`n}pYsF;Se=;;k=kE8(Q.ys|'Wd>q-z?)wq{6xl9{Io?_{Xjnkj'M<<ߔ/vZ_x/;~s/得rO9T<_7yMkCN<?R_|>Xozrsw_aײ8{6>yu=/_{!8vP>|߮-sjoh>c|鸠}7y((eN)9|k'sCMnGgĩ}-ʽ9><7z/,%\oy__IyKM[wxnSZM<-|\¾}ϫ?ӹsdٮ<87DZ{pqG9v) /qˏ>^-yתz>gS;gԃ>9+=74}sŗ_?#b=k\=/}6?5]' tZi G^s=;饦6WK#}x"72I~GR)7= vc/ 0T[By>Lg.۱gRSGF F __݋3%y.Q33[wBߏFW|G'>\>c/ůw~9?8R> 8wJxWDyw\ZJό/)ŏnƩ6ϻJW {#,9)y:tyo+]W*73oXo^[._߹R⽼J~sI{p΃.{r%V'׹7=( kFr}$v]ߕK#v"}v 8]k+J g S]k+J8Gyrp~t>tkw,ED>wj<%ܰzt_ޞ󵇛e'ˏ?XJ& |{p3⽾7+}zi°O>{f ԏwDvy_;x ̦<`o.wpz}/ ?G(g~Foo6/v/q p^/ 8Sh{zMuM+7%IN ћ \? ׄ#?G|xu8ϭ3 _Ǽ|UƄvk v]M/|w;b7߭jr=uW+sbu!MsOϕuүQnP=g9}po5pX#|%s6.JFyqWJ=73Sxv5O< ħO3m;_<3G~~2'7 _'<~ПG/G#ϛZJJJY_Mϙ\y-Y9ћ6=xp0 gȮzו~r~.,/x5\Gyo]y ?W#8xEzXxы֏ܬ+쓜?I+V|WyTFs*p;B {9>lҧvK~sgvЋ󵄇[_c䆾&EytWS-1~GW/UnAo`_k-{-g>zc1ӭ>˻#_v0]JNON2Ov[/LO{awB ԒͽMzB\ jOf?[yt+̓SKdW>OC@z'@+_?}r)ݏK9~lplit_\`__=?<? W~>^{]ry*-O9b"Д\~urc\u?]T''xw:RXyts]Ik?_Y}8ςǞmK _[t㕥5| WGOu/nwn}PwKqAS?f'W[Ώ*7+sjG~a|s/|gt|tX{y~f=gr Z\mʥ+'?pOS{<#x ehqtrY-.!y'.1\6oy~`^J=/绕~3i9'|\oW\~>[no<Gu^zJڿiݕWV[݇?4ϻyF}QP^X>t'٩{}9OjznW8+v]ϕˤӲn|\JT{sUCԅWi+m n^;xU^p=ٕt+]ާ_13гoxvN[i+}hq3Z PCnЏ\Ѯҕ~ryL{lw"/I+>`O/z x>K{i:ͳDJW *ݹOZ~>-W_y;͟=&.</e=^c|?#Vy˞<9y:,_qW7^e?(#bWo?C~XqI[_vH'O-uJ^h{ra~v]ezN!t.oɞY{ͼ^ŸD^T17[ .n~κO=]^`u`]Y*{r.}_\7BχWџN?zj_@jO) 9uL?//ݶ^~/q~Gc}1gnjA<|Ϸ|/-7fΏrDžrjFt1v@4q/?|n>mK&;vu^t!x =Gݧ;>a޳HG~gq_s!\1~=KWeǯo˩}>Pv_{_~ɯ?XgO9C6nis[xˏћ#~~o~19]^Z]Msu|~9{G~;7oד%|Cᅲ~g{޻{-±g;WgPř}?/\rs#=.-E*GW>~VږgC/?Z_מϼWk]ܤ=?ďԱHOEw@/;Ʀ+Әz"xhgr>xM'K?}~Ojmҝ|٫|w -է?\w+op>X+>vcGη渡OD?)߲^_ܤ9c/|BΥc|e|ɳynԻr+?~jה?X}jeѻ}|/~C~縩yg7ta^vmYگA?\%_a~{wݝew}S}g.7֛W~V^DW}v™O;&5%Q{.X7oϯaW wyӳ|/==L۴Ǹ)|KeNƅ<ۧtF?_=KgBk׉\lƛ=ʩkg?w SOFM |w¾;)|}<ۯ1rtO𵑏sCyzcm~W9Itȣ &/nj?ߔfx+T}:շG6G{iyџG]K~ ~W?J}^>R#oJcpZpntKNzpTC;{9/kO3;8?r,z*Z|VȷJyc^)|#|oq8J8oT?<~+N5x|dRNͯnjWiײ\ϩ^|:pӱ.@Kɽz(W1&rZ9!*o[ࣴW׷ֿ(uް {d]gǏW\CUW僜?rY ~k~L|sZΧm_|˴uV뷉첾zX'v_<+\s-H~ޗtGs3{/^윇98GϽwsz^h7Fy&QW{_Ln؝~ׯҞy,s/sWxdqG;/˹qӁ#rL~ҧWsNN_Ơw(g5='= C_7}OyZ/$7cHҟwku^>WgzrOpWï;zʩO>ŧ I|pxL;,׶?;%ꝵ.`M(n噿s_#ӿ+#J~˄K9߻/*~,3W;T^C|w%_#/L%ׅj)..Z?z⼴o]/?7Zg.Ù/S|eޗ#>:Fnnx"W q7jquqyTc&wYv[qo~{vz$|e>?gMKu??uM[]f|(!'@G?g8Ww΃ȏ~N7g|s)M<;r.b9z}ƈv~~ ^Q}t!vW:o9s(8X1rþ/~&zuՇyp>+ě9/Q6[I>yvp^Q?8g/#r}f0ڧK_7}?H|xrgJ78Kݠ- W=*"^q~-ӫpAN~Q_Q| O"'C8\$~m~ᐃ|ҾpxѤ9pg` Z(=*=\\=}{BU։gκ_OoϿH~{GQ|UySy5>ޛR~ ogS; |Gl|+)ma_yĻ4eN?J9qL\{rW_w;߽On >y}ޛ{t;F>9WuvOnƲmI5~Ƒ]J^Z>7<- Ӄ_CWJ:?`;b$>U:yW+swGp>Ǖ~z/)Ǐ3%wwǾߑ,zwO=f>y{Qۿguo9?A >مYnG9\ƾ W{ =ßK-k?BoYT=[rs{?o}?Wy{%őnF<{-sgּgtwx7F99Z=5oɷv8=/+Bɷ:~wݟ+zh^*{pΫ-;~Cg_ %=xH/ԟyOC?Z)~4݃%E?W+=;gpҡog_~g^XC@| ?tׄWCe7==4(YȺ7 nڍ- Sr}@߀.o7`j#E8wᰣO|UΛ[qb:YweV{sé7 b> vpY81'&zoIoJ0Wu3 Sy㠕Q38m=Ydwr[>)ˉq΁'_{FNL<xP{ige[Dž/^;4X/"q#ǛăcқUCro~Gد>w".o{SOw=vyt]!<6+IoGA5ou_OLǕᙘSw7GJ Nw 6_t.ă[k;䮎34Y_n} =[G <+}w~~b]088e{hbی旱O |5/P= G vXy>%&$4_ ?LjR^<dOQayw nb/)~gvXDZJG dɧI {@xg:}Ҏ$=`]}"um֥Căc]Į_ xd w+Ǐ <'*aW~o=/(qxh'-> y8h-_{y6~xp/N3_0~7MXy^gЏăxҋ%8.$~V/4:_u&&xGs?+8hbQ~>G iU4;G7q (^;'No8͇?mx?%n㾒{. qZ/rg:Is=!^6;USFA~_HyճO8ć%U˿Cy_|ݗģu?<_x#s#ޙ/㸯Jy4(fs\iqZ=ϝSdmp\[Y]]GJ=y>'|)^*-qH寫 D\?GYY?$/:nA(9Xu=c9{x㏥|>d=ߣ_$jyGhA;-'^4/GϪ{e=%13By/!7?7ry9("<Տ>8o= ~G33O:S+sW>}#?-'s}K=p> (qU-wOPK ?e=/kV>󦕟/Ӭ=uo4#1.5F^v?~O_x?KZMN~DR/}& Os ͗Bt~/iR>Qy!mQ]qW7qy|;p.(<Qo!~GF?\賯8K<#c+F8>󼉻}ZiC7eV9x_(>O\g?fG;!\Ӏwӏ:|;R(Cxl{3ԏ2_S幽+ϏyN<_ڭz~!?:>;.._3m O)-O}sxNEqx:r1$F(>Ju=rVI=}G쯏z/W8$R>?/n/rwC5Mܐ?7혟 _(:_(98ϝ~iG|~|)'<'Ĺ)!{vDG"?n߱C]YrOr(;)q?;<4> DX A};rMz2rEC{~q]>v%B1=wاxdΌ} ^5ߕd~7Ou`_`} ݗwt_7De;? ΫSm^vjaPSO b'Zo@N=Ov~j@xF_C} yG>׹oG=oz/7gTO |JዸǕy"cD?|;X߼}=1J=OރqqṲ8><{ACe'@=fB~)xoFzu'={GawTW:$8y\Y?/wx.z}ێc@3oRt?3~b_:!z z =*yw_ǂg~{o|qLr1ߥK9 *^#|wE\x$CoqxP|SoA{fB?}FOg/zNЛ]o[i[B? |FWbu7γ^<UNJwF^!N3리DZ:RVUj7suk:/ńnv=A9.ezaNt׍ԃW"~\o|qlb7 ;v&!UY>ܬrSN#_?,GWqT}Cױ^:C|ʣ:^^wIlqü.o<Լ6JNGo's"N9Bp=?^+n{nAN՘r^h{Ӿ۪3x@\g> ~Ƚk^Gt}(<%Yʩɧrwk}k*4 9-o;wS@MSi?мXz̃C>ȯ<8ϱRO=ȇ>׼7Sr\qR.]_9E_~_ Ǒ']ތ|>^b!m(ϋq }.˳s[Y'e}N{D/׍7ɧ }my?v~Xo*;#z齡y>8̿Tns\OS|q?>wP_՟_B;퇊|j+Oz;~yX{8o;ߴCE'݈GB?Xf}‹K.$:4:(qvPad}rKaGNu e}˷OpϼCsKb_k:u'<;&vJy2oQzsyBCC?gtr^_|؟?uVueXxy<cG9!'cxM;> ?x/elj<<S|_0^1\z#87}[;g bY)=}}WC;y< q|uL7oDo+($L3x+qysÛA,@0ٟUgc܈{x?8N^ f}b.1 o}zzQ9wx>ˍr >:/ycWzO>oP{AonF.CwPyu#Ii~.uzb?Fg '|ؓC j;vȫ.z*~x:΅q@GW0f_\^K 4x,gIEWzu"/* >ȯ[ʼ\z+Sǻ{R> gߢNu/|9;T 1qh^ S{GZ\TM=Ϲrq!/Gzu0~.1 R̷{&ߥ |z(W%&dkGz}qgN3RYw y dqR^&qxh)BwȧV_^}#ngb՛=q%=jI'xyv&&Q0|U:OQ4Oqh;컝oTo6$۶otm?nws^b'Tɚky!TU9no`77R>N{;zZpr§|u u?tYʟq2x]*gwıV .6 u9!~hǏOڵ_8֏ri!_>A+AǷ~r\C^Z?1K.qFC%53x|q? qi{6 J^y1|~hC|u8GsOs~?OW\O^;N/}jz>>wdcU&sۉ/3Uϝ;oaߋq%_r~u_<~D?z|\x}N=Π~1sؿ⨏ wv\,gb~[{Ad=}<#z ^>Fqʿ~G?셗>ΰot|^G\V':zǸb$3^{_dw3ǡ!v #&՗{n!c -C<]Ytӎg#Uԛz(UP6V_|o~t9ҏ^%8sFy|I>H^ȇq˓s/{wIԳqʣ R8KO|{d?3yW?#S>m~u3r|xAhvW/1Ϣ+Bpǎ87~a~Ƽ4m?!Nۍc}G|ӽ~ ~_c0GFikA\ Dzێ˥{qb۫O8U|^ގãROz/e@e}ngG};3: c}u\1qAuvֵ"{?J. T>SǮj|6'_n5;wc풪ݶ!c W*Cww~=+w9yHnx8ȁ{CW]~JL~T.J~{qeH͗S{uLJI|qc'׎jx{i,Y&*?|?$}uL5YY Uߩ|!~\^-_Xy _%1m}\r7أ;8Btt\RBowSrN3(e ki?*}oI<3-" ra]KByF#@n$p<5WCox\H|Wi9 =@C\cI;ng^+6z'&CM{~n2"wW1?#>=q%& h~֥~ߐ}W6Sb }x}o];(|Bx O®yXËW*'~ԛI8/L|Kτ|JZx?C8[ch\g^a3 o*^l@OI3AzطE2g>0ɷ1;`|5{Aq|/ˋ%bF۝|ܓ+}.q2.m~INO7Q}AT. w;(gk%\K$W]rqɍxo}ǔ_{(#wA~?$T9M'u/u}S>O}}* ~}~Zys_zb=0`=8_rkʏ›g^3qI1R=KxSOַ$Ow$ybĦQ^cv'ĥ~̿7Rp[=sK}7Y}q}?swN1qzw;ӫ\f?:n~)i]w=f|:1<FʾsC1r(mzSߋ9޼ hycMc>*<z\i f/4xj+\KW1 zDqu=7|&#θN<{S7y⫸88o:z;^Om~ g=O_]/=n$xQySo2ԛ>i+ۀ}X/[KJ7NnPSq|L]o;qK~ 粞I{Uߎ7?o7r+*-sxOAƿ!q\=c'Iw/t#%gSͼ.o=,Dޟq>~WP/'Ro>Q7~.1.caFρ gO>yu;>EO+݀tx̔Ks~|8#|WO 5 L?z,]|w9zEus;[o9zV!4/XKW+4!aXZ\«'!/}mbk%z|RImU18_wWXKzJޠvJ=Mv~Jy_G8kA^>Z/ay?qAq4yi|!.X.Wz| 0q}={Mzy iϮ _\G7oD1:cMHs]iT>O'vr=]ep=oN8<27]zӋxf빱[bo7F);YȺgNP9/L(򳟟~Cr?g㬯.yG]p:x!Ni?+i9Pw8k"Jto=eO͓_ĬKf*ۉ ct9nB?}ev}8vQ[oߪ[KKv]Aۡ <ﯻPl](Cu?r뢾xցrxn~qq>sx@ǿڟC?0nAvO׽`~jy3\>yĸe;'ɠ'5rNO_z?M1o(|2W;>?~h|Y싡X?^f9s/s!?<3֥" I>P~ i;dב]{vsz]4K~sg}~}l-g}uTI rA91X/w\-k igb{  v C;1깴ݝwt z-@G7v O®zp?Wy ~5yǯ&ρuf?ԏuiw|:<ǥ\Ve (K σ8!xuiEhS܏~=Iq/Ow7Mԏ7s=-ys~ȝ~\sFyNwЇڿ+zyKk Ҏ=<+<z0>E^*y_I:"rH?_A}?9Vc=B#ϑ~wMxs/7ĺ0Y;։Lt}I|ug߁g)?QkXk;K h'u63v-f㟄1χynB@"܇~9$4^/O}usLͧZy"̇}vsJ~+(~S;#(rP;|? r _p=ߌF?b?<` B?o Df^n\?4 +FBǾ>ؑ_Qϗr_Fϋ} x?s.yr엘rN~|$e5z7L;QSOs!q܏b;'o(/g/7~_?(Axˏ|{: k.KH7Cؗ.^K8~P|ia(W]'pe^|WB!'ȡߛȇ|ql_vx}**DҪ/>=}y υ~zo~f?#odNn> ?$z/yzׅa.CO8> ?C9􋎳z}o/9riOJױO<~8.Ay|UO?<(Ͽ7G}ۺ5]%p!@Z׭4s8J#W>~9}xT/ү[rGe ?"~(~9P?+DosB~W|An|s@tuwWGK9A^ r2͐UVeB=on=]g?FJs:N;*TyԎ[P?qݦ=_1>7Wby}<']x^U>EάߏzS=GjO0|xn^ȉ~A_yrgir/{ݣy<]֟~F,wy_z_9n{dC9N=s}s}ȑ+%$<ߗPo=Gy,/?U;ߺzz1y7=UOey|y3w#۳󰼟7"u?tϴ#O^\~UoXw]~ӢFBvug#=ueO@?1 v~ȃ-~/]wUv&;,T^W y}cl>}r1Q.=֛yO}|y̓$;R.DG.uI?*bB}iR(U?_]Ro&7z~/+[ ϛqrc+3^8|im1 i'~x} w0>QO|^s_>Yw Cgqtq(?hJy< v'!@Xzz:\x*9 r~XzrRʅyX?']9!iW_qNt=뙬wQoT_֩OFW~}Yz*ZDu{R/u9 \̼7u^uXǟR:ơ^f{x1婜=qH6Cg?iҶPz8B?Ÿ[\9JcV-gC1OBނzJ熝Ž7T]:%'y+ mWwu|ȥyȧwC9nvy;y 3=~y} /g<꿗< .wjޝsz"P9qߑ~: )a>xD˩\r o~V~Һf7W)|H_[Ά}{yB^CR?󳸞zyx*);~9_-üPqVEt|j;z3?{p}pY=ցgXi⺀ׇT>rxJ/8J*!dwz9/qևOR|K::qvX?Qy]>Wh$C`=PoOx2no"7 y9Oi?z{,#㴎77(QzxD=qPsO_L b#a!*Ǖ~wN?6G4|_s2Rя7]sw'Y7;,I8^7SXW;O;sCq|2T8SMԛAA{\:^я}P'_Jd^#P7?j歧JgB8 ﻒj>:!)=s.;S%_f^=4tow'lzZg] 3TeөAn)rX_>P>DUA uwob+7?<.?&w`8< ޴+}S]TCF99$`Owm;7Cw !z~g?|=Oڡg`JzcBAwyY-Qz-+G{I}_^\^W1gU5_zsaD>E+(}{_#0.z7גg&lβ{^x,{_ ~7G p]Xs~^NOQN'@\)KS#^1#OXY/X;>'G޳}|H|7p翝Y/ y7R9;_>`_7/7BIq)w?]5iF4 f(vO`s9Jë]3)[5Sj /9w 9n;zɓ*m?G~.ɮ T.烾ߨ,;f׾q~O1#d:v0ްa}iQ8ަ_a'00~Q?'?_Sh} q|hKDa*>Jnyɿ nYň{rOEsK#9z~_/;΋9+.>;1p]Xq<)_$ߎ[OWe/7%uRnWsX'7Jc:;_0gqt=~kTw܏ڟcRc?bC 9.-W)Grx_U}_XKKK/t_rwꮳߡg/5z&3'=ѓ kԃ/^OM ~x?? r*9TUs3]9zpf[yX?? E}_zS>Eo0ML,޻sTɛ=!ycq~|O- Ŀ%qއ_?{fWî_,Wpԛ_Yor|Uj[ʺȺ2`]Cn7>>_|نγ>u>/Q/nװ0/&cfYj=u};.Ǎ>NSg/Geۗ8,t|A 8.γ?mWo8yS/Ÿ Y-ti!0P %& _ >oI{UQCNzi*W7< *oJ牗aa8>gU/xTe'L4??x_)g2"C`< gqu%0{<|[ ]y}?ķ mj{Ow=\ߔA?OFZ GGe}}w#~ ӳM <4eOU WKyc&tWpI.z}@פo|KOUh/z)BA4O-1?.Ǟ:H.GuM'wGzwqmo|*8"T~)BtRNUJix >/qO}?[*sΗN/gigKEQ[?3jyog+^\'yTߏqzHgNI|]ЏKy{c߄㎪G7{fMpV!u[Pmӱ>Ǻ~YO\ֽٟ>O=iڿ^\L+uVp7C}F}!͙*wp("~zo~%%oFyS: 7DzrJ?Oro8/*>Kv}?TGz[PyRuj ` rw=^9]9DΑK~&|mD;B=?D 8{>P_ B{T3CykCt݉P>^Ћ'j'ǧ=kѾເ|c!y2_ /{ܹ NrQR>zLEzCo:P0\=GENx|P~`վڃ2C.hznו4Άw0N>|{ߝ#d_ߋQ=gcW( gTj_O:XO lyuOsr<g3/E—æS_\S~[J폐}R>:.r|Y*ozq}h'ޗK{v׎iߞ>`7]DϏ}'9o ;xS h`+ rǃay?1Jc!q8,wh4:w?8|QNR+qA[w=ތ_yzqxW}߶eGrTmK/q-W\/yBH~kZ/m[Png]/umR=Q7yWyAC!䀏<ڃ?;Qcůt!¹p]c9sw87{=[?a_}8>nrZ]݆r`8.bzΣq~q6#{}~aS=Wp\RAKoGxsqN?Axߖ@<ٝ:l) ?L|9.߰qj%84z]z~z|[oMHY^x0+y8"Oyo/y#K/:xfo-~eI'Sv5p?$A2:4,EӘsy9(]m;/Ӻ_{\껢O<0?rfL=|s^uJs_\oT.)۸ -ijNLMz>|8vEQU#A}^szĶ>I< %9Ώ7O]zL/3FrlqJigUW}T<[W~,)?, ższc䕴y.3J> =CӠǑq,3z(ǛW.Ә02?KW1ߓ\3C"9g^}~Ιy N晴/|Sx0^x_bX|-o\ ѐoY7}#ow5 Z-c.s= qXu%#/a= ~.?rOַvh |3ӳ)<.c/9Out_[ʕތ3 ~-Vr+>7)|MZ>Q#}5HoC=\.ž{HM4C;k$:IՈW A/z5^Rv }߁G~?'osR\78{T󪝟G':| ρyRs{CWwtGױ|jǯz"eIΨ/z#y݃Y~>22S9;G9ݴCyzL<7xx.[-w^szQȗ2B$CF=K9·LtJû?ǡ'#Kk.ΥLToω.)7co!ˏK_>=gsF_f}έɿO˂>IT/qT {'wOumԓ~Tye+p\%v{u;P_(K|zN/50*y:/߯BS` 9}% ܇7_Na݁u >'<(rh2=7C/u:_X_|/-gC9:N> r6IǾ}E>W=X|sĿgӺ7?vm':+~ 5؏}XOYoh}Gֹg>:E` ~lG,;yP)_r$/`Qϕ41ߣ4r^"ώsH;$WR}*j(`A?q@b-:g[gwUE?Qh?x*v?07 ~_>_<'3vA^<=_@/4vs/j{cwSSQpQ]=?o? j7vxy.힡>zFNُ=&Ο%.!v{er&9rAxSz[xWT|I.Y-˥~wq3/FX+aq(GCP.OQ;Wԛry E|`=~XyJCJ\ 9Eu%?zKu?i? ,ҏ:ǹ/co^<)Z^}k!^<׏Gh~},Jq]|Qzu(ɣJS_]:<8߼Fiי~v)OtA#!]>b}]ϋ-{E `/=QG(v `?Ibwd=#z,:Oqk.x؟/8ICk?aBRT}AEۓN'|Zx=Gx)'b'ž ϒ=/:4|uN1 /TM|X/#!1Ο*e#*~؜w0ia7oO?H> r$IA$ 4|PM;d=3OUww!ܟxbkͲc>?HWø,|7=ż?UEP|]wR_Kȯ~~`r<6ȏ8nHx{]r/:=녬3Z)c:jIQ_KoFrq4$[>Fyu&FÞzK>;VYқZMa/IG}wF~$9|H߰҃{a\3OY/7Ǜ77A גΛwT?/hC#Di?)/KW\I|z\Ey5oH>qȼ=1ng3IeF~=|Ua>{_ Ӿ;`ya*oKwm?/ϻ/>Ww|Lr\yc,ׇ;ө77K*ܲu6xx{Ouf85R~l?^[b+ -GP;vx,7LDZo;zG4|Mq_8co~iq_Ioџ r?*?+sK<+hƸI1 xXy^}8-χ"w K/J/9ߌqOoV(N7^%?m8hz //My;Oo/hr9 ~gws(y=/Xtg^Ҽ'}'χ4Ψf i<;.\)|_xNB~;^C_ ѷ\yyzn̔r|A$?CysAcS3>[^'Gѫ`}B_Sߕ滄vPxJ@|1D_函o|[] zxΎwy(Z~!-}`=gQiX`yJYŸ@oٟ`q>u{|(qO^ ~A~[cE3B;H>zú&+So_gz:.鼟ʏ>Z?le<ڣ|^ Ey߀c<R?]2 "͢;~_Ϋ]I4ګz~ݺx'Ǵݷ\8S_ O8gb? ,W[DZ~rȾǏ*vCzJ='~`T>n8.!78SQ/({Ϗ~]3σo^Fo'xJtp>C|7r?s\Mv/WQawi3uxD9zo{)q=qi~;%={<AIN(!(SʿòTtgQO9>]q#zRz޼̇vB֛ ~ c;cg~.b94֩i?6֡a/A=Y׷]}l_ĝ<Os rw?ܩp L+{1vAWGKSo(_q)A|޳OF⟺zkyO /So^I%׎JAUk/>s'qn_Ȑ 3<x}eq|2R>%cl]ʥ?eJPӡǭqOw9.}[ zA0c>{#HTQ!xſ^Sy{B8zp=%0G/CyNrx1 ee>qqQO71?ّREo/x/|)AOsf^+^MXxQ/]>wO[7OMׯvMy=\x1^G?>)p_ʡ?xc~7X7ry%Za3L ϼA:=I[rM}|CN+t\o,|J#WnrV~>JHp__T[Anz?-=xN7cކ">x)*/3qTx/<8f[ Bo+ruBS ?K(z{|{s7ǛWUF?<9 r;N4zT,_1/Gox/)_iǃAߑ/bh_G/'>Z<5Lqqq ~- ω~g\gsi=?_n<,C<#w/C=VK|q)y_ wH>r?~JB=_ğL|=߉A>9Y3=ߏwֽVt|~S?XV=CYWz !GKׁXENXe;ɏ vb7o O?>73Rc/ v֣{>ӂN%?QO_a:RП>477G^Ax3yn vux:o^zn`'¾]ܼ^ rD_0_?CڏS9ThOWoFu&xOM?lG/k߼gGe$ D.GNx`?RJϔf8c2zxY#?ACXԋr,; }a|^f</=b>̼.w?%&gcA^Fѓ? 4c쏙EυGķgh=Y8Υu/(qMwh?T{!#&?%& >=Wǩc?a=ގ<ry8 ZKۋA6unMs4~ |;po{\ld'Rhޘ xv$\FHYBb5?:I3ɽ*~HU?/ԛ;/u /9wy:_ǹn9_&xۼƪHx;ޗ&}C?X0SҾ!1d\W3/ ;I|Bv\'{&yeͼ'd>K:Ó8>ķ1PEßq SGk#X;w\&%K#7#=jikgc,^kAMW>,5z?_]; Bow忐MG˿Z/_Pi>r_nwb+ Wr;nۃ?콎'A $X4_o=;~^Pn w_IoZz߫a<٪OG2Iv[iJ<{#ʕ8WW♰_{VrSxW>y9uʹR_7/uj;߬$]#oYЛ7;lOE3O ԥ9nTyr /QK |Fn6qs~ăGX/$\=>Ѽ`|^9q)J|3,w J >>|&ٚOE\rw-21 =o},xW3qŠwaٌOW-I\NVZ/@xēo.Yڻ짌8G[qq7_{'n$X>[s;.|< :*qR#pT=WxG8xp*G*j>8U3o} iI.E 9'ޢJ7\8=f $FM4v\OK<!>&|㍰v'&&vS~F55'|G :({Cf*ʎ?;&{K< xMg^}v4߼]ǺK6W!Qi9!G?< if܆z7e]jɽ曲|ir.AxGGya}8L9揋_}Sf>z*.=pv0O듒wGSAͻ{U3EmzZixz/ïIo_M,T\.<y^dd݅u})˵4w,N~~yq'S'9: >ch^W«58q\R g#a8lth&.fMVEoxnK(oz(~8Cy=K-__ EܠߕCot\+m_M#=uZ0 ;9n}~ԃjiڿR=@-3Q8SF~K{cA>E{XN]Fi>'=,6޷b~߼X_9 A^XXrYcO\r}Eqglj^c|^ wgU_YH6k `OǏT `}c]eu O;KyvË]= ⾟_b?fԦqİ_^(yn$~v|tb_:cߑ{k>eWvڇ>pD)Gz8z__T/_so#wOR+?3"y@AQ>2C=y4Yf^}޳sa,vI!-mX?~^p=z~Gxr=:C<*E5~۟cUj{>"/~y) \mp~9(ey?<)t~C>Wk>:rKgAȲ}]o?|}c=r|&/?e;43uSOp?| ȡ߫:>O}u?<7מޠpy{ܟ~^< Cw?prMղߨ> Ps]h/чP/#g;>ĵ{Jߑ~Qgwry}u=r{\yzLrDWws~:^?>A%s~Q;~C}i}Q>VorGj7rZ~9>ʧBrHOro;'jٟΏ?.y#ǩ}@Sovy󡿑sS}~PAү֋|ПoWJ;~*_Ggx<{>"8O0uy:?ENծ1\y>~-I$7z ^`^fBoȯy~Cu7Hy瑴AN}CϷ^:<gOynas~ I>x|؏9DjOV=n{{3 Yw}W{_iK}Pޏr |S/\M`i:zX Y]rceoJS>gCQ/v ӰF>C؁x~=b'ʇ=rY^_?!8ρ|Js/qS+O\/t,=*uO8?q;=]ͼœ:ʇ.]O\c7;\4ۊ-h/JOuiY7xE>|^ mru:Pk#i ڮL3:Ox3ʏAxRmðx#9=/c^9O+[>=>[~Ǟʸso~\~xx AH9|]TY ~<)9]7_+?Ax}?ăk/x_qOK9#3:V/RӸh=ҸQG|臋1n/<+g_Cofޣ ľz[jn󆅬벾j;Aw5.qĵ*_~XNI| An `0륾>[a0R"v4]|LQ('`e{j}BF#<DZӏʁ4z29ܗ,81A-%7%7m7ַ#r>WAOr?k8UOWzٯ#~x5Noh9Is7[3~g߂]䤎ûa?HIh^ q3%4佽W^ޢ__l=|8p]9|oO/~讣<+'>ob y' BEٮUSr*IWWG4L'=?1>=8Z֣v!ph]^. g^uͳ2b^a>7|SBoSx`|l>|(ue \o iAY3#orڟ9;'%}u+WaW|lIrx) >?5ܯO ڂy@:_U_ ߶뮖kb ~Z,8?~챳8vJvr?QmR~z›~h=k˿rwKis#i/0j oyږُ~]ONr|[i'~Et9Q~tk?{ 8G\H_o,B7|J_s^츯 iΧ7Ay:ٯvGZ?y?i7-Ƚ77'?xbw:?z~Z?<*=>9$DWRR8_C_([ ;8HZg%Ec{>Uo z|xr#!}9Z^ztB?8G:ij!?s=v:i0g{!E{y1ܟ?"\a#O|sP綾] G~; H=_rib/o~Wadzc<V߸ o|Z|;n$T_o|5*~V8>-ѷR'7Kn~v[HGD`"=GI"~fTpsv{ x6#xO{ٛχ qo'FQ?-O ' q|G][T8z/SLrr8}:'}UGxi9~?OtN*c}yϨ7A887}Ǹ71RBy/9":9( 5qD ǓGt(yU*o0sDž!S8Jݢyܸ|]BO0?zPy8n}^%t}˺|COY/;$Ӕܒ} ԟv֣ʯ7+ө8)ks|V峟Cک>NUޞ6/`=9_aU>}z*r¼%}#e] `?!"e=İ,/GB֣g^ zWc΄~.pbK;!nY=?. BIx!?KOFNegui]{"aڷx?}a/| rU1U[uLi sB>,۝8$Fxn;OulџW?ćmonSm/ϳ(~uxɴ{&=0^D"SFrw\N7F5X/'{8ю;M<<I<3Kk>g#~  Uz3Cԛ}ׄ o?G9j갟ŻtKL,Iϋl•ԛX~tqoJY^KLaQzU( xkժݾ7/b= :};:웎L $|#;wWvя]~jd'5Fz8~Xg߁]9iys\7; z 3C'wyNm5'U._LL|-=L[ɷ$=S*OD(v'&ވ?Ƹ iI.;_uiΕN$#~?`%ُ[14 +}S:4:o ><5QynU}'EJW]UF+}ћ҇_ l'h'|4[IMpq<>'?Y_t=:m0@%wea҇b9b擱~xhv^cӬϤ$G}K?vL"MvoK^gѼ317`~n|Z?ˁs5y6okXW`]#x6\:'q<װߧeI|wobYT ~ cDI/6G,q^.~ 7/ =Zw&=Z3Na;YFeyq^&3APi<7K{a$&.zsjw. \^vaR $;X+חś!>fCS_IL]FAcqw|os=-11111111111111111111111111111 KzNlj{^xj']$&.zC<ijo?iF9~tnOb7YPԈF|)ֈ+xkOKLLLLLLLLLLLLLLLLLLLLLLLLLLLLL<0d s? Ei?-AևşQ\Z9R?[;'!>#Aǿ=}sD/[~nObbbbbbbbbbbbbbbbbbbbbbbbbbbbbb⯣3ڟh 8+^ 8&?-:W|{o<7-8}'1Hvrߜ;|SAq/LLLLLLLLLLLLLLLLLLLLLLLLLLLLLL<(XY/ūo>?5?⫝TD$&(m#f͇Sm'J8ͱԛwŁn'+4 7;hC'&&&&&&&&&&&&&&&&&&&&&&&&&&&&&8S'P^җҟMbbbb؈_#οsI|/Kl?ăIOj֜M~JOnObo?P:"~J^gbbbb^l>8SWҚyjۚ]D󝙟TZѷV5Gʸ#g^7Ǒ;<:[8~5}x=ཪ3ݮIb}Qz0#=`'=Y?>j|5߫ӯz;}^ }_!z&˹o-qXNwr 笵\/+4*=Y9$՛n W;L^HoV򯓿KݮĉͪƏKғ5gZ} KnWbDfIr.r_(}:~EǯMpj{v9>1+}i;ϱzZpqNw_Ӫ}OU@veT9?n_b$]ތ44kk?O@bbbbbbbbbbbbbbbbbbbbbbbbbbbbbAA4q~Q_-ހL^g⻃Ļ73O(~G q K;#uݞEoTOQ\Yt'jۓ8ICפ yn'ow r}99TꅿUc}&\~\qط>Uޠ_39$k B}a?%oԬJo}w'77$}X>,U~V8鸪#?}+1qz)g7SDUoI68&˷.}ZGmhy_8­BnWbDe9>RzKi8 ojA_nJ6SoY2ڟQ_JM._:d7$q=mQwϫݾĉ 7_{yg󈮣x"ǘW#= o.\);k6?瑪~ CXo']8ס1>:^{BHq< qiLT7B@Uk:{Fu~P';*T7A~dj?)*DOx8) گ4{ YR'uo>%KO^.廞C(q O|=vG.b}=+\y}}5NkZm-8Y?7};1111Ea:ͺ1?\ ɯ|}x𑸛S<ڟ98RRGwx13#-|_C[W7w9JHI>617[/֯՘S?Q[ȟ8DBƷo}HF9&qh/#&~՚_<=H>ֳPcIB|O_ZK]3s9yzU|5;{q,#I>i373z{g>8ɳI|p,o/kOeG+ί*x8`>%`7ʿ|7B\OK../4Oϒ_OSoo? SG5?1[[K2&qp?QҤ_IM;曡? .|h7K7]՛>t~oХ+nWb$LYڟ47mxoA֗o̺5&>;w'71eװ'^®#q/@L2zQq\GunWbde^@A-ͻɗb}j~+҃:4D>}t=(?_Z~NKL6ā {%<?ŷi_<>ݾĉ 񆸸I~1NݮIo #޳i=7DZ=1q>_OWf?҇;4s8|4OfZz:?iS|S8|#X[bKL8.4<5j#:<_?-&%dOoZMv/Cy*NT-Q7S7CfkЈoMWE/8/$v^N-OgjÐ8rI>Zޑ>wQ=VWu&ͻSk=a6 2 >=O;Rە8IwcΟ^(yM}+1qzGx?WJq|JLv?1וfy[ion:tp4ggdƼx9|,|r:qX~вxTia#霧% n'?'}jMI06gF6nΕm#Us\|KLڟ OK;t_$ 86̷H?8⥙//ԛc{r_suy٧s.iG;“g_8q H|ө7zvMѕh^GpIu}+1qz ܬ*<#oƋ ЃMͺ?6!Tz]o<&qh?Ľe__/jCzVڅq+}XѸ8:N(qu/}8\=OOg'v'%/o$ހYh}w%&NSvK;A)w6?-qHN˽˒f_or] q8:Ӿ-yggǿKü P}/1qh5_40ߌx'u^7Wz4+e Nk>x8\3~wp җJw.x8\ǻg4~VG yx&qXWBI!?'%&NDo/ަqO5?Iǽ%&NDo$ğ :+h]q\oEy9Uϼ3 ^ z?5(|iMLڟx5]Xi:(g_<77vP'789;7FYOvmF5N[NUq _gqq૙GSǻ\|%&NͳG3>>%į?vR&& }u ˼ioXۗ8Ezq{*`YYzNo(}5Ǜe7d_~r^y7Uw~SmM׭Mp657m 4=(SNOK0_gЏMlP^oOsy&?5H'3q}f?[ڟ]_yಞo킮sy\7Cl>c;_gvz ~Far~JI/x4)4OɅ_M?PFs_ѾFq٭G⫡GC}H׉c:E;Oq|o'xmuǶ]MpѼ4O4l 3{ѼLǼSOMďI.:~~uI/Dw'7āO ~nWe$suj*KL _Xlklen=Tj $?f> 7^' W8\4?g]zX?I4}o^6y;>p39$G٨= R= ^NKL|8 ">5kc%MpqSryhxlƏ'~??En_bDFd/_41y~.8\~͸xkcpQ#煜%vÒww@plxkFyؿt^O tGw'r܀f ]Vݯ%&NRojm?yo67i]ܜ%0S?Ǭ}h}lpFןQyow'7U&{~\qE߀\OK.HޯayPg8Ci8KoKN~n_bDqՄ\oP?!>ۈ?n_bD8[nj< 7~^PUK_8iqN=qqAssyMp7 IGp~:oVs=-qu3xco| u]KL`a3v +GOiL.O z {?~8I<6߈x M@bbbb ?jɸq?GuO{;9$=OB_whg_FoO˩m|h9pj oxVb␰>/}8W^g_='9ޑVo8O?x;(h=3iU~om5Ow'7x!jI1F}`L0/Prjއ|9_g܉ޮMp/ <?M|Nz6EBxl%&NIo{!ȿ~*윍g798\_ChUKc^ϚE?.8\/ ~lHyϟNMp|4x3JHH7]8u@p4?j柑>zQ/x8\jh:~MpŦiӊm?MH~Zp^~5ƋN~%&NDo'yC,}a|?fW<F/$Cg ?(}ꋺ.8\}`״ѾjxO_:t?|Fx75B|y7wC;,KkŸ~͋&NouS8~7y9/v%&NTox3S#//>8Df. gbq=}=sI>{`ǹ_kOg!&qX˞xQU7+G@<)9BۂW(="^֛lq sI>: 'xkaWMo[>Nγf[W^JL\>W:rGk܉/rIUcx!s#y]77A/(s/_W>`-?ώ9%=P\h;~ v K8=^Ge?pVq1K`ALI}҉/ eYŏS__s~˚ί@zE&8SFǒƛՠGrYNbADį3x4!}"n0WW~'%&D:YSzҗUOUܾ۝Zz# 񠈇F\N9윶g_cO??xhO?+x5%O`jH~yx_NLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLuxWŷQ?f!_ߙnObbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb$pj·?qpq,y66O(~T3? #!n⭁Wk~ e4'> xj & ioţU#>+k}'1F~GHo#J~yR?$k/5<ҥ>(8\5ۗ8 kߌϭz8\%:=ؔ>v.=X{P_Vz#ϺgKݾƗM-?mfcӏ:7u|3ǛbUzCxs[iEzqZwП-j7/Uq=$&q|PN^ǝ_j}/1qXWݯ~_zxklI|~ O9$Y}|y͛Gc':OSj\w'7YfX/Vyxm3iL.K!"\zXu,ÿJ%ف:=}ћ*nI?6+y6:&|l&qXoj|% r\xjlMͭ%=^0Nܖ>S82]+wrnk&~gKL,I{8ᡭ@m?/m7E\G|K*MK:>/Vݾ7%`Ϭ_Mdה}7(l=3uKGu%i;?x6?F-<]ĝnīgOBxjWģ]D3N'}QiNxC\iI.p$^<4x4b |e~Ol}/1qh=o⫙wCΏPw=|~ ~9qI>b߷3̛ZOO<v%&NToi>3 'uݮĉ 4W@z:gg3؄Wg9$K vhw7󗔾&qX/,fs.qm?/JM⻀1g&ތo q>O#-ޚ}+1qzԛ<яO|' ~a/tݮĉ _W\ Ywq\H..iC? b9od8kWo|!^Oғ#]>6#}l'Myl_|[rI>4߄Gy܎_ܣүorI>z~ H3Js>J?3qX_ڟyf_yysI> Jk3ghK~Z;j :Mxk9 lwCGݮĉ|#_S3|ө7GkjVO8|Mxkk6S.8| )`ڼca/$3q8{J;ױgV<]OnWbDf9l?XOB\7G?gNWGWu>|hT;gsjc/2S~5忦s5՟VϼigΔux5gu!r39$wmiaO͟oyn͓ԛbh6aP?zπ#}@3G ?p\~k~ ۗ8&τ3(=?7%?\?w'Z7;^?}f]8_:ާc}M)L0ϰ^4j]_bM ?w'7ɰc^ 3}:좜_Pvۗ8&~c_[R =g8\t<5nVn7֔v67᥉o)ۗ8QO8?U?[Bn_b$ YǏ-zec+ G8`Oai~ԟođfn_bD8k{f6_],}`vEi<5Ik9$qrn3 FǗSof7? ;4MǯzZp~5]J_fJ.ݓMNWT.g<x4|&>1M9) |37ǫG<ljCo~MƍJ"/>G8oji4^9.Oѯom?c۪g[ßo`N`%㴇>Ng}f )M vuճJ%m$NxYc}q67Gwj ?Ү_| $MD~-AjKljo[7%75^8)TVM-]7W[78#}@ƝG8ՠ'_~~ܷ8Hw 6'Zz[!TOJ?&qh4Չw>D/T%?7힉E$-pSixk֟hFwf&qX#_#N+ 8Q\'~ ۗ8I$^4q:9^?ҟM;7_sjiN5iGcgq OH>z33_'b]ᓠOrI>Zo7_ M  '^]II>`Ǒ^yUU<,zZ^@/gq> <_ވw'7`Y)_8ۺ|9$m?xGyMNf?U%&NDof$,בo0d_4jsu>ס+q??Ozd%WxOs"4<+3%'<ۗ8Ilw<|oӪ' ?}+1q88G3O7q Q;yZ:-Sxkcg_3z8|~Ͱ>vj󼎟U|ԛsSw6_qgBS^]v|x}U8n˻H,:4oj&)GzMpq'i!~'|6l]O*iEໄxӖU<-s}?64qm/|s:l!3cNU{&~oF?vljg;MpM#Mh5+ǻ^~ҍx[o /@"ơgO;:?~Uw{߈q=k\|g+%~qnob?Aw__Fixh>/|M <3w{߈ވ7V_ڟ>NO2巟A+Y]Q"3 K#zˬK+_ԫ~ꜧ%|1<V} ~'v9$|Wg?g g~0^-ڲ^݉7+҃*˻J@/j:q'aSynwbk |kU3o"z un7)$!~s=- `~Ϊ_ /8STi5zs>o>bcO;#Nx}x.*{(<Kc?sMGxeO~G+xiF P;:tLgҟoЧ4oC\C'?Iϐfg =yZ𱞒ܛx4|!."&%h~ fu߰o}3@͂9VeGGŜ%hg`~o+V)n $덪-A ~6Żo*Kn:t^b%Ax3VN;r7Ez8xEY?J|P*gKL|$y'1-aZ(hKLEU_c7mey}/1qFʼnv|ϯߕ|x6~( n_bDFz='Cҷq|ϪyJ>tn/)Ϳ/|ϓ*xؿw'7yi=IX`i!}ye&'6_?tg|.hѿrw%&NDoIׄ?Λ#}#.q?}ћ1_>,~I?t=|%&NDo]/KBߐ^׹Z}C8+G;4zFSzlC'7j=G|ěoun_b$м ~;~8l*}/ڳNu\yk hhZԛ zO1ς4@Ck:VoIz - ?!S#>~k|Ѹrq%8{>NWĻ6U˼]}71U5Y?&n.vui/q엾]w{߈/-$<~7H? s84 / ̚^Llj{x T87?z5֧o7؁3z8|c ?*cR4Hg*igԷە8Q'8fEwSyZ"}  0Oq'mQgy\=5}|uݾĉ ~S?xPOWwP>Ww'7s/: OK(?@sX)x2}b /(7eonOz~g?^ix8Uy:}JS֣94 >S9ă?Ǯ ~:\uG{w '|ԛăd?hBjiV/ok?Q(?<xlU[yZGI~zdǏzI~@nwbk"-W[/xguWqrnwbk 12~3~渟BUyBy39OK<8AHdGeudBGIi:<쟇};1u?fMO4't}W{ro>bs\݉7ĩpڟg~r=n9~'o]b~7 |6w㐏w:DNL|-~d=c} ^'u}c>ă~h֙ðGg>Ǜă{טP?cq{ F7}o_Ӧ3\H,:..<4DO<3Wݾĉ 7 fWwMb~$\G87ǁ4['4ͦ&bkl$ލo&?JLԞ)U#NOL|/^ҟ;g7 5tzC9r('&Nxja?QW폸ΈRw'?'ZO|o]=$^c56~CBu:/= }A~8.T8.o>\bmbǹ{ f6մ$lof)7&~@~i~.8hg䩍yZqqӹ,ďvw?_xC]|y yUASuӮx8\_5זkֈɺw6 ?uԛ"~w&6_ǁ {}6Ǥ?r] q]?PџS8Pp>?ߚXNKLω܏@=~>z8|t{|oos2&q8 <|p\h7}8|$F='d_t0?ԛ5e_{& ŦͦpM 9_+)1qXoJnJOnK M7|.[9$=l1Π7x)y3nF7z5̿W֙8|Vq>f&qhhDP],^մ$kOIY1qz͹w'7ׄǹ'kU3Sd8GsI>O|5~%tBx7w'.ަǑJisKgݮĉ r?%={jyYxʟۗ8ָ; <3xhhGKLć_qϓx %|ǥ/%&&&&&&&&&&&&&&&&&&&&&&&&&&&&&_spjI8_Jw#N)_}oঢ়N+ɇN|wpLMf?6f=}ݞĉˮw-4voЧq}JL2^84'4i/'OɇN.=~_W(}jz!$Y ~w{jw Գ_Wi%&NDo~E >jy/x)"W/I7K[㏃k˺+iI,:ںO _AПI.{9!zސOei_w]Zծ0,ָwuݬ0iF<)yݓ8=?U>&q_|2ғ̇}o;:~vje?wϝ<ڏ$LI#p:nr/+v}HU/8WcǸ[xns^wʯN#q~܇w|A1x#='ry)!=2%(+r z^).^p+^'|2_'rY!ϪΗTc~oI޷\U=>.u8=xgžukJrN_w \<+}|>S7yIw(ց.4qŗt{b?+j;+z8l%RH3n~ :1§9bYd㬩E՗ŵ]΍_ncvώ%}Y9J~W^eTWu\t~TқveOaz-mvlX._Ck_Fss=q]_;>Gۃ~^:Ojԛo^JoVo G<_M!qAM~=/&8v[MrK雒3&7)?\O|;ny~}SQ>~VoqH~)}^Mn=*^wT=J=7So^Jot뮞}I>O0gw;6U.WGǷ=V9]mǔP.1SկS񽽦EV'J]e?|yW\9c^'*w}ُB=YOd]C/B=ü/9s=K.po:::Fs˷maJcW/e>\7T~8k"E|~K8v(*{``]v=v \%gb^}r]\oA}bf4+9޼ޜsׇ=9 (; *Ϡ>Oyz`7yyo%rRyn!G/\IJހ_CGs8do*u yg(#rIL|Z_9ޥ _>/<庿vDDK~{9+}^3 {/bZT~y}wNj>3ޞ ם}?PgJOVϥ~xNI| ; `܀O^z{? |e4u^2oѵqzYf_kU|4Xb*3uxK&kz4ǽ4 YKLl ul<>uzz2aal+k ׿= ~><;x^wyZ/պ{#zݐ4垮7a破oP[jbwY~E=.13 `GUG>O'd^?t_Soc}>׸qQ>NQΐ|7x/=.(|J?r_1YyK_=zcQOggI|;s1⻀nUy(%R~ 7W3o8;BI$wIyiӥO[~~L_)Ǔ1O}eƝӱNO_Sxw& O U0?M |2}(;.s,8CD;>܅׫GJn}Z?7^=?"_j[3;)yWc {pS ;3\$wVIr}ާwQzAogs5*~;<s韏o)罔/Iz?WtО:w>ˎ{k*v 8'~ynm)? _i7 ŕ-YJP+iqXՈ?ľHس/ S0Ǣ)tMoݍ#M֍8|/olURi UF/j?QJWyT7=m#K#Y)>^!Y6;e7˽޼?MGݟ+}:hqk|oT\Ov;]W8;\AE~g?-&=O-=ǿJW8#O\{ ND7ab l(>{Rj\鏩71χ vF8vKʱ#ZGXVxǬ~΀1g:N}JWW/GgK@swaֽ{O';W_qj<߅}M|;L\3/mҷ⠆ak|徖4<[ =NR*o?gG|7t9lY筫X_HsqСO+}hp~]}Iyf]!pr3yoW\S+h}WM|~~6ԷWiO%@O˝8 N!GgGů>˳ټpoYY9zɷy`!-uyisyW'.Jq9w>i: ==j# 6ríM:0}K\>U?94[;?^cy{~Z^aOf8~sL*X//ҎqU?Z_+}:hvp ;g=<(xg$(|D~᙮#kԼ?{lwwJsoo_q Bg]ӞBZ{v v΍=cGa<<ϱ4~cIΏx~A{M= ew}}NLM>#8ǥ? o27<͜ MYqXt/T+ϕgqG-i[cM5N_Ωl35cpfuyeooP7;y?td3_Ӫc[W^i+W!_cfwW1vO&yPܰ*!wi'}+zw)N>~W!'_C oki܂WW݁EC|{Ϻ|)wI ~gᶊ܇oy{ΉĻ9nH_?R{C180|MR~px_Iz]/ße==o.,ϳy]x8MϧYfxƣ~2~S My⪰_|r9wvȫSzP; T?? ӄ^ t~s^Eg޳7>lvSw9o~6,۫]_cbn7\Rc<فx^G]ƣ~rn+9=Ro|v~߾S?!Sh4~#*C[~Y)O4߁~/^6|#g>P뷭E[oѷXS)xii(}|7|m9Oj'Hӧ4'μ7c&ϪOHv8|>Ə|'xoٮsr\#%]\i)KʛB^}No'^n~9s <~ejt(XGd)_}#oOȇ/~nYByyKC<߿ƣWw`9Krwq-O*'WG~Yof>r(=5o0v[>isw?OիhOW<|1G+V|! xGx#/ m+m{晼~Ҷ~̆c;qU+弶rK߁ ~aOѾ,ǖu^Gy翬#!yi.u^{O˺\n;)i}Q}e{~ϑz3ڿG/m콗P=18Lc?>Al]cS/CgR{ű~~so^=C?v||-ʁ|{<;spo|8כKໜ/?YA.=:eށvYskי7Ѥ |1jC~^{9rٗk.4{qF|˓W%LOM9G-+}8#FNWfuON wPf=]}ݗ=v o G7&WSO;}}X>7yoE;MQ'rWh-|D^\4gl?N-'x!}<_i-ɔ;ijCxLx(~O_:};г>t ˸yn-rR|堕QwћneWW/;#Y4dxYy}GM]v[~7ѦKx#}-Kc{Ñ~Ss3%2o}s6L?~kmI^l7ZVp(VޥU3Ρ74'sBM?{=^#Ww|<9MW v W _gv?_>? jɡ՛.8&IyqxC~uUb%O@t3Gi'ow;?M'^vo8Eh )OϚ#3x~?tƙF#OWF?.[aOn{2 v|+z\ZEY+IGkoz>~78/;7ܸ;>xazk5w ;>=ahzzy"eiW<ܕ>پܽEp]p—ٿE>C}z7s>坽w?b^-Gȧ^zΘ%ewn|'Zʧ8ܪ73{u^Cyz287V&(>Iynm;?r쏋7Si<|8~"QJ2:'ȅ{7΍F[tGy9݅@89寿'ӳ1;K 7Ύel瓤6CA/-?\J/gع7&OG׏Ghk&]/6ύѳ"pg-E}nz"~{sg|6gg;ߊ·i߇et7r}#?#sK䫸r'}% _T#ҮK;:QJ2 ՛Sq.>HrGw#7xOr V³u |\+~v쇿Koز>G|mҥ}s`}/ԛ!_,'w_oKNIKyqc6/H?kY'[?ӾWN=O+?^n;z|Njڧw,pjO=gJ9ǂ$.{_gpb0i4x9׏o/8u{]?hw+}h_r=_b^R{ gq]Ƚgv??C$~vH~zyou2T%=ĩ)>^b_U_vIwvr86rNg1/goL7a=._C'ᯋe(>` Ї);y?%CѨ'2ŧ%K)| ,>3\GT~ʙx.L_Z9My/bLy{)/ȏ=C^ 9$I4@t{$ E.{/jPB}7x{g7[>t){w+.w>|O͆ߥOrZVzoŌ\;9y蹏#on=tgυ<,fz#_F~?; 5qhZVzs}#q~O񭟢S?KʯOrS;OOwS;{ڵf<7Iƃf)?NzƵ9MnHyMƿ.:O"1}~wRިC0婷1Kys3=o/sh&~Kyx~ZVzތ#e_,*BRȑs&My~ⷬoUf5eyyC3R]x3IznI҇]ΐ3$|3Q3_,߳'8g_C28{wŧi;vOph܉r-ر؍SG<>ڴxn??ytw yWQ>/,W ՐGHZ=?o<7N(׏nqI2%οI7銣 nnIn5Wﳛ7E/;<7~>#k| ~Ǽ ǒ87_3~6i+_{g|ٌ[8~I/2/)>rWP{fO;'C '5'lyH{OM7 wnΗo>.]~>~Uғ<ߞ~?ɤ<GŸY{KWw{M!ۇtsǼL޵C3IG"/~QoicTA7fG^&|g7yKܿ,_{IjwyZolm?ɏ~}r˜ǺVNmѿp%pZ/G0^wO< Ok3{ľϼXB?9Ϙ|S#_M~8/y}C.{zi=Gxozorl^3޳<;~wqѾyּI"o7D.J O CROӥYy[GPA DWrΦ΃?~_?qf&G]xiq/N?Jgbߩ\HL/.|ØW~ߴyG⭎-Wᤜ7‡K?hg\B>F{:1ڛ~ny/_O#Zҷ1s9_,)h14>Gn(܎Wb妿:nGkX9h\U|DGߎr_~o]9/y9N-% zku㲿cvfޏ\%_x#yΩr>c~3?hg|8OZq~z$+/~us㋣-Cոi׮_,(kugYkGR~}G߾3M72?oK=a]~8ɩvynvY~"RqN!ݿ}MMNO|ѿ맍޿ǤyYNUo9//ԧpYګة;G;ǎVH(:Tqk038gq8dN]Y} ƹ8rjOo?dܤ+mOGypP/{uq:8xTGV9+q.x~_9/OgŻLmAz+A}?lvXk/83K}ѧgRnáU.翣G_a_ɩy"LBw'~>G߼:k|MrOֵͫ)ٗ_ȿmqygor_cLDM=: = ʢi<^Qnoޣ֡C}G B˹Q.}(>2s_C| N~{I~DɱMz uj7iU'?xޫH w|C Ϝ8ENg#j+B8tNj5] eunV\:o.iBկ[/ysHY_Wx73O77/syv]WƯiɼw伸~WxО'ތg|v)/ZmqQ$}G0{=cԧ[sF?>|Ѽ%+=Do&nfƗL?9JƗݎ=Z(cfm'-MW{Gȡٿ寿/}z6^lomө?q\䳾kwqkU{w|)%gi(98Y'x"'ŭF*OI_9Q^M|N[+*|{~))?韖g MlYz|ӷ{ctm3鋳ߙE?01cܛ3.Ri jk奔cVnU<>N5gDn%Nk_,Ԯ<_Y~}+c}<_X~un/wrО7~s;|8=KJ9nws˸gqɓ|0z?=eiC{5|>mΔ8y>{ {yA?j_e/_+^.n{%}qUyϮ.s&^_|h>Ըt~M3>7{[#=K:vY>m[a7jr3}QCVg1=4mˍ6h}&9 wM=?]Óҧ3^oOɧ\n8'~ߙz~2= +1̊y?7rr{P_g~O¿9ߓpyo#[?l֛RsO|˕>YL-}q,; \KkΟ?9o\<8_>θ9o?9'^3Wdҭ/#ϑ%<6~7ɞ gYt'͸ÏяOߋ}]8G?7JwzXYkgϲܕ>x)Y~`9>r֧۬+>zB=sj/FǺXuhYrz>׿PxƣK͵e+}2v#\c"Gɇs]?l:zpso5ncʽ얿\wC¿xkG)7ے;}ixnpƑ}9m/uk~3\Qi~<8Y+ffze~Gh]HY_ro}}}'^GW.[ݏ)>#{q omwC!~£? _wqt+{8:߶z0t=FO~/V˜_bv݌&zߣ7=yz\ֿWf˺QqIWpy?qiZ+3^ׇ>ޣGnǖ?x[}9?źxD_nd؏5ngƫ7u;m3꿶ܷqJ_+nT6kn<7^\e?ϗ;.0aO=I?t~`{W/>8Jeܯs>ٸΑCg|{3v zP>\7|og3n{k%^ '*nN| gh8͞z⼌+;8ۻU\h|◊O32)g8~oF^ׯ~?OSQr G _rE׆q OzWϜ_y~6ό?L w]i[xo~φotaGΥx-;NZO__g^H:q۱9Do+ٴrKIǏYqx7 hp*'*nlO7G}>Ѓ)DCōpZ6]O-߯ɤ6C/Gۊ\\JĄOsRs{-MW/ n^y=s35>=Wl'X?i"[O7g"xON?Lc-JSqmG糼O=уVdmD9&7r.xÖU" z._i&jɹ@Fo~o}W"s?tʛT\\zFѸŤ?83_~㿰~v3>bq#Qp%s$y>7ӯMyӉ~Ϝ]մ)E?svr:rs&$9O-4r8E MQv{_?dM+>-?S[C4Ɇו+{9K:m㓆|2|4o8.A|ޟo~+H9Y?_|o?Wϥw}J<.Mr5jJq5C2w.%.ƙx0'w~'?zx|_IGToYɴȃg8yxiwCKG0/rUI+ k??92)y_h#0ѳ_O<'?yO=s-RZaWd2wGjO޿qt28|e8yc"oMoΌQ֏?90pppFoEkću:!ʵ?Ȼ+_!> rnmi\weK~kGڳr'nGOYl!7M< _6MpHwF4lvGj\bo|o'|UEΥx*/y5OK=?v}z*$93{hy>:wQ{Rs#/N:[鯼0k\ޱR1>;u?;_=ߕ_#1ŷznq`﹤ݼhz_q(o0T 8UH⿌6NWö/*尛7]ݹx5z/;LW\fOIcCq?ҥ){^?Կ\ʟqjWNn5G?qo/ǧnȉ~:qCp_qv#738Ky.(eoS~kV;䅼]Ok |^WL5>+s=q/ə'dwkпwwf3>c/唒ȏ~>wSޏ7[*>_oR ߧoy_֎rzV.e?зc7s>'W^'SA߫.ϘG?z}۵co?=ܒJ'-7L_R^ݟlNc>~A=ܸڡ1S|.$_+_7d?/)1eX跶~G_>6ޫj??{γW;wy߽pP'~wI9y\99 *g}gj/y8GN+i<;xs(o޹N]yӹ/F>_+>mҔsA4ߓN{tW<\O9?ް!9e` qߑ.qU9<2 7|a;9?;|gR㹸np zߒqrOøo~=;e2iB=?n^6g~'7 n=xŧ ;]vrvgWp!w~Oþ.rÿI='?~b7ݒCr+,'^ s蟇ZwȝzurAy#x9h􁞚_i(DviI|aKጔcc}WksCr}}G~&uȾDmӿ =."=ͳ}؛c_!}Uo#9~|/ýn^!9r}y m.|V?CC|VR>%߆wjg)wzϮz$О9#zOR8BO-;rNUr9eb|lXp\֟[9guVi74OzǓV?2vFq^o9r:'oJ*,_+ei$K~ߙ؝OocOҗyS/kIWK}v5Nr>[{x<Z]31-|vm`3h]o#B#"œD -7-P<tqu\"ΡzO-rQ^wr?kp[\n)ǹhqIIG=++~2,Mw}9l \k7TN¤c?*_={M >?7v\xHkk;QJ:Z\@֐#9'-nt9O@q&nd(|p8~Wڙt-.fb(o:  /9qh]1_ gj\> 1<zG 7 Ho]y?|zwhyoBqY7p<a?B~ m|M[;:,^F}'_(֡7֣7ٯa^/e\=Z|ֿ[(8W~>I=?C;{?usp1y.6>_S>9Ûg?}^Wz _O;̸uos{r^^G'鼊~:/k<ȋsg;|{>zOKr#- O>j9{h~[3G F?_W6(B92z"_C2b|O0:Ac~zwG=FtO񜟌Q^ɪ7?;rt)N{^]}k켬zƩTOcw\YÛLwOmO:e9O{o]O-׃k[ykW3'=;x0wmK !W㙄k&nhY·U)<9[.(?G{A}fN^,qiN>s2ءk5N7r=[_7a1Np.p^.9} yԨ\ upnHӸRrPS]oI8qʭѯo]ysl GzP@NP8꧋^dOWq{·(y;#/p|:e]yy3,-ޟ7wsorvF BoM#/Qly:MyT޼ָy>W7r~UN%p[cކ r5DjwK?~ūu)y:y?>_6^v~ں3{4R/Wz1z-yy`χS<Ѽ*COfnQNhЗ<˧7yqNs;ot7_>gOH辶ȻjOkQog>)˸eW9,,ڸ/Wi!7?χ3y?K]\]O\ڏmWkR^ㆤ'c[֫=ť|LzYtK\!zզEjnZݐCWc>t? p-3r5cʞXn]8etg}yyX9-ez^/wC\>@|Ow7ՏWkAJ_Ih #nb\"e]W|Xs]c_,xotx<|}7^Uز޶ Լ0~o+a|C7uwqdżn<3U׬c~$'IqK:#]y|i/O:7c뺠7]3=G?JoQMi3^yQSkuhMeƉo|ȉIqY!}Eƥ镣+RΊ ~u]UN]7KKB{nUl~]p/5Ҿ/1۸%ύ]i>?<~{>ߑ-}zSws}#sג.T>A{+k9;XN8=\~o)yn|h{zVKOէyxݹN¨oQ+:D7׼^J9:&e' _36kwW5|eg|L=쮧{v5wh&}n)_)i3K~h8 x xQgW/z?%{Kr>M'{+/尗wC_y./ .b/W{h/|ڟCMiC;y3 >48G-:<#nj/qfOK4nn~7Y? 7U=_^4c9?%yʫyZ;u&ޙ!A?zs,}'F9mA\!ez/$ݩS>es j/}n0I4aިsM=C7qkHMԼ^;mIl}Ro=G3;P{J~O-1&|hCU>x~ m__,Ly7_m_xӿ\?y]Ii yzi)~S~/˯_4G~X1Sށ?9xvO>gOqo1}vt{~&XGƫ#J_LT\4ʹ]|O|/л韭~/Ň\=o")F7eNpޗ_y@-SRZ.uGVT_קCC8_t7;:OfSj rF?CNŇҏ{{96%[=/r2?rPxk…@Gg<>L\Y˻LG/G6Ͻyio~O'f~wQ3~kCWO/-o6Wo4|K:WgQ%}uqQ9|W/qs{U_?Z9e_4z?wQ\s >qy_<,WzoK85K=Vy(qO9}L^RXs_A- xW+tn?Thّ=wG;٭{_xLL=]^s~zz2Kcz ]QW75٫`C /yO@ \$<&X)\&\\|68rgcxx}hOqr| N  ~ _9^XJW ZH֡ټÊGǁ<J,܍ߦ?[n)ֲ=5T?3ָt?O ^F}ܹ7nwCclVy@qZ7rXj~"pp{k[[Q 㥼s7;?Q><+~^fߠ'W>&Q\ãuy_눗[\l;OWm\ߤkyJHrUvě.R?&:p}SA}j^llE_gm]_<ڲݬ[֡]Jr;Ό\տtx.-<9paf||e]Fέk3YJzS董ⴆLi8$z/RnᏤ}N-t靗ܨxCk»9HG=>+}4֯ZJB*}Z?A;p.gBNƨ#|͙ϫ>XJdpa}m{q9xAxI e|y.\K/r皸g;FOS9XJW8~3Nq#O}^QNp%OEnj z|KyI{w߹I?)U ><&]wi7&ߤNُCyڼ9).$>fCXjy k1Gn'> .Z{}Kµ|֯b~~S~3γ~e|@x?%_ޣGnp?=\΅+qԺsv)k} _#\~E#rl?PI9=4=Qr/,8[Y~\!'ܓ{g'pMpR=W u^4ϡgsE~OK|s-!wO/,>6Nh{sx5o7;>?uy(a/8P:?(idk{W"O㗃YEbÛᓝ.~z8RC|7/3}gaƗ6Tڙߋc0eK{>Z+=Dor#wO79 _Ci}\O~t̟rz/]ezg\Ö}ҫg+>?џ~.8~t{Cr~6+?Ryи_W潔3zm9(@zQ`=;׹!W3z#g҇?ZgG:x5;jOe\Υ\s<-e?}ax{9>2ލr/fqN=?|Οf;7=y~w,} orVG4?xnV㡎h\ѼGCW;Z{o[y[!z\Lq%ƕÞϾ Ď>W?`/qWa#?@8`TCNeBSA~(癡c9ߟɧ>49⫭8p[Ԑ2r:P~ }^xh_08ƭ/Ɲ~Ȇ\c _@۴oRy!68Iw7z_\hx8߅1Ӷ;;,x|~غd?ʷ}FI8 #p@IR>zrިNyqǺe/[_+?g?>B_iqp4{Oѧy.}?<7}1X^Lz~|wi]=C}o%rc?4`n(=2{eϨv vȵYm؏;vPv8qt8L7p#o%; :|ViyfF']J>qP/w[O}N~8']i ߣ_89 X\IxVo~Myq#KWLhqp*\O9E_[;ZK=֎ƋF}/m_gֆ_yW.}?7E?eǤ fҸwqߵGr>F<ʹrwqMA۸,Gorؿ>.׃ޟ_s`jCԷ]g,o?,3sn%~pw%]f)Lq'n aps\o/O[n⧡Εz>R\VdÓ1]F9'~ûr~vS^qM{CIo[q;<|zoWYpz| eS^w'mAU" F/w.yd}*ΎH?37g^Ѥ]\๭7ǬC.?{i_qqy~38Ѻdg0nZ'&},&͋폗VY7 }"7pn7D|<\ؼGS_Z|2~CG.]闣>xx~3;!PdE.oj5>"CEj:zɲ|z GPS׿κެl[qͻC#C>Om/'֧Lo'9#@,Ѥ[Y>tsoiu*~~,jMF}_=ŧkyҕ.rCܿ=oMrywwSN7+ݙ<{M~[~Gt= x91򱻟 s̎~ßO}=Fܧ?w7;YrQx!a'i|; M7<عWGyp;G.y ~K?ps&NgT?R=G=N+~hռF rŏ{䏿ډ{ob)mq`)'/EYNO<^~tї;x]s87O=o}K'{4[๎/xx2xK=Iv[Nqzc{턟;>ŧ'Ҫ7O>_297 3) r߅wdjqHӻs*ϾcӤ}`_uf+z_-;'CO,{Io"7Tٹs$q9zȽ8 |_}5@Ŕ;Ƕ8_8n|ԯZq^{uI_?ysCXҳc6XIk`ax'r~N2N~CٸЛI̾ǩQnck;Oo<~tRoVdP/`cE׉|17qxA_ūOb ~~6+ \ v߻ʙq̆$W>p)p=8x7~>TǏXQu<xieo_a3=d??n{:nG*?_mO~عW8ypp&3f+oB'uś=x]ZJ%Z<Ӆƹ.Αkd9M/׍$/ Yf>?0xٛkHϚqg$ݛ,}#p՛>moG=8hcV?-) $7+}i]7O77<ۿ1֋w&\ՍɌ'_J;Z\SNIW1玫e}śӲܽ/^Yν78Y~ WƵא_h9;g ~ʙrKy+Ot}I/(yO#v|3n{5zGvFZ_IGɁr|~#<ߵ<{S:o=!֏y{ s ֯K=Ow)/g3.s4푯ȍ{ڣ}%n7j/[>~=9wH{7`[{Fyq1$V7 >xʙq_8e_✸g~#'KA򨇟+csߩ_ҟry_`sRűOÏ~.~G?[T?{ۮ/6loS_#wI$91uƥ߱O"`ֲ_nK;ɑv&}W޴_ƷR.45߰ױȩ m)b/ú25O'!; 4ʻto;zLj_};loѫ?˞ w7|ѿ/~t%ϵߎr8Ԥv_cxqҌ]_Ltǖ?燼*?'_@rno@,吟/F=3).OLΚ)/'RN:ow#%*L>rϏ򷧿o\1W܏r;>c6K1^V)/)?߸b[`*GX|N>[~&g? =1O]?~GBkA\uo7l|'^G-r ŭWY)W a^:o?/G'ͷ~8,igܶZcI?~ڴ[jl)Y\:/6x%؇/U~w?2="M'K\|ڧ*߾ž'k>{ɽG^'#\|_} ~>|`|ruv+_s_q{?y~;W* ?,2i}wq$g~=/~}:_{'z/gȏvw\~_GzNzߩ{4 U{/ HnO|#˳rZ(獳N+~U@v_K9ӥsO:GesY wZεOIr7dzjHy$ic/Nr~rk^(D׮csمj5ZO?{kc^HWޫ߼/8~&nI?G[rI.Df|7i\+g٫_Y>h_gƞEw{o r|?L.?aoC/8 EՎد>/qWœ$} }_K#waޛnI/^vd\kf6ϥs=3n?<_>^?Q^MSzG[C+'8B5oiAMK0 i+]7C퓭Y\=L.]ξzu^G}g}Olʬ pwJ~?^x?q_b+}ؐog8Mas6TtJ]n}<.{ϩYhD5.6gʹ>{OΝV |{}{F4Ag3>^Y(;4zm˹ҕ> t/rZ|Z^noH4qeŹv\|P[?zjYGzGn{8ٌ7{jI-NL9ye*N9F\|fw <n q0>B>S9'ڟ֦t7F/F^3s5{RNy:uG/u]+ =|x.xspbzGg.o?ū &&\|ډg{lՎחLMqpNvCq ~0)߰?a\ \vt|~ GsNPOe/ß~2^)rY.lqxW3Dor+Ae_H=;_E~7Ob'pGu.ߨޟj\YS3_GcJ#;_-wwr{~_/~o~>=ODF{.?zngze{(Wk~ncE_@ro]n=]t~x[g/Իc?2^Cx7rw{B}7D^ʳ'ȇGן񇨽>gG~6~ ]]j~y3{>'zP?j }kԣ|܋ƽ,~Pr^ɸ[wȅ{)׽=ߣWySSPYG~zO~'p9Ip2 ~^b.y _)U~/Z`9P皍+ӯCݣE//͏?lW:=7S}ok{G{_+wA޴ǧyv|kGy4qv?5ҌyQn\rm> /MqSˣ_S;7]IKyOS返V{WWӿ? ꏼ] #?❎E_R<3o='r Rx>?Ǐǧ~c)R?㛼Ǵ_z'3ꨯ~Kq4~!O6Rql:: ^~|OqM{1*r>H=8~_1?;9߼go%_^JG{gQ?=zݼ@R*I/|׏c^վy|T~?IR_^ϗv1c_[迎8L9WC%/eG_,ŏ}Dw0ZN麈WI^q;䳸[Kzo__n|\Zߜ~~O9~w=4+W`a_^Ow߻'<乸ps_}Wڇy/Ͼcr<w|%(I<ǔgG}?~x:uWf)o~geW'%x_lᗿϸ'w{/?)c|oc_x={>=N=,oM#G,n|>ZȿqGSsr{n==YΧ:_ -kϡPvҹv9oedd9ߜןC7''K=u>iaOr|v\ n=Noho cgϥgFz>\qjB̸>.^Ύ ~vڥ>%sn=K.7bw/(W㙜x}~7ݕv]vgB8a{~[}> ]q?.d_dKy۸S+Z޳G7|Ipa[<>Hao? w|ӾsABQ_7}q'#b_I.: *'xy3k="q5+K}OYUz:/k`K߶/3μu QngWЎ~źrs#3K9⥖q?ŧ$+R~i//ku*Gn7cy׸ ?I~?eȉuž,y63O˸/߿|?gxmwgKiOn|ϤhA7w}\#ek՛EoގnW'C'>9sOl빹)<(\6yOOy NPyt8k͔v{6_ ۼo|G;,^H}ߵ?wgYJ X'k|~aMk%r\v xϴ0/ YqM,ר?1 {siG8钏]/urq+W)gFN2WƸ7]hm='#\;;9o\v5N?!_Q Cc gQOQ4x!zwUX~!yw*+| 6gU_8G>鋃Rj߳L8E:Iw-g 5~W-7nE^n./y=Ip*'r{~ŏ\WxÄ*mG#}{o}mѤ+^l?jzRih-7 y.m仸8YCGk7Ը)hÛtrJ=N]%iw*'o<+Myo uu}N~Wg|58s{a{w.<_>z+w=޹nsIW^s.VM 4~OŅ`zv|u_O~eлWWxV%;CPzt6.-v}q6w)(?pwg䙞wM^=M;wA#џe]nYq ).9]qI-5NurW̓h,nEyO8{C>|d~/4/ox\TSLK?=?vÙ N">koGN|ڈu o[?Fd2:MOw}rc' R_)'yX9_K7BF;i=~gx/87F_e2)_}}䊾(>?;u~O'y64 =AL~r~"~f=qzdr?w_$xG}ryλb#yJy_W?|_|R_o?/¿s =;9[ײ1t3j}@83Ou& ~\rwnv;|T?d3];;ިyvn8Iү~>myo~o_&Pz9p;N?i'/Ci<{?\!-)ۍ_\S$_[w>.tO[G>'=g'?L—10>.ȧn.'yy=C7\7y=>O e7b-M//Ƶ%?UM~?vq{C&>p+?iQ]ILh;{۷viOÏwwnG')﯑##Tqby_?-҇OvDo^1SS7=yGRz7S2KH?ͧ=o:.c_}^M}mп|soIn7<a3?YQ<%y痴~So#"9hxNj_ϸ/g;ȗ4gI]דnjb?S|ShʟypOs_m])>'o{&_N=ry{WtƑo|??~syo\Mw8w\ۣ=]֧>YK[ԓr;*-f㩝,ǵI ~(]>Qwbc}_ywR uNhgx'\a~G{);o~{Vp.U |9}<_ι߱yigÿs Y<߽GMQ{kC__NOcoK9.iZϤS㙿08igh@w{;:ep>x:si^~wNnU;][R;R}Q+>v-vs]9Ɵp'~"x{#w[Syfa3G-qoFr8Byg\%; 9ߴ䫿7G'QN(;39s[%'/>Gܹˮ <͝{" /B_=}Vne?&vCc=]s'4nyF}c5/J; +a;}^';Q_wf!/ʇ0n'鋋_38oO9hW:%[ŕL9晟.{ൊ{yr_)!铯ӬO?rDN+}&Cm37^ix?<9;pկ fcYME1QNNg7>¯ϫ'ysy ?r}d`8ϸMi+:yIoBc?1?{m?q>7{ ͌o9Dõ'z%0"۷dB7#?CW/ WwFqſRv5~]AO3sq}>1A}qY[c<ϤܓK^{QN{\y FLy߸ ^h픳GiyvrE69TϫSqW|^=ꜲDJ==<7O{;cOaa7p BؕxޑSg2 Ԏ[N~繵 $O>O27;-;|L='} #OXJfi<\CbsS~DZq䫽it)q՛қ Y㒆֎z/Rϱ -S4<\ɔw}o7ΟzC|!۠_yfgmC+6Nfe+=DoiCx3>t3^pi}ͥ\xz7;_x~vn[)[r} iEOGJ;RM'7ſ%}>t!'me3/}K݆ӓ=nBY?$;c)+_caW->/ogqȳ~*N-=^ 㴯ظC/XbO~1c~&{mq K}\!zy+>M:37#}~/#~|༊_<Ǘ>޲=+ށ )'Ca3i>x>8iczvI=8]i/OΟ3/1_'G]'!2.? __rʛDZ=C_/i=orO' Z?l3~!<{L=|(=$'7c߅2^·{?}.Uk#s󃟞'?xQ oD<8W~7 }}qމdy=?)便~?/\VzT?M7H_{[V>9B2-'U4_ ;5!OcޞxLLV}=+lބʽ,ɃK8J3\O8ՊO{81O_ѯScݷ*^>x1!}Onc?mY#;\Wteo|/xConz]`7zOCߥ=d_ҡ7ɋ#'ŧ%]'V|+|'c;w2􋟭 yv7c|s ;Ǚ[Mo4ㅆs|OZQuJG_9="?pOZI<9j<>L|z!G3Ӿt:sɗzuإQyK؋OF5c_ϻ鯣G՟ɱ`d~[ij,aτy>ts(=eO㟉|ÒՁ[H*YFzNi]ϡ7ʃ+g|3i_&Z9~gpw{y.#GH্p&wL_-W\9j\U8wS_*bѯƥ?Y>#q;^ ?|ymuiWc|.Qũ5y_hʁZ׋_kP}\5}xw̿pQ3Wyu 3Iw?!֙g ~kr}qBZ.uz iqD+<>!/I_>s!/;Y]ɕ; _|Ϸ=Xg8D|Iϩ}&m-_{0כ>۸nh'ܔW)_8M=Iܤ?#G78P濹,Cys^s[v7Ϋyq{~n/8o'ԧc<9DcVz޸Oa(;fOsˮP?fIw~/x}㡆OzH~k' S'׿%;]rwql^2_?)7^/~[v|-H\?\wW2.UWڽQ^O񅏼gg+>+&NvQ;V"S0ԏ yeTGKH}/GO?~4֕'x48庹ܡ4p#7"/g roק*nTy!|f&P}5Emqq'C鳥||bߓrkvw9mn?oTƧ{PҔo.MG-:w?e_8ޏL:7?K}_|Zҏg[dC 4i]ڭOcwybҧ+\s}[KF߳8ֹUoJo `q`q:9ұ87zcg` ;pq/> j}3|ᏝG;[Nviﷵפxi?U?~=eđ-#>3~ۙg+4abYq=>8yc_: #=zɡSGy `>{&<;/\;7Q&]a!Tt=H,8*f_ ~zPz+D^^GŏG/W ӷs$/;9a NE9#?yVojXLW?jpR? w#;3G}-w9.qXG2oOwVzQїy?G[|Z|/EÁ'~&u ټ^LN OGG=z<ꟍ>kՃ_\wա7 5zf>]+3_r{}'}|Wc\/{8N?nQ_^%<_'`pZ'}Ɣc}W_HŋEnNt6oox0oT磼܌O៯,7j' t/~'Sg/ww\> aotm\ɤgif<^3C~k!W#=_N}&eq>Mύ~bhY7?~S`i|˄KqTn.V+ȷCfo+I?^o/Z(@?g=34co\p)׾~Oӕ珐vüzn\r)OBKFm|`|fVzĿVo>cR~>Iezx ÑU%_{[ċΖߏ7L?Nj7~4?toǢ\$;_G :&?ܶGv>6>_Âw9ש?cmKjJƗKy/?=|cB|Kʯ|3߯>n2|`=^[~㏆*7QNfƍS9A[9_ŋ_g| OL:Yѥy/fpn1kUQCKR^_ԗoJ6So_;~,QŁ~Gw~ dW9w q(=Rs9*ngSs#8yn;/+qxh+.ow)wr_[9;oC{s!88xҡ=M?}8+CZ}ewwvAv!.ˑL24iGII:O8t7pPxUw&1?qc>g1wI:8)!/U*Y=?rX N/n~/F{/;i5w_\_\ϖ/x/Dymrߍ%G ޥ!"/֯g;\fٽ^ W#_y^?y>K wKMkjsg^I\)G=^+}4hwĉŅY7bސ_&~H;=LѺyS_q#N>պi˺S|u@Ogʺr?]+}i+<%?E_roC|G;-_ڹ}/*?~}u<ӣa_׎Zf8O"?*ٍ9#wC)NysBޤ+,ŏ%uyr9<<>-Vsg|9%W~w|~T?s_k6zCC'g{8gm)&ND-n.eSnʩ_4i<[XS||7zVz3LD/*gPyДW)^/\-|Ywě'}S^?8zVzSLI%*}]_Y8;g޷I޳Wg?zaS}hG?}jOw0Źpesx7 unOM9O=Nb}I]ʁ+L=.zT?j=-? z{y}}_qp+tΫkO }%Vn ^gUOx.8v-M0B馵~"9qjMH]ce]~kPvK@r. ;Xk&=>z7*<#/Gx\M? w㲜;v$>\۷υͲ m48KG=+n9;L~"pn^ïНC,;Np:'LΫON$?=Xo3E.j)z8ʣ1p63~wiźC%'=;K9*בr'3׽?؅.uyCi~rξ|\VcIG<_, {&L('{{|4iO$]7DN??4Σve*<ŕ}uQJ߲!/7Nm8vBg|M~7,S~ټ+]˾rRO{-Uuکxx~>]כǐe}ِؐg~'_,W"w'r{\'?ϔޗ/lۛ' 'ֽ(Ǻ m}KyOᅤ>B/.tKypw{{~ns~++}*q.o+}=K82:S /EG2ҽ?ӏs8z17_=ϥ\x_ҕ>}>?T吧>c6NFBkjYa Ջݤ/녇+O]כ~;-uB7rt Opw_M 7g=_ܔ^$?qG;[י~eyK(_[fw/wB͌c r+}L{p;gooon{!H^=yqt7.rR.V)yXwRnK~_|#w7+}|v߲cc?j⎶{:0vg;g mI7+vz?lqlC§9obw_H~?gϦv-=kߝ},ܺެ8鿌]S\v); N6(P/r|ծm<֔RgyeΖܕt7o\ M]TV\?4Q/?W',}˾]OD_,!ßfmB'O=Kˋ']C9|=|>jÏqu;+>#8~"G/Jvp(//(~囧Sy&_3y\:Orf%~ihzOwz^rvG";>x'kCN-ׯ֛9{0I|7qõvZwg&a7qk8юU}ߍS;Ir!נ굟 {NS>@f=x)~GEy^o}Y~W)p]6Wyi{2B~[$Pw73;ᓼ~87|.xj58:s>?rwhWb},iG?Og 1rC弧<~ಜ~|=g|?RqZgb¥_TKpZ΍S9/×s3xhsizwG֏x W|gwN9;1?:/lCv4>J_J=9z|݌OI}C7wh;e>_s|r}I9 W3~׋?\xO~g?i\Ar^ʯ~P{Ç6~yaș/;~7>^yi>'ߕ/_|_||CGSqWeѬ/oJI?gq I +;z,ү{|{زigISI}ǡy^v{W>BW7q+ڧ"3䯸7ߴ{?ȋ 5^3nb)gG^'T> >~>ss4.۷?!_>z#z.囟&{vWc~9A~]7qV'WS/~ϔ{wD~RӯU8To: ծ9W|9I}p]O?ΏǣѾmr34'|"tun3߶]G/\n{>Yo_G=ʡ'𢍷\^ ~RvZWI~qK+n}>q ?}4~޾Yi/m^+]Ç 7|wY5喯<ۧ׏2Y_G)W>#k?U\~x_~/Dr97;K_Mpn|_wQ{o7~9ϷE}ZSƥRSͳr/ק}OK~g&/xk-kKx(q2I:rnPO;b_Õ/19R_|}?8_y#_h\Mg/p֞1gB:u9fðkw^^]}+IW+kz o=~d/{y_v>^y]h{YaJB5v';cG#q8؍wW0!u1q/ %|=| ooP (oAܺ'qӀ QٱGǟG"?rU<~:7agff/7x^?g܊K_~P}nY|p_i7~j|м'ӛ|'~x@xzu?}$}k<_ݞ_pzo3|ڌ_Zkv,Lq#QΩ.?;vc9sv s[/~h;ofYǟ61_‘C"}NJ"7n}bgOrS?<3]-߫%3Ճ+77ٞeJG^zraȇg8csnn.8-߳8߆chw.\.𭑏gWw|gWwL?a=kx;7׆|L:,#vwO{k'<|K~~=-A= wʘpcK{lCz_JGIxi׼ߍ| zZqp~^X~o+\ԋy_m!?nGΕ{їXǥ?Kp_Ⱥn_v|Nu{WEo|"<{>pT#c* oz^כ>9t?\ǽB_G%??9';tߋ޸?|a_9{:|3:8?ݔ]Jý}x ݰ8ܼqw/Qw+^SRo&ϵjtGޕ{ћx.~~DoXYߥ'^|?w]/|Ͳ>mO ޯܹxӑ{x)p3z%?P9W {穼矅(Wg_\Hg,=a嗮ܒn@:iq]og*;q|)rw^|ֻy|*—[.񗧼Uz-$υ_~m/{ig.2ğ>X/8; k܍@3?sUJlyؾ>q7CڣWprp |ןFɄ$w>E{r9wӡ7ѣG\Y)“lN_:v?iɺ>3{ dI[K׉x>O q 0 yOq9Y>[ٷsYy;91Ob~gOz?w,f[ϛzѹOՍuCLG܇%_4.kϏ#?x坽}/Ru"m%|LT~{^8oSU՟߇_snC'WNzCJ?gz!,bq\G ~W"6nq7.rYfgqo?_^q(Q mڔ'qkkYʥs>4~?{?e\7տwvq~ص5#[/f\ū/1^3nHO3鮎.|5S>gǁie!~s n~>Yև<^1oW7[D/~ׯ%lQ5x׆419?y?5q[K'7.vwc4m};Gi\Y;Mq}).>}A{q=trj\yrZ˓#;_z\3ŵ7j{W7?_Ko\d>kn/x_cP~=b޼qk=z`R~~ÒqCoqLyx{)_gn ;wr.zu%]9CpC.|w^]>;s39Opne=?P<'Kʮȟ͎C/ؕonU;,W7;;4;yWgצ_/rInƎ=6]ۡ J>.?MRk7NjXv[c7~&]0Xwݟxv{_/}懿_o}zI9e?R-RnM;;K9*~A?5Ϥť5G,?)N,c݉ÚQ2nmĩÊgG<?ȧ~#ni|i:|[;/nWF΋G~gdʵ\Uo}GΗK*+_?<|rZ߲Qy2ҏ?->v$ ^PM~_pH#|˟;ROS|Z> ߆\l[!Gz/G{op;kgѣΣ#?ew߼O~?ʇ }~9v|3?r_!zfz7r?Eӳܦyyv)OϗvC.Of'>8~s}rk<ЖgF}՛O3tԣc< 'L' M>OG{ng85y?1/Ѿ}f~ }7g~.F9rNH;Y}P]gR1_>U9g oqV~{k?^.<=k_9=[%^{oU?|v6So)_{w~/sAf}޼[;9?"E;sq՞Ǹ9Orz&+GP uϑ{Gg;OiσӮs?ϋϦCO;cQ~:m<λ[~trS3ηkۗԝeƸ8~'y7qqWr<_m޼|3gnc{o.' C}uS5$]{߳vv'^,nysƟsy9Sw~}s78GMSKVq,nO霒ɼ/=_m{1;~2U?2k9ʭ}%w?3|5ڣ8_?q%g?G|RgvvXuL {Ρz1!kez! {gN$[_vW nTG_<834}dϯswO9&+fxg}aYOOcc2ҧ*w'͵<,~bC~==.Ƹ >kkاVWӟ3^̉zc9 ҕ>Jz N}}M_\B|Ԟsk7UV~S;Q֑w.;wsL?k_k+]D{WGx~zSO.LEՇ©_+]Dk/pϼsok^L;\q#~Og)#ǰ7~J}ZC+n~aBgBыxx|mD¿|\VGnѓ{ymEt^k;Gk+}jޏO?pu{CWvkhYwVM6~kv&oZl}~Z.+]@*~ Ϊ8DsUg97hMg~4F䛽^1}xKQ;{఻[ח>v}Aa)= wU?$HJWφ“΃S?ܿ]|KKI}p__9za;lP/nN~Q9)׽|y~['Ǎj_[;po`t½ƛ{?Uxܸ֙'fơgyߪwɻr_{}v8t }K+E?IM`=#(^V~!s1ӛҏ?k_Kc:=i\cӿM?o<^7~o;d>{g&ϙv^Qm\Nvk/R0cl܄1n}]yd8q΃̓38䞞oAObq3gzr}/C>ϡ >_ M9~г9_ r=]{4Vn?ƱRn4wI}x]h~㤿_~ah<._Go ey?Ǒ9{v_EN;/GzPgwڕ3aǮeVnGEy =~|~YIwx-9 k?3-pw+C?|jȣ-įx}AA;|t~O'عW9w~;zQf篼COrr؜OΎ<\vz_۫ެsZy?=őQYGkIGSgzn<7'?G/Ki=!.m/zN䉝Pr7I6i#GRGCÏ~5TsC?.>(WtR~QZ?78)%;rZ_>oܨK>?Uue)<}YJNZ)\]y+_ǬOK#o/[K}~~YN\OV3mW}M,_I"uÚqN#{|oh_7+>S+mGg~|/y[oz+7xm{ңUWi~7.sqK zgn7l~oꇔ5Jw/3΃w$ϧw6''nWWOV$&/'Vy'et^{S=wO'->+xd=g˼ɸS^v޽]7-:\&_G{cwvsѯ^AߍN_g?'i"nlC?Eo/%#I<32×}_YǷwçv•zvS8D?vyOo85zk4ĿrgE$s>D|9U_鑎;֛p^h%<ۙemGӅ/9~>,n>SC߇i\[I#Ɵ/{.'{w=ƹ+xżߦ q~L޿%9ďXkASгI~zowտe^LO;JG׾o<t~ϸSI^)=\9{3<dkL9+rg=t䣟C>nJ;2|^ߕ1}C ;5/ >d]?5ljC)*~pțrt{#z~GE;x[lpe |~lo񝣿˟m4֛?۳77SKҏo/{+rA/k^ywW>=9OHyڼL~ vO_~~3~ԯo/9d]^=ȷ}|}|=K; R-[CUV?7oq*ڑzg|z VNA5~Rx? 9_s e#שQ~/.%o#c>žD/_ cse~4ܵ?8^GM־|[cOÿ6'+~EÏy(~CO#-mtdž<_Mq@p<)w ˞vpK~G_̾L(F%}{J~|37?~yz7u\gU~7[y.Jy8rk>y[;7p7/L\yꅔ}'q>$YqGJ+>ކY_gz(=SO.7Jo?i=>گ[X_wȽqy4~q{ǩg?Kn"Wpkw|ЇW\(8t}QeO>s|?~ZjyBOW)tRWd9\䉜+f\Nxĩmȑ,;˗s+{y&߹sBjslv8i[]oNgk'at_P5cbO:Q+=|:|]<=J:vve8>viO w6] |!8ejgF./f_4|}=?;iRWd䀾ZK9E~,rVi)_9<} g~?OM N=Wn_^~uC!z|WЭ\yH/FO V]o6Ϻxt[f|sh *>Q>v) |p-بS.~"#r[ו>\}G3ߙ_&߽G{dyWҕt+]JWҕt+]JWGn\=`+m󵿚s>>;O\(#UoVҕt+-nN%~;k}_%8GMƿ۹'fk pTǓ~_JWP]<(\|qdɑk 8W^b~sESVJ@q/=/x$Bw/[q~OrsG8xu՛zSJ~Sa7|OXSy߸%UtO|{~uQJLy]'"z].ywo>#iGhߕ>c>\:|ko4Y8Zt.wO&FJ#uq;Ӕr?>l>~\Rݯ t|>}9MBWdҮ{փ)yˍѻE3z?}vU֧뺣S+]C79=t._~S))Km7+Ź\wϸ%C??ڌS;w8~nm; Woы3_/c4w'z®_1q`WbGW͓r+F_Hv#i޿i{rSߋ7Cϸg+M JW(pdvƯ}~maxv<Θ'w~?89xңЛ7#Bf+D_rM~0S̾M${pGݏ+}hqfחs<{S9w;Hnw\%Gݏ+}hq:pp9/.-|LܿWyO\88p>(r.~{'QJN9"΍Lk⚱5_~g>xʍ>&}SxH?+ rZΧ.'p \ͺ۩5,ؖS5sҧę6rMe>xLw=/~w.~pqҧu%8<'G{zr,L֟#c}uӣO+.7rUג G8kWo966NwGiί~zř's?28ΰӸm6۝$m<\ש\'wh曕>tk eG99hퟑ_vJ3VG|m]Ijgs=~\EwI|Wǭu?Á#?v>G;1u?t3Sy⟖zV.7ť)z|톚ga^XK+}i;89uG|̾lM~x:[/ܓxsQJWzA; 'wj)['~߿}߃:~YJQoswƺsporrtÞsٹ7]#L}sz|x ;+G?+]  VyG?+]8Sˍ֯⭯ЧmϢXw6i}2>t-xrpSoƹw-$[?YJ7ϗoܮ9e铿~<' n+QߜoE:g}s13[SubsVz|~]oV!ǍR<]~cdoF~s[J%Us(Tp0Px7vRsbӥ耾矍v7c+!i: s,.|Ɖ?uV'v/ߩw՛yoynJW͹=hT^#ĕt_ɽwufOދu~u[QYwg]ҧo?r? }p;;Я+|ҕ> Ipr[<ݭaSΕu'6>]uG5|v/'ߥ{ެV^Oz$pݧɧ'^sx!۹{x2]+}z 8}dׄ ']tҧ6^| ?r?uk>t>T_^߹B(SD~9]9~nK~[~\u>xq[8Ŧ{&w@*_[~'7?|?pb:W= _9I\u[|Npwwã{e=E?_?>r9xs_qXg85^{ޓlDx\OP۾WC~mVk'q?kP~r3SmK~:Z;oGK>K=;l\_7;~Kז_%|>O;]m\݋1O;sK|oڻvrs>X^ }_XפwOHH4[_W-s~ӐS/6j,{'y ~>R|^7U9KlWO_^cl#SއWW'D4? ~Z>=nt;Αg;!xq7_2qo>{x~cl&դO|ЭT7Z;xWy/Gukę;o俑oD~1>ֲQpץ"e+ rۥ~ʧt/ǃE#?=?3ܸw}9iDD[icrwPoY޶P.c?|_ޮGƕ?ǁ~6tߍn_vܭ#Er1N{_})zkW/)'hR?*{kE{~ݯi|H8ˤϸm{ҿl j=?98lbsPH=tΙ3|^rs_}LGRƺ;{[#[៝7~wy+=d|ݓo|<.֐D~gȃq{_\fއ/=T~R~~L=^O~=.*^C-WW߇q=U} "'p` #1?弜=x.yI~T}M܊V/Gj!_xur/7W$'V)p̋=V#Gu~\JWҕt'=x=?xy/簇9=~]JWҕnQ9-uwo_t+]JWҕtO ~oWUP{+N`?w;~ij'|NlŠXG\|v5~+gWL{-,>Nލ/xaq:^S>K=ו/x*TR,6-ڲ2%J(_DQ&Pc N&(AwxI #c=0PF/TظƝ)}ї%x@,k~%lf{j97pKZ psC<>g%༷ehz4rϚx':~c'?廰Ի~Mzcs/-'=@ctnlN8}Jwli5+9 u?\NSOi?v΅/.{3{u/ܓ]N}Ny N {oxYʵ>+szUȕ\e=iw\~IW8Hց1?W?Ɓ^ x_Q^_]F/]?ѸEP_$[_(ӟ??I >~~vqxc_烿 L7;ћW~[*)zu:~I?w"ѕ'^/ o~gPb=0GZaӯ]F;O3Տ̋VN.匿ʏSkSKyG_ѾA߇iO{8g֗.-ǯz]}iUYyecf_ϲ}|΍|~k>~[=TeCI_OǷǸпגjٸ=4֏um:.>y/Z6.+ԹSe^8g2^^z>$;|O'~DE~v/]ZyGus퇶Үbn|q0N.[/%Ը\nr-#K?w?^ߟ#k8u.Ԧ>?N9scϝ6>R`=׈OTяOF98S˼Aό^ž^8m3p⦲Wsr!;*<bϒ'gp0co4q<[kzR[s|8h'x 7-/n,~㜏o)|⧰w0GǙz_68m٤{O:nd@η{H8\Zgcr ed_`(1 ya|x5O^vJ{8DWQ^vmܪߗނߎÕP)}~{]NqM3G^]zW[=ڠܷ?W>s{ٿ?rzN(~ }w9[u-a[|rra='c=/>G|'r;%O)^Oz?1OFk{g|+oqwWf=GJf}`싺O"/_?#(d+W'yb7 ?ŷ^REվBr]Ը2MvsmkyXiύv^va.y}kA~xcS9$'!K;ő ~y!NF:W)Nȸ^ZV#a{ӜoV<{yu\q޳f`tn\ɧ~cξ|V3ɯ\)_CW; z$ Pnhǟ]Gh/NkyX!ʧ53)#{+l;rR9|nоa[o$a"Ow;6l}'r-O?%q KK>b|>?s7ύ1Z7"&rnaݴxqWNQc]|#}ٿ9Bo_i{)GI~jW~@u->{3?}2MݻM;;|'3W~w)\yz_^X﫴@ߦ?m3PiR<~կq]Jܐ ՟YϧGΓȇ1íxSLSnoȥz8%[}7<يI~8߾zzɩo=O'i~}ձߨ?t)|Ԏݿvg?b'C]Rvk'完NL|^n8$;E/ٵأizIǮk9YЛ<;F^~]W>5~^R(w{E~q>0} /ƯM0I_Nq c]((GG9o|6ʿr[PCOCh瑳K#?E^F)7 oE[=mWUO|{ig=]4mWϲ+7!aoKy67^!z^WnPɻQz{?5yzqό[6Tڳ?]_Wzo-:߼̫q鿳~#/L=E^ S =>Ƈ?8ہ'cm?Ϯdg'B*\Ot/rG|OzJDǑL;LZ}l3wY|/O#?7{> UoV8Z$9qd{/ysgx #Os]Riys7.oا9E_JWzW%sio9dom6B_AGiF?aO{}+]'xS}EO4rȾ^{hqgcKygp>O~{xW8 hzp8psg}߬3W9"ŏF3r|g6ϛ?8IgoGN ©#xVi|ǒoov~=ϭtwxKu:~y}dzAosc\gjNz|=ϡ7]ֿ协g5\ܗ}ަ|_7![fqq\y-Gͧ/n]/Q?{wK{K}\J?Qo0rz6r?;"4p7_ߓVO@5tώrόgeߙ}ӏ? g{£=9i^#) c;SAʳNgO.mۃz~4䒟;T.G=r G\#n5iZC_տƹ{|3Χpq}֣3wC񈽇 m9 y*ʺ3h>7[s\W[H;pyW77~[\UY?_apBM7NdhyGr뺹>v7Øї }8XI|yq+ՇgrE~7swYs\i:/-(zP[%pv@~.zÏ ;{xzzsC~'%~˫oSkܽћFJ\~ }q~k)ϟ{;_~Kkrqo-~vJ?|ֿp /tIa7Y<זao9/ot7kb{ O?(>칥<==ğOnƇ{U=z Wt*n=$ߩ!ϧ Wya|WC6~MUߕ~5K~;࿌?22kYq'r"F?=x)_zPcwaP P=e/Us>Afpb 4E]s8_{/YYړs͌Ҹп.ӿK.\]ֳ]WCk7n!?{J7иiG+<ۘK7wurgv?~G=aꅏߏnK.^?-4rF/#rM~v _8HF~wr?8K9޶zC#K7/qZg^|{{z¡xW{_DǢo^RK^~)~fGkzqéeV`zf)ǵwA#g7>YpkO_SZ~w ñojO<9ʟ4=8c0~VՁYJEZJo_M3}{?8rO87@8ƾ>{lҕ~/ޝ/ynг}vz|/EOB}΃S;ƹYη/xzrq_DMol//7+xmߡ8 ε/i8K}qӹ4ot7kOF_ٖ{nl#T@/J w=.+]' 8k76hm߻|]yVRnmҕ~oy}!oy7S/^J~Ҵזt"ͽ:}G|S'z^,kҕ~ sjZҽ=(.uoFC/9[f> cOa uvPRvBhaqN_ZV{nqv#r 7ޝk?wS=~9}9{aly 1qb/w~Zfܚ6CpT?D+]ת7pp{pÍ=X};ԧˌwX?Roݟ w>:|EyKy/n=/ߓMU^ֳެt/{ CO8G54휥qonc>q\Ekގ.8#{P{oV,b8yo УWٶ)#or.^<`qy>t_ވ Ѹ%{wz.^/oj;ݟ'2R+9Jw7,N=G:|_q }fYWZVүm8f>8w~ľYO~t_x_K=o|?=c{w? n SCY+=so<cߥ}q?_|~{~՛޿{$<*GyqPuWp ;Gτ5M߾w=n+}[/xߴ ZHm}ǩ^uShy~_4}3&uzrzξs# =A/o ~P[%ƽ\=@}q|a=l<ۼ7wݽvcS?oj߫mCN_xNHOK}9Ճcm=r-q 񴇟SϷO|~"\W;7[y1;zG-7==AB͋8.Z'7e?2nQvJ5|7/8'T?Afi[:n^-ߣcwg}|[=ԾG;[wc;4卧\G_w\}6|W﹄>;~S4{is>'V.6zͷzϏvAl{c|}[GO^ޘ/ϭ[=7ho~!/q2:v«ýF~}N|xA2q_J< L\Ӧd+;O= 7/~qw^z'w=_Ρ~D|c\ ~;~A;OKɧ_x5ƻ~W/v7UvyOc?rpi~OV=~ez^/+ 7t~>HqN^tڅGJ\3=myr\eqkګ }ܾ|Ig5qo rhW2!rJF1֧鷦qi!+_']?{eQ^\}` ?W_8n?Ә+) |]\wn?黥Orxh_=̯}{LJy˸_'7~Z1@Kʥq:^ r8|~NMs~{7qR烟H/i0?ޒ?n^;C>S)sI|y<)_sm;{Y^2;}_O܉vSv#wC8'p.}>?K z1^+i8Nƙ,7={ؿ+4N^vS8Ov_#?BxPGO{gS|o.\Ѽ]'|_1^d={4zqS:oHr?Cg&?e7> ??OS\7.iSIo>k<?/ۣ qr!G?/?G G3אCqsf%Ϸ̃z7\~}\ڏB#=*"ۏ<8WGf|ȷ=ܸ 5FciGoS{;i>sqyCN|Eϸf~ی6}?_Wߟ}Ewv{g;׷~hCe..oKJ~ŏCN7HănN43f^ԛK#/}CnWS%OЎuYW1."~}ti9}?l1׎r[?6D]6/u͌3soYlR~~٧yط|}VO5oKZ{o,W?vM{}]WC'_\u҃UuGg>'~~s{O }/^^7ҥ=/P.?4^7[s⡍g乿9.xO _p=3џ=}z`?_+]PvAvOvL+qap/}>~5h䇝xOK8pqq舃SPO<;q{'s8{[߼Ce^~G߽NLBjcO 3>\O~o;ÛN%Դ>xSKxI%|TDGHxU|kx'Rcn(aqz | p'g|Gi\X%pąN=>r|3souo_.-^:j<>{ H&opcYϋgx\fp3'\~{mC~g{/~\iu>ZVhf>Y>7xgz{Jr%O?Oo]NM>x#|[g^Uo*/-^vO1{}͔}P8y9YgvO*{3O}^vS'?y^V#Wsy^uvto'[_,娸I8N8Iß w6mj+]i~ N.8QKн仴|9>[?O_>o Ӄ]J?ډ"O>jA7U͗z!/Sm%-./;;hjy|?oSES\]=\jp{-N6`摼~c)uEO.^!A{79 7y ?{r8~Gͥ^ǐ|+׵8U8}ⴕsjӻS8,M*C.1zzO?8n_wU~z/pߟm>X_t.zC_|z_U~u5>~x}3y\x_?ֿ߻KoQ]Xŵh76~G^{?/;rkG~q>S]Q~ OvFΙ]/}gCX?'.kk~ ,yPܽeOXX_wO?y4OW+}^H/κx7 L}{o!{?Xa}d\qUu~^Qaģ<R7xC.Ng$?nXON;n˾~ǺWS'G?j 7Bcg؏cݲ#]Oֻ y a~A<&sc|wWcٯg^Uq>;2߁-z);=:;vUw~= Xs1.g]Pυ1O'|xpOWsIrU_%wg5W3s~s;Tۋcޜ稽g)m|or2␿z֝?r ; ym3~ƫ{n,h>ܼd^/yu~5HGSq@O.krWϟ{EE߆xޔ~\®\?uqއ85~vPK|+tko~_qI% _Oyf2?p 96<З)ejpSrp_uG+Nu7?rܸ_;ug[O5kƥ~Qo{K4mgFE߻;:Nqne&^y`\mm4cKtiI'u׸gUu^=OrMgrpRn3}S3!oxU4=ŷsӕ>+8cn;Z7rn}~IBIяrw~;W߁WGCQҞg"OS7Iz:k8r3N!_۸&)Kw9yf>{u'e?3<7ܼd7q աzI>g|J2&=SG{"|?wooG=8:On<(;8?J,|oBvY\!W!cgt\{(hh=|;otm6??\ΡfSk=KC2.\'u{󭳍z#,ꩱa7=;x8\78kova)ԫПZݾ }hƅރ}SOߋ_O~7ROׯOۭD?5_y^\ZG9ն09!IqqtZ^$qy/\=_?f| :sn>~믬~ߖǶig9{M`Ig3}t#.x&2yqRG.}{߰KGGCٍ3>7]a ;^ 1T#78{_f|Cţ^C#*z|Fcm<<_[~8{ITگʴsbxoD?~W)wQ|~> 9ShGrc~Sy1ׯMo;d-|Ό^&GMΒv=Oy{?F99}1ý\7sϞ|;u;5{X=SA#ڗwNqҞS/=e_>ϕ5'ӣܜvP~K~r94{W1wƅ1'zm_OI/K~E{G=H':5GC_-hdԞ~9 1|?YFc>;c ԫ-qҿ'ci/+WqۧU~ou`?_x%<'i9qP3_.ֿM>[k>`| y%Q.w=Cի>z3wܭ+WE?rog~;'a^hٲ]rph}̸V.K(I;wqe{o)g^R 'yuJyZ>ɥ!yyGyzt}j_qNS'Yz?6| ~'G|}ok|J>=޶;\xx-[O=3ɿ'kc~{87~R'x2ko!גsƫ5N?ݿ}~G[7fs ~OXڋ?½VLu4+xK_^GR>I?'2/A)3WrUgC}q<|4o>cNԺl:ۯGoq.O{cp:g~7h>rh~(-O=Y/ӣOh?kv}WطA_5Ƹx^]8*2qyn =NNv%M_?<ՇovO= O{IpkދA.zL?Rqg1Gm̋c~g~Ƨ/{GӸ#sѸ\aތq ggz3!8pR֧/.+[j:{>F2nί_S;='ZoQo%%tH[g๴&I;rnZ^e)-P| ePe{ŹcYboܷ1O3ƹ7v?>cR.6g~zӟe~/x=ܸƞlH9x(b8E^\M+N$Pg]ݲNvyvuOq$ݸzGi+&<Վ;ƿv/o܃b,<y7oGՎwrb3)NK=(>F3ůKM2Ii/[_F~7I×y->{<(/oG?Ku+u!鸣g<Orx+ŇuͳߺwU|˼w'7ûaiʩy${C/ϖXG\\#e=pnƇH7?D x?G=uN>6-o2?󽳡;ӛメdL{_f>o3^E~?ھ!Z\Ky`{)ʽlO?sKfv}g;w{m;zxi7z>sԼiƗ`?+כ=w'dO`a-()&vu/i2_ũ/v?v{w+N?gR,}K}|/8P 8 |[?۴Xc7ٛ)_|~,y?W}a#.:= <:Pߎs¿~Ó_x'CTaΜ#) `~PC`& `_7 .ώq~k&qw8|]8 (oZS]J9}fĉWj!_<[wv_*4Kq{N~ߤw=+}hOp3IC?y{oZ퇼OSƆ_z')(}nǍ8+]ע7 9eA1z8~⨯~Sg{?CWpCm/9"P\Ƚ==qNr9z6|vORm_G7xޟt^_sc{w_Wm}?OmK\dz{4Q~48/_՜3WOߩ5JN}84 ǯ>\"~I<_6S>?zuIeGG `/i~ȔVG7Ur2E/xrGI@Ňԣ\C87iT]_<?iƉ?/~J97|qޜr>{ERn'ZNwF?:29Kn.o{!7Z9iS)o\s?1xxS?dqc~7{|^ۡ[*.ćߕF4HΙw.ef=Ϟ[6\~&7ϝXhj'G|ؿ-S~](-_c)wXru?CJgɓqK>8%sg;^~ez_UTƿ~ҏ% _w{f<{ʞ{II!~b`0vO'c^ĉ#ߍk#劜9?VƯxƽLzƕ|꼼kVCn~G_rc|>e޺>f:7$R $ԗj|{˸쓏wXIqƔOד?wz%_YwR|i~΀_~W}~7_[Y_N #B.s[G)/Ǹ|r,ǵoOf3Ɖ3dIyK|'?׏R_V?V3kq^;ιo3iQ)SO5gOf\ȝ~O+>-4.lH'Sy|Z뫣~>zt$/~_iӎ{%m>aQyR8ILo؛ؿ7~Kq/yoZg{>Br.鼝]}@{3&~/]cOr_A{Wz67N;d&}ܼ2_\}'m$='88'x^cc9V{3_?a{1[-wx+~ߘLQx(awfwݜ>C9Ż N#)=i{7?O4~WCh:Î>i<D_?*WE~G">ǩܺOaG;q3a8ྊ2_}ZGr/cTE5ƽLO7S2W\%#Cݣ/?|u2ǐgx63.j^pC_Jt i4/5ib+_@FǶN*zr䊞 ՟ԛʯ>ndq[š}:O\/ypH>>M~`'2kzH&|Grbk3vi|==|O3~,ɳqOjcx#|N{>;S>rI\iz)Nn7_|yS՗|͟O:ύuwJ>[RyR?pwc~'i#)PyS~cQ'j]w?zwO2?~}/£7̗'?G(1ke6?ޔ1^4Nqio< wyF~WGy&·uTy |K]Ҹ p!9W·Oc1:x Ɯgu>-7K4/y8B~푳/qgPʤ!?^p;;Lx=Mk1_R9b]3Bo33L9OWu;?{Ʒq>7|lg~[;~|OŧW>znk}O/U9~w9~}/ {={j7O"&6~ҟƇiPM}l.3;6ng䧸:7']RO7ύk~qjNNO0agdGo{Q|G%qg^Z@g|zj6wx ?7S1iL7`o~o/塸 $_ʎySߠ3~&;~eG?wr>?/*Oƒߎs/O>އg2I}DQ܌ve3j_py. Ci纀1o닟WϖM=qk?|#/}Wϸ#z̗t]۞~q5yxGz/M_ȕu>G7OI\YW]Wt=#7c7^yh7qIG||x[:ͤ[_K?~J?3꽜<׮?1/WGs#8n~A~|ϸo1^IȷqLGpYazҘM}~Z|'wO[ʓqOa|se~)|,yӹLfKCʥ>T7ݭ#{56.>Yq6J~R֟^ۈpyIU>w޷#g~O=75~w8gsZz_1OОj|'cSg|qʱ?(s$Og֛K}i9ߔ3?{o9~J9f;~~<_M ?%〯1şW =IޭG*;[jϧ?I;b/{x8$scay~?)/0]k<̏~3'?ެᤷ~w|vGM`]c>,2A]X§v' ޷~ŸvOW7+t:q{!_ŭ'm݉Sݔޮӡe+CxM{'Suc+D>T=ҕUo>?/_${ؑSaջ?# |iY!xg|\+]'MK9d->2Zai{}oJ?.0GF=ӯKzVz-h;"oӌ[C7>C;Nk)~5~v=+(\6-^?x_D>#u7mq7C^>/[{w˶/~\\ܧ~W-i뿚roxO=m1G/_ǯڶ7s_7+t{uUnα&8VmgƗp>^Ռ8[bI4U_V9 $p0}ߴ"gO6j'Ak Uw>ߍuw^J /7F!G7*~'Џ#=8K~nK/gI?>~z}zҕޑc\^wߧoWpbMLqbOnʻ9{x"?/>JVYgУwEw7y=FuO=gK?7}w=;:{n;ԳJ?Ao}|l!F\Ogq]Fߪ_A{egt[|+]]aI;6ΣL>i97Nz$߅<ͥ_sgzw}ڮ7J{Q~!rY{O>n7ָѣx? vdnxt 9i#^~S|P\k;p,FMѣ}w䋟>3#\lҕ~^տaw/_:rS?m?zvcǛD|]J *>a9b{%!zS;[sS%_7R"jde,o/tww#iSZw6izT=7qk%LiSǣ?[m+#W\Mϻ'ӹT 9>w\+~_qp3^z2?~h%j]ͯQ>D͈ܹW/?Mdy?y7)XiC5gMdH/}q:=?+]yp5 ;m7L#.Rѿ}?y4j(|ϱ?>u<}>NǓzg;;TjGF=@ƑW7k{6W?F#s+_rj>q~E7'}Qc~'.,}n܌Ӄǟ~T;oDGW%/'ԟq73]㢎y`G_=7HѸ<+ONe-3NŸ>7ڭn{"M}x\%G/oBzvQyq'(xcƃ.;=k|?87󔃇 ;5ӣqeW~'s㢟͓C߉~俑cGlK]㼔bÓ=.Χz~Ʀ_{)~Q>J>Oߺ9o/a|?qAg9O&_;jKכ2Cz^\>e<2^ɸ4^Cz2W[|3~Hͦ\-?K/ҾivO~Rq.B2 :O/㣿5ކߞ7ݽ1-N J?߶ 5?`G'/]oة3ku_8fI?Jm GTWƫqB}m?Я8]8H{K>s㚍qLgf>x0q:iqN׌qcg>!^3qhθ6ql_&}&~4C8E_iG۳_C qAʇCq So/Y>yEq>@-?$Ow|6X?޸L#oż73;j=P_r<ϼnj/xC*@S-,l?rtakoZS <?/n.wү~zc_Id%_&{rz?=qG)~ jkC߫1~Zon㌦{9߻_ޤ=M9ߵQo9v:7w\jW9>qIG,UƵvrISzRtTO|W'ܾgk8QU/hwwj&/=ŽypPGyӕi9x?|pXr{M<=;:{1џc\O _J'̓ϴc{q '|oƵiv+%Ε;07{:)Τ]窵=L; {8ӞԸ|;a1>k'~sv>7kKvCр3΍'ÇGyOc\֞m5?eƃ4UcjK/M_N]ڱ77<Kc;q_/{/-8v`8GBO9)W},)eLL;\uȸÛ`n2PR/iǼQr =k_:>~x|[x/ָyߙǯ"[>NS$N?_y4ry9# ly[{?+ǁu0T뿍> -z(N-~"?lm+AݲғONETW[\dj}4 4}~/~wODq8)9-_֟:-Q~[_~ďջ>JWྮ~۵5[~/e`}Gvrù)~)oiq{GOsw >×]Yf3owS#I.Rp }n wv}~xlq5ї h\JT߻쳮Jv?7>h>xt{_ؗoٟޑn|z(<?Y,qoxpjVJ5c쮍;N4kChWvѿ(JW!?5n'A"xSxr\7B/ZoVz>;ėtvĿ⧑j-~rǏr_3x6n }"8-'~7i|k9Ke=8߉ _v8oa9p+xci*rx|{)էroJng;|_}$&?~_b/t\R;~ԷWy93wymnC/~~~Gό 3ag_W~3?g#K_҇#6{98#+N\ C\qs(/(/qP>O^y8)769nԯߥ%0+}8h'oEaw7Pyc}Zځ,2(W;{Kלv-ߨO<E=KS{xmoܟӛ'-`.V?i0rd\o[./ϵc}ڸw?pVs5:y"o|/j[*q}<"6NgyGvyԳ_C}Wo8ano}Yo콷ouW/EoȻ~/N8 Z~u{Z^z{wCuW/Eogfg; gvv=iܳw8_\܊XCnů@ wl]Jgzߓ{wj>ފ~w~2[&tqS3Kzc#?i:^ˣŭt.}c~"|>L/D>}R'=_+x"gVY门7rO 򈾜|C^􈿹7ҍM\%]J~zs:ޓ&ї<;s'߽{wEW}O^Iқ \J*]'ߜ#lؕkG.-?2~ROmF'~;~GCWG]x\V+F&xgkw~~ԓ|pDOIp oz{q}y{D|Õw"Fhz[JS(?2fʯ8ίw1~i㟜\^98ů8ZR|󁇙_>(8d&|qʑ3?Lʅ&3>{*3jG9']iq8Mvt.b'woz[.޸7=$~DYX> WtЭZrcymz/ߔ'R&MΥZVg?9o7+Z76t7q_?c+WCp/y$e^=׮x36I| \wŤ9}|}c9.<4w`n/_[~ww>omhw7/Lq4#$#7gt$'F#.;VNND."&Im_s8~jח^zG/ԌxrSOn}ҏ?'<\<ޠmBĵN'r /}FIb?'Nx8iq>}BocN~47;:gp. W&S;~ })_Ot[w vv=_+ =|{4yz?=}^ =.i~Ҝ/<_ÿ 6{ޑ_'h'y:/G9ws[%_;']بW>*8OG\ ?kg|Χ3zo8 z|_ RJ쉍01p2=쏵ɹv'2v%v$v'j׆_v'tgi;[am,"O^#xqw#sqg*mٟ|s咆y# {Krqj~zW[z;x,rOJ_Fo|\ޖFgyrH'Cu*~9lџ]J^ZyM}u=rpqC/E\Z_(KU=gm ד~ I݌Ǯq]ڇ>&9})}S\t[+n3 g9pmU۾gK_|}ި%-[niϹz>r;9ܪؒv%Oέ|,b3=/K}\p3i菉ÃJNZ{wjّfa`9z u?PsW>|KϰⓝI];+P}T_kzV[Z?9:Y?.~c;{/ ~?&.3\%{ =9_O%_%)|!\@ԺO:#y?<69 7'8[UAp+[Rn}į= )xo?y_^OY~=q< |76}U\h䙟?*|~G;/7ޮa{ g\v4ѣIot_$-&8NY>yI+^ oG8OrOr\7-ﯼO7'<Ԯ΄&}=w-O _#yTo!՟W~/% r}>ɇxt/ƾlw}9gڜL~8gFόq_zz/}O;8=<8TsI{a9+s߭ΏΧ{Ώ,g7z/o^,49O//9/PP^+m'Z>ܹCx ˹ߋ]kv Dޯd ȣ|WF}'O)ϿX><'χ{~foC-2[L}iO=G7?i֕Zk8韈6kC_C'+K}NW;`cxI?۴S?I0|NC?pg?vITM9;ixx9<'>Q_ߵ<=,tc9K8ZE8peR=ʧc"ō"$[00t)\K˓wˡsWw^ܛv)?r9mOC^\~cihr?|7^[)ch=W]g7j"|/{wӾ>\ڇD~>}zw}(g\z,Cҏ~oec_ZtK YΝ.En΍rzĜW97y\8j̔s_}__e3`_sQY9~>izXu^ws:<~v-W:=ӡpWό4bzb7m9CJ_@ʱo~^P83~4}_%vLZ(vg|gzaw1ώƛczR_3ZtJNO_0y/~[LQ?XT|p9Dv>8 >~)/S=I85KWH{ _ Ż≔ߠ+˿k)97cY?y"%K?-_iٸ|WC-ozy84Q%q ]~85ֹCo.x*>Oط{yd8f6^zkûe'G߲օ,G'x: Gb@ɣwxpfzo yzcoPdNm>4O #{θЛ5M̿s/ }}|qؚ>rNuvܐO\ʲ;3 Mڃ|eJ_y__G/g>!;tʐc.E.'_{>8ߞ/߸޻wߧoq6ރb;{ϧJ/S*zjv^ =ݮ&Gm~8ŤӻwMgǤgW6/E)4w=+h߲8?<;L5iKQ?p+9|_UoZ|JI8'Nz,i]Vn{~x:}'P嶸qI|Օ6~eBn!I;!76~:~<8</߫庳B 97ί.GݼqNurtw5QÍx)G]: GNm8T~NFnA9y^y+`/gal78yG F_:?L|?N?K_?=Vt+:eָOk\)ދ[hcDOU3[GjUoVz~O^5νV/B:sP܅z^Y6+i3tpqO zWt&T}!{ ݮe+$*bq{ [sl_qm&ZZ7_wxIEv|7̃y飤G6'xW~O_gP!_o>GGX>OY-"G+hƩq9]m=K~8zu(naڻ:BV/U>|'u|!|}?;6oŇCww/l#zrzQ/yb)g'=_YڎqG={CVowxϓ˕7䃿so $7x~?yRy{qLwrO=ϿxC^{(^\Z^}cƻwv+Mr'oHs7pM++n%ak< ǼYO7un򋧩|\(+?'~F;ԧǸǯڹѮ~Z'׏3J?4>/+=Bo˽hUo'%&?j4O\W>5PAi|ςDY}Gi\Hqq98f9/ؔK׮O(=?Uo>Vc'.eٯ+)'%NlCzI*j'zP^]HUܗov/}}7O_/>MK}ŵvsKG珫aGMfđ48h~O= tm<)Mlmj=^ʭI5Nl5xR^'S;9|Xo_n֒]N;nG{ژ:ĺm}]7햯x>ki!Wo]y޸'zMVN{K~3u騿~F>siQ_-#~&x/e_qP^<򳆎}Ė`^Թ}q{ _߹fSY='3CΧS9^o_7Eo5 <]23Of~?O%vOrܴv:ea'aea`Ǚ߽{<524엧㯭O;ؓ#ђ>ѿY_+;sǨcgKhiΞزʼWǓ\n%?{:Hn7>18|o)^'XޒƩco|+'R8֯n2xk׺hzү y SGٟx,?V_"u鏐|w^q+-Ѹ߭SpfFqn5?\u?|yXפ/On湸D7c~YqW?Ig?vmr~7w'sM'}rڅ?{|[qo\+|e>> y6zYZ$䆼_vw:p}9VxOW6/臨Ը$9/[ +ğÙM?ه,w5俸.I)BgŁ_uEΥ' ~X9|eq2.8G~aEzO.w9KQ;{v֓+J=ΕK7.LΎy:iY7Nj(;S)#{R;_8كrV5f&S";5yQ.vu:ݓܱGItp^tk5K>nI\~bT_x! p2 _ت72<rp|)7ŧY'ţ+l)c?GP\=#G~^;~>US~ގW{==X|ڋKyu?z0nz6? 7=J/}ϙ~ּnߘ~Ao/^.{aœ9|#r /C.~ҊKccwL~O7^w>I>_G3Iӛ;>]Eé̿YwND^!'gԟ|ML{C݃|!|y4 sy&sAzM^o?y NJ-:6<+W鞫^>aQ=ra(,rteg8C,_N}yŏ%}A9su{[O߇?sms6>+hC˱瑷I3^</Fo/+WO}T?gK.W5i?7R} ݵ|0& ?V?}7#>%H뉼ЯC8ȋekՓ#ϓKpim\Q?W/U}CsiGN.+Wh6Y<טWrƐirF}_^G{Y.uT!R~36N}Uϼ]JN{+sʁdS-k> ~^ ެGOWGs-7[ӎūevI7T3w8V{QtA;ӏ>u.-OjO9~u.|(93^z+;I_nrҡ7nR|Z{D~z׸QCotIF|}qlE8qO?E5|8ߌONM]nxgO~';_\}dS_-о7{zz)>? ZpH7+!rp>?=T>w=uR޹J8OK{ŧ7+֏⍏l :O#o\OnAg/s%g% -^xܤWIp<y]*g 7|j#{<߄7ԃYEqxwGm~i1M|Gc>v-+|%TBF"4I.x$%H)#)a_e?/YMځvAyn_<{Dy~>{0hw3Ckqqv=r=D{9}}Keδ3pc_zޞ=J>yzuUoGs r~$" 'b@{dԟ3n'ܧ̽~ⷭq;B/Ϫ=QϼGw-+z'5f'o .8I+w%Ňaq$W\q sgs8ҩ׆ᗟyh}s1y5r^{1>՟G}ry%Ivw'k?+z}e= ~6մS?$ݽ<_h61]?QI%~-#/g|㹿IcKy>4BsҮo|r: _8cR/_uvҭrXg?鉳"䈼^N_ #y^C|ykg8ݻuYZsonEᮼ?fO|YU}~l~eR W޾km7_w>|~kOK(^8}H{.;=#0eɗ;\9ۭ_șkDy+s2S/vR(\مf;ѳKK>^YEĵܻwޤÐs#:>4d4gҳvڅҾ`<rfԫ}ivFvSvH{D Zu.#?\7yzv*nI>k =ߏyzdʔDwP1?ymzFO{<>  N⟗ĉhߊLIƹx>ٸnƿq^ۇu|/܊æJyM2 çv!e|ﭔ?^;AXOoj}wvg< M}}ryw$/⸢ί8iy>n:*S\jD8R^c_i\C߷xS%Ϭ7o oki3!ѯ)773.qq[_[ <i#?~noN[K>ç}֋=C,cGGȇw,M}tsINK~\_X3O='|}q{w<Hg<;}7'o]7i3pbҐ/~c_O9s}YOq<Q~ƫ}<LJn./ޔROݹ 7'_ދֿM٩3$8]N݌= ^`?|p:敽|Y[49?V~O}^Ϙr>K^_ӛ/8Q>ٝ~oc ~Opo::#~̋WxCYٻٯy巅#?O֛y/ꫝ\{K{o҇=*8joc>^{lތޗV~:/敼ϩ7#yu)?}3l\dkWqS}o)_U?x[/vˌq \uiSSR?iܵﻋvQߧڹ{jcKq.<7}~l9?pwV:Gr_8?p3g ~:0c8}i4(|$Nsĸ}=앎y<;y;4(X̛y`/)_~.YNeay6;I扤m|  >;YUƛ{\ߤ]Nٝ؏o/~̃&O)w@}_P<ȯS.7}l9?kq8ޟG~Vf4.p}8vWRnxmciN ryc~uGU̳y?6y[O3.Ce*{XZo=qZ_?eОu9TN n?,nRkc47,W^ć{h}L?|nRzR{T޼gG_]q>G?80ZD~*pޏޟÏ["~0}n =>_$7 '^y{~>|?vcKsh|7G/9'?~)t7=ʺqR羯r>޻W|k(g>}XI(g]/rO֏megCSG幾ÛG~986w=S~4[z{$I;2]o<L_?ï4O3Y_z=_Z|E7GDn}o< ̨/G®x{X׿;=t/)G^x?\Źzh_$i5] Qr/rpYizny)4;/ύvO= A>{7R܇{_^ʐyW[p)ꁓᷓ{#yҾy|1sZ}Ig8=ѸiIuyl?{.9 ~|K~ _iӝ_G^S/V_N<~]~go_m{^6>WyΎƏ7~ҽR>౔s9~7&7q ޓ|U\ 98?QnNkN~u\M3.ϓz؃gkoMKkOcܓfGR_A{0t%$S.|WkNe.\\/8q};?Ŀ~.>|ӻ<~djO(~x;[o?>sr~rU\P[3<מu y'_BșzWz/ߋSϻ#?;3WGH;⿨~?%.Co\I*5~K13Ϙ^C_Qch?^t_SW86ig⇇(~osc*_9n޽ۿ1?4}37zMo&/oܸk/~Y<}mkG#yE{IޚzNo'ߐW!_2+ton;CSJ7'G_8Nrvԃ#P>$l&M}ܤuzo>2n=yNø'8弄g<@9%}_:'qtF}+g5N}ߛ(`яwy{e'?~'jgP/v.r®8o,{}t;>S'?>fܼ?!)Nr>J= kR/;2y5_ѳ=cktrc;KScm|{(^sy.?1ƕ)=K2OCq~M'M?cy|}₼?nף>zVp~n ?ޝx?{;sڷ-=~Y\$t~]MڹsSp3vP[h9S~O-+]N~ȹfDCy~wNL{\ylϟ+C_VYCv3ki{winl~gv+o=d_oo{61Fq,]n|\7׸?q:~g/3n[cv=N+]Bo2H"E'rCX~O9z{w}}JWS**gUj㽡įկf b_Vzl+Ros={s-|2* ɞ/, vOyw*75 [<ԯ]JWz~7(;&ez>>sȿF~H+]WI;k<@ȵ8دR{w+W5gp2mw0 >K=m'Y.5^ןߧt.{u\Degƕ_.'>>|+N-c; Φ~?xGw_CN|Oz~}eH7luݥgV8oSz|?C_}<~Rts~g)-<4G@_N4>uq&{S~@ܤ;_='sXGȞ}G3U6g7SW YIhq #x/qC7==ʻ{Ow_\g|3巃/@%~{㪠76Z|wϞ 8I_LԯS𯝑O'g˼8V=yheޘ ZZOiDҵtxlɗz^Wfiq8;gq<tz4~Q[#ۖrCo*~ϧ18_q\^<_n_[IKEOrϺ|{N:4Ny]。{rmƕn|o9.3^Wz =bbT]~˾g>/]Ħ^|/=/{|l+;Mݧ-mҿng_>L|NP߽z/>7,iTyKᡯ?y9_PO9\Ngŧ{/1GoZ?c[X3 {d H豔g?>q>zðxEɽ~>vIssO~Wyg7~;aWg ^'zQKa/ţROÂˁ)nM|'=~gvcOwK=.'̸r3.fqD?y__GLP})jG-[i跙'|o56>p~C]i|wKo9?m~ _c??LW/73wKlN='vVkj[{bw;~w >33͙ǝ5B承(~w^~\r59zniM>qK=F9ʞׯOq78<GyrO\4O9H=nnqIԣ\h45e5L;(7}zxnύsܵ\t3L2E _*2_N~q$o/g >5#3%;!]?kWF;o-9h14~O?9aQq/z8GDi.կ>ƛzRpA% Eof<Ǯ^[7rk_8;#x^#xJw׆~K5ouӯ1HKyuo/zj޵\tNzƕ/,y>ϖyq5zS%c_RmOOg5^zi{78UiGqh~VM CO.hׯvܦ{?_s6^Iwpbܳ$ɟ1'~wz{^'sKMy>ci%ךr/Wnu>O͓_w-:=qB3=}w8̋sX=:A>5Nj3!3s95lS^N&e/jWf؅W+;i]8%Z~|E|sqxGǼƎ^;6g/;fϏL=;CSx =3?EM_ZP= 4/܇?x GuW{Kv-:5/Y7ϊg癏2a#?;Fgi~0}{ɏ|A}sOO}F~=Qrݭ~w8_~#8Yzv<;EGH}pKGiF^Oy?~?FS+FߋKlzP?#~ z#8D+M;|ƺ1piC'oO3[E~Sy>#;'{]_}|7iӟ蓣GI{%~zjGRxv=+bI;ov^/|  癤3q3G~g^ACùQh/߹7}yMϮ0GE."{ \r$?^4C-;uԫ=G~z^B[_Pv8uxy__Gk^=ýsr9gzF==8$_q k¡4POiz6ꇏ<2諃~JRUoZ9#wF>GSԿ<կ |g{_WwyG~(=YN8GP=']J\9}s?Vcwh~rG>S~ \шgg/g>I~F~XEscw>U2ƻ8O~/ަ  !toYpk_::'_\AA9>v_836ώCou]J?\<o,{- 9ȉE7_1%m= !:joUc 8,7@Źwv'kv_%a~-+rU- ;En/_=>?OlxF׷ؔG}KCև]Jnz/ӈSMo}0pj8jklyѬ;M'JWuPk#ߍ oo7nS7m7\{}Q{w<~8_8=7'A=3C]JWzGɭ{rp1gBEwηI&8 :, uuwVҝ ;\{{m/M~~ر__]SOEяڣRu{n^(sS.cH>x%S5i4~{*?ήk+76Eq=o|\`|+?yEOow}cY߮k+7F#oуaA*܍%=VOGw=^+]9w}Ս3}ߛxӫ{痣/U>ѯ]JWzGo<*}Û'wzUѿwys8q@C/;v~ܷ揍nT>M8M[}De{ͱx_;]g҇V;_S]ܶB\X> R/c{p2PGb{?%r\Ieٗ[{O<~Qhz/cGѯ5J ȟh+WPI{>Ϧ^*ϣ_2-K9|x32~^~_]JzڸaS<<ɋmj},iq7_x'M= \Oy<| ?#~~}ҕޏq<ۻ'>[ד~7(p~^J˫}iG~zaտ'WYO}S{w|w!9JZso8{97GMnawڻفO{vYJWz?AA

m "7"p?<^ ]EJWgs g?ג{-.X>m-~ 5~;\&\]z~]J9woNthFoS ~n]JޝQqo? ܈g7nV A ~v8[@#K Nݧs8[kl\cf\d'<QGo[ݔo\WO;ǖ8qgL#v(nm6>;ש_wG8q -'zn7>s@.9:,W[9xUXʛxv0ɷRyjc<;EN~峭/+~mܒ [/3Ƈ~T&i@J֑Iw?A?"Hk} 䆪rH|'ܸczD߭CxggΟ{/xwo#8x|cr*O# rs$z0x/ׅ<?$%w~K_-}sPc㙿7gr7Wrm\K.LO9-~+u|9={wwO8GViy~ w_a淪rueɣ՞qO&!m=^?s8>5=7i{/}7>7{&TsK>>u쨇oJ~wEK1ɿ3~ 2|=G~"{z=b=4c{v gvW:W#WƛלF+Gǒ>1}M;^N?~Ȼ 77.$/s/?;|ݹ.aMK~ $_J_\ꇻyv__[oKy~d.7Mroܴ+~F>~Ҕ/hv5|yW~ei.ıyzK':5)3'ލL}Ʋ[|qI;$[z=?׿W?)+/*>ԟz=gGg'35_ ~6m2ƹ=s|h83ßߎ{(~c3ntysK=5~_P~n>./;|ߤ7y^E,WQ\=LWǸi1~`{qR|/M|S/ɟzLԣTzw䫿)_o=#b|qn{c>*Χ~6ί|<\'#)-<w}!e} >?wϺ\ȩwiYߡy0>`_#a냒C5<-ٟC8ϾT8(_9Szj?f<&g?'5iG4ˡyn_]|)g|Gӎu?彷CiuaS?jO.;5]įS77r)82o|W?ݧ</{ {#߹=iwyܟKrqﴞ%}>Z9 3~O9ww<ǧsMw>;S3B{zn!ʯh/|_Z:IOeg)?GyNOKn).?X>7_=|6z~|{:X~:Xc^{K83.C?;xbCpzn}QZ8d?\<|Z.7r=popO e7#7=|/Zo8gyq1ԣε}s~.P:w>?Bz7[z.ҿBoݴko?lGE6rŧ-%k48mggo(>mٟ]Jo tq@{*]|Ur NqIhR~zwD/IזzWz-lVonIoq{%rX\eOJOmꯜ8w{?8ѶtcoJy;s-xHzO}{wByaN3qL[+3}~a|Ͻ}+Rx*zT_a)`G\>vvϽkLz/;>@iwG*soK=dP@G:gZ?c+݌7p9W3Y?__'>X<կ?|>[z4ўv+/OI8{>z Dk?o(zžF/ܷ ȱT,.)e(NHA{~ .l9}OK}PK`qƿvr}Ro|\|lX2o9y=Q\FʽI^~sxc_OvnB-~?Ͽ~|\~*^l^;ԛ~FGvm?rB>?F3=T.{K?u~=Oo8B)zkzoʽ V>{s_xO=oEa%9O^˦]~lD8ˋ^~0~lǪJ,-|]J+'ΫLӜ]}Qg3]NpOLyh~^^)zq|heϧ7yr~yjw-/ݍ%-dG~=W#bsdW9%+z~䜸q+BgKo]5_9n3?{8 8}JJ]x&r`NxTt/!;; {(4|,w\ /[? D/܏zO9v/j|<8 ϱ:⃉?5n']\jnh9[N/. _B^ݘO~~v oxd~j#7K\B ,ʼnyx|vPMOqrpuyn|??ůqߚs)nn_8yoK}V9틇xC>or{h9Qc}'N̋}y.~%<'י^!^z{"NqguMnjR}%o2}&>c?] e~zOumq[Iz?}o;3KZ~٬ X}sd#|(o0<ّ=+.^\C|X|O-WzrrU>Zz~o姇Ni80Əi.~BuiWp+wx%_W;i<+Tu*e?Ѳ87/ȹUvoxc_W?7ڡRǸ(gqnarC~i`yK?zߓ%MɓuByw5ODѣϬ7?C7.wqe/#OWƯ+rC_Ç~4c6Mzm>-R}B?( ~__q칷_kI<_'fiЖ3oC8\y#/cG9~oW;@~D>^5?O՛L?[.+qR^;~P;^ṸepU~gg_{+C=zW㩅/eiwKsMT>4^ah^1A>Xy?7~p(S/팧v×vũ_)|[m}n??Kc+_YIʩߏ+NgrG9rZI>f\J=䇏Ooᆾ3?}l|ţ<|G|8+]<[ƣg.P^C=70n.F]qFGyLWo0~?q߶we>TCrGȭt_?R㯿>ixqn"p^[W?[Gyr]w,~:>ŸX1ʡO#}tm<|rG߿0>->~S[t{)G}9C=}ۿ!-wg\O;WpbWS^Sߌ88//9tⱮ9֏^ggS _k[/81)Gj|F;\1Ӓ>ͼԯox~۸׹7ù񩤝//ty}\8?W )oٳ<>;;O'O~'{b;({y`a_Q/\q6Ov;|}hGG/gvڑܜ|xs>iw3S|fS78a'n}~%8x~m{"4h>1wG95ph("1n&-u=to̯'.?MvDϟ匃c<ԛ6?gd\i78x[?͉'__?H_kcGafVG_8xԟG̗_|98[fEo<^.^n*zH_F2yOjcRס-⺂'Ə.e>kk@gދ7ߍg/29rc|Zox}ўy!orm\e>\50=6x*q"5ȳώ3Ty"7wCKG'17b}E׵u3ېK7ߥnA{>K>ۏyY{KO_r|kG:d~[~Gz#G~__e\O-`u~_8O%ߟ}c9NOŸүz4Ň }➓s[=/?>vo3Kӟ]{*i#Ӟz ol=߽pqAw7 t~D\=7h8w!/9T;h^  .5z0SoмÅ%AϫɽsCp·{8.yۅ>?~/<\y#x~C~w1#;4R|Mӹ~o.t ΛzY:87ghwֽg=.r߹Npcs~>_$irx`81ɧ;[2&{>H|Ɓ_ گvB+yIkwi% />Xz2>/LƗ=^}Y]JqΌ|OZ~Rgw >̯~;7W?Kiچøgi[?۱O8Y|~%_qJO/&r?oqKLWiɑyU^}PySŏ7>o|ō||us\[|HzmgO$5,Q^zC^:7[Їʁ3~i\:u`I15}y2lb<";7f;nGF?g o3zW~?)q}?m=g=]ˣ|NԛCO}q>VOpy@O7% {q^̸U9'~s/O3qtn>l~wP)s;9SI;Ӟ޻Ly@~7^΅z6|ޣ</#=||v|Z?C«۰;?Fw7O@\vu{:xAJ>S]hGΏ8_?7֏g{nÞ]='</8S{:vG3R{+en2EYoᦞe,;+_2ޤ'\|s~Qd/]7OvČwqՒ~zN/V|#Qv;u~ޞ~WnC*g8Ͳ_KK2pN#'`5/ =>MS{=|"y׿o#?Gw77w?߾?y!n+}5ؿۣK_o>lJ?i& M=/?_7w/Ww.wn~5l{ ͔O?OM?|҇^\~|._o6zO;ovɘziGϓ)M_~Xvw=ݚ#22/糎\g)h\y)->r?>^hA> Nye ; ^{9r_mޯMP~Y^*AG5?_#t}Wyfɯr,̐k$?U vGt_YC4=,vb}vfQs&lZ_>dou}J+XWnf=Z~rRzv{7y)uTU(p#룯(偃(m?/; 9iO W?88=•oǾZVD/p ȏ{s_~5_ϕEUOopHvĎ~Q։GR;7/{&=|5D{b]IqCpKa.ϯBTL&}|Qo3y<v_ !Wf5.QVV˩ >cay>)84ꟹo1nx1DR9Ƨg^](a<|DN傋`\_SgGs<_GXZjQrMݓCB": |+>uJ#sC;zi ݂hz>c?ѿߴ8Lϋc?.; ;өG`WχTUZW\3njf֗:0I{Γ.Na6"ӳvpG[0^3q 4&L/s!mG^0?L|ssH}Lc8g8a5";~!h7v K|~Olodu-K^o˺&hf̓gε33,C~bתϖ]GbF?aU87|psAe@o-P uթFA.%}q{M벗-SvzbGrRoM+F7l0r;!ؿ9mGa?x_Ǝf3>MO\8[៎vcsh7C9J9ϡ'ޭv8ۍU}$BN7]q<πfzt4o__w}^ _,h_{RQ/5o;9aK5cS5v>ή'x=y&ϜjGޜ(w[n3ش3`7įsK7`W#p)_ǁzNzNьkτx_~;g8⧅~'9;S/ϭWv2/;%x5?|tOm1_;$8JGq>]>0;9juzDsvPǫ襔}o*[ceJ=_wgp_RY2r 9qh~b9GA4O/G=??k'N28aY1*\Βv>Tߩrszz qºey~'q}ϛa}ʱ?W>wLN>/rOTOcWfݜϭDwo)8_~=Y'؟,.Ǽ7p-zϡCO>gU_{{r5X;ʵꉽ8u!Q7_`!=TXS_{ه[Y_Nj8aޏy:G8eQ}!'=_za/{ys0.&9|8a~C]rw'b9zɸWXcc}Fo?ٷAb?>c'V?OL77bZUoI>I:\9q{wDɗ`wŀAǾjKjvi^ʾ&ezþT?u[Wo)'ŏ;%'Wz޻VFqk?-}>=!ywoSwk=wC5o\Jz^!mӮbӣЎ=R;eD\ep)8k$oqGQpn3F؏z; Gj!m"U%Ճ߭*rRz0q؆u=$J|yvD1]c?݆~vz^NSnS8bOW}?ڇ'sJT/wD;;߁c=~쳤{_>~\w]?z8jBqo2~9_~w}Sr}} $*$kCR9ScyR#> Ue9&o-|>]|K/w=Uzg#6d\o'㛵>!gWFn}\h}K{xWL'V_ep^<4niWsәfJ>(tUGpϥ{ͧR{ H9$<$݀zn0mӒ|~3QٛS _ǾBG?a|;q%:z hzs#/}/Վ~Շ|}o_8o8['/_s8uR3vߐӹbP9j{,GnF h~e~dދsvKD۽iqTq4kfDS\^[œ^}}Spn!{+ke9'\CDS757nUZ˩,˂10]'bww cLb?#v\}f7|Dmxp TkJ~"j|z &4ػ?|}48-/!ȴ3/q1cod9ig?~{{->xɌe4՛:MRg︦jO Ƒ8#z>qXj>絰?{W?qNCWގvR?V}>|U/GO_OChw?{p^ {"드QO~.;>-:#,Lfz^%^_8W9oC㏴_:ި <*qw];nh9KIqbO!/j`a]bߠ?bOczc~D稾8{By>Dž={^z]:>scs2wć^~?>bT;ao3/~H8Fzw׃z__8gT V;g?.~R||U~l_y/<u~Ȼg?Z>פd~wWW%'cADE}qm>Ӿr8WežE$7řsWΣ#~? "%Jmgb|G9|yi_G;g"94 &e~[ v^3-m$uqw)MCn/zuKrKL [s7w}q(i+=5;v b:~|B=J96_lVZcN:.-pg5R;u״ĉ3J+ؗ&֖7v}z_:Od9>?*9b=!󋏍KDt_J%K?} Gc W)j>V;|l؈X(mNڼX,l_;/ib/ϟ=~ts*ًRjmG%byL3=3к,<ِ߁I<@qsC|QE]{4L/#{MK禰3 Gx睯<;tHeG~3Cg_Oس8(4ϒ`oeL{Og8Ξ8[} ?$~y=s\znkQoaޫkWQoz܃MSx'Opq9>n[9[fμ}XSa?G9|/-'߈(v`:&>KO1*vhё,#՗8L+̣`ϖs #C~w&]c7|Ӽ1 %Γm >?'{gㄋ,9y(͋b:3yM7xj0oޚ+| ~A@;qU?o.;q^2w^]݂?s[ïYጙ'Xs/˾_.twu^wq{ fW/\Kga9AګvKb1&;N /GwȥBt>rާ_ǘεځ> =ˍoz H}py=AT oɜc5 ;xa}gUyݖӍN>ϑoPj'91Υq^xv$E9sO>w%ڧrKFG}w(z٨Qj-@n'X_*ay XO`e_}yce^Q}S[GN;j?z"O.~#^y`Cr|n}u{P^:^8/.'nyL`@_.vp}1zo}NGG.e\M{UO! kc~O6Liž|]|2A|*)#qOuɼhަ=wk)Wˍk\sAc29F}qkg[& Y}zw}7LsB_n9(S{$|v/S#7rO?F4~yk?7ۡ%_o%g<φ8uKO M<2ثy9q2ώy> ϶'osp\O=-ӧ g δe҇l-o]YatfzNr|yɓD){I{>׍? |ގp^oooYIrޙOC/J؍刎io nqe"/6vn |cگ9'|knqqwSA5~rTq3r=ھ Ξ,[lG { ~]wu59dD<_6".;OnNLnOnFjuh}ЩRxr580;ҧxVq=?b_%9~+iϱzjN|pw`%'yF~>yPwplT6u񎰏;r~g+vfp^|=3'?v^ak$_< >Q}si//]I>Un6?m5s_cΏxf'?8!g$΍y >7K GL_9Y]fxNq^y;sQ_c^K[>vHbg{~ov_1wG6e^O gw*%1?5s> Ď{eu)J\='iݔsw( %.+*s؅'wqL<Ae8#".vg1"}synG5?Imgd~a\_ڍޫrX籯/ysA | 9t|'Ȍ `Ge=n%%WKqDnV=>w8?4)rhAď:ǼM|\_Oߎv8&>SboಱׇE#bg+d?~a X_XokCzyuzruAb98o߉C̸1_G}XQ癷wzrh7~p+K3y!"?G&OPxr'_H^H>WK^:! S1^1v7u4eV`;Y!/A?tR9..9Y/ʞ9ǻ5t?G/u{)Ukc558>㼏qk>]M/}8|Zҟ՟:So\9Ωo!~!Z *QAC|ynS1.P-ҟ皌#{>%;nj_T{Oܮv_EՋj㢮pހ? Ct{^4ۑkegJn}. ~ҸG񁰛i xoN|0ri?9;|.L;n|S<|x~UyȭK΍!Cv >z|| WqJ}nUu/38~CWC۰S_9YOأ~C3);y%g/CQؓ/9Ǚe^ ~}$TO7,;%v'G7}x's=IA;{;q9f_Uļ}(v2اi]ߣe|j@_@'xg\'a.Lu|:ⵢ;/0pdoIOw\ ~Oj%~/oS|w+cu<q"%'I蓩>*!qJ~QfCG_;!nA^Λk>a~bDen9\ wG`>;۱_ßέyw(Yg#6هU\ >ױyy^q$fuJaSb]ˎv,acR=Ogu֟R]ľ%AOUܨ׬9gyR~:ǷzcO\xWs$W5O\#9#九徰"㚉X׉Å |{5K@o``U}o'?Slognb_}Jl7 5 ~*ab;wUw:zɾgG~}]Qno//GO/cćȭeK*7W$vS|+8v;7%rIoW߄ {vi3^yET/4fO|JvY#j_rQ?&!!r^ _Gh1Nrn~Oߟ^oKMY lφ^t^M#9}~ck<8[\AyD/dXL=;7,礭LצڟY߉t(埋V/ ;CKx>"}{uu4&} Lm J*xP׶d13hht !>h=;#DZcdIS_II㰃~/o\ۣYX.yBŞVIi|*}w2i_;l) 4T:Ee7>I80KqnT8/aG^<9Glpp.twG21yo,.*|B>+9[g_71oֶgzyS7-OsNs<<ϵ1w\;9y^"p^/8<$yJUzbsc3Nyu_G||k>y(Dk~T~OS9ϔ '=ĭ" ¾yjBg7/!}>ypηyqʳDv-}Y/ &<.P{)~o~h =Msn>i g<ɞoCs8VƳ C~+%]|/.Q>K ϟwN/Bl_E~E}>=w\?%g3P/O'L௤m"~Ǯ~k2~S20ع8_?s40oyx1; _!?ngoGXg~T=K? O٩jwޣ߉ԧ爇&{D%aO|o{T7C}GcZoD\c缟%n1}\/_>83r#nj9,y'5Χ&;'q8<|/=/3nfrۨ/s*`r^B\ϙWϴy +9N{>'ϜWg;ȯ睏 <3&۲Z[ *ǐ'} }'Υf=ß{͇_/ |zo#1xL3qp;1dO+5xW;G97}v\gww?}OĺL30A7 \ vnyq_19YPN@qiO"}zܷ{> vX߱gqC7M_2sb"~ vp:csPvw;79c/wj5xa`GO!7n`w֣nG)Gwy;sd>Ic^ecN, n?vU=?X O}4y}?۟rN~<yDz.k%NYgLN>༶B=ț5b^OKq ?哇t2ثCȒ_>+S?`O!|3)%y뉷}|4v*3<h\O<H'ei bNɭ ao&/#s$v_ٟ~ ;:_P]b¦ĵcydz we~}u,]y?b؞ށ7wԋn7oT4k?ٮA#OcSy) vA?;^f%?/kK'Ő;:w92VR.F4g q^V{2Xc9q^ѻpN 35GsO*[?!>xKK/n(ym;KZoOw{_Eyګz:?yxN̨=Npj?lpK/r}quqO יiU\+Ɍo sy=$<ؓ۸ޏ >߫q}:T8? ·~tR`}1%f]㡵`|8y~v]ʯU>qEE.Ծs׺N:Y#MCJ:: )p ع_3T΃|~&88Dx3'w⬿#>OKn٧ 24OmA%]敝}ثy㐞߫yx۵^hٝq^~#>쫵a}S i@|/^~GS m"; @gBC7_}3?&vxN!Āş)ܤ wS#'f6z}:jo? ڭDž}xN'UPޯa8p!8W5>[#?*-L+;$xsh"y>pUbΙyKp_Ԉ yя8/zv/p/] ^3ӍI_u~w#:qaW-{ PxK;%y\DDZ{֟HRx9k\c}[qKߥ=ç"IxN=mNndZgkܛl>Pp~ZϬBnufzArCy<.,8(9qߦ8_QO4@7 D։o;@iX2OX|7䯪<@Ik݊QZW]CHp2Yb.5uO]=y9I 瀝BÄ<(qO>8t qKk i?y<ؗd{ZW߸-}2u'o1NSgr笠 'UV,j4 NF'"UćnNqR_ʟy<}ϒ~%]C[:v7W&t 8x5vʷ?L/"[_elG<'N6z,y<:~S us'x:zmy `s;t|}cGF\+^>swbѧ'X K| 8s% ~ڸEj jc>yt>yzZfzI}}OpWw%xʭ|>z= ]>g.S\5 heywUeBW_r<,$ʐ;.~~Me88_t8fzN|GؗcjE]4e_2|NPWj[_U7ُ}%ߧ\=ԧ/3qO6N8 9Y?.sn*;zj_"v ZHq, cpq*r3ʅ{:|}=һs;9:לikyj߁_*'85̣.Oǿo_; :471PߛZP 'r8+s;O{\~(xe??>[xձ3M:-w/}_<>C:ۛm8 )qk'L-a7ҏ"wȥ!≐x:8'9,Wn]Z ry) yI'gHy}xH3덙n <6Ny8gރϹSYwZ)~w8997>~% 'NVu뽣y_֡5罝w+SZ` vZO8qI6/YK2k'\x;3xƧ;\<}b~ш,_ Ws}?QWoph;\9Z;sUw`Z.r!= ƫnZL3݈yjhh ~75 cΫj9q $sW%ΔSkPux=Eھ?z'|%mG|wE~5"֧Ep8 |?wOB;ίlP> ~T˒w~&rUnvL/smʼ'\w<p3u\~z&y8'@|s 7^~{mqtW8:Cez&UW55CA?ss}8rOKrE_w.罈H*Ƈw'J!1 c7.8}G~Na>#,"i|WI=O_#8I}K|6sO?X2R#Xhy?h_SJ|)͸xrȣ}옌#$Nq ;^Ysu'OaF_DF>ԎIxп#.TySdP=G\yrK;͞'g9K ĉ>4}nQyPAy1E4^WWcSWз@pAWydz=3ӭKG:.~ҏ: ZK._R%}|zGp4!{Ǝēy3) L3=y;v+cb 9Qe?qeN]*ǼAe;ڋ~lO鏻q4L$}sQ융QW>Dߥ{o /w7߱zW.J^"#CWh~N|$ȇ@\pڃ]/yo_cp:TװƉ`?}'4(Vs8opTU?9$c;> 5\S>h?RyNT]:(y@~T.]碈sˉド_}j^T/Ǽy7\I6gyY#!rJ4;Α|8N!Wz~Ft<xϳtkRf~?yۿsmdwW)vc[dX.s|qd\8].J>h%후,S\A*xQRncģNG0ſ;Flfȏin;|4 4y?|JDCe=v@ b|.8> .<|êm1 ^2Q#4L,8>k~x n߉}'v7ރb !0GhN3v@ =O3/F'<:qXȋ^{r~~q|%Z7Dow'S/܋{R ?N=w\L.>,qrr\@ n}̿/hܛgb?ߒ:Ϝs3B_yyWfx\7nj;*y)g}7!BS'p_';_1/>s>v>㚟n>r{Aǝ8)ac{fi?<ξ4){a p3xSq{|8< j~pc8уc%v~~ه=vޡG$O1ox!Y4~ seD'04J_ 4Oy&zqRקq#Z_G$.x Cn~5pc*\uTް~'(rq >8TǓBxx0#_Q? /ߥџ?/}%v#o8o:6/L3}ZoBOrY7";qUg~ גWbπOz5hIg^zު'|'܂r̎+I;_À]/;'%~ψ~Si X3]$48.Z_1Oy|^W 3 -b1Eg/_f #G4^ğD>onƓ>7 fQ)r9J;Ro'V9ǔ|x9asb''}~yF뚧<@Q{1NgS/~9~@w_sB u;UfMC98缎`SYmľxIRWy~<08OV p;+o8.r } {!n8X#״y\y38߱^POWg?=cj?oԟvw6;o^]W9]HV'/i<?AwYA{z{1;MgC;|싰/~~qΏ]bg?sT_KidzyRǷt^YCM.o.AN,y8|u7:({3T놞woy8?9vB''0.ٟ;OJ'#sٶO?}=3;o xĝ7nV?y@|!Mb~O!:Iη m,2#)k|D~ЋЯxD)qR;y<(8䷂L]4-=O9%U{ {"F%e>ߋ <:Swq}~51o|6T4ؗxf]wy*9%yA^C퐜}٧WE&ַj?sT]Yk[Oo߯W9UZwA\#T#O^~xKʧ)%~ ?_29J^ǴƯxL|^䢌RۮDc)k*4@Ε`wþ{+,ߐ籜{~g;vHutCąpM] c*|;0.l6اcƿs\ءczi+=T=+Mhbc?y[_a? ?{1mSIů_|>mh\ ~]?3kj:y2,Lj=""o0ven7 {ox)=vK>~'lo2KO8'ߎ >'n:q9 n΍%6^\[> 8rZho,ozs:WP '"vL.Ha/xh<ׯaX1W1hnF5+zPi֑=ZOG_ֻDOn/L34L3tҢ_zvo+݂sw~w3z\qo4ӧ$;N3}w!;!ۆ%G-{ٯU9vn]Z\Wk W.nWvoՊwHv5=}Z 5n|@_N3G]@74L34L34L34L34L3Η|HxN/#RE͖蕿24L3h^o2:ؗ_.GaA[p8K[TbWWOdV1GuqE9k94ӭH+Z|v Y8'e<ď&#q$Gc$r9,7^qk)}qykz!uHltSyz!m}-y9d@[9x6.?a_#7HOӗ@eui1Nّύ qҴ7Ϥ#osL>%$HNطA/\햽دf_Cgi1( ڰ(7# ?πJn+L/E_ 5e_v\[;?L.u4?qDChk"{n/L/vak9 \'rE;;Q]yW3r@Zq ntd8(Q]2ݺg >6U_l'n/L/wSJ~KNk+wӣ|rL.-k} ~ yHZyqJY~}+-2 J$G0 ~ +< FRifz9S_JŽF\ďs|qld5#4L34L34L/--|͠#oϘ9< v|n-ӭK7_1"qu="mS΁p$tS<ƺ#M8Ò} 穏J~g|Z[C *MGbL3$܀[ƧezP= qlba~s9n+L/܀$:;rZwg;&ӭK7ň~Fsr.O~έ4Ӌ"7=x=Z7Inݍ{j?__'yۣrftS絙]y+DEOj]Թ:6&O(qmnW^Tq&-;/ ӈ(6#N^e@ǦiHρ@\ -Hc}a iú>i| 2ˀ֍QQ+;N0q<8nW^yc9k!?@sK~6Fs?OtP7rWkYsZP_!^mr֧:'}=!O Ğp;Qn8O>~hǥ+)=in~Z[.,A޵~?*٧88& > 9ODeVֿ˰?$F>(_L>-F9VkcZ& ts8L>kd}髵a3<fiVy8XoFsƾf֗p8`wv6:-ҏebb9e?.>x?׸ԋ5

W5.חƳ!}`VSW9ƫ!뷨9|.h,gA2r_楇IoHoiҾTқ/}rhosb;~Q}yqgԿ _q,<$ 9cԯ@QNCgzyr#>KdmS%z)/ES>ڣzC?j^4?k:~c9N3ԅhٗ'{1SƝxV ΋iOu>^3'0#b*yg='ޛ-ӍEy | zg?'}Nr2#pA y\UXo,Ќַy/uz^zc׺0)JyZu 0W^ y_{tsRj^7o/7!qK }ס0U.G/Ek,ߴhc=wTt_Ⱦѩۋ N/נM KXO=cJw蟚Ss+= UF}'ZEmTS=Dz wGUXZ,bODޱ7ֹ>κM?~r>$ }|| 쮪z m݂ }M14XIe_vߩޟV?3oGYT;$ (rA{mO`} [;|D?ĿIpvl|}!~$ƅ]6a3XGesR=}yco2>P؍)>}iN]_NӤd^ߝ~6|t^YH;֫^d~絆x&M,f٧$O3lgcޣ+qfso͗^\j{,NI/w,اnQQKXg)J.̰>jBH: vh[nf74.J>4b]QO-OX׶7nw24z?omF{A G P>`ΰ~}7Uȟ֝ELw_.\Z|s Kǔ:uz0~P7d5ge}`N+皧_73'{c`?DBOG=&.P??zL].z?D;z;hr7QOɋ>w#5  8M킷f{v?v>>y|m=7[j^K~Wyohza{4`_y~P ߤQے%C <߳O>zbyW??g/YS)ӧmT72~WXO&|%1^kA3Kة9?ž4([|<\N,9`==^>v ؛7@kvLC/w_q  3's,u%۠?Oz~MQjiC qy~X'җYwi~HuRmQa yѺ݌ky $| vN)X׺bzX12?/ ]{G¯ub1̻X7bXY?}篰GOיqyW~V yF~5q͗nuuǎ07v|8=dj{wW:'|py\CnF{^V-?O'7yc_` Ngh*K|bv@ +_ʓ7cϥ_R؎H p'Y =iZώqg}ʇsQnF͗3gד4Nf{2 hZ|T| 42΀sAɭ$5`r{>!}~֏xʝDސGK~}ky^}cQ{=sL7&p)'Oߨn1u  q+~U}6):J>Cj|Ї z焮sۏe9qg>ƺyy\zϽr#wXcws>a:8u׸o+֧o]لS1* aGFOU?`>ŷf?Z.pneNre{s_03d y]fwm[՟胣7'G3Js1IzR\7#? փNN~Ǔu^os{d?Y/_1C>6}0\yYO/䒸K^Od'0O<-jDsuJ1~S{FYG#Bށ>0~ú FMlj"Kk} 1BuH2zT ?veWbb_|>d=+>~S|˹G+z~Oy|y=5?]|}zg_j?Da=&x!~})i\e``g<&~= u6r%OBɟq'OZnOAo[w|N>g= 7')]I"Gq;yc+0/fSi5?{s4N{An籿0wcZO:9@Oؾw}q!~ueO6~h󸮧|"/gw\$Wڞza~2~8]OgbGf?5[z3OWص3IoD_Co9uYP9ɑGb_x{}zoyu*]o2iÇu%_% ,IzsǺoOpT}]U~#Zvq8Y];eiη=$B؝k1nk'9/`P샱;_}~+ۿnzZ徣G#ӧj?u󣎳u'S-y(bwɸQXį;mjm}+AOWuvi<~*Y|#ךװ3-wz?xOgaW>Hpؕ cDž._ź_ɪrmV#o{|` .xVP?jTƣO=|\9~G~iH_ztPq{D#gӯˀ/~XvI͟QA}>j ?aQM]#qA9qt=qU}?}nTQ!jٿI!Qa ;eX4HԏCU;G78x8Ǯ2.y;7}RDkw~Z28]4.t\C}؛sޢL!Ci۬owMoro^CcE)v=ظ죢g >v5zvnImG@߲a}'ss$?~Tr"SX_'J=?EVow< 3 ?QjٞM7X/꼋Xϳ`olOp) t=\/UFױ_^ٌ`K{a_4G~}D/XxL&I2.\g~&>"ﳯǾa2I.yٿz><1*^yU>'z0>;:#GOݚSnkfRO"ZSt~*->[N4O\ 8ռϹc y@ݿfzArٔjJ0I|o;9r \=o]/*G6pk3$]3di > Srl.!.2/yǑm!u{9vB GXߚci2t3bsZ'y.nj8Gy\sk/Os~g`sß<v8tgsbjyXno; hb}`p z#Tq'' Nď܁^HyRT /zw^7@)gJ)79xo]_>9O}>+3Exa?O~IF1vCc1 t\$|~8Y[:=O'\[yt vߎ,v᫞W,껋Fa 3tQr8E/~~}B|AAn<9sAͷGE_C<$GfDP9쯵dXUj=  Tu8sC߹7<ܥ>> ?sSzyqT!ջ_I _WG7D'3?E״8B\ɀgru=ƟZC'yZgG2'q{FՃmyGP,%?uxoѿuJ7nqIU<\X1~%0gWʪ.o?$Ea8Lؤ?k|4~ gi]<^.%z}4 >/Kb}zCz >>ӈ[_6ǜM&/;|~tn; Tysq7]OO8AE Yǂ*惢מM\1~.>Q0cj?ƩE:{όb'4g9hS0Wtrs/ڎfq~!v^q8L5bG|b|TG KM Jş8!4' |N.0vu?hj|tW:/4Rd<0pZؕUh?#8/hMpbOٮyբD'S&x7 C<"NxQ>O$?Χ}FM1Wh~ùEpF?R|G~_HK.G'4NKG'3W}ٟM`p6#u 8"s쇵e_iz Gu՟qq[עB>7n/ŗ?.3盀ԏK؝>粜w? p#vw4o{<^O3O;P c?5n@HΘO'qT/ϋe9^.7;y˚%.MɍαZnXօ%O$rF/&Z7ǭJZżj>/p52?$z.:>u1>^ݖy4z <z Q~үߔiUGO{.:rg-{jd<,jozf9V?,X'8pd\ gTޗ_[Һyj9W_}> o7,?Y)u"C#a;rI.OGXٟ}z_BH*}D5>_B.gFo5=~q)i7=%` &zOOg~ӚvL3MI' Ɋo3y'~I-tu8}g);?(W! vc<y?(OK쟘C~߰#'9aOqؿj<ֽ2o۔5_nc5=/OGV{t`2&%84_d^{{+?vOʼez]؝'7EɈ~yh0cץ_5n5~įAag;h?;7T3o= sQO7^۽՟d<ݖN{`O0~{z,,$?C>Uo3 Я$ǔ!LWIS!֢sAׂBH:qi$'ngn|쨾 {x#W-dn}oXOׯL/s(>>(ɢGI_=p[⏁U\pY8/~xf<,8=R\y_ry.-3KK2 4WbЧL3q{mǾ/r9οc`*2=NgN/po<ƻ`Ҹh_/8)tĿϹ~R7/7ܝ}urƍ}ʹ팸Lfg4yb_E;t/J5090/ۏ_?S·he?,b_֛@+9kygEO }8T2]gWksVTvtlqY?`ߙ??oTL 5zG .hS綍G#J}nwnsy^'JQ쇈;ƅ'9\kg6ki]vltO2?ǁ}&8ZxQ7.g*[k{`Z73#~ݼ~F<AU_le}qgt? GOߟ=湅N-?87\x_57ħZ_}{L^5(jTDIӸPÐ>]ώ~C>}_έ ݺ_>y;qާ.i@+C}~֯ce?T_YƁ}׼^r|j'쉛o;e@S(P.C~}y1ۣχ~7 Pai`{{ 8޳]~PBH{"?Ʃۤz__on߰CBX[#6:qWyϞ?C΋C5b{r(z} p^ޯ#O5oqyUFk?jz㴳ʺz|H.!GY7E^Cdf>"a} y%/~=R=C(=W]6q:Zz?z&kp{_ ߰i{~9I'_և =KED+9~k3;v osQ瀾xFϠG[GDdY𱰏t>)0 }.xs]}⋽4h뇊Cz~@~O9 f?Oo{ŗ?UPAA}ۥT=?J+ ~}z~߫yži$KY7k?#|uM^Ru{(vI3)N;x+ӧo㴮cğyy(q~`/;:b=y-^d{7ի_ zcbHofy`>n Caoi8?6 7>MՐ>+K)O7OE۾/k5Oc/NuM|?y}j\SDy ՞E>*뿥µkޚ< 8iznGwMOndu8wit;N;߰ė]8 S1g8kۻMWg9}eVmW7oi|?HoPw;p {xB76#g8-lg}UrHeEU4ΓAߦ~jϬ'W"O ߆2M?g*9n/Ǒq|4W_$1Y\0~+AQ_| N9d+gy0'|.w'},=wyŞF;؇`b? _G+v4!ڍG|tz 딏=Xz>b>r1UޗJ_Qwca|F]wsA^Yk<2_9NwzjW^Qm#ׯkgz~ڕtg+᥯yg`櫾k᥯|N?^,gjyzƉub}ہ+3~'m>:?y{3+/Q?7w_[߷:?D=1zpϮ+=cwOS<4Y>Wo/~#rGe1o]̼+\}`LVSKe7߀x{__b~{3ڷI՞7biK՟xW:\=ƗSŸ-Զb;zZ?wt_yGk4ϽM,|~3}}߯?WƷ}9ZW=e|g=ǫ;oyɍϩ;___ï{[U CW?YO^)o69_eGێbs?x;>/Ff~^QѾORL|[u5swNX5A1xW/}Ҹ{czC_9 Uo}'^6Xkv?/鯖MCsMhRLyӫSq̳}꿎~xLַ䃧/yX_Ϳ===xU1Wu|oP4zE5>mSL}]aR~?|es/~ٳzW}mvbGV>YΕϭ姷劯>ng[*fN|1_VgWOՏo_|7Gk_W,{_?R?}ϻyi??WV.߿ZT½_7'|RwO>~ķsu߿/Y7 o藬 1Oнĩ{>󥿱n{~@VqזZϋ/W_W'ގe_?75÷+?o۾qu Ixב#(Ϻߋ_+U;?/y~Vt=],~7__+X<_+>7bn~NJ7^Vg{]̽|uuX-?)^̽⯦WoOn>/WӭW~K+vcOZOu?k^iwHUo> ԙ?nC/y7yylk)K'(?xVt9O;#=4|E_|{NEsoxE뇿oyC{ES?/oZ]wyǗeνvOl7OX1Y?wX/;Z*|_jo3$fjnϛ(pS_/}g'c:jgޡm/bN/]Lbu:-FpU}CAV_[|k~>u֮sx+ C=3wifh |_׶v}U?{_XH3Y{V>[ڰ^VmZW'[qЋW>6Dӟ]i}|~Fv;ۿ:c{V|O|?i IkO;OnϿ?W^[w>mﰬ|]vPXO..&Oﯗg;w/7 +?GCkFW_k~=5~ơ߿q8~=m^>Jk_ZhP[E}{u?'>3R<w?x~O9uC/^~n{3Rx/|oZ6~twG3/l Oun-|?'o5~ooY?zC{osl?};mOӾߋk=:r{K]u?xb%__Lk/M7|_kWG~|ƣS_o+;} |}_Xȗ}u^#ZWߛv|}`csZNKgwþ+>[uZ{]{y v_z/[cld{3WV|~u[n뜙v7|t$|׃]~g_ۖ?}Obi/)iOW*%z_y.lEQ{s;p_qO<|(\'ʽGNKU+KלkkkD^z>֞z>z)jxwݮ^~|uqw~j,j+MR_R\~'~C3h2XCGo]z[Z= oV}w}⿽u_?zA{~]5;K~Ӧ7ܱ+ V-3N/x_ppu}orwvhO|GJ讶M{S>p=_5R_WN?Swi+ռ6弿rV*>8?8/VmbnSs+C+u[o}|OK?uz][7ocsEg~K`塶xqVg5mKu[[j+n]}+-nlڒǯ5Pf[Bk AFKȼ<m׺Fue:pkhcz^'Z{u_'ZBZq>]>@jHiknaQHl]%Z} g؁=znߥlz^zls{jN,+O蹫)_ގz^=WSz^rqtcGR9XTIE9o#r_ 9/ÿEy_WԵx*|e[H_,?'Lע>)un }CW$ŎZrUh.Au_y,}QأkU>IW:Y놑X;]Qk'Lה2s$Z[A`$0/8~X!>m¯KFN;soɝO  N@~x~g=S+3yrF;ɲ<4ӄ DVZMy8]W\OU>Ѯ'N93D=g޺I<'uM䅓!"{",p2 `vHaW ;0{;*{ڵ'/#jʮtcBL~,~o~VßByOV><$+߱?3=>_ Z?C=7]%wjnO =}ƫȎՒ=%q/GRqQ(YZ]_G=>AKj|A[ZZ;A[_F3]Z{7YBp?/7}>W8ϗA[GS0Z򓶴.^z .ykX ^[[4Ӌ"79дoi_: ~}g tGg=M1yw*^,?/sodz)j?cWl;xL=Oy1\7ǵ~wT_7t3<3"a=W3cl['Ou=?>tкd 83"ʓCk7 31ɒc:c-s?ůI&r;v=3 xbpD*ά=;# ~::yxE2\dL/[FZ=Ȭ AN5~|߳\8p.%p8})7O>9o}_$w?3盱qnZ??k߱WSlngmi^78Gu}(Z{]So`9*x86}Q~X޴ngmi_ҹdMK 9~rs dkiU3Zvrg,7O'Ԓ8-~׾ٸW:_9Q)nik\ |C3W]sfR|=3O<6l5rD^I(_Sp'-֎]nInopgr }yż2"7z \p& yV{K '#wݛAg_u_K}qY0o 8Z> R>!GI_S p[x$۩r\r P!KLG^(#>&} ,/r OA/O8E|c{E<?`}`+Gc#To q/qs=ˏ\C|@? ?Bbo߶=WjS#^~8im^Sh~,4o0x.3кy=߫kZW:_|ѴȞ9J=#,S nP/ G4rc<Tk2k^ඈ8I~G<ˡCԏw2,1}g [t\8ԓxB=N ک8h',7DnwܼY񎌗xM?Ŀ>8>x.&|? 﫾켎#e.7|x7Bg{ߡN<{V9k*5q8z/Ur1yҸ)N[s݇'C<:%'us&_13shO9ꏼsDiXo_ } w/hQ9W+}߉8x 鈾?SCwQ}ӏz}څ:Nm|pUରuX9ǃ>E/߿S˞`߯3Mߡ8%\o=<~{݃zz`oQv~*}תcO{k]|թP3$> Ovc~'?wT;yO}>Sٟ]w?$[R_g_۸B~iް_On ?sC}4{iw(ğ8F ߉2kP3R9IwJ Q*cB| 8=DOc] ӎ0?[K=^|Oȩ/$7ƙijzAx[865.zVow'UW ۛ{nj= XךesKz.x-qZdjMQnCܠϠTk=77n;Rd9 d_=Ѵwn"ܦ}vquIbg5Nуȏ|oL75NO>D}s<>]4Cl[窌?/<';џGy8p&L725 c~G>z~0 7.D3DtMOYڟnx)=-p0O16~?죺fz.wװ=M9ݍs>eDUt8q6I~%pdyhq{:_Ӛ;y/I|(qɀ}Qܩ!MlO4s[/k%s_9Y^~Yε|~_|皒Z-z^o{;x"z =~i*:?yv?Gtz6N׺{ VMQ7@DYVSAg4> i=W> 'Ci=OnE\ZrI}>L9KLύ:>qs.[>D9_|9Nms>OSs`4k7O׽]lb^"!oB:^;`}Kqn:~:p~_PrsPQ0||Ru>w^\]o)ӍM}Z~#9-iQC{.'k{Lĸ}w;;Q=8I~gT Z6sS?>q;Ìs?y.ԻQ49|pv9>_8>s ߉;#.!Ώ!OBO?b>\ΧK]*g<\[C%,~< 83& QE#}_8& %-oykpK|/xzxDCL76J.sĸ |:2ώkG\] 85 d xG`D>Sw}h;>=m~hQӸ_'^#vqϷOIzGXVδ\#6]qD}8ڿy3E|h#q觜omSQۏa)Poa4s;'sr'ޏy4;Imbګa7vPk{YY9Ɨw2=G1nM㇟?σ_fDO};%R=#^qQEwxhwk ._;ŎMOCG=J>,I'C/{O/7'3>>8u?|H/r ~Y⾞x;׼S?p0ٵ~SOD,pEx!pG,#8t0ny yorigf}/'̯eYɫ y[q=[=U p.Og8ԗvO ou4|y==] tsP1' |nA܋@s{ᷠ/\qyS=(o!F S|J󠪞~K׉,Nsο.p>nq/G|D#COg:}A(X[KoCoz5of. !'=(xXSvXGwLybnAGs9Ӏ2_a] \fo{|o(:S5'nyoZOϸNsp_wfJ}ϲ.9>q5.LwV'j⏇8q.>W95;)rEtO1|s_ݎ|Q_[g༤ﳟ;1Wi~www?._q\2Ɨ>ovPKy~vWhg댟^ofcߡ}qYS>(/1g}Nj}p*}*CB=hM{ݴg7F q|w^o6#_Áy~Qg|x>83ӈWfA~غFC<qb,7ZOӾ||~q[ѫ^x1wr<^^?>>\z3υC/ݿ{cO9ρ=&>qN 꼘;D ϝ*xc)o9aU}geY/'MW{fGR9/ӍEm8<ȟp3ܼ(ve+أa}@wQOy]owy0ܧNУڏ|kx56?dz->?i<)90):—Pq&*)8aG߉3+C3 ĸ/kpu=Gyƻsh椭g_]g)'#6c}:ao;qM\_T>dY7.MT.Y2]_n'CH{'OPE$ ɇ 9p紮 _5 焞=wM<:pҋȓ~&3M( zcAO\A_r<*zrWsy~ςSS}fz&+>>~}M8g0O';phO8׽b?ľ(IE.9i'{zzKdz yJ?"sN'ӍIO|{w1Knb_pk%k_~ܝ*O; ~$~ܫ?@/`WEvRt{|2X~zc\>p,>8N=C-w#uy< \>h?TSnOa5G>wyq3%gLt<S>r 1^(0[σG(92<)]}Kz J|=ǓO>Gξrٷ/=64+[Ar9c8{#B=wgt}j|x]žƾWqD_{ZþLPp YzRō'|"Hd1ĕo)O;mj;czJYßB3@ rW}szqvx/7AnQrP*NƷ_N<5qS9aO:o n`IG '#O|s Q07ď7v^Ogy`_^G:>UXKNěȂ!?xZ/?u3ݚ1s8~n~}zL=}7G~яH3!?_>r{_Zkt\K_'^]g=k<zwc?~8a%>R>j;e;庿C;u'~ɛ! 7ey|>ڃ#~֤{_ޗʍz18߽C_SyD{q-O(yZ7ipL/hJ;op# qI厬~OV :rE.סPBBBN +8MG7ӭII>µ5GX׬Cc /x(Zr{aHL3(C\!-KEFʯoC;(J>:yu\qpۉ'{m;Cg'g5NS{@K{{!O\W$e~GqAL/5ދx*KS~C+aqfZkVp'=̦<7NU> nt_Ef#qpȗڃI0g|2GL$k)VI39~|u4D{wA>9(*qu8P5*nǺj?qTC^z`\?ݧXg < s ȗρ/?z\{[!E63)z+|5|IC}Yhp~cZ@ooce{:ջ7?yr]q¸JY };fyI:{CGB $n+w7(^Q*UA>\;^MJ|%#(v]!\lc==sc~s{nrq$NlT~z5 p&rqw]>ȵ'<ODwMoG\ݑ=!n 񏈟~"'  ? ^$'+FS>w523܏yec|M~?Jq1/(qf8''M!18Yߥk+ȇWPxmc|yQhGG=t~^3D3'vj\{>cC;>0. 4Nw+kۧUw|GC~sH]C xs2ƅC^ME.11r|qͼM\ Dr~w<9W ^#?;x,y Gy^B(0P>{liv86qz]/3/7|48Χ=ck|<-xAto'd~R3 }r_s>*'ı{!awz9U/9<ݢo ce'~݊xwmפ}{WwG"QzwR}'hOovlާ8(Vum;y@%צԗ\ /IK{g`Gp`gbb\hF+6iK^?ҋ?È?r_f$C/;ޞb9?~Kch'ߣ!q|Α=|.dzjOQ_><πS|G8r>?9僃_N2p %=ʧ>_9w53v2țgzyQnX{>vmpV Ktm 72]|~8% g:|||z3z:є+,ESa]_PhWYyyqXw˅z6M!W/CFByQy?r^yчDKҹS'r?ڇ^uCx} }^GQpMsȏ(74 0z%qe㮘t#n1bKƸY]'P0?فױoFCA/c9?7П};8a\qBm_žwƃ4ӁK?cθ0ﳿcDC9}x0pZO>Kq}(xʻO=g}^6]?=ϩwp('wfԸGps^s>ɇV񛂳w߭r׊:G{7A>cܥ}ů|kC?]ծ '_[wb_I~b[ĵ}=Tqos(POp^zB{qUz폸S'<\5x!ӧYn) |r 0~7-̷/xz.5-7c?8κ "Oడ#f|h_f4.sX'r<:εܧY<;k+=k}]Tzѝk=L!'+>w?zmi?=8LFk|ަt?>WUz/2}zqf4ΦēZ%v,P؇4,pnrEr %MmnE;8 q]~C}DǾ݌q.a_Uhyv>c8E7Bޙ}Wc`W~&]I]cAN܂}=bܻv?Uep_8:ވgs~;K teR#g>q!o~GD>9n 7ʁ_8! .{ B~uh;  t=J@?R.?c"|!}2{ /dA|>86'xqS~'n}=C^nLoƤߗ{ -8-YO Np'O\ŏcu|PqzZr׃L$7v^5|W8~hW'~ѳss|_nOFE^9s }J8L} [Ǝ};5'3h=.^n$a}؋9_s|vgW~4'ӈZqGJ~wDp_Gkv?e铩q+ğ)?Xk>xStَTN,^Z;IQ^$ۈZzߗWEߓFی?| }NYn28Ը-=9O}(q C3pnGY<' |@eqVoƹ~01.0$aYx*߻_fږ3/|.50kt .~@1>rvQNW|A|ZY8y%k-Hns*ߗނ#/9*ySu-gȯvF Pz60˛o G_{OrCBu<)8n(z#yTFs p^ d|=3㼥d= r~8^[(@̛}rg5oh>vnS$qЈp>r(st(1p4/sשmz wyR^(yQ9Wb;m?[ҕ<닽ٿ~{b4c=(=r,<^;GAp^q}ZnSvm_5hx~_xN'ϫ|QnE <ϞPgM|v<]SOrrs4KG}r1K>y)xkĹ"nDcA\C0]o e|AsG}7L/oj73A u>&nqkWr}>GΨt}ryByc9L$7Sϣڇ8yJqހϱ}E&xϰ^zMD=Mv3&ƅq^Ϡ8~GXwط gzvgS'C\k~ #nx\T>:;יn^xLoŽF?pZyT/[iU-YiytR瑑?8;J6>zD~)jb^_ߙv3䦧vC^>68ż~S>8ytBˍKעsbRO҉JX2Ը25p:uE$rvD9n?L/Hnjx?roзyS904d4 k{j' %6݌OӵcwwHpf(sէ}o3ri?{fFoZWo/)F^<^^4Ƨ|| yJ\*uG@^{kc8-ܐ*^? }M%O\cg$=B`@A< io<Oz}ڧߩ.}_z_9K- P?writ}q!]}O,/tP|B2;TvBkqQ~;*| )wR^ ?ϳn?*s~(~乕Ƣ\Ay0 .D'9 ۷\(?F1 yw9:YL׍ z}YOgv^Oܟf$ q̷;|_^g݇/)Bq2^Mp5˥>{|!|[NS3yٌ w8&ه y̾5gB wϊh8Yw;g?k4rrHnZ;?_<Ϝw9=m}gL:T\{5/l}rzQ;ƙ{w:Vx3?n^":1.ab7& ğH\.DMt;<|'O>i(7uO|Q$q׃'\w~%GA#*xW]= ]OuU&azv~>TKt wpJ#G"!y' ~A<8;c̣<#?#IGOFj3n#'N*~*~E?qb1ys`|ASSc\Ϲ~gS9ߑFY?GC:q0O}ոpB;{y#g!O %" 9d}drSƁ~ܙo} ގɔ\ڏ;_L;y_O|O_>qk}ޣo !zO`eܘW8Po |~ /{KczpoSʻS7Z}}/vxOe{ {ϯ_0}in]Gw?`v$wNK >`r;CW۾ED>BSN*On'|~T'Ƌѯ]SDž~}U|H=gz7wv< N^?xR >y( 89 QD8 ާ<y߂-7q*x /BMU>4+< | sz!=C}fC?ꜲM~qߍ+u|4K=[B܈Q/]w;C\ WPwv/@7C7oc {+8]A~^a;D:섶w/u~=r9Ww~{vD+CyU_nۻGPl/ϳW_5vNKoO q<5Kk VD6]=~_ۿ#>?~CSiy?u]NO}ɗ^R콾8Ύ?ggW;?Jg~GyY{|SؿLGb(~O^P'D1{Qci3_~sDD}}q ߝ9n wl''r?P8bByя Nb_.q,r|z7~yk |d.mP/\Vw_f܌s| nk)^nׅ].!8 e=@#y'  ̮ȥxzi1~Ѻ4>%O=[p̯!x_p Ӭs-z,'> r~s,Oq+UOw+|vg(1ͰwOu] ;*>]]=t_顲 Up4oΐ|_%ӍMe<ѧG^a?8ZxA}W/'{QYu!;bG0=||NƟ 誗}pܷ_h6%:o^񖌋G&+>O%;|3uM\6~8Ojq߬N뙔λ\pw_[['QZ#>V7 ɬezr2B4*ބ^\ρW<=~#=n.}@\_U8>DŁWw>&{Ν]|c6y kg'|NTy}yb>P[_F~L?wOWr> wKJ=!}솴wEy^p|=?'~W-kR8MǏ<ߕeDm0rP۬Z?6q U=Ty{WN&-LSQOz{ 3qB?^Ry3؅BG5p3ʓR+8qѣy!z|88: 9'уyP1ϑ]E^NnƑo-t1ϩ=ާMYdi¯ػ9/O·svq՜W֓#wԃsw\K|4sl/9Ω;.{yL//ZG_<}Ǣ'N4p)?vi8_۟k9jGDGdzxf.' Dqy..|y =w/1Pp< ۗezyQ#|<εsǕ_\> ͗^/ :,r5⻩ץMw} 猎zn/+zQN\L3m+yN?pmTI9GJ|XN؃}M;.vwYN+8^WC=y߯w{\2ش%>ܵ68.7<gGӧr 񠸯u~nK:nxu~Ŀ#4|-zv*_w~O3ye?-yhxc< cnK'u^Gf2#ge¸O v>6爏{a*z!e%5آg8N}*tyg8ºz>KiTnvU>Y/ql9 שקEMT1><{Χ]9ksMٯk9[S'?d{X#1P$_zZݣU~XQaW#.~뮵_֧kIu}¹|w3iyRů{?_ wkQPq@}$ȑU~,/vvyMc~P:o;?_qڪ[}בN\L3rN Xq' OO3E>t!Wο&Sط/8wБE2w~$=L/pMx3\ǰ-_[{[jl{I;NF^X_}߆Sk??n}avC7p]v1x4CO1?Q>%3傿\Lڸ3p5*u{V*o輞ZO?,7 yk?㕑+䎸h;=|;!O/nGqǺ~ Ovg[3}3Wiܦg?KJOXoؿ=C\_pn{_w;r"L(/63gxJc_5I>D}{j'6ng.SK*|[zZN|3. yy~R>yx]:و'/p98/6ٙ+r/ߧoy oYkg58Kzw[y M| 򽽡\pACGc<kƅp{{?Ix'!Ϲ8Θqh@W.|p7k#:<ܒGQQgy |\/\3>zcQ#q8O|ltm9}V!7˭L3 AQ;Zp^Lq|]>_;kp=엠5xǙzP]榶# :O|L؇O\w7j!y +e{㼑&~G?e !>qKǸ qxr9сPnNjc|֥{_?ƍuMGߥ2]Gn͈Eu4(<||iռKO?ex )z4?ܨ[̧P?~Ga !ޫC=9B?7]]!p_xO?zs9!.@9އ:`1kOVyY5e(7jo7Ώ n-!U^csԓT;UإaG𵞳]'آn+Kƣ7oc漡pq{J8y];'r~qT+*>̵k~ܣ#T|< ?=?G/$W漡8)=-3^M?,"}%R4q牂q7ޓ_wx |KQT;k]z߁OSg>څP*Ju9䛊yv#|)ӳM_/ _hoEたQN_:~<`V8KO?|qUߡ]j[}e|E]?kMm~,g1^9!Xʧ>;}ü]P>8b߷Nxg<@hKHjƝy!'Q߃YFe:z>}dz]>xY;sgYAA ;z^i}Tڥߑe}hlG~ܟFZ#'B}eg>';vF9C?Ty] -սzsg{&:编⏕tMo/y8~(0.w{1I_1^! ,\?7/ߏ-܏84ǿ;څ?>woA1n ߥKQ1^~}gh~7|Y' "+~Hj|y4LGEsܔ Qٟ. W/?> >#z80J<& ?p5DF*㌨~sM?ӳ ~q1G82G3a7c>1oP(u#>h:yc״,|e==G1Qp00ܝṁ ?}9Z{~4M<|>esG ?kǝZ;>a{~6Ngwu?+Q߉|ݮ~e=4>%8<_1yWGЉa^sC8hpx~yb1}vx7לwx&+s0ӵkPrx3.]$ok|8ؑ{Jx v8?yep=>}PiʿW/sڇe՗zJNoRϯIuMCz\TVd62 n 9 [/O=1EzWP :?o{$?c΀g6)NdeB)J1#{J}gl *8 J>M;b^3tйo<|~Ѿ܎USkdžz_W O"ߦC״Lבseq={9^sgŵ/nOJB ٳR,wӼ׫5^3}קUt>\ tL=?*Wo^T2w}O?]r G73M^sZGy@&!Pǡ 0.y_Λ!Cn}f?ћOi%p~:'7zlAnd݇5}5>'w=P7K{ءO$^}7;}s}K.W0R^8ojohG9ׁݮ< vЏ|Oc<|o_Trj;z6t5SLj8=~'ﮃt ?qj~O<7rngۃ쿞?W]~'ueWynrd<,T}ʸQ xpx873NG>]4|<~yD/=}'YsP_m. bC-An]#N>Oǝbpsp܀Y]GLi|og9|}pSO)^ w#?4z<8?wG=?| ga\N]>]G'XcuLב0n՟16d7;(|"xZ^G^M?CQ~!G-pv#1^uv0_ڿ+:r~"f܌U险fj<*{8)pTwݩo\;q74GxU߃kG`et_U{kdU{(WC!S70mWG݁s;ЈCr?%^}zyإrS{U' zӏ!~'øï k/#7PS?#(Oua*~|#y] S>w >>_0<7??v~su;{Gțz/ک<]=d܀0I<^f,Gz8qR>ȍ-{a=>LGxt97%7λ=tm{PwW9ϲʁ{W|%7䐟>e8z}r珅~cF`2}`&#~r| N7O&=H˩]wm9?/{c/'VR?Ba}qz.>僡w{u?NskJFW!/v} qwe$G? .~:]Nd{ܼ(o{٫E 7b=cxQx; v/?E8.GsM ^0;uayxp61>gJ G}uƿ;3.+OB=՟XP^gAȽ[\DPs ރj/rE_ 2oPfV80i?X>"Gı2L厗~W<~ْ]$DٴL3}Zg,}+(zțw\鼶rḝԋ*O4ӧ$/S= ~]k}N,xOl0 Y뿷 u6uGi3$$KHDd-=s6<6}4UѪUի=.7]ze?MzWIIrY9]տl{R{+Vw |so/JWP缳I7;ZOr~ Yfy^|Ż?8y?@t -=8L8ɜKyzo=}N}o=Oog;:qП>o 9p|_t3廢_\:M=~k|'i|޷ #]OT~>8h|~19O8jw9/qCiYGJW/͛lc6n[8?w!ad^/TXolrإٟ{u1ŕ,Õy/7|qeS畮ygɝG~WNfp=͙JWc4zs"s9qWW=;rsz?V?0_ߗ+}~i Q,~3{<+]D'߰釬q~w?uެE?@wsƟ]vf/DNG~ӱ?yhx}U^Ըx-ǩϿh׏[cK^ۣюu߸NW)/NɸnU?}ukwゎLI8֍ƋM?[)Ϗ/=_{J?7o:IuC/tnPW3~<{9gyLGBn}3_wo{ʼ=&8Jx1?&sz@2M빣I[OԋŹYWAſ풫O*͘G.K7Y6YՑn3>ԫ1^~5?}q!?ۼ,;WߟaʫΒ~orD7V>_-T$4oS=FNk=~g/[s8;>G~\*_O۟6f_?sE{tg}f`u|?Q%'\g3۩~hڃ_9'?vC).⮰/_Oȟ<$}c;v_\ʿ|)8v97N3GՇv/6Od6S:+EOqd^?Ɨ W=f87hO;/Ooݐqz;ٸ?tKq05a8gǓƟ/P@\Rrҭ7i8/VLޤ++OsկgoxN3y__ 6AMJ↉El\?i|ǴIėWʋ{xW'/8ƷqU[{IGr7n]֐'J?.gE?o\'.94>GBɽqOxk#cO/S?ԟGVN=o \N=z *}|~ϸc|/ +ԏo\SS;V=N>ۣEiEZ?򨿸cXƺHmsKO;޿=_8mÌZܜ(M?ѯRk'1^&γ~_r1Ots4;n4ߐk?5͟GOߴ???lx:tٔg~>ؾQN0&}}}I1o.}}8>@?)2.yM|߽s?Gs~OE3<~wq׮~1.|[voOzz{OvR?R]ɮ9Nv!v.c#?=7g}#>LQ|Ƚ-@/Kι'Fab7eC(ĸ?5A*\~N}QS_ ?OaDk#i\&>ܼx܌)C{)z9Vp 'O0"/oq?D;yNߌc5}hwc燍[MF;ԣ8痣OظZϮoҭǼ<͹OCe5.z.u:|ҧt-)#/1Ca?{K=-~<~7ݴoCcN{N~n|'vz//|;;ow3€t~wVٹM8o)=9y^|ݽzs"8o}aY9G?=}h~RaJNsq]GzV.,>Q|&2G׮硣>ɼ.wIę47bos~'Rt7c>A᢮F8|raJN~ `/ywx5{8_}wn|giΣ_ܷ9w@~FVz0}ۣ}rOx/j]{)O=r^v'K/]|S|QW ϊϖs>tD(?.Ń C*wfѯR=_ӫW䵑O;K3( \yoKo}kYߙ7diznenŵ pwsOf?mR57~m\\([.P9?pDg=?~oʮW~ cuJͷinw/XvǺTj,o:l񛍫}FŃqڽ1c΍qh3~c\ T /^rޫCO2Q~9{! z_O 8\_o٥\~!H=KCG٦ymn|Ƿ} l7\H@_$?<ce߂yUGr#kRn.&w?To1?<u88qP.Iہs(8ڇ ZF2z}wW{?yqcSrE~~y9]KP3~qT/G=c};2>ίg4M>M:?s̷?p3,J/]hs̟Øop./9=}h?wy8Ƶx{C;?bҟ.{i/j{GUq3+rp/+wiџFGX~N?e5E LV@Aι;?eϾ㟀csSɽ`3zJ>Qp!}GH'Tyv [{'SgW9=?#W7{?iǸ<7ٸy> ǞzSN@'`Wzb}AaTP?hKȃe;vؑ="_ks];{Kc_7:{U ŕC_reMW/X >LC!o/|Ǚe>7}v+ߐMEW'?{+Vji$'ߠJ9o/QWzRowӃ7NZ_?Oy>i{i~gӃUrc<*]=yoџre~|o}VGey)nũGylPbcoc.Xxg f]<,=)}?qIr4o_W?Ǻxuwy<Z?z[~>q;7'l)|SK*p)ג>v~W~1L?1ٿՏs8n*/?7 yVhLy;ztySO?ΉMϣ}v9Z[^aM>ƹB[<_=wK?[ϸ燡%Qϑ?3%|GߍuBul[AOe~9Zɞ|e=gz-s-vmvBǝ;Sx^ߵ 8Ǯe5gg:y_;Jƻ|$];isi7T;ZvDv(vTyqqMgOS'Bv_v?TOqX+34ϷwwUj#~Kk;P?iy>{a/8w&[zy).ŌUŘ7#b]]UwF;?jr։-JD>|w_io!:C_igNqky~]OkVл2N72nߤ7wo&߭k7Cwpny#ݒ/iJ~1^]%{#SG?y  O٭{|3|k'&m磿.׃ >Fn׋&=Ý7c?x5>S%]}&^sIɧ|]}'ߴ7^#\C;dSï`Oӕ9DNmߘqiᄋ;{.]t:i^ ߭K_P+}?9SKA| bsmtOä3~f*nso~K+q9qť~ݼoGϷ?[sht?=_ΛäS-)_qv-cgOd?H=e{?\,ylΓȉ='imۙqQ E^^Lv֟+]AٳcxMq㒦7Kѧ7F /Ϸ9HO߼6&t/>(y΢rmz8|ҟxX }A?znJ9~\g~eƛ7c>>M\Ј|?17n]s~r:;7gl{?-݊2''sA9i?+nfFe=}Gc ?1ųdViƁeIS5~>>O.ҟkwyys{Eq0ΟE?z67I7nb!cf\y_=KOמrt~>cJe<%=/)&fWEfS<ћ=-\hg@K~]ݿ~3~wjJǦr{x^JqwJ3CKiOg?rH>x8vrTtxS<<>w c, O=<|#/rJ^@F2C֩:~{L1\8p{99n.{^y嬯֫~ȬI'f]r? Wvmu/孯=-.%ru^ ﳗeyĸ}/.bܷ >+-9ۑ'~׬QO zSɟ:✒77 =4_.zoy-uxޑƟ+[=h'C߻M=s=gk!?&ٷ7N.Yw>rKY)+"tބ?ڵr!s&A? ά|?iqݸ4ﬡ!rysRoyLڛipEA9s;|q:|uѮy켇_F}ߡӯsgSثCÏ^^r7d3o}ugϺAQsI7yrg?_<)'侟o6oey[y>p[џg=v=_>_,q/=?\[gN꓇ycg՟lR2qh~Ic[Qo|}rܪy#c^wm[ʥ|<7N!U/ew8|y7CENn}v{./覆"DQ8S[ _g^iQsV:׎y{.#owɽgz_ȿF|S!W<\>ߓ}Sly5ߗ;}]ѿS K}o~Oc"G|5.C(?:HyZŌ}+gEn_Cɟ}iᶜ(=B|/y}9zs"A.|0T3>|mӹoFwGnr8'G?Ճy?ϸӼtQϩ1^W|87(ӈK<gGcq>9<߭sK>yW/~G[v]#~jo M}{A}ׇ\~깐z'jҏPG7vO^am{{{߅3&~~sͯ{v ~<_mޔ#_cXoW*RzF9xW8V/Y:ƽvԤ_L=>@ny~L\z凇1; ?۴{ P|W贯c7)Ʉ0?ww /ixg7>x;D9:~yo8͉w}xH#wy͹s|Ӓ|yvlI?w^⼁=_l38W~Fi=L{џf΅{ۉ2ww) q8ǼW=v>o%'3{Wػ?F~q8gW?öNѮ#>H_i/LoǮ~7D7rXsEOq2pՏSrc4ZDאO3\Z-ӎ  rxʍx)_?aJ8~d~<8}[6`ʛ6c7n`k{e+p6ALo:_I/t|n:+SCQMļhoE}g|ig?ƼU5n뒏t >ڍ''mͼm?n=c]7G8zwh㴎yB|WtasOی)˛>g\,iƒ-+ԃ/9v\e˥ygKm[փj>b)n4Vl҉{Bq'GcgOgG=cO/3(^9☶_NjscG9Io|Ty"bƟԯqsgWŽ w3ѿΗ1z3ƹRq 1p`3J_hM;??`?hnngᄊ|?7va8 JJ~S97'ϧ_8FZMo+F?9?_Ns w/<);7epų.Of's!/%O:si7zB=w#>?h߼orn\7M,q ^qo>g߻'Gd9|PWxCif\t op r%ό +ChcgިiG}1.ogq=0~_OsK]Kzi? Gg4ݸ hI;%;~ٟ⊔o˔#zO%QOy?h>Jv=LQ^_*7iEz~qzh\8HzȌR}ܽ#CG]%>[w;#+so U)|}0朣qhs/^o u^S9c;ߗ[D7mK9W|ɯF%t?_۞ãet/kwQ\;6;O?%p:'S[>?5⼡=w:oГz^Zp*pJӏ+xa'i/3+~JC&T(?0ӔĎ0VϔGE$q.1o3~M;9T8X/H({ϛ}!3j(l͛WӤ_쯊b}*/ >'Gb`Eٷ1vc~wrWS9_2:&kʽrN=9?)ʿ;U|K!o>q(.G>ύ(g(_)lw#_{ }~:4LkpKpS4s~r=rԮ瓟̇Ih}~/{yIۻq?Bƥ*_r+C>/Ɖ;3Fsϻ)?za|s>C~6~!ydA|[Fy՟Y~ΗZo㩿ѾuԼV+|LyL?0z3axһW._4~|m3O׼xeȣsƹ=l8w\Ǽ}o<Ϝ]iּ)s/7{ =*}'ﵿoo\a4i__/C{/vs^o0ߡ)of 7ua8H_Ӟo M݆ƙUO(\_=(K-N/z6źs~8C̋ o9t'/CۼyE9HY>wAMyev9P,L'_G"w$^ʯ#\?;>yyy;4﹕r9uZ|v <Ļ8;wrʿUxs|˖ṿԾNr:i{xj }|)77>F^%f_sQSgk7JR.i !3ٕg7t'|x%Syξd?;R4ޓCN^7/1&o$jyBJa?47q1a`G?| e)׸ɡΛl?qn;<긧K/d޼?MmkԱo?ltPߓ'S~O9 M/ߺ?Lz\oC?}whtRO_rK})nW~wjerH}gK6x0;Gw?nu_ys09ñړ8ʮr&]KkQboan?jI i ?C~;pvwJaRKZngH3C2jW?ԧS6ۋ<Љ~xQĩJR_&/(zi=ӏ? }2_PzG5?Q76^_ۏrkѤ;;OYofs]o#|☲/|yՎV|yQ; ;Iw$.zqWK9S=FM_ҸÎ35Nfh=?3-n5y/~xMm~p7o#Ծ_uɵQ^;hmpl׿[k<+қ|5/#)vP/}2?8&}'Y4os|;Kep}s~4?uy/m^Z7ҿߕ8Vч їI w7{G:l8M|OW_n/׼v_HyZ7)#|y<$ߕ8Ex.u8Hzp">/h-ڕ{jf<9oi+|p=)^M?\"֕/dXEӋzL<#|2O̓N=-667'|ze*W{O{2!Mw:Z[٧up>{uWCߕYz5sjH}G )?N~.}}Ty`26O{ɗ~~vQGs8}|·QoP alh㌌>o~{y.='݄OHIVS'?|d~WGځsS]A?w7 {aJxo>ʸ7-%(ɻ iOe4?yA՟k(j)I?Ao?އµIÇ>V?+}yBd^؟ѻyw=*.Liӣ˟ykO_>?4OF{pf^O?G_?}$gv\qr"ŅE+%KҎ\7?]MKzCi~tφF{8 ~?waJp8:|qunfIOG=ڣeWʩqӮ7 |.4.oo9F:yͳDN8o٧7|z_Y}&},徎зyy"g>;Փz{}$yH_~Yoñǒ~>yd9l}X~vNqT<vƿaߏ6rћO+SNn%t ~5 /ftqpg5PY;+vjN>~n&nEizwfOҌ?4>v#i7'~N|8o]C.y'7Nn~Ki_~}R<=[w? |0z~5{n><5s3K>[V ;HK[Ϩ|@ꍾ^Y~UXa@{̓ǿcV;i?1ii3ׯHʹ_JNZKS`=O[(;L9z 8qC7zs+iL [@GO<~#=® >u%[gݰgS[/%-n~;Pk%?&]u)oWbpVxwLQiT/n(.~K[d~k}w <-'zyy_|0z8"~|CxyCgfrw+d5=x_<|m1},}=?0}'+oa۬Wa6d}l^?}g/w|>rO^| 96>vz5*z<ǿ}?g=D{6+ֵ_p{e? }yl:_}_Z?x.!NOC}Gғg:߽~S^{~G{̺:֕}a;ܨCx>zs;<~OvCy"K:/O߾ݳ8q{s|>gK9F\;_b䣏_$߅Ofs_{s8zX~l||{+=qݏ|= ~D"k$o/Kp+/S qG%}tҒ-{w|~T/23}xy/vKN|X_#}-G/+cjո4/PΛ筷F?ӟI;.s}0<9}suiюA{?V?W˾r6#?79s}yWi{ɟ>Ϲ ˣ;#ߑo֗NS;y6:{r֎|oS+P+O~[}7kC]|~ڮMCOp8{5O&\ͧ6{OἹ0#O2ڿ0E/kGӞ;:C7z>lyzN|ȭԸO9aȩsGQzA#_A 6>/rU?wqmv|/o?jhSW<|ggfO޳#;vv?k#4{2㏮~R_֩ïcڝQvG΍&sr8ڻ<|K$7 nec4^# ޼?KcJo >m:/Mq?78e_1OBKGj]Gk=4O? ΈoZO3?wC?8Y!m2;݇7D_ӫIG?k?IovƾcGͷWI8>SIߙ!ޔv.({S[WH/yX{NاI=܌S'8zgN;SSy{,>G n+_+.>s祽:8/<2^.'~/\|9 6_97ɺşDߊ@nI{os&z[5pOL?c=9ÌG!7^K(̋':oS|/_|J\o̸C|5x g՗ ==~H4g.;-{# _sy~WƇe|s;;{|Zدk yj=r'7s^I%o\vWxKx!x/{|g!՗|7y;n_k=9O}ޠk8c=1z[.̹^.u >)u&ov޾I_/+!y} [iډ]G%E\hՌR޾Om}ټ/?ozB}7~ v|L2i/[yg䷿zS~ -;H=<ȧUyߩF?<= xU{qȹaυegd> z\|"\`}xӖKS}rިWz./5rN~WR,ύ4~pS_}?z}8l*ߛŗ/Z{>zurXJ׼6oԏ.^]"wkwJAΣ_K]~r}{r?N7+}h>g.4ߛGM/f=|waa+>ƍC4;ɝG R>q>{F NjX; ,lyNҕ> vzڠpŽ+%ecC97aqIۿهwΰtg:獏wOҹ_|9a+gh㪰S~3E}本x2mP8S~m.-?$z{d a_^e>ҕ>to>3{8ڳ]gWPgeկ`|gRqO 5~|Y?x~q??9+kxVM5&Wփ8Y}ugɧS_|e[Vh?˳Co|7_s;{8z~2w\j>'(=QŌ~G=me gS_ys~ρ;4SaJg}{b\n+W?h9qs.2\(\*oCB}i:iz.r(.P;?% 7wix>9({ },]/]\Q4ɟV;kQw-8Nqf6zU;Qsv[vN}NL?W{~;49Zs]o%Z3 (Cߦ]{- g-^&Ϗv#K#-/JyT >f%?xr7:oEgIQ荿n)w8xG'8y.6߽z[>+]cM=M[oE&-Qs׻8̻PSN-}8?k\o}A)xy[+]w{^As0ͼ?6G?s[JfZ6y+Q\oX><> \JW4PvyD#mqc'Irx5pJb 4|-{6=nܤϹ>. =2S֮YCG|iK]B|~hϯ^}I<5;wjYDŽ'0D+ }|vqBYi#5?yp_y+.^?sY5?.yX}O`~_{u*w?^[gόH{Dzkszgg}{?e}~q&\ž ?^? >;zxv00^C'|{8bg_9>ᠥ&HYgzeqC[|2?wK'OP٧st?_O,3gzrr6_=V//W__GD5·'/c6Wz㼭vԇԼL;E>;+tx8Krw'SJz']oaQru [0ȳ~8:hƳvW%on7qޖS޻g{ꗆQ?{m^;/庹5 gro%zvgE}!rߞyS9>R<-lo?x1—/LLDL=#wC;p''#)qP|+^տ7NҍO|ovNo8|ϲH}ҥSކh.q͢rȯ~"#=L[!?3K&_ z7s|9OPc 2R]]uq ro'Ƹ\MG>rЫ4)W(>!KF߬#9r/x_zʏI?^?;o|dz/1ɍP!9Nʍy}Y<8c]3_/po>q>kO ڳ2dG9zC8狿/{vw/ygy-Zy])ܦ~ľߺUwԧ߱˔۴0iHI}q >Xᜧ8cty~~q |D?ukÏk/ݎ vvJzځ;^Q_SI7Sԃj]v8OΜkL [}K`co^vOMf7ŋd?8Po6=]2}?rz(^K8  _p}.Or}O/T/yNC1Yxmҕ> ̜~ܭH978h=_sU~8GsvYJGk?K㯆߂m΄™Vҧ_Əa L|9u#;=9=C;|~>M?n&QͿnQAJ'G]濕yae>LߔV7o8C/vkwsNOp%o?ߣ{yJ~_OK=G/|woh?N}L}ϥ~J?H~B?ڼ9~iǛ-kxG彧':e>G~+^n G嬛 \-~C+Sq ~\qk9"NƑƘ7 9m=y̓k?>n9C gH=k=`>у^6h\;S^K76R;rY;/9$ ]^z:։KZgəIҞrlrͩˣ8=e>oކǫcȭ>BA{o`pyn}j=*E.+ҫsxz}1{c^E?cMiO9廛ϽecNwG(o|C;/qMl\gB<}g$:|`:G9y^3٤u+9Mއwj7jO6VKt ~qwǼg^?!o8/Mި8<٠){Gr{0gZ3OsϿqh7޿~ny^5-Qc wӯa/[mtY߼%O>Ny~q{|WSxCѿGf?ּ/q>zlO`9W|2GTc@ݯ[䲳+`[W5cM?%|Pk3ǹ_?t~^lj'dRgy t\>]cیx}K?}✩e*:ϥ\]{۟<ȹs{Ky'¹ԙQTsapq7{ßzcߣosB9?g?9{K}.)M.џ-v ~&,~+e1=qIفwo4ƴ=ֳ)7ޘwyeo%Wr]8;}Ic G»|RqʳQZGqAc~/4YS9vc<1ܘug? 7Pi~֭2~2=(=I;wqxIvɕia5O6o{g-i#reVﲟ6bţZ\̙<=߬٥g Ygor|-}nSnSgw uic?B9Wջ _go_?~I {LJ+ý$[4y -.?5p_gޚ~߫p6J ^p903GMVGʅsGX<o,w:G|߼ԓOΛmwU^{g6zQ_Xu=37H{ygyST=ќψ/r<=~;JXZ(_8e_f7&Σ_qph&ި~s^okZep?b:旸\ϳ;}tg}~|O#7#?sX!foƷ&P_Z_|s獿g?WG?x;o埗xNG7s*ͯO6_J [^+]#}7?g^<8G ~<㏗k̫5.JBZ}5OWGCsWA=rԻO/7gѸs|w(lK\B&]{8 xYGo;v5ORnΣ_-]Nܓ\ݖbrNz~x+]4or?x&&/kyI_39k2ҕ.K~G_1/yWߥs?v#:Vzvw=" WjfsK~wvOwv}=;lM/}ϿxhˉΣ~I;hO}ҧ6-x78ÜU;L7N {eO ~vOP =9s03pq߾N^fֻ>D9ڗ5+<8ϸ (N4܅zQ xiڜ?AsԸ*xى;A+c'xʹR$Oq^'oț>G&~i<'>?!/Wk!_xzš6ns;@~'a\ȉH`2q!C,G/zwX?~z/i>r͏7~;1?[J~qUޘGYQ9GH?_=ps6|!7vczgȟ.= 7Ir1 qk|ErN?Wq)K.|pp!7Q_qyN>ޘ ̫qE?qҹ\u~ Q}F~>vͻx^Z/F?Eg)o\&~^:b\unzTzcNG:+߹S>|? Wzbӏ;1NWWG?E9Iǒ}~0Ϗew􀾻 f+-ߍ?סNz4Tn\'/G9>N-k9>f\ĸgzN& wCM:W4I Կ HW~3~)~ѹ^I=) ?M5\IV^7'׌g?pף]?\WQk8ϬrnV㩝gr31ϳ~wԓv3Pwxs~]^i(.՞xXhL{uo?U|cq=KT.}!mGv/xuSo쒻a<^ï~>)7%៧2OG1>[Z?5r8Ԍ6oΆ}q+VEcؓ[PƝK> ɧ|4ʟ_ܮs:z3Mn3nrP^}~o|~{s'G׸}<{c'//ߕv98|1svǚ7+~C#:xC'㳥䦾1:6z53;|7qvg7GC.y?w~osF_D/Goq0rܼ<ù?~so^-udԇO\gW7s& ~k?X_$~a^A>5FJ$͓4_|=Ơ|ޟgu͡_O.x:Wi4?/V?H=)=m\~ohܗ˺ŧɞ搓e%Ne[/v}#|>s0/]ѾN86iw37{rzy?hg7_;ߗ0#/,k`x8lՏ%ozhLp)6<:_dCgϢ<PSCẎcC#t?|9϶ڨ;n=s:Bs =xyܗ9R_<~{`Dxq7ύx7ns_"3N=u>v<7\ ']כqqN^<|e?ҟ.˷=՝|v>%]x_>L|]vҁ'j9䧞<|ni/ke&=>řH}?zao^M{> XdF;l_Toy󆿵!K}w3uho8WG^Vz/ڤyo~~=7*9SRߨO?y瓯+$UrhҴ7kK/)T|r4r\[q'Wr|gw[z/m܌Г)3B:j_y|yc?b!.ǭZA.szv#w-=sNJ3s_Wsf_;O2e|Oݏ3ӊ?+^uos̛ws/7ܺw};szzZd˾I='F }]a4. p-~h/sO7-u~2ߌhSîY|j=6zcYO7i 腑_}Q>~hXoփWgvGw.zPv~{la^;Wh7/Ͳ|qf'x?T_y?W+}2 \O_oyڽML}mo}=/KyXT߆_{&s> %=Xx_Eϓ޺oQg<{|Jn_uϾ+AaR~?ԛgǼ]o B޳/{ACٍ~~i~';ִ2oGځ!OYý]oo~xi͌+|OsoM(zp--q7G{~_D'!-Noc>#~ Ү_n%g4/,(oiKORy?|W'z_?IOֿlJn:kNOy/.9O'G6{Ǜ_e+7\k9?Iox3ue;-k;>ïaJ=0w}9;('ŧDj7Q^/z>s&3~[3Ύr ٤٫.GkԧT?D~4/͟Ih-oܨ}qWĮo4C>㈟Pɭ_[kϺz`=GSiWewjqsIyxJoL_f~?5q`m>ƺ}dfAo9ewσ>Q/Soy8i>sU2ϋ -Ǖh|EWʌY;NJ>ɶ);=?˼h_8{e*3ao?OZӟ;~?Oo8KsڋD{b7yC7yrԾz5*'.|xCWJs\^]7>3ܾ׍0oO~8 ^71n)yu)Sۄn7̧#ż>3e;?Ws}Z\v=lI{yUGO9Gsͼ<w<7rp`ۊ3;jt?%̓Kιpϸ眺׸OKtwYomކVshG!n1`Gs&",)N ~M{377߱w}qw?)L0_rnT>>H;k_ɧqy}xw>^׍яFsϮq?9zr9>kW}ݜ3 >ÿk"/zOǗWCQ?yQ1kiǤCϯk?xOzo$iq7<3l3|朼O\Λ1?vu;޷Pz_8ߡqz <;{c|)SNvעwNO%o/۸x<7]C8)׸\}/g^4^XNWNlWq_''{1בϡ%zO"|9֟'rqx_)9\/|gCa&/ȓtz;q:x{~C͗S^|wNߥѿy&!G{yǸo<痝\o\OW)]j{ _o](?~phB}^ )}pQ؆< ~0Q߹O-ﻺ#Aq37;C?'?osI/ }*|a>xm0ڟ]y~$פGo#βML·tsL矑۟|JǽCNߒ<\[?w{gYV̗&>{o\kc\_Wޏ뷓<}) OZM>rٯQ8~7!ɿ? i;W֏ɑ/Vը=Q{Y*=&(b#KN_{W<7g򞫇Y=[2Ut1ڼ1>?䞆ѱNoƟ/m<4٩WC/ :Yy|Z]΃9;N'gt {]wc^F[os#^\?>|w o.y18#϶>~Ӿ_K3샛syφ>[~ E.1G'M>_=1>[!/cC~tMsmq/%kKGW;oz~34ǽtqN_5~?;ؕNΏ^Oi'ٿ_5Exkwv2iҧ_s滷D7Џ!Cn 7y:u}~qҞHxAħQ?q6sG^_] ;´kK;g7}!ԹΣ_Kɧ>|;c>0sO_7%vǼ_/wXױ>g{y /Mpg=G[\y=YfYϴk7HiG7^\vwq^^oVO̗qw ߃y_5 I&~D)T>QI$N>?y/եѮwҕ>Ѽߜo08ѿ3oWGJ9/lA^;#pߪ?y_Wuӿ>[toX/ }ȯ_PKcWGqͣƵ2I9s+姮_+]͛;~m^rx{^ٗ}W';^ZJha~~~I~9+HNp>7pI>*Zm廿'{VlOѝ޷dK:|y"tN)vo7BeɽRJ8c+qpa- .>?+sMgkMN~!%O|Bt{~6_z<_=" o 9|Q|+|-9M|3~B-_eS? |׾{aw~[yI90ۑr9Prw:;~uWy'zr{f Jy3GGÇqoP^6| W3zi]n0}O79MyP菉Y~{GH9'4~N9/{?t|<<򽿔=to&_OvYql,}fϿZ_)\u{nv)/9]hquqk޻n' G3b"ǵHЛY~!/`^'"ϞwY]/{~8O=]w?rџO+eyx̦?Y=E=%yW|ye>|Go3gޗGo?F[~t:Mׯ_rDY^w9' 3ɾvK'nhwO#?y^?(ԛ+NIG}q:oX}ɯG~H<r|V~#jnQy=yC&-?#wIgK4[±\2>䦝Vn}/ɹAI6?ʏv:7cX/IO}0nM}Ƶ cNC[7\k:I?F:OF}|IqUCfg\UNCzz~Qye>T/ƺ|vnw}Sׇ1w7{I3L>t]>u?|r^}}v?>lc_ri7O2os~/Lnd>/zb9N+o3LVSѱؗ`}X禾.>ѯWGwygK_%yX=!Qtȿ?_o;y@ƷrOzzf|/?,YSHzѳ99տ%y7Es\ڮ~Џ=fq|GGT|ѨW?pڅP/{x'g׮7^/i8C#'~DƓ]PjI~,B~(O̟Or63%k▒u38@0ȸvuȯ+gg#G~&-x%x8Y.dz⋥\*v37izn<nw<ؔsG+^t]0Iwݲ~7_qD6ƭFߥet,zqA҇P}Q1_F@iڧZ//&ڌf:L#W}}f v\f+hU{i&=׻v޸˸S-;oD`|nwQ_xߍz|}c2(旣9L~K3sߤ}{)W_߽_?3_,}ߡH/~}'gOp0m+oCƱr~w5MoG~{9hqlYGz>yu)^woOI9i<ȷkG z=%upNlfo@_؏ȁ]{^~}Wg~N; <>ΌqdK.F'y{0OS* o ʏ|3Aϟ#}eT˸s{mӿ ?Ay?"! iwU>_?/V=riqŸ~ho/s|s~r%}{r1~I=ȯ_U ԏz=|qk_&ǏSc<VNzb~Er|/yQY3]/ǺFoqޑ''T{<]Yʫo9Wc\|~}@_c׎2>wQ??<ƥ\G2Ϻ0Oo>;#Oc ]ruYp};\qyg9<^q꛸OGp;Sܻv.0iCgB??4MNE'g^%G{ŋOwϥ/vS&_+'Ց>7';o؊ /߽'\sSGRnއ=xgA_lsN=ǎ-wt^sG|'rݿ>*X.kO?2=~gKW58Q8VROq_ȳ{~r.|9rw~Yϡ v,'x x:pSSya墳VP>?z(Ǯ<=NU-w 4 ;.;}#$wi~7No޳O?C>wC״ {ُ>o?OX+. wW4i֤[Q/g7U!?zҧV'ΐopݺ}f[S`c|4m{iޘ_? ro2\fgr>~w}_//!z{dwa»ЗG[ݗH^|^A}={<_+}<-w(;<=;y/^*7E9j;6>|;u'~͓8bE>טr wT?tz'mgҧOރߝM~ϋkf3/~硽ss_E,iqڧRvv?^]!2>Ѭ/=g|Λ%~9ʧΛ6^Л8q促̇ڭ؅o.ΑgbO}y{?ſ &.W}vi%O꩟N]K闭q{S:ofZh<p{%_'{v||77I;E=x98~s&_R;Kyu?k}I?[/ViϕlƷTd΋K:/:s$ةTqO==oFf<8<r3_i/i~&#K߈KtƟ4sϭhyϾN9<3RRG<)e(%ޚFP814>Uv&ז.ۏ'u<ʹ8Ió[3vyQi|vo~3)|/͊w}}F7m11.ZO:l8.yQ=D([q9~cZsyti~q8S.7R?ʗziԒ~{ߢxS5ϣcUg7y7OB{?Ǹ:aߑqɌos#ɤ>Gԯ̻Q;sci3x~)=W0SMQ鹾rYS.O-~#z=3x^aI7+|v v>xxLS?fI|2IG>8c\^^JƵ"i~]#qВinfV~Bs~{.-F'~Ufz? 6ݐ!ȯN뿈k#:I'Wd~%<nBկtGwCA?-ƧL3NW{J}?%_e{ӽ_㾓Ktҍz|ځq}xw"_eU޻u|?Iz~iY)ƧIVnC;/M;ai+Fj d?t/>yN)ѤǸAKq]gYOy$?z<_DpdcEsڿȅ)k=m,ggw~m<]zjW{@`|o.Ƿ|L}ɹaq]ʡxfq]B߹fOP?Qpp# ٸ;AZߞP<ҕ>Ѽ1O=+9z]?W=?xagpq١K?|/kGg}o<߲M}-M#q񬾯‹r^\&q>;q3B3+)~W?dlMq:pSS~.ҕV\ Z <K=}˼ΗǬ[J-gC}^3/ro'p9׉96k$ysV_%ss>7}tV/y1;L*sv~?*) \){n)ÖJWD_Suc_w|㷰8~Vlйo;.5?fº7I(r>cnj>'njK7}' ?o)#ϷC{eŸ𛵻yCA?S?K76XoKz8Iӯ+C_I=;=ǟ>i .}q /|8|3#87dwK|ZU/}ǿ-s/xO}p{;_[ַ'X?S ͯ߶c͒F#<>O{ߎ Z?Om?ozeѭxE#!;F?OVyysM劏3q(sI9 Ÿʫc_/x1Io/oD|97q6{S?>io󣟯y &}aY8V=nqTs~zY=z5.?yaOʼzc;~vG9F;MV3G'37dD0RN_;9=:EO|K SB_OھF{ܵ2_!Wo\|5iO/=},:?F=dwou' nM}=7sK;q( x?2o;m_697g^:ONa~Mͼo3P5m^݉+T~r33.eݤyyxIgbҫ4_B[.Pxz&tUjCz[y8+yҕ. K}\Ә8YGfmMe97wۛ&~7qnҕ.{Eb'wz?Kns.|<L=)A\>mS綵|l<"z^OCϵ{/T;[;җyyۛNEy_?nzFVGzn ' ?󉻛|N+vGYq4AI=w4< \J}O{IL<ޙ䃣y}o_/n&Wpqp2'AǪ$=!\kt3oWWc^?*_(đM/MU}cǼ8;yfv޽um{8GOG|O^Hޣb)yqo'2z&{@su(EG ɏwym]TEq9vz}MϡRߎt3?I8y_qo_~Izvf7'gF_m;#֨.~ԟt*4; {\ѹ7y>? vcx8vuskyry~q +-⒯o\O ^p /$lJ}NEǷ#G75?ݺޮ8x. j^][SH}yܿښ{k3~7w~Gbī^xrZJ8psr^?qWus>Etc #]_=_'=vW޾ybM$o5{]ecJ7ﭕpΣwͻǏmϻ̟=76H﷯Ky+VC77⧣Soǹ;c;_[={kI_v-mWd+=R_Σ_;;y~ܓQy9j\S@k' }rg)nߖx4s]}9_%f+Và3½/ӏx8Licτ/9,rZE?̹m]]=7ކ>qp}J~ ;o~?rG}VS-_'jwı}[M+}ie%|7?b jW㻯g=揅$&~Vʉ |.1m?\J^z>8-+#)cs'{s^ҕ>Vo\Ӻ}}g9x;~,sv|V-1|5;r^\O<[OX~+=y'$ǻho.~}Σ6-O7:';w`=Aɮ'W P~*j֓sy/sng4mʏK|[|O|L'ꓝítOm Y~i?un _]9ϯ;r-H2;_x4?֯af~\I;X~//翳S^\# o-}aX39@ƾaֆAֿ}e.qU|DN;>[T._m'6`'?s%?x7tr=ܣ|ir _ X=O<283OxHI?e~HKʡu8qjܯ~OVDa?\|o-?+}l5zsŇ__( ?Kd. K]ymC޿4yFN҉{y@yҋxuϗpuc'_ThΙ[:lGֻ 'CW~Ta.;G;龴~O qOԹ'/煍D&uh;W!= >-0~~sƑ|Ia}R\s~7-\IkFηGt+]JWzLU?1?qsNoOv/-췛Vҧ"`[psP}|<{^J y;NpxMq2.n0{= ͍}VZqt+}ipwn\1-\͌Qx>x8q{A88<8wzmݧ٣ŋ(~nѯvo/E͕W?gvViCfo;gث=aq!Wg6. /\&c>]~JッtOB{:8AsP'{N}%-!^I=7]¡W8T=MZ{KָßS땦ƕ'7]:C(z׳7&w~7W_6Ρ˸OzE[?~V~RɹGCqW)'kC^p<\qa6y?i;7Sn!u*{{ GzOyI'߮|C#L;cP>1/8з3c|MoN:<qx/^y0kxʝs/=_܇fՇ?ud^ȧєzZ?2O8Kc=V7.L77CC>N㻽%Ɠ/-~09.?lڇO|gȕ%d>>'_rNbO?wrQ~˿٤=fPq:ߝe)F#?󋰛_wܓ??3'g\s~v ~Bw7G;sɾa߿V秋jO;*/9ǟ>.~?IW,v}-~F=?|ɞ'⌲xF?S2Q?J.ڻ04{/^΁ljƛR{ƥJSy?gzQ(}<4Ӿ!Wi߸(oSq?~u>+yVj<<+>w̏9t7 j9w뤴3!v1~ua/57i?:%X#9?WK|ti_QB}|Zry/=Gn!Cwcƨ~Qw^1솪>ҐOSS_f_|o }/l?㿭)o_7yvg>'_?o~(,|&|6z>~,7=x?\h*Hw:+\cF?؉Ɂ}F^rHlCdcobګD/~_%8gc{lK~bkN=ѣ|7gO=8vo.;ywq^a⃔k{3%ύuA?./׏'ywu^>~W?&|vxߢ>`j3ύOyZ.~dћ.7qȧiqO;>q.5٘7gޙ֓1ym ?q:ezkgpQٺ}w(w#1Fm|/SIbgŁ]ܤߺ&ߥ7mn?^u6__w&Mﭳv~aW'L']3[qޔSPyO67O^^ο>ca_jaL޾}tF/^?{Yz=yS~CSS}~}ܐѯoy<ȵrNyk[>o{^_r*N7_ȥ?qZ6Z2'|{:|<{VܸN/5=^B{򳯫WZhGFno[c^[ōj?s~"жc_z_͛⭇^VFwZz|nqU\W "G>/ևW|}7sx׃ӞzQv|./r~sԋ=+^:_i>-OLyzawC|g2;K=GG/ODlߔNq+>_sy枍vM3¯iGyz}:o'^FoO7}YtsnvU||U9_ϒ rs>9, <_c,`{`G{GMg|xЬW9Sg]qh{K=x~q˧!șJ~I#zU4.|2om&NwF=o >ͳnuo[Fov&.ne}m:_׼d<ؤ wVPc޼59Jmk^4/~_19kKsC7Wϙ>~O#u)+}i~L]p;N c>^C}Oh6y\I+ߛw̧)jG~eFoJMZ̃^w z3z,kt> wRzHRO/I?? IOrw⺜uFί{WҞŞ}풙GWG>e/7o8gob3>:p:c\7''~t'yrA>~jV.u)eOvc΍{|}o#4!yi Əx^< Jt7;|_q.ZqOv~;_lg~?r9ufY{W҃:B>zO:3x-nk?ޏfyO+oc ~D%r_RWS^'j Sϰ5T/)ޓ psEOJ WfG2y^?pGG cΦ se?gy>pi=;W󲝔W -_mٯn9q^Kkg7X  Wx2yߥ>{a?S;+Sbu@ӯ;%L|cWboR\f|ib:7KzǏPw{y.O;C/07q}C7S?-c3_Š--8 |oMqG(~_SHp))RM~Rf?ָy<yG]M_X<_OJp+z<ڹy? _?ȿͻCQcIЛħUhۅ֏Z~[&_M=0IB&?sW_kq9K>7_ i~3W~лʛi>$u-|崯.=l1GC9&=ƺo|Ώ24U޼4úH@ݷ#C>i6)=Or9.Qyyj׋~6۽$r?Gwp?9Ɖ!XoOoϙtv48NMڸɤYz;jo{g W?J.Ӿ}጗i ~ϸ!QC~~c|B{O /ߧsܽMl<~jnr3z۔C/70GeҾO}_2\c#ߍ#y՟s*zow<{舗3Sr#яӔ9Y)/e}=L;/z{ߖ?.~zO^ϗv'|lg#O[-MՌӸyd޻7ᄏQ֟7%q9><"RD$~m9yʿ1{rK?9>f|ÉQ#{wIϯ_|o͸AS{xOgOk\(COgƩ7dJ[v>~=OP+74a{_M=͟|orpR˦1pR'_%?ٵѿqrʋ\GAWFR?iqФ;#Ĺc8݌hQ4Z(RCޡ?x?1ʏw߁3ښ7H{<(^'wr}wSUk/<ԋb7$3^;?ɏF~8G?}|K!_0k[CΥC_G(~8чQ&gGzoGhqss/]ݩ\ʷ9Go[7{ѿ9$#9}DžvRoד3Q;gw?q r@/NִO'ej_a O7R_ 3g E^OP{ʴL>r 7ƍ1vO~Nܴ7ϔ>}7Iw˃6Nz/vs >aS Ozz?Sc>823zw^G|y޸wW6;iÔD?POڵ)i'g?O|Oi7z6{|WݤlN>~Ooyg<6~7/bJg~4$/{3J/}5 F_T9߷Ͼ |.I{Oo ܼ8]3..|Grp^InXV\ڤD{xwG7_.w½iZٱ}LN/^)'lw?z_=+qiy\$Qw~N_=n|kt^e_=J=z{v9Gdw׸qMZ )S\AkwӟHnynM_C=szYǛr%WR=kbd?)/[ja>iّOJ9F>o {<^7zw3XLg>O"tyME}&1I y>󫏼q-9x [[W>]ڼ:_1O/C~|S 5Ƌ^i|2^q7ߤ{q:׼y<̉7'9y,ugƻIɉ}P?;ڏ=`!O푏Mj D(?u>z_?_9KG>wzW-~ԧ~~:Yw*3}]ܟ~z'<:7zjԣ}~K?Ga 9>QݛwO}z_[OsݳW~W(>O^rv/(|y߽?Vs5Gy=!Oѻӳ?FEAt|_~ mv-; #򷥞SH뒟=!k0~xV1tgHs䭾 s=;ʟv9JM~ֿ#_^rz_i9| Bɍs339o o~OO?S~v<_{@oyN?DTh ֿ\_%9G~D~M'7^k!E:LTO4Q]rN޿74Cϓ1_f|_I`-Hrﳞ#'Q[|T8Ӯ"-q9/~.(?kܽ_[O?Ϗ||0ލkCy69b~i|30ƭ~|G1חCq"%O&}Ǿwљ!c;wKBgo[O57W*'8Whx؏N^iT{Cy<'=;n7s;K˟\>ws<~{Ot$S>>/M[>#%ٿf|ȹ~nm_ m&sOo;=7E^eq}m7i_u(|♧?7Neoaq'9>kSv!zعovL>vy{룟;I^+=اGVΡqOB7cp3  \W|y-4}G?/#f{E[~h~IWg/aGCK+}>qѯ~&zߝi+>oGXw';?~?pҧ6z_\ v;u{U&}ާyj)]٠[Hl(\wG4&S׈aǢGB^@>9g\/N]vӡYGkdfk|֟9OF},ßE.qvnvЉqs[.?Mg<7y,юK÷\^≿3_v(_?㵥>8iOt&㋚_im/^c>O6wyS<>-G?{#hzMsN; ݽ|ϛι'7r?[Q(zęMl }r>jyΕ22gzi7|[:oȗ:oH~WhJZz`_Ըwz=xaku.q?M͟P޿?_7 NgÓ>[_H_S=|ދcMfyy~ezO~Xޣ}(G^T걟r}7kO&?\ =7ߧ﯏G~N R}G59]:ȸ]V6x"q?Ih7~j6{;4=NϿ\s~({){wօk8zü+1x;֟9rji[V>-L{ƿyA\_i/ȸF'`5v͸l߂bOQ_jŽijN3[u#>Rom4zT?m5ցPS޷?|nW.knz_3]ILpa7O,gKz/\fI룞3y.ro.+pT/ AncǟyKC_ҿO@#L~T~#:a?~C^[yO?z~"Or#/| P-ӏT׿Rcˣ鯬~F{xzoXi_c={8U +~ާ#|y:kjeuE䳜w+=`\z`Omߥ?ॡƃ_o̡F}ve~c^kS~:Gy?s}mv7m_`]~|=+r_nnIM~Oؗ٧ڛ~ P|{*O>l8>N֙!WF~7J?v۾{/qttIF=?y^eyV2;0~ ,5U}/‡{VIW|=gKM&>Ky=ןމZҏ#99fU/[z}O^>tߏV({a IGSɹ,^!ޣ84d͎ǞO _-~j~n5E{'6[7Osc9|#Oa^>xxP~١kW~NO9q۹zmKO.7LyOQG|_x~ w5#wh>U* ~k_7#8& KtYP=d^1["+;YgR >K1nS{;ORB1OƏ>/ xGc^i/κ@yN~qggoCy3=Կ釤r *_&]ȟ{,+ޖxiCƭkܻw}#-]yMιB+}IgP:_r1#yO7!v87#ykgqcGO38y?yeYϛ7Ru])w3||gY~9[iO'ySVvo [맴z#7׽hƸi%)m}?7w##_v/?SKR_os=kl_Ot`SsR_}N嫔cojSvٿܣ/&߷v8LvWv]x;Ijُ7x{me/vHv6܁jȵW +Oβ^tϙ{d8ti#9_o[v;K>:K}};־ʎ~q.޽GҸK=[>ݤ4S{ؓq}oG`x'88/K>NK`/N0}'&r,y?[\Oc;*G?ٍ_WmC5i|C~ g/~tCg|^ƋZ?A4Ϻ^& o b=117xU?Ok7w1O5|k//f=y+α~zR~?+>:b?k\;O_8o߱0ouj?~.wJWw 3|O/L-ܢ`9oWtqy{o}Ի[[ߣν~9u.Uqpl/IR9sUZާ|﵊pj|y\og{l'[MU9svpwSPy^UK~~6&.s!]9w=qYMfy^\4;aqlIÃy>T=ɧH>|?3/fO0o]rxpo7?+oz׺='&qC؀7dn?r:r:r>EZgqd "DSߚ~3Voy=OziUZU՞j> E4&N^|rRz8#!.ު7+~*w{u'GT0t7S_ӏ?)1'z)g'7σ?wB~xG 5OÏ9P\ϣzCs?e%>t΃;Y"/#O 뼟F<٧;|k=wgxi})vGӟ71㧬tEE^~&n ~^^ .瓋Ñ|ϴcg u߻\a0Yf+K}o޼{g.vw7#Vn8y!ыƅ>o?#z|x'忛rQ_oǏ?F _/;zsySDq=[W)iktύCB4~U怟_gɦ\KW|5u(Z';gOƍ~vIO'>-; ?>- 7Ǭ7r9q1N3~y|rj{>Ho0勜zpjȫ'G~D~+F\?gmϙggh{ݟ3W:)_oR_or9k+V>n82 6^[Kwc.y}+گ'Ⱦ1 ~/͎>+O=q(Ͼ5GR(x+ߡeƇ=2C\o_rU}{7r/gB^Lf~v)]Β?FwG$zOw s^W[깗zҿNx&ݶj?f!Op-9\9#Oi#ws~ 9w>O>>m!.$Á8pq\x!x8&߅;;/{໦<7Q'qͿw?'=y!ᄈ\or8=|G>z =;[g7xA;eL{W#/A?cz|HnrD%GV+C/f\4]|lj{ˣ̻=+a_e_Ⱥ>us-chmr~_f 9?7(9xN/|wgv,|$}! ? A?M:|O.|5^"~=>F.y߱o&{< |ok7(Fދyx>2}qK F釶|Ѿ_[H% WKm[Vh>p_p$kx!V0|:ԓyMqf-/F:徲q{=WgyT-+:3?SG|u?KQp|g~K6N]orۖ>>}**ѧQB?t\ 霘.:O)Q|{iЖ\sr ll~<=ۻۖ>~촇$v]υygbܜ ٸs?[~碯Qwy wu;ύ?Ow޼W.{Puvh<ϙdWݒ]~BߚUqm Tbj{ϯ OKz8ŗBiOi<~|'Gx8߃wJ ={xw\OWCqnιWJ.=_z|Ⱥ<<~C߬V2+=~@qgX߳/qbsse//CJ.=ۯ-Gx04~1YJFףvO󜽐}e\_^+=zt?.nX(qm7JZqA[qC?ңK,?0D_O4qh^V+=t rjgqי^ЗsG~/pZUoVzti-cُ.8vsOi?au7UoVztgE_jηoW9ϱ7l}zңKkWorחztDx9ogspSEϖ|66S?}٬@o-kypOӟCgyg׆^Y> >ߜ7Fmbo6.\nZJSo/tqG 9tź3d.99Óst=à8VY?7p>ЃS;⟭-I sy.?yV(>[Sr5s-7_u+]wƻz~rk~?}:gOzqvYno;.=+=ιʆF|G_"^{rYnOះW~ă;|ǖ[ݪ7+}tZLg"?=~0<~vD_zGK:|TԳXѠyߵOƼ:"]dx{}lSf>\uH}[>' pWw\=[#^A\ BՂHy7@_힜'r7&83>,}~gwym7RSظoyξY#n)}>qK\Zix H|Ŝ7)Rn ?3Wu(n<>G^ ߉᯶}WoZ=ʼ>5^[XOzr|~_+nvS }>9U;׹YЛCm7S/Ng+=q^ʃzݏ>wyyJzV z/;Iطn>z}(Gqޭ~>^?\M58xkOm|AJ\ ;cxv]훩G7~I~"|_ڵ#|/]U?+=81߂;냽,)陋sҸ>SPa1ޫ5kC3Om=ƍ}M}xN.7K*n'R.+|)g}Uo˾{hgyhѾ ԛ)#ՓȃmY?TW|r\}$@ZB[qq룾}?P_9xБ5?ټdͳ)oÝߍNk|oG?ϋ!~zF}y/5>{p4~~skG|/GyW^Aean."^ԫ|vq^g]vsyvǟ~qي/k ՟&G{;Ҵ wr#pVp`n=gFrrz(=qCHT޹s𣼤F*?穾Wy$Dz8y|sߟsËS r G ¯̈́qeᾔOo>nr{'8?ү>Lo oN{y /{.{)('f2#j~c{=ӻ5.J7/red~:Ozw. [X_H׸)LύځݱQ>˚lɤ=I ~Я76{4Bse3MwI:?p&MNml+}2i'O ;{L:v]~}]dϙ;%{Lm;w8mJLˈÝd޶Hٯ%9rgggg󸦜a߾: 4Kr7|ߒWPߤɤ*#Gٿl|Jr'eU>oyM5/4>&9WNG@/o*Ag{ۋ?u,ɣt_@zҏȥ#Učyz[,N꫼~$r{be>ޞz_eh\Ww? eNƿMmJLZ&{ٝW޳ϳ#P^ᱷ_Q_=/q/Yw (wG~+=~>e1p0ʭSA_Eg&xxz_|*7+]?}w\T?Uѿq}oE[~Son4_NyΕzC-rDA44_$sO~&R9;@_32O~aϮGC޲*N)}zji~T{BO&s/MMO\Bq>ݤ/-w$ٌqޟoqMsj:O[?Oׯ;"w·WOT5ޚRKڿ] 巠~BOWWY鏠7YwP978ˋ@K:x~?'K?{P+}ӧ$J>^Cy`/q|˯<+.O#r|/弽l߶}G^/Jnw\R7;Qnqx?{SmZo?u ?%=|sA*_y%yn|\(Gz<; ?=/vhS}܉C]FNU־Zגfyu2_mm}GȾ!͉qy2mƳi9)_(ioΌwq>Կp~abGJh|MmZ| : ,(ݹM=Z/7K98G<6xלM>#K'/?iY=\%gNt%'}CȱBo[)nN=]{vßL:~nniF򽋯܋W=_={Wh;pw֎Ͽ]/cVwHz}S_#7|c{s4=%[o'LzL~/\9|g7%fnn?C{,ıq,~w8JO&}ϡ?^fវޟ_Z|g_q;|?{_ՒߞU8v_ mΏ~P~ ʟ,zr~ Z'חxg|w? 9'§KB'p5;󳇴W{xO?SN.hЧ>&92 /7f<9)E1ܝX^ʼO/$/?܉8F}UʹߎNҞ_sq5./[?S>}08ا>E>O^qS=GD?_Y3ۧOк\vWVxwFk܏ =Wy8xz$z>¾{N19J^=q׳?~IϿ/[p>彰櫿3~&{FzvY/>Oh&=؃f\e̽oOv+vX?1 {]LñH:x>O>Į/Їb>o/aχO;<c^var}oy)woK?nU>~rZȹ 6y1o>j~\E;_1&'zteh\[JW?8,r"ϭG˥?#Kc~+}6i6i~~p4_%]s\|rbS߶q~Ka߮g?K?<iQKl[Л~g?=-$q7i3A {lu?`[rO몽3׿x8JD?;]qfvy{N4Liz۸}8~gϓ?t;r?2'w)nϒ>s[ ? 'z&擭|o黰۞iz@>Q2"Gus) ?=sky̳O94(]r~|XB_>Jmɏ#7+ggӒVMz#}smۇ Rwf/}n{oOOf|%t#w~_?z~>Tʷ {87?—}oq'''ϕ8ձWſwc~ƭdRq/;}[Nғϋ;1{sO8OSЋo|K#]\k2-EJ2ϯEn'qRGz7K|O*Ѝ(7ڒmJC/>q*W>\zeܫ8zC^Wΐcrmq}+=J8uz-ť y>3 ǗzWƿ#΍zS:JyQ;gg􂿯{x+w}'泾>GWσNΑO'Sc~||ɿk~AʵR~fO7_g+,rX; I+y"'߁ƋHyxed+7#tҝ[wO\Kv(.?M=Ϸ=n+._\׏^CW{z^%r]ބ|ꗏl7?=ʮ 7׾+?x =<){ǻ??=Ǽ1q1yow?v7ow_Sϭs/_{)K?%{%#)mOۧoKwSϝ{_<<2q]L'n&qWο祿/SͤׯcJ5C<n727V|Fr~@Տjqj.j|#4'#sz4kF;^=W^'_??}=K?%7OsBߢgy IgɕJ}דVEg1./&|A/ǟS> _}Oro}_t|g<ǟFg@RW<<'ҙ\I =)^x:O_OyV;~j_IY_5b_#} Y}?׶xq<g74cps֟9q^|/ze5̓ő77<[}[2k`~/Wr^N7eu~6.Ϗ&^P+#z>WRq?aΏ|'xmsaP~Kߔ9npGJ=>Wz\!nW?A6WA<׼o\E>P\bƽpx.g\y86ҟX]\N}=q+n>Ԉ#Q<)~&0ڳ>H9)WˤS܋qbcwy3߯q"oIx|GyrK_On韖wI'Nϡ:3ޑxꡟ⟆MbR;^6Q}>zv]5;{|駤g{ğvF}2ڳ&=~Kj׌M/o{/gH~})W~lwyqq==Mg|?xw7r2tu\x/~%\Sy?J4{6,|.3{Y铮qMC!>vScS{/z'}{|qk'~82;Gjs'8(K}lxp3.~xaO/ >Wl;s3?ߗAόzg7C.?ύt'_$|3F9R~zѾG 2i???h~(o3 ߾Cwr~5דϤQ>y&G!ߕo|aiCy2O8‹yho_|I~7ӭGyShA&w|ϖ1<|7 ?vxc?<:Û?8{:|׹_']{ӟwqTOׯM>m^].뱾|]^h3nkCϖ1_>Zbυگb1ه8ڿd>9ϧG+֕I#}Mߒh>>Gt״/wkƾ3/H?4S=}T^[״~A׎7nړtGbSv>$_VǮڟ?ck8=%IKOo?};;ܳ.$ZS.29򱛱og0_?An~o48w݆qPvchz{or]gؽ+Ѯ13_=ǗOуsv8y<۲ﲏ/vאK{O-':什rϡLT9#;C>~ W<Kyppav?;~;WN9"œ%=y$[?*'`Ͽq4VȻtC~|J?1GhnvKK~_}7W/׮8R-}*oko[|'r?oGy;x^1>ʟyR͇ W5)}>]4%ʡ7m7}!+l?}׿|p (mQG8+Ni]yvf!uyG_iI_A>'cg鿩^vF=zb<~繷Os&ϟzQϯ+=Do~6m'q,y<ᆳ?ȮAßo/W{W?k >1h'S?Ƿ}ɯRG<~4ǧ}b]h/*|߿]Jާˍ\M?ś|> {GXғCIkwx8M;k,k:&a8cvjv*gό~Ϗ3߯p8~w7rվ1^'Sp)gp:_:'78O+J;?߿㥟S~|7w8ћK~;?_O ?3燜so\3\/yϿΌs=_K<_ե<?EtKyyNj?ok?$\S3Ҫ7?HV?ߏ`|ZK?>8ٟ-߶<ʾ{)3u&p{ߜ|px[vu+0p\F/~g~u(\ُfij_8JjgyaTyκq|wRv{n 8vnkhn:Û//Ea/UI8F^v˫/~zǥQ|ңh>wct)q#{]pN/_Ts=fpp)Ot8gUG?^/_/4ϕ Bp~{꫿o? tkpvR#WJm;`\ӎkpwzG ߍ~7WMy@y8hgڭ>RҎ[pXag}gg\/A4.IrQ8hx{PrH~NV·w$ov+P8mGT~?MYɧ=/zkgy~s>XI?QqjYaWe+_NK>R{6qU/>3y+"%7_p5.ƵR~ _PGsyOoNSқ#|i'~:I:sH>2?3Ư|}sP\ kJg߶is/>מi|y>V9w?G=6޿/WA~{|ՏHcw_>r?}lF:v ßa|2OÏy=ܱZj#=uCSʇ+,ޕYG_oM|=?|?F~ݸ˲1=%.?}-gk;}W>yׯom}oW礕3ۙڥgG8rΝ=n?%xu 7;|J >_-;/ȏ8 vL*nfK١}a7i(/#kHkwۿm<r{^k\޸;!~rQ/wP%.aY;f=6^W.~l9; 1e浫'@s7߂'{bT|gf>x|SUK매cT^%_ ,,~|NQ^[CՏ~6iz+7z-QkFL93Nb?q+q7ɏ~vS6Ϸ\J .S[Wkn}+]c{¼ۼm?2's|[JX;0Gݾ G_/+v&]cώt©7gt =#mo+},zs:r^5(~p7't(vY޶۷ҕ>9?[kP۶۷ҕ>Z]\mg>Ah5mÝrDÝٷ>4QyJbZ|hƱׄ.v%9UoVcn'g g74>tÙ hzS>'zs찞'{YrdyoG'F?[Q½W"<ǫo¡7(q\;:)x͸qppƿk˟P?2P}^j`W^-zNT(Cx r!T=䀼aGe緡e7| 9 UW Dܞ[r΍{甜/?PȞ}_=^ >f;__Da~xyvr_A?)8/ѡzLjsrΕ~8zSNϿ~};5>? ܜӫ߆y?ɷW#z?wIH9?X{s\`8;oٵ#=9":Ou\9_Y3n^f]3+q~XxKϗgskдK̽zx9m(ؑ=kG<<\_kܔ~ ԓvo羼|W~o3)WK>{]yF~vIoε\O"=?`fW?72n~ _wsʉVNq{$)/߁8?ʧGک}uAH9=vU߿}y^A{9y^·5Ύ8<3Ak8CB+A?ݻ$,_׮'>K< 9i܋y~|(ҏs+|6H/NG$5%]4/齿_xZWF ;$ѯI󳽡5_!9;ޟyD9ҽj/_y۽mW!Kה^)?r^hrOg[ۃ3vOڇߜ߽9!C?t-W:{YWR(7~gy|_Pqykﻨ] ~/h=E97wo =kx܎ԣ)A#0޾#^!>/[ԏ,GWΆ^M>&7wz=퀜JC7coy==RWB:|G-s7/3?8_cus۞QuI;^i1^ƻ<7q>927^h^v~>]7%!O]O] 5߳>^2ʱnM7Cuu~~йyٿ67?|rOn)>.t?}9؟ai}_?_?-_t&>8ey_S>?k >u}gUSi}ߌv|]k_XWOݗ<㬟k*%kGdP ~Hza9;޿M9E~~6+sg@rISϦiL>exW?)?z`,r_}Tď~N~>xƗvG^|Oԏ=rd\^/{ ;o.?v-'zSDb/N!۳DzA/`p.Aῧx~MCIi矎3ƪt8Mȧ=ljQ^}gjGkO U_Q;<\}O|S|C|^U+Qvq!~csmQD 7ދxC%#-qjSιQšZm}Q9 0rpE7Ӽ/q(e{6M>S'cIo[tz?}}9?K|.VO># "WC3>̹!igmrf^Agl}hiE?rGve;+Ge]X_XMmtwe_7G's?q'wޤx@|i?*h7e~}I7_'銓~R^kƭ7MK|%?gXi<4n8U,ﵫݍ68G*TϏI;~鯎e}?S/-O:t5So9^|Wk>6Ou{xTÁ )}Lz;]Cz엣peg93Ӿ7K)qC;~6J݈=Rgvm[.tZ_w헡m] eeZ;|㥜#=ɗc)vGˣ_{=~<';~xl+~q\[qsIwU1Xf}Px0__7%k'pGsd?-^ڕ|i5m;=\?S藷8"G{߶\>t'=$78;ЋqM>^yRθs};(lG#}>+~{w>ϋss|Aӕ/wyKVy$1t:gTU]kt-::\)8ܛSʷQ/N}_+n巼-ܔ+]sݿ㕾n"+r}&类z&?Ӟ_Տn GA(^{>=N>^77;wOeq|:PvrոH^OnЦ_N|c=PZ<҇seգ=8<'_qWq~ 0 z4Źν8_6 ~yչOZ}5g-qΛ5n1pvrҟ@oL ' ?ٸy(Nt&.7`ƒ*m\olʅ?tEo-["#Ww\'yy)5=oEpGԿп/;+]<7_;=[?~}jg%>ZY+gA_Z;>0_ͩP~}e ?p7zOsx{.~2W7{\/8}2*/~ji:s8Ɖsq!ݸlI'5v\ʻ18p/$~w?rڍ#}mo#^ j=Ɛ#zWg:q=n'.7_Iu. 넎鿰7 }q}emy}Rhם]N_'Ͼ'|Z=gG?cʳ>ٔ3q=19ں{媇>o8:_џ33K*G-#MOW%"HlcG,qlyON|O!qoBc8 `U;M9tkw=q_? ?6rxp,p.p+/.+!#k?wṑιKk^;>ۖ'ΛsW 1q.{<{~ClKs6EwbYOq^8zg䏖zZxz?r5),S9Wޗӻ֯<Ra`/3l[^Z{sNՑ!vk،{Wi4_]Cm_PnuWC#w''^7z3Α<׏/R>|'\dzNoܵP~?#ދwJy%_+Oo9}=篏t]^?|~M?32)Sߏ8I?̸sυ.kCo1yh~ȗwwM:0$5x_"OCO*_Ըϸu4}'OCO17[JOv_4?SO_pm.>ވc./d^4}k@>WNg<<wm?3G^SIo^R9uzͧ$O)?<烿g\Ů>/ԯ땏7h>nB{#[/#o~[ot\\֩w#?D?eݚ7×^/j .Ws~,ݟ‹f>q3my<*ub)+د~c?;Îף>vq-o _CCKF>%gr1u[i'm<3g؇FP|F{.q񲞕ٷk;'i]G3%% N=^'83$S8q$=>gG jGqϡ8ğ|)]8}SF}?Uy?•@a=~ٯ+z3s=kO}x͸E{s?eRo _%]Quo볇W$G{_$F;;wb'[(vNv|GpZn8ϲ·M?4꣗p2΍ۛ^FhSm|Ϗʝ_7Y۲?n8)8ɼoPzߙeۖNqjS +Byj^w7f5RܜxbGr?^y~_{҉O7Jߞ_ߋ#ߌxn\ą{wYc׉f{KC@wM|%wK;䯜?<{J7_)N/t{CoG]X3?O4x,.?K-mYW%yusC;ۤ<޲c_n|/snyppt&;y7?x:ͧN%=_H7#|ۖZ/w~ؗY{~,wy߾Q&} ԯ"9OiYǷ/M{}w鏹7ìqAɷ~ϲYMR;!V}?[a|kag`wyuwnx>sn;䟝F9Ԯu>ع՟ʝ u.|?,vd՟~Osrzu; 0  _M=0I~|^_~OaI4+~{f[s=_p>sy{g>z|QS-ukܫMmJWXc,t34y;A}VJ r:n?;1OJW$Ӊ:}wN<_>v:v[#H }|#D:y?IC~zңG}N<n}ڙ'>T)UoVz^_pc){9_s?sl{Y%uzGrsz{7Я%ٯK\|ެQC߿~k){9wcKqW_{ZK7v\қ׿{}׌dh9'!\!xѕ(=?΁flogsu,xڶa+GıNZ\'s?nSyp;Mp_JD:xoG-vuU*rsV8Nx)xc$6ϊ>O>&aQğ~;į;~o2I^ǖ#ğ룭?Q!(myViOwӹ7/?*O^m_oOg,N6\O[g迫WqgmyYiry Y@Oїwr՟y:u_T1o|=7ϱ>O'y8uJ;/nnٲC^#);s/9_Ǐ'Lo9ewߌc8Wy+>>Q)n7>/ʓ_ߝOOOSN|7O\42yjϱ~hj~9~DC闄ƵSrФvϥ8@?^ ε=coDڭs聯ڷ_';v{9߸wk!߻y}{/~Oݻ?î~=z#suwS#,?rx.OGV}yhxD3pr以М޻q}Rϭs/8,|>&nޭ3+yOO7=cor>{|ş|ү?Z׷\?q2!p#ґʡCEZ޿LCwiro?o۟!GΔ7[՛eƽ${ܼs噷IoS?[?338q \XWXw1껂.߷?K8?|6⓬tzc=zj3>@Ծ᷺e ڟOZÚqtA̺sSX};W)?|ֿog+C?C۶tIkwa76({\G>݌83YipU=GqN&sy?hb{j圾 3>f;c8|o[NV:Ec*^?YJ7ho}n: .><e+=~iŧwS9G;N쥞f+}(?ȍ+ q9ƙ_;JW4PMYt=^|?^g+}iq4g}I{΃ JW4ʻ)s/#~4u}ҧ9wskiQHsަ87k%Z;[W荥|\sؕ:8Icv)uµ5pҋ `_\Cʃ|^I??6e9cmϥ7Iow+9msOL͏ӅWwPgr{/W~-9Y4n{_nB݇5!8>?co=3k|?ki]i Vÿ#ܟLS?zN>>GD_tϏQ_{3N,9הoqyЉ ew{|.Ⱦ_~=#Q{c?y?"̸%?bIV?=ئ?|x9?FѾ__sG]Ki/?LڟWJ;?e=ׯڦ}}_?VwUm?|9!7޻Qw~+gOr9>C./l=|_ݫ8ӓQ_|{񟫿[#]e/i~ږ۾cC_>m|i#My}*}DyIyQ>~51'EFқi?b~=~?y~vܔ??Jy?syN3W3θGC_+}8e6YaB {'}>cy>w/3Z}Y_GC7Woe;}}?'5k9#ކTmwqL3S߭Om84NɔNsO7d\?i;uQ? >ݑ=Da@|Li{푎JN80>Fbf_Hfזw~ho|.p'ԯ|yƟd懌new)G}R}ʥ!o̍7ϸpo,QxxOx}}?xȕsGÏ۵m+l=my$yeow?L9'?e/9A_qy;M?^o)0:WOԣ?}|鏉W~7ԯ}E\լ-O:ݟcՌ92]nҫƸrN? }q?;yXcޢBC돗\(?hy5s\\]i7[z(O滸_l[.t?Gi~Od'+\ Wc/%$//?Wq4ɧ ύz^^ʍsmX?귔S؉Q>L~w~vڲԮow3|n[.tE\q"P}o}}h\Ä_Iʍ|q >fg=hQyٌ~TuNsӮGLcrӞǴSɍ9ӜLY_wx)XgV\n^z+zq;$O.jg9ُ9ϒom>v$vv|7~b'_{|7Ppl~rb+c/cawbGzHzI?B>^\{q }tdy7;?7>\*|U>S?T+O_F;xoOb\W7y_|pT'8Km|hb6ދ^LJpiC}x'=|xOpU:X{q)YyKrOy. 9L{_+ʧiӿ+?xMzGNc8ljC׾y`𙾣Moܿ4s8P}/ gg{6Am/=+GVhϮ@;;40hgHS/ǿy|(==4/<(=642w~z%=Oyx}7{|?_(h3~=yq]wUeo=_u<_rz?r8- _ڧ$e/Ѯo/u?,ϋ?7}Jy#mJnw`_8FNϝTos_|Tח|Ƕ:>yonؾ1N>ڿ>|دϾ{j1|myX# XURƕ}r%=2ϧl3B8-a.;V#'۾䃋¨_ozIէ֮ӎ->ec~{r`<35+CgN|xk@{p&Qĩha&gjFۖ>ސk>}cЫדґStyO7g[F9ťo|aߣ/d࿺>~N97`^_?7'v~_3.WR_ʳޚ爴\ҙsJWzyZs_g`>،}~r۵/M깿IWs^r[//^-8 Hz_ϓ.IWmA}{cnXh߶bM/<; 2ӎi5HN>~r\((;TOt7~_Pڥ7mX 9崷gvߏ"xơ+y(]~rQߕ\ecA_c/VvN9ӏ _۶\ԫ_\WYenι}]r0Hyy5-^ _s*f<]x>O)'_0߳nN(OO6; !VozkQ>Efk#gz0Ro_/+~nOA?tet?f#]㋆ո{Yn˫~_oRތS9]r?6δ9?y^OҏtƝ?_4юkV_`'>?}wM?i8{sͲOcS=$Jn?aYtq7D)O|4,>;a3?81i/ͷF?Yύ?9Gѕ> Ͼ ?PצW}87K/Ưeo~ԓ/*[)AGԜkM#G|~K9_-9SaGվϖxQɳx9Č~+c86.kSث'nJ3{1ϓ^:.w!~s =\8l|#`ꐏ_TB16%9N;9/ϯz{)/okWߚ8q5q~+}w3G{'yݛ[MǏcܽ r^_7}/r~;wr+ׇOiM]yަ?#owӎۡi׶c'뼓}w/wۏwywu7L{xH$[g[o9/?skwٯwۛvl[>Vzxu|F}hfgS7μ¼:d(ᪧṈΘl:<.~͸Jx~vNl?yO˥\~83&}Mb笿J?{xKyAOs?!ތO8e8"Oѓ5&,o#ӾNڗzhDo=_hحYǤq~J1ZKc_[^w͙k8R?3YvN+}w~oԏ̯'G&{fڟo&юώ(?4y w{~e)_+\5n'Տo_rɾ/ӹ?w[{nS_}79c}O65r{^IS#^Nvُ)_ԛ}-=S|jQ}Ҟ?r? _X?ԿX_&=?^_׿>v6kv|ۍ<yEz8Ìz[;z^9Ώʗ}ii?'vR<\SfD#_>JlZ/=?P9?xҍig_=Я;~z&~W9JtRrΦc՛ۡw2_GO9C6wS~Hzo}>ޝMۡRmeu^5mPyw}}{8Jt_=CE|Woz׍1g[>ȥЋ;(Ч}H{k7v nzs~ȓЕOmқ1ޛY4mދk~uG[G\<1PQo._~| 5׻mJQoq3^{?pp~sy&[˽}o75 ^hW̽}.q >~uSΉۤ{ ݶdƕ/{~tq6AE;s95^C횿?KmJ6n,s%q/^9t7|ya/`ćrs?Te ;n7-^O('miP~%g<tO-~~YO5L_H7_;+=tߟF/?w\Ł8PS/{{iS/gz9/zSݗtvt ߜ?7cmӚngsO'vW6A#.<_+ƹ}\|)ºYѧW:f ?qs^l+]?7V߆x~/yt@67sKY7+=tAqt/{#_'>>~DY>vW7gƋxc_s~κ9m+Az}}neߙ?Px7Q74s\o\VztivDo!z8 7Z<\ !'~(gwoCcjE= E\_f]W\߽_qݿx' {E^8'ތS1nm|ҷ_\}GG.׌_XyɺY҉(a$h??ґ[ ;Oke~+'ljR?n9 xeϳ?NΛ8i{zvx9/[/kԟ@8zu  x;qI_~1(`8y߁CNnONE~!8W|iܑO]r[ p @l<'7gGWGt2ߏ>>I7jwzXf4=ZtgY̰O!'h9w!}wq ?<&WǼ˼q{8_3.uN%w 󩞧j9Q6yZW}C'8okiOc{k8zX)OoOqCYNSřt)?߉[!cp1q/.ȡ}m9cKFC8~7.Wߔ.Ҫ7U_vѮE>'&q|cbw25_vz-G) e4݈qTS>;cG8 8 _8|_I_7nǪ73]=W{4qFw1r Էč׳G}w]n.]Jȕ>՝WYsxYY_FW|?|G=?'~ÿvxo+]:a>\ߩ<xu6y>?sCf3tCOtUpb,O<6e3AP+yQ[՝_)Q,o+Z {ɍӝWR{C}xJ_\ROYwVu<˼?<5w=Mʇ[t.z;/332_G֣|/7n{VdSl.w39?Z)6a?~._s#~[m4_tJmz΃1o{02]>yfi_̾r/ILiRό ^h<=H+]_}_B#w_yZ䰸<_9rO@#{鯛v(CK}I:/ArTokkG'nîq-|^|Y~b!gorǠ7fyB~= G\o<|_IxIQ?zeSVY9&KhI. 96NK4F}oo,8QZz.1L?nx&Nz8+kٝWkʵ_Rcg٩/~˾sy/~y)>ۿM=])߯RϱRo_J ZUBz}Χcy=s}r3e+]鏢7|cg \VJo^ypx19҉3rWM$?`Stca| M}VYcF+^΃rY/A7C)Ώ=)^^&~Z _+^`+cU_}? gq>O3=ӼxOkwEi|[.>8F> <y k~{t<ԃ⒯>Puv6>"]<8+}h&cc?}}D[}R'x$c_68gjg/wo;+]h#WӋ<ӯ|돉(S;oW[/7k7Pn>K}ɦ;/;-?'K.gFgS/pG㇃? N Hbw~Lq Wtѽz{/)}yŽ7㼗}G^ќۻʏ z)r{rR ?냿xhнį˹׽ۻsr{9tNon(h97Is{9]~n=c9[J/9_~Urΐ˜{d5r:>]/=Mzc&G{ko'v>ce=cb^tz'/K#̸y~Vӝyp{xAeq9{qcĜ+3/x.QbMxAO%?ɼoswoj^ڑߺ{~{rI=+.:ӟ~9)wu3+ܜH}X[|Z븦I't_z߱}IĿ[vG>>Z|~^-zYx^aϖ_\O>)<}G{7TsvVN2nR}ꎟ}=~np2?nn{ѳR{IgQ\'W$y=pC/Omz8v_}Έg2)f/~dA\vsHwa{v{v&q{qr?e=P C;^)'R|/ׁ0^c3ԶwS:|?O9;l֏f>[*>3/>(7o+WSsx 7R΍7;>8$ʺxvd8s\֓|}?pX;vGP)goW^׉O=~OxկݤwtC>nrtʻ_ 8֞1WF;@pGPyw^?\x񝁣U>T|[!:*8(r-(O+Yq=_Iozڮɋ=rD~~m=U:(z/AnwߩU,ǫNܨ|Qyy93<,]G9ŗϤr/r+ͧLJ'&.y|gʇ2o_7f^7.0s|uTۛu\X7qH~ }?'ڏovݘ{|V~|~!]]#Kv߈/xw}o~s,دcBʿ~}<f|GwO#/|ߓ~$ݩPqU>?~忰)qfw<3Gd#7џݧ?2T'܌vM?N _3NoCh=7æ\sveB7i(}icWQnza??-S{|ˏcK9gF?/v~ R߫{eW-e7b,CBg1NR3F\_ o~G{[~<Wvvfx @~nqBٻ ؟fKsfUNOcPNұɾyg>{%%i~^^^C>K᫸ >G0gPv']qEԞt|gx WP?QON~PD1S_r5 ?ҽ3__:]wg}zz &v;w鍸G:8X9r}_yesEPC|ä{aRzG6[ߦO>;HoG˃c7$~5T|_#03ޘLvCF\.?ӼGpWϟ!yvcENCiݫ 2NO4~;0ۍwko>x+ r9qd|*ܙK{ >wjC7_:</C_/|wc礯s?51}ןִWڡߊRvuu|}/Ό+g7ݾ]wpsp^I_tpZ_-gmc'?ZuϔKN_8YgŒxL|<?/BS}玊/؏8pOڙ?&}Vr;m|4\w'kߦv#GG_\*~OﴻV;>'ν2NiGbC|g#~egxI?YC9|pp_^EpBg7y^P.\{q83ɧ}jo/&lwԇN~Jy|ԛgG9e'V}asc?9M;e!/߄Be!s{#Ozcנ{Cqi_)ФoaK p?_ג@&/M;~v7F{5?YM| 9\Dw tsȇ|ř[n{iqL:BʌwE_SOx%_ey?VX?;Oye%o ~|y,cC=7_R|q~I|6ƅI7~2n[q;A}ono O_;\}N~߸gzM~fz~M}%ON|UqxTKO(O{5*o!C.?_7_i׫ }#?|Ao˽y5<?<[ߘw_?]uQ{˕O7ҟ|?pHy7u{SQvL?dyhѿ+<.e<:yoC.ߩq_j{<;evvɗ=o#;_q|S^|?>s\yrGʞ"xr Gy?pVxk<7:|~Gez,|~lw*XG;w_ n-]NGS^5x;|çw';|/>o8Oݸ߁3>GG$p}Lۏ%k mN={P(s+^(+S; |`~uqv.nu~iǙ4B;>|iv?6<*xPv#؋^S >O|ם?'g?9d~:nC;.vJs_{v88/$Y<`ǽtʅ3ΛK$|ǀ)'WG e_r}y/ruc{o^C/95.FS='H޸zmf\G*E{kiKtÐWn f~!_?woL;VzЛ<Ƽ*y!C>'<ѣ&K>͏o /лkK-^< y0S7Gѫ+7sC:úx7s?Ys{X^ҺAyŋZ^[/\}=?s69T7'v_65go#Sϥ|ߌ+\,ƭ=6ʃl_o䲝/gdg2l[>VpzXtPvo}l jog#}]gx>׵{D?jw?ѿHOμ8_T(+zfP~Q9ʥ| Eyw~/r>r|iryH?{ONӛ!w)^'zg=G;Ssvt߃F;_0ci#1{˼1?STR;[??ϺG9?QA{N=_&iЮy߭Xa'ϽN^vg_oOTNRor7ղx<޶\{ɾW3GPry Z|i<< 7P])#8)Kp+璾xo姜ڟ/βxmZ<͌wE>k$<ҧil|Ȥ^p4[.8>WO|1v|X)ͥ|y#ǵo+}iGג^%ݤ;rompEhSGz'OcO/w}h\<_7ȗwC_I7Mo\yyOh&Zw|zͼUoV~zC#34\sgCW{mwtaz}wG{Wo:7mVN?‡/ZO>|L{i+Z\'?{uD}F~q)^_J8hpfztT>8~{+^aOBwχz~+zĹ!c~Us/9EkvtCew[4̸c1GvtCuDI(?ϯ}lxP9~i|ҕ>Ѓbw {z?Z=z9+g֪7+=t\Fb ?7{=>fGƣk(=އG~s}@Ew\X8gd?_o.ңK{Δ9<߮~Ho?9o)ϹJ>ࣥ=Yi>}|${߽?ҕ>ɴ|}grjUV'7zq܋_|j՛]xw\⸉8j5uŢO_x8⥓wz1ˋCB^G<< 5/Qʯ#?Xih/Ū/B?Gęt\k|k?6wr+~{iqfJ6Q2_gx*17Po/_ ^͙uHsL{^mze]qMnysf{oߤ߯>k>ڸߌuhdtrCM};=ypU◠ _O'=Qou\i\} :O+p>K/hޟGx̱wr׌gg?UmۓN_6}mW|G S;x?u}0V8=&}pk}7XmۓNkMu]:Vtݯ"c3Ws߄_0빵G[%QM|=|[Ggm#|jƝ|77i0r߽Wc w.TK=t+wxDY &]֝o\8w߻OґuS_|.qGObwcwT_G)a՗g; A5uu}:reh>e^nyлKP!8n =>(^8e]_Ee;+~z0z~v+^K7/~9>tNg8#R\hO_\~<˴3/+^΃~O9?)pXpnpm?U[&xrĞ=!W熼S+8wvKܿ2aWk>v}˼)ߨO{~_}٦VQ΃n!oj4_6xN7Ws+]v&JW&2Kppc=xcKxk)W?v٤;繡/<8L3zAo/뛕ne{k$ϳVf+W>8czHp>,]XrBǼ0һ}I;υs~>~[M5K{ʒ~nٔ_\KZ?yKkJOY"p1pq3t3 PGvc'8 xv٦'YrN[K9<|a{l_JOg+~G漏uğoso⥝:g=í>I?\w}֒~elWx{zɴvv٦$ALsδ8v5F)w~=ٔW?KyyJOL#jlΩ!~['?ï|n t?Gϲ?1Vc޽F^U[xjσ~"=~VҟToȻWOm=q7'#2}n,wgO[z7CN=΃&qp{t^ᖚJzO?t>o}}"PVos'R}SΧM\gRoTqm\~3>_WرƼ_8+/.v?٢ųqau}Ӈ8pyG:q^_ίZ?QьWuu՗nQo7*Co}\xy>^rGݕ'՛!ypx}OwAzEޘzw_/n+ItN7}/]ه+M~=7_;g?sp~K>VYh3~gnzL5WU?rPﯭt?%_v7Y? ?6 >'z>rؙVJ7l/\"H<2ϕo½/O/\hѻ7[w3s٭俸wM<_{;nuSޝԗosIp;ҎP|ح{7tmh~5ܣ&Gs'f,ymym_#H~H7x/TtYQ3/7.sKy%+N/%t ~zU)Ⲟߕ>Z{w<(|"<%9dkTތhe'w呎4J|=y(O?? 3;oik{qz^C0N>޼O ͋/sfw=qjSx"S~Hy:z.&afbzWK=Vz}1SC*~;W9q,Fκwē_~ĿYT%(j,~gS?Rڮ:Y{_K/ 'nȮ_OyJ幸Ky.^ዃ_zsؓ pqԯ|}wm<ʹPdoE~W3Hxq I9pSx+Ew;Oݤgϔ޷>hʹ?ҧ'};ir>@c~+= 8"x=rnc=e5(ߺ:Zѧ?:a,c|ې|>g^Jjy'Gtk1$(,_9s+}h@쾙/P{n޳%Ci-uzG |CEըߛ. CuF˫ެrqLw\{w߻=ɹ[~zn+= zPO{~ojIvW7coB'nA-] Q\ҕ%Zf_ePg>{m#@ǥ}f(Io`<1?RpJ.?)8Mv~P~Nib{eynJWChBſ8?08'qba$߭]Gu_`Gto M(՝~z0S#}n[.t8ķ:yMo?RqsE;qCq=o{@.g`s3zԿWm׹M|B8xL9)ghI:&}/_S?g_w6r!\peT_#g\(n%qN#S߫xi_¿M/{=WI8gWB8hϩMmN2n236N`qGS{qWkwOz^eиdWFMku/ts~.Ώv3կh57F;o;rm|i .Ur+MW?;!~~B 7F:ݘ4՟ƣ@~ُi|F>?]Yi7߳Rz1w8T|S||O_~W_:rWM=P_qX'_;sGxqVzޜO*1ZYǼ`s{&NSk]w^yg3ҩC{G~WM>鬧s6cָQ{Bmߔs~x4em|is߮~'X{ת.Z7qm?J~4kߠ?,O`Y>}q>~8f#OO ;_ȣ~qzZy/}Ə`/GYJNk_a@uӟ߁ލ_ƙ_}pAcW8:W'6"E:vT(҉~8SgGO5(E>wݙY;?-O:]_#w.o~/ p3,;7"rWıoj]v}kOٰ)?yr%tX[wH;ׂ/߱#үY/_ҋwI7i_ =-ſ}c7¡\Yɡ|d?gҕ>ސ[G<3Op9[{2AYs+=:=+.,ϛwp٤vt7sm=w7<'W:yҕ>d>}ʻ/ ?(د>XJ g^;B6!;ۻҕ(zULk7ypf}qIYSD~h~BLW!9J QL[a|yYd=ur_w吝tGlp0~=l>@ߋ/u?a+?ӏُ~szGOP/}[_6m \zN7~k_sj[ ~qnE.ngݼ7ɸsmx6n.x/xӯ^)xWLW8IN;rKwNwuƑ|1Կv_'Nowr^g9yz\yZ=ŋ %WЗ3S{Ϣ͑iS>y׼|O~ ύo;^_~!w?\5]y{r3wp{ww{xp~j+l]1G1|}cˁo'oeė\;op)텛O7ϰ8r2˂_'΅M=W䗜O OyPnőo<}~&ʣף1S(nBrK<8z+~ύod\ٹ!WgGQ.|<q1 Y:t"﵏S)W:?%Q;'uvo@?˿QL]wVqU5#gF|ѯGgF:GȌܓo"O;U~L|Gz׏+xH}'xjGh}Pg)M9]iӬԓڤQR_})'U.~ԛ~lc?F0|ܯӎG;8}bދw.@QG90Q?34}wf ¨^{o{{O탳(߳GHDtӿGK>G~~ o;~Y.'?_{ߓߗWg=eR}\[F=YIMzWGyw3黦ٟz2ԓ{oyɯ4E<9?ڥQǸ>_94>hk#5A7|'.q@{~?hV_}~ٿo;ʸ]1^~3/O;/>o_ s? v@'{S}Oێgc9.d5ʽygQ M}W[74]֓<Ow~'Folg9%]~(OO>a_/ʼݺךz6|~+/~-?s,WK:x<|io?}>M} ?_}6~(|wOO?\+O9wY^C??iu7ߙ~We˿(q=2j;|4oqgey}Ѯw3F9EKo)컏}ٸ~I^gOcoh 9nqE9K93G'.G?qxOM K_;ڐҾ1wa/ʭB ؇٣oy)LñOXJ->/떽)N{c,/nҕes6't%c:O2ۻҕroA㼇/^+RӹҧO{p3<}{~EϮҧ8ѧ7CuVo+]鏧p÷_ppO;NG:XxOx^M~'och*?ppyҿst z \ś놧c]-}?5֪7+݂8_sD7N'7ҫS+~c}w?㕮'՛9nsz\?=7prʙ~=sN_׫t+ܿ?:,ЗyP:OuʵnW|mJMZ(?(~k:}O=rgrmVYOO뷆ߜ/"pė o }~xտPި7^mWl}d]{ϟ|iSoF5CZz4~gvjKӝ?yyU~?>Z#Ǖ>[~!oײ/vj8^+>o718:O[OO߆+p9#NS,7w\8ʓrugd.~ݏ+}u-િ9qG#|O'-&.@,z1|kQǕ>HuɼD}s_Ha{/=>M9_? mJKɼ8.^ެt6n]䫍^}g3 x޼_=/f؉Wpvl?A9|)w+kFz>=gj|{v^Yo{ܞU)N#O AzmUuyX~qoa]xi;qg\{^scW'mU_oa{}M'oƳ獿xc>}#O K9ߑ⾾>Ҏ˽ gG?z){_d~g?`77/sQ/6r[1ƥq}9䯝F#Ͷ{Viq=O~,z^Gtұ{ί#/8O_GwGd^Xv\}u^#}WC#^g{]|y3lG?rnvi՛;_;%WM^3O:<gw)>{z|Iw]I#lg/z {n1ox1;n>t~^?oT}Wago߳Jϛ߽5ZſIyOe_;st^R9y%|m|>O}Tƃ='r>)=#/hd_]QAK#]ɯu\3<ݥP?:8r~i܋J!tW|Ï \K^.=TO83kFG?_W߬'/_py ӆ˃\G <8RW/~+}rh)Vu 8ֹ΃k? R/ê7+}r(?i7 ˽uufkYυ"|l΃4#۰Wk=ߙ{zW}Ÿ?\Kg~ҕ>ϯ#/[} N.sw`{WQ!vVmm _S9TKfO-M|Y>yp΃޼|?[oK\z>`߬tPso%N}!y͏\֫=\◇ͩԪ7+>q#OZԧ;a䂃**/K[ѫoS kuhۧ5rϿ ޙ5Dyp՞pq^jIUoV}Z|o9>Q8xƋ?s~Pa㗰q)~='-}9f9ypUq᫔_}hdƟWs?{i߬texvt$8ͽA Ӳ笻_+]Pl|?v?\׳9KhRW#8vׇ|K}ZJW}Z|r]UGMywJ9|wsK>溎\?7u?ѷw\sF鑸SzqpsC=-_~ҕ~h^"篭zGݏ~Nu7νf(;tѲ|[W)r~\;rw`+NOF~j6ϗ8Q#'P<^zÆw;~-?jgM?-m{oyJs yUua[ͯs::r|ahqM%|T7ߺ.|9O+np=sj)O3}oΗ`lvz9}S' N~SWB/.p_;OOR>y.뛕>W~\EόcyqO.#ύgDo?75{M̫ٟ'ԏtrg}6rЯ#PŇ|Qsk/o'G8O/C/O'O^izM}ځWnx;XW>K[M٦;w:Xgk6DƇsB_ɁVUsxsA'}?飯ϰ>-]C_Ծs鐸O %? }L2NMN<)~?lw)W'Ǟy>N:~?_<dž}Rݲ}mOkuzXߴ-FB~g}u:o;{e߱sNdo]O}/ }/Ͻ]z%N{LQϬo@ W7۾gE 4><s(2,_?׈W@G_=cxk+gܧ_ٿlwsr>;ힼ'&J?^y7]o#KkZy~By.\(#WL}9b|).{^18w}ȫ{zH^}wr}}K(߬rTOW^_3˫я߃7GZns뛣]WߘLю1OyZio_j[[1Sow28кasR~5G^hߘ\$~-3ϴ>Ty~iǷ#Xdr[;Čj4zUE>s;S{>Hþ'=G%;I:xd>l[s64Piز?۞yz|'kca~מ6?߶|?>!/K/!6 |v@|oGP3|+kp,?1acno1sܳi׿4 /zW'xz<˶/t͓Ff\={׫~W+CνnQB~WnòQ|">wz/KMrrKn};)@Ml>4[~hzwkO 3myzV(i獡|;_iJy=]_'W9|B:~2ύ%6P_L_q_@z~/N~)_j ~r= =ϗi`C[뿖b70.)>g觡ŗG˱)~>\9{BH9{ʈ._GZQ-6ώv?t jzU{nUЋ_XwwIof5:0ұ1ϯnx<'gGy sy;9j*)ޯ]@py,?OFbz1W_ym$z3ҋ5C'pg8ΫNΪ_W.QWW7/=3.e'ϗWw|N} u?-ǛOvw,>I~3cgeXLKK~1H9.lǗ/'|=8t.8ͺS87lkIgȾg7>o0(>9@pm.'Z3<ўܾپN'N%ퟯGvx\{YԾ"V,e_~O>g#_ =.3Z339w/C?M4G{>s|^ӾK?Jd!/qǓiGg'nj}} ~g?0 Nz>kߖ^9.-.]_ 7r1|||}~r {_[*ßWRvje>Kz!^J7}g_/,Qz6"~ 3N1zs_5J9 {Oȥ+M|u*x?H>|??ڗY?7pSǖO?vQ(vsZQF{pQJhg|[5mN#46j3q#o"MT>^F*+孫&\÷{}Ro{8ˁݱs /mW<ߺNy3l?֟+dGC:ϗ띞+ly_*ଜ.-s xO>]ahL+ϫN'xCy/y郪7]ʷz6iy_~OGyNjE9qܻ /{+;Ӯ>=ufԋ YWҕ>9ؑx6=C߂W+#+}rh4x w8!7ϣnJW =; O|&= {~=W\C{@|瓏+}hB8ݗ-6`xn+}rhXo,43~n+1YCkjKd'=a'<ǽnJW <;E-C}gKf \]yx>AKeS{O}uuݰ?g}WuqþJW8aW >=S W ߗSn;t#=ڑ & .ZډgʎڹqCZ@?߹*!O4^z7Jv80z|v٩1Aώ)@7k+]D>Ã?QK^}*ru)as/~q>>8lWűR4Kjo>\UnVu?we9x]I7{Gt<~V8Pz jǵoHr&v/?է8q_e+>ZB/Dj߄O6`o>;Lj^v^%X?.b+#\?V҇w&r޽|O*N,#$o^>ڽo:XJCv]yȍ{>CW0M/||&|ҕ>TJ_o 5yNo#v+ßJW(ud/ VÐ'0GO-N1>ߌ}"zqv'+?ټX;E㻽̹Taco?S?ܦ!7%?Aا%;O||4[SwGo@N"O?aby{׎oOӟ\%՟hٰv%]p0_ni%O}юggCkj@ko|:_gCۏ#LG:`'%3-tqCN7U{+5'v˿{J{N;0YώpfYnq._G_\{_=G8{+w䆟L՟x_c/P ckyߡzyrn{0캶~>Wy>*?E~=?{Wfk/zm'Ymkc<^|˜ǦK.z~/pr&?CN~1Ƒ6L?#ޘ{,?}wΧ+7r"?~Cտ^_¯K[yaB^>aQ]?X{>WG:xwv!æPGeOoّF}_5Ԟe'O?gx~Z_~}v]z2>>ԧ{"mqW>&>45ٿws>nCS^Ϸ!r_~?K<﹀z;Hy%=g*:z&?$4O>⫯ziOӥ_;?^JL~;}30"=wbWsz:ze[S̻#ܢ%My>!c:rQ=o3XoWzMb<|)7ϡY!rG%O.>/~*i/| 'LOB\ݼ+Cyjb9p#=LX;782v!AoL}jp Gᒊ+Pt`'VNp||'1omO wǺK!_V'G8W+>ɾ 8:r/KyI=9#-6N8+MnJW Lᄞݻ]^~^j] o\ϓpq ?[\Tz+};O>r^~oAΡrp=rNpc=O[G+//pfurDNȇxyWYC':QSr/jc]f#VYCbr>v~_W'ȍl'uJ{5{_;rmppw'ߣnJWkFq^PxZ~\]7+|,jpgs~TcE,ٹz=]ʯ+}t^Y_v7g2vyc&%K]+}hq{  {7~P߆ 1W=JZﴳA{k&!yTW۷F.Sf՞J!v/?X>{,ϧ.ҽnx6{/Y~{b>:(!3dz-d4v6;r?vL'v8~QJW# <߬/?wW=ّ%~:{va8ʖGO+]Bnmxmk3K]~g!A.+qGW#!1v9ɺ>~>b=&"Mr+;k+oj_o_JZ&v_3ϧ[N} n=~>~>o˒qΏ}f]Za-?OژP _~x͗Hyey|[oƕJ%{'n;LZK䧯~/]C9\ }PDK>3[F9+Uiyv$^!vk1v1wH_ܶvS8zq>]rs>s;Yo K8$v0ϯoڽ$G/l6~sC'?&?-% \\>u'y"N'sH5.(::5?>.+k,lfo_+?9K#>{eȇ|W4&yu I{,ϙF?+%߼=SC<~s_|;|)o Kqn 86Ijm@UIzqдGǸWq;~J~i:t3رqOӔ~a_KʡO<ڟ8?yʥ!)īT&~#jv^v\gCp^Ip^PBڳqj>^—Bx\?_&\O=>6>0쏣G>:l|Ƹmo;]?~K*]M|1×G://۱}'[K>o|rY({Prcga8ic]d$uu]}qš֯x9r&3˷ ~;wuvl7zX'ٗ.aǤ;?}q+,]JL k7lZx-F|s}>%yިtmo|;Կ6~~xε#v8WPNx~`Y 8OM}z6qիeީނބ~dnC=Ϙvܻ|YÅQ-aͳ.i|z¡iשG!I{`W?9۹,nAk?g3Y{9s8 orǏn6 ?z=|V;}cOZ{TApq~ۿҕ=z-MqGϏI_%}2QJWwMMBO|88$~+#K:ms?wAѤ㧐\&}}>~8|;ߗ9ڻ;?w<䳞1;vǰ9m;\9o;ȽףIλ>ݻ+^幚'soyZh"JYGW88r>V }|O`N*7+}h Nأ7,n &5h>δ2rOS })&ntQ,>~t0^av٦VҿKnmN.s>z}59xG=VQ9s/r3읱5kuǏ_CŽ} gKŮ{[c|vJÂyq>~vصafcn  sn$^N~QJWwM]ܻ;N:??I> <\moV~oMP|wSTNo봕>~t^h=a|>S[˹Ynjʋ|u?t>sGV{<;W},W޳輍]ٔsҕ> -7C^;$]ݚN]v%at?~oVЭ1{f8?x->--yM*7+}Na+JXϋ#絓t>~v=7߬K;ž){EBWǁ^3;={_߰̿tǖPUnVQ\{9 `Aq.Cl/{+>m!?zO{a)7/nZc?짱GoVڧa߆{hw:G6'=O[CK7CfG?K<7^7uJ \~s Oח߅#?즱g8I': 7S?OnZ>}z6?a[2fq&|G+]Q?lrn9M-řFo9;S9+~{+]H+Կh{gO\WKWVyhq8-gKeKga$Yd *}&b|f힩rroAˆ^#UjC y"GS;slj֮+>ڝߵn'TW| ~$C^,>f0dpfpc_}X>tsTQwlɯř}wO_+/Sci|'{i-'~C懕>=}FvیA yK~4'iA@xiף=N-7S=S gk;Dk/v}ڑG>*c"0oy.sᯬZóI9|~>|NO)_O'΄AGЋ;FW{F<puٿG+y_:7wx˃?/~a ?7_yF;Dw0׮ӜFɗ5)7?T?xy~|]YGXdxE/Zu|_>[4V΍^ӣ=dk=c}|^aixuKYj8>~v? ?\>9ﻟ?6}:ϻ69R~\lŬݳӾ|@~ҞO6ϝݽsѲ9yιISɇ5|ՃdnpXomƵ8.{{Ng'^ȆՓ& ӏÄ_soO{z/׹s'-W~ҡgF=~<ʕ>tk/ ^?p]7\HOߎ_Zw=[|MGv~ɇ_^S!G??¨ϥ'ތ]pyYmx[ی;ovfd|w3~Dqvy;N/|}uW{ݽ~OI~~uQ!/~nr{JzKSww&#_'7߯'IW[~{K~y;*7R~cW; _Y|wnL~S~͔_A>a_hZ2Ց*7?KZgu/8c|{fŅ:Jy\ϵk|gae '->.nw::vNtw7Y{S/6g᫜wI.}mgmp㩧~UOCG{n?ctZ ɸi'Gt!X/_/ǭă}qr/W|į~~藣1Ńk?߻ojzfޝ~7ҟHnjG_d|Ń5n^_~/?|%_i|>p0w&L\:.>3hpFp7xtpG:7y88^tc^_j:|~rġ9xY//\rGz)Ghy<{e:g|}yqcGȍy-M[>|'~w;Ѽwoo߭rJ}dgqKSդ_~AώzX <-gGy)=%_\:[?=`4_zgGG1k}~u#x_(<-7^^I{G;=U40}Ons 8ȹAΫr+|G9?='fN /o-khP{@yqxk~oky{Zo{7->ǹ?y[wIۉ'\lov_R~lY{;γ|M}n~O~'ݘ4əe}0KXtޗ^+%?1~1ym‡my#WΕ;yKWH9eR^ƽѕߦ=qq9n>:¾C៭[w^뺞\5$8N~d>}o9^~MC>lkQ}g{=o\fO;=OGͧ*uŹ@;Sx3'ܲCgQ5MO}F #_\ uUK>k::;j|=ځկ'Ӵ=QQJ'G;ӟgpEz/ 2|k}&\{wʯ?cBS^Do>Ϫ<|J9#ћʯzs?_;Ҿ{DߚpG>q~28饧K9(>?, ĵN&Ӟ\v%?[S_;w>SQSV5piWrO73rq;:?P-~~xCӋSvV{rw7v>e>q g1SCk2*7_xӷKXQ[Ta8a/rR~~{%յ?EuuX׾VZݻ;v=j8KCnȓ•>NFG|<)Nv3=8ڣnףF'N9Cj]=J8WWI3j{ie?NHڿp^}l%Z\,8[dy/< zAQveKͣDwo}?8ݻ;v=j`-{O4X֎!9ί+)u\Ŵe]f*\Ɖw G'}Gݎf=ឧj ؟uv.YYu5Z{ap'u~v N/g+9ϝcfPxw|_u^|`?ٰtW٣H+4ͱ+d=w+Ώԯ[96߽r_J%+ ܆|aׅ_Gȿxp^{Q_}_%O&Z<ݎ}\(ں~XKOp_ϗtKOn}[ J]Z9t[~=Ds=?vuzγGwVs/O=xQ?zywKgǭ/o'8@x@tGeHyOcYG?+}i1 ;??^;ON-vlNs%ƒg랂x7y}șxnv0ZߠjOX7#&vICpwnuȏܰi}ƎwcYr0vCC}s ò?zVz4jɰ?OU,u.W5NcO96/}ͦ^#>g:O_{)GӴ?>]t7޳'P֔>|٩~ykw3=פ\ݵ W;S~L.'r};/r8頵;þI^,iՇV/F/|SI6 ԃ?wZVNC c/r4ҭ?P}>;[*eOn_|)C|mw|rm(zʺN{i/]3_P~ݭZaO߬Bo(y?wcOoߛt7 ^G=+y/bL|;4ҼPx?H߉!+%C3U$7c6P9e9q\K_αbnR('`}dwi_`_t~c`=di}hfGWdUܼ0a='QV?IO%gGys(~L:c{ko휛}~=ɟȞ}xCZ9rowr'n쎒syݵ_ey+}:h%VϸGWD޳+mhz?N>?넯O}aԫ~9oi[7GogGo{fٮY>8xH8?f?=y?*{Q_&|X ]q~I֟o^Үć'bO >_Ivҟӿ'\Oɾ3x/©67p?c||7^^G |nɺ8_|xfc;|p>t3_/ȅ~ y? 8;ʈ^'WR3OẮv8;ʯѠsQz~Mv}|̓Yv78#a]=~?O}>&o;:~/ǭO_qp+ ~ĻI;]gpMw/~9^ RߴS4QvxJ|r1>3y x{.<^|\W#,=|W9׈Gܯ̓=_俩g]sJ߫~_7qGF2!G/FO]~&^DzMqGncǧ_;k'R_YgT.驦r>y U^{B/Wx>]TWGn%mz*B/r(#Jޡ<(#.B8Q?rԯv3^=v.,sr\=-+֯GvCq|9~:_}q/t7WτOSg_; 2[;?/w-[4}|AOs6{𙷪c@ <;>pv3P8+᲼[QG/쐇}n'/^)dS Re9+]L1/L< \=q߰rB.Ǽp#;J{䐝7oϘ3W?:O^1_{g6-[Y^Cnٹ+#֑p8ggyzzѺ`~'`Qrg}~>؟N[~3~w]~~p/O{Iimؽ~Jw*f;S9OJW?iq_<68O Youet= MaemgU!w[VJO^";vj+h&ycs:ϥWp_M =sE;w'زܣ>ڴ^HO o3oZO?Ek#^Na T~o~U<,GLx꿅-C+]8 ~/˽у34Տf(M)Git\~yC|r{k;JBnǮ9u/>8P2WpGʫ0r|O~sz.>|ip jlsa3C:ʱno:*aYYguft_ae6ug9W˯>7 |~M,_'U9r|Nկj?_{~o ;ZJ'>^1~u} HTI9g \[_/~W\4\tn;{pxp7HGE_Ǟ?ar_opo^\C>?w+_Jy%߽ʭ(0ĕЉӻ8s9(n';y>JW(ӝu{)n{'=eV>M7:陔C>>>ԹDS_sG?yE<=Ojr=ҕ>tO-.)r <{.9{?/ϨG+]C K'rS{ I_PiIO_5;!_~AO봕>>tkk;vU=#=K?'>J#әyտgM}EBk?lyҕ>t~ Wo WwuȑRq7G+]Cɍ{ ܵ'<>Daڭ_ξ=JzO}87&Z?}JZ= IJO'|=(;a'ߖCYCk}:JD8=(cٿbON"Ǖnf?ww7,モ족{v2fn<-CxMnoh⯔W;?|{k;W[{; yW;p1sa={[gќxv^~p{V:w8~&;pE?Irx,G,HL5?#ܳ}a|=_kT>1;pcMl[:ϵ߸П|'ݔcqYQNۏ}WO'}agݍV|IN{F3?/|fv[k_]pc>?5%s<˯ϭξxԫ+]R:_4nC?G3ܓsyϼ'YeɧHG_<T~\|uo_?O֮Ci-?~?ګ88/ԫ٣m??J;VnE/)U_?&gޜ:7pg^{%®pWk9h_IdX ;g/d_A=_;֯xa?>?a/Q;7x)9o?{%sʌ3{2x)KG=y>_W0; ov|oWvFǮ <zVy4Ҹ֎Ow^[cMo;>~ kc|Uɷ;.[?op+"O¯?__rWg{qpfpi9ls6]wʭ=*zʧQGh|O[׿gW{3yּ7|Q?gSgp3y:۾duys `rE9QY7o'L8K/? =K5 &֑7bXnJL8/9'y<oϙN,O~/KOz?~oVrz7g>۱DGy P}y򣧡fzԗH;8ّEyy8v8"cį_PbsH-rV~Wz!_M>x40⢤+_Ӭ7*+S|Q<__wt5r[8 rE.68(`8c~K%˄~r7|s+; õwo'޻yq۞7aNv_~gQJW;?;[}\)?IO~n.y{w-].+] \4yo3VoY& u);fߵuGv_`o?>9}[h<oaf-߁]JTn'Ξ_ߚS]:8y湚sy\t]>W|W,^o6ƇKdC#|?S޷Q^OoB}?inU'MxגJG>{D߇;`\`GOaI?Z_wz~>r}^ԫ>YmO7>{3;{H<`CJØz{O[ǭtG*7p6qЛ8oC=7R⿾\WfxءWG}{ÿs8[T_I }ˣWg?KzN8;yJ ~O_xM k/a8c#9RIOxN;wRy{e rn~vWd؟#]3;OW~|zJ4ׇ/y2yoį1v6lW;nկ$]2Nlc+="?D~B[o锓h9S[\Bw>~ҟn8ogW$={v Ⱥ+,_.~x+;>wVW8hOۗևz󉦵N Jn}E%\{3Md?3ҳp]P67-K=){3WW!7Fݕ>Y r{_vV=2~כۼϹZiΏn|m+&_\9#erv֛|ϖf;{쮽͓L'|>?onYAw_U]^y(VkBh&}+}173xXI[?oNO#;ץ{ K#L~{uN)ץoQ_KگoƮj?퉦 NP`߆Oe?u/'{s%az&] _<]5uv#~ qw^,ɢ-GN7d^ݽq6O$ x^[ˁϤ{eg1rP{R'_3{nCx n\Or$]. oﻷ/LP{k%٨_޳[ڵP჆>xj^4o:x+?]JW|?φO9g\M?p: ] K\JT>5¥6l=>yﻧ4x:xW|ҕX^=|Yػ |҉{#g϶ҕ%l{~ƿס^J>9/9ssvvK=ZJ 4Y!¡;|o%(WeC>>BzHzNx5+P988knS>tO ›~umnwp9ykȑrsʩzIVzt >r}~^_TT.g+=yto}[~;[XQ+}rh]{{{󯻛ǻ1^kg8dwۻҕ(rJݻs?9C+~ ~,uvώ+]"7) ;ߕk9Y7ol+}rh,lݳvji>98e v@//|رev@#ي[Dk}i؟};~oVr.v͆rퟱ#CgōIC?s:\~jg ?U#8~oV⻲/]20vQ@Ӈ/Z7+r_OVš,?~}sݽ;{wtG|-x6|'OWt<ԣ$ځmP첷󌻹WwwGD<_[&>d|IO>s>.&A$;ou{ gR?~q&;f^Uu$c7= |^V_`r?/~<ʑωMxk?mCٕzxpQJ9ʾ^}|ULNWx⽲3K}mq ߅xa[NN;qrýgǸyE +W|Ro8 /-ڎzW5b7oإh ?ސ|?vlz0w]7{cYʣzNӹue1uޏuz!1لoƾ>ɾٱN|yL֍ٗq>a>κSXA ŧw.·B>yAϧ|m9Wwi}<9&.?]=J[#~(hŹݥ}|_@WxQx΄wDB//ٷ.ҙ<7_tCv5.Y2%97o9=ҒX=({J;T?O}O'CNjne|sA߽,$ߘ+wo_p-xw;卵gl1?ë?N}w1d?>QJlxg/ N< G#?~*X{;;|k>{z琻77Ky{Rg=+r۬{ٵ߶y,)?s!9/ܶ'y)pyg~(>N:'ie~G9xhΙ9N9>s5'hE.zC|Fʑ?=;<+}/'%7>i[ߙ'ZΘg]QJ>:ن>?d}M{߄/NZ' ?e]'_EߟJ>C~կ\ ^X=_^xh 3[v+}< Y*|h7x&?^>?l]>{rtl݁-mt^iWsv_}iHO/kԿ&yb6yϋkK_wowrory$/Ο$LܙޑG|I/-߷R?re試]_KZ~qfmo7S՟֯ L~y+WSʿ9 3/ҕ>NhQp3o& w>ՍP<*_+}|iqȾ{~V"/xwnXD_?sǾ^8_~DG?,~:\Zg?-;<1rsGXy[qJW(QvGN>OP n߬;~r%wţυ?ʹsr'~KCϵҕ>δvj71>N<뵃qa+}io'{O8q|u_'v=z܄n_<  v2x>_?9}U]JDZ= =(=΅;t~ '8p+]@׻wW}';$_@q~oVӭ_ 9G"7🗗uVҟDncqoX^tF^BW'g6q6(knYu+~gO=>E?ݻ97pjqwoOߛ>yݹwbW.R{Y#r [x+}hRC Ro|q\\oJ-mӾHzmn3| / m='Wot#_ғ;x,J7ݨq -3k#lwr%av|r4w|۵WrE/DثPu. [{h|F?[\;o~@޳~*hB'p9KoA/y?|}Wox~,ܯxG۩yY}ɤ !w̏HҗOq7 =羴򣯩?}򞿝וRv2̳a~˽O G_A?/>zлO(ԃ's?rw@ϧ ;1|p%8FR{3''TǩeLRko \8?O7 ɠ/X(~ݠ κ|nhe?rzL3/,SN~q);7[+f]u$}Bì'A}u}\(_9|vm},l'G.uӞhf{}ΣSW.֯@w^ιg,nF穇ziRlNo;͓L$|v%a*g_= |n/~DyWF9ʥwWbC{W7T&>~0MoNX|8{+_woKZ(8BW\eIVϡrҕ>tO'y w#oGN}g;9~c)GKctog+8Vߗk{tցO_1뱕>8}ܟޑ+TNn;(~A:󂕮qpt ;Gsvjȕs@I_9+^t3O~?O N/m>PԣnJWcP8 ;#=|𛼇w[+}(i Wg3WgBGQo+if=)mOS!Gyή{]J)y9\_y^<ڽcݨo3'~?Jgpg;k9_ϡWSz`} x95k#>t382n[ u>-^^[w>/7jO(ax'\x/`^Ӯ\䅡1se2켲 0&˹>_ڳo4c?<β_ۄ_0>gF{7zy)+1?w uo}cȾcy~bɧWIGߛG8v\&ndO6$|f.}}~aF?<~O t\[#_{xZ{ "Пd|>HO={y&vïsqwώ-ӋwwqG=M6Ka䏯~=ir9r}ij=;My_ϡ?ߤ3@8y淋Oݔ|2id]P{7>Gs8dk؍vP*OoC _VcWkfP=_#ˣ׆?s\uyKr~.__;d/{?]]g?i9~/y5:/]i?M˾AG]vJ@nK=y|l㿕S|7ao\ylRn3w_4~j~C/ 9C9Qī{|;ɍuVNz::>};$lh?3[|ߌ>?A.>~;>Ǻ x_?_o&_~>zռ3qvF+yn{~cՏN}>\wuO_΋% 9ߑ^~sK|rs$?I6ΔOn){y_%|z}YO=c\yp7מ~mM{v'8gYCʋO+j)ՇgiM)ՄO#O0Gi|F}Wgr~ #ΟX7|n§C9׎}D {-1NHgnkͭmƋ_ ?\|o%~M8o"<쉱0z֯z{ O+HϿ&lBp8peCڹ#>A$y pe\@o./w>k_J%z ^}%MwOINOyit1so/֎Vͻ ׾߻&+xggxFN!egJW(A/Cnkw#:pS~Ӻ5e+^qO^r^}}}!7{zNs)]Vʍs&q|9 wBw77]9W߮Jazwo8=>n_- <[ϗrog+}Li m{%GpB#O/\ĪYK?O8~oxw|dž]n7JW(ޗzȲ^*n&ቄ?Ͼ?{GO+]= 8q.6\Oҳv~W#v5nk#|_{@p3:-ڈO_.77\ uG_w3S#|w>ti79зS>\7XWM\=OӤWﻔzԞu@h_Owx6%D͇_EYyG{مSkj'[eПG?6!P;;7} ė'~ j<} e^{7ɭrý1Tô+V{#EjkȹwϹ}y~"Nr%~^)g'Gў)^τ>7IsXŅ^FX3~׿XˇtSs䓰|g }SjgFO1e> GC?ؼO%Gx=rs==|]գ~y>%r3M6|SS/%fJ0{n,77>/ǖ ]g>%['|vo3I?Lu|K>}l#rk?i_<ʹ6; ?O>2εsƨ7F9Mx>b(MNF6ޛzsSq }s/[6[I֬_U9!?ca4^wMy9[=kM }ٶ<^/wqk1MpcOF{'nk7dRrIÕ!~w|W:)Oc>xʟwwϨh=F;ύis~rt}c<;^c_I}zSyBd=sߔ~9}{ÍOꜦTH?Ϸ? {{ᙼO=P^z9x9m㼩/={~||_/a5ϡ|^y'{&ڧɿtR֯9ǩz}|݃ǫE'|4v_O.~0~.PD?9Ǧ'~RY.P9?5ۄvwҟeܱU\^;W_z_@lzK =5sG^=~7I>Ƒ@p튅oV>>Q2^퇼>PmWjʇ~8vbKѾ4tG_&gxp 7\וtYO488$KI$^-'WyۙxF;8'{Ko~z#;էK7YaGׯX(}zC1O% 'b\~h}B^:~U'+nG|xQFL;sy+}:iqj(\OՙW7xKz̿%ݩwuEy|퟇J.w|^y_;{ƘazGN|Ru}N<7=cŅ>8^kV ~nw]_%dc2Z-{2*RaingxY ^ៜ֏g-_u~x#_ޒgSOKx=I?qQ({V/ zt{DZҏsW=+}iWp^6i]\Z;6v=zH}ݔzǽX?IaC̴<JlZ}&<IӦ_LzzH?@}0{ynGUZp=ڟpvu4)}"Ɛ'zNL80x68⻖7 ->p<~/ ߫_Lwx>KN;i̼> $d1{Ce76sܷ7 vC>v94fCnر4_ k !'O:Gy y$pF|D흒Plrhz`SnNoO 8w.w#1{t(5<%7M>lžõk߹Pѽ{~9%?߼/R8WMs~y“~5וn#QJ P÷GuNԐ$~%/BZ~p,ߓ|oB;;'?ZAݫ‡ľ9N+Yڃ(i ^MM5|nfO?T#ԮUҵ>K=7sQ[c_}g:GPVv:[o92|}3Uov=W|۵PzB|JHIHIO/+^.^xdpE'y#=/9.^N.v8]XS|;`ec~꼛rgQp2_J|7?ё\/ŭ-MT:oc]Ak~MÃ߭ȑS'kֺ(aDzxMW뿖ܪ=er0M(\yy?. >4O_гi~} k+ayϏ4~'/G=kS|kOpirY?t+}s)z~O84w7J2Oɣg/r Kɜc=ʩ]@to/0;f$~I[Az;zc>A;?gG|ny8zP|I+^\NW(=|s 8_,z_ 鿣;Jӆ ]#6lL?LE㧊} v03zg#y~~WNr*@=ok ;6îj[{Le ܼ_ooLʩ%Tϫ>gV9M:vqo"ڗ/yh甋iWM}94ʺn{ֿu#kg3CY$='7(wTxvͮv6 ;q}G=+h5Ծׅ_ӺKa"99.:,?k}}G\!։MaݶctMGz_{,ʿܾ*GvsOsuޏ9 ?pr'_pL7oG=+hL}3z/R%}vAw䧜G~)?=Q3mpO5}Gz'} (=О&;i/,{z)}ºyi]K}0O甇W\\ͅ<];Svj#a1ݦF= |ڨ?hc 5Wxv|ۅ2o{ద ZIڛKp [}ş'?x #, Kv4j)/~6^ѿ8&쇾O~ 5<.ݿn-߰~r'O~1ɓy޼6Y~3!W'p䛝ӳ_wp#gF}8S } o̘W{!\<ژOqs+K~N|2iq^"7G+1~᮵yU=?ƇynV?v=CN[؃'7A+7ź|c]]9mŷ\|ɑ|;~vyg7GG_*OcҎSMۼn7*Ψl̓c^w~1~O{S?o[-OoOex+g%~U?i{ߝ6ԣB{/>C99M|Wk(wυopeϗiQ'A~kaCHoSnڳw;n?f\:/EE/f7~>|~|a>~mA?*)ax sɇ^n?ngȄ :tpR/r!ҮB ogkF9/4P85Hzs&%_Zxi^??vϗKt'8SG|Sk\xxկzMU =N_d7~![\aOW#"yjOJ9|V\y_SIq:yi{Eyltf=g>y^<j|K7⩿v_;c1WWƧOmǔ!)N9R~r<џF:;v=>6媗z$~=9S }qZsG_J~g\ zfďGSv~OG}'wV.?~i~yn}&+1{;7084kG#NÑ~ϬWsGˏ7?G>w{w w}{F{7%MOo_큋}[Wz7ԉN8ss}%}Q>Ohgƫ/ǽ8;op~qx˸~r*{sL;9l<`캧oc4 ?שG&Іף}ϖxϝwמJ9wt7Gymmȇ^P6~ʣ' RgPy{iG98uO(?hRn>=#QiOS[?iIh^9៩ᏼtgWnƟx$Q4(>T>ޫdžnhy?:NW 2o~#?|Fsyc x_wy_AJGn6# ;L#y̗^1/axO~',hv1ߧ=O?owhe1. ^8^O:y(7zܘo y/qFj|<'78ߺr3IGC>~o+/灟Mn~yuʍvy]_gfk}n>d7~> h|r?ÿGqnԿ!W:]wY[G nse-~Uo@;PʱOW~I bO\ܟi[OƹƱw`LK{;^ {G+̼`3G=>% ~Gi' ~*>ӽ;zN<χzS|7 ?Zt}b9.|lG|r3~EW5;'ce~sz3I?T;v#xhO\=W/f3qmk+>¯F?OgF=~k&rύz O=r8ӣg;"ybՋ0څ/G~;|A'~Q4^<8# x x8?~$ʝOmy'O?%+3tg~ |IP<_x+|z߶i|F筥뭋O&}]{aM2p, [ [_}{࿾8w{Kx'^zκ?pSp/ߦ>ذs?ur#m7\v~{H~g/"c#}@>qzKt~x/a2oؑj}94T*yN_)xP?=sG(W]{14Wv.F:#6pd0;8̿\ܙħ<{Ln}kz+|=Iګs-9.-gvϭćO|$OyN>헗iJÉ;_l_Ð+IyY[pM>K$~7~wS*Nle<7זҕ$g:mxח凌W}.O:x>޻gq+]Lv6+֑}ԴI's]pcFHΏ?J|:oW䞷IQ u{W/Q?W[y)%]ysI[;e"?(|k:mO>ICw7uVҟTnk>;519/(Nx~oVS8`y>P\ܼ\퓜_Wܬɧ= U\#\`O.6y[C^^7?8n^pqیíMWG͉ke}D'{nX}Y=ܱPNoGd_yO>5Mk>H>nYґ!_Ӿܰ+9?~]M߻OH?{$v}jP>1-˲~cߖ8)䲜ϕ>v?_{Şסٷ׾W ;>7~}rW=~LwҧVʴ@uWϩ+?v΍w׎[h%鿆_!Vzr2e bOȍ7̈́2L|~kdO>n|N\;/k/47;yi)vk__[h? C|~'cꙑbgt74[7NG菺Wd5ϩ9c nǺ>(zٝz+v>{oU;щ{tn]/{9.?ySȟ{%jl?%-v"+τeohkGj ATU'JW@~[rv;r>w _859n͗syA@7YO(7o O[ =xSyY6 9>!7Z#ݸwp;n'RzҟPnn ޓts|_jUn>m[ΑU>t_7^f?ܰY?{ݗOG>vcxg'?xN8OZ8_v/{UnVѝ{fBkG[;oo9sI<9w m=ŗ+4Gݯ+}i;ӃF@6 z{wφz_a?t?ܰ{搋ڹ ?!|{oty'B¹CxKʃW u׳ҕySs{}|Z*')\yOΐZn#{'}:~x,^(#8u/*ϯ-穣-w̐guw#-~C#S%7~~ʻ|]pI_+o>}P8:;^x=\.r_f=7HEr}v>sh{-{2wG^9]+}W9!ytysڿ^cy;ϽݾO/Mz=<`>D{oԯx>^^GzVz9zω >ocO}HϏZ$%tPz/v7WV5 iM--͹AUo{ <KHwwm8yE{o_p;mR#=F-~G=n+=Z ߼}R8#xO_(-ФYzw! <ԍ/o=XWtY% j~;'psV3!ґ?|v 7xsȅ卽|QJG^1^ _WXwu_0ܞr'7i5a|~J{.=}KΛ[ZyAWJuv]Ss^'>½O?h=Wދu?Ogι87rvO:y[?La,!Z#w}G9Y4ϖGO~h}HW;Hև^SL/9WoC?w~~7=| |>Jqw{8oTOzf_cUwIk{Wߛ>9r:\.yxa[eO.ߑW?9wҺ>[G){__~ă~ vp>x6uڇ9<{,ӽQ?Yi+]JWό=uWKqտ._+]@w>קD>trt O9k2ҕ> G}u}8q7u_'vv`+sO'н3M\{+}hr >(;3VǙs'8G~+:?վ&Qw+Q_ ^]xvyV7{'˾{'cO ߐO;I'4){&|mR~ܛ{Gw[+|g<k(OK9_%|7k'QnW}G(7S_ŞڟV{{K~c>m}ow-3ۃ_,'U|3?Cg|[ÛONޔM~oƃ[rZO8?io%#]wm9ew#>SJz~P;ܲy7!{-ߓg|gߡ| S'}}'wqw<srиk#?$?r=寝T|bײY}uӵ!OG+ҫh׵o|ͫ7^Y\qV$ ϭ<|%wCjoks'f?`O8.31|کs]Ijk4On^3ʷ^ ~~aw%x~q?ّo]щwf9hW8ax`(k3娿zk}Qڳ&巙'u?׽sϟMŗ?1<pt'][>(#\{\Jf}o:"ر`)p_Ų߿X{mv)7ߏiGߛg=~e3m$F;~ӣ~?|>S͎b Tr8wyy/{l{ߵ/&]$'fg,~6j1Z'G/7ڿ{wmUn1,fx`Oh{긠b>7zo#7㟥yg'~No2[_췃n)f>v&h[>;F.4{C[cIqv%ھm|?'Cv4w%_֮FS~ m{~GOXQnܨN~4z)Ky̓qhݐi{YtElCor_{ɯkOE!:刼gj풎ܠ~<=rl<+\Gc}WOg̋_~xFǗ{h~;̷jg^h)_Trc}a|=L?{o͵vweYٯb_@>?Pfyw wE/^臮S"]i_uYuﻃ_7\ʛr;NҩAkZlLe~we{嫏7.)̓c^s0ӑ '޹T%}I;r>(_~KX/~y?Omro ;/sOzk0R|eyE[87Gȹ U?aߤ'p>]}O|]UN*i} }ȵPgWQO|}/{wiRp}y F;ڣr{QozOώzn?-ǫC9Mumч§KN?Џgx>^^1^3ӯV> ^/W8!NO^򼿡| }g~)xCHKo0Nw|ղW󧒛'nq@gwwoÌ#^3w~=s|z&[--?;|>.|_;ngîYx?o~OƷ8쿣G߭7;~93g|8募390+e~\J}/R^'O~}1\ E.KK}NJ;RΒ8{놤W^'7ms|ʅG}~=~C}}nS<09M~&yIX;׼_܋9y8;?6ʿ8'r5ƹxq3Α,5_>*[,1?8WrN\yK~)߹۩Q(W=nȭsE?DNڙy~^X~4{O_\֫^?I=_[\L'G=&G?Ɨz&<%&L>xcK:˯MQ%N^r?NPz$^ϙ˴~,R= >gXS̲=Gwr;;NpSx;~{NtI%A\}48==L`[qQ1&op!uprQ|K-'O_~GҞ ̯~{o).br3dh;OQN/3CWf$V ?c!Gq*䐟f^\N}K̒NTPx?7 Bn.&._tcY?wSr:d\ćw߷"7Y O|>OH_k8S޼8w^=~׃O3NNz38NU~|}w?}'_re'rg(=4_wVe{ 눮Kϙ/h9_uIIwx1%zen/7sa)ݷ%=:?s}Nȉ}qع?K{O'?Nr0C*Ωd~¯>[9Q^%Sϙ=O .,ǿv=KgJsEMY\yQ/nι߹{)y|ٕsݸ'LsuS?Ǎ''pL蜘_J>V=ԏ.ЯG.'G?ws:k{OrvÒ3#^7זqW{O:IRZ_>r䆾H>ʌG^Lz8 zY|>O{=-< yi_D|uKyi刾wwR9ww B>GyyCn;}/x/gSaWpko$Ѡ'<7˾~Ax^O O}|ȫ{NM8QS)z|^/%r~3~jޛvZzW{zs|>ğMf霃H/=>Ocɏ.=O/w7FwJxUq|O CPG.o*]Y?o|G}>ٴQykW_ ?ڧw\ =Rtzw}WI=Tc.tCymO6o>vf͟lgy3ߦOz8i/<ǝMX9s5×&^=SEs 1χϽ7A~?q;;vT'n_ՏrnUL_Z[{JyEz<ُlBcWM( {p 짒[sG#_yo~6mOIwhYu?tNjUyR˲zq< y_Y'+}h3[YW帿|owk G+]Ck?X_'T:Σ߉#$a+^%. 5ۊ7 _d?"WBkI<זƇ*~,>}+}hq$_6Y~{/S ^4^'v_J!S^"'7c5CNn y8Ct-~ nL  ~+~'c_YuWHnث|&Թg~m,.q\W;uW‘l$U'kkXN'UϹǟ. @8E<808_nd;/JW(ڿyV<44߷ZcHߕPM2}Gsn'ydvt=+ܬ񣕛sg8: Kxeq&᧲뼱[J Y|ljk޾Tҳ:Mt2ί7{K|f}niϗ=gۿҕCr~/9R=V{:3[tO"==̓ '=Y^4(ҕ> Tّa~Dۭ}=~)Vyq84~/?ݻf҄+]?C{:8/6{OFz8O˾(r_붕>bI@8xe~>~N[K痒&~2GVz~3䏓'x\[;и7Nwa^؇RwwM({~RyrI[yNQRM:;?mK/yNҿn\0=/=޲`W\XI?C|sr9wҏ > X73v#-ʿ GzP/];o܉wgrM~yH{o;юWG˿})҈I&][uyK}_9ߩM~}_F;+[y>gk~_~o2ګ8X'Cg~~m.NyZoڿ٧/nS8?)z}3)oP;9ګ(faOuwa8;7UO)?+w?aO6'>sFnڕG??t&{9?:Ǭ={ʧD}}?ۄ{c/4v뵏=gK9Gϓ_q_?,?ũwۯWxCѯ9޲_.2F?F~U5'K~) _.ӵP+W|oO5#>WxcESe~{{mg_)!~>?&~W6ըПW[W.O,|r\P[S)@zXNo2/7%?NOﻵ0;qNnӇ3??/ m~|Q>;-^1j'HAGg$~Ntɯ #G4h⩯i여(oIjQ꧟f>}VF~Fȟ}R镣~W:og??vo(_?3>6λq䨧3O)G{o/SS#_݋>s~#7}1G<''/|o@g\bܺ븯xj:XG4u=r/Oai}fփ.zOf9ϼuݙq}oQޱe^rU_<Ͽ]c}΋7ʙyzk|=LJo2θ~߽vWR|Ás¡;'M9GyΏ989wnȹHx%|&8Grxη^u|9U#|Gs ;'u^] _?\ M~?gɧ҉(^hGq-h*\\ɐ|76&G;nmߏ|[b~xcݱC~º|[=|t}u~Y_Y 7ϭ.e>:%uh]szv>ξQxwV?-ͺ\4rƈwnsڹ0Hy~g죏/u6S퓏Kc\әP"{a<||scwV\C{QŸmU?uo{UE_2Íߎ^\z_%כ{,t~rߚ xӳ;/?y_W>}ezuƽs{9mOG͗:,mYUA?^=Z gO#0zTţ^s=zA=>/+fX/~]A(=ߗqT_}o{?߹"7[e(LɟSo'\\~9:e[G{yF6}z 缩7F?חC&m_y9c1K_!=>ȹAQ~=4^0Ĕm?kwso-5cI?OkLCu|km?O+xO&7_G>gz7wD7F};3~|ӏCNg=yv7|>ɗq~S;_ߛK?lb&b_{ oS|>==Uv }}|.Nh򵿰oO=/v}9q]Kޫ'Ӿ{PryǡxmqT2\s/79p}|~9ҥޏlSc^/&^Ulv-y?(UVCw ۏtNW=y6.5_>>7Y==IG'>}ՙ_~6p y~.ūP|G{>/=v7\%Tq hx^p/ ^G*O_I9M? }k]/:{~ztY|kS8!?I#JxzjFp3=9=BRz{x8kWI^h~b.Ga4}q_I>OH/~|y|\.Ca_g6 7U|x|u+s!>ش'׀+grɷF[/įQR(rc;B^೭{N/yɸw|%y?G|Ǭ#3_:$^--rybݫ?.}1Ww|9iݼޏewޖۼ힦|%>N}!wđ7 {?{]CNѱ<ΤۑC䆽NzQoW1h}ߞfT&<촴>c^Û>F4Mrӯg􇬗9?JiøkS\䅾Ή~Zx>xVşO?7Vţ9Yzq?8kʼn'a8'HW߲θ\>eWRxrY5=ܛ=ȽȆ sh8JKU\V9==!Z׈p4kԫ4&Z6yK¯F>o %ͭ!%wn~~:j{\iqo)Gb*&Oe[dqtrYI<r_SeyֹG+yڝ{_\e<ᶤ;>?6h}E8cγh&_gȅq$x L|8w7O|÷f{e)/[8D^&~xMo濕GϮ ^[|e.wڋ\V<8w+ :JtO~i̱?߲ϫC{'Nv;}G8BOUnV-%\v<敳۹ҕrs)rAJIoL[l䆞 ^YG%'U־b(<6|\^Xy~_Vyw2n俕?W_5s~:s / Nm?>t{g۽v:p.[I~7{[=-.-=+z7tio|䓦sfu~'v(N +|<\7M;O3oϵC]m7ow2wOSOsuڴj?s~ٿCG+>~Dz9.S8ogO9:/vHW{^{~W#\G}a{%>aGk_󓌟G O _(xɞfg~U}~6_i{lSk]{cO ٱ:|p҇_}v1N.~~P>fYoZYg}5³ڧK>8L;cs~~]v{Ns;W//v=H{bs?sƮ\=;QO3O<;쵵qljn!pXoK+;~lG6<:xCS_xpN✺K@ .>y~ҿDロ[3r D_{៷{N<=??^?KwZ7R#} ~ִW/Ìewog܄  >).bҕ> fw:Ǻ'|lN|GB>J=p,eTnlmu,yo~n>zL;ws&|;gIsۼرă7Yw~X8a7˴v"6\{z_<+}h(p(ԯO[_M/g/B't!7N_B{OZAٟlA'_ٻzpR|:ܸuҕOLgS^:zWzK^=]8+KyzWG־ ʮaLD' W?!av&~yJWqrz);P<=ԎG—{Jlsz T{5'86+#վpzers^t϶s+r2^86zN;<+}A x"Uz[>8u@I=_R#l,Ύ8ʝ'?_PzO_ܯ>}ʭ?2#:>W>#]\coZ\Umחߏ7l}'\]VdӃ' W9gp^A%^+}{or [_>mSroگ^&y)s?37s]]3aR}>oGir{}'қgnn,[+}ip9;7%t_!>9m!y^k(vAmG2TsCm=A8_|+ăKSo8+ &(²&b?o?e  }33f\dxyL_W&Mov(п^&^?IKNnρ;|%-2.J{SNνE<~:;NG {o忒U`| O)T!O'Ϩ<[ _'OfO㻨(B|~h>+ ݑw+7`_fໄ'~m_*>7ȇOnvw;b}^~D^Kn?)v?x;Ov#as kn ~~K3ă;V? _<$2j}a>?gx3 kWay#O;~>j>zhq9g}.7X3-iϻ'9cg޳[[|s9gF<=pcxqaƛ6{> r]rWB/ׯW9 Z|pdMz<8lG?3N>#xyN=_{?[_<7'vRJrr*rߙw7ҎiemO5=mtO{ o~(.XX>pw8|T;/w( 7=/#?տvCp_o  <&Ԧo}ߡ_xo},ǔ#^c}ɲ]G%-`_efe=M9Ƨ߯/棧oXP|vW"ijw.޿OF=z_8#}i;19v|>?%J;cK}3^R7᎛v~^yq>?S}g)u;ǥ߀+Z8˅zs{Fӻ𛩼櫽#agCO\=6˹sk k&Yg3nw2n[?!>|M?gQ\Տ&8zXzSSzͷK:i=_wG}O>헼s'+|}p %;< ~ o?%zYGK.3wRoHn~aGL o?㏖ASwǼ7͟FO+_;PxHCy];j?1=  -sޔ;?|f(֨T/}uA.[+'R/~*;C>hWs7W9ߗG7H^#<ѮOy_CirBN?8F?J+᯾K>bkyڡ=ڋ.)XqbCGN9߸y$R.}GEfGqi={y*JCi_0'?\Rz/Rq1ee~)8^~z<VN]\P=?PW~n0z=M8=cM௯d/Dz3w.'|Uӏ-畿/j_| i5O)aNPnX{iG'M?N%<:.Jzi4,ӵ&'N>RX;GN{#0MrFU㡿?޼ߡ=9| /d߃>ԄŏrxI',]}h!ײCc>rt/GkyP̛ >\+_.岟v<;+ߜzZ/l_C#w|&x<F/>44ݦWb~ry#!/Hg> g<|zf^I[ƳNҿuWt5i}2ҩO]g\>>u}D.zQϴOϸWs>o{dY_'|oŤkOk|2i|lߡ[#}9,;'q9)=w9ɹsS uEzVӞJ~ ;r>&,?Ȟ;Gߋ_ÙQSIW|Y~~ﳣ^s4p?75t(c\{bsvO;P_}M?~=~㋁k{jJ}}~霿:}ԏw9WpnLKPO&黪|+A9S9}<}wNU/?7i|<=r.I 7@?zex7z"MJ!Տx5^0'?z5w;|x0i%b}ȉۀ-W2I7bSox{Qڏn6Nc\K||A^gC+99W P/gucSQ>_}'7xsxcK7q?(<5Ώc&QWҕt+]JWҕt+]JWҕt+]JWҕt+}I3}~a|ހxϬ8>=_@o~z_%k+}if,?W g?]/Qxjx֋^GW -|`\r~Kp+PLCnQ}ڻⱿkQ3,[<ޫH G8| +^sKyq{V?I0>p/|#]}Qo|h]WlȃN{4GgS6f g{zs7vCNoA.WDC^0͜7%}~O|r>[FX?R{3}N>Fj/ܻ{4F(_FScRk8nw?j$}84r\j"{'k^Vw/raoG;˯G{i?T?s{a+~0'!=V޻h7p|03|1?8tG?+nRwfvQG-˭]|Mǻ7o uTܔ{m{~#\!)PoivY_v϶n3^kN]`n=Wo 7L}AJv7Dn?u\gθr#׳^2oVނy)_:nߍy_[ȯmew~+CrS{%술k ^ (;0vU??lOKC^ca!9婇˗O}Pn? y{xYGdppE%zOwypYrsNzg]x硹o.rߒ\G{ھYN+gKW)7vz^~cOyE$|c?H/l.~2G'ѿ}# C9Wg[c >0^yO C׍wKr S7s㹰KzocO>r'M||<|sv^O<7C^W[>/wc['/nn~T~ٞS<FE?_gE}3/Aѿҽ>;1|Ƹ1ơ23Wy7ywf1ϵFoc̋5^Ows̳{oc/9)W|:^?䜰ca'^K\YZoķN}u'ߜwv`=7|G_z_R^[hQk_^NK=xXϑϋF{^/+oij/e>ʙ?cyL~^}kPm~69+pA)˰W;~yq#qjWNTipU^~1~kpv_ǿ,Cz)g׉Q?俧N|^?)vT ==sZ~gP e;KF:8r8? :K3~ڎo_&/xGX_To+Y?'.rwz>s[ozcvTcHSkN/S3/ŃPxg17f<ҭ??{;f琻Sͯ~CWs>!(8kGt3ו|& iЊGv{~Գx{eYN|c{puWj4_n6ߙ&ns~SuLZr⑓gK|rrϞq;o7LpN勞DuKy9l׹帬G atB/?{c}V(Oߙ!)~^z_fa.~ľ[/yq{ɗ7Ͼ Q3[k /Bٌo]_oƣ:/Ϸ?&O6WKŕ%\zI&?t{v*/MKO}ϫv>qε?KXsJn']s7:b?-~̹kʼn'L\r/}ج[^5}Z%}t[$mG=C菦_S_J<'x8}ߛDn.6m<8FN'oUHCoN_>Wҗ7qFBaz(.M=za8k_UKs|ZWuģ\n['~<R<`&M 9ŖwKvƓ_֨mû)6~ꡜ1/֛4XI[\\>!7Žx5߉4?Oi|= Jf=F{2 {s#2x_C.+>o|o#&zǧ>crn{kz<sF{Q;WбNڡ_qf-w,5=ix(+Syfz~^zO9K#OG61;]7륾Ń}v}v¿9'q1\NӉw"L{s.wlP|]˅WSV)hG7OOI_Pc0}٥J}j'ԃx=,gxb0831ϒpC%{%ɑ_7[YۑycV# NWYwT ?x*ڽs|Q\Lҫ'<@qeI[{کcxizo;azcRkrx8f?|q ߏ}s3w |;/2CW&nzO07WY(7EG|;;w?vxw8gܩ;NփrK43/ׅ[~~~{my{E _봕r}W>?!=rn9~_MWpp|EX}={xS{x_{r^v|CWR?`o+(} M Oz|O2߮]i+i0* _;ƹrǛR(\QűГS^x: ~'kskzُWxQno.wsn޽~hwsgKS_r? }!2I+Π \a/{Fwa}{O+^ ׯazpv{qO?Mzw˯"|7ǎG8o}e>->6gG%8`Hx N{8e'|ow8_^i?=.G?ꎝe:Z_/>|avw33`*:!T/>%{sD#2]roQU'z=F7goE^_CWt{KΞ?4@$>}n%awpWv&~OzpO׽􌯬秙nퟄ7a?j]"vSWpok_s.[IGCsU;I3PvuaeǯՑ^wʟou{Zw76z[|B~ e]3r0__C۫F C/+ܑw1~z=܌֮Wⱃ8vo.b\o+]}-*_x+=x찡[Sfb&XM?-~e—G/_V}ryϓ #6u e-O<K}7^:C?͞0\v{9UFZ!b߄F<0` IoN>V_43g|у#fٮꕴwo5Ο/<د o.&|N/.'0KX=*9<rv=)+]Hk_ax;!rކy&MdSAᖄQ8Fpu>Bq潛9 ѾY 'W҅\|{i澊KJMz];K>w\w Ωk}j}ZlQJ-ss_g>/O#O|E'}Xg^ avnWn_ҧ~o}qsߔ|9Wfu3@?wNS:%eT?r@Dv~JwA9{ÿLCgsl0W987ipsF9}^CqnV}(@h[YI/QDU_~H_v S'u 7Np:ſM~|LMv¿YwxT^)e='ߺN[ȏ (ppG_?z͎_]^Km9i[!c޸ tKc<y{}O ΂߃4ʯ>TCzeggv)`+^ ?ů 's~LΟ-oϼvo)<z,z>촷>uJwiX݆oo ӏ6Lx:4|_O?ʡ?3ˊe=E>Z88osvpص*/| gÿ'<{:WG:|= gwsߢx40Ν z}|^3)ZΟj_W=hٯ>`h[ cv:&N &Mb066}W9x~r}t)iBD~'{gNfoƮjUժ5'I όފ؟cw?~1rs/mzR.λ~ )ʹ#7'G~%"ouiz훎uƞ#1Wb?g;_>}E?s(~N?uʻrq/\ăzb\8~AU>#X}hw9޽z_?OVR{=7fފkOyw"+?ĔvJo!Z~2Wt^'>xٔ0i':|)+Qx[N*U\+Dz7퇺]=\y! ~k=v@<\w =%ѷԹVO(JNKFz*z}򷞟r*=SkrQ!z?u#7p0C}|ݧmO~G,_ϸwS.rL?߯Fdz$}Eia`ƾ/:<CM>ICgz|8Ƽ*<}2wQ'Q^B~%Ttp;4VL zeyMaK>c)i}e,WV z«|[E}AC/RnRa.4Ao~s}{EѱGt730㢟+߃m{4;ݎEgx.<":mIaKvD.}-鶣U:`:~ WJ||7n“fwo&? IY*=533O~t' )_w~wL4?+2k\Q?Bֳca=kK>7 zjyߎN)+DȞ_ IwVtI<~$|O>R)nۿd"D&%GuHDۅx{b-+>_+7n='9u'k&?}w֗/^K^fEv`?>& *\4~ U?c1YrIx;n2J<9_*?OR Enhv~v^~y gYt?G9uҕ/c*?$G\>// _d/ 8:n ]'L25nź2coQ<~r_8\X=$f` z]މx:ve/r m=lۊ~Vă} !zܬqwІN/  ⹌/?V =~Ձ~o `~jd'oqD1Feb{3X|ڮfS"|=})U|b-Ƹ?2ygM߇3 <פS\~x_ȼ;)''qE|Ǒ#xOɗKXП=RzxS.\+` 옻h'7|?g|1_ 9g^,-g,7|gᡳ=2M!uaY's3{Ϟ~8@H8П.#c8s^?}.Ioy#}y%C'.aȇ}V\^T{®a?EzΑ%ţH}0!1ʥ0<6S> )$/9_&/]9>_փlv^}?x|x~=ϑ|Y# ̓!~w9('ó sKN}x\ҞyxG;r/}Gv6y~O+ޣy+a'v#8O|쉁bo"ۯ3}~ 2㨿|=׼ {8u ,|~gإ@x_؇gwL۰=pYDq? ^o0K5\CnN9}v(_]L~_wNg"ާsޱ.2~1.s{*W!_?ʅU3e{qh7]B3~~_mP1yC_F 2^?x*t]rѿm0Ar@Hg>QcjuV{v(9G!j{]|>g}#Ok8s_pbWf}-b/c?(pSyMɟȏ_G!gnvb-ҿϣ||h|ħhg-o,7/A_^Ӟz&X#$SNq_鰧ޖga;OQ^RnEǢ\!7n>yOڽ"z\+k`CDiO~ gA/m;b#rE_H@!8s#_Ecǃo{:Qδ>6y9{lWU~ԛQaX+^)lHx}Ggz7~_0O%S/1yk)̼/W7bDz~6ʽ礝eZ<$O31~^]_T?.(N:zݒ?xo̧o}Vc}=Uy`_=h!a>C~%P񭏧^o'rE>w%1}!9<;'Ѿ b ?v]?n?L>/}n wC;w~~NGkM{9=znra/YK 9c\]W⾟~#zx7C`+#ϻ7{3?qDsʮ>[G}G7?(#]_saWJg=Kr}}.zWrw;h?bkzoߚ8v-¯(=I]yu_u?O2KvC7Һ(?֕?ވFE'~nPǟZģ^:0~"IIO|oQ(7:)GOi?zt~}Ѷ6 5C|u.tiy6OaEsKRnq\^ƮwInGڗ&NI<|(w!MG7yar#=f0&?};/\_ߐ[\DnF~"MڍE;o;53<KnMn;ϘޏZ5O;'y(~gs\uҭ02Quv~/j؟-r闄<ꨯX+=I(봫@yn}G'|wYq(}]uQ<×_R.Jg>3綧+D'd6c>B<҇]>Ϫ\/Fyz}[ y)C?_ͻ/D_r\|Е+}ݦ*z6}ԟҟ/տǺo3!žJ.ϭGAk~S/ )Ӳc>o6<R}%7ǡ7˛@ݱl^FGBzyRaǸ|B/o^O:zL<!ҟ'y|gx#3_^|(ZI_l Oon/>8ż,`S_" i\O3\ [._nq?]wyޕq; 1^`i3zxW9|HS9^ʍYaỠM:^`i{VGa<3v`nKc(= A䴾q{؆u{G:{J7=yr_Qμkف[rS; K~sF|;~Џy@>9bANvc*7|r"TN+gI^y u#t>o&:d#z. s#W>znw&^+ R'v?ټ o>>xJ?ÑYwl~L۟|Nrzt_##>ӭI>vEn_[o f|ܔ۽d(o3@/ykL5 4/*?K5/ _xC Q 'K[E5O{+=|v%վkBl.u.$VܯRN_F~=/*?n"_R/hKm<~_[z;wrرE~\n?ޫK/aHc?sm<ѿo˕¶_.( ϟ\3Ngl׳;O=FQtd>]oKs;JYGRTaES'՗|y8+˺5#οq^GH|&ύsoFۡ0vGqnQνˑ{rQ}Ʉ/?t Ta_7<9/v vV<#n{>zm!`8oEMA=Ȅ\ǎvԟr|L~\7 ҃sy͵_~7rG?_mD|8~w9R>ۑ.v*lF:CC}ʛ~I;P3 9D9}(O#7|31Y_rߙYGy]3~#[E=u1}^SL/ksy?A}H>{?%7oSE^#W@O>vTз@`;D>}۲3GCGO>iQ aABo+GľkjIH~evqt©עAa@?D=W<{zOoSܗR>ه+T<⫝̸ lN;_O wuo:OEǙo(=j/2iS:Jbwx7MyUt!W[RA!h׌;N}9 "7'33P~m|!C7_QO̫2L"\/Fy('sc#<_azۿ,(7DlOP>Q!Qn7/a?ַ+)|3|FjO[uk|!8wtϒʑv^C?yO~#~gO;B|-3!Y.?b|r^i:"~WMO0g>l/o MW|$G+ʯɇE{}>)'Wy(4Pb'x ո~;_W)z'P>1@/NF:UeO}>,ƈgmqvkQ_0﫨돼ܔ&7xo4~FB>yGn:h> rGK9ObEBNIAwy-I>D=/ΓW]yc mȑt?fq /%3/Hy6ʥy#Ot's-톓_圮Z: |Wt׉w>y#󹴟9}_>A5 g' sl:ԟҿĸ} Sa_3v؏կ7349Uc}.(|Nr7:]\EO") [=O#gJO=O>yR췝v9ƿH7ѳD>+a 5гh~e{3C}OHg;8%^('Z$4|Hi؇my7"zÇoܾԗ7b=Z}' k?t?G~x r-=ҙ'CX`i_O~\An\K=o=窱Ww  ڞv8δau`D3(y_"(x?^b\'R5aQalk{J]"1ˌQ!}OlOn![ME5k㼸35:Ew||S/,-h^?/~X&㜸Nk]!߾_X= vx+}+lJK+xa_vH_2\Xx~/G~ إ=9f# Rvϭ}{?j?dWGn0an]V} O.z7+l{vvn*rjO(\4~%9ǧx2O^_,<8="˅g$/t,|߼YXxH< n?)K#}NW:> q O.}|ѳίO*!^§Z,)W= ?UywEnjf^! Vb1n O/77s9*e7^N.,,|z5/>b{JwGGU9#?7{(Tzx_yʟt;SgR=WC{o&~<4? b '%!|cxrHD!OZ}oy{W?4roNWo6~ԯy=f^ʼ|c61?]3C^2̼>mF(,8ݭ ׏i Oz~㜤5t~鯺O:1vkȏ<7?`\ =4eOϖ֗O\|}{t! t;nڟݟ*>l ֲae/cb?s_$G\Aўz'~tǚc{q=V3_#ϵ懝@Ȗ/㗺(ʏ4%W|7(oﭰ_h}1!O2_"=3C䏟*t~1~t';s1E9a ڋr܇Wf>3| /d#_wW?_͛xz/PNx\缇BCxigsGyޣӧv<<~|yÚϥ='|&kmOS_tWӍc |nceWf?},xG`\اu7r9w˹sٲOy3}ag+{g/>1}jo쿐^֣:xy/~3Ƴ> z(E3gQ~n~;ѯۡ߱ӷ /YU>bߋqF-?;oMˡOEöhcWx_CY诤t[>:^~xh>^_ՏaF߻+O Of;pMêdᇋϷc]41!~SjյG#?;|nA^rS1X!saw{~s|Y“!W\u68w c?{f9.,< c?~{ßع~Aa촅~&|Fc ć&=J3MH۞Q3׵Ij3M"WrwWåzTXb^}gg`͇ 8R 7`Aa;F {efkda3^A/0¶[$>ykzƛWXثyh ݇_<)ᖮC߹ѕi(h ov=r)vo;/B<-D(%/G}9A#rv"/@F*Dw#r`{_&lO+no셚<<:5޷`9归?8*vh''h!b_y\ܼWل>xv?}Rn /x·rMVx?3ѾoMK~ء>y~˼ ^f-üW=^u Qx y/9>e]kf<]ţ}WG.u}"'}އ1FcG~i\}z^W#瀈~][Q>??r|"&;s.*M_F=<hnx^ou_㯟O^p|#ڑ~L=;E}x~sOypvJb?bP{ڮG?`=WCclI}~ע}"FH_sOه(+.Ek_r^Mw^m`*NLU>!þޣKE~5U_w3s~_O| G9x_OI/=lCm`[n&|3Nvr~~n_i=~4ZF4?{%}}g|yD'l_Eߧ<_caQ4t{iEN=Wr򹽣{5k~~u xMuh+A>nnG4msD{HG9)unwM;(]q3ʳ׼xȗ0ewxuH_#؎s_믙vӹu^svRڗuO?w/Yȇȏz'5Kw#_KMW~'--[>,7|xS> .3rpL< ڗ;B;17k?{fʼpf>랗Vzx* Y?j߈r~B3וzףQ?俦r}"=1o@x{=7K>^D{*Ox쳰}+scv4b?BRy*/cCGS_EzցM7ތs{߅z\@u}?;(ʹվ.Fv2R=_x^azfߍ~P9y_򃿊ΰK>HO>_<~~#@o^ ==zH@?LXO6K!>x"?TȧGWp~\>⡷AoOz1I S>ԓvCww>_ }Iy#=YzSG?v?z/"cc뫌Q^]>$hXn~B)NiC=qwr؏ŮMyWJGt-,|+'j apM!/1`܆?|1Rgm|fϼSaYwdOJ;A08zu'AQ~\#p*ݨ}]_=}D]¿ ^vG?naaO~0z\c)_}_>Up߄i 8 仢t#_?!_>k]y*,|+<_"? l^Oqyt>K!ۨ|kQkc~¹k X1k?}/3 \|eg?\wo^ρGhxDEz$s CSyUxFZ_ OCD߁ kƞ|cތ=䙡GEOuIo!! Xx N&3x۫?PrCiS;yRg޳!|~yox#I?V">m8O-,|3KWoWBOH?%ߣzRo/z'8uK~c~оEFG߫?=m&?ǎcW>~O[#d(潝i{Y8i]`DT5O+uq?4Ћ߄[ux0? "З»%9|ޭoaaG^֚c;zj/PŠf71"LF]=]އQG|SM/ v~m+V3Wuٮۑ/v46|lOPl?L# <7Kn In+_tGһ_6&?g\mg/V܏qʁbOϡ>-~ ?L4y 5?v:-ב:<5sXI*y*o~磊o{j}S rc{7qnj}v׼&z9T:ۏ{0|3a_RF9sOᇉs ӆ^Cv7YA_+Bb~quR.pr A3 7N>7?uͳOJ;RxWGh;x%7w任վxGS:x[{0;A?nW>lE?t/qYZ֕;ûs/rE;!ECgTy୭G|+RJI^?'|v?GxS}?bú9ŎCN>uOOv2\fp>U;L9o" ;ͷpr@]Iw2ғ?Nq {K#g#=놯">?7<y}'ϥ|ҥ| P^,h?vps~9n{I n>>mU>zFn O'o9_rc*HykO_)c}>i״EjW˒槠H>Q(/N _3,$?gFm=kjwS5Mt2Y QT7>2~Z9xBw:-hãeC~>Æ?y' 9A+=R.~~SBi'AUoWr_-݇vfSz :ԏxW|"~197(KvGv;G s~Knޫ܎l??|_')Oseș,=ȭPxh/܊>gXt_|A[*XW1?4KaͧmxQG簾 '4˟UOTb>W8gy!z? {_Ȝw7~)/gcM_>~77#p>3)Qv~T9*D_)<TS7ތ]u};eGq~۷hߓ!/Gn(zUUz#vz z_oBC=Vħ^C0F}ך%ڭƛ*7;>ۢ9O s?%x(Oh)zo# OKs[#7 9N~}.F9ۘxO;׀W}珞Thjo wf֢/lpG}E%]¹ |>xw]P owcƟ_a\vpgL~ÃM7jV8\z8w\0Ygs*,_b_b??ph z$@C3ImY7WX8]s0 !O7}o O20|WÃX9KMp;979Þk~Φy~Iw OQr:~r3M-/ ܇7~\o+,ڞ\5l܈0v蜍7pUrS8<~sOL~S{~T3yYX8I44N]Z}X;OM7 !'K}ׯp.rs#{3y% / []9~s9]\3{uy>v ޏsK_)9! os>1V?-Mp|2τoC34A XO*=*~v_a>z[܇mn_$'[80mJg))<8|z/Ə;ȃpn&? v;xN.z>u[2!jevht9M^'ݯf9|u+:~룍o O>zL' *e|A2ci a}׻];ai>n&?xfu$?/9#?xSxqt˷4/Sx_`I%w6pF|/P84Oyrxb|rxi'ivDi3?5O|nQu1<_5|4oKg,F77t5\T?G/~E?f7{vnjJU'G W/<VzT]7,).Os y ە\CO$WX8a|qgys7:'S|}IEn6c< >mG̟u@4B7Eۭ|˼3k,O ?M-4_aǺB;i*e'vVt]k}heO3xS8<>} <l =6=C xS88] ) _fa~p9IjioZ>fsXXZε]?Mnh&/y1?Uo O5BI>ڹf)}ZrSxzptL^UCN?gSxzv^uiИy^oM/Pxzнn{jwkڟ/SX^^/%BK}~ĮZߖ\F3o:86!yϹ|x3eu+_ >}W? {i\n&z)<=h))9¾ථ.k),,,,,,,,,,,,,,,,,,,,,,,,,,,,,<)hsoa_},ִ?._x+zѶkao y^: O{ߊwC ~'v}n“G];iGxM3~?ϊgSxz]< ~ %> Oa{;;]vv$?%Oo&?ǻՆOaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaᯣ sI<xju2SXxzn w$چG?aMVNo:w+xiW·YXXXXXXXXXXXXXXXXXXXXXXXXXXXXXxRp|>,7 ]?ϊ?BYxzp.yuKۮ/uF),<=8 M_l&'S“㿈*W<o ><rӖO=9b3O|6mx](^SX^fOr'FvԸ~0rs[ױ»,>O{+f\an'3Yfwbf?;`+;Gّ<\Wf_@k7j}S8|o>٢pMtZ}UX8O^?*u˒Ro #,?J>.! #' o-vz4:zL~㫒gZh=tJ4هjp88Ůj}5i?.jAsj).o@;j$7%7EK3p?w"v VXXXXXXXXXXXXXXXXXXXXXXXXXXXXXxbp5q_sŗѽw} ߋC[<'xVO&{5s~Wa< Ⱦvv `Gqjp82#3W*ݡvpjp8juH뗑7+؃5j3k}S8\˒\șr7C/?j򏘧ɞb7zőBK5/xS8\fbMWGWÞoOKn ֻ.vˁ5E2 WϦp@8>X{x4{A{Fv39%S |fmf3O~v;؍fw} _s4fo;;zܯ}!O'X=Ç o:x4#Lƛ“p>lS; sކ|K#cKYxqxbyM_}^?7{j^w In/ w4ASf|3s۬yZGn&?SiG3ރG y<Mp8~_rroM׆>O9{(>wWNp|s)^A}"?%7Gܓ3ے|؋f][O_M/=Ԟ'ܬ}`GB3su>6>^Ds#}Wm UX8ODos$ռ } E ͣCـ34.azo/h]#>C|k,0/05NqN~:c_+`4yl.).ZAoI5BMMpq?@r!^~w2m6o$Ci͂u<=}y{q{N^'vwgw *7[.SrA4aK7Kn {vU(?6f4ˎ nW^|;ǁ. i9L~mHw ;PzP߇,@)@e5@i>O j|qOj).W?hk,'܌wy?<#_w ϵqWO~w.7[/k).گxhM5ᭅ&W ?;C><}}#V> k&~s]G2Hs|O+>s^gƼNk'mzUn6%'ȁkFg'5Jn &O1/)z+^}ol7 ;^DQ<8~Mqy~MX:w0n]¹ ~9eaIsqF#}ٕUX8AhZimr|ib n{МK9Lcg;ca| \|_o'fKsκIǷo-9_'xk7:< *%7G$w>Mх"o[ЅG# z: Gtpq؛5O+.Z?jGױ(x4G[x˻~sb{~ذ3f^L~%7GKcB }sepqЬo6q.a >M}cOο,gW~;ؗƟ'eo{!UX8O<^;hL>;w[N!zgyy]?ߕ#x#O/~sY!Nڸtۊ]x hS~)l!wJK }wr"9`|ٓ|?x楉m7E۫En?l&?|F!7op8}[8#{7}YiE؟EhNkPE`7vuGAAxS8\OEKn_rp(91_l/+.~h+,6ٯ0m f$?l>*)>Ks#_ -ԸdYyZ $'W{ p_r|87z 3r ;6[?)H(؊/P8<ݧɇV2xG*yW}x5 <ƛ"|}'{6OCNçi&?lx9{).ڟ:āe=sm&?_a⛟o}1pQ(CN-j_ML~Fga*7a{i)\V3Yik?/vͯ~g~K>cu۹)@7<|q)oSocîpqƃ#L0O3/Yg^{%7G/A>͖e[o ;kwŇ.>|x7}΅.ux[/P8|/sUSa/ݴB czJ9z/vݨg%7E<~'nڟ@ߦAx/i+DvnO8w \n&?WPy7Ï~^rS8\B{-)~WҸU|3x2M%iKn SNg:<)F _V8|?O3>Ki EO+>ZvC{=\"'_rw *7cu!xS8Xh?5ԞxitaSitmWX8~B9`uC1+4]5ϼOۍb? cUiZ3_|'fMx#o5m_K?d_~>/Wc?[zP]ysG\oh/xOu{i=I'}'v_a\3EK-fg=isk/C$O?M<4Jn ky]>CG!]+,=;~IaC/nwS=MpSL~OݒοAv: dx @<4G h{|ga\y?!־Anm$ &z:~7E NAu_q >or9bg0fqV gb h< ^᧭'Bxg%o= viv>}"~8mF~_?%_a\fӈ6:^wQZٿqF?~Zp1#8ð6~j>O[>~ lG}gmId/m5O+w>FoGuxlJ컞`m?`_.&»9yZpq|Cr';O[qV/Kjp8s|;C-8wy[%7E[w:shkܗp͵f_~s3F%7'gc YCj).H9c_]>p8ƕR70~f$~_C/Ro +BF_Ko$ y~t$=HQ= Zߌdr+?ñ]S<{w 6-*,WNơoV8\4 g)> m&=?+^O+0.o{gٞw%7EǜiތfG_#}gkV8\᧩*FHࡍ> y*)0؎i>Oqw~@XsnW~ _M1X-Mpmj&?1w4q`G }͆TKÎ |H@vluEnDǎesx4t7S]=ha=ԯ4ry67]rS8\Ÿ!^r_p]Y.o~+,,I>3}K!/% 5j?ph6Ϡ9zL~IG]xj퀧w 灣ˎ=(ɕyWKn #I9|)>Z߉'qlf#Lz w%7G焝'x5҃߉'3ϓ-:oc4𨱟]*,'Aͻ|N\<7wc7E\h&?ΰz}w.i+ 3vl§A>t3O [%7E'o*ᗭ:?c[}uW@<Ÿ~moGJ(;Nww} ߋ` jwt}Gr0vն]taIF//xCaB@NlFͧ=u7NqcNntǣ[XͶ5k<3)}5C1ެ׾@prs>y\]R8<sءxȮ}7'we^(7 {bvO+<8j$F/G fߩ+Q|“&;즵=VXXXXXXXN8sϹ[*~uoo[5O+.-9}]˾ӆ_a\f9[7Jծb _C~ߵ6WX8YP??_I+/eBB 8|%xC]i?QWX8i]\|HhQxF)qhtY3yMpq"yuyϣ/u}Uחo 5O]~YrS8\]q9XAn_O0Z>]y! Hg+]?qB>.վ@p1eмO7xl=c]U^wZEyX l 7b{>f& f?`'!GgS8|4Op'gwol Kn 5au1OSx~sf3_Q{gzj֮/25Bxjc_Mzб]y rp8 7 4h=KO#JO~k?pl$63`>ڂo$HGR3t_a\& M䢙fxِ/xk_Mp~G7%4~?tPu}ƛ"WO>ৱ/Ms=[1]R<oK/яxS8<j&?- <ٹqų)<h^m2Τ4 <[%7GÌ+\y|4~כhzO^wMqfsdHO'JSx xgO 9^zWa\50/  ssAVԾ@q${#n_z|Bكv5O+>֚osSuյn oē\չiujߘas߸[_a<i 7I;I~89ۑ S_a\j3}f3@k$7Mu[+, ԴN{$vЇ\ߨp8{쥁{[!G;Jwj)>wۮl y;qsKn o\1?k&?;/4v okx?7=oo|4/wz}L79ěWî~<=??);,^^.HvFpax4/0π_v]¹BW߂Ag>/Bᮄ|-pS.4x8Wa owzUn+m7vS/hVw^WSϸuuC)gh_a\3|hoîZ M㜳jˠ4k/k?ph:m%4x5'j$M/ϭzUn?Aݟt>V= 6N z׵j).g S~<3G\ œf?EnvCc Q7b=zMpqj|< ?|WX8W\M=}Gn].ᒛǕxrDNn|}έ!/.@%7L~|VMqu=1Wc_Zwz,'<оUX8WϹL~GyQ(=5=%}S4Zy8}( M=ja?ң H6>q]~pFp*,3M[n&?X]¹ȍ=D@avBS<va3Faj@_am a?L]> v ÿ~nZwlȇ#ϚJw "733eGx5`{#,ǾrC/8ֹy!~J>OSwwSiEwNt3s/& mI6G9~4'f-t]¹ v뒋k!GصA'~H띑Fj).Z^]xQH:rkw "7̷{o.4FIғ5_kx6w҂O`r}ׯp.r\ w7}U_ty}ׯpx8/4 '~ڦ.H3IepȈ<I~^su sk.]¹ J/#:hyBσ(_DKn lcаqKk~.M)}9~NИ _ ;8UX8Wa\ v/~7bW.ˊ]OB.n7qg^s |x؃f4Cߨp8'wFz̩৉}(>3i7aW=[^đrg_/A oN7GKkOI?`97E SyO]9?Q7_a<4ᙱ޿Y܀/)~ ]¹ oy5nvEn쩿÷灮f}^A+, _{)m&?#N3;Gmڎv٘asiG3S#ƑM;0<:GPx 8e!v:7]A!\Oa{C{JB/@ထ|=7AlBO*=(.? g͜Ǒ=5қ&{/~sͷ,m{O%ov?V8`4?MMAe9ws 'pH8N9]'xigăf~Z7EMS?mC^ᛵ]8\4{5 h&F;7w 9/~پ7vjV?#%;8vkp88WއI?o&??.|5pO鐣m:bJoa"7sUk<~^w:|Our(;}׷wے׻^>yO{@ױ UЅA)]X.8KbŸo/$ߏj)z:.Mq|ls Gup`o ڍ>39#SiE9%HA,< ya97oSKn qt|sG_ai%7A#L~Ǵ\00_q?wk?p88)9#a/|;u>΍Wo3SOؕCֺr2^W~V8 ?wc'~>?ʙ7AES#R4ap8hh_NCþӧq1%~5voa"7ɰx; ibG 9fu![X{sS4ӎou8|ycy_-,|˖~\'Cwƾ4 WL~˅ zCKb/}+ o? >fo O>Zo>&2o0f{|H))>OO 57S_%7Gk˼ ^Z3<|x]Yy4V9ƹ*BwWa\6 a|ޓkvU tWk)>/;|L~Gh=Asb9}׫ph~r4xOݧ> Wa\Fv9GWAB/Ck5_h,'_ +ow *7;| ܿ2o؎bo c9WsC3ٮ6|T]Bw'5>E^TrO/}fp4sO+,]d~И'yWu ϭ^'|6ݩp88UFN= := g]'UXxr@?O{1|f3 jV8 qo^rn>3u⇀sm9m?5O+m~ιZ|n'#q)]HPrei.n.,|45ǟeɑxߌc}ە(<8RͶHNnuyg;ki 6^.,|'?[x0v<x _maBȗm}׻o.T_ gȑi@ƅ[1n`ovf<>3Jn O>3%7%k>ZY?)Y'q^}5Ϋ]>u3l9Y8L./9& C)C@xe3ϓOoSuІwar3\Av?;xu?~^w "OqJ^&>!Wٟ.WX˄?ucZ4+Z^xSxrZC_/ 9>xo[U~+o^OD2{O5w<8i_s7'\G>fsYm?3o -M|NC'ݛMxi]~qpH|L#ݕ ۍOx8{)>zsnȉy4ѝ7я78z|qGvm9j7/P8|/Izu g$ 9_ Od~nW(6%g K^Rw|!~*,SoNٹ_O/fsnpHh>[C Ots_ЅCFҴ9œ_\vӰ})R ;׀ov]a^Zc~՚oVǏrbktvjV8|4f+7[q6S[ °GcSlyZ +`7uOm}?'pF~Z|!~}(c>6}%y6>r$y]ʇ]MѼk1ެIM[ͷm&?컝Oj_ph= \5M tҤyZ>v8Հv _Mq}A;q~~͞ m ~"+inM;F978? 9!rs9/P8|Ki~to:R3>rvM#{}׫pr>򟂿磏~h&?O{;Q7G<6o^=6t]y6_'~<H^|>YX8D`9B.*bWWaDz /Cߐ|>4Y-MAwB>q5Wvp:/Zr!ObM[/,e}|_!/DŽkܑˉ_]6}ׯp.rs@~;lFmGZ-'L~ Gl~]ԕ۰t${7cB8Z's:>ϒ3B7v9ɯoZL%œ<ُfO>tL c/] zW𬰇/jԼ*Qގ_ ~IOfeMݡ=e?V״ƛg;ԓv^')|(Kޖٯ ǯޜύ"crdxw ?ku뿦`0C-״raun3Q=9+ߍ5]av5cOmpD^ }Sѿ%G?*>rNzûߐGAퟌ]b<F9RnڛE^L(rgs&K/wÅoFSam~ 7~&GJLU/LD-z_rd ~f$e&Yr}+~f9>Q.7r뗿zZ̾#͋N|ፈA>"D/qH CtB?N5CqMDאx?׺k5y]L@=bw\y}GZd~${BˎhGe~6v߇i}4mOhWxW*k}=ڎ|('*5i}u)uvn~+V(6rs;ڃۭxO<nD~]9*N*{[{~6r;^7\xݡ?܍~{"O{^Ezst6OINOygϺruuK]=ޟS=@w'^ǁM/2iovÅȍAG>Y_0f>#y*=a!<W%+Yhg~+AO|X#f^0'F7~1z>ԟmµ7gg8(' hׯ<~#~9h?ΜwO{I+_:_wMxڧ/ Q^/Fas^.s$O#s߅c|zMD> 7KQ~uôbWnȧ~xѓ]j^m7E|XxB܄?yU 3sw0vl)<0][S~C9ͼ?Aw>הy\+,?iܟ#9r8?ZO=C<םn}k[73a ,sn{G7k 2M|Nӽy^ĸ<>f3<-%3s-nbxAY.ԃ:z7~C:(y1?WXr?[]羙igZ4_o_9I~HmZOyy>5B?g_/h2Ob޽lA|ﻭo|!QyGy|Н*&ύ~Cx۟fBN"}r o Nhy*~h~aS?f|6AH瑰51v޺>qr~a]E̟_gd1W>zgn^ëӾ2moF~~g ߆}i>o}3& Q?2AW}3!៽u}(LyPBxo.FVKlE{2ig!zf򳽩y_;5_3.G {N!G5|}xSX}jo qvҺ{|~G?3>vk> H?ֹ'ž-x?揁GqvԔ^rF~ ܤyKɕ5ԯƙ(7}~pa?f?>#¶ .v 87uSҗ L~kϾfOeϋy]|uK|y%iݞm'M9z_ҿ zNscyGςyaI<xT+?XϭSnc/>`k2 <ϱ0zU!e!|x_yy /U?*,, xc Uj?#ڞ 헛y3OIܿ׵aG}Z?gHmָ}qKn&?7/#xdgGq~yw9uKEԯm7 r HYy'OᗪtE/#?^~gN!:7z#iG>7e^s)/Y'6?{b/|ynwFJ=a l/y2d@nl l<i~A~B~''S |>M OE-+ +J~=̳#_~IjKCzھ=mߔz )@Ob? UQ+<]nmi3|91 r:v8O͗1j¤>pq6}\.}b_|/(L~׃'{,|hzi nb}%*#_a>MP}'spmoA'RCO9Ы_Ӂ'_;NxtO:fޞ0=$zXxsǔ0_C|jƿ'<!@OOZ^~&|}O_55 Џӿnڏ\~o^/Q_"Gۑny\.tϻn 0 Go.]U> B _rag>A;?O1?G1r<Y"Lѿ.}E!_B7)13 {|wNcrڰ}<#|ӆ#!G$_5| ̟u$]X{e{d|Quw1?SzۃSo~6icY !i\39#~~y7=w iocNrrHqtqx}#3A]6/suɷ[N>F~ˡ<_}˾% RΟvP#xpycu!ܼ>t>>z Wy_u @|xtNz5]>Da>R~~._Q:x%a#l=)OnF;q{nD<>}@ήوf|﬽CG7_¯X3o;yaBۻ&򶇣xo/W:|6 ]?s|}r{!nxrî!ig+;i~ܳ_ǡ;m;w5ۏv{qoOŒx_gC^,_`~g&пyvۢ?"/\/[C;r}xq^C=Wr.zRξ{;gs7^*>a4gaފ? 1sŃOz0)QOAF|Hso|(9~7{aP浔OlW OSߊr^oH8~%_UHw;?`ʺy }W$~K;^Fc<*ZKb=)ʩxu;S>¸QN&~waNNQW7+>LOs1nۯ#IᷭDf7JyvNUGy+sC[aۅ!1?$Ř71?:!J/I3э3-k+Wؕ^짝(~?g0zR~CbtomLaȟr`_ (zu*?^v~hv臶Sm:vJ|G14oE!/L|ʧSOvN⛏P嚑%7' gH?5 9Qz _v3~_2QNߪ>.G~/ y[ϩP?u;N9  uBM&|c|f>])3Qy^_y7"DaljM9gi%7' 3O/b?'a},;j# 8y.s>'~>\ɞyjc@:&(oؿ_}̧Pvh}"v]зc\G/D/i9Gb_'S^=+?+'~FE6G{ΚI,G!7 vֺ?`7 ~a 0Eal  #~W.흩a_ zMC>fz%&_! SG}}=-r~<"?O51>̙禟M@g@忍 w̫趇@{9'y>Vx21ydԨsJr~hcs?^(3$?瑐ϻa_~ O4ZΚ><x=_D:x9*y4i?ma<= 29o˾9;~&i7@ص#ν~\Cn~ g%'լGxS9Wv;dbmĻgq z(8-j9Ɉ~a;'AvS=?֧G{Fol߶xn7 O۔k>{z~ugεã/n.OOyڃzcZ~C9m,ϓb}\1OcL9?A}x*<5{F8mg)cx&~==پH3/}ޯ9o&=g%kd?Kg.=}!>ȷϏ~O>I9?d<ڏrj<1}·#-q^}& yF~J<PԄO _SϣfC9@:.J_~ i߲/{1lcm]f{`zmEa`[~';WC{u(/O]Ga>n'>vv6w(|;4ü%퇒ms?QvBn?Jr+??b zGo/c^(CzU쌡|gT?cyr~*ό]5Bn!Ljo'PaJ_OD﷬0z|􆩏w (U,F<-!i$ݵ_;O ^֮\zvo/9tS{^k%xiZԓ|>y&=x!*/ Og[W~L{ގ%*n/S/gk|tn*?I;kS+'m7L%r;_dB{7a;Isܢiy={ tߧjԃq yQ;r.H{}ϣ ^x"/O]z~ʟv:K~y-ZQ>Ⴐ}\Q<ɔ(ŜsgwM{wm{W/9$K{tyqhW |G^G>RLc?iG!GR <ۯf쎽ÿq'QR?y4>;W{s} ]i_0=ާy#tCaO7aG-M#S <'xooEK9jI/Ag%hn/p_r4GuW0hoɹSw?ƣyL'WroF;bN f1қC/)y Jn/k~#svط_H!<#^J7(L{oQ=<\p#ʁ>vt? !T~<W)Wख़t֛P>O;\Ň'xs|߬}eG{onn:F~a?ix7=)?Sg{[_,x< SBcrm=ztuN7v̿ڕv{δn>ngډv&LxЍg~}(;HSۣ4;v$I9n$߫һ^!~Fy=MU>r~Ϲl3[/y?x_滑=Sv9șv!u}^^c\|Q/M=~u-oY?1_y}>zs[axv=o{A;܍z'a˥(Rg) pGاax%X׳/U'_>rS磜&e_'xN^T<}Q/HُRz> oHg|k~(F[ ~7?<ʡyx=zyr#z?c~sޫd(AzIQta;aa>/ODGoN [?F i~膧"/U-xiQy~Q?|x k!C|GKM {y[|Gz#b< #&< :/aG4< WDja7J2<aiJ~ zuBx|7ߨve'4 vy/$_ڙ:zxio~܇\v2#K!'F.'Z>*zyI<$cx:4`lmz?Oȳn߻gڛ߳;k~;#9$ӎfy?yǔ0#??]fe\QO:1NCJai̓io9@u08G{.;Η7ƫk!77ːLa'~#J}0H: c,JsɩϭП_x&6<FHZ'[Xd_}3h>Sb}=>U:Uɺ<4KS|xYnx(~tiW>x.ҾOߝʟ凎=MJ^Y%c}kgj?Lq??blLF}kv)DmM倿`+GN_O} n:ӕl/IyJgK}.O0<왡NfyP 6_A7f^ ~oާEJ?-_+K>ħܺ|.l)kNj7މ7״B{{rs/#ݨe{<ۃltۡ_nMI?}/|oh~qj/4rP.ދ~c{臌>G?&_oóLzg~0ןu;Vv%<m452#7|Y0_c1cLaχ?Lz@4?J|N|r iф7v?*7G= \Mw7b|ڌr{-4Hsdu#f/ z5g 5w+j"ycm:yZxVm:K B\υ_G:, ?zž_"L|aoݽ>ޟ\?ځ{}<ʾ+]YƛAOͿSO_] !mB(F{~Ku;"v;~c ~B繴Hڟ赨wcH!7軱WCKd轡F~KS^Ð.A /a⡏ȕuKOG?$cab?aO韓h5c_zKCo>z ꖣpM?'3G#h۳W&)?o{?1rz3Cuov۩Z~pjS>7o k o޳3c>oyXu)V?wWQq`94Կ;EƉ\J_I[>t!q_H>揩>e;P^)oGrI~4۹K3 k>/ا#>%z5z܇?6qNyx`}yo|'ש^ S_zlLaHaςtY+4N4} ݇'?]>zg~Z([0^%7gyd@p'ۑ{vN^y_?EVx7}ۏ"Jg^99[mRhvO3+ aw1*|'b^߻<*q~^k{qdFnF>p]*~کc'B+:;b̫8]dy1X7`lLھprNjnR WQ_ z}9 |-aXs,·S|}ݍo{po"k\yzz4xm'S#g!7ԋk췝c k`#,SGeƮR^f|![NPδ+/=#)/w{ᵥ:/ι³SO{+_ض;~Dg1z48l߷~Vw>\7{kܟ)Ggw ;03lFoY;bo),N:vXʉ)~nkS+ I#vr~#% )ءnv#G|3mܜ&̸KSGr{|;X1Z@xͶ|#D'S^ɏR? ~2־iB󆱋=WSMX/B S<Tϵ=%Y56/sAZ_zúq}eE<> rvN8q^NW~Y?9ʹfO;gƾyymdȰFo|5Oi(MiMYUi@ Og?G^𻈇}3/[ه_=3P.itB⣿niA؉CwNZ/|[Ä=4)S&F~\oF|)ï)"cR=lCױo-oFnWQ Cnmu_(Nh^qLk^ʃ?լO#޷7~;ҴlYG~E1M?SEn 3dFz+{7ҙ<<ʳ)WGr[Jg%V3 =s@Ga7o>oy_XO^Y'|NIavߘ_&>]Y^ἀwN^ 0kM.[0EՏv_>vX%=u^9/Q/}:7|ؿ{t_-|5Zy=}ue^ 狶Ä-f ^x?Wm2RpFB|H~fI\N<}Rx3r>wǛOs\v;G_SۄVoɳKiډ#=co7/?}܉;Z?7=)Vģ`~t K;ZKꜱ^>ϡ+)׾O>7m ?6u}#ڇB}7<YnkcYxlo0[t>!j# EOsݍ: yzR'+h? -%kB#G6#_ln!vBy|/?|<(I{Oi (F`e}!<"k91̇)̃ -o^nW' <;Eior9E7HڗV{VڕUӞ+_=N:Ӎki_} @O^NVPa۫ҽ߸]Ώg-_r:H|*o%稨ϫn/Ž=i$ׇ|aר^]jvQ2?r|Tۿ_aߏўS~>A%nr\x޹xeȣ| '9cνC:}9=Ě}[>bEЇ# ϒ}\!}?|Ґ.zV| Fyѯ|ϳ_h'SCA=(z!$}>^}:cH?_by&፨7x#ڕdQ/ڛ:~j%7{ocOrxno6 ޅϞ}þ,Oԣqi$ϫ/(_&}I]~)~<ԃtڧp=~\%[/ ]]7Ǿ󜔛}&ʾ?p>z*xc=( 0g?~+z9} &5!zEԮփ?ǴGDňsr KԎ"FHx\ ?zQGg=3Fr`6󴷮žz/0wιMn5|+< 0DӾgC^|x;!_WoGɏzw-#?x'~|?\G{9ӟO~(7< |偧O rih]7p')<8ϦB9ۊ3b^A(<<-ף<ȕyaw3+]^~|Ɯ?^ʸj e\/1\fu댳_[rAS>zy6`S;)ky|JbM?EX^B&b.Coy\yOɝ/ᏻrvɓoFz9gfu ~{lgL/3=0nدc|(עǎ:C_(><;>R>Cߥ<)6ʟj$qfh>y\/[~RC<Η0S(_f@+Q >qNyjߡzQ?si걠G-V=3vlK^'vLѓ7vhxO=,4¶F:]\‡~MEE#>i;xz/=S|#W|mw~FM/<~l3_r'o%ZG|G}'-\ckA_z\yxϡ _Jw?ڮw1.?Jxoȋ;K| C7\q! gjMЕ39Gng|4a=_?>lod1b=}g|oT׺#7ojz?} BQq]b{]ziaxR缥㜣?oۏn:? R|ɇ{`.O͂7M/~q|n#EY> Qn6;vυXgJ:uV'=|+xU.ҥ?c;mG:όϩi?拑ADyO3LaG;Zj7sSQ{^,]G?N]3]'۱ǃ]&rOa}w)G"zk9oIس)mMiߨPl7ˍ˻7O'ʡ$Yjφ}~jF0?T"~d'ﻟ G1~E?뽙#c;kģ|qIsu|ʥrخ#ŒWyoșG>؟nn_qL99iۧu켱n3ayyg sn|3ly aFf7`O KÎG=_IO g0-9Hyݷn:O4co- .B'<;u$~_<ͳ0v ǙA /g=Bx$"/E[tO1C(9_2όv$~>^$h{<3O6a Nոvn1|ң׶7~B'@=]'`=t(_i}<S?CB(ĮrL?&"x3o;8]xw=&1:ku 矉z]#y/s6O ;ЮBz)zO~'m_rd֭9I.|>R:sq~n:K%};ʥt=I~v[_v u~|4>> >Swڮc/U{#?֫80z|)/3)9|i5_Ru$GoAҿjz/ycO@7K/~ 乔7QGYu_~hҶ{>lKUaW"= ?ҡo11ʉ>~v?zOkyJG<ݧ?یvC0`/fx}+!׊Oco;)?܉zDEF:{' ߦ3'ƭ凎q.joug~2uu3J4o>_0a]0mYb}ߎ9nGt4+BxtFw#3/\S8=Q_օF{S~7D* Wˇ7~97>v)_W?LclQ~(~ϻߢ៓z'/rUܧ ԛr?|ST:CϋrŹn}W@ϩv3}AIz@ЃoX\,ˁ^$1Ln:?.G|4Bʕ|Ec׍Ol|tף\@)#7jۼ[c2zk G_ BO}؃I;[r~ <x+Ԑ3aM?zQ]iQ>O*C< !qy"͈<}1iwzty{wR?[8E6=%x * 9??+ ?~wyF_w8zc߃JϟQA^uf}}^/G~#wnzHϼ/W75_۹;\||{/=~yh}-cÌ7o=3q\1~^rVrC<ߢ0D/GӺG}z.~.Ϋvk9fj[|(ri/56O@:3)>'r ~{gT?>&}/}*x-'^~cw;ht]S0v>ȟCשG9~|c~ #QNnؿg:{p {^ٗJ{h?s,. x.o4ըJ\>k|ԃxB_?FK?9.)<>PӎӸ>'5Y_^];×">sxm+񼴋O9!y8t7泵}{$iON69]6!g7{$]/,|cB~?§_L~~vٶ^SpK>[# 8i]3w庰rCC^>OK2is1~[c!fi{0Sa_z~s> ?L+ݶ302 ُ>e=F5sz劇~Qn h_ὥJM/M 3}wrvJCy1ѓ/e%BUNx vpjV r+ˁG1C?{kWk*Se0 l/ۀmj}[su:h]=$Kh{1T^1#22"g'#3#y?17;S)^~q W+~NO:q\NgOO{=}4|w9]bʷ~Q^[gĺ/҃ipY?|sx8T~8sֻm{oW/|܅lyci7U|M9;$8z=>O;5[yGƉ?;skȸ]N9xn@Oxӯ c?!}ԫ3K̽v{y}p;7ȫђe7:8F52{c|?%~Tpge} ?1 ˍw!gqvs~T⧆?Ef߸$أeG>mڧw#p8cv+G|}bJLr>ޥ3O rU5i1iWN?{5f6>gʹm?xr/#%' WxG|kO?V/~Ri=/sQ 凣xy"4š8CcGnÃs-iCӮoO5X7R~3֟ 9Oߝӿў_Yʥ>l|6dg4Hq$c*+Ù_OQ?}8׏|~RߌӹOK?G8g8('+s=;|_+./z~-cZ^ql\7o9sߗv.-_"u?}Bj?G>?_yo>}67;{8K9ڗwy>_|4Qq5{SoO}ޟ_6GOԫߕx!yϼ~ϟPS{y%K;qv<%G>;O4H9܂]~ǐ4MV/C7pf۸V\帯qnuw1Nw,_'k)+svP/y9 |g=}8#W 9Wz8-rI79Cwp|/;/8.8׺<|o5_wC1>d%}*S?g F=9zK%{lw#<&\.tzΗpGzl9^ZsɤeA*Ixaz9ϧɒɫŷ{ui'ܹ_a=q}W8M_5nyh㴎#vd9]+v+O.8-^4˱nh}?>|x~ !Ny"xnew Zވ~wُ=71z'eߧ F{k/>}}̧Xz r/?FpfWP|o\m[^`-7;q.➰lxob{Ń}:rnl(+ύ?:?cSn1ّ~GωB9ϙԯ}q^P;_/ҹ\L?>?>^Ce&. ~~Å ?Jp!q>/M=ifǦ⃒= q0Yg, Y /G&na77SڐaÿaӋB;64v3?5~߸1^_J(N|oM?}oxn8⳧^~SoO%ma7Ż-竕>f>{XnNa> puo||LiSߥ^w<}=禿2޽Gި#?4ƹJԟ>W f;r&ςi>\/S.Gsr9o~/z~ٿ2ÿi\'_)g OvSzSrolFqvR87:9qp x?93zs2np,p`p HU3i{KOާ<G ˹> |/; 򞟜>hU9oI>餵8188YO:?{4r&AGh&"͸?4qӟ-yz7\Տ {?Ӭ+.yٽ=3֑rO7G`׹_yLϼ/n}< '}OY?x6v;CJ~C3?Y׾ˈ_[F'|[?'{8/nhpyjW>qő6=MgѴ۸m]`st:_ѝHBsNù{񉧡]//_n{=y}뼇w ?pst wqO9ŤA39'\{ޘ=㬟a' 4\aJNZ}y5q1p/9#ZKp/o~ԛWgS:'~*pJWqc?ͽsciKy\|c8cOFA߬We8~;]= pn ZwR{? MOҽ<[{|Vt҉O/M/}#qk}Q>ߔ޷IW:S_~g {|Vt|ڌG\ĹsiΤ?nsƳ{y(ܙ<]?t>]YOGUk#vP8 -'Nos?zԫ4ݑ~}ъIze~{->;"c׆=t-]>/9wn П }bc nqRG/٦]_#// }͒mply߉c[៍O[=6e ?DjGs~ywIXI;b/~9Sӿ5lM '6|oW}ǝ<]w}v<ۛs/VOÆ6tYŹOp|So{ټt>j׏s,YO wr~v>*CNV|E{O|]B8g4f|O6Su_ө'W=_{o8I}8͜]Sjq||9闌~Z%_,U#q.?i|'/8fo zv?q6:oחm[Jmiьol[Ty^eh7ަr֬G;C/g7in5|'Go ~}kyz/\7=l|͡?×7/;y~4߽~uaR\<쉽T{-Bo}XO38Kn촴Y${{wa[>f{7*{>|~9=8od&{aGN%aOLR^<ѯ7w |/}|_.|Í'Ϥ5C=o}rm%+}6i>sAĎz<E\◔s\L/Y/y8u>%y{6q*i?C{Y_GZ\ 0p/CY_0\:`3;x|W_y 2KgbJ57 c07=X7#;/2M?ϵGÖˋJ9YgwDnY?%З}HSnO?>۳?&yo`{ouJW4ўW8/r! |w#_ӿsӣs,߯tO#-~y|q]+/=_4iřguO~q`q ; q>{f-Zf+c'ym]ַҕ> 멜~<bpa9ո'Ӯ屢lx,Ƴ1ho5oJe,8 rs=f='9͑p}>-Uӌ7K/.2vpb4;7[܇t8\ ~PGxI>-V-/zzΧ { Lԫ#>vSfH~y~3|ou gi*?-y~_5'Yσ!W㹷8R?7n'wG{ ̧{vs~|'${rgQ!_|4Qqz_(SڸW_e7c>&%/As>W_Ƈ]\8b_?Z?טu mO~F}oVѤ ԼoPz1+>~8cTÉapo_qeppyo;;3䏒2Y97{bP1Og~}zfܵ羑4/]/RO>Xg2]'v~&;wv9Tƽ<24~}¼bI[_ϓؒOۯȿx4|d[.z^~^K8AY;O~u_/G'~e7o\Az{/|{Iĭrd =?RNO.2g|>K_.~M>Szڹ:/+7Rqw_Gk~?wcqF=]r7|4*?(G(}4)/_۷_X? m|%I4?-NSzoSo ~s,x%W|rϲ?{ff~ 1⎆5~ʟM1.c<orxa7|>>~Zi-K=7)9?ʮț?e1;N5|{r2NK~8?B<@+_=>6qg:S{==>a7懎y} WwG9)|֩ց֫v8|֩֟֡]G}8m);1ÏS?{eKrMgU;ߍs~~ɬwCP>IKZ?:7>'%ir~:mKK|oC=?o>λ_IO/צOͦ\']{IIOh$n7/6݇5d):FnG_h GIFSK\}eo?R.ηOk6e[,ǧ.ٿ;kxOR?ߑ<~]'r/F??j)Qa)Ƕ_-w߷I՟U;t\y\BO|sn:un%?wޑyi۷|3_αo#}68/q_d'}֟;%9sM3ދW;e;~zCg!{h_17|orwnyb-WtuuE={qfܮ+c{Μ|?W`p0<-."(.iG9yOx K QnOS$9ч|ǴܹayncŹ}=IWҧvR_A8:9RwJW4wN:=G&sv5Nvy~=_Awҕ>n}v~bw}i9Wߚ9kl:mO-ީxqqeI#`6A?k|<{|_[fO%={*8Go>3냏V҅NܕޟJ|{;ea;y_<_e[N+]M헹[o,itpWg_ }Ͼw)r-jپgҕtgŧ_U_Mo{yȗH ai+]Mq4{[|\n ?GX޸C^>r/}*iCo'1yz+? D_1ܛ_E Cq^_;gHsSk_c)y7}Ѵh^HN?FF<'/ru߄ gsڝ~ԎqG}z|w6i$;/{o7sk~Nס%7ܣG_^_Q~R.~iO_Iz?oǿዟ1;7{/rkȹr cm߽ʌd8տq?K9Xlګ_r~'r&3SOGW֟?rh3vnFq;4R{?_qpC;4T#ωe}}uwlԣ}T.4O<~YN~_yNn [oSOW\)_Nv*/^(1/irC;A^rG(/վqwi~.vkIw/Wb7þ|dA>S;>2>4qq2}r︌aW?G?җw5ߦ;LJ3_%r>͗zH򷾳.Ӻк{z8:w?l}ayk o7~7|~~w<~{cg{T?sjN=~eCs¸/=HںM|/'?ŵ%}~U^|;YW5G #&3~ؔ7|Ϥɧ~y'.^aF};8ow;1||S;'sK};q/%?>ܹikj{y;<>q[B-~ =wO;Mw6甡XRϦ[ݝHퟦ/ky}y񙷻_YY)ތW;OqNcw{P2=I}cry«?_whC%]v\8w13wlsݞ7'IӐ/+wy>ƽzz!y#o?a\s.WG;w:{_]|gz./|awϟی=xds\Wn\x$9__s7׸;λC ~[?˕wыQ/>m9Tů7}߸1卵?0qïJ! \{oc =}xC̣gȾ??3윽s<<šo970o7 >i'G$fW;i0eo;CoSQWܟi8(I4w;mū|ߩ2j?mcf_|z}w&ZI8#}7bn]i瓟bo<6zN/ÒIO\z3cd?+.ko4>򽻔JOp ?;ßs8ie=p.3f^YM<;?O]8APⓒ.rHr~[9lzqi1nyыV<o聸JC;/6oS~] pw}={~[KMᬊ -nݺ' oz[M=zo$T{sß'}O|99q令z!w|u|'fybxw}N±q+~|tez{kYٯgj@G>=X{\:SNjߖߨf^Pq㧞y;3( a% /fvTWo2oeێ8%/?YC?/ӽ CG{>||^|O)/|EJ=7;Ňs(y^~,Xc3^ӏkK~4Ó[w8=O?CIz_{q p15\ʩL_U#(ngɅ{ W6;~+K>p?K˃߶z/=W|ڧOyn: ?,ϝڧK~rG׺{/ϵSyC:Tys?ӑ|ujӯRDw?~7?N ȥq@uU.^qbI;O|i^"g2yCO'6 ;}G>wʾ}Չ˸vP-c߶3#e >N~x/sS;(~<+s~(Y? i?=zuP0r7sc7Wo&w_оll17rQ{FӯM yyɹZ6dQ9ϻ~寿&$vߗ߼(g<.B~ f>퇃n|ϱR.m2"]y;(//LkC.e%7jA1qh=~OS~Myԯ}rͰ!ʇf{c~vOyl2?qvQ?vgN>Opg1W˩!qo|ṽ՛!joȿx`7/ohu~ʏGc|P'a?9yoWgDWmuoZj: O?]#Ώz4hOUg}7q ?P> n9C1 vJG?!;v]szģ;&ϺGor/ϿK9~;9-~;~дk?~SoOO?}E6G[aFNY>kyy{_2OqG?~Ѝ}itŗ?_/x57^A}Oon~{Bg s+\OőўΙ/LvLd>$MZF___r89;wr\;ӌ~]g|Rnp3_+e3爡3s7|7Z㡏'G>r?R<w\k=W ŷ᜽ăWJǸq1_ʉSJڡ72v5|ǧLyy5COGǼTGy_[{+vDuqpB?a,/f vqy./߯9q?l}bpkҔáWg~5r&_#[=ŏ^C;(N1=!֓.n%m|j/ok^(wz`7U4Swg.aWorI{ziܭywdoku{d|w4g;E~=m 8>{M7u0TYl}M 7O9g_P/^ G/~F»a' ܎rΩwn~;PJd\}yhBsWpI}'-TܲJ|m\չyٓTi)W?I7F.ޏ)}Kk|?p7nz[/vOsnOfNʹ'386Q8s¹znֿTgs,,tu -^n||7n%+=ng&|1ϱׯCz8M>`2ڨxN8 [n(X<0<ti9}>w$7f??wVg7bI>3o NǺzrƳ~C{%;?6z'QˣK[/v}!8c~Yñ{waߙ}ȯ{Y>ߖc?e{=s>/5g82[TOܘC/-|8 [ Վ~{Vgtnm"&?C>o6*>oy`7Γ>vwGq5mƻt/ѯԃ_^]R.u?2ۼ?7']fonVzw1W'eq)p J{W+?z3;o2i6,mV"߉·Žn҇O;-N:?c4qiun_rp`T^U C:~|L1N荥~@rFg6vh=Z?-|^%KzWzdߥQfÙ?E PxoMz_.|{;v^~Ǧ-mx#CO?)eC gz.sg?ꠞ;N;qAg<‰PF]Q^?unAr:ř-ηKSC#~j9Vz8J9?-A I_[/Όv~9/nvս>jO{c-i<'?BbO[O=pFg_rs~|JŸ5I R[OG{_-9#XJ^x/v ?v/P8Mj9irwя'~.>9?Zyg7ىygK}|jƎ[GF̫o }hݔh%[/п4MacrSw~}v]8h7,pHח4ߥ|[/vuУy;ܛ=S%)J ﻞ8vNƩMzϑXo{Ix}ha2:qjӾ|Ɓ<}W{./p8mO<S\=] 7͹Ɯ7~[茿xhC1}6gõ]K~b;6SI[ڏe[/vZ?LKyF޷>"o=EE}~2.p3$kCwf\QM⭆]Z:7Jqu/CgQŧ>.oʩ6۞~xW c+=n?RZ7c7qvW3q/ӿی+ g~q3U㗲j>77R꩟ͼԫev~EEg!OvN?wC^7Αu\zߴ䷎>}[{$}gˠo85uMpbpvg#T> =>_o)~ rf\Y9MZ9?_`7}^F5U?|7koO#{O>^ y/~u!w|7iq2R_˹u8'?/;M§t JZM|FU:Kvi'3>JL{ysr97vC~ը/8%/q{v8c|Ύ!q^zHi|Qz9G5e{ү/ӯ?13g83ΛsBR:{+_|"q6.pם7Gד6nqbfWiK˧K9AGڹ4=wƟ)y_hף_1w|o=%o aK?۴ JWk=xOz`7g"G#=qW}~6ˌsk+;ӻkߗczo1k7xϩyM~owK-NܤzXM#˒鯰Y37wwv\@ꝧd/ y|}4O% n:shƁ@ ?;8_v]+<ϕ`7?sc{s/Tyχ?wWT?YѮW?/GOsx+u5vO W\7t?o+͎r_aNwEtv#=OX7_?񄛩/M~՗ }8Oڶ~F~ݯMOw}_RO7_SO?{\`?/Sn༺WÏv&K=?+M/F~OχaN{n盞9|őmR!Qs.mrq.9iߙ*_<'~n ߅ȥ yz\<}4.`M<jMox3l;zcH~S18^I+wimF=.ﭽ_xod1kz?(f hȯ}4jv-*ĆX|\hq`?n1#yըM|/ûGdx8R}/S3GӞ ~I=wwtҧ?phb^x+)ӯK993e|={<_Tš:Qx><9;ܛ+{a&~_^C|Ry;S~.P߹+>ڻ4_yfWDVOťm&Jq?)Weys#M<~Y>pFÕc.-mM/Le`襑qN& yݮlOLYowͽ=v.~Ւ! /&?x_st[>=x2=;KܽH9|=n+=\FoC}Orn{6V*Pؑ}-Y-yAK9iy\~ɔ 7=h+}i;Ÿ}iv&_o<1ܚc6=g~ʹ]L g]JvT`_ףgz]*=m しcn[IOO5mcW}k> fw'L]se+;6c-ɡ-;mGϸ{lwn'{;gn g,/>>'39޳Qvsh]|T[߸o[?n8/_6Gqֽ'Vyi}Wg5_}?,R7]V[ji ӯng;wDOnx_C'H'fݏ  8ɵJy8yx~ߑ9.Wl;;݆No{i~{|Ou?Mq@=~k_5aN>zqu{}#i_^aJ8k>2qswy9s!8wCӣϝxVڝm9Kqy>x1Ůڮx$9EG#fN=wyVyؕ؁N81xppp9;jN\ZvZOPԓj7g^Jh?*qy/'doK=§}M{3Na/v?'[<ԫ x7҇;צ_A8?<'psA)߼8֭/4^h& =N??=I KǷ>]~CYW%wwNwV{XZzp+]M}/6?ﻏgjmjCoOz;ɧ\qeɇSmW7㹮t\hy |f!Ϲ\*|g_6|™]Ι/g>84<?g)篆]]!?~L=wֿvRߥoP8e+]faΰ;z 3q8˳t\aN=+:ҍ/y~hrpZt/]Jh7n~};+qf|??&}fU7kwy)/>~O>rn>me]`?/3qc_)9~'i{n9wԾ5?v>G{sbnGWOũ_Yn{8Ŝa?[J]{&@z;8ׅf?pB5~6pApzίܞpy>]3xfo\ѯ.>_^ѿeJ}~7z;~Wu'__ G_.3׺:Pxr>RlKW?mw|^Sq?#!<Gs'??#iW>Z^]u?Vxq7hǼ2~ {G}OG^Gx(=#'8Os?) 3so?9|ѿj/vM;GR&G'M~F|>t?'=ȼ_ej?8ϷCߍzO D_ ~O>c_~~1~')qf;qH^ _))/qٟK|7?\s?=c9x^\?gG >.[F⺸+xe*H}MҎ}i.O/-u~PT(U&|Y_8>y<'9_7|^qW籏>q=DEzox'q-o,/ԟr#%i#6_m+)E8y7Ð<kCѠ_6_Nr&CO&>,GEo+W lC9jȧ=M?l/µ֏7|{ue'݉;zkC_?oڛ;oKvn gE?)w^ϋ3KF yN{#פI>sasVO^,(?~s컥붤Wooݹ_mcQ~-8ywuNm7wEy߸#MN?Gq{]|X9M>׺Wy?FIOk[IIЯ<7!u__o7|u7~e$|4e~SbW%r:kgV#6z"~R_/Ÿα%'8wrʿr|E5ϻ%>702{ی{>`|g}szzMOq? jOޞ{%_,Enϟox t/cp~W_8R\M_<s^\yN_16!wx0)|H^P/|ƿ$ݎWMoky1ϵ~~0M96_^7> p]=z~G4?׌uj9>?=qml+_077s_wʥ|9??ԅ?qfX/-eӟy/hw9B~>:l{iU}0p@{1~yɑ<.9>&of]x2|kߑ_E.\W)97<ﴗ9>oJ -.r?ѧr }wIԥzo?Mx"O>صO9r+,VnS_sjd_oh]wqic~Z\>}59tǾӱN/˿,}ԗ9y~]k<rGCιlϝF~`Ym4Gz%*~ )GmϹsƉk9^{ru;v:n3?j.ūGoҽG\Έ'ZC#]usrڹ'9&sx8{p[ ?;\^q`>~>Zi^}%?.;Mg6I16:vs|}Y;;ǽ}ECs*ߛO/.=Z~4~X'ߌY?;nG~~H;?Go&_Aw7o͆|~Ǜršy'>ZnM|'u#ѧCm>)'ޝ2>Ǽм}JUӣ]Osd9/\1sw?9\Px1CpIpL3;?r+}03/{/~~>7H_Ezz~\sGf7pp b77:s ~E~ҿkL>v;O|o'w+I:ʼnx=<JpÇX+} 7JÏ߻ e`~xS,/+]L#΀KfGíoo0iY>?~/;Þ}[\t-/Y\JW4W ֮MƭWf?l_aw+}twU综/o?&^~+]\2erV\ut%cAh&y:aw+}$vW/R.'?c 7#>?+To7z<{9~@=+]c{~}ӎO~37v?WGIŹsKcf78Arn\gmYsE? ~f}:sYIq0WtPqW4O<¿{;7}zG6 ;;_r' [/y>^NRNqNy3|ݝsa{((oN~R.5G#?~i^K?G/o~t: .˸_8X~rqqq+</uGk$qh=̟gquGBqd7᯹7w?W 1_~@/]vpյ=.߰3]s%{5azḊwe_ߌ~#}RϽ>/;K_Mh{߻z#z~Lھ5ϲ~?G[/ڟ89>>+qO5.E _aO7vQvѷN9D~{~vw5 7e'GO{䲣S7aychا(?YQ)8)Ɠifw_Ľt8M=gc>FxGqw]>oi$~1(?h\룿sMq!Q.ti_Nvy7.G,и^C//iV'/.tqi#8P_#4ַmw~8r,QCS]lh.WtW#Gcro =wy˜?ߏ=;8k\Ôό_կ~熝8þvګ! K>/#nǶ15.>>+\Y/d=a=$©7qN:Ľ|_/yF>#I[\XS>k~:\kmgmޓkw%{>-'8/rܨq+׿|q*Ggo4^e7#~A+=n'a\ /5=8e?R]O=KYrnp;*λ?5iľ~{n\3^9[ g+~B/h{f~|7GUqo#nȎݘ=z}㍪ >̛p[W"?6?۰+]4}PO8]|$H~rh7{N(>OyC3;IW7r6Ny@=j>rqaA$o܁v^ocI_}zߐq'u~0%/gz%m~^|Q}=y|⋟BizM9II׋ZMaq^8#>״OZf;'r@k;^K4\zJƍ<A)_rxvYy2ƱcR?$/='|=)~ȭ:~s99ё^֛v{^1=Wꡧϋ{s>vs23wd/_|C}2Vi/_[sȣcqΗP@S>>h|.\Q]_=ާ_ş?e[]lS8w۹u|y.~\sK~)ʿ=k~ GW1q)IFy;|G㗜WOnO{A>3Wg<G_}#~|CjQθ{H}/'rpC)/nwԯCT-b;3Rv/pnO3w#|{_~9=9yh}/u\~\km?I{<,;C~^!?c19|ÏQq9z 8tUi+C_3G>?1z+MFx]OF&7܄s* sIۉk٤^8 1|_ V\s+w.xNѝ?jG9㾏OCv3I?V\лF^Q~3xgzH55ɹa%vZ9}|Oߤkyx\8Ž1_\V_y}y3\u49wsk:^-"[翕>}tu8 ߙGuD~\\Iz}gĎl+}^~{_U|7_}dj~ti9ltF{a.^yڤqoO =ui+}莟0a+QM?)ӟ |{{;q㻼|ٗoS޾*zijoǯq/>t%aG>]ܾ*xo/\Jn6z^|c~vnu#?[ys|V!3n~Z8 9aIrǞs3Vҧѹs9WqWVN "ix]goNZ.pũ6^8~=u?`OP½A]6ns3{[?{yo~8K6_Z!OI\:!O瀳q8wxQi|uӹ1.{5PwHC4^pp3O+m|<94+ρg8=v3E^rn\ôĹ|)1~4pacˆW96쏛z_e{{eoaoKyTwJݫϼ6T,~J -ϋFῚc/[)\&gcF}piډska}m)<7rv7#}MnQnc\~#NjB \ynr%O]SYvRzٜvc>0?!Gʍ¾[vىv渍qlW ظy8uў5{~dzB#X7Fz6NUݫݸc~~ßai c_z?J׏"Ÿ&eܩo0_sjSgk~1DOFo\ʻO{|SڍI"e_uދJ{O7\s{{:OpˌWy\G<ÖsѸ{8$>ohh8!K '-C_w,[. d|cΟox?Tp II;i;߼xq"?vܙ=m9<;:?x8\c_/a?[n·:skol_Wyx6~W/u՟f'~1jKoPt6~#\,\<_V?۔w_-o.)î_w]γ;Sﭛz=]>Ю‡uzNvia/e1c{VzQ{8=Gxo>MGq|kF=pئݖ]4]~qwa<[Ť;WJ[_G ]|r^Mg+? ?Ό/ʯޗkueWgs6)NQ9mKosW|=N8I|\5pO/Y O_{w6ttzKZx}㷆ҳE=qڗ~(Ǟ |0C ~쟬Ťŝ.,{˺g:k'~-)t~7*>Hqo}^N(?ZG䳮l|yqA Yݿ]㡽쾩{.yqF?cF>l!}s$T'5.iQgj#{;qb-<piZwaٹˌ/s~h{|F}{1Õ9Ou+Τʷs`97yҞqΓ?|$|h$=2oC}x=4?]xmy?[-[zKwrx;yJ=~%>o?N\8ݹ<L9~8e@(=3^_H>۬#ަʏ]orq'=Ǿr2?Az:Ӯݏyb|{ c>z L;8|θԽ|Wtqd2}홴/f~N;?lO.Яr?#|v=a;l|i_y7n|s*.m/cg+/xEzxcIgl|ORJ[¡v}~e[\I(8h>{_D9~897+{_Wa7Ρ+ri\/q^J\\ٌwC'y9{p^V=*]~0' ^ >Ѯs]r<;dd>wy.n_gS\< O =lQiW8 s+t>N޲K3_O<ݭM{~;ڍù=%;kނa΋yuaϋJ?H~1?3:̼\=Ot2z8q.'7qgC݃|iC_݋8;e{{y>᫸_G{43 N"z3zk>;T<+'{-y^;w>OoWճ)C9:ݺHEx}vj+ )#^\u/U{GP6:}å_=Wn~f_ ?Gz#>zc/?3'v^>3//}_L}p/=X-g r6y Hgp@1oYzRI}_wύ\{|9WQ?9ƥz:6>ZƿOzq~{zasN/_%]?i|ݳ<`?;za7|| Eۅ_z+}Zhv1/OZ)u:`= W羓WKp_ǕOe}b/{OOrt+]JWҕt+]JWҕi:Q _yO6{bߖvR7ʭW#VJC^zO8 nS<4COa<qnߔlJć{sڝC=ϽӍW=?fd݇^c~9<.ZwoN/Op;q;q0_:\'v^Ky߸|Iͯ`֗+] ~^S_g78>\|p3lSZ\ًɟW>I7{xʏ ?׮.ͯߕK\Ke[^VzvCd.;ٗo'G0[Oŏ펟ܤf\심Vz(v#u`~}X}pp(;;wW(/~ݏ{xr\Eo[_>@?{{zr׸6@]zxO*j/+=|ad2Wf_X>*_ދK#.zN}t76ax;ys}+}R|[;pfWzzA:O-->\9AÍ?VWY! < < .N:/ռ/-sx:ڽ&_#~JWD[>.|p5tG־z_ro҇-ǕwOƿ>J>4MH9ơ٧x⼋C#j7/2ć} \Vў39qO[Lү,czns>wN_o)5=‡rJbZ\[{n_~7KR9^Y?lt?cy޾&^P>tw8 pͰ_syj7+}zi/g]=*8sW+UÕu_`O/t>~1\pu`u.nu ?_e+}ԾsDo^ssS\]{O?ӛ=}s#핮i8z9>{z^xu#_?@g_oo+}hU|T7v⧋\f?ׅ{q:ҕ> Z5{/{~n>_VÏ]ſxJ_= >,)[.? JZ<?p;(xak+}v 8Xҕ>Vq'F}5 ||p=q^ҕ>'_=qA_2vqdKag+}2mCo֙JWҕ=t~88$|߻SIsoFV\]\uq NsqgH$O)1g4~YvCOO.q-Q0@yGnMGv>7xV6v(_q+Gb7/Wf͟7zAΎÙe]:wɩ*t^y4zS}zoTďrk7Oq?זQy#1`?dGOr>ox>x2v﫥.v[?o);o>sɏO>_-sEzO_9-V3-{g͸'(eiz>nú~}h4{_53lpIǎ24>$?W<燭uq}fOǸ??~ތ?B_$G3sK}l9wtYbSYI39h~͹I~W˂OP/|'_N[3_zqbƫq>3[U|#}ʱϓWxG~|W9[M_zk@9?~\xߓz\<'{z2帬Do x&u~Ho?HZMy~niϘO i6 ֮/Mʑ?Q/nۯP[?PދS?ܣt})ʝ~?8mrkFT'vssps|=yikggx9digoLKz)zسvy{I{7R_Y=wѝK۶|p$}ͥ1OwȊ974^3s/ :~/=lT7V|o]w\I=nVҕt+]JWҕ>9z_ۅ5;{e?hƣةN pRp->_%剷gŏ\o܇ssέ}>gN׋/vu);rpp=n+{w o{M%>ΆpL~rio~gů}V}寑-~άWկ}W>^\{Nyo3=v@؆<^ֻaiyl'[.;l=zhx78;<=^n='}rzoߺsx{P1r;{y^?sp9{{_1bS|U}2)ZkwI_xxy.9bSEN>y|c$_|7OQ9 {c|9J];O~Ƈ9kC%S,?yƟN{ί?Jh%Gy?f_YU'.˯ ٍq0.+.|ׇTo:H;S?xi',/nռ}_ ^qiuء~__]VƺLƹqSDU~ z˜Oᣭ{#ݢSa'֑rL|.z5ϬzFe?[!ֽg?1։SVdhٌGoX~bN=_ۼ3|gOჟP[9+?3'?E||j@y)X=G~/\lG_y!?Ix\e?~"cަ80OԴD?e?ȫ_rQsf8 |*܈ck\'k7έ;ww<>&;#ɺcǯkC_y;~-+.@B7xOW5 rCXiAh[\{\4^>= #6^_wGQߤoK>8o=]Xk ?o[w>_oӏksT;ͷ_\Ẇ˼kv|+^1}1#ϣ[Ǝ za8?;3ivRv=KK/tzӝuuȹOϷ3[OXt=FԺbv. >'qRu%;7g]9k:ĭw׋w˽lE{$>?GBOVw<*urۋ=cƵ'p9ۼq _ph:ǁl|PϝW%|o|PTE*/pv?s^Q/\P8KVpoM|5zz}ϑokwԿá=u5%W޼t'n2obCYQߛ??|cjy>^ ΏzsSN3:P޼8k~ymy;%rz_ĺ:EO+KvΤ~wEޟOQ~F?PKwݧ#&]!'ӣKrԨJ,վTq]>/建L/o=\<ϿKF;zը~ӏk6z_<͟k)?tonwbW>?lz}E7;qs P S3o{z_Dܧߊ3vfPy}9?$_m)|'G"wxVy_:CN"O:lyQi;P8 m;`_wգ=S=WnOHf>0 s q gڅ :h1|qIɧ봧vэ-xC0E+zP7 |h_bqw{*|GNyY=)ԏcOk pBy*W߹;y|}ޏZ9\}soMn??Xzvh^ҡ[~?CCSuћ}|[iu|٫Kk}~YWG!sIa/ϧ|k}'+]Ⲿڌ'{joѾk2OJ9z?m'æ;5s827gp7JǯO~ UNԷo=χ\+'֓.6fzn3߹{(3&7dǙM}mhǹ'yt`ζaV_;/r^<'{=~~*iTαLl7gh%ϾyqK>[AQ^K_ꅯ/ggWJ?~Wkŧ3}I&ϋsgG9c-RzVyWihɼ>ӏ'=m\OsiK9vgvqo^t[_tƅԎן#/NfnGq1sܯ=~o ?Ͼ/gcB=/MS^ y_6z#߸vg6n=e؇}s7Zc1{G'Xu/8^^eo><_Bʙ?w3/z{=M};(o?O?Ye^mqѳm}}& 77,p0)$-z=O8;xmy~I\[{ҧ޾Fonl>$n'> {oD? ϥs4zzcoSL|GF 'ߍ|~|$=.+}i~wKgqn>+z8>fthN>}oovj/+v8xO:ͽ.:x\Qw3ӞY_&ijA{nޜ[~Mz ۹/{k7L=C_p9ah?ߦG8ME6~}}Dxޏg})tn'toek땮A8sC.Fo \gqICs&\vSsz'.έ߸M.S*dw yi??~3E;IEsy\J:_6r'8os'v?Ho,_v?5_qB֧֯ɹmxJx\ŵqwW$foO?~'^k=>>rMṊ_̽b=l>Wptg1{܍+|S^l,wܝl)yL˳HCS!d_N3o#7OWi/}H?ϧ瞯E=u9GízN GQ|hǹpqxϙy=gno7;K_^ïw~&eOr-G&gwyyiaHuom)wa_=];_}QhU޾ƾZ>']2i|g|mMVtyc/N[r#>>_֏g=齽u5.}<"epk7[_%_ U+}h7}qv?/n8{ k/z˴wо;kPn{Kw`WkW`{|WxhυΙ{97fƹ7ƹg qƗ޽d Ksy-_pg"h%ORf|aD?c/뇌}~vwu<+)zSva7G?CGzyng_UN_<>σ֪7c-q|e'ә|>t>nIX[xo_?iCI[nܺ qқ\o?{dlяֿ-x>ZZm&]?уy?zCjj}#NFf?_?\H9cf'݄~o~}}st$>q^飥Om 9<5ƗyY{M ug$G~raYYG7=sPޒ~JzGKw{8~mtʋu4.Wzl=O?,@D0څg ~90Q/JW4˝~<>ڝO\|~(;㿬FBEq廼V\?ȅa7ʱT=qOË{}߬]'wt5q]opzzĥ~yYww73tO-3XνWnƾ{7^G>tkۻ}y/z^Z}bqW О߻ysMg[kyg yrYJnj{y1-O=g-t]W/fO?޳Bz=ԾNwvP`WFi^;3;;{N^9g}o6?)ͻ}֓ؔҕy#\ݱs>}ٟ\>{}eǹN0/JbZ< KYŕ]ŵ~k};Wb'iwk=:΍~)C~)Gqe=-7Un?qZWzvח{y~N][ F͊koqT|-ǕXԾ-mzP;|9/"~◲/<~ruBx6.҃x(N.v/&-Jװҕ>ww'sri4nf?.,w[b%A?ao+} o]w}c>70tfwJWz(R×{pe?z8='/vO~<>9vSaI׻Lw~V/~}l٬?Wv0|4.g'ݷ;lyŦopN+' 9Pz/~ɑ|7+=|Z\.=%/+1a[diNNam/6m\˿n>8s㯬O\{xϕMA7*&ݰS5~JԹGc{\~?z.c+= ɷcm_ݍ]l7fOͫ(Go4ᇜ;q岿qo8 }3ƕ|Ny'~?< O̿o)N+>)|Kǽ7zcs|Ju˟2w1їөM6Jk{ԇS}7\Oq7n/= ~ٍc5?6oϾ > ?G^$rBxB,s$z;zVO _KIƣgO0|`s5jߗ|9Mh=A/8_dy:Wח/W9*]rReICO$me4G7ylٞsSG_N=8Z/ع3ys)oU_M>colˣWFя?#R~dX+94>^[?ϏЫ=e7Kӷ\I7C/=?{y^1O)OWG?ә9ɧδW=i{N֏|w>]4{̿mY>v ː7P6#{~|ޓ797'i16|~/Pz:.76^ߎ4s7]~;\Yr{-GNcȟvɽf?(|;o=K~v_y}|uu`uCc/\n~?-{B훜7SwBza>}B_υo>}j >S~sk.~$mz~~]Zw8089Jrm..#;rsQ9C+>B'F?8*~9KPG~ wGoyyy~f7CncyF+|8O7-:G?,wo%q1y|0GC>p>H;7eG=!3~/W!y/!ֿ둃s'=g;W1(~۟CIq}wOa9_l*o7}iI;/xs5/}9w7a>mt{>v?;r{[ASQc-{i{B }~wy߾{ϗ)77&N|X.7~SHk?-7?RgӯPzٷђև'rwٟC<2v?$ÑJ;ew7]Qy{N;ӯq~]oDGW_qPzOn,^_Uw0.Y7]ai<p ;77oq_q7f +s=b]}~Ǵwwy:,]xa;;/缍klP攋!}CSI>|[k'\"+y/y>'5ݏg _g~X>a1Lye*㾃}s7fM=#or){?G<?g<ᗍ<{N}gT橥G~θ_3glMy8k|_)?.})3tޗyFO~쟇\ʩaٍs~A9=| =T>oAS\f֙š\sVoO^M=eO#9?O}?N>|qI^I1OO=A40vSχ>׼s3~q㷊|}'<۸cDžͳDxH o ?p}[qB~z>Of+}!v9v}qɉ˼0]u|#kԣ]uߺR};icVX#pK^ө_EOk<(Koy=E||C{qSn/~?O<a7WO12|g)|3VtO_]ΣkOV9DsJ=zzio7A=W9P'8/[LM/=Xۏ#c׹u9O4t'ŏN%8o_)tНx#>V^y^Hz];[>.Ou9;~3p rK6s1Kz?;W,.tq(/?o ;|t؍{]M=_>oڳ~~@U:36֟uN~䧌yh/Pz/}72ά!汮'ጎo#R^Ac{;;z9zO {_/?O.݇~Ɇ//>~8Wc"ɎzGҮG'N䦞֋yʾozƿڸϹwqvn%;K:Oo\>1N?/Ѿ&K>s͞ˌ3'gK.[kq^]p#DF+ qYryθWS4æ9>P6^>ӎ~֟hOQtCg{}l3㞽?94oLחkOI[H/8W>C?ny_j=Kԇ7K<Ho&^_qAG=?qJ8+ouBFpùޮX<Z6wqCͣ)zI'~=$β|-'qK=3}#dSay=RX}mܹ:|(Gc!-M;_a~%}L<|_ܣy!{f/;gS89gy\>=vxgαɾȑ=៫x$G7>a8C?.͉?ԃǫ3OF~[?\^;n}}N_18wVO}wy7u98(?<\/m~~ܴW<_mys} nfܙO~ZC8/wao/r+~Mvg/ڧXIvȣ/ν?ύ*zN<:qo)M|CpD3V-s^3>|xYrK;)~5ޤHr?rv6a9鑥}s>0?a y09 ଦxwQ&Y$c][\RM99k/O27h~ȿ~pB-OoOAM?ƛȅ9yuar<7G΍#9;^8s/ 5'Y@7;Ϟ|N7}z939nq'P{xzG+$NW}}ȩrrϺsp'ӯQi7wo3_iл>3a3Nc̾BOmǟߪQ> }~v8=~+7?{}_Rqi'i@~L\XߞEk{ޛ~:GzgBxhf\yNv):;q~W(Oȹѫ7l ѐBHO%p}q\Nh#)w={{?yj5#ivp+3~~T|ZK_ 7y=8~#.-\ɶ?׆\)\}pg33a0IoY^}:yx/Ot<߉mxi:Zx}ұ.-^;z1p@pSsx 7uq:3q_Mk]{+pO{K'WO Saٟc cfտ7N}?/::zuԎ|׻c~ǞkZcoxo^cpwGuZ(7Z~~EGq}3 _~},^XۏwrWFW`_#h7߆Fb/>3?}wvßdorq4Uc=Կ{p5EMZ_޻Npb?{ȩxSlRnLT4ӿOѿ/za?ԗlz;EbC8q3vY`'o\U_o#sӹ<.rΩMr{)|+8CЎ>+/kןHÇ=' /%/>C/kW{Wm3Թ)״6>oTտKxsGcFxGEB_R\?Ʒv3o;vU;~Vo$ԫuw3}#߾i/'vn^{w?T=W<||8ʩ?&o~B/oύ s磽Qޓv _;߹'o;^G~zM#rG}Cٍ~Wwgv 4M!?=ȕ6=9 ?ğ˸q㔋۷S>|//7?xor/uv<=!Gzto)'r)_a=>>r`_gq/b]c^87G=7s\n\$'1qg>x>]Ηɮ[XIߏj7ׇ*>m%O)Gҟiƻ3޳_]dt:#_ z:]Zjw<qӮusT}?i:zuf{wKtV޺~KrIZ[*W9 7G~~G$_􏞄Z|eA-OCnEOn_U/yt7ǾONW;~?w$~ {׉_Fnhwuڷ_oگܖOϷQWZc\]/~Ki?{K#Lؗtc8wh% S:sZ=j<7=9'UG9c?}(O#IG\cF ~לW>'{_K[/c9l\?>1q ŏOۋ+I<Υ#mxӟrGH9#o|πsh|Gk_vl\kx;~?5W_0Ky8|p!F}G#x,|ԏOF}wv~TƯ!} (GOe?ȳ1?,/Aډv_~ˣ^]{q龑}"qps'G=⧝J߇Ϲ8xn2sg[>Iqu.1OT}6zbߔYx$CӇzs?qS݇s@Ⱦ8z>-_l'#<=Or^8,ui_zG_Jz)Gsn~7RΙFyz|湒~3҇w綷¿5ˋsx&ί?KI8wvʇ'ކ_c^{\|Ҏ~w}já λ{83ch>c(m/GC)/sqO9?}="M\WgEqRkI/.%z|Ko9E^Q7x)8֏x vAϥկ'C>7G}7Go|^Cw OVNn'^x;>#ůu7yfWqXCϊSx9Cϊ#0CN -s_{vpcNvƝ~G|OYa.m!7χK}W3<"1>#G|9yIo)CC;GO:3\/._yn}xz}Z~8җGaW(VǤ)?:Ǧ?sd;Qz8zH?F{~"}OY+?T~w?Szc|S9tyj'Sމz=a=oy|jWǕqyDƹ:)e\{n}h3Kx9oЏM};~8+>mċB9%nxoS/X9Ϲeۇ{s$| T~~ܹO?Oؿxp { <<=s@x|8^IH9O_ͥO|?;'ڨ~l򜟧*~%ozK3%G!wVﻃ%{xnh2.x3vv2k&sfyWW+= W[G s68_zGjϱԣ~/řJ<ݹBolwތ8=w[orMh|ϰs+}D>~|}g ~}'M?aiٿ>X}ʳݬBpI'}p]U]6.q<ď| 솝DO?w$}/x\ϕvCgŤM< W([<[׿i=<}X|]򷾔˄Jv~|}B,.WŦr_E}k8זxWrM;~]zW3x3.g_w;|#r13o2)G.L=B??dqՇnv9Ye|G8WGޑZkM9yd~ډ vD>H>uO L=Ǘ{ʹo{G^?@쟜SY%}=q 'K3a MvNz;}lv_CZS9g 稾t1Gkܸ:C?>qg;7nM9~XdžG~'?տX軳CL:snTC8h g<"o zG{Fm˼w>/|Ϋg\>{mWhR1P_O_i8nb-.Lӥ5QL({.=8nSr&_SqKi>n_Sn97~;GnA^7=g=6iƴ_G|݊#OWHoP~/MAŗ?S%)?p[t䌟gqa=+r)E=kSn)0/\vÅ֟97~{۵wGpr= dM =Hf7;\?ƋƼWX|/i>=&rc䮞xS?qL?i:jg z?_7C'gynm?F?ĝH?<|}<ǾNw˺u9W֏o5]iލSҞ]ѸIZ| nZwyKhÅ?i?ߨ_yoղ71{ ;nӎ-s%~۹'>^YOq2pߋ˒/򄿀_iߤo5z3Uj' /NW?M= 9KzLsjgCnK >yx#gmY =)K=yſm<|݉sRAyyƗv}|]Io|S|t%/|qq[q,>p/y_ROh&nfs3o?H_OuJy|::y~ )I?ϋ y IL:6A;z6JG~|\':W0s܆^sGUhgNϹK9=#cvw5&fR}=CFRŁgS[o1l&W-=9\So5NKq'O㩟qHx&j{sqwאOn7;hѯ1x)W\tQ~ѐ!7vhz:߸Ax9nntBu>l]/_ǗJqc'{~]א>z"|Obɾ:K|eb<;_(QE,dY4ff'hcD鋙{$NO0bEN#Ah"0hN| M;0 8i3QDVӖPL\%:)>ǵZg-QlZn)^oo>Cc= }_qf;K&#~okw7'N(PqT*ރtMiߛ_zߵ#lo~kb?(x<=~Z-;ӎ֗tKh?{KX[!?WhPRⷀta2t_k'GbоRqvPIi?~) "W |Gq\Җ4͈+,~a|sP/ L'Qʉ}Zj9~_m} QHV I-wЊ ֿG$uAEwrȍJ᧺~*G]WI'l1ŷqeN>I{'ޟ.]?NFnIp97J\-!sJ~e+:N~\rN\t%!˹e[f^ owhYoﱽ'5WPΦ=^_4z]}Jmm?>(cU}PbO0=P z>ӉT_-ufx7qAzbOTfE(?MӏBK\S`~[*}}[5η_W^/@\vUs8c߯r-G~dᡞg Ne|q[i|r|^-Žo-G&ʯu[;ʡLx/߭:2ww_~iqhgݧF/ŷx9Ž$r/Rn?~ʹe[i+=79Osny;Փ_fCP޷s}ZQ3Ep0!⤌R3oMWAkwrd8"u&T9cį/Sg.nF>~Ax(e񱾄 ȍ8Kn!^@WO"]h|x#4㐗ՏUXJ\U{eik7u=|||Nlj3s/z(rR _`]G,u 굵(ho"ݣMݗyGlj ?/sczkOC5a/[|ozη7ӌO|?lӛ|qL~k;ug<{{2._Nyꫣ}5Ce'n kキ0?׼7qttc|J|Yh8.NW1M|J/~鐿ĵqM#'\qC#O̷9߷Tܝ~+Iߐľyd|Yq 5Z SgO!~+/VG,|đOߒ|i|/Ig Wʵ~oZ-!?O|RҾUK;' >3~tK+ Fٟv[)ڿxYs9V-0KyWR ğPH:ox]"9oUqWx/|o8-)_?9%l&i{ڮU?R˸8^S;H^:滝gsxWJW8/t;|l׶aD74eJ滿F㗋zSy_~[D9}re}+QhmgFn7JĿ|W)y߳~픟-eW?ּ~fgzGG;TYg;E=Cת+|S> ^g#|c ~|˃*o8;~!rHûG?o<qW5ij>z'?={nO|˧K;^e>0xL$'˗GKSon)|R,Ƹ> 8KwZn—Ɓ>;a18N?Y73ӛ7WϨ?"EOw*Hj|IUYҋC,^w-cDK/U*) N;MX3/xW}zΓyU?U{;4zrƛTsnNwY/[xܭĕNzy,J=ōÏ8w~0ݬzՃ%==Mr}PƧ7wΧλ{zw7S? S*_{r~}M}!/kn-+3{}Pv@݌O/zاJOGؾ_sf*ʽW_2R9.'Kk?cg3zȑ|`?Z]K3qVx'w/ayyp6' 6t`\׳ :p^N\IϵL}(:y'q<25r8yto#s/ryv(P%r< 9B_uuE\+>}@<\WݾC{{ :>7{vuz废Qy~`w0N3<9WxxM~݇%݅^>+n 刯s <(/%~}ctP-IZkmxɽ,H⭔oUfMp߉G{|/?-Mpj-?ob|O[4gZ9-ܛ{fXG1!5 :. NL{6~N}TMW7V?>Β~K{[H?Sʦ~gYB9qmHȇxBևu-H[t:43q LvɃʳv_nEO׃nA쳔ky_HiόݖGkwxEH;N\c'g+}/7#C\8? r0]?{klpAZlY)Xn^u_ys܇ezIpdž;ވ~?{;*}ʩo,98Z~y|Oӡ^+OʽG|^SWS+@oJ\+9Ǎ S[v}S޹?L}Monve5>]B{qszÈoC>:?Q {kl ۹'vH~A ۏv[?0J:QRk'">D\NBŋ?@y֮~iAK~ʡCC>z!vN^y!K?Y[^OyԾk9~/NQ_LJ*O:w|M<w7vv;I7=ש/T&⃊+q]\ H_1޵vWOCӎy:h9裂G5~/3qa*(6&%B{_b<}}ƣ{ߟ)rq_Yg7㟮iNQ |/N8keG}mg끎ՓRw5&~~֞vqc8A쵡Ǟv;;݈88 ^T?N\ϚT׉[řviGn~:~X0xY_y_:qߜ'l]Ogg+??1r~|Q>}~v.q$%?kg9q望H_y>cG[w }FRyo!vtQs?(x/Uw<'pH18e(ovz-R(Y ϖDKfl8'ҎZ|-`xq]O?g㐊KBe|Q=}EpCܗ6]┞kqEn7Usn~?'*'ÔPߧuzwpGO37N9>ɧ-ۧ?vzYG.6O&])ᄐ%c׌z'.>vz-,qb1' JI:t&?WN{zKxjYGG?3ᷱMzng_Wt;$s@T?Q3ި/Z聃ʼnڞS Ce!x5 Q?U|o;_Vgy/|ѩ2'4]]ϻ;ȇ~FsZyPn3K;kg~#?/γHG$6?{;I'Ҹ~ϼx{YW_g-7qΗJ:=LxgA,4 9d%#^?y2>ܟv=MI7zs o1fM0ȣq ^wZq;ՏzyO_書Gi3З3qKcJ)lo'x.R'/Cv:;'߫MSqmf_v';-GkY.qzI-u7%3><وa8p=v{;s#8O?Ρ/΁o;;3^iUQ}ktY>K^t Xp%Cogu|)d;q]:Orfx.wvz=ӵ#m|1qc}Z(!3ΠgaO A?< ~2kx+}ơK/x<?y)~kN;i]]&9ԇ;Xni3 e\3=юy_6?I!uۗGFckSm?Z%I|x#w4/"Dsx;Ơmڎ㇡^(~'m%]\`xOVPx@#v3h#}ԹKeȿ$)_~ȍ~g}jwUYvvh{!N^mKHyϫ%?ߓI-ǭ'cT/rGr_o:}F~ |~Ϝr_V<_ A 7y ?v&8TJ i~o%~dy'[%yS<{KhG>יN1)Ш7m޷NpoL:Y;s4|Z5˷Eʛ>5{#_7[{<Ïo@q+{k}qBn7)'~כNy~kv~vy\$ss_.sMUc{S]E?n?߲O3?Zʩڟ{iC91iw72sC5hOG:xjQ ߧyG8"'oN;.@/&zytⶸwʅomgO?C=C?,ZgTǯ+_ki:q⤕đ9~H>Y|^V\RcO'6?Wz*nn:uf3G||#eu}Q'SrגxE~M9zcy~ic*g%1}75ܞGk=Ź[kg`40_n'[5tƻe#hX^g|i_ӡ,QX̎6 >GwV;w~Y@~7/ z䝤{@~%ퟡloO{: Q{GP-wRRigY|&|>iyi=h=|<@zپ#}iS;* յϯg7'R8OwEgQܩQ+@9כq$ͿA]w%'3їOzb ʺbyCsT,9Y-.tKEN,/K~O޷tNC{#gsMer~gG{ qВ9IYHg=_J}rq]As-̰=~N7\}+mK%>Ad~BK\ ^R{nOmR$~{ˣ~sS-sD|Kvvq2Cש5q/ı3G@p2nN \Gpoz#Ho=MdyN{;6mθ_g<,%8Kgqƅ> o~uI\fuމ7_cʗx$U:7ڠcy 8}ݯ%rI|2鎔tFzm]WYxiiMq3}ꋼT?Oiq}L \ k_z N=cwg<#osDoQüZҩӟ`pB +nN{B_onf:ƍ4Űnxyҳ_}v7>{;XxYwHp2K:ޣ=Ҿԃmۛw"虂{ѿ8TF^{=~g/@<N|ׂお9e{xPGi~BvO,~'xܟ\d/LIZ~^g+ߩ|_'gJ,e<`qkҏL{:~'ʅ~_: ՟E>{7.j1{):O۝tѽ]nnf:-J}L?qYu܇_D?웠 0ig|)uvp~N^}7˃Ϳ^;S}=bP_UyoL}stK[~wN{M{:.'1/3s5g_.SG;vRHycp{k'n?G{+IhW*=nNqa9Wį%Rx~oBcYӟ|)W\功wyY@oN  ](㊟/I=F}> /#<=a?6'O+6i8'O7֗z6~M=zK?n=s_(|Iyō,,|s*s~W2MSo];;z8))wW0m~YmPAť[%b=KʟʿvOY~e#i^O[.O|9UϔgVix6?,4|x;'_<_qMw~4*\^ʱo|h?Pԫc~zzY?Sʛ2vrn:~J6?,4|} }v?{%|}Wgs~\w/yTU9)R<{f~o3߳/WzrO<4\O7:U_ƫTO4zt۸HկEoz&5ҩsJB*zeq/;Jhz?l}gKLs{S;%76_4x$_O!^E{8,%_ޡAecc%Is_3?b} c#-BN< C{ԿN8C{9Pޫ8`y<[V_ io{$8ɓOd<=q7+L{x1VG?hMÈ'юPqWL<qYk|@~=ۑ+n.?ځv_y~qY\Pƅ/Upkω*?ʟ3/.E|i~./FyyoOxv7 y<* ıP9?SǿӷF/qwuh|4?wrg:.>/ӔIƻ4q;\_NvVS N$[z*i?)hXNpb =8.6I/nn.vm+r2*|f=ekbj~Qm!dկM($7}whG؛oqLr"|O,v7gWf~ŤP8_gˆodi)^a77bŝIA|/OhO>?ɟYxԓP~m'~S._0NO~O Q9_:Uěu`,x+WS_#-UwO4Å'/%9T$zHr(vs^o\Q~¶쏲o {:٧_ϸC]v#PU?,*C#ѣ;8.w U_0QOqT{vꭿ10ݛԧďޗ)v.8ԳL{;}{ts6Ahߛ^\ Sj//UߛwX^ݓ_:oգSҍ-^i/urs#ī$>I/$~,|#M5or~ppS0)8e'-fyX8q87ʱ8ǡ/ǝӷ?o,Ny!=\揊A:8eXi t#}*N\s*An6/vr3~839tG{];o/Ks}zqnۮG~=DRpx.l/P:.c_6U /wA/?kk~ ~ߵk[[E~{vz iG9qIgxSͿ4~w+_S:c3ǟz_7?/vF4 D,>H WcN?>H? {vz-s&(~D9'.O9%A<1`gfAk?+OOq?)9']{z[|*SgSlo܇M=ī48wIgߕㅏm=3縟xPHH8nȍ$s1r/>{3c&ߋOkWI.{ Cx,t^J}ŵO"?z|Xgr?EvHyY8l[e~9\w~{~7+xoگ/>γ8&FU/_~wݩ"7G{>Aʳ-aVzt#m~p~яB/Ujσ89~a]Rⷮ]5 &/1.o?ޯWe0>_v|z|~8oF}s/)^zejVq==FY~]>{~g>/A6_^48&5)z}k|B0CAkK+ 6׺}_p_Un+=0v_{9k/=g/l~zC{P_oHn}M\8qڧO>~1x־&*FL|W;x,W>VJ}ǥ_B튉0,/ә8O֣07S;hjkz~9]-˳)5.h%nMp~t 9-y}_M*7[|z}Dʊ\ڢɹSΛ~L9z|r"7a{gȏpHkQ9/S1FVѨׯv }0'_o>[~ה/JկM/uvgԯjO4#Y v ATmt5Koh%3oĞVv\B ?hNExz̕t&r؞N:Bn2׏Z{b'WI'JGb\~?'N!ﵻ[v򣥞OKUh {C㯍݅v?o$nFrDz5_yW\A9gRM\O,M|/| )s~N>p9g^w(ʝ5q:Mt~˼L:ˮSӕϜGKCyIQyqGzzw}߹?Gi=%? _-xN@r#_?~:[tY>]^y<0䯜#ܿT\j\Uz#Ky8=Ϭ]8.\zw#AR|:m>h< ~'x1#MUU#F=QM{|Z}Fa{aHճEǨw|9O~Ä_5CS?gG7A|8C̷ z1nYi-"y>Ǚ+̔rLN5NBysWN3]I{@g{:H/0ǭKԸj[d<{'CMR\vIU_ю?a<2z?0>6/`8ay^^\pA棛x]w0,qOn ML~*Wc}'VC/75~|)M;_o|_&nj3?7_8Tߙ7^;}Fr<9J\P2gJzq9|Xۊ<~y _<U|ke=w>p~Pnޓ꟰6lto~;*)5G|h~ϫyx4>.;> cz9a~Sۓ{|'.Mc{A?m?wF/joi̢OJ{^YҫW LӋYVr{[w❖{K|{rWޓeRxϖh3}e՟ګLn6Z>} k~R7k_ S/hgлJO;YMKڵbY܃WDc;XӦ#7˸;N_jߵK?&nTev僊wK⾴ϋ8h= ,̨Gp`|p\*7Tr=E}*lX#|s-1y}"'Im?' (e"gmG\x>{~'qzp=NMZE~GwgN?:BnĩT~(28h|u=M[HUnEiOίʙ/_ ܧ(λ''ʽ[(}O)߇=<+wC}vI;ҏʡ]A#~/k>Fe9_"={<'E~itK:1eQ/9YWxo><^ů xNgM[mϹ7ayηN/OYfsm\Wֻī}RKK_O>w} ^Zy+F}(]miG[ȍx/ь繟?L{99ssv0^~B*~߽Ocv[(ng'sN_,SYOiGCx3~cg0ߪg6O_ +^/? 5lG#r7.>yzڨO'w!>.~lׅo|TF;'iNe>߫o58#׎ﳅZ^ŧ|c:PY?H=~gvȯcb}^{v)WBv2$Xn|Ww[o~ʋ|OB|ZgTRyy)ŏY޾R~z/T<*O<{0]GRN%h^t_TB{6RN"'<;R =]n:~hpe\W# ogIo<\^>LuG9CO9+aw|^!?|;Z# H7WS)'H%^NPnWWPCVq"╂މW>~7:Ϳ&pn "7zF?iV$nz:iB{|W#/>7y=iKP3? gSδoA^@^#&Ovz-ocyrPq4VIus_ \4d\#Di=ॵ7-M]_KL~?oSJ8a;ͷȃ‰~wq3sp?'/6;DܮeB>,8#OxO`[;rZ\ (;ޏq\IOe;rry>{hK%;l~7m>hgzJ?j)Co?k-' HY|qWBzv5hc&^]O8K]ʭ|oy\~O|q|?~6tzu{80~!~&"Ee\㛏?5{{.c,P~&X/}=INM?g`_2ߍW-iHiRS.y7SXk^ZQW&ql/o6C>D87k|UM1>7Wo?"7Q3`|yN\z&JSo=I'ZN+<ү\4'G|u/+$?(Cf|O׳e=BL.rxѥܓE\z\D|O?o[K7Bߧ]4}UcO;\{>;y>Iܟxz7Ŗg|Swaޜ+9+zg(ym|q1vH>K;̤09ͽ{훬rOU+$e{VD^fw ɧʑ\~Zmߛ=~58g;JOL\Xoʡ+NVMy dNRc;_ɇ@>;qw>aEV9r߶\_0yl+Fpa+/as^w7e5Ky3P9Gf9|̷K}nyg*N~vfX՜ܿo}ϰrN~NC8_?gZ?&cяⰟMWw <3/zC=sU^j|}g)Wϖ^ygz=U~dO{ۇm{ԝi$k {߽ƷT?m]).,"ke!K\zZ۱Tk~[#ޱt)vОxD/О&>cR~ٷv8?T~].|x In9'븒~}ڻGleX~.9~!zDY?(>;N仛(qǓ[o;ӗ3/ )(?o8|?R/O8#gWҥa>z>3]\%q9Ty/V.9/_\ǟTx?\~:Uw_}qS>vfY?7Gǃ|)2B~G\P鷃ӿq %PS|8ǃO&%e:Vw>;o|k\ŭ1[?O&9~\_*Y||"|_}˾\x픯-qEՏqv/|~w[ޭC~+rB\W&%!K}ԃ_}XnNMWrV7vHnz.^=8'z#c[?N/ OJ\?.wl{8N}H:?PwK>ߵ0n#.V65>b D=<飧|?KJ[̇x33lw>n`մ̗t9ϯ|bv=k6@Of~=9Tޤ][w)h9G!rO/vgf>wo)W;-﷗|mZ(|':kG~c>m'spW}|㏋EA#l={-D<~Va NK\R/֓}P# ~\OyK}wo-~ϡ~80ЏR/[nW8^DXʙ_./|(U _m,'KXR^HJHo~VaOUg[ޥ2)?ϳSʟHH?ePS)g?o~ʧqoS*rYu4X~rQ-~5-r/|W󉟮g+%~?]V o5s<ͧK;~E>C>ycƳ3uR:W=Q8~^[TyN?L_G3կ޻ou?Xao>}b'ecyf|gU`;s}>>7ϳ*QCvxΰ,yy0LJfz)|?;\ʭ|g?zڿoBK>{~-*vy1?c>Ţ_z}}[z #^mky|E/X?Cy> Cw8.8zgn7M1W/|gڎk~vŏ{d-r|rz޳; .Ḭ_zŞ]$qqJ^fYGb^yT=xn_{zjԎTk톪ګKwϷ/YB7_ϥA=]C}8 kY豒NRb?a=z؛lϾ2ΖtlGz|\X+ZoPi|xVPWq@U^;/U?Wٿq |X'8F/~(/{hj-ߊ?.vj륜&nmo{UlVK+;v_/MK9_/~"OʱkW_VZZnZ O7yqCPnoU|_-2Pq35~Rkn<8N;8o\Wg/~\7]SޤeTmǯNr3V?Þ \sr>=?+P~xկXN}ޫg5޿G^p'#E@s84Z֯}i[h9v!Ӣ8k$RnkެO|x>q|}OvA3bIf:ەqvz-ূ(5*4q 5>4R.7^{twqx ; .[#O,nKop7ʋxiWnГe>K\-Mwq]ā3:^|?BW;wڧ$>rUđوMK߰N|BۇSYeoy/>qBY#P}f~<ů>?<^|ws-ߣQwT]CK|a{F;'zQ\iSN\,?7>\?8V7hŭ?ӿ~|/n)Agw;óxr urz뚎U08YC+q]]D}OVqksX5L9=?a%}[mǿӷFsR%C/|Cq&_qfsvW~;ռo~ĝ>W8㑾J}ZS<;L70 տD7b:yLJ~;r<~A{n/鵻VyiWG}Zڕ<-~*gǽӷG.:ߋ"nL{Lx>)cy{%ZNxY_j~ EYˈI\SIyK}ggIOpN#ii/=.E9Rk~ʏwʗ U>\7}E}V]?+׻ǮlۑYI|a̗>{&s yP1N3|'@9ay'RK-?Uc̰7/MC='T?=~ A AK#m73M:&z(myW/U[z]~Jy} G?]υէX?x(Nz/;>i=Ϭ7>xwcݳI95qOIvRo)5xա~d?0]Yi8,n<¸?|qxvC4U:7Ʃ_/3_q{y}GjǬx q8)n>H>gIw^(g=+&!N<.Q_*r"^%q]ʼ,L_ۡ\2TSetY}亴!I>\7o]tx"˱_ҿO_f|\ǔ<<7԰ 1/P/o'g;Q~*_zE}?>r@YSS}%oٯq~4g-rn;ao<%}W; -&8GhsB2~mq/?9q69ȳ壓 v]\Q-7l}iz]Te[ U_w|޷ƣEOǦ^Nߥ^_Q>̐>!/ʷn_"]B{DmrxUn<{>=?[vW)WA$ߧNS_,/4D|S/}j ?ݔ<څἑx*>9% ry|\*O)ѱ"C-yu'|K>V Իkǫs~o0~'߽@k>ⳤ;̇g\-+YVӳr_c}K/3۾aVOq<㼗zv1lFO?[OU^mT S4qX^F|IJS{<3OʒNY➚z8EtKG|mY?')FϦ~XqLOG>{F3z2E29%NZe1miدL;v{Txi{@'ѧjW OYv$gQ'"i|ehg2Qi_:Rq~B|.?a?j\3}"ѮPǕ_yo:Y埅}~x>Z?MNK\dN)_Vi=e>w_ȹY\"NJ@z=ܓiNLc$;~5ݽe|}qFGl(?H-'=,T~lgYOC%_9_䯒Nj~.GAryOWk_Ώz(|\Kv>u;:{宬7Gwt+ݿ\$_~W?|c{Wd~/vN/:t}PϥK%4֡O[U)O;TQUn=<{>^gG:^e)+WNP^fPR=W' w_KSߵtQo7*V$sאoUo!S~^h}O7:7 G g[L;D_ Sc7yr;BG ޴\/)D3;Ŀi{oήszɾV.6~UQOyu9.|/Q5&͑NA~'%.Fd꿪?nϙrRaw#>j>Dw{t^TEwwV+>E{v}>pp0|ߍ咏%qW/T{mgkߐ5_יz]ng{r%"%3xh3hp~SLy~΂*Ns#GKxnk{)iM'.#y_8i~7 ._+LCyvuzs靅E:q+!HG}׹5+LNOsoe^~]?j|Au{Yo/ו @N!k?q1 ^}(/-G;Qp@z(Goѳ_N:4'_g~/^9L9W|Y;ө ۑ_'%~{Fc?U<w?G?Q_〞N}hߢ7_C?tc^;Wr_;e9ߥ\TߧuzPq-5$jң[Þv~-R,M>ܣ?Mj:β//~myH|q=GGvН^Ct"va9{ ;r}D\'YGLuM s:;S_=ŷ^־cӶ3H^č(^`Ľ"8ig?qVȯ5#iW n⍵o _F{ӷ$73ͿwsWf#ҙ6ަ~.t"ux. ssO9'#ӗ{տFc<G&qfvwz}ઌ%.}R YI5|ɳOL|סoApcLNq>7q7N. ^yXdiW,O9i{7~8ovBſr}koL=mN/|gj[?~B=q8y?/ QIR[9I9y <߿<]ڴn;vxq*Y;xE^Ymǂt/|U~k<)_;92u[){&_?TD~<ybOdč{q>>;~k'I~7ު?~߲N|a\ÇGr,rZ< qn8LݝvƸr/8s78{CuH7Sqֽ/Pvq_yKң]C7F/q QU{"'E^:i3V⽉K6"v%xEo~r_o:qhwh?<Ď=go$֠uơk:O34q@y'):G~Nu=Z7 >ZݱOO?*7Pr+Pqqdžr9v;"7ĭ8g WߴiޜqűM{Ʌz 'Ni mN;&r^-8=)"Ɵ,;P tzџ~y_sOI'NߏS9OԳPg>'+_LF; A;ƃ}|϶tG2n~*nxrV)?-|0G6J\۝֏gqǏ{J>,lwŏ)osܭg=P a~%/>x>ng?:3ޤ~k[OF}nW~G~?[wIp-|{y-P㓟.|qʳCʉ{y6~⒕;_)~,r<ey`xwC$/c>{"??GoWz~3-t2N8s_GPnLg?;pyΔoڮ2V&|{Nq׏\/^?ac? 'NI0OߙG&~/Ĵ;dg}.?(ǎoa;L3'V1ԛo~wy~o䬟8:J;z.>_{㟊OO1="O|R)zwѸ_U~5Wgo}K>o_Zᄋ%}ơ[ZXq|o|'8/=X)sc=Moy_O{),?÷OS&Cm }M>Tys^p^t>1_˯˳\US7˗jfY.OTʸw=^w8\_ekC7~KʿJ1_?RR)^Cq-g~=esF cztw}ܟ/o;zsAzIΑ);K9wOW~`o<j;8SczGf\wRI='ޟy͸^,Oя[-?~'-~?]2N[v?U_VQKPyk(ԗ^=}z ] S?4;EQιiy_?M K |,7V#zM\OYNæ|'ҮE }yl)_ً}N97]lQ ~4az=ay7wvLsޛ|qP|_w7~9hP^3-~Q{ſk+W^=h=jѾTҋP |wzyڿ8]]\UhM\+~s|+h/VOmv/f{K>4nYv=vRf}S8Nc?k4~~|>v%jӾ)jG׎B3^+E;mvq3lGDJc1_/}gyD{wȷ=;}2cr)B{]!|? N˯3Kwa?Sߊ{:S1>qZi:xe=ĉGy<|?CG)'xS-ˁ8Is;mɍ&˾3ز?q hgó}{0r(~Lj_o:}&o9H[ۉ{{~qΥ"/>N;}GfO,=_vhpdP(W7Eߋw"u}ϝ^4v 3>:L%mE>]=J>FAcѾ~R]n:}c^|ke;oӎ)yPno줬[i<2Gq ywF>w@~Gy`y^U%n/W2_!wzZ?qAObD^88q}nS"_oQތ68TN|e=tݓ*ogqsS^[}=~K\]\9wS6wpMwUܞ |P.^ߴ3;~ 9}Ydw깂_sO5/|xܳ>O\VN 9'=v PfhϏvr.pr.?V?EjgSRvE{e ,vx*j6)*|Ϲȏgq3鐏UvT(:|f;/js^?\㷈 X>o_oĭ7^㷨Gt㷉v['ޚ7X*q{.6?,4x hA/|TΛ*9 /B}<~3UvsǩRlloJ+:!N߽_}ӡ2~~{/I,ϴq>cKQHGyw_/Oϴ6yI;~fJ9~=!LUv&~{q%WJ{J~;K=?\z'xSk{VGxoO$9~oHRnۍ*㯉l_שLwzŸjc?U+eypt d(d2^^Cϴv3R{B[r^q1饧K=V͗ïW>2!Z0i=ܡ_eN<랷߇tcyo:6+|k=׼帟"ESڵ9k/sb8̂/C'ViJ'gTz{?6~g:S/5w8ɧ*,>9Ծ}q1#]#r_|3oMnlgc/8QC}KKcnC{vM;g]F//G;l|s^{ r\ђ2We}eyZ܂T{y[+ӷ)7/q37V?s/=|<h7)Hi*nv>qJ5珫۟~~xQI.IsASE׳j:'5>!C q^?<Tu9C诨ow9s /VH9Ĺ}xG?cʩ߉| >\wj} ۓKz\I>ATn&FOh(q 51qF*~О!+N3T\a3[~3f-ǮbY,L{|ܥ?a{J/RG7%wk=.QN?_dc"c?_VW85>tr#~IT`Q(BwgqK58FW>_(j"ޢrq-O)%vDmʠ]~&oLq<$^LɳL<4K?eKH9\)q(Og8^^$t5Jfǧg~vm>>qP,"OQ΂* ?VRӋX- Y^Ow'^\wz|qZڙ+\.ߧ_Gߗf}__ғ?Rz'hF3p[q=O9ks 쫭8-.Wْ*?sn93l"?qv\B7e?_p|>rn|^Z} }C)&m{|e\rwȅ8e|vҫ1=QΗr'K {tQ>OI"%_Rf۶E:Ugx|c=&+GS}a\Mp|S_y~ KPԳ}]G^Z+2|V@;A{@x]C^ɰqTb/{-cַN;ReP_&^'?3;Gw!/Ğ{@Sj=Wk7Z(/j z}KJ)75m+g;5gZ.Ts>ww8OVeI^\Te&J({[Hp(^P]/N|+}@<:Ĺ~|8ʫrP?ʳGWo0G'X8]rGiM'qO|\@\Ӽ|8߭G+O9v=gϽL_YAOz;r_/zg&> 8-Ť?Sg?Ozg~=߹/w89_s ⰲd{K:XO]8N:Wqa?y"~ _V?;sJZ?_<7w{|8xoFsx1h;WWѿ4Կ(o[ݍQn ُfKzS~gGsyTsMWGV}T > ^L\]~<ij~𹼷9ʸFik}|+>V|.?V$o}`etAEi>>ksJys<ߓq5~iGi}-gx9H:ܢ]gH _/wpܴ7Cq/0~t5>[މkc}3?GKeb7ՎG|~cn=(8O~{Q̧iwǧ=]Rnڿ[+U|-:SC9gZ~s%bϱ֣gK=gz}8v<[,}zU~]^{NikmgeG}y{W9<{~w/q)-XUq/P]wY8=po[(%L])MB+bk{=~{>yr_)곓)׆z>_uGP^ ؇},~Ŵo{8'=Q^WO jk Kz0C.sP-?R_6O>s%XgP4!WߢF/jw,x 5=?{.> >LǢ~UO7rfX~cTsԛz}Yeo!w%}g;_=`p[j)-7џkӾ!Ə ]o,]~4_R&8]C;^&~V}Y;Tv}q-^D=;W>V\Zzq7ԇYhho[va?P)W Au9/~aW9 g NgaHYT>\xWL~z>ņ[FEcK_on[G/o?ns4j!n\4G}?76m|_>v7v6n 6_Z];KotgǮجk2~z;s i?z+~K_&ynMܟn~smˏ^sK~OGۨoҷ\|om 1\sI}樇U yVz捍;#65?B5Kĭϼqg[W&l~];6('%[3U堝?a+U,OLcE|onPZ1Ԛ]J ]vyOn굝ysj0m>Xn%rviү0COq|^.z)kzZ&Eul yQp]/ezxzjBo9</ʾJhJ/T~W/4 r~;^|G>Х'R>q7UhGrxƠ?U/|^yj} 4.3.&h?8Zfm</&WS9X泃uI}MOsmh;)wQV^3'1_'Ri{_;^k;~w~8b_|4 ]9k#r?Kt|ާ<|磁LMz!(/G_Q}w~yi9a/URo`ug>mz͸9O9};<7N}pW^4.NGPUsFB)ay| Y""ry}C;Eo >sY_+rq}~߮=ڧ^k⭷8O;8yf>ϳWJ﹂-|PzxCe_βrs գq=;-G7יէ{~,xpbe}k%~|57W'08gYuq]0.u v5 KHF}Q^Νj?:G}aH8ȯ&y;07 ^s_wBǗ/ѷ=' ߃9O莡sCz5MJO:뮡\uzȁ}'bGaH8~vW'YȮ_92YGv^eűK"ڽW Սpbtg˽vP9=tkZY7KC43bo^~/ֳ7]1k ϫuWЃ}sߩﲼ@4Wf=o}Ƌ G9BDsC>c3џ^&t _Fx ڭ9{i-C{i\Gkrܳ| \} dΣmW}9u;sl;_/zyY;J~s-p{v7~-'7FLrej~?F Y럀_gʅߟL `7юa?30m~Ƣu=T>1ȑMyPqc^n7GW?8ԫp|#8Ww;i5.֏:0~3~1ηn_ojgfOg軿~N*%~ /uu=ɱH>}ڇkڻ][^Pr>]5Ds_گ1JNGMZ-/a\~ͳ6},vtfspc;'#-w]q~>.7cg(~O<_įx^=zϿ^z{q}z-]bmGi顗J>r^B> a}0뼡5hp>͋{=xk6ggS>m_WΑ;3rzs^yKh o߬;oNL.DW◰%ԁzaW,+; ]SӮ7ߢo6c[pr_d8JXyӧW3{:ߣC[mhνnam=7/h_z.u}ӳ',5s q ?:sߐu%ƿS>g>lӥɳ;hO=C{v ﵈ޔ{ ʳ^17`܇mK߷yn|aϽRϡ{'ՐڕY6FϠޢiwG{oS_x zp }q{ IlyG;oڭzx/ DaG3nwc;@ܫh J7Nd3{b{ҙ,B-߽vȍCyNY =Ax\淇~>uQ{W~LߞtzmA/>^}Cpmr6߿g?WQz ppAN ؇%nkE?kO}qkߏrz2CZLv"E=+'HƯ{~]/={O?޼ן"|2!ћ'~;?/M GXx0KVfsu֞_8~Mg~vUѧ}c/﯊+W8ROks}K~IZ=~)i熠K;<v~M7?Jc侏xvݗW>=ywf_qaǿ&mt=΃>?e,~Hy|yAKfͶԿ~__; ׳Ʀ Le|y_* 50s !uyoHO" 񆜝 OnOcmg+3$l!ϔsSSO;_x|p1|s89`/8_) =sB{IsB{k38~8:w}>~A>K◂5_&9rV\cyN痜_pHvA۹N>~kڗP곶=򫿕/-~ZZc}~gڃߪ)<8m^iM7q?އy;伫-Kxno =gX=8? V8Sڼxs/6/&>.~3/=2ևqN轀]99g`~={od]{9uSYspO<~>s ;b߬~JcƮκ_[Y?PJ??|tMF?Kcc7*o'7nY{v#zd(*[߃ȢG+E/sgvf7.O3=U#a^M;9~~)ra=Ͻ9GPEϻ/vw)>sn@\[?x=De=wrzw﬿"9K7{e;8?h~/߃MmN'~o_Td~L;{ۯar _㹠GDy}xܧ^ȭwOͩI<iEOW5KӦNCN]aZy?v;NFW8^Ov*7{ DoCr;~7|ӯ㶸iWBߗY}'oq\_ſ~[yNηj_i> h#xod˹0.^bw ݁_Խ79>Oosa{S{r.[}(i}}klŖfΟ#'38~|ԫ`>? '<-Yn}6<㹷2Uqsg|b^IO<׿ y/?88N3gx(9Sys˜}?|l~~l8TrP}z}.3'$.E?$Z{ Yi°ZoS?v9'cȽ6磧yH~n0y6z'׵mc~x97y{WgC$P'&:ns|w3ѳ9_v}(zY{|?ҤWBhymѱֵK1;"xڱ9r;X'Ǹߍ@{״oh1ZkB؅'0;jrS$9cGo+7*_5hsߩyZtۘߝ]Ї >i?ͼz̫m=y[}84S ڳ8x?K_/Βf1thupyǏ6Sk샂Cw=8Noq[r%.;7{7~mY.3=m7ubC⼬bcDԫuEyԻN$=J 1O$UاWysɾ:P9[}][/~)+r֍~~|=|tI9{|~\6xO-\b R3 Ovg|ыOM_3ulGo~~~r~RG=]ø:?i\h*gmߋW?#Nxq,⿴ p'}`3G WE'A~{ǯ!x&3?zO`h;}xxǍ=6q(Ӟ7u:{8~=w#GscE?xs7g<#/zhDz G=E}io{g`2z69{OπsoD1tF N[d}Ƈxeߦ͗:u^ENbOIgro.]=ou_0u+#f N%:p/~ZyW  j[{ǣ`tA>~p=oj/'r:8 Ab~zv~{?ﭦϺ̾G>~G~,"wi$?}JOU&-_?ZӮ *9l\J}w8Wc6nc_P-ʙ TyY>x HG7.qoQ=5s>3~JpN+ܗ߶M^tg}qļ%[=yj|O彵a;>2@ {O{o/<ƓClϢ S|3*8A;OSsv$ q;+_ys0ァ?m><<{ 95~Qһ/v.zuΫ!rOH}6}2>ydmD8sɲ}F?zɼK* s~">;/?/_|'@y~{8g]3؟7V&~aAG`Hwؿ ׷|`@~eΉrg'Zvh3_wx~eSܛxI |=@P ֋Fo1yz߈> ~\X/sC/ϒ _cs| Ճkm_S_E40'4:ޏ9;7$9'*Se{ի_x_za<ߌocky/*k[c^}y7x}Ycxr g: Ν{ƥ;v?[o-}1cE/F|5%&.!xF4?=|8oksfq ?5qSe~O!g31֐vq;Z/|Qxdww n{k7 >K:Jh9b 3Pg&_m:$WF9Ǩ|ir~?.?σKO?,yd_[/Α֮i'Uo96Gb7V?ݐ~=}C]ZYc^?t0#C=Zu㵡O"W<.A>)߳u]r].8> o>_?A8'}}ƈq?|c|5m;8}d/͏ςKQcء⿃|{hs槟w6vo#g7IUI;WT{_u{s9O?GIOICg}f w_Q?(?~rL.UsGwS~Ow-ӿ<{K~m^6?h~Ll.ǟ9?yܳ(~zϻ|Υ_ܢWNsȧr/7>na'd{9Oma{m\O'ނnv>g' ^yM葯{hoF7Y\oڡcU_x׎]ָKl!0wQ ^ j=Ws6nb_\i"ڵ˳^;vtvT;1ڧpvox~^~(ߵ~E8/Y8؟>/ 8Uhe?o0r=~O=|gˇWϬ}8k^=[KvLE>,p:mhpU7[y=Cf!`@?{6&2|'jA}k͏_h>|7Mas0=xEXۇ|0aV ]WxL 7s4pv"i )<K3S{~?d|7y'_{qo֟K\9L~GbA?/K%9e}G{?/xWtq]9z,̸;H'(?>Iz8f罛dI2Xev>_-~^I};p+X-Y\-s`7.}{K`OܲYs3Z~:|ꏞvֲsL)C^w.'.38vrNܿ>'`_8~#7]~(~K2^w 7>;K>q_X{/}4؋Kr|[U?ŎOo>fpwdOZ'쓿75\}8_K_kW??7-s.2xuLɟN&!_X79 6Y,pgƟ fk!H\,/ϐ3ɽ=O:G9/{cỵ=;l|6_vP?Ƚe7idttxO]=S{SOIy~rO6UΈmZ1n7X%z\?M&!% X?hwßŗO CMjjcCqo9v=~-_r{cHz76q%߬zcNK}+eܯ_a#pMݒ~zmwPx6Tԗ}X^7?㥩ܱxe8"%GzpqG{}V1uA;Ƴc=4f;iݶu6u;I;=gR@( 7+TpKI>ƙ}fH zON̐.F>{"~1۾;ֹ&8"l}ͰK]#z_7X=n;w/_S迈oa .W/Onyv^C3RֿTԧ5s^9O{͇ڗY{s?mO4-=峟s~g!sCY/0v7NĎr9^M+?)vOxn#34|Ev>"qwc~Iv=^uhȩ{}@~8_ߴ/yߓ~wh|_9q\oc/tOBrG&K3o:W,Qgu>+qS+ȍ񹏰?]|{'MλzN?}=ͮ+蛍>/ ~9?qϳ]o3fҳ.y9yL'}]O~ _F>su}gr(>s[W|ƴs{ şV/G)W?Iޣ ==v4?J޷;[qr?`ю?I{??u:])d8UWϷaK꣹ߗ۾j_껭Oyްc\/?Ko ~Go[;0?;'$zoE֮>^I7 6u/~F/-m[ˡ#K3==q{AO񁡾wi wwy]P+{j92ދ{\德om=Nm}p ~wqA_Qi[,+G[]*sO)~ |6N|/^۸P>rtfG9,|Ou譼m9'@7/m?/=YqoZMp;#g(mD>3.=kK[ɈƏS=l h)voC:_49'ڱo_]؏]z!?yymv'˗ڋGZ'^W+[;?=rL=d%( xExmGQ,^/ŷ/Qޝy$-7Y7X>߬r+~2{~e;=N\ʙ6t@N9>y%^Uԛ/1O1΢ coM;Zq8ğqm38~&8};@OZvzy >lpM?Ϸ~ީZGQO<ܪ~8ilz4_kp>)GN߮u|};7?~r>L?眮qCfG1~lN?snO>ڗd{ԃO~B_ỗOmqi,o]ƣtP0/R~=<~~k}󻿝rϥoL}[܎|z~7~оi^9ܾbL:^e%iO@N7>} h뇰[𹲟J\6|2EJĉ/~:>hcosjr~?Ρ6gwKs/G\W q^܋S8[nyg¿gۏ|rӷBG`uqGէ5=H\ߢ~T֛^ߘz;}&=[}.G{S [߁F?D19/gnI~ xg_h]sKπOr|m{oވO?,_8a|j]&q׵Dsos<8=9iϿ5obHϋƻǾ=%'7SUpi{h}ì7wp>)=ڸ #?a1K}r{#*v} a<vpIo۵RWφߩ'AyG}8m3Yu M[q^gו:i:/El{ _Wӛz}Gq=] ~*x_}h/v18Fw12B{~M粏=UtSڵ?5uŹ;q[dr1|}YٓG_nަ&_bnvXo?vOc)Ws3l/~+wqa.G|r~+]O/]b^jߧ>0_bwR?1gxlO7[h޳6/E&!\se!čjoɗ7??0miiQus}36:$9q ;v2;s3?&e<ݤkS|6j#qS83ONFcf}%V/fESF>4~Lo~R&uE<٭Cz-Uf{`_KuI: i;KW_̽/|1{$+k3 %kIʝ~0ooڹR'W>Q{MЏYgZO|}^֏ִNA E_kv[ 7v4.7rN;}+4qE.6U&^;a]яn~7.% 88}N;?<چ糆?Q延? Igό֯v?tzet}9|0/x[co|ן8/~gqVS9EJ=I=h6RN=7|ߗ/Osr7m~Yh-r~ާ ;?v=ӯU;7F+k[xύl^#M}|9M{GͳGwg6*5]5>dzw }5k!_C^Sx5j&>jGXC[!|bb{ k+X^ty_CWam`\?6w}oaA0{7wԟq&GK/ssq,^iM\O#oyho"cqI<'u;A9Kߛ?_L=6}u;F/{{a/oGy>Şe_3.Ŗqװ&6nuN;/Og׶^xOOio~v&_IJw7%S >?_ED;d<'_98'x?:?y:П޴vO0G_խSvLu9n*EN=+z_?8h蛙fIm>8` 4j|Yory8 ?/]~/xN;'D-s~}! ?,z@?oִwn]- ~P{v6Ozo>?HO?o﹄O\?X~B_}`쁬ciiN~ q?|_kӯwe\GωlvH2"מʹ/9ao%ԏz|~hcEL/;>Iorq zU'FyCV}%˼Hy'j]>+{בN;ʾ7oU,)5~~o!吏 ^9wW/QW0>b^iemدlǏ ?Pf{o\лk+}yNE76O'U/F<#qInG~)ߩox_4 ݷ8W}k@;Dȅ~ #qsNmr> zg|>=a_b7M.8%xmOz2~Ϭ͒Իٿ>;vJ-x?mKy>,?үgnA?Gbn?iJgϿwcw =ہ!%&Q⇢;yyvG_j@ >p/]'H-۸#ay)W|vdx>fzo_:i-Gy9}6g_KM\8G?Bp9k?׭pKiu\@ivC<–s7"P^t}_(C74~SoqcN/O{}- {Mm_fc<JO8ϽǢ}O Va|6^\=Y'7 +ǯ~ n]bo- .GO+)O|}v]@oHL/nk-p?_:Z+/t p~8úp [/|2Q.r߃{*?s?YpM`{>8|__nǼ >3eu #gs5pɽGC 䞑's5?uu-josqVQ8HG|_y+ֺ}$5_c;_'km5m})݇=t:]O$nBCmclQ_<Jg&/gm~xlc(/uɿYVOwpNM?Js!ۊUNуGq EeJhOXxN{%8Q 9J9eϋq=KN/O^Ԟ_ٟ?ߍOF׺O5_O`;Qb98~lFbw=x~;I;KۯjK;7?v)v#Uq=wszgi;xHƍ=wڋ_~/HNUh۷w3H}4گqAЮ=zh_г߷v,~LZams ~l?qڈu-~oyrxS>4_ \'c=Og׍muN y}y}]M_?4v(t u_!xϼtq漈G㽋})~PsϳR-pΝvz#P潟!ʅkn OG:}s_ Fc۲)vPFߵc#q[li#-v/hƮa &~ n-cwϱsH6^{y9yjr8'`c|~V^g˶9]ǭN;ӍڳrX>]eb3:ڧN#{TZ( }[w[Z|bePeUzsˢw:F{sN9cӎ@i/Ў;18KH6RzkOwY8SsMq?,9?G>.Ʀ>!G ?e/L;Q{sq5cY|-bO+N}2}Ɵ͝C>ӫ'y޷xW]GWy^`ɰWyC{k~K-?tzyxc~muxo~o\yfr/옟=?i|/WvPF/lrN==+-;_sQt_;po>tܷWq5c_Ҏ2a'z}EIG}|<}C6{'"W^OP{'WE)?C Fn.n&ru~aK;BR9rg<]~om (4|_Vgǎ6;6u;:aϏ`G7 Nt SC+gkn`VKO0˗lv%n){Ns.:՟%K|eKg3qٗ'YwבsCvWrτqC>&%lyi//Ovz#Ri{>c|sL QԿ zO9ko4\omFO@7gF{S;o=I}gt1O*n{E9Oq5hG>H ?v=*}6|;OB-S*)+[6Nӎs/T꧟7NI转+ѯ~Cg?)~ML~'n~?'}!_]vq@ѱ_C?3G7bQq~9U_y?2>shHw?֏8O}DrDqN9ZG{dC< >qfx7~.ϧ8sC|ysrw|U#3񇩞2#~rOg>8Vɾ[C\*Oe_uAq) о6C=Ⱥ齧gY>zf:f{ QD:=˽0pٗ5}|mwKY:=3$q\#~@^t8#y״f}*iWz{4^۫Wzcq'w-/)M!Y_ǟ'{ow4dӎvzX_k8C|q^4`ϗ~SNA |}4̊{O9g~-2q Seڧ|zQ?0+uq{K"{_P|`C/X\OUYO}uU/zw;6>yy߹񯢿܎t{' ;[R~dcs=3qi߁/;Y {}8ԫhyu3<{C'z>b1Mz d|@$@ |S7v S.5.ݎHvfE_ty;绵=<[/]qsu&'~=a߻{7+5}Ps?73g(qܣ6 xt]{qS K%kcKRW7?Bu>?ͽɯW뉗_M3*G1.4HIj?CY_]M/v >n23C~f|yP]O0<7xEU}=0f?;B?w]r^K`'WO~.~68J8RO+Gߥ@VSOg!x=U϶qvo+ g냮oy Ey=uϼG4Kh}i]"wFzkşY?_qQX;K}q|W!>D";et;[^k4vB{~ OE%W=Ttygp~= ]oKq߻qٽwsREƷ8\ȨA<-8^XzQveeѨ9Ӿ?*pW 񳾌~{C~/)N2+ga;;!v߾zڦuqßV7cC_9W}"wis8/!>s܋'s͂z=tc8N7p=xc_W,7RKkiv^ڋ.E[H|{ ?ٹGmDw}PoݶWCs?e>ēnv]Ym? G^g_}paS_qnN_*jW]q]l~nrsE#e{/kp: ۓ}ȣCiH4qB͸oeEi {o5u"7 ރ~_GKHo6ݾN;N;땮 r;k+?M6ӝN"Lsѯ< k8Rv;]e+/8XA^_,^z"?Hvivivivivivۢc?z￉,q M}*zN;ڢwkqw9~J&n!Wk'C@>c>YQM}vʏxN+C|sejeNoDq8o1ً>#Ϳ#u*?'mԣGrh/AWi,SN;7plqR;g{^Y~i޸4vq`uD\hocLxy9Q=u"70/!GߨG37ȃ~xFaFα{.{kvi73>g{iY/hd7q>Pߟuiviviӡ)289f;vV̹fvR>IwzҍX;8BNͿ}/O7fg-r&ƙޘEvi7"AȓxޔϏmv{:"7 Q>+/ʅrs>)iNU9 )>g·q\mE{vzӍ[j#e3{}پn5y ]K~?r0?h#{,}Z7>8ڸ3ޏw.`VU?m` u`?;UlTEML۴Q4^ MjTEM!jL=iަ)cZD@"b7g<{I=Ys^k][ߒC>q7eӔ/Uie >&2Qv6+>t_C4z|(;r?,Ӄ 6T;m7Hށ%7zw#_nw,t~A+Ow!5^E;D/A>Ol̎[+F\QkWCӣ_^cgs: lc/hgh~z |{,2͉V}/Z7zn{2{rhqCfJ Ѧ;ksAL*߼YQ\ >Kn7[ W$7z':z4G剈6qWF=R#a^Eo܀2,e?'?]|v9ыZ/ zЩ/~sWN-^4#{\-;)rstԠo,Jzf'M{I} O۵_kȞCqD% ţ~=t,g=!\?iUsV1^U`9͋_ZxwFpyeq{WվjUԣP;-nsnwVAz^⑿~~՚l~¼?o4垕XyU岋M!1_*9#+j˫I?*{ȑNRu뎤^cyh[h߸:}E nvsN!xH~Mryy#ZZ7}4PL\vѱܖk6އ_<&9ȵNUvnw}w?De:yP4=c5Yb*O8CznڜߏP/_ԙsGBC={}Skڔn롒1aqJ)<z`38+\zkZY~zaM^?gu}3vc2^~鍲_IO545}bnЛ==X;ESsX7W=8~: f5?1bGw@^j-@WdϘ1Olɍ) M9g,4-^7;rv}))#j]?nd ψ2߷h<?gCoh,W:떺RX7Г'%79+rs֏mwݖ ;P sa9=ފ>\x_pKfyq%'ۈK|v厽KOJk9Qr|9b}9\;qꅏYnq&ɇ*>4Ƽd q_-ߏ]+Mz +M*?) UjoG>ə7$OqW/Y-?/iCq&FO;x}skXC~lo_|RyR7X# /wУߜ0^_k؃{?Z߮ qd-̏:\)U4?@z@H<qA|ġ'f˸o ^ ;߬cS!v$-7=eJ٫đ /`7i?f J@ѓW Ϥ;1dzGN Q' 7Ϣ4@-yJlCON{E8/R Ap˰o3=%:82ؑ3~7.&pZ!t:>< .O~/#y[f\A~F^ZOۢ tIt?vs㿬[{|.S9KZ_oﭿoFՖ'oA\vy:+zC- 'DϨy|2u{/my,YP{kɽYhK:N1V_bpp &}RJx s8S| FB\ ~( -}v/呞Wc2~My?Vy/kJ/@n=Ve[-ퟁO|/{Ǐ-/#|vkA?kӹĢ8[N*/**>e5q?r2^]T^za*xS>_%9"ZCG~}K߿}To=8OqjEQ/bs:;` Np}TpqKwj499봢٘yay6iu'q%Agۓ"M-lџ v2'"Y?Yxoz_, _V$+7.sUB)8Ob+x qr9\|ڝ~ʮ_FQY6MInMº:\zѱpDF;g 8‘P=%ng%wH}wHΥ»7YRi}? yQ_h߬Sot^]%yOč>i?\R7;LI?=|27^K7^[#.:N:LUw&HkL|]9W^# nγ`8E$~{,B~跢Uy^x_ r7ɓm%K'S׋ů N?!y ?ڑ$%쳪Vˣ6k\ q z~E mFT7z_ZY7aw77|"S޵ n<hгBo7%Ί~?<'y߶\9W.2O#%_[rj`l^Ѧy=NbT}Zvʟ?@ֹpHz툛ohy׎]Lb|)82 2 xP3NP%}y9X˜o"o5 (I?OI'Kc/7c__%Йo+Y>%'ze#煛ݫvTw*~{O3oIG! 6'KOW;~ \w;^=, ~_vLO$z<zTnp )9Zd_~nհ>j>]8:K&~<qo9N_=4~#e"e\OoeUSK47Xz?;_F&7yv7i?;ߖ^n<atq||3}{8 =rû߮j4]eB|E+Uqz`!0'U^GI'9= IŞ;GJ@q;|[[-h{n}S&tג|L^g&}ߣx/1׌BA'y-dIעKJP;ױo?B|b%)w׸wΰ>H\pOw!vLxtE=We/Rs^5Ƶ/=Ru>7G~'[ ʟh!}G+o}^~ ?Hbܣ'tw_&[~iك{w>Ls?Fi/ /ǕSMׇhP7 : ] Z{7xǛzs؞%9#z`ȿte?)Ǥ_Y{Pz.)K%e\xi>a="qo7LxI^i^!.Ͽ+. Uز{{yfk}c#xצ:'U\g}<.ސ}GWtL=?=|t=4_]]RU6=0c=N1oc^FbE:y;Qz~{8tRgn/-yTYr%4#.?I[!| SH/ikP8o.|9]m U~5 r\JrUq:ZMޑ{{){=q^}6Ƴh#NU8Js, 7A-nlL;IoTTӑʩf+i[6:5U>>J?iYGqWпPg"΋>T*=eY/$  멝,ɿCkxߙo0NFtxGtP.p~{wg,˲,߼t^֞AfGy|O`šKr(wzy@_C94x<q?,r,*F?8σka>=w>Yύg+#PP3Bt֒w%+,|zσ!ζGK_8M{_Q<wM=~hQ(|/ȏCv_8yϡ[8'zߚs>*ɧً<}yYkqwz3{Z)eY]iMλFv/#3*V:2R筑9q҃⊞e^5ۄ3P2k{/]ͧYSPYAȲJyp8:yQg [e>~ܥBPϽޚ_j鼪m+\f_dw_?]Ps"aō,M#s}zkxo*T'F=^z<%/sh䩙&o')>'HΌ.9VD-<|*r!tNw{H_x>wWedk|Ӿc~g߇qaɯ8y2Mָzh~\;@;DC^-V.{'Mާ6>vGsdU:v8#yE{ yLn,U}K 1Oy}َ/uy.|jқp{Bv Vq}m|yd=ĭ gW]x F>w !8A(Bs=/i^zS͜=J?s!yϵW}>Ƀ*?޿ߝOXy%/RQܣyaH~8gΟ XC?B<'ix sBF_|@U?+m,$}!Cb7ǛHr[s ^sB=20NJv}?7ΑspPP,y=+nAgE7à;}/YsK|QCzxje8GuItw6qωYWb%^~5|:Q cUo's9W:q}Ǻ_ԛ~e~oy7ss,<| _h*x'|@ PxYt>Q91_ PF#t+ԟ|Dv|AK)zb#;| :nƱ^e rsr~~FHόA݇^a ϳDOC/QCu]O.NGa=_A?>·~"[sm\@ G>@uEΆ\fKwYc.X or<RvEos-.h :A"v|q0^G:Be^r։Mu{TgNW-KZq)|k^>8ޣy~SYj *EOߢm8yZAy~> Gؤ~Ogx۾~D/|(ߕ[bqe~ }a7zo-~>lj7,_~ :~GEa_}_P|lAyN/T`{3܎pi(:<}kZ><޹ ~q'8OA-rDPeߜ+F(r88n_ #)/7އހw~"Fp@#؏~CΏBo>}4g4Ɏ >w-^c3k|H =])zi-p-T5%Ǭׂ3߁1Ukn`=bGʞ>Q쇀 _m>"Qնh=ɞ¾C>zZNJoq> t[֯kNs{=uH2w7캥;yu8_| X>`]c2e 7:Fss{$Oj{eY%?on/|UwdoTx. zxܿK_^</p%>uU[(|Q=<|N'<驲wQ=Cծ}a6O,5zUyGH==eꔲg?_9 /xr+8~~Pa~߲,}įZ_3`820g*L{a\գ߿l(? ^b>λs8vwnUL~>Zh,_/_yc-&ϷXsH? ʋɯL^+:n9ĵ(`OmӸhqޟ](SxE^yP :Bf& MO{{i}EAzX3k)Yq ›Tu=g9_s~ˇ~Hi{С? 5nȭB~9p-ǧQ\e?{cyI<8WS8KϠup y>/^< pEeo/z{|E:KqҫA/zQ 4֤~^'L/ +E\Wu?Uj#+C>TӣV~c\z_dŹ9ڷ޸X Z"N3g+8YqE<n4i\fh=MR5._kmӅ,Tg-dfgn}n#ŧd {'x욁Wm|ɑo {Bi%qZo7c#=O?#;H|<>٤uڝvj4etc},SGq]·&'||a;8fpeveU#?<_'?)yn|.}t;<`'T>x?vagWAΜd<弯L+Ÿ;\"|^#Ӱ3ЗI^ȹSʞ*cOUso~MketIy BxL`O&ύŏ8Ox|?Rw>ppR΍eq?fםgx>g' B=c_>GgfsqɻZ) gESI_٥;cǺW^ ҫʃu/G3?$sŇ!\bѣpN?3|W1g؞/y?lG盏sdwy-8->}D>$7n=?>|lp6Wv8[Of +>#k.g5{JA{mw*G>k xķ"'pBsYz|_/mG`o?|.|VH4+zz|W~?7uǭ,||8>Ugp*iksVŸryRW90z?g=x/||eK+}X>.:U:n87Aȧd\BZ7;s,Et}yka ꙛʟk|Ά~g>p-":^s&^&J'M}NL|OU}tWf>Ozq$7Y$s&:Uto#T?t>ljq8'Otj\xTY;y;l=Km?j]M\v*ntꛋܕ:,}!= {B8Si<` pA(~{q.v 9?vḘ9Y;^@q+,}>}&|˃׃O$||ޔFo<>>Wv7s1Ι?{P[п _ ;z9?F{\a,lo;[JYǿ;DzwQQ~7p;7CGmY_B\r =.еֽ'?ܲګݱo߁%~=?5VGVvW)~|G-ЇCOW5wNga # .ෝ33B|Au7G`!nV:8H3\\xo3r\'x6BYHu|#_ѳׂ={Uq8bEPzl}Q?VվCP ]DI~>-jX-d$z*C2~W#7?yuu2_Ŭٕ23c{rgTPG3?|G>:;]ϟvɂoAњo^Woٞܲ=M+??4Tu5v?;ґ~mSvŧg?'}{?=s;9/ xǏ>1Z>mƬyiwٿyE>5s)ɃYp虬H6mٿ-/]G~g^Z}ߺWOi>?n*tg_yySwov;7^ۿ./]0x&ng/V>N}pGڼZz~!~ݿD[\ӧ' !3[G|Ǯ,Qwf'%~niA_>|o 5ӟNS{_:b7]:qފߖ}[mW}U_QόYW/Z^rG?t=Ow_/}cxY}{H'āǝ;[~S'{W%i%-M}ϳw좴M=Q ^3#Y~l)G+W֌{ǧ}k%wVc?}o}wQtcndO!W􃃿r__6۝F:nSo98֫{}FOǾPK#3>R#?OY{o\x`t$7ߣw^wзZ߸yk2v;ceVo.>jiގm'K2poO{\y~1:Z=?Q.1~R%:7&F.CA:htԃw\fGpw{pEv񏢟}fn:'gtŷ$s/'z_Ձ.ߖ^vC&ӡ~ق_ܙv6XX>B׹_̊ho >V1^t1VmWwqq/n]^]ɮfDzٕ=|fv]gg95+fg':7)>]ɮf?gyu~v]]s(>]Ϯ $.ͮ/eח<Ȯ+욛]T!Pzx~X畓 ݱ)813;xc٣KPPw|-pkf R`?HvByf5´-' id_8Ӧ"[`QG* ؠu+v'q"âj|[БO^t~ltiMɠA?']RaHu+7މ}VBIS¹7*Bp}sDݡ==O}Xd]qVi_tu-A=oP!ÁU@?.Q ݽ#/^ Q|"{_} }?P57bd6M:HxtI ѥ,I~Cuuq;u7J@.N< {nMO疊{Ĉ#N k:_ |WWȖFq)Ĥ/ `Ob~`zxqzHz'z:}̆~Ai]r~9<ŒUl#hP4q¬qӐٶ hтhOl~?Q36g 0V^ ('?X,؍/l0'Њo5Z2O:Y;?`Jk_qP?+. [^IhO*]rB"W-?v ,$΂_ȟPc2C{ ,]:zM&(r`*x9M{E6 n \s}ʅ~}Wy;FKt\5Oq s1{s *(2.uO̟3/R= aY?XK= ^jt2-Yз?3ow?zjpb}71bK7,z3[Z0bmi0˭؎5u7GbW$3Qt}l=%,q~b{}x ψܭX_6K ,)|oV^'^8?ˇwϢ"X:[KfQ:ow/+zfay^Rd:/78_oWi|fF *vVdş%Mr\Qxחp,QtyS\.:yb2/+e_XtO磺P7YG0nᘿq}%qag۾ی~;Rq?7d*^Kq4iU]Fm;i)D3 LG菅VOjL 0ғ9~8GZhU 7s]Ef6AjxX!D :Gh=Ia:X=kPqzD(ѢH0FHX׻E&Jd4gCPjofVi-LjXΆ(MEG:#M:5v4# 5 $c#]9[GIe p13ZJ2#eLB/ :Z$ԓZݙɰcH04:{HI 4WcE!C}ђjV!"Mk9 N-y62cvCZPf{)#i"xʤ8=h24jV:JNӝrS%GD4C٠\,lwf9YkȢfv=ќdDQHm[/%ixV֮J:()mP4eL&YI'"p>J#I+9Zw5$}96-d,pKґt])lC⒬E[9~nDiDRjXۡf]UFMm51КΪSԈq]$Wqfields/data/RMelevation.rda0000644000176200001440000027037213754255070015371 0ustar liggesusersBZh91AY&SYfr?| Mc2"6ali5R"-͋mSZm[f!S#c"LJleٙKkbPVMZ m- HP $)B) T( @%AIU E@"%)T*!UB&UB(%U" ((PP{쥬 l%ј[Yiځ$l`٦6wǼ% d6jdTa!#iA RҲ)klE@U MZՃUbjV`d V6(F6dh#emiXMfU MDac iU6ډ& 41L$L==kE0LXɱmbdV-Ml GW1R)YZamɱV,3mYcbXZfF[D6!h 6E3clMidT֙xuOѓ2 h4 4 hd4CL&&!2&#@M4#CM CA0F?J~Dh1FUT@ #$2Q"ziy2e?S& MSM~M4{Jby'lif0LF'R y4hѕ=3T= <4C*z6y$ڙmFG4 1yLyM䙨 =i$!dFbML@ ) I&FF#h5=#'a4 Le6#e3#"'i c)LcA54a@I51!#Ldh&2ihOAƀ&C&I` h2MٓS1馆45Oҟ+tVrfr`I螓[WF~'5=Os?Kڏisy9wMs^*T_MwoIYb”)JR)JR)JqJR))JR}[굺n[ַO>>CE ̖Ql-X2أL,'oڊC+m(NS?9N_:8XQԷXС?*#d'(k8m!zW*-Gsa_VO/ӣVyYr3$N[93)Qj9۵SVu[ TV b&jy9;wv#7'gww;rx't wr*ekW֎ZfK%a4?іٖffW=*}_}߃﵆U56mV6 HdpUwᵵtvIWv_P7jM͏"NJy!{%8ٳk[cL*zxR=a^v3MfknT6F IƢP`YŖ,`S+)GPz`\P=uU봊TtWSdr=K>>L6Gf'%<)|n;Ffm1$d4BL(hnډVY_$<~t>>5h?Rbmb￧IQٔ>|ڼ[m#GG^2>*Nװvmb.FQW9 En/t*>FC%8ڸٖ'A?kS8'8Rz~$̓⣊UEW&71c 2bnY1h7;컾o U8iٷ`urpمnZڥzM]1YORϕUtf]D{H_MyU^UupeR-痕ulgɇJW'Zϓ'{Y͉ η0fr媹Z|v(JQմ1ZN1Wc|:^O; [7%[9Ӳrmn/|=V^!_\O̓]n5rl3.SIsU bۛW+\Ak}_{OEc4-2JW~{z'q/!oU+;z]+%X.]jMr̳af)yJu7tW'#9`yrذ'K+K7m7*WU j6ڮB+saw\tj)bBHb6l50&F1 פU{5W{N3emyQjvU,Z:B*jrN(8iϷ^.#vN'㡋t"b'7+)6ص+d~l_T6&Yj/oj [{UZSzg~`屙V>wnS'j~_}&KlÜ]݉T3';5 r{94,vxG=? X>f)m8lpK@&$ɂjOޗ>8^S޾: PIqQɦj'Ͱ[l|VzQ7|bK%qfUwp]|o;l_>N_!rTQfH3v9.;7^zɑj_Uq[&DEmvo'nw/_Ps)u.UЗ]&[[tU|4wu]ض~~ޣ6ڷ]oR-kWbӢ23O:r>2+6VŎ˖nn\hrX+\rZOE[tm>&͹ԇ|?ӰuKMfaNOzd]}WjxZ\n:M(E IXhLj62`4@}&\㝾cn6Y_z.lwvu}~8>;qj|L8%؋v5;cfp̥w0i%HB.W a5ymm/pMt ȸԻ0f,'~WL+{t¸S*z1ܛFwݶT̪5\)ft+WAhS ^2Pi\lٷ^zV(&/=[W[o\}?9;MVTZkDKٌZ Ti2 31,;ZIUx~w{zzo1+>n~UF4juEe vĻW6l20/[y(1gϾm;?[esIVkNk0%zIyUv&M-]888{ ,VVP6-kvI1XٰnQ0̓~~&S7[w\0꺧dE]НtQ2w_E~ּ!&ֶzڕNًكًTHjélOy.E;u.GɶUkZPZ5ֹEw^O7گ7mJ/#`E"rmuL픢Pzg[l8t2, ļBx6lڵBhcM2Pbh>%{VۛùJ&o+`V7OOUv[BHɬ=l-yJ?wqTveGc{_}ϧU^MXؚ6oZֺ,ItnL2AwvP'UG@uY6Wў' HSI(k:86'u<3<\vog_R#xBz N1;l'keE6Źs㻍(TsFw"02wk~mg?2T~eP,1G<,6gTfvv Pv^+ͪrOmU==mî.\̛>+a=7ʯOi_S%0mq7BON?)Pz;9VKڭ[àNSem*l8k3,S/JN32y7}I Sg+ӫrjջd߳ IƳeƦme΅ϝA(Z n8l33qQ ]t7#:yY_E}jf5_(:ʩlk9]ȧ* 8CJ&L%2,ݟ}^TQf$k^*]/wyy0)1V۝q2kz-BqگOC\(f-uM^Sԯu`uRuRQ]@Z[w2OKʎ4>jnϺfm:IRx]Tftj{~oִWMu5\kbUml|l71q%"rf[WPbpڹͱk2X,I4i &J #M\G]p1uM׻ٙKkx*[z?e꺾:ݍQftC;fzڮՌFwq1Wwk\Eck*W6dѹZD|g&:+Z%(K9俭jwmnچuٛ6E9z\;]'9\Sʹ[lG~XQo ]ؕzLyնު~Tbd#;ݱDmgGRnErJ[rU""x{8{ {6f{^UªHsav/'fgK?MKd{73uqqzT\]x8qƍJIFmX/_ʺ`l4qÎ6[(911l6MIf,HK"@O=O/,FyvAJgO(Y]Xf٘fY2T%/=֗%H\m[ff͗Ọ{Y?j_WMK %8~ 좛-ydCwm~cOR\ Z`Kjlv1[$Qr ř1c%HJ)0`Llg: _t#_t J:[i8^f&ϖ{5^j{jٳNN3Ӡ^9(cכ7}:]=ѥJ崮iڲY1zW~U]-_- o׆bmQz.W7[&67s%M\)wrc753cfy?~Իi'y #MxW8e r3l+I>S[^՛j05Fbͥ6kΗsG<9>Z6GҶ}-JP}^{j/#Ml>R.H466lD B" 7ꯌ$%c4R]Ҿ10T~Wn~ [Eߞ;zIuP{.]+}jOjSKQ9JuʾofzG^O+}wnȧ%`aauwnD.mHW-0a1H$c;8AƷc6qr8gJEN'^w ~8qsNt JF~i]o^7yt9<>Uv;.85ld !Wk݃+ S838yD=+G 3f9zܛ9}}`Zcoa1&Kv{m0kml?*OG]CVʹt6V͘ا>uDuRʣw MgUЫ}hV^sgU_NN]2+ޯmDi)) B;쑰Fd$2]iF 8nKQ+-qyaeX}ӗ_mkkov}m#\㓎8eJ|nA9jtGqXˊ Ѱ뫜wwM&IDcl)͇|goAn8ID?RUTfƯ^UdoGE9tq\]aq\{hgUur}sꅽZblwPfYg%t} +FWҺSJSVdErmjFɱ ҘC(@? k.o3e./~)v7߳ˊ7scx߹>98ϴQnqMu΅VOٿ#~oM {Y?%\_KD<=S&ongn#F4}hѣF4hѣF>4~hѣF܍4hF4hѣF4h4x(ѣFF4hѣF$H"u"ED$H""D$HKH?D)@bj1}G7֫#KS}gnש߫)'E%R=$r~kDZ@Ɛ\PJ!wD@,/眿\FO4L?E~Om_~7ۂk`.׷i/ɂT+]lS\d]G7pÕH*/sZ[MWE* C J_i#',K@Ufvrs0k4~k>Ub\_*96$ZLY\\^HgSQ%Ov<psLr!_Tr757^_Ԯa!ˋg[Y4X?BލKrA>muwyI9y)?c\gj/!ؐٮsRO]:qtnP8Ms;\<6:]6m)^'ZTbUE\Zo2n8|r{Kت yttwwQ4v7ߊpQܰ UDʝaa|isDJӛaGoʫ][[dH1C_YGÓ/ >\ hk-%K-}|ʸo?Ybf'Cvۧ'kccM6Ǿ v0uFÐ_o{Y7>)bok~T#If|S/Cr1b w\U "Q<cĹ^@fIR6jSuXf}䳇 oc_> -ۡ?5ԐSeȎ2dx훔$t#Zs"F ZP)~CymP)ܵWٜb.Hȧ l%:&bR=mT!|FSn;Oav/-Ui:.5PҾ 'qz.P1vR8ߌ tkb:!|韂LɷcRv(= [ xZcGC՟0 w OOCgonnuEGÖ=b*Vrts60CDOT @&`ֽGgܼs<+|P'b }y=uMNY^3M6A+X8,acwO{Yyaۓ̌8D2ev3iPdohƶqY$} Fe="ήE2/A攅mڳusp+ԗ53/F+K@z=n[/%r=#arT#~8yF7_ϧLt^-05J)p%.T;qo2aoo0xeI^oq;=;b>w%|-+[WtcQ!>Lxٙgh3[i7an谻<^<3_@#!gR(hz322%1N8G<⾞\Y ,lf8ڋ7k orC 㤿N5{"u1I2 O X7=ț<@sM#`bt]y=:kOD6u2 ÅX6K[YFIˁtYdg]"XԨ8bl;VQ+t I2nN9~߹bj96}eD"ʹߠ,ISW.8WRa٘otng6m+:Wu0 nG#<,:qfJő7pp`Y.^ .bk.D1eĤrtQw92qJ癅^ fhmi2;H)W3:ZiJsǎX -\Dv'l'4KJM3Jqxz@ ;]dA"L~ҪA%Fqp+"*ۊk*rT SVTXrqI';S@)4boe0WF ՅvD 2+oLFZQ彌Qx/}OaȘG\#AVuoa^DQZOIu%Udž`7uuLe呚E5b%uu!Î2Rir<Bd8`Ud[;=,L[J[ ؙgZ`#ysmgY̰0#S!.i: e xd#]hV@o[!MKH*[ղ7CmZ)״ }3e9(3IZV(xhSXűEnfNIq2+qX64sr~s)xo {}1LcE׌+gSj1YSOiH62qʲTAG pf2fL\ן)ϸaFxύ{rLYbw(uV3A ?F or!'Iq$N :m|Dbn #I SU{^VR^^'R.LS K&"ZzUp6 Xa\zۋyqz3\=dC.8n@(T^:vzoWEn߀"WcK (6{oy\hxрCu1wbClkqxc[Ec.`7s/E>]E?ʍ8rK!Bgw_9)e0xB݋k0qJJLNr, "E9Nd(Y1cv MEZܰ W5*noߋch*ssȫBt?ڸf?Cmɣ.OmBc9UpO?3#M(C-B?F)DkØܺRV&mKV bC0N7;z-#z : &O0=1GkO u ftܡDQ!Fe=H~L7~LW^m`m@@{ygdɻ;ށ6F'ƆK!ցoO*놷-IQ?Q]Kw˧S1cgº-KʩٳNʃ>g?jw2~WL ?v`#殗K} 37;X5HkM^e3:ޅ skYBL%RCt&(7L,&x⥌LyJ`qX̔|EQڶ$d0<\>: Ιķ#k9r&dF6D?8a^5^ѷѢCֳ/1N>d/Zyo-X<T&>c,$S Z2G^0J}K{MvH v_)LzOGvogy| ϱ'śKBbawchM;94Zm믺8W[\!o^9B@_ _u^pbwņ`~+Xt=: Xsly2 }#8Qe,*?2V]]aCoŲQ`sgA7:#X?Җ.D8^ۇR2|ʹ /zT3'1~)1-0>xsBUTcX59ܫS{4 >T(zŨjG{s,]Y xt)_1cV _o75fS!a)/7z6p6WK(-BO܍?ϼ_LZ-'kj1{ F!H2Լ+eU#di^rO{VᐟQ D`X>>ޮʸ-< | ny1d)Vljf(JX;X¢%è~Uxƍ}HEǥaK78 1$xi>L'~s !ܰP81߰Dc5U,+9=,ow&.m8y>) kz%Y)٭>ZjuwËuBG_΂9—ZEĮlFDpQƷ)+=lKyĉt?;\`GwnZ[PN?<ѷa .Tn>y`eSQ7gp#Ex<5!t{sC*nR٨ܧ޿}j_Ӫ8rFCn$.>hXY}_Jw͹n$v- 1„Cum6$_n Ki.R0LF OB#Z3-~19-B]Cjf)*8P-55M F-IIcHr[)Ly@' YywjL#Xj=3/)yA9ΥGQAG:}OFBsp={e^/o2ȚL' cg?UG"~?1'P͚'RC'MY:79F P]heG]af3g4g "$5Ե#\X\\+Ԟq}mGmw`?x<ľYqO`COm{UT;8|͍h>465DM֔J[՜օdX5&;}qLr/Ί]7o%ܡla 1; 3= uYa}SlsϺt:vpf͉y hP;lKIk0^A/Nʏz;AT )Z@NHe^&pXh2=q UM!0Acڃɡ({NV9N.f,3hi|MOV= 71C˹ʷjlY:SAz{o(KzVsa~ ~qk S*HSwɼD̬Aؿnj혩t7ӳ[M|GmtϜ0$<2yvG:7@0w #gnu@`;< !wvk`ܚYLpO{f3-8yJa)>$bBp 4'jRZ{ Ķ6ɼXv|K,^hn4c4QUάgɚk[*?fl`3HH"Z#BYJ̜\ ^AmƫduvVr4ΨQDY¡ک4SΆ0_o3lZlzc5DwQԷ-\,3XɃ3-/p"8}3/iC 𖧸o٫u M_f7Zx{ ΡךNev:hq}b~Js mʦ3[{{9$ Z ylV3z1Ax<+5mQ:8ًvMN5K,]jq^+LfZK8$䌕.k,P8L* 5Qa>,YGinB䊪q6ub,_m5GGr^=c&9{akF9C6v6'Vn(:Hr`E[Uޔ[GU P11D9Ay洧FwQ3Qu7bÞR"c.N{F0(3קQ;KqCѫhh$6kRÚS1_=C:4'!#y\'D0]Kn=}Za=vp lޅdW>f"E㘖Wp a-bE0@pb L3lf:4~UԧD9_ FIS7SH 53;EȠG,dyJ+eZml$trSx!8N gUy"́㙎dN3M779\}"z"0),gw|񃩬xH'hHdT"w}j~etm&aB88& \/Iњ zBqD4JMH@ uOlL N+g.>İ;f9VPG;7SP& 0 eÑL6GR;XQ 1|8@}{QBwq^;bC֒=(dE ƓYR> 9K&)^TD} \9{X!/e[OfF&bʯXnIRϧ-yD$)0n#cTz6=+edMX5xFE-}` [̻L-ނ%ldkk,5`xrAx66Vg).qķb{% | .C;xn(|r1h\WsfIO\JnEe7Y3>,j[:ޗƔM,+kc9P mEo+1{qugWrZf99Z'IG͡~؟=DР!!FΧ,!sU|y,bG6KLQIWZf݅&F+瘘pA BF:%xw4yȌ&~=H9VrNcq7;s_V)W~Go*M3N KsO-VE{Bs;LJP&niOʷ*Ef|xϧb뗮.i^2sY6?<q2>týKH]  yN2-Tvhm"A0߬Hzo^nwXij" eL V0\wL# )ۉ#<;@Xߤ<ڏVq?^LRm&9LSQ-u7Ve<)|%;΅#s XH>* ]n,'U{O & w<2u< Ie衃;ZnM @dyHSq&4HrIy_RurCx f“MԮpah*=1v᭙wь HCYa>9.z Cq/첨/T2T̪t?ꍠl)o]]&Jt,JSQd1l'N%(o4}a@[Ыٝƚ #3 2!+*t`Y 1YezpxXWLAs2$D(@ b޾F&J3cj#=j+騩}^5{y6QfB"=5ɋ >h.x ģ) r>^ 6|y(8m+c[iU7׼歷Q&! эZHAnjqHp-[vɕv\`'b:eIе|'ФSu)Vŋ-7sWfhmC7LT]hUن]y!bư祟*H@=ÝyGک^wPpXd[9 qS4耛y~VTpm|5YgHuc8/|Ĭcil@Ҽx%+CnR5C~9T K>_2# 5G?0bI1+Z|jgۋ5e>i_d*D# ה|~ c 䅶ƴށqUL)o(/4Aς鯋Eb(}ffzyՔ*:0h/ŸE>iN< &rizKO2Z r*YAl;r*z3:%:M5XpPQ$0L WYLؿЇdy_VO 7t8 P;FR͠._*!35=޴R|ewtxwR~)5? c.,\_ĿG=UY=9V=P>%z*؜ʀ/h8oP3?Qf)<7!‹47][;j"S6)ϗ1239'%GЮ#2ɐo2Dh5q7pi\T.5h$aZ1SSpy܊E[7(M=Vjg){}fW=՝B$`MdKQ/fMuwVsNZRqQ@Jn䔎poi~,o֘ 2Situe jh*4^Ew!cEd?޲XzcqYd=E`izQBC RQfєXW\L/&s8*lOs!6OmBdDBG1@fNGǀL~)D{EcҟQs a'a߻^5վuʸgZGN3^B=g)ȷ̮ %>!2kP}𖓜.fr}>]F66HuhDk a="5z`CTX`L?ӡ 릮8X4wi^QpjceWt@/h *@-gԘŸog |zA f ڙYuBgO^?w,{#}p_c7o 6vf&?Nl՞"]]өZ hi}DH80C aG3̛6TSF~l?^sGx ygWBf^˦ I!Iq={#/?q 9: ZЋ z9,hâTzA"h&]'oOŪ~ij05vwblAӝꃃ $uXf{㓹U]f^`Ab=I{ziO.0ah(rDI"gJ%MC4ž1ZvQEypM8<)vyHgb+2o>i_t/KrX1.ޚc7@sB%tޞ=F23!y_ YGU0kՈJQ¥cnl[oJ2!$xYE1V'ƣ,ȡ*]8wDm7a `|',cm-y(޴xA6@ѻc ;-㓈6$8o kN)ɋHeFp̂I߾Ə Ido6,)D26eMlHhβ,^NU+QcqK9+gezcVվk;ha~6yfOƩGI<rI< h@!4R\,"2pK_ ,L:g~""f Q,d廄N (Rk M6VI0g y'LHGbκdԐT M@ՙ(gPBWE-[{{Mȸc$;E4320BUko=h#nsX HVʟ7CLpxMW%AJC Z駨?u "GQ J@!/ ` ˔|/юk7Er"TcQmkqOLMc~+4;m5I/+g `=|4bȁ P0 O ;Ш_h-CbjA,s a">D %]E =P T{}9yXWk (56eR"sI(QZ[Ê>lbU Mb2fsR(E(P, Fw'[ >sHya *@xoq q@cC@'䰣rxRVZ9!MYDDb\pJ]VJ0ep/}(;!h0D;І3-.$+&,ϊ4C)BhS濢(HН*r@  #tݳש$SJ5=)"g"|c '6:wွCk-7Tvp[!IO t8/!T*CHNl0h]*eV[ءC(5(Ar<, ;J"&TdQ 5Km@cVBxAyNfɭ7P~"aI|ܡv!?i'vŘUI M.&c\&jZ2( `VJIwzwesX @@ R7 &{6ER͉`a5]A6[@D^¾צ(?5qq?ȥ({ajoQe 0#9Tb\,r  CcbcGTQ <]u#|L;dRw̞uu]Sg0B\ ($ H,AXMk&IUfmΑ>F+u$!4a謈*8˜¬S9>_b7slDC a/FJ':+ Q,c@2Ü u{?yboabθ``KV?wf=ELÙ f/a=c^6m<J2,L%nA5az_p1ӌ Rj,]<2p[JeF<=I$8B *~~i߅30Hg:`)A d^ gqŋ Cj[۾^EÊA a429֙ua;J^3Uk&2 0n)sy á4?4}W(^co|9am`:"]ZX9i%@ha 78h;5>vLyc  ϵ0\Hh)!$D=qD [JNESfo@6djSAX0~_2#Udo߲`" umOwPB#`K Ѣ{3Nϼ%տ\4;}hBoȡ30@³#E7)"D2}tmN&j﹁i j<||_TOUk/ wK,3D>63 EMCq Zjg!*˞: x3?.nr)j\l#f4B2;w+6Z`Qy4R;pjG plN_I5mNuc7fa1ŻlzPMkZe`hjS~F|ɡAhg@ Rĭ?C>1ULAv=79NFhAm}ʧ?Oqvcj.F&LҝOe#14Qoy|.Zrq.s~&3`,GufTf 62J# k0pc>_?Nm߂ B~K uv{E RA@ sNX.Ɖ.h=tVdk{exERJ$ڼXTM߄L 3 Djo''T?I:V zfqP36k>i2x<2S Z @$6| |Iierk/V?QGC19X\ƣE@Ij/:xj-ho KV3;dq@z#] F2X3O0 Vӵ7cV!ыD^)qC6Y{b<Ä#1OETc8;Y/Z|_$$s IY Z> vM}n^QAo]-U^ '8Paܝ'r*Rkr VC#Xظ~J$^ߥ>g5.< ./? ,~`濍Z/B4`\Lj۹Wm!ȐM 4`,m`qz? MDk7͌ݤ9Yn'awz"d_cɮOeWus3a"${&PkGM~RLlNzo o+u|XGG<@{#/=Խp ffxȸԋ@r~㶧hN^ x=F5CHX^pi2E, qV5:U*R|uMzqDD? RW5RG܂yYaF-x'y?EP_l/_z}{UypŬr a3q~lՑbđCG,Ej7pHc.Ahm!#%K@3FM>YWDzljͮ94}y~˱mej4Q$ɓr~6SNE]cyyf2ZpuLJo {#{D7sKa}aӁ?Hɣs͆N4hO<) Fl):xnd O~0܎m%bFwOiȋS+ElprgyHzH9ܪ>.S:cymЙ |<;zxR`$&S_+ګIP;^n`BHx$>gLo!H>Z;r*8hI v Bz=?ܿ"Y|DWN/|\އy þAZ?aw}TI$*6>|U?zsʯQ봇 7~[?G/uf |,62I9pa!6攚s%U*Pm8<ӦYOMN펬'Ws7{lկr_K¾p5X A`_VaDŀ~޺f1?< A]=K½d_ϗxe<hSN1OX:EP+^gζL97ɛK}.)}c}6z`ubj7;1hջS8NbZCZץ?*F$F_u>n ;&yoKQV7~브”ju3KSś}1 ʞ5(g^5-Vkov"mEl ~#&3Mr!IwsO*_Na)A/'$KŒ0t8$9vE:@wF@ YFKQOEy9TItQd? --F^%H50$jd5X&4ꡤ_EWS(w yF-iVix" d#_-B'~>?Is604te !Ad?>Wo&W͂ł1K7=8EDW4^Q;iA@"9Õ 8^/@ @L44evI ~ AI N3kH FZ{OKfSOA"4ڷS#pBx2 7+ 1cZ(yu$pz1|)}~*rvѾR$ߓ.hE2:I߻CKξdf_ʯqVEZoHprqNoj՛ɵH5'4CGXFNٽ6nwa&i^",cTPv Y>0zjǰyBӗE?J5?;ͻofdYF 4cWWJ'yLcp|3ٳ| ~* j᧡Qm'?ʗ ^}FL,Ed N MRF(Bŧ/čS# g0 E](4I()`L[ӫV(uX5|s)s @ry&"""ؚ/qC7ahCكhG-ʨMԂɋ| b4`Eύrǎ8Љn/(%:KVmTF/wn0OhEĵI&Q?mq0]ER!RslX#ioC1@a>nCKs|S Gď <Ɣ:-M'h=B:?߄"7n݃-Q|PD,`CՔhz|[絮wgO/T[DHDNz]@U $&_// |l}2 &&2oG=1ӦNdw FZx1:)oY}N (NŏJbuzs\er}7\g*q `+9t|}n%6/#$.AɃ<4˖)F0uHR6:;k>9z:sz9^>Ckme0U+<:s!zo)K>bsi<܍%XxʲH FX>:j(eft*J>z9oV&YZҎihk$wc57 ^{zScMX)zQG,65vH#paiEl(XI}aUCM#HPJI᧞Ww|fO+\:zF$.W(A_8*eTJAE;2wg[r&yc409Y~SLӄXLkDfaqW@\\Xc+ EHB=ȕ؞KYr1ۈn$$Xth);J#NL,(15nj-L_tdAr㮚gK,~U3zʤdTs~~8 <eRr*3Ò(h!Hc1Hqe\)H>qliAk:_8y7} b&T}y%+ &7^L0D 8n.PZ&2X!!V.hJP&s7zK(ְMdk$/58`@I?ښjhbMoo K:@6xvQ ZI,RY q7Ziƻt6:G\|L?n]Uq7`B*cZ#]s34H֮f<5/ٸEB ?ryC}, U!B8C^?bhNo7z8>cĤ9w#-rG-MxB vzN}~n=>Dtu*rM%GBa*ƨwn+K//d:UB㬙I0HA":¸ew`҉L-M=:kLHRimW1 9Ub4/ n)z'U Z;S ФHyl]xKGe 4inTN ̸H!lh] L|e@r\fH4 #y.9@ӫ *ȵEFD%s8}cY` "G܁UXZ_L:% SEɇsSF}3"i/ @b:t yWRABP+NANqz)ԨZ{Gm2Sy6KQԐmd2V]pT1` i٫|`}ź̜TzPBQ~V(FPA5չ6rK KFU.U¹kϧ\ 9_eqJeYnzuS)UOm'*7L,rS4kc4<(pQi4&(¿:쿪DW\gFnߡJp+*֫:tY%͘HJ|%Wsvf!'^[>- QUټJֽfvSEQ2V|Գ{_6HfVReݴ[^s*~6GnBƭQ:ъ뼂(9S\16pfn' ;|q"rD2p 5q]N'!A՝# Q~W~Yu I!tU%! OALCߜ?U b&> Ro϶6N-Ew+z UYBy+xSY X]B(BҖ`APYj>̥tA)KT W[*J:xi7f!$l!f 3Z#!Y{Jf%XDv@XnqM$ObXraDtCW*E6XlXG&2ɂeSI'hXDP@ӦV5J1hT|ĩ{5`=+l4x)88Ai)O0OalB P8z }sc_Y 1j},#oMs,YtDvIBd2[}St9+߃@#`"bjgt$?)cq(ݻĴѭ=~4>+n Ӳ`>r py_~;'D .f9I$A`\mb]kU܅_[~qTzZUU8" Yvq"1"VrE9 s(b"NI,rl=mHdCfBdV^Ȣ V2F@Oa<凩ц} |dxagW[(Z'(H&:L4{(`^uSD h@P>4rf,@FtZޏ6| ]P, „S:t$J k[MBWg=rะzU <58"K}2v+C6W@& Mמ/[y/۾$O|/Y7 \\28Ռ^Y}tuf=TBVA *_`ft(bE:aHň-RZB{+m]Cƥ]O%gjsQ&qn{&ُGǓ[f\>M[G7bw7.IzY .2'V|)̥@?Kٽ"JR``)řʬJ-6KvQoL, yj`zf ^wAIO J,(7UD'r 6eJEQ %iM/Z)"x #2P8A؟- X'y'Cx տ_zd'Io(jN∩\TGmfvH3 eY\>PZ!h5LnV( Dj ֘ިJ%c@ @|% Pȣ$XoŮ`YE-̪]apCkMn[(sGȚoV hr)R8=WcB8-s~ifIʞ- 0$cc9Jb4-ZhBA7i x@݄ @.~9m\[dz;)ӿ\1~L dy՟P2JN)GnhT]-/뛃B1 q|{ܦa+BZfh"2Lyrg ^u3m?U!\`LynfouzLg\\G)U&Y) C ʹBXA Kh,1"Š =% y1ћ5 w4I\4\$xb#~Ε1gG7 :,y2n+ ,ͻ[&7b1XtLhũ [Hj|ʾC?mu\:ung~VdR5wGH= dZ1AGd~J+:e^肠{7) %jCA%YVa v Jܪ!tjV&Hk /~rF+uۅzزoƛ7ʼntb{%?vZӲh__wtn:brgCXJ1v d{˿cۧɇgbI Qi~QӘ1.{/ `Q|lԍs+oSw~cF' .KhjGM^~ RQ/; Beoe5<[3yea1q;^^0RՀEHY𪅭AL,Dž` {gG-s.sUA|=5z njzI츙E-Z  hVE|u;FJfQa T iDeьm`#< E76<@ #:=6xW؋P;>1)PEk4]К ;!uWԻyޮ3nؼd.!p(!K@*U-6I]K;evlK(Z!Wοz痾]>z#L"گWzʾyf_I>U`K9z-^s)XؽqBs q9cdL =ԩ%<^7~HpR ٽ359uj29މ!chzmrP %ͯJS2HyGo@̪Od|=R,&x76Y.VRQf#JFnLTusށAnv jlݽUo4z E.*n֜E#H3~^#lVkâ9RkJ뻁q?NlE*E ='FFcݜ,#qF7ѝ6n4Вl]f[Tb|#4]f旆(n4Q;0΋T 麌тW+@fbu}#m2HwhP|5]vnv4>t<(ͯjxǓS12M nyjJ-䇴E."d⮐A7-|SަM :7ZD]sc^Ky }I`G7ՙ2C존+>۔K4I\e3 gnȼ}(?A.p6Do  S6}VԾj(ɰ< n(7̆ wr2ܸs_F$RZsd*H uh+`y@_o<}Ou j:tlkq[ ZU}ke6x|L}&:$:|1v ,r7"{5@QA'0_$CSq i; _-W'Zd\'CTYQV̳:iBiRwv.}͒-H9.OSW\k|.=f Pl1rcTN< 4 upAwt7d=Ӟq? Z(q_pӘ<,5)5 rqDI * ̮Ty%Թ">\8V P`?Mc:gךe˝/ik; !Pb͗I5R,|mc|\=Y9d'Py5cN!ch9G5?SP=@*? ߔ=i3PSj8/iYLx&k>ʭ ! @qGWM:ނbQ=~OOxQQF[^]}Nέbݩh<+/B PS|Ѿx.Iqp=qm1vO@蔲[~my(ڨ ^JZ^wϨ?zbe{۬ۼ'gcb4ǒ.|h~(+KL%i &u"^nɀiW|^ .7_n-d77h޿wЫǟI[o8% *T#Q9C  m>YBdWlr¯",ZLY]⇙>4^:(weJ(i(s_ `t}*+-v?i Ή߭ɢɬO?7fk>L.9wEwKPmɖЄ݁}+$TtX6X v6W6n3'Tۏ9EϜt27i~❨iMzBw|-8Kl}n|1 I9;5s?4 էp Z|>OY}?. ͮ}})pX\IK\|RklF{1ߏSY4͒|I냆Y~Eoۥ͕%[iPdo f@VPί & vrp* Mύ(kywЮ\ boٚ>]ĉ4UoY@s~cH)ДY2%{jq{ouSY9 TTy5T[M#N'qyC~m"hv6z5&'+^w%Rl$,\ ruqe# H8]S$Pe>7; !AJv~5!b,n6&bh<z"h`굧;-L4 Tِ6, 9z-bZI~n-[w57FW7ɮ#%{hY,_Z9YRsn򸩕YCM:6]Ѷ{r $Ƙɯζ\mQ.,_ycf%f}|x:vNƯW{WÅ:OW BaK6Ze@ n/D%'H(1(XAҐ5a!I[Ym-JmQj$pZ8k,1y&wvBB}DԤe Iy?&O~M_rK>œ<3Ke7dgn 6_ ͞/;@虛s`5xNӡq<^Ll)k,˻ŧaDfjߊ嗼OYa!IaP=:VRA^#w3(#檐r7/:\vfd iy>&X4$!rD7Z>BI!49t C4;Oެ.n,c:[|u埑JELrZ-+᱇HF-I](QQOᘣ AL4 lG)]-¸;?գ@DK˹#LLBetN>6!̨Z 6,!G&v+c pV_r_;){*W dxnd񸓭ނFv  4T;U{TF :>FF d>8| Kd 1u4NH37PuQ pRVvaz۸wN~%)# EL<C静u24 .ؽg(_qcZ3^-9a[ /*M@c8ӹ_V0sWؐ>1 |d_$gj<U0@*Obyoڏ[ȻQֹ%R{0WdNļ t\P X:`,Qkq '[S=2}M_Pp M|f\{Z*UsOޓXpsG_JeQD nVW1BeYq=qU8F?LTa`0^;[lǪ ^ó WR׸6d Eqyk2..`qT?Lr]/g1w9rܢ2Q~/xG⏯ *ll Y#bk[}uwQNgw9RY}xGݰPvO@z$0ax4phEg2iuʆ_Wf@ZG0TSZe~YZZu>LYRw[[=KueW:;+3V,ζP@Pvخ;s9zu[ouZXqdM{_g|j ^HxHͯ'z8s^:sy 'ZC~¿n lIcS)c759=ly,\ⵧ+!2 }78V8u; =+g|_'_Knu}[_WFf_SCLgpLV /]?'2u!Nm˩dUapdR˭LZa0b1,i-a#j|\c ҄GudPkŊ=R ־>)fyp/xSۅ&R<\6Z>~MaBƱA"U`(\@;ОdS4~ҝ&&@9>;EiPb[jz g4,=sl rpP3dJڿf@&{mUS ]/17,ZZY0B܏~Ja!9Ylxaks (9%"@t ;Ǿ]^I &tל|)`݈z+ќlÜ'„Z 'PQDvQd\xt] ֫X6@RӚ:I _nu)*{Ȭ/.2.~뾵y>wAm!:OoUqlhWfa]Gfm̬=Ť̼wVs;r QrK)Q\>#fj=/JЫ`[\w { +x Voґ,AZ e $Gt0bc̾nsAnؽOȔU?>/R=Ѽxf ;Gdi2HEjgLv^]A0}gsW/u=+OH9/ BTfV+}K&%j/e~vGeu{.uYkY !vR\;m9uQ"V'>_Q\Ek雽GA#C f$n4AgղEWc*LԽŹsZލ~6ت/e_RdN;&uIte>?TtD|::nhVGI9d\wvxt0Dl@@vuw{Yo)̆}Db Lod$ݰw8݌$gʦftmR?=&=Pٍ'DmrI7#*MةՕJ̧/@%eҘ0<ujlHȴ&f_O)Ee9|V/MT2鳛Djd9(uS}Y%[g 79_oHq>_ౙoO&<@Yp!;9;eaWct㓪 s_FF0Bλ3ULB+x'^/}pwx>^'>?sgUH.QU3Om7a`Gj6nDŽخU& KDb}+ȋ LB>.FlmQ' Pϻ*aHxCc%Z龾W|^gY3$Dn)?O9c&k82sSvڶ_p!軑|%*œ9ƻNK]rqS- H *J'Z}DYj['d)L%I[wj&QLkaXi/^Ζ$J@U.6>^_*VA%DE9\sōbǙNhx,1qy!fߐQ7;b'Q)IԤezn.zД+®+Mw}Hnc*k_ңgd 'Tb\{)xIz *˭iWQE:mLCPЛϋW $+^#QT z%uh'W%52)rF| Wm)ґ U~m'1SRzQ/,GfYt/1m%N1qŀTMa2edhJm29>;;D$`zUAv;[Ěl\4C͔#skyǟ&[Q.^F];;݇s/P~R ׺KGT6H6<0"!슠E0BRUE6xe1,$ǴlKDx 4>O)͹>ք˓Dq[W.+YI8J^@ `E9`? +$Ő)Q}9uA?gEVWݓkj fku ؠnR99F428.]$ac.X)EuW;;B6}\)7k璄Mrs= 5yʇ#U.kWۮf5KifwIs~v/ \)22Қh[pWQ]M{QˈM$65KʞZ`[%O">85-81FPG;#eb~l;{ntDաIZyC3T?d^иmq z4bbxF GjEf-*ϠS}46 ̐l"C"ICBb"1qKN, *wA9 ۪Ts[IG;c#~-Nn scrW. f] 8,]p[֮{.qü(bp9 7x%5ХQo4l58K]- Z u_]4TOi Y$LfiN4]w,FqV#s3U8cũC^)t\ٶ.m ~qM`J d-PSF{ja2`,rb/$K❣r7)ׯ]q[3V-o^;A!w#׆nVh^` ,5{HOF.O]yAyLa|\VES1.\=Q?CD*ƮͤlFDj㝀*!H GUF;cR<$8(\|IZ8huu՝&>[y K-bu5*pe_u{G/Xy ɨEկ5m18:Bz/ԕƂ~"IA'q~_ȹ ZiG0ּm|#ʐNf) ׎afT_jYgrGSȋBR;GWK9f_gB:{00w !ݞMi<},]jc&sgi{E_TF/Rla1VFqCU$ڣEȴfuW`X6txɜZ˥e^ůK"R_v^Wf}PH( (]UJ`)$S@+|{-r0pq3Oњ@~מ,o+]z苹0o[{hy?hJUUFG\UQ e5g_%G&Չ4A'~pq^uGB.;@]+i>V¢f첵jJʪZ֬d/z<Ud{7r9l{f1n4L,/l,z}Vc2QI9 Rf+>rɡxUK== Q(R?f]zgue|۲g XM P\j,&'[jS.4lһX{` z/qAz09q9p` Vp~FUprhaKeܕwWȧ 54$ =D3֝ Rk rC Kh{ G=sީ,8{xmc9DPMr.˵{WWY=qoF`S Z@.jXj\$]Ly\pПmonnht̠|sy4oP!Øl ϮO0{X`-J,-%zY}Xھx^ֻ!A0`MUmض1!I S?#ƑS(jqUKݺ^ `RλJ*Q0CljOη֢oه^u,=i\ KOy25h&xFse68iJ4A(T'\g3@z$apؐ}mS@|d)5n(b5֦$Lgj͊T1-OQjk GYC9OB!\JZۮPcڢ|객f#TʼnųA:TDkNSQEihV\ָ8Gn Sˢka;j'd=&RqAIaaD&p՚Ư4fn+\!af{֫W0L:/u0/R 'd8(U93mio_dUqyno2q[}ݦ7*<o3U+ݳ.R}Y'GM,NT7:uO+S;Rѵ>n<)V SqƿMtw>7p킴fmsvS˸~LL߫vI5_FEL9Zo)_z`?62GX9+ ]EHr9 )B+<{ F*R Mr=ݵZdk|c&XXeq@YYq/V)S Sи)ູ7*|44JKw {:`2ABZpCTʼBܤCRTqX:Q5Z(ʰ;ۃ7p{YWa[2=:dtH.I216G{bwgL:fwFvLvvo]@ñWv E"!N8Q^MA\dA7teqi%5I\5 xgX}y23ٯϗn NxW3X•fUۖÍhbeZGڠwܒI!!Fq ةiKd/i;541<ة*9F B&Aof+&<֬證bG8gNS ,?kv9a1?6l\4îx|? yɳ;x&S е[>X%ﹴOwq @=TАOLa 4טMxˍ|\k||6(? 'puVVtKzZ4Ϭ=#Q(waqvJ$8J^wه}Z'Pmrߔοpyҗ\b:ǦHZ[| e895ϻE(s1ARN} DDo'^FW&fdwc|\_(VPjjȻuY]ָ=CeL^ĝNJ(+וAJrb]w>c3h"E&A7TUЭ5fH CaG++,w^jEŮ Y(u*=EJnI+_Qc>TX훵k=Y!"f({bJؕˋKCahmV8D϶% öL5|kvJKXk+zRsK?4״W/ɪ︎^jѩ`ɨ]yY3 }g$~.} :{!%4Ni:C>or_=o="VބI(-_rv:|u#s%y miwGw/*>=mFEʟ:^X\k3$h%֭`GsbҶ]+·q5l}N͠ƙ ˬOw8_<Β3$%} ]eЫOKRr p{|ʆ#b4#{Fԙ[k%Nn\c1$كyp𱽢Z28 <>qv>UN\I#ڥu֧WeB-&:+kxE]`ptOAO}M@{kqpO"8Ko,1"B;' PUv؜rGmwZI΂qs]9>^MzM̾n!0TE;-.npm J2*ȥ%k-ӠsFxg&|^"BiH3(h=R\9#>Eo &3U 3oZ<;;TSg*V#CP.WG.@#!bwc*H PuK% סj71.qI* !Oo,2+B+]K8^Np^qQg{ 0vq:94ʱyR^mq0某R(`)9H~ƜHK/ 0VU>$qcğ D\R.(>G_C@cc_#9%s0g +Uo;iݨ ɳFPKOaIA grQ^ jvd h &$f!d<1|C\3B8Sccq'UZCj8Qh&:jo器.De1a@7B*4"oZ}>ly5Hi(]5!xoLhw=E,0s $7\=v A@xbf;ksQs.nF~` ,lkV/SxUGAEsp$/@;X<3gdaH׷/"<Ԅ.xm&aFU8Ӗf$&>K 3z}%դ<6's/)V%l@"zUI\x >AiVӾew@rg%kQ!5cwCBx ŰOu4'XgyKXoX|#lWv*=05=Qt$W;]*-܁NwOW֕k7oߧ&)pz2-==B cnoN9揝nL A:7)|&~^  IQo%#T6dn]P#%wDy!.K@ dޡͅw$\J A\U~9/JF+k$vB:L0+j0.Ph'$-h=SUSJ^IO wo+3 vyG=e;!TۺJGwZ~ ]_ʼnh#mvrWaQ29o(}>-+ch$1 vIL9tc,wJY^JvB2TAdUW*f<3A=aWLQ6) _RLۊOt"2p > ;.]1kHF BA1E |8(pYt ChI:r˨LkA=}8g!^⥲ci.yvG/vA IJKF6N_L6MXi^>0Ց% B)q?ʀgȚ~s')@iVĬfWJpY,DI%NڰXۆ%MH\ ~IFJНd#e)RJ?a`'how =2D+*bJQ[n$=` LYwo_<0"2 ^" 6F?ySPx3L9ި"ED:cllPS-JQ@¦1b*) *h-&E=RON?Z.֢[NBķF;rJvdXpn$51@9v]b;mKx4_[ȸ0ҁ rbiS.KKHlKE2"OċlshRvyM@ C_ÃZ\jGDca )w ;f9gg~ _{ɫhsgE gH[8A̡b!wbZD}ʍQg"RO}R9޼)f=]o1ℼ|*L *a㌰ql§}iq)C16~,HSQ4RnOH!T*nE ZɌ,b$˖Ub~ȕgWY1u11nܺ`Ĭ(:Zg&ɸ5+h,}թTE^|I5vu4p/jaf@g_M?O ]a {uыt3צt_xq?lCp"qW@{ѻ/Fk.8~S*ߎ[q3Y?J`ʊ]D: NTXt'n.Y=NfW% LD{ޏx@5&HȆ eBvu^apwJKa,Gim~a<,\N`2&-pz"x$2"-ѕȳ60څ-]\Rـ&[t rMqkK4tk]6q4&ꚍô̬]GXLJVW"O=U@>9;e|Ftoq=rO0Wf1#;On x,/B NVV$0֍eMn&u0D}']¼Z8B~*2B^"H/!ܺihJb01g-[hb9DMP>aEmyť'd6=DAI%Y&l^Z(jI@Y7hHY.Q@. S1,6.0¶isP۲.gH!iG |;6*ZY*r];>5C%Y7DC2IX94j$q7V1jq6Y4N^HQ}cEX?K /awqh#\'yE*mk\-Xg՝2Y8z3r+5{.5II% +'oL:B s{>6%W;&9vSQ4eNI+GY^/>ujѭ5WgtmpBI:?uw2+(Oғ*zR ^f@5fb?B7=VN7R!q;@Iu0^uAQU:K`5Vbt r{a΃ݏ`y&ҳl2?^LLRiT!V6"ӧOl(r"~l|x`DnZS"\ffU@g!;&LK]AU_=8Q$Qҏj)S.}O#MsoM+` $”jLΕLnOZ=Yŝ(,KhFX(aج_G@Ⱦșyf}QqqkeV>栺|mj$}xNp +ɭa]_1~3w#1'5QZ,=?2o"ߘſH{]Fm 3s0ZE []q#h@S=nHZ(*E&>F(Pf*UW@m팁bN(8s)@}KYP\P5OMYr*ru7gXP.+"\(T/`Bsիݛ|:6Ks;14ri4{j~ 9OzZMΝrFASƂV{:!v ?z*U:Ӗo|xd`.28,HGWpl'F[9VZTx*" 5Q>?z.8 foP9^L-15+ 2zn`;g-LXFNjډf$J6^|Jp}:R)ڎ>U#+[ -`:N ߳BK+84 1L N}Z4Y)QaX)%Jb˷:R޽ua&Me] <@x@RņO5 dZ9wdYVOgw k _hC:Vя@]$F2C2m ^wn򌏥Z$vn tL?\UGPz1\]#&Ķ[FʸU&=8 b 'WzqU}L~B רbjT#UanHS'V}0ʤPLEO-7 5T|Px \.$R='tҋ%,, *0JMx ܃7zLvotqxSW K-ZJDeȾNºlDN2DlYJ=+U#CY5jٗOܒF󥿜Prc+h~ȴ}0z#􍙤dbhnnB1n43t]cPߞm+2?_MP1-L` 'βksSx*mKRJuj<&A;$!{'QF&U9!`U)dB։G̙T&/ SaJ.q4qkpO/S*,lϗq85`+!@y2XSe'! EuUWP {(1%`\bvYVT*b^LqXxV Y ALr+L}rDQ0k]5f`yXG}EJ˖ I%2Z}*S=gxqPNJ˜Sp9Zu_m'i(G'Nȷz97m~LjIJ 6>kKs"@V%C..DQUDgFr 0Je$Ք]ݬ Hfx]KSvC: gqBW ?n`^+B$,IG>D\'3^S7k:T(/ŘU \q[?E||q~E6~+L\>ֹ5?,=瓙S @`D!ΟNZSM w^W8R OD~)s_mm[ =X'&r*)a>:p+-H.!#gA1'>t샤uf/M~u[UŻP_)pr2!!@ CFVQuiNJu|Us44 rD7RS%X1ztWN ,'9ioԋ?ױq{-f#pܪR$0]֞]_WBc?7lu_51Az sn/0<%[bZ=܃Kиi)Je=xBQg$懫b`{syKZЧ$d~tb^>{~.m VZeĩQJM&JZ[ƫ 7^ʘ?k_\}wirl 7~p]F穝\od`qvϙ*?b˱ ;-IV♠8THW L0uyM@(֘3ˢ^DZ$Dӻ#_gX_^? fԢfFL #٪ 83/$(W]9ŖqlMfp@=VɲeoOm$JSg<ds^ _O9J:g먮bM^_I=c ijo(+=2 1 djߧ'Ǫ:ݘ05.=t E$+CRwǼۥ|XXg}}8mE,mUn)jp_χ{ÊW6kT4 KGPibcү-e%[ᕎsN0BC24Ӿ0eT }VgߟfD*_j0Lz'Ua;XАK^ܾQbR7w uXk-;DX}cfoji (YեKt3yg+5-0+5ڬpz⌤ÒpƒԩۣY>ƍ^auj*`-OAFO*f΂; +y'{ȃ[E3D[@V`pt=QՄqJV5e j0MG>48+KWH%3v抃2 3@Kt= gf 1! EGY'^r^ڰV²V j AoFdt-Q* i4H=tdbv7VU[hn50nq*VY;N^`pf wWp'S;h@pL-}Ve$${Zc0/!Wøo`h^)TC;>ŸHnU>q9nw_sf|`V|]p= Fš \E-RWJƂr&o Hmܗ( F nv0?#]_.Gbz(p ]JŠd3w6gtKA#T,Xtch7\ۗkx_@i|1g;Ne9%[,ԩ~p gWϿ%OJ;7@˼~+63Ğ/fi!N8Xō.~!(Kn>C* w N2m<>f1ٟ6V1EӇy咟oeQPr$ݰbG%ʄy&-Hi&e&ssi"XՅۭ7>)|lK9K\;2ڱ&b{I ʼnXUm)@yc%L 5)h=Ia5]O,k#7EnC~! 3"^}|\cA!bct Ӷuf/st94LHϯfH"2l\\ꥠK&YR%@/+E;jL$DFP?_dS3տyhݽ PL):kIs8Ooдi''~.yP{☂0)8 '%g?ݒj {S Ol\u$#_M/켯܄G=RSuQdlWjQ6j 'z>!0K[y[9+YPa' r[as`n\kBc.]&6iKk^5HX|~|2ֲ kJٿj4a]că+b[mLA(iLضbhS*%T+iPpE:pvxv}>m]S &DZܚ<XuRO\QL[_sL:&;فY{qz{<&|/+T8"*n.NdU] T1eC+SB|WkX]|Ԗ@xh,Z}yN1g*'va?s*ĹUb0`U9b GN;A[tEzEEav/ci-eaLp^۞' a$"t\&0nݙ} u|PX(L'*|mvU]!}gA~Hʐ;&]|%AFeVZd{v%m^ւJ|{yW M_;x.|b<BzYa,gdJ'x5芢~{"&y̵\֥*%}zRyEJ9+QýVmH<$ߨ+eg+/nFW.Ν1YcxtUA) L7:42Q"S;E(}qw.׵äiӌ*!.oOIAK*ixζKZR}%jӼ̇rNfc*͓DLKWͷSm<=I5Jğ\k@},Š-T [̸=o (i ZKƐ:6`|k8`ݥq c]y%{? GŅbe4&},gs0,5Rtrv(q9PA*sS3_YͶM_mFDŽ i_hw\7MG= >˷>~8d&:Zكrz+VHn`M(ߜ,{=*on4+kt_KLC`r:meJ05+kHC6gzWobvì{g_$;vGK&O(=aQ"y 0X:4T{ {A6ΆM6(nZWo&MyC}B '>ކz'~lA8mJvPߜ䊆Eݿ$2lg w3X+%Afa׉K<|`ES=oigPrU~2oWrVߣ"xO#+|/SٱlSʖ S:W@Vk zׯ>Q-ŖŽ 8D  d"c?{҃}z}8+m-r4N$J7vq@7BǍ9'Zƒ0}+m R[/&ۑ?rgQ=6q?'U/wZdj’J4`W\aº\1h|d⼮r jTRt"Q|1<Y/!J@8[;>oQQ(}P2uʭ[WA<kAz$v^ߑ {fHzjc>cab}6>\r*휳G&~w6 ; Z&+)Z a(E}L2&!y0F?E 7ޔƑ dnf"eQܫx3&D٥U["rmSDi bjzX;IБ1a:4#lc+=;<+ח#iG 5>6 + S/Iм 0JxpAdoB붚"^!Ys]{ A&Ш* \Uj'jI۪gn:7ÿTCK*;oZUWFm/}ʍe?oV??A@TVKR=\O oemkrr}/i%CsiҚ'UcgkP2dj^:2WȚܧwܳ)a蟄*kKWW DC~+a}*Hy-W@[,~4CS2gW{HtuX:H- =J`Rqbgڦt60Ĥ !ѕl 6y1RS5}Ptݠ+F\;7gr~4;C;Xx+,MPjѓݙɽh*k+$$/x*%k|+10>U(Fq_2gJE  B[WIҋ3F9aJM+6ESQ\xP05(ykiE5'Nsg2E*/Ǣsz!>6.."z[˫z?FU1|ä 笃 %iC{?SsȤ3O;l,Kr4=| M/m)at,rNw~ovzG.QטqYcj2c#B39ߑ$%EJ +)=L~m1ZIJْ-[~3=COLW6Jv#\%1kUݹj'|GgKQ>2S/N]]^WcOha &6XF;xˊU3~ O {,ֲ=u ȷ-lp%n\=BtoAs3Hڧe{;knuG:97͎cZ~[N)dTcp5rxQS˱li-#T7w= YfҘp=NaN#%&aMWSUXߩVrjt5Gf#ZgW0:F} MZc[g芈9ovW L9T^CWW)O.]uҐ1wӭeQxZLw=Eg7`irUHnɁq^PןRxr1pˍ AǣOC/c5y?,D)8gm왓Ϯ8=oI}m]d)Pۃ9'oG߈GO]0MZ*13#qaha@uƣP!]b>4 #ToU}Mr7s!aH64Y=8(| 'F-ܮ5Kk9: )1_~TORsJDWs4v2{PVc"z9,憟@BMO)wuyUl":6UG2Vv>xtaUZjRXÿ]8C_sjD+o6'4تbykA !mg SdWI}9u=Ǟ' @;Jc*k{}z0S yehEu`+,ѥXыN,es& _?gw2EUld=&[)S0QNKVۿ0>ۺYNAS8{ K=7>-i[4DZ0l8@N]]ǖ$ɾ0flR*#pw5G F˼ ֱՂ˓qRC*ukij.y}SN r/e%m'H_i ISxѩ(!DjN2eƒ 5:Pb^n$Ǥ|.'JTpVB4sC1 )"%}-/c dͽI-x6 oQĻt-kcS#ΑV{$Otڴ&֒ϰ\16>F[y8ޥl[_-*Krzβ$6>`Gvv&^&RѺ\m d#@hXPiX{QkCs$#SyJvnO+;SU/G_5Y[.ζbtv3a5q KS2ig nd(=oeO!^ߖp^[*-< TFtu?\U֏~yZ0ÛO63oxGɛ9?[ZTg'ϯ1RZ̤j=I'S=~DJ9;FTE W_G[c}䐇qpƺn(mP𶵵b[Pecw;y,T}H6)u_XUV/v{tx-W9)L, @sůNǻ鷄U38}v_]]95o}cQO&-\з *sjrdh{gؠM .yٹx3k$|܅lՇl]Lfӑ)DzѴ>T++9_h%p ٩ f׶#&o hڵ_9e1pA{ cvB0{_aLr6ǔTHFl|m.FERV*Gv_Ikf@?Ը ژ a,9znvMm0lnBPONGɭPaed_-)'snlMul( Q3r?땟koE$k䫉+!hӐxUCw/lv&(xX7Mi4H!sMrAig;oatM18Y!gg'2e-&/&U%gA9 (?P/?MIJlϺ@IJ?&sX6#̱;q<]逈L `'AM@5>/{(3$u{7ޡy–:Skcnـ2׭6g|W# w=h:{T.}I6w\NPCҐ'cpeiEXW?}II<:TFx.=(' PskCs+# O=-LV{Y@@^+WMKNEz 8pWL xN<%tËouS2{B‡ 7XOʴޏ([AC3b {J<8 |O/NƶȭCaUJنebԪ'[BdNGb0?/7ğց}Di=KdYJ&;(Բ-'ѿi-^p10Q\p͹ )^gjqfb?J;EOƅ"9UHƎ_LV'duzWnT8R,pV_f*P`; \qf/Cct oi*5sXYuh+@/4ѻyܡ!kO{g]Tubns;7]qf?kG?/j=kB}}?~ZͣFzB7Ӌ/p'݃B,t  =_F !'-9`v2c뜄=@mY<q?vJ9 LE7k2V=&!xLg؅ő (;Տa7PBEs'fǴA5Mbg!ݱ㽙hӡdŨG6ΰI[ue۩w .|\-p$ͨNVFKgWAu`< tVҜBO0BGPiVg6/7z(gc׻;di}dhW;-oz¼g?]]b?-$ʜ7MSUzH[l߰1;[t}tv)T! Ơg2I0+4-8W^=fI?a>-:.=-֣(ݷ Ȯ_T4) k C"*@7,U \_Ol,~ȤT11Z3)gy׋̃nE_K`~^I.=>On|Ph(GjW1uk8/m03t7 A?wO.>*?ϺƷTKx#[7bW}3{3h5:zUIn0(Ľ;F9x|*y׀%]~0-Bko wiݙ?uJ]MH }9o4CF!+DSfP|5/HMYf|8|҅of܋^V.P?Ϸz)_hz+N:UWM!Uy;_'56G8.RlK m| Y>akeY ;\묱yꟓ=? V=|mzm )zwd+t&](6y4N{r+CAi[GF7*5mNV^++a/bpkC7c*(l[n`/ߥTJ#Q#qnwǖq~oJ>}o L?_ԥsu~wnC3GUUqPqF33c_B~YR5o_Eᨍ\Eny+ڶImwq~_gͧ9kSWSVUjdZLQRZ$+,TrTkm6S&Tk8V\\fLgVYjΨgY=׾cs yr}O7mFZߡf-IxrZ}6zEUP]5IEDwuBd ")!mommfۛ ?dS}0g)"g`ˤve>I>'rLv3+b*/(3ʊ9,]ΐLoק޹+Bn[;&Z 3 Zs+\RhhJ=__1Ww{kyvB "z-Bnefٖ M;eB0VS-3jOw>ᎋ/+Uk =2Rr;<4MZ5Ơ#% ~]:P˺C4I*Lպׇj#?}ԟ&V5/V(gsdgW h1tQ\C>y9gzQ8Y\ۃƬfنkƼGSrml ߸TnWe (͕m[ƤX-Fhb!&JI&L͚fkChy8mvFR}d_Ul_R?"OډQ·):/k_Om%wT5.kb[i*#Qoxw[zVq=tuѝ+m#@Ufj?=D3M+ګK6ڿ=7#|UsqC 'u۬껩Wt.&../)/BVV^ksNummUUj(b2a&"",D@ed+WU_^+y7Zߡ E245J|WgSb͍6^o߁[_>m/ -6665 цFFbݍQ+(lʹxt)wsyͯ7-wISuRk54pJշm?{wޯyNUTVV/^ÌrKr+6ێDW7uW+wr*$khIjgZ,ٲ'']GInгe/g.EN1N!N)Wl=tAJT~WEO -$0Y1Y[flۊpu]z\dxՃNy7Kշ)6{ "L#dD2볻C+Uף'_U#jNƗs6o<+ثZ߯Y衦abkۭs VҸH7|^dB3y N3B]:BI{[t2l^i'CTH不Vr)%\UX˜۔mmQ-ˁFӜ;r71##~-ݎnw'~ m=-Y6N-K6H5˩Tel%[b62 ˽emw׊75ly<}>_kL+v8+.=E\?Im_)m#%}Px9*z_ OʑհmG\V5Z{QYc98oRGdʍQVP`g l,8qɗM&3,jo'e[ ]dpl u*^]Tn8]SJ'Ǯ)ҧzw;j.滋hԑ4mhW"aĚQFI`2$268soi{:ob~Fy߯eT5/~1^PSv}]!!۶c-nkrPZ1FQ[-~KZ+WkZJH@MHE=U.r[N`>_dsÞN9+MֽdqfK9\8o)sY*]N鍴lm"ssMsgtnΝtFƳmfͶrj̣̣UǖNchm6.8?EӶ-TaOWfci1}^lNDm lֵM%z܉JCg#ގ=kѢעdǢG;Z9y`7R}]_nFr=|(x>⫗ ]'s.L۱oTpJ[ωGƗyi^[:+ޥ{s~wE_/E*Dq Wai׊e2ŅfBjQ 0h` 1k¶7~DR!̍NuSӕ2fYr!b3/@ ?/>+K v66 rU3[MjkmUs߸u^%Lۛ^/趭I_1*6G`IH"FO W'fkW'O)ݯjl2Qb 0͚Nᗆ:V)n]nN8-èhx~='cX]ybv^ǎ5^פ٘wRr/q+ kim `-Em][ǘ͹D&*j*4bɎkEf F4HLmZ'6Zu? : |z]KId66"A+*}k078m%!>/D>efڣ.L3cfܙC;AJ|e]K[3rlEtA1f)E䝮nK.rr ;jjHJ_~%/||d;z#]8gv;l&ߪ%HAdx轑0G]~Sq3hEI%FllٵKUx}>Oc3{|׵ƴuοAqim-(!h廝1n[6lٳSTsNjU^ؼF@Z{j-q_NBm5W[Unn[nk\Qnķ&WUwm&bca+9<) O?+̻̾g>rSmuͽsqspZJS;)yM78T'|N#N^V٫bqm-˜m`cw:.[$gvw]s9\]$Ùt'l5xa_OGPkɟUg'_'aKjqFfM1e [7U[>2=c[tV-MaL\)Hf?ʺvQmmv Q!Y_KxuzӍ6Wkv]j%CbGq|?|>[%])K'(]eWȋlqc7'~O]Db`c LI2=ηy׏꪿7~69rB*_y\,=-uϥކyry_u^G :]@3$w~U4jLN9VNC^ 49Q(k#c3$*cLkQ(ۖ&Ōh5ջ\r9uݝsѫ6UWµ|$Q Q~{}m^?#չ*@x@ya~̫s ޯn\u^ߺu]V TfͫfH$b"Dcjʮ Oͫ27'kr}1 n^M$EF܁ Asȼ]o_ދ ^˅KU~R[Ckuh֊d۔Q "?^Zmis8GRO͑z_MB}-m?ýU̕~jkی6lrmtCΪ?E :O'KJSe/t++;ZݢGQcaJ'ܫ%m>i,QcC&+Įd6Gɩk5r*'jU24bƹwkѕCEHPF.$ݑ15;9ӹ.5߻G-> 0E>fcgQ|O؉%0ziÙ]#q'IS}oh4[cjͥffgZݦ5:4s:5Ox?Jtϯby@ivZX;8JzmNӧ4 \_낝ITnnb;w;wns"q"mmV󆉷/:\uZCSQp~RgY|]gWQUVz%Y|]"/oIuqfw!= ?O?Y{gsE5/GͳnMȎXʻj.QAunlՊ4x~Txz8GA͎G糉Wb+J׊ڕe'_R@5t.WۯcliSt|N/!j;*gVjF tkӮ(w\awGwbR(&,u~r$V--=ZW奷U>\8u|nMΊ:ΞwptaYuEPrk6mU]?'8zA>\N]Z\mN&#{ 7?OJյlgTbxz:Y!8ڮ4m2<}jffjC`M:ov&"LuwrI˩N؝\\wFy-uw)} V1sy[+[ȫa6ǶW$u9[.KԙKeEZzC~z<ܮTQm.mNt7j U|5(]9ڻ'ƕlI)ϙ*QytyYGk>& sQUغVls.$p^H^W=s˽{"a\z`%yi<ҼSS>G mXTlᵛ_*+HH,ڒ#UBR 4iyuO5i_ׂ/l.텃˃#2WR2͙9367W{=.%=n=}X=-/o'Sۡ{x/JSʣ.]G oTk%'iGn pW[&rQ]U466jc\#ZT}_ ˋCu{S\PW2&ĚWIϜH/bՏp/e%>Wˆ23"h% FI]Sܖmm#E<,4]40X12bjG(g[m1㎯~T=}|GGGU/ԫW듭ĜobZdԙOMdbo,bk[5˺NӻL:ˎs%;IALbIIZסzοn=rWJzR);OCW|8lI{ 59qસ+d9rmo[kRmcXhm!ȧ!KTr3w8l~*[8ʷUJߪ[ߍP zXfmS!.Vm9D ⋱df.LׅY_Ҏ!spڽYZrTH`Z6mѩ2KE`P]ȓnr\nͶ 9DףfkcwȊuQ}>WשI#!QDÔG#ɕeUt4.[d8Ool4m|]'U~xYsQsUsv n}fk{ޟ?k%'|SQ'- sRj)bWY-)]y¯%N+y/ArKPdVco^e5*E?m qtQKȕi >E_Qݔ-}FWG^ >çZ>R3K/jZ%u%;h8qSqMbƊ;]#NjX,Iwss&] 9k^mpz._hN,ntNZO,3,|"k7\а5Kljn#@_&Q.8վNglW..I'>A[/A5j pyc[ǩ9׵{^y],kSN.mK'Q̚g-62?Sޡ,3!#1,DAJ ɶ-yUxR}ȕAhPO⌹aҹ*Vr %IjGJ?1!UUj IUhH~>(?_t?]-JO;pEHt8w)~hhnHb-ĞLW*LΔ!T?âT\[2ٵG6h0tݝslX-6FP~%P7BQvXb;T[aC .&zVIKQhvleڣl#&2h5H$Ug[4]$4WGM!MA½7AEsRGRHE>ۘzO ;8T\E+ɏ%zUEjղzz[r m0 РDU2J*j% ameys?AkQtzi4%{pңeOM'%UH0G(zI^ Ñehŵ[lmM}W\ Mg/9[8դUvNUq*${!`ꮟmJU/y u `u 7QQK;#UvbS5.T:.P5NguŰ*!̂rDewurn5^{d>NUT%Kb_ OھF؉[bKvʖ5!SHxi/dԮt봋M j&0U~kmDx4GTK#(Nی*a|zUr!ZOMZV<;8n۫:\dQDnJ~@Z~'W'f MRȫW+w_[n;ܑ/+UpBe8AqAPqPt=]ڗ~d?3حQȕ{4i5v] hMʮ6 JǪt/kj=?$AćCSIn63g5j5G9(REUW"L ڕGp3zr$iOW<05ZW+VM(E]?/[RU&T%~T|ih)(o[mmcbћd#Z6بڊ d)f9%+`KO.r.g$^+ .D,ؤ;r'(_aK*,Cy6f Y6"W4IfY5o\-1Gd./z?&{(0/E[.ϳg+>VBF]rTFUєQ_ œdU0L2a;W*OSp81Cd9`sHVܙJp%%\9O"Wf-9FEVE 0\\ԎlhmnD\˄sN퓺p.qFQ&LBOͭ[2^>E*RTj `Ed+*_sS"vEV']J7jV6ʏA:VȜTFQL 6 hJ{_&K} 众T{ GCj?/19+BﱊV5B<" / /@?7|𫹕lԧ͎"Nru:]qq:r?䵭XqB'& Bi|ҨE90)=P9*¼4sQ$*bTb9Z^F{h5UVUsDZ͛+iMNdWuWG"jZ߃BWQ4)"^N)ЇuC%m|~ZNH+R}\)g{>nI|⯕ULHQ*- N -#j;j4hC;EE&[wn"I 1I75ZX=< NG1^08T:jq@q‘ypPg=1O98 U->@gu)5`Кݒ%;JTdRwT9ND- щ ҕm~fҨMaB#KUr ?Ӑ{$u/K$QK Q#@I8}W>ll+ ƐUhN0xrjՁɐxZ2N^a Jvw({JB .y ˉO ᑪu-(c'wb!8eX#^=(Udl4^!l]+JYP{UhW ;eBrIwz^,:xOPL/|ܕʲWL 1,!`İt/w9*=Ҫ\YP1{1>%sw$w݈ a4"V_Ǘ_{wIG(\ ^J֢GۉaDrC+SMv)do4^hTL-1L2RH]܌M`\l\"UшERj=.]~u/xs]>j M{ ,Xbŋ,TRJYeiiiiiiiiYeYeY`Wu}ܟ Qʩ]T<#q,)JR,,,,)JR)V,,,,JRnڻWj#0H(4_W)G0ͭ[ګHSll1`,V566G%sU:$>RQ:EaY|zǖ|w(VDsY/n0| t_;{S+f&34H $o5Zȋ>)=Df\zZNFʹi;q!Oi+^.&?Br}W;\)c;v\BKRks)~QWQ֥Qh{S|WđPNGN)h\K5٭殛`7$tJwNkrjs '6IsW'tr8WK;spqg W7Ҏ8؛ Wͪlk13?zV/K=%_M QO+?$Zvz޷惈ʗR5P!H=O: _uOxGׯJSkN뻮 fc.̛˲.pWNY055W_kZz* |OF OFGbe^}+yҶ7Wra9KSi_DNO, *ȳ 4UK4BOP趕6bԕ cB.Ң~^4.YEU~oQrG ɗ$^"\tMO!ϼO"//`YG$R9{w߆JhTeխmW"I <i%Z 禓ӌ*pA)ϓF<(VU[p۸%WPDh=e^I9~ {܎䕵rBN8#.\*{q}VQDW){ǰK\}~J#llV۶RۻFhsuI\6kv܈LfIMfٳ:_^/_s?E9S񪻱e/EZd}Pj iB^x4V͵Iq^\4jg\2ӆ<_`j5-ڗĊ~iP? \pTMTNͭ16EܧK]'GS;3vrNt78܏mGOJW2H\T=juC_q*%۩'>ς+Im6V'#ҵZUKN8z4Z+\6A66VEoWws`r-7En>=eOG$z9^n)=jm®U*u__ ?ء] .ەUr4q)3P[QZ 0b3!b$ ~ԍe(~*z쥁7p׬[f^N3l-^8N8?e;>U`DE|+X, *j.lٛU{^C*i/QTI[sRlmw q6. Qn\#XN4$́c1[N4q6t^8_pt2R=^~^X^\WW"p[w'<̞ҕ|UJuC#k!Sfͳh/{OsK*CU{6KT9xxxRI6mYToX4@tWvsw\oWmײϾ< %W?/te^ <m!u='ROljeGOI`x$|sjp\Nn[a:9V^/?+2W& -Oh[U6[{W 8+2K1,u[(\j4Wu.pT4V$cG9s]"&hK܋M9mc6l٭=2~fI{ό艾0C*Oyb/,å΍ՎOC9Ⰴߐ΢n.WT׶QR8oފ?jyOG3wW??]o?X~kG??>g[_ן??~ד~u#X\VGG>G[GwO؟{jG|G|Gx6Gmxֲ?d[XO؟հ?`~R~?@ Oz9m'/ Oq?z9\W7RmE6_8GHx9e/*S)]bԥzCKX3qN GG6UqU'=MZ֯UuBcA)2b(QK-m~y(j KƧ?EIo~}7}G=3hU/ڴ-k]\rEwucrtۈ)$5Wi[{R\R+B~RWC)W9]h=U~nh={ VFgʥSݵ If62q6[Lٚ\\sv/DJl& bSceGp3_}cJ | /N:.db.\e-jCy9t<ҮBH|.~s R:hc^ \ԻX;N*\UMUFisIuMa2ns4t3Խؾ*=#šڸp]%'5jM)@nۃl'{Y/ ~>_{WF= )[/'>U ].t /mio*C/ѯv+xEN+*]wLUxӸG'sܓ%z_}+Qu˗dn뻋wsȲHfdf]Dg%FvW8.Gޝ;VQ#jys7$T_B>Ld$Ձ$bέwor*ox%wujHC!d'|ݦck`[sCcHdTF-v!7,U$#%E"dA&J$})Om.:~Ci@ʶM:}f#??ôՉY1&*6-|"X{ivP'+h?Qs0}dmb.w\MuOdʟ1kr1K}%3$G T { tQq]QWy% :Kxqe1_vV*6ՅljDZqkN䐐guɄJFMmm'Iz߲_{`U/Ⱦ,o,0q.(Nׁ+dʨ7VԶmx ~-8Wzwkw]1KDPuw!/MU|nuFF2lswwnÎ8ێ7{j>G{Ŀ)+$z*$2{-ˈ_K%32ȭU i娧5-ӣӒ PGGMu:(rC*І|}U9B9Unbj9w?'1]UCK]UTRE+UV6mQmU+HQúwin[LFCC`6otJ ?&/xѤ*n*٪- R]]qbX4o!˩[GWFҕ"VKjU%.7z^z]6\j:Jmi 7pe/Khݫ\H2#wun5WEi56+v3wqtr]uݙF$̅˩EE˟^:_~ ܊6Fʸ].K$jIEJ>S9WuWv>?XVId+A]L|y{i/K?&I6CNާ1qE0I2%mmmi=\9wPT/z-WwJ}"%O 1-5S#r#[5F֖ű5p.ӻE]F6OگkoUxJu+?*\8^7J\8eKDiW4}D2)afVɶߺ<<KuEwʮ/JNN+HC[*U]lꃦ!wݤRzM̳f$dH2d&J0{g[;fV#0Q/({AOxO ă*'dKcha-`YڶxYJKO:߮L-RSz.gy_qU~mM#mMrq+HLA'wk't;fn+]9,1'vrWuӥnssw_i |eKrqg*nC}8~8o}q?sI){[r;T;rl8Nz-y7yT^ƹ_Sp] 9kUsBNMuV.,[Wj.CU;,SE/n~62+Uh-22WWqCګڣ̶a iW{{UիI3 Ayxe^-_ЏJdFј[dilf}̫AN7}ev](UɔO{/FlWrѵ\2\kvw ڋ5J ,R"2cIi{?m[U{G'CzU_} mԐt Mҗ Y$z ܋ +ސgRL61"d͛c33LyĞb^FF׎r(Dc6mt]!^Ɨ~G.Y^H@?N0At:G4Cw^"蒾ߏ;ţlcax U?O)j)}zTx;]mW0$R#}z[+Y/ojܑ.Wύ'ǩeE%ғh +I?щh~_#)j;Qoպڌ,#fQ2'.ˎw_moV}V'\^kN|^AMQ2a>9>Ȋծ_R1Ԝln_UTէ"=V'@=^d6cg~W/s]2U25ljs1RfѵX2qF.A:2\NY/Gtelu]z%#q{ڏHC.(WǒOմn8xU9E,m^8ֶH/}fKjlcͶr;FCs|\_aJZ6Uj  I`b&/=~ok[|_> GWP.s{ }{D[icoI?{*j,2uElhm_"mڮrܱP.V86wuqdf̕&EEޣ[7lmc ;-~`A_1˼5Hi-,,,,,,,,,,,,,,,-z޷.p!!vʹfields/data/glacier.rda0000644000176200001440000012404514260111374014534 0ustar liggesusers-mW{Ng*ZU(Q&)A m+*@ڀJcB399#7{cV{oxw~?xsow|;7m>?#?G7x?O7ޫg[~O?m~᯼]?>~CR>]o{?_W?x}O_b;>>_?U?|~r?|{ ~/~~Ƌ ?oO~/Y׿ϯ_iOr?~~|5/~Eߏ?3~~3/Z w?v?y_{ԋo~sG1_b~뺯'ыu?=wzbv?O/^d~iǟUx?}bO?^>Zq?Os-_w{'<R>ń?~L97_e?~/iܼg^~ܟOgOo~P>}̋{ /^'j| zZ}}axw ۾OZgX۷__L?6 >|wz~x^u{w]}6|s;}?mQoj~_.g-: rxjm/7~zz?G{Fxoi߾~t`_;?{9P܏;9WL=j~|M1zO?hGs?|Or{O?9y_|ŧ7dO{/':أ>}t~Wl^b0ۛ{nm_>^//g_Ἆ/7kvn/O}_طq^W[~^N?O}I ÷e> w?wѼWb\W[/_-^Nʾ^uҡߙo7f;k/mޯlVK2o+vyfszq|կ74w0ϕͳ=[97+c_k^ssVs=_O~};ƿd藽5}/ԛyu/_qq?:wGߏ>_)9oxG/9y>;do7ω޾}v'aԗnOi~f;7yLw+<2y~<ٯ7f~]{ռOؚ[~?`xi.v^kQ?u^5e}Z74mgg?ֿy~ֿ^5;ߚuܼf7x~/Omnx'6;9\8cS빱; Xc =?wbާsU~YٮV_2{瑿[9/_,}_y״q^O_9 +W9/q3f{z~S٭þZ++}fzٮ>h+u~~ZGWK}~v^Mn~]y.i7v|5;&m&8|&jWM'LLC~x-Zοv~a{=x]cl~'_O28 M~ټ? L? ^ Ep[? g:~k}D|u7ۿ58^=ڹ]%_q_َᏍxelۉ [n <qF\6kc~qv]i}3>l[󶽞g[ﱭs-ff۲w?_#Qu0OqVpaڃ w7\m@>o(y/ v25RصcY\L3< o }^ =>Sw%q>xyf=<=ԋӎ{k_Cw~g8f;{ 'Mv71wy>k~8z'LCُ=f=wn{Sv\|[N|ᱺ/?{}[[O!xq9O??N / Wf~ثM^q N<0Z~ J%SCF<'Nߕ uL>|N+f;9?^#Wવk}c2'`']]uKc>75 gbL܊??!Gx-<϶)۳ݚٝ|+#5O[vuk}m~l2Cs9~ԼO'ygC={ϴ<KcKѼ}^;'I/ףm3E ſ=~??k>{x أcu=?{yn?yzWvT~|9|pA{~[~9ƈK=q v[}l:uNGg98s:3x3o8s;V'xR2Pye~ ⮁i|궬`_tO#;>'G:Ow 44?WƏ>NLuֿ3'w:Hww|Ƽ3A'_Kvκvⵎ̸Q\W-}^7qO 毅Zi '7ZR4Kfɟ.R~k/?eK~yZˏo ,YKzɏ,奖{|o_,ϙ뵄x%|)9->uZ|GOZc/3޿q,s_ƾ'xy99 ޅOS_<|z l7׃W7x3 =;; h=GqˎxѺ x'zg#š|7's'*.eo~~h~alGIw/|eݓٮl?;f:yιس.ug|Y~wz/xMEc{ܱ;=U;$⚖>eo-c)?/%/ُ%},%KTjFQ?4[61 >;4d^FǍhn_4k/5y>1_846ox%^4q8x|,tΖ5pZ'}G ;ӱ_y.-:u1} ;9{{odN7tu x{z:xl싕<ӊ~OF@>Љf_=(/">e;όw-5NjsGv_HGyН^r&: Mt[xbLd5p.յL$ϴ'qkFܳߦޔhfCG98ɻxNh!x>:[3k?[BKi;ߒCڊZ|DKwcKڲ:l_⃖m' ⃖m>2χh|F8 ԉ7;N޹;O'?6y yKs ԛ޾MUL=CZ৕_f}[G+$/QF8W YedoWpzW~ x̷Fy>qf߃kg](>Oމ ~j<8'؅ߝ<~tz-jˏ(gz ~[Kq;%">竵OZqO[83RV]M.i+NGe-ҥo'Z:#w'.{~fxVsܕώ-Չ.ᡖ\˖ȒZ£K4Ks6xi[KS߆h^7ֵq>xGލqn 7og-~>MmW-9Ń|v]P '\JIw$ǔ*8/U]_Td+g+˪୊UpgmF/w@pG;Weuzc[qR[F5%_ҭe[+Kli?,CX5-ߊZ||hBv:c_ĕ?< qC1CWI-=ܒuJtYYWz5/thxM|CG_[LYוy] _K7~Io _;s4 || ?mQeF(W𡁇ãuzЃO{MxɹH=6yd_#|M∬[x50ه$_/mϏ> po7>w#ވ{RMWNϺ$v,:w3+x8{ nL:6o+~~۟Le8KeꭺWrw.o.og mKڲ;-&.ocK:%5J%OSow]w }m#*{=:zƼ4n:7I;uKvjIgKz>Ko)\:GKsT':}د%dcI'/z~MÂ_%c^-KqXOK%6y,vfNл//GuWKx=[X5G5x/ا}ا ck~& 'jsO7ph{}k5ǫjy \9?V=wo}T >J|SYJ\Ry WJVh*'xx*+vcW3‹9畼@~N|gT -*,UV3e Xۇ5fkVT ݅oyvH8 Xs S1g|aCt7>t>HxME.ݳ_"7ޗ?\)ɗhce$}o[uV 8~! d}䓲>ȾQ>&FZЏ > G_lr&gQeC15_y;=xkNzA|);򠯗%y'|lث o7 _eJԍ#݃󸥫ܚԟF9xv+e$,B ]޾:o~ Dԏ:۟?sE} h+|ת3'^a;qѼ޻w_|Χ=^|Č7vD^!M}:2&tfɟ/$?,)KO$L\^O_y'ᆚ>3OMj0XNZ3.Sȓ4W#ވ4g?`u<.zsq!YB7[:7ʼ6t~WXW_&? _6TB"k~)yfq`)j25[KI:?.tt>ɳ@wkj|z%>|VGy+}+]QT淂?*7og%~JtNJ_OUǔQK:Rx^]UOu+| O}NԳV>O~^/+:Fsupݳx.uX<:#|=!*;u\D|蜎(43LD:!ԑGb~|LoԕLx/"&-!C So_Nc&߼{'D~5^b9RSj߬n7RMOmYOm,㤧~:&Oq/doV[j]_m~:pȖ۾ ~GcOS =|RyݿҧdwN3Ϣ^q?%W"kqPC_{\ _iEQx+旟UgO⃚C(άtUMV׈djImkmMgQG~ t6Ⲋ>T T n q=@%JRR\VJ~K)~-g%~(%E I|/0>S㿗o Zz(}t︀ 8`r+(Kom(oP滠*弄-{]tvsY÷YΟ8)_+KyRo½%;Y;q/P)ߌwuμzʾJ[|د~8)ϹsR?#<$|[-C#}RkCEK<4KxddNKqzQ-;IZ<`?tG)κvxo_}"Wz8.Euo$3>~JfE}١^.bq\qYGā}^/{W^/ xOU=0Qo{pV߇'ndu{hصLN=|peD9_}$3D[kq[$ϱ6?kq{5q wмO[v>Ê߸{ا{DpikbϩcG65҆}6n[·>vk;ꅣE.m[yߊ~i֓D?ww~o?A?wLu-٧&_}OR_l\QӅ8o uU8?T__A\SWK zB)/U؅®~9~b޽` z S2/o7F*)%^dJvdK}^JLi=K8%׊}أZJYf?U[ZtOM f/Bk)zk~/tH}|mYh2|]E>L]BN38ã=Bogɷψ>⭞{cWtDYx?-+ce_ ~2^oK{{CM_>W/:o#{ߒ}5akKzQk7ciGˈُG>uTg8=B1n{b&v=ǧ;yŬow/%z9mΆ5(pzi<"]CʟOZ^6|q5ëϭُ{]~dC+_VugU~*T_~u9ƿPc^w7;~JQ@Qjz#ȺMcu# 3jmѨg՛pR pw^ q.[ ?? qBX89E!yO ~/}θ4Nx$¹/y,3 xp q']jiOe]-tO:'垝{W N~iqsd+ uxO4׃}=>d W֋K q_nzgjџW[Fvm˫8"΃r <[. 1 }&~)^~y>9G\qW*f[[;7olь߲kۯϋsw?/R ~vܙ' ZM =|\RG=ybw3e|娛xN؃>ʼ0X:w%?WoK'fi2xRMS#ulz-ʾ}-.ɺ#@\e~UxJ|\,gDl#.ˈoJ׾L~ T%'cȼ-NoG^]|R- 8^ |[,؇oq(3-M̓G~=EA^2ίx/L|y|y{_Kϟުt\I;SRQSJg%\^sq=X+/B:SA7C<CaI/Y:;GGy)&{вʾwqchc짼*z_=~wGsuRG=׫\OtO~׊E}3!Wנ+48'8rЩ{Nxԑ^WG*FyQrFyF4WYqxw-}Sg Ro-fQׄ 7z#/NQ=@W;l'}^_8|z(uM_=6ZMXc]7icfC\_x)|OS_݈'_ d[V^>mDE_qA}'}(~jVVrg'zNuO~,7hS_> tt@??n>K?Hģſ<[<~w>;x.V˾,/B#}-bT׳Ex'âტbn9',]ϱpPC/Oiqq,qVpeGDEw Rz?%}f(wWF@{;O눸=NWgTpƙX;n"ޗOYҼO~oW雚:8̧߈OJqoٷu>40QuL:tu,ՙf~~)BUº&.xB>%C'gyG'-z䱲^^*ໂ̺ $.(=^~/ {,|Pƣy!YuBr|.;NN;;vݱ/w;=oUn[V|~+p˾n[ޭ ;t~|གྷOwAXG |?sB(ߒ}:xW~z};c{qook/Ž}Яa%[WHg>tˊ_\qWq'!u }#>;Sуu0Y&/;8G};rNGt#(:?_{]~+um0[O.e&L5I: O 3]Q}KoW<$NvnkZi G>/nqF}>͆x 6ٰ#}~[[s_T[qߖ8={0[x~;7$\ޯcwuC}ݶ/믘Op>oOez|v9[Oqp}Rӷp斟Ol@OllB?CKȿl)F/owz4|=^T*.a'zW'ѿ;ֽ~Lq#w2~xkwx/*>Nv0W3Dн>)?4V=oFs#N?In7|A[-ρOn[~1CVw+^yǸ/wι\xyv~s,/M=8Gz,Ec-,We|u~pgڵQ#2?&|W3F)ywE ` VI O= aQ.2Wǩd#?]qXN^3W~鲖^[Kq^ޫg=:8_Ze?^z8hG96">I{,9Kqs~[|at.[\)(.œĿ~!ګR_^n~9^~'}+>A[2oݯ_mQٟ3>>?<&_ϖf׶˼wSE{XƣKpfġAY{>TY#o;uw5&wpZD#xXUC/Yȓt/Rԁ.;t{G2>aOKUz2}!uD'_KHzKcħw}{?d\&ξg݉ROXﻠ\ɂ ͂_ZDDO/vY%y tq5 }j͈~Ofo oSʼgރ]:/(y K&uq?s:z~;Ny={.OIg w~ !++&ďzHs%eW}(28CSLjIb@yJ?Ѽ?Q~:_t#zHcZ%c#mnݧ?_༸78۽Z?[S۟?{_;f g[o>/DM컭8{F}ax7._\oyxW!}<>ܽ˞zc_'i}o=%ax;I]U<xż.*N;9O݉z";nUvg\> =7v6xtz8 _xM/^15/3Ǣ(͹Y-?_Gs<]ٯM}ǂ8nӅ|˂y ;fܩGݼIn\']:绁_#p n=W\v -#^le!GX'vS|݉grȗD<gy ^}+L]z[ǭμ|ye7ss}[ X~M1]}[{N;vkڗ_7".ſ:L6E)\?;鎝Q7^4qAǐ"@ǕYȟ,\ߩϿSz'ɗܱ[q~s'ǽsߚ[z[y'aoۍ-]|j89pxeC!x<"ʂ'V;_9w{z?+ϻRGύ[f%Gn0:}{EKxGuQ~uό⋑}Fz#iяnd#cQ<]Fqi!%/ euퟤg 7gS) zC~cOCߝ؝qE܏Ÿ何`HCog̾x^ù}Ց=ϏJ#vQ}J;H3['yWđ˧.k߿Pޣvyk<ڹ\ky^;yeޯŇk!ЙmLo܍?6pR֏G8?={oԅ9[~}k>ty%\:_7Lx[_HWV> ߍ=xոAvK=Gsu˭~{]wAm>ߢ7ҿOvvWy.m+@/e}oϯBσ\wv֣=?a~Aa_1xBO%23v5xgįf|H6?h?>u&wLt܉&8'핸p='}Rwhu7Ox+ٷYOÞOςkx׵x{f 0qZ|׬Z Wns{|CD;ɿnum߈ ~گ[yvCOB}?}sv&o9jew n׶P=>t-y>AyyߐjxxlKo':Z{NI'_ Yr80>+>{/rnvd]=kNةkʿnS`TW2ʗf;ߏu歝S:W]ey&I\59?y/- ޘI?YI>&~nn0q/YU\Y<nI{م:ۥcN3۽|wpߎ~wGu/g2sl:_/-{ll#Wm帗`+i/>S|q/;_ c.سv/o>]Gaͨpw)u5⋌CrdRbi1>m{)3LtiԇkxcM"'(y,:5doȸy}mFܱw#L!6xxE?|WyGQ잍?ȏ7X8@>gy/yci_үKީ33۹s'Iއݩ1mwo^}${3w99.VCG}To3vt;yxw9gVO>G}zsǽ?%OٽpTGUA]3#1F>tSs9Lٷ Dx}&~cbpZenp-} |ߨ[Y7ͯtrn 7x }HTӎsn ;6Q|Oԓŕ4߁ [u.?>_?IY'{.qky}sfJ;!^ܩ>|xdy=賧e^qDҢ=N;y{v7s=0FNü')븣9 N:vOA9x׬Se}>pggtkfLk5;y4 u5ܶ[ëxr^{P7)x+t^~C&F|p팺;[-}#䋢Gg<7RX'ܩK|1o~MݩztOoSwFj'Nݹ;t_كdOF~^{?tƳyߚ}?<=m;8 ؇s CD1se__sξGķ/rTOV粦H]kR~_\wt2 ~߳.uvUG_SqOdԁl9g{GC:C#z#Yu:7C0t3yg88x?O@~8CCtd?#s,ot^9=~G?a8NNj;3g>=۱sy̟c乎sGH<}{s?pڡy=;pM@́><3x==O'x''c{G77ryGW'pz'SK;?`':Αˑsqdwxc혽;'+ϫD9^9}=:O:+?eO{O3sF|מY;_ֹ8wnszs:s\s]Б_ v_ȓ_Kx. t.}xs\~\vُggx ~*yj:WSv9;zx#z#;?CyCо9dا}Jb}؋S?}Ɵx瀿8;J\o}w`?=c?CO١8!cxx =+ ~<o&}O'SΧ3w@Gvn ]Ij~O1]ݱu;f#w>CG;v$=?>C;up^.ڻS~}y"={N>4oĩoﰓa7E}+gAQK th!s$9Gđ8nn< z]{kN{Wƕy_ W/%/ 9gsx]?c73|̙y?u;n$^3ཞṞ瞊 ɫ=c#&d/%vqg\W>“\Kk~Ws{~ῲ+{[x? )l+<3ǂ9ϜęvJ>w9d7ſ)%/vľGx#Xy̾op |'7T}=w~sV?S~?3gv<=}w^ ^KҼ\W{Þ3čzÞO7pB =Moo-ѧ5DW>>"ї(D__}у>t xd[N#=_^9X;[a-g-9&h٧p%w*~BqϢqkd0~ƺ_7v޿vkk~O^K|~_/.Iɓ+]8W}qa/<9;S#" 03ȩ~?GiOq t"r".͸>>]<[GrE}ɢ;o[[.~nύ/5?y_;W Nؙa%Wdo;qɹu%~ SWګ-Kٕs8{..:s8'fiwȋ3Q#qoȻ;n 9?0O[OC7?wEq#}si>49Oؼ>fgS/dgg3Y+sg^<ᡃC~ R?3.#x88/vħpñ{;o'sNkF\W˸;O)}g#gv|oÏ7O ]8.śp%{~?^9++yw.㋰_9Wn7MmV-ӈFĈkܿOɯ$qEU}vę]..yO =xaql)N. ((E-':/ٗp|y_^TR*V+qJ/@*ROQѝ=iURn\zKG_>=h==>XyP |[ eafru]wN|iC}fo^fd?'O߈on8okyf#/'NG]c?.[7/q3 ,F82y]b_& ݊@?ysvO=ٺs;QӗCC}ugGAx''/ ݾ{o~ScG>{>=ߞoOƧ9p̾|wns~\\x uO_ȇ]7S]2WW sm>kyk7ѿow)ϭx,tGÛ} so%aSǗIZ.N]yO/C{rdg' }^ݓ;ONJx|R- y<\Z9y:3TҏR_g+us5)uc#Q &/ ^!Rv?Q7OߧOgc~Mc[ħ>??1OmC 8>$N9dWC|}#t$sg=w}#3 ~88':sxx.x%|y,x'[Ϝsv\EYw?/𚗡CxJsi]z+qOgμ%׍qc7q/-8*R_QpQx'8 >G{H_QbJ(e^?:?+Rt%>w9*=_73Wi%nܛQ UhߕU}ph)N.٣R\dy)wa>m-[p~X'-%nt~p]إ7*b'(3c{wC?n ύ}|'ӮkԭW+eC\_Å|wF:}suGK^}K^N<~j?ʳ=rx˜7=c䘽:fxcG#x;?e.|y¨ ߴr`ԽFOQF][O@^'yUQr~pȺ/GzW^k?d\ o:ԬdؼD~9>sܹ]o⫌EԍFBԻb+s_E}}~ _מ;=z3vȺv:>N2qb~!^3*{OTU1}Zgr%ާxws=*KR}/[o[qv ߓy=|5VQyMG3Vݤ'B_<6uzjYد-D) wSwzd_y"{ wg%qim;O/1Ϝ3~ <:{s!va/Ky̳/=ץu;xظG=tIc#:5kAw v [M^ :BR~xst%Z<})oRr>+ _%KÑ[Kb)NZחs-IK._-+~>g-}ch@+i [m ߴ֧e[;םxv޿Sر9W;k~s t}؁vB' oC-[}[|n?;/}ҹ[KrOYOb]% m +f{Ըg<t=8-8_/SMZmfyЍU⟌'ءθ}VEכ碂W*#TҵV{(µ%]JJ+u % |ϹB'_/z]HBY|=bp-|pco7xA}=qmCOůe8MW.~2tpğ]oZV+<kikyޘov, <Cp;w^e!.~ ^+]354(Ro +xp^3˕DI\Z:*|m~c0ԧA_-nZ5yJGO/~Ljg4A6i}/{kZ] x*Pps][i ;:;N\>-~?g3nn㍸0*xA\z#Õ>~;t}=>~ ︀7¹g[.ȻW_z#qK֏G?S&ܾJ}uԙYG☌+edﳯ>Aُ~}{yȿ3<=y?u>o ه;|O?ȳD_T~y??g_ȫ~G|y_pϙstߞy3yy.:g/?/ t!~~їzOS>]Wי;Rco~wg_THK}H/?o.̏^` bA!.->t GK.$?D}' =R9~.2oYzu~cxW׫pvMOVky>[Ypec]xk_I#/ٝFޡ ?d_2~qt>Au ='⑖kҙg؉G:~tщ;qx_w?q=ӛ^>ٳIzY=Š}_gx~ǕyX-+eeWڊ[W3<҇j%oG>+Z _s%nX+k%or>V«l+~{% O^!W\?+q cR^ճo[^^^}i>#x%ݼO{|co~c;~-gWzμttj lia@ɓ7/;^^zװk<_Î4 ~5hǴx GPܧN jƣJ]M%ޮM8sW򃩷7e Td|ǗTQ_(Q^OE7M^ч^ O : ͬW,9?O׳/^9:xx ~_ޖss^OkẒї#1tmO%݀C.>-y\ԃg>B.ڥgy7 /潀 ~_ +y/웬^ȯ,Df'~;8#Ag{;OF|wcn ޾k]ާ}~5* K~^M}uZ5MJ}/cMߛc1En[?<³~Y~ yȧE?M>YzE|bޯJ>QwC]G1<c8*zПF?y?8qU8٧n8f#hF^M>&;9?u's=xK%>y D|r^ <K}tPE=N?|跌_Mg!Q\Yo/N*R% A^eR]:~B%]]IR՗c_?̳U w?t_EGTE~ zO)t.5\/(>_%tCxe]uO,%{*_%GRh?ֽe/[xΠ Fo:YgQDQ/X{;z ۋzSLJO1{y]Wp֊^++җte?`ʃرs5~nP?2)8o+>p(8:G#~t?F|p^ŝ}+.wq#h=G1{~1_6g >q~mϪ̸n"sW==]Vt+v1}.+zߚ̻Wo}=e=fWzÛu_;J.Db17UˏNKٲٗD?{Dɯ./.ۥ}⇥>L?k6hC/yYj4י_?1P۟5ޠ5~g/AukU=V}|_1^ W܊]/pS ՛o~> kZryu\C].^'(%?æs{0כ>/Gx<ǡ=OiOO[O=S^|y<>w}O/Cqڡ9eZE/kxcqvw' ;wBu">˾rWO쯼#{=oHËxo@\~gv[PԾ6^+?HH%TWs<۟oW$#f397^5ߓpܙE?j|x?r\:Cr_}rg'ه q!=r{x>9>^ߛt yn*#v*;=''.c"uoz\|o~>$}3t@?{y!;}:mާHz?v^١cplO؝sD]rwN?sG;uJqg죟o}}'oWp.$<\7}pC7Nč'tAQo}zC_^y#N_B{B۲ :~~ğ\+YtWP?q"G]a>+yQo2J]z;s O_}p?^^:E=.f_>TGތz3ٟgx30f냇WʹHO[+ﱂ VJe bo| '/(nJ>˨>(gFzѺ.Q\7#{6iL&mr'z:~t'NOۄ$Md'ďO म$& ;z{sؑ~{#ߎF30Ǎp?}ckSG0<15/_y;y f+u+duYߕ7_;qr`䗮˜/#?BF W7wй_{k`C7F_R_ϗ}˃KO?^Rf<}j:>PRE轣_RJJ;gɿ}3Ϋ_VJ>[ nJ_:;S׵}Ō5Aq}89Ldk~-ᙸ/'?t|C_w޵Z[ԃ iR}Ge:Z [zܛuWwo?V;/D+8)wSV oq @3|:4cL]<<؈7x/>?F}j2Nύpxyn#boGs2'8jr&zI<4~2dM 3zNNNLt>8n'4QMNOghO(M$>c=:y52>k'|ʤQΟ02r G(J5үo#(񗩗 ݩxvS %.2SzY#V\Q?G?+}gN=^K}~4yI:y)8Ἆ_iٻ6xZzߖWZx%/ >iӖ=kۖ؜~TK}(K~ni_.mjtKn d^geGş&@7n>l65{RsQ?O:8s}jMuܧf}OxB_,Ys|Y۩ ]f4Aϗw^C{Ԃ=ZX ]ww']}_!]:_yy迉g?gs3yl?}q?x\v.^z-<ą+egyZq{iO-!k;N=ٝ}}XVWɼkaP߉+n=׭|̭0b~ҷk->-7{/R>j ʸ4O{̼tYϡ.$}@}ثggAXģc}{;ǯ~re?f?}Wwd%34= Ȟ8yTuVو5xgNMyA`gx%oN]Ls'}&~p7LLI<|O5vˮǵy[[5v^&k5:߽?koެZ5;ofk5?G9X{k<߄؉I^udLt 5?'[.j&uƨct>F< ⮬ޣ8Q tL=Fk:ש+~?Q;J/G>y飐y B!RdC/YO/}^pnMI)y(x>fK7}t!f<藡??=>c6гc={ogwN=s?|nΙS*.ѽL{Gz쿁tv2C;ȏ ⏁.>/F?(b^+< oKͼ/}8{GNߓ{z~v|gwkGB>?v+;og9BmC-~7ң9~ tQ/nR_'8^@[6wG3Ž!q:|y੬2+^kegw-VǬU;_:_5Q9gIϰ*Jฬ˸&xMqqdKqGikU)K!)H^୓ׅ[ :ڂ].G .}@AGSU|g( b!n^oQ%ق͑][_wpK<;,}ytaѯ;taqxU9?We y;RޭזOYZR~,Y*e?R2 Qy*\S5:tpOx[s2yY̋_X i xg,w-ğw˾AxB]A+wvNzВ(ץy#_V;Ǽ˰8So?=Q7j$ow}joLqL+ͤ1?MiF ߖweW{+ O}ܣ h8:^'Bh_d>yu6#ux';zI1uxIߒ gzD\M] ιO?pO?Ѿ̾Ռo|/#?y7}^m3יyŗe]$>m&xk]g R^?N)0+=FFrQ6n0tz#^&u?>3C_J}sr*sz2+s?ͭk{mG%$!_'Zck[ݵ]ԿҽM$:[~~O'yI]$&~m/4ҋ.ԙF]*}hƸ!t,8x<" J<}4=׊?X+x(+4s;=ߋz9c#z'#q يR_}ඥ\OKnK{{GXOK,yX}fo}=Ou#QGBKjv7P.žzT6vo_Ng}eTt89O֕ G~+iāBo~ppDT#. ]*{ p^7kĵ^kkͯx2'Q@!q>Q=;|p9y}?x:Ϧn?/~!:)V⠕s_+O׸/[=U9蝃^^zLOBo]{ ;8 ;Rkާzּb˟t!xKwޯ+n{-Kϕ}۸ow@O6x9{7`F^'j~!jƗ՞f" ~?J^0]|ve?R__O9(Rܛϔx+u/92?k[wkwk5x)">;N턯H<T#?y1'_ɛt7I}I=H?f}Zx8~ꨇ-ӊsg߲3Y'V(^'?#Gͨ5ٿ%5f!#}Ө*ymFv=y,| :YuxмҸr^ ywB`+Ϲ8߅K|=?٫SphFyv⽎N޲;'s3}EǞqgtX'?ɛtx9.]ُxyoZy{{u)^Z]'Ej _-Ӓ}\ϳ_9}u"7hC_XkS_.{.&tkUAoez8v3EOr3#uK)%?TzR\5W^yMκ: ;/{v~&xtSxhσ7;q~+y]O_:.)Y\\c+v|~G?ΉR7Cⱨ ~wc֝;O:u{wgO:ysoėiϜ'yK}>8Zq~/i%;Ojs糌{#<?<_0ϵ䟚۪ξv4{`ٕTK{žE'O=m8SOyܼOܞu gUu弔~M%y ܵ:5ך"pD>~̻uudzgt':ߌtDiN(Jgb ѭnW a7EƅY Y+}/r%[|I/o{^Y O&>/Ϙ<[W}TA^wD`q@qGGՙιI|^odúqk~[~>;3s -Kv1-|oO-~ks5a7q/4]{sGZxkvǺס'QoUWEW}ZE>4 <Ɵ}[7틉ԏe6xk|sC?'Cɳ[ϬzڨOx3{y;æ~ı\wpo7:+u)++y /e]i_WuMgAv$Q-Kg5ve[|b;Qk:è篗%oY{sGh'a'k#mj;cs/k¼7P>f|d-0ixG¯);L ̉.4u +gQ7桟 =h-qioh_#cp޲@ӆG`v+qD9Ywk~ШP?rVx{u =;zGzf8pyC>|OoRfwfields/data/rat.diet.rda0000644000176200001440000000110313754255070014636 0ustar liggesusers]k@]vQ<)=x(Vpl&qǟXYQ[![(ҀI7O{DA'{ L7LՑnZ5qn:{^Sn̸1]U1uv1o>vμ1?uӚ/4+.ޯ6yM {{s]%Ϩ_qv4=@cS;PeCO/yv_u 4+}ŷUo>.|ÁU|<G~ ߽ B_`}cw_U8遛>ý/c9OG3'=ɩ Ŷ*ɵO^˓*ҵ()l .M̦&aPguEbq=q8ahahahahahahahahahahaaaaaaaaaa׍fields/data/lennon.rda0000644000176200001440000011217413754255070014430 0ustar liggesusersBZh91AY&SYO_i<UsUU@@@@a y/kJ EPUw)@:hA@T) *JU*U@P H$@@)" $RU*% UP@ P)"B*@$ypC{!B 4Q Wwx>H*%I"% HT)D*TGwuEI@UuB<5O!DFSѠz 5?B$HHj'ꆞ M4 2RIS1= id =R#H􁠘00HIbz JA4 3PR\6D(\BGIJ)Qt jAB)] )BSTF(U4^!P(4 M hC@"Ri*)@ ҊE)J&R|E8hB4H Ai iGBhiq(R4PP))KCJ&DlCJ4E4&1Pi @iB"4:P:&tKӬIMlti4KHe\Z5cjD4\*bp'vj %"iЩAFkJh6:4!k`\vwv]:@"i4q3*Bdj WζiQf*,8; ):l\,nImE.HI;#$Ӥs BU ؐQŢZ.VY6б"$e&iaӔ˪\ii0d@fpq4Mk+S (u- 'ZQTPZW9]ixEn[Zبې"4fȍe5PbLSI9L.$FvH)f 6W% QYpEXfIˑ*¬2( N];LA-U,Z+B.SKqHPk5 RXRPQfu(vYPtE2S5 4 irdYWH v P Ef* S0PWSfY(UM)IQ.#]%R dM[hsZ]FA( J,BdJ#-M$eu؈]pjVI)+(du%huK ",0jR[Ni.ZTTBF R :Z.AeΑ­Y!IJJCg6uM-%V&"e$R# !*e]CiSTVFrRibAA, γbUaH"Z)K eԺL4hHs4q%*f"Ұ:WJDXR UuXaD2XF%XH#8NhI$RbDBipȰ҃ͪRNaJ"V%(%fYJQBRʓ3Y&%b"P-(0 UVV gJ 40i&aZIBEEJI!.ftU%I"UIQXj *!jUE)bYDD$9ZFH(i%#J-I*H 4R,TR2g8RS14XbD*QT"X',2,2Y1+S RQ(䢪\4VRnv.2q39rPfbQ-$&ds%X G"K "CTYHHVibr.iԫhQZ\(h¸a,HŦ$PKDVm刉AbI"IgViJrЪ΅E"*3Q*),a`4ΡZΑ h$)*(i3*б\J!+2 +ZȱS#ETZ Zh%K"UtH+!&efP\PJYDud`eB Ha&jQiT YR(RB"IR1fQt-M1 Q)2K"D…9efLJI"Qh%̉4԰P"NBΨr : *QDRlHf(f$D$-$(E&J*%hK*TI+(JTT)RkDb)[143"Š̭SXDe)El(CS)Sa h]*,E(SQuVЩ 2" -'L(X]J Q PK%ajEJgV.ARHtDN,ib$5EDHWX X$43֦4fJQD#sЬ( NjԴW! U)(ΡZr"ʐ) 5RM%6JUJPM2TT(RIhJ!XfYjTb!sEXeQHt˩RNVR-dF[U2"CQSҤPL2.e)':%\J«GQ(DsDu  .Z!̢Ф"2*YJ*hIUHV$SMa"R0iS RhYALQQBtPHZ%f,BJLN \I (R iER֢fHDXXi!),2UI5Hf%UL*-0%$%$J-*f"H i%Q$&Hf$G8Pb$BR 25 ,4A VV,ҌNQAIq ,enR[DIt-YrJ d(+QdDZlP)ZJUhIhbdU'ZT)YTjit2Dk>a^+HFPEB8;’ShEGFHd%"&\$,3 P1J,GPi#9ERiFa$"Vs iju*9U-J鄒̲٦$޻'1% j$EERuOnTYIbj ZViL!(舒 hJTUQwq-JeZq2 PZTDR,5eVZS#N&iD"qUАU+PHÕQjr NV(:)i!F!+VRW: - -is22.% 4LVVJdaD42ĸ XU,REYfrL "QPȰE$1#K,2S(C STԊPڊZrbr̔HJHbIZfQTJ"ȨXfPRD*H\$2# )KJDF!Q-QfE :E*L*UAp5J9hRR)M6R(I-,M1RӨAM $±çM%L 4+gEUHl9rX(4P"3 C8jT.g2 rĴ*%*HE0Zi&S-IX"_]ʫ-RDjhjUeF*%*B̉ 49REdbe"Z?Q#)IbQԬt|1S*j*9`&X![SjI)"RDEʊCQZH]$(9EZ(VXikfj/ǎvRJZb&b4#-0ReY.NS`;\9K)RjȔ@Ws~!f< =@ƓU̢F Ѿ:܄ BX1m%D6ӓ*ݣ!"mc!&FDyrbG[Sͪk 9[ܪdr4ťnǓ ˶DlB5eNmR&cI;^Q5]k$U>ESak)vp׏dy&2yrj#z+s$жr,ÑXM̕\k-2Y8k7[ecUf l˛h5&enMLZ[9**Z\ᙛpXZ1S q5]#2@R2scyJhzǘlB%宺+*0NV[-*1m2kumRCTK37rR=2X91cbѶYk,287Mv |vYj,5L`3$aq]'5ݎ"lZfڊ늼#fȍՒL32l,m,6762`]c^(^唏3,lh!RuL60L:TFYW;,մW4kUݤnn(5ƭyՒMCpk5Lɮ Z]ˏtnQey9jjfWdZc9-1=3n#ńXƳ^T|rFnc7jM0XsJ6ESV#r52Ҷw[Yr6*{.Gfr;r5Żhi+VɉfiɛĊCZk9Z`Y28ڥ9 dkJkby) =ǹ͛qSup37ׂw%n.۪Չ[L|$\Cnp6ucD\R2tV3%)&XbeqcyqַnʛdrB*T1iͳdȵ9Y6+ 3`*e*ǚXuvLyn2wjjrUxvjגM]ylZޢVir0I-JC;(.Qr-&vxWJDQȡBM *Ct2z븚~GqeEZq J"ې)9>"\ȣ<Ȫ'UNq.w@'^yGBD/w;q4U 4M S2HVfM|z|դhb.{#*QAƍ˙ lj:CW_btC&wϒWJr^p5o=ʯtn^'tsE!M̏'UwzLO38truny9#35\_0rZer^y]ê]iiup$AϽ (&#HAs* $#**$g 18WgfO:}{p5."<2s; #"Dr ICSJ M;(-⧓#{eWMwO2'!&d"_䚽) ?[qM/w(I!QI%3:sr=oxtG!QeATϢN#P-^=G"fQVI\.@9EUbd|Vdy8"VLrt{ǘ.Ӻ/tk#Q4G`#9'SJwUhs$8i ʜDP 0.bupvuͽ}J I#ȨLn|w$zw V) 9kJ%޽r,^vJB9e5xik*Q pRq$+Se#M/ϑna #49rT]sާy{s$KD*ۺ+{wOY7f\SzEaH\N7;qwp+6dybD }sSnrst]]Ctt\zļ=Ui-Q|Q:BW ܼw wg{ݏ5orS*,mR +rddi5 p%rM 2#_l g(E65DI8r"8,#yt2SȌDƟqj9']ʣc~C{Sq 28&eBtsV~ܨ=l-$,O ⱠCoL+@ɫˮ^&UZR,840.J6^nIrhim|8,bnbnda"pR|,Iɻ@V}Uy-g\븮ҖKRG/}wr , 0THEؘHVۀ:%>:(W-I(sRdTg{9_2Hw:ϑ^;OXCV6H{pB 4!i5R8Iit-XD* Tzzn 4qҡKD@)VPUˆ1W G%ۻuH{(_wzs»]\y)܇e5;ph됤uәf[+&w3ތwjoǮQyQy#G 2*D b|z2>ާ1ZהoجłQbctrG dT>7COynjU_"kÎ hjH!M֛kSZ`i{8ž׫1 J߮h_!I'eWι,i m9 5nfv[G 0,I{bgƥQ Xi,m+ƠhȊ"O({٣Bvra=|k`hƃE9m7M`48-*,8mC2RDfLuZٵځ[+WMwq"dRK$im8X8(ԛt3"@UV@+V,M**roc8ӏ}Ͻw?^,'2rFekD3:I# TA80"*ᗁ{xCx/"TЫ ,E :pdGZIeBM Q!|F&qCFkG[oÙo#HiZ0܁[x֛:<t1>y:D׮ w^>{9l$Wsgd6)rD" ?VEpy_wkZNrDm}o׋i΃j e5X*5j1Bm5|YF1rO(D֪W+߆q۳zoVr{˼;]ŋɾ ޗ7t,g^HƲMSȆ<6'q &ŧ:;g?{ϟ¦tjrƔDNQP|e.a2[XȂ0fTx>*!+5hΰkpe]`5mV/qBXvڄ9rn~~tD>ֽ}3<4(m1Q +<3 _1M)5D蜛s"9+w1E㿘elO$oq꜕MQk:Ӹ u:@rfq7ѡctxZY£CM22;y=xk;^ ([C2u^ͫ'f:9,p#M˗1d_yuuf4Ku~m"* bwr@cY-N,@Qg7,ֵ~[ޕopd E5^>Ĝ+:.J`4*3sg$x:Y0P1˵9#w +# Lf1uhߏp$J(ޡ+uY's<|Co(5ߎG4خ!=!*`YNYKR&b9׬Z ~g~z Atة\2K"&| צERpBܽ"~6bFQ:?>ck^Dnaj'-.I#slf)¶b1DMr&Q[X3Òt\H|'WP hyJOɧuq|YGr-6e7Ik [֖-'Ҋn(f1 6& ztEj/n y E'[fA6¢IS ,O$DI(, Fojc/s:(i2pCT\$y}Fo3*q2n;lY/\ 6ThP\̺ 8.^اo'788P[YξZ-gU1 -Q-&FMXPV;c{{Zz (*6Dp_sCRow?[ɶ6>Ө0@sy Wϭ7W΂{:]ƽky`ylaLhQ%力 .jjHF[4& 51bXt2Dj#dAJg\M<Ӱ۩@v$ s 4(+Sb↠g)Ougt">̇u:[n4G<3eߖ>:WԵƋp*1T3ju9i'I;#ٳq|`t⼗-L)>ug$:nZK_@؍fDMϒ.( p_z--IgX4]rFmo$#fЊaVf9 FġYV|LihZnNf|1F摋P Po|nĎL|bq\a̐Iih"XP1g{ sUt!L"Dh\|Rwo}cƩ[yO/U>eTPs(hE)wg ؈=x $[ mi4֠\X&xŵC#HՙR& ÈP[UhŊ\Qu Ovӹ#Q/>hLZ friP\}UW~\i_hj3I6MUj`x'eqf4j _'Ƌ:܉(%|!Qp5quA8CyQ{~!6}L̨}R˝Vsdooѻ_c/rh:mN^ 4tCޮIiuQR¸qCclIY=qQĘK{)׷TypVKUkȹeAy=PkN\ncSkw2 䚸XbȗƪU VZ!_k9?Sy<ڠ ð<k$*JOE5Elsr$mg[B[6Cdɗ?a7kH(5~oD~kə! Z9~P̶7!X\cs)gJ u9 2bU5t! Foz(\E60QQ͘L=1cfW5'|`Zs;! 괲%(?M}۽2<=ꯚS4ivq8v-t@iQd)wwg(]i}}X-svxB#6"5*FV';cYp# Zs]]Ro+VIJBҩ:qxǓ!pZһ2U'2_ÝFkmyz5S%ޣVX.఼9WZ wY9v^cT[QG,DRoRwّۨG'>?Iz?>W3SB=c'E:Llcls^l#% . s0K jDΪMKY,=5mU\0@X.NX[EoYuQ↝MO똌:(ӍTA%P4&{t,C\Wjl) vsəs91Oa?㔖L^p*x>-QhPxPDrP޽% J|W]b3~wpߤ~'aD;G5cc|@}j=wHjE{cj9<˝_K!CWk>W<؎槗[YQ1&zEf`-,8r>sޤ.!VZu EOcR%)0:ߓ;X=wO3=k>EW#6sTii?Vi"p1:Q1Z#p#YWkljdͩ|DE:r~aJ_((x$jg4֎'"M F,ML>z7oNjE{AT8J9P&jTS(FDݵ!]/dG4]TEWe5G2:&6cDsS@]rOuq?5L=kyn9#\r^ Xg'I@ȯSAb-5?״<^$Dqz3`|mn[箵Ӽ`-h݊.eӹKy?:Y"厾T`R%b5}2no3ȑپ#E^jRFmUp:WQu6yoK#1FP;^>ϿfXE`*Rs{i$P_"*xggKБMȏuxɆt.ivP, lIr9#&0UbJ3; c~G0z^Ku˕R"@ՎcE7rDdCqAuSΌϕswvq@Zc$$?\Zڈ; O\F%z1#u$*53w7K&?PHGsXe_iDlÞG>a]s Zщ)54L+2\U=C4W)t`JeP>U=~ߗU'^G϶ux.]~R:s]I#Q$jEW\χVWVή4?gU)O=t 9\9+UʝK~dn $dIiSC\7$9zC4,^ZMY 9pd>fa۳T#秩[<` T+Cr5ƭb[ޓ]7†oru,U0\dΠ';*r&gZPan}^Я޻uܜXcޅe$pGIo#Q%l@Q<82u?`t%ݘO9Ʊ@P6#kHw"s6 iɟ|NW0RT@4z'樒r}b-#ʡCNQ3q۝wj5J_^[ɪ܏Y\7*W؈PI_ӄ,#%XxEn=HDJAby~ΫۮOo=$]7;?$(#fxgqzu ,d.(q*T U_+pVDFƪRïĎI i>'-oX1[LTMW?fVg,Ros&+dT?߼3ֹpwu~_KF9c_j#%\=FYK jS|@|Jۙmw̾!%O~_?n$C15f ZPS>M ehɜd@+?QDw.lID o?晴Q h}Yr yO"\ f%MӠLV_}"yίO~lwT'7t5ߪ۪XDHzvk^`Ϩџf:W2=duYч={DsbCZ5'G3FVy3֮TM"o]M]^ۗYa wLr#A2uBH'{}~W^0PiZʖѭ%7]Csg;zP*$-ۉ5 c;՝7 LwV_:׼SPCwTKrL?~FP+pg!\CZOˎ$m1ƚkQ:`U.-D8mNhGm&y|w^/~y }LO>UF֬8{\kܭV`ə?rV҉kieIu M]$*<J3)RDOsOCc4J_qa>6zV0z3Xbzsze$JW}hylֿ89R X$G[{H(b5xO:gn߯<>i>5Sp_t+&wj1tgnx&o/۷qrW:.vg\뭎N|O@{s[+^lb}CF'KΜYlZv3'i?zs:n༓߿M)g(e 2dM8eKgZZesLfc%FGDzy[y򣥒~ӏ+iQQ_Ó|OAҍpy1_o?|ܞ|߽WU .|zW>97!exB dWOUTR-af GH*3{:˝t6E(9Q$LRpf,P&ϟ7I۰F5=7&74Cz;qwW}-KX~/C)KX2 ?~s=B>~~ƺ=@3Y^)= 30TW6cVɎ,ի6 mW?:<{d>c:TjF>&y;A=B"=>ag9:ĸGSyF&j`gXy֗'{JVCT|k..TE([?ǝ}9f7JȓH9_5NnI]4suj.4w8bt`=~c=h a{^59_1PR&ɱCeEN떂*~(ss9ULm&~|Ӟʟo{'3=qj ((Wm$akw LMHiLh<15RO5Jv}!{l*bmk{9uÞg|# K҃Q$ G^YYebu9s7_+ӽ=D]wk$*\]D=bWYbtx34)_n#Gnөq@?\j#="#eByx<*Z<}M?3;?F ?u{_\:#heA|<6cfOnwi.8gWV?Bb7* 亂t 19XFB~U`8 oW yC*YzoϿY_x?4Cd{v"%rD/<3o.yCJ-Lwݱ8 T5g )l[?hyzE%]CY:.cRCwd`|4* THXמ r*!l+7x"y5(7 Gjw]\ 1~Ћ ΛcӂH<~p`P3#J&2z?Ɣ)CI%f"6mn?r?]#^*tj(̙B_J#u^Jd:mbHYH5P`N!qqxW G $=4gB-aˑʁ $4FɀFzq][]O֖mIM(^g=y֙za~f Ƥlڦa/c>+&'}(:lJuQh`SSUΠ0N"B*eW֬zv :gٶ@ H.Zʡ=@ cW~K~df,#ǠZ㧵R 'GH0.p847t"t"!$; 1>\k>{1”e@znDs|k|J2V(f Uί;63_v!w?>7b+"B~znqVđ')8n:bNfhDNEԢ舟eZ* 5Qmdf $IyۚQo}o#\7<|ۊ?IԫeLk4Nx[㼁Cy cf ],>a,kL`8'vrMu JVs rFw7Vbkg! hPXEd * ~euM΢i1+ UF!o_'P(mQ C6p[3SϬV{Y2G[_Kx[DXʲ<O-nLN ҥ? rNOIF|.3dC>B& 6cs̸&̢7~.?Q9(UϹo}z),"8p<TCn+5B OWgmM5D 5P`6Cd.Tn)x+hpc15 OO?1S#u9.u鱚_{mhHtxHc2fu͈mq3pߦ9R@!$uf3r f50-տ|r5ax)F-cm>p!آ ?NA@>Jza1lL)QXۤx/NEV_>~m#d9My5Q9;mq8=JSBDJdGS=!ƄigLUOz{n{\W0AjbᵽE JSཚ@k9NþJfID) MS81@?̪"g=r(act+NQ xTMrܚ$ !7g61c̉֐퉫_F7<~e7K+FPGAuRBd!ץl6[`W΂t LY8|Q6G%obsxf!ͅwY DB0j-)4`x-smÀk{+՜qnV?@3EeD\̱7P3LCXoV1bӀ*^9/i󥇂IA=. EKp@ÇHob>(I4O~erCȘ',C99&VAn^&Wz14yۄ:vc"=X5zݵID_w[v_@@"*ܼ#"]8*EP X3OvE~**-ǍO;.s=hbSp$FETEox碻EVN'er'sOPWx<*41z'RۛWƒ#JPb2+TTV5\5n-D͙@#[U-nJwmA.PPEהAMcmsl?ws=O՛"o~ Z5?2( $@]Ў' (Gs#\WSe;{z;wT%"3Hnɳ!n BJ7#@HD;,q4 bomJa$7niڍ p' iӤ^wNwG_)jWߜ؄ %$ ƀ@vW8 M`v<,z9cgGx4q;#i'9y Z$ub<^]ޅҭ:m=ss(QR$Ի1 |hFB$BB8` ) l*5@!8,{0O7y*"p$hX7xtO15-*8'>*܍ױ'l^k-`9m5k#S;h9Ze}(&r -{[Ύ{ ӸgC_=0k3*h ΅qFv'bλ&IDpx-R\j:ۑ3 &t݅#J(-jpE*+ogBH tM& ݰ oo zbm<`QLşQ?9R%'ș^|d%Ag y4TUdGu4ַтcMeASBrZT:z}m9<}4y@d~{%XT`N͡w̙{^l^+̥" \e% [!7bj bfq|0bP逽f._$m !AﱭHE@F?sBb1pHaBp4 O[NUPmϹL΄|0jYqr!O2bOz5'9(m,Q@6`G9Ppzl{@D`lW<Պ8=$sw;,@Hd;OM!F߸PPOVA2C#2IA[<WڲP|mSyfע$QA FtW-x꣦/*" k㼅x'Yƚ䞼C#,D{;Yё {6'Q{jEoWe~`[ڂDAdžAylo6[pO=g¹ G1E#d\1lϡ|O69cIg-'$_57zv?_tsUt <8XF}3ӭfϗWjƦYc|4ֹsE<+Y ]"tA[*ƓcbLp9HnoڝqI5H2Qzgld扣uqFnsL& =4ZEY{ .|la=x(@@Na@#7MH|權09_eC߱_L9Pi;@,TR*.^4W)CB~ (}Li?_*7g[K#=ڵ$, {`<oس4a+Fe:Fl_Sj,OHpk7w k[>= a5? Ìj>v!iEx:gqbr׶V&F4K?dM , q^7ܺxBma` Ei^4#!璘V09fWV O0r0Z5#mEIx62-H>ź5N;舢!@PMZq0QHi("=32{;ѣd/ Ȥ`?ˁFT$mL{ CT97%6ݦb9Չw֢9fB`#E}sq )OfeJA]yI*%:OJ떉ފR(8UbL.QG_R}^oʗbE~K4跷^6,R3ƛT*Vhʳ5cnV 0g ^YL~W.iۧwƉwrS3"S0&SLu76 m p {UO<@Pr!a ޼];棨p޵ǮrsSڵ](Wsw#S,Qfƺ(1QCpԭ[KNLLҎ]ݽ;0Nr70VoN_>ŏwy5|rb-97|*3'"jE? u 㸾b..}YwgS%*S߼W{2)s<ǀ^ eǏv$n9!AC湑}F;07?5zgDyniuaes箷EKx=35Ozc4.*`78:PjDc&ct6!{9wTܙjOJ!rT1{ g<N$#h dD0C=:R[cU!y !6IQȋl#Īr&xE=}J5Ohǿ'SYJ[u9:Vw>D{mL@rՊX5in)j52ׯ0o+ä|JKֽ9QrGs_i?5N#p'M ײa" i+BMQѤ!|2fT:@;Z4Ehs\@]Lvw!Wַk>+|J5[G+Gif7Ź@'j't PغxsN&A޺JΞfɵbc(A;`A b.kwvOhXsUѩ鈨V 2dRPM0GM̷4v47a>*-HS=.`nIMLGW[SSzZ-o!/"g{b0o U 4餄%t2 .vr2aVk٧ʜfك_$\lVd̗[З_F=zKPICyO+=Z4]+\r15Q]i8YUMEXt,]MQWYv:5bTAf|0ϙvU_if!P0r n i"nady!0 춨bi*iQ7=BT ʡ:9wCߡ1_.:Pq(A[]ZoQ16س6/j%RCrn[5s<i1ܣkPg8?";b<:ۯoSqOO˽,3[1,TY)Sv-9J\- 2%LCh9߸4݅Zò㯎<r~)lZSYj.TV\yZ'ݥ1EZ6.>~#, E״uWwԺ!Gy?TҙV\Kߢ&':QOM1[2S\ucL/c&Y7SM3m,}sN+>ORwQ=˦M> ơi,C.]fϟhygZ}#F9s(Z 3.~>SWtL;삼 TxyU.B&=ëf+2Tm S3QH5O[{z (! CFw LUȏնs]~W G:Hˆ(Xjx߹ԈTMFb/]gȐ)( xeRTtBJ2WGN)ߪ`u:KMpAH¿Ox; >ň_'E%s &#iqDHllzERDw5,% a%Qc1M=$~BE zAPx:RQbSY]{=}fvց a=ڗ<\{2{3#LG98ngכvFgZQQ?Z$v_*O[)W%BTN)Z7rӓ>M__AtPMhcg/@nzI%pS /(uWԸ -Cgs0J1џy `h )lidW<ŗ2TU5~uF;Q A Q,. &<*\uc 8ߣ!fq2֒sRV46Q:8܍I*jN׳B$h}{/!D Șݟq#Z\0!|T92 \(89Dyb鉴=.uPP\R9Tݼ b'(l^er2pm@ 94uY6ja.Cm:[Z`8 g B0Al 7 WRiCu㟮8⎹CTK#Q"hLy .59z胓qУepc@$|`0Hq2qv,9Jq@l`99 \PTb5le v$y!Տ쪯'YV,z*F2,-JՐ\<0<뼨s0,j&!O3/V -mA5吆Dlpm3DMn2Y/m#d9cǘtS>F8F"O85Mx/7^xF nGZo(2 EH5H<)xxlT֋e,'{4hBcMhŭ/"- ت0nfv #Y-FK\杙;Y˭+6঴2XӹoAHj1c!2JYJsTi>F&6,plu]UbD;3JC:@χCǥG(63ׁw:B`^Gm^y׳b4sfYj pLB!=mp4<`w`4+/o1joXx6}s8 r?RFFυx;35,{qpj|oQ8L,#l"8$Pc^ ŗ*OESl|j6}$s8F;ޫMeH O[B4Ec>w!D.g[pEٵR4á5߿y;kj,N<}{c]{ف^tEG/Gx+ eWxxw?+g~+w?{O&_2ӿov;׿Ono[vοvoݝ}jvw>>|c'}/|_q_y:?{vwqnkoƅ;vw~~|ӳݝ/{~Ǽ}c'G=+/vw޹א>׍ۧZ~owKw'|wn>~gvhwGen`g_nK~3'}CO__s^ vjwoռ{'?{-ٛ{%ץk͗?O~;?9k^v6wן_o_wδ糆2?>V^9ǫs|0N;{}||w.|ySl}7} [:а}e[|nsC{wzދRݝoڵ{ݹm{OaveoԽϸ}w~i(7giŻ[4{wal%anOݭ}򬗷 ~0O;ǝO{ol~hgdi_}f>ζ Z߽ݝ7o= m~?ُYW_nˁNr?;q}Eūkq|ʃ0]'M?Y}t|&;wu2Y&EOzxY~ggNd~'i:2ۧe<ЩOdMS:5Y6Էy{o+'+uoy},_ߞ_=YdOV7`LV4]?:_oN}4Y#&+7ndNdt}Lߙu5Y{1Y麝,hJ&?2?I?\߯fko,}ҏOd黦y|p嗬OdiX<||U7Nd[,}ޖ0_C/'_4>7Y]yw~y6Y=5NaVspo]MdcYddCW\Y7|-YRr{c&˟?w ey5y%_<_>?Nd Z9qP7o,'˿4=&n'+qH^O':쓕f~b埚-woLdu8''lzNVwX/2>?\+6/su7&9=Yao7 YsX}~do>qY)]~ w>oGrrq>_7M3/۱ɩcxr|?KsC~'!}nwHWn3dH绋y{ )'m!N=Ou&~.K'[&gԷY?R8N%rN3Iդ+)ȡ|Sv,7~oӎ{=mDJ֣qSi~.Ra~W?ax)z?qE<_wO.p0M;omZTꝤKiݴ'_y;ݙЭIu*B;z׮%Cl9u??_Huָ_[ϝ˩JY7Snoo/LVl>='|4zr YH}5{fi.ߧHlK<;/1:ֿ!L{У3ɿH'^J}.gRg|דmIWtRcX~?rNӓ?w`x>4<ϺsN9Ϧ|zoZ_rү\NY׾a4k?OL37987Y}}znޕ'f|}~ΐS?L~\HˡYIygZηJڿn}ڐ 꽗~G>yzΡ3'}&K{y={<垼9y^IΤ܋IOcr6SKI l;~?0'&_U w,圙K3SG&e~>rR>~6FCΤ\. S|$;︗zRSisa5tߖ/֎פ|܉k):{ܭk6J ?q9?|4ߚe\S]sSݴVͳsS=)ݙ'~EWSy\=锻w?kQyi+Ώ:#9'ޖSW"yrT֯s>^s7/|Bo.k3ߑl{ڟ͛v^N#x_Hk;s_EKQsirک;I}r3nI+&/Oj]I+?v>n]-~6o}n朚OqN;3'zuzyK^\ڵ?CyO>91|r./4>~9)g pF֡sq5ϦRNoq9`,O=[HbL>5}W}BykC: oX OH^l\8۩!?m=ҫ9hS9ړ~2/[I//[I{O仍Ⱦwn]J㆏'90ns <+'E~O~_t9sm"هsw?i^B3ZN%<<^M[Ayk_ G;wO{8c3|0 e=R8{1Ë;ɷ7ыcޘ5W"Еsow4|OZ~G̓}^1?]H97i+;9 Ex\5R[I#/nWrgC)ΐ'WC/c{=ϠiW|6@ӕw9}7VI߆;wr:mzkwGkސ~wyrޟ Y+R_ޣpK#N^|O>ع{r!v(^u-i\\d\ype/ە t:N])ۯN#ovڇЎlKi|Vrk>Z~u~GO"=%>x&zw~Û7?=TKJm뙇ӟk)}:v~h=fK]JpHCx yy+>}'if}M"Ǣͷ$>@[o7 kܝ仐yvڧO˷Л'.zd$×6—o圅w8Gyg|,:I4O:|;i'4=;; C`r}jϿfx z'zLvNާAz|~eI?g:Kwȑ_}gzw:9G x'3K9@SXA=u|^ʽr}~ peq].Gۜ׿>xm?Þ)9j] $qt>HGÍdž,|oL235)9O?W3+ )*.ss;.lW/~^3zsfi/>ߴϥc}q7,ow3NGǶ#7]YK>8$^\Ǯ?~v79לٗ/ȏ&)ϹG/D7g{}?/$/|P*g~䫜y~k;)99Myk)/)gyQ:n| dHɳw*g~2j@7Sܐ‹mg/Л]} _xm<8:?oI?ك UXR8g|gz,iZws㼡ǫ^y/O3)w;z͜Xqߑ>_ $]Jj}ٓrڐ9ϵ\Tyޓ}g^I;ɗn'~m\;͔r/|q=o՜Qbߴ2 WUqh*~O6_,Ἷv ~Izb|rtn;}&g_ZZ^5oMoaGGɏ3?:k'M_U{|QIpvqСsyv.և/3_cYK=)]>xRW(蹜g}.wչs!ۯ9W72_VSܓޚw@W?*\Ng(Ə|.䤥?GeދD.\ƏC?_v4jy2xsS9/wܬc({&~cqk˱7?g>yxF٥>w| ]^s=y{Hڐx}g{X~tzN_d/u> ED~Co .pmu\;۹Y×\v$پ5&:>9u*Ax"tЫ{>4YĺGNK w:z8,lCgo*'EÍpf;ϥgs^O1?W7a>x0| LűsQ~_=U wc?Q+oz>#4B<Oބ~]2?pN9< Lq}EoSR~;p |@Me~ν7>.cvb$~DƏ_ϬcVt+z.;ߝ[kOx^efv=8"cR>;sf\Dgȋt:x&֐y꿝|s(:AnnK>| =uMw@;}W$\eW.{8328z\NMθ8\Mr ya#zs,O׼7O;)w3t/%;בq`Jf7/!䐥m>OϾH?FpF|; _tڹv%C-xSxԅw{^?L i܃)g=Y?cZ8{U_; ol߬?jc.ɳ9s3pT|ggd+.8<7`9ȁkrq|GvQ+2.Dtx[a~oȿ%reWsoF7擟~MɞBٗm#/?q_5I|c>vo߳{/OT v.?~Z~؟nrcy6\UqnqI?C~^|n. -E4EI[3]%~!W:G?~r{?{x}ya~OS-z'ɟg[K=zm;t\I9o=CѿGDs!vCʙ/3o+ApHvDA/|g"g nx%OW?t%>IN NȮ1Qc<){q#qس>w˖}ί/Gjʯ"Tq $mK9|j|w;w_>K?ޣvu_n. kޓН_?avՎNr_8xq13! ~bAJߤ ³gvAaōV?q|J)^}U,R.( 6P޳/=le?//;1~ }g?3I{0;4퇋7Hx^a>3KidcG|Tr?: 588>,#ۗ(٣8Gnx.Pu7U5Dִ^<3'g}fWz3GG!hgGn+f1>5^HNRr {trҾɸ/82Թo|kz#{n vKyFG7!/Ç9Oح'#Y\qqR>M#WǡoMw:Gy~A~dWkح˪R;d:M\hƱ.g\83?.cןvN#C7o۳rO俜r)3es,pNt_GV~xO꽓Ie==4߭:J~`8gO?z\q{z_|VSN |X ӏM=yo_;7Sڵ~Q<~_r? [ܣ#;㱕Nv@p+P\Ry󫦫vL7ӮdN|`K)'7Ao$vjo}Oy 7@<%LIy='_v6=yp֏g#xRwz/In]bUq|w7nr?:>Խp OA8=[ܻ%>Ł~]y+{yKG~GY\㐥ᣋoWg$%G|dߣ(_𦁯-s7o?oǹ+{Ho|@8ƿhzCG:L>]}T>%tކ|#rrųoMN>_{\xq!g@9h'~zC|KtѾFPRϖqG7dƱvkIK}|9=X߸ƕI?+;CxWR97s!tI㵤_֐7ͻm_?~[ ̿|"ٸIcO>:G!/q;0I=o>'khg"OokOrG4\ isٜ#3y_g]86^E~xF^ZA_z~=)^v)=!t\ǎB|{ kKN%?z5 ]Mџ)$j;ֳBq|y{UO~8_3𖮷<'}f[azq{vl$s0|P[l|1{IN֝8|Fgᗻ?t;݉=̙ڏ'vQnۺvR y܇77hZ{#aR\rNs/s)+ /X:_39u/&=*ǧ1_X>%oc_<ćO+,3,|vGu'?6 ɟreڌ<*sA~^WޞW~ud4#OcJ{s~8\:sAεg㷕:Ư3? _,.>]3G#]p|wS.z5 h8ױ;S^;̓0ΓoG䐏tVw_DF/Ɵ{wn2q_=jW=/9Z%x6NaEoBM۞y;A"u\>o[7~ƋM=M@'pU>q'lk"K7uw{".L8><)8്a_^x\y /e_?+3{S.8u]w8);ç7s25nƱ~_xv{Ovrv9u=vJs_pYzWsN*I7+=}R/'??/v3/O胴w8yoKI/^77J_i7bi5^zҎط|GD{!gK?8vs+ PzO;O'?~x^v-_Jف‡Of^=`Ic?qcK:7v͔^St|;!v7^V1O;~u7>{' ]ӳ9񷧟~=Էql뜏|_σvҿ G'ߠvVn {]7.L#~X3zHz-y{`'{3g)>zgHǜ䠭ÅrJe|̏=z)s}#g=k'JOV}/f 2{K/랣ʙ;cɵ ~l.&/qLq%SytNc!/%9!pM:+M='b_o~O>Ws9OSIwbW:vh<1}p~8=+D~';7wn97ѻ7:B7[r#rsv%~vC3=8)NڑG3[H;9i%V7C-^~_La:_|iG;wj|3yK1g~"տ%8{3~CCaO8y39ބgtC3uȟsŧ89}?Go} fȣ~g<X8>~|/I o_['ڇKߙgqJ{r}4ô'ۿW'=W;吷럘!կeȏwΌ,έ~RiWnMOܸKqp8)ep_٬vD_'ӽ8vw坌}B@>υw;z*xa? l8'])^|gC?k/uy+e/(?|W23'H]]kCʯӦx*ϏPk ^] RS9{s ^vd\_pet=ǖٛ?Oůq+RwNL;|t3󂽼xφ<?3X< Lo2I9iywryc7?|NO;'>|ڏ$~f_f="nM[%5>i!%ψ;i>g^~oN^O>4~~sotϞoa|r,'<oo'с1?syۿӞkfݽ&L?^wDEGސţe?> ׾Vڇo3~|޿(/ﵞUѤfϚyN;GME۫9K.f@>zYaDB~j\Kkr˧\[Nhg_Үq~?:i cwT|G?Scʻ~_{/{#| =>|=I݌Gʅ^ḞӦyϾ<EoB&N;Œq/:ǥuwz_X~/r'xo'R9/;q |/׾` '7|izB we-'aG߾4U)35!m g/Mѿ[SVXkusH;վ!KW*ƇsF!Ƴ˳nڙWrd⃔\ r_7=ES7 .Io!J 9PSPzq zkz~nק;izW8i+>p]~ow_:T<ϋ❤=Gt_nM }[ozS;8㍇|{}sDvG`_/v z|ҷ'x\W'/~8Wze)Џ5\]\ ",{w8[q֏K}t1'iwVrサ|ߎ73>,W1zw~*?ל)N~͏m.!_D^sNC{pPvtGs?5_.Nwf$ٿF?Lr%?z?:|־]M?(v?9)>jKnn츾/@.9}jx.ğo\cSiB=wGquRE9 _Ŏ5qɯ 'n]M9?e2iӓ=mCO6nۻzf?yf>ّ՗x/cr*co;iW£~%ϳ+>zg_?{T~'W3YS|)= ;}EBK'V9{Ku{>/9C7>9gW6#Oиi\ؕ"~?)~G4c_^!~Oy5 Nԃo{s:̎#Y7~WI;~_5Տ8wS^E^;Sj܉w3m8z]K{p?|];86 =yCeS?5AO`2nFqn{Cf'g^$>Eü ~>kƙoWâq\ڇo=:\[Sz݁`Otp㱟99/腏cޘv>ԗO?GMz3p";!} M=K-oMYgg~YR83%;%q%_$Sg-νg,!_[Q:2^)t4ħc;0>:^9E?&nvwأ6Yٷw6a1&_'*6&>{| _JXK'"7)wgdzqRM;ӟKiokq)ne/ n6M{OLw_\~38HJb?>㈟n|W1b=u͗}y콻)e_CW Nyށ>@7!uݿ$|A{??8IQfיIoN]w/j¾Ŀ]Ove\w@O Gћl' ϝc<8^<7~Q/ygo+B??d{!o}wo]i>*HWWW/~`: 2 UgqkRz;8O {Y7))PIF~I >~"5uxڑK{jxfqiG?b|/5܌uO i9]?u?k(da%_B&kKZΏ޷jy6Nz3O2o=K]g[߸g<8'v):zG?x0]X|^ }^7z~w=OL9MJU.TuG#^26ʃNE?o]~^W \j5ɔN\s37nZ`I,JҜgaL{w=S{&t7wsX)Iכz¸)5KOD΢gnwӯBiwVƅ53'8N{W%OÇԿDML;kYsܵ ^?k'uC$ۇLv),K?<#'R|>/"ܲ.9ЅA9/gρ/f7o%pc3<8(6DN_jݑOMRރ!ů8'+.v{r,Orjp\?{Dt^}6i7"9X>|h8rZ/㋑ ^6ίv^~$v>;Cv2kw8Asvs\?<fR~p{ދ鑜p}n7=OݗxI{ A_naO6N/X\}"E\z~RH }8-AԿ'~?J;o&ZX0\8;<ߢB{U gL;sjO/-C}'o.s#a4||C=׹N^Gw=ոzh\ٻgWp i㰥I{Oϐݵ8?{Gv^什vyy/ oG[duןIU:ƣLh7?N:qo|$|"9[?윜W|gOO"iq?6/úו Z>+/1b" 鼶[3'G;sR֐?ߋn!9/W*zX;RzE|γsfOy@SqX%8-C3I9%|:n;ܗ}.>_I[Ip޳ M 9s`Qiȯ/|oAUd`?'av=惼%uŏH1>KCzOE~Ww~f}.W,?{!gN=p8r!<{anv8JO/_ &Lj{=^\ mOjAHˣ?GN5rc kgnH;:x%7'^(_@<;jyNo򳿇'ZE\lRVrne}K?{k:_ _c憔^P{/ NP;3gx&Y2KV?<_t?=v?'sOn{P'VW/˺claEo'O+P'A{18: 7~`ׇQoZ>ũq9}}O)qi<ɬcrAI#qRy(z?wv0aO׸8xqEޓ?/Ky/zOb{Uk=8Y?L=޹7{/Qҟɇ:O}K{߈w._<[ .<=zw[]䙜{; 6>Wo=TW$u~ɽgiޑ}}I?j\E;|79OoM=D?.b.i/]{zXo&>NƟ>?\Էo'|&#3o}_gG`i?vWK>ܫy=O}}/z!e_OdQ{> ,O?NHӮ:-~1晾QJHOW|w..,'~o֟&4Iډ?' =Niи)~)wigǏg6Ɂqy.p&h94~_>y/N%2gi>q"7z^ԃ]M9׳>/*6O?3(< `lw<ƍIޮ<9qƇ?qCv5q't8g|e΄]UƁz^rŁ9{G"?yċ]PoBz:vHSzӔk^OCw7,1dmHmlGEH{O}pE<'t^i#/9Wڴ݋][ N 3~KőR_>YzL{?G{_q')y{mR~e8'g?|7^IUC>îON~>K3ߗ/Ono?:l|S#Y}~F|B_Rtwzy)=J<繴~~RS>xuIoiO+O<7!g@_ᙍR|WiRM?RA_D{>:e`o缞Jgq{ϋ-~Opc;g>jΐ'9.8O/GfI&||Lm\<ˬ\W8OYx~>rcC's:go\|^ܓ= k=kOiץ9?'|ǞeDgmݐ/L|5ifR~o|=)?뒜Eh}jV~`Gv>GG.0D8{S^ϡt߽#d|F\rs}DW]KNp,?z6}F;789)h}b?ςJLn[~|uj<) ˮaeYq|}^z1i⤵JZ4ux2nJ q_ czҞ#v;弯~JNg5~q~7?dԾɹgx<6RKO$Bw!%rOo8ۄ8p܋ivFʹk-z~it9g?8gK{G33_Pyi2Os'oW/>)9oO[V֥L=|+&o ް|$g\g+JSdR _w^gS)FΡXAwCwإrOV;u~C/YK|gזyݸ CW8t[W%%Y?ef61{qki}2~`B:?N%wG_Aٝk_s;ߋ{i2n9a=8v|j=^g31? o};{Oz_,%y_d߯R A}w9~oxvT589 S˙u`c9#tlf~{oϝ!m<!ͽCq^ȸ_un܍k>nry5I<>P$|\O~yn|H}^v˜\?75\?0w|׵] hܬ723C?yxx#kn `0q9wrXS|DFH{'q-9@`n7nLk>zU~~̹h&!}oHKڇrNOg~I뇔R8Q3:/-~Am';/z^yMeLp?N<|3#K{ediIMNڋW~GɺzHɗyRqr ?.'kb%A%jrwh멗_͌ ٍ{]IK7_<^OeE >;n#=iK37zmgހ=|R~Fx.=_c>o3V-&'g]˷]ia;jG,;6,ыK\a3YpI /d297M҃ WO.cߍSÙ{.\̔g#'*:E0坎?_3=,}:G; θ?΍O~+iw{Oipײ~f9䩝9ϮOùUr{7v~c!/7'_{Վ4oo iU$_{-|<8y& ;| ]?r6݌K}/o䴇(}~_Bg*(B&)M{{o&&y8;Vܻx7.kޛ'tF\=׽zCϘS%|H9Jp~} ~cXosSf>kcWdž_ftןސΥogִ݊]> 3nڍ~'>yKg\?$A^O~$|sGπ^]#>\34(Wgz-1_=W2AKr~f~=3+v;k/94^;D}#=0䃗w֐qm|c-9*&ʿsouyxG~}k=;/{ZF )7'o#&m'#9/~V ]z>}~y0o>羸%{o==I/Oh|?"/Xܥap)z.k_{pܟ0Ͻ)wWeoyނ?f'O={ iv|:of6~~oH9|U78F십?q%ģowv =v W^㋧}{qOo{ /KNo#^×񹍯Vvϓynߴo9nϥܔC_cHzV/#w4\ϫ_s?B_y#xx)zb/%~Eq⬓=~oG+vp |G^/.#/fg~+}>zx:CE49zrZ7irba w~Bo { r]q}M'߳p?]f/MNGzCKKp3~}찍-z6ߨuAz$>9uAp?gswHuu6\qJzo >*IKG?nh-cciq y* |])~"goҮ97ꏜ+ ׁGn@u%Q俓r.]͸g}hH=ܜݥ-?a/u~t= O&/PP8<Mճ&_=c%5׎9߱G"#q0[_i{{sDzW6>oKq$ɿO Fw{yʥoӔG>{y\E|}țC.xDGwx@a噽}[ΐGF_˳{VoH9rEKv8iNֻH}`?xԋx6vk?aC]ދ>gsDހkE8'1Wyw58;kI3si?>Bs ?<%Wby^ŧ_Sܣ^Eƍ\^?񁯺|yw3n~݁#(>۾${3N`IQYOTH>?M?۽76雧t>o/,9w?oY}ǖz+\&~+Iu#CW7?ߣwN7q,;o*Kn=GW.n;t{yžf_.**gPڏSKю|<_+<e~1_/:7q{?!:k剹!u?+u~5tFa^f=yo!įmt|5MMC/ttMt;H gw' n{v d+~+L;)߹µCNtr+ƴ>xÏ{RRi<|_@=L??\~i/q%j'/n8/k[LG. 8[)Co] |8Mz+r3F;%R gq{{v&' :'|!x:41 |b6+[ca]Nғ;g 7sN['=׳>K0􆞥9Sr~E{ ;{5JŌw{i߈KCT۩฽O/va,͔{#Q8ʹ3{Yn~/1qz3P?;,>'<}U2~;<;4~ -/3{p~C6?qCNz747/?>#6^_{(ߛ7y/q'{D/v`<ٷcL9|]/{P7̾P?7EƽKA=wz9>Cigi3ѽ>z1'$ ǧ?>d^#As;~r\"{ϲ7q蓜/uq;?|q};ͬ#<{{C;}vk'çK=×s=89'ؑ¯mvv;HGsn W"p ߟRdo<獳.jxuDޠNљ+q79rq~\j[og6tg./'?tz/;+䣟S߅FM_ӹ.Dþg=W?ڴk?|Oު_s#|-{Ev ƝI9ųSOÔCCw8=FS:|1r{O@R|/>XNuNwt\;ODer Oe^{΃ڣ:GS.:sz_^>^|?,\!e✩>2_O仴ۼ7~ 3.yza7=Hv9w$_M>MkwzMz|C3|K}%;Ϭ#zwFnsIO wO:zWP E_REi|cϾ "^W\ki/y߾{;7!>grLR{ROG/{6;ݙ`}vN?/v@zx?A[+MRiNޗ|W_zΉ`xwwH c⵩w6{O>0YG{ٸ5Wq-ndW[O9ɾlHvi ]fYKyk= Aȿy) k7~W m`oC?B77rp)';v@NEq.}]2;8ǩ>h5{Cq߁9Ӿ >{ySN{{奄imoʫ\8kꯞ+8ݏi8/D#i7m=ON?짖Bo5S}FO:>4֭u߼;/:>YJo~'Nzg\.Cjx kq6ƍ))}oHyΧ}?z2α&rٝYsNp@~HMdw?ڸ+81.(P?6!=] lGsn_=/iߜz:$! W4_k/~Ni7y )9 kΗi?woMY2si/F,>rN$W0"qVn ):Fn(_SS;ӿgw~VN}+/;|s̓!Aʃ;>ɼI3No3~R ^vLA oZO2oU.soGq~|h*>zMJ|_k_~Ǎrh\?ǹ}wWγs\n~?EJ>}[A/#7#Wc8{SƼw Io__ ?? {lW'4| ]gU\K?{>{p;˙Ozv^#A=~>i}Ⱦ,<ۼo7<^ 2?I|u#x|s7anNѽͩ|K?{jW|Gٷɜ?{p{k~?Aka=?v./$>EvhX|UδAEbR%W'O8k7af\eݛu[~'7+]3'{mwm}({K~kq9 h;9O#ZOzC> "vi_G^\>]p;[X֐[''q>8|C'N?L|WO9#)ߌ/OֽzN׏>8YTzw$3EfK.˳xa=N?7AIȡ7>וXaӍߘ|{F n_Gkz&M@e/|1{6|Ezc:d+~θ{hڇ_Z7CI7Gxo.ilM9'9r?:>ryqC/~G*f~#[۷޳z;_;KOC/ոqΒgdd (yA%E4>Lznw'߿wl_N2ύcv\ ?nuϚ|-aW 6^Y[mW`H̓g{5iq[yDߴvyk9o=yg.8&޾Ïggw6rTr+}p:1{77|EOGNe}УZ?V6vhp AW.F!B-zy|o|{3Sエ=d9Oړi+0S}׿)׵=/^:ESS3lsufjz Tp{t&x[:~,8x!ȥ*|Х~IY$mܰ|‡6>!E8MSO~‡ҏI=[Sq]=+o}9Y@+z*?37?wov*Ww9|=x&1{kpHg*/?Yw.> |p>u}|'Hv+O-_]9)t."nd;;c˹,.}%y#׺}Nw6>  pc OD+{Xد7$v'gqk{\ENſ||8 _ߣmKg~7?+=Rvķ:/y_ԏ.V~8_f4dv/iWq 3+1{ yPᴷqC'k~йOc|k''/7Wsi>Siڃ>[=58doq&3?®Yq^ 7.a{\͹!Zv5cY{p&zj/¾<,~vjG\.|dyI紛><H|z<>i?;(\|$np^K>ω=䬍īIjjRni$~qr'6E/OK;ko>⋫k?{2g:團xIüvmv޾|_~7 ,jgt(=gȾ(p=Ɨ9R>]OK.88+=):<2=zSk/v_rk~M)^\z^;>)/pϜSky`LK‡فcx'妝Ω|}+?z֯s^~z|>#|Ł/~с/}9?Q^|{K%w rߟ|y?fqaܑӱiqtiԖQ[Gme~ԖQ[Gm9^#g_,̼867ޛó/fr^' Gq~=^'fZzbo?c~N^ڱWèyqt^Lc/-̏ =6cq<|&l{<|[3/[y0bs3-?*f_<ְKhac aϾxT>^x^c>Ntވ{ű^[|eYR?>{/ދ#86ڕ{/^)mӼx4{/; wvLmbqدGN2cbaac>9qd6DZ ;/y0bӰZF{ntI8<B/ǎM/=>yq/Fhő{qL)y39+v蓅2Ͼ8:bqы=b/[xűjƃ<=F|82StLA~]<~ǿ.?zD<BO^e_ow}U?/ʯzW}o_n]_5|*r?k.fields/man/0000755000176200001440000000000014467431135012303 5ustar liggesusersfields/man/fields-stuff.Rd0000644000176200001440000001113014275214115015153 0ustar liggesusers%# %# fields is a package for analysis of spatial data written for %# the R software environment. %# Copyright (C) 2022 Colorado School of Mines %# 1500 Illinois St., Golden, CO 80401 %# Contact: Douglas Nychka, douglasnychka@gmail.edu, %# %# This program is free software; you can redistribute it and/or modify %# it under the terms of the GNU General Public License as published by %# the Free Software Foundation; either version 2 of the License, or %# (at your option) any later version. %# This program is distributed in the hope that it will be useful, %# but WITHOUT ANY WARRANTY; without even the implied warranty of %# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the %# GNU General Public License for more details. %# %# You should have received a copy of the GNU General Public License %# along with the R software environment if not, write to the Free Software %# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA %# or see http://www.r-project.org/Licenses/GPL-2 %##END HEADER %##END HEADER \name{fields-stuff} \alias{fields.duplicated.matrix} \alias{fields.mkpoly} \alias{fields.derivative.poly} \alias{fields.evlpoly} \alias{fields.evlpoly2} \title{Fields supporting functions} \description{ Some supporting functions that are internal to fields top level methods. Variants of these might be found in the R base but these have been written for cleaner code or efficiency. } \usage{ fields.duplicated.matrix(mat, digits = 8) fields.mkpoly(x, m = 2, tag = "term") fields.derivative.poly(x, m,dcoef) fields.evlpoly( x, coef) fields.evlpoly2( x, coef, ptab) } \arguments{ \item{mat}{Arbitrary matrix for examining rows} \item{digits}{Number of significant digits to use for comparing elements to determine duplciate values. } \item{x}{Arbitrary matrix where rows are components of a multidimensional vector} \item{m}{ The null space degree -- results in a polynomial of degree (m-1) } \item{dcoef}{ Coefficients of a multidimensional polynomial} \item{coef}{Polynomial coefficients.} \item{ptab}{Table of powers of different polnomial terms.} \item{tag}{ \code{mkpoly} fills in as columns names the higher order terms of the polynomial terms. The tag is the text string prefix for thes column names and the powers of the individual variables are appended. Default is just "terms".} } \details{ \code{fields.duplicated} finds duplicate rows in a matrix. The digits arguments is the number of digits that are considered in the comparison. The returned value is an array of integers from 1:M where M is the number of unique rows and duplicate rows are referenced in the same order that they appear as the rows of \code{mat}. \code{fields.mkpoly} computes the complete matrix of all monomial terms up to degree (m-1). Each row of \code{x} is are the componets of a vector. (The fields function mkpoly returns the number of these terms.) In 2 dimensions with m=3 there 6 polynomial terms up to quadratic ( 3-1 =2) order and will be returned as the matrix: cbind( 1 , x[,1], x[,2], x[,1]**2, x[,1]*x[,2], x[,2]**2 ) This function is used for the fixed effects polynomial or spatial drift used in spatial estimating functions Krig, Tps and mKrig. The matrix ptab is a table of the powers in each term for each variable and is included as an attribute to the matrix returned by this function. See the \code{attr} function for extracting an attribute from an object. \code{ptab} for the example above is \preformatted{ [,1] [,2] [1,] 0 0 [2,] 1 0 [3,] 0 1 [4,] 2 0 [5,] 1 1 [6,] 0 2 } This information is used in finding derivatives of the polynomial is also used to create column names for the terms that are of higher order than linear. \code{fields.deriviative.poly} finds the partial derivative matrix of a multidimensional polynomial of degree (m-1) at different vector values and with coefficients \code{dcoef}. This function has been orgainzed to be a clean utility for the predicting the derivative of the estimated function from Krig or mKrig. Within the fields context the polynomial itself would be evaluated as fields.mkpoly( x,m)\%*\%dcoef. If x has d columns ( also the dimension of the polynomial) and n rows the partial derivatives of this polynomial at the locations x can be organized in a nXd matrix. This is the object returned by ths function. \code{evlpoly} and \code{evlpoly2} are FORTRAN based functions for evaluating univariate polynomials and multivariate polynomials. The table of powers (ptab) needed for evlpoly2 is the same format as that returned my the fields.mkpoly function. } \author{Doug Nychka} \keyword{spatial} fields/man/yline.Rd0000644000176200001440000000301714275214115013705 0ustar liggesusers%# %# fields is a package for analysis of spatial data written for %# the R software environment. %# Copyright (C) 2022 Colorado School of Mines %# 1500 Illinois St., Golden, CO 80401 %# Contact: Douglas Nychka, douglasnychka@gmail.edu, %# %# This program is free software; you can redistribute it and/or modify %# it under the terms of the GNU General Public License as published by %# the Free Software Foundation; either version 2 of the License, or %# (at your option) any later version. %# This program is distributed in the hope that it will be useful, %# but WITHOUT ANY WARRANTY; without even the implied warranty of %# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the %# GNU General Public License for more details. %# %# You should have received a copy of the GNU General Public License %# along with the R software environment if not, write to the Free Software %# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA %# or see http://www.r-project.org/Licenses/GPL-2 %##END HEADER %##END HEADER \name{yline} \alias{yline} \title{ Draw horizontal lines } \description{ Adds horizontal lines in the plot region. } \usage{ yline(y, ...) } \arguments{ \item{y}{ Values on y axis specifying location of vertical lines. } \item{\dots}{ Any ploting options for abline. } } \seealso{ xline, abline } \examples{ world( col=3) yline( seq( -80,80,10),col=4, lty=2) xline( seq( -180,180,10),col=4,lty=2) yline( 0, lwd=2, col=4) } \keyword{aplot} % docclass is function % Converted by Sd2Rd version 1.21. fields/man/compactToMat.Rd0000644000176200001440000001014514275214115015160 0ustar liggesusers%# %# fields is a package for analysis of spatial data written for %# the R software environment. %# Copyright (C) 2022 Colorado School of Mines %# 1500 Illinois St., Golden, CO 80401 %# Contact: Douglas Nychka, douglasnychka@gmail.edu, %# %# This program is free software; you can redistribute it and/or modify %# it under the terms of the GNU General Public License as published by %# the Free Software Foundation; either version 2 of the License, or %# (at your option) any later version. %# This program is distributed in the hope that it will be useful, %# but WITHOUT ANY WARRANTY; without even the implied warranty of %# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the %# GNU General Public License for more details. %# %# You should have received a copy of the GNU General Public License %# along with the R software environment if not, write to the Free Software %# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA %# or see http://www.r-project.org/Licenses/GPL-2 %##END HEADER %##END HEADER \name{compactToMat} \alias{compactToMat} %- Also NEED an '\alias' for EACH other topic documented here. \title{ %% ~~function to do ... ~~ Convert Matrix from Compact Vector to Standard Form } \description{ %% ~~ A concise (1-5 lines) description of what the function does. ~~ \code{compactToMat} transforms a matrix from compact, vector form to a standard matrix. Only symmetric matrices can be stored in this form, since a compact matrix is stored as a vector with elements representing the upper triangle of the matrix. This function assumes the vector does not contain diagonal elements of the matrix. An example of a matrix stored in compact form is any matrix generated from the \code{rdist} function with \code{compact=TRUE}. } \usage{ compactToMat(compactMat, diagVal=0, lower.tri=FALSE, upper.tri=TRUE) } %- maybe also 'usage' for other objects documented here. \arguments{ \item{compactMat}{ %% ~~Describe \code{compactMat} here~~ A symmetric matrix stored as a vector containing elements for the lower-triangular portion of the true matrix (and none of the diagonal elements), as returned by \code{rdist} with \code{compact=TRUE}. } \item{diagVal}{ %% ~~Describe \code{diagVal} here~~ A number to put in the diagonal entries of the output matrix. } \item{lower.tri}{ %% ~~Describe \code{diagVal} here~~ Whether or not to fill in the upper triangle of the output matrix } \item{upper.tri}{ %% ~~Describe \code{diagVal} here~~ Whether or not to fill in the lower triangle of the output matrix } } \value{ %% ~Describe the value returned %% If it is a LIST, use %% \item{comp1 }{Description of 'comp1'} %% \item{comp2 }{Description of 'comp2'} %% ... The standard form matrix represented by the input compact matrix } \author{ %% ~~who you are~~ John Paige } %% ~Make other sections like Warning with \section{Warning }{....} ~ \seealso{ %% ~~objects to See Also as \code{\link{help}}, ~~~ \code{\link{rdist}}, \code{link{dist}} } \examples{ ################ #Calculate distance matrix from compact form: ################ #make a distance matrix distOut = rdist(1:5, compact=TRUE) print(distOut) #note that distOut is in compact form: print(c(distOut)) #convert to standard matrix form: distMat = compactToMat(distOut) ################ #fast computation of covariance matrix: ################ #generate 5 random points on [0,1]x[0,1] square x = matrix(runif(10), nrow=5) #get compact distance matrix distOut = rdist(x, compact=TRUE) #evaluate Exponential covariance with range=1. Note that #Covariance function is only evaluated over upper triangle #so time is saved. diagVal = Exponential(0, range=1) compactCovMat = Exponential(distOut, range=1) upperCovMat = compactToMat(compactCovMat, diagVal) lowerCovMat = compactToMat(compactCovMat, diagVal, lower.tri=TRUE, upper.tri=FALSE) fullCovMat = compactToMat(compactCovMat, diagVal, lower.tri=TRUE, upper.tri=TRUE) compactCovMat lowerCovMat upperCovMat fullCovMat } % Add one or more standard keywords, see file 'KEYWORDS' in the % R documentation directory. \keyword{ compact } \keyword{ matrix }% __ONLY ONE__ keyword per line fields/man/CO2.Rd0000644000176200001440000000704414275214115013154 0ustar liggesusers%# %# fields is a package for analysis of spatial data written for %# the R software environment. %# Copyright (C) 2022 Colorado School of Mines %# 1500 Illinois St., Golden, CO 80401 %# Contact: Douglas Nychka, douglasnychka@gmail.edu, %# %# This program is free software; you can redistribute it and/or modify %# it under the terms of the GNU General Public License as published by %# the Free Software Foundation; either version 2 of the License, or %# (at your option) any later version. %# This program is distributed in the hope that it will be useful, %# but WITHOUT ANY WARRANTY; without even the implied warranty of %# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the %# GNU General Public License for more details. %# %# You should have received a copy of the GNU General Public License %# along with the R software environment if not, write to the Free Software %# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA %# or see http://www.r-project.org/Licenses/GPL-2 %##END HEADER %##END HEADER \name{CO2} \alias{CO2} \alias{CO2.true} \docType{data} \title{Simulated global CO2 observations} \description{ This is an example of moderately large spatial data set and consists of simulated CO2 concentrations that are irregularly sampled from a lon/lat grid. Also included is the complete CO2 field (CO2.true) used to generate the synthetic observations.} \usage{data(CO2) } \format{ The format of \code{CO2} is a list with two components: \itemize{ \item lon.lat: 26633x2 matrix of the longitude/latitude locations. These are a subset of a larger lon/lat grid (see example below). \item y: 26633 CO2 concentrations in parts per million. } The format of \code{CO2.true} is a list in "image" format with components: \itemize{ \item x longitude grid values. \item y latitude grid values. \item z an image matrix with CO2 concentration in parts per million \item mask a logical image that indicates with grid locations were selected for the synthetic data set \code{CO2}. } } \details{ This data was generously provided by Dorit Hammerling and Randy Kawa as a test example for the spatial analysis of remotely sensed (i.e. satellite) and irregular observations. The synthetic data is based on a true CO2 field simulated from a geophysical, numerical model. } \examples{ \dontrun{ data(CO2) # # A quick look at the observations with world map quilt.plot( CO2$lon.lat, CO2$y) world( add=TRUE) # Note high concentrations in Borneo (biomass burning), Amazonia and # ... Michigan (???). # spatial smoothing using the wendland compactly supported covariance # see help( fastTps) for details # First smooth using locations and Euclidean distances # note taper is in units of degrees out<-fastTps( CO2$lon.lat, CO2$y, aRange=4, lambda=2.0) #summary of fit note about 7300 degrees of freedom # associated with fitted surface print( out) # image plot on a grid (this takes a while) surface( out, type="I", nx=300, ny=150) # smooth with respect to great circle distance out2<-fastTps( CO2$lon.lat, CO2$y, lon.lat=TRUE,lambda=1.5, aRange=4*68) print(out2) #surface( out2, type="I", nx=300, ny=150) # these data are actually subsampled from a grid. # create the image object that holds the data # temp<- matrix( NA, ncol=ncol(CO2.true$z), nrow=nrow(CO2.true$z)) temp[ CO2.true$mask] <- CO2$y # look at gridded object. image.plot(CO2.true$x,CO2.true$y, temp) # to predict _exactly_ on this grid for the second fit; # (this takes a while) look<- predictSurface( out2, list( x=CO2.true$x, y=CO2.true$y) ) image.plot(look) } } \keyword{datasets} fields/man/vgram.Rd0000644000176200001440000001512114342516365013707 0ustar liggesusers%# %# fields is a package for analysis of spatial data written for %# the R software environment. %# Copyright (C) 2022 Colorado School of Mines %# 1500 Illinois St., Golden, CO 80401 %# Contact: Douglas Nychka, douglasnychka@gmail.edu, %# %# This program is free software; you can redistribute it and/or modify %# it under the terms of the GNU General Public License as published by %# the Free Software Foundation; either version 2 of the License, or %# (at your option) any later version. %# This program is distributed in the hope that it will be useful, %# but WITHOUT ANY WARRANTY; without even the implied warranty of %# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the %# GNU General Public License for more details. %# %# You should have received a copy of the GNU General Public License %# along with the R software environment if not, write to the Free Software %# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA %# or see http://www.r-project.org/Licenses/GPL-2 %##END HEADER %##END HEADER \name{vgram} \alias{vgram} \alias{crossCoVGram} \alias{plot.vgram} \alias{boxplotVGram} \alias{getVGMean} \title{ Traditional or robust variogram methods for spatial data } \description{ \code{vgram} computes pairwise squared differences as a function of distance. Returns an S3 object of class "vgram" with either raw values or statistics from binning. \code{crossCoVGram} is the same as \code{vgram} but differences are taken across different variables rather than the same variable. \code{plot.vgram} and \code{boxplotVGram} create lineplots and boxplots of vgram objects output by the \code{vgram} function. \code{boxplotVGram} plots the base R boxplot function, and plots estimates of the mean over the boxplot. The \code{getVGMean} function returns the bin centers and means of the \code{vgram} object based on the bin breaks provided by the user. } \usage{ vgram(loc, y, id = NULL, d = NULL, lon.lat = FALSE, dmax = NULL, N = NULL, breaks = NULL, prettyBins = FALSE, type=c("variogram", "covariogram", "correlogram")) crossCoVGram(loc1, loc2, y1, y2, id = NULL, d = NULL, lon.lat = FALSE, dmax = NULL, N = NULL, breaks = NULL, type=c("cross-covariogram", "cross-correlogram"), prettyBins = FALSE) boxplotVGram(x, N=10, breaks = pretty(x$d, N, eps.correct = 1), plot=TRUE, plot.args, ...) \method{plot}{vgram}(x, N=10, breaks = pretty(x$d, N, eps.correct = 1), add=FALSE, ...) getVGMean(x, N = 10, breaks = pretty(x$d, N, eps.correct = 1)) } \arguments{ \item{loc}{ Matrix where each row is the coordinates of an observed point of the field } \item{y}{ Value of the field at locations } \item{loc1}{ Matrix where each row is the coordinates of an observed point of field 1 } \item{loc2}{ Matrix where each row is the coordinates of an observed point of field 2 } \item{y1}{ Value of field 1 at locations } \item{y2}{ Value of field 2 at locations } \item{id}{ A 2 column matrix that specifies which variogram differnces to find. If omitted all possible pairing are found. This can used if the data has an additional covariate that determines proximity, for example a time window. } \item{d}{ Distances among pairs indexed by id. If not included distances from from directly from loc. } \item{lon.lat }{ If true, locations are assumed to be longitudes and latitudes and distances found are great circle distances (in miles see \link{rdist.earth}). Default is FALSE. } \item{dmax}{ Maximum distance to compute variogram. } \item{N}{ Number of bins to use. The break points are found by the \code{pretty} function and so ther may not be exactly N bins. Specify the breaks explicity if you want excalty N bins. } \item{breaks}{ Bin boundaries for binning variogram values. Need not be equally spaced but must be ordered. } \item{x}{ An object of class "vgram" (an object returned by \code{vgram}) } \item{add}{ If \code{TRUE}, adds empirical variogram lineplot to current plot. Otherwise creates new plot with empirical variogram lineplot. } \item{plot}{ If \code{TRUE}, creates a plot, otherwise returns variogram statistics output by \code{bplot.xy}. } \item{plot.args}{ Additional arguments to be passed to \code{plot.vgram}. } \item{prettyBins}{If FALSE creates exactly N-1 bins. If TRUE you are at the mercy of giving N to the pretty function! } \item{type}{ One of "variogram", "covariogram", "correlogram", "cross-covariogram", and "cross-correlogram". \code{vgram} supports the first three of these and \code{crossCoVGram} supports the last two. } \item{...}{ Additional argument passed to \code{plot} for \code{plot.vgram} or to \code{bplot.xy} for \code{boxplotVGram}. } } \value{ \code{vgram} and \code{crossCoVGram} return a "vgram" object containing the following values: \item{vgram}{Variogram or covariogram values} \item{d}{Pairwise distances} \item{call}{Calling string} \item{stats}{Matrix of statistics for values in each bin. Rows are the summaries returned by the stats function or describe. If not either breaks or N arguments are not supplied then this component is not computed.} \item{centers}{Bin centers.} If \code{boxplotVGram} is called with \code{plot=FALSE}, it returns a list with the same components as returned by \code{bplot.xy} } \section{References}{ See any standard reference on spatial statistics. For example Cressie, Spatial Statistics } \author{John Paige, Doug Nychka} \seealso{ \link{vgram.matrix}, \link{bplot.xy}, \link{bplot} } \examples{ # # compute variogram for the midwest ozone field day 16 # (BTW this looks a bit strange!) # data( ozone2) good<- !is.na(ozone2$y[16,]) x<- ozone2$lon.lat[good,] y<- ozone2$y[16,good] look<-vgram( x,y, N=15, lon.lat=TRUE) # locations are in lon/lat so use right #distance # take a look: plot(look, pch=19) #lines(look$centers, look$stats["mean",], col=4) brk<- seq( 0, 250,, (25 + 1) ) # will give 25 bins. ## or some boxplot bin summaries boxplotVGram(look, breaks=brk, plot.args=list(type="o")) plot(look, add=TRUE, breaks=brk, col=4) # # compute equivalent covariogram, but leave out the boxplots # look<-vgram( x,y, N=15, lon.lat=TRUE, type="covariogram") plot(look, breaks=brk, col=4) # # compute equivalent cross-covariogram of the data with itself #(it should look almost exactly the same as the covariogram of #the original data, except with a few more points in the #smallest distance boxplot and points are double counted) # look = crossCoVGram(x, x, y, y, N=15, lon.lat=TRUE, type="cross-covariogram") plot(look, breaks=brk, col=4) } \keyword{spatial} % docclass is function % Converted by Sd2Rd version 1.21. fields/man/minitri.Rd0000644000176200001440000000320014275214115014232 0ustar liggesusers%# %# fields is a package for analysis of spatial data written for %# the R software environment. %# Copyright (C) 2022 Colorado School of Mines %# 1500 Illinois St., Golden, CO 80401 %# Contact: Douglas Nychka, douglasnychka@gmail.edu, %# %# This program is free software; you can redistribute it and/or modify %# it under the terms of the GNU General Public License as published by %# the Free Software Foundation; either version 2 of the License, or %# (at your option) any later version. %# This program is distributed in the hope that it will be useful, %# but WITHOUT ANY WARRANTY; without even the implied warranty of %# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the %# GNU General Public License for more details. %# %# You should have received a copy of the GNU General Public License %# along with the R software environment if not, write to the Free Software %# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA %# or see http://www.r-project.org/Licenses/GPL-2 %##END HEADER %##END HEADER \name{minitri} \alias{minitri} \title{ Mini triathlon results } \description{ Results from a mini triathlon sponsored by Bud Lite, held in Cary, NC, June 1990. Times are in minutes for the male 30-34 group. Man was it hot and humid! (DN) The events in order were swim: (1/2 mile) bike: (15 miles) run: (4 miles) This is a dataframe. Row names are the place within this age group based on total time. } \arguments{ \item{swim}{ swim times } \item{bike}{ bike times } \item{run}{ run times } } \keyword{datasets} % docclass is data % Converted by Sd2Rd version 1.21. fields/man/smooth.2d.Rd0000644000176200001440000001340714275214115014406 0ustar liggesusers%# %# fields is a package for analysis of spatial data written for %# the R software environment. %# Copyright (C) 2022 Colorado School of Mines %# 1500 Illinois St., Golden, CO 80401 %# Contact: Douglas Nychka, douglasnychka@gmail.edu, %# %# This program is free software; you can redistribute it and/or modify %# it under the terms of the GNU General Public License as published by %# the Free Software Foundation; either version 2 of the License, or %# (at your option) any later version. %# This program is distributed in the hope that it will be useful, %# but WITHOUT ANY WARRANTY; without even the implied warranty of %# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the %# GNU General Public License for more details. %# %# You should have received a copy of the GNU General Public License %# along with the R software environment if not, write to the Free Software %# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA %# or see http://www.r-project.org/Licenses/GPL-2 %##END HEADER %##END HEADER \name{smooth.2d} \alias{smooth.2d} \title{ Kernel smoother for irregular 2-d data } \description{ An approximate Nadaraya Watson kernel smoother is obtained by first discretizing the locations to a grid and then using convolutions to find and to apply the kernel weights. The main advantage of this function is a smoother that avoids explicit looping. } \usage{ smooth.2d(Y, ind = NULL, weight.obj = NULL, setup = FALSE, grid = NULL, x = NULL, nrow = 64, ncol = 64, surface = TRUE, cov.function = gauss.cov, Mwidth = NULL, Nwidth = NULL, ...) } \arguments{ \item{Y}{ A vector of data to be smoothed } \item{ind}{ Row and column indices that correspond to the locations of the data on regular grid. This is most useful when smoothing the same locations many times. (See also the x argument.) } \item{weight.obj }{ An object that has the FFT of the convolution kernel and other information ( i.e. the result from calling this with setup=TRUE). } \item{setup}{ If true creates a list that includes the FFT of the convolution kernel. In this case the function will return this list. Default is false. } \item{grid}{ A list with components x and y being equally spaced values that define the grid. Default are integers 1:nrow, 1:ncol. If x is given the ranges will be used to define the grid. } \item{x}{ Actual locations of the Y values. Not needed if ind is specified. } \item{nrow}{ Number of points in the horizontal (x) axis of the grid. Not needed if grid is specified the default is 64 } \item{ncol}{ Number of points in the vertical (y) axis of the grid. Not needed if grid list is specified the default is 64 } \item{surface}{ If true (the default) a surface object is returned suitable for use by image, persp or contour functions. If false then just the nrowXncol matrix of smoothed values is returned. } \item{cov.function}{ S function describing the kernel function. To be consistent with the other spatial function this is in the form of a covariance function. The only assumption is that this be stationary. Default is the (isotropic) Gaussian. } \item{Nwidth}{ The size of the padding regions of zeroes when computing the (exact) convolution of the kernel with the data. The most conservative values are 2*nrow and 2*ncol, the default. If the kernel has support of say 2L+1 grid points then the padding region need only be of size L+1. } \item{Mwidth}{ See Nwidth. } \item{\dots}{ Parameters that are passed to the smoothing kernel. ( e.g. the scale parameter aRange for the exponential or gaussian) } } \value{ Either a matrix of smoothed values or a surface object. The surface object also has a component 'ind' that gives the subscripts of the image matrix where the data is present. } \details{ The irregular locations are first discretized to a regular grid ( using as.image) then a 2d- FFT is used to compute a Nadaraya-Watson type kernel estimator. Here we take advantage of two features. The kernel estimator is a convolution and by padding the regular by zeroes where data is not obsevred one can sum the kernel over irregular sets of locations. A second convolutions to find the normalization of the kernel weights. The kernel function is specified by an function that should evaluate with the kernel for two matrices of locations. Assume that the kernel has the form: K( u-v) for two locations u and v. The function given as the argument to cov.function should have the call myfun( x1,x2) where x1 and x2 are matrices of 2-d locations if nrow(x1)=m and nrow( x2)=n then this function should return a mXn matrix where the (i,j) element is K( x1[i,]- x2[j,]). Optional arguments that are included in the ... arguments are passed to this function when it is used. The default kernel is the Gaussian and the argument aRange is the bandwidth. It is easy to write other other kernels, just use Exp.cov.simple as a template. } \examples{ # Normal kernel smooth of the precip data with bandwidth of .5 ( degree) # look<- smooth.2d( RMprecip$y, x=RMprecip$x, aRange=.25) # finer resolution used in computing the smooth look3<-smooth.2d( RMprecip$y, x=RMprecip$x, aRange=.25, nrow=256, ncol=256,Nwidth=32, Mwidth=32) # if the width arguments were omitted the padding would create a # 512X 512 matrix with the data filled in the upper 256X256 part. # with a bandwidth of .25 degrees the normal kernel is essentially zero # beyond 32 grid points from its center ( about 6 standard deviations) # # take a look: #set.panel(2,1) #image( look3, zlim=c(-8,12)) #points( RMprecip$x, pch=".") #image( look, zlim =c(-8,12)) #points( RMprecip$x, pch=".") # bandwidth changed to .25, exponential kernel look2<- smooth.2d( RMprecip$y, x=RMprecip$x, cov.function=Exp.cov,aRange=.25) # } \keyword{smooth} % docclass is function % Converted by Sd2Rd version 1.21. fields/man/spam2lz.Rd0000644000176200001440000000611514275214115014157 0ustar liggesusers%# %# fields is a package for analysis of spatial data written for %# the R software environment. %# Copyright (C) 2022 Colorado School of Mines %# 1500 Illinois St., Golden, CO 80401 %# Contact: Douglas Nychka, douglasnychka@gmail.edu, %# %# This program is free software; you can redistribute it and/or modify %# it under the terms of the GNU General Public License as published by %# the Free Software Foundation; either version 2 of the License, or %# (at your option) any later version. %# This program is distributed in the hope that it will be useful, %# but WITHOUT ANY WARRANTY; without even the implied warranty of %# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the %# GNU General Public License for more details. %# %# You should have received a copy of the GNU General Public License %# along with the R software environment if not, write to the Free Software %# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA %# or see http://www.r-project.org/Licenses/GPL-2 %##END HEADER %##END HEADER \name{spam2lz} \alias{spind2spam} \alias{spam2spind} \alias{spind2full} \alias{spam2full} \title{Conversion of formats for sparse matrices} \description{ Some supporting functions that are internal to fields top level methods. These are used to convert between the efficient but opaque format used by spam and more easily checked format based directly on the row and column indices of non zero elements. } \usage{ spind2full(obj) spam2full(obj) spind2spam(obj, add.zero.rows=TRUE) spam2spind(obj) } %- maybe also 'usage' for other objects documented here. \arguments{ \item{obj}{ Either a list with the sparse index components (spind) or an obj of class spam.} \item{add.zero.rows}{If TRUE an entire row is zero add a hard zero value to the element in the first column for each zero row. The spam format requires at least one element in each row to have an explicit value. It is OK if this value is zero but one must be specified. } } \details{ The differencee in formats is best illustarted by an example: A 4X5 sparse matrix: \preformatted{ [,1] [,2] [,3] [,4] [,5] [1,] 1 9 0 0 33 [2,] 0 0 0 26 34 [3,] 3 11 0 27 35 [4,] 0 12 20 0 36 } spind format is a list with components "ind", "ra" and "da" here is how the matrix above would be encoded: \preformatted{ ind I [1,] 1 1 [2,] 1 2 [3,] 1 5 [4,] 2 4 [5,] 2 5 [6,] 3 1 [7,] 3 2 [8,] 3 4 [9,] 3 5 [10,] 4 2 [11,] 4 3 [12,] 4 5 da [1] 4 5 ra [1] 1 9 33 26 34 3 11 27 35 12 20 36 } spam format is an S4 class with slot names "entries", "colindices", "rowpointers" and "dimension". entries [1] 1 9 33 26 34 3 11 27 35 12 20 36 colindices [1] 1 2 5 4 5 1 2 4 5 2 3 5 rowpointers [1] 1 4 6 10 13 dimension [1] 4 5 The row pointers are the position in the array of entries where the next row starts. NOTE: It is possible for the spind format to have a missing row of all zeroes but this not allowed in spam format and produces an error message. } \author{Doug Nychka} \seealso{as.spam} \keyword{spatial} % at least one, from doc/KEYWORDS fields/man/exp.cov.Rd0000644000176200001440000005466414453610512014164 0ustar liggesusers%# %# fields is a package for analysis of spatial data written for %# the R software environment. %# Copyright (C) 2022 Colorado School of Mines %# 1500 Illinois St., Golden, CO 80401 %# Contact: Douglas Nychka, douglasnychka@gmail.edu, %# %# This program is free software; you can redistribute it and/or modify %# it under the terms of the GNU General Public License as published by %# the Free Software Foundation; either version 2 of the License, or %# (at your option) any later version. %# This program is distributed in the hope that it will be useful, %# but WITHOUT ANY WARRANTY; without even the implied warranty of %# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the %# GNU General Public License for more details. %# %# You should have received a copy of the GNU General Public License %# along with the R software environment if not, write to the Free Software %# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA %# or see http://www.r-project.org/Licenses/GPL-2 %##END HEADER %##END HEADER \name{Covariance functions} \alias{Exp.cov} \alias{Exp.simple.cov} \alias{Rad.cov} \alias{Rad.simple.cov} \alias{stationary.cov} \alias{stationary.taper.cov} \alias{wendland.cov} \alias{cubic.cov} \alias{Tps.cov} \alias{Paciorek.cov} \title{ Exponential family, radial basis functions,cubic spline, compactly supported Wendland family, stationary covariances and non-stationary covariances. } \description{ Given two sets of locations these functions compute the cross covariance matrix for some covariance families. In addition these functions can take advantage of spareness, implement more efficient multiplcation of the cross covariance by a vector or matrix and also return a marginal variance to be consistent with calls by the Krig function. \code{stationary.cov} and \code{Exp.cov} have additional arguments for precomputed distance matrices and for calculating only the upper triangle and diagonal of the output covariance matrix to save time. Also, they support using the \code{rdist} function with \code{compact=TRUE} or input distance matrices in compact form, where only the upper triangle of the distance matrix is used to save time. Note: These functions have been been renamed from the previous fields functions using 'Exp' in place of 'exp' to avoid conflict with the generic exponential function (\code{exp(...)})in R. } \usage{ Exp.cov(x1, x2=NULL, aRange = 1, p=1, distMat = NA, C = NA, marginal = FALSE, onlyUpper=FALSE, theta=NULL) Exp.simple.cov(x1, x2, aRange =1, C=NA,marginal=FALSE, theta=NULL) Rad.cov(x1, x2, p = 1, m=NA, with.log = TRUE, with.constant = TRUE, C=NA,marginal=FALSE, derivative=0) cubic.cov(x1, x2, aRange = 1, C=NA, marginal=FALSE, theta=NULL) Rad.simple.cov(x1, x2, p=1, with.log = TRUE, with.constant = TRUE, C = NA, marginal=FALSE) stationary.cov(x1, x2=NULL, Covariance = "Exponential", Distance = "rdist", Dist.args = NULL, aRange = 1, V = NULL, C = NA, marginal = FALSE, derivative = 0, distMat = NA, onlyUpper = FALSE, theta=NULL, ...) stationary.taper.cov(x1, x2, Covariance="Exponential", Taper="Wendland", Dist.args=NULL, Taper.args=NULL, aRange=1.0,V=NULL, C=NA, marginal=FALSE, spam.format=TRUE,verbose=FALSE, theta=NULL,...) Tps.cov(x1, x2 = NULL, cardinalX, m=2, C = NA, aRange=NA, marginal = FALSE ) wendland.cov(x1, x2, aRange = 1, V=NULL, k = 2, C = NA, marginal =FALSE,Dist.args = list(method = "euclidean"), spam.format = TRUE, derivative = 0, verbose=FALSE, theta=NULL) Paciorek.cov(x1, x2 = NULL, Distance = "rdist", Dist.args = NULL, aRangeObj = 1, rhoObj = NULL, C = NA, marginal = FALSE, smoothness = .5) } \arguments{ \item{x1}{ Matrix of first set of locations where each row gives the coordinates of a particular point.} \item{x2}{ Matrix of second set of locations where each row gives the coordinatesof a particular point. If this is missing x1 is used. } \item{aRange}{ Range (or scale) parameter. This should be a scalar (use the V argument for other scaling options). Any distance calculated for a covariance function is divided by aRange before the covariance function is evaluated. For \code{Tps.cov} this argument is ignored.} \item{aRangeObj}{ A fit object that defines the Range (or scale) parameter for arbitray locations using the generic \code{predict} function.} \item{theta}{ Old version of the aRange parameter. If passed will be copied to aRange.} \item{ cardinalX}{Locations added to the thin plate plate radial function to make it positive definite (See Details below). } \item{C}{ A vector or matrix with the same rows as the number of rows of x2. If specified the covariance matrix will be multiplied by this vector/matrix.} \item{Covariance}{Character string that is the name of the covariance shape function for the distance between locations. Choices in fields are \code{Exponential}, \code{Matern}} \item{derivative}{ If nonzero evaluates the partials of the covariance function at locations x1. This must be used with the "C" option and is mainly called from within a predict function. The partial derivative is taken with respect to \code{x1}. } \item{Distance}{Character string that is the name of the distance function to use. Choices in fields are \code{rdist}, \code{rdist.earth}} \item{distMat}{ If the distance matrix between \code{x1} and \code{x2} has already been computed, it can be passed via this argument so it won't need to be recomputed. } \item{Dist.args}{ A list of optional arguments to pass to the Distance function.} \item{k}{The order of the Wendland covariance function. See help on Wendland.} \item{marginal}{If TRUE returns just the diagonal elements of the covariance matrix using the \code{x1} locations. In this case this is just 1.0. The marginal argument will trivial for this function is a required argument and capability for all covariance functions used with Krig.} \item{m}{For the radial basis function p = 2m-d, with d being the dimension of the locations, is the exponent applied to the distance between locations. (m is a common way of parametrizing this exponent.) Equivalently in Tps.cov the order of the spline. (See Details section below).} \item{onlyUpper}{ For internal use only, not meant to be set by the user. Automatically set to \code{TRUE} by \code{mKrigMLEJoint} or \code{mKrigMLEGrid} if \code{lambda.profile} is set to \code{TRUE}, but set to \code{FALSE} for the final parameter fit so output is compatible with rest of \code{fields}. If \code{TRUE}, only the upper triangle and diagonal of the covariance matrix is computed to save time (although if a non-compact distance matrix is used, the onlyUpper argument is set to FALSE). If \code{FALSE}, the entire covariance matrix is computed. In general, it should only be set to \code{TRUE} for \code{mKrigMLEJoint} and \code{mKrigMLEGrid}, and the default is set to \code{FALSE} so it is compatible with all of \code{fields}. } \item{p}{ Exponent in the exponential covariance family. p=1 gives an exponential and p=2 gives a Gaussian. Default is the exponential form. For the radial basis function this is the exponent applied to the distance between locations. } \item{rhoObj}{ A fit object that defines a component of the marginal variance (rho) parameter for arbitray locations using the generic \code{predict} function. Note that in fields the complete marginal variance is \code{sigma2*rho} where \code{sigma2} can be estimated in \code{spatialProcess}. } \item{smoothness}{For the Matern family the smoothnes of the process (aka "nu" in formulas). } \item{spam.format}{If TRUE returns matrix in sparse matrix format implemented in the spam package. If FALSE just returns a full matrix. } \item{Taper}{Character string that is the name of the taper function to use. Choices in fields are listed in help(taper).} \item{Taper.args}{ A list of optional arguments to pass to the Taper function. \code{aRange} should always be the name for the range (or scale) paremeter.} \item{V}{ A matrix that describes the inverse linear transformation of the coordinates before distances are found. In R code this transformation is: \code{x1 \%*\% t(solve(V))} Default is NULL, that is the transformation is just dividing distance by the scalar value \code{aRange}. See Details below. If one has a vector of "aRange's" that are the scaling for each coordinate then just express this as \code{V = diag(aRange)} in the call to this function.} \item{verbose}{If TRUE prints out some useful information for debugging.} \item{with.constant}{ If TRUE includes complicated constant for radial basis functions. See the function \code{radbad.constant} for more details. The default is TRUE, include the constant. Without the usual constant the lambda used here will differ by a constant from spline estimators ( e.g. cubic smoothing splines) that use the constant. Also a negative value for the constant may be necessary to make the radial basis positive definite as opposed to negative definite. } \item{with.log}{If TRUE include a log term for even dimensions. This is needed to be a thin plate spline of integer order. } \item{\dots}{ Any other arguments that will be passed to the covariance function. e.g. \code{smoothness} for the Matern.} } \value{ If the argument C is NULL the cross covariance matrix is returned. In general if nrow(x1)=m and nrow(x2)=n then the returned matrix will be mXn. Moreover, if x1 is equal to x2 then this is the covariance matrix for this set of locations. If C is a vector of length n, then returned value is the multiplication of the cross covariance matrix with this vector. } \details{ For purposes of illustration, the function \code{Exp.cov.simple} is provided in fields as a simple example and implements the R code discussed below. List this function out as a way to see the standard set of arguments that fields uses to define a covariance function. It can also serve as a template for creating new covariance functions for the \code{Krig} and \code{mKrig} functions. Also see the higher level function \code{stationary.cov} to mix and match different covariance shapes and distance functions. A common scaling for stationary covariances: If \code{x1} and \code{x2} are matrices where \code{nrow(x1)=m} and \code{nrow(x2)=n} then this function will return a mXn matrix where the (i,j) element is the covariance between the locations \code{x1[i,]} and \code{x2[j,]}. The exponential covariance function is computed as exp( -(D.ij)) where D.ij is a distance between \code{x1[i,]} and \code{x2[j,]} but having first been scaled by aRange. Specifically if \code{aRange} is a matrix to represent a linear transformation of the coordinates, then let \code{u= x1\%*\% t(solve( aRange))} and \code{v= x2\%*\% t(solve(aRange))}. Form the mXn distance matrix with elements: \code{D[i,j] = sqrt( sum( ( u[i,] - v[j,])**2 ) )}. and the cross covariance matrix is found by \code{exp(-D)}. The tapered form (ignoring scaling parameters) is a matrix with i,j entry \code{exp(-D[i,j])*T(D[i,j])}. With T being a positive definite tapering function that is also assumed to be zero beyond 1. Note that if aRange is a scalar then this defines an isotropic covariance function and the functional form is essentially \code{exp(-D/aRange)}. Implementation: The function \code{r.dist} is a useful FIELDS function that finds the cross Euclidean distance matrix (D defined above) for two sets of locations. Thus in compact R code we have exp(-rdist(u, v)) Note that this function must also support two other kinds of calls: If marginal is TRUE then just the diagonal elements are returned (in R code \code{diag( exp(-rdist(u,u)) )}). If C is passed then the returned value is \code{ exp(-rdist(u, v)) \%*\% C}. Some details on particular covariance functions: \describe{ \item{Stationary covariance \code{stationary.cov}:}{Here the computation is to apply the function Covariance to the distances found by the Distance function. For example \code{Exp.cov(x1,x2, aRange=MyTheta)} and \code{stationary.cov( x1,x2, aRange=MyTheta, Distance= "rdist", Covariance="Exponential")} are the same. This also the same as \code{stationary.cov( x1,x2, aRange=MyTheta, Distance= "rdist", Covariance="Matern",smoothness=.5)}. } \item{Radial basis functions (\code{Rad.cov}:}{The functional form is Constant* rdist(u, v)**p for odd dimensions and Constant* rdist(u,v)**p * log( rdist(u,v) ) For an m th order thin plate spline in d dimensions p= 2*m-d and must be positive. The constant, depending on m and d, is coded in the fields function \code{radbas.constant}. This form is only a generalized covariance function -- it is only positive definite when restricted to linear subspace. See \code{Rad.simple.cov} for a coding of the radial basis functions in R code.} \item{Tps.cov}{This covariance can be used in a standard "Kriging" computation to give a thin-plate spline (TPS). This is useful because one can use the high level function \code{spatialProcess} and supporting functions for the returned object, including conditional simulation. The standard computation for a TPS uses the radial basis functions as given in \code{Rad.cov} and uses a QR decomposition based a polynoimial matrix to reduce the dimension of the radial basis function and yield a positive definite matrix. This reduced matrix is then used in the regular compuations to find the spatial estimate. The function \code{Krig} and specifically \code{Tps} implements this algoritm. The interested reader should look at \code{Krig.engine.default} and specifically at the \code{TMatrix} polynomial matrix and resulting reduced positive definite matrix \code{tempM}. The difficulty with this approach is that is not amenable to taking advantage of sparsity in the covariance matrix. An alternative that is suggested by Grace Wahba in \emph{Spline models for observational data} is to augment the radial basis functions with a low rank set of functions based on a low order polynomial evaluated at a set of points. The set of locatios for this modifications are called \emph{cardinal point}s due the to property mentioned below. This is implemented in \code{Tps.cov} leading to a full rank (non-stationary!) covariance function. If the fixed part of the spatial model also includes this same order polynomial then the final result gives a TPS and is invariant to the choice of cardinal points. To streamline using this covariance when it isspecified in the \code{spatialProcess} function the cardinal points will choosen automaitcally based on the observation locations and the spline order, \code{m} using a space filling design. A simple example with fixed smoothing parameter, \code{lambda <- .1} may help \preformatted{ data( "ozone2") s<- ozone2$lon.lat y<- ozone2$y[16,] fitTps1<- spatialProcess( s,y, cov.function= "Tps.cov", lambda=.1) } and compare the results to the standard algorithm. \preformatted{ fitTps2<- Tps( s,y, scale.type ="unscaled", lambda=.1) stats( abs(fitTps2$fitted.values - fitTps1$fitted.values)) } Here the default choice for the order is 2 and in two dimensions implies a linear polynomial. The arguments filled in by default are shown below \preformatted{ fitTps1$args $cardinalX [,1] [,2] [1,] -85.289 40.981 [2,] -90.160 38.330 [3,] -91.229 43.812 attr(,"scaled:scale") [1] 1 1 attr(,"scaled:center") [1] 0 0 $aRange [1] NA fitTps1$mKrig.args [[1]] NULL $m [1] 2 $collapseFixedEffect [1] TRUE $find.trA [1] TRUE } \code{ cardinalX} are the cardinal points chosen using a space filling criterion. These are attached to the covariance arguments list so they are used in the subsequent computations for this fit (such as predict, predictSE, sim.spatialProcess). In general, if \code{d} is the dimension of the locations and \code{m} the order of the spline one must have \code{2*m-d >0}. The polynomial will have \code{ choose( m+d-1,d)} terms and so this many cardinal points need to be specified. As mentioned above these are chosen in a reasonable way if \code{spatialProcess} is used. } \item{Stationary tapered covariance \code{stationary.taper.cov} :}{The resulting cross covariance is the direct or Shure product of the tapering function and the covariance. In R code given location matrices, \code{x1} and \code{x2} and using Euclidean distance. \code{Covariance(rdist( x1, x2)/aRange)*Taper( rdist( x1, x2)/Taper.args$aRange)} By convention, the \code{Taper} function is assumed to be identically zero outside the interval [0,1]. Some efficiency is introduced within the function to search for pairs of locations that are nonzero with respect to the Taper. This is done by the SPAM function \code{nearest.dist}. This search may find more nonzero pairs than dimensioned internally and SPAM will try to increase the space. One can also reset the SPAM options to avoid these warnings. For spam.format TRUE the multiplication with the \code{C} argument is done with the spam sparse multiplication routines through the "overloading" of the \code{\%*\%} operator. } \item{Nonstationary covariance function, Paciorek.cov}{ This implements the nonstationary model developed by Chris Paciorek and Mark Schervish that allows for a varying range parameter over space and also a varying marginal variance. This is still experimental and spatialProcess has not been generalized to fit the parameter surfaces. It can, however, be used to evaluate the model at fixed parameter surfaces. See the last example below. This covariance works by specifying a object aRangeObj such that the generic call \code{predict(aRangeObj, loc)} will evaluate the aRange function at the locations \code{loc}. This object can be as simple a fit to local estimated aRange parameters using a fields function such as Tps or spatialProcess. More specific applications one can create a special predict function. For example suppose log aRange follows a linear model in the spatial coordinates and these coefficients are the vector \code{Afit}. Define a class and a predict function. \preformatted{ aRangeObj<- list(coef=Afit) class(aRangeObj)<- "myclass" predict.myclass<- function( aRangeObj, x){ aRange<- exp(cbind( 1,x) \%*\% aRangeObj$coef) return( aRange) } } Now use \code{spatialProcess} with this object and make sure \code{predict.myclass} is also loaded. } A similar strategy will also work for a varying marginal variance by creating \code{sigmaObj} and if needed a companion predict method. } About the FORTRAN: The actual function \code{Exp.cov} and \code{Rad.cov} call FORTRAN to make the evaluation more efficient this is especially important when the C argument is supplied. So unfortunately the actual production code in Exp.cov is not as crisp as the R code sketched above. See \code{Rad.simple.cov} for a R coding of the radial basis functions. } \seealso{ Krig, rdist, rdist.earth, gauss.cov, Exp.image.cov, Exponential, Matern, Wendland.cov, mKrig} \examples{ # exponential covariance matrix ( marginal variance =1) for the ozone #locations out<- Exp.cov( ChicagoO3$x, aRange=100) # out is a 20X20 matrix out2<- Exp.cov( ChicagoO3$x[6:20,],ChicagoO3$x[1:2,], aRange=100) # out2 is 15X2 matrix # Kriging fit where the nugget variance is found by GCV # Matern covariance shape with range of 100. # fit<- Krig( ChicagoO3$x, ChicagoO3$y, Covariance="Matern", aRange=100,smoothness=2) data( ozone2) x<- ozone2$lon.lat y<- ozone2$y[16,] # Omit the NAs good<- !is.na( y) x<- x[good,] y<- y[good] # example of calling the taper version directly # Note that default covariance is exponential and default taper is # Wendland (k=2). stationary.taper.cov( x[1:3,],x[1:10,] , aRange=1.5, Taper.args= list(k=2,aRange=2.0, dimension=2) )-> temp # temp is now a tapered 3X10 cross covariance matrix in sparse format. is.spam( temp) # evaluates to TRUE # should be identical to # the direct matrix product temp2<- Exp.cov( x[1:3,],x[1:10,], aRange=1.5) * Wendland(rdist(x[1:3,],x[1:10,]), aRange= 2.0, k=2, dimension=2) test.for.zero( as.matrix(temp), temp2) # Testing that the "V" option works as advertized ... x1<- x[1:20,] x2<- x[1:10,] V<- matrix( c(2,1,0,4), 2,2) Vi<- solve( V) u1<- t(Vi\%*\% t(x1)) u2<- t(Vi\%*\% t(x2)) look<- exp(-1*rdist(u1,u2)) look2<- stationary.cov( x1,x2, V= V) test.for.zero( look, look2) # Here is an example of how the cross covariance multiply works # and lots of options on the arguments Ctest<- rnorm(10) temp<- stationary.cov( x,x[1:10,], C= Ctest, Covariance= "Wendland", k=2, dimension=2, aRange=1.5 ) # do multiply explicitly temp2<- stationary.cov( x,x[1:10,], Covariance= "Wendland", k=2, dimension=2, aRange=1.5 )\%*\% Ctest test.for.zero( temp, temp2) # use the tapered stationary version # cov.args is part of the argument list passed to stationary.taper.cov # within Krig. # This example needs the spam package. # \dontrun{ Krig(x,y, cov.function = "stationary.taper.cov", aRange=1.5, cov.args= list(Taper.args= list(k=2, dimension=2,aRange=2.0) ) ) -> out2 # NOTE: Wendland is the default taper here. } # BTW this is very similar to \dontrun{ Krig(x,y, aRange= 1.5)-> out } ################################################## #### nonstationary covariance Paciorek.cov ################################################## \dontrun{ M<- 20 gridList<- list(x=seq( 0,1,length.out=M), y=seq( 0,1,length.out=M)) sGrid<- make.surface.grid(gridList ) # An aRange surface aRangeObj<- list(coef= c( 1,4,0)) class(aRangeObj)<- "myclass" predict.myclass<- function( aRangeObj, x){ aRange<- exp(cbind( 1,x) \%*\% aRangeObj$coef) return( aRange) } covMatrix<- Paciorek.cov( sGrid, sGrid, aRangeObj=aRangeObj) # examine correlation surface between selected locations and the full grid. set.panel( 2,2) { imagePlot( as.surface(sGrid, covMatrix[,10])) imagePlot( as.surface(sGrid, covMatrix[,205])) imagePlot( as.surface(sGrid, covMatrix[,305])) imagePlot( as.surface(sGrid, covMatrix[,390])) } # simulation of the field set.seed(222) n<- nrow( sGrid) f<- t(chol(covMatrix)) \%*\% rnorm(M^2) set.panel() imagePlot( as.surface(sGrid,f)) y<- f + .05*rnorm(n) fitP<- spatialProcess( sGrid, y, cov.function="Paciorek.cov", cov.args= list(aRangeObj = aRangeObj ) ) # check estimated tau and sigma fitP$summary # fitted surface surface( fitP) } } \keyword{spatial} % docclass is function fields/man/pushpin.Rd0000644000176200001440000000463414275214115014261 0ustar liggesusers%# %# fields is a package for analysis of spatial data written for %# the R software environment. %# Copyright (C) 2022 Colorado School of Mines %# 1500 Illinois St., Golden, CO 80401 %# Contact: Douglas Nychka, douglasnychka@gmail.edu, %# %# This program is free software; you can redistribute it and/or modify %# it under the terms of the GNU General Public License as published by %# the Free Software Foundation; either version 2 of the License, or %# (at your option) any later version. %# This program is distributed in the hope that it will be useful, %# but WITHOUT ANY WARRANTY; without even the implied warranty of %# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the %# GNU General Public License for more details. %# %# You should have received a copy of the GNU General Public License %# along with the R software environment if not, write to the Free Software %# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA %# or see http://www.r-project.org/Licenses/GPL-2 %##END HEADER %##END HEADER \name{pushpin} \alias{pushpin} \title{ Adds a "push pin" to an existing 3-d plot} \description{Adds to an existing 3-d perspective plot a push pin to locate a specific point.} \usage{ pushpin( x,y,z,p.out, height=.05,col="black",text=NULL,adj=-.1,cex=1.0,...) } \arguments{ \item{x}{x location} \item{y}{y location} \item{z}{z location} \item{p.out}{Projection information returned by persp} \item{height}{Height of pin in device coordinates (default is about 5\% of the vertical distance ). } \item{col}{Color of pin head.} \item{text}{Optional text to go next to pin head.} \item{adj}{Position of text relative to pin head.} \item{cex}{Character size for pin head and/or text} \item{\dots}{Additional graphics arguments that are passed to the text function.} } \details{ See the help(text) for the conventions on the \code{adj} argument and other options for placing text. } \author{Doug Nychka} \seealso{drape.plot,persp} \examples{ # Dr. R's favorite New Zealand Volcano! data( volcano) M<- nrow( volcano) N<- ncol( volcano) x<- seq( 0,1,,M) y<- seq( 0,1,,N) drape.plot( x,y,volcano, col=terrain.colors(128))-> pm max( volcano)-> zsummit xsummit<- x[ row( volcano)[volcano==zsummit]] ysummit<- y[ col( volcano)[volcano==zsummit]] pushpin( xsummit,ysummit,zsummit,pm, text="Summit") } \keyword{hplot} fields/man/envelopePlot.Rd0000644000176200001440000000475614275214115015254 0ustar liggesusers%# %# fields is a package for analysis of spatial data written for %# the R software environment. %# Copyright (C) 2022 Colorado School of Mines %# 1500 Illinois St., Golden, CO 80401 %# Contact: Douglas Nychka, douglasnychka@gmail.edu, %# %# This program is free software; you can redistribute it and/or modify %# it under the terms of the GNU General Public License as published by %# the Free Software Foundation; either version 2 of the License, or %# (at your option) any later version. %# This program is distributed in the hope that it will be useful, %# but WITHOUT ANY WARRANTY; without even the implied warranty of %# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the %# GNU General Public License for more details. %# %# You should have received a copy of the GNU General Public License %# along with the R software environment if not, write to the Free Software %# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA %# or see http://www.r-project.org/Licenses/GPL-2 %##END HEADER %##END HEADER \name{envelopePlot} \alias{envelopePlot} \title{ Add a shaded the region between two functions to an existing plot} \description{ This function shades the region vertically between two functions, specified as pairs of x and y vectors, and draws the functions in a darker shade. More formally, it shades all points (x,y) such that f1(x) < y < f2(x) or f2(x) < y < f1(x). When both functions have the same group of x values, the x values only need to be set once but y2 needs to be passed in by name. If the two functions intersect, the vertical space between the functions will be shaded on both sides, as implied in the definition above. } \usage{ envelopePlot(x1, y1, x2 = x1, y2, col ="thistle1" , lineCol = "thistle3", ...) } \arguments{ \item{x1}{The x coordinates for the first function (or possibly both functions).} \item{y1}{The y coordinates for the first function.} \item{x2}{The x coordinates for the second function.} \item{y2}{The y coordinates for the second function.} \item{col}{The color to make the filling between the functions.} \item{lineCol}{The color to make the lines representing the functions.} \item{\dots}{Additional arguments to the base R function \code{polygon} } } \author{ Matt Iverson } \examples{ x <- seq(0, 2*pi,, 100) y1 <- cos(x) y2 <- sin(x) plot(x, y1, type="l") envelopePlot(x, y1, y2=y2) x1 <- c(0, 0.5, 1) y1 <- c(0, 2, 1) x2 <- c(0, 1) y2 <- c(-1, 0) plot(x1, y1, type="l", ylim=c(-1, 2)) envelopePlot(x1, y1, x2, y2) } fields/man/rdist.Rd0000644000176200001440000001213014275214115013706 0ustar liggesusers%# %# fields is a package for analysis of spatial data written for %# the R software environment. %# Copyright (C) 2022 Colorado School of Mines %# 1500 Illinois St., Golden, CO 80401 %# Contact: Douglas Nychka, douglasnychka@gmail.edu, %# %# This program is free software; you can redistribute it and/or modify %# it under the terms of the GNU General Public License as published by %# the Free Software Foundation; either version 2 of the License, or %# (at your option) any later version. %# This program is distributed in the hope that it will be useful, %# but WITHOUT ANY WARRANTY; without even the implied warranty of %# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the %# GNU General Public License for more details. %# %# You should have received a copy of the GNU General Public License %# along with the R software environment if not, write to the Free Software %# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA %# or see http://www.r-project.org/Licenses/GPL-2 %##END HEADER %##END HEADER \name{rdist} \alias{rdist} \alias{fields.rdist.near} \alias{rdist.vec} \title{ Euclidean distance matrix or vector } \description{ Given two sets of locations \code{rdist} and \code{fields.rdist.near} computes the full Euclidean distance matrix among all pairings or a sparse version for points within a fixed threshhold distance. \code{rdist.vec} computes a vector of pairwise distances between corresponding elements of the input locations and is used in empirical variogram calculations. } \usage{ rdist(x1, x2 = NULL, compact = FALSE) fields.rdist.near(x1,x2, delta, max.points= NULL, mean.neighbor = 50) rdist.vec(x1, x2) } \arguments{ \item{x1}{ Matrix of first set of locations where each row gives the coordinates of a particular point. } \item{x2}{ Matrix of second set of locations where each row gives the coordinates of a particular point. If this is not passed or given as NULL x1 is used. } \item{compact}{ Whether or not to return a distance matrix in compact form inheriting class ``dist'' (as returned by the \code{dist} function in base R). Only values for one triangle of the symmetric distance matrix are returned. This saves time evaluating the returned matrix and the covariance. Note that this option is ignored when \code{x2} is not NULL. } \item{delta}{ Threshhold distance. All pairs of points that separated by more than delta in distance are ignored. } \item{max.points}{Size of the expected number of pairs less than or equal to delta. The default is set to the nrow(x1)*mean.neighbor. } \item{mean.neighbor}{ Sets the temp space for max.points} } \section{Returned values}{ Let D be the mXn distance matrix, with m= nrow(x1) and n=nrow( x2). The elements are the Euclidean distances between the all locations x1[i,] and x2[j,]. That is, D.ij = sqrt( sum.k (( x1[i,k] - x2[j,k]) **2 ). \code{rdist} The distance matrix D is returned. \code{fields.rdist.near} The elements of D that are less than or equal to delta are returned in the form of a list. List components: \describe{ \item{ind}{ Row and column indices of elements } \item{ra}{ (Distances ( D.ij)} \item{da}{ Dimensions of full distance matrix. } } This is a simple sparse format that can be manipulated by several fields functions. E.g. ind2spam will convert this list to the format used by the spam sparse matrix package. ind2full will convert this to an ordinary matrix with zeroes. } \details{ More about fields.rdist.near: The sparse version is designed to work with the sparse covariance functions in fields and anticipates that the full matrix, D is too large to store. The argument max.points is set as a default to nrow( x1)*100 and allocates the space to hold the sparse elements. In case that there are more points that are within delta the function stops with an error but lists the offending rows. Just rerun the function with a larger choice for max.points It possible that for certain x1 points there are no x2 points within a distance delta. This situation will cause an error if the list is converted to spam format. } \author{Doug Nychka, John Paige} \seealso{ \link{stationary.cov}, \link{Exp.cov}, \link{rdist.earth}, \link{dist}, ind2spam, ind2full } \examples{ out<- rdist( ChicagoO3$x) # out is a 20X20 matrix. out2<- rdist( ChicagoO3$x[1:5,], ChicagoO3$x[11:20,]) #out2 is a 5X10 matrix set.seed(123) x1<- matrix( runif( 20*2), 20,2) x2<- matrix( runif( 15*2), 15,2) out3<- fields.rdist.near( x1,x2, delta=.5) # out3 is a sparse structure in list format # or to "save" work space decrease size of temp array out3<- fields.rdist.near( x1,x2, delta=.5,max.points=20*15) # explicitly reforming as a full matrix temp<- matrix( NA, nrow=out3$da[1], ncol= out3$da[2]) temp[ out3$ind] <- out3$ra # or justuse temp<- spind2full( out3) image( temp) # this is identical to temp2<- rdist( x1,x2) temp2[ temp2<= .5] <- NA #compute pairwise distance vector x1 = 1:10 x2 = seq(from=10, to=1) rdist.vec(x1, x2) #calculate output matrix in compact form: distOut = rdist(1:10, compact=TRUE) distOut as.vector(distOut) } \keyword{spatial} % docclass is function % Converted by Sd2Rd version 1.21. fields/man/grid.list.Rd0000644000176200001440000002332314275214115014466 0ustar liggesusers%# %# fields is a package for analysis of spatial data written for %# the R software environment. %# Copyright (C) 2022 Colorado School of Mines %# 1500 Illinois St., Golden, CO 80401 %# Contact: Douglas Nychka, douglasnychka@gmail.edu, %# %# This program is free software; you can redistribute it and/or modify %# it under the terms of the GNU General Public License as published by %# the Free Software Foundation; either version 2 of the License, or %# (at your option) any later version. %# This program is distributed in the hope that it will be useful, %# but WITHOUT ANY WARRANTY; without even the implied warranty of %# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the %# GNU General Public License for more details. %# %# You should have received a copy of the GNU General Public License %# along with the R software environment if not, write to the Free Software %# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA %# or see http://www.r-project.org/Licenses/GPL-2 %##END HEADER %##END HEADER \name{grid list} \alias{grid list} \alias{grid.list} \alias{fields.x.to.grid} \alias{parse.grid.list} \alias{fields.convert.grid} \alias{discretize.image} \alias{make.surface.grid} \alias{unrollZGrid} \alias{makeMultiIndex} \title{ Some simple functions for working with gridded data and the grid format (grid.list) used in fields. } \description{ The object grid.list refers to a list that contains information for evaluating a function on a 2-dimensional grid of points. If a function has more than two independent variables then one also needs to specify the constant levels for the variables that are not being varied. This format is used in several places in fields for functions that evaluate function estimates and plot surfaces. These functions provide some default conversions among information and the gird.list. The function \code{discretize.image} is a useful tool for "registering" irregular 2-d points to a grid. } \usage{ makeMultiIndex(M) parse.grid.list( grid.list, order.variables="xy") fields.x.to.grid(x,nx=80, ny=80, xy=c(1,2)) fields.convert.grid( midpoint.grid ) discretize.image(x, m = 64, n = 64, grid = NULL, expand = c(1 + 1e-08, 1 + 1e-08), boundary.grid = FALSE, na.rm = TRUE) make.surface.grid( grid.list) unrollZGrid( grid.list, ZGrid) } \arguments{ \item{M}{An vector of integers.} \item{grid.list}{ No surprises here -- a grid list! These can be unequally spaced.} \item{order.variables}{ If "xy" the x variable will be subsequently plotted as the horizontal variable. If "yx" the x variable will be on the vertical axis.} \item{x}{ A matrix of independent variables such as the locations of observations given to Krig.} \item{nx}{Number of grid points for x variable.} \item{ny}{Number of grid points for y variable.} \item{m}{Number of grid points for x variable.} \item{n}{Number of grid points for y variable.} \item{na.rm}{Remove missing values if TRUE} \item{xy}{The column positions that locate the x and y variables for the grid.} \item{grid}{ A grid list!} \item{expand}{ A scalar or two column vector that will expand the grid beyond the range of the observations.} \item{midpoint.grid}{ Grid midpoints to convert to grid boundaries.} \item{boundary.grid}{ If TRUE interpret grid points as boundaries of grid boxes. If FALSE interpret as the midpoints of the boxes. } \item{ZGrid}{An array or list form of covariates to use for prediction. This must match the \code{grid.list} argument. e.g. ZGrid and grid.list describe the same grid. If ZGrid is an array then the first two indices are the x and y locations in the grid. The third index, if present, indexes the covariates. e.g. For evaluation on a 10X15 grid and with 2 covariates. \code{ dim( ZGrid) == c(10,15, 2)}. If ZGrid is a list then the components x and y shold match those of grid.list and the z component follows the shape described above for the no list case. } } \details{ \code{makeMultiIndex} creates an expanded set of indices to referencce a regular grid. M are L integers with product prodM Will create a prodM by L matrix that is all combinations of (1:M[i]) for i =1,2, ...L This is organized in the standard array ordering where the first column varies the fastest for M = c( 3,2,4) the result will be a 24X3 matrix with the entries: \preformatted{ 1,1,1 2,1,1 3,1,1 1,2,1 2,2,1 3,2,1 etc ... ... and ending with 2,2,4 3,2,4 } \strong{All about grid lists:} The form of a grid.list is \code{list( var.name1= what1 , var.name2=what2 , ... var.nameN=what3)} Here var.names are the names of the independent variables. The what options describe what should be done with this variable when generating the grid. These should either an increasing sequence of points or a single vaules. Obviously there should be only be two variables with sequences to define a grid for a surface. Most of time the gridding sequences are equally spaced and are easily generated using the \code{seq} function. Also throughout fields the grid points are typically the midpoints of the grid rather the grid box boundaries. However, these functions can handle unequally spaced grids and the logical boundary.grid can indicate a grid being the box boundaries. The variables in the list components are assumed to be in the same order as they appear in the data matrix. A useful function that expands the grid from the grid.list description into a full set of locations is \code{make.surface.grid} and is just a wrapper around the R base function \code{expand.grid}. A typical operation is to go from a grid.list to the set of grid locations. Evaluate a fucntion at these lcoations and then reformat this as an image for plotting. Here is how to do this cleanly: \preformatted{ grid.list<- list( x= 1:10, y=1:15) xg<- make.surface.grid(grid.list) # look at a surface dependin on xg locations z<- xg[,1] + 2*xg[,2] out<- list( x=grid.list$x, y= grid.list$y, z=matrix( z, nrow=10, ncol=15)) # now for example image.plot( out) } The key here is that \code{xg} and \code{matrix} both organize the grid in the same order. Some fields internal functions that support interpreting grid list format are: \code{fields.x.to.grid}: Takes an "x" matrix of locations or independent variables and creates a reasonable grid list. This is used to evaluate predicted surfaces when a grid list is not explicited given to predictSurface. The variables (i.e. columns of x) that are not part of the grid are set to the median values. The x grid values are \code{nx} equally spaced points in the range \code{x[, xy[1]]}. The y grid values are \code{ny} equally spaced points in the range \code{x[, xy[2]]}. \code{parse.grid.list}: Takes a grid list and returns the information in a more expanded list form that is easy to use. This is used, for example, by predictSurface to figure out what to do! \code{fields.convert.grid}: Takes a vector of n values assumed to be midpoints of a grid and returns the n+1 boundaries. See how this is used in discretize.image with the cut function. This function will handle unequally spaced grid values. \code{discretize.image}: Takes a vector of locations and a 2-d grid and figures out to which boxes they belong. The output matrix ind has the grid locations. If boundary.grid is FALSE then the grid list (grid) is assumed to be grid midpoints. The grid boundaries are taken to be the point half way between these midpoints. The first and last boundaries points are determined by extrapolating so that the first and last box has the midpoint in its center. (See the code in fields.convert.grid for details.) If grid is NULL then midpoints are found from m and n and the range of the x matrix. \code{unrollZGrid} Checks that the ZGrid object is compatible with th e grid.list and concatenates the grid arrays into vectors. This version of the covariates are used the usual predict function. } \seealso{ as.surface, predictSurface, plot.surface, surface, expand.grid, as.image } \examples{ #Given below are some examples of grid.list objects and the results #when they are used with make.surface.grid. Note that #make.surface.grid returns a matrix that retains the grid.list #information as an attribute. grid.l<- list( 1:3, 2:5) make.surface.grid(grid.l) grid.l <- list( 1:3, 10, 1:3) make.surface.grid(grid.l) #The next example shows how the grid.list can be used to #control surface plotting and evaluation of an estimated function. # first create a test function set.seed( 124) X<- 2*cbind( runif(30), runif(30), runif(30)) -1 dimnames( X)<- list(NULL, c("X1","X2","X3")) y<- X[,1]**2 + X[,2]**2 + exp(X[,3]) # fit an interpolating thin plate spline out<- Tps( X,y) grid.l<- list( X1= seq( 0,1,,20), X2=.5, X3=seq(0,1,,25)) surface( out, grid.list=grid.l) # surface plot based on a 20X25 grid in X1 an X3 # over the square [0,2] and [0,2] # holding X2 equal to 1.0. # # test of discretize to make sure points on boundaries are counted right set.seed(123) x<- matrix( runif(200), 100,2) look<- discretize.image( x, m=2,n=2) xc<- seq(min(x[,1]), max(x[,1]),,5) xc<- xc[2:4] yc<- seq(min(x[,2]), max(x[,2]),,5) yc<- yc[2:4] grid <- list( x= xc, y= yc) look2<- discretize.image( x, m=2,n=2) table( look$index ) table( look2$index ) # indicator image of discretized locations look<- discretize.image( RMprecip$x, m=15, n=15) image.plot( look$grid$x, look$grid$y,look$hist ) # actual locations points( RMprecip$x,col="magenta", pch=".") } \keyword{misc} % docclass is function % Converted by Sd2Rd version 1.21. fields/man/fields.tests.Rd0000644000176200001440000001113214275214115015171 0ustar liggesusers%# %# fields is a package for analysis of spatial data written for %# the R software environment. %# Copyright (C) 2022 Colorado School of Mines %# 1500 Illinois St., Golden, CO 80401 %# Contact: Douglas Nychka, douglasnychka@gmail.edu, %# %# This program is free software; you can redistribute it and/or modify %# it under the terms of the GNU General Public License as published by %# the Free Software Foundation; either version 2 of the License, or %# (at your option) any later version. %# This program is distributed in the hope that it will be useful, %# but WITHOUT ANY WARRANTY; without even the implied warranty of %# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the %# GNU General Public License for more details. %# %# You should have received a copy of the GNU General Public License %# along with the R software environment if not, write to the Free Software %# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA %# or see http://www.r-project.org/Licenses/GPL-2 %##END HEADER %##END HEADER \name{fields testing scripts} \alias{fields.tests} \alias{test.for.zero} \title{ Testing fields functions } \description{ Some of the basic methods in fields can be tested by directly implementing the linear algebra using matrix expressions and other functions can be cross checked within fields. These comparisons are done in the the R source code test files in the tests subdirectory of fields. The function \code{test.for.zero} is useful for comparing the tests in a meaninful and documented way. } \usage{ test.for.zero( xtest, xtrue, tol= 1.0e-8, relative=TRUE, tag=NULL) } \arguments{ \item{xtest}{Vector of target values} \item{xtrue}{Vector of reference values} \item{tol}{Tolerance to judge whether the test passes.} \item{relative}{If true a relative error comparison is used. (See details below.)} \item{tag}{ A text string to be printed out with the test results as a reference} } \details{ IMPORTANT: If the R object \code{test.for.zero.flag} exists with any value ( e.g. \code{test.for.zero.flag <- 1} ) then when the test fails this function will also generate an error in addition to printing a message. This option is added to insure that any test scripts will generate an error when any individual test fails. An example: \preformatted{ > test.for.zero( 1:10, 1:10 + 1e-10, tag="First test") Testing: First test PASSED test at tolerance 1e-08 } \preformatted{ > test.for.zero( 1:10, 1:10 + 1e-10, tag="First test", tol=1e-12) Testing: First test FAILED test value = 1.818182e-10 at tolerance 1e-12 } \preformatted{ > test.for.zero.flag <- 1 Testing: First test FAILED test value = 1.818182e-10 at tolerance 1e-12 Error in test.for.zero(1:10, 1:10 + 1e-10, tag = "First test", tol = 1e-12) : } The scripts in the \code{tests} subdirectory are \describe{ \item{Krig.test.R:}{Tests basic parts of the Krig and Tps functions including replicated and weighted observations. } \item{Krig.se.test.R:}{Tests computations of standard errors for the Kriging estimate.} \item{Krig.se.grid.test.R}{Tests approximate standard errors for the Krig function found by Monte Carlo conditional simulation.} \item{Krig.test.W.R}{Tests predictions and A matrix when an off diagonal observation weight matrix is used.} \item{Krig.se.W.R}{Tests standard errors when an off diagonal observation weight matrix is used.} \item{spam.test.R}{Tests sparse matrix formats and linear algebra.} \item{Wend.test.R}{Tests form for Wendland covariance family and its use of sparse matrix formats.} \item{diag.multiply.test.R}{Tests special (efficient) version of matrix multiply for diagonal matrices.} \item{ evlpoly.test.R}{Tests evaluation of univariate and multivariate polynomial evaluation.} \item{mKrig.test.R}{Tests the micro Krig function with and without sparse matrix methods. } } To run the tests just attach the fields library and source the testing file. In the fields source code these are in a subdirectory "tests". Compare the output to the "XXX.Rout.save" text file. \code{test.for.zero} is used to print out the result for each individual comparison. Failed tests are potentially bad and are reported with a string beginning "FAILED test value = ... " If the object test.for.zero.flag exists then an error is also generated when the test fails. FORM OF COMPARISON: The actual test done is the sum of absolute differnces: test value = \code{ sum( abs(c(xtest) - c( xtrue) ) ) /denom} Where \code{denom} is either \code{ mean( abs(c(xtrue)))} for relative error or 1.0 otherwise. Note the use of "c" here to stack any structure in xtest and xtrue into a vector. } \keyword{misc} fields/man/lennon.Rd0000644000176200001440000000241014275214115014052 0ustar liggesusers%# %# fields is a package for analysis of spatial data written for %# the R software environment. %# Copyright (C) 2022 Colorado School of Mines %# 1500 Illinois St., Golden, CO 80401 %# Contact: Douglas Nychka, douglasnychka@gmail.edu, %# %# This program is free software; you can redistribute it and/or modify %# it under the terms of the GNU General Public License as published by %# the Free Software Foundation; either version 2 of the License, or %# (at your option) any later version. %# This program is distributed in the hope that it will be useful, %# but WITHOUT ANY WARRANTY; without even the implied warranty of %# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the %# GNU General Public License for more details. %# %# You should have received a copy of the GNU General Public License %# along with the R software environment if not, write to the Free Software %# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA %# or see http://www.r-project.org/Licenses/GPL-2 %##END HEADER %##END HEADER \name{lennon} \alias{lennon} \title{ Gray image of John Lennon. } \description{ A 256X256 image of John Lennon. Try: \code{image(lennon, col=grey(seq(0,1,,256)) )} } \keyword{datasets} % docclass is data % Converted by Sd2Rd version 1.21. fields/man/registeredC.Rd0000644000176200001440000000721714275214115015033 0ustar liggesusers%# %# fields is a package for analysis of spatial data written for %# the R software environment. %# Copyright (C) 2022 Colorado School of Mines %# 1500 Illinois St., Golden, CO 80401 %# Contact: Douglas Nychka, douglasnychka@gmail.edu, %# %# This program is free software; you can redistribute it and/or modify %# it under the terms of the GNU General Public License as published by %# the Free Software Foundation; either version 2 of the License, or %# (at your option) any later version. %# This program is distributed in the hope that it will be useful, %# but WITHOUT ANY WARRANTY; without even the implied warranty of %# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the %# GNU General Public License for more details. %# %# You should have received a copy of the GNU General Public License %# along with the R software environment if not, write to the Free Software %# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA %# or see http://www.r-project.org/Licenses/GPL-2 %##END HEADER %##END HEADER \name{registeringCode} \alias{addToDiagC} \alias{ExponentialUpperC} \alias{compactToMatC} \alias{multebC} \alias{multwendlandg} \alias{mltdrb} \alias{RdistC} \alias{distMatHaversin} \alias{distMatHaversin2} % \docType{data} \title{Information objects that register C and FORTRAN functions. } \description{ These are objects of class \code{CallRoutine} or \code{FortranRoutine} and also \code{\link{NativeSymbolInfo}} They provide information for compiledfunctions called with \code{.Call}, or \code{.Fortran}. Ordinarily one would not need to consult these and they are used to make the search among dynamically loaded libraries ( in particular the fields library) have less ambiguity and also be faster. These are created when the package/library is loaded are have their definitions from the compliation of \code{init.c} in the package source (src) directory. } %ExponentialUpperC.Rd compactToMatC.Rd multebC.Rd %RdistC.Rd mltdrb.Rd multwendlandg.Rd %%\usage{ %data(addToDiagC) %data(ExponentialUpperC) %data(compactToMatC) %data(multebC) %data(multwendlandg) %data(mltdrb) %data(RdistC) %} \format{ The format is a list with components: \describe{ \item{name}{The (registration ?) name of the C function.} \item{address}{See \link{NativeSymbolInfo}. } \item{dll}{Dynamically linked library information.} \item{numParameters}{Number of calling arguments in function.} } } \details{ \describe{ \item{addToDiagC}{ adds diagonal elements to a matrix. See code{mKrig}.} \item{ExponentialUpperC}{Fills in upper triangle of a matrix with the exponential covariance function. See \code{ExponentialUpper}} \item{compactToMatC}{ Converts compact format to full matrix format. See \code{compactToMat}.} \item{multebC}{Mulitplies a vector/matrix with an exponential covariance function. See \code{exp.cov}} \item{multwendlandg}{This has been mysteriously included but it is not a function! } \item{mltdrb}{Evaluates the derivatives of thin plate sline radial basis functions. See \code{rad.cov}. } \item{RdistC}{ Euclidean distance function between sets of coordinates. See \code{rdist}.} \item{distMatHaversin}{ Used in \code{RdistEarth}.} \item{distMatHaversin2}{ Used in \code{RdistEarth}.} } See \code{package_native_routine_registration_skeleton} for the utility used to create these data objects. It is not clear why these routines have been flagged as needing documentation while other routines have not. } \references{ For background on registering C, C++ and Fortran functions see 5.4 of Writing R Extensions. For this package refer to the C code in \code{ src/intit.c} as an example. } \examples{ print(addToDiagC) } \keyword{datasets} fields/man/image.smooth.Rd0000644000176200001440000001500214275214115015154 0ustar liggesusers%# %# fields is a package for analysis of spatial data written for %# the R software environment. %# Copyright (C) 2022 Colorado School of Mines %# 1500 Illinois St., Golden, CO 80401 %# Contact: Douglas Nychka, douglasnychka@gmail.edu, %# %# This program is free software; you can redistribute it and/or modify %# it under the terms of the GNU General Public License as published by %# the Free Software Foundation; either version 2 of the License, or %# (at your option) any later version. %# This program is distributed in the hope that it will be useful, %# but WITHOUT ANY WARRANTY; without even the implied warranty of %# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the %# GNU General Public License for more details. %# %# You should have received a copy of the GNU General Public License %# along with the R software environment if not, write to the Free Software %# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA %# or see http://www.r-project.org/Licenses/GPL-2 %##END HEADER %##END HEADER \name{image.smooth} \alias{image.smooth} \alias{setup.image.smooth} \title{ Kernel smoother for irregular 2-d data } \description{ Takes an image matrix and applies a kernel smoother to it. Missing values are handled using the Nadaraya/Watson normalization of the kernel. } \usage{ \method{image}{smooth}(x, wght = NULL, dx = 1, dy = 1, kernel.function = double.exp, aRange = 1, grid = NULL, tol = 1e-08, xwidth = NULL, ywidth = NULL, weights = NULL, theta=NULL, ...) setup.image.smooth(nrow = 64, ncol = 64, dx = 1, dy = 1, kernel.function = double.exp, aRange = 1, xwidth = nrow * dx, ywidth = ncol * dx, lambda=NULL,theta=NULL, ...)} \arguments{ \item{x}{ A matrix image. Missing values can be indicated by NAs. } \item{wght}{ FFT of smoothing kernel. If this is NULL the default is to compute this object. } \item{grid}{ A list with x and y components. Each are equally spaced and define the rectangular. ( see grid.list)} \item{dx}{ Grid spacing in x direction } \item{dy}{ Grid spacing in x direction } \item{kernel.function}{ An R function that takes as its argument the \emph{squared} distance between two points divided by the bandwidth. The default is exp( -abs(x)) yielding a normal kernel} \item{aRange}{the bandwidth or scale parameter.} \item{theta}{Same as aRange.} \item{xwidth}{ Amount of zero padding in horizontal dimension in units of the grid spacing. If NULL the default value is equal to the width of the image the most conservative value but possibly inefficient for computation. Set this equal to zero to get periodic wrapping of the smoother. This is useful to smooth a Mercator map projection. } \item{ywidth}{ Same as xwidth but for the vertical dimension. } \item{weights}{ Weights to apply when smoothing.} \item{tol}{ Tolerance for the weights of the N-W kernel. This avoids kernel estimates that are "far" away from data. Grid points with weights less than tol are set to NA.} \item{nrow}{X dimension of image in setting up smoother weights} \item{ncol}{Y dimension of image} \item{lambda}{Smoothing parameter if smoother is interpreted in a spline-like way.} \item{\dots}{ Other arguments to be passed to the kernel function} } \value{ The smoothed image in R image format. ( A list with components x, y and z.) \code{setup.image.smooth} returns a list with components W a matrix being the FFT of the kernel, dx, dy, xwidth and ywidth.} \details{ The function works by taking convolutions using an FFT. The missing pixels are taken into account and the kernel smoothing is correctly normalized for the edge effects following the classical Nadaraya-Watson estimator. For this reason the kernel doe snot have to be a desity as it is automatically normalized when the kernel weight function is found for the data. If the kernel has limited support then the width arguments can be set to reduce the amount of computation. (See example below.) For multiple smoothing compute the fft of the kernel just once using \code{setup.image.smooth} and pass this as the wght argument to image.smooth. this will save an FFT in computations. } \seealso{ as.image, sim.rf, image.plot} \examples{ # first convert precip data to the 128X128 discretized image format ( with # missing values to indicate where data is not observed) # out<- as.image( RMprecip$y, x= RMprecip$x, nx=128, ny=128) # out$z is the image matrix dx<- out$x[2]- out$x[1] dy<- out$y[2] - out$y[1] # # grid scale in degrees and choose kernel bandwidth to be .25 degrees. look<- image.smooth( out, aRange= .25) # pass in a tophat kernel topHat<- function( dd, h ){ ifelse( dd <= h^2, 1, 0)} ## dd is the distance squared look2<- image.smooth( out, kernel.function=topHat, h=.8) image.plot(look) points( RMprecip$x) US( add=TRUE, col="grey", lwd=2) # to save on computation, decrease the padding with zeroes # only pad 32 grid points around the margins ofthe image. look<- image.smooth(out$z, dx=dx, dy=dy, aRange= .25, xwidth=32*dx,ywidth=32*dy) # the range of these data is ~ 10 degrees and so # with a padding of 32 grid points 32*( 10/128) = 2.5 # about 10 standard deviations of the normal kernel so there is still # lots of room for padding # a minimal choice might be xwidth = 4*(.25)= 1 4 SD for the normal kernel # creating weighting object outside the call # this is useful when one wants to smooth different data sets but on the # same grid with the same kernel function # # # random fields from smoothing white noise with this filter. # set.seed(123) test.image<- matrix( rnorm(128**2),128,128) dx<- .1 dy<- .8 wght<- setup.image.smooth( nrow=128, ncol=128, dx=dx, dy=dy, aRange=.25, xwidth=2.5, ywidth=2.5) # look<- image.smooth( test.image, dx=dx, dy=dy, wght) # NOTE: this is the same as using # # image.smooth( test.image , 128,128), xwidth=2.5, # ywidth=2.5, dx=dx,dy=dy, aRange=.25) # # but the call to image.smooth is faster because the fft of kernel # has been precomputed. # periodic smoothing in the horizontal dimension look<- image.smooth( test.image , xwidth=1.5, ywidth=2.5, dx=dx,dy=dy, aRange=1.5) look2<- image.smooth( test.image , xwidth=0, ywidth=2.5, dx=dx,dy=dy, aRange=1.5) # compare these two set.panel( 1,2) image.plot( look, legend.mar=7.1) title("free boundaries") image.plot( look2, legend.mar=7.1) # look for periodic continuity at edges! title("periodic boundary in horizontal") set.panel(1,1) } \keyword{smooth} % docclass is function % Converted by Sd2Rd version 1.21. fields/man/WorldBank.Rd0000644000176200001440000001016414275214115014451 0ustar liggesusers%# %# fields is a package for analysis of spatial data written for %# the R software environment. %# Copyright (C) 2022 Colorado School of Mines %# 1500 Illinois St., Golden, CO 80401 %# Contact: Douglas Nychka, douglasnychka@gmail.edu, %# %# This program is free software; you can redistribute it and/or modify %# it under the terms of the GNU General Public License as published by %# the Free Software Foundation; either version 2 of the License, or %# (at your option) any later version. %# This program is distributed in the hope that it will be useful, %# but WITHOUT ANY WARRANTY; without even the implied warranty of %# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the %# GNU General Public License for more details. %# %# You should have received a copy of the GNU General Public License %# along with the R software environment if not, write to the Free Software %# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA %# or see http://www.r-project.org/Licenses/GPL-2 %##END HEADER %##END HEADER \name{WorldBankCO2} \alias{WorldBankCO2} \docType{data} \title{Carbon emissions and demographic covariables by country for 1999.} \description{ These data are a small subset of the demographic data compiled by the World Bank. The data has been restricted to 1999 and to countries with a population larger than 1 million. Also, only countries reporting all the covariables are included. } \usage{ data(WorldBankCO2)} \format{ This a 75X5 matrix with the row names identifying countries and columns the covariables: \code{ "GDP.cap" "Pop.mid" "Pop.urb" "CO2.cap" "Pop"} \itemize{ \item GDP.cap: Gross domestic product (in US dollars) per capita. \item Pop.mid: percentage of the population within the ages of 15 through 65. \item Pop.urb: Precentage of the population living in an urban environment \item CO2.cap: Equivalent CO2 emmissions per capita \item Pop: Population } } \section{Reference}{ Romero-Lankao, P., J. L. Tribbia and D. Nychka (2008) Development and greenhouse gas emissions deviate from the modernization theory and convergence hypothesis. Cli- mate Research 38, 17-29. } \examples{ data(WorldBankCO2) plot( WorldBankCO2[,"GDP.cap"], WorldBankCO2[,"CO2.cap"], log="xy") } \section{Creating dataset}{ Listed below are scripts to create this data set from spread sheet on the World Bank CDs: \preformatted{ ## read in comma delimited spread sheet read.csv("climatedemo.csv", stringsAsFactors=FALSE)->hold ## convert numbers to matrix of data Ddata<- as.matrix( hold[,5:51] ) Ddata[Ddata==".."] <- NA ## still in character form parse as numeric Ddata<- matrix( as.numeric( Ddata), nrow=1248, ncol=ncol( Ddata), dimnames=list( NULL, format( 1960:2006) )) ## these are the factors indicating the different variables ### unique( Fac) gives the names of factors Fac<- as.character( hold[,1]) years<- 1960:2006 # create separate tables of data for each factor temp<- unique( Fac) ## also subset Country id and name Country.id<- as.character( hold[Fac== temp[1],3]) Country<- as.character( hold[Fac== temp[1],4]) Pop<- Ddata[ Fac== temp[2],] CO2<- Ddata[ Fac== temp[1],] Pop.mid<- Ddata[ Fac== temp[3],] GDP.cap<- Ddata[ Fac== temp[4],] Pop.urb<- Ddata[ Fac== temp[5],] CO2.cap<- CO2/Pop dimnames( Pop)<- list( Country.id,format(years)) dimnames( CO2)<- list( Country.id,format(years)) dimnames( Pop.mid)<- list( Country.id,format(years)) dimnames( Pop.urb)<- list( Country.id,format(years)) dimnames( CO2.cap)<- list( Country.id,format(years)) # delete temp data sets rm( temp) rm( hold) rm( Fac) # define year to do clustering. yr<- "1999" # variables for clustering combined as columns in a matrix temp<-cbind( GDP.cap[,yr], Pop.mid[,yr], Pop.urb[,yr],CO2[,yr],Pop[,yr]) # add column names and figure how many good data rows there are. dimnames( temp)<-list( Country, c("GDP.cap","Pop.mid","Pop.urb", "CO2.cap", "Pop")) good<-complete.cases(temp) good<- good & Pop[,yr] > 10e6 # subset with only the complete data rows WorldBankCO2<- temp[good,] save(WorldBankCO2, file="WorldBankCO2.rda") } } \keyword{datasets} fields/man/US.Rd0000644000176200001440000000332014275214115013111 0ustar liggesusers%# %# fields is a package for analysis of spatial data written for %# the R software environment. %# Copyright (C) 2022 Colorado School of Mines %# 1500 Illinois St., Golden, CO 80401 %# Contact: Douglas Nychka, douglasnychka@gmail.edu, %# %# This program is free software; you can redistribute it and/or modify %# it under the terms of the GNU General Public License as published by %# the Free Software Foundation; either version 2 of the License, or %# (at your option) any later version. %# This program is distributed in the hope that it will be useful, %# but WITHOUT ANY WARRANTY; without even the implied warranty of %# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the %# GNU General Public License for more details. %# %# You should have received a copy of the GNU General Public License %# along with the R software environment if not, write to the Free Software %# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA %# or see http://www.r-project.org/Licenses/GPL-2 %##END HEADER %##END HEADER \name{US} \alias{US} \title{ Plot of the US with state boundaries } \description{ Plots quickly, medium resolution outlines of the US with the states and bodies of water. A simple wrapper for the map function from the maps package. } \usage{ US( ...) } \arguments{ \item{\dots}{ These are the arguments that are passed to the map function from the maps package. } } \details{ The older version of this function (fields < 6.7.2) used the FIELDS dataset US.dat for the coordinates. Currenty this has been switched to use the maps package. } \seealso{ world } \examples{ # Draw map in device color # 3 US( col=3) } \keyword{hplot} % docclass is function % Converted by Sd2Rd version 1.21. fields/man/fields.Rd0000644000176200001440000002352314275214115014037 0ustar liggesusers%# %# fields is a package for analysis of spatial data written for %# the R software environment. %# Copyright (C) 2022 Colorado School of Mines %# 1500 Illinois St., Golden, CO 80401 %# Contact: Douglas Nychka, douglasnychka@gmail.edu, %# %# This program is free software; you can redistribute it and/or modify %# it under the terms of the GNU General Public License as published by %# the Free Software Foundation; either version 2 of the License, or %# (at your option) any later version. %# This program is distributed in the hope that it will be useful, %# but WITHOUT ANY WARRANTY; without even the implied warranty of %# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the %# GNU General Public License for more details. %# %# You should have received a copy of the GNU General Public License %# along with the R software environment if not, write to the Free Software %# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA %# or see http://www.r-project.org/Licenses/GPL-2 %##END HEADER %##END HEADER \name{fields} \alias{fields-package} \alias{fields} \title{ fields - tools for spatial data } \description{ \code{fields} is a collection of functions for curve and function fitting with an emphasis on spatial data and spatial statistics. It was developed over 20+ years to provide easy to use but sophisticated tools for analyzing spatial data, particularly that encountered in the environmental sciences. For the impatient users, jump to the examples below to see how easy this is use. Please send bugs and questions to Doug Nychka, nychka@mines.edu. Positive comments are also welcome! The major methods implemented include cubic and thin plate splines, universal Kriging and Kriging for large data sets. A more modern framework for Kriging is spatial process estimation with covariance parameters determined by maximum likelihood and the uncertainty derived from assumptions of a Gaussian process. Throughout we try to include reasonable defaults in functions that reflect our experience with analyzing spatial data. For example, the Matern covariance function is the default choice for the main spatial method. A key feature of this package is any covariance function implemented in R code can be used for spatial prediction through the spatial functions. Another important feature is that fields will take advantage of compactly supported covariance functions in a seamless way through the spam package. See \code{library( help=fields)} for a listing of all the fields contents. We also recommend the thoughtful vignette created by Ashton Weins, Mitchell Krock, and Emma Lilly (\code{fieldsVignette.pdf}) in the \href{https://github.com/dnychka/fieldsRPackage}{fields github repository}. \code{fields} strives to have readable and tutorial code. Take a look at the source code for \code{mKrig} to see how things work "under the hood". E.g. how a linear algebra computation is overloaded to handle sparse matrices and how an output object is built up sequentially throughout a computation. The \code{fields} source code is liberally commented. Unfortunately on loading this package, R will strip comments from the source for efficiency. You can go to \href{https://cran.r-project.org/package=fields}{CRAN fields page} to download the latest "tarball" ( aka Package Source) and unzip to get code with comments. We also keep the most recent version of this package at the \href{https://github.com/dnychka/fieldsRPackage}{fields github repository}. and for commented source go to the the subdirectory \code{fields/src}. This may be a more recent version than what is posted to CRAN. } \details{ \strong{Major methods} \itemize{ \item \code{\link{spatialProcess}} An easy to use method that fits a spatial process model ( e.g. Kriging) but also estimates the key spatial parameters: nugget variance, sill variance and range by maximum likelihood. Default covariance model is a Matern covariance function. This function and related functions called by this are the core methods in fields and have much flexibility. \code{\link{spatialProcess}} allows one to supply a covariance function that is written in native R code. See (\code{\link{stationary.cov}}) that includes several families of covariances including the Matern and several distance metrics including great circle distance . \code{\link{sim.spatialProcess}} and \code{\link{simLocal.spatialProcess}} provide "one liners"" for conditional simulation of the fitted surface. \item \code{\link{Tps}} Thin Plate spline regression including GCV and REML estimates for the smoothing parameter. For moderate size data sets as a first look we use \code{Tps} all the time. See also \code{\link{fastTps}} for an approximate method to handle very large numbers of spatial locations \item \code{\link{sreg}} , \code{\link{splint}} Fast 1-D cubic smoothing splines and interpolating splines, a workhorse algorithm for more EDA and more complicated methods. \item \code{\link{mKrig}} (micro Krig) Efficient Universal Kriging and Gaussian process function, that can take advantage of sparse covariance functions and is the core algorithm called by optimization functions and for spatial predictio. \item \code{\link{QTps}} A easy to use extension of thin plate splines for quantile and robust surface fitting. \item \code{\link{mKrigMLEGrid}} and \code{\link{mKrigMLEJoint}} for maximum likelihood estimates of covariance parameters. These functions also handle replicate fields, assumed to be independent realizations, at the same locations and can also take any covariate function function written in R following the \code{fields} format } % end itemize \strong{Other noteworthy functions} \itemize{ \item \code{\link{vgram}} and \code{\link{vgram.matrix}} find variograms for spatial data (and with temporal replications. \item \code{\link{cover.design}} Generates space-filling designs where the distance function is expresed in R code. \item Many convenient functions for working with image data and rationally (well, maybe reasonably) creating and placing a color scale on plots: \code{\link{as.image}}, \code{\link{imagePlot}}, \code{bubblePlot}, \code{ \link{drape.plot}}, \code{\link{quilt.plot}} \code{\link{add.image}}, \code{\link{crop.image}}, \code{\link{half.image}}, \code{\link{average.image}}, \code{\link{designer.colors}}, \code{\link{color.scale}}, \code{\link{in.poly}} See also \code{\link{grid.list}} for how fields works with grids and \code{\link{US}} and \code{\link{world}} for adding a map quickly. } \strong{ Generic functions that support the methods} \code{plot} - diagnostic plots of fit \cr \code{summary}- statistical summary of fit \cr \code{print}- shorter version of summary \cr \code{\link{surface}}- graphical display of fitted surface \cr \code{predict}- evaluation fit at arbitrary points \cr \code{\link{predictSE}}- prediction standard errors at arbitrary points. \cr \code{\link{sim.rf}}- Simulate a random fields on a 2-d grid. } % end details \section{Getting Started}{ Try some of the examples from help files for \code{\link{spatialProcess}} or \code{\link{Tps}}. } \section{\strong{Some fields datasets}}{ \itemize{ \item \code{\link{CO2}} Global satelite CO2 concentrations (simulated field) \item \code{\link{COmonthlyMet}} Monthly mean temperatures and precip for Colorado \item \code{\link{glacier}} An elevation dataset of a glacier also used by the applied math community to test interpolation methods. \item \code{\link{lennon}} Image of John Lennon \item \code{\link{NorthAmericanRainfall}} 50+ year average and trend for summer rainfall at 1700+ stations. \item \code{\link{ozone2}} Daily max 8 hour ozone concentrations for the US midwest for summer 1987. \item \code{\link{PRISMelevation}} Digital elevations for the continental US at approximately 4km resolution \item \code{\link{rat.diet}} Small paired study on rat food intake over time. \item \code{\link{RCMexample}} Regional climate model output \item \code{\link{RMelevation}} Digital elevations for the Rocky Mountain Empire \item \code{\link{WorldBankCO2}} Demographic and carbon emission data for 75 countries and for 1999. } } \section{\strong{DISCLAIMER:}}{ The authors can not guarantee the correctness of any function or program in this package. } \examples{ # some air quality data, daily surface ozone measurements for # the Midwest: data(ozone2) s<-ozone2$lon.lat y<- ozone2$y[16,] # June 18, 1987 # quick plot of spatial data with map bubblePlot( s,y) US( add=TRUE) # add US map # fitting a thin plate spline surface (always a good place to # start). Here the default smoothing (aka lambda) found by cross-validation fit0<- Tps(s,y) # fits a GCV thin plate smoothing spline surface to ozone measurements. # Hey, it does not get any easier than this! summary(fit0) #diagnostic summary of the fit set.panel(2,2) plot(fit0) # four diagnostic plots of fit and residuals. # quick plot of predicted surface set.panel() surface(fit0) # contour/image plot of the fitted surface # see also predictSurface for more control over the evaluation grid # US( add=TRUE, col="magenta", lwd=2) # US map overlaid title("Daily max 8 hour ozone in PPB, June 18th, 1987") #### fit2<- spatialProcess( s,y) # a "Kriging" model. The covariance defaults to a Matern # with smoothness 1.0. # the nugget, sill and range parameters are found by maximum likelihood # summary, plot, and surface also work for \code{fit2} ! surface(fit2) # contour/image plot of the fitted surface US( add=TRUE, col="magenta", lwd=2) # US map overlaid title("Daily max 8 hour ozone in PPB, June 18th, 1987") \dontrun{ # And 20 approximate conditional draws of the spatial field on a grid # with uncertainty in the 120PPB contour look<- simLocal.spatialProcess(fit2, M=20) for( k in 1:20){ contour( look$x, look$y, look$z[,,k], add=TRUE, level=c(120), col="white", drawlabels=FALSE) } } } \keyword{datasets} fields/man/world.Rd0000644000176200001440000000372114275214115013716 0ustar liggesusers%# %# fields is a package for analysis of spatial data written for %# the R software environment. %# Copyright (C) 2022 Colorado School of Mines %# 1500 Illinois St., Golden, CO 80401 %# Contact: Douglas Nychka, douglasnychka@gmail.edu, %# %# This program is free software; you can redistribute it and/or modify %# it under the terms of the GNU General Public License as published by %# the Free Software Foundation; either version 2 of the License, or %# (at your option) any later version. %# This program is distributed in the hope that it will be useful, %# but WITHOUT ANY WARRANTY; without even the implied warranty of %# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the %# GNU General Public License for more details. %# %# You should have received a copy of the GNU General Public License %# along with the R software environment if not, write to the Free Software %# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA %# or see http://www.r-project.org/Licenses/GPL-2 %##END HEADER %##END HEADER \name{world} \alias{world} \alias{world.color} \alias{in.land.grid} \alias{world.land} \title{Plot of the world} \description{ Plots quickly, medium resolution outlines of large land masses. This is a simple wrapper for the map function from the maps package. } \usage{ world(...) world.land( ...) world.color( ... ) in.land.grid(...) } \arguments{ \item{\dots}{Same arguments used by the \code{map} function from the maps package.} } \details{ See the longstanding \code{maps} package for documentation on this function. The functions world.land, world.color and in.land.grid have been depreciated but can be recovered from versions of fields 6.7.1 or older. } \seealso{US, in.poly, in.poly.grid} \examples{ \dontrun{ world() # add the US US( add=TRUE,col="blue") world( fill=TRUE) # land filled in black ## Western Europe world( xlim=c(-10,18),ylim=c(36,60),fill=TRUE, col="darkgreen", border="green1") } } \keyword{hplot} % docclass is function fields/man/transformx.Rd0000644000176200001440000000467414275214115015002 0ustar liggesusers%# %# fields is a package for analysis of spatial data written for %# the R software environment. %# Copyright (C) 2022 Colorado School of Mines %# 1500 Illinois St., Golden, CO 80401 %# Contact: Douglas Nychka, douglasnychka@gmail.edu, %# %# This program is free software; you can redistribute it and/or modify %# it under the terms of the GNU General Public License as published by %# the Free Software Foundation; either version 2 of the License, or %# (at your option) any later version. %# This program is distributed in the hope that it will be useful, %# but WITHOUT ANY WARRANTY; without even the implied warranty of %# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the %# GNU General Public License for more details. %# %# You should have received a copy of the GNU General Public License %# along with the R software environment if not, write to the Free Software %# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA %# or see http://www.r-project.org/Licenses/GPL-2 %##END HEADER %##END HEADER \name{transformx} \alias{transformx} \title{ Linear transformation } \description{ Linear transformation of each column of a matrix. There are several choices of the type of centering and scaling. } \usage{ transformx (x, scale.type = "unit.sd", x.center, x.scale) } \arguments{ \item{x}{ Matrix with columns to be transformed. } \item{scale.type}{ Type of transformation the default is "unit.sd": subtract the mean and divide by the standard deviation. Other choices are "unscaled" (do nothing), "range" (transform to [0,1]),"user" (subtract a supplied location and divide by a scale). } \item{x.center}{ A vector of centering values to subtract from each column. } \item{x.scale}{ A vector of scaling values to subtract from each column. } } \value{ A matrix whose columns have between transformed. This matrix also has the attributes: scale.type, x.center and y.center with the transformation information. } \details{ After deciding what the centering and scaling values should be for each column of x, this function just calls the standard utility scale. This function was created partly to attach the transformation information as attributes to the transformed matrix. It is used in Krig, cover.design, krig.image etc. to transform the independent variables. } \seealso{ scale } \examples{ # newx<-transformx( ChicagoO3$x, scale.type="range") } \keyword{manip} % docclass is function % Converted by Sd2Rd version 1.21. fields/man/colorbar.plot.Rd0000644000176200001440000001221514275214115015345 0ustar liggesusers%# %# fields is a package for analysis of spatial data written for %# the R software environment. %# Copyright (C) 2022 Colorado School of Mines %# 1500 Illinois St., Golden, CO 80401 %# Contact: Douglas Nychka, douglasnychka@gmail.edu, %# %# This program is free software; you can redistribute it and/or modify %# it under the terms of the GNU General Public License as published by %# the Free Software Foundation; either version 2 of the License, or %# (at your option) any later version. %# This program is distributed in the hope that it will be useful, %# but WITHOUT ANY WARRANTY; without even the implied warranty of %# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the %# GNU General Public License for more details. %# %# You should have received a copy of the GNU General Public License %# along with the R software environment if not, write to the Free Software %# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA %# or see http://www.r-project.org/Licenses/GPL-2 %##END HEADER %##END HEADER \name{colorbar.plot} \alias{colorbar.plot} %- Also NEED an '\alias' for EACH other topic documented here. \title{ Adds color scale strips to an existing plot.} \description{ Adds one or more color scales in a horizontal orientation, vertical orientation to an existing plot. } \usage{ colorbar.plot(x, y, strip, strip.width = 0.1, strip.length = 4 * strip.width, zrange = NULL, adj.x = 0.5, adj.y = 0.5, col = tim.colors(256), horizontal = TRUE, ...) } \arguments{ \item{x}{x position of strip in user coordinates } \item{y}{y position of strip in user coordinates} \item{strip}{ Either a vector or matrix giving the values of the color strip(s). If a matrix then strips are assumed to be the columns. } \item{strip.width}{ Width of strip as a fraction of the plotting region. } \item{strip.length}{ Length of strip as a function of the plotting region. Default is a pleasing 8 times width. } \item{zrange}{If a vector these are the common limits used for assigning the color scale. Default is to use the range of values in strip. If a two column matrix, rows are used as the limits for each strip.} \item{adj.x}{ Location of strip relative to x coordinate. Most common values are .5 (centered), 0 (right end at x) and 1 (left end of at x). These are the same conventions that are used for \code{adj} in positioning text.} \item{adj.y}{Location of strip relative to y coordinate. Same rules as \code{adj.x} } \item{col}{ Color table used for strip. Default is our favorite tim.colors being a scale from a dark blue to dark red.} \item{horizontal}{ If TRUE draws strips horizontally. If FALSE strips are drawn vertically } \item{\dots}{ optional graphical arguments that are passed to the \code{image} function. } } \details{ This function draws the strips as a sequence of image plots added to the existing plot. The main work is in creating a grid ( x,y) for the image that makes sense when superimposed on the plot. Note that although the columns of strip are considered as separate strips these can be oriented either horizontally or vertically based on the value of \code{horizontal}. The rows of zrange are essentially the \code{zlim} argument passed to the \code{image} function when each strip is drawn. Don't forget to use \code{locator} to interactively determine positions. \code{text} can be used to label points neatly in conjunction with setting adj.x and adj.y. Although this function is inefficient for placing images at arbitrary locations on a plot the code can be easily adapted to do this. This function was created to depict univariate posterior distribution on a map. The values are quantiles of the distribution and the strips when added under a common color scale give an overall impression of location and scale for several distributions. } \author{Doug Nychka} \seealso{ image.plot, arrow.plot, add.image} \examples{ # set up a plot but don't plot points and no "box" plot( 1:10, (1:10)*10, type="n", bty="n") # of course this could be anything y<- cbind( 1:15, (1:15)+25) colorbar.plot( 2.5, 30, y) points( 2.5,30, pch="+", cex=2, adj=.5) # note that strip is still in 1:8 aspect even though plot has very # different ranges for x and y. # adding legend using image.plot zr<- range( c( y)) image.plot( legend.only=TRUE, zlim= zr) # see help(image.plot) to create more room in margin etc. zr<- rbind( c(1,20), c(1,100)) # separate ranges for columns of y. colorbar.plot( 5, 70, y, adj.x=0, zrange= zr) # some reference lines to show placement xline( 5, lty=2) # strip starts at x=5 yline(70, lty=2) # strip is centered around y=7 (because adj.y=.5 by default) # many strips on common scale. y<- matrix( 1:200, ncol=10) colorbar.plot( 2, 75, y, horizontal=FALSE, col=rainbow(256)) # Xmas strip y<- cbind( rep( c(1,2),10)) y[15] <- NA # NA's should work colorbar.plot( 6, 45, y, adj.y=1,col=c("red", "green")) text(6,48,"Christmas strip", cex=2) # lennon thumbnail # there are better ways to this ... see add.image for example. data( lennon) colorbar.plot( 7.5,22, lennon, strip.width=.25, strip.length=.25, col=grey(seq( 0,1,,256))) } \keyword{ hplot }% at least one, from doc/KEYWORDS fields/man/Tps.Rd0000644000176200001440000005210414453561142013337 0ustar liggesusers%# %# fields is a package for analysis of spatial data written for %# the R software environment. %# Copyright (C) 2022 Colorado School of Mines %# 1500 Illinois St., Golden, CO 80401 %# Contact: Douglas Nychka, douglasnychka@gmail.edu, %# %# This program is free software; you can redistribute it and/or modify %# it under the terms of the GNU General Public License as published by %# the Free Software Foundation; either version 2 of the License, or %# (at your option) any later version. %# This program is distributed in the hope that it will be useful, %# but WITHOUT ANY WARRANTY; without even the implied warranty of %# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the %# GNU General Public License for more details. %# %# You should have received a copy of the GNU General Public License %# along with the R software environment if not, write to the Free Software %# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA %# or see http://www.r-project.org/Licenses/GPL-2 %##END HEADER %##END HEADER \name{Tps} \alias{Tps} \alias{fastTps} \title{ Thin plate spline regression } \description{ Fits a thin plate spline surface to irregularly spaced data. The smoothing parameter is chosen as a default by generalized cross-validation. The assumed model is additive Y = f(X) +e where f(X) is a d dimensional surface. } \usage{ Tps(x, Y, m = NULL, p = NULL, scale.type = "range", lon.lat = FALSE, miles = TRUE, method = "GCV", GCV = TRUE, ...) fastTps(x, Y, m = NULL, p = NULL, aRange, lon.lat = FALSE, find.trA = FALSE, REML = FALSE,theta=NULL, ...) } \arguments{ %To be helpful, a more complete list of arguments are described that are the %same as those for the Krig function. \item{x}{ Matrix of independent variables. Each row is a location or a set of independent covariates. } \item{Y}{ Vector of dependent variables. } \item{m}{ A polynomial function of degree (m-1) will be included in the model as the drift (or spatial trend) component. Default is the value such that 2m-d is greater than zero where d is the dimension of x. } \item{p}{ Polynomial power for Wendland radial basis functions. Default is 2m-d where d is the dimension of x. } \item{scale.type}{ The independent variables and knots are scaled to the specified scale.type. By default the scale type is "range", whereby the locations are transformed to the interval (0,1) by forming (x-min(x))/range(x) for each x. Scale type of "user" allows specification of an x.center and x.scale by the user. The default for "user" is mean 0 and standard deviation 1. Scale type of "unscaled" does not scale the data. } \item{aRange}{The tapering range that is passed to the Wendland compactly supported covariance. The covariance (i.e. the radial basis function) is zero beyond range aRange. The larger aRange the closer this model will approximate the standard thin plate spline.} \item{lon.lat}{If TRUE locations are interpreted as lognitude and latitude and great circle distance is used to find distances among locations. The aRange scale parameter for \code{fast.Tps} (setting the compact support of the Wendland function) in this case is in units of miles (see example and caution below). } \item{method}{ Determines what "smoothing" parameter should be used. The default is to estimate standard GCV Other choices are: GCV.model, GCV.one, RMSE, pure error and REML. The differences are explained in the Krig help file.} \item{GCV}{If TRUE the decompositions are done to efficiently evaluate the estimate, GCV function and likelihood at multiple values of lambda. } \item{miles}{If TRUE great circle distances are in miles if FALSE distances are in kilometers} \item{find.trA}{If TRUE will estimate the effective degrees of freedom using a simple Monte Carlo method (random trace). This will add to the computational burden by approximately \code{NtrA} solutions of the linear system but the cholesky decomposition is reused.} \item{REML}{If TRUE find the MLE for lambda using restricted maximum likelihood instead of the full version. } \item{theta}{ Same as aRange.} \item{\dots}{For \code{Tps} any argument that is valid for the \code{Krig} function. Some of the main ones are listed below. For \code{fastTps} any argument that is suitable for the \code{mKrig} function see help on mKrig for these choices. The most common would be \code{lambda} fixing the value of this parameter (tau^2/sigma^2), \code{Z} linear covariates or \code{ mKrig.args= list( m=1)} setting the regression model to be just a constant function. Arguments for Tps: \describe{ \item{lambda}{ Smoothing parameter that is the ratio of the error variance (tau**2) to the scale parameter of the covariance function. If omitted this is estimated by GCV. } \item{Z}{Linear covariates to be included in fixed part of the model that are distinct from the default low order polynomial in \code{x}} \item{df}{ The effective number of parameters for the fitted surface. Conversely, N- df, where N is the total number of observations is the degrees of freedom associated with the residuals. This is an alternative to specifying lambda and much more interpretable.} \item{cost}{ Cost value used in GCV criterion. Corresponds to a penalty for increased number of parameters. The default is 1.0 and corresponds to the usual GCV.} \item{weights}{ Weights are proportional to the reciprocal variance of the measurement error. The default is no weighting i.e. vector of unit weights. } \item{nstep.cv}{ Number of grid points for minimum GCV search. } \item{x.center}{ Centering values are subtracted from each column of the x matrix. Must have scale.type="user".} \item{x.scale}{ Scale values that divided into each column after centering. Must have scale.type="user".} \item{sigma}{Scale factor for covariance. } \item{tau2}{ Variance of errors or if weights are not equal to 1 the variance is tau**2/weight.} \item{verbose}{ If true will print out all kinds of intermediate stuff. } \item{mean.obj}{ Object to predict the mean of the spatial process. } \item{sd.obj}{ Object to predict the marginal standard deviation of the spatial process. } \item{null.function}{An R function that creates the matrices for the null space model. The default is fields.mkpoly, an R function that creates a polynomial regression matrix with all terms up to degree m-1. (See Details) } \item{offset}{ The offset to be used in the GCV criterion. Default is 0. This would be used when Krig/Tps is part of a backfitting algorithm and the offset has to be included to reflect other model degrees of freedom. } } } } \value{ A list of class Krig. This includes the fitted values, the predicted surface evaluated at the observation locations, and the residuals. The results of the grid search minimizing the generalized cross validation function are returned in gcv.grid. Note that the GCV/REML optimization is done even if lambda or df is given. Please see the documentation on Krig for details of the returned arguments. } \details{ \strong{Overview} This is the classic nonparametric curve/surface estimate pioneered in statistics by Grace Wahba. The computational algorithm is based around a QR decomposition followed by an eigen decomposition on a reduced matrix derived from the spline radial basis functions. This insures a stable computation -- basically bombproof -- but is not the fastest. See the function \link{mKrig} and examples for fitting a thin plate spline using \link{spatialProcess} that uses a different linear algebra approach. This is implemented in the "fast" version albeit approximate version to exploit sparse matrices. This function also works for just a single dimension and reproduces the well known cubic smoothing spline for \code{ m ==2} Finally we note that a thin plate spline is a limiting case of a Gaussian process estimate as the range parameter in the Matern family increases to infinity. (Kriging). A "fast" version of this function uses a compactly supported Wendland covariance and sparse linear algebra for handling larger datta sets. Although a good approximation to Tps for sufficiently large aRange its actual form is very different from the textbook thin-plate definition. The user will see that \code{fastTps} is largely a wrapper for a call to \code{spatialProcess} with the Wendland covariance function. \strong{Background on the thin plate spline function, Tps} A thin plate spline is the result of minimizing the residual sum of squares subject to a constraint that the function have a certain level of smoothness (or roughness penalty). Roughness is quantified by the integral of squared m-th order derivatives. For one dimension and m=2 the roughness penalty is the integrated square of the second derivative of the function. For two dimensions the roughness penalty is the integral of (Dxx(f))**22 + 2(Dxy(f))**2 + (Dyy(f))**22 (where Duv denotes the second partial derivative with respect to u and v.) Besides controlling the order of the derivatives, the value of m also determines the base polynomial that is fit to the data. The degree of this polynomial is (m-1). The smoothing parameter controls the amount that the data is smoothed. In the usual form this is denoted by lambda, the Lagrange multiplier of the minimization problem. Although this is an awkward scale, lambda = 0 corresponds to no smoothness constraints and the data is interpolated. lambda=infinity corresponds to just fitting the polynomial base model by ordinary least squares. This estimator is implemented by passing the right generalized covariance function based on radial basis functions to the more general function Krig. One advantage of this implementation is that once a Tps/Krig object is created the estimator can be found rapidly for other data and smoothing parameters provided the locations remain unchanged. This makes simulation within R efficient (see example below). Tps does not currently support the knots argument where one can use a reduced set of basis functions. This is mainly to simplify the code and a good alternative using knots would be to use a valid covariance from the Matern family and a large range parameter. \strong{Using a great circle distance function} The option to use great circle distance to define the radial basis functions (\code{lon.lat=TRUE}) is very useful for small geographic domains where the spherical geometry is well approximated by a plane. However, for large domains the spherical distortion be large enough that the radial basis functions no longer define a positive definite system and Tps will report a numerical error. An alternative is to switch to a three dimensional thin plate spline with the locations being the direction cosines. This will give approximate great circle distances for locations that are close and also the numerical methods will always have a positive definite matrices. There are other radial basis functions that are specific to a spherical geometry but these are not implemented in fields. Here is an example using this idea for \code{RMprecip} and also some examples of building grids and evaluating the Tps results on them: \preformatted{ # a useful function: dircos<- function(x1){ coslat1 <- cos((x1[, 2] * pi)/180) sinlat1 <- sin((x1[, 2] * pi)/180) coslon1 <- cos((x1[, 1] * pi)/180) sinlon1 <- sin((x1[, 1] * pi)/180) cbind(coslon1*coslat1, sinlon1*coslat1, sinlat1)} # fit in 3-d to direction cosines out<- Tps(dircos(RMprecip$x),RMprecip$y) xg<-make.surface.grid(fields.x.to.grid(RMprecip$x)) fhat<- predict( out, dircos(xg)) # coerce to image format from prediction vector and grid points. out.p<- as.surface( xg, fhat) surface( out.p) # compare to the automatic out0<- Tps(RMprecip$x,RMprecip$y, lon.lat=TRUE) surface(out0) } The function \code{fastTps} is really a convenient wrapper function that calls \code{spatialProcess} with a suitable Wendland covariance function. This means one can use all the additional functions for prediction and simulation built for the \code{spatialProcess} and \code{mKrig} objects. Some care needs to exercised in specifying the support \code{aRange} -- a Goldilocks problem -- where aRange is large enough so that every location has a reasonable number (say 10 or more ) of neighboring locations that have non-zero covariances but also the number of neighbors is not so large that the sparsity of the covariance matrix is compromised. To figure out the neighborhood pattern are the spatial locations one can use the function \code{nearest.dist}, sparse matrix format, and \code{table} function. \preformatted{ set.seed(222) s<- cbind( runif(1e4),runif(1e4)) look<- nearest.dist(s,s, delta = .03) look<- spam2spind(look) stats( table( look$ind[,1])) } Here one has asummary of the number of nearest neighbors within a distance of .03 for these (randomly generated) locations. I see a minimum of 7 for at least one location so aRange should be larger than .03. Trial and error with different deltas can lead to a better choice. Note that unlike Tps the locations are not scaled to unit range and this can cause havoc in smoothing problems with variables in very different units. So rescaling the locations \code{ x<- scale(x)} is a good idea for putting the variables on a common scale for smoothing. A conservative rule of thumb is to make \code{aRange} large enough so that about 50 nearest neighbors are within this distance for every observation location. This function does have the potential to approximate estimates of Tps for very large spatial data sets. See \code{wendland.cov} and help on the SPAM package, and the friendly spind format for more background. Also, the function \code{predictSurface.fastTps} has been made more efficient for the case of k=2 and m=2 -- a common choice for parameters. } \section{References}{ See "Nonparametric Regression and Generalized Linear Models" by Green and Silverman. See "Additive Models" by Hastie and Tibshirani. See Wahba, Grace. "Spline models for observational data." Society for industrial and applied mathematics, 1990. } \seealso{ \code{\link{Krig}}, \code{\link{mKrig}}, \code{\link{spatialProcess}}, \code{\link{Tps.cov}} \code{\link{sim.spatialProcess}}, \code{\link{summary.Krig}}, \code{\link{predict.Krig}}, \code{\link{predictSE.Krig}}, \code{\link{predictSurface}}, \code{\link{predictSurface.fastTps}}, \code{\link{plot.Krig}}, \code{\link{surface.Krig}}, \code{\link{sreg}} } \examples{ #2-d example data(ozone2) x<- ozone2$lon.lat y<- ozone2$y[16,] fit<- Tps(x,y) # fits a surface to ozone measurements. set.panel(2,2) plot(fit) # four diagnostic plots of fit and residuals. set.panel() # summary of fit and estiamtes of lambda the smoothing parameter summary(fit) surface( fit) # Quick image/contour plot of GCV surface. # NOTE: the predict function is quite flexible: look<- predict( fit, lambda=2.0) # evaluates the estimate at lambda =2.0 _not_ the GCV estimate # it does so very efficiently from the Krig fit object. look<- predict( fit, df=7.5) # evaluates the estimate at the lambda values such that # the effective degrees of freedom is 7.5 # compare this to fitting a thin plate spline with # lambda chosen so that there are 7.5 effective # degrees of freedom in estimate # Note that the GCV function is still computed and minimized # but the lambda values used correpsonds to 7.5 df. fit1<- Tps(x, y,df=7.5) set.panel(2,2) plot(fit1) # four diagnostic plots of fit and residuals. # GCV function (lower left) has vertical line at 7.5 df. set.panel() # The basic matrix decompositions are the same for # both fit and fit1 objects. # predict( fit1) is the same as predict( fit, df=7.5) # predict( fit1, lambda= fit$lambda) is the same as predict(fit) # predict onto a grid that matches the ranges of the data. out.p<-predictSurface( fit) imagePlot( out.p) # the surface function (e.g. surface( fit)) essentially combines # the two steps above # predict at different effective # number of parameters out.p<-predictSurface( fit, df=10) \dontrun{ # predicting on a grid along with a covariate data( COmonthlyMet) # predicting average daily minimum temps for spring in Colorado # NOTE to create an 4km elevation grid: # data(PRISMelevation); CO.elev1 <- crop.image(PRISMelevation, CO.loc ) # then use same grid for the predictions: CO.Grid1<- CO.elev1[c("x","y")] obj<- Tps( CO.loc, CO.tmin.MAM.climate, Z= CO.elev) out.p<-predictSurface( obj, CO.Grid, ZGrid= CO.elevGrid) imagePlot( out.p) US(add=TRUE, col="grey") contour( CO.elevGrid, add=TRUE, levels=c(2000), col="black") } \dontrun{ #A 1-d example with confidence intervals out<-Tps( rat.diet$t, rat.diet$trt) # lambda found by GCV out plot( out$x, out$y) xgrid<- seq( min( out$x), max( out$x),,100) fhat<- predict( out,xgrid) lines( xgrid, fhat,) SE<- predictSE( out, xgrid) lines( xgrid,fhat + 1.96* SE, col="red", lty=2) lines(xgrid, fhat - 1.96*SE, col="red", lty=2) # # compare to the ( much faster) B spline algorithm # sreg(rat.diet$t, rat.diet$trt) # Here is a 1-d example with 95 percent CIs where sreg would not # work: # sreg would give the right estimate here but not the right CI's x<- seq( 0,1,,8) y<- sin(3*x) out<-Tps( x, y) # lambda found by GCV plot( out$x, out$y) xgrid<- seq( min( out$x), max( out$x),,100) fhat<- predict( out,xgrid) lines( xgrid, fhat, lwd=2) SE<- predictSE( out, xgrid) lines( xgrid,fhat + 1.96* SE, col="red", lty=2) lines(xgrid, fhat - 1.96*SE, col="red", lty=2) } # More involved example adding a covariate to the fixed part of model \dontrun{ set.panel( 1,3) # without elevation covariate out0<-Tps( RMprecip$x,RMprecip$y) surface( out0) US( add=TRUE, col="grey") # with elevation covariate out<- Tps( RMprecip$x,RMprecip$y, Z=RMprecip$elev) # NOTE: out$d[4] is the estimated elevation coefficient # it is easy to get the smooth surface separate from the elevation. out.p<-predictSurface( out, drop.Z=TRUE) surface( out.p) US( add=TRUE, col="grey") # and if the estimate is of high resolution and you get by with # a simple discretizing -- does not work in this case! quilt.plot( out$x, out$fitted.values) # # the exact way to do this is evaluate the estimate # on a grid where you also have elevations # An elevation DEM from the PRISM climate data product (4km resolution) data(RMelevation) grid.list<- list( x=RMelevation$x, y= RMelevation$y) fit.full<- predictSurface( out, grid.list, ZGrid= RMelevation) # this is the linear fixed part of the second spatial model: # lon,lat and elevation fit.fixed<- predictSurface( out, grid.list, just.fixed=TRUE, ZGrid= RMelevation) # This is the smooth part but also with the linear lon lat terms. fit.smooth<-predictSurface( out, grid.list, drop.Z=TRUE) # set.panel( 3,1) fit0<- predictSurface( out0, grid.list) image.plot( fit0) title(" first spatial model (w/o elevation)") image.plot( fit.fixed) title(" fixed part of second model (lon,lat,elev linear model)") US( add=TRUE) image.plot( fit.full) title("full prediction second model") set.panel() } ### ### fast Tps # m=2 p= 2m-d= 2 # # Note: aRange = 3 degrees is a very generous taper range. # Use some trial aRange value with rdist.nearest to determine a # a useful taper. Some empirical studies suggest that in the # interpolation case in 2 d the taper should be large enough to # about 20 non zero nearest neighbors for every location. out2<- fastTps( RMprecip$x,RMprecip$y,m=2, aRange=3.0, profileLambda=FALSE) # note that fastTps produces a object of classes spatialProcess and mKrig # so one can use all the # the overloaded functions that are defined for these classes. # predict, predictSE, plot, sim.spatialProcess # summary of what happened note estimate of effective degrees of # freedom # profiling on lambda has been turned off to make this run quickly # but it is suggested that one examines the the profile likelihood over lambda print( out2) \dontrun{ set.panel( 1,2) surface( out2) # # now use great circle distance for this smooth # Here "aRange" for the taper support is the great circle distance in degrees latitude. # Typically for data analysis it more convenient to think in degrees. A degree of # latitude is about 68 miles (111 km). # fastTps( RMprecip$x,RMprecip$y,m=2, lon.lat=TRUE, aRange= 210 ) -> out3 print( out3) # note the effective degrees of freedom is different. surface(out3) set.panel() } \dontrun{ # # simulation reusing Tps/Krig object # fit<- Tps( rat.diet$t, rat.diet$trt) true<- fit$fitted.values N<- length( fit$y) temp<- matrix( NA, ncol=50, nrow=N) tau<- fit$tauHat.GCV for ( k in 1:50){ ysim<- true + tau* rnorm(N) temp[,k]<- predict(fit, y= ysim) } matplot( fit$x, temp, type="l") } # #4-d example fit<- Tps(BD[,1:4],BD$lnya,scale.type="range") # plots fitted surface and contours # default is to hold 3rd and 4th fixed at median values surface(fit) } \keyword{smooth} % docclass is function % Converted by Sd2Rd version 1.21. fields/man/image.cov.Rd0000644000176200001440000002177414275214115014447 0ustar liggesusers%# %# fields is a package for analysis of spatial data written for %# the R software environment. %# Copyright (C) 2022 Colorado School of Mines %# 1500 Illinois St., Golden, CO 80401 %# Contact: Douglas Nychka, douglasnychka@gmail.edu, %# %# This program is free software; you can redistribute it and/or modify %# it under the terms of the GNU General Public License as published by %# the Free Software Foundation; either version 2 of the License, or %# (at your option) any later version. %# This program is distributed in the hope that it will be useful, %# but WITHOUT ANY WARRANTY; without even the implied warranty of %# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the %# GNU General Public License for more details. %# %# You should have received a copy of the GNU General Public License %# along with the R software environment if not, write to the Free Software %# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA %# or see http://www.r-project.org/Licenses/GPL-2 %##END HEADER %##END HEADER \name{image.cov} \alias{stationary.image.cov} \alias{Exp.image.cov} \alias{Rad.image.cov} \alias{wendland.image.cov} \alias{matern.image.cov} \title{ Exponential, Matern and general covariance functions for 2-d gridded locations. } \description{ Given two sets of locations defined on a 2-d grid efficiently multiplies a cross covariance with a vector. The intermediate compuations (the setup) can also be used for fast simulation of the processes on a grid using the circulant embedding technique. } \usage{ stationary.image.cov(ind1, ind2, Y, cov.obj = NULL, setup = FALSE, grid, M=NULL,N=NULL,cov.function="stationary.cov", delta = NULL, cov.args = NULL, ...) Exp.image.cov(ind1, ind2, Y, cov.obj = NULL, setup = FALSE, grid, ...) Rad.image.cov(ind1, ind2, Y, cov.obj = NULL, setup = FALSE, grid, ...) matern.image.cov(ind1, ind2, Y, cov.obj = NULL, setup = FALSE, grid, M=NULL,N=NULL,aRange= 1.0, smoothness=.5, theta=NULL) wendland.image.cov(ind1, ind2, Y, cov.obj = NULL, setup = FALSE, grid, M = NULL, N = NULL, cov.args=NULL, ...) } \arguments{ \item{ind1}{ Matrix of indices for first set of locations this is a two column matrix where each row is the row/column index of the image element. If missing the default is to use all grid locations. } \item{ind2}{ Matrix of indices for second set of locations. If missing this is taken to be ind2. If ind1 is missing ind2 is coerced to be all grid locations. } \item{Y}{ Vector to multiply by the cross covariance matrix. Y must be the same locations as those referred to by ind2. } \item{cov.args}{Any additional arguments or parameters to the covariance function.} \item{cov.obj}{ A list with the information needed to do the multiplication by convolutions. This is usually found by using the returned list when setup=T. } \item{cov.function}{Name of the (stationary) covariance function.} \item{setup}{ If true do not do the multiplication but just return the covariance object required by this function. } \item{delta}{A distance that indicates the range of the covariance when it has compact support. For example this is the aRange parameter in the Wendland covariance.} \item{grid}{ A grid list giving the X and Y grids for the image. (See example below.) This is only required if setup is true. } \item{M}{ Size of x-grid used to compute multiplication (see notes on image.smooth for details) by the FFT. If NULL, the default for M is the largest power of 2 greater than or equal to 2*m where m is the length of the x component of the grid. This will give an exact result but smaller values of M will yield an approximate, faster result. } \item{N}{Size of y-grid used to compute multiplication by the FFT.} \item{aRange}{Scale parameter for Matern.} \item{theta}{Same as aRange.} \item{smoothness}{Smoothness parameter for Matern (.5=Exponential)} \item{\dots}{ Any arguments to pass to the covariance function in setting up the covariance object. This is only required if setup is TRUE. For \code{stationary.image.cov} one can include \code{V} a matrix reflecting a rotation and scaling of coordinates. See stationary.cov for details. } } \value{ A vector that is the multiplication of the cross covariance matrix with the vector Y. } \details{ This function was provided to do fast computations for large numbers of spatial locations and supports the conjugate gradient solution in krig.image. In doing so the observations can be irregular spaced but their coordinates must be 2-dimensional and be restricted to grid points. (The function as.image will take irregular, continuous coordinates and overlay a grid on them.) Returned value: If ind1 and ind2 are matrices where nrow(ind1)=m and nrow(ind2)=n then the cross covariance matrix, Sigma, is an mXn matrix (i,j) element is the covariance between the grid locations indexed at ind1[i,] and ind2[j,]. The returned result is Sigma multiplied by Y. Note that one can always recover the coordinates themselves by evaluating the grid list at the indices. E.g. If \code{x} and \code{y} are the grids for the X and Y dimensions, \code{cbind( x[ind1[,1]], y[ind1[,2]))} will give the coordinates associated with ind1. Clearly it is better just to work with ind1! Functional Form: Following the same form as Exp.cov stationary.cov for irregular locations, the covariance is defined as phi( D.ij) where D.ij is the Euclidean distance between x1[i,] and x2[j,] but having first been scaled by aRange. Specifically, D.ij = sqrt( sum.k (( x1[i,k] - x2[j,k]) /aRange[k])**2 ). See \code{Matern} for the version of phi for the Matern family. Note that if aRange is a scalar then this defines an isotropic covariance function. Implementation: This function does the multiplication on the full grid efficiently by a 2-d FFT. The irregular pattern in Y is handled by padding with zeroes and once that multiplication is done only the appropriate subset is returned. As an example assume that the grid is 100X100 let big.Sigma denote the big covariance matrix among all grid points ( If the parent grid is 100x100 then big.Sigma is 10K by 10K !) Here are the computing steps: temp<- matrix( 0, 100,100) temp[ ind2] <- Y temp2<- big.Sigma\%*\% temp temp2[ind1] Notice how much we pad with zeroes or at the end throw away! Here the matrix multiplication is effected through convolution/FFT tricks to avoid creating and multiplying big.Sigma explicitly. It is often faster to multiply the regular grid and throw away the parts we do not need then to deal directly with the irregular set of locations. Note: In this entire discussion Y is treated as vector. However if one has complete data then Y can also be interpreted as a image matrix conformed to correspond to spatial locations. See the last example for this distinction. } \seealso{ smooth.2d, as.image, krig.image, stationary.cov } \examples{ # multiply 2-d isotropic exponential with aRange=4 by a random vector junk<- matrix(rnorm(100*100), 100,100) cov.obj<- stationary.image.cov( setup=TRUE, grid=list(x=1:100,y=1:100),aRange=8) result<- stationary.image.cov(Y=junk,cov.obj=cov.obj) image( matrix( result, 100,100)) # NOTE that is also a smoother! # to do it again, no setup is needed # e.g. # junk2<- matrix(rnorm(100**2, 100,100)) # result2<- stationary.image.cov(Y=junk2, cov.obj=cov.obj) # generate a grid and set of indices based on discretizing the locations # in the precip dataset out<-as.image( RMprecip$y, x= RMprecip$x) ind1<- out$ind grid<- list( x= out$x, y=out$y) # # discretized x locations to use for comparison xd<- cbind( out$x[ out$ind[,1]], out$y[ out$ind[,2]] ) # setup to create cov.obj for exponential covariance with range= 1.25 cov.obj<- stationary.image.cov( setup=TRUE, grid=grid, aRange=1.25) # multiply covariance matrix by an arbitrary vector junk<- rnorm(nrow( ind1)) result<- stationary.image.cov( ind1, ind1, Y= junk,cov.obj=cov.obj) # The brute force way would be # result<- stationary.cov( xd, xd, aRange=1.25, C=junk) # or # result<- stationary.cov( xd, xd, aRange=1.25) %*% junk # both of these take much longer # evaluate the covariance between all grid points and the center grid point Y<- matrix(0,cov.obj$m, cov.obj$n) Y[32,32]<- 1 result<- stationary.image.cov( Y= Y,cov.obj=cov.obj) # covariance surface with respect to the grid point at (32,32) # # reshape "vector" as an image temp<- matrix( result, cov.obj$m,cov.obj$n) image.plot(cov.obj$grid$x,cov.obj$grid$y, temp) # or persp( cov.obj$grid$x,cov.obj$grid$y, temp) # check out the Matern grid<- list( x= seq(-105,-99,,64), y= seq( 40,45,,64)) cov.obj<- matern.image.cov( setup=TRUE, grid=grid, aRange=.55, smoothness=1.0) Y<- matrix(0,64,64) Y[16,16]<- 1 result<- matern.image.cov( Y= Y,cov.obj=cov.obj) temp<- matrix( result, cov.obj$m,cov.obj$n) image.plot( cov.obj$grid$x,cov.obj$grid$y, temp) # Note we have centered at the location (grid$x[16],grid$y[16]) for this case # using sim.rf to simulate an Matern field look<- sim.rf( cov.obj) image.plot( grid$x, grid$y, look) } \keyword{spatial} % docclass is function % Converted by Sd2Rd version 1.21. fields/man/Exponential.Rd0000644000176200001440000001306214275214115015054 0ustar liggesusers%# %# fields is a package for analysis of spatial data written for %# the R software environment. %# Copyright (C) 2022 Colorado School of Mines %# 1500 Illinois St., Golden, CO 80401 %# Contact: Douglas Nychka, douglasnychka@gmail.edu, %# %# This program is free software; you can redistribute it and/or modify %# it under the terms of the GNU General Public License as published by %# the Free Software Foundation; either version 2 of the License, or %# (at your option) any later version. %# This program is distributed in the hope that it will be useful, %# but WITHOUT ANY WARRANTY; without even the implied warranty of %# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the %# GNU General Public License for more details. %# %# You should have received a copy of the GNU General Public License %# along with the R software environment if not, write to the Free Software %# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA %# or see http://www.r-project.org/Licenses/GPL-2 %##END HEADER %##END HEADER \name{Exponential, Matern, Radial Basis} \alias{Exponential} \alias{Matern} \alias{Matern.cor.to.range} \alias{RadialBasis} \title{Covariance functions} \description{ Functional form of covariance function assuming the argument is a distance between locations. As they are defined here, they are in fact correlation functions. To set the marginal variance (sill) parameter, use the \code{sigma} argument in \code{mKrig} or \code{Krig}. To set the nugget variance, use te \code{tau2} argument in \code{mKrig} or \code{Krig}. } \usage{ Exponential(d, range = 1, alpha = 1/range, phi=1.0,theta = NULL) Matern(d , range = 1,alpha=1/range, smoothness = 0.5, nu= smoothness, phi=1.0) Matern.cor.to.range(d, nu, cor.target=.5, guess=NULL,...) RadialBasis(d,M,dimension, derivative = 0) } %- maybe also 'usage' for other objects documented here. \arguments{ \item{d}{ Vector of distances or for \code{Matern.cor.to.range} just a single distance. } \item{range}{ Range parameter default is one. Note that the scale can also be specified through the "aRange" scaling argument used in fields covariance functions) } \item{alpha}{1/range } \item{theta}{Same as alpha} \item{phi}{This parameter option is added to be compatible with older versions of fields and refers to the marginal variance of the process. e.g. \code{phi* exp( -d/aRange)} is the exponential covariance for points separated by distance and range aRange. Throughout fields this parameter is equivalent to sigma and it recommended that sigma be used. If one is simulating random fields. See the help on \code{\link{sim.rf}} for more details. } \item{smoothness}{ Smoothness parameter in Matern. Controls the number of derivatives in the process. Default is 1/2 corresponding to an exponential covariance.} \item{nu}{ Same as smoothness} \item{M}{Interpreted as a spline M is the order of the derivatives in the penalty.} \item{dimension}{Dimension of function} \item{cor.target}{Correlation used to match the range parameter. Default is .5.} \item{guess}{An optional starting guess for solution. This should not be needed.} \item{derivative}{If greater than zero finds the first derivative of this function.} \item{\dots}{Additional arguments to pass to the bisection search function.} } \details{ Exponential: exp( -d/range) Matern: con*(d**nu) * besselK(d , nu ) Matern covariance function transcribed from Stein's book page 31 nu==smoothness, alpha == 1/range GeoR parameters map to kappa==smoothness and phi == range check for negative distances \code{con} is a constant that normalizes the expression to be 1.0 when d=0. Matern.cor.to.range: This function is useful to find Matern covariance parameters that are comparable for different smoothness parameters. Given a distance \code{d}, smoothness \code{nu}, target correlation \code{cor.target} and range \code{aRange}, this function determines numerically the value of aRange so that \code{Matern( d, range=aRange, nu=nu) == cor.target} See the example for how this might be used. Radial basis functions: \preformatted{ C.m,d r**(2m-d) d- odd C.m,d r**(2m-d)ln(r) d-even } where C.m.d is a constant based on spline theory and r is the radial distance between points. See \code{radbas.constant} for the computation of the constant. } \value{ For the covariance functions: a vector of covariances. For Matern.cor.to.range: the value of the range parameter. } \references{ Stein, M.L. (1999) Statistical Interpolation of Spatial Data: Some Theory for Kriging. Springer, New York.} \author{Doug Nychka} \seealso{stationary.cov, stationary.image.cov, Wendland,stationary.taper.cov rad.cov} \examples{ # a Matern correlation function d<- seq( 0,10,,200) y<- Matern( d, range=1.5, smoothness=1.0) plot( d,y, type="l") # Several Materns of different smoothness with a similar correlation # range # find ranges for nu = .5, 1.0 and 2.0 # where the correlation drops to .1 at a distance of 10 units. r1<- Matern.cor.to.range( 10, nu=.5, cor.target=.1) r2<- Matern.cor.to.range( 10, nu=1.0, cor.target=.1) r3<- Matern.cor.to.range( 10, nu=2.0, cor.target=.1) # note that these equivalent ranges # with respect to this correlation length are quite different # due the different smoothness parameters. d<- seq( 0, 15,,200) y<- cbind( Matern( d, range=r1, nu=.5), Matern( d, range=r2, nu=1.0), Matern( d, range=r3, nu=2.0)) matplot( d, y, type="l", lty=1, lwd=2) xline( 10) yline( .1) } \keyword{spatial}% at least one, from doc/KEYWORDS fields/man/print.Krig.Rd0000644000176200001440000000325614275214115014621 0ustar liggesusers%# %# fields is a package for analysis of spatial data written for %# the R software environment. %# Copyright (C) 2022 Colorado School of Mines %# 1500 Illinois St., Golden, CO 80401 %# Contact: Douglas Nychka, douglasnychka@gmail.edu, %# %# This program is free software; you can redistribute it and/or modify %# it under the terms of the GNU General Public License as published by %# the Free Software Foundation; either version 2 of the License, or %# (at your option) any later version. %# This program is distributed in the hope that it will be useful, %# but WITHOUT ANY WARRANTY; without even the implied warranty of %# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the %# GNU General Public License for more details. %# %# You should have received a copy of the GNU General Public License %# along with the R software environment if not, write to the Free Software %# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA %# or see http://www.r-project.org/Licenses/GPL-2 %##END HEADER %##END HEADER \name{print.Krig} \alias{print.Krig} \title{ Print kriging fit results. } \description{ Prints the results from a fitting a spatial process estimate (Krig) } \usage{ \method{print}{Krig}(x,digits=4,...) } \arguments{ \item{x}{ Object from Krig function. } \item{digits}{ Number of significant digits in printed output. Default is 4. } \item{\dots}{ Other arguments to print.} } \value{ Selected summary results from Krig. } \seealso{ print, summary.Krig, Krig } \examples{ fit<- Krig(ChicagoO3$x,ChicagoO3$y, aRange=100) print(fit) # print the summary fit # this will work too } \keyword{spatial} % docclass is function % Converted by Sd2Rd version 1.21. fields/man/mKrig.Rd0000644000176200001440000005055014342276225013647 0ustar liggesusers%# %# fields is a package for analysis of spatial data written for %# the R software environment. %# Copyright (C) 2022 Colorado School of Mines %# 1500 Illinois St., Golden, CO 80401 %# Contact: Douglas Nychka, douglasnychka@gmail.edu, %# %# This program is free software; you can redistribute it and/or modify %# it under the terms of the GNU General Public License as published by %# the Free Software Foundation; either version 2 of the License, or %# (at your option) any later version. %# This program is distributed in the hope that it will be useful, %# but WITHOUT ANY WARRANTY; without even the implied warranty of %# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the %# GNU General Public License for more details. %# %# You should have received a copy of the GNU General Public License %# along with the R software environment if not, write to the Free Software %# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA %# or see http://www.r-project.org/Licenses/GPL-2 %##END HEADER %##END HEADER \name{mKrig} \alias{mKrig} \alias{predict.mKrig} \alias{mKrig.coef} \alias{mKrig.trace} \alias{print.mKrig} \alias{print.mKrigSummary} \alias{summary.mKrig} \alias{mKrigCheckXY} \title{"micro Krig" Spatial process estimate of a curve or surface, "kriging" with a known covariance function. } \description{ This is a simple version of the Krig function that is optimized for large data sets, sparse linear algebra, and a clear exposition of the computations. Lambda, the smoothing parameter must be fixed. This function is called higher level functions for maximum likelihood estimates of covariance paramters. } \usage{ mKrig(x, y, weights = rep(1, nrow(x)), Z = NULL, ZCommon=NULL, cov.function = "stationary.cov", cov.args = NULL, lambda = NA, m = 2, chol.args = NULL, find.trA = TRUE, NtrA = 20, iseed = NA, na.rm = FALSE, collapseFixedEffect = TRUE, tau = NA, sigma2 = NA, ...) \method{predict}{mKrig}( object, xnew=NULL,ynew=NULL, grid.list = NULL, derivative=0, Z=NULL,drop.Z=FALSE,just.fixed=FALSE, collapseFixedEffect = object$collapseFixedEffect, ...) \method{summary}{mKrig}(object, ...) \method{print}{mKrig}( x, digits=4,... ) \method{print}{mKrigSummary}( x, digits=4,... ) mKrig.coef(object, y, collapseFixedEffect=TRUE) mKrig.trace( object, iseed, NtrA) mKrigCheckXY(x, y, weights, Z, ZCommon, na.rm) } %- maybe also 'usage' for other objects documented here. \arguments{ \item{collapseFixedEffect}{ If replicated fields are given to mKrig (i.e. \code{y} has more than one column) there is the choice of estimating the fixed effect coefficients (\code{d} in the returned object) separately for each replicate or pooling across replicates and deriving a single estimate. If \code{collapseFixedEffect} is TRUE (default) the estimates are pooled. } \item{chol.args}{A list of optional arguments (pivot, nnzR) that will be used with the call to the cholesky decomposition. Pivoting is done by default to make use of sparse matrices when they are generated. This argument is useful in some cases for sparse covariance functions to reset the memory parameter nnzR. (See example below.)} \item{cov.args}{A list of optional arguments that will be used in calls to the covariance function.} \item{cov.function}{The name, a text string of the covariance function.} \item{derivative}{If zero the surface will be evaluated. If not zero the matrix of partial derivatives will be computed.} \item{digits}{Number of significant digits used in printed output.} \item{drop.Z}{If true the fixed part will only be evaluated at the polynomial part of the fixed model. The contribution from the other covariates will be omitted.} \item{find.trA}{ If TRUE will estimate the effective degrees of freedom using a simple Monte Carlo method. This will add to the computational burden by approximately NtrA solutions of the linear system but the cholesky decomposition is reused.} \item{grid.list}{A grid.list to evaluate the surface in place of specifying arbitrary locations.} \item{iseed}{Random seed ( using \code{set.seed(iseed)}) used to generate iid normals for Monte Carlo estimate of the trace. Set this to an integer to insure the same random draws are used to compute the approximate trace and be consistent across different values of the covariance parameters. } \item{just.fixed}{If TRUE only the predictions for the fixed part of the model will be evaluted.} \item{lambda}{ Smoothing parameter or equivalently the ratio between the nugget and process varainces.} \item{m}{ The degree of the polynomial used in the fixed part. This is follows the thin plate spline convention that the degree is m-1. Default is m=2 for a linear function, m=1 a constant and, as an quick logical switch, m=0 will result in no fixed part in the spatial model. } \item{na.rm}{If TRUE NAs in y are omitted along with corresonding rows of x.} \item{NtrA}{Number of Monte Carlo samples for the trace. But if NtrA is greater than or equal to the number of observations the trace is computed exactly.} \item{object}{Object returned by mKrig. (Same as "x" in the print function.)} \item{sigma2}{Value of the process variance.} \item{tau}{ Value of the measurment error standard deviation.} \item{weights}{Precision ( 1/variance) of each observation} \item{x}{Matrix of unique spatial locations (or in print or surface the returned mKrig object.)} \item{xnew}{Locations for predictions.} \item{y}{ Vector or matrix of observations at spatial locations, missing values are not allowed! Or in mKrig.coef a new vector of observations. If y is a matrix the columns are assumed to be independent replicates of the spatial field. I.e. observation vectors generated from the same covariance and measurment error model but independent from each other. } \item{ynew}{New observation vector. \code{mKrig} will reuse matrix decompositions and find the new fit to these data.} \item{Z}{ Linear covariates to be included in fixed part of the model that are distinct from the default low order polynomial in \code{x}. (NOTE the order of the polynomial determined by \code{m})} \item{ZCommon}{ Linear covariates to be included in fixed part of the model. This option is only relevant for independent realizations of the fields (i.e. y is a matrix). The number of rows of \code{ZCommon} should be equal to the number of observations times the number of realizations. } \item{\dots}{ In \code{mKrig} and \code{predict} additional arguments that will be passed to the covariance function.} } \details{ This function is an abridged version of Krig and uses a more direct computation for the linear algebra that faciliates compactly supported covariance functions. The m stand for micro and done for a fixed lambda parameter and other covariance parameters (e.g. aRange) and for unique spatial locations. This is also the basic computational element of the top level \code{\link{spatialProcess} } function for finding MLEs. See the source code for a commented version that described the computation. These restrictions simplify the code for reading. Note that also little checking is done and the spatial locations are not transformed before the estimation. \strong{Repeated locations} To keep the coding simple \code{x} must be a set of unique locations. When there are multiple observations at a location -- also known as replicated locations -- one strategy is to use the average spatial value for this location in place of mulitple observations. One can also adjust the weights accordingly for this location if that makes sense. To do this use the function \code{\link{Krig.replicates}}. For example \preformatted{ out<- Krig.replicates( x=x, y=y) } and \code{out$xM, out$yM, out$weightsM} will be the unique locations with averaged values and the number of observations. \preformatted{ out<- Krig.replicates( x=x, y=y, weights= weights) } will also combine the weight vector based on the replications and be returned as \code{out$weightsM}. \strong{Multiple fields} Because most of the operations are linear algebra this code has been written to handle multiple data sets. Specifically, if the spatial model is the same except for different observed values (the y's), one can pass \code{y} as a matrix and the computations are done efficiently for each set. The likelihood across all replicates is combined and denoted with \code{FULL} at the end. Also note the \code{collapseFixedEffects} switch to determine if the regression part is found seperately for each replicate or combined into a single model. Note that this is not a multivariate spatial model -- just an efficient computation over several data vectors without explicit looping. A big difference in the computations is that an exact expression for the trace of the smoothing matrix is (trace A(lambda)) is computationally expensive and a Monte Carlo approximation is supplied instead. \strong{Supporting functions} See \code{predictSE.mKrig} for prediction standard errors and \code{sim.mKrig.approx} to quantify the uncertainty in the estimated function using conditional simulation. \code{predict.mKrig} will evaluate the derivatives of the estimated function if derivatives are supported in the covariance function. For example the wendland.cov function supports derivatives. \code{summary.mKrig} creates a list of class \code{mKrigSummary} along with a table of standard errors for the fixed linear parameters. \code{print.mKrigSummary} prints the \code{mKrigSummary} object and adds some more explanation about the model and results \code{print.mKrig} prints a summary for the \code{mKrig} object that the combines the summary and print methods. \code{mKrig.coef} finds "beta"" and "c" coefficients representing the solution using the previous cholesky decomposition but for a new data vector. This is used in computing the prediction standard error in predictSE.mKrig and can also be used to evalute the estimate efficiently at new vectors of observations provided the locations, fixed part, and the covariance matrix all remain the same . \strong{Sparse covariance functions} Sparse matrix methods are handled through overloading the usual linear algebra functions with sparse versions. But to take advantage of some additional options in the sparse methods the list argument chol.args is a device for changing some default values. The most important of these is \code{nnzR}, the number of nonzero elements anticipated in the Cholesky factorization of the postive definite linear system used to solve for the basis coefficients. The sparse of this system is essentially the same as the covariance matrix evalauted at the observed locations. As an example of resetting \code{nzR} to 450000 one would use the following argument for chol.args in mKrig: \code{ chol.args=list(pivot=TRUE,memory=list(nnzR= 450000))} \strong{Approximation trace estimate} \code{mKrig.trace} This is an internal function called by \code{mKrig} to estimate the effective degrees of freedom. The Kriging surface estimate at the data locations is a linear function of the data and can be represented as A(lambda)y. The trace of A is one useful measure of the effective degrees of freedom used in the surface representation. In particular this figures into the GCV estimate of the smoothing parameter. It is computationally intensive to find the trace explicitly but there is a simple Monte Carlo estimate that is often very useful. If E is a vector of iid N(0,1) random variables then the trace of A is the expected value of t(E)AE. Note that AE is simply predicting a surface at the data location using the synthetic observation vector E. This is done for \code{NtrA} independent N(0,1) vectors and the mean and standard deviation are reported in the \code{mKrig} summary. Typically as the number of observations is increased this estimate becomse more accurate. If NtrA is as large as the number of observations (\code{np}) then the algorithm switches to finding the trace exactly based on applying A to \code{np} unit vectors. } \value{ \item{summary}{A named array with the values of covariance parameters and log likelihoods.} \item{beta}{Coefficients of the polynomial fixed part and if present the covariates (Z).To determine which is which the logical vector ind.drift also part of this object is TRUE for the polynomial part. } \item{c.coef}{ Coefficients of the nonparametric part.} \item{nt}{ Dimension of fixed part.} \item{np}{ Dimension of c.coef.} \item{nZ}{Number of columns of Z covariate matrix (can be zero).} \item{ind.drift}{Logical vector that indicates polynomial coefficients in the \code{d} coefficients vector. This is helpful to distguish between polynomial part and the extra covariates coefficients associated with Z. } \item{lambda.fixed}{The fixed lambda value} \item{x}{Spatial locations used for fitting.} \item{knots}{The same as x} \item{cov.function.name}{Name of covariance function used.} \item{args}{ A list with all the covariance arguments that were specified in the call.} \item{m}{Order of fixed part polynomial.} \item{chol.args}{ A list with all the cholesky arguments that were specified in the call.} \item{call}{ A copy of the call to mKrig.} \item{non.zero.entries}{ Number of nonzero entries in the covariance matrix for the process at the observation locations.} \item{lnDetCov}{Log determinant of the covariance matrix for the observations having factored out sigma.} \item{Omega}{GLS covariance for the estimated parameters in the fixed part of the model (d coefficients0.} \item{qr.VT, Mc}{QR and cholesky matrix decompositions needed to recompute the estimate for new observation vectors.} \item{fitted.values, residuals}{Usual predictions from fit.} \item{eff.df}{Estimate of effective degrees of freedom. Either the mean of the Monte Carlo sample or the exact value. } \item{trA.info}{If NtrA ids less than \code{np} then the individual members of the Monte Carlo sample and \code{sd(trA.info)/ sqrt(NtrA)} is an estimate of the standard error. If NtrA is greater than or equal to \code{np} then these are the diagonal elements of A(lamdba).} \item{GCV}{Estimated value of the GCV function.} \item{GCV.info}{Monte Carlo sample of GCV functions} } \author{Doug Nychka, Reinhard Furrer, John Paige} \seealso{ Krig, surface.mKrig, Tps, fastTps, predictSurface, predictSE.mKrig, sim.mKrig.approx, \code{ \link{mKrig.grid}}} \examples{ # # Midwest ozone data 'day 16' stripped of missings data( ozone2) y<- ozone2$y[16,] good<- !is.na( y) y<-y[good] x<- ozone2$lon.lat[good,] # nearly interpolate using defaults (Exponential covariance range = 2.0) # see also mKrigMLEGrid to choose lambda by maxmimum likelihood out<- mKrig( x,y, aRange = 2.0, lambda=.01) out.p<- predictSurface( out) surface( out.p) # # NOTE this should be identical to # Krig( x,y, aRange=2.0, lambda=.01) ############################################################################## # an example using a "Z" covariate and the Matern family # again see mKrigMLEGrid to choose parameters by MLE. data(COmonthlyMet) yCO<- CO.tmin.MAM.climate good<- !is.na( yCO) yCO<-yCO[good] xCO<- CO.loc[good,] Z<- CO.elev[good] out<- mKrig( xCO,yCO, Z=Z, cov.function="stationary.cov", Covariance="Matern", aRange=4.0, smoothness=1.0, lambda=.1) set.panel(2,1) # quilt.plot with elevations quilt.plot( xCO, predict(out)) # Smooth surface without elevation linear term included surface( out) set.panel() ######################################################################### # here is a series of examples with bigger datasets # using a compactly supported covariance directly set.seed( 334) N<- 1000 x<- matrix( 2*(runif(2*N)-.5),ncol=2) y<- sin( 1.8*pi*x[,1])*sin( 2.5*pi*x[,2]) + rnorm( 1000)*.1 look2<-mKrig( x,y, cov.function="wendland.cov",k=2, aRange=.2, lambda=.1) # take a look at fitted surface predictSurface(look2)-> out.p surface( out.p) # this works because the number of nonzero elements within distance aRange # are less than the default maximum allocated size of the # sparse covariance matrix. # see options() for the default values. The names follow the convention # spam.arg where arg is the name of the spam component # e.g. spam.nearestdistnnz # The following will give a warning for aRange=.9 because # allocation for the covariance matirx storage is too small. # Here aRange controls the support of the covariance and so # indirectly the number of nonzero elements in the sparse matrix \dontrun{ look2<- mKrig( x,y, cov.function="wendland.cov",k=2, aRange=.9, lambda=.1) } # The warning resets the memory allocation for the covariance matrix # according the to values options(spam.nearestdistnnz=c(416052,400))' # this is inefficient becuase the preliminary pass failed. # the following call completes the computation in "one pass" # without a warning and without having to reallocate more memory. options( spam.nearestdistnnz=c(416052,400)) look2<- mKrig( x,y, cov.function="wendland.cov",k=2, aRange=.9, lambda=1e-2) # as a check notice that # print( look2) # reports the number of nonzero elements consistent with the specifc allocation # increase in spam.options # new data set of 1500 locations set.seed( 234) N<- 1500 x<- matrix( 2*(runif(2*N)-.5),ncol=2) y<- sin( 1.8*pi*x[,1])*sin( 2.5*pi*x[,2]) + rnorm( N)*.01 \dontrun{ # the following is an example of where the allocation (for nnzR) # for the cholesky factor is too small. A warning is issued and # the allocation is increased by 25% in this example # look2<- mKrig( x,y, cov.function="wendland.cov",k=2, aRange=.1, lambda=1e2 ) } # to avoid the warning look2<-mKrig( x,y, cov.function="wendland.cov", k=2, aRange=.1, lambda=1e2, chol.args=list(pivot=TRUE, memory=list(nnzR= 450000))) ############################################################################### # fiting multiple data sets # #\dontrun{ y1<- sin( 1.8*pi*x[,1])*sin( 2.5*pi*x[,2]) + rnorm( N)*.01 y2<- sin( 1.8*pi*x[,1])*sin( 2.5*pi*x[,2]) + rnorm( N)*.01 Y<- cbind(y1,y2) look3<- mKrig( x,Y,cov.function="wendland.cov",k=2, aRange=.1, lambda=1e2 ) # note slight difference in summary because two data sets have been fit. print( look3) #} \dontrun{ ################################################################## # finding a good choice for aRange as a taper # Suppose the target is a spatial prediction using roughly 50 nearest neighbors # (tapering covariances is effective for roughly 20 or more in the situation of # interpolation) see Furrer, Genton and Nychka (2006). # take a look at a random set of 100 points to get idea of scale # and saving computation time by not looking at the complete set # of points # NOTE: This could also be done directly using the FNN package for finding nearest # neighbors set.seed(223) ind<- sample( 1:N,100) hold<- rdist( x[ind,], x) dd<- apply( hold, 1, quantile, p= 50/N ) dguess<- max(dd) # dguess is now a reasonable guess at finding cutoff distance for # 50 or so neighbors # full distance matrix excluding distances greater than dguess hold2<- nearest.dist( x, x, delta= dguess ) # here is trick to find the number of nonsero rows for a matrix in spam format. hold3<- diff( hold2@rowpointers) # min( hold3) = 43 which we declare close enough. This also counts the diagonal # So there are a minimum of 42 nearest neighbors ( median is 136) # see table( hold3) for the distribution # now the following will use no less than 43 - 1 nearest neighbors # due to the tapering. mKrig( x,y, cov.function="wendland.cov",k=2, aRange=dguess, lambda=1e2) -> look2 } ############################################################################### # use precomputed distance matrix # \dontrun{ y1<- sin( 1.8*pi*x[,1])*sin( 2.5*pi*x[,2]) + rnorm( N)*.01 y2<- sin( 1.8*pi*x[,1])*sin( 2.5*pi*x[,2]) + rnorm( N)*.01 Y<- cbind(y1,y2) #precompute distance matrix in compact form distMat = rdist(x, compact=TRUE) look3<- mKrig( x,Y,cov.function="stationary.cov", aRange=.1, lambda=1e2, distMat=distMat ) #precompute distance matrix in standard form distMat = rdist(x) look3<- mKrig( x,Y,cov.function="stationary.cov", aRange=.1, lambda=1e2, distMat=distMat ) } } \references{ \url{https://github.com/dnychka/fieldsRPackage} } % Add one or more standard keywords, see file 'KEYWORDS' in the % R documentation directory. \keyword{spatial } fields/man/Wendland.Rd0000644000176200001440000001444514275214115014330 0ustar liggesusers%# %# fields is a package for analysis of spatial data written for %# the R software environment. %# Copyright (C) 2022 Colorado School of Mines %# 1500 Illinois St., Golden, CO 80401 %# Contact: Douglas Nychka, douglasnychka@gmail.edu, %# %# This program is free software; you can redistribute it and/or modify %# it under the terms of the GNU General Public License as published by %# the Free Software Foundation; either version 2 of the License, or %# (at your option) any later version. %# This program is distributed in the hope that it will be useful, %# but WITHOUT ANY WARRANTY; without even the implied warranty of %# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the %# GNU General Public License for more details. %# %# You should have received a copy of the GNU General Public License %# along with the R software environment if not, write to the Free Software %# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA %# or see http://www.r-project.org/Licenses/GPL-2 %##END HEADER %##END HEADER \name{Wendland} \alias{Wendland} \alias{Wendland.beta} \alias{Wendland2.2} \alias{fields.D} \alias{fields.pochdown} \alias{fields.pochup} \alias{wendland.eval} %\alias{Wendland.father} %\alias{Wendland.mother} %\alias{wendland.basis} \title{Wendland family of covariance functions and supporting numerical functions} \description{ Computes the compactly supported, stationatry Wendland covariance function as a function ofdistance. This family is useful for creating sparse covariance matrices. } \usage{ Wendland(d, aRange = 1, dimension, k,derivative=0, phi=NA, theta=NULL) Wendland2.2(d, aRange=1, theta=NULL) Wendland.beta(n,k) wendland.eval(r, n, k, derivative = 0) fields.pochup(q, k) fields.pochdown(q, k) fields.D(f,name,order = 1) %Wendland.father(x, aRange = 1, dimension = 1, k=3) %Wendland.mother(x, aRange = 1, dimension = 1, k=3) %wendland.basis(x1, x2, aRange = 1, V=NULL, % k = 3, C = NA, Dist.args = list(method = "euclidean"), % spam.format = TRUE, verbose = FALSE, flavor=0) } %- maybe also 'usage' for other objects documented here. \arguments{ \item{d}{Distances between locations. Or for wendland.coef the dimension of the locations.} \item{aRange}{Scale for distances. This is the same as the range parameter.} \item{theta}{Same as aRange.} \item{dimension}{Dimension of the locations} \item{n}{Dimension for computing Wendland polynomial coefficients} \item{k}{Order of covariance function.} \item{derivative}{Indicates derivative of covariance function} \item{phi}{Depreciated argument will give stop if not an NA. (Formerly the scale factor to multiply the function. Equivalent to the marginal variance or sill if viewed as a covariance function.) } \item{r}{ Real value in [0,1] to evaluate Wendland function.} \item{q}{Order of Pochhammer symbol} \item{f}{Numerical expression to differentiate.} \item{name}{Variable with which to take derivative.} \item{order}{Order of derivative.} %\item{x}{Argument for one dimensional basis function} %\item{x1}{Two dimensional locations to evaluate the basis functions} %\item{x2}{Two dimensional centers that define the basis} %\item{C}{Vector or matrix of coefficients to multiply with basis functions} %\item{Dist.args}{Arguments to distance function} %\item{V}{See explantion in help for \code{Exp.cov}} %\item{spam.format}{If TRUE return result in sparse format} %\item{verbose}{If TRUE prints out intermediate steps for debugging.} %\item{flavor}{Takes values 0:3. Controls type of tensor product: %father*father=0, father*mother =1, mother*father = 2, mother*mother =3 } } \details{ This is the basic function applied to distances and called by the \code{wendland.cov} function. It can also be used as the Covariance or Taper specifications in the more general stationary.cov and station.taper.cov functions. The proofs and construction of the Wendland family of positive definite functions can be found in the work of Wendland(1995). ( H. Wendland. Piecewise polynomial , positive definite and compactly supported radial functions of minimal degree. AICM 4(1995), pp 389-396.) The Wendland covariance function is a positive polynomial on [0,aRange] and zero beyond aRange. It is further normalized in these fields functions to be 1 at 0. The parameter \code{k} detemines the smoothness of the covariance at zero. The additional parameter \code{n} or \code{dimension} is needed because the property of positive definitness for radial functions depends on the dimension being considered. The polynomial terms of the Wenland function. are computed recursively based on the values of \code{k} and \code{dimension} in the function \code{wendland.eval}. The matrix of coefficients found by \code{Wendland.beta} is used to weight each polynomial term and follows Wendland's original construction of these functions. The recursive definition of the Wendland coefficients depends on Pochhammer symbols akin to binomial coefficients: \code{fields.pochup(q, k)} calculates the Pochhammer symbol for rising factorial q(q+1)(q+2)...(q+k-1) and \code{fields.pochdown(q, k)} calculates the Pochhammer symbol for falling factorial q(q-1)(q-2)...(q-k+1). Derivatives are found symbolically using a recursive modification of the base function \code{D} (\code{fields.D}) and then evaluated numerically based on the polynomial form. A specific example of the Wendland family is \code{Wendland2.2} (k=2, dimension=2). This is included mainly for testing but the explicit formula may also be enlightening. } \value{ A vector of the covariances or its derivative. } \author{Doug Nychka, Ling Shen} \seealso{ wendland.cov, stationary.taper.cov} \examples{ dt<- seq( 0,1.5,, 200) y<- Wendland( dt, k=2, dimension=2) plot( dt, y, type="l") # should agree with y.test<- Wendland2.2( dt) points( dt, y.test) # second derivative plot( dt, Wendland( dt, k=4, dimension=2, derivative=2), type="l") # a radial basis function using the Wendland the "knot" is at (.25,.25) gl<- list( x= seq( -1,1,,60), y = seq( -1,1,,60) ) bigD<- rdist( make.surface.grid( gl), matrix( c(.25,.25), nrow=1)) RBF<- matrix(Wendland( bigD, k=2, dimension=2), 60,60) # perspective with some useful settings for shading. persp( gl$x, gl$y, RBF, theta =30, phi=20, shade=.3, border=NA, col="grey90") } % Add one or more standard keywords, see file 'KEYWORDS' in the % R documentation directory. \keyword{spatial} fields/man/Krig.Amatrix.Rd0000644000176200001440000001065414275214115015072 0ustar liggesusers%# %# fields is a package for analysis of spatial data written for %# the R software environment. %# Copyright (C) 2022 Colorado School of Mines %# 1500 Illinois St., Golden, CO 80401 %# Contact: Douglas Nychka, douglasnychka@gmail.edu, %# %# This program is free software; you can redistribute it and/or modify %# it under the terms of the GNU General Public License as published by %# the Free Software Foundation; either version 2 of the License, or %# (at your option) any later version. %# This program is distributed in the hope that it will be useful, %# but WITHOUT ANY WARRANTY; without even the implied warranty of %# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the %# GNU General Public License for more details. %# %# You should have received a copy of the GNU General Public License %# along with the R software environment if not, write to the Free Software %# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA %# or see http://www.r-project.org/Licenses/GPL-2 %##END HEADER %##END HEADER \name{Krig.Amatrix} \alias{Krig.Amatrix} \title{ Smoother (or "hat") matrix relating predicted values to the dependent (Y) values. } \description{ For a fixed value of the smoothing parameter or the covariance function some nonparametric curve estimates are linear functions of the observed data. This is a intermediate level function that computes the linear weights to be applied to the observations to estimate the curve at a particular point. For example the predicted values can be represented as Ay where A is an N X N matrix of coefficients and Y is the vector of observed dependent variables. For linear smoothers the matrix A may depend on the smoothing parameter ( or covariance function and the independent variables (X) but NOT on Y. } \usage{ Krig.Amatrix(object, x0 = object$x, lambda=NULL, eval.correlation.model = FALSE,...) } \arguments{ Output object from fitting a data set using a FIELD regression method. Currently this is supported only for Krig ( and Tps) functions. \item{object}{ A Krig object produced by the Krig ( or Tps) function. } \item{x0}{ Locations for prediction default is the observation locations. } \item{lambda}{ Value of the smoothing parameter. } \item{eval.correlation.model}{This applies to a correlation model where the observations have been standardized -- e.g. y standardized = (yraw - mean) / (standard deviation). If TRUE the prediction in the correlation scale is transformed by the standard deviation and mean to give a prediction in the raw scale. If FALSE predictions are left in the correlation scale.} \item{\dots}{ Other arguments that can used by predict.Krig.} } \value{ A matrix where the number of rows is equal to the number of predicted points and the number of columns is equal to the length of the Y vector. } \details{ The main use of this function is in finding prediction standard errors. For the Krig ( and Tps) functions the A matrix is constructed based on the representation of the estimate as a generalized ridge regression. The matrix expressions are explained in the references from the FIELDS manual. For linear regression the matrix that gives predicted values is often referred to as the "hat" matrix and is useful for regression diagnostics. For smoothing problems the effective number of parameters in the fit is usually taken to be the trace of the A matrix. Note that while the A matrix is usually constructed to predict the estimated curve at the data points Amatrix.Krig does not have such restrictions. This is possible because any value of the estimated curve will be a linear function of Y. The actual calculation in this function is simple. It invovles loop through the unit vectors at each observation and computation of the prediction for each of these delta functions. This approach makes it easy to handle different options such as including covariates. } \section{References}{ Nychka (2000) "Spatial process estimates as smoothers." } \seealso{ Krig, Tps, predict.Krig } \examples{ # Compute the A matrix or "hat" matrix for a thin plate spline # check that this gives the same predicted values tps.out<-Tps( ChicagoO3$x, ChicagoO3$y) A<-Krig.Amatrix( tps.out, ChicagoO3$x) test<- A\%*\%ChicagoO3$y # now compare this to predict( tps.out) or tps.out$fitted.values # they should be the same stats( test- tps.out$fitted.values) } \keyword{spatial} % docclass is function % Converted by Sd2Rd version 1.21. fields/man/Krig.null.function.Rd0000644000176200001440000000406314275214115016260 0ustar liggesusers%# %# fields is a package for analysis of spatial data written for %# the R software environment. %# Copyright (C) 2022 Colorado School of Mines %# 1500 Illinois St., Golden, CO 80401 %# Contact: Douglas Nychka, douglasnychka@gmail.edu, %# %# This program is free software; you can redistribute it and/or modify %# it under the terms of the GNU General Public License as published by %# the Free Software Foundation; either version 2 of the License, or %# (at your option) any later version. %# This program is distributed in the hope that it will be useful, %# but WITHOUT ANY WARRANTY; without even the implied warranty of %# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the %# GNU General Public License for more details. %# %# You should have received a copy of the GNU General Public License %# along with the R software environment if not, write to the Free Software %# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA %# or see http://www.r-project.org/Licenses/GPL-2 %##END HEADER %##END HEADER \name{Krig.null.function} \alias{Krig.null.function} \title{Default function to create fixed matrix part of spatial process model.} \description{ Constructs a matrix of terms representing a low order polynomial and binds additional columns due to covariates ( the Z matrix) } \usage{ Krig.null.function(x, Z = NULL, drop.Z = FALSE, m) } %- maybe also 'usage' for other objects documented here. \arguments{ \item{x}{Spatial locations } \item{Z}{ Other covariates to be associated with each location.} \item{drop.Z}{If TRUE only the low order polynomial part is created. } \item{m}{ The polynomial order is (m-1). } } \value{ A matrix where the first columns are the polynomial terms and the following columns are from Z. } \details{ This function can be modified to produce a different fixed part of the spatial model. The arguments x, Z and drop.Z are required but other arguments can be passed as part of a list in null.args in the call to Krig. } \author{Doug Nychka } \seealso{Krig} \keyword{ spatial}% at least one, from doc/KEYWORDS fields/man/mKrigMLE.Rd0000644000176200001440000003622714342276504014212 0ustar liggesusers%# %# fields is a package for analysis of spatial data written for %# the R software environment. %# Copyright (C) 2022 Colorado School of Mines %# 1500 Illinois St., Golden, CO 80401 %# Contact: Douglas Nychka, douglasnychka@gmail.edu, %# %# This program is free software; you can redistribute it and/or modify %# it under the terms of the GNU General Public License as published by %# the Free Software Foundation; either version 2 of the License, or %# (at your option) any later version. %# This program is distributed in the hope that it will be useful, %# but WITHOUT ANY WARRANTY; without even the implied warranty of %# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the %# GNU General Public License for more details. %# %# You should have received a copy of the GNU General Public License %# along with the R software environment if not, write to the Free Software %# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA %# or see http://www.r-project.org/Licenses/GPL-2 %##END HEADER %##END HEADER \name{mKrigMLE} \alias{mKrigMLEJoint} \alias{mKrigMLEGrid} \alias{mKrigJointTemp.fn} \alias{profileCI} %- Also NEED an '\alias' for EACH other topic documented here. \title{ Maximizes likelihood for the process marginal variance (sigma) and nugget standard deviation (tau) parameters (e.g. lambda) over a many covariance models or covariance parameter values. } \description{ These function are designed to explore the likelihood surface for different covariance parameters with the option of maximizing over tau and sigma. They used the \code{mKrig} base are designed for computational efficiency. } \usage{ mKrigMLEGrid(x, y, weights = rep(1, nrow(x)), Z = NULL,ZCommon=NULL, mKrig.args = NULL, cov.function = "stationary.cov", cov.args = NULL, na.rm = TRUE, par.grid = NULL, reltol = 1e-06, REML = FALSE, GCV = FALSE, optim.args = NULL, cov.params.start = NULL, verbose = FALSE, iseed = NA) mKrigMLEJoint(x, y, weights = rep(1, nrow(x)), Z = NULL,ZCommon=NULL, mKrig.args = NULL, na.rm = TRUE, cov.function = "stationary.cov", cov.args = NULL, cov.params.start = NULL, optim.args = NULL, reltol = 1e-06, parTransform = NULL, REML = FALSE, GCV = FALSE, hessian = FALSE, iseed = 303, verbose = FALSE) profileCI(obj, parName, CIlevel = 0.95, REML = FALSE) mKrigJointTemp.fn(parameters, mKrig.args, cov.args, parTransform, parNames, REML = FALSE, GCV = FALSE, verbose = verbose, capture.env) } %- maybe also 'usage' for other objects documented here. \arguments{ \item{capture.env}{For the ML objective function the frame to save the results of the evaluation. This should be the environment of the function calling optim.} \item{CIlevel}{ Confidence level.} \item{cov.function}{ The name, a text string, of the covariance function. } \item{cov.args}{ The arguments that would also be included in calls to the covariance function to specify the fixed part of the covariance model. This is the form of a list E.g.\code{cov.args= list( aRange = 3.5)} } \item{cov.params.start}{ A list of initial starts for covariance parameters to perform likelihood maximization. The list contains the names of the parameters as well as the values. It usually makes sense to optimize over the important lambda parameter (tau^2/ sigma^2) is most spatial applications and so if \code{lambda} is omitted then the component \code{lambda = .5} is added to this list. } \item{hessian}{If TRUE return the BFGS approximation to the hessian matrix at convergence.} \item{iseed}{ Sets the random seed in finding the approximate Monte Carlo based GCV function and the effective degrees of freedom. This will not effect random number generation outside these functions. } \item{mKrig.args}{A list of additional parameters to supply to the \code{mKrig} function. E.g.\code{ mKrig.args= list( m=1) }to set the regression function to be a constant function. \code{mKrig} function that are distinct from the covariance model. For example \code{mKrig.args= list( m=1 )} will set the polynomial to be just a constant term (degree = m - 1 = 0). Use \code{mKrig.args= list( m = 0 )} to omit a fixed model and assume the observations have an expectation of zero. } \item{na.rm}{Remove NAs from data.} \item{optim.args}{ Additional arguments that would also be included in calls to the optim function in joint likelihood maximization. If \code{NULL}, this will be set to use the "BFGS-" optimization method. See \code{\link{optim}} for more details. The default value is: \code{optim.args = list(method = "BFGS", control=list(fnscale = -1, ndeps = rep(log(1.1), length(cov.params.start)+1), abstol=1e-04, maxit=20))} Note that the first parameter is lambda and the others are the covariance parameters in the order they are given in \code{cov.params.start}. Also note that the optimization is performed on a transformed scale (based on the function \code{parTransform} ), and this should be taken into consideration when passing arguments to \code{optim}. } \item{parameters}{The parameter values for evaluate the likelihood.} \item{par.grid}{ A list or data frame with components being parameters for different covariance models. A typical component is "aRange" comprising a vector of scale parameters to try. If par.grid is "NULL" then the covariance model is fixed at values that are given in \dots. } \item{obj}{ List returnerd from \code{mKrigMLEGrid}} \item{parName}{Name of parameter to find confidence interval.} \item{parNames}{Names of the parameters to optimize over.} \item{parTransform}{A function that maps the parameters to a scale for optimization or effects the inverse map from the transformed scale into the original values. See below for more details. } \item{reltol}{Optim BFGS comvergence criterion.} \item{REML}{If TRUE use REML instead of the full log likelihood.} \item{GCV}{NOT IMPLEMENTED YET! A placeholder to implement optimization using an approximate cross-validation criterion. } \item{verbose}{If \code{TRUE} print out interesting intermediate results. } \item{weights}{ Precision ( 1/variance) of each observation } \item{x}{ Matrix of unique spatial locations (or in print or surface the returned mKrig object.) } \item{y}{ Vector or matrix of observations at spatial locations, missing values are not allowed! Or in mKrig.coef a new vector of observations. If y is a matrix the columns are assumed to be independent observations vectors generated from the same covariance and measurment error model. } \item{Z}{ Linear covariates to be included in fixed part of the model that are distinct from the default low order polynomial in \code{x} } \item{ZCommon}{ Linear covariates to be included in fixed part of the model where a common parameter is estimated across all realizations. This option only makes sense for multiple realizations ( y is a matrix). } } \details{ The observational model follows the same as that described in the \code{Krig} function and thus the two primary covariance parameters for a stationary model are the nugget standard deviation (tau) and the marginal variance of the process (sigma). It is useful to reparametrize as \code{sigma} and \code{ lambda = tau^2/sigma}. The likelihood can be maximized analytically over sigma and the parameters in the fixed part of the model, this estimate of sigma can be substituted back into the likelihood to give a expression that is just a function of lambda and the remaining covariance parameters. This operation is called concentrating the likelhood by maximizing over a subset of parameters For these kind of computations there has to be some device to identify parameters that are fixed and those that are optimized. For \code{mKrigMLEGrid} and \code{mKrigMLEJoint} the list \code{cov.args} should have the fixed parameters. For example this is how to fix a lambda value in the model. The list \code{cov.params.start} should be list with all parameters to optimize. The values for each component are use as the starting values. This is how the \link{optim} function works. These functions may compute the effective degrees of freedomn ( see \code{ \link{mKrig.trace}} ) using the random tace method and so need to generate some random normals. The \code{iseed} arguement can be used to set the seed for this with the default being the seed \code{303}. Note that the random number generation internal to these functions is coded so that it does not effect the random number stream outside these function calls. For \code{mKrigMLEJoint} the default transformation of the parameters is set up for a log/exp transformation: \preformatted{ parTransform <- function(ptemp, inv = FALSE) { if (!inv) { log(ptemp) } else { exp(ptemp) } } } } \value{ \strong{\code{mKrigMLEGrid}} returns a list with the components: \item{summary}{A matrix with each row giving the results of evaluating the likelihood for each covariance model.} \item{par.grid}{The par.grid argument used. A matrix where rows are the combination of parameters considered.} \item{call}{The calling arguments to this function.} \strong{\code{mKrigMLEJoint}} returns a list with components: \item{summary}{A vector giving the MLEs and the log likelihood at the maximum} \item{lnLike.eval}{ A table containing information on all likelihood evaluations performed in the maximization process. } \item{optimResults}{The list returned from the optim function. Note that the parameters may be transformed values. } \item{par.MLE}{The maximum likelihood estimates.} \item{parTransform}{The transformation of the parameters used in the optimziation.} } \references{ \url{https://github.com/dnychka/fieldsRPackage} } \author{ %% ~~who you are~~ Douglas W. Nychka, John Paige } \seealso{ %% ~~objects to See Also as \code{\link{help}}, ~~~ \code{\link{mKrig}} \code{\link{Krig}} \code{\link{stationary.cov}} \code{\link{optim}} } \examples{ \dontrun{ #perform joint likelihood maximization over lambda and aRange. # NOTE: optim can get a bad answer with poor initial starts. data(ozone2) s<- ozone2$lon.lat z<- ozone2$y[16,] gridList<- list( aRange = seq( .4,1.0,length.out=20), lambda = 10**seq( -1.5,0,length.out=20) ) par.grid<- make.surface.grid( gridList) out<- mKrigMLEGrid( s,z, par.grid=par.grid, cov.args= list(smoothness=1.0, Covariance="Matern" ) ) outP<- as.surface( par.grid, out$summary[,"lnProfileLike.FULL"]) image.plot( outP$x, log10(outP$y),outP$z, xlab="aRange", ylab="log10 lambda") } \dontrun{ N<- 50 set.seed(123) x<- matrix(runif(2*N), N,2) aRange<- .2 Sigma<- Matern( rdist(x,x)/aRange , smoothness=1.0) Sigma.5<- chol( Sigma) tau<- .1 # 250 independent spatial data sets but a common covariance function # -- there is little overhead in # MLE across independent realizations and a good test of code validity. M<-250 F.true<- t( Sigma.5) \%*\% matrix( rnorm(N*M), N,M) Y<- F.true + tau* matrix( rnorm(N*M), N,M) # find MLE for lambda with grid of ranges # and smoothness fixed in Matern par.grid<- list( aRange= seq( .1,.35,,8)) obj1b<- mKrigMLEGrid( x,Y, cov.args = list(Covariance="Matern", smoothness=1.0), cov.params.start=list( lambda = .5), par.grid = par.grid ) obj1b$summary # take a look # profile over aRange plot( par.grid$aRange, obj1b$summary[,"lnProfileLike.FULL"], type="b", log="x") } \dontrun{ # m=0 is a simple switch to indicate _no_ fixed spatial drift # (the default and highly recommended is linear drift, m=2). # However, m=0 results in MLEs that are less biased, being the correct model # -- in fact it nails it ! obj1a<- mKrigMLEJoint(x,Y, cov.args=list(Covariance="Matern", smoothness=1.0), cov.params.start=list(aRange =.5, lambda = .5), mKrig.args= list( m=0)) test.for.zero( obj1a$summary["tau"], tau, tol=.007) test.for.zero( obj1a$summary["aRange"], aRange, tol=.015) } ########################################################################## # A bootstrap example # Here is a example of a more efficient (but less robust) bootstrap using # mKrigMLEJoint and tuned starting values ########################################################################## \dontrun{ data( ozone2) obj<- spatialProcess( ozone2$lon.lat,ozone2$y[16,] ) ######### boot strap set.seed(123) M<- 25 # create M indepedent copies of the observation vector ySynthetic<- simSpatialData( obj, M) bootSummary<- NULL aRangeMLE<- obj$summary["aRange"] lambdaMLE<- obj$summary["lambda"] for( k in 1:M){ cat( k, " " ) # here the MLEs are found using the easy top level level wrapper # see mKrigMLEJoint for a more efficient strategy out <- mKrigMLEJoint(obj$x, ySynthetic[,k], weights = obj$weights, mKrig.args = obj$mKrig.args, cov.function = obj$cov.function.name, cov.args = obj$cov.args, cov.params.start = list( aRange = aRangeMLE, lambda = lambdaMLE) ) newSummary<- out$summary bootSummary<- rbind( bootSummary, newSummary) } cat( " ", fill=TRUE ) obj$summary stats( bootSummary) } \dontrun{ #perform joint likelihood maximization over lambda, aRange, and smoothness. #note: finding smoothness is not a robust optimiztion # can get a bad answer with poor initial guesses. obj2<- mKrigMLEJoint(x,Y, cov.args=list(Covariance="Matern"), cov.params.start=list( aRange = .18, smoothness = 1.1, lambda = .08), ) #look at lnLikelihood evaluations obj2$summary #compare to REML obj3<- mKrigMLEJoint(x,Y, cov.args=list(Covariance="Matern"), cov.params.start=list(aRange = .18, smoothness = 1.1, lambda = .08), , REML=TRUE) obj3$summary } \dontrun{ #look at lnLikelihood evaluations # check convergence of MLE to true fit with no fixed part # obj4<- mKrigMLEJoint(x,Y, mKrig.args= list( m=0), cov.args=list(Covariance="Matern", smoothness=1), cov.params.start=list(aRange=.2, lambda=.1), REML=TRUE) #look at lnLikelihood evaluations obj4$summary # nails it! } } % Add one or more standard keywords, see file 'KEYWORDS' in the % R documentation directory. \keyword{spatial} fields/man/splint.Rd0000644000176200001440000000711714275214115014103 0ustar liggesusers%# %# fields is a package for analysis of spatial data written for %# the R software environment. %# Copyright (C) 2022 Colorado School of Mines %# 1500 Illinois St., Golden, CO 80401 %# Contact: Douglas Nychka, douglasnychka@gmail.edu, %# %# This program is free software; you can redistribute it and/or modify %# it under the terms of the GNU General Public License as published by %# the Free Software Foundation; either version 2 of the License, or %# (at your option) any later version. %# This program is distributed in the hope that it will be useful, %# but WITHOUT ANY WARRANTY; without even the implied warranty of %# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the %# GNU General Public License for more details. %# %# You should have received a copy of the GNU General Public License %# along with the R software environment if not, write to the Free Software %# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA %# or see http://www.r-project.org/Licenses/GPL-2 %##END HEADER %##END HEADER \name{splint} \alias{splint} \title{ Cubic spline interpolation } \description{ A fast, FORTRAN based function for cubic spline interpolation. } \usage{ splint(x, y, xgrid, wt = NULL, derivative = 0, lam = 0, df = NA, lambda = NULL, nx = NULL, digits = 8) } \arguments{ \item{x}{ The x values that define the curve or a two column matrix of x and y values. } \item{y}{ The y values that are paired with the x's. } \item{xgrid}{ The grid to evaluate the fitted cubic interpolating curve. } \item{derivative}{ Indicates whether the function or a a first or second derivative should be evaluated. } \item{wt}{Weights for different obsrevations in the scale of reciprocal variance.} \item{lam}{ Value for smoothing parameter. Default value is zero giving interpolation.} \item{lambda}{Same as \code{lam} just to make this easier to remember.} \item{df}{ Effective degrees of freedom. Default is to use lambda =0 or a df equal to the number of observations.} \item{nx}{If not NULL this should be the number of points to evaluate on an equally spaced grid in the range of \code{x}} \item{digits}{Number of significant digits uused to determine what is a replicate x value.} } \value{ A vector consisting of the spline evaluated at the grid values in \code{xgrid}. } \details{ Fits a piecewise interpolating or smoothing cubic polynomial to the x and y values. This code is designed to be fast but does not many options in \code{sreg} or other more statistical implementations. To make the solution well posed the the second and third derivatives are set to zero at the limits of the x values. Extrapolation outside the range of the x values will be a linear function. It is assumed that there are no repeated x values; use sreg followed by predict if you do have replicated data. } \section{References}{ See Additive Models by Hastie and Tibshriani. } \seealso{ sreg, Tps } \examples{ x<- seq( 0, 120,,200) # an interpolation splint(rat.diet$t, rat.diet$trt,x )-> y plot( rat.diet$t, rat.diet$trt) lines( x,y) #( this is weird and not appropriate!) # the following two smooths should be the same splint( rat.diet$t, rat.diet$con,x, df= 7)-> y1 # sreg function has more flexibility than splint but will # be slower for larger data sets. sreg( rat.diet$t, rat.diet$con, df= 7)-> obj predict(obj, x)-> y2 # in fact predict.sreg interpolates the predicted values using splint! # the two predicted lines (should) coincide lines( x,y1, col="red",lwd=2) lines(x,y2, col="blue", lty=2,lwd=2) } \keyword{smooth} % docclass is function % Converted by Sd2Rd version 1.21. fields/man/as.surface.Rd0000644000176200001440000000754714275214115014633 0ustar liggesusers%# %# fields is a package for analysis of spatial data written for %# the R software environment. %# Copyright (C) 2022 Colorado School of Mines %# 1500 Illinois St., Golden, CO 80401 %# Contact: Douglas Nychka, douglasnychka@gmail.edu, %# %# This program is free software; you can redistribute it and/or modify %# it under the terms of the GNU General Public License as published by %# the Free Software Foundation; either version 2 of the License, or %# (at your option) any later version. %# This program is distributed in the hope that it will be useful, %# but WITHOUT ANY WARRANTY; without even the implied warranty of %# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the %# GNU General Public License for more details. %# %# You should have received a copy of the GNU General Public License %# along with the R software environment if not, write to the Free Software %# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA %# or see http://www.r-project.org/Licenses/GPL-2 %##END HEADER %##END HEADER \name{as.surface} \alias{as.surface} \title{ Creates an "surface" object from grid values. } \description{ Reformats the vector from evaluating a function on a grid of points into a list for use with surface plotting function. The list has the usual components x,y and z and is suitable for use with persp, contour, image and image.plot. } \usage{ as.surface(obj, z, location=NULL, order.variables="xy") } \arguments{ \item{obj}{ A description of the grid used to evaluate the function. This can either be in the form of a grid.list ( see help file for grid.list) or the matrix of grid of points produced by make.surface.grid. In the later case obj is a matrix with the grid.list as an attribute. } \item{z}{ The value of the function evaluated at the gridded points. } \item{location}{A logical or two column matrix of indices indicating the location of the z values within the image matrix.} \item{order.variables}{ Either "xy" or "yx" specifies how the x and y variables used to evaluate the function are matched with the x and y grids in the surface object. } } \value{ A list of class surface. This object is a modest generalization of the list input format (x,y,z,) for the S functions contour, image or persp. \item{x}{ The grid values in the X-axis } \item{y}{ The grid values in the Y-axis } \item{z}{ A matrix of dimensions nrow= length of x and ncol= length of y with entries being the grid point value reformatted from z. } } \details{ This function was written to simply to go back and forth between a matrix of gridded values and the stacked vector obtained by stacking columns. The main application is evaluating a function at each grid point and then reforming the results for plotting. (See example below.) If zimage is matrix of values then the input vector is c( zimage). To go from the stacked vector to the matrix one needs the the nrow ncol and explains why grid information must also be specified. Note that the z input argument must be in the order values in order of stacking columns of the image. This is also the order of the grid points generated by make.surface.grid. To convert irregular 2-d data to a surface object where there are missing cells see the function as.image. } \seealso{ grid.list, make.surface.grid, surface, contour, image.plot, as.image } \examples{ # Make a perspective of the surface Z= X**2 -Y**2 # Do this by evaluating quadratic function on a 25 X 25 grid grid.l<-list( abcissa= seq( -2,2,,15), ordinate= seq( -2,2,,20)) xg<-make.surface.grid( grid.l) # xg is a 300X2 matrix that has all pairs of X and Y grid values z<- xg[,1]**2 - xg[,2]**2 # now fold z in the matrix format needed for persp out.p<-as.surface( xg, z) persp( out.p) # also try plot( out.p) to see the default plot for a surface object } \keyword{manip} % docclass is function % Converted by Sd2Rd version 1.21. fields/man/sreg.Rd0000644000176200001440000002642714275214115013537 0ustar liggesusers%# %# fields is a package for analysis of spatial data written for %# the R software environment. %# Copyright (C) 2022 Colorado School of Mines %# 1500 Illinois St., Golden, CO 80401 %# Contact: Douglas Nychka, douglasnychka@gmail.edu, %# %# This program is free software; you can redistribute it and/or modify %# it under the terms of the GNU General Public License as published by %# the Free Software Foundation; either version 2 of the License, or %# (at your option) any later version. %# This program is distributed in the hope that it will be useful, %# but WITHOUT ANY WARRANTY; without even the implied warranty of %# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the %# GNU General Public License for more details. %# %# You should have received a copy of the GNU General Public License %# along with the R software environment if not, write to the Free Software %# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA %# or see http://www.r-project.org/Licenses/GPL-2 %##END HEADER %##END HEADER \name{sreg} \alias{sreg} \alias{predict.sreg} \title{ Cubic smoothing spline regression } \description{ Fits a cubic smoothing spline to univariate data. The amount of smoothness can be specified or estimated from the data by GCV. } \usage{ sreg(x, y, lambda = NA, df = NA, offset = 0, weights = rep(1, length(x)), cost = 1, nstep.cv = 80, tol = 1e-05, find.diagA = TRUE, trmin = 2.01, trmax = NA, lammin = NA, lammax = NA, verbose = FALSE, do.cv = TRUE, method = "GCV", rmse = NA, na.rm = TRUE, digits = 8) \method{predict}{sreg}(object, x, derivative = 0, model = 1,...) } \arguments{ \item{x}{ Vector of x value} \item{y}{ Vector of y values} \item{lambda}{ Single smoothing parameter or a vector of values . If omitted smoothing parameter estimated by GCV. NOTE: lam here is equivalent to the value lambda*N in Tps/Krig where N is the number of unique observations. See example below.} \item{object}{An sreg object.} \item{derivative}{Order of deriviatve to evaluate. Must be 0,1, or 2.} \item{df}{ Amount of smoothing in term of effective degrees of freedom for the spline} \item{offset}{ an offset added to the term cost*degrees of freedom in the denominator of the GCV function. (This would be used for adjusting the df from fitting other models such as in back-fitting additive models.)} \item{model}{Specifies which model parameters to use.} \item{weights}{ A vector that is proportional to the reciprocal variances of the errors.} \item{cost}{ Cost value to be used in the GCV criterion.} \item{nstep.cv }{ Number of grid points of smoothing parameter for GCV grid search.} \item{tol}{Tolerance for convergence in minimizing the GCV or other criteria to estimate the smoothing parameter.} \item{find.diagA}{ If TRUE calculates the diagonal elements of the smoothing matrix. The effective number of degrees of freedom is the sum of these diagonal elements. Default is true. This requires more stores if a grid of smoothing parameters is passed. ( See returned values below.)} \item{trmin}{ Sets the minimum of the smoothing parameter range for the GCV grid search in terms of effective degrees of freedom.} \item{trmax}{ Sets the maximum of the smoothing parameter range for the GCV grid search in terms of effective degrees of freedom. If NA the range is set to .99 of number of unique locations.} \item{lammin}{ Same function as trmin but in the lambda scale.} \item{lammax}{ Same function as trmax but in the lambda scale.} \item{verbose}{ Print out all sorts of debugging info. Default is falseof course!} \item{do.cv}{ Evaluate the spline at the GCV minimum. Default is true.} \item{method}{ A character string giving the method for determining the smoothing parameter. Choices are "GCV", "GCV.one", "GCV.model", "pure error", "RMSE". Default is "GCV". } \item{rmse}{ Value of the root mean square error to match by varying lambda.} \item{na.rm}{If TRUE NA's are removed from y before analysis.} \item{digits}{Number of significant digits used to determine replicate x values.} \item{\dots}{Other optional arguments to pass to the predict function.} } \value{ Returns a list of class sreg. Some of the returned components are \item{call}{ Call to the function } \item{yM}{ Vector of dependent variables. If replicated data is given these are the replicate group means. } \item{xM}{ Unique x values matching the y's. } \item{weights}{ Proportional to reciprocal variance of each data point. } \item{weightsM}{ Proportional to reciprocal pooled variance of each replicated mean data value (xM).} \item{x}{ Original x data. } \item{y}{ Original y data. } \item{method}{ Method used to find the smoothing parameter.} \item{pure.ss}{ Pure error sum of squares from replicate groups. } \item{tauHat.pure.error}{ Estimate of tau from replicate groups.} \item{tauHat.GCV}{ Estimate of tau using estimated lambda from GCV minimization } \item{trace}{ Effective degrees of freedom for the spline estimate(s)} \item{gcv.grid}{ Values of trace, GCV, tauHat. etc. for a grid of smoothing parameters. If lambda ( or df) is specified those values are used. } \item{lambda.est}{ Summary of various estimates of the smoothing parameter} \item{lambda}{ If lambda is specified the passed vector, if missing the estimated value.} \item{residuals}{ Residuals from spline(s). If lambda or df is specified the residuals from these values. If lambda and df are omitted then the spline having estimated lambda. This will be a matrix with as many columns as the values of lambda. } \item{fitted.values}{ Matrix of fitted values. See notes on residuals. } \item{predicted}{ A list with components x and y. x is the unique values of xraw in sorted order. y is a matrix of the spline estimates at these values. } \item{eff.df}{ Same as trace.} \item{diagA}{ Matrix containing diagonal elements of the smoothing matrix. Number of columns is the number of lambda values. WARNING: If there is replicated data the diagonal elements are those for the smoothing the group means at the unique x locations. } } \details{ MODEL: The assumed model is Y.k=f(x.k) +e.k where e.k should be approximately normal and independent errors with variances tau**2/w.k ESTIMATE: A smoothing spline is a locally weighted average of the y's based on the relative locations of the x values. Formally the estimate is the curve that minimizes the criterion: (1/n) sum(k=1,n) w.k( Y.k - f( X.k))**2 + lambda R(f) where R(f) is the integral of the squared second derivative of f over the range of the X values. Because of the inclusion of the (1/n) in the sum of squares the lambda parameter in sreg corresponds to the a value of lambda*n in the Tps function and in the Krig function. The solution to this minimization is a piecewise cubic polynomial with the join points at the unique set of X values. The polynomial segments are constructed so that the entire curve has continuous first and second derivatives and the second and third derivatives are zero at the boundaries. The smoothing has the range [0,infinity]. Lambda equal to zero gives a cubic spline interpolation of the data. As lambda diverges to infinity ( e.g lambda =1e20) the estimate will converge to the straight line estimated by least squares. The values of the estimated function at the data points can be expressed in the matrix form: predicted values= A(lambda)Y where A is an nXn symmetric matrix that does NOT depend on Y. The diagonal elements are the leverage values for the estimate and the sum of these (trace(A(lambda)) can be interpreted as the effective number of parameters that are used to define the spline function. IF there are replicate points the A matrix is the result of finding group averages and applying a weighted spline to the means. The A matrix is also used to find "Bayesian" confidence intervals for the estimate, see the example below. CROSS-VALIDATION:The GCV criterion with no replicate points for a fixed value of lambda is (1/n)(Residual sum of squares)/((1-(tr(A)-offset)*cost + offset)/n)**2, Usually offset =0 and cost =1. Variations on GCV with replicate points are described in the documentation help file for Krig. With an appropriate choice for the smoothing parameter, the estimate of tau**2 is found by (Residual sum of squares)/tr(A). COMPUTATIONS: The computations for 1-d splines exploit the banded structure of the matrices needed to solve for the spline coefficients. Banded structure also makes it possible to get the diagonal elements of A quickly. This approach is different from the algorithms in Tps and tremendously more efficient for larger numbers of unique x values ( say > 200). The advantage of Tps is getting "Bayesian" standard errors at predictions different from the observed x values. This function is similar to the S-Plus smooth.spline. The main advantages are more information and control over the choice of lambda and also the FORTRAN source code is available (css.f). See also the function \code{splint} which is designed to be a bare bones but fast smoothing spline. } \seealso{ Krig, Tps, splint } \examples{ # fit a GCV spline to # control group of rats. fit<- sreg(rat.diet$t,rat.diet$con) summary( fit) set.panel(2,2) plot(fit) # four diagnostic plots of fit set.panel() predict( fit) # predicted values at data points xg<- seq(0,110,,50) sm<-predict( fit, xg) # spline fit at 50 equally spaced points der.sm<- predict( fit, xg, deriv=1) # derivative of spline fit set.panel( 2,1) plot( fit$x, fit$y) # the data lines( xg, sm) # the spline plot( xg,der.sm, type="l") # plot of estimated derivative set.panel() # reset panel to 1 plot # the same fit using the thin plate spline numerical algorithms # sreg does not scale the obs so instruct Tps not to sacel either # this will make lambda comparable within factor of n. fit.tps<-Tps( rat.diet$t,rat.diet$con, scale="unscaled") summary( fit.tps) # compare sreg and Tps results to show the adjustment to lambda. predict( fit)-> look predict( fit.tps, lambda=fit$lambda*fit$N)-> look2 test.for.zero( look, look2) # silence means it checks to 1e-8 # finding approximate standard errors at observations SE<- fit$tauHat.GCV*sqrt(fit$diagA) # compare to predictSE( fit.tps) differences are due to # slightly different lambda values and using tauHat.MLE instad of tauHat.GCV # # 95% pointwise prediction intervals Zvalue<- qnorm(.0975) upper<- fit$fitted.values + Zvalue* SE lower<- fit$fitted.values - Zvalue* SE # # conservative, simultaneous Bonferroni bounds # ZBvalue<- qnorm(1- .025/fit$N) upperB<- fit$fitted.values + ZBvalue* SE lowerB<- fit$fitted.values - ZBvalue* SE # # take a look plot( fit$x, fit$y, type="n") envelopePlot(fit$x, lowerB,fit$x, upperB, col = "grey90", lineCol="grey") envelopePlot(fit$x, lower,fit$x, upper, lineCol="grey") lines( fit$predicted, col="red",lwd=2) points( fit$x, fit$y,pch=16) title( "95 pct pointwise and simultaneous intervals") # or try the more visually honest not connecting points plot( fit$x, fit$y, type="n") segments( fit$x, lowerB, fit$x, upperB, col="grey",lwd=3) segments( fit$x, lower, fit$x, upper, col="thistle3", lwd=6) lines( fit$predicted, lwd=2,col="red") points( fit$x, fit$y,pch=16) title( "95 pct pointwise and simultaneous intervals") set.panel( 1,1) } \keyword{smooth} fields/man/quilt.plot.Rd0000644000176200001440000002324614453610657014717 0ustar liggesusers%# %# fields is a package for analysis of spatial data written for %# the R software environment. %# Copyright (C) 2022 Colorado School of Mines %# 1500 Illinois St., Golden, CO 80401 %# Contact: Douglas Nychka, douglasnychka@gmail.edu, %# %# This program is free software; you can redistribute it and/or modify %# it under the terms of the GNU General Public License as published by %# the Free Software Foundation; either version 2 of the License, or %# (at your option) any later version. %# This program is distributed in the hope that it will be useful, %# but WITHOUT ANY WARRANTY; without even the implied warranty of %# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the %# GNU General Public License for more details. %# %# You should have received a copy of the GNU General Public License %# along with the R software environment if not, write to the Free Software %# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA %# or see http://www.r-project.org/Licenses/GPL-2 %##END HEADER %##END HEADER \name{quilt.plot} \alias{quilt.plot} \alias{bubblePlot} %- Also NEED an '\alias' for EACH other topic documented here. \title{Useful plots for visualizing irregular spatial data. } \description{ Given a vector of z values associated with 2-d locations this function produces an image-like plot where the locations are discretized to a grid and the z values are coded as a color level from a color scale. } \usage{ quilt.plot(x, y, z, nx = 64, ny = 64, grid = NULL, add.legend=TRUE,add=FALSE, nlevel=64, col = tim.colors(nlevel), nrow=NULL, ncol=NULL,FUN = NULL, plot=TRUE, na.rm=FALSE, boundary.grid = FALSE, ...) bubblePlot(x, y, z, col = viridisLite::viridis(256), zlim=NULL, horizontal = FALSE, legend.cex = 1, legend.lab = NULL, legend.line = 2, legend.shrink = 0.9, legend.width = 1.2, legend.mar = ifelse(horizontal, 3.1, 5.1), axis.args = NULL, legend.args = NULL, size = 1, add = FALSE, legendLayout = NULL, highlight = TRUE, highlight.color = "grey30", ...) } %- maybe also 'usage' for other objects documented here. \arguments{ \item{x}{A vector of the x coordinates of the locations -or- a a 2 column matrix of the x-y coordinates. } \item{y}{A vector of the y coordinates -or- if the locations are passed in x the z vector } \item{z}{Values of the variable to be plotted. For bubblePlot if a character or factor will be assigned colors based on the order of appearance.} \item{nlevel}{Number of color levels.} \item{nx}{Number of grid boxes in x if a grid is not specified.} \item{ny}{Number of grid boxes in y. } \item{nrow}{Depreciated, same as nx.} \item{ncol}{Depreciated same as ny. } \item{grid}{A grid in the form of a \code{grid list}. } \item{add.legend}{If TRUE a legend color strip is added} \item{add}{If FALSE add to existing plot.} \item{col}{Color function or the color scale for the image, the default is the tim.colors function -- a pleasing spectrum for quilt.plot and the modern and versitle viridis for bubblePlot } \item{boundary.grid}{If FALSE the passed grid is considered to be the midpoints of the grid cells. If TRUE then these are assumed to define corners and the number of boxes is one less in each dimension.} \item{plot}{If FALSE just returns the image object instead of plotting it.} \item{FUN}{The function to apply to values that are common to a grid box. The default is to find the mean. (see \code{as.image}).} \item{na.rm}{If FALSE NAs are not removed from zand so a grid box even one of these values may be an NA. (See details below.)} \item{size}{Size of bubble dots in cex units. Can be a vector to procduce different size points in the scatterplot.} \item{zlim}{Numerical range to determine the colorscale. If omitted the range of z is used. } \item{\dots}{ for quilt.plot arguments to be passed to the \code{image.plot} function. For bubblePlot arguments to be passed to the \code{plot} function if \code{add=FALSE}, the default and to the \code{points} function if \code{add=TRUE}. } \item{horizontal}{ If false (default) legend will be a vertical strip on the right side. If true the legend strip will be along the bottom. } \item{highlight}{If TRUE will add a circle around the "bubble" in the color \code{highlight.color}. } \item{highlight.color}{ Color of circle, default is a darker grey.} \item{legend.cex}{Character expansion to change size of the legend label.} \item{legend.lab}{ Label for the axis of the color legend. Default is no label as this is usual evident from the plot title.} \item{legend.line}{Distance in units of character height (same as in \code{mtext}) of the legend label from the color bar. Make this larger if the label collides with the color axis labels.} \item{legend.mar}{ Width in characters of legend margin that has the axis. Default is 5.1 for a vertical legend and 3.1 for a horizontal legend.} \item{legend.shrink}{ Amount to shrink the size of legend relative to the full height or width of the plot. } \item{legend.width}{ Width in characters of the legend strip. Default is 1.2, a little bigger that the width of a character. } \item{axis.args}{A list giving additional arguments for the \code{axis} function used to create the legend axis. (See examples in \code{\link{image.plot}}.)} \item{legend.args}{The nuclear option: arguments for a complete specification of the legend label, e.g. if you need to the rotate text or other details. This is in the form of a list and is just passed to the mtext function and you will need to give both the side and line arguments for positioning. This usually will not be needed. (See examples in \code{\link{image.plot}} .)} \item{legendLayout}{The list returned by \code{setupLegend} that has the legend information about positioning.} } \details{ \strong{quilt.plot} This function combines the discretization to an image by the function \code{as.image} and is then graphed by \code{image.plot}. By default, locations that fall into the same grid box will have their z values averaged. This also means that observations that are NA will result in the grid box average also being NA and can produce unexpected results because the NA patterns can dominate the figure. If you are unsure of the effect try \code{na.rm = TRUE} for a comparison. A similar function exists in the lattice package and produces spiffy looking plots. The advantage of this fields version is that it uses the standard R graphics functions and is written in R code. Also, the aggregation to average values for z values in the same grid box allows for different choices of grids. If two locations are very close, separating them could result in very small boxes. Legend placement is never completely automatic. Place the legend independently for more control, perhaps using \code{image.plot} in tandem with \code{split.screen} or enlarging the plot margin See \code{help(image.plot)} for examples of this function and these strategies. \strong{bubblePlot} Why was this function was written for fields? Certainly ggplot has many options for this kind of figure. To quote Tim Hoar a gifted data scientist and software engineer at NCAR: "because we could". It is a crisp implementation of this type of plot using lower level fields functions. The user may choose simply to use the source code as the basis for a more detailed function. However, this is also a quick plot to introduce in teaching. This function is experimental in the sense it explores setting out a plotting region in advance of the actual plotting using R base graphics. See the functions \code{\link{setupLegend}} and \code{\link{addLegend}} for more details. Other graphics approaches in R such as ggplot determine the plotting regions and layout based on having the entire figure specification at hand. Although this a comprehensive solution it also seems overkill to just add a lone color bar to annotate a plot. Moreover, and the graphics lower level functions to add the color bar legend are already available from the image.plot functio. } \author{D.Nychka} \seealso{ as.image, discretize.image, image.plot, lattice, persp, drape.plot, } \examples{ data( ozone2) # plot 16 day of ozone data set quilt.plot( ozone2$lon.lat, ozone2$y[16,]) US( add=TRUE, col="grey", lwd=2) bubblePlot( ozone2$lon.lat, ozone2$y[16,] ) US( add=TRUE, col="magenta", lwd=2) # colors based on a factor or character vector O3Levels<- cut( ozone2$y[16,], c( 0,40,60,80,Inf), labels=c("low","bckgrd","med", "high")) table( O3Levels) bubblePlot( ozone2$lon.lat, O3Levels ) US( add=TRUE, col="magenta", lwd=2) ### adding a common legend strip "by hand" ## to a panel of plots ## and a custom color table coltab<- two.colors( 256, middle="grey50" ) par( oma=c( 0,0,0,5)) # save some room for the legend set.panel(2,2) zr<- range( ozone2$y, na.rm=TRUE) for( k in 1:4){ quilt.plot( ozone2$lon.lat, ozone2$y[15+k,], add.legend=FALSE, zlim=zr, col=coltab, nx=40, ny=40) US( add=TRUE) } par( oma=c(0,0,0,1)) image.plot(zlim=zr,legend.only=TRUE, col=coltab) # may have to adjust number of spaces in oma to make this work. # adding some grid lines and using the boundary.grid option # note that in this case grid boxes drawn to match lon/lats data( ozone2) lon<- ozone2$lon.lat[,1] lat<- ozone2$lon.lat[,2] z<- ozone2$y[16,] gridList<- list( x=-94 :-81, y= 36:45 ) quilt.plot( lon, lat, z, grid= gridList, boundary.grid = TRUE, col=viridis(256) ) # add some gird lines xline( gridList$x , col="grey", lwd=1, lty=1) yline( gridList$y, col="grey", lwd=1, lty=2) } \keyword{hplot}% at least one, from doc/KEYWORDS fields/man/QTps.Rd0000644000176200001440000002642614275214115013465 0ustar liggesusers%# %# fields is a package for analysis of spatial data written for %# the R software environment. %# Copyright (C) 2022 Colorado School of Mines %# 1500 Illinois St., Golden, CO 80401 %# Contact: Douglas Nychka, douglasnychka@gmail.edu, %# %# This program is free software; you can redistribute it and/or modify %# it under the terms of the GNU General Public License as published by %# the Free Software Foundation; either version 2 of the License, or %# (at your option) any later version. %# This program is distributed in the hope that it will be useful, %# but WITHOUT ANY WARRANTY; without even the implied warranty of %# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the %# GNU General Public License for more details. %# %# You should have received a copy of the GNU General Public License %# along with the R software environment if not, write to the Free Software %# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA %# or see http://www.r-project.org/Licenses/GPL-2 %##END HEADER %##END HEADER \name{QTps} \alias{QSreg} \alias{QTps} %- Also NEED an '\alias' for EACH other topic documented here. \title{ %% ~~function to do ... ~~ Robust and Quantile smoothing using a thin-plate spline } \description{ %% ~~ A concise (1-5 lines) description of what the function does. ~~ This function uses the standard thin plate spline function \code{Tps} and a algorithm based on psuedo data to compute robust smoothers based on the Huber weight function. By modifying the symmetry of the Huber function and changing the scale one can also approximate a quantile smoother. This function is experimental in that is not clear how efficient the psuedo-data algorithm is acheiving convergence to a solution. } \usage{ QTps(x, Y, ..., f.start = NULL, psi.scale = NULL, C = 1, alpha = 0.5, Niterations = 100, tolerance = 0.001, verbose = FALSE) QSreg(x, Y, lambda = NA, f.start = NULL, psi.scale = NULL, C = 1, alpha = 0.5, Niterations = 100, tolerance = 0.001, verbose = FALSE) } %- maybe also 'usage' for other objects documented here. \arguments{ \item{x}{ Locations of observations. } \item{Y}{ Observations } \item{lambda}{Value of the smoothing parameter. If NA found by an approximate corss-validation criterion.} \item{\dots}{ Any other arguments to pass to the Tps function, which are then passed to the Krig function. \code{ give.warnings =FALSE} can be used to turn off pesky warnings when not important (see example below). } \item{C}{Scaling for huber robust weighting function. (See below.) Usually it is better to leave this at 1 and just modify the scale \code{psi.scale} according to the size of the residuals. } \item{f.start}{ The initial value for the estimated function. If NULL then the constant function at the median of \code{Y} will be used. NOTE: This may not be a very good starting vector and a more robust method would be to use a local robust smoother. } \item{psi.scale}{ The scale value for the Huber function. When C=1, this is the point where the Huber weight function will change from quadratic to linear. Default is to use the scale \code{.05*mad(Y)} and \code{C=1} . Very small scales relative to the size of the residuals will cause the estimate to approximate a quantile spline. Very large scales will yield the ordinary least squares spline. } \item{alpha}{ The quantile that is estimated by the spline. Default is .5 giving a median. Equivalently this parameter controls the slope of the linear wings in the Huber function \code{2*alpha} for the positive wing and \code{2*(1-alpha)} for the negative wing. } \item{Niterations}{ Maximum number of interations of the psuedo data algorithm } \item{tolerance}{ Convergence criterion based on the relative change in the predicted values of the function estimate. Specifically if the criterion \code{mean(abs(f.hat.new - f.hat))/mean(abs(f.hat))} is less than \code{tolerance} the iterations re stopped. } \item{verbose}{ If TRUE intermediate results are printed out. } } \details{ These are experimental functions that use the psuedo-value algorithm to compute a class of robust and quantile problems. \code{QTps} use the \code{Tps} function as its least squares base smoother while \code{QSreg} uses the efficient \code{sreg} for 1-D cubic smoothing spline models. Currently for the 1-d spline problem we recommend using the (or at least comparing to ) the old \code{qsreg} function. \code{QSreg} was created to produce a more readable version of the 1-d method that follows the thin plate spline format. The Thin Plate Spline/ Kriging model through fields is: Y.k= f(x.k) = P(x.k) + Z(x.k) + e.k with the goal of estimating the smooth function: f(x)= P(x) + Z(x) The extension in this function is that e.k can be heavy tailed or have outliers and one would still like a robust estimate of f(x). In the quantile approximation (very small scale parameter) f(x) is an estimate of the alpha quantile of the conditional distribution of Y given x. The algorithm is iterative and involves at each step tapering the residuals in a nonlinear way. Let psi.wght be this tapering function then given an initial estimate of f, f.hat the new data for smoothing is \code{ Y.psuedo<- f.hat + psi.scale* psi.wght( Y - f.hat, psi.scale=psi.scale, alpha=alpha)} A thin plate spline is now estimated for these data and a new prediction for f is found. This new vector is used to define new psuedo values. Convergence is achieved when the the subsequent estimates of f.hat do not change between interations. The advantage of this algorithm is at every step a standard "least squares" thin plate spline is fit to the psuedo data. Because only the observation vector is changing at each iteration Some matrix decompositions need only be found once and the computations at each subsequent iteration are efficient. At convergence there is some asymptotic theory to suggest that the psuedo data can be fit using the least squares spline and the standard smoothing techinques are valid. For example one can consider looking at the cross-validation function for the psuedo-data as a robust version to select a smoothing parameter. This approach is different from the weighted least squared algorithm used in the \code{qsreg} function. Also \code{qsreg} is only designed to work with 1-d cubic smoothing splines. The "sigma" function indicating the departure from a pure quadratic loss function has the definition \preformatted{ qsreg.sigma<-function(r, alpha = 0.5, C = 1) temp<- ifelse( r< 0, ((1 - alpha) * r^2)/C , (alpha * r^2)/C) temp<- ifelse( r >C, 2 * alpha * r - alpha * C, temp) temp<- ifelse( r < -C, -2 * (1 - alpha) * r - (1 - alpha) * C, temp) temp } The derivative of this function "psi" is \preformatted{ qsreg.psi<- function(r, alpha = 0.5, C = 1) temp <- ifelse( r < 0, 2*(1-alpha)* r/C, 2*alpha * r/C ) temp <- ifelse( temp > 2*alpha, 2*alpha, temp) temp <- ifelse( temp < -2*(1-alpha), -2*(1-alpha), temp) temp } Note that if C is very small and if alpha = .5 then psi will essentially be 1 for r > 0 and -1 for r < 0. The key feature here is that outside a ceratin range the residual is truncated to a constant value. This is similar to the Windsorizing operation in classical robust statistics. Another advantage of the psuedo data algotrithm is that at convergence one can just apply all the usual generic functions from Tps to the psuedo data fit. For example, predict, surface, print, etc. Some additional components are added to the Krig/Tps object, however, for information about the iterations and original data. Note that currently these are not reported in the summaries and printing of the output object. } \value{ A \code{Krig} object with additional components: \item{yraw}{ Original Y values} \item{conv.info}{A vector giving the convergence criterion at each iteration.} \item{conv.flag}{If TRUE then convergence criterion was less than the tolerance value.} \item{psi.scale}{Scaling factor used for the psi.wght function.} \item{value}{Value of alpha.} } \references{ Oh, Hee-Seok, Thomas CM Lee, and Douglas W. Nychka. "Fast nonparametric quantile regression with arbitrary smoothing methods." Journal of Computational and Graphical Statistics 20.2 (2011): 510-526. } \author{ Doug Nychka } \seealso{ qsreg } \examples{ data(ozone2) x<- ozone2$lon.lat y<- ozone2$y[16,] # Smoothing fixed at 50 df look1<- QTps( x,y, psi.scale= 15, df= 50) \dontrun{ # Least squares spline (because scale is so large) look2<- QTps( x,y, psi.scale= 100, df= 50) # y.outlier<- y # add in a huge outlier. y.outlier[58]<- 1e5 look.outlier1<- QTps( x,y.outlier, psi.scale= 15, df= 50, give.warnings= FALSE) # least squares spline. look.outlier2<- QTps( x,y.outlier, psi.scale=100 , df= 50, give.warnings= FALSE) # set.panel(2,2) surface( look1) title("robust spline") surface( look2) title("least squares spline") surface( look.outlier1, zlim=c(0,250)) title("robust spline w/outlier") points( rbind(x[58,]), pch="+") surface( look.outlier2, zlim=c(0,250)) title("least squares spline w/outlier") points( rbind(x[58,]), pch="+") set.panel() } # some quantiles look50 <- QTps( x,y, psi.scale=.5,) look75 <- QTps( x,y,f.start= look50$fitted.values, alpha=.75) # a simulated example that finds some different quantiles. \dontrun{ set.seed(123) N<- 400 x<- matrix(runif( N), ncol=1) true.g<- x *(1-x)*2 true.g<- true.g/ mean( abs( true.g)) y<- true.g + .2*rnorm( N ) look0 <- QTps( x,y, psi.scale=10, df= 15) look50 <- QTps( x,y, df=15) look75 <- QTps( x,y,f.start= look50$fitted.values, df=15, alpha=.75) } \dontrun{ # this example tests the quantile estimate by Monte Carlo # by creating many replicate points to increase the sample size. # Replicate points are used because the computations for the # spline are dominated by the number of unique locations not the # total number of points. set.seed(123) N<- 80 M<- 200 x<- matrix( sort(runif( N)), ncol=1) x<- matrix( rep( x[,1],M), ncol=1) true.g<- x *(1-x)*2 true.g<- true.g/ mean( abs( true.g)) errors<- .2*(rexp( N*M) -1) y<- c(matrix(true.g, ncol=M, nrow=N) + .2 * matrix( errors, ncol=M, nrow=N)) look0 <- QTps( x,y, psi.scale=10, df= 15) look50 <- QTps( x,y, df=15) look75 <- QTps( x,y, df=15, alpha=.75) bplot.xy(x,y, N=25) xg<- seq(0,1,,200) lines( xg, predict( look0, x=xg), col="red") lines( xg, predict( look50, x=xg), col="blue") lines( xg, predict( look75, x=xg), col="green") } \dontrun{ # A comparison with qsreg qsreg.fit50<- qsreg(rat.diet$t,rat.diet$con, sc=.5) lam<- qsreg.fit50$cv.grid[,1] df<- qsreg.fit50$cv.grid[,2] M<- length(lam) CV<-rep( NA, M) M<- length( df) fhat.old<- NULL for ( k in M:1){ temp.obj<- QTps(rat.diet$t,rat.diet$con, f.start=fhat.old, psi.scale=.5, tolerance=1e-6, verbose=FALSE, df= df[k], give.warnings=FALSE) # avoids warnings from Krig search on lambda cat(k, " ") CV[k] <- temp.obj$Qinfo$CV.psuedo fhat.old<- temp.obj$fitted.values } plot( df, CV, type="l", lwd=2) # psuedo data estimate points( qsreg.fit50$cv.grid[,c(5,6)], col="blue") # alternative CV estimate via reweighted LS points( qsreg.fit50$cv.grid[,c(2,3)], col="red") } } % Add one or more standard keywords, see file 'KEYWORDS' in the % R documentation directory. \keyword{spatial} fields/man/flame.Rd0000644000176200001440000000355314275214115013656 0ustar liggesusers%# %# fields is a package for analysis of spatial data written for %# the R software environment. %# Copyright (C) 2022 Colorado School of Mines %# 1500 Illinois St., Golden, CO 80401 %# Contact: Douglas Nychka, douglasnychka@gmail.edu, %# %# This program is free software; you can redistribute it and/or modify %# it under the terms of the GNU General Public License as published by %# the Free Software Foundation; either version 2 of the License, or %# (at your option) any later version. %# This program is distributed in the hope that it will be useful, %# but WITHOUT ANY WARRANTY; without even the implied warranty of %# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the %# GNU General Public License for more details. %# %# You should have received a copy of the GNU General Public License %# along with the R software environment if not, write to the Free Software %# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA %# or see http://www.r-project.org/Licenses/GPL-2 %##END HEADER %##END HEADER \name{flame} \alias{flame} \title{ Response surface experiment ionizing a reagent } \description{ The characteristics of an ionizing flame are varied with the intent of maximizing the intensity of emitted light for lithuim in solution. Areas outside of the measurements are where the mixture may explode! Note that the optimum is close to the boundary. Source of data is from a master's level lab experiment in analytical chemistry from Chuck Boss's course at NCSU. This is list with the following components } \arguments{ \item{x}{ x is a 2 column matrix with the different Fuel and oxygen flow rates for the burner. } \item{y}{ y is the response. The intensity of light at a particular wavelength indicative of Lithium ions. } } \keyword{datasets} % docclass is data % Converted by Sd2Rd version 1.21. fields/man/summary.Krig.Rd0000644000176200001440000000441714275214115015162 0ustar liggesusers%# %# fields is a package for analysis of spatial data written for %# the R software environment. %# Copyright (C) 2022 Colorado School of Mines %# 1500 Illinois St., Golden, CO 80401 %# Contact: Douglas Nychka, douglasnychka@gmail.edu, %# %# This program is free software; you can redistribute it and/or modify %# it under the terms of the GNU General Public License as published by %# the Free Software Foundation; either version 2 of the License, or %# (at your option) any later version. %# This program is distributed in the hope that it will be useful, %# but WITHOUT ANY WARRANTY; without even the implied warranty of %# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the %# GNU General Public License for more details. %# %# You should have received a copy of the GNU General Public License %# along with the R software environment if not, write to the Free Software %# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA %# or see http://www.r-project.org/Licenses/GPL-2 %##END HEADER %##END HEADER \name{summary.Krig} \alias{summary.Krig} \title{ Summary for Krig or spatialProcess estimated models. } \description{ Creates a list of summary results including estimates for the nugget variance (tau) and the smoothing parameter (lambda). This list is usually printed using a "print.summary" function for nice formatting. } \usage{ \method{summary}{Krig}(object, digits=4,...) } \arguments{ \item{object}{ A Krig or spatialProcess object. } \item{digits}{ Number of significant digits in summary. } \item{\dots}{Other arguments to summary} } \value{ Gives a summary of the Krig object. The components include the function call, number of observations, effective degrees of freedom, residual degrees of freedom, root mean squared error, R-squared and adjusted R-squared, log10(lambda), cost, GCV minimum and a summary of the residuals. } \details{ This function is a method for the generic function summary for class Krig. The results are formatted and printed using print.summary.Krig. } \seealso{ Krig, summary, print.summary.Krig, summary.spatialProcess } \examples{ fit<- Krig(ChicagoO3$x, ChicagoO3$y, aRange=100) summary(fit) # summary of fit } \keyword{spatial} % docclass is function % Converted by Sd2Rd version 1.21. fields/man/drape.plot.Rd0000644000176200001440000001612614275214115014642 0ustar liggesusers%# %# fields is a package for analysis of spatial data written for %# the R software environment. %# Copyright (C) 2022 Colorado School of Mines %# 1500 Illinois St., Golden, CO 80401 %# Contact: Douglas Nychka, douglasnychka@gmail.edu, %# %# This program is free software; you can redistribute it and/or modify %# it under the terms of the GNU General Public License as published by %# the Free Software Foundation; either version 2 of the License, or %# (at your option) any later version. %# This program is distributed in the hope that it will be useful, %# but WITHOUT ANY WARRANTY; without even the implied warranty of %# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the %# GNU General Public License for more details. %# %# You should have received a copy of the GNU General Public License %# along with the R software environment if not, write to the Free Software %# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA %# or see http://www.r-project.org/Licenses/GPL-2 %##END HEADER %##END HEADER \name{drape.plot} \alias{drape.color} \alias{drape.plot} %- Also NEED an '\alias' for EACH other topic documented here. \title{Perspective plot draped with colors in the facets.} \description{ Function to produce the usual wireframe perspective plot with the facets being filled with different colors. By default the colors are assigned from a color bar based on the z values. \code{drape.color} can be used to create a color matrix different from the z matrix used for the wireframe.} \usage{ drape.plot(x, y, z, z2=NULL, col = tim.colors(64), zlim = range(z, na.rm=TRUE), zlim2 = NULL, add.legend = TRUE, horizontal = TRUE, theta = 30, phi = 20, breaks=NA, ...) drape.color(z, col = tim.colors(64), zlim = NULL,breaks, transparent.color = "white", midpoint=TRUE, eps=1e-8) } %- maybe also 'usage' for other objects documented here. \arguments{ \item{x}{ grid values for x coordinate (or if x is a list the components x y and z are used.)} \item{y}{grid values for y coordinate} \item{z}{A matrix of z heights } \item{z2}{ A matrix of z values to use for coloring facets. If NULL then z is used for this purpose} \item{col}{ A color table for the z values that will be used for draping} \item{zlim}{the z limits for \code{z} these are used to set up the scale of the persp plot. This defaults to range(z, na.rm=TRUE) as in persp} \item{zlim2}{the z limits for \code{z2} these are used to set up the color scale. This defaults to } \item{add.legend}{ If true a color strip is added as a legend.} \item{horizontal}{ If true color strip is put at bottom of the plot, if FALSE it is placed vertically on the right side. } \item{theta}{ x-y rotation angle for perspective. } \item{phi}{ z-angle for perspective. } \item{transparent.color}{ Color to use when given an NA in z} \item{midpoint}{ If TRUE color scale is formed for midpoints of z obtained by averaging 4 corners.} \item{breaks}{Numerical divisions for the color scale. If the default (NA) is N+1 equally spaced points in the range \code{zlim} where N is the number of colors in \code{col}. This is the argument has the same effect as used in the \code{image} and \code{image.plot} functions.} \item{eps}{Amount to inflate the range (1+/- eps) to inlude points on break endpoints.} \item{\dots}{ Other arguments that will be passed to the persp function. The most common is zlim the z limits for the 3-d plot and also the limits to set up the color scale. The default for zlim is the range of z.} } \value{ \code{drape.plot} If an assignment is made the projection matrix from persp is returned. This information can be used to add additional 3-d features to the plot. See the \code{persp} help file for an example how to add additional points and lines using the \code{trans3d} function and also the example below. \code{drape.color} If dim( z) = M,N this function returns a list with components: \item{color.index}{An (M-1)X(N-1) matrix (midpoint= TRUE) or MXN matrx (midpoint=FALSE) where each element is a text string specifying the color. } \item{breaks}{The breaks used to assign the numerical values in z to color categories.} } \details{ The legend strip may obscure part of the plot. If so, add this as another step using image.plot. When using \code{drape.color} just drop the results into the \code{col} argument of \code{persp}. Given this function there are no surprises how the higher level \code{drape.plot} works: it calls \code{drape.color} followed by \code{persp} and finally the legend strip is added with \code{image.plot}. The color scales essentially default to the ranges of the z values. However, by specifying zlim and/or zlim2 one has more control of how the perspective plot is scaled and the limits of the color scale used to fill the facets. The color assignments are done by dividing up the zlim2 interval into equally spaced bins and adding a very small inflation to these limits. The mean z2 values, comprising an (M-1)X(N-1) matrix, for each facet are discretized to the bins. The bin numbers then become the indices used for the color scale. If zlim2 is not specified it is the range of the z2 matrix is used to generate the ranges of the color bar. Note that this may be different than the range of the mean facets. If z2 is not passed then z is used in its place and in this case the zlim2 or zlim argument can used to define the color scale. This kind of plot is also supported through the wireframe function in the \code{lattice} package. The advantage of the fields version is that it uses the standard R graphics functions -- and is written in R code. The drape plot is also drawn by the fields \code{surface} function with \code{type="P"}. } \author{D. Nychka } \seealso{ image.plot, quilt.plot, persp, plot.surface, surface, lattice, trans3d} \examples{ # an obvious choice: # Dr. R's favorite New Zealand Volcano! data( volcano) M<- nrow( volcano) N<- ncol( volcano) x<- seq( 0,1,,M) y<- seq( 0,1,,N) pm<- drape.plot( x,y,volcano, col=terrain.colors(128)) # use different range for color scale and persp plot # setting of border omits the mesh lines drape.plot( x,y,volcano, col=topo.colors(128),zlim=c(0,300), zlim2=c( 120,200), border=NA) # note tranparent color for facets outside the zlim2 range #The projection has been saved in pm # add a point marking the summit zsummit <- max( volcano) ix<- row( volcano)[volcano==zsummit] iy <- col( volcano)[volcano==zsummit] uv <- trans3d( x[ix], y[iy],zsummit,pm) points( uv, col="magenta", pch="+", cex=2) # overlay volcano wireframe with gradient in x direction. dz<- ( volcano[1:(M-1), 1:(N-1)] - volcano[2:(M), 1:(N-1)] + volcano[1:(M-1), 2:(N)] - volcano[2:(M), 2:(N)] )/2 # convert dz to a color scale: zlim<- range( c( dz), na.rm=TRUE) zcol<-drape.color( dz, zlim =zlim, col = viridis(64) )$color.index # with these colors persp( volcano, col=zcol, theta=30, phi=20, border=NA,expand=.3 ) # add legend using image.plot function image.plot( zlim=zlim, legend.only =TRUE, horizontal =TRUE, col= viridis(64)) } \keyword{hplot}% at least one, from doc/KEYWORDS fields/man/plot.surface.Rd0000644000176200001440000000636114275214115015177 0ustar liggesusers%# %# fields is a package for analysis of spatial data written for %# the R software environment. %# Copyright (C) 2022 Colorado School of Mines %# 1500 Illinois St., Golden, CO 80401 %# Contact: Douglas Nychka, douglasnychka@gmail.edu, %# %# This program is free software; you can redistribute it and/or modify %# it under the terms of the GNU General Public License as published by %# the Free Software Foundation; either version 2 of the License, or %# (at your option) any later version. %# This program is distributed in the hope that it will be useful, %# but WITHOUT ANY WARRANTY; without even the implied warranty of %# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the %# GNU General Public License for more details. %# %# You should have received a copy of the GNU General Public License %# along with the R software environment if not, write to the Free Software %# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA %# or see http://www.r-project.org/Licenses/GPL-2 %##END HEADER %##END HEADER \name{plot.surface} \alias{plot.surface} \title{ Plots a surface } \description{ Plots a surface object in several different ways to give 3-d information e.g. a contour plots, perspective plots. } \usage{ \method{plot}{surface}(x, main = NULL, type = "C", zlab = NULL, xlab = NULL, ylab = NULL, levels = NULL, zlim = NULL, graphics.reset = NULL, labcex = 0.6, add.legend=TRUE, ...) } \arguments{ \item{x}{ A surface object. At the minimum a list with components x,y and z in the same form as the input list for the standard contour, persp or image functions. This can also be an object from predictSurface. } \item{main}{ Title for plot. } \item{type}{ type="p" for a perspective/drape plot (see drape.plot), type="I" for an image plot with a legend strip (see image.plot), type="c" draws a contour plot, type="C" is the "I" option but with contours lines added. type="b" gives both "p" and "C" as a 2X1 panel } \item{zlab}{ z-axes label } \item{xlab}{ x-axes label } \item{ylab}{ y-axes labels } \item{levels}{ Vector of levels to be passed to contour function. } \item{graphics.reset}{ Reset to original graphics parameters after function plotting. Default is to reset if type ="b" but not for the single plot options. } \item{zlim}{ Sets z limits on perspective plot. } \item{labcex}{ Label sizes for axis labeling etc. } \item{add.legend}{ If TRUE adds a legend to the draped perspective plot} \item{\dots}{ Other graphical parameters that are passed along to either drape.persp or image.plot } } \seealso{ surface, predictSurface, as.surface, drape.plot, image.plot } \examples{ x<- seq( -2,2,,80) y<- seq( -2,2,,80) # a lazy way to create some test image z<- outer( x,y, "+") # create basic image/surface object obj<- list(x=x, y=y,z=z) # basic contour plot # note how graphical parameters appropriate to contour are passed plot.surface( obj, type="c", col="red") # using a fields function to fit a surface and evaluate as surface object. fit<- Tps( BD[,1:4], BD$lnya) # fit surface to data # surface of variables 2 and 3 holding 1 and 4 fixed at their median levels out.p<-predictSurface(fit, xy=c(2,3)) plot.surface(out.p) # surface plot } \keyword{hplot} % docclass is function % Converted by Sd2Rd version 1.21. fields/man/bplot.xy.Rd0000644000176200001440000000463514275214115014353 0ustar liggesusers%# %# fields is a package for analysis of spatial data written for %# the R software environment. %# Copyright (C) 2022 Colorado School of Mines %# 1500 Illinois St., Golden, CO 80401 %# Contact: Douglas Nychka, douglasnychka@gmail.edu, %# %# This program is free software; you can redistribute it and/or modify %# it under the terms of the GNU General Public License as published by %# the Free Software Foundation; either version 2 of the License, or %# (at your option) any later version. %# This program is distributed in the hope that it will be useful, %# but WITHOUT ANY WARRANTY; without even the implied warranty of %# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the %# GNU General Public License for more details. %# %# You should have received a copy of the GNU General Public License %# along with the R software environment if not, write to the Free Software %# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA %# or see http://www.r-project.org/Licenses/GPL-2 %##END HEADER %##END HEADER \name{bplot.xy} \alias{bplot.xy} \title{ Boxplots for conditional distribution } \description{ Draws boxplots for y by binning on x. This gives a coarse, but quick, representation of the conditional distrubtion of [Y|X] in terms of boxplots. } \usage{ bplot.xy(x, y, N = 10, breaks = pretty(x, N, eps.correct = 1), plot = TRUE, axes = TRUE, ...) } \arguments{ \item{x}{ Vector to use for bin membership } \item{y}{ Vector to use for constructing boxplot statistics. } \item{N}{ Number of bins on x. Default is 10. } \item{breaks}{ Break points defining bin boundaries. These can be unequally spaced. } \item{plot}{ If FALSE just returns a list with the statistics used for plotting the box plots, bin centers, etc. -- More stuff than you can imagine! } \item{axes}{The usual plotting argument -- If TRUE then axes are plotted.} \item{\dots }{ Any other optional arguments passed to the standard \code{boxplot} function. } } \seealso{ bplot, draw.bplot } \examples{ # condition on swim times to see how run times vary bplot.xy( minitri$swim, minitri$run, N=5) # bivariate normal corr= .8 set.seed( 123) x<-rnorm( 2000) y<- .8*x + sqrt( 1- .8**2)*rnorm( 200) # bplot.xy(x,y) # bplot.xy( x,y, breaks=seq( -3, 3,,25) , xlim =c(-4,4), ylim =c(-4,4), col="grey80", lwd=2) points( x,y,col=3, cex=.5) } \keyword{hplot} % docclass is function % Converted by Sd2Rd version 1.21. fields/man/RCMexample.Rd0000644000176200001440000000663114275214115014567 0ustar liggesusers%# %# fields is a package for analysis of spatial data written for %# the R software environment. %# Copyright (C) 2022 Colorado School of Mines %# 1500 Illinois St., Golden, CO 80401 %# Contact: Douglas Nychka, douglasnychka@gmail.edu, %# %# This program is free software; you can redistribute it and/or modify %# it under the terms of the GNU General Public License as published by %# the Free Software Foundation; either version 2 of the License, or %# (at your option) any later version. %# This program is distributed in the hope that it will be useful, %# but WITHOUT ANY WARRANTY; without even the implied warranty of %# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the %# GNU General Public License for more details. %# %# You should have received a copy of the GNU General Public License %# along with the R software environment if not, write to the Free Software %# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA %# or see http://www.r-project.org/Licenses/GPL-2 %##END HEADER %##END HEADER \name{RCMexample} \alias{RCMexample} \docType{data} \title{3-hour precipitation fields from a regional climate model} \description{ These are few model output fields from the North American Regional Climate Change and Assessment Program (NARCCAP). The images are transformed surface precipitation fields simulated by the WRFP regional climate model (RCM) over North Amreica forced by observation data. The fields are 3 hour precipitation for 8 time periods in January 1, 1979. The grid is unequally spaced in longitude and latitude appropriate projection centered on the model domain.The grid points are nearly equally spaced in great circle distance due to this projection. Precipitation is in a log 10 scale where values smaller than 4.39e-5 ( the .87 quantile) have been been set to this value. Longitudes have been shifted from the original coordinates (0-360) to the range (-180-180) that is assumed by the R \code{map} function. } \usage{data(RCMexample)} \format{ The format is a list of three arrays: \itemize{ \item x: 123X101 matrix of the longitude locations \item y: 123X101 matrix of the latitude locations \item z: 123X101X8 transformed matrix of precipitation } Spatial units are degrees with longitude being -180,180 with the prime meridian at 0. Precipitation is log 10 of cm / 3 hour period. } \details{ This is primarily an example of a regular grid that is not equally spaced and is due to transforming an equally spaced grid from one map projection into longitude latitude coordinates. This model is one small part of an extension series of numerical experiments the North American Regional Climate Change and Assessment Program (NARCCAP). NARCCAP has used 4 global climate models and observational data to supply the atmospheric boundery conditions for 6 different regional climate models. In the current data the forcing is the observations derived from the NCEP reanalysis data and is for Janurary 1, 1979. The full simulation runs for 20 years from this starting date. See the NARCCAP web page for more information about these data. To facilatate a better representation of these fields the raw precipitation values have been transformed to the log scale with all values below 4.39E-5 cm/3 hours set to this lower bound. } \examples{ data(RCMexample) # second time period image.plot( RCMexample$x, RCMexample$y, RCMexample$z[,,2]) world( add=TRUE, lwd=2, col="grey") } \keyword{datasets} fields/man/stats.Rd0000644000176200001440000000506314275214115013726 0ustar liggesusers%# %# fields is a package for analysis of spatial data written for %# the R software environment. %# Copyright (C) 2022 Colorado School of Mines %# 1500 Illinois St., Golden, CO 80401 %# Contact: Douglas Nychka, douglasnychka@gmail.edu, %# %# This program is free software; you can redistribute it and/or modify %# it under the terms of the GNU General Public License as published by %# the Free Software Foundation; either version 2 of the License, or %# (at your option) any later version. %# This program is distributed in the hope that it will be useful, %# but WITHOUT ANY WARRANTY; without even the implied warranty of %# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the %# GNU General Public License for more details. %# %# You should have received a copy of the GNU General Public License %# along with the R software environment if not, write to the Free Software %# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA %# or see http://www.r-project.org/Licenses/GPL-2 %##END HEADER %##END HEADER \name{stats} \alias{stats} \title{ Calculate summary statistics } \description{ Various summary statistics are calculated for different types of data. } \usage{ stats(x, by) } \arguments{ \item{x}{ The data structure to compute the statistics. This can either be a vector, matrix (data sets are the columns), or a list (data sets are the components). } \item{by}{ If x is a vector, an optional vector (either character or numerical) specifying the categories to divide x into separate data sets. } } \value{ A matrix where rows index the summary statistics and the columns index the separate data sets. } \details{ Stats breaks x up into separate data sets and then calls describe to calculate the statistics. Statistics are found by columns for matrices, by components for a list and by the relevent groups when a numeric vector and a by vector are given. The default set of statistics are the number of (nonmissing) observations, mean, standard deviation, minimum, lower quartile, median, upper quartile, maximum, and number of missing observations. If any data set is nonnumeric, missing values are returned for the statistics. The by argument is a useful way to calculate statistics on parts of a data set according to different cases. } \seealso{ stats.bin, stats.bplot, describe } \examples{ #Statistics for 8 normal random samples: zork<- matrix( rnorm(200), ncol=8) stats(zork) zork<- rnorm( 200) id<- sample( 1:8, 200, replace=TRUE) stats( zork, by=id) } \keyword{univar} % docclass is function % Converted by Sd2Rd version 1.21. fields/man/rat.diet.Rd0000644000176200001440000000333014275214115014275 0ustar liggesusers%# %# fields is a package for analysis of spatial data written for %# the R software environment. %# Copyright (C) 2022 Colorado School of Mines %# 1500 Illinois St., Golden, CO 80401 %# Contact: Douglas Nychka, douglasnychka@gmail.edu, %# %# This program is free software; you can redistribute it and/or modify %# it under the terms of the GNU General Public License as published by %# the Free Software Foundation; either version 2 of the License, or %# (at your option) any later version. %# This program is distributed in the hope that it will be useful, %# but WITHOUT ANY WARRANTY; without even the implied warranty of %# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the %# GNU General Public License for more details. %# %# You should have received a copy of the GNU General Public License %# along with the R software environment if not, write to the Free Software %# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA %# or see http://www.r-project.org/Licenses/GPL-2 %##END HEADER %##END HEADER \name{rat.diet} \alias{rat.diet} \title{ Experiment studying an appetite supressant in rats. } \description{ The `rat.diet' data frame has 39 rows and 3 columns. These are data from a study of an appetite supressant given to young rats. The suppressant was removed from the treatment group at around 60 days. The responses are the median food intake and each group had approximately 10 animals. } \usage{ data(rat.diet) } \format{ This data frame contains the following columns: \describe{ \item{t}{ Time in days} \item{con}{ Median food intake of the control group } \item{trt}{ Median food intake of the treatment group} } } \keyword{datasets} % docclass is data % Converted by Sd2Rd version 1.21. fields/man/set.panel.Rd0000644000176200001440000000517414275214115014464 0ustar liggesusers%# %# fields is a package for analysis of spatial data written for %# the R software environment. %# Copyright (C) 2022 Colorado School of Mines %# 1500 Illinois St., Golden, CO 80401 %# Contact: Douglas Nychka, douglasnychka@gmail.edu, %# %# This program is free software; you can redistribute it and/or modify %# it under the terms of the GNU General Public License as published by %# the Free Software Foundation; either version 2 of the License, or %# (at your option) any later version. %# This program is distributed in the hope that it will be useful, %# but WITHOUT ANY WARRANTY; without even the implied warranty of %# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the %# GNU General Public License for more details. %# %# You should have received a copy of the GNU General Public License %# along with the R software environment if not, write to the Free Software %# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA %# or see http://www.r-project.org/Licenses/GPL-2 %##END HEADER %##END HEADER \name{set.panel} \alias{set.panel} \title{ Specify a panel of plots } \description{ Divides up the graphics window into a matrix of plots. } \usage{ set.panel(m=1, n=1, relax=FALSE) } \arguments{ \item{m}{ Number of rows in the panel of plots } \item{n}{ Number of columns in the panel. } \item{relax}{ If true and the par command is already set for multiple plots, then the set.panel command is ignored. The default is relax set to false. } } \details{ After set.panel is called, the graphics screen is reset to put plots according to a m x n table. Plotting starts in the upper left hand corner and proceeds row by row. After m x n plots have been drawn, the next plot will erase the window and start in the 1,1 position again. This function is just a repackaging for specifying the mfrow argument to par. Setting up a panel of plots is a quick way to change the aspect ratio of the graph (ratio of height to width) or the size. For example, plotting 2 plots to a page produces a useful size graph for including in a report. You can print out the graphs at any stage without having to fill up the entire window with plots. This function, except for the "relax" option is equivalent to the S sequence: par( mfrow=c(m,n)). } \section{Side Effects}{ The function will echo your choice of m and n to the terminal. } \seealso{ \code{par} } \examples{ set.panel(5,2) #divide screen to hold 10 plots where there are 5 rows #and 2 columns plot( 1:10) plot( 2:8) set.panel() #reset screen to one plot per screen } \keyword{hplot} % docclass is function % Converted by Sd2Rd version 1.21. fields/man/poly.image.Rd0000644000176200001440000001317614341253732014642 0ustar liggesusers%# %# fields is a package for analysis of spatial data written for %# the R software environment. %# Copyright (C) 2022 Colorado School of Mines %# 1500 Illinois St., Golden, CO 80401 %# Contact: Douglas Nychka, douglasnychka@gmail.edu, %# %# This program is free software; you can redistribute it and/or modify %# it under the terms of the GNU General Public License as published by %# the Free Software Foundation; either version 2 of the License, or %# (at your option) any later version. %# This program is distributed in the hope that it will be useful, %# but WITHOUT ANY WARRANTY; without even the implied warranty of %# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the %# GNU General Public License for more details. %# %# You should have received a copy of the GNU General Public License %# along with the R software environment if not, write to the Free Software %# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA %# or see http://www.r-project.org/Licenses/GPL-2 %##END HEADER \name{poly.image} \alias{poly.image} \alias{poly.image.regrid} \title{Image plot for cells that are irregular quadrilaterals.} \description{ Creates an image using polygon filling based on a grid of irregular quadrilaterals. This function is useful for a regular grid that has been transformed to another nonlinear or rotated coordinate system. This situation comes up in lon-lat grids created under different map projections. Unlike the usual image format this function requires the grid to be specified as two matrices x and y that given the grid x and y coordinates explicitly for every grid point. } \usage{ poly.image(x, y, z, col = tim.colors(64), breaks, transparent.color = "white", midpoint = FALSE, zlim = range(z, na.rm = TRUE), xlim = range(x), ylim = range(y), add = FALSE, border = NA, lwd.poly = 1, asp = NA, ...) poly.image.regrid(x) } %- maybe also 'usage' for other objects documented here. \arguments{ \item{x}{A matrix of the x locations of the grid. } \item{y}{A matrix of the y locations of the grid. } \item{z}{Values for each grid cell. Can either be the value at the grid points or interpreted as the midpoint of the grid cell. } \item{col}{ Color scale for plotting. } \item{breaks}{Numerical breaks to match to the colors. If missing breaks are equally spaced on the range \code{zlim}.} \item{transparent.color}{ Color to plot cells that are outside the range specified in the function call. } \item{midpoint}{ Only relevant if the dimensions of x,y, and z are the same. If TRUE the z values will be averaged and then used as the cell midpoints. If FALSE the x/y grid will be expanded and shifted to represent grid cells corners. (See poly.image.regrid.) } \item{zlim}{ Plotting limits for z. } \item{xlim}{Plotting limits for x. } \item{ylim}{Plotting limits for y.} \item{add}{ If TRUE will add image onto current plot. } \item{border}{Color of the edges of the quadrilaterals, the default is no color.} \item{lwd.poly}{Line width for the mesh surface. i.e. the outlines of the quadrilateral facets. This might have to be set smaller than one if rounded corners on the facets are visible. } \item{asp}{The plot aspect with similar function to that in the \code{plot} function. } \item{\dots}{ If add is FALSE, additional graphical arguments that will be supplied to the plot function. } } \details{ This function is straightforward except in the case when the dimensions of x,y, and z are equal. In this case the relationship of the values to the grid cells is ambigious and the switch midpoint gives two possible solutions. The z values at 4 neighboring grid cells can be averaged to estimate a new value interpreted to be at the center of the grid. This is done when midpoint is TRUE. Alternatively the full set of z values can be retained by redefining the grid. This is accomplisehd by finding the midpoints of x and y grid points and adding two outside rows and cols to complete the grid. The new result is a new grid that is is (M+1)X (N+1) if z is MXN. These new grid points define cells that contain each of the original grid points as their midpoints. Of course the advantage of this alternative is that the values of z are preserved in the image plot; a feature that may be important for some uses. The function image.plot uses this function internally when image information is passed in this format and can add a legend. In most cases just use image.plot. The function \code{poly.image.regrid} does a simple averaging and extrapolation of the grid locations to shift from midpoints to corners. In the interior grid corners are found by the average of the 4 closest midpoints. For the edges the corners are just extrapolated based on the separation of nieghboring grid cells. } \author{Doug Nychka } \seealso{image.plot} \examples{ data(RCMexample) set.panel( 1,2) par(pty="s") # plot with grid modified poly.image( RCMexample$x, RCMexample$y, RCMexample$z[,,1]) # use midpoints of z poly.image( RCMexample$x, RCMexample$y, RCMexample$z[,,1],midpoint=TRUE) set.panel() # an example with quantile breaks brk<- quantile( RCMexample$z[,,1], c( 0, .9,.95,.99,1.0) ) poly.image( RCMexample$x, RCMexample$y, RCMexample$z[,,1], breaks=brk, col= rainbow(4)) # images are very similar. set.panel() # Regridding of x and y l1<- poly.image.regrid( RCMexample$x) l2<- poly.image.regrid( RCMexample$y) # test that this works i<- 1:10 plot( l1[i,i], l2[i,i]) points( RCMexample$x[i,i], RCMexample$y[i,i],col="red") } % Add one or more standard keywords, see file 'KEYWORDS' in the % R documentation directory. \keyword{spatial} fields/man/summary.ncdf.Rd0000644000176200001440000000402514275214115015173 0ustar liggesusers%# %# fields is a package for analysis of spatial data written for %# the R software environment. %# Copyright (C) 2022 Colorado School of Mines %# 1500 Illinois St., Golden, CO 80401 %# Contact: Douglas Nychka, douglasnychka@gmail.edu, %# %# This program is free software; you can redistribute it and/or modify %# it under the terms of the GNU General Public License as published by %# the Free Software Foundation; either version 2 of the License, or %# (at your option) any later version. %# This program is distributed in the hope that it will be useful, %# but WITHOUT ANY WARRANTY; without even the implied warranty of %# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the %# GNU General Public License for more details. %# %# You should have received a copy of the GNU General Public License %# along with the R software environment if not, write to the Free Software %# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA %# or see http://www.r-project.org/Licenses/GPL-2 %##END HEADER %##END HEADER \name{summary.ncdf} \alias{summary.ncdf} %- Also NEED an '\alias' for EACH other topic documented here. \title{Summarizes a netCDF file handle} \description{ Provides a summary of the variable names and sizes from the handle returned from netCDF file. } \usage{ \method{summary}{ncdf}(object,...) } %- maybe also 'usage' for other objects documented here. \arguments{ \item{object}{ The "handle" returned by the \code{read.ncdf} function from the ncdf package. } \item{\dots}{ Other arguments to pass to this function. Currently, no other arguments are used. } } \details{ This function is out of place in fields but was included because often large geophysical data sets are in netCDF format and the ncdf R package is also needed. To date the summary capability in the ncdf package is limited and this function is used to supplement it use. The function is also a a useful device to see how the ncdf object is structured. } \author{ D. Nychka } \seealso{ ncdf} \keyword{ IO }% at least one, from doc/KEYWORDS fields/man/CO.Rd0000644000176200001440000002031514275214115013066 0ustar liggesusers%# %# fields is a package for analysis of spatial data written for %# the R software environment. %# Copyright (C) 2022 Colorado School of Mines %# 1500 Illinois St., Golden, CO 80401 %# Contact: Douglas Nychka, douglasnychka@gmail.edu, %# %# This program is free software; you can redistribute it and/or modify %# it under the terms of the GNU General Public License as published by %# the Free Software Foundation; either version 2 of the License, or %# (at your option) any later version. %# This program is distributed in the hope that it will be useful, %# but WITHOUT ANY WARRANTY; without even the implied warranty of %# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the %# GNU General Public License for more details. %# %# You should have received a copy of the GNU General Public License %# along with the R software environment if not, write to the Free Software %# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA %# or see http://www.r-project.org/Licenses/GPL-2 %##END HEADER %##END HEADER \name{Colorado Monthly Meteorological Data} \alias{COmonthlyMet} \alias{CO.elev} \alias{CO.id} \alias{CO.loc} \alias{CO.names} \alias{CO.ppt} \alias{CO.ppt.MAM} \alias{CO.tmax} \alias{CO.tmax.MAM} \alias{CO.tmin} \alias{CO.tmin.MAM} \alias{CO.years} \alias{CO.ppt.MAM.climate} \alias{CO.tmax.MAM.climate} \alias{CO.tmean.MAM.climate} \alias{CO.tmin.MAM.climate} \alias{CO.elevGrid} \alias{CO.Grid} \title{Monthly surface meterology for Colorado 1895-1997} \description{ Source: These is a group of R data sets for monthly min/max temperatures and precipitation over the period 1895-1997. It is a subset extracted from the more extensive US data record. Temperature is in degrees C and precipitation is total monthly accumulation in millimeters. Note that minimum (maximum) monthly tempertuare is the mean of the daily minimum (maximum) temperatures. Data domain: A rectagular lon/lat region [-109.5,-101]x [36.5,41.5] larger than the boundary of Colorado comprises approximately 400 stations. Although there are additional stations reported in this domain, stations that only report preicipitation or only report temperatures have been excluded. In addition stations that have mismatches between locations and elevations from the two meta data files have also been excluded. The net result is 367 stations that have colocated temperatures and precipitation. } \format{ This group of data sets is organized with the following objects: \describe{ \item{CO.info}{A data frame with columns: station id, elev, lon, lat, station name} \item{CO.elev}{elevation in meters} \item{CO.elevGrid}{An image object being elevation in meters on a 4 km grid covering Colorado. } \item{CO.id}{ alphanumeric station id codes} \item{CO.loc}{locations in lon/lat} \item{CO.Grid}{Just the grid.list used in the CO.elevGrid.} \item{CO.ppt CO.tmax CO.tmin}{Monthly means as three dimensional arrays ( Year, Month, Station). Temperature is in degrees C and precipitation in total monthly accumulation in millimeters.} \item{CO.ppt.MAM CO.tmax.MAM CO.tmin.MAM}{Spring seasonal means (March, April,May) as two dimensional arrays (Year, Station).} \item{CO.MAM.ppt.climate CO.MAM.tmax.climate CO.MAM.tmin.climate}{Spring seasonal means (March, April,May) means by station for the period 1960-1990. If less than 15 years are present over this period an NA is recorded. No detreding or other adjustments have been made for these mean estimates. } } } \examples{ data(COmonthlyMet) #Spatial plot of 1997 Spring average daily maximum temps quilt.plot( CO.loc,CO.tmax.MAM[103,] ) US( add=TRUE) title( "Recorded MAM max temperatures (1997)") # min and max temperatures against elevation matplot( CO.elev, cbind( CO.tmax.MAM[103,], CO.tmin.MAM[103,]), pch="o", type="p", col=c("red", "blue"), xlab="Elevation (m)", ylab="Temperature (C)") title("Recorded MAM max (red) and min (blue) temperatures 1997") #Fitting a spatial model: obj<- Tps(CO.loc,CO.tmax.MAM.climate, Z= CO.elev ) \dontrun{ out<- spatialProcess(CO.loc,CO.tmax.MAM.climate, smoothness=1.0, Z= CO.elev) surface( out) } } \section{Creation of data subset}{ Here is the precise R script used to create this data subset from the larger US monthly data set. This parent, R binary file can be obtained by contacting Doug Nychka (nychka@mines.edu). These technical details are not needed for casual use of the data -- skip down to examples for some R code that summarizes these data. \preformatted{ attach("RData.USmonthlyMet.bin") #To find a subset that covers Colorado (with a bit extra): indt<- UStinfo$lon< -101 & UStinfo$lon > -109.5 indt<- indt & UStinfo$lat<41.5 & UStinfo$lat>36.5 # check US(); points( UStinfo[indt,3:4]) #find common names restricting choices to the temperature names tn<- match( UStinfo$station.id, USpinfo$station.id) indt<- !is.na(tn) & indt # compare metadata locations and elevations. # initial matches to precip stations CO.id<- UStinfo[indt,1] CO.names<- as.character(UStinfo[indt,5]) pn<- match( CO.id, USpinfo$station.id) loc1<- cbind( UStinfo$lon[indt], UStinfo$lat[indt], UStinfo$elev[indt]) loc2<- cbind( USpinfo$lon[pn], USpinfo$lat[pn], USpinfo$elev[pn]) abs(loc1- loc2) -> temp indbad<- temp[,1] > .02 | temp[,2]> .02 | temp[,3] > 100 # tolerance at 100 meters set mainly to include the CLIMAX station # a high altitude station. data.frame(CO.names[ indbad], loc1[indbad,], loc2[indbad,], temp[indbad,] ) # CO.names.indbad. X1 X2 X3 X1.1 X2.1 X3.1 X1.2 X2.2 X3.2 #1 ALTENBERN -108.38 39.50 1734 -108.53 39.58 2074 0.15 0.08 340 #2 CAMPO 7 S -102.57 37.02 1311 -102.68 37.08 1312 0.11 0.06 1 #3 FLAGLER 2 NW -103.08 39.32 1519 -103.07 39.28 1525 0.01 0.04 6 #4 GATEWAY 1 SE -108.98 38.68 1391 -108.93 38.70 1495 0.05 0.02 104 #5 IDALIA -102.27 39.77 1211 -102.28 39.70 1208 0.01 0.07 3 #6 KARVAL -103.53 38.73 1549 -103.52 38.80 1559 0.01 0.07 10 #7 NEW RAYMER -103.85 40.60 1458 -103.83 40.58 1510 0.02 0.02 52 # modify the indt list to exclude these mismatches (there are 7 here) badones<- match( CO.id[indbad], UStinfo$station.id) indt[ badones] <- FALSE ###### now have working set of CO stations have both temp and precip ##### and are reasonably close to each other. N<- sum( indt) # put data in time series order instead of table of year by month. CO.tmax<- UStmax[,,indt] CO.tmin<- UStmin[,,indt] CO.id<- as.character(UStinfo[indt,1]) CO.elev<- UStinfo[indt,2] CO.loc <- UStinfo[indt,3:4] CO.names<- as.character(UStinfo[indt,5]) CO.years<- 1895:1997 # now find precip stations that match temp stations pn<- match( CO.id, USpinfo$station.id) # number of orphans sum( is.na( pn)) pn<- pn[ !is.na( pn)] CO.ppt<- USppt[,,pn] # checks --- all should zero ind<- match( CO.id[45], USpinfo$station.id) mean( abs( c(USppt[,,ind]) - c(CO.ppt[,,45]) ) , na.rm=TRUE) ind<- match( CO.id[45], UStinfo$station.id) mean( abs(c((UStmax[,,ind])) - c(CO.tmax[,,45])), na.rm=TRUE) mean( abs(c((UStmin[,,ind])) - c(CO.tmin[,,45])), na.rm=TRUE) # check order ind<- match( CO.id, USpinfo$station.id) sum( CO.id != USpinfo$station.id[ind]) ind<- match( CO.id, UStinfo$station.id) sum( CO.id != UStinfo$station.id[ind]) # (3 4 5) (6 7 8) (9 10 11) (12 1 2) N<- ncol( CO.tmax) CO.tmax.MAM<- apply( CO.tmax[,3:5,],c(1,3), "mean") CO.tmin.MAM<- apply( CO.tmin[,3:5,],c(1,3), "mean") CO.ppt.MAM<- apply( CO.ppt[,3:5,],c(1,3), "sum") # Now average over 1961-1990 ind<- CO.years>=1960 & CO.years < 1990 temp<- stats( CO.tmax.MAM[ind,]) CO.tmax.MAM.climate<- ifelse( temp[1,] >= 15, temp[2,], NA) temp<- stats( CO.tmin.MAM[ind,]) CO.tmin.MAM.climate<- ifelse( temp[1,] >= 15, temp[2,], NA) CO.tmean.MAM.climate<- (CO.tmin.MAM.climate + CO.tmin.MAM.climate)/2 temp<- stats( CO.ppt.MAM[ind,]) CO.ppt.MAM.climate<- ifelse( temp[1,] >= 15, temp[2,], NA) save( list=c( "CO.tmax", "CO.tmin", "CO.ppt", "CO.id", "CO.loc","CO.years", "CO.names","CO.elev", "CO.tmin.MAM", "CO.tmax.MAM", "CO.ppt.MAM", "CO.tmin.MAM.climate", "CO.tmax.MAM.climate", "CO.ppt.MAM.climate", "CO.tmean.MAM.climate"), file="COmonthlyMet.rda") } } \keyword{datasets} % docclass is data % Converted by Sd2Rd version 1.21. fields/man/predictSurface.Rd0000644000176200001440000003040114467431135015533 0ustar liggesusers%# %# fields is a package for analysis of spatial data written for %# the R software environment. %# Copyright (C) 2022 Colorado School of Mines %# 1500 Illinois St., Golden, CO 80401 %# Contact: Douglas Nychka, douglasnychka@gmail.edu, %# %# This program is free software; you can redistribute it and/or modify %# it under the terms of the GNU General Public License as published by %# the Free Software Foundation; either version 2 of the License, or %# (at your option) any later version. %# This program is distributed in the hope that it will be useful, %# but WITHOUT ANY WARRANTY; without even the implied warranty of %# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the %# GNU General Public License for more details. %# %# You should have received a copy of the GNU General Public License %# along with the R software environment if not, write to the Free Software %# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA %# or see http://www.r-project.org/Licenses/GPL-2 %##END HEADER %##END HEADER \name{predictSurface} \alias{predictSurface} \alias{predictSurface.default} \alias{predictSurface.mKrig} \alias{predictSurface.Krig} \alias{predictSurface.fastTps} \alias{predictSurfaceSE} \alias{predictSurfaceSE.default} \alias{mKrigFastPredict} \title{ Evaluates a fitted function or the prediction error as a surface that is suitable for plotting with the image, persp, or contour functions. } \description{ Evaluates a a fitted model or the prediction error on a 2-D grid keeping any other variables constant. The resulting object is suitable for use with functions for viewing 3-d surfaces such as image, imagePlot and contour. } \usage{ \method{predictSurface}{default}(object, grid.list = NULL, extrap = FALSE, chull.mask = NA, nx = 80, ny = 80, xy = c(1,2), verbose = FALSE, ...) \method{predictSurface}{fastTps}(object, gridList = NULL, extrap = FALSE, chull.mask = NA, nx = 80, ny = 80, xy = c(1,2), verbose = FALSE, ...) \method{predictSurface}{Krig}(object, grid.list = NULL, extrap = FALSE, chull.mask = NA, nx = 80, ny = 80, xy = c(1, 2), verbose = FALSE, ZGrid = NULL, drop.Z = FALSE, just.fixed=FALSE, ...) \method{predictSurface}{mKrig}(object, gridList = NULL, grid.list = NULL, ynew = NULL, extrap = FALSE, chull.mask = NA, nx = 80, ny = 80, xy = c(1, 2), verbose = FALSE, ZGrid = NULL, drop.Z = FALSE, just.fixed = FALSE, fast = FALSE, NNSize = 4, giveWarnings = FALSE, derivative = 0, ...) mKrigFastPredict(object, gridList, ynew = NULL, derivative = 0, Z = NULL, drop.Z = FALSE, NNSize = 5, setupObject = NULL, giveWarnings = TRUE) \method{predictSurfaceSE}{default}(object, grid.list = NULL, extrap = FALSE, chull.mask = NA, nx = 80, ny = 80, xy = c(1, 2), verbose = FALSE, ZGrid = NULL, just.fixed = FALSE, ...) } \arguments{ \item{object}{ An object from fitting a function to data. In fields this is usually a Krig, mKrig, or fastTps object. } \item{gridList}{ A list with as many components as variables describing the surface. All components should have a single value except the two that give the grid points for evaluation. If the matrix or data frame has column names, these must appear in the grid list. See the grid.list help file for more details. If this is omitted and the fit just depends on two variables the grid will be made from the ranges of the observed variables. (See the function \code{fields.x.to.grid}.) } \item{grid.list}{Alternative to the \code{gridList} argument. } \item{giveWarnings}{If TRUE will warn when more than one observation is in a grid box. } \item{extrap}{ Extrapolation beyond the range of the data. If \code{FALSE} (the default) the predictions will be restricted to the convex hull of the observed data or the convex hull defined from the points from the argument chull.mask. This function may be slightly faster if this logical is set to \code{TRUE} to avoid checking the grid points for membership in the convex hull. For more complicated masking a low level creation of a bounding polygon and testing for membership with \code{in.poly} may be useful. } \item{chull.mask}{ Whether to restrict the fitted surface to be on a convex hull, NA's are assigned to values outside the convex hull. chull.mask should be a sequence of points defining a convex hull. Default is to form the convex hull from the observations if this argument is missing (and extrap is false). } \item{nx}{Number of grid points in X axis. } \item{ny}{Number of grid points in Y axis. } \item{xy}{ A two element vector giving the positions for the "X" and "Y" variables for the surface. The positions refer to the columns of the x matrix used to define the multidimensional surface. This argument is provided in lieu of generating the grid list. If a 4 dimensional surface is fit to data then \code{ xy= c(2,4)} will evaluate a surface using the second and fourth variables with variables 1 and 3 fixed at their median values. NOTE: this argument is ignored if a grid.list argument is passed. } \item{drop.Z}{If TRUE the fixed part of model depending on covariates is omitted.} \item{just.fixed}{If TRUE the nonparametric surface is omitted.} \item{fast}{If TRUE approximate predictions for stationary models are made using the FFT. For large grids( e.g. nx, ny > 200) this can be substantially faster and still accurate to several decimal places. } \item{NNSize}{Order of nearest neighborhood used for fast prediction. The default,\code{NSize = 5}, means an 11X11=121 set of grid points/covariance kernels are used to approximate the off-grid covariance kernel. } \item{setupObject}{The object created explicitly using \code{\link{mKrigFastPredictSetup}}. Useful for predicting multple surfaces with the same observation locations. } \item{derivative}{Predict the estimated derivatives of order \code{derivative}.} \item{ynew}{ New data to use to refit the spatial model. Locations must be the same but if so this is efficient because the matrix decompositions are reused. } \item{\dots}{ Any other arguments to pass to the predict function associated with the fit object. Some of the usual arguments for several of the fields fitted objects include: \describe{ \item{ynew}{ New values of y used to reestimate the surface.} \item{Z}{A matrix of covariates for the fixed part of model.} } } \item{ZGrid}{An array or list form of covariates to use for prediction. This must match the same dimensions from the \code{grid.list} / \code{gridList} argument. If ZGrid is an array then the first two indices are the x and y locations in the grid. The third index, if present, indexes the covariates. e.g. For evaluation on a 10X15 grid and with 2 covariates. \code{ dim( ZGrid) == c(10,15, 2)}. If ZGrid is a list then the components x and y shold match those of grid list and the z component follows the shape described above for the no list case. } \item{Z}{The covariates for the grid unrolled as a matrix. Columns index the variables and rows index the grid locations. E.g. For evaluation on a 10X15 grid and with 2 covariates. \code{ dim( ZGrid) == c(10,15, 2)}. and so \code{ dim( Z) = c(150, 2)} and \code{ Z[,1] <- c( ZGrid[,,1])} } \item{verbose}{If TRUE prints out some imtermediate results for debugging.} } \value{ The usual list components for making image, contour, and perspective plots (x,y,z) along with labels for the x and y variables. For \code{predictSurface.derivative} the component \code{z} is a three dimensional array with values( \code{nx}, \code{ny}, 2 ) } \details{ These function evaluate the spatial process or thin plate spline estimates on a regualr grid of points The grid can be specified using the grid.list/ gridList information or just the sizes. For the standard Krig and mKrig versions the steps are to create a matrix of locations the represent the grid, call the predict function for the object with these points and also adding any extra arguments passed in the ... section, and then reform the results as a surface object (as.surface). To determine the what parts of the prediction grid are in the convex hull of the data the function \code{in.poly} is used. The argument inflation in this function is used to include a small margin around the outside of the polygon so that point on convex hull are included. This potentially confusing modification is to prevent excluding grid points that fall exactly on the ranges of the data. Also note that as written there is no computational savings for evaluting only the convex subset compared to the full grid. For the "fast" option a stationary covariance function and resulting surface estimate is approximated by the covariance kernel restricted to the grid locations. In this way the approximate problem becomes a 2-d convolution. The evaluation of the approximate prediction surface uses a fast Fourier transform to compute the predicted values at the grid locations. The nearest neighbor argument \code{NNSize} controls the number of covariance kernels only evalauted at grid location used to approximate a covariance function at an off-grid location. We have found good results with \code{NNSize=5}. \code{predictSurface.fastTps} is a specific version ( m=2, and k=2) of Kriging with a compact covariance kernel (Wendland). that can be much more efficient because it takes advantage of a low level FORTRAN call to evaluate the covariance function. Use \code{predictSurface} or \code{predict} for other choices of m and k. \code{predictSurface.Krig} is designed to also include covariates for the fixed in terms of grids. \code{predictSurface.mKrig} Similar in function to the Krig prediction function but it more efficient using the \code{mKrig} fit object. \code{mKrigFastpredict} Although this function might be called at the top is it easier to use through the wrapper, \code{predictSurface.mKrig} and \code{fast=TRUE}. NOTE: \code{predict.surface} has been depreciated and just prints out a warning when called. } \seealso{ Tps, Krig, predict, grid.list, make.surface.grid, as.surface, surface, in.poly } \examples{ data( ozone2) x<- ozone2$lon.lat y<- ozone2$y[16,] obj<- Tps( x,y) # or try the alternative model: # obj<- spatialProcess(x,y) fit<- predictSurface( obj, nx=40, ny=40) imagePlot( fit) # predicting a 2d surface holding other variables fixed. fit<- Tps( BD[,1:4], BD$lnya) # fit surface to data # evaluate fitted surface for first two # variables holding other two fixed at median values out.p<- predictSurface(fit) surface(out.p, type="C") # # plot surface for second and fourth variables # on specific grid. glist<- list( KCL=29.77, MgCl2= seq(3,7,,25), KPO4=32.13, dNTP=seq( 250,1500,,25)) out.p<- predictSurface(fit, glist) surface(out.p, type="C") out.p<- predictSurfaceSE(fit, glist) surface(out.p, type="C") ## a test of the fast prediction algorithm for use with # mKrig/spatialProcess objects. \dontrun{ data(NorthAmericanRainfall) x<- cbind(NorthAmericanRainfall$longitude, NorthAmericanRainfall$latitude) y<- log10(NorthAmericanRainfall$precip) mKrigObject<- mKrig( x,log10(y), lambda=.024, cov.args= list( aRange= 5.87, Covariance="Matern", smoothness=1.0), sigma2=.157 ) gridList<- list( x = seq(-134, -51, length.out = 100), y = seq( 23, 57, length.out = 100)) # exact prediction system.time( gHat<- predictSurface( mKrigObject, gridList) ) # aproximate system.time( gHat1<- predictSurface( mKrigObject, gridList, fast = TRUE) ) # don't worry about the warning ... # just indicates some observation locations are located # in the same grid box. # approximation error omitting the NAs from outside the convex hull stats( log10(abs(c(gHat$z - gHat1$z))) ) image.plot(gHat$x, gHat$y, (gHat$z - gHat1$z) ) points( x, pch=".", cex=.5) world( add=TRUE ) } } \keyword{spatial} % docclass is function % Converted by Sd2Rd version 1.21. fields/man/ozone2.Rd0000644000176200001440000000457214275214115014010 0ustar liggesusers%# %# fields is a package for analysis of spatial data written for %# the R software environment. %# Copyright (C) 2022 Colorado School of Mines %# 1500 Illinois St., Golden, CO 80401 %# Contact: Douglas Nychka, douglasnychka@gmail.edu, %# %# This program is free software; you can redistribute it and/or modify %# it under the terms of the GNU General Public License as published by %# the Free Software Foundation; either version 2 of the License, or %# (at your option) any later version. %# This program is distributed in the hope that it will be useful, %# but WITHOUT ANY WARRANTY; without even the implied warranty of %# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the %# GNU General Public License for more details. %# %# You should have received a copy of the GNU General Public License %# along with the R software environment if not, write to the Free Software %# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA %# or see http://www.r-project.org/Licenses/GPL-2 %##END HEADER %##END HEADER \name{ozone2} \alias{ozone2} \title{ Daily 8-hour ozone averages for sites in the Midwest } \description{ The response is 8-hour average (surface) ozone ( from 9AM-4PM) measured in parts per billion (PPB) for 153 sites in the midwestern US over the period June 3,1987 through August 31, 1987, 89 days. This season of high ozone corresponds with a large modeling experiment using the EPA Regional Oxidant Model. } \usage{ data(ozone2) } \format{ The data list has components: a 89X153 matrix of ozone values. Rows are days and columns are the sites. Site locations in longitude and latitude as a 153X2 table Logical vector indicating stations that form teh smaller Chicagoland subset. (see FIELDS ozone data set) Nychka, D., Cox, L., Piegorsch, W. (1998) Case Studies in Environmental Statistics Lecture Notes in Statistics, Springer Verlag, New York } \examples{ data( ozone2) # pairwise correlation among all stations # ( See cover.design to continue this example) cor.mat<- cor( ozone2$y, use="pairwise") #raw data image for day number 16 good<- !is.na( ozone2$y[16,]) out<- as.image( ozone2$y[16,good], x=ozone2$lon.lat[good,]) image.plot( out) } \keyword{datasets} % docclass is data % Converted by Sd2Rd version 1.21. fields/man/cover.design.Rd0000644000176200001440000003332214275214115015155 0ustar liggesusers%# %# fields is a package for analysis of spatial data written for %# the R software environment. %# Copyright (C) 2022 Colorado School of Mines %# 1500 Illinois St., Golden, CO 80401 %# Contact: Douglas Nychka, douglasnychka@gmail.edu, %# %# This program is free software; you can redistribute it and/or modify %# it under the terms of the GNU General Public License as published by %# the Free Software Foundation; either version 2 of the License, or %# (at your option) any later version. %# This program is distributed in the hope that it will be useful, %# but WITHOUT ANY WARRANTY; without even the implied warranty of %# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the %# GNU General Public License for more details. %# %# You should have received a copy of the GNU General Public License %# along with the R software environment if not, write to the Free Software %# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA %# or see http://www.r-project.org/Licenses/GPL-2 %##END HEADER %##END HEADER \name{cover.design} \alias{cover.design} \title{ Computes Space-Filling "Coverage" designs using Swapping Algorithm } \description{ Finds the set of points on a discrete grid (Candidate Set) which minimize a geometric space-filling criterion. The strength of this method is that the candidate set can satisfy whatever constraints are important for the problem. } \usage{ cover.design(R, nd, nruns = 1, nn = TRUE, num.nn = 100, fixed = NULL, scale.type = "unscaled", R.center, R.scale, P = -20, Q = 20, start = NULL, DIST = NULL, return.grid = TRUE, return.transform = TRUE, max.loop=20, verbose=FALSE) } \arguments{ \item{R}{ A matrix of candidate points to be considered in the design. Each row is a separate point. } \item{nd}{ Number of points to add to the design. If points exist and are to remain in the design (see "fixed" option), nd is the number of points to add. If no points are fixed, nd is the design size. } \item{nruns}{ The number of random starts to be optimized. Uses random starts unless "start" is specified. If nruns is great than 1, the final results are the minimum. } \item{nn}{ Logical value specifying whether or not to consider only nearest neighbors in the swapping algorithm. When nn=FALSE, then the swapping algorithm will consider all points in the candidate space. When nn=TRUE, then the swapping algorithm will consider only the num.nn closest points for possible swapping. The default is to use nearest neighbors only (nn=TRUE). } \item{num.nn}{ Number of nearest-neighbors to search over. The default number is 100. If nn=F then this argument will be ignore. } \item{fixed}{ A matrix or vector specifying points to be forced into the experimental design. If fixed is a matrix, it gives coordinates of the fixed points in the design. In this case fixed must be a subset of R. If fixed is a vector, then fixed gives the row numbers from the candidate matrix R that identify the fixed points. The number of points to be generated, nd, is in addition to the number of points specified by fixed. } \item{scale.type}{ A character string that tells how to scale the candidate matrix, R, before calculating distances. The default is "unscaled", no transformation is done. Another option is "range" in which case variables are scaled to a [0,1] range before applying any distance functions. Use "unscaled" when all of the columns of R are commensurate; for example, when R gives x and y in spatial coordinates. When the columns of R are not in the same units, then it is generally thought that an appropriate choice of scaling will provide a better design. This would be the case, for example, for a typical process optimization. Other choices for scale.type are "unit.sd", which scales all columns of R to have 0 mean and unit standard deviation, and "user", which allows a user specified scaling (see R.center and R.scale arguments). } \item{R.center}{ A vector giving the centering values if scale.type=\code{user}. } \item{R.scale}{ A vector giving the scale values if scale.type=\code{user}. } \item{P}{ The "p" exponent of the coverage criterion (see below). It affects how the distance from a point x to a set of design points D is calculated. P=1 gives average distance. P=-1 gives harmonic mean distance. P=-Inf would give minimum distance (not available as a value). As P gets large and negative, points will tend to be more spread out. } \item{Q}{ The "q" exponent of the coverage criterion (see below).It affects how distances from all points not in the design to points in the design are averaged. When Q=1, simple averaging of the distances is employed. Q=Inf (not available as a value) in combination with P=-Inf would give a classical minimax design. } \item{start}{ A matrix or vector giving the initial design from which to start optimization. If start is a matrix, it gives the coordinates of the design points. In this case start must be a subset of the candidate set , R matrix. If start is a vector, then start gives the row numbers of the initial design based on the rows of the candidate matrix rows. The default is to use a random starting design. } \item{DIST}{ This argument is only for cover.design.S. A distance metric in the form of an S function. Default is Euclidean distance (FIELDS rdist function) See details and example below for the correct form. } \item{return.grid}{ Logical value that tells whether or not to return the candidate matrix as an attribute of the computed design. The default is return.grid=T. If false this just reduces the returned object size. The candidate matrix is used by plot.spatial.design if it is available. } \item{return.transform}{ Logical value that tells whether or not to return the transformation attributes of candidate set. The default is return.transform=T. } \item{max.loop}{ Maximum number of outer loops in algorithm. This is the maximum number of passes through the design testing for swaps. } \item{verbose}{ If TRUE prints out debugging information. } } \value{ Returns a design object of class \code{spatialDesign}. Subscripting this object has the same effect as subscripting the first component (the design). The returned list has the following components: \item{design}{ The best design in the form of a matrix. } \item{best.id}{ Row numbers of the final design from the original candidate matrix, R. } \item{fixed}{ Row numbers of the fixed points from the original candidate matrix, R. } \item{opt.crit}{ Value of the optimality criterion for the final design. } \item{start.design}{ Row numbers of the starting design from the original candidate matrix, R. } \item{start.crit}{ Value of the optimality criterion for the starting design. } \item{history}{ The swapping history and corresponding values of the optimality criterion for the best design. } \item{other.designs}{ The designs other than the best design generated when nruns is greater than 1. } \item{other.crit}{ The optimality criteria for the other designs when nrun is greate than 1. } \item{DIST}{ The distance function used in calculating the design criterion. } \item{nn}{ Logical value for nearest-neighbor search or not. } \item{num.nn}{ The number of nearest neighbor set. } \item{grid}{ The matrix R is returned if the argument return.grid=T. } \item{transform}{ The type of transformation used in scaling the data and the values of the centering and scaling constants if the argument return.transform=T. } \item{call}{ The calling sequence. } \item{P}{ The parameter value for calculating criterion. } \item{Q}{ The parameter value for calculating criterion. } \item{nhist}{ The number of swaps performed. } \item{nloop}{ The number of outer loops required to reach convergence if nloop is less the max.loop. } \item{minimax.crit}{ The minimax design criterion using DIST. } \item{max.loop}{ The maximum number of outer loops. } } \details{ OTHER DISTANCE FUNCTIONS: You can supply an R/S-function to be used as the distance metric. The expected calling sequence for this distance function is function( X1,X2)\{....\} where X1 and X2 are matrices with coordinates as the rows. The returned value of this function should be the pairwise distance matrix. If nrow( X1)=m and nrow( X2)=n then the function should return an m by n matrix of all distances between these two sets of points. See the example for Manhattan distance below. The candidate set and DIST function can be flexible and the last example below using sample correlation matrices is an example. COVERAGE CRITERION: For nd design points in the set D and nc candidate points ci in the set C, the coverage criteria is defined as: M(D,C) = [sum(ci in C) [sum(di in D) (dist(di,ci)**P]**(Q/P)]**(1/Q) Where P, less than 0, and Q, greater than 0, are parameters. The algorithm used in "cover.design" to find the set of nd points in C that minimize this criterion is an iterative swapping algorithm which will be described briefly. The resulting design is referred to as a "coverage design" from among the class of space-filling designs. If fixed points are specified they are simply fixed in the design set and are not allowed to be swapped out. ALGORITHM: An initial set of nd points is chosen randomly if no starting configuration is provided. The nc x nd distance matrix between the points in C and the points in D is computed, and raised to the power P. The "row sums" of this matrix are computed. Denote these as rs.i and the vector of row sums as rs. Using rs, M(D,C) is computed as: [sum i (rs.i)**(Q/P)]**(1/Q) Note that if point d.i is "swapped" for point c.j, one must only recompute 1 column of the original distance matrix, and 1 row. The row elements not in the ith column will be the same for all j and so only need computing when the first swapping occurs for each d.i . Denote the sum of these off-i elements as "newrow(i)". The index is i here since this is the same for all rows (j=1,...nc). Thus, for each swap, the row sums vector is updated as rs(new) = rs(old) - column(i,old) + column(i,new) And the jth element of rs(new) is replaced by: rs(new)[j] = column(i,new)[k] + newrow(i) Finally, M(D,C) is computed for this swap of the ith design point for the jth candidate point using [2]. The point in C that when swapped produces the minimum value of M(D,C) replaces d.i. This is done for all nd points in the design, and is iterated until M(D,C) does not change. When the nearest neighbor option is selected, then the points considered for swapping are limited to the num.nn nearest neighbors of the current design point. STABILITY The algorithm described above is guaranteed to converge. However, upon convergence, the solution is sensitive to the initial configuration of points. Thus, it is recommended that multiple optimizations be done (i.e. set nruns greater than 1 ). Also, the quality of the solution depends on the density of the points on the region. At the same time, for large regions , optimization can be computationally prohibitive unless the nearest neighbor option is employed. } \section{References}{ Johnson, M.E., Moore, L.M., and Ylvisaker, D. (1990). Minimax and maximin distance designs. Journal of Statistical Planning and Inference 26, 131-148. SAS/QC Software. Volume 2: Usage and Reference. Version 6. First Edition (1995). "Proc Optex". SAS Institute Inc. SAS Campus Drive, } \seealso{ rdist, rdist.earth } \examples{ ## ## # first generate candidate set set.seed(123) # setting seed so that you get the same thing I do! test.df <- matrix( runif( 600), ncol=3) test1.des<-cover.design(R=test.df,nd=10) summary( test1.des) plot( test1.des) # candidates<- make.surface.grid( list( seq( 0,5,,20), seq(0,5,,20))) out<- cover.design( candidates, 15) # find 10 more points keeping this original design fixed out3<-cover.design( candidates, 10,fixed=out$best.id) # see what happened plot( candidates[,1:2], pch=".") points( out$design, pch="x") points( out3$design, pch="o") # here is a strange graph illustrating the swapping history for the # the first design. Arrows show the swap done # at each pass through the design. h<- out$history cd<- candidates plot( cd[,1:2], pch=".") points( out$design, pch="O", col=2) points( out$start.design, pch="x", col=5) arrows( cd[h[,2],1], cd[h[,2],2], cd[h[,3],1], cd[h[,3],2],length=.1) text( cd[h[,2],1], cd[h[,2],2], h[,1], cex=1.0 ) # # try this out using "Manhattan distance" # ( distance following a grid of city streets) dist.man<- function(x1,x2) { d<- ncol( x1) temp<- abs(outer( x1[,1], x2[,1],'-')) for ( k in 2:d){ temp<- temp+abs(outer( x1[,k], x2[,k],'-')) } temp } # use the design from the Euclidean distance as the starting #configuration. cover.design( candidates, 15, DIST=dist.man, start= out3$best.id)-> out2 # this takes a while ... plot( out2$design) points( out3$design, col=2) # find a design on the sphere # candidates<- make.surface.grid( list( x=seq( -180,180,,20), y= seq( -85, 85,,20))) out4<-cover.design( candidates, 15, DIST=rdist.earth) # this takes a while plot( candidates, pch="+", cex=2) points(out4$design, pch="o", cex=2, col="blue") # covering based on correlation for 153 ozone stations # data( ozone2) cor.mat<-cor( ozone2$y, use="pairwise") cor.dist<- function( x1,x2) {matrix( 1-cor.mat[ x1,x2], ncol=length(x2))} # # find 25 points out of the 153 # here the "locations" are just the index but the distance is # determined by the correlation function. # out5<-cover.design(cbind(1:153),25, DIST= cor.dist, scale.type="unscaled") plot( ozone2$lon.lat, pch=".") points( ozone2$lon.lat[out5$best.id,],pch="O", col=4) # # this seems a bit strange probably due some funny correlation values # # reset panel set.panel(1,1) } \keyword{spatial} % docclass is function % Converted by Sd2Rd version 1.21. fields/man/tim.colors.Rd0000644000176200001440000001667014275214115014667 0ustar liggesusers%# %# fields is a package for analysis of spatial data written for %# the R software environment. %# Copyright (C) 2022 Colorado School of Mines %# 1500 Illinois St., Golden, CO 80401 %# Contact: Douglas Nychka, douglasnychka@gmail.edu, %# %# This program is free software; you can redistribute it and/or modify %# it under the terms of the GNU General Public License as published by %# the Free Software Foundation; either version 2 of the License, or %# (at your option) any later version. %# This program is distributed in the hope that it will be useful, %# but WITHOUT ANY WARRANTY; without even the implied warranty of %# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the %# GNU General Public License for more details. %# %# You should have received a copy of the GNU General Public License %# along with the R software environment if not, write to the Free Software %# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA %# or see http://www.r-project.org/Licenses/GPL-2 %##END HEADER %##END HEADER \name{tim.colors} \alias{tim.colors} \alias{larry.colors} \alias{two.colors} \alias{designer.colors} \alias{color.scale} \alias{snow.colors} \alias{fieldsPlotColors} \title{ Some useful color tables for images and tools to handle them. } \description{ Several color scales useful for image plots: a pleasing rainbow style color table patterned after that used in Matlab by Tim Hoar and also some simple color interpolation schemes between two or more colors. There is also a function that converts between colors and a real valued vector. } \usage{ tim.colors(n = 64, alpha=1.0) larry.colors() snow.colors(n=256, alpha=1) two.colors(n=256, start="darkgreen", end="red", middle="white", alpha=1.0) designer.colors( n=256, col= c("darkgreen", "white", "darkred"), x= seq(0,1,, length(col)) ,alpha=1.0) color.scale(z, col = tim.colors, NC = 256, zlim = NULL, transparent.color = "white", eps = 1e-08) fieldsPlotColors( col,...) } \arguments{ \item{alpha}{The transparency of the color -- 1.0 is opaque and 0 is transparent. This is useful for overlays of color and still being able to view the graphics that is covered. } \item{n}{ Number of color levels. The setting \code{n}=64 is the orignal definition.} \item{start}{Starting color for lowest values in color scale} \item{end}{ Ending color.} \item{middle}{Color scale passes through this color at halfway} \item{col}{A list of colors (names or hex values) to interpolate. But for the \code{color.scale} function this can be also be a function that returns \code{NC} colors when called with just the \code{NC} argument.} \item{x}{Positions of colors on a [0,1] scale. Default is to assume that the x values are equally spacesd from 0 to 1.} \item{z}{Real vector to encode in a color table.} \item{zlim}{Range to use for color scale. Default is the \code{range(z)} inflated by 1- eps and 1+eps.} \item{transparent.color}{Color value to use for NA's or values outside \code{zlim}} \item{eps}{A small inflation of the range to avoid the boundary values of \code{z} being coded as NAs.} \item{NC}{The number of colors to return from calling the function passed in the \code{col} argument. This is only used if \code{col} is a function. } \item{\dots}{Additional plotting arguments to code{image.plot}} } \details{ The color in R can be represented as three vectors in RGB coordinates and these coordinates are interpolated separately using a cubic spline to give color values that intermediate to the specified colors. Ask Tim Hoar about \code{tim.colors}! He is a Mattlab black belt and this is his favorite scale in that system. \code{two.colors} is really about three different colors. For other colors try \code{fields.color.picker} to view possible choices. \code{start="darkgreen", end="azure4"} are the options used to get a nice color scale for rendering aerial photos of ski trails. (See \url{https://github.com/dnychka/MJProject}.) \code{larry.colors} is a 13 color palette used by Larry McDaniel (retired software engineer from NCAR) and is particularly useful for visualizing fields of climate variables. \code{snow.colors} is the scale used by Will Klieber's team for visualizing snow cover from remotely sensed data products. See the commented code for the script as to how how this was formed from an orignal raw 256 level scale. Note the that first color in this table is grey and is desigend to represent the minimum value of the range ( e.g. 0). If the image in in percent snow cover then \code{zlim=c(0,100)} would make sense as a range to fit grey pixels to zero and white to 100 percent. \code{designer.color} is the master function for the other scales. It can be useful if one wants to customize the color table to match quantiles of a distribution. e.g. if the median of the data is at .3 with respect to the range then set \code{x} equal to c(0,.3,1) and specify two colors to provide a transtion that matches the median value. In fields language this function interpolates between a set of colors at locations x. While you can be creative about these colors just using another color scale as the basis is easy. For example \code{designer.color( 256, rainbow(4), x= c( 0,.2,.8,1.0))} leaves the choice of the colors to Dr. R after a thunderstorm. See also colorBrewer to choose sequences of colors that form a good palette. \code{color.scale} assigns colors to a numerical vector in the same way as the \code{image} function. This is useful to kept the assigment of colors consistent across several vectors by specifiying a common \code{zlim} range. \code{plotColorScale} A simple function to plot a vector of colors to examine their values. } \value{ A vector giving the colors in a hexadecimal format, two extra hex digits are added for the alpha channel. } \seealso{ topo.colors, terrain.colors, image.plot, quilt.plot, grey.scale, fields.color.picker } \examples{ tim.colors(10) # returns an array of 10 character strings encoding colors in hex format # e.g. (red, green, blue) values of (16,255, 239) # translates to "#10FFEF" # rgb( 16/255, 255/255, 239/255, alpha=.5) # gives "#10FFEF80" note extra "alpha channel" # view some color table choices set.panel( 4,1) fieldsPlotColors( tim.colors()) title("tim.colors") fieldsPlotColors( larry.colors()) title("larry.colors") fieldsPlotColors( two.colors()) title("two.colors") fieldsPlotColors( snow.colors()) title("snow.colors") # a bubble plot with some transparency for overlapping dots set.seed(123) loc<- matrix( rnorm( 200), 100,2) Z<- loc[,1] + loc[,2] colorMap<- color.scale( Z, col=tim.colors(10, alpha=.8)) par( mar=c(5,5,5,5)) # extra room on right for color bar plot( loc, col=colorMap, pch=16, cex=2) # add a color scale image.plot(legend.only=TRUE, zlim=range( Z), col=tim.colors(10)) # using tranparency without alpha the image plot would cover points obj<- list( x= 1:8, y=1:10, z= outer( 1:8, 1:10, "+") ) plot( 1:10,1:10) image(obj, col=two.colors(alpha=.5), add=TRUE) coltab<- designer.colors(col=c("blue", "grey", "green"), x= c( 0,.3,1) ) image( obj, col= coltab ) # peg colors at some desired quantiles of data. # NOTE need 0 and 1 for the color scale to make sense x<- quantile( c(obj$z), c(0,.25,.5,.75,1.0) ) # scale these to [0,1] zr<- range( c(obj$z)) x<- (x-zr[1])/ (zr[2] - zr[1]) coltab<- designer.colors(256,rainbow(5), x) image( obj$z, col= coltab ) # see image.plot for adding all kinds of legends set.panel() } \keyword{ aplot} fields/man/qsreg.Rd0000644000176200001440000001464614275214115013720 0ustar liggesusers%# %# fields is a package for analysis of spatial data written for %# the R software environment. %# Copyright (C) 2022 Colorado School of Mines %# 1500 Illinois St., Golden, CO 80401 %# Contact: Douglas Nychka, douglasnychka@gmail.edu, %# %# This program is free software; you can redistribute it and/or modify %# it under the terms of the GNU General Public License as published by %# the Free Software Foundation; either version 2 of the License, or %# (at your option) any later version. %# This program is distributed in the hope that it will be useful, %# but WITHOUT ANY WARRANTY; without even the implied warranty of %# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the %# GNU General Public License for more details. %# %# You should have received a copy of the GNU General Public License %# along with the R software environment if not, write to the Free Software %# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA %# or see http://www.r-project.org/Licenses/GPL-2 %##END HEADER %##END HEADER \name{qsreg} \alias{qsreg} \title{ Quantile or Robust spline regression } \description{ Uses a penalized likelihood approach to estimate the conditional quantile function for regression data. This method is only implemented for univariate data. For the pairs (X,Y) the conditional quantile, f(x), is P( Y=6]) fit50.subjective<-qsreg(rat.diet$t,rat.diet$con, lam= lambda.good) fit10<-qsreg(rat.diet$t,rat.diet$con, alpha=.1, nstep.cv=200) fit90<-qsreg(rat.diet$t,rat.diet$con, alpha=.9, nstep.cv=200) # spline fits at 50 equally spaced points sm<- cbind( predict( fit10, xg), predict( fit50.subjective, xg),predict( fit50, xg), predict( fit90, xg)) # and now zee data ... plot( fit50$x, fit50$y) # and now zee quantile splines at 10% 50% and 90%. # matlines( xg, sm, col=c( 3,3,2,3), lty=1) # the spline } \keyword{smooth} % docclass is function % Converted by Sd2Rd version 1.21. fields/man/CovarianceUpper.Rd0000644000176200001440000000434314275214115015656 0ustar liggesusers%# %# fields is a package for analysis of spatial data written for %# the R software environment. %# Copyright (C) 2022 Colorado School of Mines %# 1500 Illinois St., Golden, CO 80401 %# Contact: Douglas Nychka, douglasnychka@gmail.edu, %# %# This program is free software; you can redistribute it and/or modify %# it under the terms of the GNU General Public License as published by %# the Free Software Foundation; either version 2 of the License, or %# (at your option) any later version. %# This program is distributed in the hope that it will be useful, %# but WITHOUT ANY WARRANTY; without even the implied warranty of %# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the %# GNU General Public License for more details. %# %# You should have received a copy of the GNU General Public License %# along with the R software environment if not, write to the Free Software %# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA %# or see http://www.r-project.org/Licenses/GPL-2 %##END HEADER %##END HEADER \name{CovarianceUpper} \alias{ExponentialUpper} \title{ Evaluate covariance over upper triangle of distance matrix } \description{ Evaluates the covariance over the upper triangle of a distance matrix rather than over the entire matrix to reduce computation time. Note that the \code{chol} function only requires the upper triangle of the covariance matrix to perform the Cholesky decomposition. } \usage{ ExponentialUpper(distMat, range = 1, alpha = 1/range, theta = NULL) } \arguments{ \item{distMat}{ The distance matrix to evaluate the covariance over. } \item{range}{ Range parameter default is one. Note that the scale can also be specified through the "aRange" scaling argument used in fields covariance functions) } \item{alpha}{ 1/range} \item{theta}{ Also the range parameter.} } \value{ The covariance matrix, where only the upper triangle is calculated. } \author{ John Paige } \seealso{ \code{\link[fields]{Exponential}} } \examples{ set.seed(123) #a distance matrix coords = matrix(runif(10), ncol=2) distMat = rdist(coords) #compute covariance matrix, but only over the upper triangle upperCov = ExponentialUpper(distMat, range=.1) print(distMat) print(upperCov) } \keyword{ covariance } fields/man/stats.bin.Rd0000644000176200001440000000532714342516554014507 0ustar liggesusers%# %# fields is a package for analysis of spatial data written for %# the R software environment. %# Copyright (C) 2022 Colorado School of Mines %# 1500 Illinois St., Golden, CO 80401 %# Contact: Douglas Nychka, douglasnychka@gmail.edu, %# %# This program is free software; you can redistribute it and/or modify %# it under the terms of the GNU General Public License as published by %# the Free Software Foundation; either version 2 of the License, or %# (at your option) any later version. %# This program is distributed in the hope that it will be useful, %# but WITHOUT ANY WARRANTY; without even the implied warranty of %# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the %# GNU General Public License for more details. %# %# You should have received a copy of the GNU General Public License %# along with the R software environment if not, write to the Free Software %# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA %# or see http://www.r-project.org/Licenses/GPL-2 %##END HEADER %##END HEADER \name{stats.bin} \alias{stats.bin} \title{ Bins data and finds some summary statistics. } \description{ Cuts up a numeric vector based on binning by a covariate and applies the fields stats function to each group } \usage{ stats.bin(x, y, N = 10, breaks = NULL,prettyBins=FALSE) } \arguments{ \item{x}{ Values to use to decide bin membership } \item{y}{ A vector of data } \item{N}{ Number of bins. If the breaks is missing there are N bins equally spaced on the range of x. } \item{breaks}{ The bin boundaries. If there are N+1 of these there will be N bins. The bin widths can be unequal. } \item{prettyBins}{If FALSE creates exactly N-1 bins. If TRUE the number of bins is determined by N and the pretty function.} } \value{ A list with several components. stats is a matrix with columns indexing the bins and rows being summary statistics found by the stats function. These are: number of obs, mean, sd, min, quartiles, max and number of NA's. (If there is no data for a given bin, NA's are filled in. ) breaks are the breaks passed to the function and centers are the bin centers. } \seealso{ bplot, stats } \examples{ u<- rnorm( 2000) v<- rnorm( 2000) x<- u y<- .7*u + sqrt(1-.7**2)*v look<- stats.bin( x,y) look$stats["Std.Dev.",] data( ozone2) # make up a variogram day 16 of Midwest daily ozone ... look<- vgram( ozone2$lon.lat, c(ozone2$y[16,]), lon.lat=TRUE) # break points brk<- seq( 0, 250,,40) out<-stats.bin( look$d, look$vgram, breaks=brk) # plot bin means, and some quantiles Q1, median, Q3 matplot( out$centers, t(out$stats[ c("mean", "median","Q1", "Q3"),]), type="l",lty=c(1,2,2,2), col=c(3,4,3,4), ylab="ozone PPB") } \keyword{univar} % docclass is function % Converted by Sd2Rd version 1.21. fields/man/fields-internal.Rd0000644000176200001440000001433014467430330015647 0ustar liggesusers%# %# fields is a package for analysis of spatial data written for %# the R software environment. %# Copyright (C) 2022 Colorado School of Mines %# 1500 Illinois St., Golden, CO 80401 %# Contact: Douglas Nychka, douglasnychka@gmail.edu, %# %# This program is free software; you can redistribute it and/or modify %# it under the terms of the GNU General Public License as published by %# the Free Software Foundation; either version 2 of the License, or %# (at your option) any later version. %# This program is distributed in the hope that it will be useful, %# but WITHOUT ANY WARRANTY; without even the implied warranty of %# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the %# GNU General Public License for more details. %# %# You should have received a copy of the GNU General Public License %# along with the R software environment if not, write to the Free Software %# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA %# or see http://www.r-project.org/Licenses/GPL-2 %##END HEADER %##END HEADER \name{fields internal } \alias{[.spatialDesign} \alias{COR} \alias{D4transform.image} \alias{Krig.df.to.lambda} \alias{Krig.fdf} \alias{Krig.fgcv} \alias{Krig.fgcv.model} \alias{Krig.fgcv.one} \alias{Krig.flplike} \alias{Krig.fs2hat} \alias{Krig.ftrace} \alias{Krig.parameters} \alias{Krig.updateY} \alias{Krig.which.lambda} \alias{Krig.ynew} \alias{bisection.search} \alias{cat.matrix} \alias{cat.to.list} \alias{ceiling2} \alias{describe} \alias{dyadic.2check} \alias{dyadic.check} \alias{double.exp} \alias{Exp.earth.cov} \alias{fast.1way} \alias{find.upcross} \alias{gauss.cov} \alias{golden.section.search} \alias{imageplot.info} \alias{imagePlotInfo} \alias{imageplot.setup} \alias{krig.image.parameters} \alias{multWendlandGrid} \alias{minimax.crit} \alias{plot.krig.image} \alias{plot.sim.krig.image} \alias{plot.spatialDesign} \alias{predict.interp.surface} \alias{predict.krig.image} \alias{predict.surface} \alias{predict.surface.default} \alias{print.krig.image} \alias{print.spatialDesign} \alias{print.sreg} \alias{print.summary.Krig} \alias{print.summary.krig.image} \alias{print.summarySpatialDesign} \alias{print.summary.sreg} \alias{printGCVWarnings} \alias{qr.q2ty} \alias{qr.yq2} \alias{plot.qsreg} \alias{predict.qsreg} \alias{print.qsreg} \alias{qsreg.fit} \alias{qsreg.psi} \alias{qsreg.sigma} \alias{qsreg.psi.OLD} \alias{qsreg.sigma.OLD} \alias{qsreg.trace} \alias{quickPrint} \alias{summary.qsreg} \alias{radbas.constant} \alias{sim.krig.image} \alias{sreg.df.to.lambda} \alias{sreg.fdf} \alias{sreg.fgcv} \alias{sreg.fgcv.model} \alias{sreg.fgcv.one} \alias{sreg.fit} \alias{sreg.fs2hat} \alias{sreg.trace} \alias{stats.sim.krig.image} \alias{summaryGCV.Krig} \alias{summaryGCV.sreg} \alias{summary.krig.image} \alias{summary.spatialDesign} \alias{summary.sreg} \alias{surface} \alias{surface.default} \alias{surface.krig.image} \alias{unscale} \alias{world.dat} \alias{compactTOMatOLD} \title{ Fields internal and secondary functions } \description{ Listed below are supporting functions for the major methods in fields. } \usage{ \method{[}{spatialDesign}(x, ...) Krig.df.to.lambda(df, D, guess = 1, tol = 1e-05) Krig.fdf (llam, info) Krig.fgcv (lam, obj) Krig.fgcv.model (lam, obj) Krig.fgcv.one (lam, obj) Krig.flplike (lambda, obj) Krig.fs2hat (lam, obj) Krig.ftrace (lam, D) Krig.parameters (obj, mle.calc=obj$mle.calc) Krig.updateY (out, Y, verbose = FALSE, yM=NA) Krig.which.lambda(out) Krig.ynew (out, y=NULL, yM=NULL ) bisection.search (x1, x2, f, tol = 1e-07, niter = 25, f.extra = NA, upcross.level = 0) cat.matrix (mat, digits = 8) cat.to.list (x, a) ceiling2 (m) describe (x) double.exp(x) dyadic.2check( m,n,cut.p=2) dyadic.check( n,cut.p=2) Exp.earth.cov (x1, x2, aRange = 1, theta=NULL) fast.1way (lev, y, w = rep(1, length(y))) find.upcross (fun, fun.info, upcross.level = 0, guess = 1, tol = 1e-05) gauss.cov (...) golden.section.search (ax, bx, cx, f, niter = 25, f.extra = NA, tol = 1e-05, gridx=NA) %fastTps.MLE(...) imagePlotInfo (...,breaks, nlevel) imageplot.info(...) imageplot.setup(x, add=FALSE, legend.shrink = 0.9, legend.width = 1, horizontal = FALSE, legend.mar=NULL, bigplot = NULL, smallplot = NULL,...) minimax.crit (obj, des = TRUE, R) \method{plot}{spatialDesign}(x,...) \method{predict}{interp.surface}(object, loc,...) \method{predict}{surface}(object, ...) \method{predict}{surface.default}(object, ...) \method{print}{spatialDesign} (x,...) \method{print}{sreg}(x, ...) \method{print}{summary.Krig} (x, ...) \method{print}{summarySpatialDesign} (x, digits = 4,...) \method{print}{summary.sreg} (x, ...) printGCVWarnings( Table, method = "all") multWendlandGrid( grid.list,center, delta, coef, xy = c(1, 2)) qr.q2ty (qr, y) qr.yq2 (qr, y) \method{plot}{qsreg}(x, pch = "*", main = NA,...) \method{predict}{qsreg}(object, x, derivative = 0, model = object$ind.cv.ps,...) \method{print}{qsreg} (x, ...) qsreg.fit (x, y, lam, maxit = 50, maxit.cv = 10, tol = 1e-04, offset = 0, sc = sqrt(var(y)) * 1e-07, alpha = 0.5, wt = rep(1, length(x)), cost = 1) qsreg.psi( r,alpha=.5,C=1) qsreg.sigma( r,alpha=.5,C=1) qsreg.trace(x, y, lam, maxit = 50, maxit.cv = 10, tol = 1e-04, offset = 0, sc = sqrt(var(y)) * 1e-07, alpha = 0.5, wt = rep(1, length(x)), cost = 1) qsreg.sigma.OLD(r, alpha = 0.5, C = 1) qsreg.psi.OLD(r, alpha = 0.5, C = 1) quickPrint(obj, max.values = 10) radbas.constant (m, d) sreg.df.to.lambda (df, x, wt, guess = 1, tol = 1e-05) sreg.fdf (h, info) sreg.fgcv (lam, obj) sreg.fgcv.model (lam, obj) sreg.fgcv.one (lam, obj) sreg.fit (lam, obj, verbose=FALSE) sreg.fs2hat (lam, obj) sreg.trace (h, info) summaryGCV.Krig(object, lambda, cost = 1, verbose = FALSE, offset = 0, y = NULL, ...) summaryGCV.sreg (object, lambda, cost = 1, nstep.cv = 20, offset = 0, verbose = TRUE,...) \method{summary}{qsreg} (object, ...) \method{summary}{spatialDesign} (object, digits = 4, ...) \method{summary}{sreg} (object, digits = 4, ...) surface(object , ...) \method{surface}{default}(object, col = viridis(256), ...) unscale (x, x.center, x.scale) } \keyword{internal} % docclass is function % Converted by Sd2Rd version 1.21. fields/man/add.image.Rd0000644000176200001440000000543114275214115014400 0ustar liggesusers%# %# fields is a package for analysis of spatial data written for %# the R software environment. %# Copyright (C) 2022 Colorado School of Mines %# 1500 Illinois St., Golden, CO 80401 %# Contact: Douglas Nychka, douglasnychka@gmail.edu, %# %# This program is free software; you can redistribute it and/or modify %# it under the terms of the GNU General Public License as published by %# the Free Software Foundation; either version 2 of the License, or %# (at your option) any later version. %# This program is distributed in the hope that it will be useful, %# but WITHOUT ANY WARRANTY; without even the implied warranty of %# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the %# GNU General Public License for more details. %# %# You should have received a copy of the GNU General Public License %# along with the R software environment if not, write to the Free Software %# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA %# or see http://www.r-project.org/Licenses/GPL-2 %##END HEADER %##END HEADER \name{add.image} \alias{add.image} %- Also NEED an '\alias' for EACH other topic documented here. \title{ Adds an image to an existing plot.} \description{ Adds an image to an existing plot. Simple arguments control the location and size. } \usage{ add.image(xpos, ypos, z, adj.x = 0.5, adj.y = 0.5, image.width = 0.15, image.height = NULL, col = tim.colors(256), ...) } %- maybe also 'usage' for other objects documented here. \arguments{ \item{xpos}{X position of image in user coordinates } \item{ypos}{ Y position of image in user coordinates } \item{z}{ Matrix of intensities comprising the image. } \item{adj.x}{ Location of image relative to x coordinate. Most common values are .5 (centered), 0 (right side of image at x) and 1 (left side of image at x). These are the same conventions that are used for \code{adj} in positioning text.} \item{adj.y}{Location of image relative to y coordinate. Same rules as \code{adj.x} } \item{image.width}{ Width of image as a fraction of the plotting region in horizontal direction. } \item{image.height}{ Height of image as a fraction of the plotting region in horizontal direction. If NULL height is scaled to make image pixels square.} \item{col}{ Color table for image. Default is tim.colors.} \item{\dots}{Any other plotting arguments that are passed to the image function } } \seealso{ image.plot, colorbar.plot, image, tim.colors } \examples{ plot( 1:10, 1:10, type="n") data( lennon) add.image( 5,4,lennon, col=grey( (0:256)/256)) # reference lines xline( 5, col=2) yline( 4,col=2) # # add lennon right in the corner beyond the plotting region # par(new=TRUE, plt=c(0,1,0,1), mar=c(0,0,0,0), usr=c(0,1,0,1)) add.image( 0,0, lennon, adj.x=0, adj.y=0) } \keyword{ hplot }% at least one, from doc/KEYWORDS fields/man/as.image.Rd0000644000176200001440000001055214275214115014253 0ustar liggesusers%# %# fields is a package for analysis of spatial data written for %# the R software environment. %# Copyright (C) 2022 Colorado School of Mines %# 1500 Illinois St., Golden, CO 80401 %# Contact: Douglas Nychka, douglasnychka@gmail.edu, %# %# This program is free software; you can redistribute it and/or modify %# it under the terms of the GNU General Public License as published by %# the Free Software Foundation; either version 2 of the License, or %# (at your option) any later version. %# This program is distributed in the hope that it will be useful, %# but WITHOUT ANY WARRANTY; without even the implied warranty of %# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the %# GNU General Public License for more details. %# %# You should have received a copy of the GNU General Public License %# along with the R software environment if not, write to the Free Software %# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA %# or see http://www.r-project.org/Licenses/GPL-2 %##END HEADER %##END HEADER \name{as.image} \alias{as.image} \title{ Creates image from irregular x,y,z } \description{ Discretizes a set of 2-d locations to a grid and produces a image object with the z values in the right cells. For cells with more than one Z value the average is used. } \usage{ as.image(Z, ind=NULL, grid=NULL, x=NULL,weights=rep(1, length(Z)), na.rm=FALSE, nx=64, ny=64, boundary.grid=FALSE, nrow=NULL, ncol=NULL, FUN = NULL) } \arguments{ \item{Z}{ Values of image. } \item{ind}{ A matrix giving the row and column subscripts for each image value in Z. (Not needed if x is specified.) } \item{grid}{ A list with components x and y of equally spaced values describing the centers of the grid points. The default is to use nrow and ncol and the ranges of the data locations (x) to construct a grid. } \item{x}{ Locations of image values. Not needed if ind is specified. } \item{nrow}{ Same as nx this is depreciated. } \item{ncol}{ Same as ny this is depreciated. } \item{weights}{ If two or more values fall into the same pixel a weighted average is used to represent the pixel value. Default is equal weights. } \item{na.rm}{ If true NA's are removed from the Z vector.} \item{nx}{Number of grid point in X coordinate.} \item{ny}{Number of grid points in Y coordinate.} \item{boundary.grid}{If FALSE grid points are assumed to be the grid midpoints. If TRUE they are the grid box boundaries.} \item{FUN}{The function to apply to common values in a grid box. The default is a mean (or weighted mean). If FUN is specified the weights are not used. } } \value{ An list in image format with a few more components. Components x and y are the grid values , z is a nrow X ncol matrix with the Z values. NA's are placed at cell locations where Z data has not been supplied. Component ind is a 2 column matrix with subscripts for the locations of the values in the image matrix. Component weights is an image matrix with the sum of the individual weights for each cell. If no weights are specified the default for each observation is one and so the weights will be the number of observations in each bin. } \details{ The discretization is straightforward once the grid is determined. If two or more Z values have locations in the same cell the weighted average value is taken as the value. The weights component that is returned can be used to account for means that have different numbers (or precisions) of observations contributing to the grid point averages. The default weights are taken to be one for each observation. See the source code to modify this to get more information about coincident locations. (See the call to fast.1way) } \seealso{ image.smooth, image.plot, Krig.discretize, Krig.replicates } \examples{ # convert precip data to 50X50 image look<- as.image( RMprecip$y, x= RMprecip$x, nx=50, ny=50) image.plot( look) # reduced grid extent compared to the domain gridList<- list( x = seq(-105,-101,length.out=10), y = seq( 38, 42,length.out=10) ) look2<- as.image( RMprecip$y, x= RMprecip$x,grid=gridList) image.plot( look2) # number of obs in each cell -- in this case equal to the # aggregated weights because each obs had equal weight in the call image.plot( look$x ,look$y, look$weights, col=terrain.colors(50)) # hot spot is around Denver } \keyword{manip} % docclass is function % Converted by Sd2Rd version 1.21. fields/man/predictSE.Krig.Rd0000644000176200001440000001262014275214115015342 0ustar liggesusers%# %# fields is a package for analysis of spatial data written for %# the R software environment. %# Copyright (C) 2022 Colorado School of Mines %# 1500 Illinois St., Golden, CO 80401 %# Contact: Douglas Nychka, douglasnychka@gmail.edu, %# %# This program is free software; you can redistribute it and/or modify %# it under the terms of the GNU General Public License as published by %# the Free Software Foundation; either version 2 of the License, or %# (at your option) any later version. %# This program is distributed in the hope that it will be useful, %# but WITHOUT ANY WARRANTY; without even the implied warranty of %# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the %# GNU General Public License for more details. %# %# You should have received a copy of the GNU General Public License %# along with the R software environment if not, write to the Free Software %# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA %# or see http://www.r-project.org/Licenses/GPL-2 %##END HEADER %##END HEADER \name{predictSE} \alias{predictSE} \alias{predictSE.Krig} \alias{predictSE.mKrig} \alias{predictSEUsingKrigA} \title{ Standard errors of predictions for Krig spatial process estimate } \description{ Finds the standard error ( or covariance) of prediction based on a linear combination of the observed data. The linear combination is usually the "Best Linear Unbiased Estimate" (BLUE) found from the Kriging equations. This statistical computation is done under the assumption that the covariance function is known. } \usage{ predictSE(object, ...) \method{predictSE}{Krig}(object, x = NULL, cov = FALSE, verbose = FALSE,...) \method{predictSE}{mKrig}(object, xnew = NULL, Z = NULL, verbose = FALSE, drop.Z = FALSE, ...) } \arguments{ \item{drop.Z}{If FALSE find standard error without including the additional spatial covariates described by \code{Z}. If TRUE find full standard error with spatial covariates if they are part of the model.} \item{object}{ A fitted object that can be used to find prediction standard errors. This is usually from fitting a spatial model to data. e.g. a Krig or mKrig object. } \item{xnew}{ Points to compute the predict standard error or the prediction cross covariance matrix. } \item{x}{ Same as \code{xnew} -- points to compute the predict standard error or the prediction cross covariance matrix. } \item{cov}{ If TRUE the full covariance matrix for the predicted values is returned. Make sure this will not be big if this option is used. ( e.g. 50X50 grid will return a matrix that is 2500X2500!) If FALSE just the marginal standard deviations of the predicted values are returned. Default is FALSE -- of course. } \item{verbose}{If TRUE will print out various information for debugging.} \item{\dots}{ These additional arguments passed to the predictSE function. } \item{Z}{Additional matrix of spatial covariates used for prediction. These are used to determine the additional covariance contributed in teh fixed part of the model.} } \value{ A vector of standard errors for the predicted values of the Kriging fit. } \details{ The predictions are represented as a linear combination of the dependent variable, Y. Call this LY. Based on this representation the conditional variance is the same as the expected value of (P(x) + Z(X) - LY)**2. where P(x)+Z(x) is the value of the surface at x and LY is the linear combination that estimates this point. Finding this expected value is straight forward given the unbiasedness of LY for P(x) and the covariance for Z and Y. In these calculations it is assumed that the covariance parameters are fixed. This is an approximation since in most cases they have been estimated from the data. It should also be noted that if one assumes a Gaussian field and known parameters in the covariance, the usual Kriging estimate is the conditional mean of the field given the data. This function finds the conditional standard deviations (or full covariance matrix) of the fields given the data. There are two useful extensions supported by this function. Adding the variance to the estimate of the spatial mean if this is a correlation model. (See help file for Krig) and calculating the variances under covariance misspecification. The function \code{predictSE.KrigA} uses the smoother matrix ( A(lambda) ) to find the standard errors or covariances directly from the linear combination of the spatial predictor. Currently this is also the calculation in \code{predictSE.Krig} although a shortcut is used \code{predictSE.mKrig} for mKrig objects. } \seealso{ Krig, predict.Krig, predictSurfaceSE } \examples{ # # Note: in these examples predictSE will default to predictSE.Krig using # a Krig object fit<- Krig(ChicagoO3$x,ChicagoO3$y,cov.function="Exp.cov", aRange=10) # Krig fit predictSE.Krig(fit) # std errors of predictions at obs. # make a grid of X's xg<-make.surface.grid( list(East.West=seq(-27,34,,20),North.South=seq(-20,35,,20))) out<- predictSE(fit,xg) # std errors of predictions #at the grid points out is a vector of length 400 #reshape the grid points into a 20X20 matrix etc. out.p<-as.surface( xg, out) surface( out.p, type="C") # this is equivalent to the single step function # (but default is not to extrapolation beyond data # out<- predictSurfaceSE( fit) # image.plot( out) } \keyword{spatial} % docclass is function % Converted by Sd2Rd version 1.21. fields/man/fields.grid.Rd0000644000176200001440000000537014275214115014763 0ustar liggesusers%# %# fields is a package for analysis of spatial data written for %# the R software environment. %# Copyright (C) 2022 Colorado School of Mines %# 1500 Illinois St., Golden, CO 80401 %# Contact: Douglas Nychka, douglasnychka@gmail.edu, %# %# This program is free software; you can redistribute it and/or modify %# it under the terms of the GNU General Public License as published by %# the Free Software Foundation; either version 2 of the License, or %# (at your option) any later version. %# This program is distributed in the hope that it will be useful, %# but WITHOUT ANY WARRANTY; without even the implied warranty of %# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the %# GNU General Public License for more details. %# %# You should have received a copy of the GNU General Public License %# along with the R software environment if not, write to the Free Software %# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA %# or see http://www.r-project.org/Licenses/GPL-2 %##END HEADER %##END HEADER \name{fields.grid} \alias{mKrig.grid} \title{ Using MKrig for predicting on a grid. } \description{ This is an extended example for using the sparse/fast interpolation methods in mKrig to evaluate a Kriging estimate on a large grid. } \details{ \code{mKrig} is a flexible function for surface fitting using a spatial process model. It can also exploit sparse matrix methods forlarge data sets by using a compactly supported covariance. The example below shows how ot evaluate a solution on a big grid. (Thanks to Jan Klennin for this example.) } \examples{ x<- RMprecip$x y<- RMprecip$y Tps( x,y)-> obj # make up an 80X80 grid that has ranges of observations # use same coordinate names as the x matrix glist<- fields.x.to.grid(x, nx=80, ny=80) # this is a cute way to get a default grid that covers x # convert grid list to actual x and y values ( try plot( Bigx, pch=".")) make.surface.grid(glist)-> Bigx # include actual x locations along with grid. Bigx<- rbind( x, Bigx) # evaluate the surface on this set of points (exactly) predict(obj, x= Bigx)-> Bigy # set the range for the compact covariance function # this will involve less than 20 nearest neighbors that have # nonzero covariance # V<- diag(c( 2.5*(glist$lon[2]-glist$lon[1]), 2.5*(glist$lat[2]-glist$lat[1]))) \dontrun{ # this is an interplotation of the values using a compact # but thin plate spline like covariance. mKrig( Bigx,Bigy, cov.function="wendland.cov",k=4, V=V, lambda=0)->out2 # the big evaluation this takes about 45 seconds on a Mac G4 latop predictSurface( out2, nx=400, ny=400)-> look } # the nice surface \dontrun{ surface( look) US( add=TRUE, col="white") } } \keyword{hplot} fields/man/RMprecip.Rd0000644000176200001440000001225314275214115014310 0ustar liggesusers%# %# fields is a package for analysis of spatial data written for %# the R software environment. %# Copyright (C) 2022 Colorado School of Mines %# 1500 Illinois St., Golden, CO 80401 %# Contact: Douglas Nychka, douglasnychka@gmail.edu, %# %# This program is free software; you can redistribute it and/or modify %# it under the terms of the GNU General Public License as published by %# the Free Software Foundation; either version 2 of the License, or %# (at your option) any later version. %# This program is distributed in the hope that it will be useful, %# but WITHOUT ANY WARRANTY; without even the implied warranty of %# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the %# GNU General Public License for more details. %# %# You should have received a copy of the GNU General Public License %# along with the R software environment if not, write to the Free Software %# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA %# or see http://www.r-project.org/Licenses/GPL-2 %##END HEADER %##END HEADER \name{RMprecip} \alias{RMprecip} \alias{RMelevation} \alias{PRISMelevation} \title{ Monthly total precipitation (mm) for August 1997 in the Rocky Mountain Region and some gridded 4km elevation data sets (m). } \description{ \code{RMprecip} is a useful spatial data set of moderate size consisting of 806 locations. \code{PRISMelevation} and \code{RMelevation} are gridded elevations for the continental US and Rocky Mountain region at 4km resolution. Note that the gridded elevations from the PRISM data product are different than the exact station elevations. (See example below.) } \format{ The data set \code{RMprecip} is a list containing the following components: \describe{ \item{x}{ Longitude-latitude position of monitoring stations. Rows names are station id codes consistent with the US Cooperative observer network. The ranges for these coordinates are [-111, -99] for longitude and [35,45] for latitude. } \item{elev}{ Station elevation in meters. } \item{y}{ Monthly total precipitation in millimeters. for August, 1997 } } The data sets \code{PRISMelevation} and \code{RMelevation} are lists in the usual R grid format for images and contouring They have the following components: \describe{ \item{x}{ Longitude grid at approximately 4km resolution} \item{y}{ Latitude grid at approximately 4km resolution} \item{z}{ Average elevation for grid cell in meters } } These elevations and the companion grid formed the basis for the 103-Year High-Resolution Precipitation Climate Data Set for the Conterminous United States ( see \url{https://prism.oregonstate.edu/documents/PRISM_downloads_FTP.pdf} and also archived at the National Climate Data Center. This work is authored by Chris Daly \url{https://prism.oregonstate.edu} and his PRISM group but had some contribution from the Geophysical Statistics Project at NCAR and is an interpolation of the observational data to a 4km grid that takes into account topography such as elevation and aspect. } \details{ Contact Doug Nychka for the binary file \code{RData.USmonthlyMet.bin} and information on its source. \preformatted{ # explicit source code to create the RMprecip data dir <- "" # include path to data file load(paste(dir, "RData.USmonthlyMet.bin", sep="/") #year.id<- 1963- 1895 year.id<- 103 #pptAUG63<- USppt[ year.id,8,] loc<- cbind(USpinfo$lon, USpinfo$lat) xr<- c(-111, -99) yr<- c( 35, 45) station.subset<- (loc[,1]>= xr[1]) & (loc[,1] <= xr[2]) & (loc[,2]>= yr[1]) & (loc[,2]<= yr[2]) ydata<- USppt[ year.id,8,station.subset] ydata <- ydata*10 # cm -> mm conversion xdata<- loc[station.subset,] dimnames(xdata)<- list( USpinfo$station.id[station.subset], c( "lon", "lat")) xdata<- data.frame( xdata) good<- !is.na(ydata) ydata<- ydata[good] xdata<- xdata[good,] test.for.zero.flag<- 1 test.for.zero( unlist(RMprecip$x), unlist(xdata), tag="locations") test.for.zero( ydata, RMprecip$y, "values") } } \examples{ # this data set was created the # historical data taken from # Observed monthly precipitation, min and max temperatures for the coterminous US # 1895-1997 # NCAR_pinfill # see the Geophysical Statistics Project datasets page for the supporting functions # and details. # plot quilt.plot(RMprecip$x, RMprecip$y) US( add=TRUE, col=2, lty=2) # comparison of station elevations with PRISM gridded values data(RMelevation) interp.surface( RMelevation, RMprecip$x)-> test.elev plot( RMprecip$elev, test.elev, xlab="Station elevation", ylab="Interpolation from PRISM grid") abline( 0,1,col="blue") # some differences with high elevations probably due to complex # topography! # # view of Rockies looking from theSoutheast save.par<- par(no.readonly=TRUE) par( mar=c(0,0,0,0)) # fancy use of persp with shading and lighting. persp( RMelevation, theta=75, phi= 15, box=FALSE, axes=FALSE, xlab="", ylab="", border=NA, shade=.95, lphi= 10, ltheta=80, col= "wheat4", scale=FALSE, expand=.00025) # reset graphics parameters and a more conventional image plot. par( save.par) image.plot(RMelevation, col=topo.colors(256)) US( add=TRUE, col="grey", lwd=2) title("PRISM elevations (m)") } \keyword{datasets} % docclass is data % Converted by Sd2Rd version 1.21. fields/man/KrigFindLambda.Rd0000644000176200001440000001322214275214115015362 0ustar liggesusers%# %# fields is a package for analysis of spatial data written for %# the R software environment. %# Copyright (C) 2022 Colorado School of Mines %# 1500 Illinois St., Golden, CO 80401 %# Contact: Douglas Nychka, douglasnychka@gmail.edu, %# %# This program is free software; you can redistribute it and/or modify %# it under the terms of the GNU General Public License as published by %# the Free Software Foundation; either version 2 of the License, or %# (at your option) any later version. %# This program is distributed in the hope that it will be useful, %# but WITHOUT ANY WARRANTY; without even the implied warranty of %# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the %# GNU General Public License for more details. %# %# You should have received a copy of the GNU General Public License %# along with the R software environment if not, write to the Free Software %# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA %# or see http://www.r-project.org/Licenses/GPL-2 %##END HEADER %##END HEADER \name{KrigFindLambda} \alias{KrigFindLambda} \alias{gcv.sreg} \title{Finds profile likelihood and GCV estimates of smoothing parameters for splines and Kriging.} \description{ This is a secondary function that will use the computed Krig object and find various estimates of the smoothing parameter lambda. These are several different flavors of cross-validation, a moment matching strategy and the profile likelihood. This function can also be used independently with different data sets (the y's) if the covariates ( the x's) are the same and thus reduce the computation. } \usage{ KrigFindLambda( out, lambda.grid = NA, cost = 1, nstep.cv = 200, rmse = NA, verbose = FALSE, tol = 1e-05, offset = 0, y = NULL, give.warnings = TRUE) gcv.sreg ( out, lambda.grid = NA, cost = 1, nstep.cv = 80, rmse = NA, offset = 0, trmin = NA, trmax = NA, verbose = FALSE, tol = 1e-05, give.warnings = TRUE) } %- maybe also 'usage' for other objects documented here. \arguments{ \item{out}{ A Krig or sreg object.} \item{lambda.grid}{ Grid of lambdas for coarse search. The default is equally spaced on effective degree of freedom scale. } \item{cost}{ Cost used in GCV denominator } \item{nstep.cv}{ Number of grid points in coarse search. } \item{rmse}{ Target root mean squared error to match with the estimate of tau**2 } \item{verbose}{ If true prints intermediate results. } \item{tol}{ Tolerance in delcaring convergence of golden section search or bisection search. } \item{offset}{ Additional degrees of freedom to be added into the GCV denominator. } \item{y}{A new data vector to be used in place of the one associated with the Krig object (obj) } \item{give.warnings}{ If FALSE will suppress warnings about grid search being out of range for various estimates based on GCV and REML.} \item{trmin}{Minimum value of lambda for grid search specified in terms of effective degrees of freedom.} \item{trmax}{Maximum value for grid search.} } \details{ This function finds several estimates of the smoothing parameter using first a coarse grid search followed by a refinement using a minimization ( in the case of GCV or maximum likelihood) or bisection in the case of mathcing the rmse. Details of the estimators can be found in the help file for the Krig function. The Krig object passed to this function has some matrix decompostions that facilitate rapid computation of the GCV and ML functions and do not depend on the independent variable. This makes it possible to compute the Krig object once and to reuse the decompostions for multiple data sets. (But keep in mind if the x values change then the object must be recalculated.) The example below show show this can be used for a simulation study on the variability for estimating the smoothing parameter. } \value{A list giving a summary of estimates and diagonostic details with the following components: \item{gcv.grid }{ A matrix describing results of the coarse search rows are values of lambda and the columns are lambda= value of smoothing parameter, trA=effective degrees of freedom, GCV=Usual GCV criterion, GCV.one=GCV criterion leave-one-out, GCV.model= GCV based on average response in the case of replicates, tauHat= Implied estimate of tau , -Log Profile= negative log of profiel likelihood for the lambda. } \item{lambda.est}{Summary table of all estimates Rows index different types of estimates: GCV, GCV.model, GCV.one, RMSE, pure error, -Log Profile and the columns are the estimated values for lambda, trA, GCV, tauHat. } } \author{Doug Nychka} \seealso{ \code{\link{Krig}}, \code{\link{Tps}}, \code{\link{predict.Krig}} } \examples{ # Tps( ChicagoO3$x, ChicagoO3$y)-> obj # default is to find lambda by GCV summary( obj) KrigFindLambda( obj)-> out print( out$lambda.est) # results agree with Tps summary sreg( rat.diet$t, rat.diet$trt)-> out gcv.sreg( out, tol=1e-10) # higher tolerance search for minimum \dontrun{ # a simulation example x<- seq( 0,1,,150) f<- x**2*( 1-x) f<- f/sqrt( var( f)) set.seed(123) # let's all use the same seed tau<- .1 y<- f + rnorm( 150)*tau Tps( x,y)-> obj # create Krig object hold<- hold2<- matrix( NA, ncol=6, nrow=200) for( k in 1:200){ # look at GCV estimates of lambda # new data simulated y<- f + rnorm(150)*tau # save GCV estimates lambdaTable<- KrigFindLambda(obj, y=y, give.warnings=FALSE)$lambda.est hold[k,]<- lambdaTable[1,] hold2[k,]<- lambdaTable[6,] } matplot( cbind(hold[,2], hold2[,2]),cbind( hold[,4],hold2[,4]), xlab="estimated eff. df", ylab="tau hat", pch=16, col=c("orange3", "green2"), type="p") yline( tau, col="grey", lwd=2) } } \keyword{spatial} fields/man/ribbon.plot.Rd0000644000176200001440000000567414275214115015030 0ustar liggesusers%# %# fields is a package for analysis of spatial data written for %# the R software environment. %# Copyright (C) 2022 Colorado School of Mines %# 1500 Illinois St., Golden, CO 80401 %# Contact: Douglas Nychka, douglasnychka@gmail.edu, %# %# This program is free software; you can redistribute it and/or modify %# it under the terms of the GNU General Public License as published by %# the Free Software Foundation; either version 2 of the License, or %# (at your option) any later version. %# This program is distributed in the hope that it will be useful, %# but WITHOUT ANY WARRANTY; without even the implied warranty of %# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the %# GNU General Public License for more details. %# %# You should have received a copy of the GNU General Public License %# along with the R software environment if not, write to the Free Software %# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA %# or see http://www.r-project.org/Licenses/GPL-2 %##END HEADER %##END HEADER \name{ribbon.plot} \alias{ribbon.plot} %- Also NEED an '\alias' for EACH other topic documented here. \title{ Adds to an existing plot, a ribbon of color, based on values from a color scale, along a sequence of line segments.} \description{ Given a series of 2-d points and values at these segments, the function colors the segments according to a color scale and the segment values. This is essentially an image plot restricted to line segments. } \usage{ ribbon.plot(x,y,z,zlim=NULL, col=tim.colors(256), transparent.color="white",...) } \arguments{ \item{x}{x locations of line segments} \item{y}{y locations of line segments} \item{z}{ Values associated with each segment.} \item{zlim}{Range for z values to determine color scale. } \item{col}{Color table used for strip. Default is our favorite tim.colors being a scale from a dark blue to dark red.} \item{transparent.color}{Color used for missing values. Default is that missing values make the ribbon transparent.} \item{\dots}{Optional graphical arguments that are passed to the \code{segment} plotting function. A favorite is lwd to make a broad ribbon. } } \details{ Besides possible 2-d applications, this function is useful to annotate a curve on a surface using colors. The values mapped to acolor scheme could indicate a feature other than the height of the surface. For example, this function could indicate the slope of the surface. } \author{Doug Nychka} \seealso{ image.plot, arrow.plot, add.image, colorbar.plot} \examples{ plot( c(-1.5,1.5),c(-1.5,1.5), type="n") temp<- list( x= seq( -1,1,,40), y= seq( -1,1,,40)) temp$z <- outer( temp$x, temp$y, "+") contour( temp, add=TRUE) t<- seq( 0,.5,,50) y<- sin( 2*pi*t) x<- cos( pi*t) z<- x + y ribbon.plot( x,y,z, lwd=10) persp( temp, phi=15, shade=.8, col="grey")-> pm trans3d( x,y,z,pm)-> uv ribbon.plot( uv$x, uv$y, z**2,lwd=5) } \keyword{ hplot }% at least one, from doc/KEYWORDS fields/man/rdist.earth.Rd0000644000176200001440000000754214275214115015023 0ustar liggesusers%# %# fields is a package for analysis of spatial data written for %# the R software environment. %# Copyright (C) 2022 Colorado School of Mines %# 1500 Illinois St., Golden, CO 80401 %# Contact: Douglas Nychka, douglasnychka@gmail.edu, %# %# This program is free software; you can redistribute it and/or modify %# it under the terms of the GNU General Public License as published by %# the Free Software Foundation; either version 2 of the License, or %# (at your option) any later version. %# This program is distributed in the hope that it will be useful, %# but WITHOUT ANY WARRANTY; without even the implied warranty of %# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the %# GNU General Public License for more details. %# %# You should have received a copy of the GNU General Public License %# along with the R software environment if not, write to the Free Software %# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA %# or see http://www.r-project.org/Licenses/GPL-2 %##END HEADER %##END HEADER \name{rdist.earth} \alias{rdist.earth} \alias{rdist.earth.vec} \alias{RdistEarth} \title{ Great circle distance matrix or vector } \description{ Given two sets of longitude/latitude locations, \code{rdist.earth} computes the Great circle (geographic) distance matrix among all pairings and \code{rdist.earth.vec} computes a vector of pairwise great circle distances between corresponding elements of the input locations using the Haversine method and is used in empirical variogram calculations. } \usage{ rdist.earth(x1, x2, miles = TRUE, R = NULL) RdistEarth(x1, x2=NULL, miles=TRUE, R=NULL) rdist.earth.vec(x1, x2, miles = TRUE, R = NULL) } \arguments{ \item{x1}{ Matrix of first set of lon/lat coordinates first column is the longitudes and second is the latitudes. } \item{x2}{ Matrix of second set of lon/lat coordinates first column is the longitudes and second is the latitudes. If missing or NULL x1 is used. } \item{miles}{ If true distances are in statute miles if false distances in kilometers. } \item{R}{ Radius to use for sphere to find spherical distances. If NULL the radius is either in miles or kilometers depending on the values of the miles argument. If R=1 then distances are of course in radians. } } \value{ The great circle distance matrix if nrow(x1)=m and nrow( x2)=n then the returned matrix will be mXn. } \details{ Surprisingly the distance matrix is computed efficiently in R by dot products of the direction cosines. This is the calculation in \code{rdist.earth}. Thanks to Qing Yang for pointing this out a long time ago. A more efficient version has been implemented in C with the R function \code{RdistEarth} by Florian Gerber who has also experimented with parallel versions of fields functions. The main advantage of \code{RdistEarth} is the largely reduce memory usage. The speed seems simillar to \code{rdist.earth}. As Florian writes: "The current fields::rdist.earth() is surprisingly fast. In the case where only the argument 'x1' is specified, the new C implementation is faster. In the case where 'x1' and 'x2' are given, fields::rdist.earth() is a bit faster. This might be because fields::rdist.earth() does not check its input arguments and uses a less complicated (probably numerically less stable) formula." } \author{Doug Nychka, John Paige, Florian Gerber} \seealso{ \link{rdist}, \link{stationary.cov}, \link{fields.rdist.near} } \examples{ data(ozone2) out<- rdist.earth ( ozone2$lon.lat) #out is a 153X153 distance matrix out2<- RdistEarth ( ozone2$lon.lat) all.equal(out, out2) upper<- col(out)> row( out) # histogram of all pairwise distances. hist( out[upper]) #get pairwise distances between first 10 and second 10 lon/lat points x1 = ozone2$lon.lat[1:10,] x2 = ozone2$lon.lat[11:20,] dists = rdist.earth.vec(x1, x2) print(dists) } \keyword{spatial} % docclass is function % Converted by Sd2Rd version 1.21. fields/man/fields.hints.Rd0000644000176200001440000001114314275214115015156 0ustar liggesusers%# %# fields is a package for analysis of spatial data written for %# the R software environment. %# Copyright (C) 2022 Colorado School of Mines %# 1500 Illinois St., Golden, CO 80401 %# Contact: Douglas Nychka, douglasnychka@gmail.edu, %# %# This program is free software; you can redistribute it and/or modify %# it under the terms of the GNU General Public License as published by %# the Free Software Foundation; either version 2 of the License, or %# (at your option) any later version. %# This program is distributed in the hope that it will be useful, %# but WITHOUT ANY WARRANTY; without even the implied warranty of %# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the %# GNU General Public License for more details. %# %# You should have received a copy of the GNU General Public License %# along with the R software environment if not, write to the Free Software %# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA %# or see http://www.r-project.org/Licenses/GPL-2 %##END HEADER %##END HEADER \name{fields.hints} \alias{fields.hints} \alias{fields.style} \alias{fields.color.picker} \title{ fields - graphics hints } \description{ Here are some technical hints for assembling multiple plots with common legends or axes and setting the graphics parameters to make more readable figures. Also we an index to the defaultcolors in R graphics and setting their definitions in LaTeX. All these hints use the standard graphics environment. } \usage{ fields.style() fields.color.picker() } \details{ \code{fields.style} is a simple function to enlarge the characters in a plot and set the colors. List this out to modify the choices. \preformatted{ ##Two examples of concentrating a panel of plots together ## to conserve the white space. ## see also the example in image.plot using split.screen. ## The basic trick is to use the oma option to reserve some space around the ## plots. Then unset the outer margins to use that room. library( fields) # some hokey image data x<- 1:20 y<- 1:15 z<- outer( x,y,"+") zr<- range( c(z)) # add common legend to 3X2 panel par( oma=c(4,0,0,0)) set.panel( 3,2) par( mar=c(1,1,0,0)) # squish plots together with just 1 space between for ( k in 1:6){ image( x,y,z, axes=FALSE, xlab="", ylab="", zlim=zr) } par( oma=c(0,0,0,0)) image.plot( zlim=zr, legend.only=TRUE, horizontal=TRUE, legend.mar=5) # you may have to play around with legend.mar and the oma settings to # get enough space. ## ### also add some axes on the sides. in a lattice style ## note oma adds some more room at bottom. par( oma=c(8,6,1,1)) set.panel( 3,2) par( mar=c(1,1,0,0)) ## for ( k in 1:6){ image( x,y,z, axes=FALSE, xlab="", ylab="", zlim=zr) box() # box around figure # maybe draw an x axis if( k \%in\% c(5,6) ){ axis( 1, cex.axis=1.5) mtext( line=4, side=1, "Xstuff")} # maybe draw a y axis if( k \%in\% c(1,3,5) ){ axis( 2, cex.axis=1.5) mtext( line=4, side=2, "Ystuff")} } # same trick of adding a legend strip. par( oma=c(0,0,0,0)) image.plot( zlim=zr, legend.only=TRUE, horizontal=TRUE, legend.mar=5) # reset panel set.panel() #### # show colors ## the factory colors: clab<- colors() n<- length( clab) N<- ceiling( sqrt(n) ) M<- N temp<- rep( NA,M*N) temp[1:n] <- 1:n z<- matrix(temp, M,N) image(seq(.5,M+.5,,M+1), seq(.5,N+.5,,N+1) , z, col=clab, axes=FALSE, xlab="", ylab="") # see the function fields.color.picker() to locate colors # dumping out colors by name for a latex document # this creates text strings that are the LaTeX color definitions # using the definecolor function. # grab all of the R default colors clab<- colors() for( nn in clab){ temp<- signif(col2rgb(nn)/256, 3) cat( "\\definecolor{", nn, "}", "{rgb}{", temp[1], ",", temp[2], ",", temp[3], "}", fill=TRUE , sep="") } # this loop prints out definitions such as # \definecolor{yellowgreen}{rgb}{0.602,0.801,0.195} # having loaded the color package in LaTeX # defining this color # use the construction {\color{yellowgreen} THIS IS A COLOR} # to use this color in a talk or document. # this loop prints out all the colors in LaTeX language # as their names and can be converted to a pdf for handy reference. sink( "showcolors.tex") clab<- colors() for( nn in clab){ temp<- signif(col2rgb(nn)/256, 3) cat( "\\definecolor{", nn, "}", "{rgb}{", temp[1], ",", temp[2], ",", temp[3], "}", fill=TRUE , sep="") cat( paste("{ \\color{",nn,"} ", nn," $\\bullet$ \\\\ }", sep=""), fill=TRUE) } sink() } %end preformatted } \keyword{hplot} fields/man/image.plot.Rd0000644000176200001440000006361314453607700014640 0ustar liggesusers%# %# fields is a package for analysis of spatial data written for %# the R software environment. %# Copyright (C) 2022 Colorado School of Mines %# 1500 Illinois St., Golden, CO 80401 %# Contact: Douglas Nychka, douglasnychka@gmail.edu, %# %# This program is free software; you can redistribute it and/or modify %# it under the terms of the GNU General Public License as published by %# the Free Software Foundation; either version 2 of the License, or %# (at your option) any later version. %# This program is distributed in the hope that it will be useful, %# but WITHOUT ANY WARRANTY; without even the implied warranty of %# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the %# GNU General Public License for more details. %# %# You should have received a copy of the GNU General Public License %# along with the R software environment if not, write to the Free Software %# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA %# or see http://www.r-project.org/Licenses/GPL-2 %##END HEADER %##END HEADER \name{image.plot} \alias{image.plot} \title{ Draws an image plot with a legend strip for the color scale based on either a regular grid or a grid of quadrilaterals. } \description{ This function combines the R image function with some automatic placement of a legend. This is done by splitting the plotting region into two parts. Putting the image in one and the legend in the other. After the legend is added the plot region is reset to the image plot. This function also allows for plotting quadrilateral cells in the image format that often arise from regular grids transformed with a map projection or a scaling and rotation of coordinates. See the example where this function can create a similar graphic to the ggplot package. \code{image.plot} functionality has been frozen, see the more recent function \code{\link{imagePlot}} which is backwardly compatible with this function. } \usage{ \method{image}{plot}(..., add = FALSE, breaks= NULL, nlevel = 64, col = NULL, horizontal = FALSE, legend.shrink = 0.9, legend.width = 1.2, legend.mar = ifelse(horizontal, 3.1, 5.1), legend.lab = NULL, legend.line= 2, graphics.reset = FALSE, bigplot = NULL, smallplot = NULL, legend.only = FALSE, lab.breaks = NULL, axis.args = NULL, legend.args = NULL, legend.cex=1.0, midpoint = FALSE, border = NA, lwd = 1,verbose = FALSE ) } \arguments{ \item{\dots}{ The usual arguments to the \code{image} function as x,y,or z or as a list with x,y,z as components. One can also include a \code{breaks} argument for an unequal spaced color scale with color scale boundaries at the breaks (see example below). If a "quadrilateral grid", arguments must be explicitly x,y and z with x, and y being matrices of dimensions equal to, or one more than, z giving the grid locations. The basic concept is that the coordinates of x and y still define a grid but the image cells are quadrilaterals rather than being restricted to rectangles. NOTE: graphical argruments passed here will only have impact on the image plot. To change the graphical defaults for the legend use the individual legend arguments and/or \code{legend.arg} listed below. } \item{add}{ If true add image and a legend strip to the existing plot. } \item{bigplot}{ Plot coordinates for image plot. If not passed these will be determined within the function. } \item{border}{This only works if x and y are matrices -- if NA the quadralaterals will have a border color that is the same as the interior color. Otherwise this specifies the color to use.} \item{breaks}{Break points in sorted order to indicate the intervals for assigning the colors. Note that if there are nlevel colors there should be (nlevel+1) breakpoints. If \code{breaks} is not specified (nlevel+1) equally spaced breaks are created where the first and last bin have their midpoints at the minimum and maximum values in \code{z} or at \code{zlim}.} \item{col}{ Color table to use for image (See help file on image for details.). Default is a pleasing range of 64 divisions suggested by Tim Hoar and is similar to the MATLAB (TM) jet color scheme. Note that if \code{breaks} is specified there must be one less color specified than the number of breaks. } \item{graphics.reset}{ If FALSE (default) the plotting region ( plt in par) will not be reset and one can add more information onto the image plot. (e.g. using functions such as points or lines.) If TRUE will reset plot parameters to the values before entering the function. } \item{horizontal}{ If false (default) legend will be a vertical strip on the right side. If true the legend strip will be along the bottom. } \item{lab.breaks}{ If breaks are supplied these are text string labels to put at each break value. This is intended to label axis on a transformed scale such as logs.} \item{axis.args}{Additional arguments for the axis function used to create the legend axis. (See example below adding a log scaling.)} \item{legend.only}{ If TRUE just add the legend to a the plot in the plot region defined by the coordinates in smallplot. In the absence of other information the range for the legend is determined from the \code{zlim} argument. } \item{legend.args}{Arguments for a complete specification of the legend label, e.g. if you need to the rotate text or other details. This is in the form of list and is just passed to the mtext function and you will need to give both the side and line arguments for positioning. This usually will not be needed. (See example below.)} \item{legend.cex}{Character expansion to change size of the legend label.} \item{legend.line}{Distance in units of character height (as in \code{mtext}) of the legend label from the color bar. Make this larger if the label collides with the color axis labels.} \item{legend.mar}{ Width in characters of legend margin that has the axis. Default is 5.1 for a vertical legend and 3.1 for a horizontal legend.} \item{legend.lab}{ Label for the axis of the color legend. Default is no label as this is usual evident from the plot title.} \item{legend.shrink}{ Amount to shrink the size of legend relative to the full height or width of the plot. } \item{legend.width}{ Width in characters of the legend strip. Default is 1.2, a little bigger that the width of a character. } \item{lwd}{Line width of bordering lines around pixels. This might need to be set less than 1.0 to avoid visible rounding of the pixel corners.} \item{midpoint}{ This option for the case of unequally spaced grids with x and y being matrices of grid point locations. If FALSE (default) the quadralaterals will be extended to surround the z locations as midpoints. If TRUE z values will be averaged to yield a midpoint value and the original grid points be used to define the quadralaterals. (See help on poly.image for details). In most cases midpoint should be FALSE to preserve exact values for z and let the grid polygons be modified.} \item{nlevel}{ Number of color levels used in legend strip } \item{smallplot}{ Plot coordinates for legend strip. If not passed these will be determined within the function. Be sure to leave room for the axis labels. For example, if the legend is on the right side \code{smallplot= c(.85,.9,0,1) } will leave (.1 in plot coordinates) for the axis labels to the right of the color strip. This argument is useful for drawing a plot with the legend that is the same size as the plots without legends. } \item{verbose}{If TRUE prints intermediate information about setting up plots (for debugging). } } \section{Side Effects}{ After exiting, the plotting region may be changed to make it possible to add more features to the plot. To be explicit, \code{par()\$plt} may be changed to reflect a smaller plotting region that has accommodated room for the legend subplot. If \code{xlim} and \code{ylim} are specified the pixels may overplot the axis lines. Just use the \code{box} function to redraw them. } \details{ This is a function using the basic R graphics. The coding was done to make it easier for users to see how this function works and to modify. \strong{How this function works:} The strategy for \code{image.plot} is simple, divide the plotting region into two smaller regions \code{bigplot} and \code{smallplot}. The image goes in one and the legend in the other. This way there is always room for the legend. Some adjustments are made to this rule by not shrinking the \code{bigplot} if there is already room for the legend strip and also sticking the legend strip close to the image plot. One can specify the plot regions explicitly by \code{bigplot} and \code{smallplot} if the default choices do not work.(Note that these in figure coordinates. ) There may be problems with small plotting regions in fitting both of these elements into the plot region and one may have to change the default character sizes or margins to make things fit. Sometimes this function will not reset the type of margins correctly and the "null" call \code{par(mar = par("mar"))} may help to fix this issue. \strong{The text is too small!} This always seems to happen as one is rushing to finish a talk and the figures have tiny default axis labels. Try just calling the function \code{fields.style} before plotting. List out this function to see what is changed, however, all text is increased by 20\% in size. \strong{Why ``image.plot" and not ``image"?} The R Base function \code{image} is very useful but it is awkward to place a legend quickly. However, that said if you are drawing several image plots and want a common legend use the \code{image} function and just just use \code{image.plot} to add the legend. See the example in the help file. Note that you can use \code{image} to draw a bunch of images and then follow with \code{image.plot} and \code{legend.only=TRUE} to add a common legend. (See examples below.) \strong{Almost cloropleths too:} It should be noted that this image function is slightly different than a cloropleth map because the legend is assuming that a continous scale has been discretized into a series of colors. To make the image.plot function as a cloropleth graphic one would of course use the \code{breaks} option and for clarity perhaps code the different regions as different integer values. In addition, for publication quality one would want to use the \code{legend.args} to add more descriptive labels at the midpoints in the color strip. \strong{Relationship of x, y and z:} If the z component is a matrix then the user should be aware that this function locates the matrix element z[i,j] at the grid locations (x[i], y[j]) this is very different than simply listing out the matrix in the usual row column tabular form. See the example below for details on the difference in formatting. What does one do if you do not really have the "z" values on a regular grid? See the functions \code{quilt.plot.Rd} and \code{as.image} to discretise irregular observations to a grid. If the values makes sense as points on a smooth surface see \code{Tps} and \code{fastTps} for surface interpolation. \strong{Adding separate color to indicate the grid box boundaries.} Sometimes you want to show to the grid box borders to emphasize this is not a smooth surface. To our knowledge there is no easy way to do this as an option in \code{image}. But if your image is formatted in the "poly image" style where x and y are also matrices you can use the polyimage (see the \code{border} argument above) option to draw in boundaries. \strong{Grids with unequally spacing -- quadrialteral pixels:} If x and y are matrices that are a smooth transformation of a regular grid then z[i,j] can be interperted as representing the average value in a quadrilateral that is centered at x[i,j] and y[i,j] (\code{midpoint} TRUE). The details of how this cell is found are buried in \code{poly.image} but it it essentially found using midpoints between the centers. If \code{midpoint} is FALSE then x and y are interpreted as the corners of the quadrilateral cells. But what about z? The four values of z are now averaged to represent a value at the midpoint of the cell and this is what is used for plotting. Quadrilateral grids were added to help with plotting the gridded output of geophysical models where the regular grid is defined according to one map projection but the image plotting is required in another projection. Typically the regular grid becomes distorted in a smooth way when this happens. See the regional climate example for a illustration of this application. One can add border colors in this case easily because these choices are just passed onto the polygon function. \strong{Adding the pixel grid for rectangular images:} For adding the grid of pixel borders to a rectangular image try this example after calling \code{image.plot}. \preformatted{ dx <- x[2] - x[1] dy <- y[2] - y[1] xtemp<- seq( min( x)- dx/2, max(x)+ dx/2, length.out = length(x) +1) ytemp<- seq( min( y)- dy/2, max(y)+ dy/2, length.out = length(y) +1) xline( xtemp, col="grey", lwd=2) yline( ytemp, col="grey", lwd=2) } Here \code{x} and \code{y} here are the x and y grid values from the image list. \strong{Fine tuning color scales:} This function gives some flexibility in tuning the color scale to fit the rendering of z values. This can either be specially designed color scale with specific colors ( see help on \code{designer.colors}), positioning the colors at specific points on the [0,1] scale, or mapping distinct colors to intervals of z. The examples below show how to do each of these. In addition, by supplying \code{lab.break} strings or axis parameters one can annotate the legend axis in an informative matter. \strong{Adding just the legend strip:} Note that to add just the legend strip all the numerical information one needs is the \code{zlim} argument and the color table! See examples for tricks in positioning. \strong{About color tables:} We like \code{tim.colors} as a default color scale and so if this what you use this can be omitted. Unfortunately this is not the default for the \code{image} function. Another important color scale is \code{ viridis() } from the viridis package. It seems that by and large everyone seems to react postively to viridis -- guess that is the point! The topographic color scale (\code{topo.colors}) is also a close second showing our geophysical bias. Users may find \code{larry.colors} useful for coding distinct regions in the style of a cloropleith map. See also \code{terrain.colors} for a subset of the topo ones and \code{designer.colors} to "roll your own" color table. One nice option in this last function is to fix color transitions at particular quantiles of the data rather than at equally spaced intervals. For color choices see how the \code{nlevels} argument figures into the legend and main plot number of colors. Also see the \code{colors} function for a listing of all the colors that come with the R base environment. \strong{The details of placing the legend and dividing up the plotting real estate:} It is surprising how hard it is to automatically add the legend! All "plotting coordinates" mentioned here are in device coordinates. The plot region is assumed to be [0,1]X[0,1] and plotting regions are defined as rectangles within this square. We found these easier to work with than user coordinates. \code{legend.width} and \code{legend.mar} are in units of character spaces. These units are helpful in thinking about axis labels that will be put into these areas. To add more or less space between the legend and the image plot alter the mar parameters. The default mar settings (5.1,5.1,5.1,2.1) leaves 2.1 spaces for vertical legends and 5.1 spaces for horizontal legends. There are always problems with default solutions to placing information on graphs but the choices made here may be useful for most cases. The most annoying thing is that after using image.plot and adding information the next plot that is made may have the slightly smaller plotting region set by the image plotting. The user should set \code{reset.graphics=TRUE} to avoid the plotting size from changing. The disadvantage, however, of resetting the graphics is that one can no longer add additional graphics elements to the image plot. Note that filled.contour always resets the graphics but provides another mechanism to pass through plotting commands. Apparently \code{filled.contour}, while very pretty, does not work for multiple plots. \strong{About setup and add legend functions} These came about to create a scatterplot in Base R Graphics where the points are colored with a color scale and the scale can be plotted as part of the figure See \code{ \link{bubblePlot} } for a version of this kind of figure. The function \code{setupLegend} should be used first to create enough space to add a color scale later. After plotting then \code{addLegend} will add the color scale. Note that if the color scale has been created by the \code{color.scale} function the last call to this function will use the color scale and limits created in \code{color.scale}. In summary here is an example of using these functions with the colors in mind: \preformatted{ info<- setupLegend() colTab<- rainbow(10) plot( 1:10, 201:210, col=colTab, pch=16) addLegend(info, col=colTab, zlim = c(1,10)) } Here is one where four colors are mapped to specific values (ala image). \preformatted{ info<-setupLegend() colTab= color.scale(201:210, rainbow(4)) plot( 1:10, 201:210, col=colTab, pch=16 ) addLegend(info, col=colTab, zlim = c(201,210) ) } More complete graphics languages, such as that in ggplot, do not need such functions because the entire graphics segment is parsed to create the complete figure. In this way room for a color scale can be created automatically. The functions proposed here are a simple work around to create these figures using base R graphics. \strong{Other packages} \code{levelplot} that is part of the lattice package has a very similar function to image.plot and a formula syntax in the call. The \code{geom_raster} for setting up a graphics object within \code{ggplot} is another alternative forr image plots with legends. See the last example to compare the steps in creating an image plot using \code{image.plot} that is close to the ggplot version. Mostly this involves resetting base graphics parameters using the {\code{par}} function. \strong{Multiple images:} By keeping the \code{zlim} argument the same across images one can generate the same color scale. (See the \code{image} help file.) One useful technique for a panel of images is to just draw the images with good old \code{image} and then use image.plot to add a legend to the last plot. (See example below for messing with the outer margins to make this work.) Usually a square plot (\code{pty="s"}) done in a rectangular plot region will have room for the legend stuck to the right side without any other adjustments. See the examples below for more complicated arrangements of multiple image plots and a summary legend. The reader is also referred to the package \code{autoimage} as a set of functions in base to help with drawing multiple images and also more support for geographic coordinates. } \seealso{ \link{imagePlot}, \link{image},\link{poly.image}, \link{filled.contour}, \link{quilt.plot}, \link{bubblePlot}, \link{plot.surface}, \link{add.image}, \link{colorBar}, \link{tim.colors}, \link{designer.colors} } \examples{ x<- 1:10 y<- 1:15 z<- outer( x,y,"+") image.plot(x,y,z) # or obj<- list( x=x,y=y,z=z) image.plot(obj, legend.lab="Sverdrups") ################################################################ # the next sequence of examples explain how to quickly # adpat this basic plot to include morre features # In another direction see the very last example where # we use many of the setting in base R graphic to mimic a # (beautiful) ggplot version. ############################################################### # # add some points on diagonal using standard plot function #(with some clipping beyond 10 anticipated) points( 5:12, 5:12, pch="X", cex=3) # in general image.plot will reset the plot window so you # can add any feature that normally works in base R # e.g. lines, text, contour, boxplots, .... # # adding breaks and distinct colors for intervals of z # with and without lab.breaks brk<- quantile( c(z)) image.plot(x,y,z, breaks=brk, col=rainbow(4)) # annotate legend strip with the break point values and add a label image.plot(x,y,z, breaks=brk, col=rainbow(4), lab.breaks=names(brk)) # # compare to zp <-quantile(c(z), c( .05, .1,.5, .9,.95)) image.plot(x,y,z, axis.args=list( at=zp, labels=names(zp) ) ) # a log scaling for the colors ticks<- c( 1, 2,4,8,16,32) image.plot(x,y,log(z), axis.args=list( at=log(ticks), labels=ticks)) # see help file for designer.colors to generate a color scale that adapts to # quantiles of z. # Add some color scales together here is an example of 5 blues to white to 5 reds # with white being a specific size. colorTable<- designer.colors(11, c( "blue","white", "red") ) # breaks with a gap of 10 to 17 assigned the white color brks<- c(seq( 1, 10,,6), seq( 17, 25,,6)) image.plot( x,y,z,breaks=brks, col=colorTable) # #fat (5 characters wide) and short (50\% of figure) color bar on the bottom image.plot( x,y,z,legend.width=5, legend.shrink=.5, horizontal=TRUE) # adding a label with all kinds of additional arguments. # use side=4 for vertical legend and side= 1 for horizontal legend # to be parallel to axes. See help(mtext). image.plot(x,y,z, legend.args=list( text="unknown units", col="magenta", cex=1.5, side=4, line=2)) # and finally add some grid lines dx <- x[2] - x[1] dy <- y[2] - y[1] xtemp<- seq( min( x)- dx/2, max(x)+ dx/2, length.out = length(x) +1) ytemp<- seq( min( y)- dy/2, max(y)+ dy/2, length.out = length(y) +1) xline( xtemp, col="grey", lwd=2) yline( ytemp, col="grey", lwd=2) ############################################################### #### example using an irregular quadrilateral grid ############################################################### data( RCMexample) image.plot( RCMexample$x, RCMexample$y, RCMexample$z[,,1]) ind<- 50:75 # make a smaller image to show bordering lines image.plot( RCMexample$x[ind,ind], RCMexample$y[ind,ind], RCMexample$z[ind,ind,1], border="grey50", lwd=2) ############################################################### #### multiple images with a common legend ############################################################### set.panel() # Here is quick but quirky way to add a common legend to several plots. # The idea is leave some room in the margin and then at the end # overplot the legend in this margin par(oma=c( 0,0,0,4)) # margin of 4 spaces width at right hand side set.panel( 2,2) # 2X2 matrix of plots # now draw all your plots using usual image command for ( k in 1:4){ data<- matrix( rnorm(150), 10,15) image( data, zlim=c(-4,4), col=tim.colors()) # and just for fun add a contour plot contour( data, add=TRUE) } par(oma=c( 0,0,0,1))# reset margin to be much smaller. image.plot( legend.only=TRUE, zlim=c(-4,4)) # image.plot tricked into plotting in margin of old setting set.panel() # reset plotting device # # Here is a more learned strategy to add a common legend to a panel of # plots consult the split.screen help file for more explanations. # For this example we draw two # images top and bottom and add a single legend color bar on the right side # first divide screen into the figure region (left) and legend region (right) split.screen( rbind(c(0, .8,0,1), c(.8,1,0,1))) # now subdivide up the figure region into two parts split.screen(c(2,1), screen=1)-> ind zr<- range( 2,35) # first image screen( ind[1]) image( x,y,z, col=tim.colors(), zlim=zr) # second image screen( ind[2]) image( x,y,z+10, col=tim.colors(), zlim =zr) # move to skinny region on right and draw the legend strip screen( 2) image.plot( zlim=zr,legend.only=TRUE, smallplot=c(.1,.2, .3,.7), col=tim.colors()) close.screen( all=TRUE) # you can always add a legend arbitrarily to any plot; # note that here the plot is too big for the vertical strip but the # horizontal fits nicely. plot( 1:10, 1:10) image.plot( zlim=c(0,25), legend.only=TRUE) image.plot( zlim=c(0,25), legend.only=TRUE, horizontal =TRUE) # combining the usual image function and adding a legend # first change margin for some more room \dontrun{ par( mar=c(10,5,5,5)) image( x,y,z, col=topo.colors(64)) image.plot( zlim=c(0,25), nlevel=64,legend.only=TRUE, horizontal=TRUE, col=topo.colors(64)) } # # adding a legend by automatically making room. # and coloring points info<- setupLegend() colTab<- rainbow(10) plot( 201:210, 201:210, col=colTab, pch=16) addLegend(info, col=colTab, zlim = c(201,210)) # ####################################################### ##### Comparison to ggplot ####################################################### # the following example was created as way avoid doing more important # things # Note how close base graphics can get to reproducing the ggplot style. \dontrun{ library( viridis) library(ggplot2) x<- 1:20 y<- 1:24 z<- outer( x, y, "+") # ggplot version mesh<- expand.grid( x= x, y=y) mesh$z <- c(z) ggplot( data=mesh, aes( x=x, y=y, fill=z)) + geom_raster(interpolate= FALSE) + scale_fill_continuous(type = "viridis") + theme_bw() # inflate range to give a margin around image xr<- range(x) + c(-.08, .08)* diff( range(x)) yr<- range(y) + c(-.08, .08)* diff( range(y)) # changing these graphics parameters tends to push # text closer to the axes. par( mgp=c(1.5,.5,0),mar=c(2.5,2.5,.5,1), cex=.8) image.plot(x,y,z, col = viridis(128), legend.shrink = .27, xlim = xr, ylim = yr, legend.width = 1.5, legend.mar = 3, legend.args = list( text = "z", cex = .8, side = 3, line = .5) ) } } \keyword{hplot} % docclass is function fields/man/Krig.engine.default.Rd0000644000176200001440000002235514275214115016356 0ustar liggesusers%# %# fields is a package for analysis of spatial data written for %# the R software environment. %# Copyright (C) 2022 Colorado School of Mines %# 1500 Illinois St., Golden, CO 80401 %# Contact: Douglas Nychka, douglasnychka@gmail.edu, %# %# This program is free software; you can redistribute it and/or modify %# it under the terms of the GNU General Public License as published by %# the Free Software Foundation; either version 2 of the License, or %# (at your option) any later version. %# This program is distributed in the hope that it will be useful, %# but WITHOUT ANY WARRANTY; without even the implied warranty of %# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the %# GNU General Public License for more details. %# %# You should have received a copy of the GNU General Public License %# along with the R software environment if not, write to the Free Software %# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA %# or see http://www.r-project.org/Licenses/GPL-2 %##END HEADER %##END HEADER \name{The Engines:} \alias{Krig.engine.default} \alias{Krig.engine.fixed} \alias{Krig.coef} \alias{Krig.check.xY} \alias{Krig.transform.xY} \alias{Krig.make.u} \alias{Krig.make.W} \alias{Krig.make.Wi} \alias{\%d*\%} \title{ Basic linear algebra utilities and other computations supporting the Krig function. } \description{ These are internal functions to Krig that compute the basic matrix decompositions or solve the linear systems needed to evaluate the Krig/Tps estimate. Others listed below do some simple housekeeping and formatting. Typically they are called from within Krig but can also be used directly if passed a Krig object list. } \usage{ Krig.engine.default(out, verbose = FALSE) Krig.engine.fixed( out, verbose=FALSE, lambda=NA) Krig.coef(out, lambda = out$lambda, y = NULL, yM = NULL, verbose = FALSE) Krig.make.u(out, y = NULL, yM = NULL, verbose = FALSE) Krig.check.xY(x, Y,Z, weights, na.rm, verbose = FALSE) Krig.transform.xY(obj, knots, verbose = FALSE) Krig.make.W( out, verbose=FALSE) Krig.make.Wi ( out, verbose=FALSE) } \arguments{ \item{out}{ A complete or partial Krig object. If partial it must have all the information accumulated to this calling point within the Krig function. } \item{obj}{Same as \code{out}. } \item{verbose}{If TRUE prints out intermediate results for debugging.} \item{lambda}{Value of smoothing parameter "hard wired" into decompositions. Default is NA, i.e. use the value in \code{out\$lambda}. } \item{y}{New y vector for recomputing coefficients. OR for \%d*\% a vector or matrix. } \item{yM}{New y vector for recomputing coefficients but the values have already been collapsed into replicate group means.} \item{Y}{raw data Y vector} \item{x}{raw x matrix of spatial locations OR In the case of \%d*\%, y is either a matrix or a vector. As a vector, y, is interpreted to be the elements of a digaonal matrix. } \item{weights}{ Raw \code{weights} vector passed to Krig} \item{Z}{ Raw vector or matrix of additional covariates.} \item{na.rm}{ NA action logical values passed to Krig} \item{knots}{Raw \code{knots} matrix passed to Krig} } \details{ ENGINES: The engines are the code modules that handle the basic linear algebra needed to computed the estimated curve or surface coefficients. All the engine work on the data that has been reduced to unique locations and possibly replicate group means with the weights adjusted accordingly. All information needed for the decomposition are components in the Krig object passed to these functions. \code{Krig.engine.default} finds the decompositions for a Universal Kriging estimator by simultaneously diagonalizing the linear system system for the coefficients of the estimator. The main advantage of this form is that it is fairly stable numerically, even with ill-conditioned covariance matrices with lambda > 0. (i.e. provided there is a "nugget" or measure measurement error. Also the eigendecomposition allows for rapid evaluation of the likelihood, GCV and coefficients for new data vectors under different values of the smoothing parameter, lambda. \code{Krig.engine.knots} This code has been omitted from verisions >= 12.0. See 11.6 too recover this functionality. \strong{Finds the decompositions in the case that the covariance is evaluated at arbitrary locations possibly different than the data locations (called knots). The intent of these decompositions is to facilitate the evaluation at different values for lambda. } \code{Krig.engine.fixed} are specific decomposition based on the Cholesky factorization assuming that the smoothing parameter is fixed. This is the only case that works in the sparse matrix. Both knots and the full set of locations can be handled by this case. The difference between the "knots" engine above is that only a single value of lambda is considered in the fixed engine. OTHER FUNCTIONS: \code{Krig.coef} Computes the "c" and "d" coefficients to represent the estimated curve. These coefficients are used by the predict functions for evaluations. Krig.coef can be used outside of the call to Krig to recompute the fit with different Y values and possibly with different lambda values. If new y values are not passed to this function then the yM vector in the Krig object is used. The internal function \code{Krig.ynew} sorts out the logic of what to do and use based on the passed arguments. \code{Krig.make.u} Computes the "u" vector, a transformation of the collapsed observations that allows for rapid evaluation of the GCV function and prediction. This only makes sense when the decomposition is WBW or DR, i.e. an eigen decomposition. If the decompostion is the Cholesky based then this function returns NA for the u component in the list. \code{Krig.check.xY} Checks for removes missing values (NAs). \code{Krig.cor.Y} This code has been omitted from verisions >= 12.0. See 11.6 too recover this functionality. \code{Krig.transform.xY} Finds all replicates and collapse to unique locations and mean response and pooled variances and weights. These are the xM, yM and weightsM used in the engines. Also scales the x locations and the knots according to the transformation. \code{Krig.make.W} and \code{Krig.make.Wi} These functions create an off-diagonal weight matrix and its symmetric square root or the inverse of the weight matrix based on the information passed to Krig. If \code{out$nondiag} is TRUE W is constructed based on a call to the passed function wght.function along with additional arguments. If this flag is FALSE then W is just \code{diag(out$weightsM)} and the square root and inverse are computed directly. \code{\%d*\%} Is a simple way to implement efficient diagonal multiplications. x\%d*\%y is interpreted to mean diag(x)\%*\% y if x is a vector. If x is a matrix then this becomes the same as the usual matrix multiplication. } \section{Returned Values}{ ENGINES: The returned value is a list with the matrix decompositions and other information. These are incorporated into the complete Krig object. Common to all engines: \describe{ \item{decomp}{Type of decomposition} \item{nt}{dimension of T matrix} \item{np}{number of knots} } \code{Krig.engine.default}: \describe{ \item{u}{Transformed data using eigenvectors.} \item{D}{Eigenvalues} \item{G}{Reduced and weighted matrix of the eigenvectors} \item{qr.T}{QR decomposition of fixed regression matrix} \item{V}{The eigenvectors} } \code{Krig.engine.fixed}: \describe{ \item{d}{estimated coefficients for the fixed part of model} \item{c}{estimated coefficients for the basis functions derived from the covariance function.} } Using all data locations \describe{ \item{qr.VT}{QR decomposition of the inverse Cholesky factor times the T matrix. } \item{MC}{Cholesky factor} } Using knot locations \describe{ \item{qr.Treg}{QR decomposition of regression matrix modified by the estimate of the nonparametric ( or spatial) component.} \item{lambda.fixed}{Value of lambda used in the decompositions} } OTHER FUNCTIONS: \code{Krig.coef} \describe{ \item{yM}{Y values as replicate group means} \item{tauHat.rep}{Sample standard deviation of replicates} \item{tauHat.pure.error}{Same as tauHat.rep} \item{pure.ss}{Pure error sums of squares based on replicates} \item{c}{The "c" basis coefficients associated with the covariance or radial basis functions.} \item{d}{The "d" regression type coefficients that are from the fixed part of the model or the linear null space.} \item{u}{When the default decomposition is used the data vector transformed by the orthogonal matrices. This facilitates evaluating the GCV function at different values of the smoothing parameter.} } \code{Krig.make.W} \describe{ \item{W}{The weight matrix} \item{W2}{ Symmetric square root of weight matrix} } \code{Krig.make.Wi} \describe{ \item{ Wi}{The inverse weight matrix} \item{W2i}{ Symmetric square root of inverse weight matrix} } } \author{Doug Nychka } \seealso{ \code{\link{Krig}}, \code{\link{Tps}} } \examples{ Krig( ChicagoO3$x, ChicagoO3$y, aRange=100)-> out Krig.engine.default( out)-> stuff # compare "stuff" to components in out$matrices look1<- Krig.coef( out) look1$c # compare to out$c look2<- Krig.coef( out, yM = ChicagoO3$y) look2$c # better be the same even though we pass as new data! } \keyword{ spatial } fields/man/image2lz.Rd0000644000176200001440000001467514275214115014313 0ustar liggesusers%# %# fields is a package for analysis of spatial data written for %# the R software environment. %# Copyright (C) 2022 Colorado School of Mines %# 1500 Illinois St., Golden, CO 80401 %# Contact: Douglas Nychka, douglasnychka@gmail.edu, %# %# This program is free software; you can redistribute it and/or modify %# it under the terms of the GNU General Public License as published by %# the Free Software Foundation; either version 2 of the License, or %# (at your option) any later version. %# This program is distributed in the hope that it will be useful, %# but WITHOUT ANY WARRANTY; without even the implied warranty of %# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the %# GNU General Public License for more details. %# %# You should have received a copy of the GNU General Public License %# along with the R software environment if not, write to the Free Software %# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA %# or see http://www.r-project.org/Licenses/GPL-2 %##END HEADER %##END HEADER \name{image2lz} \alias{image2lz} \alias{crop.image} \alias{in.poly} \alias{in.poly.grid} \alias{half.image} \alias{get.rectangle} \alias{average.image} \alias{which.max.matrix} \alias{which.max.image} \title{Some simple functions for subsetting images} \description{These function help in subsetting images or reducing its size by averaging adjecent cells.} \usage{ crop.image(obj, loc=NULL,...) which.max.matrix(z) which.max.image(obj) get.rectangle() average.image(obj, Q=2) half.image(obj) in.poly( xd, xp, convex.hull=FALSE, inflation=1e-07) in.poly.grid( grid.list,xp, convex.hull=FALSE, inflation=1e-07) } \arguments{ \item{obj}{A list in image format with the usual x,y defining the grid and z a matrix of image values.} \item{loc}{A 2 column matrix of locations within the image region that define the subset. If not specified then the image is plotted and the rectangle can be specified interactively.} \item{Q}{Number of pixels to average.} \item{xd}{ A 2 column matrix of locations that are the points to check for being inside a polygon.} \item{xp}{ A 2 column matrix of locations that are vertices of a polygon. The last point is assumed to be connected to the first.} \item{convex.hull}{If TRUE then the convex hull of \code{xp} is used instead of the polygon.} \item{grid.list}{A list with components x and y specifing the 2-d grid values. (See help( grid.list) for more details.)} \item{inflation}{A small expansion factor to insure that points precisely on the boundaries and vertices of the convex hull are included as members.} \item{z}{ A matrix of numerical values} \item{\dots}{ Graphics arguments passed to image.plot. This is only relevant when loc is NULL and the locator function is called via \code{get.rectangle}. } } \details{ If \code{loc} has more than 2 rows then the largest rectangle containing the locations is used. \describe{ \item{crop.image}{Creates a subset of the image \code{obj} by taking using the largest rectangle in the locations \code{loc}. This is useful if one needs to extract a image that is no bigger in extant than som edata location. If locations are omitted the parent image is plotted and the locations from two mouse clicks on the image. Returned value is an image with appropriate \code{x,y} and \code{z} components.} \item{get.rectangle}{Given an image plots and waits for two mouse clicks that are returned.} \item{which.max.image}{Returns a list with components \code{x, y, z} , and \code{ind} giving the location of the maximun and value of the maximum in the image based on the grid values and also on the indicies of the image matrix.} \item{average.image, half.image}{Takes passed image and averages the pixel values and adjusts the grid to create an image that has a smaller number of elements. If \code{Q=2} in \code{average.image} it has the same effect as \code{half.image} but might be slower -- if the original image is mXn then half image will be an image (m/2)X(n/2). This begs the question what happens when m or n is odd or when (m/Q) or (n/Q) are not integers. In either case the largest rows or columns are dropped. (For large \code{Q} the function might be modified to drop about half the pixels at both edges.) } \item{in.poly, in.poly.grid}{Determines whether the points xd,yd are inside a polygon or outside. Return value is a logical vector with TRUE being inside or on boundary of polygon. The test expands the polygon slightly in size (on the order of single precision zero) to include points that are at the vertices. \code{in.poly} does not really depend on an image format however the grid version \code{in.poly.grid} is more efficient for considering the locations on a regular grid See also \code{in.land.grid} that is hard coded to work with the fields world map.} } } \author{Doug Nychka} \seealso{ drape.plot, image.plot, interp.surface, interp.surface.grid, in.land.grid} \examples{ data(RMelevation) # region defining Colorado Front Range loc<- rbind( c(-106.5, 40.8), c(-103.9, 37.5)) # extract elevations for just CO frontrange. FR<- crop.image(RMelevation, loc) image.plot( FR, col=terrain.colors(256)) which.max.image( FR) # average cells 4 to 1 by doing this twice! temp<- half.image( RMelevation) temp<- half.image( temp) # or in one step temp<- average.image( RMelevation, Q=4)-> temp image.plot( temp, col=terrain.colors(256)) # a polygon (no special meaning entered with just locator) x1p<- c( -106.2017, -104.2418, -102.9182, -102.8163, -102.8927, -103.3254, -104.7763, -106.5581, -108.2889, -109.1035, -109.3325, -108.7980) x2p<- c( 43.02978, 42.80732, 41.89727, 40.84566, 39.81427, 38.17618, 36.53810, 36.29542, 36.90211, 38.29752, 39.45025, 41.02767) xp<- cbind( x1p,x2p) image.plot( temp) polygon( xp[,1], xp[,2], lwd=2) # find all grid points inside poly fullset<- make.surface.grid( list( x= temp$x, y= temp$y)) ind<- in.poly( fullset,xp) # take a look plot( fullset, pch=".") polygon( xp[,1], xp[,2], lwd=2) points( fullset[ind,], pch="o", col="red", cex=.5) # masking out the image NA == white in the image plot temp$z[!ind] <- NA image.plot( temp) polygon( xp[,1], xp[,2], lwd=2) # This is more efficient for large grids: # because the large number of grid location ( xg above) is # never explicitly created. ind<- in.poly.grid( list( x= temp$x, y= temp$y), xp) # now use ind in the same way as above to mask points outside of polygon } \keyword{ hplot }% at least one, from doc/KEYWORDS fields/man/NorthAmericanRainfall.Rd0000644000176200001440000000741614275214115016777 0ustar liggesusers%# %# fields is a package for analysis of spatial data written for %# the R software environment. %# Copyright (C) 2022 Colorado School of Mines %# 1500 Illinois St., Golden, CO 80401 %# Contact: Douglas Nychka, douglasnychka@gmail.edu, %# %# This program is free software; you can redistribute it and/or modify %# it under the terms of the GNU General Public License as published by %# the Free Software Foundation; either version 2 of the License, or %# (at your option) any later version. %# This program is distributed in the hope that it will be useful, %# but WITHOUT ANY WARRANTY; without even the implied warranty of %# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the %# GNU General Public License for more details. %# %# You should have received a copy of the GNU General Public License %# along with the R software environment if not, write to the Free Software %# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA %# or see http://www.r-project.org/Licenses/GPL-2 %##END HEADER %##END HEADER \name{NorthAmericanRainfall} \alias{NorthAmericanRainfall} \docType{data} \title{ Observed North American summer precipitation from the historical climate network. } \description{ Average rainfall in tenths of millimeters for the months of June, July and August for the period 1950-2010. Data is based on 1720 stations located in North America. } %\usage{data(NorthAmericanRainfall)} \format{ The format is a list with components: "longitude" "latitude" "precip" "elevation" "precipSE" "trend" "trendSE" "type" "x.s" "sProjection" with elevation in meters, longitude as (-180,180), latitude as (-90, 90) and precipitaion in 1/10 mm ( precip/254 converts to inches of rainfall) \code{precip} is the intercept for 1980.5 when a straight line least squares regression is fit to each station's record. SE is the companion standard error from the least squares fit. If the station is complete, then \code{precip} and \code{precipSE} will just be the mean and standard deviation adjusted for a linear trend. The estimated trend \code{trend} and and its standard error \code{trendSE} are also included. Also due to the centering, for complete data the intercept and trend estimate will be uncorrelated. The component \code{type} indicates whether the station has been "adjusted" (see below) or is still in "unadjusted" form. \code{x.s} is a useful transformation of locations into stereographic coordinates that reduces the inflation of North Canada due to the usual lon/lat coordinates. Specifically it is found by: \preformatted{ library(mapproj) xStereo<- mapproject( NorthAmericanRainfall$lon,NorthAmericanRainfall$lat, projection="stereographic") NorthAmericanRainfall$x.s<- cbind( xStereo$x, xStereo$y) NorthAmericanRainfall$projection<- .Last.projection } Use \code{NorthAmericanRainfall$orientation} to access the stereographic projection orientation. } \source{ The monthly data used to construct this summary was generously provided by Xuebin Zhang, however, the orignal source is freely available as the Global Historical Climate Network Version 2 Precipitation quality controlled, curated and served by the US National Center for Environmental Information. The adjusted data from this archive has been modified from its raw form to make the record more homogenous. Heterogenities can come from a variety of sources such as a moving the station a short distance or changes in instruments. See the National Centers for Envrionmental Information then Access Data and then GHCN. } \examples{ data(NorthAmericanRainfall) x<- cbind(NorthAmericanRainfall$longitude, NorthAmericanRainfall$latitude) y<- NorthAmericanRainfall$precip quilt.plot( x,y) world( add=TRUE) Zstat<- NorthAmericanRainfall$trend / NorthAmericanRainfall$trendSE quilt.plot( x, Zstat) } \keyword{datasets} fields/man/bplot.Rd0000644000176200001440000001113414275214115013704 0ustar liggesusers%# %# fields is a package for analysis of spatial data written for %# the R software environment. %# Copyright (C) 2022 Colorado School of Mines %# 1500 Illinois St., Golden, CO 80401 %# Contact: Douglas Nychka, douglasnychka@gmail.edu, %# %# This program is free software; you can redistribute it and/or modify %# it under the terms of the GNU General Public License as published by %# the Free Software Foundation; either version 2 of the License, or %# (at your option) any later version. %# This program is distributed in the hope that it will be useful, %# but WITHOUT ANY WARRANTY; without even the implied warranty of %# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the %# GNU General Public License for more details. %# %# You should have received a copy of the GNU General Public License %# along with the R software environment if not, write to the Free Software %# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA %# or see http://www.r-project.org/Licenses/GPL-2 %##END HEADER %##END HEADER \name{bplot} \alias{bplot} \title{ boxplot } \description{ Plots boxplots of several groups of data and allows for placement at different horizontal or vertical positions or colors. It is also flexible in the input object, accepting either a list or matrix. } \usage{ bplot(x, by, pos=NULL, at = pos, add = FALSE, boxwex = 0.8,xlim=NULL, ...) } \arguments{ \item{x}{ Vector, matrix, list or data frame. A vector may be divided according to the by argument. Matrices and data frames are separated by columns and lists by components. } \item{by}{ If x is a vector, an optional vector (either character or numerical) specifying the categories to divide x into separate data sets. Boxplots are then made for each group. } \item{pos}{ The boxplots will be plotted vertically (horizontally) and pos gives the x (y) locations for their centers. If omitted the boxes are equally spaced at integer values. This is the same as \code{at} in the \code{boxplot} function } \item{at}{Same as \code{pos} this is the name for this argument in the standard \code{boxplot} function.} \item{add}{ If true, do not create a new plots just add the boxplots to a current plot. Note that the pos argument may be useful in this case and should be in the user coordinates of the parent plot.} \item{boxwex}{A boxplot argument to control the width of the boxplot. It behaves a little different than as an argumetn passed directly to \code{boxplot}. To make this a general function it is useful to scale this according to size of positions. Within bplot this happens as \code{boxwex<- boxwex* min(diff( sort( at)))}. and then the scaled version of \code{boxwex} is now passed to \code{boxplot}.} \item{xlim}{ Same as the usual argument used in plotting. The plotting limits for the x axis. } \item{\dots}{ Other arguments to be passed to the boxplot function some handy favorites are: \code{names} Labels for each boxplot. \code{horizontal}If TRUE draw boxplots horizontally the default is false, produce vertical box plots. \code{lwd}Width(s) of lines in box plots. \code{col}Color(s) of bplots. See \code{colors()} for some choices.} } \details{ This function was created as a complement to the usual S/R function for boxplots. The current function makes it possible to put the boxplots at unequal x or y positions in a rational way using the \code{at} or \code{pos} arguments. This is useful for visually grouping a large set of boxplots into several groups. Also placement of the boxplots with respect to the axis can add information to the plot. Another aspect is the emphasis on data structures for groups of data. One useful feature is the by option to break up the x vector into distinct groups. Use \code{axis(3)} (\code{axis(4)}) to add an axis along the top (right side) or omit the category names and draw on the bottom \code{axis(1)} (left side \code{axis(2)}). The older \code{bplot} function drew the boxplots from scratch and if one needs to do this refer to the old functions: \code{ describe.bplot, draw.bplot.obj, bplot.xy, bplot.obj} Finally to bin data into groups based on a continuous variable and to make bplots of each group see \code{bplot.xy}. } \seealso{ bplot.xy } \examples{ # set.seed(123) temp<- matrix( rnorm(12*8), ncol=12) pos<- c(1:6,9, 12:16)*100 bplot(temp) # par(las=2) bplot( temp, pos=pos, names=paste( "Data",1:12, sep="")) # add an axis along top for reference axis(3) # # Xmas boxplots in pleasing red and green bplot( temp, pos=pos, col=c("red4", "green4")) # add an axis on top axis( 3) } \keyword{hplot} % docclass is function % Converted by Sd2Rd version 1.21. fields/man/FORTRAN.internal.Rd0000644000176200001440000000513214275214115015513 0ustar liggesusers%# %# fields is a package for analysis of spatial data written for %# the R software environment. %# Copyright (C) 2022 Colorado School of Mines %# 1500 Illinois St., Golden, CO 80401 %# Contact: Douglas Nychka, douglasnychka@gmail.edu, %# %# This program is free software; you can redistribute it and/or modify %# it under the terms of the GNU General Public License as published by %# the Free Software Foundation; either version 2 of the License, or %# (at your option) any later version. %# This program is distributed in the hope that it will be useful, %# but WITHOUT ANY WARRANTY; without even the implied warranty of %# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the %# GNU General Public License for more details. %# %# You should have received a copy of the GNU General Public License %# along with the R software environment if not, write to the Free Software %# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA %# or see http://www.r-project.org/Licenses/GPL-2 %##END HEADER %##END HEADER \name{fields exported FORTRAN} \alias{css} \alias{ddfind} \alias{dmaket} \alias{evlpoly} \alias{evlpoly2} \alias{igpoly} \alias{inpoly} \alias{multeb} \alias{multrb} \alias{radbas} \alias{rcss} \title{ FORTRAN subroutines used in fields functions } \description{ These functions implement cubic smoothing splines and also provide some basic computations for radial basis functions. All are called using the \code{.FORTRAN} interface. } \details{ For these low level FORTRAN subroutines refer to the R functions for the calling sequence and to the src subdirectory of the fields pacakage for the source code. \describe{ \item{css}{Cubic smoothing spline see \code{sreg} and \code{splint}} \item{ddfind}{Finds nearest neighbor points within a fixed distance. See \code{fields.rdist.near}} \item{dmaket}{Creates matrix of all polynomial terms up to fixed order. See \code{fields.mkpoly}} \item{evlpoly}{evaluates a univariate polynomial. See code{fields.evlpoly}} \item{evlpoly2}{ evaluates a multivariate polynomial. See code{fields.evlpoly2}} \item{inpoly}{Determine which 2-d locations are within a polynomial. see \code{in.poly}} \item{igpoly}{Determine which 2-d grid points locations are within a polynomial. see \code{in.poly.grid}} \item{multeb}{Multiply an exponential cross covariance matrix by another matrix. See \code{exp.cov}} \item{multrb}{Multiply an radial basis function matrix by another matrix. See \code{rad.cov}} \item{radbas}{Evaluates radial basis functions. See \code{rdist.R}} \item{rcss}{Robust cubic smoothing spline. See \code{qsreg}} } } \keyword{internal} fields/man/surface.Krig.Rd0000644000176200001440000001001014453612450015101 0ustar liggesusers%# %# fields is a package for analysis of spatial data written for %# the R software environment. %# Copyright (C) 2022 Colorado School of Mines %# 1500 Illinois St., Golden, CO 80401 %# Contact: Douglas Nychka, douglasnychka@gmail.edu, %# %# This program is free software; you can redistribute it and/or modify %# it under the terms of the GNU General Public License as published by %# the Free Software Foundation; either version 2 of the License, or %# (at your option) any later version. %# This program is distributed in the hope that it will be useful, %# but WITHOUT ANY WARRANTY; without even the implied warranty of %# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the %# GNU General Public License for more details. %# %# You should have received a copy of the GNU General Public License %# along with the R software environment if not, write to the Free Software %# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA %# or see http://www.r-project.org/Licenses/GPL-2 %##END HEADER %##END HEADER \name{surface.Krig} \alias{surface.Krig} \alias{surface.mKrig} \title{ Plots a surface and contours } \description{ Creates different plots of the fitted surface of a Krig object. This is a quick way to look at the fitted function over reasonable default ranges. } \usage{ \method{surface}{Krig}(object, grid.list = NULL, extrap = FALSE, graphics.reset = NULL, xlab = NULL, ylab = NULL, main = NULL, zlab = NULL, zlim = NULL, levels = NULL, type = "C", nx = 80, ny = 80, col = viridisLite::viridis(256), ...) \method{surface}{mKrig}( object, grid.list = NULL, extrap = FALSE, graphics.reset = NULL, xlab = NULL, ylab = NULL, main = NULL, zlab = NULL, zlim = NULL, levels = NULL, type = "C", nx = 80, ny = 80, col = viridisLite::viridis(256), ...) } \arguments{ \item{object}{ A Krig object or an mKrig object. } \item{grid.list}{ A list with as many components as variables describing the surface. All components should have a single value except the two that give the grid points for evaluation. If the matrix or data frame has column names, these must appear in the grid list. If grid.list is missing an the surface has just two dimensions the grid is based on the ranges of the observed data. } \item{extrap}{ Extrapolation beyond the range of the data. If false only the convex hull of the observations is plotted. Default is false. } \item{graphics.reset}{ Reset to original graphics parameters after function plotting. } \item{type}{ Type of plot as a character. "p" perspective plot (persp). "c" contour plot (contour). "b" a two panel figure with perspective and contour plots. "I" image plot with legend strip (image.plot). "C" image plot with contours overlaid. Image with contour is the default. } \item{main}{ Title of plot} \item{xlab}{ x axis label} \item{ylab}{ y axis label} \item{zlab}{ z axis label if "p" or "b" type is used.} \item{zlim}{ Z limits passed to persp} \item{levels}{ Contour levels passed to contour. } \item{nx}{ Number of grid points to evaluate surface on the horizontal axis (the x-axis). } \item{ny}{ Number of grid points to evaluate surface on the vertical axis (the y-axis). } \item{col}{Color scale.} \item{\dots}{ Any other plotting options. } } \details{ This function is essentially a combination of predictSurface and plot.surface. It may not always give a great rendition but is easy to use for checking the fitted surface. The default of extrap=F is designed to discourage looking at the estimated surface outside the range of the observations. NOTE: that any Z covariates will b edropped and only the spatial part of the model will be evaluated. } \seealso{ \code{\link{Krig}} predictSurface, plot.surface, image.plot } \examples{ fit<- Krig(ChicagoO3$x,ChicagoO3$y, aRange=30) # krig fit #Image plot of surface with nice, smooth contours and shading surface(fit, type="C", nx=128, ny=128) } \keyword{spatial} % docclass is function % Converted by Sd2Rd version 1.21. fields/man/supportsArg.Rd0000644000176200001440000000566114275214115015125 0ustar liggesusers%# %# fields is a package for analysis of spatial data written for %# the R software environment. %# Copyright (C) 2022 Colorado School of Mines %# 1500 Illinois St., Golden, CO 80401 %# Contact: Douglas Nychka, douglasnychka@gmail.edu, %# %# This program is free software; you can redistribute it and/or modify %# it under the terms of the GNU General Public License as published by %# the Free Software Foundation; either version 2 of the License, or %# (at your option) any later version. %# This program is distributed in the hope that it will be useful, %# but WITHOUT ANY WARRANTY; without even the implied warranty of %# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the %# GNU General Public License for more details. %# %# You should have received a copy of the GNU General Public License %# along with the R software environment if not, write to the Free Software %# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA %# or see http://www.r-project.org/Licenses/GPL-2 %##END HEADER %##END HEADER \name{supportsArg} \alias{supportsArg} %- Also NEED an '\alias' for EACH other topic documented here. \title{ Tests if function supports a given argument } \description{ %% ~~ A concise (1-5 lines) description of what the function does. ~~ Tests if the given function supports the given argument. Commonly used in fields code for determining if a covariance function supports precomputation of the distance matrix and evaluation of the covariance matrix over only the upper triangle. } \usage{ supportsArg(fun=stationary.cov, arg) } %- maybe also 'usage' for other objects documented here. \arguments{ \item{fun}{ The function tested for support for whether it supports the argument \code{arg} as input } \item{arg}{ The argument to check if \code{fun} supports using as input } } \details{ Currently only \code{stationary.cov} and \code{Exp.cov} support evaluation of the covariance matrix over the upper triangle (and diagonal) only via the onlyUpper argument and distance matrix precomputation via the distMat argument. } \value{ A logical indicating whether the given function supports use of the given argument } \author{ %% ~~who you are~~ John Paige } %% ~Make other sections like Warning with \section{Warning }{....} ~ \seealso{ %% ~~objects to See Also as \code{\link{help}}, ~~~ \code{\link{stationary.cov}}, \code{\link{Exp.cov}} These covariance functions have the \code{onlyUpper} option allowing the user to evaluate the covariance matrix over the upper triangle and diagonal only and to pass a precomputed distance matrix } \examples{ ################ #Test covariance function to see if it supports evaluation of #covariance matrix over upper triangle only ################ supportsArg(Rad.cov, "distMat") supportsArg(Rad.cov, "onlyUpper") supportsArg(stationary.cov, "distMat") supportsArg(stationary.cov, "onlyUpper") supportsArg(Exp.cov, "distMat") supportsArg(Exp.cov, "onlyUpper") } fields/man/glacier.Rd0000644000176200001440000001157714275214115014205 0ustar liggesusers%# %# fields is a package for analysis of spatial data written for %# the R software environment. %# Copyright (C) 2022 Colorado School of Mines %# 1500 Illinois St., Golden, CO 80401 %# Contact: Douglas Nychka, douglasnychka@gmail.edu, %# %# This program is free software; you can redistribute it and/or modify %# it under the terms of the GNU General Public License as published by %# the Free Software Foundation; either version 2 of the License, or %# (at your option) any later version. %# This program is distributed in the hope that it will be useful, %# but WITHOUT ANY WARRANTY; without even the implied warranty of %# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the %# GNU General Public License for more details. %# %# You should have received a copy of the GNU General Public License %# along with the R software environment if not, write to the Free Software %# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA %# or see http://www.r-project.org/Licenses/GPL-2 %##END HEADER %##END HEADER \name{glacier} \alias{glacier} \docType{data} \title{Franke's Glacier Elevation Data} \description{ A moderate size (about 8400 locations) spatial dataset that is well-known in the applied mathematics approximation literature for testing interpolation methods. } \usage{data(glacier)} \format{ The format of \code{glacier} is a list with two components: \describe{ \item{loc:}{8338x2 matrix of the locations (meters??).} \item{y:}{A vector of elevations (meters ??).} } } \details{ This data set appears in papers that develop interpolation methods for scattered data and serves as an interesting bridge to the examples in applied math that develop radial basis function surface fitting. The data was originally used by R. Franke. Unfortunately at this time we can not find any background on where these data were collected or indeed even the location of this glacier. However, it is an interesting data set in that it appears that the elevations are reported along lnes of equal elevation, i.e. contours, perhaps from a digitization of a topographic map or survey. It is important to estimate the surface in a way that the artifacts from discretization are not present. In the example below the compactly supported kernel interpolation still has some artifacts. The glacier data set is available at this website \url{https://oleg-davydov.de/scat_data.html} The examples below are useful for comparing different approximations to a Gaussian spatial process estimate for the elevation surface. Of course in using a stationary covariance ( e.g. the Matern or Wendland) these are also radial basis smoothing or interpolation of the data. } \examples{ data( glacier ) # EDA for raw obs: bubblePlot( glacier$loc, glacier$y, highlight=FALSE, size=.5) # identifying contour levels. Note this is reported at regular levels # (Every 25m ???) table( glacier$y) # find sigma and rho by maximum likelihood # for a fixed range # the default is the Wendland covariance with k=2 # See help(Wendland) # this takes about 5 minutes # macbook pro Quad-Core Intel Core i5 8 GB #options(spam.nearestdistnnz=c(5e7,1e3)) #system.time( # obj0<- fastTps(glacier$loc, glacier$y, # theta=2, # profileLambda=TRUE) #) # set.panel(2,2) # plot( obj0) # set.panel() # just evaluate at MLE # reset default matrix size that the spam pacakge will use. \dontrun{ options(spam.nearestdistnnz=c(5e7,1e3)) system.time( obj1<- fastTps(glacier$loc, glacier$y, theta=2, lambda= 7.58e-5 ) ) system.time( look1<- predictSurface( obj1, nx=150, ny=150) ) imagePlot( look1) system.time( out<- simLocal.spatialProcess(obj1, M=3, nx=150, ny=150) ) set.panel( 2,2) imagePlot( look1) zlim<- range( out$z, na.rm=TRUE) for( k in 1:3){ imagePlot(out$x, out$y, out$z[,,k], zlim=zlim) } # near interpolation surface using Matern smoothness .5 system.time( obj2<- spatialProcess(glacier$loc, glacier$y, aRange = 1.5, lambda = 1e-5, smoothness = .5) ) system.time( out<- simLocal.spatialProcess(obj2, M=3, nx=150, ny=150, fast=TRUE) ) set.panel( 2,2) imagePlot( look1) zlim<- range( out$z, na.rm=TRUE) for( k in 1:3){ imagePlot(out$x, out$y, out$z[,,k], zlim=zlim) } % test out fast predict algorithm verses exact % note speedup of about 15 times system.time( look2<- predictSurface.mKrig( obj2, nx=150, ny=150, fast=TRUE, NNSize=5) ) system.time( look2B<- predictSurface( obj2, nx=150, ny=150, fast=FALSE) ) err<- c((look2$z - look2B$z)/look2B$z) stats( log10( abs(err) ) ) # some error plots ( percent relative error) imagePlot(look2$x, look2$y, 100*(look2$z - look2B$z)/look2B$z ) imagePlot(look2$x, look2$y, 100*(look1$z - look2B$z)/look2B$z ) } % end do not run } % end examples \keyword{datasets} fields/man/offGridWeights.Rd0000644000176200001440000002052714275214115015505 0ustar liggesusers%# %# fields is a package for analysis of spatial data written for %# the R software environment. %# Copyright (C) 2022 Colorado School of Mines %# 1500 Illinois St., Golden, CO 80401 %# Contact: Douglas Nychka, douglasnychka@gmail.edu, %# %# This program is free software; you can redistribute it and/or modify %# it under the terms of the GNU General Public License as published by %# the Free Software Foundation; either version 2 of the License, or %# (at your option) any later version. %# This program is distributed in the hope that it will be useful, %# but WITHOUT ANY WARRANTY; without even the implied warranty of %# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the %# GNU General Public License for more details. %# %# You should have received a copy of the GNU General Public License %# along with the R software environment if not, write to the Free Software %# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA %# or see http://www.r-project.org/Licenses/GPL-2 %##END HEADER %##END HEADER \name{offGridWeights} \alias{offGridWeights} \alias{addMarginsGridList} \alias{mKrigFastPredictSetup} \alias{offGridWeights1D} \alias{offGridWeights2D} \title{ Utilities for fast spatial prediction. } \description{ Based on a stationary Gaussian process model these functions support fast prediction onto a grid using a sparse matrix approximation. They also allow for fast prediction to off-grid values (aka interpoltation) from an equally spaced rectangular grid and using a spatial model. The sparsity comes about because only a fixed number of neighboring grid points (NNSize) are used in the prediction. The prediction variance for off-grid location is also give in the returned object. These function are used as the basis for approximate conditional simulation for large spatial datasets asnd also for fast spatial prediction from irregular locations onto a grid. } \usage{ offGridWeights(s, gridList, np = 2, mKrigObject = NULL, Covariance = NULL, covArgs = NULL, aRange = NULL, sigma2 = NULL, giveWarnings = TRUE, debug=FALSE) offGridWeights1D(s, gridList, np = 2, mKrigObject = NULL, Covariance = NULL, covArgs = NULL, aRange = NULL, sigma2 = NULL, giveWarnings = TRUE, debug=FALSE) offGridWeights2D(s, gridList, np = 2, mKrigObject = NULL, Covariance = NULL, covArgs = NULL, aRange = NULL, sigma2 = NULL, giveWarnings = TRUE, debug=FALSE) addMarginsGridList( xObs, gridList, NNSize) mKrigFastPredictSetup(mKrigObject, gridList, NNSize, giveWarnings = TRUE) } \arguments{ \item{s}{ Off grid spatial locations } \item{xObs}{ Off grid spatial locations} \item{gridList}{ A list as the gridList format ( x and y components) that describes the rectagular grid. The grid must have at least np extra grid points beyond the range of the points in \code{s} } \item{np}{ Number of nearest neighbor grid points to use for prediction. \code{np = 1} will use the 4 grid points that bound the off grid point. \code{np = 2} will be a 4X4 subgrid with the middle grid box containing the off grid point. In general there will be \code{(2*np)^2} neighboring points uses. } \item{NNSize}{Same as \code{np}. } \item{mKrigObject}{ The output object (Aka a list with some specfic components.) from either mKrig or spatialProcess. This has the information about the covariance function used to do the Kriging. The following items are coded in place of not supplying this object. See the example below for more details. } \item{Covariance}{ The stationary covariance function (taking pairwise distances as its first argument.) } \item{covArgs}{ If \code{mKrigObject} is not specified a list giving any additional arguments for the covariance function. } \item{aRange}{ The range parameter. } \item{sigma2}{ Marginal variance of the process. } \item{giveWarnings}{If TRUE will warn if two or more observations are in the same grid box. See details below.} \item{debug}{If TRUE returns intermediate calculations and structures for debugging and checking.} } \details{ This function creates the interpolation weights taking advantage of some efficiency in the covariance function being stationary, use of a fixed configuration of nearest neighbors, and Kriging predictions from a rectangular grid. The returned matrix is in spam sparse matrix format. See example below for the "one-liner" to make the prediction once the weights are computed. Although created primarily for conditional simulation of a spatial process this function is also useful for interpolating to off grid locations from a rectangular field. The function \code{offGridWeights} is a simple wrapper to call either the 1D or 2D functions In most cases one would not use these approximations for a 1D problem. However, the 1D algorithm is included as a separate function for testing and also because this is easier to read and understand the conversion between the Kriging weights for each point and the sparse matrix encoding of them. The interpolation errors are also computed based on the nearest neighbor predictions. This is returned as a sparse matrix in the component SE. If all observations are in different grid boxes then \code{SE} is diagonal and agrees with the square root of the component \code{predctionVariance} but if multiple observations are in the same grid box then SE has blocks of upper triangular matrices that can be used to simulate the prediction error dependence among observations in the same grid box. Explicitly if \code{obj} is the output object and there are \code{nObs} observations then \preformatted{error <- obj$SE\%*\% rnorm( nObs)} will simulate a prediction error that includes the dependence. Note that in the case that there all observations are in separate grid boxes this code line is the same as \preformatted{error <- sqrt(obj$predictionVariance)*rnorm( nObs)} It is always true that the prediction variance is given by \code{ diag( obj$SE\%*\% t( obj$SE))}. The user is also referred to the testing scripts \code{offGridWeights.test.R} and \code{offGridWeights.testNEW.R}in \code{tests} where the Kriging predictions and standard errors are computed explicitly and tested against the sparse matrix computation. This is helpful in defining exactly what is being computed. } \value{ \item{B}{A sparse matrix that is of dimension mXn with m the number of locations (rows) in \code{s} and n being the total number of grid points. \code{n = length(gridList$x)*length(gridList$y) } } \item{predictionVariance}{A vector of length as the rows of \code{s} with the Kriging prediction variance based on the nearest neighbor prediction and the specified covariance function. } \item{SE}{A sparse matrix that can be used to simulate dependence among prediction errors for observations in the same grid box. (See explanation above.)} } \references{ Bailey, Maggie D., Soutir Bandyopadhyay, and Douglas Nychka. "Adapting conditional simulation using circulant embedding for irregularly spaced spatial data." Stat 11.1 (2022): e446. } \author{ Douglas Nychka and Maggie Bailey } \seealso{ \link{interp.surface} , \link{mKrigFastPredict} } \examples{ # an M by M grid M<- 400 xGrid<- seq( -1, 1, length.out=M) gridList<- list( x= xGrid, y= xGrid ) np<- 3 n<- 100 # sample n locations but avoid margins set.seed(123) s<- matrix( runif(n*2, xGrid[(np+1)],xGrid[(M-np)]), n, 2 ) obj<- offGridWeights( s, gridList, np=3, Covariance="Matern", aRange = .1, sigma2= 1.0, covArgs= list( smoothness=1.0) ) # make the predictions by obj$B%*%c(y) # where y is the matrix of values on the grid # try it out on a simulated Matern field CEobj<- circulantEmbeddingSetup( gridList, cov.args=list( Covariance="Matern", aRange = .1, smoothness=1.0) ) set.seed( 333) Z<- circulantEmbedding(CEobj) # # Note that grid values are "unrolled" as a vector # for multiplication # predOffGrid<- obj$B%*% c( Z) predOffGrid<- obj$B\%*\% c( Z) set.panel( 1,2) zr<- range( c(Z)) image.plot(gridList$x, gridList$y, Z, zlim=zr) bubblePlot( s[,1],s[,2], z= predOffGrid , size=.5, highlight=FALSE, zlim=zr) set.panel() } \keyword{spatial} fields/man/Krig.Rd0000644000176200001440000005025514275214115013467 0ustar liggesusers%# %# fields is a package for analysis of spatial data written for %# the R software environment. %# Copyright (C) 2022 Colorado School of Mines %# 1500 Illinois St., Golden, CO 80401 %# Contact: Douglas Nychka, douglasnychka@gmail.edu, %# %# This program is free software; you can redistribute it and/or modify %# it under the terms of the GNU General Public License as published by %# the Free Software Foundation; either version 2 of the License, or %# (at your option) any later version. %# This program is distributed in the hope that it will be useful, %# but WITHOUT ANY WARRANTY; without even the implied warranty of %# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the %# GNU General Public License for more details. %# %# You should have received a copy of the GNU General Public License %# along with the R software environment if not, write to the Free Software %# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA %# or see http://www.r-project.org/Licenses/GPL-2 %##END HEADER %##END HEADER \name{Krig} \alias{Krig} \alias{resid.Krig} \alias{fitted.Krig} \alias{coef.Krig} \title{ Kriging surface estimate } \description{ Fits a surface to irregularly spaced data. The Kriging model assumes that the unknown function is a realization of a Gaussian random spatial processes. The assumed model is additive Y = P(x) + Z(X) + e, where P is a low order polynomial and Z is a mean zero, Gaussian stochastic process with a covariance that is unknown up to a scale constant. The main advantages of this function are the flexibility in specifying the covariance as an R language function and also the supporting functions plot, predict, predictSE, surface for subsequent analysis. Krig also supports a correlation model where the mean and marginal variances are supplied. } \usage{ Krig(x, Y, cov.function = "stationary.cov", lambda = NA, df = NA, GCV = FALSE, Z = NULL, cost = 1, weights = NULL, m = 2, nstep.cv = 200, scale.type = "user", x.center = rep(0, ncol(x)), x.scale = rep(1, ncol(x)), sigma = NA, tau2 = NA, method = "REML", verbose = FALSE, null.function = "Krig.null.function", wght.function = NULL, offset = 0, na.rm = TRUE, cov.args = NULL, chol.args = NULL, null.args = NULL, wght.args = NULL, W = NULL, give.warnings = TRUE, mean.obj = NA, sd.obj = NA, ...) \method{fitted}{Krig}(object,...) \method{coef}{Krig}(object,...) resid.Krig(object,...) } \arguments{ \item{chol.args}{ Arguments to be passed to the cholesky decomposition in Krig.engine.fixed. The default if NULL, assigned at the top level of this function, is list( pivot=FALSE). This argument is useful when working with the sparse matrix package. } \item{cov.args}{ A list with the arguments to call the covariance function. (in addition to the locations) } \item{cov.function}{ Covariance function for data in the form of an R function (see Exp.simple.cov as an example). Default assumes that correlation is an exponential function of distance. See also \code{stationary.cov} for more general choice of covariance shapes. \code{exponential.cov} will be faster if only the exponential covariance form is needed. } \item{cost}{ Cost value used in GCV criterion. Corresponds to a penalty for increased number of parameters. The default is 1.0 and corresponds to the usual GCV function. } \item{df}{ The effective number of parameters for the fitted surface. Conversely, N- df, where N is the total number of observations is the degrees of freedom associated with the residuals. This is an alternative to specifying lambda and much more interpretable. NOTE: GCV argument defaults to TRUE if this argument is used. } \item{GCV}{ If TRUE matrix decompositions are done to allow estimating lambda by GCV or REML and specifying smoothness by the effective degrees of freedom. So the GCV switch does more than just supply a GCV estimate. Also if lambda or df are passed the estimate will be evaluated at those values, not at the GCV/REML estimates of lambda. If FALSE Kriging estimate is found under a fixed lambda model. } \item{give.warnings}{ If TRUE warnings are given in gcv grid search limits. If FALSE warnings are not given. Best to leave this TRUE! This argument is set ot FALSE if warn is less than zero in the top level, R options function. See options()$warn} \item{lambda}{ Smoothing parameter that is the ratio of the error variance (tau**2) to the scale parameter of the covariance function (sigma). If omitted this is estimated by GCV ( see method below). } \item{method}{ Determines what "smoothing" parameter should be used. The default is to estimate standard GCV Other choices are: GCV.model, GCV.one, RMSE, pure error and REML. The differences are explained below. } \item{mean.obj}{ Object to predict the mean of the spatial process. This used in when fitting a correlation model with varying spatial means and varying marginal variances. (See details.) } \item{m}{ A polynomial function of degree (m-1) will be included in the model as the drift (or spatial trend) component. The "m" notation is from thin-plate splines where m is the derivative in the penalty function. With m=2 as the default a linear model in the locations will be fit a fixed part of the model. } \item{na.rm}{If TRUE NAs will be removed from the \code{y} vector and the corresponding rows of \code{x} -- with a warning. If FALSE Krig will just stop with a message. Once NAs are removed all subsequent analysis in fields does not use those data. } \item{nstep.cv}{ Number of grid points for the coarse grid search to minimize the GCV RMLE and other related criteria for finding lambda, the smoothing parameter. Default is 200, fairly large to avoid some cases of closely spaced local minima. Evaluations of the GCV and related objective functions are cheap given the matrix decompositions described below. } \item{null.args}{ Extra arguments for the null space function \code{null.function}. If \code{fields.mkpoly} is passed as \code{null.function} then this is set to a list with the value of \code{m}. So the default is use a polynomial of degree m-1 for the null space (fixed part) of the model. } \item{null.function}{ An R function that creates the matrices for the null space model. The default is fields.mkpoly, an R function that creates a polynomial regression matrix with all terms up to degree m-1. (See Details) } \item{offset}{ The offset to be used in the GCV criterion. Default is 0. This would be used when Krig is part of a backfitting algorithm and the offset is other model degrees of freedom from other regression components. } \item{sigma}{ Scale factor for covariance. } \item{scale.type}{ This is a character string among: "range", "unit.sd", "user", "unscaled". The independent variables and knots are scaled to the specified scale.type. By default no scaling is done. This usuall makes sense for spatial locations. Scale type of "range" scales the data to the interval (0,1) by forming (x-min(x))/range(x) for each x. Scale type of "unit.sd" Scale type of "user" allows specification of an x.center and x.scale by the user. The default for "user" is mean 0 and standard deviation 1. Scale type of "unscaled" does not scale the data. } \item{sd.obj}{ Object to predict the marginal standard deviation of the spatial process. } \item{tau2}{ Variance of the errors, often called the nugget variance. If weights are specified then the error variance is tau2 divided by weights. Note that lambda is defined as the ratio tau2/sigma. } \item{verbose}{ If true will print out all kinds of intermediate stuff. Default is false, of course as this is used mainly for debugging. } \item{weights}{ Weights are proportional to the reciprocal variance of the measurement error. The default is equal weighting i.e. vector of unit weights. } \item{wght.function}{ An R function that creates a weights matrix to the observations. This is only needed if the weight matirx has off diagonal elements. The default is NULL indicating that the weight matrix is a diagonal, based on the weights argument. (See details) } \item{W}{The observation weight matrix.} \item{wght.args}{ Optional arguments to be passed to the weight function (wght.function) used to create the observation weight matrix.} \item{x}{ Matrix of independent variables. These could the locations for spatial data or the indepedent variables in a regression. } \item{x.center}{ Centering values to be subtracted from each column of the x matrix. } \item{x.scale}{ Scale values that are divided into each column after centering. } \item{Y}{ Vector of dependent variables. These are the values of the surface (perhaps with measurement error) at the locations or the dependent response in a regression. } \item{Z}{ A vector of matrix of covariates to be include in the fixed part of the model. If NULL (default) no addtional covariates are included.} \item{\dots}{ Optional arguments that appear are assumed to be additional arguments to the covariance function. Or are included in methods functions (resid, fitted, coef) as a required argument.} \item{object}{ A Krig object} } \value{ A object of class Krig. This includes the predicted values in fitted.values and the residuals in residuals. The results of the grid search to minimize the generalized cross validation function are returned in gcv.grid. The coef.Krig function only returns the coefficients, "d", associated with the fixed part of the model (also known as the null space or spatial drift). \item{call}{ Call to the function } \item{y}{ Vector of dependent variables. } \item{x}{ Matrix of independent variables. } \item{weights}{ Vector of weights. } \item{knots}{ Locations used to define the basis functions. } \item{transform}{ List of components used in centering and scaling data. } \item{np}{ Total number of parameters in the model. } \item{nt}{ Number of parameters in the null space. } \item{matrices}{ List of matrices from the decompositions (D, G, u, X, qr.T). } \item{gcv.grid}{ Matrix of values from the GCV grid search. The first column is the grid of lambda values used in the search, the second column is the trace of the A matrix, the third column is the GCV values and the fourth column is the estimated value of tau conditional on the vlaue of lambda. } \item{lambda.est}{ A table of estimated smoothing parameters with corresponding degrees of freedom and estimates of tau found by different methods. } \item{cost}{ Cost value used in GCV criterion. } \item{m}{ Order of the polynomial space: highest degree polynomial is (m-1). This is a fixed part of the surface often referred to as the drift or spatial trend. } \item{eff.df}{ Effective degrees of freedom of the model. } \item{fitted.values}{ Predicted values from the fit. } \item{residuals}{ Residuals from the fit. } \item{lambda}{ Value of the smoothing parameter used in the fit. Lambda is defined as tau**2/sigma. See discussion in details. } \item{yname}{ Name of the response. } \item{cov.function}{ Covariance function of the model. } \item{beta}{ Estimated coefficients in the ridge regression format } \item{d}{ Estimated coefficients for the polynomial basis functions that span the null space } \item{fitted.values.null}{ Fitted values for just the polynomial part of the estimate } \item{trace}{ Effective number of parameters in model. } \item{c}{ Estimated coefficients for the basis functions derived from the covariance. } \item{coefficients}{ Same as the beta vector. } \item{just.solve}{ Logical describing if the data has been interpolated using the basis functions. } \item{tauHat}{ Estimated standard deviation of the measurement error (nugget effect). } \item{tau2}{ Estimated variance of the measurement error (tauHat**2). } \item{sigma}{ Scale factor for covariance. COV(h(x),h(x\code{)) = sigma*cov.function(x,x}) If the covariance is actually a correlation function then sigma is also the "sill". } \item{mean.var}{ Normalization of the covariance function used to find sigma. } \item{best.model}{ Vector containing the value of lambda, the estimated variance of the measurement error and the scale factor for covariance used in the fit. } } \details{ This function produces a object of class Krig. With this object it is easy to subsequently predict with this fitted surface, find standard errors, alter the y data ( but not x), etc. The Kriging model is: Y.k= f(x.k) = P(x.k) + Z(x.k) + e.k where ".k" means subscripted by k, Y is the dependent variable observed at location x.k, P is a low order polynomial, Z is a mean zero, Gaussian field with covariance function K and e is assumed to be independent normal errors. The estimated surface is the best linear unbiased estimate (BLUE) of f(x)= P(x) + Z(x) given the observed data. For this estimate K, is taken to be sigma*cov.function and the errors have variance tau**2. In more conventional geostatistical terms sigma is the "sill" if the covariance function is actually a correlation function and tau**2 is the nugget variance or measure error variance (the two are confounded in this model.) If the weights are given then the variance of e.k is tau**2/ weights.k . In the case that the weights are specified as a matrix, W, using the wght.function option then the assumed covariance matrix for the errors is tau**2 Wi, where Wi is the inverse of W. It is straightforward to show that the estimate of f only depends on tau and sigma through the ratio lambda = tau**2/ sigma. This parameter, termed the smoothing parameter plays a central role in the statistical computations within \code{Krig}. See also the help for thin plate splines, (\code{Tps}) to get another perspective on the smoothing parameter. This function also supports a modest extension of the Generalized Kriging model to include other covariates as fixed regression type components. In matrix form Y = Zb + F + E where Z is a matrix of covariates and b a fixed parameter vector, F the vector of function values at the observations and E a vector of errors. The The \code{Z} argument in the function is the way to specify this additional component. If the parameters sigma and tau2 are omitted in the call, then they are estimated in the following way. If lambda is given, then tau2 is estimated from the residual sum of squares divided by the degrees of freedom associated with the residuals. Rho is found as the difference between the sums of squares of the predicted values having subtracted off the polynomial part and tau2. These estimates are the MLE's under Gaussian assumptions on the process and errors. If lambda is also omitted is it estimated from the data using a variety of approaches and then the values for tau and sigma are found in the same way from the estimated lambda. A useful extension of a stationary correlation to a nonstationary covariance is what we term a correlation model. If mean and marginal standard deviation objects are included in the call. Then the observed data is standardized based on these functions. The spatial process is then estimated with respect to the standardized scale. However for predictions and standard errors the mean and standard deviation surfaces are used to produce results in the original scale of the observations. The GCV function has several alternative definitions when replicate observations are present or if one uses a reduced set knots. Here are the choices based on the method argument: GCV: leave-one-out GCV. But if there are replicates it is leave one group out. (Wendy and Doug prefer this one.) GCV.one: Really leave-one-out GCV even if there are replicate points. This what the old tps function used in FUNFITS. rmse: Match the estimate of tau**2 to a external value ( called rmse) pure error: Match the estimate of tau**2 to the estimate based on replicated data (pure error estimate in ANOVA language). GCV.model: Only considers the residual sums of squares explained by the basis functions. REML: The process and errors are assumed to the Gaussian and the likelihood is concentrated (or profiled) with respect to lambda. The MLE of lambda is found from this criterion. Restricted means that the likelihood is formed from a linear transformation of the observations that is orthogonal to the column space of P(x). WARNING: The covariance functions often have a nonlinear parameter(s) that often control the strength of the correlations as a function of separation, usually referred to as the range parameter. This parameter must be specified in the call to Krig and will not be estimated. } \section{References}{ See "Additive Models" by Hastie and Tibshirani, "Spatial Statistics" by Cressie and the FIELDS manual. } \seealso{ summary.Krig, predict.Krig, predictSE.Krig, predictSurfaceSE, predictSurface, plot.Krig, surface.Krig } \examples{ # a 2-d example # fitting a surface to ozone # measurements. Exponential covariance, range parameter is 20 (in miles) fit <- Krig(ChicagoO3$x, ChicagoO3$y, aRange=20) summary( fit) # summary of fit set.panel( 2,2) plot(fit) # four diagnostic plots of fit set.panel() surface( fit, type="C") # look at the surface # predict at data predict( fit) # predict using 7.5 effective degrees of freedom: predict( fit, df=7.5) # predict on a grid ( grid chosen here by defaults) out<- predictSurface( fit) surface( out, type="C") # option "C" our favorite # predict at arbitrary points (10,-10) and (20, 15) xnew<- rbind( c( 10, -10), c( 20, 15)) predict( fit, xnew) # standard errors of prediction based on covariance model. predictSE( fit, xnew) # surface of standard errors on a default grid predictSurfaceSE( fit)-> out.p # this takes some time! surface( out.p, type="C") points( fit$x) \dontrun{ # Using another stationary covariance. # smoothness is the shape parameter for the Matern. fit <- Krig(ChicagoO3$x, ChicagoO3$y, Covariance="Matern", aRange=10, smoothness=1.0) summary( fit) # # Roll your own: creating very simple user defined Gaussian covariance # test.cov <- function(x1,x2,aRange,marginal=FALSE,C=NA){ # return marginal variance if( marginal) { return(rep( 1, nrow( x1)))} # find cross covariance matrix temp<- exp(-(rdist(x1,x2)/aRange)**2) if( is.na(C[1])){ return( temp)} else{ return( temp\%*\%C)} } # # use this and put in quadratic polynomial fixed function fit.flame<- Krig(flame$x, flame$y, cov.function="test.cov", m=3, aRange=.5) # # note how range parameter is passed to Krig. # BTW: GCV indicates an interpolating model (nugget variance is zero) # This is the content of the warning message. # take a look ... surface(fit.flame, type="I") } # # Thin plate spline fit to ozone data using the radial # basis function as a generalized covariance function # # p=2 is the power in the radial basis function (with a log term added for # even dimensions) # If m is the degree of derivative in penalty then p=2m-d # where d is the dimension of x. p must be greater than 0. # In the example below p = 2*2 - 2 = 2 # out<- Krig( ChicagoO3$x, ChicagoO3$y,cov.function="Rad.cov", m=2,p=2,scale.type="range") # See also the Fields function Tps # out should be identical to Tps( ChicagoO3$x, ChicagoO3$y) # \dontrun{ # # # explore some different values for the range and lambda using GCV data(ozone2) aRange <- seq(200,600,,40) GCV<- matrix( NA, 40,80) # the loop for( k in 1:40){ # call to Krig with different ranges # also turn off warnings for GCV search # to avoid lots of messages. (not recommended in general!) obj<-Krig( ozone2$lon.lat,ozone2$y[16,], cov.function="stationary.cov", aRange=aRange[k], Covariance="Matern",smoothness=1.0, Distance="rdist.earth", nstep.cv=80, give.warnings=FALSE, na.rm=TRUE) GCV[k,]<-obj$gcv.grid[,3] } # get lambda grid from looping k<- 1 lam<- Krig( ozone2$lon.lat,ozone2$y[16,], cov.function="stationary.cov", aRange=aRange[k], Covariance="Matern",smoothness=.5, Distance="rdist.earth", nstep.cv=80, give.warnings=FALSE, na.rm=TRUE)$gcv.grid[,1] matplot( log10(lam), t(GCV),type="l",lty=1) } } \keyword{spatial} % docclass is function fields/man/arrow.plot.Rd0000644000176200001440000001004014275214115014666 0ustar liggesusers%# %# fields is a package for analysis of spatial data written for %# the R software environment. %# Copyright (C) 2022 Colorado School of Mines %# 1500 Illinois St., Golden, CO 80401 %# Contact: Douglas Nychka, douglasnychka@gmail.edu, %# %# This program is free software; you can redistribute it and/or modify %# it under the terms of the GNU General Public License as published by %# the Free Software Foundation; either version 2 of the License, or %# (at your option) any later version. %# This program is distributed in the hope that it will be useful, %# but WITHOUT ANY WARRANTY; without even the implied warranty of %# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the %# GNU General Public License for more details. %# %# You should have received a copy of the GNU General Public License %# along with the R software environment if not, write to the Free Software %# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA %# or see http://www.r-project.org/Licenses/GPL-2 %##END HEADER %##END HEADER \name{arrow.plot} \alias{arrow.plot} \title{ Adds arrows to a plot } \description{ Adds arrows at specified points where the arrow lengths are scaled to fit on the plot in a reasonable manner. A classic use of this function is to depict a vector field. At each point (x,y) we have a vector with components (u,v). Like the arrows function this adds arrows to an existing plot. } \usage{ arrow.plot(a1, a2, u = NA, v = NA, arrow.ex = 0.05, xpd = TRUE, true.angle = FALSE, arrowfun=arrows,...) } \arguments{ \item{a1}{ The x locations of the tails of the arrows or a 2 column matrix giving the x and y coordinates of the arrow tails. } \item{a2}{ The y locations of the tails of the arrows or a 2 column matrix giving the u and v coordinates of the arrows. } \item{u}{ The u components of the direction vectors if they are not specified in the a1 argument } \item{v}{ The v components of the direction vectors if they are not specified in the a2 argument } \item{arrow.ex}{ Controls the length of the arrows. The length is in terms of the fraction of the shorter axis in the plot. So with a default of .05 20 arrows of maximum length can line up end to end along the shorter axis. } \item{xpd}{ If true does not clip arrows to fit inside the plot region, default is not to clip. } \item{true.angle}{ If true preserves the true angle of the (u,v) pair on the plot. E.g. if (u,v)=(1,1) then the arrow will be drawn at 45 degrees. } \item{arrowfun}{ The actual arrow function to use. The default is standard R \code{arrows}. However, Tamas K Papp suggests \code{p.arrows} from sfsmisc which makes prettier arrows. } \item{\dots}{ Graphics arguments passed to the arrows function that can can change the color or arrow sizes. See help on this for details. } } \details{ This function is useful because (u,v) may be in very different scales from the locations (x,y). So some careful scaling is needed to plot the arrows. The only tricky thing about this function is whether you want the true angles on the plot. For overlaying a vector field on top of contours that are the streamlines true.angle should be false. In this case you want u and v to be scaled in the same way as the x and y variables. If the scaling is not the same then the arrows will not look like tangent vectors to the streamlines. An application where the absolute angles are meaningful might be the hands of a clock showing different times zones on a world map. Here true.angle=T is appropriate, the clock hands should preserve the right angles. } \seealso{arrows} \examples{ # # 20 random directions at 20 random points x<- runif( 20) y<- runif( 20) u<- rnorm( 20) v<- rnorm( 20) plot( x,y) arrow.plot( x,y,u,v) # a default that is unattractive plot( x,y, type="n") arrow.plot( x,y,u,v, arrow.ex=.2, length=.1, col='green', lwd=2) # thicker lines in green, smaller heads and longer tails. Note length, col and lwd are # options that the arrows function itself knows about. } \keyword{aplot} % docclass is function % Converted by Sd2Rd version 1.21. fields/man/interp.surface.Rd0000644000176200001440000000752214275214115015522 0ustar liggesusers%# %# fields is a package for analysis of spatial data written for %# the R software environment. %# Copyright (C) 2022 Colorado School of Mines %# 1500 Illinois St., Golden, CO 80401 %# Contact: Douglas Nychka, douglasnychka@gmail.edu, %# %# This program is free software; you can redistribute it and/or modify %# it under the terms of the GNU General Public License as published by %# the Free Software Foundation; either version 2 of the License, or %# (at your option) any later version. %# This program is distributed in the hope that it will be useful, %# but WITHOUT ANY WARRANTY; without even the implied warranty of %# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the %# GNU General Public License for more details. %# %# You should have received a copy of the GNU General Public License %# along with the R software environment if not, write to the Free Software %# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA %# or see http://www.r-project.org/Licenses/GPL-2 %##END HEADER %##END HEADER \name{interp.surface} \alias{interp.surface} \alias{interp.surface.grid} \title{ Fast bilinear interpolator from a grid. } \description{ Uses bilinear weights to interpolate values on a rectangular grid to arbitrary locations or to another grid. } \usage{ interp.surface(obj, loc) interp.surface.grid(obj, grid.list) } \arguments{ \item{obj}{ A list with components x,y, and z in the same style as used by contour, persp, image etc. x and y are the X and Y grid values and z is a matrix with the corresponding values of the surface } \item{loc}{ A matrix of (irregular) locations to interpolate. First column of loc isthe X coordinates and second is the Y's. } \item{grid.list}{ A list with components x and y describing the grid to interpolate. The grids do not need to be equally spaced.} } \value{ An vector of interpolated values. NA are returned for regions of the z matrix that are NA and also for locations outside of the range of the parent grid. } \details{ Here is a brief explanation of the interpolation: Suppose that the location, (locx, locy) lies in between the first two grid points in both x an y. That is locx is between x1 and x2 and locy is between y1 and y2. Let ex= (l1-x1)/(x2-x1) ey= (l2-y1)/(y2-y1). The interpolant is ( 1-ex)(1-ey)*z11 + (1- ex)(ey)*z12 + ( ex)(1-ey)*z21 + ( ex)(ey)*z22 Where the z's are the corresponding elements of the Z matrix. Note that bilinear interpolation can produce some artifacts related to the grid and not reproduce higher behavior in the surface. For, example the extrema of the interpolated surface will always be at the parent grid locations. There is nothing special about about interpolating to another grid, this function just includes a \code{for} loop over one dimension and a call to the function for irregular locations. It was included in fields for convenience. since the grid format is so common. See also the akima package for fast interpolation from irrgeular locations. Many thanks to Jean-Olivier Irisson for making this code more efficient and concise. } \seealso{ image.smooth, as.surface, as.image, image.plot, krig.image,Tps } \examples{ # # evaluate an image at a finer grid # data( lennon) # create an example in the right list format like image or contour obj<- list( x= 1:20, y=1:20, z= lennon[ 201:220, 201:220]) set.seed( 123) # lots of random points N<- 500 loc<- cbind( runif(N)*20, runif(N)*20) z.new<- interp.surface( obj, loc) # compare the image with bilinear interpolation at scattered points set.panel(2,2) image.plot( obj) quilt.plot( loc, z.new) # sample at 100X100 equally spaced points on a grid grid.list<- list( x= seq( 1,20,,100), y= seq( 1,20,,100)) interp.surface.grid( obj, grid.list)-> look # take a look set.panel(2,2) image.plot( obj) image.plot( look) } \keyword{spatial} % docclass is function % Converted by Sd2Rd version 1.21. fields/man/US.dat.Rd0000644000176200001440000000253014275214115013662 0ustar liggesusers%# %# fields is a package for analysis of spatial data written for %# the R software environment. %# Copyright (C) 2022 Colorado School of Mines %# 1500 Illinois St., Golden, CO 80401 %# Contact: Douglas Nychka, douglasnychka@gmail.edu, %# %# This program is free software; you can redistribute it and/or modify %# it under the terms of the GNU General Public License as published by %# the Free Software Foundation; either version 2 of the License, or %# (at your option) any later version. %# This program is distributed in the hope that it will be useful, %# but WITHOUT ANY WARRANTY; without even the implied warranty of %# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the %# GNU General Public License for more details. %# %# You should have received a copy of the GNU General Public License %# along with the R software environment if not, write to the Free Software %# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA %# or see http://www.r-project.org/Licenses/GPL-2 %##END HEADER %##END HEADER \name{US.dat} \alias{US.dat} \title{ Outline of coterminous US and states. } \description{ This data set is used by the fields function US to draw a map. It is the medium resolution outline that is produced by drawing the US from the maps package. } \keyword{datasets} % docclass is data % Converted by Sd2Rd version 1.21. fields/man/plot.Krig.Rd0000644000176200001440000000677114275214115014450 0ustar liggesusers%# %# fields is a package for analysis of spatial data written for %# the R software environment. %# Copyright (C) 2022 Colorado School of Mines %# 1500 Illinois St., Golden, CO 80401 %# Contact: Douglas Nychka, douglasnychka@gmail.edu, %# %# This program is free software; you can redistribute it and/or modify %# it under the terms of the GNU General Public License as published by %# the Free Software Foundation; either version 2 of the License, or %# (at your option) any later version. %# This program is distributed in the hope that it will be useful, %# but WITHOUT ANY WARRANTY; without even the implied warranty of %# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the %# GNU General Public License for more details. %# %# You should have received a copy of the GNU General Public License %# along with the R software environment if not, write to the Free Software %# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA %# or see http://www.r-project.org/Licenses/GPL-2 %##END HEADER %##END HEADER \name{plot.Krig} \alias{plot.Krig} \alias{plot.sreg} \title{ Diagnostic and summary plots of a Kriging, spatialProcess or spline object. } \description{ Plots a series of four diagnostic plots that summarize the fit. } \usage{ \method{plot}{Krig}(x, digits=4, which= 1:4,...) \method{plot}{sreg}(x, digits = 4, which = 1:4, ...) } \arguments{ \item{x}{ A Krig or an sreg object} \item{digits}{ Number of significant digits for the RMSE label. } \item{which}{ A vector specifying by number which of the four plots to draw. 1:4 plots all four. } \item{\dots}{ Optional graphics arguments to pass to each plot. } } \details{ This function creates four summary plots of the Krig or sreg object. The default is to put these on separate pages. However if the screen is already divided in some other fashion the plots will just be added according to that scheme. This option is useful to compare to compare several different model fits. The first is a scatterplot of predicted value against observed. The second plot is "standardized" residuals against predicted value. Here we mean that the residuals are divided by the GCV estimate for tau and multiplied by the square root of any weights that have been specified. In the case of a "correlation model" the residuals are also divided by the marginal standard deviation from this model. The third plot are the values of the GCV function against the effective degrees of freedom. When there are replicate points several versions of the GCV function may be plotted. GCV function is with respect to the standardized data if a correlation model is specified. A vertical line indicates the minimium found. For \code{Krig} and \code{sreg} objects the fourth plot is a histogram of the standardized residuals. For sreg if multiple lambdas are given plotted are boxplots of the residuals for each fit. For \code{spatialProcess} object the fourth plot is the profile likelihood for the aRange parameter. Points are the actual evaluated log likelihoods and the dashed line is just a spline interpolation to help with visualization. } \seealso{ Krig, spatialProcess, summary.Krig, Tps, set.panel } \examples{ data( ozone2) x<- ozone2$lon.lat y<- ozone2$y[16,] fit1<-Krig(x,y, aRange=200) # fitting a surface to ozone # measurements set.panel( 2,2) plot(fit1) # fit rat data fit3<-sreg(rat.diet$t,rat.diet$con) set.panel(2,2) plot(fit3) set.panel(1,1) # reset graphics window. } \keyword{spatial} % docclass is function % Converted by Sd2Rd version 1.21. fields/man/vgram.matrix.Rd0000644000176200001440000001022514275214115015203 0ustar liggesusers%# %# fields is a package for analysis of spatial data written for %# the R software environment. %# Copyright (C) 2022 Colorado School of Mines %# 1500 Illinois St., Golden, CO 80401 %# Contact: Douglas Nychka, douglasnychka@gmail.edu, %# %# This program is free software; you can redistribute it and/or modify %# it under the terms of the GNU General Public License as published by %# the Free Software Foundation; either version 2 of the License, or %# (at your option) any later version. %# This program is distributed in the hope that it will be useful, %# but WITHOUT ANY WARRANTY; without even the implied warranty of %# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the %# GNU General Public License for more details. %# %# You should have received a copy of the GNU General Public License %# along with the R software environment if not, write to the Free Software %# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA %# or see http://www.r-project.org/Licenses/GPL-2 %##END HEADER %##END HEADER \name{vgram.matrix} \alias{vgram.matrix} \alias{plot.vgram.matrix} \title{ Computes a variogram from an image } \description{ Computes a variogram for an image taking into account different directions and returning summary information about the differences in each of these directions. } \usage{ vgram.matrix(dat, R = NULL, dx = NULL, dy = NULL) \method{plot}{vgram.matrix}(x,...) } \arguments{ \item{dat}{ Either a matrix spacing of rows and columns are assumed to have the same distance or a list in image format with components x, y and z. } \item{R}{ Maximum radius for finding variogram differences assuming that the grid points are spaced one unit a part. Default is go out to a radius of \code{5*max( c(dx, dy) )}. } \item{dx}{ The spacing of grid points on the X axis. This is used to calculate the correct distance between grid points. If dx is not equal to dy then the collapse argument must be FALSE. If an image object is passed and dx and dy are not specified they will be calculated from the x and y components of the image list. } \item{dy}{ The spacing of grid points on the Y axis. See additional notes for dx.} \item{x}{Returned object from vgram.matrix} \item{\dots}{ Arguments for image.plot} } \value{ An object of class vgram.matrix with the following components: d, a vector of distances for the differences, and vgram, the variogram values. This is the traditional variogram ignoring direction. d.full, a vector of distances for all possible shifts up distance R, ind, a two column matrix giving the x and y increment used to compute the shifts, and vgram.full, the variogram at each of these separations. Also computed is vgram.robust, Cressie's version of a robust variogram statistic. Also returned is the component N the number of differences found for each separation csae. } \details{ For the "full" case the statistics can summarize departures from isotropy by separating the variogram differences according to orientation. For small R this runs efficiently because the differences are found by sub-setting the image matrix. For example, suppose that a row of the ind matrix is (2,3). The variogram value associated with this row is the mean of the differences (1/2)*(X(i,j)- X( i+2,j+3))**2 for all i and j. (Here X(.,.) are the values for the spatial field.) In this example d= sqrt(13) and there will be another entry with the same distance but corresponding to the direction (3,2). plot.vgram.matrix attempts to organize all the different directions into a coherent image plot. } \seealso{ \code{\link{vgram}} } \examples{ # variogram for Lennon image. data(lennon) out<-vgram.matrix( lennon) plot( out$d, out$vgram, xlab="separation distance", ylab="variogram") # image plot of vgram values by direction. # look at different directions out<-vgram.matrix( lennon, R=8) plot( out$d, out$vgram) # add in different orientations points( out$d.full, out$vgram.full, col="red") #image plot of variogram values for different directions. set.panel(1,1) plot.vgram.matrix( out) # John Lennon appears remarkably isotropic! } \keyword{spatial} % docclass is function % Converted by Sd2Rd version 1.21. fields/man/spatialProcess.Rd0000644000176200001440000005360514342447601015574 0ustar liggesusers%# %# fields is a package for analysis of spatial data written for %# the R software environment. %# Copyright (C) 2022 Colorado School of Mines %# 1500 Illinois St., Golden, CO 80401 %# Contact: Douglas Nychka, douglasnychka@gmail.edu, %# %# This program is free software; you can redistribute it and/or modify %# it under the terms of the GNU General Public License as published by %# the Free Software Foundation; either version 2 of the License, or %# (at your option) any later version. %# This program is distributed in the hope that it will be useful, %# but WITHOUT ANY WARRANTY; without even the implied warranty of %# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the %# GNU General Public License for more details. %# %# You should have received a copy of the GNU General Public License %# along with the R software environment if not, write to the Free Software %# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA %# or see http://www.r-project.org/Licenses/GPL-2 %##END HEADER %##END HEADER \name{spatialProcess} \alias{spatialProcess} \alias{spatialProcessSetDefaults} \alias{plot.spatialProcess} \alias{print.spatialProcess} \alias{print.spatialProcessSummary} \alias{summary.spatialProcess} \alias{profileMLE} \alias{confidenceIntervalMLE} %- Also NEED an '\alias' for EACH other topic documented here. \title{ Estimates a spatial process model. %% ~~function to do ... ~~ } \description{ For a given covariance function estimates the covariance parameters by maximum likelihood and then evaluates the spatial model with these estimated parameters. The returned object can be used for spatial prediction, conditional simulation, and profiling the likelihood function. For fixed values of the covariance parameters this process estimate is also known as Kriging. %% ~~ A concise (1-5 lines) description of what the function does. ~~ } \usage{ spatialProcess(x, y, weights = rep(1, nrow(x)), Z = NULL, ZCommon=NULL, mKrig.args = NULL, cov.function = NULL, cov.args = NULL, parGrid = NULL, reltol = 1e-4, na.rm = TRUE, verbose = FALSE, REML = FALSE, cov.params.start = NULL, gridN = 5, profileLambda = FALSE, profileARange = FALSE, profileGridN = 15, gridARange = NULL, gridLambda = NULL, CILevel = .95, iseed = 303, collapseFixedEffect = TRUE, ...) \method{summary}{spatialProcess}(object, ...) \method{print}{spatialProcess}(x, digits = 4, ...) \method{print}{spatialProcessSummary}(x, digits = 4, ...) \method{plot}{spatialProcess}(x, digits = 4, which = 1:4, ...) spatialProcessSetDefaults(x, cov.function, cov.args, cov.params.start, parGrid, mKrig.args, extraArgs = NULL, gridN = 5, collapseFixedEffect = TRUE, verbose = FALSE) confidenceIntervalMLE( obj, CILevel, verbose=FALSE) profileMLE (obj, parName, parGrid=NULL, gridN=15, cov.params.start=NULL, GCV=FALSE, REML=FALSE, verbose=FALSE) } \arguments{ \item{x}{Observation locations} \item{y}{Observation values} \item{weights}{Weights for the error term (nugget) in units of reciprocal variance.} \item{Z}{A matrix of extra covariates for the fixed part of spatial model. E.g. elevation for fitting climate data over space. } \item{ZCommon}{ A matrix of extra covariates for the fixed part of spatial model that pertain to parameters that hold across all realizations. This covariates only makes sense for multiple realizations (i.e. y is a matrix with more than one column). } \item{CILevel}{Confidence level for intervals for the estimated parameters.} \item{collapseFixedEffect}{ If TRUE a single vector of parameters are found in the fixed part for all realizations. E.g. if the fixed part includes a linear function of the locations. The parmeters for the linear function are the same for all realizations. If FALSE parameters are estimated separately for each realization. This option only makes sense for multiple realizations of the field. I.e. y is a matrix with more than one column. } \item{cov.args}{ A list specifying parameters and other components of the covariance function. Default is not extra arguments required.] (But see the next item.). } \item{cov.function}{A character string giving the name of the covariance function for the spatial component. If NULL, the default, this is filled in as \code{stationary.cov} and then if \code{cov.args} is also NULL this is filled in as \code{ list(Covariance = "Matern", smoothness = 1.0)} by the spatialProcessSetDefaults function. } \item{cov.params.start}{ A list where the names are parameter names that appear in the covariance function. The values of each component are assumed to be the starting values when optimizing to find MLEs. If lambda does not appear as additional argument when calling spatialProcess it is added internally to this list with the starting value .5.} \item{digits}{Number of significant digits in printed summary} \item{extraArgs}{Extra arguments passed using the \dots device in R. Typically these are extra covariance parameters specified in \code{spatialProcess} and then passed to \code{spatialProcessSetDefaults} } \item{GCV}{A future argument not currently implemented. If TRUE will find parameters by minimizing an approximate generalized cross-validation function. } \item{gridARange}{A grid for profiling over the range parameter. If omitted, default is based on a grid of profileGridN points centered at the MLE. } \item{gridLambda}{A grid for profiling over lambda. } \item{gridN}{Number of grid points for intital fgrid search to find starting values. } \item{na.rm}{If TRUE NAs are removed from the data.} \item{mKrig.args}{Arguments as a list passed to the mKrig function. For example use mKrig.args=list( m = 1) to set the fixed part of the model to just a constant function , or 0 to omit any fixed part. (The default is m=2 a linear function, which is recommend for most data analysis.) See \code{\link{mKrig}} for more details. } \item{obj}{A spatialProcess object returned from the spatialProcess function.} \item{object}{ See \code{obj}.} \item{parGrid}{ A data frame with the values of covariance parameters to use as an initial grid search for starting values.} \item{parName}{Text string that is the name of the parameter to profile .} \item{profileARange}{If TRUE profile likelihood on aRange. Default is TRUE if aRange is omitted.} \item{profileGridN}{Number of grid points to use for profiling.} \item{profileLambda}{If TRUE profile likelihood on lambda. This takes extra time and is not necessary so the default is FALSE. } \item{reltol}{ Relative tolerance used in optim for convergence.} \item{REML}{ If TRUE the parameters are found by restricted maximum likelihood.} \item{verbose}{If TRUE print out intermediate information for debugging.} \item{iseed}{A seed to fix the random number stream used to compute the effective degrees of freedom using the random trace method. Setting this seed will not affect any random numnber generation outside this function. } \item{\dots}{ Any other arguments that will be passed to the \code{mKrig} function and interpreted as additional arguments to the covariance function. This is a lazy way of specifying these. E.g. \code{aRange =.1} will set the covariance argument aRange to .1. } \item{which}{The vector 1:4 or any subset of 1:4, giving the plots to draw. See the description of these plots below.} } \details{ This function makes many choices for the user in terms of defaults and it is important to be aware of these. The spatial model is Y.k= P(x.k) + Z(x.k)\%*\%beta2 + g(x.k) + e.k where ".k" means subscripted by k, Y.k is the dependent variable observed at location x.k. P is a low degree polynomial (default is a linear function in the spatial coordinates, m=2 ) and Z is a matrix of covariates (optional) that enter as a linear model the fixed part. g is a mean zero, Gaussian stochastic process with a marginal variance of sigma and a scale (or range) parameter, aRange. The measurement errors, e.k, are assumed to be uncorrelated, normally distributed with mean zero and standard deviation tau. If weights are supplied then the variance of e is assumed to be \code{tau^2/ weights}. The polynomial if specified and extra covariates define the fixed part of this spatial model and the coefficients are found by generalized least squares (GLS). Perhaps the most important aspect of this function is that the range parameter (aRange), nugget (tau**2) and process variance (sigma) parameters for the covariance are estimated by maximum likelihood and this is the model that is then used for spatial prediction. Geostatistics usually refers to tau^2 + sigma^2 as the "sill" and often these parameters are estimated by variogram fitting rather than maximum likelihood. To be consistent with spline models and to focus on the key part of model we reparametrize as lambda= tau**2/ sigma^2 and sigma. Thinking about h as the spatial signal and e as the noise 1/lambda can be interpreted as the "signal to noise " ratio in this spatial context.(See also the comparison with fitting the geoR model in the examples section.) For an isotropic covariance function, the likelihood and the cross-validation function can be concentrated to only depend on lambda and aRange and so in reporting the optimization of these two criterion we focus on this form of the parameters. Once lambda and aRange are found, the MLE for sigma has a closed form and of course then tau is then determined from lambda and sigma. The estimates of the coefficients for the fixed part of the model, determined by GLS, will also be the MLEs. Often the lambda parameter is difficult to interpret when covariates and a linear function of the coordinates is included and also when the range becomes large relative to the size of the spatial domain. For this reason it is convenient to report the effective degrees of freedom (also referred to trA in R code and the output summaries) associated with the predicted surface or curve. This measure has a one-to-one relationship with lambda and is easier to interpret. For example an eff degrees of freedom that is very small suggests that the surface is well represented by a low order polynomial. Degrees of freedom close to the number of locations indicates a surface that is close to interpolating the observations and suggests a small or zero value for the nugget variance. The default covariance model is assumed to follow a Matern with smoothness set to 1.0. This is implemented using the \code{stationary.cov} covariance that can take a argument for the form of the covariance, a sill and range parameters and possibly additional parameter might control the shape. See the example below how to switch to another model. (Note that the exponential is also part of the Matern family with smoothness set to .5. ) The parameter estimation is done by \code{MLESpatialProcess} and the returned list from this function is added to the Krig output object that is returned by this function. The estimate is a version of maximum likelihood where the observations are transformed to remove the fixed linear part of the model. If the user just wants to fix the range parameter aRange then \code{Krig} can be used. NOTE: The defaults for the \code{optim} function used in MLESpatialProcess are: \preformatted{ list(method = "BFGS", control=list(fnscale = -1, ndeps = rep(log(1.1),length(cov.params.start)+1), reltol = reltol, maxit = 20)) } There is always a hazard in providing a simple to use method that makes many default choices for the spatial model. As in any analysis be aware of these choices and try alternative models and parameter values to assess the robustness of your conclusions. Also examine the residuals to check the adequacy of the fit. See the examples below for some help in how to do this easily in fields. Also see quilt.plot to get an quick plot of a spatial field to discern obvious spatial patterns. \strong{summary} method forms a list of class \code{spatialProcessSummary} that has a subset of information from the output object and also creates a table of the estimates of the linear parameters in the fixed part of the model. With replicated fields there is an option to estimate different linear parameters for each field ( \code{ collapseFixedEffect = FALSE } ) and in this case a table is not created because there is more than one estimate. See (\code{Omega} and \code{fixedEffectsCov}) in the \code{mKrig} object to build the standard errors. \strong{plot} method provides potentially four diagnostic plots of the fit.Use the \code{which} to pick and choose among them or use \code{set.panel} to see them all. The third and fourth plots, however, are only available if the profile computations been done. If lambda is profiled (\code{lambdaProfile} is not \code{NULL} ) the third plot is the profile log likelihood for lambda and with the GCV function on a second vertical scale. This is based on the grid evaluations in the component \code{ lambdaProfile\$MLEProfileLambda} . The fourth plot is a profile log likelihood trace for aRange based on \code{ aRangeProfile\$MLEProfileLambda}. \strong{print} method prints the \code{spatialProcessSummary} object of the fit, adding some details and explanations. \strong{spatialProcessSetDefaults} This is a useful way to fill in defaults for the function in one place. The main choices are choosing the Matern family, smoothness and a default fixed model (aka spatial drift). The grids for profiling are also created if they have not been supplied. %% ~~ If necessary, more details than the description above ~~ } \value{ An object of classes \code{mKrig} and \code{SpatialProcess}. The difference from mKrig are some extra components. The more useful ones are listed below \strong{MLESummary} A named array that has the fixed and estimated parameters along with likelihood values and some optim info. \strong{profileSummaryLambda and profileSummaryARange} The output list from mKrigMLEGrid for searching over over a grid of lambda and aRange. \strong{CITable} Approximate confidence intervals based on the inverse hessian of the log likelihood function. \strong{MLEInfo} A list that has a full documentation of the maximization including all parameters and likelihood values that were tried by the optim function. \strong{InitialGridSearch} Results from initial grid search to get good starting values for lambda and/or aRange. } \author{ Doug Nychka%% ~~who you are~~ } \seealso{ \link{Tps}, \link{mKrigMLEGrid}, \link{mKrigMLEJoint}, \link{plot.Krig}, \link{predict.mKrig}, \link{predictSE.mKrig} } \examples{ data( ozone2) # x is a two column matrix where each row is a location in lon/lat # coordinates x<- ozone2$lon.lat # y is a vector of ozone measurements at day 16. Note some missing values. y<- ozone2$y[16,] # artifically reduce size of data for a quick example to pass CRAN ... x<- x[1:75,] y<- y[1:75] # lots of default choices made here -- see gridN to increase # the number of points in grid searches for MLEs # without specifying lambda or aRange both are found in a robust # way uses grid searches # profiling over lambda and aRange is not reuqired but completes the full # example. Omit this for a faster computation. obj<- spatialProcess( x, y, profileLambda=TRUE, profileARange=TRUE) # summary of model summary( obj) # diagnostic plots set.panel(2,2) plot(obj) # plot 1 data vs. predicted values # plot 2 residuals vs. predicted # plot 3 criteria to select the smoothing # parameter lambda = tau^2 / sigma # the x axis has log10 lambda # Note that here the GCV function is minimized # while the log profile likelihood is maximzed. # plot 4 the log profile likelihood used to # determine range parameter aRange. # set.panel() # predictions on a grid surface( obj, xlab="longitude", ylab="latitude") US( add=TRUE, col="grey", lwd=2) title("Predicted ozone (in PPB) June 18, 1987 ") #(see also predictSurface for more control on evaluation grid, predicting # outside convex hull of the data. and plotting) # prediction standard errors, note two steps now to generate # and then plot surface look<- predictSurfaceSE( obj) surface( look, xlab="longitude", ylab="latitude") points( x, col="magenta") title("prediction standard errors (PPB)") # here is a sanity check -- call spatialProcess with the MLEs found # above, better get the same predictions! objTest<- spatialProcess( x, y, lambda=obj$MLESummary["lambda"], aRange=obj$MLESummary["aRange"] ) test.for.zero(objTest$fitted.values, obj$fitted.values, tag="sanity check" ) \dontrun{ ################################## # working with covariates and filling in missing station data # using an ensemble method # see the example under help(sim.spatialProcess) to see how to # handle a conditional simulation on a grid of predictions with # covariates. data(COmonthlyMet) fit1E<- spatialProcess(CO.loc,CO.tmin.MAM.climate, Z=CO.elev, profileLambda=TRUE, profileARange=TRUE ) set.panel( 2,2) plot( fit1E) set.panel(1,2) # plots of the fitted surface and surface of prediction standard errors out.p<-predictSurface( fit1E,CO.Grid, ZGrid= CO.elevGrid, extrap=TRUE) imagePlot( out.p, col=larry.colors()) US(add=TRUE, col="grey") contour( CO.elevGrid, add=TRUE, levels=seq(1000,3000,,5), col="black") title("Average Spring daily min. temp in CO") out.p2<-predictSurfaceSE( fit1E,CO.Grid, ZGrid= CO.elevGrid, extrap=TRUE, verbose=FALSE) imagePlot( out.p2, col=larry.colors()) US(add=TRUE, col="grey") points( fit1E$x, pch=".") title("Prediction SE") set.panel() } \dontrun{ ################################### # conditional simulation ################################### # first a small application at missing data notThere<- is.na(CO.tmin.MAM.climate ) xp <- CO.loc[notThere,] Zp <- CO.elev[notThere] infill<- sim.spatialProcess( fit1E, xp=xp, Z= Zp, M= 10) dim( infill) # # interpretation is that these infilled values are all equally plausible # given the observations and also given the estimated covariance model # # EXTRA CREDIT: standardize the infilled values to have # conditional mean and variance from the exact computations # e.g. predict( fit1E, xp=CO.loc[!good,], Z= CO.elev[!good]) # and predictSE(fit1E, xp=CO.loc[!good,], Z= CO.elev[!good]) # with these standardization one would still preserve the correlations # among the infilled values that is also important for considering them as a # multivariate prediction. # conditional simulation on a grid but not using the covariate of elevation fit2<- spatialProcess(CO.loc,CO.tmin.MAM.climate, gridARange= seq(.25, 2.0, length.out=10) ) # note larger range parameter # create 2500 grid points using a handy fields function gridList <- fields.x.to.grid( fit2$x, nx=50,ny=50) xGrid<- make.surface.grid( gridList) ensemble<- sim.spatialProcess( fit2, xp=xGrid, M = 6) # this is an "n^3" computation so increasing the grid size # can slow things down for computation # The 6 ensemble members set.panel( 3,2) for( k in 1:6){ imagePlot( as.surface( xGrid, ensemble[,k])) } set.panel() } \dontrun{ ## changing the covariance model. data(ozone2) x<- ozone2$lon.lat y<- ozone2$y[16,] # a comparison to using an exponential and Wendland covariance function # and great circle distance -- just to make range easier to interpret. obj <- spatialProcess( x, y, Distance = "rdist.earth") obj2<- spatialProcess( x, y, cov.args = list(Covariance = "Exponential"), Distance = "rdist.earth" ) obj3<- spatialProcess( x, y, cov.args = list(Covariance = "Wendland", dimension = 2, k = 2), Distance = "rdist.earth") # obj2 could be also be fit using the argument: # cov.args = list(Covariance = "Matern", smoothness=.5) # # Note very different range parameters - BTW these are in miles # but similar nugget variances. rbind( Whittle= obj$summary, Exp= obj2$summary, Wendland= obj3$summary ) # since the exponential is Matern with smoothness == .5 the first two # fits can be compared in terms of their likelihoods # the ln likelihood value is slightly higher for obj verses obj2 (-613.9 > -614.9) # these are the _negative_ log likelihoods so suggests a preference for the # smoothness = 1.0 (Whittle) model # # does it really matter in terms of spatial prediction? set.panel( 3,1) surface( obj) US( add=TRUE) title("Matern sm= 1.0") surface( obj2) US( add=TRUE) title("Matern sm= .5") surface( obj3) US( add=TRUE) title("Wendland k =2") # prediction standard errors # these take a while because prediction errors are based # directly on the Kriging weight matrix # see mKrig for an alternative. set.panel( 2,1) out.p<- predictSurfaceSE( obj, nx=40,ny=40) surface( out.p) US( add=TRUE) title("Matern sm= 1.0") points( x, col="magenta") # out.p<- predictSurfaceSE( obj, nx=40,ny=40) surface( out.p) US( add=TRUE) points( x, col="magenta") title("Matern sm= .5") set.panel(1,1) } } \keyword{ spatial} % __ONLY ONE__ keyword per line fields/man/sim.rf.Rd0000644000176200001440000002062514275214115013767 0ustar liggesusers%# %# fields is a package for analysis of spatial data written for %# the R software environment. %# Copyright (C) 2022 Colorado School of Mines %# 1500 Illinois St., Golden, CO 80401 %# Contact: Douglas Nychka, douglasnychka@gmail.edu, %# %# This program is free software; you can redistribute it and/or modify %# it under the terms of the GNU General Public License as published by %# the Free Software Foundation; either version 2 of the License, or %# (at your option) any later version. %# This program is distributed in the hope that it will be useful, %# but WITHOUT ANY WARRANTY; without even the implied warranty of %# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the %# GNU General Public License for more details. %# %# You should have received a copy of the GNU General Public License %# along with the R software environment if not, write to the Free Software %# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA %# or see http://www.r-project.org/Licenses/GPL-2 %##END HEADER %##END HEADER \name{circulantEmbedding} \alias{sim.rf} \alias{circulantEmbedding} \alias{circulantEmbeddingSetup} \title{ Efficiently Simulates a Stationary 1 and 2D Gaussian random fields } \description{ Simulates a stationary Gaussian random field on a regular grid with unit marginal variance. Makes use of the efficient algorithm based on the FFT know as circulant embedding. } \usage{ sim.rf(obj) circulantEmbedding(obj) circulantEmbeddingSetup(grid, M = NULL, mKrigObject = NULL, cov.function = "stationary.cov", cov.args = NULL, delta = NULL, ...) } \arguments{ \item{obj}{A list (aka covariance object) that includes information about the covariance function and the grid for evaluation. Usually this is created by a setup call to Exp.image.cov, stationary.image.cov, matern.image.cov or other related covariance functions for \code{sim.rf} (See details below.) or to \code{circulantEmbeddingSetup} for \code{circulantEmbedding} } \item{grid}{A list describing the regular grid. \code{length(grid)} is the dimension of the field (1D 2D etc) and each component are the regular locations in that dimension. } \item{M}{A vector of dimensions to embed the field. Simulation will be exact if each \code{M[i]} is larger than \code{2*length(grid)}. The default is to choose a power of 2 larger than this minima bound.} \item{cov.function}{A text string with the name of the stationary covariance function to use. Default is \code{stationary.cov} and general function that takes advantage of some efficiency in finding distances.} \item{cov.args}{A list of arguments to include with the covariance function, Eg. aRange and smoothness for the Matern.} \item{delta}{If NULL the spatial domain is artifically doubled in size in all dimensions to account for the periodic wrapping of the fft. If passed this is the amount to extend the domain and can be less than double if a compact covariance function is used. } \item{mKrigObject}{Object from fitting surface using the mKrig or spatialProcess functions.} \item{\dots}{For convenience any other arguments to pass to the covariance function. } } \value{ \strong{sim.rf}: A matrix with the random field values. \strong{circulantEmbedding}: An array according to the grid values specified in the setup. \strong{circulantEmbeddingetup}: A list with components \code{ "m" "grid" "dx" "M" "wght" "call"} With the information needed to simulate the field. } \details{ The functions \code{circulantEmbedding} and \code{circulantEmbeddingSetup} are more recent \code{fields} functions, more easy to read, and recommended over \code{sim.rf}. \code{sim.rf} is limited to 2D fields while \code{circulantEmbedding} can handle any number of dimensions and has some shortcuts to be efficient for the 2D case. The simulated field has the marginal variance that is determined by the covariance function for zero distance. Within fields the exponential and matern set this equal to one ( e.g. Matern(0) ==1) so that one simulates a random field with a marginal variance of one. For stationary.cov the marginal variance is whatever \code{Covariance(0)} evaluates to and we recommend that alternative covariance functions also be normalized so that this is one. Of course if one requires a Gaussian field with different marginal variance one can simply scale the result of this function. See the third example below. Both \code{sim.rf} and \code{circulantEmbedding} take an object that includes some preliminary calculations and so is more efficient for simulating more than one field from the same covariance. The algorithm using an FFT known as circulant embedding, may not always work if the correlation range is large. Specifically the weight function obtained from the FFT of the covariance field will have some negative values. A simple fix is to increase the size of the domain so that the correlation scale becomes smaller relative to the extent of the domain. Increasing the size can be computationally expensive, however, and so this method has some limitations. But when it works it is an exact simulation of the random field. For a stationary model the covariance object ( or list) for \code{circulantEmbedding} should have minmally, the components: That is \code{names( obj)} should give \code{ "m" "grid" "M" "wght" } where \code{m} is the number of grid points in each dimension, \code{grid} is a list with components giving the grid points in each coordinate. \code{M} is the size of the larger grid that is used for "embedding" and simulation. Usually \code{M = 2*m} and results in an exact simulation of the stationary Gaussian field. The default if \code{M} is not passed is to find the smallest power of 2 greater than 2*m. \code{wght} is an array from the FFT of the covariance function with dimensions \code{M}. Keep in mind that for the final results only the array that is within the indices \code{1: m[i]} for each dimension \code{i} is retained. This can give a much larger intermediate array, however, in the computation. E.g. if \code{m[1] = 100} and \code{m[2]=200} by default then \code{M[1] = 256} and \code{M[2] = 512}. A 256 X 512 array is simluated with to get the 100 by 200 result. The easiest way to create the object for simulation is to use \code{circulantEmbeddingSetup}. For the older function \code{sim.rf} one uses the image based covariance functions with \code{setup=TRUE} to create the list for simulation. See the example below for this usage. The classic reference for this algorithm is Wood, A.T.A. and Chan, G. (1994). Simulation of Stationary Gaussian Processes in [0,1]^d . Journal of Computational and Graphical Statistics, 3, 409-432. Micheal Stein and Tilman Gneiting have also made some additional contributions to the algortihms and theory. } \seealso{ \link{stationary.cov}, \link{stationary.image.cov} } \examples{ #Simulate a Gaussian random field with an exponential covariance function, #range parameter = 2.0 and the domain is [0,5]X [0,5] evaluating the #field at a 100X100 grid. grid<- list( x= seq( 0,5,,100), y= seq(0,5,,100)) obj<- circulantEmbeddingSetup( grid, Covariance="Exponential", aRange=.5) set.seed( 223) look<- circulantEmbedding( obj) # Now simulate another ... look2<- circulantEmbedding( obj) # take a look at first two set.panel(2,1) image.plot( grid[[1]], grid[[2]], look) title("simulated gaussian fields") image.plot( grid[[1]], grid[[2]], look2) title("another realization ...") # Suppose one requires an exponential, range = 2 # but marginal variance = 10 ( sigma in fields notation) look3<- sqrt( 10)*circulantEmbedding( obj) \dontrun{ # an interesting 3D field grid<- list( 1:40, 1:40, 1:16 ) obj<- circulantEmbeddingSetup( grid, cov.args=list( Covariance="Matern", aRange=2, smoothness=1.0) ) # NOTE: choice of aRange is close to giving a negative weight array set.seed( 122) look<- circulantEmbedding( obj ) # look at slices in the 3rd dimension set.panel( 4,4) zr<- range( look) par( mar=c(1,1,0,0)) for( k in 1:16){ image( grid[[1]], grid[[2]], look[,,k], zlim= zr, col=tim.colors(256), axes=FALSE, xlab="", ylab="") } } # same as first example using the older sim.rf grid<- list( x= seq( 0,10,length.out=100) , y= seq( 0,10,length.out=100) ) obj<-Exp.image.cov( grid=grid, aRange=.75, setup=TRUE) set.seed( 223) look<- sim.rf( obj) # Now simulate another ... look2<- sim.rf( obj) } \keyword{spatial} % docclass is function % Converted by Sd2Rd version 1.21. fields/man/xline.Rd0000644000176200001440000000305714275214115013710 0ustar liggesusers%# %# fields is a package for analysis of spatial data written for %# the R software environment. %# Copyright (C) 2022 Colorado School of Mines %# 1500 Illinois St., Golden, CO 80401 %# Contact: Douglas Nychka, douglasnychka@gmail.edu, %# %# This program is free software; you can redistribute it and/or modify %# it under the terms of the GNU General Public License as published by %# the Free Software Foundation; either version 2 of the License, or %# (at your option) any later version. %# This program is distributed in the hope that it will be useful, %# but WITHOUT ANY WARRANTY; without even the implied warranty of %# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the %# GNU General Public License for more details. %# %# You should have received a copy of the GNU General Public License %# along with the R software environment if not, write to the Free Software %# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA %# or see http://www.r-project.org/Licenses/GPL-2 %##END HEADER %##END HEADER \name{xline} \alias{xline} \title{ Draw a vertical line } \description{ Adds vertical lines in the plot region. } \usage{ xline(x, ...) } \arguments{ \item{x}{ Values on x axis specifying location of vertical lines. } \item{\dots}{ Any ploting options for abline. } } \seealso{ yline, abline } \examples{ plot( 1:10) xline( 6.5, col=2) world( col=3) yline( seq( -80,80,10),col=4, lty=2) xline( seq( -180,180,10),col=4,lty=2) yline( 0, lwd=2, col=4) } \keyword{aplot} % docclass is function % Converted by Sd2Rd version 1.21. fields/man/Krig.replicates.Rd0000644000176200001440000000653614275214115015624 0ustar liggesusers%# %# fields is a package for analysis of spatial data written for %# the R software environment. %# Copyright (C) 2022 Colorado School of Mines %# 1500 Illinois St., Golden, CO 80401 %# Contact: Douglas Nychka, douglasnychka@gmail.edu, %# %# This program is free software; you can redistribute it and/or modify %# it under the terms of the GNU General Public License as published by %# the Free Software Foundation; either version 2 of the License, or %# (at your option) any later version. %# This program is distributed in the hope that it will be useful, %# but WITHOUT ANY WARRANTY; without even the implied warranty of %# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the %# GNU General Public License for more details. %# %# You should have received a copy of the GNU General Public License %# along with the R software environment if not, write to the Free Software %# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA %# or see http://www.r-project.org/Licenses/GPL-2 %##END HEADER %##END HEADER \name{Krig.replicates} \alias{Krig.replicates} %- Also NEED an '\alias' for EACH other topic documented here. \title{ Collapse repeated spatial locations into unique locations } \description{ In case that several observations are available for a single spatial location find the group means and replicate variability } \usage{ Krig.replicates(out = NULL, x, y, Z = NULL, weights = rep(1, length(y)), digits = 8, verbose = FALSE) } \arguments{ \item{out}{ A list with components \code{x}, \code{y}, \code{weights}, and possibily \code{Z}.} \item{x}{Spatial locations.} \item{y}{Spatial observations} \item{Z}{Spatial covariates.} \item{weights}{Weights proportional to reciprocal varainces of observations.} \item{digits}{Number of significant digits to consider in determing a replicate location.} \item{verbose}{If TRUE print out details for debugging. } } \details{ This function figures out which locations are the same and within the function fast.1way use \code{tapply} to find replicate group means and standard deviations. NOTE: it is assumed the Z covariates are unique at the locations. Currently these functions can not handle a model with common spatial locations but different values for the Z covariates. } \value{ A list with components: \item{yM }{Data at unique locations and where more than one observation is available this is the mean of the replicates.} \item{xM }{Unique spatial locations.} \item{weightsM}{Weights matching the unique lcoations proportional to reciprocal variances This is found as a combination of the original weights at each location.} \item{ZM}{Values of the covariates at the unique lcoations.} \item{uniquerows}{Index for unique rows of \code{x}.} \item{tauHat.rep, tauHat.pure.error}{Standard deviation of pure error estimate based on replicate groups (and adjusting for possibly different weights.)} \item{rep.info}{Integer tags indicating replicate groups.} } \author{ Douglas Nychka } \examples{ #create some spatial replicates set.seed( 123) x0<- matrix( runif(10*2), 10,2) x<- x0[ c(rep(1,3), 2:8, rep( 9,5),10) , ] y<- rnorm( 16) out<- Krig.replicates( x=x, y=y) # compare # out$yM[1] ; mean( y[1:3]) # out$yM[9] ; mean( y[11:15]) # mean( y[ out$rep.info==9]) } % Add one or more standard keywords, see file 'KEYWORDS' in the % R documentation directory. \keyword{spatial} fields/man/sim.Krig.Rd0000644000176200001440000004237014275214115014255 0ustar liggesusers%# %# fields is a package for analysis of spatial data written for %# the R software environment. %# Copyright (C) 2022 Colorado School of Mines %# 1500 Illinois St., Golden, CO 80401 %# Contact: Douglas Nychka, douglasnychka@gmail.edu, %# %# This program is free software; you can redistribute it and/or modify %# it under the terms of the GNU General Public License as published by %# the Free Software Foundation; either version 2 of the License, or %# (at your option) any later version. %# This program is distributed in the hope that it will be useful, %# but WITHOUT ANY WARRANTY; without even the implied warranty of %# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the %# GNU General Public License for more details. %# %# You should have received a copy of the GNU General Public License %# along with the R software environment if not, write to the Free Software %# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA %# or see http://www.r-project.org/Licenses/GPL-2 %##END HEADER %##END HEADER \name{sim.spatialProcess} \alias{sim.Krig} \alias{simSpatialData} \alias{sim.spatialProcess} \alias{simLocal.spatialProcess} \alias{checkPredictGrid} \alias{makePredictionGridList} \alias{makeSimulationGrid} \title{Unconditional and conditional simulation of a spatial process} \description{ Generates exact (or approximate) random draws from the unconditional or conditional distribution of a spatial process given specific observations. Draws from the conditional distribution, known as conditional simulation in geostatistics, is a useful way to characterize the uncertainty in the predicted process from data. Note that exact simulation is limted by the number of locations but there are approximate strategies to handle simulation for large grids of locations. } \usage{ simSpatialData(object, M = 1, verbose = FALSE) sim.spatialProcess(object, xp, M = 1, verbose = FALSE, ...) sim.Krig(object, xp, M = 1, verbose = FALSE, ...) simLocal.spatialProcess(mKrigObject, predictionGridList = NULL, simulationGridList = NULL, gridRefinement = 1, np = 2, M = 1, nx = 80, ny = 80, verbose = FALSE, delta = NULL, giveWarnings = TRUE, fast = FALSE, NNSize = 5, ...) checkPredictGrid(predictionGridList) makePredictionGridList(mKrigObject, nx, ny, np) makeSimulationGrid(predictionGridList, gridRefinement) } \arguments{ \item{delta}{If the covariance has compact support the simulation method can take advantage of this. This is the amount of buffer added for the simulation domain in the circulant embedding method. A minimum size would be \code{aRange} for the Wendland but a multiple of this maybe needed to obtain a positive definite circulant covariance function. } \item{fast}{ If TRUE will use approximate, fast spatial prediction on grids. } \item{gridRefinement}{Amount to increase the number of grid points for the simulation grid.} \item{giveWarnings}{If true will warn when more than one observation is in a grid box. This is instead of giving an error and stopping.} \item{mKrigObject}{An mKrig Object (or spatialProcess object)} \item{M}{Number of draws from conditional distribution.} \item{np}{Degree of nearest neighbors to use. In the 2D case, the default \code{np=2} uses 16 points in a 4X4 grid for prediction of the off grid point. } \item{NNSize}{Degree of neighborhood use for fast prediction. ( See \code{ predictSurface.mKrig} with \code{fast= TRUE} ) } \item{nx}{ Number of grid points in prediction locations for x coordinate.} \item{ny}{ Number of grid points in prediction locations for x coordinate.} \item{object}{The spatial fit object.} \item{predictionGridList}{A grid list specifying the grid locations for the conditional samples. } \item{simulationGridList}{ A \code{gridlist} describing grid for simulation. If missing this is created from the range of the locations, \code{nx}, \code{ny}, \code{gridRefinement}, and \code{gridExpansion} or from the range and and \code{nxSimulation}, \code{nySimulation}.} \item{xp}{Same as predictionPoints above.} \item{\dots}{Any other arguments to be passed to the predict function. Usually this is the \code{Z} or \code{drop.Z} argument when there are additional covariates in the fixed part of the model. (See example below.) } \item{verbose}{If true prints out intermediate information. } } \details{ These functions generate samples from an unconditional or conditional multivariate (spatial) distribution, or an approximate one. The \strong{unconditional} simulation function, \code{simSpatialData}, is a handy way to generate synthetic observations from a fitted model. Typically one would use these for a parametric bootstrap. The functions that simulate \strong{conditional} distributions are much more involved in their coding. They are useful for describing the uncertainty in predictions using the estimated spatial process under Gaussian assumptions. An important assumption throughout these functions is that all covariance parameters are fixed at their estimated or prescribed values from the passed object. Although these functions might be coded up easily by the users these versions have the advantage that they take the \code{mKrig}, \code{spatialProcess} or \code{Krig} objects as a way to specify the model in an unambiguous way. Given a spatial process h(x)= P(x) + g(x) observed at Y.k = Z(x.k)d + P(x.k) + g(x.k) + e.k where P(x) is a low order, fixed polynomial and g(x) a Gaussian spatial process and Z(x.k) is a vector of covariates that are also indexed by space (such as elevation). Z(x.k)d is a linear combination of the covariates with the parameter vector d being a component of the fixed part of the model and estimated in the usual way by generalized least squares. With Y= Y.1, ..., Y.N, the goal is to sample the conditional distribution of the process. [h(x) | Y ] or the full prediction Z(x)d + h(x) For fixed a covariance this is just a multivariate normal sampling problem. \code{sim.spatialProcess} samples this conditional process at the points \code{xp} and is exact for fixed covariance parameters. The outline of the conditional simulation algorithm is given below and has the advantage that is only depends on the unconditional simulation of the spatial process and being able to make a spatial prediction - the conditional mean of the process given the observations and covariance function. \strong{ Conditional Simulation Algorithm: } 0) Find the spatial prediction at the unobserved locations based on the actual data. Call this h.hat(x) and this is also the conditional mean. 1) Generate a realization that includes both prediction and observation locations from the unconditional spatial process and from this process simluate synthetic observations. 2) Use the spatial prediction model ( using the true covariance) to estimate the spatial process at unobserved locations. 3) Find the difference between the simulated process and its prediction based on synthetic observations. Call this e(x). 4) h.hat(x) + e(x) is a draw from [h(x) | Y ]. The approximations for this simulation come in at step 1). Here the field at the observation locations is approximated using a local conditional simulation from the nearest grid points. NOTE: A fixed part in the model is handled easily by simply making the prediction from the synthetic observations that have mean zero but include estimation of the fixed part as part of the prediction. Because the regression estimates are unbaised, this gives a valid draw from the correct mulitvariate distribution even though the synthetic observations do not include a fixed part. \code{sim.spatialProcess} Follows this algorithm exactly. For the case of an addtional covariate this of course needs to be included. For a model with covariates use \code{drop.Z=TRUE} for the function to ignore prediction using the covariate and generate conditional samples for just the spatial process and any low order polynomial. Finally, it should be noted that this function will also work with an \code{mKrig} object because the essential prediction information in the mKrig and spatialProcess objects are the same. The naming is through convenience. \code{sim.Krig} Also follows this algorithm exactly but for the older \code{Krig} object. Note the inclusion of drop.Z=TRUE or FALSE will determine whether the conditional simulation includes the covariates Z or not. (See example below.) \code{simLocal.spatialProcess}{This function is designed for conditional simulation for a large prediction grid and for a large number of observation s. The approximation will be accurate for fine grids that separate clusters of observation locations. E.g. multiple observations in a single gridbox are treated exactly. If observation location are separated by a grid box then due to the screening effect the approximation error will be negliable, especially if a nugget component (tau ) is present. The 1D version of this function will not be much more efficient than an exact computation. However, it is included as easy to read source code and for checking (see examples.) See the utility function \code{\link{offGridWeights}} for the function that creates weights used to generate the (approximate) conditional sample. The functions \code{checkPredictGrid}, \code{makePredictionGridList} and \code{makeSimulationGrid} are utilities to setup the grids when not specified. } } \value{ \code{sim.Krig and sim.spatialProcess} a matrix with rows indexed by the locations in \code{xp} and columns being the \code{M} independent draws. \code{simLocal.spatialProcess} a list with components \code{x}, \code{y} and \code{z} being the simulations at the prediction grid. The x and y are the typical image format specifying a regular grid. If \code{nx} and \code{ny} are the lengths of the grid values in X and Y then \code{z} is a array with dimension \code{ c(nx, ny, M)}. For the 1D case ny is set to 1. The component \code{hHat} is the conditional mean ( as an \code{nx} X \code{ny} matrix) and the remaining arguments are various timing results for parts of the computation. } \author{Doug Nychka} \seealso{ sim.rf, Krig, spatialProcess} \examples{ ## 10 member ensemble for the O3 data \dontrun{ data( "ozone2") fitObject<- spatialProcess( ozone2$lon.lat, ozone2$y[16,], smoothness=.5) nx<- 65 ny<- 55 xGridList<- fields.x.to.grid( fitObject$x, nx=nx, ny=ny) xGrid<- make.surface.grid( xGridList) allTime0<- system.time( look0<- sim.spatialProcess(fitObject, xp=xGrid, M=5) ) print( allTime0) # for M=5 this does not make much sense ... however here are the # Monte Carlo based prediction standard deviations. predictSE<- apply( look0, 1, sd) # compare to predictSE(fitObject, xp=xGrid) ## Local simulation with extra refinement of the grid for embedding ## and same grid size for prediction ## this runs much faster compared to exact method above ## as nx, ny are increased e.g. nx= 128, ny=128 is dramatic difference allTime1<- system.time( look<- simLocal.spatialProcess(fitObject, M=5,nx=nx, ny=ny, gridRefinement = 3, np=3) ) print( allTime1) print( look$timing) allTime2<- system.time( look<- simLocal.spatialProcess(fitObject, M=5,nx=nx, ny=ny, gridRefinement = 3, np=3, fast=TRUE) ) print( allTime2) print( look$timing) } \dontrun{ ## A simple example for setting up a bootstrap ## M below should be ## set to a much larger sample size, however, ( e.g. M <- 200) for better ## statistics data( ozone2) obj<- spatialProcess( ozone2$lon.lat,ozone2$y[16,] ) aHat<- obj$summary["aRange"] lambdaHat<- obj$summary["lambda"] ######### boot strap # create M independent copies of the observation vector # here we just grab the model information from the # spatialProcess object above. # # However, one could just create the list # obj<- list( x= ozone2$lon.lat, # cov.function.name="stationary.cov", # summary= c( tau= 9.47, sigma2= 499.79, aRange= .700), # cov.args= list( Covariance="Matern", smoothness=1.0), # weights= rep( 1, nrow(ozone2$lon.lat) ) # ) # Here summary component has the parameters # tau, sigma2 and aRange # and cov.args component has the remaining ones. set.seed(223) M<- 25 ySynthetic<- simSpatialData( obj, M) bootSummary<- NULL for( k in 1:M){ cat( k, " ") # here the MLEs are found using the easy top level level wrapper # see mKrigMLEJoint for a more efficient strategy newSummary<- spatialProcess(obj$x,ySynthetic[,k], cov.params.start= list( aRange = aHat, lambda = lambdaHat) )$summary bootSummary<- rbind( bootSummary, newSummary) } cat( fill= TRUE) # the results and 95% confidence interval stats( bootSummary ) obj$summary tmpBoot<- bootSummary[,c("lambda", "aRange") ] confidenceInterval <- apply(tmpBoot, 2, quantile, probs=c(0.025,0.975) ) # compare to estimates used as the "true" parameters obj$summary[2:5] print( t(confidenceInterval) ) # compare to confidence interval using large sample theory print( obj$CITable) } \dontrun{ # conditional simulation with covariates # colorado climate example data(COmonthlyMet) fit1E<- spatialProcess(CO.loc,CO.tmin.MAM.climate, Z=CO.elev ) # conditional simulation at missing data good<- !is.na(CO.tmin.MAM.climate ) infill<- sim.spatialProcess( fit1E, xp=CO.loc[!good,], Z= CO.elev[!good], M= 10) # get an elevation grid ... NGRID<- 50 gives a nicer image but takes longer NGRID <- 25 # get elevations on a grid COGrid<- list( x=seq( -109.5, -100.5, ,NGRID), y= seq(36, 41.75,,NGRID) ) COGridPoints<- make.surface.grid( COGrid) # elevations are a bilinear interpolation from the 4km # Rocky Mountain elevation fields data set. data( RMelevation) COElevGrid<- interp.surface( RMelevation, COGridPoints ) # NOTE call to sim.spatialProcess treats the grid points as just a matrix # of locations the plot has to "reshape" these into a grid # to use with image.plot SEout<- sim.spatialProcess( fit1E, xp=COGridPoints, Z= COElevGrid, M= 30) # for just the smooth surface in lon/lat # SEout<- sim.spatialProcess( fit1E, xp=COGridPoints, drop.Z=TRUE, M= 30) # in practice M should be larger to reduce Monte Carlo error. surSE<- apply( SEout, 1, sd ) image.plot( as.surface( COGridPoints, surSE)) points( fit1E$x, col="magenta", pch=16) } ### Approximate conditional simulation \dontrun{ # create larger lon/lat grid NGRID <- 200 COGrid<- list( x=seq( -109.7, -100.5, ,NGRID), y= seq(36, 41.75,,NGRID) ) # interpolation elevations to this grid. # This took about 40 seconds COElevGrid<- interp.surface.grid( RMelevation, COGrid ) system.time( SEout0<- simLocal.spatialProcess( fit1E,COGrid , ZGrid= COElevGrid$z, M= 10) ) } ### Approximate conditional simulation and with approximate prediction ### increase np and NNSize to improve approximations ### This takes about 8 seconds of course one would want more thatn 10 reps ### to estimate the SE. Use drop.Z=TRUE to just get the spatial surface without ### the fixed part \dontrun{ system.time( SEout2<- simLocal.spatialProcess( fit1E, COGrid , ZGrid= COElevGrid$z, np = 2, fast= TRUE, NNSize=5, M= 10) ) look <- apply( SEout2$z,c(1,2), sd) imagePlot(SEout2$x, SEout2$y, look, col=viridis(256) ) points( fit1E$x, pch=16, cex=.5, col="magenta") title("Monte Carlo prediction SE") } #### example using Krig object and exact conditional simulation. \dontrun{ data( ozone2) set.seed( 399) # fit to day 16 from Midwest ozone data set. out<- Krig( ozone2$lon.lat, ozone2$y[16,], Covariance="Matern", aRange=1.0,smoothness=1.0, na.rm=TRUE) # NOTE aRange =1.0 is not the best choice but # the six missing data locations xp<- ozone2$lon.lat[ is.na(ozone2$y[16,]),] # 30 draws from process at xp given the data sim.out<- sim.Krig( out,xp, M=30) } \dontrun{ ## testing the local method on a 1D case. set.seed(124) # 10 observations -- massive dataset! s<- cbind(runif( 10, 5,45)) y<- cbind(runif( 10)) aRange<- 10 obj<- mKrig( s, y, aRange=aRange,Covariance="Matern", smoothness=1.0, lambda=.01,tau=sqrt(.01), m=0) # # M should be much larger for an accurate check on code # gridList<- list( x= seq(0,50, length.out=15)) look<- simLocal.spatialProcess(obj, np=3, predictionGridList = gridList, gridRefinement = 3, M=50, extrap=TRUE) simSE<- apply(look$z, 1, sd ) checkSE<- predictSE( obj, xnew= cbind(look$x ), drop.Z=TRUE ) # percentage error from true SE at each location. stats( 100*abs(1- simSE/checkSE) ) # Maggie plot plot( look$x, checkSE, type="b", col="blue", xlab="Location", ylab="Prediction SE") rug( look$x, col="blue", lwd=3) points( look$x, simSE, col="orange3", pch=16) xline( s, col="grey", lwd=2) title("Exact (blue) and Monte Carlo (orange) for the prediction SE based on observations (grey) ") } } \keyword{spatial} % at least one, from doc/KEYWORDS fields/man/BD.Rd0000644000176200001440000000435514275214115013060 0ustar liggesusers%# %# fields is a package for analysis of spatial data written for %# the R software environment. %# Copyright (C) 2022 Colorado School of Mines %# 1500 Illinois St., Golden, CO 80401 %# Contact: Douglas Nychka, douglasnychka@gmail.edu, %# %# This program is free software; you can redistribute it and/or modify %# it under the terms of the GNU General Public License as published by %# the Free Software Foundation; either version 2 of the License, or %# (at your option) any later version. %# This program is distributed in the hope that it will be useful, %# but WITHOUT ANY WARRANTY; without even the implied warranty of %# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the %# GNU General Public License for more details. %# %# You should have received a copy of the GNU General Public License %# along with the R software environment if not, write to the Free Software %# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA %# or see http://www.r-project.org/Licenses/GPL-2 %##END HEADER %##END HEADER \name{BD} \alias{BD} \title{ Data frame of the effect of buffer compositions on DNA strand displacement amplification. A 4-d regression data set with with replication. This is a useful test data set for exercising function fitting methods. } \description{ The \code{BD} data frame has 89 rows and 5 columns. There are 89 runs with four buffer components (KCL, MgCl2, KP04, dnTP) systematically varied in a space-filliing design. The response is the DNA amplification rate. } \format{ This data frame contains the following columns: \describe{ \item{KCl}{ Buffer component. } \item{MgCl2}{ Buffer component. } \item{KPO4}{ Buffer component. } \item{dNTP}{ Buffer component, deoxyribonucleotides. } \item{lnya}{ Exponential amplification rate on a log scale, i.e. the actual amplification rate. } } } \source{ Thanks to Perry Haaland and Michael OConnell. Becton Dickinson Research Center Research Triangle Park, NC } \seealso{ Tps } \examples{ # fitting a DNA strand # displacement amplification surface to various buffer compositions fit<- Tps(BD[,1:4],BD$lnya,scale.type="range") surface(fit) # plots fitted surface and contours } \keyword{datasets} % docclass is function % Converted by Sd2Rd version 1.21. fields/man/ozone.Rd0000644000176200001440000000437514275214115013727 0ustar liggesusers%# %# fields is a package for analysis of spatial data written for %# the R software environment. %# Copyright (C) 2022 Colorado School of Mines %# 1500 Illinois St., Golden, CO 80401 %# Contact: Douglas Nychka, douglasnychka@gmail.edu, %# %# This program is free software; you can redistribute it and/or modify %# it under the terms of the GNU General Public License as published by %# the Free Software Foundation; either version 2 of the License, or %# (at your option) any later version. %# This program is distributed in the hope that it will be useful, %# but WITHOUT ANY WARRANTY; without even the implied warranty of %# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the %# GNU General Public License for more details. %# %# You should have received a copy of the GNU General Public License %# along with the R software environment if not, write to the Free Software %# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA %# or see http://www.r-project.org/Licenses/GPL-2 %##END HEADER %##END HEADER \name{Chicago ozone test data} \alias{ChicagoO3} \alias{ozone} \title{ Data set of ozone measurements at 20 Chicago monitoring stations. } \description{ This data set used be named \code{ozone} but was changed to avoid conflict with other packages. The \code{ChicagoO3} data is a list of components, x and y. x component is longitude and latitude position of each of the 20 Chicago monitoring stations, y is the average daily ozone values over the time period 6/3/87-8/30/87. These data are used extensively for the test scripts and simple examples. The lasting scientific value is probably minimal. } \format{ This data set is a list containing the following components: \describe{ \item{lon.lat}{ Longitude-latitude positions of monitoring stations. } \item{x}{An approximate Cartesian set of coordinates for the locations where the units are in miles. The origin is in the center of the locations. } \item{y}{ Average daily ozone values over 1987 summer. } } } \source{ AIRS, the EPA air quality data base. } \seealso{ Tps, Krig } \examples{ fit<- Tps(ChicagoO3$x, ChicagoO3$y) # fitting a surface to ozone measurements. surface( fit, type="I") } \keyword{datasets} % docclass is function % Converted by Sd2Rd version 1.21. fields/man/imagePlot.Rd0000644000176200001440000007374214466741406014534 0ustar liggesusers%# %# fields is a package for analysis of spatial data written for %# the R software environment. %# Copyright (C) 2022 Colorado School of Mines %# 1500 Illinois St., Golden, CO 80401 %# Contact: Douglas Nychka, douglasnychka@gmail.edu, %# %# This program is free software; you can redistribute it and/or modify %# it under the terms of the GNU General Public License as published by %# the Free Software Foundation; either version 2 of the License, or %# (at your option) any later version. %# This program is distributed in the hope that it will be useful, %# but WITHOUT ANY WARRANTY; without even the implied warranty of %# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the %# GNU General Public License for more details. %# %# You should have received a copy of the GNU General Public License %# along with the R software environment if not, write to the Free Software %# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA %# or see http://www.r-project.org/Licenses/GPL-2 %##END HEADER %##END HEADER \name{imagePlot} \alias{imagePlot} \alias{colorBar} \alias{setupLegend} \alias{addLegend} \alias{addColorBarTriangle} \title{ Draws an image plot with a legend strip for the color scale based on either a regular grid or a grid of quadrilaterals. } \description{ This function combines the R image function with some automatic placement of a legend. It is backwardly compatible with the older function \code{\link{image.plot}}. This function works by by splitting the plotting region into two parts. Putting the image in one and the legend in the other. After the legend is added the plot region is reset to the main image plot. This function also allows for plotting quadrilateral cells in the image format that often arise from regular grids transformed with a map projection or a scaling and rotation of coordinates. Finally, see the last example where this function can create a similar graphic to the ggplot package but using all base R graphics. Two additional functions are provided to add a color scale to other kinds of figures. } \usage{ imagePlot(..., add = FALSE, breaks = NULL, nlevel = 64, col = NULL, horizontal = FALSE, legend.shrink = 0.9, legend.width = 1.2, legend.mar = ifelse(horizontal, 3.1, 5.1), legend.lab = NULL, legend.line = 2, graphics.reset = FALSE, bigplot = NULL, smallplot = NULL, legend.only = FALSE, lab.breaks = NULL, axis.args = NULL, legend.args = NULL, legend.cex = 1, midpoint = FALSE, border = NA, lwd = 1, lowerTriangle = FALSE, upperTriangle = FALSE, asp = NA, verbose = FALSE) colorBar(breaks, smallplot, colorTable, horizontal = FALSE, lab.breaks, axis.args, legend.lab, legend.line = 2, legend.args, legend.cex = 1, lowerTriangle = FALSE, upperTriangle = NULL) setupLegend( horizontal = FALSE, legend.shrink = 0.9, legend.width = 1.2, legend.mar = ifelse(horizontal, 3.1, 5.1) ) addLegend(legendLayout, col, zlim, axis.args = NULL, legend.args = NULL, legend.cex = 1, legend.lab = NULL, legend.line = 2) addColorBarTriangle(lowerColor=NULL, upperColor=NULL, horizontal=TRUE) } \arguments{ \item{\dots}{ The usual arguments to the \code{image} function as x,y,or z or as a list with x,y,z as components. One can also include a \code{breaks} argument for an unequal spaced color scale with color scale boundaries at the breaks (see example below). If a "quadrilateral grid", arguments must be explicitly x,y and z with x, and y being matrices of dimensions equal to, or one more than, z giving the grid locations. The basic concept is that the coordinates of x and y still define a grid but the image cells are quadrilaterals rather than being restricted to rectangles. NOTE: graphical argruments passed here will only have impact on the image plot. To change the graphical defaults for the legend use the individual legend arguments, \code{axis.args}, or \code{legend.arg} listed below. } \item{add}{ If true add image and a legend strip to the existing plot. } \item{asp}{ Plot aspect. The same function as in the \code{plot} or \code{image} functions.} \item{axis.args}{A list giving additional arguments for the axis function used to create the legend axis. Some typicalones are \code{at} and \code{labels} and specify \code{cex} to control the size of the labels. (See example below adding a log scaling.)} \item{bigplot}{ Plot coordinates for image plot. If not passed these will be determined within the function. } \item{border}{This only works if x and y are matrices -- if NA the quadralaterals will have a border color that is the same as the interior color. Otherwise this specifies the color to use.} \item{breaks}{Break points in sorted order to indicate the intervals for assigning the colors. Note that if there are nlevel colors there should be (nlevel+1) breakpoints. If \code{breaks} is not specified (nlevel+1) equally spaced breaks are created where the first and last bin have their midpoints at the minimum and maximum values in \code{z} or at \code{zlim}.} \item{col}{Color table to use for image (See help file on image for details.). Default is a pleasing range of 64 divisions suggested by Tim Hoar and is similar to the MATLAB (TM) jet color scheme. Note that if \code{breaks} is specified there must be one less color specified than the number of breaks. Or use \code{viridisLite::rocket}. } \item{colorTable}{The colors for the color scale -- the same as col.} \item{graphics.reset}{ If FALSE (default) the plotting region ( plt in par) will not be reset and one can add more information onto the image plot. (e.g. using functions such as points or lines.) If TRUE will reset plot parameters to the values before entering the function. } \item{horizontal}{ If FALSE (default) legend will be a vertical strip on the right side. If TRUE the legend strip will be along the bottom. } \item{lab.breaks}{If breaks are supplied these are text string labels to put at each break value. This feature is useful, for example, to label the legend axis on a transformed scale such as logs. It is also used in the \code{bubblePlot} function to label the colors when z is categorical.} \item{legend.only}{ If TRUE just add the legend to a the plot in the plot region defined by the coordinates in smallplot. In the absence of other information the range for the legend is determined from the \code{zlim} argument. } \item{legend.args}{Arguments for a complete specification of the legend label, e.g. if you need to the rotate text or other details. This is in the form of list and is just passed to the mtext function and you will need to give both the side and line arguments for positioning. This usually will not be needed. (See example below.)} \item{legend.cex}{Character expansion to change size of the legend label.} \item{legend.line}{Distance in units of character height (as in \code{mtext}) of the legend label from the color bar. Make this larger if the label collides with the color axis labels.} \item{legend.mar}{ Width in characters of legend margin that has the axis. Default is 5.1 for a vertical legend and 3.1 for a horizontal legend.} \item{legend.lab}{ Label for the axis of the color legend. Default is no label as this is usual evident from the plot title.} \item{legend.shrink}{ Amount to shrink the size of legend relative to the full height or width of the plot. } \item{legend.width}{ Width in characters of the legend strip. Default is 1.2, a little bigger that the width of a character. } \item{legendLayout}{The list returned by \code{setupLegend} used to layout the legend after a plot is drawn. } \item{lowerColor}{The name of a color for the triangle added to the upper end of the color bar.} \item{lowerTriangle}{If TRUE a triangle will be added to the lower end of the color bar using the first color in the color table. ( i.e. the color of \code{col[1]}). If FALSE a normal color strip will be drawn. } \item{lwd}{Line width of bordering lines around pixels. This might need to be set less than 1.0 to avoid visible rounding of the pixel corners.} \item{midpoint}{ This option is for the case of unequally spaced grids with x and y being matrices of grid point locations. If FALSE (default) the quadralaterals will be extended to surround the z locations as their midpoints. If TRUE z values will be averaged to yield a midpoint value and the original grid points be used to define the quadralaterals. (See help on poly.image for details). In most cases midpoint should be FALSE to preserve exact values for z and let the grid polygons be modified.} \item{nlevel}{ Number of color levels used in legend strip } \item{smallplot}{ Plot coordinates for legend strip. If not passed these will be determined within the function. Be sure to leave room for the axis labels. For example, if the legend is on the right side \code{smallplot= c(.85,.9,0,1) } will leave (.1 in plot coordinates) for the axis labels to the right of the color strip. This argument is useful for drawing a plot with the legend that is the same size as the plots without legends. } \item{upperColor}{The color for the triangle added to the upper end of the color bar.} \item{upperTriangle}{If TRUE a triangle added to the upper end of the color bar using the last color in the color table. ( i.e. the \code{col} argument). If FALSE a normal color strip will be drawn. } \item{verbose}{If TRUE prints intermediate information about setting up plots (for debugging). } \item{zlim}{For \code{addLegend}, the range of color scale. Default is to use range set by most recent call to \code{color.scale}} } \section{Side Effects}{ After exiting, the plotting region may be changed to make it possible to add more features to the plot. To be explicit, \code{par()\$plt} may be changed to reflect a smaller plotting region that has accommodated room for the legend subplot. If \code{xlim} and \code{ylim} are specified the pixels may overplot the axis lines. Just use the \code{box} function to redraw them. } \details{ This is a function using base R graphics. The coding was done to make it easier for users to see how this function works and to modify. This will have the same functionaity as the older \code{image.plot} but calls the \code{colorBar} function in place of direct coding in the main function. The functions \code{colorBar} and \code{addColorBarTriangle} are used internally and included for completeness. \strong{How this function works:} The strategy for \code{imagePlot} is simple: divide the plotting region into two smaller regions \code{bigplot} and \code{smallplot}. The image goes in one and the legend in the other. This way there is always room for the legend. Some adjustments are made to this rule by not shrinking the \code{bigplot} if there is already room for the legend strip and also sticking the legend strip close to the image plot. The functionality has evolved over many uses of image plots for geophysical data and the examples given below show the flexibility of this function. Also this function is backwardly compatible with the older \code{image.plot} but includes adding endcap trianglesto the color bar to indicate values beyond the range of the color scale. Also the function uses \code{colorBar} to add the legend strip and perhaps this function is useful on its own in other applictions. \strong{Figure real estate} One can specify the plot regions explicitly by \code{bigplot} and \code{smallplot} if the default choices do not work.(Note that these in figure coordinates. ) There may be problems with small plotting regions in fitting both of these elements into the plot region and one may have to change the default character sizes or margins to make things fit. Sometimes this function will not reset the type of margins correctly and the "null" call \code{par(mar = par("mar"))} may help to fix this issue. \strong{The text is too small!} This always seems to happen as one is rushing to finish a talk and the figures have tiny default axis labels. Try just calling the function \code{fields.style} before plotting. List out this function to see what is changed, however, all text is increased by 20\% in size. \strong{Why ``imagePlot" and not ``image"?} The R Base function \code{image} is very useful but it is awkward to place a legend quickly. However, that said if you are drawing several image plots and want a common legend use the \code{image} function and just just use \code{imagePlot} to add the legend. See the example in the help file. Note that you can use \code{image} to draw a bunch of images and then follow with \code{imagePlot} and \code{legend.only=TRUE} to add a common legend. (See examples below.) \strong{Almost cloropleths too!} This image function is slightly different than a cloropleth map because the legend is assuming that a continous scale has been discretized into a series of colors. To use the imagePlot function to create a cloropleth graphic involves an extra step of first recoding the image matrix into a set of integers that correspond to the colors in the color table. With this new matrix as the image plot use the \code{legend.args} list to place labels for each of the colors beside the color strip. For example, if one has used \code{N} colors in \code{col} then the locations of the color strip run from 1 to N and one could place the \code{N} color labels at the positions \code{(1:N)} along the axis. Note that this two step technique could also one adpated if one had a nonlinear color scale and wanted to identify the values. \strong{Relationship of x, y and z:} If the z component is a matrix then the user should be aware that this function locates the matrix element z[i,j] at the grid locations (x[i], y[j]) this is very different than simply listing out the matrix in the usual row column tabular form. See the example below for details on the difference in formatting. What does one do if you do not really have the "z" values on a regular grid? See the functions \code{quilt.plot.Rd} and \code{as.image} to discretise irregular observations to a grid. If the values makes sense as points on a smooth surface see \code{Tps} and \code{fastTps} for surface interpolation. \strong{Adding separate color to indicate the grid box boundaries.} Sometimes you want to show to the grid box borders to emphasize this is not a smooth surface. To our knowledge there is no easy way to do this as an option in \code{image}. But if your image is formatted in the "poly image" style where x and y are also matrices you can use the polyimage (see the \code{border} argument above) option to draw in boundaries. \strong{Grids with unequally spacing -- quadrialteral pixels:} If x and y are matrices that are a smooth transformation of a regular grid then z[i,j] can be interperted as representing the average value in a quadrilateral that is centered at x[i,j] and y[i,j] (\code{midpoint} TRUE). The details of how this cell is found are buried in \code{poly.image} but it it essentially found using midpoints between the centers. If \code{midpoint} is FALSE then x and y are interpreted as the corners of the quadrilateral cells. But what about z? The four values of z are now averaged to represent a value at the midpoint of the cell and this is what is used for plotting. Quadrilateral grids were added to help with plotting the gridded output of geophysical models where the regular grid is defined according to one map projection but the image plotting is required in another projection. Typically the regular grid becomes distorted in a smooth way when this happens. See the regional climate example for a illustration of this application. One can add border colors in this case easily because these choices are just passed onto the polygon function. \strong{Adding the pixel grid for rectangular images:} For adding the grid of pixel borders to a rectangular image try this example after calling \code{imagePlot}. \preformatted{ dx <- x[2] - x[1] dy <- y[2] - y[1] xtemp<- seq( min( x)- dx/2, max(x)+ dx/2, length.out = length(x) +1) ytemp<- seq( min( y)- dy/2, max(y)+ dy/2, length.out = length(y) +1) xline( xtemp, col="grey", lwd=2) yline( ytemp, col="grey", lwd=2) } Here \code{x} and \code{y} here are the x and y grid values from the image list. \strong{Fine tuning color scales:} This function gives some flexibility in tuning the color scale to fit the rendering of z values. This can either be specially designed color scale with specific colors ( see help on \code{designer.colors}), positioning the colors at specific points on the [0,1] scale, or mapping distinct colors to intervals of z. The examples below show how to do each of these. In addition, by supplying \code{lab.break} strings or axis parameters one can annotate the legend axis in an informative matter. \strong{Adding just a legend strip/ color bar:} Note that to add just the legend strip all the numerical information one needs is the \code{zlim} argument and the color table! See examples for tricks in positioning. \strong{About color tables:} We like \code{tim.colors}(the default) as default color scales and so if this what you use this can be omitted. Unfortunately this is not the default for the \code{image} function. Another important color scale is \code{ viridis() } from the viridis package. It seems that by and large everyone seems to react postively to viridis -- guess that is the point! The topographic color scale (\code{\link{topo.colors}}) is also a close second and also see \code{\link{snow.colors} } showing our geophysical bias. Users may find \code{larry.colors} useful for coding distinct regions in the style of a cloropleith map. See also \code{terrain.colors} for a subset of the topo ones and \code{designer.colors} to "roll your own" color table. One nice option in this last function is to fix color transitions at particular quantiles of the data rather than at equally spaced intervals. For color choices see how the \code{nlevels} argument figures into the legend and main plot number of colors. Also see the \code{colors} function for a listing of all the colors that come with the R base environment. \strong{The details of placing the legend and dividing up the plotting real estate:} It is surprising how hard it is to automatically add the legend! All "plotting coordinates" mentioned here are in device coordinates. The plot region is assumed to be [0,1]X[0,1] and plotting regions are defined as rectangles within this square. We found these easier to work with than user coordinates. \code{legend.width} and \code{legend.mar} are in units of character spaces. These units are helpful in thinking about axis labels that will be put into these areas. To add more or less space between the legend and the image plot alter the mar parameters. The default mar settings (5.1,5.1,5.1,2.1) leaves 2.1 spaces for vertical legends and 5.1 spaces for horizontal legends. There are always problems with default solutions to placing information on graphs but the choices made here may be useful for most cases. The most annoying thing is that after using imagePlot and adding information the next plot that is made may have the slightly smaller plotting region set by the image plotting. The user should set \code{reset.graphics=TRUE} to avoid the plotting size from changing. The disadvantage, however, of resetting the graphics is that one can no longer add additional graphics elements to the image plot. Note that filled.contour always resets the graphics but provides another mechanism to pass through plotting commands. Apparently \code{filled.contour}, while very pretty, does not work for multiple plots. \strong{About setup and add legend functions} These came about to create a scatterplot in Base R Graphics where the points are colored with a color scale and the scale can be plotted as part of the figure See \code{ \link{bubblePlot} } for a version of this kind of figure. The function \code{setupLegend} should be used first to create enough space to add a color scale later. After plotting then \code{addLegend} will add the color scale. Note that if the color scale has been created by the \code{color.scale} function the last call to this function will use the color scale and limits created in \code{color.scale}. In summary here is an example of using these functions with the colors in mind: \preformatted{ info<- setupLegend() colTab<- rainbow(10) plot( 1:10, 201:210, col=colTab, pch=16) addLegend(info, col=colTab, zlim = c(1,10)) } Here is one where four colors are mapped to specific values (ala image). \preformatted{ info<-setupLegend() colTab= color.scale(201:210, rainbow(4)) plot( 1:10, 201:210, col=colTab, pch=16 ) addLegend(info, col=colTab, zlim = c(201,210) ) } More complete graphics languages, such as that in ggplot, do not need such functions because the entire graphics segment is parsed to create the complete figure. In this way room for a color scale can be created automatically. The functions proposed here are a simple work around to create these figures using base R graphics. \strong{Other packages} \code{levelplot} that is part of the lattice package has a very similar function to imagePlot and a formula syntax in the call. The \code{geom_raster} for setting up a graphics object within \code{ggplot} is another alternative for image plots with legends. See the last example to compare the steps in creating an image plot using \code{imagePlot} that is close to the ggplot version. Mostly this involves resetting base graphics parameters using the {\code{par}} function but gives an appreciate of the complexity built in the ggplot default graphic choices. \strong{Multiple images single color bar:} By keeping the \code{zlim} argument the same across images one can generate the same color scale. (See the \code{image} help file.) One useful technique for a panel of images is to just draw the images with good old \code{image} and then use imagePlot to add a legend to the last plot. (See example below for messing with the outer margins to also make this work.) Moreover, a square plot (\code{pty="s"}) done in a rectangular plot region will have room for the legend stuck to the right side without any other adjustments. See the examples below for more complicated arrangements of multiple image plots and a summary color bar. The reader is also referred to the package \code{autoimage} as a set of functions in base to help with drawing multiple images and also more support for geographic coordinates. } \seealso{ image, poly.image, filled.contour, quilt.plot, plot.surface, add.image, colorbar.plot, tim.colors, designer.colors } \examples{ x<- 1:10 y<- 1:15 z<- outer( x,y,"+") imagePlot(x,y,z) # or obj<- list( x=x,y=y,z=z) imagePlot(obj, legend.lab="Sverdrups") # to test add some points on diagonal using standard plot function # (with some clipping beyond 10 anticipated) points( 5:12, 5:12, pch="X", cex=3) # in general imagePlot will reset the plot window so you # can add any feature that normally works in base R # e.g. lines, text, contour, boxplots, .... # ################################################################ # the next sequence of examples explain how to quickly # adapt this basic plot to include more features ############################################################### # # adding explicit breaks and distinct colors for intervals of z brk<- quantile(c(z), c(0, .1,.25, .5, .75, .9, 1.0)) imagePlot(x,y,z, breaks=brk, col=topo.colors(6)) # last bins are depicted as end triangles on the color bar. imagePlot(x,y,z, breaks=brk, col=topo.colors(6), lowerTriangle=TRUE, upperTriangle=TRUE) # NOTE: the image function does not use -Inf and Inf for the breaks argument # and so if one wants the triangles at ends to indicate values beyond the # range of the color bar one has to create the breaks "by hand" when the # two outer bins will define the values for the triangles. # annotate legend strip with the break point values and add a label imagePlot(x,y,z, breaks=brk, col=rainbow(6), lab.breaks=names(brk)) # # compare to default color scale and special labels on color bar zp <-quantile(c(z), c( .05, .1,.25, .5,.75, .9,.95)) imagePlot(x,y,z, axis.args=list( at=zp, labels=names(zp) ) ) # a log scaling for the colors ticks<- c( 1, 2,4,8,16,32) imagePlot(x,y,log(z), axis.args=list( at=log(ticks), labels=ticks)) # see help(designer.colors) to generate a color scale that adapts to # quantiles of z. # Add some color scales together here is an example of5 blues to white to 5 reds # with white being a specific size. colorTable<- designer.colors(11, c( "blue","white", "red") ) # breaks with a gap of 10 to 17 assigned the white color brks<- c(seq( 1, 10,,6), seq( 17, 25,,6)) imagePlot( x,y,z,breaks=brks, col=colorTable) # #fat (5 characters wide) and short (50\% of figure) color bar on the bottom imagePlot( x,y,z,legend.width=5, legend.shrink=.5, horizontal=TRUE) # adding a label and all kinds of additional arguments to color bar # use side=4 for vertical legend and side= 1 for horizontal legend # to be parallel to axes. See help(mtext). imagePlot(x,y,z, legend.args=list( text="unknown units", col="magenta", cex=1.5, side=4, line=2)) # and finally add some grid lines dx <- x[2] - x[1] dy <- y[2] - y[1] xtemp<- seq( min( x)- dx/2, max(x)+ dx/2, length.out = length(x) +1) ytemp<- seq( min( y)- dy/2, max(y)+ dy/2, length.out = length(y) +1) xline( xtemp, col="grey", lwd=2) yline( ytemp, col="grey", lwd=2) ############################################################### #### example using an irregular quadrilateral grid ############################################################### data( RCMexample) imagePlot( RCMexample$x, RCMexample$y, RCMexample$z[,,1]) ind<- 50:75 # make a smaller image to show bordering lines imagePlot( RCMexample$x[ind,ind], RCMexample$y[ind,ind], RCMexample$z[ind,ind,1], border="grey50", lwd=2) ############################################################### #### multiple images with a common legend ############################################################### set.panel() # Here is quick but quirky way to add a common legend to several plots. # The idea is leave some room in the margin and then at the end # overplot the legend in this margin par(oma=c( 0,0,0,4)) # margin of 4 spaces width at right hand side set.panel( 2,2) # 2X2 matrix of plots # now draw all your plots using usual image command for ( k in 1:4){ data<- matrix( rnorm(150), 10,15) image( data, zlim=c(-4,4), col=tim.colors()) # and just for fun add a contour plot contour( data, add=TRUE) } par(oma=c( 0,0,0,1))# reset margin to be much smaller. imagePlot( legend.only=TRUE, zlim=c(-4,4)) # imagePlot tricked into plotting in margin of old setting set.panel() # reset plotting device # # Here is a more learned strategy to add a common legend to a panel of # plots. Consult the split.screen help file for more explanations. # For this example we draw two # images top and bottom and add a single legend color bar on the right side # first divide screen into the figure region (left) and legend region (right) split.screen( rbind(c(0, .8,0,1), c(.8,1,0,1))) # now subdivide up the figure region into two parts split.screen(c(2,1), screen=1)-> ind zr<- range( 2,35) # first image screen( ind[1]) image( x,y,z, col=tim.colors(), zlim=zr) # second image screen( ind[2]) image( x,y,z+10, col=tim.colors(), zlim =zr) # move to skinny region on right and draw the legend strip screen( 2) imagePlot( zlim=zr,legend.only=TRUE, smallplot=c(.1,.2, .3,.7), col=tim.colors()) close.screen( all=TRUE) # you can always add a legend arbitrarily to any plot; # note that here the plot is too big for the vertical strip but the # horizontal fits nicely. plot( 1:10, 1:10) imagePlot( zlim=c(0,25), legend.only=TRUE) imagePlot( zlim=c(0,25), legend.only=TRUE, horizontal =TRUE) # combining the usual image function and adding a legend # first change margin for some more room \dontrun{ par( mar=c(10,5,5,5)) image( x,y,z, col=topo.colors(64)) imagePlot( zlim=c(0,25), nlevel=64,legend.only=TRUE, horizontal=TRUE, col=topo.colors(64)) } # # adding a legend by automatically making room. # and coloring points info<- setupLegend() colTab<- rainbow(10) plot( 201:210, 201:210, col=colTab, pch=16) addLegend(info, col=colTab, zlim = c(201,210)) # ####################################################### ##### Comparison to ggplot ####################################################### # The following example was created as way avoid doing more important # things # Note how close base graphics can get to reproducing the ggplot style. # and how a first cut imagePlot(x,y,z, col = viridis(128) ) is probably # acceptable in most cases for fast EDA # Surprisingly the hardest feature is to add the grey gird lines behind # the image. I (DWN) don't know how to do it! \dontrun{ library( viridis) library( ggplot2) x<- 1:20 y<- 1:24 z<- outer( x, y, "+") # ggplot version mesh<- expand.grid( x= x, y=y) mesh$z <- c(z) ggplot( data=mesh, aes( x=x, y=y, fill=z)) + geom_raster(interpolate= FALSE) + scale_fill_continuous(type = "viridis") + theme_bw() # reset to a single plot set.panel() # inflate range to give a margin around image xr<- range(x) + c(-.08, .08)* diff( range(x)) yr<- range(y) + c(-.08, .08)* diff( range(y)) # changing these graphics parameters tends to push # text closer to the axes. par( mgp=c(1.5,.5,0), mar=c(2.5,2.5,.5,1), cex=.8) imagePlot(x,y,z, col = viridis(128), legend.shrink = .27, xlim = xr, ylim = yr, legend.width = 1.5, legend.mar = 3, legend.args = list( text = "z", cex = .8, side = 3, line = .5) ) } } \keyword{hplot} % docclass is function fields/man/predict.Krig.Rd0000644000176200001440000001545614275214115015124 0ustar liggesusers%# %# fields is a package for analysis of spatial data written for %# the R software environment. %# Copyright (C) 2022 Colorado School of Mines %# 1500 Illinois St., Golden, CO 80401 %# Contact: Douglas Nychka, douglasnychka@gmail.edu, %# %# This program is free software; you can redistribute it and/or modify %# it under the terms of the GNU General Public License as published by %# the Free Software Foundation; either version 2 of the License, or %# (at your option) any later version. %# This program is distributed in the hope that it will be useful, %# but WITHOUT ANY WARRANTY; without even the implied warranty of %# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the %# GNU General Public License for more details. %# %# You should have received a copy of the GNU General Public License %# along with the R software environment if not, write to the Free Software %# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA %# or see http://www.r-project.org/Licenses/GPL-2 %##END HEADER %##END HEADER \name{predict.Krig} \alias{predict.Krig} \alias{predict.Tps} \alias{predictDerivative.Krig} \alias{predict.fastTps} \title{ Evaluation of Krig spatial process estimate. } \description{ Provides predictions from the Krig spatial process estimate at arbitrary points, new data (Y) or other values of the smoothing parameter (lambda) including a GCV estimate. } \usage{ \method{predict}{Krig}( object, x = NULL, Z = NULL, drop.Z = FALSE, just.fixed = FALSE, lambda = NA, df = NA, model = NA, eval.correlation.model = TRUE, y = NULL, yM = NULL, verbose = FALSE, ...) predictDerivative.Krig(object, x = NULL, verbose = FALSE,...) \method{predict}{Tps}(object, ... ) \method{predict}{fastTps}(object, xnew = NULL, grid.list = NULL, ynew = NULL, derivative = 0, Z = NULL, drop.Z = FALSE, just.fixed = FALSE, xy = c(1, 2), ...) } \arguments{ \item{derivative}{The degree of the derivative to be evauated. Default is 0 (evaluate the function itself), 1 is supported by some covariance functions, Higher derivatives are not supported in this version and for mKrig.} \item{df}{ Effective degrees of freedom for the predicted surface. This can be used in place of lambda ( see the function Krig.df.to.lambda) } \item{eval.correlation.model}{ If true ( the default) will multiply the predicted function by marginal sd's and add the mean function. This usually what one wants. If false will return predicted surface in the standardized scale. The main use of this option is a call from Krig to find MLE's of sigma and tau2 } \item{grid.list}{A \code{grid.list} specfiying a grid of locations to evaluate the fitted surface.} \item{just.fixed}{ Only fixed part of model is evaluated} \item{lambda}{ Smoothing parameter. If omitted, the value in the \code{lambda} of the object will be used. (See also df and gcv arguments) } \item{model}{ Generic argument that may be used to pass a different lambda. } \item{object}{ Fit object from the Krig, Tps, mKrig, or fastTps functions. } \item{verbose}{ Print out all kinds of intermediate stuff for debugging } \item{xy}{The column positions that locate the x and y variables for evaluating on a grid. This is mainly useful if the surface has more than 2 dimensions.} \item{y}{ Evaluate the estimate using the new data vector y (in the same order as the old data). This is equivalent to recomputing the Krig object with this new data but is more efficient because many pieces can be reused. Note that the x values are assumed to be the same. } \item{x}{ Matrix of x values on which to evaluate the kriging surface. If omitted, the data x values will be used. } \item{xnew}{Same as x above.} \item{ynew}{Same as y above.} \item{yM}{ If not NULL evaluate the estimate using this vector as the replicate mean data. That is, assume the full data has been collapsed into replicate means in the same order as xM. The replicate weights are assumed to be the same as the original data. (weightsM) } \item{Z}{ Vector/Matrix of additional covariates to be included in fixed part of spatial model} \item{drop.Z}{ If TRUE only spatial fixed part of model is evaluated. i.e. Z covariates are not used. } \item{\dots}{Other arguments passed to covariance function. In the case of \code{fastTps} these are the same arguments as \code{predict.mKrig}. This argument is usually not needed. } } \value{ Vector of predicted responses or a matrix of the partial derivatives. } \details{ The main goal in this function is to reuse the Krig object to rapidly evaluate different estimates. Thus there is flexibility in changing the value of lambda and also the independent data without having to recompute the matrices associated with the Krig object. The reason this is possible is that most on the calculations depend on the observed locations not on lambda or the observed data. Note the version for evaluating partial derivatives does not provide the same flexibility as \code{predict.Krig} and makes some assumptions about the null model (as a low order polynomial) and can not handle the correlation model form. } \seealso{ Krig, predictSurface gcv.Krig } \examples{ Krig(ChicagoO3$x,ChicagoO3$y, aRange=50) ->fit predict( fit) # gives predicted values at data points should agree with fitted.values # in fit object # predict at the coordinate (-5,10) x0<- cbind( -5,10) # has to be a 1X2 matrix predict( fit,x= x0) # redoing predictions at data locations: predict( fit, x=ChicagoO3$x) # only the fixed part of the model predict( fit, just.fixed=TRUE) # evaluating estimate at a grid of points grid<- make.surface.grid( list( seq( -40,40,,15), seq( -40,40,,15))) look<- predict(fit,grid) # evaluate on a grid of points # some useful graphing functions for these gridded predicted values out.p<- as.surface( grid, look) # reformat into $x $y $z image-type object contour( out.p) # see also the functions predictSurface and surface # for functions that combine these steps # refit with 10 degrees of freedom in surface look<- predict(fit,grid, df=15) # refit with random data look<- predict( fit, grid, y= rnorm( 20)) # finding partial derivatives of the estimate # # find the partial derivatives at observation locations # returned object is a two column matrix. # this does not make sense for the exponential covariance # but can illustrate this with a thin plate spline with # a high enough order ( i.e. need m=3 or greater) # data(ozone2) # the 16th day of this ozone spatial dataset fit0<- Tps( ozone2$lon.lat, ozone2$y[16,], m=3) look1<- predictDerivative.Krig( fit0) # for extra credit compare this to look2<- predictDerivative.Krig( fit0, x=ozone2$lon.lat) # (why are there more values in look2) } \keyword{spatial} % docclass is function % Converted by Sd2Rd version 1.21. fields/DESCRIPTION0000644000176200001440000000573714467505347013261 0ustar liggesusersPackage: fields Version: 15.2 Date: 2023-08-17 Title: Tools for Spatial Data Authors@R: c( person("Douglas", "Nychka", role = c("aut", "cre"), email = "douglasnychka@gmail.com"), person("Reinhard", "Furrer", role = c("aut"), email = "reinhard.furrer@math.uzh.ch"), person("John", "Paige", role = c("aut"), email = "paigejo@uw.edu"), person("Stephan", "Sain", role = "aut", email = "sainsr2@gmail.com"), person("Florian", "Gerber", role = "aut", email = "flora.fauna.gerber@gmail.com"), person("Matthew", "Iverson", role = "aut", email = "miverson@mymail.mines.edu"), person("University Corporation for Atmospheric Research", role="cph", email="nychka@ucar.edu") ) Maintainer: Douglas Nychka Description: For curve, surface and function fitting with an emphasis on splines, spatial data, geostatistics, and spatial statistics. The major methods include cubic, and thin plate splines, Kriging, and compactly supported covariance functions for large data sets. The splines and Kriging methods are supported by functions that can determine the smoothing parameter (nugget and sill variance) and other covariance function parameters by cross validation and also by restricted maximum likelihood. For Kriging there is an easy to use function that also estimates the correlation scale (range parameter). A major feature is that any covariance function implemented in R and following a simple format can be used for spatial prediction. There are also many useful functions for plotting and working with spatial data as images. This package also contains an implementation of sparse matrix methods for large spatial data sets and currently requires the sparse matrix (spam) package. Use help(fields) to get started and for an overview. The fields source code is deliberately commented and provides useful explanations of numerical details as a companion to the manual pages. The commented source code can be viewed by expanding the source code version and looking in the R subdirectory. The reference for fields can be generated by the citation function in R and has DOI . Development of this package was supported in part by the National Science Foundation Grant 1417857, the National Center for Atmospheric Research, and Colorado School of Mines. See the Fields URL for a vignette on using this package and some background on spatial statistics. License: GPL (>= 2) URL: https://github.com/dnychka/fieldsRPackage Depends: R (>= 3.5.0), methods, spam, viridisLite Imports: maps NeedsCompilation: yes Repository: CRAN Packaged: 2023-08-17 14:57:28 UTC; nychka Author: Douglas Nychka [aut, cre], Reinhard Furrer [aut], John Paige [aut], Stephan Sain [aut], Florian Gerber [aut], Matthew Iverson [aut], University Corporation for Atmospheric Research [cph] Date/Publication: 2023-08-17 21:02:31 UTC fields/tests/0000755000176200001440000000000014342516755012676 5ustar liggesusersfields/tests/testZCommon.Rout.save0000644000176200001440000000506214342516755016773 0ustar liggesusers R version 4.2.1 (2022-06-23) -- "Funny-Looking Kid" Copyright (C) 2022 The R Foundation for Statistical Computing Platform: x86_64-apple-darwin17.0 (64-bit) R is free software and comes with ABSOLUTELY NO WARRANTY. You are welcome to redistribute it under certain conditions. Type 'license()' or 'licence()' for distribution details. R is a collaborative project with many contributors. Type 'contributors()' for more information and 'citation()' on how to cite R or R packages in publications. Type 'demo()' for some demos, 'help()' for on-line help, or 'help.start()' for an HTML browser interface to help. Type 'q()' to quit R. > # > # fields is a package for analysis of spatial data written for > # the R software environment. > # Copyright (C) 2022 Colorado School of Mines > # 1500 Illinois St., Golden, CO 80401 > # Contact: Douglas Nychka, douglasnychka@gmail.edu, > # > # This program is free software; you can redistribute it and/or modify > # it under the terms of the GNU General Public License as published by > # the Free Software Foundation; either version 2 of the License, or > # (at your option) any later version. > # This program is distributed in the hope that it will be useful, > # but WITHOUT ANY WARRANTY; without even the implied warranty of > # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the > # GNU General Public License for more details. > # > # You should have received a copy of the GNU General Public License > # along with the R software environment if not, write to the Free Software > # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA > # or see http://www.r-project.org/Licenses/GPL-2 > ##END HEADER > ##END HEADER > > > suppressMessages(library(fields)) > options( echo=FALSE) PASSED test at tolerance 1e-08 PASSED test at tolerance 1e-08 PASSED test at tolerance 1e-08 PASSED test at tolerance 1e-08 PASSED test at tolerance 1e-08 Testing: spatialProcess ZCommon collapse PASSED test at tolerance 1e-08 Testing: spatialProcess ZCommon PASSED test at tolerance 1e-08 Testing: mKrig ZCommon PASSED test at tolerance 1e-08 Testing: big data beta PASSED test at tolerance 0.02 Testing: big data tau PASSED test at tolerance 0.01 Testing: big data sigma2 PASSED test at tolerance 0.01 Testing: big data beta ZCommon PASSED test at tolerance 0.02 Testing: big data gamma ZCommon PASSED test at tolerance 0.001 Testing: big data tau ZCommon PASSED test at tolerance 0.01 Testing: big data sigma2 ZCommon PASSED test at tolerance 0.01 > > proc.time() user system elapsed 1.173 0.099 1.238 fields/tests/mKrig.parameters.test.R0000644000176200001440000001557514275214521017216 0ustar liggesusers# # fields is a package for analysis of spatial data written for # the R software environment. # Copyright (C) 2022 Colorado School of Mines # 1500 Illinois St., Golden, CO 80401 # Contact: Douglas Nychka, douglasnychka@gmail.edu, # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with the R software environment if not, write to the Free Software # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA # or see http://www.r-project.org/Licenses/GPL-2 ##END HEADER ##END HEADER suppressMessages(library(fields)) #options( echo=FALSE) test.for.zero.flag<- 1 data(ozone2) y<- ozone2$y[16,] x<- ozone2$lon.lat # # Omit the NAs good<- !is.na( y) x<- x[good,] y<- y[good] #source("~/Home/Src/fields/R/mKrig.family.R") # now look at mKrig w/o sparse matrix look<- mKrig( x,y, cov.function="stationary.cov", aRange=10, lambda=.3, chol.args=list( pivot=FALSE)) lookKrig<- Krig( x,y, cov.function="stationary.cov", aRange=10) test.df<-Krig.ftrace(look$lambda,lookKrig$matrices$D) test<- Krig.coef( lookKrig, lambda=look$lambda) test.for.zero( look$d, test$d, tag="Krig mKrig d coef") test.for.zero( look$c, test$c, tag="Krig mKrig c coef") # test of trace calculation look<- mKrig( x,y, cov.function="stationary.cov", aRange=10, lambda=.3, find.trA=TRUE, NtrA= 1000, iseed=243) test.for.zero( look$eff.df, test.df,tol=.01, tag="Monte Carlo eff.df") # lookKrig<-Krig( x,y, cov.function="stationary.cov", aRange=350, Distance="rdist.earth",Covariance="Wendland", cov.args=list( k=2, dimension=2) ) look<- mKrig( x,y, cov.function="stationary.cov", aRange=350, Distance="rdist.earth",Covariance="Wendland", cov.args=list( k=2, dimension=2), lambda=lookKrig$lambda, find.trA=TRUE, NtrA= 1000, iseed=243) test.for.zero( look$c, lookKrig$c, tag="Test of wendland and great circle") test.for.zero(look$eff.df, Krig.ftrace( lookKrig$lambda, lookKrig$matrices$D) ,tol=.01, tag="eff.df") # same calculation using sparse matrices. look4<- mKrig( x,y, cov.function="wendland.cov", aRange=350, Dist.args=list( method="greatcircle"), cov.args=list( k=2), lambda=lookKrig$lambda, find.trA=TRUE, NtrA=500, iseed=243) test.for.zero( look$c.coef, look4$c.coef,tol=8e-7, tag="Test of sparse wendland and great circle") test.for.zero(look4$eff.df, Krig.ftrace( lookKrig$lambda, lookKrig$matrices$D), tol=.01, tag="sparse eff.df") # great circle distance switch has been a big bug -- test some options look<- mKrig( x,y, cov.function="wendland.cov", aRange=350, Dist.args=list( method="greatcircle"), cov.args=list( k=2),lambda=lookKrig$lambda, find.trA=TRUE, NtrA=1000, iseed=243) test.for.zero(look$eff.df, Krig.ftrace( lookKrig$lambda, lookKrig$matrices$D), tol=1e-2, tag="exact sparse eff.df") # compare to fast Tps look3<- fastTps( x,y,aRange=350,lambda=lookKrig$lambda, NtrA=200, iseed=243, lon.lat=TRUE) #look3$c<- lookKrig$c #look3$d<- lookKrig$d object<- look3 np<- object$np Ey <- diag(1, np) NtrA <- np hold <- predict.mKrig(object, ynew = Ey, collapseFixedEffect=FALSE) hold2<- matrix( NA, np,np) for( k in 1:np){ hold2[,k] <- predict.Krig(lookKrig, y = Ey[,k]) } #plot( diag(hold), diag(hold2)) test.for.zero( look3$c, lookKrig$c, tol=5e-7) test.for.zero( look3$d, lookKrig$d, tol=2e-8) test.for.zero( look3$fitted.values, lookKrig$fitted.values, tol=1e-7) test.for.zero( predict( look3, xnew= look3$x), predict( lookKrig, xnew= lookKrig$x), tol=5e-7) test.for.zero( hold[,1], hold2[,1], tol=1e-7, relative=FALSE) test.for.zero(diag(hold),diag(hold2), tol=2E-7, relative=FALSE, tag="exact sparse eff.df by predict -- fastTps") #plot( diag(hold), ( 1- diag(hold2)/ diag(hold)) ) test.for.zero(look3$eff.df,sum( diag(hold)) , tag="fastTps ef.df exact" ) test.for.zero(look3$eff.df, Krig.ftrace( lookKrig$lambda, lookKrig$matrices$D), tol=2e-7, tag="exact sparse eff.df through mKrig-- fastTps") # calculations of likelihood, sigma and tau lam<-.2 out<- mKrig( x,y, cov.function =Exp.cov, aRange=4, lambda=lam) out2<- Krig( x,y, cov.function =Exp.cov, aRange=4, lambda=lam) Sigma<- Exp.cov( x,x,aRange=4) X<- cbind( rep(1, nrow(x)), x) Sinv<- solve( Sigma + lam* diag( 1, nrow( x))) #checks on likelihoods # quadratic form: betaHat<- c(solve( t(X)%*%Sinv%*%(X) ) %*% t(X) %*%Sinv%*%y) test.for.zero( betaHat, out$beta, tag="initial check on d for likelihood") r<- y -X%*%betaHat N<- nrow(x) look<- t( r)%*%(Sinv)%*%r/N test.for.zero( look, out$summary["sigma2"], tag="sigma2 hat from likelihood") test.for.zero( look, out2$sigma.MLE, tag="sigma2 hat from likelihood compared to Krig") # check determinant lam<- .2 Sigma<- Exp.cov( x,x,aRange=4) M<- Sigma + lam * diag( 1, nrow(x)) chol( M)-> Mc look2<- sum( log(diag( Mc)))*2 out<-mKrig( x,y,cov.function =Exp.cov, aRange=4, lambda=lam) test.for.zero( out$lnDetCov, look2) test.for.zero( out$lnDetCov, determinant(M, log=TRUE)$modulus) # weighted version lam<- .2 Sigma<- Exp.cov( x,x,aRange=4) set.seed( 123) weights<- runif(nrow( x)) M<- Sigma + diag(lam/ weights) chol( M)-> Mc look2<- sum( log(diag( Mc)))*2 out<-mKrig( x,y,weights=weights, cov.function =Exp.cov, aRange=4, lambda=lam) test.for.zero( out$lnDetCov, look2) test.for.zero( look2, determinant(M, log=TRUE)$modulus) test.for.zero( out$lnDetCov, determinant(M, log=TRUE)$modulus) # check profile likelihood by estimating MLE lam.true<- .2 N<- nrow( x) Sigma<- Exp.cov( x,x,aRange=4) M<- Sigma + lam.true * diag( 1, nrow(x)) chol( M)-> Mc t(Mc)%*%Mc -> test ##D set.seed( 234) ##D NSIM<- 100 ##D hold2<-rep( NA, NSIM) ##D temp.fun<- function(lglam){ ##D out<-mKrig( x,ytemp, ##D cov.function =Exp.cov, aRange=4, lambda=exp(lglam)) ##D return(-1* out$lnProfileLike)} ##D hold1<-rep( NA, NSIM) ##D yt<- rep( 1, N) ##D obj<- Krig( x,yt, aRange=4) ##D E<- matrix( rnorm( NSIM*N), ncol=NSIM) ##D for ( j in 1:NSIM){ ##D cat( j, " ") ##D ytemp <- x%*%c(1,2) + t(Mc)%*%E[,j] ##D out<- optim( log(.2), temp.fun, method="BFGS") ##D hold2[j]<- exp(out$par) ##D hold1[j]<- gcv.Krig(obj, y=ytemp)$lambda.est[6,1] ##D } ##D test.for.zero( median( hold1), .2, tol=.08) ##D test.for.zero( median( hold2), .2, tol=.12) fields/tests/Krig.se.W.R0000644000176200001440000000477514275214521014534 0ustar liggesusers# # fields is a package for analysis of spatial data written for # the R software environment. # Copyright (C) 2022 Colorado School of Mines # 1500 Illinois St., Golden, CO 80401 # Contact: Douglas Nychka, douglasnychka@gmail.edu, # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with the R software environment if not, write to the Free Software # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA # or see http://www.r-project.org/Licenses/GPL-2 ##END HEADER ##END HEADER suppressMessages(library(fields)) # tests of predictSE using # off diag weight matrix for obs (W) options( echo=FALSE) test.for.zero.flag<- 1 # a nasty example with off diagonal weights. set.seed(123) N<- 50 x<- matrix( runif( N*2), N,2) y<- rnorm( N)*.2 + 2*x[,1]**2 + x[,2]**2 weights<- runif(N)*10 x0<- cbind( c(.1,.2,.6,.65,.8), c(.05,.5,.73,.9,.95)) temp.wght<- function(x, alpha=.3){ Exp.cov( x, aRange=.1) } Krig( x,y, cov.function=Exp.cov,weights=weights, wght.function= "temp.wght")-> out Krig( x,y, cov.function=Exp.cov,weights=weights,W= out$W)-> out2 # direct calculation test for A matrix # Krig.Amatrix( out, x=x0)-> A test.for.zero( A%*%y, predict( out, x0),tag="Amatrix vs. predict") # now find se. W2<-out$W2 W<- out$W Sigma<- out$sigmahat*Exp.cov( out$x,out$x) temp0<- out$sigmahat*(Exp.cov( x0, x0)) S1<- out$sigmahat*Exp.cov( out$x, x0) #yhat= Ay #var( f0 - yhat)= var( f0) - 2 cov( f0,yhat)+ cov( yhat) Sigma.obs<- Krig.make.Wi( out)$Wi Sigma.obs <- Sigma.obs* (out$tauHat.MLE**2) temp1<- A%*%S1 temp2<- A%*% ( Sigma.obs+ Sigma)%*% t(A) look<- temp0 - t(temp1) - temp1 + temp2 #compare to # diagonal elements test<- predictSE( out, x= x0) test.for.zero( sqrt(diag( look)), test,tag="Marginal predictSE") test<- predictSE( out, x= x0, cov=TRUE) test2<- predictSE( out2, x= x0, cov=TRUE) test.for.zero( look, test,tag="Full covariance predictSE") test.for.zero( look, test2,tag="Full covariance predictSE explicit W") cat( "all done", fill=TRUE) options( echo=TRUE) fields/tests/evlpoly.test.Rout.save0000644000176200001440000000365214275255352017162 0ustar liggesusers R version 4.2.1 (2022-06-23) -- "Funny-Looking Kid" Copyright (C) 2022 The R Foundation for Statistical Computing Platform: x86_64-apple-darwin17.0 (64-bit) R is free software and comes with ABSOLUTELY NO WARRANTY. You are welcome to redistribute it under certain conditions. Type 'license()' or 'licence()' for distribution details. R is a collaborative project with many contributors. Type 'contributors()' for more information and 'citation()' on how to cite R or R packages in publications. Type 'demo()' for some demos, 'help()' for on-line help, or 'help.start()' for an HTML browser interface to help. Type 'q()' to quit R. > # > # fields is a package for analysis of spatial data written for > # the R software environment. > # Copyright (C) 2022 Colorado School of Mines > # 1500 Illinois St., Golden, CO 80401 > # Contact: Douglas Nychka, douglasnychka@gmail.edu, > # > # This program is free software; you can redistribute it and/or modify > # it under the terms of the GNU General Public License as published by > # the Free Software Foundation; either version 2 of the License, or > # (at your option) any later version. > # This program is distributed in the hope that it will be useful, > # but WITHOUT ANY WARRANTY; without even the implied warranty of > # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the > # GNU General Public License for more details. > # > # You should have received a copy of the GNU General Public License > # along with the R software environment if not, write to the Free Software > # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA > # or see http://www.r-project.org/Licenses/GPL-2 > ##END HEADER > ##END HEADER > > > suppressMessages(library(fields)) > options( echo=FALSE) PASSED test at tolerance 1e-08 PASSED test at tolerance 1e-08 PASSED test at tolerance 1e-08 Done testing polynomial evaluation > proc.time() user system elapsed 0.773 0.069 0.827 fields/tests/Krig.test.W.R0000644000176200001440000000700414275214521015070 0ustar liggesusers# # fields is a package for analysis of spatial data written for # the R software environment. # Copyright (C) 2022 Colorado School of Mines # 1500 Illinois St., Golden, CO 80401 # Contact: Douglas Nychka, douglasnychka@gmail.edu, # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with the R software environment if not, write to the Free Software # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA # or see http://www.r-project.org/Licenses/GPL-2 ##END HEADER ##END HEADER suppressMessages(library(fields)) options( echo=FALSE) test.for.zero.flag<- 1 # # # test of off diagonal weight matrix for obs # Check against linear algebra # #cat("A very nasty case with off diagonal weights",fill=TRUE) set.seed(123) x<- matrix( runif( 30), 15,2) y<- rnorm( 15)*.01 + x[,1]**2 + x[,2]**2 #weights<- rep( 1, 15) weights<- runif(15)*10 # WBW # double check that just diagonals work. lambda.test<- .6 Krig( x,y,cov.function=Exp.cov,weights=weights)-> out Krig( x,y,cov.function=Exp.cov,weights=weights, lambda=lambda.test)-> out2 Krig.coef( out, lambda=lambda.test)-> test W<- diag( weights) W2<- diag( sqrt(weights)) K<- Exp.cov(x,x) M<- (lambda.test*solve(W) + K);T<- fields.mkpoly(x, 2) temp.d<- c(solve( t(T) %*% solve( M)%*%T) %*% t(T)%*% solve( M) %*%y) temp.c<- solve( M)%*% (y - T%*% temp.d) # # test for d coefficients test.for.zero( test$d, out2$d, tag=" d coef diag W fixed lam") test.for.zero( temp.d, out2$d, tag=" d coef diag W") # test for c coefficents test.for.zero( test$c, out2$c, tag="c coef diag W fixed lam" ) test.for.zero( temp.c, out2$c, tag="c coef diag W " ) # the full monty temp.wght<- function(x, alpha=.1){ Exp.cov( x, aRange=alpha) } Krig( x,y, cov.function=Exp.cov,weights=weights, wght.function= temp.wght, )-> out.new W2<-out.new$W2 W<- out.new$W test.for.zero( c( W2%*%W2), c( W), tag=" sqrt of W") Krig( x,y, cov.function=Exp.cov,weights=weights, W= out.new$W)-> temp test.for.zero( predict(temp, y= y), predict(out.new,y=y), tag=" Test of passing W explicitly") K<- Exp.cov(x,x); lambda.test<- .6; M<- (lambda.test*solve(W) + K);T<- fields.mkpoly(x, 2) temp.d<- c(solve( t(T) %*% solve( M)%*%T) %*% t(T)%*% solve( M) %*%y) temp.c<- solve( M)%*% (y - T%*% temp.d) # Krig.coef( out.new,lambda=lambda.test )-> out2 test.for.zero( temp.d, out2$d, tag=" d coef full W") # test for c coefficents test.for.zero( temp.c, out2$c, tag="c coef full W" ) #### ### testing the GCV function lambda<- out.new$lambda Krig.Amatrix( out.new, lambda=lambda)-> Alam test.for.zero( Alam%*%y , predict(out.new), tag="A matrix") N<- length( y) test<- sum( diag( Alam)) # compare to test2<- out.new$eff.df test.for.zero( test,test2, tag=" check trace of A") Krig.fgcv.one( lam=lambda, out.new)-> test # compare to test2<- (1/N)*sum( (out.new$W2%*%(y - c(Alam%*% y) ))**2 ) / (1- sum(diag( Alam))/N)**2 test.for.zero( test,test2,tol=.5e-7, tag="GCV one" ) cat( "all done testing off diag W case", fill=TRUE) options( echo=TRUE) fields/tests/vgram2.test.R0000644000176200001440000000532014275214521015164 0ustar liggesusers# # fields is a package for analysis of spatial data written for # the R software environment. # Copyright (C) 2022 Colorado School of Mines # 1500 Illinois St., Golden, CO 80401 # Contact: Douglas Nychka, douglasnychka@gmail.edu, # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with the R software environment if not, write to the Free Software # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA # or see http://www.r-project.org/Licenses/GPL-2 ##END HEADER ##END HEADER # test of vgram suppressMessages(library(fields)) options(echo=FALSE) data( ozone2) y<- ozone2$y[16,] x<- ozone2$lon.lat vgram( x, y, lon.lat=TRUE)-> out # compute "by hand" outer( y, y ,"-")-> hold hold<- .5*hold^2 rdist.earth( x,x)-> hold2 col( hold2)> row( hold2)-> upper hold<- hold[upper] hold2<- hold2[upper] order( hold2)-> od hold2<- hold2[od] hold<- hold[od] ind<- is.na(hold) hold<- hold[!ind] hold2<- hold2[!ind] test.for.zero( hold, out$vgram, tag="vgram single time") # multiple times including NAs at some times y<- t(ozone2$y[16:18,]) x<- ozone2$lon.lat[,] out<- vgram( x, y, lon.lat=TRUE) N<- nrow( y) hold<- cbind(c(outer( y[,1], y[,1],"-")), c(outer( y[,2], y[,2],"-") ), c(outer(y[,3], y[,3],"-")) ) hold<- .5*hold^2 hold<- rowMeans( hold, na.rm=TRUE) hold<- matrix( hold, N,N) rdist.earth( x,x)-> hold2 col( hold2)> row( hold2)-> upper hold<- hold[upper] hold2<- hold2[upper] order( hold2)-> od hold2<- hold2[od] hold<- hold[od] ind<- is.na(hold) hold<- hold[!ind] hold2<- hold2[!ind] test.for.zero( hold, out$vgram, tag="vgram more than one time point") # test covariogram versus correlogram y<- ozone2$y[16,] x<- ozone2$lon.lat tau2 = var(y, na.rm=TRUE) lookCov = vgram(x, y, lon.lat=TRUE, type="covariogram") lookCor = vgram(x, y, lon.lat=TRUE, type="correlogram") test.for.zero(lookCov$vgram*(1/tau2), lookCor$vgram, tag="correlogram versus covariogram") # test cross-covariogram versus cross-correlogram tau2 = var(y, na.rm=TRUE) lookCov = crossCoVGram(x, x, y, y, lon.lat=TRUE, type="cross-covariogram") lookCor = crossCoVGram(x, x, y, y, lon.lat=TRUE, type="cross-correlogram") test.for.zero(lookCov$vgram*(1/tau2), lookCor$vgram, tag="correlogram versus covariogram") fields/tests/Krig.Z.test.Rout.save0000644000176200001440000000517514275255352016576 0ustar liggesusers R version 4.2.1 (2022-06-23) -- "Funny-Looking Kid" Copyright (C) 2022 The R Foundation for Statistical Computing Platform: x86_64-apple-darwin17.0 (64-bit) R is free software and comes with ABSOLUTELY NO WARRANTY. You are welcome to redistribute it under certain conditions. Type 'license()' or 'licence()' for distribution details. R is a collaborative project with many contributors. Type 'contributors()' for more information and 'citation()' on how to cite R or R packages in publications. Type 'demo()' for some demos, 'help()' for on-line help, or 'help.start()' for an HTML browser interface to help. Type 'q()' to quit R. > # > # fields is a package for analysis of spatial data written for > # the R software environment. > # Copyright (C) 2022 Colorado School of Mines > # 1500 Illinois St., Golden, CO 80401 > # Contact: Douglas Nychka, douglasnychka@gmail.edu, > # > # This program is free software; you can redistribute it and/or modify > # it under the terms of the GNU General Public License as published by > # the Free Software Foundation; either version 2 of the License, or > # (at your option) any later version. > # This program is distributed in the hope that it will be useful, > # but WITHOUT ANY WARRANTY; without even the implied warranty of > # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the > # GNU General Public License for more details. > # > # You should have received a copy of the GNU General Public License > # along with the R software environment if not, write to the Free Software > # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA > # or see http://www.r-project.org/Licenses/GPL-2 > ##END HEADER > ##END HEADER > > suppressMessages(library(fields)) > # > # > # test of fixed lambda case > # Check against linear algebra > # > > options( echo=FALSE) Testing: d coef PASSED test at tolerance 1e-08 Testing: c coef PASSED test at tolerance 1e-08 Testing: predict for null fixed PASSED test at tolerance 1e-08 Testing: predict for null spatial PASSED test at tolerance 1e-08 Testing: predict for null drift PASSED test at tolerance 1e-08 Testing: predict for null fixed PASSED test at tolerance 1e-08 Testing: predict for null spatial PASSED test at tolerance 1e-08 Testing: predict for null drift PASSED test at tolerance 1e-08 PASSED test at tolerance 1e-08 Testing: SE w/o covariate PASSED test at tolerance 1e-08 Testing: SE with covariate PASSED test at tolerance 1e-08 Testing: SE for fixed part PASSED test at tolerance 1e-08 All done with Z tests and Krig/Tps including predict and predictSE ! > > proc.time() user system elapsed 1.006 0.116 1.113 fields/tests/SEFixedParameters.R0000644000176200001440000000324614275214521016330 0ustar liggesusers# # fields is a package for analysis of spatial data written for # the R software environment. # Copyright (C) 2022 Colorado School of Mines # 1500 Illinois St., Golden, CO 80401 # Contact: Douglas Nychka, douglasnychka@gmail.edu, # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with the R software environment if not, write to the Free Software # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA # or see http://www.r-project.org/Licenses/GPL-2 ##END HEADER ##END HEADER # tests of SEs from the Omega matrix # using Monte Carlo suppressMessages(library(fields)) options( echo=FALSE) test.for.zero.flag<- TRUE X<- ChicagoO3$x n<- nrow( X) tau2<- .1 sigma<- 2.0 processCov<- sigma*Exp.cov( X,X,aRange=50) cholCov<- chol( processCov + diag( tau2 , n ) ) nreps<- 1e5 set.seed( 111) # extra random covariate Z<- matrix( rnorm(n),n) # the stochastic part E<- matrix( rnorm(n*nreps),n,nreps) # NOTE: all fixed effects set to zero Y<- t( cholCov)%*%E out<- mKrig( X,Y, aRange=50, Z=Z, collapseFixedEffect = FALSE, lambda=.1/2.0) testCov<- var( t(out$beta) ) test.for.zero(testCov, sigma*out$Omega, tol=.05 ) fields/tests/mKrigREMLTest.R0000644000176200001440000000655414275214521015413 0ustar liggesusers# # fields is a package for analysis of spatial data written for # the R software environment. # Copyright (C) 2022 Colorado School of Mines # 1500 Illinois St., Golden, CO 80401 # Contact: Douglas Nychka, douglasnychka@gmail.edu, # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with the R software environment if not, write to the Free Software # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA # or see http://www.r-project.org/Licenses/GPL-2 ##END HEADER ##END HEADER suppressMessages(library(fields)) options( echo=FALSE) set.seed( 123) x<- matrix( runif( 20),10, 2) y<- rnorm(10) lambda<- .1 aRange<- .2 out<- mKrig( x,y, aRange= aRange, lambda=lambda) test.for.zero( out$lnDetOmega, 2*log( prod(diag(chol(out$Omega)))) ) Mc<- exp( -rdist( x,x)/aRange) + lambda* diag( 1,10) OmegaTest<- solve(t(out$Tmatrix)%*%solve( Mc)%*% out$Tmatrix) test.for.zero( OmegaTest, out$Omega,tag= "mKrigOmega") test.for.zero( log(det(OmegaTest)), out$lnDetOmega, tag="lnDetOmega") test.for.zero( log( det( Mc)), out$lnDetCov, tag="lnDetMc" ) # check that det adjustment really works. set.seed( 323) x<- matrix( runif( 20), 10, 2) temp<- matrix( NA, 50,8) aRangeGrid<- seq( .1,.5, ,50) lambdaGrid<- 10**(runif( 50, -2,0)) Q<- qr.qy( qr( cbind( rep(1,10),x) ), diag( 1,10)) Q2<- Q[,4:10] y<- rnorm(10) testDet<- function(lambda, obj) { D2 <- obj$matrices$D[obj$matrices$D > 0] u2 <- obj$matrices$u[obj$matrices$D > 0] lD <- D2 * lambda N2 <- length(D2) sigma.MLE <- (sum((D2 * (u2)^2)/(1 + lD)))/N2 lnDetCov <- -sum(log(D2/(1 + lD))) # -1 * (-N2/2 - log(2 * pi) * (N2/2) - (N2/2) * log(sigma.MLE) - # (1/2) * lnDetCov) return( c(lnDetCov, sigma.MLE) ) } for ( k in 1:50) { out<- mKrig( x,y, aRange = aRangeGrid[k], lambda = lambdaGrid[k] ) # turn off warnings for lambda search because all we want are # matrix decompositions independent of lambda out2<- Krig( x,y, aRange= aRangeGrid[k], cov.args=list( Covariance = "Exponential"), give.warnings=FALSE) Mc<- exp( -rdist( x,x)/aRangeGrid[k] ) + lambdaGrid[k]* diag( 1,10) X<- out$Tmatrix temp[k,]<-c( out$lnDetCov, out$lnDetOmega, log( det( solve(t( Q2)%*%Mc%*%Q2) ) ), log( det(Mc) ), -1*log( det( t(X)%*%solve(Mc)%*%X ) ), testDet( lambdaGrid[k], out2 ), out$summary["sigma2"] ) } test.for.zero( temp[,2], temp[,5], tag="testing det Omega formula") resid<- temp[,1] - temp[,2] + temp[,3] test.for.zero( mean(resid), resid, relative=FALSE, tag="REML Det shortcut") #### testing Krig verses mKrig # test.for.zero( temp[,3], -temp[,6], tag="Q2 Det and Eigen Det") ###### testing sigma.MLE from mKrig and Krig test.for.zero( (7/10)*temp[,7], temp[,8], tag="sigma.MLE Krig verses mKrig") fields/tests/mKrig.R0000644000176200001440000000000014342501121014035 0ustar liggesusersfields/tests/Krig.se.grid.test.Rout.save0000644000176200001440000000365014275255352017714 0ustar liggesusers R version 4.2.1 (2022-06-23) -- "Funny-Looking Kid" Copyright (C) 2022 The R Foundation for Statistical Computing Platform: x86_64-apple-darwin17.0 (64-bit) R is free software and comes with ABSOLUTELY NO WARRANTY. You are welcome to redistribute it under certain conditions. Type 'license()' or 'licence()' for distribution details. R is a collaborative project with many contributors. Type 'contributors()' for more information and 'citation()' on how to cite R or R packages in publications. Type 'demo()' for some demos, 'help()' for on-line help, or 'help.start()' for an HTML browser interface to help. Type 'q()' to quit R. > # > # fields is a package for analysis of spatial data written for > # the R software environment. > # Copyright (C) 2022 Colorado School of Mines > # 1500 Illinois St., Golden, CO 80401 > # Contact: Douglas Nychka, douglasnychka@gmail.edu, > # > # This program is free software; you can redistribute it and/or modify > # it under the terms of the GNU General Public License as published by > # the Free Software Foundation; either version 2 of the License, or > # (at your option) any later version. > # This program is distributed in the hope that it will be useful, > # but WITHOUT ANY WARRANTY; without even the implied warranty of > # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the > # GNU General Public License for more details. > # > # You should have received a copy of the GNU General Public License > # along with the R software environment if not, write to the Free Software > # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA > # or see http://www.r-project.org/Licenses/GPL-2 > ##END HEADER > ##END HEADER > > > suppressMessages(library(fields)) > # tests of predict.se > # using approximations for conditional simulation on a grid. > # > options( echo=FALSE) all done with grid based se tests > > proc.time() user system elapsed 0.889 0.083 0.953 fields/tests/Krig.Z.test.R0000644000176200001440000001441014275214521015072 0ustar liggesusers# # fields is a package for analysis of spatial data written for # the R software environment. # Copyright (C) 2022 Colorado School of Mines # 1500 Illinois St., Golden, CO 80401 # Contact: Douglas Nychka, douglasnychka@gmail.edu, # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with the R software environment if not, write to the Free Software # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA # or see http://www.r-project.org/Licenses/GPL-2 ##END HEADER ##END HEADER suppressMessages(library(fields)) # # # test of fixed lambda case # Check against linear algebra # options( echo=FALSE) test.for.zero.flag<-1 #cat("A very nasty case with knots and weights",fill=TRUE) set.seed(123) x<- matrix( runif( 30), 15,2) Z<- matrix( rnorm(30), 15,2) y<- rnorm( 15)*.01 + 5*(x[,1]**3 + (x[,2]-.5)**2) + (Z[,1] +Z[,2])*.001 #weights<- runif(15)*10 # first without knots compare default to fixed out.new<- Krig( x,y,Z=Z, cov.function=Exp.cov, give.warnings=FALSE)-> out.new out.new2<- Krig( x,y,Z=Z, cov.function=Exp.cov, lambda=1) ########## ## compute test using linear algebra K<- Exp.cov( x,x) lambda<-1 M<- (lambda* diag(nrow( x)) + K) T<- cbind( rep(1,15), x, Z) temp.d<- c(solve( t(T) %*% solve( M)%*%T) %*% t(T)%*% solve( M) %*% y) temp.c<- solve( M)%*% ( y - T%*% temp.d) # test for d coefficients test.for.zero( out.new2$d, temp.d, tag=" d coef") # test for c coefficents test.for.zero( out.new2$c, temp.c, tag="c coef" ) ####### testing predict function hold2<- predict( out.new2, x=x, Z=Z, just.fixed=TRUE) hold3<- predict( out.new2, x=x, Z=Z, drop.Z=TRUE) hold4<- predict( out.new2, x=x, Z=Z, drop.Z=TRUE, just.fixed=TRUE) hold<-T%*%temp.d test.for.zero( hold, hold2, tag="predict for null fixed" ) hold<-T[,1:3]%*%temp.d[1:3] + K %*% temp.c test.for.zero( hold, hold3, tag="predict for null spatial" ) hold<-T[,1:3]%*%temp.d[1:3] test.for.zero( hold, hold4, tag="predict for null drift" ) ######tests where coefficients are recomputed from object hold2<- predict( out.new,y=y, lambda=1.0, x=x, Z=Z, just.fixed=TRUE) hold3<- predict( out.new,y=y, lambda=1.0, x=x, Z=Z, drop.Z=TRUE) hold4<- predict( out.new, y=y, lambda=1.0, x=x, Z=Z, drop.Z=TRUE, just.fixed=TRUE) hold<-T%*%temp.d test.for.zero( hold, hold2, tag="predict for null fixed" ) hold<-T[,1:3]%*%temp.d[1:3] + K %*% temp.c test.for.zero( hold, hold3, tag="predict for null spatial" ) hold<-T[,1:3]%*%temp.d[1:3] test.for.zero( hold, hold4, tag="predict for null drift " ) # ####### tests using predict.se x<- ChicagoO3$x y<- ChicagoO3$y Zcov<- x[,1]**3 + x[,2]**3 tps.fit<-Tps( x,y, scale.type="unscaled", Z= Zcov) # here is lazy way to get a grid.list gridList<- fields.x.to.grid( x, nx=20,ny=20) xg<- make.surface.grid(gridList) Zcov.grid<- xg[,1]**3 + xg[,2]**3 ########### tests on just predict have been commented out to ########### indicate that they are redundant given ########### previous tests however, they could be useful for ########### future debugging ... # full surface with covariate # curv.mean1 <- predictSurface(tps.fit, gridlist, extrap = TRUE, ## Z =Zcov.grid, drop.Z = FALSE)$z # just the spline surface # curv.mean2 <- predictSurface(tps.fit, gridlist, # extrap = TRUE,drop.Z=TRUE)$z # explicitly here is the difference surface of curv.mean1 and curv.mean2 # curv.mean0<- as.surface( gridlist, Zcov.grid* tps.fit$d[4])$z # test.for.zero( curv.mean1- curv.mean2, curv.mean0) ## new tests predictSurfaceSE( tps.fit, gridList, extrap=TRUE, drop.Z=TRUE)$z-> curv.var1 predictSE( tps.fit, xg, drop.Z=TRUE)-> curv.var2 test.for.zero( curv.var1, curv.var2) # SE with covariates included predictSE( tps.fit, xg, Z=Zcov.grid, drop.Z=FALSE)**2-> curv.var1 # as.surface( gridlist, curv.var1)$z-> curv.var1 # SE for just the spline part predictSE( tps.fit, xg, drop.Z=TRUE)**2-> curv.var2 # as.surface( gridlist, curv.var2)$z-> curv.var2 # SE for just the fixed part predictSE( tps.fit, xg,Z=Zcov.grid, drop.Z=FALSE, just.fixed=TRUE )**2-> curv.var3 # as.surface( gridlist, curv.var3)$z-> curv.var3 # calculating from more basic functions ## these tests assume that Krig.Amatrix is working correctly! out<- tps.fit A<- Krig.Amatrix( tps.fit,x= xg, drop.Z=TRUE) Sigma<- out$sigmahat*Rad.cov( out$x, out$x, p=2) S0<- out$sigmahat*Rad.cov(xg, xg, p=2) S1<- out$sigmahat*Rad.cov(out$x, xg, p=2) #yhat= Ay #var( f0 - yhat)= var( f0) - 2 cov( f0,yhat)+ cov( yhat) look<- S0 - t(S1)%*% t(A) - A%*%S1 + A%*% ( Sigma + diag(out$tauHat.MLE**2/out$weightsM))%*% t(A) look<- diag( look) test.for.zero(curv.var2 ,look,tag="SE w/o covariate") A<- Krig.Amatrix( tps.fit,x= xg, drop.Z=FALSE,Z=Zcov.grid) # see tps.fit$args for value of p Sigma<- out$sigmahat*Rad.cov( out$x, out$x, p=2) S0<- out$sigmahat*Rad.cov(xg, xg, p=2) S1<- out$sigmahat*Rad.cov(out$x, xg, p=2) #yhat= Ay #var( f0 - yhat)= var( f0) - 2 cov( f0,yhat)+ cov( yhat) look<- S0 - t(S1)%*% t(A) - A%*%S1 + A%*% ( Sigma + diag(out$tauHat.MLE**2/out$weightsM))%*% t(A) look<- diag( look) test.for.zero(curv.var1 ,look,tag="SE with covariate") A<- Krig.Amatrix( tps.fit,x= xg, drop.Z=FALSE,Z=Zcov.grid, just.fixed=TRUE) # see tps.fit$args for value of p Sigma<- out$sigmahat*Rad.cov( out$x, out$x, p=2) S0<- out$sigmahat*Rad.cov(xg, xg, p=2) S1<- out$sigmahat*Rad.cov(out$x, xg, p=2) #yhat= Ay #var( f0 - yhat)= var( f0) - 2 cov( f0,yhat)+ cov( yhat) look<- S0 - t(S1)%*% t(A) - A%*%S1 + A%*% ( Sigma + diag(out$tauHat.MLE**2/out$weightsM))%*% t(A) look<- diag( look) test.for.zero(curv.var3 ,look, tag="SE for fixed part") cat("All done with Z tests and Krig/Tps including predict and predictSE !", fill=TRUE) options( echo=TRUE) fields/tests/spam.test.Rout.save0000644000176200001440000000453714275255352016433 0ustar liggesusers R version 4.2.1 (2022-06-23) -- "Funny-Looking Kid" Copyright (C) 2022 The R Foundation for Statistical Computing Platform: x86_64-apple-darwin17.0 (64-bit) R is free software and comes with ABSOLUTELY NO WARRANTY. You are welcome to redistribute it under certain conditions. Type 'license()' or 'licence()' for distribution details. R is a collaborative project with many contributors. Type 'contributors()' for more information and 'citation()' on how to cite R or R packages in publications. Type 'demo()' for some demos, 'help()' for on-line help, or 'help.start()' for an HTML browser interface to help. Type 'q()' to quit R. > # > # fields is a package for analysis of spatial data written for > # the R software environment. > # Copyright (C) 2022 Colorado School of Mines > # 1500 Illinois St., Golden, CO 80401 > # Contact: Douglas Nychka, douglasnychka@gmail.edu, > # > # This program is free software; you can redistribute it and/or modify > # it under the terms of the GNU General Public License as published by > # the Free Software Foundation; either version 2 of the License, or > # (at your option) any later version. > # This program is distributed in the hope that it will be useful, > # but WITHOUT ANY WARRANTY; without even the implied warranty of > # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the > # GNU General Public License for more details. > # > # You should have received a copy of the GNU General Public License > # along with the R software environment if not, write to the Free Software > # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA > # or see http://www.r-project.org/Licenses/GPL-2 > ##END HEADER > ##END HEADER > > > # test of rdist.near > > > suppressMessages(library(fields)) > options(echo=FALSE) PASSED test at tolerance 1e-08 PASSED test at tolerance 1e-08 PASSED test at tolerance 1e-08 PASSED test at tolerance 1e-08 PASSED test at tolerance 1e-08 PASSED test at tolerance 1e-08 PASSED test at tolerance 1e-08 PASSED test at tolerance 1e-08 PASSED test at tolerance 1e-08 PASSED test at tolerance 1e-08 PASSED test at tolerance 1e-08 PASSED test at tolerance 1e-08 PASSED test at tolerance 1e-08 PASSED test at tolerance 1e-08 PASSED test at tolerance 1e-08 PASSED test at tolerance 1e-08 All done with SPAM tests > > proc.time() user system elapsed 0.987 0.085 1.072 fields/tests/Krig.test.Rout.save0000644000176200001440000000730214275255352016360 0ustar liggesusers R version 4.2.1 (2022-06-23) -- "Funny-Looking Kid" Copyright (C) 2022 The R Foundation for Statistical Computing Platform: x86_64-apple-darwin17.0 (64-bit) R is free software and comes with ABSOLUTELY NO WARRANTY. You are welcome to redistribute it under certain conditions. Type 'license()' or 'licence()' for distribution details. R is a collaborative project with many contributors. Type 'contributors()' for more information and 'citation()' on how to cite R or R packages in publications. Type 'demo()' for some demos, 'help()' for on-line help, or 'help.start()' for an HTML browser interface to help. Type 'q()' to quit R. > # > # fields is a package for analysis of spatial data written for > # the R software environment. > # Copyright (C) 2022 Colorado School of Mines > # 1500 Illinois St., Golden, CO 80401 > # Contact: Douglas Nychka, douglasnychka@gmail.edu, > # > # This program is free software; you can redistribute it and/or modify > # it under the terms of the GNU General Public License as published by > # the Free Software Foundation; either version 2 of the License, or > # (at your option) any later version. > # This program is distributed in the hope that it will be useful, > # but WITHOUT ANY WARRANTY; without even the implied warranty of > # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the > # GNU General Public License for more details. > # > # You should have received a copy of the GNU General Public License > # along with the R software environment if not, write to the Free Software > # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA > # or see http://www.r-project.org/Licenses/GPL-2 > ##END HEADER > ##END HEADER > > suppressMessages(library(fields)) > # > # > # test of fixed lambda case > # Check against linear algebra > # > > options( echo=FALSE) Testing: Compare d coef PASSED test at tolerance 1e-08 Testing: Compare c coef PASSED test at tolerance 1e-08 Testing: Compare d coef fixed lambda PASSED test at tolerance 1e-08 Testing: Compare c coef fixed lambda PASSED test at tolerance 1e-08 Testing: d coef Krig.coef PASSED test at tolerance 1e-08 Testing: c coef Krig.coef PASSED test at tolerance 1e-08 Testing: d coef Krig.coef fixed PASSED test at tolerance 1e-08 Testing: c coef Krig.coef fixed PASSED test at tolerance 1e-08 Testing: Amatrix no reps PASSED test at tolerance 5e-08 Testing: d coef new y PASSED test at tolerance 1e-08 Testing: c coef new y PASSED test at tolerance 1e-08 Testing: d coef new y fixed PASSED test at tolerance 1e-08 Testing: c coef new y fixed PASSED test at tolerance 1e-08 Testing: d coef several new y fixed PASSED test at tolerance 1e-08 Testing: c coef several new y fixed PASSED test at tolerance 1e-08 Testing: Tps with fixed lam PASSED test at tolerance 1e-08 Testing: Tps with fixed df PASSED test at tolerance 1e-08 Testing: Krig with fixed lam argument PASSED test at tolerance 1e-08 Warning: Grid searches over lambda (nugget and sill variances) with minima at the endpoints: (REML) Restricted maximum likelihood minimum at right endpoint lambda = 0.003053154 (eff. df= 14.25 ) Testing: d coef PASSED test at tolerance 1e-08 Testing: c coef PASSED test at tolerance 1e-08 Testing: d fixed case PASSED test at tolerance 1e-08 Testing: c fixed case PASSED test at tolerance 1e-08 Testing: d new y PASSED test at tolerance 1e-08 Testing: c new y PASSED test at tolerance 1e-08 Testing: testing A matrix PASSED test at tolerance 1e-08 Testing: testing A matrix new y PASSED test at tolerance 1e-08 Testing: checking trace PASSED test at tolerance 1e-08 Testing: GCV PASSED test at tolerance 1e-08 > proc.time() user system elapsed 1.043 0.079 1.108 fields/tests/Wend.test.R0000644000176200001440000000566414275214521014676 0ustar liggesusers# # fields is a package for analysis of spatial data written for # the R software environment. # Copyright (C) 2022 Colorado School of Mines # 1500 Illinois St., Golden, CO 80401 # Contact: Douglas Nychka, douglasnychka@gmail.edu, # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with the R software environment if not, write to the Free Software # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA # or see http://www.r-project.org/Licenses/GPL-2 ##END HEADER ##END HEADER # test of Wendland covariance and stationary.taper.cov suppressMessages(library(fields)) options( echo=FALSE) test.for.zero.flag<- 1 set.seed(123) x1<- matrix( runif(2*20), ncol=2) x2<- matrix( runif(2*10), ncol=2) fields.rdist.near( x1,x2, delta=.75)-> look temp<- matrix( NA, nrow(x1),nrow(x2)) temp[ look$ind] <- look$ra temp2<- rdist( x1, x2) temp2[ temp2> .75] <- NA #set.panel( 2,1) ; image.plot( temp); image.plot( temp2) temp[ is.na( temp)]<- 0 temp2[ is.na( temp2)]<- 0 test.for.zero( temp, temp2) # test of constructing covariance matrix # and also versions of Wendland function # default taper is wendland k=2. DD<- rdist( x1,x2) temp<- Wendland2.2(DD, aRange=.8) temp2<- Wendland( DD, aRange=.8, k=2, dimension=2) test.for.zero( temp, temp2) stationary.taper.cov( x1,x2, Taper="Wendland2.2", Taper.args= list( aRange=.8), spam.format=FALSE )-> look temp0<- look stationary.taper.cov( x1,x2, Taper="Wendland2.2", Taper.args= list( aRange=.8), spam.format=TRUE )-> look temp1<- spam2full( look) test.for.zero( temp1, temp0) stationary.taper.cov( x1,x2, Taper="Wendland", Taper.args= list( aRange=.8, k=2, dimension=2), spam.format=TRUE )-> look temp1b<- spam2full( look) temp2<- Wendland2.2(DD, aRange=.8) * Exponential(DD) temp3<- wendland.cov(x1,x2, k=2, aRange=.8) * Exponential(DD) temp4<- Wendland(DD, k=2, dimension=2, aRange=.8)* Exponential(DD) test.for.zero( temp1, temp0, rel=FALSE) test.for.zero( temp1b, temp0, rel=FALSE) test.for.zero( temp2, temp0, rel=FALSE) test.for.zero( temp2, temp3,rel=FALSE) test.for.zero( temp2, temp4,rel=FALSE) set.seed( 256) rv<- runif( nrow(x2)) # test of multiply stationary.taper.cov( x1, x2, C= rv)-> look temp2<-stationary.taper.cov( x1,x2) (as.matrix(temp2))%*%(rv)-> look2 test.for.zero( look, look2) temp2%*%(rv)-> look2 test.for.zero( look, look2) cat( "Done with testing Wendland family", fill=TRUE) options( echo=TRUE) fields/tests/offGridWeightsNew.test.R0000644000176200001440000001065214275214521017357 0ustar liggesusers# # fields is a package for analysis of spatial data written for # the R software environment. # Copyright (C) 2022 Colorado School of Mines # 1500 Illinois St., Golden, CO 80401 # Contact: Douglas Nychka, douglasnychka@gmail.edu, # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with the R software environment if not, write to the Free Software # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA # or see http://www.r-project.org/Licenses/GPL-2 ##END HEADER ##END HEADER # test of sreg and related functions suppressMessages(library(fields)) #options(echo=FALSE) test.for.zero.flag<- 1 # simple covariance function for implementation exp_cov <- function(dist){ sigma2<-1 covariance <- sigma2* exp(-dist / 10) # 10 is arbitrary return(covariance) } # ----------------------------- # Define grid and observations # ----------------------------- m<- 10 n<- 11 nx<- m ny<- n M<- 15 dx<- 1 dy<- 1 sigma2<-2.0 np<-3 # first a case where all obs in same grid box. # addition of "dx" also tests that this works when grid is not just integers # set dx=1 for the most basic case dx<- .5 s0<- rbind( c(5.1,6.2), c(5.1,6.5), c( 5.85,6.45) ) s0<- s0*dx test0<- offGridWeights( s0, list( x= (1:m)*dx, y=(1:n)*dx), aRange=10*dx, sigma2=sigma2, Covariance="Exponential", np=2, debug=TRUE) # explicit nearest neighbors in this case sTmp<- cbind( rep(4:7,4), rep(5:8,each=4) ) sGrid<- sTmp*dx # check that same grid being used by function test.for.zero(sGrid, cbind(test0$gridX[,1], test0$gridY[,1]) ) S21 <- 2.0* exp( -rdist( s0, sGrid)/(10*dx)) S11 <- 2.0* exp( -rdist( sGrid , sGrid)/(10*dx) ) S22 <- 2.0* exp( -rdist( s0, s0)/(10*dx)) # local weights applied for prediction Btest<- S21%*% solve( S11) # find indices for neigborhood sIndex<- sTmp[,1] + (sTmp[,2]-1)*m # Kriging weights Bfull<- spam2full(test0$B[,sIndex]) test.for.zero( Bfull, Btest) # standard error matrix # note that transpsoe also taken so SEtest%*%t( SEtest) = cov matrix SEtest<- t(chol(S22 - S21%*% solve( S11)%*%t(S21) )) SEfull <- spam2full(test0$SE) test.for.zero( SEfull, SEtest) # now test several observation locations dx<- .45 s<- rbind( c(5.1,6.2), c(7.1,7.2), c(5.1,6.5), c(8.5,4.4), c( 5.85,6.45), c(7.3,7.4) ) s<- s * dx # Note s0 from above is s[c(1,3,5),] ind1<- c(1,3,5) sTmp<- cbind( rep(4:7,4), rep(5:8,each=4) ) sGrid<- sTmp*dx sIndex<- sTmp[,1] + (sTmp[,2]-1)*m S21<- 2.0* exp( -rdist( s[ind1,], sGrid)/(10*dx) ) S11<- 2.0* exp( -rdist( sGrid , sGrid)/(10*dx) ) S22<- 2.0* exp( -rdist( s[ind1,], s[ind1,])/(10*dx) ) sparseObj<- offGridWeights( s, list( x= (1:m)*dx, y=(1:n)*dx), aRange=(10*dx), sigma2=sigma2, Covariance="Exponential", np=2, debug=TRUE) test.for.zero( sparseObj$Sigma21Star[ind1,], S21 ) test.for.zero( sparseObj$Sigma11Inv, solve(S11) ) Btest<- S21%*% solve( S11) look2<- spam2full( sparseObj$B) test.for.zero( Btest,look2[ind1, sIndex] ) SEfull<- spam2full( sparseObj$SE) SE2full<- (SEfull)%*%t(SEfull) test.for.zero(diag( SE2full), sparseObj$predictionVariance ) SEtest<- t(chol(S22 - S21%*%solve( S11)%*%t( S21) )) test.for.zero(SEtest, SEfull[ind1, ind1] ) # check that debug FALSE also works sparseObj1<- offGridWeights( s, list( x= (1:m)*dx, y=(1:n)*dx), aRange=(10*dx), sigma2=sigma2, Covariance="Exponential", np=2, debug=FALSE) test.for.zero( sparseObj$B, sparseObj1$B) test.for.zero( sparseObj$SE, sparseObj1$SE) cat("all done with off grid weight tests part 2", fill=TRUE) fields/tests/Krig.se.test.R0000644000176200001440000001046514275214521015276 0ustar liggesusers# # fields is a package for analysis of spatial data written for # the R software environment. # Copyright (C) 2022 Colorado School of Mines # 1500 Illinois St., Golden, CO 80401 # Contact: Douglas Nychka, douglasnychka@gmail.edu, # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with the R software environment if not, write to the Free Software # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA # or see http://www.r-project.org/Licenses/GPL-2 ##END HEADER ##END HEADER suppressMessages(library(fields)) # tests of predictSE # against direct linear algebra #options( echo=FALSE) x0<- expand.grid( c(-8,-4,0,20,30), c(10,8,4,0)) out<- Krig( ChicagoO3$x, ChicagoO3$y, cov.function = "Exp.cov", aRange=50) # direct calculation Krig.Amatrix( out, x=x0)-> A test.for.zero( A%*%ChicagoO3$y, predict( out, x0),tag="Amatrix vs. predict") Sigma<- out$sigmahat*Exp.cov( ChicagoO3$x, ChicagoO3$x, aRange=50) S0<- out$sigmahat*c(Exp.cov( x0, x0, aRange=50)) S1<- out$sigmahat*Exp.cov( out$x, x0, aRange=50) #yhat= Ay #var( f0 - yhat)= var( f0) - 2 cov( f0,yhat)+ cov( yhat) look<- S0 - t(S1)%*% t(A) - A%*%S1 + A%*% ( Sigma + diag(out$tauHat.MLE**2/out$weightsM))%*% t(A) # #compare to # diagonal elements test2<- predictSE( out, x= x0) test.for.zero( sqrt(diag( look)), test2,tag="Marginal predictSE") out2<- Krig( ChicagoO3$x, ChicagoO3$y, cov.function = "Exp.cov", aRange=50, lambda=out$lambda) test2<- predictSE( out2, x= x0) test.for.zero( sqrt(diag( look)), test2,tag="Marginal predictSE fixed ") test<- predictSE( out, x= x0, cov=TRUE) test.for.zero( look, test,tag="Full covariance predictSE") # simulation based. set.seed( 333) sim.Krig( out, x0,M=4e3)-> test # columns are the realizations rows are locations var(t(test))-> look predictSE( out, x=x0)-> test2 mean( diag( look)/ test2**2)-> look2 test.for.zero(look2, 1.0, tol=1.5e-2, tag="Marginal standard Cond. Sim.") predictSE( out, x=x0, cov=TRUE)-> test2 # multiply simulated values by inverse square root of covariance # to make them white eigen( test2, symmetric=TRUE)-> hold hold$vectors%*% diag( 1/sqrt( hold$values))%*% t( hold$vectors)-> hold cor(t(test)%*% hold)-> hold2 # off diagonal elements of correlations -- expected values are zero. abs(hold2[ col(hold2)> row( hold2)])-> hold3 test.for.zero( mean(hold3), 0, relative=FALSE, tol=.02, tag="Full covariance standard Cond. Sim.") # test of A matrix # # first create and check a gridded test case. data( ozone2) as.image(ozone2$y[16,], x= ozone2$lon.lat, ny=24, nx=20, na.rm=TRUE)-> dtemp # # A useful disctrtized version of ozone2 data x<- dtemp$xd y<- dtemp$z[ dtemp$ind] weights<- dtemp$weights[ dtemp$ind] Krig( x, y, Covariance="Matern", aRange=1.0, smoothness=1.0, weights=weights) -> out set.seed(234) ind0<- cbind( sample( 1:20, 5), sample( 1:24, 5)) x0<- cbind( dtemp$x[ind0[,1]], dtemp$y[ind0[,2]]) # an inline check plot(out$x, cex=2); points( x0, col="red", pch="+",cex=2) # direct calculation as backup ( also checks weighted case) Krig.Amatrix( out, x=x0)-> A test.for.zero( A%*%out$yM, predict( out, x0),tag="Amatrix vs. predict") Sigma<- out$sigmahat*stationary.cov( out$xM, out$xM, aRange=1.0,smoothness=1.0, Covariance="Matern") S0<- out$sigmahat*stationary.cov( x0, x0, aRange=1.0,smoothness=1.0, Covariance="Matern") S1<- out$sigmahat*stationary.cov( out$xM, x0, aRange=1.0,smoothness=1.0, Covariance="Matern") #yhat= Ay #var( f0 - yhat)= var( f0) - 2 cov( f0,yhat)+ cov( yhat) look<- S0 - t(S1)%*% t(A) - A%*%S1 + A%*% ( Sigma + diag(out$tauHat.MLE**2/out$weightsM) )%*% t(A) test<- predictSE( out, x0, cov=TRUE) test.for.zero( c( look), c( test), tag="Weighted case and exact for ozone2 full cov", tol=1e-8) cat("all done testing predictSE.Krig ", fill=TRUE) options( echo=TRUE) fields/tests/Tps.test.R0000644000176200001440000002112714456244534014547 0ustar liggesusers# # fields is a package for analysis of spatial data written for # the R software environment. # Copyright (C) 2022 Colorado School of Mines # 1500 Illinois St., Golden, CO 80401 # Contact: Douglas Nychka, douglasnychka@gmail.edu, # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with the R software environment if not, write to the Free Software # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA # or see http://www.r-project.org/Licenses/GPL-2 ##END HEADER ##END HEADER suppressMessages(library(fields)) options(echo=FALSE) test.for.zero.flag<- 1 data(ozone2) x<- ozone2$lon.lat y<- ozone2$y[16,] temp<- Rad.cov( x,x, p=2) temp2<- RadialBasis( rdist( x,x), M=2, dimension=2) temp3<- rdist( x,x) temp3 <- ifelse( abs(temp3) < 1e-14, 0,log( temp3)*(temp3^2) ) temp3<- radbas.constant( 2,2)*temp3 test.for.zero( temp, temp2, tag="Tps radial basis function 2d") test.for.zero( temp, temp3, tag="Tps radial basis function 2d") test.for.zero( temp2,temp3, tag="Tps radial basis function 2d") set.seed( 123) xtemp<- matrix( runif( 40*3), ncol=3) temp<- Rad.cov( xtemp,xtemp, p= 2*4-3) temp2<- RadialBasis( rdist( xtemp,xtemp), M=4, dimension=3) temp3<- rdist( xtemp,xtemp) temp3 <- ifelse( abs(temp3) < 1e-14, 0, temp3^(2*4 -3) ) temp3<- radbas.constant( 4,3)*temp3 test.for.zero( temp, temp2, tag="Tps radial basis function 3d") test.for.zero( temp, temp3, tag="Tps radial basis function 3d") test.for.zero( temp2,temp3, tag="Tps radial basis function 3d") #### testing multiplication of a vector #### mainly to make the FORTRAN has been written correctly #### after replacing the ddot call with an explicit do loop set.seed( 123) C<- matrix( rnorm( 10*5),10,5 ) x<- matrix( runif( 10*2), 10,2) temp3<- rdist( x,x) K<- ifelse( abs(temp3) < 1e-14, 0,log( temp3)*(temp3^2) ) K<- K * radbas.constant( 2,2) test.for.zero( Rad.cov( x,x,m=2, C=C) , K%*%C, tol=1e-10) set.seed( 123) C<- matrix( rnorm( 10*5),10,5 ) x<- matrix( runif( 10*3), 10,3) temp3<- rdist( x,x) K<- ifelse( abs(temp3) < 1e-14, 0,(temp3^(2*4-3)) ) K<- K * radbas.constant( 4,3) test.for.zero( Rad.cov( x,x,m=4, C=C) , K%*%C,tol=1e-10) ##### testing derivative formula set.seed( 123) C<- matrix( rnorm( 10*1),10,1 ) x<- matrix( runif( 10*2), 10,2) temp0<- Rad.cov( x,x, p=4, derivative=1, C=C) eps<- 1e-6 temp1<- ( Rad.cov( cbind(x[,1]+eps, x[,2]),x, p=4, derivative=0, C=C) - Rad.cov( cbind(x[,1]-eps, x[,2]),x, p=4, derivative=0, C=C) )/ (2*eps) temp2<- ( Rad.cov( cbind(x[,1], x[,2]+eps),x, p=4, derivative=0, C=C) - Rad.cov( cbind(x[,1], x[,2]-eps),x , p=4,derivative=0,C=C) )/ (2*eps) test.for.zero( temp0[,1], temp1, tag=" der of Rad.cov", tol=1e-6) test.for.zero( temp0[,2], temp2, tag=" der of Rad.cov", tol=1e-6) # comparing Rad.cov used by Tps with simpler function called # by stationary.cov set.seed( 222) x<- matrix( runif( 10*2), 10,2) C<- matrix( rnorm( 10*3),10,3 ) temp<- Rad.cov( x,x, p=2, C=C) temp2<- RadialBasis( rdist( x,x), M=2, dimension=2)%*%C test.for.zero( temp, temp2) #### Basic matrix form for Tps as sanity check data("ozone2") s<- ozone2$lon.lat y<- ozone2$y[16,] good<- !is.na( y) s<- s[good,] y<- y[good] data(ozone2) obj<-Tps( s,y, scale.type="unscaled", with.constant=FALSE) # now work out the matrix expressions explicitly lam.test<- obj$lambda N<-length(y) Tmatrix<- cbind( rep( 1,N), s) D<- rdist( s,s) R<- ifelse( D==0, 0, D**2 * log(D)) A<- rbind( cbind( R+diag(lam.test,N), Tmatrix), cbind( t(Tmatrix), matrix(0,3,3))) hold<-solve( A, c( y, rep(0,3))) c.coef<- hold[1:N] d.coef<- hold[ (1:3)+N] zhat<- R%*%c.coef + Tmatrix%*% d.coef test.for.zero( zhat, obj$fitted.values, tag="Tps 2-d m=2 sanity check") # out of sample prediction snew<- rbind( c( -87,41), c( -81,44) ) T1<- cbind( 1, snew) D<- rdist( snew,s) R1<- ifelse( D==0, 0, D**2 * log(D)) z1<- R1%*%c.coef + T1%*% d.coef test.for.zero( z1, predict( obj, x=snew), tag="Tps 2-d m=2 sanity predict") #### test Tps verses Krig note scaling must be the same out<- Tps( s,y) out2<- Krig( s,y, Covariance="RadialBasis", M=2, dimension=2, scale.type="range", method="GCV") test.for.zero( predict(out), predict(out2), tag="Tps vs. Krig w/ GCV") # test for fixed lambda test.for.zero( predict(out,lambda=.1), predict(out2, lambda=.1), tag="Tps vs. radial basis w Krig") #### testing derivative using predict function set.seed( 233) x<- matrix( (rnorm( 1000)*2 -1), ncol=2) y<- (x[,1]**2 + 2*x[,1]*x[,2] - x[,2]**2)/2 out<- Tps( x, y, scale.type="unscaled") xg<- make.surface.grid( list(x=seq(-.7,.7,,10), y=seq(-.7,.7,,10)) ) test<- cbind( xg[,1] + xg[,2], xg[,1] - xg[,2]) # test<- xg look<- predictDerivative.Krig( out, x= xg) test.for.zero( look[,1], test[,1], tol=1e-3) test.for.zero( look[,2], test[,2], tol=1e-3) ############################################################ ### testing Tps version using spatialProcess and Tps.cov ############################################################ set.seed(222) n<- 50 x1<- cbind( runif(n), runif(n))*100 x2<- cbind( runif(5), runif(5)) #x2<- x1 cardinalX<- cbind( runif(3), runif(3)) m<- 2 # simple check of marginal variances look<- Tps.cov( x1,x1,cardinalX, m=m) look2<- Tps.cov( x1,cardinalX=cardinalX, m=m, marginal=TRUE) test.for.zero(diag(look), look2, tag="Tps.cov marginal" ) ## comparing with the Tps function data("ozone2") s<- ozone2$lon.lat y<- ozone2$y[16,] good<- !is.na( y) s<- s[good,] y<- y[good] ##### Tps used as benchmark out0<- Tps( s,y, scale.type ="unscaled", method="REML") lambdaHat<- out0$lambda.est[6,1] fHat<- predict( out0) cardinalX<- s[1:3,] out2<- mKrig( s,y, cov.function="Tps.cov", cov.args= list( cardinalX=cardinalX, aRange=NA), m=2,lambda=lambdaHat ) # should be invariant to cardinal points and not need aRange =NA # defaults supplied by spatialProcessSetDefaults when detecting Tps.cov out3<- spatialProcess( s, y, cov.function="Tps.cov", mKrig.args = list(m=2, NtrA = 200), lambda=lambdaHat ) out4<- spatialProcess( s, y, cov.function="Tps.cov", cov.args= list( aRange=NA), #REML=TRUE, verbose=FALSE, gridN=50 ) test.for.zero(fHat, predict( out2, s), tag="Tps vs spatialProcess" ) # other parameters and likelihood test.for.zero(out0$tauHat.MLE, out3$summary["tau"],tag="Tps vs spatialProcess tau" ) test.for.zero(fHat, predict( out3, s), tag="Tps vs spatialProcess default" ) # eff.df exact for spatialProcess because nTrA is larger than # sample size. test.for.zero( out0$eff.df, out3$summary["eff.df"], tag="Eff.df Tps vs spatialProcess") # look at prediction standard error computation. SE0<- predictSE( out0, s) SE3<- predictSE( out3,s) test.for.zero(SE0, SE3, tag="Tps vs spatialProcess SE") # compare REML for Tps and spatialProcess # test.for.zero(out0$lambda.est["REML", "-lnLike Prof"], # out4$summary["lnProfileREML.FULL"], # tag="Tps vs spatialProcess REML log like" ) # test.for.zero(out0$lambda.est["REML", "lambda"], # out4$summary["lambda"], # tag="Tps vs spatialProcess w REML lambda Hat" ) # gridList<- fields.x.to.grid( s, nx=20, ny=20) sGrid<- make.surface.grid( gridList) fHatGrid0<- predict( out0, sGrid) fHatGrid3<- predict( out3,sGrid) test.for.zero(fHatGrid0,fHatGrid3, tag="Tps vs spatialProcess predictions on a grid") fHatGrid0SE<- predict( out0, sGrid) fHatGrid3SE<- predict( out3,sGrid) test.for.zero(fHatGrid0SE,fHatGrid3SE, tag="Tps vs spatialProcess SE predictions on a grid") options( echo=TRUE) cat("all done testing Tps and spatialProcess with Tps.cov", fill=TRUE) # # lambda0<- out0$lambda.est["REML", "lambda"] # # Krig.flplike(out0, lambda0) fields/tests/derivative.test.R0000644000176200001440000001702214275214521016132 0ustar liggesusers# # fields is a package for analysis of spatial data written for # the R software environment. # Copyright (C) 2022 Colorado School of Mines # 1500 Illinois St., Golden, CO 80401 # Contact: Douglas Nychka, douglasnychka@gmail.edu, # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with the R software environment if not, write to the Free Software # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA # or see http://www.r-project.org/Licenses/GPL-2 ##END HEADER ##END HEADER #library( fields, lib.loc="lib.test") suppressMessages(library(fields)) options(echo=FALSE) test.for.zero.flag<- 1 DD<- cbind( seq(.01,2,,50)) look2<- RadialBasis(DD, dimension=2,M=3,derivative=1) look1<- ( RadialBasis(DD+1e-5, dimension=2,M=3,derivative=0 ) - RadialBasis(DD-1e-5, dimension=2,M=3,derivative=0))/2e-5 test.for.zero( look1, look2,tol=1e-6, tag="radial basis function exact" ) set.seed( 234) x<- matrix( runif(10), ncol=2) ctest<- rep(0,5) ctest[3]<- 1 stationary.cov( x,x, Covariance="RadialBasis", dimension=2,M=3,derivative=0)-> look0 RadialBasis( rdist(x,x), dimension=2,M=3,derivative=0)-> sanity.look test.for.zero( look0, sanity.look, tag="sanity test of stationary.cov with RadialBasis") Rad.cov(x,x,p= (2*3 -2))-> look1 test.for.zero( sanity.look, look1, tag="sanity test of Rad.cov") sanity.look%*% ctest->look0 stationary.cov( x,x, Covariance="RadialBasis", dimension=2,M=3, derivative=0, C=ctest)-> look test.for.zero( look0, look, tag="stat.cov Radbas C multiply") Rad.cov(x,x,p= (2*3 -2), C=ctest)-> look1 test.for.zero( look0, look1, tag="Rad.cov C multiply") ############################ end of radial basis DD<- cbind( seq(.01,2,,50)) look2<- Wendland(DD, aRange=1.0, dimension=2,k=3,derivative=1) look1<- (Wendland(DD+1e-5, aRange=1.0, dimension=2,k=3) - Wendland(DD-1e-5, aRange=1.0, dimension=2,k=3))/2e-5 test.for.zero( look1, look2,tol=1e-6) look2<- Wendland(DD, aRange=1.5, dimension=2,k=3,derivative=1) look1<- (Wendland(DD+1e-5, aRange=1.5, dimension=2,k=3) - Wendland(DD-1e-5, aRange=1.5, dimension=2,k=3))/2e-5 test.for.zero( look1, look2,tol=1e-6, tag="Wendland exact") x<- seq( -1,1,,5) ctest<- rep(0,5) ctest[3]<- 1 wendland.cov( x,x, k=2, aRange=.75)-> look0 Wendland( rdist(x,x)/.75, k=2, dimension=1)-> sanity.look test.for.zero( look0, sanity.look) look0%*% ctest->look0 wendland.cov( x,x, k=2, aRange=.75, C=ctest, derivative=0)-> look test.for.zero( look0, look, tag="Wendland C multiply") wendland.cov( x,x, k=2, aRange=1.0, C=ctest, derivative=1)-> look wendland.cov( x+1e-5, x, k=2, aRange=1.0, C=ctest)- wendland.cov( x-1e-5, x, k=2, aRange=1.0, C=ctest)-> look2 look2<- look2/2e-5 test.for.zero( look, look2,tol=1e-7, tag="Wendland.cov aRange=1.0") wendland.cov( x,x, k=2, aRange=.75, C=ctest, derivative=1)-> look wendland.cov( x+1e-5, x, k=2, aRange=.75, C=ctest)- wendland.cov( x-1e-5, x, k=2, aRange=.75, C=ctest)-> look2 look2<- look2/2e-5 test.for.zero( look, look2,tol=1e-7, tag="Wendland.cov aRange=.75") stationary.cov( x,x, Covariance="Wendland", dimension=1, k=2, aRange=1.0, C=ctest, derivative=0)-> look look0<- Wendland( rdist(x,x), k=2, dimension=1)%*%ctest test.for.zero( look0, look, tag="stationary.cov and exact C multiply for Wendland") wendland.cov( x,x, k=2,C=ctest, aRange=1.0)-> look look0<- Wendland( rdist(x,x), k=2, dimension=1)%*%ctest test.for.zero( look0, look, tag=" Wendland C multiply") ####### 2 -d quadratic surface x<- make.surface.grid( list(x=seq( -1,1,,20), y=seq( -1,1,,20))) y<- (.123*x[,1] + .234*x[,2]) obj<- mKrig( x,y, lambda=0, cov.function="wendland.cov", k=3, aRange=.4) xp<- make.surface.grid( list(x=seq(-.5,.5,,24),y= seq( -.5,.5,,24)) ) predict( obj, xp, derivative=1)-> outd test.for.zero( outd[,1],.123, tag="2-d derivs from wend.cov/mKrig") test.for.zero( outd[,2],.234) #%%%%%%%% repeat to check derivatives in stationary.cov x<- make.surface.grid( list(x=seq( -1,1,,20), y=seq( -1,1,,20))) y<- (.123*x[,1] + .234*x[,2]) obj<- mKrig( x,y, lambda=0, cov.function="stationary.cov", cov.args=list(k=3, aRange=.2, dimension=2, Covariance="Wendland")) xp<- make.surface.grid( list(x=seq(-.5,.5,,24),y= seq( -.5,.5,,24)) ) predict( obj, xp, derivative=1)-> outd test.for.zero( outd[,1],.123, tag="2-d derivs from stationary-wend/mKrig") test.for.zero( outd[,2],.234) ############## quadratic surface x<- make.surface.grid( list(x=seq( -1,1,,20), y=seq( -1,1,,20))) y<- (x[,1]**2 - 2* x[,1]*x[,2] + x[,2]**2)/2 ############## wendland.cov obj<- mKrig( x,y, lambda=0, cov.function="wendland.cov", k=3, aRange=.8) xp<- make.surface.grid( list(x=seq(-.5,.5,,24),y= seq( -.5,.5,,24)) ) true<- cbind( xp[,1] - xp[,2], xp[,2]- xp[,1]) ############## wendland.cov predict( obj, xp, derivative=1)-> outd rmse<-sqrt(mean((true[,1] - outd[,1])**2))/sqrt(mean(true[,1]**2)) test.for.zero( rmse,0, tol=5e-3,relative=FALSE, tag="wendland.cov quad 2-d") ############## stationary cov x<- make.surface.grid( list(x=seq( -1,1,,20), y=seq( -1,1,,20))) y<- (x[,1]**3 + x[,2]**3) obj<- mKrig( x,y, lambda=0, cov.function="stationary.cov", cov.args=list(k=3, aRange=.8, dimension=2, Covariance="Wendland")) xp<- make.surface.grid( list(x=seq(-.5,.5,,24),y= seq( -.5,.5,,24)) ) true<- cbind( 3*xp[,1]**2 , 3*xp[,2]**2) predict( obj, xp, derivative=1)-> outd2 rmse<-sqrt(mean((true[,1] - outd2[,1])**2))/sqrt(mean(true[,1]**2)) test.for.zero( rmse,0, tol=1e-2,relative=FALSE, tag="stationary.cov/Wendland cubic 2-d") ############## stationary cov with radial basis x<- make.surface.grid( list(x=seq( -1,1,,20), y=seq( -1,1,,20))) y<- (x[,1]**3 + x[,2]**3) obj<- Krig( x,y, cov.function="stationary.cov", m=3, cov.args=list(M=3, dimension=2, Covariance="RadialBasis")) xp<- make.surface.grid( list(x=seq(-.5,.5,,24),y= seq( -.5,.5,,24)) ) true<- cbind( 3*xp[,1]**2 , 3*xp[,2]**2) predictDerivative.Krig( obj, xp)-> outd2 look<- as.surface( xp, outd2[,1]) rmse<-sqrt(mean((true[,1] - outd2[,1])**2))/sqrt(mean(true[,1]**2)) test.for.zero( rmse,0, tol=5e-3,relative=FALSE, tag="stationary.cov/Wendland cubic 2-d") ######################### x<- make.surface.grid( list(x=seq( -1,1,,20), y=seq( -1,1,,20))) y<- (x[,1]**3 + x[,2]**3) obj<- mKrig( x,y, lambda=0, cov.function="wendland.cov", k=3, V=diag(c( 1.1,1.1) )) xp<- make.surface.grid( list(x=seq(-.5,.5,,24),y= seq( -.5,.5,,24)) ) predict( obj, xp, derivative=1)-> outd true<- cbind( 3*xp[,1]**2 , 3*xp[,2]**2) rmse<-sqrt(mean((true[,1] - outd[,1])**2)/mean(true[,1]**2)) test.for.zero( rmse,0, tol=5e-3,relative=FALSE) obj<- Tps( x,y,lambda=0) predictDerivative.Krig( obj, xp, derivative=1)-> outd look<- as.surface( xp, outd[,1]) rmse<-sqrt(mean((true[,1] - outd[,1])**2)/mean(true[,1]**2)) test.for.zero( rmse,0, tol=2e-4,relative=FALSE, tag="Tps derivative x1") rmse<-sqrt(mean((true[,2] - outd[,2])**2)/mean(true[,2]**2)) test.for.zero( rmse,0, tol=2e-4,relative=FALSE, tag="Tps derivative x2") cat("done with dervative tests", fill=TRUE) options( echo=TRUE) fields/tests/KrigGCVREML.test.R0000644000176200001440000000731714275214521015712 0ustar liggesusers# # fields is a package for analysis of spatial data written for # the R software environment. # Copyright (C) 2022 Colorado School of Mines # 1500 Illinois St., Golden, CO 80401 # Contact: Douglas Nychka, douglasnychka@gmail.edu, # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with the R software environment if not, write to the Free Software # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA # or see http://www.r-project.org/Licenses/GPL-2 ##END HEADER ##END HEADER suppressMessages(library(fields)) # # # options( echo=FALSE) test.for.zero.flag<-1 ############ various tests of GCV and REML set.seed(133) x0<- matrix( runif( 10*2), 10,2)*2 x<- rbind( x0,x0, x0[3:7,]) y<- rnorm( nrow( x))*.05 + x[,1]**2 + x[,2]**2 weights<- 8 + runif( nrow( x)) # x0 are the unique values. out.new<- Krig( x,y, weights=weights, cov.function=Exp.cov) n<- length(y) n0<- nrow( x0) NK <- nrow( x0) NP<- NK + 3 K<- Exp.cov( x0, x0) H<- matrix(0, NP,NP) H[(1:NK)+3 , (1:NK)+3]<- K X<- cbind( fields.mkpoly( x, 2), Exp.cov( x, x0) ) X0<- cbind( fields.mkpoly( x0, 2), Exp.cov( x0, x0) ) Alam <- X%*%solve( t(X)%*%diag(weights)%*%X + out.new$lambda*H )%*% t(X)%*%diag(weights) # predict sanity check using replicates set.seed( 123) ynew<- rnorm(n) test.for.zero( Alam%*%ynew, predict( out.new, y=ynew), tag=" predict sanity check",tol=3e-8) # predict using unique obs ynew<- rnorm(nrow(x0)) Alam0<- X0%*%solve( t(X0)%*%diag(out.new$weightsM)%*%X0 + out.new$lambda*H )%*% t(X0)%*%diag(out.new$weightsM) # Alam0 is the A matrix test.for.zero( Alam0%*%ynew, predict( out.new,x=x0, yM=ynew), tag="predict using direct linear algebra" ) # test<- Krig.fgcv( lam=out.new$lambda, out.new) y0<- out.new$yM n0<- length(y0) # compare to #test2<- (1/n0)*sum( (y0 - c(Alam0%*% y0))**2 *out.new$weightsM) / (1- sum(diag( Alam0))/n0)**2 NUM<- mean( (y0 - c(Alam0%*% y0))**2 *out.new$weightsM) + out.new$pure.ss/( n -n0 ) DEN<- (1- sum(diag( Alam0))/n0) test2<- NUM/ DEN^2 test.for.zero( test,test2, tag="GCV" ) test<- Krig.fgcv.one( lam=out.new$lambda, out.new) N<- length(y) test2<- (1/N)*sum( (y - c(Alam%*% y))**2 *weights) / (1- sum(diag( Alam))/N)**2 test.for.zero( test,test2, tag="GCV one" ) test<- Krig.fgcv.model( lam=out.new$lambda, out.new) y0<- out.new$yM n0<- length(y0) # compare to test2<- (1/n0)*sum( (y0 - c(Alam0%*% y0))**2 *out.new$weightsM) / (1- sum(diag( Alam0))/n0)**2 + out.new$tauHat.pure.error**2 test.for.zero( test,test2,tag="GCV model") ####### tests with higher level gcv.Krig data( ozone2) x<- ozone2$lon.lat y<- ozone2$y[16,] Tps( x,y)-> out KrigFindLambda( out, tol=1e-10)-> out2 test.for.zero(out$lambda.est[1,-6], out2$lambda.est[1,-6],tol=5e-4, tag="Tps/gcv for ozone2") # try with "new" data (linear transform should give identical # results for GCV eff df KrigFindLambda( out, y=(11*out$y + 5), tol=1e-10 )-> out3 test.for.zero(out2$lambda.est[1,2], out3$lambda.est[1,2],tol=1e-6, tag="Tps/gcv for ozone2 new data") #cat("done with GCV case", fill=TRUE) cat("done with GCV and REML tests", fill=TRUE) options( echo=TRUE) fields/tests/mKrig.Z.R0000644000176200001440000000433114275214521014272 0ustar liggesusers# # fields is a package for analysis of spatial data written for # the R software environment. # Copyright (C) 2022 Colorado School of Mines # 1500 Illinois St., Golden, CO 80401 # Contact: Douglas Nychka, douglasnychka@gmail.edu, # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with the R software environment if not, write to the Free Software # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA # or see http://www.r-project.org/Licenses/GPL-2 ##END HEADER ##END HEADER suppressMessages(library(fields)) options( echo=FALSE) test.for.zero.flag<- 1 data(COmonthlyMet) y<- CO.tmin.MAM.climate good<- !is.na( y) y<-y[good] x<- CO.loc[good,] Z<- CO.elev[good] out<- mKrig( x,y, Z=Z, cov.function="stationary.cov", Covariance="Matern", aRange=4.0, smoothness=1.0, lambda=.1) out2<- Krig( x,y, Z=Z, cov.function="stationary.cov", Covariance="Matern", aRange=4.0, smoothness=1.0, lambda=.1, GCV=TRUE) test.for.zero( predict( out), predict(out2), tag="Full prediction") test.for.zero( predict( out, drop.Z=TRUE), predict(out2, drop.Z=TRUE), tag=" prediction dropping Z") xnew<- CO.loc[!good,] Znew<- CO.elev[!good] temp1<- predict( out, xnew=xnew, drop.Z=TRUE) temp2<- predict( out2, x=xnew, drop.Z=TRUE) test.for.zero( temp1,temp2, tag="new x's dropping Z") temp1<- predict( out, xnew=xnew, Z=Znew) temp2<- predict( out2, x=xnew, Z=Znew) test.for.zero( temp1,temp2, tag="new x's new Z's") temp1<- predictSurface( out, nx=20, ny=20, drop.Z=TRUE, extrap=TRUE) temp2<- predictSurface( out2, nx=20, ny=20, drop.Z=TRUE, extrap=TRUE) test.for.zero( temp1$z,temp2$z, tag="predicting on surface with drop.Z") cat("all done with mKrig Z tests", fill=TRUE) options( echo=TRUE) fields/tests/KrigGCVREML.test.Rout.save0000644000176200001440000000471414275255352017404 0ustar liggesusers R version 4.2.1 (2022-06-23) -- "Funny-Looking Kid" Copyright (C) 2022 The R Foundation for Statistical Computing Platform: x86_64-apple-darwin17.0 (64-bit) R is free software and comes with ABSOLUTELY NO WARRANTY. You are welcome to redistribute it under certain conditions. Type 'license()' or 'licence()' for distribution details. R is a collaborative project with many contributors. Type 'contributors()' for more information and 'citation()' on how to cite R or R packages in publications. Type 'demo()' for some demos, 'help()' for on-line help, or 'help.start()' for an HTML browser interface to help. Type 'q()' to quit R. > # > # fields is a package for analysis of spatial data written for > # the R software environment. > # Copyright (C) 2022 Colorado School of Mines > # 1500 Illinois St., Golden, CO 80401 > # Contact: Douglas Nychka, douglasnychka@gmail.edu, > # > # This program is free software; you can redistribute it and/or modify > # it under the terms of the GNU General Public License as published by > # the Free Software Foundation; either version 2 of the License, or > # (at your option) any later version. > # This program is distributed in the hope that it will be useful, > # but WITHOUT ANY WARRANTY; without even the implied warranty of > # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the > # GNU General Public License for more details. > # > # You should have received a copy of the GNU General Public License > # along with the R software environment if not, write to the Free Software > # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA > # or see http://www.r-project.org/Licenses/GPL-2 > ##END HEADER > ##END HEADER > > > suppressMessages(library(fields)) > # > # > # > > options( echo=FALSE) Warning: Grid searches over lambda (nugget and sill variances) with minima at the endpoints: (REML) Restricted maximum likelihood minimum at right endpoint lambda = 0.2767992 (eff. df= 9.499985 ) Testing: predict sanity check PASSED test at tolerance 3e-08 Testing: predict using direct linear algebra PASSED test at tolerance 1e-08 Testing: GCV PASSED test at tolerance 1e-08 Testing: GCV one PASSED test at tolerance 1e-08 Testing: GCV model PASSED test at tolerance 1e-08 Testing: Tps/gcv for ozone2 PASSED test at tolerance 5e-04 Testing: Tps/gcv for ozone2 new data PASSED test at tolerance 1e-06 done with GCV and REML tests > > proc.time() user system elapsed 1.402 0.094 1.512 fields/tests/cov.test.R0000644000176200001440000001107614275214521014562 0ustar liggesusers# # fields is a package for analysis of spatial data written for # the R software environment. # Copyright (C) 2022 Colorado School of Mines # 1500 Illinois St., Golden, CO 80401 # Contact: Douglas Nychka, douglasnychka@gmail.edu, # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with the R software environment if not, write to the Free Software # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA # or see http://www.r-project.org/Licenses/GPL-2 ##END HEADER ##END HEADER suppressMessages(library(fields)) options( echo=FALSE) test.for.zero.flag<- 1 data(ozone2) y<- ozone2$y[16,] x<- ozone2$lon.lat # # Omit the NAs good<- !is.na( y) x<- x[good,] y<- y[good] x1<- x[1:5,] x2<- x[6:11,] look<- exp(-1*rdist(x1,x2)/4) look2<- stationary.cov( x1,x2, aRange=4) look3<- Exp.cov( x1, x2, aRange=4.0) test.for.zero( look, look2) test.for.zero( look, look3) set.seed(122) C<- rnorm( nrow(x2)) look<- exp(-1*rdist(x1,x2)/4)%*%C look2<- stationary.cov( x1,x2, aRange=4, C=C) look3<- Exp.cov( x1, x2, aRange=4.0, C=C) test.for.zero( look, look2) test.for.zero( look, look3) #### check tranformation of coordinates V<- matrix( c(2,1,0,4), 2,2) Vi<- solve( V) u1<- t(Vi%*% t(x1)) u2<- t(Vi%*% t(x2)) look<- exp(-1*rdist(u1,u2)) look2<- stationary.cov( x1,x2, V= V) test.for.zero( look, look2) look<- Wendland(rdist(u1,u2), k=3, dimension=2) look2<- stationary.cov( x1,x2, V= V, Covariance = "Wendland", k=3, dimension=2) test.for.zero( look, look2) ### check tapering of covariances x1<- x[1:5,] x2<- x[2:6,] V<- matrix( c(2,1,0,4), 2,2) Vi<- solve( V) u1<- x1 u2<- x2 look1a<- exp(-1*rdist(u1,u2)) look1b<- Wendland(rdist(u1,u2), k=3, dimension=2, aRange= 1) look1<- look1a*look1b look2<- stationary.taper.cov( x1,x2, aRange=1, Taper.args=list( aRange=1,k=3, dimension=2), verbose=FALSE) test.for.zero( look1, as.matrix(look2)) u1<- t(Vi%*% t(x1)) u2<- t(Vi%*% t(x2)) look1a<- exp(-1*rdist(u1,u2)) look1b<- Wendland(rdist(u1,u2), k=3, dimension=2, aRange= 1.5) look1<- look1a*look1b look2<- stationary.taper.cov( x1,x2,V=V, Taper.args=list( aRange=1.5,k=3, dimension=2), verbose=FALSE) test.for.zero( look1, as.matrix(look2)) u1<- t(Vi%*% t(x1)) u2<- t(Vi%*% t(x2)) look1a<- Matern(rdist(u1,u2), smoothness=1.5) look1b<- Wendland(rdist(u1,u2), k=3, dimension=2, aRange= 1.5) look1<- look1a*look1b look2<- stationary.taper.cov( x1,x2,V=V,Covariance=Matern, smoothness=1.5, Taper.args=list( aRange=1.5,k=3, dimension=2), verbose=FALSE) test.for.zero( look1, as.matrix(look2)) # some tests of great circle distance stationary.taper.cov( x[1:3,],x[1:10,] , aRange=200, Taper.args= list(k=2,aRange=300, dimension=2), Dist.args=list( method="greatcircle") )-> temp # temp is now a tapered 3X10 cross covariance matrix in sparse format. # should be identical to # the direct matrix product temp2<- Exponential( rdist.earth(x[1:3,],x[1:10,]), range=200) * Wendland(rdist.earth(x[1:3,],x[1:10,]), aRange= 300, k=2, dimension=2) test.for.zero( as.matrix(temp), temp2, tol=2e-6, tag="taper with great circle") # example of calling the taper version directly # Note that default covariance is exponential and default taper is # Wendland (k=2). stationary.taper.cov( x[1:3,],x[1:10,] , aRange=1.5, Taper.args= list(k=2,aRange=2.0, dimension=2) )-> temp # temp is now a tapered 5X10 cross covariance matrix in sparse format. # should be identical to # the direct matrix product temp2<- Exp.cov( x[1:3,],x[1:10,], aRange=1.5) * Wendland(rdist(x[1:3,],x[1:10,]), aRange= 2.0, k=2, dimension=2) test.for.zero( as.matrix(temp), temp2, tag= "high level test of taper cov") stationary.taper.cov( x[1:3,],x[1:10,] , range=1.5, Taper.args= list(k=2,aRange=2.0, dimension=2) )-> temp test.for.zero( as.matrix(temp), temp2, tag= "high level test of taper cov") cat("end tests of V argument in covariances", fill=TRUE) fields/tests/cmdfile0000644000176200001440000000002613754255070014216 0ustar liggesusers s/supress/suppress/g fields/tests/Likelihood.test.R0000644000176200001440000001123214275214521016050 0ustar liggesusers# # fields is a package for analysis of spatial data written for # the R software environment. # Copyright (C) 2022 Colorado School of Mines # 1500 Illinois St., Golden, CO 80401 # Contact: Douglas Nychka, douglasnychka@gmail.edu, # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with the R software environment if not, write to the Free Software # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA # or see http://www.r-project.org/Licenses/GPL-2 ##END HEADER ##END HEADER # this is a test script to verify the likelihood computations are # correct with the eigen decomposition format used in Krig # see Krig.flplike for the concise computation. # suppressMessages(library(fields)) options( echo=FALSE) test.for.zero.flag<- 1 # utility function foor testing REML.test <- function(x, y, rho, sigma2, theta, nu = 1.5) { Tmatrix <- fields.mkpoly(x, 2) qr.T <- qr(Tmatrix) N <- length(y) Q2 <- qr.yq2(qr.T, diag(1, N)) ys <- t(Q2) %*% y N2 <- length(ys) A <- (rho * Matern(rdist(x, x), range = theta, smoothness = nu) + sigma2 * diag(1, N)) A <- t(Q2) %*% A %*% Q2 Ac <- chol(A) w <- backsolve(Ac, ys, transpose = TRUE) REML.like <- (N2/2) * log(2 * pi) + (1/2) * 2 * sum(log(diag(Ac))) + (1/2) * t(w) %*% w REML.like <- -1 * REML.like ccoef <- rho * Q2 %*% solve(A) %*% ys return(list(REML.like = REML.like, A = A, ccoef = ccoef, quad.form = t(w) %*% w, rhohat = (t(w) %*% w/N2) * rho, det = 2 * sum(log(diag(Ac))), N2 = N2)) } data( ozone2) x<- ozone2$lon.lat y<- ozone2$y[16,] is.good <- !is.na( y) x<- x[is.good,] y<- y[is.good] aRange<- 2.0 # check log likelihood calculation nu<- 1.5 lambda<- .2 out<- mKrig( x,y, aRange=aRange,Covariance="Matern", smoothness=nu, lambda=lambda) # peg sigma and tau as MLEs from mKrig sigma <- out$summary["sigma2"] tau2<- sigma*lambda N<- length( y) dd<- rdist( x,x) M<- sigma* Matern( dd, range= aRange, smoothness=nu) + tau2* diag( 1, N) X<- fields.mkpoly( x, 2) Mi<- solve( M) betahat<- solve(t(X)%*%Mi%*%X)%*% t(X)%*% Mi%*% y res<- y - X%*%betahat ccoef<- ( Mi%*% ( res))*sigma # sanity check that estimates are the same test.for.zero( ccoef, out$c.coef, tag="check ccoef") # find full log likelihood chol(M)-> cM lLike<- -(N/2)*log(2*pi) - (1/2)* (2*sum( log( diag(cM)))) - (1/2)* t(res)%*% Mi %*% res test.for.zero( lLike, out$summary["lnProfileLike.FULL"], tag="llike profile from mKrig") # formula for full likelihood using peices from mKrig # lLike.test<- -(N/2)*log(2*pi) - (1/2)* out$lnDetCov - (1/2)*(N)*log( sigma) - (1/2)*out$quad.form/sigma # test.for.zero( lLike, lLike.test, tag="llike full verses sigmahat") # REML check nu<- 1.5 aRange<- .6 obj<- Krig( x,y, aRange=aRange,Covariance="Matern", smoothness=nu ) # sanity check that c coefficients agree with Krig sigma<- 500 lambda<- .2 tau2<- lambda*sigma hold<- REML.test( x,y,sigma, tau2, aRange, nu=1.5) ccoef2<- Krig.coef( obj, lambda)$c test.for.zero( hold$ccoef, ccoef2, tag="ccoefs") # check RSS with Krig decomposition. RSS1<- sum( (lambda*ccoef2)**2) lD <- obj$matrices$D * lambda RSS2 <- sum(((obj$matrices$u * lD)/(1 + lD))^2) test.for.zero( RSS2, RSS1, tag=" RSS using matrices") # check quadratic form with Krig D.temp<- obj$matrices$D[ obj$matrices$D>0] A3test<- (1/lambda)* obj$matrices$V %*% diag((D.temp*lambda)/ (1 +D.temp*lambda) )%*% t( obj$matrices$V) test.for.zero(solve(A3test), hold$A/sigma, tol=5e-8) Quad3<- sum( D.temp*(obj$matrices$u[obj$matrices$D>0])^2/(1+lambda*D.temp)) test.for.zero( hold$quad.form, Quad3/sigma, tag="quad form") # test determinants N2<- length( D.temp) det4<- -sum( log(D.temp/(1 + D.temp*lambda)) ) det1<- sum( log(eigen( hold$A/sigma)$values)) test.for.zero( det1, det4, tag="det" ) # test REML Likelihood lLikeREML.test<--1*( (N2/2)*log(2*pi) - (1/2)*(sum( log(D.temp/(1 + D.temp*lambda)) ) - N2*log(sigma)) + (1/2)*sum( lD*(obj$matrices$u)^2/(1+lD)) /(lambda*sigma) ) test.for.zero( hold$REML.like, lLikeREML.test, tag="REML using matrices") cat("all done with likelihood tests", fill=TRUE) options( echo=TRUE) fields/tests/SEFixedParameters.Rout.save0000644000176200001440000000360414275255352020022 0ustar liggesusers R version 4.2.1 (2022-06-23) -- "Funny-Looking Kid" Copyright (C) 2022 The R Foundation for Statistical Computing Platform: x86_64-apple-darwin17.0 (64-bit) R is free software and comes with ABSOLUTELY NO WARRANTY. You are welcome to redistribute it under certain conditions. Type 'license()' or 'licence()' for distribution details. R is a collaborative project with many contributors. Type 'contributors()' for more information and 'citation()' on how to cite R or R packages in publications. Type 'demo()' for some demos, 'help()' for on-line help, or 'help.start()' for an HTML browser interface to help. Type 'q()' to quit R. > # > # fields is a package for analysis of spatial data written for > # the R software environment. > # Copyright (C) 2022 Colorado School of Mines > # 1500 Illinois St., Golden, CO 80401 > # Contact: Douglas Nychka, douglasnychka@gmail.edu, > # > # This program is free software; you can redistribute it and/or modify > # it under the terms of the GNU General Public License as published by > # the Free Software Foundation; either version 2 of the License, or > # (at your option) any later version. > # This program is distributed in the hope that it will be useful, > # but WITHOUT ANY WARRANTY; without even the implied warranty of > # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the > # GNU General Public License for more details. > # > # You should have received a copy of the GNU General Public License > # along with the R software environment if not, write to the Free Software > # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA > # or see http://www.r-project.org/Licenses/GPL-2 > ##END HEADER > ##END HEADER > > # tests of SEs from the Omega matrix > # using Monte Carlo > > suppressMessages(library(fields)) > options( echo=FALSE) PASSED test at tolerance 0.05 > proc.time() user system elapsed 1.639 0.142 1.699 fields/tests/diag.multiply.test.R0000644000176200001440000000270214275214521016551 0ustar liggesusers# # fields is a package for analysis of spatial data written for # the R software environment. # Copyright (C) 2022 Colorado School of Mines # 1500 Illinois St., Golden, CO 80401 # Contact: Douglas Nychka, douglasnychka@gmail.edu, # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with the R software environment if not, write to the Free Software # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA # or see http://www.r-project.org/Licenses/GPL-2 ##END HEADER ##END HEADER suppressMessages(library(fields)) options( echo=FALSE) set.seed( 234) test.for.zero.flag<- 1 n <- 5 m <- 4 mat <- array(rnorm(n*m),c(n,m)) mat2 <- array(rnorm(n*m),c(m,n)) vec <- rnorm(n) vec2 <- rnorm(n) test.for.zero( mat2 %*% mat, mat2%d*%mat, tol=1e-8 ) test.for.zero( (diag(vec)%*% mat), (vec%d*%mat), tol=1e-8 ) test.for.zero( diag(vec)%*% vec2, vec%d*%vec2,tol=1e-8) cat("All done with testing diag multiply", fill=TRUE) options(echo=TRUE) fields/tests/evlpoly.test.R0000644000176200001440000000344414275214521015465 0ustar liggesusers# # fields is a package for analysis of spatial data written for # the R software environment. # Copyright (C) 2022 Colorado School of Mines # 1500 Illinois St., Golden, CO 80401 # Contact: Douglas Nychka, douglasnychka@gmail.edu, # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with the R software environment if not, write to the Free Software # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA # or see http://www.r-project.org/Licenses/GPL-2 ##END HEADER ##END HEADER suppressMessages(library(fields)) options( echo=FALSE) test.for.zero.flag<-1 set.seed( 245) x<- runif(3) coef<- runif( 5) temp<- fields.evlpoly( x, coef) temp2<- coef[1] for( k in (2:5) ){ temp2<- temp2 + coef[k]*x**(k-1) } test.for.zero( temp, temp2) set.seed( 124) x<- matrix( runif(12), ncol=3) fields.mkpoly(x, m=3)-> out attr( out, "ptab")-> ptab J<- nrow( ptab) coef<- runif( J) temp<- fields.evlpoly2( x, coef, ptab) temp2<-out%*% coef test.for.zero( temp,temp2) fields.derivative.poly( x, m=3, coef)-> temp fields.mkpoly( cbind( x[,1:2], x[,3]+1e-6), m=3)%*% coef-> temp2 fields.mkpoly( cbind( x[,1:2], x[,3]-1e-6), m=3)%*% coef-> temp3 temp2<- (temp2- temp3)/ 2e-6 test.for.zero( temp[,3], temp2) cat("Done testing polynomial evaluation",fill=TRUE) options( echo=FALSE) fields/tests/cov.test.Rout.save0000644000176200001440000000447614275255352016264 0ustar liggesusers R version 4.2.1 (2022-06-23) -- "Funny-Looking Kid" Copyright (C) 2022 The R Foundation for Statistical Computing Platform: x86_64-apple-darwin17.0 (64-bit) R is free software and comes with ABSOLUTELY NO WARRANTY. You are welcome to redistribute it under certain conditions. Type 'license()' or 'licence()' for distribution details. R is a collaborative project with many contributors. Type 'contributors()' for more information and 'citation()' on how to cite R or R packages in publications. Type 'demo()' for some demos, 'help()' for on-line help, or 'help.start()' for an HTML browser interface to help. Type 'q()' to quit R. > # > # fields is a package for analysis of spatial data written for > # the R software environment. > # Copyright (C) 2022 Colorado School of Mines > # 1500 Illinois St., Golden, CO 80401 > # Contact: Douglas Nychka, douglasnychka@gmail.edu, > # > # This program is free software; you can redistribute it and/or modify > # it under the terms of the GNU General Public License as published by > # the Free Software Foundation; either version 2 of the License, or > # (at your option) any later version. > # This program is distributed in the hope that it will be useful, > # but WITHOUT ANY WARRANTY; without even the implied warranty of > # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the > # GNU General Public License for more details. > # > # You should have received a copy of the GNU General Public License > # along with the R software environment if not, write to the Free Software > # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA > # or see http://www.r-project.org/Licenses/GPL-2 > ##END HEADER > ##END HEADER > > > suppressMessages(library(fields)) > options( echo=FALSE) PASSED test at tolerance 1e-08 PASSED test at tolerance 1e-08 PASSED test at tolerance 1e-08 PASSED test at tolerance 1e-08 PASSED test at tolerance 1e-08 PASSED test at tolerance 1e-08 PASSED test at tolerance 1e-08 PASSED test at tolerance 1e-08 PASSED test at tolerance 1e-08 Testing: taper with great circle PASSED test at tolerance 2e-06 Testing: high level test of taper cov PASSED test at tolerance 1e-08 Testing: high level test of taper cov PASSED test at tolerance 1e-08 end tests of V argument in covariances > proc.time() user system elapsed 0.785 0.072 0.864 fields/tests/offGridWeights.test.R0000644000176200001440000000777714275214521016723 0ustar liggesusers# # fields is a package for analysis of spatial data written for # the R software environment. # Copyright (C) 2022 Colorado School of Mines # 1500 Illinois St., Golden, CO 80401 # Contact: Douglas Nychka, douglasnychka@gmail.edu, # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with the R software environment if not, write to the Free Software # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA # or see http://www.r-project.org/Licenses/GPL-2 ##END HEADER ##END HEADER # test of sreg and related functions suppressMessages(library(fields)) options(echo=FALSE) test.for.zero.flag<- 1 set.seed(123) # Local Kriging - sparse matrix implementation (small example) #source( "makeBigB.R") # simple covariance function for implementation exp_cov <- function(dist){ sigma2<-1 covariance <- sigma2* exp(-dist / 10) # 10 is arbitrary return(covariance) } # ----------------------------- # Define grid and observations # ----------------------------- m<- 40 n<- 45 nx<- m ny<- n M<- 10 dx<- 1 dy<- 1 sigma2<-2.0 np<-3 set.seed( 123) # locations random but avoid edges s<- cbind( dx*runif( M, np, (m-(np+1))), dy* runif( M, np, (n-(np+1))) ) # random uniform is ok as we just checking agreement set.seed( 222) y<- matrix( runif(m*n),m,n) yUnrolled<- c( y) #look<- sparseB%*%yUnrolled look2<- predVar<- rep( NA, M) theShift<- 0:(2*np-1) - (np - 1) for( k in 1:M){ #k<- 3 yTemp<- NULL sTemp<- NULL i0<- trunc(s[k,1]) j0<- trunc(s[k,2]) for( j in theShift + j0){ for( i in theShift + i0){ #cat( i,j, fill=TRUE) sTemp<- rbind( sTemp, c(i,j)) yTemp<- c(yTemp,y[i,j]) } } Sigma11<- sigma2*exp_cov(rdist(sTemp, sTemp)) Sigma11Inv<- solve(Sigma11) Sigma21<- sigma2*exp_cov(rdist(rbind(s[k,]), sTemp)) Btest<- Sigma21%*%Sigma11Inv result<- Sigma21%*%Sigma11Inv%*%yTemp look2[k]<- result predVar[k]<- sigma2 - diag(Sigma21%*%Sigma11Inv%*%t(Sigma21 ) ) } ################################### # test new function ################################### sparseObj0<- offGridWeights( s, list( x= 1:m, y=1:n), aRange=10, sigma2=sigma2, Covariance="Exponential", np=np) look5<- sparseObj0$B%*%yUnrolled test.for.zero( look2, look5 ) test.for.zero(predVar, sparseObj0$predictionVariance ) mKrigObj<- mKrig( s, rnorm( nrow(s)), sigma2=sigma2, tau=0, aRange=10) sparseObj<- offGridWeights( s, list( x= 1:m, y=1:n), mKrigObject = mKrigObj, np=np ) look3<- sparseObj$B%*%yUnrolled test.for.zero( look2, look3 ) test.for.zero(predVar, sparseObj$predictionVariance ) # cheating on mKrig object fakeObj<- list( args = list( Covariance= "Exponential" ), summary= c(aRange=10*2.5, sigma2=sigma2) ) sparseObj1<- offGridWeights( s*2.5, list( x = (1:m)*2.5, y = (1:n)*2.5 ), mKrigObject = fakeObj, np = np ) look4<- sparseObj1$B%*%yUnrolled test.for.zero( look2, look4 ) test.for.zero( sparseObj$predictionVariance, predVar ) # this switch will just give a warning instead of an error #sparseObj1<- offGridWeights( s, list( x= 1:4, y=1:4), # mKrigObject = mKrigObj, np=np, give.warning=TRUE) cat("all done with off grid weight tests part 1", fill=TRUE) fields/tests/mKrig.test.R0000644000176200001440000002015414342501141015031 0ustar liggesusers# # fields is a package for analysis of spatial data written for # the R software environment. # Copyright (C) 2022 Colorado School of Mines # 1500 Illinois St., Golden, CO 80401 # Contact: Douglas Nychka, douglasnychka@gmail.edu, # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with the R software environment if not, write to the Free Software # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA # or see http://www.r-project.org/Licenses/GPL-2 ##END HEADER ##END HEADER suppressMessages(library(fields)) options( echo=FALSE) test.for.zero.flag<- 1 # test data data( ozone2) x<- ozone2$lon.lat y<- ozone2$y[16,] #first test addToDiagC I3 = diag(nrow=3) twoI3 = I3*2 .Call("addToDiagC", I3, rep(1.0, 3), as.integer(3)) test.for.zero(twoI3, I3, tag="addToDiag") # turning spam on and off Krig(x,y, cov.function = "stationary.taper.cov", aRange=1.5, cov.args= list( spam.format=FALSE, Taper.args= list( aRange=2.0,k=2, dimension=2) ) ) -> out1 Krig(x,y, cov.function = "stationary.taper.cov", lambda=2.0, aRange=1.5, cov.args= list( spam.format=TRUE, Taper.args= list( aRange=2.0,k=2, dimension=2) ) ) -> out2 temp1<- predict( out1,lambda=2.0) temp2<- predict( out2) test.for.zero( temp1, temp2, tag="spam vs no spam") # # Omit the NAs good<- !is.na( y) x<- x[good,] y<- y[good] # now look at mKrig w/o sparse matrix mKrig( x,y, cov.function="stationary.cov", aRange=10, lambda=.3, chol.args=list( pivot=FALSE))-> look Krig( x,y, cov.function="stationary.cov", aRange=10, lambda=.3) -> look2 test.for.zero( look$d, look2$d, tag="Krig mKrig d coef") test.for.zero( look$c, look2$c, tag="Krig mKrig c coef") set.seed(123) xnew<- cbind( (runif(20)-.5)*5, (runif(20)-.5)*5) temp<- predict( look, xnew) temp2<- predict( look2, xnew) test.for.zero( temp, temp2, tag="test of predict at new locations") # test of matrix of obs N<- length( y) Y<- cbind( runif(N), y,runif(N), y) # collapse == FALSE means each fixed effect found separately for columns of Y lookY<- mKrig( x,Y, cov.function="stationary.cov", aRange=10, lambda=.3,collapse=FALSE) temp3<- predict( lookY, xnew, collapse=FALSE)[,4] test.for.zero( temp, temp3, tag="test of matrix Y predicts" ) predictSurface( look)-> temp predictSurface( look2)-> temp2 good<- !is.na( temp2$z) test.for.zero( temp$z[good], temp2$z[good]) # testing stationary taper covariance # and also surface prediction N<- length( y) mKrig( x,y, cov.function="stationary.taper.cov", aRange=2, spam.format=FALSE, lambda=.35 )-> look Krig( x,y, cov.function="stationary.taper.cov", aRange=2, spam.format=FALSE, lambda=.35)-> look2 predictSurface( look, nx=50, ny=45)-> temp predictSurface( look2, nx=50, ny=45)-> temp2 good<- !is.na( temp2$z) test.for.zero( temp$z[good], temp2$z[good], tag="predictSurface with mKrig") # # Use Wendland with sparse off and on. Krig( x,y, cov.function="wendland.cov", cov.args=list( k=2, aRange=2.8), lambda=.3, spam.format=FALSE)-> look mKrig( x,y, cov.function="wendland.cov",k=2, aRange=2.8, spam.format=FALSE, lambda=.3)-> look2 mKrig( x,y, cov.function="wendland.cov",k=2, aRange=2.8, spam.format=TRUE, lambda=.3)-> look3 # final tests for predict. set.seed(223) xnew<- cbind(runif( N)*.5 + x[,1], runif(N)*.5 + x[,2]) temp<- predict( look, xnew) temp2<- predict( look2, xnew) temp3<- predict( look3, xnew) test.for.zero( temp, temp2, tag="Wendland/no spam") test.for.zero( temp2, temp3, tag="Wendland/spam") ### testing coefficients for new data mKrig.coef( look2, cbind(y+1,y+2), collapse=FALSE)-> newc test.for.zero( look2$c, newc$c[,2], tag="new coef c no spam") test.for.zero( look2$beta, c(newc$beta[1,2] -2, newc$beta[2:3,2]), tag="new beta coef no spam") mKrig.coef( look3, cbind(y+1,y+2), collapse=FALSE)-> newc test.for.zero( look3$c.coef, newc$c.coef[,2], tag="new coef c spam") test.for.zero( look3$beta, c(newc$beta[1,2] -2, newc$beta[2:3,2]), tag="new beta coef spam") ### ### bigger sample size set.seed( 334) N<- 1000 x<- matrix( runif(2*N),ncol=2) y<- rnorm( N) nzero <- length( wendland.cov(x,x, k=2,aRange=.1)@entries) mKrig( x,y, cov.function="wendland.cov",k=2, aRange=.1, lambda=.3)-> look2 test.for.zero( look2$non.zero.entires, nzero, tag="nzero in call to mKrig") ###### ### test out passing to chol data( ozone2) y<- ozone2$y[16,] good<- !is.na( y) y<-y[good] x<- ozone2$lon.lat[good,] # interpolate using defaults (Exponential) # stationary covariance mKrig( x,y, aRange = 1.5, lambda=.2)-> out # # NOTE this should be identical to Krig( x,y, aRange=1.5, lambda=.2) -> out2 temp<- predict( out) temp2<- predict( out2) test.for.zero( temp, temp2, tag="mKrig vs. Krig for ozone2") # test passing arguments for chol set.seed( 334) N<- 300 x<- matrix( 2*(runif(2*N)-.5),ncol=2) y<- sin( 3*pi*x[,1])*sin( 3.5*pi*x[,2]) + rnorm( N)*.01 Krig( x,y, Covariance="Wendland", cov.args= list(k=2, aRange=.8, dimension=2), , give.warnings=FALSE, lambda=1e2) -> out mKrig( x,y, cov.function="wendland.cov",k=2, aRange=.8, lambda=1e2, chol.args=list( memory=list( nnzR=1e5)), )-> out2 temp<- predict( out) temp2<- predict( out2) test.for.zero( temp, temp2, tol=1e-7, tag="predict Wendland mKrig vs Krig") # test of fastTps nx<- 50 ny<- 60 x<- seq( 0,1,,nx) y<- seq( 0,1,,ny) gl<- list( x=x, y=y) xg<- make.surface.grid(gl) ztrue<- sin( xg[,1]*pi*3)* cos(xg[,2]*pi*2.5) #image.plot(x,y,matriz( ztrue, nx,ny)) set.seed( 222) ind<- sample( 1:(nx*ny), 600) xdat<- xg[ind,] ydat <- ztrue[ind] out<- fastTps(xdat, ydat, aRange=.3) out.p<-predictSurface( out, gridList=gl, extrap=TRUE) # perfect agreement at data test.for.zero( ydat, c( out.p$z)[ind],tol=5e-7, tag="fastTps interp1") #image.plot(x,y,matrix( ztrue, nx,ny)- out.p$z) rmse<- sqrt(mean( (ztrue- c( out.p$z))^2)/ mean( (ztrue)^2)) test.for.zero( rmse,0,tol=.02, relative=FALSE,tag="fastTps interp2") ##### test precomputing distance matrices: # set.seed(1) # test data data( ozone2) x<- ozone2$lon.lat y<- ozone2$y[16,] # # Omit the NAs good<- !is.na( y) x<- x[good,] y<- y[good] compactDistMat = rdist(x, compact=TRUE) distMat = rdist(x) ##### test using distance matrix print("testing using distance matrix") mKrig(x,y, cov.function = "stationary.cov", lambda=2.0, aRange=1.5) -> out1 mKrig(x,y, cov.args= list(Covariance="Exponential", Distance="rdist", Dist.args=list(compact=TRUE)), lambda=2.0, aRange=1.5) -> out2 #NOTE: compact distance matrix should not be used by user for fields compatibility reasons mKrig(x,y, cov.args= list(Covariance="Exponential", Dist.args=list(compact=TRUE)), lambda=2.0, aRange=1.5, distMat=compactDistMat) -> out3 mKrig(x,y, cov.args= list(Covariance="Exponential"), lambda=2.0, aRange=1.5, distMat=distMat) -> out4 temp1<- predict( out1) temp2<- predict( out2) temp3 = predict( out3) temp4 = predict( out4) test.for.zero( temp1, temp2, tag="predict: stationary.cov versus Exp.cov") test.for.zero( temp2, temp3, tag="predict: no distance matrix versus compact distance matrix") test.for.zero( temp2, temp4, tag="predict: no distance matrix versus distance matrix") ##### test SE print("testing using predictSE") temp1 = predictSE(out1) temp2 = predictSE(out2) temp3 = predictSE(out3) temp4 = predictSE(out4) test.for.zero( temp1, temp2, tag="predictSE: stationary.cov with exponential versus Exp.cov") test.for.zero( temp2, temp3, tag="predictSE: no distance matrix versus compact distance matrix") test.for.zero( temp2, temp4, tag="predictSE: no distance matrix versus distance matrix") cat("all done with mKrig tests", fill=TRUE) options( echo=TRUE) fields/tests/vgram.test.R0000644000176200001440000000532014275214521015102 0ustar liggesusers# # fields is a package for analysis of spatial data written for # the R software environment. # Copyright (C) 2022 Colorado School of Mines # 1500 Illinois St., Golden, CO 80401 # Contact: Douglas Nychka, douglasnychka@gmail.edu, # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with the R software environment if not, write to the Free Software # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA # or see http://www.r-project.org/Licenses/GPL-2 ##END HEADER ##END HEADER # test of vgram suppressMessages(library(fields)) options(echo=FALSE) data( ozone2) y<- ozone2$y[16,] x<- ozone2$lon.lat vgram( x, y, lon.lat=TRUE)-> out # compute "by hand" outer( y, y ,"-")-> hold hold<- .5*hold^2 rdist.earth( x,x)-> hold2 col( hold2)> row( hold2)-> upper hold<- hold[upper] hold2<- hold2[upper] order( hold2)-> od hold2<- hold2[od] hold<- hold[od] ind<- is.na(hold) hold<- hold[!ind] hold2<- hold2[!ind] test.for.zero( hold, out$vgram, tag="vgram single time") # multiple times including NAs at some times y<- t(ozone2$y[16:18,]) x<- ozone2$lon.lat[,] out<- vgram( x, y, lon.lat=TRUE) N<- nrow( y) hold<- cbind(c(outer( y[,1], y[,1],"-")), c(outer( y[,2], y[,2],"-") ), c(outer(y[,3], y[,3],"-")) ) hold<- .5*hold^2 hold<- rowMeans( hold, na.rm=TRUE) hold<- matrix( hold, N,N) rdist.earth( x,x)-> hold2 col( hold2)> row( hold2)-> upper hold<- hold[upper] hold2<- hold2[upper] order( hold2)-> od hold2<- hold2[od] hold<- hold[od] ind<- is.na(hold) hold<- hold[!ind] hold2<- hold2[!ind] test.for.zero( hold, out$vgram, tag="vgram more than one time point") # test covariogram versus correlogram y<- ozone2$y[16,] x<- ozone2$lon.lat tau2 = var(y, na.rm=TRUE) lookCov = vgram(x, y, lon.lat=TRUE, type="covariogram") lookCor = vgram(x, y, lon.lat=TRUE, type="correlogram") test.for.zero(lookCov$vgram*(1/tau2), lookCor$vgram, tag="correlogram versus covariogram") # test cross-covariogram versus cross-correlogram tau2 = var(y, na.rm=TRUE) lookCov = crossCoVGram(x, x, y, y, lon.lat=TRUE, type="cross-covariogram") lookCor = crossCoVGram(x, x, y, y, lon.lat=TRUE, type="cross-correlogram") test.for.zero(lookCov$vgram*(1/tau2), lookCor$vgram, tag="correlogram versus covariogram") fields/tests/mKrig.Z.Rout.save0000644000176200001440000000420414275255352015765 0ustar liggesusers R version 4.2.1 (2022-06-23) -- "Funny-Looking Kid" Copyright (C) 2022 The R Foundation for Statistical Computing Platform: x86_64-apple-darwin17.0 (64-bit) R is free software and comes with ABSOLUTELY NO WARRANTY. You are welcome to redistribute it under certain conditions. Type 'license()' or 'licence()' for distribution details. R is a collaborative project with many contributors. Type 'contributors()' for more information and 'citation()' on how to cite R or R packages in publications. Type 'demo()' for some demos, 'help()' for on-line help, or 'help.start()' for an HTML browser interface to help. Type 'q()' to quit R. > # > # fields is a package for analysis of spatial data written for > # the R software environment. > # Copyright (C) 2022 Colorado School of Mines > # 1500 Illinois St., Golden, CO 80401 > # Contact: Douglas Nychka, douglasnychka@gmail.edu, > # > # This program is free software; you can redistribute it and/or modify > # it under the terms of the GNU General Public License as published by > # the Free Software Foundation; either version 2 of the License, or > # (at your option) any later version. > # This program is distributed in the hope that it will be useful, > # but WITHOUT ANY WARRANTY; without even the implied warranty of > # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the > # GNU General Public License for more details. > # > # You should have received a copy of the GNU General Public License > # along with the R software environment if not, write to the Free Software > # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA > # or see http://www.r-project.org/Licenses/GPL-2 > ##END HEADER > ##END HEADER > > suppressMessages(library(fields)) > options( echo=FALSE) Testing: Full prediction PASSED test at tolerance 1e-08 Testing: prediction dropping Z PASSED test at tolerance 1e-08 Testing: new x's dropping Z PASSED test at tolerance 1e-08 Testing: new x's new Z's PASSED test at tolerance 1e-08 Testing: predicting on surface with drop.Z PASSED test at tolerance 1e-08 all done with mKrig Z tests > > > proc.time() user system elapsed 1.208 0.105 1.285 fields/tests/mKrig.parameters.test.Rout.save0000644000176200001440000002245614275255352020706 0ustar liggesusers R version 4.2.1 (2022-06-23) -- "Funny-Looking Kid" Copyright (C) 2022 The R Foundation for Statistical Computing Platform: x86_64-apple-darwin17.0 (64-bit) R is free software and comes with ABSOLUTELY NO WARRANTY. You are welcome to redistribute it under certain conditions. Type 'license()' or 'licence()' for distribution details. R is a collaborative project with many contributors. Type 'contributors()' for more information and 'citation()' on how to cite R or R packages in publications. Type 'demo()' for some demos, 'help()' for on-line help, or 'help.start()' for an HTML browser interface to help. Type 'q()' to quit R. > # > # fields is a package for analysis of spatial data written for > # the R software environment. > # Copyright (C) 2022 Colorado School of Mines > # 1500 Illinois St., Golden, CO 80401 > # Contact: Douglas Nychka, douglasnychka@gmail.edu, > # > # This program is free software; you can redistribute it and/or modify > # it under the terms of the GNU General Public License as published by > # the Free Software Foundation; either version 2 of the License, or > # (at your option) any later version. > # This program is distributed in the hope that it will be useful, > # but WITHOUT ANY WARRANTY; without even the implied warranty of > # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the > # GNU General Public License for more details. > # > # You should have received a copy of the GNU General Public License > # along with the R software environment if not, write to the Free Software > # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA > # or see http://www.r-project.org/Licenses/GPL-2 > ##END HEADER > ##END HEADER > > > suppressMessages(library(fields)) > #options( echo=FALSE) > test.for.zero.flag<- 1 > data(ozone2) > y<- ozone2$y[16,] > x<- ozone2$lon.lat > # > # Omit the NAs > good<- !is.na( y) > x<- x[good,] > y<- y[good] > #source("~/Home/Src/fields/R/mKrig.family.R") > > # now look at mKrig w/o sparse matrix > look<- mKrig( x,y, cov.function="stationary.cov", aRange=10, lambda=.3, + chol.args=list( pivot=FALSE)) > > > lookKrig<- Krig( x,y, cov.function="stationary.cov", + aRange=10) > > test.df<-Krig.ftrace(look$lambda,lookKrig$matrices$D) > > test<- Krig.coef( lookKrig, lambda=look$lambda) > > test.for.zero( look$d, test$d, tag="Krig mKrig d coef") Testing: Krig mKrig d coef PASSED test at tolerance 1e-08 > test.for.zero( look$c, test$c, tag="Krig mKrig c coef") Testing: Krig mKrig c coef PASSED test at tolerance 1e-08 > > # test of trace calculation > > look<- mKrig( x,y, cov.function="stationary.cov", aRange=10, lambda=.3, + + find.trA=TRUE, NtrA= 1000, iseed=243) > > test.for.zero( look$eff.df, test.df,tol=.01, tag="Monte Carlo eff.df") Testing: Monte Carlo eff.df PASSED test at tolerance 0.01 > > > # > lookKrig<-Krig( x,y, cov.function="stationary.cov", + aRange=350, Distance="rdist.earth",Covariance="Wendland", + cov.args=list( k=2, dimension=2) ) > > look<- mKrig( x,y, cov.function="stationary.cov", + aRange=350, + Distance="rdist.earth",Covariance="Wendland", + cov.args=list( k=2, dimension=2), + lambda=lookKrig$lambda, + find.trA=TRUE, NtrA= 1000, iseed=243) > > test.for.zero( look$c, lookKrig$c, tag="Test of wendland and great circle") Testing: Test of wendland and great circle PASSED test at tolerance 1e-08 > > test.for.zero(look$eff.df, Krig.ftrace( lookKrig$lambda, lookKrig$matrices$D) + ,tol=.01, tag="eff.df") Testing: eff.df PASSED test at tolerance 0.01 > > # same calculation using sparse matrices. > > look4<- mKrig( x,y, cov.function="wendland.cov", + aRange=350, + Dist.args=list( method="greatcircle"), + cov.args=list( k=2), + lambda=lookKrig$lambda, + find.trA=TRUE, NtrA=500, iseed=243) > > test.for.zero( look$c.coef, look4$c.coef,tol=8e-7, + tag="Test of sparse wendland and great circle") Testing: Test of sparse wendland and great circle PASSED test at tolerance 8e-07 > test.for.zero(look4$eff.df, Krig.ftrace( lookKrig$lambda, lookKrig$matrices$D), + tol=.01, tag="sparse eff.df") Testing: sparse eff.df PASSED test at tolerance 0.01 > > # great circle distance switch has been a big bug -- test some options > > look<- mKrig( x,y, cov.function="wendland.cov", + aRange=350, Dist.args=list( method="greatcircle"), + cov.args=list( k=2),lambda=lookKrig$lambda, + find.trA=TRUE, NtrA=1000, iseed=243) > > test.for.zero(look$eff.df, Krig.ftrace( lookKrig$lambda, lookKrig$matrices$D), + tol=1e-2, tag="exact sparse eff.df") Testing: exact sparse eff.df PASSED test at tolerance 0.01 > > # compare to fast Tps > look3<- fastTps( x,y,aRange=350,lambda=lookKrig$lambda, NtrA=200, iseed=243, + lon.lat=TRUE) > #look3$c<- lookKrig$c > #look3$d<- lookKrig$d > object<- look3 > np<- object$np > Ey <- diag(1, np) > NtrA <- np > hold <- predict.mKrig(object, ynew = Ey, collapseFixedEffect=FALSE) > hold2<- matrix( NA, np,np) > for( k in 1:np){ + hold2[,k] <- predict.Krig(lookKrig, y = Ey[,k]) + } > #plot( diag(hold), diag(hold2)) > > > test.for.zero( look3$c, lookKrig$c, tol=5e-7) PASSED test at tolerance 5e-07 > test.for.zero( look3$d, lookKrig$d, tol=2e-8) PASSED test at tolerance 2e-08 > test.for.zero( look3$fitted.values, lookKrig$fitted.values, tol=1e-7) PASSED test at tolerance 1e-07 > > test.for.zero( predict( look3, xnew= look3$x), predict( lookKrig, xnew= lookKrig$x), + tol=5e-7) PASSED test at tolerance 5e-07 > > test.for.zero( hold[,1], hold2[,1], tol=1e-7, relative=FALSE) PASSED test at tolerance 1e-07 > > test.for.zero(diag(hold),diag(hold2), tol=2E-7, + relative=FALSE, tag="exact sparse eff.df by predict -- fastTps") Testing: exact sparse eff.df by predict -- fastTps PASSED test at tolerance 2e-07 > #plot( diag(hold), ( 1- diag(hold2)/ diag(hold)) ) > > test.for.zero(look3$eff.df,sum( diag(hold)) , tag="fastTps ef.df exact" ) Testing: fastTps ef.df exact PASSED test at tolerance 1e-08 > > test.for.zero(look3$eff.df, Krig.ftrace( lookKrig$lambda, lookKrig$matrices$D), + tol=2e-7, tag="exact sparse eff.df through mKrig-- fastTps") Testing: exact sparse eff.df through mKrig-- fastTps PASSED test at tolerance 2e-07 > > # calculations of likelihood, sigma and tau > > lam<-.2 > > out<- mKrig( x,y, cov.function =Exp.cov, aRange=4, lambda=lam) > out2<- Krig( x,y, cov.function =Exp.cov, aRange=4, lambda=lam) > > > Sigma<- Exp.cov( x,x,aRange=4) > X<- cbind( rep(1, nrow(x)), x) > > Sinv<- solve( Sigma + lam* diag( 1, nrow( x))) > > #checks on likelihoods > > # quadratic form: > betaHat<- c(solve( t(X)%*%Sinv%*%(X) ) %*% t(X) %*%Sinv%*%y) > test.for.zero( betaHat, out$beta, tag="initial check on d for likelihood") Testing: initial check on d for likelihood PASSED test at tolerance 1e-08 > r<- y -X%*%betaHat > N<- nrow(x) > look<- t( r)%*%(Sinv)%*%r/N > > > > test.for.zero( look, out$summary["sigma2"], tag="sigma2 hat from likelihood") Testing: sigma2 hat from likelihood PASSED test at tolerance 1e-08 > > test.for.zero( look, out2$sigma.MLE, tag="sigma2 hat from likelihood compared to Krig") Testing: sigma2 hat from likelihood compared to Krig PASSED test at tolerance 1e-08 > > > > # check determinant > lam<- .2 > Sigma<- Exp.cov( x,x,aRange=4) > M<- Sigma + lam * diag( 1, nrow(x)) > chol( M)-> Mc > look2<- sum( log(diag( Mc)))*2 > > out<-mKrig( x,y,cov.function =Exp.cov, aRange=4, lambda=lam) > > test.for.zero( out$lnDetCov, look2) PASSED test at tolerance 1e-08 > test.for.zero( out$lnDetCov, determinant(M, log=TRUE)$modulus) PASSED test at tolerance 1e-08 > > # weighted version > lam<- .2 > Sigma<- Exp.cov( x,x,aRange=4) > set.seed( 123) > weights<- runif(nrow( x)) > M<- Sigma + diag(lam/ weights) > chol( M)-> Mc > look2<- sum( log(diag( Mc)))*2 > > out<-mKrig( x,y,weights=weights, cov.function =Exp.cov, aRange=4, lambda=lam) > > test.for.zero( out$lnDetCov, look2) PASSED test at tolerance 1e-08 > test.for.zero( look2, determinant(M, log=TRUE)$modulus) PASSED test at tolerance 1e-08 > test.for.zero( out$lnDetCov, determinant(M, log=TRUE)$modulus) PASSED test at tolerance 1e-08 > > > > # check profile likelihood by estimating MLE > lam.true<- .2 > N<- nrow( x) > Sigma<- Exp.cov( x,x,aRange=4) > M<- Sigma + lam.true * diag( 1, nrow(x)) > chol( M)-> Mc > t(Mc)%*%Mc -> test > > > > > ##D set.seed( 234) > ##D NSIM<- 100 > ##D hold2<-rep( NA, NSIM) > ##D temp.fun<- function(lglam){ > ##D out<-mKrig( x,ytemp, > ##D cov.function =Exp.cov, aRange=4, lambda=exp(lglam)) > ##D return(-1* out$lnProfileLike)} > > ##D hold1<-rep( NA, NSIM) > ##D yt<- rep( 1, N) > ##D obj<- Krig( x,yt, aRange=4) > > > ##D E<- matrix( rnorm( NSIM*N), ncol=NSIM) > > ##D for ( j in 1:NSIM){ > ##D cat( j, " ") > ##D ytemp <- x%*%c(1,2) + t(Mc)%*%E[,j] > ##D out<- optim( log(.2), temp.fun, method="BFGS") > ##D hold2[j]<- exp(out$par) > ##D hold1[j]<- gcv.Krig(obj, y=ytemp)$lambda.est[6,1] > > ##D } > ##D test.for.zero( median( hold1), .2, tol=.08) > ##D test.for.zero( median( hold2), .2, tol=.12) > > > > > > > > > > > > > > > > proc.time() user system elapsed 1.770 0.161 1.888 fields/tests/spam.test.R0000644000176200001440000001005614275214521014730 0ustar liggesusers# # fields is a package for analysis of spatial data written for # the R software environment. # Copyright (C) 2022 Colorado School of Mines # 1500 Illinois St., Golden, CO 80401 # Contact: Douglas Nychka, douglasnychka@gmail.edu, # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with the R software environment if not, write to the Free Software # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA # or see http://www.r-project.org/Licenses/GPL-2 ##END HEADER ##END HEADER # test of rdist.near suppressMessages(library(fields)) options(echo=FALSE) test.for.zero.flag<- 1 set.seed(123) x1<- matrix( runif(2*20), ncol=2) x2<- matrix( runif(2*10), ncol=2) fields.rdist.near( x1,x2, delta=.75)-> look temp<- matrix( NA, nrow(x1),nrow(x2)) temp[ look$ind] <- look$ra temp2<- rdist( x1, x2) temp2[ temp2> .75] <- NA temp[ is.na( temp)]<- 0 temp2[ is.na( temp2)]<- 0 test.for.zero( temp, temp2) # test of constructing covariance matrix # and also versions of Wendland function # default taper is wendland k=2. DD<- rdist( x1,x2) temp<- Wendland2.2(DD, aRange=.8) temp2<- Wendland( DD, aRange=.8, dimension=2, k=2) test.for.zero( temp, temp2) stationary.taper.cov( x1,x2, Taper="Wendland2.2", Taper.args= list( aRange=.8), spam.format=FALSE )-> look temp0<- look stationary.taper.cov( x1,x2, Taper="Wendland2.2", Taper.args= list( aRange=.8), spam.format=TRUE )-> look temp1<- spam2full( look) test.for.zero( temp1, temp0) stationary.taper.cov( x1,x2, Taper="Wendland", Taper.args= list( aRange=.8, k=2, dimension=2), spam.format=TRUE )-> look temp1b<- spam2full( look) temp2<- Wendland2.2(DD, aRange=.8) * Exponential(DD) temp3<- wendland.cov(x1,x2, k=2, aRange=.8) * Exponential(DD) temp4<- Wendland(DD, k=2, dimension=2, aRange=.8)* Exponential(DD) test.for.zero( temp1, temp0, rel=FALSE) test.for.zero( temp1b, temp0, rel=FALSE) test.for.zero( temp2, temp0, rel=FALSE) test.for.zero( temp2, temp3,rel=FALSE) test.for.zero( temp2, temp4,rel=FALSE) set.seed( 256) rv<- runif( nrow(x2)) # test of multiply stationary.taper.cov( x1, x2, C= rv)-> look temp2<-stationary.taper.cov( x1,x2) spam2full(temp2)%*%(rv)-> look2 test.for.zero( look, look2) # set.seed( 123) temp<- matrix( 1:48, ncol=6, nrow=8) temp[ sample( 1:48, 20)] <- 0 as.spam( temp)-> temp2 test.for.zero( spam2full(temp2), temp ) spam2spind( temp2)-> temp3 test.for.zero( spind2full( temp3), temp) test.for.zero( spind2spam( temp3),temp2) # test that ordering works MM<- nrow( temp3$ind) ix<- sample( 1:MM,MM) # shuffle temp3 temp3$ind<- temp3$ind[ix,] temp3$ra<- temp3$ra[ix] test.for.zero( spind2spam( temp3),temp2) # temp<- temp[1:4, 1:5] for help file # set.seed( 234) CC<- matrix( rnorm( 64), 8,8) A<- ( CC)%*% t(CC) as.spam( A)-> As test.for.zero( solve( As), solve( A)) set.seed( 233) CC<- diag( 1, 8) CC[4,1:8] <- rnorm(8) CC[7,1:8] <- rnorm(8) A<- ( CC)%*% t(CC) as.spam( A)-> As test.for.zero( solve( As), solve( A)) data( ozone2) x<- ozone2$lon.lat y<- ozone2$y[16,] Krig(x,y, cov.function = "stationary.taper.cov", aRange=1.5, give.warnings=FALSE, cov.args= list( spam.format=FALSE, Taper.args= list( dimension=2, aRange=2.0,k=3) ) ) -> out1 Krig(x,y, cov.function = "stationary.taper.cov", lambda=2.0, aRange=1.5, cov.args= list( spam.format=TRUE, Taper.args= list( aRange=2.0,k=3, dimension=2) ) ) -> out2 temp1<- predict( out1,lambda=2.0) temp2<- predict( out2) test.for.zero( temp1, temp2) cat( "All done with SPAM tests", fill=TRUE) options(echo=TRUE) fields/tests/mKrigREMLTest.Rout.save0000644000176200001440000000435014275255352017077 0ustar liggesusers R version 4.2.1 (2022-06-23) -- "Funny-Looking Kid" Copyright (C) 2022 The R Foundation for Statistical Computing Platform: x86_64-apple-darwin17.0 (64-bit) R is free software and comes with ABSOLUTELY NO WARRANTY. You are welcome to redistribute it under certain conditions. Type 'license()' or 'licence()' for distribution details. R is a collaborative project with many contributors. Type 'contributors()' for more information and 'citation()' on how to cite R or R packages in publications. Type 'demo()' for some demos, 'help()' for on-line help, or 'help.start()' for an HTML browser interface to help. Type 'q()' to quit R. > # > # fields is a package for analysis of spatial data written for > # the R software environment. > # Copyright (C) 2022 Colorado School of Mines > # 1500 Illinois St., Golden, CO 80401 > # Contact: Douglas Nychka, douglasnychka@gmail.edu, > # > # This program is free software; you can redistribute it and/or modify > # it under the terms of the GNU General Public License as published by > # the Free Software Foundation; either version 2 of the License, or > # (at your option) any later version. > # This program is distributed in the hope that it will be useful, > # but WITHOUT ANY WARRANTY; without even the implied warranty of > # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the > # GNU General Public License for more details. > # > # You should have received a copy of the GNU General Public License > # along with the R software environment if not, write to the Free Software > # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA > # or see http://www.r-project.org/Licenses/GPL-2 > ##END HEADER > ##END HEADER > > > suppressMessages(library(fields)) > options( echo=FALSE) PASSED test at tolerance 1e-08 Testing: mKrigOmega PASSED test at tolerance 1e-08 Testing: lnDetOmega PASSED test at tolerance 1e-08 Testing: lnDetMc PASSED test at tolerance 1e-08 Testing: testing det Omega formula PASSED test at tolerance 1e-08 Testing: REML Det shortcut PASSED test at tolerance 1e-08 Testing: Q2 Det and Eigen Det PASSED test at tolerance 1e-08 Testing: sigma.MLE Krig verses mKrig PASSED test at tolerance 1e-08 > proc.time() user system elapsed 1.965 0.077 2.028 fields/tests/mKrig.se.test.Rout.save0000644000176200001440000000521214275255352017141 0ustar liggesusers R version 4.2.1 (2022-06-23) -- "Funny-Looking Kid" Copyright (C) 2022 The R Foundation for Statistical Computing Platform: x86_64-apple-darwin17.0 (64-bit) R is free software and comes with ABSOLUTELY NO WARRANTY. You are welcome to redistribute it under certain conditions. Type 'license()' or 'licence()' for distribution details. R is a collaborative project with many contributors. Type 'contributors()' for more information and 'citation()' on how to cite R or R packages in publications. Type 'demo()' for some demos, 'help()' for on-line help, or 'help.start()' for an HTML browser interface to help. Type 'q()' to quit R. > # > # fields is a package for analysis of spatial data written for > # the R software environment. > # Copyright (C) 2022 Colorado School of Mines > # 1500 Illinois St., Golden, CO 80401 > # Contact: Douglas Nychka, douglasnychka@gmail.edu, > # > # This program is free software; you can redistribute it and/or modify > # it under the terms of the GNU General Public License as published by > # the Free Software Foundation; either version 2 of the License, or > # (at your option) any later version. > # This program is distributed in the hope that it will be useful, > # but WITHOUT ANY WARRANTY; without even the implied warranty of > # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the > # GNU General Public License for more details. > # > # You should have received a copy of the GNU General Public License > # along with the R software environment if not, write to the Free Software > # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA > # or see http://www.r-project.org/Licenses/GPL-2 > ##END HEADER > ##END HEADER > > > > # tests of predictSE > # against direct linear algebra > > suppressMessages(library(fields)) > options( echo=FALSE) Testing: Amatrix vs. predict PASSED test at tolerance 1e-08 Testing: Marginal predictSE PASSED test at tolerance 1e-08 Testing: comparing Omega PASSED test at tolerance 1e-08 PASSED test at tolerance 1e-08 PASSED test at tolerance 1e-08 Testing: test of formula with explicit d and c PASSED test at tolerance 1e-08 Testing: Krig function and direct formula PASSED test at tolerance 1e-08 Testing: new predict formula and direct formula PASSED test at tolerance 1e-08 Testing: New se _function_ and old Krig _function_ PASSED test at tolerance 1e-08 Testing: Benchmark of formula PASSED test at tolerance 1e-08 Testing: Benchmark of formula mKrig coefs PASSED test at tolerance 1e-08 Testing: test function with several locations Krig mKrig functions PASSED test at tolerance 1e-08 > proc.time() user system elapsed 0.810 0.070 0.888 fields/tests/Likelihood.test.Rout.save0000644000176200001440000000467614275255352017562 0ustar liggesusers R version 4.2.1 (2022-06-23) -- "Funny-Looking Kid" Copyright (C) 2022 The R Foundation for Statistical Computing Platform: x86_64-apple-darwin17.0 (64-bit) R is free software and comes with ABSOLUTELY NO WARRANTY. You are welcome to redistribute it under certain conditions. Type 'license()' or 'licence()' for distribution details. R is a collaborative project with many contributors. Type 'contributors()' for more information and 'citation()' on how to cite R or R packages in publications. Type 'demo()' for some demos, 'help()' for on-line help, or 'help.start()' for an HTML browser interface to help. Type 'q()' to quit R. > # > # fields is a package for analysis of spatial data written for > # the R software environment. > # Copyright (C) 2022 Colorado School of Mines > # 1500 Illinois St., Golden, CO 80401 > # Contact: Douglas Nychka, douglasnychka@gmail.edu, > # > # This program is free software; you can redistribute it and/or modify > # it under the terms of the GNU General Public License as published by > # the Free Software Foundation; either version 2 of the License, or > # (at your option) any later version. > # This program is distributed in the hope that it will be useful, > # but WITHOUT ANY WARRANTY; without even the implied warranty of > # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the > # GNU General Public License for more details. > # > # You should have received a copy of the GNU General Public License > # along with the R software environment if not, write to the Free Software > # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA > # or see http://www.r-project.org/Licenses/GPL-2 > ##END HEADER > ##END HEADER > > > > # this is a test script to verify the likelihood computations are > # correct with the eigen decomposition format used in Krig > # see Krig.flplike for the concise computation. > # > > suppressMessages(library(fields)) > > options( echo=FALSE) Testing: check ccoef PASSED test at tolerance 1e-08 Testing: llike profile from mKrig PASSED test at tolerance 1e-08 Testing: ccoefs PASSED test at tolerance 1e-08 Testing: RSS using matrices PASSED test at tolerance 1e-08 PASSED test at tolerance 5e-08 Testing: quad form PASSED test at tolerance 1e-08 Testing: det PASSED test at tolerance 1e-08 Testing: REML using matrices PASSED test at tolerance 1e-08 all done with likelihood tests > > > proc.time() user system elapsed 1.004 0.102 1.110 fields/tests/diag.multiply.test.Rout.save0000644000176200001440000000365314275255352020253 0ustar liggesusers R version 4.2.1 (2022-06-23) -- "Funny-Looking Kid" Copyright (C) 2022 The R Foundation for Statistical Computing Platform: x86_64-apple-darwin17.0 (64-bit) R is free software and comes with ABSOLUTELY NO WARRANTY. You are welcome to redistribute it under certain conditions. Type 'license()' or 'licence()' for distribution details. R is a collaborative project with many contributors. Type 'contributors()' for more information and 'citation()' on how to cite R or R packages in publications. Type 'demo()' for some demos, 'help()' for on-line help, or 'help.start()' for an HTML browser interface to help. Type 'q()' to quit R. > # > # fields is a package for analysis of spatial data written for > # the R software environment. > # Copyright (C) 2022 Colorado School of Mines > # 1500 Illinois St., Golden, CO 80401 > # Contact: Douglas Nychka, douglasnychka@gmail.edu, > # > # This program is free software; you can redistribute it and/or modify > # it under the terms of the GNU General Public License as published by > # the Free Software Foundation; either version 2 of the License, or > # (at your option) any later version. > # This program is distributed in the hope that it will be useful, > # but WITHOUT ANY WARRANTY; without even the implied warranty of > # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the > # GNU General Public License for more details. > # > # You should have received a copy of the GNU General Public License > # along with the R software environment if not, write to the Free Software > # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA > # or see http://www.r-project.org/Licenses/GPL-2 > ##END HEADER > ##END HEADER > > suppressMessages(library(fields)) > options( echo=FALSE) PASSED test at tolerance 1e-08 PASSED test at tolerance 1e-08 PASSED test at tolerance 1e-08 All done with testing diag multiply > > proc.time() user system elapsed 0.776 0.070 0.833 fields/tests/sreg.test.R0000644000176200001440000000444314275214521014733 0ustar liggesusers# # fields is a package for analysis of spatial data written for # the R software environment. # Copyright (C) 2022 Colorado School of Mines # 1500 Illinois St., Golden, CO 80401 # Contact: Douglas Nychka, douglasnychka@gmail.edu, # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with the R software environment if not, write to the Free Software # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA # or see http://www.r-project.org/Licenses/GPL-2 ##END HEADER ##END HEADER # test of sreg and related functions suppressMessages(library(fields)) options(echo=FALSE) test.for.zero.flag<- 1 set.seed(123) # Tps has been tested from scratch using basic linear algebra # so test sreg against this x<- rat.diet$t y<- rat.diet$trt sreg( x,y, lambda= 10)-> out Tps( x,y, scale="unscaled", lambda=10*length(y))-> out2 test.for.zero( out$fitted.values, out2$fitted.values, tag="predict at lambda sreg/Tps") #### GCV test sreg( x,y, tol=1e-12)-> out gcv.sreg( out, tol=1e-12)$lambda.est -> look0 test.for.zero( out$lambda.est[1,2], look0[1,2], tol=5e-4) Tps( x,y)-> out2 KrigFindLambda( out2, tol=1e-6)$lambda.est[1,2]-> look2 gcv.sreg( out, tol=1e-12)$lambda.est[1,2] -> look test.for.zero( look, look2, tol=2e-3, tag="GCV sreg/Tps") #### replications set.seed( 123) x<- rep(rat.diet$t,3) y<- rep( rat.diet$trt,3) + rnorm(39*3)*5 sreg( x,y)-> out gcv.sreg( out, tol=1e-8)$lambda.est -> look Tps( x,y, scale="unscaled")-> out2 KrigFindLambda( out2, tol=1e-5)$lambda.est-> look2 look2[,1]<- look2[,1]/length( out$xM) test.for.zero( look[1:3,3], look2[1:3,3], tag="GCV sreg/Tps reps case",tol=1e-06) test.for.zero( look[2,3], look2[2,3], tol=1e-6, tag="GCV sreg/Tps reps case") cat( "All done with sreg tests", fill=TRUE) options(echo=TRUE) fields/tests/Krig.se.grid.test.R0000644000176200001440000000531714275214521016222 0ustar liggesusers# # fields is a package for analysis of spatial data written for # the R software environment. # Copyright (C) 2022 Colorado School of Mines # 1500 Illinois St., Golden, CO 80401 # Contact: Douglas Nychka, douglasnychka@gmail.edu, # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with the R software environment if not, write to the Free Software # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA # or see http://www.r-project.org/Licenses/GPL-2 ##END HEADER ##END HEADER suppressMessages(library(fields)) # tests of predict.se # using approximations for conditional simulation on a grid. # options( echo=FALSE) test.for.zero.flag<-1 long.test.flag<- FALSE data( ozone2) as.image(ozone2$y[16,], x= ozone2$lon.lat, ny=24, nx=20, na.rm=TRUE)-> dtemp # # A useful discretized version of ozone2 data x<- cbind(dtemp$x[dtemp$ind[,1]], dtemp$y[dtemp$ind[,2]]) y<- dtemp$z[ dtemp$ind] weights<- dtemp$weights[ dtemp$ind] Krig( x, y, Covariance="Matern", aRange=1.0, smoothness=1.0, weights=weights) -> out if(long.test.flag){ # the grid ... glist<- list( x= dtemp$x, y=dtemp$y) set.seed( 233) sim.Krig.approx( out, grid= glist, M=200, extrap=TRUE)-> look predict.surface.se( out, grid=glist, extrap=TRUE)-> test look2<- matrix( NA, 20,24) for( k in 1:24){ for ( j in 1:20){ look2[j,k] <- sqrt(var( look$z[j,k,], na.rm=TRUE)) } } test.for.zero( mean( abs(look2- test$z)/test$z), 0, relative=FALSE, tol=.05, tag="Conditional simulation marginal se for grid") # # test for covariances ind0<- expand.grid( c(1,4,5,10), c(3,4,5,10, 15)) x0<- cbind( glist$x[ind0[,1]], glist$y[ind0[,2]]) look2<- matrix( NA, 200,20) for( k in 1:20){ look2[,k] <- look$z[ ind0[k,1], ind0[k,2],]} predict.se( out, x0, cov=TRUE)-> test2 ds<- 1/sqrt(diag(test2)) test3<- diag(ds)%*% test2 %*% diag(ds) #check plot( diag( test2), diag( var( look2))) # Another plot to look at plot( c(test3), c(cor(look2))) hold<-cor(look2) upper<- col(hold)> row( hold) dd<- (c(hold)- c(test3))[upper] test.for.zero( mean( abs(dd)) ,0, relative=FALSE, tol=.05, tag="Conditional simulation correlations for grid (RMSE) ") } # end long test block cat( "all done with grid based se tests", fill=TRUE) options( echo=TRUE) fields/tests/Krig.se.test.Rout.save0000644000176200001440000001357114275255352016773 0ustar liggesusers R version 4.2.1 (2022-06-23) -- "Funny-Looking Kid" Copyright (C) 2022 The R Foundation for Statistical Computing Platform: x86_64-apple-darwin17.0 (64-bit) R is free software and comes with ABSOLUTELY NO WARRANTY. You are welcome to redistribute it under certain conditions. Type 'license()' or 'licence()' for distribution details. R is a collaborative project with many contributors. Type 'contributors()' for more information and 'citation()' on how to cite R or R packages in publications. Type 'demo()' for some demos, 'help()' for on-line help, or 'help.start()' for an HTML browser interface to help. Type 'q()' to quit R. > # > # fields is a package for analysis of spatial data written for > # the R software environment. > # Copyright (C) 2022 Colorado School of Mines > # 1500 Illinois St., Golden, CO 80401 > # Contact: Douglas Nychka, douglasnychka@gmail.edu, > # > # This program is free software; you can redistribute it and/or modify > # it under the terms of the GNU General Public License as published by > # the Free Software Foundation; either version 2 of the License, or > # (at your option) any later version. > # This program is distributed in the hope that it will be useful, > # but WITHOUT ANY WARRANTY; without even the implied warranty of > # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the > # GNU General Public License for more details. > # > # You should have received a copy of the GNU General Public License > # along with the R software environment if not, write to the Free Software > # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA > # or see http://www.r-project.org/Licenses/GPL-2 > ##END HEADER > ##END HEADER > > > suppressMessages(library(fields)) > > # tests of predictSE > # against direct linear algebra > > #options( echo=FALSE) > > > > x0<- expand.grid( c(-8,-4,0,20,30), c(10,8,4,0)) > > > out<- Krig( ChicagoO3$x, ChicagoO3$y, cov.function = "Exp.cov", aRange=50) > > > # direct calculation > Krig.Amatrix( out, x=x0)-> A > test.for.zero( A%*%ChicagoO3$y, predict( out, x0),tag="Amatrix vs. predict") Testing: Amatrix vs. predict PASSED test at tolerance 1e-08 > > Sigma<- out$sigmahat*Exp.cov( ChicagoO3$x, ChicagoO3$x, aRange=50) > S0<- out$sigmahat*c(Exp.cov( x0, x0, aRange=50)) > S1<- out$sigmahat*Exp.cov( out$x, x0, aRange=50) > > #yhat= Ay > #var( f0 - yhat)= var( f0) - 2 cov( f0,yhat)+ cov( yhat) > > look<- S0 - t(S1)%*% t(A) - A%*%S1 + + A%*% ( Sigma + diag(out$tauHat.MLE**2/out$weightsM))%*% t(A) > # > #compare to > # diagonal elements > > > test2<- predictSE( out, x= x0) > test.for.zero( sqrt(diag( look)), test2,tag="Marginal predictSE") Testing: Marginal predictSE PASSED test at tolerance 1e-08 > > out2<- Krig( ChicagoO3$x, ChicagoO3$y, cov.function = "Exp.cov", aRange=50, + lambda=out$lambda) > > test2<- predictSE( out2, x= x0) > test.for.zero( sqrt(diag( look)), test2,tag="Marginal predictSE fixed ") Testing: Marginal predictSE fixed PASSED test at tolerance 1e-08 > > test<- predictSE( out, x= x0, cov=TRUE) > test.for.zero( look, test,tag="Full covariance predictSE") Testing: Full covariance predictSE PASSED test at tolerance 1e-08 > > > # simulation based. > > set.seed( 333) > > sim.Krig( out, x0,M=4e3)-> test > # columns are the realizations rows are locations > > var(t(test))-> look > > predictSE( out, x=x0)-> test2 > mean( diag( look)/ test2**2)-> look2 > test.for.zero(look2, 1.0, tol=1.5e-2, tag="Marginal standard Cond. Sim.") Testing: Marginal standard Cond. Sim. PASSED test at tolerance 0.015 > > predictSE( out, x=x0, cov=TRUE)-> test2 > > # multiply simulated values by inverse square root of covariance > # to make them white > > eigen( test2, symmetric=TRUE)-> hold > hold$vectors%*% diag( 1/sqrt( hold$values))%*% t( hold$vectors)-> hold > cor(t(test)%*% hold)-> hold2 > # off diagonal elements of correlations -- expected values are zero. > > abs(hold2[ col(hold2)> row( hold2)])-> hold3 > > test.for.zero( mean(hold3), 0, relative=FALSE, tol=.02, + tag="Full covariance standard Cond. Sim.") Testing: Full covariance standard Cond. Sim. PASSED test at tolerance 0.02 > > > # test of A matrix > # > # first create and check a gridded test case. > > > data( ozone2) > as.image(ozone2$y[16,], x= ozone2$lon.lat, ny=24, nx=20, + na.rm=TRUE)-> dtemp > # > # A useful disctrtized version of ozone2 data > > x<- dtemp$xd > y<- dtemp$z[ dtemp$ind] > weights<- dtemp$weights[ dtemp$ind] > > Krig( x, y, Covariance="Matern", + aRange=1.0, smoothness=1.0, weights=weights) -> out > > > > set.seed(234) > ind0<- cbind( sample( 1:20, 5), sample( 1:24, 5)) > > x0<- cbind( dtemp$x[ind0[,1]], dtemp$y[ind0[,2]]) > > # an inline check plot(out$x, cex=2); points( x0, col="red", pch="+",cex=2) > > # direct calculation as backup ( also checks weighted case) > > Krig.Amatrix( out, x=x0)-> A > test.for.zero( A%*%out$yM, predict( out, x0),tag="Amatrix vs. predict") Testing: Amatrix vs. predict PASSED test at tolerance 1e-08 > > Sigma<- out$sigmahat*stationary.cov( + out$xM, out$xM, aRange=1.0,smoothness=1.0, Covariance="Matern") > > S0<- out$sigmahat*stationary.cov( + x0, x0, aRange=1.0,smoothness=1.0, Covariance="Matern") > > S1<- out$sigmahat*stationary.cov( + out$xM, x0, aRange=1.0,smoothness=1.0, Covariance="Matern") > > > > #yhat= Ay > #var( f0 - yhat)= var( f0) - 2 cov( f0,yhat)+ cov( yhat) > > look<- S0 - t(S1)%*% t(A) - A%*%S1 + + A%*% ( Sigma + diag(out$tauHat.MLE**2/out$weightsM) )%*% t(A) > > test<- predictSE( out, x0, cov=TRUE) > > test.for.zero( c( look), c( test), tag="Weighted case and exact for ozone2 full + cov", tol=1e-8) Testing: Weighted case and exact for ozone2 full cov PASSED test at tolerance 1e-08 > > > cat("all done testing predictSE.Krig ", fill=TRUE) all done testing predictSE.Krig > options( echo=TRUE) > > proc.time() user system elapsed 2.991 0.107 3.124 fields/tests/cov.test2.Rout.save0000644000176200001440000001051714275255352016337 0ustar liggesusers R version 4.2.1 (2022-06-23) -- "Funny-Looking Kid" Copyright (C) 2022 The R Foundation for Statistical Computing Platform: x86_64-apple-darwin17.0 (64-bit) R is free software and comes with ABSOLUTELY NO WARRANTY. You are welcome to redistribute it under certain conditions. Type 'license()' or 'licence()' for distribution details. R is a collaborative project with many contributors. Type 'contributors()' for more information and 'citation()' on how to cite R or R packages in publications. Type 'demo()' for some demos, 'help()' for on-line help, or 'help.start()' for an HTML browser interface to help. Type 'q()' to quit R. > # > # fields is a package for analysis of spatial data written for > # the R software environment. > # Copyright (C) 2022 Colorado School of Mines > # 1500 Illinois St., Golden, CO 80401 > # Contact: Douglas Nychka, douglasnychka@gmail.edu, > # > # This program is free software; you can redistribute it and/or modify > # it under the terms of the GNU General Public License as published by > # the Free Software Foundation; either version 2 of the License, or > # (at your option) any later version. > # This program is distributed in the hope that it will be useful, > # but WITHOUT ANY WARRANTY; without even the implied warranty of > # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the > # GNU General Public License for more details. > # > # You should have received a copy of the GNU General Public License > # along with the R software environment if not, write to the Free Software > # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA > # or see http://www.r-project.org/Licenses/GPL-2 > ##END HEADER > ##END HEADER > > > suppressMessages(library(fields)) > options( echo=FALSE) PASSED test at tolerance 1e-08 PASSED test at tolerance 1e-08 PASSED test at tolerance 1e-08 PASSED test at tolerance 1e-08 PASSED test at tolerance 1e-08 PASSED test at tolerance 1e-08 Testing: taper with great circle PASSED test at tolerance 2e-06 Testing: high level test of taper cov PASSED test at tolerance 1e-08 Testing: high level test of taper cov PASSED test at tolerance 1e-07 Testing: stationary.cov versus stationary.cov compact distMat PASSED test at tolerance 1e-08 Testing: stationary.cov versus stationary.cov matrix distMat PASSED test at tolerance 1e-08 Testing: stationary.cov versus stationary.cov asymmetric distMat PASSED test at tolerance 1e-08 Testing: Exp.cov versus Exp.cov compact distMat PASSED test at tolerance 1e-08 Testing: Exp.cov versus Exp.cov matrix distMat PASSED test at tolerance 1e-08 Testing: Exp.cov versus Exp.cov asymmetric distMat PASSED test at tolerance 1e-08 Testing: stationary.cov vs stationary.cov with C set, compact distMat PASSED test at tolerance 1e-08 Testing: stationary.cov vs stationary.cov with C set, matrix distMat PASSED test at tolerance 1e-08 Testing: stationary.cov vs Exp.cov with C set, no distMat PASSED test at tolerance 1e-08 Testing: stationary.cov vs Exp.cov with C set, compact distMat PASSED test at tolerance 1e-08 Testing: stationary.cov vs Exp.cov with C set, matrix distMat PASSED test at tolerance 1e-08 Testing: stationary.cov vs stationary.cov with C set and asymmetric distMat given PASSED test at tolerance 1e-08 Testing: Exp.cov vs Exp.cov with C set and asymmetric distMat given PASSED test at tolerance 1e-08 Testing: onlyUpper=TRUE: stationary.cov versus Exp.cov PASSED test at tolerance 1e-08 Testing: onlyUpper=TRUE: stationary.cov versus stationary.cov with compactDistMat PASSED test at tolerance 1e-08 Testing: onlyUpper=TRUE: stationary.cov versus Exp.cov with compactDistMat PASSED test at tolerance 1e-08 Testing: onlyUpper=TRUE: stationary.cov versus stationary.cov with matrix distMat PASSED test at tolerance 1e-08 Testing: onlyUpper=TRUE: stationary.cov versus Exp.cov with matrix distMat PASSED test at tolerance 1e-08 Testing: Testing p=1 v 2 PASSED test at tolerance 1e-08 Testing: Testing p=2 v 3 PASSED test at tolerance 1e-08 Testing: Testing p=2 v 2 with distMat PASSED test at tolerance 1e-08 Testing: Testing aRange=1 v 2 PASSED test at tolerance 1e-08 Testing: Testing aRange=2 v 3 PASSED test at tolerance 1e-08 Testing: Testing aRange=2 v 2 with distMat PASSED test at tolerance 1e-08 end tests of V argument in covariances > proc.time() user system elapsed 0.840 0.073 0.902 fields/tests/fastTpsPredict.test.R0000644000176200001440000000455314275214521016734 0ustar liggesusers# # fields is a package for analysis of spatial data written for # the R software environment. # Copyright (C) 2022 Colorado School of Mines # 1500 Illinois St., Golden, CO 80401 # Contact: Douglas Nychka, douglasnychka@gmail.edu, # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with the R software environment if not, write to the Free Software # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA # or see http://www.r-project.org/Licenses/GPL-2 ##END HEADER ##END HEADER suppressMessages(library(fields)) options(echo=FALSE) test.for.zero.flag<-1 set.seed(123) nc<- 10 center<- matrix( runif(nc*2), nc,2) grid.list<- list( x= seq(0,1,,10), y=seq( 0,1,,15)) coef<- rnorm( nc) delta<- .3 out<- multWendlandGrid( grid.list,center, delta, coef) xg<- make.surface.grid( grid.list) test<- Wendland2.2( rdist( xg, center)/delta)%*% coef test.for.zero.flag<-1 test.for.zero( test, out, tag="Comparing FORTRAN grid eval to matrix vector multiplication") # testing predictSurface function nc<- 100 set.seed(12) x<- matrix( runif(nc*2), nc,2) y<- rnorm( nc) delta<- .2 obj<- fastTps( x,y, aRange=delta, lambda=.1) grid.list<- list( x= seq(0,1,,3), y=seq( 0,1,,4)) xg<- make.surface.grid( grid.list) look0<- c(predict( obj, xg)) look1<- predictSurface( obj, grid.list, extrap=TRUE) look2<- predict.mKrig( obj, xg) test.for.zero( look0, c(look1$z), tag="testing PredictSurface and predict.fastTps") test.for.zero( look0, c(look2), tag="testing PredictSurface with slower mKrig predict") # new y set.seed(123) ynew<- rnorm( nc) look0<- c(predict( obj, xg, ynew=ynew)) look1<- predictSurface( obj, grid.list, ynew=ynew, extrap=TRUE) look2<- c(predict(fastTps( x,ynew, aRange=delta, lambda=.1) , xg, ynew=ynew)) test.for.zero( look0, look2,tag="predict with ynew") test.for.zero( look0, c(look1$z), tag="predictSurface with ynew") options( echo=TRUE) # fields/tests/sreg.test.Rout.save0000644000176200001440000000424514275255352016427 0ustar liggesusers R version 4.2.1 (2022-06-23) -- "Funny-Looking Kid" Copyright (C) 2022 The R Foundation for Statistical Computing Platform: x86_64-apple-darwin17.0 (64-bit) R is free software and comes with ABSOLUTELY NO WARRANTY. You are welcome to redistribute it under certain conditions. Type 'license()' or 'licence()' for distribution details. R is a collaborative project with many contributors. Type 'contributors()' for more information and 'citation()' on how to cite R or R packages in publications. Type 'demo()' for some demos, 'help()' for on-line help, or 'help.start()' for an HTML browser interface to help. Type 'q()' to quit R. > # > # fields is a package for analysis of spatial data written for > # the R software environment. > # Copyright (C) 2022 Colorado School of Mines > # 1500 Illinois St., Golden, CO 80401 > # Contact: Douglas Nychka, douglasnychka@gmail.edu, > # > # This program is free software; you can redistribute it and/or modify > # it under the terms of the GNU General Public License as published by > # the Free Software Foundation; either version 2 of the License, or > # (at your option) any later version. > # This program is distributed in the hope that it will be useful, > # but WITHOUT ANY WARRANTY; without even the implied warranty of > # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the > # GNU General Public License for more details. > # > # You should have received a copy of the GNU General Public License > # along with the R software environment if not, write to the Free Software > # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA > # or see http://www.r-project.org/Licenses/GPL-2 > ##END HEADER > ##END HEADER > > > # test of sreg and related functions > > suppressMessages(library(fields)) > options(echo=FALSE) Testing: predict at lambda sreg/Tps PASSED test at tolerance 1e-08 PASSED test at tolerance 5e-04 Testing: GCV sreg/Tps PASSED test at tolerance 0.002 Testing: GCV sreg/Tps reps case PASSED test at tolerance 1e-06 Testing: GCV sreg/Tps reps case PASSED test at tolerance 1e-06 All done with sreg tests > > > > > > > > > > > proc.time() user system elapsed 1.109 0.080 1.182 fields/tests/vgram2.test.Rout.save0000644000176200001440000000412214275276625016665 0ustar liggesusers R version 4.2.1 (2022-06-23) -- "Funny-Looking Kid" Copyright (C) 2022 The R Foundation for Statistical Computing Platform: x86_64-apple-darwin17.0 (64-bit) R is free software and comes with ABSOLUTELY NO WARRANTY. You are welcome to redistribute it under certain conditions. Type 'license()' or 'licence()' for distribution details. R is a collaborative project with many contributors. Type 'contributors()' for more information and 'citation()' on how to cite R or R packages in publications. Type 'demo()' for some demos, 'help()' for on-line help, or 'help.start()' for an HTML browser interface to help. Type 'q()' to quit R. > # > # fields is a package for analysis of spatial data written for > # the R software environment. > # Copyright (C) 2022 Colorado School of Mines > # 1500 Illinois St., Golden, CO 80401 > # Contact: Douglas Nychka, douglasnychka@gmail.edu, > # > # This program is free software; you can redistribute it and/or modify > # it under the terms of the GNU General Public License as published by > # the Free Software Foundation; either version 2 of the License, or > # (at your option) any later version. > # This program is distributed in the hope that it will be useful, > # but WITHOUT ANY WARRANTY; without even the implied warranty of > # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the > # GNU General Public License for more details. > # > # You should have received a copy of the GNU General Public License > # along with the R software environment if not, write to the Free Software > # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA > # or see http://www.r-project.org/Licenses/GPL-2 > ##END HEADER > ##END HEADER > > > # test of vgram > > suppressMessages(library(fields)) > options(echo=FALSE) Testing: vgram single time PASSED test at tolerance 1e-08 Testing: vgram more than one time point PASSED test at tolerance 1e-08 Testing: correlogram versus covariogram PASSED test at tolerance 1e-08 Testing: correlogram versus covariogram PASSED test at tolerance 1e-08 > proc.time() user system elapsed 0.850 0.077 0.925 fields/tests/cov.test2.R0000644000176200001440000002245414275214521014646 0ustar liggesusers# # fields is a package for analysis of spatial data written for # the R software environment. # Copyright (C) 2022 Colorado School of Mines # 1500 Illinois St., Golden, CO 80401 # Contact: Douglas Nychka, douglasnychka@gmail.edu, # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with the R software environment if not, write to the Free Software # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA # or see http://www.r-project.org/Licenses/GPL-2 ##END HEADER ##END HEADER suppressMessages(library(fields)) options( echo=FALSE) test.for.zero.flag<- 1 data(ozone2) y<- ozone2$y[16,] x<- ozone2$lon.lat # # Omit the NAs good<- !is.na( y) x<- x[good,] y<- y[good] x1<- x[1:20,] x2<- x[1:10,] look<- exp(-1*rdist(x1,x2)/4) look2<- stationary.cov( x1,x2, aRange=4) test.for.zero( look, look2) V<- matrix( c(2,1,0,4), 2,2) Vi<- solve( V) u1<- t(Vi%*% t(x1)) u2<- t(Vi%*% t(x2)) look<- exp(-1*rdist(u1,u2)) look2<- stationary.cov( x1,x2, V= V) test.for.zero( look, look2) look<- Wendland(rdist(u1,u2), k=3, dimension=2) look2<- stationary.cov( x1,x2, V= V, Covariance = "Wendland", k=3, dimension=2) test.for.zero( look, look2) x1<- x[1:5,] x2<- x[2:6,] V<- matrix( c(2,1,0,4), 2,2) Vi<- solve( V) u1<- x1 u2<- x2 look1a<- exp(-1*rdist(u1,u2)) look1b<- Wendland(rdist(u1,u2), k=3, dimension=2, aRange= 1) look1<- look1a*look1b look2<- stationary.taper.cov( x1,x2, aRange=1, Taper.args=list( aRange=1,k=3, dimension=2), verbose=FALSE) test.for.zero( look1, as.matrix(look2)) u1<- t(Vi%*% t(x1)) u2<- t(Vi%*% t(x2)) look1a<- exp(-1*rdist(u1,u2)) look1b<- Wendland(rdist(u1,u2), k=3, dimension=2, aRange= 1.5) look1<- look1a*look1b look2<- stationary.taper.cov( x1,x2,V=V, Taper.args=list( aRange=1.5,k=3, dimension=2), verbose=FALSE) test.for.zero( look1, as.matrix(look2)) u1<- t(Vi%*% t(x1)) u2<- t(Vi%*% t(x2)) look1a<- Matern(rdist(u1,u2), smoothness=1.5) look1b<- Wendland(rdist(u1,u2), k=3, dimension=2, aRange= 1.5) look1<- look1a*look1b look2<- stationary.taper.cov( x1,x2,V=V,Covariance=Matern, smoothness=1.5, Taper.args=list( aRange=1.5,k=3, dimension=2), verbose=FALSE) test.for.zero( look1, as.matrix(look2)) # some tests of great circle distance stationary.taper.cov( x[1:3,],x[1:10,] , aRange=200, Taper.args= list(k=2,aRange=300, dimension=2), Dist.args=list( method="greatcircle") )-> temp # temp is now a tapered 3X10 cross covariance matrix in sparse format. # should be identical to # the direct matrix product temp2<- Exponential( rdist.earth(x[1:3,],x[1:10,]), range=200) * Wendland(rdist.earth(x[1:3,],x[1:10,]), aRange= 300, k=2, dimension=2) test.for.zero( as.matrix(temp), temp2, tol=2e-6, tag="taper with great circle") # example of calling the taper version directly # Note that default covariance is exponential and default taper is # Wendland (k=2). stationary.taper.cov( x[1:3,],x[1:10,] , aRange=1.5, Taper.args= list(k=2,aRange=2.0, dimension=2) )-> temp # temp is now a tapered 5X10 cross covariance matrix in sparse format. # should be identical to # the direct matrix product temp2<- Exp.cov( x[1:3,],x[1:10,], aRange=1.5) * Wendland(rdist(x[1:3,],x[1:10,]), aRange= 2.0, k=2, dimension=2) test.for.zero( as.matrix(temp), temp2, tag= "high level test of taper cov") stationary.taper.cov( x[1:3,],x[1:10,] , range=1.5, Taper.args= list(k=2,aRange=2.0, dimension=2) )-> temp test.for.zero( as.matrix(temp), temp2, tol=1e-7, tag= "high level test of taper cov") ##### Test precomputing distance matrix # y<- ozone2$y[16,] x<- ozone2$lon.lat # # Omit the NAs good<- !is.na( y) x<- x[good,] y<- y[good] #####test that stationary.cov returns the same result when passed distance matrix: #with x1 == x2: x1<- x[1:20,] compactDistMat = rdist(x1, compact=TRUE) distMat = rdist(x1) look<- stationary.cov(x1, aRange=4) look2 <- stationary.cov(x1, aRange=4, distMat = compactDistMat) look3 <- stationary.cov(x1, aRange=4, distMat = distMat) test.for.zero( look, look2, tag="stationary.cov versus stationary.cov compact distMat") test.for.zero( look, look3, tag="stationary.cov versus stationary.cov matrix distMat") #with x1 != x2: x2=x[1:10,] distMat = rdist(x1, x2) look<- stationary.cov(x1, x2, aRange=4) look2 <- stationary.cov(x1, x2, aRange=4, distMat = distMat) test.for.zero( look, look2, tag="stationary.cov versus stationary.cov asymmetric distMat") #####test that stationary.cov returns the same result when passed distance matrix: #with x1 == x2: distMat = rdist(x1, x1) compactDistMat = rdist(x1, compact=TRUE) look<- Exp.cov(x1, aRange=4) look2 <- Exp.cov(x1, aRange=4, distMat = compactDistMat) look3 <- Exp.cov(x1, aRange=4, distMat = distMat) test.for.zero( look, look2, tag="Exp.cov versus Exp.cov compact distMat") test.for.zero( look, look3, tag="Exp.cov versus Exp.cov matrix distMat") #with x1 != x2: x1<- x[1:20,] x2=x[1:10,] distMat = rdist(x1, x2) look<- Exp.cov(x1, x2, aRange=4) look2 <- Exp.cov(x1, x2, aRange=4, distMat = distMat) test.for.zero( look, look2, tag="Exp.cov versus Exp.cov asymmetric distMat") ##### test for correct value when using C argument: Ctest<- rnorm(10) #with x1 == x2: x1 = x[1:10,] compactDistMat = rdist(x1, compact=TRUE) distMat = rdist(x1, x1) temp1<- stationary.cov( x1, C= Ctest, aRange=4 ) temp2 = stationary.cov( x1, C= Ctest, aRange=4, distMat=compactDistMat ) temp3 = stationary.cov( x1, C= Ctest, aRange=4, distMat=distMat ) exp1<- Exp.cov( x1, C= Ctest, aRange=4 ) exp2 = Exp.cov( x1, C= Ctest, aRange=4, distMat=compactDistMat ) exp3 = Exp.cov( x1, C= Ctest, aRange=4, distMat=distMat ) test.for.zero(temp1, temp2, tag="stationary.cov vs stationary.cov with C set, compact distMat") test.for.zero(temp1, temp3, tag="stationary.cov vs stationary.cov with C set, matrix distMat") test.for.zero(temp1, exp1, tag="stationary.cov vs Exp.cov with C set, no distMat") test.for.zero(temp2, exp2, tag="stationary.cov vs Exp.cov with C set, compact distMat") test.for.zero(temp3, temp3, tag="stationary.cov vs Exp.cov with C set, matrix distMat") #with x1 != x2: x1 = x x2 = x[1:10,] distMat = rdist(x1, x1) temp1<- stationary.cov( x1, x2, C= Ctest, aRange=4 ) temp2 = stationary.cov( x1, x2, C= Ctest, aRange=4, distMat=distMat ) exp1 <- Exp.cov( x1, x2, C= Ctest, aRange=4 ) exp2 = Exp.cov( x1, x2, C= Ctest, aRange=4, distMat=distMat ) test.for.zero(temp1, temp2, tag="stationary.cov vs stationary.cov with C set and asymmetric distMat given") test.for.zero(exp1, exp2, tag="Exp.cov vs Exp.cov with C set and asymmetric distMat given") ##### test covariance functions for onlyUpper=TRUE # distMat = rdist(x1, x1) compactDistMat = rdist(x1, compact=TRUE) out1 = stationary.cov(x1, onlyUpper=TRUE) exp1 = Exp.cov(x1, onlyUpper=TRUE) out2 = stationary.cov(x1, onlyUpper=TRUE, distMat=compactDistMat) exp2 = Exp.cov(x1, onlyUpper=TRUE, distMat=compactDistMat) out3 = stationary.cov(x1, onlyUpper=TRUE, distMat=distMat) exp3 = Exp.cov(x1, onlyUpper=TRUE, distMat=distMat) test.for.zero( out2[upper.tri(out1)], out3[upper.tri(exp1)], tag="onlyUpper=TRUE: stationary.cov versus Exp.cov") test.for.zero( out2[upper.tri(out1)], out3[upper.tri(out2)], tag="onlyUpper=TRUE: stationary.cov versus stationary.cov with compactDistMat") test.for.zero( out2[upper.tri(out1)], out3[upper.tri(exp2)], tag="onlyUpper=TRUE: stationary.cov versus Exp.cov with compactDistMat") test.for.zero( out2[upper.tri(out1)], out3[upper.tri(out3)], tag="onlyUpper=TRUE: stationary.cov versus stationary.cov with matrix distMat") test.for.zero( out2[upper.tri(out1)], out3[upper.tri(exp3)], tag="onlyUpper=TRUE: stationary.cov versus Exp.cov with matrix distMat") ##### test Exp.cov functions for correct use of p # p1 = 1 p2 = 2 p3 = 3 distMat = rdist(x1, x1) exp1 = Exp.cov(x1, p=p1) exp2 = Exp.cov(x1, p=p2) exp2Dist = Exp.cov(x1, p=p2, distMat = distMat) exp3 = Exp.cov(x1, p=p3) test.for.zero(exp1^(rdist(x1, x1)^(p2 - p1)), exp2, tag="Testing p=1 v 2") test.for.zero(exp2^(rdist(x1, x1)^(p3 - p2)), exp3, tag="Testing p=2 v 3") test.for.zero(exp2, exp2Dist, tag="Testing p=2 v 2 with distMat") ##### test Exp.cov functions for correct use of aRange # aRange1 = 1 aRange2 = 2 aRange3 = 3 distMat = rdist(x1, x1) exp1 = Exp.cov(x1, aRange=aRange1) exp2 = Exp.cov(x1, aRange=aRange2) exp2Dist = Exp.cov(x1, aRange=aRange2, distMat = distMat) exp3 = Exp.cov(x1, aRange=aRange3) test.for.zero(exp1^(aRange1/aRange2), exp2, tag="Testing aRange=1 v 2") test.for.zero(exp2^(aRange2/aRange3), exp3, tag="Testing aRange=2 v 3") test.for.zero(exp2, exp2Dist, tag="Testing aRange=2 v 2 with distMat") cat("end tests of V argument in covariances", fill=TRUE) fields/tests/vgram.test.Rout.save0000644000176200001440000000412214275255352016575 0ustar liggesusers R version 4.2.1 (2022-06-23) -- "Funny-Looking Kid" Copyright (C) 2022 The R Foundation for Statistical Computing Platform: x86_64-apple-darwin17.0 (64-bit) R is free software and comes with ABSOLUTELY NO WARRANTY. You are welcome to redistribute it under certain conditions. Type 'license()' or 'licence()' for distribution details. R is a collaborative project with many contributors. Type 'contributors()' for more information and 'citation()' on how to cite R or R packages in publications. Type 'demo()' for some demos, 'help()' for on-line help, or 'help.start()' for an HTML browser interface to help. Type 'q()' to quit R. > # > # fields is a package for analysis of spatial data written for > # the R software environment. > # Copyright (C) 2022 Colorado School of Mines > # 1500 Illinois St., Golden, CO 80401 > # Contact: Douglas Nychka, douglasnychka@gmail.edu, > # > # This program is free software; you can redistribute it and/or modify > # it under the terms of the GNU General Public License as published by > # the Free Software Foundation; either version 2 of the License, or > # (at your option) any later version. > # This program is distributed in the hope that it will be useful, > # but WITHOUT ANY WARRANTY; without even the implied warranty of > # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the > # GNU General Public License for more details. > # > # You should have received a copy of the GNU General Public License > # along with the R software environment if not, write to the Free Software > # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA > # or see http://www.r-project.org/Licenses/GPL-2 > ##END HEADER > ##END HEADER > > > # test of vgram > > suppressMessages(library(fields)) > options(echo=FALSE) Testing: vgram single time PASSED test at tolerance 1e-08 Testing: vgram more than one time point PASSED test at tolerance 1e-08 Testing: correlogram versus covariogram PASSED test at tolerance 1e-08 Testing: correlogram versus covariogram PASSED test at tolerance 1e-08 > proc.time() user system elapsed 0.864 0.082 0.944 fields/tests/testZCommon.R0000644000176200001440000001224114342501207015265 0ustar liggesusers# # fields is a package for analysis of spatial data written for # the R software environment. # Copyright (C) 2022 Colorado School of Mines # 1500 Illinois St., Golden, CO 80401 # Contact: Douglas Nychka, douglasnychka@gmail.edu, # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with the R software environment if not, write to the Free Software # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA # or see http://www.r-project.org/Licenses/GPL-2 ##END HEADER ##END HEADER suppressMessages(library(fields)) options( echo=FALSE) test.for.zero.flag<- 1 set.seed(122) n<-6 M<- 3 N<- n*M ZCommon<- matrix( round(100*runif( N*3)), N,3) # data locs #s<- cbind( 1:n) s<- matrix( runif( n*2), n,2) T<- cbind( 1, s) Sigma<- exp( -rdist(s,s)/2) beta<- rep( 5, ncol(T) ) gamma<- 1:3 set.seed(111) f<- t(chol(Sigma))%*% matrix(rnorm( n*M),n,M) E<- matrix( .05*rnorm(n*M), n,M) # the data obs y0<- matrix( rep(T%*%beta, M), n,M) + f + E y<- matrix( rep( T%*%beta, M) + ZCommon%*%gamma, n,M) + f + E # NOTE for fixed covariance parameters spatailProcess is a wrapper for a call to mKrig look0<- spatialProcess(s,y0, aRange=2, lambda=.05^2, smoothness=.5) look0B<- mKrig(s,y0, aRange=2, lambda=.05^2, collapseFixedEffect = TRUE) look1<- spatialProcess(s,y0, aRange=2, lambda=.05^2, smoothness=.5, collapseFixedEffect = FALSE) look1B<- mKrig(s,y0, aRange=2, lambda=.05^2, collapseFixedEffect = FALSE) test.for.zero( look1B$beta, look1$beta) look2<- spatialProcess(s,y, aRange=2, lambda=.05^2, smoothness=.5, ZCommon = ZCommon) look2B<- mKrig(s,y, aRange=2, lambda=.05^2, ZCommon = ZCommon ) test.for.zero( look2B$beta, look2$beta) test.for.zero( look2B$gamma, look2$gamma) look3<- spatialProcess(s,y, aRange=2, lambda=.05^2,smoothness=.5, collapseFixedEffect = FALSE, ZCommon = ZCommon) look3B<- mKrig(s,y, aRange=2, lambda=.05^2, collapseFixedEffect = FALSE, ZCommon = ZCommon ) # hand computations Gamma<- solve( chol(Sigma + diag(.05^2,n)) ) YStar<- c(t( Gamma)%*%y) YStar0<- c(t( Gamma)%*%y0) bigSigma<- diag(1,M)%x%(Sigma+ diag(.05^2,n)) bigGamma<- solve( chol(bigSigma) ) bigTA<- rep(1,M)%x%T # collapse ==TRUE bigT<- diag(1,M)%x%T # collapse ==FALSE # collapseFixedEffects = TRUE bigTAStar<- t( bigGamma)%*%bigTA coefTestA<- lm( YStar0 ~ bigTAStar -1)$coefficients test.for.zero( look0$beta[,1] , coefTestA ) # collapseFixedEffects = FALSE bigTA<- diag(1,M)%x%T bigTAStar<- t( bigGamma)%*%bigTA coefTestA<- lm( YStar0 ~ bigTAStar -1)$coefficients test.for.zero( look1$beta , coefTestA ) # collapseFixedEffects =TRUE ZCommon bigT<- rep(1,M)%x%T U<- cbind(bigT,ZCommon ) UStar<- t( bigGamma)%*%U coefTest<- lm( YStar ~ UStar -1)$coefficients test.for.zero( c( look2$beta[,1], look2$gamma), coefTest, tag= "spatialProcess ZCommon collapse" ) # collapseFixedEffects = FALSE ZCommon bigT<- diag(1,M)%x%T U<- cbind(bigT,ZCommon ) UStar<- t( bigGamma)%*%U coefTest<- lm( YStar ~ UStar -1)$coefficients test.for.zero( c( look3$beta, look3$gamma), coefTest, tag= "spatialProcess ZCommon" ) test.for.zero( c( look3B$beta, look3B$gamma), coefTest,tag= "mKrig ZCommon" ) #################################################### # generate a large set of 2D realizations #################################################### set.seed(122) options(echo=FALSE) n<-100 M<- 1000 N<- n*M ZCommon<- matrix( round(100*runif( N*3)), N,3) # data locs #s<- cbind( 1:n) s<- matrix( runif( n*2), n,2) T<- cbind( 1, s) Sigma<- exp( -rdist(s,s)/2) beta<- rep( 5, ncol(T) ) gamma<- 1:3 set.seed(111) f<- t(chol(Sigma))%*% matrix(rnorm( n*M),n,M) E<- matrix( .05*rnorm(n*M), n,M) # the data obs y0<- matrix( rep(T%*%beta, M), n,M) + f + E y<- matrix( rep( T%*%beta, M) + ZCommon%*%gamma, n,M) + f + E look<- spatialProcess(s,y0, aRange=2, lambda=.05^2, smoothness=.5, ZCommon = ZCommon) test.for.zero( look$beta[,1], beta, tol=2e-2,tag= "big data beta") test.for.zero( look$summary["tau"], .05, tol=1e-2, tag="big data tau") test.for.zero( look$summary["sigma2"],1, tol=1e-2, tag="big data sigma2") look<- spatialProcess(s,y, aRange=2, lambda=.05^2, smoothness=.5, ZCommon = ZCommon) test.for.zero( look$beta[,1], beta, tol=2e-2, tag= "big data beta ZCommon") test.for.zero( look$gamma, gamma, tol=1e-3, tag= "big data gamma ZCommon") test.for.zero( look$summary["tau"], .05, tol=1e-2, tag="big data tau ZCommon") test.for.zero( look$summary["sigma2"],1, tol=1e-2, tag="big data sigma2 ZCommon") options(echo=TRUE) fields/tests/Krig.test.W.Rout.save0000644000176200001440000000610614275255352016566 0ustar liggesusers R version 4.2.1 (2022-06-23) -- "Funny-Looking Kid" Copyright (C) 2022 The R Foundation for Statistical Computing Platform: x86_64-apple-darwin17.0 (64-bit) R is free software and comes with ABSOLUTELY NO WARRANTY. You are welcome to redistribute it under certain conditions. Type 'license()' or 'licence()' for distribution details. R is a collaborative project with many contributors. Type 'contributors()' for more information and 'citation()' on how to cite R or R packages in publications. Type 'demo()' for some demos, 'help()' for on-line help, or 'help.start()' for an HTML browser interface to help. Type 'q()' to quit R. > # > # fields is a package for analysis of spatial data written for > # the R software environment. > # Copyright (C) 2022 Colorado School of Mines > # 1500 Illinois St., Golden, CO 80401 > # Contact: Douglas Nychka, douglasnychka@gmail.edu, > # > # This program is free software; you can redistribute it and/or modify > # it under the terms of the GNU General Public License as published by > # the Free Software Foundation; either version 2 of the License, or > # (at your option) any later version. > # This program is distributed in the hope that it will be useful, > # but WITHOUT ANY WARRANTY; without even the implied warranty of > # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the > # GNU General Public License for more details. > # > # You should have received a copy of the GNU General Public License > # along with the R software environment if not, write to the Free Software > # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA > # or see http://www.r-project.org/Licenses/GPL-2 > ##END HEADER > ##END HEADER > > suppressMessages(library(fields)) > options( echo=FALSE) Warning: Grid searches over lambda (nugget and sill variances) with minima at the endpoints: (REML) Restricted maximum likelihood minimum at right endpoint lambda = 0.003053154 (eff. df= 14.25 ) Testing: d coef diag W fixed lam PASSED test at tolerance 1e-08 Testing: d coef diag W PASSED test at tolerance 1e-08 Testing: c coef diag W fixed lam PASSED test at tolerance 1e-08 Testing: c coef diag W PASSED test at tolerance 1e-08 Warning: Grid searches over lambda (nugget and sill variances) with minima at the endpoints: (REML) Restricted maximum likelihood minimum at right endpoint lambda = 0.002794267 (eff. df= 14.24999 ) Testing: sqrt of W PASSED test at tolerance 1e-08 Warning: Grid searches over lambda (nugget and sill variances) with minima at the endpoints: (REML) Restricted maximum likelihood minimum at right endpoint lambda = 0.002794267 (eff. df= 14.24999 ) Testing: Test of passing W explicitly PASSED test at tolerance 1e-08 Testing: d coef full W PASSED test at tolerance 1e-08 Testing: c coef full W PASSED test at tolerance 1e-08 Testing: A matrix PASSED test at tolerance 1e-08 Testing: check trace of A PASSED test at tolerance 1e-08 Testing: GCV one PASSED test at tolerance 5e-08 all done testing off diag W case > > proc.time() user system elapsed 0.874 0.074 0.943 fields/tests/misc.test.R0000644000176200001440000000316414275214521014725 0ustar liggesusers# # fields is a package for analysis of spatial data written for # the R software environment. # Copyright (C) 2022 Colorado School of Mines # 1500 Illinois St., Golden, CO 80401 # Contact: Douglas Nychka, douglasnychka@gmail.edu, # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with the R software environment if not, write to the Free Software # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA # or see http://www.r-project.org/Licenses/GPL-2 ##END HEADER ##END HEADER suppressMessages(library(fields)) options( echo=FALSE) set.seed( 234) test.for.zero.flag<-1 y<- runif( 30) lev<- sort(sample( 1:5,30, replace=TRUE)) w<- runif( 30)*.1+1 y<- as.matrix(y) # compute by loop hold<- rep( NA, 5) for( k in 1:5){ ind<- lev==k hold[k]<- sum( y[ind,]*w[ind])/ sum( w[ind])} look<- fast.1way( lev, y, w) test.for.zero( look$means, hold, tag="fast.1way means") # now vectorized case ytemp<- cbind( y, y-10, y+10) look2<- fast.1way( lev, ytemp, w) test.for.zero( look2$means[,2], hold-10, tag="fast.1way vectorized means") cat("All done with testing misc functions", fill=TRUE) options(echo=TRUE) fields/tests/mKrigMLETest.Rout.save0000644000176200001440000000575414275255352016766 0ustar liggesusers R version 4.2.1 (2022-06-23) -- "Funny-Looking Kid" Copyright (C) 2022 The R Foundation for Statistical Computing Platform: x86_64-apple-darwin17.0 (64-bit) R is free software and comes with ABSOLUTELY NO WARRANTY. You are welcome to redistribute it under certain conditions. Type 'license()' or 'licence()' for distribution details. R is a collaborative project with many contributors. Type 'contributors()' for more information and 'citation()' on how to cite R or R packages in publications. Type 'demo()' for some demos, 'help()' for on-line help, or 'help.start()' for an HTML browser interface to help. Type 'q()' to quit R. > # > # fields is a package for analysis of spatial data written for > # the R software environment. > # Copyright (C) 2022 Colorado School of Mines > # 1500 Illinois St., Golden, CO 80401 > # Contact: Douglas Nychka, douglasnychka@gmail.edu, > # > # This program is free software; you can redistribute it and/or modify > # it under the terms of the GNU General Public License as published by > # the Free Software Foundation; either version 2 of the License, or > # (at your option) any later version. > # This program is distributed in the hope that it will be useful, > # but WITHOUT ANY WARRANTY; without even the implied warranty of > # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the > # GNU General Public License for more details. > # > # You should have received a copy of the GNU General Public License > # along with the R software environment if not, write to the Free Software > # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA > # or see http://www.r-project.org/Licenses/GPL-2 > ##END HEADER > ##END HEADER > > suppressMessages(library( fields )) > options( echo=FALSE) Testing: Likelihood Values optim and the fast return PASSED test at tolerance 1e-08 Testing: Likelihood Values summary and optim PASSED test at tolerance 1e-08 Testing: Likelihood Values summary and direct mKrig call PASSED test at tolerance 1e-08 Testing: ... and sigma^2.MLE PASSED test at tolerance 1e-08 Testing: consistency of Likelihood values PASSED test at tolerance 1e-08 Testing: grid search with and w/o profile PASSED test at tolerance 1e-08 Testing: crude test of maxmimum PASSED test at tolerance 1e-08 Testing: Testing MLE from spatialProcess PASSED test at tolerance 1e-05 Testing: spatialProcess finding MLE PASSED test at tolerance 1e-08 Testing: spatialProcess given MLE PASSED test at tolerance 1e-05 Testing mKrigMLEJoint against true values PASSED test at tolerance 0.006 PASSED test at tolerance 0.02 PASSED test at tolerance 0.02 Testing mKrigMLEJoint with REML against true values PASSED test at tolerance 0.007 PASSED test at tolerance 0.01 PASSED test at tolerance 0.01 Testing mKrigMLEJoint with REML FALSE against true values PASSED test at tolerance 0.02 PASSED test at tolerance 0.02 PASSED test at tolerance 0.01 all done with mKrigMLEGrid tests > > > > proc.time() user system elapsed 3.474 0.194 3.108 fields/tests/Tps.test.Rout.save0000644000176200001440000000732714466722413016240 0ustar liggesusers R version 4.3.1 (2023-06-16) -- "Beagle Scouts" Copyright (C) 2023 The R Foundation for Statistical Computing Platform: aarch64-apple-darwin20 (64-bit) R is free software and comes with ABSOLUTELY NO WARRANTY. You are welcome to redistribute it under certain conditions. Type 'license()' or 'licence()' for distribution details. R is a collaborative project with many contributors. Type 'contributors()' for more information and 'citation()' on how to cite R or R packages in publications. Type 'demo()' for some demos, 'help()' for on-line help, or 'help.start()' for an HTML browser interface to help. Type 'q()' to quit R. > # > # fields is a package for analysis of spatial data written for > # the R software environment. > # Copyright (C) 2022 Colorado School of Mines > # 1500 Illinois St., Golden, CO 80401 > # Contact: Douglas Nychka, douglasnychka@gmail.edu, > # > # This program is free software; you can redistribute it and/or modify > # it under the terms of the GNU General Public License as published by > # the Free Software Foundation; either version 2 of the License, or > # (at your option) any later version. > # This program is distributed in the hope that it will be useful, > # but WITHOUT ANY WARRANTY; without even the implied warranty of > # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the > # GNU General Public License for more details. > # > # You should have received a copy of the GNU General Public License > # along with the R software environment if not, write to the Free Software > # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA > # or see http://www.r-project.org/Licenses/GPL-2 > ##END HEADER > ##END HEADER > > > suppressMessages(library(fields)) > options(echo=FALSE) Testing: Tps radial basis function 2d PASSED test at tolerance 1e-08 Testing: Tps radial basis function 2d PASSED test at tolerance 1e-08 Testing: Tps radial basis function 2d PASSED test at tolerance 1e-08 Testing: Tps radial basis function 3d PASSED test at tolerance 1e-08 Testing: Tps radial basis function 3d PASSED test at tolerance 1e-08 Testing: Tps radial basis function 3d PASSED test at tolerance 1e-08 PASSED test at tolerance 1e-10 PASSED test at tolerance 1e-10 Testing: der of Rad.cov PASSED test at tolerance 1e-06 Testing: der of Rad.cov PASSED test at tolerance 1e-06 PASSED test at tolerance 1e-08 Testing: Tps 2-d m=2 sanity check PASSED test at tolerance 1e-08 Testing: Tps 2-d m=2 sanity predict PASSED test at tolerance 1e-08 Testing: Tps vs. Krig w/ GCV PASSED test at tolerance 1e-08 Testing: Tps vs. radial basis w Krig PASSED test at tolerance 1e-08 Warning: Grid searches over lambda (nugget and sill variances) with minima at the endpoints: (GCV) Generalized Cross-Validation minimum at right endpoint lambda = 6.735369e-05 (eff. df= 475 ) PASSED test at tolerance 0.001 PASSED test at tolerance 0.001 Testing: Tps.cov marginal PASSED test at tolerance 1e-08 Testing: Tps vs spatialProcess PASSED test at tolerance 1e-08 Testing: Tps vs spatialProcess tau PASSED test at tolerance 1e-08 Testing: Tps vs spatialProcess default PASSED test at tolerance 1e-08 Testing: Eff.df Tps vs spatialProcess PASSED test at tolerance 1e-08 Testing: Tps vs spatialProcess SE PASSED test at tolerance 1e-08 Testing: Tps vs spatialProcess predictions on a grid PASSED test at tolerance 1e-08 Testing: Tps vs spatialProcess SE predictions on a grid PASSED test at tolerance 1e-08 > cat("all done testing Tps and spatialProcess with Tps.cov", fill=TRUE) all done testing Tps and spatialProcess with Tps.cov > # > # lambda0<- out0$lambda.est["REML", "lambda"] > # > # Krig.flplike(out0, lambda0) > > > proc.time() user system elapsed 0.745 0.062 0.806 fields/tests/mKrigMLETest.R0000644000176200001440000002555214341543716015275 0ustar liggesusers# # fields is a package for analysis of spatial data written for # the R software environment. # Copyright (C) 2022 Colorado School of Mines # 1500 Illinois St., Golden, CO 80401 # Contact: Douglas Nychka, douglasnychka@gmail.edu, # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with the R software environment if not, write to the Free Software # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA # or see http://www.r-project.org/Licenses/GPL-2 ##END HEADER ##END HEADER suppressMessages(library( fields )) options( echo=FALSE) #options( echo=TRUE) # ##### generate test data # data( ozone2) # x is a two column matrix where each row is a location in lon/lat # coordinates x<- ozone2$lon.lat # y is a vector of ozone measurements at day 16 a the locations. y<- ozone2$y[16,] #ind<- !is.na( y) #x<- x[ind,] #y<- y[ind] x<-x[1:31,] y<-y[1:31] y[31]<-NA ################ test that optim results match the model evaluated ################ at the optimized parameters. optim.args = list(method = "BFGS", control = list(fnscale = -1, parscale = c(0.5, 0.5), ndeps = c(0.05,0.05))) MLEfit0 <- mKrigMLEJoint(x, y, cov.params.start= list(lambda=.5, aRange=1.2), cov.fun="stationary.cov", optim.args=optim.args, cov.args = list(Covariance = "Matern", smoothness=1.0), na.rm=TRUE, mKrig.args = list( m=1), verbose=FALSE) # check agreement with a fast return note cov.params.start and lambda.fixed # are the switches to indicate this case MLEfit0C <- mKrigMLEJoint(x, y, cov.params.start = NULL, cov.function = "stationary.cov", cov.args = list(Covariance = "Matern", lambda = MLEfit0$pars.MLE["lambda"], smoothness = 1.0, aRange = MLEfit0$pars.MLE["aRange"]), na.rm = TRUE, mKrig.args = list( m=1), verbose = FALSE ) test.for.zero( MLEfit0$summary["lnProfileLike.FULL"], MLEfit0C$summary["lnProfileLike.FULL"], tag="Likelihood Values optim and the fast return") test.for.zero( MLEfit0$summary["lnProfileLike.FULL"], MLEfit0$optimResults$value, tag="Likelihood Values summary and optim") obj0<- mKrig( x,y, cov.args = list(Covariance = "Matern", smoothness = 1.0), na.rm=TRUE, m=1, lambda= MLEfit0$pars.MLE["lambda"], aRange=MLEfit0$pars.MLE["aRange"]) test.for.zero( MLEfit0$summary["lnProfileLike.FULL"], obj0$summary["lnProfileLike.FULL"], tag="Likelihood Values summary and direct mKrig call") test.for.zero( MLEfit0$summary["sigma2"],obj0$summary["sigma2"], tag="... and sigma^2.MLE") # test that grid seraching is correct aRange.MLE<- MLEfit0$summary["aRange"] par.grid<- list( aRange= c(.5, 1.0, 1.5)*aRange.MLE ) MLEfit1<- mKrigMLEGrid(x, y, cov.fun = "stationary.cov", cov.args = list(Covariance = "Matern", smoothness = 1.0 ), par.grid = par.grid, mKrig.args = list( m=1), na.rm = TRUE, verbose = FALSE, cov.params.start = list( lambda = .2) ) hold<- (MLEfit1$summary[1,"lnProfileLike.FULL"] < MLEfit1$summary[2,"lnProfileLike.FULL"]) & (MLEfit1$summary[3,"lnProfileLike.FULL"] < MLEfit1$summary[2,"lnProfileLike.FULL"]) test.for.zero(as.numeric(hold), 1, relative=FALSE, tag="consistency of Likelihood values") ########################## ### now evaluate on the "grid" of lambdas found by profiling lambda.MLEs<- MLEfit1$summary[,"lambda"] par.grid<- list( lambda = lambda.MLEs, aRange = c(.5, 1.0, 1.5)*aRange.MLE ) MLEfit1B<- mKrigMLEGrid(x, y, cov.function = "stationary.cov", cov.args = list(Covariance = "Matern", smoothness = 1.0), par.grid = par.grid, mKrig.args = list( m=1), na.rm = TRUE, verbose = FALSE) tempCol<- c( "lnProfileLike.FULL", "lambda", "tau","sigma2") test.for.zero( as.matrix(MLEfit1$summary[,tempCol]), as.matrix(MLEfit1B$summary[,tempCol]), tag="grid search with and w/o profile") par.grid<- list( lambda = c(.999, 1.0, 1.001)*MLEfit0$summary["lambda"], aRange = rep(MLEfit0$summary["aRange"] ,3 ) ) MLEfit2 <- mKrigMLEGrid(x, y, cov.function = "stationary.cov", cov.args = list(Covariance = "Matern", smoothness = 1.0), mKrig.args = list( m=1), par.grid = par.grid, verbose = FALSE) hold<- (MLEfit2$summary[1,"lnProfileLike.FULL"] < MLEfit2$summary[2,"lnProfileLike.FULL"]) & (MLEfit2$summary[3,"lnProfileLike.FULL"] < MLEfit2$summary[2,"lnProfileLike.FULL"]) test.for.zero(as.numeric(hold), 1, relative=FALSE, tag="crude test of maxmimum") #MLEfit3<- MLESpatialProcess( x,y, # cov.args = list(Covariance = "Matern", # smoothness = 1.0), # mKrig.args = list( m=1), # cov.params.start = list( lambda =.2, aRange = NA) # ) MLEfit3<- spatialProcess( x,y, cov.args = list(Covariance = "Matern", smoothness = 1.0), mKrig.args = list( m=1), cov.params.start = list( lambda =.2) ) test.for.zero(MLEfit0$summary[1:2]/ (MLEfit3$summary[1:2]), 1, tol=1e-5, tag="Testing MLE from spatialProcess ") ######### making sure spatialProcess uses parameter information correctly obj<- spatialProcess( x, y, mKrig.args= list(m = 1), lambda= MLEfit0$summary["lambda"], aRange = MLEfit0$summary["aRange"] ) obj1<- spatialProcess( x, y, mKrig.args= list(m = 1), ) test.for.zero(MLEfit0$summary[1], obj$summary["lnProfileLike.FULL"], tag="spatialProcess finding MLE " ) test.for.zero(MLEfit0$summary[1], obj1$summary["lnProfileLike.FULL"], tol=1e-5, tag="spatialProcess given MLE " ) # testing Krig function #out1<- Krig( x,y, cov.fun="stationary.cov", # cov.args = list(Covariance = "Matern", # smoothness=1.0, aRange=.9), # na.rm=TRUE, # m=2) #generate observation locations set.seed( 22) n=100 x = matrix(runif(2*n), nrow=n) #generate observations at the locations trueARange = .1 trueLambda = .1 distanceMatrix<- rdist(x,x) Sigma<- Matern( distanceMatrix/trueARange, smoothness=1.0 ) U = chol(Sigma) M<- 2e3 # lots of replicated fields. set.seed( 332) y = t(U)%*%matrix( rnorm(n*M), n,M) + sqrt(trueLambda)*matrix( rnorm(n*M), n,M) out<- mKrig( x,y, lambda=trueLambda, aRange=trueARange, cov.function ="stationary.cov",cov.args = list(Covariance = "Matern", smoothness=1.0) ) optim.args = list(method = "BFGS", control = list(fnscale = -1, ndeps = c(0.09,0.09))) MLEfitA <- mKrigMLEJoint(x, y, cov.params.start= list(aRange=.2, lambda=.01), cov.function="stationary.cov", optim.args=optim.args, cov.args = list(Covariance = "Matern", smoothness=1.0), na.rm=TRUE, reltol = 1e-6, mKrig.args = list( m=0), verbose=FALSE) cat("Testing mKrigMLEJoint against true values", fill=TRUE) test.for.zero( MLEfitA$summary["lambda"],.1, tol=.006) test.for.zero( MLEfitA$summary["aRange"],.1, tol=.02) test.for.zero( MLEfitA$summary["sigma2"], 1.0, tol=.02) ### now test REML fitting MLEfitB <- mKrigMLEJoint(x, y, cov.params.start= list(aRange=.12, lambda=.5), cov.function="stationary.cov", optim.args=optim.args, cov.args = list(Covariance = "Matern", smoothness=1.0), na.rm=TRUE, mKrig.args = list( m=0), REML=TRUE, verbose=FALSE) cat("Testing mKrigMLEJoint with REML against true values", fill=TRUE) test.for.zero( MLEfitB$summary["lambda"],.1, tol=.007) test.for.zero( MLEfitB$summary["aRange"],.1, tol=.01) test.for.zero( MLEfitB$summary["sigma2"], 1.0, tol=.01) cat("Testing mKrigMLEJoint with REML FALSE against true values", fill=TRUE) MLEfitC <- mKrigMLEJoint(x, y, cov.params.start= list(aRange=.12, lambda=.5), cov.function ="stationary.cov", optim.args=optim.args, cov.args = list(Covariance = "Matern", smoothness=1.0), na.rm=TRUE, mKrig.args = list( m=2), REML=FALSE, verbose=FALSE ) test.for.zero( MLEfitC$summary["lambda"], .1, tol=.02) test.for.zero( MLEfitC$summary[ "aRange"], .1, tol=.02) test.for.zero( MLEfitC$summary["sigma2"], 1.0, tol=.01) cat("all done with mKrigMLEGrid tests", fill=TRUE) options( echo=TRUE) fields/tests/offGridWeights.test.Rout.save0000644000176200001440000000407314275255352020401 0ustar liggesusers R version 4.2.1 (2022-06-23) -- "Funny-Looking Kid" Copyright (C) 2022 The R Foundation for Statistical Computing Platform: x86_64-apple-darwin17.0 (64-bit) R is free software and comes with ABSOLUTELY NO WARRANTY. You are welcome to redistribute it under certain conditions. Type 'license()' or 'licence()' for distribution details. R is a collaborative project with many contributors. Type 'contributors()' for more information and 'citation()' on how to cite R or R packages in publications. Type 'demo()' for some demos, 'help()' for on-line help, or 'help.start()' for an HTML browser interface to help. Type 'q()' to quit R. > # > # fields is a package for analysis of spatial data written for > # the R software environment. > # Copyright (C) 2022 Colorado School of Mines > # 1500 Illinois St., Golden, CO 80401 > # Contact: Douglas Nychka, douglasnychka@gmail.edu, > # > # This program is free software; you can redistribute it and/or modify > # it under the terms of the GNU General Public License as published by > # the Free Software Foundation; either version 2 of the License, or > # (at your option) any later version. > # This program is distributed in the hope that it will be useful, > # but WITHOUT ANY WARRANTY; without even the implied warranty of > # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the > # GNU General Public License for more details. > # > # You should have received a copy of the GNU General Public License > # along with the R software environment if not, write to the Free Software > # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA > # or see http://www.r-project.org/Licenses/GPL-2 > ##END HEADER > ##END HEADER > > > # test of sreg and related functions > > suppressMessages(library(fields)) > options(echo=FALSE) PASSED test at tolerance 1e-08 PASSED test at tolerance 1e-08 PASSED test at tolerance 1e-08 PASSED test at tolerance 1e-08 PASSED test at tolerance 1e-08 PASSED test at tolerance 1e-08 all done with off grid weight tests part 1 > proc.time() user system elapsed 0.797 0.072 0.854 fields/tests/derivative.test.Rout.save0000644000176200001440000000721214275255352017626 0ustar liggesusers R version 4.2.1 (2022-06-23) -- "Funny-Looking Kid" Copyright (C) 2022 The R Foundation for Statistical Computing Platform: x86_64-apple-darwin17.0 (64-bit) R is free software and comes with ABSOLUTELY NO WARRANTY. You are welcome to redistribute it under certain conditions. Type 'license()' or 'licence()' for distribution details. R is a collaborative project with many contributors. Type 'contributors()' for more information and 'citation()' on how to cite R or R packages in publications. Type 'demo()' for some demos, 'help()' for on-line help, or 'help.start()' for an HTML browser interface to help. Type 'q()' to quit R. > # > # fields is a package for analysis of spatial data written for > # the R software environment. > # Copyright (C) 2022 Colorado School of Mines > # 1500 Illinois St., Golden, CO 80401 > # Contact: Douglas Nychka, douglasnychka@gmail.edu, > # > # This program is free software; you can redistribute it and/or modify > # it under the terms of the GNU General Public License as published by > # the Free Software Foundation; either version 2 of the License, or > # (at your option) any later version. > # This program is distributed in the hope that it will be useful, > # but WITHOUT ANY WARRANTY; without even the implied warranty of > # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the > # GNU General Public License for more details. > # > # You should have received a copy of the GNU General Public License > # along with the R software environment if not, write to the Free Software > # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA > # or see http://www.r-project.org/Licenses/GPL-2 > ##END HEADER > ##END HEADER > > #library( fields, lib.loc="lib.test") > > suppressMessages(library(fields)) > options(echo=FALSE) Testing: radial basis function exact PASSED test at tolerance 1e-06 Testing: sanity test of stationary.cov with RadialBasis PASSED test at tolerance 1e-08 Testing: sanity test of Rad.cov PASSED test at tolerance 1e-08 Testing: stat.cov Radbas C multiply PASSED test at tolerance 1e-08 Testing: Rad.cov C multiply PASSED test at tolerance 1e-08 PASSED test at tolerance 1e-06 Testing: Wendland exact PASSED test at tolerance 1e-06 PASSED test at tolerance 1e-08 Testing: Wendland C multiply PASSED test at tolerance 1e-08 Testing: Wendland.cov aRange=1.0 PASSED test at tolerance 1e-07 Testing: Wendland.cov aRange=.75 PASSED test at tolerance 1e-07 Testing: stationary.cov and exact C multiply for Wendland PASSED test at tolerance 1e-08 Testing: Wendland C multiply PASSED test at tolerance 1e-08 Testing: 2-d derivs from wend.cov/mKrig PASSED test at tolerance 1e-08 PASSED test at tolerance 1e-08 Testing: 2-d derivs from stationary-wend/mKrig PASSED test at tolerance 1e-08 PASSED test at tolerance 1e-08 Testing: wendland.cov quad 2-d PASSED test at tolerance 0.005 Testing: stationary.cov/Wendland cubic 2-d PASSED test at tolerance 0.01 Warning: Grid searches over lambda (nugget and sill variances) with minima at the endpoints: (REML) Restricted maximum likelihood minimum at right endpoint lambda = 1.938365e-08 (eff. df= 380 ) Testing: stationary.cov/Wendland cubic 2-d PASSED test at tolerance 0.005 PASSED test at tolerance 0.005 Warning: Grid searches over lambda (nugget and sill variances) with minima at the endpoints: (GCV) Generalized Cross-Validation minimum at right endpoint lambda = 4.881835e-06 (eff. df= 380 ) Testing: Tps derivative x1 PASSED test at tolerance 2e-04 Testing: Tps derivative x2 PASSED test at tolerance 2e-04 done with dervative tests > > > proc.time() user system elapsed 2.422 0.199 2.512 fields/tests/Wend.test.Rout.save0000644000176200001440000000431114275255352016356 0ustar liggesusers R version 4.2.1 (2022-06-23) -- "Funny-Looking Kid" Copyright (C) 2022 The R Foundation for Statistical Computing Platform: x86_64-apple-darwin17.0 (64-bit) R is free software and comes with ABSOLUTELY NO WARRANTY. You are welcome to redistribute it under certain conditions. Type 'license()' or 'licence()' for distribution details. R is a collaborative project with many contributors. Type 'contributors()' for more information and 'citation()' on how to cite R or R packages in publications. Type 'demo()' for some demos, 'help()' for on-line help, or 'help.start()' for an HTML browser interface to help. Type 'q()' to quit R. > # > # fields is a package for analysis of spatial data written for > # the R software environment. > # Copyright (C) 2022 Colorado School of Mines > # 1500 Illinois St., Golden, CO 80401 > # Contact: Douglas Nychka, douglasnychka@gmail.edu, > # > # This program is free software; you can redistribute it and/or modify > # it under the terms of the GNU General Public License as published by > # the Free Software Foundation; either version 2 of the License, or > # (at your option) any later version. > # This program is distributed in the hope that it will be useful, > # but WITHOUT ANY WARRANTY; without even the implied warranty of > # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the > # GNU General Public License for more details. > # > # You should have received a copy of the GNU General Public License > # along with the R software environment if not, write to the Free Software > # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA > # or see http://www.r-project.org/Licenses/GPL-2 > ##END HEADER > ##END HEADER > > > # test of Wendland covariance and stationary.taper.cov > > suppressMessages(library(fields)) > options( echo=FALSE) PASSED test at tolerance 1e-08 PASSED test at tolerance 1e-08 PASSED test at tolerance 1e-08 PASSED test at tolerance 1e-08 PASSED test at tolerance 1e-08 PASSED test at tolerance 1e-08 PASSED test at tolerance 1e-08 PASSED test at tolerance 1e-08 PASSED test at tolerance 1e-08 PASSED test at tolerance 1e-08 Done with testing Wendland family > > proc.time() user system elapsed 0.771 0.069 0.830 fields/tests/mKrig.test.Rout.save0000644000176200001440000000712314275255352016536 0ustar liggesusers R version 4.2.1 (2022-06-23) -- "Funny-Looking Kid" Copyright (C) 2022 The R Foundation for Statistical Computing Platform: x86_64-apple-darwin17.0 (64-bit) R is free software and comes with ABSOLUTELY NO WARRANTY. You are welcome to redistribute it under certain conditions. Type 'license()' or 'licence()' for distribution details. R is a collaborative project with many contributors. Type 'contributors()' for more information and 'citation()' on how to cite R or R packages in publications. Type 'demo()' for some demos, 'help()' for on-line help, or 'help.start()' for an HTML browser interface to help. Type 'q()' to quit R. > # > # fields is a package for analysis of spatial data written for > # the R software environment. > # Copyright (C) 2022 Colorado School of Mines > # 1500 Illinois St., Golden, CO 80401 > # Contact: Douglas Nychka, douglasnychka@gmail.edu, > # > # This program is free software; you can redistribute it and/or modify > # it under the terms of the GNU General Public License as published by > # the Free Software Foundation; either version 2 of the License, or > # (at your option) any later version. > # This program is distributed in the hope that it will be useful, > # but WITHOUT ANY WARRANTY; without even the implied warranty of > # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the > # GNU General Public License for more details. > # > # You should have received a copy of the GNU General Public License > # along with the R software environment if not, write to the Free Software > # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA > # or see http://www.r-project.org/Licenses/GPL-2 > ##END HEADER > ##END HEADER > > > suppressMessages(library(fields)) > options( echo=FALSE) NULL Testing: addToDiag PASSED test at tolerance 1e-08 Testing: spam vs no spam PASSED test at tolerance 1e-08 Testing: Krig mKrig d coef PASSED test at tolerance 1e-08 Testing: Krig mKrig c coef PASSED test at tolerance 1e-08 Testing: test of predict at new locations PASSED test at tolerance 1e-08 Testing: test of matrix Y predicts PASSED test at tolerance 1e-08 PASSED test at tolerance 1e-08 Testing: predictSurface with mKrig PASSED test at tolerance 1e-08 Testing: Wendland/no spam PASSED test at tolerance 1e-08 Testing: Wendland/spam PASSED test at tolerance 1e-08 Testing: new coef c no spam PASSED test at tolerance 1e-08 Testing: new beta coef no spam PASSED test at tolerance 1e-08 Testing: new coef c spam PASSED test at tolerance 1e-08 Testing: new beta coef spam PASSED test at tolerance 1e-08 Testing: nzero in call to mKrig PASSED test at tolerance 1e-08 Testing: mKrig vs. Krig for ozone2 PASSED test at tolerance 1e-08 Testing: predict Wendland mKrig vs Krig PASSED test at tolerance 1e-07 Testing: fastTps interp1 PASSED test at tolerance 5e-07 Testing: fastTps interp2 PASSED test at tolerance 0.02 [1] "testing using distance matrix" Testing: predict: stationary.cov versus Exp.cov PASSED test at tolerance 1e-08 Testing: predict: no distance matrix versus compact distance matrix PASSED test at tolerance 1e-08 Testing: predict: no distance matrix versus distance matrix PASSED test at tolerance 1e-08 [1] "testing using predictSE" Testing: predictSE: stationary.cov with exponential versus Exp.cov PASSED test at tolerance 1e-08 Testing: predictSE: no distance matrix versus compact distance matrix PASSED test at tolerance 1e-08 Testing: predictSE: no distance matrix versus distance matrix PASSED test at tolerance 1e-08 all done with mKrig tests > > > > > proc.time() user system elapsed 1.993 0.124 2.103 fields/tests/offGridWeightsNEW.test.Rout.save0000644000176200001440000001365714275255352020763 0ustar liggesusers R version 4.2.1 (2022-06-23) -- "Funny-Looking Kid" Copyright (C) 2022 The R Foundation for Statistical Computing Platform: x86_64-apple-darwin17.0 (64-bit) R is free software and comes with ABSOLUTELY NO WARRANTY. You are welcome to redistribute it under certain conditions. Type 'license()' or 'licence()' for distribution details. R is a collaborative project with many contributors. Type 'contributors()' for more information and 'citation()' on how to cite R or R packages in publications. Type 'demo()' for some demos, 'help()' for on-line help, or 'help.start()' for an HTML browser interface to help. Type 'q()' to quit R. > # > # fields is a package for analysis of spatial data written for > # the R software environment. > # Copyright (C) 2022 Colorado School of Mines > # 1500 Illinois St., Golden, CO 80401 > # Contact: Douglas Nychka, douglasnychka@gmail.edu, > # > # This program is free software; you can redistribute it and/or modify > # it under the terms of the GNU General Public License as published by > # the Free Software Foundation; either version 2 of the License, or > # (at your option) any later version. > # This program is distributed in the hope that it will be useful, > # but WITHOUT ANY WARRANTY; without even the implied warranty of > # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the > # GNU General Public License for more details. > # > # You should have received a copy of the GNU General Public License > # along with the R software environment if not, write to the Free Software > # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA > # or see http://www.r-project.org/Licenses/GPL-2 > ##END HEADER > ##END HEADER > > > # test of sreg and related functions > > suppressMessages(library(fields)) > #options(echo=FALSE) > > test.for.zero.flag<- 1 > > > > # simple covariance function for implementation > exp_cov <- function(dist){ + sigma2<-1 + covariance <- sigma2* exp(-dist / 10) # 10 is arbitrary + return(covariance) + } > > # ----------------------------- > # Define grid and observations > # ----------------------------- > > m<- 10 > n<- 11 > nx<- m > ny<- n > M<- 15 > dx<- 1 > dy<- 1 > sigma2<-2.0 > np<-3 > > > # first a case where all obs in same grid box. > # addition of "dx" also tests that this works when grid is not just integers > # set dx=1 for the most basic case > dx<- .5 > s0<- rbind( + c(5.1,6.2), + c(5.1,6.5), + c( 5.85,6.45) + ) > s0<- s0*dx > > test0<- offGridWeights( s0, list( x= (1:m)*dx, y=(1:n)*dx), + aRange=10*dx, sigma2=sigma2, + Covariance="Exponential", + np=2, + debug=TRUE) Found 1 grid box(es) containing more than 1 obs location > # explicit nearest neighbors in this case > sTmp<- cbind( rep(4:7,4), rep(5:8,each=4) ) > sGrid<- sTmp*dx > > # check that same grid being used by function > test.for.zero(sGrid, cbind(test0$gridX[,1], test0$gridY[,1]) ) PASSED test at tolerance 1e-08 > > S21 <- 2.0* exp( -rdist( s0, sGrid)/(10*dx)) > S11 <- 2.0* exp( -rdist( sGrid , sGrid)/(10*dx) ) > S22 <- 2.0* exp( -rdist( s0, s0)/(10*dx)) > # local weights applied for prediction > Btest<- S21%*% solve( S11) > # find indices for neigborhood > sIndex<- sTmp[,1] + (sTmp[,2]-1)*m > # Kriging weights > Bfull<- spam2full(test0$B[,sIndex]) > test.for.zero( Bfull, Btest) PASSED test at tolerance 1e-08 > # standard error matrix > # note that transpsoe also taken so SEtest%*%t( SEtest) = cov matrix > SEtest<- t(chol(S22 - S21%*% solve( S11)%*%t(S21) )) > SEfull <- spam2full(test0$SE) > test.for.zero( SEfull, SEtest) PASSED test at tolerance 1e-08 > > > # now test several observation locations > > dx<- .45 > s<- rbind( + c(5.1,6.2), + c(7.1,7.2), + c(5.1,6.5), + c(8.5,4.4), + c( 5.85,6.45), + c(7.3,7.4) + ) > s<- s * dx > # Note s0 from above is s[c(1,3,5),] > ind1<- c(1,3,5) > > sTmp<- cbind( rep(4:7,4), rep(5:8,each=4) ) > sGrid<- sTmp*dx > sIndex<- sTmp[,1] + (sTmp[,2]-1)*m > > S21<- 2.0* exp( -rdist( s[ind1,], sGrid)/(10*dx) ) > S11<- 2.0* exp( -rdist( sGrid , sGrid)/(10*dx) ) > S22<- 2.0* exp( -rdist( s[ind1,], s[ind1,])/(10*dx) ) > > sparseObj<- offGridWeights( s, list( x= (1:m)*dx, y=(1:n)*dx), + aRange=(10*dx), sigma2=sigma2, + Covariance="Exponential", + np=2, + debug=TRUE) Found 2 grid box(es) containing more than 1 obs location > > test.for.zero( sparseObj$Sigma21Star[ind1,], S21 ) PASSED test at tolerance 1e-08 > test.for.zero( sparseObj$Sigma11Inv, solve(S11) ) PASSED test at tolerance 1e-08 > > Btest<- S21%*% solve( S11) > look2<- spam2full( sparseObj$B) > test.for.zero( Btest,look2[ind1, sIndex] ) PASSED test at tolerance 1e-08 > > > SEfull<- spam2full( sparseObj$SE) > SE2full<- (SEfull)%*%t(SEfull) > test.for.zero(diag( SE2full), sparseObj$predictionVariance ) PASSED test at tolerance 1e-08 > > SEtest<- t(chol(S22 - S21%*%solve( S11)%*%t( S21) )) > test.for.zero(SEtest, SEfull[ind1, ind1] ) PASSED test at tolerance 1e-08 > > # check that debug FALSE also works > > sparseObj1<- offGridWeights( s, list( x= (1:m)*dx, y=(1:n)*dx), + aRange=(10*dx), sigma2=sigma2, + Covariance="Exponential", + np=2, + debug=FALSE) Found 2 grid box(es) containing more than 1 obs location > > test.for.zero( sparseObj$B, sparseObj1$B) PASSED test at tolerance 1e-08 > test.for.zero( sparseObj$SE, sparseObj1$SE) PASSED test at tolerance 1e-08 > > cat("all done with off grid weight tests part 2", fill=TRUE) all done with off grid weight tests part 2 > > > proc.time() user system elapsed 0.792 0.071 0.863 fields/tests/Krig.test.R0000644000176200001440000001436414275214521014672 0ustar liggesusers# # fields is a package for analysis of spatial data written for # the R software environment. # Copyright (C) 2022 Colorado School of Mines # 1500 Illinois St., Golden, CO 80401 # Contact: Douglas Nychka, douglasnychka@gmail.edu, # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with the R software environment if not, write to the Free Software # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA # or see http://www.r-project.org/Licenses/GPL-2 ##END HEADER ##END HEADER suppressMessages(library(fields)) # # # test of fixed lambda case # Check against linear algebra # options( echo=FALSE) test.for.zero.flag<-1 fit<- Krig( ChicagoO3$x, ChicagoO3$y, aRange=50) x<- ChicagoO3$x K<- Exp.cov(x, x,aRange=50) T<- fields.mkpoly(x, 2) W<- diag( 20) lambda<- fit$lambda M<- (lambda* diag(20) + K) ########################### test.d<- c(solve( t(T) %*% solve( M)%*%T) %*% t(T)%*% solve( M) %*% fit$yM) test.c<- solve( M)%*% ( fit$yM - T%*% test.d) #compare to fit$d test.for.zero( test.d, fit$d, tag="Compare d coef" ) #compare to fit$d test.for.zero( test.c, fit$c,tag="Compare c coef" ) fit2<- Krig( ChicagoO3$x, ChicagoO3$y, aRange=50, lambda= fit$lambda) #compare to fit$d test.for.zero( test.d, fit2$d, tag="Compare d coef fixed lambda" ) #compare to fit$d test.for.zero( test.c, fit2$c,tag="Compare c coef fixed lambda" ) # test of Krig.coef Krig.coef( fit)->test test.for.zero( test.d, test$d, tag="d coef Krig.coef" ) test.for.zero( test.c, test$c, tag= "c coef Krig.coef" ) Krig.coef( fit2)->test test.for.zero( test.d, test$d,tag="d coef Krig.coef fixed" ) test.for.zero( test.c, test$c, tag="c coef Krig.coef fixed" ) # checking A matrix in the case of noreps set.seed( 222) weights<- 10+ runif( length(ChicagoO3$y)) #weights<- rep( 1, 20) test2<- Krig( ChicagoO3$x, ChicagoO3$y, aRange=50, weights= weights) Atest<- Krig.Amatrix( test2) K<-Exp.cov(ChicagoO3$x, ChicagoO3$x,aRange=50) H<- matrix(0, 23,23) H[(1:20)+3 , (1:20)+3]<- K X<- cbind( fields.mkpoly( ChicagoO3$x, 2), K) lambda<- test2$lambda Alam <- X%*%solve( t(X)%*%diag(weights)%*%X + lambda*H )%*% t(X)%*%diag(weights) test.for.zero( Alam, Atest, tag="Amatrix no reps", tol=5e-8) # test for new y fixed case set.seed( 123) ynew<- rnorm( fit2$N) test.d<- c(solve( t(T) %*% solve( M)%*%T) %*% t(T)%*% solve( M) %*% ynew) test.c<- solve( M)%*% ( ynew - T%*% test.d) test<- Krig.coef( fit, y= ynew) test.for.zero( test.d, test$d, tag= "d coef new y" ) test.for.zero( test.c, test$c, tag="c coef new y" ) Krig.coef( fit2, y= ynew)->test test.for.zero( test.d, test$d, tag= "d coef new y fixed" ) test.for.zero( test.c, test$c, tag=" c coef new y fixed" ) # test for multiple new y's Krig.coef( fit2, y= cbind( ynew+ rnorm(fit2$N), ynew))->test2 test.for.zero( test.d, test2$d[,2], tag= "d coef several new y fixed" ) test.for.zero( test.c, test2$c[,2], tag=" c coef several new y fixed" ) #cat("done with simple Krig data", fill=TRUE) # These tests are about whether decompositions # handle just a fixed lambda or are more general # checking passing lambda or df to Krig out<- Tps( ChicagoO3$x, ChicagoO3$y,lambda=.001 ) out2<- predict( out, lambda=.001) test.for.zero( out2, predict( out), tag="Tps with fixed lam") out<- Tps( ChicagoO3$x, ChicagoO3$y, df=5) out2<- predict( out, df=5) test.for.zero( out2, predict( out), tag="Tps with fixed df") # same for Krig out0<- Krig( ChicagoO3$x, ChicagoO3$y, aRange=50,lambda=.5) out<- Krig( ChicagoO3$x, ChicagoO3$y, aRange=50,lambda=.5,GCV=TRUE) test.for.zero( predict(out0), predict( out), tag="Krig with fixed lam argument") #A very nasty case with knots and weights set.seed(123) x<- matrix( runif( 30), 15,2) y<- rnorm( 15)*.01 + x[,1]**2 + x[,2]**2 weights<- runif(15)*10 # compare to Krig( x,y, cov.function=Exp.cov, weights=weights)-> out.new Krig( x,y, cov.function=Exp.cov, weights=weights, lambda=1)-> out.new2 # compute test using linear algebra K<- Exp.cov( x, x) H<- matrix(0, 18,18) H[4:18, 4:18]<- K X<- cbind( fields.mkpoly( x, 2), Exp.cov( x, x)) lambda<-1 c( solve(t(X)%*%(weights*X) + lambda*H)%*% t(X)%*% (weights*y) )-> temp temp.c<- temp[4:18] temp.d<- temp[1:3] # test for d coefficients test.for.zero( out.new2$d, temp.d, tag=" d coef") # test for c coefficents test.for.zero( out.new2$c, temp.c, tag="c coef" ) # and test<- Krig.coef( out.new2, lambda=1) # test for d coefficients test.for.zero( temp.d, test$d, tag= "d fixed case") # test for c coefficents test.for.zero( temp.c, test$c, tag=" c fixed case" ) ynew<- 1:15 #compare test<- Krig.coef( out.new, lambda=.5, y=ynew) test2<- Krig( x,ynew, cov.function=Exp.cov, lambda= .5, weights=weights) # test for d coefficients test.for.zero( test2$d,test$d, tag=" d new y") # test for c coefficents test.for.zero( test2$c, test$c,tag= "c new y" ) #cat("test with reps" , fill=TRUE) # ################################## #cat( "test A matrix",fill=TRUE) ################################## set.seed(133) x<- matrix( runif( 30), 15,2)*2 y<- rnorm( nrow( x))*.5 + + x[,1]**2 + x[,2]**2 # perturb so that this example does not generate (harmless) warnings in gcv search weights<- runif( nrow( x))*10 out.new<- Krig( x,y, weights= weights) testY<- predict( out.new) testY2<- Krig.Amatrix(out.new)%*% y test.for.zero( testY, testY2, tag="testing A matrix") set.seed(333) yNew<- rnorm( 15) testY<- predict( out.new, y=yNew) testY2<- Krig.Amatrix(out.new)%*% yNew test.for.zero( testY, testY2, tag="testing A matrix new y") Alam<- Krig.Amatrix(out.new) trA<- sum( diag( Alam)) test.for.zero( trA, out.new$eff.df, tag="checking trace") ####### checking GCV ####### MSE<- mean( out.new$residuals^2 * weights) n<- length( y) GCV<- MSE/ (1- trA/n )^2 test.for.zero(GCV, out.new$lambda.est[6,3], tag="GCV" ) fields/tests/fastTpsPredict.test.Rout.save0000644000176200001440000000430214275255352020420 0ustar liggesusers R version 4.2.1 (2022-06-23) -- "Funny-Looking Kid" Copyright (C) 2022 The R Foundation for Statistical Computing Platform: x86_64-apple-darwin17.0 (64-bit) R is free software and comes with ABSOLUTELY NO WARRANTY. You are welcome to redistribute it under certain conditions. Type 'license()' or 'licence()' for distribution details. R is a collaborative project with many contributors. Type 'contributors()' for more information and 'citation()' on how to cite R or R packages in publications. Type 'demo()' for some demos, 'help()' for on-line help, or 'help.start()' for an HTML browser interface to help. Type 'q()' to quit R. > # > # fields is a package for analysis of spatial data written for > # the R software environment. > # Copyright (C) 2022 Colorado School of Mines > # 1500 Illinois St., Golden, CO 80401 > # Contact: Douglas Nychka, douglasnychka@gmail.edu, > # > # This program is free software; you can redistribute it and/or modify > # it under the terms of the GNU General Public License as published by > # the Free Software Foundation; either version 2 of the License, or > # (at your option) any later version. > # This program is distributed in the hope that it will be useful, > # but WITHOUT ANY WARRANTY; without even the implied warranty of > # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the > # GNU General Public License for more details. > # > # You should have received a copy of the GNU General Public License > # along with the R software environment if not, write to the Free Software > # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA > # or see http://www.r-project.org/Licenses/GPL-2 > ##END HEADER > ##END HEADER > > > suppressMessages(library(fields)) > options(echo=FALSE) Testing: Comparing FORTRAN grid eval to matrix vector multiplication PASSED test at tolerance 1e-08 Testing: testing PredictSurface and predict.fastTps PASSED test at tolerance 1e-08 Testing: testing PredictSurface with slower mKrig predict PASSED test at tolerance 1e-08 Testing: predict with ynew PASSED test at tolerance 1e-08 Testing: predictSurface with ynew PASSED test at tolerance 1e-08 > # > > proc.time() user system elapsed 0.809 0.071 0.867 fields/tests/mKrig.se.test.R0000644000176200001440000001267314275214521015456 0ustar liggesusers# # fields is a package for analysis of spatial data written for # the R software environment. # Copyright (C) 2022 Colorado School of Mines # 1500 Illinois St., Golden, CO 80401 # Contact: Douglas Nychka, douglasnychka@gmail.edu, # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with the R software environment if not, write to the Free Software # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA # or see http://www.r-project.org/Licenses/GPL-2 ##END HEADER ##END HEADER # tests of predictSE # against direct linear algebra suppressMessages(library(fields)) options( echo=FALSE) test.for.zero.flag<- TRUE x0<- cbind( 0,4) Krig( ChicagoO3$x, ChicagoO3$y, cov.function = "Exp.cov", aRange=50, lambda=.06, GCV=FALSE)-> out # direct calculation Krig.Amatrix( out, x=x0)-> A test.for.zero( A%*%ChicagoO3$y, predict( out, x0),tag="Amatrix vs. predict") Sigma0<- out$sigmahat*Exp.cov( ChicagoO3$x, ChicagoO3$x, aRange=50) S0<- out$sigmahat*c(Exp.cov( x0, x0, aRange=50)) S1<- out$sigmahat*Exp.cov( out$x, x0, aRange=50) #yhat= Ay #var( f0 - yhat)= var( f0) - 2 cov( f0,yhat)+ cov( yhat) look<- S0 - t(S1)%*% t(A) - A%*%S1 + A%*% ( Sigma0 + diag(out$tauHat.MLE**2/out$weightsM))%*% t(A) # #compare to # diagonal elements test2<- predictSE( out, x= x0) test.for.zero( sqrt(diag( look)), test2,tag="Marginal predictSE") # now test shortcut formula that leverages the prediction step for Kriging # Sigma<- Exp.cov( ChicagoO3$x, ChicagoO3$x, aRange=50) + diag(out$lambda/out$weightsM) #Sigma<- ( Sigma0 + diag(out$tauHat.MLE**2/out$weightsM)) Tmatrix <- do.call(out$null.function.name, c(out$null.args, list(x = out$xM, Z = out$ZM))) Omega<- solve( t(Tmatrix)%*% solve( Sigma)%*% Tmatrix) Id<- diag( 1, nrow( Tmatrix)) qr.R( out$matrices$qr.VT) -> Rmat Omega.test<- solve(t(Rmat)%*% (Rmat)) # Omega is the GLS covariance matrix for estimated parameters in fixed part of # spatial model (the d coefficients). These are usually the "spatial drift" -- a # low order polynomial test.for.zero( Omega, Omega.test, tag="comparing Omega") # M1 and M2 are matrices that go from obs to the estimated coefficients (d,c) M1<- Omega%*% t(Tmatrix)%*% solve( Sigma) M2<- solve( Sigma)%*% ( Id - Tmatrix%*% M1) x0<- cbind( 0,4) k0<- Exp.cov( out$x, x0, aRange=50) #k0<- S1 t0<- c( 1, c(x0)) hold<- t( t0)%*%M1 + t(k0)%*% M2 test.for.zero( hold, A) test.for.zero( M2%*%Sigma%*%t( M2), M2) # benchmark using standard predictSE function SE0<- predictSE( out, x=x0) # shortcut formula explicitly MSE<- S0 + out$sigmahat*t(t0)%*% Omega %*%t0 - out$sigmahat*(t(k0)%*% M2 %*% k0 + t(t0)%*% M1%*% k0) - out$sigmahat*t(t0)%*% M1%*% k0 # collecting terms to make this look like two predict steps. MSE2<- S0 + out$sigmahat*t(t0)%*% Omega %*%t0 - out$sigmahat* predict( out, yM= k0, x=x0) - out$sigmahat* predict( out, yM= k0, x=x0, just.fixed=TRUE) hold<- Krig.coef(out, y=k0) tempc<- t(k0)%*% hold$c tempd<- t(t0)%*%hold$d MSE4<- S0 + out$sigmahat*t(t0)%*% Omega %*%t0 - out$sigmahat * (tempc +2*tempd) test.for.zero(SE0, sqrt( MSE4), tag="test of formula with explicit d and c") # test of new function Krig( ChicagoO3$x, ChicagoO3$y, cov.function = "Exp.cov", aRange=50,lambda=.06)-> out0 SE0<- predictSE.Krig( out0, x=x0) mKrig( ChicagoO3$x, ChicagoO3$y, cov.function = "Exp.cov", aRange=50, lambda=.06)-> out2 SE3<- predictSE.mKrig( out2, xnew=x0) test.for.zero(SE0, sqrt( MSE), tag="Krig function and direct formula") test.for.zero(sqrt(MSE), sqrt( MSE2), tag="new predict formula and direct formula") test.for.zero( SE3, SE0, tag="New se _function_ and old Krig _function_") # # test of vectors of locations. # receate object out0<- Krig( ChicagoO3$x, ChicagoO3$y, cov.function = "Exp.cov", aRange=50, lambda=.06) out<- mKrig( ChicagoO3$x, ChicagoO3$y, cov.function = "Exp.cov", aRange=50, lambda=.06) x0<-rep( c( -20, -10,10,20),4) x0 <- cbind( x0 , sort( x0)) x0<- rbind( c(0,4), x0) k0<- Exp.cov( ChicagoO3$x,x0, aRange=50) t0<- t(fields.mkpoly(x0, m=out$m)) hold<- Krig.coef(out0, y=k0) MSE5<- (rep( S0,nrow(x0)) + out0$sigmahat * colSums( t0 *(out0$matrices$Omega%*%t0)) -out0$sigmahat* colSums((k0)*hold$c) - 2*out0$sigmahat*colSums(t0*hold$d)) hold<- mKrig.coef(out, y=k0, collapse=FALSE) sigmahat<- out$summary["sigma2"] MSE6<- (rep( S0, nrow(x0)) + sigmahat * colSums( t0 *(out$Omega%*%t0)) -sigmahat* colSums((k0)*hold$c.coef) - 2*sigmahat*colSums(t0*hold$beta)) test.for.zero( predictSE( out0, x0), sqrt(MSE5), tag="Benchmark of formula") test.for.zero( predictSE( out0, x0), sqrt(MSE6), tag="Benchmark of formula mKrig coefs") test.for.zero( predictSE( out, x0), predictSE.mKrig(out, x0), tag="test function with several locations Krig mKrig functions" ) fields/tests/Krig.se.W.Rout.save0000644000176200001440000000421114275255352016211 0ustar liggesusers R version 4.2.1 (2022-06-23) -- "Funny-Looking Kid" Copyright (C) 2022 The R Foundation for Statistical Computing Platform: x86_64-apple-darwin17.0 (64-bit) R is free software and comes with ABSOLUTELY NO WARRANTY. You are welcome to redistribute it under certain conditions. Type 'license()' or 'licence()' for distribution details. R is a collaborative project with many contributors. Type 'contributors()' for more information and 'citation()' on how to cite R or R packages in publications. Type 'demo()' for some demos, 'help()' for on-line help, or 'help.start()' for an HTML browser interface to help. Type 'q()' to quit R. > # > # fields is a package for analysis of spatial data written for > # the R software environment. > # Copyright (C) 2022 Colorado School of Mines > # 1500 Illinois St., Golden, CO 80401 > # Contact: Douglas Nychka, douglasnychka@gmail.edu, > # > # This program is free software; you can redistribute it and/or modify > # it under the terms of the GNU General Public License as published by > # the Free Software Foundation; either version 2 of the License, or > # (at your option) any later version. > # This program is distributed in the hope that it will be useful, > # but WITHOUT ANY WARRANTY; without even the implied warranty of > # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the > # GNU General Public License for more details. > # > # You should have received a copy of the GNU General Public License > # along with the R software environment if not, write to the Free Software > # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA > # or see http://www.r-project.org/Licenses/GPL-2 > ##END HEADER > ##END HEADER > > > suppressMessages(library(fields)) > # tests of predictSE using > # off diag weight matrix for obs (W) > > options( echo=FALSE) Testing: Amatrix vs. predict PASSED test at tolerance 1e-08 Testing: Marginal predictSE PASSED test at tolerance 1e-08 Testing: Full covariance predictSE PASSED test at tolerance 1e-08 Testing: Full covariance predictSE explicit W PASSED test at tolerance 1e-08 all done > > proc.time() user system elapsed 0.979 0.092 1.060 fields/tests/misc.test.Rout.save0000644000176200001440000000371314275255352016421 0ustar liggesusers R version 4.2.1 (2022-06-23) -- "Funny-Looking Kid" Copyright (C) 2022 The R Foundation for Statistical Computing Platform: x86_64-apple-darwin17.0 (64-bit) R is free software and comes with ABSOLUTELY NO WARRANTY. You are welcome to redistribute it under certain conditions. Type 'license()' or 'licence()' for distribution details. R is a collaborative project with many contributors. Type 'contributors()' for more information and 'citation()' on how to cite R or R packages in publications. Type 'demo()' for some demos, 'help()' for on-line help, or 'help.start()' for an HTML browser interface to help. Type 'q()' to quit R. > # > # fields is a package for analysis of spatial data written for > # the R software environment. > # Copyright (C) 2022 Colorado School of Mines > # 1500 Illinois St., Golden, CO 80401 > # Contact: Douglas Nychka, douglasnychka@gmail.edu, > # > # This program is free software; you can redistribute it and/or modify > # it under the terms of the GNU General Public License as published by > # the Free Software Foundation; either version 2 of the License, or > # (at your option) any later version. > # This program is distributed in the hope that it will be useful, > # but WITHOUT ANY WARRANTY; without even the implied warranty of > # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the > # GNU General Public License for more details. > # > # You should have received a copy of the GNU General Public License > # along with the R software environment if not, write to the Free Software > # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA > # or see http://www.r-project.org/Licenses/GPL-2 > ##END HEADER > ##END HEADER > > suppressMessages(library(fields)) > options( echo=FALSE) Testing: fast.1way means PASSED test at tolerance 1e-08 Testing: fast.1way vectorized means PASSED test at tolerance 1e-08 All done with testing misc functions > > proc.time() user system elapsed 0.775 0.069 0.841 fields/src/0000755000176200001440000000000014270404671012314 5ustar liggesusersfields/src/compactToMatC.c0000644000176200001440000000377413754255070015174 0ustar liggesusers/* c**** # fields is a package for analysis of spatial data written for c**** # the R software environment . c**** # Copyright (C) 2017 c**** # University Corporation for Atmospheric Research (UCAR) c**** # Contact: Douglas Nychka, nychka@ucar.edu, c**** # National Center for Atmospheric Research, PO Box 3000, Boulder, CO 80307-3000 c**** # c**** # This program is free software; you can redistribute it and/or modify c**** # it under the terms of the GNU General Public License as published by c**** # the Free Software Foundation; either version 2 of the License, or c**** # (at your option) any later version. c**** # This program is distributed in the hope that it will be useful, c**** # but WITHOUT ANY WARRANTY; without even the implied warranty of c**** # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the c**** # GNU General Public License for more details. */ #include #include #include #include #include SEXP compactToMatC(SEXP compactMat, SEXP len, SEXP n, SEXP diagVal, SEXP lowerTri, SEXP upperTri) { int In, lTri, uTri, i, j, index; double dVal; double *cMat, *cans; //cast R variables to C variables In = INTEGER(n)[0]; lTri = INTEGER(lowerTri)[0]; uTri = INTEGER(upperTri)[0]; dVal = REAL(diagVal)[0]; cMat = REAL(compactMat); SEXP ans = PROTECT(allocMatrix(REALSXP, In, In)); cans = REAL(ans); //intialize entire array to zero DWN May-1-2016 for(i = 0; i < (In*In); i++) { cans[i]= 0.0; } //set upper or lower triangle of output matrix index = 0; if(lTri) { for(i = 0; i < In; i++) { for(j=i+1; j < In; j++) { cans[i*In+j] = cMat[index]; index++; } } } index = 0; if(uTri) { for(i = 0; i < In; i++) { for(j=i+1; j < In; j++) { cans[j*In+i] = cMat[index]; index++; } } } //set diagonal values of output matrix for(i = 0; i < In; i++) { cans[i*In + i] = dVal; } UNPROTECT(1); return ans; } fields/src/rdistC.c0000644000176200001440000000341313754255070013714 0ustar liggesusers /* c**** # fields is a package for analysis of spatial data written for c**** # the R software environment . c**** # Copyright (C) 2018 c**** # University Corporation for Atmospheric Research (UCAR) c**** # Contact: Douglas Nychka, nychka@ucar.edu, c**** # National Center for Atmospheric Research, PO Box 3000, Boulder, CO 80307-3000 c**** # c**** # This program is free software; you can redistribute it and/or modify c**** # it under the terms of the GNU General Public License as published by c**** # the Free Software Foundation; either version 2 of the License, or c**** # (at your option) any later version. c**** # This program is distributed in the hope that it will be useful, c**** # but WITHOUT ANY WARRANTY; without even the implied warranty of c**** # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the c**** # GNU General Public License for more details. */ #include #include #include #include #include SEXP Rdist1C(SEXP x) { int nx = nrows(x); int dim = ncols(x); void F77_CALL(rdist1)(int *, double *, int *, double *); SEXP ans = PROTECT(allocMatrix(REALSXP, nx, nx)); double *rx = REAL(x), *rans = REAL(ans); /* rdist1_( &dim, rx, &nx, rans); */ F77_CALL(rdist1)( &dim, rx, &nx, rans); UNPROTECT(1); return ans; } SEXP RdistC(SEXP x1, SEXP x2) { int n1 = nrows(x1); int n2 = nrows(x2); int dim = ncols(x1); void F77_CALL(rdist)(int *, double *, int *, double *, int *, double *); SEXP ans = PROTECT(allocMatrix(REALSXP, n1, n2)); double *rx1 = REAL(x1),*rx2 = REAL(x2), *rans = REAL(ans); F77_CALL(rdist)( &dim, rx1, &n1, rx2, &n2, rans); UNPROTECT(1); return ans; } fields/src/addToDiagC.c0000644000176200001440000000247013754255070014411 0ustar liggesusers/* c**** # fields is a package for analysis of spatial data written for c**** # the R software environment . c**** # Copyright (C) 2018 c**** # University Corporation for Atmospheric Research (UCAR) c**** # Contact: Douglas Nychka, nychka@ucar.edu, c**** # National Center for Atmospheric Research, PO Box 3000, Boulder, CO 80307-3000 c**** # c**** # This program is free software; you can redistribute it and/or modify c**** # it under the terms of the GNU General Public License as published by c**** # the Free Software Foundation; either version 2 of the License, or c**** # (at your option) any later version. c**** # This program is distributed in the hope that it will be useful, c**** # but WITHOUT ANY WARRANTY; without even the implied warranty of c**** # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the c**** # GNU General Public License for more details. */ #include #include #include #include #include SEXP addToDiagC(SEXP mat, SEXP numsToAdd, SEXP n) { int In, i; double *cMat, *addVals; //cast R variables to C variables In = INTEGER(n)[0]; cMat = REAL(mat); addVals = REAL(numsToAdd); //Add number to diagonal for(i = 0; i < In; i++) { cMat[i*In+i] = cMat[i*In+i] + addVals[i]; } return R_NilValue; } fields/src/ExponentialUpperC.c0000644000176200001440000000322213754255070016067 0ustar liggesusers/* c**** # fields is a package for analysis of spatial data written for c**** # the R software environment . c**** # Copyright (C) 2018 c**** # University Corporation for Atmospheric Research (UCAR) c**** # Contact: Douglas Nychka, nychka@ucar.edu, c**** # National Center for Atmospheric Research, c**** # PO Box 3000, Boulder, CO 80307-3000 c**** # c**** # This program is free software; you can redistribute it and/or modify c**** # it under the terms of the GNU General Public License as published by c**** # the Free Software Foundation; either version 2 of the License, or c**** # (at your option) any later version. c**** # This program is distributed in the hope that it will be useful, c**** # but WITHOUT ANY WARRANTY; without even the implied warranty of c**** # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the c**** # GNU General Public License for more details. */ #include #include #include #include #include SEXP ExponentialUpperC(SEXP distMat, SEXP n, SEXP alpha) { int In, i, j; double dAlpha; double *dMat, *cans; //cast R variables to C variables In = INTEGER(n)[0]; dAlpha = REAL(alpha)[0]; dMat = REAL(distMat); SEXP ans = PROTECT(allocMatrix(REALSXP, In, In)); cans = REAL(ans); //intialize entire array to zero DWN May-4-2016 for(i = 0; i < (In*In); i++) { cans[i]= 0.0; } //set upper triangle of output matrix for(i = 0; i < In; i++) { for(j=0; j<= i; j++) { if(i == j) cans[i*In+j] = 1.0; else cans[i*In+j] = exp(-1*dMat[i*In+j]*dAlpha); } } UNPROTECT(1); return ans; } fields/src/init.c0000644000176200001440000001021413754255070013424 0ustar liggesusers/* c**** # fields is a package for analysis of spatial data written for c**** # the R software environment . c**** # Copyright (C) 2018 c**** # University Corporation for Atmospheric Research (UCAR) c**** # Contact: Douglas Nychka, nychka@ucar.edu, c**** # National Center for Atmospheric Research, PO Box 3000, Boulder, CO 80307-3000 c**** # c**** # This program is free software; you can redistribute it and/or modify c**** # it under the terms of the GNU General Public License as published by c**** # the Free Software Foundation; either version 2 of the License, or c**** # (at your option) any later version. c**** # This program is distributed in the hope that it will be useful, c**** # but WITHOUT ANY WARRANTY; without even the implied warranty of c**** # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the c**** # GNU General Public License for more details. */ #include #include #include // for NULL #include /* FIXME: Check these declarations against the C/Fortran source code. */ /* .Call calls */ extern SEXP addToDiagC(SEXP, SEXP, SEXP); extern SEXP compactToMatC(SEXP, SEXP, SEXP, SEXP, SEXP, SEXP); extern SEXP ExponentialUpperC(SEXP, SEXP, SEXP); extern SEXP multebC(SEXP, SEXP, SEXP, SEXP, SEXP, SEXP, SEXP, SEXP); extern SEXP RdistC(SEXP, SEXP); extern SEXP distMatHaversin(SEXP, SEXP, SEXP); extern SEXP distMatHaversin2(SEXP, SEXP, SEXP, SEXP); /* .Fortran calls */ extern void F77_NAME(css)(void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *); extern void F77_NAME(ddfind)(void *, void *, void *, void *, void *, void *, void *, void *, void *, void *); extern void F77_NAME(dmaket)(void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *); extern void F77_NAME(evlpoly)(void *, void *, void *, void *, void *); extern void F77_NAME(evlpoly2)(void *, void *, void *, void *, void *, void *, void *); extern void F77_NAME(igpoly)(void *, void *, void *, void *, void *, void *, void *, void *); extern void F77_NAME(inpoly)(void *, void *, void *, void *, void *, void *, void *); extern void F77_NAME(mltdrb)(void *, void *, void *, void *, void *, void *, void *, void *, void *); extern void F77_NAME(multrb)(void *, void *, void *, void *, void *, void *, void *, void *, void *, void *); extern void F77_NAME(multwendlandg)(void *, void *, void *, void *, void *, void *, void *, void *, void *); extern void F77_NAME(radbas)(void *, void *, void *, void *, void *, void *, void *); extern void F77_NAME(rcss)(void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *); static const R_CallMethodDef CallEntries[] = { {"addToDiagC", (DL_FUNC) &addToDiagC, 3}, {"compactToMatC", (DL_FUNC) &compactToMatC, 6}, {"ExponentialUpperC", (DL_FUNC) &ExponentialUpperC, 3}, {"multebC", (DL_FUNC) &multebC, 8}, {"RdistC", (DL_FUNC) &RdistC, 2}, {"distMatHaversin", (DL_FUNC) &distMatHaversin, 3}, {"distMatHaversin2", (DL_FUNC) &distMatHaversin, 4}, {NULL, NULL, 0} }; static const R_FortranMethodDef FortranEntries[] = { {"css", (DL_FUNC) &F77_NAME(css), 15}, {"ddfind", (DL_FUNC) &F77_NAME(ddfind), 10}, {"dmaket", (DL_FUNC) &F77_NAME(dmaket), 12}, {"evlpoly", (DL_FUNC) &F77_NAME(evlpoly), 5}, {"evlpoly2", (DL_FUNC) &F77_NAME(evlpoly2), 7}, {"igpoly", (DL_FUNC) &F77_NAME(igpoly), 8}, {"inpoly", (DL_FUNC) &F77_NAME(inpoly), 7}, {"mltdrb", (DL_FUNC) &F77_NAME(mltdrb), 9}, {"multrb", (DL_FUNC) &F77_NAME(multrb), 10}, {"multwendlandg", (DL_FUNC) &F77_NAME(multwendlandg), 9}, {"radbas", (DL_FUNC) &F77_NAME(radbas), 7}, {"rcss", (DL_FUNC) &F77_NAME(rcss), 17}, {NULL, NULL, 0} }; void R_init_fields(DllInfo *dll) { R_registerRoutines(dll, NULL, CallEntries, FortranEntries, NULL); R_useDynamicSymbols(dll, FALSE); } fields/src/fieldsF77Code.f0000644000176200001440000016521014453657471015030 0ustar liggesusersc**** # fields is a package for analysis of spatial data written for c**** # the R software environment . c**** # Copyright (C) 2018 c**** # University Corporation for Atmospheric Research (UCAR) c**** # Contact: Douglas Nychka, nychka@ucar.edu, c**** # National Center for Atmospheric Research, PO Box 3000, Boulder, CO 80307-3000 c**** # c**** # This program is free software; you can redistribute it and/or modify c**** # it under the terms of the GNU General Public License as published by c**** # the Free Software Foundation; either version 2 of the License, or c**** # (at your option) any later version. c**** # This program is distributed in the hope that it will be useful, c**** # but WITHOUT ANY WARRANTY; without even the implied warranty of c**** # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the c**** # GNU General Public License for more details. subroutine css(h,npoint,x,y,wght,sy,trace,diag,vlam, + ngrid,xg,yg,job,ideriv,ierr) C COMPUTES A CUBIC SMOOTHING SPLINE FIT TO A SET OF DATA GIVEN C NPOINT(=NUMBER OF DATA VALUES) AND LAMBDA(=VALUE OF C THE SMOOTHING parameter). THE CODE IS ADAPTED FROM A C PROGRAM IN DEBOOR,C.(1978).A PRACTICAL GUIDE TO SPLINES. C SPRINGER-VERLAG : NEW YORK. AN O(NPOINT) ALGORITHM C SUGGESTED BY HUTCHINSON AND DEHOOG IS USED TO COMPUTE C LVRAGE VALUES AND CONSTRUCT CONFIDENCE INTERVALS. c Adapted from Randy Eubank Texas A&M , Arizona State c c c this subroutine solves the problem: c c minimize (1/n) sum(i=1,n) [ (y(i) - f(x(i)))/wght(i) ]**2 + lambda*J(f) c over f c The solution will always be a piecewise cubic polynomial with join c points at the x values. Natural boundary conditions are assumed: at the c x(1) and x(npoints) the second and third derivatives of the slotuion c will be zero c All matrix calculations are done in double precision c c Arguments of evss: c h : natural log of lambda ( more convenient scale whepassing a c real*4) c if h is passed with a value less than or equal -1000 no smoothing will c be done and the spline will interploate the data points c npoint: number of observations c (x,y) : pairs of data points to be smoothed c sy : on return predicted values of f at x c wght : weights used in sum of squares. If the y have unequal c variance then an appropriate choice for wght is the standard deviation c (These weights are not normalized so multiplying by a constant c will imply solving the minimization problem with a different smoothing c parameter) c trace: in matrix from Yhat= A(lambda)Y with A(lambda) an nxn matrix c trace= tr(A(lambda)) = " effective number of paramters" c diag: diagonal elements of A(lambda) ( this is the mostt c computationally intetnsive opertation in this subroutine.) c vlam: value of the generalized cross-validation functyion (Used to c select an appropriate value for lambda based on the data.) c ngrid,xg,yg : on return, the ith deriv of the spline estimate is c evaluated on a grid, xg, with ngrid points. The c values are returned in yg c c ideriv: 0 = evaluate the function according to the job code c 1 = evaluate the first derivative of the function according c to the job code c 2 = evaluate the second derivative of the function according c to the job code c c job: is a vector of three integers c (a,b,c) (a=igcv, b=igrid, c=sorting) c a=0 evaluate spline at x values, return predicted values in sy c a=1 same as a=0 plus returning values of trace, diag and vlam c a=2 do no smoothing, interpolate the data c a=3 same as a=1 but use the passed value invlam argument as c a cost an offset factors in the diag vector c c b=0 do not evaluate the spline at any grid points c b=1 evaluate the spline (ideriv=0) or the ith deriv (i=ideriv) c of the spline at the (unique) sorted,data points, xg, return yg c b=2 evaluate the spline (ideriv=0) or the ith deriv (i=ideriv) c of the spline at ngrid equally spaced points between x(1) c and x(npoints) c b=3 evaluate the spline (ideriv=0) or the ith deriv (i=ideriv) c of the spline at ngrid points on grid passed in xg. c NOTE: extrapolation of the estimate beyond the range of c the x's will just be a linear function. c c c c c=0 X's may not be in sorted order c c=1 Assume that the X's are in sorted order c c=2 Do not sort the X's use the current set of keys c Should only be used on a second call to smooth c same design c c ierr : on return ierr>0 indicates all is not well :-( c parameter (NMAX=50000) implicit double precision (a-h,o-z) double precision h,trace,vlam double precision wght(npoint),X(npoint),Y(npoint) double precision sy(npoint),diag(npoint) double precision xg(ngrid),yg(ngrid) double precision A(NMAX,4),V(NMAX,7) double precision P,SIXP,SIX1MP,cost double precision ux(NMAX),uy(NMAX), uw(NMAX),ud(NMAX),utr integer imx(NMAX) integer idx(NMAX) integer npoint,igcv,igrid, isort, job(3) eps= 1d-7 cost=1.0 offset= 0 igcv= job(1) igrid=job(2) isort=job(3) c if( npoint.gt.NMAX) then ierr=1 return endif c initialize unique vector and two pointers do 5 k=1,npoint ux(k)=x(k) idx(k)=k 5 continue c sort vector X along with the keys in imx c c initialize the indices imx c if( isort.le.1) then do 6 k=1,npoint imx(k)=k 6 continue endif c c sort the X's permuting the indices c if(isort.eq.0) then call sortm( ux, imx,npoint) c the rank of the value x( imx(k)) is k endif c put y and the weights in the sorted order c C**** construct vector consisting of unique observations. jj=1 ind= imx(1) ux(jj)= x(ind) uy(jj)= y(ind) uw(jj)= wght(ind) idx(1)=jj c normalize eps by the range of the X values eps= eps/( x( imx(npoint)) - x( imx(1)) ) c c do 10 k=2,npoint c we are looping through ranks but this is not how the c order of the X are stored. The location of the kth smallest c is at idx(k) kshuf= imx(k) if( abs( ux(jj)-x(kshuf)).lt.eps) then c**** we have a repeat observation, update weight and the weighted c***** average at this point temp1= 1.0d0/uw(jj)**2 temp2= 1.0d0/wght(kshuf)**2 temp3 = (temp1 + temp2) uy(jj)= ( uy(jj)*temp1 + y(kshuf)*temp2)/temp3 uw(jj)= 1.0d0/dsqrt(temp3) else jj= jj+1 ux(jj)= x(kshuf) uy(jj)= y(kshuf) uw(jj)= wght(kshuf) endif c save the value that indexes unique values to repliacted ones. c x(k) corresponds to the unique X at idx(k) idx(k)=jj 10 continue nunq= jj itp=0 if(igcv.eq.2) itp=1 c handle condition for interpolation if(itp.eq.0) then P=1.d0/(npoint*dexp(h)+ 1.d0) else P=1.d0 endif call dSETUP(uX,uW,uY,nunq,V,A(1,4),NMAX,itp,ierr) C**** check for duplicate X's if so exit if(ierr.gt.0) then return endif call dCHOLD(P,V,A(1,4),nunq,A(1,3),A(1,1),NMAX) c compute predicted values SIX1MP=6.d0*(1.d0-P) if(itp.eq.0) then DO 61 I=1,Nunq a(i,1)=uY(I) - SIX1MP*(uW(I)**2)*A(I,1) 61 continue c fill in predicted values taking into account repeated data do 70 k=1,npoint jj= idx(k) sytemp= a(jj,1) c c unscramble the smoothed Y's kshuf= imx(k) sy(kshuf)=sytemp 70 continue else do 60 i=1,nunq a(i,1)=uy(i) 60 continue endif c return estimates on unique x's if igrid =1 if(igrid.eq.1) then do 65 i=1,nunq xg(i)=ux(i) yg(i)=a(i,1) 65 continue ngrid=nunq endif if(igrid.ge.1) then c c********* evaluate spline on grid C piecewise cubic COEFFICIENTS ARE STORED IN A(.,2-4). SIXP=6.d0*P DO 62 I=1,nunq A(I,3)=A(I,3)*SIXP 62 continue NPM1=nunq - 1 DO 63 I=1,NPM1 A(I,4)=(A(I+1,3)-A(I,3))/V(I,4) A(I,2)=(A(I+1,1)-A(I,1))/V(I,4) * -(A(I,3)+A(I,4)/3.*V(I,4))/2.*V(I,4) 63 continue c c create equally spaced x's if asked for ( igrid=2) c if( igrid.eq.2) then step= (ux(nunq)-ux(1))/(ngrid-1) xg(1)=ux(1) do 190 j=2,ngrid-1 xg(j)= xg(j-1)+step 190 continue xg(ngrid)=ux(nunq) endif uxmin= ux(1) uxmax= ux(nunq) a1= a(1,1) an= a(nunq,1) b1= a(1,2) d= ux(nunq)- ux(nunq-1) ind= nunq-1 bn= a(ind,2) + a(ind,3)*d + a(ind,4)*(d**2)/2.d0 c evalute spline by finding the interval containing the evaluation c point and applying the cubic formula for the curve estiamte c finding the interval such that ux(ind) <=xg(j) < ux( ind+1) c is done using a bisection search do 195 j=1,ngrid lint= ifind(xg(j),ux,nunq) if( lint.eq.0) then d= xg(j)-uxmin if (ideriv .eq. 0) - yg(j)= a1 + b1*d if (ideriv .eq. 1) - yg(j)= b1 if (ideriv .eq. 2) - yg(j)= 0.0 endif if( lint.eq.nunq) then d= xg(j)-uxmax if (ideriv .eq. 0) - yg(j)= an + bn*d if (ideriv .eq. 1) - yg(j)= bn if (ideriv .eq. 2) - yg(j)= 0.0 endif if( ((lint.ge.1 ) .and.( lint.lt.nunq))) then ind=lint c a1=a(ind,1) c a2=a(ind,2) c b=a(ind,3)/2.d0 c c=a(ind,4)/6.d0 c d= xg(j)-ux(ind) if (ideriv .eq. 0) - yg(j)= a(ind,1) + a(ind,2)*d + a(ind,3)*(d**2)/2.d0 - + a(ind,4)*(d**3)/6.d0 if (ideriv .eq. 1) - yg(j)= a(ind,2) + a(ind,3)*d + a(ind,4)*(d**2)/2.d0 if (ideriv .eq. 2) - yg(j)= a(ind,3) + a(ind,4)*d endif c 195 continue endif c****end of evaluation block if((igcv.eq.1).or.( igcv.eq.3)) then if( igcv.eq.3) then cost= diag(1) offset=diag(2) endif c***** begin computing gcv and trace C COMPUTE LVRAGE VALUES ,THE VARIANCE ESTIMATE C SGHAT2 AND CONFIDENCE INTERVALS. c call dLV(nunq,V,uw,SIX1MP,utr,ud,NMAX) rss=0.d0 trace=0.d0 vlam=0.d0 do 100 i=1,nunq c rss= rss + ((uy(i)-a(i,1))/uw(i))**2 trace= trace +ud(i) 100 continue do 110 k=1,npoint kshuf= imx(k) jj= idx(k) diag(kshuf)= ud(jj) rss= rss + ( (y(kshuf)- sy(kshuf))/wght(kshuf) )**2 110 continue ctrace= 2+ cost*( trace-2) if( (npoint -ctrace -offset) .gt. 0.d0) then vlam= (rss/npoint)/( 1- (ctrace-offset)/npoint)**2 else vlam=1e20 endif endif return END c fields, Tools for spatial data c Copyright (C) 2017, Institute for Mathematics Applied Geosciences c University Corporation for Atmospheric Research c Licensed under the GPL -- www.gpl.org/licenses/gpl.html subroutine csstr(h,nobs,x,y,wght,c,offset,trace,vlam,work,ierr) parameter(mxM=20000) implicit double precision (a-h,o-z) double precision h,trace, vlam,c,offset double precision x(nobs),y(nobs),wght(nobs) double precision work(nobs),diag(mxM),dumm1(1),dumm2(1) integer job(3),ideriv,ierr, ndum data ideriv/0/ job(1)=3 job(2)=0 job(3)=0 diag(1)=c diag(2)=offset ndum=1 call css(h,nobs,x,y,wght,work,trace,diag,vlam,ndum,dumm1,dumm2, - job,ideriv,ierr) return end c fields, Tools for spatial data c Copyright (C) 2017, Institute for Mathematics Applied Geosciences c University Corporation for Atmospheric Research c Licensed under the GPL -- www.gpl.org/licenses/gpl.html c** finds value of h minimizing the generalized cross-validation subroutine cvrf * (h,nobs,x,y,wt,sy,trace,diag,din,dout,cv,ierr) implicit double precision (a-h,o-z) double precision h,trace,cv double precision x(nobs),y(nobs),wt(nobs) double precision sy(nobs),diag(nobs),dumm1(1),dumm2(1) double precision din(10), dout(10) integer ngrid, ierr, job(3),ideriv data job/3,0,0/ data ideriv,ngrid/0,1/ call rcss(h,nobs,x,y,wt,sy,trace,diag,cv, + ngrid,dumm1,dumm2,job,ideriv,din,dout,ierr) nit= int( dout(1)) trace=dout(3) c return end c fields, Tools for spatial data c Copyright (C) 2017, Institute for Mathematics Applied Geosciences c University Corporation for Atmospheric Research c Licensed under the GPL -- www.gpl.org/licenses/gpl.html SUBROUTINE dCHOLD(P,V,QTY,NPOINT,U,QU,NMAX) c CONSTRUCTS THE UPPER THREE DIAGONALS IN V(I,J),I=2, C NPOINT-1,J=1,3 OF THE MATRIX 6*(1-P)*Q-TRANSP* C (D**2)*Q + P*R . (HERE R IS THE MATRIX PROPORTIONAL C TO Q-TRANSP*KSUBN*Q , WHERE KSUBN IS THE MATRIX C WITH ELEMENTS K(X(I),X(J)) AND K IS THE USUAL C KERNEL ASSOCIATED WITH CUBIC SPLINE SMOOTHING.) C THE CHOLESKY DECOMPOSITION OF THIS MATRIX IS COMPUTED C AND STORED IN V(.,1-3) AND THE EQUATION SYSTEM FOR C THE QUADRATIC COEFFICIENTS OF THE SPLINE IN ITS C PIECEWISE POLYNOMIAL REPRESENTATION IS SOLVED . THE C SOLUTION IS RETURNED IN U. c double precision P,QTY(NMAX),QU(NMAX),U(NMAX),V(NMAX,7) double precision SIX1MP,TWOP,RATIO,PREV INTEGER NPOINT,I,NPM1,NPM2 c NPM1=NPOINT - 1 C**** CONSTRUCT 6*(1-P)*Q-TRANSP.*(D**2)*Q + P*R SIX1MP=6.d0*(1.d0 - P) TWOP=2.d0*P DO 2 I=2,NPM1 V(I,1)=SIX1MP*V(I,5) + TWOP*(V(I-1,4)+V(I,4)) V(I,2)=SIX1MP*V(I,6) + P*V(I,4) V(I,3)=SIX1MP*V(I,7) 2 continue NPM2=NPOINT - 2 IF(NPM2 .GE. 2)GO TO 10 U(1)=0.d0 U(2)=QTY(2)/V(2,1) U(3)=0.d0 GO TO 41 C FACTORIZATION : FACTORIZE THE MATRIX AS L*B-INV* C L-TRANSP , WHERE B IS A DIAGONAL MATRIX AND L C IS UPPER TRIANGULAR. 10 DO 20 I=2,NPM2 RATIO=V(I,2)/V(I,1) V(I+1,1)=V(I+1,1) - RATIO*V(I,2) V(I+1,2)=V(I+1,2) - RATIO*V(I,3) V(I,2)=RATIO RATIO=V(I,3)/V(I,1) V(I+2,1)=V(I+2,1) - RATIO*V(I,3) V(I,3)=RATIO 20 continue C FORWARD SUBSTITUTION U(1)=0.d0 V(1,3)=0.d0 U(2)=QTY(2) DO 30 I=2,NPM2 U(I+1)=QTY(I+1) - V(I,2)*U(I) -V(I-1,3)*U(I-1) 30 continue C BACK SUBSTITUTION U(NPOINT)=0.d0 U(NPM1)=U(NPM1)/V(NPM1,1) DO 40 I=NPM2,2,-1 U(I)=U(I)/V(I,1) - U(I+1)*V(I,2) - U(I+2)*V(I,3) 40 continue C CONSTRUCT Q*U 41 PREV=0.d0 DO 50 I=2,NPOINT QU(I)=(U(I)-U(I-1))/V(I-1,4) QU(I-1)=QU(I) - PREV PREV=QU(I) 50 continue QU(NPOINT)=-QU(NPOINT) c RETURN END c fields, Tools for spatial data c Copyright (C) 2017, Institute for Mathematics Applied Geosciences c University Corporation for Atmospheric Research c Licensed under the GPL -- www.gpl.org/licenses/gpl.html c subroutine ddfind( nd,x1,n1, x2,n2, D0,ind,rd,Nmax, iflag) integer nd,n1,n2, ind(nmax,2) integer kk, i,j, ic double precision x1(n1,nd), x2(n2,nd), D0, rd(Nmax), D02, dtemp c**** counter for accumulating close points kk=0 D02= D0**2 do 15 i= 1, n1 do 10 j =1,n2 c c** accumulate squared differences c dtemp= 0.0 do 5 ic= 1, nd dtemp= dtemp + (x1(i,ic) - x2(j,ic))**2 if( dtemp.gt.D02) goto 10 5 continue c**** dtemp is less than D0 so save it as a close point kk=kk+1 c**** check if there is still space if( kk .gt. Nmax) then iflag= -1 goto 20 else ind(kk,1)= i ind(kk,2)= j rd(kk)= sqrt( dtemp) endif 10 continue 15 continue Nmax=kk 20 continue return end c fields, Tools for spatial data c Copyright (C) 2017, Institute for Mathematics Applied Geosciences c University Corporation for Atmospheric Research c Licensed under the GPL -- www.gpl.org/licenses/gpl.html SUBROUTINE dLV(NPOINT,V,WGHT,SIX1MP,TR,LEV,NMAX) c CONSTRUCTS THE UPPER THREE DIAGONALS OF (6*(1-P)* C Q-TRANSP*(D**2)*Q + P*R)-INV USING THE RECURSION C FORMULA IN HUTCHINSON,M.F. AND DEHOOG,F.R.(1985). C NUMER. MATH. 47,99-106, AND STORES THEM IN V(.,5-7). C THESE ARE USED IN POST AND PRE MULTIPLICATION BY C Q-TRANSP AND Q TO OBTAIN THE DIAGONAL ELEMENTS OF C THE HAT MATRIX WHICH ARE STORED IN THE VECTOR LEV. C THE TRACE OF THE HAT MATRIX IS RETURNED IN TR. c double precision V(NMAX,7),TR,W1,W2,W3,SIX1MP double precision wght(NMAX) double precision LEV(npoint) INTEGER NPM1,NPM2,NPM3,NPOINT c NPM1=NPOINT - 1 NPM2=NPOINT - 2 NPM3=NPOINT - 3 C RECURSION FOR DIAGONALS OF INVERSE MATRIX V(NPM1,5)=1/V(NPM1,1) V(NPM2,6)=-V(NPM2,2)*V(NPM1,5) V(NPM2,5)=(1/V(NPM2,1)) - V(NPM2,6)*V(NPM2,2) DO 10 I=NPM3,2,-1 V(I,7)=-V(I,2)*V(I+1,6) - V(I,3)*V(I+2,5) V(I,6)=-V(I,2)*V(I+1,5) - V(I,3)*V(I+1,6) V(I,5)=(1/V(I,1))- V(I,2)*V(I,6) - V(I,3)*V(I,7) 10 CONTINUE C POSTMULTIPLY BY (D**2)*Q-TRANSP AND PREMULTIPLY BY Q TO C OBTAIN DIAGONALS OF MATRIX PROPORTIONAL TO THE C IDENTITY MINUS THE HAT MATRIX. W1=1.d0/V(1,4) W2= -1.d0/V(2,4) - 1.d0/V(1,4) W3=1.d0/V(2,4) V(1,1)=V(2,5)*W1 V(2,1)=W2*V(2,5) + W3*V(2,6) V(2,2)=W2*V(2,6) + W3*V(3,5) LEV(1)=1.d0 - (WGHT(1)**2)*SIX1MP*W1*V(1,1) LEV(2)=1.d0 - (WGHT(2)**2)*SIX1MP*(W2*V(2,1) + W3*V(2,2)) TR=LEV(1) + LEV(2) DO 20 I=4,NPM1 W1=1.d0/V(I-2,4) W2= -1.d0/V(I-1,4) - 1.d0/V(I-2,4) W3=1.d0/V(I-1,4) V(I-1,1)=V(I-2,5)*W1 + V(I-2,6)*W2 + V(I-2,7)*W3 V(I-1,2)=V(I-2,6)*W1 + V(I-1,5)*W2 + V(I-1,6)*W3 V(I-1,3)=V(I-2,7)*W1 + V(I-1,6)*W2 + V(I,5)*W3 LEV(I-1)=1.d0 - (WGHT(I-1)**2)*SIX1MP*(W1*V(I-1,1) . + W2*V(I-1,2) + W3*V(I-1,3)) TR= TR + LEV(I-1) 20 CONTINUE W1=1.d0/V(NPM2,4) W2= -1.d0/V(NPM1,4) - 1.d0/V(NPM2,4) W3=1.d0/V(NPM1,4) V(NPOINT,1)=V(NPM1,5)*W3 V(NPM1,1)=V(NPM2,5)*W1 + V(NPM2,6)*W2 V(NPM1,2)=V(NPM2,6)*W1 + V(NPM1,5)*W2 LEV(NPM1)=1.d0 - (WGHT(NPM1)**2)*SIX1MP*(W1*V(NPM1,1) . + W2*V(NPM1,2)) LEV(NPOINT)=1.d0 - (WGHT(NPOINT)**2)*SIX1MP*W3*V(NPOINT,1) TR= TR + LEV(NPM1) + LEV(NPOINT) RETURN END c fields, Tools for spatial data c Copyright (C) 2017, Institute for Mathematics Applied Geosciences c University Corporation for Atmospheric Research c Licensed under the GPL -- www.gpl.org/licenses/gpl.html subroutine dmaket(m,n,dim,des,lddes,npoly,t,ldt, * wptr,info,ptab,ldptab) integer m,n,dim,lddes,npoly,ldt,wptr(dim),info,ptab(ldptab,dim) double precision des(lddes,dim),t(ldt,npoly) c c Purpose: create t matrix and append s1 to it. c c On Entry: c m order of the derivatives in the penalty c n number of rows in des c dim number of columns in des c des(lddes,dim) variables to be splined c lddes leading dimension of des as declared in the c calling program c ldt leading dimension of t as declared in the c calling program c c npoly dimension of polynomial part of spline c On Exit: c t(ldt,npoly+ncov1) [t:s1] c info error indication c 0 : successful completion c 1 : error in creation of t c Work Arrays: c wptr(dim) integer work vector c c Subprograms Called Directly: c Other - mkpoly c c integer i,j,k,kk,tt,nt,bptr,eptr c info = 0 c npoly = mkpoly(m,dim) do 5 j=1,n t(j,1)=1.0 5 continue nt = 1 if (npoly .gt. 1) then do 10 j=1,dim nt = j + 1 wptr(j) = nt ptab(nt,j)= ptab(nt,j) +1 do 15 kk = 1, n t(kk,nt)= des(kk,j) 15 continue c call dcopy(n,des(1,j),1,t(1,nt),1) 10 continue c c get cross products of x's in null space for m>2 c c WARNING: do NOT change next do loop unless you fully understand: c This first gets x1*x1, x1*x2, x1*x3, then c x2*x2, x2*x3, and finally x3*x3 for dim=3,n=3 c wptr(1) is always at the beginning of the current c level of cross products, hence the end of the c previous level which is used for the next. c wptr(j) is at the start of xj * (previous level) c do 50 k=2,m-1 do 40 j=1,dim bptr = wptr(j) wptr(j) = nt + 1 eptr = wptr(1) - 1 do 30 tt=bptr,eptr nt = nt + 1 do 21 jj= 1,dim ptab(nt,jj)= ptab(tt,jj) 21 continue ptab( nt,j)= 1+ ptab( nt,j) do 20 i=1,n t(i,nt) = des(i,j) * t(i,tt) 20 continue 30 continue 40 continue 50 continue if (nt .ne. npoly) then info = 1 return endif endif c end c fields, Tools for spatial data c Copyright (C) 2017, Institute for Mathematics Applied Geosciences c University Corporation for Atmospheric Research c Licensed under the GPL -- www.gpl.org/licenses/gpl.html subroutine drdfun(n, d2, par) double precision d2(n), par(2), dtemp integer n if( int(par(2)).eq.0) then do 5 k =1,n d2(k)= par(1)*(d2(k))**( par(1)-1) 5 continue else do 6 k=1,n dtemp= d2(k) if( dtemp.GE.1e-35) then c c NOTE factor of 2 adjusts for log being applied to c distance rather than squared distance d2(k)= (par(1)*log(dtemp) +1)*(dtemp)**( par(1)-1)/2 else d2(k)=0.0 endif 6 continue endif return end c fields, Tools for spatial data c Copyright (C) 2017, Institute for Mathematics Applied Geosciences c University Corporation for Atmospheric Research c Licensed under the GPL -- www.gpl.org/licenses/gpl.html SUBROUTINE dSETUP(X,WGHT,Y,NPOINT,V,QTY,NMAX,itp,ierr) C PUT DELX=X(.+1)-X(.) INTO V(.,4) C PUT THE THREE BANDS OF THE MATRIX Q-TRANSP*D INTO C V(.,1-3) C PUT THE THREE BANDS OF (D*Q)-TRANSP*(D*Q) AT AND C ABOVE THE DIAGONAL INTO V(.,5-7) C HERE Q IS THE TRIDIAGONAL MATRIX OF ORDER (NPOINT C -2,NPOINT) THAT SATISFIES Q-TRANSP*T=0 AND WGHT C IS THE DIAGONAL MATRIX WHOSE DIAGONAL ENTRIES C ARE THE SQUARE ROOTS OF THE WEIGHTS USED IN THE C PENALIZED LEAST-SQUARES CRITERION c implicit double precision (a-h,o-z) double precision WGHT(NMAX),X(NMAX),y(NMAX) double precision QTY(NMAX),V(NMAX,7) double precision DIFF,PREV INTEGER NPOINT,I,NPM1 c NPM1=NPOINT -1 V(1,4)=X(2)-X(1) if(v(1,4).eq.0.d0) then ierr=5 return endif DO 11 I=2,NPM1 V(I,4)=X(I+1) - X(I) if(v(I,4).eq.0.d0) then ierr=5 return endif if(itp.eq.0) then V(I,1)=WGHT(I-1)/V(I-1,4) V(I,2)=-WGHT(I)/V(I,4) - WGHT(I)/V(I-1,4) V(I,3)=WGHT(I+1)/V(I,4) else V(I,1)=1.d0/V(I-1,4) V(I,2)=-1.d0/V(I,4) - 1.0/V(I-1,4) V(I,3)=1.d0/V(I,4) endif 11 continue c V(NPOINT,1)=0.d0 DO 12 I=2,NPM1 V(I,5)=V(I,1)**2 + V(I,2)**2 + V(I,3)**2 12 continue IF(NPM1 .LT. 3)GO TO 14 DO 13 I=3,NPM1 V(I-1,6)=V(I-1,2)*V(I,1) + V(I-1,3)*V(I,2) 13 continue 14 V(NPM1,6)=0.d0 IF(NPM1 .LT. 4)GO TO 16 DO 15 I=4,NPM1 V(I-2,7)=V(I-2,3)*V(I,1) 15 continue 16 V(NPM1-1,7)=0.d0 V(NPM1,7)=0.d0 c C CONSTRUCT Q-TRANSP. * Y IN QTY PREV=(Y(2) - Y(1))/V(1,4) DO 21 I=2,NPM1 DIFF=(Y(I+1)-Y(I))/V(I,4) QTY(I)=DIFF - PREV PREV=DIFF 21 continue c RETURN END c fields, Tools for spatial data c Copyright (C) 2017, Institute for Mathematics Applied Geosciences c University Corporation for Atmospheric Research c Licensed under the GPL -- www.gpl.org/licenses/gpl.html subroutine evlpoly(x,n,coef,j,result) c evaluates a polynomial: coef(1) + sum_i= 2,j coef(i)x**i integer j,n, i double precision x(n), result(n), coef(j) double precision temp, tempx, temp2 do 10 i = 1,n temp= coef(1) tempx= x(i) temp2= tempx c temp is set to constant now loop over powers do 20 kk= 2, j temp= temp + coef(kk)* temp2 temp2= temp2*tempx 20 continue result(i)= temp 10 continue return end c fields, Tools for spatial data c Copyright (C) 2017, Institute for Mathematics Applied Geosciences c University Corporation for Atmospheric Research c Licensed under the GPL -- www.gpl.org/licenses/gpl.html subroutine evlpoly2(x,n,nd,ptab,j,coef,result) c evaluates a polynomial: coef(1) + sum_i= 2,j coef(i)x**i integer j,n, i, nd double precision x(n,nd), result(n), coef(j) integer ptab(j,nd) double precision temp, temp2 do 10 i = 1,n temp= 0 c for a given vector accumlate the polynomial terms do 20 kk= 1, j temp2 =1.0 do 30 l=1, nd if( ptab(kk,l).ne.0) then temp2= temp2* (x(i,l)**ptab(kk,l)) endif 30 continue temp = temp + temp2*coef(kk) 20 continue result(i)= temp 10 continue return end c fields, Tools for spatial data c Copyright (C) 2017, Institute for Mathematics Applied Geosciences c University Corporation for Atmospheric Research c Licensed under the GPL -- www.gpl.org/licenses/gpl.html subroutine expfn(n,d2, par) double precision d2(n), par(1) integer n do 5 k =1,n d2(k)= exp(-1*d2(k)**(par( 1)/2)) 5 continue return end c fields, Tools for spatial data c Copyright (C) 2017, Institute for Mathematics Applied Geosciences c University Corporation for Atmospheric Research c Licensed under the GPL -- www.gpl.org/licenses/gpl.html INTEGER FUNCTION IFIND(X,XK,N) C FIND I SUCH THAT XK(I) LE X LT XK(I+1) C IFIND=0 IF X LT XK(1) C IFIND=N IF X GT XK(N) C J F MONAHAN JAN 1982 DEPT OF STAT, N C S U, RALEIGH, NC 27650 double precision X,XK(N) IFIND=0 IF(X.LT.XK(1)) RETURN IFIND=N IF(X.GE.XK(N)) RETURN IL=1 IU=N 1 IF(IU-IL.LE.1) GO TO 4 I=(IU+IL)/2 C IF(X-XK(I)) 2,5,3 IF( (X-XK(I)).eq.0) go to 5 IF( (X-XK(I)).gt.0) go to 3 C following used to have line number 2 IU=I GO TO 1 3 IL=I GO TO 1 4 IFIND=IL RETURN 5 IFIND=I RETURN END c fields, Tools for spatial data c Copyright (C) 2017, Institute for Mathematics Applied Geosciences c University Corporation for Atmospheric Research c Licensed under the GPL -- www.gpl.org/licenses/gpl.html subroutine igpoly(nx, xg,ny,yg,np,xp,yp,ind) !---------------------------------------------------------------------- ! This subroutine determines whether or not an 2-d point (xg(i),yg(j)) ! element is inside a (closed) set of points xp,yp that ! are assumed to form polygon. ! result is an matrix indicating comparision for all ! combinations of xg and yg !---------------------------------------------------------------------- integer np ! # of points in polygon integer nx,ny ! # points to check real xg(nx) ! x grid values to check real yg(ny) ! y grid values to check real xp(np) ! 2d-locations of polygon real yp(np) real x1, x2, y1,y2 ! min and max of x and y real temp, xt, yt integer ind(nx,ny) ! THE ANSWER : ind(i)=1 if point xd(i),yd(i) is ! in polygon 0 otherwise integer in x1= xp(1) x2= xp(2) y1= yp(1) y2= yp(1) ! ! find the minima and maxima of the polygon coordinates ! i.e. the smallest rectangle containing the polygon. do j = 1,np temp= xp(j) if( temp.lt.x1) then x1 = temp endif if( temp.gt.x2) then x2 = temp endif temp= yp(j) if( temp.lt.y1) then y1 = temp endif if( temp.gt.y2) then y2 = temp endif enddo ! loop over all ! grid points do i = 1, nx do j = 1,ny xt= xg(i) yt= yg(j) ! quick test that point is inside the bounding rectangle ! of the polygon if( (xt.le. x2).and. (xt.ge.x1).and. * (yt.le.y2).and.(yt.ge.y1) ) then call inpoly2(xt,yt,np,xp,yp, in) ind(i,j)=in else ind(i,j)= 0 endif enddo enddo return end c fields, Tools for spatial data c Copyright (C) 2017, Institute for Mathematics Applied Geosciences c University Corporation for Atmospheric Research c Licensed under the GPL -- www.gpl.org/licenses/gpl.html subroutine inpoly(nd, xd,yd,np,xp,yp,ind) !---------------------------------------------------------------------- ! This subroutine determines whether or not an 2-d point (xd(j),yd(j)) ! element is inside a (closed) set of points xp,yp that ! are assumed to form polygon. !---------------------------------------------------------------------- integer np ! # of points in polygon integer nd ! # points to check real xd(nd) ! 2d-locations to check real yd(nd) real xp(np) ! 2d-locations of polygon real yp(np) real x1, x2, y1,y2 ! min and max of x and y real temp, xt, yt integer ind(nd) ! THE ANSWER : ind(i)=1 if point xd(i),yd(i) is ! in polygon 0 otherwise integer in x1= xp(1) x2= xp(2) y1= yp(1) y2= yp(1) ! ! find the minima and maxima of the polygon coordinates ! i.e. the smallest rectangle containing the polygon. do j = 1,np temp= xp(j) if( temp.lt.x1) then x1 = temp endif if( temp.gt.x2) then x2 = temp endif temp= yp(j) if( temp.lt.y1) then y1 = temp endif if( temp.gt.y2) then y2 = temp endif enddo do j = 1,nd xt= xd(j) yt= yd(j) ! quick test that point is inside the bounding rectangle ! if not it is not inside polygon if( (xt.le. x2).and. (xt.ge.x1).and. * (yt.le.y2).and.(yt.ge.y1) ) then call inpoly2(xt,yt,np,xp,yp, in) ind(j)=in else ind(j)= 0 endif enddo return end subroutine inpoly2(xpnt,ypnt,np,xp,yp,in) C parameter (pi=3.14159265358979,ttpi=2.*pi) C dimension xp(np),yp(np) real xpnt, ypnt integer in C C---------------------------------------------------------------------- C C THE VALUE OF THIS FUNCTION IS NON-ZERO IF AND ONLY IF (XPNT,YPNT) C IS INSIDE OR *ON* THE POLYGON DEFINED BY THE POINTS (XP(I),YP(I)), C FOR I FROM 1 TO NP. C C THE INPUT POLYGON DOES NOT HAVE TO BE A CLOSED POLYGON, THAT IS C IT DOES NOT HAVE TO BE THAT (XP(1),YP(1) = (XP(NP,YP(NP)). C C---------------------------------------------------------------------- C C DETERMINE THE NUMBER OF POINTS TO LOOK AT (DEPENDING ON WHETHER THE C CALLER MADE THE LAST POINT A DUPLICATE OF THE FIRST OR NOT). C if (xp(np).eq.xp(1) .and. yp(np).eq.yp(1)) then npts = np-1 else npts = np end if in = 0 ! ASSUME POINT IS OUTSIDE C --- ------------------------------------------------------------------ C --- CHECK TO SEE IF THE POINT IS ON THE POLYGON. C --- ------------------------------------------------------------------ do ipnt = 1,npts if (xpnt .eq. xp(ipnt) .and. ypnt .eq. yp(ipnt) ) then in = 1 goto 999 ! EARLY EXIT endif enddo C --- ------------------------------------------------------------------ C --- COMPUTE THE TOTAL ANGULAR CHANGE DESCRIBED BY A RAY EMANATING C --- FROM THE POINT (XPNT,YPNT) AND PASSING THROUGH A POINT THAT C --- MOVES AROUND THE POLYGON. C --- ------------------------------------------------------------------ anch = 0. inxt = npts xnxt = xp(npts) ynxt = yp(npts) anxt = atan2(ynxt-ypnt, xnxt-xpnt) do 100 ipnt=1,npts ilst = inxt xlst = xnxt ylst = ynxt alst = anxt inxt = ipnt xnxt = xp(inxt) ynxt = yp(inxt) anxt = atan2(ynxt-ypnt, xnxt-xpnt) adif = anxt-alst if (abs(adif) .gt. pi) adif = adif - sign(ttpi,adif) anch = anch + adif 100 continue C --- ------------------------------------------------------------------ C --- IF THE POINT IS OUTSIDE THE POLYGON, THE TOTAL ANGULAR CHANGE C --- SHOULD BE EXACTLY ZERO, WHILE IF THE POINT IS INSIDE THE POLYGON, C --- THE TOTAL ANGULAR CHANGE SHOULD BE EXACTLY PLUS OR MINUS TWO PI. C --- WE JUST TEST FOR THE ABSOLUTE VALUE OF THE CHANGE BEING LESS C --- THAN OR EQUAL TO PI. C --- ------------------------------------------------------------------ if (abs(anch) .ge. pi) in = 1 999 continue return end c fields, Tools for spatial data c Copyright (C) 2017, Institute for Mathematics Applied Geosciences c University Corporation for Atmospheric Research c Licensed under the GPL -- www.gpl.org/licenses/gpl.html C** evaluates partial derivatives of radial basis functions with c** nodes at x2 and at the points x1 c subroutine mltdrb( nd,x1,n1, x2, n2, par, c,h,work) implicit double precision (a-h,o-z) integer nd,n1,n2,ic, ivar, ir, j double precision par(2), x1(n1,nd) double precision x2(n2,nd), c(n2), h(n1, nd) double precision sum, sum2 double precision work( n2) c double precision ddot do 1000 ivar=1, nd c****** work aray must be dimensioned to size n2 c **** loop through columns of output matrix K c*** outermost loop over columns of x1 and x2 should c*** help to access adjacent values in memory. do 5 ir= 1, n1 c evaluate all basis functions at x1(j,.) do 10 j =1,n2 c zero out sum accumulator sum=0.0 do 15 ic=1,nd c** accumulate squared differences sum= sum+ (x1(ir,ic)- x2(j,ic))**2 15 continue work(j)=sum 10 continue C**** evaluate squared distances with basis functions. call drdfun( n2,work(1) ,par(1) ) do 11 j= 1, n2 work( j)= 2.0*work(j)*(x1(ir,ivar)- x2(j,ivar)) 11 continue c*****now the dot product you have all been waiting for! sum2= 0.0 do 12 j = 1, n2 sum2 = sum2 + work(j)*c(j) 12 continue c h(ir,ivar)= ddot( n2, work(1), 1, c(1),1) h(ir,ivar) = sum2 5 continue 1000 continue return end c fields, Tools for spatial data c Copyright (C) 2017, Institute for Mathematics Applied Geosciences c University Corporation for Atmospheric Research c Licensed under the GPL -- www.gpl.org/licenses/gpl.html subroutine mltdtd( nd,x1,n1,np,ptab, d,h) implicit double precision (a-h,o-z) integer nd,n1,np, ivar double precision x1(n1,nd) double precision d(np), h(n1, nd) double precision work, prod, xp,xx integer ptab(np,nd) c outer most loop is over the variables w/r partial derivative do 1000 ivar=1, nd c****** work aray must be dimensioned to size np do 5 ir= 1, n1 c next loop is over rows of x1 c c evaluate all partials of polynomials at x1(j,.) c take ddot product of this vector with d c this is the element to return in h(ir,ivar) work=0.0 do 10 j =1,np prod=0.0 ipv= ptab( j,ivar) if( ipv.gt.0) then prod=1.0 do 11 k= 1, nd ip= ptab(j,k) c ip is the power of the kth variable in the jth poly if( ip.eq.0) goto 11 xx= x1(ir,k) c** if( k.eq.ivar) then if( ip.eq.1) then xp=1.0 else xp= (ip)* xx**(ip-1) endif else xp= xx**(ip) endif prod=prod*xp 11 continue endif work= work + prod* d(j) 10 continue c h(ir,ivar)=work 5 continue 1000 continue return end c fields, Tools for spatial data c Copyright (C) 2017, Institute for Mathematics Applied Geosciences c University Corporation for Atmospheric Research c Licensed under the GPL -- www.gpl.org/licenses/gpl.html subroutine multWendlandG( mx, my, deltaX, deltaY, * nc, center, coef, h, flag) integer mx, my, nc, flag double precision deltaX, deltaY, center(nc,2), coef(nc) double precision h(mx,my) c integer j, k, l, m1, m2, n1, n2 double precision kstar, lstar, d, wendlandFunction do j = 1, nc kStar= center(j,1) lStar= center(j,2) m1 = max( ceiling(-deltaX + kStar), 1) m2 = min( floor( deltaX + kStar), mx) n1 = max( ceiling(-deltaY + lStar), 1) n2 = min( floor( deltaY + lStar), my) do l = n1, n2 do k = m1, m2 d = dsqrt( ((k-kStar)/deltaX)**2 + ((l- lStar)/deltaY)**2) h(k,l) = h(k,l) + wendlandFunction( d)* coef(j) c h(k,l) = h(k,l) + 2 enddo enddo enddo flag=0 return end double precision function wendlandFunction(d) double precision d if( d.GE.1) then wendlandFunction = 0 else wendlandFunction = ((1-d)**6) * (35*d**2 + 18*d + 3)/3 endif return end c fields, Tools for spatial data c Copyright (C) 2017, Institute for Mathematics Applied Geosciences c University Corporation for Atmospheric Research c Licensed under the GPL -- www.gpl.org/licenses/gpl.html C** evaluates radial basis functions c**** K_ij= radfun( distance( x1_i, x2_j)) c**** and does the multplication h= Kc c**** K is n1Xn2 c**** h is n1Xn3 c***** c is n2xn3 subroutine multrb( nd,x1,n1, x2,n2, par, c,n3,h,work) implicit double precision (a-h,o-z) integer nd,n1,n2,n3,ic, jc,j double precision par(2),x1(n1,nd), x2(n2,nd), c(n2,n3), h(n1,n3) double precision work( n2) c double precision ddot double precision sum, sum2 double precision radfun c****** work aray must be dimensioned to size n1 c **** loop through columns of output matrix K do 5 ir= 1, n1 do 10 j =1,n2 sum=0.0 do 15 ic=1,nd c** accumulate squared differences sum= sum+ (x1(ir,ic)- x2(j,ic))**2 15 continue work(j)=radfun( sum, par(1), par(2)) 10 continue c***** dot product for matrix multiplication do 30 jc=1,n3 sum2= 0.0 do 12 j = 1, n2 sum2 = sum2 + work(j)*c(j, jc) 12 continue h(ir,jc) = sum2 c h(ir,jc)= ddot( n2, work, 1, c(1,jc),1) 30 continue 5 continue return end c fields, Tools for spatial data c Copyright (C) 2017, Institute for Mathematics Applied Geosciences c University Corporation for Atmospheric Research c Licensed under the GPL -- www.gpl.org/licenses/gpl.html c**** subroutine to fill in the omega ( or K) matrix for c**** ridge regression S funcion c**** K_ij= radfun( distance( x1_i, x2_j)) c subroutine radbas( nd,x1,n1, x2,n2, par, k) integer nd,n1,n2,ic double precision par(2), x1(n1,nd), x2(n2,nd), k(n1,n2) double precision xtemp, radfun c **** loop through columns of output matrix K c*** outer most loop over columns of x1 and x2 should reduce memory swaps do ic= 1, nd do j =1,n2 xtemp= x2(j,ic) do i= 1, n1 c** accumulate squared differences k(i,j)= (x1(i,ic)- xtemp)**2 + k(i,j) enddo enddo enddo c**** at this point k( i,j) is the squared distance between x1_i and x2_j c*** now evaluate radial basis functions do j =1,n2 do i= 1, n1 k(i,j)= radfun( k(i,j), par(1), par(2) ) enddo enddo return end c fields, Tools for spatial data c Copyright (C) 2017, Institute for Mathematics Applied Geosciences c University Corporation for Atmospheric Research c Licensed under the GPL -- www.gpl.org/licenses/gpl.html c evaluates thin plate spline radial basis function double precision function radfun(d2, par1, par2) double precision d2, par1, par2 if( d2.lt.1e-20) then d2= 1e-20 endif if( int(par2).eq.0) then radfun= (d2)**( par1) else c note: d2 is squared distance c divide by 2 to have log evaluated on distance c as opposed to squared distance. radfun= (log(d2)/2) * ((d2)**( par1)) endif return end c fields, Tools for spatial data c Copyright (C) 2017, Institute for Mathematics Applied Geosciences c University Corporation for Atmospheric Research c Licensed under the GPL -- www.gpl.org/licenses/gpl.html subroutine rcss(h,npoint,x,y,wt,sy,trace,diag,cv, + ngrid,xg,yg,job,ideriv,din,dout,ierr) c This a program to compute a robust univariate spline according to the c model: c minimize (1/n) sum(i=1,n)[rho( y(i)-f(x(i) )] + lambda*J(f) c over f c definition of the rho function and its derivative are in rcsswt c and rcssr c c One way of speeding convergence is to use the results from a previous c estimate as the starting values for the another estimate. This is c particulary appropriate when lambda or a parameter in the rho function c is being varied. Moderate changes in lambda will often yield similar c estimates. The way to take advantage of this is to pass the weights c from the previous fit as teh starting values for the next estimate c c Arguments of rcss: c h : natural log of lambda c c if h is passed with a value less than or equal -1000 no smoothing will c be done and the spline will interploate the data points c npoint: number of observations c (x,y) : pairs of data points to be smoothed c x(i) are assumed to be increasing. Repeated c observations at the same x are not handled by this routine. c sy : on return predicted values of f at x c wt : weights used in the iterivatively reweighted least c squares algorithm to compute robust spline. Vector c passed are used as the starting values. Subsequent c iterations compute the weights by a call to the c subroutine rcsswt c c that is the linear approximation of teh estimator at c convergence. c trace= tr(A(lambda)) = " effective number of paramters" c diag: diagonal elements of A(lambda) ( this is the most c computationally intetnsive opertation in this subroutine.) c cv: approximate cross-validation function c using the linear approximation at convergence c c ngrid,xg,yg : on return, the ith deriv of the spline estimate is c evaluated on a grid, xg, with ngrid points. The c values are returned in yg c c ideriv: 0 = evaluate the function according to the job code c 1 = evaluate the first derivative of the function according c to the job code c 2 = evaluate the second derivative of the function according c to the job code c c din: Vector of input parameters c din(1)= cost for cv c din(2)= offset for cv c din(3)= max number of iterations c din(4)= tolerance criterion for convergence c c din(5)= C scale parameter in robust function (transition from c quadratic to linear. c din(6)= alpha 1/2 slope of rho function for large, positive c residuals slope for residuals <0 : is 1/2 (1-alpha) c see comments in rcsswt for defintion of the rho and psi c functions c c job: in decimal job=(a,b,c) (a=igcv, b=igrid) c a=0 evaluate spline at x values, return predicted values in sy c a=1 same as a=0 plus returning values of trace, diag and cv c a=2 do no smoothing, interpolate the data c a=3 same as a=1 but use the passed values in din(1) din(2) c for computing cv function c c b=0 do not evaluate the spline at any grid points c b=1 evaluate the spline (ideriv=0) or the ith deriv (i=ideriv) c of the spline at the (unique) sorted,data points, xg, return yg c b=2 evaluate the spline (ideriv=0) or the ith deriv (i=ideriv) c of the spline at ngrid equally spaced points between x(1) c and x(npoints) c b=3 evaluate the spline (ideriv=0) or the ith deriv (i=ideriv) c of the spline at ngrid points on grid passed in xg. c NOTE: extrapolation of the estimate beyond the range of c the x's will just be a linear function. c c c c c=1 Assume that the X's are in sorted order c c=2 Do not sort the X's use the current set of keys c Should only be used on a second call to smooth c same design c Arguments of subroutine: c dout(1)= numit c dout(2)=tstop c dout(3) = trace c dout(4)= cv c numit: actual number of iterations for convergence c tstop: value of convergence criterion at finish. c c ierr: if ierr>0 something bad has happened c ierr>10 indicates problems in the call to the cubic spline c routine. c parameter(NMAX=20000) implicit double precision (a-h,o-z) double precision h,trace,cv double precision wt(npoint),X(npoint),Y(npoint) double precision sy(npoint),diag(npoint) double precision xg(ngrid),yg(ngrid) double precision din(10), dout(10),cost, offset, dum1, dum2 integer npoint,ngrid ,itj(3), job(3) if(npoint.gt.NMAX) then ierr=1 return endif maxit= int(din(3)) tstop=din(4) ybar=0.0 ysd=0.0 do 10 k=1,npoint diag(k) = y(k) ybar= ybar+ y(k) ysd= ysd+ y(k)**2 10 continue ybar= ybar/npoint ysd= sqrt( ysd/npoint - ybar**2) c Start iterating test=0.0 itj(1)= 0 itj(2)=0 itj(3)=0 do 500 it=1,maxit if( it.gt.1) then itj(3)=2 endif c fit a weighted least squares cubic smoothing spline call css(h,npoint,x,y,wt,sy, * dum1,diag,dum2,ngrid,xg,yg, * itj,ideriv,ierr) c check for an error returned by spline routine if(ierr.gt.0) then c add 10 so these can be distinguished from errors in this routine ierr= 10 + ierr return endif c compute convergence criterion c The intent of this criterion is to find out when successive iterations c produce changes that are small do 25 i=1,npoint test=(diag(i)-sy(i))**2 + test diag(i)= sy(i) 25 continue test=sqrt(test/npoint)/ysd if( test.lt.tstop ) then c * exit loop * numit=it goto 1000 endif c c make up new set of weights c call rcsswt( npoint, y,sy,wt, din(5)) c reinitialize test criterion for convergence c test=0.0 500 continue numit= maxit 1000 continue c One last call if job code is not 0 if( (job(1).ne.0).or.(job(2).ne.0)) then c call css(h,npoint,x,y,wt,sy, * trace,diag,cv,ngrid,xg,yg, * job,ideriv,ierr) ia= job(1) ig= job(2) c if(ig.gt.0) then c endif c calculate cv value if asked for if( (ia.eq.1) .or.( ia.eq.3) ) then if(ia.eq.3) then cost= din(1) offset= din(2)/npoint else cost=1 offset= 0 endif cv=0.0 do 1500 k=1,npoint c compute approx. cross-validated residual c plug cv residual into rho function, din(5) is the begining of parameter c vector for the rho function (scale and alpha) c c but only do this if the leverage is away from one. c this prevents the numerical problems with quantile splein of a zero c residual and c a zero denominator. if(1- diag(k).gt.1e-7) then resid= (y(k)- sy(k))/( 1- cost*(diag(k)+offset)) cv= cv + rcssr(resid, din(5)) endif 1500 continue cv= cv/npoint endif endif dout(1)=numit dout(2)=test dout(3)=trace dout(4)=cv return end c fields, Tools for spatial data c Copyright (C) 2017, Institute for Mathematics Applied Geosciences c University Corporation for Atmospheric Research c Licensed under the GPL -- www.gpl.org/licenses/gpl.html double precision function rcssr(r,par) c c robust rho function: c This is a peicewise polynomial with knots at -C , 0 and C c the function is quadratic for -CC c rho is continuous for all u aqnd differentiable for all points c except u=0 when a != 1/2 c c c rho(u) = 2*a*u - a*c for u>C c a*u**2/C for 0 goes to here 8 X(I)=XX ki(I)=kki GO TO 2 9 X(1)=XX ki(1)=kki RETURN END fields/src/expfnC.c0000644000176200001440000000247313754255070013714 0ustar liggesusers/* c**** # fields is a package for analysis of spatial data written for c**** # the R software environment . c**** # Copyright (C) 2018 c**** # University Corporation for Atmospheric Research (UCAR) c**** # Contact: Douglas Nychka, nychka@ucar.edu, c**** # National Center for Atmospheric Research, PO Box 3000, Boulder, CO 80307-3000 c**** # c**** # This program is free software; you can redistribute it and/or modify c**** # it under the terms of the GNU General Public License as published by c**** # the Free Software Foundation; either version 2 of the License, or c**** # (at your option) any later version. c**** # This program is distributed in the hope that it will be useful, c**** # but WITHOUT ANY WARRANTY; without even the implied warranty of c**** # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the c**** # GNU General Public License for more details. */ #include #include #include #include #include SEXP expfnC(SEXP n, SEXP d2, SEXP par) { int In, i; double Dpar, par2; double *Pd2; //caste R variables to C variables, allocate answer vector In = INTEGER(n)[0]; Dpar = REAL(par)[0]; par2 = Dpar/2; Pd2 = REAL(d2); for(i = 0; i < In; i++) { Pd2[i] = exp(-1*pow(Pd2[i], par2)); } return(R_NilValue); } fields/src/multebC.c0000644000176200001440000000516713754255070014067 0ustar liggesusers/* c**** # fields is a package for analysis of spatial data written for c**** # the R software environment . c**** # Copyright (C) 2018 c**** # University Corporation for Atmospheric Research (UCAR) c**** # Contact: Douglas Nychka, nychka@ucar.edu, c**** # National Center for Atmospheric Research, PO Box 3000, Boulder, CO 80307-3000 c**** # c**** # This program is free software; you can redistribute it and/or modify c**** # it under the terms of the GNU General Public License as published by c**** # the Free Software Foundation; either version 2 of the License, or c**** # (at your option) any later version. c**** # This program is distributed in the hope that it will be useful, c**** # but WITHOUT ANY WARRANTY; without even the implied warranty of c**** # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the c**** # GNU General Public License for more details. */ #include #include #include #include #include #include #include #include #include SEXP multebC(SEXP nd, SEXP x1, SEXP n1, SEXP x2, SEXP n2, SEXP par, SEXP c, SEXP work) { // NOTE: in original multeb function in fields, "h" was passed but not used and returned as an answer. // h is not an argument to this function, but "ans" is equivalent to h and is allocated in C and returned. int Ind, In1, In2, r1, r2, d; double sum; double *Px1, *Px2, *Pc, *Pwork, *cans; SEXP ans; void expfnC( SEXP, SEXP, SEXP); // cast R variables to C variables Ind = INTEGER(nd)[0]; In1 = INTEGER(n1)[0]; In2 = INTEGER(n2)[0]; Px1 = REAL(x1); Px2 = REAL(x2); Pc = REAL(c); Pwork = REAL(work); // const int tmp = 1; const int cn2 = In2; // allocate answer vector (corresponds to h in fields' multeb) ans = PROTECT(allocVector(REALSXP, In1)); cans = REAL(ans); // work aray must be dimensioned to size n2 // outer most loop over columns of x1 and x2 should reduce paging for(r1 = 0; r1 < In1; r1++) { // evaluate all basis functions at x1[r2,.] for(r2 = 0; r2 < In2; r2++) { // zero out sum accumulator sum=0.0; for(d = 0; d < Ind; d++) { sum += pow(fabs(Px1[In1*d+r1] - Px2[In2*d+r2]), 2.0); } Pwork[r2]=sum; } // evaluate squared distances with basis functions. expfnC(n2, work, par); // now the dot product you have all been waiting for! sum=0.0; for(d = 0; d < cn2; d++) { sum += Pwork[d]*Pc[d] ; } // cans[r1] = ddot_(&cn2, Pwork, &tmp, Pc, &tmp); cans[r1] = sum; } UNPROTECT(1); return(ans); } fields/src/RdistEarth.c0000644000176200001440000000500013754255070014527 0ustar liggesusers #include #include #include #include #include #include #define min(a,b) (a 1) { stop("Can only evaluate derivatives on one spline fit") } temp <- .Fortran("mltdrb", PACKAGE="fields", nd = as.integer(d), x1 = as.double(x1), n1 = as.integer(n1), x2 = as.double(x2), n2 = as.integer(n2), par = as.double(par), c = as.double(C), h = as.double(rep(0, n1 * d)), work = as.double(rep(0, n2)))$h return(rbf.constant * matrix(temp, nrow = n1, ncol = d)) } } stop("should not get here!") } fields/R/fastTps.R0000644000176200001440000000443414275252303013500 0ustar liggesusers# # fields is a package for analysis of spatial data written for # the R software environment. # Copyright (C) 2022 Colorado School of Mines # 1500 Illinois St., Golden, CO 80401 # Contact: Douglas Nychka, douglasnychka@gmail.edu, # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with the R software environment if not, write to the Free Software # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA # or see http://www.r-project.org/Licenses/GPL-2 ##END HEADER "fastTps" <- function(x, Y, m = NULL, p = NULL, aRange, lon.lat = FALSE, find.trA=FALSE, REML=FALSE, theta=NULL, ...) { # theta argument has been depreciated. if( !is.null( theta)){ aRange<- theta } x <- as.matrix(x) d <- ncol(x) if (is.null(p)) { if (is.null(m)) { m <- max(c(2, ceiling(d/2 + 0.1))) } p <- (2 * m - d) if (p <= 0) { warning(" m is too small to satisfy thin plate spline crierion \n you must have 2*m - dimension >0 \n smoothness of Wendland set at k =2") } } # special arguments to send to the wendland covariance/taper function. # see nearest.dist for some explanation of 'method' method <- ifelse(!lon.lat, "euclidean", "greatcircle") cov.args <- list( k = max(c(p,2)), Dist.args = list(method=method), aRange = aRange ) object<-spatialProcess(x, Y, cov.function = "wendland.cov", mKrig.args = list( m = m), cov.args = cov.args, REML=REML, ... ) object$call<- match.call() class(object) <- c( "fastTps", class(object)) return( object) } fields/R/addColorBarTriangle.R0000644000176200001440000000473114275252302015715 0ustar liggesusers# # fields is a package for analysis of spatial data written for # the R software environment. # Copyright (C) 2022 Colorado School of Mines # 1500 Illinois St., Golden, CO 80401 # Contact: Douglas Nychka, douglasnychka@gmail.edu, # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with the R software environment if not, write to the Free Software # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA # or see http://www.r-project.org/Licenses/GPL-2 ##END HEADER addColorBarTriangle <- function(lowerColor=NULL, upperColor=NULL, horizontal=TRUE) { usr<- par()$usr plt<- par()$plt par(xpd=TRUE) if(horizontal){ deltaY<- (usr[4] - usr[3]) unitX<- (usr[2] - usr[1])/(plt[2] - plt[1]) deltaX<- unitX*(plt[4] - plt[3]) } else{ deltaX<- (usr[2] - usr[1]) unitY<- (usr[4] - usr[3])/(plt[4] - plt[3]) deltaY<- unitY*(plt[2] - plt[1]) } # if( !is.null(upperColor) ){ if(horizontal){ triangleUpper<- rbind( c( usr[2], usr[3] ), c( usr[2]+ deltaX, usr[3] + deltaY/2 ), c( usr[2], usr[4]) ) } else{ triangleUpper<- rbind( c( usr[1], usr[4] ), c( usr[1] + deltaX/2, usr[4] + deltaY ), c( usr[2], usr[4]) ) } polygon( triangleUpper, col=upperColor, border=upperColor) lines(triangleUpper) } # if(!is.null(lowerColor)){ if(horizontal){ triangleLower<- rbind( c( usr[1], usr[3] ), c( usr[1]- deltaX, usr[3] + deltaY/2 ), c( usr[1], usr[4]) ) } else{ triangleLower<- rbind( c( usr[1], usr[3] ), c( usr[1]+ deltaX/2, usr[3] - deltaY ), c( usr[2], usr[3]) ) } polygon( triangleLower, col=lowerColor, border=lowerColor) lines(triangleLower) } # par(xpd=FALSE) } fields/R/plot.vgram.matrix.R0000644000176200001440000000300614275252303015442 0ustar liggesusers# # fields is a package for analysis of spatial data written for # the R software environment. # Copyright (C) 2022 Colorado School of Mines # 1500 Illinois St., Golden, CO 80401 # Contact: Douglas Nychka, douglasnychka@gmail.edu, # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with the R software environment if not, write to the Free Software # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA # or see http://www.r-project.org/Licenses/GPL-2 ##END HEADER "plot.vgram.matrix" <- function(x, ...) { ind <- x$ind ir <- range(ind[, 1]) jr <- range(ind[, 2]) # x and y grid values temp.list <- list(x = (ir[1]:ir[2]) * x$dx, y = (jr[1]:jr[2]) * x$dy) # fill in a matrix with variogram values ind2 <- cbind(ind[, 1] - min(ind[, 1]) + 1, ind[, 2] - min(ind[, 2]) + 1) temp <- matrix(NA, nrow = max(ind2[, 1]), ncol = max(ind2[, 2])) temp[ind2] <- x$vgram.full temp.list$z <- temp # plot it! image.plot(temp.list, ...) } fields/R/drape.plot.R0000644000176200001440000000530214275252303014117 0ustar liggesusers# # fields is a package for analysis of spatial data written for # the R software environment. # Copyright (C) 2022 Colorado School of Mines # 1500 Illinois St., Golden, CO 80401 # Contact: Douglas Nychka, douglasnychka@gmail.edu, # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with the R software environment if not, write to the Free Software # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA # or see http://www.r-project.org/Licenses/GPL-2 ##END HEADER "drape.plot" <- function(x, y, z, z2 = NULL, col = tim.colors(64), zlim = range(z, na.rm = TRUE), zlim2 = NULL, add.legend = TRUE, horizontal = TRUE, theta = 30, phi = 20, breaks = NA, ...) { # # Thanks to JiHO for making corrections and useful extensions to this function # # if x is a list, discard y and z and extract them from x if (is.list(x)) { z <- x$z y <- x$y x <- x$x } NC <- length(col) M <- nrow(z) N <- ncol(z) # if z2 is passed ( values for coloring facets ) use it # if not use the z matrix that is also used to draw the # perspective plot. if (!is.null(z2)) { M2 <- nrow(z2) N2 <- ncol(z2) if ((M != M2) | (N != N2)) { stop("draping matrix dimensions must match z") } } else { z2 <- z } # if zlim2 has not been passed, set reasonable limits. # if z2 is passed, set it to the range of z2 # if z2 is not passed, z2=z so we set it to the range of z (equal to zlim) if (is.null(zlim2)) { zlim2 <- range(c(z2), na.rm = TRUE) } # determine the colors for facets based on z2, the color scale and # the zlim2 z limits drape.info <- drape.color(z2, col = col, zlim = zlim2, breaks = breaks) # draw filled wireframe and save perspective information pm <- persp(x, y, z, theta = theta, phi = phi, col = drape.info$color.index, zlim = zlim, ...) # Note that zlim2 defines limits of color scale if (add.legend) { image.plot(zlim = zlim2, legend.only = TRUE, col = col, horizontal = horizontal, breaks = drape.info$breaks) } # return pm if an assignment is made (see help file) invisible(pm) } fields/R/Matern.R0000644000176200001440000000422014275252302013272 0ustar liggesusers# # fields is a package for analysis of spatial data written for # the R software environment. # Copyright (C) 2022 Colorado School of Mines # 1500 Illinois St., Golden, CO 80401 # Contact: Douglas Nychka, douglasnychka@gmail.edu, # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with the R software environment if not, write to the Free Software # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA # or see http://www.r-project.org/Licenses/GPL-2 ##END HEADER "Matern" <- function(d, range = 1, alpha = 1/range, smoothness = 0.5, nu = smoothness, phi = 1.0) { # # Matern covariance function transcribed from Stein's book page 31 # nu==smoothness, alpha == 1/range == aRange # # GeoR parameters map to kappa==smoothness and phi == range # check for negative distances # phi is accepted as the marginal variance of the process (see below) # within fields, however, this parameter is sigma^2 and we recommend # not using phi. if (any(d < 0)) stop("distance argument must be nonnegative") # rescale distances d <- d * alpha # call some special cases for half fractions of nu if( nu ==.5){ return( phi*exp( -d) ) } if( nu ==1.5){ return( phi*(1+d)*exp( -d) ) } if( nu ==2.5){ return( phi*(1+d+d^2/3)*exp( -d) ) } # otherwise ..... # call to Bessel function from R base package # # avoid sending exact zeroes to besselK d[d == 0] <- 1e-10 # # the hairy constant ... con <- (2^(nu - 1)) * gamma(nu) con <- 1/con return(phi * con * (d^nu) * besselK(d, nu)) } fields/R/confidenceIntervalMLE.R0000644000176200001440000000347714275252303016222 0ustar liggesusers# # fields is a package for analysis of spatial data written for # the R software environment. # Copyright (C) 2022 Colorado School of Mines # 1500 Illinois St., Golden, CO 80401 # Contact: Douglas Nychka, douglasnychka@gmail.edu, # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with the R software environment if not, write to the Free Software # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA # or see http://www.r-project.org/Licenses/GPL-2 ##END HEADER confidenceIntervalMLE<- function( obj, CILevel, verbose=FALSE){ if( is.na( CILevel)){ cat("CI not found") return(NULL) } MLEInfo<- obj$MLEInfo transformedMLEPars<- MLEInfo$optimResults$par sampleFisherInfo<- solve(-1*MLEInfo$optimResults$hessian) if( verbose){ print( sampleFisherInfo) } testD<- diag(sampleFisherInfo) if( any( testD<=0)){ SE<- rep( NA, length( testD) ) } else{ SE<- sqrt( diag(sampleFisherInfo )) } CITmp1<- transformedMLEPars - qnorm(CILevel)*SE CITmp2<- transformedMLEPars + qnorm(CILevel)*SE tableCI<- cbind( MLEInfo$parTransform( CITmp1, inv=TRUE), MLEInfo$parTransform( CITmp2, inv=TRUE) ) percentCI<- paste0(100* CILevel,"%") colnames(tableCI ) <- c( paste0("lower",percentCI), paste0("upper",percentCI) ) return( tableCI) }fields/R/sim.rf.R0000644000176200001440000000245714275252303013255 0ustar liggesusers# # fields is a package for analysis of spatial data written for # the R software environment. # Copyright (C) 2022 Colorado School of Mines # 1500 Illinois St., Golden, CO 80401 # Contact: Douglas Nychka, douglasnychka@gmail.edu, # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with the R software environment if not, write to the Free Software # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA # or see http://www.r-project.org/Licenses/GPL-2 ##END HEADER "sim.rf" <- function(obj) { n <- obj$n m <- obj$m M <- obj$M N <- obj$N if (any(Re(obj$wght) < 0)) { stop("FFT of covariance has negative\nvalues") } z <- fft(matrix(rnorm(N * M), ncol = N, nrow = M)) Re(fft(sqrt(obj$wght) * z, inverse = TRUE))[1:m, 1:n]/sqrt(M * N) } fields/R/summary.mKrig.R0000644000176200001440000000757114275252303014626 0ustar liggesusers# # fields is a package for analysis of spatial data written for # the R software environment. # Copyright (C) 2022 Colorado School of Mines # 1500 Illinois St., Golden, CO 80401 # Contact: Douglas Nychka, douglasnychka@gmail.edu, # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with the R software environment if not, write to the Free Software # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA # or see http://www.r-project.org/Licenses/GPL-2 ##END HEADER summary.mKrig <- function(object, ...) { outObject<- list() digits<- 4 summaryObject<- object$summary if (is.matrix(object$residuals)) { n <- nrow(object$residuals) nData <- ncol(object$residuals) } else { n <- length(object$residuals) nData <- 1 } outObject$nData<-nData c1 <- "Number of Locations:" c2 <- n if (nData > 1) { c1 <- c(c1, "Number of data sets fit:") c2 <- c(c2, nData) } c1 <- c(c1, "Degree of polynomial null space ( base model):") if(object$m !=0 ){ c2 <- c(c2, object$m - 1) } else{ c2 <- c(c2, NA) } c1 <- c(c1, "Total number of parameters in base model") c2 <- c(c2, object$nt) if (object$nZ > 0) { c1 <- c(c1, "Number of additional covariates (Z)") c2 <- c(c2, object$nZ) } if (!is.na(object$eff.df)) { c1 <- c(c1, " Estimate Eff. degrees of freedom") c2 <- c(c2, signif(object$eff.df, digits)) if (length(object$trA.info) < object$np) { c1 <- c(c1, " Standard Error of Eff. Df ") c2 <- c(c2, signif(sd(object$trA.info)/sqrt(length(object$trA.info)), digits)) } } c1 <- c(c1, "Smoothing parameter") c2 <- c(c2, signif(summaryObject["lambda"], digits)) if (nData == 1) { c1 <- c(c1, "tau (nugget sd)") c2 <- c(c2, signif(summaryObject["tau"], digits)) c1 <- c(c1, "sigma (process sd)") c2 <- c(c2, signif(sqrt( summaryObject["sigma2"]), digits)) } c1 <- c(c1, "Nonzero entries in covariance") c2 <- c(c2, object$nonzero.entries) sum <- cbind(c1, c2) dimnames(sum) <- list(rep("", dim(sum)[1]), rep("", dim(sum)[2])) ########### save table of information and the call outObject$summaryTable<- sum outObject$call<- object$call outObject$collapseFixedEffect<- object$collapseFixedEffect ########### information for SE for fixed effects if( outObject$collapseFixedEffect | (nData==1)){ outObject$fixedEffectsCov<- object$fixedEffectsCov SE<- sqrt(diag(outObject$fixedEffectsCov)) beta<- object$beta[,1] print( beta) pValue<- pnorm(abs(beta/SE), lower.tail = FALSE)*2 if( !is.null(beta)){ outObject$fixedEffectsTable<- cbind( signif(beta, digits), signif(SE, digits), signif(pValue, digits) ) } else{ outObject$fixedEffectsTable<- NA } if( is.null( object$fixedEffectNames )){ outObject$fixedEffectNames<- paste0("d",1:(object$nt) ) } else{ outObject$fixedEffectNames<- object$fixedEffectNames } if(!is.null(beta)){ dimnames( outObject$fixedEffectsTable) <- list( outObject$fixedEffectNames, c("estimate", "SE", "pValue") ) } ########### save covariance information } outObject$cov.function<- object$cov.function outObject$args<- object$args class( outObject)<-"mKrigSummary" return( outObject) } fields/R/printGCVWarnings.R0000644000176200001440000000444314275252303015261 0ustar liggesusers# # fields is a package for analysis of spatial data written for # the R software environment. # Copyright (C) 2022 Colorado School of Mines # 1500 Illinois St., Golden, CO 80401 # Contact: Douglas Nychka, douglasnychka@gmail.edu, # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with the R software environment if not, write to the Free Software # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA # or see http://www.r-project.org/Licenses/GPL-2 ##END HEADER printGCVWarnings<- function( Table, method="all"){ ind<- Table$Warning if( method=="user"){ #print nothing, expect that the user knows what he/she is doing! return() } if( method == "all"){ kIndex<- 1:6 } else{ kIndex<- match( method,c("GCV", "GCV.model", "GCV.one", "RMSE", "pure error", "REML") ) } methodList<- c( "(GCV) Generalized Cross-Validation ", "(GCV.model) Generalized Cross-Validation on replicate means ", "(GCV.one) Generalized Cross-Validation on individual observations ", "(RMSE) Matching estimate of tau to supplied rmse ", "Matching estimate of tau to that from replicated observations", "(REML) Restricted maximum likelihood ", "user supplied lambda" ) if( any( ind[kIndex])){ cat("Warning: ", fill=TRUE) cat("Grid searches over lambda (nugget and sill variances) with minima at the endpoints: ", fill=TRUE) } for( k in kIndex){ if( ind[k]){ whichEnd<- ifelse(Table[k,2],"left","right") cat( " ", methodList[k], fill =TRUE) cat( " minimum at ", whichEnd, "endpoint", " lambda = ", Table[k,6] , "(eff. df=", Table[k,7] , ")", fill = TRUE ) } } } fields/R/vgram.family.R0000644000176200001440000002463014342502267014452 0ustar liggesusers# # fields is a package for analysis of spatial data written for # the R software environment. # Copyright (C) 2022 Colorado School of Mines # 1500 Illinois St., Golden, CO 80401 # Contact: Douglas Nychka, douglasnychka@gmail.edu, # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with the R software environment if not, write to the Free Software # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA # or see http://www.r-project.org/Licenses/GPL-2 ##END HEADER "vgram" <- function(loc, y, id = NULL, d = NULL, lon.lat = FALSE, dmax = NULL, N = NULL, breaks = NULL, prettyBins=FALSE, type=c("variogram", "covariogram", "correlogram")) { type=match.arg(type) # # if prettyBins is FALSE then generate exactly N breaks and so N-1 bins. # otherwise number of breaks is at the mercy of the pretty function # and may be N-1 or something else! # # coerce to matrix y <- cbind(y) # if nearest neighbor indices are missing create all possible pairs. if (is.null(id)) { n <- nrow(loc) is = rep(1:n, n) js = rep(1:n, rep(n, n)) ind <- is > js id <- cbind(is, js)[ind, ] } # if distances are missing calculate these if (is.null(d)) { loc <- as.matrix(loc) if (lon.lat) { d <- rdist.earth.vec(loc[id[,1],], loc[id[,2],]) #we want result in miles, not meters } else { d <- rdist.vec(loc[id[,1],], loc[id[,2],]) } } # normalize columns to create correlogram, if necessary # if(type == "correlogram") { tau = apply(y, 2, sd, na.rm=TRUE) y = sweep(y, 2, (1/tau), FUN="*") } # center the columns by their mean and get row means if y is a matrix # colMeans <- apply(y, 2, mean, na.rm=TRUE) yCntr = sweep(y, 2, colMeans) y1Cntr = yCntr[id[,1],] y2Cntr = yCntr[id[,2],] if(type == "variogram") { vg <- 0.5 * rowMeans(cbind((y1Cntr - y2Cntr)^2), na.rm = TRUE) } else { vg <- rowMeans(cbind(y1Cntr * y2Cntr), na.rm = TRUE) } # #information for returned object # call <- match.call() if (is.null(dmax)) { dmax <- max(d) } od <- order(d) d <- d[od] vg <- vg[od] ind <- d <= dmax & !is.na(vg) ## add a binned variogram if breaks are supplied out <- list(d = d[ind], vgram = vg[ind], call = call, type=type) if (!is.null(breaks) | !is.null(N)) { out <- c(out, stats.bin(d[ind], vg[ind], N = N, breaks = breaks, prettyBins=prettyBins)) } class(out) = c("vgram", class(out)) out } #calculating cross-covariogram and cross-correlogram (cross-covariance and #cross-correlation) crossCoVGram = function(loc1, loc2, y1, y2, id = NULL, d = NULL, lon.lat = FALSE, dmax = NULL, N = NULL, breaks = NULL, type=c("cross-covariogram", "cross-correlogram"), prettyBins=FALSE) { type=match.arg(type) # coerce to matrix y1 <- cbind(y1) y2 <- cbind(y2) # if nearest neighbor indices are missing create all possible pairs. if (is.null(id)) { n1 <- nrow(loc1) n2 <- nrow(loc2) id <- cbind(rep(1:n1, n2), rep(1:n2, rep(n1, n2))) } # if distances are missing calculate these if (is.null(d)) { loc1 <- as.matrix(loc1) loc2 <- as.matrix(loc2) if (lon.lat) { d <- rdist.earth.vec(loc1[id[,1],], loc2[id[,2],]) #we want result in miles, not meters } else { d <- rdist.vec(loc1[id[,1],], loc2[id[,2],]) } } # # calculating covariogram will center the columns by their mean and get row means if y is a matrix # colMeans1 <- apply(y1, 2, mean, na.rm=TRUE) colMeans2 <- apply(y2, 2, mean, na.rm=TRUE) y1Cntr = sweep(data.matrix(y1), 2, colMeans1) # subtract the column means y2Cntr = sweep(data.matrix(y2), 2, colMeans2) # subtract the column means # # normalize to create cross-correlogram, if necessary # if(type == "cross-correlogram") { tau1 = apply(y1Cntr, 2, sd, na.rm=TRUE) tau2 = apply(y2Cntr, 2, sd, na.rm=TRUE) y1Cntr = sweep(y1Cntr, 2, 1/tau1, FUN="*") y2Cntr = sweep(y2Cntr, 2, 1/tau2, FUN="*") } # # calculate covariance for the given points # y1Cntr = y1Cntr[id[,1],] y2Cntr = y2Cntr[id[,2],] vg <- rowMeans(cbind(y1Cntr*y2Cntr), na.rm = TRUE) # #information for returned object # call <- match.call() if (is.null(dmax)) { dmax <- max(d) } od <- order(d) d <- d[od] vg <- vg[od] ind <- d <= dmax & !is.na(vg) ## add a binned variogram if breaks are supplied out <- list(d = d[ind], vgram = vg[ind], call = call, type=type) if (!is.null(breaks) | !is.null(N)) { out <- c(out, stats.bin(d[ind], vg[ind], N = N, breaks = breaks, prettyBins=prettyBins)) } class(out) = c("vgram", class(out)) out } #plot only the line of the empirical variogram, where the y coordinates of the line are #at the means of the bins plot.vgram = function(x, N=10, breaks = pretty(x$d, N, eps.correct = 1), add=FALSE, ...) { otherArgs = list(...) type=x$type #set y axis label if not set by user if(is.null(otherArgs$ylab)) { if(type=="variogram") otherArgs$ylab = "Variance" else if(type == "covariogram" || type=="cross-covariogram") otherArgs$ylab = "Covariance" else if(type == "correlogram" || type=="cross-correlogram") otherArgs$ylab = "Correlation" else stop("vgram 'type' argument must be either 'variogram', 'covariogram', 'correlogram', 'cross-covariogram', or 'cross-correlogram'") } #set x axis label if not set by user if(is.null(otherArgs$xlab)) otherArgs$xlab = "Distance" #set plot title if not set by user if(is.null(otherArgs$main)) { if(type=="variogram") otherArgs$main = "Empirical Variogram" else if(type=="covariogram") otherArgs$main = "Empirical Covariogram" else if(type=="correlogram") otherArgs$main = "Empirical Correlogram" else if(type=="cross-covariogram") otherArgs$main = "Empirical Cross-Covariogram" else if(type=="cross-correlogram") otherArgs$main = "Empirical Cross-Correlogram" else stop("vgram 'type' argument must be either 'variogram', 'covariogram', 'correlogram', 'cross-covariogram', or 'cross-correlogram'") } #set ylim for correlogram if not set by user if(is.null(otherArgs$ylim)) { if(type == "correlogram" || type=="cross-correlogram") otherArgs$ylim = c(-1, 1) } #set line type if not set by user if(is.null(otherArgs$type)) otherArgs$type = "o" #get bin data dat = getVGMean(x, breaks=breaks) #get bin centers versus bin means centers = dat$centers ys = dat$ys #remove NAs notNas = !is.na(ys) centers = centers[notNas] ys = ys[notNas] #plot if(!add) do.call("plot", c(list(centers, ys), otherArgs)) else do.call("lines", c(list(centers, ys), otherArgs)) } "boxplotVGram" = function(x, N=10, breaks = pretty(x$d, N, eps.correct = 1), plot=TRUE, plot.args=NULL, ...) { dists = x$d type=x$type if(type == "variogram") y = sqrt(x$vgram) else y = x$vgram otherArgs = list(...) #set y axis label if not set by user if(is.null(otherArgs$ylab)) { if(type=="variogram") otherArgs$ylab = "sqrt(Variance)" else if(type == "covariogram" || type=="cross-covariogram") otherArgs$ylab = "Covariance" else if(type == "correlogram" || type=="cross-correlogram") otherArgs$ylab = "Correlation" else stop("vgram 'type' argument must be either 'variogram', 'covariogram', 'correlogram', 'cross-covariogram', or 'cross-correlogram'") } #set x axis label if not set by user if(is.null(otherArgs$xlab)) otherArgs$xlab = "Distance" #set plot title if not set by user if(is.null(otherArgs$main)) { if(type=="variogram") otherArgs$main = "Empirical Variogram (square root scale) " else if(type=="covariogram") otherArgs$main = "Empirical Covariogram" else if(type=="correlogram") otherArgs$main = "Empirical Correlogram" else if(type=="cross-covariogram") otherArgs$main = "Empirical Cross-Covariogram" else if(type=="cross-correlogram") otherArgs$main = "Empirical Cross-Correlogram" else stop("vgram 'type' argument must be either 'variogram', 'covariogram', 'correlogram', 'cross-covariogram', or 'cross-correlogram'") } #set ylim for correlogram if not set by user if(is.null(otherArgs$ylim)) { if(type == "correlogram" || type=="cross-correlogram") otherArgs$ylim = c(-1, 1) } #make boxplot bplot = do.call("bplot.xy", c(list(x=dists, y=y, N=N, breaks=breaks, plot=plot), otherArgs)) #return bplot.xy statistics if plot==FALSE if(!plot) return(bplot) # #plot bin means with plot parameters given in plot.args (with defaults to look pretty) # plot.args$x=x # plot.args$add=TRUE # plot.args$breaks=breaks # if(is.null(plot.args$col)) # plot.args$col = "red" # if(is.null(plot.args$type)) # plot.args$type = "p" # do.call("plot.vgram", plot.args) } # Returns the variogram bin centers and means getVGMean = function(x, N = 10, breaks = pretty(x$d, N, eps.correct = 1)) { # Can calculate mean or other statistical functions of the values in the bins VGstat = function(VG, minD=-Inf, maxD=Inf, statFun="mean", ...) { ind = (VG$d > minD) & (VG$d < maxD) do.call(statFun, c(list(VG$vgram[ind]), list(...))) } #helper function to get mean from any single bin meansFromBreak = function(breakBounds = c(-Inf, Inf)) { VGstat(x, minD=breakBounds[1], maxD=breakBounds[2], na.rm=TRUE) } #apply helper function to all bins lowBreaks = breaks highBreaks = c(breaks[2:length(breaks)], Inf) breakBounds = cbind(lowBreaks, highBreaks) centers = apply(breakBounds, 1, mean, na.rm=TRUE) ys = apply(breakBounds, 1, meansFromBreak) #take square root if variogram # if(x$type == "variogram") # ys=sqrt(ys) return(list(centers=centers, ys=ys, type=x$type)) } fields/R/Tps.R0000644000176200001440000000443314275252302012620 0ustar liggesusers# # fields is a package for analysis of spatial data written for # the R software environment. # Copyright (C) 2022 Colorado School of Mines # 1500 Illinois St., Golden, CO 80401 # Contact: Douglas Nychka, douglasnychka@gmail.edu, # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with the R software environment if not, write to the Free Software # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA # or see http://www.r-project.org/Licenses/GPL-2 ##END HEADER "Tps" <- function(x, Y, m = NULL, p = NULL, scale.type = "range", lon.lat = FALSE, miles = TRUE, method="GCV", GCV=TRUE, ...) { x <- as.matrix(x) d <- ncol(x) if (is.null(p)) { if (is.null(m)) { m <- max(c(2, ceiling(d/2 + 0.1))) } p <- (2 * m - d) if (p <= 0) { stop(" m is too small you must have 2*m - dimension >0") } } # Tpscall <- match.call() if (!lon.lat) { # Tpscall$cov.function <- "Thin plate spline radial basis functions (Rad.cov) " obj<- Krig(x, Y, cov.function = Rad.cov, m = m, scale.type = scale.type, p = p, method=method, GCV = GCV, ...) } else { # a different coding of the radial basis functions to use great circle distance. # Tpscall$cov.function <- "Thin plate spline radial basis functions (RadialBasis.cov) using great circle distance " obj<- Krig(x, Y, cov.function = stationary.cov, m = m, scale.type = scale.type, method=method, GCV = GCV, cov.args = list(Covariance = "RadialBasis", M = m, dimension = 2, Distance = "rdist.earth", Dist.args = list(miles = miles)), ...) } obj$call<- match.call() class( obj) <- c("Krig", "Tps") return(obj) } fields/R/colorBar.R0000644000176200001440000001125114460743237013621 0ustar liggesusers# # fields is a package for analysis of spatial data written for # the R software environment. # Copyright (C) 2022 Colorado School of Mines # 1500 Illinois St., Golden, CO 80401 # Contact: Douglas Nychka, douglasnychka@gmail.edu, # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with the R software environment if not, write to the Free Software # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA # or see http://www.r-project.org/Licenses/GPL-2 ##END HEADER colorBar<- function(breaks, smallplot, colorTable, horizontal = FALSE, lab.breaks, axis.args, legend.lab, legend.line = 2, legend.args, legend.cex = 1, lowerTriangle = FALSE, upperTriangle = NULL ){ # Following code draws the legend using the image function # and a one column image. # What might be confusing is the values of the "image" are the same # as the locations on the legend axis. # Moreover the image values are in the middle of each breakpoint category # thanks to Tobias Nanu Frechen and Matthew Flickinger # for sorting out some problems with the breaks position in the legend. ix <- 1:2 # if triangles for end points upper or lower limits in breaks should # be omitted and the colorTable also amended. lowerColor<- NULL upperColor<- NULL if( lowerTriangle){ breaks<- breaks[-1] lowerColor<- colorTable[1] colorTable<- colorTable[-1] } if( upperTriangle){ n1<- length(breaks) breaks<- breaks[-n1] n2<- length(colorTable) upperColor<- colorTable[n2] colorTable<- colorTable[-n2] } iy<- breaks N<- length(colorTable) nBreaks<- length( breaks) midpoints<- (breaks[1:(nBreaks-1)] + breaks[2:nBreaks] )/2 iz <- matrix(midpoints, nrow = 1, ncol = length(midpoints)) # # next par call sets up a new plotting region just for the legend strip # at the smallplot coordinates par(new = TRUE, pty = "m", plt = smallplot, err = -1) # draw color scales the two cases are horizontal/vertical # add a label if this is passed. if (!horizontal) { image(ix, iy, iz, xaxt = "n", yaxt = "n", xlab = "", ylab = "", col = colorTable, breaks=breaks) } else { image(iy, ix, t(iz), xaxt = "n", yaxt = "n", xlab = "", ylab = "", col = colorTable, breaks=breaks) } # add triangles at ends addTriangle<- !( is.null(lowerColor)& is.null(upperColor)) if(addTriangle){ addColorBarTriangle( lowerColor=lowerColor, upperColor=upperColor, horizontal=horizontal ) } # create the argument list to draw the axis # this avoids 4 separate calls to axis and allows passing extra # arguments. if (!is.null(lab.breaks)) { # axis with labels at break points axis.args <- c(list(side = ifelse(horizontal, 1, 4), mgp = c(3, 1, 0), las = ifelse(horizontal, 0, 2), at = breaks, labels = lab.breaks), axis.args) } else { # If lab.breaks is not specified ( with or without breaks), pretty # tick mark locations and labels are computed internally, # or as specified in axis.args at the function call axis.args <- c(list(side = ifelse(horizontal, 1, 4), mgp = c(3, 1, 0), las = ifelse(horizontal, 0, 2)), axis.args) } # # now add the axis to the legend strip. # notice how all the information is in the list axis.args do.call("axis", axis.args) # # add a label to the axis if information has been supplied # using the mtext function. The arguments to mtext are # passed as a list like the drill for axis (see above) # if (!is.null(legend.lab)) { legend.args <- list(text = legend.lab, side = ifelse(horizontal, 1, 4), line = legend.line, # this may need to be tuned cex = legend.cex) } # add the label using mtext function if (!is.null(legend.args)) { do.call(mtext, legend.args) } # } fields/R/QTps.R0000644000176200001440000000724014275252302012740 0ustar liggesusers# # fields is a package for analysis of spatial data written for # the R software environment. # Copyright (C) 2022 Colorado School of Mines # 1500 Illinois St., Golden, CO 80401 # Contact: Douglas Nychka, douglasnychka@gmail.edu, # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with the R software environment if not, write to the Free Software # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA # or see http://www.r-project.org/Licenses/GPL-2 ##END HEADER QTps <- function(x, Y, ..., f.start = NULL, psi.scale = NULL, C = 1, alpha = 0.5, Niterations = 100, tolerance = 0.001, verbose = FALSE) { # # good <- !is.na(Y) x <- as.matrix(x) x <- x[good, ] Y <- Y[good] if (any(!good)) { warning(paste(sum(!good), "missing value(s) removed from data")) } if (is.null(f.start)) { f.start <- rep(median(Y), length(Y)) } scale.Y <- mad(Y - f.start, na.rm = TRUE) # if (is.null(psi.scale)) { psi.scale = scale.Y * 0.05 } # f.hat <- f.start # create Tps object to reuse for iterative fitting Tps.obj <- Tps(x, Y, ...) lambda.method <- Tps.obj$method conv.flag <- FALSE conv.info <- rep(NA, Niterations) for (k in 1:Niterations) { Y.psuedo <- f.hat + C * psi.scale * qsreg.psi((Y - f.hat)/psi.scale, C = C, alpha = alpha) # find predicted for a fixed lambda or estimate a new value f.hat.new <- predict(Tps.obj, y = Y.psuedo) # convergence test test.rmse <- mean(abs(f.hat.new - f.hat))/mean(abs(f.hat)) conv.info[k] <- test.rmse if (verbose) { cat(k, test.rmse, fill = TRUE) } if (test.rmse <= tolerance) { conv.flag <- TRUE Number.iterations <- k break } f.hat <- f.hat.new } # One final complete fit at convergence. if (verbose) { if (conv.flag) { cat("Converged at tolerance", tolerance, "in", Number.iterations, "iterations", fill = TRUE) } else { cat("Exceeded maximum number of iterations", Niterations, fill = TRUE) } } # One final complete fit at convergence. f.hat <- f.hat.new Y.psuedo <- f.hat + C * psi.scale * qsreg.psi((Y - f.hat)/psi.scale, C = C, alpha = alpha) obj <- Tps(x, Y.psuedo, ...) # CV residuals based on psuedo-data) # Use the linear approximation Y_k - f.cv_k = (Y_k- f_k)/( 1- A_kk) # f.cv_k = f_k/( 1- A_kk) - ( A_kk)Y_k/( 1- A_kk) # # Note: we find f.cv based on psuedo data but then consider its deviation # from the actual data # diag.A <- diag(Krig.Amatrix(obj)) f.cv <- obj$fitted.values/(1 - diag.A) - diag.A * Y.psuedo/(1 - diag.A) # leave-one-out estimate of f.hat CV.psuedo <- mean(qsreg.sigma(Y - f.cv, alpha = alpha, C = psi.scale)) # add extra stuff to the Krig object. Qinfo <- list(yraw = Y, conv.info = conv.info, conv.flag = conv.flag, CV.psuedo = CV.psuedo, psi.scale = psi.scale, alpha = alpha) obj <- c(obj, list(Qinfo = Qinfo)) class(obj) <- "Krig" return(obj) } fields/R/print.spatialProcess.R0000644000176200001440000000222214275252303016174 0ustar liggesusers# # fields is a package for analysis of spatial data written for # the R software environment. # Copyright (C) 2022 Colorado School of Mines # 1500 Illinois St., Golden, CO 80401 # Contact: Douglas Nychka, douglasnychka@gmail.edu, # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with the R software environment if not, write to the Free Software # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA # or see http://www.r-project.org/Licenses/GPL-2 ##END HEADER print.spatialProcess <- function(x, digits = 4, ...) { object<- summary.spatialProcess( x, ...) print.spatialProcessSummary(object,digits = digits, ...) } fields/R/imagePlot.R0000644000176200001440000001210514460743354013776 0ustar liggesusers# # fields is a package for analysis of spatial data written for # the R software environment. # Copyright (C) 2022 Colorado School of Mines # 1500 Illinois St., Golden, CO 80401 # Contact: Douglas Nychka, douglasnychka@gmail.edu, # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with the R software environment if not, write to the Free Software # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA # or see http://www.r-project.org/Licenses/GPL-2 ##END HEADER # Thanks to S. Koehler and S. Woodhead # for comments on making this a better function # Thanks to Rodrigo Lustosa for adding the asp option. "imagePlot" <- function(..., add = FALSE, breaks= NULL, nlevel = 64, col = NULL, horizontal = FALSE, legend.shrink = 0.9, legend.width = 1.2, legend.mar = ifelse(horizontal, 3.1, 5.1), legend.lab = NULL, legend.line= 2, graphics.reset = FALSE, bigplot = NULL, smallplot = NULL, legend.only = FALSE, lab.breaks = NULL, axis.args = NULL, legend.args = NULL, legend.cex=1.0, midpoint = FALSE, border = NA, lwd = 1, lowerTriangle= FALSE, upperTriangle=FALSE, asp = NA, verbose=FALSE) { # save current graphics settings old.par <- par(no.readonly = TRUE) # set defaults for color scale # note this works differently than the image function. if( is.null(col)) { col<- tim.colors(nlevel)} else{ nlevel<- length( col) } # figure out zlim from passed arguments # also set the breaks for colors if they have not been passed, info <- imagePlotInfo(..., breaks=breaks, nlevel=nlevel) # breaks have been computed if not passed in the call breaks<- info$breaks if( verbose){ print(info) } if (add) { big.plot <- old.par$plt } if (legend.only) { graphics.reset <- TRUE } if (is.null(legend.mar)) { legend.mar <- ifelse(horizontal, 3.1, 5.1) } # figure out how to divide up the plotting real estate temp <- imageplot.setup( add = add, legend.shrink = legend.shrink, legend.width = legend.width, legend.mar = legend.mar, horizontal = horizontal, bigplot = bigplot, smallplot = smallplot) # bigplot has plotting region coordinates for image # smallplot has plotting coordinates for legend strip smallplot <- temp$smallplot bigplot <- temp$bigplot # draw the image in bigplot, just call the R base function # or poly.image for polygonal cells # note the logical switch # for poly.grid is parsed out of call from image.plot.info if (!legend.only) { if (!add) { par(plt = bigplot) } if (!info$poly.grid) { image(..., breaks=breaks, add = add, col = col, asp = asp) } else { poly.image(..., add = add,breaks=breaks, col = col, midpoint = midpoint, border = border, lwd.poly = lwd, asp = asp) } big.par <- par(no.readonly = TRUE) } ## ## check dimensions of smallplot if ((smallplot[2] < smallplot[1]) | (smallplot[4] < smallplot[3])) { par(old.par) stop("plot region too small to add legend\n") } # Following code draws the legend using the image function # and a one column image. colorBar( breaks = breaks, smallplot = smallplot, colorTable = col, horizontal = horizontal, lab.breaks = lab.breaks, axis.args = axis.args, legend.lab = legend.lab, legend.line = legend.line, legend.args = legend.args, legend.cex = legend.cex, lowerTriangle = lowerTriangle, upperTriangle = upperTriangle ) # clean up graphics device settings # reset to larger plot region with right user coordinates. mfg.save <- par()$mfg if (graphics.reset | add) { par(old.par) par(mfg = mfg.save, new = FALSE) invisible() } else { par(big.par) par(plt = big.par$plt, xpd = FALSE) par(mfg = mfg.save, new = FALSE) # A suggestion from Karline Soetaert # this is to reset margins to be based on the mar arguments # par(mar = par("mar")) or # par(mar = big.par$mar) # unfortunately this causes problems by allowing plotting outside of the # original plot region. invisible() } } fields/R/image.smooth.R0000644000176200001440000000727714275252303014456 0ustar liggesusers# # fields is a package for analysis of spatial data written for # the R software environment. # Copyright (C) 2022 Colorado School of Mines # 1500 Illinois St., Golden, CO 80401 # Contact: Douglas Nychka, douglasnychka@gmail.edu, # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with the R software environment if not, write to the Free Software # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA # or see http://www.r-project.org/Licenses/GPL-2 ##END HEADER "image.smooth" <- function(x, wght = NULL, dx = 1, dy = 1, kernel.function = double.exp, aRange = 1, grid = NULL, tol = 1e-08, xwidth = NULL, ywidth = NULL, weights = NULL, theta=NULL, ...) { # theta argument has been depreciated. if( !is.null( theta)){ aRange<- theta } # first part of this function is figuring what has been passed and # what to do if (is.list(x)) { # assume that an image list format has been passed as x Y <- x$z grid <- list(x = x$x, y = x$y) } else { Y <- x } if (!is.matrix(Y)) { stop("Requires a matrix") } m <- nrow(Y) n <- ncol(Y) # use information in previous setup kernel function from a # a call to setup.image.smooth and in the process override any # passed arguments if (!is.null(wght)) { dx <- wght$dx dy <- wght$dy xwidth <- wght$xwidth ywidth <- wght$ywidth } # set up grid if it is missing if (is.null(grid)) { grid <- list(x = (1:m) * dx, y = (1:n) * dy) } else { dx <- grid$x[2] - grid$x[1] dy <- grid$y[2] - grid$y[1] } # padding of zeroes around actual image # if less than m and n there may be spurious effects due to # the periodicity from the fft. # make sure that the span of the kernel is less than xwidth and ywidth. # there will be substantial speedup if the kernel has a small support, # Y is big (e.g. 512X512) and Mwidth and N widht are adjusted to suit. if (is.null(xwidth)) { xwidth <- dx * m } if (is.null(ywidth)) { ywidth <- dy * n } # kernel wght function as fft # reusing this saves an fft for each image smooth. if (is.null(wght)) { wght <- setup.image.smooth(nrow = m, ncol = n, xwidth = xwidth, ywidth = ywidth, dx = dx, dy = dy, kernel.function = kernel.function, aRange = aRange,...) } M <- nrow(wght$W) N <- ncol(wght$W) temp <- matrix(0, nrow = M, ncol = N) temp2 <- matrix(0, nrow = M, ncol = N) # pad with zeroes if (!is.null(weights)) { temp[1:m, 1:n] <- Y * weights temp[is.na(temp)] <- 0 temp2[1:m, 1:n] <- ifelse(!is.na(Y), weights, 0) } else { temp[1:m, 1:n] <- Y temp[is.na(temp)] <- 0 temp2[1:m, 1:n] <- ifelse(!is.na(Y), 1, 0) } # temp and temp2 are numerator and denominator of Nadarya-Watson estimator. temp <- Re(fft(fft(temp) * wght$W, inverse = TRUE))[1:m, 1:n] temp2 <- Re(fft(fft(temp2) * wght$W, inverse = TRUE))[1:m, 1:n] # try not to divide by zero! temp <- ifelse((temp2 > tol), (temp/temp2), NA) list(x = grid$x, y = grid$y, z = temp) } fields/R/dyadic.2check.R0000644000176200001440000000270014275252303014441 0ustar liggesusers# # fields is a package for analysis of spatial data written for # the R software environment. # Copyright (C) 2022 Colorado School of Mines # 1500 Illinois St., Golden, CO 80401 # Contact: Douglas Nychka, douglasnychka@gmail.edu, # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with the R software environment if not, write to the Free Software # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA # or see http://www.r-project.org/Licenses/GPL-2 ##END HEADER dyadic.2check <- function(m, n, cut.p = 2) { # checks that n is of the form # n=p*2^m where p <= cut.p m2 <- as.integer(m) n2 <- as.integer(n) while ((n2 > cut.p) & (m2 > cut.p)) { if ((m2%%2 != 0) | (n2%%2 != 0)) { cat(n, "and", m, "must equal p*2^L where p is less than or equal to ", cut.p, fill = TRUE) return(FALSE) } m2 <- m2/2 n2 <- n2/2 } return(TRUE) } fields/R/double.exp.R0000644000176200001440000000211714275252303014115 0ustar liggesusers# # fields is a package for analysis of spatial data written for # the R software environment. # Copyright (C) 2022 Colorado School of Mines # 1500 Illinois St., Golden, CO 80401 # Contact: Douglas Nychka, douglasnychka@gmail.edu, # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with the R software environment if not, write to the Free Software # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA # or see http://www.r-project.org/Licenses/GPL-2 ##END HEADER double.exp <- function(x) { # double exponential weight function 0.5 * exp(-abs(x)) } fields/R/profileCI.R0000644000176200001440000000272614275252303013732 0ustar liggesusers# # fields is a package for analysis of spatial data written for # the R software environment. # Copyright (C) 2022 Colorado School of Mines # 1500 Illinois St., Golden, CO 80401 # Contact: Douglas Nychka, douglasnychka@gmail.edu, # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with the R software environment if not, write to the Free Software # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA # or see http://www.r-project.org/Licenses/GPL-2 ##END HEADER profileCI<- function( obj, parName, CIlevel=.95, REML=FALSE){ y<- obj$summary[,ifelse(REML,"lnProfileREML.FULL", "lnProfileLike.FULL")] x<- obj$summary[,parName] logX<- log10( x) lGrid<- (seq( min(logX), max(logX),length.out=400)) yGrid<- splint( logX, y, lGrid) yMax<- max(yGrid) ChiLevel<- qchisq(.95,1) ind<- yMax - yGrid <= ChiLevel CI<- range( lGrid[ind] ) CI <- 10**CI return( CI) }fields/R/fields.convert.grid.R0000644000176200001440000000264514275252303015727 0ustar liggesusers# # fields is a package for analysis of spatial data written for # the R software environment. # Copyright (C) 2022 Colorado School of Mines # 1500 Illinois St., Golden, CO 80401 # Contact: Douglas Nychka, douglasnychka@gmail.edu, # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with the R software environment if not, write to the Free Software # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA # or see http://www.r-project.org/Licenses/GPL-2 ##END HEADER "fields.convert.grid" <- function(midpoint.grid) { # converts from midpoints of a grid to boundaries # x are midpoints of grid # this will handle unequally spaced points x <- sort(midpoint.grid) n <- length(x) # interior boundaries xi <- (x[2:n] + x[1:(n - 1)])/2 # first and last. x1 <- x[1] - (x[2] - x[1])/2 xnp1 <- x[n] + (x[n] - x[(n - 1)])/2 #here you have it ... c(x1, xi, xnp1) } fields/R/vgram.matrix.R0000644000176200001440000001037214275252303014471 0ustar liggesusers# # fields is a package for analysis of spatial data written for # the R software environment. # Copyright (C) 2022 Colorado School of Mines # 1500 Illinois St., Golden, CO 80401 # Contact: Douglas Nychka, douglasnychka@gmail.edu, # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with the R software environment if not, write to the Free Software # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA # or see http://www.r-project.org/Licenses/GPL-2 ##END HEADER vgram.matrix <- function(dat, R = NULL, dx = NULL, dy = NULL) { # a useful function for matching shifted indices # (the kind of internal function Dorit does not like!) SI <- function(ntemp, delta) { n1 <- 1:ntemp n2 <- n1 + delta good <- (n2 >= 1) & (n2 <= ntemp) return(cbind(n1[good], n2[good])) } # # check if dat is in $x $y $z image format # if so extract z and find dx and dy if( is.list( dat)){ if(is.null(dat$z)){ stop("need a z matrix in dat") } if( !is.null(dat$x)& is.null(dx)){ dx<- dat$x[2]-dat$x[1] if( any( diff( dat$x)-dx > 10 *.Machine$double.eps) ){ stop(" x grid values are not equal") } } if( !is.null(dat$y)& is.null(dy)){ dy<- dat$y[2]-dat$y[1] if( any( diff( dat$y)-dy > 10 *.Machine$double.eps) ) { stop(" x grid values are not equal") } } dat <- dat$z } # if dat is not an image defaults for dx and dy are 1.0 if( is.null( dx)){ dx<- 1 } if( is.null( dy)){ dy<- 1 } # if R not specified go out to 5 grid boxes in distance # if( is.null(R)){ R<- 5* max( c(dx, dy)) } M<- nrow(dat) N<- ncol( dat) # create all possible separations for a grid up to a distance R m <- min( c(round(R/dx),M) ) n <- min( c(round(R/dy),N) ) # # all relavent combinations: note that negative increments are # needed as well as positive ones ind <- rbind(as.matrix(expand.grid(0, 1:n)), as.matrix(expand.grid(1:m, 0)), as.matrix(expand.grid(c(-(m:1), 1:m), 1:n))) # distances - only take those within a distance R. # and trim everything to this bound d <- sqrt((dx * ind[, 1])^2 + (dy * ind[, 2])^2) good <- (d > 0) & (d <= R) ind <- ind[good, ] d <- d[good] ind <- ind[order(d), ] d <- sort(d) # # arrays to hold statistics nbin <- nrow(ind) holdVG <- rep(NA, nbin) holdRVG <- rep(NA, nbin) holdN <- rep(0, nbin) # loop over each separation for (k in 1:nbin) { # indices for original and shifted image that are within array bounds MM <- SI(M, ind[k, 1]) NN <- SI(N, ind[k, 2]) if( length(MM)>0 & length(NN)>0){ # find differences BigDiff <- (dat[MM[, 1], NN[, 1] ] - dat[MM[, 2], NN[,2] ] ) # standard and the Cressie robust version. # modified to handle NAs holdVG[k] <- mean(0.5 * (BigDiff)^2, na.rm = TRUE) holdRVG[k] <- mean(abs(BigDiff)^0.5, na.rm = TRUE) holdN[k] <- sum( !is.na(BigDiff) ) } } # finish robust estimate Cressie (1993) formula 2.4.12 holdRVG <- 0.5 * (holdRVG^4)/(0.457 + 0.494 * holdN) # collapsed variogram to common distances this what one would look # at under the stationary case. top <- tapply(holdVG * holdN, d, FUN = "sum") bottom <- tapply(holdN, d, FUN = "sum") dcollapsed <- as.numeric(names(bottom)) vgram <- top/bottom # wipe out pesky row names dimnames(vgram) <- NULL out <- list(vgram = vgram, d = dcollapsed, ind = ind, d.full = d, vgram.full = holdVG, robust.vgram = holdRVG, N = holdN, dx = dx, dy = dy) class(out) <- "vgram.matrix" return(out) } fields/R/print.summarySpatialDesign.R0000644000176200001440000000350614275252303017353 0ustar liggesusers# # fields is a package for analysis of spatial data written for # the R software environment. # Copyright (C) 2022 Colorado School of Mines # 1500 Illinois St., Golden, CO 80401 # Contact: Douglas Nychka, douglasnychka@gmail.edu, # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with the R software environment if not, write to the Free Software # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA # or see http://www.r-project.org/Licenses/GPL-2 ##END HEADER "print.summarySpatialDesign" <- function(x, digits = 4, ...) { cat("Call:\n") dput(x$call) c1 <- "Number of design points:" c2 <- length(x$best.id) c1 <- c(c1, "Number of fixed points:") if (is.null(x$fixed)) c2 <- c(c2, 0) else c2 <- c(c2, length(x$fixed)) c1 <- c(c1, "Optimality Criterion:") c2 <- c(c2, round(x$opt.crit, digits)) sum <- cbind(c1, c2) dimnames(sum) <- list(rep("", dim(sum)[1]), rep("", dim(sum)[2])) print(sum, quote = FALSE, digits = digits) other.crit <- x$other.crit if (length(other.crit) > 1) { cat("\nOptimality criteria for other designs:\n\t") cat(round(other.crit, digits), "\n") } cat("\nHistory:\n") dimnames(x$history)[[1]] <- rep("", nrow(x$history)) print(round(x$history, digits), quote = FALSE) invisible(x) } fields/R/US.R0000644000176200001440000000206114275252302012374 0ustar liggesusers# # fields is a package for analysis of spatial data written for # the R software environment. # Copyright (C) 2022 Colorado School of Mines # 1500 Illinois St., Golden, CO 80401 # Contact: Douglas Nychka, douglasnychka@gmail.edu, # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with the R software environment if not, write to the Free Software # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA # or see http://www.r-project.org/Licenses/GPL-2 ##END HEADER "US" <- function(...) { map("state", ...) invisible() } fields/R/offGridWeights2D.R0000644000176200001440000001755414275252303015164 0ustar liggesusers# # fields is a package for analysis of spatial data written for # the R software environment. # Copyright (C) 2022 Colorado School of Mines # 1500 Illinois St., Golden, CO 80401 # Contact: Douglas Nychka, douglasnychka@gmail.edu, # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with the R software environment if not, write to the Free Software # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA # or see http://www.r-project.org/Licenses/GPL-2 ##END HEADER\ offGridWeights2D<-function(s, gridList, np=2, mKrigObject=NULL, Covariance=NULL, covArgs=NULL, aRange=NULL, sigma2=NULL, giveWarnings=TRUE, debug=FALSE ){ # # function assumes the grid is # integer locations and 1:m by 1:n # grid and off grid locations need to be transformed to that scale # # also assumes the grid extends two cells beyond any off # e.g. s coordinates should be between # 2 and m-3 and 2 and n-3 # # If mKrigObject (result of fitting model) is given # extract all the covariance information from it. # For the Matern family besides aRange and sigma2 is the # smoothness if( !is.null( mKrigObject)){ sigma2<- mKrigObject$summary["sigma2"] aRange<- mKrigObject$summary["aRange"] Covariance<- mKrigObject$args$Covariance if( is.null(Covariance)){ Covariance<- "Exponential" } covArgs<-mKrigObject$args # some R arcania -- strip out all arguments used by say stationary.cov # but not used by the Covariance function # Do not want to call the covariance function with these extra args. if( !is.null( covArgs) ){ argNames<- names( as.list( get(Covariance))) argNames<- argNames[ -length(argNames)] ind<- match( names(covArgs), argNames) covArgs[is.na( ind)] <- NULL } } m<- length( gridList$x) n<- length( gridList$y) dx<- gridList$x[2]- gridList$x[1] dy<- gridList$y[2]- gridList$y[1] M<- nrow( s) # lower left corner of grid box containing the points s0<- cbind( trunc( (s[,1]- gridList$x[1] )/dx) + 1 , trunc( (s[,2]- gridList$y[1] )/dy) + 1 ) # index of locations when 2D array is unrolled s0Index<- as.integer( s0[,1] + (s0[,2]-1)*m) # check for more than one obs in a grid box tableLoc<- table( s0Index) allSingle<- all( tableLoc ==1 ) # np=2 # specific to 2nd degree neighborhood # (2*np)^2 = 16 points total #xshift<- rep( c(0,1,2,3), 4) #yshift<- rep( c(0,1,2,3), each=4 ) theShift<- (0:(2*np-1)) - (np-1) xshift<- rep( theShift, 2*np) yshift<- rep( theShift, each=2*np ) nnXY<- cbind( xshift, yshift) nnXYCoords<- cbind( xshift*dx, yshift*dy) # # sX and sY are M by (2*np)^2 matrices where each row is # the unrolled row and column indices for np=2 # yield 16 nearest neighbors sX<- s0[,1] + matrix( rep( xshift,M), nrow=M, ncol=(2*np)^2, byrow=TRUE) sY<- s0[,2] + matrix( rep( yshift,M), nrow=M, ncol=(2*np)^2, byrow=TRUE) if( any( (sX < 1)| (sX>m)) ) { stop( "sX outside range for grid") } if( any( (sY < 1)| (sY>n)) ) { stop( "sY outside range for grid") } # indices of all nearest neighbors for unrolled vector. # this is an M by (2*np)^2 matrix where indices go from 1 to m*n # these work for the unrolled 2D array # sIndex<- sX + (sY-1)*m # differences between nn and the off grid locations # for both coordinates # convert from integer grid to actual units. differenceX<- (sX-1)*dx + gridList$x[1] - s[,1] differenceY<- (sY-1)*dy + gridList$y[1] - s[,2] # print( cbind( t( (sX-1)*dx + gridList$x[1])[,1], # t( (sY-1)*dy + gridList$y[1])[,1])) # all pairwise distances between each off grid and # (2*np)^2 ( np=2 has 16) nearest neighbors dAll<- sqrt(differenceX^2 + differenceY^2) # pairwise distance among nearest neighbors. dNN<- rdist(nnXYCoords, nnXYCoords ) # cross covariances Sigma21Star<- sigma2* do.call(Covariance, c(list(d = dAll/aRange), covArgs)) # covariance among nearest neighbors Sigma11 <- sigma2* do.call(Covariance, c(list(d = dNN/aRange), covArgs)) Sigma11Inv <- solve( Sigma11) # each row of B are the weights used to predict off grid point B <- Sigma21Star%*%Sigma11Inv # create spind sparse matrix # note need to use unrolled indices to refer to grid points ind<- cbind( rep(1:M, each= (2*np)^2 ), c( t( sIndex))) ra<- c( t( B)) da<- c( M, m*n ) spindBigB<- list(ind=ind, ra=ra, da=da ) # now convert to the more efficient spam format BigB<- spind2spam( spindBigB) # # prediction variances # use cholesky for more stable numerics cholSigma11Inv<- chol(Sigma11Inv) # create spind sparse matrix of sqrt variances # or covariances to simulate prediction error. w <- Sigma21Star%*%t(cholSigma11Inv) predictionVariance <- sigma2 - rowSums(w^2) # easiest case of just one obs in each grid box # sigma2 - diag(Sigma21Star%*%Sigma11Inv%*%t(Sigma21Star) ) spindObjSE<- list(ind=cbind( 1:M, 1:M), ra=sqrt(predictionVariance), da= c( M,M) ) BigSE<- spind2spam( spindObjSE) if(allSingle){ duplicateIndex<-NA } if( !allSingle){ indDuplicates<- (tableLoc > 1) if( giveWarnings){ cat("Found", sum(indDuplicates), "grid box(es) containing more than 1 obs location", fill=TRUE) } duplicateIndex<-names( tableLoc) [indDuplicates] duplicateIndex<- as.numeric(duplicateIndex) # duplicateIndex is the unrolled indices for all grid boxes with # 2 or more observations # following code is written assuming there are not many of these. nBox<- length( duplicateIndex) indDupSE<-NULL raDupSE<- NULL for( k in 1:nBox){ theBox<- duplicateIndex[k] # the obs that are in this box indBox<- which(s0Index == theBox) nDup<- length( indBox) dDup<- rdist( s[indBox,], s[indBox,]) sigmaMarginal<- sigma2* do.call(Covariance, c(list(d = dDup/aRange), covArgs)) A<- w[indBox,] localSE2<- sigmaMarginal - A%*%t(A) localSE<- t(chol( localSE2 )) # localSE %*% rnorm(nDup) will generate correct corrected # prediction errors for obs in this grid box ("theBox") indTmp<- cbind(rep( indBox, nDup), rep( indBox, each=nDup) ) raTmp<- c(localSE) indDupSE<- rbind( indDupSE,indTmp) raDupSE<- c( raDupSE, raTmp) } #print( dim(indDupSE )) #print( length(raDupSE)) BigSE[indDupSE]<- raDupSE } if( debug){ return( list( B= BigB, SE= BigSE, predictionVariance = predictionVariance, Sigma11Inv = Sigma11Inv, Sigma21Star= Sigma21Star, s0Index = s0Index, s0 = s0, gridX = t( (sX-1)*dx + gridList$x[1]), gridY = t((sY-1)*dy + gridList$y[1]), gridList = gridList, duplicateIndex= duplicateIndex ) ) } else{ return( list( B = BigB, SE = BigSE, predictionVariance = predictionVariance ) ) } } fields/R/interp.surface.R0000644000176200001440000000425314275252303015003 0ustar liggesusers# # fields is a package for analysis of spatial data written for # the R software environment. # Copyright (C) 2022 Colorado School of Mines # 1500 Illinois St., Golden, CO 80401 # Contact: Douglas Nychka, douglasnychka@gmail.edu, # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with the R software environment if not, write to the Free Software # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA # or see http://www.r-project.org/Licenses/GPL-2 ##END HEADER "interp.surface" <- function(obj, loc) { # obj is a surface or image object like the list for contour, persp or image. # loc a matrix of 2 d locations -- new points to evaluate the surface. x <- obj$x y <- obj$y z <- obj$z nx <- length(x) ny <- length(y) # this clever idea for finding the intermediate coordinates at the new points # is from J-O Irisson lx <- approx(x, 1:nx, loc[, 1])$y ly <- approx(y, 1:ny, loc[, 2])$y lx1 <- floor(lx) ly1 <- floor(ly) # x and y distances between each new point and the closest grid point in the lower left hand corner. ex <- lx - lx1 ey <- ly - ly1 # fix up weights to handle the case when loc are equal to # last grid point. These have been set to NA above. ex[lx1 == nx] <- 1 ey[ly1 == ny] <- 1 lx1[lx1 == nx] <- nx - 1 ly1[ly1 == ny] <- ny - 1 # bilinear interpolation finds simple weights based on the # the four corners of the grid box containing the new # points. return(z[cbind(lx1, ly1)] * (1 - ex) * (1 - ey) + z[cbind(lx1 + 1, ly1)] * ex * (1 - ey) + z[cbind(lx1, ly1 + 1)] * (1 - ex) * ey + z[cbind(lx1 + 1, ly1 + 1)] * ex * ey) } fields/R/plot.surface.R0000644000176200001440000000665214275252303014465 0ustar liggesusers# # fields is a package for analysis of spatial data written for # the R software environment. # Copyright (C) 2022 Colorado School of Mines # 1500 Illinois St., Golden, CO 80401 # Contact: Douglas Nychka, douglasnychka@gmail.edu, # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with the R software environment if not, write to the Free Software # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA # or see http://www.r-project.org/Licenses/GPL-2 ##END HEADER "plot.surface" <- function(x, main = NULL, type = "C", zlab = NULL, xlab = NULL, ylab = NULL, levels = NULL, zlim = NULL, graphics.reset = NULL, labcex = 0.6, add.legend = TRUE, ...) { obj <- x old.par <- par(no.readonly = TRUE) if (is.na(match(type, c("b", "c", "C", "I", "p")))) { stop("plot type does not match b, C, I, or p.") } if (is.null(zlim)) { zlim = range(obj$z, na.rm = TRUE) } if (is.null(graphics.reset) & (type == "b")) { graphics.reset <- TRUE } else { graphics.reset <- FALSE } if (graphics.reset) { on.exit(par(old.par)) } if (is.null(xlab)) { if (is.null(obj$xlab)) xlab <- "X" else xlab <- obj$xlab } if (is.null(ylab)) { if (is.null(obj$ylab)) ylab <- "Y" else ylab <- obj$ylab } if (is.null(zlab)) { if (is.null(obj$zlab)) zlab <- "Z" else zlab <- obj$zlab } if (is.null(main)) if (!is.null(obj$main)) main <- obj$main if (type == "b") set.panel(1, 2, TRUE) if (type == "p" | type == "b") { if (type == "b") { add.legend <- FALSE old.mar <- par()$mar par(mar = c(0, 5, 0, 0)) } drape.plot(obj, xlab = xlab, ylab = ylab, zlab = zlab, zlim = zlim, add.legend = add.legend, ...) if (!is.null(main)) title(main) } if (type == "I") { image.plot(obj$x, obj$y, obj$z, xlab = xlab, ylab = ylab, zlim = zlim, ...) if ((!is.null(main)) & type != "b") title(main) } if (type == "c") { if (is.null(levels)) levels <- pretty(obj$z[!is.na(obj$z)], 5) contour(obj$x, obj$y, obj$z, levels = levels, labcex = labcex, lwd = 2, ...) if ((!is.null(main)) & type != "b") title(main) } if (type == "b" | type == "C") { if (type == "b") { par(mar = old.mar) } image.plot(obj$x, obj$y, obj$z, xlab = xlab, ylab = ylab, graphics.reset = graphics.reset, zlim = zlim, ...) if (is.null(levels)) levels <- pretty(obj$z[!is.na(obj$z)], 5) contour(obj$x, obj$y, obj$z, add = TRUE, levels = levels, labcex = labcex, col = "black", lwd = 2) if ((!is.null(main)) & type != "b") title(main) } invisible() } fields/R/poly.image.R0000644000176200001440000000767514305515515014133 0ustar liggesusers# # fields is a package for analysis of spatial data written for # the R software environment. # Copyright (C) 2022 Colorado School of Mines # 1500 Illinois St., Golden, CO 80401 # Contact: Douglas Nychka, douglasnychka@gmail.edu, # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with the R software environment if not, write to the Free Software # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA # or see http://www.r-project.org/Licenses/GPL-2 ##END HEADER poly.image.regrid <- function(x) { ################################## temp.addcol <- function(X) { N <- ncol(X) # add extra columns to X, on either side cbind(X[, 1] - (X[, 2] - X[, 1]), X, (X[, N] - X[, (N - 1)]) + X[, N]) } ############################### # find approximate grid with z values at centers M <- nrow(x) N <- ncol(x) # new x matrix that is the midpoints of original grid points. x <- (x[, 1:(N - 1)] + x[, 2:N])/2 x <- (x[1:(M - 1), ] + x[2:M, ])/2 # now add extra rows and columns on all sides x <- t(temp.addcol(x)) t(temp.addcol(x)) } poly.image <- function(x, y, z, col = tim.colors(64), breaks, transparent.color = "white", midpoint = FALSE, zlim = range(z, na.rm = TRUE), xlim = range(x), ylim = range(y), add = FALSE, border = NA, lwd.poly = 1, asp=NA, ...) { # check dimensions Dx <- dim(x) Dy <- dim(y) if (any((Dx - Dy) != 0)) { stop(" x and y matrices should have same dimensions") } # check whether grid and z values coincide. Dz <- dim(z) if (all((Dx - Dz) == 0) & !midpoint) { # expand grid in a linear way so that the z are not # grid box centers x <- poly.image.regrid(x) y <- poly.image.regrid(y) } # figure out the breaks make sure that missing breaks are passed as NA. if (missing(breaks)) { breaks <- NA } # code values in z based on range to colors. # if midpoint is true z values will be averaged first zcol <- drape.color(z, col = col, midpoint = midpoint, zlim = zlim, transparent.color = transparent.color, breaks = breaks)$color.index # blank if not adding to an exising plot if (!add) { plot(xlim, ylim, type = "n",asp=asp, ...) } N <- ncol(x) Nm1 <- N - 1 M <- nrow(x) Mm1 <- M - 1 for (i in (1:Mm1)) { # draw polygons one row at a time # uses feature of polygon to draw multiple regions with NAs # marking start and end. xp <- cbind(x[i, 1:Nm1], x[i + 1, 1:Nm1], x[i + 1, 2:N], x[i, 2:N], rep(NA, Nm1)) yp <- cbind(y[i, 1:Nm1], y[i + 1, 1:Nm1], y[i + 1, 2:N], y[i, 2:N], rep(NA, Nm1)) xp <- c(t(xp)) yp <- c(t(yp)) pcol <- c(zcol[i, 1:Nm1]) # draw each poly with different color including the border # if the border color has not been specified. # this will avoid missing some space on some output devices. # one can also crank down width of border lines to avoid rounded corners polygon(xp, yp, border = pcol, col = pcol, lwd = lwd.poly) # fill in border with different color if it is not an NA. if (!is.na(border)) { # this does not quite work # borderWithNA<- ifelse( pcol == transparent.color, NA,border) polygon(xp, yp, border = border, col = NA, lwd = lwd.poly) } } } fields/R/rdist.R0000644000176200001440000000264614275252303013204 0ustar liggesusers# # fields is a package for analysis of spatial data written for # the R software environment. # Copyright (C) 2022 Colorado School of Mines # 1500 Illinois St., Golden, CO 80401 # Contact: Douglas Nychka, douglasnychka@gmail.edu, # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with the R software environment if not, write to the Free Software # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA # or see http://www.r-project.org/Licenses/GPL-2 ##END HEADER "rdist" <- function(x1, x2 = NULL, compact = FALSE) { if (!is.matrix(x1)) { x1 <- as.matrix(x1) } if (is.null(x2)) { storage.mode(x1) <- "double" if (compact) return(dist(x1)) else return(.Call("RdistC", x1, x1, PACKAGE = "fields")) } else { if (!is.matrix(x2)) { x2 <- as.matrix(x2) } storage.mode(x1) <- "double" storage.mode(x2) <- "double" return(.Call("RdistC", x1, x2, PACKAGE = "fields")) } } fields/R/snow.colors.R0000644000176200001440000000475414275252303014347 0ustar liggesusers# # fields is a package for analysis of spatial data written for # the R software environment. # Copyright (C) 2022 Colorado School of Mines # 1500 Illinois St., Golden, CO 80401 # Contact: Douglas Nychka, douglasnychka@gmail.edu, # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with the R software environment if not, write to the Free Software # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA # or see http://www.r-project.org/Licenses/GPL-2 ##END HEADER # # from development -- the script to tease out colors from # piecewise linear color scale. #library( fields) #look<- read.csv( "cmap_sca_256.csv") #look<- as.matrix( look) #rawRGBTable<- look/255 #x<- 1:255 # y1<- splint( x,look[,1], x, # df=15, derivative=2 ) # y2<- splint( x,look[,2], x, # df=15, derivative=2 ) # y3<- splint( x,look[,2], x, # df=15, derivative=2 ) # f<- y1^2+y2^2+y3^2 # indm<- 1:253 # ind0<- 2:254 # indp<- 3:255 # maxInd<- (f[indp] < f[ind0]) & (f[indm]< f[ind0]) # temp<- t(col2rgb( colors())) # colorsFound<- rbind( look[1,], # look[maxInd,], # look[255,] )/255 # HexColors<- rgb( colorsFound[,1], # colorsFound[,2], # colorsFound[,3]) # rawTable<- rgb( look[,1], look[,2],look[,3]) # snowColorsMap<- list( x= c(0,x[maxInd], 255)/255, # col= HexColors, # rawRGBTable=rawRGBTable) #image(matrix(1:length(HexColors)), col=snow.colors() ) snow.colors<- function( n=256, alpha=1){ x<- c( 0, 7, 31, 63, 94, 127, 159, 190, 222, 243, 248, 255)/255 col<- c("#091E5A", "#0E2266", "#243493", "#225DA8", "#1D8FC0", "#41B6C5", "#7FCEBC", "#C5E9B5", "#EDF8B2", "#F9FDE3", "#FCFEEF", "#FFFFFE") colorTable<- designer.colors(n-1, col=col, x=x , alpha = alpha) #grey added to represent minimum value withGrey<- c( "#808080", colorTable) return( withGrey ) } fields/R/Paciorek.cov.R0000644000176200001440000000637214453357663014417 0ustar liggesusers# # fields is a package for analysis of spatial data written for # the R software environment. # Copyright (C) 2022 Colorado School of Mines # 1500 Illinois St., Golden, CO 80401 # Contact: Douglas Nychka, douglasnychka@gmail.edu, # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with the R software environment if not, write to the Free Software # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA # or see http://www.r-project.org/Licenses/GPL-2 ##END HEADER "Paciorek.cov" <- function(x1, x2 = NULL, Distance = "rdist", Dist.args = NULL, aRangeObj = 1, rhoObj = NULL, C = NA, marginal = FALSE, smoothness = .5) { # get covariance function arguments from call if (class(aRangeObj)[1] == "numeric") { class(aRangeObj) <- "constant" } # coerce x1 and x2 to matrices if (is.data.frame(x1)) x1 <- as.matrix(x1) if (!is.matrix(x1)) x1 <- matrix(c(x1), ncol = 1) if (is.null(x2)) x2 = x1 if (is.data.frame(x2)) x2 <- as.matrix(x2) if (!is.matrix(x2) & !is.null(x2)) x2 <- matrix(c(x2), ncol = 1) d <- ncol(x1) n1 <- nrow(x1) n2 <- nrow(x2) # if (!marginal) { aRangex1 <- c(predict(aRangeObj, x1)) aRangex2 <- c(predict(aRangeObj, x2)) # this is (Sigma_i + Sigma_j )/2 aRange2Matrix <- (outer(aRangex1 ^ 2, aRangex2 ^ 2, '+') / 2) distMat <- do.call(Distance, c(list(x1 = x1, x2 = x2), Dist.args)) dimX<- ncol( x1) # adjust for dimension. # detS1= (determinant Sigma_i) ^1/4 detS1<- (aRangex1)^(2*dimX/4) detS2<- (aRangex2)^(2*dimX/4) # detS12 = (determinant (Sigma_i + Sigma_j)/2 ) ^1/2 detS12 <- aRange2Matrix^(dimX/2) normCov <-outer(detS1, detS2, "*")/detS12 covMat <- normCov * Matern( distMat / sqrt(aRange2Matrix), smoothness = smoothness) if (!is.null(rhoObj)) { cat( "sigma Obj used", fill=TRUE) sigmax1 <- c(sqrt(predict(rhoObj, x1))) sigmax2 <- c(sqrt(predict(rhoObj, x2))) covMat <- t(t(sigmax1 * covMat) * sigmax2) } # else assume that rho is constant and 1.0 if (is.na(C[1])) { # distMat is a full matrix return(covMat) } # or multiply cross covariance by C # as coded below this is not particularly efficient of memory else{ return(covMat %*% C) } } else{ if (!is.null(rhoObj)) { marginalVariance <- predict(rhoObj, x1) } else{ marginalVariance <- rep(1, ncol(x1)) } return(marginalVariance) } } fields/R/quickPrint.R0000644000176200001440000000253014275252303014200 0ustar liggesusers# # fields is a package for analysis of spatial data written for # the R software environment. # Copyright (C) 2022 Colorado School of Mines # 1500 Illinois St., Golden, CO 80401 # Contact: Douglas Nychka, douglasnychka@gmail.edu, # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with the R software environment if not, write to the Free Software # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA # or see http://www.r-project.org/Licenses/GPL-2 ##END HEADER quickPrint<- function( obj, max.values=10){ # this simple function will only print an object if # it is not too big if( is.list( obj)){ sizeObj<- length( unlist( obj)) } else{ sizeObj<-length( c( obj)) } if( sizeObj<= max.values){ print(obj) } else{ cat("Object size is more than", max.values,"items (", sizeObj, "total)", fill=TRUE) } } fields/R/radbas.constant.R0000644000176200001440000000316514275252303015140 0ustar liggesusers# # fields is a package for analysis of spatial data written for # the R software environment. # Copyright (C) 2022 Colorado School of Mines # 1500 Illinois St., Golden, CO 80401 # Contact: Douglas Nychka, douglasnychka@gmail.edu, # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with the R software environment if not, write to the Free Software # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA # or see http://www.r-project.org/Licenses/GPL-2 ##END HEADER "radbas.constant" <- function(m, d) { # local gamma function to avoid imprecision warnings for negative arguments. gamma.local <- function(x) { if (x < 0) { temp <- 1 while (x < 0) { temp <- temp * x x <- x + 1 } return(gamma(x)/temp) } else { gamma(x) } } if (d%%2 == 0) { Amd <- (((-1)^(1 + m + d/2)) * (2^(1 - 2 * m)) * (pi^(-d/2)))/(gamma(m) * gamma.local(m - d/2 + 1)) } else { Amd <- (gamma.local(d/2 - m) * (2^(-2 * m)) * (pi^(-d/2)))/gamma(m) } Amd } fields/R/summary.spatialDesign.R0000644000176200001440000000216614275252303016337 0ustar liggesusers# # fields is a package for analysis of spatial data written for # the R software environment. # Copyright (C) 2022 Colorado School of Mines # 1500 Illinois St., Golden, CO 80401 # Contact: Douglas Nychka, douglasnychka@gmail.edu, # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with the R software environment if not, write to the Free Software # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA # or see http://www.r-project.org/Licenses/GPL-2 ##END HEADER "summary.spatialDesign" <- function(object, digits = 4, ...) { x <- object class(x) <- ("summarySpatialDesign") x } fields/R/print.mKrig.summary.R0000644000176200001440000000441014275252303015746 0ustar liggesusers# # fields is a package for analysis of spatial data written for # the R software environment. # Copyright (C) 2022 Colorado School of Mines # 1500 Illinois St., Golden, CO 80401 # Contact: Douglas Nychka, douglasnychka@gmail.edu, # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with the R software environment if not, write to the Free Software # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA # or see http://www.r-project.org/Licenses/GPL-2 ##END HEADER print.mKrigSummary <- function (x, digits = 4, ...) { cat("Call:\n") dput(x$call) print(x$summaryTable, quote = FALSE) # fixed effects are reported differently when fields are replicated. nData<- x$nData cat(" ", fill = TRUE) if( nData == 1 | x$collapseFixedEffect ){ cat(" ", fill = TRUE) cat("Summary of fixed effects", fill = TRUE) print( x$fixedEffectsTable) } else { cat("Estimated fixed effects found separately for each replicate field", fill = TRUE) } cat(" ", fill = TRUE) cat("Covariance Model:", x$cov.function, fill = TRUE) if (x$cov.function == "stationary.cov") { cat(" Covariance function: ", ifelse(is.null(x$args$Covariance), "Exponential", x$args$Covariance), fill = TRUE) } if (!is.null(x$args)) { cat(" Non-default covariance arguments and their values ", fill = TRUE) nlist <- as.character(names(x$args)) NL <- length(nlist) for (k in 1:NL) { cat(" Argument:", nlist[k], " ") if (object.size(x$args[[k]]) <= 1024) { cat("has the value(s): ", fill = TRUE) print(x$args[[k]]) } else { cat("too large to print value, size > 1K ...", fill = TRUE) } } } invisible(x) }fields/R/mKrig.R0000644000176200001440000003752214342022641013124 0ustar liggesusers# # fields is a package for analysis of spatial data written for # the R software environment. # Copyright (C) 2022 Colorado School of Mines # 1500 Illinois St., Golden, CO 80401 # Contact: Douglas Nychka, douglasnychka@gmail.edu, # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with the R software environment if not, write to the Free Software # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA # or see http://www.r-project.org/Licenses/GPL-2 ##END HEADER mKrig <- function(x, y, weights=rep(1, nrow(x)), Z = NULL, ZCommon=NULL, cov.function="stationary.cov", cov.args = NULL, lambda = NA, m = 2, chol.args = NULL, find.trA = TRUE, NtrA = 20, iseed = NA, na.rm=FALSE, collapseFixedEffect = TRUE, tau=NA, sigma2=NA, ...) { # pull extra covariance arguments from ... and overwrite # any arguments already named in cov.args ind<- match( names( cov.args), names(list(...) ) ) cov.args = c(cov.args[is.na(ind)], list(...)) # #If cov.args$find.trA is true, set onlyUpper to FALSE (onlyUpper doesn't #play nice with predict.mKrig, called by mKrig.trace) # # next function also omits NAs from x,y,weights, and Z if na.rm=TRUE. object<- mKrigCheckXY( x, y, weights, Z, ZCommon,na.rm = na.rm) # as the computation progresses additional components are # added to the object list and by the end this is the returned # object of class mKrig. if(find.trA == TRUE && supportsArg(cov.function, "onlyUpper")) cov.args$onlyUpper= FALSE if(find.trA == TRUE && supportsArg(cov.function, "distMat")) cov.args$distMat= NA if( !is.na(tau)|!is.na(sigma2)){ fixedParameters<- TRUE # work through the 3 cases for sigma2 and tau # note that for 2 of these als need lambda if( !is.na(tau)&!is.na(sigma2)){ lambda<- tau^2/sigma2} if( is.na(tau)){ tau <- sqrt( lambda*sigma2) } if( is.na(sigma2)){ sigma2 <- tau^2/lambda } } else{ fixedParameters<- FALSE } object$fixedParameters<- fixedParameters # check for duplicate x's. # stop if there are any if (any(duplicated(cat.matrix(x)))) { stop("locations are not unique see help(mKrig) ") } # create fixed part of model as m-1 order polynomial # NOTE: if m==0 then fields.mkpoly returns a NULL to # indicate no polynomial part. Tmatrix <- cbind(fields.mkpoly(object$x, m), object$Z) # set some dimensions np <- nrow(object$x) if( is.null(Tmatrix) ){ nt<- 0 } else{ nt<- ncol(Tmatrix) } if( is.null(object$Z)){ nZ<- 0 } else{ nZ<- ncol(object$Z) } ind.drift <- c(rep(TRUE, (nt - nZ)), rep(FALSE, nZ)) # as a place holder for reduced rank Kriging, distinguish between # observations locations and the locations to evaluate covariance. # (this is will also allow predict.mKrig to handle a Krig object) object$knots <- object$x # covariance matrix at observation locations # NOTE: if cov.function is a sparse constuct then Mc will be sparse. # see e.g. wendland.cov Mc <- do.call(cov.function, c(cov.args, list(x1 = object$knots, x2 = object$knots))) # # decide how to handle the pivoting. # one wants to do pivoting if the matrix is sparse. # if Mc is not a matrix assume that it is in sparse format. # sparse.flag <- !is.matrix(Mc) # # set arguments that are passed to cholesky # if (is.null(chol.args)) { chol.args <- list(pivot = sparse.flag) } else { chol.args <- chol.args } # quantify sparsity of Mc for the mKrig object nzero <- ifelse(sparse.flag, length(Mc@entries), np^2) # add diagonal matrix that is the observation error Variance # NOTE: diag must be a overloaded function to handle sparse format. if (lambda != 0) { if(! sparse.flag) invisible(.Call("addToDiagC", Mc, as.double(lambda/object$weights), nrow(Mc), PACKAGE="fields") ) else diag(Mc) = diag(Mc) + lambda/object$weights } # MARK LINE Mc # At this point Mc is proportional to the covariance matrix of the # observation vector, y. # # cholesky decoposition of Mc # do.call used to supply other arguments to the function # especially for sparse applications. # If chol.args is NULL then this is the same as # Mc<-chol(Mc), chol.args)) Mc <- do.call("chol", c(list(x = Mc), chol.args)) lnDetCov <- 2 * sum(log(diag(Mc))) # # start linear algebra to find estimates and likelihood # Note that all these expressions make sense if y is a matrix # of several data sets and one is solving for the coefficients # of all of these at once. In this case beta and c.coef are matrices # if( !is.null(Tmatrix) | !is.null(ZCommon) ){ # Efficent way to multply inverse of Mc times the Tmatrix TStar<- forwardsolve(Mc, x = Tmatrix, k=ncol(Mc), transpose = TRUE, upper.tri = TRUE) qr.VT <- qr(TStar) # GLS covariance matrix for fixed part. Rinv <- solve(qr.R(qr.VT)) Omega <- Rinv %*% t(Rinv) lnDetOmega<- sum( log( diag(Rinv)^2 ) ) # now do generalized least squares for beta YStar<- forwardsolve(Mc, transpose = TRUE, object$y, upper.tri = TRUE) } ########################################## ### only the T and Z covariate fixed parts ########################################## if( !is.null(Tmatrix) & is.null(ZCommon) ){ beta <- as.matrix(qr.coef(qr.VT, YStar)) if (collapseFixedEffect) { # use a common estimate of fixed effects across all replicates betaMeans <- rowMeans(beta) beta <- matrix(betaMeans, ncol = ncol(beta), nrow = nrow(beta)) } # # Omega from above is solve(t(Tmatrix)%*%solve( Sigma)%*%Tmatrix) # where Sigma = cov.function( x,x) + lambda/object$weights # proportional to fixed effects covariance matrix. # for the GLS estimates of # the fixed linear part of the model. # # SEdcoef = diag( Omega) * sigma2.MLE.FULL # # if fixed effects are pooled across replicate fields then # adjust the Omega matrix to reflect a mean estimate. if (collapseFixedEffect) { Omega <- Omega/ ncol(beta) } # set ZCommon parameters to NA gamma<- NA OmegaZCommon<- NULL # GLS residual now used to evaluate likelihood resid<- object$y - Tmatrix %*% beta } if( !is.null(ZCommon) ){ if( is.null(T)){ stop("need a fixed part matrix (m>0, T and/or Z) to add ZCommon") } # check dimensions n<- nrow(object$y) M<- ncol( object$y) if( M ==1){ stop("No replications just use the Z argument!") } N<- n*M if( nrow( ZCommon)!= N){ stop("dimension of ZCommon should be nObs X nReps") } ZCStar<- matrix( NA, N, ncol(ZCommon)) for( k in 1:ncol(ZCommon) ) { ZCtmp<- matrix(ZCommon[,k],n,M ) temp<- forwardsolve(Mc, x = ZCtmp, k=ncol(Mc), transpose = TRUE, upper.tri = TRUE) ZCStar[,k]<- c(temp) } testZ<- matrix( NA, N, ncol(ZCommon)) # Project ZCommon onto subspace orthogonal to TStar for( k in 1:ncol(ZCommon) ) { temp<- qr.resid(qr.VT, matrix( ZCStar[,k],n,M) ) testZ[,k]<- c(temp) } testY<- c( qr.resid(qr.VT, YStar) ) ########################################## # ifelse block on collapseFixedEffects ########################################## if (!collapseFixedEffect) { gamma<- lsfit( testZ,testY, intercept=FALSE)$coefficients OmegaZCommon<- solve( t( testZ)%*%testZ ) # find correct beta having adjusted by gamma tmpResid<- YStar - matrix(ZCStar%*%gamma,n,M) beta<- qr.coef(qr.VT, tmpResid ) } else{ # collapse beta fit -- common fixed effect parameters in T # but need to adjust for ZCommon that might not be the same at # each realization. UStar<- cbind( rep(1,M)%x%TStar , ZCStar) allPar<- lsfit( UStar,c(YStar), intercept=FALSE)$coefficients # extract beta and gamma nBeta<- ncol(TStar) nZC<- ncol(ZCommon) betaCommon<- allPar[1: nBeta] gamma<- allPar[(1: nZC)+ nBeta] # repeat beta for all realizations to have consitent format with # collapseFixedEffects =FALSE beta <- matrix(betaCommon, ncol = M, nrow = nBeta) # correct Omega matrices Omega<- solve( t(UStar)%*%UStar) OmegaZCommon<- Omega[(1: nZC)+ nBeta,(1: nZC)+ nBeta] } # GLS residual now used to evaluate likelihood resid<- object$y - Tmatrix%*%beta - matrix(ZCommon%*%gamma,n,M) } if( is.null(Tmatrix)){ # much is set to NULL because no fixed part of model nt<- 0 resid<- object$y Rinv<- NULL Omega<- NULL qr.VT<- NULL beta<- NULL lnDetOmega <- 0 # set ZCommon parameters to NULL gamma<- NULL OmegaZCommon<- NULL } # and now find c. # the coefficents for the spatial part. # if there is also a linear fixed part resid are the residuals from the # GLS regression. c.coef <- as.matrix(forwardsolve(Mc, transpose = TRUE, resid, upper.tri = TRUE)) # save intermediate result this is t(y- T beta)( M^{-1}) ( y- T beta) quad.form <- c(colSums(as.matrix(c.coef^2))) # compute full likelihood if 2 out three covariance parameters are given if(fixedParameters){ lnLike<- lnProfileLike <- (-quad.form/(2*sigma2) - log(2 * pi) * (np/2) - (np/2) * log(sigma2) - (1/2) * lnDetCov ) lnLikeREML<- lnLike + (1/2) * lnDetOmega lnLike.FULL<- sum( lnLike) lnLikeREML.FULL<- sum(lnLikeREML) } else{ lnLike<-NA lnLike.FULL<-NA lnLikeREML<-NA lnLikeREML.FULL<-NA } # find c coefficients c.coef <- as.matrix(backsolve(Mc, c.coef)) # find the residuals directly from solution # to avoid a call to predict object$residuals <- lambda * c.coef/object$weights object$fitted.values <- object$y - object$residuals # MLE estimate of sigma and tau # sigmahat <- c(colSums(as.matrix(c.coef * y)))/(np - nt) # NOTE if y is a matrix then each of these are vectors of parameters. sigma2.MLE <- (quad.form/np) #sigma2hat <- c(colSums(as.matrix(c.coef * object$y)))/np tau.MLE <- sqrt(lambda * sigma2.MLE) # the log profile likehood with sigma2.MLE and dhat substituted # leaving a profile for just lambda. # NOTE if y is a matrix then this is a vector of log profile # likelihood values. lnProfileLike <- (-np/2 - log(2 * pi) * (np/2) - (np/2) * log(sigma2.MLE) - (1/2) * lnDetCov) # see section 4.2 handbook of spatial statistics (Zimmerman Chapter) # for this amazing shortcut to get the REML version lnProfileREML <- lnProfileLike + (1/2) * lnDetOmega # following FULL means combine the estimates across all replicate fields # mean for MLE is justified as it is assumed locations and weights the same across # replicates. sigma2.MLE.FULL <- mean(sigma2.MLE) tau.MLE.FULL <- sqrt(lambda * sigma2.MLE.FULL) # if y is a matrix then compute the combined likelihood # under the assumption that the columns of y are replicated # fields lnProfileLike.FULL <- sum((-np/2 - log(2 * pi) * (np/2) - (np/2) * log(sigma2.MLE.FULL) - (1/2) * lnDetCov) ) lnProfileREML.FULL <- sum((-np/2 - log(2 * pi) * (np/2) - (np/2) * log(sigma2.MLE.FULL) - (1/2) * lnDetCov + (1/2) * lnDetOmega ) ) # # return coefficients and include lambda as a check because # results are meaningless for other values of lambda # returned list is an 'object' of class mKrig (micro Krig) # also save the matrix decompositions so coefficients can be # recalculated for new y values. Make sure onlyUpper and # distMat are unset for compatibility with mKrig S3 functions # if(!is.null(cov.args$onlyUpper)) cov.args$onlyUpper = FALSE if(!is.null(cov.args$distMat)) cov.args$distMat = NA # build return object except for effective degrees of freedom computation # and the summary vector replicateInfo = list( lnProfileLike = lnProfileLike, lnProfileREML = lnProfileREML, lnLike= lnLike, lnLikeREML= lnLikeREML, tau.MLE = tau.MLE, sigma2.MLE = sigma2.MLE, quad.form = quad.form ) object2 <- list( beta = beta, gamma = gamma, c.coef = c.coef, nt = nt, np = np, lambda.fixed = lambda, cov.function.name = cov.function, args = cov.args, m = m, chol.args = chol.args, call = match.call(), nonzero.entries = nzero, replicateInfo = replicateInfo, lnLike.FULL = lnLike.FULL, lnLikeREML.FULL = lnLikeREML.FULL, lnDetCov = lnDetCov, lnDetOmega = lnDetOmega, Omega = Omega, lnDetOmega = lnDetOmega, OmegaZCommon = OmegaZCommon, qr.VT = qr.VT, Mc = Mc, Tmatrix = Tmatrix, ind.drift = ind.drift, nZ = nZ, fixedEffectsCov = Omega * sigma2.MLE.FULL, fixedEffectsCovCommon = OmegaZCommon * sigma2.MLE.FULL, collapseFixedEffect = collapseFixedEffect ) object<- c( object, object2) # # # estimate effective degrees of freedom using Monte Carlo trace method. # this is optional because not needed for predictions and likelihood # but necessary for GCV if (find.trA) { object3 <- mKrig.trace(object, iseed, NtrA) object$eff.df <- object3$eff.df object$trA.info <- object3$trA.info object$GCV <- (sum(object$residuals^2)/np)/(1 - object3$eff.df/np)^2 if (NtrA < np) { object$GCV.info <- (sum(object$residuals^2)/np)/(1 - object3$trA.info/np)^2 } else { object$GCV.info <- NA } } else { object$eff.df <- NA object$trA.info <- NA object$GCV <- NA } ################### compile summary vector of parameters summaryPars<- rep(NA,10) names( summaryPars) <- c( "lnProfileLike.FULL","lnProfileREML.FULL", "lnLike.FULL","lnREML.FULL", "lambda" , "tau","sigma2","aRange","eff.df","GCV") summaryPars["lnProfileLike.FULL"]<- lnProfileLike.FULL summaryPars["lnProfileREML.FULL"]<- lnProfileREML.FULL summaryPars["lnLike.FULL"]<- lnLike.FULL summaryPars["lnREML.FULL"]<- lnLikeREML.FULL if( fixedParameters){ summaryPars["tau"] <- tau summaryPars["sigma2"]<- sigma2 } else{ summaryPars["tau"] <- tau.MLE.FULL summaryPars["sigma2"]<- sigma2.MLE.FULL } summaryPars["lambda"]<- lambda summaryPars["aRange"] <-ifelse( !is.null(cov.args$aRange), cov.args$aRange, NA) summaryPars["eff.df"] <- object$eff.df summaryPars["GCV"] <- object$GCV object$summary<- summaryPars ######################## ### add in some depreciated components so that LatticeKrig 8.4 ### passes its tests. ######################## object$rho.MLE<- sigma2.MLE object$rho.MLE.FULL<- sigma2.MLE.FULL object$lnProfileLike<- lnProfileLike object$lnProfileLike.FULL<- lnProfileLike.FULL object$quad.form <- quad.form object$rhohat<- sigma2.MLE.FULL object$d<- beta class(object) <- "mKrig" return(object) } fields/R/stationary.image.cov.R0000644000176200001440000000713114275252303016115 0ustar liggesusers# # fields is a package for analysis of spatial data written for # the R software environment. # Copyright (C) 2022 Colorado School of Mines # 1500 Illinois St., Golden, CO 80401 # Contact: Douglas Nychka, douglasnychka@gmail.edu, # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with the R software environment if not, write to the Free Software # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA # or see http://www.r-project.org/Licenses/GPL-2 ##END HEADER stationary.image.cov <- function(ind1, ind2, Y, cov.obj = NULL, setup = FALSE, grid, M = NULL, N = NULL, cov.function="stationary.cov",delta=NULL, cov.args=NULL, ...) { # # if cov object is missing then create # basically need to enlarge domain and find the FFT of the # covariance # cov.args<-c( cov.args, list(...)) if (is.null(cov.obj)) { dx <- grid$x[2] - grid$x[1] dy <- grid$y[2] - grid$y[1] m <- length(grid$x) n <- length(grid$y) # # determine size of padding # default is twice domain and will then yeild exact results # delta indicates that covariance is zero beyond a distance delta # so using a smaller grid than twice domain will stil give exact results. if(!is.null(delta)){ M<- ceiling(m + 2*delta/dx) N<- ceiling(n + 2*delta/dy) } if (is.null(M)) M <- (2 * m) if (is.null(N)) N <- (2 * n) xg <- make.surface.grid(list((1:M) * dx, (1:N) * dy)) center <- matrix(c((dx * M)/2, (dy * N)/2), nrow = 1, ncol = 2) # # here is where the actual covariance form is used # note passed arguments from call for parameters etc. # out<- do.call(cov.function, c(cov.args, list(x1 = xg, x2 = center))) # check if this is a sparse result and if so expand to full size if( is( out,"spam") ){ out <- spam2full(out) } # coerce to a matrix (image) out<- matrix( c(out), nrow = M, ncol = N) temp <- matrix(0, nrow = M, ncol = N) # # a simple way to normalize. This could be avoided by # translating image from the center ... # temp[M/2, N/2] <- 1 wght <- fft(out)/(fft(temp) * M * N) # # wght is the discrete FFT for the covariance suitable for fast # multiplication by convolution. # cov.obj <- list(m = m, n = n, grid = grid, N = N, M = M, wght = wght, call = match.call()) if (setup) { return(cov.obj) } } temp <- matrix(0, nrow = cov.obj$M, ncol = cov.obj$N) if (missing(ind1)) { temp[1:cov.obj$m, 1:cov.obj$n] <- Y Re(fft(fft(temp) * cov.obj$wght, inverse = TRUE)[1:cov.obj$m, 1:cov.obj$n]) } else { if (missing(ind2)) { temp[ind1] <- Y } else { temp[ind2] <- Y } # # as promised this is a single clean step # Re(fft(fft(temp) * cov.obj$wght, inverse = TRUE)[ind1]) } } fields/R/Exponential.R0000644000176200001440000000337314275252302014342 0ustar liggesusers# # fields is a package for analysis of spatial data written for # the R software environment. # Copyright (C) 2022 Colorado School of Mines # 1500 Illinois St., Golden, CO 80401 # Contact: Douglas Nychka, douglasnychka@gmail.edu, # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with the R software environment if not, write to the Free Software # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA # or see http://www.r-project.org/Licenses/GPL-2 ##END HEADER "Exponential" <- function(d, range = 1, alpha = 1/range, phi = 1.0, theta=NULL) { # # Matern covariance function transcribed from Stein's book page 31 # nu==smoothness==.5, alpha == 1/range # # GeoR parameters map to kappa==smoothness and phi == range # to make old code from Fuentes and also the package SEHmodel # phi is accepted as the marginal variance of the process (see below) # within fields this parameter is "sigma" # # check for negative distances # theta argument has been depreciated. if( !is.null( theta)){ aRange<- theta } if (any(d < 0)) stop("distance argument must be nonnegative") # return(phi*exp(-d * alpha)) } fields/R/SUBSCRIPTINGSpatialDesign.R0000644000176200001440000000205514275252302016434 0ustar liggesusers# # fields is a package for analysis of spatial data written for # the R software environment. # Copyright (C) 2022 Colorado School of Mines # 1500 Illinois St., Golden, CO 80401 # Contact: Douglas Nychka, douglasnychka@gmail.edu, # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with the R software environment if not, write to the Free Software # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA # or see http://www.r-project.org/Licenses/GPL-2 ##END HEADER "[.spatialDesign" <- function(x, ...) { x$design[...] } fields/R/find.upcross.R0000644000176200001440000000337414275252303014473 0ustar liggesusers# # fields is a package for analysis of spatial data written for # the R software environment. # Copyright (C) 2022 Colorado School of Mines # 1500 Illinois St., Golden, CO 80401 # Contact: Douglas Nychka, douglasnychka@gmail.edu, # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with the R software environment if not, write to the Free Software # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA # or see http://www.r-project.org/Licenses/GPL-2 ##END HEADER "find.upcross" <- function(fun, fun.info, upcross.level = 0, guess = 1, tol = 1e-05) { l1 <- guess tr <- 0 for (k in 1:50) { tr <- fun(l1, fun.info) - upcross.level if (tr >= 0) break else { guess <- l1 } l1 <- l1 * 2 } if (tr < 0) { warning("Failed to find the upcrossing") return(NA) } tr <- 0 l2 <- guess for (k in 1:50) { tr <- fun(l2, fun.info) - upcross.level if (tr <= 0) break l2 <- l2/2 } if (tr > 0) { warning("Failed to find the upcrossing") return(NA) } out <- bisection.search(l2, l1, fun, tol = tol, f.extra = fun.info, upcross.level = upcross.level)$x (out) } fields/R/discretize.image.R0000644000176200001440000000712314275252303015300 0ustar liggesusers# # fields is a package for analysis of spatial data written for # the R software environment. # Copyright (C) 2022 Colorado School of Mines # 1500 Illinois St., Golden, CO 80401 # Contact: Douglas Nychka, douglasnychka@gmail.edu, # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with the R software environment if not, write to the Free Software # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA # or see http://www.r-project.org/Licenses/GPL-2 ##END HEADER "discretize.image" <- function(x, m = 64, n = 64, grid = NULL, expand = c(1+ 1e-8, 1+1e-8), boundary.grid = FALSE, na.rm=TRUE) { # # NOTE m and n are ignored if grid is passed with $x and $y. if (length(expand) == 1){ expand <- rep(expand, 2) } if (is.null(grid)) { # if grid is not given create a midpoint grid first xr <- range(x[, 1], na.rm = na.rm) deltemp <- (xr[2] - xr[1]) * (expand[1] - 1) * 0.5 gridX <- seq(xr[1] - deltemp, xr[2] + deltemp, , m) yr <- range(x[, 2], na.rm = na.rm) deltemp <- (yr[2] - yr[1]) * (expand[2] - 1) * 0.5 gridY <- seq(yr[1] - deltemp, yr[2] + deltemp, , n) grid <- list(x= gridX, y=gridY) # convert to boundary grid if needed if( boundary.grid){ grid$x<- fields.convert.grid(grid$x) grid$y<- fields.convert.grid(grid$y) } } if (!boundary.grid) { # find cut points for boundaries assuming grid has midpoints xcut <- fields.convert.grid(grid$x) ycut <- fields.convert.grid(grid$y) } else { # cut points given boundaries xcut <- grid$x ycut <- grid$y } # at this point the xcut and ycut are a boundary grid # even if passed as midpoints. # bin ids for each location # cat("call to discretize.image", fill=TRUE) withinGrid<- (x[,1] >= min(xcut)) & (x[,1] <= max(xcut)) & (x[,2] >= min(ycut)) & (x[,2] <= max(ycut)) ##################FIX THIS ################### index1 <- findInterval(x[, 1], xcut , left.open=FALSE, rightmost.closed=TRUE) index2 <- findInterval(x[, 2], ycut , left.open=FALSE, rightmost.closed=TRUE ) if( any(!withinGrid)){ warning("Some locations are outside the range of the grid") index1[!withinGrid]<- NA index2[!withinGrid]<- NA } tempHist<- table( index1, index2) ix<- as.numeric(dimnames( tempHist)[[1]]) iy<- as.numeric(dimnames( tempHist)[[2]]) # 2 d histogram of locations mBin <- length( xcut) - 1 nBin <- length( ycut) - 1 hist<- matrix( 0, mBin,nBin) hist[ix,iy] <- tempHist # save discretized locations xMidpoints<- (xcut[1:mBin] + xcut[2:(mBin+1)])/2 yMidpoints<- (ycut[1:nBin] + ycut[2:(nBin+1)])/2 loc <- cbind( xMidpoints[ index1[withinGrid] ], yMidpoints[ index2[withinGrid] ] ) return( list( m=mBin,n=nBin, grid=grid, index=data.frame(index1, index2), withinGrid=withinGrid, ix= ix, iy=iy, hist=hist, loc=loc) ) } fields/R/bubblePlot.R0000644000176200001440000000345014453562431014147 0ustar liggesusers# bubblePlot fix bubblePlot<- function (x, y, z, col = viridisLite::viridis(256), zlim = NULL, horizontal = FALSE, legend.cex = 1, legend.lab = NULL, legend.line = 2, legend.shrink = 0.9, legend.width = 1.2, legend.mar = ifelse(horizontal, 3.1, 5.1), axis.args = NULL, legend.args = NULL, size = 1, add = FALSE, legendLayout = NULL, highlight = TRUE, highlight.color = "grey30", ...) { x <- as.matrix(x) if (dim(x)[2] == 2) { z <- y y <- x[, 2] x <- x[, 1] } ctab = color.scale(z, col, zlim = zlim) if (!add & is.null(legendLayout)) { legendLayout <- setupLegend(legend.shrink = legend.shrink, legend.width = legend.width, legend.mar = legend.mar, horizontal = horizontal) } if (!add) { plot(x, y, col = ctab, cex = size, pch = 16, ...) } else { points(x, y, cex = size, col = ctab, pch = 16) } if (highlight) { points(x, y, cex = size, col = highlight.color) } big.par <- par(no.readonly = TRUE) mfg.save <- par()$mfg if (!add | !is.null(legendLayout)) { levelsZ <- attr(ctab, "levelsZ") if ((is.null(axis.args)) & (!is.null(levelsZ))) { axis.args = list(at = 1:length(levelsZ), labels = levelsZ) } addLegend(legendLayout, col = attr(ctab, "col"), zlim = attr(ctab, "zlim"), axis.args = axis.args, legend.args = legend.args, legend.cex = legend.cex, legend.lab = legend.lab, legend.line = legend.line) } par(plt = big.par$plt, xpd = FALSE) par(mfg = mfg.save, new = FALSE) } fields/R/simSpatialData.R0000644000176200001440000000562114275252303014753 0ustar liggesusers# # fields is a package for analysis of spatial data written for # the R software environment. # Copyright (C) 2022 Colorado School of Mines # 1500 Illinois St., Golden, CO 80401 # Contact: Douglas Nychka, douglasnychka@gmail.edu, # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with the R software environment if not, write to the Free Software # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA # or see http://www.r-project.org/Licenses/GPL-2 ##END HEADER simSpatialData<- function(object, M = 1, verbose = FALSE) { # object is assummed to have the spatial model according to the # components in a spatialProcess or mKrig object # important variance parameters estimated from the data tau <- (object$summary["tau"]) # set tau2 equal to zero if not there if( is.null(tau)){ tau <- 0} # sigma2 <- object$summary["sigma2"] # xUnique<- object$x if( any( duplicated(xUnique)) ){ stop('Can not handle repeated prediction locations')} N.full <- nrow(xUnique) if (verbose) { cat("N.full", N.full, fill = TRUE) } if( N.full > 5000){ cat("WARNING: Number of locations for simulation is large ( >5000) this may take some time to compute or exhaust the memory.", fill=FALSE) } # # Sigma is full covariance at the data locations and at prediction points. # not to be confused with the lowercase tau that is the nugget variance # Sigma <- sigma2 * do.call(object$cov.function.name, c(object$args, list(x1 = xUnique, x2 = xUnique))) # # square root of Sigma for simulating field # Cholesky is fast but not very stable. # # the following code line is similar to chol(Sigma)-> Scol # but adds possible additional arguments controlling the Cholesky # from the mKrig object. # x has has been winnowed down to unique rows so that # Sigma has full rank. # Schol <- do.call("chol", c(list(x = Sigma), object$chol.args)) # h.data <- t(Schol) %*% matrix( rnorm(N.full*M), N.full,M) # value of simulated field at observations out<- h.data # add measurement error (aka the "nugget") if( tau > 0){ nugget.error<- tau*matrix( rnorm(N.full*M), N.full,M)/object$weights out<- out + nugget.error } # return( out) } fields/R/print.summary.Krig.R0000644000176200001440000000762414275252303015603 0ustar liggesusers# # fields is a package for analysis of spatial data written for # the R software environment. # Copyright (C) 2022 Colorado School of Mines # 1500 Illinois St., Golden, CO 80401 # Contact: Douglas Nychka, douglasnychka@gmail.edu, # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with the R software environment if not, write to the Free Software # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA # or see http://www.r-project.org/Licenses/GPL-2 ##END HEADER "print.summary.Krig" <- function(x, ...) { digits <- x$digits c1 <- "Number of Observations:" c2 <- x$num.observation c1 <- c(c1, "Number of unique points:") c2 <- c(c2, x$num.uniq) # # print out null space poly info only if 'm' is used if (!is.null(x$args.null$m)) { c1 <- c(c1, "Degree of polynomial null space ( base model):") c2 <- c(c2, x$m - 1) } c1 <- c(c1, "Number of parameters in the null space") c2 <- c(c2, x$nt) c1 <- c(c1, "Parameters for fixed spatial drift") c2 <- c(c2, x$df.drift) c1 <- c(c1, "Effective degrees of freedom:") c2 <- c(c2, format(round(x$enp, 1))) c1 <- c(c1, "Residual degrees of freedom:") c2 <- c(c2, format(round(x$num.observation - x$enp, 1))) c1 <- c(c1, "MLE tau ") c2 <- c(c2, format(signif(x$tauHat.MLE, digits))) c1 <- c(c1, "GCV tau ") c2 <- c(c2, format(signif(x$tauHat.GCV, digits))) if (!is.na(x$tauHat.pure.error)) { c1 <- c(c1, "Pure error tau") c2 <- c(c2, format(signif(x$tauHat.pure.error, digits))) } c1 <- c(c1, "MLE sigma ") c2 <- c(c2, format(signif(x$sigmahat, digits))) c1 <- c(c1, "Scale passed for covariance (sigma)") c2 <- c(c2, signif(x$sigma, digits)) c1 <- c(c1, "Scale passed for nugget (tau^2)") c2 <- c(c2, signif(x$tau2, digits)) c1 <- c(c1, "Smoothing parameter lambda") c2 <- c(c2, signif(x$lambda, digits)) sum <- cbind(c1, c2) dimnames(sum) <- list(rep("", dim(sum)[1]), rep("", dim(sum)[2])) res.quantile <- x$res.quantile names(res.quantile) <- c("min", "1st Q", "median", "3rd Q", "max") cat("CALL:\n") dput(x$call) print(sum, quote = FALSE) cat("\n") cat("Residual Summary:", fill = TRUE) print(signif(res.quantile, digits)) cat("\n") cat("Covariance Model:", x$cov.function, fill = TRUE) if (x$cov.function == "stationary.cov") { cat(" Covariance function is ", x$args$Covariance, fill = TRUE) } if (!is.null(x$args)) { cat(" Names of non-default covariance arguments: ", fill = TRUE) cat(" ", paste(as.character(names(x$args)), collapse = ", "), fill = TRUE) } if ((x$correlation.model)) { cat(" A correlation model was fit:\nY is standardized before spatial estimate is found", fill = TRUE) } if (x$knot.model) { cat(" Knot model: ", x$np - x$nt, " knots supplied to define basis\nfunctions", fill = TRUE) } cat("\n") cat("DETAILS ON SMOOTHING PARAMETER:", fill = TRUE) cat(" Method used: ", x$method, " Cost: ", x$cost, fill = TRUE) print(x$sum.gcv.lambda, digits = digits) cat("\n") cat(" Summary of all estimates found for lambda", fill = TRUE) if (!is.na(x$lambda.est[1])) { print(x$lambda.est, digits = x$digits) } else { cat(x$lambda, " supplied by user", fill = TRUE) } invisible(x) } fields/R/addLegend.R0000644000176200001440000000342114275252302013715 0ustar liggesusers# # fields is a package for analysis of spatial data written for # the R software environment. # Copyright (C) 2022 Colorado School of Mines # 1500 Illinois St., Golden, CO 80401 # Contact: Douglas Nychka, douglasnychka@gmail.edu, # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with the R software environment if not, write to the Free Software # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA # or see http://www.r-project.org/Licenses/GPL-2 ##END HEADER addLegend<- function(legendLayout, col, zlim, axis.args = NULL, legend.args = NULL, legend.cex = 1.0, legend.lab = NULL, legend.line = 2 ){ info<- legendLayout imagePlot( legend.only=TRUE, add=TRUE, smallplot = info$smallplot, col= col, zlim = zlim, legend.lab = legend.lab, legend.line= legend.line, axis.args = axis.args, legend.args = legend.args, legend.cex = legend.cex, legend.shrink = info$legend.shrink, legend.mar = info$legend.mar, legend.width = info$legend.width, horizontal = info$horizontal ) } fields/R/describe.R0000644000176200001440000000316314275252303013632 0ustar liggesusers# # fields is a package for analysis of spatial data written for # the R software environment. # Copyright (C) 2022 Colorado School of Mines # 1500 Illinois St., Golden, CO 80401 # Contact: Douglas Nychka, douglasnychka@gmail.edu, # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with the R software environment if not, write to the Free Software # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA # or see http://www.r-project.org/Licenses/GPL-2 ##END HEADER "describe" <- function(x) { lab <- c("N", "mean", "Std.Dev.", "min", "Q1", "median", "Q3", "max", "missing values") if (missing(x)) { return(lab) } temp <- rep(0, length(lab)) xt <- x[!is.na(x)] ix <- order(xt) n <- length(xt) if (!is.numeric(xt) || all(is.na(x))) { return(c(n, rep(NA, length(lab) - 2), length(x) - length(xt))) } if (n == 1) { return(c(n, xt[1], NA, rep(xt[1], 5), length(x) - length(xt))) } else { return(c(n, mean(xt), sqrt(var(xt)), min(xt), quantile(xt, c(0.25, 0.5, 0.75)), max(xt), length(x) - length(xt))) } } fields/R/ribbon.plot.R0000644000176200001440000000321714275252303014302 0ustar liggesusers# # fields is a package for analysis of spatial data written for # the R software environment. # Copyright (C) 2022 Colorado School of Mines # 1500 Illinois St., Golden, CO 80401 # Contact: Douglas Nychka, douglasnychka@gmail.edu, # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with the R software environment if not, write to the Free Software # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA # or see http://www.r-project.org/Licenses/GPL-2 ##END HEADER ribbon.plot <- function(x, y, z, zlim = NULL, col = tim.colors(256), transparent.color = "white", ...) { N <- length(x) x1 <- (x[1:(N - 1)] + x[2:(N)])/2 y1 <- (y[1:(N - 1)] + y[2:(N)])/2 x1 <- c(x[1] - (x[2] - x[1])/2, x1, x[N] + (x[N] - x[N - 1])/2) y1 <- c(y[1] - (y[2] - y[1])/2, y1, y[N] + (y[N] - y[N - 1])/2) eps <- 1e-07 if (is.null(zlim)) { zlim <- range(c(z), na.rm = TRUE) } # convert z values to a color scale. colz <- color.scale(z, col = col, transparent.color = transparent.color) segments(x1[1:(N)], y1[1:(N)], x1[2:(N + 1)], y1[2:(N + 1)], col = colz, ...) } fields/R/fields.color.picker.R0000644000176200001440000000407414275252303015713 0ustar liggesusers# # fields is a package for analysis of spatial data written for # the R software environment. # Copyright (C) 2022 Colorado School of Mines # 1500 Illinois St., Golden, CO 80401 # Contact: Douglas Nychka, douglasnychka@gmail.edu, # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with the R software environment if not, write to the Free Software # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA # or see http://www.r-project.org/Licenses/GPL-2 ##END HEADER fields.color.picker <- function() { c(mar = c(0, 0, 3, 0)) # names of colors in default graphics options. clab <- colors() n <- length(clab) N <- ceiling(sqrt(n)) M <- N temp <- rep(NA, M * N) temp[1:n] <- 1:n z <- matrix(temp, M, N) # matrix of all colors image(seq(0.5, M + 0.5, , M + 1), seq(0.5, N + 0.5, , N + 1), z, col = clab, axes = FALSE, xlab = "", ylab = "") cat("Use mouse to identify color", fill = TRUE) loc <- locator(1) i <- round(loc$x) j <- round(loc$y) ind <- z[i, j] points(i, j, col = clab[ind], cex = 4, pch = "O") points(i, j, pch = "+", col = "black", cex = 1) mtext(side = 3, text = clab[ind], col = clab[ind], line = 1, cex = 2) # write out RGB values to console cat("ID ", ind, " name ", clab[ind], fill = TRUE) cat("RGB", col2rgb(clab[ind])/256, fill = TRUE) temp <- signif(col2rgb(clab[ind])/256, 3) # This line is marginally in LaTeX format to define color cat(clab[ind], " {rgb}{", temp[1], ",", temp[2], ",", temp[3], "}", fill = TRUE) } fields/R/mKrigMLEJoint.R0000644000176200001440000002522214341543337014471 0ustar liggesusers# # fields is a package for analysis of spatial data written for # the R software environment. # Copyright (C) 2022 Colorado School of Mines # 1500 Illinois St., Golden, CO 80401 # Contact: Douglas Nychka, douglasnychka@gmail.edu, # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with the R software environment if not, write to the Free Software # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA # or see http://www.r-project.org/Licenses/GPL-2 ##END HEADER mKrigMLEJoint<- function(x, y, weights = rep(1, nrow(x)), Z = NULL, ZCommon = NULL, mKrig.args = NULL, na.rm = TRUE, cov.function = "stationary.cov", cov.args = NULL, cov.params.start = NULL, optim.args = NULL, reltol = 1e-6, parTransform = NULL, REML = FALSE, GCV = FALSE, hessian = FALSE, iseed = 303, verbose = FALSE) { # overwrite basic data to remove NAs this has be done in case distance # matrices are precomputed (see below) if( na.rm){ obj<- mKrigCheckXY(x, y, weights, Z, ZCommon, na.rm) x<- obj$x y<- obj$y weights<- obj$weights Z<- obj$Z ZCommon<- obj$ZCommon } # main way to keep track of parameters to optimize # lambda is included if lambda.fixed is NULL # (most of the time one would want to optimize over lambda parameter) parNames <- names(cov.params.start) # precompute distance matrix if possible so it only needs to be computed once supportsDistMat = supportsArg(cov.function, "distMat") if(supportsDistMat & is.null( cov.args$distMat)) { #Get distance function and arguments if available # Dist.fun= c(cov.args)$Distance Dist.args=c(cov.args)$Dist.args #If user left all distance settings NULL, use rdist with compact option. #Use rdist function by default in general. # if(is.null(Dist.fun)) { Dist.fun = "rdist" if(is.null(Dist.args)) Dist.args = list(compact=TRUE) } distMat = do.call(Dist.fun, c(list(x), Dist.args)) #add precomputed distance matrix to the cov.args cov.args = c(cov.args, list(distMat=distMat, onlyUpper=TRUE)) } # these are all the arguments needed to call mKrig except cov.args # if lambda is then it has been added to mKrig.args # if lambda.start then it is part of the parameter names and will # added in the cov.args list mKrig.args <- c(list(x = x, y = y, weights = weights, Z = Z, ZCommon = ZCommon ), mKrig.args, list(cov.function=cov.function) ) if( verbose){ cat("Info from mKrigJoint:",fill=TRUE) cat("Argument names in full mKrig.args: ", fill=TRUE) print( names(mKrig.args) ) cat("Full cov.args names:\n ", names( cov.args), fill=TRUE) cat("Parameters to optimze: ", parNames, length( parNames), fill=TRUE) cat("Starting values (cov.params.start) : ", fill=TRUE) print( cov.params.start) } if(!GCV){ nameCriterion<- ifelse( !REML, "lnProfileLike.FULL", "lnProfileREML.FULL" ) } else{ nameCriterion<-"GCV" } if(verbose){ cat("nameCriterion", nameCriterion, fill=TRUE) } callOptim<- !is.null(cov.params.start) & length(parNames) > 0 ########################################################################## ###### main if else block ########################################################################## if(callOptim){ ######################################################### ### actually do something #set default optim.args if necessary # abstol is anticipating this is a log likelihood so differencs of 1e-4 are not appreciable # # setup control parameters for optim .... if( length(cov.params.start)==0){ stop("On no! Found zero parameters to optimize!") } if(is.null(optim.args)){ # number of step sizes either include lambda as a parameter or not. ndeps<- rep(log(1.1), length( parNames) ) optim.args = list(method = "BFGS", hessian = hessian, control=list(fnscale = -1, ndeps = ndeps, reltol = reltol, maxit = 20) ) } if( is.null(parTransform)){ # parTransform: log/exp parTransform<- function( ptemp, inv=FALSE){ if( !inv){ log( ptemp)} else{ exp(ptemp) } } } # capture.evaluations <- NULL capture.env <- environment() # call to optim with initial start (default is log scaling ) # init.start <- parTransform( unlist(c(cov.params.start)), inv=FALSE) if( verbose){ cat("Transformed starting values ","\n", init.start, fill=TRUE) } # and now the heavy lifting ... # optimize over (some) covariance parameters and possibly lambda # wrapping in try allows for error catching optimResults <-try( do.call(optim, c(list(par=init.start), list(mKrigJointTemp.fn), optim.args, list( parNames = parNames, parTransform = parTransform, mKrig.args = mKrig.args, cov.args = cov.args, capture.env = capture.env, REML = REML, GCV = GCV, verbose = verbose) ) ) ) # catch error in optim and return if( is(optimResults, "try-error") ){ cat("Error in call to optim", fill=TRUE) out =list( summary = NA, lnLikeEvaluations = capture.evaluations[-1,], init.start= init.start, optim.args= optim.args ) return( out) } # reformat the optim results lnLikeEvaluations <- capture.evaluations[-1,] # first row is just NAs if( verbose){ cat("Captured evaluations from optim: ", fill=TRUE) print(lnLikeEvaluations) } #ind<- which(lnLikeEvaluations[ , nameCriterion] # == optimResults$value ) #ind<- max(ind) optim.counts <- optimResults$counts parOptimum<- parTransform(optimResults$par, inv=TRUE) names( parOptimum)<- parNames # update parameter start values with converged ones # note that lambda may be part of this cov.params.final<- as.list(parOptimum) } ########################################################################## ###### end if block ########################################################################## else{ # no optimization required, just setup for a single evaluation cov.params.final <- NULL lnLike.eval <- NA optimResults <- NULL optim.counts <- NA parOptimum <- NULL lnLikeEvaluations<- NULL if( verbose){ cat("fast return in mKrigMLEJoint", fill=TRUE) } } ######################################################### ### just evaluate ### at final parameters and also find the trace and GCV ######################################################### cov.args.final<- c( cov.args, cov.params.final) fastObject <- do.call("mKrig", c(mKrig.args, iseed= iseed, cov.args.final) )$summary ######################################################### summary <- c( fastObject, optim.counts, parOptimum ) out =list( summary = summary, pars.MLE = parOptimum , parTransform = parTransform, optimResults = optimResults , lnLikeEvaluations = lnLikeEvaluations) return(out) } # Define the objective function as a tricksy call to mKrig # if y is a matrix of replicated data sets use the log likelihood for the complete data sets mKrigJointTemp.fn <- function(parameters, mKrig.args, cov.args, parTransform, parNames, REML=FALSE, GCV= FALSE, verbose = verbose, capture.env) { verbose<- FALSE # turn off verbose # optimization is over a transformed scale ( so need to back transform for mKrig) tPars<- parTransform( parameters, inv=TRUE) names( tPars)<- parNames #get all this eval's covariance arguments using the input parameters cov.args.temp = c(cov.args, tPars) if( verbose){ cat("pars in call to objective function:", fill=TRUE) print(tPars ) } # NOTE: FULL refers to estimates collapsed across the replicates if Y is a matrix # NOTE cov.args.temp can also include lambda as a component. # due to the flexibility in arguments to mKrig ( I.e. the ... argument) # any covariance arguments in cov.args.temp are matched to existing mKrig arguments # in particular lambda, the remaining unmatched arguments are assumed to be for the # covariance function and used within mKrig in the call to cov.fun # # Don't find approx trace of A for log likelihood evaluations. mKrig.argsTemp<- mKrig.args if( !GCV){ mKrig.argsTemp$find.trA<- FALSE } # the summary vector from the mKrig object has everything we need ... hold <- do.call("mKrig", c(mKrig.argsTemp,cov.args.temp) )$summary # add this evalution to an object (i.e. here a matrix) in the calling frame temp.eval <- get("capture.evaluations", envir=capture.env) assign("capture.evaluations", rbind(temp.eval, c(parTransform(parameters, inv=TRUE), hold) ), envir = capture.env) if( !GCV){ objectiveFunction <- ifelse(REML, hold["lnProfileREML.FULL"], hold["lnProfileLike.FULL"]) } else{ objectiveFunction <- -1* hold["GCV"] } # cat("objective Function",objectiveFunction, fill=TRUE) return( objectiveFunction) } fields/R/bplot.family.R0000644000176200001440000000407714275252302014456 0ustar liggesusers# # fields is a package for analysis of spatial data written for # the R software environment. # Copyright (C) 2022 Colorado School of Mines # 1500 Illinois St., Golden, CO 80401 # Contact: Douglas Nychka, douglasnychka@gmail.edu, # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with the R software environment if not, write to the Free Software # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA # or see http://www.r-project.org/Licenses/GPL-2 ##END HEADER bplot <- function(x, by, pos = NULL, at = pos, add = FALSE, boxwex = 0.8, xlim = NULL, ...) { if (!missing(by)) { x <- split(c(x), as.factor(by)) } if (!add & !is.null(at) & is.null(xlim)) { xlim <- range(at) } if (!is.null(at)) { boxwex <- boxwex * min(diff(sort(at))) } boxplot(x, at = at, xlim = xlim, add = add, boxwex = boxwex, ...) } bplot.xy<- function (x, y, N = 10, breaks = pretty(x, N, eps.correct = 1), plot = TRUE,axes=TRUE, ...) { NBIN <- length(breaks) - 1 centers <- (breaks[1:NBIN] + breaks[2:(NBIN + 1)])/2 obj <- split(y, cut(x, breaks)) if (length(obj) == 0) { stop("No points within breaks") } if (plot) { bplot(obj, at = centers, show.names = FALSE, axes = axes, ...) if( axes){ axis(1) } } else { return(list(centers = centers, breaks = breaks, boxplot.obj = boxplot(obj, plot = FALSE))) } } fields/R/predictSurface.Krig.R0000644000176200001440000000555614275252303015720 0ustar liggesusers# # fields is a package for analysis of spatial data written for # the R software environment. # Copyright (C) 2022 Colorado School of Mines # 1500 Illinois St., Golden, CO 80401 # Contact: Douglas Nychka, douglasnychka@gmail.edu, # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with the R software environment if not, write to the Free Software # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA # or see http://www.r-project.org/Licenses/GPL-2 ##END HEADER "predictSurface.Krig" <- function(object, grid.list = NULL, extrap = FALSE, chull.mask = NA, nx = 80, ny = 80, xy = c(1,2), verbose = FALSE, ZGrid=NULL, drop.Z= FALSE, just.fixed=FALSE, ...) { if( is.null(ZGrid) & !drop.Z & (!is.null(object$Z)) ) { stop("Need to specify covariate (Z) values or set drop.Z==TRUE") } # create a default grid if it is not passed if (is.null(grid.list)) { # in more than 2-D # default is 80X80 grid on first two variables # rest are set to median value of the x's grid.list <- fields.x.to.grid(object$x, nx = nx, ny = ny, xy = xy) } # do some checks on Zgrid and also reshape as a matrix # rows index grid locations and columns are the covariates # (as Z in predict). # if ZGrid is NULL just returns that back Z<- unrollZGrid( grid.list, ZGrid) xg <- make.surface.grid(grid.list) # NOTE: the predict function called will need to do some internal the checks # whether the evaluation of a large number of grid points (xg) makes sense. if( verbose){ print( dim( xg)) print( nrow( xg)) print( drop.Z) print( dim( Z)) } # if extrapolate is FALSE set all values outside convex hull to NA if (!extrap) { if( is.null( object$x)){ stop("need and x matrix in object") } if (is.na(chull.mask)) { chull.mask <- unique.matrix(object$x[, xy]) } indexGood<- in.poly(xg[, xy], xp = chull.mask, convex.hull = TRUE) if( verbose){ print( sum( indexGood) ) } } else{ indexGood<- rep( TRUE, nrow( xg)) } out<- rep( NA, nrow(xg)) # here is the heavy lifting out[indexGood] <- predict(object, x=xg[indexGood,], Z=Z[indexGood,], drop.Z= drop.Z, just.fixed=just.fixed, ...) # reshape as list with x, y and z components out <- as.surface( xg, out ) # # return(out) } fields/R/cubic.cov.R0000644000176200001440000000370214275252303013724 0ustar liggesusers# # fields is a package for analysis of spatial data written for # the R software environment. # Copyright (C) 2022 Colorado School of Mines # 1500 Illinois St., Golden, CO 80401 # Contact: Douglas Nychka, douglasnychka@gmail.edu, # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with the R software environment if not, write to the Free Software # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA # or see http://www.r-project.org/Licenses/GPL-2 ##END HEADER cubic.cov <- function(x1, x2=NULL, aRange = 1, C = NA, marginal = FALSE, theta=NULL) { # comments in Exp.simple.cov for more details about the # required parts of this covariance # theta argument has been deopreciated. if( !is.null( theta)){ aRange<- theta } if (is.matrix(x1)) { if (ncol(x1) != 1) { stop(" x is a matrix this is a 1-d covariance") } } if( is.null( x2) ){ x2<- x1 } # local function fun.temp <- function(u, v) { 1 + ifelse(u < v, v * (u^2)/2 - (u^3)/6, u * (v^2)/2 - (v^3)/6) } if (is.na(C[1]) & !marginal) { # cross covariance matrix return(outer(c(x1), c(x2), FUN = fun.temp)) } if (!is.na(C[1])) { # product of cross covariance with a vector return(outer(c(x1), c(x2), FUN = fun.temp) %*% C) } if (marginal) { # marginal variance return((x1^3)/3) } } fields/R/Krig.R0000644000176200001440000003337214342025706012753 0ustar liggesusers# # fields is a package for analysis of spatial data written for # the R software environment. # Copyright (C) 2022 Colorado School of Mines # 1500 Illinois St., Golden, CO 80401 # Contact: Douglas Nychka, douglasnychka@gmail.edu, # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with the R software environment if not, write to the Free Software # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA # or see http://www.r-project.org/Licenses/GPL-2 ##END HEADER "Krig" <- function(x, Y, cov.function = "stationary.cov", lambda = NA, df = NA, GCV = FALSE, Z = NULL, cost = 1, weights = NULL, m = 2, nstep.cv = 200, scale.type = "user", x.center = rep(0, ncol(x)), x.scale = rep(1, ncol(x)), sigma = NA, tau2 = NA, method = "REML", verbose = FALSE, null.function = "Krig.null.function", wght.function = NULL, offset = 0, na.rm = TRUE, cov.args = NULL, chol.args = NULL, null.args = NULL, wght.args = NULL, W = NULL, give.warnings = TRUE, mean.obj = NA, sd.obj = NA, ...) # the verbose switch prints many intermediate steps as an aid in debugging. # { # # create output list out <- list() ########################################################### # First series of steps simply store pieces of the passed # information to the output list (i.e. the Krig object) ########################################################## out$call <- match.call() # turn off warning based on options if( options()$warn < 0 ){ give.warnings<- FALSE } if( !is.na(mean.obj)|!is.na(sd.obj)){ stop( "correlation model no longer supported please use fields version 11.6") } # # save covariance function as its name # if( !is.character( cov.function)){ out$cov.function.name <- as.character(substitute(cov.function)) } else{ out$cov.function.name<-cov.function } # # save null space function as its name # out$null.function.name <- as.character(substitute(null.function)) # # save weight function as its name if it is not a NULL # if (is.null(wght.function)) { out$wght.function.name <- NULL } else { out$wght.function.name <- as.character(substitute(wght.function)) } out$W <- W if (verbose) { print(out$cov.function.name) print(out$null.function.name) print(out$wght.function.name) } # # logical to indicate if the 'C' argument is present in cov.function # -- a bit of esoteric R code! C.arg.missing <- all(names(formals(get(out$cov.function.name))) != "C") if (C.arg.missing) stop("Need to have C argument in covariance function\nsee Exp.cov.simple as an example") # # save parameters values possibly passed to the covariance function # also those added to call are assumed to be covariance arguments. if (!is.null(cov.args)) out$args <- c(cov.args, list(...)) else out$args <- list(...) # # default values for null space function out$null.args <- null.args # # set degree of polynomial null space if this is default # mkpoly is used so often is it helpful to include m argument # by default in Krig call. if (out$null.function.name == "Krig.null.function") { out$null.args <- list(m = m) out$m <- m } # # default values for Cholesky decomposition, these are important # for sparse matrix decompositions used in Krig.engine.fixed. if (is.null(chol.args)) { out$chol.args <- list(pivot = FALSE) } else { out$chol.args <- chol.args } # additional arguments for weight matrix. out$wght.args <- wght.args # # the offset is the effective number of parameters used in the GCV # calculations -- unless this is part of an additive model this # is likely zero out$offset <- offset # # the cost is the multiplier applied to the GCV eff.df # # lambda and df are two ways of parameterizing the smoothness # and are related by a monotonic function that unfortunately # depends on the locations of the data. # lambda can be used directly in the linear algebra, df # must be transformed to lambda numerically using the monotonic trransformation # tau2 is the error variance and sigma the multiplier for the covariance # method is how to determine lambda # the GCV logical forces the code to do the more elaborate decompositions # that faclitate estimating lambda -- even if a specific lambda value is # given. out$cost <- cost out$lambda <- lambda out$eff.df <- df out$tau2 <- tau2 out$sigma <- sigma out$method <- method out$GCV <- GCV # # correlation model information # set this to FALSE -- has been depreciated. # out$correlation.model <- FALSE # # transformation info out$scale.type <- scale.type out$x.center <- x.center out$x.scale <- x.scale # if (verbose) { cat(" Cov function arguments in call ", fill = TRUE) print(out$args) cat(" covariance function used is : ", fill = TRUE) print(out$cov.function.name) } ############################################################### # Begin modifications and transformations of input information # note that many of these manipulations follow a strategy # of passing the Krig object (out) to a function and # then appending the information from this function to # the Krig object (usually also called "out"). #In this way the Krig object is built up # in steps and the process is easier to follow. ############################################################### # various checks on x and Y including removal of NAs in Y # Here is an instance of adding to the Krig object # in this case also some onerous bookkeeping making sure arguments are consistent out2 <- Krig.check.xY(x, Y, Z, weights, na.rm, verbose = verbose) out <- c(out, out2) # find replicates and collapse to means and pool variances. # Transform unique x locations out2 <- Krig.transform.xY(out, verbose = verbose) out <- c(out, out2) # NOTE: knots have been transformed after this step ############################################################# # Figure out what to do ############################################################# # # this functions works through the logic of # what has been supplied for lambda out2 <- Krig.which.lambda(out) out[names(out2)] <- out2 # Make weight matrix for observations # ( this is proportional to the inverse square root of obs covariance) # if a weight function or W has not been passed then this is # diag( out$weightsM) for W # The checks represent a limitation of this model to # the WBW type decoposition and no replicate observations. out$nondiag.W <- (!is.null(wght.function)) | (!is.null(W)) # Do not continue if there there is a nondiagonal weight matrix # and replicate observations. if (out$nondiag.W) { if (out$knot.model | out$fixed.model) { stop("Non diagonal weight matrix for observations not supported\nwith knots or fixed lambda.") } if (!is.na(out$tauHat.pure.error)) { stop("Non diagonal weight matrix not implemented with replicate locations") } } # make weight matrix and its square root having passed checks out <- c(out, Krig.make.W(out, verbose = verbose)) # Do the intensive linear algebra to find the solutions # this is where all the heavy lifting happens. # # Note that all the information is passed as a list # including arguments to the cholesky decomposition # used within Krig.engine.fixed # # The results are saved in the component matrices # # if method=='user' then just evaluate at single lambda # fixed here means a fixed lambda # # For fixed lambda the decompositions with and without knots # are surprisingly similar and so are in one engine. ########################################################### if (out$fixed.model) { out$matrices <- Krig.engine.fixed(out, verbose = verbose) # The trace of A matrix in fixed lambda case is not easily computed # so set this to NA. out$eff.df <- NA } # alternative are # matrix decompositions suitable for # evaluation at many lambdas to facilitate GCV/REML estimates etc. # else{ # standard engine following the basic computations for thin plate splines out$matrices <- Krig.engine.default(out, verbose = verbose) # store basic information about decompositions } out$nt <- out$matrices$nt out$np <- out$matrices$np out$decomp <- out$matrices$decomp # # Now determine a logical vector to indicate coefficients tied to the # the 'spatial drift' i.e. the fixed part of the model # that is not due to the Z covariates. # NOTE that the spatial drift coefficients must be the first columns of the # M matrix if (is.null(out$Z)) { out$ind.drift <- rep(TRUE, out$nt) } else { mZ <- ncol(out$ZM) out$ind.drift <- c(rep(TRUE, out$nt - mZ), rep(FALSE, mZ)) } if (verbose) { cat("null df: ", out$nt, "drift df: ", sum(out$ind.drift), fill = TRUE) } ################################################# # Do GCV and REML search over lambda if not fixed or if GCV variable is TRUE # also does a search over likelihood for lambda. ################################################# if (!out$fixed.model | out$GCV) { if (verbose) { cat("call to KrigFindLambda", fill = TRUE) } gcv.out <- KrigFindLambda(out, nstep.cv = nstep.cv, verbose = verbose, cost = out$cost, offset = out$offset, give.warnings=FALSE) out$gcv.grid <- gcv.out$gcv.grid # save a handy summary table of the search results out$lambda.est <- gcv.out$lambda.est out$warningTable<- gcv.out$warningTable if( verbose){ cat("summaries from grid search/optimization", fill=TRUE) print(out$lambda.est) print(out$warningTable) } if( give.warnings){ #NOTE: only print out grid search warning for the method of interest. printGCVWarnings( gcv.out$warningTable, method=method) } # assign the preferred lambda either from GCV/REML/MSE or the user value # NOTE: gcv/reml can be done but the estimate is # still evaluted at the passed user values of lambda (or df) # If df is passed need to calculate the implied lambda value if (out$method != "user") { out$lambda <- gcv.out$lambda.est[out$method, 1] out$eff.df <- out$lambda.est[out$method, 2] } else { if (!is.na(out$eff.df)) { out$lambda <- Krig.df.to.lambda(out$eff.df, out$matrices$D) } else { out$eff.df <- Krig.ftrace(out$lambda, out$matrices$D) } # add in values to GCV table using these values # this the 7th row. lam.user <- out$lambda info<- gcv.out$info newRow<- c( lam.user, out$eff.df, Krig.fgcv(lam.user, info), sqrt(Krig.fs2hat(lam.user, info)), Krig.flplike(lam.user, info), NA ) out$lambda.est <- rbind( out$lambda.est,user = newRow) } } ########################## # end GCV/REML block ########################## # # Now we clean up what has happened and stuff # information into output object. # ########################################## # find coeficients at prefered lambda # and evaluate the solution at observations ########################################## # pass replicate group means -- no need to recalculate these. out2 <- Krig.coef(out, yM = out$yM, verbose = verbose) out <- c(out, out2) ####################################################################### # fitted values and residuals and predicted values for full model and # also on the null space (fixed # effects). But be sure to do this at the nonmissing x's. ################################################################## out$fitted.values <- predict.Krig(out, x = out$x, Z = out$Z, eval.correlation.model = FALSE) out$residuals <- out$y - out$fitted.values # # this is just M%*%d note use of do.call using function name Tmatrix <- do.call(out$null.function.name, c(out$null.args, list(x = out$x, Z = out$Z))) out$fitted.values.null <- as.matrix(Tmatrix) %*% out$d # # verbose block if (verbose) { cat("residuals", out$residuals, fill = TRUE) } # # find various estimates of tau and sigma out2 <- Krig.parameters(out) out <- c(out, out2) ################################################ # assign the 'best' model as a default choice # either use the user supplied values or the results from # optimization ################################################ passed.tau2 <- (!is.na(out$tau2)) if (out$method == "user" & passed.tau2) { out$best.model <- c(out$lambda, out$tau2, out$sigma) } else { # in this case lambda is from opt. or supplied by user out$best.model <- c(out$lambda, out$tauHat.MLE^2, out$sigmahat) } # Note: values in best.model are used in subsquent functions as the choice # for these parameters! # set class ########################## out$rhohat<- out$sigmahat class(out) <- c("Krig") return(out) } fields/R/RdistEarth.R0000644000176200001440000000323014275252302014115 0ustar liggesusers# # fields is a package for analysis of spatial data written for # the R software environment. # Copyright (C) 2022 Colorado School of Mines # 1500 Illinois St., Golden, CO 80401 # Contact: Douglas Nychka, douglasnychka@gmail.edu, # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with the R software environment if not, write to the Free Software # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA # or see http://www.r-project.org/Licenses/GPL-2 ##END HEADER RdistEarth <- function(x1, x2=NULL, miles=TRUE, R=NULL){ stopifnot(is.numeric(x1), is.matrix(x1), ncol(x1)==2, is.null(x2) || (is.numeric(x2) && is.matrix(x2) && ncol(x2)==2), (!is.null(R) && is.numeric(R)) || is.logical(miles)) if(is.null(R)) R <- if(miles[1]) 3963.34 else 6378.388 if(is.null(x2)){ ans <- numeric(nrow(x1)^2) .Call("distMatHaversin", p1=x1, radius=R, ans=ans) attr(ans, "dim") <- c(nrow(x1), nrow(x1)) return(ans) } ans <- numeric(nrow(x1)*nrow(x2)) .Call("distMatHaversin2", p1=x1, p1=x2, radius=R, ans=ans) attr(ans, "dim") <- c(nrow(x1), nrow(x2)) ans } fields/R/exp.simple.cov.R0000644000176200001440000000472414275252303014730 0ustar liggesusers# # fields is a package for analysis of spatial data written for # the R software environment. # Copyright (C) 2022 Colorado School of Mines # 1500 Illinois St., Golden, CO 80401 # Contact: Douglas Nychka, douglasnychka@gmail.edu, # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with the R software environment if not, write to the Free Software # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA # or see http://www.r-project.org/Licenses/GPL-2 ##END HEADER Exp.simple.cov <- function(x1, x2=NULL, aRange = 1, C = NA, marginal = FALSE, theta=NULL) { # this is a simple exponential covariance function # with the calling format and behaviour used in fields. # # different locations are the different rows of x1 and x2. # this function can return three different results # depending on the values of C and marginal. # The three cases: # 1) cross covaraince matrix # 2) cross covariance matrix times a vector (C) # 3) the diagonal elements of covariance matrix at locations x1. # # theta argument has been depreciated. if( !is.null( theta)){ aRange<- theta } if( !is.null(x2)){ x2<- x1 } # CASE 1: if (is.na(C[1]) & !marginal) { # rdist finds the cross distance matrix between the # locations at x1, x2. # return(exp(-rdist(x1, x2)/aRange)) } # CASE 2: # or return multiplication of cov( x2,x1) with vector C if (!is.na(C[1])) { return(exp(-rdist(x1, x2)/aRange) %*% C) # # if the rows of X1 are large # this line could be replaced by a call to C or FORTRAN # to make the multiply use less memory. # # there are also other algorithms for fast multiplies when # X2 is on a grid. # } # CASE 3 # return marginal variance (in this case it is trivial a constant vector # with 1.0) if (marginal) { return(rep(1, nrow(x1))) } } fields/R/gcv.sreg.R0000644000176200001440000001744714275252303013602 0ustar liggesusers# # fields is a package for analysis of spatial data written for # the R software environment. # Copyright (C) 2022 Colorado School of Mines # 1500 Illinois St., Golden, CO 80401 # Contact: Douglas Nychka, douglasnychka@gmail.edu, # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with the R software environment if not, write to the Free Software # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA # or see http://www.r-project.org/Licenses/GPL-2 ##END HEADER gcv.sreg<- function(out, lambda.grid = NA, cost = 1, nstep.cv = 80, rmse = NA, offset = 0, trmin = NA, trmax = NA, verbose = FALSE, tol = 1e-05, give.warnings=TRUE) { tauHat.pure.error <- out$tauHat.pure.error pure.ss <- out$pure.ss nt <- 2 np <- out$np N <- out$N out$cost <- cost out$offset <- offset # find good end points for lambda coarse grid. if (is.na(trmin)) trmin <- 2.05 if (is.na(trmax)) trmax <- out$np * 0.95 if (is.na(lambda.grid[1])) { l2 <- sreg.df.to.lambda(trmax, out$xM, out$weightsM) l1 <- sreg.df.to.lambda(trmin, out$xM, out$weightsM) lambda.grid <- exp(seq(log(l2), log(l1), , nstep.cv)) } if (verbose) { cat("endpoints of coarse lamdba grid", fill = TRUE) cat(l1, l2, fill = TRUE) } # build up table of coarse grid serach results for lambda # in the matrix gcv.grid nl <- length(lambda.grid) V <- V.model <- V.one <- trA <- MSE <- RSS.model <- rep(NA, nl) # loop through lambda's and compute various quantities related to # lambda and the fitted spline. for (k in 1:nl) { temp <- sreg.fit(lambda.grid[k], out, verbose = verbose) RSS.model[k] <- temp$rss trA[k] <- temp$trace V[k] <- temp$gcv V.one[k] <- temp$gcv.one V.model[k] <- temp$gcv.model } # adjustments to columns of gcv.grid RSS <- RSS.model + pure.ss tauHat <- sqrt(RSS/(N - trA)) gcv.grid <- cbind(lambda.grid, trA, V, V.one, V.model, tauHat) dimnames(gcv.grid) <- list(NULL, c("lambda", "trA", "GCV", "GCV.one", "GCV.model", "tauHat")) gcv.grid<- as.data.frame( gcv.grid) if (verbose) { cat("Results of coarse grid search", fill = TRUE) print(gcv.grid) } lambda.est <- matrix(NA, ncol = 5, nrow = 5, dimnames = list( c("GCV","GCV.model", "GCV.one", "RMSE", "pure error"), c("lambda","trA", "GCV", "tauHat", "converge"))) # now do various refinements for different flavors of finding # a good value for lambda the smoothing parameter ##### traditional leave-one-out IMIN<- rep( NA, 5) IMIN[1]<- which.min( gcv.grid$GCV ) IMIN[2]<- ifelse( is.na(tauHat.pure.error), NA, which.min(gcv.grid$GCV.model) ) IMIN[3]<- which.min( gcv.grid$GCV.one) if( is.na( rmse)){ IMIN[4] <- NA } else{ rangeShat<- range( gcv.grid$tauHat) IUpcross<- max( (1:nl)[gcv.grid$tauHat< rmse] ) IMIN[4]<- ifelse( (rangeShat[1]<= rmse)&(rangeShat[2] >=rmse), IUpcross, NA) } IMIN[5]<- ifelse( is.na(tauHat.pure.error), NA, which.min(abs(gcv.grid$tauHat-tauHat.pure.error)) ) # NOTE IMIN indexes from smallest lambda to largest lambda in grid. warningTable<- data.frame( IMIN, IMIN == nl, IMIN==1, gcv.grid$lambda[IMIN], gcv.grid$trA[IMIN], row.names = c("GCV","GCV.model", "GCV.one", "RMSE", "pure error") ) warning<- (warningTable[,2]|warningTable[,3])& (!is.na(warningTable[,1])) indRefine<- (!warningTable[,2]) & (!warningTable[,3]) & (!is.na(warningTable[,1])) warningTable<- cbind( warning, indRefine, warningTable ) names( warningTable)<- c("Warning","Refine","indexMIN", "leftEndpoint", "rightEndpoint", "lambda","effdf") if( verbose){ print(warningTable) } # fill in grid search estimates for( k in 1:5){ if( !is.na(IMIN[k])){ lambda.est[k,1]<- gcv.grid$lambda[IMIN[k]] } } # now optimze the search producing refined optima # # now step through the many different ways to find lambda # This is the key to these choices: # 1- the usual GCV proposed by Craven/Wahba # 2- GCV where data fitting is collapsed to the mean for # each location and each location is omitted # 3- True leave-one-out even with replicated observations # 4- Match estimate of tau to external value supplied (RMSE) # 5- Match estimate of tau from the estimate based the # pure error sum of squares obtained by the observations # replicated at the same locations #test<- sreg.fit(.1, out) #print( test) if(indRefine[1]){ starts <- lambda.grid[IMIN[1] + c(-1,0,1)] outGs <- golden.section.search(ax=starts[1],bx=starts[2],cx=starts[3], f=sreg.fgcv, f.extra = out, tol = tol) lambda.est[1,1]<- outGs$x lambda.est[1,5]<- outGs$iter } if( indRefine[2]) { starts <- lambda.grid[IMIN[2] + c(-1,0,1)] outGs <- golden.section.search(ax=starts[1],bx=starts[2],cx=starts[3], f=sreg.fgcv.model, f.extra = out, tol = tol) lambda.est[2,1]<- outGs$x lambda.est[2,5]<- outGs$iter } if( indRefine[3]) { starts <- lambda.grid[IMIN[3] + c(-1,0,1)] outGs <- golden.section.search(ax=starts[1],bx=starts[2],cx=starts[3], f=sreg.fgcv.one, f.extra = out, tol = tol) lambda.est[3, 1] <-outGs$x lambda.est[3,5]<- outGs$iter } if ( indRefine[4] ) { guess<- gcv.grid$lambda[IMIN[4]] lambda.rmse <- find.upcross(sreg.fs2hat, out, upcross.level = rmse^2, guess = guess, tol = tol * rmse^2) lambda.est[4, 1] <- lambda.rmse } if ( indRefine[5] ) { guess <- gcv.grid$lambda[IMIN[5]] lambda.pure.error <- find.upcross(sreg.fs2hat, out, upcross.level = tauHat.pure.error^2, guess = guess, tol = tol * tauHat.pure.error^2) lambda.est[5, 1] <- lambda.pure.error } if (verbose) { cat("All forms of estimated lambdas so far", fill = TRUE) print(lambda.est) } for (k in 1:5) { lam <- lambda.est[k, 1] if (!is.na(lam)) { temp <- sreg.fit(lam, out) lambda.est[k, 2] <- temp$trace if ((k == 1) | (k > 3)) { lambda.est[k, 3] <- temp$gcv } if (k == 2) { lambda.est[k, 3] <- temp$gcv.model } if (k == 3) { lambda.est[k, 3] <- temp$gcv.one } lambda.est[k, 4] <- temp$tauHat } } if( give.warnings & any(warningTable$Warning)){ cat("Methods at endpoints of grid search:", fill=TRUE) print(warningTable[warningTable$Warning,]) } list(gcv.grid = gcv.grid, lambda.est = lambda.est, warningTable=warningTable) } fields/R/Krig.family.R0000644000176200001440000006152214453544254014240 0ustar liggesusers# # fields is a package for analysis of spatial data written for # the R software environment. # Copyright (C) 2022 Colorado School of Mines # 1500 Illinois St., Golden, CO 80401 # Contact: Douglas Nychka, douglasnychka@gmail.edu, # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with the R software environment if not, write to the Free Software # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA # or see http://www.r-project.org/Licenses/GPL-2 ##END HEADER Krig.check.xY <- function(x, Y, Z, weights, na.rm, verbose = FALSE) { # # check for missing values in Y or X. # # save logical indicating where there are NA's # and check for NA's # ind <- is.na(Y) if (any(ind) & !na.rm) { stop("Need to remove missing values or use: na.rm=TRUE in the call") } # # coerce x to be a matrix x <- as.matrix(x) # # coerce Y to be a vector # Y <- as.matrix(Y) if (ncol(Y) != 1) { stop("Krig can not handle matrix Y data. See mKrig.") } # #default weights ( reciprocal variance of errors). # if (is.null(weights)) weights <- rep(1, length(Y)) # # check that dimensions agree # if (length(Y) != nrow(x)) { stop(" length of y and number of rows of x differ") } if (length(Y) != length(weights)) { stop(" length of y and weights differ") } # if Z is not NULL coerce to be a matrix # and check # of rows if (verbose) { print(Z) } if (!is.null(Z)) { if (!is.matrix(Z)) { Z <- matrix(c(Z), ncol = 1) } if (length(Y) != nrow(Z)) { stop(" length of y and number of rows of Z differ") } } # if NAs can be removed then remove them and warn the user if (na.rm) { ind <- is.na(Y) if(all(ind)){ stop("Oops! All Y values are missing!") } if (any(ind)) { Y <- Y[!ind] x <- as.matrix(x[!ind, ]) if (!is.null(Z)) { Z <- Z[!ind, ] } weights <- weights[!ind] } } # # check for NA's in x matrix -- there should not be any ! if (any(c(is.na(x)))) { stop(" NA's in x matrix") } # # check for NA's in Z matrix if (!is.null(Z)) { if (any(c(is.na(Z)))) { stop(" NA's in Z matrix") } } # # verbose block if (verbose) { cat("Y:", fill = TRUE) print(Y) cat("x:", fill = TRUE) print(x) cat("weights:", fill = TRUE) cat(weights, fill = TRUE) } # # save x, weights and Y w/o NAs N <- length(Y) return(list(N = N, y = Y, x = x, weights = weights, Z = Z, NA.ind = ind)) } "Krig.coef" <- function(out, lambda = out$lambda, y = NULL, yM = NULL, verbose = FALSE) { # # NOTE default value of lambda used from Krig object. # # Determine whether to collapse onto means of replicates ( using y) # if the data has been passed use as the replicate means (yM) use that. # If both y and YM are null then just use out$yM # For readability of this function, all this tortured logic happens in # Krig.ynew. # out2 <- Krig.ynew(out, y, yM) temp.yM <- out2$yM nt <- out$nt np <- out$np ndata <- ncol(temp.yM) u <- NA call.name <- out$cov.function.name if (verbose) { cat("dimension of yM in Krig.coef", fill = TRUE) print(dim(temp.yM)) } # # case when knots= unqiue x's # any lambda # if (out$decomp == "WBW") { # pad u with zeroes that corresond to null space basis functions # this makes it compatible with the DR decomposition. u <- rbind(matrix(0, nrow = out$nt, ncol = ndata), t(out$matrices$V) %*% qr.q2ty(out$matrices$qr.T, out$W2 %d*% temp.yM)) # #old code beta <- out$matrices$G %*% ((1/(1 + lambda * out$matrices$D))%d*%u) # ind <- (nt + 1):np D2 <- out$matrices$D[ind] # # note use of efficient diagonal multiply in next line temp2 <- (D2/(1 + lambda * D2)) %d*% u[ind, ] beta2 <- out$matrices$V %*% temp2 temp.c <- rbind(matrix(0, nrow = nt, ncol = ndata), beta2) temp.c <- qr.qy(out$matrices$qr.T, temp.c) temp.c <- out$W2 %d*% temp.c temp <- temp.yM - do.call(call.name, c(out$args, list(x1 = out$knots, x2 = out$knots, C = temp.c))) temp <- out$W2 %d*% temp temp.d <- qr.coef(out$matrices$qr.T, temp) } if (out$decomp == "cholesky") { if (lambda != out$matrices$lambda) { stop("New lambda can not be used with cholesky decomposition") } Tmatrix <- do.call(out$null.function.name, c(out$null.args, list(x = out$knots, Z = out$ZM))) temp.d <- qr.coef(out$matrices$qr.VT, forwardsolve(out$matrices$Mc, transpose = TRUE, temp.yM, upper.tri = TRUE)) temp.c <- forwardsolve(out$matrices$Mc, transpose = TRUE, temp.yM - Tmatrix %*% temp.d, upper.tri = TRUE) temp.c <- backsolve(out$matrices$Mc, temp.c) } return(list(c = temp.c, d = temp.d, tauHat.rep = out2$tauHat.rep, tauHat.pure.error = out2$tauHat.pure.error, pure.ss = out2$pure.ss)) } Krig.Amatrix <- function(object, x0 = object$x, lambda = NULL, eval.correlation.model = FALSE, ...) { if (is.null(lambda)) { lambda <- object$lambda } M <- nrow(object$xM) N <- nrow(x0) # create output matrix out <- matrix(NA, N, M) # # loop through unique data locations predicting response # using unit vector # NOTE that the y vector has already been collapsed onto means. # for (k in 1:M) { ytemp <- rep(0, M) ytemp[k] <- 1 out[, k] <- predict(object, x = x0, yM = ytemp, lambda = lambda, eval.correlation.model = eval.correlation.model, ...) } return(out) } "Krig.df.to.lambda" <- function(df, D, guess = 1, tol = 1e-05) { if (is.list(D)) { D <- D$matrices$D } if (is.na(df)) return(NA) if (df < sum(D == 0)) { warning("df too small to match with a lambda value") return(NA) } if (df > length(D)) { warning(" df too large to match a lambda value") return(NA) } l1 <- guess for (k in 1:25) { tr <- sum(1/(1 + l1 * D)) if (tr <= df) break l1 <- l1 * 4 } l2 <- guess for (k in 1:25) { tr <- sum(1/(1 + l2 * D)) if (tr >= df) break l2 <- l2/4 } info <- list(D = D, df = df, N = length(D)) out <- bisection.search(log(l1), log(l2), Krig.fdf, tol = tol, f.extra = info)$x +exp(out) } "Krig.engine.default" <- function(out, verbose = FALSE) { Tmatrix <- do.call(out$null.function.name, c(out$null.args, list(x = out$xM, Z = out$ZM))) if (verbose) { cat(" Model Matrix: spatial drift and Z", fill = TRUE) print(Tmatrix) } # Tmatrix premultiplied by sqrt of weights Tmatrix <- out$W2 %d*% Tmatrix qr.T <- qr(Tmatrix) if( qr.T$rank < ncol( Tmatrix)){ stop("Regression matrix for fixed part of model is colinear")} # #verbose block if (verbose) { cat("first 5 rows of qr.T$qr", fill = TRUE) print(qr.T$qr[1:5, ]) } # # find Q_2 K Q_2^T where K is the covariance matrix at the knot points # tempM <- t(out$W2 %d*% do.call(out$cov.function.name, c(out$args, list(x1 = out$knots, x2 = out$knots)))) tempM <- out$W2 %d*% tempM tempM <- qr.yq2(qr.T, tempM) tempM <- qr.q2ty(qr.T, tempM) np <- nrow(out$knots) nt <- (qr.T$rank) if (verbose) { cat("np, nt", np, nt, fill = TRUE) } # # Full set of decompositions for # estimator for nonzero lambda tempM <- eigen(tempM, symmetric = TRUE) D <- c(rep(0, nt), 1/tempM$values) # # verbose block if (verbose) { cat("eigen values:", fill = TRUE) print(D) } # # Find the transformed data vector used to # evaluate the solution, GCV, REML at different lambdas # u <- c(rep(0, nt), t(tempM$vectors) %*% qr.q2ty(qr.T, c(out$W2 %d*% out$yM))) if (verbose) { cat("u vector:", fill = TRUE) print(u) } # # return(list(D = D, qr.T = qr.T, decomp = "WBW", V = tempM$vectors, u = u, nt = nt, np = np)) } "Krig.engine.fixed" <- function(out, verbose = FALSE, lambda = NA) { if (is.na(lambda)) lambda <- out$lambda call.name <- out$cov.function.name Tmatrix <- do.call(out$null.function.name, c(out$null.args, list(x = out$knots, Z = out$ZM))) if (verbose) { cat("Tmatrix:", fill = TRUE) print(Tmatrix) } np <- nrow(out$knots) nt <- ncol(Tmatrix) # form K tempM <- do.call(call.name, c(out$args, list(x1 = out$knots, x2 = out$knots))) # form M diag(tempM) <- (lambda/out$weightsM) + diag(tempM) # # find cholesky factor # tempM = t(Mc)%*% Mc # V= Mc^{-T} # call cholesky but also add in the args supplied in Krig object. Mc <- do.call("chol", c(list(x = tempM), out$chol.args)) VT <- forwardsolve(Mc, x = Tmatrix, transpose = TRUE, upper.tri = TRUE) qr.VT <- qr(VT) # find GLS covariance matrix of null space parameters. Rinv <- solve(qr.R(qr.VT)) Omega <- Rinv %*% t(Rinv) # # now do generalized least squares for d # and then find c. beta <- qr.coef(qr.VT, forwardsolve(Mc, transpose = TRUE, out$yM, upper.tri = TRUE)) if (verbose) { cat("beta fixed coefficients", fill=TRUE) print(beta) } c.coef <- forwardsolve(Mc, transpose = TRUE, out$yM - Tmatrix %*% beta, upper.tri = TRUE) c.coef <- backsolve(Mc, c.coef) # return all the goodies, include lambda as a check because # results are meaningless for other values of lambda return(list(qr.VT = qr.VT, d = c(beta), c = c(c.coef), Mc = Mc, decomp = "cholesky", nt = nt, np = np, lambda.fixed = lambda, Omega = Omega)) } "Krig.fdf" <- function(llam, info) { sum(1/(1 + exp(llam) * info$D)) - info$df } "Krig.fgcv" <- function(lam, obj) { # # GCV that is leave-one-group out # lD <- obj$matrices$D * lam RSS <- sum(((obj$matrices$u * lD)/(1 + lD))^2) MSE <- RSS/length(lD) if ((obj$N - length(lD)) > 0) { MSE <- MSE + obj$pure.ss/(obj$N - length(lD)) } trA <- sum(1/(1 + lD)) den <- (1 - (obj$cost * (trA - obj$nt - obj$offset) + obj$nt)/length(lD)) # If the denominator is negative then flag this as a bogus case # by making the GCV function 'infinity' # ifelse(den > 0, MSE/den^2, 1e20) } "Krig.fgcv.model" <- function(lam, obj) { lD <- obj$matrices$D * lam MSE <- sum(((obj$matrices$u * lD)/(1 + lD))^2)/length(lD) trA <- sum(1/(1 + lD)) den <- (1 - (obj$cost * (trA - obj$nt - obj$offset) + obj$nt)/length(lD)) ifelse(den > 0, obj$tauHat.pure.error^2 + MSE/den^2, 1e20) } "Krig.fgcv.one" <- function(lam, obj) { lD <- obj$matrices$D * lam RSS <- obj$pure.ss + sum(((obj$matrices$u * lD)/(1 + lD))^2) trA <- sum(1/(1 + lD)) den <- 1 - (obj$cost * (trA - obj$nt - obj$offset) + obj$nt)/obj$N # If the denominator is negative then flag this as a bogus case # by making the GCV function 'infinity' # ifelse(den > 0, (RSS/obj$N)/den^2, 1e+20) } "Krig.flplike" <- function(lambda, obj) { # - log profile likelihood for lambda # See section 3.4 from Nychka Spatial Processes as Smoothers paper. # for equation and derivation D2 <- obj$matrices$D[obj$matrices$D > 0] u2 <- obj$matrices$u[obj$matrices$D > 0] lD <- D2 * lambda N2 <- length(D2) # MLE estimate of sigma for fixed lambda sigma2.MLE <- (sum((D2 * (u2)^2)/(1 + lD)))/N2 # # ln determinant of K + lambda*WI lnDetCov <- -sum(log(D2/(1 + lD))) logREMLLikelihood<- -1 * (-N2/2 - log(2 * pi) * (N2/2) - (N2/2) * log(sigma2.MLE) - (1/2) * lnDetCov) return( logREMLLikelihood ) } "Krig.fs2hat" <- function(lam, obj) { lD <- obj$matrices$D * lam RSS <- obj$pure.ss + sum(((obj$matrices$u * lD)/(1 + lD))^2) den <- obj$N - (sum(1/(1 + lD)) + obj$offset) if (den < 0) { return(NA) } else { RSS/(den) } } "Krig.ftrace" <- function(lam, D) { sum(1/(1 + lam * D)) } "Krig.make.W" <- function(out, verbose = FALSE) { if (verbose) { cat("W", fill = TRUE) print(out$W) } if (out$nondiag.W) { # # create W from scratch or grab it from passed object if (is.null(out$W)) { if (verbose) { print(out$wght.function.name) } W <- do.call(out$wght.function.name, c(list(x = out$xM), out$wght.args)) # adjust W based on diagonal weight terms # W <- sqrt(out$weightsM) * t(sqrt(out$weightsM) * W) } else { W <- out$W } # # symmetric square root temp <- eigen(W, symmetric = TRUE) W2 <- temp$vectors %*% diag(sqrt(temp$values)) %*% t(temp$vectors) return(list(W = W, W2 = W2)) } else { # # These are created only for use with default method to stay # consistent with nondiagonal elements. if (out$fixed.model) { return(list(W = NULL, W2 = NULL)) } else { return(list(W = out$weightsM, W2 = sqrt(out$weightsM))) } } } "Krig.make.Wi" <- function(out, verbose = FALSE) { # # If a weight matrix has been passed use it. # # Note that in either case the weight matrix assumes that # replicate observations have been collapses to the means. # if (out$nondiag.W) { temp <- eigen(out$W, symmetric = TRUE) Wi <- temp$vectors %*% diag(1/(temp$values)) %*% t(temp$vectors) W2i <- temp$vectors %*% diag(1/sqrt(temp$values)) %*% t(temp$vectors) return(list(Wi = Wi, W2i = W2i)) } else { # # These are created only for use with default method to stay # consistent with nondiagonal elements. return(list(Wi = 1/out$weightsM, W2i = 1/sqrt(out$weightsM))) } } "Krig.make.u" <- function(out, y = NULL, yM = NULL, verbose = FALSE) { # # Determine whether to collapse onto means of replicates ( using y) # if the data has been passed use as the replicate means (yM) use that. # If both y and YM are null then just use out$yM # For readability of this function, all this tortured logic happens in # Krig.ynew. # out2 <- Krig.ynew(out, y, yM) temp.yM <- out2$yM nt <- out$nt np <- out$np ndata <- ncol(temp.yM) u <- NA call.name <- out$cov.function.name if (verbose) { cat("dimension of yM in Krig.coef", fill = TRUE) print(dim(temp.yM)) } # # case when knots= unqiue x's # any lambda # u <- rbind(matrix(0, nrow = out$nt, ncol = ndata), t(out$matrices$V) %*% qr.q2ty(out$matrices$qr.T, out$W2 %d*% temp.yM)) return(list(u = u, tauHat.rep = out2$tauHat.rep, tauHat.pure.error = out2$tauHat.pure.error, pure.ss = out2$pure.ss)) } Krig.null.function <- function(x, Z = NULL, drop.Z = FALSE, m) { # default function to create matrix for fixed part of model # x, Z, and drop.Z are required # Note that the degree of the polynomial is by convention (m-1) # returned matrix must have the columns from Z last! # if (is.null(Z) | drop.Z) { return(fields.mkpoly(x, m = m)) } else { return(cbind(fields.mkpoly(x, m = m), Z)) } } Krig.parameters <- function(obj, mle.calc = obj$mle.calc) { # if nondiag W is supplied then use it. # otherwise assume a diagonal set of weights. # # NOTE: calculation of tauHat involves full set of obs # not those colllapsed to the mean. if (obj$nondiag.W) { tauHat.GCV <- sqrt(sum((obj$W2 %d*% obj$residuals)^2)/(length(obj$y) - obj$eff.df)) } else { tauHat.GCV <- sqrt(sum((obj$weights * obj$residuals^2)/(length(obj$y) - obj$eff.df))) } if (mle.calc) { sigma.MLE <- sum(c(obj$c) * c(obj$yM))/obj$N # set sigma estimate to zero if negtive. Typically this # is an issue of machine precision and very small negative value. sigma.MLE <- ifelse(sigma.MLE < 0, 0, sigma.MLE) # commented out code for debugging ... # if( sigma.MLE< 0) { # stop('problems computing sigma.MLE')} # commented out is the REML estimate -- lose null space df because of # the restiction to orthogonal subspace of T. # sigmahat<- sigma.MLE <- sum(obj$c * obj$yM)/(obj$N - obj$nt) # . sigmahat <- sigma.MLE tauHat.MLE <- sqrt(sigma.MLE * obj$lambda) } else { sigmahat <- sigma.MLE <- tauHat.MLE <- NA } list(tauHat.GCV = tauHat.GCV, sigma.MLE = sigma.MLE, tauHat.MLE = tauHat.MLE, sigmahat = sigmahat) } "Krig.replicates" <- function(out=NULL, x,y, Z=NULL, weights=rep( 1, length(y)), digits=8, verbose = FALSE) { if( is.null(out)){ out<- list( x=x, y=y, N= length(y), Z=Z, weights=weights) } rep.info <- cat.matrix(out$x, digits=digits) if (verbose) { cat("replication info", fill = TRUE) print(rep.info) } # If no replicates are found then reset output list to reflect this condition uniquerows <- !duplicated(rep.info) if (sum(uniquerows) == out$N) { tauHat.rep <- NA tauHat.pure.error <- NA pure.ss <- 0 # coerce 'y' data vector as a single column matrix yM <- as.matrix(out$y) weightsM <- out$weights xM <- as.matrix(out$x[uniquerows, ]) # coerce ZM to matrix if (!is.null(out$Z)) { ZM <- as.matrix(out$Z) } else { ZM <- NULL } } # collapse over spatial replicates else { rep.info.aov <- fast.1way(rep.info, out$y, out$weights) tauHat.pure.error <- sqrt(rep.info.aov$MSE) tauHat.rep <- tauHat.pure.error # copy replicate means as a single column matrix yM <- as.matrix(rep.info.aov$means) weightsM <- rep.info.aov$w.means xM <- as.matrix(out$x[uniquerows, ]) # choose some Z's for replicate group means if (!is.null(out$Z)) { ZM <- as.matrix(out$Z[uniquerows, ]) } else { ZM <- NULL } pure.ss <- rep.info.aov$SSE if (verbose) print(rep.info.aov) } return(list(yM = yM, xM = xM, ZM = ZM, weightsM = weightsM, uniquerows = uniquerows, tauHat.rep = tauHat.rep, tauHat.pure.error = tauHat.pure.error, pure.ss = pure.ss, rep.info = rep.info)) } Krig.transform.xY <- function(obj, knots=NA, verbose = FALSE) { # find all replcates and collapse to unique locations and mean response # and pooled variances and weights. out <- Krig.replicates(obj, verbose = verbose) if (verbose) { cat("yM from Krig.transform.xY", fill = TRUE) print(out$yM) } # # save information about knots. out$knots <- out$xM out$mle.calc <- TRUE out$knot.model <- FALSE # # scale x, knot locations and save transformation info # out$xM <- transformx(out$xM, obj$scale.type, obj$x.center, obj$x.scale) out$transform <- attributes(out$xM) out$knots <- scale(out$knots, center = out$transform$x.center, scale = out$transform$x.scale) # # #verbose block # if (verbose) { cat("transform", fill = TRUE) print(out$transform) } if (verbose) { cat("knots in transformed scale", fill = TRUE) print(knots) } return(out) } "Krig.updateY" <- function(out, Y, verbose = FALSE, yM = NA) { # # if (is.na(yM[1])) { out2 <- Krig.ynew(out, Y) } else { out2 <- list(yM = yM, tauHat.rep = NA, tauHat.pure.error = NA, pure.ss = NA) } if (verbose) { print(out2) } # # Note how matrices are grabbed from the Krig object # if (verbose){ cat("Type of decomposition", out$decomp, fill = TRUE) } #### decomposition of Q2TKQ2 u <- c(rep(0, out$nt), t(out$matrices$V) %*% qr.q2ty(out$matrices$qr.T, out$W2 %d*% out2$yM)) if (verbose) cat("u", u, fill = TRUE) # # pure error in this case from 1way ANOVA # if (verbose) { cat("pure.ss", fill = TRUE) print(out2$pure.ss) } out2$u <- u out2 } Krig.which.lambda <- function(out) { # # determine the method for finding lambda # Note order # default is to do 'gcv/REML' out2 <- list() # copy all all parameters to out2 just to make this # easier to read. out2$method <- out$method out2$lambda.est <- NA out2$lambda <- out$lambda out2$eff.df <- out$eff.df out2$sigma <- out$sigma out2$tau2 <- out$tau2 if (!is.na(out2$lambda) | !is.na(out2$eff.df)) { # # this indicates lambda has been supplied and leads to # the cholesky type computational approaches # -- but only if GCV is FALSE # out2$method <- "user" } out2$GCV <- out$GCV if (!is.na(out2$eff.df)) { # # this indicates df has been supplied and needs # GCV to be true to compute the lambda # that matches the df # out2$GCV <- TRUE } if (!is.na(out2$sigma) & !is.na(out2$tau2)) { out2$method <- "user" out2$lambda <- out2$tau2/out2$sigma } # # NOTE: method='user' means that a value of lambda has been supplied # and so GCV etc to determine lambda is not needed. # gcv TRUE means that the decompositions will be done to # evaluate the estimate at arbitrary lambda (and also be # able to compute the effective degrees of freedom). # # The fixed lambda calculations are very efficient but # do not make it feasible for GCV/REML or effective degrees of # freedom calculations. # out2$fixed.model <- (out2$method == "user") & (!out2$GCV) # return(out2) } "Krig.ynew" <- function(out, y = NULL, yM = NULL) { # # calculates the collapsed y (weighted) mean vector based on the # X matrix and weights from the out object. # or just passes through the collapsed mean data if passed. # # # If there are no replicated obs. then return the full vector # pure error ss is zero # tauHat.rep <- NA tauHat.pure.error <- NA pure.ss <- 0 # if no y's are given then it is assumed that one should use the # yM from the original data used to create the Krig object if (is.null(yM) & is.null(y)) { yM <- out$yM } # # case when yM is passed no calculations are needed # if (!is.null(yM)) { return(list(yM = as.matrix(yM), tauHat.rep = NA, tauHat.pure.error = NA, pure.ss = 0)) } # # no reps case # if (length(unique(out$rep.info)) == out$N) { return(list(yM = as.matrix(y), tauHat.rep = NA, tauHat.pure.error = NA, pure.ss = 0)) } # # check that y is the right length # if (length(y) != out$N) { stop(" the new y vector is the wrong length!") } # # case when full y data is passed and replicate means need to be found # if (length(unique(out$rep.info)) < out$N) { # # calculate means by pooling Replicated observations but use the # the right weighting. # rep.info.aov <- fast.1way(out$rep.info, y, out$weights)[c("means", "MSE", "SSE")] tauHat.pure.error <- sqrt(rep.info.aov$MSE) tauHat.rep <- tauHat.pure.error return(list(yM = rep.info.aov$means, tauHat.rep = tauHat.rep, tauHat.pure.error = tauHat.pure.error, pure.ss = rep.info.aov$SSE)) } } fields/R/colorbar.plot.R0000644000176200001440000000570214275252303014633 0ustar liggesusers# # fields is a package for analysis of spatial data written for # the R software environment. # Copyright (C) 2022 Colorado School of Mines # 1500 Illinois St., Golden, CO 80401 # Contact: Douglas Nychka, douglasnychka@gmail.edu, # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with the R software environment if not, write to the Free Software # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA # or see http://www.r-project.org/Licenses/GPL-2 ##END HEADER "colorbar.plot" <- function(x, y, strip, strip.width = 0.1, strip.length = 4 * strip.width, zrange = NULL, adj.x = 0.5, adj.y = 0.5, col = tim.colors(256), horizontal = TRUE, ...) { # coerce to be one column matrix if it is a vector if (!is.matrix(strip)) { strip <- matrix(c(strip), ncol = 1) } m <- nrow(strip) n <- ncol(strip) # find common range across strips if not specified if (is.null(zrange)) { zrange <- matrix(range(c(strip), na.rm = TRUE), nrow = n, ncol = 2, byrow = TRUE) } # see help( par) for background on graphical settings ucord <- par()$usr pin <- par()$pin if (horizontal) { dy <- strip.width * (ucord[4] - ucord[3]) dx <- strip.length * pin[2] * (ucord[2] - ucord[1])/(pin[1]) } else { dx <- strip.width * (ucord[2] - ucord[1]) dy <- strip.length * pin[1] * (ucord[4] - ucord[3])/(pin[2]) } # # dx and dy should have the correct ratio given different different scales # and also different aspects to the plot window # n <- ncol(strip) m <- nrow(strip) # create grids in x and y for strip(s) based on the users # coordinates of the plot and th positioning argument (adj) if (horizontal) { xs <- seq(0, dx, , m + 1) + x - adj.x * dx ys <- seq(0, dy, , n + 1) + y - adj.y * dy } else { xs <- seq(0, dx, , n + 1) + x - adj.x * dx ys <- seq(0, dy, , m + 1) + y - adj.y * dy } # # plot image row by row to allow for different zlim's # see image.add for a fields function that just plots the whole image at # once. for (k in 1:n) { if (horizontal) { image(xs, c(ys[k], ys[k + 1]), cbind(strip[, k]), zlim = zrange[k, ], add = TRUE, col = col, ...) } else { image(c(xs[k], xs[k + 1]), ys, rbind(strip[, k]), zlim = zrange[k, ], add = TRUE, col = col, ...) } } } fields/R/arrow.plot.R0000644000176200001440000000351214275252302014156 0ustar liggesusers# # fields is a package for analysis of spatial data written for # the R software environment. # Copyright (C) 2022 Colorado School of Mines # 1500 Illinois St., Golden, CO 80401 # Contact: Douglas Nychka, douglasnychka@gmail.edu, # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with the R software environment if not, write to the Free Software # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA # or see http://www.r-project.org/Licenses/GPL-2 ##END HEADER "arrow.plot" <- function(a1, a2, u = NA, v = NA, arrow.ex = 0.05, xpd = TRUE, true.angle = FALSE, arrowfun = arrows, ...) { if (is.matrix(a1)) { x <- a1[, 1] y <- a1[, 2] } else { x <- a1 y <- a2 } if (is.matrix(a2)) { u <- a2[, 1] v <- a2[, 2] } ucord <- par()$usr arrow.ex <- arrow.ex * min(ucord[2] - ucord[1], ucord[4] - ucord[3]) if (true.angle) { pin <- par()$pin r1 <- (ucord[2] - ucord[1])/(pin[1]) r2 <- (ucord[4] - ucord[3])/(pin[2]) } else { r1 <- r2 <- 1 } u <- u * r1 v <- v * r2 maxr <- max(sqrt(u^2 + v^2)) u <- (arrow.ex * u)/maxr v <- (arrow.ex * v)/maxr invisible() old.xpd <- par()$xpd par(xpd = xpd) arrowfun(x, y, x + u, y + v, ...) par(xpd = old.xpd) } fields/R/exp.cov.R0000644000176200001440000000675714275252303013450 0ustar liggesusers# # fields is a package for analysis of spatial data written for # the R software environment. # Copyright (C) 2022 Colorado School of Mines # 1500 Illinois St., Golden, CO 80401 # Contact: Douglas Nychka, douglasnychka@gmail.edu, # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with the R software environment if not, write to the Free Software # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA # or see http://www.r-project.org/Licenses/GPL-2 ##END HEADER "Exp.cov" <- function(x1, x2=NULL, aRange = 1, p=1, distMat = NA, C = NA, marginal = FALSE, onlyUpper=FALSE, theta=NULL) { # theta argument has been depreciated. if( !is.null( theta)){ aRange<- theta } if (!is.matrix(x1)) x1 <- as.matrix(x1) if (is.null(x2)) x2 <- x1 if (!is.matrix(x2)) x2 <- as.matrix(x2) if (length(aRange) > 1) stop("Non-scalar aRange as input to Exp.cov is depracated. Use the V argument in stationary.cov or scale the input locations beforehand.") d <- ncol(x1) n1 <- nrow(x1) n2 <- nrow(x2) # scale the coordinates by aRange if distance matrix isn't precomputed # a more general scaling by a matrix is done in stationary.cov if(is.na(distMat[1]) || !is.na(C[1])) { x1 <- x1*(1/aRange) x2 <- x2*(1/aRange) } # # there are three main possible actions listed below: # # if no cross covariance matrix and marginal variance not desired if (is.na(C[1]) && !marginal) { #compute distance matrix if necessary if(is.na(distMat[1])) distMat = rdist(x1, x2, compact=TRUE) else distMat = distMat*(1/aRange) #only exponentiate by p if p != 1 if(p != 1) distMat = distMat^p if(inherits(distMat, "dist")) { #distMat is in compact form, so evaluate over all distMat and convert to matrix form if(onlyUpper) return(compactToMat(exp(-distMat), diagVal=1)) else #if onlyUpper==FALSE, fill in lower triangle of covariance matrix as well return(compactToMat(exp(-distMat), diagVal=1, lower.tri=TRUE)) } else { #distMat is an actual matrix #only evaluate upper triangle of covariance matrix if possible if(onlyUpper && nrow(distMat) == ncol(distMat)) return(ExponentialUpper(distMat)) else return(exp(-distMat)) } } # # multiply cross covariance matrix by C # in this case implemented in C # else if (!is.na(C[1])) { return(.Call("multebC", nd = as.integer(d), x1 = as.double(x1), n1 = as.integer(n1), x2 = as.double(x2), n2 = as.integer(n2), par = as.double(p), c = as.double(C), work = as.double(rep(0, n2)) , PACKAGE="fields") ) } # # return marginal variance ( 1.0 in this case) else if (marginal) { return(rep(1, nrow(x1))) } #not possible to reach this point } fields/R/RadialBasis.R0000644000176200001440000000402214275252302014222 0ustar liggesusers# # fields is a package for analysis of spatial data written for # the R software environment. # Copyright (C) 2022 Colorado School of Mines # 1500 Illinois St., Golden, CO 80401 # Contact: Douglas Nychka, douglasnychka@gmail.edu, # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with the R software environment if not, write to the Free Software # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA # or see http://www.r-project.org/Licenses/GPL-2 ##END HEADER RadialBasis <- function(d, M, dimension, derivative = 0) { # compute the exponent for a thin-plate spline # based on smoothness and dimension p <- 2 * M - dimension if (p <= 0) { stop("M too small for thin plates spline, need: 2m-d >0") } if ((p - 1 < 0) & (derivative > 0)) { stop("M is too small for derivatives, need: 2m-d < 1") } if (derivative == 0) { if (dimension%%2 == 0) { # factor of 2 from the log term ifelse(d > 1e-14, radbas.constant(M, dimension) * (d^p) * log(d), 0) } else { radbas.constant(M, dimension) * (d^p) } } else { ## find derivative if (dimension%%2 == 0) { # factor of 2 from the log term ifelse(d > 1e-14, radbas.constant(M, dimension) * (d^(p - 1)) * (p * log(d) + 1), 0) } else { con <- radbas.constant(M, dimension) * p con * (d^(p - 1)) } } ##### should not get here! } fields/R/print.sreg.R0000644000176200001440000000404314275252303014143 0ustar liggesusers# # fields is a package for analysis of spatial data written for # the R software environment. # Copyright (C) 2022 Colorado School of Mines # 1500 Illinois St., Golden, CO 80401 # Contact: Douglas Nychka, douglasnychka@gmail.edu, # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with the R software environment if not, write to the Free Software # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA # or see http://www.r-project.org/Licenses/GPL-2 ##END HEADER "print.sreg" <- function(x, ...) { if (length(x$lambda) > 1) { c1 <- "Number of Observations:" c2 <- (x$N) c1 <- c(c1, "Number of values of lambda in grid:") c2 <- c(c2, length(x$lambda)) sum <- cbind(c1, c2) } else { digits <- 4 N <- x$N c1 <- "Number of Observations:" c2 <- (x$N) c1 <- c(c1, "Unique Observations:") c2 <- c(c2, length(x$xM)) c1 <- c(c1, "Effective degrees of freedom:") c2 <- c(c2, format(round(x$trace, 1))) c1 <- c(c1, "Residual degrees of freedom:") c2 <- c(c2, format(round(x$N - x$trace, 1))) c1 <- c(c1, "Residual root mean square:") c2 <- c(c2, format(signif(sqrt(sum(x$residuals^2)/N), 4))) c1 <- c(c1, "Lambda ( smoothing parameter)") c2 <- c(c2, format(signif((x$lambda), 4))) sum <- cbind(c1, c2) } dimnames(sum) <- list(rep("", dim(sum)[1]), rep("", dim(sum)[2])) cat("Call:\n") dput(x$call) print(sum, quote = FALSE) invisible(x) } fields/R/test.for.zero.R0000644000176200001440000000307414275252303014575 0ustar liggesusers# # fields is a package for analysis of spatial data written for # the R software environment. # Copyright (C) 2022 Colorado School of Mines # 1500 Illinois St., Golden, CO 80401 # Contact: Douglas Nychka, douglasnychka@gmail.edu, # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with the R software environment if not, write to the Free Software # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA # or see http://www.r-project.org/Licenses/GPL-2 ##END HEADER test.for.zero <- function(xtest, xtrue, tol = 1e-08, relative = TRUE, tag = NULL) { denom <- ifelse(relative, mean(abs(c(xtrue))), 1) test.value <- sum(abs(c(xtest) - c(xtrue)))/denom if (!is.null(tag)) { cat("Testing: ", tag, fill = TRUE) } if (test.value < tol) { cat("PASSED test at tolerance ", tol, fill = TRUE) } else { cat("FAILED test value = ", test.value, " at tolerance ", tol) # generate an "error" to signal failed test if (exists("test.for.zero.flag")) { stop() } } } fields/R/print.mKrig.R0000644000176200001440000000215614275252303014257 0ustar liggesusers# # fields is a package for analysis of spatial data written for # the R software environment. # Copyright (C) 2022 Colorado School of Mines # 1500 Illinois St., Golden, CO 80401 # Contact: Douglas Nychka, douglasnychka@gmail.edu, # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with the R software environment if not, write to the Free Software # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA # or see http://www.r-project.org/Licenses/GPL-2 ##END HEADER print.mKrig<- function (x, digits = 4,...){ object<- summary.mKrig( x,...) print.mKrigSummary(object, digits = digits) } fields/R/mKrigMLEGrid.R0000644000176200001440000001137414341534553014276 0ustar liggesusers# # fields is a package for analysis of spatial data written for # the R software environment. # Copyright (C) 2022 Colorado School of Mines # 1500 Illinois St., Golden, CO 80401 # Contact: Douglas Nychka, douglasnychka@gmail.edu, # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with the R software environment if not, write to the Free Software # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA # or see http://www.r-project.org/Licenses/GPL-2 ##END HEADER mKrigMLEGrid <- function(x, y, weights = rep(1, nrow(x)), Z = NULL, ZCommon = NULL, mKrig.args = NULL, cov.function = "stationary.cov", cov.args = NULL, na.rm = TRUE, par.grid = NULL, reltol = 1e-06, REML = FALSE, GCV = FALSE, optim.args = NULL, cov.params.start = NULL, verbose = FALSE, iseed = NA) { if( na.rm){ obj<- mKrigCheckXY(x, y, weights, Z, ZCommon, na.rm) x<- obj$x y<- obj$y weights<- obj$weights Z<- obj$Z ZCommon<- obj$ZCommon } # check which optimization options the covariance function supports # precompute distance matrix if possible so it only needs to be computed once supportsDistMat = supportsArg(cov.function, "distMat") # precompute distance matrix if possible so it only needs to be computed once if(supportsDistMat) { # Get distance function and arguments if available # If user left all distance settings NULL, use rdist with compact option. # Use rdist function by default in general. # if(is.null(cov.args$Distance)) { cov.args$Distance <- "rdist" cov.args$Dist.args <- list(compact=TRUE) } cov.args$distMat<-do.call(cov.args$Distance, c( list(x), cov.args$Dist.args) ) cov.args$onlyUpper<- TRUE } # find NG -- number of parameters to try if( is.null(par.grid) ){ stop("no par.grid ") } par.grid <- data.frame(par.grid) NG <- nrow(par.grid) # output object to summarize results summary <-NULL # begin loop over covariance parameters and either evaluate at a grid of lambda values # or use these as start values for optimization. for (k in 1:NG) { cov.args.temp <- as.list( par.grid[k, ]) names(cov.args.temp) <- names( par.grid) currentCov.args<- c( cov.args.temp, cov.args) if( verbose){ cat( "********grid value: " , k, fill=TRUE) cat( "Cov args", names(currentCov.args ), fill=TRUE, sep=", ") cat("value aRange", fill=TRUE) print( currentCov.args$aRange) cat("value lambda", fill=TRUE) print( currentCov.args$lambda) cat("start values", fill=TRUE) print( cov.params.start) cat("optim.args", fill=TRUE) print( optim.args) } MLEfit0 <- mKrigMLEJoint(x, y, weights = weights, Z = Z, ZCommon = ZCommon, cov.function = cov.function, optim.args = optim.args, cov.args = currentCov.args, na.rm = na.rm, mKrig.args = mKrig.args, REML = REML, GCV = GCV, reltol = reltol, cov.params.start = cov.params.start, verbose = verbose, iseed = iseed) if( is.na(MLEfit0$summary[1])){ cat("mKrigMLEGrid: Problems in optim", fill=TRUE) return(MLEfit0) } summary <- rbind( summary, MLEfit0$summary) } summary<- cbind( summary, par.grid) if( REML){ indMax<- which.max( summary[,"lnProfileLike.FULL"]) } else{ indMax<- which.max( summary[,"lnProfileREML.FULL"]) } if( verbose){ cat("summary from mKrigMLEGrid:", fill=TRUE) print(summary ) } return(list(summary = summary, par.grid = par.grid, call = match.call(), indMax= indMax ) ) } fields/R/KrigFindLambda.R0000644000176200001440000002271314320103223014635 0ustar liggesusers# # fields is a package for analysis of spatial data written for # the R software environment. # Copyright (C) 2022 Colorado School of Mines # 1500 Illinois St., Golden, CO 80401 # Contact: Douglas Nychka, douglasnychka@gmail.edu, # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with the R software environment if not, write to the Free Software # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA # or see http://www.r-project.org/Licenses/GPL-2 ##END HEADER "KrigFindLambda" <- function(out, lambda.grid = NA, cost = 1, nstep.cv = 200, rmse = NA, verbose = FALSE, tol = 1e-05, offset = 0, y = NULL, give.warnings = TRUE) { nt <- out$nt np <- out$np N <- out$N D <- out$matrices$D # Yet another monster function called by Krig # but there just many simple steps ... # # if a y data vector is not supplied then # use the one in the Krig object if (is.null(y)) { u <- out$matrices$u tauHat.pure.error <- out$tauHat.pure.error pure.ss <- out$pure.ss } else { #with new data need to update some statistics. out2 <- Krig.make.u(out, y = y) u <- out2$u tauHat.pure.error <- out2$tauHat.pure.error pure.ss <- out2$pure.ss } if (verbose) { cat("u used:", fill = TRUE) print(u) } # # generate a reasonable grid of lambda based on equally spaced # effective degrees of freedom if (is.na(lambda.grid[1])) { temp.df <- seq(nt, (np - offset) * 0.95, , nstep.cv) temp.df[1] <- temp.df[1] + 0.001 for (k in 1:nstep.cv) { lambda.grid[k] <- Krig.df.to.lambda(temp.df[k], D) } } # make sure that the grid is in sorted order lambda.grid <- sort(lambda.grid) nl <- length(lambda.grid) nd <- length(D) V <- V.model <- V.one <- lplike <- trA <- tauHat <- rep(NA, nl) Dl <- rep(NA, nd) # # this is small little list used to pass information to the # objective functions info <- list(matrices = list(D = D, u = u), N = N, nt = nt, cost = cost, pure.ss = pure.ss, tauHat.pure.error = tauHat.pure.error, offset = offset) # # loop over lambda values for the grid search for (k in 1:nl) { # # all the wonderful things calculated for each lambda # note the use of the info list. V[k] <- Krig.fgcv(lambda.grid[k], info) V.one[k] <- Krig.fgcv.one(lambda.grid[k], info) V.model[k] <- Krig.fgcv.model(lambda.grid[k], info) lplike[k] <- Krig.flplike(lambda.grid[k], info) tauHat[k] <- sqrt(Krig.fs2hat(lambda.grid[k], info)) trA[k] <- Krig.ftrace(lambda.grid[k], D) } # # reformat as a matrix with all these values. gcv.grid <- cbind(lambda.grid, trA, V, V.one, V.model, tauHat, lplike) gcv.grid <- as.data.frame(gcv.grid) names(gcv.grid) <- c("lambda", "trA", "GCV", "GCV.one", "GCV.model", "tauHat", "-lnLike Prof") # find minima over grid ifelse used to avoid 0 length vector from which.min IMIN<- rep( NA, 6) IMIN[1]<- which.min( gcv.grid$GCV ) IMIN[2]<- ifelse( is.na(tauHat.pure.error), NA, which.min(gcv.grid$GCV.model) ) IMIN[3]<- which.min( gcv.grid$GCV.one) if( is.na( rmse)){ IMIN[4] <- NA } else{ rangeShat<- range( gcv.grid$tauHat) IUpcross<- max( (1:nl)[gcv.grid$tauHat< rmse] ) IMIN[4]<- ifelse( (rangeShat[1]<= rmse)&(rangeShat[2] >=rmse), IUpcross, NA) } IMIN[5]<- ifelse( is.na(tauHat.pure.error), NA, which.min(abs(gcv.grid$tauHat-tauHat.pure.error)) ) IMIN[6]<- which.min( gcv.grid[["-lnLike Prof"]]) # NOTE IMIN indexes from smallest lambda to largest lambda in grid. warningTable<- data.frame( IMIN, IMIN == nl, IMIN==1, gcv.grid$lambda[IMIN], gcv.grid$trA[IMIN], row.names = c("GCV","GCV.model", "GCV.one", "RMSE", "pure error", "REML") ) warning<- (warningTable[,2]|warningTable[,3])& (!is.na(warningTable[,1])) indRefine<- (!warningTable[,2]) & (!warningTable[,3]) & (!is.na(warningTable[,1])) warningTable<- cbind( warning, indRefine, warningTable ) names( warningTable)<- c("Warning","Refine","indexMIN", "leftEndpoint", "rightEndpoint", "lambda","effdf") # now optimze the search producing refined optima if (verbose) print(gcv.grid) # setup output matrix for refined values lambda.est <- matrix(NA, ncol = 6, nrow = 6, dimnames = list( c("GCV", "GCV.model", "GCV.one", "RMSE", "pure error", "REML"), c("lambda", "trA", "GCV", "tauHat","-lnLike Prof" , "converge"))) # fill in grid search estimates for( k in 1:6){ if( !is.na(IMIN[k])){ lambda.est[k,1]<- gcv.grid$lambda[IMIN[k]] } } # # now step through the many different ways to find lambda # This is the key to these choices: # 1- the usual GCV proposed by Craven/Wahba # 2- GCV where data fitting is collapsed to the mean for # each location and each location is omitted # 3- True leave-one-out even with replicated observations # 4- Match estimate of tau to external value supplied (RMSE) # 5- Match estimate of tau from the estimate based the # pure error sum of squares obtained by the observations # replicated at the same locations # 6- Maxmize the restricted maxmimum likelihood (REML) # standard GCV w/o replicates if( verbose){ print( warningTable) } if(indRefine[1]){ starts <- lambda.grid[IMIN[1] + c(-1,0,1)] out <- golden.section.search(ax=starts[1],bx=starts[2],cx=starts[3], f=Krig.fgcv, f.extra = info, tol = tol) lambda.est[1,1]<- out$x lambda.est[1,6]<- out$iter } if( indRefine[2]) { starts <- lambda.grid[IMIN[2] + c(-1,0,1)] out <- golden.section.search(ax=starts[1],bx=starts[2],cx=starts[3], f=Krig.fgcv.model, f.extra = info, tol = tol) lambda.est[2,1]<- out$x lambda.est[2,6]<- out$iter } if( indRefine[3]) { starts <- lambda.grid[IMIN[3] + c(-1,0,1)] out <- golden.section.search(ax=starts[1],bx=starts[2],cx=starts[3], f=Krig.fgcv.one, f.extra = info, tol = tol) lambda.est[3, 1] <-out$x lambda.est[3,6]<- out$iter } if ( indRefine[6] ){ starts <- lambda.grid[IMIN[6] + c(-1,0,1)] out <- golden.section.search(ax=starts[1],bx=starts[2],cx=starts[3], f=Krig.flplike, f.extra = info, tol = tol) lambda.est[6,1]<- out$x lambda.est[6,6]<- out$iter } if ( indRefine[4] ) { guess<- gcv.grid$lambda[IMIN[4]] lambda.rmse <- find.upcross(Krig.fs2hat, info, upcross.level = rmse^2, guess = guess, tol = tol * rmse^2) lambda.est[4, 1] <- lambda.rmse } # # matching estimate of tau from reps. if ( indRefine[5] ) { guess <- gcv.grid$lambda[IMIN[5]] lambda.pure.error <- find.upcross(Krig.fs2hat, info, upcross.level = tauHat.pure.error^2, guess = guess, tol = tol * tauHat.pure.error^2) lambda.est[5, 1] <- lambda.pure.error } # # OK done with all six methods # NOTE that not all may # fill in return matrix with all the right stuff # fill in REML results lam.ml <- lambda.est[6, 1] lambda.est[6, 2] <- Krig.ftrace(lam.ml, D) lambda.est[6, 3] <- Krig.fgcv(lam.ml, info) lambda.est[6, 4] <- sqrt(Krig.fs2hat(lam.ml, info)) lambda.est[6, 5] <- Krig.flplike(lam.ml, info) # fill in GCV results for (k in 1:5) { lam <- lambda.est[k, 1] if (!is.na(lam)) { lambda.est[k, 2] <- Krig.ftrace(lam, D) if (k == 1 | k > 3) { lambda.est[k, 3] <- Krig.fgcv(lam, info) lambda.est[k, 5] <- Krig.flplike(lam, info) } if (k == 2) { lambda.est[k, 3] <- Krig.fgcv.model(lam, info) } if (k == 3) { lambda.est[k, 3] <- Krig.fgcv.one(lam, info) } lambda.est[k, 4] <- sqrt(Krig.fs2hat(lam, info)) } } # Note that the estimate by default is # REML == restricted maximum likelihood. if( give.warnings & any(warningTable$Warning)){ cat("Methods at endpoints of grid search:", fill=TRUE) print(warningTable[warningTable$Warning,]) } list(gcv.grid = gcv.grid, lambda.est = lambda.est, info=info, D=D, warningTable=warningTable) } fields/R/stats.R0000644000176200001440000000336414275252303013213 0ustar liggesusers# # fields is a package for analysis of spatial data written for # the R software environment. # Copyright (C) 2022 Colorado School of Mines # 1500 Illinois St., Golden, CO 80401 # Contact: Douglas Nychka, douglasnychka@gmail.edu, # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with the R software environment if not, write to the Free Software # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA # or see http://www.r-project.org/Licenses/GPL-2 ##END HEADER "stats" <- function(x, by) { if (!missing(by)) { x <- cat.to.list(c(x), by) } if (!is.list(x) & !is.matrix(x)) x <- matrix(x, ncol = 1) if (is.list(x)) { ncol <- length(x) out <- matrix(NA, ncol = ncol, nrow = length(describe())) dimnames(out) <- list(describe(), names(x)) for (j in (1:ncol)) { if (is.numeric(x[[j]])) { out[, j] <- describe(x[[j]]) } } return(out) } if (is.matrix(x)) { nc <- ncol(x) out <- matrix(NA, ncol = nc, nrow = length(describe())) dimnames(out) <- list(describe(), dimnames(x)[[2]]) for (j in (1:nc)) { out[, j] <- describe(x[, j]) } return(out) } } fields/R/rdist.earth.vec.R0000644000176200001440000000276214275252303015061 0ustar liggesusers# # fields is a package for analysis of spatial data written for # the R software environment. # Copyright (C) 2022 Colorado School of Mines # 1500 Illinois St., Golden, CO 80401 # Contact: Douglas Nychka, douglasnychka@gmail.edu, # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with the R software environment if not, write to the Free Software # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA # or see http://www.r-project.org/Licenses/GPL-2 ##END HEADER rdist.earth.vec = function(x1, x2, miles=TRUE, R=NULL) { #set default radius if(is.null(R)) { if(miles) R = 3963.34 else R = 6378.388 } #convert lon/lat to radians x1 = x1 * (pi/180) x2 = x2 * (pi/180) #calculate distances using Haversine method lonDist2 = (x2[,1] - x1[,1]) * (1/2) latDist2 = (x2[,2] - x1[,2]) * (1/2) a = sin(latDist2) * sin(latDist2) + cos(x1[, 2]) * cos(x2[, 2]) * sin(lonDist2) * sin(lonDist2) return(2 * atan2(sqrt(a), sqrt(1 - a)) * R) } fields/R/flame.R0000644000176200001440000000500314275252303013131 0ustar liggesusers# # fields is a package for analysis of spatial data written for # the R software environment. # Copyright (C) 2022 Colorado School of Mines # 1500 Illinois St., Golden, CO 80401 # Contact: Douglas Nychka, douglasnychka@gmail.edu, # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with the R software environment if not, write to the Free Software # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA # or see http://www.r-project.org/Licenses/GPL-2 ##END HEADER "flame" <- structure(list(x = structure(c(3, 5, 7, 9, 11, 4, 6, 8, 10, 12, 4, 6, 8, 10, 12, 14, 5, 7, 9, 11, 13, 15, 5, 7, 9, 11, 13, 15, 17, 7, 9, 11, 13, 15, 17, 19, 8, 10, 12, 14, 16, 18, 20, 8, 10, 12, 14, 16, 18, 20, 22, 10, 12, 14, 16, 18, 20, 22, 24, 12, 14, 16, 18, 20, 24, 12, 14, 16, 18, 20, 22, 24, 26, 12, 14, 16, 18, 20, 22, 24, 26, 14, 16, 18, 20, 22, 24, 26, 28, 15, 15, 15, 15, 15, 17, 17, 17, 17, 17, 19, 19, 19, 19, 19, 19, 21, 21, 21, 21, 21, 21, 23, 23, 23, 23, 23, 23, 23, 25, 25, 25, 25, 25, 25, 25, 27, 27, 27, 27, 27, 27, 27, 29, 29, 29, 29, 29, 29, 29, 29, 31, 31, 31, 31, 31, 31, 31, 31, 33, 33, 33, 33, 33, 33, 35, 35, 35, 35, 35, 35, 35, 35, 37, 37, 37, 37, 37, 37, 37, 37, 39, 39, 39, 39, 39, 39, 39, 39), .Dim = c(89, 2), .Dimnames = list(NULL, c("Fuel", "O2"))), y = c(0.005, 0.017, 0.031, 0.041, 0.04, 0.008, 0.021, 0.037, 0.042, 0.039, 0.007, 0.017, 0.032, 0.04, 0.041, 0.035, 0.008, 0.018, 0.033, 0.041, 0.039, 0.034, 0.009, 0.018, 0.029, 0.039, 0.041, 0.037, 0.033, 0.012, 0.023, 0.035, 0.04, 0.04, 0.033, 0.033, 0.015, 0.025, 0.035, 0.041, 0.039, 0.033, 0.03, 0.015, 0.022, 0.033, 0.039, 0.04, 0.035, 0.03, 0.029, 0.019, 0.03, 0.037, 0.041, 0.038, 0.034, 0.029, 0.029, 0.027, 0.034, 0.041, 0.039, 0.028, 0.026, 0.024, 0.032, 0.038, 0.039, 0.035, 0.031, 0.027, 0.025, 0.023, 0.029, 0.037, 0.039, 0.038, 0.033, 0.028, 0.024, 0.029, 0.036, 0.038, 0.039, 0.034, 0.029, 0.025, 0.023)), .Names = c("x", "y")) fields/R/minimax.crit.R0000644000176200001440000000242014275252303014447 0ustar liggesusers# # fields is a package for analysis of spatial data written for # the R software environment. # Copyright (C) 2022 Colorado School of Mines # 1500 Illinois St., Golden, CO 80401 # Contact: Douglas Nychka, douglasnychka@gmail.edu, # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with the R software environment if not, write to the Free Software # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA # or see http://www.r-project.org/Licenses/GPL-2 ##END HEADER "minimax.crit" <- function(obj, des = TRUE, R) { R <- as.matrix(R) id <- 1:nrow(R) if (des) Dset <- attr(obj, "best.id") else Dset <- obj Cset <- id[-Dset] dist.mat <- rdist(R[Cset, ], R[Dset, ]) mM.crit <- max(apply(dist.mat, 1, min)) mM.crit } fields/R/predict.sreg.R0000644000176200001440000000233314275252303014441 0ustar liggesusers# # fields is a package for analysis of spatial data written for # the R software environment. # Copyright (C) 2022 Colorado School of Mines # 1500 Illinois St., Golden, CO 80401 # Contact: Douglas Nychka, douglasnychka@gmail.edu, # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with the R software environment if not, write to the Free Software # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA # or see http://www.r-project.org/Licenses/GPL-2 ##END HEADER "predict.sreg" <- function(object, x, derivative = 0, model = 1, ...) { if (missing(x)) { x <- object$x } c(splint(object$predicted$x, object$predicted$y[, model], x, derivative = derivative, ...)) } fields/R/summaryGCV.Krig.R0000644000176200001440000000417414275252303015005 0ustar liggesusers# # fields is a package for analysis of spatial data written for # the R software environment. # Copyright (C) 2022 Colorado School of Mines # 1500 Illinois St., Golden, CO 80401 # Contact: Douglas Nychka, douglasnychka@gmail.edu, # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with the R software environment if not, write to the Free Software # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA # or see http://www.r-project.org/Licenses/GPL-2 ##END HEADER "summaryGCV.Krig" <- function(object, lambda, cost = 1, verbose = FALSE, offset = 0, y = NULL, ...) { out <- object nt <- out$nt np <- out$np N <- out$N D <- out$matrices$D if (is.null(y)) { u <- out$matrices$u tauHat.pure.error <- out$tauHat.pure.error pure.ss <- out$pure.ss } else { out2 <- Krig.coef(out, y) u <- out2$u tauHat.pure.error <- out2$tauHat.pure.error pure.ss <- out2$pure.ss } info <- list(matrices = list(D = D, u = u), N = N, nt = nt, cost = cost, pure.ss = pure.ss, tauHat.pure.error = tauHat.pure.error, offset = offset) if (verbose) { print(info) } lambda.est <- rep(NA, 6) names(lambda.est) <- c("lambda", "trA", "GCV", "GCV.one", "GCV.model", "tauHat") lambda.est[1] <- lambda lambda.est[2] <- Krig.ftrace(lambda, D) lambda.est[3] <- Krig.fgcv(lambda, info) lambda.est[4] <- Krig.fgcv.one(lambda, info) if (!is.na(tauHat.pure.error)) { lambda.est[5] <- Krig.fgcv.model(lambda, info) } lambda.est[6] <- sqrt(Krig.fs2hat(lambda, info)) lambda.est } fields/R/fields.style.R0000644000176200001440000000232014275252303014451 0ustar liggesusers# # fields is a package for analysis of spatial data written for # the R software environment. # Copyright (C) 2022 Colorado School of Mines # 1500 Illinois St., Golden, CO 80401 # Contact: Douglas Nychka, douglasnychka@gmail.edu, # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with the R software environment if not, write to the Free Software # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA # or see http://www.r-project.org/Licenses/GPL-2 ##END HEADER "fields.style" <- function() { par(cex.axis = 1.2, cex.lab = 1.2, cex = 1.2, cex.sub = 1.2, cex.main = 1.2, lwd = 1.5, bg = "transparent", pch=16) palette(c("orange1", "green2", "blue2", "red1")) } fields/R/RMprecip.R0000644000176200001440000010233614275252302013574 0ustar liggesusers# # fields is a package for analysis of spatial data written for # the R software environment. # Copyright (C) 2022 Colorado School of Mines # 1500 Illinois St., Golden, CO 80401 # Contact: Douglas Nychka, douglasnychka@gmail.edu, # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with the R software environment if not, write to the Free Software # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA # or see http://www.r-project.org/Licenses/GPL-2 ##END HEADER "RMprecip" <- structure(list(x = structure(list(lon = c(-110.53, -109.53, -109.55, -109.23, -110.1, -109.77, -109.4, -109.1, -109.05, -110.73, -104.65, -103.15, -105.85, -108.53, -105.88, -105.48, -105.52, -107.17, -102.18, -105.27, -102.45, -104.33, -104.83, -106.13, -102.27, -104.22, -105.7, -102.68, -105.23, -104.87, -106.12, -105.28, -104.85, -102.35, -107.52, -106.2, -106.77, -107.97, -108.73, -104.7, -108.57, -107.6, -106.97, -105.68, -106.35, -108.07, -104.88, -106.03, -108.97, -108.5, -107.88, -102.78, -104.57, -105.32, -103.07, -102.83, -105.08, -108.05, -103.8, -104.7, -104.03, -108.75, -108.93, -103.5, -105.7, -107.32, -108.53, -108.58, -105.83, -105.85, -105.68, -105.53, -104.7, -106.33, -105.35, -105.38, -106.97, -107.62, -103.15, -107.25, -107.13, -106, -102.12, -102.3, -102.28, -105.22, -102.68, -102.93, -102.25, -103.52, -105.1, -102.78, -106.4, -103.48, -107.32, -105.48, -105.13, -102.62, -103.22, -106.32, -103.02, -105.07, -105.95, -108.28, -107.47, -108.08, -107.9, -106.75, -108.5, -106.15, -105.6, -103.83, -109.03, -105.02, -108.28, -103.75, -103.7, -107.68, -107.02, -108.35, -107.58, -104.65, -108.07, -104.5, -104.72, -107.1, -108.8, -108.03, -107.75, -107.27, -103.7, -104.08, -104.98, -106.13, -106.02, -106.43, -104.97, -102.52, -102.52, -107.23, -107.67, -106.42, -102.7, -106.83, -103.2, -102.07, -102.58, -105.12, -106.37, -104.12, -106.62, -107.87, -104.48, -104.33, -106.32, -108.73, -107.58, -106.27, -104.8, -102.28, -105.2, -105.48, -105.77, -106.78, -104.48, -102.23, -106.9, -108.73, -102.73, -99.55, -99.77, -101.05, -100.95, -99.65, -101.53, -99.2, -101.38, -99.63, -99.52, -99.73, -100.35, -101.07, -99.33, -100.12, -99.58, -99.73, -100.42, -101.9, -99.57, -100.82, -101.7, -100.48, -99.3, -99.33, -100.62, -100.45, -101.35, -100.48, -99.97, -100.28, -99.4, -99.12, -101.25, -99.1, -100, -101.37, -100.92, -99.57, -99.53, -99.18, -99.57, -101.38, -100.33, -100.87, -100.07, -99.03, -99.9, -100.18, -99.93, -99.83, -100.85, -100.52, -99.57, -99.57, -99.32, -99.3, -100.23, -99.92, -101.77, -101.95, -101.18, -101.8, -101.92, -100.08, -100.9, -101.75, -99.27, -100.18, -100.83, -101.77, -101.77, -99.07, -101.35, -100.17, -99.88, -99.83, -99.42, -101.25, -103.78, -99.87, -102.9, -99.87, -99.13, -100.18, -99.47, -99.83, -101.53, -99.63, -102.08, -99.87, -103.1, -99.68, -99.15, -100.17, -99.7, -103.08, -99.25, -103.42, -102.43, -100.83, -100.5, -102.97, -102.28, -102.2, -99.92, -101.52, -100.08, -102.17, -100.17, -101.93, -100.32, -99.22, -103.88, -103.88, -100.97, -102.68, -102.7, -103.08, -99.37, -101.63, -99.08, -103.67, -101.67, -101.98, -102.63, -102.63, -104.03, -101.55, -99.32, -100.6, -100.68, -100.22, -101.68, -99.4, -103.68, -100.4, -101.33, -99.13, -99.33, -100.7, -100.75, -99.83, -101.72, -99.5, -102.33, -102.43, -101.12, -101.35, -103.32, -100.25, -99.3, -100.65, -102.47, -103.6, -102.98, -99.73, -100.38, -101.23, -99.38, -101.02, -100.97, -100.68, -100.55, -101.17, -101.38, -100.73, -100.12, -104.33, -106.43, -106.62, -106.07, -103.17, -108, -104.1, -105.25, -107.97, -106.45, -105.6, -107.97, -105.38, -106.58, -104.95, -106.32, -104.18, -106.63, -106.97, -107.52, -105.05, -107, -105.27, -108.35, -106.18, -106.73, -106.08, -108.4, -108.78, -105.43, -106.38, -105.77, -107.9, -103.62, -106.68, -107.4, -104.37, -105.15, -105.2, -107.02, -106.3, -107.57, -104.58, -103.37, -108.45, -103.92, -107.62, -104.27, -105.05, -107.87, -103.73, -105.68, -104.43, -104.45, -105.4, -104.2, -103.33, -106.37, -105.97, -108.73, -104.58, -105.97, -107.47, -105.57, -106.58, -107.18, -105.97, -103.68, -104.93, -105.37, -106.77, -108.78, -99.77, -100.53, -102.48, -99.62, -99.38, -99.8, -99.62, -99.12, -100.05, -101.62, -99.4, -99.05, -101.22, -102.97, -99.9, -99.35, -99.5, -99.17, -102.73, -99.63, -100.87, -99.28, -99.38, -99.07, -103.65, -103.82, -103.92, -99.98, -103.32, -103.82, -101.02, -99.32, -101.87, -103.6, -103.72, -103.78, -101.52, -101.23, -103.82, -102.53, -103.47, -100.67, -99.07, -99.43, -101.27, -103.18, -99.47, -99.45, -101.87, -103.58, -103.47, -101.95, -99.87, -101.33, -102.17, -103.77, -101.5, -102.47, -101.68, -102.72, -101.15, -101.65, -100.67, -100.6, -103.45, -100.7, -103.45, -100.42, -103.23, -100.07, -103.27, -99.08, -103.5, -101.6, -100.28, -102.13, -102.45, -100.17, -103.1, -103.28, -102.55, -103.78, -99.45, -102.43, -99.87, -100.48, -101.7, -100.5, -101.45, -102.25, -103, -100.37, -101.37, -102.25, -102.55, -100.32, -101.97, -100.13, -101.4, -102.4, -100.02, -100.28, -100.6, -100.63, -101.47, -100.6, -101.38, -100.8, -100.82, -100.97, -100.25, -101.2, -102.08, -109.07, -110.27, -109.62, -109.48, -109.55, -110.73, -109.83, -109.75, -109.4, -109.08, -109.3, -110.4, -109.42, -109.87, -110.17, -110.17, -110.72, -110.87, -109.07, -109.37, -109.22, -109.67, -109.87, -109.55, -109.33, -110.07, -109.98, -110.05, -109.68, -110.8, -109.98, -109.52, -110.68, -110.92, -104.1, -104.65, -107.65, -108.05, -106.38, -110.93, -110.12, -106.73, -108.52, -107.73, -110.43, -108.2, -106.68, -109.18, -107.53, -109.28, -104.32, -106.33, -106.13, -104.82, -104.82, -110.03, -109.08, -106.38, -109.07, -108.93, -104.2, -110.17, -107.27, -108.6, -104.7, -105.12, -108.93, -105.4, -105.38, -109.63, -104.98, -105.87, -106.42, -108.37, -106.62, -110.95, -109.42, -107.48, -105.47, -105.88, -108.05, -108.95, -105.17, -104.6, -110.77, -107.83, -106.63, -110.53, -110.2, -104.17, -110.4, -108.73, -105.68, -105.62, -106.28, -106.83, -108.38, -104.48, -106.2, -104.93, -110.72, -110.58, -110.35, -107.47, -104.22, -110.83, -108.68, -104.48, -104.15, -109.87, -107, -108.75, -107.92, -107.2, -104.28, -108.38, -104.93, -109.07, -110.97, -106.82, -106.97, -106.83, -108.12, -110.67, -108.8, -104.35, -108.98, -105.38, -107.42, -107.32, -108.2, -104.22, -110.42, -104.62, -104.77, -107.98, -105.33, -104.95, -107.97, -107.97, -110.7, -104.3, -104.77, -107.65, -106.22, -99.97, -99.85, -100.73, -108.25, -99.37, -99.5, -100.98, -109.37, -110.07, -106.17, -100.28, -107.8, -99.92, -104.433, -105.867, -105.583, -105.82, -105.569, -105.887, -105.645, -105.544, -105.761, -105.2, -105.067, -105.25, -105.664, -106.983, -106.317, -106.083, -106.933, -106.233, -106.5, -106.367, -106.9, -106.283, -106.781, -106.094, -106.67, -106.046, -106.969, -106.677, -106.612, -106.608, -106.615, -106.542, -106.59, -106.953, -106.548, -106.657, -106.321, -106.263, -106.392, -107.133, -107.583, -107.85, -107.433, -107.533, -107.3, -107.067, -107.067, -107.183, -107.267, -107.167, -107.267, -107.167, -107.058, -107.357, -107.805, -107.689, -107.675, -107.507, -107.512, -109.017, -108.833, -108.9, -108.917, -108.058, -108.382, -108.195, -109.917, -109.65, -109.233, -109.567, -109.783, -109.8, -109.667, -109.75, -109.817, -109.95, -109.75, -109.317, -109.45, -109.167, -109.1, -109.267, -109.55, -109.883, -109.967, -109.667, -109.517, -109.267, -109.483, -110, -110.533, -110.15, -110.667, -110.833, -110.217, -110.433, -110.05, -110.017, -110.133, -110.2, -110.133, -110.917, -110.6, -110.917, -110.8, -110.533, -110.583, -110.667, -110.683, -110.817, -110.683, -110.817, -110.2, -110.483, -110.433, -110.683, -110.5, -110.617, -110.467, -110.583, -110.8, -110, -110.883, -110.95, -110.75, -110.983), lat = c(36.68, 36.15, 35.72, 36.42, 36.98, 35.07, 35.2, 36.9, 35.68, 35.02, 37.38, 40.15, 37.43, 39.58, 39, 39.4, 37.43, 38.47, 39.62, 40, 38.45, 40.65, 39.98, 38.83, 39.3, 39.7, 39.65, 37.08, 38.42, 39.37, 37.75, 39.22, 39.65, 38.82, 38.4, 39.38, 38.43, 39.25, 39.1, 38.82, 37.35, 40.45, 38.87, 37.98, 37.67, 38.75, 39.77, 39.63, 40.23, 37.47, 37.28, 38.48, 39.08, 39.63, 39.28, 40.67, 40.58, 37.23, 40.22, 38.68, 38.13, 39.17, 38.7, 39.28, 39.7, 39.52, 39.12, 39.07, 40.27, 40.25, 39.47, 37.72, 40.42, 39.88, 39.95, 38.68, 38.53, 40.37, 38.45, 40.48, 37.77, 40.97, 38.05, 40.58, 39.7, 39.57, 39.65, 38.07, 41, 38.8, 39.5, 38.77, 40.07, 37.72, 38.05, 38.92, 39.75, 38.08, 38.07, 39.23, 40.48, 40.17, 37.17, 37.35, 40.03, 40.52, 40.03, 39.37, 37.2, 37.57, 39.65, 40.58, 37.82, 39.9, 38.13, 38.22, 38.52, 38.02, 37.27, 39.1, 38.87, 39.52, 38.03, 38.28, 38.27, 40.23, 40.08, 37.68, 38.15, 37.72, 38.03, 38.87, 38.85, 38.08, 38.53, 38.4, 39.38, 40.93, 40.85, 39.57, 37.8, 40.48, 37.38, 40.5, 40.62, 37.3, 39.3, 39.43, 39.25, 38.42, 38.82, 37.95, 37.17, 37.25, 39.08, 38.37, 37.37, 40.73, 37.62, 37.38, 40.42, 38.13, 39.9, 37.48, 37, 40.07, 40.15, 37.55, 40.12, 38.47, 37.2, 39.8, 39.63, 37.87, 39.62, 38.52, 39.35, 37.55, 38.12, 38.8, 37.8, 39.38, 37.27, 38.9, 39.32, 39.63, 39.62, 37, 38.93, 37.98, 39.37, 38.97, 37.6, 38.87, 38.6, 39.35, 37.18, 38.72, 38.25, 38.07, 37.93, 39.67, 37.93, 38.18, 39.62, 38.48, 37.05, 39.67, 39.95, 38.67, 38.58, 39.78, 37.28, 39.27, 39.35, 39.18, 38.45, 39.83, 39.82, 39.7, 39.13, 39.83, 37.82, 39.23, 39.73, 39.23, 39.07, 38.63, 37.33, 37.23, 38.9, 39.77, 39.85, 39.18, 38.48, 38.9, 39.43, 39.47, 37.48, 37.98, 38.47, 37.82, 37.58, 38.65, 39.02, 39.17, 39.42, 39.07, 42.42, 42.55, 42.1, 41.62, 41.42, 41.42, 40.37, 40.13, 40.05, 40.52, 41.07, 41.95, 41.67, 41.42, 41.78, 40.27, 40.7, 42.83, 41.55, 42.7, 41.75, 40.22, 40.67, 41.42, 42.05, 42.27, 40.48, 40.42, 40.68, 42.8, 40.93, 40.02, 41.9, 40.08, 41.65, 42.68, 40.52, 42.68, 42.5, 42.35, 40.43, 40.52, 40.7, 41.25, 41.22, 40.57, 41.5, 41.15, 41.92, 40.85, 41.23, 40.2, 40.42, 40.38, 42.92, 40.93, 41.95, 40.68, 42.27, 40.07, 42.6, 41.13, 41.07, 41.08, 41.13, 40.13, 41.4, 41.3, 40.35, 41.13, 41.22, 42.07, 40.32, 40.35, 42.72, 41.87, 41.13, 42.82, 40.53, 40.13, 41.77, 40.18, 41.55, 42.58, 42.88, 40.83, 40.42, 40.75, 40.12, 36.18, 36.23, 35.05, 36.1, 35.9, 36.83, 35.53, 36.3, 36.67, 36.73, 36.73, 36.07, 36.13, 36.92, 36.47, 35.63, 35.4, 35.23, 36.02, 35.1, 35.18, 36.93, 36.57, 35.05, 36.33, 36.6, 35.98, 36.73, 35.52, 35.9, 36.33, 35.58, 35.17, 36.6, 35.77, 35.03, 36.98, 35.65, 35.53, 36.33, 35.88, 36.23, 36.55, 35.6, 35.33, 35.82, 36.82, 35.07, 36.18, 36.32, 36.3, 35.58, 36.92, 36.88, 36.7, 35.95, 35.12, 35.17, 35.65, 36.77, 36.37, 35.17, 35.93, 36.42, 36.72, 35.8, 36.65, 35.2, 35.82, 35.27, 35.97, 35.1, 36.13, 36.82, 36.73, 36.83, 35.42, 35.2, 36.38, 36.77, 36.85, 36.6, 35.6, 35, 36.87, 36.9, 36.72, 35.87, 35.13, 36.23, 36.93, 35.27, 36.82, 36.17, 36.45, 43.5, 43.07, 44.7, 45, 44.52, 43.48, 44.22, 43.58, 43.73, 43.97, 43.77, 44.38, 44, 44.83, 45, 43.3, 44.3, 44.4, 44.25, 44.07, 43.23, 43.17, 43.83, 44.52, 44.87, 44.33, 43.93, 43.43, 43.75, 43.92, 44.62, 43.43, 44.35, 43.47, 43.23, 43.23, 44.9, 44.07, 44.45, 43.3, 43.12, 43.88, 43.88, 44.73, 44.45, 43.18, 44.7, 43.4, 44.88, 44.07, 44.05, 44.38, 44.62, 43.45, 43.97, 44.15, 44.12, 44.7, 44.48, 44.25, 44.07, 43.38, 43.5, 35.23, 36.47, 35.65, 35.53, 35.65, 35.92, 35.12, 36.23, 36.02, 36.43, 35.85, 36.43, 36.25, 35.88, 36.12, 36.23, 35.23, 35.7, 36.05, 36.1, 35.33, 36.4, 36.1, 36.45, 35.23, 36.2, 36.35, 40.85, 40.32, 38.62, 37.62, 37.28, 37.52, 38.45, 38.15, 38.65, 37.72, 38.8, 40.17, 40.93, 40.28, 39, 38.25, 38.37, 39.73, 37.38, 40.37, 38.3, 40.55, 37.15, 38.58, 37.87, 40.2, 37.62, 40.42, 40.08, 39.62, 40.3, 40.45, 39.55, 42.75, 41.42, 41.15, 41.03, 44.38, 42.63, 42.88, 42.53, 44.13, 41.58, 43.65, 43.23, 43.42, 44.35, 44.5, 44.77, 43.37, 41.05, 42.92, 41.3, 41.15, 41.75, 41.43, 44.98, 44.62, 44.53, 44.38, 44.93, 43.42, 44.87, 44.88, 44.58, 44.12, 43.23, 42.18, 42.77, 43.57, 43.42, 44.47, 41.7, 44.52, 41.18, 41.27, 42.12, 42.83, 44.28, 42.87, 44.5, 44.7, 41.15, 44.68, 43.47, 42.5, 43.73, 41.8, 42.27, 41.63, 44.55, 42.82, 41.32, 41.35, 44.85, 42.18, 44.85, 42.75, 41.9, 44.27, 43.67, 43.85, 41.27, 42.35, 43.85, 44.47, 43.25, 41.63, 41.17, 42.87, 43.02, 44.78, 44.2, 41.8, 43.25, 43.02, 43.6, 41.6, 41.82, 41.45, 44.77, 44.83, 43.23, 44.13, 42.47, 44.4, 44.05, 41.77, 44.07, 43.77, 43.65, 42.08, 44.92, 44.1, 43.93, 41.68, 44.63, 42.12, 44.02, 43.97, 44.97, 41.93, 38.68, 37.38, 40.03, 37.77, 39.35, 39.47, 36.7, 35.17, 35.05, 35.57, 44.33, 41.98, 42.37, 35.43, 44.55, 35.42, 44.475, 42.433, 42.283, 40.414, 40.207, 40.532, 40.311, 40.035, 39.916, 37.209, 37.331, 37, 35.829, 44.25, 42.733, 42.567, 41.167, 41.367, 41.333, 41.333, 41, 41.467, 40.534, 40.347, 40.08, 40.875, 40.848, 40.537, 39.075, 39.298, 39.317, 39.088, 38.82, 38.894, 37.379, 36.956, 36.512, 36.716, 35.922, 44.167, 44.683, 44.8, 44.5, 44.783, 44.567, 44.4, 43.883, 43.633, 43.517, 41.117, 41.05, 41.3, 40.167, 39.765, 37.651, 37.749, 37.934, 37.485, 37.714, 43.667, 42.567, 42.7, 42.583, 39.058, 38.418, 37.892, 44.733, 44.8, 44.3, 44.783, 44.65, 44.383, 43.7, 43.5, 43.933, 43.117, 43, 43.867, 43.267, 43.033, 42.867, 42.65, 40.717, 40.617, 40.9, 40.733, 39.317, 38.483, 37.8, 45, 44.717, 44.483, 44.2, 44.133, 44.15, 43.933, 43.75, 43.25, 43.167, 43.133, 43.383, 43.517, 42.95, 42.517, 42.25, 42.467, 42.767, 42.533, 42.3, 42.817, 42.15, 42.517, 40.917, 40.95, 40.6, 40.55, 40.917, 40.75, 40.717, 40.583, 40.867, 40.767, 40.8, 40.683, 39.9, 39.967)), .Names = c("lon", "lat"), row.names = c("020750", "021248", "023303", "025129", "025665", "026190", "027488", "028468", "029410", "029439", "050102", "050109", "050130", "050214", "050263", "050454", "050776", "050797", "050834", "050848", "050895", "050945", "050950", "051071", "051121", "051179", "051186", "051268", "051294", "051401", "051458", "051528", "051547", "051564", "051609", "051660", "051713", "051741", "051772", "051778", "051886", "051932", "051959", "051964", "052184", "052192", "052220", "052281", "052286", "052326", "052432", "052446", "052494", "052790", "052932", "052944", "053005", "053016", "053038", "053063", "053079", "053146", "053246", "053258", "053261", "053359", "053488", "053489", "053496", "053500", "053530", "053541", "053553", "053592", "053629", "053656", "053662", "053738", "053828", "053867", "053951", "054054", "054076", "054082", "054242", "054293", "054380", "054388", "054413", "054444", "054452", "054603", "054664", "054726", "054734", "054742", "054762", "054770", "054834", "054885", "054945", "055116", "055322", "055327", "055414", "055446", "055484", "055507", "055531", "055706", "055797", "055922", "055970", "055984", "056012", "056131", "056136", "056203", "056258", "056266", "056306", "056326", "056524", "056740", "056765", "056797", "056832", "057017", "057020", "057050", "057167", "057287", "057309", "057337", "057370", "057460", "057510", "057513", "057515", "057618", "057656", "057848", "057866", "057936", "057950", "057992", "058008", "058022", "058064", "058157", "058184", "058204", "058429", "058434", "058501", "058560", "058582", "058756", "058781", "058793", "058839", "058931", "059175", "059181", "059216", "059243", "059265", "059275", "059295", "140135", "140365", "140439", "140441", "140676", "140836", "140865", "141029", "141104", "141141", "141383", "141522", "141699", "141704", "141730", "141999", "142086", "142213", "142432", "142452", "142980", "143153", "143175", "143239", "143527", "143554", "143837", "143855", "144073", "144087", "144161", "144333", "144357", "144464", "144530", "144642", "144665", "144695", "144775", "144807", "144821", "145115", "145127", "145171", "145355", "145483", "145628", "145692", "145787", "145852", "145856", "145888", "145906", "145920", "146192", "146374", "146435", "146637", "146685", "146808", "146813", "147049", "147093", "147095", "147140", "147271", "147397", "147832", "147904", "147922", "148038", "148235", "148245", "148287", "148323", "148495", "148498", "148648", "148988", "250030", "250050", "250130", "250245", "250320", "250355", "250427", "250640", "250760", "250810", "250865", "251130", "251145", "251200", "251345", "251415", "251450", "251575", "251835", "251973", "252000", "252065", "252100", "252145", "252645", "252647", "252690", "252741", "252790", "253355", "253365", "253515", "253540", "253595", "253605", "253615", "253690", "253710", "253715", "253755", "253910", "254110", "254335", "254440", "254455", "254604", "254865", "254900", "255020", "255090", "255250", "255310", "255311", "255388", "255470", "255525", "255590", "255655", "255702", "255780", "255925", "256065", "256075", "256167", "256200", "256365", "256385", "256390", "256480", "256585", "256880", "256970", "257002", "257110", "257415", "257665", "257830", "258090", "258215", "258255", "258455", "258628", "258650", "258755", "258760", "258920", "259020", "259115", "259325", "290022", "290041", "290234", "290245", "290377", "290692", "290858", "291000", "291063", "291180", "291630", "291647", "291656", "291664", "291813", "291982", "292030", "292100", "292241", "292250", "292510", "292608", "292700", "292785", "292820", "292837", "293031", "293340", "293422", "293488", "293511", "293586", "293682", "293706", "294369", "294719", "294742", "294856", "294862", "294960", "295084", "295290", "295490", "295516", "295560", "295937", "296061", "296115", "296275", "296465", "296619", "296676", "297279", "297280", "297323", "297638", "297867", "298015", "298085", "298284", "298501", "298518", "298524", "298668", "298845", "299031", "299085", "299156", "299330", "299496", "299820", "299897", "340332", "340593", "340908", "341243", "342849", "342944", "343070", "343358", "343489", "343628", "343871", "344204", "344298", "344766", "345045", "345090", "346035", "346139", "347534", "347952", "349017", "349172", "349760", "390043", "390236", "390559", "390565", "390760", "391124", "391246", "391539", "391621", "391972", "392087", "392207", "392231", "392446", "392468", "392557", "392647", "393069", "393076", "393217", "393452", "393574", "393775", "393832", "393838", "393857", "393868", "394007", "394184", "394516", "394596", "394630", "394834", "394983", "395154", "395285", "395325", "395506", "395544", "395620", "395638", "395870", "395891", "396054", "396170", "396212", "396292", "396304", "396335", "396427", "396552", "396597", "396636", "396736", "396790", "396937", "396947", "397073", "397882", "397992", "398911", "399367", "399442", "410211", "410944", "410958", "411000", "411033", "411412", "411778", "411946", "412240", "412282", "412617", "413225", "413787", "413981", "414140", "415247", "415770", "415875", "416070", "416477", "416785", "416950", "416952", "416953", "418236", "418523", "418692", "420050", "420074", "420336", "420738", "420788", "421020", "421163", "421168", "421241", "421308", "422150", "422253", "422864", "422996", "423418", "423600", "423611", "423836", "424100", "424342", "424947", "425268", "425582", "425733", "425805", "425969", "426053", "426123", "426568", "427026", "427395", "429111", "429368", "480027", "480080", "480270", "480484", "480540", "480552", "480603", "480695", "480740", "480761", "480778", "480865", "481000", "481165", "481175", "481220", "481284", "481547", "481570", "481610", "481675", "481730", "481736", "481775", "481816", "481840", "481850", "481905", "482375", "482399", "482415", "482466", "482580", "482595", "482680", "482685", "482715", "482725", "482881", "482995", "483031", "483045", "483100", "483170", "483801", "483855", "483950", "484080", "484411", "484442", "484760", "484910", "484925", "485055", "485105", "485252", "485260", "485345", "485390", "485415", "485435", "485506", "485525", "485770", "485830", "486120", "486395", "486428", "486440", "486555", "486595", "486660", "486845", "487115", "487200", "487240", "487260", "487376", "487388", "487473", "487533", "487555", "487760", "487810", "487845", "487955", "487990", "488155", "488160", "488209", "488315", "488385", "488705", "488758", "488808", "488852", "488858", "488875", "488995", "489025", "489205", "489207", "489459", "489580", "489615", "489770", "489785", "489905", "489925", "053002", "054934", "059096", "142164", "143665", "146787", "293142", "347565", "349668", "416776", "481855", "483396", "488192", "419662", "488124", "348652", "04E01S", "05G04S", "05G05S", "05J10S", "05J18S", "05J37S", "05J39S", "05J42S", "05K06S", "05M03S", "05M07S", "05N16S", "05P02S", "06E03S", "06G01S", "06G02S", "06H09S", "06H13S", "06H19S", "06H20S", "06H22S", "06H23S", "06J01S", "06J05S", "06J06S", "06J12S", "06J15S", "06J29S", "06K04S", "06K06S", "06K30S", "06K40S", "06L02S", "06L11S", "06M23S", "06N03S", "06N04S", "06N14S", "06P01S", "07E06S", "07E18S", "07E21S", "07E23S", "07E33S", "07E34S", "07E36S", "07F01S", "07F02S", "07F03S", "07H03S", "07H04S", "07H05S", "07J04S", "07K12S", "07M05S", "07M12S", "07M27S", "07M31S", "07M32S", "08F01S", "08G03S", "08G07S", "08G09S", "08K04S", "08L02S", "08M07S", "09E07S", "09E08S", "09E09S", "09E10S", "09E11S", "09E13S", "09F04S", "09F08S", "09F18S", "09F21S", "09F23S", "09F24S", "09F25S", "09F27S", "09G03S", "09G09S", "09J01S", "09J05S", "09J08S", "09J16S", "09K01S", "09L03S", "09M02S", "10D07S", "10E03S", "10E06S", "10E09S", "10E15S", "10E17S", "10F02S", "10F09S", "10F15S", "10F16S", "10F17S", "10F19S", "10F23S", "10G02S", "10G08S", "10G12S", "10G13S", "10G15S", "10G20S", "10G22S", "10G23S", "10G24S", "10G25S", "10J01S", "10J04S", "10J10S", "10J18S", "10J20S", "10J25S", "10J26S", "10J30S", "10J35S", "10J43S", "10J44S", "10J52S", "10K01S", "10K02S"), class = "data.frame"), elev = c(2196, 1710, 1937, 1976, 1696, 1756, 1806, 1580, 2059, 1489, 1938, 1385, 2298, 2074, 2724, 2358, 2361, 2324, 1113, 1672, 1199, 1488, 1519, 2434, 1272, 1586, 3056, 1312, 1625, 1906, 2339, 2097, 1721, 1295, 2208, 3514, 2438, 1823, 1763, 1888, 1885, 1963, 2705, 2474, 2402, 1562, 1615, 2763, 1805, 2120, 2012, 1284, 2208, 2135, 1525, 1295, 1525, 2321, 1320, 1693, 1324, 1366, 1495, 1708, 2614, 1800, 1479, 1409, 2556, 2556, 2650, 2475, 1418, 2367, 2425, 2499, 2329, 1903, 1382, 1943, 2743, 2365, 1033, 1137, 1208, 2146, 1281, 1162, 1058, 1559, 1677, 1305, 2233, 1292, 2711, 2593, 1718, 1106, 1186, 3032, 1339, 1510, 2344, 2147, 2377, 1806, 1903, 2379, 2123, 2339, 3240, 1510, 1976, 1635, 2139, 1312, 1453, 2355, 2169, 1440, 1733, 1922, 2220, 1415, 1480, 2464, 1610, 2690, 2133, 2898, 1271, 1833, 2758, 2345, 2182, 2583, 1861, 1092, 1216, 1806, 2873, 2532, 1396, 2085, 1202, 1128, 1342, 1780, 3049, 1525, 2809, 2643, 1838, 1753, 2837, 1531, 2332, 2471, 1897, 1312, 1586, 2396, 2761, 3243, 2312, 1077, 2405, 2092, 1260, 634, 600, 881, 888, 717, 1052, 613, 1043, 726, 659, 656, 802, 967, 635, 756, 644, 631, 833, 1104, 647, 866, 1115, 805, 683, 613, 869, 824, 946, 775, 692, 814, 656, 519, 914, 608, 708, 1007, 864, 595, 631, 613, 653, 1028, 763, 921, 705, 558, 689, 799, 713, 719, 927, 774, 686, 695, 581, 656, 812, 766, 1034, 1077, 903, 1025, 1098, 759, 905, 1049, 546, 763, 888, 994, 1101, 625, 930, 796, 747, 714, 567, 1013, 1357, 769, 1217, 793, 668, 823, 714, 658, 903, 769, 1025, 763, 1117, 762, 664, 689, 720, 1007, 689, 1119, 1165, 790, 829, 1302, 1196, 1214, 763, 939, 811, 1083, 788, 991, 824, 610, 1360, 1478, 924, 1180, 1160, 1302, 707, 999, 656, 1451, 1007, 1083, 1061, 1168, 1235, 976, 688, 771, 836, 729, 991, 705, 1244, 860, 1052, 573, 680, 850, 924, 814, 982, 601, 1034, 1168, 842, 933, 1337, 820, 709, 781, 1138, 1209, 1247, 744, 756, 854, 686, 811, 997, 894, 787, 952, 897, 857, 702, 1842, 1952, 1619, 1731, 1373, 1720, 1372, 2547, 1766, 2432, 2336, 1870, 2455, 2393, 1993, 1695, 1293, 1557, 2105, 1879, 1568, 2065, 2516, 2202, 2095, 2074, 1705, 1577, 1973, 2516, 2105, 2288, 1989, 1827, 1909, 1781, 2257, 2092, 1935, 2214, 2233, 2196, 1845, 1344, 2438, 1693, 1760, 1394, 2339, 2098, 1723, 2105, 2114, 2025, 2644, 1793, 1289, 2138, 2207, 1510, 1805, 1945, 2025, 2129, 2278, 2043, 2464, 1245, 1922, 1769, 2486, 1965, 750, 751, 1263, 547, 598, 605, 671, 470, 677, 1009, 555, 473, 913, 1326, 644, 622, 531, 568, 1305, 549, 825, 692, 580, 512, 1083, 918, 976, 491, 994, 1864, 698, 506, 736, 1623, 1388, 1847, 637, 735, 1049, 811, 1007, 484, 524, 658, 909, 1007, 576, 570, 808, 1522, 1085, 744, 518, 659, 869, 1601, 753, 991, 920, 827, 573, 714, 790, 854, 1571, 707, 878, 506, 1019, 567, 903, 488, 1382, 673, 526, 741, 851, 552, 981, 1052, 844, 1192, 558, 708, 601, 664, 1100, 869, 958, 973, 1266, 714, 1037, 1165, 1218, 775, 1114, 854, 967, 1196, 784, 741, 778, 840, 976, 885, 1052, 897, 912, 915, 717, 946, 1126, 1659, 1955, 1259, 1841, 1315, 1165, 1800, 1537, 1432, 2068, 1257, 1682, 1911, 1539, 1241, 2012, 1313, 1860, 1647, 1446, 2048, 1945, 1296, 1232, 2156, 1549, 1983, 1830, 1418, 1731, 1557, 1603, 1646, 1867, 1629, 1833, 1903, 1170, 1832, 1897, 2080, 1510, 2050, 1720, 1983, 1467, 1430, 1572, 2501, 1873, 1644, 1618, 2461, 1868, 1617, 2150, 1229, 1196, 1528, 1623, 1088, 2489, 1199, 1251, 1177, 1312, 1699, 1891, 1470, 2121, 1327, 1244, 2169, 1354, 2254, 2080, 2010, 1973, 1391, 1528, 1156, 1460, 2040, 1147, 1904, 1928, 1421, 2120, 2013, 1400, 2368, 1698, 2215, 2175, 1281, 1830, 1168, 1551, 2001, 1287, 1973, 2072, 2074, 1925, 1315, 2248, 1658, 1495, 1579, 2187, 1818, 1332, 1199, 2067, 1186, 1509, 1369, 2055, 1931, 2070, 1203, 1143, 1470, 2098, 2400, 1449, 1964, 1861, 1464, 1476, 1326, 1249, 1912, 1290, 1458, 2080, 1101, 1414, 1237, 1273, 1899, 1290, 1789, 2464, 2332, 791, 653, 894, 1717, 541, 528, 985, 1793, 1976, 2185, 763, 1305, 662, 1988, 2553, 2409, 3262, 2622, 3085, 2896, 3021, 2951, 3201, 3049, 3232, 2561, 2549, 2393, 2591, 2820, 3116, 2573, 3088, 2729, 3064, 2561, 2909, 2707, 2957, 2652, 3201, 3232, 2652, 2927, 3232, 2927, 3098, 3354, 2561, 2835, 3049, 2896, 2890, 2851, 2860, 2921, 2402, 2707, 3006, 2500, 2366, 2463, 2485, 2268, 2701, 2774, 3317, 2707, 3201, 2988, 3317, 3537, 2736, 2756, 2652, 3043, 3049, 2866, 2927, 2866, 2332, 2671, 2828, 2805, 2982, 2668, 2857, 2546, 2543, 2866, 2912, 2936, 2628, 3079, 2768, 2662, 2896, 2774, 2866, 2515, 3003, 2622, 2241, 2466, 2567, 2393, 2215, 2817, 2143, 2921, 2360, 2512, 2418, 2668, 2500, 2713, 2317, 2494, 2457, 2591, 2744, 2873, 2576, 2390, 2317, 2790, 2896, 3079, 2409, 3079, 3323, 3329, 3232, 2759, 3140, 2774, 3037, 2774, 2607), y = c(81, 63, 36, 46, 33, 40, 97, 99, 58, 32, 78, 88, 23, 61, 84, 179, 45, 41, 77, 134, 139, 110, 61, 43, 106, 122, 106, 109, 113, 139, 45, 151, 90, 109, 58, 89, 49, 58, 45, 119, 45, 39, 64, 61, 82, 49, 105, 51, 76, 62, 101, 193, 172, 78, 74, 57, 130, 44, 46, 114, 127, 34, 66, 79, 101, 42, 68, 46, 97, 70, 99, 73, 76, 72, 116, 73, 48, 44, 180, 78, 69, 70, 225, 34, 125, 195, 91, 144, 57, 85, 85, 129, 84, 104, 71, 47, 100, 191, 59, 57, 57, 74, 37, 81, 102, 69, 84, 67, 48, 59, 114, 95, 82, 81, 83, 89, 154, 65, 73, 44, 34, 124, 15, 105, 159, 86, 55, 54, 80, 48, 131, 77, 136, 37, 68, 43, 136, 49, 40, 48, 87, 63, 122, 88, 62, 155, 108, 148, 74, 101, 66, 94, 35, 126, 38, 28, 102, 32, 108, 162, 95, 56, 103, 149, 74, 95, 97, 59, 111, 170, 160, 99, 93, 145, 116, 129, 112, 116, 139, 139, 139, 109, 143, 108, 70, 59, 122, 72, 130, 176, 134, 102, 178, 161, 218, 111, 88, 168, 146, 216, 202, 72, 258, 135, 104, 203, 106, 46, 68, 119, 157, 121, 79, 109, 122, 126, 151, 92, 80, 71, 118, 124, 144, 112, 109, 142, 95, 128, 136, 112, 83, 89, 70, 94, 163, 65, 89, 132, 154, 145, 112, 151, 161, 104, 131, 135, 69, 120, 59, 74, 35, 34, 65, 98, 96, 47, 77, 90, 34, 66, 49, 60, 89, 38, 100, 33, 70, 34, 31, 55, 90, 71, 49, 65, 58, 117, 86, 46, 126, 60, 53, 81, 87, 51, 133, 42, 49, 66, 116, 71, 141, 62, 47, 40, 61, 55, 29, 120, 134, 84, 59, 36, 49, 132, 18, 113, 130, 96, 41, 86, 117, 89, 59, 59, 80, 106, 63, 54, 60, 53, 111, 73, 40, 37, 35, 46, 60, 94, 120, 74, 52, 103, 43, 157, 92, 93, 57, 131, 35, 50, 55, 155, 62, 78, 107, 48, 151, 54, 61, 156, 96, 72, 73, 24, 51, 79, 44, 63, 63, 46, 76, 37, 47, 83, 28, 74, 72, 66, 80, 48, 93, 83, 40, 80, 69, 70, 38, 164, 55, 66, 74, 113, 57, 34, 91, 117, 74, 94, 113, 123, 134, 73, 68, 78, 42, 38, 29, 67, 138, 19, 41, 100, 50, 69, 115, 84, 67, 169, 93, 64, 103, 234, 122, 219, 146, 67, 175, 140, 84, 190, 146, 107, 119, 91, 144, 174, 122, 108, 94, 126, 138, 105, 49, 40, 18, 27, 42, 39, 164, 54, 66, 51, 104, 86, 61, 79, 84, 27, 35, 13, 57, 104, 33, 45, 45, 38, 38, 39, 61, 32, 75, 34, 77, 51, 51, 33, 115, 63, 33, 29, 53, 37, 15, 51, 71, 8, 94, 46, 65, 22, 14, 82, 43, 85, 52, 52, 34, 100, 92, 35, 43, 71, 28, 57, 69, 36, 71, 129, 195, 112, 75, 87, 154, 83, 81, 83, 89, 82, 57, 62, 93, 66, 52, 106, 81, 130, 91, 102, 76, 90, 96, 81, 43, 57, 31, 74, 31, 26, 24, 28, 46, 71, 38, 106, 92, 45, 28, 44, 32, 104, 14, 50, 37, 104, 30, 48, 72, 38, 32, 68, 38, 107, 43, 61, 43, 52, 78, 148, 61, 13, 45, 49, 97, 13, 103, 49, 55, 25, 21, 24, 53, 39, 88, 19, 69, 72, 62, 35, 39, 10, 33, 26, 23, 89, 110, 12, 32, 6, 43, 89, 44, 43, 39, 6, 89, 9, 61, 63, 31, 36, 9, 53, 12, 28, 120, 18, 37, 41, 22, 41, 62, 140, 60, 21, 50, 64, 37, 32, 6, 17, 52, 0, 63, 70, 49, 32, 23, 47, 34, 76, 62, 49, 0, 23, 13, 41, 20, 22, 20, 42, 72, 54, 42, 13, 53, 80, 34, 39, 41, 69, 42, 21, 25, 47, 57, 16, 6, 36, 6, 61, 11, 13, 52, 33, 114, 109, 67, 138, 95, 97, 28, 102, 159, 73, 27, 52, 74, 48, 19, 85, 30, 79, 64, 91, 53, 91, 102, 61, 64, 58, 114, 89, 94, 30, 43, 33, 66, 58, 64, 74, 58, 56, 81, 86, 86, 84, 71, 58, 56, 56, 46, 64, 76, 48, 94, 102, 97, 76, 140, 23, 38, 30, 30, 56, 53, 84, 36, 51, 36, 76, 46, 48, 97, 79, 165, 91, 89, 94, 91, 43, 48, 61, 61, 56, 66, 79, 48, 51, 86, 48, 64, 99, 69, 53, 102, 64, 86, 58, 61, 71, 58, 41, 117, 160, 46, 127, 147, 122, 94, 48, 53, 38, 56, 64, 58, 56, 94, 41, 81, 71, 58, 43, 64, 41, 38, 48, 61, 46, 43, 66, 46, 38, 69, 86, 107, 89, 64, 157, 124, 124, 43, 107, 61, 69, 124, 94)), .Names = c("x", "elev", "y")) fields/R/unscale.R0000644000176200001440000000222114275252303013476 0ustar liggesusers# # fields is a package for analysis of spatial data written for # the R software environment. # Copyright (C) 2022 Colorado School of Mines # 1500 Illinois St., Golden, CO 80401 # Contact: Douglas Nychka, douglasnychka@gmail.edu, # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with the R software environment if not, write to the Free Software # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA # or see http://www.r-project.org/Licenses/GPL-2 ##END HEADER "unscale" <- function(x, x.center, x.scale) { x <- scale(x, center = FALSE, scale = 1/x.scale) x <- scale(x, center = -x.center, scale = FALSE) x } fields/R/image.family.R0000644000176200001440000003202414275252303014412 0ustar liggesusers# # fields is a package for analysis of spatial data written for # the R software environment. # Copyright (C) 2022 Colorado School of Mines # 1500 Illinois St., Golden, CO 80401 # Contact: Douglas Nychka, douglasnychka@gmail.edu, # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with the R software environment if not, write to the Free Software # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA # or see http://www.r-project.org/Licenses/GPL-2 ##END HEADER "imagePlotInfo" <- function(..., breaks = NULL, nlevel) { #NOTE: # image.plot.info # has been renamed as imagePlotInfo to avoid confusion with # an S3 method temp <- list(...) # xlim <- NA ylim <- NA zlim <- NA poly.grid <- FALSE # # go through various cases of what these can be # ##### x,y,z list is first argument if (is.list(temp[[1]])) { xlim <- range(temp[[1]]$x, na.rm = TRUE) ylim <- range(temp[[1]]$y, na.rm = TRUE) zlim <- range(temp[[1]]$z, na.rm = TRUE) if (is.matrix(temp[[1]]$x) & is.matrix(temp[[1]]$y) & is.matrix(temp[[1]]$z)) { poly.grid <- TRUE } } ##### check for polygrid first three arguments should be matrices ##### if (length(temp) >= 3) { if (is.matrix(temp[[1]]) & is.matrix(temp[[2]]) & is.matrix(temp[[3]])) { poly.grid <- TRUE } } ##### z is passed without an x and y (and not a poly.grid!) ##### if (is.matrix(temp[[1]]) & !poly.grid) { xlim <- c(0, 1) ylim <- c(0, 1) zlim <- range(temp[[1]], na.rm = TRUE) } ##### if x,y,z have all been passed find their ranges. ##### holds if poly.grid or not ##### if (length(temp) >= 3) { if (is.matrix(temp[[3]])) { xlim <- range(temp[[1]], na.rm = TRUE) ylim <- range(temp[[2]], na.rm = TRUE) zlim <- range(temp[[3]], na.rm = TRUE) } } # if constant z values perturb the range by epsilon (1e-8) to # avoid other problems in drawing legend later on if( !is.na( zlim[1] ) ){ if( abs(zlim[1] - zlim[2]) <= 1e-14 ){ if( zlim[1]==0){ zlim[1]<- -1e-8 zlim[2]<- 1e-8} else{ delta<- .01*abs(zlim[1]) zlim[1]<- zlim[1] - delta zlim[2]<- zlim[2] + delta } } } #### parse x,y,z if they are named arguments # determine if this is polygon grid (x and y are matrices) if (is.matrix(temp$x) & is.matrix(temp$y) & is.matrix(temp$z)) { poly.grid <- TRUE } # set limits from the usual $x $y $z format of image object xthere <- match("x", names(temp)) ythere <- match("y", names(temp)) zthere <- match("z", names(temp)) if (!is.na(zthere)) zlim <- range(temp$z, na.rm = TRUE) if (!is.na(xthere)) xlim <- range(temp$x, na.rm = TRUE) if (!is.na(ythere)) ylim <- range(temp$y, na.rm = TRUE) # overwrite limits with passed values if (!is.null(temp$zlim)) zlim <- temp$zlim if (!is.null(temp$xlim)) xlim <- temp$xlim if (!is.null(temp$ylim)) ylim <- temp$ylim # At this point xlim, ylim and zlim should be correct # using all the different possibilities and defaults for these values # # Now set up the breaks if( is.null(breaks)){ midpoints<- seq( zlim[1], zlim[2],,nlevel) delta<- (midpoints[2]- midpoints[1])/2 # nlevel +1 breaks with the min and max as midpoints # of the first and last bins. breaks <- c( midpoints[1]- delta, midpoints + delta) } list(xlim = xlim, ylim = ylim, zlim = zlim, poly.grid = poly.grid, breaks=breaks) } # NOTE: # image.plot.plt<- function(...){ # this function has been renamed as imageplot.setup to avoid confusion with # an S3 method # imageplot.setup(...)} "imageplot.setup" <- function(x, add = FALSE, legend.shrink = 0.9, legend.width = 1, horizontal = FALSE, legend.mar = NULL, bigplot = NULL, smallplot = NULL, ...) { old.par <- par(no.readonly = TRUE) if (is.null(smallplot)) stick <- TRUE else stick <- FALSE if (is.null(legend.mar)) { legend.mar <- ifelse(horizontal, 3.1, 5.1) } # compute how big a text character is char.size <- ifelse(horizontal, par()$cin[2]/par()$din[2], par()$cin[1]/par()$din[1]) # This is how much space to work with based on setting the margins in the # high level par command to leave between strip and big plot offset <- char.size * ifelse(horizontal, par()$mar[1], par()$mar[4]) # this is the width of the legned strip itself. legend.width <- char.size * legend.width # this is room for legend axis labels legend.mar <- legend.mar * char.size # smallplot is the plotting region for the legend. if (is.null(smallplot)) { smallplot <- old.par$plt if (horizontal) { smallplot[3] <- legend.mar smallplot[4] <- legend.width + smallplot[3] pr <- (smallplot[2] - smallplot[1]) * ((1 - legend.shrink)/2) smallplot[1] <- smallplot[1] + pr smallplot[2] <- smallplot[2] - pr } else { smallplot[2] <- 1 - legend.mar smallplot[1] <- smallplot[2] - legend.width pr <- (smallplot[4] - smallplot[3]) * ((1 - legend.shrink)/2) smallplot[4] <- smallplot[4] - pr smallplot[3] <- smallplot[3] + pr } } if (is.null(bigplot)) { bigplot <- old.par$plt if (!horizontal) { bigplot[2] <- min(bigplot[2], smallplot[1] - offset) } else { bottom.space <- old.par$mar[1] * char.size bigplot[3] <- smallplot[4] + offset } } if (stick & (!horizontal)) { dp <- smallplot[2] - smallplot[1] smallplot[1] <- min(bigplot[2] + offset, smallplot[1]) smallplot[2] <- smallplot[1] + dp } return(list(smallplot = smallplot, bigplot = bigplot)) } "crop.image" <- function(obj, loc = NULL, ...) { if (is.null(loc)) { image.plot(obj, ...) loc <- get.rectangle() } # coerce to midpoints m <- nrow(obj$z) n <- ncol(obj$z) nx <- length(obj$x) ny <- length(obj$y) if (nx != m) { obj$x <- (obj$x[1:m] + obj$x[2:(m + 1)])/2 } if (ny != n) { obj$y <- (obj$y[1:n] + obj$x[2:(n + 1)])/2 } # coerce loc to x,y list format if matrix or data frame if (is.matrix(loc) | is.data.frame(loc)) { if (ncol(loc) != 2) { stop("loc must have two columns\n(for x and y coordinates )") } loc <- list(x = loc[, 1], y = loc[, 2]) } x <- obj$x y <- obj$y N <- length(x) xr <- range(loc$x) xtest <- range(x) if (xr[1] < xtest[1] | xr[2] > xtest[2]) { stop("cropping outside ranges of x values") } x1 <- max((1:N)[xr[1] >= x]) x2 <- min((1:N)[xr[2] <= x]) N <- length(y) yr <- range(loc$y) ytest <- range(y) if (yr[1] < ytest[1] | yr[2] > ytest[2]) { stop("cropping outside ranges of y values") } y1 <- max((1:N)[yr[1] >= y]) y2 <- min((1:N)[yr[2] <= y]) list(x = obj$x[x1:x2], y = obj$y[y1:y2], z = obj$z[x1:x2, y1:y2]) } average.image <- function(obj, Q = 2) { # fast method to sum over a QXQ block in image. # Q is the number of elements to average over in each dimension # e.g. Q=5 -- blocks of 25 values are averaged to one grid cell. if (is.matrix(obj)) { obj <- list(x = 1:nrow(obj), y = 1:ncol(obj), z = obj) } M <- length(obj$x) N <- length(obj$y) Mi <- trunc(M/Q) Ni <- trunc(N/Q) # space to hold results z <- matrix(NA, nrow = Mi, ncol = N) x2 <- rep(NA, Mi) y2 <- rep(NA, Ni) indQ <- 1:Q # sum over block of rows and handle x grid values for (j in 1:Mi) { x2[j] <- mean(obj$x[indQ + (j - 1) * Q]) z[j, ] <- colMeans(obj$z[indQ + (j - 1) * Q, ], na.rm = TRUE) } # sum over blocks of columns and average y grid values for (k in 1:Ni) { y2[k] <- mean(obj$y[indQ + (k - 1) * Q]) z[, k] <- rowMeans(z[, indQ + (k - 1) * Q], na.rm = TRUE) } return(list(x = x2, y = y2, z = z[1:Mi, 1:Ni], Q = Q)) } "get.rectangle" <- function() { temp <- locator(2, type = "p", pch = "+") rect(temp$x[1], temp$y[1], temp$x[2], temp$y[2]) temp } "half.image" <- function(obj) { # coerce to list if a matrix if (is.matrix(obj)) { obj <- list(x = 1:nrow(obj), y = 1:ncol(obj), z = obj) } M <- length(obj$x) N <- length(obj$y) M2 <- trunc(M/2) N2 <- trunc(N/2) z <- matrix(NA, nrow = M2, ncol = N2) ix <- (1:M2) * 2 iy <- (1:N2) * 2 x2 <- (obj$x[ix - 1] + obj$x[ix])/2 y2 <- (obj$y[iy - 1] + obj$y[iy])/2 return(list(x = x2, y = y2, z = (obj$z[ix - 1, iy] + obj$z[ix - 1, iy - 1] + obj$z[ix, iy - 1] + obj$z[ix, iy])/4)) } pushpin <- function(x, y, z, p.out, height = 0.05, col = "black", text = NULL, adj = -0.1, cex = 1, ...) { # project your x,y,z on to the uv plane of the plot Sxy1 <- trans3d(x, y, z, p.out) Sxy2 <- Sxy1 hold <- par()$usr Sxy2$y <- (hold[4] - hold[3]) * height + Sxy2$y # draw the pin segments(Sxy1$x, Sxy1$y, Sxy2$x, Sxy2$y, col = "black") points(Sxy2, col = col, pch = 19, cex = cex) # add a label if (!is.null(text)) { text(Sxy2$x, Sxy2$y, label = text, adj = adj, cex = cex, ...) } } designer.colors <- function(n = 256, col = c("darkgreen", "white", "darkred"), x = seq(0, 1,, length(col) ), alpha = 1) { # generate colors at equal spacings but interpolate to colors at x xRange<- range(x) xg <- seq(xRange[1], xRange[2],, n) # convert colors from names e.g. "magenta" to rgb in [0.1] y.rgb <- t(col2rgb(col))/255 # matrix to hold RGB color values temp <- matrix(NA, ncol = 3, nrow = n) nColors<- length( col) if( nColors != length( x)){ stop("number of colors needs to be the same as length of x")} # linear or spline interpolation of RGB color values at x onto xg for (k in 1:3) { if( nColors > 2){ hold <- splint(x, y.rgb[, k], xg)} else{ a<-(xRange[2]-xg)/(xRange[2] - xRange[1]) hold<- a*y.rgb[1, k] + (1-a)*y.rgb[2, k] } # fix up to be in [0,1] hold[hold < 0] <- 0 hold[hold > 1] <- 1 temp[, k] <- hold } # convert back to hex if(alpha==1){ return( rgb(temp[, 1], temp[, 2], temp[, 3])) } else{ return( rgb(temp[, 1], temp[, 2], temp[, 3], alpha = alpha)) } } #boulder.colors<- c('darkred', 'darkorange', # 'white', 'darkgreen', 'darkblue') "two.colors" <- function(n = 256, start = "darkgreen", end = "red", middle = "white", alpha = 1) { designer.colors(n, c(start, middle, end), alpha = alpha) } fieldsPlotColors<- function( col, ...){ N<- length(col) image.plot( 1:N, 1, matrix(1:N,N,1), col=col,axes=FALSE, xlab='', ylab='',...)} imageplot.info<- function (...) { temp <- list(...) xlim <- NA ylim <- NA zlim <- NA poly.grid <- FALSE if (is.list(temp[[1]])) { xlim <- range(temp[[1]]$x, na.rm = TRUE) ylim <- range(temp[[1]]$y, na.rm = TRUE) zlim <- range(temp[[1]]$z, na.rm = TRUE) if (is.matrix(temp[[1]]$x) & is.matrix(temp[[1]]$y) & is.matrix(temp[[1]]$z)) { poly.grid <- TRUE } } if (length(temp) >= 3) { if (is.matrix(temp[[1]]) & is.matrix(temp[[2]]) & is.matrix(temp[[3]])) { poly.grid <- TRUE } } if (is.matrix(temp[[1]]) & !poly.grid) { xlim <- c(0, 1) ylim <- c(0, 1) zlim <- range(temp[[1]], na.rm = TRUE) } if (length(temp) >= 3) { if (is.matrix(temp[[3]])) { xlim <- range(temp[[1]], na.rm = TRUE) ylim <- range(temp[[2]], na.rm = TRUE) zlim <- range(temp[[3]], na.rm = TRUE) } } if (is.matrix(temp$x) & is.matrix(temp$y) & is.matrix(temp$z)) { poly.grid <- TRUE } xthere <- match("x", names(temp)) ythere <- match("y", names(temp)) zthere <- match("z", names(temp)) if (!is.na(zthere)) zlim <- range(temp$z, na.rm = TRUE) if (!is.na(xthere)) xlim <- range(temp$x, na.rm = TRUE) if (!is.na(ythere)) ylim <- range(temp$y, na.rm = TRUE) if (!is.null(temp$zlim)) zlim <- temp$zlim if (!is.null(temp$xlim)) xlim <- temp$xlim if (!is.null(temp$ylim)) ylim <- temp$ylim list(xlim = xlim, ylim = ylim, zlim = zlim, poly.grid = poly.grid) } fields/R/summary.ncdf.R0000644000176200001440000000364614275252303014466 0ustar liggesusers# # fields is a package for analysis of spatial data written for # the R software environment. # Copyright (C) 2022 Colorado School of Mines # 1500 Illinois St., Golden, CO 80401 # Contact: Douglas Nychka, douglasnychka@gmail.edu, # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with the R software environment if not, write to the Free Software # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA # or see http://www.r-project.org/Licenses/GPL-2 ##END HEADER "summary.ncdf" <- function (object, ...) { tempList<- NULL varNames<- NULL # cat("DIMENSIONS", fill=TRUE) for (i in names(object$dim) ) { vname = i ndims = length(object$dim[[i]]$vals) cat(vname, " has size", ndims, fill=TRUE) } cat(fill=TRUE) cat("VARIABLES", fill=TRUE) for (i in 1:object$nvars) { vname = object$var[[i]]$name ndims = object$var[[i]]$ndims dimstring = paste(vname, "( variable ",i , ") has shape") dimTemp<- NULL for (j in 1:ndims) { dimTemp<- c( dimTemp, object$var[[i]]$dim[[j]]$len) } temp<- ( dimTemp) varNames<- c(varNames, vname) tempList<- c( tempList, list(dimTemp)) if( is.null(dimTemp) ){ dimTemp<- NA} cat( i,":", vname, "has size ", dimTemp, sep=" ", fill = TRUE) } names(tempList) <- varNames invisible( tempList) } fields/R/circulantEmbeddingSetup.R0000644000176200001440000001062214320106151016642 0ustar liggesusers# # fields is a package for analysis of spatial data written for # the R software environment. # Copyright (C) 2022 Colorado School of Mines # 1500 Illinois St., Golden, CO 80401 # Contact: Douglas Nychka, douglasnychka@gmail.edu, # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with the R software environment if not, write to the Free Software # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA # or see http://www.r-project.org/Licenses/GPL-2 ##END HEADER circulantEmbeddingSetup <- function( grid, M = NULL, mKrigObject=NULL, cov.function="stationary.cov", cov.args=NULL, delta=NULL, ...) { # # if( !is.null(mKrigObject)){ # mine the mKrigObject to get the covariance model. cov.args<- mKrigObject$args cov.function<- mKrigObject$cov.function.name } else{ cov.args<-c( cov.args, list(...)) } L<- length( grid) dx<- rep( NA, L) m<- rep( NA, L) for( i in 1:L){ gridTmp<- grid[[i]] dx[i]<- gridTmp[2]- gridTmp[1] m[i]<- length( gridTmp) } # M is the larger grid size for the circulant covariance that includes m # should be at least 2*m for embedding to be exact. # It can be made larger to enforce positive definiteness # if( !is.null(delta)){ M<- rep( NA, L) for( i in 1:L){ M[i]<- m[i] + ceiling( delta/ dx[i]) } } # choose a good composite M is not specified if( is.null(M)){ # table of composite M with factors of 2 and 3 p23<-expand.grid( 0:15, 0:15) value<- 2^p23[,1] * 3^p23[,2] # all values from 2 and 3 up to 100000 value<- sort( value[ value <= 1e6]) M<- rep( NA, L) for( i in 1:L){ # smallest composite choice >= to 2*m valueGreater<- value[ value >= 2*m[i] ] M[i]<- min( valueGreater ) } } if( length(M)!= length( grid)){ stop("M should be same length as grid") } # create the larger multigrid now using M bigIndex<- makeMultiIndex( M) MCenter<- round( M/2) center<- rbind( MCenter* dx) # this might be made more efficient another way .... bigGrid<- array( NA, dim(bigIndex) ) for( i in 1:L){ bigGrid[,i]<- bigIndex[,i]*dx[i] } # # here is where the actual covariance form is used # note passed arguments from call for parameters etc. # out<- do.call(cov.function, c(cov.args, list(x1 = bigGrid, x2 = center))) # coerce to an array note that this depends on the bigIndex varying in the right way out<- array( c(out),M) # # a simple way to normalize. This could be avoided by # translating image from the center ... # add to the middle point in the array -- matches the center from above temp <- array( 0, M) temp[rbind( MCenter)] <- 1 wght <- fft(out)/(fft(temp) * prod(M)) if( any( Re(wght) < 0 ) ){ cat("summary of real part of weights", fill=TRUE) print( t(stats( c(Re(wght))) ) ) stop(" Some weights are less than zero indicating a circulant embedding that is not postive definite. This can be due to the correlation range being too large for the grid. Try increasing the spatial domain or decreasing the number of grid points. ") } # # wght is the discrete FFT for the covariance suitable for fast # multiplication by convolution. # covObject <- list(m = m, grid = grid, dx=dx, M = M, delta=delta, wght = wght, call = match.call()) return( covObject) } fields/R/rad.image.cov.R0000644000176200001440000000433714275252303014473 0ustar liggesusers# # fields is a package for analysis of spatial data written for # the R software environment. # Copyright (C) 2022 Colorado School of Mines # 1500 Illinois St., Golden, CO 80401 # Contact: Douglas Nychka, douglasnychka@gmail.edu, # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with the R software environment if not, write to the Free Software # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA # or see http://www.r-project.org/Licenses/GPL-2 ##END HEADER "Rad.image.cov" <- function(ind1, ind2, Y, cov.obj = NULL, setup = FALSE, grid, ...) { if (is.null(cov.obj)) { dx <- grid$x[2] - grid$x[1] dy <- grid$y[2] - grid$y[1] m <- length(grid$x) n <- length(grid$y) M <- ceiling2(2 * m) N <- ceiling2(2 * n) xg <- make.surface.grid(list((1:M) * dx, (1:N) * dy)) center <- matrix(c((dx * M)/2, (dy * N)/2), nrow = 1, ncol = 2) out <- Rad.cov(xg, center, ...) out <- as.surface(xg, c(out))$z temp <- matrix(0, nrow = M, ncol = N) temp[M/2, N/2] <- 1 wght <- fft(out)/(fft(temp) * M * N) cov.obj <- list(m = m, n = n, grid = grid, N = N, M = M, wght = wght, call = match.call()) if (setup) { return(cov.obj) } } temp <- matrix(0, nrow = cov.obj$M, ncol = cov.obj$N) if (missing(ind1)) { temp[1:cov.obj$m, 1:cov.obj$n] <- Y Re(fft(fft(temp) * cov.obj$wght, inverse = TRUE)[1:cov.obj$m, 1:cov.obj$n]) } else { if (missing(ind2)) { temp[ind1] <- Y } else { temp[ind2] <- Y } Re(fft(fft(temp) * cov.obj$wght, inverse = TRUE)[ind1]) } } fields/R/plot.spatialDesign.R0000644000176200001440000000206714275252303015620 0ustar liggesusers# # fields is a package for analysis of spatial data written for # the R software environment. # Copyright (C) 2022 Colorado School of Mines # 1500 Illinois St., Golden, CO 80401 # Contact: Douglas Nychka, douglasnychka@gmail.edu, # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with the R software environment if not, write to the Free Software # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA # or see http://www.r-project.org/Licenses/GPL-2 ##END HEADER "plot.spatialDesign" <- function(x, ...) { pairs(x$design, ...) } fields/R/ExponentialUpper.R0000644000176200001440000000317014275252302015351 0ustar liggesusers# # fields is a package for analysis of spatial data written for # the R software environment. # Copyright (C) 2022 Colorado School of Mines # 1500 Illinois St., Golden, CO 80401 # Contact: Douglas Nychka, douglasnychka@gmail.edu, # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with the R software environment if not, write to the Free Software # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA # or see http://www.r-project.org/Licenses/GPL-2 ##END HEADER ExponentialUpper = function(distMat, range = 1, alpha = 1/range, theta=NULL) { # theta argument has been depreciated. if( !is.null( theta)){ aRange<- theta } # Evaluates the exponential covariance function over the upper triangle of the distance matrix if(nrow(distMat) != ncol(distMat)) stop('distance matrix is non-symmetric. Should not be calling ExponentialUpper.') return(.Call("ExponentialUpperC", as.double(distMat), as.integer(nrow(distMat)), as.double(alpha), PACKAGE = "fields")) #convert ans to standard matrix #ans = ans[[1]] #dim(ans) = dim(distMat) #return(ans) } fields/R/interp.surface.grid.R0000644000176200001440000000243414275252303015726 0ustar liggesusers# # fields is a package for analysis of spatial data written for # the R software environment. # Copyright (C) 2022 Colorado School of Mines # 1500 Illinois St., Golden, CO 80401 # Contact: Douglas Nychka, douglasnychka@gmail.edu, # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with the R software environment if not, write to the Free Software # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA # or see http://www.r-project.org/Licenses/GPL-2 ##END HEADER "interp.surface.grid" <- function(obj, grid.list) { x <- grid.list$x y <- grid.list$y M <- length(x) N <- length(y) out <- matrix(NA, nrow = M, ncol = N) for (i in 1:M) { out[i, ] <- interp.surface(obj, cbind(rep(x[i], N), y)) } list(x = x, y = y, z = out) } fields/R/stats.bin.R0000644000176200001440000000325214342476507013767 0ustar liggesusers# # fields is a package for analysis of spatial data written for # the R software environment. # Copyright (C) 2022 Colorado School of Mines # 1500 Illinois St., Golden, CO 80401 # Contact: Douglas Nychka, douglasnychka@gmail.edu, # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with the R software environment if not, write to the Free Software # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA # or see http://www.r-project.org/Licenses/GPL-2 ##END HEADER "stats.bin" <- function(x, y, N = 10, breaks = NULL, prettyBins=FALSE) { out <- list() if (is.null(breaks)) { if(prettyBins){ breaks <- pretty(x, N) } else{ breaks<- seq( min( x), max(x), length.out=N) } } NBIN <- length(breaks) - 1 centers <- (breaks[1:NBIN] + breaks[2:(NBIN + 1)])/2 test <- describe() obj <- matrix(NA, ncol = NBIN, nrow = length(test)) dimnames(obj) <- list(test, format(1:NBIN)) obj[, 1] <- describe(y[x <= breaks[2] & x >= breaks[1]]) for (k in 2:NBIN) { obj[, k] <- describe(y[x <= breaks[k + 1] & x > breaks[k]]) } list(centers = centers, breaks = breaks, stats = obj) } fields/R/qr.q2ty.R0000644000176200001440000000240014275252303013363 0ustar liggesusers# # fields is a package for analysis of spatial data written for # the R software environment. # Copyright (C) 2022 Colorado School of Mines # 1500 Illinois St., Golden, CO 80401 # Contact: Douglas Nychka, douglasnychka@gmail.edu, # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with the R software environment if not, write to the Free Software # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA # or see http://www.r-project.org/Licenses/GPL-2 ##END HEADER "qr.q2ty" <- function(qr, y) { if (!is.matrix(y)) { y <- as.matrix(y) } dy <- dim(y) dq <- dim(qr$qr) rank <- qr$rank if (dy[1] != dq[1]) stop("y and qr$qr should have same number of rows") qr.qty(qr, y)[(rank + 1):dy[1], ] } fields/R/set.panel.R0000644000176200001440000000250414275252303013741 0ustar liggesusers# # fields is a package for analysis of spatial data written for # the R software environment. # Copyright (C) 2022 Colorado School of Mines # 1500 Illinois St., Golden, CO 80401 # Contact: Douglas Nychka, douglasnychka@gmail.edu, # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with the R software environment if not, write to the Free Software # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA # or see http://www.r-project.org/Licenses/GPL-2 ##END HEADER "set.panel" <- function(m = 1, n = 1, relax = FALSE) { temp <- par() single.plot <- (temp$mfg[3] == 1 & temp$mfg[4] == 1) if (!relax | single.plot | ((m == 1) & (n == 1))) { par(mfrow = c(m, n)) cat("plot window will lay out plots in a", m, "by", n, "matrix ", fill = TRUE) } invisible() } fields/R/setup.image.smooth.R0000644000176200001440000000400314275252303015575 0ustar liggesusers# # fields is a package for analysis of spatial data written for # the R software environment. # Copyright (C) 2022 Colorado School of Mines # 1500 Illinois St., Golden, CO 80401 # Contact: Douglas Nychka, douglasnychka@gmail.edu, # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with the R software environment if not, write to the Free Software # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA # or see http://www.r-project.org/Licenses/GPL-2 ##END HEADER "setup.image.smooth" <- function(nrow = 64, ncol = 64, dx = 1, dy = 1, kernel.function = double.exp, aRange = 1, xwidth = nrow * dx, ywidth = ncol * dx, lambda = NULL, theta=NULL, ...) { # theta is depreciated if( !is.null(theta)){ aRange<- theta } # M2 <- round((nrow + xwidth/dx)/2) N2 <- round((ncol + ywidth/dy)/2) M <- 2 * M2 N <- 2 * N2 xi <- seq(-(M2 - 1), M2, 1) * dx xi <- xi/aRange yi <- seq(-(N2 - 1), (N2), 1) * dy yi <- yi/aRange dd <- ((matrix(xi, M, N)^2 + matrix(yi, M, N, byrow = TRUE)^2)) out <- matrix(kernel.function(dd, ...), nrow = M, ncol = N) out2 <- matrix(0, M, N) out2[M2, N2] <- 1 W = fft(out)/fft(out2) if (!is.null(lambda)) { # want fft(out) / ( fft(out2)*lambda + fft(out)) W = W/(lambda/fft(out2) + W) } list(W = W/(M * N), dx = dx, dy = dy, xwidth = xwidth, ywidth = ywidth, M = M, N = N, m = nrow, n = ncol, lambda = lambda, grid = list(x = xi, y = yi)) } fields/R/cat.to.list.R0000644000176200001440000000242414275252302014212 0ustar liggesusers# # fields is a package for analysis of spatial data written for # the R software environment. # Copyright (C) 2022 Colorado School of Mines # 1500 Illinois St., Golden, CO 80401 # Contact: Douglas Nychka, douglasnychka@gmail.edu, # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with the R software environment if not, write to the Free Software # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA # or see http://www.r-project.org/Licenses/GPL-2 ##END HEADER "cat.to.list" <- function(x, a) { a <- as.character(a) label <- unique(a) out <- as.list(1:length(label)) names(out) <- label for (k in 1:length(label)) { out[[k]] <- x[label[k] == a] if (length(out[[k]]) == 0) out[[k]] <- NA } out } fields/R/spatialProcess.R0000644000176200001440000002557214444355231015060 0ustar liggesusers# # fields is a package for analysis of spatial data written for # the R software environment. # Copyright (C) 2022 Colorado School of Mines # 1500 Illinois St., Golden, CO 80401 # Contact: Douglas Nychka, douglasnychka@gmail.edu, # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # You should have received a copy of the GNU General Public License # along with the R software environment if not, write to the Free Software # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA # or see http://www.r-project.org/Licenses/GPL-2 ##END HEADER spatialProcess <- function(x, y, weights = rep(1, nrow(x)), Z = NULL, ZCommon = NULL, mKrig.args = NULL, cov.function = NULL, cov.args = NULL, parGrid = NULL, reltol = 1e-4, na.rm = TRUE, verbose = FALSE, REML = FALSE, cov.params.start = NULL, gridN = 5, profileLambda = FALSE, profileARange = FALSE, profileGridN = 15, gridARange = NULL, gridLambda = NULL, CILevel = .95, iseed = 303, collapseFixedEffect = TRUE, ...) { # THE RULES: # Being in the cov.params.start list means a parameter will be optimized # by maximum likelhood. # If a parameter is in the cov.args list it will be fixed in its value # # NOTE all the ... extra arguents are assumed to be for the cov.args list GCV<- FALSE # top level placeholder to add GCV search capability once # algorithm is stable # this default choice is used in the next level functions. # set defaults based on the model passed. # obj is the output list and will be added to throughout the computation extraArgs<- list(...) if( REML&GCV){ stop("Cannot optimize for both REML and GCV!") } obj<- spatialProcessSetDefaults(x, cov.function = cov.function, cov.args = cov.args, cov.params.start = cov.params.start, mKrig.args = mKrig.args, extraArgs = extraArgs, parGrid = parGrid, gridN = gridN, collapseFixedEffect = collapseFixedEffect, verbose = verbose) # # obj$CASE # 0 evaluate on passed cov parameters but MLEs for sigma, tau found from # lambda # # 1 optimize loglikelihood over any parameters specified in # cov.params.start but not in cov.args # # 2 grid search over parameters using parGrid and generating starting values for # for the MLEs # # 3 profile over lambda and/or aRange # this is more computationally demanding. if( verbose){ cat(" The CASE:", obj$CASE, fill=TRUE) cat("Complete list of components in cov.args: ", "\n", names(obj$cov.args),fill=TRUE ) } if( verbose){ cat( "Names cov.args:","\n", names( obj$cov.args), fill=TRUE) cat( "Names cov.params.start:","\n", names(cov.params.start), fill=TRUE) cat( "Names argsFull:","\n", names( obj$cov.argsFull),fill=TRUE ) } #################################################################### # CASE 2 grid search for starting values #################################################################### if( (obj$CASE == 2 ) ){ if( verbose){ cat("grid search starts", fill=TRUE) print(cov.params.start ) cat("parGrid names: " , fill=TRUE) print( names( parGrid)) } InitialGridSearch<- mKrigMLEGrid(x, y, weights = weights, Z = Z, ZCommon = ZCommon, mKrig.args = mKrig.args, cov.function = obj$cov.function, cov.args = obj$cov.args, par.grid = obj$parGrid, reltol = reltol, na.rm = na.rm, verbose = verbose, REML = REML, GCV = GCV, cov.params.start = cov.params.start) # use grid search to set starting values if( all(is.na(InitialGridSearch$summary) )) { cat("spatialProcess: Problems with optim in grid search", fill=TRUE) cat("returned object includes the likelihood evaluations up to the error", fill=TRUE) InitialGridSearch$optimSuccess<- FALSE InitialGridSearch$call<- match.call() return(InitialGridSearch) } if( verbose){ print(InitialGridSearch$indMax ) } parNames<- names( obj$parGrid) if( is.null( cov.params.start)){ cov.params.start<- obj$parGrid[InitialGridSearch$indMax,] names(cov.params.start )<- parNames } else{ #print( parNames) #print( obj$parGrid) cov.params.start[parNames] <- obj$parGrid[InitialGridSearch$indMax, parNames] } } #################################################################### # CASES 1 , 2 , 3, 4 #################################################################### if(obj$CASE !=0 ){ # optimze over all parameters # where starting values are given or if # values in cov.args are omitted. obj$cov.params.start<- cov.params.start MLEInfo <-mKrigMLEJoint(x, y, weights = weights, Z = Z, ZCommon = ZCommon, mKrig.args = obj$mKrig.args, cov.function = obj$cov.function, cov.args = obj$cov.args, na.rm = na.rm, reltol=reltol, cov.params.start = cov.params.start, REML = REML, GCV = GCV, hessian = TRUE, verbose = verbose, iseed = iseed) if( is.na(MLEInfo$summary[1])){ cat("spatialProcess: Problems with optim in mKrigMLEJoint ", fill=TRUE) cat("returned object includes the likelihood evaluations up to the error", fill=TRUE) MLEInfo$optimSuccess<- FALSE MLEInfo$call<- match.call() return(MLEInfo) } covarianceMLE<- -1*solve(MLEInfo$optimResults$hessian) HessianResults<- diag( covarianceMLE) if( any( HessianResults < 0) ) { warning("Numerical hessian from optim indicates MLE is not a maximum") } } ################################################################################ # final fit # now fit spatial model with MLE(s) # or the value(s) supplied in the call # reestimate the other parameters for simplicity to get the # complete mKrig object #################################################################### # if all parameters are fixed -- don't mess with cov.args if( obj$CASE == 0){ obj$cov.argsFull <- obj$cov.args } else{ dupParameters<- match( names(MLEInfo$pars.MLE ), names(cov.args) ) if( all( is.na(dupParameters)) ){ obj$cov.argsFull<- c( obj$cov.args, as.list(MLEInfo$pars.MLE) ) } } mKrigObj <- do.call( "mKrig", c( list(x=x, y=y, weights=weights, Z=Z, ZCommon=ZCommon), obj$mKrig.args, list( na.rm=na.rm), list(cov.function = obj$cov.function), obj$cov.argsFull ) ) #################################################################### # sort out output object based on the different cases # also copy some information from the call and within function # the output list, obj #################################################################### obj$GCV <- GCV obj$REML <- REML obj$CILevel<- CILevel if( obj$CASE==0){ obj$MLEInfo <- NULL obj$MLESummary <- mKrigObj$summary obj$InitialGridSearch<- NULL obj$parameterCovariance<- NULL } if( obj$CASE==1){ InitialGridSearch<- NULL } #################################################################### # Fill in all info related to finding MLE (Not CASE 0) #################################################################### if( obj$CASE!=0){ # logical to distinguish from optim failure obj$optimSuccess<-TRUE # obj$InitialGridSearch<- InitialGridSearch obj$MLEInfo<- MLEInfo obj$MLESummary <- MLEInfo$summary # NOTE: covariance for lambda and ARange based on log(lambda) and log(ARange) obj$parameterCovariance<- solve( -1*MLEInfo$optimResults$hessian) #################################################################### # Approximate large sample confidence intervals on the transformed scale # followed by # then transforming back to original scale (see MLEInfo$par.transform) # These are filled with NAs when numerical Hessian is not # positive definite #################################################################### obj$CITable<- confidenceIntervalMLE(obj, CILevel) } # combine everything into the output list, mKrig components first. obj <- c( mKrigObj,obj) # replace call in mKrig object with the top level one # from spatialProcess obj$call<- match.call() class(obj) <- c( "spatialProcess","mKrig") #################################################################### # Profiling depends on complete spatial process obj # which is why this is last #################################################################### if (profileLambda) { obj$profileSummaryLambda <- profileMLE(obj, "lambda", parGrid = gridLambda, gridN = profileGridN )$summary } else{ obj$profileSummaryLambda <- NULL } if (profileARange) { obj$profileSummaryARange <- profileMLE(obj, "aRange", parGrid = gridARange, gridN = profileGridN, )$summary } else{ obj$profileSummaryARange <- NULL } return(obj) } fields/R/predictSurface.family.R0000644000176200001440000000670514467430015016303 0ustar liggesusers# # fields is a package for analysis of spatial data written for # the R software environment. # Copyright (C) 2022 Colorado School of Mines # 1500 Illinois St., Golden, CO 80401 # Contact: Douglas Nychka, douglasnychka@gmail.edu, # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with the R software environment if not, write to the Free Software # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA # or see http://www.r-project.org/Licenses/GPL-2 ##END HEADER "predict.surface" <- function(object, ...) { UseMethod("predict.surface") } predict.surface.default<- function(object,...){ cat("predict.surface is now the function predictSurface") } "predictSurface"<- function( object,...){ UseMethod("predictSurface") } "predictSurface.default" <- function(object, grid.list = NULL, extrap = FALSE, chull.mask = NA, nx = 80, ny = 80, xy = c(1,2), verbose = FALSE, ...) { # NOTE: # without grid.list # default is 80X80 grid on first two variables # rest are set to median value of x. if (is.null(grid.list)) { grid.list <- fields.x.to.grid(object$x, nx = nx, ny = ny, xy = xy) } # here is the heavy lifting xg <- make.surface.grid(grid.list) # NOTE: the specific predict function called will need to do the checks # whether the evaluation of a large number of grid points makes sense. out <- as.surface( xg, predict(object, xg,...) ) # # if extrapolate is FALSE set all values outside convex hull to NA if (!extrap) { if( is.null( object$x)){ stop("need and x matrix in object") } if (is.na(chull.mask)) { chull.mask <- unique.matrix(object$x[, xy]) } out$z[!in.poly(xg[, xy], xp = chull.mask, convex.hull = TRUE)] <- NA } # return(out) } "predictSurface.fastTps" <- function(object, gridList=NULL, extrap = FALSE, chull.mask = NA, nx = 80, ny = 80, xy = c(1,2), verbose = FALSE, ...) { # NOTE: See predictSurface.default for comments if (is.null(gridList)) { gridList <- fields.x.to.grid(object$x, nx = nx, ny = ny, xy = xy) } # in the case of fastTps and not great circle distance # pass the grid list instead of the locations of grid points # (see xg in predictSurface.default) if( object$args$Dist.args$method =="greatcircle"){ out <- predict(object, xnew= make.surface.grid(gridList), xy=xy, ...) } else{ out <- predict(object, grid.list=gridList, xy=xy, ...) } # coerce to image format out <- as.surface(gridList, out ) # # if extrapolate is FALSE set all values outside convex hull to NA if (!extrap) { if (is.na(chull.mask)) { chull.mask <- unique.matrix(object$x[, xy]) } xg<- make.surface.grid( gridList) out$z[!in.poly(xg[, xy], xp = chull.mask, convex.hull = TRUE)] <- NA } # return(out) } fields/R/sim.Krig.R0000644000176200001440000001143714275252303013540 0ustar liggesusers# # fields is a package for analysis of spatial data written for # the R software environment. # Copyright (C) 2022 Colorado School of Mines # 1500 Illinois St., Golden, CO 80401 # Contact: Douglas Nychka, douglasnychka@gmail.edu, # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with the R software environment if not, write to the Free Software # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA # or see http://www.r-project.org/Licenses/GPL-2 ##END HEADER "sim.Krig" <- function(object, xp, M = 1, verbose = FALSE, ...) { tau2 <- object$best.model[2] sigma <- object$best.model[3] # # check for unique rows of xp if (any(duplicated(xp))) { stop(" predictions locations should be unique") } # # set up various sizes of arrays m <- nrow(xp) n <- nrow(object$xM) N <- length(object$y) if (verbose) { cat(" m,n,N", m, n, N, fill = TRUE) } #transform the new points xc <- object$transform$x.center xs <- object$transform$x.scale xpM <- scale(xp, xc, xs) # complete set of points for prediction. # check for replicates and adjust x <- rbind(object$xM, xpM) if (verbose) { cat("full x ", fill = TRUE) print(x) } # # find indices of all rows of xp that correspond to rows of # xM and then collapse x to unique rows. rep.x.info <- fields.duplicated.matrix(x) x <- as.matrix(x[!duplicated(rep.x.info), ]) if (verbose) { cat("full x without duplicates ", fill = TRUE) print(x) } N.full <- nrow(x) if (verbose) { cat("N.full", N.full, fill = TRUE) } # these give locations in x matrix to reconstruct xp matrix xp.ind <- rep.x.info[(1:m) + n] if (verbose) { print(N.full) print(x) } if (verbose) { cat("reconstruction of xp from collapsed locations", fill = TRUE) print(x[xp.ind, ]) } # # Sigma is full covariance at the data locations and at prediction points. # Sigma <- sigma * do.call(object$cov.function.name, c(object$args, list(x1 = x, x2 = x))) # # square root of Sigma for simulating field # Cholesky is fast but not very stable. # # the following code line is similar to chol(Sigma)-> Scol # but adds possible additional arguments controlling the Cholesky # from the Krig object. # Schol <- do.call("chol", c(list(x = Sigma), object$chol.args)) # # output matrix to hold results N.full <- nrow(x) out <- matrix(NA, nrow = m, ncol = M) # # find conditional mean field from initial fit # don't multiply by sd or add mean if this is # a correlation model fit. # (these are added at the predict step). h.hat <- predict(object, xp, ...) # marginal standard deviation of field. temp.sd <- 1 # # # this is not 1 if Krig object is a corelation model. if (object$correlation.model) { if (!is.na(object$sd.obj[1])) { temp.sd <- predict(object$sd.obj, x) } } # # Define W2i for simulating errors. # W2i <- Krig.make.Wi(object)$W2i for (k in 1:M) { # simulate full field h <- t(Schol) %*% rnorm(N.full) # value of simulated field at observations # # NOTE: fixed part of model (null space) need not be simulated # because the estimator is unbiased for this part. # the variability is still captured because the fixed part # is still estimated as part of the predict step below h.data <- h[1:n] # expand the values according to the replicate pattern h.data <- h.data[object$rep.info] # create synthetic data y.synthetic <- h.data + sqrt(tau2) * W2i %d*% rnorm(N) # predict at xp using these data # and subtract from 'true' value # note that true values of field have to be expanded in the # case of common locations between xM and xp. h.true <- (h[xp.ind]) temp.error <- predict(object, xp, y = y.synthetic, eval.correlation.model = FALSE, ...) - h.true # add the error to the actual estimate (conditional mean) # and adjust by marginal standard deviation out[,k ] <- h.hat + temp.error * temp.sd } out } fields/R/parse.grid.list.R0000644000176200001440000000413414275252303015061 0ustar liggesusers# # fields is a package for analysis of spatial data written for # the R software environment. # Copyright (C) 2022 Colorado School of Mines # 1500 Illinois St., Golden, CO 80401 # Contact: Douglas Nychka, douglasnychka@gmail.edu, # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with the R software environment if not, write to the Free Software # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA # or see http://www.r-project.org/Licenses/GPL-2 ##END HEADER "parse.grid.list" <- function(grid.list, order.variables = "xy") { # # utility to find the x and y sequences in grid.list # this is used in predictSurface and as.surface # M <- length(grid.list) gcounts <- unlist(lapply(grid.list, FUN = length)) xy <- (1:M)[(gcounts > 1)] if( length(xy) ==1){ xy<- sort( c(xy, which(gcounts == 1 ) ) ) } if (length(xy) > 2) { stop("only two components of the grid list\ncan have more than one element") } # # swap the roles of x and y for 2D grid if (order.variables == "yx" & (M!=1) ) { xy <- xy[2:1] } # # # here is the good stuff # nx <- gcounts[xy[1]] ny <- gcounts[xy[2]] x <- grid.list[[xy[1]]] y <- grid.list[[xy[2]]] # # extract the names of the x and y components of the # list # xlab <- names(grid.list)[xy[1]] ylab <- names(grid.list)[xy[2]] xlab <- ifelse(is.null(xlab), "X", xlab) ylab <- ifelse(is.null(ylab), "Y", ylab) list(x = x, y = y, nx = nx, ny = ny, xlab = xlab, ylab = ylab, xy = xy) } fields/R/rad.simple.cov.R0000644000176200001440000000334114275252303014674 0ustar liggesusers# # fields is a package for analysis of spatial data written for # the R software environment. # Copyright (C) 2022 Colorado School of Mines # 1500 Illinois St., Golden, CO 80401 # Contact: Douglas Nychka, douglasnychka@gmail.edu, # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with the R software environment if not, write to the Free Software # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA # or see http://www.r-project.org/Licenses/GPL-2 ##END HEADER "Rad.simple.cov" <- function(x1, x2, p = 1, with.log = TRUE, with.constant = TRUE, C = NA, marginal = FALSE) { if (marginal) { return(rep(1, nrow(x1))) } if (!is.matrix(x1)) x1 <- as.matrix(x1) if (!is.matrix(x2)) x2 <- as.matrix(x2) d <- ncol(x1) n1 <- nrow(x1) n2 <- nrow(x2) m <- (d + p)/2 temp <- rdist(x1, x2) if (with.constant) { Amd <- radbas.constant(m, d) } else { Amd <- 1 } if ((d%%2 == 0) & (with.log)) { temp <- Amd * ifelse(temp < 1e-10, 0, temp^(p/2) * log(temp)) } else { temp <- Amd * temp^(p) } # # if (is.na(C[1])) { return(temp) } else { return(temp %*% C) } } fields/R/profileMLE.R0000644000176200001440000000500114275252303014041 0ustar liggesusers# # fields is a package for analysis of spatial data written for # the R software environment. # Copyright (C) 2022 Colorado School of Mines # 1500 Illinois St., Golden, CO 80401 # Contact: Douglas Nychka, douglasnychka@gmail.edu, # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with the R software environment if not, write to the Free Software # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA # or see http://www.r-project.org/Licenses/GPL-2 ##END HEADER profileMLE<- function (obj, parName, parGrid=NULL, gridN=15, cov.params.start=NULL, GCV=FALSE, REML=FALSE, verbose=FALSE ){ if( class(obj)[1]!= "spatialProcess"){ stop("only implemented tfor spatialProcess objects") } if( obj$CASE==0){ stop("object needs to be have MLE parameters") } if(is.null(parGrid) ){ parGrid<- data.frame(obj$summary[parName] * seq( .5,2,length.out=gridN) ) names(parGrid)<- parName } # remove profile parameter as having a starting value if( is.null(cov.params.start)){ cov.params.startTmp<- as.list(obj$MLEInfo$pars.MLE) #cov.params.startTmp<- obj$cov.params.start cov.params.startTmp[parName]<- NULL } else{ cov.params.startTmp<-cov.params.start } # just evaluate other parameters at MLEs and don't optimze. # E.g. just use MLE lambda hat for all choice in in parGrid. # if( fast){ # cov.params.startTmp<-NULL # # } # cov.argsTemp<- obj$cov.argsFull # cov.argsTemp[parName]<- NULL profileInfo<- mKrigMLEGrid(obj$x, obj$y, weights = obj$weights, Z = obj$Z, mKrig.args = obj$mKrig.args, cov.function = obj$cov.function, cov.args = obj$cov.args, par.grid = parGrid, na.rm = TRUE, verbose = verbose, REML = REML, GCV = GCV, cov.params.start = cov.params.startTmp) return( profileInfo) }fields/R/drape.color.R0000644000176200001440000000546714275252303014273 0ustar liggesusers# # fields is a package for analysis of spatial data written for # the R software environment. # Copyright (C) 2022 Colorado School of Mines # 1500 Illinois St., Golden, CO 80401 # Contact: Douglas Nychka, douglasnychka@gmail.edu, # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with the R software environment if not, write to the Free Software # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA # or see http://www.r-project.org/Licenses/GPL-2 ##END HEADER "drape.color" <- function(z, col = tim.colors(64), zlim = NULL, breaks, transparent.color = "white", midpoint = TRUE, eps = 1e-08) { # range if zlim not supplied if (is.null(zlim)) { zlim <- range(c(z), na.rm = TRUE) } # set any values outside of range to NA ( i.e. the transparent.color) z[(z < zlim[1]) | (z > zlim[2])] <- NA NC <- length(col) M <- nrow(z) N <- ncol(z) # if midpoint is TRUE find average z value for a facet and # overwrite z with matrix where row and column are one less # (reflecting that these are box centers not corners) if (midpoint) { z <- (z[1:(M - 1), 1:(N - 1)] + z[2:M, 1:(N - 1)] + z[1:(M - 1), 2:N] + z[2:M, 2:N])/4 M <- M - 1 N <- N - 1 } if (missing(breaks)) { breaks <- NA } if (is.na(breaks[1])) { # spacing for grid to assign colors # +-eps included so that if z== zlim[1 or 2] it gets a color # if statement is for when the limit is exactly zero # thanks to Rosa Trancoso for finding this bug zrange <- zlim[2] - zlim[1] lower <- ifelse(abs(zlim[1]) != 0, (zlim[1] - abs(zlim[1]) * eps), -eps * zrange) upper <- ifelse(abs(zlim[2]) != 0, (zlim[2] + abs(zlim[1]) * eps), eps * zrange) breaks <- seq(lower, upper, , NC + 1) } if (length(breaks) != NC + 1) { stop("must have one more break than colour") } # the magic of R ... icolor <- cut(c(z), breaks)@.Data # returned values is a vector of character hex strings encoding the colors. hold <- ifelse(is.na(icolor), transparent.color, col[icolor]) # points not assigned a bin from breaks get an NA # NA are converted to transparent color list(color.index = matrix(hold, nrow = M, ncol = N), breaks = breaks) } fields/R/predictSE.Krig.R0000644000176200001440000001043214275252303014624 0ustar liggesusers# # fields is a package for analysis of spatial data written for # the R software environment. # Copyright (C) 2022 Colorado School of Mines # 1500 Illinois St., Golden, CO 80401 # Contact: Douglas Nychka, douglasnychka@gmail.edu, # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with the R software environment if not, write to the Free Software # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA # or see http://www.r-project.org/Licenses/GPL-2 ##END HEADER "predictSE.Krig" <- function(object, x = NULL, cov = FALSE, verbose = FALSE, ...) { # # name of covariance function call.name <- object$cov.function.name # # default is to predict at data x's if (is.null(x)) { x <- object$x } x <- as.matrix(x) if (verbose) { print(x) } xraw <- x # transformations of x values used in Krig # NOTE knots are already scaled in Krig object xc <- object$transform$x.center xs <- object$transform$x.scale x <- scale(x, xc, xs) # # scaled unique observation locations. xM <- object$xM # find marginal variance before transforming x. temp.sd <- 1 if (verbose) { print(temp.sd) } # Default is to use parameters in best.model lambda <- object$best.model[1] sigma2 <- object$best.model[3] tau2 <- object$best.model[2] nx <- nrow(xM) wght.vec <- t(Krig.Amatrix(object, xraw, lambda, eval.correlation.model = FALSE, ...)) if (verbose) { cat("wght.vector", fill = TRUE) print(wght.vec) } #var( f0 - yhat)= var( f0) - cov( f0,yhat) - cov( yhat, f0) + cov( yhat) # = temp0 - temp1 - t( temp1) + temp2 # # if off diagonal weight matrix is passed then # find inverse covariance matrix # otherwise just create this quickly from diagonal weights # Wi <- Krig.make.Wi(object)$Wi # find covariance of data if (object$nondiag.W) { Cov.y <- sigma2 * do.call(call.name, c(object$args, list(x1 = xM, x2 = xM))) + tau2 * Wi } else { # this is one case where keeping diagonal # matrix as a vector will not work. Cov.y <- sigma2 * do.call(call.name, c(object$args, list(x1 = xM, x2 = xM))) + tau2 * diag(Wi) } if (!cov) { # find diagonal elements of covariance matrix # now find the three terms. # note the use of an element by element multiply to only get the # diagonal elements of the full # prediction covariance matrix. # temp1 <- sigma2 * colSums(wght.vec * do.call(call.name, c(object$args, list(x1 = xM, x2 = x)))) temp2 <- colSums(wght.vec * (Cov.y %*% wght.vec)) # # find marginal variances -- trival in the stationary case! # Note that for the case of the general covariances # as radial basis functions (RBFs) temp0 should be zero. # Positivity results from the generalized divided difference # properties of RBFs. temp0 <- sigma2 * do.call(call.name, c(object$args, list(x1 = x, marginal = TRUE))) # temp <- temp0 - 2 * temp1 + temp2 # return(sqrt(temp * temp.sd^2)) } else { # # find full covariance matrix # temp1 <- sigma2 * t(wght.vec) %*% do.call(call.name, c(object$args, list(x1 = xM, x2 = x))) # temp2 <- t(wght.vec) %*% Cov.y %*% wght.vec # temp0 <- sigma2 * do.call(call.name, c(object$args, list(x1 = x, x2 = x))) # temp <- temp0 - t(temp1) - temp1 + temp2 temp <- t(t(temp) * temp.sd) * temp.sd # return(temp) } } fields/R/spatialProcessSetDefaults.R0000644000176200001440000001674014444371431017221 0ustar liggesusers# # fields is a package for analysis of spatial data written for # the R software environment. # Copyright (C) 2022 Colorado School of Mines # 1500 Illinois St., Golden, CO 80401 # Contact: Douglas Nychka, douglasnychka@gmail.edu, # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with the R software environment if not, write to the Free Software # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA # or see http://www.r-project.org/Licenses/GPL-2 ##END HEADER spatialProcessSetDefaults<- function( x, cov.function, cov.args, cov.params.start, parGrid, mKrig.args, extraArgs = NULL, gridN = 5, collapseFixedEffect = TRUE, verbose=FALSE ) { ## convenient defaults for GP fitting. ## and also sort what starting parameter values are provided # this code runs on by perhaps it is useful to see all the defualts and # logic in one place. # Note the stranger device below where mKrig.args is created and amended # mKrig is the basic computational function for evaluating the likleihood and # setting up the Kriging predictions. # # aRange and lambda are handled specially because are almost always # estimated and this will simplify the call in this top level function # ########################################### ## Set some convenient default choices for a ## stationary covariance function ########################################### if( is.null( cov.function)){ cov.function <- 'stationary.cov' if( is.null(cov.args) ){ cov.args<- list() } if( is.null(cov.args$Covariance )){ cov.args$Covariance<- "Matern" if( is.null(cov.args$smoothness ) & is.null(cov.params.start$smoothness ) & is.null(parGrid$smoothness) ){ cov.args$smoothness<- 1.0 } } } ########################################### ## Set some convenient default choices for a ## thin plate spline ########################################### if( cov.function=='Tps.cov'){ # determine cardinal points if not included in # cov.args dimX<- ncol( x) if( is.null( mKrig.args$m)){ # m should satisfy 2*m-dimX >0 mMin<- max(c(2, ceiling(dimX/2 + 0.1))) mKrig.args<- list( mKrig.args, m=mMin ) } # if( is.null(cov.args)){ cov.args<- list() } # if( is.null(cov.args$cardinalX)){ nterms <- choose((mKrig.args$m + dimX - 1), dimX) cardinalX<- cover.design(x, nterms, num.nn = 50 )$design cov.args$cardinalX<- cardinalX } cov.args$aRange<- NA } ########################################### # overwrite the default choices if some are passed as ... # (some R arcania!) ########################################### if( !is.null( extraArgs)){ if(!is.null(cov.args)){ ind<- match( names(cov.args), names(extraArgs) ) cov.args <- c( cov.args[is.na(ind)], (extraArgs) ) } else{ cov.args <- list(extraArgs) } } ########################################### # check for duplicate arguments in starting values and fixed values ########################################### covArgsNames <- names(cov.args) covStartNames<-names(cov.params.start) covParGridNames<- names( parGrid) #print( covParGridNames) if( length( intersect( covArgsNames,covStartNames))>0){ cat("A problem with duplicate parameters:", fill=TRUE) cat("Names cov.args:", fill=TRUE) print(covArgsNames) cat("Names cov.params.start :", fill=TRUE) print(covStartNames) stop("parameters must either have starting values ( in cov.params.start list) or be specified as a covariance function argument (in cov.args list) ") } if( verbose){ cat("Updated and passed cov.args", fill=TRUE) print( cov.args) } ########################################### # Some logic to figure out how do MLE search over lambda and aRange ########################################### noLambda<- is.null( cov.args$lambda) & is.null(cov.params.start$lambda) noARange<- is.null( cov.args$aRange) & is.null(cov.params.start$aRange) makeDefaultGrid<- (noLambda | noARange) & is.null(parGrid) # easy default search grid if lambda and/or aRange ahave not been specified if( makeDefaultGrid ){ if( noLambda){ lGrid<- 10**seq( -4, .5, length.out= gridN) } if( noARange){ minX<- apply( x, 2, min) maxX<- apply( x, 2, max) xCorners<- rbind( minX, maxX) if( is.null( cov.args$Distance)){ dMax<-rdist( rbind(xCorners[1,]), rbind(xCorners[2,])) } else{ dMax<- do.call(cov.args$Distance, list( x1= rbind(xCorners[1,]), x2= rbind(xCorners[2,])) ) } dMax<- c( dMax) aGrid<- seq( .1*dMax, .7*dMax, length.out= gridN) } # now create parGrid if( noLambda & !noARange){ parGrid<- data.frame( lambda= lGrid) } if( noLambda & noARange){ parGrid<- expand.grid( lambda= lGrid, aRange = aGrid) } if( !noLambda & noARange){ parGrid<- data.frame( aRange= aGrid) } } ########################################### # Identify the Cases 0 - 4 to set defaults ########################################### # CASE 0 is to evaluate at fixed lambda and aRange # and there are no other parameters to optimize over. if( !is.null( cov.args$lambda) & !is.null( cov.args$aRange) & is.null( cov.params.start) ){ CASE<- 0 } #CASE 1 is to find MLEs using starting values provided a grid has not been # supplied for an initial grid search. if( !is.null(cov.params.start) & is.null(parGrid) ){ CASE<- 1 } if( !is.null(parGrid) ){ CASE<- 2 } ########################################### # Messing with mKrig ########################################### # Determine linear fixed model if not specified and add in how to find fixed part. # collapseFixedEffect is important enough where it is handled at this level. # if( is.null(mKrig.args)){ mKrig.args<- list( m=2, collapseFixedEffect=collapseFixedEffect) } else{ if( is.null(mKrig.args$collapseFixedEffect)){ mKrig.args$collapseFixedEffect <- collapseFixedEffect } } # don't find effective df for optimization -- this would add extra computation that is not # needed if( is.null(mKrig.args$find.trA) ){ if( (CASE >=3)){ mKrig.args<- c( mKrig.args, list(find.trA = FALSE)) } else{ mKrig.args<- c( mKrig.args, list(find.trA = TRUE)) } } out<- list( cov.function = cov.function, cov.args = cov.args, mKrig.args = mKrig.args, CASE = CASE, parGrid = parGrid ) return( out ) } fields/R/exp.image.cov.R0000644000176200001440000000433714275252303014521 0ustar liggesusers# # fields is a package for analysis of spatial data written for # the R software environment. # Copyright (C) 2022 Colorado School of Mines # 1500 Illinois St., Golden, CO 80401 # Contact: Douglas Nychka, douglasnychka@gmail.edu, # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with the R software environment if not, write to the Free Software # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA # or see http://www.r-project.org/Licenses/GPL-2 ##END HEADER "Exp.image.cov" <- function(ind1, ind2, Y, cov.obj = NULL, setup = FALSE, grid, ...) { if (is.null(cov.obj)) { dx <- grid$x[2] - grid$x[1] dy <- grid$y[2] - grid$y[1] m <- length(grid$x) n <- length(grid$y) M <- ceiling2(2 * m) N <- ceiling2(2 * n) xg <- make.surface.grid(list((1:M) * dx, (1:N) * dy)) center <- matrix(c((dx * M)/2, (dy * N)/2), nrow = 1, ncol = 2) out <- Exp.cov(xg, center, ...) out <- as.surface(xg, c(out))$z temp <- matrix(0, nrow = M, ncol = N) temp[M/2, N/2] <- 1 wght <- fft(out)/(fft(temp) * M * N) cov.obj <- list(m = m, n = n, grid = grid, N = N, M = M, wght = wght, call = match.call()) if (setup) { return(cov.obj) } } temp <- matrix(0, nrow = cov.obj$M, ncol = cov.obj$N) if (missing(ind1)) { temp[1:cov.obj$m, 1:cov.obj$n] <- Y Re(fft(fft(temp) * cov.obj$wght, inverse = TRUE)[1:cov.obj$m, 1:cov.obj$n]) } else { if (missing(ind2)) { temp[ind1] <- Y } else { temp[ind2] <- Y } Re(fft(fft(temp) * cov.obj$wght, inverse = TRUE)[ind1]) } } fields/R/which.max.matrix.R0000644000176200001440000000265514275252303015250 0ustar liggesusers# # fields is a package for analysis of spatial data written for # the R software environment. # Copyright (C) 2022 Colorado School of Mines # 1500 Illinois St., Golden, CO 80401 # Contact: Douglas Nychka, douglasnychka@gmail.edu, # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with the R software environment if not, write to the Free Software # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA # or see http://www.r-project.org/Licenses/GPL-2 ##END HEADER which.max.matrix <- function(z) { if (!is.matrix(z)) { stop("Not a matrix") } m <- nrow(z) n <- ncol(z) # take care of NAs ind <- which.max(z) iy <- trunc((ind - 1)/m) + 1 ix <- ind - (iy - 1) * m return(cbind(ix, iy)) } which.max.image <- function(obj) { ind.z <- which.max.matrix(obj$z) return(list(x = obj$x[ind.z[, 1]], y = obj$y[ind.z[, 2]], z = obj$z[ind.z], ind = ind.z)) } fields/R/in.poly.R0000644000176200001440000000570414275252303013445 0ustar liggesusers# # fields is a package for analysis of spatial data written for # the R software environment. # Copyright (C) 2022 Colorado School of Mines # 1500 Illinois St., Golden, CO 80401 # Contact: Douglas Nychka, douglasnychka@gmail.edu, # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with the R software environment if not, write to the Free Software # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA # or see http://www.r-project.org/Licenses/GPL-2 ##END HEADER "in.poly" <- function(xd, xp, convex.hull = FALSE, inflation = 1e-07) { if (convex.hull) { xp <- xp[chull(xp), ] } nd <- as.integer(nrow(xd)) np <- as.integer(nrow(xp)) # # inflate convex hull slightly to include any points actually on the hull # if (convex.hull) { xm <- matrix(c(mean(xp[, 1]), mean(xp[, 2])), nrow = np, ncol = 2, byrow = TRUE) xp <- (xp - xm) * (1 + inflation) + xm } # Note: inpoly FORTRAN has built in quick reject check to be inside # the bounding rectangle of the polygon. ind <- .Fortran("inpoly",PACKAGE="fields", nd = as.integer(nd), as.single(xd[, 1]), as.single(xd[, 2]), np = np, as.single(xp[, 1]), as.single(xp[, 2]), ind = as.integer(rep(-1, nd)))$ind as.logical(ind) } in.poly.grid <- function(grid.list, xp, convex.hull = FALSE, inflation = 1e-07) { # loop through rows of grid to fill out a logical matrix of # being in (TRUE) or out (FALSE) # # this is to avoid the full target polygon if the convex hull is # what is needed. if (convex.hull) { xp <- xp[chull(xp), ] } nx <- length(grid.list$x) ny <- length(grid.list$y) np <- as.integer(nrow(xp)) # # inflate convex hull slightly to include any points actually on the hull # if (convex.hull) { xm <- matrix(c(mean(xp[, 1]), mean(xp[, 2])), nrow = np, ncol = 2, byrow = TRUE) xp <- (xp - xm) * (1 + inflation) + xm } # Note: inpoly FORTRAN has built in quick reject check to be inside # the bounding rectangle of the polygon. ind <- .Fortran("igpoly",PACKAGE="fields", nx = as.integer(nx), xg = as.single(grid.list$x), ny = as.integer(ny), yg = as.single(grid.list$y), np = np, as.single(xp[, 1]), as.single(xp[, 2]), ind = as.integer(rep(-1, nx * ny)))$ind return(matrix(as.logical(ind), nrow = nx, ncol = ny)) } fields/R/spam_2lz.R0000644000176200001440000000555014275252303013603 0ustar liggesusers# # fields is a package for analysis of spatial data written for # the R software environment. # Copyright (C) 2022 Colorado School of Mines # 1500 Illinois St., Golden, CO 80401 # Contact: Douglas Nychka, douglasnychka@gmail.edu, # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with the R software environment if not, write to the Free Software # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA # or see http://www.r-project.org/Licenses/GPL-2 ##END HEADER spind2full <- function(obj) { # create empty matrix and stuff at non zero locations temp <- matrix(0, obj$da[1], obj$da[2]) temp[obj$ind] <- obj$ra return(temp) } spind2spam <- function(obj, add.zero.rows = TRUE) { # Check if there is one or more missing rows. If so either stop or fill in these rows # with a zero value rows.present <- unique(obj$ind[, 1]) if (length(rows.present) < obj$da[1]) { # The missing row indices ind.missing <- (1:obj$da[1])[-rows.present] N.missing <- length(ind.missing) if (!add.zero.rows) { cat(N.missing, " missing row(s)", fill = TRUE) stop("Can not coerce to spam format with add.zero.rows==FALSE") } else { # put a hard zero in the first column of each missing row obj$ind <- rbind(obj$ind, cbind(ind.missing, rep(1, N.missing))) obj$ra <- c(obj$ra, rep(0, N.missing)) } } # sort on rows and then columns to make sure they are in order ii <- order(obj$ind[, 1], obj$ind[, 2]) # shuffle indices and entries so they are in row order obj$ind <- obj$ind[ii, ] obj$ra <- obj$ra[ii] ia <- obj$ind[, 1] # define total number of nonzero elements M <- length(ia) # find places where rows change hold <- diff(c(0, ia, M + 1)) # Note: 1:M is the cumsum for elements. ia <- (1:(M + 1))[hold != 0] return(new("spam", entries = as.numeric(obj$ra), colindices = as.integer(obj$ind[, 2]), rowpointers = as.integer(ia), dimension = as.integer(obj$da))) } spam2spind <- function(obj) { # diff gives the number of nonzero elements in each row I <- rep((1:obj@dimension[1]), diff(obj@rowpointers)) list(ind = cbind(I, obj@colindices), da = obj@dimension, ra = obj@entries) } spam2full <- function(obj) { spind2full(spam2spind(obj)) } fields/R/mKrigFastPredict.R0000644000176200001440000001340014275252303015247 0ustar liggesusers# # fields is a package for analysis of spatial data written for # the R software environment. # Copyright (C) 2022 Colorado School of Mines # 1500 Illinois St., Golden, CO 80401 # Contact: Douglas Nychka, douglasnychka@gmail.edu, # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with the R software environment if not, write to the Free Software # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA # or see http://www.r-project.org/Licenses/GPL-2 ##END HEADER mKrigFastPredict <- function(object, gridList, ynew = NULL, derivative = 0, Z = NULL, drop.Z = FALSE, NNSize=5, setupObject= NULL, giveWarnings=TRUE) { #NOTE: covariance model is specified by the arguments in object$args #cov.args <- c( object$args, list(...) ) # For convenience the Z covariates are already assumed to be # in the unrolled form. But this may be awkward if this # function is called directly # See the code in predictSurface.mKrig for details. E.g. unrollZGrid if (derivative != 0) { stop("Derivatives not supported with fast prediction method") } if( ncol(object$c.coef)>1 ){ stop("Replicated fields currently not supported for fast predict.") } names( gridList)<- c("x","y") np<- NNSize xObs<- object$x nx<- length(gridList$x ) ny<- length(gridList$y ) if (!is.null(ynew)) { coef.hold <- mKrig.coef(object, ynew, collapseFixedEffect=TRUE) c.coef <- coef.hold$c.coef beta <- coef.hold$beta } else { c.coef <- object$c.coef beta <- object$beta } # fixed part of the model this a polynomial of degree m-1 # Tmatrix <- fields.mkpoly(xnew, m=object$m) # only do this if nt>0, i.e. there is a fixed part. # if (!drop.Z & (object$nZ > 0) & (derivative >0) ) { stop("derivative not supported with Z covariate included use drop.Z = FALSE to omit Z ") } if( object$nt>0){ xnew<- make.surface.grid( gridList) if (derivative == 0) { if (drop.Z | object$nZ == 0) { # just evaluate polynomial and not the Z covariate temp1 <- fields.mkpoly(xnew, m = object$m) %*% beta[object$ind.drift, ] } else { if( nrow( xnew) != nrow(as.matrix(Z)) ){ stop(paste("number of rows of covariate Z", nrow(as.matrix(Z)), " is not the same as the number of locations", nrow( xnew) ) ) } temp0 <- cbind(fields.mkpoly(xnew, m = object$m),as.matrix(Z)) temp1 <- temp0 %*% beta } } else { temp1 <- fields.derivative.poly(xnew, m = object$m, beta[object$ind.drift,]) } } # add nonparametric part. Covariance basis functions # times coefficients. # syntax is the name of the function and then a list with # all the arguments. This allows for different covariance functions # that have been passed as their name. # enlarge the grid if needed so that obs have np grid point points on all margins. if( (min(xObs[,1]) < gridList$x[1]) | (max(xObs[,1]) > gridList$x[nx] ) ) { stop( "x obs locations can not be outside the grid ") } if( (min(xObs[,2]) < gridList$y[1]) | (max(xObs[,2]) > gridList$y[ny]) ){ stop( "y obs locations can not be outside the grid ") } # adjust grid if needed to include a margin of NNSize+1 grid points beyond xObs # these are the slightly larger grids by adding margins. # also create sparse matrices. if( is.null(setupObject) ){ setupObject<- mKrigFastPredictSetup(object, gridList = gridList, NNSize = NNSize, giveWarnings = giveWarnings) } gridListNew<- setupObject$marginInfo$gridListNew nxNew<- length(gridListNew$x ) nyNew<- length(gridListNew$y ) # indX and indY are the subset of indices that match gridList # ( gridListNew contains the grids in gridList) indX<- setupObject$marginInfo$indX indY<- setupObject$marginInfo$indY if( ((indX[2]- indX[1] + 1)!= nx)| ((indY[2]- indY[1] + 1)!= ny)) { cat(" indX, nx") print( c(indX, nx) ) cat(" indY, ny") print( c(indY, ny) ) stop("mismatch between subset of larger grid and gridList passed") } c.coefWghts<- colSums( diag.spam( c(object$c.coef) ) %*% setupObject$offGridObject$B ) c.coefWghts<- matrix( c.coefWghts, nxNew, nyNew ) # fast multiplication of covariances on the grid with # the coefficients on the grid temp2<- stationary.image.cov( Y=c.coefWghts, cov.obj=setupObject$cov.obj) # cut down the size of temp2 trimming off margins using to approximate # exact covariance kernel. temp2<- temp2[ indX[1]:indX[2], indY[1]:indY[2] ] # add fixed part and spatial parts together and coerce to matrix if( object$nt>0){ return( (matrix(temp1,nx,ny) + temp2) ) } else{ # return only the spatial part because the fixed part is absent. return( temp2) } } fields/R/BD.R0000644000176200001440000001044014275252302012332 0ustar liggesusers# # fields is a package for analysis of spatial data written for # the R software environment. # Copyright (C) 2022 Colorado School of Mines # 1500 Illinois St., Golden, CO 80401 # Contact: Douglas Nychka, douglasnychka@gmail.edu, # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with the R software environment if not, write to the Free Software # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA # or see http://www.r-project.org/Licenses/GPL-2 ##END HEADER "BD" <- structure(list(KCl = c(30, 30, 20, 50, 25, 10, 40, 15, 50, 10, 20, 45, 50, 35, 40, 35, 30, 15, 40, 30, 10, 50, 20, 10, 25, 45, 30, 25, 45, 10, 45, 10, 30, 30, 20, 50, 10, 40, 15, 20, 45, 50, 35, 35, 30, 15, 30, 10, 50, 20, 25, 45, 30, 25, 45, 10, 45, 10, 30, 30, 25, 50, 10, 40, 40, 15, 35, 15, 10, 40, 10, 25, 35, 35, 30, 25, 45, 50, 40, 20, 50, 30, 15, 10, 50, 15, 25, 45, 40), MgCl2 = c(5, 5, 4, 7, 7, 4, 4, 6, 6, 7, 4, 7, 5, 6, 5, 7, 7, 6, 3, 4, 4, 4, 3, 3, 3, 4, 6, 3, 6, 5, 3, 6, 5, 5, 4, 7, 4, 4, 6, 4, 7, 5, 6, 7, 7, 6, 4, 4, 4, 3, 3, 4, 6, 3, 6, 5, 3, 6, 5, 5, 7, 6, 7, 5, 3, 6, 3, 5, 6, 6, 7, 7, 7, 5, 4, 6, 5, 6, 3, 7, 7, 4, 3, 4, 3, 3, 4, 4, 7), KPO4 = c(25, 25, 20, 20, 30, 25, 20, 45, 35, 25, 40, 30, 45, 20, 40, 45, 40, 25, 35, 45, 30, 40, 30, 20, 45, 30, 30, 35, 20, 40, 40, 35, 25, 25, 20, 20, 25, 20, 45, 40, 30, 45, 20, 45, 40, 25, 45, 30, 40, 30, 45, 30, 30, 35, 20, 40, 40, 35, 25, 25, 30, 35, 25, 40, 35, 40, 25, 20, 45, 25, 20, 35, 40, 30, 35, 40, 35, 30, 45, 40, 25, 20, 30, 45, 40, 30, 25, 25, 25), dNTP = c(625, 625, 1500, 250, 1500, 1250, 1250, 1250, 1500, 1250, 250, 1250, 1000, 1000, 1500, 750, 1000, 250, 250, 1500, 1000, 750, 750, 500, 500, 500, 250, 1000, 500, 500, 1250, 750, 625, 625, 1500, 250, 1250, 1250, 1250, 250, 1250, 1000, 1000, 750, 1000, 250, 1500, 1000, 750, 750, 500, 500, 250, 1000, 500, 500, 1250, 750, 625, 625, 1500, 1500, 1250, 1500, 250, 1500, 1500, 750, 250, 1500, 750, 1250, 500, 1250, 1250, 1000, 250, 500, 1000, 750, 1000, 250, 500, 1250, 750, 1000, 500, 750, 500), lnya = c(12.904207, 12.672946, 9.172639, 9.86786, 9.87817, 6.423247, 6.131226, 6.011267, 8.44247, 12.072541, 11.252859, 9.088173, 10.089967, 13.946539, 8.985946, 9.197255, 9.786954, 6.398595, 8.051978, 4.969813, 5.609472, 4.94876, 5.874931, 6.50279, 6.811244, 9.69892, 10.348173, 8.101678, 11.703546, 13.745088, 8.830543, 11.643954, 13.034624, 12.479909, 8.166216, 9.711116, 8.665613, 7.659171, 7.992945, 11.140411, 9.588777, 8.074026, 13.478638, 10.410305, 10.817776, 7.575585, 7.021084, 7.912057, 6.44254, 6.042633, 7.130899, 9.680344, 8.318742, 7.654443, 9.595603, 12.456831, 8.064636, 11.060369, 12.128111, 13.191889, 9.268609, 8.273847, 12.441145, 8.958025, 8.538955, 7.886081, 8.422883, 8.565983, 11.342137, 8.457443, 8.38936, 10.606585, 11.3679, 8.665613, 8.773385, 9.384294, 9.78132, 12.25009, 9.510445, 13.311329, 11.14331, 9.441452, 9.056023, 8.846497, 8.76873, 9.130214, 12.657148, 9.239899, 10.210972)), .Names = c("KCl", "MgCl2", "KPO4", "dNTP", "lnya"), class = "data.frame", row.names = c("1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15", "16", "17", "18", "19", "20", "21", "22", "23", "24", "25", "26", "27", "28", "29", "30", "31", "32", "33", "34", "35", "36", "38", "39", "40", "43", "44", "45", "46", "48", "49", "50", "52", "53", "54", "55", "57", "58", "59", "60", "61", "62", "63", "64", "65", "66", "67", "68", "69", "70", "71", "72", "73", "75", "76", "77", "78", "79", "80", "81", "82", "83", "84", "85", "86", "87", "88", "89", "90", "91", "92", "93", "94", "95", "96")) fields/R/fields.mkpoly.R0000644000176200001440000000504514275252303014633 0ustar liggesusers# # fields is a package for analysis of spatial data written for # the R software environment. # Copyright (C) 2022 Colorado School of Mines # 1500 Illinois St., Golden, CO 80401 # Contact: Douglas Nychka, douglasnychka@gmail.edu, # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with the R software environment if not, write to the Free Software # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA # or see http://www.r-project.org/Licenses/GPL-2 ##END HEADER "fields.mkpoly" <- function(x, m = 2, tag="term") { # m-1 is the degree of the polynomial # this is hold over notation from splines # where an mth order spline has a m-1 degree polynomial # null space. if (m < 0) stop("'m' has to be zero or larger.") if( m==0){ # warning("Note: There is no polynomial fixed component") return( NULL) } if (!is.matrix(x)) x <- as.matrix(x) d <- ncol(x) n <- nrow(x) nterms <- choose((m + d - 1), d) temp <- .Fortran("dmaket",PACKAGE="fields", m = as.integer(m), n = as.integer(n), dim = as.integer(d), des = as.double(x), lddes = as.integer(n), npoly = as.integer(nterms), tmatrix = as.double(rep(0, n * (nterms))), ldt = as.integer(n), wptr = as.integer(rep(0, d * m)), info = as.integer(0), ptab = as.integer(rep(0, nterms * d)), ldptab = as.integer(nterms)) temp2 <- matrix(temp$tmatrix, nrow = n) # add some column names xNames<- colnames(x) powerTable<- matrix(temp$ptab, nrow = nterms, ncol = d) if( m <2){ colnames( temp2)<- "Intercept" } if( !is.null( xNames) & m >= 2 ){ varNames<- c("Intercept",xNames) if( m > 2){ termNames<- NULL for ( k in (d+ 2): nterms){ termNames<- c( termNames, paste(powerTable[k,],collapse = "", sep="") ) } termNames<- paste0( tag, termNames) varNames<- c( varNames,termNames) } colnames( temp2)<- varNames } attr(temp2, "ptab") <- powerTable temp2 } fields/R/evlpoly2.R0000644000176200001440000000323714275252303013630 0ustar liggesusers# # fields is a package for analysis of spatial data written for # the R software environment. # Copyright (C) 2022 Colorado School of Mines # 1500 Illinois St., Golden, CO 80401 # Contact: Douglas Nychka, douglasnychka@gmail.edu, # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with the R software environment if not, write to the Free Software # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA # or see http://www.r-project.org/Licenses/GPL-2 ##END HEADER fields.evlpoly2 <- function(x, coef, ptab) { # evaluates polynomial at x values with coefficients coef[i] and powers i-1 # n <- nrow(x) nd <- ncol(x) J <- nrow(ptab) if (length(coef) != J) { stop("coefficients not same length as ptab rows") } results <- rep(0, n) temp <- .Fortran("evlpoly2",PACKAGE="fields", x = as.double(x), n = as.integer(n), nd = as.integer(nd), ptab = as.integer(ptab), j = as.integer(J), coef = as.double(coef), results = as.double(results))$results return(temp) } fields/R/summary.spatialProcess.R0000644000176200001440000001317314342022024016532 0ustar liggesusers# # fields is a package for analysis of spatial data written for # the R software environment. # Copyright (C) 2022 Colorado School of Mines # 1500 Illinois St., Golden, CO 80401 # Contact: Douglas Nychka, douglasnychka@gmail.edu, # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with the R software environment if not, write to the Free Software # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA # or see http://www.r-project.org/Licenses/GPL-2 ##END HEADER summary.spatialProcess <- function(object, ...) { # output list outObject<- list() digits<- 4 if (is.matrix(object$residuals)) { n <- nrow(object$residuals) nData <- ncol(object$residuals) } else { n <- length(object$residuals) nData <- 1 } c1 <- "Number of Observations:" c2 <- n if (nData > 1) { c1 <- c(c1, "Number of data sets fit:") c2 <- c(c2, nData) } c1 <- c(c1, "Degree of polynomial in fixed part: ") if(object$m !=0 ){ c2 <- c(c2, object$m - 1) } else{ c2 <- c(c2, NA) } c1 <- c(c1, "Total number of parameters in fixed part: ") c2 <- c(c2, object$nt) if (object$nZ > 0) { c1 <- c(c1, "Number of additional covariates (Z)") c2 <- c(c2, object$nZ) } if (!is.na(object$gamma[1]) ) { c1 <- c(c1, "Number of common covariates (ZCommon)") c2 <- c(c2, length(object$gamma)) } c1 <- c(c1, "sigma Process stan. dev: ") c2 <- c(c2, signif( sqrt(object$MLESummary["sigma2"]), digits)) c1 <- c(c1, "tau Nugget stan. dev:") c2 <- c(c2, signif(object$MLESummary["tau"], digits)) c1 <- c(c1, "lambda tau^2/sigma^2: ") c2 <- c(c2, signif(object$MLESummary["lambda"], digits)) c1 <- c(c1, "aRange parameter (in units of distance): ") c2 <- c(c2, signif(object$MLESummary["aRange"], digits)) if (!is.na(object$eff.df)) { c1 <- c(c1, "Approx. degrees of freedom for curve") c2 <- c(c2, signif(object$eff.df, digits)) if (length(object$trA.info) < object$np) { c1 <- c(c1, " Standard Error of df estimate: ") c2 <- c(c2, signif(sd(object$trA.info)/sqrt(length(object$trA.info)), digits)) } } c1 <- c(c1, "log Likelihood: ") c2 <- c(c2, object$summary["lnProfileLike.FULL"]) c1 <- c(c1, "log Likelihood REML: ") c2 <- c(c2, object$summary["lnProfileREML.FULL"]) summaryStuff <- cbind(c1, c2) dimnames(summaryStuff) <- list(rep("", dim(summaryStuff)[1]), rep("", dim(summaryStuff)[2])) ########### outObject$summaryTable <- summaryStuff outObject$collapseFixedEffect <- object$collapseFixedEffect outObject$CITable <- object$CITable ########### if (!is.null(object$MLEInfo)) { outObject$MLEpars <- names(object$MLEInfo$pars.MLE) outObject$MLESummary <- object$summary } else{ outObject$MLEpars <- NA outObject$MLESummary <- object$summary } ########### information for SE for fixed effects if (!is.null(object$beta)){ if (outObject$collapseFixedEffect | (nData == 1)) { outObject$fixedEffectsCov <- object$fixedEffectsCov SE <- sqrt(diag(outObject$fixedEffectsCov)) SEbeta <- SE[1:length(beta)] beta <- object$beta[, 1] pValue <- pnorm(abs(beta / SEbeta), lower.tail = FALSE) * 2 outObject$fixedEffectsTable <- cbind(signif(beta, digits), signif(SEbeta, digits), signif(pValue, digits)) # get row names if (is.null(object$fixedEffectNames)) { outObject$fixedEffectNames <- paste0("d", 1:(object$nt)) } else{ outObject$fixedEffectNames <- object$fixedEffectNames } dimnames(outObject$fixedEffectsTable) <- list(outObject$fixedEffectNames, c("estimate", "SE", "pValue")) } else{ # if more that one realization just summarize the coefficients outObject$fixedEffectsTable <- stats(t(object$beta)) } } if (is.null(object$beta)) { outObject$fixedEffectsTable <- NA } if (!is.null(object$gamma)) { gamma <- object$gamma if( object$collapseFixedEffect){ SE <- sqrt(diag(object$fixedEffectsCov)) SEgamma <- SE[(1:length(gamma)) + length(beta)] } else{ SEgamma <- sqrt(diag(object$fixedEffectsCovCommon)) } pValue <- pnorm(abs(gamma / SEgamma), lower.tail = FALSE) * 2 outObject$fixedEffectsTableCommon <- cbind(signif(gamma, digits), signif(SEgamma, digits), signif(pValue, digits)) tmp <- paste0("gamma", 1:length(gamma)) dimnames(outObject$fixedEffectsTableCommon) <- list(tmp, c("estimate", "SE", "pValue")) } if (is.null(object$gamma)) { outObject$fixedEffectsTableCommon <- NA } ##################### outObject$nData <- nData outObject$call <- object$call outObject$cov.function <- object$cov.function outObject$args <- object$args outObject$nonzero.entries <- object$nonzero.entries outObject$MLEInfo <- object$MLEInfo class(outObject) <- "spatialProcessSummary" return(outObject) } fields/R/world.R0000644000176200001440000000301114275252303013171 0ustar liggesusers# # fields is a package for analysis of spatial data written for # the R software environment. # Copyright (C) 2022 Colorado School of Mines # 1500 Illinois St., Golden, CO 80401 # Contact: Douglas Nychka, douglasnychka@gmail.edu, # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with the R software environment if not, write to the Free Software # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA # or see http://www.r-project.org/Licenses/GPL-2 ##END HEADER "world" <- function(...) { map("world", ...) invisible() } world.color <- function(...) { cat("world.color has been depreciated. Please use fill options in\nthe world/map function.", fill = TRUE) } world.land <- function(...) { cat("world.land has been depreciated. Please use fill options in\nthe world/map function.", fill = TRUE) } in.land.grid <- function(...) { cat("world.land has been depreciated. Please refer to fields 6.7.1 or earlier to acces this function.", fill = TRUE) } fields/R/qr.yq2.R0000644000176200001440000000205214275252303013202 0ustar liggesusers# # fields is a package for analysis of spatial data written for # the R software environment. # Copyright (C) 2022 Colorado School of Mines # 1500 Illinois St., Golden, CO 80401 # Contact: Douglas Nychka, douglasnychka@gmail.edu, # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with the R software environment if not, write to the Free Software # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA # or see http://www.r-project.org/Licenses/GPL-2 ##END HEADER "qr.yq2" <- function(qr, y) { t(qr.q2ty(qr, t(y))) } fields/R/fields.rdist.near.R0000644000176200001440000000374614275252303015377 0ustar liggesusers# # fields is a package for analysis of spatial data written for # the R software environment. # Copyright (C) 2022 Colorado School of Mines # 1500 Illinois St., Golden, CO 80401 # Contact: Douglas Nychka, douglasnychka@gmail.edu, # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with the R software environment if not, write to the Free Software # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA # or see http://www.r-project.org/Licenses/GPL-2 ##END HEADER fields.rdist.near <- function(x1, x2, delta, max.points = NULL, mean.neighbor = 50) { if (!is.matrix(x1)) x1 <- as.matrix(x1) if (missing(x2)) x2 <- x1 if (!is.matrix(x2)) x2 <- as.matrix(x2) d <- ncol(x1) n1 <- nrow(x1) n2 <- nrow(x2) if (is.null(max.points)) { Nmax <- n1 * mean.neighbor } else { Nmax <- max.points } out <- .Fortran("ddfind",PACKAGE="fields", nd = as.integer(d), x1 = as.double(x1), n1 = as.integer(n1), x2 = as.double(x2), n2 = as.integer(n2), D0 = as.double(delta), ind = as.integer(rep(0, Nmax * 2)), rd = as.double(rep(-1, Nmax)), Nmax = as.integer(Nmax), iflag = as.integer(1)) N <- out$Nmax if (out$iflag == -1) { cat("temp space set at", Nmax, fill = TRUE) stop("Ran out of space, increase max.points") } return(list(ind = matrix(out$ind, Nmax, 2)[1:N, ], ra = out$rd[1:N], da = c(n1, n2))) } fields/R/predictSurface.mKrig.R0000644000176200001440000001027314275252303016065 0ustar liggesusers# # fields is a package for analysis of spatial data written for # the R software environment. # Copyright (C) 2022 Colorado School of Mines # 1500 Illinois St., Golden, CO 80401 # Contact: Douglas Nychka, douglasnychka@gmail.edu, # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with the R software environment if not, write to the Free Software # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA # or see http://www.r-project.org/Licenses/GPL-2 ##END HEADER "predictSurface.mKrig" <- function(object, gridList=NULL, grid.list=NULL, ynew = NULL, extrap = FALSE, chull.mask = NA, nx = 80, ny = 80, xy = c(1,2), verbose = FALSE, ZGrid=NULL, drop.Z= FALSE, just.fixed=FALSE, fast=FALSE, NNSize=4, giveWarnings=FALSE, derivative=0, ...) { # if( is.null(ZGrid) & !drop.Z & (!is.null(object$Z)) ) { stop("Need to specify covariate (Z) values or set drop.Z==TRUE") } # grid.list is old syntax for fields gridList preferred if (!is.null(grid.list)){ gridList<- grid.list} # create a default grid if it is not passed if (is.null(gridList)) { # default is 80X80 grid on first variables in 1D # first two in 2D or greater for > 2D # rest are set to median value of the x's gridList <- fields.x.to.grid(object$x, nx = nx, ny = ny, xy = xy) } #print( gridList) # do some checks on Zgrid and also reshape as a matrix # rows index grid locations and columns are the covariates # (as Z in predict). # if ZGrid is NULL just returns NULL back ... Z<- unrollZGrid( gridList, ZGrid) xg <- make.surface.grid(gridList) # NOTE: the predict function called will need to do some internal checks # whether the evaluation of a large number of grid points (xg) makes sense. if( verbose){ print( dim( xg)) print( nrow( xg)) print( drop.Z) cat("dim of Z", fill=TRUE) print( dim( Z)) } if( nrow(xg) > 5e5){ warning("number of grid points is large for exact prediction consider approximate prediction using fast==TRUE") } out<- rep( NA, nrow(xg)) # if extrapolate is FALSE only predict for locations inside convex hull # (or the range in 1D) indexGood <- rep(TRUE, nrow(xg)) if (!extrap) { if (ncol(xg) > 1) { if (is.na(chull.mask)) { chull.mask <- unique.matrix(object$x[, xy]) } indexGood <- in.poly(xg[, xy], xp = chull.mask, convex.hull = TRUE) } else{ # 1D case indexGood <- xg[, 1] >= min(object$x[, 1]) & xg[, 1] <= max(object$x[, 1]) } } if(!fast){ # here is the heavy lifting out[indexGood] <- predict.mKrig(object, xnew=xg[indexGood,], ynew=ynew, Z=Z[indexGood,], drop.Z= drop.Z, collapseFixedEffect = object$collapseFixedEffect, just.fixed=just.fixed, ...) } else{ # fast approximate method # will always predict to full grid. out<- mKrigFastPredict( object, gridList= gridList, ynew = ynew, derivative = derivative, Z = Z, drop.Z = drop.Z, NNSize=NNSize, giveWarnings=giveWarnings, ... ) # wipe out predictions outside convex hull of observations. if(!extrap){ out[ !indexGood]<- NA } } # reshape as list with x, y and z components out <- as.surface( xg, out ) # # return(out) } fields/R/dyadic.check.R0000644000176200001440000000254514275252303014366 0ustar liggesusers# # fields is a package for analysis of spatial data written for # the R software environment. # Copyright (C) 2022 Colorado School of Mines # 1500 Illinois St., Golden, CO 80401 # Contact: Douglas Nychka, douglasnychka@gmail.edu, # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with the R software environment if not, write to the Free Software # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA # or see http://www.r-project.org/Licenses/GPL-2 ##END HEADER dyadic.check <- function(n, cut.p = 2) { # checks that n is of the form # n=p*2^m where p <= cut.p n2 <- as.integer(n) while (n2 > cut.p) { if (n2%%2 != 0) { cat(n, "must equal p*2^m where p is less than or equal to ", cut.p, fill = TRUE) return(FALSE) } n2 <- n2/2 } return(TRUE) } fields/R/offGridWeights1D.R0000644000176200001440000001560614275252303015157 0ustar liggesusers# # fields is a package for analysis of spatial data written for # the R software environment. # Copyright (C) 2022 Colorado School of Mines # 1500 Illinois St., Golden, CO 80401 # Contact: Douglas Nychka, douglasnychka@gmail.edu, # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with the R software environment if not, write to the Free Software # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA # or see http://www.r-project.org/Licenses/GPL-2 ##END HEADER\ offGridWeights1D<-function(s, gridList, np=2, mKrigObject=NULL, Covariance=NULL, covArgs=NULL, aRange=NULL, sigma2=NULL, giveWarnings=TRUE, debug=FALSE ){ # # function assumes the grid is # integer locations and 1:m by 1:n # grid and off grid locations need to be transformed to that scale # # also assumes the grid extends two cells beyond any off # e.g. s coordinates should be between # 2 and m-3 and 2 and n-3 # # If mKrigObject (result of fitting model) is given # extract all the covariance information from it. # For the Matern family besides aRange and sigma2 is the # smoothness if( !is.null( mKrigObject)){ sigma2<- mKrigObject$summary["sigma2"] aRange<- mKrigObject$summary["aRange"] Covariance<- mKrigObject$args$Covariance if( is.null(Covariance)){ Covariance<- "Exponential" } covArgs<-mKrigObject$args # some R arcania -- strip out all arguments used by say stationary.cov # but not used by the Covariance function # Do not want to call the covariance function with these extra args. if( !is.null( covArgs) ){ argNames<- names( as.list( get(Covariance))) argNames<- argNames[ -length(argNames)] ind<- match( names(covArgs), argNames) covArgs[is.na( ind)] <- NULL } } m<- length( gridList$x) dx<- gridList$x[2]- gridList$x[1] M<- nrow( s) # lower left corner of grid box containing the points s0<- cbind( trunc( (s[,1]- gridList$x[1] )/dx) + 1 ) # index of locations when 2D array is unrolled s0Index<- as.integer( s0[,1]) # check for more than one obs in a grid box tableLoc<- table( s0Index) allSingle<- all( tableLoc ==1 ) theShift<- (0:(2*np-1)) - (np-1) xshift<- theShift nnX<- cbind( xshift) nnXCoords<- cbind( xshift*dx) # # sX sX<- s0[,1] + matrix( rep( xshift,M), nrow=M, ncol=(2*np), byrow=TRUE) if( any( (sX < 1)| (sX>m)) ) { stop( "sX outside range for grid") } # indices of all nearest neighbors for unrolled vector. # this is an M by (2*np)^2 matrix where indices go from 1 to m*n # these work for the unrolled 2D array # sIndex<- sX # differences between nn and the off grid locations # for both coordinates # convert from integer grid to actual units. differenceX<- (sX-1)*dx + gridList$x[1] - s[,1] dAll<- abs(differenceX) # pairwise distance among nearest neighbors. dNN<- rdist(nnXCoords, nnXCoords) # cross covariances Sigma21Star<- sigma2* do.call(Covariance, c(list(d = dAll/aRange), covArgs)) # covariance among nearest neighbors Sigma11 <- sigma2* do.call(Covariance, c(list(d = dNN/aRange), covArgs)) Sigma11Inv <- solve( Sigma11) # each row of B are the weights used to predict off grid point B <- Sigma21Star%*%Sigma11Inv # create spind sparse matrix # note need to use unrolled indices to refer to grid points ind<- cbind( rep(1:M, each= (2*np) ), c( t( sIndex))) ra<- c( t( B)) da<- c( M, m ) spindBigB<- list(ind=ind, ra=ra, da=da ) # now convert to the more efficient spam format BigB<- spind2spam( spindBigB) # # prediction variances # use cholesky for more stable numerics cholSigma11Inv<- chol(Sigma11Inv) # create spind sparse matrix of sqrt variances # or covariances to simulate prediction error. w <- Sigma21Star%*%t(cholSigma11Inv) predictionVariance <- sigma2 - rowSums(w^2) # easiest case of just one obs in each grid box # sigma2 - diag(Sigma21Star%*%Sigma11Inv%*%t(Sigma21Star) ) spindObjSE<- list(ind=cbind( 1:M, 1:M), ra=sqrt(predictionVariance), da= c( M,M) ) BigSE<- spind2spam( spindObjSE) if(allSingle){ duplicateIndex<-NA } if( !allSingle){ indDuplicates<- (tableLoc > 1) if( giveWarnings){ cat("Found", sum(indDuplicates), "grid box(es) containing more than 1 obs location", fill=TRUE) } duplicateIndex<-names( tableLoc) [indDuplicates] duplicateIndex<- as.numeric(duplicateIndex) # duplicateIndex is the unrolled indices for all grid boxes with # 2 or more observations # following code is written assuming there are not many of these. nBox<- length( duplicateIndex) indDupSE<-NULL raDupSE<- NULL for( k in 1:nBox){ theBox<- duplicateIndex[k] # the obs that are in this box indBox<- which(s0Index == theBox) nDup<- length( indBox) dDup<- rdist( s[indBox,], s[indBox,]) sigmaMarginal<- sigma2* do.call(Covariance, c(list(d = dDup/aRange), covArgs)) A<- w[indBox,] localSE2<- sigmaMarginal - A%*%t(A) localSE<- t(chol( localSE2 )) # localSE %*% rnorm(nDup) will generate correct corrected # prediction errors for obs in this grid box ("theBox") indTmp<- cbind(rep( indBox, nDup), rep( indBox, each=nDup) ) raTmp<- c(localSE) indDupSE<- rbind( indDupSE,indTmp) raDupSE<- c( raDupSE, raTmp) } #print( dim(indDupSE )) #print( length(raDupSE)) BigSE[indDupSE]<- raDupSE } if( debug){ return( list( B= BigB, SE= BigSE, predictionVariance = predictionVariance, Sigma11Inv = Sigma11Inv, Sigma21Star= Sigma21Star, s0Index = s0Index, s0 = s0, gridX = t( (sX-1)*dx + gridList$x[1]), gridList = gridList, duplicateIndex= duplicateIndex ) ) } else{ return( list( B = BigB, SE = BigSE, predictionVariance = predictionVariance ) ) } } fields/R/envelopePlot.R0000644000176200001440000000266214275252303014531 0ustar liggesusers# # fields is a package for analysis of spatial data written for # the R software environment. # Copyright (C) 2022 Colorado School of Mines # 1500 Illinois St., Golden, CO 80401 # Contact: Douglas Nychka, douglasnychka@gmail.edu, # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with the R software environment if not, write to the Free Software # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA # or see http://www.r-project.org/Licenses/GPL-2 ##END HEADER envelopePlot <- function(x1, y1, x2 = x1, y2, col ="thistle1" , lineCol = "thistle3", ...) { # sort the curves -- just in case they are passed out of order ind<- order( x1) x1<- x1[ind] y1<- y1[ind] ind<- order( x2) x2<- x2[ind] y2<- y2[ind] polygon(c(x1, rev(x2)), c(y1, rev(y2)), col = col, border = NA, ...) lines(x1, y1, lwd = 3, col = lineCol) lines(x2, y2, lwd = 3, col = lineCol) } fields/R/cover.design.R0000644000176200001440000001544214275252303014443 0ustar liggesusers# # fields is a package for analysis of spatial data written for # the R software environment. # Copyright (C) 2022 Colorado School of Mines # 1500 Illinois St., Golden, CO 80401 # Contact: Douglas Nychka, douglasnychka@gmail.edu, # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with the R software environment if not, write to the Free Software # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA # or see http://www.r-project.org/Licenses/GPL-2 ##END HEADER "cover.design" <- function(R, nd, nruns = 1, nn = TRUE, num.nn = 100, fixed = NULL, scale.type = "unscaled", R.center, R.scale, P = -20, Q = 20, start = NULL, DIST = NULL, return.grid = TRUE, return.transform = TRUE, max.loop = 20, verbose = FALSE) { if (!is.null(start) && is.matrix(start)) { if (any(duplicated(start))) stop("Error: start must not have duplicate rows") test <- duplicated(start, R) if (sum(test) < nrow(start)) stop("Error: Starting design must be a subset of R") } R.orig <- R R <- as.matrix(R) # some checks on inputs if (nd >= nrow(R)) { stop(" number of design points >= the number of candidates") } if (any(duplicated.array(R))) stop("Error: R must not have duplicate rows") if (num.nn >= (nrow(R) - nd)) { nn <- FALSE warning("Number of nearst neighbors (nn) reduced to the actual number of candidates") } if (is.null(DIST)) DIST <- function(x, y) { rdist(x, y) } id <- 1:nrow(R) if (!is.null(start)) nd <- length(start) if (is.null(fixed)) n <- nd else { n <- nd + length(fixed) } R <- transformx(R, scale.type, R.center, R.scale) transform <- attributes(R) saved.crit <- rep(NA, nruns) saved.designs <- matrix(NA, nrow = nruns, ncol = n) saved.hist <- list(1:nruns) if (verbose) { cat(dim(R), fill = TRUE) } # # do nruns with initial desing drawn at random # # in this code Dset are the indices of the design # Cset are the complement set of indices indicating the candidate points # no used in the design # for (RUNS in 1:nruns) { if (is.null(start)) { if (!is.null(fixed)) { Dset <- sample((1:nrow(R))[-fixed], nd) Dset <- c(Dset, fixed) } else Dset <- sample(1:nrow(R), nd) } else { if (length(start) > nd) stop("Error: the start matrix must have nd rows") Dset <- start if (!is.null(fixed)) Dset <- c(Dset, fixed) } design.original <- R.orig[Dset, ] Dset.orginal <- Dset Cset <- id[-Dset] dist.mat <- DIST(R[Cset, ], R[Dset, ]) rs <- dist.mat^P %*% rep(1, n) crit.i <- crit.original <- sum(rs^(Q/P))^(1/Q) CRIT <- rep(NA, length(Cset)) CRIT.temp <- rep(NA, length(Cset)) hist <- matrix(c(0, 0, crit.i), ncol = 3, nrow = 1) loop.counter <- 1 repeat { for (i in 1:nd) { # loop over current design points looking for a productive swap Dset.i <- matrix(R[Dset[i], ], nrow = 1) if (verbose) { cat("design point", i, Dset.i, fill = TRUE) } partial.newrow <- sum(DIST(Dset.i, R[Dset[-i], ])^P) rs.without.i <- rs - c(DIST(Dset.i, R[-Dset, ])^P) if (nn) vec <- (1:length(Cset))[order(dist.mat[, i])[1:num.nn]] else vec <- 1:length(Cset) for (j in vec) { # loop over possible candidates to swap with design point Cset.j <- matrix(R[Cset[j], ], nrow = 1) newcol <- c(DIST(Cset.j, R[c(-Dset, -Cset[j]), ])^P) CRIT[j] <- (sum((rs.without.i[-j] + newcol)^(Q/P)) + (DIST(Cset.j, Dset.i)^P + partial.newrow)^(Q/P))^(1/Q) if (verbose) { cat(j, " ") } } best <- min(CRIT[!is.na(CRIT)]) best.spot <- Cset[CRIT == best][!is.na(Cset[CRIT == best])][1] if (verbose) { cat(i, "best found ", best, " at", best.spot, fill = TRUE) } crit.old <- crit.i # check if the best swap is really better thatn what you already have. if (best < crit.i) { if (verbose) { cat(i, "best swapped ", fill = TRUE) } crit.i <- best hist <- rbind(hist, c(Dset[i], best.spot, crit.i)) Dset[i] <- best.spot Cset <- id[-Dset] dist.mat <- DIST(R[Cset, ], R[Dset, ]) rs <- (dist.mat^P) %*% rep(1, n) } } if ((crit.i == crit.old) | (loop.counter >= max.loop)) break loop.counter <- loop.counter + 1 } saved.crit[RUNS] <- crit.i saved.designs[RUNS, ] <- Dset saved.hist[[RUNS]] <- hist } ret <- (1:nruns)[saved.crit == min(saved.crit)] if (length(ret) > 1) { print("Greater than 1 optimal design; keeping first one......") ret <- ret[1] } crit.i <- saved.crit[ret] hist <- saved.hist[[ret]] nhist <- nrow(hist) nloop <- nruns hist <- cbind(c(0:(nrow(hist) - 1)), hist) dimnames(hist) <- list(NULL, c("step", "swap.out", "swap.in", "new.crit")) out.des <- R[saved.designs[ret, ], ] out.des <- unscale(out.des, transform$x.center, transform$x.scale) out <- list(design = out.des, call = match.call(), best.id = c(saved.designs[ret, ]), fixed = fixed, opt.crit = crit.i, start.design = design.original, start.crit = crit.original, history = hist, other.designs = saved.designs, other.crit = saved.crit, DIST = DIST, nn = nn, num.nn = num.nn, P = P, Q = Q, nhist = nhist - 1, nloop = (nloop - 1)/n) if (return.grid) out$grid <- R.orig if (return.transform) out$transform <- transform class(out) <- "spatialDesign" out } fields/R/mKrigMisc.R0000644000176200001440000001016614275252303013740 0ustar liggesusers# # fields is a package for analysis of spatial data written for # the R software environment. # Copyright (C) 2022 Colorado School of Mines # 1500 Illinois St., Golden, CO 80401 # Contact: Douglas Nychka, douglasnychka@gmail.edu, # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with the R software environment if not, write to the Free Software # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA # or see http://www.r-project.org/Licenses/GPL-2 ##END HEADER mKrig.trace <- function(object, iseed, NtrA) { # do not reset the random seed if NA. if (exists(".Random.seed", .GlobalEnv)){ oldseed <- .GlobalEnv$.Random.seed } else{ oldseed <- NULL } if( !is.na(iseed)){ set.seed(iseed) } # if more MonteCarlo samples > number of data points just # find A exactly using np calls to predict. np<- object$np if (NtrA >= object$np) { Ey <- diag(1, np) NtrA <- np hold <- diag(predict.mKrig(object, ynew = Ey, collapseFixedEffect=FALSE)) trA.info<- NA trA.est <- sum(hold) } else { # if fewer tests then use random trace method # find fitted.values for iid N(0,1) 'data' to calculate the # the Monte Carlo estimate of tr A(lambda) # basically repeat the steps above but take some # short cuts because we only need fitted.values # create random normal 'data' Ey <- matrix(rnorm(np * NtrA), nrow = np, ncol = NtrA) trA.info <- colSums(Ey * (predict.mKrig(object, ynew = Ey, collapseFixedEffect=FALSE))) trA.est <- mean(trA.info) } if (NtrA < np) { MSE<-(sum(object$residuals^2)/np) GCV <- MSE/(1 - trA.est /np)^2 GCV.info <- MSE/( 1 - trA.info/np)^2 } else{ GCV<- NA GCV.info <- NA } if (!is.null(oldseed)){ .GlobalEnv$.Random.seed <- oldseed } else{ if( exists(".Random.seed", .GlobalEnv)){ rm(".Random.seed", envir = .GlobalEnv) } } return( list(trA.info = trA.info, eff.df = trA.est, GCV= GCV, GCV.info=GCV.info) ) } mKrig.coef <- function(object, y, collapseFixedEffect=TRUE) { # given new data y and the matrix decompositions in the # mKrig object find coficients beta and c. # beta are the coefficients for the fixed part # in this case hard coded for a low order polynomial # c are coefficients for the basis functions derived from the # covariance function. # # see mKrig itself for more comments on the linear algebra # # Note that all these expressions make sense if y is a matrix # of several data sets and one is solving for the coefficients # of all of these at once. In this case beta and c.coef are matrices # # generalized least squares for d if( any(is.na(y))){ stop("mKrig can not omit missing values in observation vecotor") } if( object$nt>0){ beta <- as.matrix(qr.coef(object$qr.VT, forwardsolve(object$Mc, transpose = TRUE, y, upper.tri = TRUE))) betaMeans<- rowMeans( beta) if( collapseFixedEffect){ beta<- matrix( betaMeans, ncol=ncol(beta), nrow= nrow( beta)) } # residuals from subtracting off fixed part # of model as m-1 order polynomial resid <- y - object$Tmatrix %*% beta } else{ beta<- NULL resid <- y } # and now find c. c.coef <- forwardsolve(object$Mc, transpose = TRUE, resid, upper.tri = TRUE) c.coef <- as.matrix(backsolve(object$Mc, c.coef)) out <- list( beta = (beta), c.coef = c.coef ) return(out) } fields/R/Tps.cov.R0000644000176200001440000000471414451362341013411 0ustar liggesusers Tps.cov<-function (x1, x2 = NULL, cardinalX, m=2, C = NA, aRange=NA, marginal = FALSE ) { if (is.null(x2) ) { x2 <- x1 } if( !is.na(aRange)){ stop("Tps should be passed an aRange parameter that is NA to indicate this not used in the covariance.") } PCard<- fields.mkpoly(cardinalX, m=m) PCoef<- solve(PCard, diag(1, ncol(PCard)) ) # Note by consturction PCard%*%PCoef = I P1<- fields.mkpoly(x1, m=m)%*%PCoef P2<- fields.mkpoly(x2, m=m)%*%PCoef if ( !marginal) { # a computation that is less efficient but easier to read: # bigE <- Rad.cov( x1, x2, m=m) # K1<- Rad.cov( x1,cardinalX, m=m)%*%t(P2) # K2<- P1%*% t(Rad.cov( x2,cardinalX, m=m)) # K3<- P1%*% Rad.cov(cardinalX,cardinalX, m=m)%*%t(P2) # covMatrix<- bigE - K1 - K2 + K3 + P1%*%t( P2) # and ... if C is passed covMatrix%*%C # if (is.na(C[1])) { bigE<- Rad.cov( x1,x2, m=m) K1<- Rad.cov( x1, cardinalX, m=m, C=t(P2)) K2 <- t( Rad.cov( x2, cardinalX, m=m, C=t(P1))) K3<- P1%*% Rad.cov(cardinalX,cardinalX, m=m, C=t(P2)) covMatrix<- bigE - K1 - K2 + K3 + P1%*%t( P2) return(covMatrix) } else{ bigEC<- Rad.cov( x1,x2, m=m,C=C) K1C <- Rad.cov( x1, cardinalX, m=m, C=t(P2)%*%C) K2C <- P1%*% Rad.cov(cardinalX, x2, m=m, C=C) K3C <- P1%*% Rad.cov(cardinalX, cardinalX, m=m, C=t(P2)%*%C ) K4C <- P1%*%(t( P2)%*%C) covMatrixC<- bigEC - K1C - K2C + K3C + K4C return( covMatrixC) # in more verbose form # bigE<- Rad.cov( x1,x2, m=m) # K1<- Rad.cov( x1, cardinalX, m=m, C=t(P2)) # K2 <- t( Rad.cov( x2, cardinalX, m=m, C=t(P1))) # K3<- P1%*% Rad.cov(cardinalX,cardinalX, m=m, C=t(P2)) # covMatrix<- bigE - K1 - K2 + K3 + P1%*%t( P2) # return(covMatrix%*%C) } } else { # NOTE: diag ( bigE) is zero # K2 <- t( Rad.cov( x1, cardinalX, m=m, C=t(P1))) # K1 <- t(K2) # K3 <- P1%*% Rad.cov(cardinalX,cardinalX, m=m, C=t(P1)) # marginalVariance0<- diag( - K2 - t( K1) + K3 + P1%*%t( P1) ) DK2<- rowSums(Rad.cov( x1, cardinalX, m=m)*P1) DK3<- colSums(Rad.cov(cardinalX,cardinalX, m=m, C=t(P1))*t(P1) ) DK4<- rowSums(P1^2) marginalVariance<- (-2*DK2 + DK3 +DK4 ) return( marginalVariance) } } fields/R/predict.interp.surface.R0000644000176200001440000000212414275252303016427 0ustar liggesusers# # fields is a package for analysis of spatial data written for # the R software environment. # Copyright (C) 2022 Colorado School of Mines # 1500 Illinois St., Golden, CO 80401 # Contact: Douglas Nychka, douglasnychka@gmail.edu, # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with the R software environment if not, write to the Free Software # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA # or see http://www.r-project.org/Licenses/GPL-2 ##END HEADER "predict.interp.surface" <- function(object, loc, ...) { interp.surface( object, loc,...) } fields/R/predictSurfaceSE.R0000644000176200001440000000547414275252303015254 0ustar liggesusers# # fields is a package for analysis of spatial data written for # the R software environment. # Copyright (C) 2022 Colorado School of Mines # 1500 Illinois St., Golden, CO 80401 # Contact: Douglas Nychka, douglasnychka@gmail.edu, # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with the R software environment if not, write to the Free Software # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA # or see http://www.r-project.org/Licenses/GPL-2 ##END HEADER "predictSurfaceSE"<- function( object,...){ UseMethod("predictSurfaceSE") } "predictSurfaceSE.default" <- function(object, grid.list = NULL, extrap = FALSE, chull.mask = NA, nx = 80, ny = 80, xy = c(1,2), verbose = FALSE, ZGrid=NULL, just.fixed=FALSE, ...) { # create a default grid if it is not passed if (is.null(grid.list)) { # NOTE: # without grid.list # default is 80X80 grid on first two variables # rest are set to median value of the x's grid.list <- fields.x.to.grid(object$x, nx = nx, ny = ny, xy = xy) } # do some checks on Zgrid if passed and also reshape as a matrix # rows index grid locations and columns are the covariates # (as Z in predict). # if ZGrid is NULL just returns that back Z<- unrollZGrid( grid.list, ZGrid) # Convert grid.list to the full set of locations xg <- make.surface.grid(grid.list) # NOTE: the predict function called will need to do some internal the checks # whether the evaluation of a large number of grid points (xg) makes sense. if( verbose){ print( dim( xg)) print( dim( Z)) } # # Next call is fragile as it assumes the predictSE method includes # a Z argument (even if it will often just be NULL ) out0<- predictSE(object, xg, Z=Z, ...) # coerce back into image format out <- as.surface( xg, out0) # # if extrapolate is FALSE set all values outside convex hull to NA if (!extrap) { if( is.null( object$x)){ stop("need and x matrix in object") } if (is.na(chull.mask)) { chull.mask <- unique.matrix(object$x[, xy]) } out$z[!in.poly(xg[, xy], xp = chull.mask, convex.hull = TRUE)] <- NA } # return(out) } fields/R/predictDerivative.Krig.R0000644000176200001440000000565014275252303016425 0ustar liggesusers# # fields is a package for analysis of spatial data written for # the R software environment. # Copyright (C) 2022 Colorado School of Mines # 1500 Illinois St., Golden, CO 80401 # Contact: Douglas Nychka, douglasnychka@gmail.edu, # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with the R software environment if not, write to the Free Software # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA # or see http://www.r-project.org/Licenses/GPL-2 ##END HEADER "predictDerivative.Krig" <- function(object, x = NULL, verbose = FALSE, ...) { # this is a lean evaluation of the derivatives of the # random component of the model. # several checks to make sure this being applied to # simple Krig models where it makes sense if (object$correlation.model) { stop("Can not handle correlation model with derivative evaluation") } if (object$null.function.name != "Krig.null.function") { stop("null space may not be a low order polynomial") } # default is to predict at data x's if (is.null(x)) { x <- object$x } else { x <- as.matrix(x) } # transformations of x values used in Krig xc <- object$transform$x.center xs <- object$transform$x.scale x <- scale(x, xc, xs) # NOTE knots are already scaled in Krig object and are used # in transformed scale. # i.e. knots <- scale( object$knots, xc, xs) temp.d <- object$d temp.c <- object$c if (verbose) { cat(" betas", fill = TRUE) print(temp.d) cat("c coefs", fill = TRUE) print(temp.c) } # # this is the polynomial fixed part of predictor # temp1 <- fields.derivative.poly(x, m = object$m, object$d) # add in spatial piece # The covariance function is # evaluated by using it name, do.call function and any # additional arguments. Note use of derivative and 'C' arguments # to do multiplication of partials of covariance times the C # vector. If C is a matrix of coefficients a error is produced. temp2 <- do.call(object$cov.function.name, c(object$args, list(x1 = x, x2 = object$knots, derivative = 1, C = temp.c))) # returned value is the matrix of partials of polynomial plus partials of spatial # part aso add in chain rule scale factor because # functional form for the surface uses the coordinates xscaled = (x- xc)/xs return(t(t(temp1 + temp2)/xs)) } fields/R/circulantEmbedding.R0000644000176200001440000000266214275252303015640 0ustar liggesusers# # fields is a package for analysis of spatial data written for # the R software environment. # Copyright (C) 2022 Colorado School of Mines # 1500 Illinois St., Golden, CO 80401 # Contact: Douglas Nychka, douglasnychka@gmail.edu, # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with the R software environment if not, write to the Free Software # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA # or see http://www.r-project.org/Licenses/GPL-2 ##END HEADER "circulantEmbedding" <- function(obj) { m<- obj$m M<- obj$M prodM<- prod( M) Z <- fft( array(rnorm(prodM), M) ) #bigIndex<- as.matrix(expand.grid( 1:mDim[1], 1:mDim[2])) if( any( Re(obj$wght) < 0)){ stop("Weight function has negtive values") } out<- Re( fft(sqrt(obj$wght) * Z, inverse = TRUE) )/sqrt(prodM) out<- array( out[makeMultiIndex(m)], m) return( out) } fields/R/tim.colors.R0000644000176200001440000000367414275252303014152 0ustar liggesusers# # fields is a package for analysis of spatial data written for # the R software environment. # Copyright (C) 2022 Colorado School of Mines # 1500 Illinois St., Golden, CO 80401 # Contact: Douglas Nychka, douglasnychka@gmail.edu, # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with the R software environment if not, write to the Free Software # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA # or see http://www.r-project.org/Licenses/GPL-2 ##END HEADER "tim.colors" <- function(n = 64, alpha = 1) { # tims original 64 color definition definition: orig <- c("#00008F", "#00009F", "#0000AF", "#0000BF", "#0000CF", "#0000DF", "#0000EF", "#0000FF", "#0010FF", "#0020FF", "#0030FF", "#0040FF", "#0050FF", "#0060FF", "#0070FF", "#0080FF", "#008FFF", "#009FFF", "#00AFFF", "#00BFFF", "#00CFFF", "#00DFFF", "#00EFFF", "#00FFFF", "#10FFEF", "#20FFDF", "#30FFCF", "#40FFBF", "#50FFAF", "#60FF9F", "#70FF8F", "#80FF80", "#8FFF70", "#9FFF60", "#AFFF50", "#BFFF40", "#CFFF30", "#DFFF20", "#EFFF10", "#FFFF00", "#FFEF00", "#FFDF00", "#FFCF00", "#FFBF00", "#FFAF00", "#FF9F00", "#FF8F00", "#FF8000", "#FF7000", "#FF6000", "#FF5000", "#FF4000", "#FF3000", "#FF2000", "#FF1000", "#FF0000", "#EF0000", "#DF0000", "#CF0000", "#BF0000", "#AF0000", "#9F0000", "#8F0000", "#800000") designer.colors( n, col=orig, alpha=alpha) } fields/R/print.spatial.design.R0000644000176200001440000000206314275252303016110 0ustar liggesusers# # fields is a package for analysis of spatial data written for # the R software environment. # Copyright (C) 2022 Colorado School of Mines # 1500 Illinois St., Golden, CO 80401 # Contact: Douglas Nychka, douglasnychka@gmail.edu, # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with the R software environment if not, write to the Free Software # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA # or see http://www.r-project.org/Licenses/GPL-2 ##END HEADER "print.spatialDesign" <- function(x, ...) { print(x$design) } fields/R/image.plot.R0000644000176200001440000001576314275252303014122 0ustar liggesusers# # fields is a package for analysis of spatial data written for # the R software environment. # Copyright (C) 2022 Colorado School of Mines # 1500 Illinois St., Golden, CO 80401 # Contact: Douglas Nychka, douglasnychka@gmail.edu, # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with the R software environment if not, write to the Free Software # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA # or see http://www.r-project.org/Licenses/GPL-2 ##END HEADER "image.plot" <- function(..., add = FALSE, breaks= NULL, nlevel = 64, col = NULL, horizontal = FALSE, legend.shrink = 0.9, legend.width = 1.2, legend.mar = ifelse(horizontal, 3.1, 5.1), legend.lab = NULL, legend.line= 2, graphics.reset = FALSE, bigplot = NULL, smallplot = NULL, legend.only = FALSE, lab.breaks = NULL, axis.args = NULL, legend.args = NULL, legend.cex=1.0, midpoint = FALSE, border = NA, lwd = 1, verbose=FALSE) { # Thanks to S. Koehler and S. Woodhead # for comments on making this a better function # # save current graphics settings old.par <- par(no.readonly = TRUE) # set defaults for color scale # note this works differently than the image function. if( is.null(col)) { col<- tim.colors(nlevel)} else{ nlevel<- length( col) } # figure out zlim from passed arguments # also set the breaks for colors if they have not been passed, info <- imagePlotInfo(..., breaks=breaks, nlevel=nlevel) # breaks have been computed if not passed in the call breaks<- info$breaks if( verbose){ print(info) } if (add) { big.plot <- old.par$plt } if (legend.only) { graphics.reset <- TRUE } if (is.null(legend.mar)) { legend.mar <- ifelse(horizontal, 3.1, 5.1) } # figure out how to divide up the plotting real estate temp <- imageplot.setup(add = add, legend.shrink = legend.shrink, legend.width = legend.width, legend.mar = legend.mar, horizontal = horizontal, bigplot = bigplot, smallplot = smallplot) # bigplot has plotting region coordinates for image # smallplot has plotting coordinates for legend strip smallplot <- temp$smallplot bigplot <- temp$bigplot # draw the image in bigplot, just call the R base function # or poly.image for polygonal cells # note the logical switch # for poly.grid is parsed out of call from image.plot.info if (!legend.only) { if (!add) { par(plt = bigplot) } if (!info$poly.grid) { image(..., breaks=breaks, add = add, col = col) } else { poly.image(..., add = add,breaks=breaks, col = col, midpoint = midpoint, border = border, lwd.poly = lwd) } big.par <- par(no.readonly = TRUE) } ## ## check dimensions of smallplot if ((smallplot[2] < smallplot[1]) | (smallplot[4] < smallplot[3])) { par(old.par) stop("plot region too small to add legend\n") } # Following code draws the legend using the image function # and a one column image. # What might be confusing is the values of the "image" are the same # as the locations on the legend axis. # Moreover the image values are in the middle of each breakpoint category # thanks to Tobias Nanu Frechen and Matthew Flickinger # for sorting out some problems with the breaks position in the legend. ix <- 1:2 iy<- breaks nBreaks<- length( breaks) midpoints<- (breaks[1:(nBreaks-1)] + breaks[2:nBreaks] )/2 iz <- matrix(midpoints, nrow = 1, ncol = length(midpoints)) if( verbose){print(breaks) print( midpoints) print( ix) print( iy) print( iz) print( col)} # # next par call sets up a new plotting region just for the legend strip # at the smallplot coordinates par(new = TRUE, pty = "m", plt = smallplot, err = -1) # draw color scales the two cases are horizontal/vertical # add a label if this is passed. if (!horizontal) { image(ix, iy, iz, xaxt = "n", yaxt = "n", xlab = "", ylab = "", col = col, breaks=breaks) } else { image(iy, ix, t(iz), xaxt = "n", yaxt = "n", xlab = "", ylab = "", col = col, breaks=breaks) } # create the argument list to draw the axis # this avoids 4 separate calls to axis and allows passing extra # arguments. if (!is.null(lab.breaks)) { # axis with labels at break points axis.args <- c(list(side = ifelse(horizontal, 1, 4), mgp = c(3, 1, 0), las = ifelse(horizontal, 0, 2), at = breaks, labels = lab.breaks), axis.args) } else { # If lab.breaks is not specified ( with or without breaks), pretty # tick mark locations and labels are computed internally, # or as specified in axis.args at the function call axis.args <- c(list(side = ifelse(horizontal, 1, 4), mgp = c(3, 1, 0), las = ifelse(horizontal, 0, 2)), axis.args) } # # now add the axis to the legend strip. # notice how all the information is in the list axis.args do.call("axis", axis.args) # add a box around legend strip # box() # # add a label to the axis if information has been supplied # using the mtext function. The arguments to mtext are # passed as a list like the drill for axis (see above) # if (!is.null(legend.lab)) { legend.args <- list(text = legend.lab, side = ifelse(horizontal, 1, 4), line = legend.line, cex=legend.cex) # just guessing at a good default for line argument! } # add the label using mtext function if (!is.null(legend.args)) { do.call(mtext, legend.args) } # # clean up graphics device settings # reset to larger plot region with right user coordinates. mfg.save <- par()$mfg if (graphics.reset | add) { par(old.par) par(mfg = mfg.save, new = FALSE) invisible() } else { par(big.par) par(plt = big.par$plt, xpd = FALSE) par(mfg = mfg.save, new = FALSE) # Suggestion from Karline Soetaert # this is to reset margins to be based on the mar arguments # par(mar = par("mar")) or # par(mar = big.par$mar) # unfortunately this causes problems by allowing plotting outside of the # original plot region. invisible() } } fields/R/rdist.vec.R0000644000176200001440000000231614275252303013752 0ustar liggesusers# # fields is a package for analysis of spatial data written for # the R software environment. # Copyright (C) 2022 Colorado School of Mines # 1500 Illinois St., Golden, CO 80401 # Contact: Douglas Nychka, douglasnychka@gmail.edu, # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with the R software environment if not, write to the Free Software # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA # or see http://www.r-project.org/Licenses/GPL-2 ##END HEADER rdist.vec = function(x1, x2) { #make sure inputs are matrices if (!is.matrix(x1)) { x1 <- as.matrix(x1) } if(!is.matrix(x2)) { x2 <- as.matrix(x2) } #return distances sqrt(rowSums((x1 - x2)^2)) } fields/R/larry.colors.R0000644000176200001440000000255614275252303014510 0ustar liggesusers# # fields is a package for analysis of spatial data written for # the R software environment. # Copyright (C) 2022 Colorado School of Mines # 1500 Illinois St., Golden, CO 80401 # Contact: Douglas Nychka, douglasnychka@gmail.edu, # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with the R software environment if not, write to the Free Software # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA # or see http://www.r-project.org/Licenses/GPL-2 ##END HEADER larry.colors<- function(){ ctemp<- matrix( c( 182, 106, 40, 205, 133, 63, 225, 165, 100, 245, 205, 132, 245, 224, 158, 255, 245, 186, 255, 255, 255, 205, 255, 205, 153, 240, 178, 83, 189, 159, 110, 170, 200, 5, 112, 176, 2, 56, 88 ), ncol=3, byrow=TRUE) ctemp<- ctemp/255 rgb(ctemp[,1], ctemp[,2], ctemp[,3]) } fields/R/fields.duplicated.matrix.R0000644000176200001440000000253214275252303016737 0ustar liggesusers# # fields is a package for analysis of spatial data written for # the R software environment. # Copyright (C) 2022 Colorado School of Mines # 1500 Illinois St., Golden, CO 80401 # Contact: Douglas Nychka, douglasnychka@gmail.edu, # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with the R software environment if not, write to the Free Software # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA # or see http://www.r-project.org/Licenses/GPL-2 ##END HEADER "fields.duplicated.matrix" <- function(mat, digits = 8) { nc <- ncol(mat) temp <- matrix(match(c(signif(mat, digits)), unique(c(signif(mat, digits)))), ncol = nc) temp2 <- format(temp[, 1]) if (nc > 1) { for (k in 2:nc) { temp2 <- paste(temp2, temp[, k], sep = "X") } } match(temp2, unique(temp2)) } fields/R/evlpoly.R0000644000176200001440000000272314275252303013545 0ustar liggesusers# # fields is a package for analysis of spatial data written for # the R software environment. # Copyright (C) 2022 Colorado School of Mines # 1500 Illinois St., Golden, CO 80401 # Contact: Douglas Nychka, douglasnychka@gmail.edu, # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with the R software environment if not, write to the Free Software # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA # or see http://www.r-project.org/Licenses/GPL-2 ##END HEADER fields.evlpoly <- function(x, coef) { # evaluates polynomial at x values with coefficients coef[i] and powers i-1 # n <- length(x) J <- length(coef) results <- rep(0, n) temp <- .Fortran("evlpoly",PACKAGE="fields", x = as.double(x), n = as.integer(n), coef = as.double(coef), j = as.integer(J), results = as.double(results))$results return(temp) } fields/R/mKrigFastPredictSetup.R0000644000176200001440000000457214275252303016302 0ustar liggesusers# # fields is a package for analysis of spatial data written for # the R software environment. # Copyright (C) 2022 Colorado School of Mines # 1500 Illinois St., Golden, CO 80401 # Contact: Douglas Nychka, douglasnychka@gmail.edu, # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with the R software environment if not, write to the Free Software # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA # or see http://www.r-project.org/Licenses/GPL-2 ##END HEADER mKrigFastPredictSetup <- function(mKrigObject, gridList, NNSize=4, giveWarnings=TRUE ) { # the main reason to pass new args to the covariance is to increase # the temp space size for sparse multiplications # other optional arguments that typically describe the covariance function # from mKrig are passed along in the list object$args np<- NNSize xObs<- mKrigObject$x # adjust grid if needed to include a margin of np+1 grid points beyond xObs marginInfo<- addMarginsGridList(xObs, gridList, np) # these are the slightly larger grids by adding margins. gridListNew<- marginInfo$gridListNew offGridObject<- offGridWeights( xObs, gridListNew, mKrigObject = mKrigObject, np=np, giveWarnings = giveWarnings ) cov.obj<- stationary.image.cov( setup=TRUE, grid=gridListNew, cov.function=mKrigObject$cov.function.name, cov.args= mKrigObject$args) return( list(offGridObject = offGridObject, cov.obj = cov.obj, marginInfo = marginInfo ) ) } fields/R/gauss.cov.R0000644000176200001440000000205214275252303013756 0ustar liggesusers# # fields is a package for analysis of spatial data written for # the R software environment. # Copyright (C) 2022 Colorado School of Mines # 1500 Illinois St., Golden, CO 80401 # Contact: Douglas Nychka, douglasnychka@gmail.edu, # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with the R software environment if not, write to the Free Software # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA # or see http://www.r-project.org/Licenses/GPL-2 ##END HEADER "gauss.cov" <- function(...) { Exp.cov(..., p = 2) } fields/R/predictSE.mKrig.R0000644000176200001440000000613114275252303015002 0ustar liggesusers# # fields is a package for analysis of spatial data written for # the R software environment. # Copyright (C) 2022 Colorado School of Mines # 1500 Illinois St., Golden, CO 80401 # Contact: Douglas Nychka, douglasnychka@gmail.edu, # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with the R software environment if not, write to the Free Software # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA # or see http://www.r-project.org/Licenses/GPL-2 ##END HEADER predictSE.mKrig<- function(object, xnew = NULL, Z = NULL, verbose = FALSE, drop.Z = FALSE, ...) { # # name of covariance function call.name <- object$cov.function.name # if(drop.Z){ # stop(" Sorry drop.Z not supported") # } # # default is to predict at data x's if (is.null(xnew)) { xnew <- object$x } if ( is.null(Z)& !is.null( object$Z) ) { Z <- object$Z } xnew <- as.matrix(xnew) if (!is.null(Z)) { Z <- as.matrix(Z) } if (verbose) { cat("Passed locations", fill=TRUE) print(xnew) cat("Assumed covariates", fill=TRUE) print(Z) } objectSummary<- object$summary lambda <- objectSummary["lambda"] sigma2 <- objectSummary["sigma2"] tau2 <- objectSummary["tau"]^2 if (verbose) { print(c(lambda, sigma2, tau2)) } k0 <- do.call(call.name, c(object$args, list(x1 = object$x, x2 = xnew))) # fixed effects matrix includes both spatial drift and covariates. if (!drop.Z) { t0 <- t(cbind(fields.mkpoly(xnew, m = object$m), Z)) } # # old form based on the predict function # temp1 <- sigma2*(t0%*% object$Omega %*%t(t0)) - # sigma2*predict( object, y= k0, x=x) - # sigma2*predict( object, y= k0, x=x, just.fixed=TRUE) # alternative formula using the beta and c.coef coefficients directly. # collapseFixedEffect=FALSE because # we want the "fixed effect" computation # to be done separately for each column of k0 hold <- mKrig.coef(object, y = k0, collapseFixedEffect=FALSE) # find marginal variances -- trival in the stationary case! temp0<- sigma2 * do.call(call.name, c(object$args, list(x1 = xnew, marginal = TRUE))) temp <- temp0 - sigma2 *colSums((k0) * hold$c.coef) # Add marginal variance to part from estimate if( !drop.Z){ temp1 <- sigma2 * (colSums(t0 * (object$Omega %*% t0)) - 2 * colSums(t0 * hold$beta)) temp <- temp + temp1 } # return square root as the standard error in units of observations. return(sqrt(temp)) } fields/R/as.surface.R0000644000176200001440000000466214275252302014110 0ustar liggesusers# # fields is a package for analysis of spatial data written for # the R software environment. # Copyright (C) 2022 Colorado School of Mines # 1500 Illinois St., Golden, CO 80401 # Contact: Douglas Nychka, douglasnychka@gmail.edu, # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with the R software environment if not, write to the Free Software # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA # or see http://www.r-project.org/Licenses/GPL-2 ##END HEADER as.surface <- function(obj, z, location = NULL, order.variables = "xy") { # if (is.list(obj)) { grid.list <- obj } if (is.matrix(obj)) { grid.list <- attr(obj, "grid.list") } # # OK now have a grid, parse this to figure # nx and ny the x and y sequences and extract names # if a 1D grid then hold$ny is NA hold <- parse.grid.list(grid.list, order.variables = "xy") grid1D <- is.na(hold$ny) # now fill in the "z" values -- the actual grid values if (!grid1D) { if (!is.null(location)) { # location is a logical or two column matrix of indices # with the position of the z values temp <- rep(NA, hold$ny * hold$nx) temp[location] <- z temp <- matrix(temp, ncol = hold$ny, nrow = hold$nx) } else{ if (length(c(z)) != hold$ny * hold$nx) { print(length(c(z))) print(c(hold$ny * hold$nx)) stop("z does not match number of grid points") } temp <- matrix(z, ncol = hold$ny, nrow = hold$nx) } } else{ temp <- matrix(z, ncol = 1, nrow = hold$nx) } # # note that coercing z to a matrix is just reformatting # using the standard ordering. # # output list is all the grid stuff and the matrix z. return( c(hold, list(z = temp), list(grid1D = grid1D)) ) } fields/R/cat.matrix.R0000644000176200001440000000251414275252302014122 0ustar liggesusers# # fields is a package for analysis of spatial data written for # the R software environment. # Copyright (C) 2022 Colorado School of Mines # 1500 Illinois St., Golden, CO 80401 # Contact: Douglas Nychka, douglasnychka@gmail.edu, # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with the R software environment if not, write to the Free Software # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA # or see http://www.r-project.org/Licenses/GPL-2 ##END HEADER "cat.matrix" <- function(mat, digits = 8) { nc <- ncol(mat) temp <- matrix(match(c(signif(mat, digits)), unique(c(signif(mat, digits)))), ncol = nc) temp2 <- format(temp[, 1]) if (nc > 1) { for (k in 2:nc) { temp2 <- paste(temp2, temp[, k], sep = "X") } } match(temp2, unique(temp2)) } fields/R/ChicagoO3.R0000644000176200001440000000674014275252302013614 0ustar liggesusers# # fields is a package for analysis of spatial data written for # the R software environment. # Copyright (C) 2022 Colorado School of Mines # 1500 Illinois St., Golden, CO 80401 # Contact: Douglas Nychka, douglasnychka@gmail.edu, # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with the R software environment if not, write to the Free Software # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA # or see http://www.r-project.org/Licenses/GPL-2 ##END HEADER # test data -- some old ozone data for chicago area "ChicagoO3" <- structure(list(x = structure(c(10.2420950223404, 3.80376523711237, 9.10894898014071, 9.62401536295848, -2.42853799498812, -12.626852374789, -0.419779101996896, -7.88824165286121, 3.54623204570348, -16.9019033521803, -27.2032310085453, -6.18852258956094, -5.26140310048807, -12.2147992685346, -25.5550185835271, -15.6657440334172, 21.109995699806, 12.9204402129956, 33.8836419936979, 28.1148985061338, -8.81404505952784, 6.475624941694, -12.2040623901154, -18.5689928883614, 6.8907291046231, -14.9714234763093, -2.03401039835273, 10.6958505981398, 12.287083222701, -4.939739538856, 11.4568748968428, 20.2432463455088, 35.0486281566463, 28.0610414140067, 23.2873435403219, -20.2294095400778, -19.6759373228389, -16.9777602637997, -17.5312324810386, -18.4998088612067), .Dim = as.integer(c(20, 2)), .Dimnames = list(c("170310032", "170310037", "170310050", "170311002", "170311003", "170311601", "170314002", "170314003", "170317002", "170436001", "170890005", "170970001", "170971002", "170973001", "171110001", "171971008", "180891016", "180892008", "181270020", "181270024"), c("East.West", "North.South"))), y = c(36.4902936963152, 34.6396930821552, 31.6444005657229, 34.4646956838262, 37.7204739668803, 40.1342965426748, 37.0181086910068, 38.4001686365134, 44.0485589002946, 38.4870329290307, 42.2402282830657, 40.0049235817847, 42.1090485712195, 39.6319596353327, 42.8054712629932, 44.1097465187358, 35.1186331327201, 46.898470931915, 42.9564231070325, 46.6868555984414), lon.lat = structure(c(-87.546, -87.671, -87.568, -87.558, -87.792, -87.99, -87.753, -87.898, -87.676, -88.073, -88.273, -87.865, -87.847, -87.982, -88.241, -88.049, -87.335, -87.494, -87.087, -87.199, 41.757, 41.978, 41.708, 41.616, 41.984, 41.668, 41.855, 42.039, 42.062, 41.813, 42.05, 42.177, 42.391, 42.29, 42.221, 41.592, 41.6, 41.639, 41.631, 41.617), .Dim = as.integer(c(20, 2)), .Dimnames = list(c("170310032", "170310037", "170310050", "170311002", "170311003", "170311601", "170314002", "170314003", "170317002", "170436001", "170890005", "170970001", "170971002", "170973001", "171110001", "171971008", "180891016", "180892008", "181270020", "181270024"), c("lon", "lat")))), .Names = c("x", "y", "lon.lat")) fields/R/coef.Krig.R0000644000176200001440000000206514275252303013661 0ustar liggesusers# # fields is a package for analysis of spatial data written for # the R software environment. # Copyright (C) 2022 Colorado School of Mines # 1500 Illinois St., Golden, CO 80401 # Contact: Douglas Nychka, douglasnychka@gmail.edu, # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with the R software environment if not, write to the Free Software # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA # or see http://www.r-project.org/Licenses/GPL-2 ##END HEADER coef.Krig <- function(object, ...) { Krig.coef(object, ...)$d } fields/R/wendland.family.R0000644000176200001440000003074614275252303015135 0ustar liggesusers# # fields is a package for analysis of spatial data written for # the R software environment. # Copyright (C) 2022 Colorado School of Mines # 1500 Illinois St., Golden, CO 80401 # Contact: Douglas Nychka, douglasnychka@gmail.edu, # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with the R software environment if not, write to the Free Software # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA # or see http://www.r-project.org/Licenses/GPL-2 ##END HEADER Wendland2.2 <- function(d, aRange = 1, theta=NULL) { # theta argument has been deopreciated. if( !is.null( theta)){ aRange<- theta } # Cari's test function with explicit form for d=2 k=2 # taper range is 1.0 d <- d/aRange if (any(d < 0)) stop("d must be nonnegative") return(((1 - d)^6 * (35 * d^2 + 18 * d + 3))/3 * (d < 1)) } # # # the monster # "wendland.cov" <- function(x1, x2=NULL, aRange = 1, V = NULL, k = 2, C = NA, marginal = FALSE, Dist.args = list(method = "euclidean"), spam.format = TRUE, derivative = 0, verbose = FALSE, theta=NULL) { # # theta argument has been deopreciated. if( !is.null( theta)){ aRange<- theta } # if marginal variance is needed # this is a quick return if (marginal) { return(rep(1, nrow(x1))) } # the rest of the possiblities require some computing # setup the two matrices of locations # if (!is.matrix(x1)) { x1 <- as.matrix(x1) } if( is.null( x2) ) { x2<- x1} if (!is.matrix(x2) ) { x2 <- as.matrix(x2) } d <- ncol(x1) n1 <- nrow(x1) n2 <- nrow(x2) # logical to figure out if this is great circle distance or not # great circle needs to handled specially due to how things are scaled. great.circle <- Dist.args$method == "greatcircle" # derivatives are tricky for great circle and other distances and have not been implemented ... if (Dist.args$method != "euclidean" & derivative > 0) { stop("derivatives not supported for this distance metric") } # catch bad aRange format if (length(aRange) > 1) { stop("aRange as a matrix or vector has been depreciated") } # catch using V with great circle if (!is.null(V) & great.circle) { stop("V is not implemented with great circle distance") } if (!is.null(V)) { if (aRange != 1) { stop("can't specify both aRange and V!") } x1 <- x1 %*% t(solve(V)) x2 <- x2 %*% t(solve(V)) } # if great circle distance set the delta cutoff to be in scale of angular latitude. # also figure out if scale is in miles or kilometers if (great.circle) { miles <- ifelse(is.null(Dist.args$miles), TRUE, Dist.args$miles) delta <- (180/pi) * aRange/ifelse(miles, 3963.34, 6378.388) } else { delta <- aRange } if (verbose) { print(delta) } # once scaling is done taper is applied with default range of 1.0 # find polynomial coeffients that define # wendland on [0,1] # d dimension and k is the order # first find sparse matrix of Euclidean distances # ||x1-x2||**2 (or any other distance that may be specified by # the method component in Dist.args # any distance beyond delta is set to zero -- anticipating the # tapering to zero by the Wendland. # sM <- do.call("nearest.dist", c(list(x1, x2, delta = delta, upper = NULL), Dist.args)) # scale distances by aRange # note: if V is passed then aRange==1 and all the scaling should be done with the V matrix. # there are two possible actions listed below: # find Wendland cross covariance matrix # return either in sparse or matrix format if (is.na(C[1])) { sM@entries <- Wendland(sM@entries/aRange, k = k, dimension = d) if (!spam.format) { return(as.matrix(sM)) } else { return(sM) } } else { # # multiply cross covariance matrix by the matrix C where # columns are usually the 'c' coefficients # note multiply happens in spam format # if (derivative == 0) { sM@entries <- Wendland(sM@entries/aRange, k = k, dimension = d) return(sM %*% C) } else { # otherwise evaluate partial derivatives with respect to x1 # big mess of code and an explicit for loop! # this only is for euclidean distance if (is.matrix(C)) { if (ncol(C) > 1) { stop("C should be a vector") } } L <- length(coef) # loop over dimensions and accumulate partial derivative matrix. tempD <- sM@entries tempW <- Wendland(tempD/aRange, k = k, dimension = d, derivative = derivative) # loop over dimensions and knock out each partial accumulate these in # in temp temp <- matrix(NA, ncol = d, nrow = n1) # Create rowindices vector sMrowindices <- rep(1:n1, diff(sM@rowpointers)) for (kd in 1:d) { # # Be careful if the distance (tempD) is close to zero. # Note that the x1 and x2 are in transformed ( V inverse) scale # # sM@entries <- ifelse(tempD == 0, 0, (tempW * (x1[sMrowindices, kd] - x2[sM@colindices, kd])/(aRange * tempD))) # # accumlate the new partial temp[, kd] <- sM %*% C } # transform back to original coordinates. if (!is.null(V)) { temp <- temp %*% t(solve(V)) } return(temp) } } # should not get here! } # # # ############## basic evaluation of Wendland and its derivatives. ########################### # n: Wendland interpolation matrix is positive definite on R^n, i.e. n is # the dimension of the locations. # k: Wendland function is 2k times continuously # differentiable. # The proofs can be found in the work of Wendland(1995). # H. Wendland. Piecewise polynomial , positive definite and compactly supported radial # functions of minimal degree. AICM 4(1995), pp 389-396. ######################################### ## top level function: Wendland = function(d, aRange = 1, dimension, k, derivative = 0, phi = NA, theta=NULL) { # theta argument has been deopreciated. if( !is.null( theta)){ aRange<- theta } if (!is.na(phi)) { stop("phi argument has been depreciated") } if (any(d < 0)) { stop("d must be nonnegative") } # find scaling so that function at zero is 1. scale.constant <- wendland.eval(0, n = dimension, k, derivative = 0) # adjust by aRange if (derivative > 0) { scale.constant <- scale.constant * (aRange^(derivative)) } # scale distances by aRange. if( aRange!=1){ d <- d/aRange} # at this point d the distances shouls be scaled so that # covariance is zero beyond 1 if( (k==2)& (dimension==2) & (derivative==0)){ ((1 - d)^6 * (35 * d^2 + 18 * d + 3))/3 * (d < 1)} else{ ifelse(d < 1, wendland.eval(d, n = dimension, k, derivative)/scale.constant, 0) } } #################### # [M] = wm(n, k) # Compute the matrix coeficient in Wendland(1995) # Input: #\tn: Wendland interpolation matrix is positive definite on R^n # \tk: Wendland function is 2k times continuously differentiable #################### Wendland.beta = function(n, k) { l = floor(n/2) + k + 1 M = matrix(0, nrow = k + 1, ncol = k + 1) # # top corner is 1 # M[1, 1] = 1 # # Compute across the columns and down the rows, filling out upper triangle of M (including diagonal). The indexing is done from 0, thus we have to adjust by +1 when accessing our matrix element. # if (k == 0) { stop } else { for (col in 0:(k - 1)) { # # Filling out the col+1 column # # As a special case, we need a different formula for the top row # row = 0 beta = 0 for (m in 0:col) { beta = beta + M[m + 1, col + 1] * fields.pochdown(m + 1, m - row + 1)/fields.pochup(l + 2 * col - m + 1, m - row + 2) } M[row + 1, col + 2] = beta # # Now do the rest of rows # for (row in 1:(col + 1)) { beta = 0 for (m in (row - 1):col) { beta = beta + M[m + 1, col + 1] * fields.pochdown(m + 1, m - row + 1)/fields.pochup(l + 2 * col - m + 1, m - row + 2) } M[row + 1, col + 2] = beta } } } M } ######################################## # [phi] = wendland.eval(r, n, k, derivative). # Compute the compacted support basis function in Wendland(1995). # Input: #\tr: a scalar representing the distance between locations. r should be scaled into [0,1] beforehand. # \tn: Wendland interpolation matrix is positive definite on R^n. Or, we could say n is the dimension of the locations. # \tk: Wendland function is 2k times continuously differentiable. #\tderivative: the derivative of wendland function. # Output: #\tphi: a scalar evaluated by the Wendland function at distance r. # example: #\tr = 0.5 #\tphi = wendland.eval(r, 2, 1,derivative = 1 ) # The proofs can be found in the work of Wendland(1995). # H. Wendlamd. Piecewise polynomial , positive definite and compactly supported radial functions of minimal degree. AICM 4(1995), pp 389-396. ######################################### wendland.eval = function(r, n, k, derivative = 0) { # # check if the distances are between [0,1] # beta = Wendland.beta(n, k) l = floor(n/2) + k + 1 if (derivative == 0) { # # first evaluate outside for loop with m =0 phi = beta[1, k + 1] * (1 - r)^(l + 2 * k) # now accumulate terms for other m values up to k for (m in 1:k) { phi = phi + beta[m + 1, k + 1] * r^m * (1 - r)^(l + 2 * k - m) } } else { # evaluate derivative note use of symbolic differtiation. f.my = expression((1 - r)^(l + 2 * k)) f.deriv = fields.D(f.my, "r", order = derivative) f.eval = eval(f.deriv) phi = beta[1, k + 1] * f.eval for (m in 1:k) { f.my = expression(r^m * (1 - r)^(l + 2 * k - m)) f.deriv = fields.D(f.my, "r", order = derivative) f.eval = eval(f.deriv) phi = phi + beta[m + 1, k + 1] * f.eval } } phi } ####################### # [n] = fields.pochup(q, k) # Calculate the Pochhammer symbol for rising factorial q(q+1)(q+2)...(q+k-1) ####################### fields.pochup = function(q, k) { n = q if (k == 0) { n = 1 } else { for (j in 1:(k - 1)) { if ((k - 1) < 1) { stop } else { n = n * (q + j) } } } n } ######################### # [n] = fields.pochdown(q, k) # Calculate the Pochhammer symbol for falling factorial q(q-1)(q-2)...(q-k+1) ######################### fields.pochdown = function(q, k) { n = q if (k == 0) { n = 1 } else { for (j in 1:(k - 1)) { if ((k - 1) < 1) { stop } else { n = n * (q - j) } } } n } ############################# # fields.D(f,name = x,order = n) forms the n-th derivative of function f with respect to the variable x ################################ fields.D = function(f, name, order = 1) { if (order < 1) { stop("'order' must be >= 1") } if (order == 1) { d = D(f, name) } else { fields.D(D(f, name), name, order - 1) } } fields/R/stationary.cov.R0000644000176200001440000001322014275252303015030 0ustar liggesusers# # fields is a package for analysis of spatial data written for # the R software environment. # Copyright (C) 2022 Colorado School of Mines # 1500 Illinois St., Golden, CO 80401 # Contact: Douglas Nychka, douglasnychka@gmail.edu, # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with the R software environment if not, write to the Free Software # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA # or see http://www.r-project.org/Licenses/GPL-2 ##END HEADER "stationary.cov" <- function(x1, x2=NULL, Covariance = "Exponential", Distance = "rdist", Dist.args = NULL, aRange = 1, V = NULL, C = NA, marginal = FALSE, derivative = 0, distMat = NA, onlyUpper = FALSE, theta=NULL, ...) { # get covariance function arguments from call # theta argument has been deopreciated. if( !is.null( theta)){ aRange<- theta } cov.args <- list(...) # coerce x1 and x2 to matrices if (is.data.frame(x1)) x1 <- as.matrix(x1) if (!is.matrix(x1)) x1 <- matrix(c(x1), ncol = 1) if(is.null(x2)) x2 = x1 if (is.data.frame(x2)) x2 <- as.matrix(x2) if (!is.matrix(x2)& !is.null(x2)) x2 <- matrix(c(x2), ncol = 1) d <- ncol(x1) n1 <- nrow(x1) n2 <- nrow(x2) # # separate out a single scalar transformation and a # more complicated scaling and rotation. # this is done partly to have the use of great circle distance make sense # by applying the scaling _after_ finding the distance. # if (length(aRange) > 1) { stop("aRange as a vector matrix has been depreciated use the V argument") } # # following now treats V as a full matrix for scaling and rotation. # # try to catch incorrect conbination of great circle distance and V if (Distance == "rdist.earth" & !is.null(V)) { stop("V not supported with great circle distance") } # use V the anisotropic scaling and rotation from covariance arguments # if exists if( !is.null(cov.args$V) ){ V<- cov.args$V } if (!is.null(V)) { if (aRange != 1) { stop("can't specify both aRange and V!") } x1 <- x1 %*% t(solve(V)) x2 <- x2 %*% t(solve(V)) } # # locations are now scaled and rotated correctly # now apply covariance function to pairwise distance matrix, or multiply # by C vector or just find marginal variance # this if block finds the cross covariance matrix if (is.na(C[1]) && !marginal) { # # if distMat is supplied, evaluate covariance for upper triangular part only # if(is.na(distMat[1])) { # distMat not supplied so must compute it along with covariance matrix # note overall scaling by aRange (which is just aRange under isotropic case) if(is.null(x2)) distMat <- do.call(Distance, c(list(x1), Dist.args)) else distMat <- do.call(Distance, c(list(x1=x1, x2=x2), Dist.args)) } # # now convert distance matrix to covariance matrix # if(inherits(distMat, "dist")) { # # distMat is in compact form, so evaluate covariance over all distMat and convert to matrix form diagVal = do.call(Covariance, c(list(d=0), cov.args)) if(onlyUpper) return(compactToMat(do.call(Covariance, c(list(d=distMat*(1/aRange)), cov.args)), diagVal)) else # if onlyUpper==FALSE, also set lower triangle of covariance matrix return(compactToMat(do.call(Covariance, c(list(d=distMat*(1/aRange)), cov.args)), diagVal, lower.tri=TRUE)) } else { # distMat is a full matrix return(do.call(Covariance, c(list(d = distMat/aRange), cov.args))) } } # or multiply cross covariance by C # as coded below this is not particularly efficient of memory else if(!is.na(C[1])) { if(onlyUpper) { #the onlyUpper option is not compatible with the C option onlyUpper = FALSE } if(is.null(x2)) bigD <- do.call(Distance, c(list(x1, x1), Dist.args)) else bigD <- do.call(Distance, c(list(x1=x1, x2=x2), Dist.args)) if (derivative == 0) { return(do.call(Covariance, c(list(d = bigD*(1/aRange)), cov.args)) %*% C) } else { # find partial derivatives tempW <- do.call(Covariance, c(list(d = bigD*(1/aRange)), cov.args, derivative = derivative)) # loop over dimensions and knock out each partial accumulate these in # in temp temp <- matrix(NA, ncol = d, nrow = n1) for (kd in 1:d) { # Be careful if the distance (tempD) is close to zero. # Note that the x1 and x2 are in transformed ( V inverse) scale sM <- ifelse(bigD == 0, 0, tempW * outer(x1[, kd], x2[, kd], "-")/(aRange * bigD)) # accumlate the new partial temp[, kd] <- sM %*% C } # transform back to original coordinates. if (!is.null(V)) { temp <- temp %*% t(solve(V)) } return(temp) } } # or find marginal variance and return a vector. else if (marginal) { tau2 <- do.call(Covariance, c(list(d = 0), cov.args)) return(rep(tau2, nrow(x1))) } # should not get here based on sequence of conditional if statements above. } fields/R/summary.sreg.R0000644000176200001440000000403314275252303014503 0ustar liggesusers# # fields is a package for analysis of spatial data written for # the R software environment. # Copyright (C) 2022 Colorado School of Mines # 1500 Illinois St., Golden, CO 80401 # Contact: Douglas Nychka, douglasnychka@gmail.edu, # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with the R software environment if not, write to the Free Software # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA # or see http://www.r-project.org/Licenses/GPL-2 ##END HEADER "summary.sreg" <- function(object, digits = 4, ...) { x <- object if (length(x$lambda) > 1) { stop("Can't do a summary on an object with a grid of smoothing\nparameters") } summary <- list(call = x$call, num.observation = length(x$residuals), enp = x$trace, nt = x$nt, res.quantile = quantile(x$residuals, seq(0, 1, 0.25)), tauHat.GCV = x$tauHat.GCV, m = x$m, lambda = x$lambda, cost = x$cost, num.uniq = length(x$y), np = x$np, method = x$method, lambda.est = x$lambda.est[!is.na(x$lambda.est[, 1]), ], tauHat.pure.error = x$tauHat.pure.error) class(summary) <- "summary.sreg" summary$covariance <- cor(x$fitted.values * sqrt(x$weights), (x$y) * sqrt(x$weights))^2 hold <- (sum((x$y - mean(x$y))^2) - sum(x$residuals^2))/(sum((x$y - mean(x$y))^2)) summary$adjr2 <- 1 - ((length(x$residuals) - 1)/(length(x$residuals) - x$eff.df)) * (1 - hold) summary$digits <- digits summary$sum.gcv.lambda <- summaryGCV.sreg(x, x$lambda) summary } fields/R/predict.mKrig.R0000644000176200001440000001003414275252303014547 0ustar liggesusers# # fields is a package for analysis of spatial data written for # the R software environment. # Copyright (C) 2022 Colorado School of Mines # 1500 Illinois St., Golden, CO 80401 # Contact: Douglas Nychka, douglasnychka@gmail.edu, # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with the R software environment if not, write to the Free Software # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA # or see http://www.r-project.org/Licenses/GPL-2 ##END HEADER predict.mKrig <- function(object, xnew = NULL, ynew = NULL, grid.list=NULL, derivative = 0, Z = NULL, drop.Z = FALSE, just.fixed = FALSE, collapseFixedEffect = object$collapseFixedEffect, ...) { # the main reason to pass new args to the covariance is to increase # the temp space size for sparse multiplications # other optional arguments that typically describe the covariance function # from mKrig are passed along in the list object$args cov.args <- list(...) # predict at observation locations by default if( !is.null(grid.list)){ xnew<- make.surface.grid(grid.list) } if (is.null(xnew)) { xnew <- object$x } if (is.null(Z) & (length(object$ind.drift) >0 )) { Z <- object$Tmatrix[, !object$ind.drift] } if (!is.null(ynew)) { coef.hold <- mKrig.coef(object, ynew, collapseFixedEffect=collapseFixedEffect) c.coef <- coef.hold$c.coef beta <- coef.hold$beta } else { c.coef <- object$c.coef beta <- object$beta } # fixed part of the model this a polynomial of degree m-1 # Tmatrix <- fields.mkpoly(xnew, m=object$m) # only do this if nt>0, i.e. there is a fixed part. # if( object$nt>0){ if (derivative == 0) { if (drop.Z | object$nZ == 0) { # just evaluate polynomial and not the Z covariate temp1 <- fields.mkpoly(xnew, m = object$m) %*% beta[object$ind.drift, ] } else { if( nrow( xnew) != nrow(as.matrix(Z)) ){ stop(paste("number of rows of covariate Z", nrow(as.matrix(Z)), " is not the same as the number of locations", nrow( xnew) ) ) } temp0 <- cbind(fields.mkpoly(xnew, m = object$m),as.matrix(Z)) temp1 <- temp0 %*% beta } } else { if (!drop.Z & object$nZ > 0) { stop("derivative not supported with Z covariate included") } temp1 <- fields.derivative.poly(xnew, m = object$m, beta[object$ind.drift, ]) } if (just.fixed) { return(temp1) } } # add nonparametric part. Covariance basis functions # times coefficients. # syntax is the name of the function and then a list with # all the arguments. This allows for different covariance functions # that have been passed as their name. if (derivative == 0) { # argument list are the parameters and other options from mKrig # locations anbetaficients, temp2 <- do.call(object$cov.function.name, c(object$args, list(x1 = xnew, x2 = object$knots, C = c.coef), cov.args)) } else { temp2 <- do.call(object$cov.function.name, c(object$args, list(x1 = xnew, x2 = object$knots, C = c.coef, derivative = derivative), cov.args)) } # add two parts together and coerce to vector if( object$nt>0){ return((temp1 + temp2)) } else{ return( temp2) } } fields/R/unrollZGrid.R0000644000176200001440000000334114275252303014323 0ustar liggesusers# # fields is a package for analysis of spatial data written for # the R software environment. # Copyright (C) 2022 Colorado School of Mines # 1500 Illinois St., Golden, CO 80401 # Contact: Douglas Nychka, douglasnychka@gmail.edu, # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with the R software environment if not, write to the Free Software # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA # or see http://www.r-project.org/Licenses/GPL-2 ##END HEADER unrollZGrid<- function( grid.list, ZGrid){ if( is.null(ZGrid)){ return(ZGrid) } if( is.list( ZGrid) ){ if( any(grid.list[[1]] != ZGrid[[1]]) |any(grid.list[[2]] != ZGrid[[2]]) ){ stop("grid list does not match grid for covariates") } # wipe out the x and y components of ZGrid ZGrid<- ZGrid$z } # check dimensions Zdim<- dim( ZGrid) nx<- length( grid.list[[1]]) ny<- length( grid.list[[2]]) if( (Zdim[1] != nx) | (Zdim[2] != ny) ){ stop( "Dimension of ZGrid does not match dimensions of location grid list.") } # reshape as a matrix where rows index locations. # Note that this works whether Zdim[3] exists or not! return( matrix( c(ZGrid), nrow= Zdim[1]*Zdim[2] )) } fields/R/residuals.Krig.R0000644000176200001440000000205614275252303014740 0ustar liggesusers# # fields is a package for analysis of spatial data written for # the R software environment. # Copyright (C) 2022 Colorado School of Mines # 1500 Illinois St., Golden, CO 80401 # Contact: Douglas Nychka, douglasnychka@gmail.edu, # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with the R software environment if not, write to the Free Software # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA # or see http://www.r-project.org/Licenses/GPL-2 ##END HEADER resid.Krig <- function(object, ...) { object$residuals } fields/R/setupLegend.R0000644000176200001440000000355614275252303014337 0ustar liggesusers# # fields is a package for analysis of spatial data written for # the R software environment. # Copyright (C) 2022 Colorado School of Mines # 1500 Illinois St., Golden, CO 80401 # Contact: Douglas Nychka, douglasnychka@gmail.edu, # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with the R software environment if not, write to the Free Software # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA # or see http://www.r-project.org/Licenses/GPL-2 ##END HEADER setupLegend<- function( horizontal = FALSE, legend.shrink = 0.9, legend.width = 1.2, legend.mar = ifelse(horizontal, 3.1, 5.1) ){ # save current graphics settings temp <- imageplot.setup(add = FALSE, legend.shrink = legend.shrink, legend.width = legend.width , legend.mar= legend.mar, horizontal = horizontal, bigplot = NULL, smallplot = NULL) Info<- list( smallplot = temp$smallplot, legend.shrink = legend.shrink, legend.mar = legend.mar, legend.width = legend.width , horizontal = horizontal) #oldPar = par(no.readonly = TRUE) ) par(plt = temp$bigplot) return( Info) } fields/R/rdist.earth.R0000644000176200001440000000364614275252303014307 0ustar liggesusers# # fields is a package for analysis of spatial data written for # the R software environment. # Copyright (C) 2022 Colorado School of Mines # 1500 Illinois St., Golden, CO 80401 # Contact: Douglas Nychka, douglasnychka@gmail.edu, # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with the R software environment if not, write to the Free Software # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA # or see http://www.r-project.org/Licenses/GPL-2 ##END HEADER "rdist.earth" <- function(x1, x2=NULL, miles = TRUE, R = NULL) { if (is.null(R)) { if (miles) R <- 3963.34 else R <- 6378.388 } coslat1 <- cos((x1[, 2] * pi)/180) sinlat1 <- sin((x1[, 2] * pi)/180) coslon1 <- cos((x1[, 1] * pi)/180) sinlon1 <- sin((x1[, 1] * pi)/180) if (is.null(x2)) { pp <- cbind(coslat1 * coslon1, coslat1 * sinlon1, sinlat1) %*% t(cbind(coslat1 * coslon1, coslat1 * sinlon1, sinlat1)) return(R * acos(ifelse(abs(pp) > 1, 1 * sign(pp), pp))) } else { coslat2 <- cos((x2[, 2] * pi)/180) sinlat2 <- sin((x2[, 2] * pi)/180) coslon2 <- cos((x2[, 1] * pi)/180) sinlon2 <- sin((x2[, 1] * pi)/180) pp <- cbind(coslat1 * coslon1, coslat1 * sinlon1, sinlat1) %*% t(cbind(coslat2 * coslon2, coslat2 * sinlon2, sinlat2)) return(R * acos(ifelse(abs(pp) > 1, 1 * sign(pp), pp))) } } fields/R/fast.1way.R0000644000176200001440000000342514275252303013670 0ustar liggesusers# # fields is a package for analysis of spatial data written for # the R software environment. # Copyright (C) 2022 Colorado School of Mines # 1500 Illinois St., Golden, CO 80401 # Contact: Douglas Nychka, douglasnychka@gmail.edu, # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with the R software environment if not, write to the Free Software # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA # or see http://www.r-project.org/Licenses/GPL-2 ##END HEADER "fast.1way" <- function(lev, y, w = rep(1, length(y))) { # w are proportional to reciprocal variance. if (!is.matrix(y)) { y <- as.matrix(y) } N <- nrow(y) NC <- ncol(y) # ordered unique values of lev tags <- lev[!duplicated(lev)] NR <- length(tags) # lev are now integer tags lev <- match(lev, tags) # means <- matrix(NA, nrow = NR, ncol = NC) # add together weights with same lev w.means <- c(tapply(w, lev, sum)) for (k in 1:NC) { # find weighted means for each lev means[, k] <- (tapply(y[, k] * w, lev, sum)/w.means) } # find SS SSE <- colSums((w * (y - means[lev, ])^2)) MSE <- SSE/(N - NR) list(n = N, means = means, SSE = SSE, w.means = w.means, MSE = MSE, lev = lev, tags = tags) } fields/R/smooth.2d.R0000644000176200001440000000557314275252303013676 0ustar liggesusers# # fields is a package for analysis of spatial data written for # the R software environment. # Copyright (C) 2022 Colorado School of Mines # 1500 Illinois St., Golden, CO 80401 # Contact: Douglas Nychka, douglasnychka@gmail.edu, # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with the R software environment if not, write to the Free Software # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA # or see http://www.r-project.org/Licenses/GPL-2 ##END HEADER "smooth.2d" <- function(Y, ind = NULL, weight.obj = NULL, setup = FALSE, grid = NULL, x = NULL, nrow = 64, ncol = 64, surface = TRUE, cov.function = gauss.cov, Mwidth = NULL, Nwidth = NULL, ...) { temp <- as.image(Y, ind, grid = grid, nx = nrow, ny = ncol, x = x) Y <- temp$z m<- nrow( temp$z) n<- ncol( temp$z) NN <- temp$weights grid <- list(x = temp$x, y = temp$y) if (is.null(weight.obj)) { dx <- grid$x[2] - grid$x[1] dy <- grid$y[2] - grid$y[1] # m <- length(grid$x) # n <- length(grid$y) if (is.null(Mwidth)) M <- 2 * m else { M <- m + Mwidth } if (is.null(Nwidth)) N <- 2 * n else { N <- n + Nwidth } xg <- make.surface.grid(list((1:M) * dx, (1:N) * dy)) center <- matrix(c((dx * M)/2, (dy * N)/2), nrow = 1, ncol = 2) out <- cov.function(xg, center, ...) out <- as.surface(xg, c(out))$z temp <- matrix(0, nrow = M, ncol = N) temp[M/2, N/2] <- 1 wght <- fft(out)/(fft(temp) * M * N) weight.obj <- list(m = m, n = n, grid = grid, N = N, M = M, wght = wght, call = match.call()) if (setup) { return(weight.obj) } } temp <- matrix(0, nrow = weight.obj$M, ncol = weight.obj$N) temp[1:m, 1:n] <- Y temp[is.na(temp)] <- 0 temp2 <- Re(fft(fft(temp) * weight.obj$wght, inverse = TRUE))[1:weight.obj$m, 1:weight.obj$n] temp <- matrix(0, nrow = weight.obj$M, ncol = weight.obj$N) temp[1:m, 1:n] <- NN temp[is.na(temp)] <- 0 temp3 <- Re(fft(fft(temp) * weight.obj$wght, inverse = TRUE))[1:weight.obj$m, 1:weight.obj$n] if (!surface) (temp2/temp3) else { list(x = weight.obj$grid$x, y = weight.obj$grid$y, z = temp2/temp3, index = ind) } } fields/R/sim.spatialProcess.R0000644000176200001440000001144614275252303015640 0ustar liggesusers# # fields is a package for analysis of spatial data written for # the R software environment. # Copyright (C) 2022 Colorado School of Mines # 1500 Illinois St., Golden, CO 80401 # Contact: Douglas Nychka, douglasnychka@gmail.edu, # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with the R software environment if not, write to the Free Software # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA # or see http://www.r-project.org/Licenses/GPL-2 ##END HEADER sim.spatialProcess<- function(object, xp, M = 1, verbose = FALSE, ...) { # important variance parameters estimated from the data tau2 <- (object$summary["tau"])^2 sigma2 <- (object$summary["sigma2"]) xp<- as.matrix( xp) # # check for unique rows of data locations if( any(duplicated(object$x)) ){ stop("data locations should be unique") } # # find sizes of arrays m <- nrow(xp) n<- nrow( object$x) N <- length(object$y) if (verbose) { cat("m,n,N", m,n, N, fill = TRUE) } # # find indices of all rows of xp that correspond to rows of # xM and then collapse x to unique rows. if( any( duplicated(object$x)) ){ stop('Can not handle replicated locations')} if( any( duplicated(xp)) ){ stop('Can not handle repeated prediction locations')} # x<- as.matrix(rbind( object$x, xp)) rep.x.info <- fields.duplicated.matrix(x) # find uniuqe locations. ind<- !duplicated(rep.x.info) xUnique <- as.matrix(x[ind, ]) if (verbose) { cat('full x and predicted locations without duplicates ', fill = TRUE) print(xUnique) } N.full <- nrow(xUnique) if (verbose) { cat("N.full", N.full, fill = TRUE) } if( N.full > 5000){ cat("WARNING: Number of locations for conditional simulation is large ( >5000) this may take some time to compute or exhaust the memory.", fill=FALSE) } # these give locations in x matrix to reconstruct xp matrix xp.ind <- rep.x.info[(1:m) + n] if (verbose) { print(N.full) print(xUnique) } if (verbose) { cat("reconstruction of xp from collapsed locations", fill = TRUE) print(xUnique[xp.ind, ]) } # # Sigma is full covariance at the data locations and at prediction points. # not to be confused with the lowercase tau that is the nugget variance # Sigma <- sigma2 * do.call(object$cov.function.name, c(object$args, list(x1 = xUnique, x2 = xUnique))) # # square root of Sigma for simulating field # Cholesky is fast but not very stable. # # the following code line is similar to chol(Sigma)-> Scol # but adds possible additional arguments controlling the Cholesky # from the mKrig object. # x has has been winnowed down to unique rows so that # Sigma has full rank. # Schol <- do.call("chol", c(list(x = Sigma), object$chol.args)) # # output matrix to hold results out <- matrix(NA, ncol = M, nrow = m) # # find conditional mean field from initial fit # (these are added at the predict step). # h.hat <- predict(object, xnew=xp, ...) # # NOTE: fixed part of model (null space) need not be simulated # because the estimator is unbiased for this part. # the variability is still captured because the fixed part # is still estimated as part of the predict step below # create synthetic data for (k in 1:M) { # simulate full field h <- t(Schol) %*% rnorm(N.full) # value of simulated field at observations h.data <- h[1:n] # y.synthetic <- h.data + sqrt(tau2/object$weights)*rnorm(n) # predict at xp using these data # and subtract from 'true' value, # note that true values of field have to be expanded in the # case of common locations between object$x and xp. h.true <- (h[xp.ind]) # temp.error <- predict(object, xnew=xp, ynew = y.synthetic, # Z=Zp, ...) - h.true temp.error <- predict(object, xnew=xp, ynew = y.synthetic, ...) - h.true # add the error to the actual estimate (conditional mean) out[,k ] <- h.hat + temp.error } out } fields/R/makePredictionGrid.R0000644000176200001440000000321714275252303015616 0ustar liggesusersmakePredictionGridList <- function(mKrigObject, nx, ny, np) { # # np used to add additional points so offGridWeights # has enough neighbors. # sDimension <- ncol(mKrigObject$x) xr <- range(mKrigObject$x[, 1]) dx <- (xr[2] - xr[1]) / (nx - 2 * np) xg <- 0:(nx - 1) * dx + (xr[1] - dx * (np - 1 / 2)) predictionGridList <- list(x = xg) # add y grid if 2D if (sDimension == 2) { yr <- range(mKrigObject$x[, 2]) dy <- (yr[2] - yr[1]) / (ny - 2 * np) yg <- 0:(ny - 1) * dy + (yr[1] - dy * (np - 1 / 2)) predictionGridList$y <- yg } return(predictionGridList) } checkPredictGrid <- function(predictionGridList) { testX <- sd(diff(predictionGridList$x)) / mean(diff(predictionGridList$x)) if (testX > 1e-8) { stop("predictionGridList$x must be equally spaced") } dx <- predictionGridList$x[2] - predictionGridList$x[1] if (!is.null(predictionGridList$y)) { testY <- sd(diff(predictionGridList$x)) / mean(diff(predictionGridList$x)) if (testY > 1e-8) { stop("predictionGridList$y must be equally spaced") } dy <- predictionGridList$y[2] - predictionGridList$y[1] } } makeSimulationGrid <- function(predictionGridList, gridRefinement) { dx <- predictionGridList$x[2] - predictionGridList$x[1] simulationGridList <- list(x = seq( min(predictionGridList$x), max(predictionGridList$x), dx / gridRefinement )) if (!is.null(predictionGridList$y)) { dy <- predictionGridList$y[2] - predictionGridList$y[1] simulationGridList$y <- seq(min(predictionGridList$y), max(predictionGridList$y), dy / gridRefinement) } return( simulationGridList ) } fields/R/fields.x.to.grid.R0000644000176200001440000000336014275252303015132 0ustar liggesusers# # fields is a package for analysis of spatial data written for # the R software environment. # Copyright (C) 2022 Colorado School of Mines # 1500 Illinois St., Golden, CO 80401 # Contact: Douglas Nychka, douglasnychka@gmail.edu, # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with the R software environment if not, write to the Free Software # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA # or see http://www.r-project.org/Licenses/GPL-2 ##END HEADER "fields.x.to.grid" <- function(x, nx = 80, ny = 80, xy = c(1, 2)) { if (is.null(x)) { stop("Need a an x matrix to determine ranges for grid") } M <- ncol(x) if (M == 1) { #special case of 1-D grid.list <- list(x = seq(min(x), max(x), length.out = nx)) } else{ grid.list <- as.list(1:M) # add columns names names(grid.list) <- dimnames(x)[[2]] # cruise through x dimensions and find medians. for (k in 1:M) { grid.list[[k]] <- median(x[, k]) } # # # overwrite with sequences for the two variables of surface xr <- range(x[, xy[1]]) yr <- range(x[, xy[2]]) grid.list[[xy[1]]] <- seq(xr[1], xr[2], , nx) grid.list[[xy[2]]] <- seq(yr[1], yr[2], , ny) } return(grid.list) } fields/R/as.image.R0000644000176200001440000000655214275252302013542 0ustar liggesusers# # fields is a package for analysis of spatial data written for # the R software environment. # Copyright (C) 2022 Colorado School of Mines # 1500 Illinois St., Golden, CO 80401 # Contact: Douglas Nychka, douglasnychka@gmail.edu, # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with the R software environment if not, write to the Free Software # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA # or see http://www.r-project.org/Licenses/GPL-2 ##END HEADER "as.image" <- function(Z, ind = NULL, grid = NULL, x = NULL, weights = rep(1, length(Z)), na.rm = FALSE, nx = 64, ny = 64, boundary.grid = FALSE, nrow = NULL, ncol = NULL, FUN=NULL) { # NOTE that throughout ind is a two column integer matrix of # discretized locations in the image matrix. # Thanks to J. Rougier for fixing bugs in this function. # # coerce Z to a vector Z <- c(Z) if( !is.null(ind)){ x<- ind } # set nx and ny if nrow ncol are passed if( !is.null(nrow)&!is.null(ncol)){ nx<- nrow ny<- ncol } # # check for x or weights having missing values # we do not like these ... if( any(is.na(weights)) | any(is.na(c(x))) ) { stop("missing values in weights or x") } # discretize locations to grid boxes # this function will also create a default grid based on range of # locations if grid is NULL # temp <- discretize.image(x, m = nx, n = ny, grid = grid, boundary.grid = boundary.grid) grid <- temp$grid # index is a two column data frame that indexes the x and y grid points. # points outside of grid are assigned as NA # # empty image matrices to hold weights and weighted means w<- z <- matrix( NA, nrow=temp$m, ncol=temp$n) # find stats tempw<- tapply( weights, temp$index, sum, na.rm=na.rm) if( is.null(FUN)){ # usual weighted means case: tempz<- tapply( Z*weights, temp$index,sum, na.rm=na.rm ) tempz<- tempz/ tempw } else{ # just apply FUN to values in the grid box -- no weighting! tempz<- tapply( Z, temp$index, FUN ) } # these are the indices that are represented by the locations # they may not include the entire set ( 1:nx and 1:ny) # so define what they do have. # insert the tabled values into the right rows and columns. # ix and iy are the range of indexes for the grid, but account for missing cells. z[ temp$ix, temp$iy] <- tempz w[ temp$ix, temp$iy] <- tempw # xd is created in the return list because it is a pain to do otherwise and handy to have call <- match.call() list(x = grid$x, y = grid$y, z = z, call = call, ind = cbind(temp$index[[1]], temp$index[[2]]) , weights = w, xd = cbind(grid$x[temp$index[[1]]], grid$y[temp$index[[2]]] ), call = match.call(), FUN = FUN ) } fields/R/sreg.family.R0000644000176200001440000002315314275252303014273 0ustar liggesusers# # fields is a package for analysis of spatial data written for # the R software environment. # Copyright (C) 2022 Colorado School of Mines # 1500 Illinois St., Golden, CO 80401 # Contact: Douglas Nychka, douglasnychka@gmail.edu, # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with the R software environment if not, write to the Free Software # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA # or see http://www.r-project.org/Licenses/GPL-2 ##END HEADER "sreg" <- function(x, y, lambda = NA, df = NA, offset = 0, weights = rep(1, length(x)), cost = 1, nstep.cv = 80, tol = 1e-05, find.diagA = TRUE, trmin = 2.01, trmax = NA, lammin = NA, lammax = NA, verbose = FALSE, do.cv = TRUE, method = "GCV", rmse = NA, na.rm = TRUE, digits=8) { call <- match.call() out <- list() out$call <- match.call() class(out) <- c("sreg") out$cost <- cost out$offset <- offset out$method <- method # # some obscure components so that some of the Krig functions # work without size of 'null space' out$nt <- 2 out$knots <- NULL # # various checks on x and y including looking for NAs. out2 <- Krig.check.xY(x, y, NULL, weights, na.rm, verbose = verbose) out <- c(out, out2) # find duplicate rows of the x vector # unique x values are now in out$xM and the means of # y are in out$yM. out <- Krig.replicates(out, verbose = verbose, digits=digits) out <- c(out, out2) # number of unique locations out$np <- length(out$yM) if( out$np > 5e4){ stop("sreg not dimensioned for more than 50000 observations") } # now set maximum of trace for upper bound of GCV grid search if (is.na(trmax)) { trmax <- out$np * 0.99 } if (verbose) { print(out) } # # sorted unique values for prediction to make line plotting quick xgrid <- sort(out$xM) out$trace <- NA # # figure out if the GCV function should be minimized # and which value of lambda should be used for the estimate # old code used lam as argument, copy it over from lambda lam <- lambda if (is.na(lam[1]) & is.na(df[1])) { do.cv <- TRUE } else { do.cv <- FALSE } # # find lambda's if df's are given if (!is.na(df[1])) { lam <- rep(0, length(df)) for (k in 1:length(df)) { lam[k] <- sreg.df.to.lambda(df[k], out$xM, out$weightsM) } } # if (verbose) { cat("lambda grid", fill = TRUE) print(lam) } if (do.cv) { a <- gcv.sreg(out, lambda.grid = lam, cost = cost, offset = offset, nstep.cv = nstep.cv, verbose = verbose, trmin = trmin, trmax = trmax, rmse = rmse) # if the spline is evaluated at the GCV solution # wipe out lam grid # and just use GCV lambda. out$gcv.grid <- a$gcv.grid out$lambda.est <- a$lambda.est # # save GCV estimate if that is what is needed lam <- a$lambda.est[method, "lambda"] out$tauHat.GCV <- a$lambda.est[method, "tauHat"] } # # now evaluate spline at lambda either from specified grid or GCV value. b <- list() # lam can either be a grid or just the GCV value NL <- length(lam) NG <- length(xgrid) h <- log(lam) fitted.values<- residuals <- matrix(NA, ncol = NL, nrow = length(out$y)) predicted <- matrix(NA, ncol = NL, nrow = NG) trace <- rep(NA, NL) job <- as.integer(c(0, 3, 0)) if (find.diagA) { diagA <- matrix(NA, ncol = NL, nrow = out$np) # add switch to find diag of A. job <- as.integer(c(3, 3, 0)) } for (k in 1:NL) { # # call cubic spline FORTRAN, this is nasty looking but fast. # note lambda is passed in log scale. # what the routine does is controlled by array job # spline solution evaluated at xgrid # b <- .Fortran("css", PACKAGE="fields", h = as.double(h[k]), npoint = as.integer(out$np), x = as.double(out$xM), y = as.double(out$yM), wt = as.double(1/sqrt(out$weightsM)), sy = as.double(rep(0, out$np)), trace = as.double(0), diag = as.double(c(cost, offset, rep(0, (out$np - 2)))), cv = as.double(0), ngrid = as.integer(NG), xg = as.double(xgrid), yg = as.double(rep(0, NG)), job = as.integer(job), ideriv = as.integer(0), ierr = as.integer(0) ) if (find.diagA) { diagA[, k] <- b$diag } # note distinction between yM and y, xM and x # these are residuals at all data point locations not just the # unique set. trace[k] <- b$trace fitted.values[ , k] <- splint(out$xM, b$sy, out$x) residuals[ , k] <- out$y - fitted.values[,k] predicted[ , k] <- b$yg } out$call <- call out$lambda <- lam out$do.cv <- do.cv out$residuals <- residuals out$trace <- trace out$fitted.values <- fitted.values out$predicted <- list(x = xgrid, y = predicted) if (length(lambda[1]) == 1) { out$eff.df <- out$trace[1] } if (find.diagA) { out$diagA <- diagA } class(out) <- "sreg" return(out) } "sreg.df.to.lambda" <- function(df, x, wt, guess = 1, tol = 1e-05) { if (is.na(df)) return(NA) n <- length(unique(x)) info <- list(x = x, wt = wt, df = df) if (df > n) { warning(" df too large to match a lambda value") return(NA) } h1 <- log(guess) ########## find upper lambda for (k in 1:25) { tr <- sreg.trace(h1, info) if (tr <= df) break h1 <- h1 + 1.5 } ########## find lower lambda h2 <- log(guess) for (k in 1:25) { tr <- sreg.trace(h2, info) if (tr >= df) break h2 <- h2 - 1.5 } out <- bisection.search(h1, h2, sreg.fdf, tol = tol, f.extra = info)$x exp(out) } "sreg.fdf" <- function(h, info) { sreg.trace(h, info) - info$df } "sreg.fgcv" <- function(lam, obj) { sreg.fit(lam, obj)$gcv } "sreg.fgcv.model" <- function(lam, obj) { sreg.fit(lam, obj)$gcv.model } "sreg.fgcv.one" <- function(lam, obj) { sreg.fit(lam, obj)$gcv.one } "sreg.fit" <- function(lam, obj, verbose = FALSE) { np <- obj$np N <- obj$N nt <- 2 if (is.null(obj$cost)) { cost <- 1 } else { cost <- obj$cost } if (is.null(obj$offset)) { offset <- 0 } else { offset <- obj$offset } if (is.null(obj$tauHat.pure.error)) { tauHat.pure.error <- 0 } else { tauHat.pure.error <- obj$tauHat.pure.error } if (is.null(obj$pure.ss)) { pure.ss <- 0 } else { pure.ss <- obj$pure.ss } #print(np) #\tNOTE h <- log(lam) temp <- .Fortran("css", PACKAGE="fields", h = as.double(log(lam)), npoint = as.integer(np), x = as.double(obj$xM), y = as.double(obj$yM), wt = as.double(sqrt(1/obj$weightsM)), sy = as.double(rep(0, np)), trace = as.double(0), diag = as.double(rep(0, np)), cv = as.double(0), ngrid = as.integer(0), xg = as.double(0), yg = as.double(0), job = as.integer(c(3, 0, 0)), ideriv = as.integer(0), ierr = as.integer(0)) rss <- sum((temp$sy - obj$yM)^2 * obj$weightsM) MSE <- rss/np if ((N - np) > 0) { MSE <- MSE + pure.ss/(N - np) } trA <- temp$trace den <- (1 - (cost * (trA - nt - offset) + nt)/np) den1 <- (1 - (cost * (trA - nt - offset) + nt)/N) # If the denominator is negative then flag this as a bogus case # by making the GCV function 'infinity' # tauHat <- sqrt((rss + pure.ss)/(N - trA)) GCV <- ifelse(den > 0, MSE/den^2, NA) gcv.model <- ifelse((den > 0) & ((N - np) > 0), pure.ss/(N - np) + (rss/np)/(den^2), NA) gcv.one <- ifelse(den > 0, ((pure.ss + rss)/N)/(den1^2), NA) list(trace = trA, gcv = GCV, rss = rss, tauHat = tauHat, gcv.model = gcv.model, gcv.one = gcv.one) } "sreg.fs2hat" <- function(lam, obj) { sreg.fit(lam, obj)$tauHat^2 } "sreg.trace" <- function(h, info) { N <- length(info$x) #\th <- log(lam) temp <- .Fortran("css", PACKAGE="fields", h = as.double(h), npoint = as.integer(N), x = as.double(info$x), y = as.double(rep(0, N)), wt = as.double(1/sqrt(info$wt)), sy = as.double(rep(0, N)), trace = as.double(0), diag = as.double(rep(0, N)), cv = as.double(0), ngrid = as.integer(0), xg = as.double(0), yg = as.double(0), job = as.integer(c(3, 0, 0)), ideriv = as.integer(0), ierr = as.integer(0) )$trace return(temp) } fields/R/make.surface.grid.R0000644000176200001440000000324214275252303015340 0ustar liggesusers# # fields is a package for analysis of spatial data written for # the R software environment. # Copyright (C) 2022 Colorado School of Mines # 1500 Illinois St., Golden, CO 80401 # Contact: Douglas Nychka, douglasnychka@gmail.edu, # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with the R software environment if not, write to the Free Software # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA # or see http://www.r-project.org/Licenses/GPL-2 ##END HEADER "make.surface.grid" <- function(grid.list) { # # the old fields version of make.surface.grid was complicated # and we believe rarely used. # this current function # is essentially a single line replacement # # but adds an attribute for the grid matrix to carry # and carries along the names of the grid.list variables. # along the information as to how it was created. # see as.surface # NOTE: for compatibility this works for a 1D grid # temp <- as.matrix(expand.grid(grid.list)) # wipe out row names dimnames(temp) <- list(NULL, names(grid.list)) # set attribute attr(temp, "grid.list") <- grid.list return(temp) } fields/R/predict.Krig.R0000644000176200001440000001071114275252303014374 0ustar liggesusers# # fields is a package for analysis of spatial data written for # the R software environment. # Copyright (C) 2022 Colorado School of Mines # 1500 Illinois St., Golden, CO 80401 # Contact: Douglas Nychka, douglasnychka@gmail.edu, # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with the R software environment if not, write to the Free Software # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA # or see http://www.r-project.org/Licenses/GPL-2 ##END HEADER # wrapper for Tps object "predict.Tps"<- function(object, ...){ UseMethod("Krig") } "predict.Krig" <- function(object, x = NULL, Z = NULL, drop.Z = FALSE, just.fixed = FALSE, lambda = NA, df = NA, model = NA, eval.correlation.model = TRUE, y = NULL, yM = NULL, verbose = FALSE, ...) { #NOTE: most of this function is figuring out what to do! # # check that derivative is not called if (!is.null(list(...)$derivative)) { stop("For derivatives use predictDerivative") } # y is full data yM are the data collapsed to replicate means # if new data is not passed then copy from the object if (is.null(y) & is.null(yM)) { temp.c <- object$c temp.d <- object$d } # check for passed x but no Z -- this is an error # if there are Z covariates in the model and drop.Z is FALSE ZinModel<- !is.null(object$Z) newX<- !is.null(x) missingZ<- is.null(Z) if( ZinModel&newX){ if( missingZ & !drop.Z) { stop("Need to specify drop.Z as TRUE or pass Z values") } } # default is to predict at data x's if (is.null(x)) { x <- object$x } else { x <- as.matrix(x) } # default is to predict at data Z's if (is.null(Z)) { Z <- object$Z } else { Z <- as.matrix(Z) } if (verbose) { print(x) print(Z) } # transformations of x values used in Krig xc <- object$transform$x.center xs <- object$transform$x.scale x <- scale(x, xc, xs) # NOTE knots are already scaled in Krig object and are used # in transformed scale. # i.e. knots <- scale( object$knots, xc, xs) # # figure out if the coefficients for the surface needto be recomputed. find.coef<- (!is.null(y) | !is.null(yM) | !is.na(lambda) | !is.na(df) | !is.na(model[1])) if (verbose) { cat("find.coef", find.coef, fill = TRUE) } # convert effective degrees of freedom to equivalent lambda if (!is.na(df)) { lambda <- Krig.df.to.lambda(df, object$matrices$D) } if (!is.na(model)) { lambda <- model[1] } if (is.na(lambda)) lambda <- object$lambda # # if the coefficients need to be recomputed do it. if (find.coef) { if (verbose) { cat("new coefs found", fill = TRUE) } object3 <- Krig.coef(object, lambda = lambda, y = y, yM = yM) temp.d <- object3$d temp.c <- object3$c } if (verbose) { cat(" betas", fill = TRUE) print(temp.d) cat("c coefs", fill = TRUE) print(temp.c) } # this is the fixed part of predictor # Tmatrix <- do.call(object$null.function.name, c(object$null.args, list(x = x, Z = Z, drop.Z = drop.Z))) if (drop.Z) { temp <- Tmatrix %*% temp.d[object$ind.drift] } else { temp <- Tmatrix %*% temp.d } # add in spatial piece if (!just.fixed) { # # Now find sum of covariance functions times coefficients # Note that the multiplication of the cross covariance matrix # by the coefficients is done implicitly in the covariance function # # The covariance function is # evaluated by using its name, the do.call function, and any # additional arguments. # temp <- temp + do.call(object$cov.function.name, c(object$args, list(x1 = x, x2 = object$knots, C = temp.c))) } return(temp) } fields/R/transformx.R0000644000176200001440000000400514275252303014251 0ustar liggesusers# # fields is a package for analysis of spatial data written for # the R software environment. # Copyright (C) 2022 Colorado School of Mines # 1500 Illinois St., Golden, CO 80401 # Contact: Douglas Nychka, douglasnychka@gmail.edu, # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with the R software environment if not, write to the Free Software # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA # or see http://www.r-project.org/Licenses/GPL-2 ##END HEADER "transformx" <- function(x, scale.type = "unit.sd", x.center, x.scale) { if (scale.type == "unscaled") { x.center <- rep(0, ncol(x)) x.scale <- rep(1, ncol(x)) } else if (scale.type == "unit.sd") { x.center <- apply(x, 2, mean) x.scale <- sqrt(apply(x, 2, var)) x <- scale(x) } else if (scale.type == "range") { x.center <- apply(x, 2, min) x.scale <- apply(x, 2, max) - apply(x, 2, min) x <- scale(x, center = x.center, scale = x.scale) } else if (scale.type == "user") { if (missing(x.center)) x.center <- apply(x, 2, mean) if (missing(x.scale) || length(x.scale) != ncol(x)) stop("Error: x.scale must be a vector of length d") x <- scale(x, center = x.center, scale = x.scale) } else stop(paste("Error: scale.type must be one of", "unit.sd, range, user, unscaled")) attr(x, "x.center") <- x.center attr(x, "x.scale") <- x.scale attr(x, "x.scale.type") <- scale.type x } fields/R/plot.Krig.R0000644000176200001440000000613214275252303013722 0ustar liggesusers# # fields is a package for analysis of spatial data written for # the R software environment. # Copyright (C) 2022 Colorado School of Mines # 1500 Illinois St., Golden, CO 80401 # Contact: Douglas Nychka, douglasnychka@gmail.edu, # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with the R software environment if not, write to the Free Software # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA # or see http://www.r-project.org/Licenses/GPL-2 ##END HEADER "plot.Krig" <- function(x, digits = 4, which = 1:4, ...) { out <- x # # don't do plots 2:4 if a fixed lambda # if (x$fixed.model) { which <- 1 } fitted.values <- predict(out) std.residuals <- (out$residuals * sqrt(out$weights))/out$tauHat.GCV if (any(which == 1)) { temp <- summary(out) plot(fitted.values, out$y, ylab = "Y", xlab = " predicted values", bty = "n", ...) abline(0, 1) # hold <- par("usr") # text(hold[1], hold[4], paste(" R**2 = ", format(round(100 * # temp$covariance, 2)), "%", sep = ""), cex = 0.8, # adj = 0) } if (any(which == 2)) { plot(fitted.values, std.residuals, ylab = "(STD) residuals", xlab = " predicted values", bty = "n", ...) yline(0) hold <- par("usr") # text(hold[1], hold[4], paste(" RMSE =", format(signif(sqrt(sum(out$residuals^2)/(temp$num.observation - # temp$enp)), digits))), cex = 0.8, adj = 0) } if (any(which == 3)) { if (nrow(out$gcv.grid) > 1) { ind <- out$gcv.grid[, 3] < 1e+19 out$gcv.grid <- out$gcv.grid[ind, ] yr <- range(unlist(out$gcv.grid[, 3:5]), na.rm = TRUE) plot(out$gcv.grid[, 2], out$gcv.grid[, 3], xlab = "Eff. number of parameters", ylab = " GCV function", bty = "n", ylim = yr, ...) lines(out$gcv.grid[, 2], out$gcv.grid[, 4], lty = 3) lines(out$gcv.grid[, 2], out$gcv.grid[, 5], lty = 1) xline(out$eff.df, lwd=2, col="grey") usr.save<- par()$usr usr.save[3:4]<- range( -out$gcv.grid[,7] ) par( usr= usr.save, ylog=FALSE) lines( out$gcv.grid[, 2], -out$gcv.grid[,7] , lty=2, lwd=2, col="blue") axis( side=4) mtext( side=4, line=2, "log profile likelihood ") title("GCV-points, solid-model, dots- single \n REML dashed", cex = 0.5) box() } } if (any(which == 4)) { hist(std.residuals, ylab="") } } fields/R/offGridWeights.R0000644000176200001440000000425214275252303014765 0ustar liggesusers# # fields is a package for analysis of spatial data written for # the R software environment. # Copyright (C) 2022 Colorado School of Mines # 1500 Illinois St., Golden, CO 80401 # Contact: Douglas Nychka, douglasnychka@gmail.edu, # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with the R software environment if not, write to the Free Software # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA # or see http://www.r-project.org/Licenses/GPL-2 ##END HEADER\ offGridWeights<-function(s, gridList, np=2, mKrigObject=NULL, Covariance=NULL, covArgs=NULL, aRange=NULL, sigma2=NULL, giveWarnings=TRUE, debug=FALSE ) # # This is a wrapper function to distinguish between the # 1D and 2D cases. The 1D is useful to follow the algorithm # details but typically not needed in practice. The 2D is # the workhorse for fast approximation simulation of a stationary # spatial process on a regular grid combined with irregular # observations # { callList<- list( s=s, gridList=gridList, np=np, mKrigObject=mKrigObject, Covariance=Covariance, covArgs=covArgs, aRange=aRange, sigma2=sigma2, giveWarnings=giveWarnings, debug=debug ) if( length( gridList)==1){ return( do.call("offGridWeights1D", callList) ) } if( length( gridList)==2){ return( do.call("offGridWeights2D", callList) ) } stop("GridList should be either 1 or 2 components") } fields/R/wendland.image.cov.R0000644000176200001440000000733114275252303015516 0ustar liggesusers# # fields is a package for analysis of spatial data written for # the R software environment. # Copyright (C) 2022 Colorado School of Mines # 1500 Illinois St., Golden, CO 80401 # Contact: Douglas Nychka, douglasnychka@gmail.edu, # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with the R software environment if not, write to the Free Software # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA # or see http://www.r-project.org/Licenses/GPL-2 ##END HEADER wendland.image.cov <- function(ind1, ind2, Y, cov.obj = NULL, setup = FALSE, grid, M = NULL, N = NULL, cov.args=NULL, ...) { # # if cov object is missing then create # basically need to enlarge domain and find the FFT of the # covariance # cov.args<-c( cov.args, list(...)) # # theta has been deopreciated. if( !is.null(cov.args$theta )){ cov.args$aRange <- cov.args$theta } # delta<- cov.args$aRange if (is.null(cov.obj)) { dx <- grid$x[2] - grid$x[1] dy <- grid$y[2] - grid$y[1] m <- length(grid$x) n <- length(grid$y) # # determine size of padding # default is twice domain and will then yeild exact results # delta indicates that covariance is zero beyond a distance delta # so using a smaller grid than twice domain will still give exact results. if(!is.null(delta)){ M<- ceiling(m + 2*delta/dx) N<- ceiling(n + 2*delta/dy) } if (is.null(M)) M <- (2 * m) if (is.null(N)) N <- (2 * n) # make sure M and N are even. # (not sure what it means if this is not the case!) if( M%%2 !=0) { M<- M+1} if( N%%2 !=0) { N<- N+1} # # print( c(m,n, M,N)) xGrid<- (1:M) * dx - (dx * M)/2 yGrid<- (1:N) * dy - (dy * N)/2 bigDistance<- sqrt( matrix( xGrid^2, M,N, byrow=FALSE) + matrix( yGrid^2, M,N, byrow=TRUE)) # cat("Wendland", fill=TRUE) out<- Wendland( bigDistance / cov.args$aRange, dimension=2, k=cov.args$k ) temp <- matrix(0, nrow = M, ncol = N) # # a simple way to normalize. This could be avoided by # translating image from the center ... # temp[M/2, N/2] <- 1 wght <- fft(out)/(fft(temp) * M * N) # # wght is the discrete FFT for the covariance suitable for fast # multiplication by convolution. # cov.obj <- list(m = m, n = n, grid = grid, N = N, M = M, wght = wght, call = match.call()) if (setup) { return(cov.obj) } } temp <- matrix(0, nrow = cov.obj$M, ncol = cov.obj$N) if (missing(ind1)) { temp[1:cov.obj$m, 1:cov.obj$n] <- Y Re(fft(fft(temp) * cov.obj$wght, inverse = TRUE)[1:cov.obj$m, 1:cov.obj$n]) } else { if (missing(ind2)) { temp[ind1] <- Y } else { temp[ind2] <- Y } # # as promised this is a single clean step # Re(fft(fft(temp) * cov.obj$wght, inverse = TRUE)[ind1]) } } fields/R/bisection.search.R0000644000176200001440000000323614275252302015275 0ustar liggesusers# # fields is a package for analysis of spatial data written for # the R software environment. # Copyright (C) 2022 Colorado School of Mines # 1500 Illinois St., Golden, CO 80401 # Contact: Douglas Nychka, douglasnychka@gmail.edu, # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with the R software environment if not, write to the Free Software # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA # or see http://www.r-project.org/Licenses/GPL-2 ##END HEADER "bisection.search" <- function(x1, x2, f, tol = 1e-07, niter = 25, f.extra = NA, upcross.level = 0) { f1 <- f(x1, f.extra) - upcross.level f2 <- f(x2, f.extra) - upcross.level if (f1 > f2) stop(" f1 must be < f2 ") iter <- niter for (k in 1:niter) { xm <- (x1 + x2)/2 fm <- f(xm, f.extra) - upcross.level if (fm < 0) { x1 <- xm f1 <- fm } else { x2 <- xm f2 <- fm } if (abs(fm) < tol) { iter <- k break } } xm <- (x1 + x2)/2 fm <- f(xm, f.extra) - upcross.level list(x = xm, fm = fm, iter = iter) } fields/R/golden.section.search.R0000644000176200001440000000732614275252303016236 0ustar liggesusers# # fields is a package for analysis of spatial data written for # the R software environment. # Copyright (C) 2022 Colorado School of Mines # 1500 Illinois St., Golden, CO 80401 # Contact: Douglas Nychka, douglasnychka@gmail.edu, # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with the R software environment if not, write to the Free Software # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA # or see http://www.r-project.org/Licenses/GPL-2 ##END HEADER golden.section.search <- function(ax, bx, cx, f, niter = 25, f.extra = NA, tol = 1e-05, gridx = NA) { # check if an initial grid has been passed if so then do a # search for the minimum on this grid first. gridx <- sort(gridx) NG <- length(gridx) fgrid <- rep(NA, NG) if (!is.na(gridx[1])) { gridx <- sort(gridx) NG <- length(gridx) fgrid <- rep(NA, NG) for (k in 1:NG) { fgrid[k] <- f(gridx[k], f.extra) } # bail on search if objective function is an NA if (any(is.na(fgrid))) { warning("grid search has found some missing values in objective function") return(list(x = NA, fmin = NA, iter = 0, tol = tol, coarse.search = cbind(gridx, fgrid, deparse.level = 1))) } ind.bx <- which.min(fgrid) # if minimum is at grid boundary print warning and return if ((ind.bx == 1) | ind.bx == NG) { warning("grid search gives minimun at boundary") return(list(x = gridx[ind.bx], fmin = fgrid[ind.bx], iter = 0, tol = tol, coarse.search = cbind(gridx, fgrid, deparse.level = 1))) } # use grid results for initial values of golden section search ax <- gridx[ind.bx - 1] bx <- gridx[ind.bx] cx <- gridx[ind.bx + 1] } else { # if no grid search, sanity check on starting points f1 <- f(ax, f.extra) f2 <- f(bx, f.extra) f3 <- f(cx, f.extra) if ((f2 > f1) | (f2 > f3)) stop("starting values not convex") } r <- 0.61803399 con <- 1 - r x0 <- ax x3 <- cx if (abs(cx - bx) > abs(bx - ax)) { x1 <- bx x2 <- bx + con * (bx - ax) } else { x2 <- bx x1 <- bx - con * (bx - ax) } f1 <- f(x1, f.extra) f2 <- f(x2, f.extra) iter <- niter for (k in 1:niter) { #cat( x1,f1, x2,f2, fill=TRUE) if (f2 < f1) { x0 <- x1 x1 <- x2 x2 <- r * x1 + con * x3 f0 <- f1 f1 <- f2 f2 <- f(x2, f.extra) } else { x3 <- x2 x2 <- x1 x1 <- r * x2 + con * x0 f3 <- f2 f2 <- f1 f1 <- f(x1, f.extra) } if (abs(f2 - f1) < tol) { iter <- k break } } if (f1 < f2) { golden <- f1 xmin <- x1 } else { golden <- f2 xmin <- x2 } if (iter == niter) { warning("Maximum iterations reached") } list(x = xmin, fmin = golden, iter = iter, tol = tol, coarse.search = cbind(gridx, fgrid, deparse.level = 1)) } fields/R/color.scale.R0000644000176200001440000000500414275252303014252 0ustar liggesusers# # fields is a package for analysis of spatial data written for # the R software environment. # Copyright (C) 2022 Colorado School of Mines # 1500 Illinois St., Golden, CO 80401 # Contact: Douglas Nychka, douglasnychka@gmail.edu, # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with the R software environment if not, write to the Free Software # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA # or see http://www.r-project.org/Licenses/GPL-2 ##END HEADER color.scale <- function(z, col = tim.colors, NC=256, zlim = NULL, transparent.color = "white", eps = 1e-08) { # # converts real values to a color scale of NC values. # role of eps is to prevent values exactly at the end of the range from being # missed # # convert factor or character z to integers colFactor<- FALSE levelsZ<- NULL if( is.character(z)){ z<- as.factor( z) } if( is.factor( z)){ levelsZ<- levels(z) z<- as.integer(z) coFactor<-TRUE NC<- length( levelsZ) } if (is.null(zlim)) { zlim <- range(z, na.rm = TRUE) } z[(z < zlim[1]) | (z > zlim[2])] <- NA if( is.function(col)){ col<- col(NC) } NC <- length(col) span<- zlim[2]-zlim[1] # expand breaks slightly to include obs on the boundaries. breaks <- seq(zlim[1] - span*eps, zlim[2] + span*eps , length.out= NC + 1) # the magic of R ... icolor <- cut(c(z), breaks)@.Data # returned values is a vector of character hex strings encoding the colors. colorMap<- ifelse(is.na(icolor), transparent.color, col[icolor]) # add zlim and col table as attributes so one can add # a legend and know what one is doing. attr( colorMap,"zlim")<- zlim attr(colorMap,"col")<- col attr(colorMap,"levelsZ")<- levelsZ # potential hooks for colorBar functions colorMapInfo<- list( col=col, zlim=zlim) # .fieldsColorMapInfo <<- colorMapInfo return( colorMap) } fields/R/compactToMat.R0000644000176200001440000000371114275252303014444 0ustar liggesusers# # fields is a package for analysis of spatial data written for # the R software environment. # Copyright (C) 2022 Colorado School of Mines # 1500 Illinois St., Golden, CO 80401 # Contact: Douglas Nychka, douglasnychka@gmail.edu, # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with the R software environment if not, write to the Free Software # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA # or see http://www.r-project.org/Licenses/GPL-2 ##END HEADER compactToMat = function(compactMat, diagVal=0, lower.tri=FALSE, upper.tri=TRUE) { #compactMat: a symmetric matrix stored as a vector containing elements for the upper triangle #portion of the true matrix #diagVal: a number to put in the diagonal entries of the output matrix #lower.tri: if TRUE, fills in lower tringular portion of the matrix #upper.tri: if TRUE, fills in upper tringular portion of the matrix if( is(compactMat,"dist") ) { n <- attr(compactMat, "Size") } else { # (n^2 - n)/2 = length(compactMat) stop("input matrix is not compact or is not of class \"dist\"") #or if class is not dist but input matrix is still compact, use: #n = (1 + sqrt(1 + 8*length(compactMat)))/2 } return(.Call("compactToMatC", as.double(compactMat), as.integer(length(compactMat)), as.integer(n), as.double(diagVal), as.integer(lower.tri), as.integer(upper.tri), PACKAGE="fields")) } fields/R/yline.R0000644000176200001440000000205014275252303013164 0ustar liggesusers# # fields is a package for analysis of spatial data written for # the R software environment. # Copyright (C) 2022 Colorado School of Mines # 1500 Illinois St., Golden, CO 80401 # Contact: Douglas Nychka, douglasnychka@gmail.edu, # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with the R software environment if not, write to the Free Software # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA # or see http://www.r-project.org/Licenses/GPL-2 ##END HEADER "yline" <- function(y, ...) { abline(h = y, ...) } fields/R/QSreg.R0000644000176200001440000000670414275252302013076 0ustar liggesusers# # fields is a package for analysis of spatial data written for # the R software environment. # Copyright (C) 2022 Colorado School of Mines # 1500 Illinois St., Golden, CO 80401 # Contact: Douglas Nychka, douglasnychka@gmail.edu, # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with the R software environment if not, write to the Free Software # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA # or see http://www.r-project.org/Licenses/GPL-2 ##END HEADER QSreg <- function(x, Y, lambda=NA, f.start = NULL, psi.scale = NULL, C = 1, alpha = 0.5, Niterations = 100, tolerance = 0.001, verbose = FALSE) { # # if (is.null(f.start)) { f.start <- rep(median(Y), length(Y)) } scale.Y <- mad(Y - f.start, na.rm = TRUE) # if (is.null(psi.scale)) { psi.scale = scale.Y * 0.05 } # f.hat <- f.start # create Tps object to reuse for iterative fitting conv.flag <- FALSE conv.info <- rep(NA, Niterations) for (k in 1:Niterations) { Y.psuedo <- f.hat + C * psi.scale * qsreg.psi((Y - f.hat)/psi.scale, C = C, alpha = alpha) # find predicted for a fixed lambda or estimate a new value f.hat.new <- sreg(x, y = Y.psuedo, lambda=lambda)$fitted.values # convergence test test.rmse <- mean(abs(f.hat.new - f.hat))/mean(abs(f.hat)) conv.info[k] <- test.rmse if (verbose) { cat(k, test.rmse, fill = TRUE) } if (test.rmse <= tolerance) { conv.flag <- TRUE Number.iterations <- k break } f.hat <- f.hat.new } # One final complete fit at convergence. if (verbose) { if (conv.flag) { cat("Converged at tolerance", tolerance, "in", Number.iterations, "iterations", fill = TRUE) } else { cat("Exceeded maximum number of iterations", Niterations, fill = TRUE) } } # One final complete fit at convergence. f.hat <- f.hat.new Y.psuedo <- f.hat + C * psi.scale * qsreg.psi((Y - f.hat)/psi.scale, C = C, alpha = alpha) obj <- sreg(x, Y.psuedo, lambda=lambda) # CV residuals based on psuedo-data) # Use the linear approximation Y_k - f.cv_k = (Y_k- f_k)/( 1- A_kk) # f.cv_k = f_k/( 1- A_kk) - ( A_kk)Y_k/( 1- A_kk) # # Note: we find f.cv based on psuedo data but then consider its deviation # from the actual data # diag.A <- obj$diagA f.cv <- obj$fitted.values/(1 - diag.A) - diag.A * Y.psuedo/(1 - diag.A) # leave-one-out estimate of f.hat CV.psuedo <- mean(qsreg.sigma(Y - f.cv, alpha = alpha, C = psi.scale)) # add extra stuff to the Krig object. Qinfo <- list(yraw = Y, conv.info = conv.info, conv.flag = conv.flag, CV.psuedo = CV.psuedo, psi.scale = psi.scale, alpha = alpha) obj <- c(obj, list(Qinfo = Qinfo)) class(obj) <- "sreg" return(obj) } fields/R/multWendlandGrid.R0000644000176200001440000000412314275252303015313 0ustar liggesusers# # fields is a package for analysis of spatial data written for # the R software environment. # Copyright (C) 2022 Colorado School of Mines # 1500 Illinois St., Golden, CO 80401 # Contact: Douglas Nychka, douglasnychka@gmail.edu, # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with the R software environment if not, write to the Free Software # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA # or see http://www.r-project.org/Licenses/GPL-2 ##END HEADER # multWendlandGrid <- function( grid.list,center, delta, coef, xy= c(1,2) ){ xGrid<- grid.list[[xy[1]]] yGrid<- grid.list[[xy[2]]] mx<- length( xGrid) my<- length( yGrid) # transform centers to correspond to integer spacing of grid: # i.e. 1:nx and 1:ny dx<- (xGrid[mx] - xGrid[1]) / (mx-1) dy<- (yGrid[my] - yGrid[1]) / (my-1) centerScaled<- cbind( ((center[,1] - xGrid[1]) / dx) + 1, ((center[,2] - yGrid[1]) / dy) + 1 ) deltaX<- delta/dx deltaY<- delta/dy nc<- nrow( center) out<-.Fortran( "multWendlandG", PACKAGE="fields", mx=as.integer(mx), my=as.integer(my), deltaX= as.double( deltaX), deltaY= as.double( deltaY), nc= as.integer(nc), center=as.double(centerScaled), coef=as.double(coef), h= as.double(matrix(0,mx,my)), flag=as.integer(1) ) if( out$flag!= 0){ stop("error in multWendlandG FORTRAN")} return( out$h) } fields/R/xline.R0000644000176200001440000000205014275252303013163 0ustar liggesusers# # fields is a package for analysis of spatial data written for # the R software environment. # Copyright (C) 2022 Colorado School of Mines # 1500 Illinois St., Golden, CO 80401 # Contact: Douglas Nychka, douglasnychka@gmail.edu, # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with the R software environment if not, write to the Free Software # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA # or see http://www.r-project.org/Licenses/GPL-2 ##END HEADER "xline" <- function(x, ...) { abline(v = x, ...) } fields/R/imagePlotOLD.R0000644000176200001440000001207614305515431014333 0ustar liggesusers# # fields is a package for analysis of spatial data written for # the R software environment. # Copyright (C) 2022 Colorado School of Mines # 1500 Illinois St., Golden, CO 80401 # Contact: Douglas Nychka, douglasnychka@gmail.edu, # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with the R software environment if not, write to the Free Software # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA # or see http://www.r-project.org/Licenses/GPL-2 ##END HEADER # Thanks to S. Koehler and S. Woodhead # for comments on making this a better function # Thanks to Rodrigo Lustosa for adding the asp option. "imagePlot" <- function(..., add = FALSE, breaks= NULL, nlevel = 64, col = NULL, horizontal = FALSE, legend.shrink = 0.9, legend.width = 1.2, legend.mar = ifelse(horizontal, 3.1, 5.1), legend.lab = NULL, legend.line= 2, graphics.reset = FALSE, bigplot = NULL, smallplot = NULL, legend.only = FALSE, lab.breaks = NULL, axis.args = NULL, legend.args = NULL, legend.cex=1.0, midpoint = FALSE, border = NA, lwd = 1, lowerTriangle= FALSE, upperTriangle=FALSE, asp = NA, verbose=FALSE) { # save current graphics settings old.par <- par(no.readonly = TRUE) # set defaults for color scale # note this works differently than the image function. if( is.null(col)) { col<- tim.colors(nlevel)} else{ nlevel<- length( col) } # figure out zlim from passed arguments # also set the breaks for colors if they have not been passed, info <- imagePlotInfo(..., breaks=breaks, nlevel=nlevel) # breaks have been computed if not passed in the call breaks<- info$breaks if( verbose){ print(info) } if (add) { big.plot <- old.par$plt } if (legend.only) { graphics.reset <- TRUE } if (is.null(legend.mar)) { legend.mar <- ifelse(horizontal, 3.1, 5.1) } # figure out how to divide up the plotting real estate temp <- imageplot.setup( add = add, legend.shrink = legend.shrink, legend.width = legend.width, legend.mar = legend.mar, horizontal = horizontal, bigplot = bigplot, smallplot = smallplot) # bigplot has plotting region coordinates for image # smallplot has plotting coordinates for legend strip smallplot <- temp$smallplot bigplot <- temp$bigplot # draw the image in bigplot, just call the R base function # or poly.image for polygonal cells # note the logical switch # for poly.grid is parsed out of call from image.plot.info if (!legend.only) { if (!add) { par(plt = bigplot) } if (!info$poly.grid) { image(..., breaks=breaks, add = add, col = col, asp = asp) } else { poly.image(..., add = add,breaks=breaks, col = col, midpoint = midpoint, border = border, lwd.poly = lwd, asp = asp) } big.par <- par(no.readonly = TRUE) } ## ## check dimensions of smallplot if ((smallplot[2] < smallplot[1]) | (smallplot[4] < smallplot[3])) { par(old.par) stop("plot region too small to add legend\n") } # Following code draws the legend using the image function # and a one column image. colorBar( breaks = breaks, smallplot = smallplot, colorTable = col, horizontal = horizontal, lab.breaks = lab.breaks, axis.args = axis.args, legend.lab = legend.lab, legend.line = legend.line, legend.args = legend.args, legend.cex = legend.cex, lowerTriangle = lowerTriangle, upperTriangle = upperTriangle ) # clean up graphics device settings # reset to larger plot region with right user coordinates. mfg.save <- par()$mfg if (graphics.reset | add) { par(old.par) par(mfg = mfg.save, new = FALSE) invisible() } else { par(big.par) par(plt = big.par$plt, xpd = FALSE) par(mfg = mfg.save, new = FALSE) # Suggestion from Karline Soetaert # this is to reset margins to be based on the mar arguments # par(mar = par("mar")) or # par(mar = big.par$mar) # unfortunately this causes problems by allowing plotting outside of the # original plot region. invisible() } } fields/R/quilt.plot.R0000644000176200001440000000446714275252303014175 0ustar liggesusers# # fields is a package for analysis of spatial data written for # the R software environment. # Copyright (C) 2022 Colorado School of Mines # 1500 Illinois St., Golden, CO 80401 # Contact: Douglas Nychka, douglasnychka@gmail.edu, # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with the R software environment if not, write to the Free Software # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA # or see http://www.r-project.org/Licenses/GPL-2 ##END HEADER "quilt.plot" <- function(x, y, z, nx = 64, ny = 64, grid = NULL, add.legend = TRUE, add = FALSE, nlevel=64, col = tim.colors(nlevel), nrow = NULL, ncol = NULL, FUN=NULL, plot=TRUE, na.rm=FALSE, boundary.grid = FALSE, ...) { # # note that nrow and ncol refer to the resulting 'image format' for plotting. # here the x values are the rows and the y values are the columns # FUN = NULL means the weighted means are found for each grid cell if( !is.null(nrow)|!is.null(nrow)){ nx<- nrow ny<- ncol } x <- as.matrix(x) if (ncol(x) == 2) { z <- y } if (ncol(x) == 1) { x <- cbind(x, y) } if (ncol(x) == 3) { z <- x[, 3] x <- x[, 1:2] } # at this point x should be a 2 column matrix of x-y locations # z is a vector or one column matrix of the z values. #discretize data out.p <- as.image(z, x = x, nx = nx, ny = ny, grid = grid, FUN=FUN, na.rm=na.rm, boundary.grid = boundary.grid) # besides the image information this list has the indices that # map each z value to a grid box # # plot it if( plot){ if (add.legend) { image.plot(out.p, nlevel = nlevel, col = col, add = add, ...) } else { image(out.p, col = col, add = add, ...) } } invisible(out.p) } fields/R/print.Krig.R0000644000176200001440000000467014275252303014105 0ustar liggesusers# # fields is a package for analysis of spatial data written for # the R software environment. # Copyright (C) 2022 Colorado School of Mines # 1500 Illinois St., Golden, CO 80401 # Contact: Douglas Nychka, douglasnychka@gmail.edu, # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with the R software environment if not, write to the Free Software # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA # or see http://www.r-project.org/Licenses/GPL-2 ##END HEADER "print.Krig" <- function(x, digits = 4, ...) { c1 <- "Number of Observations:" c2 <- length(x$residuals) # # print out null space poly info only if 'm' is used if (!is.null(x$args.null$m)) { c1 <- c(c1, "Degree of polynomial null space ( base model):") c2 <- c(c2, x$m - 1) } c1 <- c(c1, "Number of parameters in the null space") c2 <- c(c2, x$nt) c1 <- c(c1, "Parameters for fixed spatial drift") c2 <- c(c2, sum(x$ind.drift)) c1 <- c(c1, "Model degrees of freedom:") c2 <- c(c2, format(round(x$eff.df, 1))) c1 <- c(c1, "Residual degrees of freedom:") c2 <- c(c2, format(round(length(x$residuals) - x$eff.df, 1))) c1 <- c(c1, "GCV estimate for tau:") c2 <- c(c2, format(signif(x$tauHat.GCV, digits))) c1 <- c(c1, "MLE for tau:") c2 <- c(c2, format(signif(x$tauHat.MLE, digits))) c1 <- c(c1, "MLE for sigma:") c2 <- c(c2, format(signif(x$sigma.MLE, digits))) c1 <- c(c1, "lambda") c2 <- c(c2, format(signif(x$lambda, 2))) c1 <- c(c1, "User supplied sigma") c2 <- c(c2, format(signif(x$sigma, digits))) c1 <- c(c1, "User supplied tau^2") c2 <- c(c2, format(signif(x$tau2, digits))) sum <- cbind(c1, c2) dimnames(sum) <- list(rep("", dim(sum)[1]), rep("", dim(sum)[2])) cat("Call:\n") dput(x$call) print(sum, quote = FALSE) cat("Summary of estimates: \n") print( x$lambda.est) # print( x$warningTable) invisible(x) } fields/R/makeMultiIndex.R0000644000176200001440000000430414275252303014770 0ustar liggesusers# # fields is a package for analysis of spatial data written for # the R software environment. # Copyright (C) 2022 Colorado School of Mines # 1500 Illinois St., Golden, CO 80401 # Contact: Douglas Nychka, douglasnychka@gmail.edu, # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with the R software environment if not, write to the Free Software # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA # or see http://www.r-project.org/Licenses/GPL-2 ##END HEADER makeMultiIndex<- function(M){ # M are L integers with product prodM # Will create a prodM by L matrix that is all combinations of (1:M[i]) for i =1,2, ...L # This is organized in the standard array ordering where the first column varies the fastest # for M = c( 3,2,4) # 24 rows bigIndex = 1,1,1 # 2,1,1 # 3,1,1 # 1,2,1 # 2,2,1 # 3,2,1 # etc # ending at # 2,2,4 # 3,2,4 L<- length( M) # qucik return for L =1 and 2 if( L ==1){ bigIndex<- cbind(1:M[1] ) } if( L==2){ bigIndex<- cbind( rep(1:M[1], M[2]), rep( 1:M[2], rep(M[1], M[2]) ) ) } if( L > 2){ prodM<- prod( M) bigIndex<-matrix( NA, prodM,L) for ( k in 1: L){ if( k ==1){ ML<- 1 } else{ ML<- prod( M[1: (k-1)] ) } if( k ==L){ MU<- 1} else{ MU<-prod( M[ (k+1) : L ] ) } gridTmp<- rep( 1:M[k], rep(ML, M[k]) ) bigIndex[,k]<- rep( gridTmp, MU) } } return( bigIndex ) } fields/R/print.summary.sreg.R0000644000176200001440000000514414275252303015642 0ustar liggesusers# # fields is a package for analysis of spatial data written for # the R software environment. # Copyright (C) 2022 Colorado School of Mines # 1500 Illinois St., Golden, CO 80401 # Contact: Douglas Nychka, douglasnychka@gmail.edu, # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with the R software environment if not, write to the Free Software # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA # or see http://www.r-project.org/Licenses/GPL-2 ##END HEADER "print.summary.sreg" <- function(x, ...) { digits <- x$digits c1 <- "Number of Observations:" c2 <- x$num.observation c1 <- c(c1, "Number of unique points:") c2 <- c(c2, x$num.uniq) c1 <- c(c1, "Eff. degrees of freedom for spline:") c2 <- c(c2, format(round(x$enp, 1))) c1 <- c(c1, "Residual degrees of freedom:") c2 <- c(c2, format(round(x$num.observation - x$enp, 1))) c1 <- c(c1, "GCV est. tau ") c2 <- c(c2, format(signif(x$tauHat.GCV, digits))) if (!is.na(x$tauHat.pure.error)) { c1 <- c(c1, "Pure error tau") c2 <- c(c2, format(signif(x$tauHat.pure.error, digits))) } c1 <- c(c1, "lambda ") c2 <- c(c2, signif(x$lambda, digits)) #\tc1 <- c(c1, 'Cost in GCV') #\tc2 <- c(c2, format(round(x$cost, 2))) #\tc1 <- c(c1, 'GCV Minimum') #\tc2 <- c(c2, format(signif(x$gcvmin, digits))) sum <- cbind(c1, c2) dimnames(sum) <- list(rep("", dim(sum)[1]), rep("", dim(sum)[2])) res.quantile <- x$res.quantile names(res.quantile) <- c("min", "1st Q", "median", "3rd Q", "max") ### ### ### cat("CALL:\n") dput(x$call) print(sum, quote = FALSE) cat("\n") cat("RESIDUAL SUMMARY:", fill = TRUE) print(signif(res.quantile, digits)) cat("\n") cat("DETAILS ON SMOOTHING PARAMETER:", fill = TRUE) cat(" Method used: ", x$method, " Cost: ", x$cost, fill = TRUE) #\tcat(' Stats on this choice of lambda', fill = TRUE) print(x$sum.gcv.lambda, digits = digits) cat("\n") cat(" Summary of estimates for lambda", fill = TRUE) print(x$lambda.est, digits = x$digits) invisible(x) } fields/R/ceiling2.R0000644000176200001440000000216014275252302013541 0ustar liggesusers# # fields is a package for analysis of spatial data written for # the R software environment. # Copyright (C) 2022 Colorado School of Mines # 1500 Illinois St., Golden, CO 80401 # Contact: Douglas Nychka, douglasnychka@gmail.edu, # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with the R software environment if not, write to the Free Software # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA # or see http://www.r-project.org/Licenses/GPL-2 ##END HEADER "ceiling2" <- function(m) { if (m < 1) return(NA) M <- 1 while (M < m) { M <- M * 2 } M } fields/R/matern.image.cov.R0000644000176200001440000000600514275252303015205 0ustar liggesusers# # fields is a package for analysis of spatial data written for # the R software environment. # Copyright (C) 2022 Colorado School of Mines # 1500 Illinois St., Golden, CO 80401 # Contact: Douglas Nychka, douglasnychka@gmail.edu, # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with the R software environment if not, write to the Free Software # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA # or see http://www.r-project.org/Licenses/GPL-2 ##END HEADER matern.image.cov <- function(ind1, ind2, Y, cov.obj = NULL, setup = FALSE, grid, M = NULL, N = NULL, aRange=1, smoothness=.5,theta=NULL ) { # theta argument has been depreciated. if( !is.null( theta)){ aRange<- theta } # if (is.null(cov.obj)) { dx <- grid$x[2] - grid$x[1] dy <- grid$y[2] - grid$y[1] m <- length(grid$x) n <- length(grid$y) if (is.null(M)) M <- ceiling2(2 * m) if (is.null(N)) N <- ceiling2(2 * n) # make sure M and N are even. # (not sure what it means if this is not the case!) if( M%%2 !=0) { M<- M+1} if( N%%2 !=0) { N<- N+1} # need to evaluate the covariance between the center of the grid and # every grid point do this using several simple steps for efficiency. xGrid<- (1:M) * dx - (dx * M)/2 yGrid<- (1:N) * dy - (dy * N)/2 # a matrix the same size as the grid that has the distance between every # grid point and the center point. bigDistance<- sqrt( matrix( xGrid^2, M,N, byrow=FALSE) + matrix( yGrid^2, M,N, byrow=TRUE) ) # this should make for a nice image plot of the covariance w/r to the center point # out<- Matern( bigDistance /aRange, smoothness=smoothness) temp <- matrix(0, nrow = M, ncol = N) temp[M/2, N/2] <- 1 wght <- fft(out)/(fft(temp) * M * N) cov.obj <- list(m = m, n = n, grid = grid, N = N, M = M, wght = wght, call = match.call()) if (setup) { return(cov.obj) } } temp <- matrix(0, nrow = cov.obj$M, ncol = cov.obj$N) if (missing(ind1)) { temp[1:cov.obj$m, 1:cov.obj$n] <- Y Re(fft(fft(temp) * cov.obj$wght, inverse = TRUE)[1:cov.obj$m, 1:cov.obj$n]) } else { if (missing(ind2)) { temp[ind1] <- Y } else { temp[ind2] <- Y } Re(fft(fft(temp) * cov.obj$wght, inverse = TRUE)[ind1]) } } fields/R/surface.family.R0000644000176200001440000000554214453562545014777 0ustar liggesusers# # fields is a package for analysis of spatial data written for # the R software environment. # Copyright (C) 2022 Colorado School of Mines # 1500 Illinois St., Golden, CO 80401 # Contact: Douglas Nychka, douglasnychka@gmail.edu, # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with the R software environment if not, write to the Free Software # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA # or see http://www.r-project.org/Licenses/GPL-2 ##END HEADER "surface.Krig" <- function(object, grid.list = NULL, extrap = FALSE, graphics.reset = NULL, xlab = NULL, ylab = NULL, main = NULL, zlab = NULL, zlim = NULL, levels = NULL, type = "C", nx = 80, ny = 80, col=viridisLite::viridis(256), ...) { ## modified so that you can give main, and ylab as arguments ## in ... and have them passed correctly out.p <- predictSurface(object, grid.list, extrap = extrap, nx = nx, ny = ny, drop.Z = TRUE) if (!is.null(ylab)) out.p$ylab <- ylab if (!is.null(xlab)) out.p$xlab <- xlab if (!is.null(zlab)) out.p$zlab <- zlab if (!is.null(main)) out.p$main <- main ## else ## out.p$main <- NULL plot.surface(out.p, type = type, graphics.reset = graphics.reset, levels = levels, zlim = zlim,col=col, ...) invisible() } "surface" <- function(object, ...) { UseMethod("surface") } "surface.default" <- function(object, col=viridis(256), ...) { plot.surface(object, col=col, ...) } "surface.mKrig" <- function(object, grid.list = NULL, extrap = FALSE, graphics.reset = NULL, xlab = NULL, ylab = NULL, main = NULL, zlab = NULL, zlim = NULL, levels = NULL, type = "C", nx = 80, ny = 80, col=viridisLite::viridis(256),...) { ## modified so that you can give main, and ylab as arguments ## in ... and have them passed correctly out.p <- predictSurface(object, grid.list, extrap = extrap, nx = nx, ny = ny, drop.Z = TRUE) if (!is.null(ylab)) out.p$ylab <- ylab if (!is.null(xlab)) out.p$xlab <- xlab if (!is.null(zlab)) out.p$zlab <- zlab if (!is.null(main)) out.p$main <- main ## else ## out.p$main <- NULL plot.surface(out.p, type = type, graphics.reset = graphics.reset, levels = levels, zlim = zlim, col=col, ...) invisible() } fields/R/minitri.R0000644000176200001440000001054214275252303013524 0ustar liggesusers# # fields is a package for analysis of spatial data written for # the R software environment. # Copyright (C) 2022 Colorado School of Mines # 1500 Illinois St., Golden, CO 80401 # Contact: Douglas Nychka, douglasnychka@gmail.edu, # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with the R software environment if not, write to the Free Software # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA # or see http://www.r-project.org/Licenses/GPL-2 ##END HEADER "minitri" <- structure(list(swim = c(13.77, 14.25, 12.4, 13.6, 11.23, 14.6, 15.63, 13.62, 17.03, 13.1, 16.5, 15.57, 14.28, 16.13, 14.98, 15.65, 14.55, 13.73, 14.67, 14.63, 12.53, 16.52, 14.45, 17.23, 15.77, 13.53, 17.38, 16.58, 16.97, 12.9, 15.48, 15.6, 16.43, 17.37, 15.65, 20.17, 16.57, 15.75, 18.32, 16.15, 18.77, 19.55, 17.05, 15.75, 17.47, 22.18, 12.78, 19.05, 17, 18.65, 18.38, 18.03, 18.08, 18.22, 21.3, 17.82, 16, 15.3, 19.8, 16.33, 14.9, 18.08, 17, 24.77, 17.03, 21.72, 14.77, 17.28, 19.88, 19.75, 18.17, 20.67, 17.6, 18.07, 20.53, 16.78, 18.42, 21.43, 25.35, 16.37, 18.88, 20.3, 21.93, 20, 19.42, 16.97, 15.25, 22.52, 16.8, 17.58, 20.45, 21.78, 17.92, 24.83, 20.38, 20.37, 28.35, 23.95, 25.15, 18.57, 19.95, 26.22, 22.08, 25.77, 23.7, 26.15, 18.05, 30.7, 29.88, 30.77), bike = c(39.72, 39, 42.2, 39.95, 41.72, 42.25, 43.77, 42.17, 40.63, 44.68, 43.63, 42.78, 41.7, 45.57, 42.83, 44.52, 43.9, 45.73, 43.05, 44.9, 48.07, 44.93, 47.87, 45.55, 46.1, 44.6, 45.72, 44.73, 46.85, 49.4, 47.43, 44.52, 43.67, 47.7, 48.57, 45.78, 47.35, 45.63, 46.47, 47.12, 49.62, 48.5, 54.4, 49.4, 48.77, 46.97, 49.92, 48.98, 50.57, 49.52, 52.58, 47.62, 50.05, 51.75, 50.68, 52.28, 48.57, 50.38, 46.2, 49.93, 47.7, 52.68, 50.28, 46.12, 53.17, 51.63, 58.42, 55.3, 50.68, 51.82, 51.93, 48.82, 51.87, 55.4, 55.17, 53.82, 50.23, 47.92, 50.98, 51.95, 53.47, 52.5, 53.98, 47.05, 58.92, 52.67, 52.1, 49.72, 61.33, 58.73, 58, 56.23, 58.95, 55.48, 61.03, 57.37, 54.68, 57.62, 58.52, 56.7, 63.82, 59.07, 66.03, 60.83, 62.37, 66.87, 75, 65.38, 68.25, 67.35), run = c(25.02, 25.68, 24.95, 27.65, 29.25, 26.83, 24.8, 28.73, 29, 28.1, 25.85, 29.4, 31.33, 26.2, 30.45, 29.32, 31.13, 30.48, 32.32, 30.62, 29.92, 30.12, 29.7, 29.25, 30.28, 34.07, 31.55, 33.5, 31.03, 32.72, 32.28, 35.1, 35.13, 30.48, 31.5, 30.37, 32.82, 35.8, 32.82, 34.67, 30.33, 30.95, 27.57, 34.08, 33.13, 30.57, 37.43, 32.12, 32.93, 32.4, 29.63, 35.08, 32.65, 30.98, 30.22, 32.12, 38.08, 37.23, 36.95, 36.72, 40.7, 32.87, 36.53, 33.72, 34.45, 31.47, 31.7, 33.03, 35.68, 34.88, 36.57, 37.27, 37.87, 34.32, 32.1, 37.33, 39.73, 39.07, 32.12, 40.52, 36.77, 36.57, 33.55, 42.55, 31.48, 40.8, 43.45, 39.03, 34.12, 37.12, 35.03, 36.45, 38.48, 36.25, 36.57, 40.9, 37.98, 37.98, 37.45, 45.9, 44.18, 45.02, 42.37, 45.38, 51.8, 45.88, 48.18, 51.8, 57.23, 57.35)), .Names = c("swim", "bike", "run"), row.names = c(" 1", " 2", " 3", " 4", " 5", " 6", " 7", " 8", " 9", " 10", " 11", " 12", " 13", " 14", " 15", " 16", " 17", " 18", " 19", " 20", " 21", " 22", " 23", " 24", " 25", " 26", " 27", " 28", " 29", " 30", " 31", " 32", " 33", " 34", " 35", " 36", " 37", " 38", " 39", " 40", " 41", " 42", " 43", " 44", " 45", " 46", " 47", " 48", " 49", " 50", " 51", " 52", " 53", " 54", " 55", " 56", " 59", " 60", " 61", " 62", " 64", " 65", " 66", " 68", " 69", " 70", " 71", " 72", " 73", " 74", " 75", " 76", " 77", " 78", " 79", " 80", " 81", " 82", " 83", " 84", " 85", " 86", " 87", " 88", " 89", " 90", " 91", " 92", " 93", " 96", " 97", " 98", "100", "102", "103", "104", "105", "106", "107", "108", "109", "110", "111", "112", "113", "114", "116", "117", "118", "119"), class = "data.frame") fields/R/summary.Krig.R0000644000176200001440000000451314275252303014442 0ustar liggesusers# # fields is a package for analysis of spatial data written for # the R software environment. # Copyright (C) 2022 Colorado School of Mines # 1500 Illinois St., Golden, CO 80401 # Contact: Douglas Nychka, douglasnychka@gmail.edu, # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with the R software environment if not, write to the Free Software # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA # or see http://www.r-project.org/Licenses/GPL-2 ##END HEADER "summary.Krig" <- function(object, digits = 4, ...) { x <- object # lambda est may not be available if lambda has been supplied by user. if (!is.na(x$lambda.est[1])) { l.est <- x$lambda.est } else { l.est <- NA } summary <- list(call = x$call, num.observation = length(x$residuals), enp = x$eff.df, nt = x$nt, df.drift = sum(x$ind.drift), res.quantile = quantile(x$residuals, seq(0, 1, 0.25)), tauHat.MLE = x$tauHat.MLE, tauHat.GCV = x$tauHat.GCV, sigmahat = x$sigmahat, m = x$m, lambda = x$lambda, cost = x$cost, sigma = x$sigma, tau2 = x$tau2, num.uniq = length(x$yM), knot.model = x$knot.model, np = x$np, method = x$method, lambda.est = l.est, tauHat.pure.error = x$tauHat.pure.error, args = x$args) class(summary) <- "summary.Krig" summary$covariance <- cor(x$fitted.values * sqrt(x$weights), (x$y) * sqrt(x$weights))^2 hold <- (sum((x$y - mean(x$y))^2) - sum(x$residuals^2))/(sum((x$y - mean(x$y))^2)) summary$adjr2 <- 1 - ((length(x$residuals) - 1)/(length(x$residuals) - x$eff.df)) * (1 - hold) summary$digits <- digits summary$cov.function <- as.character(x$cov.function.name) summary$correlation.model <- x$correlation.model summary$sum.gcv.lambda <- summaryGCV.Krig(x, x$lambda) summary } fields/R/splint.R0000644000176200001440000000663014275252303013365 0ustar liggesusers# # fields is a package for analysis of spatial data written for # the R software environment. # Copyright (C) 2022 Colorado School of Mines # 1500 Illinois St., Golden, CO 80401 # Contact: Douglas Nychka, douglasnychka@gmail.edu, # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with the R software environment if not, write to the Free Software # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA # or see http://www.r-project.org/Licenses/GPL-2 ##END HEADER "splint" <- function(x, y, xgrid, wt = NULL, derivative = 0, lam = 0, df = NA, lambda = NULL, nx=NULL, digits=8) { # # reform calling args if passed as a matrix or list if (is.matrix(x)) { if (ncol(x) > 1) { xgrid <- y y <- x[, 2] x <- x[, 1] } } if (is.list(x)) { xgrid <- y y <- x$y x <- x$x } #default values for weights # NOTE: weights do not matter when interpolating (lam==0) if (is.null(wt)) { wt <- rep(1, length( x)) } if (any(duplicated(x))) { warning("Duplicate x's using the average value") N<- length( x) out <- Krig.replicates( list( x=x, y=y, weights= wt, N=N, Z=NULL), verbose=TRUE ) x<- out$xM y<- out$yM wt<- out$weightsM #stop("duplicated x values, use sreg") } if ((derivative > 2) | (derivative < 0)) stop("derivative must be 0,1, or 2") if (length(x) != length(y)) stop("Lengths of x and y must match") n <- length(x) if( n > 5e4){ stop("splint not dimensioned for more than 50000 observations") } # find lambda from eff degrees of freedom if it is passed if (!is.na(df)) { if ((df < 2) | (df > n)) { stop("df out of range") } lam <- sreg.df.to.lambda(df, x, wt) } # use lambda is it is passed if (!is.null(lambda)) { lam <- lambda } igcv <- ifelse(lam == 0, 2, 0) # call to FORTRAN -- only return the evaluated points (ygrid). if( !is.null(nx)){ xgrid<- seq( min( x), max(x),,nx) } ygrid<- .Fortran("css",PACKAGE="fields", h = as.double(ifelse(igcv == 2, 1, log(lam))), as.integer(n), as.double(x), as.double(y), wt = as.double(1/sqrt(wt)), sy = as.double(rep(0, n)), as.double(1), as.double(1), as.double(1), as.integer(length(xgrid)), as.double(xgrid), ygrid = as.double(rep(0, length(xgrid))), job = as.integer(c(igcv, 3, 0)), as.integer(derivative), as.integer(0) )$ygrid if(!is.null(nx) ){ return(list( x=xgrid, y=ygrid)) } else{ return( ygrid) } } fields/R/qsreg.family.R0000644000176200001440000002744514275252303014464 0ustar liggesusers# # fields is a package for analysis of spatial data written for # the R software environment. # Copyright (C) 2022 Colorado School of Mines # 1500 Illinois St., Golden, CO 80401 # Contact: Douglas Nychka, douglasnychka@gmail.edu, # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with the R software environment if not, write to the Free Software # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA # or see http://www.r-project.org/Licenses/GPL-2 ##END HEADER "qsreg" <- function(x, y, lam = NA, maxit = 50, maxit.cv = 10, tol = 1e-07, offset = 0, sc = sqrt(var(y)) * 1e-05, alpha = 0.5, wt = rep(1, length(x)), cost = 1, nstep.cv = 80, hmin = NA, hmax = NA, trmin = 2 * 1.05, trmax = 0.95 * length(unique(x))) { # see the function QTps for a different computational implementation # and a code that works for more than 1-d. out <- list() class(out) <- c("qsreg") N <- length(y) out$N <- N xgrid <- sort(unique(x)) if (length(x) != length(y)) stop(" X and Y do not match") if (!is.na(lam[1])) hgrid <- log(lam) else { # find lambda grid if (is.na(hmin)) { hmin <- 0 for (k in 1:25) { b <- qsreg.trace(lam = as.double(exp(hmin)), x = x, y = y, wt = wt, cost = cost, maxit = maxit, tol = tol, sc = sc, alpha = alpha) if (b > trmax) { break } hmin <- hmin - 1 } } if (is.na(hmax)) { hmax <- 0 for (k in 1:25) { b <- qsreg.trace(lam = as.double(exp(hmax)), x = x, y = y, wt = wt, cost = cost, maxit = maxit, tol = tol, sc = sc, alpha = alpha) if (b < trmin) { break } hmax <- hmax + 1 } } h <- seq(hmin, hmax, , nstep.cv) lam <- exp(h) } # now loop through values for lam ( really log lam) b <- list() NL <- length(lam) NG <- length(xgrid) h <- log(lam) residuals <- matrix(NA, ncol = NL, nrow = N) diagA <- residuals cv.ps <- rep(0, NL) trace.ps <- rep(0, NL) cv <- rep(0, NL) predicted <- matrix(NA, ncol = NL, nrow = NG) trace <- rep(0, NL) converge <- rep(0, NL) wt.old <- wt for (k in 1:NL) { b <- .Fortran("rcss", PACKAGE="fields", h = as.double(h[k]), npoint = as.integer(N), x = as.double(x), y = as.double(y), wt = as.double(wt.old), sy = as.double(rep(0, N)), trace = as.double(0), diag = as.double(rep(0, N)), cv = as.double(0), ngrid = as.integer(NG), xg = as.double(xgrid), yg = as.double(rep(0, NG)), job = as.integer(c(3, 3, 0)), ideriv = as.integer(0), din = as.double(c(cost, offset, maxit, tol, sc, alpha)), dout = as.double(rep(0, 4)), ierr = as.integer(0)) residuals[, k] <- y - b$sy diagA[, k] <- b$diag cv[k] <- b$dout[4] trace[k] <- b$trace predicted[, k] <- b$yg converge[k] <- b$dout[1] wt.old <- b$wt } # second loop to find approx CV residuals based on pseudo values y.pseudo <- rep(NA, N) residuals.cv <- matrix(NA, ncol = NL, nrow = length(x)) for (k in 1:NL) { y.pseudo <- (sc) * qsreg.psi(residuals[, k], alpha = alpha, C = sc) + y - residuals[, k] # # call the robust spline but set the cutoff for the huber weight so big # it is essentially a LS spline this helps to match the lambda for robust spline # with a lambda for the LS one. # b <- .Fortran("rcss", PACKAGE="fields", h = as.double(h[k]), npoint = as.integer(N), x = as.double(x), y = as.double(y.pseudo), wt = as.double(wt), sy = as.double(rep(0, N)), trace = as.double(0), diag = as.double(rep(0, N)), cv = as.double(0), ngrid = as.integer(NG), xg = as.double(xgrid), yg = as.double(rep(0, NG)), job = as.integer(c(3, 3, 0)), ideriv = as.integer(0), din = as.double(c(cost, offset, maxit, tol, sqrt(var(y)) * 10, alpha)), dout = as.double(rep(0, 4)), ierr = as.integer(0)) # # CV residuals based on pseudo-data) # Use the linear approximation Y_k - f.cv_k = (Y_k- f_k)/( 1- A_kk) # f.cv_k = f_k/( 1- A_kk) - ( A_kk)Y_k/( 1- A_kk) # # Note: we find f.cv based on pseudo data but then consider its deviation # from the actual data # f.cv <- (b$sy/(1 - b$diag)) - b$diag * y.pseudo/(1 - b$diag) trace.ps[k] <- b$trace residuals.cv[, k] <- (y - f.cv) cv.ps[k] <- mean(qsreg.sigma(y - f.cv, alpha = alpha, C = sc)) } # # # cv.grid <- cbind(lam, trace, cv, converge, trace.ps, cv.ps) dimnames(cv.grid) <- list(NULL, c("lambda", "trace", "CV", "iterations", "trace.PS", "CV.PS")) # ind.cv <- (1:NL)[cv == min(cv)] ind.cv.ps <- (1:NL)[cv.ps == min(cv.ps)] out$call <- match.call() out$x <- x out$y <- y out$predicted <- list(x = xgrid, y = predicted) out$trace <- trace out$residuals.cv <- residuals.cv out$residuals <- residuals out$fitted.values <- y - residuals out$cv.grid <- cv.grid out$diagA <- diagA out$sc <- sc out$alpha <- alpha out$ind.cv <- ind.cv out$ind.cv.ps <- ind.cv.ps out } "qsreg.fit" <- function(x, y, lam, maxit = 50, maxit.cv = 10, tol = 1e-04, offset = 0, sc = sqrt(var(y)) * 1e-07, alpha = 0.5, wt = rep(1, length(x)), cost = 1) { N <- length(y) if (length(x) != length(y)) stop(" X and Y do not match") h <- log(lam) temp <- .Fortran("rcss", PACKAGE="fields", h = as.double(log(lam)), npoint = as.integer(N), x = as.double(x), y = as.double(y), wt = as.double(wt), sy = as.double(rep(0, N)), trace = as.double(0), diag = as.double(rep(0, N)), cv = as.double(0), ngrid = as.integer(0), xg = as.double(0), yg = as.double(0), job = as.integer(c(3, 0, 0)), ideriv = as.integer(0), din = as.double(c(cost, offset, maxit, tol, sc, alpha)), dout = as.double(rep(0, 4)), ierr = as.integer(0))$dout return(temp) } qsreg.psi <- function(r, alpha = 0.5, C = 1) { temp <- ifelse(r < 0, 2 * (1 - alpha) * r/C, 2 * alpha * r/C) temp <- ifelse(temp > 2 * alpha, 2 * alpha, temp) temp <- ifelse(temp < -2 * (1 - alpha), -2 * (1 - alpha), temp) temp } qsreg.sigma <- function(r, alpha = 0.5, C = 1) { temp <- ifelse(r < 0, ((1 - alpha) * r^2)/C, (alpha * r^2)/C) temp <- ifelse(r > C, 2 * alpha * r - alpha * C, temp) temp <- ifelse(r < -C, -2 * (1 - alpha) * r - (1 - alpha) * C, temp) temp } # next two functions included for just checking with new versions "qsreg.psi.OLD" <- function(r, alpha = 0.5, C = 1) { temp <- rep(NA, length(r)) r <- r/C temp <- r ind <- r > 1 temp[ind] <- 2 * alpha ind <- r < 1 & r > 0 temp[ind] <- (2 * alpha * r[ind]) ind <- r < -1 temp[ind] <- -2 * (1 - alpha) ind <- r > -1 & r < 0 temp[ind] <- 2 * (1 - alpha) * r[ind] temp } "qsreg.sigma.OLD" <- function(r, alpha = 0.5, C = 1) { temp <- rep(NA, length(r)) ind <- r > C temp[ind] <- 2 * alpha * r[ind] - alpha * C ind <- r < C & r > 0 temp[ind] <- (alpha * r[ind]^2)/C ind <- r < -C temp[ind] <- -2 * (1 - alpha) * r[ind] - (1 - alpha) * C ind <- r > -C & r < 0 temp[ind] <- ((1 - alpha) * r[ind]^2)/C temp } "qsreg.trace" <- function(x, y, lam, maxit = 50, maxit.cv = 10, tol = 1e-04, offset = 0, sc = sqrt(var(y)) * 1e-07, alpha = 0.5, wt = rep(1, length(x)), cost = 1) { N <- length(y) if (length(x) != length(y)) stop(" X and Y do not match") h <- log(lam) temp <- .Fortran("rcss", PACKAGE="fields", h = as.double(log(lam)), npoint = as.integer(N), x = as.double(x), y = as.double(y), wt = as.double(wt), sy = as.double(rep(0, N)), trace = as.double(0), diag = as.double(rep(0, N)), cv = as.double(0), ngrid = as.integer(0), xg = as.double(0), yg = as.double(0), job = as.integer(c(3, 0, 0)), ideriv = as.integer(0), din = as.double(c(cost, offset, maxit, tol, sc, alpha)), dout = as.double(rep(0, 4)), ierr = as.integer(0))$dout return(temp[3]) } "summary.qsreg" <- function(object, ...) { x <- object digits <- 4 c1 <- "Number of Observations:" c2 <- (x$N) c1 <- c(c1, "Effective degrees of freedom:") c2 <- c(c2, format(round(x$trace[x$ind.cv.ps], 1))) c1 <- c(c1, "Residual degrees of freedom:") c2 <- c(c2, format(round(x$N - x$trace[x$ind.cv.ps], 1))) c1 <- c(c1, "Log10(lambda)") c2 <- c(c2, format(round(log10(x$cv.grid[x$ind.cv.ps, 1]), 2))) sum <- cbind(c1, c2) dimnames(sum) <- list(rep("", dim(sum)[1]), rep("", dim(sum)[2])) cat("Call:\n") dput(x$call) print(sum, quote = FALSE) invisible(x) } "plot.qsreg" <- function(x, pch = "*", main = NA, ...) { out <- x old.par <- par("mfrow", "oma") on.exit(par(old.par)) set.panel(2, 2, relax = TRUE) plot(out$x, out$y, xlab = "X", ylab = "y", pch = pch) orderx <- order(out$x) temp <- out$fitted.values[, c(out$ind.cv, out$ind.cv.ps)] matlines(out$x[orderx], temp[orderx, ], lty = 1, col = c(1, 2)) ## # residual plot # matplot(out$x, qsreg.psi(out$residuals[, c(out$ind.cv, out$ind.cv.ps)], out$alpha, out$sc), col = c(1, 2), pch = "o", ylab = "Pseudo residuals", xlab = "X") yline(0) if (nrow(out$cv.grid) > 1) { ind <- out$cv.grid[, 3] < 1e+19 out$cv.grid <- out$cv.grid[ind, ] matplot(out$cv.grid[, 2], cbind(out$cv.grid[, 3], out$cv.grid[, 6]), xlab = "Effective number of parameters", ylab = "Log CV Rho function ", log = "y", type = "l", col = c(1, 2)) xline(out$cv.grid[out$ind.cv, 2], col = 1) xline(out$cv.grid[out$ind.cv.ps, 2], col = 2) title(" CV curves", cex = 0.5) } bplot(qsreg.psi(out$residuals[, c(out$ind.cv, out$ind.cv.ps)], out$alpha, out$sc), names = c("CV", "CV pseudo")) yline(0, col = 2) if (is.na(main)) mtext(deparse(out$call), cex = 1.3, outer = TRUE, line = -2) else mtext(main, cex = 1.3, outer = TRUE, line = -2) } "predict.qsreg" <- function(object, x, derivative = 0, model = object$ind.cv.ps, ...) { if (missing(x)) x <- object$x c(splint(object$predicted$x, object$predicted$y[, model], x, derivative = derivative)) } "print.qsreg" <- function(x, ...) { digits <- 4 c1 <- "Number of Observations:" c2 <- (x$N) c1 <- c(c1, "Effective degrees of freedom:") c2 <- c(c2, format(round(x$trace[x$ind.cv.ps], 1))) c1 <- c(c1, "Residual degrees of freedom:") c2 <- c(c2, format(round(x$N - x$trace[x$ind.cv.ps], 1))) c1 <- c(c1, "Log10(lambda) ") lambda <- x$cv.grid[, 1] c2 <- c(c2, format(round(log10(lambda[x$ind.cv.ps]), 2))) sum <- cbind(c1, c2) dimnames(sum) <- list(rep("", dim(sum)[1]), rep("", dim(sum)[2])) cat("Call:\n") dput(x$call) print(sum, quote = FALSE) invisible(x) } fields/R/mKrigCheckXY.R0000644000176200001440000000607014341535567014354 0ustar liggesusers# # fields is a package for analysis of spatial data written for # the R software environment. # Copyright (C) 2022 Colorado School of Mines # 1500 Illinois St., Golden, CO 80401 # Contact: Douglas Nychka, douglasnychka@gmail.edu, # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with the R software environment if not, write to the Free Software # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA # or see http://www.r-project.org/Licenses/GPL-2 ##END HEADER mKrigCheckXY <- function(x, y, weights, Z, ZCommon, na.rm) { # # check for missing values in y or X. # # save logical indicating where there are NA's # and check for NA's # ind <- is.na(y) if (any(ind) & !na.rm) { stop("Need to remove missing values or use: na.rm=TRUE in the call") } # # coerce x to be a matrix x <- as.matrix(x) # # coerce y to be a matrix # y <- as.matrix(y) # #default weights ( reciprocal variance of errors). # if (is.null(weights)) weights <- rep(1, nrow(y)) # # check that dimensions agree # if (nrow(y) != nrow(x)) { stop(" length of y and number of rows of x differ") } if (nrow(y) != length(weights)) { stop(" length of y and weights differ") } # if Z is not NULL coerce to be a matrix # and check # of rows if (!is.null(Z)) { if (!is.matrix(Z)) { Z <- as.matrix(Z) } if (nrow(y) != nrow(Z)) { stop(" number of rows of y and number of rows of Z differ") } } if (!is.null(ZCommon)) { if (!is.matrix(ZCommon)) { ZCommon <- as.matrix(ZCommon) } if ( nrow(y)*ncol(y) != nrow(ZCommon) ) { stop(" nrow(y)*ncol(y) and number of rows of ZCommon differ") } } # if NAs can be removed then remove them and warn the user if (na.rm) { ind <- is.na(y) if(all(ind)){ stop("Oops! All y values are missing!") } if (any(ind)) { y <- y[!ind] x <- as.matrix(x[!ind, ]) if (!is.null(Z)) { Z <- as.matrix(Z[!ind, ]) } if (!is.null(ZCommon)) { stop("can not reshape ZCommon with missing values") } weights <- weights[!ind] } } # # check for NA's in x matrix -- there should not be any ! if (any(c(is.na(x)))) { stop(" NA's in x matrix") } # # check for NA's in Z matrix if (!is.null(Z)) { if (any(c(is.na(Z)))) { stop(" NA's in Z matrix") } } # save x, weights and y w/o NAs N <- length(y) return(list(N = N, y = y, x = x, weights = weights, Z = Z, NA.ind = ind, nreps = ncol( y) ) ) } fields/R/predict.fastTps.R0000644000176200001440000000616514275252303015134 0ustar liggesusers# # fields is a package for analysis of spatial data written for # the R software environment. # Copyright (C) 2022 Colorado School of Mines # 1500 Illinois St., Golden, CO 80401 # Contact: Douglas Nychka, douglasnychka@gmail.edu, # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with the R software environment if not, write to the Free Software # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA # or see http://www.r-project.org/Licenses/GPL-2 ##END HEADER # predict.fastTps <- function(object, xnew = NULL, grid.list=NULL, ynew = NULL, derivative = 0, Z = NULL, drop.Z = FALSE, just.fixed = FALSE, xy=c(1,2), ...) { # the main reason to pass new args to the covariance is to increase # the temp space size for sparse multiplications # other optional arguments from mKrig are passed along in the # list object$args cov.args <- list(...) # predict using grid.list or as default observation locations if( !is.null(grid.list)){ xnew<- make.surface.grid( grid.list) } if( is.null(xnew) ) { xnew <- object$x } if (!is.null(ynew)) { coef.hold <- mKrig.coef(object, ynew) c.coef <- coef.hold$c.coef beta <- coef.hold$beta } else { c.coef <- object$c.coef beta <- object$beta } # fixed part of the model this a polynomial of degree m-1 # Tmatrix <- fields.mkpoly(xnew, m=object$m) # if (derivative == 0){ if (drop.Z | object$nZ == 0) { # just evaluate polynomial and not the Z covariate temp1 <- fields.mkpoly(xnew, m = object$m) %*% beta[object$ind.drift, ] } else{ if( is.null(Z)) { Z <- object$Tmatrix[, !object$ind.drift] } temp1 <- cbind(fields.mkpoly(xnew, m = object$m), Z) %*% beta } } else{ if (!drop.Z & object$nZ > 0) { stop("derivative not supported with Z covariate included") } temp1 <- fields.derivative.poly(xnew, m = object$m, beta[object$ind.drift, ]) } if (just.fixed) { return(temp1) } useFORTRAN<- (ncol(object$x)==2) & (object$args$k == 2) & (derivative==0) & (!is.null(grid.list)) # add nonparametric part. # call FORTRAN under a specific case if( useFORTRAN){ temp2<- multWendlandGrid(grid.list, object$knots, delta=object$args$aRange, c.coef, xy=xy) } else{ temp2 <- do.call(object$cov.function.name, c(object$args, list(x1 = xnew, x2 = object$knots, C = c.coef, derivative = derivative), cov.args)) } # add two parts together return((temp1 + temp2)) } fields/R/print.spatialProcessSummary.R0000644000176200001440000000571114342014247017556 0ustar liggesusers# # fields is a package for analysis of spatial data written for # the R software environment. # Copyright (C) 2022 Colorado School of Mines # 1500 Illinois St., Golden, CO 80401 # Contact: Douglas Nychka, douglasnychka@gmail.edu, # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with the R software environment if not, write to the Free Software # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA # or see http://www.r-project.org/Licenses/GPL-2 ##END HEADER print.spatialProcessSummary <- function(x, digits = 4, ...) { cat("CALL:\n") dput(x$call) cat("\n") cat(" SUMMARY OF MODEL FIT:\n") print(x$summaryTable, quote = FALSE) cat("\n") if( !is.na(x$fixedEffectsTable[1])){ cat(" ESTIMATED COEFFICIENTS FOR FIXED PART:", fill = TRUE) cat("\n") print(x$fixedEffectsTable, quote = FALSE) cat("\n") } if( !is.na(x$fixedEffectsTableCommon[1])){ cat(" ESTIMATED COEFFICIENTS FOR COMMON COVARIATES:", fill = TRUE) cat("\n") print(x$fixedEffectsTableCommon, quote = FALSE) cat("\n") } cat(" COVARIANCE MODEL:", x$cov.function, fill = TRUE) if (x$cov.function == "stationary.cov") { covName<- ifelse(is.null(x$args$Covariance), "Exponential", x$args$Covariance) cat(" Covariance function: ", covName, fill = TRUE) } if (!is.null(x$args)) { cat(" Non-default covariance arguments and their values ", fill = TRUE) nlist <- as.character(names(x$args)) NL <- length(nlist) for (k in 1:NL) { covItem<- x$args[[k]] cat( nlist[k], ":", fill = TRUE) if (object.size(covItem) > 10) { print(covItem) } else { cat("Too large to print value, size > 10 ...", fill = TRUE) } } } cat( "Nonzero entries in covariance matrix ", x$nonzero.entries, fill=TRUE) cat("\n") cat("SUMMARY FROM Max. Likelihood ESTIMATION:", fill=TRUE) if( !is.null( x$MLEInfo) ){ cat("Parameters found from optim: ", fill=TRUE ) print( x$MLESummary[x$MLEpars] ) cat("Approx. confidence intervals for MLE(s) ", fill=TRUE ) print( x$CITable) cat("\n") cat(" Note: MLEs for tau and sigma found analytically from lambda", fill=TRUE) cat("\n") } else{ cat(" lambda and range are supplied : ", fill=TRUE) cat(" tau and sigma analytically derived from lambda", fill=TRUE) cat("\n") } cat("Summary from estimation:", fill=TRUE) print( x$MLESummary) invisible(x) } fields/R/stationary.taper.cov.R0000644000176200001440000001325714275252303016154 0ustar liggesusers# # fields is a package for analysis of spatial data written for # the R software environment. # Copyright (C) 2022 Colorado School of Mines # 1500 Illinois St., Golden, CO 80401 # Contact: Douglas Nychka, douglasnychka@gmail.edu, # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with the R software environment if not, write to the Free Software # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA # or see http://www.r-project.org/Licenses/GPL-2 ##END HEADER "stationary.taper.cov" <- function(x1, x2=NULL, Covariance = "Exponential", Taper = "Wendland", Dist.args = NULL, Taper.args = NULL, aRange = 1, V = NULL, C = NA, marginal = FALSE, spam.format = TRUE, verbose = FALSE, theta=NULL, ...) { # theta argument has been deopreciated. if( !is.null( theta)){ aRange<- theta } # get covariance function arguments from call Cov.args <- list(...) # coerce x1 and x2 to matrices if (is.data.frame(x1)) x1 <- as.matrix(x1) if (!is.matrix(x1)) x1 <- matrix(c(x1), ncol = 1) if (is.null(x2)) x2 <- x1 if (is.data.frame(x2)) x2 <- as.matrix(x1) if (!is.matrix(x2)) x2 <- matrix(c(x2), ncol = 1) d <- ncol(x1) n1 <- nrow(x1) n2 <- nrow(x2) # Default taper arguments that are particular to the Wendland. # Make sure dimension argument is added. if (Taper == "Wendland") { if (is.null(Taper.args)) { Taper.args <- list(aRange = 1, k = 2, dimension = ncol(x1)) } if (is.null(Taper.args$dimension)) { Taper.args$dimension <- ncol(x1) } } # # Add in general defaults for taper arguments if not Wendland # aRange = 1.0 is the default range for the taper. if (is.null(Taper.args)) { Taper.args <- list(aRange = 1) } # # separate out a single scalar transformation and a # more complicated scaling and rotation. # this is done partly to have the use of great circle distance make sense # by applying the scaling _after_ finding the distance. # # flag for great circle distance great.circle <- ifelse(is.null(Dist.args$method), FALSE, Dist.args$method == "greatcircle") # check form of aRange if (length(aRange) > 1) { stop("aRange as a matrix has been depreciated, use the V argument") } # # following now treats V as a full matrix for scaling and rotation. # if (!is.null(V)) { # try to catch error of mixing great circle distance with a # linear scaling of coordinates. if (aRange != 1) { stop("can't specify both aRange and V!") } if (great.circle) { stop("Can not mix great circle distance\nwith general scaling (V argument or vecotr of aRange's)") } x1 <- x1 %*% t(solve(V)) x2 <- x2 %*% t(solve(V)) } # # locations are now scaled and rotated correctly # copy taper range if (great.circle) { # set the delta cutoff to be in scale of angular latitude. # figure out if scale is in miles or kilometers miles <- ifelse(is.null(Dist.args$miles), TRUE, Dist.args$miles) delta <- (180/pi) * Taper.args$aRange/ifelse(miles, 3963.34, 6378.388) } else { delta <- Taper.args$aRange } if (length(delta) > 1) { stop("taper range must be a scalar") } #NOTE tapering is applied to the _scaled_ locations. # now apply covariance function to pairwise distance matrix, or multiply # by C vector or just find marginal variance if (!marginal) { # find nearest neighbor distances based on taper threshhold. # This is hardwired to 'nearest.dist' function from spam. # note that delta is taken from the taper range not aRange or V sM <- do.call("nearest.dist", c(list(x1, x2, delta = delta, upper = NULL), Dist.args)) # sM@entries are the pairwise distances up to distance taper.range. # apply covariance and taper to these. # note rescaling by aRange and taper ranges. sM@entries <- do.call(Covariance, c(list(d = sM@entries/aRange), Cov.args)) * do.call(Taper, c(list(d = sM@entries), Taper.args)) # if verbose print out each component separately if (verbose) { print(sM@entries/aRange) print(do.call(Covariance, c(list(d = sM@entries/aRange), Cov.args))) print(do.call(Taper, c(list(d = sM@entries), Taper.args))) } if (is.na(C[1])) { # decide whether to return sM in spam sparse form or as a full matrix if (spam.format) { return(sM) } else { return(as.matrix(sM)) } } else { # other option is to sparse multiply cross covariance by C return(sM %*% C) } } else { # find marginal variance and return a vector. tau2 <- do.call(Covariance, c(list(d = 0), Cov.args)) * do.call(Taper, c(list(d = 0), Taper.args)) return(rep(tau2, nrow(x1))) } # should not get here! } fields/R/fitted.Krig.R0000644000176200001440000000206414275252303014223 0ustar liggesusers# # fields is a package for analysis of spatial data written for # the R software environment. # Copyright (C) 2022 Colorado School of Mines # 1500 Illinois St., Golden, CO 80401 # Contact: Douglas Nychka, douglasnychka@gmail.edu, # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with the R software environment if not, write to the Free Software # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA # or see http://www.r-project.org/Licenses/GPL-2 ##END HEADER fitted.Krig <- function(object, ...) { object$fitted.values } fields/R/predictSEUsingKrigA.R0000644000176200001440000001035114275252303015655 0ustar liggesusers# # fields is a package for analysis of spatial data written for # the R software environment. # Copyright (C) 2022 Colorado School of Mines # 1500 Illinois St., Golden, CO 80401 # Contact: Douglas Nychka, douglasnychka@gmail.edu, # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with the R software environment if not, write to the Free Software # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA # or see http://www.r-project.org/Licenses/GPL-2 ##END HEADER "predictSEUsingKrigA" <- function(object, x = NULL, cov = FALSE, verbose = FALSE, ...) { # # name of covariance function call.name <- object$cov.function.name # # default is to predict at data x's if (is.null(x)) { x <- object$x } x <- as.matrix(x) if (verbose) { print(x) } xraw <- x # transformations of x values used in Krig # NOTE knots are already scaled in Krig object xc <- object$transform$x.center xs <- object$transform$x.scale x <- scale(x, xc, xs) # # scaled unique observation locations. xM <- object$xM # find marginal variance before transforming x. if (!is.na(object$sd.obj[1])) { temp.sd <- c(predict(object$sd.obj, xraw)) } else { temp.sd <- 1 } # Default is to use parameters in best.model lambda <- object$best.model[1] sigma <- object$best.model[3] tau2 <- object$best.model[2] nx <- nrow(xM) wght.vec <- t(Krig.Amatrix(object, xraw, lambda, ...)) if (verbose) { cat("wght.vector", fill = TRUE) print(wght.vec) } #var( f0 - yhat)= var( f0) - cov( f0,yhat) - cov( yhat, f0) + cov( yhat) # = temp0 - temp1 - t( temp1) + temp2 # # if off diagonal weight matrix is passed then # find inverse covariance matrix # otherwise just create this quickly from diagonal weights # Wi <- Krig.make.Wi(object)$Wi # find covariance of data if (object$nondiag.W) { Cov.y <- sigma * do.call(call.name, c(object$args, list(x1 = xM, x2 = xM))) + tau2 * Wi } else { # this is one case where keeping diagonal # matrix as a vector will not work. Cov.y <- sigma * do.call(call.name, c(object$args, list(x1 = xM, x2 = xM))) + tau2 * diag(Wi) } if (!cov) { # find diagonal elements of covariance matrix # now find the three terms. # note the use of an element by element multiply to only get the # diagonal elements of the full # prediction covariance matrix. # temp1 <- sigma * colSums(wght.vec * do.call(call.name, c(object$args, list(x1 = xM, x2 = x)))) temp2 <- colSums(wght.vec * (Cov.y %*% wght.vec)) # # find marginal variances -- trival in the stationary case! # Note that for the case of the general covariances # as radial basis functions (RBFs) temp0 should be zero. # Positivity results from the generalized divided difference # properties of RBFs. temp0 <- sigma * do.call(call.name, c(object$args, list(x1 = x, marginal = TRUE))) # temp <- temp0 - 2 * temp1 + temp2 # return(sqrt(temp * temp.sd^2)) } else { # # find full covariance matrix # temp1 <- sigma * t(wght.vec) %*% do.call(call.name, c(object$args, list(x1 = xM, x2 = x))) # temp2 <- t(wght.vec) %*% Cov.y %*% wght.vec # temp0 <- sigma * do.call(call.name, c(object$args, list(x1 = x, x2 = x))) # temp <- temp0 - t(temp1) - temp1 + temp2 temp <- t(t(temp) * temp.sd) * temp.sd # return(temp) } } fields/R/plot.spatialProcess.R0000644000176200001440000000715014275252303016023 0ustar liggesusers# # fields is a package for analysis of spatial data written for # the R software environment. # Copyright (C) 2022 Colorado School of Mines # 1500 Illinois St., Golden, CO 80401 # Contact: Douglas Nychka, douglasnychka@gmail.edu, # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with the R software environment if not, write to the Free Software # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA # or see http://www.r-project.org/Licenses/GPL-2 ##END HEADER "plot.spatialProcess" <- function(x, digits = 4, which = 1:4, ...) { out <- x ########### plot 1 predicted vs. residua values fitted.values <- predict(out) if (any(which == 1)) { #temp <- summary(out) plot(fitted.values, out$y, ylab = "Y", xlab = " predicted values", bty = "n", ...) abline(0, 1, col="red") hold <- par("usr") title("Observations by predicted values") } ##################### plot 2 residual plot tauMLE<- out$summary["tau"] std.residuals <- (out$residuals * sqrt(out$weights))/tauMLE if (any(which == 2)) { plot(fitted.values, std.residuals, ylab = "(STD) residuals", xlab = " predicted values", bty = "n", ...) yline(0) } ################### plot 3 profile over lambda profileLambda<- !is.null( out$profileSummaryLambda) if (any(which == 3)& profileLambda ) { summary<- out$profileSummaryLambda mar.old<- par()$mar par( mar= mar.old + c(0,0,0,2) ) plot(summary$lambda, summary$lnProfileLike.FULL, xlab = "lambda", ylab ="log Profile Likelihood(lambda)", type = "p", log="x", pch=16,cex=.5, ...) splineFit <- splint(log(summary$lambda), summary$lnProfileLike.FULL, nx = 500) lines(exp(splineFit$x),splineFit$y, lwd = 2, col = "red") xline( out$lambda.MLE ) usr.save <- par()$usr RGCV<-range( summary[,"GCV" ] ) # 8% expansion of scale delta<- (RGCV[2]- RGCV[1])* .08 usr.save[3:4]<- c( RGCV[1] -delta, RGCV[2]+ delta) par( usr= usr.save, ylog=FALSE) points(summary$lambda, summary$GCV, lty=2, lwd=2, col="blue") axis( side=4, col="blue") mtext( side=4, line=2, "GCV function",cex=.75, col="blue") title("Profile likelihood over lambda", cex = 0.6) par( mar=mar.old) } #################### plot 4 profile over aRange (range) profileARange<- !is.null(out$profileSummaryARange) if ( any(which == 4) & profileARange ) { summary<- out$profileSummaryARange plot(summary$aRange, summary$lnProfileLike.FULL, pch=16, xlab="aRange (range parameter)", ylab="log Profile Likelihood (aRange)") title("Profile likelihood for aRange \n (range parameter)") xline( out$aRange.MLE, lwd=2, col="grey40") # xline( out$aRange.CI, lwd=4, col="grey70", lty=2) splineFit <- splint(summary$aRange, summary$lnProfileLike.FULL, nx = 500) lines(splineFit, lwd = 2, col = "red") } } fields/R/rat.diet.R0000644000176200001440000000415014275252303013561 0ustar liggesusers# # fields is a package for analysis of spatial data written for # the R software environment. # Copyright (C) 2022 Colorado School of Mines # 1500 Illinois St., Golden, CO 80401 # Contact: Douglas Nychka, douglasnychka@gmail.edu, # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with the R software environment if not, write to the Free Software # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA # or see http://www.r-project.org/Licenses/GPL-2 ##END HEADER "rat.diet" <- structure(list(t = c(0, 1, 3, 7, 8, 10, 14, 15, 17, 21, 22, 24, 28, 29, 31, 35, 36, 38, 42, 43, 45, 49, 50, 52, 56, 57, 59, 63, 64, 70, 73, 77, 80, 84, 87, 91, 94, 98, 105), con = c(20.5, 19.399, 22.25, 17.949, 19.899, 21.449, 16.899, 21.5, 22.8, 24.699, 26.2, 28.5, 24.35, 24.399, 26.6, 26.2, 26.649, 29.25, 27.55, 29.6, 24.899, 27.6, 28.1, 27.85, 26.899, 27.8, 30.25, 27.6, 27.449, 27.199, 27.8, 28.199, 28, 27.3, 27.899, 28.699, 27.6, 28.6, 27.5), trt = c(21.3, 16.35, 19.25, 16.6, 14.75, 18.149, 14.649, 16.7, 15.05, 15.5, 13.949, 16.949, 15.6, 14.699, 14.15, 14.899, 12.449, 14.85, 16.75, 14.3, 16, 16.85, 15.65, 17.149, 18.05, 15.699, 18.25, 18.149, 16.149, 16.899, 18.95, 22, 23.6, 23.75, 27.149, 28.449, 25.85, 29.7, 29.449)), .Names = c("t", "con", "trt"), class = "data.frame", row.names = c("1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15", "16", "17", "18", "19", "20", "21", "22", "23", "24", "25", "26", "27", "28", "29", "30", "31", "32", "33", "34", "35", "36", "37", "38", "39")) fields/R/profile.R0000644000176200001440000000213014275252303013503 0ustar liggesusers# # fields is a package for analysis of spatial data written for # the R software environment. # Copyright (C) 2022 Colorado School of Mines # 1500 Illinois St., Golden, CO 80401 # Contact: Douglas Nychka, douglasnychka@gmail.edu, # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with the R software environment if not, write to the Free Software # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA # or see http://www.r-project.org/Licenses/GPL-2 ##END HEADER ".onAttach" <- function (lib, pkg) { packageStartupMessage(" Try help(fields) to get started.") } fields/R/summaryGCV.sreg.R0000644000176200001440000000333714275252303015051 0ustar liggesusers# # fields is a package for analysis of spatial data written for # the R software environment. # Copyright (C) 2022 Colorado School of Mines # 1500 Illinois St., Golden, CO 80401 # Contact: Douglas Nychka, douglasnychka@gmail.edu, # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with the R software environment if not, write to the Free Software # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA # or see http://www.r-project.org/Licenses/GPL-2 ##END HEADER "summaryGCV.sreg" <- function(object, lambda, cost = 1, nstep.cv = 20, offset = 0, verbose = TRUE, ...) { out <- object tauHat.pure.error <- out$tauHat.pure.error pure.ss <- out$pure.ss nt <- 2 np <- out$np N <- out$N out$cost <- cost out$offset <- offset lambda.est <- rep(NA, 6) names(lambda.est) <- c("lambda", "trA", "GCV", "GCV.one", "GCV.model", "tauHat") # # fill in stuff for this lambda lambda.est[1] <- lambda temp <- sreg.fit(lambda, out) lambda.est[2] <- temp$trace lambda.est[3] <- temp$gcv lambda.est[4] <- temp$gcv.one if (!is.na(tauHat.pure.error)) { lambda.est[5] <- temp$gcv.model } lambda.est[6] <- temp$tauHat lambda.est } fields/R/simLocal.spatialProcess.R0000644000176200001440000001734114275252303016613 0ustar liggesusers# # fields is a package for analysis of spatial data written for # the R software environment. # Copyright (C) 2022 Colorado School of Mines # 1500 Illinois St., Golden, CO 80401 # Contact: Douglas Nychka, douglasnychka@gmail.edu, # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with the R software environment if not, write to the Free Software # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA # or see http://www.r-project.org/Licenses/GPL-2 ##END HEADER "simLocal.spatialProcess" <- function(mKrigObject, predictionGridList = NULL, simulationGridList = NULL, gridRefinement = 1, np = 2, M = 1, nx = 80, ny = 80, verbose = FALSE, delta = NULL, giveWarnings=TRUE, fast = FALSE, NNSize = 5, ...) # # NOTE throughout $x is first dimension of the grid in a gridList but also # $x in mKrig object is the _matrix_ of locations # { nObs<- nrow( mKrigObject$x) sDimension<- ncol(mKrigObject$x) if ( sDimension > 2) { stop("conditional simulation only implemented for 1 and 2 dimensions") } if( sDimension == 1 & fast ){ stop("fast prediction not implemented in 1 D") } # create prediction set of points based on what is passed # and if the grid is not specified if (is.null(predictionGridList)) { # these adjustments insure there are enough grid # points beyond the range of the locations. # Put xr[1] in the middle of the npth grid box # and xr[2] in to the nx - np predictionGridList<- makePredictionGridList( mKrigObject=mKrigObject, nx=nx, ny=ny, np=np ) } nx <- length(predictionGridList$x) ny <- ifelse(sDimension>=2, length(predictionGridList$y) ,1 ) # # check that predictionGrid is equally spaced # this is needed because of the fast simulation algorithm checkPredictGrid( predictionGridList) # # if (is.null(simulationGridList)) { simulationGridList<- makeSimulationGrid( predictionGridList, gridRefinement) } # # # # # round off the grids so that they match to 8 digits # # that way prediction grid is precisely a subset of # # simulation grid predictionGridList$x<- signif(predictionGridList$x, 8) simulationGridList$x<- signif(simulationGridList$x, 8) if( sDimension ==2){ predictionGridList$y<- signif(predictionGridList$y, 8) simulationGridList$y<- signif(simulationGridList$y, 8) } indexSubset<- list( x=match(predictionGridList$x, simulationGridList$x)) # # shortcut to avoid if statement for predicted in for # # loop # indexSubset$y = rep(1, length( indexSubset$x) ) if( sDimension ==2){ indexSubset$y=match(predictionGridList$y, simulationGridList$y) } else{ indexSubset$y=1 } # # core covariance parameters from spatial model tau <- mKrigObject$summary["tau"] sigma2 <- mKrigObject$summary["sigma2"] aRange<- mKrigObject$summary["aRange"] Covariance <- mKrigObject$args$Covariance # wipe out some extraneous components that are not used by the Covariance # function. covArgs0 <- mKrigObject$args covArgs0$Covariance<- NULL covArgs0$distMat <- NULL covArgs0$onlyUpper<- NULL covArgs0$aRange<- NULL # # set up various arrays for reuse during the simulation nObs <- nrow(mKrigObject$x) # timeCESetup<- system.time( # set up object for simulating on a grid using circulant embedding CEObject<- circulantEmbeddingSetup(simulationGridList, cov.function = mKrigObject$cov.function, cov.args = mKrigObject$args, delta = delta ) )[3] # if (verbose) { cat("dim of full circulant matrix ", CEObject$M, fill = TRUE) } # # weights crucial to fast off grid simulation # timeOffGridSetup <- system.time( offGridObject <- offGridWeights( mKrigObject$x, simulationGridList, mKrigObject, np = np, giveWarnings = giveWarnings ) )[3] # # find conditional mean field from initial fit hHat <- predictSurface(mKrigObject, gridList = predictionGridList, fast=fast, NNSize= NNSize, ...)$z sdNugget<- tau* sqrt(1/mKrigObject$weights) # # setup output array to hold ensemble # in 1D case ny=1 # out <- array(NA, c( nx, ny, M)) t1<-t2<- t3<- rep( NA, M) ########################################################################################## ### begin the big loop ########################################################################################## for (k in 1:M) { if( k%%10 ==0 ){ cat(k, " ") } # simulate full field t1[k]<- system.time( hTrue<- as.matrix(sqrt(sigma2) * circulantEmbedding(CEObject)) )[3] # NOTE: fixed part of model (null space) does not need to be simulated # because the estimator is unbiased for this part. # the variability is still captured because the fixed part # is still estimated as part of the predict step below # t2[k]<- system.time( hData <- offGridObject$B%*%c(hTrue) + (offGridObject$SE)%*%rnorm(nObs) )[3] ySynthetic <- hData + sdNugget*rnorm(nObs) # # predict at grid using these data # and subtract from synthetic 'true' value # t3[k]<-system.time( spatialError <- predictSurface.mKrig(mKrigObject, gridList = predictionGridList, ynew = ySynthetic, fast=fast, NNSize= NNSize, giveWarnings = FALSE, ...)$z )[3] # add the error to the actual estimate (conditional mean) # subset hTrue to the prediction grid # note for 1D $y is 1. out[,, k] <- hHat + (spatialError - hTrue[indexSubset$x,indexSubset$y]) } cat(" ", fill=TRUE) return(list(x = predictionGridList$x, y = predictionGridList$y, z = out, hHat= hHat, timing=c( CESetup=timeCESetup, OffSetup=timeOffGridSetup, CE = median(t1), OffGrid = median(t2), mKrig = median(t3) ), gridRefinement=gridRefinement, M= CEObject$M, #simulationGridList= simulationGridList, timingFull = cbind( t1, t2,t3), call = match.call()) ) } fields/R/addMarginsGridList.R0000644000176200001440000000567114275252302015572 0ustar liggesusers# # fields is a package for analysis of spatial data written for # the R software environment. # Copyright (C) 2022 Colorado School of Mines # 1500 Illinois St., Golden, CO 80401 # Contact: Douglas Nychka, douglasnychka@gmail.edu, # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with the R software environment if not, write to the Free Software # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA # or see http://www.r-project.org/Licenses/GPL-2 ##END HEADER addMarginsGridList<- function( xObs, gridList, NNSize){ np<- NNSize # ranges and sizes for the inoput grid and the obs xMin<- min(xObs[,1]) xMax<- max(xObs[,1]) yMin<- min(xObs[,2]) yMax<- max(xObs[,2]) gridXMin<- gridList$x[1] gridYMin<- gridList$y[1] dx<- gridList$x[2] - gridList$x[1] nx<- length( gridList$x) dy<- gridList$y[2] - gridList$y[1] ny<- length( gridList$y) #### x grid block ind1<- floor( (xMin - gridXMin)/dx) ind2<- ceiling( (xMax - gridXMin)/dx) if( (ind1 < 0)| (ind2 > nx) ) { stop("locations outside of x grid" ) } indRangeX<- c( min( ind1 - np , 0), max( ind2 + np +1 ,nx )) xGrid<- (indRangeX[1]:(indRangeX[2] - 1)) *dx + gridXMin ind1<- floor( (yMin - gridYMin)/dy) ind2<- ceiling( (yMax - gridYMin)/dy) if( (ind1 < 0)| (ind2 > ny) ) { stop("locations outside of y grid" ) } #### y grid block indRangeY<- c( min( ind1 - np , 0), max( ind2 + np +1 , ny)) yGrid<- (indRangeY[1]:(indRangeY[2] - 1)) *dy + gridYMin # new gridList contains the orginal grid # up to round off based on integer steps in dx and dy and extends # it so that # there are np grid points beyond the min and max ranges for # the original ranges. gridListNew<- list( x = xGrid, y = yGrid) # these indices are used to locate the original grid as a subset of the larger # one # the strange coding is due to the fact that the original grid and the larger one # may differ at the level of roundoff error. indX<- c( which.min( abs(gridList$x[1] - gridListNew$x)), which.min( abs(gridList$x[nx] - gridListNew$x)) ) indY<- c( which.min( abs(gridList$y[1] - gridListNew$y)), which.min( abs(gridList$y[ny] - gridListNew$y)) ) return( list(gridListNew = gridListNew, gridList = gridList, indX= indX, indY= indY, np=np ) ) } #fields/R/plot.sreg.R0000644000176200001440000000477214275252303013776 0ustar liggesusers# # fields is a package for analysis of spatial data written for # the R software environment. # Copyright (C) 2022 Colorado School of Mines # 1500 Illinois St., Golden, CO 80401 # Contact: Douglas Nychka, douglasnychka@gmail.edu, # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with the R software environment if not, write to the Free Software # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA # or see http://www.r-project.org/Licenses/GPL-2 ##END HEADER "plot.sreg" <- function(x, digits = 4, which = 1:4, ...) { out <- x if (any(which == 1)) { plot(out$x, out$y, ylab = "predicted", xlab = " X", bty = "n", ...) matlines(out$predicted$x, out$predicted$y, lty = 1) } if (any(which == 2) & length(out$lambda) == 1) { plot(out$fitted.values, out$residuals, ylab = "residuals", xlab = " predicted values", bty = "n", ...) yline(0) } if (any(which == 3)) { if (nrow(out$gcv.grid) > 1) { # trim off + infinity due to pole in the denominator of GCV function #with cost ind <- out$gcv.grid[, 3] < 1e+19 out$gcv.grid <- out$gcv.grid[ind, ] yr <- range(unlist(out$gcv.grid[, 3:5]), na.rm = TRUE) plot(out$gcv.grid[, 2], out$gcv.grid[, 3], xlab = "Eff. parameters", ylab = " GCV function", bty = "n", ylim = yr, log = "y", ...) lines(out$gcv.grid[, 2], out$gcv.grid[, 4], lty = 2) lines(out$gcv.grid[, 2], out$gcv.grid[, 5], lty = 1) xline(out$eff.df) title("GCV-points , solid- GCV model,\ndashed- GCV one", cex = 0.6) } } if (any(which == 4)) { if (length(out$lambda) == 1) { hist(out$residuals, xlab = "Residuals", main = "") } else { bplot(out$residuals, names = format(round(out$trace, 1)), xlab = "eff df") title("Residuals") } } } fields/R/exp.earth.cov.R0000644000176200001440000000226014275252303014533 0ustar liggesusers# # fields is a package for analysis of spatial data written for # the R software environment. # Copyright (C) 2022 Colorado School of Mines # 1500 Illinois St., Golden, CO 80401 # Contact: Douglas Nychka, douglasnychka@gmail.edu, # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with the R software environment if not, write to the Free Software # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA # or see http://www.r-project.org/Licenses/GPL-2 ##END HEADER "Exp.earth.cov" <- function(x1, x2, aRange = 1, theta=NULL) { # theta argument has been deopreciated. if( !is.null( theta)){ aRange<- theta } exp(-rdist.earth(x1, x2)/aRange) } fields/R/fields.derivative.poly.R0000644000176200001440000000320414275252303016437 0ustar liggesusers# # fields is a package for analysis of spatial data written for # the R software environment. # Copyright (C) 2022 Colorado School of Mines # 1500 Illinois St., Golden, CO 80401 # Contact: Douglas Nychka, douglasnychka@gmail.edu, # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with the R software environment if not, write to the Free Software # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA # or see http://www.r-project.org/Licenses/GPL-2 ##END HEADER fields.derivative.poly <- function(x, m, dcoef) { # dimension of x locations # goal is find partial derivative matrix d <- ncol(x) out <- fields.mkpoly(rbind(x[1, ]), m) ptab <- attr(out, "ptab") if (nrow(ptab) != length(dcoef)) { stop(" rows of ptab not equal to length of dcoef") } hold <- matrix(NA, ncol = d, nrow = nrow(x)) for (k in 1:d) { nonzero <- ptab[, k] != 0 ptemp <- matrix(ptab[nonzero, ], ncol = d) dtemp <- dcoef[nonzero] dtemp <- dtemp * ptemp[, k] ptemp[, k] <- ptemp[, k] - 1 hold[, k] <- fields.evlpoly2(x, dtemp, ptemp) } return(hold) } fields/R/Matern.parameters.R0000644000176200001440000000337614275252302015447 0ustar liggesusers# # fields is a package for analysis of spatial data written for # the R software environment. # Copyright (C) 2022 Colorado School of Mines # 1500 Illinois St., Golden, CO 80401 # Contact: Douglas Nychka, douglasnychka@gmail.edu, # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with the R software environment if not, write to the Free Software # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA # or see http://www.r-project.org/Licenses/GPL-2 ##END HEADER Matern.cor.to.range <- function(d, nu, cor.target = 0.5, guess = NULL, ...) { # define local function for root finding # ftemp <- function(aRange, f.extra) { Matern(f.extra$d/aRange, nu = f.extra$nu) - f.extra$cor.target } # inital guess is exponential if (is.null(guess)) { guess[1] <- guess[2] <- -d/log(cor.target) } # extra info for function f.extra = list(d = d, nu = nu, cor.target = cor.target) # find guesses that are above and below while (ftemp(guess[2], f.extra) < 0) { guess[2] <- guess[2] * 2 } while (ftemp(guess[1], f.extra) > 0) { guess[1] <- guess[1]/2 } temp <- bisection.search(guess[1], guess[2], f = ftemp, f.extra = f.extra, ...) return(temp$x) } fields/R/supportsArg.R0000644000176200001440000000234414275252303014403 0ustar liggesusers# # fields is a package for analysis of spatial data written for # the R software environment. # Copyright (C) 2022 Colorado School of Mines # 1500 Illinois St., Golden, CO 80401 # Contact: Douglas Nychka, douglasnychka@gmail.edu, # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with the R software environment if not, write to the Free Software # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA # or see http://www.r-project.org/Licenses/GPL-2 ##END HEADER supportsArg = function(fun=stationary.cov, arg) { if(is.null(fun)) { #set fun to the default covariance function if not specified fun = stationary.cov } argNames = names(as.list(args(fun))) return(any(argNames == arg)) } fields/R/add.image.R0000644000176200001440000000355114275252302013663 0ustar liggesusers# # fields is a package for analysis of spatial data written for # the R software environment. # Copyright (C) 2022 Colorado School of Mines # 1500 Illinois St., Golden, CO 80401 # Contact: Douglas Nychka, douglasnychka@gmail.edu, # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with the R software environment if not, write to the Free Software # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA # or see http://www.r-project.org/Licenses/GPL-2 ##END HEADER "add.image" <- function(xpos, ypos, z, adj.x = 0.5, adj.y = 0.5, image.width = 0.15, image.height = NULL, col = tim.colors(256), ...) { m <- nrow(z) n <- ncol(z) ucord <- par()$usr pin <- par()$pin # if height is missing scale according to width assuming pixels are # square. if (is.null(image.height)) { image.height <- (n/m) * image.width } # find grid spacing in user coordinates. dy <- image.width * (ucord[4] - ucord[3]) dx <- image.height * pin[2] * (ucord[2] - ucord[1])/(pin[1]) # # dx and dy should have the correct ratio given different different scales # and also different aspects to the plot window # # find grid to put image in right place. xs <- seq(0, dx, , m + 1) + xpos - adj.x * dx ys <- seq(0, dy, , n + 1) + ypos - adj.y * dy image(xs, ys, z, add = TRUE, col = col, ...) } fields/R/predictSE.R0000644000176200001440000000205514275252303013733 0ustar liggesusers# # fields is a package for analysis of spatial data written for # the R software environment. # Copyright (C) 2022 Colorado School of Mines # 1500 Illinois St., Golden, CO 80401 # Contact: Douglas Nychka, douglasnychka@gmail.edu, # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with the R software environment if not, write to the Free Software # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA # or see http://www.r-project.org/Licenses/GPL-2 ##END HEADER "predictSE" <- function(object, ...) UseMethod("predictSE") fields/MD50000644000176200001440000004656014467505347012062 0ustar liggesusers89050b05caa2203fbbb199c1c11ea545 *DESCRIPTION 3b1b7ce654d028cbe16127df91148c8b *LICENSE.note 531c98e8ce21095346bde935580d23a1 *NAMESPACE 38645fa9050ff83183c2110d795150b1 *R/BD.R 7212e1188d21c364b25c1d0e48d5f5cf *R/ChicagoO3.R db6e07dea275ffc097aaf277a8b09033 *R/Exponential.R ba2ac7068830fe9246c2b7b27abba9e0 *R/ExponentialUpper.R 424a1d3409177e5725e1b7e147a9384f *R/Krig.R 078118752e0d1f94fa86db3d69f5b12d *R/Krig.family.R 5adf8e47edee7f6aac92bca52f859912 *R/KrigFindLambda.R e53437192bc4fe041bf3d3f1d9513e61 *R/Matern.R 3ad0f208459e5637235c4ab0bf668f12 *R/Matern.parameters.R 7a65b91250f9eb84159362c79a9ae416 *R/Paciorek.cov.R bf608fac5c94fe8d4ae8ca0c8dd69bba *R/QSreg.R df5bf7dc79f40a616ff272ff12da906f *R/QTps.R 22024747a33e342b7d521212f1d50f42 *R/RMprecip.R 917e5897b827b4d90f15f8add765e92c *R/RadialBasis.R 8f71cc06e4076080c5938f707c6667a4 *R/RdistEarth.R 95f4dd31bb97f11da7af414653339168 *R/SUBSCRIPTINGSpatialDesign.R df22a64aa63b4f3b456b95857144e3e9 *R/Tps.R a738010a4ea3c59aa1fc855b29a904c3 *R/Tps.cov.R 42ffca41dc903da7568beed993fc6f97 *R/US.R dafda177e908371fa535ca63b8ee712a *R/add.image.R 3b95874c6b73ab1efc329587e930ed8f *R/addColorBarTriangle.R 6190d6c642c817e8d39c3b0fd8e7b161 *R/addLegend.R 10bde01a03d4b9ddbe20fc93b616fa69 *R/addMarginsGridList.R 187860129f974d1077cea5da6be39866 *R/arrow.plot.R 3bfe6bf54c70cac1874de4e86336aeef *R/as.image.R 74af56991f1558752c12a255bb1abe2c *R/as.surface.R 03dbc470d0df2e33c23607cff5767177 *R/bisection.search.R e080a7546f915aa62764c3930ac2cf30 *R/bplot.family.R 8114c76863c993144300cd17db2d6080 *R/bubblePlot.R ea765028432eeb246fe3828002bd3bfe *R/cat.matrix.R bab49a9e23ccc106de66ce9b0f32a0f2 *R/cat.to.list.R b0d294a4436f53923f5f05e11e1c9687 *R/ceiling2.R f85fe95ec341b0575f29732c7b0762ae *R/circulantEmbedding.R 1eef0c9a5529d6fa043ea09673021cd5 *R/circulantEmbeddingSetup.R e285194acf9dac7e47d873969115759a *R/coef.Krig.R b89d1b0805b77d82a8686f51d61aae74 *R/color.scale.R 5fd4a14b2af1e9f27ef754046ffdd4c9 *R/colorBar.R ab4cde208f5403222e4f42ad9e822f20 *R/colorbar.plot.R 142c6c355e4a36e05faf3c712701fc90 *R/compactToMat.R 45532be9a2e79770c184cd5b7ede379b *R/confidenceIntervalMLE.R 91557ae45899ec0ec6a9bb089db81b98 *R/cover.design.R 2184c95a17237dc1cf502db446819f2f *R/cubic.cov.R 103ce7f5b081cea1526f2a719c3a1390 *R/describe.R 0613ff5ad5d6c6e36063ccdec8681752 *R/discretize.image.R d3d14fe1aa1170b4d9b6ab49c21ce9fc *R/double.exp.R f25412f95062c73e6e34af6e22e92d2a *R/drape.color.R bdbbcede529ad2688404ca4ccf9585cc *R/drape.plot.R a6db6da09d3d697c9dc96bbb25dc394a *R/dyadic.2check.R 8b2d6048153e37185d9d54c58d69a606 *R/dyadic.check.R 5338d3d398598f1a20150e7ba60ce69e *R/envelopePlot.R 988959597fe70d16e31c3228fca5e91c *R/evlpoly.R 4475f8c043510244fb6c864a5ee1908e *R/evlpoly2.R 54e9eb01f9b29fb7b0e19a3a9b641ee2 *R/exp.cov.R 197196663cb58cc4cbb58978c7b61654 *R/exp.earth.cov.R 62a737d07612d6c2e5643b599d9410c1 *R/exp.image.cov.R 2423db1fa0b59bc07c800c51066dceaf *R/exp.simple.cov.R 6f4bd07e631a3743ba61997e254cdb4f *R/fast.1way.R 3fb659bdba58a6836c6e29e806a41731 *R/fastTps.R 3cb1d108742681771cfca881e3295f32 *R/fields.color.picker.R d0fb79752261fd1467f6577175ce6796 *R/fields.convert.grid.R a8ec70bc2af52887761262f8988affb5 *R/fields.derivative.poly.R 809ad60bfc70cbe96c76e2c01a3f3db6 *R/fields.duplicated.matrix.R 7b1f1f165dbd78805d10f5bf3ad8e214 *R/fields.mkpoly.R 2524972897e9e5f939ede52051e8fd23 *R/fields.rdist.near.R 964586e16fe2c7cca4358115aef1b433 *R/fields.style.R fc86ba7865caa00c751013eaab78e6df *R/fields.x.to.grid.R 20b6c45e2d7bd99730de6ae722a78008 *R/find.upcross.R 69765bfee9edef75d3a1c4f661d17ab9 *R/fitted.Krig.R d8119bbf4395eb864e9eb68c37ba0823 *R/flame.R c8aaf04fc3fc593e875a90b2d3d0af15 *R/gauss.cov.R 25c18c777a1e20acbca931666bb579c8 *R/gcv.sreg.R 5d81d0677ecd57a802a898ca2036a48a *R/golden.section.search.R 767569df2a036a130f3f029a486db9a3 *R/image.family.R c696ee46a67140bcfafae6c365fa1b9d *R/image.plot.R 18c33d0760fede9dc8e220fcfc58968b *R/image.smooth.R 604ac8412bc5499a8ab65810ae0dd0b1 *R/imagePlot.R 2adef62057e65af197dae8e4a4c5380c *R/imagePlotOLD.R 635063e25828c1ed984b6f540cc794f2 *R/in.poly.R cb680a50a02253404dc5d5858f85f1f9 *R/interp.surface.R 3445df48f12a0593f56d98c9b66a1610 *R/interp.surface.grid.R 034897fb9d7e4a588d49fa11818436a0 *R/larry.colors.R 2e6c2470fba09b963f3c59bdd969dd7b *R/mKrig.R c8d4ff7da5616491b133a8449e264136 *R/mKrigCheckXY.R df0a444cc10b586509cd8a6e2b533acf *R/mKrigFastPredict.R 889ee042a5e80685d15e22094868fecf *R/mKrigFastPredictSetup.R 0d27d4a8d3b589e0d858f7f2053fa573 *R/mKrigMLEGrid.R a0750c92465a04eb821c9cb6882beb90 *R/mKrigMLEJoint.R 6efb0666487854d76c48e6dcdebcea10 *R/mKrigMisc.R ecfb39e9836a69541aa8524f0bd95bc4 *R/make.surface.grid.R 4ff77aff9dbe42ea314c5ad84429fe8c *R/makeMultiIndex.R 6a63445eb046ebbb8677b9a1980d215d *R/makePredictionGrid.R dc6e4004834cec91ea5f87f7665833bb *R/matern.image.cov.R 04a50a080f16f10b5a8e6adca8f3b1bb *R/minimax.crit.R aa72ffdb3560ebaaf51d924452b0a973 *R/minitri.R e9605b20fcc4c82a63c65789f6428c4f *R/multWendlandGrid.R 3481e6f6132bf661391058d5c2e9eb8c *R/offGridWeights.R 551e5d1d5c07810fbbcc33443a8f198f *R/offGridWeights1D.R b4bcfab61e044c253624478655fe163e *R/offGridWeights2D.R f1a556e1df35f4aadde64203e87d4ebc *R/parse.grid.list.R 8b6bdd54ba2065e337a957f2df0217ae *R/plot.Krig.R a8205e6df174c72cf6c5e4faf2338eb2 *R/plot.spatialDesign.R 7f825a8ff0b08ab8ed814f368ce729d4 *R/plot.spatialProcess.R ab3c82e1be53dd768355a71ff8e32f39 *R/plot.sreg.R 9fecd5a4bd99113276c1329e86a4dbc5 *R/plot.surface.R e5b4abd67b0ec6126f38df6f54c65181 *R/plot.vgram.matrix.R 74acff93b3ccbffc8fff85ef3b312e4e *R/poly.image.R fabc0ab6328cdc8e45c2de55f623bc69 *R/predict.Krig.R 5234a382e1a5d4c01231d7aa8eab15e3 *R/predict.fastTps.R bf6702027ad6d9a9cf1d8fbd356dd2fd *R/predict.interp.surface.R afc31b5dd5ba1f8d926ce2cebebdba84 *R/predict.mKrig.R d615dc90c9a45fc1822c4a3f77212c53 *R/predict.sreg.R 620a588dd143e38cff3e90ea617bf749 *R/predictDerivative.Krig.R 94c049ead44da3a85fda5a0a1acdf531 *R/predictSE.Krig.R 3102ec6c3dce1949d8f14756cb7efa77 *R/predictSE.R 942f058e6230f7022398224e032d7bfa *R/predictSE.mKrig.R 9a4345b5f97dd2e61912543bb7b40996 *R/predictSEUsingKrigA.R 61b2d46fe71d05353f3706818e347047 *R/predictSurface.Krig.R 851edd328c1da574d1e371c149b9280e *R/predictSurface.family.R cc94219031dabc64729e676f0c92bd62 *R/predictSurface.mKrig.R 44d8f5b8755d9b0382bc85b231a351a0 *R/predictSurfaceSE.R 786b07d9b235f3f09d4b3509e2215a0e *R/print.Krig.R 9b123451dc68b7cb2c5703d51716dfed *R/print.mKrig.R b3efa13e7d4cd52b91f9b41a6f36e4eb *R/print.mKrig.summary.R c098fc49c01cd2db3af31b6584a0b5df *R/print.spatial.design.R 114b90a842f808325e28884ef057d3f5 *R/print.spatialProcess.R 3d93e0afa95e4585db511a509fac5855 *R/print.spatialProcessSummary.R bcbc7c9bf7befc5ef649db4e1fec59da *R/print.sreg.R e26d2508f6296e6586b93382569f8815 *R/print.summary.Krig.R 3bdf511fa458afa992ee509f994e1702 *R/print.summary.sreg.R 467009d8ab59d08a9ecd910e1d1e2d12 *R/print.summarySpatialDesign.R 63a66dcf48e73912432133a90a5e2ccd *R/printGCVWarnings.R 57d4774c0ae59e1142a18be6a7f271f1 *R/profile.R eb9185d2abf7de64b652bbd61c88aba4 *R/profileCI.R ce15999f5113f1e4d852661548a49792 *R/profileMLE.R 8d6d33f2240a5c95751b465536b77df7 *R/qr.q2ty.R 4ce3c933f59506d55d041fba9453da1d *R/qr.yq2.R 34fa0f19e1e53bb28d7841aa8f54121c *R/qsreg.family.R 9e9746fe07c1c965eed31a09aaad5be5 *R/quickPrint.R e9d9ca27462401aa3ba754f41b862ad5 *R/quilt.plot.R 091bd4973f5da1df15f9fd286f563017 *R/rad.cov.R e6a908ba08dcc41376d57b17a13c3d5d *R/rad.image.cov.R 9f0b819dd9ed39e60038dbcd67af6f94 *R/rad.simple.cov.R c8f44ac88408d194cfc6a324b8c5e5ef *R/radbas.constant.R 6325db2306333dd0fa2cb0024fa2a868 *R/rat.diet.R c1b1c3b282edf1b11d8831055d5f4960 *R/rdist.R b784e9f85dd822c44e6951377fbc95df *R/rdist.earth.R e9d0795642c62ea8a353d63ec93b06d8 *R/rdist.earth.vec.R 9485044107a47ef527f6f6a5db746e70 *R/rdist.vec.R 802480f9be362ca684fa6015cd64f934 *R/residuals.Krig.R ff489647e1b2c3044576a3b3c29ecc0c *R/ribbon.plot.R a4234b7f24c5793546c14c8b901216d9 *R/set.panel.R 4949678e1cb300cbf1c00fbd262df23f *R/setup.image.smooth.R 4245964bbce85138af5e29af429f4835 *R/setupLegend.R cc3ccd13b0bc0e280650e688c49a144d *R/sim.Krig.R 284b674157a1bb8082cf0a1129bf0446 *R/sim.rf.R 6cedb23458086e05c934e0c8dea07024 *R/sim.spatialProcess.R 2cd4665a5e5761125c9a5370eac357a7 *R/simLocal.spatialProcess.R 04c0611a9394dcb473f176a2157d6175 *R/simSpatialData.R af7515abc64e12bc5882bc5774a04688 *R/smooth.2d.R ddf49428c27a8a09b7a45538cdc1eb77 *R/snow.colors.R 3851160bc0ace1de017f2b8d7058efcf *R/spam_2lz.R bb6e110cecc6688105c96e2cf3ffe971 *R/spatialProcess.R 87c1b7e2694a0f9d66613c717fb75a0b *R/spatialProcessSetDefaults.R 86782ec2f3d875a410ef4f4c9c414752 *R/splint.R 3ccf19a50e0b013e0c797c6bd073ec10 *R/sreg.family.R 9a73b7f5340727c4afaee13d7afcfac8 *R/stationary.cov.R 91554f5c15e1d5b307ed8f3d5da9dcae *R/stationary.image.cov.R 3461817f66a57d9434afc865c26332d8 *R/stationary.taper.cov.R 399a05e300987a543d7501936c7a76e4 *R/stats.R dd0a585b5ec29cc81268f46d0ba52143 *R/stats.bin.R 5a009ac4b1ade9d12d1fb7ce3a889d6d *R/summary.Krig.R e1b2a993434421752d6db78fc330c085 *R/summary.mKrig.R ade3a20fc5daf2e84159c31a44f9051e *R/summary.ncdf.R deb80c0d708cab5ce5a53f811e302818 *R/summary.spatialDesign.R 7ffac53cd165c4d7dee7605ea117c823 *R/summary.spatialProcess.R 6db53ed5c60a18260509f81b585016df *R/summary.sreg.R c9e376d0901b109a970fe2600828bcbe *R/summaryGCV.Krig.R f17fef8c9734515aa9d8172da413e403 *R/summaryGCV.sreg.R 8a67ef7bd6a994e0f380d0ac99a235cf *R/supportsArg.R 1555e1521a4d01a091404196030c8e84 *R/surface.family.R 0d6f12200152793237cdcb6443dde74f *R/test.for.zero.R 03e7bb1e2c898be3720d01a2af8da8e4 *R/tim.colors.R b4591e69032a892b1898801a37fee92b *R/transformx.R 6a5fa181f7e5d089f59d2ddf341804e8 *R/unrollZGrid.R cefb745e7138bea2598d838e898a2185 *R/unscale.R c168431e4fdb95a722fa4c317d521d2d *R/vgram.family.R 5db01b5dd1b0e999f04dad968285956c *R/vgram.matrix.R 996718a4e053cdd586caaa92f300bf81 *R/wendland.family.R cb128d13a3bdde4d29276f581e98f77c *R/wendland.image.cov.R 7921157c57ef447c6a912c6c54c94acc *R/which.max.matrix.R 06f23861f35d6e37099be27b7acfb496 *R/world.R c19ba42ff95e1a2e1c71af61ed51523e *R/xline.R 683aa2fbd43a5867821463be9233d714 *R/yline.R def2e3c5b2487cf369719ecedc0ec009 *data/CO2.rda 5d5cc9f8d3c5b782b5d87844727694f4 *data/COmonthlyMet.rda 510e588dbd657d31f456f0a1a4f45adc *data/NorthAmericanRainfall.rda 0c0be8a07fa347d68fc36fc6a117c759 *data/PRISMelevation.rda e98af9c5d6b770b5f04819fba9aa72af *data/RCMexample.rda ec8555f8006ae1cbdf3937be5609b37e *data/RMelevation.rda 5f0f32a5ee0dbc877a28c20bdeb6f64d *data/US.dat.rda 5baf657b81b2ee2809dc96ecde12794d *data/WorldBankCO2.rda 04d0db31fa118481f9f5a767ab5f8242 *data/datalist 9b3d02d96baaf1d31171c003b8d0cadb *data/glacier.rda f560c509a3416dcb22274af12ebf5d07 *data/lennon.rda c909744661a3fbd93bbc36773d7183d3 *data/ozone2.rda 43a5afaacf0deb2f95d4288968aa7168 *data/rat.diet.rda cafddcfafb1344f9158d8607867d0575 *data/world.dat.rda 8a386b95a7fbf993c5d26c07932a9405 *inst/CITATION a6347a41662828f6f38c89f9e7b490c8 *man/BD.Rd 0861489208200c926034cc56493687a6 *man/CO.Rd ef3f6b689ad7675cd9e219cd0f6411fd *man/CO2.Rd cc7f12f43a710f860c630c65ed82e5cb *man/CovarianceUpper.Rd d9bff56574a3bf4d4934b1a2d210def7 *man/Exponential.Rd 833f568fccbb7fff1f077dc305b6dfeb *man/FORTRAN.internal.Rd 388efffabec38b510c3de8ce908d1033 *man/Krig.Amatrix.Rd 06ceaffaad0321b9730057bfd3603d05 *man/Krig.Rd d51d4ea95aac4ca818f3d4cf45f351f2 *man/Krig.engine.default.Rd cb7c554498a83536fab2100ee380e433 *man/Krig.null.function.Rd 2190cb52eb885ddf0b2185a9b8f7d6ad *man/Krig.replicates.Rd 8847a6fbcc39494e9faefb78a45bb9f7 *man/KrigFindLambda.Rd 3a43e5e623aaf4c4298cbcfffc115c9a *man/NorthAmericanRainfall.Rd e9046d643095487536158d0ea9894233 *man/QTps.Rd decea540ca905fb9371823b84cbbbb83 *man/RCMexample.Rd e4a9ca60eb44998a3caa5ccbb6bd9689 *man/RMprecip.Rd 00372e5fc38db37bc4ce88d7d62448b0 *man/Tps.Rd ac963bae56e0ea0a3d3905fc92c90be3 *man/US.Rd 9e4d48f87d03fdb40f8a2907c8d5ea59 *man/US.dat.Rd 3e04b3363ed1c4c0f68d732d6b55e605 *man/Wendland.Rd e3b2b87a5d4a71055e701d9bdb0e8a88 *man/WorldBank.Rd 9099588284cff3c10e53832f6ba96d4c *man/add.image.Rd f632b2875aca645a9707571f6f791b10 *man/arrow.plot.Rd c3c1d742e90c923049d4f409d2244da7 *man/as.image.Rd 7640c09e24d0ecdcd424b490a191eea4 *man/as.surface.Rd 10714dc27ce0269e868a7a2862116630 *man/bplot.Rd 021f33dd44f3698eaacd7d2b1bceeaf4 *man/bplot.xy.Rd 4fd34f2e095531ce5c90497f585297b2 *man/colorbar.plot.Rd b99e6f18aefb568a734c723ef8601c9b *man/compactToMat.Rd d9c662ffdf966e78fb11ad3e82b82a73 *man/cover.design.Rd 5855472f6a8c2dae9d1313b604498d1f *man/drape.plot.Rd 4eaa0e70a84784336bb1c1a7bb3892f3 *man/envelopePlot.Rd 144d80280a2a4b2bb5cf09b8148fd79d *man/exp.cov.Rd f8c062061f1eb92ef2a6f7fdc0c31a69 *man/fields-internal.Rd a786a012a74e18b8fa52cbe16ffdb9c0 *man/fields-stuff.Rd dcfa8bb1ee0433567e844befb01d141f *man/fields.Rd 66b422a20a200de2b29cf9638b99450e *man/fields.grid.Rd d769767a82b0459d948ff97c6136822f *man/fields.hints.Rd d42059e88c006643723037a6a154bc0a *man/fields.tests.Rd d421c80104ebd3e3d0b698a6568fa3dd *man/flame.Rd 91ad0998b1103c9fc33a524771136fdf *man/glacier.Rd 8ede9aab998132893e5302de5d4d37d2 *man/grid.list.Rd 0853af7815d8b7a4b5c401b8040c5baf *man/image.cov.Rd 8a3429794f52af0cdf69fb3e9f8bce63 *man/image.plot.Rd 19cfa39d551b015c1aea46b80f2ae758 *man/image.smooth.Rd 4ec1c358a6052d0cde1d67b92e2fc65a *man/image2lz.Rd a22c0aa9720a107f675c8564588676d0 *man/imagePlot.Rd 318705ef5260e5d25a9de8b3faf828d2 *man/interp.surface.Rd 6d7320c7f2aaba86a1f9c16936956ebb *man/lennon.Rd 3572782d61bc290cd0f40cce7cf428b3 *man/mKrig.Rd 5a1b902ae2f89908f1c7ebdc67a098ef *man/mKrigMLE.Rd 3e23f5716added3c05b681256addda14 *man/minitri.Rd 608617d4e2b30cf07a872f6ef84ff8da *man/offGridWeights.Rd 338471deeab813a6ca306bcbd0c86867 *man/ozone.Rd d54053dc2ca677cda38530b069bdc413 *man/ozone2.Rd 03e1d13de69e1bbed24c28b31e081fce *man/plot.Krig.Rd f0b8db0402cf94b50321b53dd0498b9f *man/plot.surface.Rd 5b6b8a927e76176a03aaa285cb9ed443 *man/poly.image.Rd baf846918dbe6890cd6fda3661fbc3ed *man/predict.Krig.Rd 4ee1fff19ca5455ec352c08d8b835047 *man/predictSE.Krig.Rd baf0f85f852e978095c9d1ad16056b14 *man/predictSurface.Rd 20197a944c7e839acf090bf97fc80162 *man/print.Krig.Rd 6ee16f1675909d76e893d36527be5174 *man/pushpin.Rd a9df309cce2a0e25b2ffe86814bc0f9f *man/qsreg.Rd adf98ceac75dafce73dfb39689f33041 *man/quilt.plot.Rd af8cd31ac9fb1202bb78a98e6a466d97 *man/rat.diet.Rd 3e99d60b2269b05a101c6a1cbfbcd6f8 *man/rdist.Rd 065b1ae6e45868382410aa3c93f6b34c *man/rdist.earth.Rd 5f14bb33cd9fdf7d1da712ac627881fd *man/registeredC.Rd 30734a89d10ff87cd41f387a4dec9896 *man/ribbon.plot.Rd 5904b37b4c079803dc0efa11ac22d4b9 *man/set.panel.Rd 68c957ec6461b0eb67fbfe1c1218c2cd *man/sim.Krig.Rd 11aa04a8c38a011efc5881df0e8a2246 *man/sim.rf.Rd 904744fc27332ee21c0e4d8c777a9fa7 *man/smooth.2d.Rd 9353e19a7cbebd5bf936e19a8b7dafd2 *man/spam2lz.Rd 4cad5743ccbaff25083da88b5fb5e701 *man/spatialProcess.Rd 709b8735c7330ec2dd42ff5a05e15bba *man/splint.Rd e2910ca88825637915adc9933d68888e *man/sreg.Rd fce5f091aa632af7e8e3259f40c8003d *man/stats.Rd b51da4eea190c12ec7f820d8dd545a3b *man/stats.bin.Rd 3b2ee587f323c334086471432f4cf1c9 *man/summary.Krig.Rd 697e9a2a8636ce1a322fc386132663a8 *man/summary.ncdf.Rd d2353bd5746842357fe54be86f5f7366 *man/supportsArg.Rd 26714b4d9685afea6e4ccaee61244aff *man/surface.Krig.Rd 3631bcbaf699f58981f4f627c1973487 *man/tim.colors.Rd 877cb276aa3bf4fd71f384fa76c6eaab *man/transformx.Rd 8929b89152e7fc26270f38240ebde4ac *man/vgram.Rd 3d8963504d4327ba9466619d7beaef7d *man/vgram.matrix.Rd 54d202f05500110baebb770c283065ca *man/world.Rd 455a55ebb31b9c328b63c718a3880fe0 *man/xline.Rd 0a681cab85b5f2f0748a9fc1f545d2c0 *man/yline.Rd d6621f72345f8b583ba2fc844e436ce1 *src/ExponentialUpperC.c 8a4db0a4a45d07aaa6b52eef529e8557 *src/RdistEarth.c beec7a2c592eb85f1e3a62c51cb4c065 *src/addToDiagC.c ca7ce08599c43df98991056e5555f849 *src/compactToMatC.c 66b9c403ae8577007f8ffbd90f9fad23 *src/expfnC.c d9317c79ce19d8aded07ec27a565657b *src/fieldsF77Code.f 9596583bc08d99dbf7c406b551918087 *src/init.c d17d031b0f8f86066dba6f029e892498 *src/multebC.c cc0ae12f403309c82568f081fc11f705 *src/rdistC.c 771f86f0e7cb1d4c98ae3b898d417190 *tests/Krig.Z.test.R 95dcc2d3ec1b44d524adff03ed92f5e5 *tests/Krig.Z.test.Rout.save 57e32be66852dcbbf3ff84d1cbac9d9f *tests/Krig.se.W.R f67b453035ba1922fb057099631ec81d *tests/Krig.se.W.Rout.save dc0bcd164845369fd2944f832e630ee8 *tests/Krig.se.grid.test.R 08f6f3a38bd0bab8b0bd0bc2cc1ffb94 *tests/Krig.se.grid.test.Rout.save c4989e7ba0a7e2975ec71cc75a730497 *tests/Krig.se.test.R f1245f4d9c88bff5ffa210dac22bb1e5 *tests/Krig.se.test.Rout.save 772ae392dc2838385f8a8d4d97692a3f *tests/Krig.test.R 0a67cbc61f3a63f9a1b6b26625d26a08 *tests/Krig.test.Rout.save 3c56eafe8e40749a54326ff2ad071635 *tests/Krig.test.W.R f4442bd717015c1b97808c7bf7e46736 *tests/Krig.test.W.Rout.save de8043abbe7a869b5833d6fb3d2349fe *tests/KrigGCVREML.test.R f7af28e763e69137d5e58e2bd8af3633 *tests/KrigGCVREML.test.Rout.save 7b41f648b174fab07d77dc75a41271d7 *tests/Likelihood.test.R 9340d2cf2ea9666e43db490bb8ddb217 *tests/Likelihood.test.Rout.save 4dfb0c782e2d935ffe10b7d5e0b273e5 *tests/SEFixedParameters.R 96c0335e5e8f539a2c47275f066965a2 *tests/SEFixedParameters.Rout.save 51481bdfda6a88d5a0a5a83b91e0532d *tests/Tps.test.R a18aff0328a45c4b816deaad6365e2d2 *tests/Tps.test.Rout.save ed29aae913ae40698bb15b203e07969f *tests/Wend.test.R 2241010ce5f53600484c6932342d5d9c *tests/Wend.test.Rout.save 500ef3b605d4d7da6d45daba62222f2c *tests/cmdfile 7cf00a12a2d21d0a38690c0d15186394 *tests/cov.test.R 1560516372d1904677032e5720f3592f *tests/cov.test.Rout.save f9736781a6e0240662fb30e0f6aa6483 *tests/cov.test2.R d9b4f310d687f4b1069cfc7621f1c0c5 *tests/cov.test2.Rout.save 0d86fa77ee39945333ecc192f4e075fb *tests/derivative.test.R 1a122ef0241e6e17faab2a188da97b6f *tests/derivative.test.Rout.save 3edaa5350496babe46e496ea845fe017 *tests/diag.multiply.test.R 06acea0985d2af4556005c69fce3cccd *tests/diag.multiply.test.Rout.save 840017376ecfe3cceac8767746c9552a *tests/evlpoly.test.R 5d9a99b206da870d1294fb6c8bfc56a0 *tests/evlpoly.test.Rout.save c5cc3f636ebe475850cb577111d256c8 *tests/fastTpsPredict.test.R 16d386b745a7c6efa353ec06202cb2b3 *tests/fastTpsPredict.test.Rout.save d41d8cd98f00b204e9800998ecf8427e *tests/mKrig.R e156596edd8c92461bd996daafbee609 *tests/mKrig.Z.R a3d6bfee43674ccbb9fe36994b843f17 *tests/mKrig.Z.Rout.save 00dc3b9ea109de0dd48d86ff1288386f *tests/mKrig.parameters.test.R a43f593658a7cf0ae541173b32293d45 *tests/mKrig.parameters.test.Rout.save 55e7e70045a8ce16d88a4ea1cfe7769b *tests/mKrig.se.test.R 52402aba74fb6437ccf20c27fb46fda4 *tests/mKrig.se.test.Rout.save 9e40393a5f1edeb8f930999da28aaee5 *tests/mKrig.test.R 04826e6db0d4c5d9d9606c90ec7c21d4 *tests/mKrig.test.Rout.save cb71af6f2c1701fc685b5e8ab69d3dda *tests/mKrigMLETest.R 9c6090fb3a0b857998a1a6228066929c *tests/mKrigMLETest.Rout.save 0858b0fa7889742541819c3ef69b2c28 *tests/mKrigREMLTest.R 7800e931fdce01f339c2d6761d898868 *tests/mKrigREMLTest.Rout.save 21c68107c1122b23f00147519561d2f4 *tests/misc.test.R 563e4a4fafcd6e18aad0ff92e10d1dc9 *tests/misc.test.Rout.save b9914963d83a048addbb250c41aba7f0 *tests/offGridWeights.test.R 577541ad1233c941d523f229d956b969 *tests/offGridWeights.test.Rout.save 6105dea86133352cce6fe8a489ac46f3 *tests/offGridWeightsNEW.test.Rout.save dff29b03b0f0a2ef23ca09de2a88b52c *tests/offGridWeightsNew.test.R d182574531e410b3a9f56b9ae638b8da *tests/spam.test.R 05bdbc518bfb21eee6061dbfc3520bf9 *tests/spam.test.Rout.save f0aace807398a09022a32fe35861862f *tests/sreg.test.R ae6f71c115017a67c9b4e89de0390d28 *tests/sreg.test.Rout.save dd0c675ddc196904b234bf57fbaeb789 *tests/testZCommon.R 09542c527bc8990b7483c0ed71e41c96 *tests/testZCommon.Rout.save 371acfa059289e24fc401773fe76495a *tests/vgram.test.R 9f3841f50a6bc31eca277587adc7d8eb *tests/vgram.test.Rout.save 371acfa059289e24fc401773fe76495a *tests/vgram2.test.R 91e78370c8254cb54d2cfe31e11529c7 *tests/vgram2.test.Rout.save fields/inst/0000755000176200001440000000000014127137023012475 5ustar liggesusersfields/inst/CITATION0000644000176200001440000000106714127137023013636 0ustar liggesusers NOTE<- paste( "R package version", meta$Version ) bibentry(bibtype="Misc", mheader = "Please cite fields including its version and DOI as", title = "fields: Tools for spatial data", author = c( person("Douglas Nychka"), person("Reinhard Furrer"), person("John Paige"), person("Stephan Sain") ), note = NOTE, organization = "University Corporation for Atmospheric Research", address = "Boulder, CO, USA", year = 2021, url = "https://github.com/dnychka/fieldsRPackage" )