zoo/0000755000175400001440000000000012501616547011263 5ustar zeileisuserszoo/inst/0000755000175400001440000000000012501555050012227 5ustar zeileisuserszoo/inst/TODO0000644000175400001440000000270512377744504012742 0ustar zeileisusers - add to unit tests. There are two styles: (1) in zoo/tests using the R CMD check facilities and (2) in zoo/inst/unitTests using the RUnit package. - benchmark zoo with and without byte compiling to see what the difference is. If this is fast enough the next point may not be needed. Targets of the test would be merge.zoo, rollapply.zoo, etc. e.g in the following the compiler was actually slower: > library(rbenchmark) > library(compiler) > f <- function(x) x*x > fc <- cmpfun(f) > benchmark(f(100), fc(100)) test replications elapsed relative user.self sys.self user.child sys.child 1 f(100) 100 0.00 0 0.00 0 NA NA 2 fc(100) 100 0.02 1 0.01 0 NA NA - xts is like zoo but only works with the half dozen most popular index classes. Some of its functionality is made possible by that but other functionality could be ported to zoo. - consolidate the C code in xts and zoo so that they both use the same C code base. xts already uses a C backend so its more a matter of getting it to use zoo. This really needs more unit tests to be done first. Also the byte compiler needs to be tested to see if it can give similar speedups. If it can there is no point in this one. - a user contributed code to do rolling analysis by time difference rather than number of points. This needs to be gone over. - rewrite merge.zoo which has become a mess zoo/inst/WISHLIST0000644000175400001440000001077612377744504013452 0ustar zeileisusersFEATURES ******** o rbind.zoo() currently ignores the column names (if any), should behave like rbind.data.frame() in this case. o design: re-think shared design of parameter and panel functions for plotting. o bugs: rollmax, rollmedian give Error for k=1. o zoo methods for dbReadTable and dbWriteTable to facilitate using zoo objects with DBI o register S3 methods and use namespaces so that this works: f <- local(function(x) zoo::index(x), baseenv()) o provide a [<-.zoo method that is fully consistent with [.zoo so that the following works: a <- zoo(matrix(1:10,5,2), 2001:2005) a[I(2003), 2] <- NA (Note: as in window<-.zoo) o preserve attributes in [.zoo and possibly certain other zoo methods o allow plot.zoo to accept a list of zoo objects -- this would be particularly useful in the case of line plots of multiple series with different time bases since NAs are introduced by merging and they can cause the drawn lines to be undesirably broken. (Current workaround is to use na.approx.) o more graphical facilities, e.g., a pairs function, make plot.zoo(x, y) work with multivariate series (plotting every combination of plot(x[,i], y[,j])) o incorporate runmean in package caMassClass o allow log to be specified per plot in plot.zoo o performance enhancement when using arithmetic on zoo objects. Check if they have same index first. o speedup for indexing strictly regular series. Test with is.regular first. set.seed(1) x <- ts(rnorm(5000)) xz <- as.zoo(x) system.time({ ################################ for(i in 1:5000) if (is.regular(x)) x[(i - tsp(x)[1])*frequency(x) + 1] <- 0 else window(xz, start = i, end = i) <- 0 }, gc = TRUE) system.time( for (i in 1:5000) xz[I(i)] <- 0, gc = TRUE ) system.time( for (i in 1:5000) window(xz, start=i, end=i) <- 0, gc = TRUE o zoo() - support zoo data.frame objects (and zoo list objects) - fully support zoo factor objects [limited support already available] - idea: new class "Zoo" that is not a matrix plus attribute but a list with slots "coredata", "index" and "frequency". o merge() - names not processed correctly when retclass = "list" o misc functions - interface to additional statistical routines such as the ones referenced in: http://CRAN.R-project.org/doc/contrib/Ricci-refcard-ts.pdf [Z: with as.ts.zoo() most of the functions work directly by coercing the first argument to "ts"] o QA: regression test suite o make.par.list. names, other than correspondence names, are not allowed on x. Perhaps this should be allowed if m = 1 or perhaps it should be allowed if x is not a list and correspondence names only allowed for lists. o rollapply.default o as of lattice 0.12-14 lattice:::updateList could be replaced with modifyList o read.zoo. The following situations have all appeared on r-help: - the index is of the form yyyy-mm-dd hh:mm:ss at the beginning of each line but sep is whitespace. To handle this read.zoo would have to figure out special cases in which there is whitespace in the format and use two columsn rather than one. I think it would be good enough if it only handled a single whitespace. - header does not have a component corresponding to the index. It would be nice if read.zoo could automatically figure out that situation and handle it. - the date format is yyyy.mm . In that case it would be convenient if it were possible to specify: read.zoo(..., FUN = as.yearmon, format = "%Y.%m") and, in general, if format were passed to FUN if both are specified. o identify.zoo o allow index.column in read.zoo to be a vector in which case it pastes them together so that 9999-99-99 99:99:99 99 99 99 can be read directly as dates and times. o add class= arg to as.zoo.ts o cut/seq/floor/ceiling/round/trunc on yearmon/yearqtr objects INTERFACES ********** o provide fCalendar interface routine to the Rmetrics projects DOCUMENTATION & COMMUNICATION ***************************** o R news article based on the vignette o some data to include with zoo o more examples for the help files o as of R 2.6.0 the example in aggregate.zoo.Rd that uses duplicates(..., fromLast=) could be taken out of the \dontrun{} zoo/inst/CITATION0000644000175400001440000000141711354654672013406 0ustar zeileisuserscitHeader("To cite zoo in publications use:") citEntry(entry="Article", title = "zoo: S3 Infrastructure for Regular and Irregular Time Series", author = personList(as.person("Achim Zeileis"), as.person("Gabor Grothendieck")), journal = "Journal of Statistical Software", year = "2005", volume = "14", number = "6", pages = "1--27", url = "http://www.jstatsoft.org/v14/i06/", textVersion = paste("Achim Zeileis and Gabor Grothendieck (2005).", "zoo: S3 Infrastructure for Regular and Irregular Time Series.", "Journal of Statistical Software, 14(6), 1-27.", "URL http://www.jstatsoft.org/v14/i06/") ) zoo/inst/THANKS0000644000175400001440000000162612377744504013166 0ustar zeileisusersThe authors would like to thank the following people for ideas, testing and feedback regarding zoo: Whit Armstrong Matthieu Cormec Spencer Graves Sundar Dorai-Raj Dirk Eddelbuettel Mario Frasca Christian Gunning Nicolas Hirschey Kurt Hornik Roger Koenker Thomas McCallum Murali.MENON@fortisinvestments.com Deepayan Sarkar Enrico Schumann Ajay Shah Jarek Tuszynski Felix Andrews Giles Heywood Trevor Davis zoo/inst/doc/0000755000175400001440000000000012501555040012773 5ustar zeileisuserszoo/inst/doc/zoo-quickref.R0000644000175400001440000002236312501555040015542 0ustar zeileisusers### R code from vignette source 'zoo-quickref.Rnw' ################################################### ### code chunk number 1: preliminaries ################################################### library("zoo") library("tseries") online <- FALSE ## if set to FALSE the local copy of ## is used instead of get.hist.quote() options(prompt = "R> ") Sys.setenv(TZ = "GMT") ################################################### ### code chunk number 2: read.zoo ################################################### Sys.setlocale("LC_TIME", "C") inrusd <- read.zoo("demo1.txt", sep = "|", format="%d %b %Y") ################################################### ### code chunk number 3: read.table ################################################### tmp <- read.table("demo2.txt", sep = ",") z <- zoo(tmp[, 3:4], as.Date(as.character(tmp[, 2]), format="%d %b %Y")) colnames(z) <- c("Nifty", "Junior") ################################################### ### code chunk number 4: extract dates ################################################### time(z) ################################################### ### code chunk number 5: start and end ################################################### start(z) end(inrusd) ################################################### ### code chunk number 6: convert to plain matrix ################################################### plain <- coredata(z) str(plain) ################################################### ### code chunk number 7: intersection ################################################### m <- merge(inrusd, z, all = FALSE) ################################################### ### code chunk number 8: union ################################################### m <- merge(inrusd, z) ################################################### ### code chunk number 9: merge with lag ################################################### merge(inrusd, lag(inrusd, -1)) ################################################### ### code chunk number 10: plotting1 ################################################### plot(m) ################################################### ### code chunk number 11: plotting2 ################################################### plot(m[, 2:3], plot.type = "single", col = c("red", "blue"), lwd = 2) ################################################### ### code chunk number 12: select range of dates ################################################### window(z, start = as.Date("2005-02-15"), end = as.Date("2005-02-28")) ################################################### ### code chunk number 13: select one date ################################################### m[as.Date("2005-03-10")] ################################################### ### code chunk number 14: impute NAs by interpolation ################################################### interpolated <- na.approx(m) ################################################### ### code chunk number 15: impute NAs by LOCF ################################################### m <- na.locf(m) m ################################################### ### code chunk number 16: compute returns ################################################### prices2returns <- function(x) 100*diff(log(x)) ################################################### ### code chunk number 17: column-wise returns ################################################### r <- prices2returns(m) ################################################### ### code chunk number 18: rolling standard deviations ################################################### rollapply(r, 10, sd) ################################################### ### code chunk number 19: last day of month ################################################### prices2returns(aggregate(m, as.yearmon, tail, 1)) ################################################### ### code chunk number 20: last day of week ################################################### nextfri <- function(x) 7 * ceiling(as.numeric(x-5+4) / 7) + as.Date(5-4) prices2returns(aggregate(na.locf(m), nextfri, tail, 1)) ################################################### ### code chunk number 21: four second mark ################################################### zsec <- structure(1:10, index = structure(c(1234760403.968, 1234760403.969, 1234760403.969, 1234760405.029, 1234760405.029, 1234760405.03, 1234760405.03, 1234760405.072, 1234760405.073, 1234760405.073 ), class = c("POSIXt", "POSIXct"), tzone = ""), class = "zoo") to4sec <- function(x) as.POSIXct(4*ceiling(as.numeric(x)/4), origin = "1970-01-01") aggregate(zsec, to4sec, tail, 1) ################################################### ### code chunk number 22: one second grid ################################################### # tmp is zsec with time discretized into one second bins tmp <- zsec st <- start(tmp) Epoch <- st - as.numeric(st) time(tmp) <- as.integer(time(tmp) + 1e-7) + Epoch # find index of last value in each one second interval ix <- !duplicated(time(tmp), fromLast = TRUE) # merge with grid merge(tmp[ix], zoo(, seq(start(tmp), end(tmp), "sec"))) # Here is a function which generalizes the above: intraday.discretise <- function(b, Nsec) { st <- start(b) time(b) <- Nsec * as.integer(time(b)+1e-7) %/% Nsec + st - as.numeric(st) ix <- !duplicated(time(b), fromLast = TRUE) merge(b[ix], zoo(, seq(start(b), end(b), paste(Nsec, "sec")))) } intraday.discretise(zsec, 1) ################################################### ### code chunk number 23: tseries ################################################### library("tseries") ################################################### ### code chunk number 24: data handling if offline ################################################### if(online) { sunw <- get.hist.quote(instrument = "SUNW", start = "2004-01-01", end = "2004-12-31") sunw2 <- get.hist.quote(instrument = "SUNW", start = "2004-01-01", end = "2004-12-31", compression = "m", quote = "Close") eur.usd <- get.hist.quote(instrument = "EUR/USD", provider = "oanda", start = "2004-01-01", end = "2004-12-31") save(sunw, sunw2, eur.usd, file = "sunw.rda") } else { load("sunw.rda") } ################################################### ### code chunk number 25: get.hist.quote daily series (eval = FALSE) ################################################### ## sunw <- get.hist.quote(instrument = "SUNW", start = "2004-01-01", end = "2004-12-31") ################################################### ### code chunk number 26: get.hist.quote monthly series (eval = FALSE) ################################################### ## sunw2 <- get.hist.quote(instrument = "SUNW", start = "2004-01-01", end = "2004-12-31", ## compression = "m", quote = "Close") ################################################### ### code chunk number 27: change index to yearmon ################################################### time(sunw2) <- as.yearmon(time(sunw2)) ################################################### ### code chunk number 28: compute same series via aggregate ################################################### sunw3 <- aggregate(sunw[, "Close"], as.yearmon, tail, 1) ################################################### ### code chunk number 29: compute returns ################################################### r <- prices2returns(sunw3) ################################################### ### code chunk number 30: get.hist.quote oanda (eval = FALSE) ################################################### ## eur.usd <- get.hist.quote(instrument = "EUR/USD", provider = "oanda", start = "2004-01-01", end = "2004-12-31") ################################################### ### code chunk number 31: is.weekend convenience function ################################################### is.weekend <- function(x) ((as.numeric(x)-2) %% 7) < 2 ################################################### ### code chunk number 32: omit weekends ################################################### eur.usd <- eur.usd[!is.weekend(time(eur.usd))] ################################################### ### code chunk number 33: is.weekend based on POSIXlt ################################################### is.weekend <- function(x) { x <- as.POSIXlt(x) x$wday > 5 | x$wday < 1 } ################################################### ### code chunk number 34: summaries ################################################### date1 <- seq(as.Date("2001-01-01"), as.Date("2002-12-1"), by = "day") len1 <- length(date1) set.seed(1) # to make it reproducible data1 <- zoo(rnorm(len1), date1) # quarterly summary data1q.mean <- aggregate(data1, as.yearqtr, mean) data1q.sd <- aggregate(data1, as.yearqtr, sd) head(cbind(mean = data1q.mean, sd = data1q.sd), main = "Quarterly") # weekly summary - week ends on tuesday # Given a date find the next Tuesday. # Based on formula in Prices and Returns section. nexttue <- function(x) 7 * ceiling(as.numeric(x - 2 + 4)/7) + as.Date(2 - 4) data1w <- cbind( mean = aggregate(data1, nexttue, mean), sd = aggregate(data1, nexttue, sd) ) head(data1w) ### ALTERNATIVE ### # Create function ag like aggregate but takes vector of # function names. FUNs <- c(mean, sd) ag <- function(z, by, FUNs) { f <- function(f) aggregate(z, by, f) do.call(cbind, sapply(FUNs, f, simplify = FALSE)) } data1q <- ag(data1, as.yearqtr, c("mean", "sd")) data1w <- ag(data1, nexttue, c("mean", "sd")) head(data1q) head(data1w) zoo/inst/doc/zoo-quickref.pdf0000644000175400001440000022530012501555043016111 0ustar zeileisusers%PDF-1.5 % 1 0 obj << /Type /ObjStm /Length 3624 /Filter /FlateDecode /N 88 /First 724 >> stream x[YsF~_1F*G,Gs0 I)BAί߯AIQ"f0{0,dB0ͤ40e(0Y̜p, Y,%"t"5,-)WYd07X9qD⡘"NC&0E VcdDWˤxȁc&BK1,#&IL <PXSx2:bf cȆ諈YGƬӎ)ɜ4!S3( $We;[81o_M 4`}ՊXԈ1\ c8Fh=VZS|5h`C!y ZbEQ$j!a  'OYl*륮'h%1 E a )K z g-鍂*8@ t,,q,bpёBa:P@)`#uYdi#]?Nd BvorMOKtT9z2~qPIäL?0ҡf+aO}=Z LIn1;0rIO?9y\r6*Ah0<+'ppiIv3_-o%]tu/1T]`xtLQ]>87%aD:FmS~W$˸ķۈ"6-J1}bٴIMuRٗoaGh b]܈)\KctD>dN.BWy*pmvZx$+p.䓼8IF)E=?adycT1:tEo3lfl1,@5OEXg!=ȧ6nn~ :Ͳ%eF4z j~Ǐ׬]om얢>)2 Hy`fa6z+.+lhQ !6­q<7;ʦtV~ȷ;OdLv4"XHٵp ~$]!+Q.a~}Pưcd3Cq߉NhX U;%G_+&T`e czm*Ggl欗|_ *ݱSb["n*Ǜ옷(bG+Ș_ƳJA5IV  };a#yqLP?~++yZO_~$^*g |Lɦ{Y򃫤ҵ) TU2\$͊v"#/( =yCi]^]#G^~cTrFU*mHxVcćjidqRڗue3Thoz oqjRY^XnSm8<{pE[T_'hbi sՇ=Ƶ(5i_IE`Sg"c(djq3=$וUݥ'w~{|Gu|S~/.2~3'Oצ Z)l[WCQhFa#QD56f|M*JzJjz ajFa_x't3h971YMӢ1F6#PpV3YhF#mVƢ,;Ɨj+'$2~Yj~=NiTʳGDЕ=%Vծcmc`O3+_o']fF9+X8Kt`B:Oͮxe4IYqEv C/adW_oi֦47LҋjMZjc'sO;\[ݯn1[ e_lBd*Ҕs-̿/WZ-כl^(;}c2My N^VNehW35TzV__}7 hM ow?^k- nXFmXF^oI3}8*sq0PQ SІjPJ^NO`k׋CzdԈ;Y ZEW?R_9V TH/pϫV5Ƀn' ϠEq5S$A׺-a&$hnt5X77u%UO7Ξ|wp q7žN /]bHgFw:8QA݋pE|$t%y8GrnXE_VZP̸J!X5I/4i>Vu^-i*Xg>>gxC4~2[ɺh(\-UW{88`ޯ;zC2Q]Wxj .Eop ao:Gx}VrFv?@&|9rcdMy3`OJǤd)-,ڕR|2efWeooWV.m~Qa>4#\ihz t6[9cZ̲V%d>i̧cE:q' au @zFt!-Ȧ-uN*٭ȐU/Qɨn+&eGmb'cQ36ߞx~h7T[ډ~ڮz409DB7/Ͻ6Y熺_" -ۙw}eo=muiۻX`ya?S;+JeԶn1?qY,o~ANwx`ȯzyqBJ vA ڕ4Q0Űs׊vz|6rZf?;3,d_A^\H,4ܺ #,D Dǔ- tfIHgdЖk$]`(W"NI|]%W?_'_)Q QA" _B$ L4Р7ʮ)Rl"dܗ R~)J|yY% q>|Iwi݋^\PAQM`@zWޛw8 .#ts})'xkG5Ϫ}>Ac;e IţGt=N'04.ܡ!E8DǟkcL-' ;`q ׍:0:yc&ՙ zR++endstream endobj 90 0 obj << /Subtype /XML /Type /Metadata /Length 1337 >> stream 2015-03-16T14:26:58+01:00 2015-03-16T14:26:58+01:00 David M. Jones CMB10 endstream endobj 91 0 obj << /Filter /FlateDecode /Length 4435 >> stream x[$q18Hqi HD6,i 8ogv;Au׃l{9{S ],WrLL_ɿ|p2mN~8Q&vLrvszyŸV~&mVisz{v7&ҰtIy~wHIKJF!NHr;S i7~,9iJf~3!+}JI) eTn0MΗic';Wr4y3ʢsY)4fg-Y(& $S: 3q`i դ‚4%E76;eFx^7>;Хh' q1 w!@'1R5$MCLr8QfUj_ hvix!3ĐbD<S!&>\?M:isz<&NL6ʭ%u9;`[ ֫&8""{YsQq^۞u)A7IY*hAR6ymp˦倝?׵َ6l-NYZgw^A4Hڦ#vf6H'258fr_p=%,>$8ˁf[CR. ֌p>7= "Wfa\(!Cq]| sisDf9&Pj@Y@DԜU {T%^ UKqjBlrwN:) 1r oMO0C+%N_%xCA 4U>3 k] @`цAؚadU*vvz剁nI0ɪӺo`#lHs` :x/iXc#dgp00ekfQM`h&BɊ9du *A$zA?/*jQ"^drWL$z"M缏h1H21sȌЂ#b"n⸝GGxͲzrߘMQ w@0v #y0fK)!1-σ0rR!KϤ0LrUQ\Te01 &Ѫd\ i4%*;yTސAx4`wٔ@)[$,؁Oj\I)bc&@05@ȵv c2XqN24Fc4n ;k&bNf#!QZMID$G2|@=X\0Q핔ziD*HWc1iX[aA RU`*ZUǞ/0݈ ߒeiVkW\O sș23aEu8)k cB@F5D@!DV95ҝb6osyyž9C]a0 QWnIe醨$xq!.X^ثҫ4lX)vT |a |CJ?s  21ؐlqWL@AV[MP- ̅ wӮu7 j -,+)`Eo2C|xIPQdyAnsDv(k! Bjfy};.U\.{9xs$@?c5_ ln/k|CtCm Ac3{rN5C/F{ N&l#ڑlԁU=b4]e鑶&(|aq:BvqL_m A¬7.@Y\ˏ9#%o@ipr1;]do`Ц{|1onyfb-6f7`ra [Vr}:@^6}s鯱5{wxVvCQNúb!ݱ!u2mC '>)~C z URln¦/Zk:PV!` 8[<6n9\u8Cw:ҥ<˔8B/q硨2Yދr0uqZ5Ɨd8b;g-TVTg38vs`1չڎLbG4?V8r9oֱ/4D 9O:vuSJzc0S+Fוh4µ^ %j?f#qHB1/F\T@BRW"HzXD?8\ yn}PZ*_ni#-_te! O19=ݢ*!K,5/ ct G\E[AA4 Ri*]Iu jR͇#XeHývӴ8הY%|534ʵ9q|%NF5Srg VEW v,J,}zm5OVD[%»;e ܺy2^O dt/\(fr+Eh&kT#,qs%nJb,}w79cb@Qv@bc5gB@eܮVzf.I]0Ж8nX>`GxgkYJ~=5_v-L:նu)n.&6_슻 m+%&Yj/w+Vj8 鿓fU)/QQ+ik|v\?%L`| ڕ9=M—'E{5^m7D:Bl_T̐Z\]+dOJӅh$)Y?9k*+-P<$4/b1 <ೈ{Ѵ']Xc "wSn*6Ap<=yul]TVShC>Z=vJrAh~ <ºuW./4LK;v\l"0|]O]*p:k1?/::EQ~]d+<VrjK=yU_B@VViY,ӵK=S2wEm3h} Rrx(sG2ݯn$F 7xf&@SV>KHYH9|v$*s|jᓙs:w{&-ӳt}[ƩێKuˣ *֎$x]lk62𥑍#W3ǒr#1W`^92F .l<ϓDɛ>%b8gPM']7i/ji~`)+W)gkCR!r#1|AZʌAtzw~A^(Y\ ӿ)C 5-"^/zW*<1/˕Άׇt\5DC[WnB2֫®Q~@~q(1j|M5D-,< FT;5~mw.IFg+_G[j;XEb> stream xn\]G,8dO~1i>fuM$"ɩ/93gEi%ö =pHLz_}ɳ=5;mO_g|%`X+}VYϖG{S=Kz}^g_׫ n {UN.v{OUH×suo9Fӝj9n=7~I=k3;eLȓ+\UF7YeukP*n"Ω} ps|핊MYJ!t^!+ q&LSG~}J<$ ߉lӧZ8 i^ P޻lf{˯]zyO䢼K#iKtkQ"p%*ɺcY&&DJ\]bJ!3[$(fL`7r4ku*kIx(O_ <|gq"vFNjb)֢-3gq!:f̛\˷]`q=[4 |I:%鍙[^1w%nt3‡^UAl)[:T!( RTk)]}*Vpq$qw lXCQ+El]/|VS^ZYh2ǤMȣ4G`_¬ZRpHZO*ֆ+ɝ+qZ5+rrm4R0p˗q&M+4o@wՑ%6_j31'f6NL?;a~"[mVhǘq{ *V/WۗǦ u_C/?'#eI/Hy[pϨ*bP]1FF;y} }+֭A\ߜ; v&@g9noW49rֱd}LyBzHQAmn;8 imUB7<9>wpʛŭ)0~%8 9f$^o <'QA, l*&6db-{#N8'y>jny`c 8Ә.bdm<_`){M ?'lh7$4QhŢVߓ!<#%!H >ǐeܐx)*#O5וА:P:y m4+{@b]0܇IŲJvel˒m0DtMD`$ggwcְH6k#!̚V%isِz\m!!9W1|F%H7B);:7i^19H6.5%sú/DR"g :ܷ>BoU "!bok79A@)pr(z %?f֊eh-Xy!_:j_\&` ZUMk'1_l%Eɛd>cGN÷#j#qΦhZ_&:r]UעۛVVInjc`ZFWRVi }3B P!]鶜XD\~xA [1qxǫ"<6ma:m2!*&p֠X܈NۻD'K `5ypT6a^ M9Q;^]fF/M@os1qTŭ 8OAC[@Ϟ` QFRZN[o6 >Rn,6 xvA6cMZ"@ayURކ8,ޮm: ^[lcw݃Rr5$n 9)endstream endobj 93 0 obj << /Filter /FlateDecode /Length 1549 >> stream xYKo7 ﯘȨ P(M=aکw7EKI3K=z\ďD FIhTg_جgY> tNͫY8M YO065H|7W*r8o12*/~N9yWZx ˓j 5(X XkZ *3Ɨ"`6:ދN)eXWHEqRSԂP8d5hiR;t "9[t6*_|O92Qv]it&|L8OVG mEuHf q&6-k׬=cըo 7Kܲx)/؟H{%:v`#1,nF|fe0he0KzPب(L¨qDD'/Vފ3hj}7QYm;'5i%km-y8Viϫ#pn%t$t~`̀zR.z+.9 F(gtaG*u 2TAzݺ>,OKFQI^ ;vH7֖1jۧFRRܠ_hrɜɤ@,uܓ")ԭvht6➈ʐ i4?UD ) cQ&B0sO *_̶t]z{~'FݍQ[K F騂8^?73.=J{xZy)or'ZMA\lZMNӥo1!oKP#zgRJ9KU N_ٯ_qd>|3(ԦX|"Bv8MUWt*plXJ; /Vdrԉ;groF-,9Sc5Tփ.9#];L$!XRu;QG mAt Zâd1m0b#y$L !%Ÿhs8vJ= %fAӠCB{@OΚ?$0-kvh3e-N>ЪUM]}vf1zsW̓T y!ĻNsy'>Vg)- >ӳSZc I(U 8BۧjVtO96j4B(-b 4)9M7TiB[R Dt-B_)tcB* ҦF4*7scQaBǣեUd؈9`WʤyNem%k+IbU5؍9U=G[R{X< T6zpҁ asۖśqx˄ Cn7%05J_ĪF9KhFͮ1mn'VU~ Ls޾sggI*y|I%z<O~L?> stream xZmo~b/+|,_I@bYeҝ#q_gHrVzR80 Çgf $/VVj%w+GpdRѫUP).VoRXiSvH?1FDgڥu)RXnV8^?h%eq<F0>'"&QрAּ1裧-L *`=hDz'!DL6OtI5s2Ɠ+SEGB=WLI\x*LG^Hy4AHUA64)d˃ʨ"&;rZ 5Ǣ# x&`&$a#l,=1nU4c4ՀdetJ\2}g0q"z84('&."G/>n`xc^:1 o؄̈́ o>9>$Y6L4 o1a 4GfpJ`p{Ϥ12;` LhS/sUd)9C)LP5yEjiu 5őDsLKxXdϑ rؖWC0_¸ee}TPrl--AJB( ޔROzB,|e`AzK ѯ P@ib q.ۜN~,e T*5螕~WE3vWHTxEO!-͸qRZM0ĤmQUjڻ]+&qjrDJmU{^X 梨Cb$wkB6CqI+Drb*md({g{.Ġi-n߯7N͇E<>&4qD6,G~G3U{m/<&[leQ4&2&6:Ϛ(kk;{0`g"xēfyj|( fnWG&ʮ蚸&W&5h6ixI0 LJZJ㓦}ݎ7M72 Th9-\vEs(k4Q6Qw T];9;ClbjjdiM}[x;.#@Z !C!zOG<xOϋ>@4ѝ!̀E֙D0F`?(  )a0!taPAB0؏ ̡Dr OBiDvxHמ/ED̓e~"YdnC;Um@LSW4uRCRS֡g^E kC 뫓Xjj\zO#6W.:ݲ?lYn*`n}чgn][V\67uAvŃAknN%xG\xRnﻨ6u'7d^L%џ7}'NaO|˴}rYq 55_+M K7/F@?nPr%b˼|5Q拤7j"(h-gmɔ]7[Gb/-ENVz%Aqܿg6݆.%BD`ɩ̪\:lng.N˫J8ݸhd°(tͅ,ז.XMzrֺi Zw.hPƎ~`&cS- ܾ̉NG׺kB- ~,ڕ+s`aΩ3}sjHȳ|M'^~wk_A`"2Li9ewMdH'3iy1cwe7*lX.MD2jtrTi;Ziv} q'â?ct^f4~Y;%~Re ~'?t`Hg8,9+~զ~47(Hendstream endobj 95 0 obj << /Filter /FlateDecode /Length 2074 >> stream xZKo$5 o !!hn!$BY.).w*dӻ!%]v}hZĿ_ /nWb}{%ӯPG \WRrk2ժݟ8׈b-(կhE5V!- RVX?yg6.0!8ͫ8]9݀aRR oq ^ۜ`C1zGH5k)r>%dJwz]jUv2uhl V\ mJ%DoN&yXgf9/}ڞM8=<Y${p#p5)FHHG!?(<\rN&lj\ Nv_D=Ɏ#󰬡kQq]w4/ C}2hghe6k!Lx]= @'xEWGSiӍq/sqCnNJqޫRG-(TViy:IGL+k#Ƴ' nU*G+@.&N gp*#Imz3i :NJ1ՄZ& R(E4b & ;^)\ EѧQ+TRmQNFi#F;,peb; c*O0 Bc y *:IIJpCW@~:cC=Ezܡ,=m Er<ЧtyCbkl L+u)ΑI}$)ˁ};v5[i |i&I @ or6(n|y&حYn}ɞsR ` @ R/c5yct7sR9-I&]T1&vCL939XޏP.vǷp t^7'E<\.:͋ke`tч GGh(Ok 9ooA(HH&9 b$" kz]aPoz#6a.P+&ZJn)cbB3ER&]!u @&KS#C/6'͌n+ $IMB)k4=Igџ%pOv|㦛{пաjj7넔c|!E>B{ !^:BE9\<]:YJ# ^SW[@[ ixɒW5Kf6(qO&[u([0O߷Hb/1"ľQEP"BA\`'?nӇ5y+|> stream xko~"1/~quA*" PJ%Zd*;{.RY%-RR=FNtٯA'w{ V1z٪7)(t> ~}/;^Y.fW-ǔtdTtJ 1'ZA| ~L$?^k HD~ vož*8J5$:M#o gʉ3=7iSk L?Ұ 2'ktH'tNJX*ݫrYe+ t2҉.EP%4oK'cКpLNdeFp! 4s,$+&A-l9O k2mD TC%ҝaH_r D0lԹHMNiQPڦR<@IG_* *X}OK$ }SV[SXPYYN9[6Ң^c:T%~yHWUQK8]y W sEm'֫E*#$H*/=J*4]4}ykJ #<(آ;q,JLNt{– ^8Y蒉Y|1NBUO;l.QԙGM%[/y3TiK'{ VHHNR![3sjɭs:d~[=pfZELIu?y v{32.j9ڃr+dKg ABAg]b}CTA.ڈ| 1r0ꥪ/UzS+y俕埉,xc·{|>{0Y%& ؟|߯ pX1QX*Pt]);Vlb X 8XELP1T.dӳ\GQMqJAa 2Ks#\bJ{36ΰ{ .ޫ߻m'A/B\Uc?-+"VX/:IC=KRRu3??{c`endstream endobj 97 0 obj << /Filter /FlateDecode /Length 4169 >> stream x[[o~W#Ԡi}ּ_4@IXA:yXKZґ%˶z$m_Z Fhj\+7`vZAti%F N(!Wp|Oq '_.Z_q)au 3+g8 L|5N1h A՗&g q۫(l%.auUgo_0H['>4,}0#1z+t%+oA @ %3tp:<^q'|3 $,fGNQ7kk8ڭ3좙Zy8+*g;嚃6m\x:ѲFH#Wxseq\uZMo`N]դi ,_]|Fm4Ȥ]O뤍M``Aww1:c*=aI`_!"Hs"/*|VMIqw[uwO+m1NM%/*O+0V?VnǕd+b0T.쪒]..{L:'kGi.m6e}KvӋ1)U `#3EçÓ<>p˸`zV[gJxHj :sdQK ٴu%gYvɛrQ 罃.lk/*yصW_}~YMw|]R_4[b( (6Y2U̡HgTqpW'͋$S]L+H)a  OFʅUK~ldqO3Ѵ`D5CD׃n n(턴wgQ 8ߦTg aWߤYqAp/) ~aBAH'Uљ`=p1 Kk @2@~Wۛ4v`.>|'SCl0&E-li\ɇV)fC߭'Y17W.jrrր?q=rߢ)K K/ۃ)ZL7F: [ZBe^wJH+@HgWHQ%لV򼒏UfwMa'l+zP!K/{ϡ{9q%_wO|ZW5(( OYp8_ʪ|wwG\hkL |"/k5} f)mWj^U`Kq1,Q~"D@.ƐR X$el. 6wK9+8c1 Cv%۝w+Lw6𤒟W")rz@t#]<߄m=,<lGuݾ9;l=J.i*N z>yS$";"\f|C9qKy$ dNN`mxCwS).cl)&H C89[#x!g}26Ҕi Kaa=b 7` *| !S` x;=ďJ/*k"Due   F;7eg3Š OJ*`n>_DM{ל$L-QxRᅒsсQ#@^VOQRIC k#Ƞ9,uA;[cFE ̲47Nqx4  4\^ 6 a Z= UA=\'AJ DԆTr-}ٵ`.ujY"WmDpHA-Fsl$2EeX%jL3lܜ1%OA$gb1 d9%yR5 ҽ$VrfpRDϓ&PrIxrXdiIKRťf'6лćSZ-H^I~pE2atL' 3}UѭKT}dKȱMhˈBn0mه˵D.w+FEߘ< \*b3K;{p4Pq`=rRSJsE@gGw܊xI"hhT>gFޓ),a.;ʒWhƒL/Y/^hO)ͽUÇ0:ћJQ>Qߟq%UߦQyj3F>WޣO:a[ޫJJC\oWF%LaE\Xɸ|AsዕDLT3N9iC/5@Q9j}b?ȣ'HVu׾v˲]ewQnwl9.7q}Bre@5menl V f݃S<(1T-P8m%9;9uQg;E LW6EϬNe~3Տ ~<^aQ^Xc3"tq)B/[\J+cM̀eٺo {{fǧ'` HI&Q{ gʅ,Ci)%Dr󘓍jxT1%Wi/R=JG9S\ubcL \Eiao4**@'e>%yR`TJdRf:G}Z6Meatȕ \=X6tt¬WUFdeL65!MϿ$|KɵɫofBrPInb T\dQfQ0[`0GcSqZXl˚1gNm%$|]+Z`8B2)N2rp.qG+ޘHAv+#n]J~S'?Vl~dJ;6vx&{,V`ǸoA7p %?DLnl? V"lgW74oʞ/) ru YOZSռ/=,EDDdySsx(*qzNJ/SA@6M.帧I:o]]uVegր/WTOSejT%]NۆՃ֐ Vqz& p/TX7^ ۄ ͨendstream endobj 98 0 obj << /Filter /FlateDecode /Length 2356 >> stream xZYE~a}DH8H0"x//65隥zޚꪯ⭨x.fOPxu6תY^U΁Hi>"e;y FE-mu(Z-:]Xi;/nxk=̲ueary\YϮ`%4.J; pW"/# 'n7&2^Is⇺If) xg½0؀4: 5;&dJxP6Ӎ&8LY~ `kTi~;M,E~TȫghGqg/}F ox_ &\EDL~Z z^:!<~qe IIa7rA"M!OIޖ [cC5P=-K7۷ܩV\J|ZClAv@},V5&ƞQʐމ)Yjob۶Bnr $cRHǾ~ZCKvv>XH=뗋\4u:DDחewSPm]Ce\/ 9;Z8 $79͆ QUw42q=dIuڹ7 ˺Nu)ǽf4TS$ 7fYTz t!N%(!{h ظڧƦ,MG&%Loc^]PU[ˑߊ R7ttwQH47<'yʺh[)$?{H&' &w}2l7e߬_ś_P:׸<]C`.UG|_)1p]@`O')=*z(v> stream xcd`ab`dddsu24T~H3a!#G$k7s7˦ BcG``fd+nr/,L(QHT04Q020TpM-LNSM,HM,rr3SK*4l2JJ s4u3K2RSRSJsSN%E )Ey LU  'du˿|.#{wE~Vw+.+֝a{wuz 6to^7%{JVwtwlwLwxcfcJZIz7ߏ?X`g!CMt j+~e̺m3ts`]ItF<~cakn0Gq Nc;}wn9.<'|gXEendstream endobj 100 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 2874 >> stream xW PS1$Vwo bpiKPTp"K@-OPEك,-Zhn^ut:Rjkgμ377$9-'ʦ%^ 6Mnpq "M(Ӄ )@\ OM5}l,H<\%  G?Be*e`TuvpTԮN"SOQE͝0I TFjd(JyX},T튎 y#)9?\%R$*Zܱ&x{gHh{5ZEާu+@-R[EbʃZBM<2j&ZAyQ+(ʆJ  *\·+66"wQA-N0S`ז+_ٿ>:vw,ܲ*{$BG Ό#=?LJ́h` A= }l?BGC `} j&'n2<h'P;uM$ȐvI;vٙ(DnC;$+N~ ?Pz'&s2D~=u8_JN]<\ǒMsYfnIЈXBU9G2K&4tGY#!Cm+Rc | ]媪 >̻@"aGwy~S@c ۓ'N%i^I y9><,W).&\AlcE}!.bGn{:Ϟ=EF-1 eR3!QkkMVzȓxbCQ@/3y0Ve8Y*&\rV<^Kѕ=}Ƹ 22wpcVF=^1K"_)482ojis5GLyh]sL2ۄ|mȼTo ;d=uÉ8DJk<5Vr3zC{nkC~Bbqć|༰}ѳVk Gl!].3|61-=4SAH{P"7" $ <&yzkG6SccJL؊|1tc0B"&I Bq]Pt=HDi8_ 4K.Cŧ`(2$^BFspˎӗ,܌:6cq4XœLpP\ ̦yYl).Jj*j>^ӗ7hkBeˢ0 ߡUIc&4[8-4tp"wl0%^ly#'?q?P߻6hJ1F4(ySy2̓yɱd4{sF!Jfpb̛֩2j[4 {ެ3RGē Y"DuPҾ1@ lTYx8ȻPŗ&ŊR,t|bBj^LܣG_l/SWTY-՛[biD?Izr㡬gQKtF;zlb4 "m@ V_y1&d-,b ֞z'3.?W?܅ފ7}b涐&6,P3@2/Wz[ܕɻ 잼2h`5;5îSO>V=4IpГk0BGb`D7D9imFNVN'%ˈ?+up7JJ+Ё +mYϤ@G0\v~;A&@ &gz{=kxbo/z7_Ir{[}΃wIHpoIr4>>Z np=/T7֒xy=1,PB[X|Oz_Nփ X_:IF! MKVCNl:TrzYW$gG@o"8H]^p#|}z876]&]\0썭LeҎ)%B^UT"&[ h v6Uͅ(wȵdendstream endobj 101 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 7480 >> stream xztSWºX`seJh!SB !nl܍{\dKڒ{dM61wB6 ϼw$$^__^K˖콿>ك+:M06,"_6G}z2Go(@>>81#wF: (8(@/G[^H#W{zQlny[B.](|q]nˣWD{x~wu~7l 4q)>:tr=&ϸcc[5ZEMS#]j-5ZGS j#5DmQ-|}j+F->Q)'j D-&S˩) Cj%5FKCER){@ S"vRT Hl`m5O zSIZ0HoK­=lqً46Ȝ5Wt{7ω+Vδ|[Տ'mMvΉ (ɆcN;.kaÃA z>X:fߐ}/_rαcЏ -h6i8->2pHp )SjN@²j(\mFv>DIצ1;̵i^#n}(]&ƶc3ej1!=t< {HE7h8OÍ˷NBɓdypy]#RtS#tVW>J\x?D?7@fq2AjKl>Bb+dF~APsȏEF}qXcP/áؙCa4A M d:9C n]f)T9JB7o5iծ2E+Z$hMЌ78f{}(~}4alD|ӷ*{&Kgƶn #{JgkbӵGڹI]8un_$^j1ac;!72Z4GKC#Dw,$D:kB h#Ո3jB4uQ+') #9$E]=(10YX cE}^_%Q6g)gVח_?(>B߰%fYK|7lQij`/^ ,wsM40WPi8*2B`}XP_Pߜ>Kw.90L5F4@vL%пAa>x?z6J]^wS㦠X0+ ؖdrcا(@#601kϩo8E*# H`{:R3rNMY*=.}/%H=srį_RxzPcվGSS'3Y..lY8EzRr«Hl- JďCk_Ɠd 3N?|8P?Jz 94nȼD[^HƇcic[X omDGQ;p'Nxă%(ɲtHLp|48Ox"vnh2JqgWeF4JMhN4t.?EMx8Z&RMtH4~Yb՚SaibR Λn폄|ۤɿUDD`Z"=N(~qhO8ŨUDjei+!:hD^}!zCmm[(cY0Q'@MyK߆<"9~mmL'슬L!Ʌ|nw9R|/MB2H]cmVͪdez]c{zy!ơU@K/@0>+^VGpm]l =bˎ JɲRMu&!-eZk?էMtd fe8BPPKȔfGMi.3>az(P#;}f6żOMVfя'ܜ!3PZމ0ĘC֛۞W_nmݑ [G frș&ŧٳeK6`/r^)U5lWKpD7-lbbEa<G 1h;7V#'ZY*eOe47';f'򁵰0fE@2&%˸]f>bb}Vrn$:znvf {!ve0Tsk1 xElݞ=+LM̰UBI7j+s`&_9~֏fŹ:Xkmmj.íҘUP JkjS  j}0/99.lm'5[TuDk"j wk͊#6/Yw>3juNQu#>Qܺn35,"9 v8F3U"wA_rDN%J*wZpo ]^~|*ÛB JYsDlHnwCѷ\I䣘@Iο4_&27C}^J⾐Dh[uᨺިE48kT%1dIR)Gb="Cz29kb~X|N}ZBxrH#LT)#%LUTID4!Хȅ}NUrja6Nlxy腂X4n *F]!&,JWZ얏q0qWx \գ>yyI 'WrA%z#7Nڏ\ F~AjDIJﲹfUa S ׈mBlkOͨ",%9g=ZWK{r iEm.3;.ѨaAM;61l f ppA؍&QbHwQR'tqH͚= .1dѿ^k(c"\RG>NUPUt!<2&b#Z—ҙijU>7Q%a^*j|y !ٴz4`GaDls߸yx'bQȠ3%^% hҒ%; ` xE4~ tAh>?E O?=-b.1=:˜b]ewƅnazfm|\ $2V㾧 ]0)PK!DWX4K ΋GE_nURUXǖG"4 nuIqWW ihlw==P 9dxQQ/6Jr *jFE$)' PQk ާ(ٕ+7c*$M2*hU4$21%yrw7έM+fE$ q~ˈ;((2E#[磷n6֬OT.LWؑ;VrF)l#X8$/!f*bߓҶ#Bj =f@&;2"򻪁_Qz͢*ԂǨg:~wQ $؝->L 1jzRSDŽU7\C?,`ZYyN;|q-Osrw DheHUS9ߵ&C8ui M"?NKև9al?5hvܚ㊋&U^ (5g˸gsjv^yDDߣ5xTYH++nɊW.m8s^n暻#⟙L3ja:Lf ac?{Z6/"G 3$*:ȅ F7AsQmS_ئ]C@DxYv,coJ7:1ߩy#ulvlQsu?}s׮҇w+xy.{ȋ,3U)0Zж^2$/}vTJAYD:>LG)Ռ87͑7Gއ_Å% ,;?2*2~TH! n' eNC%-ءqs PcXh%s^[߀oaM&OvF!gڣY7C^dwr}b5-hH56s?hK UEW(A*.o> ̓3e.2AE5hiIq)K ̋Jk;Ѯ'/1W_mj!֤3q8tra0NHkB]%v*T)pe*RUĈ;el(6/, r1􌯤1d=LS.(?u³Hl<#K-Y1A&M'@m7 Mg'\nYIjc]e0:ȊMVΝ(hbB|/Kh gwm&~΢Զ>D dFo0KR"M5r xlg}VI2$AJ!([K߁v0nω.xF+QUnޡ 9%`"XYcM>XS"1?}fSKPv p2P>=~potHhhiH(/BZFW$&*{_οs%s{Ox.+`;3mI%(k!Z[d3 l'ϣF4*fj'ʒRSܖKBBXi\U ^3n\;,]KGҚ+8jP;7)9@ KdpF~<@]*;:w6$WuH^pX?G&͒#uvhA\75ȯcb}"rNTT((> %fi촌4ٴٸJeUfwnV:BtibJqdzм=hz/zHVWsqD,$&`V>{ۜo?XLV6[ۣQ,yv+ҲpKG6S.%#OO+@Y-~)< xIgg=pGQ$fa/|VFVKiMCީ#Cuu5C ~d xj6G=~{(;]+o/ il2A|OTB`و~x|]SRsWʃ!J((;uxf,x t&X,XbU^ *Z=$y( >]ȧЙ.-2*cW%O2BB3N,OOJRpo@&2¿<48Ҋphǿp*: {(瞐߁u׾׷7 VPfG0'i3EU+od"n k'6F'; O \9[7rG筃ٰLeƭ tMC1Mr$ @<hb:Ltͧ;a/yuO;) -j2! hA#zi?}) ں7endstream endobj 102 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 1197 >> stream xELSWߣ'֪Ԏ9"?l:A43D0íjj(öPJKb</pV!)U'f-N92e.l-7?s?{hfs7ef<&iyAP7-JP)@{qAxtFL,E)hVu(VB1E^*ZLR*l68&= lR-$nv8W\42f/Y*Jfadw6CbҞ/6Kyd6ۊMv+EQ+=ƬLz* TKT<-jHߎUWqG#0I7Kldi?}`ÍDEOq pN=EOT%9 :Ŷ㢨3`"Ih`ۯp\E)I5-Ѽp4~ T'hp7>Ң%zuz=Z!7a`fۏQ;VnO?^3MZLJ.`]tJЌc J}O Y yFl wڻu3p}Ns8 I`gy8WuޛP: W l54|kS^Z>?p}t4iƋ{:*-o `x*/ҒVxPu燡/E솲J[>7jI=۲d/Wª1πE·/~gc2 7 ;2pju[Dn؇nmD}Ꞿ է~$p5RV#_I go}.Lm*,^d "+H|TM@^8<}:1Iijr`uQ-a{W{GC5yz((Y/<(Ca:s0g+pR^uovBoy?#lXKX‘S1 _t46ޫ. iS~\Z4ލ|>LOsRSǓ?&RI < &z_+Gp(gxE}3jWo{~C.v_5-S9!DSendstream endobj 103 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 2511 >> stream xkte'`,Fܙ.rTpY" VV@.i4I4I&M2xC_h10g?4ދ2`|OVbNK|eҲIRSJNzbԤb$[$MJ)Ņ"%PvYD,MZlR)ju8E{nyrZOzM\,V9I/ɤʤWE[եz %J")]#VH1 Kʒj˥9\Cۊmv`;]c X2{ۀm6ct,<6gͪ?o]sOlL\Ÿ/ǭkeYͬy(oOQJxhog?|صO&{%myǿ8{&0Qn#Lrmpm$o&lw٢1IR[on 'tbXvMKc v_XSkvų.|Ƌ/^X.`bvw?A -FmF?тɞ}zdIR}gR M0cGA4 pGO6h`՚hmߩ/eh xNF~wd2uN Jxk&e #F؉,)9%Nz`\x>R:w =ڋG>H^=4uǘ$ l&9qfh4o;7 "x͂ǣk(JkyoQY"[JВkb{вZpGT1**1OƖ@SQ +il?eiA'>D^ra_t6IjE74ՅfAXKQjdkd7yj?q0z %]f%G[<hCzWOHOkoo&wY"h}o'菥RTm׼"ZkJbtQo1$M$]`{?pemUjb lXfumY1 (累EZ!}+n z5x?SL!(9Hو:+~2/? o@>xWETT(zk&eY%YhvI1ds 9wV! e0Hv~bBL&{a0`9䫁_wx.h [)=R#a?:s_2]I9+|Q񕲢QYh& Y=n3ߣ8NzjZ0ޤ VXg H޼_Guqޝ7b.5goٺ-F! q0Шȭ g622-\6=LyDXvv_|&EMOߩo8}DG8 3cP |*n"3)N,3UP 4BCjF]՗G"ލepX?{ɭӡW^;esXnK#N G&{ ;<ܾ/e7:Y͆K}_+Co%bS β" hyO;lغG ȵ=n&GH[h/7Dd-WpbglWsbwb_9"ݘeQ M}FA6=ЈӥB71re 3o)0Aw(Rc܎b9[[Bz>pA8B.Ddug?iUf Y`ubW)Ӝuz'zH(_eFSmc[Q-Nl=Sh:nzYBF+E*}s{ѩxq9 9ӖmLr4 @r#O[}㈧$tq +Rᘹa+v);,tD#y(у(yTD+mϡjK.ǟ]޶q}e.fFYWi%cZ0Ȼm gH\;xock$Du՞;V XYQA#ėLZӱ(8'75Tt/`endstream endobj 104 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 4698 >> stream xXyXSw>1.5:U{֎vS "[VB$_BB  FKmݦutmfێB3vfx(?11~Ut6LAg#L?`X9ڬl(U$qiس+WdgYj&_ ےLaYZ-Ҫ@NF f=( )MN;,SC}}GT8M~suFX*<&(0'(Ij[ ԿƢ42zs\:(e(-T+C,ԌXl稏4&n1 fDP ͡!yOFz=*]h戴 CF5W:":ҴDS2PSBI=XN]i͔2=P_ahq(+TtDkca/1]éZ;tY2_F3I ^%P d>G*aQuY5}MCp k\Q/9)0CCFߕF9>z=܊Z0t(ANKk@<Ǽ&-GK~A_7/5}Ud r5nYf^jH͕yh#n1".._Lm)jhp C؟3sz}&r)*M ^'Kt8B"zԝ-AD⡗I}uIe\LӃ]@6{;w03'"9YMd_iDMWތBmt[|+P -}>K*:>rb5)iWbs?tfj:EWG8gllLFV-csZAF&^TZKEpA c \@GH58S 8R㱉c]%0 .`(+2G(a8gy P ZCrM8R9_xY7 :ۿ?˗D䒹} C"zVIɖK(ȀIJN`/'hQӠ $[)¸_m8x:pzē!llGwm^mPbXh6:_t׎^DZ6+-ol{yTc};yeh0 bL 1b J|&N5k[(3y L7?bf6Cpt p&\QAP44N[`%&f`&rk JczS.їgeE"&X瓖 t\Nr$g8т@A`m< $ʌRBZ a!ʕrD>p{ \^TBi$,6O=W|lq?>8%Y ulA*L<)c"4otttCxI; dGG{q[;k#d9Gڮtݠ-NH~"[ +CMgY ~y͂c?zΓyQq@y7tUOe 'ƺ)~$CY2^cGD++I*Q=If\*fڍ]-OӢ:z ROSXJNkNf)N/ AG0CpN#}鼯w"w{^RD*;q;﬍̬@*a[?:rEjSDA^7# nqc?5}oQ^jNOffu^XX2:mUT=Ѷ D%\X/zffih@zZ4Z913n$_C/FQdKdz,.:9Mn39qMV׫J($7I=\A}39ߖ f*j`J\e5pqN(E1킊<5^3$D E6jCBY:}[i 4-kS`Wy*/qy[E̋%3BϣP({?600sYƴ2{2Zh9Ajl+hHuK2''?x֓8! "0ћzM#PCp c#t `[؁Ig}㴐c^[L6zGI>2d ^oߞnFB$K rET6aV æЕ)HɈ;V߇h6o`}nz N'< ?).ZA+lh39_ jMok٢ݴJ&?w2cg(K0*8,j5%lK `V2ע?N)-Ѽf&j Ul߻ȨShpóe58L(goG A\Z5n^Br@ ln m(tÊOPz֦RU ->G2]0gzІ߼}fg7Y;th!e\M@nO_~G^$CońY4 %i9h>ZCGFK>?$Rc'WC]^CLz!(}ES:n^H4yoOt˨#˰FI-E:5Hj{|m/Ca)% qklwei% ̣M%+ xG8q? ӢՁBP4'Gᶊ2SSS :<^5sKeZYm0ҟ"ue YdJDzf>JzP]\`Y[*kTTtPnmy)-QHw% %FV}JXO$0[\g1pkZ_Zܜ2{e2lr'e?ޝ~&7?$;$32,^wJ+p|幠XWQHDŽezρfPfoM6,;/((2mN]Ln;pN/Zbw9%|{n="cݴf мm 5`R(IqF;qIo\9mc!!`HSGe@:pWɐC0%]R8ѻWyA妗0a?L^&YY1[:.gcOJDC23=F︩41FXyРsЛΦܞ;]iL,SUtꀴ7ïfu,w?,U.f%ҟ2ỗXm^96llzFoB+rpzkqMt<}?K \U"xjv[:NboBj*,6WSZ|B'_NkP+^d56/xr C43Op{rmoe2ow|M ެV4k6 )]FBx{U֑@V8AHmĠI`/o_ C~F-.3iMK & 9cAL /PJ*uM_hkP zUZe~Eq,M5;v#?<v d^cnEC=>ku3װys>~5hiGVo .}iQ$,8.gP JK-zG3O]7'CNv+Zfuoi I) Cendstream endobj 105 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 6003 >> stream xYXT׶>bc< =Xb%EbXbAQ2  {H/C"ƮX"AMl7&hcILn0Ln}e"҂D.';J&['c#k5a@("Q`H‚J~̶'Ϝx)&ʹwyoswq{y~U6o~l/|;(eso{ٯzl_ _ao ޫ||WGNxs[y{ 7MΤ&!5zZA͢FR+UhʕZMRkq:j>1@R "j15L-PNTʙzZJ-S.rj%Q,5BRvJ (EޠP՟@ lE$%%~ENYCJ|reT+L/藒TƖkszm>G[X?軤oMo/0w@g/UK }gK;8uClPw[?lþ.exPO@_t#|ĠqUj?"P۩U!9JLILEQ *^ХUA<_`:]9SP).AI3@a¶tצЦs<у~ ph7jP!m6`*]Hm~3,GLaVltͫ5̛`>/~lNt-t,Xܪ.2|&E#HDBK)S;W\]>avwB!(ix~$ 5;y|SQw*%';$)C^(T-ZIwP_>G_ѩ {F!`,㱤8+~U+{,N7SIN*سƍ=u[kVXxcJ }KpWyEUw(_O/`W9ѹvWqj&a!ң ~:DQC3-U.s_4$ݳ`A X]>o = Ջa.hYNoEM{QE;[9<| } ݓ ;Scۉ :H)atYf@ᇯ 9uxZxC7DU )ffFTqKWQk3i㪼2.49/18c%HV[nZ<Ϥh t4~}>G`VOvUs)$2fax]a352]7n9Q4^>\X9b|⮆t&0W#ՠRܠ !w鮀% Nv4rP)\z>' ;n֚XEN Ys@u0e6o62$,4҉ba>HY@z"eӌA{# +C(oc$]:ѵXLji9ip8vs"=}fRXTedfdb*\&]gw>P6pԃX'*b&Ñ5d`$eM+o?ƧR䚨cvyX] 0`Rpʪ(rq / yzdw +5ʈ/EgT0?YLgsV\BFD~h+σ{-#|MDU6Y͡AqګLU*MIݍ  6&#PBu Vlg\@b)S!?%+JTYe5*ohe//%y.c׌yGfBV|~B>*@99Y@VFDUFM7WiJV1=@nA)Wn6C IH݅AOWdrTĜ79\!y]W5@uD9o YShiK-ðh\x8WVtV[ǀB*s~x+[VpBIW =; S՝*i I2!PMò]^ũ5Ȯ>?}?/dUKzfaZug`j&tz" XMjzOx03n4q?l?6@K+,Y:.CNF|˨/7.mGQ,-ꡖY8.%t'>iv ,CފsةH>} GgQwBC]t 5o$;-G.haUASP` e'ŐeP~f8}sT%no*,^"f.fIŸQf"XeQ&iNJ!)xC,NbMӂWË׬ٲxɅEًM0ACŀ ݏ9wOm\rd/6=e1n\﨏 uʄ݈)̯ kX>{U 1Λħ(b*&".(*F;P 3r^}Ӭw(uhBN&eq!y ;pxnk|7,ӗs:tO䅻'8CBR F`p# ~Ā4"Ii(KB!sBa>I ?mtևКE$VMf|at< ^lNzϬ[&)wov۴co! fY3Nk׮q>K27)ٳ?MgWy & k6kF_4i>o[ 0MW %b|k>IenK }U wJz'=#vAϔɑ0ҟ XOO-Y|ղI33i٦@{QqLfJDJ&TQS]^RX<8K {` lIhmVAmoQRRRR3R"tzDjvJ a'yiN+tK#4DGH%%2oa F|JJLh 0_w4- 2qk:Xih6QH˺t`Mjxofx rt/o۰v~WG[9۸~ocIyC> у'/8jٸԪםݣs˖/vZ5pEPQ %\fӏ{DN? &}slLբjY.1$}a6h&ӯ퀨ۆy jX<1PTgdffNJY$S.$ʖ`~ 'D,֏Q3H.SitA:kkb'1`))( %eD8u]At"p[dk|=d~~;W74p_~Ht76Hv|{zs!5p Ϣuhƥ1r`q-kkE䩬9(<78?nAQu1_N}QKS<.ٓ|RU.6>)E1Dk5U_^ǽws]zd[D-Qp`nr}:q@nC`mv~U,36jjAz1"2k%6'>(}ȓfdW ΝV(!Cv,ѳ3HgT`[1wfU,1[lQpEgCknk F,QXT/6zI$(RT\c7JGS[kEb-AJRYӰpCxA^x^?~;W DPl,M 5(x~gR|~cg=m}jB%ZU+>"8 Y{Gy{mDALyAiQItn|' ٨@u8<`AZ3Tg SZKQȰĂDa脨DKF8p=%( !={ОܺRjЫ{5xI߇&v2K%~Y{9p2 _mI(R5 )tKD&(ŧ`mr_:ٞluZ*ﳯv.NfNk#xQ j Lb7yy&~Xկ+c' ł۫lv4DH )+ zl>! 0Gl-Gw i <, bvH[310Jh<~= t/H.w*,1::6&,%"542ҤYp$&0f/&OX sh̖zp-ֽtz)[endstream endobj 106 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 7285 >> stream xy XĘqֵv}k}D; $$BIX]ŵj۪*jvZ^{O4(3'gNxD.>oźO#t^g"1磥Гzvqý>K )q1i!ãFL>}萉O"2-6:!2 N&>36--iƸqc#R Sbf6:5:%#zOBabZȄ'}y„蔐=)Ayp˼ R.J[$cifhrqԊ=+W]&vmܺ7oL$()SN 6㥗gΚ=|mF3v׸"XEL'ˆ %b 2'Èpb1H$6\b 1Cl%cmbO,"&bxL,'+JbO$^ hb1"Dt%$^$%=DOyb6ыMN!ۉ~:B\ xOtAAIݦvkSs#?zN׈^MC{zgs};O Y/LP>pKԠtg"ً?> " 8tCׇB> 6+,=^}Ĺzq.~枯q/hM (RA>qmP*)I}H@sC*Gd& %I`bZR Y4F8Q$bɃP0}(qcnz kp HRvw AE͋6e^o&ʳyϴvr3 jƒֺSguH*Y-ےϝ|%ᏼwk4 557!a·T_t4 Xnm$t"Q"r$,; dOr3KRϧ|z{xh bWҰ/y۲*sy6t>3E;4K{UM7nl BîA}QOl7{0z.?Go?fv؄5Ւ4Gɑy`-qj-IBAP}ӕҤNѹxLHf?გgi&y$wsEnW3Ψ3=eϵefBG6 NY1=a.4UcKU9rj h59 ʲ -{'.xPf]B%%4Ͳnf8$Kt@hzkcMI`Ҕ|5-w8 y1B{*ZITfɱwȬ[Ԣm7 C񝶝sul:l5; p N!FU{CBnƑ6V hujVIm*@aPSb<}Sk<~CEIxęq}pǿ DKF+%1,R\􆱖5MkA8'򓻑 y_A}†!ȣ~~ Ɓ?C~&5B?e/yvQ9CD cQw"TzoooZ,W[@p%&׶n7w [3ѥ~o/[+@$HqEfjDLlג˱_tR橭0]>[>ICo $Tq]qMkq@t źRP͞a x_szx]NV]K/r W8lLqYH[(] rAf捺v`.`m|@#%k%E">:ڍ&Sb%Բ3uZ{)Oj)8:~EήVƩc2svjSLa6>r. G8x_DxTW*hT C(4YH2ه[O=acp8Yc7tʇRR`۝{?Xwc}gmLܚ ;/p=풸 iK{ݼ;ƷkzjWoZ XY44q@1U!ݽ|&Kk2lBYqG> 4ω )l)*eIH _8BŬNb8J_ %ѡïN1>s %іRS)#g=Nd'H`?礂2?lNRT43(m{i,%F"YQ ]'-N(БE۬ 2q&ʏRE Ly*eV؂uUb(l0X><ܼ Nu;pS8&bOkMGP \>5'{V`h?95pc8Cbo~kcpBՏ7ҡF'-p]ul}hanpQyT\ P-5+ [v yS.`hv<a۰z h_4h>>0K9}V#*:yh\(|Ο$hC2 ǵGԅ-}\z+{>xT$ukȿ q/&SwXT[yN1%.E%yv=?#ՠ.+!>2pz冽ey=>Tԧ( Ҁ55ar)hkmV[k$ j}k棠8(__;J`dKtVz2r?pxʞl'9ݎBa<~c5b vH.>-4$9< 'g3O>s[J52kpzsV Dk=`ffR(Y*1YNLlz]~ެ9ZAaA!1Z `x~Z|LW:Nɦ"!J(H0sFTX̋mYFSC}jO݅>!廷W]J*t&22U笪)VZU&CG_O,G%< Ix,堰Z_\xyO0`;6C47|˃py_0 uu/]s"2Z@NF|Dʒīs#Tt&K-HԒʽhg3kz)6;.aOXehOIr'">?9̹tzMײv9eMҿ 6+j3Q~C<-Uwo}js.hԆcK+fcv:$iObFDt"7)AYjAO|ʋps+yH8(N,,$A>щDPnNd6#B$-oJi"@)>Mn8[X]{_Dd iz%Hœr㸔-6;pKMno}/_z3,i*}[1 pwcO^ =.S(Af׹jKO<w qs d}Dڐ|NBhhfъm:~d:~K{&̛M;'O*3Ѡhbbl^&s4ny1p@n4 "PΟ1NDPgY~<-'l9{60MTJUlEBVitm39!5)923Rz7]gp 3P4hWgϬaffLZ P?]]ywf-3^彳gyl׮6zo]wȚs_] ~FvBPrnZg[e9 HD[5R$5#`_sf{^mVC 1}@dXLV,Jaz|08Nv[ynZeY1'.P@7+ϥ` MC/@v{slm<,y<):XlϪtX ' G#6l=yA۾NN)kϴw،9p$r:w//ӊ[KMw=ۅ˦ mŠrKy=F"y7D .UT4zDl|Qᦎ/:x7D>ǹ/i l<34vx﹃Hysے s : $r,il,Ml3SMX. .,w( &vyW< ýdi8>@/LHڂxD,Hslԋ1ꀳ+yw|0?!d5 ՙ.g$$bEF 0?!d* `gWDu00[tp6iR)A&%+t터}gDrڌ"=wкB kJ_[0CgOx>=uo<;Fwl2nSorU|&ьi|Y.f.͗=la"kq!tX}5p/А^y/!EKC/p= ;^a7NFE+gԫl* ꩒Z]ʑ)c%lPlA`E6^Xh+392VXSvсR')XICo+>[tMEomܿa9m%˦gd˕*Fc> stream xcd`ab`ddtu14qT~H3a!֏Hnn? ~O+XX_PYQ`hii`d``ZXX('gT*hdX뗗%i(gd(((%*\c8)槤1000W100DGߏ˭g<wC{mSS P$<8ߕOZϸG3?DO1J3[og]l ?)﷿77vJVO#Cm8Bl| ~L`4߱wq}b1ù~O{*pendstream endobj 108 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 3285 >> stream xW pgm![4 ]+$$0 a`9c,!ߒou[e#6!l`9H&2L2oOmo"ݪRuI*{}O2*b%&\na $qz5hf$D!:"C?tЖ(LV3,*(ݓkn%Kϋ&!aIuiYuA|ħUk+,j.Xg/*y\mNFu\PUnʢbV]([]ZHQԣ+ 2J˒ջ7lṂ+T*FJ͡ҩMT"ʠ^^VQI3T2,ZDQ*A@"vYSI5k#nEZQɓS)kFL8jUԽ˜.{IbGF[R_?J.5&+vY`;rJVoy!?\{SѳܡH/؛Y^9*o-27p'bYU,4^+#N+ ȤrT~lϪj"n`*,o.fjijn3Xkp-t9<?99=:pPp[z6o`=>mvAJF+JX ѱrɃ7# 5>;r؝]?u;x1iPEZ}!SJ[93 V3} 'MM}%Ik*}p_gLdƒC@ں`Nq,/ Z:qHY-GGuN.Q.+˩:3h.݇}D&5J@{_v(:* gKx{yMY͙z=kNU:u@yxf5>k5;5x믻b=V ⬀t=,n% 8iw4\ B l׈D햂Hπ-Tk5 lKFS:%Bh 4^ K,Ui.ըn?ڍ x2TisvBuԴ :@;ݭV*w,|?)J]odo;rtf޺ ؔz2bO=z4xvI,L^Ƽ @gD!z|N 5Zs'Mqx*>{΍so{s07:-|=;(1 xy*ep!h7.ZgHr=#>Yg4=h#0xʼ`Y}1V!*t z з`^'ml,:OAdȺ\1P(S-_xOB=C@rEz-TU `WK_ɘvXec׊t|͜Y+\L|®W ;xӷBR_"Z.7)?AQhksMeffv.P+_~ZB$bpޅ_%/GSE.:tWG"t[dߦ5Jt[^1mLk=%4* k @:o[kX1+ 5&>cIM)yzFϣk=;C?i&GqnƎjuЙL(oܽ__1s:|r3oL|n)tc? \w>!n"2+պr/{y#d&+X#MPEjȭ?5lA0qL\ AAtpoWKiRb(jqv>S`'A{r4 *ƨ|ܕU\YYP_;&q~9i_K(Ώ8ND%ToM!] `b uVh'A ʼnDPڦ!wC_/.|K0HS č~Y+Gf`@[Eq 85ybXo85Zό.5tp?w Ŷdz[K6e:Z_c*aHMx=/5[]r\5NQYjc?&G? ~> stream xX[o7~?bӞ2K%PJE-H}<$is$_ovP(3x<|A+3h˿4]pz2!mJ:ar55C4Cࠒa{i ;uۃzNx8YϷdmZe5|N>FlpJ!XRa9}2NGeKѱ_vԡjk,u`2&~7* R +b9YQupb8q"/4tZًF# Y;6#D4'﷓<֝|oΎ/n?pFqQrFwb6Xk#p 9Qoi. wEci_sM5sp1DU8^P\h>Tymi4lQ78yP.7e%~K' w?lnlԤh Hr L/+BnkbAJnGFb#\`R63{'نN%'Ls.MCi\F\2Jgf ɅSnr +$O'+庉jZrR'>Z156d>ǽYLgo%t,yTG'ӌژgjǷy\pmGĶø󵜡E0U-τG}B4?_oL0a60eWU|6VU_ V**>u1&]_ULUW.x\ų*U񤵻unsͱn͉֙}q}̰St$ N^}l]e nAUxPEYkz۷endstream endobj 110 0 obj << /N 3 /Length 2596 /Filter /FlateDecode >> stream xwTSϽ7PkhRH H.*1 J"6DTpDQ2(C"QDqpId߼y͛~kg}ֺLX Xňg` lpBF|،l *?Y"1P\8=W%Oɘ4M0J"Y2Vs,[|e92<se'9`2&ctI@o|N6(.sSdl-c(2-yH_/XZ.$&\SM07#1ؙYrfYym";8980m-m(]v^DW~ emi]P`/u}q|^R,g+\Kk)/C_|Rax8t1C^7nfzDp 柇u$/ED˦L L[B@ٹЖX!@~(* {d+} G͋љς}WL$cGD2QZ4 E@@A(q`1D `'u46ptc48.`R0) @Rt CXCP%CBH@Rf[(t CQhz#0 Zl`O828.p|O×X ?:0FBx$ !i@ڐH[EE1PL ⢖V6QP>U(j MFkt,:.FW8c1L&ӎ9ƌaX: rbl1 {{{;}#tp8_\8"Ey.,X%%Gщ1-9ҀKl.oo/O$&'=JvMޞxǥ{=Vs\x ‰N柜>ucKz=s/ol|ϝ?y ^d]ps~:;/;]7|WpQoH!ɻVsnYs}ҽ~4] =>=:`;cܱ'?e~!ańD#G&}'/?^xI֓?+\wx20;5\ӯ_etWf^Qs-mw3+?~O~endstream endobj 111 0 obj << /Filter /FlateDecode /Length 3684 >> stream x\KoGlȗ4~8lc`aa/ ;_שׁzsw*ee=2++XX?ߧWG|H_x$^8>(O.JWy,Ce >j{|ruMw+f\UݫZkắKlVrtJqbV4pR{d~FB]ZI‹Нa~8| $83gE]b1hYiOr?!L6OV<#j ?IB36t7{{Kʹk: 8qstgʳ&[3F>!e9t (O](QW'iԸ6FsN@1:cb'Xfu%E%fJ ԕth%|48Z&c%M%m%u%`!0ЪVNG']t%w\^W]i [<@W,+!tޤ^R@Vq'b%K7 pǦ N{VajZ_KA^ 8Am!o-jy[`7x~Xޡ &,uʱ{x dpQ}1;Y4m)4!L+c 5AUVAS?u<[kOAsfcB H$yG e8oi"P<<ݭv>i<\B!)Dehe籍y<Cn|(C.! y[p0?H FxگiW:zT>%^D% m.ע]@QQN=֩YEJ7J6)bUCH\+M](7݆O93i˾HJHmQ{Nri+R0SlMW, L#vL%o*y2[ZSk>^OaxM.٠#IY65L'5vgj{x^NuTY%O+y^]ܰ|^r*%KTu^Jn*ye;bCvm%فoYa*UCsƛ^KE)>c.`ANCZ/wҰdQL ׳ ޗ4- 'yhmqw9۸9ЖW@a0ȍRMa$'iDrv;]&3`gY%:䷥~ۧ@\^qMnsk5%7> J1~Y-]iJA;?O)9I) }_7]tdB*}Vcl;$iB.bv .DRf'){_)DFtSP nPL|8@"58d`x{}$IiZqÅr~}:sX`t0on2Ȩ0R1١8I' ,tn@`+ .{ߦAPSUh<#vtHuFM&2НD]v 9$ur-IB941xa}yM>*9 [ZqhZ>2y"uں  "۝eeM{ WHQ8mL# ׵-e0/A_3-jž@]~A*mA7H Gx怸zw!Ґ k /k* f.hL @bR>u񐵍`Vd㊌ڪ*+ Xg W'q8@\ɧn|| Q,Z3}5Vg$|'ɀfMwn,hhm1+L| n07 )I2ztf5gSl`!<$TvHN>b%`_TJ~UO+u%ZVJAS?frw]lh`P@~{K%HfCdHV۪(=B Y 8 ~B]wGQ%F'~=JEq֖G*ixa"/*Ji<;lLu@-ˋDEtb!,@A!ax͢c?a CVXbk~D'2|,!+W,1*Hzӫu4:jr s3L^Z:qUjJ]hоV7呣v2'[OSG!=$'0yRn[eSע*]~+a9iڼ Ԧ*L0ݓՄ/ >Ur9O~metG<4AnSL M8.HdHy#  5|(k)ika҄aIo ̚o6O˚U6=h_tjR=֮-5}UZ𘶼>+mށK1.WKs9NoD-fWgq; ZAӐ z3 }qnH65?<~qc;˴%qt^3n~ܯ.uzZiYPlzZ #0J\cŶZGqJo.I*r+x>7!XLʪlI]KM,א3ve1~ܖ;"%| ~m/yGcu?+A7ld|U*Rf0|:ItIhgK>.6/]ww`UፁM` ̏ShU|e|rߊ+sIrr/_endstream endobj 112 0 obj << /Filter /FlateDecode /Length 1835 >> stream xZnF}W  w,PH ZA*}i`˒Zb)JbR7Ρt)+hP!ٙoaΠT6/ 5ks_g|-"65揪fi6ASaWn%LI/x-? B(*9QjUGOZy6ƛL֦Yjtgƻ]GQwݪ(b;},Y'^/2h:jMi&6J <|Saq8ȒdY<61z?XGAl4 C (+P-Kdԗ1}V;No -β3p< C @o]K%Abѱ@s`ktI Y)P/͔NKbɱw.w2z,\\< Xn WQ%{M wzEŷJbgY~iɼ$a (8nۥ2 |C.kLr-`(BD`G v.Mw`3Ν=CIw11i95,ͦ\d0f$Q, p. 2ԾDZW\jr97N(L]ة{SZ ȌNLGhPI\+}sh"5.͑1k\a4ʸ\ًv44.l'HKyR@m࿎`T j69)j|$63Fy=",z*x*c1KY;Ip!Ԅ/+㸒kSLMЖ >+ HN j|=v]Y^y^>SPHR*]mW*(@ІV+qpR܋rů JH@y,SߗZ[ }JX%79<4x[ \mf_FAOf+A8 vjendstream endobj 113 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 474 >> stream xcd`ab`dddw 641U~H3a!]gk7s7NBG``fd/mq/,L(QHT04Q020TpM-LNSM,HM,rr3SK*4l2JJ s4u3K2RSRSJsS nӃP%E )Ey L & " GTc2}-?DCքq-o03qsָjMX^4jaVwgAKr5VCnמ.w39K͚(pfuҖ+s;xY9~tʣ?X0?1Mt3OtsߓW+w;BHXo;7u>o /\O/eS-j9%&.0{ ~'Mg?u[|>>xxW}endstream endobj 114 0 obj << /Type /XRef /Length 120 /Filter /FlateDecode /DecodeParms << /Columns 5 /Predictor 12 >> /W [ 1 3 1 ] /Info 3 0 R /Root 2 0 R /Size 115 /ID [<871ad28855d932c2e63d3922718deeee>] >> stream xcb&F~0 $8JLٺABp"@$Sə  I DLA$+XV D oy@$dd,@$G)X DH endstream endobj startxref 76086 %%EOF zoo/inst/doc/sunw.rda0000644000175400001440000004046612501555040014471 0ustar zeileisusersRDX2 X  sunw@\(@ =p @ffffff@(\)@(\)@Q@ =p@@\(\@Q@(\)@@\(\@Q@\(@zG@QR@ffffff@Gz@\(@=p =@Gz@GzH@\(@333333@Q@\(\@p =q@ =p @QR@Gz@Q@\(\@ =p@Q@@zG@\(@ =p@Q@=p =@Q@zG@Gz@@333333@333333@(\)@Q@QR@ =p@zG@\(@zG{@ =p @p =q@ =p @(\)@\(@ =p@Q@Q@@=p =@Q@(\)@Q@Q@ =p @Q@ =p @QR@\(@ =p@GzH@zG@\(@GzH@\(@333333@@\(\@(\)@@333333@\(\@\(@(\)@ GzH@ Q@ zG@ =p@p =q@(\)@ffffff@ =p @@333333@\(\@\(@Q@@@@zG{@p =q@Q@zG@ =p @=p =@Q@(\)@Gz@zG@\(@GzH@QR@Q@\(@Q@(\)@ =p@\(\@Q@GzH@zG@=p =@@zG@(\)@ =p @p =q@Gz@Q@Q@@zG@Q@ffffff@zG@@ \(\@ Q@ \(@zG@\(@Q@(\)@Gz@ =p@ =p@ zG{@ =p =@ GzH@ Gz@ 333333@ =p@ Q@ \(@ GzH@@ Q@@(\)@Q@\(@ =p @@333333@Q@Q@p =q@Q@@ffffff@(\)@zG@\(\@p =q@\(@\(@GzH@@Gz@\(\@QR@@ =p @GzH@\(@\(@zG@zG@ =p@Q@@Q@(\)@\(@@333333@zG@Q@ =p @QR@Q@zG@\(@\(@333333@\(@\(@Gz@@Gz@QR@@zG{@zG@Q@=p =@zG{@@zG{@GzH@Gz@Gz@ =p@ffffff@\(@\(\@Gz@Q@zG@@GzH@@Q@(\)@QR@(\)@Q@ =p @\(@Q@Q@(\)@ =p @zG@p =q@Q@Q@ =p@333333@=p =@QR@(\)@333333@\(@zG@ffffff@@=p =@ffffff@\(@@=p =@@ =p@Q@zG@ffffff@\(\@Q@zG{@p =q@@ffffff@zG@Q@Q@Q@333333@ffffff@p =q@zG@@@\(@ =p @@ =p@\(\@QR@@p =q@(\)@=p =@ffffff@\(@@ffffff@\(@ffffff@333333@Q@\(\@zG@QR@Q@Gz@Q@(\)@\(@@zG{@ffffff@Q@Q@\(@GzH@zG@ =p@ffffff@\(@ffffff@\(\@Gz@=p =@Q@\(@333333@Q@ =p@333333@zG@\(\@zG@Q@@ \(@=p =@ =p @Q@p =q@(\)@ =p@(\)@\(\@Q@(\)@@Q@Q@Q@ffffff@Gz@@333333@p =q@p =q@QR@ffffff@333333@\(@\(@@Q@Q@zG@GzH@zG{@ =p@333333@Gz@ =p@QR@ =p@Q@=p =@QR@\(\@Q@333333@Q@\(@Gz@Q@Q@ =p@@(\)@(\)@\(@ \(@QR@ =p@ =p@zG@\(@ =p @@ @ Q@ ffffff@ \(@ Q@ QR@ QR@=p =@\(@ =p@(\)@zG{@Q@@Q@\(\@333333@\(@@Q@Q@\(@\(@\(\@ffffff@\(\@@ =p@ =p@(\)@ffffff@\(@Q@zG@ffffff@ffffff@\(\@=p =@Gz@333333@=p =@GzH@=p =@zG@\(@Q@\(@\(\@zG@GzH@QR@QR@@333333@\(@=p =@ =p@Q@333333@GzH@ =p @zG@zG{@(\)@zG{@p =q@Q@333333@@\(@QR@ =p@ =p@zG{@Q@zG@zG@=p =@zG@zG{@p =q@@\(@@zG@Q@(\)@\(\@@Q@@@\(\@333333@@=p =@@@zG@Gz@\(@@Gz@zG@333333@@@zG@QR@\(@Q@333333@\(@\(@ =p@zG@ =p@ =p@ =p @zG{@=p =@zG@ =p @ =p@zG{@@zG@@@(\)@Gz@p =q@\(@ =p@QR@Q@ =p@\(\@@@=p =@QR@ =p@Q@p =q@333333@QR@Q@333333@(\)@QR@@p =q@\(@ffffff@333333@ =p@ =p@\(@Q@GzH@\(@p =q@p =q@@@Q@@zG@\(@Q@333333@Q@@Q@ =p@ffffff@ffffff@Q@Q@Q@\(@GzH@@ =p @ffffff@=p =@ =p @@ zG@ Q@ \(\@ @zG{@zG{@ zG@ =p@=p =@ =p@\(@Gz@zG@Q@ =p@\(@Q@QR@Q@ =p@ =p @\(@ =p@zG@Q@\(@\(@ffffff@Q@=p =@ffffff@@@Q@QR@\(\@zG@Q@\(\@@\(@ =p@@ =p @\(@=p =@zG@ @ =p@\(\@ Q@ zG@ p =q@ =p @ GzH@ =p@ 333333@ Q@\(@zG@ Q@ \(@ @ \(@ zG@ \(\@ QR@ =p@ @ zG@ \(@ \(@ \(@ GzH@ Q@ =p@@zG{@ffffff@ffffff@ =p@ =p @GzH@GzH@ =p@Gz@333333@ =p@ =p @Q@ =p @GzH@p =q@zG@333333@zG@zG{@(\)@zG@p =q@@=p =@@ffffff@Gz@\(@zG{@Q@Q@ =p@@\(@ =p@zG@Q@zG@QR@=p =@zG@\(@zG{@zG@Q@Q@zG@\(@\(@Gz@Gz@ffffff@p =q@@ =p@@ffffff@QR@p =q@ =p @Q@Q@@@ =p@ =p@ffffff@@zG{@zG@@\(@Q@@Q@ =p @zG@ =p@ffffff@Q@@Q@Gz@zG{@ffffff@zG{@Q@@@Q@\(@ =p @=p =@@@ =p@p =q@\(@\(\@ =p@zG@@p =q@333333@Gz@Q@(\)@\(@Q@zG{@=p =@ =p@zG@(\)@\(@zG@Q@(\)@GzH@ffffff@@\(@ =p@zG@ =p@=p =@p =q@Gz@@ =p@333333@ =p@QR@ffffff@ffffff@zG{@ =p@@Q@ =p@GzH@333333@ =p @ =p@@p =q@\(@\(@zG@\(@=p =@\(@333333@333333@Q@Gz@333333@=p =@zG@ =p @333333@\(@ =p@zG@\(@333333@Gz@@Q@333333@ =p @\(@GzH@=p =@ \(@ Q@@@Gz@Q@zG@@ffffff@Q@Gz@ =p@zG{@\(@\(@zG@QR@Q@Q@Gz@(\)@QR@ =p @\(\@ =p@Q@@ffffff@(\)@\(\@\(@(\)@Q@ =p@ffffff@Q@QR@ =p@\(@ =p @(\)@@@333333@333333@ffffff@(\)@ @Q@p =q@QR@ffffff@ Q@ 333333@ =p@ 333333@QR@@zG@zG@Q@ =p@ zG@ =p@ Q@ Q@ zG{@ Gz@ Q@ =p =@zG@ 333333@ @ \(\@(\)@QR@=p =@\(@zG{@\(@\(@\(@GzH@p =q@ =p@\(\@Q@ffffff@(\)@\(\@333333@Q@Q@=p =@@Gz@Q@=p =@\(@zG@(\)@\(@\(@Q@=p =@Q@ =p@Gz@GzH@zG@\(@\(@zG@Q@zG@Q@ffffff@@zG@Q@Gz@@@Q@Q@zG{@(\)@=p =@Q@ffffff@ =p @p =q@\(\@ =p@ffffff@\(\@Q@\(@Q@ =p@ =p @ =p @333333@ =p@\(@ =p@\(@=p =@333333@ =p @@Q@\(\@@Q@Q@Q@@zG@\(@ =p @zG{@@zG@\( dim  dimnames Open High Low Close index@A@C@C@D@D@E@F@G@G@H@H@J@K@K@L@M@N@N@O@O@Q@Q@R@R@S@T@U@U@V@V@X@Y@Y@Z@[@\@\@]@]@_@_@`@`@a@b@c@c@d@d@f@f@g@g@h@i@j@j@k@k@m@m@n@n@o@p@q@q@r@t@t@u@u@v@w@x@x@y@y@{@{@|@|@}@~@@@Ȁ@Ȁ@Ȃ@Ȃ@ȃ@ȃ@Ȅ@ȅ@Ȇ@Ȇ@ȇ@ȇ@ȉ@ȉ@Ȋ@Ȋ@ȋ@ȍ@ȍ@Ȏ@Ȏ@Ȑ@Ȑ@ȑ@ȑ@ȓ@Ȕ@Ȕ@ȕ@ȕ@ȗ@ȗ@Ș@Ș@ș@Ț@ț@ț@Ȝ@Ȝ@Ȟ@ȟ@ȟ@Ƞ@ȡ@Ȣ@Ȣ@ȣ@ȣ@ȥ@ȥ@Ȧ@Ȧ@ȧ@Ȩ@ȩ@ȩ@Ȫ@Ȫ@Ȭ@Ȭ@ȭ@ȭ@Ȯ@ȯ@Ȱ@Ȱ@ȱ@ȱ@ȳ@ȳ@ȴ@ȴ@ȵ@ȶ@ȷ@ȷ@ȸ@ȸ@Ⱥ@Ⱥ@Ȼ@Ȼ@ȼ@Ⱦ@Ⱦ@ȿ@ȿ@@@@€@@Ā@@ŀ@@ƀ@@Ȁ@@ɀ@@ˀ@@̀@@̀@@π@@Ѐ@@Ҁ@@Ӏ@@Ԁ@@ր@@׀@@ـ@@ڀ@@ۀ@@݀@@ހ@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ class Date zoo sunw2 @(\)@=p =@zG@333333@zG@QR@@\(@(\)@@333333@\(   Close @A@Q@_@n@~@ȍ@Ȝ@Ȭ@Ȼ@@ـ@ Date zoo eur.usdn?!R<6?sP?'RT`e?!.H?#wk?A [7?b}Vm?9D?n.2?+ I?+ I?eO?eO ?m8Y??|hs?Q?Q?Ϫ͞?zG{?2W? ěT?6z?W>6z?%1?%1?"`A?Y|?9D?!.H?ݗ+j?E?E?E?S?Vu? M:?n?S?S&?5?|h?L_?QR?YJ?~($ x?cA [?]ce?fA?o?qiC?C$?U=K? L/{?4J?tj?Xe,?M:?.H?`A7L?.H?!.H?#x?ᰉ'?O;dZ?Q??͞%?ȴ9Xb?䎊?"`B?3?+j?ߤ??Mj?\(?O M?n.3?'RT`?*0?,6z?W>6z?Xe+?P{?}H?&IQ?*0U2a|?0U2a|?4m8?:S&?;5Xy?~$??Vu?A [?MjO?Q??qu!?-V?,<쿱?,<쿱?-V?6C-?qu!?YJE?xl"h ?S&?n/?n/?.H?- ?#x? xF]?JL?F]c?F]c?Fs?=K]?Ov_خ?8YJ?_o?1-?2W?+ I^?84֡b?[W>6z?_Ft?o?L_?Mj?󖻘?4m9?$tS?L_?Mj?͞&?wkQ?TɅ??? k?Fs?bM?<64?????O;dZ?vȴ9X?73?K]cA?m\?l!-w?l!-w?b}Vm?]ce?Xy=c?xF?u%F L?tj~?{J#9?$/?Vt?M:?xF?ᰊ?ᰊ?}Vl?-?U=?ɅoiD?ԕ*1?]ce?ѷY?ۋq ?$?#w?҈p:?&IR?Q?쿱[W??fA??Y}?u"?=K^?]cA ?Zݘ?_Ft?qiB?GzH?GE84???>BZc ?@NU?O M;?@NU?I^5?}?F]cf?L_?3?3?-?wkQ?$/??쿱[W?s???@?a@N?vȴ9X?W'?|?Q?3?l"h ԕ?Vl!-?W&?^5?|?8YJ???:S&?H?|??4m9?wkP?M:?JD?L_?O M;?^?4m9?M:? k?S&?u"?,>= library("zoo") library("tseries") library("strucchange") library("timeDate") online <- FALSE ## if set to FALSE the local copy of MSFT.rda ## is used instead of get.hist.quote() options(prompt = "R> ") Sys.setenv(TZ = "GMT") @ \section{Introduction} \label{sec:intro} The \proglang{R} system for statistical computing \citep[\url{http://www.R-project.org/}]{zoo:R:2008} ships with a class for regularly spaced time series, \code{"ts"} in package \pkg{stats}, but has no native class for irregularly spaced time series. With the increased interest in computational finance with \proglang{R} over the last years several implementations of classes for irregular time series emerged which are aimed particularly at finance applications. These include the \proglang{S4} classes \code{"timeSeries"} in package \pkg{timeSeries} (previously \pkg{fSeries}) from the \pkg{Rmetrics} suite \citep{zoo:Rmetrics:2008}, \code{"its"} in package \pkg{its} \citep{zoo:its:2004} and the \proglang{S3} class \code{"irts"} in package \pkg{tseries} \citep{zoo:tseries:2007}. With these packages available, why would anybody want yet another package providing infrastructure for irregular time series? The above mentioned implementations have in common that they are restricted to a particular class for the time scale: the former implementation comes with its own time class \code{"timeDate"} from package \pkg{timeDate} (previously \pkg{fCalendar}) built on top of the \code{"POSIXct"} class available in base \proglang{R} whereas the latter two use \code{"POSIXct"} directly. And this was the starting point for the \pkg{zoo} project: the first author of the present paper needed more general support for ordered observations, independent of a particular index class, for the package \pkg{strucchange} \citep{zoo:Zeileis+Leisch+Hornik:2002}. Hence, the package was called \pkg{zoo} which stands for \underline{Z}'s \underline{o}rdered \underline{o}bservations. Since the first release, a major part of the additions to \pkg{zoo} were provided by the second author of this paper, so that the name of the package does not really reflect the authorship anymore. Nevertheless, independence of a particular index class remained the most important design goal. While the package evolved to its current status, a second key design goal became more and more clear: to provide methods to standard generic functions for the \code{"zoo"} class that are similar to those for the \code{"ts"} class (and base \proglang{R} in general) such that the usage of \pkg{zoo} is very intuitive because few additional commands have to be learned. This paper describes how these design goals are implemented in \pkg{zoo}. The resulting package provides the \code{"zoo"} class which offers an extensive (and still growing) set of standard and new methods for working with indexed observations and `talks' to the classes \code{"ts"}, \code{"its"}, \code{"irts"} and \code{"timeSeries"}. \citep[In addition to these independent approaches, the class \code{"xts"} built upon \code{"zoo"} was recently introduced by][.]{zoo:xts:2008}. \pkg{zoo} also bridges the gap between regular and irregular time series by providing coercion with (virtually) no loss of information between \code{"ts"} and \code{"zoo"}. With these tools \pkg{zoo} provides the basic infrastructure for working with indexed totally ordered observations and the package can be either employed by users directly or can be a basic ingredient on top of which other more specialized applications can be built. The remainder of the paper is organized as follows: Section~\ref{sec:zoo-class} explains how \code{"zoo"} objects are created and illustrates how the corresponding methods for plotting, merging and binding, several mathematical operations, extracting and replacing data and index, coercion and \code{NA} handling can be used. Section~\ref{sec:combining} outlines how other packages can build on this basic infrastructure. Section~\ref{sec:summary} gives a few summarizing remarks and an outlook on future developments. Finally, an appendix provides a reference card that gives an overview of the functionality contained in \pkg{zoo}. \section[The class "zoo" and its methods]{The class \code{"zoo"} and its methods} \label{sec:zoo-class} This section describes how \code{"zoo"} series can be created and subsequently manipulated, visualized, combined or coerced to other classes. In Section~\ref{sec:zoo}, the general class \code{"zoo"} for totally ordered series is described. Subsequently, in Section~\ref{sec:zooreg}, the subclass \code{"zooreg"} for regular \code{"zoo"} series, i.e., series which have an index with a specified frequency, is discussed. The methods illustrated in the remainder of the section are mostly the same for both \code{"zoo"} and \code{"zooreg"} objects and hence do not have to be discussed separately. The few differences in merging and binding are briefly highlighted in Section~\ref{sec:merge}. \subsection[Creation of "zoo" objects]{Creation of \code{"zoo"} objects} \label{sec:zoo} The simple idea for the creation of \code{"zoo"} objects is to have some vector or matrix of observations \code{x} which are totally ordered by some index vector. In time series applications, this index is a measure of time but every other numeric, character or even more abstract vector that provides a total ordering of the observations is also suitable. Objects of class \code{"zoo"} are created by the function \begin{Scode} zoo(x, order.by) \end{Scode} where \code{x} is the vector or matrix of observations\footnote{In principle, more general objects can be indexed, but currently \pkg{zoo} does not support this. Development plans are that \pkg{zoo} should eventually support indexed factors, data frames and lists.} and \code{order.by} is the index by which the observations should be ordered. It has to be of the same length as \code{NROW(x)}, i.e., either the same length as \code{x} for vectors or the same number of rows for matrices.\footnote{The only case where this restriction is not imposed is for zero-length vectors, i.e., vectors that only have an index but no data.} The \code{"zoo"} object created is essentially the vector/matrix as before but has an additional \code{"index"} attribute in which the index is stored.\footnote{There is some limited support for indexed factors available in which case the \code{"zoo"} object also has an attribute \code{"oclass"} with the original class of \code{x}. This feature is still under development and might change in future versions.} Both the observations in the vector/matrix \code{x} and the index \code{order.by} can, in principle, be of arbitrary classes. However, most of the following methods (plotting, aggregating, mathematical operations) for \code{"zoo"} objects are typically only useful for numeric observations \code{x}. Special effort in the design was put into independence from a particular class for the index vector. In \pkg{zoo}, it is assumed that combination \code{c()}, querying the \code{length()}, value matching \code{MATCH()}, subsetting \code{[}, and, of course, ordering \code{ORDER()} work when applied to the index. In addition, an \code{as.character()} method might improve printed output\footnote{If an \code{as.character()} method is already defined, but gives not the desired output for printing, then an \code{index2char()} method can be defined. This is a generic convenience function used for creating character representations of the index vector and it defaults to using \code{as.character()}.} and \code{as.numeric()} could be used for computing distances between indexes, e.g., in interpolation. Both methods are not necessary for working with \code{"zoo"} objects but could be used if available. All these methods are available, e.g., for standard numeric and character vectors and for vectors of classes \code{"Date"}, \code{"POSIXct"} or \code{"times"} from package \pkg{chron} and \code{"timeDate"} in \pkg{timeDate}. Because not all required methods used to be available for \code{"timeDate"} in older versions of \pkg{fCalendar}, Section~\ref{sec:timeDate} has a rather outdated example how to provide such methods so that \code{"zoo"} objects work with \code{"timeDate"} indexes. To achieve this independence of the index class, new generic functions for ordering (\code{ORDER()}) and value matching (\code{MATCH()}) are introduced as the corresponding base functions \code{order()} and \code{match()} are non-generic. The default methods simply call the corresponding base functions, i.e., no new method needs to be introduced for a particular index class if the non-generic functions \code{order()} and \code{match()} work for this class. \emph{\proglang{R} now also provides a new generic \code{xtfrm()} which was not available when the new generic \code{ORDER()} was introduced. If there is a \code{xtfrm()} for a class, the default \code{ORDER()} method typically works.} To illustrate the usage of \code{zoo()}, we first load the package and set the random seed to make the examples in this paper exactly reproducible. <>= library("zoo") set.seed(1071) @ Then, we create two vectors \code{z1} and \code{z2} with \code{"POSIXct"} indexes, one with random observations <>= z1.index <- ISOdatetime(2004, rep(1:2,5), sample(28,10), 0, 0, 0) z1.data <- rnorm(10) z1 <- zoo(z1.data, z1.index) @ and one with a sine wave <>= z2.index <- as.POSIXct(paste(2004, rep(1:2, 5), sample(1:28, 10), sep = "-")) z2.data <- sin(2*1:10/pi) z2 <- zoo(z2.data, z2.index) @ Furthermore, we create a matrix \code{Z} with random observations and a \code{"Date"} index <>= Z.index <- as.Date(sample(12450:12500, 10)) Z.data <- matrix(rnorm(30), ncol = 3) colnames(Z.data) <- c("Aa", "Bb", "Cc") Z <- zoo(Z.data, Z.index) @ In the examples above, the generation of indexes looks a bit awkward due to the fact the indexes need to be randomly generated (and there are no special functions for random indexes because these are rarely needed in practice). In ``real world'' applications, the indexes are typically part of the raw data set read into \proglang{R} so the code would be even simpler. See Section~\ref{sec:combining} for such examples.\footnote{Note, that in the code above a new \code{as.Date} method, provided in \pkg{zoo}, is used to convert days since 1970-01-01 to class \code{"Date"}. See the respective help page for more details.} Methods to several standard generic functions are available for \code{"zoo"} objects, such as \code{print}, \code{summary}, \code{str}, \code{head}, \code{tail} and \code{[} (subsetting), a few of which are illustrated in the following. There are three printing code styles for \code{"zoo"} objects: vectors are by default printed in \code{"horizontal"} style <>= z1 z1[3:7] @ and matrices in \code{"vertical"} style <>= Z Z[1:3, 2:3] @ Additionally, there is a \code{"plain"} style which simply first prints the data and then the index. Above, we have illustrated that \code{"zoo"} series can be indexed like vectors or matrices respectively, i.e., with integers correponding to their observation number (and column number). But for indexed observations, one would obviously also like to be able to index with the index class. This is also available in \code{[} which only uses vector/matrix-type subsetting if its first argument is of class \code{"numeric"}, \code{"integer"} or \code{"logical"}. <>= z1[ISOdatetime(2004, 1, c(14, 25), 0, 0, 0)] @ If the index class happens to be \code{"numeric"}, the index has to be either insulated in \code{I()} like \code{z[I(i)]} or the \code{window()} method can be used (see Section~\ref{sec:window}). Summaries and most other methods for \code{"zoo"} objects are carried out column wise, reflecting the rectangular structure. In addition, a summary of the index is provided. <>= summary(z1) summary(Z) @ \subsection[Creation of "zooreg" objects]{Creation of \code{"zooreg"} objects} \label{sec:zooreg} Strictly regular series are such series observations where the distance between the indexes of every two adjacent observations is the same. Such series can also be described by their frequency, i.e., the reciprocal value of the distance between two observations. As \code{"zoo"} can be used to store series with arbitrary type of index, it can, of course, also be used to store series with regular indexes. So why should this case be given special attention, in particular as there is already the \code{"ts"} class devoted entirely to regular series? There are two reasons: First, to be able to convert back and forth between \code{"ts"} and \code{"zoo"}, the frequency of a certain series needs to be stored on the \code{"zoo"} side. Second, \code{"ts"} is limited to strictly regular series and the regularity is lost if some internal observations are omitted. Series that can be created by omitting some internal observations from strictly regular series will in the following be refered to as being (weakly) regular. Therefore, a class that bridges the gap between irregular and strictly regular series is needed and \code{"zooreg"} fills this gap. Objects of class \code{"zooreg"} inherit from class \code{"zoo"} but have an additional attribute \code{"frequency"} in which the frequency of the series is stored. Therefore, they can be employed to represent both strictly and weakly regular series. To create a \code{"zooreg"} object, either the command \code{zoo()} can be used or the command \code{zooreg()}. \begin{Scode} zoo(x, order.by, frequency) zooreg(data, start, end, frequency, deltat, ts.eps, order.by) \end{Scode} If \code{zoo()} is called as in the previous section but with an additional \code{frequency} argument, it is checked whether \code{frequency} complies with the index \code{order.by}: if it does an object of class \code{"zooreg"} inheriting from \code{"zoo"} is returned. The command \code{zooreg()} takes mostly the same arguments as \code{ts()}.\footnote{Only if \code{order.by} is specified in the \code{zooreg()} call, then \code{zoo(x, order.by, frequency)} is called.} In both cases, the index class is more restricted than in the plain \code{"zoo"} case. The index must be of a class which can be coerced to \code{"numeric"} (for checking its regularity) and when converted to numeric the index must be expressable as multiples of 1/frequency. Furthermore, adding/substracting a numeric to/from an observation of the index class, should return the correct value of the index class again, i.e., group generic functions \code{Ops} should be defined.\footnote{An application of non-numeric indexes for regular series are the classes \code{"yearmon"} and \code{"yearqtr"} which are designed for monthly and quarterly series respectively and are discussed in Section~\ref{sec:yearmon}.} The following calls yield equivalent series <>= zr1 <- zooreg(sin(1:9), start = 2000, frequency = 4) zr2 <- zoo(sin(1:9), seq(2000, 2002, by = 1/4), 4) zr1 zr2 @ to which methods to standard generic functions for regular series can be applied, such as \code{frequency}, \code{deltat}, \code{cycle}. As stated above, the advantage of \code{"zooreg"} series is that they remain regular even if an internal observation is dropped: <>= zr1 <- zr1[-c(3, 5)] zr1 class(zr1) frequency(zr1) @ This facilitates \code{NA} handling significantly compared to \code{"ts"} and makes \code{"zooreg"} a much more attractive data type, e.g., for time series regression. \code{zooreg()} can also deal with non-numeric indexes provided that adding \code{"numeric"} observations to the index class preserves the class and does not coerce to \code{"numeric"}. <>= zooreg(1:5, start = as.Date("2005-01-01")) @ To check whether a certain series is (strictly) regular, the new generic function \code{is.regular(x, strict = FALSE)} can be used: <>= is.regular(zr1) is.regular(zr1, strict = TRUE) @ This function (and also the \code{frequency}, \code{deltat} and \code{cycle}) also work for \code{"zoo"} objects if the regularity can still be inferred from the data: <>= zr1 <- as.zoo(zr1) zr1 class(zr1) is.regular(zr1) frequency(zr1) @ Of course, inferring the underlying regularity is not always reliable and it is safer to store a regular series as a \code{"zooreg"} object if it is intended to be a regular series. If a weakly regular series is coerced to \code{"ts"} the missing observations are filled with \code{NA}s (see also Section~\ref{sec:NA}). For strictly regular series with numeric index, the class can be switched between \code{"zoo"} and \code{"ts"} without loss of information. <>= as.ts(zr1) identical(zr2, as.zoo(as.ts(zr2))) @ This enables direct use of functions such as \code{acf}, \code{arima}, \code{stl} etc. on \code{"zooreg"} objects as these methods coerce to \code{"ts"} first. The result only has to be coerced back to \code{"zoo"}, if appropriate. \subsection{Plotting} \label{sec:plot} The \code{plot} method for \code{"zoo"} objects, in particular for multivariate \code{"zoo"} series, is based on the corresponding method for (multivariate) regular time series. It relies on \code{plot} and \code{lines} methods being available for the index class which can plot the index against the observations. By default the \code{plot} method creates a panel for each series <>= plot(Z) @ but can also display all series in a single panel <>= plot(Z, plot.type = "single", col = 2:4) @ \begin{figure}[b!] \begin{center} <>= <> @ \caption{\label{fig:plot2} Example of a single panel plot} \end{center} \end{figure} \begin{figure}[p] \begin{center} <>= <> @ <>= plot(Z, type = "b", lty = 1:3, pch = list(Aa = 1:5, Bb = 2, Cc = 4), col = list(Bb = 2, 4)) @ \caption{\label{fig:plot13} Examples of multiple panel plots} \end{center} \end{figure} In both cases additional graphical parameters like color \code{col}, plotting character \code{pch} and line type \code{lty} can be expanded to the number of series. But the \code{plot} method for \code{"zoo"} objects offers some more flexibility in specification of graphical parameters as in <>= <> @ The argument \code{lty} behaves as before and sets every series in another line type. The \code{pch} argument is a named list that assigns to each series a different vector of plotting characters each of which is expanded to the number of observations. Such a list does not necessarily have to include the names of all series, but can also specify a subset. For the remaining series the default parameter is then used which can again be changed: e.g., in the above example the \code{col} argument is set to display the series \code{"Bb"} in red and all remaining series in blue. The results of the multiple panel plots are depicted in Figure~\ref{fig:plot13} and the single panel plot in Figure~\ref{fig:plot2}. \subsection{Merging and binding} \label{sec:merge} As for many rectangular data formats in \proglang{R}, there are both methods for combining the rows and columns of \code{"zoo"} objects respectively. For the \code{rbind} method the number of columns of the combined objects has to be identical and the indexes may not overlap. <>= rbind(z1[5:10], z1[2:3]) @ The \code{c} method simply calls \code{rbind} and hence behaves in the same way. The \code{cbind} method by default combines the columns by the union of the indexes and fills the created gaps by \code{NA}s. <>= cbind(z1, z2) @ In fact, the \code{cbind} method is synonymous with the \code{merge} method\footnote{Note, that in some situations the column naming in the resulting object is somewhat problematic in the \code{cbind} method and the \code{merge} method might provide better formatting of the column names.} except that the latter provides additional arguments which allow for combining the columns by the intersection of the indexes using the argument \code{all = FALSE} <>= merge(z1, z2, all = FALSE) @ Additionally, the filling pattern can be changed in \code{merge}, the naming of the columns can be modified and the return class of the result can be specified. In the case of merging of objects with different index classes, \proglang{R} gives a warning and tries to coerce the indexes. Merging objects with different index classes is generally discouraged---if it is used nevertheless, it is the responsibility of the user to ensure that the result is as intended. If at least one of the merged/binded objects was a \code{"zooreg"} object, then \code{merge} tries to return a \code{"zooreg"} object. This is done by assessing whether there is a common maximal frequency and by checking whether the resulting index is still (weakly) regular. If non-\code{"zoo"} objects are included in merging, then \code{merge} gives plain vectors/factors/matrices the index of the first argument (if it is of the same length). Scalars are always added for the full index without missing values. <>= merge(z1, pi, 1:10) @ Another function which performs operations along a subset of indexes is \code{aggregate}, which is discussed in this section although it does not combine several objects. Using the \code{aggregate} method, \code{"zoo"} objects are split into subsets along a coarser index grid, summary statistics are computed for each and then the reduced object is returned. In the following example, first a function is set up which returns for a given \code{"Date"} value the corresponding first of the month. This function is then used to compute the coarser grid for the \code{aggregate} call: in the first example, the grouping is computed explicitely by \verb/firstofmonth(index(Z))/ and the mean of the observations in the month is returned---in the second example, only the function that computes the grouping (when applied to \verb/index(Z)/) is supplied and the first observation is used for aggregation. <>= firstofmonth <- function(x) as.Date(sub("..$", "01", format(x))) aggregate(Z, firstofmonth(index(Z)), mean) aggregate(Z, firstofmonth, head, 1) @ The opposite of aggregation is disaggregation. For example, the \code{Nile} dataset is an annual \code{"ts"} class series. To disaggregate it into a quarterly series, convert it to a \code{"zoo} class series, insert intermediate quarterly points containing \code{NA} values and then fill the \code{NA} values using \code{na.approx}, \code{na.locf} or \code{na.spline}. (More details on \code{NA} handling in general can be found in Section~\ref{sec:NA}.) <>= Nile.na <- merge(as.zoo(Nile), zoo(, seq(start(Nile)[1], end(Nile)[1], 1/4))) head(as.zoo(Nile)) head(na.approx(Nile.na)) head(na.locf(Nile.na)) head(na.spline(Nile.na)) @ \subsection{Mathematical operations} \label{sec:Ops} To allow for standard mathematical operations among \code{"zoo"} objects, \pkg{zoo} extends group generic functions \code{Ops}. These perform the operations only for the intersection of the indexes of the objects. As an example, the summation and logical comparison with $<$ of \code{z1} and \code{z2} yield <>= z1 + z2 z1 < z2 @ Additionally, methods for transposing \code{t} of \code{"zoo"} objects---which coerces to a matrix before---and computing cumulative quantities such as \code{cumsum}, \code{cumprod}, \code{cummin}, \code{cummax} which are all applied column wise. <>= cumsum(Z) @ \subsection{Extracting and replacing the data and the index} \label{sec:window} \pkg{zoo} provides several generic functions and methods to work on the data contained in a \code{"zoo"} object, the index (or time) attribute associated to it, and on both data and index. The data stored in \code{"zoo"} objects can be extracted by \code{coredata} which strips off all \code{"zoo"}-specific attributes and it can be replaced using \code{coredata<-}. Both are new generic functions\footnote{The \code{coredata} functionality is similar in spirit to the \code{core} function in \pkg{its} and \code{value} in \pkg{tseries}. However, the focus of those functions is somewhat narrower and we try to provide more general purpose generic functions. See the respective manual page for more details.} with methods for \code{"zoo"} objects as illustrated in the following example. <>= coredata(z1) coredata(z1) <- 1:10 z1 @ The index associated with a \code{"zoo"} object can be extracted by \code{index} and modified by \mbox{\code{index<-}.} As the interpretation of the index as ``time'' in time series applications is natural, there are also synonymous methods \code{time} and \code{time<-}. Hence, the commands \code{index(z2)} and \code{time(z2)} return equivalent results. <>= index(z2) @ The index scale of \code{z2} can be changed to that of \code{z1} by <>= index(z2) <- index(z1) z2 @ The start and the end of the index/time vector can be queried by \code{start} and \code{end}: <>= start(z1) end(z1) @ To work on both data and index/time, \pkg{zoo} provides \code{window} and \code{window<-} methods for \code{"zoo"} objects. In both cases the window is specified by \begin{Scode} window(x, index, start, end) \end{Scode} where \code{x} is the \code{"zoo"} object, \code{index} is a set of indexes to be selected (by default the full index of \code{x}) and \code{start} and \code{end} can be used to restrict the \code{index} set. <>= window(Z, start = as.Date("2004-03-01")) window(Z, index = index(Z)[5:8], end = as.Date("2004-03-01")) @ The first example selects all observations starting from 2004-03-01 whereas the second selects from the from the 5th to 8th observation those up to 2004-03-01. The same syntax can be used for the corresponding replacement function. <>= window(z1, end = as.POSIXct("2004-02-01")) <- 9:5 z1 @ Two methods that are standard in time series applications are \code{lag} and \code{diff}. These are available with the same arguments as the \code{"ts"} methods.\footnote{\code{diff} also has an additional argument that also allows for geometric and not only allows arithmetic differences. Furthermore, note the sign of the lag in \code{lag} which behaves like the \code{"ts"} method, i.e., by default it is positive and shifts the observations \emph{forward}, to obtain the more standard \emph{backward} shift the lag has to be negative.} <>= lag(z1, k = -1) merge(z1, lag(z1, k = 1)) diff(z1) @ \subsection[Coercion to and from "zoo"]{Coercion to and from \code{"zoo"}} \label{sec:as.zoo} Coercion to and from \code{"zoo"} objects is available for objects of various classes, in particular \code{"ts"}, \code{"irts"} and \code{"its"} objects can be coerced to \code{"zoo"} and back if the index is of the appropriate class.\footnote{Coercion from \code{"zoo"} to \code{"irts"} is contained in the \pkg{tseries} package.} Coercion between \code{"zooreg"} and \code{"zoo"} is also available and is essentially dropping the \code{"frequency"} attribute or trying to add one, respectively. Furthermore, \code{"zoo"} objects can be coerced to vectors, matrices, lists and data frames (the latter dropping the index/time attribute). A simple example is <>= as.data.frame(Z) @ \subsection[NA handling]{\code{NA} handling} \label{sec:NA} A wide range of methods for dealing with \code{NA}s (missing observations) in the observations are applicable to \code{"zoo"} objects including \code{na.omit}, \code{na.contiguous}, \code{na.approx}, \code{na.spline}, and \code{na.locf} among others. \code{na.omit}---or its default method to be more precise---returns a \code{"zoo"} object with incomplete observations removed. \code{na.contiguous} extracts the longest consecutive stretch of non-missing values. Furthermore, new generic functions \code{na.approx}, \code{na.spline}, and \code{na.locf} and corresponding default methods are introduced in \pkg{zoo}. The former two replace \code{NA}s by interpolation (using the function \code{approx} and \code{spline}, respectively) and the name of the latter stands for \underline{l}ast \underline{o}bservation \underline{c}arried \underline{f}orward. It replaces missing observations by the most recent non-\code{NA} prior to it. Leading \code{NA}s, which cannot be replaced by previous observations, are removed in both functions by default. <>= z1[sample(1:10, 3)] <- NA z1 na.omit(z1) na.contiguous(z1) na.approx(z1) na.approx(z1, 1:NROW(z1)) na.spline(z1) na.locf(z1) @ As the above example illustrates, \code{na.approx} (and also \code{na.spline}) use by default the underlying time scale for interpolation. This can be changed, e.g., to an equidistant spacing, by setting the second argument of \code{na.approx}. Furthermore, a different output time index can be supplied as well. In addition to the methods discussed above, there are also other methods for dealing with missing values in \pkg{zoo} such as \code{na.aggregate}, \code{na.fill}, \code{na.trim}, and \code{na.StructTS}. \subsection{Rolling functions} \label{sec:rolling} A typical task to be performed on ordered observations is to evaluate some function, e.g., computing the mean, in a window of observations that is moved over the full sample period. The resulting statistics are usually synonymously referred to as rolling/running/moving statistics. In \pkg{zoo}, the generic function \code{rollapply}\footnote{In previous versions of \pkg{zoo}, this function was called \code{rapply}. It was renamed because from \proglang{R}~2.4.0 on, base \proglang{R} provides a different function \code{rapply} for recursive (and not rolling) application of functions. The function \code{zoo::rapply} is still provided for backward compatibility, however it dispatches now to \code{rollapply} methods.} is provided along with a \code{"zoo"} and a \code{"ts"} method. The most important arguments are \begin{Scode} rollapply(data, width, FUN) \end{Scode} where the function \code{FUN} is applied to a rolling window of size \code{width} of the observations \code{data}. The function \code{rollapply} by default only evaluates the function for windows of full size \code{width} and then the result has \code{width - 1} fewer observations than the original series and is aligned at the center of the rolling window. Setting further arguments such as \code{partial}, \code{align}, or \code{fill} also allows for rolling computations on partial windows with arbitrary aligning and flexible filling. For example, without partial evaluation the `lost' observations could be filled with \code{NA}s and aligned at the left of the sample. <>= rollapply(Z, 5, sd) rollapply(Z, 5, sd, fill = NA, align = "left") @ To improve the performance of \code{rollapply(x, k, }\textit{foo}\code{)} for some frequently used functions \textit{foo}, more efficient implementations \code{roll}\textit{foo}\code{(x, k)} are available (and also called by \code{rollapply}). Currently, these are the generic functions \code{rollmean}, \code{rollmedian} and \code{rollmax} which have methods for \code{"zoo"} and \code{"ts"} series and a default method for plain vectors. <>= rollmean(z2, 5, fill = NA) @ \section[Combining zoo with other packages]{Combining \pkg{zoo} with other packages} \label{sec:combining} The main purpose of the package \pkg{zoo} is to provide basic infrastructure for working with indexed totally ordered observations that can be either employed by users directly or can be a basic ingredient on top of which other packages can build. The latter is illustrated with a few brief examples involving the packages \pkg{strucchange}, \pkg{tseries} and \pkg{timeDate}/\pkg{fCalendar} in this section. Finally, the classes \code{"yearmon"} and \code{"yearqtr"} (provided in \pkg{zoo}) are used for illustrating how \pkg{zoo} can be extended by creating a new index class. \subsection[strucchange: Empirical fluctuation processes]{\pkg{strucchange}: Empirical fluctuation processes} \label{sec:strucchange} The package \pkg{strucchange} provides a collection of methods for testing, monitoring and dating structural changes, in particular in linear regression models. Tests for structural change assess whether the parameters of a model remain constant over an ordering with respect to a specified variable, usually time. To adequately store and visualize empirical fluctuation processes which capture instabilities over this ordering, a data type for indexed ordered observations is required. This was the motivation for starting the \pkg{zoo} project. A simple example for the need of \code{"zoo"} objects in \pkg{strucchange} which can not be (easily) implemented by other irregular time series classes available in \proglang{R} is described in the following. We assess the constancy of the electrical resistance over the apparent juice content of kiwi fruits.\footnote{A different approach would be to test whether the slope of a regression of electrical resistance on juice content changes with increasing juice content, i.e., to test for instabilities in \code{ohms \~{} juice} instead of \code{ohms \~{} 1}. Both lead to similar results.} The data set \code{fruitohms} is contained in the \pkg{DAAG} package \citep{zoo:DAAG:2004}. The fitted \code{ocus} object contains the OLS-based CUSUM process for the mean of the electrical resistance (variable \code{ohms}) indexed by the juice content (variable \code{juice}). <>= library("strucchange") library("DAAG") data("fruitohms") ocus <- gefp(ohms ~ 1, order.by = ~ juice, data = fruitohms) @ \begin{figure}[h!] \begin{center} <>= plot(ocus) @ \caption{\label{fig:strucchange} Empirical M-fluctuation process for \code{fruitohms} data} \end{center} \end{figure} This OLS-based CUSUM process can be visualized using the \code{plot} method for \code{"gefp"} objects which builds on the \code{"zoo"} method and yields in this case the plot in Figure~\ref{fig:strucchange} showing the process which crosses its 5\% critical value and thus signals a significant decrease in the mean electrical resistance over the juice content. For more information on the package \pkg{strucchange} and the function \code{gefp} see \cite{zoo:Zeileis+Leisch+Hornik:2002} and \cite{zoo:Zeileis:2005}. \subsection[tseries: Historical financial data]{\pkg{tseries}: Historical financial data} \label{sec:tseries} \emph{This section was written when \pkg{tseries} did not yet support \code{"zoo"} series directly. For historical reasons and completeness, the example is still included but for practical purposes it is not relevant anymore because, from version 0.9-30 on, \code{get.hist.quote} returns a \code{"zoo"} series by default.} A typical application for irregular time series which became increasingly important over the last years in computational statistics and finance is daily (or higher frequency) financial data. The package \pkg{tseries} provides the function \code{get.hist.quote} for obtaining historical financial data by querying Yahoo!\ Finance at \url{http://finance.yahoo.com/}, an online portal quoting data provided by Reuters. The following code queries the quotes of Microsoft Corp.\ starting from 2001-01-01 until 2004-09-30: <>= library("tseries") MSFT <- get.hist.quote(instrument = "MSFT", start = "2001-01-01", end = "2004-09-30", origin = "1970-01-01", retclass = "ts") @ <>= if(online) { MSFT <- get.hist.quote("MSFT", start = "2001-01-01", end = "2004-09-30", origin = "1970-01-01", retclass = "ts") save(MSFT, file = "MSFT.rda", compress = TRUE) } else { load("MSFT.rda") } @ In the returned \code{MSFT} object the irregular data is stored by extending it in a regular grid and filling the gaps with \code{NA}s. The time is stored in days starting from an \code{origin}, in this case specified to be 1970-01-01, the origin used by the \code{"Date"} class. This series can be transformed easily into a \code{"zoo"} series using a \code{"Date"} index. <>= MSFT <- as.zoo(MSFT) index(MSFT) <- as.Date(index(MSFT)) MSFT <- na.omit(MSFT) @ Because this is daily data, the series has a natural underlying regularity. Thus, \code{as.zoo()} returns a \code{"zooreg"} object by default. To treat it as an irregular series \code{as.zoo()} can be applied a second time, yielding a \code{"zoo"} series. The corresponding log-difference returns are depicted in Figure~\ref{fig:tseries}. <>= MSFT <- as.zoo(MSFT) @ \begin{figure}[h!] \begin{center} <>= plot(diff(log(MSFT))) @ \caption{\label{fig:tseries} Log-difference returns for Microsoft Corp.} \end{center} \end{figure} \subsection[timeDate/fCalendar: Indexes of class "timeDate"]{\pkg{timeDate}/\pkg{fCalendar}: Indexes of class \code{"timeDate"}} \label{sec:timeDate} \emph{The original version of this section was written when \pkg{fCalendar} (now: \pkg{timeDate}) and \pkg{zoo} did not yet include enough methods to attach \code{"timeDate"} indexes to \code{"zoo"} series. For historical reasons and completeness, we still briefly comment on the communcation between the packages and their classes.} Although the methods in \pkg{zoo} work out of the box for many index classes, it might be necessary for some index classes to provide \code{c()}, \code{length()}, \code{[}, \code{ORDER()} and \code{MATCH()} methods such that the methods in \pkg{zoo} work properly. Previously, this was the case \code{"timeDate"} from the \pkg{fCalendar} package which is why it was used as an example in this vigntte. Meanwhile however, both \pkg{zoo} and \pkg{fCalendar}/\pkg{timeDate} have been enhanced: The latter contains the methods for \code{c()}, \code{length()}, and \code{[}, while \pkg{zoo} has methods for \code{ORDER()} and \code{MATCH()} for class \code{"timeDate"}. The last two functions essentially work by coercing to the underlying \code{"POSIXct"} and then using the associated methods. The following example illustrates how \code{z2} can be transformed to use the \code{"timeDate"} class. <>= library("timeDate") z2td <- zoo(coredata(z2), timeDate(index(z2), FinCenter = "GMT")) z2td @ \subsection[The classes "yearmon" and "yearqtr": Roll your own index]{The classes \code{"yearmon"} and \code{"yearqtr"}: Roll your own index} \label{sec:yearmon} One of the strengths of the \pkg{zoo} package is its independence of the index class, such that the index can be easily customized. The previous section already explained how an existing class (\code{"timeDate"}) can be used as the index if the necessary methods are created. This section has a similar but slightly different focus: it describes how new index classes can be created addressing a certain type of indexes. These classes are \code{"yearmon"} and \code{"yearqtr"} (already contained in \pkg{zoo}) which provide indexes for monthly and quarterly data respectively. As the code is virtually identical for both classes---except that one has the frequency 12 and the other 4---we will only discuss \code{"yearmon"} explicitly. Of course, monthly data can simply be stored using a numeric index just as the class \code{"ts"} does. The problem is that this does not have the meta-information attached that this is really specifying monthly data which is in \code{"yearmon"} simply added by a class attribute. Hence, the class creator is simply defined as \begin{Scode} yearmon <- function(x) structure(floor(12*x + .0001)/12, class = "yearmon") \end{Scode} which is very similar to the \code{as.yearmon} coercion functions provided. As \code{"yearmon"} data is now explicitly declared to describe monthly data, this can be exploited for coercion to other time classes: either to coarser time scales such as \code{"yearqtr"} or to finer time scales such as \code{"Date"}, \code{"POSIXct"} or \code{"POSIXlt"} which by default associate the first day within a month with a \code{"yearmon"} observation. Adding a \code{format} and \code{as.character} method produces human readable character representations of \code{"yearmon"} data and \code{Ops} and \code{MATCH} methods complete the methods needed for conveniently working with monthly data in \pkg{zoo}. Note, that all of these methods are very simple and rather obvious (as can be seen in the \pkg{zoo} sources), but prove very helpful in the following examples. First, we create a regular series \code{zr3} with \code{"yearmon"} index which leads to improved printing compared to the regular series \code{zr1} and \code{zr2} from Section~\ref{sec:zooreg}. <>= zr3 <- zooreg(rnorm(9), start = as.yearmon(2000), frequency = 12) zr3 @ This could be aggregated to quarterly data via <>= aggregate(zr3, as.yearqtr, mean) @ The index can easily be transformed to \code{"Date"}, the default being the first day of the month but which can also be changed to the last day of the month. <>= as.Date(index(zr3)) as.Date(index(zr3), frac = 1) @ Furthermore, \code{"yearmon"} indexes can easily be coerced to \code{"POSIXct"} such that the series could be exported as a \code{"its"} or \code{"irts"} series. <>= index(zr3) <- as.POSIXct(index(zr3)) as.irts(zr3) @ Again, this functionality makes switching between different time scales or index representations particularly easy and \pkg{zoo} provides the user with the flexibility to adjust a certain index to his/her problem of interest. \section{Summary and outlook} \label{sec:summary} The package \pkg{zoo} provides an \proglang{S3} class and methods for indexed totally ordered observations, such as both regular and irregular time series. Its key design goals are independence of a particular index class and compatibility with standard generics similar to the behaviour of the corresponding \code{"ts"} methods. This paper describes how these are implemented in \pkg{zoo} and illustrates the usage of the methods for plotting, merging and binding, several mathematical operations, extracting and replacing data and index, coercion and \code{NA} handling. An indexed object of class \code{"zoo"} can be thought of as data plus index where the data are essentially vectors or matrices and the index can be a vector of (in principle) arbitrary class. For (weakly) regular \code{"zooreg"} series, a \code{"frequency"} attribute is stored in addition. Therefore, objects of classes \code{"ts"}, \code{"its"}, \code{"irts"} and \code{"timeSeries"} can easily be transformed into \code{"zoo"} objects---the reverse transformation is also possible provided that the index fulfills the restrictions of the respective class. Hence, the \code{"zoo"} class can also be used as the basis for other classes of indexed observations and more specific functionality can be built on top of it. Furthermore, it bridges the gap between irregular and regular series, facilitating operations such as \code{NA} handling compared to \code{"ts"}. Whereas a lot of effort was put into achieving independence of a particular index class, the types of data that can be indexed with \code{"zoo"} are currently limited to vectors and matrices, typically containing numeric values. Although, there is some limited support available for indexed factors, one important direction for future development of \pkg{zoo} is to add better support for other objects that can also naturally be indexed including specifically factors, data frames and lists. \section*{Computational details} The results in this paper were obtained using \proglang{R} \Sexpr{paste(R.Version()[6:7], collapse = ".")} with the packages \pkg{zoo} \Sexpr{gsub("-", "--", packageDescription("zoo")$Version)}, \pkg{strucchange} \Sexpr{gsub("-", "--", packageDescription("strucchange")$Version)}, \pkg{timeDate} \Sexpr{gsub("-", "--", packageDescription("timeDate")$Version)}, \pkg{tseries} \Sexpr{gsub("-", "--", packageDescription("tseries")$Version)} and \pkg{DAAG} \Sexpr{gsub("-", "--", packageDescription("DAAG")$Version)}. \proglang{R} itself and all packages used are available from CRAN at \url{http://CRAN.R-project.org/}. \bibliography{zoo} \newpage \begin{appendix} \section{Reference card} \input{zoo-refcard-raw} \end{appendix} \end{document} \subsection[stats: (Dynamic) regression modelling]{\pkg{stats}: (Dynamic) regression modelling} \label{sec:stats} \code{zoo} provides a facility for extending regression functions such as \code{lm} to handle time series. One simply encloses the \code{formula} argument in \code{I(...)} and ensures that all variables in the formula are of class \code{"zoo"} or all are of class \code{"ts"}. Basic regression functions, like \code{lm} or \code{glm}, in which regression relationships are specified via a \code{formula} only have limited support for time series regression. The reason is that \code{lm(formula, ...)} calls the generic function \code{model.frame(formula, ...)} to create a a data frame with the variables required. This dispatches to \code{model.frame.formula} which does not deal specifically with (various types of) time series data. Therefore, it would be desirable to dispatch to a specialized \code{model.frame} method depending on the type of the dependent variable. As this is a non-standard dispatch, \pkg{zoo} provides the following mechanism: In the call to the regression function, the \code{formula} is insulated by \code{I()}, e.g., as in \code{lm(I(formula), ...)}, leaving \code{formula} unaltered but returning an object of class \code{"AsIs"}. Then, \code{model.frame.AsIs} is called which examines the dependent variable of the \code{formula} and then dispatches to \code{model.frame.foo} if this is of class \code{"foo"}. In \pkg{zoo}, the methods \code{model.frame.zoo} and \code{model.frame.ts} are provided which are able to create model frames from formulas in which \emph{all} variables are of class \code{"zoo"} or \code{"ts"}, respectively. The advantage of \code{model.frame.zoo} is that it aligns the variables along a common index, it allows the usage of \code{lag} and \code{diff} in the model specification and works with the \code{NA} handling methods described in Section~\ref{sec:NA}. Therefore, dynamic linear regression models can be fit easily using the standard \code{lm} function by just insulating \code{I(formula)} in the corresponding call\footnote{In addition to \code{lm} and \code{glm}, this approach works for many other regression functions including \code{randomForest} ensembles from \pkg{randomForest}, \code{svm} support vector machines from \pkg{e1071}, \code{lqs} resistant regression from \pkg{MASS}, \code{nnet} neural networks from \pkg{nnet}, \code{rq} quantile regression from \pkg{quantreg}, and possibly many others.}. A simple example based on artificial data is given below: the lag of a dependent variable is explained by the first differences of a numeric regressor and an explanatory factor. Note, that the variables have different indexes. First, a linear regression model is fitted, then a quantile regression is carried out for the same equation. \begin{verbatim} yz <- zoo(1:20)^2 xz <- zoo(1:18)^2 fz <- zoo(gl(4, 5)) lm(I(lag(yz) ~ diff(xz) + fz)) library("quantreg") rq(I(lag(yz) ~ diff(xz) + fz)) \end{verbatim} See the help page of \code{model.frame.zoo} for more examples and additional information. Furthermore, note that this feature is under development and might subject to changes in future versions. zoo/inst/doc/zoo-faq.Rnw0000644000175400001440000007010712501555040015044 0ustar zeileisusers\documentclass[article,nojss]{jss} \DeclareGraphicsExtensions{.pdf,.eps} %%\newcommand{\mysection}[2]{\subsubsection[#2]{\textbf{#1}}} \let\mysection=\subsubsection \renewcommand{\jsssubsubsec}[2][default]{\vskip \preSskip% \pdfbookmark[3]{#1}{Subsubsection.\thesubsubsection.#1}% \refstepcounter{subsubsection}% {\large \textbf{\textit{#2}}} \nopagebreak \vskip \postSskip \nopagebreak} %% need no \usepackage{Sweave} \author{\pkg{zoo} Development Team} \Plainauthor{zoo Development Team} \Address{ \pkg{zoo} Development Team\\ \proglang{R}-Forge: \url{http://R-Forge.R-project.org/projects/zoo/}\\ Comprehensive \proglang{R} Archive Network: \url{http://CRAN.R-project.org/package=zoo} } \title{\pkg{zoo} FAQ} \Plaintitle{zoo FAQ} \Keywords{irregular time series, ordered observations, time index, daily data, weekly data, returns} \Abstract{ This is a collection of frequently asked questions (FAQ) about the \pkg{zoo} package together with their answers. } \begin{document} \SweaveOpts{engine=R,eps=FALSE} %\VignetteIndexEntry{zoo FAQ} %\VignetteDepends{zoo,chron,timeDate,timeSeries} %\VignetteKeywords{irregular time series, ordered observations, time index, daily data, weekly data, returns} %\VignettePackage{zoo} <>= library("zoo") Sys.setenv(TZ = "GMT") @ \mysection[1. I know that duplicate times are not allowed but my data has them. What do I do?]{1. I know that duplicate times are not allowed but my data has them. What do I do?} \pkg{zoo} objects should not normally contain duplicate times. If you try to create such an object using \pkg{zoo} or \code{read.zoo} then warnings will be issued but the objects will be created. The user then has the opportunity to fix them up -- typically by using \code{aggregate.zoo} or \code{duplicated}. Merging is not well defined for duplicate series with duplicate times and rather than give an undesired or unexpected result, \code{merge.zoo} issues an error message if it encounters such illegal objects. Since \code{merge.zoo} is the workhorse behind many \pkg{zoo} functions, a significant portion of \pkg{zoo} will not accept duplicates among the times. Typically duplicates are eliminated by (1)~averaging over them, (2)~taking the last among each run of duplicates or (3)~interpolating the duplicates and deleting ones on the end that cannot be interpolated. These three approaches are shown here using the \code{aggregate.zoo} function. Another way to do this is to use the \code{aggregate} argument of \code{read.zoo} which will aggregate the zoo object read in by \code{read.zoo} all in one step. Note that in the example code below that \code{identity} is the identity function (i.e. it just returns its argument). It is an \proglang{R} core function: A \code{"zoo"} series with duplicated indexes <>= z <- suppressWarnings(zoo(1:8, c(1, 2, 2, 2, 3, 4, 5, 5))) z @ Fix it up by averaging duplicates: <>= aggregate(z, identity, mean) @ Or, fix it up by taking last in each set of duplicates: <>= aggregate(z, identity, tail, 1) @ Fix it up via interpolation of duplicate times <>= time(z) <- na.approx(ifelse(duplicated(time(z)), NA, time(z)), na.rm = FALSE) @ If there is a run of equal times at end they wind up as \code{NA}s and we cannot have \code{NA} times. <>= z[!is.na(time(z))] @ %% An alternative to aggregating the data is to make the times unique %% by changing them slightly. The facilities here are limited to %% time classes for %% which addition by a number makes sense. See the \code{make.unique.approx} %% and \code{make.unique.incr} functions which use interpolation or %% incrementing by a fixed number. Interpolation has the further restriction %% that the interpolated result must make sense. For example, it makes sense to %% interpolate \code{"POSIXct"} variables but not \code{"Date"} variables since %% the interpolation may fall between dates. %% Also see the \code{make.unique} %% argument to \code{read.zoo} which allows one to read in the data %% and make it unique all in one operation. The \code{read.zoo} command has an \code{aggregate} argument that supports arbitrary summarization. For example, in the following we take the last value among any duplicate times and sum the volumes among all duplicate times. We do this by reading the data twice, once for each aggregate function. In this example, the first three columns are junk that we wish to suppress which is why we specified \code{colClasses}; however, in most cases that argument would not be necessary. <>= Lines <- "1|BHARTIARTL|EQ|18:15:05|600|1 2|BHARTIARTL|EQ|18:15:05|600|99 3|GLENMARK|EQ|18:15:05|238.1|5 4|HINDALCO|EQ|18:15:05|43.75|100 5|BHARTIARTL|EQ|18:15:05|600|1 6|BHEL|EQ|18:15:05|1100|11 7|HINDALCO|EQ|18:15:06|43.2|1 8|CHAMBLFERT|EQ|18:15:06|46|10 9|CHAMBLFERT|EQ|18:15:06|46|90 10|BAJAUTOFIN|EQ|18:15:06|80|100" library("zoo") library("chron") tail1 <- function(x) tail(x, 1) cls <- c("NULL", "NULL", "NULL", "character", "numeric", "numeric") nms <- c("", "", "", "time", "value", "volume") z <- read.zoo(textConnection(Lines), aggregate = tail1, FUN = times, sep = "|", colClasses = cls, col.names = nms) z2 <- read.zoo(textConnection(Lines), aggregate = sum, FUN = times, sep = "|", colClasses = cls, col.names = nms) z$volume <- z2$volume z @ If the reason for the duplicate times is that the data is stored in long format then use \code{read.zoo} (particlarly the \code{split} argument) to convert it to wide format. Wide format is typically a time series whereas long format is not so wide format is the suitable one for zoo. <>= Lines <- "Date Stock Price 2000-01-01 IBM 10 2000-01-02 IBM 11 2000-01-01 ORCL 12 2000-01-02 ORCL 13" stocks <- read.zoo(textConnection(Lines), header = TRUE, split = "Stock") stocks @ \mysection[2. When I try to specify a log axis to plot.zoo a warning is issued. What is wrong?]{2. When I try to specify a log axis to \code{plot.zoo} a warning is issued. What is wrong?} Arguments that are part of \code{...} are passed to the \code{panel} function and the default \code{panel} function, \code{lines}, does not accept \code{log}. Either ignore the warning, use \code{suppressWarnings} (see \code{?suppressWarnings}) or create your own panel function which excludes the \code{log}: <>= z <- zoo(1:100) plot(z, log = "y", panel = function(..., log) lines(...)) @ \mysection[3. How do I create right and a left vertical axes in plot.zoo?]{3. How do I create right and a left vertical axes in \code{plot.zoo}?} The following shows an example of creating a plot containing a single panel and both left and right axes. <>= set.seed(1) z.Date <- as.Date(paste(2003, 02, c(1, 3, 7, 9, 14), sep = "-")) z <- zoo(cbind(left = rnorm(5), right = rnorm(5, sd = 0.2)), z.Date) plot(z[,1], xlab = "Time", ylab = "") opar <- par(usr = c(par("usr")[1:2], range(z[,2]))) lines(z[,2], lty = 2) axis(side = 4) legend("bottomright", lty = 1:2, legend = colnames(z), bty="n") par(opar) @ \begin{figure}[htbp] \begin{center} <>= <> @ \caption{\label{fig:plot-axes} Left and right \code{plot.zoo} axes.} \end{center} \end{figure} \mysection[4. I have data frame with both numeric and factor columns. How do I convert that to a "zoo" object?]{4. I have data frame with both numeric and factor columns. How do I convert that to a \code{"zoo"} object?} A \code{"zoo"} object may be (1)~a numeric vector, (2)~a numeric matrix or (3)~a factor but may not contain both a numeric vector and factor. The underlying reason for this constraint is that \code{"zoo"} was intended to generalize \proglang{R}'s \code{"ts"} class, which is also based on matrices, to irregularly spaced series with an arbitrary index class. The main reason to stick to matrices is that operations on matrices in \proglang{R} are much faster than on data frames. If you have a data frame with both numeric and factor variables that you want to convert to \code{"zoo"}, you can do one of the following. Use two \code{"zoo"} variables instead: <>= DF <- data.frame(time = 1:4, x = 1:4, f = factor(letters[c(1, 1, 2, 2)])) zx <- zoo(DF$x, DF$time) zf <- zoo(DF$f, DF$time) @ These could also be held in a \code{"data.frame"} again: <>= DF2 <- data.frame(x = zx, f = zf) @ Or convert the factor to numeric and create a single \code{"zoo"} series: <>= z <- zoo(data.matrix(DF[-1]), DF$time) @ \mysection[5. Why does lag give slightly different results on a "zoo" and a "zooreg" series which are otherwise the same?]{5. Why does lag give slightly different results on a \code{"zoo"} and a \code{"zooreg"} series which are otherwise the same?} To be definite let us consider the following examples, noting how both \code{lag} and \code{diff} give a different answer with the same input except its class is \code{"zoo"} in one case and \code{"zooreg"} in another: <>= z <- zoo(11:15, as.Date("2008-01-01") + c(-4, 1, 2, 3, 6)) zr <- as.zooreg(z) lag(z) lag(zr) diff(log(z)) diff(log(zr)) @ \code{lag.zoo} and \code{lag.zooreg} work differently. For \code{"zoo"} objects the lagged version is obtained by moving values to the adjacent time point that exists in the series but for \code{"zooreg"} objects the time is lagged by \code{deltat}, the time between adjacent regular times. A key implication is that \code{"zooreg"} can lag a point to a time point that did not previously exist in the series and, in particular, can lag a series outside of the original time range whereas that is not possible in a \code{"zoo"} series. Note that \code{lag.zoo} has an \code{na.pad=} argument which in some cases may be what is being sought here. The difference between \code{diff.zoo} and \code{diff.zooreg} stems from the fact that \code{diff(x)} is defined in terms of \code{lag} like this: \code{x-lag(x,-1)}. \mysection[6. How do I subtract the mean of each month from a "zoo" series?]{6. How do I subtract the mean of each month from a \code{"zoo"} series?} Suppose we have a daily series. To subtract the mean of Jan 2007 from each day in that month, subtract the mean of Feb 2007 from each day in that month, etc. try this: <>= set.seed(123) z <- zoo(rnorm(100), as.Date("2007-01-01") + seq(0, by = 10, length = 100)) z.demean1 <- z - ave(z, as.yearmon(time(z))) @ This first generates some artificial data and then employs \code{ave} to compute monthly means. To subtract the mean of all Januaries from each January, etc. try this: <>= z.demean2 <- z - ave(z, format(time(z), "%m")) @ \mysection[7. How do I create a monthly series but still keep track of the dates?]{7. How do I create a monthly series but still keep track of the dates?} Create a \proglang{S}3 subclass of \code{"yearmon"} called \code{"yearmon2"} that stores the dates as names on the time vector. It will be sufficient to create an \code{as.yearmon2} generic together with an \code{as.yearmon2.Date} methods as well as the inverse: \code{as.Date.yearmon2}. <>= as.yearmon2 <- function(x, ...) UseMethod("as.yearmon2") as.yearmon2.Date <- function(x, ...) { y <- as.yearmon(with(as.POSIXlt(x, tz = "GMT"), 1900 + year + mon/12)) names(y) <- x structure(y, class = c("yearmon2", class(y))) } @ \code{as.Date.yearmon2} is inverse of \code{as.yearmon2.Date} <>= as.Date.yearmon2 <- function(x, frac = 0, ...) { if (!is.null(names(x))) return(as.Date(names(x))) x <- unclass(x) year <- floor(x + .001) month <- floor(12 * (x - year) + 1 + .5 + .001) dd.start <- as.Date(paste(year, month, 1, sep = "-")) dd.end <- dd.start + 32 - as.numeric(format(dd.start + 32, "%d")) as.Date((1-frac) * as.numeric(dd.start) + frac * as.numeric(dd.end), origin = "1970-01-01") } @ This new class will act the same as \code{"yearmon"} stores and allows recovery of the dates using \code{as.Date} and \code{aggregate.zoo}. <>= dd <- seq(as.Date("2000-01-01"), length = 5, by = 32) z <- zoo(1:5, as.yearmon2(dd)) z aggregate(z, as.Date, identity) @ \mysection[8. How are axes added to a plot created using plot.zoo?]{8. How are axes added to a plot created using \code{plot.zoo}?} On single panel plots \code{axis} or \code{Axis} can be used just as with any classic graphics plot in \proglang{R}. The following example adds custom axis for single panel plot. It labels months but uses the larger year for January. Months, quarters and years should have successively larger ticks. <>= z <- zoo(0:500, as.Date(0:500)) plot(z, xaxt = "n") tt <- time(z) m <- unique(as.Date(as.yearmon(tt))) jan <- format(m, "%m") == "01" mlab <- substr(months(m[!jan]), 1, 1) axis(side = 1, at = m[!jan], labels = mlab, tcl = -0.3, cex.axis = 0.7) axis(side = 1, at = m[jan], labels = format(m[jan], "%y"), tcl = -0.7) axis(side = 1, at = unique(as.Date(as.yearqtr(tt))), labels = FALSE) abline(v = m, col = grey(0.8), lty = 2) @ A multivariate series can either be generated as (1)~multiple single panel plots: <>= z3 <- cbind(z1 = z, z2 = 2*z, z3 = 3*z) opar <- par(mfrow = c(2, 2)) tt <- time(z) m <- unique(as.Date(as.yearmon(tt))) jan <- format(m, "%m") == "01" mlab <- substr(months(m[!jan]), 1, 1) for(i in 1:ncol(z3)) { plot(z3[,i], xaxt = "n", ylab = colnames(z3)[i], ylim = range(z3)) axis(side = 1, at = m[!jan], labels = mlab, tcl = -0.3, cex.axis = 0.7) axis(side = 1, at = m[jan], labels = format(m[jan], "%y"), tcl = -0.7) axis(side = 1, at = unique(as.Date(as.yearqtr(tt))), labels = FALSE) } par(opar) @ or (2)~as a multipanel plot. In this case any custom axis must be placed in a panel function. <>= plot(z3, screen = 1:3, xaxt = "n", nc = 2, ylim = range(z3), panel = function(...) { lines(...) panel.number <- parent.frame()$panel.number nser <- parent.frame()$nser # place axis on bottom panel of each column only if (panel.number %% 2 == 0 || panel.number == nser) { tt <- list(...)[[1]] m <- unique(as.Date(as.yearmon(tt))) jan <- format(m, "%m") == "01" mlab <- substr(months(m[!jan]), 1, 1) axis(side = 1, at = m[!jan], labels = mlab, tcl = -0.3, cex.axis = 0.7) axis(side = 1, at = m[jan], labels = format(m[jan], "%y"), tcl = -0.7) axis(side = 1, at = unique(as.Date(as.yearqtr(tt))), labels = FALSE) } }) @ \mysection[9. Why is nothing plotted except axes when I plot an object with many NAs?]{9. Why is nothing plotted except axes when I plot an object with many \code{NA}s?} Isolated points surrounded by \code{NA} values do not form lines: <>= z <- zoo(c(1, NA, 2, NA, 3)) plot(z) @ So try one of the following: Plot points rather than lines. <>= plot(z, type = "p") @ Omit \code{NA}s and plot that. <>= plot(na.omit(z)) @ Fill in the \code{NA}s with interpolated values. <>= plot(na.approx(z)) @ Plot points with lines superimposed. <>= plot(z, type = "p") lines(na.omit(z)) @ Note that this is not specific to \pkg{zoo.} If we plot in \proglang{R} without \pkg{zoo} we get the same behavior. \mysection[10. Does zoo work with Rmetrics?]{10. Does \pkg{zoo} work with \pkg{Rmetrics}?} Yes. \code{timeDate} class objects from the \pkg{timeDate} package can be used directly as the index of a \code{zoo} series and \code{as.timeSeries.zoo} and \code{as.zoo.timeSeries} can convert back and forth between objects of class \code{zoo} and class \code{timeSeries} from the \pkg{timeSeries} package. <>= library("timeDate") dts <- c("1989-09-28", "2001-01-15", "2004-08-30", "1990-02-09") tms <- c( "23:12:55", "10:34:02", "08:30:00", "11:18:23") td <- timeDate(paste(dts, tms), format = "%Y-%m-%d %H:%M:%S") library("zoo") z <- zoo(1:4, td) zz <- merge(z, lag(z)) plot(zz) library("timeSeries") zz as.timeSeries(zz) as.zoo(as.timeSeries(zz)) @ <>= detach("package:timeSeries") detach("package:timeDate") @ \mysection[11. What other packages use zoo?]{11. What other packages use \pkg{zoo}?} A DEIS dependency means that a package lists \pkg{zoo} in the Depends, Enhances, Imports or Suggests clause of their DESCRIPTION file. As of September 27, 2011 there are 65 packages on CRAN with DEIS dependencies on zoo and 207 packages which either have direct DEIS dependencies or a DEIS dependency on a package which in turn has a DEIS dependency on zoo. This suggests that packages that have a DEIS dependency on zoo are themselves popular. If one recursively calculates DEIS dependencies to all depths then 2127 packages on CRAN have direct or indirect DEIS dependencies on zoo. That is over half of CRAN. Below are 74 packages which include those with direct DEIS dependencies as well as packages that are often used with zoo: Some packages depend on zoo indirectly listing such a relationship to a package which in turn has such a dependency on zoo. There are 207 packages which There are 74 other CRAN packages that are or can be used with \pkg{zoo} (and possibly more in other repositories): \begin{center} \begin{tabular}{|p{3.6cm}|p{11cm}|} \hline \multicolumn{2}{|l|}{\emph{Depends}} \\ \hline \pkg{AER} & Applied Econometrics with R \\ \hline \pkg{BootPR} & Bootstrap Prediction Intervals and Bias-Corrected Forecasting \\ \hline \pkg{DMwR} & Functions and data for "Data Mining with R" \\ \hline \pkg{FinTS} & Companion to Tsay (2005) Analysis of Financial Time Series \\ \hline \pkg{MFDF} & Modeling Functional Data in Finance \\ \hline \pkg{Modalclust} & Hierarchical Modal Clustering \\ \hline \pkg{PerformanceAnalytics} & Econometric tools for performance and risk analysis \\ \hline \pkg{RBloomberg} & R/Bloomberg \\ \hline \pkg{RghcnV3} & Global Historical Climate Network Version 3 \\ \hline \pkg{StreamMetabolism} & Stream Metabolism-A package for calculating single station metabolism from diurnal Oxygen curves \\ \hline \pkg{TSfame} & Time Series Database Interface extensions for fame \\ \hline \pkg{TShistQuote} & Time Series Database Interface extensions for get.hist.quote \\ \hline \pkg{TSxls} & Time Series Database Interface extension to connect to spreadsheets \\ \hline \pkg{VhayuR} & Vhayu R Interface \\ \hline \pkg{delftfews} & delftfews R extensions \\ \hline \pkg{dyn} & Time Series Regression \\ \hline \pkg{dynlm} & Dynamic Linear Regression \\ \hline \pkg{fda} & Functional Data Analysis \\ \hline \pkg{forecast} & Forecasting functions for time series \\ \hline \pkg{fractalrock} & Generate fractal time series with non-normal returns distribution \\ \hline \pkg{fxregime} & Exchange Rate Regime Analysis \\ \hline \pkg{glogis} & Fitting and Testing Generalized Logistic Distributions \\ \hline \pkg{hydroTSM} & Time series management, analysis and interpolation for hydrological modelling \\ \hline \pkg{lmtest} & Testing Linear Regression Models \\ \hline \pkg{meboot} & Maximum Entropy Bootstrap for Time Series \\ \hline \pkg{mlogit} & multinomial logit model \\ \hline \pkg{party} & A Laboratory for Recursive Partytioning \\ \hline \pkg{quantmod} & Quantitative Financial Modelling Framework \\ \hline \pkg{rdatamarket} & Data access API for DataMarket.com \\ \hline \pkg{sandwich} & Robust Covariance Matrix Estimators \\ \hline \pkg{sde} & Simulation and Inference for Stochastic Differential Equations \\ \hline \pkg{solaR} & Solar Photovoltaic Systems \\ \hline \pkg{spacetime} & classes and methods for spatio-temporal data \\ \hline \pkg{strucchange} & Testing, Monitoring, and Dating Structural Changes \\ \hline \pkg{tawny} & Provides various portfolio optimization strategies including random matrix theory and shrinkage estimators \\ \hline \pkg{termstrc} & Zero-coupon Yield Curve Estimation \\ \hline \pkg{tgram} & Functions to compute and plot tracheidograms \\ \hline \pkg{tripEstimation} & Metropolis sampler and supporting functions for estimating animal movement from archival tags and satellite fixes \\ \hline \pkg{tseries} & Time series analysis and computational finance \\ \hline \pkg{wq} & Exploring water quality monitoring data \\ \hline \pkg{xts} & eXtensible Time Series \\ \hline \end{tabular} \end{center} \begin{center} \begin{tabular}{|p{3.6cm}|p{11cm}|} \hline \multicolumn{2}{|l|}{\emph{Enhances}} \\ \hline \pkg{chron} & Chronological objects which can handle dates and times \\ \hline \pkg{hydroTSM} & Time series management, analysis and interpolation for hydrological modelling \\ \hline \pkg{lubridate} & Make dealing with dates a little easier \\ \hline \pkg{tis} & Time Indexes and Time Indexed Series \\ \hline \end{tabular} \begin{tabular}{|p{3.6cm}|p{11cm}|} \hline \multicolumn{2}{|l|}{\emph{Imports}} \\ \hline \pkg{fxregime} & Exchange Rate Regime Analysis \\ \hline \pkg{glogis} & Fitting and Testing Generalized Logistic Distributions \\ \hline \pkg{hydroGOF} & Goodness-of-fit functions for comparison of simulated and observed hydrological time series \\ \hline \pkg{openair} & Tools for the analysis of air pollution data \\ \hline \pkg{rasterVis} & Visualization methods for the raster package \\ \hline \end{tabular} \end{center} \begin{center} \begin{tabular}{|p{3.6cm}|p{11cm}|} \hline \multicolumn{2}{|l|}{\emph{Suggests}} \\ \hline \pkg{MeDiChI} & MeDiChI ChIP-chip deconvolution library \\ \hline \pkg{RQuantLib} & R interface to the QuantLib library \\ \hline \pkg{TSAgg} & Time series Aggregation \\ \hline \pkg{TSMySQL} & Time Series Database Interface extensions for MySQL \\ \hline \pkg{TSPostgreSQL} & Time Series Database Interface extensions for PostgreSQL \\ \hline \pkg{TSSQLite} & Time Series Database Interface extentions for SQLite \\ \hline \pkg{TSdbi} & Time Series Database Interface \\ \hline \pkg{TSodbc} & Time Series Database Interface extensions for ODBC \\ \hline \pkg{TSzip} & Time Series Database Interface extension to connect to zip files \\ \hline \pkg{UsingR} & Data sets for the text "Using R for Introductory Statistics" \\ \hline \pkg{Zelig} & Everyone's Statistical Software \\ \hline \pkg{gsubfn} & Utilities for strings and function arguments \\ \hline \pkg{latticeExtra} & Extra Graphical Utilities Based on Lattice \\ \hline \pkg{mondate} & Keep track of dates in terms of months \\ \hline \pkg{playwith} & A GUI for interactive plots using GTK+ \\ \hline \pkg{pscl} & Political Science Computational Laboratory, Stanford University \\ \hline \pkg{quantreg} & Quantile Regression \\ \hline \pkg{tframePlus} & Time Frame coding kernel extensions \\ \hline \end{tabular} \end{center} \begin{center} \begin{tabular}{|p{3.6cm}|p{11cm}|} \hline \multicolumn{2}{|l|}{\emph{Uses or Used with}} \\ \hline \pkg{timeDate} & \pkg{Rmetrics} date and time functions: \code{timeDate} usable with \code{zoo} \\ \hline \pkg{grid} & Graphics infrastructure: use with \code{xyplot.zoo} \\ \hline \pkg{its} & Irregular time series: \code{as.its.zoo}, \code{as.zoo.its} \\ \hline \pkg{lattice} & \pkg{grid}-based graphics: use with \code{xyplot.zoo} \\ \hline \pkg{timeSeries} & \pkg{Rmetrics} time series functions: \code{as.timeSeries.zoo}, \code{as.zoo.timeSeries} \\ \hline \pkg{YaleToolkit} & Data exploration tools from Yale University: accepts \code{"zoo"} input \\ \hline \end{tabular} \end{center} \mysection[12. Why does ifelse not work as I expect?]{12. Why does \code{ifelse} not work as I expect?} The ordinary \proglang{R} \code{ifelse} function only works with zoo objects if all three arguments are zoo objects with the same time index. \pkg{zoo} provides an \code{ifelse.zoo} function that should be used instead. The \code{.zoo} part must be written out since \code{ifelse} is not generic. <>= z <- zoo(c(1, 5, 10, 15)) # wrong !!! ifelse(diff(z) > 4, -z, z) # ok ifelse.zoo(diff(z) > 4, -z, z) # or if we merge first we can use ordinary ifelse xm <- merge(z, dif = diff(z)) with(xm, ifelse(dif > 4, -z, z)) # or in this case we could also use orindary ifelse if we # use fill = NA to ensure all three have same index ifelse(diff(z, fill = NA) > 4, -z, z) @ \mysection[13. In a series which is regular except for a few missing times or for which we wish to align to a grid how is it filled in or aligned?]{13. In a series which is regular except for a few missing times or for which we wish to align to a grid how is it filled or aligned?} <>= # April is missing zym <- zoo(1:5, as.yearmon("2000-01-01") + c(0, 1, 2, 4, 5)/12) g <- seq(start(zym), end(zym), by = 1/12) na.locf(zym, xout = g) @ A variation of this is where the grid is of a different date/time class than the original series. In that case use the \code{x} argument. In the example that follows the series \code{z} is of \code{"Date"} class whereas the grid is of \code{"yearmon"} class: <>= z <- zoo(1:3, as.Date(c("2000-01-15", "2000-03-3", "2000-04-29"))) g <- seq(as.yearmon(start(z)), as.yearmon(end(z)), by = 1/12) na.locf(z, x = as.yearmon, xout = g) @ Here is a \code{chron} example where we wish to create a 10 minute grid: <>= Lines <- "Time,Value 2009-10-09 5:00:00,210 2009-10-09 5:05:00,207 2009-10-09 5:17:00,250 2009-10-09 5:30:00,193 2009-10-09 5:41:00,205 2009-10-09 6:00:00,185" library("chron") z <- read.zoo(textConnection(Lines), FUN = as.chron, sep = ",", header = TRUE) g <- seq(start(z), end(z), by = times("00:10:00")) na.locf(z, xout = g) @ \mysection[14. What is the difference between as.Date in zoo and as.Date in the core of R?]{What is the difference between \code{as.Date} in zoo and \code{as.Date} in the core of R?} zoo has extended the \code{origin} argument of \code{as.Date.numeric} so that it has a default of \code{origin="1970-01-01"} (whereas in the core of R it has no default and must always be specified). Note that this is a strictly upwardly compatible extensions to R and any usage of \code{as.Date} in R will also work in zoo. This makes it more convenient to use as.Date as a function input. For example, one can shorten this: <>= z <- zoo(1:2, c("2000-01-01", "2000-01-02")) aggregate(z, function(x) as.Date(x, origin = "1970-01-01")) @ to just this: <>= aggregate(z, as.Date) @ As another example, one can shorten <>= Lines <- "2000-01-01 12:00:00,12 2000-01-02 12:00:00,13" read.zoo(text = Lines, sep = ",", FUN = function(x) as.Date(x, origin = "1970-01-01")) @ to this: <>= read.zoo(text = Lines, sep = ",", FUN = as.Date) @ Note to package developers of packages that use zoo: Other packages that work with zoo and define \code{as.Date} methods should either import \pkg{zoo} or else should fully export their \code{as.Date} methods in their \code{NAMESPACE} file, e.g. \code{export(as.Date.X)}, in order that those methods be registered with \pkg{zoo}'s \code{as.Date} generic and not just the \code{as.Date} generic in \pkg{base}. \mysection[15. How can I speed up zoo?]{15. How can I speed up zoo?} The main area where you might notice slowness is if you do indexing of zoo objects in an inner loop. In that case extract the data and time components prior to the loop. Since most calculations in R use the whole object approach there are relatively few instances of this. For example, the following shows two ways of performing a rolling sum using only times nearer than 3 before the current time. The second one eliminates the zoo indexing to get a speedup: <>= n <- 50 z <- zoo(1:n, c(1:3, seq(4, by = 2, length = n-3))) system.time({ zz <- sapply(seq_along(z), function(i) sum(z[time(z) <= time(z)[i] & time(z) > time(z)[i] - 3])) z1 <- zoo(zz, time(z)) }) system.time({ zc <- coredata(z) tt <- time(z) zr <- sapply(seq_along(zc), function(i) sum(zc[tt <= tt[i] & tt > tt[i] - 3])) z2 <- zoo(zr, tt) }) identical(z1, z2) @ \end{document} zoo/inst/doc/zoo.R0000644000175400001440000002473212501555040013735 0ustar zeileisusers### R code from vignette source 'zoo.Rnw' ################################################### ### code chunk number 1: preliminaries ################################################### library("zoo") library("tseries") library("strucchange") library("timeDate") online <- FALSE ## if set to FALSE the local copy of MSFT.rda ## is used instead of get.hist.quote() options(prompt = "R> ") Sys.setenv(TZ = "GMT") ################################################### ### code chunk number 2: zoo-prelim ################################################### library("zoo") set.seed(1071) ################################################### ### code chunk number 3: zoo-vectors1 ################################################### z1.index <- ISOdatetime(2004, rep(1:2,5), sample(28,10), 0, 0, 0) z1.data <- rnorm(10) z1 <- zoo(z1.data, z1.index) ################################################### ### code chunk number 4: zoo-vectors2 ################################################### z2.index <- as.POSIXct(paste(2004, rep(1:2, 5), sample(1:28, 10), sep = "-")) z2.data <- sin(2*1:10/pi) z2 <- zoo(z2.data, z2.index) ################################################### ### code chunk number 5: zoo-matrix ################################################### Z.index <- as.Date(sample(12450:12500, 10)) Z.data <- matrix(rnorm(30), ncol = 3) colnames(Z.data) <- c("Aa", "Bb", "Cc") Z <- zoo(Z.data, Z.index) ################################################### ### code chunk number 6: print1 ################################################### z1 z1[3:7] ################################################### ### code chunk number 7: print2 ################################################### Z Z[1:3, 2:3] ################################################### ### code chunk number 8: subset ################################################### z1[ISOdatetime(2004, 1, c(14, 25), 0, 0, 0)] ################################################### ### code chunk number 9: summary ################################################### summary(z1) summary(Z) ################################################### ### code chunk number 10: zooreg1 ################################################### zr1 <- zooreg(sin(1:9), start = 2000, frequency = 4) zr2 <- zoo(sin(1:9), seq(2000, 2002, by = 1/4), 4) zr1 zr2 ################################################### ### code chunk number 11: zooreg2 ################################################### zr1 <- zr1[-c(3, 5)] zr1 class(zr1) frequency(zr1) ################################################### ### code chunk number 12: zooreg1b ################################################### zooreg(1:5, start = as.Date("2005-01-01")) ################################################### ### code chunk number 13: zooreg3 ################################################### is.regular(zr1) is.regular(zr1, strict = TRUE) ################################################### ### code chunk number 14: zooreg4 ################################################### zr1 <- as.zoo(zr1) zr1 class(zr1) is.regular(zr1) frequency(zr1) ################################################### ### code chunk number 15: zooreg5 ################################################### as.ts(zr1) identical(zr2, as.zoo(as.ts(zr2))) ################################################### ### code chunk number 16: plot1 (eval = FALSE) ################################################### ## plot(Z) ################################################### ### code chunk number 17: plot2 (eval = FALSE) ################################################### ## plot(Z, plot.type = "single", col = 2:4) ################################################### ### code chunk number 18: plot2-repeat ################################################### plot(Z, plot.type = "single", col = 2:4) ################################################### ### code chunk number 19: plot1-repeat ################################################### plot(Z) ################################################### ### code chunk number 20: plot3 ################################################### plot(Z, type = "b", lty = 1:3, pch = list(Aa = 1:5, Bb = 2, Cc = 4), col = list(Bb = 2, 4)) ################################################### ### code chunk number 21: plot3-repeat (eval = FALSE) ################################################### ## plot(Z, type = "b", lty = 1:3, pch = list(Aa = 1:5, Bb = 2, Cc = 4), ## col = list(Bb = 2, 4)) ################################################### ### code chunk number 22: rbind ################################################### rbind(z1[5:10], z1[2:3]) ################################################### ### code chunk number 23: cbind ################################################### cbind(z1, z2) ################################################### ### code chunk number 24: merge ################################################### merge(z1, z2, all = FALSE) ################################################### ### code chunk number 25: merge2 ################################################### merge(z1, pi, 1:10) ################################################### ### code chunk number 26: aggregate ################################################### firstofmonth <- function(x) as.Date(sub("..$", "01", format(x))) aggregate(Z, firstofmonth(index(Z)), mean) aggregate(Z, firstofmonth, head, 1) ################################################### ### code chunk number 27: disaggregate ################################################### Nile.na <- merge(as.zoo(Nile), zoo(, seq(start(Nile)[1], end(Nile)[1], 1/4))) head(as.zoo(Nile)) head(na.approx(Nile.na)) head(na.locf(Nile.na)) head(na.spline(Nile.na)) ################################################### ### code chunk number 28: Ops ################################################### z1 + z2 z1 < z2 ################################################### ### code chunk number 29: cumsum ################################################### cumsum(Z) ################################################### ### code chunk number 30: coredata ################################################### coredata(z1) coredata(z1) <- 1:10 z1 ################################################### ### code chunk number 31: index ################################################### index(z2) ################################################### ### code chunk number 32: index2 ################################################### index(z2) <- index(z1) z2 ################################################### ### code chunk number 33: startend ################################################### start(z1) end(z1) ################################################### ### code chunk number 34: window ################################################### window(Z, start = as.Date("2004-03-01")) window(Z, index = index(Z)[5:8], end = as.Date("2004-03-01")) ################################################### ### code chunk number 35: window2 ################################################### window(z1, end = as.POSIXct("2004-02-01")) <- 9:5 z1 ################################################### ### code chunk number 36: lagdiff ################################################### lag(z1, k = -1) merge(z1, lag(z1, k = 1)) diff(z1) ################################################### ### code chunk number 37: coercion ################################################### as.data.frame(Z) ################################################### ### code chunk number 38: na ################################################### z1[sample(1:10, 3)] <- NA z1 na.omit(z1) na.contiguous(z1) na.approx(z1) na.approx(z1, 1:NROW(z1)) na.spline(z1) na.locf(z1) ################################################### ### code chunk number 39: rollapply ################################################### rollapply(Z, 5, sd) rollapply(Z, 5, sd, fill = NA, align = "left") ################################################### ### code chunk number 40: rollmean ################################################### rollmean(z2, 5, fill = NA) ################################################### ### code chunk number 41: strucchange1 ################################################### library("strucchange") library("DAAG") data("fruitohms") ocus <- gefp(ohms ~ 1, order.by = ~ juice, data = fruitohms) ################################################### ### code chunk number 42: strucchange2 ################################################### plot(ocus) ################################################### ### code chunk number 43: tseries1 (eval = FALSE) ################################################### ## library("tseries") ## MSFT <- get.hist.quote(instrument = "MSFT", start = "2001-01-01", ## end = "2004-09-30", origin = "1970-01-01", retclass = "ts") ################################################### ### code chunk number 44: tseries1a ################################################### if(online) { MSFT <- get.hist.quote("MSFT", start = "2001-01-01", end = "2004-09-30", origin = "1970-01-01", retclass = "ts") save(MSFT, file = "MSFT.rda", compress = TRUE) } else { load("MSFT.rda") } ################################################### ### code chunk number 45: tseries2 ################################################### MSFT <- as.zoo(MSFT) index(MSFT) <- as.Date(index(MSFT)) MSFT <- na.omit(MSFT) ################################################### ### code chunk number 46: tseries3 ################################################### MSFT <- as.zoo(MSFT) ################################################### ### code chunk number 47: tseries3 ################################################### plot(diff(log(MSFT))) ################################################### ### code chunk number 48: timeDate2 ################################################### library("timeDate") z2td <- zoo(coredata(z2), timeDate(index(z2), FinCenter = "GMT")) z2td ################################################### ### code chunk number 49: yearmon1 ################################################### zr3 <- zooreg(rnorm(9), start = as.yearmon(2000), frequency = 12) zr3 ################################################### ### code chunk number 50: yearmon2 ################################################### aggregate(zr3, as.yearqtr, mean) ################################################### ### code chunk number 51: yearmon3 ################################################### as.Date(index(zr3)) as.Date(index(zr3), frac = 1) ################################################### ### code chunk number 52: yearmon4 ################################################### index(zr3) <- as.POSIXct(index(zr3)) as.irts(zr3) zoo/inst/doc/zoo-design.Rnw0000644000175400001440000001034712501555040015546 0ustar zeileisusers\documentclass[article,nojss]{jss} %% need no \usepackage{Sweave} \title{\pkg{zoo} Design} \Plaintitle{zoo Design} \author{\pkg{zoo} Development Team} \Plainauthor{zoo Development Team} \Address{ \pkg{zoo} Development Team\\ \proglang{R}-Forge: \url{http://R-Forge.R-project.org/projects/zoo/}\\ Comprehensive \proglang{R} Archive Network: \url{http://CRAN.R-project.org/package=zoo} } \Keywords{irregular time series, ordered observations, time index} \Abstract{ This is a set of design principles that -- albeit not having been explicitly set out initially -- have guided the development of the \proglang{R} \pkg{zoo} package. } \begin{document} \SweaveOpts{engine=R,eps=FALSE} %\VignetteIndexEntry{zoo Design} %\VignetteDepends{zoo} %\VignetteKeywords{irregular time series, ordered observations, time index} %\VignettePackage{zoo} <>= library("zoo") Sys.setenv(TZ = "GMT") @ \emph{\pkg{zoo} works with any ordered index class} having the prescribed methods, see \code{?zoo} and \cite{zoo:Zeileis+Grothendieck:2005}. Specific index classes are not hard-coded in functions (with a few exceptions necessitated by external interfaces such as reading and interfacing with `\code{ts}') but rather all index operations are only done via the allowed methods. \emph{\pkg{zoo} is invisible}. As far as possible new names (e.g., for functions or methods and their arguments) are not introduced. New functionality is added as methods to generics from base \proglang{R} allowing reuse of those names. When names are added, thought is put into the name since \pkg{zoo} is so miserly about adding them. For example, the \code{read.zoo} name is obviously derived from \code{read.table} and the names \code{na.locf} or \code{na.approx} are in analogy to other \code{na.*} functions frome base \proglang{R}. \emph{\pkg{zoo} is consistent with base \proglang{R}}. The idea is to make the usage of \pkg{zoo} completely natural to someone who already has experience with \proglang{R} (in particular with the `\code{ts}' class). Certainly, \pkg{zoo} contains extensions to base \proglang{R}, but they should be as consistent as possible and have a natural `look and feel'. \emph{\pkg{zoo} is infrastructure}. \pkg{zoo} tries to do basic things well, e.g., data reading, handling, aggregation, transformation, etc. However, it does not provide time series modeling functionality -- \pkg{zoo} rather encourages add-on packages. A list of current packages employing \pkg{zoo} can be found on the Comprehensive \proglang{R} Archive Network (CRAN) and in the \pkg{zoo} FAQ, see \code{vignette("zoo-faq", package = "zoo")}. \emph{\pkg{zoo} interfaces to all other time series packages} on CRAN (or at least all of the more popular ones and some of the relatively unknown ones as well). Thus, time series information can be passed back and forth relatively easily between `\code{zoo}' and other time series classes and hence combinations of various functionalities are facilitated. \emph{\pkg{zoo} includes extensive documentation}. In addition to the standard \code{help()} pages, \pkg{zoo} provides a set of vignettes, see \code{vignette(package = "zoo")} for a list. Furthermore, the \pkg{zoo} Development Team members also post frequently on the mailing lists (especially ``\proglang{R}-help'', ``\proglang{R}-devel'', and ``\proglang{R}-SIG-Finance'') whose archives hence contain many useful code snippets etc. \emph{\pkg{zoo} has no bug list since all bugs are fixed (almost) immediately}. Over the last years, \pkg{zoo} has grown into a mature package. Nevertheless, there are always still bugs (or border cases that are not handled well). When reported to the development team by e-mail, these typically get fixed immediately in the Subversion (SVN) repository on \proglang{R}-Forge. (As of this writing, there are a couple of entries in the \pkg{zoo} \proglang{R}-Forge bug list, however typically this is not the situation.) \emph{\pkg{zoo} includes formal regression testing}. We have started developing formal regression tests employing \proglang{R}'s own system (in \code{zoo/tests/}) as well as the \pkg{RUnit} package \citep{zoo:RUnit}. \bibliography{zoo} \end{document} zoo/inst/doc/MSFT.rda0000644000175400001440000002514212501555040014240 0ustar zeileisusers mWY;oH `A 2c@B9ͣ~wc0 NX nj)!%!B!pF BD,douzok.3/:skk䭓O=iSy{w}koh| o{}+|vs||f;C?O9UW:{3tF}s.kϬ)ȍt>x]{Άo_-#7f'?_W鸂|a|חLǝ2\;zlw:@X/>;yoٽjq} /ٮ=Έ?AtO2p +agڔ'[pN\7!_ճOe?wCb\#'e78|1;K9gmk2iG|:e?Y _ٗMy =w?OY鸜u"{}gM\>Gn䥑?kS;SXagxUVd{{YX_O%f:N&?kweU{VC᳁/͝q9kץ~uY>i[ӢGݙAc*/YQC|g8 =@ߌx.ϢG?%s ]'F|б]AXp_S|_uSAy 1{onW)uNmI }߀=~?y5<>{t9ֵ~9gr^Gb sK`9ubgm ޵aG tx\P߆x>8 ry?@G@VV~@^nWdY׿:f;uWό%zj仾8 |hK=JY~D`㫿 qUV~6LyqzQU8r^g V×ꀫː/ڂ.;?UϏ:] dq>` Wޓ/U5y^`wNPCǚFg z[uSK_f3Zg-Xs;k&n_j7S\W_Ǿ'՟R}>!Y} r{oVЯ&MG~K~#A79>4Y^U:(R~]_R '%HK]װk9yDx؅:Ug9r:UGúfG~}q;3_HsF6wٜ;%#9 n mN}qgA<-ٗɸv>o< :9zq=zӂqq7#w,ےG23{O%ς8yqo}}s\}\~۸lS9"lN\G&? ~>7:'[%G>~^Dϖ%y&|K~6/k$!~ yJtKO%o>%>|JoՕO _7tt'ĕ L]>n|<ޜ%iKb$)򔲮8h;㨇/ ϥ^f)qֶc?oxnOmZLɗ6|&&؞3ǥi G.)dq 6y6y| L?oMǑ,ER3 <S |/yH\l};>q{K֒8{ _ ^gX}Bq[D? t _fԹcNJ:7xB9]zU'pYs!Wwkx݃OtͺNhUՇsGv>­v=p^}8ԖN/o oϧsVUϮϸ.p\:DU[WO;?;_?UknoqpW8yǘ 捼q;$ cpy}qfGr^\W6cy ތuL) Wݿ䓆 rs~~3_? ݛX/vab5|Zs~ؑХϣݦr9wi/wF{OU,}DK9O4AY#v> n\GC}-ʄ'mI>L~9[c]\r}>rxܟ ŋ}`"."ᷲ)NRY7~Gz.wjS g+?S H(<{}?a#}\n5sy@3Np zSt =e{g=rmXv=5xxpN=GSy#?;pe}Ѻ:ₖzzfCy |JO~Mމ]YO˧>;p[v#g}(L{Iͻ Uh^8H_u=*pP]҉CJp?ύˋm4wN4R̊BgD8pp4zD)XMv#Ig*>g qRq*ڤ_V;;]kbE~Tm\>KZnFR,˱g+U0n? V﮾po*oqS.z[`EnGR?_Вݯs]X<>ȥٱguY`s_&r9ܜzl݊*?ruy9]C pͱ]q ѓ8_>cxq=8_xE?V^3YC^5m7Y|-Fzt[vk9ζF>G?MM{`kG>kW1Ὶؗ(祍!g#Α:u?VХ"^MvHpsGg,y.`.<^񆷣3yhI8:A٧y >8)`Wg "vN oz'χpµ9/=s7D8O9~x@8$.otv tO!W z/ tB/<MRĿOo7Ľb™6[)IEg__>~@Omᗐ%z!҉C VΉ=qX3\BfK)=?lg:y2q\Өo oppM/cx'g>83[ =zpS'L;Şnvp1O̷S 7jlۉ6W/umoO[impR.JH=1$8̩3<Na螁e/N 7ps3ǿ;@?S;8# ~&n7򈥓-6t}s4ՃaIg8q^p)~}qnY>w1ܺq OO Ǫ{[]pl1xk2ݯy7{Ńzr[#'vyI˄M?.?4QgǸXzx9CNaT\s$KI']2oz[7R ER$pr e/ _*;/%^?0f|88"?OoC{SZN]u)ܸY.K.vsg *|ݎ?"_[7Yl$O~.kSwF~-.8%,~i w;s~Νx=(kyY:}8m|<!lUQ}51,vLu{:r+\%QM.WTIcl9-k9nOc<`}XsJ&7Y{5EGr55TI;R{*B{y9²p8 ?g37=q|r^;oc'Rχ} eu 9pY0yk5{>p+)|9wu4_'nXm߀ć}D~j#%|'^uoS~(*zUaʰ}7|_ݶG9#.1<ܮ5GGuCɆ+E߉_wwF~:%n?g<s?;t_)I8p{wM~VA{[лy?Yԟ&ؿW _8_ᰈ; YCOYw8ċ="z`i~>y>yv -|.wkD̯-6YO~>w2`{ޑ~>4뉇q8=Wĸckurݣ«~|x5f񇾠SSuVC4,~d~% ɹ#}Bσȗ.7쳥N^{w βFﭟ-?i^m*d_!s7aZ_]1f7/__M3\?_ uCEx㠧3qEyw\J%V^x-p%YD;C+Pƿ3^G|įY_Eq[⧭|b/}K8sVo7v}[jm*I?|ruHE\Vb;qqxeǭGqQI}eSފ+q݊0߳^5!߹'oe93+r'q 3Sˉ ԫ Rؗ/zSKٸ,guɏr3wÉQ#G'<;x ?r`J z|G˾ 9A_Pr\}zkyח7̾Tą}Ui곰+_r ^T<ý7oǾ~=w~?Рv }3YuLmKW̖z{> Jpf5u)y|Wu )qb{ VPT_Ղy/V' {͹^~s9}vg3fX?U8Q^ 8ks#.v-q?m}8׹?5wss'β>sOWfs>s~__5-|%l,g޹s|}\88M%}Yx!AN '\pq~k3m| <ϩ ϝs9O͏<̜`fW̉lSwAG?p |?f}5GpA/ qt=5h 9zx#W8 λ~«}F8yჄ;ߧL^l8DD뼜|7u^.y C8Yb; N>s{8_M{mWY}.Glܧ~SF.y>m7m]-vH!DrOos'mNԹg*4qk{"8yIT'ȇ\fst ُvr+>d:!_7)8Rt!O59N-﬿%2~.;q~pu` *K~1SvpK_  羈Wy޽<0#׺dX/}1[$jq~}>(v#ɟ~ ~rCO=Q_|{o{?K~A|{>s'J\msGw)YZ /c`/W}ݏ pzY܅Lqȵݏ@NS1? ݧ~q`w:80(xw?}qyӼ?1N8p(= '߼}pv_U9ԳU£Q[={8ԎYǸpO8 u:{\/uB<- i *+iٟᧈs{J"VW:yJ7θw±:%Ɖ߼Ee9騃uȗps81kWp?'k rޑouw0^\o% =O5o՗s:ȥG;9.]LX?go} }? ܉<ﳛv|h]Oįrn:w2]'@d}^ -Nu=GG :Okm_X;d-9~OyOG~Byk\KX5Vx޻O_lMa8}YuǵYCgq#gܳ|)gK Q}TL{u_#c7[VCԼ-w\+~Lj*f' 9jEtE>~ Sq]{èVEq^w¾O>tUZ~c?Z]{=j/<˛OY_+aCUz^pZ,';S^@>߯.}o zU©pčY 󔞢)yUWIW('_-px)iA|"/tIk<¿qpb3w9GWEOѧ=Wy};*{x˧?t/~UoN^L渧1y%l{&ʇȏ_߼8sC\Q \vE|-Rck?د;?܈7Vν_ܰև3r>5Zu9k.A~Wuɧ&cy r5xN}O'c欟0X8.rf%(!tsVI+x`z.\~pw8ჴ>Y /4p1 }d@^?35\j!ה8X}7<~ă{[nCǔ..SOB9yύoLSþ/}u#o^򙒇G8vL [G yc *ud^'&^,6q"88oɾ~8p#ԓ !;?ã@}/to8K7>~\,!Nh޸\n`x߆^LSj9o1<42p=-}/J8gɍrc'Ra{c8Nz'ugױ{mĉ ,;ri}$#뻊}1{>Hc>۟ *\钼e] =R-%߷>uӳx8$DNb~{&>ʞbǧw'>MoxIDN&q8x GK?պ;ZݳD}ԥ;ykԓ>= library("zoo") library("chron") Sys.setenv(TZ = "GMT") @ \section*{Example 1} \textbf{Input class:} Text file/connection (space-separated with header). \textbf{Input index:} \class{integer}. \textbf{Output class:} Multivariate \class{zoo} series. \textbf{Output index:} \class{integer}. \textbf{Strategy:} No transformation of time index needed, hence only a simple call to \fct{read.zoo}. <>= Lines <- " time latitude longitude altitude distance heartrate 1277648884 0.304048 -0.793819 260 0.000000 94 1277648885 0.304056 -0.793772 262 4.307615 95 1277648894 0.304075 -0.793544 263 25.237911 103 1277648902 0.304064 -0.793387 256 40.042988 115 " z <- read.zoo(text = Lines, header = TRUE) z @ \newpage \section*{Example 2} \textbf{Input class:} \class{data.frame}. \textbf{Input index:} \class{factor} with labels indicating AM/PM times but no date. \textbf{Output class:} Multivariate \class{zoo} series. \textbf{Output index:} \class{times} (from \pkg{chron}). \textbf{Strategy:} The idea is to add some dummy date (here 1970-01-01) to the \class{character} lables, then transform to \class{chron} and extract the \class{times}. <>= DF <- structure(list( Time = structure(1:5, .Label = c("7:10:03 AM", "7:10:36 AM", "7:11:07 AM", "7:11:48 AM", "7:12:25 AM"), class = "factor"), Bid = c(6118.5, 6118.5, 6119.5, 6119, 6119), Offer = c(6119.5, 6119.5, 6119.5, 6120, 6119.5)), .Names = c("Time", "Bid", "Offer"), row.names = c(NA, -5L), class = "data.frame") DF @ <>= z <- read.zoo(DF, FUN = function(x) times(as.chron(paste("1970-01-01", x), format = "%Y-%m-%d %H:%M:%S %p"))) z @ \newpage \section*{Example 3} \textbf{Input class:} Text file/connection (semicolon-separated with header). \textbf{Input index:} \class{factor}s with labels indicating dates (column~1) and times (column~2). \textbf{Output class:} Multivariate \class{zoo} series, with separate columns for each date. \textbf{Output index:} \class{times} (from \pkg{chron}). \textbf{Strategy:} Split the data based on date (column~1) and process times (column~2) to \class{times}. Enhance column names at the end. <>= Lines <- " Date;Time;Close 01/09/2009;10:00;56567 01/09/2009;10:05;56463 01/09/2009;10:10;56370 01/09/2009;16:45;55771 01/09/2009;16:50;55823 01/09/2009;16:55;55814 02/09/2009;10:00;55626 02/09/2009;10:05;55723 02/09/2009;10:10;55659 02/09/2009;16:45;55742 02/09/2009;16:50;55717 02/09/2009;16:55;55385 " f <- function(x) times(paste(x, 0, sep = ":")) z <- read.zoo(text = Lines, header = TRUE, sep = ";", split = 1, index = 2, FUN = f) colnames(z) <- sub("X(..).(..).(....)", "\\3-\\2-\\1", colnames(z)) z @ \newpage \section*{Example 4} \textbf{Input class:} Text file/connection (space-separated with header). \textbf{Input index:} \class{factor}s with labels indicating dates (column~1) and times (column~2). \textbf{Output class:} Multivariate \class{zoo} series. \textbf{Output index:} \class{chron} (from \pkg{chron}). \textbf{Strategy:} Indicate vector of two columns in \code{index}, which is subsequently processed by a \code{FUN} taking two arguments and returning a \class{chron} time/date. <>= Lines <- " Date Time O H L C 1/2/2005 17:05 1.3546 1.3553 1.3546 1.35495 1/2/2005 17:10 1.3553 1.3556 1.3549 1.35525 1/2/2005 17:15 1.3556 1.35565 1.35515 1.3553 1/2/2005 17:25 1.355 1.3556 1.355 1.3555 1/2/2005 17:30 1.3556 1.3564 1.35535 1.3563 " f <- function(d, t) as.chron(paste(as.Date(chron(d)), t)) z <- read.zoo(text = Lines, header = TRUE, index = 1:2, FUN = f) z @ \newpage \section*{Example 5} \textbf{Input class:} Text file/connection (space-separated with non-matching header). \textbf{Input index:} \class{factor}s with labels indicating dates (column~6) and unneeded weekdays (column~5) and times (column~7). \textbf{Output class:} Multivariate \class{zoo} series. \textbf{Output index:} \class{Date}. \textbf{Strategy:} First, \code{skip} the header line, remove unneeded columns by setting \code{colClasses} to \code{"NULL"}, and set suitable \code{col.names}. Second, convert the date column to a \class{Date} index using \code{format}. Finally, aggregate over duplicate dates, keeping only the last observation. <>= Lines <- " views number timestamp day time 1 views 910401 1246192687 Sun 6/28/2009 12:38 2 views 921537 1246278917 Mon 6/29/2009 12:35 3 views 934280 1246365403 Tue 6/30/2009 12:36 4 views 986463 1246888699 Mon 7/6/2009 13:58 5 views 995002 1246970243 Tue 7/7/2009 12:37 6 views 1005211 1247079398 Wed 7/8/2009 18:56 7 views 1011144 1247135553 Thu 7/9/2009 10:32 8 views 1026765 1247308591 Sat 7/11/2009 10:36 9 views 1036856 1247436951 Sun 7/12/2009 22:15 10 views 1040909 1247481564 Mon 7/13/2009 10:39 11 views 1057337 1247568387 Tue 7/14/2009 10:46 12 views 1066999 1247665787 Wed 7/15/2009 13:49 13 views 1077726 1247778752 Thu 7/16/2009 21:12 14 views 1083059 1247845413 Fri 7/17/2009 15:43 15 views 1083059 1247845824 Fri 7/17/2009 18:45 16 views 1089529 1247914194 Sat 7/18/2009 10:49 " cl <- c("NULL", "numeric", "character")[c(1, 1, 2, 2, 1, 3, 1)] cn <- c(NA, NA, "views", "number", NA, NA, NA) z <- read.zoo(text = Lines, skip = 1, col.names = cn, colClasses = cl, index = 3, format = "%m/%d/%Y", aggregate = function(x) tail(x, 1)) z @ Extract all Thursdays and Fridays. <>= (z45 <- z[format(time(z), "%w") %in% 4:5,]) @ Keep last entry in each week. <>= z45[!duplicated(format(time(z45), "%U"), fromLast = TRUE), ] @ Alternative approach: Above approach labels each point as it was originally labeled, i.e., if Thursday is used it gets the date of that Thursday. Another approach is to always label the resulting point as Friday and also use the last available value even if its not Thursday. Create daily grid and fill in so Friday is filled in with prior value if Friday is \code{NA}. <>= g <- seq(start(z), end(z), by = "day") z.filled <- na.locf(z, xout = g) @ Extract Fridays, including those filled in from previous day. <>= z.filled[format(time(z.filled), "%w") == "5", ] @ \newpage \section*{Example 6} \textbf{Input class:} Text file/connection (comma-separated with header). \textbf{Input index:} \class{factor}s with labels indicating dates (column~1) and times (column~2). \textbf{Output class:} Multivariate \class{zoo} series. \textbf{Output index:} \class{chron} (from \pkg{chron}) or \class{POSIXct}. \textbf{Strategy:} Three versions, all using vector \code{index = 1:2}. <>= Lines <- " Date,Time,Open,High,Low,Close,Up,Down 05.02.2001,00:30,421.20,421.20,421.20,421.20,11,0 05.02.2001,01:30,421.20,421.40,421.20,421.40,7,0 05.02.2001,02:00,421.30,421.30,421.30,421.30,0,5" @ With custom \code{FUN} using \fct{chron} after appending seconds. <>= f <- function(d, t) chron(d, paste(t, "00", sep = ":"), format = c("m.d.y", "h:m:s")) z <- read.zoo(text = Lines, sep = ",", header = TRUE, index = 1:2, FUN = f) z @ With custom \code{FUN} using \fct{as.chron} with suitable \code{format}. <>= f2 <- function(d, t) as.chron(paste(d, t), format = "%d.%m.%Y %H:%M") z2 <- read.zoo(text = Lines, sep = ",", header = TRUE, index = 1:2, FUN = f2) z2 @ Without \code{FUN}, hence the \code{index} columns are pasted together and then passt do \fct{as.POSIXct} because \code{tz} and \code{format} are specified. <>= z3 <- read.zoo(text = Lines, sep = ",", header = TRUE, index = 1:2, tz = "", format = "%d.%m.%Y %H:%M") z3 @ \newpage \section*{Example 7} \textbf{Input class:} Text file/connection (space-separated with header). \textbf{Input index:} \class{factor}s with labels indicating dates (column~1) and times (column~2). \textbf{Output class:} Multivariate \class{zoo} series. \textbf{Output index:} \class{POSIXct}. \textbf{Strategy:} Due to standard date/time formats, only \code{index = 1:2} and \code{tz = ""} need to be specified to produce \class{POSIXct} index. <>= Lines <- "Date Time V2 V3 V4 V5 2010-10-15 13:43:54 73.8 73.8 73.8 73.8 2010-10-15 13:44:15 73.8 73.8 73.8 73.8 2010-10-15 13:45:51 73.8 73.8 73.8 73.8 2010-10-15 13:46:21 73.8 73.8 73.8 73.8 2010-10-15 13:47:27 73.8 73.8 73.8 73.8 2010-10-15 13:47:54 73.8 73.8 73.8 73.8 2010-10-15 13:49:51 73.7 73.7 73.7 73.7 " z <- read.zoo(text = Lines, header = TRUE, index = 1:2, tz = "") z @ \newpage \section*{Example 8} \textbf{Input class:} Text file/connection (space-separated without header). \textbf{Input index:} \class{factor} with labels indicating dates. \textbf{Output class:} Multivariate \class{zoo} series, with separate columns depending on column~2. \textbf{Output index:} \class{Date}. \textbf{Strategy:} Non-standard \code{na.strings} format needs to be specified, series is \code{split} based on second column, and date \code{format} (in column~1, default) needs to be specified. <>= Lines <- " 13/10/2010 A 23 13/10/2010 B 12 13/10/2010 C 124 14/10/2010 A 43 14/10/2010 B 54 14/10/2010 C 65 15/10/2010 A 43 15/10/2010 B N.A. 15/10/2010 C 65 " z <- read.zoo(text = Lines, na.strings = "N.A.", format = "%d/%m/%Y", split = 2) z @ \newpage \section*{Example 9} \textbf{Input class:} Text file/connection (comma-separated with header). \textbf{Input index:} \class{factor} with labels indicating date/time. \textbf{Output class:} Univariate \class{zoo} series. \textbf{Output index:} \class{chron} (from \pkg{chron}) or \class{POSIXct}. \textbf{Strategy:} Ignore first two columns by setting \code{colClasses} to \code{"NULL"}. Either produce \class{chron} index via \fct{as.chron} or use all defaults to produce \class{POSIXct} by setting \code{tz}. <>= Lines <- ' "","Fish_ID","Date","R2sqrt" "1",1646,2006-08-18 08:48:59,0 "2",1646,2006-08-18 09:53:20,100 ' z <- read.zoo(text = Lines, header = TRUE, sep = ",", colClasses = c("NULL", "NULL", "character", "numeric"), FUN = as.chron) z z2 <- read.zoo(text = Lines, header = TRUE, sep = ",", colClasses = c("NULL", "NULL", "character", "numeric"), tz = "") z2 @ \newpage \section*{Example 10} \textbf{Input class:} Text file/connection (space-separated with non-matching header). \textbf{Input index:} \class{factor} with labels indicating date (column~3) and time (column~4). \textbf{Output class:} Multivariate \class{zoo} series. \textbf{Output index:} \class{chron} (from \pkg{chron}) or \class{POSIXct}. \textbf{Strategy:} \code{skip} non-matching header and extract date/time from two columns \code{index = 3:4}. Either using sequence of two functions \code{FUN} and \code{FUN2} or employ defaults yielding \class{POSIXct}. <>= Lines <- " iteration Datetime VIC1 NSW1 SA1 QLD1 1 1 2011-01-01 00:30 5482.09 7670.81 2316.22 5465.13 2 1 2011-01-01 01:00 5178.33 7474.04 2130.30 5218.61 3 1 2011-01-01 01:30 4975.51 7163.73 2042.39 5058.19 4 1 2011-01-01 02:00 5295.36 6850.14 1940.19 4897.96 5 1 2011-01-01 02:30 5042.64 6587.94 1836.19 4749.05 6 1 2011-01-01 03:00 4799.89 6388.51 1786.32 4672.92 " z <- read.zoo(text = Lines, skip = 1, index = 3:4, FUN = paste, FUN2 = as.chron) z z2 <- read.zoo(text = Lines, skip = 1, index = 3:4, tz = "") z2 @ \newpage \section*{Example 11} \textbf{Input class:} \class{data.frame}. \textbf{Input index:} \class{Date}. \textbf{Output class:} Multivariate \class{zoo} series. \textbf{Output index:} \class{Date}. \textbf{Strategy:} Given a \class{data.frame} only keep last row in each month. Use \fct{read.zoo} to convert to \class{zoo} and then \fct{na.locf} and \fct{duplicated}. <>= DF <- structure(list( Date = structure(c(14609, 14638, 14640, 14666, 14668, 14699, 14729, 14757, 14759, 14760), class = "Date"), A = c(4.9, 5.1, 5, 4.8, 4.7, 5.3, 5.2, 5.4, NA, 4.6), B = c(18.4, 17.7, NA, NA, 18.3, 19.4, 19.7, NA, NA, 18.1), C = c(32.6, NA, 32.8, NA, 33.7, 32.4, 33.6, NA, 34.5, NA), D = c(77, NA, 78.7, NA, 79, 77.8, 79, 81.7, NA, NA)), .Names = c("Date", "A", "B", "C", "D"), row.names = c(NA, -10L), class = "data.frame") DF z <- read.zoo(DF) na.locf(z)[!duplicated(as.yearmon(time(z)), fromLast = TRUE)] @ \newpage \section*{Example 12} \textbf{Input class:} Text file/connection (space-separated without header). \textbf{Input index:} \class{factor} with labels indicating dates. \textbf{Output class:} Univariate \class{zoo} series. \textbf{Output index:} \class{Date}. \textbf{Strategy:} Only keep last point in case of duplicate dates. <>= Lines <- " 2009-10-07 0.009378 2009-10-19 0.014790 2009-10-23 -0.005946 2009-10-23 0.009096 2009-11-08 0.004189 2009-11-10 -0.004592 2009-11-17 0.009397 2009-11-24 0.003411 2009-12-02 0.003300 2010-01-15 0.010873 2010-01-20 0.010712 2010-01-20 0.022237 " z <- read.zoo(text = Lines, aggregate = function(x) tail(x, 1)) z @ \newpage \section*{Example 13} \textbf{Input class:} Text file/connection (comma-separated with header). \textbf{Input index:} \class{factor} with labels indicating date/time. \textbf{Output class:} Multivariate \class{zoo} series. \textbf{Output index:} \class{POSIXct} or \class{chron} (from \pkg{chron}). \textbf{Strategy:} Dates and times are in standard format, hence the default \class{POSIXct} can be produced by setting \code{tz} or, alternatively, \class{chron} can be produced by setting \fct{as.chron} as \code{FUN}. <>= Lines <- " timestamp,time-step-index,value 2009-11-23 15:58:21,23301,800 2009-11-23 15:58:29,23309,950 " z <- read.zoo(text = Lines, header = TRUE, sep = ",", tz = "") z z2 <- read.zoo(text = Lines, header = TRUE, sep = ",", FUN = as.chron) z2 @ \newpage \section*{Example 14} \textbf{Input class:} Text file/connection (space-separated with header). \textbf{Input index:} \class{factor}s with labels indicating dates (column~1) times (column~2). \textbf{Output class:} Univariate \class{zoo} series. \textbf{Output index:} \class{chron} (from \pkg{chron}). \textbf{Strategy:} Indicate vector \code{index = 1:2} and use \fct{chron} (which takes two separate arguments for dates and times) to produce \class{chron} index. <>= Lines <- " Date Time Value 01/23/2000 10:12:15 12.12 01/24/2000 11:10:00 15.00 " z <- read.zoo(text = Lines, header = TRUE, index = 1:2, FUN = chron) z @ \newpage \section*{Example 15} \textbf{Input class:} Text file/connection (space-separated with header). \textbf{Input index:} \class{numeric} year with quarters represented by separate columns. \textbf{Output class:} Univariate \class{zoo} series. \textbf{Output index:} \class{yearqtr}. \textbf{Strategy:} First, create a multivariate annual time series using the year index. Then, create a regular univariate quarterly series by collapsing the annual series to a vector and adding a new \class{yearqtr} index from scratch. <>= Lines <- " Year Qtr1 Qtr2 Qtr3 Qtr4 1992 566 443 329 341 1993 344 212 133 112 1994 252 252 199 207 " za <- read.zoo(text = Lines, header = TRUE) za zq <- zooreg(as.vector(t(za)), start = yearqtr(start(za)), freq = 4) zq @ \newpage \section*{Further comments} Multiple files can be read and subsequently merged. <>= filenames <- dir(pattern = "csv$") z <- read.zoo(filenames, header = TRUE, sep = ",", fixed = FALSE) @ \end{document} zoo/inst/doc/zoo-faq.R0000644000175400001440000003100112501555040014465 0ustar zeileisusers### R code from vignette source 'zoo-faq.Rnw' ################################################### ### code chunk number 1: preliminaries ################################################### library("zoo") Sys.setenv(TZ = "GMT") ################################################### ### code chunk number 2: duplicates1 ################################################### z <- suppressWarnings(zoo(1:8, c(1, 2, 2, 2, 3, 4, 5, 5))) z ################################################### ### code chunk number 3: duplicates2 ################################################### aggregate(z, identity, mean) ################################################### ### code chunk number 4: duplicates3 ################################################### aggregate(z, identity, tail, 1) ################################################### ### code chunk number 5: duplicates4 ################################################### time(z) <- na.approx(ifelse(duplicated(time(z)), NA, time(z)), na.rm = FALSE) ################################################### ### code chunk number 6: duplicates5 ################################################### z[!is.na(time(z))] ################################################### ### code chunk number 7: duplicates ################################################### Lines <- "1|BHARTIARTL|EQ|18:15:05|600|1 2|BHARTIARTL|EQ|18:15:05|600|99 3|GLENMARK|EQ|18:15:05|238.1|5 4|HINDALCO|EQ|18:15:05|43.75|100 5|BHARTIARTL|EQ|18:15:05|600|1 6|BHEL|EQ|18:15:05|1100|11 7|HINDALCO|EQ|18:15:06|43.2|1 8|CHAMBLFERT|EQ|18:15:06|46|10 9|CHAMBLFERT|EQ|18:15:06|46|90 10|BAJAUTOFIN|EQ|18:15:06|80|100" library("zoo") library("chron") tail1 <- function(x) tail(x, 1) cls <- c("NULL", "NULL", "NULL", "character", "numeric", "numeric") nms <- c("", "", "", "time", "value", "volume") z <- read.zoo(textConnection(Lines), aggregate = tail1, FUN = times, sep = "|", colClasses = cls, col.names = nms) z2 <- read.zoo(textConnection(Lines), aggregate = sum, FUN = times, sep = "|", colClasses = cls, col.names = nms) z$volume <- z2$volume z ################################################### ### code chunk number 8: readsplit ################################################### Lines <- "Date Stock Price 2000-01-01 IBM 10 2000-01-02 IBM 11 2000-01-01 ORCL 12 2000-01-02 ORCL 13" stocks <- read.zoo(textConnection(Lines), header = TRUE, split = "Stock") stocks ################################################### ### code chunk number 9: log-plot ################################################### z <- zoo(1:100) plot(z, log = "y", panel = function(..., log) lines(...)) ################################################### ### code chunk number 10: plot-axes (eval = FALSE) ################################################### ## set.seed(1) ## z.Date <- as.Date(paste(2003, 02, c(1, 3, 7, 9, 14), sep = "-")) ## z <- zoo(cbind(left = rnorm(5), right = rnorm(5, sd = 0.2)), z.Date) ## ## plot(z[,1], xlab = "Time", ylab = "") ## opar <- par(usr = c(par("usr")[1:2], range(z[,2]))) ## lines(z[,2], lty = 2) ## ## axis(side = 4) ## legend("bottomright", lty = 1:2, legend = colnames(z), bty="n") ## par(opar) ################################################### ### code chunk number 11: plot-axes1 ################################################### set.seed(1) z.Date <- as.Date(paste(2003, 02, c(1, 3, 7, 9, 14), sep = "-")) z <- zoo(cbind(left = rnorm(5), right = rnorm(5, sd = 0.2)), z.Date) plot(z[,1], xlab = "Time", ylab = "") opar <- par(usr = c(par("usr")[1:2], range(z[,2]))) lines(z[,2], lty = 2) axis(side = 4) legend("bottomright", lty = 1:2, legend = colnames(z), bty="n") par(opar) ################################################### ### code chunk number 12: factor1 ################################################### DF <- data.frame(time = 1:4, x = 1:4, f = factor(letters[c(1, 1, 2, 2)])) zx <- zoo(DF$x, DF$time) zf <- zoo(DF$f, DF$time) ################################################### ### code chunk number 13: factor2 ################################################### DF2 <- data.frame(x = zx, f = zf) ################################################### ### code chunk number 14: factor3 ################################################### z <- zoo(data.matrix(DF[-1]), DF$time) ################################################### ### code chunk number 15: lags ################################################### z <- zoo(11:15, as.Date("2008-01-01") + c(-4, 1, 2, 3, 6)) zr <- as.zooreg(z) lag(z) lag(zr) diff(log(z)) diff(log(zr)) ################################################### ### code chunk number 16: subtract-monthly-means ################################################### set.seed(123) z <- zoo(rnorm(100), as.Date("2007-01-01") + seq(0, by = 10, length = 100)) z.demean1 <- z - ave(z, as.yearmon(time(z))) ################################################### ### code chunk number 17: subtract-monthly-means2 ################################################### z.demean2 <- z - ave(z, format(time(z), "%m")) ################################################### ### code chunk number 18: yearmon2 ################################################### as.yearmon2 <- function(x, ...) UseMethod("as.yearmon2") as.yearmon2.Date <- function(x, ...) { y <- as.yearmon(with(as.POSIXlt(x, tz = "GMT"), 1900 + year + mon/12)) names(y) <- x structure(y, class = c("yearmon2", class(y))) } ################################################### ### code chunk number 19: yearmon2-inverse ################################################### as.Date.yearmon2 <- function(x, frac = 0, ...) { if (!is.null(names(x))) return(as.Date(names(x))) x <- unclass(x) year <- floor(x + .001) month <- floor(12 * (x - year) + 1 + .5 + .001) dd.start <- as.Date(paste(year, month, 1, sep = "-")) dd.end <- dd.start + 32 - as.numeric(format(dd.start + 32, "%d")) as.Date((1-frac) * as.numeric(dd.start) + frac * as.numeric(dd.end), origin = "1970-01-01") } ################################################### ### code chunk number 20: yearmon2-example ################################################### dd <- seq(as.Date("2000-01-01"), length = 5, by = 32) z <- zoo(1:5, as.yearmon2(dd)) z aggregate(z, as.Date, identity) ################################################### ### code chunk number 21: single-panel ################################################### z <- zoo(0:500, as.Date(0:500)) plot(z, xaxt = "n") tt <- time(z) m <- unique(as.Date(as.yearmon(tt))) jan <- format(m, "%m") == "01" mlab <- substr(months(m[!jan]), 1, 1) axis(side = 1, at = m[!jan], labels = mlab, tcl = -0.3, cex.axis = 0.7) axis(side = 1, at = m[jan], labels = format(m[jan], "%y"), tcl = -0.7) axis(side = 1, at = unique(as.Date(as.yearqtr(tt))), labels = FALSE) abline(v = m, col = grey(0.8), lty = 2) ################################################### ### code chunk number 22: multiplesingleplot ################################################### z3 <- cbind(z1 = z, z2 = 2*z, z3 = 3*z) opar <- par(mfrow = c(2, 2)) tt <- time(z) m <- unique(as.Date(as.yearmon(tt))) jan <- format(m, "%m") == "01" mlab <- substr(months(m[!jan]), 1, 1) for(i in 1:ncol(z3)) { plot(z3[,i], xaxt = "n", ylab = colnames(z3)[i], ylim = range(z3)) axis(side = 1, at = m[!jan], labels = mlab, tcl = -0.3, cex.axis = 0.7) axis(side = 1, at = m[jan], labels = format(m[jan], "%y"), tcl = -0.7) axis(side = 1, at = unique(as.Date(as.yearqtr(tt))), labels = FALSE) } par(opar) ################################################### ### code chunk number 23: multipanelplot ################################################### plot(z3, screen = 1:3, xaxt = "n", nc = 2, ylim = range(z3), panel = function(...) { lines(...) panel.number <- parent.frame()$panel.number nser <- parent.frame()$nser # place axis on bottom panel of each column only if (panel.number %% 2 == 0 || panel.number == nser) { tt <- list(...)[[1]] m <- unique(as.Date(as.yearmon(tt))) jan <- format(m, "%m") == "01" mlab <- substr(months(m[!jan]), 1, 1) axis(side = 1, at = m[!jan], labels = mlab, tcl = -0.3, cex.axis = 0.7) axis(side = 1, at = m[jan], labels = format(m[jan], "%y"), tcl = -0.7) axis(side = 1, at = unique(as.Date(as.yearqtr(tt))), labels = FALSE) } }) ################################################### ### code chunk number 24: plot-with-na ################################################### z <- zoo(c(1, NA, 2, NA, 3)) plot(z) ################################################### ### code chunk number 25: plot-with-na1 ################################################### plot(z, type = "p") ################################################### ### code chunk number 26: plot-with-na2 ################################################### plot(na.omit(z)) ################################################### ### code chunk number 27: plot-with-na3 ################################################### plot(na.approx(z)) ################################################### ### code chunk number 28: plot-with-na4 ################################################### plot(z, type = "p") lines(na.omit(z)) ################################################### ### code chunk number 29: Rmetrics ################################################### library("timeDate") dts <- c("1989-09-28", "2001-01-15", "2004-08-30", "1990-02-09") tms <- c( "23:12:55", "10:34:02", "08:30:00", "11:18:23") td <- timeDate(paste(dts, tms), format = "%Y-%m-%d %H:%M:%S") library("zoo") z <- zoo(1:4, td) zz <- merge(z, lag(z)) plot(zz) library("timeSeries") zz as.timeSeries(zz) as.zoo(as.timeSeries(zz)) ################################################### ### code chunk number 30: Rmetrics-detach ################################################### detach("package:timeSeries") detach("package:timeDate") ################################################### ### code chunk number 31: ifelse ################################################### z <- zoo(c(1, 5, 10, 15)) # wrong !!! ifelse(diff(z) > 4, -z, z) # ok ifelse.zoo(diff(z) > 4, -z, z) # or if we merge first we can use ordinary ifelse xm <- merge(z, dif = diff(z)) with(xm, ifelse(dif > 4, -z, z)) # or in this case we could also use orindary ifelse if we # use fill = NA to ensure all three have same index ifelse(diff(z, fill = NA) > 4, -z, z) ################################################### ### code chunk number 32: fillin ################################################### # April is missing zym <- zoo(1:5, as.yearmon("2000-01-01") + c(0, 1, 2, 4, 5)/12) g <- seq(start(zym), end(zym), by = 1/12) na.locf(zym, xout = g) ################################################### ### code chunk number 33: fillin-2 ################################################### z <- zoo(1:3, as.Date(c("2000-01-15", "2000-03-3", "2000-04-29"))) g <- seq(as.yearmon(start(z)), as.yearmon(end(z)), by = 1/12) na.locf(z, x = as.yearmon, xout = g) ################################################### ### code chunk number 34: fillin-3 ################################################### Lines <- "Time,Value 2009-10-09 5:00:00,210 2009-10-09 5:05:00,207 2009-10-09 5:17:00,250 2009-10-09 5:30:00,193 2009-10-09 5:41:00,205 2009-10-09 6:00:00,185" library("chron") z <- read.zoo(textConnection(Lines), FUN = as.chron, sep = ",", header = TRUE) g <- seq(start(z), end(z), by = times("00:10:00")) na.locf(z, xout = g) ################################################### ### code chunk number 35: date ################################################### z <- zoo(1:2, c("2000-01-01", "2000-01-02")) aggregate(z, function(x) as.Date(x, origin = "1970-01-01")) ################################################### ### code chunk number 36: date-2 ################################################### aggregate(z, as.Date) ################################################### ### code chunk number 37: date-3 ################################################### Lines <- "2000-01-01 12:00:00,12 2000-01-02 12:00:00,13" read.zoo(text = Lines, sep = ",", FUN = function(x) as.Date(x, origin = "1970-01-01")) ################################################### ### code chunk number 38: date-4 ################################################### read.zoo(text = Lines, sep = ",", FUN = as.Date) ################################################### ### code chunk number 39: indexing ################################################### n <- 50 z <- zoo(1:n, c(1:3, seq(4, by = 2, length = n-3))) system.time({ zz <- sapply(seq_along(z), function(i) sum(z[time(z) <= time(z)[i] & time(z) > time(z)[i] - 3])) z1 <- zoo(zz, time(z)) }) system.time({ zc <- coredata(z) tt <- time(z) zr <- sapply(seq_along(zc), function(i) sum(zc[tt <= tt[i] & tt > tt[i] - 3])) z2 <- zoo(zr, tt) }) identical(z1, z2) zoo/inst/doc/zoo-faq.pdf0000644000175400001440000032006512501555042015052 0ustar zeileisusers%PDF-1.5 % 1 0 obj << /Type /ObjStm /Length 4227 /Filter /FlateDecode /N 98 /First 816 >> stream x[[s8~?5/;$q!gN9vq&NvqF-n$#R3| /CۚDKї(`LGL L1LLiE, $3, #{}E$*4G3akx!+\X A dQ| `“L!^LT B&B "ä/dϤ 018X!,01jb]4K x/ёU!^X_,Uie~>G@ =Wx$Ngd^wNُ^~gi_{^,dfi<>-pxlXYI>Kg@t"orݽ %ps헱_QK-*' 7Ydea!Y?oVFM>?+PK4)j Dm$)7(|No|z?m d/(-ɣ(7r>'<''Y^,74-NJOoY~y\jNi2e ŋE~uɖߙ5y\d9a9({C>ŬECZ>@̕0 ]{JkT HI!YqLӋ,fmZիE^Ns\WY]2Hb*Iʳ˭(FD6 æŰ_w)aBVftrQdU`zH ;,|ήiB>|Լy+i'/%Y[E%JI^4x9deJVw/ˬh HK Xɴ)oO pC"x-\5,ܠ%\En"d)\,T^\$*) %6sLUr+ӹ6('YݤEB@ hs7A6ԙM8<ٚnX-W;23_$sK(a;ʗ8wځګ4X(VKNw$?Ѻ W;jI.U3TK(S$WJkOU~)?u~*r#hfi+غt'Ї{n ,|,ip誃p|8A8F 4B"Jn R^+Ƀ-\;_wJSTU);G0jY7aGXoneR"6h:lF9-zX2* 7[ Cm)FVn ,afaɴ4jz, [Aj + I:YN~%.;;ûOnz`6gdcdE`2ph0IfjaR~؎O\53n܏鬜C+/cBPHmiU#/PL,B 68:vNpەIe @KnHgi~c,윸XadjEBث].i# ygcZŔLVsa|kbkwm"t!H_'-O?O3W>3 ~?z~Hlfc[pc=}a',mEҸoMCoζ`.Re'5c$3L?_m,_ԘOE^ϭui P`;,Q9 XC&سcTiH;Sk;kaueQ5XGэd)F:C}GvR-=8UHTH6*,A6=O{ۆzwKۆY/3mSN{ڷ`C_wPki(G(Wn&VKًնGwBu㵲P<< __l~Ӌy#~;elc%ϓls 5p) W$w4K9"SIe7 j.duٞk2u5*[^,:(oruFHVy+ sw}3Voo-9oo_~9?QEn3S ccCuer KZ "?jpfA=دڱ_5<Kuw(%I$A? U,BԢ:Ҩtt9:2D? 2[هW/m؎;+)g1򑹀6bG}Ea5F2g i45`ӖU cZy *ȁt 5gO1II/ ݆A喃h]\['@Ѡw`44{LwѸzvߏUѯdZ%jSXRo~}qX.>rp]BЊՋW,΁("wJ[}IiӔ2u [.:8g9u SU(@H4=l;N3ۆ&~JWꐦҎO|xF;m[FcHyuu`[m]ԪJչZ#%m]Ի|R-(i sIѣL@>lTǔ1"f++so4DڈN̗lªЋ((_hzInE^g3C;Kw%X[ 7ay6GrxױԿx| t+tnqw*B&t6tݵ%UuqڴRC&w~ۭ`[uU+vUG Ѱ(~xz6v! Zl n"optzbA+'Go[yPU ȲVwUj14 u,JٮwMV]UAx~yPs%i︴MYql0~ϐz.^rJk-j@ЦEު/gfw]mIPLfAtdq/;l5ĭAٝY rsAo(essƺ:Y䟫{,ugF%}̼zݿR^1z.֪pz\*ݥeyOW*cty.yΟX3{PVm\mgvNһ JI(IDElc4a-s5Ա_v:}i^ϲ8C~1Vއov%'%Olt4tL|=t.ߑmzԞ7%̭3t qq' Pm 74[/܏=Q a'D endstream endobj 100 0 obj << /Subtype /XML /Type /Metadata /Length 1337 >> stream 2015-03-16T14:26:57+01:00 2015-03-16T14:26:57+01:00 David M. Jones CMB10 endstream endobj 101 0 obj << /Filter /FlateDecode /Length 4680 >> stream x[KǑ#>u/|? -vwm@>P6G$GQGVedu %AɚȈ/aQ_ٺ|64uSw~o8otns_`Dl?j9gA)`@IQJz1ev} ~ov'~SH]7(au3CpSXh"TzRi0=N Q)?,,TNJYc@6 n^<⎸+2no\v]͵ RCy+q}ݕr|#ϫG `+oL绫h!y9n՚M9PJ!ySR6*x5/Z9i^{P9m: Z}Crwf{I6EpX{::O(Y8N.Qh 8a_2lȬ%KL|v~nVV^\YJõUNʀmOoY4xo۪*1%$ö9c ۿ` M;eJ.ޕNir[qIfbNox;AOڅ8#۝3?ܱqlVlznE)r@h7{`\x *QIu ~o-IE8xQC=-J~ͧ]ȸ>vG?\C&cC `޺=mADN3,7>4Oޥ cA , e9d!u)/-Tf#^]&*%B_T UBxON{A[ά\V (L`Xnl7*#=1E2 iyˠiz h"\pª``[]1aT,T T2o$gD3kCtj2@_j\(^RC n4{V1|_,.ݡqo} up ov53[~3+1O ] ٖ:jX 4JMBXmUFN!c44^.$J҃爃le)m< Y{:g-$pw D?1㇇hu\g`}j9 U[`\F)9 >B:p*¡37E!^@NUqRB! Q%7+rYD Evu 5%$9jb-c3"M?zdp:s|3ઙ.f\@wc3PRx}͐,(4eX1DO1UI~!\Vl#OܑqqL.O\'vJ3oM1@A@8_'.Z XR>nH v꺐Nݍ T{wɩB)JN SbE/Ԛ1aݓqpx ?))IZJ "k$+u#Wj;L?C"% dOTQ]kjV}ٴ XQI*XgLڢIؔ87Pw , s}P$=Ȏis͵*]Mۮ@us墳q0pfCc%"#abg XItoQ$C]>x(,cʯ b4W[&ˁe6eP"qGS2"['VQRg>F7svRV7 'nYZ@q67W=e;A6:F.75/Z uvzL{v{x}ߖ1 qSr-R70/HG~Qhқo"?K:7Ay0xmCu' )-GnW7ˠzp XX(ZBa *kaQ[,BN~!p~jeO'Eݱϗ9 h(UWqnKed'A'*P`1!-~a 8ܦEVgwFd he%K?_֥py5JPHz֢\\% k91e^ "Wô6eey)5$[^:s> stream xr_D;PEqGUR*͔d?x,,}}fJb61h?-T nOuD-6'?Ev)`\zqzyR? |UXDlenR+{C5}NrzIwc4kH$n(vwQ吓qfEN+ݷTNI)mAm!Bzzz~%rM.V)| rFJnM C^?S@W^΅Xi{MeE\D@VZ9f#OO$mb9 <'';J^S0wGwdq: Sk7X:#W@]*sIU0@_$&K=1ZN\:][_(֙$ӛ4kC;^.^12eGZEN  3*Y9kټ!?&8JJxRRz6)с}o}Y>0 *3ѵY0-ˀxZEȰrHa\>FSVN<1φGӕQicXйN v6DSWrfҒ)b2w%\Ybǖ6cBB$7*uQ#'MKqL[ܱH R #Am2r3͇[VV+ܧX1+q<gPB{I ސ !'ߌ =u7 3Nf-s.UGiQOeQJ{.V(=pWYKn D=9 ˘ݍ M・xӃiIl:f-yϦ@ch`| DOdS^NW:RΩVJWcTx1DY9njSͬgy ]o0P"ku9lE j9 8ڌN |R`v: ߢA@@1Ɓ+"@4{mb1s:DjOg%w3WĆr3d/%g'+aGKV2[2c_Ȱ]0ߋeSsqg/앫9h<#T2::Q@68b-ۧt :>a4Ed{ĢiFZ{1~+Z9&њ$b|}T|5!OR7M6bWXEkW"19Ŋb:]2]11G#+Y2)0#QsE=4Kֵ?k~KN +ji+&q_9!endstream endobj 103 0 obj << /Filter /FlateDecode /Length 3524 >> stream xZێ}߯h:_\bH`{7ڬ.#ʏ_!a$f(\W*ȕ~ڮ>6pY%胇z#FnK0|v%^u{U…0d-0ßE熯i VteJ\(xG̋:5P3[m_#7֫W8OgzٷGF~#ZY4A;*66(Rڎ06ä6\4)-gRmI-GI&`TiRc3;4dbf^ataȬRG61gWB71Q8=:=ЇC1?Pq@oCz #Yk,A8i `7u : .3Lh 22IM\Jܐ_Jkf"1 B 3a3HDɾ-e1t̿ZQ# B'=>#M/04?@ƹxs1U4SF;@nOW2Vrn oOJ8ݨU"pRǣ͠zqAD/?p!'lvM*3\(X[0!'4Åv *gaBt 1Y<$A78ү/Toqd2)4󎘘5BٻecAt M\-8;'CM灪WGǿ}:܂ er3\]\ 3S*<0(QL@P ih(AaxIexŨE9*%49M 3H`p9gIZ71Vi^Vv֗k`!eqrs58B9fXM؀_ pl÷S[,ӎk\#Z[7aIF8-YCc  @k8ޑBx{qb1FPp$h=D(!ɣ /߯%M58du9BO/r!,Ɂq)iIpw/רX jjQ&X釄A+mT X mt9c$ p,?FZ8 REN .`yj̪ڦ*7qJSmP8L64B("ieBZ˕͓̫9d6TE6LQ?F&riS2[83=!'Gn $Cdhn*k& ll딚 ?"tw;6I/#.ͭ{2R0}ܠ ßz`JV>̩0~lJf/aE&/XgQPe+Ih|v8yt).]td-6n7O,$SznX'B0ALk`:nJ9S6(BBϸ*dڐ0ŔP{넍FD{EM7CkEZ;ZN12YntV } Y$Qv [ ( .RāL`+7B_qˤq Z2.aUg wpD݆מEό . # ȻIYb%14!۴yW q&=jUMЊ  ;3q<2$h9 ;9Y8Bqrqp oQJT@'Q9.R[keͼlfA/q=7Mp]vF Vό)OZ'봕U@'9-(u Q3Ɩ½yv1*R_I/pR*F&##Ң:d~(FerX^8iJ;!Pw)4Ӣ3m33&Ww ?4oyQq_THډ\,P k.EqBmʹΕsvtƻ,+okl 偌qMKMf1알5PB45fDSW^1)6n1fi,#R61 C_V9c`]is}WA;dy zr"+g5%wG^[Npj 3?&-͙|dbMzŅ3rj:ଈ\L&nE/`\x<۶kr8*Bɻˬ#6gfaz&+,kܲWYTiq92+ˍ@r]ndcS%oj{I"^rm!)忢=.OHw!L oYګ:'av*AQB =hyP'I;<f]Guim-l]baT4ya9P:$y֨r$yg dUn׀IػI|*z}Dv܋͙ ׶ mˆSme%|"?-5U2ck".<-D9}&Pr?' dU]%Ȇeoqlu^Ф q/h$La&y5Eu/4{mQY²ף6dt?7 !yi oٴ6mٱ vQ 0݆q5/5_gaC& M>j +7m!&76,,;[\~Q; IXf*t[b$fC߭4ƹ~-{+0#A m =|y VPOȼ|_T<]k9*&ߔM7^T1w]/MM5Y}{#O_e &}2 l' *۩E¹_eO..h9qz$NZte}4xW{K_S0/UQS#)%67q$<{c,4ȼ/7Qtv";euvB[{|7HL1hk(B^8+by=G(SOYw5^aOcToee`L:ևcm~L~kXMʢm6|چ6d5.xayO}n6Zoendstream endobj 104 0 obj << /Filter /FlateDecode /Length 4204 >> stream x[Yo$~#?$;އHH" <ɖ4Fק&= ͣ꫃Uş(_Gx}_7:{(<>8Jce;֏Q㓛R:mݰY,tZ1ễEV9C.`JCg(aCTPB7bPF5oq#z' L;J*ߓFC*F hq=r*4R18^0S !yإ`prpM?bi 6 $t!mW !U0FDCoÊ}䨠!FqJ:8o<-`ZHL?٢j 9 r"ל F@ 63?†QKt"bpt|0 U1}p~n CJ > 9 v"Һp6 a8U2љz :a?nCVV"KWA JTԴPpF:J$.n0ޗY^ǀ2"hMTi sAVk৵7E1";/HN32p\fy[8~%Aߕ 1̗hQ[O; BXU[{ԴFdPML`RtVop)2O~tLJv$ o@Q;PUY v _$Y;#@Ruf`J 5|tu@Va!,im.̣7b8 ri2*d:#;ecN\0? ~_6Vp 5`:0]@;Wh[ ۭsYkoʾ{5J%R`J]zї[w@W0װ96D(Ûd4ϧ^KP DXOj$/asfGuL6׋.r(*vXV5Kk|Y]6/xX_dOEHM"KڇĐoD4Z&迤V A?;7 iE7/ofO߹`R *,+%KZYr~נ_P\9'k߇Y{Av;‡" %=(o~A4H]tc|6"cE\uMzD75҇T ) B\D|w^yhlxxv\Ϗ>LsAFX H }9.p8h_65@YTҫR[1iyZ`6>RcKȝŵ?, ,Mt#f:mm t#BZ>oxWk7grq'a :S¦haks ?2zbp 9QFoyLȓ"4mZIǻi{xƲ\:@0~X`m?@6C=8@Fox!߸$;ae*xck|%'V)<1 I*%g.1mZYOcceBπ2Ê~Dh0M|É41„*#NMDvVz~8`YYk5.u?/Q eM&)fyc 4Lh>5&>O&iGKΦMcv21C)&=z\U^"niJ(T˒YR[Q7 dH1}8XdJjR*T덂җ6VW_M͍,"ĩ`4tBeMdYW0%&mWX&Z,;H9F03SX95 Lsx>ݓDvsG%6ؙeMv'dfp0et\v!I$qjwt[sl-W)ogbilu!,܄ghhѵmdH Ʋm ХmHE (twƥwUVFɱ>ښRGY;2@KP.$+yڜ8#KY&cߦKDDLWw̼Nw7-~#% _qV %se|LTݞ`= #Y;qݺ<:oHhT~w)ئ|/.o<`T>kf5dsqЎe7O"> G>Aw&ͺ{ElOL{U!;jdF猘t'XbkDM[`,9"]ߔEbj4Y1a_Rŧ#w4 &)U)~ڟd+'}ٰjWK 9U3iZ{Z=-茥V= QnS=R yċN}s5d@x%A(W]b %X;6H$^Zת]@7qX<۞zVM }:c~ K/).7Fڼ6(S=AÿO*EU#)~AtC@=[+3<8MwLP$=ݬڸ x ¨rBpi߳E_1[|_";U;p\EHYa0|I8Hu t='3R69j`>cK2oN{`vcׯy,gGc\*+,]}5:΋ L9Մ W5}g]:yyzf5 @qO.eg oi7_WMSzf c-xtr7Ru{}#W7Me .+htHE7p""Y= !&IJW˝xM>I#t#u <2;:ٍ0sɁb鼽o؋K@E(^M{)MOBpA`fuv}GhY%37~v3^ Fqy׃1Hz(Gd7,OyVzuki ["q -]sph)8:/JN3 fǿ0o grehۇ^!]"X0$] r\2OIM1*[v nj(nas՝92{mO vendstream endobj 105 0 obj << /Filter /FlateDecode /Length 3146 >> stream xkoP7\ س}y?E4m(YO7Ζg^rfvlᛳ̋hB{p?Y\ދ=(??Fbx/o 6j?kr?kUB>x?y\V`|Y4R+:1تZB~RJѹ{$!d CFWJ6XXiu.MJ}s&<[j "4W Vڇy! "ֆlW99B Bh| %iUjsI(l1q͚0HF魓BRh-9m]2\D5L0H"{Bxߺ\5fh0K Y$ȧ#rEa,҂ϐ^pchռM\kgMO&Qȫ5lP -9Q b\lS@e+x VWx :tA?3I*h^pv*+&YuA.pfR)5cV`Nq=Eu.(m6z냁K >Mt@ bY-u{Juo~.6$wٓO&K3gp'$@$b#\a93<{l6ܥ`tMT2ZO;F!d(ELYKPBaU:9XPh! ZM(Nx-5Gk~$b{l~\Yq"?z3&obGU]]W𢂪;5d{5>- ÎDSW7yI XdWW`)I\"]@*԰m2t*h`=4: 9݁%'1$5D,y,op<^lѐBN33ROz)|7HK唕SPF?ɔBd(HMH,Σ 5/M R3Y!f 0",?%V8$cT6'@$`n~&̐&a%$ Jus>CBٔJN(0*&1K_ȩ;N%p o55!Hb''AC'4ق#eIŗ4$5c*%=֙֝DzE5'pLVX0[gp꠺{YE Rlɩ38x2=Hj)8C.`b}QC-gH{4pbY+*֩΋tv3fWBr,5};:H3E#ɫ묰(\)6,!iz=AdVf՝*.0Ak)|+A1`Ąu`p`  M'M!^&nI)HQ+R=tT}tORKd x 㒜lʻ@*핥yq}fDh$;+qm`o8~՞V)EXa=0Sչ͛Uti*~4c "ɰA3q2^bTU-6'Yf (=[ ((j$!~1+$PY6v2+UuLTTlW |;W+_ufARҽs:˹^iCFQȨTf>1%&39 =pV׍: n&+JwN '7Xo iM9K vW~~\M׆qrʵ6&4ްiޱϴu%K`~y{SAõB ZO~ʿcW ǧ,LJ<Ǥ"M]u9=쭬3%+Vן:'`cM{|m'u<6*CW_]p_-n."<]Hrl}|HVgs쪂gv.(?} @׻)?gsI|n"V@ʩ&ngYeow܃Da~p _!߿a P ?(Tl'$\z]%\ڥ $!]7M}$T #zťfXuah~p'*ҏ̾=֔c}k|@pΖM0F7WяBF *9 Eh_7!AX4RȃgQ2n`IQmýG o=kO(v0~43 3V:F_ ن -IzXx<ɃYy~^otѳH 3eFȩE&wlu_ɣNc}>¤at ;D{}\)qx4ot?7Y>+QwqP# ~25W) zjMQV'g+/@$oW$lZ1o0{7H:a˓S1Oi :q {pjN_(&jG$_>{dh=bӗ OwQ1ӊ X`}]WS#߲D 5ca9,i%CBVW_S~-}'6}c d#wq[q!>m"~5v!tU)|[G 83<.5[f9w9`7,-N;i)ٻ=?INendstream endobj 106 0 obj << /Filter /FlateDecode /Length 3189 >> stream x[r}Wljюq⤔S˩Tz&*]D4.3h,{9$%RA > `&w}.x&;g;tkXm[/dw|X+4LؖqE)En9!{kEv }A0hoBaf;D{Pfcٝ::ꁻy&P/vE*)iW݃Nw_.zyL'3[gL׸0&gմәA_543A,1y7).A9t|L.LXqpU|W4zm˴ɹ!9)s`I[W8WF^vhP>[V rV[ SrcB cL*LͽU`E@(`Bh4.t8El afi.^Y ĝ`n>t? زUai5~,q5%#Դʻ~y0)e+`gql\?cOxq6Y$%d=D1qFh;, PC?^!q^ JD[Y =W@YWCyPM|sٻWUBٷ C!D$7yCA"\pR`U3"ҧ<;˼ryI95g%ΐ}󼒧 i{Y-.l;MNuPPtc< !iܗt jژ`RJ<ڎ紞F*UR\# ֬ERC s> +58 II3gUͿ|Yi}7vhYp؁l2!!=p&?]ͬo5q'[sSdVħEd$>)ӡ תm/;"1eVħEd$<`!Me7Q*UΫZf@m8mJEQ+Z&.@@A{yG| 䂑>gEU컾nM0켈".& do| *:lapNb& ;qE]iEQx4QL%W>VI sJ~L$  ɾHR32Pi}"vC ǁ~wR]$]cgIJ+mSzF/_QA'|዆HUBčr&( WZTM nϭ64޺&"#%fmVE;0ӱ X'P*_FTQjV9)殪!u|Jmz,*ayX~:چWeMʔ/ӝOI m=jaA2W(&fi腞`ݮ.Tg@or%†W~z\yEQPDzL+9ӉihL t!IӸv<&)q< /X=y?ȯȸ,⍙~n|!ӄ_Ln=1ݛ43*DLwJ8/|uT%zٳ\F$6ȸ#wpڟpN`E`UZ@^9//Cvo* ̏^p&܈RF<5ouX31 iDo[G_Rfe TЙ!).ƪzI?@?AymG;+ BwtW tO("*z!}>E0ic¨D)pnueՎB3Ը ˆ{Iv+kvBukG KH ;%uC}/H9NǘN6Aظ?#1Ou[r4GNNU Z[Q޲/Ɇ\r; J+}@ͫ[4 rK yYg_?91.#=4댨~ıMEiL*t nZ8d=RDA/Hh>{6"9smzKj\ƛ}/{ƛeu6ߏ!?Zz|TsEmud=f)Z'aw>XA9endstream endobj 107 0 obj << /Filter /FlateDecode /Length 3046 >> stream xZ[o[~#tn1"u[@$y%YCȤ93K.IK~x9{v"z9=: m?z{$ӯjc0Z(>]$ȉN0=~6p]%tӣәE wL,AW'.볩WtOCGoq !`Δ}n2׹<`b\c7rB$Hk63SϦ3t/(ICk(!nMI"I|C"Id-^xF"]5W$ޒx՜mMbO=և$')0mN!^' $HAؓ諉q0Lޚ~@y>$%2q8V$$>=9vҺg^7?.Z$`uHxV8VGqՄ3RxB7$$@6ߦ~!1qGkV}#RVG7NN_8N]0әwND M2Ez*q}>V1rGgm,W:%ireMZunF$.K Rٸ7iuN'lGlԭ0zcNrT/a+q|CQ"@2QRH+Jg5?5D'OszG0, J L*dg9SN<ץ4! x$:hlHFRz@318Z.=n`,FjL %ijDom$"b3DX)-6F *+4 ۼ8J0Vt>o|(59iˢB_NVh"YMBrNj 4.-HlL/,r]aV=@ZzeOY(6+F ں|;ף ld! "x`F9j]6E[y+Z4T3]η !)n(V-;]w,D1:d|/vc'9kvhHﳂ-GG:11{Eׅ`50# onLal3+2)#ơkI g°dyi yobg 魓ѴUnm4*ϯE]IFW띔0e 0 σ<6L=7.trh𶇠4m2"@ZBol .{ ##c$K9iaf*dHWL# ic`57".)ѵ?Qi0BqJ+DU>ث戍,>M qcNSp*8 ş%9+\YӦx6 O)1~Y&6p3f|= vLpK[)QcCPHCld$D7qyG.kXln#"Ԡލ}X*3_S%-{g4k6[J-S<1dH-TG&`.?݅*{#%{xl*_c__p W˘N-L-I?v<  b\^b'1͐RojBZ5ذ^ěgy;L܆S{ˎ%A544SB,gOIXp WvNAs6gқf՞!><%e/l.` WM]wO[2<$&=lNV8)X_f Kppc}̾lQZW?N6~05l $FA 7ëm#]:7Į>QG/> stream xZ[oI~؃v_ Ax$؁;Dɯ\Nt a!SK+?_nuuVWg?iUf(>z}Ưq*}~9kuQ{5}NZ*e.stZQ{ 0ʧl>(㐓qEN+=Td\xwCPF@I&dnߝuyDI&!>dol O)wzǿuU<^Q֮&6eh" ek<ӨT6qc:_ԣ <|58H;PiK:l%-Q=y B9}LFjiHKTLcCqx!nQ5;:{TGiJQu7 4A'uMϗk W} *%'5}=>zz<}q Сc)ޡZ \a*?3ç.0R>C㓡Q~(l7w?Cئ 7F#>3>ēJ>{o̧&0j\\saY/2yHZPr JGFya/i]\亻[ا,s.(#7$WyT/4,SpJYchK~rSkC*zmo."`Av|ŠԡwqYlB">\6)x wkPҰ.z !2` sharN):5;*G IR#$% %TV6ZِDؽ*Ɉ[8k#ۥYgiëB[vk;PMm9gkJ>ѓ^iS7%t;֛gs V׉ x}wbW\:A1; { HVl&`y2ܝY%bSA;|vS[eAAĴ0ݝ*6L.-zP&^ϧ|3#RbW0#gU+qSVK?bZ_="qu/f aN +߼B87a\@V?r:x=( z^ sN|mt ж ޺~c!.~<#pQ6mGqdC1/_3q> =  =Rv>\BƇTFSH$̑c >C 20A &bM4Edƣ.e:۹du]:GPݗ ]VJ8bZP&4/;. `tـuTm@B`9pD!6ѯ_TB?2.f!5`>\bXN!`i tE`;~ =)|Yg6ffsU1 :”EXT3+#Ԩڌl8^?!Cdm=` yO /PMR"Pc&}=`'BP"+?mESmorA 4RBˈ) =֪;hqmve(kU8)7͇ib ӧ/1AV#]v>pgR @ɲ$?eAӶ{۾8eL|qC\Jv N59vl/>#fmqZ =u9*`_l~jH9" k=VH#!Ԃ.ڡF,S[)(_{}m&PS]:X3A zh@jqI&Q3Ҧ$%.`0=g`YY|eLPcA渨:] F/CDZmJEPFr˾kc 1RCYFcaohauz R^}<=Drg8 / &=BOF9?W~EKr&Sm(?64_s_ZFZIK<#.Dx6ɗ-RόԸ_ڰ%B-z@?pW7LV>5)fh%Dfxzg5Kg| )m_M C~,W BrUgam-ZV),?\;/pd. 'Xh!eO!mP)sA>XiWZ^\ƃUYYKf:D^ۛ7ƘRnx MSR>= bAePz]ly(ڴQk9*'WW0!O;5@=tuoXMkG&+ uo 'S,0Cm)o>ii:t>GS1wwEߥ&ZQFL܂ d`7jG"^Bb-I cZZjU|K W?l3LQEG/|=37]dendstream endobj 109 0 obj << /Filter /FlateDecode /Length 6059 >> stream x]Ysu~GG{a2w%%GKɦʢ9p0MHe|=+HNsgNwzO}'NߋNۓ$acK Nϟ䟊SMz{2W'?>NguQ)ov/vلmOH@;^v^쮨/l_whћݛ^vWRH?Njv2hӓ|q~DQ'NK 꿒dONUMmyu wdGvYv{2u.E 8ep8y/SClCDvw7BmP~w'uc[#~\ H1I=Gf# E?a!W^P~ܟMtbWdf'~o"!JyWJ2~sNoU#҆6&V׹́&oOkE削:VVȍVx- !L.ß-Q"yBPнor3A ­ BV+@qɱ4_<^F X2u8-1o/`m+v ll)ZP*2dG:gTfRhХ-=ZSNBAқneE<5W`26a _왱/# Ea]}riA!S TDeI890qnIK!UJrC̄1}Ѡ~m|}$NPLT.F"#}Gdd!wh4HbXbIj~8 MF;q˟kT*ㆆbiAޚԟdHؒ\_foiٸUxTA*muC%)!%GK]s5g^&H(6zif>#E؀!1ɿpT>#5F9->QZTg`{U\* Lm!uJ$#%hgǗ R⟾ўUmN*T:ԚG dEF-~wه6Ә\n~|!x6ʹm~_mum +.%/_7iV1[O\ŤFVAVX{ʯ>QpiYrbbFU[TC&^, ly-PEZC> b, M6i2z傿f9vAaЂBD, %,>AbTWrCrDFPzHkc25>Ue6G:oT- djT! =)WaD樉/yQeY 3P|kߌH^gii'˓UA#vZm՘N7(i2q]@c?'rsuvݫ (cmE lWw]NYF*s^yP ra`cy!]#9{ь|.Sȸy넘@ -(1ڥBW+=ܫa4OJMPR4 rĉ R;5+%+qPJ dDWf{K:-ȹSx9?JK@O Z\n*][h޷Uk Pz~9ʯo/Qc5x7ץR XyZ(;5^ٯA>KP?$f5<}y?U i)`]0=7i5`'J4b8b@cQ)~oف x= -{ [}z:4Og:m{dz`'G;s @b1*y(lPD I 2>T)&ޮ+w21~,r^]fWZoho$x?D,0)mJVGb0y*ZT)-($ Z~YT"Wɂi UO&̶h̏eաg3VZPHI{H2 bW6͈zt?E]Uq*#GdaJ6 S~T0c$ }BP"+YyзVkWJvJDŽ(3e[ ^LT1ŸƶʙQ H%ڰwTzLC9Q֓en)ݚ %VPA0>'b}Wc6x.􂰘-ۂ69zNdg@PszZ(dj uH/?άJ=JȩE2bvœn*8 oE3|&̍VW T8!Kჰ -ߝ|˕իQHXwXF£Vd s?(kY#'Dq/[ꧢ9k/M_{e]-ZrzN c6LQ d5w99]s&lYٴ-Cik9Mb:JYڅJ/ƣXOboV zC\SS[PbcKect>ê^4sc`XMX#Q"HȠ-(+h?DjBO/Edқ92[S4,y3~iYa:vj'qW]@V{kҴ{ j ePv/!KUM .vł\J g 0_gk;E,"`x<{snmG,zߪU*u͸Ki7Gl<?> >:ee_맕by1ޯoBꭹ$Mˎrq׍'A&DBihA!&XbrS;n8iM?mGeP{SXU*f][՟!`=B! w|hi5uw6NԠg9=?^+~<ɚ;~;5㦽QjhA!ʸHF=F);%2 1eBP'܎0plNI~(u%;YcZ0=) 6U+vs/fA9/aYoc>6*Y%EF>/\ *fjt ΩDD/s*27: {?0O1[t$B:=@oK8]K K]sx]lqd8s,үs9Ѓaѣ[HhtЂBVV$ټ`c^kg\Zeg+ߴ̄_2k)fyGr8OZ8U7ު@h!楴gZ&^p:M6Ńܫx Z Hd[ч͊x/ۋ_AJ <︇q|#S& wߘCY<c==kdN` 5kFI]T-F}7nAP#HVy|ƏfKLĖ~DoOzӲx> stream xZ[s\ ~W#6{ӤLx$k]VN+[+[~}T򚒜5Q\B%NBC!v6כlqFE#XD强.E ?u?$'CA0hި/ $2f {k.B:GB0OL1866ڝ883%meBG'򚒜J&^- %ZQ:e *3f(``)+AHKXAEP퀦$&1-VEOhqi.D6gii"h?9 9h8Tm$Fɏ&DꜤME5 ƍ+*N>ʇ^;=[(8'Yo0`ɿV-Q)?,+UlQ+00$J2oh4F+yW׸aj:ڐd8g̈z^ɫJnYjʳJKyč`o*iXw,ㇸa;(! Ck1 iӕ4ł!ifM%l: q/08ec8XK/pCfXp\|40X;{OM]qV(k1$7i,4n:qe.+ oԧDJrȴU'ߓ80ZWCӼr(I~҅y|,9<]昜XZ(t[K~{\;3o}~q%6u+K*<<@EX$EiKaK}jsϗx c HTIW芒 XO ,t9k- *m#{:˻eyׇCs_n?]GD:iM._ҵ\srcD/5B%F8J/9z ˄P,>}Fe`eG[+)%6sE +S*6F+xFo%B6n ݕŋtIHL=0 6tyUé4HRiG#~)) ԁ;FbQh!pd#n|(U^j `#MfC8E[V)HS: v@װIP%&0%\h"J4`.Ok J[jK| \Ӷ,ٔ\WD$}_gJ>Ň;=z5g$e)fIA/**) vT>,L?1?-QŎru< L#|{^d%δ8Ͱ~J@㫷7<3 nX=5]y6xǑ:ysK:~95լQJla԰"iIẙ1v[yEli \SRfPuI,ǂeex y"lUBiAa? {QGw$a~3[Fz~ @("K\ wskSF:WV[)X(3v }1Ҫ)_'f}&u.U ?*R& M?xOpNM =qRBR?xV%?l^"ivykZvdԛ#2uN)Tjc|eyXPҿbLQ2\xM7dSkQq+kH|)mɲ].M˫l]{)3bcŨ;\&_K,](Aqꯁ9hْwg\ \|c+1Z5 31|Q~˗VoKUf{="MҘӍ#ռ VsmF]׬q?/,K [L '!{¼8 Oڭ* (N4 7<64ԥϛX{cFke>t{_@?ș)i~uhJa䲒<31'>! jOh3_+Ekl='Yx6NF!|ki1Iʮ>s^zzO R\endstream endobj 111 0 obj << /Filter /FlateDecode /Length 2947 >> stream xr[Gh$ ONlfg'ݙfCon,% <$E#4OD''WG_h3#~;)?N&YÕ.('(c;/[Em'Ot ںz6W%Pk`Og!Z`j pP QMp % ] ʨ i)'t1 /ki$Ryשh@T'ov9D{9lnlnAH!tޯ:@kq`>jmuOHpohCX XH)|@@E ݸ"{N+'>Hf $EP ;X{w :U \|g!+~]}-ZZ[ldnB"[c[֘q l[&Nx&$6AvˈrD,jL*x98֒ .Z ^Nk9v (vU[X~!1aDam=Pjlnd*?9H: 3oSb$QT`c@7#U`yUr E[wP:ӰB RcEm2U-؂vbJՇ*C`OI 鯰uNW MI $@b!Lhzr$(w@TMl`[,Fp߉Ul$(ptTx*zGXjgM_&rԫ]IHBj&,hUmQt>|,WK MpD99. z/Nz00R%cO겮޴w<&t&ĺȳ6m 8Y _(Dڹi:^!(p9٨D BH*OaM1(,5EqCEioxm4ADrQ4qk- ScdQ;:*(T>Y& 4}Jv%wJܪ twwGWKKͮ%t1/w,΀jڟ?m 'g:*lI]:eAHXf8{eE]-z˛ZJM$) Mwd'Q\"S$'ze!%Fٗl[(sŝ\nA+[u7 IcwއSy1{RNz)2VGm[j ;Lʫ6]r^ %[қK>M-^rh?HT]_g"B17TÒD4:(\5{<+Bα D?=?Wi]*!(TzP. MQK:d;Ƞ2$plhe:)EV2sCYvg鑦tCzP|`˙2<9Mݞ[0hd]a 1q[BҪAc0谿ìuIUVVT S4P#. WilNufdPG p(A;I.M7j([ɇ*O *'(40_~ɿD0<Ae'8Ďދd1EdjE<:>BѠn3㢾cGX42nՄV*e#Xh>S> bXeX ۹:OӃ߫~fx#5uQ%hU͇y(`S+r}g*dw݈i15긟uT9Im'ߚ^vӽu$[V>Aؕ[FzZsAF|y}>7JΜ<`l_{6+5@zȼ]wSIx+;\5plQ׏L;~T2tO9{v7R~PcɝlG7ÿl5endstream endobj 112 0 obj << /Filter /FlateDecode /Length 3458 >> stream x[o.k}[F"mE6 przNɱ{gpY]CY}}?b_k'{Ik}0F(?8KS~>jpI8mJ^wwE wR-`T 0󅔲Wt,u_rAHBZxRik)ZGtN<@z!b,$V^M[JS>+{c\_J[U:l38 v봗i'[{#BAFX7v^S^-5T~ 2F ܫ W1ຫm]wBziAq yp։VҸliFIQKXO$bJ,$ %dҚFr~=>.w_#:+sYȣBn|ox}oh!D>+h;:FF^4zY߇*M?%x'C亐OF%3fBB/]!7M/]of3_l0eWB>iӓ溟?Dže!/ .M! iN &5^ѫ~B~Jdg^"o yD֣M+|%By4z]ȳB4G/ Ia\6G#`*`RG1b2&xin#qJo9JASцd V) 8| Z qH{;ƔG7|;7r\G[ @Lz@wB9De-J>Khȋ8d% /@u0V\:‚uP$nlj 1m)緇 `XG @`ĞpX(G08i/26 }J!ZIeGkT*xt H`̤{:=yln/KG[zEcƀ 2+lc~!9e vdYSdR|ѩ1i64Sݤ̦; 8Em3Uo1tcG umoC>/7lr,@s]4щΊU>0kFkrr\H٠@9Mb}RUWȀIO=i87vzj+ܿu]u]~p7HF[@LJUy̸)J$/doaTpo^5$te.riA^N@x[ȾoXK;\go"1 (AYT4UkKW@T}Y%`Ehł@.qbH R$ƃ;l-+<'fe@cHL.PptK;86/,-Yw(K:?rdah8O 35?$Ƀ.&)J%:DSȻRTi\nO)9Ō&:yGu0nDFAu=F%p8.D cXG'6(Q 'D2Nֿ"S. XmpS06m@uH*[Mi?SzURD I)ǃxb53W$&%.4 =9 * @7pQa[԰5A fkC&G5:{eZ̔W $H8gl܁=-2:"2*U1h`zZLcnq[be8rxWcmiZN|xG%%mIL߯(0\И~H1ZŷU (ʸR^O7ng4VSb*\].FK91\-=/16SزR`(lH 7FR/x$LW6랜$-Yn}6q6# mjMY4WB#:a^Xw! ~Y̍yU☼:m۝d abj< ~YmUdtX~ۃi_n iWSᨼY P.p HJ9R| NșFFE jR>#,E5 \%~)SPݛaY FI*0L1TGxxa00ilrUoџHā*J~ WoYL'-K=1@k5<}(_ Rs[ոgӆBb9z Ћ,d}-b]k=UJ^ޱO,K̽1n ɖ6Zd줐{v- S-owrI+(㶨Nog. 7yϚGk{(=`uW̡m}l׬|$ y6B'S“=m$('DG:˦gZZ^<];hj~^Y>,cލr/ה,{yyQȣBwlxQWK* 1ϛ(ԜZ9,4\\rG%)9 2XeOQ"9c0TsgX0-t9> stream xX PTgmýWDp6cMbqAqAQZPEnVQ١t,feke[cԸĥ^2MD&If^\g潿I23Uz*sd2wYOSd҄a@սh1At >yθa#T,ou|jBtdmZ+n|sۜYt Oݦrݦ ۦlw[צM{+J_0sfrr8:!W<ܒQnk5 IanK*۪mqny~{ n0^MᓰDT,y[JPߴ~kF[}C\OĬf^fdf ¬e2wf=3g60әf1ff0O&a0l}f,g^c1+_f>833i5;&y((;5cX\k^3= Vvs\exS F#Fߐ)"A> ݸ@F{/P䎀@ )M`k݉AT)5˚yq\E>&/a2L~Ǣ&Wڌ٭p';ZwzU/v_ P̰m$=7 N ](_Trx oEB2,7Di\-A}&y]Ba2{/5KlP \IIƑ$Wx܂_jr i M!.W΃9rk>,>ee܁{&2ոo4&d'Q*i=D܅%Ѵ9<:$vAv"=b @`dC2?_1Dz?ݹ86o?|$pZO_,BIC ߐI/[آOh’u'Ç[L5n٦y?Q?bɂԈvCT(r9z: >"N% T ζ>h??BUq}!(/dY0z}'I5K/Zo-9>޶Q";9#gV. {n͇vTQ>ՙ}y~AA*˧ib~}a *K#TTEv󱛷/noUi, )U)M+!ݘ_|=ʰErSTᆅ(P*&l=ʽl*ہbU=g+g-[Z)r_JA^ ZTpwݦ K(^D]dZ MpuJV?_Mة|UrNҵ/_$Ss;TApH]vW*awԪ+gD#+~n3ƳphXʢ^{  ᜤY9 k ϬI52]EU7 b \pY5LٕCU12Kyi0 ݥw>qߢd0׵V,3Όkf'˅AAeIVө8tnY`Xz|boӱpDS^lڜA+=F~\:k4Ӂ_& )AteC٠dpVYW A䒏4\(2\B+B+baq` a>/Ij]+tq6m p901;Q|O:02; 2Ag7[{VM}Z<toXi hqt-Ǐ$!+;c'h!|q7iOeѮ|.LsWxA$lMHI 庂D.3R=BRYuyT\iU.zMAbAd,F3:\$s `Z^j3p_h \kӤ\ _d.uy̙!=0 ; ~)QH/IS (iS>< gXkΠrM"~A?Yˈ3ZύV:a Uʏ j)OF/$ӈǏPQԦpoa uEa6Hc'h?`N?N_Awe+.xIKQ%4"i̘Isii /lN4]ޮ~}Z-pF6-m\iX-RBѠljf\1rJe,P^X"13gW෶4i1uuGzϜBXq!%]xjLuxN@#P6[򊂐AR#akT̥/ [-3jd`Dp7Z޺r2ǜzӅ[_o,WT/ OJml:X_Y.6m*RӶy{ZЂ:e7u] $b/i|n UK$X'-(,&e'.*kcqY[~όWj_ل3G_ w-5'W>jX9N3Aujnw^K؋&4 +!$gR`Xij~N"?89AMM0|ՂܓB~lz0:BlK%Cp#?Yc7xd۶QQ[Gtێd%Bt,l8eW:\_}%w9=\>4 Z1>>uKأ};?SEg9Ab]^G^ݩĪMoN^=xrD}5'E`.g?å mmnRDfEW|mt!Ëb~rVƛ [CtLnpX=ȋJdg(ON/J_JG?fp5;*/*+JK>FmAm\82\^A1^Z3 gnL}HCkv6\3[JT+ifUNe!zZ7IP B]Cs^>hݭ3IWo(=$8oP%'.`6M%0\ɑ ?Le/8^J;7 QP@xl64*H<}cCiڠ!=ƅxIwi|Mx?Ow80kTb|N[CQ6Ƌ)mBTWJ!dP?o0wȺgfv7E^ǻ1a5 #{[6oX_qsxYxߡ!qberԔս~QDYpCA].A4>JyT .,9}%Do)\ۇArl),Ȍ8,qtDqщa ;iendstream endobj 114 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 1784 >> stream xU Pg%$`WnVi$XAi=AaKB@$@0O!/-*?)A C+jws+g[npsv~;>ϳ,My{Q4M3 )Y1˦o 狀ITR`vU /(MKE&}άY]\\]5sԅY-P2ݘך˕+tfs KE -V:kbTL2 YtQcAQYkRsBZ]h,Zd.Ukd+jJQaBu*eZy*z PsʛM}C'ҧxujDw{yq\(IcZ+pc_B=q\`rR? ꌵڷr}uIЂ>Xqn J.h: ' WpȒ~1yK":i!'p,JHN/C %? Rcß'02~?㤻PGP*;aһ$>%&` ޾rb%i |R}xcƖ<Ȅ o $z79y.? \fHKN>?TH^V 瞠ۤP%xNdc0#,F q$>܆M@8 >;3uu~̓)!3}qYM 'BT% 0ggd%O:9wcy$[au {v6vKGq.r4(,&ꉟ"|:y$!J"~ТSOZ磘G>{o=cǺ;{wB6lo.ed8§0l:ĸ}#mؤRRz7<}fendstream endobj 115 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 1060 >> stream x=Q}LSw}Ҿ'US{9&86dQ&6Е B)*"} / VLʰ ``B\2g#9MƲl lUs=ɽCSaML”ץZz5L(g`2P{2 -<Ѵla-/3ڄx]3Qر}{dff48.YtChUJNIZSuZ;!QیaCZk {-f5ڒ^Lf -zLQZmӖ(5*ʧ *ʢؐ3*"}/h؏$*V_&O "՜lmbLn0_n+7T;."WѫCĎ` `ȒTA:J2v٨H=EUz Y^̻AϓŌOl1 wb&^3Tɵ9N-xw pl*9*ŌDkPV/b4_;+\[3wrbtkpq\UK$y*='xq̹xU?u.4^2lz0qkiSVOD>Ux$ 8]v9O=2*0" [6iH?#<7;Ņ̾jK.p0übm.QIsQSmQ#j7Fb**յRĢ8M+endstream endobj 116 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 7855 >> stream xzXTG* {'Xc⦆"4 S{,DŮx^cXhb4ͽ߿gLK=aZ}z}P]P@4ډ? ]X-z g}G8shcJ(G$ 4sDgc&M47;|{ H? H!i]N3"#C??>**j{PĸpߏGq;;|HAN͍|*wZLQԊluA' #E..ٵ4}Y^+W]v:7m4yӦp#F9flܸ&*ʙB>Rk0j5ZO6P#(j5LͣP[Xj+Gm>S "j"D-&SK)2j*FS+G{TeO9PTj5bnTw'Dl7ՇK zP+IF__υ[_uhzQ.-MLiy*=#z亮i۱π>}5E6 lV06Rry_A] ;d<^sBk/ ZN|Kyr8_^ AAhx.n!+74$ GenX&0 * a{,zm7}q4^jU8x6ԑ)DBJ*"<hJ 鎐o(9aLrxC hwѧ,,-&<Gm$efm4ihPZv]J!G#4 h:(!QfMItDGwe21mIG^{e/Q8߅EjN¡>6.: %OeW/×̣{\{J-W^Ids@r|/obad"UVUqlr*2#? ȟEŽpQXbѨH0ºkypHUP50ZMQ2yB.θ/A2ˍG8K ]n)T)dˊÐo;5讓e?V m6dw5Pn??c''hH\J Gs OœIw+hBc csUT|^{Wh<ԌYrWn_'aiZUNOt׼+`P@,zJ/fk"E5'՜d\Oo}S$4glyW ?6#bŵɰ(B6{dvv*58f@9ǻJ&\%c ` m[zGٹm6XIwb]Dh&D<[Չo+gpUzb9Sa`a*߭Qk #+;r:wusŋ}R{Euǥ`f(bbHA!C C,DC@L4"!> y+#v˯l$=i&a'@F4ڨ3 lg_QIQ89!)r "/`ĈJESe(Ud>+Bcab,a$iw[~@g[~{C{-E]h,1-G~k4-j8-p‰]\U^#WYZPk9:*˜݆Rc~mm`'5|ǻ";0[L5F4@NL6TۄM𴃄( C΀'榢̎{(0+ ؖd~Z]1Sc^yAq/3h;~˺EpΗk[w{}n\'d1j.]Uj2'%H#VYz̖7ԛÒ ;ְԆY 8aU `Г5՛UQ5B*7!C=9A|;yPF㐯@vx]9̌QO1]fc謹Q &`z2Q]m7p:~Ŧ{qob]əup_q$C.4||l)B%AتR}U~ZvdO<$ŇNnV~\4gg&pe>|~#\ZT4NsV㧛#LB@姳h1}]SZ٩3#!⒒RRꀮ9F qKpyfrN$:y`fQ;d/v6l2 yDUVZ̰SH7j(We'&_1a֏fYEE9z%8.PkFݲ%f֬V2*IS5Ь.PSw_ wȖ%'53Z {;F0B0=Ā|;en"zZ4FZ.ˆE5or@XHgn.q1Dȃ28s:@CXwn-xjU]`VF4R2slH/c( >'}Ug{}PWg*'Gz%/*̲͗Pv@O&tBS Q hű%Uið AJ',j2ZwOI~hT!-!_ ]p]jJ6@1S]%M{Rٳ-LgF,hKP0k>sI[y(AFUWK~1ǸxL> rkZ377 U\𸥉>_Gtʩ+DlAI6YﴎS{:8֩/B ߠ]22^@m4Ej}a*߳d&% P $`Fv6' اŞSY#BDHk{%@iY>쫈Mwb]91-ѻ>%4<{@:jGbȾ GkT,*YlжR73"5)qبPsܴiͻM;b>c~VBmD>^]PjʹA%J4:]ΏiᐓQgSYeZ^j~ .ٴsAh+uEl&׹x'bQȠ^1oF`{ rSi*y:` xl @TZ6J@ԣka7z"7<ӥx`" h!ZFh߲qoQ!Gþ Ysp)~x-:gihʃlu糈ú"H-1 DG)W6mdAgCD"mA%{Z^ QʢY"Qw_0[ݑ%*aQ>0h "O6\` ܃ vխQ7ѼſP8NW{4EFIv~EA`PupIJbd'B:T4)ˀy~Ƹ IþR2E ؂ܲZ(W;^箓3n] ]1Lj(,6E pOfuk`%n HeB*;lቓG7I΋0uÂ-#~*__5hw1hxW&{Pf1Aˠt 4p*Ξ I_ @7ЂhJ;dSՔ8ep_'ifQߠ~F3h4qKM95o1E 9ȅ#$/m{,zsOqS0D4-k1;B ,{Z%3!/Aɩ$u ba+Cuˈk[o?b/~>W9rҁ i՜V>Zߙ%~6<$Pj3Uk(m&T۝ $w`q?ӊ"SpکGyЌnJ'2{RV,2zc5 Pvvkh8tu'M;/>&?. xt=I9"M#,Y|fs1}yc˭rw$O] a\Q0U1MgBS"u !ڇdݹm4Qcmksfۑ(r VաPJ`*W "? 5~54Y0I}N0VXG]FExêQXwD#MAAoDyM_>}kP:qUD5D֨kOb1Z֦e~BnrhV&@+։WΕAD'{0:Ϥd{l3fh nDk9^4L'ϑ!2]G̃WM`wB6$+BIR:~Z#o]W1\mmۄm[ظ Mk;nUxY. -ֺ,- IhsŬ7CVtJ@QHrq5w]YKk5FDXzPRe Z WjpSu*ʒEti=r5|%sT^߄|K%OVzr3Ї_:Zkvp y*ķط]8h?iqЕ7UT@*>?x>th+$x=u O<"ӂR]v,!3/*N όvͨ봟Gfc Bo{{];̽gFj!Ƥ7wݜؕ`NK'&քJTSTHQ!dYPk\4\6伟>dLC>8" u%Hl>#Ký巇[bBM^Zn Q rf\n ';X{4F!3.Yi>ww JRl,.?dm&3~΢ί0-ϗCh.tמd*3R*PIF-O؞RSL3I'H)2ӹSw۳c}^J:Ǫ/kOƞ0UWb5nzu*Gb%P렷vuoh,q/&4,$A_IfVxE@+$dJ&5Cw+ԝCf?Ӄ0O׳Oe+i"(4l4p=aG`nCޜ\?}IĿb=bm%7hv28- .?%8c߲9ӵr+DT2&\=H\*ʼ "YL,O> q(NpZw:TzEßYtGFU#ߋM緳*A s7.ok*?ΰsVC^O̰ll_A/;]Sb(%{-> bH_LZ5f#0#QWNEhj8>q/4q8qD1,ّ33v̙'[Vm+?0h/P{6~yt%J`ֲ)_#FN ghA4y,.}ǘVI[]<'Dp*K6Evh GPoԷ ?ɓ&.f% {6pKsLeI~{4#nF:nPf=$` \ #ɀ pl`ݪ<] $>ϝ@]rt :6XkeGCע:Q!EEAtD PՠU9\&C !@٬]!-B?b| `-^/msa3 asd$%yi he9y鹹: m(wC7X:k/\`^Ǹi#>ioDUjf&s6|/<\+٧P9F+1e#rlXNt"ٲcM (C$s[ HnŲL 硵i/"'q"`> yףz2ki0Ӏ|<$כ_&R|FӖ#oߺծފ4.q]F(0c0 S O_kXu4h852{&|O2qɐ`?߷'dRnU6r`Z1\d~ 0cq7B8 ieO6сi!{8/UrD4?4%(8/ \=rzً0nendstream endobj 117 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 3104 >> stream xW{TwQYB4;C[bV]V[]Vb- B$3A$w@%[S}v۞mݭa?vIrr{}xiǛa˖N~]1Oc~V8Įɇw5~ C)s1>'+2l YيqVzzQKWŭ3ҸBE(O~eEg ꧞*))Y"+\"+Eq%bEvKBQA(3yTM'nYH!**H1  EK/ed;vaX"K~-v`;]n lklۈ%`c/`- l% { "y禭wLn|F8B:s.'fl{x'ra$P1G1!fq1>*GG՜k]{mW?nK-޺ʠbmY'p-tx`PDIӁfojGahgh流KդaXܑYPPfj 9a[@UKMJj;b1U`h :WEF1;O{ 3N&~y;%G_1(zdly Ω欁T{uZRGWys &'MK)h{tnAF]Pï];%PΑHi Tymmn*j ^7|]B/67B)t1%Hc{)n[ ">n+Q`w9^{jau7?VVܧ:2%'2jIĸK)7z)̸ NV_MCɶ&ks,XZcvwM)@?@XsFEm.*Z7յzy%[P [YPvA(u4LЭ))hxJۈ._ p,Xx|;p@4f TjOiK}_Y)EJR;pmiC~ E_a8_nl̿x`%%5iT+dFFOO֧{ȘȜY?h^YTJJ2꒪͈GaE>a7"|uDtZCX,,dbʈ`~M&%)]gzIh.ӓe/g{ p94tAWtSch2;J R5;XUZP*i\ϷwEM)[L벸>8f~0M&}E%[峂:n%cH2gg .}fwWsG+|O8R؇! v[ ;e:ݎt_p^F#TQP]lʷK8eH-O/Jx;NC:C>LPjsy P4sc1W.GQ=U438P*9("vʡGxc0~}l^uN_8FQcC9Yh,Fet_3f Z|(8ok:erb(0+ Dv伌j(zhUK@eJ5{zzvF 6%ts&d@=n췽w^~{/A6AP_c$p{NG=uG5 *$$ȣk4O{N:*˪qiœ畱C!f~6ұؘBĮZ?U=+gV*AQ+dw$}L!N'[=1#RCFyb9KpSM Wq6z Nm|f")ς+}CM.6Wާ7t\x]#7[NRG/:2>k:p7W>svb1u@]oi3ZJZ/Ԟ*f5[ G7Qߟg[D wCt̫J̴b&N7O@ߏ_BD*E/ٶ.4| ]<5­Sl@'z6{Zm ؏_%>Fϟ8'(6Ac=y'k_nѯ9Z>lV7dɬb͜&jI[ӽ덊3hGvC~'U:r=U6q~z㋶MiU3&٭udԄk'6C'̇7ۭos:*r̹ {aVM:cqpb藳̃xdbw> stream xY XWc0*m*iu:mڱvq*#a  |I !¾/!,VcNkw;m.'޹'`;>s;\xxHr{{pAX[wp{7+Kg8f󙐥n?L lpwXo1J&%14Uy۴i^O>&|i4&')26:Mj3/--ٵkB5I-=%MyNdDGyHy O15?ؚ-ڝ-8?)y 5mgw0<3B)>;SO߰Mϻyb\K#!|/G&%"JۈCvb2&"^!^%v=3}xXBxăH, YsnD3WV53ϰzf?Y$nv9̽wW:?Q X԰X|=ܫD<49U'DЫW Υh1Ā oU=xʧcsdKAlHV0"aR 3tv04Q]_'#<~Ю 17_tFCێz?SbqH u8.LzbSGqVh1ʊ H։ sfg9"\lgڕY8cϠYo t:+ _$JRi*?@fYT᪴4rt!t.2G_eLL/4ʟ^yN33&e*JA 0\Kf##8m\B]~? b l'8=ٖjȎ*̡v06HLJf p+:j>?O4`%:|1e0X"q % I(듶}To `+n+"UTZOʼn^2'XwP6uޭRƬj@6pТSg8*_븹?f=Gy?lx25cWdyS|CWF7|е_r3RgcMۮ8:}k;k)[ؙ> uv;ZC䯝 4 ~lu_o.(hrB2K|!?A)$B+':}v9iMuXMwDq{2W222sE\=h9,Jv \dZed'ZPLn*oç944gh!mBfaS=nIwp/*2!. wu9F;EGRi5p tWEO7~t 0DfdcxAAHx $U0АYDN[UU<$ZZ:P Rqo Nw3?"c!H=}>kqU"T,(U J̕jZ><R@̻v2zKyL ِ#"Y% [qcYh74 566tl,'tMט{bJoJ B~VG$ .o4 Z_ެ ȭvZt;IsExI }}0a60lrG+iOR'kzzL2Y &4M#tsxt78-y w,t }-m954`] Z))[۠*%Ւ,;Ƃh\ Rq* tu:Cںmj%j,FI@ĺtS2O\(-j-i}Qߡ3]p9~/Pcc_];`G0@^`&AA3>]¬a7wEmuUNًqSbK\ːv+F؃m9ƶ L,BV'hةictԣlLjK~:>$ՙGp;f > Sfp}r̯07;S%amp9U1Р]ԠU__e<=kw.tpLnQvUssro,e5>r6coK]s ɐXqM/yWмR7Ww~Sh`ڳ̡?Cs{d#fwJd֟0S<_7LY0<>3͎]hQKLu.UD%G)_*(Nn`D5 mqwṬ|_(,ae[ws3 ,R| c [+X>mh*&@oFFyscjԂ?s1tde."4h2S= .H'zuԟ1 Pym/Cz3JFSah)C%fufRDZG-h 5Meͥ[粰TB[(W+ ;~V'Zew)d?y] vZkҚWm5m]Z[WlՁt9XR-jh zU*2\,M1Ɋ3qc[uumzm87g6"!X{eY6ٿ8<6JdoooXL,p W\sMe\K[5͆l: T|] *;5YLoQ[ uТk}U BuUSKVx07EG|weʩWZ1W'C+@%ƇY{O/s%!!-U,/7=9zA ^5h<_r秵o1ٜaI Sj}Չ&qBB(^<07T[sO2KS " fNkPR[xXRE/y@>^!l4n9o ;TZϭVՅt.9s3P c*ͥPN%BPʨ`qP/vB2}FsL%{9VU>ilJ%2 :Wr^1<="Hߗn;h76b^al aj*d_14oQIn 4ֶ5P[`FeaK;مcgb1*~w4 = %ff«}ӆJ1 >$Y˧%QA/O9- vs r*wjuܝ:y"GX<*oA`zQBo8Cgkcr,jϑQiIAi, @ӛ0,  +o:?/pjX7|a;N6|CRzEkwTH:p0/Y:SHGT}a4#Z<{z^=ҝ{(ip Ux<Δ7ó(rK k664v' ;o0Íe$ a0Pb5nSe;4uҺ~X+[ϧ뗩t옛/23x 7ڰ9ўnh?Ű\ygm =hOO9Tr(=#ibƃ@+/~|DHrGs-'Fˣ:1T_S96 R]F YxZf fKmm==&Pt`De`c v\YwХ +1yo~D`k5ޢ>El;7Inht۩ kGߥm1 G:xۼ,1!VN5'8G30'pŚ"БLRQP@mYBNEZ2_SxmωBOie.8 T?]^'Ԑ#O( _D>ſ~;u VZ^!.hKkWWn0=J~*RAQdCw"\jn(zeY2Z]rC,l#Tm\y J}=UR_K^LbHhҩCQG7G514]CÞҰ#<4GSQYqqv 38ۈiKbsEk&817Ql{}>A7ZBendstream endobj 119 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 5638 >> stream xYXT׶>bcr0cG` ((JbQ0C:( HIS]+AX⍉(&1Qu~y{`&7{}lv׿D"diFW-Q#kˆW稍p( "LD%U8yޚ0cڴy~۽\A^ 2tX'筈r?Wq:5""bWPg"kü;˂bDTx\e;E9-I$d2 sWUQ]w^=ߵ~Ϙ9k> 4i)SMש55KQnxj=@S)'Cj 5H-PeTj95ZAMޥ 5ZIͦVQs(Wj55RP,5IRvFQ5rRj5F l%$%E&=xˢFl/?\kyj7#ZK9̙2 sˬ+>D36no Ϸ9%~e+ a##~[G[Q; {+IuQ(QB~Ձh/pM:D(%yZ[RDբ2]^#_̡F[DjT?jQ޴=9|j"/l}뭰-ݳ)tt6) W&TscdZT̟̤ɺr{2ZzɧϜ+pIϼ}yO?86~.dzT:AC s@aUI~'X9 BUR>C.,5avL7˨zw?c]HԮkY>?،-*Gm*:鞨E~Ow7qP%z>6'{!Dc>=^ϓ2}x<g[m7} @@څZ*(yֿvcit`_betΥ#P8 M 'm:B(*Kc7!(@hy[b"HIT÷BUjmY/Z_6&Рhv1x`FM'΄j9R!fZw$ὗ#C/fH \nq9)E)Eh/*/r1ݡKY%irpDTIL?pG_ZMF*c(Q$IyL #ԻQ_%te.Ҡ撩f{JI_~CЏis )D!gҶzm[GaIX};7vtt_]=K%<.Xf׏7߸ֶGN0_+bf fS5*iIrAAê{}KյȮ( /HgfZML[_DPMXmjzOx4q1@Cl[1P+*ywd `} -BN|d\ao_p+/x鷙zGVK, î5<G! *QoL$Ɵ? }RxrƢNt5'm&;Fhiu3P?`8UŐkCRkH+}c*Ѭ*6y{Y܆qbw5+7զr3D҉v8BsG%56kH4"۴iT曅x gɱ 2K2𧥧ՀdH ( 98D$ⵂ|rh:y*OZUa?u='A`fdxN:-}*[)+e2R&TUVq}gs:^nX u_FY6fyuT].SZcl+s Ak3t]9v8$rFԱܫȻڝi;uL岔>kkiAܶE͟I/È?V?Vf(T` ?KaDdE#P@oQ|fl&QL)?#0#I N}f%}(c q2s`׭r:iQ$vga(H,3A9x<7nbRnFFͬoxS}SlzhZ>ww``Y3\ fL>yr! XbYq&0ogϵ ÷ᭀHæ7D(wעx! M{#VHm]GZTGpX%S;_gmq;d\Y?bP*Li hH R'*bAF,쳍$NqWˈK6s( %ܝoNs% +Rλ &pDס>խFEȮX=}ɠ=㨌QEtc,6-Qi ٝ564. Qtb fΝ>׭}Aak(GYS5$F~'}nnЫNy f∅` R9k;ޟ0` rxfIznp:MԵkC`"ϔmJBnJ?%)(h*ٓk:R~pN.o/]lej~j4<6(iܯ% [sߟ.(#-0$ry8 c;4!'|(&ºm\unz.:N[V祗rνx%= -:qE7IxA؂Q!沲z.Z`28.k33Q1c@_ҩQ&)#y^-c-kz7=T )C tN'϶Mk]=/hC9w l|ǵ'?<(|{'< w\./rq;׹]tW^npZERqW:IY~q('dyŞYug?0^f^ݻ !mހZ6{gD>99҄#ʗ[fK8?6A*'aع$@B,:[vf7|)"JZqKW4k8Y`3 ]m lm:X˖Xp'l~ܼtAFv"_x[BxA'-Dx/4"XL⼞E%)QExW[%zrx0/di`<sNw֑ε6Gc1|_u6]'Lⷞl< ,j-L}iK=:˴㵍cFyۓԵB̳CDy@ۙ(pÞBN"9\f !F[XTg8n'ii(I΍$^&TN0Yb0kg~k$07futҋ= 2<\kC9v5"4gcw%J#2[]> stream xECMSS10$u`  *`[WouCopyright (c) 1997, 2009 American Mathematical Society (), with Reserved Font Name CMSS10.CMSS10Computer ModernRS34O7ҋ#J2PG$PDDKP ue.TTB4)(`aa^}vrzj`ITI0b17|:T}ʋlu\j/Q{mo߻jluPWb  7 Ȏ ٖ Kendstream endobj 121 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 7610 >> stream xYxW!4 PB P$tBm[%Kz,˖%Hj HB@i,ȦgɝK$.}kYx)xDn`6L#{ ƽFb? @o>ݽvȋpQ᱾pw?㥊 )ظѣ&͜9}lgKIJ[H [/2k„QIisG ˎψ [7l09#lUTRLC?aRJfFLZJޘd 6K2_uAEiӗd,|5kYvrў蕒bV[6n] 7&nJ,,iӇ:3|ְ#9j1cw{ĜI1XM$‰5,bN#"b1H"6b 1Kl%mBb5lNt؟çGk8Oy+y$ ZWJIJ@:M@ԆT }Qҁ=N%,R'- Eq=hѢ:ʰ@l"E %K=ar-#]5@%[.kBPzcGͻ`4Z`00]l;)uէX(@W~[8{ ?2,X FjjoBˆ9i @h!*/xp!$HM47_FѰ\F6̇S9H?Cz ╊>+o[˜m-Wԇ.dɛ[w,`kA%/w-3+6,W73A Ͻ:GQ?"곥¾$G;饻~ܰpI]֌VK:EP'cVFBέ|!ՏVR:]*#Gh y4+%l .I劼0f>n 3ϑ-Q+ J!7GUh3bn 3kkW"bS$PӶƮndwIaODi^8!]85Oўv@ao_6qTQ*[{`8 a8LcBQ&ԁ:`tluԾ᳀pdDLWuo4ϢH8& )h*%}],&03U-Hd +gQ>,gP`S>K$moܿ{Q+dl5*L/xIZ+j*ͭ)V_cM[?Q',`@@-, 4Tzh,23t^=(. %vXjI:iQ,NfMu,!ٗ!AS w9@>f 5:U) u >z|<i<:끵ra6_'V3y &??z1]1!XU;GT{a-1M@>=jΖsa|")x EZrEh:gH|&]|1($vyy9q|e%U=BV:hCKCʽ@0 k^&<#C%-2rSw#ŘD\},:a.l poo`3Av `p R^$6s.A 1G*Xm7hz,:Ca?A/yW0)HM!_to.Ger&&3)wyz˾dg4악\@-B`4ZL AELZI&]뛂\_PXr5#$Ό;'g!Z:V#ݱwe֢ZRoۯğx' ?@Q?c GSu+1 TWHХS6̷ ]8%9zO7A  {֒Н¸ PB+A%p5Q4¶. x\`b T @l.U#red _\^<\>{Mv*)mq hmE|P Jxw88>k53k ` XA?t).>i[e ddd; T(ӽ?yyc$stЌ(sR2waiciEyTkEZdh4{o׾Ɣ.d d>Uڜ=q[}ا 7& wSPqX! !s0Cawdd="y> }Nha !*[jA;1bςƪ'yDcT !HP fþQ_A\CL绗ƒp P)aJsj5bך@5 22-xD+0il?{HNQ:u_ˆ3\W~ߵjC^(?iU!xb8PYO'[QNee$^sO~yA_9#-SQ215k?d@[PwTڥ`;zE4v+pCs3AR䴭RJ9 g| YLP&NGC2v$QzRN$,Xa}pB4%(n0ޜZ`ʪr8 K9:02kTzr+v Xncy@wy@N\mfsUq |]3Opu@WI*+/c.)]'Mͩװ♦7Q9utիZ|2uUEu:}/U,Ҩ򷳲<T>ހtqNS"5S?qzY@đN|>ݺ p=c[!Hl(߻U뇠V-cSlEj܃?ꎎs.:}h ;i{\Xu_Ą#%XJC|Kt+~l~:ak֗}%yx"D MKtK=IPl,l?|"[PFdhC"gLwqKaMp1:{ˉ u4GAw`oucL x,y4^FC#>ydR>_|B{}hN&w$pDsΕkWbՇ;a]vpPwE+Geɿ ?!.Y#EzTysK3 שFi300E 3,BEO!5{r_T {%[$4'U*R$|r Y#s3@eQтD5>ػ\ק?H%s{~c)7Crx0uN$i|V(A.CWL\ d܅,0- \m)k^*U떨떎zB>w/|n]-3iچ{`3]q:XQ#ȷ@s&`  pj.J2@t2l{1>z}qjae[RD~NrO,V^0%;`e|GJ)3e ql;TxkH|~\[n)R'2׈,V1ў^Rs@Vk8y@X牁WZ-MLN}ʋ&lCzXx N<#V 7/:#59S@4 d:fUbI &-F'C[b^P|t{݄E4q=G(D*Dјww]ӽ,gu=h7y^Q=40|*XtC4 ,[Xv4ukȿ ]]$D# \2Z/ߍaZ1,K-e tQ, ŃV5+J :r>Z}Ai_hy^:-"YK&ڪءU굸G!IK^_Ea= %#mIHy)LOisg}=6+dy!f7q#h.'?fC(͟^ y}I,?+f[t5fmS<Tc0+g6Š{]>F_ڝ`7%6[%p2۷PZr2Ic`53[ @+(($>Fz ߏ^w3d`5|nI"%JR'D9_oC{wӐ+껗b7t6*RsW Su_zN`MR:B!@9(6E[Y&؁͐: '/dKspNBQO"9hRhT ,N:9/RSʦ$ZNQCt"GpU\5zN7@&{|4Q*SC}An|h,ƀބ󾃬a/÷-v.7wd4lrAU䍹;Y}+PKoz1nk*(hh08uHȘdv_J.^F#ӃzVpݥ8Z $ THf \ 6#Bj$z+ Z6yT/oa5v#~m&Ӏ\Dk(MV2l6S,hڸa̸bk q*y;؜7斻p 3|޲)5;P^3{A~2}ǝNJ,TS\-=q~kB45hԍ=`áӓb ZmY R0bhf;| U OZ0۟n7w?ƾNk#&FMD%3afhvpop1ʜfd.ŝYD$mVDџ͟tsCp2Gqo&ƷU r6@UR2b4r&Tf5VvF;+ .0xv|L}"ꆞ5Y?$Xu)8j⧋a78wޙwf2ZΞ8ōcwYq&y돿KwnYmKݰ.(x KLF,:)R3hN&Ёef`ϫ̼qa˰fDb-f*v,u$ዮ33=E=;Ro]v4"3nz W^|іph%8W 9< #o/$M V` -e2fzVW7f8y2 E6/4t:,-K|$I7Ÿ[DE^y )1..>>)&ɓrEG8!@÷T12e~RҌS7;v(f, r`$UZ^_\ꑽ%0~UH"Yȋ<ƴ`4fLW6V:m7ZJ1WM[oUjw?8qrY՞V56.r7zj/ <Ϻ/]VleK̃?0bURb20&ܸyEm OA+kϴw99t$jY3j?̐2֣RKtb_usqus9tqSqD+e%R(pCREOg 4QYg-+dx zy/.+HOj -$~"#Wf~7vm$؞:Lv$^f]{Sg9u9츺P7ZUegj: E_ ^R_$4鵕)ɱL4._JHOJT3ܱu.1~KZq!d |:34vJ,wx|g+J%s&tƄHXQ9"y؞oUhEJ),E>tQ4pmo`7p|$8leweFR2z-2} SݾP5Elpxq\oS}o)W{JSeˊTv% ,/ V4}ɨ|KvA\sQYs߸sa۰ɔZJ^˪` <8/Mƭsmj<;fJŲ‚5ZJYJ؊ }/e"J+ýZ*)sTY-b=m.}9"`I_VYR*- #!; d5j Y&+JR'cUЈ Od:WcօJbN-wSĺS>8[ pvDҋT dOrBxxWdjڬ"#0w  ŁA"ޟ4ˈi'Msس[Wg3|xIylo crscXVL>0msY\>(2:]o]s ܳ4Cp4֡(rqO<w3ȉ_pů0웫NBǣc\WisdTIm舴R6f)Pe>QXw:~PfisYUr=FJРb \qP Z$u)e54::x40wRHC̒(TFsTêYQ(=x,~0M0˴l ~5(% ާ.b.I?endstream endobj 122 0 obj << /Filter /FlateDecode /Length 3078 >> stream x[swPyͱѷDB@ŁⲩIIiZod෵I)>8Bs0 (w0S78&aݼQ):e}s8Y}xAҳ0LsQNq,^E҆=ƽaZLp,VȢa4褅lHDA4ȪW6=4V7/`y[u˅-|O]|0  ^=9\[5Չ>Hww|u:3 jzHȓB B?6,^ 7GY/ǣƃ\rXSE!_5;M9ܴ`N޴VRB(P_ ̲S.|G=@:\r0.(m>Qb`(zjE ʚ*yuXM8FgZ!m:$dwJ^',DJKzqlìjŃqΡk+, x]0`$}MT2<+$H$,9 <`o2Pi<+VYySv}~SVF/+ai758.$}e"%Gl yRȣ2v!;- y҇MbC 9P`Qc/2]P"2Y.ZV TtR[UiFh jubw|DGJE~Ft˜X.AIAO0*PiOrzDW%DU,n@E٩~;<&jT#NQ:GX ؃Q]A  Bv*Gn-Y TfbʠXBAUh( ^_T _Mp5.KJzZlb ohKmKlC *%4^JhP*7 $'In"]QGRr]H6I@B:vY#,E P'_`u7U# $u%$/͠($tR`kI4fc/3C&%!KUaXWp7!$Yp~lP; ^j9 ZtF-gMX,!TY1%űwTpD%zvWl?+e(e爊dEzktpZB(ՒW[tLzԨ h3 !85 !ktpX!-qTڢ{o_kB=.>qiE!\ȀGEoegAf:8XQt̴Z飗[P3@viGK&-ldqGXhY>WBCv.ꢧHVإb|)Ku~ǧUY!'B.;W%ϙ>ntȏbm=d2>Y.߈0DD $p-8g /Y[ wyrr/%n\T_ґ I3IyT\v!yIZ^oժ("e$q_w{)IzcVI!xHn! eu%I\!#Mi෉&74a'o 7ƺ~Qc4L]c,!/?ilM| *^endstream endobj 123 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 434 >> stream xcd`ab`ddtu14qT~H3a!֏Hnn? ~O+XX_PYQ`hii`d``ZXX('gT*hdX뗗%i(gd(((%*\c8)槤1000W100DGߏ˭g<wC{mSS P$<8ߕOZϸG3?DO1J3[og]l ?)﷿77vJVO#Cm8Bl| ~L`4߱wq}b1ù~O{*pendstream endobj 124 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 2016 >> stream xU[pEֲǦ.DLmnu8i367J:F`ǖ/-|eiw%l|b"0 )IC&P ҼfH/j~?tyC;ӧ>||ID#Hmum)>O|CfCrATD "Gg!# 9VWrX^Q^J&99UJ مbP/=s+J4ZbrCRRMMMb:BwU}zZ;9ά(׫j59ts mAѩ+ktAĤWT?VX+Rb!ˉ|b7KdkD6X$LDdyz^>Yq^)VQ)zFMB{B>r$)} ;VkK=9XCaq&&.C| WA)yUD!5l⃭S- D;s0 SENyz*8onwhD@;?:~,eJQ\fѪ3Wa7Xbl\fB=z89Tm.y.F/_zfk2JVM=dB;Ts@2ӫhm }4LlCm &RUXw-AQhH񢨳h^CՕ@<0} &7vZ.U2@2t 0ۚw%9UуFQ,Dv'aCnAcw ǿh)k3-RsQl}Y5A'2Ǔ;V+1.d7 Ba2D?/KY' C. "!Z6j-HP(e]bp gg1a*OOpRoz{xWR㔔X-Qs:JAo[ݵl[ PP\GkN."k)F87J#|f ?4cL53ÖRq( `B"_;7R*#$8]h1VzD%Gٽ6K8*Ih^fb8hP|z=!{G7jȝhj1k.lٜ6)M_ihesRL~fsb\9*o?ajs\qrBk3 ]K`|R8l~WMX=Gsf.zT5(2Ze.dM- F f~ޡrFAf]Mڒ[5O vT۔|Aoi6[Ysqj+^;O/7}ӣ̜l_axh-e#u@*`^;;! X Vx@g<^3W/) ^/PH>>\ڋ~6M.+2!ͩ/@ㅒl mO[2]TMȴ35,Op @1"ɵZ8kE7)tKvq~AB7[+%^Az(={*k ,ƇhX]b*:+(P'T@4¯Wp2.ywQ$^֝hw*j4w]"1?u:oP?Mw[C[ %ZS 5cg_wHHjϒHNNo9C#uz\5[%m[!j6HDI Nip~J2'XK)۰h%m V!ퟆEGSEKthE24W90<`9Xzx0KҰnUcQIW3/,kNѝ6%UvggG>ug>-`=AHtco|(f>?<%Aݑ_A3Q-PC^HZ GEĿmeendstream endobj 125 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 1739 >> stream xUPwcoMdghwolP,"iF"pqprY%9Au9yuR\'D&6d Xk0] Q"BFsihY24#Lzu+Qym*W2i9*+ Zɦ d2jbPG a+ILT~CICVΨyrfW\ c0nM;ԙYZXF$ID2!-V="'dB"X:9!' sryO7*K}$\?ImQ $@+Зc?i衸4/ љ 7ZTK/烞s#?ZK_@riJ.Բ.b[ԱL@H:|2q/3hqDd(^ ({p4kǯmI0/(>T듡}gZR<(ґ6#Z?Ia6(ON[= ^:|͛2ӄD@>٨ Ien;C!f-CQh#)f1p&c}h72Gꡪlγ)%$reG򹆷yY˨Y7*hq9s: e*6;,@uhmza <]z $әZMlyKe3Ml3y@x@Guiִ< нC?ݗWV[*@{ȹ%5}5F2Ьf.]:0kEƗuT5l0U; t,L >dLN1%c{ag uGGq O GvU[R[Ww>;)ҍy".:# ݪ9*NH:s0 :#HI\[ m VOP:]e(l`@g;ۅlo:E(OCwQ1CleG1^dNS> stream xwTSϽ7PkhRH H.*1 J"6DTpDQ2(C"QDqpId߼y͛~kg}ֺLX Xňg` lpBF|،l *?Y"1P\8=W%Oɘ4M0J"Y2Vs,[|e92<se'9`2&ctI@o|N6(.sSdl-c(2-yH_/XZ.$&\SM07#1ؙYrfYym";8980m-m(]v^DW~ emi]P`/u}q|^R,g+\Kk)/C_|Rax8t1C^7nfzDp 柇u$/ED˦L L[B@ٹЖX!@~(* {d+} G͋љς}WL$cGD2QZ4 E@@A(q`1D `'u46ptc48.`R0) @Rt CXCP%CBH@Rf[(t CQhz#0 Zl`O828.p|O×X ?:0FBx$ !i@ڐH[EE1PL ⢖V6QP>U(j MFkt,:.FW8c1L&ӎ9ƌaX: rbl1 {{{;}#tp8_\8"Ey.,X%%Gщ1-9ҀKl.oo/O$&'=JvMޞxǥ{=Vs\x ‰N柜>ucKz=s/ol|ϝ?y ^d]ps~:;/;]7|WpQoH!ɻVsnYs}ҽ~4] =>=:`;cܱ'?e~!ańD#G&}'/?^xI֓?+\wx20;5\ӯ_etWf^Qs-mw3+?~O~endstream endobj 127 0 obj << /Filter /FlateDecode /Length 6397 >> stream x]Iq#'r_DJ#l.lS>4`bA;r/kjNCŏ s"3#r\A^_ݕzs%o?OFE7?^Gu!j{}swb?4DQӫv?q@R+ou{T …0>^J9(avӃM BJ1\*(7Hw wWV =F^^}&H9^ܗ0ب҃4yo~a/!Ug{z"Ri|P^ݻme9io@|[EGPGprvA7urOCZG2-F.0|2:~-U E_t^g΃izI2.9=hpof;)+Fz+1BhvӇ&R.}Qݧ}½uN{1D[%Qj|N<7N^oo8ɶ"1'{#E;>_%DbEM}_65xwtrt2Ķ = +IPшUΑ6 mD鹼(# CąFяOz/V,g?yӑ6hKi 2DG`~Wީ s"YN'S#hT%I>SDqt}4oT |:F#}D mLwʻ{h]hHEgcc56"8h܏F];ZO+[sj$1mӴVH@|qҚgIQ҃~ZfsyP ?ߖ'Ke> 2wˋJ 6$tі2^ aKZ)gq(VC>U4N^1 =zT/+}R2tg0%](λq 9(* Ƽ˨8D=7|BQG1& Rsh1OlM=dgd-5!9[drjғQCr֣}o?;vB F>! Nt0LO6֓>yךzˏr,߱9۲ڀ0.O "meiw-*x(<<uPF;&byJu_X2cn3@yirXGpɭVrjߤcp!,`=M^ګdeD$ ] |#tmy~7j4P B:/t~h۸~/EuFΨ%ϲ3[ݝm*zWujcX#p+^LHOs݅";`SyE{cZ ̨ 8lI'ؒNk0$׺jXZkeyɌ9@&\ ^6ZXe_X!evz~rL(%6iGgl@#VMג@2 2GOj%Jշ]Sd'uE+vw>i12v!}GR>=$VkgTϡɧ`*8o}Js8~%PN{`NIOo=Y炶!;-r$b[Kw=rDqe j4Mf9K^"+w6}TR$gwgiIA*ƽl+A-VހP Y +Įion*9@Q+%J׷ǎ Jl$ t__k g|>ҟO[.㮈.E3ps߲a}+BE> T+E@pzYB@̖I(NÛ LpY7#8*9pwhwdLV"02[`_3,ސ@3 }xX.Ga=*rLG*I'gx OV.|}ۓwbl#ZZNWJr:k4l006eI$9d\rXCJ큙ZQӖ촽 -yn-i,-*: =٦a?sCg|0\pdBڂ͕ʯ;ɞ_Nl%d2nҹn3B7͘:n-dNsD]zAr/f_~]IRlkFx 1iX{bj'yybGw)S$ atjXkE`+%X=` ٌF__>CB5Vnfnf658 `dKº d[sرQ[4?>QoRpH]|臮.I}AlKd GpR Jx!4G}& ZyѭՓ"*s4pP¤2GEh6Wu" ˚@O^|of+@Пٴyњe !lI!9zp+f_vHFf MpkES}w] RBƉ"6m)m݀!:S,)_b Ɔ$( *ו 2-27taY.'\Cn]1^tĔjɡ y-T \+4̐ߡ$G.֘_`z>+#AlFe l MϪΝ`85鋪J/G/>flIw#r aԂWxY݅RsdT/ j#\Yvg^[̏VEB~vpvp OO.b$&"ιS8b!2)tWt7^b^I{Aj2jy?GhoKouXJ0t@_ t!Q.3O5XEVHhd3kV"&_u<\u +̓| YEE.CtxB}ߠa vƹq&cbOkE@ )p݅G o_}ng&ޤcqPH.Eg43a yE̾/ؐ㚙sb0~ '軔<41b76fښ;0iͥ9$ÁcOtԅ)b]ڛԕ7nv`Mj&CekZ.aJe_rq[_] 4@}bӅP%?L}㊙h֔S$LI@s.kJ֞[}'E]i6t,gL$2g6(#gF%rKznR^= Jy]BVW3[X&]@_>R:4dv5 =fkrRGeKbJfi؋MJq0>xoVrUz&kT"܀ uÇR; rߜZ$R/4twԴXUYEP:9#xrhݒj V6d ЫJS+#}+[[g9)5uM6`7w1rیv r/GNpmen}>zxCq6 6bm#8I f99{._5rQ $s @zDqad6VH`Z#iJN,o7ŴL3ME`G/G^D]QNp#Ұ*WF%uS^wsa-8&.Y1aDW zmjcƆk$> YΠ_kmVT=|̤&9dN: uiJ ?މ2!VI^|Ztdb|yXէ{[*pZ7x{-M]\Gf]_ WLT&p[K+rsY֯SSݛQR:ڪnC'FkIB59.4{m{iNrqc93pnqS8 ]f/86ds[ ss)8ĵ?>f}~hvwLUrk%rt*(ȥ~f;j'~ uk08 dR U:A\`*L8je+_M1Em 604A >>YW苦%景NYIۯSóJng0'o:,{LJOLwf5 v-n,+@7Z~0לఱϴvIzKs.U:59GZnd/vY |ŌإihF{[@t9,JDLPٹu'Ic(͹1T)Dfp)_>vҪE?0Ӿs3\s 9|'Mו|`[Td}Jw֚yk#@z9$Z5dy2,YB$Z2x]b- h_DgG =XB^֬sO"ya{]go ;E|%@k^HYuWTL!,ݼr/wt..s64Ur*=h`Nb40SdLJU = /( ZU;w$yFvSaha\-Z 0r'wU?~`MQ3F) -[u"%{_W fU4fAUVQV@iCesS ]CMwW( cdD`WT62d,%LZBWUeLn_(c`oYl5PlEpR +"LjeCP$GU*W'UNKsJ{uτ3==fz_q'I.͹u؎{\+DUlr2^$tӆsֲ! q1r6ZbW#`w4b \ =+eAJ3l5٭g&N:̤\K"nϕ{3swDw&!1{Eh+Q?tQ&eƛVG[tL<}Sr)$wؚ˚fߕ&V@,tNV ZDnJ!qZ 왣me=6l`t|}ՄDGa @0ޤwy: ;imP]R}jGR=owfb4ϋWK0abƳix9.̵P+Qu=&θrrBH-nߝL|fN7K8 ( Н+0}LԞYPRS9(L#8\.@7̂ 7Ҁ5SOL㑏K7L >Cs xKu16I: Ŏ&pAsjgxa醽lwV"Sڶ1#槟@:&}{tSendstream endobj 128 0 obj << /Filter /FlateDecode /Length 942 >> stream xVn$5oюvٮH e9 FiC4 f2"_Oi0ojrg蕄^OKcS]o=\HRS7/^[^ޣdF<A'èT4FK (TH 쫕6l,!A+ };=m!ưP~ʋiZeׁҠ;.B]Nj\t az}|3Zmd@G28]7g΍KRS7>#(S;\vlFܑV |t0Cnn?hIŨ%!jՄBe/Ki0mЏ:HA@4Q #+s3*v 2lH`&fVRx8iYyzxJ9JN(%2|UQI@k Ţpw]zvfp 1n}bY:6g9a|$EA#4IwM]7~Ys.|{endstream endobj 129 0 obj << /Type /XRef /Length 136 /Filter /FlateDecode /DecodeParms << /Columns 5 /Predictor 12 >> /W [ 1 3 1 ] /Info 3 0 R /Root 2 0 R /Size 130 /ID [<16b47a2ff8340e7c60a24090dad28a83><4d9c50a4fc4813ae6fe72f95016c5c46>] >> stream xcb&F~0 $8J~z@)Jx{&@6;L< {! fWς՜ "كA$k=db`2D2˃H9Qld`HIw? endstream endobj startxref 106138 %%EOF zoo/inst/doc/zoo-design.pdf0000644000175400001440000011351212501555041015550 0ustar zeileisusers%PDF-1.5 % 1 0 obj << /Type /ObjStm /Length 2631 /Filter /FlateDecode /N 46 /First 349 >> stream xZks6L:qm'qUm6舴 J|H6Nwd{/`NR"bDjWh"SI \Klj#NIRX?%íp?inAFw/­Dn sD399'R_4Ns%Q=Ô|E'JRlbb?1Nl0dI` P1#ԪHNce:$M }s|Y>7Y|Q_!X4$]>m|Ujj4Eb6, =-DRZ8|R]P.,n}bg5[JK( r%/PEA==oiNg,(4#<ݛ.K86;]ntn|/4ѧxkv ^E0/K,wX01zZe5/f"${=~kv+]iɾVeWpôꄹSʈl~ mTX%`]GW?/'>x!u6XŢ^1XŊ7K]j?I-F]n)A2Kku[+_h|;:w>ߌz_f.iʩ~Ghhݬ15x2Xh8 ǐo}Ǎ-7 }5tbaU@wğaeM8(LCŽd{="a{-Z}o 7aM5g\IˣtbO77ȴF&2)K4 /"gHL.eR&pyL[<ɫeXUU]DQr 'D78}vW'+HIਜÒ˗/_e5"J}$SM"0%bu%j.M.QF)6a(O fG/鷢xoMIz.$V#nxZ+ ؃LBp j~ ㇥|jvmOL2}|aۧ]o7j4޴hn+xvE˥R{4ЧJUR M63z7m pϭ9Ҵ4`2$|e]~cwvH47OSDZ܇iY/.2d_$~hyH?[ƾvqkn12v> stream 2015-03-16T14:26:56+01:00 2015-03-16T14:26:56+01:00 David M. Jones CMB10 endstream endobj 49 0 obj << /Filter /FlateDecode /Length 2765 >> stream xZKo!aKf>JlXv ^"@6$|s_Wݽգ`$ЁaMwu=G, GR. .~YeqzzMO(\U rS5tjtcR_\<~Wb1,3zWzhhe-cuxwvڅn#'y+ 䕶Cp.oQ1m݆D5S(v1zwx"voly^lzg:]6&` ^wwb 锍i%mtM*)sch<(DjXH{9uE*\MD4>GBKv{v8Qݿ"͋s*% NÑ7btwGP;j+"XݑMƽc J2*-D,@tIRgA;en(sdTD慑V)ĭe]WG?ݱCd!GrPMْsm}m+P&W )}[`(ՀJ: Vbkb 1Z BOxILXP*\"ӕ9JtoS:Z#Rqke~`y]wtSB.q xװܫ&m*G#qg sM X^'ǫ n졐h3(\`C9r RB.*6k~ҥ [Ç~*W*t%`ekی$fScMlpܔ:ɋe^ XMm%o^^nl,ȔW6oB6\ш(.STIۣ:I6lo"} yCgֹ)+I= Ƅ1BF9g(?kP_ l}})@3̨;@x]h Pn%R6OD zW\_5h^t5I/j{2 X19QoxVYkœHk:8@t&o*yii GQ+3<EkWkeMsjXޜmP{[$jR(7O̵K7^.A<׌+vpEؖy8|D\$y֚i %9Smw".63=~7 ¥@dG$A9?ۂ146bhS՚oK_⼌sg3 cKcgI~%0HrP5c|'7Nei!Ԇ%@ΠpcjHڻ"3y䒞-@>NuJfK>@#ԡsyIݏ7D}-$ԺMɈA< &r>Xl$#A()[R}ߦ4 L5M$\ @ٗpiA6Qq6Oo9=Hr"aE{׮,S xF3ۺ1>tQn1`^2$H6qaekݵA9SvWt&C2W.MSTNf;R]޶H.?e.Č6"[M){!N)輈 K0#@RPRZ#Wtf**>VO*7CӶtEb,U{=Ng0[w;K -*lg-j'UUmTAۘ`Fc  [(]@xwALKӽUc0MӼti|rD ۄ||UQ{Gh5؎Pa *oщN^3A>q7m Njߟ+{{w%t]mZxÇ gm570#u:*}XA Su7l:ݶϸEsA}m?pPhHc+/l8 p7ύUUdYeV_Enq;, ri ӒO[اԵn>|ulU8[ùA]ޛ+Ac-} :_,u a3 XAx⏜<}i-_Aavm٢,r*U`⬊_UYZQendstream endobj 50 0 obj << /Filter /FlateDecode /Length 7293 >> stream x]o\7v.eg,Pnn[Hb@;dkYX+<8;,PC/yH<|:OtߜJ^ݝ̧W'?(iz= VΞ>{qŸS4tMޜgbܗ4uVh(vT‘ìX^q x;'g.m;wdP"1l>E$v8FSkhwp X ~M ,&}f [Dʢ@nv`Gƃ^.SQ7FR#ld0X@6⒯9+$\Tm5rY[4zmko Ϯ \ ܭ 2dx2$qf Lem"p̿zvb>'',zBC, 1z]*=`K0;D]Qg# ~;g.0/Tqၕ]"  ĬLwb{!oP-1,Rb_c LhB|JPO9?MuNSp/bpBhG*;0):O0I ނfw%yn`"=N>D{y#sbfhMlOq؞S X$w̵@_'~6+xB Yct#&C9v@!WVۇy<Ţiz7&9fY bU8_ԿYhr`l9zG6{L'<\ gNӠȘ-8oAhhtnj9Q~HCW4؏wCp18RFVrU)Q:Q)Fq[@M0,Uٸ$& $^W`#)iDUk<^9#%*Ba-E]\r rtr1uW;#k4!$z1vp!0Q^LXµ8]F;[->QUYt/d3Ti[f4 XxX;3^$`F=RŹqg`N xu'Pd~fBAAșT aKFr+M;na&`X6҃=aY QH 8S0 Fgw:_dn/UfumoExa0 DqBlc% 54{"<kjM] aom|ךcJޅlAg-s<$oPP. bz߲9d"H"sNK]%t%n98"x#+>xT" ;3uO+ո\ƀ%ŎX&l]}9~mt3g~_)(8;L@XЍ50{tB2(cA?o2uM++ \:[ I0S$*x l (l1wAp}oU\_Hlql47EgTa:O~ω@:AJpG9[ѧgi!( ^m\@, ,{Dcȍ-|4^F"%*7n'&`5ޑPKQ(&D7M]"ml&DKAUc ,x?J/\JUVipn-8Y٧sZx4W |}n~fd.t ;OG0~ViPWXCyq?l#f|3sLJ'e*#hXC{KEJ;5/Zs~QQگ g#'и[*xJ1+jqrV [oxgU@"2End0%Ӻ,ZcTAJM*>`>TDV~ 9bVb_W1-8U`PJZfq[!މ<;2"׾lCӾ"0  p46d70, ShaO-N*,։\Xk A_J>\x4LQHh}{ص{(YE.^vNG49CKِ  jQg rbu`ˈQAoSW*fXL%TK$O8q `TSHՍj I>lUR!C甎q)l5_JwăLo-t\P!br!j@"ы DFruI_' YeOJdS S*p޵eo GZ pHZ?j74SH`k?mI$:0c?䧈Mvԇ.ٓ SJ#~zNəxcO!QZ0YX1 Bx"Bԇwk*[b.B1EŖ{u~ˬA>CZ4#rw|Հ] Yvʑaخ3E7ml y"׽Gϡٵֳ?ZL'RzϮOٖDG.dpKI?U&BA6Rz {׭Y` _D1нk/71ei/4e?"}VW0Ҕj5MsVZnBѠL5kV+CN&pgB/V9sPxAn?2@Mi/ =*Di=\ !#(̍L÷_BjPq-2niL+ xBx1[:}j6R=\_Wڰk9[ɚni*٫CyAA lJ]NsqOyGЎY] ˤ} ^?2.Lx&W"+{Q*.[#)m+XjuWNiɐ:X]&xYI,5[ߠ sldvdO{(vIOw|v]:#ځ (J Nn\ŭ~2Xw`.j %PQk8\$VFxSg*K}Xq0.J&Ӡ%aUXA|@xn2Z,?ٙ"͌@7ذ6$%tّ3ivŋ2oD;f~#;1U(.ʝN%ز,EO q>UQЧ}l"R֭%b{nRUJ( 3s ľX>[xpPT4jų rfł.)~/Q ڬD| y|wghSGhOr593&/Tnݚ~y֚/ZS?^6|NljZ 7К_~)3.=G~JRSřf3dW / K9C鮞RG`gRp3!QJ(F O45bp8*`/|Rꦈ @s4J'7$Bӄ9u%?=&w+߁C0Jv+^}>-ex=)m@A+ zISsKCk|;q"Y ^3\ӭ.UBaSrͲm"Dz[Mo*ܷ{ۼc$(9UF\Vof zȐ3ڑ*C d_`tR+6Ȗ S] W8JjGg֔n$ :yBOL)X3aywŊcw5\JW|T=865OIċ^M۷ZG 869yNtvdiobQ<۫K(H߂:PgP,lSyv˷W>Ϸ W\[rPodzzՇ _.A Xyת&W\|kQEcSJwܤe3|K9tWP3|͊# getɗ據b/&1n߾o !]rwct+-XB݋*ȥ~=Iީs[HW.bFnBʃ_-R<5q#]S# lʢE95R|&R=U zCRGSqx\Abw¼T%;m&It,>sN4!XT.l+$1jDa ,Tu.菎?v#!c!vXBTm !6Lz)ϳ6[5+eoЅK Cc J/F1s*&@r{ 4JoNE~pX^4 n#ZN\5D%3ތ׊IFzǸjL5s 6pЦB^jqA~):dsPL5^mA~Y=jq3^%Ug. Ik, ܅`kQG&M푩_wW$bߨw TJ$9^qx ^ა9bX.w+ Ng$(=Z##EgA;JDHUJHvEܺ岹*kѹa=6s}2QY\NmaJWʦջ!V;"Yyz,Wf[u=d*x\AE\COۥ싋;]U㱋256yt VTv1$_)s^qK񦇔,!rYИY}ޛ /1؄O K  z BPЗRWޫ9.jckW{'Hړ<جB5xev!}M0~|C%yPn-$(0Ju#( DQ9*vVl}LE/g[+<[;O)v/:5_5I9.VʱB&\p'YJs>*)@] J<9,SÅ+Le?ƐZg~2s"EQ04){a~EoŏaED9jQ{3Ju{_ \TЇ&JIm XI-@GXzendstream endobj 51 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 966 >> stream x=RmLSg~/sp^s~%lqS69;3蠴e&V`&,eBn, cF7Ye/KVX<9yyH|8N(0Z6Tѵ{ !ERCE≃VsqZ]3үA|{ӏpZ[w/r*'{-APMj@p pݰA/D#(M;G*L#FkQnSSxZ.'T!3`]0 :w}}bE]5]@)[=VtM(&EVW#, t2&,kB ńM;+2C̽sN)ZXr,S(i"OS&gRo34) +HЅ?G 5/6/uuI8= ,OЄmo$yF:FqP_ *(m_L鯭? -> stream xV Tga 3 VϨv[PZc҇]_bKI X B $hyDD(DVnֺuۣvӺ};9۞>3'{oX&0aY_`C?ʓXyr$N`|rrn,6ޏ9ceM٘a#Uϊ7Ӵ8ŠZI:єf[lꈧ KΓ3gf03=:]]`ԫyzU5e[if|-4e[fu)]ofFmYdγXiIYO*af$0L"Ĭa"&Y,e0˙1qs$v32졀z#=*<;i&8Rv*?Fͬ`hz5rm29W F.tB|mBSݶxEqD=Qt{n@/tw>:'WbD6*AC,rKr% 0Jn Pgi ]Ej6ǰF'גD:~)W>A/ۅX܁&'"s!Ʉ,5$d<`VOzN? |9;L )@"JG?{ >> b,&)8Ȥ/d[c>qߑA83O&kWh43U~p<'s D7h08īH |9N] @D %Ɇ K7A)!֭(p `ql[w,yOXFJ O NK_U{CN-?+6AUI JWq}eY1 |;(;`0/ kW60I"നCa'{,N6`Xݛ0gL*pNp9n˭r:KK,h{[z_;|kHb:;~Q8ݛZs,Kwxp w_cBԭr KR) Q>- a 'mJe.c~oWDe:ֵ/cqr$lw8É`:5{dKP1 KwH&pq$Rz5$@W %86Tr:p :3?u#79I\,aDBr5E^:~z_k3b!*@E3 PNߐy3 }"g׆{G?1;|Ӈ>49I|}cA^)sKi ;z{zOԧVfF > stream xELSWߣ'֪Ԏ9"?l:A43D0íjj(öPJKb</pV!)U'f-N92e.l-7?s?{hfs7ef<&iyAP7-JP)@{qAxtFL,E)hVu(VB1E^*ZLR*l68&= lR-$nv8W\42f/Y*Jfadw6CbҞ/6Kyd6ۊMv+EQ+=ƬLz* TKT<-jHߎUWqG#0I7Kldi?}`ÍDEOq pN=EOT%9 :Ŷ㢨3`"Ih`ۯp\E)I5-Ѽp4~ T'hp7>Ң%zuz=Z!7a`fۏQ;VnO?^3MZLJ.`]tJЌc J}O Y yFl wڻu3p}Ns8 I`gy8WuޛP: W l54|kS^Z>?p}t4iƋ{:*-o `x*/ҒVxPu燡/E솲J[>7jI=۲d/Wª1πE·/~gc2 7 ;2pju[Dn؇nmD}Ꞿ է~$p5RV#_I go}.Lm*,^d "+H|TM@^8<}:1Iijr`uQ-a{W{GC5yz((Y/<(Ca:s0g+pR^uovBoy?#lXKX‘S1 _t46ޫ. iS~\Z4ލ|>LOsRSǓ?&RI < &z_+Gp(gxE}3jWo{~C.v_5-S9!DSendstream endobj 54 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 6771 >> stream xY tS־!m@ (3DdVyЉ6NyҴ mҖ2 -( ("([ϵ\_E{9{OJ 4cBڧt[,6{G]iϏ*"aP I_4gӌ8͜>}0 p^~a^P>A~ NF1mZ\\ToM//zXu^a~NM|.E;(j%K#/^"vtծq^{IYoMA7ss1mS^O9}ESPqFMUjOm&P.DʕDGMRK)6j):ZFMޡQ˩ j%5ZE͢VS9j.rQ(1R/QqʁI*zHePaʎR=Ԃr$ l9e;(K E_b^e* |oАA:xߐCZV]3ac];1/f|%ח>Qpq㕑#t sĮg+y=j7#-tG#<HE7kphA\w;ctAspvW%w@hF 魣ſ(eoq1hr{ K$k )%Ȉ6;\q;^!3[A,zq<x8f^@C~ 9XO<}>Vhu>R E!u]c>%0B|$>h.!矐1E"y8`{QD3F Lǯ8M2(ʀmѕ/Ά nb֭&>^Yؓ؍]Mhw6?*n?@o4gť|D|7{#.eX@ҹI._bxCl#?X^qRFYC7tmG-b?]G$Ԡcx{ Z?3/&g*nɰ G7< Qc/Δ 2sDHg-Z`<]Oz&nG–Elhݏ~l C B3" ~oN>+> Үe6΁En)(_חI8[&?#9OIi)gKxC*p:- eB"1)!n,Ywh[WJ:O?=B| aK%K|Nha? qvыŭ4pPi8*.*CISSh''V&{;1{hŀ^!ջѳ=5Yhvtj0-MX2Wb@U"'}M 1"TLϭo6D AȕgK> N})JU9i@f;ЉYVWWs hzRч?xXcj$ɷ╥G;n3B5:4Bng )ҳ~ް`o=RNSTdԔC&U l!=˖JSn3-0% mjewilEȿ#C\NLG3B,I"}4Af@u(„^@# BǢWL&Z41~h<~jKS[hAW}lB{Mt=/lWg*!Up F)<K ~nB?1[n\gOՓ饝 Ϛ\͡o~s3%x)8$oC듚wHj_[|3#[@}ھ\7ȉFߙ ˙d5HOmy5ccXDt8!]-{8`$/%8ۡ+LY Xyi(C^&J!0H?l]&AAo h;mfW 8u4[#tҠdŗūun/o;,Cr/~[ %txkXUft:f*m1%%aI!5ְZUY)qԔ]@vБ=U[1QA(%W^?g9LArфBƻ3w^q9_Lzxqt 6g`j>*)9-g ۾b0󗻭 %tƒjɞM=;SOߪxG&yAYlr>dyxz ->輅*VB~̢hqAjG!Md)_ 鐔nt@ȥ4b\k S 1̗tq -vQv4wOs2 JxGl}G댦֎#fXD)TQȮ+,j)$'d.tXsz)q#,+TI ԑ"_uxڱqr8FImTY[TY oh/;JwG-xFO:x?MlcWȿQ&j.Y*7juAٞ#hly+}ćXDy!x%%T"oA]\~:8Qu~Fo&p]~.u1mJi[>:j7憌hd]Y]/Hf(@1җSiJdv8^y),B[.uڂ 桉_],jP! 3m.!$b!auQ&+])Prf@lض<g<?tEx2Vu<{5OGj4BN#Ce٭o+p!/;OءMD. { R~)?-r.5;!؊= 庺6fw溎0 gV*Hػm:u-ZhՖn#ĿP4z j | c#U!%>/ 9P[kPTs…kmImѵֽUDsAeg I,M(ίLm{{q^^Z)0S/Cg%Iٝ R?SOa>܂_$wm\7:4eqJ>F60eٶyTa ho0؟|D&64h?(tuaˀTn{F S1 9ɐcYVJд"6(>$|kzŒx < zd_&ԒW.R^6_cWUi*+ zo9zEcj_h3xOc5î'V'uHTv#OQ,z¢jD-4&<  Qeݭ[UEKBw{w9ͼF^fN|Br?'fv>uȏUB%hrs e>߼DoIZ򷋋ݟ]>|v|Z%V=>CXu@Q)CUd̄wJL&n"$pRͧryd8m< FKWX95PKz9L%Fo 9Y%ȭAM+RR4u@oYt~kNM~C[ 13'#afn>ʖc10C *Wɉ|on[eo2qv1xZTF2=vgf"ijljB#MN\#h>;,苹]f}& z|4A /)]agzHb)lɛhOheCL vhGh9hK*%($qVw*I Ld$IQ:25ڼM΂ /lcO 1xG$ht?dxXȉ{Wָ k 쌼<|IMV&%ߙk{B>dj-v,ͮfE؛tmEҒPJ#%-i <*KUR@ÇPE NԖ>e{_A|"Dscfo$wS.M K]y2}!1#=?e{'o3xw '#=aoIB&18 'HM۞cJ[Hlt/ Y;yAfqf9"n?-S^PW6Y H_Đܓ1;NgO b0of{rNTT(,)KJ52Y9YyuZͰ+xyY'xxZƙ,՚J<ه^dZ}/f V<  /,C>g۫Kx5J"DZА-v=:4`r($?M8g/ð}5i켢!\PVGǏ?"l]1,B*Ku:T/GEzoj Zso5-~{8?[ks74OOR(R*!ylEo5-Vy+Skk+?ҹx* 8,] ְk5k/XftC$hljU<$r99Uf%7n `6ZZPgO㪍l! X}opJ3> stream x&CMSS10$u`  c\WouCopyright (c) 1997, 2009 American Mathematical Society (), with Reserved Font Name CMSS10.CMSS10Computer ModernRS334O'7ҋ#J2PG$PDDKP ue.TTB4)(`aa^}vrzj`ITI0b17|:T}ʋlu\j/Q{mo߻jluy̯ȋmKNbPN}DN.Y=]K>F<_O-灳EG״ϋ8(>BcEauPWb  7 Ȏ ٖ Rendstream endobj 56 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 4200 >> stream xX Tgc4*C[hkUֶvj-ZmqZvBBB Kv("(Z)EZ;3ӹݾ0?YzL{mgp8 }}}y?6w`0ܾ~%CsP/'JA06?>CE{1&ܒ/pSR+W߸O[1|sf /LMΌdJ& W>*}9k)/ZKI%'o wg&DvcKV&?W,ߙ,alȏUP|4%?2@F+Wcnlۏ=Eb!10¶`Xۆmv`ObOaa.l 6[ebhX#qv Lg\yYIAO>ZpBiݿJBqܛyߢгa0!Q/@)ch-lPvƘBI")jK mL9yZe)UR " Wv{r&ycob~JVd(IzDJF6@ZM뇁P]&aZm 8Za+Kbh%Zq)\Y<S&@"Gl{ۅ[/=O-J "W~n2v2$QEW>t1DN6zw`FHRetPR:1Ù5%*WLȆ:4ۚF"d"1&^hg+Ǭˎ"~FL)N0;Mj q f,g1hzm(xY,xMKj3g}ؚi^>3lģ"lflqFc?OWrz"G^bR Ԋ }ȰIog?~GFbyWuuc}]: ?D3 z=2%ܼt. a ҼN:5!iS(7|/OycsþEdj(_tX @-e P{΂$C]ܳ_՟?H/n=5/mDӣ %KIx=Oz;ɟnk-vrG<`}UV"5:,4|zƆu;Hfxt 6WQ"֟OC^[i{3_JsR! ATF@Gk>[iɪ,]&=S9|׫+g%9V+ E;u6fu}Bbh/o-o'/ߔ6yUs&]åVtGkӃxJ4H5tI CwZѣf"ꀐ]oXDz4?^G̉شC7r^/+!b'!{(twpOZ>[/y`Ȯ,pJ/xKI`,Un*CT2hiRY4VXj'e-. B=B]-_lZ(d8FmJM.̛^/*B Θ3Ķ5ۍv]#I{3R'RK4LD3f03嶉RV>-]=Զl0 ShiocՀFԕV^@JRK俦E|Ɨa  qʡ,b!è, .Zٌf,~T>.Z0(]})r@ &(%l9%h?kvmQa6u5[BZ`rhxQzC'l2>^NŴm5VuOũxȄn~Ɯ>bW\:gj22C]c)!3!MfʘI=ΞO{Rx > stream xkLSgϡ֡k9p1^EKE@fBhZRʭJLf-2dmL#CQ_e_޼ODŽ)i,:gd¹U)ܳ p\kvRǩRG甯7ozMo(匢LE+Uʕe$].Wuf:g{NٶqhPޠf*^_6*t~y1enJG]OKurާaTje cA2ۂ Ą7nJ y[2G:Ǹ1c(!O| 7/3lDժO.;LM`wNf~ *S]b"nl7{HT~ (Fa7j"jx~20UNSgjvT.Дyr{-HJq(pwK%/oEKP چ.<u>gW8wْ+B+*BIrS>-ߊa@ +:ulcBXzvyci-YM&2[@eCR&eh̛R|}peN,ĬQZ) gwG87DHc7)?Q|L--Q }O{;44rc c@ 4JjuM@ճլ#H4ō g:65y&t]`5l}YkـC!OixfeM}^lZ^B2e̔@gЙrn!r ۜݕ;JWƟ'"1QNϞpհel-GM2\M^8EPmi4b(4 ;NEC7;J8vΌ .י\`l$%Z X7Q m \0|#i& 3D|; *Î=2 4e6{F3 (+>x<~i߽/ruʜ,=]g[ 2;`70l3%y($ ӂYnV"1ѵh_G[28% 6j(3OW<>2PׇWҡxkd[~H:kJ] EpW 7?̿ĀEU3QRb s$ E%bY-N=b Jendstream endobj 58 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 3909 >> stream xX TS־!ps!^:8mqQQ !2 c$V[miU[j;oYY+9}η;;WBYZPDu0M"L"~u)X6Ma-n@I%EdbFr;aqS2'G!A~*U=+.T |B#(ΙR:E)v9S69 nЇ"tOO (jSyOr]*J7fF?@ݛC^\̊Wf3w Q3ԛ[s۔ES)j+F9SkwBjz@@PSoPK)W&QRjQc(j,eMSʎPRz,Y&ffcK7VWhOA${3<7e66DZO6q]ۥ{nM;n]݀P=^4^hXH#AiYIii{! !]Y Mjk~¥tͳVj J!]QM'r#!,DZ3b"mp7hDw$Bxm2_n5C)t{G]*mVB,ki+)U.༃yGϋleNk͈ AR!CX[$ f;"7-hurz>Ex1DA(4HRTPIߛee@V2SU7+ƝJ\(~DdnndesVDqcsn=sE)!LɈҀ xi|+\rnϯuYJ'92-{(G~Kl* 9mֈH lTBqg?L;-.odvYBCjǗ:1ht;u۾|K{_]=npݚ$?J=:`uu/ w^e9mG,\I K2v!'aޒFnv2&/$Jru7"C>t%X!';i8rSx }܎:T[[PԮPj@0? k3秮GCwf&I_e%GxA 0;wly=v$#dVG҃O0\j8;\~xyW‡]cl2,5c!M#V኉Fr)]h@ۊm~2.Cbju>GE6xy; a6^o{'Q6AZ,u*0K{;ـ2? ɼ6*Z}EcEVI@l@{W4Q7㯬^ͅ -9rNI =e#6Q92RggB̔j[:tPƜʏT˞ D=_?uba!?@F;6|{cFw[mZ7糞܇V7HŨRt.q{Yog@%?F\.Q/a~{_'v S١Q|"dܨFङ?BeCdBPTG64TW7DH B)>4`91=N80 "~$6L"J>EN~G矦RE[Y)-0Nd>​:⷏F5>ۯ_]ipǚÇ _4H1dbś5D<<ûM21̟&mbcsJāx1y|c_L)0F'iAYif j&(}rE"u"eX`{7.7؟I -ŧڠWp00 L˓/bevA‘m)xx~Y@kہ:2MW/eDRF7˟dcޔtcRu'c)m}L\@ _/ Icu=>cs݁ʲĢ,-X^% ɃF_LpΩ~S58ôr9B]/ʂTNEHQJLMH ;Y lJ2BkQcY&룰E|Ir8wc3fjEMƕT<- {Bw5*[ 9ĩ표reK4 :1P$!6C|?RRLJ'9'̓ ^ڲZB2BƑ.56 e,FW]Pv yLpʈEޅ97IĂX|*!hُSх#}liJo2v!c_:b_~-HΊ͎L/:!7Qf<39㓊"\YLM0h͍(lll6(?endstream endobj 59 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 328 >> stream xcd`ab`ddp 44U~H3a!3k7s7ﻄ'~%XP_PYQ`hii`d``ZXX('gT*hdX뗗%i(gd(((%*@s JKR|SRYBt^}ω33G[7]z}r[~kb}vEly~_d}{O!lYwVWG g/d4mn9.<'yx.x:endstream endobj 60 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 434 >> stream xcd`ab`ddtu14qT~H3a!֏Hnn? ~O+XX_PYQ`hii`d``ZXX('gT*hdX뗗%i(gd(((%*\c8)槤1000W100DGߏ˭g<wC{mSS P$<8ߕOZϸG3?DO1J3[og]l ?)﷿77vJVO#Cm8Bl| ~L`4߱wq}b1ù~O{*pendstream endobj 61 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 1130 >> stream xm{L[u若\4w!ñ,.Ld,@6ALCǵ\bi< }{J @ n1d ,Q_KLXl[w_89s=988UӠyl,w 5H)2Pfvg / 2AvF.1 43M!PAaxJsvE&g~Afg!$O7!NM5p pVw yչb/ca}4L|]P-!>eW]vIt"evoRƹ vϖV ~a1 v`PlG]An=#ZٍZ\#1jcSMϨhs#t##t`u}g8H]C(G*bFaؖ`O,ԝt.+%[\vfHU-&p"ZbI$}: KHUҴ~32sp?Xd._C-yd("xGkXE㫫qT.5> /W [ 1 2 1 ] /Info 3 0 R /Root 2 0 R /Size 63 /ID [<81f1fe0a73052919e6b3a19f540c03eb>] >> stream xcb&F~ c=غ^ǀHl!87 endstream endobj startxref 38379 %%EOF zoo/inst/doc/zoo-read.pdf0000644000175400001440000022612112501555045015217 0ustar zeileisusers%PDF-1.5 % 1 0 obj << /Type /ObjStm /Length 2795 /Filter /FlateDecode /N 81 /First 652 >> stream xZks8 }["˶n;;ЖnSX`&qS/i\l9rn I%Yѹcc4,P!SxF0ìU2 L&D3i%0p|0Xl,F1aXXgY(ClXh<LzxRbLy-pfdJ _1<_3E)+2-1(Vk t<`ZaQ dZc[1ZaTC55ˇ+֕\ 7+YCK$N'V`a8ʰIWؓboXT:[T(s cڷIp_ >ڲŜ"iqb(])訄+tѨ<[:r1K2x+Ym#R#8WC0  #(3>1w[Yϒ1?" ? ȧ,F;NەQ9K^ؾ/'&~M.(;f Pz9c4kFaa5hC:z,O*+=u> &k,I[FڠlX׆rІd;83o]RĴ0)ڰ%*U=%ZP͜wkuҐ;JUS>|Jjo1F>E-1j4tM#) ِv>R8̹ȏZѪJNyw-XN*W'K$ PπJu]*D ʆjKZNN6i8/!?/1Sߴ\(Iy/=!pxk<%i|VA$OUZn٦ͧQ~rӯ]JL( Uu$ zqimMPuf;=z}u;&vLV4@4Q1T=07D.:-Dufٖp!b|):st榩a'OS(j  ́*2ⰦDWުHH^OpioE PofO]u0֭_{V'[+Pm؟gP[l_]{TLlOW9{]xדvaarVRɸl[F6Aғ ]pp ͊d}Y4}JPwOjBXRIh@ =}]vnِf~v7|juS\Cnƅ\zd(vyx=uMANiWn,@ geS[o==.a. {ŹK[t6:n G7~x+FߓV?ۼuh B2tEyaO:FY+Zףit Y:4$TqrzwER"xsX,Y/VŚ*^9m1ɺ x$fo@-] psTc4'½9C&Ѽo\^A-Q7L׏XԱfA-f{Աqoxhɢs w_#z9v妿ʌkTuY&1^U~z_VxU\e}YeU7.FܪhF_uSU@A鸦mk w_Mmw !f~ #eNm5ÅһVyyL:z ~?mOmyx~QU~KFyQWPICNtq$66JӪ~"e_'kቍ2`1q䀬hzY+SBJQ@Ps/xIJѼƅ+U&sxUf软ei!:M_p/gNzKmBh*#-7cۻm4QuV?ܶyf0*s@hz)uOT@l4OA?b9fntGC_Wxl+у(oIlģL`^lj*EA ܷz>.Йb/ Kh]R!ˍfk}BZ_oΓ8Iɣ,>|I}Z'Bҳ,,ҋVqքF%ZP\~EZ׀շa?%Ġendstream endobj 83 0 obj << /Subtype /XML /Type /Metadata /Length 1338 >> stream 2015-03-16T14:27:00+01:00 2015-03-16T14:27:00+01:00 David M. Jones CMBX12 endstream endobj 84 0 obj << /Filter /FlateDecode /Length 4383 >> stream x[Yo$~#yqO}I1 Ne cU:KzlÑ^6&u|ua!F_GO@,N~8Ew0!,fqxr> y !,4qqr%F™08ntj؜&zpq\ioG+èxg np \&1y&FlלOcnJJQ+@/r*pbe  ,FF=cC~J2‡pl}ϢəaϲԔv QY3E ^ 6KA@DQa¨Mv3Y;D*8cEZ8X hOI*i) 8ԠCQI(btSZQ0|3x,+% m0"c%^}˄H ΘT'ÁI_.j4hq|0"0~28[+FrG;+ST"&Y%qx! n"42f" @|tÿ8@?cߒvVඦ4# -1r]y _U-  F)eߧ_h0 `賃ntq-XO_E iqr ;n>$${17 "a$@%D4#h@,nWVҺe.ؔJ=d>e5Is2h^{FQ˳lMR4.'x##g>(I3zi%8lSR7+MK 2l`~DҁDp>d{ht d'@Ëk2G!L u't!bMgMVR1.勉v&rHLXjP'u-a`""> YbM^Yjqcxei6n2c/-Kjb>,X' }U;Ven2L9 eA @|J " ;@BN'ZJ8.h >u6 P˞A6L۟ɍ7 b ձYVT{(?r`ɠ1U^b,y-Gt3<+<&%Z!ktΟ?@IsUA §) \1CV%/8sl0r;SVUc u`1C1'{ovdWsn T؍/ uenjzZatfs-s&ֺ6]$/j&5 ZJT&WG טF84X"L'gؿIK`.)n6Aa۸ԭu~}ʐ4}eUJ|؝lyeC_/@EIX{Y=ƞhdNO+ۋvV{qoKKɈ/u |D#?/dM\X3gy ObܷsNA43Ɠ6EVq4ّ-P7CB5A)WZIFx]Ce aL-LگAC Ɏ5ՊQXuBjQ\+ohܝjap'^/uvӶSFq/¤;٫ʶm=|MJ6rt)%/B]0:6{e)w2z2_3H L0 .7ֲ&r&49biE`Һ;]~$)Ah)yISvN}w^ʢ+I<Cg}NxQ;,{;$Ongտ?hl8lS$0kS>vbN[8q9\̹#TL0>Uv2DSWZJ}qgG $@;TUS3DNY65)f1'4D},XGK)_|.QPۑi7H,r B,鶒픙d!N]lL ȁ`^T+fw"JbB(N56̊!3jJquʹޔE;_ yS}Iy}lUq6Jk#=X!f*pa=C3<, VTX ؕ-] ]O<0)"J92)[>M yy}o\Gf`s ܥkyxUQ U^,v4c)x][tՠ[GϮA侎P4VgӤS6XR]K_n&f$M1 ;V.u8I@7U1_AI2tׁ Ivzq0y8ކ^2P+J?NFpbo.؛ z1 `0$"t^?{gZON&=!Lʧ2{VHNO%yCBGVI6ti)g\uF~qp0lb9x4'=dF+Oe'hY'%%MQօq4%‘O2xST|ShULO" cmbIqdh͉eyo\ +;=r~KXH3jT^W.fNbK, <BP~49%Sp 1LԟAs¥I|#$Z*H Sbgd2ӡHW9 . թ_]z'7MU'QrQ.6? (]P"i e!G F/[1D%p7_nܣ!#JoW ϦɲT&1ҼɰOTR`v^ͬ/wuQ¿1OU6A4K=Gn~,Q@xcuY&o*y\ղԀyi)f~ԱT"f˜"L%QO=# G~d/ni&2J-ҠT L;=JvX,5i o!{ǒPjp7#hنIwc };=/!;?@~-pW/-~A&{NbsIO6GUZ3(*'=bgɶ]5B넆@*([Ynqu1Ǥ)+SGbR퉯^BZѳe\Ԭs_vKZa PO6׻mM#_ptJ%^0LXEeyGuHNO[&m..M.{^\"וTrJn$%R캡4u7ZS}($YLW ¯ˊ} aq=}_U1Z˃_~;nuS`[=[躋ggJn[w=[P䦒eJκ{וS([ẻᢒG]~ W-sob1 횃株}t4 *^ѱE4uWc%}%c%u%C%% @e>AWu݊e7?\sb%C||هT<|TOUƺ˙.>;>Ǝ}HJNޣ>]Suc<}$'W9V()STRsƮ*CX+Sz5F\,pWF;cay^ߗ]Q汄kJndhA_ TYƲ̰\@O~D^N+0v넧V2wl<5?Z<iWσj*-݁k"Y$lV!~AyS<ԩEߕG 6s[)*=o̟Q޻W endstream endobj 85 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 3966 >> stream x TWǫmD-\w\Ec\\Qnd_efi.@b51:FMtccEd3ɜ3;U}z{߽d#HX{ծ?Z$!$)}9L f&g'>9o¤{$#H5վ>a6gXη[g1tmX*6_ %vKm3df le1kƅlglNf5g0#Y,d60'f33yᙱ8fj{fS l8xBpAVtG{pxHlesF3hFjf#1GHܼOT/A)Jp?JIuH;2p,O)k9 lc8I_;/g*CWφboJ^ҀfXfRy09O/BƒqO|\9lX.{͊s >4* ]-^N5K~~d4;vymx*p8/gHn_\Ɵ)= ܍^g2LwݨTV]Py k [ J?KHd\nKOOip",\^2< ~G醼 8F-}ygVJюh##lAxdm3 g:E k7`iqh.ۉռJAfx-'m[l?w_hS*$,KVs@\<d?˜pq_9)Z8+'jRӃK $3#RuzU *][pT,XH< \)F$G‰s>8X\Qh jk.nq4.xi_?3Ca=lQh5>HR6)v\f^w=SdHP5jVCVޥs]* d.F; 3P{6EYB~\\Ok5 ІK[T.*yM:i`}|]G]nVƟ8J L,S8'IA?܅/ BR9ʖX' U&.="n$'+bX]w\spϫr>jSd"yӋ /P~/t+s)6eB)TsDr874|wL0~M+k V((, V J.2UC*Ͱv jʘ09XpK^](lTpLeNB ̒"ep#pܷ)7||Ҟ8JD0ϟ =kN[MOG [jܘXUbC$'m?B3~i ;"BcBU)_˽˷AFp?~]\PңK= f:.βsޞ,S {*AُR m~  mg mYC ]+EIK+tg"݌,ůP n9/LaMzrZJ @ecЍfֿ&[ZXRTu9ɠ .)%[+≯bnQYנAcwm^/<0}EG71޻?FjmF"ܸZJLU:V4he\A t7bJ8&%kC,yoVR/?ꂧZޡU!qNCluCsʀB=Xi|RAIdhɄֳ(fg8JG>Ma+iS\[P*(H5 >Ed^=9/}6DIM{s B>7DMȈHӦҸP!a@?5fGZMȳ-2%!r"Qƚ9 s&ŭ̓;p{ILK:J*o5w &dh!5I'х*e].H: Tu%V2s掯ha;0T9+/z01D%ȤnJ/fHq5Tucsz3-&qua'eW~0"˗u@J0 Z̻dXFxrKiqzy}˦)8'Thj ŧ|^>[2XN}T[Tr?xA=]V%&ӞiL#a rkrrR*:ɇoxQr>^ bfu[zD;vn…pGđu@ֽ# szh6? }G}!\--S۸|ɹu֠e=1cqxwxFٕ5;|K:tXpa22(DJ4 D/{ Prz[QE~ 8 łRMR?ĩR{Ҹ%Tϭ10CY@031@!(R]S znwsAZlbڡROc##%7Pib&@ʤ/Hƃ\~z[*P^e2iSzoitq;F`^4o-hSB@R|(p^uM-z٦c+DSL_2\aJy3kO gŹ?_5/kF Gb#ȍ*O s/}9%SfCPRm6<̜aICendstream endobj 86 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 757 >> stream x]HSqdz-[AeNda$~Ie3Ӿ(psܪvt.{U̬(-(#Ms7]T҇tM 誛<Ds޶-rty]y:4K  ۅX<0ԙ2QjWx:)%##=AJMNΐa\GW1UK_3naճ\ ,oMϠA_4}A>&Dqi_ShoݝGf%lȖ?@M۵j=s1px[;Jm_ ~pͶb&45] pIY > gY." UO 4@v%G&Z,ޗ(8vXE`05 ״тV> stream xywXT׺Ƒ;F12j`hlk,.0&0f^X{Fc$jFOm859> {[L>tm?9/IPwe:B kgAX6׿H"2GE'n w0cxI'zUn t[D 6ffh||0O7!*6䭱ć 0*2m"; XQA ̞!j~c.[\5D+Veu&M2uo36&;ѝa^fV2̻Hf&7f53YÌf2cuzfnjg62Mf:,bܙf)3,c1˙ F fxEf¸2Ca zkA;q-['w/xqאC\6u뵡 C {geؗ/%%r>rQԕ Vh:4w͕/w-sʵ)uN* %iCu:.7iuGbe7ƚ-F} ?Ck\r]k Z`یa7C$v%Z8bKxt$R$ء49cKti xRz`1}PaXڻz^r\zԅV $=NװpmUa`xF-d~cc+;x({^.CCj8J|ǗԼ<!HՙZmH,:1\T_YP<X6aOBMvM.#V2&(F+-p4{w@5 Ke vI$ːk++}mi5^xVDz[Qʼn&[D 0~BAD__pQ&O]p`h8Pg^8_/G uJOF֮׬Χ᭱!4+p(G T Y7 a1|o9t3 \%VA*7ҳs6y\eJ2L&r ފMkG%5DY2+jfwh/Dv,j[ l1ұ _FerO'AIqlMGzn2q$LT/ZZz%G%Y\nO\RQ:&ΠK]I t嚜u'ZXi'FGfHzmQP5h`T!6DzKHq& 8dr2nE.f[ CpIyOY@$+C6%D^56TlxZqZ]Mscz:3)7b.~7U,s~&RZX2!~CK*k?O:V:U1NplK5ر94 g#:z'Ȯ }X"}B'VvMw(4 ht Em3U˚#|ٵy8՗=fs_5>ԻJ[HC;[娻X{a SKqTIT&qZs9}L2ǿ?Dvq=o*sBfM9M)eIr&Cvi^_S# `9wPWG㊝e""ʨkJjwG}f1+#@h!=MfdjaS5Q;rٝF>f5c2Nh6y\7b(Oc *_6c bjfR>j/a|'L!T\ h.(,ZjT8oU/.^82$"ٮ+DF\H_lVSL\-{M[h+ ɞb-o-*! =˶LIw5hs&b1؜[3@=PKWmƁ"{WmJmIZTQ8丌ڜ2ϼ;z !=w2MY8:]SY} ?6_H{k9{jlJbr!sǵpT3|^Nm)?]VГ'=py,\M4VZrZK;|:pKH]Afq*j i5jq1 ڪ:a 72ؿ$4Z!r`dq1O(6ܔk,iqd35ְ94S{H!,'?-ʵEy"ʨ{ch+ņ"1$}֥W\yjȶ/䗰8O8,W6ײc Od?AN.]f?TJVlV`Osv٦u-'ulz&g 75,BoE4I+VWuuU9z]ZKq^Wv()TIaڃ-@CQL4d^c/8k.arfuDsH2HN1qy:DIMI!'S #!6Bvp詫jC|KUrE52S0Lą_-owdwp'W&Ť4uSN}/Vo=sfw~ <ߡo0ˋ-օogGP qus%5Ú >j?Ϩn…o[iے u1QdMX k zzk UҚ/dZHrCHoc_c=.c$ k29s'i.8O\ +xfb5SB:Э -CCxoPFDbf1~b)KzUEt`psM] ՠ.}nul!t$j%'q|hyiɜٍu1%tƹ7Ο9;za ]$ 49ӞC BFcq !why˟\v.jz&Ғxv63"kBߍD{ގS+ZUU/ 9-!ga˰}W~}@Ev2zt8<(y -t4`'셓Ft$Dz]C5MA Alj  9T-):Pg3*4l!kt%*HtjF'1ҕI9J&qo$̸ZG7%##޽*X Űël unv fC_ڎ.:(\еb f%=$|O5-~~{ZGk/I!~W_"!ljhlRkj2߅Lty`vԚE.{9 uPbZBsTQ3RA5y9eb4fv0散ot|-5GV#=r+?yQ8{KD>i0V$YBh?xs̵d- Ss&F+QddlZB o#ߣw/ُ7g. ɧ^5{0Sbt ۀwR鞮]#WlޢeِA'V J8 }X2|aB9Vڢk#S}&_tijWUPW뀝$؉ڈnp)^9u͘#~Y:p6!.䝽h?jLT ׹s:[g/|)wvzqKa]Z$xgI+^vE qEfD=VMdMI޾wȠb_A9Q#/ŧDOj#pN@g]#[`l. [^܌-& 6QOn?ZщoklkjjhhKmc#8JiٸI11UmK 0z =ryz:/uq!ƺ?:<8#I6OԐ\Es8| pnqP F0רp_Dd Ht"> 8IϒWg,hL@#U8`-:āS?Nր&Id2 ֳUu^nAOPpJ%#7ߐ`QD)QQ&eZK^lT 1qq1;MFY##{*=%IW[QW-V H?t>Ým񵂿V)\%rk;N o S0/Xa:z:/ mpeYAQ`08wVxj\{sn@"65': NiھT3d ̆e-Rmj7hn=@q|Lp"0},\w5 B- ~K^i g5r'I_&)/c.=/;s/0kendstream endobj 88 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 2446 >> stream xmV PSg1$bZI#67@PTTEʫwx 9 >ye!تȮiq+jVk=kvw+b&1"]sU)fM ll`5k5G`*!3b(%Tmz|ZrvW-]m2OuIё*H:6)RCSDj*?5ԕKdgg/LXCQvfĦgƨ|S5I[c}JRj&6]0b]rjz&Ȝ(mtL춸}+f60;@&Yx3!z&0'cf&31ySQhdҡIWn`W-y]R.A"a}Y\l]eBll jjDcB" B uy%k v/Z K.9̱z/27K8EkUAK^C.`c!QR"!9R٘#}6gvD)]{Q$7 MkNsUd, hZ$R5aЎ4|- )$ Y F[`e>_phtT^+[#q? .GU`3*^np_#ΞܵA^d%>h+7YD9;)>3&ރ_+P’(0lc ׳[ ({4C2՚Zk8yR!-Lљ= 8Q6ЪxXGpeJcPVŞcb=(Ӫ%@kRkryS7u_xw%v: ODl:]aJ#ԝ,5'~5b@u/iN,_UEO࿭FcU\pQs`vcbFvWb3*qŀ00?ͭciYu渏~b>+xy@ % ~Ϫg~4GO ¨Uq{TViT;Q>a(%0;;ՍHiݯIVv[~5NEf G GEiM%?Fz ";xs-=sNMJ\dzrRq̛_~g}.*<؅KGw\@U_*UʄTϭ:GqZUuy_ʪ E!D^l5T+@_\J,Via>!”` ͢'Bܜ8 Tekl`9eF0V埠'i0i ZOfI›f>ʨy S`+O|@Ltn3d/l *{b 5 0ؙ'G'\.8IO)1ȊRAQQ]Z1 '))ࠡ` K DVi~@;g)6q݉7~ K-l|JrNL5ȧC9YDzT1 Yp{)+N6q~쁋UTAHewN0pp*:NT/x b eU?ct*OI\g/'.d7F϶4pxÎQ; 2)..z>Kb]2,56\iRoB&+ùݐK{Ӿ撩d{\9P/z_gޑG#\ !fg2Զ5Z,̀`"NF5'1{L-E:\$7 GlN'n=*218#v]n2a6<ҿ]͆ bysհ|EFxd 7?nQŸ灓xw(;>!lMy"+Pg|or;x5-F}SSgv煕(hsw򉪉jSgIQf@ޑPK,0wڕM`!VUdS G!H/mA i! ex6G5ddP#)22Z86gDž q{{;Խ= J*|^ᾈ'}N򻂫LAD hνMCOzOf+dlͶTh0+#l;F; Xp_[xm&?~EC N5Єist/TNCY9gSL?>u3B3^~PƂ0:(B1j=h􅨗_y =q:z I^uޗ\vt*I==OHIxk)'۽]`opp@ia1l7+endstream endobj 89 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 5687 >> stream xYXڞuavTlR k (QPeaY`pԥ(b%7DRK|޳,{/H$,vrvfs0R$#M +;# 10?JX$ M\y{zmmo3m&Lkc!`&wr͸^ryԩ bȔ@lr/5!066=l b8?(T!q ! (>`CMKeBCW)W*;EXΏ=W{^o3g~os7~)SmQG\c]j55MRc)gj5ZOM\ ZLM6QK)fj)5ZFRPӨtj5rfRRlʉzZEIK SV5%FP#)KޢRʒr (%(R{}#fJ-ki1B!Y,d0o@~gn)6pt ~6qȯ^ӡ v ?\9ۭ_X8FJF.6P1P@_'|ĠUi~(ExAn3 3, pq]1u않cgQ;skUs8VP.-}dT:6_+W|K! 8zM;>ɓVtA: ~d)?a3l6e?L>nxktɣWoܼh;i~X6.eQ29.1KمRe>-HY2?]}!(6^Rv!+Ll;ŮψHGLR'2-LµdH;(a/]+8 upq*K?.-DQ#s6|\K/iH>t\p=G#zQ:1, hwٴUqOzQ|2L5}]*N1nՅ~}.,oj!F.}g g*2dYOƆ."#z KmUoE$s=xOZ^?bNOݕqɥ?Adi\ ƯO̪}ʮi.=A&,1.{6w '^uRI RMxHt_^5+Uߘj슽O{K%3pd!zPփpMURܢ # twZ$D G9G.=QrF6k"$KRaʤ}Ф_pG+ĂKIp7"cSހ OˑYJO]jׁX+*b j$\@+Co731wy8݉1K.pƼ rm3SuYBiLҌf&G|Ԍ23+隦}< N$eaBFTAh* ƺoF#udU&9C9iii(18뷄KwA'Xv%' kF{N60\ޓCӖat&!@8Cta<c0Y^p~xgo7~ } C~w02|Y{@ЂyPE_cł_1ٕM+PjNvHQۏnI"uFtD@dϳjR4 (uJe(¸e8I/J8\+׊/H^w&)SxubH~3hxRP5J͍8{DTT+KeA`[LףAH'Q_H䒢?GҀF?E|W 1U꒺[ W#i05M6f_TFb>0t~5!0] Sku}~A^ȮxTS{|T Պ렊r>eeaı2 |1X:Z-eD>tú@-:޺t:"[.k{[uPKF, `'# pp8d1g}tky' .5w;)92*䄖Į]6"sRR?h D5YnT ;HїzC,z}6iAe+eo[6B"6p Y] W.-T]v܅c~vknuy)-y|fg}|]WWeeU&ELIe~]exúM[<-dm%>ES#W,7}bYVPf \iYJ'hw1(efe?̎]tXincc9_]n!Ѭؼ7S <[Tʲb+ĂcM?C_RЈscwbj֗Ϡk3Ԋ{|Ecԉ4yȶ!PFmo_@L,R=}E>J,,]}9XR(sǫ[B+' Dnҏ}yj[~1 ξߛ˴0܏K7CKO%5VPo&r?b.W`#)+ORvF.J.NV{-2'.` e&&?e۴b  h**4kn<{z\&kɸlx~[#%=.* sC+`n>y$w?RF®-ߣ >r+e%T!`e(C#8uXEg/?Rd>fzuT' +7^a]i<< @1QDF#/ F,|`q>~~ct PkXVo(FRV(?>z 7)&fƳ$sxe(;-]M&IymBS w\ݡgpBwtnzJgMO۬pqYx7a'?aUF ֤a"+LP]eXuϼ ӪQ_^0q5*o X[5ŨYע2{ZGQ#F) Du. 롓H!O>H[:<\Ya$5S%[G FzBB{?wN'"TR\9O_:㝣.bb<?wNMlD\+:q<.(43koWx"-s![ER0!?=1'łgD^ on_ӥu0sfC3ɜΥͻPgZXqfVV6)2Eo&:Hb$,3~0HꞞEgKf𻙬o߿zF(k|7_Qrf$g׭Md0D1f_ƃ dqq]tPp N߇v"0j'ڇyx'tyLH 0W{HwsXTǃÈGy{2Iɗ\a+ִ;pg-)ksL;@d\b[ZC#KR$D%faYd݉y<6*.!E1 ي:F"k(hIA} Q+,m Jvwz7sqv[~<WD%x74(.b7|=bq&o/[Uo#Ǐs]|UEX Ul~>7/&[C^'y#. Ă=i0Q%Ĩ$roYbd*B ʢ=EٽOtZ Ua8vcK<sDHQ#q0F[x# /IrIrS%<)&&YirQǸ.;[3lK<+Ht~f@Z X> stream xcd`ab`dddw 641U~H3a!O/nn7 }=\19(3=DA#YS\GR17(391O7$#57QOL-Tа())///K-/JQ(,PJ-N-*KMQp+QKMUMB9)槤1000103012)ٽgf|;?̿ܥ;~3>,}} |g|Waq6;7<_s/wt\7Xp9yendstream endobj 91 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 1431 >> stream xmLSgo)΋#c{;%L7D1Ne:7FpɆ8ZVRkR޶@@E{k p7|.͹%4љ݇9sNN'`@ !mٳ2/#7KflB')i_EXL(M*uF^T/*\,NKO_"^lY8DJlXV"цBL[-^XUtieee,U)Z8E\)?42xJoT˵28[%i*MYj rX.KvbYz,*|nn vD$ /F#qt P>nO"BΎX++X^/.eAHw=H8KOߓ5Ilgt C3ޮoЪjvoPt =bB-pOT"]ӷ{ R7h4S=-C |T;yDSXwx=3iS(u )ƅ\,Z+2PSV7Z`&6ٽ6&n̠|"䌼,BZg<_OQ*L}uRjDtZP5y/ ;-]r\p8mT*Mjc3vF r4mFKOΞX\8;m&4AfDz=TQNl34@-Tku&0 ^DʠB!X/u PCCSc-{(7~ :*9Zjm8L%P"|~l(df)G8Ak?!@x&w2=-YdsԱarygv%uPwSs⟠Oؓ6Ⱀ:wu~{ސ=&=-1)Þ~9+pk݇FNN{d:mmҬ W\P `oXi;;[3Yo5&̔(5 43dսH>O^ʺyjs|t~ށ }.#zv{f9lY .EdThb8f\:676S|HCkAy j"#҉uV. nZ/LVGs<،ncl0K7p:zIOt~du>xL-OdLt#x{6;gebN䪎(3:dendstream endobj 92 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 6592 >> stream xY XS׶>1xأP9(U^vW\g':a_oǐj|D]y#aF6‡S8H𪂜L*㕒[gˬ-MGԥf}Rl?JnC0E$K_6 o8yae>g4<@K~`O2HvKs֥/3;ph4iyLVv⇯kI][C$VX)pEds* =Nr'}9wuy@OY3-i9Yl&G)OSeG5*(4 F+&@$vgwӬ*D I!h@M|1 ®Z?MԳ2]r(ad( yf "! P5vaw_#^VK˄-^&$ tK$5-Y 4&N:'M8r$Hk iԇE}VҏH/M!ԏMz=ɻ,#U%2Iiٌud>Fuuߘӵl$l|Ǜ6H4 ;bO˲ww((l{/NImZ rT\f`J 1zuپhtW60Xդ:9; IJkȘ` x$^ֺ8oV _ 3|n 7$8Bfmq/thLҀwа[]c1@بɐ-TYVZjm*g>kv sx`jML9BheR4R yG-1EQ@f&%)%jceo<.NI o$Kb45>N07d02 ?W\d*T @-M\7/Ub.lu†{U9WwQD*G{P_y8Ce\/ђtIeZ`tZc|+?G ja [10PMxtЛoFƵzCk>q8=z5F%//^ < <{:ȳ~ndC|ڼQ9NG $P⚶ DUf-H/"p 'ԙb춣Y}v.I,)6`0g!]BH R ۨlVP͔'Ӝ8y_³CyhzYqv=x05|@ӸZҤjUB5*h$ީu?:gvbJrNRr0%ko(uzDj|H@ml} ƅbdC9@;~_}?F)hANHe^WP/Adwu, );sg]WrNRcr]j'_ߏнJs.;RA:~"cAJU(`[rm (,3++x8S2)8֚,EJҗWpzx[@yO7`9Z5PP.WJ.ڢ<%;rb ?Qܩ6 !-9Se7I qѡ6X/rL &AGbd~ :_w^ ]p]o_A ? E?$> `O:Te񻷉BbstU{ LO6}\VNM?mCP励QLx`R%TA1d`-[\PճE&z~P[#]-܅5?!UO.aGXt%v]wYUm|㤳h`Lo`mz@|U E)[k0L ,3Yڤl=`N8.W$^̔ њ4elHzv>H&vǴ;ƽ;VYE?#W/fkmfpPˇuE?</]so!.&Ϭbs,Mc'JTו7]T7$˕zTf'J[[]u寀zhO]E2AA%"V.PdFHVZCLr8TV[z{˫sE )][:_$`xHep:0h[:ƀ~'o_n+sY|P jݩ•2["9V؉qRdk̦:c5k2ՀbT(i^m kxn۰> >D$aB=QW]]Ǡ14I/㇓={4g&]Li)e9jhF*ݺ #7U S8+g~e ZjTh՛@` bT4I`s$#, g-l\X-2E)jpjp&Ǧ #; $qf+# [YjO|a_ 1YSXߩ]o6TC4JvF5#njs1-=܅(h2eϋ@̶'[ G/AGW:|=>t壪z,ϲsxvoyvqkv?@MBȯwyg=%Wō>c>T8s{$ dM ;*/inTEЪq Af]/fwvо2T5ɮ㒰Բ^(w^x><'Xw;6x<˨ڙsC}N[ːd3QXf,t6}|F%mpr .笸 ׄkõa`&LSV[ ʁ1%E(Y4rB⣴ 4q}i9C"܃v>Ӑs6z4,CP i5BYeb*<).]pujQ)(d[d (U }w&M5 yrϹ.ރ#]X4wIXb#՚ ld#_>Z<[6\F]Ѩ 6G6dUVՙsܮḰؔ]잸MfJ1E$亖p@S%i_H&l ~9RRRػ:+u%tSt.]R#diP0(If00O7aQcb;&e `MJ+cMno~>.Jiy8{9'/??f`ZeE6H G4.@CRF#n,{bCDڐ|ާ NR!oF3pt2֗ N֮v{F:N'7ƣiGrVoVw JF`%&m@uZe7,_ع8#iO&RT)La!nUfДˈtڑbI+Oqt wNvx x)‹zcwf7OLZP^;8`+69~GW0WO}v^u;o0KPI lyIFU.U\ˤ@ 6Ip׿_qfyq=@հCFL D\/߾rE8΄.:d84lqo%N2hX>=9Z K_ P/J#ӪXH9-<3E`Yqnt}RMdTTLxLEfoOM;qsN qDZXY.Ud %.N;}aP naNW1ZomuI-( I&sFޠ-]d[VF2񳭷LwZ%6Kc,a߃͕m,* \x|eCut- nX <#L,wC~Wz=NGs2q2EKFEjCCyxtƆ_|n^tam,,y,)_lM+O@;cڰi-{}s8d֙5Gl;7ࡴ"#bSdbع`t\:]k)T8M`3"gqWbIOp?k*-feXd nj%Ddz$lp陛h4mkO]O)O'^[2a%]VW,40ǀNp?Ig*]$KrXX+ ?iHyC  op= f}O/ \ ځ)ȱhŰKޞ8OFFK`5%-[T1s+% VJ4ǁҊzfѳ>c{G>)/9Ery]ݮtgu {t%!Wcmendstream endobj 93 0 obj << /Filter /FlateDecode /Length 2179 >> stream xY[oE~*]~Ty@'MQ833{άDZ7(997?SO 1ibh \H$SǧVK=_L*1gV7ڄY杲Ɍ59+dXaK\fK7BŬR4ꋠw^WkPdW-P%qhkο$9H ޵CV\ T7媑ʈ0Vn1i/{]&X`ZX2Uuf [:;#8+4NsEm rZ Ai$p1p빮^EY*zda^;_NTu s`A8>*[0a oAzUjluKÇ0V.6(xUԽ@dV2);;>i2!\#knwTضSt'$]Ƙ3yV*1Űs(!U#XSkacExUgAYqVN-ja`T&0s96DAl\tP1rc(H=< Z'ߒŏZ9ttM:͓dPF͙~$brv4c\<a[¥ >lU]Q0&T kaՕXLPkcp9,E#nNRLk@jq͘jsń:/TbG`88ḀiŒ[`JYJ}[24f+E3N̾xX^@ 9?A?mu Lzq]Lt{|R?%5!Պ A6l5w:<()VŔ4ڷat"XJܾ7hNJ*&9Y,.0SNa1 =(I Q_Q@䖇YP6X"B-f@p#nigʓ٣BT5˼DH@ߦiB (yJ#A[KL {D]G'(!&i+[uq,ke8i8-is\ū(v V,)(e<9-VՁz HZ1 '(MuZemWT1@˄#"LiT@ی iv4N1C!"'gjhz\[h#Z{ٿ0GQߙڋo}B;>C8 d/-F fE2*q8zT܍yw$bխ q((۝SH8[qtr픘Ia~"Q`t da *B>e@F"]ݴTy񨬩X:NGՐ]H9](ܒn =*Bڲc(ޘ]P$mXy SPlh~K)3 h[N+D$6z3 iQ$꽦ӏN翐[.F ̈́Lmѽp{;GڏP$u9xZ %DULe)Vֈ'opX`f '@15KD_Z1γ۝=%˖ҍ ̇ʙqwVe]_-CBPn!]}V *;;,i[;,G8|k꿿sXaEs.ˤ z(|Tz}rvT~ !cYtHQ@z(>-Q$ߪ87qbORnnrTg(,ya G. e'AJV4=*qnɥ[1P 4 iG~( -9jlwpHyԣN#!C[7zFoI|ke?sm ;}Zfc ۲B:Rr g;{f;endstream endobj 94 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 2806 >> stream xV p^!K,`4p&!I#. [% ۺwN[FeY%`Psp%tHȐ@rHȿtt&$L;{DDB$ MX|ԁ 1 D!2騣O_‘hX$ JTY؉[b͚5sRSgUŮHSg)sGNljVR];qnZ]0{V;9-xr~Qkqb*uVlXYC(?On#!?@VŮP1j~^Eʼn̬UvN$KN$sD*H&bXD,&3rbDDBD(Q"aHš%Yˤ&[v'#D.Bh]_uˡ,C9>n&-p10:ё~E=9)ѯ m89=ˠH蝬쵽}a-Wkjri0nSN' H~|IЗojst@s̹]jR1_ kÝB+`zRs$l>uu搣Ým}n *jJJ7B޳yO=(u +<]E箣ż dHML8SX>+(ɑ E \n׃SG_7uG ZB夬Y d4GHtN#@ :hRFЄDS`YP%v@,=|"im^$)!DQ\w2sN=ti/02z0?RLWKhh*Re( RxE+W_S,xRLyi~ 4jk1wH>5~,˰f9-0,Rjn6)- g0~k8k=V7Wgu%Ҥ* -tƷHvhdn |]-֯Y[,/7nD'`#`aBQ0mo B½}eTtXH HUтg'7( tt? i[\5+zѪ`wD_y,tvoMc$ѯJhqF":Ԅ?>$B7p2$s:`62l&C; vXB.et֩WJu%:ͻFP|"?Q\ \B=Q d3YXZ<>g x ^8hέ=Puu2ټucBD(Z`# > v-_X)4%݄[Rno:B=CV&Y$gvV*J t:8;ϏJ,FeBc7TV1ܵGՂFxlĥenM%Z)Su@ܰNg\m)e@Y&o;zG(94lnj)c̶=Gڏy݂eشԶԂ@s]H":] WQ9t@M/$t.H^xƩ.[dn+4p'YA1mVpvSKet e;rm[dƒ"Hr2wd oěh`GgmF~uAC@7'ݓ`p|IKo`,:)s ܸ^AͲ^4^C;հFKqz J9sm&?փOv|,*Ꚋ&6ugdn)U)tnUk _l(Qr+U*$MD.&GCPC"UǕ\gkkWa97wnZC#W%ٺlJ4v\$3̒ 1MN>tB5 ?I/+X1@o^r_^]`3 +po:q윓sPa/ 7'DHě*kp,2~Z/ i^tw<4=Jp=s6S5䚁_{ep{i`tyo6 *Eb0z9eR2('_0<ˠcUrJr3}jk!P[א=2,B fk]ŒE~=`1h) !9ТŨ/,gg5::B <  vq }&dyDaCA D|}el]t\Z)wj8!)WRK_-ٙ|΍n#LBVWPԻ4Q.s蠊4*5m9k3A<\v: ,,u#?^~& gvIniG]fsrg{3L+ Y.F^G;]:f4.e2oH& GCFo(y% {5.E'4:_w 6B1> stream xcd`ab`ddtu14qT~H3a!֏Hnn? ~O+XX_PYQ`hii`d``ZXX('gT*hdX뗗%i(gd(((%*\c8)槤1000W100DGߏ˭g<wC{mSS P$<8ߕOZϸG3?DO1J3[og]l ?)﷿77vJVO#Cm8Bl| ~L`4߱wq}b1ù~O{*pendstream endobj 96 0 obj << /Filter /FlateDecode /Length 2226 >> stream xYoInG^Np"!$6~:w&=3S5;rW:UۙlLѳWans$g=R7K` N$-ώM5*4ƥYpI͖G[|CRb}3_,gS)m[8Jm.bR4΋+$5ƂCSJ{(GAps.FX+˯g9T@Bht:yӹMYF~o(I\:T4>f묹Jz>[c魻=l^cQq'^| - em>s136W[Km"8 @b&hIMg?;?߳(Wu N!t,e^y5'.[էFH wgJE[["D̫xc!;z?ߴffVAKb/6xb ,$#gZ!]7jeҠ6wUP 5J\7]BA XPF|%wsq38Tbq[y#fiS#)ەlK̂y l?hcT$Fu_|%kոgJYe|q뫖RJY3AA͔y2Fm9r>xW7Y43l@?He|V/ɯe=D&9\{"ŚB+[tޙ UM7eT'KPfQZ;,ّ 8 ؾ+ey/TDmxX0g GsqZ`ޮ!%UcY`?L~:0ͶحS1qT^ٚn+ Q/MhzhcȘ;vVf6̡h5<TZGxSYw^CjgKZ]2 * o Ne톸-. yI)Å'# ^@56خh 8MzJޕo]qs\uO`'  0uM3L2|YnSzC-_-ZPxk|txYE^t' ׽szkR3է"ry@a~KEuOp Fm%i3"%ʠkU}>%IpD)ΞȀnxlU㲽0iIPmUqgdڮBu tB$86M\`nPDډ:/?`CwCKa?k?z=R8pH.W'a}y:Z؟p>ɶ_s؞^-}ǎ84S"7D&rUeJ"|؏O7UiK"s")~#z?NNٶɶ""?V㸮DZq^扗d'Tϫ,'Uj`ȿ⇌W?rA5RH~{LOdGTkU?W]s U0X_MoV d0|%yQ"ⴸA2͛:ͺb[]vdl:}kZ2 d[?ŝŻ۩Zf M/ ψd=4Utwp [;" tϚ2`QϽ#ǧa|mL>[=5SFI=lҚþLXcxv_-sd0{|՞w=[ϘTDgkseU09$Ŷ6CHD~V=F^, ?T;Tendstream endobj 97 0 obj << /Filter /FlateDecode /Length 2063 >> stream xYIs[E\A2P2ISB,//pY~Ȳ-%1EqOOO_/v1 {'`d$y (me9vqih@g νעUǹdÕ:x+c Vd<^5"X*'?D<§`]&YirZ%6˷&MAgC8;jg{=vXpt2{U9!Q}vEp,'ta%+^fH#e';BOO+* b$Ư(͹ :WЊ {:Xgg$67ne$\in "1A[{.Jg)a^9#fM*2can̽Co*3"s1+XKD'T?.^R]p)o6- %'(j~( L^D7 eףtdX r|i(=B* MeF]X${l$xJ^CO-EjA+108Y1] 2q ڠ=p@# c\DJ֖(2khxMи|‹fgi`B r^ƾFC \}7Z^-JCWhCi^s\thB{SKF4_JkLAS~](_H)m:Ctq#ssxr'~!Dm R㈏n*ig/ട`P^},8S. ГN!dS_ 148(B D`OA#zNJTJzeZ{x~ĐAK~@9ydDʼYSy3W!ay}U/w~K&Ht:@h'BUI!١t)pl-ge_>…CJGFc##->yH[f'Q\,WǸz/&2 ';W/x#t<ҤQU?[ˎ t Qh\Ň7֠n'jm-b!6(*MUTB n6ۍ>V̫#ݳ@V75&iL)m׀3+{gDQ )H-P~S,UzW}[7QP$Y 3NG"xO&6PSҝXJ)(&ֺG[NEx9Ч<tn+Gq=zwKyTUnY=*t| 0?4Q8C ĝ *N`R(+!OQL8'cmZ}U$um87ւkn*9Q7Ms5 DZiכD~;c=wh{7! EG~ȏ-]*݄SUJxw yBm=whgN᭪p~[h˯ x? ~ܵendstream endobj 98 0 obj << /Filter /FlateDecode /Length 3125 >> stream x[on ]ֆGH{wE\P%ƶr<PʊdE>xB IQ?XG,KgGϾ#68GzS`Fj<t#m-Ymk/M13Jjz6[kTO (-cU% V^Zq#NjSanay渌x500fca`o]؏IUuz vx90:Z;p,s<Eu'r]ϠU.V%SQAJO ,nU-c"@юDT_7z]1QYhͤzwF LvpMa&pȚ{9YDOI-້빮GZ*oha\:0:vF%8XpRT!Քn4:;jR2ZX4 8ƘQ 0lݪg`R7"X:aJ - lYhX#rU2 DNcګƺ9 -I;gY۰$3`t3gc|eWǺ m+E($Ft!` o2[\ 6m(Et2IP8F۪nsHojM;ۼ ,, 1L c7A uu֖Mgj&-OǘY&\dvL0(wK*{vMUc6IUa] Ȅ洑rMߔaK+!. Cț5`8ρ]v\ 0WT"d'h򢱤6Pk"zLt)pӅ[[頸[U\d*$z`Y t+|Lz1͜ʨn4‚dfTzrb\@::/anUmhEgLMPN>}^IѮRtE&2rt;<ǣdNŅ/-/fA= B/V㸍ڦz2*{"(SZ!  %-.zeA*6!6$j(ȰYtb`#ԨGy*u&o29u&3IeRVCdV"dDuxTxۙD_:948fDuwv+A!TЈo %,ئЏ kqIEP` Le]%vp$s\o]gǡW<9mMlE&o3ySB {q0IP& h!7:pP~uT47t8h "/|bZE=o8EuPSrA#1S=l:rw(_bo6QvEcj6*.pmYtʾ2;)"O˒ D I\+(-ު[>7 ̛վD !j\+w];Tͣ(z$7y1T*Lp`j3Çbv>En Ս7&\1 e%2>ZEjB($ˤ"GyFML&y&}&2iFϣ -#I癔x=b PGLLJWN"m]솠TuDp6OWpwM:T*;%|6I 6O*D`sCzTm,ʠ>+Ib>B$ $nX![R9H{ +g6cEʯƂ rMb1=~4RkRuYàu|$(HCN!G8^ F"(Dt )3K`KGbUTTSڬefa$?aNSRiۺA994TL=_ 9;ڢLI2@`"CUCu;#@_ }`*a` Uq T IҽȎ.jHR4֨ja6WWy \YJ;JXָ~y/uLɾRy@k_Ǔ_ؑLg$EvJn1%-$C܉~C4jf'zpY!FuR2Y1Nuw!{I  LޑҶ^і|A[Σ/Zd@晬39 /=>bNȯPqC"pG* #CF^ +r=d3oTx|.$E^ qmߞM [Y7KN&/udcB;0b{OĠVaH }縈R.R=C\ $.?S: |5}q2Os3ժZrѾ<,Ʌ0yu?0$Q?$}1O=ۚ={3F!=H\9vX{O)#*>GG퉼5SD*﷞ȣoZeD}}zW_8[Wendstream endobj 99 0 obj << /Filter /FlateDecode /Length 2253 >> stream xZKo7 »Q469A)Al٭l9~%ί\̮q\)g^Y,k?}܎#6^^xod3Qǎz<=Uf2 hZhvLI杲59+d5e1, . 3)@ōоZLj)E㝮~qu5j$[+^N$9H _׊[;\ i+7tk-·Z88{X-c2HIlh9HC)A@"e"$Aj H@6FqTO&fГ/*G|HE"ʅEljO& RLm(O|+JfL5{e5z(3[bTR˴lZ0&MmŠ)rNK i!t5'3W2(2`/7 ;¡j.8ؤ\6)70R C(Zo>G!߱f /y鿧حm/"\!CxYΠdl@!S\Vc`Rٛ@^ǡ4|7N^ )<]S`~_^jd\^ KF %3H`"Zy8dYԩu;+Lh)1:(kBrޫ@$DA3 8ljp\7'&x_Hclc Dbzi9b$aElMab}(, ڪVǘDCn, vֲ.4]NMiWQ^+Nodq@}ѻ?$vvP 7.GkyJnAdҫ{Jk]yacN$jڼ qVX,-FlLԽ8M[s:I!`u$0Pffa$O}"7k`Q`pY`WHL*jЃk.Nu@`:R 5vqފsXN%:zlQak {a vǘݎ#BQ*q2: x 7/mzsQ d뭄u)L[ Z )k6U~LqǺ) mQ&6I15c{Z}BISh2 HJ>tO/&T7ʲ7j'p1aX0?G 6DM$1ŮSl8+Q6nwhGC/.{J$#LI\'q f9m\x$Pnzv?SG&A l;% -5`L䗗AkТaV=4U*; ⦰y:Qrhi*@TO@kC'4/Z ID=X m9VIGQ~"a`O[ Dl4V* IC۔voQ+7*wKaRU5LB%r(\.pi!&S2[9/yi;wQ"1F{$H/~S?mk%܍c!-ò{ WzZȗ ODoq`Mf"$i}GǸ\ƺȂ\tcԫڨWNjΔm<]HG}XI~0V&ImWQF_E[s'!endstream endobj 100 0 obj << /Filter /FlateDecode /Length 2783 >> stream x[Yo~'#:QHb%R FR$^R_a-yHfjz~ZD>\{ҏvkb??ۇ?Oa"Z)GJZ8QpuUpƆjx|mc0x4t<„  :YmS6V;iA[W9Lb gڰzB;kF?NjOWOc% ak ; "I%PRU8q8B ?ӿVZ$NkO!a$MSiD𣉶up. |]=)lczWAVL,H+_&dS{[ka+ meԣRB5j`Q$ڀBhdu fF3I<1Ά`fYIc,Bf[Nw.ͽ@MFgosVfAB'We{cZx;{7r}KZ]⡉GZ䪾p6ar,N*\5,tO YF]yqMs6&M($VsRj6/SB6Ӥ)\8[!Fg}Uw:a=t"]!*x+siL$Nt>;ܖy- V)Jc؆F c$Ol1ߡ;/DۺIDTNzQ7$ҀIQ@P>*ʱn $z43=LUhhqy]ʨ3;PAL.8_G樶3$'.jy 80"(@žI#YF@%)6@U `RC]Ӻ߆,S޴є#+ Ng8'$xL/rBcڞJ/dRKʼn#46WXl(YuqL;WpsvېmHn[P@A.#1U'Xhl>blӋH:oK۰-[85$[($l#`*(cEⓉITN ըmWRb.H>aYIJRڼJ Z_>GП|3$Ar3V/bE2T4^-\@a%-_94#h+>^^Ѐc DK.8LpBլ$9gJzFa 6oџhǃpɉ;2NӒv~s2>s$wRު"HJbCiC'Sd68arӔy gL>i&$4WNz]BݑN篫b_vC^l atEMy. NZ v?Kv &NnVs&R l,u W{փPD[ E*CS~h^r ƾ5 ΧhAI1`}(h pv ZPxҽ`qRJwfFؿ31IȿYP\e`w] `oč@4|L>>M uZ o,}Mv $בlR_.  { ;q|l)D( B1*E?7->`A_oaUС6e c/o7ӍEajnfK/Kס*aw&iok`QݿH w-f̬ܧricU]vC|FĹ/( $8=| TBj{a1[_;W Goq Mv v]uD_n=|,I||$'ތy(Ef&2]'?^endstream endobj 101 0 obj << /Filter /FlateDecode /Length 1754 >> stream xX[oSG~V^na;>TBJumR%1ġ 3{M Xzvvofϻ!oĐv4 W>0 xpzv!3 'Gߨ+}Oיذc2dFcpڱň7Mar;e)ƳX)x0A\7lz*B lJ*WjL{Jleɽ%CY(b C ;N7N2 X < ^; ^p] VB# WN:0hkV c+ sy,@5«X*ͥM"8°QVfϋv[{ H6]p@Upwdzat2BkmNF!0h8G7BԸcwbr\i,pexaeuPƲYONG+F*H/xW`e=m]o g'$6o(˲c\emz* v$nW* D 8DŽy5͚jmO;(›JpF (,"f9fײjk<Ňv8#%'Jcrt^)L\]5KX ?_}Nj@0+1u|t$h/ RWwpK᥶s JtfF-1=&lvƥ[pLdz嬽!5+$K^^e&!rXY^hw/Cst?Gb`$(!^$?#cnH)He.Q ^ꚶ&8^PxݶdXp rYQ1^܍ݺW徍ѷrkd?Kn($|K()I|DKѺ%vZ1Miq$06X<$1uAIuI֬5MuA@CĐS^ۉ@C|ȐMt(ǩ"IcI$E;N '0lp1m^8# ӢҨ6{e\FΌRQ<2>i6{B; veVhAu:?-v&U*~/Kw,LLrUUWuuxl7ɓۗ;F`|$`bUxDI]WBӉ @~E6] *P(vSU0_# oBMzr==+Ξ඀t+-'sd}Z?b/9 $.b[;T)O_x,NI:8~:3#aՇfq41BoBQ|x5Y$e.tw'u<N@MQUº/b]oXct7_h2?nA&oM}u]yu= ~ſtXendstream endobj 102 0 obj << /Filter /FlateDecode /Length 1861 >> stream xXmo5~XEBR!P)H\ˮg/\~ș6dmNޜLN -'3tW:=47%4l'o-')3J;6=mw. r[]2` ОԆexMygQN0x6[8K{QxiiٱeD?sO@ᦇyeU4Ψbt+T'hmJ9c!{{O<#hk.,x+SZI+Zd^6_N*G0{FN;`#7@u N I::SlFIX X|FK n8GX[(&J* PQ` ګ"^X:az9 )аG8qW<JqJ hڰ,wΌ>=. `aKnp2gb|2쏘W<Ǻ"Y] %z)Z>l!wwUy'~\%q81wqf[b2zEΗe)tAE 3D&G=$+{s4 aHK8O9zU\K;>/ 4/fWu1yYbNMn"w,ױHPde0ÇegC2K}܀K\=8f^ҙ@"7GX;v!ouJtSk}pi^ )DlW O~dXoMMD"bN!GՄΗa&6ph*#fѷ*3B8tM,7UYNnpyQPI8:[Mu ZV %>>F,Dxvx i#Jɑ8H͈<]J>.i`ݹ{o;MldH?8MECƣ:4]^qmV8.S^<|j#b93>-mY݋5xCq9 Y>/&WDaY+AaR<;@LQZI-S5j3 dUoFܸ$ w(<{@Wm7,{]Ym(fW\U8fn: x>M-ωbýcp=z\VsYɧFy߯:,w9bCH/yVU5Τ8hax!<[l E $iܡ>$8|"ʡCCOTWز:e2䪠QUzޔU}p./-p&῿ɃPendstream endobj 103 0 obj << /Filter /FlateDecode /Length 2076 >> stream xYo ~?8%{w5c}hq.@&Hϒl,NJ.'FZzopȏ9ws\E _W̗fu'#̃ ]2n5N7/T64g y64/{4縬A{囷(Zڥ5Fw)括 T6Pۥigug6{wCFns^mēָ.z_ <LJ b>{Tt-[ Jm.Qv달mS0 35`-DA2V Z'?ϛ KT!kl,V9% W@sRo\LEv/FuԬ: #iG\>vjrʚnwrRʧFΚ '%XxF5'3,lLDQ - CGIQZ:GJy(YHɻtcLDՔ່x;g)[u 0~0 IE/.}-uM48(SR.TOH!BXhӚ¡0`ezhpQ²8%DOPDMˤdfGy aL|J'ps*7 G`5ߖ&s742B!; zE_Εd~:v\s뇁|g`ۋ:I ݰ 3V^h-'͇&}D#p2ryE♷btDI mnفPݯjC.]F#3 rպǣçVM-ߓĿxBU?:F-`r҉QLQz/l:Ib,&a97WiؕGj0`PJf?lCfDQ<+i\24gK8@rO ~{}IV|\a|EFňL)M":hdɰ'0giun+7xWEF?ud5'HZd\=DMC~@1yZLgSA& !@d`- t>B2 6]&7=qMP/ƽ|cRZY~P)x)OޒzlRx>]f&a*H\}֗ٝ?Zx#TTXRd-6T?}k#nA'#9FuB X&.H\\Í)yg 9 yhxvљ0K,{a¤lmO^'+8$,vYY}&Ac"پU0hcRul`ў5(x`ct-İڼ3Rā4v`0Xbc#~^6ڽ߇F0iuu/Ar1tendstream endobj 104 0 obj << /Filter /FlateDecode /Length 160 >> stream x31ӳP0P02U06P06W05WH1230!U`hhT027`I'O.}O_T.pJ.}2.}g %hj,`cﭠ q)+jtQP[&6o_?5^ap`rTB-endstream endobj 105 0 obj << /Filter /FlateDecode /Length 160 >> stream x]O1 y@*uKVUc"D7ҡY:ߝ|x%I cikDfǢU`ķBW^@$:UZFg] 6R L:չPXqp8I.~r 6/=Seendstream endobj 106 0 obj << /Filter /FlateDecode /Length 2574 >> stream xZ[o~#5W~i.ܸ4] ,%Y-RV%G\3elOdzsfgn$+5O0z}} GS N$MO'HPF*7^JGo]':T.E+W1 R8UFc!8`vIdq^,ʱ %΋aYymtb>KΊǍ)ϊW&γ(. X|2س'K+@J઄.&-ӿW^5VfNR GVzE&ګ*8WEKE7%mNF%fśZ0& .fi*jtBe$ADNK휨*ph :FHEZ̊< \gFump}RLQWQZSD΀@ART>$į eM3T.tyau^t:yЇ5ȷ]@BΊ.ٚ bn$bGOЗUV)=(,R,?n?%pOMnh/Bg'):ݳM8#j &KniNk0W̎WX|$ƅ)yDUBY״(gsBQS'$/nj0` [#{5>[R \"B;տ2U9INNWbKɎrBcZs$H$Yk:yCGj6eC 4e6[%m-$i d"lQWF-U1ͥVIHFA2^Q^X0*V RP!k^<*omSMqRS.q:H2mKܿ~up;8 Br9!ݿΕ#nȩ팻/ֻ.ޗ$mklLB6ŭ eZZKs/( #Cܢ yFk%WAlt"r5唐2+){Q,I!it˞0:Cm++8/䰖z9Jb*:oaRoH_ |;s7W-DnRZ5Oam_/`m3@9S*r^Tu>\leChMFAx𒧕`B7Nr֤,K^Em3yybZetU?q)HݐٮJNE$#4 f݇wZ`"Nރ1@oRIIoߖx}Y֣*Q^@x!lM 4(pв0M+cbMډ.qvi`nWK씾I\ɸhVwC2T7QYOj(yiD_O1߶g0àЅOXOA%_Y "vdKJjj~_ل#m=ta처QMcP[ZP6>D*Y[\nY'?(&-w5~בQ_?~-i O~ppSUwYj=@UFC'@Ũ|].&{ 'ǼN7/oQ#D v3Vh~#gt {zNL&R-;1BYad{_֫?RXe_!E!\u3 obdHvfԷEzJBCZVV <XF^H+W:zM!JEx}bY [VeI*E]$FBqQ7{u$ c}Xkgm -/E]ņZ$.vNܱMkꯁzTFY |z\W9v e%w\[بqr{Mjy6bԱ*SڰM:jI%B70="q`I,䇲у'X6{\K;lZd"K1 {Kw[*] D6B]#|V%>aO6ܲz6b傂S /՟`Cx=Ǩ:XP K8Cxpɺx쇙?}tX--ldw3Ա= i,FN:&^~#$Bp2HVB3$kȿR҆RՃ{_?6ȖD`0[Bn^Sٽ"*a o"DoD [n+{*)U!vP!!Uf?}dfTq_?lHDȇ+wW$%-%~(sQ(_lv^A >7)=T2j.K.5?3v?,^?P< =@v-dtłr)L{ƋY&vMMlݜ1c{nWxendstream endobj 107 0 obj << /Filter /FlateDecode /Length 2208 >> stream xZYsE~ׯ~aa"T%qA<PNb_O1rKQ|}͔31}t>⹛ZND?N_GsVXAL/'N1bcA|R 9 2 `\0?jxU'3,Njq-\T,V҄լVJMue>jq "B"4gpe=&A=%z^2eԻ]q~*4SʸInĴVykTAߨ^jTǹ9`Õ::x+Q+gH8CdFpCZ*5J|748 Lup!hQ]ãb"! jl =,z\z`ڙVXxo? `VbQ8w ^,×%e3;?>gHVDYp7PZMp4x1kz.SP r -䕐mx % t@KIˆmrp\uUm|@ޗ9$pO\ X+|A|;d-.kԘR>0/c^͠sl. ctA5'ۨa\H z$k6!eJHQXgR _f6C${:#+m]]^^,B:W5.0߇`W ="q$6ͣ]dVn-d 'Y)i= gGQ! ], !Ҏw  '4i/6XswNc^%}'ʖ2:mX 8I g2𒄿UHkZ |&Z :QFѾ-bG9=C`W͛RTc$pdrexŰ$_pm1u곁ޏliWPCm(2vDnkӆj E7+.]I4Q7^^㢛AoijZ Ü.t\|:T_j ;\¾VmU^Lw!drY.Ifa_", &^Tja\h)-~ >!2 y!= *C Tx¦[ڠ3u`} >hJD'۔vbo 탒Qu.CaAv Ć6$run>Q\bo{A8,HT2F*wr#2%0ǡlLkHY1&D@ՔyZ֑U@V?Gb%Ev4i8͑ Z_`N-XkthpI!P_q'%,,k7X6>"]|2 Ldiuh}]KnA'dGb}X%>fpBRI/|m6kwF&Z%8piچ@^ >.}R {Hʮ;84Cza𾮇txwJQO^Kc/$i>~)$z[мb!oCC澺+[f _ +,Q.y0uIE' L" ]<UuNBO [79Ptm R>m*j=&[JA5^ 9m/xIQ'#tU;(~#VW3j~j ~#s'9(EHْ q$Gȑϡ&$SO )@͒.K# 6}!6]mCX7doΠ%Rs.Oi~~>ۿ3e-!qPUŶ ESow)d$,x˸wxH0.)'?@endstream endobj 108 0 obj << /Filter /FlateDecode /Length 1746 >> stream xYn$5}#^pö X@+!,CnL6@6_OnWO؛ԣ"R̲/i[N?NXl wf2t}V(An[=uXT)B~Hݦ, Ub/ MOS{|F |(Hju'f9>*%SQO_j$:2i( *<4"z|l7B"p4gGR݇C tUzziϗjqT"qY¼V1@,\P(\Vݭ#-R&7E5βҫU\-gP@{DhKluS0au 1⣼XU~{y "Y *ˉˆAD<TFW˓{%O%UltoBj(b[DuWASQy> stream xY[S7~#"^괜ߍ>TPB ABJ IRm6K>OpU>x<7!aO{=ÓO8l~M(Wj= ǃVK=/ h' vPsиa<-*FJM,t;k/ K'P_#6lSs JX2)]#idbgA a]xa* 7ⱜcxV MxY0F'Ą.`#HګTv1(F{-;.S;<, i*Հ y3``YQ[U29VkmjTC"ON)XlJ &/G0!]/ŢG/ L¸Q:ŽOgY pהI\qJ/ 7)HuocnQR._'n@vwe#M2 (V9o\S^ZyР@K,;) 1 [ᙛ^ QRxotp&vK[,sm/io}2P>Io¼+q JL >A[%Tst)UqnoZR\hpX3%|OP.|x4yϯÓ-x{fR}Նʹ@/yi}K`ii5J:<OF8ks3h6$v݌v7α~$Jpp5 :qi> g]iskvYnMa"o,I.7Ɲ)9fsq6x{Tip礕OSZ'($^{ҭ͙<'Wlxo.$gX8-bqOGO)="mV>}oθH1Oi1zCP]a؃VpRiN3 JX \NlP6* R\L}-W)5`v~'RHzt}!/ߕ{/eb?9*g ofY#V 93q{#e k|;*G #oqvΥ@sa>! Fy#h+ϻWbl xz Ҁl5Ied8Mo%S4/&TkuO . ^ţbP 6,ʓu Z(]M?SzJєښeHBl}+L/zJ9uͰh[Hi8H ,$tӦ{}7YU{Fu/^~iQ`&o{ck > stream xW[o[E~V_=';{߈"(Q\H0v&v뙽su=@q-.PAx<<0/a*vRնROg#C;ҎjZa;b뫦RtUSYΕck\;/ئ1 fUrr;[Nf7)N*#J+ tNi+u Gq=8vql/P\ZayV!Piu'fR@h8;LִsmSOr+e+7I^FNv ՆsYi'.uE?eniX[ܤ%~TI!4H/hNS_*o y {c7}*K~Ly3f^ Zl3VHsZf#\]iE.US+ 1@{^^U&>1,`|S؅HkYFK‚1TD0r͂QI?u/Q(R˽Vg`# EN)UxR8fҾ%j i[H%4WB&.9z'L'D~HzD] p.pv&fY|[ĘS=2_hZJDn!d~;5\Feze4nG(V.g )jԈWqcZGl8%]^SkrUpZhxIAY"[g|,Z`,W"Nj @o-ߞ %)M;Wҁ;A{+C|OS w>'\ӊ$NnZ7Jc'$} ЀI|d@fPUE<.".ZP(4x x|*st>mm7FSi]E崈W~GnMJ!Pm%wKh(4KU(58c{B3*`?t0?ܮV|IP"]䁣jeJ̴RH>ry] (fU {F~Q?y-1_ƔFf kSlÇF}Gj,ڐgɰyI˴,7Y- bTQ=)) {7[͛fv#w-> 0)Aa~0R}w˞vF qfW-Ftt2}Y\}W kj4uQ9/YaذKP:((ܧwCPU8,"T<+H!d=Ҡ>d`-yzxK]Mb% :yn,G"vED.* ui{}7! ɦӪ|vsUnfEYq5Vԁ9(TEH+1UOxUuWE[Q[ks_o8KCfC(ާ}V`Ǥr¨԰Q T-;3t;RZG&7+gendstream endobj 111 0 obj << /Filter /FlateDecode /Length 2174 >> stream xYKo#D.i&qW;s,>a(ZV Q+Q~TͨGzkz}Uͽ[2n_|B./w nڠ(<颌|(_2[EmU)$X`sF|Xe'c0^Ws2x";$+t[1V|ʲ61xuDhC i6(=ɀ:O}ux[*ŅN߬0A3o'1Fh H)]0RʙڇrO/v|;oY:(WՃNVE'rHe:A S%%v%> R92#)~U@)m4s:CpOO >ΕJN!q9c+ow2$qJ&>BJ,lB0,5.୯+ F>s88Y^u][Nb^9!wc]$ޓxEnՂdMɜ^|^)ġTs Aw:2 igMvꖥ<joar7*v? J}e¤uW+ ~t 21sr!CqѴ^61De(`7Y˩:uXW Qh5ऐv %#ioMPXyfEx{4`@󇕵)!ϺNkC8u:q3| 5%:6X&E8?aIn ˷*nRɆw$>pYb,CAGp}2ogži lzx”ZAv8qZn&-V{l; 5+%6+/s9/82n0珛oFGoM*3oKCeR;N7ХbGf%#'0C,8.aVrm48d'tk5lka-WE1Y^lEFLtQڹȍ(U3vUz=`PKo%Џ:peTek1}Otc0_zpghɎ͹3vҼp$3'R(F 1F8M) `q82N;4c~?st_@g:sn7wt?\*q{g2~&+?KWMu@=&;<H),:.a0tDM (cS? & нj5oI5\ ^M8{靭m޺w`>繯*s_UYy; }ل$uf`> stream xWMoE[ q~N (WBM9$g[ۉ 腿kY7r|>ԝt68vWFw#]솏aDM.Gz袏&щWҤ|gD!9Xckqhq`<,b!Yļ I( *Ŵ7mwٞ;q0xQmnF$fYJRQ-FxOw% X1Zdp9бEi' &MDӍ),y"`dRɈe~`ּRXq]’א#nRb XoTJ-ݫ||VUc&ucc13k_*CcNc5bm0h9NlD>MKZQf\t^"m.jN,![ӵ"QZ w|Qqad;*} 41lPVW %ږ*Wv 妿jVM1%M^&_c]?utJ\Sl'xApN)Z:yAvײO& $8_[N[_$Ȯ{m%6Gx?<e3,,h& /da5c͂v@n2e{ք "xa4qTA4^ v%mb:'kDp@XWˉ8[/FP}ei m88RR+͞p8H<~p3zbZ7H%:4HT$2b?DdĀ2)Ȉ!ɈHFa`:D heg)::OKt ?d Eҝ[R>ޯ}?*ApKAX=)Tf1B Vm헣+$sڔ2pLJ;^ѬaA6 ^?˅N #; . BYpeʏb0|:Io͔V j*#eLuc彚[o7(6?(e*1]>!Zyi*LL&:;)ݔ[2/=m3gL/K{kaw%{gx&(ٗU9 ef'\7;9^7IFV;c}̗uӱzAM LѿGendstream endobj 113 0 obj << /Type /XRef /Length 133 /Filter /FlateDecode /DecodeParms << /Columns 5 /Predictor 12 >> /W [ 1 3 1 ] /Info 3 0 R /Root 2 0 R /Size 114 /ID [<9278fa4ca916b3dc20db95d607d31ed9><6dac7f44a99efb8c66d7222cb4ac60b1>] >> stream xcb&F~0 $8J[?w B RdR "H`Y)yDH&noٚ ]LfD\ ]jdH`'@$ endstream endobj startxref 76474 %%EOF zoo/inst/doc/zoo-read.R0000644000175400001440000002444712501555040014651 0ustar zeileisusers### R code from vignette source 'zoo-read.Rnw' ################################################### ### code chunk number 1: preliminaries ################################################### library("zoo") library("chron") Sys.setenv(TZ = "GMT") ################################################### ### code chunk number 2: ex1a ################################################### Lines <- " time latitude longitude altitude distance heartrate 1277648884 0.304048 -0.793819 260 0.000000 94 1277648885 0.304056 -0.793772 262 4.307615 95 1277648894 0.304075 -0.793544 263 25.237911 103 1277648902 0.304064 -0.793387 256 40.042988 115 " z <- read.zoo(text = Lines, header = TRUE) z ################################################### ### code chunk number 3: ex2a ################################################### DF <- structure(list( Time = structure(1:5, .Label = c("7:10:03 AM", "7:10:36 AM", "7:11:07 AM", "7:11:48 AM", "7:12:25 AM"), class = "factor"), Bid = c(6118.5, 6118.5, 6119.5, 6119, 6119), Offer = c(6119.5, 6119.5, 6119.5, 6120, 6119.5)), .Names = c("Time", "Bid", "Offer"), row.names = c(NA, -5L), class = "data.frame") DF ################################################### ### code chunk number 4: ex2b ################################################### z <- read.zoo(DF, FUN = function(x) times(as.chron(paste("1970-01-01", x), format = "%Y-%m-%d %H:%M:%S %p"))) z ################################################### ### code chunk number 5: ex3 ################################################### Lines <- " Date;Time;Close 01/09/2009;10:00;56567 01/09/2009;10:05;56463 01/09/2009;10:10;56370 01/09/2009;16:45;55771 01/09/2009;16:50;55823 01/09/2009;16:55;55814 02/09/2009;10:00;55626 02/09/2009;10:05;55723 02/09/2009;10:10;55659 02/09/2009;16:45;55742 02/09/2009;16:50;55717 02/09/2009;16:55;55385 " f <- function(x) times(paste(x, 0, sep = ":")) z <- read.zoo(text = Lines, header = TRUE, sep = ";", split = 1, index = 2, FUN = f) colnames(z) <- sub("X(..).(..).(....)", "\\3-\\2-\\1", colnames(z)) z ################################################### ### code chunk number 6: ex4 ################################################### Lines <- " Date Time O H L C 1/2/2005 17:05 1.3546 1.3553 1.3546 1.35495 1/2/2005 17:10 1.3553 1.3556 1.3549 1.35525 1/2/2005 17:15 1.3556 1.35565 1.35515 1.3553 1/2/2005 17:25 1.355 1.3556 1.355 1.3555 1/2/2005 17:30 1.3556 1.3564 1.35535 1.3563 " f <- function(d, t) as.chron(paste(as.Date(chron(d)), t)) z <- read.zoo(text = Lines, header = TRUE, index = 1:2, FUN = f) z ################################################### ### code chunk number 7: ex5 ################################################### Lines <- " views number timestamp day time 1 views 910401 1246192687 Sun 6/28/2009 12:38 2 views 921537 1246278917 Mon 6/29/2009 12:35 3 views 934280 1246365403 Tue 6/30/2009 12:36 4 views 986463 1246888699 Mon 7/6/2009 13:58 5 views 995002 1246970243 Tue 7/7/2009 12:37 6 views 1005211 1247079398 Wed 7/8/2009 18:56 7 views 1011144 1247135553 Thu 7/9/2009 10:32 8 views 1026765 1247308591 Sat 7/11/2009 10:36 9 views 1036856 1247436951 Sun 7/12/2009 22:15 10 views 1040909 1247481564 Mon 7/13/2009 10:39 11 views 1057337 1247568387 Tue 7/14/2009 10:46 12 views 1066999 1247665787 Wed 7/15/2009 13:49 13 views 1077726 1247778752 Thu 7/16/2009 21:12 14 views 1083059 1247845413 Fri 7/17/2009 15:43 15 views 1083059 1247845824 Fri 7/17/2009 18:45 16 views 1089529 1247914194 Sat 7/18/2009 10:49 " cl <- c("NULL", "numeric", "character")[c(1, 1, 2, 2, 1, 3, 1)] cn <- c(NA, NA, "views", "number", NA, NA, NA) z <- read.zoo(text = Lines, skip = 1, col.names = cn, colClasses = cl, index = 3, format = "%m/%d/%Y", aggregate = function(x) tail(x, 1)) z ################################################### ### code chunk number 8: ex5a ################################################### (z45 <- z[format(time(z), "%w") %in% 4:5,]) ################################################### ### code chunk number 9: ex5b ################################################### z45[!duplicated(format(time(z45), "%U"), fromLast = TRUE), ] ################################################### ### code chunk number 10: ex5c ################################################### g <- seq(start(z), end(z), by = "day") z.filled <- na.locf(z, xout = g) ################################################### ### code chunk number 11: ex5e ################################################### z.filled[format(time(z.filled), "%w") == "5", ] ################################################### ### code chunk number 12: ex6 ################################################### Lines <- " Date,Time,Open,High,Low,Close,Up,Down 05.02.2001,00:30,421.20,421.20,421.20,421.20,11,0 05.02.2001,01:30,421.20,421.40,421.20,421.40,7,0 05.02.2001,02:00,421.30,421.30,421.30,421.30,0,5" ################################################### ### code chunk number 13: ex6a ################################################### f <- function(d, t) chron(d, paste(t, "00", sep = ":"), format = c("m.d.y", "h:m:s")) z <- read.zoo(text = Lines, sep = ",", header = TRUE, index = 1:2, FUN = f) z ################################################### ### code chunk number 14: ex6b ################################################### f2 <- function(d, t) as.chron(paste(d, t), format = "%d.%m.%Y %H:%M") z2 <- read.zoo(text = Lines, sep = ",", header = TRUE, index = 1:2, FUN = f2) z2 ################################################### ### code chunk number 15: ex6c ################################################### z3 <- read.zoo(text = Lines, sep = ",", header = TRUE, index = 1:2, tz = "", format = "%d.%m.%Y %H:%M") z3 ################################################### ### code chunk number 16: ex7 ################################################### Lines <- "Date Time V2 V3 V4 V5 2010-10-15 13:43:54 73.8 73.8 73.8 73.8 2010-10-15 13:44:15 73.8 73.8 73.8 73.8 2010-10-15 13:45:51 73.8 73.8 73.8 73.8 2010-10-15 13:46:21 73.8 73.8 73.8 73.8 2010-10-15 13:47:27 73.8 73.8 73.8 73.8 2010-10-15 13:47:54 73.8 73.8 73.8 73.8 2010-10-15 13:49:51 73.7 73.7 73.7 73.7 " z <- read.zoo(text = Lines, header = TRUE, index = 1:2, tz = "") z ################################################### ### code chunk number 17: ex8 ################################################### Lines <- " 13/10/2010 A 23 13/10/2010 B 12 13/10/2010 C 124 14/10/2010 A 43 14/10/2010 B 54 14/10/2010 C 65 15/10/2010 A 43 15/10/2010 B N.A. 15/10/2010 C 65 " z <- read.zoo(text = Lines, na.strings = "N.A.", format = "%d/%m/%Y", split = 2) z ################################################### ### code chunk number 18: ex9 ################################################### Lines <- ' "","Fish_ID","Date","R2sqrt" "1",1646,2006-08-18 08:48:59,0 "2",1646,2006-08-18 09:53:20,100 ' z <- read.zoo(text = Lines, header = TRUE, sep = ",", colClasses = c("NULL", "NULL", "character", "numeric"), FUN = as.chron) z z2 <- read.zoo(text = Lines, header = TRUE, sep = ",", colClasses = c("NULL", "NULL", "character", "numeric"), tz = "") z2 ################################################### ### code chunk number 19: ex10 ################################################### Lines <- " iteration Datetime VIC1 NSW1 SA1 QLD1 1 1 2011-01-01 00:30 5482.09 7670.81 2316.22 5465.13 2 1 2011-01-01 01:00 5178.33 7474.04 2130.30 5218.61 3 1 2011-01-01 01:30 4975.51 7163.73 2042.39 5058.19 4 1 2011-01-01 02:00 5295.36 6850.14 1940.19 4897.96 5 1 2011-01-01 02:30 5042.64 6587.94 1836.19 4749.05 6 1 2011-01-01 03:00 4799.89 6388.51 1786.32 4672.92 " z <- read.zoo(text = Lines, skip = 1, index = 3:4, FUN = paste, FUN2 = as.chron) z z2 <- read.zoo(text = Lines, skip = 1, index = 3:4, tz = "") z2 ################################################### ### code chunk number 20: ex11 ################################################### DF <- structure(list( Date = structure(c(14609, 14638, 14640, 14666, 14668, 14699, 14729, 14757, 14759, 14760), class = "Date"), A = c(4.9, 5.1, 5, 4.8, 4.7, 5.3, 5.2, 5.4, NA, 4.6), B = c(18.4, 17.7, NA, NA, 18.3, 19.4, 19.7, NA, NA, 18.1), C = c(32.6, NA, 32.8, NA, 33.7, 32.4, 33.6, NA, 34.5, NA), D = c(77, NA, 78.7, NA, 79, 77.8, 79, 81.7, NA, NA)), .Names = c("Date", "A", "B", "C", "D"), row.names = c(NA, -10L), class = "data.frame") DF z <- read.zoo(DF) na.locf(z)[!duplicated(as.yearmon(time(z)), fromLast = TRUE)] ################################################### ### code chunk number 21: ex12 ################################################### Lines <- " 2009-10-07 0.009378 2009-10-19 0.014790 2009-10-23 -0.005946 2009-10-23 0.009096 2009-11-08 0.004189 2009-11-10 -0.004592 2009-11-17 0.009397 2009-11-24 0.003411 2009-12-02 0.003300 2010-01-15 0.010873 2010-01-20 0.010712 2010-01-20 0.022237 " z <- read.zoo(text = Lines, aggregate = function(x) tail(x, 1)) z ################################################### ### code chunk number 22: ex13 ################################################### Lines <- " timestamp,time-step-index,value 2009-11-23 15:58:21,23301,800 2009-11-23 15:58:29,23309,950 " z <- read.zoo(text = Lines, header = TRUE, sep = ",", tz = "") z z2 <- read.zoo(text = Lines, header = TRUE, sep = ",", FUN = as.chron) z2 ################################################### ### code chunk number 23: ex14 ################################################### Lines <- " Date Time Value 01/23/2000 10:12:15 12.12 01/24/2000 11:10:00 15.00 " z <- read.zoo(text = Lines, header = TRUE, index = 1:2, FUN = chron) z ################################################### ### code chunk number 24: ex15 ################################################### Lines <- " Year Qtr1 Qtr2 Qtr3 Qtr4 1992 566 443 329 341 1993 344 212 133 112 1994 252 252 199 207 " za <- read.zoo(text = Lines, header = TRUE) za zq <- zooreg(as.vector(t(za)), start = yearqtr(start(za)), freq = 4) zq ################################################### ### code chunk number 25: further (eval = FALSE) ################################################### ## filenames <- dir(pattern = "csv$") ## z <- read.zoo(filenames, header = TRUE, sep = ",", fixed = FALSE) zoo/inst/doc/zoo.pdf0000644000175400001440000071627612501555050014321 0ustar zeileisusers%PDF-1.5 % 1 0 obj << /Type /ObjStm /Length 4312 /Filter /FlateDecode /N 80 /First 662 >> stream x\[s۶~?o=%q٧3;n$4gZLV\IN-(RvhY(4  Z "gY4R2ô2gss< ÙP£C!n2fG5IׅcsWx7ѹ7,V^b:HW/53I& 3$heǬ3',ʁ9(gN˔dJ2t>(t1)1.5SyeqXM b R(\}\qxD-.,7@ₘ.LaKFCg-+\aAbPP8 8eQx Z=ZY "6N0 :\KgQ O.lRm"t0}1l+e+sSR|NT&I+~o2.hy,E&Wfc 9r;!Sr{5'Cn/dQM@](p4x:Lz- `j;%Dzeqt MYhsuhy@C0@}Ϻr1,^ p-s̓jX*O/<$0ԛ68lFY='d/O:r2I *IA%!$x*eoK~&6^Ҥ46nvIȆh٠%>ufn x(bN99]@\wIm*FNgC?  "Ȏ:: G0˹ n⬺5+J QM 6bFTEd4) #]ȦI6 &ڤ. G\j%OP.6iyة7WMHxNဧ)R^`mU^W2W3T\NGg4A_ f4G"!>gDcudCtԷIHg4\\E~q?g>?}ac.nC FL@@3ѺhL;TW} åIނ(؝HR?-}~I&Pj QIY)ʧ~yP>+|Y*_gyyQ)e9,CaT~,ʫoI9*u9)M9+墼-?_?Dێ~ t ! Gi>?> DOh\!|00z9v 8=ܛ|B@t4CD&-'M=j`.sBy~ub)uwݡvvmOCgz83i߯*N񫟏ǻNI{;ks.V%Ux盍Y>ٞjYP"T&Rbb\+b Ҩ'Iҙ5OņG?C/$|V}I*F/$&a`7l4FW`8їr>̯`2YUhQ| O'5dA-kBg uf˧PшNcRt|v8|OQNIAMuݾG(b^Be,мQ3Ev@TD6Ce'"D4؂I-BnYCZ 0, s{儸:sH R#"LGliJ0sW D:s"Y~ .fue`uB5w@q555Iq*(驡.= 4Dnt'[2]m1W;C-E4"/-JY8/cl$BO=$Q2I~EQ\ tavm+4||h^XgwIQ^\\d/LG2K_(@BP\$\&Y](0VEAG B`vh r@"ʅ"FF:E0?OߏТA]l) \ePk.#ǟ|4fROzbC#/o5pa{ҔYMK[[g/^b-XJæAU]{z EKrؕ\gx]?~ZuZ[%]l;\2n[8D_qG$ g"n>xϗwsʵ!i7C_cJH33>׫}0q=ne0:iL)"h/9wJR/֒ iD`;+kJr?Mximtt- -%ܹn0m%)C1qQ?8)Xzu旡Zrw1,kViw7$+(9&(sv4#V6aJyYh$/~)L{D!1Q JO ]n]f[O :i% < 0MC~r ʹW$=C-OLj^(.X/1V.tZ@DD *BDy^peiVVMg/wDU~F{l}6=2)kT&@RK׎)W_AF|mX/,8Vo|9h[3}}Rhqmђ'] 9M6Vc .iIskI#چ@C`> stream 2015-03-16T14:27:01+01:00 2015-03-16T14:27:01+01:00 David M. Jones CMB10 endstream endobj 83 0 obj << /Type /ObjStm /Length 2196 /Filter /FlateDecode /N 80 /First 696 >> stream xZ[o7~_]!yx'P%nSE*g4EyH$Gc.vF C֙sxwTrB R6* qDF,NމL6"A>VPr^101/ c#%a,L8ZD ŲX' <`х "  NƲ`6;,HX#"4aod@X~d pa:; @~"be>pyO "Nxc1x xZf$;vx,s&@P o Ny{A~3(X&9`I&Tr$B(w a&E] x (PvPy Ĉ䍈ᭈb@^"gFxAY !т9H-H D`Ƿ u4Ζ {QAtYMq_r<OƓ _خx֙m jhQ XBW_p} !ڂw5ZGV͍#*=۸_mwMnolru?^:C@=1UeHO0˛Tgs4["Af#$H)QK5juQ͎T߮]> E~[voi%$>Oئ$˹NuR4ߜ(4XQ&ӌ1nuQU~]oR-?z{.C.FW/mu6[i*{5x;MlOwb<Y5w)w}3ȃVRk5zhpfVpzݖч`oڠ[g(Z+VF>O ckc ; {r>|n~w?J匟J:{)R]o'+x/fF2=LVz+ Ev/[O'T}jFRU jjn7ΟiBmkgPE6• W[ P 6V߉t-샛C*Olbӧ Ojvk܍\->7&IDendstream endobj 164 0 obj << /Type /ObjStm /Length 2828 /Filter /FlateDecode /N 78 /First 695 >> stream xZrF}߯S\[J"Ƶ7` & -CRlRQݧ{2sY6?Sħգ۩#WA/n#J3ϝPd싂R PX$8@r'W?7ch٠?ƠT`hxrRiA[=ro EL7AQ" =yթ.~{Oa Wyv7QnC>T8զT G{P$VPnI 9e._F ݏۆpԘ_W")MyQH7TwZI 㨑:ǃkPZ*N[0iJ3`#롦́К@rAt"roi.ڀBȍU@)jd(? SV`76>IMk, #,IM-$7/dOߏ̈́FS[FjwfmvwfvUv{Q*t4N7*lhTt6ƴPg'ܘ>d }\ }e٣i6u6N3sYyv,gʪE]fu̖b5U>(Ոvla!?䟴~ *j\3WX&|OMH@& i;jkӆ}FTuj{{5sEKgiry4Ƚ@N(pEqzuqØHϟ}3Z&}o>lңNϤ JjuhJ :8ހuniq^a-!>ĎP^ÿ?kb?^ټ!j6 ^mF]fC5kGثf[m,7NooCu9~׺s|-900;A!$Fsh__L [R)u;gGJf;9.Bd@ULw}4hѡQc^IU]!?+efo?[F1EaX1riim3D=NFu&EvKW{0a:֘sJ(U(P aKᅱrnT09n]/OvEmK_K"EoڬVBP(ی(B) 􅊴7 *}FcfsY,iVhN%yJD=YyUbTw^ o[Avܬ9a)q:oլzv ~?y9kGӋr_Ȅ參 7 w(qb >JYhH Nguy;|v?51|Jpk4cqZ7?YZW>I徧nc̟Jݫ?lendstream endobj 243 0 obj << /Filter /FlateDecode /Length 7851 >> stream x]Isu##:vM垩c,9H|h1 4$ 2 PS˷|o?763/{?97P&sf/ߨ0iŷD?%&h5Qm^~LJIi^r& olw<ٔGoYi˫q& )l\~s_fi;%D*0cso N`OG|y1&6mܾ6lq (apೞuykF,'Za)5RV*e6{8r1twmVm %_ºkz ys*t!bdQFF[ \6{M>.wFqb#߾nOGʡdx=TK1-݈Ǵ\  -R ~ӛ21PqG aAfKI2 ]UF`owBk&L͸݋\*i=h˼7<\yK[y K-=v hr쒋QYhvQNQ9LSt& 0#kx ^$vՖ剚W̵)={kVLS`F@Z0/6~ˌ0QAj:} T{ WZc?sQ72m ~LmQxq |fE zl\8xjݤ KC] L6@dNO$,&b5;'mdI a-SϦ`P"TUQds۷w}PY%x Tߑ 5MEqz/޼\Xs)IQoy l w T/=r^RRʶU(/zhNrު-L3zH}9pKj O΋s@061ZRnȰs@*0ȇ|p6k&9 SV~ ¥~!q`˫Bt@6r+B2DePdvq(e"%ee5s 0׶4CIm}OR?no{Ү8`6}U,P>t"ORvd{֝lVߑ{?ֺu `P^ȁ\PʃT 23 G@e|5[P\2B ;.ym[&@wRݔ4&ov3Zbq==eD\Dono~1dkQr:lyfYn8r@)*@G eMrS6G,1~SS=wIM:6n3YBgM EV"xi'E:ZH/t A00 QXAedH:UkD#}ҙ-l3^-:Y+1]z) N`4"z[\D8R`sgN : 1Y7w5ۂ#KH]Uk8I '~hDKzlWNS便:63Gz=e^R"º*:ЇƤ#bv'V`G0, яI1JV`S6J'?[/Iީ(b1ڢm8?ykQc"6 ]GېfU3K8" kb⽓+Xx*Mw&}VF-@]1bB™%z?kjt#Xf!n^O=¦~Q#DC꜀st+^Z%yLVȖQ>o %A_i6la_ӳx QkJojDNY1-)Ή/:}`X+iD87kXMTD5\JHVla;Lm$j몶6!iL5$ jz .4%|~T,*U 9vAO؃~Ct,)0X\!bJgLH CmZ~ d1*1,q,Sb2 (μzAMóBf|fDTMQXM"\8iZ!(yϺcK6oT釙 S ou Nә' d(`m̐k1KҺC}ndAfzW$`h1dMɻ22; ,v!)'9vS =ߒScfXɝ}~qɖYr)OKXcaX  9k ct,WsQa!p f=Y-.0OXZ,)e*v o4ra1IN283+fdìYL 򪕓Guu2TTys܂l)Tj&@7b*ELeTڴA1q/8!C#qoQumZnͨLuVu$,4bQ^ᣢش-]6\QJS5Z$GPdaBY\#L[oRxweXQlPNUa ju_ܻo˕:+@x) U9KՀF RP/߉_nv {-jOi}]Аd"{Sfv?VE<x0!k^V'8h!8Ϥt`6T]q"_<6kBP6ǟZ"_tPqlAUC-CaA6ȎZF^:+mX5~VMwH1cˬ7֜vũ"{pCSQmGk^ekkiq1uk~%'<6#e fBS3Sݪ*:P? 6iB+%|3R8_GYBvo.N `"МZ"O<8՝G SdP5K)h\A {¥𧗄5Z4R޶DDŽV~sjTkILCUg.qԏ@zz?=lAD@5aJ5=^/Ëb́j̥;c[{@ UZIq%@wyS&*Olϣ&#pZwdT:_5@׆R}h*kb+`P%r+ǷH!\#UpXEFJʮNqrj ¥yKOs.uX'WU.Q Sf e)?jJcT$"ǵM.Oz ft;dze{=}'x¹ `fQz:f-B 12i6^ [VY&e^՚&3b(߄6669’`1ª5ߜdvU饄5j)Sss8l9W|h(#OOsQW,x J| oZnɝ|nq5Ab*@KU.qӖmpLk? bϯBrYSz8j8}O9eE6,ݫ6CSRwf|]Obz  Gw J|;Ps+:}fܑbJNw%f)@٭EoB/iAan+Tb&P7+,͟w u:VuNl +E]* =aI *Ph- Z o-ܴ lPiad J*WS?_Iŝ-KZ1W1u_-DĜgB'8!QV|`ؒ'4?'N3agYa^ 7Py5ZsBrj`󌡴r{e֟8O)3+hׅӺvV e@QHɈJo(W'ͯv6/"b 7(9g@'kJ,IIuqvЋ`gN^įG<8xhzKM9 Gn˧rI*7|B=nc˕}X?թJ2PDˢϬ$hrqF+%~Y CSi<4V;!Q+oz5:%eDHDyԇDfxIff}بOG]7yN)POSW{b^(P*'7 kQ(E-])_:9)J8GOCbܮ'8Rws l\k1!O DWA FmdZHR3oHɰup9+ҿ[7OjOzV|K0Hb٭+"KKypR,,\ک3P'~:wKK6eIѼml4|S.u`ȫجĆ{KHlja(éIП:&}^{o?v כ[H#Y$DʇX |lQ_i.jJBxA6iМkT`*X:m5 &k6@ǴU\λh_4SOS.n65oZMk^/Z8EHt%Fp:>?ŝ@Dk /v%VpգCpx'"VF4!fn҉㋜h *uTqp|Qf(x_VZ1)_/BF屩>x}ƫlcq!Gi{wC0謢ۃb&J1nx-0N&%>&F-w @j!Rx'Ck5[/y(Qbf[h_~Ɗz2Ψa.fgL# /TYƇrV  "$2OeM4Sq0B쬓@Ť*6a}P+L⃯b% 'Bh߷'5Қt"-faՕٯ8s]^Ԍ1e=Fbc)Osە ms]vPpX&TUrR!"lӏP̬6+h0Y^3fpdXL6~)\rtb}s>nck$|C7X CΣ+#j+{ lMpE+im"'k]P#"_u`W(_8rCzנR!T29a}<(īQ0#{f<{uQ'mh W1-TˬDq}`G^#dM¨ށǫ=kH=&!@?͔ E>v cPp鋠!ŕ5k_gxġ3f0;=>6,GLWE(J^#׭z`ѓ#?'}t,),M1:27ʧ%`$LaIf.RSvYf_mMpw RH[v"Z.ݦCN)b%QbRJ!G_ed]XOeƲ]\%s 2Yx˥r;%sA#F_BM*T͒*CLG)ع75ㅬ}ÝMM|{̦s\$k_,LW6oI Q,Ofܾ9_vYU>+s+LKsP_(]/TPȟF.pߔ\w`GhMF~cHv%Zk--FDAfFXoXYa6ڡ)Me˵6$4fIw11Oρ?S]ǫ,5;ŌR)/Z%# N7 ٖTVNb.Qtף|9[% Әx0"INF41Jʙԟ?Aؾ_ Ϛ]\=x)Sl'wqEoC`Rwk;CD擀u> stream x][s7v~Gaʜm܁}l.T;U-[ȤdI9ttcHQNՖjus ٴ7g_yoB86<=]9Dpg_bΞ|ƯlRH7vlY_6fxճv_Lx~Y&.?_xy[% ڷޛR޹τ dKڽwqɆi 9 ݁&';'YJqw]wha?м D |eʻGȿ}3M =_'G8S#Njr1x5y%gϓw#M5''; !L/S%>{ M1pGO|w.i nsoChRL%[ow yw^¢xU,~a yv>Ȭqs$BX 1=#/4g|J&>-wAFd\m{<fd'^2Zx /pӔն  +xөt9LZ;B.%D y{&lR8o`H5jy-1A2{jq́8/։#H8ny͍; Fo\uzy.w >v ׳~73^\9 ]$Xv1d'bV` [inU4D]ܳy99;eSޟ ÀKwuSOjOS>(mȾ2 U!'(J6 涂]dmր9c7{+oA;Y0f4,O8 ,~qAM0'xp].w-}vSf\zRzqˤ]Oe▶NeiVѥVAIm/qVSw؀wt ڲ]س 5)pAH[y9|[!#f˾)Ix?oS8v )֗R! gf |c*dfQ,`T7>wn"=@.\uOW&mb ^xHcшveI }@ur^}M9.S׻uZTz< K p(pQsrKΥa('6GKb7z 0 ! A{߄ч,f^zSLWlo1<Т-)`}?o1XaSM=[uD'?%W1

0ͷ@:VRŔ'Fz5`"ur N?3`Xz>3tbq>Efl;Z|cnxh<9Z߁Nb!^xj(z@.psS J=s-2.2z #SmA')V-0t=rW؜5;id>A {M>,!t`Ra]7/㲀BghEv93$dsۡY~^~)-)'+ՑKzXut;aUFڭC#{XFarRzb}f&'矄L/ԇ}~'5鴁&Z]`^܅Vulgfkyj@1fǮ &D00sM֐]p\ `#c3x. T jNIfpdU_MZq2I|e- }6XREc M#@2o, +Qb:w1Yygќ'9FG/?A/|m.d[z<",jl[oSFc-)6-BlZqQ*(ur3 &͆klIR"1mi"c$",ԙCU22 ~[|@p2G1߼ Fс!5E><8€iDo'0d26mVdV8!0d#GjeŞuu 5n#mLplCH4Bb9?pFonG7 j,M<T΂`_J@xb`'n&W-}}L*Q̆7ۋ"7+`CC~6^Fkܞ@^Xtt\6*w:A}\Q_o^jdIjrϟt% k2 i\mM%tZu[dR ܑ {kv"?.eҸPՠbUeY ̪*҃! @cβ}ߡ E8kLv7f I R7^lj !:amXr79'?t\ޯ9,֌ .Fǡp@ he:otXV¾ۦm`AxǙ|BZmhNN1.-/Gy%9EgpES1.e,!8[anf"pa=%G@R[P/PƽJw>Tǁi) ]Eф(][VB4o:*ij#`&&,dޓM2MN]x *P"6Bpy@4Ld ClJUR&.gfM#:l+Nj>dB6k;{"\Jj󒒁%XmiIّ$;M}a#;9 @xLp@j$0MK8.$J%?aJeNX0 BJh NXm[R 9YekHÑO|2#ȴHV/RegE%e8erQYFAOo6"w|յ'L応˹~} 9BtJ%~"d|S[ tXYC}R:%<1m}^l tYP&?\ 3<(, WDDBZ U׮i9lv-̆I1f!@:pk)B;N0ZZ]4 bGQvpʗ2(DQ_# +IvwK@}Fs*$dVO!7+9f9nXxizB9GPU`K\ܯUv;>ceOQL<%< ݽZ9nJn2oj3Ncyfs6)bz٧sYK z>7__/Re,yW?>+WC8u8Cyj,٬FJ7)3Wu!2D} m/QD^4_гW0mxRWJ$rqY?q&?>h {4/L^o>}o_(⊌l(DUۅ6gyxzyȒ6I\_S tG'!z}OO'l6xױv'Jz>ű1x<6,=2GqO1bθҹV3ڰ7K+ȡ;I>\Ӧ D9D.-f32tX/0lw]h3~Bp9Pc7VȀ,g#Rw.$e"hQ+=3H8P[PY()R"5;Tl (ek}؆35bLRIm!p(*m$[lȜJC׻_-TrR/l $)i"bl RvI9P/ ǜwנE\XeWQi,!AuDKzoro0-epXRI*iv/JaNXx Nzr_]|BXC(: }>mKU#}N&nu"I ءS 8E}ְOJ9>ן{\puaŇ _ٔuc>:\v3jtk*zZ \<4aKF}'0u,b b*y#cDf;5l6 i[Vv0WԈ|.UA~,"{}X{p'G)s[O҂RTJ=7&)*r \O=htPp.tMXXjtͤ/ˇitѶC; {oǑ1MDU3j K5e=!9ަQj6lDQ .,6pC:x|:{Ϟw'#tI?v :=XG=GիHx`._O Y`젫PhMm0pE+'J`POm0GG7 F{ʿ6ѯ5*ҵ6}hG~-עg: ^H6m QcQI&Pޟ`( 6ٓ_tyj$`*=vN5-!|tqtU|`._O,x'E'Oj~rQ%t&K >:~׽W]ҘyTh̃,`F#*cV9YJ!q#*1]2|wb ԥl, <̚i됇Y5c:!wIinbS}...]#$]lGUU7`$ޓOtLa% ѳĽj;N(-P,53_Z~X3pv0%4-aÙAM^pym-, RDlLr_8,|)U‰A;b-L.xWL^b zG0 ǝହy5KHEX|G`dHj`y)~YR&ـe\AݿC A c;Ր]5v?M'6E-{c28ejn0Ǣ_R"cOlmD5^ ޘ1$V4Mm =˥xScQ{O;Q"{,=_4C DqMlcj)9_?vt=[v¬׳GVCVOvRt&#`34o(BYFIaO+2?4q$!Ӑehtx" AK.?{hKrYKTޯ @y,E뚺at҂{px-Z͟fsq$xd||4(ڝVָ>DfhOx4L@G/.{?)([E.k$$t&܁۽:> stream x=nd7r~DO݁N Aefw4O]xlnifbPGd,ֽ8Ոwb\^|PUgK5|Ҙ悇UT[]]o7:צA/.m1%A /i`K7[k?#R:KrvC0vf &ĵOeSXZz8d6FXbGϸ)h_?mp^ÞҺv @L[gF|> >{eTJ_qQVrGkZj :zCD3ǁ!<.4Zf~i 4~m䯣Ф%^@)ze`|`w.wt!l:5r]:LC.sb7D44.O/}v@ǀ5FѿvG˄FkFܽlRo58$@øw|Pz+dzԲh3FDsOQMJ:ӅѮL\E1:ĚHHGe (ַm@ v<ǰ%b-wp)zgp2;A6IUi37[}pBVm%y3&1IfΌjL*5gJx۸J$qiXXut(VRfZ@:Tan$18!Yg5IŝX8p.|4| gG}pWAߗbb6,mRſw7 N9ɯdmuj 䱍1/;&ؗ3KN ĩ<&D(Yo%;Z2$(P";ɛׂI q@R#G^pb2]2]&ga'((W|Nv0He50y_@|P"l1< ,X ,fiK =@(ơHbVriz6 ׼oGGo]h)< mK0\BL 4B20&ڙ-0q6c1>'fȾ|~Fۋx[D Gb>xdg70w2$=6( D+&UՔ'@UOghX0 hZ3sS.LxfVW@PRdKL]cFl蘐\D=IVj2n R+m\XjC#1Җ`-Cͦg8^` `+c?bBT^F}*dT΂Q$/ 8t:iLZ[:Vx@as&{gI䚀G^^94PC8K鑼`-BJ,x Q q2̺ѱuAڷ"'$& _D3C$_xTiOA ~Y 4v{? >gSf6.#37bBEҽͽ:H&c|,Eႚ{;tMgJm.,2D}I5̪b֮vIlY:]]&RpQJ[0 ͺ! |5QG= 5'6Y^Ea`e8еpÊ#Hּ~dk.ru)(a/ ~1:J. U]^UK?c4`` JVTl*&o[`u](m!&}&9 #)'m6(@hC+}9o:1&^t\.#!I)Y-F.rlfhuEҘt%n8 vgt9٩0n6$_RSGIT8rާ9 #zbh7ӂrIF m\LLNȽQSO f9Ms!cLu皌t"Wyu~M@yd>|oPץy98$0 e=l3^ȝ9&7"D{:GMHP 1uQ᷈䙼zPN^4K4O S)Մ%"crF(~uBVICΚ̯Lg`NMfb۫4e.Z]EeѰB0ߖN}WE[q`#7 :XKs_礍(t `H;m1*c[VaK(&OMt\?βAO\ nj#Xաˡ ctm.bQMmQDqj"! [T(o"ΙtqF NJC,4hsU)} 3VGPv#BαB"3GH3 ,,]wC\d8b}C|M5yY2{p%tr !kx*q?AcLh)*nL8eCؚ2.T{a.Ez_Nv*vxC &qUs{Xb.)RWS|Az _4KsSۡ@s(kQ.՜/5xULYܙ\M0hCh8Ρ%:ǫq)+ qT4 sXyI\Hk~WklXݕQH^#B|Pʞ9B(p_{](*J/l}Y:YM)b`Vm/: iJ Qzj,,&;{aqB\&WSսmu%Չ4ϐ2ս8™We$ RbY x;aYM:5F_Qz9T7puxSEӹA_5 O1h)qzn pSyN 0ɴrQ-V57ofƓobg XY*"2\>+cXML T¼׍( [E&|YͥP-t\IIFvyF ^`ɦ)mԐ>2?o2qegNwU @0B+Ӯ\Mls5I'2<pST ̐++/0F_^_qz[f#V^|G7*ToѢ!~|'6 :aHӁY,>yrPք%‚$^xz6sp;V*Nʇ|P̡yJosPh< Sl~~ִwm)|.u¶`+%@΀+CoEl/KDь)3z}ȑwM7HY(<"!CXk*4X?g]0i+OB',U63hsOqL]cF {W2."+c-_<{}R<ѳtw؛sg'HҬO_|IRN]˰\sD1Z@/~.8} ˎTpgS}p8ݦ*M8S#F~kP풋 zJj5I}ݯAGd_Es fv;Bi &Rwx0/-S'2jp6 ߧҴ]t}0ߝ-v;֘CGVI( W KWWs` )MqhuN6JkZ %|t 8MqYN ѭ.4^cOae- ^zU \%V`FVxJ8$- ʭ}K7>-*`T؏$~Od_o2L,.US1db4|SST%m%P#=fJ_9S\ =>%gw))q>Fn3@6P<,$0'tRF C[r7nGF\׮$DL4S}~|(Ҽ-,N8Iש#([(Ƃ{^`}̷9A89 _1M)d|fݱ-^q_Ks2nZUaPoJ;M ;7XKs_ϥ?3L'}_uhnOpdeHD)YݾR@tb₆0fy6U?$QW 6#d^74Gf5}pyzG_!P'_me :p}͐\2.#o+bnpcs>5~o 09/fXt%< eRm::?=?[">$`_ѨtJ^ı H'K;֬iғ[X#ʢ !jv]qWt+1e7W'Į2m%m+ڕXsOKp^UuO ayG[ t.I\Pˈ~晢8bJ$Nb`]o2_/N+3QgWV2_xoZ@ޤy%Wx8 efad0 '_AA,)0"gDYcEc _HͳV7rOhU=iP@B Je9J'ˁEj1}+hPm|*C#{ưJ *0:Îqޖ/Jv]O#Vh&endstream endobj 246 0 obj << /Filter /FlateDecode /Length 6986 >> stream x=˒q0SC]ZIvHvHKpg;q*$Ш!EٱŠQ@"LߟY+L_}_@ϜU/^<㜭?q}6{ N^nFgū?M?jV9nom 4ſ㷱Y(F|9;)esn۝6Ɏv,ɍR&|k *L;wJ&h[k`Z7+90]a=! XZto? Zcnv+|rKꜧ(ew P 9L/vI9; MRf: "t1짏]D- a [BWNƕnK :ˊ;/Clyi:0[:Cu"2QD%b9asyRæfT*OTiw:?jWMOi .={O' '拡PzA``eg+ < y 2Q d(Lς:a`.0En| 0-LlΎdcJ#k: 6hX@UG;"BbXCm6؏究͟ ;ELg kBl;kd mO0yǪfY!E r9hܑΥ݂ [*k4g֠"Ii 0&+Rt$%?ZIE)lPMD"ND7 pftj0lSL 拶 ?c:%c1W$xi_l8YY{S7U6d~5"1#sMF~VuEVJwGZQX45J>?Gj )/Ë4;fˌ:t |IpZ"JRc|䇗lv=Ckᘠ4Ɂ#+ [6^r }'mb9tj6~c?ƃvau/6𲝣 S:5H"X^{bZmV (8¼̙ FrnHƼ#eS\c"lYݱ*P|Αh;p Wݱ{jSM>#\ ~Z=k8lt 2N݃5}WJ(J9'^ԓ8َRM24>5 ӝ7vGZ|'oңbsl I R78{-m~L[]]Xwum^6ojXZ= /|5䇽k"QW_jO`FТO S<hA0%?c5ڑM]aWgPrhOY-W`T6]mp7b\xRWHRQڌcĬM[`pɡቈZe0rU4€?sm"I!(dL^tLyJzz!#o,牞4w, pasK组}:nL` hqaFܸlXWW^T`1'wV^Y;|+o LC?\ A 6TNlZ3-hꊐ;ے+^ltlG"ÛVyp.{ L!Xl/ދJ~_ @мZc-y0|كW1{ ~ ˼"#L R`Kx( )|^͒g1Ȕ0-)/G74:z >'Dw2O˺L% %Y= $}OK);ރMZFu ^ YX]bW=`,M?]clɅ=ID@܉qldbH./AСgA@lK| 3~anaM(R,YDl: 9Q@z@0紐[H첦-{4Gq%g8%ejNbb#1(ו$E ыl$6^} @,!g`>_,.s. @%栒C2Y^1DGч# rY kL|$$;pIئ) >lz @-&+Y)~NDa|e o)a1/48zъ " Ѡ]d)PpWm~ s0 Ē2{4#dR%D4ٺ{äo jT{\V&둆 Z[!.ij:pj%%UiDX>y%"&vW\bKޢM Jlͺ^'N0%KB:ծ520F@$O4u9>؄EnW VGںQ5(N>yjT"#i5O]IzV9ݐ3v.5zѱ!uϊ!gXi.=Mr` ?GH.iJ>JM4pFJ<3 'Q )2]@ʁЃAFJvk"PjK{`.ɮ !m**pu~Qd-Qx¨…fjm\ʧsAP h"bڪ#! .T$S lPT, it{^,ߙM&m՟ JgZeCE.jn2%rsfz}'4+r!Sh5T[&,-z(,D[ f%`nĶHC,H8;CydFgM"ſw+>~#q"'j:W 4jEU ZEҍttjr)(cl>\>)$3cWl뵳@R~cQ? Q-9Ĵҕ,c/Ð;zOB\;^ة'Fm~SeI`9)Nf*P9,־ w{ ީQy#vy@^sos j{ msup^&1l0T9jm{-SMlm4xHb6Z 0JV#(1  \FpKwҨ_pكk²Bdc6e{ϡ]he~s@d H7p Ϸ0![Լf* E τ)؃ " gEVKq /Q2x?,ݧ`8 lv2E<ȁdzY!Eto+5f4}hm-DU zXF^*.C9n!1,qj"H_'\p4RNgAUlU#ZJQeߟT@7:_G)My$TkBk6ź?DqphUGAn[P23.> ~ƭ 9IѼ)QoQ(70?ņ;W$Fig-)0hj𸈲4(3ؠR>ܖx(22weNVIMtۊl\4jZ85]p:zש,I1 U9tm\}>?SSnDMz[=uRO`C6t֔kZn'9ЦO18Wmdw<9V+g l\dq[j76 o vBH8KldŮȁ Rs&Kx2,`pPcݨݶl@71FS,)p(ظY+1P@c۹(5S=ݧM,?٭ie-5""M|f4ڈrZ')Le6wÀ?FjdiƝuE3%E_6/ZVϪ@ c{ aA,ɿJ(5+qb\ԝ|ĄbUM~k56Q4=t;u\.Jm(Gn0֘۫jTiRRlEof#笙Q)$LlTlKN1ė G@;é N{Fڀh}봂=.Z99Yԁg>:K%qT[(ZܵDCYs`[ z[g#Շ`fT;MeˣoMHr eO3"t:I#L9)og1dipu}VD10d A|nnk&ZPt(XJTbR0$ulc2%7#4}a Vg>Vd1']ug)g)[hCf ]{ /b#68۽cf'c𝭃shI#6r!"IuLP~q^Y%~܍_q Y&D1**j8p[;ÖQǂX,XziTt+/:ljjgda7Mxnm-r*,pWl؋2fKuKx3,^XFhVҨExjx3TЏܙbZ*o$7-0 3 J+4Gut1dHmF4^YЃxvơke2WxyCbS':P섌'$.:DJ1߸q܋'-xWV(MZ57Ӥ%?Ԋe +44?$!9+ a;N-#GF1)"3LAiTm,Zr޷5+ x#07BlΘyH\PGyL\5 ;̶dahy{p UBި4oGH7MN[ Qi=\5{Y_J =ڛ0晅j%Z[{/~C ?wTVy6F)$|Ox 5j \TG'1S'}NRyGrJQ\<мsL< {c|#Lo5|$T%|B'aMQu7.·5+pC1sO82_@%_ bpY١:am]٘e1qMW/6A> 5q 8ٌKa _9JFNGU?ApvQPe"Ջw%1 G6`L?C mh-k]LUL 鋋!/Lsu]~H[K]DQFٔ0nbio"ȰaæbkjweLp;j#I]Eo,֦\?5- /Lf_}mM5pIaj[= 1BD t,6*ۺק<}j^.OΜY.64I6K-5>惶-~ڣ]}oWjVuFiz1.q#\Wjr@d7,5J ie4)Uxt3>=5[o?ڼik#sg7xH<+rhkS>s$ҺaUe QR/ţU@8Um~5l~3lcWC=T'V8.J?}m;ZxE<*D!^9͏÷ ձ)|^r/{G0b }7)UB1d[pP?1Y#2='~}f|m={Co89 >a^mm!ӜCp&ocE+̢b+p \ҥZ< @Ę"D#(O&J/]2ږ?nd7M8!hטPŧ 閑rwWw W'vLLReֲ v`3\lCq.L]?- e̜k*/;&byLlF >QkҎir+>Hf&zw lt,P +pbjvT 6TjV'*x|gY4yI[\j`{˦<,<[˱14MPVrX;Dzc:c`r]'_7TxL0Fu&|'[Sg'/ٟ|@=cC[i҂K*2˫RSPЬ;[,a"KK|ys݁S.*MZ FqI1k4GIqKJPN.XI7iv;R90HZIhSR' ^sqDfs98: "6Ue^v%M(}jTES|W4Р/j,iɆy]w(8ڼ=j4P6/ \#H$ J#NэQ}S׵k Ji݆ovPvuX,r/ǝI1)5|? E=>©"B[P n"I! yJFm+{͍endstream endobj 247 0 obj << /Filter /FlateDecode /Length 6279 >> stream xf;OVƌqZ/?<6[fv]haZ0~ֳڜs7n+2-nk׎0`B*sܼ7/_s12*;j67ۨ8[!Pcq֛="B%\~RLn oef`%tma0_N˳\3[`{.n %!:nnE:-'dh|f qSick84Gg[ܵ ˕esCL chlv6¼#2Mаjv#5 8ih*k˗y$@ =w@L憣teя`D6y_vt&2?T+}lM /B$6QH-r -'2XÐ#[(з_ {&x\bthC^"F;HBDՁ֌~F^%dd8'h0&d:v; z Km +$aB feҍ` 43, g1j-Kwqlحm-E'7gS,mᏩp/L+|SOvIE^k[69m&$ii}S_2oj2nSۏ-!0?;׵}3\ym^_h{ e06k|ݻ_7Em)zjMUmbh3bI+<'MhHjR8"kG+撂2ف?-> Pv1fyHjj`Qc11AYu|*.s_^0v#TR(gy{-=SR4uACmʈU)85nOC!o'@hӬ Ž-O!m|>'}cƟ| RSrNM~Q QfQ)v孑y>/ɒxV, ^ -0 9F9G⁴I.s 77S'D>Z@e* ) ZoIY(*K'Bd5) j&t2 sYkr$̢I'(m w4ǖ c{ASn^=iQyw=D5;ؘ$PCS0W>ŀ2B~TYEƆo5Z`p4nBbNi k78>ȡA5e2r9V?/j3{ fVSKfH,4/x%$[b/38;Xtp=8g>]l(ڐ JR /@!U뉽eQ-+a#z_ą^}[&mZܣo {N3S|domVmY樒BUQ'6.k^hnc& ;3@rVUљݜs-9F_Gݾ7mryÝ;m͘l1'>+Ǹb~zE b⦸ZC147yG@;醧ʯ3<=S:ޱF†gD@5Ziv^9.sޏ1 N.ڊi1NN:xS沄8vK!$m@9CYy;pD|[jSD?(ܖqǴQ5# w39Ąnss N9?p'9*y2gJb`/Re9y9&ɖHLH./dZ'=-ζ`Ftp.Pwf't^J8`N%CU7ҭb 缞rVV]Uu.R2x u*0}U/׈( ^197RbqQ)[)fs!D@P#̐@j -KT3uY]H2P[iqWx} #l,ԀA()E!2v Z*ya^G!ra5X.]&HMf3FfRǷueWCY\ŲZ0/OP3HEm;mJ/Թm Q=NIɌm-wY;#jpD=V9;{T쯄 ]%C*d(,*&*̕+6Q#1hO"f1'# y PDSR0K >ͫNgcIb,õ5 Z56UJ#XeBRHu./xHOظ69 ͡).m';abź"_9ΐ .$İ UҌfW9EmWy@HVMG ב{<_1͇TnLHsv`r7'uVYp" VZsfIřK%K+7~4Y2MfY9`͝hg$p3v|ӀߙIs! o`A/SZ;w|M//d0|Ɇ!G0ߔ_ [~-䱛cMTAPCKf|->lE=!|^D=NbqYkpVHeu+n)J_ N4h# {Y#$CaPmMa*͵/-N,Md d(y1ZT;1:g/*G#^Z¥=Ë( ܴTċSQCmbnZE&_,q ruVlT8i^[ ijU bGac!Hit&28KzROkׅӢZV6E-W#r(4"@/;龀1u#xU#cdO|E9"jqa-zJ Up6䄅|9 RpENF+^3nd5Nn#%$Y*wq('`u9VVېK B]WrAlsf]š\u!ȵK/ua"8;`_j66φL)nVمxrQ`]*u>-ȫlyi;lQM<#,c(upzQEXAM&ΖdU4[̘ e{2eT]_K fsAD 6]nH\nᡛ$p9j#!SX+Pn357X(BcƁ,eǘS0B73.ޜ)Ib 8dJCi9ku~AqO)w;{*4h4kSz{ߏq~+|c~xB|=\Z' G/}_&FH#?^[o|3I{⡥?.}-DfepCokSHMi<16B::e֔`!Dn+7i.+y4ݩ٢1!\MՓj;6wj8@51&Ո4\=:T4mmCB戼LO j3 A~VaXX {@c$Ni/ƎY4ȃl9&zRIW3ña$C%0cĝjFG~$J 9"J4#W|E6'R~FveT.K#C4{jFPz瀈gف\b>(:.wڻ $.momʫ~v#\7Ki >FJS``rJ[KM]~v?lFwum{'5+ DFG6& h3nXWsxg”r\>Wf|eV;hWQ<:R}0STWBR_?Ļ骺msy_}T g;os)>]O-G :^4c1-GN?|(@ t;9oTDj1e.)gc\烋7/wn~(#kSb%ߪ淉vF=ܔreLi{S9O%I|F:3XÅˮW̉\mwâQ}.*MUMG ]&lgMhsukAXhvW\)k _ "$Qas]}RxhL ipDVQ[0CY#<V8)bɭ%ޠҿTf'mDGF͗[Ċ]kKm@7Ez6x=52@ٮ?#֮v)ГzzPJـ2hu LGjh@^A +=D'w쵨ui%Ŋ?Zzc~N> stream x\[o9v~Ώ{- &AH<%[{saȖ+nowƘ(2akoqH1;z~]ܼ5<?Pqqтos[tI`sncqrۤhc\yQUo G.vü'גfHًvۋvo[(fGt| ] z :Q+m$pbA(C8>(O6A`M6K4y[KX7mf&vxN}W_DnXWGF彜0%hr*@S OmiciGi^=5ԁ8M~'q+%f0l.0%&B.IE~Lbr&ik+DXbR1+$TF.N٤y;F#08+}fv OaKܣw8T9@IYNI R%W䀂ġ4@lҼ/g|W3wr36CjҼ]#WVI666>ŋEF}Dy?RbXCETu_N=5PM24oR/dk ك 'd3ùc7k`gVkj yFa fS=#WF2Dt_6bNB`mnrM*n&<ܗ=Ec#s 4 K@n^ q3:]L #bd1QsX?B)#A'KmPQE+"kGb%-UsG N!/&G07T8 wu:сrmweŠ:YP 5 3[5:ypO7FgR^gSf@3xbI8o•fn4t݇Xuz O*mQ_B;^@,J@U<L+-ؖK74) \%E;H(`ƨ* uf_s|qcS4Xmʉ]( AX2Ur[>*$N=A!Cؼ AIhm/_bB/5k(NVyG~Ky0&[, ro $1OB,Q:2VLJ&m~f9sQA}(c֐_&oN2HBܛrG6,r^.+; GwV4 `Z6Dn6lr{O4⚟C.bssagl`T|+cSs.[d7L 61!I0!z]+8Y68f+H6@:0$Ё:0ɞҁo`1N^E̙9m>^ eRNr(}S+^vbZt<ϞbL*<6h9l{$̯O)%gUφ ; ULSd5psLbhlj_9:S.N`&N$ⲳ BsZs-<[]0wـ9|lk^dW NNJfM>7$"GWB,`1a"sCSbo!{b}y_+@aJvQ]'JB*螗O(si!uY}&F]u;R2kDH(Hcfoqx6uc I)|䐣a;pXViG⒢z7=-BqAkePy. \).Gi-ÝH ݑ)o X{XjHsWXH.%.rdQNgbF6&_5rਏŠh]tI/m%⒧[)Ix~ w[ vnshfs#uhAn7h7Ai݂ l~k [Ѐ;/VMyi(g 1!a;.Y.ᮂ`|E"ӋOD'rmi2npɘcƐ #"ǦJ{%lWRMq)3#KO3SJGB d-"yQ?;hw,({%~6gHԥ-[/E4̃yaxS.9ܤ?wHrJ mqZJÏ5u\B9:et5t lD& yڕǧ&&;FWuy,QQˎzQG( zz 3'GEq$*,^YŢ gb @ұRm@ Tf'Xm(j2ۋ3R4l k$aX62XoˇR>p|b^ym_C8,`hzJzοp K0ߖ1I>}[,(WSaP҃ӷ{Mݞ[^*ݢ4Ɲ8-]Zն&ؒvvSlcJgGɉ\+'b4: AP3ԥkS7lnG԰eR!$! "7:)h]0P2-^=KA;vQ! c+Dޣq@?fm}0. fJl3z\}4oq[)m*bQD$>Xtv7eom g\Cd{Yxu$~]Io/S=Z[QF{B!r!Ֆ|BKgǡaҵWtJM)~0J:t{D6/GULa.vX;//6.#!o#\3 ˕Pr]BrxZ~ {Vg1Ξ|иR)-N9La Iy WD_uE%$f4 X7qi֟\d 2(Rp2EDo}f֫4Yb4.뀉6V "B< xtNJSxZX~(}?QLVydzcwL0;$mu*}\BB.ZKy2T"+bnvr/'-.{%evhv}:P]i!S_v%;Vxȸ\E4gEJ a'`l3-"qMT]GB7N%Re}ݮk.e XkyNS0WioAsZwgendstream endobj 249 0 obj << /Filter /FlateDecode /Length 5971 >> stream x\[o\7~7G4a Oxdmg>tdYVl=$?u9,fKHvD)ů*υB'O_^=P|Es|) YexI/C~҄ӟrwC4: O?_T>vm Wnl>g}Z;gwJP@n!a2J/c7f) V9Y+~0$W0FD CM]xk"ԹXMVNqVR6x5*!)g[5EYnp t/cN/" wP*}2\pd\yqe _ѕ[!w+{>-7,z[" Rnu( &ޮRB5RbS9>囷פ&{qy-^=[Vj R46BL*ymI}\ Qej[>ƽ3A mbנ0Uq6!r Geh 0PicvLզLPQU\SU+ck ~-`#aTM56@=\u<;V,6qXoa;T5姥9tǾh%-2s԰jN DIDӨD=^k10ɪkѰ|P0!9k@ȳ x/kgڧ<4o`.<+^E2l:U(6f)0^TRZ0,{PnI!%R!²xKrcQ {*~èm 0uW,,Fh.fN{U:Tݎ!.ЂVg^Èb,Z 761'B eKMpԭUA%ӓT 9!g0b;Цh^+ Du%-1i;6?C09P#|j /,%"iQoΔ{'U< N̏` ,cy =GK2rj,Dh* >2+ؘ͚MЍA~%{IXl CE+lr٪Ð6`Y]E 0,Oi{οdOy>WҶՐIS>o`؈_Qh=| T,,rxZ|TtkI-ⷵ8tN~s-qCPC6a #]0Bkt(/D>Y Oe*4/4/iiu8Aj$>X˒u 7p(N&[,C鸂(e%ي}䞏"+@U2zف;ԴL&,Or`S/l.W$-loЏ()@U"^&YhPwd@WKv-`(+;Z?06]阥`ԂV;V}t^{ ֡v;  @D?Y )hFöpLBX'>Rǂr瞧_`+=OFеiRd-.*=q3%m<^b!\JQ9/-͌[U %$X&<>0etC;;)db+>~pOV2 1 -B[ȰuRf'flX$L4E?_nY-#~-kuQ-~[ChYa-O/kq[?I-uknȖum<`n*8!!ќSU- xRųZūyϔ>*gb0 ^87@Hc  j L,a n`[~Ž)c ",eZt6/.r;ɡ5 GfLf3pH[w# =SQ+İ3HCNMȘ|kU_"lm&aanX\ as `\@Un>_TNϮZO`G317yi[0o* 4ǰ99EAs;hN4ol3[,]%h GPk, oA$QEZ[|\OjM=Ӷ~UiW?gx-~q'-"rH.#0d_h FY=)b,OGLf,Ҟ W"|[; H<S0Je,я6w,kϫb3  'ϑO8`1ư/CⓈAH &Ҁ|OMjÆ٦^`)OPŤ/z6Bha.0ߖn vMmNcɞ򧢓8YkXbM~OUEXcD^Q-6-~Hn ^Y‡Z_Kxծr ,sZ0b+4JDQ/k|p/SK#|?VvS*:igw00z3&+N[q cr/ Qr&Q<È з#Lawvy䔕Π4cʃY b^k[kq/N,[עErʃR ',;ó"fF4bK+ ޞ躎1GĵϘbh b1yfqD Q"exJS{F>.ޔ7^ >D4Aɛ7٦M):/sHP+2[ZIbnL o!q4{{X]Z[TwV":jl-K Dr%wlɍ.nܓh k$R˂.Jdt*ْu`6vy{Vda ˂P6zV/fkX95Qoޫ5Q|m(Pڑ_D|T|&aZƐG^ce7>Θer\l ȵD`%W ]8d7wJО{MNc e5)y9sjd p7cM95:1j&K1VSY]G횛ro/"mNsӛcݙJ>?&r6F*`Sɏ}*̔[v܉*]9ܺS mmkzN'=2((7 +MJ!V 9)Bo9`K 3?Ѣrmo45sjqwru:Auf׊E-vMD u N$]BsgM6>,h?}sjNҁ"jr~)lqG0εfv :.JR}ו8V*`%Q>HKq6.V*VȽ4g5 uj3w ڲ@7*ξ#lOr;)ۖ>]xղ QyZ V] Mav\?9m iG:,k[Ou'rr?@jqTH,Pڜx|&vN#y\%ߊV~xQK2M<.P6ڙoSoi^Şk9h!h\. ~iL6ӁYVG6 ƹ;3$k+բvn`mp"aMàkJjEJXW> pW͹0@'ϖϞ})|5JcB 4d:7y|ԾH y,%7/=^͏jB|t ʨ2 UUeˉc~.)H.Ag0DQ3YyR5CYVkpx 6BQ0ЌcRRDn:ǜ?g hhZ[B;ȭ$̅=@ ]s1qxUkq}teE?̰5[wą?t>S6~7E']tr~W0 (O9\TqYVqIʧnsl~~V@gV[j"!?& Jt}GؽmOb7tDD qyݍLhQmHw{D =Js37IzI}Y[֏.9 (OrfiI;׈i8Q"%ңQ' ^`ޫPž8uj>{67zvOg hawf<`q)(x{*|gz?\n8 2@77Veb%` Mհp/ǘbRA۞#Fi}tZC&,$.ȫ4MwȐDt፲{7)^86xQD|TE{*r 'QPSynsAnW*q湽fjO0^WP Enȗ Z 8REBp8u.iVJtkkjrdMOV&4,{Q#"K[ ;-;F޹6t,}h0ltÈXӜkbŹ?[{8wq` 08 HmO2/ugvZBDݳn]# vZjD-:Uendstream endobj 250 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 3636 >> stream xWyTWTV\S+QeѸkhAfiVYDEi@h,ゎdbb":Y|E.޻4d^S>}J8tc 5wo yH7-%8Iy[6\ݛQ*tmdbtxhut3gNI3]l ܨqڨ ޲QGlv] %~7L5qb||-1njwׅ. r\7n v vGk9G3W93:f.vaƄ@ !>aW\y,e3>f3Ŭ`V2Ujf,ˬc1/Ld3dCf!3YLe10^7qfFі1L2DFq۔nuJra7cSOC=8WQӡi1N7{ s_g?'.zlp$*USڦ LE_ ؑlk$Lp*gK\'2̖U*QJd 5k|XG.˅gđx9dM YRNkD6`F4?e8ky"櫹Cz+Cc0ҙ;"5g35 J;pm&H 1)k hnj=cs%) +>sfHwM8+#PJH Sb#! xgY()b?ZNyFad$|OHe'3j@#Gˏ Dl_XjX J/cl6YCflƵe a YK&~$8LSRJ:$Ud%`xV]ɺOBq|e%[JREa#%j{7*QJ܄^<3n%~iBT'8ف~("~=d@<߾Ηյ?۸5?\u8AܖGjGqCߣs8B1bw2CE ~݅ ˀ(aXƊ^&ܨ|SawIAAƑ7ǒY2i\jvn$1 _8g!n,jz/QNRnG17gwAQ{P]ܿz[jSMh^@pU![?]gMR+ s0UUHEE掉m {@ %x:gbuWp .w?|Xt>}Ș#{Uk(dѾE=w:JW&4d95faY[_Ć!^jo֫,hzwEU-)rOa^%.ڠ1FC:nNS`NSM%qxIb5ņ-kE8޽0Ȱ{%eп'tXw|ây9&0ٿ.`#%Fh7jU(GFI_xqX]UOl.(M3Tj 'aڢXMX=v*ʹT?\BJ\!Ѱά,qoBTGq A L8G6QO!94lsJ0qq\f+ Nj+vPOwiTP}xN/gnՈs*%M"dtِjt(ڽ Ғ۳s 6%6$6پ"~ˢ.;/[Z|[ +dczK${0u,Ă1FLQdQh6쇍 Μi xġQnJv+ ,]$05[gyH:;&ȭ%DB@442ˣ]`u$&x8JΧ%ڙT0@b/>sTWrge\ӡSfZ7>_]%xm6M*5Up7G.4D!9RZ W m48`K>L;8mS=z[-)HɥDx U}Ta)XP)?Jk3Րg<#%Wu%58ufV)Ep t5D%%\%7sN-} ZXĒybN󜜐uerrfk]endstream endobj 251 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 5080 >> stream xXTT־+"֫bǨQc1(VŎe" MH3.QD`$%KLyD{h싇H_z,랳}J>D"a><Nj#%}Qҍ$Mvg)Kۖ#8T"ߛ`',3uՌyLzv"_@/W2WLrwry38x{ӧLSM``OuA*w7+{`J_wMago{{0ٺ$0hiU!P0W75=sNX$Lӛ9&Gn+w⾷V5+(`2` <3hKGn2sHQC^|װ‡ۋj`@[D"'iA hHJO#AT'^P Up51{sR@Kka#TvؚNUtϠG’b8i2%2NS0fz JQ;P"aǤ^ȂxS{!䪽-]Ct=zit4h@(;ŷZ4\4U 2g2 2gq@td-Ow>)5/29S_ #`mM%] h-4K;c;g吺WԲE`I42".8LD #hV 1ZyBM3`,r}Po<{֋Sp ,eA.p堫"K^:zYޖ᨟(L{DF:nvd/u}&c]p$#8+>tK;8!&+^]C\\Y1 A}` ͫ %ڔ}@,', :((< E`y}HW9krw4}INH4Ro8Og8NmiVrX(z *w U:sv<3@sxYxx"Wn7{ J. rz+Y.,HۿY8XtRʴ666jn]RZ ~M]] o2 Xdc~Aσ.+5)"w赁ݓg ZTwrsW?e3p&W)KQ,;O7AHyOM C&NR>y!d kx4ʤ1QL >1qR$bhge^zh4{@V%%hA+'}I6,XZYr,L]V GgN7?Qq?M- Dɱart[:QiqAuVA,6kxopx5(#,- ,s(2K^cшפ kW2HM(,DC]p^rŨ. l|tX;9ʺ҆™}9>}ܕ%;/qsK|(~ZePVU)P ?Wdj/PH=|@-sde~։vW=5*.MJJgM?g zchKQ0,yj) 5á UHL 4E)iT*tW(Y@{oԒ^̾ 1Ǩn+JlaqaqAI31qr"9VL 2dXK-®Se6x )3=^e^2KrDڈd(DOK؋K,:tKKT_B$bu)5J}}T^ZRBBUjR4ؗύp6:IHݳl:k);Rp8$iZVVGE@ <{M@PbM 8 ?mvIq“H%+2ث$iBa+d庯vE f JKӦ@'Ia1鱅`Ysψ#Sɪt0]g ċUAĩ6ژ}^t~ =`זּُ?X1E3'XDH՛C>A^{#%L6<;D*n<*knm?)W6;XkwǑ-N_G@bV(X\e8DהrHn1OB{9[Vƣ'p< $Ad@<ZkCZ@~u?|#|z鋖+;WT86ׁM-^ E5}|$3~/e>/贚t!"6n8׺e-M͋mԝp¸E;,lV!x)pDf2O5Gd!|K|tt9!DtuΓ[uuXR{^ߓ0\ 8 K}/W[ꣳi:uQ*/Ҋ:E\*ܲ6Ӧ?X%I^Q4<(!q*|[߮+VL:C설EFt%̔Kg'N`?K~87Fm\Km .B?o]k4i~^BhʀGXoݏ>$B= B &%2595&==]گ͂ߌ;{I;[ĭ߶;\4%LM*gO쒻m]1fx -[ h8T*ЛNjUcDl|5]PׯsPC3kmL'Q^[_z٧'Mh<ўV ܓlsQȉ/ e'5nx |>m|}Hyxu ZzYnʯkvQ)؀p8;2J pewȉ< ?X}DymBs#MNWW] &kՐܾt0z5ey'"C\*_&9nnRT~m)DZR ns9֣r&[_7m7м(˽d Efٍ9R#FA*PyÙ7b/կ\Vk=='=e㴛AM$6uOn1hbNvn%W}>Z mj!&&9]"Dpd(S^}&1S䂸\*uB踢D_4ayr{FL5 R|$R7PE7ʈ\6'z+KdT??zeW?ٯ|6ʖ@)bJ&Omg8ZG)ӄU q*:2CcEt蘅;Ksed{k0CI?dNyY()7bn0`endstream endobj 252 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 8332 >> stream xzt׶aМ`e dDj!л{\d-ɽYdc)`:%$$rw$ro̜o {7J Z?i_#~`7ֽ%ZAo!{l}Q;hӻP M\;l(у&͜9}ܠ'4#dKU.a.aAn;="4'N xA;ü>hq`@ؠ.,`\$ *#$([n]mQ!C-.۵՗T^R<;EVV0VR vy\'>,.e<^sT[ dk/A ZIr9s8^B@] {ɯ!Gs*F|ˬh+$ LB~>>@; kiLAnt~^A aR%˰ϵ,ڨҥdBk\4Z]% (I. D+);FIY[pDUB1dR3ri&$BK͵]#n~]&ƺm %j2 =t< ựHMi3Z8yGVl':û}_V%i/ůTP?~=~_g\*|}E: @k',]y05A=TsO"75E=P~@bcJϡxC-{V8W8:J/(u::lmBW>Z ySHi5j+r K2Yr6h!ͮԘz3^P;4.B_@0ylf3~Q*[\,S2I6mRSxɗo}IGxZ$Ɇ8\:h&oٍJ?VyHh"紱t@AL$n|φ-GƂ^)ؙo2qޮ9h2*O}f/xW3Nv.ִj+O9tݼ+`P_~@,wp), > ̵ϧ`+<$=c#$lWlFSS(p}HVFQf&q Ԑd"*BzQDǫ3Dmey_9݅.v9CZ@< ~A ң͚s #xm Zn_ޙ1p{(Y?%=&ZWŹ=3Cq#C*p7T3:4FJCb}YQ+8ȫ 쮀'妡΀{0bls2QM13i rGXn4,dx͝uNNM&#%ؖ4jA[\r堺`>/J|j3]2IYw}ž[$?-I"AZ' ST) G+ĐY{,. Jďj_ƒD= 1-#~y6O-,,tSjE"g *ҭ>/Kdwx[=:Jgk_L#n<> j] q5b[ԣ@r'(cPV3V0op5ypTTϥ0&LhɂGBmM"o|<DIz[Q'WM~n@?V\gẄ́ o]K?6;FrLI =ȷtۗ,hi7< 8NqTUco6Irns搸aNgdm]gdJ.ؼdMpseRIP UV١a ;QQR(dq-jyZ&(&W۫ 4^ITymz6% 5+5"[j8L};@NQ[7ɗi/5!P(4G?_r#G$f|8OVtRyHw ΛȣgGXf[|ĔWoKJ’B8j#:jP"rPMYP"WmvM'kBjBUv\"(όF_ˆ4o>ˬ2gHb YJC hr N,\Q[Zg#8Wyh#o:(&=NJh:sCF9lH6wCw\I䥜HN?4_,2*C}^J辐Bh[qުQ$8h1 Vďj[,DE*JE^>#{1۔XytCBbSj °picבN*=m4槱FhcY^RqLpqxUyMb ˉ_~EڿN%QP <1i~4MbfT'UwH6M4()bg'Bcr̉"8Y%D1m\&,_uRO*QDhԩr~\s۬x:|(JhyIަئKpϣ;0_lȜx)(MGw2p],tP}̇p_ \Wc`} K)*y6 `+Մ5D],h^! 饰=e3Kx bWb&h1ZƢ)ȑoٱ(_{.Y0C5:m[4~A_zP Y~]$p8a + 卞u>h`sn6C@"1@C#ReވQ$,(Q:G"4osB) Z֟_̦5Zpt?2>a‹JMmQ[V02,H"I t#@bYH"}S>e 0._R&iݐVl>zZHA<_]QV_$wu\\tR`&,^øKތ<S(_gpcYU{tKj&z ]& 4/#=vhO6.:Zqg QgoiM^maR1j5ِռWAa5ri(\.[[ z` <|q,}^'5*[9q2HLVK䋼#C`$}mmuJ[L˨k?O }ʯf sD ]iז9J2EZDS* ) MUZґZU6'+//.l" ~mYiUq8mwli /V's]M&p3-$QňU&$Wygbm]8=`^Mܺ uv(_dpꎙv^zD@@$kbzӤ~ˇZKbz2ΜYf3vL"% 򂹂T}>T2'O8w mWVWW{I>o4Q#iMhɶ#Q\)M+Cc2[U1;!v'ڧς 7z6wG (,7 ^_~K:]P{{U#K‰!."JAҜіXq [6%ԫg3m֖g2^h%lAxl:ttlu< HC34[4=Ko0D^d9 9=Ah"vH4kl8sUDVx'@.o< ̓f:g* ހ}dfcj'~Ӣ*dexEUWcVzthӌ3t~bL{ܝrryk"MzCL/5tRj]Ne:IJ$uqLE%NΟԧ i:M| '?sdiRKVLw PM!jA3٩6eVҸXuZ/L#ң;|}' 2X!%:Zi@q E<"߈všʹ^^\KT+Oҕij(S$—p(MҩHHt$$ghu\Na; ZwʈXy3:&ҹꊌQFX.A%_Hl6etjڦ?س#j5 0ZU&/\JOvdi9B=96K!e%yܟ.O܎l&݆. c 5YMg>,z,zO<{,KsKv7ؕV^_IVDž`+-ĀlQ^kviq)B>fJakP)Jv%-QWu>/7#zds@3 N xpBw"xjY,R>Fo37#w *ڷkb4I` 4Mӄ'o[SdHTq Et~F/6_vaxsípy:đO:6;p9!Fb`^ f?BVAvУ(^¢wVEjl9m{k/|ұaB. DWY_ ݱ.jvww Z Ot_z=:"a[30﷣QwN簯4w>a8-GQ17u%`f3$\4:JM*49*aJԇUYaQ=KSQ-'nz!cD TlyS\38!/"H:}oѪ/M#86Mok.9)cVi, U-554s * lb@`f=?~gwV%zZ:G`%{=m8n0kg+*crNR ?6$fA1))p5++fb]{Bt'Ĺjp_dhu>D'LZk-[<S379w,&=UAtϬ4/ 6'^n|~tc, W+* ̜vGcjՒ;bg] 3;]LMKFGFFJ-~GҗyỦۋ8uŅI`H-YAL\+AU)a)<yx~uTLH~ᎢnH*_z!x !r-J Ҫ}E96_%5k *ǘ#Qm,Z$5Ͼ:t=DEtCdfLhiA*j=Ѥ( ^!(5+E;D6N D(t"!A낔82|JO֙[ > stream xdCMSS10$u`  f]WouCopyright (c) 1997, 2009 American Mathematical Society (), with Reserved Font Name CMSS10.CMSS10Computer ModernRS3434O'`7ҋ#J2PG$PDDKP ue.TTB4)(`aa^}vrzj`ITI0b17|:T}ʋlu\j/Q{mo߻jluy̯ȋmKNbPN}DN.Y=]K>F<_O-灳EG״ϋ8(>BcEa*(?(<0<N?|!uPWb  7 Ȏ ٖ k endstream endobj 254 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 5636 >> stream xX xeN?U[/ ( *Be,{)`JڦiM&͞=MڤKMZZJ RE:(:3Έs{pg/>!qoR2o֔ԴEKΚ=g/`0f0"3O0f10dleflclg<ňdɀ_b.-LA"^:.7(FZR0i6دi Beđ[f:bP+R"fqDvP2Q0Bh%x޲cht|tC { x)bOCґZ]BI@0g9:^gǻX >ݹdWT5@fDAK`.fbQu5"z>UTJm k F<"*[ z=k @Ovs>CTБ@mس1&{fJߺ#z'{}|Lc9z& ɴ*W\T\:N"g"E"&w.Rr ^N?Ƌ@$q-Pc ~sPF})݇dxQZ4D,D--u!hrh({)KCHgk E6m@[ɤt*]q)09JYuJ$v yzeL+?"Kt `ur.؃834[,դ(,U9-&]dm0\>ԋkr; ]@p>c+)VSM,;QSZeiFяAge6h*¶5s )8~h>'~2#?.;2%- ]K5CAkĽ-_!-ZobG Muٞqwu) JGtRS,z.=kqoGTᐧ(qY9M Kw|χWjzTZ%r(Owͫ:λMoCaUd5Y F^࢕ ̔SWœ_ .{\Aؚm3@CaPPIx3&;s?@O] ]#m \IBAfKh$ -*r?0C֍#a30SI"kn뼊2:Qu/؝ߓcJ[S;mB FOATtXYx/%өo, dBVR ..R(K8{to>*chUX r5n[+8:mkq׿}P !($xN/䌚"ИN!gˋtRR;82t;N#D W_Bcxz2`y9)x4M|ʮrCc뢭q|?ף-$KdWkkmqqs$Kz̸'Efvg|Y2+F& DF7ͳ]h*r㜜9s?XJ{-=z۱Nq} ϑKue-eYU};v<=GS}5説L)_!^,W_\IHՂ2_Y\$G.t˝F|׃پ L z+<ӿFl]@O*x=l:=F$2@_ZV]<K<~sZ|"ɷ{;O,:wQ^!& emmP `7(>߀!q:zܪVQ)3#1Tz+ƒQk79L{Gq`L^ JZ*N,-px'V1NBaX(9Ơ>~$fk'OQߝ.NQo/”jBcTX+CA4ER/LTt")=UyycjElXJwEL1qhEdY*i,5X,^FĒbuVV6$Gڊ)֯vI O2 :w+8*4\fG;+Y"h M}VzUzt'%ɧ#mPѵ?TxHW:P˦cAO {xoĉ akmendstream endobj 255 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 6168 >> stream xY \Sֿ1psU\㭠^ZUV*(*uQ}  dŽK،RK\^W[Xmkڡ&HC~?f2sDUJ$INl(aHCxS+}Xo(L5X$ O^zlk?ew'OFP+9Hj5ZM\1j,GQucj!5ZO-&Q;j25ZJMi35ZF͠S3)j5R(zLRvB ޤ8'ՋzKQ}~Tj5r"ᡬ(%(Zǻ=jCđkV3ZV#z -Hd0u=5ݿg66,sؾ}s4`Ā+NA*/;7^  v2u!.>v {7=L~Vn%TW=v ~b0*M B( iڪǧ$X&q/TG_a&]=[kP9.CE;pPg55lƶtǡpYA6:ZF6CQ|yCL~ktnC1]F4ezxG;COpxAÉ @ we//};/jࢻAr/m;KP G~@%% $(|P Hpk2!;*TKzon~XR|}P[u[ Pn_jW#B`3` x,i? %`B+q?,ӝT]{tp{K*~~ZcDzz jَ7=ayN z`QF?@ozKpD0XE7CUܓ- mɞ\{Os[RL4GA+/}8MX1U*ZLܕ~ϴAw>`A9;?;}б0~2_cG,";h7++C>@?XNA+Rdʲ>(D2u {~804DeDLĘ{a;T震Eϑ~ec/}Ҝe!۷M޸K-QcDqh$/4rgu$q6|u>GbVt$;L˜#Z^l;CtZq-b F/xE2>#*'d;lH|귖xmF /A+p0y_*EƠO% 4 >ijZn͞nF}׽o߹i}QeU1ZނE CnDhbo;bwv8Bf9Y\*GעrܦKk;ݡ_/S碽 TK"oI#;t:ĝ'ȁ])~u^T#$.i"|வ/+VO?)DZdWQ^4f,!O,r1lXk$zȤ .FLMdL?L;h^T*ċMFd0$J+:LOi.XA啴@,><-y+v(5MbH"?E%ܖ%ό9r}CMqfݚpϬ¨rTPfiV)g ` BVPG$B<3x\5y$Z)7i8TfkP>bt"^z/N>?d4 ]='躈mJ(w->m Ff],K4Xwu3Uh8uūvJ4cp2[Fs-} DYh1.\`P`|҆ ,8ӐLw2zΡz{ []ԘXZEkWFLE$>CQ;H{znGRݥ9(zμMӹB9<ʢ֘N\NJ'Vۏ`Eg9r졍kWyxS|f<}>qwdirBw"pwu5վMhe~%SщCO,?}/W 7MʓvqUSNB()+Q(@o|=J4FLX7h[xy U(>Ⓤ79>Cǘi 33vR'J֟utw(:WU!]Ts:r5{)T1&5 *%LդevR\Gz:Xx7VͳhAwǝ@J JB-0Ԥ[#mXr2WMztV܋Ë;AGKO#5WEp䉜Q`Y.zbciՉPTIۣѱ3WP^b5[Utgb, aMb/>?a۴n  骪t\7 <} Jy]3n X]W 4qYrvR} hlr諤an=l}(r $rFܡܳЫ;|&*eTv5**5*0ҸНK<̥ǜ #U8'`p+^ VݮJw>FQ+'+ AJRetyxT?0I;Pg;vix4C_Xa׮rh5QfoB=Z0~ nP,g t4[<Mw=cz7pM/tkxcZ)wrs[|wm^g{γgC?_}t>ŸբhaqzOS"a$^@JNעOx|YљM@<| 6<~8ʙ*Id#ˢ$HOn .C? Tҿ/Ӌ X&,ҵs-&HvS!ru#W$VQ"|(t>T"P"`oRTV{eO qvY{b(,Vjseu(נΆ]mvMLJIE*c®_N/WZ]E_2`3.{͝=s.L[]+L-JJs1oxJ'W &d\2i B [I>mDwe, K KjU͊Sver{46WOztU;b b>t'oWp<%t%I<~I/:wr)zVvYx?D+=dcł̗==cr/LTusdtܾk0kZzA[Xf=hDWHHP3pG8Y咫F&nb??1'H22&:wl1}Cgdueg!_I_Z3~lֆ{pR EoadѶf>=G BKI2B/g:pZ,Ф1'|Ӈv}q=k,++eCL1z_)Jc#yN,cMkWˬu)@;h_;m]Gyu=ۼ;aձ夿̏X!L0çw/:jb_W,qZ=pEb/Q? 'up<"QP|GdFP-.ה߯0]feh"3A=cڌ:6oxޚҬb(+Ce@ED7$tņ Xقܢ!u%\d[#KQ$$g0 J Fo<:9&!)0I9ݰ,npJO:S$1Zk-bad2:jpCx A4^x0^?}}~.%D+ޗ()jP6}ф2|y:zdҿN괌8W}X3/9xe}8Y Ӧ"@Qˮ1q#!MJ5$YVynޜ\MF.g>]Ey[*BLs8`1v2*#,jn06jFzcoq>$&wk4@J^) L 2ExrLl !?$GJSDUVtgI|JdlWG/`V`aCQܾ1cqL]W*j"SR9ntSK*?µ;LU94|x\7JlSoccCQ-Eendstream endobj 256 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 434 >> stream xcd`ab`ddtu14qT~H3a!֏Hnn? ~O+XX_PYQ`hii`d``ZXX('gT*hdX뗗%i(gd(((%*\c8)槤1000W100DGߏ˭g<wC{mSS P$<8ߕOZϸG3?DO1J3[og]l ?)﷿77vJVO#Cm8Bl| ~L`4߱wq}b1ù~O{*pendstream endobj 257 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 3473 >> stream xW TTW~eATt)CN=Q;*vD+.H U@N-Tjbثv%&c̘d&D6=I'U.gn}Ι9gS}]1dl\='.u4I&|)B;#!JQ?EN@[2`22vM3gb7?v&=?kWJn}f&EO~ɉݨݕ/(S-=hV`6?e3c7.cצhc5#^kiE=4W_BP7xךu36eh>9_s@@~m-L,:րwq6}nob::]YArYIK[!eoB'~+ȭDa ?1U?xE R(4EآΫEQѨYf{oS LΆM96C32D})C+j{XNĘ@~aC:q*Nq1^T8 ӯ3n} ]kLڢ)]un(!.@ GSW?9(9̓g\ v:ZB'9($}+MMRzPܠHƆEM}z4[1X9hB >CqF+rsjR#=lGy*`mEa`aWn. ;,{Ha~W*V %g+|ȃ@K-UPDk:,^][ڪW6ٝsh94CZkumT+M=;MuVOިtVO$'6j `ehv BOr6;YC_((nfryΤ5pYM*UjxWp5ѡC)#dIDە~* lgt ! Efc9#cәwF%@/.@Kq̛o>"EWch "@1C*e9Oā x .+?~|k%no" !DϷP4ѸEzJ&+F'+h5aGW~1e 1+NVq8 S e\yELtPWpn& !YP-͓[ҷJgX1 v1g1d aFlMRhLyvͺڸTa߀Cl<Zx|nF0R{Oz,(#RTY8 \^yM,jM}ˬY ("Q8#H9=dCX0*2xl ՇkG`iU-5aD*?*~"T(myd(`֜Wo~gM]rcI!Y\_ /n1Zl,y<[ݓ<nj שu Jƚ $G@QYmȠNz]hZ=sɜKM{[8`JhWAS]sw1`ST* b1#|WXVB*֥;H:wT#j9%J*Vaj|3*(,-X[N9S}X6#b͹?CEF1PGe!j䠌yyMఫ8Ӛ6&Y H&Sh̼YygQcITشTY{2;qnr:[A{'L#="_[E?w-\a51 lK@> i5FB? !]ՓM 8ʛg賳B%쵗7;꺠,%Sssj][:]tbir3gM#f`Gw8pcgEyZgņ=N^ӏ(4=7 &iZ?]}zZim1腊joEY[yPD~ᴸ6ȂpnXHA^)CqzзA1c}k6WTa!sNbuo\dR?CxlPUert\zyMY'۝cX<_t*Q]tt)XmǬV{/)ٽ5w i jqיεv۲j8ƇeWn!U*h \4@<#QoфdlF׳Ul{QWqہxMD:Cw<.MWx<.|x Ksh;z%bzpw>7yQ;_'uxقhlfՌIB9IqjE=)gB 4VkC1]ZShh?ښY%jke($|Ӳ$gPGC*c _q+9хDW)R%ŏf2AX$5(PQBre[IF]+ xޠNp#|?py"ڝ&DEDL^ʐ<'C'Զ:jnGśu\t(Z!r)6 %chv!4]sck6[餆89 *BtR_`$H-G%/ZkAk' MiaIV0b uz?{K*7s?iB;q74Ah~HpyT%N#TE<5Y%! z宼d^N::p'B6CC]MEIS>}v̂eyCnt\:!>= Ji{Fch*ԛ eo~CaN7=>5Y|h Y"hUu[S}%wjՀFPW^Mgoiߌr.֍9N=6b^kMTE76sendstream endobj 258 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 576 >> stream x5CMSSI10$uP`  f_ZpwCopyright (c) 1997, 2009 American Mathematical Society (), with Reserved Font Name CMSSI10.CMSSI10Computer ModernRS334U7|!3(J3 #VTGD7!%u6k/T[E0nbke{xtsrvBA7$L=Rk;aoދ-  ejp0bK̺y]u~/]آĦjdcc yzy~NMa7L*-?Jlw~g*!kBꋾO.,;PXcuPWb  7 ȏ endstream endobj 259 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 6368 >> stream xXtSǶBr)_b{5n`[dɒe-Y"6`ZBxI DBM !A ܬq# 彼ZXW9>3<{7\vs-S&{ qûq/sЇt>⋁ܬOy4v0U2&)s2u9!c#SBFf&Gf?B6 b3!cgfΝ4)''gbdrDaz—LJ$dƇl͈Mώ Y!L Y4OTVB);Z<}E̬U9pqZI̺6oJ؜֤SM1k9s_`ᘗ7~&O!zbJl ^$6󈗈M(b31B!ۈb XJL vˈnb91XAL&VS0b1XML'3pb&XG&&AD0',ѓE&}爅D_џ@ $p'yOv?GݳY$1!j6sLϺ^z5ޅ?SR{wy~y9@3ແAH[>+ANk5tX԰a?5\9_he0a9`{[f/W <=sUue u4@޳ٹg(%r7:N2[edyUx{p\s&ha7'XD}50Ar{w?xm˲ CxQxb ;l(Fʙ_#Q( J!&_Ph"֡툹H/a?CJQ@MEq$@q8o;vk7+ Y%z3wD860LK^[R. >pʭɛ:PgrLhx?$:*e?տNۀ|bRDL:3,Wb;pS9 AI\/@XRjgYibavcRG\jd Gq S"4Y'0DXMҿiu>Ȏr;Rرc@nm XGKAEhfAx-D;L"3S%-2>#c' Ƈ׼Wk+4y V`4?ےI X f#Z:^+Puhit HߌB_DM'SJ5pVZ)L(>:/_}C1zѻ #s.akM3QoR3h@O*PŃOZ vC)(@>(xGwzt6WPܬ1Sѐi +A8i{2ni[e m3'VY<0)]/<4;T]n>T[ZA1ǼA5r-4Zsn7o\rg*RL!,vӧ*AUqGއ}Lhiz)NT'8 }]COsӛi<6g:O o)w># n: ^72MWm`]FŷD*toQLRߘT:YZz<|Ne`kz&QoTV[ B:Rd)6ʩJ$(F5 OܽF?-s"ȣ˔eYUɌݟPsw_v"G3Yޠ3JOZJ_vUcnL4Ӷ k2 :R}ʄl.' to gA{R6)==k OXze?iJv,&ӬFܯꀳ#h^ d (ШJNlRX|Awy@8εf9d)>+"s+!| qE'ZESьMA0v}P-GYZJ{TOʈv^ y_[+5ݬlO/%U ᗻ*r>ΐi KM xiC/)d{E'\ F%"?H ү`5؂Ͼn8||2za_͇8> jՒ|6-j(Pk-D^~~3@/߂s휖~{rb =& _ژGܠPm6za<=j,P_6ND+р%a}Tx h=I`7WYoV`q@2?"Z`TNBI70`K2j a u4O?1"ѿ>F:ˋ5bGG| .~%kPs=t$ " qVMK,= MZY6:MK(\޺)3RMs'S'ŹV)K^M23ʗ,j5p( ƚ2)' <Jܻvul Hdrz,)z"t5ΣJ_ ظ_]- )7?>znl Zo ,+ty۾GR XZyԢײh\T RR/PBsdc͵PJ jՑ)$hVI~Ѻ#r린PύޥkE¤Laz;A:4Y?]Go[wNhdKϪ5We] LվqnVeEWǁXjrPhEw`TJ(TEzC^:3jzR]t[QuUwM]Xg >8hs'm*@s`!Y*hCe=:; Wvܦ7G7]xh4T5T}3k7ؑ?Ɂoa'?!</@=uqUۺlG|KaIMmeC] ̑'.HIHM%6hdzq%ϵpҼJqZSd򨃙 칕 feJ+V̔V hU啙&<.j˛ zVpPK˜@W+,$@!ѫDP~Zr;#B*o/lJi$@]x < k1F\jLLr*~?*TF %j\&ƜyP[n7aȝ2^d8U!I O Nhj&kû ю: Jr\21pcNCrd4KQ>% ]b C2j:ya4^.g]WOFݸa շ΁_AЗΛCb=m5@Md_ v\fzo_~;""6,:k»ͧ߻ՇNlܵd ߕG5:^U@WYcQk6sz͙ ɱթGZ[1;~ksS^`Hއy!ܛ,kLY 4u\eg,M `yT$MZ^_<ꑳt_ Q MK F\Q6J랒Q qPb\e30*T< >]wqVlm;zr&b&X 6lںL=n.Wd#Kۭev\R@WǠ)R*qҢgQl3{KUUUZXk0pϮns)|KZA[[Hƃo]mI " 1K>+KJ@ȳM, P"yQPfBwPxJYy6؛93pjRpaeV;" wN XͶ"PF9 \YѨ-B#-.Nc/oT//5CS6=}GtUNXP,D20OvJ"FXrb.'a=psCx9vX+lX֫d2VR0X3o ./秫Ռ^MMIp$G,?n@7UVZD5"( ˙:XR,)j0KYv%58˫*\JŽMlXF 'x0}ԫǚ m.΁K|(bXp.wI7@΢d-i\.NVt4NFr/Aڀ 4Ru ͖&O놽pp$6ueJ/RJ^~ vWn)6n!j੢Sh (-,^MsIdc)'B9~ϬsޏpqWDBy~!ӱՅr b<߼皸4@Kh8~mB(ʈ p#D_ѫb> Cyt4v"Z;몲\g3V'eJgP0lv h{Eu3c`|5ozg}%R\TpH\ZoWwOO?];endstream endobj 260 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 1452 >> stream x{PW7,IЮ&*AZX**k[(bE$@ k b5Ɂ`TPPH}0J}!Z->R-z^;|3wsxk^py7 W4$8r:DG>D> stream x%yPSWK y(-E}uI(ZWPȠH 1$CXLC`MP@A)ZEGVȸgN;߽|s=$!Ht $;B&{#8s:)H]PG$e!rE2Ez&-. .]8@LLI #EdL_R:[:YVTr4p0+E,$LX*OS 7d")20R.(t~TbAӉLbJL!&D#wpHN _7jC"aD\mw򴹅 \Fri Q;^ó0wQ̩c7h3`v ԫ5+:x]bYaai)dx'.!>Xꬅ#.u1z?snU BYUGw)d{E"ϧOEēM-ܡn/i門KzP{ MI)h inLz[j +5r GB~cMEj昹:rp$zW U='B!*Z2SDb}-CS\D=Fc3.qY|~|b˦8 ftȡ3L#Gnr> )X ە lfhCyG/i& 4Pn=a+jSRT9q@M e#']{oX[ SOǎ <"~R2yJhr Qh&Fܫ}̞XTG𧴶,/Gn&'s_ull Z^oYW;3d}enTb׀T &8Bd={RW. i0iLAF )Ӟp:܃~ #HPO~6Kji;6ڤ%V-LИ_s8:;e;0} k!8i~?"өFso{pp+t匦[˂!"co|yHޮwr~B4 c#A o0`ޔ۫$y#j&wR<,&Nf&9霝Σ B֥endstream endobj 262 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 5291 >> stream xX TTW}eI%ŧNWѢY!QQp' IT1\LL 8DD F&1$ϣ/*2uIe1U{g}9Df"A$2B &G6bsr,~;U#C! ?p۩l.^p<{Ŷ+~A}?r[`O?h۩K}Cޘ3'22r{``i3m#}m¼:nv5mCp`HDvS!/E0W vYp _p{Gg̡^[}|\mgΚm?w4Ld0vVf83.̫vf3Lgv1*f7aV3{5Ƒg:f=ylb63V8gQL "cX2cQk4H&]d#* xKF6m3˓,Kc\ ƌ-g}^|(YNҒƬ2v3VǍW>nw៍5~x'L𕠲5NAg0kpZʉXPĒϭ}k89ۚ^ -KsvYc2e22##AT@ :!>V7Ű@PǑ'J »fu0f8'Xuf,[}"%~%ue3p 5=ph ngcn * `N#%frFn)_SBb0&]=Ƣ}՚o&X ) ߨxm˶,_8KFJP)Og#!N^%Szˆ*Yor4\.^$?<>$q%w}FV66/$EXB?'=#j-Gdhfzm 7C/Uk]a@Y DgDBjX/M$čxdn7? y{45$2Oq\7߯ e8mj!p%Y!8'T)RZ^Ӏ3xCLX`>\o_,os C$Npi ŕ85qW8Nڱ;Kfu%SrP6{à ‰v߈m+Ip%Nĩ 2ZN &C4\,5 \v9Lܾf4/;N+$|K3E:, ,PLLp,л)W')}<Ɲ ވT5IĔTy<ˏk@QhUQޚ|>|1UeL^> Sп]4Yh@bAV[V*/lR),;n]^YzU#Hj!hhZpQ~|N xYBIURϒ{7]) OKU6L{(Z'}xTҢ˿-2HT..pKWN6hλtr.WӺaPΓh7+G)!kvopXqAY2۠'#YX]mɧ-8[U.|3딘}V-ɏjP1SYWpW7H2A4BuƝtB  ֊;փb Um]4r5Q%vxb KkJۮl lJq.5@(ҒDk a?7 GbN< A\hydMM15ɸd MvRv_-PJ iK+pEun jU1a zQd76 W1RW,2d H iiTjocsR#1t6 $q+C%O8TEznMZE͍:rX?ʓ2guh{h S =zĂ+|j[2vɘo;;*Ji78g&%O F|>@Q4Ry 蓵 5!w2"Yj=5<ʄBVX6<'>"rdB7[ g( vhӺ oȆޤXO[M6Vu耢LKagّȄ_E 8*;5+1AM>{62sj>g?,p]KQ{*~pn 9lkYHhOfq/}~ }B;OR"D6'Ehvgb1h4c??ّN˓&QBˢe5^'/[U)as~;rȉOhⓥqybweduLu(Mr'Fo9YaPZ$CVɣF6 ڂliaiB܉nprŽo> ;x-}1GqLi\=C.!f{ 2fޘ #c^uRBAxAȐ]o{ գ# k` 6i0!ă+`%$f..T!O]MC(=$4AM8NFmnyFJ(*"MCQ% .z~SLG@^e#NvhW@{^L(ȉ6 x ړ&?i}ΐuǸ/uiTC;YXSL]XTl\bgޠHb[n89/#_1~O:kzG._,=>&[W{3慰:Zye"]x6`_\KqI[bS)pQc\ 3K.ݑ[PpRMԸ 4t|]2Qu7F`ȋ]kpԷW#E~r`? tCxಝݲoWFWT7Ikگdݾ /WVՐ?5Iq9pL-uL25jzf9NO] EE"GGVOgT2^6"/GW^5* i\җdS-}&E+`0YCy#;*^9(%'yAb6$1FDp𘚠8UNBƂPUKmKYwaQ`4g\EktRuH( Uv(]ߝEO$JO&<:k4VKL.;5#9~6 hp%d;*ٙٲ_"c< }3xk<؅h9xIT*;Y.A^ .%Ԫ4HTPtAz͹^b zJSOj5j:qGH=njM K! (޹UbVJQglwVT',*W #zKx:.~!-n 6z?oTHHHYHX+/qUQ>֊7WI&c8>EF0= E/2AazEB ~u?xf6o u;v/( ޅ/grDN>( ށtfw .vZ/lvvXa,LzHV&(`#owЊkt sLG2j"ژFUF> stream xV PS1psYT>.ڢZ*j+`#$!$EYdI!.T,jKUJJR:uiZ̛7}# _a|ۯ +!klm# a߫þNQ!d "Y)Ryx'z̘?=|"Rqcu**".\/b=ޕd7T*łi4𸄩reD/T>"!Bc\XWԾoyBPzoPxC&W,W&ԉI[m(itlw <'zMAZb1XOKl  b#Gl"`b B,%oˉJbXC$B‰p&ÉX)PGz!Czg C1uiS51G]ƺ\p~슆qu`Ag,hUccC7k#s^Vf"&f-+42C~-ȗ`ggUZ'ĈRd)ԤAH>_XZQ-Obi61vĎS<v{8 9 x:p/]X=#ϏC`y=/;*DQXI%l;|($|@.ZY{(HHO!9s3.y{~K:ĩ-VTf?5=U'+$&,4k6GiͩyBLî@t[XCBDX&f6F09 CD䕏>bAUR6<ᯬk,^jPTV9hLZ>SjqJv( $wti#5'/"ֽ)d۳:^ Cfskg4ȃ<՛zZ,KWԺT%%ONR[N^:M3?( mҗSS@m`@Yv_5UyPs ;Mj2w ~e&'ƶ<PӊZxѿJʩ6h|2QZwG}jdo]sg3DR`i_hHu>7%<$D9t&_x/nߵ\=@ƞFCz6Z=0|^Fck1cP؄ T~7]Յß%8d1!ʏJJm4șWcv*L:PUgA4vz& j .Ih([`9Uy!@gB*dnkJB(*mҷZzNmd* MUKvOC%H%[&a{Q@M)ٓt&yA;VKFzD{a]]'Nt%=$ya&hk=r}~)y6/KЪ=is'2XӴYU/Tryl738xfԅ J5 Wd%?~hD:ӡQO=IAD|dT{j d>_WGVb| h =Ohؼ|>#x98=ȉGS!8qۂ>9xgLna@LYf 6mWY%R?k{jbG+SV3X+2Ȟv:bn|žtfVVs6Itn#Q`5y8rЕxL!Ui9֌jcc>SfINSsh nZ7^ tMtFe00YBd" I H'Jr3 T2U P954ch 飶2(eBF7'AY6%ġҴzm Go#hBtmM1ElE^r7qZw vgJd;y䣖befzX^WXc9-@|7NГp+o_N9L]YVi6g E+o e(Nl3Qs. bք=Q'G5H5Nm}r 9tnSEKm%%\x{x{k}Zm!5]*VwԹGiiޢ I8y9]hq9Eg ,wuZ]Ŀ`Nendstream endobj 264 0 obj << /Filter /FlateDecode /Length 25552 >> stream xŽ]Ϯuw>9z6yz]{P 5Aj`r4F"\9V:Fpx.p?/~J￸>ꋿo>O_͒qW2>G*o~N>^Oo|+_ӝϏ_vogy=,n B=JUۿ?/p]} ߩ|Qwq)}﫷_F4z*([oDz-}U=*^/}flte拷'}g:_Y;<Ǐ_'|Ώh@m_%ˇ':oȭ*i{%jLJ~QIO;wG?g?gk|(mzK>irxqɾg?n{JnOZWvYk9Q%/ҝY/uGT^M/~..i iK῾vZ4Ix#~r>1,$yO3#6#s*>瘷/Oomk- [1ʼxޮ<ϬJχ:ZXURߧe{P2jV)(ip~,=6TYϾL(iybYLxJρ (o{FM|1n{U\z~%֙/tL7aJҜ*)sx4֙.A3騟G7Kh͛Ϟ*o2U4G1&vs5=?,I3]rYu.y}4,>h(iS{VP涩uD/' :D.Q2;$vg:Feɘs|4m%~:~OV+^}l9ңNOy)|lgN,h1m>mV G2WYۘҢ5%04,xh3oK 6:;nd^Zo3>uv Y}>chmCVI [LC֙VUYkc5j9/u^V>9gTy:xBw1ۺLU4Xg~[Mʶkm<M:Cd֙.{g.C7ԳFv%󿰕gGh:w?W4 ,2o%=^lЇshUsJA\h$}s=3捋"g5/b$4!,F^#d9kPRYg^/:o}xlc>{[M4>;yi]*?dֱ%5n8KGհ*R47T%Uߝ5uݴN?_X)Ιo. c{vtw|46 f<|sctJ !s5dydųƚ64\uϱ}=P(dYuFxe2?KRL~Y=&f:3ԙ^K KiVܳ-V~== 9_̒*wUyoKFS{FIR`lN]%)NuTܳqPϒ:YwLYgwؼ3pBZ>gr՟Jd$ֱ%uf(c%I:Kb͂1o"%sG}s0Yuſt%٣TiNuо*3 8 %#1T,}Z$֙yi1U>3CMYX4BGg`*&`o=F9BY2Bχu 24v#"̩b px}ӺBy)o2DϞ~(b<;Of>b<ܵ%9`~\XwMsHw,(cҜPj5:KzTY!+ͼ-G[cJCAWlgf暫lÌUA5K:#if|iw^Ҵ;6/weGX?|EISY,E]7¨2æ<[q4f%=:v9"xh~4Ƽ1Y:1}n,I 5J ;ϸu*>=tP9QyXi`0@m>'u'9c6K'fnԙӢL`<]K"eJ5!*(lT:|sN Q3 h&ZT2sxz/|1ŝ=~$:Eaq# %sg$AK +Sá w~EiHz5Nh@C P2φ}!`$b*LWA8L~̅`5^5̾+sc͒0xX> Ƽ1XQ#lBe1% "BW%'FMW=TYIɐwECXu 9FnJ2芑Wcu"Y03>"gь(Y9:XB#ՇV 'dvp pM ҧ+Taz72zӺP% Ck\BU _ytQ5E L޲bu(ŖfMC9!wiqpQnOWÇBJ^[-#nVo5|1qh!}͢5+lrsls",r!#X_C]}` NBr1X%>!3ф ͢DnTV2<5b~ i_Ipt:ý:|.,tҨ*)P;!ur!泐#ZG"X;'e*5| ZTnF!45Dܫ@IasA񌍻?E_3?*>^B.Ukc !C7쒖?#K-dд:F +w㒮m՗<6Ӭa-YSύm[Z͋{ݸSpIl|< NmZ!,\cYbY;Z)S'SI+e6Ef} 9>ig @ 9>[}nMfr|>Y&_*:^ۧX)鲱%-EⲓRUPU5I~S{!3T,Rs%.VRSsWFL>^!P5{:n.qa 5~;?iB46?E[I`~ր;? [=Nqsw^K;/%R糰ʝ%c+o${=͒:r%AY4'9K3K87UкQ xJ(<-Ad.K$,Dz0/#)V;؛%u.9o*mn`(Xrhiܒ/iH|v6,>)_75+)Xn9G)l|I}v, c[rr7V<@xXd@|uhC'%5ա|7),R}f&ҢB\gBGhh;;4_Ʊ|sii!͗~NG!We拼2tH %ަk=m8jI9n,zD!*t~1Eܤ2LTN >#aE)bo%HAOt AC4+" +.ߐx+4-Աs1$zZ/ g`/%/-9UckGc(2#)I'K:>l-a&ѿJl3)mp( M)TOQVg$OF\i֓A3_e_ aY{i BgPwSE%X#, vNv!sGP)"==`PS!3VnV P)neIϭj8z9g P۱Q|<)K4BGH፝ԼqUIaלt1KN^vERjg;\SR7K{>J 꾛*&%JZãPǷ98Kj;LK=Cy:՜YRm+Y*,]-jcW~J󳄙+(js9S`Kҧx*sԲ;C- K$PQ%vYYy:mJ!%S*zα=tɚKC/ڽyX){&2W\ݡud;y)}$H:Sc3{brsWJ Iiq~4eo"h&It^ޞEr^G O'9v*ɊRy!_(/k^?JzƦ lI~H^ЛsGsL]7KvFp^˙R~3Wp9@tZ˲., )?׌Z~>RhE^p5$4bi8_^Y9%Jyǔ=lma8yi8ə(qs?Coj j," %5/g?F `}Wꍝ읶4#)>^8rۇK2Kg+hՏS%:͒PS%c' r$^t3,(r s,Iiγ0|RV%UlsŮ|02, o7K7 BAPm'x^̗WRPe>)D|Й yV;.> \|[|.9r8|IZEz{rq͡3tQ:_jT}X4N]](sٮ78It9**q.9-vrJy&+qYgqA]uɃ?|xJ+W'.g-N\TCׁ;pCĂp"9r&O֖otDX.f碔|7%b%%N^91NwV= TJ1 YqY"=G*f$i'GIϐ )u;9zO8gCˬ$hqrn?@CPC//=Cwt\bwv"NrO$B&|GߺH^"Tzj 9d`;_jӪD}﫜\*1}Ώ=Cljj!2!i =*sC0!ڏzXrrǹ9:KdEisRsUY\;Gu{qZvX7}E(=8 s+r_ m}N znW!ܳJ*SKrFGdvnt<3Co#˾Ҟ#_Nm -ߵ»8kP?qx9Tю';zn3A9wiuugK5Ng(˙܊qv[d0jE"=Gm\"9d9nK>}c D9 4)q>p hfptFnKGi/8['Ȣ""-ȈPD"fI_,E俹gҽ,JHiHq2E K[Ef8(">H)ehE  EdޤY"2"6"R"!QDJܬC,ѹ]SDJl7$"%Oo"3B03%"#2Kn_Enң:PK$2A}u+cDJB" FʉF`U)9TP%hrDJeܽ9"T%"#Rp`jl{#Rb'Fd~ oHdCHFJdBH=3.euE e-Dii*ƇE)txN(5 )؂$Gc)L0z "Dp:id||#8fPR/H ="`23)+)ذm!RwCh3&CJpe yX>1@yNe'j@L?BvbxPMoX| "%79k RrNb"^:h|V&@O DpAA,C@T,1N"C[DJ$:!@f:KtRdZ1RUE'.+x..:LVP$w8ע!O1D 2T R,@"F d̒[1DPG=Nȼ"tlCd;[CDJ AHܣ:Hw || !%D0QITN 2_mA*) `o #CUܘ&#lȞڌ !0rrCJŁO ˣ } AsҤ)GfS b S\S i<AaVv"<Qx6CJ #j@ Ut82 Dl7<5D)f^"-O&;m) ;dϨ<Z}HVn:yWhף].Otk"*)!@)8hOA4$e 8M% !8ITPw5q|5Jx=%cE9isxņ!0trC cnWk9!X˰LnVIgAB.I*䌅Nlfq/ A{ r,v At]C0$䆔/88( &fw i'7ۭ:o$!\%%+C #]Ǩ]t0=!Gx,na:t92E5(!dj !0~rCɈBnz%owUpIؐ; !%%cC98 AEbCKXjB RC0f?$w%!tHDH$rձU O@[7VDFі\ NnHALn䆠I 7urCXl5 Xg)@rn418&CqCШ"B3%I1!8d+9}Onȱ$7ġ!pJQ, !w :+n:io[78# +pto rL I+0D^ \qCS=!P yu%!&nGl\, $BnF qCf4[ΰ $nHaNFˈ H*R #rE!nHAB K 9D I7 ( D*yܐcI+nHD&74!G/p֌bDh)!blCпCU(0 AA2jz![&O µ( } 6k6Z!Y*PQCVFL<* r6 yE落atb !:δqCY-Fo {b!2;dq"CRƇ-CQ3(%뤶!whZ Cvv!{kvb EΗN͈YmNt39Wȏ.}"t " XX 91$ wyY'!0G2 D!!x/"83"nCaBC8%GxC轅 \$_+8/}r؄![:@W,AA?=d#l<'F # =$Cpc !ؾ'=dk8$ =v󗢇CFezDadC d!i3(;ē_b` f fɏP!#U$ 암!{n~l-Z?d DCV?R;ZKl!%4-RBC`"]]ۭ=Gm4DRhM9"[3AdK>&- |`^DY: "X(" 1Sd((rz " c#@dC \$nCRl~ȖFE3‡l-f|/‡C|)0>d UC!p!;/~^*t~-YD  T?a(:HR{DW,F"U"'>: "G$ 1{ rx?D ">w WJ&n_l_bT۞EY&"{)'9E9۫RNn1EHb8BDp$V{X,$)RYGpD Eґ"H("@dg rD`<+L9ƙ"k-oޅ4AdGdM,,[XDpcJD/ȖLҠ"{~8 `e!FM܆V!Ǵ"5XF(!9#D2-gZa1 !F !r>,IXfl  ETda "e0!*I!rV!D8^O2%ug'5 A!")!o!DWAF"+cAPDTR^K ?dk]Ǧ஼!{#\hrހ!{;p%b!U rmxvoLvY0] Jr^6$'t$*,at@rH(B}MC8ݱ5^4Js^U[|8![;:V%$ƑLڳr!iBs|wn^و&^Jhc#N9mwJv^!G#tnɪ#T!{c萝%ctɅ9yC?etȎG"bUbC\fv%cc WJ^s*eƇBt;}JFmc*CX3?doPٱ!eVoL~ZJۊű2cC14?d/;cnY冇E΂'xHYG) z,hɦ_dzQ@x7<=Urx2Cbxچ Cv$bz o!=d/L!<.zZ 9!h !G)!Ԍ39,T%7CvnvȊ)|!{6:yB`'8!D!;y,)ޤ_Z5:dop#T 䐲ˀr4!h*dwp0S>7̹:\!\&vHq!V![:Q"CEN(RjnȖ* ٺ!;GIܐқrPqC!G3(ziC:䈿Ѳ9Trrg&[o^}t rS%Y39"CO;dᆇeؿ8<$'aƒK>}cvC9hC2V'kH}>#*yzJZُu?!<$b <$b@ @y;$9쐿x}u緿e??"C]D$G6M,% RX֌m>b9ɑbHyG(OHe]T[3D Vt?$cםO ?$W!%8jC2RAk{3=$#IÆd>/A=W!h!20b,IROt@'S6;$ŷ;$#=B`d>勒:E2!9D ;$k]EvuHcIW}ÖJaۜ \ Ac4"h/};!uoC~HCruG p!!PA?$㬠#U A~He3C`Z"kPZKk_ը_qu:B,]CmMA B$#Ud` ޙ :3$Wȼ"96"!C$Dz%T|ɱ58xg2D2~"hUCܪY5٠"9v ibQ ]U"DJT*2Dw!2ϐ!Aaég2 $t\ڋ!2ǖu8"C%*փ!Afdĺ`![&GA VEؔ=/"DC+N^H*_{Dd{"CD0kϢԞ/ԎdD[, @Dp$BHf.7D*d{ivxJ5 UWRxϱ4v{F(߄=< |-HejX"\C?"{5@N'8 H"  O] 2Dr'wHAoAgAf1AlqD0z#k5QCpLs. oJ$bDrhˆM# $OKI$#Tܐ:et݈$%s0l|{IƈY@,#MG'H% cD2~sHo #㜸/<ّ͈1"R(Õ:9Q##aDr&#\E =,>\ǗJōB H  ĈȤ #+D!c_D1"}}'".[Fqm"$3-3C‡ȆcT |^uG!tC0҄ɱK H #ALE|A"9ؐ8"yMҜt-#rˆ9:kԚ0" =V"eD.H(D)I$x$`I$17HKH"GH!%-'y>ꑊI2I6D좍Hi%_$za$}D6hI*  /JD`Ɔk)H*#Ҩy rKs $#[NBZb#e8" dSm#52 jBPg\ϫlHjA|-lHpD2Aap}"%lHfBFD[@{i $=$cI"D矒K$Ka^ rD0GkHH~ % 9"IX@_}`/&ކшA$?509"\& k:O繮#GYDpUS:MZhퟭHdAk^ yCDJ aL׃hF٥/B=3Ls0nY7"#:&rqںi"D_Q*D \DymD0E<7d|~p"(֦ MO^ 'r83D "Dr4O%'JD‰pĉ V'r<-љ'4<(+z?D4 %2{<-'扠des2KNHDؿK.܈d z YI,g|X")1l ,Q&Uj\+7R$lLI"hϦG$86_DC|I"`IFl,",\Y"E6!Kpb`DL,DVd3`"{0|$Ro.l0}luUg6?c&Wa"{E07\FT5ө}[u "L0RD`]x:,DΞJrBa"'MX#V4›&rND0ps6I4G-o*q0qY-o_lFmf?ђZG"f@q-U،-)2_- hINB rT2㽄9 B w ^Hh- )/ qijxZ)ij`*A|)HiA&YRt, 3I!ljg$ 0<+΂T5w4пpYRS݆tt!/³;-u"Z%gI l.JCs@/X 82[TB> rli|4P+$!"|/:ςL$g>xl5Q- -)ϊùyG &c8\ha+ S֧E Ort- ?@:d ۊ?/F rsahIxa d0fD #T{'U eYxZXiZ`$8$,C@ ܋P*UkgAG5XMTƳ$hQ*oJ,agAgB!> ̏g9Ư,}V|jB ^$B vIhms`z]ZB !Z`i?qZ|7ZF@,ا`! U?jD1Sт'e<YYeY-\7,2%4K@ UЂO`p @ b-Uhs * #ŢE-!p梳8΂΂ #Y_H ,r"̐rx] S5, [r|,K0uϲVtEpx n?1΂>cYIs%F܌w~pt$#y[p,nY )Y|h4 !%o2At؀$m@ G_.:Hg-*8 F¨Gf]#Ѹ>l |brrYw ͂DYyfd,)pf9hD`@_#4KBB4V}QifXf[o4 " ,H͢*=q΂mR%M7uk;Vnk`g@gς{j,V|AYEs,;Px%cRuC YI$qfګ,P[fYfl5̫b-KOR,IQV яf.Iڔ5刊Y*tr(Y0Ta *&䲠\ԐG@YͼBu6rlQXe¾Hy +R${gߏ\#:Of MLUiN1ewQYmi^f.* ,2;l)TAWSYv,0$(fJ* BGߋʲU^SYe,l?aYE,[s2Xx˂O, JDjzSb. 8NX˅ea".Tg'ʂgsvZQY^,{KRT8AbTgqZEO6PDe]gs_ [u/hʂ@bYa9l9\þzRDW兞 r)&ʣc+&uv'9/#N<qYV,g(l]=\Xm,eA4Fo#, 8Ze9²,;5X*1B(y=\e'W\#R %piaYF,aʲ^`(1'5ZI͢ rV!eY2xe,;P5LeAstRY1%SYTVq cYvo˲ݣ,;\g.˖fy27? fٮ`*|xњUL9qsy܂ŲfY(2%, ,G8,Ilj0  YZz4 ̲=,g'1gqFea/"e/qe)La̬sYp`.>6e2eG\c.˞eqiqY0nQXp\on1]$fhˑʲ3 MeYPe+l\UUYYeى沬d cYv~,[6eBaHj VtZ%ʃ^w;:u4T/*˖Me9n([`шEe}nmYP=r ǩj2e@4BSYv, <΅nUʒYSYaJr$AYJ7C(N2e Y>CY*QrdxiAY>k>dnʳ5ʲs ea׳RJU 尃`4_@Yඪ*(*xiAYzB<낃ʲFʂ,Kc&ˎ{dI7ν"Y*QU/^ɲ5ɲOɲd9&T%D?: i&Vdʁ=e% Џ;KV,h 5ssw/kA.DCF$O#YJ4e+kF앍,&lpe$KZyFP'.VV7 L ɲca3YWvYmXNNLYɒ։N1Y;Qb,eʲWqb~*}[C<CY:P-rDާץOKe9oC*KZ9Oۏ_;[>~[oo_}9+|߾9.[ƙ(Ԫ^mW^^1/S8wq/VOcdz8X2vǝfs_Gwcy?5^rQ6eϵd}}gG,W?y}پoQ|×S7þWL2.dVwFQWΗDTzR>_wFs/۱fvv\}źky~N~Y#f//#u~w-|Xy!/xK1[M ?SWqS}H}}M^N~5f$Y]؍r~1\ϼ@C~~%ͫycM=kXٷix/oSo~?vGz=o =|>w>8cbLmbt8tYAQfjp בL ѰF~qHG!."-泓l;󋆣}i]@!"d1׳_e ^/?-ZqsHx00 o_ϛD>a?b=7<6`w t>GqN\8O? vA3]NkNk 94|k埘]owr\G_4_nw>wM_ûĥ_9O5tz^ ! uQ{sq@[@>74`endstream endobj 265 0 obj << /Filter /FlateDecode /Length 3741 >> stream xnG,4x}F@sHad?(Mr%[TUtWp zPskެ(W/ξxnz&Vgo$]ܭ:N1(WWgU r!&~F"F4!W}sLqz==B1z{赙^ZFzàQFJp *vύ6Z+k-!rxo.qA[7[;@x9e%VNabwos|ϥܯ ~%;'S'G'],{cΌ.1B;dw]~H:]ț.E؆dw jʵ?s.jKÎ) AتmBoAD^1sܸ:! Ah͖*eC SGz*Cȯ\29)EtlD3T1`))koSE"vќ@$! Be,0\)`0~}"\^2lorTI/#D}2Wu3ځ?ex$v{7b9ݮre?Ι) 'Mڴ%ua"wP'@os9P ˹1atՅ?Ƌc."Re%xgaUy5jZmJ݇|쬜=05יy0JoAkgg5hWo 9eV/5pcN3!nhnCH\?yX/ YB`zm=X@efљ .gZ6nXC|s:Z\Vt TIW\%{ژt.a^D^3qH|uAtDB`Q.lym6nBXtLgk?#5$DQ J:mǀG \ 37oL8yD9u.Wwk@C>"\(rʽ^Xo}wu?vBoZS6WSB&p-w9uB^`d5yGN(ev tڛ-8gJ\h&.\:ڨSS!서Uun{/SY7Jbe{SudSn 誒Y,,Tbb͞zN6<#*⟢^:^h%S(e6mpZ_w^{8$I?iڗq}ʖLKڻ.YfkNl)r7쮟?Lu "PLטغy&r?qsIϵRD]ȄoǂvJr!`>G&Fҟ2PV0h1Ơ-NhbWA} Ph.V;q,08c*7yo^s-ُG-6 %XE% `p5aR3kBf%MЀkz٩KNK^rG1٧_xO9 "1_`#f죈 G^o6Da o o" Dg` cɂJVyvdb/>8R~10ڽxp&' 3VcCG3 Lkub:R\_nnJ/,,PN}"ړP5~UK&cgۖw[?0͒9.&CdГ*Z-}ۜNYӌك08uy+N vendstream endobj 266 0 obj << /Filter /FlateDecode /Length 4277 >> stream x[mo~8^%@ AR$h $P N?uDstrbwf%{7mP͒y}fH\ 'z]_Wb}y%uP3}Q^ҧr﵍ko}]]^toԾ܈HlPI]7[ul!+dDb1D]w"iV y0^nĐ&ތ7ina,WA(+1h=MKL%Wqx 1O} 2uT ;=ۭ9H$[osHoVdٽY8Z$ogӛA:% kwLI!j8<gu7ޝ݀|H_!PD"upB-khm1 g`̿J_pd@kAXSk*?8G![Uo0tOMUŞ-쁯P;|Z"&/*Ai% pAH1K p$+5ʔCDn@V;2+0&6"E;fRwx‚ Wi=zoXE鈎DDՉ5|5Ne ʡ ;%dNc%&3(HZpU}POEH{T/mg sJ˧=Hm_l*(T>HG1+\/Š f޴K0~"B='h{gxA*ByO}>Tht'Ղ"ye6[Xd[{kBHߢ;2m,ffrJjp82]f)}53N?HK2Nj=f̈́r䰟k.gcDomlee+YNG= (V$kd X#ux=dPM01c%1;{ŻnӆQxsn^W]O sy;bf#Bv\2U}{M Fi1CX^,Iu0;|2{9@֠Qh`Cc0B`L|Bd`&[ 3IalzCVeFV`sng-B W-MrMG'x t8jc9bMy ĔP OI 6`bG)iI2 L_2dC2{CVkE24)aq]|˞J/:ErY$62?rFpxvgub6u oOYPMMbFteCYS{f{o>35hydsF.->ƨTybTJ1Ƃ )\~ h/Dd}"TPf-#c:Ta0,&zsR/N~93# pRܷBjbW$9nl/5~f̪xʎ%Ϊ0]Iߓ*d)Rh` ܧy~=CbUHLM` A%~AQˀ3|0YYt4wݗ1xJ# }ldy8]хujPPh]H'=V ,i\!RvOjac kc3=ޮGv)#ui:q^I${lXv{O^ \&!xNZOcTUoמh.Oū{u81W'wr)'A%R!Gh58˒6/ y-Zdߙouw!cibdj/j@4ǀ{zQϾ*%e]9d< ޥ}_ } d=5f^ҞH^M sESw$M ӆDnb׫*6O}2vO[5p 0{~۔t&UA(#YjR1x4d;_2e-u1OYWkn.W+$s4U*_Y&؜[ ]Zډ>b M1ᤘnIXޟ/V߮;Y~m7y*_A6kMzm)|'}z wzҍ"0D3~c'R}TfW8J Б+\5a*`3:EwxJ@qPkG:ShދS1`>Z #~b bA`xO`SR{LIVj_)Q(I1 kʸ UQ#"{l/y"i4vK@Խ|CX.߽a٢ K >Gԃ]F4q@ EUud~'RK:Fo]L9ԯA4\?hpa#_\ ZwM2Կ1_2t@7!FȎ9A`5:?iV2qy ^@p ^$"HNbp Xd,VUFZjkհt5(4%%qCᴅ.t21%~x=5ɵ<6}Bo.>KQ)RLyμJ@Mi!-$>@-| 4kh/],9o?YۄW?3oT~|_,O aF5vK| ?''%GİImAm"bFI=>zuXugjZ[#~Oj~[Fz5dZl_IJ"~3i63ȋC7/4Xz gPˊ"@̇lw6SS(ùx2Հҍb 3yd:ߨ 3/@^V)k RQW.r;:^dhS(Eo4w7OeFؐMdYS?$>LpKZ. v]aendstream endobj 267 0 obj << /Filter /FlateDecode /Length 3178 >> stream x[o 7G,4NrE[kq=87^ח4#j޵ݢ({OPEDO3˙ʿg'Z;[mNluD?g׳oO#x飈rv$*gJ^8Qɻ\Is锍%J Bw=_h{-M‹]|%#2ð!*}W轢 4 K`wJ B-/Bvs;M ^ȭcu7iX`s*4`,ǨO:EmA˞tRO?t`.7[h Bn9_em!Vo<,ul ,P}f&,M%>gLK:ݢ!9rY %.ҽ̖VWU2TRVVWRWR S4l쨠F avocC rAG+"!TұDB3q!=kH2+;jX2̹VaN*fp. f}K lzFD PHyi'U\[v2,Pbį767y@icYP^pJs,|?΃)Sxh-y#v_qaD}]V)C&:ʄ*9u>z.)CpV7߁C`0[xyX)^nqB/Φ eISl9*xO$XUd􊊠Z( /Y i 'jXĬ,hu8`/RkM:b<±FաGA y<12V0kJ[9dVvm~bPFm;nΦ. cI0W@Œx q嬗Z= blHvN?9sƘ%.B8/AFwԒ8D8G ׈򍛠&rm;U嗼*4phhNMAn:#zʻLˊxHl-67kW*!c kenmB=хܳʖ=φ@nFVM.@Uf* , \ck{aG~/d˲ Q'QySe%hʒoYJʚP7j !a] ':U䬒Y dqd5\Y,ȰSi*4fg7䳳d>0|ĺ59/S4kS7 Oq&ǜB=2l/7c W(Dss߽g2LBD#4 hRhsESu<&bҰQITsbhȐrG<#-Ur:zѳyW N'?8;6ٹ&eD"|~yS}r)XIL+; fG _p. b/ޚ {^Ef] )ȷ \d}włFy_!|!-x+W^Vm#̟Yݱ T֞w$2?Qo>Dݐc" *ixzv;l:K}$[s~wO(:&:M +u塒r8}TG#x;e]u܋k杘ӆV2fP}O_Xk]ܱ3yl}y0~tBHv̀4,VW:;%)0'd%.x3{׾JD lC跼S+GKpK!o\ %+l5?6ާbl< 0M2OC ➌+; W*nW^3򴄊t($/Rl$B"$v䯮|3S`$Y/ \.oK[aO֪TH j%.Y!8l/™HR*-s X}OBȨsjxdǢR{a,Ai9Mo;0>)2V G'X"VK8⮕zRM. #cm"&J/o bKyּSYX_a Ue[/u+s( BlMuP9vQ|}vQZJ7)``M\p 5̎Vjɚ*/U} 8XQR|~C0cgwIE\[+^5Ffu}d]|oƇvۙMhˡMYNkYX̚os(S:;<qіV4B1ΰ3ǀ VVZ-j2Ij lc_C _,jZQڶvSmIy؊E:@v954.5_g!mh#4.G0م JE$F #5pB4zM)th d}*1b*:"٤SzU fVɑ|c1DCRڂH@$PUO򻤞\\X ȀQ#AW4#kr}}րݽ M~;riA-_]ԳN?'w pAJِ[@QiQ}S G݇vd^aBۨ9چcA-bt҈GWoo|?{==&YzJbgꇒz=H =?~y;:?9>ҎH)2"Q$JRAF[ȇlU5!9[s̶DngO(ՙ6eW{x`jj.4tl{ne e 7C͎ 7;1zO6N8endstream endobj 268 0 obj << /Filter /FlateDecode /Length 4261 >> stream xn\]G,tȞ"!EXOud٩UVs99ʲe~=˙6BY89󣟏duQ\.: `d"ˣO7K/0:녮n{r!+gMaX[?%`O3g``'=@Yeuv,@"$ЮWtd$UBZ0>%uUM{ЍοREl1pפ|ƓBȠ:lx]ZS[J`\!d36i (l.UodXx 3^J#Y +4\.^ыfkzMQq)<*!Ѳ!mc}^L(+oXtTi%pRƤYz8Rҍb'jx=]K>q &㺁[OY V= I| U| gx7IOHZ,n/L:Kp)MTw_U:믦09 Wn!\Oz1}d TL_Ϟ.{Hxب;tj8O/Z"57_2/ew,!%i0WMnm$;X~x|#H  IPM㱁 m}5aO,֭0dlY'?Bc$1,aB#YD(.'6~7"`Q5~BEVhdʄD~ .Qy%eFdk jdkVlb]$okSb#$dX·>\l]@4ó`'zYuF8yOXM/m2XG)!vwi;{C>NV"4:JBlW {i7rwPd<}x뾀7觖 3X\Cݡd]uy% pSĆfX0}h "4pcCM ޔx1OU.6m?,A&o^qƒMa!U)hb4X97d0&өh簔JTԕQvJ[+eV@J4Ga۶ksu\ioFb—h+̍yUnɜJi;\_%N=/ 2,*,Y'* iqBT۷dGiGDJYY2IQz_Zh3UWZfqO єiCR8`4F5 OrmMb;K؛U5 ϕT%n8ϥTǮV_j8rW R-T>I=y(84|7tOja~Ъ&F ɛy BZ_eMZ_bgIvuۆK:bKU΁O9}ظf֌EWHS]7,WHWF"CYT~Nq]?o&n7g;`hf'0r}:%O ƔJW'Aޑ۞<1|%MI vD$MAT26yRJԞ^yq@ ci-rN1ֳ)'pgYyT[2.Gkz(z|biכn+A 4{v ):G1<]iΓgۯ1*ʝZLubn}C\oь^޲S&>J%Y[|]Y>kRKc Ak|h`;Z[)JA=S%%dRX>ki l9pZBk>ZM \ A/e"Dg&GB_QAjoǻ]R"U v~V"ֆ\nS7/kGǮQnԎqoO`o ]uݧsq4ʾ'77%\>x [XA']̉1"zN<1R  Q}d/bu˂wj- vBruU崮 )j<+"o3 T9.MZ>.}چ6 ߵ{iXE, >>(wvx G/q ק mh8H^TD'pL/tSƘ foe gPj:! pqoJo\ԎmJ v4^iνl#e0YԘW%]G=.5yH:{Ȱ{sMe#&VoՀݖ Իiy{DztM:sY~VvGT#̓?D5 9o᳖]_avn|yOOqgTv) ӳBfѱA&saU)I=t[ 10]qQEK"H"^f)X6×2.pp|хFi~w'E 8i;?h.W;&|UEt{2ڍy[%>ξsb/uaR\MRW]ڇD9N;"f -.ۋ6&)]yނӤ}Mq݄ j}Cvd5E\g8rɭAUUaE`>FUDzr;mzZcL>E7)x!,R>8S#&WXT2C0hapJ0;y4"k9+:`TYvy 7kfNRZp &=S`! ],Yl!&Q>[ ]Yy E)㷶Jǔٖ̾_"͓ss_y4~M͔h4Zs~p1m<&Y-94y<5^֭xf񋼆';@sh0]-낺-:ɫn oful9.l9{ۤJ7΂D&t^'OA*l݄U>9}Ԣ xMsN;:mqo󰐕BQ{n'dr7b V{dh[YsYۣendstream endobj 269 0 obj << /Filter /FlateDecode /Length 5093 >> stream x\Yoɑ~hSq.},؅a6,C3c!ьȬ&9yPN2+88ܨQoW=pxyww6N~h}Dlɛ c6ߝ`|ʆ4|8ZkG-lDp #+q0tǜwwC|1>zixhR. [ڐِ[\gݰJ$e/q0\S =o Β`W 0 7ijCʞ] :cclS8``͜syPbQmkNQPW[Π箖Mך[qyZŗ\<4[ 9O 9\7iܶ&`z>Vh[hSl˦cVJ]p_Z1Z°K#ѹT)$mtcQ`Jާuu ÷ K8LuJV)-ipPl|i805|L微ga[;0g1\A7X*YX6?r~ڧQ0I78_:3~F񴣹֖Lv{ -~e2`a6>-')t&zh( %̰#h.JQ@b4D;iZSysk<7!5cYO{DB ݬu9.dA^4w@''oN0})A\ٻP uYIG |_ a4iA=VW2]G 伡/v[Nd'nC#99-y=qPnn"cCdDu kCNt niz5ZSf<\K'P6oּoͻ\ LS:]'8 !ӓ6(EDѹ"(|m4[t>y* 1mՄ=eq̅}TvT,bOAUE 2# ]}eRCޗG,p$&`i?yj$@|K\,:m?˱C5D;Le`Glz~ʁa MY!v,( ̂B, hI W'ůu?: QunMѺMliqlUzIzՀ^'xu&Oq/\>!cwLб u:F4ǴSr (,L^6{r 6;IYj.Y`2`i8_3dgs$ <5 M]v8F wC,6]m_6Г84:W!,xTݻrDQYH3fab5o[돭qԼn!H-ykEg"no &PwES&,V q); Yѻ(/]QL0 <.:n5CRQU-ñ"gț8k[b}OȾFÎQ6t/[&H Hr&' W 0 '>zUoߖX_8m(}~>p^"zN־(dSK\1/r=<( k$:̊ҡ*&VgN@r)C ~kpDQ^-y݇zHG\v&cZ<} q6aKg9If.\ہFTmpf GM*VkCnRh:M#lvbBgB~>+3sS6i e;EW:9留Gt P#ϗqW]RL =S)|Ϟ@1oxro4k)R)x.A$?7}*;* n/kZٷ52m:/aiNTԼK;T<43x`fnKؚ5Skoؚ5MKȹyn^9`Yapm%;!AǯB|^2LLH+LcW/%$(7-?UDڂp'ՎH5{@@"լj #1cՎӔq+ z-,ߕ_\:X򈙓-#K,n%=۩/^k6֛Iؼ ݠ3<@Hz2:Y6+fF6rep`b4:*eF7=dvJF'kh|+ԗ-<>2D)_H3+5eV뼔xWJP|;!E#RkI$ٚzgc'+_Άɗ&=E8VЋqʦĊdLb3>?6 9R])*ክvnj0璫?%ig60'|w_RY'p}Z{owE#V͔6(çS<8a3;PXدgyۚyZȹoTNo[Mv+v KԖo)=һHZ[]ueݍ0i( , }NqK,bӚǯ2&_YEUWS@tVb7lrm)AgPeױNݓ9VHAʈr7:7zTHc|fc-J<@ :s-o_&VDU r8`2zӭA*s _za-=(D&py0%8mfB#hW悵 䏧JA0]ѐ>nog(=ֹ9,f}*gӠ9SˋZ=&={]}Euߡ<#`L:t+C szuݬޮ5dUT7"d/=CFI.xдJqS: UM7xݳ MmqX.xL7^>eZeBXzajK>tx ^>Ad, ym+t.JKYxś#hǧST~ej_˟ȞJݝ7V_ 鑩?5zldGmዠ n:Dv֕Վ4Gg߬[)wux-8<ڿR"I%k@Z,#崇' ވ[6lW%,_0bcV=fx#ݰ G^ 8cο4kLq q^>Ts`7R{w HBqʟGo3W,#ߖ<>τ6q!db cDm;_xl> '}MY :yg:./&ven?Д {bid6rd@Y+<\0꣧1C 2g6KF9yPÖ9%91~P8daz잞fRR,΄wG$Q,ǟ3FQ, e.U ~N,e-ABL. 酻PqZ{U0kδ98~6+fq~Cmaf06hײ"*v:= *o,pƊ8f^R x awJx`ւE05QnQX0|។=副](t Ms0 ){;_flNţ VxG$WL Bz-A> 7eV0M}ޠ.R!J3~/$62y;+TJ( w}ep{>;6L6pFxu KּkMqO`o.D`б5b zEұĹ(=o#tҘ& vtZ ^>/ `U9 kSPo銥EL?f"j ?zʽwɩCt?@_endstream endobj 270 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 1727 >> stream xUP厽ՠQhwo4BL`ҘHB$SG<;8;'"DAP9䗂ESҳQϡ:4ɤȤjSc;v؅3\::37]P4M+R^y|^\FC&v'4d&?}v :cӘѴ7Pl3j5&eD^WWy9EʔF1IBe!O6ٔhLuW[,}ijJ֤Qԥjcz2PdRnѫvQ[A_l6E(1rlZ ZAmP?TT*FePDm*DɨŒlJNQ.~HrH,J;C{C3ǘ)y >n[.I>`BUh'\gnh0[ BC1"}m@Wd\MHl>21s:{jk9Z$D%u$dZ$r1zt貯Eɮ\W1^}~2 E,jj\“ %ōcc7V >3?ˮA`kpY*aN@ Cl! =ӓ}O}dQoVުw6XBG`U~ q+OM|t +gA`Gyrҧf +NōߓzǷ}vςK Od+$ˤ1ī˕*6BGTPPWPۘt:j2V}y_! z"͵4q VL2:]')l`O;FlKuh[>bn괤S17FxD\i T晶 m7Amf*m{*'[\gG1;FV=L[=]l m\&=7eZL: KRW6jCKE]uBkފ5y zXu:bg&F0wc?P!W]M5Ys_j=js6:t6lOerWd6 ?37{a@sд'Moyvq63̣kyt|&2\zWϟå,j{ֻB/yEn8w7g01dmx/R.{wi-iqtvݝėFdb:p@vb|6ȾW6`нpJ @!Fs=MLqHltӏqj15ӻW+fõ;%.7vuA㲃;6mY3ª1oa7?_n3P5endstream endobj 271 0 obj << /Filter /FlateDecode /Length 8132 >> stream x=rdq?姡#~q%RlT\%>"ar"9ɕv A3$wWqJhդW~s_=㫣4ϠGe*GoBheCܜZk'ONJKt9 u9hdjO/pbA)6W'}k.lκ*E_boasKuLns`/ JMo@G.n4SbhcO~tߧO)-cCN)@3@j?.a}(^>*.=y:]ݼl:F+,5 EH@49?g8HFy Isl|)ps3=9e4N_L)X6m2A1#!:0L!Ddf(T^*Gbn'ɛ͏D9M,HPTcSPn6 $p]~wv#fq|Fp4@=h#LmhY4NY`}lsaa̤BAl+w3%2js7ld|Vap\ԛ3&O6|t6TeU>AFp|- *ҒEQTdc G` "Qθp-( C}j匋LC8fh#!=C ,3 k̢gL,};\cx_A>pS!CM^*(mQ ]qW J -HG@ -[Axm/05kX-('*ʓeҼ͋)pxSϫ@O_ryJ61 %5qsv 0̭Zd*FJ Tsx)Wx'%A;NO!6,.:P.^HpH9B7Bs&9n4!sJtjh,u-0+'t<L`Q3lŔn-"@S(~zh>?xtt+/Vk9ߓ:y<qO3O*r}i[ |B*%zJ"hm#aȑa~<}16## qѳUXXSmCv b}2`nZ\(ɂSt!C"n殊qh'bAJt* 61[acA aIm j=MUs]a΃tZ{vm;3" (7sgz#Fr$T<!zk+#φ:&4HZׄ1$'FH_:00EndWh3{xGn ;:p)FBˑlf׻A<+l|E˰]|WW,Ub*ӊ Xd8yWV/;+#FWݑONky槒qu p')d]CCuh$3(?s!-0 CEd[QOs,qdP-cY~?r>d#xDL7(n,yW#Qw\ H}BQ& =ro ӊ4Ly>T<ΨgdoNSM VIҬ:?a&%5xx̊J@pd,Bpmn;7 9[5g=F'h2|X'*8q::ne[yv2hae;+ y=8u:1H/@[QRTA=? 4$#v/ՙ}h<-ٟ͌fC#-ä\\BC #w`*ǵ3)jv!WBmXx]nU k&VP.ZJhlc19J,}2-XHdYK%V*EhsW|Hpk~ڡ8)0~mm^cm͂nQ@&PӘb"uJR=Bv$LH:*Lғ!0E]'+HyUmojYp) $`@>Y2_- c%"-v~)%kƛ :mol6Pn'iа$%eSu"95!cխZ/"0ws_okw'~8rȮktVE Q)H'VFXA$M@x vBpxULOӞtsݫXpBc7uw C C8TtPSm 6ŰW16/ÞBk^9+jzGi`/x[ J{N$ʴe)Pz%U=_%-KEڄa=Y[H,| x]`㓃.p ;عh'YrhYN!6gKX(dNͩ6o{W7yY6_B_jU*s'/v;A&d^E- u(z3I`>vS V^s :v=LVN̾U|&'`Q$VcHafRѦ Gܝ`_ޤ!g.Q9Ss1qLw?UJ.̸%Qq,̀nRZm[{ q6c3%]u8'pS)# q VD 7Pr<2*ۀ>.KU׷}Dk:U 656_p C.2ۧ%'*44m*}⻦ADw2&%ҜULޫO*js7lFRK3 ذW{[Z+*ʟs#%Hm3sJ#/IFB`|^ƒfy>Ij~\A*X{; (!D_Wu|KKi8Km Ac@.)gHr9X;N9ݙpqk*M9n4PWR8iVTMj6S/ lGZqG˅QkԜ Q1e[& 7 /xxT7$ңhox{W/󤛂r<Ʉ|(i3\ⷭ] ՓM2^.e X|F#oI0VgVHo5 VT7/9:F㍮2a=f8%Mju[R,z})J*F3fE >Q3DKEJ$}o_ _$>t|UPsIA 6ɳ=Y@d1RYm3t/ hBd},\oPQvVby'C GA\&]S$a8k+u&έ%V& &dF\~BxS.57%]6 T-җYp9*4՗hihiPym@\Z Y5:N7d+@?xFu3dLZR#_~r455 Rhp5[%މh\mqķHI ,:ֻRkʻpg G# )lajx|I-|>M MCM5 g*VAdΕe3!4a2y',ā)8 '!.B EbJQ4s:_"$@@Xt*5 RbR$+ӧIoK Tf;$:u2]@;&M+($um ;k_{Z1"AۅVxiJt-Gjq~}zCNͲIPI% rjƲ nȽ6OyM_1\$mDI ^Kox,Z\Z l*̲iN;; Ջҗ3KPʐHmd֘ -WbDB%wfT#:|s"xw`7B|WZK$~'q'ƑVOɱA(O=49MpThu'Fp/˞><:շ]y2!٢^.JM@5B@7v?ϲ`,7CMQ,?mS!Bm= tFڶK~ OU+\di?҃JȚ2kJ,?4f0k(|rj޴D! MxbP\jyױd/+/}v̑WcpX6M KMah$ѿŲ𯯫$.Mqh;alx,kf:C&F=T㾢y1ކMUqaM26p(TռErt/A}>_,ˡ?iH>== 7Y=,c$/u.ꮅkoXh|kʓXS{SAve˓c\*gŷ8j u!_b3H%qCL3}`妕umLC-[t.n%?1ؾUB>imlϲ"|s_ e'Ae|҅xϥx>O(nMLix4xQS79c+._Y#&{苯 &c0Q4oHqrb'`gJSi~#|lmKj% Trɔ8C\AODsҋYTGaZT_̋/0~`Jpl svj|Xb)كP31-"ⁿ:m\LDu"٥\35ho ^JZwѰG\\6W͖}]l90^*9Ƿf"Zs4ﹷiw `8y8,'Ʃ+Yyd6DbVm~I~^/x)X6Nakx]}gM&41G'y ϖw+q.wq7GVTϵ #=XUo+Őצ8~OڇT; |*T_űn;_.;gdE)Ff:hζ+cwQ7H@WSw"SWo ּ9Yb4aY 5[@X̂g7[h9EggB[~y&*D>lYq/ QIѺ=#R[ Rܗˡ{6w IRgJ.aū6n'T]^Wb"cA.]t VMrQL < i ׂE$  p+2Ib fr@ηpjwԍ<#ڢT6ŰW16/ÊX)nAgGSG Y ]endstream endobj 272 0 obj << /Filter /FlateDecode /Length 4422 >> stream x\Ys~lJ;}THRII%?HCr_n3hpHJT!u[^Wtqǟ]^db!p QD:|{_ W>j:8W,kb\ыmn_4717*EfxZFzCil/RBEߝûJjlFM ؚn;Ώqs?1cu7kܾS糴.l X [g{Ks >BxsGc'Y,jXvt:>]Zj*mQ2!S~σ3 (-[Uz_Sai ǵWVor33\ ʨ;m^ֺ{T.K]l5him4L!mwK8UǤ^ІU+&ţ2E2l#7ßg>B.bwij,4TIf.1JP2j'b4h)@@(CB+kCQNAhgJm6xEhmwk 0PjvU95.uT EKƐ ^#wWr[ɛJTٚ3[X?crąSA$2T6^#/SZ3&vYo= ԎOAM+wbuKUFdL&9b;c\Iy-*y: +k^lVn嶾[сʇY%a]+xJyk߱{dۿ=י$1c6}4餄6L(QҮF19m !`_ l'I,A`F;O0s<@m%T[=U(i.8 Xrf$:9Y4v,Ge0@,[ rxl&0iC2KA4֗_*ζ:346OWueGdG3#~  F {:H6%F5h"'gyW;O)g[\_g ى/b V=ǤX̫ɰCF獲6o (O5YRtR(bKnIxS}Uo\"I h cȡDΞUJ/[O<bxiiCDa&vIYzSP͑/x9%G[v= .6jϜ޷p>W"y79/A=7O"oO;<@0A|"KlmkOMz*l| H/gHyQ7kɜ>#أw$}^N3_*ޝ1,=6 ` g`!yJ QʩQ#hv^7^.Gfi@oybudcmQTC ۊm\|GBsStoS0_fϜ842]zmrT)UrWI@?"g|."琼@YT+ZmQ$E}ٛ |5˻&IzN(`!pJTe&dbf*- J 6f:w u ;@5#l c{:[]B F(PBJnji_6cEHJzւ\%[ȒĂ#kdi1z)7@n`mNgseF,llȰrrt Śk5G_I]6Ot4k}~UI|@{l`0R쀆לpУX%k" ./niD!SyG$B''Έkىy1r(k$_}*`wwED~h*ohW {!l!NZ6Nb>]H)_OɯP,323,i bINm) Rce EOWQOgH v# MۭIjLyRҞ ޫܓasN~ʽlL҈d2wf)Dai9 R|C F{WY57>?0qi!yDGV1҅zDq3C2(+G Uto+s!ԬJx 5_|vp+->@m{d̓E 7b 7_|}B}XTkjFN<"Z})*9%r-z x\mOk~k=+qT3OƗaiZ5:- O"u6K9,HMr4Mԕ^`Hgo: (WQgٔWo3ؤV[#Ge1^+ =<gxL (O=xG{ET|y2>77؞}|-cg-S>w'PYvI\?} b JWʭ.7?>9?x9ܯ, 7ʮ$7ι/Mi$Us&]mK,!]cU.A{AMVR̟{) 25*wBiӇ&J);Eb/N(?Qrs5=}Uw@s؆(w ^rP1%觊UZk=~{:hW.&$co*yf=/aՂMYs\wgv{͗WIL" rʗToqζLY_BXVzҔrދud/!2]Zj.Cב$3_g[ҒVgag8dF rW"۠&Oq7Ŭ\6sU n;X㧼mð`,sT.X58aL+ a`M6֫ x.VWRTr:؁ ,г0emMؕDZsJև9yT\k,m%o*yRgrBŽr{/ҳ-RW|/AqMUuVtl߱skMD8 cTbg޷9i% "28FEF> stream x]s]^'Y~~tiDOupɲI裵 Yd{`‚ ~?zu<ˣo~ph8>?HN/=`OCR'ʧX }2et} ݛ[K[jm鍲ݿWk`d3TBdX)&]:#B&k$a=t`cyZgvf(׸ nw !I8]e<1gUlAPl'zej{=unu $Q6#2%omZ;mz%HWh{I"G Ӈp^3!EX[ 4ayŘ@:Hh=~LlKMD50lmC?( ,A&=@C&0bL2 (H#cV>$H% Ҋ""E0LtPi~9BE~]yufc#J(G>߮pQ2lRaor pޯex~`0,]Sz8+*mhtg*e7xEW,¸ K=z QxghJ&/,yoyFj6˸I[o!ÃQQ{_hDȉ8Zg(ȱHfd5I M7`[*--nJ! 6]hU{1hrP\n{jeqP*ƬV. w=}W`Z }U,y-t;+vA ?:+zgx$=Xh(|6Hؐ n"cXLA"xȔz.@]Wm[RUA$\VlN-+z)F.,cANeu|ofSt%Р$p:e6We݃73r+r{G)S+q՘i7E9ΪrJ^'&1ڧhd6Z qr4ThcNb&6gY( zz%)/&h7KZLMʂ9ߺDUWfbKEd[DOy3|<ܳ.Uew ^eJd+[*W5fF \a8,YK97Zf;gZ2ʆWDۺY.(U7[{U- *}/6i5q7OP9۾[r'XBjp1ua6,\QG`B\xS[$AhV,wZnn|ۣ4-V'\IvqrVpJwwG,O<[Y 쀣)s6D4@8\LgyW0(`N+` 3q7ăΨB8nLf4i M%˰{M7+9D0ED멝ǃ)cs+0;ST(ԄƬ6jml|咢(qؕR.&Wo+ͫYs~5y: e~VcZ75J9-BP!Vih4Mǃ !oC&3chYQ~o& Cfp+Xuʖ ^!QTm{cmsW%/"-7ơJx]qk҄N5T%yV+ӳ)ՉՐ[QK*ԧV saLUŹ.]v,>aq0_"KϨq^ISCm}7z6n9kr&)2N냜:aڜ9FLo8eȓ,Hdd: A37l]|G-o&5_}{e0Av|VqL9#[䛔xg%"(.Z>5߮2@tg$53tSJ"ϸUp^@eGE;^~3ke hz돭y.p42+ŃiYK<nR[u6)̛(W .g|n̐| 3'I$W>vw tg{ 4/v!é&W-d8cPF0)}}ꓞki_fEɞqG-`Sejglh5@]׶PpGe9AW 4lMc5FMF<(ЕBJ_ V>hNSV AqJ"?˅CZխAb1} +d ok`MĖ|' <}=ϣթFܘ=@9;3NxEyuMDH`RZ/Pi|ڱVisU, هWA\Msvy8*;yN4ge䜟=WA!TYq6)m6nr_$OȿlGgn8!u3Rʌ^l;{9.uQexK?}NNu4?<`b1ݟe̬Ź?DJs!~uwr];j!!ywJt-{(!ۗ~MıJ?[,^;}W!GX|\HEwl7v +ӻG XBKendstream endobj 274 0 obj << /Filter /FlateDecode /Length 2846 >> stream xZYo~#z <" N` K?ѬcISȇ͖3Zt(oj*N-LsiLx) s=޹KIt#.`)JU}šھʛSe+ͭ4$_b%|/i!w˕R~ S0&|8%"ր~_){ @2wp&s>t.i{AY![ihE$ay7Ab,d2( 0l1$3&&Ce%i\)|H^w2|A v/pN=薗sT;Pn  v G擠[QgG@Ho8O5Ĉrmgf]=6 H"Ev'@2a)a[}qR1YE-z(kSc)^Aqb{YAqVR̀pJw1r" ΋6Sq'TU%ہ[Ґ -= ^HJ]G KjMp&> G@86JueH%a}8} n:}=tn~5ri1jR8nAHMTmz_܊gY礎I9仦x0}LSĭ}ȿቅ0)u b_,>-LԲ ¢Dv@íIfbB_sH`T+rW5bI9*Z@t>̜I؏lS}?fRԠt^LĞq1G`Kj;HU:]JqTo` 0cPCXI}p! {x&  +bpU 6H FB*A>;Ic|ȉߒ0H1)TAX,0?qUPdSȋ=z$gIԲZsjQ豱Y/ކ*5$/IoڒQ1tC<ŐI!\NbwP.KX4P=nESԱקkڡ !C( J=MGt SFwoX ^̚"9B9?P Sl?1m~:[0RtqF U륋j2aC\r9yF9(wg>+)4edA Є7~jQyyF֓:UJcwr2|ܺ7T7<~L=t:鈐~ eDsHŽuf%\ K83Y2W}r#T'77P3W6)@\d7ygYބ5' | š>|BEb f[+0vM7oQ7`hWr_,o+V"7Nx*)1iW%omDt? FQ_D#w(x)5vxw(BNq4j}/>endstream endobj 275 0 obj << /Filter /FlateDecode /Length 3168 >> stream xZ[\~_1gH$"^)R, ;U_ΩݵͲ`>u?ѭtt}?p?ty%:^~whCBZBtwsT0Ӆ[])!B˯tlW/ON˚O_,+v5)IʋgG:9;%-޹P"irU;Z7X7,%縼P,!.8#c?uEU SmOqy4 S^O"cxu'RV8yL _ݛJZG"E2)G !lf 7Y۰dim,k +Ceu Xk.f )U[6z@c訛3|a9+cL۴&D%6[m}l\4FM[0ꐱQ;c5jd4G)֨ fNb:zäCɄtаreCf`mH,56IJBB"<bY%U a >!qkC |Fu n'.8B$/ Q({EP>?Pc՛#N<3kM#o繇RG+.W_xsAPUl[yGtU-yL,H} 6Ebj_ՑR4L#2{oؚ`sAeErA3rrw.'K7=5n|R9WŠ#j*EyiEm+n& U{9"9ϩ%[yX z,43 Mmo i/G`z7C U=Ċ3X)2~ 3`A}mA*N}Ir"sP(47+^;vz3*QO^Ԕ q#BKLNC-tRKKM0'#ՕtRteJ""kǶ%(zUVF􉼹DlX`!tHU fGKAOŋF:]ݡwH<'xl&{%WQ7+go!=@ZIh P ^8܁yH;P2A.5uQ&=Y8Q&eh0ιڧg8s*b)mP;qWÝ$(vM\|SNقDhjжM@p1Y_RUAF:l"N0DQBu_~P bKwD+ :jq H@CgYVWY""WI5sm89O@>B<`<@o7C<6 }v,ZW@&C} Su洱̪0 3, '*4Z) tv_Kڡ-baWPYr<&r*On#OTG&7urjUg< ERpB{2CldeuAį c[=t"Y[U^|fdoz^=-2jB)5b:JD-b#<Ӑh$QJs}ka#,0i$c*#Xw`3EMFBaWAhhLyTSVXCz?B$5J=43C2-741> g>f f1=b;;kGpLOvİzװ6İzװ6dg~^ڐuo+p`JzK!@z@Ufмݜ-` [KXG$j@q'MՑE> stream xwTSϽ7PkhRH H.*1 J"6DTpDQ2(C"QDqpId߼y͛~kg}ֺLX Xňg` lpBF|،l *?Y"1P\8=W%Oɘ4M0J"Y2Vs,[|e92<se'9`2&ctI@o|N6(.sSdl-c(2-yH_/XZ.$&\SM07#1ؙYrfYym";8980m-m(]v^DW~ emi]P`/u}q|^R,g+\Kk)/C_|Rax8t1C^7nfzDp 柇u$/ED˦L L[B@ٹЖX!@~(* {d+} G͋љς}WL$cGD2QZ4 E@@A(q`1D `'u46ptc48.`R0) @Rt CXCP%CBH@Rf[(t CQhz#0 Zl`O828.p|O×X ?:0FBx$ !i@ڐH[EE1PL ⢖V6QP>U(j MFkt,:.FW8c1L&ӎ9ƌaX: rbl1 {{{;}#tp8_\8"Ey.,X%%Gщ1-9ҀKl.oo/O$&'=JvMޞxǥ{=Vs\x ‰N柜>ucKz=s/ol|ϝ?y ^d]ps~:;/;]7|WpQoH!ɻVsnYs}ҽ~4] =>=:`;cܱ'?e~!ańD#G&}'/?^xI֓?+\wx20;5\ӯ_etWf^Qs-mw3+?~O~endstream endobj 277 0 obj << /Filter /FlateDecode /Length 161 >> stream x]O10  ]ZUm?eB:gמ]_:6fD$ht,T aY8 dw z"<)UVj 745$jk[Al=0y>?%Kĩ4-Mr{&SB|jSendstream endobj 278 0 obj << /Filter /FlateDecode /Length 2985 >> stream x]}w* .-IKv;;KJ3#jOs{#p/)ʿ.UKWf_~];" GaytȟRC荋B[]-^u/WL~^ނ.vjPcwZczjM(vA_AddZ.wN.DIF9^0aM6!(eۼY@B53!vV4*-?el8m2 /OB.HRaMbLB>'kiSl-[d~!h$ڸgW3FomZ;mz2f҇dR*vo xQmO SW _5qU_(C.W4|]VlՠmWFVjjLBA$5(z} -iUmMh"!CO-k!nQ"e!._ mMD|}b"JI kG`( 6WM˶MnIWK!Ap^"r &g&]ӤkpS 2&ۄM'  8Wf/d^Ce]Dfݻ ېΘ*fEEho;$T"tbS*+/4&6mpVw?ꎸJkBCdRƶn0DǹĞ%ׯrEC.Ut,n$\ۥ78 ̻Dz-sT֢(]qT~$PY5m. }SÖ89o xQmOCnR4U7>=\ӬqM%.:YKSoV߸JMe6a[$ZHF{nS;A4Miw :M{(:#T)90$!}CE(͛ lJ|M} BkK^LkZو쌗RۼOF^8L1쮘MpǮAy*@"'vjӖT}/ЯVEkbyGs sŜ}0tZ[ԩű۝aІ}v];g$nL4{֞>(HZur`L;:y-i.DOzՀ`ߌ2ښAf]IrU:j S2mP9İ;x9X Hh{ =Ra5{;{D{Wib7[3=4Cͧ: _`#ۡytޅ`?!fx7c`dX=ZOo"06ę~o BsU}Lr6}N|tݤL^<3ӣMjE/Sns|+=HW7WCsUlH?ynLV\h0q[ )c,06W+b$]y'S<ߺ+^)Ϛ4Sam_ OV72M!=eQ"U][BX7Lm1n_'Gaw3] !,оw'Uo!v$"UV H}uP@߅˺q^mtYNP[5 lOA# eth-^l7!hm#{`/ }%غoN?Cܖ V7yՠ#ME|L1@t=@ECڊLykOɢ*W|&g9-CKOyz5#h|;.3o/52_QjV^Fa~iɳUnGzԎH13ޑ!ӈ]8lx.fi 3D-o79DڈiQ[=mRl-<|#o[5eߊsH9iwimNhPU&TTds)fY;OބP :ylL9 8?OzKOr}iQ 1"SHd!ZeVIskJ1RH{aܛad8 ?`;Ϸ*=ٜtIppT,p?1kh|Rև\NeHlLx}a2\a n4fuP"RSu. ?Us6rϳ7]bⴀ=yoaSV/%8!|}&pnԧgS1xIeuTQ]{  ޝ>gj[7 O{mhCU.hJ/-L++t,#Ú.XQڛG-i{ozStr)ƟZ1c8Hلػtj-BJم NAȵ#iVOZ~Lg# l>n|ۦ=X,=nj 2ish;ETƎ}rFrKC*? c zEW.\>(rtmj |~Sڂy%\9eL;%OsE"̲0T(uA"yvɩPXv}u/z*؎wJ?R/7R<{ޓZemnZvs@]ҷ<י&xM_!$+CIUPs vtgiqlQ|i㍥ ȸ(/mtn 8^U ʋid~<iIdE?XjwelT![>F[e.-#kw{ x.G]Xj2~6WA-=,ԟ tK[o2B|PӢ'n^('M1(m҅ĸ:3%6eYq[)#%2ϲتw+ 7;k# y5'?y(ӹݪendstream endobj 279 0 obj << /Filter /FlateDecode /Length 5048 >> stream x<던D6~?R+[l&v1FOa-B1zw䵙?ZLFzJ4J*{VI[mpaYXk`jKqB Lx?1VW@Ǡ[ݯN\NY„ E 櫕]DXeiA~Rkn|L;eOx(5͡cGX5ajOG ^V[D{s#pn  ]1(Q&3 _a(cMм׵p=Vtv !: E*h&h|#F)8h5Z!C&ow њa+DFn޻L1Vi& |`p1)v7~8Dy a.i,-I*%rါAZiKNDz*`!h6eكC1Ց)he[ʈN =>c\ӽ!JORumE~^-wL%2߽+ڤ1b'H6TR3";}o#t1"iHK _o]U -JZ#5)H:6|@?- ԶA !YcFNNbmdT2Uȳh\ P-]閆plxXK6϶Qmx+1Q62Aq1P;8l{dj#ǯ Ͳ A-4Y=v XD6vI81w$6҂ug EcGc Fm@$#ƈ'ȓnA}9OBtOIV뿯{Kπ]~ ZaEkY (a/+vG&] c AlC9۴#- ay|?"e6D{%ܐ q,1D+6R ҋB\لF+5&8!&Ks4`U Fdg,nY9 u 2&$Ec s^"Q"WC;0Rju`yϰ%=#qA!1ԓc+@Ykm O68-t|3Wqj51I_kqg'Pt tiD$tǰܿ@Q!ET4n#QCd9ݞ^gAȵFM_:fn8 _6l^!7 EalUS4 *w[5LM'pcC!%*D2@% d@ppW? h9$ |zمĩ𧬜uQҲM !<59M¹ͷ.{=[# ]:28@ u'UOHcd!^х%9etк;9nE@</D) [LS͒6o 9敟cpRV gU$)dt%=^/~.1Gs-G%φІK֠*^ST.Xcʾ 3.mQ~J \o CkgT}?gFV^UJ˺DJuRpU=aI< ֳ??odWlg^G#hZñx ,[Ru(5~p-8K\p/ӆB+^,g `:\ `-ab('jrhaQge=&.G"TsV ffhM]}oxfuOy:X']FEMvȲ+a1,R R*B<2&)`J1Xa1כs(ZDRT ۔ e1h!j2ٶ.^Gb~2wdz\PAakG) KXKj3d [b[SfΪnBmJ>dCT'/#]|FʆWn`T=_p?iߪAgV}Z7WY0XљLO8ReЎ?}]ĽID݈eXE$Ɲ=R'u|Up7\@ze`}7\>vL(4gCVs|g3~[lVļQcR\1z^Ha0g:uvsph*ft4Č:uA}(%t{J_ qDYuNpV<"!^l;0 xRO#T_-O-ўk_{}inVrF=hXD\TDLQfN #=#7'ܬC9ĩcsCs;rd^!rc7&8ܭaGd| r "1:_zY'܆ЬO87 drx5jlly2rkTmt#Xe"pvbKk4]JRڥ4lpw*dpZFT=%ZjߧHUuKcyA*\<b@|O@OpIՌ~R3c|ۺZ'vA/ S-;5?7:D0Jڲc Βj{k'j3d=䵐ϓbB wYO2Niz6)JeoLl=i!K]$ᱬ *ۤ۰JinE헾Ov&PD9"%yr\I7sBة\͒IxH-]s!i0 &cUa!0Zk*%5Ɗ/r%L1C2,Kۚz[46iS?p[ue:px!Ȕ^HBFLS1䰈j ƒ"؀HيH.ԇ=!ؖq&&Xxp8%DX}H)Pbe/wvPja˳#JC0'Gt겭WAغ:RE5*yAg|mJ`S/ƬХ1>Q Gy-X2y5u6~f @@}o#n>tJi !D|.5Bom. dmpҡ6.f1Qv0cD:ƾ8 !,ܦThfXY/8ڟc[^oQUy$ŭRSnXp3\p;d:̅D4~W!}Mz>-ɂ-wǁ;‚L ~>W[B)x}r~$jqB*zzܧ.t76{!vԞ|E?L˜"I6R guM6G;3cuf\2}tPfٯj,P5 b^!`>a4M_ŠtA:)64X"qLC2t#mCJz+s(h&2rf3>T>,b.~)4Ɯ+9˝٥60|Gj @qV Y A.B _Mepz`ofc耭8krOI:|=^pk6WlVԡ<ۜVBlH|Sc׋[X\/c͹*n8d|5\ *ՐVEO1{:γkᘑ̸{m;> stream xcd`ab`dddw441U~H3a!ܝnn߷ }=\19(3=DA#YS\GR17(391O7$#57QOL-Tа())///K-/JQ(,PJ-N-*KMQp+QKMUMB9)槤100000201297eG&tO4NϾ3ښۺ%'Mk1mʔiZ&O{+_Ӧw4U\Xp.6HwFendstream endobj 281 0 obj << /Filter /FlateDecode /Length 3145 >> stream xnN#:q@N'At'S>IJBr%i}}3]ݬYR$@zkU  ߣ~z[=x㯋l037SRնR/gˣ0v.YwI㺳JJK+ 1\ww^w;]D#|i= X1/U$n{QlrIm/f $`K6y\֩8,D]P*l`w$F`JzgԽ3&,v밇`L]<hY̚@g J;M1m#Mb,P^EU aCEQqNz ]k*#fcYq 4!Ma > _§_ %gKݼZ mAG-#8Yce"Lțl΁ԁh Vfwm""HŝFIX-Ua8ŕ~kнn¦7|##76pR`"ŲB90czS! R6MQ / "@`]_R#p}e`K03UmѯE v*.+BwQ<ۇJԠ[T m9l 0n&~gi.O/6Ꭶ{zSˊAY9: ֚NI&$/K`nC9mGh> P| , .?"hŌ")&+; XZf <"*FAg0q  AՋ,oT\D$6)Fh5]8}H9|DL@dswZ@8Q^X[|kVHB8)E"Q895Ӄ.E ;`߈x݁B|?"|Q@ J'TBA~J· t,:ЅfM|񖨸䓱r+ $ R2q< ſ3{S NB"mK|ٖEw*8tq'xan4-9-o0/+٘GO#cL/ 36 81Z xRfEKX50X YIv6^2M3 H> ?W\YKd4[Q@F {8 !` .ೂDU@DFrB{]S _ 'ЪHЙܸj N,BKWh1[RhA" _CtE _V7hIWT ~4}o1{%DTI߅z %8R$e3 8軲CDX>fU@]r" giRDq+xswȾ=Aq eۜ9]V[9r6_8ݳ7{U:[ |J^s^`WqN3+%oTX >P 3e{xM-rYɉXasSΧPQE6f#I1$hg]).'Wi"*!)X3)r1|A,U;G$ǔ0I7)lQ0r:3J[ɩ3ϯwt61] iù$=i*Ir գxEJy)Cr<&pR<ؑGud3\YU)'dU:wӥ}?O367*;$|(3le՝2J}PUB7w̋E E'9d"|(*nj 8J f1buqD8H^yu 6 x^@# >.ONfh%I5?|ztyyi{~jeϤbY4IuఫHOE,Σi63M)SԼ.ScUWQNOQq3 auİ£tgrrsdhӄl۔=ȧZ՘47̕*CCI9 U˶ck4"o%leN($XK+ Tvm;gf3nU@,E-LElZo||@V t+ Zw BFl؟'~zl`:A?CUng51Zд_b^}闼ײtjf`WS&5 9==]2A{CPL2:b{OS2DsOޥ*UZjos%]TiE:0fNld%AZz1. dPRX+Eۚ v2LIA 9as )&EfUʪʓ4BmûxJ7HW6I!ɩg2!vendstream endobj 282 0 obj << /Filter /FlateDecode /Length 3392 >> stream x[Ys~ʏl*;+NT6RV[ ArYKت=莺MM'K ;(rr")f<P1%-" Y~f4s%Mϩ'R]PXQ.0/D΅ƲvLl2 oQ}RmNreMg0k?1!~NQaW(E54POM*t0qsӸ7E]%(xv$Q KF\1;&:#hE}8myW]Y򺨒C(]Xi\J Z~gC]9:T=AiXxD g5VH,kdR+IvCo҄%N" Yh&40Xn)69FK!%_ud3O',yO629`H7=z Ѳ =Z޼Y@MSJ' [6tKCWBS/I&q|oz@.J/fjٓ1V6N4n371Wȋؽe)TvD+QZjsƊUesGfǨaޥMf~SEnQ M^;{ 2e*ښj\+/28y:ՍԩFSDd7fٵf2;Fea43`6S c\̴oڭqdrxJ $z{]vQ/+M%?+yRI=X;d.NGͧ!4u\ x[7WW#kAݴ}lh{_E[eBon]%w ^U]儌L1D9HX~/~ѹP@`ه>dHjj$mڂ'렵\D zj5М yo@&A쨎k,>#4m80;͡u :Rnf|uVV(k=>A;Cm O±ԚFg3΀Ig!y?΃ܤE2vc 0.*і3Hh'X&6QW v S{^}I^@Kt`sϢ(N+OkzzVsI>>TYl>/71g޼Km-Ș;l@^neO#K.7" l4fv{]*^t;-@݌aS^,69rTw"}LNR^? f}KM|sD٦IgY41:Z}Y>mM4ϱ^vo''s4M]Vu& @ysꗾvF"~䑀]PA{zx)=4poc ;Pz\;9OzYwEl*&@iyὸ逐 ᢷh/J|Q4Qs4=/c|FE;-Ǭn4PDH"*B"tm1EUBqЇ6@ue K.zu|@N"mК[<$źqUO5tws%/%b{~}+~I;C%}}2>yÝU\{CX1F<*5WɈM}c+)Gl"e^ :,JN=-W!0f+5ZJ|˧t'Gu O\1zUSɣ5R/4/K }|)uN\5:7:K!iNv,-/ =\SY0YاNnESph2a P tjPn~fRó Sy215Oe<v!y nTav+O;,1LxQt yD6ѷ&`Lg7uBUQnvE8М|e0Y2_YV2*&ݯG֬L_(Nß7p6+AltEP5QjHeF46V$M21)S,}vT.Ztt^AMUC:9vy^$%hiD/k)ꢽ/`wL^r4:?NBW9!_R q$ŔkVQORgDxFNafg5ҾDc )e '-{%SdzJnf%$)gcӽ7phiõQArAtq_SrY!Y okjTKft%Ӊ $̥#3EvR(TT׍ Dn84E<&%qo"ϧb#H^j4ڸ_J'H^o|?ImAӅPz5=9''{{7 \o% jRoF4 3/35<ұ<]F,YE=[C\e@p}hT9fti[;WcxCOʚ]JLSf3X(&I&5Fq(5%hb:e-v&JTeb!:H}]J(gqdkM2cI4Z=Wv"ϽW6'endstream endobj 283 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 2624 >> stream x{PSwo īRmZ޴Z3jUԂZ[PAD BBpO@ wbQЪ=:]K9{vLw;;'wnN~w=CL#8Ό/%'mY a\ \vm.rD l>r8*cL~J*ʖ 3XfR3˗l `k,[(ΐyLPD˖ >BX!.Z/zɥH-H M`[X(9e?eB`kTBă$1ҢͲ e`(OLvbH$%b7K!6ij+Vbg AN4n$q8_)$qmx<~cx>x$6ֈAe>TUaH$ t? 8ja -NmS65H˳cQ@^X}N֌c66L ZZ+ L%fTm'q^x2x^;|oy 4<[.Lĉ3?z*2,MP97myx ̈́)}늷-b*ޚ D"u6wLz2HkA6TiX|J p(* y/şu"5{)K8bѕW,&ZRx7^qi NcNZ dx]/q*4{3v\Zqփo IhF:/|H~+h ЖCڃWv\K-m.@;Pҗ ׻@~JMtYK>W>N=EqU:Q1%)RS@j;^} ϡnʐh䷼+7p!~9EzK\P&2_mhglc¹mt_9{]SVd:xN$L-ݷRgv ^r>GWr+ B5d=Tr ;&[]UQ9+PW*;]i$K1OfGr-ْY7z69CvQ9+l0io5z =OC{|9al~MMM&dW UY5~H7f@$$5Vdʹg=U2ZjV]n0 cnɭ+n.gsU`7&}QAqpGo@Oj?KeE`sC#Gmvr71Gֻѱc5zwqjG^XZBešky*}mUʨ)94D 3@eD ,/19̖-y'OcwOP z=;x pylNm T0 ʐzQdIAZ`d 2y@DSgs C#od+1eP4hr.p4r}o83qj -d%Pl };-xNnhah_\r]Yt.~H$ݻk[&&]<(7m׉CG ))"As7TT]*>k0X5V/G!l.)vV1iѾcVJshy:>2VҢ*c6^ Z FzPx)z >nơ`7jnq=#f;Neߐo̗:.rJdӿ /xD.2ju;sXgmlV8Yy)'oڎ}XrS{>EaQk>UήHaS /s97&PLkI8eZpyec˨7r-2DRZ݀HA 7/UVҤJ$@fU[b?VţnG.";n3X_]?U$iAu0 -C$WC1[66Mu M]<27YU~ oSX), 'maqendstream endobj 284 0 obj << /Filter /FlateDecode /Length 5219 >> stream x\ݏ1KzO$8yFڕݝʲ_UM{3#RQ-vX*+1ʕ?_cv!V70#xx2F"*WJQ۸֏QŷËrb4)70TRhFk=ji?7^̀dpG+`c^ {z ×HXs?&a°}C<fSpNa c Bq_lnx3\uxbr{ЩS\Z 6ڎ9|-H 4XM 5J IK&H<T-QHOE6,מ 6Rv)X*bt 6TOUo{|"h{@1RihDopJȤ2/3 EL$DQ@mݧSuo zcZ=*SE+v BIe]H35/4M =ݓ2ȦQ#I%T*O0tX m5NmJjSPJBhqH/Qۇd9( nF{YVGkJ6/J׍%ypp[Sб; o&S*>"76C շrk#,4lIeBG+;qfx"إ币t0/QG4 t!/Z@4;7yEdM--_a"u=% YqB+Sk4Kgrަ%MΚÖ):082)߁KQO8PkbMIk?@MZWVow_,2pc{`o!8r 86H'AZifpd\d@[E"E!+g_qIX%y6GFo^R6@I4 ^,>0&Ii˵);dUwwk/gH"-M;>dz8<=wػ? 0O \{WZ4H<:u\Ous/9Cgf?V, goGm"kb@zKD\R#4MFR.-] ,Qǣ2NDX dPXf F]gu-ryH;R)%lBcrVݥ #qrDczw1(8mxa,\``59*M!r(A_qPR, _Qj_<΀^mV=1|NDbaڅ9W,t)dfY,Gig=Mэx` CG+ؑBgCMNp!M2eW3 Sht|\W?Bok49I8N@K[kF>߾񰚖P0C(Gۻ>aޡY s`)LmzLIT7m}Ş5LqԒnm aX^*7)oߔ48tsF[,E߶+۳,/dExfԢuc^1oT/@ʹa>UuL`C霤S decmtyio?Ç>ă]@dǎ(rwlF oF՞(x٘?7aapf'ӡXP)Ĕw-DTY">== 7A KEI&KJ2/ޱ>,yFq_*V1β鋌y$\Ixw] c枊Nsj p39O+!κ5Z<4й9nl-dC뇹%3C0˅voT-|Ÿtq+!>Fiv|>~7ϩ,qYvS3/i#(B;סK*8M -'P?mHUB:X W+vaxb)=1El D>`W%DwQ]\WԮX>(Jl+\wlW ;Ov5w9?S|Wb>5%D~aC}Mcfc}gb#*NĮy?[q? e7A:dWE^!cKK|ѥcS"YO?| 7a3? g@i@'?#{vpNALE(Σ5cX^ (VK_(|yrwS\~5=: GoSGsaWahW I̐1":Mӫ|>;d*q2.n~'x >+]SnДA T%o壬*rTxe)Y?jEWFbhnSX,\(Ktv|(%j+֑xv fU 7Aہ- :{MA)3oa(x~ء\]Nr]eiU:Sdz/Rm/`.4|}O x6ƠD^\B).S⁳WsOJg Zxo#B8p¤=C[[m7 <:Oj*Vv t|R0ZUF %R\{/`qUqwVNV\t7w5Jl|D!wvh"=y 2tnc L SeMFZh3\3U$u/(@ǹD39Q3cF5ZxQ-R a6&c2}fׅ⁓B.F}ATL%q:su&82χ J@}uAkQO< v, ~pT (HW&xP g`]g9টɿiƑq2qʨ0xb MPE9hj0n3Y[|u;n;dsem x>h6麖(GNDF8@2'endstream endobj 285 0 obj << /Filter /FlateDecode /Length 6227 >> stream x\[o$u~'#&4M!Rr`A"aDr%igSU=\)0T{Xs۩Y_{?SwgKH9w/_zgtϻ㜭߽=fŹ s6Nt0>O7lHZ;[<"JE+*i2177<jOӧݙ*^ӑ`ًY bR'YA9Y9kYV7{1i9^ANZ rVvNFZ b=bVA}EI1RʛQAVsXxNY9MV] xP7tf?C6RbBt 2 .Y2rVYA{hyfջY?߄=!]{\V'<Fi~<4PYz˄<-6&oT@:!-z*޹ ;?>\\vذlp_ܾUtsqx{ps۽}x=԰Yv O'f)#)gSz3WrP92mӳI?.t9I "& Xs<CE aC a(ːbUuC 51iRx&@\33_Ioel *9G pk- .HsѦ0cA0(D0T'q@@s|,Y d6$>{eT8^Vah)Tw)qi+b9ABَI@3AXd<͉LˊU|ÒvK8X}X5~Ђ˞4x:DưSBd~z$S]K%B \IOF䫐߾9hB|`:(]A(iJ;?`Q_9!•]IJ6O^;a'Aό%.R=srqߑ+! "rBؼno_t1ë>|Շohk"u[xGc U ?hkdSy|TJ2 a#,apTmd)?db-0][ (3QA-oQ!C<< \~ 'POfxsG*$$ &Y#d I7}e>Nr#fqVuLnF5YhEtZ8PhFq̀Ɔ7Nڕ%dPꭖm-5D{f8߰ bOl GA~lS/"#,LR%O`%L.U=U,Bi܃bkՊќg|R]{/{V_,^rPo1FYv n̫ka !BaܗSH&ߖVVVSĩT0 m Wpe-=䴱u&hs#)68[.\J£qDPU fh-yOOَ͒ IzҔY-",xnU÷7N!MCk9.|vgqb,ᘕ8Oipeo/e$%bbS)JMܤLG?~|SF1B% =7C9Ǵ '+p"ݚ'jח>TE/}({*r=aȋYRFIJQN@On P?gXJ(V8$~N ckca}uĦagԮe/Mōܪ|7fBWT{#m2֒v퓻΂)s4fۂK`fT>-uz#e) V\Ԝ5E#`+/!RY \{`1[[ :HJ;"ǢC>Rb0Qm\ղČzR:IcX.Wq *jpu&2xݕz)A \ ̫v\jYO}E|p&s?' ^Q"ݮyZ_N**}AGd&XR=_i-{RZÖ1Ķ)ߑ%F0.;yOn2{ vҋ{`H*N`l< ? ۢôv#7Ā8}(s9ixcZ K㲯.x o/ꪴ\ gEtMjJ[}{DE sl*ηPOA0O.FUQ?Jf%H:#Qn81o+z):Fb /йo;tJCUůZ#>)4+`UB܇P?]qsզM*jb=|PwE\$ȱp YMj.}7'\N|-kϡlhoqv(D Y vT(N8ha?IW :~{ル~MPXOuJo!27_ᆀhgQ}图i^l"6indp?-BJ "Stx_ÉJX-Y)%YpF<ͱ癐5&`-=!2}mWaCLNN0njJrd2QEAC3*(ٖ*ocJ~yZ 0K[[M+"A%詶'-%n heRa܇á@] `I3aDQk/̡ЦTSYaN-g* F?U {b& XK ݽ4DErrp9~ z28ß]JiLsKm `5صkϴ|migλoOkIvDt}/l7DsUD%!4c [N(uAR%Cp҆=h(& U Inʾ;H;C)BRgw*M|8gq(b{V׵Tnjɨ?9r|kjlw]K\Mm]W\fg*.+aY ]yghjMCYrs(Zlaz)B>l d7n+~J,$qĬ]}.'2ݏ^CCS岣'G1^$gi׽e:V:eװr-HU]ڎ18Or -f'2D]\?.EhK ErBV &e7MtvT+!pK^~U)ㄡզ4WWj )?i^Y}ӹIwr՟u:P =q.+DF"L!_"/Fҋ,wzcȢp;r}QeE4l럎1L˯ll>aʈp3d6wٜpo9n<ί}e\:tߡmKms|ǖaE3{/^v;CI~ՇlU/eeͶ{ؼGcPqMh˩mc&lUF='`3PC9t& vs6Ɏx t>kp ?băSᗊO3<&WOfcRa:i,ٿ>9&@u3O3K0Y0f,*>Vkuiz3&344IEϐo*_jKP}ُ2CNQ&HiʺqEeYγS2;>}z'[?x+y|C z-t?p>]LY Bt˜+fMWO:GQ'u8ݑM?'Ct}()w7B4L~Ta~ ߋЯ7EhŒ= .ʓQݛA, t`o8efQI&[|'e;x$ */ەF|{"]OSYiճQԓM^oBﶿtg@R\6Zc~pS'e3endstream endobj 286 0 obj << /Filter /FlateDecode /Length 261 >> stream xUMK1 =fI6QAoJOk\viR=! ӰbfqXD %JUKާu߁X_2 cmCa QqFt9!~h.c.&M.Y]C y6\/o\ umP?M5=[]endstream endobj 287 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 579 >> stream xcd`ab`ddt v04qT~H3a!]cnn5? }O=V9(3=DA#YS\GR17(391O7$#57QOL-Tа())///K-/JQ(,PJ-N-*KMQp+QKMUNp-(-I-ROI-c``` 6f`0aa`zaݏK3XwM/+Z:wQz[GnvMOW }}f==h˺ F~lW./|Wu Om\P֝ʡkڑevG\:ϕ\]Y,/Wg?a:E'O:`RwoI\qzJVTmwtN|q~QgngCWEWGgKЦjJžrٞM h4vtCiJWO{wcwgSWgwWOwGC?.4";ۗw3~zh6Nl+]#nl.-b>4>7Bkendstream endobj 288 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 3350 >> stream xW TSg1$j!*iDs/Z vb nAA0A WZ=uyVO;N;i?v;=MN-od2vi}2@^[{V*V6'emC1e0eE1R"Op6gl鮮sFEE;y%F%/[|c#BRéSEO 7)9"!'4>4.)4iILtP7(&j[bBhwLHh\40E<tCB? 6s4ͬ`V2cU31ƝY,b3Sf 1Y`<7ƛYhapf(c@ Ƽ-]ɀCr[yl*[4p@ Az'6Ԏf*AU΢Y%k9${4 1++;{nH͚\Vy|R'|{}5A9lN…{m D<"5$ Sz/¬W *!Wh˖tKæǗ`(o:5V'Ɂ9&aɂ,U_-A%14KjB|W.h &%dȣqGK̓"!j@a;(T~Z к&:`!j^s[/JEu,v{ {i*8%h◭>tH,d2@H;Zp*p0UԌLH5 d[ sa5Ww܃p!k7>, <_Cy:pufK@kIEed]?*qIfsEEsقn^XN(5Z8QЗ*6m'wtt}J,ߚ wģB_UUl h){FL$|t q._K "6j 3'~X.J u{'*ALL W(:u9E>lT_v"ænpsEZTMmnH>r#kxuKT:U`56oAa(j>-,*ijB+ͻ c "S8WmJÏsn^ Bػm;H. :_h=ռjY:"Bp8й-)r$`n9ݩKUWՃD+ib&]v-qd|*~#}is0.{5ا_Yպ:./Q"8 8pEeA5[! Ȁ al5cSP}CuQݾ\ \ܽBL2v$N ĖV.i\IS37DWU+WF,Ѥ8(5u3E2cY.w=yd͢2eHh?6ċ8q0|3V3M\X$HBK?H5XL!$Y8,hblpso7 5 /:@IJ}$/x&jӬg_9 'kXuuk $ΣgQd_\p<-8uk6$HGnu'#bI=\ȚhZ^7nL.mfTS wם>_BgpsC/&L:I5l7I|"=Q&t<#0Vkn.;8,Ω~6Br(,#h,K|Y\B>Mؤ;P>wa _o[1žq17X>pn>zK7n3ک?cw,mptol1fۗRWԦ4mn&>,z!=67Pkab [F@͑IŭZZxpѬkKy+`B7~(ٽJVSP֣BVav}GkP!7ؐH9*E ']#JJoފ=0':oO;`=bqer_pRg>K2?JwH~w}!XϪOӓVIh2X+d]*9ɴ3$h`di5f}aOWNfFWT!~ ү>\oQ8cWU,njN56ZOdO_ox>A}WrkbFvꋯ^F{~2vVuxS &.&<P(toFY<~ZHMҞZ nC*śC~[b踱qUTw~Z R7z<5W 4$al|^C zrPwoaƚyCWk[ƸY'? n1ҋ׈6"mDɣJwzj9C$)mOֻL"#6Zx޷AoA_I"Dk : EcbG|phRh q8{8He/-45.o_[I= toH;5rBDnGAxAr pħ\>,«Bjʮ;sDSR hH2ȸIMN ' QYeynKiװvsYDFq 7N*oV_jjJZeTu}@ L$sx3̶َ` Q5w3EEg˺oϠEWiߧ0 /fI\ %xvp#ǟz(!;3KV)BR%[A-{2G׏pj8*}7V*I@!+B; U mmQylb{gendstream endobj 289 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 1379 >> stream xT[LSw?Xp$s7 :]g2QAPd*ZzB/[--xۂa-Y\mC+`l{OÂ0ƈMH>NG#7Eg!c!e!4g#m$y q֡obtXE|3g=Ű?pEN1;#qI`)b' s\0O")9wL&QBQ]{2>sEe\ a Ge/ZBAT\Q1ak"BNn^!ƒT(Îcq),$@ Ұ93(2hepƪ!l;|4DC9:ن?%>KCKmG:m@QLPv˺ݠ+S>ڛ+'XicdF~hYoE^RC.sT;;Ĝ|.@drL=fO#wwijJMzV,5WjjGo"uhNXV'ȴ qyXu9&`:6W2Qfhlkl6ή_ٍjI΁B>1tsJ }?G[&~EQVR&R6i-t-|eaqiOf. %MiTȵ:o[f餖 a[̸KeWZa  ޠ"ȈG',{Vhơ}2 x &}8)?WxmL ԑ =(1;(3u`2Yad2wV ,ZlhhWj6V&U6p]FguĎŭ5bѣǞ Zv?'>~63[%at=jv5*bzW{N'~e[4Q9s4EF<.ON܀fjtfPwncZ`@m"|ѫqg/.oiK]3^Id+O)QS&z Gnc>gR am6HQ8jC2gU?ўuD)Oy LRj8FE5s2/bU`ו(Sx`)(}?XpY.-Ezb<~:2) jmqn@y607YPW"H 7( ?qih$YB6* {Yf'k:f-ɉf*1/L֑^QWNb҉rzX;9 c_]KG{B,'4Zendstream endobj 290 0 obj << /Filter /FlateDecode /Length 1729 >> stream x[Ko7W-,P-zh6h*q\N`w.geR)M4yq# ."ϓϭLlf"ӷqr9v3D٫ITNANmZc4vtWy]^~oFz˥Q]dP \r±M7B`Z+dk<)솣q?Ǖ!8v':vDBJz9e'GOĢ7m""Ënܡ"?q)9W͠rNjJ )ի58" ^Pl!CxnGG=FJ Vp@<,2yT:..!vܼv]c-g;-JcNF_Wj8}1|w8zG < =w< )[ VZ/hb (kP t|Ӗu9u;kwo_.6 Wv 7zxddA#C8Z+etھ@Mj=oR0\ M'O IyYI %};W[n&#n&ݎ wذ_؋&o$ / I/_3KXU^y`NWER*ICVO#*U*?ՔCz&Ue+-B H $:ϭxjJ.7.%yUûFsOب>t_X}?w8t܌&=L$.ri='X6?n0R !.#Q+4O_[b%}lq`@,fKgj pHL2C i`L>ͷE͛Y41msڧJZiAbĐ.z*3du.䢐w {jhrN^n蝓v՗8i3.΢zjm7U. y^Hn[޶ ŕd3[êxm0lv)rHu1(4!tSFYʃ4̺@4)oI$8XBߤ o~sMI&PҩѩlރleL#Fڥs茈_NTU#H`R#vt*NvFlQB4Zu'7K lDoXh:DN?>-3|NbX!ysabgyi1xiɷ%BhD]Q5)&qh0<*&pDd)g2#>O;* X,)NJ<`gBDUtqxT=&?6(lendstream endobj 291 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 325 >> stream xcd`ab`ddds T~H3a!Sk7s7넾G ~"ȘW_PYQ`hii`d``ZXX('gT*hdX뗗%i(gd(((%*&s JKR|SRYt^}י1y#no~\~r]O9V=׋翛}}5۟'Wgq>7<_s.wt3\Xpso/)nxendstream endobj 292 0 obj << /Filter /FlateDecode /Length 4320 >> stream x\Y~Glkq &0>80Kh:2'{gw<(iUeUeef?<@| ?_F8_(<<:;(Sa1j{x`Pfuo,l蕌0Z"F]5 >Os}Pr=Ebc^ySvLӾYH}4QjQbP` 7lw#fZklͰɛqB 9p_14@ǠWN_}9e$Ib:Z[E|^6Y.0bGg'qx6%Դ膣UPcFۼUj$AȘV|&n<%PZ8,Q&=1my=G]nyqae-φaSn^;Sa[DVaQ^RQjsE7& ol8"xNmvt峢$"D b!<Atz8, uƢH}P N_#\wU4U[3!>`Aa6=_i_]8 g5i@IwU3צ hE^tv%H-HnD5[$/|7%᧵vSGeɼ]k˷ B9AZ$Pc1]IR#QW먒JEݤQIpu #\0 )1;x>:i`:n*{xLTbe-!y W]gy|$(btG:aZ {M'g< Sg.e4e xq2ãm5gd> Y 1O&H–Ҡn~]3zC5k$_. H%W!I5k# y̎aOSw3$_fr,$ |#HȪ5 ԂT9$(Yk|n3qNHה:ĮTn{AMFw ݱU9Jw)qNߝHh8! WZ9 oZkV{OHg7ZFz3qE[>UɥH@Y):fxcOДD=-h*hm#SMv: 1:VN@BM2.ŎɪR ]&v4,Lu;mt;rHL4BwY2jE_͵rtV 0kv `IЊGb5e+2ĢUޖ4Rڐ"׉i?4PX2;N(&(Qj!01C/UZԕ Ux9/WiN*f(ir 9 D]*Ԁ%)zYg&#R zE"ua{r3$rS|h, RG+MV. m"C3XMʞt y}P'CD'e ó(@e8w#$T3V0yzgn'&.i21"I / ;DS:;Wz1Nx fW_:6N͐}W}@jBK I.U@PL}^G-Gcy&~IyZ:EιYqWhç3f[mKѲ16 Y[5&ХcW:{(FTd3O<&նh@orR:!HJ_Jϐ>ڷ30 .tjyc|P,M%FݺԺ\8hHY崳i5z">-4|tKe'l_7=״0#"*ǔDK).5~ 0V}٪=k$;f*w]4@Ȱbh݉~[~$`x^%M%0 oߖM[ R˟SE,1I (ͤX &Ζ`҅w"3)5jk8^I|GoɖLZ"*['3}K]5ahkc> b^Ήt'wO $&mGیM:@ y)>[ɲu͂¼q}WtɍEH}ORRԫZGRzjے.n$8oaFKt gv& z'z|?4^><-zJX\+wlw*F,ݐO cW^jUIIj@ux!D)`QXж*LLG'?h&̼ht /~Wl|M,5W! Q ^XkF8Iris`i|с@R۸ì5 *.>ĮԬ'qRO8͕qg_P of6z7OKm%gO&J7!o(Zio@{ߠ%=M}z內>A ΙYBI>Y%EʽE1%K)^D>/x$e|!mG_W5ЊA[[x0sX͹yo*<<J8ϯiAIz**5@A;:cV/1bA]Cgf~]fNM[ƓtެQo#c.]KaR6J촰o BJ$ uMkV9$ FS([XK["'V 5e,I9$%;TZ~V?'^<8/ev8/F.A~-Y`a׼ .nq5#iahM[S,%#2Óm4~ΡkM/)U6SE;Y-)IՖ)uѺbge_w o-Zw=lO"*,l}EjSk$k!p>IA9 &9|ECρFd|V@'_8%`A{` ;H> stream x\r$+>U;KdYa2o#pF"3\|3T!z($/_&))/nOQvz}鄇]ܞ 0y~z$~O?ڎ^ӳۓAeF+.O_Vk62v.4{OQI˧o^^֊ =ZbVZ70zJosvoacګR V 0e|93\ ;k~e$!BQޑD9c޹[\c%~bhULj7ʉ1%m11lP79~gAP?dpP1SB89s_YDd7k.zu5,Oa管k9|{v6H8)hQ);j BsNRΘ߄%1&&lըcigy+nMC1JHyyUR29\l/P'k5kN܃@4yb3I9. @sb7Ƒ-# oa+rx[P[͟oVk-$ lys<7s$Ҧ1lѶ`T3 7 &I[K5h66@j i?y~m:8J6/c{?WQ;Aq SEՕrcƿK.sʂ+4 _PЭna[b <,RP~Tj~mTȸSk4x4ۧ# `05j@/^hᣁOg+iF>in6x$²97`?g * ]]A;c,.[Ӯ@\Spڕצy|a|ns49 |9,T`\4fq)=a Yq_Y/G_E港 z3 :4jGPK'M8 `=^M]_X\mE7},wz𷕓q080OZ!UݏyOA^:Exat4a+dpK:!w7a%B9-wY,]MbC7X$s7؟x%,#8w}xBDo7}}2 =Xgf1D{@# H4VN+- ƞꦙ` u։DIQbA&|E+Fr` i`snܼh ZK`уd>=ql&xLJ잮߇8q"bP ] 4x5qe$KcL>{k<|)A'H'FxP.\4ZNmt 0L0vǹ! |ǎ pHosKsZFhn-0eg*4/yύ!\P ~%.fdH pIAAD: fL~ E J 3(AY)m*ڌD)5#ZPj {D *8wUe;'1 |MhDN*&Fkҙ :@S y{ܳWi9^4L*O9-a[+0Cgn.~j̛ qi|da:h8%PhMVC\НbFʥ=!*p~ma|̧i,۠,8mMد `M~ͻY{ $悡j23lf'_Bw3D2X9U8d>bBAnzW-Q YΧwm6ڒUhxxz)7o6چhS~F@0/ԑC ݦޤg @mi^ ӓ5@ՆiSIBDHhN0c |~>8v@X7B+귟r|@"΄vrn*wkp38Tu7 r.^puWT{+KQlbn%ld|-+,E Qb0h5ȋrP q 8D$D!A\w)dS]|ӓjӷĄEs*1WQ>V/ ެtZ 5~irqZ~Jj%%V 'RFUJ1YS+5RF+^ꧪKW‘޴wG_rBr 7Hnˀ n@Un1_ML]%f=˦M(_0L`oY:& X秦>>.",UF=[,;ssen2P)mS'gtAvRܩ 9r8=9~}D36~8UwyeU̕aa` ra2U_qkkot+) y1M,1q/w r -ڕ{)tJ3#)@H8DNI<%1r0> 2(Zf>52P ?6 :~MB,vwMq~.s #"*{l>%YvvN&F{sZJOoSfc#"'[|й*Tja-vՋlUlQ!7?gs#gT _d-1҅aFh`yUQ)]bKh~4 fiIs֙2y)fx:_Y&<w90xothwi_C8y&h9^5#H_⚾pܹA2FfTEuY:cz3ֽ݉ 9!MN–^]#uGs϶MU9FJm |`Is P 8 TwT5RN^YJ&ؓl^b3!;j.Kbe1 T+#!l v&0o1.=]Jy|*k\p{u_Mh.'9r/T; JF6Jx 64cRʁU:SmޔW#v59uvW1ɬ.cX%3үs,v&bʛ YxSYbj;ToHc5+ i˩|@}袋К\# b*|MSv/W7پJ.cxݻs7kq!F\23P Q"_^cr8_Ino:VFdysXtz]zGkޛ,2^ӱ#a;_i6P>RCEYH# ŞMY-pZadR$ fӪBM3nnjbWkùۍ}# fnr}k֕ #tEܘwhς5-wFB^%W%"& ^ %T!bٱr Xrw!M 7mnF\n.X NzlGᇪ}qwߝ2endstream endobj 294 0 obj << /Filter /FlateDecode /Length 3543 >> stream x[Yo~W > scqck5@NhReSLITutWzHiTQWU=g3wmnNls_grS,<=|vz~_3m/Ym{/Mr57\ݜ}wL]R^r2_Fug0c60@{onSɴ^01"lnOC`m2dv@3gc GK6Ux̭SMYUC?O <5T2=]tOE,=b 8MjkYMwKxƀc1ؓM.W8:) q^YǼpVn sNwK|ΙL⹥fkF3 CaI&.WKmx{`|1g8gܖUBm]%-6N4SBmJ/Cd,\W<\`(8=1vu! y_HPP-p&>=%]ZZbUrQKTz$3Q%3&>6smN zN:G>|QX@@oȆ[/SN):3y%QHʋgw\4@x‹a{Jc!'B ;̝eM8me I?Md/~ L9#˖9:033֢6p{d"{VF) oȲiS +fYVe]!EAGVL@d Y&VLYŝ0Jd2n#ċ29A; ZnEvT~iS g7SذZ+Zf6qar$mw1X;"wG@_p\"&M49ʫ>l6gDhZCi'ɧ LijQ'2G `0&ql¿4Y:2BRjTLt`f5iR Mq"t حbceF6Bbd34 ȻM+ɧ5NƳj +99 ny}sq#W⸗dݵgf´vݴUpPp%+uJ3;%\'N<'#KntdFsHMY>v80nɷE5Z iUmG# 8TO wMx`Y@|';P!۸ks'^(&> H!o׳L=b v1;04,+/?0rcs Bw-Ic.̜M}H6QP#f@cߴCmj4߸| dQ 1!t Xeyp ;&dυbQeHMB5g Oosb"gHb(]5|кAJO 0c+=?*M@,sGBڢhSK\{>x=ĝe^L9vQj uQ1wQ9 UIP+2UYH@9/Ow| Wa.0B:`W)Ɋrs)iĴ`U^yrX O侩m- F [:X PѥvyDS CB xu(=MmSlUswx~HIpRb}Y]D6*uq~uڃf,CƋUZIjdN #_Xe 0 Yy*%Ӑ9V nb'sNFj4v oa }FACMC"c< - *Xil_Q0K; CLë>ήJsD9jKf6y@zn.  H8#z@XF"ǁI@şHb!p^i$Q~2~Ak\ 7USAo U$~fROco)mFUͰS#aa4󮎬kx>U~0LROz(S?I':zr7SuQ_!:;15zŏxuƨ xB/E\0{i"tSsz "U+8[jB`$/ yVe! )}^3?nO< Mg\B^2*SY• }:GW'%󸓑?i*y.%b4HzHv8 y g$x0Ƙ^Z]㘿n;rS4]AYUCt|Aam;uepLθ }bXl.J9!}U9A N:==]++Nmȴ?PF`)r!*pbTh껌'ZOKq:}$5Y N1S< O1eYG_[~>_[MؗN0R YUgLkES% Y0$r_ȋBXz=N{]ȟ ji Vsutmf!y2xl'Fw~̴>6M4$%vxZ"KݾDllå#EJ) ]1tEkS$$cl7Xfu b1⊦ݑ=7uH3 .YrV}/%k'{|:,< uWba9!)vV{6_x*64ۖ^jNE'5T]#GuА^øL]_-t*DFnt|J6j.QWh-LX⪚  旗r1 \ c߆^CC*QJyD mFe2?y5ȕݶCȕ"CӨ4%BUqMIk_MI*[S dCމnGӪȩQCۡHѥ;:36Rr`^=4O\y}AoT=;t+Zf78 nx am]pva!? \XJq_a;-Q%KPN >{Ԟw/ԅ?yZQRw`??e+rseqR> /W [ 1 3 1 ] /Info 3 0 R /Root 2 0 R /Size 296 /ID [<782bd21b5e0180d2439d35a4881f9330>] >> stream x= Aay% y`0&*@16Jl#"w;:{s>%ЧPHHK`ycv}k[6:c˗esbkj0#?Ʀ7#VYb;٧NaO⯬'-3c>= library("zoo") library("tseries") online <- FALSE ## if set to FALSE the local copy of ## is used instead of get.hist.quote() options(prompt = "R> ") Sys.setenv(TZ = "GMT") @ \mysection{Read a series from a text file} To read in data in a text file, \code{read.table()} and associated functions can be used as usual with \code{zoo()} being called subsequently. The convenience function \code{read.zoo} is a simple wrapper to these functions that assumes the index is in the first column of the file and the remaining columns are data. Data in \code{demo1.txt}, where each row looks like \begin{verbatim} 23 Feb 2005|43.72 \end{verbatim} can be read in via <>= Sys.setlocale("LC_TIME", "C") inrusd <- read.zoo("demo1.txt", sep = "|", format="%d %b %Y") @ The \code{format} argument causes the first column to be transformed to an index of class \code{"Date"}. The \code{Sys.setlocale} is set to \code{"C"} here to assure that the English month abbreviations are read correctly. (It is unnecessary if the system is already set to a locale that understands English month abbreviations.) The data in \code{demo2.txt} look like \begin{verbatim} Daily,24 Feb 2005,2055.30,4337.00 \end{verbatim} and requires more attention because of the format of the first column. <>= tmp <- read.table("demo2.txt", sep = ",") z <- zoo(tmp[, 3:4], as.Date(as.character(tmp[, 2]), format="%d %b %Y")) colnames(z) <- c("Nifty", "Junior") @ \mysection{Query dates} To return all dates corresponding to a series \code{index(z)} or equivalently <>= time(z) @ can be used. The first and last date can be obtained by <>= start(z) end(inrusd) @ \mysection{Convert back into a plain matrix} To strip off the dates and just return a plain vector/matrix \code{coredata} can be used <>= plain <- coredata(z) str(plain) @ \mysection{Union and intersection} Unions and intersections of series can be computed by \code{merge}. The intersection are those days where both series have time points: <>= m <- merge(inrusd, z, all = FALSE) @ whereas the union uses all dates and fills the gaps where one series has a time point but the other does not with \code{NA}s (by default): <>= m <- merge(inrusd, z) @ \code{cbind(inrusd, z)} is almost equivalent to the \code{merge} call, but may lead to inferior naming in some situations hence \code{merge} is preferred To combine a series with its lag, use <>= merge(inrusd, lag(inrusd, -1)) @ \mysection{Visualization} By default, the \code{plot} method generates a graph for each series in \code{m} \begin{center} \setkeys{Gin}{width=0.7\textwidth} <>= plot(m) @ \end{center} but several series can also be plotted in a single window. \begin{center} \setkeys{Gin}{width=0.7\textwidth} <>= plot(m[, 2:3], plot.type = "single", col = c("red", "blue"), lwd = 2) @ \end{center} \mysection{Select (a few) observations} Selections can be made for a range of dates of interest <>= m[as.Date("2005-03-10")] @ \mysection{Handle missing data} Various methods for dealing with \code{NA}s are available, including linear interpolation <>= interpolated <- na.approx(m) @ `last observation carried forward', <>= m <- na.locf(m) m @ and others. \mysection{Prices and returns} To compute log-difference returns in \%, the following convenience function is defined <>= prices2returns <- function(x) 100*diff(log(x)) @ which can be used to convert all columns (of prices) into returns. <>= r <- prices2returns(m) @ A 10-day rolling window standard deviations (for all columns) can be computed by <>= rollapply(r, 10, sd) @ To go from a daily series to the series of just the last-traded-day of each month \code{aggregate} can be used <>= prices2returns(aggregate(m, as.yearmon, tail, 1)) @ Analogously, the series can be aggregated to the last-traded-day of each week employing a convenience function \code{nextfri} that computes for each \code{"Date"} the next friday. <>= nextfri <- function(x) 7 * ceiling(as.numeric(x-5+4) / 7) + as.Date(5-4) prices2returns(aggregate(na.locf(m), nextfri, tail, 1)) @ Here is a similar example of \code{aggregate} where we define \code{to4sec} analogously to \code{nextfri} in order to aggregate the \code{zoo} object \code{zsec} every 4 seconds. <>= zsec <- structure(1:10, index = structure(c(1234760403.968, 1234760403.969, 1234760403.969, 1234760405.029, 1234760405.029, 1234760405.03, 1234760405.03, 1234760405.072, 1234760405.073, 1234760405.073 ), class = c("POSIXt", "POSIXct"), tzone = ""), class = "zoo") to4sec <- function(x) as.POSIXct(4*ceiling(as.numeric(x)/4), origin = "1970-01-01") aggregate(zsec, to4sec, tail, 1) @ Here is another example using the same \code{zsec} zoo object but this time rather than aggregating we truncate times to the second using the last data value for each such second. For large objects this will be much faster than using \code{aggregate.zoo} . <>= # tmp is zsec with time discretized into one second bins tmp <- zsec st <- start(tmp) Epoch <- st - as.numeric(st) time(tmp) <- as.integer(time(tmp) + 1e-7) + Epoch # find index of last value in each one second interval ix <- !duplicated(time(tmp), fromLast = TRUE) # merge with grid merge(tmp[ix], zoo(, seq(start(tmp), end(tmp), "sec"))) # Here is a function which generalizes the above: intraday.discretise <- function(b, Nsec) { st <- start(b) time(b) <- Nsec * as.integer(time(b)+1e-7) %/% Nsec + st - as.numeric(st) ix <- !duplicated(time(b), fromLast = TRUE) merge(b[ix], zoo(, seq(start(b), end(b), paste(Nsec, "sec")))) } intraday.discretise(zsec, 1) @ \mysection{Query Yahoo! Finance} When connected to the internet, Yahoo! Finance can be easily queried using the \code{get.hist.quote} function in <>= library("tseries") @ <>= if(online) { sunw <- get.hist.quote(instrument = "SUNW", start = "2004-01-01", end = "2004-12-31") sunw2 <- get.hist.quote(instrument = "SUNW", start = "2004-01-01", end = "2004-12-31", compression = "m", quote = "Close") eur.usd <- get.hist.quote(instrument = "EUR/USD", provider = "oanda", start = "2004-01-01", end = "2004-12-31") save(sunw, sunw2, eur.usd, file = "sunw.rda") } else { load("sunw.rda") } @ From version 0.9-30 on, \code{get.hist.quote} by default returns \verb/"zoo"/ series with a \verb/"Date"/ attribute (in previous versions these had to be transformed from \verb/"ts"/ `by hand'). A daily series can be obtained by: <>= sunw <- get.hist.quote(instrument = "SUNW", start = "2004-01-01", end = "2004-12-31") @ A monthly series can be obtained and transformed by <>= sunw2 <- get.hist.quote(instrument = "SUNW", start = "2004-01-01", end = "2004-12-31", compression = "m", quote = "Close") @ Here, \verb/"yearmon"/ dates might be even more useful: <>= time(sunw2) <- as.yearmon(time(sunw2)) @ The same series can equivalently be computed from the daily series via <>= sunw3 <- aggregate(sunw[, "Close"], as.yearmon, tail, 1) @ The corresponding returns can be computed via <>= r <- prices2returns(sunw3) @ where \code{r} is still a \verb/"zoo"/ series. \mysection{Query Oanda} Similarly you can obtain historical exchange rates from \url{http://www.oanda.com/} using \code{get.hist.quote}. A daily series of EUR/USD exchange rates can be queried by <>= eur.usd <- get.hist.quote(instrument = "EUR/USD", provider = "oanda", start = "2004-01-01", end = "2004-12-31") @ This contains the exchange rates for every day in 2004. However, it is common practice in many situations to exclude the observations from weekends. To do so, we write a little convenience function which can determine for a vector of \code{"Date"} observations whether it is a weekend or not <>= is.weekend <- function(x) ((as.numeric(x)-2) %% 7) < 2 @ Based on this we can omit all observations from weekends <>= eur.usd <- eur.usd[!is.weekend(time(eur.usd))] @ The function \code{is.weekend} introduced above exploits the fact that a \code{"Date"} is essentially the number of days since 1970-01-01, a Thursday. A more intelligible function which yields identical results could be based on the \code{"POSIXlt"} class <>= is.weekend <- function(x) { x <- as.POSIXlt(x) x$wday > 5 | x$wday < 1 } @ \mysection{Summaries} Here we create a daily series and then find the series of quarterly means and standard deviations and also for weekly means and standard deviations where we define weeks to end on Tuesay. We do the above separately for mean and standard deviation, binding the two results together and then show a different approach in which we define a custom \code{ag} function that can accept multiple function names as a vector argument. <>= date1 <- seq(as.Date("2001-01-01"), as.Date("2002-12-1"), by = "day") len1 <- length(date1) set.seed(1) # to make it reproducible data1 <- zoo(rnorm(len1), date1) # quarterly summary data1q.mean <- aggregate(data1, as.yearqtr, mean) data1q.sd <- aggregate(data1, as.yearqtr, sd) head(cbind(mean = data1q.mean, sd = data1q.sd), main = "Quarterly") # weekly summary - week ends on tuesday # Given a date find the next Tuesday. # Based on formula in Prices and Returns section. nexttue <- function(x) 7 * ceiling(as.numeric(x - 2 + 4)/7) + as.Date(2 - 4) data1w <- cbind( mean = aggregate(data1, nexttue, mean), sd = aggregate(data1, nexttue, sd) ) head(data1w) ### ALTERNATIVE ### # Create function ag like aggregate but takes vector of # function names. FUNs <- c(mean, sd) ag <- function(z, by, FUNs) { f <- function(f) aggregate(z, by, f) do.call(cbind, sapply(FUNs, f, simplify = FALSE)) } data1q <- ag(data1, as.yearqtr, c("mean", "sd")) data1w <- ag(data1, nexttue, c("mean", "sd")) head(data1q) head(data1w) @ \bibliography{zoo} \end{document} zoo/inst/include/0000755000175400001440000000000012501365414013655 5ustar zeileisuserszoo/inst/include/zoo.h0000644000175400001440000000055412501365414014641 0ustar zeileisusers/* Header file for using internal C-level facilities provided by zoo. This is not 100% designed for end users, so any user comments and bug reports are very welcomed. Copyright Jeffrey A. Ryan 2010 */ #include #include #ifndef _Zoo #define _Zoo SEXP zoo_lag (SEXP x, SEXP _k, SEXP _pad); SEXP zoo_coredata (SEXP x, SEXP copyAttr); #endif zoo/tests/0000755000175400001440000000000012501555050012414 5ustar zeileisuserszoo/tests/as.Date.R0000644000175400001440000000311311646410727014026 0ustar zeileisusers## base results as.Date(10957, origin = "1970-01-01") as.Date("2000-01-01") as.Date(as.POSIXct("2000-01-01 00:00:00 GMT", tz = "GMT")) as.Date(as.POSIXlt("2000-01-01 00:00:00 GMT", tz = "GMT")) as.Date(NA) ## for chron objects library("chron") as.Date(dates("01/01/2000")) as.Date(chron("01/01/2000", "00:00:00")) ## for tis objects library("tis") as.Date(ti(20000101, "daily")) as.Date(jul(20000101)) ## for timeDate objects library("timeDate") as.Date(timeDate("2000-01-01")) ## with zoo attached (masking as.Date/as.Date.numeric) library("zoo") as.Date(10957) as.Date("2000-01-01") as.Date(as.POSIXct("2000-01-01 00:00:00 GMT", tz = "GMT")) as.Date(as.POSIXlt("2000-01-01 00:00:00 GMT", tz = "GMT")) as.Date(NA) as.Date(yearmon(2000)) as.Date(yearqtr(2000)) as.Date(dates("01/01/2000")) as.Date(chron("01/01/2000", "00:00:00")) as.Date.ti <- tis:::as.Date.ti ## filed request for export as.Date(ti(20000101, "daily")) as.Date.jul <- tis:::as.Date.jul ## filed request for export as.Date(jul(20000101)) as.Date.timeDate <- timeDate:::as.Date.timeDate ## filed request for export as.Date(timeDate("2000-01-01")) ## with mondate attached (masking again as.Date) library("mondate") as.Date(10957) as.Date("2000-01-01") as.Date(as.POSIXct("2000-01-01 00:00:00 GMT", tz = "GMT")) as.Date(as.POSIXlt("2000-01-01 00:00:00 GMT", tz = "GMT")) as.Date(NA) as.Date(yearmon(2000)) as.Date(yearqtr(2000)) as.Date(dates("01/01/2000")) as.Date(chron("01/01/2000", "00:00:00")) as.Date(ti(20000101, "daily")) as.Date(jul(20000101)) as.Date(timeDate("2000-01-01")) as.Date(mondate(1/31)) zoo/tests/Examples/0000755000175400001440000000000012377754004014205 5ustar zeileisuserszoo/tests/Examples/zoo-Ex.Rout.save0000644000175400001440000027742012501554771017210 0ustar zeileisusers R version 3.1.2 (2014-10-31) -- "Pumpkin Helmet" Copyright (C) 2014 The R Foundation for Statistical Computing Platform: x86_64-pc-linux-gnu (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. > pkgname <- "zoo" > source(file.path(R.home("share"), "R", "examples-header.R")) > options(warn = 1) > library('zoo') Attaching package: 'zoo' The following objects are masked from 'package:base': as.Date, as.Date.numeric > > base::assign(".oldSearch", base::search(), pos = 'CheckExEnv') > cleanEx() > nameEx("MATCH") > ### * MATCH > > flush(stderr()); flush(stdout()) > > ### Name: MATCH > ### Title: Value Matching > ### Aliases: MATCH MATCH.default MATCH.times > ### Keywords: manip > > ### ** Examples > > MATCH(1:5, 2:3) [1] NA 1 2 NA NA > > > > cleanEx() > nameEx("ORDER") > ### * ORDER > > flush(stderr()); flush(stdout()) > > ### Name: ORDER > ### Title: Ordering Permutation > ### Aliases: ORDER ORDER.default > ### Keywords: manip > > ### ** Examples > > ORDER(rnorm(5)) [1] 3 1 2 5 4 > > > > cleanEx() > nameEx("aggregate.zoo") > ### * aggregate.zoo > > flush(stderr()); flush(stdout()) > > ### Name: aggregate.zoo > ### Title: Compute Summary Statistics of zoo Objects > ### Aliases: aggregate.zoo split.zoo > ### Keywords: ts > > ### ** Examples > > ## averaging over values in a month: > # x.date is jan 1,3,5,7; feb 9,11,13; mar 15,17,19 > x.date <- as.Date(paste(2004, rep(1:4, 4:1), seq(1,20,2), sep = "-")); x.date [1] "2004-01-01" "2004-01-03" "2004-01-05" "2004-01-07" "2004-02-09" [6] "2004-02-11" "2004-02-13" "2004-03-15" "2004-03-17" "2004-04-19" > x <- zoo(rnorm(12), x.date); x 2004-01-01 2004-01-03 2004-01-05 2004-01-07 2004-02-09 2004-02-11 2004-02-13 -0.6264538 0.1836433 -0.8356286 1.5952808 0.3295078 -0.8204684 0.4874291 2004-03-15 2004-03-17 2004-04-19 0.7383247 0.5757814 -0.3053884 > # coarser dates - jan 1 (4 times), feb 1 (3 times), mar 1 (3 times) > x.date2 <- as.Date(paste(2004, rep(1:4, 4:1), 1, sep = "-")); x.date2 [1] "2004-01-01" "2004-01-01" "2004-01-01" "2004-01-01" "2004-02-01" [6] "2004-02-01" "2004-02-01" "2004-03-01" "2004-03-01" "2004-04-01" > x2 <- aggregate(x, x.date2, mean); x2 2004-01-01 2004-02-01 2004-03-01 2004-04-01 0.079210426 -0.001177187 0.657053028 -0.305388387 > # same - uses as.yearmon > x2a <- aggregate(x, as.Date(as.yearmon(time(x))), mean); x2a 2004-01-01 2004-02-01 2004-03-01 2004-04-01 0.079210426 -0.001177187 0.657053028 -0.305388387 > # same - uses by function > x2b <- aggregate(x, function(tt) as.Date(as.yearmon(tt)), mean); x2b 2004-01-01 2004-02-01 2004-03-01 2004-04-01 0.079210426 -0.001177187 0.657053028 -0.305388387 > # same - uses cut > x2c <- aggregate(x, as.Date(cut(time(x), "month")), mean); x2c 2004-01-01 2004-02-01 2004-03-01 2004-04-01 0.079210426 -0.001177187 0.657053028 -0.305388387 > # almost same but times of x2d have yearmon class rather than Date class > x2d <- aggregate(x, as.yearmon, mean); x2d Jan 2004 Feb 2004 Mar 2004 Apr 2004 0.079210426 -0.001177187 0.657053028 -0.305388387 > > # compare time series > plot(x) > lines(x2, col = 2) > > ## aggregate a daily time series to a quarterly series > # create zoo series > tt <- as.Date("2000-1-1") + 0:300 > z.day <- zoo(0:300, tt) > > # function which returns corresponding first "Date" of quarter > first.of.quarter <- function(tt) as.Date(as.yearqtr(tt)) > > # average z over quarters > # 1. via "yearqtr" index (regular) > # 2. via "Date" index (not regular) > z.qtr1 <- aggregate(z.day, as.yearqtr, mean) > z.qtr2 <- aggregate(z.day, first.of.quarter, mean) > > # The last one used the first day of the quarter but suppose > # we want the first day of the quarter that exists in the series > # (and the series does not necessarily start on the first day > # of the quarter). > z.day[!duplicated(as.yearqtr(time(z.day)))] 2000-01-01 2000-04-01 2000-07-01 2000-10-01 0 91 182 274 > > # This is the same except it uses the last day of the quarter. > # It requires R 2.6.0 which introduced the fromLast= argument. > ## Not run: > ##D z.day[!duplicated(as.yearqtr(time(z.day)), fromLast = TRUE)] > ## End(Not run) > > # The aggregated series above are of class "zoo" (because z.day > # was "zoo"). To create a regular series of class "zooreg", > # the frequency can be automatically chosen > zr.qtr1 <- aggregate(z.day, as.yearqtr, mean, regular = TRUE) > # or specified explicitely > zr.qtr2 <- aggregate(z.day, as.yearqtr, mean, frequency = 4) > > > ## aggregate on month and extend to monthly time series > if(require(chron)) { + y <- zoo(matrix(11:15, nrow = 5, ncol = 2), chron(c(15, 20, 80, 100, 110))) + colnames(y) <- c("A", "B") + + # aggregate by month using first of month as times for coarser series + # using first day of month as repesentative time + y2 <- aggregate(y, as.Date(as.yearmon(time(y))), head, 1) + + # fill in missing months by merging with an empty series containing + # a complete set of 1st of the months + yrt2 <- range(time(y2)) + y0 <- zoo(,seq(from = yrt2[1], to = yrt2[2], by = "month")) + merge(y2, y0) + } Loading required package: chron A B 1970-01-01 11 11 1970-02-01 NA NA 1970-03-01 13 13 1970-04-01 14 14 > > # given daily series keep only first point in each month at > # day 21 or more > z <- zoo(101:200, as.Date("2000-01-01") + seq(0, length = 100, by = 2)) > zz <- z[as.numeric(format(time(z), "%d")) >= 21] > zz[!duplicated(as.yearmon(time(zz)))] 2000-01-21 2000-02-22 2000-03-21 2000-04-22 2000-05-22 2000-06-21 111 127 141 157 172 187 > > # same except times are of "yearmon" class > aggregate(zz, as.yearmon, head, 1) Jan 2000 Feb 2000 Mar 2000 Apr 2000 May 2000 Jun 2000 111 127 141 157 172 187 > > # aggregate POSIXct seconds data every 10 minutes > tt <- seq(10, 2000, 10) > x <- zoo(tt, structure(tt, class = c("POSIXt", "POSIXct"))) > aggregate(x, time(x) - as.numeric(time(x)) %% 600, mean) 1970-01-01 01:00:00 1970-01-01 01:10:00 1970-01-01 01:20:00 1970-01-01 01:30:00 300 895 1495 1900 > > # aggregate weekly series to a series with frequency of 52 per year > set.seed(1) > z <- zooreg(1:100 + rnorm(100), start = as.Date("2001-01-01"), deltat = 7) > > # new.freq() converts dates to a grid of freq points per year > # yd is sequence of dates of firsts of years > # yy is years of the same sequence > # last line interpolates so dates, d, are transformed to year + frac of year > # so first week of 2001 is 2001.0, second week is 2001 + 1/52, third week > # is 2001 + 2/52, etc. > new.freq <- function(d, freq = 52) { + y <- as.Date(cut(range(d), "years")) + c(0, 367) + yd <- seq(y[1], y[2], "year") + yy <- as.numeric(format(yd, "%Y")) + floor(freq * approx(yd, yy, xout = d)$y) / freq + } > > # take last point in each period > aggregate(z, new.freq, tail, 1) 2001(1) 2001(2) 2001(3) 2001(4) 2001(5) 2001(6) 2001(7) 2001(8) 2.183643 2.164371 5.595281 5.329508 5.179532 7.487429 8.738325 9.575781 2001(9) 2001(10) 2001(11) 2001(12) 2001(13) 2001(14) 2001(15) 2001(16) 9.694612 12.511781 12.389843 12.378759 11.785300 16.124931 15.955066 16.983810 2001(17) 2001(18) 2001(19) 2001(20) 2001(21) 2001(22) 2001(23) 2001(24) 18.943836 19.821221 20.593901 21.918977 22.782136 23.074565 22.010648 25.619826 2001(25) 2001(26) 2001(27) 2001(28) 2001(29) 2001(30) 2001(31) 2001(32) 25.943871 26.844204 26.529248 28.521850 30.417942 32.358680 31.897212 33.387672 2001(33) 2001(34) 2001(35) 2001(36) 2001(37) 2001(38) 2001(39) 2001(40) 33.946195 33.622940 35.585005 36.605710 37.940687 40.100025 40.763176 40.835476 2001(41) 2001(42) 2001(43) 2001(44) 2001(45) 2001(46) 2001(47) 2001(48) 41.746638 43.696963 44.556663 44.311244 45.292505 47.364582 48.768533 48.887654 2001(49) 2001(50) 2001(51) 2001(52) 2002(1) 2002(2) 2002(3) 2002(4) 50.881108 51.398106 51.387974 53.341120 52.870637 56.433024 57.980400 56.632779 2002(5) 2002(6) 2002(7) 2002(8) 2002(9) 2002(10) 2002(11) 2002(12) 56.955865 59.569720 59.864945 63.401618 61.960760 63.689739 64.028002 64.256727 2002(13) 2002(14) 2002(15) 2002(16) 2002(17) 2002(18) 2002(19) 2002(20) 66.188792 65.195041 69.465555 69.153253 72.172612 71.475510 71.290054 73.610726 2002(21) 2002(22) 2002(23) 2002(24) 2002(25) 2002(26) 2002(27) 2002(28) 73.065902 73.746367 76.291446 76.556708 78.001105 79.074341 79.410479 80.431331 2002(29) 2002(30) 2002(31) 2002(32) 2002(33) 2002(34) 2002(35) 2002(36) 81.864821 84.178087 82.476433 85.593946 86.332950 88.063100 87.695816 89.370019 2002(37) 2002(38) 2002(39) 2002(40) 2002(41) 2002(42) 2002(43) 2002(44) 90.267099 90.457480 93.207868 94.160403 94.700214 96.586833 96.558486 95.723408 2002(45) 2002(46) 2002(47) 97.426735 97.775387 99.526599 > > # or, take mean of all points in each > aggregate(z, new.freq, mean) 2001(1) 2001(2) 2001(3) 2001(4) 2001(5) 2001(6) 2001(7) 2001(8) 1.278595 2.164371 5.595281 5.329508 5.179532 7.487429 8.738325 9.575781 2001(9) 2001(10) 2001(11) 2001(12) 2001(13) 2001(14) 2001(15) 2001(16) 9.694612 12.511781 12.389843 12.378759 11.785300 16.124931 15.955066 16.983810 2001(17) 2001(18) 2001(19) 2001(20) 2001(21) 2001(22) 2001(23) 2001(24) 18.943836 19.821221 20.593901 21.918977 22.782136 23.074565 22.010648 25.619826 2001(25) 2001(26) 2001(27) 2001(28) 2001(29) 2001(30) 2001(31) 2001(32) 25.943871 26.844204 26.529248 28.521850 30.417942 32.358680 31.897212 33.387672 2001(33) 2001(34) 2001(35) 2001(36) 2001(37) 2001(38) 2001(39) 2001(40) 33.946195 33.622940 35.585005 36.605710 37.940687 40.100025 40.763176 40.835476 2001(41) 2001(42) 2001(43) 2001(44) 2001(45) 2001(46) 2001(47) 2001(48) 41.746638 43.696963 44.556663 44.311244 45.292505 47.364582 48.768533 48.887654 2001(49) 2001(50) 2001(51) 2001(52) 2002(1) 2002(2) 2002(3) 2002(4) 50.881108 51.398106 51.387974 53.341120 52.870637 56.433024 57.980400 56.632779 2002(5) 2002(6) 2002(7) 2002(8) 2002(9) 2002(10) 2002(11) 2002(12) 56.955865 59.569720 59.864945 63.401618 61.960760 63.689739 64.028002 64.256727 2002(13) 2002(14) 2002(15) 2002(16) 2002(17) 2002(18) 2002(19) 2002(20) 66.188792 65.195041 69.465555 69.153253 72.172612 71.475510 71.290054 73.610726 2002(21) 2002(22) 2002(23) 2002(24) 2002(25) 2002(26) 2002(27) 2002(28) 73.065902 73.746367 76.291446 76.556708 78.001105 79.074341 79.410479 80.431331 2002(29) 2002(30) 2002(31) 2002(32) 2002(33) 2002(34) 2002(35) 2002(36) 81.864821 84.178087 82.476433 85.593946 86.332950 88.063100 87.695816 89.370019 2002(37) 2002(38) 2002(39) 2002(40) 2002(41) 2002(42) 2002(43) 2002(44) 90.267099 90.457480 93.207868 94.160403 94.700214 96.586833 96.558486 95.723408 2002(45) 2002(46) 2002(47) 97.426735 97.775387 99.526599 > > # example of taking means in the presence of NAs > z.na <- zooreg(c(1:364, NA), start = as.Date("2001-01-01")) > aggregate(z.na, as.yearqtr, mean, na.rm = TRUE) 2001 Q1 2001 Q2 2001 Q3 2001 Q4 45.5 136.0 227.5 319.0 > > # Find the sd of all days that lie in any Jan, all days that lie in > # any Feb, ..., all days that lie in any Dec (i.e. output is vector with > # 12 components) > aggregate(z, format(time(z), "%m"), sd) 01 02 03 04 05 06 07 08 27.931987 27.985392 27.679111 27.774779 27.328400 27.840695 27.520893 28.058606 09 10 11 12 27.806512 28.066187 27.406884 1.589453 > > > > > cleanEx() detaching 'package:chron' > nameEx("as.zoo") > ### * as.zoo > > flush(stderr()); flush(stdout()) > > ### Name: as.zoo > ### Title: Coercion from and to zoo > ### Aliases: as.zoo as.zoo.default as.zoo.data.frame as.zoo.fts as.zoo.its > ### as.zoo.irts as.zoo.matrix as.zoo.mcmc as.zoo.tis as.zoo.xts > ### as.zoo.zoo as.matrix.zoo as.vector.zoo as.data.frame.zoo as.list.zoo > ### as.list.ts as.zoo.ts as.ts.zoo > ### Keywords: ts > > ### ** Examples > > ## coercion to zoo: > ## default method > as.zoo(rnorm(5)) 1 2 3 4 5 -0.6264538 0.1836433 -0.8356286 1.5952808 0.3295078 > ## method for "ts" objects > as.zoo(ts(rnorm(5), start = 1981, freq = 12)) 1981(1) 1981(2) 1981(3) 1981(4) 1981(5) -0.8204684 0.4874291 0.7383247 0.5757814 -0.3053884 > > ## coercion from zoo: > x.date <- as.POSIXct(paste("2003-", rep(1:4, 4:1), "-", sample(1:28, 10, replace = TRUE), sep = "")) > x <- zoo(matrix(rnorm(24), ncol = 2), x.date) > as.matrix(x) x.1 x.2 2003-01-04 0.82122120 1.35867955 2003-01-06 -0.01619026 -0.47815006 2003-01-19 0.94383621 0.41794156 2003-01-27 -0.04493361 -1.47075238 2003-02-01 0.78213630 -0.05380504 2003-02-08 0.59390132 -0.10278773 2003-02-11 0.91897737 0.38767161 2003-03-11 0.07456498 -1.37705956 2003-03-25 -1.98935170 -0.41499456 2003-04-10 0.61982575 -0.39428995 > as.vector(x) [1] 0.82122120 -0.01619026 0.94383621 -0.04493361 0.78213630 0.59390132 [7] 0.91897737 0.07456498 -1.98935170 0.61982575 1.35867955 -0.47815006 [13] 0.41794156 -1.47075238 -0.05380504 -0.10278773 0.38767161 -1.37705956 [19] -0.41499456 -0.39428995 > as.data.frame(x) x.1 x.2 2003-01-04 0.82122120 1.35867955 2003-01-06 -0.01619026 -0.47815006 2003-01-19 0.94383621 0.41794156 2003-01-27 -0.04493361 -1.47075238 2003-02-01 0.78213630 -0.05380504 2003-02-08 0.59390132 -0.10278773 2003-02-11 0.91897737 0.38767161 2003-03-11 0.07456498 -1.37705956 2003-03-25 -1.98935170 -0.41499456 2003-04-10 0.61982575 -0.39428995 > as.list(x) $x.1 2003-01-04 2003-01-06 2003-01-19 2003-01-27 2003-02-01 2003-02-08 0.82122120 -0.01619026 0.94383621 -0.04493361 0.78213630 0.59390132 2003-02-11 2003-03-11 2003-03-25 2003-04-10 0.91897737 0.07456498 -1.98935170 0.61982575 $x.2 2003-01-04 2003-01-06 2003-01-19 2003-01-27 2003-02-01 2003-02-08 1.35867955 -0.47815006 0.41794156 -1.47075238 -0.05380504 -0.10278773 2003-02-11 2003-03-11 2003-03-25 2003-04-10 0.38767161 -1.37705956 -0.41499456 -0.39428995 > > > > cleanEx() > nameEx("coredata") > ### * coredata > > flush(stderr()); flush(stdout()) > > ### Name: coredata > ### Title: Extracting/Replacing the Core Data of Objects > ### Aliases: coredata coredata.default coredata.zoo coredata.ts > ### coredata.its coredata.irts coredata<- coredata<-.zoo coredata<-.ts > ### coredata<-.irts coredata<-.its > ### Keywords: ts > > ### ** Examples > > x.date <- as.Date(paste(2003, rep(1:4, 4:1), seq(1,20,2), sep = "-")) > x <- zoo(matrix(rnorm(20), ncol = 2), x.date) > > ## the full time series > x 2003-01-01 -0.6264538 1.51178117 2003-01-03 0.1836433 0.38984324 2003-01-05 -0.8356286 -0.62124058 2003-01-07 1.5952808 -2.21469989 2003-02-09 0.3295078 1.12493092 2003-02-11 -0.8204684 -0.04493361 2003-02-13 0.4874291 -0.01619026 2003-03-15 0.7383247 0.94383621 2003-03-17 0.5757814 0.82122120 2003-04-19 -0.3053884 0.59390132 > ## and only matrix of observations > coredata(x) [,1] [,2] [1,] -0.6264538 1.51178117 [2,] 0.1836433 0.38984324 [3,] -0.8356286 -0.62124058 [4,] 1.5952808 -2.21469989 [5,] 0.3295078 1.12493092 [6,] -0.8204684 -0.04493361 [7,] 0.4874291 -0.01619026 [8,] 0.7383247 0.94383621 [9,] 0.5757814 0.82122120 [10,] -0.3053884 0.59390132 > > ## change the observations > coredata(x) <- matrix(1:20, ncol = 2) > x 2003-01-01 1 11 2003-01-03 2 12 2003-01-05 3 13 2003-01-07 4 14 2003-02-09 5 15 2003-02-11 6 16 2003-02-13 7 17 2003-03-15 8 18 2003-03-17 9 19 2003-04-19 10 20 > > > > cleanEx() > nameEx("frequency") > ### * frequency > > flush(stderr()); flush(stdout()) > > ### Name: frequency<- > ### Title: Replacing the Index of Objects > ### Aliases: frequency<- frequency<-.zoo frequency<-.zooreg > ### Keywords: ts > > ### ** Examples > > z <- zooreg(1:5) > z 1 2 3 4 5 1 2 3 4 5 > as.ts(z) Time Series: Start = 1 End = 5 Frequency = 1 [1] 1 2 3 4 5 > frequency(z) <- 3 > z 1(1) 2(1) 3(1) 4(1) 5(1) 1 2 3 4 5 > as.ts(z) Time Series: Start = c(1, 1) End = c(5, 1) Frequency = 3 [1] 1 NA NA 2 NA NA 3 NA NA 4 NA NA 5 > > > > cleanEx() > nameEx("ggplot2.zoo") > ### * ggplot2.zoo > > flush(stderr()); flush(stdout()) > > ### Name: ggplot2.zoo > ### Title: Convenience Functions for Plotting zoo Objects with ggplot2 > ### Aliases: autoplot.zoo fortify.zoo ggplot2.zoo facet_free yearmon_trans > ### yearqtr_trans scale_x_yearmon scale_y_yearmon scale_x_yearqtr > ### scale_y_yearqtr > > ### ** Examples > > if(require("ggplot2") && require("scales")) { + ## example data + x.Date <- as.Date(paste(2003, 02, c(1, 3, 7, 9, 14), sep = "-")) + x <- zoo(rnorm(5), x.Date) + xlow <- x - runif(5) + xhigh <- x + runif(5) + z <- cbind(x, xlow, xhigh) + + ## univariate plotting + autoplot(x) + ## by hand + ggplot(aes(x = Index, y = Value), data = fortify(x, melt = TRUE)) + + geom_line() + xlab("Index") + ylab("x") + ## adding series one at a time + last_plot() + geom_line(aes(x = Index, y = xlow), colour = "red", data = fortify(xlow)) + ## add ribbon for high/low band + ggplot(aes(x = Index, y = x, ymin = xlow, ymax = xhigh), data = fortify(x)) + + geom_ribbon(fill = "darkgray") + geom_line() + + ## multivariate plotting in multiple or single panels + autoplot(z) ## multiple without color/linetype + autoplot(z, facets = Series ~ .) ## multiple with series-dependent color/linetype + autoplot(z, facets = NULL) ## single with series-dependent color/linetype + ## by hand with color/linetype and with/without facets + qplot(x = Index, y = Value, group = Series, colour = Series, + linetype = Series, facets = Series ~ ., data = fortify(z, melt = TRUE)) + + geom_line() + xlab("Index") + ylab("") + ggplot(aes(x = Index, y = Value, group = Series, colour = Series, linetype = Series), + data = fortify(z, melt = TRUE)) + geom_line() + xlab("Index") + ylab("") + ## variations + autoplot(z, geom = "point") + autoplot(z, facets = NULL) + geom_point() + autoplot(z, facets = NULL) + scale_colour_grey() + theme_bw() + + ## for "ts" series via coercion + autoplot(as.zoo(EuStockMarkets)) + autoplot(as.zoo(EuStockMarkets), facets = NULL) + + autoplot(z) + + aes(colour = NULL, linetype = NULL) + + facet_grid(series ~ ., scales = "free_y") + + autoplot(z) + aes(colour = NULL, linetype = NULL) + facet_free() # same + + z.yq <- zooreg(rnorm(50), as.yearqtr("2000-1"), freq = 4) + autoplot(z.yq) + scale_x_yearqtr() + } Loading required package: ggplot2 Loading required package: scales > > > > cleanEx() detaching 'package:scales', 'package:ggplot2' > nameEx("index") > ### * index > > flush(stderr()); flush(stdout()) > > ### Name: index > ### Title: Extracting/Replacing the Index of Objects > ### Aliases: index index.default index.zoo index.ts time.zoo index<- > ### index<-.zoo time<- time<-.zoo start.zoo end.zoo > ### Keywords: ts > > ### ** Examples > > x.date <- as.Date(paste(2003, 2, c(1, 3, 7, 9, 14), sep = "-")) > x <- zoo(rnorm(5), x.date) > > ## query index/time of a zoo object > index(x) [1] "2003-02-01" "2003-02-03" "2003-02-07" "2003-02-09" "2003-02-14" > time(x) [1] "2003-02-01" "2003-02-03" "2003-02-07" "2003-02-09" "2003-02-14" > > ## change class of index from Date to POSIXct > ## relative to current time zone > x 2003-02-01 2003-02-03 2003-02-07 2003-02-09 2003-02-14 -0.6264538 0.1836433 -0.8356286 1.5952808 0.3295078 > index(x) <- as.POSIXct(format(time(x)),tz="") > x 2003-02-01 2003-02-03 2003-02-07 2003-02-09 2003-02-14 -0.6264538 0.1836433 -0.8356286 1.5952808 0.3295078 > > ## replace index/time of a zoo object > index(x) <- 1:5 > x 1 2 3 4 5 -0.6264538 0.1836433 -0.8356286 1.5952808 0.3295078 > time(x) <- 6:10 > x 6 7 8 9 10 -0.6264538 0.1836433 -0.8356286 1.5952808 0.3295078 > > ## query start and end of a zoo object > start(x) [1] 6 > end(x) [1] 10 > > ## query index of a usual matrix > xm <- matrix(rnorm(10), ncol = 2) > index(xm) [1] 1 2 3 4 5 > > > > cleanEx() > nameEx("is.regular") > ### * is.regular > > flush(stderr()); flush(stdout()) > > ### Name: is.regular > ### Title: Check Regularity of a Series > ### Aliases: is.regular is.regular.zoo is.regular.ts is.regular.zooreg > ### is.regular.default > ### Keywords: ts > > ### ** Examples > > ## checking of a strictly regular zoo series > z <- zoo(1:10, seq(2000, 2002.25, by = 0.25), frequency = 4) > z 2000(1) 2000(2) 2000(3) 2000(4) 2001(1) 2001(2) 2001(3) 2001(4) 2002(1) 2002(2) 1 2 3 4 5 6 7 8 9 10 > class(z) [1] "zooreg" "zoo" > frequency(z) ## extraction of frequency attribute [1] 4 > is.regular(z) [1] TRUE > is.regular(z, strict = TRUE) [1] TRUE > ## by omitting observations, the series is not strictly regular > is.regular(z[-3]) [1] TRUE > is.regular(z[-3], strict = TRUE) [1] FALSE > > ## checking of a plain zoo series without frequency attribute > ## which is in fact regular > z <- zoo(1:10, seq(2000, 2002.25, by = 0.25)) > z 2000 2000.25 2000.5 2000.75 2001 2001.25 2001.5 2001.75 2002 2002.25 1 2 3 4 5 6 7 8 9 10 > class(z) [1] "zoo" > frequency(z) ## data driven computation of frequency [1] 4 > is.regular(z) [1] TRUE > is.regular(z, strict = TRUE) [1] TRUE > ## by omitting observations, the series is not strictly regular > is.regular(z[-3]) [1] TRUE > is.regular(z[-3], strict = TRUE) [1] FALSE > > ## checking of an irregular zoo series > z <- zoo(1:10, rnorm(10)) > z -0.8356 -0.8205 -0.6265 -0.3054 0.1836 0.3295 0.4874 0.5758 0.7383 1.5953 3 6 1 10 2 5 7 9 8 4 > class(z) [1] "zoo" > frequency(z) ## attempt of data-driven frequency computation NULL > is.regular(z) [1] FALSE > is.regular(z, strict = TRUE) [1] FALSE > > > > cleanEx() > nameEx("lag.zoo") > ### * lag.zoo > > flush(stderr()); flush(stdout()) > > ### Name: lag.zoo > ### Title: Lags and Differences of zoo Objects > ### Aliases: lag.zoo diff.zoo > ### Keywords: ts > > ### ** Examples > > x <- zoo(11:21) > > lag(x, k = 1) 1 2 3 4 5 6 7 8 9 10 12 13 14 15 16 17 18 19 20 21 > lag(x, k = -1) 2 3 4 5 6 7 8 9 10 11 11 12 13 14 15 16 17 18 19 20 > # this pairs each value of x with the next or future value > merge(x, lag1 = lag(x, k=1)) x lag1 1 11 12 2 12 13 3 13 14 4 14 15 5 15 16 6 16 17 7 17 18 8 18 19 9 19 20 10 20 21 11 21 NA > diff(x^3) 2 3 4 5 6 7 8 9 10 11 397 469 547 631 721 817 919 1027 1141 1261 > diff(x^3, -1) 1 2 3 4 5 6 7 8 9 10 397 469 547 631 721 817 919 1027 1141 1261 > diff(x^3, na.pad = TRUE) 1 2 3 4 5 6 7 8 9 10 11 NA 397 469 547 631 721 817 919 1027 1141 1261 > > > > > cleanEx() > nameEx("make.par.list") > ### * make.par.list > > flush(stderr()); flush(stdout()) > > ### Name: make.par.list > ### Title: Make a List from a Parameter Specification > ### Aliases: make.par.list > ### Keywords: ts > > ### ** Examples > > make.par.list(letters[1:5], 1:5, 3, 5) $a [1] 1 $b [1] 2 $c [1] 3 $d [1] 4 $e [1] 5 > suppressWarnings( make.par.list(letters[1:5], 1:4, 3, 5, 99) ) $a [1] 1 $b [1] 2 $c [1] 3 $d [1] 4 $e [1] 1 > make.par.list(letters[1:5], c(d=3), 3, 5, 99) $a [1] 99 $b [1] 99 $c [1] 99 $d [1] 3 $e [1] 99 > make.par.list(letters[1:5], list(d=1:2, 99), 3, 5) $a [1] 99 $b [1] 99 $c [1] 99 $d [1] 1 2 1 $e [1] 99 > make.par.list(letters[1:5], list(d=1:2, 99, 100), 3, 5) $a [1] 99 $b [1] 100 $c [1] 99 $d [1] 1 2 1 $e [1] 100 > > > > cleanEx() > nameEx("merge.zoo") > ### * merge.zoo > > flush(stderr()); flush(stdout()) > > ### Name: merge.zoo > ### Title: Merge Two or More zoo Objects > ### Aliases: merge.zoo rbind.zoo c.zoo cbind.zoo > ### Keywords: ts > > ### ** Examples > > ## simple merging > x.date <- as.Date(paste(2003, 02, c(1, 3, 7, 9, 14), sep = "-")) > x <- zoo(rnorm(5), x.date) > > y1 <- zoo(matrix(1:10, ncol = 2), 1:5) > y2 <- zoo(matrix(rnorm(10), ncol = 2), 3:7) > > ## using arguments `fill' and `suffixes' > merge(y1, y2, all = FALSE) y1.1 y1.2 y2.1 y2.2 3 3 8 -0.8204684 1.5117812 4 4 9 0.4874291 0.3898432 5 5 10 0.7383247 -0.6212406 > merge(y1, y2, all = FALSE, suffixes = c("a", "b")) a.1 a.2 b.1 b.2 3 3 8 -0.8204684 1.5117812 4 4 9 0.4874291 0.3898432 5 5 10 0.7383247 -0.6212406 > merge(y1, y2, all = TRUE) y1.1 y1.2 y2.1 y2.2 1 1 6 NA NA 2 2 7 NA NA 3 3 8 -0.8204684 1.5117812 4 4 9 0.4874291 0.3898432 5 5 10 0.7383247 -0.6212406 6 NA NA 0.5757814 -2.2146999 7 NA NA -0.3053884 1.1249309 > merge(y1, y2, all = TRUE, fill = 0) y1.1 y1.2 y2.1 y2.2 1 1 6 0.0000000 0.0000000 2 2 7 0.0000000 0.0000000 3 3 8 -0.8204684 1.5117812 4 4 9 0.4874291 0.3898432 5 5 10 0.7383247 -0.6212406 6 0 0 0.5757814 -2.2146999 7 0 0 -0.3053884 1.1249309 > > ## if different index classes are merged, as in > ## the next merge example then ## a warning is issued and > ### the indexes are coerced. > ## It is up to the user to ensure that the result makes sense. > merge(x, y1, y2, all = TRUE) Warning in merge.zoo(x, y1, y2, all = TRUE) : Index vectors are of different classes: Date integer integer x y1.1 y1.2 y2.1 y2.2 1970-01-02 NA 1 6 NA NA 1970-01-03 NA 2 7 NA NA 1970-01-04 NA 3 8 -0.8204684 1.5117812 1970-01-05 NA 4 9 0.4874291 0.3898432 1970-01-06 NA 5 10 0.7383247 -0.6212406 1970-01-07 NA NA NA 0.5757814 -2.2146999 1970-01-08 NA NA NA -0.3053884 1.1249309 2003-02-01 -0.6264538 NA NA NA NA 2003-02-03 0.1836433 NA NA NA NA 2003-02-07 -0.8356286 NA NA NA NA 2003-02-09 1.5952808 NA NA NA NA 2003-02-14 0.3295078 NA NA NA NA > > ## extend an irregular series to a regular one: > # create a constant series > z <- zoo(1, seq(4)[-2]) > # create a 0 dimensional zoo series > z0 <- zoo(, 1:4) > # do the extension > merge(z, z0) 1 2 3 4 1 NA 1 1 > # same but with zero fill > merge(z, z0, fill = 0) 1 2 3 4 1 0 1 1 > > merge(z, coredata(z), 1) z coredata(z) 1 1 1 1 1 3 1 1 1 4 1 1 1 > > > ## merge multiple series represented in a long form data frame > ## into a multivariate zoo series and plot, one series for each site. > ## Additional examples can be found here: > ## https://stat.ethz.ch/pipermail/r-help/2009-February/187094.html > ## https://stat.ethz.ch/pipermail/r-help/2009-February/187096.html > ## > m <- 5 # no of years > n <- 6 # no of sites > sites <- LETTERS[1:n] > set.seed(1) > DF <- data.frame(site = sites, year = 2000 + 1:m, data = rnorm(m*n)) > tozoo <- function(x) zoo(x$data, x$year) > Data <- do.call(merge, lapply(split(DF, DF$site), tozoo)) > plot(Data, screen = 1, col = 1:n, pch = 1:n, type = "o", xlab = "") > legend("bottomleft", legend = sites, lty = 1, pch = 1:n, col = 1:n) > > ## for each index value in x merge it with the closest index value in y > ## but retaining x's times. > x<-zoo(1:3,as.Date(c("1992-12-13", "1997-05-12", "1997-07-13"))) > y<-zoo(1:5,as.Date(c("1992-12-15", "1992-12-16", "1997-05-10","1997-05-19", "1997-07-13"))) > f <- function(u) which.min(abs(as.numeric(index(y)) - as.numeric(u))) > ix <- sapply(index(x), f) > cbind(x, y = coredata(y)[ix]) x y 1992-12-13 1 1 1997-05-12 2 3 1997-07-13 3 5 > > ## this merges each element of x with the closest time point in y at or > ## after x's time point (whereas in previous example it could be before > ## or after) > window(na.locf(merge(x, y), fromLast = TRUE), index(x)) x y 1992-12-13 1 1 1997-05-12 2 4 1997-07-13 3 5 > > > > > > cleanEx() > nameEx("na.StructTS") > ### * na.StructTS > > flush(stderr()); flush(stdout()) > > ### Name: na.StructTS > ### Title: Fill NA or specified positions. > ### Aliases: na.StructTS na.StructTS.zoo na.StructTS.ts > ### Keywords: ts > > ### ** Examples > > > z <- zooreg(rep(10 * seq(8), each = 4) + rep(c(3, 1, 2, 4), times = 8), + start = as.yearqtr(2000), freq = 4) > z[25] <- NA > > zout <- na.StructTS(z) > > plot(cbind(z, zout), screen = 1, col = 1:2, type = c("l", "p"), pch = 20) > > > > > > cleanEx() > nameEx("na.aggregate") > ### * na.aggregate > > flush(stderr()); flush(stdout()) > > ### Name: na.aggregate > ### Title: Replace NA by Aggregation > ### Aliases: na.aggregate na.aggregate.default > ### Keywords: ts > > ### ** Examples > > z <- zoo(c(1, NA, 3:9), + c(as.Date("2010-01-01") + 0:2, + as.Date("2010-02-01") + 0:2, + as.Date("2011-01-01") + 0:2)) > ## overall mean > na.aggregate(z) 2010-01-01 2010-01-02 2010-01-03 2010-02-01 2010-02-02 2010-02-03 2011-01-01 1.000 5.375 3.000 4.000 5.000 6.000 7.000 2011-01-02 2011-01-03 8.000 9.000 > ## group by months > na.aggregate(z, as.yearmon) 2010-01-01 2010-01-02 2010-01-03 2010-02-01 2010-02-02 2010-02-03 2011-01-01 1 2 3 4 5 6 7 2011-01-02 2011-01-03 8 9 > ## group by calendar months > na.aggregate(z, months) 2010-01-01 2010-01-02 2010-01-03 2010-02-01 2010-02-02 2010-02-03 2011-01-01 1.0 5.6 3.0 4.0 5.0 6.0 7.0 2011-01-02 2011-01-03 8.0 9.0 > ## group by years > na.aggregate(z, format, "%Y") 2010-01-01 2010-01-02 2010-01-03 2010-02-01 2010-02-02 2010-02-03 2011-01-01 1.0 3.8 3.0 4.0 5.0 6.0 7.0 2011-01-02 2011-01-03 8.0 9.0 > > > > cleanEx() > nameEx("na.approx") > ### * na.approx > > flush(stderr()); flush(stdout()) > > ### Name: na.approx > ### Title: Replace NA by Interpolation > ### Aliases: na.approx na.approx.zoo na.approx.zooreg na.approx.ts > ### na.approx.default na.spline na.spline.zoo na.spline.zooreg > ### na.spline.ts na.spline.default > ### Keywords: ts > > ### ** Examples > > > z <- zoo(c(2, NA, 1, 4, 5, 2), c(1, 3, 4, 6, 7, 8)) > > ## use underlying time scale for interpolation > na.approx(z) 1 3 4 6 7 8 2.000000 1.333333 1.000000 4.000000 5.000000 2.000000 > ## use equidistant spacing > na.approx(z, 1:6) 1 3 4 6 7 8 2.0 1.5 1.0 4.0 5.0 2.0 > > # with and without na.rm = FALSE > zz <- c(NA, 9, 3, NA, 3, 2) > na.approx(zz, na.rm = FALSE) [1] NA 9 3 3 3 2 > na.approx(zz) [1] 9 3 3 3 2 > > d0 <- as.Date("2000-01-01") > z <- zoo(c(11, NA, 13, NA, 15, NA), d0 + 1:6) > > # NA fill, drop or keep leading/trailing NAs > na.approx(z) 2000-01-02 2000-01-03 2000-01-04 2000-01-05 2000-01-06 11 12 13 14 15 > na.approx(z, na.rm = FALSE) 2000-01-02 2000-01-03 2000-01-04 2000-01-05 2000-01-06 2000-01-07 11 12 13 14 15 NA > > # extrapolate to point outside of range of time points > # (a) drop NA, (b) keep NA, (c) extrapolate using rule = 2 from approx() > na.approx(z, xout = d0 + 7) Data: numeric(0) Index: character(0) > na.approx(z, xout = d0 + 7, na.rm = FALSE) 2000-01-08 NA > na.approx(z, xout = d0 + 7, rule = 2) 2000-01-08 15 > > # use splines - extrapolation handled differently > z <- zoo(c(11, NA, 13, NA, 15, NA), d0 + 1:6) > na.spline(z) 2000-01-02 2000-01-03 2000-01-04 2000-01-05 2000-01-06 2000-01-07 11 12 13 14 15 16 > na.spline(z, na.rm = FALSE) 2000-01-02 2000-01-03 2000-01-04 2000-01-05 2000-01-06 2000-01-07 11 12 13 14 15 16 > na.spline(z, xout = d0 + 1:6) 2000-01-02 2000-01-03 2000-01-04 2000-01-05 2000-01-06 2000-01-07 11 12 13 14 15 16 > na.spline(z, xout = d0 + 2:5) 2000-01-03 2000-01-04 2000-01-05 2000-01-06 12 13 14 15 > na.spline(z, xout = d0 + 7) 2000-01-08 17 > na.spline(z, xout = d0 + 7, na.rm = FALSE) 2000-01-08 17 > > ## using na.approx for disaggregation > zy <- zoo(1:3, 2000:2001) > > # yearly to monthly series > zmo <- na.approx(zy, xout = as.yearmon(2000+0:13/12)) > zmo Jan 2000 Feb 2000 Mar 2000 Apr 2000 May 2000 Jun 2000 Jul 2000 Aug 2000 1.000000 1.083333 1.166667 1.250000 1.333333 1.416667 1.500000 1.583333 Sep 2000 Oct 2000 Nov 2000 Dec 2000 Jan 2001 1.666667 1.750000 1.833333 1.916667 2.000000 > > # monthly to daily series > sq <- seq(as.Date(start(zmo)), as.Date(end(zmo), frac = 1), by = "day") > zd <- na.approx(zmo, x = as.Date, xout = sq) > head(zd) 2000-01-01 2000-01-02 2000-01-03 2000-01-04 2000-01-05 2000-01-06 1.000000 1.002688 1.005376 1.008065 1.010753 1.013441 > > # weekly to daily series > zww <- zoo(1:3, as.Date("2001-01-01") + seq(0, length = 3, by = 7)) > zww 2001-01-01 2001-01-08 2001-01-15 1 2 3 > zdd <- na.approx(zww, xout = seq(start(zww), end(zww), by = "day")) > zdd 2001-01-01 2001-01-02 2001-01-03 2001-01-04 2001-01-05 2001-01-06 2001-01-07 1.000000 1.142857 1.285714 1.428571 1.571429 1.714286 1.857143 2001-01-08 2001-01-09 2001-01-10 2001-01-11 2001-01-12 2001-01-13 2001-01-14 2.000000 2.142857 2.285714 2.428571 2.571429 2.714286 2.857143 2001-01-15 3.000000 > > # The lines do not show up because of the NAs > plot(cbind(z, z), type = "b", screen = 1) > # use na.approx to force lines to appear > plot(cbind(z, na.approx(z)), type = "b", screen = 1) > > # Workaround where less than 2 NAs can appear in a column > za <- zoo(cbind(1:5, NA, c(1:3, NA, 5), NA)); za 1 1 NA 1 NA 2 2 NA 2 NA 3 3 NA 3 NA 4 4 NA NA NA 5 5 NA 5 NA > > ix <- colSums(!is.na(za)) > 0 > za[, ix] <- na.approx(za[, ix]); za 1 1 NA 1 NA 2 2 NA 2 NA 3 3 NA 3 NA 4 4 NA 4 NA 5 5 NA 5 NA > > # using na.approx to create regularly spaced series > # z has points at 10, 20 and 40 minutes while output also has a point at 30 > if(require("chron")) { + tt <- as.chron("2000-01-01 10:00:00") + c(1, 2, 4) * as.numeric(times("00:10:00")) + z <- zoo(1:3, tt) + tseq <- seq(start(z), end(z), by = times("00:10:00")) + na.approx(z, xout = tseq) + } Loading required package: chron (01/01/00 10:10:00) (01/01/00 10:20:00) (01/01/00 10:30:00) 1.0 2.0 2.5 > > > > cleanEx() detaching 'package:chron' > nameEx("na.fill") > ### * na.fill > > flush(stderr()); flush(stdout()) > > ### Name: na.fill > ### Title: Fill NA or specified positions. > ### Aliases: na.fill na.fill.ts na.fill.zoo na.fill.default > ### Keywords: ts > > ### ** Examples > > > z <- zoo(c(NA, 2, NA, 1, 4, 5, 2, NA)) > na.fill(z, "extend") 1 2 3 4 5 6 7 8 2.0 2.0 1.5 1.0 4.0 5.0 2.0 2.0 > na.fill(z, c("extend", NA)) 1 2 3 4 5 6 7 8 2 2 NA 1 4 5 2 2 > na.fill(z, -(1:3)) 1 2 3 4 5 6 7 8 -1 2 -2 1 4 5 2 -3 > na.fill(z, list(NA, NULL, NA)) 1 2 4 5 6 7 8 NA 2 1 4 5 2 NA > > > > > cleanEx() > nameEx("na.locf") > ### * na.locf > > flush(stderr()); flush(stdout()) > > ### Name: na.locf > ### Title: Last Observation Carried Forward > ### Aliases: na.locf na.locf.data.frame na.locf.list na.locf.default > ### Keywords: ts > > ### ** Examples > > az <- zoo(1:6) > > bz <- zoo(c(2,NA,1,4,5,2)) > na.locf(bz) 1 2 3 4 5 6 2 2 1 4 5 2 > na.locf(bz, fromLast = TRUE) 1 2 3 4 5 6 2 1 1 4 5 2 > > cz <- zoo(c(NA,9,3,2,3,2)) > na.locf(cz) 2 3 4 5 6 9 3 2 3 2 > > # generate and fill in missing dates > z <- zoo(c(0.007306621, 0.007659046, 0.007681013, + 0.007817548, 0.007847579, 0.007867313), + as.Date(c("1993-01-01", "1993-01-09", "1993-01-16", + "1993-01-23", "1993-01-30", "1993-02-06"))) > g <- seq(start(z), end(z), "day") > na.locf(z, xout = g) 1993-01-01 1993-01-02 1993-01-03 1993-01-04 1993-01-05 1993-01-06 0.007306621 0.007306621 0.007306621 0.007306621 0.007306621 0.007306621 1993-01-07 1993-01-08 1993-01-09 1993-01-10 1993-01-11 1993-01-12 0.007306621 0.007306621 0.007659046 0.007659046 0.007659046 0.007659046 1993-01-13 1993-01-14 1993-01-15 1993-01-16 1993-01-17 1993-01-18 0.007659046 0.007659046 0.007659046 0.007681013 0.007681013 0.007681013 1993-01-19 1993-01-20 1993-01-21 1993-01-22 1993-01-23 1993-01-24 0.007681013 0.007681013 0.007681013 0.007681013 0.007817548 0.007817548 1993-01-25 1993-01-26 1993-01-27 1993-01-28 1993-01-29 1993-01-30 0.007817548 0.007817548 0.007817548 0.007817548 0.007817548 0.007847579 1993-01-31 1993-02-01 1993-02-02 1993-02-03 1993-02-04 1993-02-05 0.007847579 0.007847579 0.007847579 0.007847579 0.007847579 0.007847579 1993-02-06 0.007867313 > > # similar but use a 2 second grid > > z <- zoo(1:9, as.POSIXct(c("2010-01-04 09:30:02", "2010-01-04 09:30:06", + "2010-01-04 09:30:07", "2010-01-04 09:30:08", "2010-01-04 09:30:09", + "2010-01-04 09:30:10", "2010-01-04 09:30:11", "2010-01-04 09:30:13", + "2010-01-04 09:30:14"))) > > g <- seq(start(z), end(z), by = "2 sec") > na.locf(z, xout = g) 2010-01-04 09:30:02 2010-01-04 09:30:04 2010-01-04 09:30:06 2010-01-04 09:30:08 1 1 2 4 2010-01-04 09:30:10 2010-01-04 09:30:12 2010-01-04 09:30:14 6 7 9 > > ## get 5th of every month or most recent date prior to 5th if 5th missing. > ## Result has index of the date actually used. > > z <- zoo(c(1311.56, 1309.04, 1295.5, 1296.6, 1286.57, 1288.12, + 1289.12, 1289.12, 1285.33, 1307.65, 1309.93, 1311.46, 1311.28, + 1308.11, 1301.74, 1305.41, 1309.72, 1310.61, 1305.19, 1313.21, + 1307.85, 1312.25, 1325.76), as.Date(c(13242, 13244, + 13245, 13248, 13249, 13250, 13251, 13252, 13255, 13256, 13257, + 13258, 13259, 13262, 13263, 13264, 13265, 13266, 13269, 13270, + 13271, 13272, 13274))) > > # z.na is same as z but with missing days added (with NAs) > # It is formed by merging z with a zero with series having all the dates. > > rng <- range(time(z)) > z.na <- merge(z, zoo(, seq(rng[1], rng[2], by = "day"))) > > # use na.locf to bring values forward picking off 5th of month > na.locf(z.na)[as.POSIXlt(time(z.na))$mday == 5] 2006-04-05 2006-05-05 1311.56 1312.25 > > ## this is the same as the last one except instead of always using the > ## 5th of month in the result we show the date actually used > > # idx has NAs wherever z.na does but has 1, 2, 3, ... instead of > # z.na's data values (so idx can be used for indexing) > > idx <- coredata(na.locf(seq_along(z.na) + (0 * z.na))) > > # pick off those elements of z.na that correspond to 5th > > z.na[idx[as.POSIXlt(time(z.na))$mday == 5]] 2006-04-04 2006-05-04 1311.56 1312.25 > > ## only fill single-day gaps > > merge(z.na, filled1 = na.locf(z.na, maxgap = 1)) z.na filled1 2006-04-04 1311.56 1311.56 2006-04-05 NA 1311.56 2006-04-06 1309.04 1309.04 2006-04-07 1295.50 1295.50 2006-04-08 NA NA 2006-04-09 NA NA 2006-04-10 1296.60 1296.60 2006-04-11 1286.57 1286.57 2006-04-12 1288.12 1288.12 2006-04-13 1289.12 1289.12 2006-04-14 1289.12 1289.12 2006-04-15 NA NA 2006-04-16 NA NA 2006-04-17 1285.33 1285.33 2006-04-18 1307.65 1307.65 2006-04-19 1309.93 1309.93 2006-04-20 1311.46 1311.46 2006-04-21 1311.28 1311.28 2006-04-22 NA NA 2006-04-23 NA NA 2006-04-24 1308.11 1308.11 2006-04-25 1301.74 1301.74 2006-04-26 1305.41 1305.41 2006-04-27 1309.72 1309.72 2006-04-28 1310.61 1310.61 2006-04-29 NA NA 2006-04-30 NA NA 2006-05-01 1305.19 1305.19 2006-05-02 1313.21 1313.21 2006-05-03 1307.85 1307.85 2006-05-04 1312.25 1312.25 2006-05-05 NA 1312.25 2006-05-06 1325.76 1325.76 > > ## fill NAs in first column by inflating the most recent non-NA > ## by the growth in second column. Note that elements of x-x > ## are NA if the corresponding element of x is NA and zero else > > m <- zoo(cbind(c(1, 2, NA, NA, 5, NA, NA), seq(7)^2), as.Date(1:7)) > > r <- na.locf(m[,1]) * m[,2] / na.locf(m[,2] + (m[,1]-m[,1])) > cbind(V1 = r, V2 = m[,2]) V1 V2 1970-01-02 1.0 1 1970-01-03 2.0 4 1970-01-04 4.5 9 1970-01-05 8.0 16 1970-01-06 5.0 25 1970-01-07 7.2 36 1970-01-08 9.8 49 > > ## repeat a quarterly value every month > ## preserving NAs > zq <- zoo(c(1, NA, 3, 4), as.yearqtr(2000) + 0:3/4) > tt <- as.yearmon(start(zq)) + seq(0, len = 3 * length(zq))/12 > na.locf(zq, xout = tt, maxgap = 0) Jan 2000 Feb 2000 Mar 2000 Apr 2000 May 2000 Jun 2000 Jul 2000 Aug 2000 1 1 1 NA NA NA 3 3 Sep 2000 Oct 2000 Nov 2000 Dec 2000 3 4 4 4 > > > > > > cleanEx() > nameEx("na.trim") > ### * na.trim > > flush(stderr()); flush(stdout()) > > ### Name: na.trim > ### Title: Trim Leading/Trailing Missing Observations > ### Aliases: na.trim na.trim.default na.trim.ts > ### Keywords: ts > > ### ** Examples > > # examples of na.trim > x <- zoo(c(1, 4, 6), c(2, 4, 6)) > xx <- zoo(matrix(c(1, 4, 6, NA, 5, 7), 3), c(2, 4, 6)) > na.trim(x) 2 4 6 1 4 6 > na.trim(xx) 4 4 5 6 6 7 > > # using na.trim for alignment > # cal defines the legal dates > # all dates within the date range of x should be present > cal <- zoo(,c(1, 2, 3, 6, 7)) > x <- zoo(c(12, 16), c(2, 6)) > na.trim(merge(x, cal)) 2 3 6 12 NA 16 > > > > > cleanEx() > nameEx("plot.zoo") > ### * plot.zoo > > flush(stderr()); flush(stdout()) > > ### Name: plot.zoo > ### Title: Plotting zoo Objects > ### Aliases: plot.zoo barplot.zoo lines.zoo points.zoo > ### Keywords: ts > > ### ** Examples > > ## example dates > x.Date <- as.Date(paste(2003, 02, c(1, 3, 7, 9, 14), sep = "-")) > > ## univariate plotting > x <- zoo(rnorm(5), x.Date) > x2 <- zoo(rnorm(5, sd = 0.2), x.Date) > plot(x) > lines(x2, col = 2) > > ## multivariate plotting > z <- cbind(x, x2, zoo(rnorm(5, sd = 0.5), x.Date)) > plot(z, type = "b", pch = 1:3, col = 1:3, ylab = list(expression(mu), "b", "c")) > colnames(z) <- LETTERS[1:3] > plot(z, screens = 1, col = list(B = 2)) > plot(z, type = "b", pch = 1:3, col = 1:3) > plot(z, type = "b", pch = list(A = 1:5, B = 3), col = list(C = 4, 2)) > plot(z, type = "b", screen = c(1,2,1), col = 1:3) > # right axis is for broken lines > plot(x) > opar <- par(usr = c(par("usr")[1:2], range(x2))) > lines(x2, lty = 2) > # axis(4) > axis(side = 4) > par(opar) > > > ## Custom x axis labelling using a custom panel. > # 1. test data > z <- zoo(c(21, 34, 33, 41, 39, 38, 37, 28, 33, 40), + as.Date(c("1992-01-10", "1992-01-17", "1992-01-24", "1992-01-31", + "1992-02-07", "1992-02-14", "1992-02-21", "1992-02-28", "1992-03-06", + "1992-03-13"))) > zz <- merge(a = z, b = z+10) > # 2. axis tick for every point. Also every 3rd point labelled. > my.panel <- function(x, y, ..., pf = parent.frame()) { + fmt <- "%b-%d" # format for axis labels + lines(x, y, ...) + # if bottom panel + if (with(pf, length(panel.number) == 0 || + panel.number %% nr == 0 || panel.number == nser)) { + # create ticks at x values and then label every third tick + axis(side = 1, at = x, labels = FALSE) + ix <- seq(1, length(x), 3) + labs <- format(x, fmt) + axis(side = 1, at = x[ix], labels = labs[ix], tcl = -0.7, cex.axis = 0.7) + } + } > # 3. plot > plot(zz, panel = my.panel, xaxt = "n") > > # with a single panel plot a fancy x-axis is just the same > # procedure as for the ordinary plot command > plot(zz, screen = 1, col = 1:2, xaxt = "n") > # axis(1, at = time(zz), labels = FALSE) > tt <- time(zz) > axis(side = 1, at = tt, labels = FALSE) > ix <- seq(1, length(tt), 3) > fmt <- "%b-%d" # format for axis labels > labs <- format(tt, fmt) > # axis(1, at = time(zz)[ix], labels = labs[ix], tcl = -0.7, cex.axis = 0.7) > axis(side = 1, at = tt[ix], labels = labs[ix], tcl = -0.7, cex.axis = 0.7) > legend("bottomright", colnames(zz), lty = 1, col = 1:2) > > ## plot a mulitple ts series with nice x-axis using panel function > tab <- ts(cbind(A = 1:24, B = 24:1), start = c(2006, 1), freq = 12) > pnl.xaxis <- function(...) { + lines(...) + panel.number <- parent.frame()$panel.number + nser <- parent.frame()$nser + # if bottom panel + if (!length(panel.number) || panel.number == nser) { + tt <- list(...)[[1]] + ym <- as.yearmon(tt) + mon <- as.numeric(format(ym, "%m")) + yy <- format(ym, "%y") + mm <- substring(month.abb[mon], 1, 1) + if (any(mon == 1)) + # axis(1, tt[mon == 1], yy[mon == 1], cex.axis = 0.7) + axis(side = 1, at = tt[mon == 1], labels = yy[mon == 1], cex.axis = 0.7) + # axis(1, tt[mon > 1], mm[mon > 1], cex.axis = 0.5, tcl = -0.3) + axis(side = 1, at = tt[mon > 1], labels = mm[mon > 1], cex.axis = 0.5, tcl = -0.3) + } + } > plot(as.zoo(tab), panel = pnl.xaxis, xaxt = "n", main = "Fancy X Axis") > > ## Another example with a custom axis > # test data > z <- zoo(matrix(1:25, 5), c(10,11,20,21)) > colnames(z) <- letters[1:5] > > plot(zoo(coredata(z)), xaxt = "n", panel = function(x, y, ..., Time = time(z)) { + lines(x, y, ...) + # if bottom panel + pf <- parent.frame() + if (with(pf, panel.number %% nr == 0 || panel.number == nser)) { + axis(side = 1, at = x, labels = Time) + } + }) > > > ## plot with left and right axes > ## modified from http://www.mayin.org/ajayshah/KB/R/html/g6.html > set.seed(1) > z <- zoo(cbind(A = cumsum(rnorm(100)), B = cumsum(rnorm(100, mean = 0.2)))) > opar <- par(mai = c(.8, .8, .2, .8)) > plot(z[,1], type = "l", + xlab = "x-axis label", ylab = colnames(z)[1]) > par(new = TRUE) > plot(z[,2], type = "l", ann = FALSE, yaxt = "n", col = "blue") > # axis(4) > axis(side = 4) > legend(x = "topleft", bty = "n", lty = c(1,1), col = c("black", "blue"), + legend = paste(colnames(z), c("(left scale)", "(right scale)"))) > usr <- par("usr") > # if you don't care about srt= in text then mtext is shorter: > # mtext(colnames(z)[2], 4, 2, col = "blue") > text(usr[2] + .1 * diff(usr[1:2]), mean(usr[3:4]), colnames(z)[2], + srt = -90, xpd = TRUE, col = "blue") > par(opar) > > > ## another plot with left and right axes > ## modified from https://stat.ethz.ch/pipermail/r-help/2014-May/375293.html > d1 <- c(38.2, 18.1, 83.2, 42.7, 22.8, 48.1, 81.8, 129.6, 52.0, 110.3) > d2 <- c(2.2, 0.8, 0.7, 1.6, 0.9, 0.9, 1.1, 2.8, 5.1, 2.1) > z1 <- zooreg(d1, start = as.POSIXct("2013-01-01 00:00:01"), frequency = 0.0000006) > z2 <- zooreg(d2, start = as.POSIXct("2013-01-01 00:00:20"), frequency = 0.0000006) > zt <- zooreg(rnorm(1050), start = as.POSIXct("2013-01-01 00:00:01"), frequency = 0.00007) > z <- merge(zt, z1, z2, all = TRUE) > z <- na.spline(z[,2:3], na.rm = FALSE) > ## function to round up to a number divisible by n (2011 by Owen Jones) > roundup <- function(x, n) ceiling(ceiling(x)/n) * n > ## plot how to match secondary y-axis ticks to primary ones > plot(z$z1, ylim = c(0, signif(max(na.omit(z$z1)), 2)), xlab = "") > ## use multiplication for even tick numbers and fake sekondary y-axis > max.yl <- roundup(max(na.omit(z$z2)), par("yaxp")[3]) > multipl.yl <- max(na.omit(z$z2)) / max.yl > multipl.z2 <- signif(max(na.omit(z$z1) * 1.05), 2)/max.yl > lines(z$z2 * multipl.z2, lty = 2) > at4 <- axTicks(4) > axis(4, at = at4, seq(0, max.yl, length.out = par("yaxp")[3] + 1)) > > > # automatically placed point labels > ## Not run: > ##D library("maptools") > ##D pointLabel(time(z), coredata(z[,2]), labels = format(time(z)), cex = 0.5) > ## End(Not run) > > ## plot one zoo series against the other. > plot(x, x2) > plot(x, x2, xy.labels = TRUE) > plot(x, x2, xy.labels = 1:5, xy.lines = FALSE) > > ## shade a portion of a plot and make axis fancier > > v <- zooreg(rnorm(50), start = as.yearmon(2004), freq = 12) > > plot(v, type = "n") > u <- par("usr") > rect(as.yearmon("2007-8"), u[3], as.yearmon("2009-11"), u[4], + border = 0, col = "grey") > lines(v) > axis(1, floor(time(v)), labels = FALSE, tcl = -1) > > ## shade certain times to show recessions, etc. > v <- zooreg(rnorm(50), start = as.yearmon(2004), freq = 12) > plot(v, type = "n") > u <- par("usr") > rect(as.yearmon("2007-8"), u[3], as.yearmon("2009-11"), u[4], + border = 0, col = "grey") > lines(v) > axis(1, floor(time(v)), labels = FALSE, tcl = -1) > > ## fill area under plot > > pnl.xyarea <- function(x, y, fill.base = 0, col = 1, ...) { + lines(x, y, ...) + panel.number <- parent.frame()$panel.number + col <- rep(col, length = panel.number)[panel.number] + polygon(c(x[1], x, tail(x, 1), x[1]), + c(fill.base, as.numeric(y), fill.base, fill.base), col = col) + } > plot(zoo(EuStockMarkets), col = rainbow(4), panel = pnl.xyarea) > > > ## barplot > x <- zoo(cbind(rpois(5, 2), rpois(5, 3)), x.Date) > barplot(x, beside = TRUE) > > ## 3d plot > ## The persp function in R (not part of zoo) works with zoo objects. > ## The following example is by Enrico Schumann. > ## https://stat.ethz.ch/pipermail/r-sig-finance/2009q1/003710.html > nC <- 10 # columns > nO <- 100 # observations > dataM <- array(runif(nC * nO), dim=c(nO, nC)) > zz <- zoo(dataM, 1:nO) > persp(1:nO, 1:nC, zz) > > # interactive plotting > ## Not run: > ##D library("TeachingDemos") > ##D tke.test1 <- list(Parameters = list( > ##D lwd = list("spinbox", init = 1, from = 0, to = 5, increment = 1, width = 5), > ##D lty = list("spinbox", init = 1, from = 0, to = 6, increment = 1, width = 5) > ##D )) > ##D z <- zoo(rnorm(25)) > ##D tkexamp(plot(z), tke.test1, plotloc = "top") > ## End(Not run) > > # setting ylim on a multi-panel plot - 2nd panel y axis range is 1-50 > data("anscombe", package = "datasets") > ans6 <- zoo(anscombe[, 1:6]) > screens <- c(1, 1, 2, 2, 3, 3) > ylim <- unname(tapply(as.list(ans6), screens, range)) > ylim[[2]] <- 1:50 # or ylim[[2]] <- c(1, 50) > plot(ans6, screens = screens, ylim = ylim) > > > > > graphics::par(get("par.postscript", pos = 'CheckExEnv')) > cleanEx() > nameEx("read.zoo") > ### * read.zoo > > flush(stderr()); flush(stdout()) > > ### Name: read.zoo > ### Title: Reading and Writing zoo Series > ### Aliases: read.zoo write.zoo > ### Keywords: ts > > ### ** Examples > > ## this manual page provides a few typical examples, many more cases > ## are covered in vignette("zoo-read", package = "zoo") > > ## read text lines with a single date column > Lines <- "2013-12-24 2 + 2013-12-25 3 + 2013-12-26 8" > read.zoo(text = Lines, FUN = as.Date) # explicit coercion 2013-12-24 2013-12-25 2013-12-26 2 3 8 > read.zoo(text = Lines, format = "%Y-%m-%d") # same 2013-12-24 2013-12-25 2013-12-26 2 3 8 > read.zoo(text = Lines) # same, via heuristic 2013-12-24 2013-12-25 2013-12-26 2 3 8 > > ## read text lines with date/time in separate columns > Lines <- "2013-11-24 12:41:21 2 + 2013-12-25 12:41:22.25 3 + 2013-12-26 12:41:22.75 8" > read.zoo(text = Lines, index = 1:2, + FUN = paste, FUN2 = as.POSIXct) # explicit coercion 2013-11-24 12:41:21 2013-12-25 12:41:22 2013-12-26 12:41:22 2 3 8 > read.zoo(text = Lines, index = 1:2, tz = "") # same 2013-11-24 12:41:21 2013-12-25 12:41:22 2013-12-26 12:41:22 2 3 8 > read.zoo(text = Lines, index = 1:2) # same, via heuristic 2013-11-24 12:41:21 2013-12-25 12:41:22 2013-12-26 12:41:22 2 3 8 > > ## read directly from a data.frame (artificial and built-in BOD) > dat <- data.frame(date = paste("2000-01-", 10:15, sep = ""), + a = sin(1:6), b = cos(1:6)) > read.zoo(dat) a b 2000-01-10 0.8414710 0.5403023 2000-01-11 0.9092974 -0.4161468 2000-01-12 0.1411200 -0.9899925 2000-01-13 -0.7568025 -0.6536436 2000-01-14 -0.9589243 0.2836622 2000-01-15 -0.2794155 0.9601703 > data("BOD", package = "datasets") > read.zoo(BOD) 1 2 3 4 5 7 8.3 10.3 19.0 16.0 15.6 19.8 > > ## Not run: > ##D ## descriptions of typical examples > ##D > ##D ## turn *numeric* first column into yearmon index > ##D ## where number is year + fraction of year represented by month > ##D z <- read.zoo("foo.csv", sep = ",", FUN = as.yearmon) > ##D > ##D ## first column is of form yyyy.mm > ##D ## (Here we use format in place of as.character so that final zero > ##D ## is not dropped in dates like 2001.10 which as.character would do.) > ##D f <- function(x) as.yearmon(format(x, nsmall = 2), "%Y.%m") > ##D z <- read.zoo("foo.csv", header = TRUE, FUN = f) > ##D > ##D ## turn *character* first column into "Date" index > ##D ## Assume lines look like: 12/22/2007 1 2 > ##D z <- read.zoo("foo.tab", format = "%m/%d/%Y") > ##D > ##D # Suppose lines look like: 09112007 1 2 and there is no header > ##D z <- read.zoo("foo.txt", format = "%d%m%Y") > ##D > ##D ## csv file with first column of form YYYY-mm-dd HH:MM:SS > ##D ## Read in times as "chron" class. Requires chron 2.3-22 or later. > ##D z <- read.zoo("foo.csv", header = TRUE, sep = ",", FUN = as.chron) > ##D > ##D ## same but with custom format. Note as.chron uses POSIXt-style ##D > ##D ## Read in times as "chron" class. Requires chron 2.3-24 or later. > ##D z <- read.zoo("foo.csv", header = TRUE, sep = ",", FUN = as.chron, > ##D format = "##D > ##D > ##D ## same file format but read it in times as "POSIXct" class. > ##D z <- read.zoo("foo.csv", header = TRUE, sep = ",", tz = "") > ##D > ##D ## csv file with first column mm-dd-yyyy. Read times as "Date" class. > ##D z <- read.zoo("foo.csv", header = TRUE, sep = ",", format = "%m-%d-%Y") > ##D > ##D ## whitespace separated file with first column of form YYYY-mm-ddTHH:MM:SS > ##D ## and no headers. T appears literally. Requires chron 2.3-22 or later. > ##D z <- read.zoo("foo.csv", FUN = as.chron) > ##D > ##D # read in all csv files in the current directory and merge them > ##D read.zoo(Sys.glob("*.csv"), header = TRUE, sep = ",") > ##D > ##D # We use "NULL" in colClasses for those columns we don't need but in > ##D # col.names we still have to include dummy names for them. Of what > ##D # is left the index is the first three columns (1:3) which we convert > ##D # to chron class times in FUN and then truncate to 5 seconds in FUN2. > ##D # Finally we use aggregate = mean to average over the 5 second intervals. > ##D library("chron") > ##D > ##D Lines <- "CVX 20070201 9 30 51 73.25 81400 0 > ##D CVX 20070201 9 30 51 73.25 100 0 > ##D CVX 20070201 9 30 51 73.25 100 0 > ##D CVX 20070201 9 30 51 73.25 300 0 > ##D CVX 20070201 9 30 51 73.25 81400 0 > ##D CVX 20070201 9 40 51 73.25 100 0 > ##D CVX 20070201 9 40 52 73.25 100 0 > ##D CVX 20070201 9 40 53 73.25 300 0" > ##D > ##D z <- read.zoo(text = Lines, > ##D colClasses = c("NULL", "NULL", "numeric", "numeric", "numeric", > ##D "numeric", "numeric", "NULL"), > ##D col.names = c("Symbol", "Date", "Hour", "Minute", "Second", "Price", "Volume", "junk"), > ##D index = 1:3, # do not count columns that are "NULL" in colClasses > ##D FUN = function(h, m, s) times(paste(h, m, s, sep = ":")), > ##D FUN2 = function(tt) trunc(tt, "00:00:05"), > ##D aggregate = mean) > ## End(Not run) > > > > > cleanEx() > nameEx("rollapply") > ### * rollapply > > flush(stderr()); flush(stdout()) > > ### Name: rollapply > ### Title: Apply Rolling Functions > ### Aliases: rollapply rollapplyr rollapply.default rollapply.ts > ### rollapply.zoo > ### Keywords: iteration array ts > > ### ** Examples > > ## rolling mean > z <- zoo(11:15, as.Date(31:35)) > rollapply(z, 2, mean) 1970-02-01 1970-02-02 1970-02-03 1970-02-04 11.5 12.5 13.5 14.5 > > ## non-overlapping means > z2 <- zoo(rnorm(6)) > rollapply(z2, 3, mean, by = 3) # means of nonoverlapping groups of 3 2 5 -0.4261464 0.3681067 > aggregate(z2, c(3,3,3,6,6,6), mean) # same 3 6 -0.4261464 0.3681067 > > ## optimized vs. customized versions > rollapply(z2, 3, mean) # uses rollmean which is optimized for mean 2 3 4 5 -0.4261464 0.3144318 0.3630533 0.3681067 > rollmean(z2, 3) # same 2 3 4 5 -0.4261464 0.3144318 0.3630533 0.3681067 > rollapply(z2, 3, (mean)) # does not use rollmean 2 3 4 5 -0.4261464 0.3144318 0.3630533 0.3681067 > > > ## rolling regression: > ## set up multivariate zoo series with > ## number of UK driver deaths and lags 1 and 12 > seat <- as.zoo(log(UKDriverDeaths)) > time(seat) <- as.yearmon(time(seat)) > seat <- merge(y = seat, y1 = lag(seat, k = -1), + y12 = lag(seat, k = -12), all = FALSE) > > ## run a rolling regression with a 3-year time window > ## (similar to a SARIMA(1,0,0)(1,0,0)_12 fitted by OLS) > rr <- rollapply(seat, width = 36, + FUN = function(z) coef(lm(y ~ y1 + y12, data = as.data.frame(z))), + by.column = FALSE, align = "right") > > ## plot the changes in coefficients > ## showing the shifts after the oil crisis in Oct 1973 > ## and after the seatbelt legislation change in Jan 1983 > plot(rr) > > > ## rolling mean by time window (e.g., 3 days) rather than > ## by number of observations (e.g., when these are unequally spaced): > # > ## - test data > tt <- as.Date("2000-01-01") + c(1, 2, 5, 6, 7, 8, 10) > z <- zoo(seq_along(tt), tt) > ## - fill it out to a daily series, zm, using NAs > ## using a zero width zoo series g on a grid > g <- zoo(, seq(start(z), end(z), "day")) > zm <- merge(z, g) > ## - 3-day rolling mean > rollapply(zm, 3, mean, na.rm = TRUE, fill = NA) 2000-01-02 2000-01-03 2000-01-04 2000-01-05 2000-01-06 2000-01-07 2000-01-08 NA 1.5 2.0 3.0 3.5 4.0 5.0 2000-01-09 2000-01-10 2000-01-11 5.5 6.5 NA > > > ## different values of rule argument > z <- zoo(c(NA, NA, 2, 3, 4, 5, NA)) > rollapply(z, 3, sum, na.rm = TRUE) 2 3 4 5 6 2 5 9 12 9 > rollapply(z, 3, sum, na.rm = TRUE, fill = NULL) 2 3 4 5 6 2 5 9 12 9 > rollapply(z, 3, sum, na.rm = TRUE, fill = NA) 1 2 3 4 5 6 7 NA 2 5 9 12 9 NA > rollapply(z, 3, sum, na.rm = TRUE, partial = TRUE) 1 2 3 4 5 6 7 0 2 5 9 12 9 5 > > # this will exclude time points 1 and 2 > # It corresonds to align = "right", width = 3 > rollapply(zoo(1:8), list(seq(-2, 0)), sum) 3 4 5 6 7 8 6 9 12 15 18 21 > > # but this will include points 1 and 2 > rollapply(zoo(1:8), list(seq(-2, 0)), sum, partial = 1) 1 2 3 4 5 6 7 8 1 3 6 9 12 15 18 21 > rollapply(zoo(1:8), list(seq(-2, 0)), sum, partial = 0) 1 2 3 4 5 6 7 8 1 3 6 9 12 15 18 21 > > # so will this > rollapply(zoo(1:8), list(seq(-2, 0)), sum, fill = NA) 1 2 3 4 5 6 7 8 NA NA 6 9 12 15 18 21 > > # by = 3, align = "right" > L <- rep(list(NULL), 8) > L[seq(3, 8, 3)] <- list(seq(-2, 0)) > str(L) List of 8 $ : NULL $ : NULL $ : int [1:3] -2 -1 0 $ : NULL $ : NULL $ : int [1:3] -2 -1 0 $ : NULL $ : NULL > rollapply(zoo(1:8), L, sum) 3 6 6 15 > > rollapply(zoo(1:8), list(0:2), sum, fill = 1:3) 1 2 3 4 5 6 7 8 6 9 12 15 18 21 3 3 > rollapply(zoo(1:8), list(0:2), sum, fill = 3) 1 2 3 4 5 6 7 8 6 9 12 15 18 21 3 3 > > L2 <- rep(list(-(2:0)), 10) > L2[5] <- list(NULL) > str(L2) List of 10 $ : int [1:3] -2 -1 0 $ : int [1:3] -2 -1 0 $ : int [1:3] -2 -1 0 $ : int [1:3] -2 -1 0 $ : NULL $ : int [1:3] -2 -1 0 $ : int [1:3] -2 -1 0 $ : int [1:3] -2 -1 0 $ : int [1:3] -2 -1 0 $ : int [1:3] -2 -1 0 > rollapply(zoo(1:10), L2, sum, fill = "extend") 1 2 3 4 5 6 7 8 9 10 6 6 6 9 12 15 18 21 24 27 > rollapply(zoo(1:10), L2, sum, fill = list("extend", NULL)) 1 2 3 4 6 7 8 9 10 6 6 6 9 15 18 21 24 27 > > rollapply(zoo(1:10), L2, sum, fill = list("extend", NA)) 1 2 3 4 5 6 7 8 9 10 6 6 6 9 NA 15 18 21 24 27 > > rollapply(zoo(1:10), L2, sum, fill = NA) 1 2 3 4 5 6 7 8 9 10 NA NA 6 9 NA 15 18 21 24 27 > rollapply(zoo(1:10), L2, sum, fill = 1:3) 1 2 3 4 5 6 7 8 9 10 1 1 6 9 2 15 18 21 24 27 > rollapply(zoo(1:10), L2, sum, partial = TRUE) 1 2 3 4 6 7 8 9 10 1 3 6 9 15 18 21 24 27 > rollapply(zoo(1:10), L2, sum, partial = TRUE, fill = 99) 1 2 3 4 5 6 7 8 9 10 1 3 6 9 99 15 18 21 24 27 > > rollapply(zoo(1:10), list(-1), sum, partial = 0) 1 2 3 4 5 6 7 8 9 10 0 1 2 3 4 5 6 7 8 9 > rollapply(zoo(1:10), list(-1), sum, partial = TRUE) 2 3 4 5 6 7 8 9 10 1 2 3 4 5 6 7 8 9 > > rollapply(zoo(cbind(a = 1:6, b = 11:16)), 3, rowSums, by.column = FALSE) 2 12 14 16 3 14 16 18 4 16 18 20 5 18 20 22 > > # these two are the same > rollapply(zoo(cbind(a = 1:6, b = 11:16)), 3, sum) a b 2 6 36 3 9 39 4 12 42 5 15 45 > rollapply(zoo(cbind(a = 1:6, b = 11:16)), 3, colSums, by.column = FALSE) a b 2 6 36 3 9 39 4 12 42 5 15 45 > > # these two are the same > rollapply(zoo(1:6), 2, sum, by = 2, align = "right") 2 4 6 3 7 11 > aggregate(zoo(1:6), c(2, 2, 4, 4, 6, 6), sum) 2 4 6 3 7 11 > > # these two are the same > rollapply(zoo(1:3), list(-1), c) 2 3 1 2 > lag(zoo(1:3), -1) 2 3 1 2 > > # these two are the same > rollapply(zoo(1:3), list(1), c) 1 2 2 3 > lag(zoo(1:3)) 1 2 2 3 > > # these two are the same > rollapply(zoo(1:5), list(c(-1, 0, 1)), sum) 2 3 4 6 9 12 > rollapply(zoo(1:5), 3, sum) 2 3 4 6 9 12 > > # these two are the same > rollapply(zoo(1:5), list(0:2), sum) 1 2 3 6 9 12 > rollapply(zoo(1:5), 3, sum, align = "left") 1 2 3 6 9 12 > > # these two are the same > rollapply(zoo(1:5), list(-(2:0)), sum) 3 4 5 6 9 12 > rollapply(zoo(1:5), 3, sum, align = "right") 3 4 5 6 9 12 > > # these two are the same > rollapply(zoo(1:6), list(NULL, NULL, -(2:0)), sum) 3 6 6 15 > rollapply(zoo(1:6), 3, sum, by = 3, align = "right") 3 6 6 15 > > # these two are the same > rollapply(zoo(1:5), list(c(-1, 1)), sum) 2 3 4 4 6 8 > rollapply(zoo(1:5), 3, function(x) sum(x[-2])) 2 3 4 4 6 8 > > # these two are the same > rollapply(1:5, 3, rev) [,1] [,2] [,3] [1,] 3 2 1 [2,] 4 3 2 [3,] 5 4 3 > embed(1:5, 3) [,1] [,2] [,3] [1,] 3 2 1 [2,] 4 3 2 [3,] 5 4 3 > > # these four are the same > x <- 1:6 > rollapply(c(0, 0, x), 3, sum, align = "right") - x [1] 0 1 3 5 7 9 > rollapply(x, 3, sum, partial = TRUE, align = "right") - x [1] 0 1 3 5 7 9 > rollapply(x, 3, function(x) sum(x[-3]), partial = TRUE, align = "right") [1] 1 3 3 5 7 9 > rollapply(x, list(-(2:1)), sum, partial = 0) [1] 0 1 3 5 7 9 > > # same as Matlab's buffer(x, n, p) for valid non-negative p > # See http://www.mathworks.com/help/toolbox/signal/buffer.html > x <- 1:30; n <- 7; p <- 3 > t(rollapply(c(rep(0, p), x, rep(0, n-p)), n, by = n-p, c)) [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [1,] 0 2 6 10 14 18 22 26 [2,] 0 3 7 11 15 19 23 27 [3,] 0 4 8 12 16 20 24 28 [4,] 1 5 9 13 17 21 25 29 [5,] 2 6 10 14 18 22 26 30 [6,] 3 7 11 15 19 23 27 0 [7,] 4 8 12 16 20 24 28 0 > > # these three are the same > y <- 10 * seq(8); k <- 4; d <- 2 > # 1 > # from http://ucfagls.wordpress.com/2011/06/14/embedding-a-time-series-with-time-delay-in-r-part-ii/ > Embed <- function(x, m, d = 1, indices = FALSE, as.embed = TRUE) { + n <- length(x) - (m-1)*d + X <- seq_along(x) + if(n <= 0) + stop("Insufficient observations for the requested embedding") + out <- matrix(rep(X[seq_len(n)], m), ncol = m) + out[,-1] <- out[,-1, drop = FALSE] + + rep(seq_len(m - 1) * d, each = nrow(out)) + if(as.embed) + out <- out[, rev(seq_len(ncol(out)))] + if(!indices) + out <- matrix(x[out], ncol = m) + out + } > Embed(y, k, d) [,1] [,2] [,3] [,4] [1,] 70 50 30 10 [2,] 80 60 40 20 > # 2 > rollapply(y, list(-d * seq(0, k-1)), c) [,1] [,2] [,3] [,4] [1,] 70 50 30 10 [2,] 80 60 40 20 > # 3 > rollapply(y, d*k-1, function(x) x[d * seq(k-1, 0) + 1]) [,1] [,2] [,3] [,4] [1,] 70 50 30 10 [2,] 80 60 40 20 > > > > > cleanEx() > nameEx("rollmean") > ### * rollmean > > flush(stderr()); flush(stdout()) > > ### Name: rollmean > ### Title: Rolling Means/Maximums/Medians/Sums > ### Aliases: rollmean rollmax rollmedian rollsum rollmeanr rollmaxr > ### rollmedianr rollsumr rollmean.zoo rollmax.zoo rollmedian.zoo > ### rollsum.zoo rollmean.ts rollmax.ts rollmedian.ts rollsum.ts > ### rollmean.default rollmax.default rollmedian.default rollsum.default > ### Keywords: ts > > ### ** Examples > > x.Date <- as.Date(paste(2004, rep(1:4, 4:1), sample(1:28, 10), sep = "-")) > x <- zoo(rnorm(12), x.Date) > > rollmean(x, 3) 2004-01-11 2004-01-15 2004-01-23 2004-02-05 2004-02-21 2004-02-25 2004-03-13 0.1350951 0.6005117 0.3362392 0.5940580 0.5320787 -0.1043585 -0.8153657 2004-03-14 -0.5703365 > rollmax(x, 3) 2004-01-11 2004-01-15 2004-01-23 2004-02-05 2004-02-21 2004-02-25 2004-03-13 0.7383247 0.7383247 0.7383247 1.5117812 1.5117812 1.5117812 0.3898432 2004-03-14 1.1249309 > rollmedian(x, 3) 2004-01-11 2004-01-15 2004-01-23 2004-02-05 2004-02-21 2004-02-25 2004-03-13 0.4874291 0.5757814 0.5757814 0.5757814 0.3898432 0.3898432 -0.6212406 2004-03-14 -0.6212406 > rollsum(x, 3) 2004-01-11 2004-01-15 2004-01-23 2004-02-05 2004-02-21 2004-02-25 2004-03-13 0.4052854 1.8015351 1.0087177 1.7821741 1.5962360 -0.3130755 -2.4460972 2004-03-14 -1.7110095 > > xm <- zoo(matrix(1:12, 4, 3), x.Date[1:4]) > rollmean(xm, 3) 2004-01-11 2 6 10 2004-01-15 3 7 11 > rollmax(xm, 3) 2004-01-11 3 7 11 2004-01-15 4 8 12 > rollmedian(xm, 3) 2004-01-11 2 6 10 2004-01-15 3 7 11 > rollsum(xm, 3) 2004-01-11 6 18 30 2004-01-15 9 21 33 > > rollapply(xm, 3, mean) # uses rollmean 2004-01-11 2 6 10 2004-01-15 3 7 11 > rollapply(xm, 3, function(x) mean(x)) # does not use rollmean 2004-01-11 2 6 10 2004-01-15 3 7 11 > > > > cleanEx() > nameEx("window.zoo") > ### * window.zoo > > flush(stderr()); flush(stdout()) > > ### Name: window.zoo > ### Title: Extract/Replacing the Time Windows of Objects > ### Aliases: window.zoo window<-.zoo > ### Keywords: ts > > ### ** Examples > > ## zoo example > x.date <- as.Date(paste(2003, rep(1:4, 4:1), seq(1,19,2), sep = "-")) > x <- zoo(matrix(rnorm(20), ncol = 2), x.date) > x 2003-01-01 -0.6264538 1.51178117 2003-01-03 0.1836433 0.38984324 2003-01-05 -0.8356286 -0.62124058 2003-01-07 1.5952808 -2.21469989 2003-02-09 0.3295078 1.12493092 2003-02-11 -0.8204684 -0.04493361 2003-02-13 0.4874291 -0.01619026 2003-03-15 0.7383247 0.94383621 2003-03-17 0.5757814 0.82122120 2003-04-19 -0.3053884 0.59390132 > > window(x, start = as.Date("2003-02-01"), end = as.Date("2003-03-01")) 2003-02-09 0.3295078 1.12493092 2003-02-11 -0.8204684 -0.04493361 2003-02-13 0.4874291 -0.01619026 > window(x, index = x.date[1:6], start = as.Date("2003-02-01")) 2003-02-09 0.3295078 1.12493092 2003-02-11 -0.8204684 -0.04493361 > window(x, index = x.date[c(4, 8, 10)]) 2003-01-07 1.5952808 -2.2146999 2003-03-15 0.7383247 0.9438362 2003-04-19 -0.3053884 0.5939013 > window(x, index = x.date[c(4, 8, 10)]) <- matrix(1:6, ncol = 2) > x 2003-01-01 -0.6264538 1.51178117 2003-01-03 0.1836433 0.38984324 2003-01-05 -0.8356286 -0.62124058 2003-01-07 1.0000000 4.00000000 2003-02-09 0.3295078 1.12493092 2003-02-11 -0.8204684 -0.04493361 2003-02-13 0.4874291 -0.01619026 2003-03-15 2.0000000 5.00000000 2003-03-17 0.5757814 0.82122120 2003-04-19 3.0000000 6.00000000 > > ## for classes that support comparisons with "character" variables > ## start and end may be "character". > window(x, start = "2003-02-01") 2003-02-09 0.3295078 1.12493092 2003-02-11 -0.8204684 -0.04493361 2003-02-13 0.4874291 -0.01619026 2003-03-15 2.0000000 5.00000000 2003-03-17 0.5757814 0.82122120 2003-04-19 3.0000000 6.00000000 > > ## zooreg example (with plain numeric index) > z <- zooreg(rnorm(10), start = 2000, freq = 4) > window(z, start = 2001.75) 2001(4) 2002(1) 2002(2) -1.4707524 -0.4781501 0.4179416 > window(z, start = c(2001, 4)) 2001(4) 2002(1) 2002(2) -1.4707524 -0.4781501 0.4179416 > > ## replace data at times of d0 which are in dn > d1 <- d0 <- zoo(1:10) + 100 > dn <- - head(d0, 4) > > window(d1, time(dn)) <- coredata(dn) > > > > > cleanEx() > nameEx("xblocks") > ### * xblocks > > flush(stderr()); flush(stdout()) > > ### Name: xblocks > ### Title: Plot contiguous blocks along x axis. > ### Aliases: xblocks xblocks.default xblocks.zoo xblocks.ts > ### Keywords: dplot > > ### ** Examples > > ## example time series: > set.seed(0) > flow <- ts(filter(rlnorm(200, mean = 1), 0.8, method = "r")) > > ## highlight values above and below thresholds. > ## this draws on top using semi-transparent colors. > rgb <- hcl(c(0, 0, 260), c = c(100, 0, 100), l = c(50, 90, 50), alpha = 0.3) > plot(flow) > xblocks(flow > 30, col = rgb[1]) ## high values red > xblocks(flow < 15, col = rgb[3]) ## low value blue > xblocks(flow >= 15 & flow <= 30, col = rgb[2]) ## the rest gray > > ## same thing: > plot(flow) > xblocks(time(flow), cut(flow, c(0,15,30,Inf), labels = rev(rgb))) > > ## another approach is to plot blocks underneath without transparency. > plot(flow) > ## note that 'ifelse' keeps its result as class 'ts' > xblocks(ifelse(flow < mean(flow), hcl(0, 0, 90), hcl(0, 80, 70))) > ## need to redraw data series on top: > lines(flow) > box() > > ## for single series only: plot.default has a panel.first argument > plot(time(flow), flow, type = "l", + panel.first = xblocks(flow > 20, col = "lightgray")) > ## (see also the 'panel' argument for use with multiple series, below) > > ## insert some missing values > flow[c(1:10, 50:80, 100)] <- NA > > ## the default plot shows data coverage > ## (most useful when displaying multiple series, see below) > plot(flow) > xblocks(flow) > > ## can also show gaps: > plot(flow, type = "s") > xblocks(time(flow), is.na(flow), col = "gray") > > ## Example of alternating colors, here showing calendar months > flowdates <- as.Date("2000-01-01") + as.numeric(time(flow)) > flowz <- zoo(coredata(flow), flowdates) > plot(flowz) > xblocks(flowz, months, ## i.e. months(time(flowz)), + col = gray.colors(2, start = 0.7), border = "slategray") > lines(flowz) > > ## Example of multiple series. > ## set up example data > z <- ts(cbind(A = 0:5, B = c(6:7, NA, NA, 10:11), C = c(NA, 13:17))) > > ## show data coverage only (highlighting gaps) > plot(z, panel = function(x, ...) + xblocks(x, col = "darkgray")) > > ## draw gaps in darkgray > plot(z, type = "s", panel = function(x, ...) { + xblocks(time(x), is.na(x), col = "darkgray") + lines(x, ...); points(x) + }) > > ## Example of overlaying blocks from a different series. > ## Are US presidential approval ratings linked to sunspot activity? > ## Set block height to plot blocks along the bottom. > plot(presidents) > xblocks(sunspot.year > 50, height = 2) > > > > cleanEx() > nameEx("xyplot.zoo") > ### * xyplot.zoo > > flush(stderr()); flush(stdout()) > > ### Name: xyplot.zoo > ### Title: Plot zoo Series with Lattice > ### Aliases: xyplot.zoo xyplot.its xyplot.tis llines.zoo llines.its > ### llines.tis lpoints.zoo lpoints.its lpoints.tis ltext.zoo ltext.its > ### ltext.tis panel.lines.zoo panel.lines.ts panel.lines.its > ### panel.lines.tis panel.points.zoo panel.points.ts panel.points.its > ### panel.points.tis panel.text.zoo panel.text.ts panel.text.its > ### panel.text.tis panel.plot.default panel.plot.custom > ### panel.segments.zoo panel.segments.ts panel.segments.its > ### panel.segments.tis panel.rect.zoo panel.rect.ts panel.rect.its > ### panel.rect.tis panel.polygon.zoo panel.polygon.ts panel.polygon.its > ### panel.polygon.tis > ### Keywords: hplot ts > > ### ** Examples > > if(require("lattice") & require("grid")) { + + set.seed(1) + z <- zoo(cbind(a = 1:5, b = 11:15, c = 21:25) + rnorm(5)) + + # plot z using same Y axis on all plots + xyplot(z, scales = list(y = list(relation = "same", alternating = FALSE))) + + # plot a double-line-width running mean on the panel of b. + # Also add a grid. + # We show two ways to do it. + + # change strip background to levels of grey + # If you like the defaults, this can be omitted. + strip.background <- trellis.par.get("strip.background") + trellis.par.set(strip.background = list(col = grey(7:1/8))) + + + # Number 1. Using trellis.focus. + print( xyplot(z) ) + trellis.focus("panel", 1, 2, highlight = FALSE) + # (or just trellis.focus() for interactive use) + z.mean <- rollmean(z, 3) + panel.lines(z.mean[,2], lwd = 2) + panel.grid(h = 10, v = 10, col = "grey", lty = 3) + trellis.unfocus() + + # Number 2. Using a custom panel routine. + xyplot(z, panel = function(x, y, ...) { + if (packet.number() == 2) { + panel.grid(h = 10, v = 10, col = "grey", lty = 3) + panel.lines(rollmean(zoo(y, x), 3), lwd = 2) + } + panel.xyplot(x, y, ...) + }) + + # plot a light grey rectangle "behind" panel b + trellis.focus("panel", 1, 2) + grid.rect(x = 2, w = 1, default.units = "native", + gp = gpar(fill = "light grey")) + # do.call("panel.xyplot", trellis.panelArgs()) + do.call("panel.lines", trellis.panelArgs()[1:2]) + trellis.unfocus() + # a better method is to use a custom panel function. + # see also panel.xblocks() and layer() in the latticeExtra package. + + # same but make first panel twice as large as others + lopt <- list(layout.heights = list(panel = list(x = c(2,1,1)))) + xyplot(z, lattice.options = lopt) + # add a grid + update(trellis.last.object(), type = c("l", "g")) + + # Plot all in one panel. + xyplot(z, screens = 1) + # Same with default styles and auto.key: + xyplot(z, superpose = TRUE) + + # Plot first two columns in first panel and third column in second panel. + # Plot first series using points, second series using lines and third + # series via overprinting both lines and points + # Use colors 1, 2 and 3 for the three series (1=black, 2=red, 3=green) + # Make 2nd (lower) panel 3x the height of the 1st (upper) panel + # Also make the strip background orange. + p <- xyplot(z, screens = c(1,1,2), type = c("p", "l", "o"), col = 1:3, + par.settings = list(strip.background = list(col = "orange"))) + print(p, panel.height = list(y = c(1, 3), units = "null")) + + # Example of using a custom axis + # Months are labelled with smaller ticks for weeks and even smaller + # ticks for days. + Days <- seq(from = as.Date("2006-1-1"), to = as.Date("2006-8-8"), by = "day") + z1 <- zoo(seq(length(Days))^2, Days) + Months <- Days[format(Days, "%d") == "01"] + Weeks <- Days[format(Days, "%w") == "0"] + print( xyplot(z1, scales = list(x = list(at = Months))) ) + trellis.focus("panel", 1, 1, clip.off = TRUE) + panel.axis("bottom", check.overlap = TRUE, outside = TRUE, labels = FALSE, + tck = .7, at = as.numeric(Weeks)) + panel.axis("bottom", check.overlap = TRUE, outside = TRUE, labels = FALSE, + tck = .4, at = as.numeric(Days)) + trellis.unfocus() + + trellis.par.set(strip.background = strip.background) + + # separate the panels and suppress the ticks on very top + xyplot(z, between = list(y = 1), scales = list(tck = c(1,0))) + + # left strips but no top strips + xyplot(z, screens = colnames(z), strip = FALSE, strip.left = TRUE) + + # plot list of zoo objects using different x scales + z.l <- list( + zoo(cbind(a = rnorm(10), b = rnorm(10)), as.Date("2006-01-01") + 0:9), + zoo(cbind(c = rnorm(10), d = rnorm(10)), as.Date("2006-12-01") + 0:9) + ) + zm <- do.call(merge, z.l) + xlim <- lapply(zm, function(x) range(time(na.omit(x)))) + xyplot(zm, xlim = xlim, scale = list(relation = "free")) + # to avoid merging see xyplot.list() in the latticeExtra package. + + } Loading required package: lattice Loading required package: grid > > ## Not run: > ##D ## playwith (>= 0.9) > ##D library("playwith") > ##D > ##D z3 <- zoo(cbind(a = rnorm(100), b = rnorm(100) + 1), as.Date(1:100)) > ##D playwith(xyplot(z3), time.mode = TRUE) > ##D # hold down Shift key and drag to zoom in to a time period. > ##D # then use the horizontal scroll bar. > ##D > ##D # set custom labels; right click on points to view or add labels > ##D labs <- paste(round(z3,1), index(z3), sep = "@") > ##D trellis.par.set(user.text = list(cex = 0.7)) > ##D playwith(xyplot(z3, type = "o"), labels = labs) > ##D > ##D # this returns indexes into times of clicked points > ##D ids <- playGetIDs() > ##D z3[ids,] > ##D > ##D ## another example of using playwith with zoo > ##D # set up data > ##D dat <- zoo(matrix(rnorm(100*100),ncol=100), Sys.Date()+1:100) > ##D colnames(dat) <- paste("Series", 1:100) > ##D > ##D # This will give you a spin button to choose the column to plot, > ##D # and a button to print out the current series number. > ##D playwith(xyplot(dat[,c(1,i)]), parameters = list(i = 1:100, > ##D do_something = function(playState) print(playState$env$i)) > ##D > ## End(Not run) > > > > > cleanEx() detaching 'package:grid', 'package:lattice' > nameEx("yearmon") > ### * yearmon > > flush(stderr()); flush(stdout()) > > ### Name: yearmon > ### Title: An Index Class for Monthly Data > ### Aliases: yearmon as.yearmon as.yearmon.default as.yearmon.numeric > ### as.yearmon.integer as.yearmon.dates as.yearmon.Date > ### as.yearmon.timeDate as.yearmon.jul as.yearmon.POSIXt > ### as.yearmon.character as.yearmon.date as.yearmon.factor as.Date > ### as.Date.numeric as.Date.ts as.Date.yearmon as.POSIXct.yearmon > ### as.POSIXlt.yearmon as.list.yearmon as.numeric.yearmon > ### as.character.yearmon as.data.frame.yearmon c.yearmon cycle.yearmon > ### format.yearmon is.yearmon mean.yearmon print.yearmon range.yearmon > ### summary.yearmon unique.yearmon [.yearmon [[.yearmon MATCH.yearmon > ### Ops.yearmon Sys.yearmon -.yearmon xtfrm.yearmon > ### Keywords: ts > > ### ** Examples > > x <- as.yearmon(2000 + seq(0, 23)/12) > x [1] "Jan 2000" "Feb 2000" "Mar 2000" "Apr 2000" "May 2000" "Jun 2000" [7] "Jul 2000" "Aug 2000" "Sep 2000" "Oct 2000" "Nov 2000" "Dec 2000" [13] "Jan 2001" "Feb 2001" "Mar 2001" "Apr 2001" "May 2001" "Jun 2001" [19] "Jul 2001" "Aug 2001" "Sep 2001" "Oct 2001" "Nov 2001" "Dec 2001" > > as.yearmon("mar07", "%b%y") [1] "Mar 2007" > as.yearmon("2007-03-01") [1] "Mar 2007" > as.yearmon("2007-12") [1] "Dec 2007" > > # returned Date is the fraction of the way through > # the period given by frac (= 0 by default) > as.Date(x) [1] "2000-01-01" "2000-02-01" "2000-03-01" "2000-04-01" "2000-05-01" [6] "2000-06-01" "2000-07-01" "2000-08-01" "2000-09-01" "2000-10-01" [11] "2000-11-01" "2000-12-01" "2001-01-01" "2001-02-01" "2001-03-01" [16] "2001-04-01" "2001-05-01" "2001-06-01" "2001-07-01" "2001-08-01" [21] "2001-09-01" "2001-10-01" "2001-11-01" "2001-12-01" > as.Date(x, frac = 1) [1] "2000-01-31" "2000-02-29" "2000-03-31" "2000-04-30" "2000-05-31" [6] "2000-06-30" "2000-07-31" "2000-08-31" "2000-09-30" "2000-10-31" [11] "2000-11-30" "2000-12-31" "2001-01-31" "2001-02-28" "2001-03-31" [16] "2001-04-30" "2001-05-31" "2001-06-30" "2001-07-31" "2001-08-31" [21] "2001-09-30" "2001-10-31" "2001-11-30" "2001-12-31" > as.POSIXct(x) [1] "2000-01-01 01:00:00 CET" "2000-02-01 01:00:00 CET" [3] "2000-03-01 01:00:00 CET" "2000-04-01 02:00:00 CEST" [5] "2000-05-01 02:00:00 CEST" "2000-06-01 02:00:00 CEST" [7] "2000-07-01 02:00:00 CEST" "2000-08-01 02:00:00 CEST" [9] "2000-09-01 02:00:00 CEST" "2000-10-01 02:00:00 CEST" [11] "2000-11-01 01:00:00 CET" "2000-12-01 01:00:00 CET" [13] "2001-01-01 01:00:00 CET" "2001-02-01 01:00:00 CET" [15] "2001-03-01 01:00:00 CET" "2001-04-01 02:00:00 CEST" [17] "2001-05-01 02:00:00 CEST" "2001-06-01 02:00:00 CEST" [19] "2001-07-01 02:00:00 CEST" "2001-08-01 02:00:00 CEST" [21] "2001-09-01 02:00:00 CEST" "2001-10-01 02:00:00 CEST" [23] "2001-11-01 01:00:00 CET" "2001-12-01 01:00:00 CET" > > # given a Date, x, return the Date of the next Friday > nextfri <- function(x) 7 * ceiling(as.numeric(x - 1)/7) + as.Date(1) > > # given a Date, d, return the same Date in the following month > # Note that as.Date.yearmon gives first Date of the month. > d <- as.Date("2005-1-1") + seq(0,90,30) > next.month <- function(d) as.Date(as.yearmon(d) + 1/12) + + as.numeric(d - as.Date(as.yearmon(d))) > next.month(d) [1] "2005-02-01" "2005-03-03" "2005-04-02" "2005-05-01" > > # 3rd Friday in last month of the quarter of Date x > as.Date(as.yearmon(as.yearqtr(x)) + 2/12) + 14 [1] "2000-03-15" "2000-03-15" "2000-03-15" "2000-06-15" "2000-06-15" [6] "2000-06-15" "2000-09-15" "2000-09-15" "2000-09-15" "2000-12-15" [11] "2000-12-15" "2000-12-15" "2001-03-15" "2001-03-15" "2001-03-15" [16] "2001-06-15" "2001-06-15" "2001-06-15" "2001-09-15" "2001-09-15" [21] "2001-09-15" "2001-12-15" "2001-12-15" "2001-12-15" > > z <- zoo(rnorm(24), x, frequency = 12) > z Jan 2000 Feb 2000 Mar 2000 Apr 2000 May 2000 Jun 2000 -0.62645381 0.18364332 -0.83562861 1.59528080 0.32950777 -0.82046838 Jul 2000 Aug 2000 Sep 2000 Oct 2000 Nov 2000 Dec 2000 0.48742905 0.73832471 0.57578135 -0.30538839 1.51178117 0.38984324 Jan 2001 Feb 2001 Mar 2001 Apr 2001 May 2001 Jun 2001 -0.62124058 -2.21469989 1.12493092 -0.04493361 -0.01619026 0.94383621 Jul 2001 Aug 2001 Sep 2001 Oct 2001 Nov 2001 Dec 2001 0.82122120 0.59390132 0.91897737 0.78213630 0.07456498 -1.98935170 > as.ts(z) Jan Feb Mar Apr May Jun 2000 -0.62645381 0.18364332 -0.83562861 1.59528080 0.32950777 -0.82046838 2001 -0.62124058 -2.21469989 1.12493092 -0.04493361 -0.01619026 0.94383621 Jul Aug Sep Oct Nov Dec 2000 0.48742905 0.73832471 0.57578135 -0.30538839 1.51178117 0.38984324 2001 0.82122120 0.59390132 0.91897737 0.78213630 0.07456498 -1.98935170 > > ## convert data fram to multivariate monthly "ts" series > ## 1.read raw data > Lines.raw <- "ID Date Count + 123 20 May 1999 1 + 123 21 May 1999 3 + 222 1 Feb 2000 2 + 222 3 Feb 2000 4 + " > DF <- read.table(textConnection(Lines.raw), skip = 1, + col.names = c("ID", "d", "b", "Y", "Count")) > ## 2. fix raw date > DF$yearmon <- as.yearmon(paste(DF$b, DF$Y), "%b %Y") > ## 3. aggregate counts over months, convert to zoo and merge over IDs > ag <- function(DF) aggregate(zoo(DF$Count), DF$yearmon, sum) > z <- do.call("merge.zoo", lapply(split(DF, DF$ID), ag)) > ## 4. convert to "zooreg" and then to "ts" > frequency(z) <- 12 > as.ts(z) 123 222 May 1999 4 NA Jun 1999 NA NA Jul 1999 NA NA Aug 1999 NA NA Sep 1999 NA NA Oct 1999 NA NA Nov 1999 NA NA Dec 1999 NA NA Jan 2000 NA NA Feb 2000 NA 6 > > xx <- zoo(seq_along(x), x) > > ## aggregating over year > as.year <- function(x) as.numeric(floor(as.yearmon(x))) > aggregate(xx, as.year, mean) 2000 2001 6.5 18.5 > > > > > cleanEx() > nameEx("yearqtr") > ### * yearqtr > > flush(stderr()); flush(stdout()) > > ### Name: yearqtr > ### Title: An Index Class for Quarterly Data > ### Aliases: yearqtr as.yearqtr as.yearqtr.default as.yearqtr.numeric > ### as.yearqtr.integer as.yearqtr.date as.yearqtr.dates as.yearqtr.Date > ### as.yearqtr.timeDate as.yearqtr.jul as.yearqtr.POSIXt > ### as.yearqtr.character as.yearqtr.factor as.yearqtr.yearqtr > ### as.Date.yearqtr as.POSIXct.yearqtr as.POSIXlt.yearqtr as.list.yearqtr > ### as.numeric.yearqtr as.character.yearqtr as.data.frame.yearqtr > ### c.yearqtr cycle.yearqtr format.yearqtr is.numeric.yearqtr > ### mean.yearqtr print.yearqtr range.yearqtr summary.yearqtr > ### unique.yearqtr [.yearqtr [[.yearqtr MATCH.yearqtr Ops.yearqtr > ### Summary.yearqtr Sys.yearqtr -.yearqtr xtfrm.yearqtr > ### Keywords: ts > > ### ** Examples > > x <- as.yearqtr(2000 + seq(0, 7)/4) > x [1] "2000 Q1" "2000 Q2" "2000 Q3" "2000 Q4" "2001 Q1" "2001 Q2" "2001 Q3" [8] "2001 Q4" > > format(x, "%Y Quarter %q") [1] "2000 Quarter 1" "2000 Quarter 2" "2000 Quarter 3" "2000 Quarter 4" [5] "2001 Quarter 1" "2001 Quarter 2" "2001 Quarter 3" "2001 Quarter 4" > as.yearqtr("2001 Q2") [1] "2001 Q2" > as.yearqtr("2001 q2") # same [1] "2001 Q2" > as.yearqtr("2001-2") # same [1] "2001 Q2" > > # returned Date is the fraction of the way through > # the period given by frac (= 0 by default) > dd <- as.Date(x) > format.yearqtr(dd) [1] "2000 Q1" "2000 Q2" "2000 Q3" "2000 Q4" "2001 Q1" "2001 Q2" "2001 Q3" [8] "2001 Q4" > as.Date(x, frac = 1) [1] "2000-03-31" "2000-06-30" "2000-09-30" "2000-12-31" "2001-03-31" [6] "2001-06-30" "2001-09-30" "2001-12-31" > as.POSIXct(x) [1] "2000-01-01 01:00:00 CET" "2000-04-01 02:00:00 CEST" [3] "2000-07-01 02:00:00 CEST" "2000-10-01 02:00:00 CEST" [5] "2001-01-01 01:00:00 CET" "2001-04-01 02:00:00 CEST" [7] "2001-07-01 02:00:00 CEST" "2001-10-01 02:00:00 CEST" > > zz <- zoo(rnorm(8), x, frequency = 4) > zz 2000 Q1 2000 Q2 2000 Q3 2000 Q4 2001 Q1 2001 Q2 2001 Q3 -0.6264538 0.1836433 -0.8356286 1.5952808 0.3295078 -0.8204684 0.4874291 2001 Q4 0.7383247 > as.ts(zz) Qtr1 Qtr2 Qtr3 Qtr4 2000 -0.6264538 0.1836433 -0.8356286 1.5952808 2001 0.3295078 -0.8204684 0.4874291 0.7383247 > > > > > cleanEx() > nameEx("zoo") > ### * zoo > > flush(stderr()); flush(stdout()) > > ### Name: zoo > ### Title: Z's Ordered Observations > ### Aliases: zoo with.zoo range.zoo print.zoo as.zoo.factor summary.zoo > ### str.zoo is.zoo [.zoo [<-.zoo $.zoo $<-.zoo subset.zoo head.zoo > ### tail.zoo Ops.zoo t.zoo cumsum.zoo cumprod.zoo cummin.zoo cummax.zoo > ### mean.zoo median.zoo na.contiguous na.contiguous.data.frame > ### na.contiguous.list na.contiguous.default na.contiguous.zoo scale.zoo > ### xtfrm.zoo names.zoo names<-.zoo quantile.zoo rev.zoo transform.zoo > ### ifelse.zoo dim<-.zoo index2char index2char.default index2char.numeric > ### head.ts tail.ts > ### Keywords: ts > > ### ** Examples > > ## simple creation and plotting > x.Date <- as.Date("2003-02-01") + c(1, 3, 7, 9, 14) - 1 > x <- zoo(rnorm(5), x.Date) > plot(x) > time(x) [1] "2003-02-01" "2003-02-03" "2003-02-07" "2003-02-09" "2003-02-14" > > ## subsetting with numeric indexes > x[c(2, 4)] 2003-02-03 2003-02-09 0.1836433 1.5952808 > ## subsetting with index class > x[as.Date("2003-02-01") + c(2, 8)] 2003-02-03 2003-02-09 0.1836433 1.5952808 > > ## different classes of indexes/times can be used, e.g. numeric vector > x <- zoo(rnorm(5), c(1, 3, 7, 9, 14)) > ## subsetting with numeric indexes then uses observation numbers > x[c(2, 4)] 3 9 0.4874291 0.5757814 > ## subsetting with index class can be enforced by I() > x[I(c(3, 9))] 3 9 0.4874291 0.5757814 > > ## visualization > plot(x) > ## or POSIXct > y.POSIXct <- ISOdatetime(2003, 02, c(1, 3, 7, 9, 14), 0, 0, 0) > y <- zoo(rnorm(5), y.POSIXct) > plot(y) > > ## create a constant series > z <- zoo(1, seq(4)[-2]) > > ## create a 0-dimensional zoo series > z0 <- zoo(, 1:4) > > ## create a 2-dimensional zoo series > z2 <- zoo(matrix(1:12, 4, 3), as.Date("2003-01-01") + 0:3) > > ## create a factor zoo object > fz <- zoo(gl(2,5), as.Date("2004-01-01") + 0:9) > > ## create a zoo series with 0 columns > z20 <- zoo(matrix(nrow = 4, ncol = 0), 1:4) > > ## arithmetic on zoo objects intersects them first > x1 <- zoo(1:5, 1:5) > x2 <- zoo(2:6, 2:6) > 10 * x1 + x2 2 3 4 5 22 33 44 55 > > ## $ extractor for multivariate zoo series with column names > z <- zoo(cbind(foo = rnorm(5), bar = rnorm(5))) > z$foo 1 2 3 4 5 -0.04493361 -0.01619026 0.94383621 0.82122120 0.59390132 > z$xyz <- zoo(rnorm(3), 2:4) > z foo bar xyz 1 -0.04493361 0.91897737 NA 2 -0.01619026 0.78213630 -0.05612874 3 0.94383621 0.07456498 -0.15579551 4 0.82122120 -1.98935170 -1.47075238 5 0.59390132 0.61982575 NA > > ## add comments to a zoo object > comment(x1) <- c("This is a very simple example of a zoo object.", + "It can be recreated using this R code: example(zoo)") > ## comments are not output by default but are still there > x1 1 2 3 4 5 1 2 3 4 5 > comment(x1) [1] "This is a very simple example of a zoo object." [2] "It can be recreated using this R code: example(zoo)" > > # ifelse does not work with zoo but this works > # to create a zoo object which equals x1 at > # time i if x1[i] > x1[i-1] and 0 otherwise > (diff(x1) > 0) * x1 2 3 4 5 2 3 4 5 > > ## zoo series with duplicated indexes > z3 <- zoo(1:8, c(1, 2, 2, 2, 3, 4, 5, 5)) Warning in zoo(1:8, c(1, 2, 2, 2, 3, 4, 5, 5)) : some methods for "zoo" objects do not work if the index entries in 'order.by' are not unique > plot(z3) > ## remove duplicated indexes by averaging > lines(aggregate(z3, index(z3), mean), col = 2) > ## or by using the last observation > lines(aggregate(z3, index(z3), tail, 1), col = 4) > > ## x1[x1 > 3] is not officially supported since > ## x1 > 3 is of class "zoo", not "logical". > ## Use one of these instead: > x1[which(x1 > 3)] 4 5 4 5 > x1[coredata(x1 > 3)] 4 5 4 5 > x1[as.logical(x1 > 3)] 4 5 4 5 > subset(x1, x1 > 3) 4 5 4 5 > > ## any class supporting the methods discussed can be used > ## as an index class. Here are examples using complex numbers > ## and letters as the time class. > > z4 <- zoo(11:15, complex(real = c(1, 3, 4, 5, 6), imag = c(0, 1, 0, 0, 1))) > merge(z4, lag(z4)) z4 lag(z4) 1+0i 11 12 3+1i 12 13 4+0i 13 14 5+0i 14 15 6+1i 15 NA > > z5 <- zoo(11:15, letters[1:5]) > merge(z5, lag(z5)) z5 lag(z5) a 11 12 b 12 13 c 13 14 d 14 15 e 15 NA > > # index values relative to 2001Q1 > zz <- zooreg(cbind(a = 1:10, b = 11:20), start = as.yearqtr(2000), freq = 4) > zz[] <- mapply("/", as.data.frame(zz), coredata(zz[as.yearqtr("2001Q1")])) > > > ## even though time index must be unique zoo (and read.zoo) > ## will both allow creation of such illegal objects with > ## a warning (rather than ana error) to give the user a > ## chance to fix them up. Extracting and replacing times > ## and aggregate.zoo will still work. > ## Not run: > ##D # this gives a warning > ##D # and then creates an illegal zoo object > ##D z6 <- zoo(11:15, c(1, 1, 2, 2, 5)) > ##D z6 > ##D > ##D # fix it up by averaging duplicates > ##D aggregate(z6, identity, mean) > ##D > ##D # or, fix it up by taking last in each set of duplicates > ##D aggregate(z6, identity, tail, 1) > ##D > ##D # fix it up via interpolation of duplicate times > ##D time(z6) <- na.approx(ifelse(duplicated(time(z6)), NA, time(z6)), na.rm = FALSE) > ##D # if there is a run of equal times at end they > ##D # wind up as NAs and we cannot have NA times > ##D z6 <- z6[!is.na(time(z6))] > ##D z6 > ##D > ##D x1. <- x1 <- zoo (matrix (1:12, nrow = 3), as.Date("2008-08-01") + 0:2) > ##D colnames (x1) <- c ("A", "B", "C", "D") > ##D x2 <- zoo (matrix (1:12, nrow = 3), as.Date("2008-08-01") + 1:3) > ##D colnames (x2) <- c ("B", "C", "D", "E") > ##D > ##D both.dates = as.Date (intersect (index (t1), index (t2))) > ##D both.cols = intersect (colnames (t1), colnames (t2)) > ##D > ##D x1[both.dates, both.cols] > ##D ## there is "[.zoo" but no "[<-.zoo" however four of the following > ##D ## five examples work > ##D > ##D ## wrong > ##D ## x1[both.dates, both.cols] <- x2[both.dates, both.cols] > ##D > ##D # 4 correct alternatives > ##D # #1 > ##D window(x1, both.dates)[, both.cols] <- x2[both.dates, both.cols] > ##D > ##D # #2. restore x1 and show a different way > ##D x1 <- x1. > ##D window(x1, both.dates)[, both.cols] <- window(x2, both.dates)[, both.cols] > ##D > ##D # #3. restore x1 and show a different way > ##D x1 <- x1. > ##D x1[time(x1) ##D > ##D > ##D # #4. restore x1 and show a different way > ##D x1 <- x1. > ##D x1[time(x1) ##D > ##D > ## End(Not run) > > > > > cleanEx() > nameEx("zooreg") > ### * zooreg > > flush(stderr()); flush(stdout()) > > ### Name: zooreg > ### Title: Regular zoo Series > ### Aliases: zooreg frequency.zooreg frequency.zoo deltat.zooreg deltat.zoo > ### cycle.zooreg cycle.zoo as.zooreg as.zooreg.default as.zooreg.ts > ### as.zooreg.its as.zooreg.xts as.ts.zooreg as.zoo.zooreg as.zooreg.zoo > ### index<-.zooreg time<-.zooreg lag.zooreg > ### Keywords: ts > > ### ** Examples > > ## equivalent specifications of a quarterly series > ## starting in the second quarter of 1959. > zooreg(1:10, frequency = 4, start = c(1959, 2)) 1959(2) 1959(3) 1959(4) 1960(1) 1960(2) 1960(3) 1960(4) 1961(1) 1961(2) 1961(3) 1 2 3 4 5 6 7 8 9 10 > as.zoo(ts(1:10, frequency = 4, start = c(1959, 2))) 1959(2) 1959(3) 1959(4) 1960(1) 1960(2) 1960(3) 1960(4) 1961(1) 1961(2) 1961(3) 1 2 3 4 5 6 7 8 9 10 > zoo(1:10, seq(1959.25, 1961.5, by = 0.25), frequency = 4) 1959(2) 1959(3) 1959(4) 1960(1) 1960(2) 1960(3) 1960(4) 1961(1) 1961(2) 1961(3) 1 2 3 4 5 6 7 8 9 10 > > ## use yearqtr class for indexing the same series > z <- zoo(1:10, yearqtr(seq(1959.25, 1961.5, by = 0.25)), frequency = 4) > z 1959 Q2 1959 Q3 1959 Q4 1960 Q1 1960 Q2 1960 Q3 1960 Q4 1961 Q1 1961 Q2 1961 Q3 1 2 3 4 5 6 7 8 9 10 > z[-(3:4)] 1959 Q2 1959 Q3 1960 Q2 1960 Q3 1960 Q4 1961 Q1 1961 Q2 1961 Q3 1 2 5 6 7 8 9 10 > > ## create a regular series with a "Date" index > zooreg(1:5, start = as.Date("2000-01-01")) 2000-01-01 2000-01-02 2000-01-03 2000-01-04 2000-01-05 1 2 3 4 5 > ## or with "yearmon" index > zooreg(1:5, end = yearmon(2000)) Jan 1996 Jan 1997 Jan 1998 Jan 1999 Jan 2000 1 2 3 4 5 > > ## lag and diff (as diff is defined in terms of lag) > ## act differently on zoo and zooreg objects! > ## lag.zoo moves a point to the adjacent time whereas > ## lag.zooreg moves a point by deltat > x <- c(1, 2, 3, 6) > zz <- zoo(x, x) > zr <- as.zooreg(zz) > lag(zz, k = -1) 2 3 6 1 2 3 > lag(zr, k = -1) 2 3 4 7 1 2 3 6 > diff(zz) 2 3 6 1 1 3 > diff(zr) 2 3 1 1 > > ## lag.zooreg wihtout and with na.pad > lag(zr, k = -1) 2 3 4 7 1 2 3 6 > lag(zr, k = -1, na.pad = TRUE) 1 2 3 4 6 7 NA 1 2 3 NA 6 > > ## standard methods available for regular series > frequency(z) [1] 4 > deltat(z) [1] 0.25 > cycle(z) 1959 Q2 1959 Q3 1959 Q4 1960 Q1 1960 Q2 1960 Q3 1960 Q4 1961 Q1 1961 Q2 1961 Q3 2 3 4 1 2 3 4 1 2 3 > cycle(z[-(3:4)]) 1959 Q2 1959 Q3 1960 Q2 1960 Q3 1960 Q4 1961 Q1 1961 Q2 1961 Q3 2 3 2 3 4 1 2 3 > > zz <- zoo(1:6, as.Date(c("1960-01-29", "1960-02-29", "1960-03-31", + "1960-04-29", "1960-05-31", "1960-06-30"))) > # this converts zz to "zooreg" and then to "ts" expanding it to a daily > # series which is 154 elements long, most with NAs. > ## Not run: > ##D length(as.ts(zz)) # 154 > ## End(Not run) > # probably a monthly "ts" series rather than a daily one was wanted. > # This variation of the last line gives a result only 6 elements long. > length(as.ts(aggregate(zz, as.yearmon, c))) # 6 [1] 6 > > zzr <- as.zooreg(zz) > > dd <- as.Date(c("2000-01-01", "2000-02-01", "2000-03-01", "2000-04-01")) > zrd <- as.zooreg(zoo(1:4, dd)) > > > > > ### *