timeSeries/0000755000176200001440000000000014551002402012354 5ustar liggesuserstimeSeries/NAMESPACE0000644000176200001440000002060214550731561013611 0ustar liggesusers################################################ ## import name space ################################################ ## MM: Importing all is almost surely a waste [FIXME!] import("methods") # , show importFrom("grDevices", col2rgb, rgb , xy.coords) if(packageVersion("timeDate") <= '4032.109') importFrom("timeDate", frequency) if(packageVersion("timeDate") > '4032.109') importFrom("stats", frequency) importFrom("stats", approx, approxfun, spline, splinefun, var, cor, dist, hclust, qt, rnorm, runif, runmed, ts, is.mts, deltat, ## for these, we provide methods: start, end, time, window, lag, filter, aggregate, as.ts, median, quantile, na.contiguous, na.omit ) importFrom("graphics", # Note: lines, plot, points imported from timeDate axTicks, axis, axis.POSIXct, box, grid, layout, mtext, par, plot.default, plot.new, plot.window, segments, text, title ) importFrom("utils", head.matrix, tail.matrix, read.table, .DollarNames, # as we provide an S3 method ## provide methods for these : head, tail, str ) importFrom("timeDate", abline, # the S4 generic from here, not "graphics" (graphics::abline is not generic) ##--- For these we provide and export methods : plot, # base lines, points, # graphics isDaily, isMonthly, isQuarterly, isRegular, align, ##---- end of generics for which we define/export methods getRmetricsOptions, setRmetricsOptions, finCenter, "finCenter<-", as.timeDate, atoms, dayOfWeek, isWeekday, timeCalendar, timeDate, timeSequence, timeFirstDayInMonth, timeFirstDayInQuarter, timeLastDayInMonth, timeLastDayInQuarter, kurtosis, skewness ) importMethodsFrom("timeDate", "+", "-", "Ops", "[" ) ################################################ ## S3 methods ################################################ S3method(".DollarNames", "timeSeries") S3method("aggregate", "timeSeries") S3method("as.data.frame", "timeSeries") S3method("as.list", "timeSeries") S3method("as.matrix", "timeSeries") S3method("as.timeSeries", character) S3method("as.timeSeries", data.frame) S3method("as.timeSeries", default) S3method("as.timeSeries", ts) S3method("as.timeSeries", zoo) S3method("as.ts", "timeSeries") S3method("cbind", "timeSeries") S3method("cumulated", default) # S3method("cut", "timeSeries") # timeSeries method was removed on 2023-05-26 S3method("diff", "timeSeries") S3method("end", "timeSeries") S3method("getUnits", default) S3method("head", "timeSeries") S3method("lag", "timeSeries") S3method("lines", "timeSeries") S3method("median", "timeSeries") S3method("merge", "timeSeries") S3method("na.contiguous", "timeSeries") S3method("na.omit", "timeSeries") S3method("plot", "timeSeries") S3method("points", "timeSeries") S3method("pretty", "timeSeries") S3method("print", timeSeries) S3method("print", timeSeries_summary) S3method("rbind", "timeSeries") S3method("rev", "timeSeries") S3method("scale", "timeSeries") S3method("sort", "timeSeries") S3method("start", "timeSeries") S3method("summary", "timeSeries") S3method("str", "timeSeries") S3method("tail", "timeSeries") S3method("window", "timeSeries") S3method("time", "timeSeries") S3method("frequency", "timeSeries") S3method("is.unsorted", "timeSeries") S3method("time<-", "timeSeries") S3method("time<-", default) if(getRversion() >= "3.6.0") { # GNB ## we ensure that when zoo is loaded zoo::`time<-` gets the 'timeSeries' ## method. This works nicely, if 'zoo' is attached after 'timeSeries' (or ## if 'timeSeries' is loaded but not attached). It may seem that if ## 'timeSeries' is attached after 'zoo', zoo::`time<-` will be masked, so ## 'time(x) <- value' will see only the methods for the timeSeries version ## of 'time<-'. But this is not a problem since the default method for ## timeSeries::`time<-` calls zoo::`time<-` S3method(zoo::`time<-`, "timeSeries") S3method(zoo::coredata, "timeSeries") S3method(zoo::'coredata<-', "timeSeries") } ################################################ ## S4 classes ################################################ exportClasses("index_timeSeries", "timeSeries", "time_timeSeries" ) exportMethods( "$", "$<-", "+", "-", "Ops", "[", ## from timeDate "align", "finCenter", "finCenter<-", "isDaily", "isMonthly", "isQuarterly", "isRegular", ## from methods "cbind2", "rbind2", "coerce", "getDataPart", "setDataPart", # not generic in methods "initialize", "show", ## primitive R functions (internally S3 and S4 generic) "cummax", "cummin", "cumprod", "cumsum", "dim", "dim<-", "dimnames", "dimnames<-", "names", "names<-", ## stats ## "aggregate", ## "as.ts", "filter", # not generic in stats; let it stay S4 here ## graphics ## "lines", "points", ## from base "apply", # not generic in base "as.data.frame", "as.list", "as.matrix", "attach", # not generic in base "colMeans", "colSums", # not generic in base "colnames", "colnames<-", "rownames", "rownames<-", # not generic in base "comment", "comment<-", # not generic in base # "cut", # timeSeries method was removed on 2023-05-26 "is.unsorted", # internal generic in base (but seemingly only S3, not S4) "merge", # the S4 methods are for x and y, so S4 is essential "plot", "rank", # not generic in base "sample", # not generic in base "t" ) ################################################ ## functions ################################################ export( ".colorwheelPalette", # used in the vignette "alignDailySeries", "applySeries", "as.timeSeries", "colCummaxs", "colCummins", "colCumprods", "colCumreturns", "colCumsums", "colKurtosis", "colMaxs", "colMins", "colProds", "colQuantiles", "colSds", "colSkewness", "colStats", "colVars", "coredata.timeSeries", "coredata<-.timeSeries", "countMonthlyRecords", "cumulated", "daily2monthly", "daily2weekly", "description", "drawdowns", "drawdownsStats", "dummyDailySeries", "dummyMonthlySeries", "durations", "endOfPeriodBenchmarks", "endOfPeriodSeries", "endOfPeriodStats", "fapply", "getAttributes", "getFinCenter", "getReturns", # several uses in the tests in 'fTrading' # I corrected the devel version of 'fTrading'. # TODO: remove when fTrading is updated on CRAN. "getTime", "getUnits", "getUnits.default", "hclustColnames", "index2wealth", "interpNA", "is.signalSeries", "is.timeSeries", "isMultivariate", "isUnivariate", "midquotes", "orderColnames", "orderStatistics", "outlier", "pcaColnames", "readSeries", "removeNA", "returns", "returns0", "rollDailySeries", "rollMax", "rollMean", "rollMedian", "rollMin", "rollMonthlySeries", "rollMonthlyWindows", "rollStats", "rowCumsums", "runlengths", "sampleColnames", "series", "series<-", "setAttributes<-", "setFinCenter<-", "setTime<-", "setUnits<-", "smoothLowess", "smoothSpline", "smoothSupsmu", "sortColnames", "splits", "spreads", "statsColnames", "substituteNA", "time", "time<-", "timeSeries", "turns", "turnsStats", "head", # 2024-01-05 GNB: were in exportMethods but no longer S4 generic "tail", "str", "start", "end", "median", "quantile", "na.contiguous", ## "sort", # from 'base', no need to export ## "rev", ## "print", ## "diff", ## "is.na", # primitive ## "frequency", "aggregate", "as.ts", # stats, reexport ## graphics "lines", "points", # graphics, reexport "na.omit", "lag", "window" ) timeSeries/ChangeLog0000755000176200001440000006433014266302774014161 0ustar liggesusers2020-01-24 Martin Maechler * DESCRIPTION (Version): 3062.100 ; using Authors@R * R/utils-head.R: tail.matrix() in R-devel uses 'keepnums'. * R/timeSeries-readSeries.R (et all): do *NOT* use `if(class(.) == "timeSeries")` but use `inherits(*, "...")` !! * R/methods-plot.R (.plotTimeSeries): fix wrong logic in `if(.. && at == "auto")` when `at` can be a vector (!) * R/aaa-utils.R (`%||%`): utility, to be used extensively in * R/methods-plot2.R (.xtplot.timeSeries). 2015-11-09 tsetz * updated rank function * exported getUnits and .DollarNames as S3 methods 2014-06-17 wuertz * vignette 'plotting timeSeries objects' added * DESCRIPTION, required packages added 2014-06-16 wuertz * Refcard PDF added to doc directory 2013-03-25 chalabi * DESCRIPTION: Updated version number * R/methods-mathOps.R: callGeneric() seems to have troubles in finding variables defined in the function frame and passed to the generic with the dots arguments. 2013-03-15 chalabi * ChangeLog, DESCRIPTION: Updated ChangeLog and DSC files * DESCRIPTION: Updated maintainer field and version number * R/zzz.R: Removed deprecated .First.lib() * R/base-apply.R: Added out of range test in apply,method-timeSeries 2013-02-22 tsetz * R/statistics-rollMean.R: functions rollMin and rollMax exchanged and function rollMin corrected, * rollStats timeSeries name corrected 2012-08-12 chalabi * ChangeLog, DESCRIPTION: updated DESC and ChangeLog 2012-08-07 chalabi * DESCRIPTION: updated version number * R/base-subsetting.R: Removed C level call to 'find_interv_vec' due to changes in R-devel 2012-03-21 chalabi * ChangeLog, DESCRIPTION: updated ChangeLog and DESC * NAMESPACE, R/utils-getArgs.R, man/utils-getArgs.Rd: moved getArgs to fBasics where it was already defined * ChangeLog, DESCRIPTION: updated DESC and ChangeLog * man/utils-getArgs.Rd: added manual page for getArgs * R/utils-getArgs.R: getArgs() can now handle signature of length > 1 * NAMESPACE: added getArgs to NAMESPACE * R/methods-plot.R: pretty.timeSeries can not handle signal series * NAMESPACE: updated NAMESPACE * ChangeLog, DESCRIPTION: updated DESCRIPTION and ChangeLog * DESCRIPTION: updated version number 2012-03-20 chalabi * DESCRIPTION: updated DESC file 2012-03-20 wuertz * NAMESPACE: updated * R/timeSeries-slotSeries.R: had conflicts with mu fPortfolio * man/timeSeries-slotSeries.Rd: 2012-03-19 chalabi * DESCRIPTION: updated DSC * man/methods-plot.Rd: updated manual page * R/fin-daily.R: fixed patial argument names * data/LPP2005REC.rda, data/MSFT.rda, data/USDCHF.rda: resaved data to reduce file disk storage 2012-03-17 wuertz * man/methods-plot.Rd: plot examples updated for pretty label positions * ChangeLog, NAMESPACE, R/methods-plot.R, man/methods-plot.Rd: pretty added 2012-03-16 wuertz * R/fin-drawdowns.R: drawdowns made visible 2011-11-01 chalabi * DESCRIPTION, R/fin-align.R, R/fin-daily.R, man/fin-align.Rd, man/fin-daily.Rd: alignDailySeries is now based on the align timeSeries method which is now based on the align timeDate method in timeDate (>= 2150.95). * inst/unitTests/runit.TimeSeriesData.R: updated unit test with new lag,timeSeries-method * R/stats-lag.R: fixed lag,timeSeries method when colnames are provided by 'units' argument. * R/base-cbind.R: Better handling of FinCenter in cbind.timeSeries method. * R/timeSeries.R: timeSeries method now works also with non default FinCenter when timestamps are given as a numerical vector. 2011-10-24 chalabi * R/stats-lag.R, inst/unitTests/runit.lag.R: Thanks to Daniele Amberti, lag timeSeries methods now returns proper colnames when used with multiple lag indexes. * inst/unitTests/runit.merge.R: * R/base-merge.R: Thanks to Daniele Amberti, merge timeSeries method now poperly converts colnames to valid data.frame names. 2011-10-11 tsetz * R/fin-drawdowns.R: Drawdowns are now compatible to the results of the drawdown function from performanceAnalytics ... 2011-09-23 mmaechler * DESCRIPTION: remove deprecated "LazyLoad" entry 2011-08-02 chalabi * ChangeLog, DESCRIPTION: updated DESC and ChangeLog 2011-05-04 chalabi * R/fin-align.R: Fixed integer overflow when dealing with very long historical data (1800 - today) in align method. 2011-04-21 wuertz * NAMESPACE, R/statistics-rollMean.R, man/statistics-rollMean.Rd: function rollStats added 2011-03-31 wuertz * NAMESPACE, R/fin-smooth.R, R/statistics-smoothLowess.R, man/base-rev.Rd, man/base-sort.Rd, man/base-start.Rd, man/fin-smooth.Rd, man/statistics-smoothLowess.Rd, man/timeSeries-readSeries.Rd, man/timeSeries-slotFinCenter.Rd, man/timeSeries-slotSeries.Rd, man/timeSeries-slotTime.Rd, man/timeSeries-slotUnits.Rd: help pages added and script files renamed * man/timeSeries-finCenter.Rd, man/timeSeries-slotFinCenter.Rd, man/timeSeries-slotUnits.Rd, man/utils-str.Rd, man/utils-structure.Rd: function renames * R/timeSeries-description.R, R/timeSeries-finCenter.R, R/timeSeries-series.R, R/timeSeries-slotFinCenter.R, R/timeSeries-slotSeries.R, R/timeSeries-slotTime.R, R/timeSeries-slotUnits.R, R/timeSeries-time.R, R/utils-description.R, R/utils-str.R, R/utils-structure.R: files renamed * man/timeSeries-description.Rd, man/timeSeries-series.Rd, man/timeSeries-slotSeries.Rd, man/timeSeries-slotTime.Rd, man/timeSeries-time.Rd, man/utils-description.Rd: files renamed * R/base-colCumsums.R, R/base-colSums.R, R/base-rowCumsums.R, R/fin-orderColnames.R, R/fin-orderStatistics.R, R/fin-rollmean.R, R/statistics-colCumsums.R, R/statistics-colSums.R, R/statistics-orderColnames.R, R/statistics-orderStatistics.R, R/statistics-rollMean.R, R/statistics-rowCumsums.R, man/base-colCumsums.Rd, man/base-colSums.Rd, man/base-rowCumsums.Rd, man/fin-orderColnames.Rd, man/fin-orderStatistics.Rd, man/fin-rollMean.Rd, man/statistics-colCumsums.Rd, man/statistics-colSums.Rd, man/statistics-orderColnames.Rd, man/statistics-orderStatistics.Rd, man/statistics-rollMean.Rd, man/statistics-rowCumsums.Rd: new file group for statistics and inference introduced. * NAMESPACE, R/aaa-Deprecated.R, R/base-Extract.R, R/base-attach.R, R/base-colSums.R, R/base-comment.R, R/base-rowCumsums.R, R/base-sort.R, R/base-start.R, R/base-subsetting.R, R/base-t.R, R/data-examples.R, R/fin-align.R, R/fin-daily.R, R/fin-drawdowns.R, R/fin-durations.R, R/fin-monthly.R, R/fin-periodical.R, R/fin-rollmean.R, R/fin-runlengths.R, R/fin-smooth.R, R/fin-splits.R, R/fin-spreads.R, R/fin-turnpoints.R, R/graphics-plot.R, R/methods-as.R, R/methods-comment.R, R/methods-is.R, R/methods-mathOps.R, R/methods-plot.R, R/old2new.R, R/stats-aggregate.R, R/stats-filter.R, R/stats-lag.R, R/stats-model.frame.R, R/stats-na.contiguous.R, R/stats-na.omit.R, R/stats-window.R, R/timeSeries-description.R, R/timeSeries-dummy.R, R/timeSeries-finCenter.R, R/timeSeries-getDataPart.R, R/timeSeries-isOHLC.R, R/timeSeries-isRegular.R, R/timeSeries-isUnivariate.R, R/timeSeries-readSeries.R, R/timeSeries-series.R, R/timeSeries-signalCounts.R, R/timeSeries-time.R, R/timeSeries.R, R/utils-getArgs.R, R/utils-head.R, R/utils-old2new.R, R/utils-str.R, man/00timeSeries-package.Rd, man/base-diff.Rd, man/base-merge.Rd, man/base-rev.Rd, man/base-sample.Rd, man/base-scale.Rd, man/base-sort.Rd, man/base-start.Rd, man/base-subsetting.Rd, man/data-examples.Rd, man/data.Rd, man/fin-align.Rd, man/fin-cumulated.Rd, man/fin-daily.Rd, man/fin-drawdowns.Rd, man/fin-durations.Rd, man/fin-periodical.Rd, man/fin-rollMean.Rd, man/fin-runlengths.Rd, man/fin-smooth.Rd, man/fin-splits.Rd, man/fin-turnpoints.Rd, man/graphics-plot.Rd, man/methods-comment.Rd, man/methods-plot.Rd, man/stats-window.Rd: several smaller updates: man pages improved, rolling statistics and smoother function added, some obsolete functions declared as deprecated. 2011-03-09 chalabi * ChangeLog, DESCRIPTION: updated DESC and ChangeLog * inst/doc: removed empty directory * DESCRIPTION: updated version number * R/timeSeries-readSeries.R: Fixed readSeries when reading tables with multiple columns. (Reported by Chris Breton). 2011-02-10 chalabi * ChangeLog, DESCRIPTION: updated Date and Revision field in DESC file and updated Changelog file * DESCRIPTION: updated DESC file * man/timeSeries-readSeries.Rd, man/timeSeries.Rd: added manual page for function readSeries() * inst/doc/TimeSeriesFAQ.pdf: removed pdf file because new version can be found on the website 2011-01-31 chalabi * R/timeSeries-readSeries.R, man/timeSeries.Rd: Added the optional 'format' argument and and a warning when the provided format produces NAs in readSeries function 2010-10-27 chalabi * ChangeLog, DESCRIPTION: updated DESC and ChangeLog file 2010-10-26 chalabi * R/base-cbind.R: cbind now extends vectors to match number of rows of the timeSeries object. 2010-09-30 chalabi * NAMESPACE: updated NAMESPACE 2010-09-24 chalabi * DESCRIPTION, NAMESPACE: updated NAMESPACE and version number in DESC file 2010-08-20 chalabi * R/stats-na.omit.R: removeNA is now the same as na.omit 2010-08-12 chalabi * R/graphics-plot.R: added grid function in .plotTimeSeries when using single plot type. * R/base-cbind.R, inst/unitTests/runit.bind.R: fixed issued reported by Thomas Etheber when using cbind method with timeSeries object with one record. 2010-07-26 chalabi * ChangeLog, DESCRIPTION: updated DESC and ChangeLog * DESCRIPTION: updated version number 2010-07-08 chalabi * R/methods-mathOps.R, R/stats-lag.R, R/stats-na.omit.R: improved support recordIDs * R/timeSeries-finCenter.R: cleanup code * R/base-apply.R, R/base-cbind.R, R/base-diff.R, R/base-rowCumsums.R, R/fin-runlengths.R: improved support of recordIDs 2010-07-06 chalabi * ChangeLog, DESCRIPTION: updated DESC and Changelog 2010-07-05 chalabi * R/methods-show.R: code cleanup 2010-07-02 chalabi * R/methods-show.R: Improved recordIDs handling in show method. 2010-05-17 chalabi * R/base-start.R: updated start/end to handle TZ 2010-04-22 chalabi * R/timeSeries-readSeries.R: improved dates management in readSeries() 2010-04-14 chalabi * NAMESPACE: updated NAMESPACE 2010-01-23 wuertz * NAMESPACE, R/aaa-Deprecated.R, R/fin-align.R, R/timeSeries-description.R, R/utils-getArgs.R: internal function .getArgs added 2010-01-22 wuertz * R/aaa-Deprecated.R, R/fin-durations.R, R/fin-spreads.R: deprecated functions moved to aaa-deprecated.R, started to clean up .... * R/fin-rollmean.R: code cleaned and description added * NAMESPACE, R/fin-runlength.R, R/fin-runlengths.R, man/fin-runlengths.Rd: .runlengths added 2010-01-06 chalabi * DESCRIPTION: updated version number * ChangeLog, DESCRIPTION: updated Changelog and DESC file * inst/unitTests/runit.aggregate.R, inst/unitTests/runit.subset.R: fixed unit tests for new years 2009-12-24 chalabi * NAMESPACE: updated NAMESPACE 2009-12-20 wuertz * NAMESPACE, R/fin-runlength.R: .runlengths() function added 2009-12-13 chalabi * DESCRIPTION: updated version number * ChangeLog, DESCRIPTION: updated Changelog and DESC file * man/base-subset.Rd: added aliased in manual pages 2009-12-10 chalabi * DESCRIPTION: updated version number * ChangeLog, DESCRIPTION: updated Changelog and DESC file * R/base-Extract.R: added completion method after the $ sign. * R/base-Extract.R, man/base-subset.Rd: updated signature list of timeSeries,$ method according to changes in r50609 in R-devel. 2009-10-26 wuertz * R/fin-drawdowns.R: example lin in script corrected 2009-10-05 chalabi * R/graphics-plot.R: improved handling of NA's in plot,timeSeries-method 2009-09-30 chalabi * inst/doc, inst/doc/TimeSeriesFAQ.pdf: added pdf files in inst/doc 2009-09-28 chalabi * DESCRIPTION: updated version number * ChangeLog, DESCRIPTION: updated DESCR and ChangeLog * R/AllClass.R: Added prototype in timeSeries class definition. 2009-09-02 chalabi * NAMESPACE, R/base-Extract.R, man/base-subset.Rd, man/timeSeries.Rd: added methods to subset timeSeries object with POSIXt and Date time stamps * NAMESPACE, R/stats-filter.R, man/stats-filter.Rd: added filter,timeSeries-method * NAMESPACE, R/base-t.R, man/base-t.Rd: added t,timeSeries-method * R/stats-na.contiguous.R, inst/unitTests/runit.na.contiguous.R, man/stats-na.contiguous.Rd: added na.contiguous,timeSeries-method. 2009-08-30 wuertz * R/base-apply.R: back to the previous version * R/base-attach.R: description added to attach * R/base-apply.R: apply should work now in all cases 2009-08-30 chalabi * NAMESPACE, R/timeSeries-isRegular.R, man/timeSeries-isRegular.Rd: isRegular methods are now proper S4 methods. 2009-08-30 wuertz * man/base-colCumsumsRd: file with missing dot deleted * man/base-colCumsums.Rd: missing dot in file name added 2009-08-28 wuertz * R/base-diff.R, R/methods-Ops.R, R/methods-mathOps.R, man/base-rowCumsums.Rd, man/fin-align.Rd, man/methods-DataPart.Rd, man/methods-align.Rd, man/methods-rowCum.Rd, man/time.Rd, man/timeSeries-getDataPart.Rd, man/timeSeries-time.Rd: renaming of man files finished * NAMESPACE, R/fin-monthly.R, R/fin-rollmean.R, R/timeSeries-isRegular.R, man/apply.Rd, man/base-apply.Rd, man/base-attach.Rd, man/base-cbind.Rd, man/base-colCumsumsRd, man/base-colSums.Rd, man/base-dim.Rd, man/base-rank.Rd, man/base-subset.Rd, man/colCum.Rd, man/colStats.Rd, man/cumulated.Rd, man/daily.Rd, man/description.Rd, man/drawdowns.Rd, man/durations.Rd, man/fin-cumulated.Rd, man/fin-daily.Rd, man/fin-drawdowns.Rd, man/fin-durations.Rd, man/fin-monthly.Rd, man/fin-orderColnames.Rd, man/fin-orderStatistics.Rd, man/fin-returns.Rd, man/fin-spreads.Rd, man/finCenter.Rd, man/graphics-plot.Rd, man/is.Rd, man/isUnivariate.Rd, man/lag.Rd, man/methods-aggregate.Rd, man/methods-attach.Rd, man/methods-bind.Rd, man/methods-dim.Rd, man/methods-is.Rd, man/methods-na.Rd, man/methods-plot.Rd, man/methods-returns.Rd, man/methods-str.Rd, man/methods-subset.Rd, man/model.frame.Rd, man/monthly.Rd, man/order.Rd, man/orderStatistics.Rd, man/rank.Rd, man/series.Rd, man/spreads.Rd, man/stats-aggregate.Rd, man/stats-lag.Rd, man/stats-model.frame.Rd, man/stats-na.omit.Rd, man/timeSeries-description.Rd, man/timeSeries-finCenter.Rd, man/timeSeries-isRegular.Rd, man/timeSeries-isUnivariate.Rd, man/timeSeries-series.Rd, man/utils-str.Rd: man script files Rd renamed to be more compatible with the script R files and the eBook * man/colCum.Rd: deleted by mistake * man/colCum.Rd: * R/timeSeries-isPeriod.R: isPeriod file no longer needed 2009-08-27 wuertz * inst/unitTests/runit.NA.R, inst/unitTests/runit.Omit.R, inst/unitTests/runit.TimeSeriesClass.R, inst/unitTests/runit.TimeSeriesCoercion.R, inst/unitTests/runit.TimeSeriesData.R, inst/unitTests/runit.TimeSeriesPositions.R, inst/unitTests/runit.aggregate.R, inst/unitTests/runit.align.R, inst/unitTests/runit.apply.R, inst/unitTests/runit.as.R, inst/unitTests/runit.attach.R, inst/unitTests/runit.bind.R, inst/unitTests/runit.colCum.R, inst/unitTests/runit.colStats.R, inst/unitTests/runit.cor.R, inst/unitTests/runit.cumulated.R, inst/unitTests/runit.daily.R, inst/unitTests/runit.dim.R, inst/unitTests/runit.drawdowns.R, inst/unitTests/runit.durations.R, inst/unitTests/runit.lag.R, inst/unitTests/runit.mathOps.R, inst/unitTests/runit.merge.R, inst/unitTests/runit.methods-plot.R, inst/unitTests/runit.methods-print.R, inst/unitTests/runit.methods-summary.R, inst/unitTests/runit.model.frame.R, inst/unitTests/runit.monthly.R, inst/unitTests/runit.order.R, inst/unitTests/runit.periodical.R, inst/unitTests/runit.rank.R, inst/unitTests/runit.returns.R, inst/unitTests/runit.rowCum.R, inst/unitTests/runit.signalCounts.R, inst/unitTests/runit.spreads.R, inst/unitTests/runit.subset.R, inst/unitTests/runit.time.R, inst/unitTests/runit.timeSeries.R, man/apply.Rd, man/colCum.Rd, man/colStats.Rd, man/cumulated.Rd, man/daily.Rd, man/data.Rd, man/description.Rd, man/drawdowns.Rd, man/durations.Rd, man/finCenter.Rd, man/is.Rd, man/isUnivariate.Rd, man/lag.Rd, man/methods-DataPart.Rd, man/methods-aggregate.Rd, man/methods-align.Rd, man/methods-as.Rd, man/methods-attach.Rd, man/methods-base.Rd, man/methods-bind.Rd, man/methods-comment.Rd, man/methods-dim.Rd, man/methods-mathOps.Rd, man/methods-na.Rd, man/methods-plot.Rd, man/methods-returns.Rd, man/methods-rowCum.Rd, man/methods-show.Rd, man/methods-stats.Rd, man/methods-str.Rd, man/methods-subset.Rd, man/model.frame.Rd, man/monthly.Rd, man/order.Rd, man/orderStatistics.Rd, man/rank.Rd, man/series.Rd, man/spreads.Rd, man/time.Rd, man/timeSeries.Rd: As a consequnece of introducing rda data files I have adapted all manual pages and all unit test files where it was necessary * data/LPP2005REC.rda, data/MSFT.rda, data/USDCHF.rda: now the rda files are there * data/LPP2005REC.Rda, data/MSFT.Rda, data/USDCHF.Rda: data files removed * data/LPP2005REC.Rda, data/LPP2005REC.csv, data/MSFT.Rda, data/USDCHF.Rda: Rda data files added, csv deleted, now all data files are in the same format makes life easier * data/MSFT.rda, data/msft.dat.csv, data/usdchf.csv: csv and rda files deleted 2009-08-17 chalabi * R/base-colCumsums.R, inst/unitTests/runit.colCum.R: Rewrite all Colcum methods to take advantages of new apply,timeSeries-methods. * R/base-apply.R: Improved apply,timeSeries-method to handle timeSeries with one row. * NAMESPACE: new NAMESPACE structure which should ease maintenance of packages. * R/methods-show.R: show,timeSeries-method is now more friendly with default "max.print" R option. * DESCRIPTION, NAMESPACE, R/base-Extract.R, R/base-cbind.R, R/base-merge.R, R/methods-Ops.R, R/methods-as.R, R/methods-show.R, R/timeSeries.R, inst/unitTests/runit.bind.R, man/methods-bind.Rd: Merge branch 'devel-timeSeries' Conflicts: pkg/timeSeries/R/base-Extract.R pkg/timeSeries/R/timeSeries.R * NAMESPACE, R/AllClass.R, R/base-Extract.R, R/timeSeries-getDataPart.R, man/methods-subset.Rd: better handling of @recordIDs with $<-,timeSeries-method. * R/methods-as.R: improved as.ts,timeSeries-method with monthly and quarterly data. 2009-06-13 chalabi * R/base-Extract.R: Improved $,timeSeries-method when matching names in @recordIDs * R/AllClass.R, R/base-Extract.R, R/base-dim.R: names,timeSeries-method returns now also the names of data in @recordIDs. names<-,timeSeries-methods works both for data part and @recordIDs. 2009-05-17 wuertz * inst/unitTests/runit.TimeSeriesCoercion.R: unit tests - still to be updated as.ts * man/methods-as.Rd, man/methods-bind.Rd, man/timeSeries.Rd: man pages updated * NAMESPACE: namespace adapted * NAMESPACE: * R/AllClass.R, R/AllGeneric.R, R/base-Extract.R, R/base-apply.R, R/base-attach.R, R/base-cbind.R, R/base-colCumsums.R, R/base-colSums.R, R/base-comment.R, R/base-diff.R, R/base-dim.R, R/base-merge.R, R/base-rank.R, R/base-rev.R, R/base-rowCumsums.R, R/base-sample.R, R/base-scale.R, R/base-sort.R, R/base-start.R, R/base-subset.R, R/fin-align.R, R/fin-cumulated.R, R/fin-daily.R, R/fin-drawdowns.R, R/fin-durations.R, R/fin-monthly.R, R/fin-orderColnames.R, R/fin-orderStatistics.R, R/fin-periodical.R, R/fin-returns.R, R/fin-smooth.R, R/fin-splits.R, R/fin-spreads.R, R/fin-turnpoints.R, R/graphics-plot.R, R/methods-Ops.R, R/methods-as.R, R/methods-is.R, R/methods-show.R, R/old2new.R, R/stats-aggregate.R, R/stats-lag.R, R/stats-model.frame.R, R/stats-na.omit.R, R/stats-window.R, R/timeSeries-description.R, R/timeSeries-dummy.R, R/timeSeries-finCenter.R, R/timeSeries-getDataPart.R, R/timeSeries-isOHLC.R, R/timeSeries-isPeriod.R, R/timeSeries-isUnivariate.R, R/timeSeries-readSeries.R, R/timeSeries-series.R, R/timeSeries-signalCounts.R, R/timeSeries-time.R, R/timeSeries.R, R/utils-head.R, R/utils-str.R, R/zzz.R: NEW FILE ORDERING CHECKED IN ... * R/AllClass.R, R/AllGeneric.R, R/colCum.R, R/colStats.R, R/cumulated.R, R/daily.R, R/description.R, R/drawdowns.R, R/dummy.R, R/durations.R, R/is.R, R/isUnivariate.R, R/methods-DataPart.R, R/methods-aggregate.R, R/methods-align.R, R/methods-apply.R, R/methods-as.R, R/methods-attach.R, R/methods-bind.R, R/methods-comment.R, R/methods-dim.R, R/methods-finCenter.R, R/methods-head.R, R/methods-lag.R, R/methods-mathOps.R, R/methods-merge.R, R/methods-na.R, R/methods-outlier.R, R/methods-plot.R, R/methods-returns.R, R/methods-rowCum.R, R/methods-series.R, R/methods-show.R, R/methods-str.R, R/methods-subset.R, R/methods-tail.R, R/methods-window.R, R/model.frame.R, R/monthly.R, R/old2new.R, R/order.R, R/orderStatistics.R, R/periodical.R, R/rank.R, R/readSeries.R, R/signalCounts.R, R/spreads.R, R/time.R, R/timeSeries.R, R/turnpoints.R, R/zzz.R: 2009-05-07 wuertz * R/methods-show.R: .print.timeSeries missing column names fixed on "h" style can now also handle "%Q" format for quarterly data * R/methods-plot.R: .plotTimeSeries can now handle different colors and plot symbols for multivariate series 2009-04-19 chalabi * DESCRIPTION: added explicit version number in Depends field for key packages * R/methods-aggregate.R: fixed colnames in aggregate,timeSeries-method * R/AllClass.R: initialize,timeSeries-method checks object with validObject * R/colStats.R: added colMeans and colSums,timeSeries-method because default function is unefficient with large timeSeries objects. 2009-04-02 chalabi * NAMESPACE: updated NAMESPACE * DESCRIPTION: more explicit depends and suggests field in DESC file. 2009-04-01 chalabi * DESCRIPTION: updated DESC file 2009-03-31 chalabi * R/AllClass.R, R/is.R, R/methods-DataPart.R: small changes to make timeSeries work with R-2.7.0. 2009-03-30 chalabi * man/data.Rd: added MSFT (timeSeries version of mstf.dat) in data folder. * NAMESPACE, R/AllClass.R, R/zzz.R: define S4 class 'difftime' with 'setOldClass()'. We will keep it until 'methods' pkg will define it alongside the other old 'base' classes. * R/methods-mathOps.R, R/timeSeries.R, inst/unitTests/runit.mathOps.R, inst/unitTests/runit.timeSeries.R, man/methods-mathOps.Rd: added explicit methods for Ops with 'ts' and 'timeSeries' arguments. 2009-03-25 chalabi * data/MSFT.rda: added timeSeries version of msft.dat dataset 2009-03-19 chalabi * R/is.R, R/methods-aggregate.R, R/methods-as.R, R/methods-bind.R, R/methods-dim.R, R/methods-head.R, R/methods-lag.R, R/methods-mathOps.R, R/methods-merge.R, R/methods-na.R, R/methods-plot.R, R/methods-str.R, R/methods-tail.R, R/methods-window.R, R/model.frame.R, R/time.R, man/lag.Rd, man/methods-aggregate.Rd, man/methods-as.Rd, man/methods-bind.Rd, man/methods-mathOps.Rd, man/methods-na.Rd, man/methods-subset.Rd, man/time.Rd: 'base' generics have now S3 and S4 methods. S3 methods are used because 'UseMethod' does not dispatch S4 methods in 'base' functions. For example 'base' functions starting with something like 'as.list' would failed without the S3 method. * R/old2new.R: added functions to convert old timeSeries format to new class 'timeSeries' * R/methods-subset.R, R/time.R, R/timeSeries.R: @positions is numeric and makes timeSeries object much faster. * R/methods-show.R, R/zzz.R: added getRmetricsOptions("max.print") * R/methods-bind.R, R/methods-merge.R: new implementation of [cb]bind and merge functions * R/is.R: added function is.signalSeries * R/methods-tail.R: optimized tail for large timeSeries * R/methods-as.R, man/methods-as.Rd: new as.list.timeSeries S3 methods. This means that functions like sapply and lapply can now work with timeSeries objects. * R/methods-bind.R, man/methods-bind.Rd: new cbind and rbind implementation in S3 method since methods:::bind_activation might create problems. Names of arguments are now supported. * R/methods-series.R: series<-,matrix-method uses now the new timeSeires() methods. * R/methods-as.R: new implementation of as.timeSeries.data.frame. Should has the same features as the previous implementation. * R/daily.R, R/methods-dim.R: improved handling of colnames and unit. functions like var() should now returns with the appropriate colnames. * R/AllClass.R, R/AllGeneric.R, R/timeSeries.R, man/timeSeries.Rd: timeSeries() is now a generic function with methods. timeSeries() should now take advantage of new implementation of timeDate() and should be faster in creating new timeSeries objects. * R/methods-subset.R: added $,timeSeries method with auto-completion of column names * NAMESPACE, R/methods-dim.R: added name,timeSeries method which return the column names 2009-02-04 chalabi * ChangeLog: * inst/NEWS: * DESCRIPTION: updated version number 2009-01-29 chalabi * R/methods-aggregate.R, man/methods-aggregate.Rd: improved aggregate,timeSeries-method 2009-01-28 chalabi * R/methods-plot.R: small changed in plot,timeSeries to avoid warning when dealing with signal series * R/methods-subset.R: timeSeries()[''] now returns a nuermic(NA) instead of logical(NA) * inst/unitTests/runit.subset.R: added RUnit test with subsetting 2009-01-12 chalabi * man/apply.Rd: fixed warning with new Rd parser * R/AllClass.R: use getDataPart method * R/is.R: use getDataPart method * R/methods-as.R: change as.matrix to use the getDatPart method * R/methods-subset.R: improved speed of sub-setting and sub-assignment and fixed problem when sub-setting with character argument without comma. * R/methods-dim.R, R/methods-head.R, R/methods-show.R, R/methods-tail.R: faster method * R/methods-bind.R: fixed colnames problem with c,rbind * NAMESPACE, R/methods-DataPart.R: added getDataPart,timeSeries method 2009-01-11 wuertz * R/align.R: old align.R script removed * R/methods-align.R: align established as method filename renamed 2009-01-07 wuertz * NAMESPACE, R/align.R, inst/unitTests/runit.aggregate.R, inst/unitTests/runit.subset.R, man/methods-align.Rd: unit tests which failed from the change 2008 to 2009 repaired, function align added the same as .align.timeSeries and documented, added to namespace 2009-01-06 wuertz * R/methods-aggregate.R: example modified was not working for 2009 * R/methods-lag.R: example modified timeSeries/README.md0000755000176200001440000000331714436436525013665 0ustar liggesusers [![CRANStatusBadge](http://www.r-pkg.org/badges/version/timeSeries)](https://cran.r-project.org/package=timeSeries) [![CRAN RStudio mirror downloads](https://cranlogs.r-pkg.org/badges/timeSeries)](https://www.r-pkg.org/pkg/timeSeries) [![CRAN RStudio mirror downloads](https://cranlogs.r-pkg.org/badges/grand-total/timeSeries?color=blue)](https://r-pkg.org/pkg/timeSeries) The R package 'timeSeries' provides a time series class and tools for creation, import, manipulation, statistical and financial computations on time series. Package `timeSeries` is part of the Rmetrics suite of R packages and is developed on R-forge at [timeSeries](https://r-forge.r-project.org/scm/viewvc.php/pkg/timeSeries/?root=rmetrics). The root of Rmetrics is at [R-forge](https://r-forge.r-project.org/projects/rmetrics). # Installing timeSeries Install the [latest stable version](https://cran.r-project.org/package=timeSeries) of `timeSeries` from CRAN: install.packages("timeSeries") You can install the [development version](https://r-forge.r-project.org/scm/viewvc.php/pkg/timeSeries/?root=rmetrics) of `timeSeries` from R-forge: install.packages("timeSeries", repos = "http://R-Forge.R-project.org") To report bugs visit [Rmetrics](https://r-forge.r-project.org/projects/rmetrics/). # Documentation You can view the documentation of `timeSeries` at [timeSeriesDoc](https://geobosh.github.io/timeSeriesDoc/) (an web site produce with pkgdown) or download the [reference manual](https://cran.r-project.org/package=timeSeries/timeSeries.pdf) of the latest release from CRAN. There is also a large [vignette on plots](https://cran.r-project.org/package=timeSeries/vignettes/timeSeriesPlot.pdf). timeSeries/data/0000755000176200001440000000000014321613600013270 5ustar liggesuserstimeSeries/data/MSFT.rda0000755000176200001440000001172614263246021014547 0ustar liggesusers[y|EC`#("DAB@}D I $; ("*(A>tՍ ̷~1ێikٚښFlk?ؚڄQ&:ݿQR!AzAwSStFF|_d?'uyx lq\F&4)WRIA^>6Sgf,ٚcq|F9zSKhwq=܌_au]<̋];z&BS&0 Ql&Ǹ8:fs\.J7R=A:ˈvݯ~{c~WW_^2.~=*:Έ~wuоCnՔ{S㸘'u7SMM磒yqOv{.*7rH}wKܯvK}{ne=vFѶfFr2ɼB]Ͱ9'^~ )oO pxٌq}%mӮp$;o ?~@*'!ltE so\b<1=z3nxf'Fq78q|q?9HM~hTs^?F Mx3F_?ߌZ ovVq38?n}|f|Bi[yb|+|e؇g%+I<=w6"~v;,p8'7 ;_YIo~ǔ#̛uӏ砋~< ]_ӏ3 U%&0O_"pRZ?y9Cyh&W^~;ʟGXgymr @e+!uP^}/8'.t>y*O[2/êկu(HQ':^u>yZ:;^ޝR9%Ƿ6q KC]aM3_|3۵rOJ8AI\2XK3QS=~'p>Nu wKF?O/yDi[MѸ7(_4;R^RMAѪ[w%Ѵ{G>|a9/zq8ת9}US7 uGzJ㺩yNyXxYy[?o黉A}'XO~8 6GGSf?"CϪ?GQ~d~#`q̋}!dwO3YGҟ̏U6W&+OWEԧ{73QxΛ_:z>ާx Wq<} %`jL%rY:">]{O:Y2V}#bse3.{0;۽Sw2~{%׺1z7}x_?uo /!nKEG~໡ikf*V)n1 4#xgzp +<Ͷ߂`ƫ Ggj5=_y_y~[S`?띝47/ yYTާL&g_uUNOd}~&O=NjOs d7ux2_l@W Cw^`{aы-?_~)5ee/mG`!&Sv|PY}~^!OHm}m2yiE_QUdOIDWbKү2@v y3O[E[4DpUJ$5Fɸ=2^a&䫨Py(dC7_}0{e<q"~e%Co5WTkEM --i/ܛ+z_ijwW~Mu|Ku_K³D.J+X_jϻe>so7UO>wn+ڌ]_aXU_%^rȜ8?I'EmkE.='mDpeEgI{?ܜn;E}a-^u|Vܫ|-y){Hn_yW,,h5]Kc-NmlX^9֥`=нW/\҆= Y߲ /bE/t3AXߝ$_c.,xث @<8E8Ἄ7$yɞ1\䜸~_t|:bs-ddxc6=Ee!g^6SmJ .Xm`)Ez,?\n;nTYXmggG׼7W܄q~/g8-ol"2j?ChGOW]S+Oa_wdf~[eP9Q[E5뜰o?sg` Iy"SG٨㒷J{Y*Ci.Sߒ#QolW]S.ofNNj=Kɾ7p&L?.kiKoiwGiϓFg&Si9:=5{zr6)Y)iaBL]IGq62OUC?}W!3eg|ݿ ?s7@?>_?~-AJKa0>h{PAalzzЛKb-V@om>f m(sˁpQߕ;cpa_)5;ޭn/Cv[E{z {`d]v}ܟ׿3܃󀿥7췾 98!7׷o@:큿|~OS<}Bt<$` #5cqM~ |"Y f\ tot_O}@g]L~TG>ou)8c}|ǝ~<10##?r z2>;'>y>'~J @Oz! k) \z߄}3g>sY`Y^s6?`c? '`/^x'¯/x~l.7_kOp~&dew*n.p*EQ\(X-/}zhk_ OC_ᆾ,+*C_kfpگa_29 h&ೠ,xE'$C0Q_afBvK~/WW@a~kDpg7n*[`~o/~CߏkupM(_ յ`L ~3~o[Cmӈ[NI9=)̰QںCLgr >%mDrZV̈"3'Ϝ ]!u/CHKחHc9FIYIL _hl#dd&Gt8*ezr)ə&Oʊ~r )-+)|!ΰ6eHBn5]I%MQzmPeS`n~1timeSeries/data/LPP2005REC.rda0000755000176200001440000006540114263246021015271 0ustar liggesuserse\U?tH(9@P *b'!((* a﹟\kwskk >,$IHHHnۺl )vLR\\B[t= :j0고OAXwoz҇鮆 uBy~-s*z7dB<#T-9'&oAzVIj־+Ua@֔0 vG9TapMi3ᑓ $wց${Q1]:4wR? Z{LwGуAҨ^x# Ela zL^AXr4~پl/n]ywq'N cG&\`;z0X;X:/{]S :efl TYؒ$wE~({&[ U~TpC ' d^J<~)MP~uH q@KjWEo IN`p?+K'~t6(vE= w<@ͅCB;0bC9[.h-%yw{$)\SbU4!VUS4/ t&}i˥[O;Q7tg}[#9~UMk0d\v2F uz ڼIyE}D2FЏo;5owlx3p'Qk2QsN*;q閏E&EyaB\Ҿܟ۸Q+Wf3ɋuO~pퟯX2Yvm4`D̯3G>CzQ;OU-wbL3E=Rrh&/3#F%}hk&irk C>Y3&6,>U];rZ_bnlNMeApkn ~khmzNc ?3^P*ʸv S dыωdp*_|qh`H~<ҝhbN1NLJ%}Ct 50IY͓Dwuw dNr%lcY| t~|s L$p*o]N62QG;Pj\/tlj|@yͬv`ݢy=ӏ;0XhAt笞z 6U1T,ݠE.?#iL<uWAsN{t7ZϺ`L RFTMzq,ҟN-@XWB;U=YT6G֮}n]ϏGv /uϟn±ZTϦG{Nz/Y=lg;yi\DVi91tXc|/Oyokҗqxxt3yPZeWL(2V~:X -YstKbI0Fûhq|he=~c`4 oPw1|Ni5{t"\K PgD_+UǴ/ރŒPm߾?ҹyjy TL>ӶmihnwNU1;ECGG:pL;mt <9|GY8A~ڍauB(+'~śQ,0@H7~,?:ƈV\iؼ]2h{+^g!;[ j3oDyam6zE/Z[~4ܓҬA'\8 o3 8vLuIK;EȦ[UZc4LhC\~COVg'n)yz7FGXPͪәEϳQdMEFH'}v_ 3 YyQa6B4( |QF\z`먕YrKTͨsxw7Jg^ǣE_CE8`"=gA^r)d[تnoD;:z-Omʘ9x\_'+aa6|)(q |: I_HMD̜!^{#bP%W_BI}-FF}LL~AtSX>w˩;)G ʧzN3ܻ᭖R{1aɞYaLs?OcØuR ͻ.`~ʷi? Y&p뺯ưfc8H18Sr"S7GVfli+{KփɻlWB rf|qдWAg9tg"?= n |7'W:{|FraE:X~BuR;)mr݀d4d=Ʈ`fCKv?ɓeOefQ֜l:`MU BҒDQ>4ǸM}'EivxĐz=t*|Kԇ⶙97MeeWG yp4{xíD;?cϼ!߅b|2Ҿ^ͫJ/=diך_c? 6TN5+>OQm{=F^ƨ< oqLU8>ӤVbmuߑ '7FqM"[>I׿4Тw[w%I:DV]-T{{+%_@QlRmB̬V y|Nh069]UuAqz7wppW/As?أ.B*sfNHh~-i,޸IK̋^_z:M۾rJ&u!z:uE!f?K/L/ X\7Eoֺb [,#.H<-(C_2ǂi%30],)(BbN%8zS̎z&Ӧ7@IÑ\'U97!8"*'O=[m;1*(Sv>BH6H. |N/tڣą7෠l{G2|+"_y只"2Ўr"]n5^WBL٫W.럌kqcC'j)}m/Y{[ rSEgrXzHu!tp,0z+ m0N`5SLSJnlS\j볼cijtvw~/bLx1> Qkœ/yW6(c!d9U&>}];byv 74@1 uv %:(SC| S:~8D Yʶjk^C D'>B8~0yUDpϳ&ߙ@ʸ-ɻܧW~zdf'  `̋f#ڱ}ҥHjC[󴫫K.ǜ/Wt 8ll5# = j_1B>\/=Z4ZK]L+Cfgj;l \Y۟ssQ6PB",P]lVƓ1_ЀCw |uCH8#=yZ=&ľm{ έ2{& eY*= xZY MFZ: tfǠoaշѺ!̋ 4C7ڨS<ߚ̋Uz E8%]?yA{@z:YϦ1u˽*V>E`n+Rdw /9{l,@8_2ɢ>}G_˱)k5w#dyLE:1 j?mcl-\Ks!*b 'ӟبEݥ$3@F(mbXʣ2"vMt2 ުk8WЕK>=]s-UqAQ_{w cرfarhdE^ZDt0,Z2nApzqIt1X^KeeDEa\ X9&^;}vNt+hvr: ^g7ZZ∘k = hI,5,5_f*{F,ӿb?;UحuE`P2hzc bQ1,)W j\N@mߡ֠}Oɚj;DF vr%ۀzJ] !}7J3M{{׮*C/pX/SGHbj,?5GD#.cM݊E-oU$t 5?dGpBe}z   MC$cq;9|ag :KvRߎ4^@Vs}4|r'x{~ܵ;R]Ͻ O”)PlDyrN̡N sb*[g܅~hOZҟV}wroBpYϕ-n ArCOpׯxN,zĦVh~[P)X1\ s;]ŽWR{Da˞&M>4{9,uǣ~4MꡞchSrq[ ZYSQs|ΕU؞8_}a־JE*(^Ɛ 3+&vuhS<=VRګPսw-!@^`K1WG)^*t4^`MxLj0p*Q!UKķ;缡zi JL6QKﱡ+>v}W6l$U>y 5`&O15֪#UݾïwФ7][_فq&@!׍:vn~Yк(n(7<G5mKh_?zX ,JB{zI"@+%%ѺC%* ~@ :QqX2ԉMKI rBFsb=\7:1VEkPm#J1&а7/ƈa$G3hmTc u]H  oQpC]4 re4^%1gͯtnc4HG0lTZT^:!< -ͭDn׳AOv]{^_&|j+Bw:t2-i4tl~4U- `0L|.m@}wg%TUEs_-=19F-0ÂΙT{A}BN ɖB"h}3գoHfݣF#ʝ ۲LF3zD٣pxt1Md+Um9 PeZ>iYE2|7f!Ə %.Ġ2I" ğUǺ̷`t@Ҹuһi!q”`{pPف_{^тψ\@wä4Qzy׬;N#6ahu%s681N$X`hB=gz~هj%ߏEC+f?kR}r.i=BB {nVn=xF76QZེPʂV.E/;e)fv9>P;vQBkG'ɻ'P[_ qH|HB_y<3>+11W@F*ց [bdw`eۏy>`%&Az֒e17)HJ]t;Skq/ҹ}fO56%(yh)hUɽm@ ;yT=.hI<']8{/| F,D&Rt`| Ww51^=O!PػY1I-97!E i%tϟ;`wr<;"o_ ԋph5t}Kt(|[| e^}EztTGȐỘw䶷2D^s^M@D~}{a;U^>J>ǾtkSPm=nrgTFs _cgg2|e8GV>YP_h%'u::(/g߲ 2#[/<4}ύso+ bn>.m82fV] Qs3pBw@g!t>^F jч 6$YM}Ԭ:, Ϻ!7rt.mڪ/Zj~v&i\Vugz@fVLt<+ЭF 7 m=#3пr8 ׊.KX)tW:{;g0Z(4l׊M’|t7t9*[n_8 3kɇ#m6$#icrP^w>ܫn%Й3)bp2ͯB?8hVG~lV=t2qQ^ùك̠<ό#_DLjHvVu:*{3XTKϟWm[[<_ЎӨeB7y%WhNn-/nVsɫۮLy)cV]"EwU߂)2E4SyNg@3vO88jЂ`BxzdxQEd:ZWyZp8e_#ՔA_J1#Cm{7eo롐A|dOerX%suʖ|3EGTЅ4߷mK=Z4.Ui*߲(b(Wtԉ;): ʏBoweu0N+# EN* -oT봏 OY;! O=JC G|tғ:ϳ\"qfh"XLsJ ]M> 0^ Zgy|Dz( }&vSYU sDg?}maG=eu}bA |]JsXU=B]3В^Ե;h#xr.m)B0累IA9}H 0vTuNxpVo.X֜Z8S<γw\)wQ6{xV|a`@ouБ A@Pԭ3|EFZKVH-YxZ{)R3$eb0h>2 c N"hQE J ʂʋkVe︦'Z< *K~TNܪ>i1ԐS3u3 ,%њZ}sV gB/vΥQ>Z~m}g^QQmOf d%@>[AXh>? l'"#ױI4{ ݶ=M)cݪ}a@1as\@[Gr.O硿`-i"hzwvWT-L6HENQfUa }!Q ]8ϷGPn:Zт!;xpl'\O7=rͻ}C"y{G)Q):YcKp341N ?ɲQuثψs>w;`u_EFbGe|^9|jN])( E |U? mg--H4dK|}*5X8̕w;|=r*+h>N}3NEYWj\nO>mf]Y#I=)ַJr w.qҟΖAv1Cy-H&)V Lujp165iJ( eW5^wJ]rB;3%4] Z;m#ĪHTI).Yʈݸ .g ֳ<^gjycڵsҭشD# vfNԶX&[ۥvW:ۃ38݋ݗzd _V{#s|?y{|Ijot7s$iP>RdCfg`܏3J`=~>L{Fibcchf9g~""scSʣgn)l>Vbc#,h+_{xUoѭLb/D*D O;Yl?}/Q=4Rs:xp ,=vk)f-sGcxU!?\M#hW!5Pʜ]%$n~I^_ފ)h/O¨ #'}U]8sY WHaY~8v9⋾m2*Rs5HtdM*s-G #yWqZHmjZ!5 O?$ڍ' %w1T0rded&/Eeو1ƥ ~_S>s>q7)l긜\Vn.~)̌~Џ] DK/εRô {ʮӧ|OE T{<:i>?8LJOBzDkGߝLЅ`,R/ xv$CPǗ)P[;R;Xv3³uJ!;-ƸRF_ x)A޼8Џdg\έ,=Q]iwF1PՎ9x'g}G^a.6zU= 4?y*ިթJσѢaO鯃X1VNES~yK3{!{vύ]됤حԋΦ37?ABZ#t9Z1AoFz_r[Kn,sc", t?3"wn?_s1wÎܴr >/x<{ӞQM>C v{.45gd;#xY H>|)iONALVGn;ې ^/k %1̻\oQDWI3 kXd:)-]o$cOͰ&t).q~^KiC3#KMW -ڕY$/ATƕ;NBf',H =`|')g~L[wNVkJH>?*HO"o@^~syau_)K\L_!Tt$7 ^,YYns+Yz+Ç46 ;hi6[8^GZP6j8U/.U=vܩkU% me ҿeJ1LJIJU=H?t[3bH?ܩv:v=::J52(kۺXt.aF`9Ms )ӻf*:N@h>l,@Fw㆟n;j)x1B? 'vIslv.49ft" 3w^1/D%만v=[X0XUznQazL ~+_+.A0Q+@n`ldǃjqjt?؞5]<ɘbtC0- Cރk)F(~CJ3Y[|D7Nu :K؆ :yB|ࢡw9&nzοk!n)=di`? 3kk``(D{RM\{7NՁwoz Ko#^3ւX /?~6F>gTfZt4xu` ~Y0]o/\02]+iѫ0_GKG'͝4o  DdA+\(E[jm~ϡ^dEnČYckǐ)q?0'j/^*7ـ/IGK՚vH?0SrƂKo JMR³C|JTЊ+ש1XF"xl9^qq֣ y-(ORQz^u/*_7MTuz$5QCHw^2FEyk6Uy t{Zv`MfSFixqQaZE&?-L])HG XU6i/|@6ڛ2svY3?LFэAG%vb꒐!0_XI UV˘i.dH k|#u0ÓjB*$L& 7 |Xإ: [4oCʰ28l/+Oޕ}1 $ ^J~BTe%=3r;St./d<,{n5^=}]aE=sR,/,2g?E7$P~Jʫ Ðk+m6pLE[dbC)x'u x"O;\9B?Ok}1-@{I{Oڥ}i70%iILpG,3 jbz~}Ldb+gb:ܰa2+xFRv(DJڭga'=*F-9 ; z qie׼3cT#qף옒 ņĝ1/1,Cھ4ՋSunE>x7ɼ?qNK4eCg fUH*٪^׼]?3X ]uZ&~@}w*̈́K?=7e8l7e{DMチmj+ܼ_zRyH`u2a{I “ӣ\hs) FjEó+oqr$&@$o@jwʘ|A䋭Q޼~5D~!8S~Ig"ssu#ցy %*ߤ QKZb̅z߄k]ֺO^ VԀ7[}+ɰޏKh 2ڤF#fR+~z̬H_@⢉!\;+n͝F} {ѧ鳏 nϏ2 ˣmZ'|΀Ȃ֧ak;hchҒ{H^w Vin>7P{ ?ZꈓY9Kc wy&Lb%;3z/glYWJߚ;*-~2J,,.ϗ'jd_玧v|/!N g1擾j|t-Z˯q~~ ;^og&'UBa%o1CAC8e֋4 ×6lw -QnS q*1_XѴo4sgoe>[(]&[BveL!U-Lk9+WqB7,%;q?:YQA{˭'FsjеMfF?}93͙QW?R _G:Qr`,?=x=]sSujpUB{*DgdB:<}45X6aPź)>$0sAi1Eɏ[$ڂAJ@L8zqXƑޏj h4(l\LQߚfb\z,o 7+3lmߖM7nي+iE.z)Z7 iҁ39W\g{ B^a:hm؂8X4e2Ideu߸ 5__ h!!`}*8 /(R>.}\Yu2fSGn~vVYTu gfȌ_p-X}^V@CO 87.̟B[܇w^慽^`jAw7jiBi=x\C{qb( QEed+ZB_y4:|X:Dˏ.#R7 31qR tԞ3V[C&`I-0 { 4'Nb?;Uz.ǀߠV4|TdmG3/gMz^+&V.;Jг6oѳ7 fwjs*t?:mE'_ԶC˒2/CgϘ+~aWћ>dt Scb)j]PsA7fpGĠ28K-}iINEd#d?CSLwYe9!@\zwfȣ))4\i24]NI/ŵ`6k RfO\*T/B댻'r!-DG2< 7%oZԝZCڟlw\'/ǞZc1>svpLvf0~d_VOvB_Zc27LCn7T^vc;8r ]2p^è1(>/ 7;;A] %Շϫ>D;W#,A&vAatv~fAO A!7oYjtP7{{@GK j:\ 1!d4<0}o?K7>h(.E!o;{¦Z}"h|1tڇ3K]rk-sL5Ô7geiDOdM:Wՠ.S@J`YM^z 9}x0#)^ۀI_nx{z5PGfz*!e\ R'NBO<e cs!Rmco䫁33 E)(U7iZ#shC󟎝`3G\K3.8u}C{z;%BWߌޭ8oJM7+)A㢆 4ԝjo'٧` T۾j|P8 RfEsaLBϔE׺+`/#a 9ݞ-K>2A6r>_}A9/K}zP ^ܞ'^5j} >tㅽQ|ߪ/Z:^{"FF-|rv7c=M?&THY8P |˸uh5/vx 5&^yB Ӊu= #rVMJ r 렁A8^Z|COj%~+ CIs k(ptg n}C}%ѦMoz$i;;o-eP}` #ƫԙ>6qqcPYz7$ہv?l0a(@?zf5ai{1tI&wliВ8cG!6vxolŭ:CA'9!D7P*K qy545 '||{=?&Fohi;m-܌T|;EBpWi)QtV(su~)_v=wiaܚ N9 fIVmv? OIۑC+O@CfUdCIF\ gTNDkW;;N]Гڒ9 dR?fיɅjY(A&p џOr0<hkD^]ӈʲH]0w}/CP~15pA=OwcsXF V;&@́t1 I?<vCŎ7nr:p'Ds+Q7֧.k$8[|U!J 4uwOXIAX}Fe*S,Bs0PA.ڏ,`=*~ j8g(jJ ^qpoYsۦͭ0{?M9tIR鯺Ws" zon qu4?N_ă|u_HOkb#[*W J^P54x9P6MaƄs,`oTbg)٠% Aj^jeЖ=D;o0y!(9V|ߘ%˻FO%QD܇_dFm(BKkM=ѬF3|iY gN&'ÔC& ^{@/IDuW *#l ]~)sG9х߃Vj{L~aog#/a ʯ_bV)dzr쩝Y0H1 էrc栬5DIhKŦR&okatCiK n~aJ$no} ֧߀=hYb٬NPmP1%FFgZݶS0TxSfL i1gn局^gg5']$a谔;f ӥ|^$DϦ:wjznC.,Z?TSэ^щpTlh͕&Fҥ9`EҮݕnB<а£O rh> S[EnlO 0Y^~ Cw>#"0iiE44KVTv\ΧtN|Hi iZPG{ZPr@_,_eA&#lN<,Z}4j@p媴&9]lpAl\ ^GWdL9^0N~i$+2d jy ᑊVtT yE ;1,WNT~},T' x;*0=6H{Jܵ8ۊg}/҄d0cM/ ~H&:D 5 xT+{ImCP5u`~ #-"\g!"2I{:p/U#K7{*zz˸UO $C>DIeyIB t/ -g'%d*^eNR-LࢯXU98m! ֧;o:j`T}r75m^U;Odnh6.r&|VP0W7nQYQOdem%_ %ɂ e3aºn]y R #WLfr$ɛAzn7"(/#_uO=qp(V\(:K;pA7ʲhlNzENG.g\}C btCT(yxQevP,(}Aw&*?CUxӧ(fT]y&VozBD޽{n?:Is2+TRuV/{OҙsOol m6ͽQȧ57]?g]!boF|/ɏFY{U4ofWB(M׌.0N8 Y]Cy XdxѺ0B_eQ`9GIqз֠]]uiXƮc) C+bϢzhOVړ4w}ڏ8ϞQh൏?:>c7u@z:Tzz90LJot*(SZ)y; ގfwNf){qiiZ)5^\u{%V1zș#nޖ-ޞ KWȿSi'}T{AO|;^A{9 BNǍ[E@j 8\X 7RUAu08X?JXP @M3v%3`Gn[W־N@lioJ .{0I\O|dVAdt.(nKBt&%4eܿ+? v=XcaUJ쭶kpFv2yt~_.f.btIց v{]s&<Na W?=z.M^+pOC~hvǰ}f瞂c(o|cy  } `8m8}]{ U;y!Pg*Ĵ.iD|`"ܔN*XXW{qIʐaVRtbixƧ@k1&[h|:T:X PkMf,覼gTpC(ݛhE:e\BdN`z$ KO1B_Ũ-`jX xl4q҄& c>,_ [eH9RWp|}z'0Fd]O k \3#ˀP;XQn=Y{iF l+A!c,`GnӀ+wh +6bN\rt=Qڤ U“yGAڵ/(jP .::v:}AѰk(^^<MTk]Xnm_i}yxU-FɎß!Su&Dxk.;b hܸSe(>@DG#:1]iS.osϾ^Gnvcě y5s& ZU_ .2_%ytK?'\ـwΐ^ҳzYw"Ft>o)J-xnkiQzIz1}Hfӄ. lp[y톱LNg/@"UW -KjG J?A94Z(t˟֖EZUupxjIݘ_XG\BX$"*>2@*$ !ֿ|_h kl`հFU5MbgmS@mg>mmr5k`{%`-dh/?,+[QGuegkW[zg~no7c${U ;†0zYHй8tBRY+ϛ}6] mmm'stt _1m7}AR^ʤ ߔCK 㐗[;)`sCjT\sjwtČs>} Z6V]2g @oJ|= }wD_r Z+M0ƚ5jB\Dc3"l`Q"JG4 TϛVr ai | Fln^hV-ڀby Tz|*B'FA0nm<ʈ,+~2߹Qr(S ~4sz@%Țw4&Fބcq౗5Vj]}n2KZC{9S ͢>ͧ#W!(xvCoc]/.Z ry;D~q&Hezy o%CrKQssl* 7}HZ좇# `#q-< t8QG]68>v(F#p=iתK ORuKS8ׄ˃Es lAnZn1p5)FG20y#RsM$pDmn@ޟߠo\tv~GaS#tSkT"W ~SG4{Oȧ &<=ӱ.~D>M30 ݄g$w~+wD>=ᙯ,6g$YϺFx6s³#<{ϾHxCs&<#9 y[{SF=S߫LWDDr_@ 5BsK;@<|4"< y ϗ@ Lx~"_p/ /Kx!N C,?OC>D''E^"3Z /ۈ| [K\"$ %/eAK'_K^2De /[Cx߄!5 /_Ixi+^QWRw%0"w »UwM"3»-1D#{'G$= Ex`{#7}|?$/#} Auޟo#|@+HN@{^!|6`+7>x!5!CD0C‡&|x5>GmG$|/G Qe"| c"|"|c GǍ>^ل@D~A'> O''>y)_J>{`>n tC4C#kmVm#=C#Zm$7<=:&UDh_[{GFnP{GDlmuo7 M,##L==k3:PୣvWC_sXEsGrIqI)J)JpI+?z{GW Eg(9K:d{Ѝ^+ytimeSeries/data/USDCHF.rda0000755000176200001440000053127014321613404014751 0ustar liggesusers7zXZi"6!X])TW"nRʟ#ߨaTYd{P2I++eؓ@^9iD9 X+bXʞ9 _@Zn8ƎBN> 2wGDw2H/_BF75LiB[|Ʉιp׈ * -so|Wm!/XPzk#1C)/𑒡|bjzN30D0$DvZ NHy_@W30pkZ+Ljτ(?޽8#'-@-h =eJ"!][<@$p4}൓ö(O;FyLԼ0ml˨:#l`ذ4;&!\B2ϳP%}D{u2솙Ɲ 7ۯSx+Ӯ =BӚ5pSLi7z$8a9)1؝nrot/Z_.*_n$?5UH:5y?GU^1U}ቨh6tA~<+)X޼[/hk٨x5M#Rgmd%"[ӑw0=N]y!. IXzIW _3y'Yߪ!ɸ C,hS-Gꐁvֳʆv,j hoAaidtYhfC^`P0)rɉquh5|Fn w^Uf̉0[@k4P&@%-7ńMX^pBVy_!y耜Isle^(Rˈ.yF0r)GJsӽb_f4Im%FZT>w Y\h A 9x#~pElԝU+ƨaޛԊԺv! ^?#^ְC?px"g6SwP7|WmmYN"@pC@tufeuz|SWr.l6"\8pT|XzXM͛G CY:ҷ#o&T"¿cՒR0fyY"|$|Ÿנ%An<%r,Xd_o pQߢ<b~K6mTq&G/`Iy[96sOi0_ {:[J"O4iF IQ\Q\XԈ6g36娈O*!iВ̜nL,CW̽hčetޟ}2RY 2R+G <$v,o?5wKTDβK^[ )1+iw6p/ZaȲktIl񪪆I'Q+4Y ̤@5AWJieWZ6%zKѳ*RFy zGIj`*.X,&Rqt,:dߩ'㳅f.2Kh(Б3fE0ԑX:B'M>O)i8ɸW:lOƉy=(qɛ( ( sg4Pduߩ):=(L, [F4ILo B")C\j'2|9!=8v]Yϧ4g~y,ߨ0Sl`{RFpc#GKݦ/Zsr2҄ `um0:3;I\Ip,A`Gn7L'N| t6,oGAɎ0Sh4OЩZ9EDZⴝ)Nm?fkq?UҨW 9їK/>Di-*YC% \cڡgR0Z1r(6aKjGQ>6K}mG1+F"FKjӯ gv<\U{U>H؏OVܼ{m)wx=YGnDB-ֺ'XbaaC}{{=C}snEe^v;"ˁVd#U 6 %hԈǎ zfnMJ{3!@ ٝ"8`)VUPW^.Y 𖼈5d#e3 &*T@W|)y4>1ze9l7_XwJF*lE+@6R-jcCn:sFyg >x2%OЈ,5䫘4׮`4(-4(*)u=+j9@1j.Cu;(wF֦0j7/4;)PE΄u KUNjB~U4jzEDo)0}J\޺[LRQϼ1ԙ#nQȒ%Yn,YtiOx٦ {q]sFXe*kLhꓩ~ӎ1ך1RYVMke?m٭V"oazp}GA4aw7׻SGL|Qg+y^49|18)>2rl;_ߘZ=|&a;"_@`CT_qa$w Se5°/¨TYzey zrM\<:ZBZcPF&hTbv~$KA^ LJ˕cxhUTd͵O̢>jNdP"'R{ 5n\N%,(:4*)( *5|t-xV~Nem0AQՂp9;H=bs=5taYz?'l |9cYTK71@s}~_]9ib#bdfJ{IsU)?|;H0ޥX jZ%);kC7C*AP. t-ځx<1٥.e've<4Ӽsw80ƫCuW"!Bu\X}!iR@ru &MU 2V~u%OSFKLU*vm2 #Y".l&h^E9/X:F K5ZҔ岦ü k \ov{|RpX6£@0MԕC_?DEQ:kjnk!~y 3 7X?tMkl4zEW~󹄐ck{^qO+hMgjQ1LjMP6s6w\~wSS׼~x ^&/!$pAsw  )V5( dEckԗ(1寗 KrϓT?OT)hi@ &OYNGVZ*sR}PN6pvPQ\gw-3Ϊܴ&Ee"4QV>dA{S/)3[{sNUN/[EPchy `tBM^M0cwʸ y/i)p#+ێNЭ7ҍP4:?[SkzkyȹL,tZ1\2_JczV1{yN#)c2VT-8ߦ u_ j\Zianu?;oba 'KA1/~u?h 6zsi$m$٦zjpP5>JG?BJ KpK1Rrz1SSeFٌWw;pTm3=A s}ԽG!YTo{[A {c1Uw,61 ˪fYpB?Wح5h/[cV-Xnf6޳g1zb/'*zn3Ά 1)5[%jƖzSO *7WK+:ٞtS@P6}4#II"I@xD}H'ǥIiuPmr"ddF_<*,+q?J(M,gzܗ(ꔊ' &ssKU4*)F]OgӑoVYGs^_O- \-TīCit`'55Egg6~M?IթءY=Rl.4.**.lNۍ0ei cv}{+4`E0m` _W&1Beh/o+7u07gjK`@2/ _*&M҈KՈqr݉JTg\Oxp2$*ǞczЗ" {TopN5WvL{yiJ-BO!]f_z$t2v1̕H^W*gmk uj F1b0ԭc \ΉK%tpi3Mɓ "抎DY*xt70 7qs ƞ1l[.'Pf>k/UF6KW|.{`ڮlj/_4E U.ORԅ&OKT1*ť8GhgwECŹ8!>ѱBJenEAt$1ڇ̈́t#7񶂟˝PFnYSަq`";rΪ {q );A1f"]02;ԠS.w[]YzUW5{vE &PɱUR;q?J"g)}dRCiJhz/@H2_ lND/o]bN=t_R('"0xAɦH挃jh8lW'/ܨg';%n9V +}`?ٳ^-!ED.$krw&5tZlc,"|3ٚ݇ 3'wINF+f$*D%+fe L–h%Θ7;{-blT˾u2ICw9@V\BF5q0-Yg`.h_`@uw`h_@O) z<V T8H%BT1Q5}'}0h \6HG"hu_{ iU;rD>̇ecRioze Gʼn˃dPrqR?  b:m|U2#_rS\J%錜4(xr_z'i˜9IiƘ󎃫^ٕ d5>Ώ:& i" y84lFAF^C]y R}}$m:u&]pR!$IĴM*D#w5Vp 0M>cBki={YicWt秖< L²%r2GN2)ˋT%8 }S!q)h BkʅX%s}[;bƟ JN:b_SW5ȟUyXQ~U=Unzu|oӂ,SP4܊,PXxH4}RAC|5f|EՉDNd(wM "#(|0ގ N.gYtzZk>pr/-RƔx=]knwŠo"3w fO&] ZB -=䅽hCE3gܧ7] R2G!TEĹ|E|Ǭ(﹭gQHtkHJc!z)d**V,YEo>wEg"|= .ƍ 媝|^ 4 l%7r<|Ǖ CWڮŠhi':cQSV|Hl=Ң:و7rGE/.>[b ҌDd8?ŏތHt>Ik(>ZJ~ Z@y-Axl O%yB® DM}/ZCe< $uh-羉DT]ΐL82⾳O1%nt$邉J0"-Ee.d5N )GZ6-XmBOLu_D3@w)}h7^\KCńl AoO P>ۆCf$ ,7w/HhQI_]&m.R\ FsX;Uxw qhdpYǂՐl\1 O镛T^BC%3z{(HQkeNCNVJ7yc//){l 9zcamaz`R[ rgкˉMt_'31ĬA2ȸ5& re$Ct{f9ŷԇ۾]l4\D]$ ֵ96TzEԌis9j%Ilt#{T(kW,RIw`z;DĹsm]}jB-n(fߣwH[G( P)h4|E@o ̈ѧt=꿊Vw]1>ɪ/,u^(8 u/\ 4Gj۱U>&.EZ s%&IUTcؘu֩'V}{(nje( 3Yb!#ird9i}ccQ +)o06i<o7 Es oSP+ꍸxx[˖so[|P/oeoݸ蚠- m})#:H0 NGᗰ7Nxuxf'D@: + -B6M'4 R_$~a&jraʈ M{{,Ǣ\й:~$"qbVDl ]]4zݯF﮼C_[PQٗ*y/hb4Ps<%?{FhcI7;H.+8 I- ܊.PJLQ% 2M'^u|[PU&/Qދi'CNTAt}.D<){`xb{؀T]H*\x̩Dm&ig1@ %$Ġ4`{E|G$pMJ\ y@zkrNJ@Vŝ"r7$' sEDR~w ,q}{r6:+p[iTUE4ч[Fv&/5>C݉fA.D=$P~a Ј5{Ԃ0E:ƁXHcLyUH[ᦍ^WɃǀ- 03&4ŒQKQje2f٫|bI!O[j К2R J(!7vݯjpWK|$!, 0'Y0U8 51]ƖE'Ȥ O E.ɉWݩw`|;|< t3=rД-AlDOvH,`[@c#?Z Zo,>m*?EͿ߾xbB +g^0|v'QN%'Kjh3t-7H,/Y]10`u!NZ%H)X#/rL׬OiͿ!paK(ƮZ~Vc?L>#;\|C6# .]Sh"JAL"0">R>g> KTNtuf*[]5N .#T8&yHi.M tc% 6+-9,qJ‰p^RVIftؼKeΚߚ؛ty٣ߜV@qCPk'o#Ύ; YVze%hK؇HpTUgDEu%7Z_KO#4`Y7>8;3l+^lb.p3fǓBҰ5R5#pTD#Wܕtf#]ݒBIQzb# a:.$ԋ,so=vghXcԿCQ*" C^$MǺ`siP]| Ҍ?_kBG& W=2lU沉=ݨĊXXW-f!?c$ ka vE0C+ydS$ogLIǂg`ºSH %T ^%;oY;;\G+ם y8>Fb&Te.i[_\_-%a )&'gac4 ߓR(wR~CTp'7͆sSچICᆪPp0H]_:S+{tPhIy;raי񰷹uo8d91}/pPfMM#z4QVWA *Y MFK@^Q^iօH@\@ 丞!>RZafzs6)N* 9{_e0k.&k^=w&xbl2VMlyc~0Ts69S9)%9Z2v2$(޶ =t#o WXX}?崸 !nWBMKah>_$n\ŎĢu4LVRDMg颣i2}=.ZI{B#d~wY'!tG9w2JԔLH}eUA-0[me5,lHVUr_ATB ~mZoVMq 7Hu8T"F=grgQ8`L ȪI7]f͟jnA5WiC뀈)S|JeW#Yޠ 15͒ 񃳌,"إҵN_d6'{nl4#қvk E`+%ǣ2I s07uջ 1zN%-Kve\7O =mcC9G?#SSxk?W߱aʊpWLʱKv$݄t}Fltآ/⎈!$b~KSbԵMM- mofBLe;]gL\U{8m˻mC;S0#?f"Z=tI=!lT.1B ' Ή g1'6ɛHQ]ɪq֝ON~*MI ZV"0Bm6 Y WO%ն +4P˞ᓾe*\1,'C;j: ~O@@%AY0ɻ"7~ԶP iIfD4У)0H䉇5%gz<*sjXruv+9kM*(D.50)G% 8H[o*c]PcHY=r g:oy]'p ~ :WI-6&%˻ǠPnO!itGrI|ࠅNxZИ4r̅'Chy尧$'#IvY#d7n`v6u ݱ"s@8 b\8mZ K8![E<J[HS2J6扗™*c;[/p2{3.GD9iH 'kqm ͭy~iz I*̽s[?W!D2R{I0{kmH@~e+ wv?E)]ϻ^[@*є06fyxy:\(d>3DPKv^uJ[MuDwݰ/rG˽A@xnP尽i 16ئm eoPrɝ@vF9Bvګ\ڬYJEqsGs$[!˝I.łGV>`WGYXNc¶aoNS $1¬Eyymەu1!W`P !U0SQgp[g&X&Js9"U}Tj[ʴIbh4j'׏!&!N@2<~nV L$Qhl. |;:\J)[hxP .VMŽqa2%7Hd^ke5MNowZkL d"1&xz.;2>8 ?ڂ8a:]}Te9Vm܎ Q@F+n e) "Գ\8ZL*e(gH<p HoER8}ؽjZtG~ȥN MU[OfmLlyrnD-lHgg,f/8-<6#QUC@Y+-tHaȍqsZnIN,i&: ͜hʯI9.ve\c%pWM\'ſfUg*٦mI`qzi*RjpZ6tZn/~p~79aɆ?|SܭU4#:fFM{Ss8I  my&vP,UbĪ= c̐ޠVSad>;:-=[Et뷑=[}knd/*"LL*H 4*?LB>ABR6K Xp5ΫM3tUo"՞"fD>.[t:N>[0ӆk!,-FM#KyɄhVߞ D56K|iY;;$h h_uz]_t:zyMu)UFL\xAIİwClv7$lQTޥFr6pkDe<<)6fK댞P:_FVʢȝs] &C1 I Q߫Fv<؊P|`Sc oA^{xStӵn(WաE_}s] iO[=ܚфoxv  FfoBwN1so`@lCK:{=F[Di.Lu6xvR~ۡgZ3xj4;%땣֖gJǾ<.+~G/cN $gbPK:[`RzϧBt|S>!{3z0Xlsc{BH7[vfUYo$dj˻﨏!^ܻmr| [yz{gU  7Jqȟ?#-a+x %<΋SlfXflԳYJ7$"؁|9{?]X` 5 2>vsZ(z: 0C1W2.0^L 7HUlD\ˇ6Q~ReʎJt}zO \aꐒ %yB:EAq=9 y[ NdE?=jѻRP"? tYfNOB 2X8m`د:<)vWE(>M!QolRdX \ztQJTg],ˌ6ws?~PZrGMpδXp@h-ﬖ.; q5lIw4ltR>$s?5FxyM?rSoɭRzQhMRG RS4TH+8Tւ%uaUjunM!eX_#hefj}sUh%!D"Q=7TIMHAݱޘcTj$8) &`c 5!0 5n~ \E>ۉWdړ(%!Ȟ2S/vt1CB[bG]0j}頡 dRWqldeݣvva'`BrC:;ȯNsVL8{TאּrTf{\8:#U.jYuZVoeH$ r5$Bk݋bjfA :g (A!bMvnfKޙω)8Nu y$u"íHx T򾔉t-O;8NZG9_{ L%0r[HQgF(0?ROFyjΣ# tIqZ}z@&76,ca /"%4bխxg]D## `%qp1( i 6o:_o#1sBe3A%OLN;´o$=WWX;&<\ZN0]?"n{Ȯ&XrXQ&?¥(ɼR3Sx(#k mNIjIv@r;FМx]3qǔrOU8N%$FDwZ(;M{ cTUY-%Ba!nC޾gɷmHzkTr1} @4 q Ni$8hMD+̾:n TXEZĺYzmǔCn=ʝEQ8tڬCfyVT_'Bc2|թhǑXlxf~þm%lIl`g&;Ӵ(_Im"qIIMr(1 mճ,'pƽ9a1Z0#ܗ8Zցhݠ-aR:o-~S ݂AvKFr)(:ka sث"^f sY c@c5)Pq{N9ۦXLVJcy[FYgZI^w9ʿCh-;f!p'$p>&" z t6]5|مtFM ;e6nNNq؆4Da\k- |^p1D?z85㇭$M\dOH{ƈu%KOkq*3b=ށ9:7ز ɾ!9뉧ysmV uMۮtDs*տu:jb)B^{lRjxʃ;RHV +ݹCfayRcr7m៮ЈtG{:vYdI=AD-|j ke|ޤ;TRy?I\ VH h:KfٸPE9 .-rF*z9TQzHt7Kn:.fJhJuˏ/3%S b4ISSue 2f 䕐#vx`Sٚ%L xK5ۼmqE; 쒠O![t߆5lznvkbZw%0MO].sVuoZ/$Is A~_ޯ`*<1Ύ[_, oUi"O;$ϵ6U G4 \ ~pcr׹U3+0zq( ˣ$C6OLM+Yhp CxִpiuX:o4@k$ցݛ'{!W(/tb׮R7 E=mnG^* 38\|%%6i60!H$T K+#l'!2t:+L_1:'@EM"ɕ4=j$&kg˰!\5Z1Ts18Ї7Dq&jsC K@'?WT$v*0g o&BsL:!mu7qONpӬ!Ng{Z'za`k4*Yv{h,i` 60ZshJO%?U lg;8kDM<:#kW>B^k"ظ_&V- "l9 .SwxgKwz>N$RrS}4e%sdHuM2&mE=eCflsn vn{*h^;RG˟9iX>#*CWWdL( #,ϿTjvk^_uJ6v/@Cbr=b2GK"=l)+̬_^ UTb6Q1Roס#d7>xe%^;f +61xGhҬTڢeٓI#_e|TMV8^7-PE iM.^NFzzb^ͪ8We*Wv:x950s{4VF179 ˴|DW" oxݍ)zaN>hr FXLh㽔!N9O[2>]Zt  BUMtvɇ B j !sʳzwAj=AJoq lI qT2/~[]3U4ymĬ PNIG$SqoPX [ަ/{g@A+I ⍀0Y~Pp딒FYC?N(&|޿9 MS4ڊpYfaU-Bg5ZL8fy$:8H#E`*4;}zWG;_(>CqF{Gz R_ԳriGs8yy^5_bbfәuS{kn P=#nw{/p-LUh0q/e @]w^  xp W.S}SНˆˤH6?\W}ݠ14a4)#IE[u$ #"a K@м@zMF:m#a|!`kN-eݛw^D-ib;LSǣBHxa>bA|'$/ Ɣ(Fh̤jWhÂҎ! g0td@7bsp@@Ԭ93WռqR[Z@$:OVF$N4}> `]zmŅfX*"η, g*_'NJ`~s#>*~}j eC8vODm)?tE3wվvEM@gSLD­ W(._0O]e9Y1zCPA 2v]UR{nƇ?ɟ%ژ0n!][a*˓tr+zHGmq 1,oD3RȕG$5A D=NQ-{V@]|6&/'2e"l+U`5)דM8[60;8'C<}8,RƖF< w"jX^>mOE$g*[[馋c3=K34 mj pN n Fb s-f4׭9Z]c9#H.k5*1d۞.?7 .6]+2PCZ]=Nܤ.C~k2q`?wYىo]hz[|Τ+ÂӉD/pĞU=K5J̧hTH>jEwFKGI>llEFx[` iF m&㕐zSQ/}Zr10^B4ħ9bEn_|;@8e$7KSPyLn|MwpMD!f]ߥú =?MsŤi |?}TshstzH Ls&9&EEKR=/dc4w ʸó,lR(rgF۳ԩ H(n(qzW|!}ns; M lr 0撔z9G\ubJz^M]tأI7nyeONή%@WaSA8wA{9 Xpߓ1QL)Kv&]fFD GTh[2 "u[(9pp=5m`>+HG8F/ ӥu{īႛ:N}K+ )z,4ZSCV> HpГC=#NƍYH`c: !kԭǾ%940@).آAatk&hPwf0+g Ne{Bb JΒ?h4n>mG D}ܠiR\uK?@;beL<27-S:Je h<- 4eTa$ذosduBz,jo *T!L&-=p>Ѵ8.UFMXr/3 hOd ,۴( & j_GqL$wdd]H =o i‚H}]]'uF,2je 6kbu5[+@d"͙K3OD!eisz nP|٪퐥yC ~[ӵ8U'ƒ^ B̊ KsSbw%~^7;UrC7,U4F!6Q%g1sJ>FL#62{2)KGu!`2iֺLޖ3x4Z db t$]=lhi>QLT$j ;#(Y._1yrC6Ӂ3Hs+2YI(&|^pduߗϭԫۢO0]l ;/Qj8zfkgU{H.$ИwugAcW5QUȝTp6ʨ+eo pɲՑ)CbW{;:cEq7n ~"euiܰ1݇4jMԮwcAp|}cAcI6T[tv2.Ű]eQ=6sB”3m ^!Cd⧙H_Kv B]1/Ǜ.ͤaނ#n)ӪɊ#.9ܑ0 ?,o*O)^^Ԡ[u;St賸Xix!4LS-IT@C; ^ϵh~/ri5X;miS 7쉧6DV\k>}t(OЛ[S~AE6tOKF6:0wp;FZ0oHR_8 O]X\oWMڠ%ɖtZ2ʺ;huJܓV#{ܶ`dwĚ`"h,3ʫYS_:Ts=u%ĭFj8_+~kb'n.F@p}ԎBAT窤pJヰK^c͋BˠR Cn,$1 A8pG.6xp {l,bX@BH{ZJ}&R&0xwE)qlo+W*`j~l3ek?/E zS_6 i.2DPVE|}fޚP64sSSoth23p 79Ѻa x9&,Eus@.ÁrJO'8<;Hϟe8>@EmɇJt}aEK^?  7 YOu)U&!Pu5&却)Їuibeɯڌhc_ p VJXN/ںբNNCүV"S".dOW~6w~ iKU]Ht++'P;G6u1h-n}N (E(R͙Lo,TΥ$8o4R [:[zyFt2Dq.'X N8 dJi.fa2ihM՛ _*طnz7":dO%^3ҩUBe-A/tltɃ'=Km>Mިɞ tFTK<U)5pB/g(F\fJdښmĴnR(DyimOcbx`c =N`qpwL]EnmdC_? vA7;ci [.ذOT&XGvO6@X(fϤ\:~t+ [S(-԰~@[̬r==+P$!_(|,4e15Yh!= +)7Et L##A~daqMc51ȼ׆IꏏA2a(icrD=MG! Y\ѴۖR[ZTi2!Ѭ1>l e3H UAPغRpĪi6J$wRY9 saLY@ D[/8|& i=-m= M+>Rr#VHN?JW41{hYgi-ZFj>؋{!Wk@-ˆb=3RR^xFE!j8޽FaD炶"00gb5纗 L1WJҽN~˚ xow }ݎ½-D40ֺ;ufq]HrU^'j!l*1n8w$ge TsQ'nhv G"n{JG "w0X}{srVMzW)[S92""|ڶ]H&oƁLKr{P?yS3!T"GMp΀~L!m+"^ZQ B=~^#S͆T :شl!{W>ܰ [DAos s`wi+ ˳f}$qtPm+ Ҡx 4%OfTDlc)+ 4g" r1Sp~}0f7ge/`p]4nm8V3*؏J'⢇&Y8\O?5b>Ѧt`Zc m|$*cX`_[1mѭ /l[z&#.k?GLy"PcRjLՈm9E Cyke3:Qq+c[{JxVVCj+ns 2 l5ϕY|AdH4**O9$:;U{ƒA0)| {SSt$ҿTuZ fW?ι#UThı>_gfSg6$<\Y%#dkw7:Jb\ᮒ ӿ O׋# ?8&-kwSzʉL!WDGvwV[}p2kQ0a! 2)ۡmY|AAb+z诟4T0s |IVݟ֦= bȓnؠֶ~{~l7Vip xoJG 6y4sI'%$S߳6 n9A/)sF֔?&vJ^B%&iWHV- Ff@|_~[8꿟] '%C@5LO8,g&;61q]uB0ߦ`6 R_<erߡuA.N˜^|:N Al_zV٧n^PJ vYLjA_~h {RF#\ Q:Σ%i_:k |]BG SXp2Ԑ#XoP%o{*( |/~'Gy" :F_HN ^#>&mB5w˻ ӮݵcbqAF,/+u!~OƬCHǛ]I= {v6.Bd-x2ͣ[ _grA_7߄WK!dQ a"#A4u/ aeaP@ o IL~yтB.  [~$+b~IQ9aMMfcZspJ-bP̡4&UѶ@0G[$|IJӋ$ aƤHɭs1Or 1ʸ2D>OM1Ap3"䊱\(?~~CW FNCmyC>%9ѴR0e 0m P+Tm>_c.MO@SǩOSٷi"9c7it;(0)y*+b> 3~P0&t`af>F8 hݧO `AJG՞0!B|ک~T@5~>  h+Vo\>5IWz5NvpZ_4A%܈v q"ͩ٨_w:S$vYR mUK u}z$|7E?@BJzh0f@%a@rwzL>P7CE\ msy<;G6m,$Qjn~7e߃0?B*(oN/| &^[䦋9F]PGahi0T ֆ i%Dڟ ͠G{F,.ӆ6$i(v䅛z#pHKge^͗[͇X#4i~T _'+ ǡy,(;jķ>ԧXzݪ2n!_K1]n' R>ӧ@dC,|B٣K*ˆSO',& )jmVI {xڈ>zƚZLVEIʽ=j /C@h8z0ԏW6K.Fd6p"s%[ZsJzm;ۢוboRia-ҎdY`:jt!_,[ zbCĕ9voicu *kXY o;X`!r=ܩLR8= PhEDPҔ=JDӴSVe>Ԇ>ÝjV13w!"ĆPqwp_>lk8ݎ, j5qZwO-u&'J]ڿ/%}E0tSi{ Oٗ6-TmSǻD cUjp8pYOk53W<&95wh~6 KVg lQcU%$_B,5U#Fu7SSoD S)PΓ𰾮XFضyjNՎ'Í+qoWMDF6)KsHZ#t)QlCY- vL r _Vrvm 7љqOWm㥥(Ty 6KYK@UҧpeOFcѳ*E8E,{G{}wT>5s=gZ+S<0>_1wMm]^ۭ G'&*uUi)x+b@5|M}~Ѡj(G).P>š i4d;rԨ1(=Mo| EJjPr8;ꊝ ]9 iV,,nY4WC ğR0n:u0&[ Ő+РAW6}|(WϱZ>pl5 ߷\r쐵e4㏀*(ھӽrJS+qD)}}.nmg9`žT@ؼz| 9]EdqRkt7U,X|]Ewn [\8_|ؖp&@EF?C\Z=s|Ns @BzY4szS]F 9XH,&Bis8gUL׌΅FwJ~UASB%dZmyQ2Ar+}B%aA4C\P+rd>0 e$j W/_}M£1#eE~WއE2-I#"d;` s\_]nЪ6=K}chjkEs-k]7H9XYd@A#۰ #!Eae>'ݨf60"]fK/=v_"MCc:Rm;6@8OߘjQ7ڜg_p=Y[3bjƚ٪x4$^xqg/#.̳) =x`0fȝիW|1 Ft;tɊq?li5])M9/hS3380L,gxZ)piƚ1bZ 2ټEl `M ^d.ff 3.XrZ wt LS3=p,|̕lW^,_9C0|AƯ_n(vb_v smD69o5` I[P xXr,ݷ3YQl8h8&CpCQÔ랚 ҝ|ῐǹf.<ax0_rnl SL߇\?2o N؁]ܠOɺtvMV(6A~2T sғXr1›wTt=c4\`;dd(MғW_pZ[ĥq5nYLo{ѲsBp> (̹>|u$ot"9.҄@j6nBVTz1Ts/m-8`l;9S>:"usbDwv9<}{3g6A!a  jřu^s9}Ńe# DF*&ss'L՞ "⯥uY>XK*^0 5~֡(FژSYlQ,f;Ho}^CYА>X6!~2B Zċ $VG>m%Ş JsVQl]o烈g0FQQzY+| ;6n1]lfgQI_.yxTm)0nAҀ )D}Þ(Xm%iz&7ku>Av|{\K #m{Imd[FԸ4*M's-NZ@6\(93bN5CQ ,:6a9~9xR@4R9ٙ ~ɭox~ 3,d;~jN:4VƧp_ly̻ZY ì@p*-vt5XEJQoDFpst+8fJ\_AQgm5*}t`\Vd$Y~< @QG;`wF n,ѳ"9pg[sv \:N䆃2P>~M)m20x +4s*j6r%aVs@kg60֧5唝SZ&â Nϊa̹m j r΁f_ǐ.jhmC6lnҦbq{9|%:uK{>& _tuNuFgfM", 98Dk>ӱHl5n(5%VGGV0z1RT f>ԍd5Ή:c]9+BV-j5 gO 1".Tk?P}OaعC KHA@tSz ,5}H"dFl8#s㓪ٽ{Pht}p,룢ӽ4UrNAt _]\e,ՕCKwΫ>Пo2!>aNP#<ߜTu(&n:6se>!E "ŰE#Y#8u *bd`6zn)Tb0 ^{4j5C8~ijMP=v7᫉jo "L=Ya.x `ThkW m!(cn Lxo>ҷ8 8 ҧOW!6Ӌ4+6ˁүBW##PH4sbEfO>'/Y޴r˵* 8{srI6eɎLX:`mdk6牬JR :IˋO&NzV~H{dW32yUQv3f_0ؕX9 *S >_p"X~g [>.&'lGS}j%qO+-uYlqU2M &߄i8xShf<ʀ?"D  W+ܔ 5H&JbH'85uSӬ7)WgYaCzo~flA^b 3CK˨{#0l5z_ l>gd$07o=<*f$N4a݂p\"!c?l6鵪 TrH{VDM%TgՁ394aMx-5&|x:`ْ?*)b81;:)UƬt,veH1J_& 7 ,d[ V#\L.rA;ɨV%*v {3eĐsY*UF P9^ xYӳ-?u 1ƒV` [~/ڲ%cpaJGdžrE]8+H[~jq,ڸ#,Hܳc'c\7E B˅FU":(A\E r k$c}(pn0c]gv,j mO5I Ap>Y*g1\WF`#^w?civtCxb xg[mJ^7UALkLP3;$d\61R! ٤|*'_iK?Vld̀K&u; F!N Q]Q-#]z?gm(ظF+jMK,9䤈ͅ맾 ?og>Qp5W%l2]Mϑ|[ŏIcdQpS_dQwݒ[0e3(ryW͛j-(4Wт48Je)?6b 2snDIId#@)?:Ù?*AeSh {|rS-JO!jB_⣭yhL*S`o At#XX 塉2F^^A'h/¡QJ{h(gg6 *0ЅiGKa)xu.\y2w& JX *SȇGrN\3k*5fqۛ@:ysnEv#>(dm.KTdfpDq>v?KĈN4c@D|2~`|0Υ#nY;ʕ%T.|~dWͨ_]+PU|%55їH:Q:@fxA"?ԦdTϰ 6a8s,d>=f+mZl;Ѫ?vesu*Ĥ:s\b;!~}*Tc7y:Cr9 .XC5P}6OT|jgS[Bl!܋Gwݫ"$$6hAq9= 0 8"W Jt?]%=\OHҌU{%0X`axt}=h4'wD%܂š|uRPݭiրl $r>j(/\&+A,ݢE+}| pvA2ӻ be#,lM4W\^I S|f:04ClG/Xe}#H>%xy|d^c&Yq2JN]%O@Hc*rs0-fN9= Xul0 9,?,0P^LȻIrȁ,LS8K^R7[]3"43X]tܪ%*K;V3}XäĶy2"}E3aꅰ'|#EC@>ٍH42Gv}T(LH1S%v|77y \:S0';DqFy7 m*BBtcM ~:!O+=E@{r$C&1:i"ws*$O}et%JV2̘/V&lѹX|=C<똶uu/nN"}s<[9ѤViSj>nm2WQaiʒ +Dv`T8➦&[zvT c|Ŀ<nGfDT3tuddH ىj3lvޒn<`MG:<Dz7 N {ʁ^8M4p9ē1pq ~wYCz1'OnW NCk8kѧ'1OȷuŐ.ܛ߁ʖY~dL*g2]{ .>Ma2 P5:>䁶/_CB,Xij6y"N㚘 R(71{M3%~T֍OX GזÈC5scvsXK}Rg_ 2b>D 5]p3+v#zoգNJ~ᨴ*QYMNցp">Uk2 ǀWz> _i#]W<xV5h4Y}Q=xUTa_}iҥB'D[FU][# 5fC-yQ _廈{;TxFi\@ Bq"^/Bb7qm+ة;(1TAR,*}EޒBe(LWY=tQgrH.w]?{}U8Ö(fuRYrm:S/ZSlZ*mgX:8Q HMrR ÷4=.nYHz}+xz:1޵B*&kDPII뤣% ːD",~1#ZNN8JQaep: Ѯ hgUaąJgQ|Ϯ [>v|\T + 揧rT_Ň=c6%F*t45g*:!U^ 2P 'FsUK@S  uNg{3ql?9t"~#oI؝1f>ٻ/'>tv@JPtQaCzy'X_gd]a5Ƅy QN !ě:e`[i' zR|!f3c*!Y;vVpVOaVUr! \иRRR?-s$h@ гND"zml)! " cSDl TFO% C5΍–+@GApl`RVᎬ͇L_*L5 6S;t3lhi- pKZ{"^&u)nDݾu*K'~_}/4i$_'f꜂-W{r]A|.dոT oT3 VLl "ytL~̗ANׄ! tpmZ-'ӄ~C"}ľjxmdzZW)6 m3w̤p覈4B9*L5(SG>kPQSni& "ʔ/*૗éGKP".=kiIiSX198RNY2¹gA/)Â!1!+)fwNBiOFL%t4'B j]J5\ >m; WKlw/`3Gi@Y$Iou8IMx RҜE=dSgC=]p E'IDޥ#xg6M8I)Љ >ُS Q)`aPH++ yu%ukݦU=gk .[rl/p0Y҉$qק\ 2_A_4aҏ $¼Ὣ{>Ϫ;C65U@L3>9gɚVk; |:kŜcg Hߒ@Jd'?7DԻ#7.+LR/XO&i|_Y8Ov Rk( H #~3#lXts~D&H"<s5<&{/ۑ2񔪉YML٢nC?{mLVG`z={iC7u%0/},J KO.7\AI'7pz$oBTGAxsFgA}4g_/3`޵< Oߌ\|R;*\n)F "ˣTF)b.rV$,x O >N.-Զ8m0!bܜG%O@!0Ӳ7{Q0s.YnHLT+f*),`sSh6tBZ<  mo4's/ND\*.ְgsqh=odZ9H$l5#+?1~d=j("b_ou]tٌgc>tR۹a*c(HG9ۈpvD43[:(P^?".iňl@_R]iHQI]~q ʋU -m̸%dSb̠J4Pyʊ)#t)4m7.f,c/gQ/f0_zwk!ͦ0=6B ln]4)eQݏ^R8[F` 4>WB}xu-] C_I%O _kݮ"_HEtucӤJLxXu)RCQ1rQc+QU)#H4 Ei0pKޗhVٵ9!kj6tr?HáwY3mP .G2EN3vMM܁ek)vlCy>y>i#6j2“RdؒR_ ߕ~`_mӛ\wfD$)z.)[ޚ(1 [V!V( |GhtX,cz/.atCh8\0bL@},H'L_2p*w*4??{"R5^)B߿9fO~ۃ_m&PX4$67$,9u+{]1!mSdW1ș;@&u.!kZV&VƇnF HeFdEN6q?2woQίT}j)`Oui~s<׉#qxf!⹻ ˫pc @9oL nƒ}}{ȻUQJGf*oySǤߍue 9*"*kưcPg[GB雩VTNDMyLU1݆Ayu03Z6+RF:NHNF!BQ`Ut# kU=) dQ & 6<^Y[A"7Hhӕaպdܴ˂8=N@}{P:$WuzۘhXl;_)|vLL?wIl߇̄F]`uܷLo-r:3.<)/;?KV8b砒FS1-DoYI6g*]˩ڗF)>,VTAn.7ixu(Ne !f8^;/6|1n9vŐuQI!)KjuWVROW bBfyHF:NƂh:RI]mrp(Og.i%J;M+VӾL07f&"Q48q8 L)Ir~Q~+ŧvW#S ;e̠2=Q+Z}qLkocH r)Eqy)8w^3]4tlژחbU$F>%Iݞ9 gv^xLFkg~IG;.!饝וZ*3 # }gy଼(LQ_>9oȡ31NK=6u PW.!Mf+dC)nJPt"7ֺ %ߓ$Tc/THɿW4A6Iet,F&92;Ϲsnyx̃%l8i砀mĮdAT2!᪳瘟 p%3+e6a#rnνU t).k]U_PL.>)D]xNɪ ~LM%>lK ؉ҢJk tꕮE:oW~>܌$vM(JҬMEL?^4 ,Č@eVNA _oR7Ň [e37ய5~)16 B OWT‰EwvI-:pYy =|a̕Bu GyX}(K+=\*+;+z:xC#al WݗATNe]9s12A6!da W4qW76FU,%}hv^'yrl Kpg$<oMYnOg/F7-Ψ;(({{VOj@9o U嗔R'Td"o3w$YU|HoAzvXn0)B7U,&BNy$_+zQvrDBͿIhvV XU֚ VpaڦGt([PLrPE<w@'o5?ŴgOժ1gRђgXͲĮmIv95E.Y f((3+OڝaOY.U "]جzycX|k2%g~X.ͨ$ݔ\TQ seHU>|Mҿb++aZ"w(bb~>ifQPQlȃO_(Gi:4gމffiOoN-aH+ر Xd3~7 S1RYUcWY9z`OS5Nc$vtMHC1T^J;ɂS%4zU (m ,+cd J!>ixY+ƽγh t"d1ȟana;srNbBz)a& vi(z3b;&@i݂*IO7S+2昪$n(P^+8?!>PcT)\s:k"UܨVz{:߸P'QXYbP#uKǫ99oL+Wg\a*=V.hK~ug6BڦvY(gA;p8,߮u}x j5%}I{ޙ}uYG9y܅s^fe .zl"LfcijChK>GTpOD78x/fEPB|`n,y]N-T'j ׬K>.qف ,~%&”A;fH9hc)5fdt/ ~yCMas1"VфS+y\]:\1v/`0Aq mՠ8 V^XfzãDXGHZ}݁d7TAqQTU6=ūtmNM{JFѻƭ(np$Pi:|sC^j_Ɩݖ06۽tJT_D ۱ &XIHՋ׹iV2i坬eNhJh&p׸xj-'_7poZޤLŮi/rSD '2 ecr1b-`5~|tT49kL@bTYU~QSJBmJiL?nT'fo'mK* aCn O+ 8|*4FU3̰3umwwFNTII9J7 𿆔v/&]Cf#)VQɦOWTs`Cby.c҈(j"8 O9=׊L~hg yFDж0I^MC)ܱ̀/E '9ztN9 AQ׬p}f'_k%bq@1Fdӳ]:vTMh>%zQ|[c !MPʭuW?}ȗX"')I9IoiSrT93>.>''sl/'k-Y⩂A4'G Sk.(`''PJ8'Ug7:`'} JɈJR؂(u dQϴ<~ ),v2EG@9&[rn<|YJbma=Uvy­Pwp3_cMc ?&=-[MʉJrť ϭCg9oh?Dg@g4ڪa;w kKIE-]+g1, c@3*CRI,z@|@DE5*xw$!rB&/Ly-}`&Z)))3ޝ Qo<٪$hPA r˷5> LFxX&IQ%mkQ%zC%@QϻQ:b-+ΐ X,6WP fZlē9Ό'K*jsQa{3PeiNbHHb1Jq`)9zåkvb皍Gx@ ksudWLƻ(8cfn׿hELRsJ'ܮƧRkqWZ :ùq K-ߚ)Y{ b|A՜.?"5ωzfgI.ve'YSHP쿹xxo~Ct=۬|TX\m-Pʕ5H b&\-q%y2D'u!c iҭ8 XFV!ݱ|IKp\E' _Ӆ}bt_J*{t N Vyu^iW%MߋN fY\q|ށn#n1]O٭DW(;䊆/rjtwD %xM%zTh1uc7~pG^_ ?*4zrl/cPuoerSSg~Q-d%c`[|)ἩC3NY$K$*4UKR^>7Z t|)T'ﺜk,ç,h.{ .s,2UdLl$el2sXQT xAGW->[1Gq%8khh5*:PdX9vmjr\̄lBzsf?h+eƻ&=kl|ùNUZMig@v#0}WrSGDŬ04&}uDa ph.֨wQ!&~ 1f) 5Fq@c tb7LN'zkK LA)&=p_$5 ܿm]$ER$ClK4"O@K88Ϙvz:@ H>SE5nv{ q!1G-mz]\9yN^*pP>iV " лHs^j)+%Ilݬ܍ٶ P)3HSJf]^\<0e 6\F9.d 3{ԯXhr97[h;K mpiЀ9֧_ ĘeFCNGH**80OMW۾IV8_}<2x1;0ϪU`c>*['_Awj2T902CS Qt_Uȣ4%%= 6i݁X#s@ z֞lNИ߮~k6}6͜D(S>h_"QC֭Ƕ., :R^"֕)Kzz4\)yB;0unv,]dc0CRE)f3wmxq vYF9%>u0uaO e;{aZi&ɢG+|mZ|AL*T3Buh>Q fLM5XH-L܃ :I)&x( ok7N\(xJq=fgmn޷} kq6s78wƲ`t*8R2r [ m:MFE|CYAT]5OMUjkqB*^{M5"(B+~dnRlv-3-^ OPp1|ʨeK gň8fZ*-ˊdo%ZhXi o̗jZӫ2(qP?%~[w`䅄.Ӝd.R=xN pPms١.ŘFƿ T[iOlw7$;~7:V:U<@3>=:6}_82E-G67혻Ypr,#- }>B~JO‹[&OZ 9wiz0nHvBL8sqtdMnwX&Jsj1;Ŋit)yl5Y3gT ˧&$i悺0(}HʲuVGUd$w̗?oGi}_ohQ#9ֽs~K"Jr3rNq[0B>X +v):whғoEsk)0… h!M?-7(\B9pcM"E؇ϸGŢ؂>[<ƖI<*g:> f:ČF\b݀3)*wc}뇚`t2e sI{<,0q&CpjT,c@b*[9(e.G9r<]o?>3ϼ=h_>vt"Ҙ9B>ZvuYǶB@d+k\%Du_:ݥx7ђȱy \Q7z[IEVnsfNɧ>pQ,_  W̐)z^<3$Vv% f*]Oz=ƏIŪkdZMDg k퍟~yW>T@ )b]r&bn-RѦ؁Uc+nr}:h v*LV0( BE5T9f~5rD=%  N̑0LpM={Me#H1+X m&qC~AEg29$}gZi|,ֽ\;L`ԅ:Dª,ɜ׏"nȑӔwBoAeE C:`X~M (j]f,`GD(*8j=nWIʅ&n4 uuE.i^h;=+lW-$1K0H VͬO$ t@ѥ 6.$x L֛T} R.kZ"~|LU)U%;}9),S2Ւ#g0E1rF5/ҦVs xiS{=s(YjSjt0\Q {VՎ.';©.8 ;v%UUpr"|wCw}_.V [Pz{Jm =wB܅jxi"kT.ke^=E#h0rknh)1i/Enbd --B$yVrj[«K<5:C؎9&H^ZdK{ eMYѷ.ct[|T d^Z* xdjw*h:OCW!!{5fÃD_^UUYt1ujMOwOZ 240KqzbG wNqPbLdͽ:m6R < 忠@ ڽa(pk\dR@~cYB rDqxsxpU0s ̴=F4/);RBª\9pSAgYD>`R*RNKNr_z2*|0~-)g_%ޓ;Oqc 'T^k\HN?pK<\#1|$n0p+#̭#B݄ 睶 ljƠD 496{Gw~ޠ]jZ&&bmZ!ўuK2Z̜̐M۩`_&\~٥Jf.٘D*C "1\+8"NmH!UӋD Lk87Ӷ~[XFj5[Ps'n/-fG~ N} T U挊Ia< 7#h>n+ |ULXju4FˤgB(U@ 576L\45x:NWr:?e1řJq01.?$N!&"ϲ< zS }TKxu0q+RB4:4S19X>7!כƫ#'UK+y2Y$Siߌ:˖Z2An3# `(gV6`xD/ h>Y_$ M/ I謧BT&DSڃ{Zƛ}Mܬ} Զ.s)X_^`0iexY"E‰~y7 W yMҗ3YYGnP<,9 ps= Y2w\`͍'({f$S-i^sC#_sE&Asvخ⃮R`.Z˙~;Lk`,N~n\J:Q]'3v%R8? ]h\fC̭ 8(b/cU`z>;UU.)!XJcT{lp! 2uY!fvu5@VWBĚjՐ e0_O(yx9W'isvȟ2x7P>VHwL+Ǡh"1ԉJkÎ=Te%Vw&-R%>*5NƱF&elУD{lDi@@(aLg;F?r$! dz`?2kMeK!SIyH@0{u|[ ST2Zv.SMΥBVG$=ߎNɹq]^I=ڐ2>­GDy07>*~ =zQm9Djm_ KOW^83+79Oᖲ4@(qh# ]NinM#NC@e *w="p;mЫLC89O/tuX.x=벋ClT.H_']+aߝ귭8[}3` TjfzxWa󽼯< \kXIshNR2}I$sv)MD4v?2&IUZG:߈.6ΕW)]HwWbD_\K3.k\hG.@WlҢ[9 ల_tbH7lq8[3_R7CH|.9b1HH-Εn⒮Pm-P?Z%skv6YS|]`h|3̠xX IȈ1⯑i)ڂy uf[ BD$tپf&%znLtVEqYY>t eg>*T>4Еfʨ*#7 {7'۲ma5`;.tfMuB^li0X_kavr8tIZ8~ n7Br mG(,y~ !,.i ?^ ƕ6z,5;%K.D ^G~J.ڇ2wl_Zƃmub; ĿbyG^f dZiٴrmX%@jvI+BKЭl, nAp쟲/g~}F.lo׷^ JF2tsl?Fc+͐#WEp=DrN5ړMw XCo]t{5Mα,U8 ?`=뮕vg?+_M tuPFJ{A8;&.nZ~eM4-v Hw]hpMΖY|'-"#LFB%XQ}j+wz}WS2p P [u2/tO$ p#`e|׷=p*v'?$?SO]{`x0_zjq7Ru6s˺)00ڊ_9s"AM wFJ+% )lD%D#AlO?@"Qɧ'0i7BY:ɝo3J9TF@ۘwlG0 i:2P/6(pg5ȲiwetTp/()`g㏒< *Ѣᗔ%m"-]*.3zWgHp8z֐ -;  Ȋ%)a 03/Q _l}y'4}9E#l_r+>\a肗]?FUJ^}<=@B ~{%oRc@M]v\kvY٩g[7_A `IIh|࿋:d!vo/"k$ǼbxKbv$OMN\%¨È屻ZC(0ªC5^RP70ƪclJ` i) R/M31L ,sף* ӧ|DW|S3E5=2^`ep%u8"SoEjqi!j7+A[c' ?}%3_VQ ,U諨StkWOgN.M/1Q; "y:$5v 頄9i4(:JQ H/l`u0d@rt< sɿ|G@(P&M} ii_@}?{2A6]\۱K2})j9V| >^f*33pnY[Q([PedbP `V9W(/Yѻ'@΍r Z5jw@&l`41jĨwT&ζzϳ@`~E"~N,8kQ-K:Ջ42 >A9j*>bR{cYspBt,Ĥ[ݔ68TjY][3Sr*\ ">Yz4pe k^'v"lFbeI["1v(]@'2žn)-R}VQRQ{1^ )Tkн%,C?95WOCm;ŴpLx;ЕW|U4ue݀.#20ov t/6W?]p ?زGKW%ֽP"AqNL} 3ĥI͛>hٰ9\&@ ȶ>SbsB=oUT)CǞ?;(Eu(>pd0E=fYh0[w1)OMVC~´^[4xC:}ZQ+vL ]"RI!yP˜O97ۗ)$lVr ).D3B2szuF6F qOTLL5йh=WwFSI U9+- A&ؽϷ 0>(1!&ROSy}/tcLAs,tʕ?t 99Y~`>aRӷ<7?#HFKI s9m0ңۓph7nv\ p%^*ڏQUx!reM#Wn%'hsq_mI 8_Eفٝ`{an(G*>|)Ăv]s Xu\D|YVvYWρ!y_Faw^CW(A 5Cny[ʽ |tEiL(7Vu)ŧMBi&<:ZCVz+jq})@Pt!(a`q!Q;D],O9E{S36v}P^;Q ;([&(f6[(NuG>*#]rIfO;Dd}PI2۱J^ zcҶcL% oxR|Bj'_QA Ue-uraupˌe:1sMBKg]$X\5U֛K+E0ck >s6ֳUq{NF-Uw\֮,r; \{ohxbjٵ{7bg}%y`az2pd{y.o`pP< rwL*F8ll}O7c9gd`-kž pY/Cv h]I%c~HdmfR}CT2to*6  !#x:Y4 <'!]O$;ASHbQ̤ͪnBm,i*OmRO[^、L2+8tN-Qo]a!i\]8Q@rLL%3H\D{>i8+JWnDxS(?q -TzӯsDӹb1 {g7& 訄d7*N9U]"GQٸA.vOG Wox; Xv ^p4b-l;tF[w,)c[5)qhys-9M?@͌C)c-/ɗqNi黭5)@BA*G_w|#=m,yy[U`_Z}$'1;>+eU],5".XM'E^1˷9qjaQ`atKehg6s2-^RT. ,H3R8%?pVEE3W~ACxU0U}>jAj:(Çnl+HȞRj6q\ ҍu}oR"ȒvΏvE 8uz0^Ι#-{'nuO=?5[=d~pdJq\KU.o|!J+^ [ѹc:=SB剘`}щTsN’}8!Y:VUK~Wޞj $Q g#àW|dxjT{lN"K˴'ҮޡL_97չ IWaBséhi?-b6ZfFO Z @ho@ڸb,Bgrx<0PmiH'ufYܞY0r-Hb^ {E%w M+; #x?>PoUm ʟ0(VMhVMG6_uHrMMʇ+)T'Rc{LԸ0ˍR9((@:}cFa-a% vdPv'9LϡlU]}%t"M6_MG6ٌYooHTµ^X9HL^m&.u]|ۦ5Di[i{L Ÿ>(gcŤ?`ȊoM2,=ևr;R]Wk -XD 80C{G.U\h}Y).}rj ZǸt֎wE;9p!@)IkwpԎS 1& BaK"SҐH6E3p%p)dĚA?3>M;k,X\HW(]Mݧ SA`3s" .} U%p#ZKʉ:Ŋ7X8lG*O* V] h3{R,δcn#m>QQd~Ky .Dɚd y3 ~QKjQTGLj9B;Z_!%Q;Hb옙TS'hČ8r^9mvvm ޛJWCqwݛoe;k9h7~gLhd)('drwYQ&q:9zASΨM%`ײT[X2JvwF/` |T8R3vA[^̶5Lң>Zbyp? rZpK`D+' @ m:Kx5 }6F_(9_fX&%~>\K Lt_ӿzStfe ?VtTdq,?GTW6=$aG0]:nFrD҂"b&gv2N7u4t˞2"PUTEfQs1fPPЗB_TjmQX'2>rdߣT#9!gHBM\*+y m6 h }GHcnv+Asf5* 1 .6)9H% 亁7PݺxS㸭X^ pI ߎ`֎#)$>)W~WռYճVYÖTL`:cm‚jUDlIrP#GWb|H $&Hhuq.͏xޢwnkvS>> LJ>F=B:N^ϑ@\e>,oEx!uwt,%ٛ޲{ lnrZ^_xҎ\Ub4 ,/u Kw}{Kب>Ђ? ߆?lZ: Bºqu)ݧ{̮% j|ST$]FP5$€z#w bMYqk_"ғ0C? DtFwZ2< Ǧj<5[HBXcT'̛_՘㐾tKΠC79;[0NK-ÌW}lPdj]G?l(>Q vT9zIkS'uI M\w̽ϸJB{WӒ-o~dt .N.s:AV|SAW^6 4 HѶ( )ZE,|H.5 /?oٟOxCfqtU?D=X#R|)3bWr{18MȲfdQ;?NνËNylήՔ`m e;ZU*Ipu8-#n(;,Ғ6<6巣+sol|=; h'3凝UEUWPǡ0H{ sV[!zMq?9@98|k/XˢP{zعGf]3:ɅC *->qj[QP2M;O!Ϙ#7d 9),=ᆭ'LDGr35!7 uoY8A!+榌4F"~nl0̻r!4YJ(ZN/w#{m;be>?wsX̉䚿sJ' d'c4h}Ƣ+Vkq#fZPCIChJle0vFmfȥ~TTRv\Sٌsܔ$%<}|0BjaFodS:7|F*UwkW|1߻) >1)g,[0 xHJݯ5F"~4ex0Δfu5s5`}]&srrrsb?@VYn^M`K|Y8?L(징*Dd8(vv^C sEo_:j,Uz~},"M^혎=% vGQ$)K"RWI hW2cWfj[5MK5$ PIZ4aȝ,CsSTojyT=$?f^3Z^u]ē'87ܑMzj }ʮawQs;@@a|@Sv̘q]㶮EZD8O+rmn;O;;99 s?8bv\O7P/9ڑ?!4&G)I;UBלY`ĮcrRY]|Xnt=V+l-X !X8? 0[hpDR@z2 @Ka$W:]cϝ3b}$k婮x:RF`ot}2{GH( p k+]<*zCJC[$ 1<)@ %1+-ߵF B)c=6@?5.ZIs]]4h&1@cuLp | *-O ρFklcL+@;ƽwS *IV$& ]{Ϭ]Ո9tF  uK>FikH#OYPfB-NHz<ղF! :(i <8!(ٽx5B ~9BOƧʎbPWN_G3y6D_"5zTUP٣*o+Dq QпPq Wx@x^x)GDyݝ*Ro bPec];N} ,*T[9\S4 # [BRPɞX{eN>^^hy;*E_oطq)ఢa(~GBbb.1SJ@ [ÖR-V|K[M`R'8x{[2cx^XwXn驢wAW< K)lL GĢIo?Ktj*C{YujKAE댌Gv[Zȃc,LHЊ bU+ʚ:)ȱlv %Md[L^SɓЊρ38 |{%p{o;6|F?""͆sB~BsB~y xxNH&~A2ٿĜ4VMF;Ri.OGtf/ҷbLvo/I.@ Mtf)xe1-:=q@|yZ7cR9l3Zv_s/]^y ޑt=˸qPaH)ZQQR%jfiATlCXӷ6r9r\Ǩ/X[Lc xuR;Z cS%m*0H|ncd0VDD[+{#Gۚ V1l9|1EGnCVƫ)sXī۽k k ˺=iE s㼩$yQ y[)hSѓUAG#zZV}P%~BK;鏋tRf9$j,:U='$xDCƪTB0TE[M^T8$Sl0kZ98H֐(~|PN*PVI@[m? aLn. |1d>A[iW~aYz{M[ P+~ ٻwѰ]Ğx!F@kQ*aŠZ?3dtQy F,wsXouy.:a豲gk~P"G)vݴUR Dpo"w#x:z1R[x(x$&-RXb{"Ζlwbſߜ &s>VW%L 7IvlL'. _lkpN4J$IOc.)X8I_K+e 9: ήE1¢B ]k EHwmMX7>#{V?bpR'͘ZaDo3w׶Ћ΅\W42Hś0~L8Ǣ&t ǯ[7.y<-9BŪ>ϴD}|l1P6ԡ]| Y67:ws%Xe?mAb8GْH -/oEmS]OJ`s: q$)4';>Xb'lwgnߛe󪫾o֢U .\ЬTQudily q.O!ms.Feɠd9Fa /{  W˞Cɞ)mhgm+;S a7P]ԌUۂv 5Hp>'*\c^:˖| t=w1~ y\Oġ^{Q KWǍ,}A&ETGX*RYM*APbnxH2={!&Q7 +ćbԨN.<\Yg񒘵J,kCNC>J?p*Tt_P9Є^{l|Ps<8Ԥ%g&Vʒנ[?9~)C1z f>̌JSkTѦRVb >R;qWqF* mc-,{YΨ8Q3hU5ww_8wu[uE2zF_=ć9 mn5cMk;t=,XL+="bc:i4-0S*,fPdsm]p.'v4)ϣBϙփ;\WmHஃ!*@FɬS]5׈Su&@&룴Ut%Va\x6k v2F@ܮ޴??T%fjUxM~^]W$viac; u"8-)t7WK{Q$X!jD+1=IKnEN*uSk.z&r9h{  P'M#^c_-y9~`ϒ:d;8H|Ʒq+// f3\ǯQ*Ew>7JuVet0S/i9-$ٞP؇swۏ<*,lLlou8oHPOD2Æ)$К㞮Iz`}E<>xWsF64".76ϊVb(2 UG 쮺lYOT3M]=Wc3]ΚaZ;<{2QF7r IZ >P*U*(~ڌ+[X>(l5j^|Rdy59Q,NQp/5>GvB2gwyMK^H mX F#NcN2&=s闻0H}|RVy&GqǹLuJ{u q}tvhWп︾\=1 gE=9 VbO(4&ƗT.ilÊl.ڿ!F;Y }O+TtcۅM$ 3}3CIЊ|>\m֣bV`7ucڲ3@kPk>&hQSg6PA$+4W [WCrcRoBdFv(+o.Ji"_>k)//qdcX$  C%<!r.x'&t1/j Ng]N}HؠB D2rB_ c4f +V̿ kqȄ)%0,CjFX(-Z^L)w <00XiOYPT]ċme4e4ٵe#/敉DUfҪ"u4]O,0g958hj'邋ZS:bʔIg7~P^.\b>~e#L9V$?IKdY!5I;Q܊.}0@ohjoT3gEɟ5،ikAXCD00z;Pj`˽ fR?9sX(OI2żvg~"PܭO< y2z-mYݻ2̅M\+F-]ĭT;YRM>y\sEczn;J㤡'I>GA9؇1OW׶ DpϤ>Eќ{; "xp vJA1,'H,˜i6,Pb)ț0Ux^Ou֋ɗET<.P Y5 d9p^`G~ʘ{+ ;RvC.7Aa LgWc4q6K$n0W紻b2cs+:{en\ebI>TL=dUtlDV @(̢yhPzqf>fi&NAl#dy" rgw.)6C0z@B:-NᕻU(ɰ=*#^rP%sCƣr;*$h$@mee|u#%XF͎ʡVnԐ>ЃTfgݷ(pOؚYXӅ(&Yi͓A&Ր_Rt+}R&8ly`u>e4@zgCx6U^T -cqb+}.*>=YC/Hm-\[(6\@NPx {VƆW&I&zn'y|kc6»6ĨHڄuV8tvo퓜 *޲0 m~;;xtPm<gn$zZT $iIOC#YvuET8:vcY #Ú~ %1< !r\Ϟ:^KRj1qk5#t_/PXT,K57xEҞ\J~+RA{YeW={j`K9Vr} uJq f6!+/?ǴDI~$j53ws_By~m"Dn$cU `lic12i1KV}LX$Q_$/;w$$ssY@cB+΁>6rRd43<^TQ NȀh[l^"Y{ _DT'9Q_OY8K&\+_$aV2z9jDO@hl櫿gŭo$x?g(!{8'kBeh(~r_o!}!PB6Sr2xnn?}NTtmS39>v?6Hk;sSd %K)ƸxV 5Vayɍ nCP'=;! (yu/˭փ .K@IZU K揠[щS݀_v(NR JG/h? E &]|? 9$ a+oXm|넛N?y~V2<&R"[JA|eܪP,ͨ+0v:awVr');0.ϑNQ'Aҙ*9"ĖJPdBS^r9#zKR! H]OPDJPzcg\m|مtMax0 ΜY⦂$̋BYJbT;2iL.ے9R0C<AolFHmKmdd'4Ԩr:l X\ N?-WkǤYX6N B+xܜrbɯJU `=~3/iyއ(۲r Se…qQrcc0Ôli< 'dixȎ^ 70ؽ~!8뉒Pܣc1p[e\1j er9.M~ISq4 !v~fBj-g$ T4hOʺv^H|)v)ї''fxenwѥV[ÿ BR,tO>K>B5bv;^xvJQY U;P3S,ղ]5ypDG~/F}x%櫦Mx"ؒ)gYru-$ ښ+8*>4gK 3MW@F02F]VLQ.D[`^n`fr}ͦwp[tC6ϣ>Ӌ|dSϬ,!pYPuO27cU8(\yHh CzrϽdhP Lȏՙ! ZkWAqDIiNurhF>l[J)CJ;a"n]^.a"1[' ;+ZO)>\ Oq}n{9%R 8Xߜt Z$ I} dˮY\ǝ٩x7+a-=ɥYE:i.9~+Bj_@ϥSQ[/eASˆ3v2&T=87l<ܵ!Z4iYZ~Eo(0 >Cmi |n?k륌7,^A \-e nZ~,fx}\;zGnIS3:7\)4'в!͌4oFIoVS"sq@kz[H0ХlR,k0QSmy5k !/&7 4W T:FN` Psð"P7ـUx!BB&y0gQcv8hlVGϿ)Wc16˻,ᔊ<…C7%p:*ZWokV|m(#VISg<ie3vZHevlF3z\gly{lk2V`j1paS15uO Аs}:+`bN>AV3}xvLR)uf0%n`!xkSқȋh % I7& Bgy*9/OǨɃrr2U=|Mi>ٟϧ=}D{X, ^SH<r7>!sFZɲ: YmTDI;RW޵c >IQThގWn4B2 HUįeN!97ƟS;@GCTk\iVUOuh\-PaKc{I`n 4_F,ɺ_}o +)Y! m~]/$e=%ȲaHBCh&l RβDN@YWè/&sg7< )C(5:RtEKSTG u7GA,.V/RoLYsxtttX s*Lpyǃ ;|#~"O,.f[w9(+8-$,["BuJ:8@~DA o aִۃЙ\ aqjnhq)s/њ{9(MS.;фS%H@1ٿgI.D"}YCt?I)8``wz/,T.YZ[C|)\5&lYyj}ۋHJ8w9>*\6P7kKG@{YD MԛymC$pYGB`k3_[pFg?z`K/BU N[36F"^JFF*~`L % MbKhE^Q#EFDLi/{8NQ/BQL001~?I7y퀘{%s[N(@j<zwͨLg'V4OQ'AkI5t:W 3H$1rbɳ)3]T_4/S;k7 0+yeDx* a_o1x҉AzAqGRSz1KEBd,32Zk'Zw.#8T5q!ւ ays4QsF9sY?`wyC@Kù3_OvCh%PfBk9o?%ML iPĨI8dž5ܑ\_l()U1}1VKS0 i;"զ!Uc[b"Xբ T!@vHY]PSB|AVu- ˙Di 'PL@\R^iȾiJ(OFh CeNv7*<5co/_˜ $s7 =_z+l™aڬA!fYGսA+ZKZ S 뫾!f;5&}:{Y"S"47Ú6 }T3eމ-O]BCqȿ"?M89-2,=v9eK@,dhЩumQ|czwJ02O(b1Ջ~M^ =&)MgLiГ~di'W|uO+R |DvoY΅̎6'r-L ^Q@Րفov%DQ1ƦB(JN|'$Mp(q\Ҟev9?LUMPiMiHgL_E-:-Z!㈯2LD@x- 4{MСf|0ZU욙18&QɭaHc+PpPdrEv@x%pOre~0))auM-t@kx^p)ǤI H͠>X`"E{ y Lf>y'5KXȍϴWqxF^G"/`6eO~``bۋmAZ~a9|.hyp+_s!@gbZW,U4sR@[7<5VW ڸӄ]MR.N[R)JW 'J<1)tUrr!S*{uK6Ol$HmϵCY)cٟ5~l)$D>/¤ l wo~cdҴf&F?vstcF""S (^e]<QA,U~?クuoCI-C.(܏bP/{zHմџH{n2^IWILA3EڊjHRȝ #\'X{rohG@_"B( 7I㼒y%eל$[]>FE=ɍ&"MՄ, ab52,1W^<1Mn E]yо P b&PkG%!>iF'IUg_ɯ;a¥0@cG|QsK%.? Σ :+V@v\I`P9Q_{鷹 MbQa,gF,1y&K Y:2΢Zm;];;NgUE[6 1ݱA62+X$Yd)!H54Y~U|i*6 '\]x[ՠ\CEG{||}b{` |GAPIxO&QH[@}gf/A׌Drh^\6ixsb COB=|iydS2K!19U{Yu.Zķ5b0QFn#,^@䳉 kѵ/'g&M/yi?N}} yWvW P5\[6!`dQ. ygo;Vh8C;tT{ə?$̦ѩQ88Suz˯s1OYƶ_&ȴ_-& '̟Luyb~ YZgm^$ێ-SgZIّίwksZͅɤn' C5sAϰ@ FC iQ 47}jฅ{qeqI}y8h#>LVW<-ܘE)P=h[pd)ּ`C^.Gr65%EA=K! Ozųˣ"٬Y:de'^w(^;a{p]NV(SK?HiG=@;̱$ğ/7퀧,'TDm<3)L "sxvRQO|>{{잰%g [ՈΥ9 QخY\8tC!އxƐc2x}hISeWRZz /~l!çTAy4N)vĒoD FF\RS ~Sty\SgA2ZQZMU?UjbI.}OCp UfЖhO '`l2- ;@~)g#mXF 9o_p9f~}z 0&.l7f+'R~_1$-'|^K$WVֹr>KB\71xݤQ2| Mtyt64$ x}՞Z ɍ(R<`K[8Y>u(E#RL ?sؕ7.'܇6 a?gzu&lxa =>eLPP2 {1Cq0e^.y/& K mZMB8G.sFJ[Y:DZN? BTDXqky]X٫ǜ ;Mq1Q0/ykvð;ڃ?{-=`-o0֏u ȉ04?O}{i ϚV&6K-ҁP3R]n-'57N+I=hf刡;ي?<4hqu і;AzlvWp&N !RmrpVk*WOH̒;^Ȱ~ßv~7l螋@l}ȞHchtU7autCr覟O3 +;\rGu h<Ҭ|zJ{x8>7OFFncDw{i,@T׍weBD@G͕9z51xuS|.4!^njmx{Sye_w)u;he{Cێ""셲dת~Ղ}p[Ѐmji%%sd:ϗdn!w J71i/A ~Caa|_&@ +";ryC9,8•Cj&<BkB>N: |4 rHLOw)2$rl'0lBq} %|ExܴߒǢYI2/E+mU+@ffl^0Ȉ @#7fv\}蠂!":i`o=AGXGj oD^t|@JW4Ifܔ&'8j֗ V4(o%*H$t'1s"oR(Ncj*=B㣗{xڤ@cemݱH,*X3tfѴi-LGb@f \*i=kx1<邶m@]cZ+<.=FDbpGu36.QR%Xsv /eḫ-W_xb]+@֛܏xT{z4lBoCʼn/Z@S~懴)0=J[DWc "\XJW7mʪANLLNQ6"s 8^5Y_*su_}ҡ3UM2}s6cwϦ[_UU>4l(R`zߋx1d!)?^6 ֈ̹Zغ)QࢎBPôJbkk ǖ FVS=-e(j2&az&{/*1 {56)|wmUWu*_p+4D!nr\r{Bp?~x#ڬ4#[.}o":@X7}2'5Q:c.߬/EI]LnțeE(JfSsn#?F":7D҉ ؋lK^{*Wkp!;_99it8 {i ðҳ>1:~£Z{s 4yFz厁'+ܠ33 B"3kYa'܂!%3S`Hύ0g^hxmJO& ^śVj&-Zk+PfP6Ex.xb"0/o0ޣclĚ^ԭYqjb$ؔjfϡ618L+hx9S6 UA/C5I2 iBBO=<C9+_˺ِ.ρ v69eפYקB\ifa[eW7n.a ZJ%pW䚹Pt.zyTRELÊt?%۪3E]  w(kX@ VrFL4IQJ'0A=S%ߜ^S0 _eݯ$yuGWlnMrf_J1T0W LNḃ$9F2ɋh-|JuNN85/_0mx1ňcN^J \555l/ogl"}ϻ).c嗓lgp_$&8ű-m ?ٲ^"V x|=5xM:Km4=0րO.j36% ?(fP-] #>#R6,l1iâC/,MdTޤwҘ7=1¥J}QU7<*T7eI3|-iQʹ2Il.x16B&wo׌Zb쨟Df;@P,d,4[АHP@ HSWCqt|a&%l!4Dҁңt`c;yԡ'|͡<#ho@f 7#aLi:@9ݻn5n_ GWt{_˾tJ7nMaШ!Nmo_ 3hTW4K7))qS65EI#*2wwVtz])oTf}ԯ{Bkt7zm]G$" _9y9=rԴEyVd+[Vyi^bi|сL%oŠjTUK -w$ԁ'kS;80/(l Ia"{L𿨴߾m1h@^-56 O:G$t +"녙a7<\ss s-ߟdua~JIc)sڴM,a^*g}{ uل*x!”rxFe`8 p[G>@w{AaGO-T% 6L)m"uz-E/K.Cv]rT/#%dk >Sgwl_  VOd0}|qpG"*ʾL[L"K_ rOS=W>J\ꩶ[zml~*Dѓre48Vr!G5XMp%a`O4ǒDƋ '3\BWU+2t hdxRcrWm3N$pd3FƸ{H)ӱ@GhUӛ\tOeB 1(ugx0 _LҼxyl( ^ٶZގ>~T+4pv }c I"+J ]S}}Wi/pw9/.|+" #;,He$ =65exKcbWQoUDlgмں?0C}GRK[x`Ѻ=N7kGdrJ"ht=4t Fїc׋շNE>Ԍa|zz>!YڪnPE'o C{ub¨e lEt,dMfo7@Tc *FJMV]T^@ ȉ,URS*kbB*W4+:vzE̞߹W|U:e\bQ~r#UquKg65/p 7*J[֔M.$I|DN;|hn|Zŵ9)N+]ֶ0F⹊p*un3qF_As#i^. Vl, jKrUMwȥE%I)jTx)P{)㿙+.n7l9Ǟͧ :ŝUT~xҀµڤ U#~ʏ3`!تiΎzHR vvZ0U>`G=~V/+߅x=PsŃ참kB+MdJoIB1qGn'DnnfkTنF 7ɗZy!=ZOɱCa0C|bCmҹĕ[6SEXĭ+JfpuTCA7œYX2.h ) M U`m g+K[M0RgYU,ȎѬYӒ9*be]Br [MaA|ðnՙcFE=0ߑc>`%j~|͵/=LpH)M`Bd$%GhQѦ7 9ƎM9V#iU 4<-n?f>KW F]I2mS1j qÜtȎy͞ H;`U 丧vLdW/)O?=s/EpP)ίUU=nާFq>9Rsv5$A"B '.5 D  :9 'nΦi{Uq,Ru=Gc"ݱ0MQwM$=Y}K $>{1<$_!μ?l'Y8o1w:&l[ڟi *М%qS1V|HcQ.JiVrlP֨ G]bY? M9]b@Lה01@nƩooGxKQ]E v+w.zN d%VCZv>/x_CS3Flm.}=>i^AOjN0+޺wXH5,c8f=vA(C(Q3rN?s/Ώ ==cc{&G? H;elKt73eh\щ'+a1*viT-JH|#0!Q ~zkrN{0Q^}JXƯ>8&뙯Re ͼ#2 3\X^I.4 5^y*:3xRKRBo.A?]N`q}ඣ:0J".A7s*)|R:eZG ,}Lpp :Q.|]#4 TMIzZ5钢HbVB#l(jWDJ:jKʬ{}WS}u8.(B ?I k!'KTOmBK'U ,g=gv&o(ޠ :>A4Eve48ZHjۀGk?߭jMnϤ<aiԟfM|G:c>0!5A¤ .EgB*Ͼ% ^%7rK]r;Ǹr>JCKKBO?f x*)Z Bʭhiab{,mD=x:.#w$r2LsiRD썕I@! 7CZRA5& t;vkaLgG9n/mKBfz`4{uzqZZ͍2|9qU7?2 ԯ:+&i'M[aHq\29ńZ7}!SFu~"m̾`2.y":Ӿ9rf8k e\93\{ 90;űx'Qf;ӔboM+ڍd&TNxԀ/Pk{t _Q[b31;jaQ)~ku&4? 7%5+O֤a_ ߉GooGh%POt7]06K 8[^M˭ay̝S!n/tbp2e2!BheX_[vrp@HނQ0Mv{dh7lŧqY,$mtkI1QTڗB8yqfywo#k7 P3R0KG<*@ZtVDŽY>%"{/qy.e=9&*b>?zQhsBun^ G/ ]SaHt.\۽ תӲ"YOyeXҢ +(mf\3pV}cyC PJC1r€b*EpSR{ym+{Rj  δtļ왱;}8ތ!Qb^P&@ߏŠ$R_OMFfI>ALLY$yc_~j{Bմ|psvY mC3u  Kv nѧjElX;$Ųyi͘uOzB)Vvy2Ahq)Z13|nT2ӼDey.Z 1ӨkokWєx9F=ǫ 8u on֔lMQAiu8ȾAIrpzq[اlML,naF`<M 99G. *J, BKmyֿܐv":]bTM\s aҙݓ|IjJfBccSY'ۅXt+3߬KߟJ'R tH|RW*nd`[&H s Ueh%${)ߩ0S𣊅E$5hŢ^n5z^~$9s65eH)H0D#YlfwMDWg ,4~2ԭ#xLߋh{$ro e'0бv#29QEʃpALӌ(18w.dwzUk ƙGEB3JO Bܢ@c@22Bb MnvQeҥ`&_3L efd Wy'.|L RQ׷a`}x NNj] #kO!KsFr ?n[o0P'n*YBh45#S< _P.h "ƥUF3PJg,%Yc8e*mX|h{8 |Ȝþ올VТR _A:}সT ?x?Ť%ېs~6+xB%8tpžL!(xvVbbg,%bhM@v8@Qw!~ `U0(ѓi5dRoj^ChHy/;`:ߦ2Hk z_!^a1b#A;j PF0m_1@T>E;L8pҺ; rQ`n䷉qIj,x|\er}D oٮc4zE_$icUkKawYS"41U [h]~EIi2;6}idPMO!lFfgr m,>%'AvVܩR{7o)Djڎ"m6́,0gn| g(&,Xr<c2[+aOa"-yk? ep!ȹ|F3%LbʴI kգ[1ұL{M%6jJ^ "feȻj8~v]ԫԮjs͒ Af_!YFe><0axչ>s`8 0iiOu-P@!zE\~\QLhv'@?b奁*V7xmrPe`Q-ջD+g+n8=e sR2?]8xZ7IZ&Z9XV(1VkFL5q!?G瓹HK-)pxƪ!1,Hf<<[j!^gfL_G}Di=L砱$H-Ɗ|*>Q˂?cP=0f37EւSG'+ u{É0zVFZ|c ] e, ?W32aYNc'!h ν~GHՀ/vn~~HxTք+@!yL!s;mN}ڃbc@y~B7.VqR.'?,xiEVEo)kIx()"&Xk1ggdP0rEr6DFE8j&\Y)]ou-\$(cٌw {J @T]~-8a}y9r3O+h?>`hµ))}~ Y^ל+-a5~[ φ|' yۤ{X5Zbْxy( ,-:/ȾJ.]hN CЁjum"Nr] b69D rZ2vr$eVӗ/K=Q2M&V@\N @VB"Zԏ}A%ڇ KL+;ͱ NQyhєbA?4'@2zAL`RmT!4׳&7BbCqiDPXBD 'b*^[E\|pGv8t)<9R|ў+BPI5$ptJ4 7xP#FPN,wbˋ1|}72t"w%$[4)<ܪE+f-em[Ip=Kx_c*I†̊I0Sh!U)k>s&'pTr `_-cgxbsNr~ 8 :g,/C!4zZ3dl^5;OA#P1܄è6hg}qZb,'Lu^3@L")V>>\6K3|f. bJ=psILE-E#oq8{hT6 /<0 B<ͽ|f/n4cyX^mcAM:j^qmYQ+ Y!tz }"Un1~Ls^˧&-/ ΂8&ZvmE#+J34HO"Pgyp_P~X(E[6U,n hAE' ns;%.6 c$T gdrxL"AL7{3.28ӦY23/s]mw8F"P`PRjC1F<o]k~Zb O +i 1 cqK2c✍Gu%F^ >񴗙1׀fxL̏d=j9H*0T3@9tVY^4uyM~?^~8H= N%U[82 PF]TU@=47L;VOOV).ڵ2IA+GhK ;XPĩ\Q0YI9;t>rڢ)M׫HRkk!0+PM~Fz>iU Ҧ8]ƙaZR`ݟOVma8ɛuKF+: Ε利5 z?hXݼNw$ 36D4TFL&Nw]Uf8+fJ0#s\nmGk7m jU.̲3I Y-.tR0'T>d}e}/?4 ҂3R M ¦YeǏWIs=/%nocl3kF 4 Ha쫯3 b'.J]G $ un7:~،JqMʴUh}-^#7߫f=sApƒUwK`R!>U }M0`?_[ SWzؑqMSGPtdwu"-Pwov5 QJϪUxB)v#F#Z*57Kڿ++OToʰA: BJf֫,(y^moՄQq!KhC3,TT=?cJRI'v/U:Fw:6Vr5O;Ņ ~Hm|i@pϩyNX _^3(ʼnYŨ|o,gv@XphKl BQފؘ| jQwIAF}- wր9lC}iŰ3!&q´,\%|V%SxZWL\;2\t,ҾT~  ngIg4rڤp2TH~i˒<~dW0hN|DWTK=T ۵KchӢAgψP1qkMS=,E`e=LFn##[>rld!:KM9v0!QP]0luSI@ޜ7 &xȜOuJ계3D'?c?,զ^ :ؙIxgHZXS O %dD7:Rю \@$3g g?|SktHugr4*WѠFU.H1Vtz^TFI58m8F[&+;j1kcn! Wo y!ĽLӠ`\iE"*y@ R@ -k]#z3GPҍp/*ى5zcRaH2kF #j}w>'mX?&/Uwk`hq-N"&kYd$;qc=m^%: 7 ߚSw%$6ƂZz;u _X>ֱե^:G^+GhVN3>BCl(D1Ž֟VFHzP5ϙw=e4W_҆N`>É3jxoĤj9RIcYk<[$ѢnPu:(OrV3r2rZ@V(ސb{Ǖ3W<_WfL@zstDs)~@K81k̎޽RH>0SV%+vu7 G^M.oƳuGb'!Вg9P$/i7r?I{ 7I"xPYJ/l(D$>GmDA i4z. CLD d?n/Gp]PrC}Ӏ%\Tsu9(60h(_;Yd6UnyHNIuAtG R]M776r[_7}u݊i6>/sNpc~}2uH ePUD@ Vf#YZik;dOɪj2L4Z8sNUilk&dRN_6=z%@e[h?n“ь=h) 'g+^|(bڈ>3 bzטY5$iBoWbCاϾZ[)sls~`AI)c~J el}"ژuͯE4X\z쇦u^ګ@QjB3;MfTY ]zٺY.vE0&)0ӆu(nHŒ"Vtu V8Hx23Yc#;OE~:{`j-Q`Z(|Դ*ɗd@pqHw4K!$ ss<#F EiVnl(OOԹ<;T_*nBy n;C쓓HUڴi2 j<)UFDuN65|ϊÛh~0JTR2~c*\)!L_4ƐUp_(U/j-AM):z-aI[w6'nt[jgc0Za ywrɦKʕQ\DzE|ZӚǘ[?3삡l-O+y4!11?(=0.`dXc~T##ͮis2#;/F==MHf^Ԏ>lƝ,k_ Fsk$LȃHf=HQG_2wBvC<@N,OZ /$ƚrd lPk/ZMap}~̤m`gd??d̶f~_鸅x򢩋"&^H4"2dXd٣ndųpWYm-Vi b(-n8R +*u}jm >;"84NHX20 *`!c@ `TL%s zh{$7g+Q6Uk C!M*@R$ïЦN?_Vף .V _z\RnY:WQAtsizߢvLGWl 8K%' 6ٌKj鴦 >\%"m .XJEڿlmOjV S5{^bkWv/4@j&NJ,&5K x^U:iwuh{ !5/T UP0+Ԃ mǩhFZs|]ȓc'V)\0sY,V a_UidtoqdGw}xϡ0.`f>WǣWٳJT5oLntX-R o&GV2/C-no4EξKįλ׼=nbSD4Y$ΥHnJiuXny5iG0_BeXF*9*X[E}Kkl\{G&i];R|2TXdk,orx|)#kĴcxl:5#3ljf1`Mz ~mKa`/U7ȅC豺:l A O[YfKglcBL+#^ vInz25Xhp!xwAgw1hw )XVOJpkܝ2XZ}P¨U?MsDK 1 i\lU·Ò4tbN Ys ׵b*ng0ksi[6=e#޷V?B :.`M|N-L%<Mw53qIv)*a- +HjQ5P=% _©v]k̉ٙ"UcuݲNu %5W%Da `ו+؇ hKp` O?TWKZR~O᧶NE,/D1-ZOס~xqK+Tdߤt?^6!vi#v >B_~;,LjlSX|s+~A9Q&T_6qH1\w[Z1x̚Ѝ j_(WQ1(_aT{❙v$ NjsNgtPk֮iGx\1`:){"1ں2So"lEQ F5"֞Igˆ ɸ8Y!}cT8"uqS% a^yalD*)7@Rs7D"_kq !f!/TC4D=wۍ]F\4#t/@!VK/_Zd>?A?b-BitjB';uƋ"ur)bA̅"D#es  6\v2t3v*I\(Di{Rzű?*YfeX 01@#fH!se".>oN~?ϓzIzT~L (tM4Z|Mv\ÞYcAU`} <)cZD'^閧>Lp'K[ːxQLc<.wIlo$V$'!W5~5\Ǝit&6ϯJ 8ZA̘M jb)`~]`RPõ_dK`Ǒᛚ\0%Yr`)DZT)}k_Q }z@zI4*SNM:Oz@gbt.tlvțF(+ўR{5 ;Oȑ*x; l|n_]%עZAv(';FK-O8?<a)ʗ~xW<ƞ':Mb88g.Q 2Ru 6#>&!0#hq }܋|"_d6Jz(>(SGiUΕD:ɑq/7 Nή1z2[co/gΛvj*M&GaBRþMU-u:RV(Ʒk1;edF9Z¨n3)ѫ HM'CR!ԧߑ tbRԁpbCj bCI-*F-zU29J}UBF0R 37*z"Q)5)Lqq{އᬄQv5BDJOZ2'Ql̇Σ橇`J9:A8^qcU\JC7>8{"ltn%IX:{ 4< _"%$Z liImkZ׬9ߦ) T¿4#gt&F)؝M,)hqIY, yDpm0RҥUژ6TC-w2N8D2 6booR"쎹0T Gi|K۴*gr6&B\".}rVOUqrVr9 fr%g]R9}V9AeDcs<] i_]r` ȸ~ `~ਲQ^Dǖ\AioaQʪ6 ʿzkS5BS#eY+䣳Gupdhm+iEx)tǒ K*-F0CŭSPzD75W QGd ү~҂z@nCBE'¡1 CqB؅#K=O²HEjRi_cQu D @LZֽ%{Tyz0o~mXR"D<XzWY'S8iM us׫m ht9Ѿyx)fEi# ŦP(ƨQaf {|@7s&0M`'x%S9:-ۭMoa&z O3:@.jntZw  hl|c@$ӯU_ ?#~_ ӓֱ;1@IfȴP\pFA8gx)Wdz¼~W4LXD^`GJdzsJd*9x34r/; ZxsX;+= }QԽ֊R1'Nw x֔F[s#H> +YoL~w`B4Ggzn0gx3SꖣBHZV;N ՚|n-PU`I_n ?>ͥ_b?1B O=1"|}#; ܓQ_61 :0yi|{g]GT'şN18OznZ9#.TӫI ęCŋ:35 Drxj},;j5nz4ĉ Ÿo{\]._v'>F%fn)$f!7U'Me۟8r:]ƃ' q@>9/,Us?) X s2'zԪ.>M鼞 $i2j+ԧuݓ S^][A{9pkðONu}LaQk?O o`)Ǿ7|?u8%%jED#O,KpRE=!AG VO E(9|n97_ZY g0WiYXF ҕ)3.-TC'{; GWpj3ؿ$]p_JwxQ,d J;FC;F]uz2) [[qPܨ %T@.299tvuOBm>qxFȁs9qsy3q}X*5`M dߥj۷%( _(v@{0_ͅÎ_CF6&:2p?3$;f WeNݗ #3UGfe2OG M( r#B$-0$RZE MhSyױSa$u[%ǵvy(-@Pœ]-p&myņӵ;Drq"%aW)O>,&x rQp# tx2SɲF!KŤ"yAæhh|x)(ֽ1^  jӎ)$*VQŵrgNԜ7 нG5ou@4D 3o 8C6RB2P,~2rN) *g}X|0W(DoSr ƀF_A黔~R}ܮ y.8H߭9%#f@r;tuw5jse26tɝ;݆UO2Jmj*o\'50ڪ2-q5O@b5eg#_fHa$wFFUbB]ũ?ױ+kbkB #kF/HoNE@DqaQjA`n'Upwn.z)ץT7jϬ[0U3EPa8_)P)=5Z{=_0s nmr #bAU[OcsFUEwF g<晌v"9/'#/*D"Wb.gR{o>AW[:kaWgnc7I-/Hcu%͊{< @:8NEm&LJ|]/aap= ^+~rWצ [akG6lȷﱩY,FG6þhp Zj\/ 9wQeL 5 ]cf_Wۂb!=)HvSq9|=UfQm: NI5^&<,v/$`O\m S9y끢q.e{];.ˌ%r]7v$Ya Xÿ7%b9+쎩\KbαyPšt2zܞ~6|2k ZP!%_@PJABͯ_=%rLn 3gUo#<0$o҃Hgds .*lZA>?B#6aių{pe< U7Ħ~^ssaY U$=ok&^nK3&mԲLecAgGVǙ2xh T~X-þ-:)0vեE\<4yK-pK5lcR#N$6E-Imw[d^Si'Gr__Et 'c¸'`0.{+l%vl}HH\E|Y㟇DB9E毃̎?g(tTegt42ެ'/<>Dw#;L5Si\d>){yfڰ4Jf[1=?P :=>ngs Ss(6ڌwm;8NsU,JBLZ0zVx:YE9! w|z* EaUMj`'8O_g_P®3u}oLc]iMgUZ9'R-i͘ ,ݼ68 'v~}7-3a|1ʠѓ ʤ7;sh*qųW\p Sپ syH'R2|݈d8=^/=/|ez|j.QTJGٲfYoWL^i$0kRvv_Bg<7B±)2hW?¥5Nhx~=n;Qy|K!8M^D <"=K/]pg:(g^wۊMZ'46>xUwâȄ L/GWٹߛ)8%1nXC"Óo`, ΖR$n0?-?m`u? N/ѕ&hJ(RM匂[~DZ8)g??7U:ĿrZ<(ӦŴxV Ap[yDy3`=Z/SҔ}C; /gqrXCt=P!10gX$r~!=5_x^dQwgNi|~o?r. s+DGrya)īdVYpź*x6S/8n~&}Qx vOJk:9r:~mBR[u-o;? V 1d}Y`^)b'  !ק b^OtTܵn5Ra%O\kNӧ$"zIe K+I[Ino`Ӡ j!%j>s _r}؇(ӿtvd!2OԺaߠMDA#Υ 2]5l8Q$)E[8烱oɍ o 4+'|V?X*=  *&TF,wu6$6ūr&>@ fVeE51P¼ENJAW8;,c/L:<?ip2=S?VSyˤ}9̫? " 5S !b3^:"k\twm{,FDk]s6 T mk 6{b]kZli/f#eHx̀r jmnmS曏4Y'=H/:r:o}肂X媍-:eh;>c1-+Fo>:uT׿*=첂Tu'@Mx( 6sj×DmⅇSrezW/Xq"B ”@hO`HAz%M.X"d5Jv C4?AH:M|оdL6P̘Au!g1t R,܄ԺrWb[XURG֖h5ǻkH$j]$Bwk"v,!kV9-\|g! s 84mQe6oo|N!g{Hf4C=&^d]6oI\.܆x} I/9s`FBm3Pf׭(%U^'c?AM_zĜAD%!ߢWvGC!Awz--"O9l6w@<뫵h;6τX%A]3Jiw6 jO:D]8J lht|t_h ao尊  ]oI[g| .y^m.۞nIBjpӌ˲pR[J|zOlw~Lz| ا0xA!@7@XSNcò:QVPqh2 vŸ1BZv6g*D~\,PAQ>^DD^^lt2 cJ˚D NW"s&+[ILl1zr[2t^:=|}8+utAW97hd'2  ()-Ι r$9̛ksHzC5ɥœkح@kuδcdO;( Ǧ$/S6G|t$p TˀyXZ(zwBBƘ 40FrAHg9'=U-Q.z\.??@t.l}uh}7Ml3Fףd5$;7x $28X](X :Pv5H<:J9es54=ɏzQ*ݰ[^óI3Pp kfaAytJP3BA8{˵;AU_t=6GH|'n!L8'7cgEY2F{eJ뜄e?-;!}^]d9k' m:мŪ*>>W:{6ҝs k'4;W<>EKho*6+aQNv 63{̶KDXvj2 q d)}YX͊_/QJkԺ8nk "z:Е;Wkmxy|P>^{ǾFR;kf5`e ߅GƩ$XhۭKVUGLRۚfYhAk¶c0;nhf}R 3|aއpy} n{h%i.K b;;];bUFp̙ ا(aB@|71nUM) TD"NSo,\LlNZϙzޖ`,V,9>\p:,j *V űLZnq׸F !jUpKː]u8nĿ@Yyf` vK8p2 lGd ks)]#g:lV+';Pȳ8y[saW0!awxmO*];,LPhfyX@$|ܭ1Aźj 52Ur ¶PEtZMÇ/DCO\LdՓQð .[xD!W8^($Ե8.RJwbi?We<>,M%PGd%5iw8U0vFהe^]C7 3zq)Kn*$uovqh (ǘ(хfу> oH{Wl1N>=A ~ 5)-I!e*C{vp Iy9Gg6\>"><ae0C 46;d[||=Z과`f ~~yV<{\zmyfyʼnk77(s^2',# Qݭ?m1 -a*cD?eU--LeJ|ϧ/|.nŸV-ɳA. =G Õ+?[-]W[խπ;^Vjr7IQ%gEX- 0`b"Ma |Ծ"e[\.?͘Oïr( uLÔ.!J"λL強 vU1A۪Eb%wd[2>if+#1ip;u؅:?Vf8/ʻɛdL{b XiV3(Z}fam `נf Ϯ_ 9eVwa)%9L96RJ7ΆLwC(gd7ܯs{??ebկTS=ѫtĸ b[;ڤ7bK,vs$47j92i$Y)uO˥J$TBE}}eRm?NnM笠nPҰ4=R ]cq.IMbLzdljQExBR 2QS%}J,dfNv!I-c7wUoyvp&bҰҽ4r`u,\cB/$3PG)6Heג43/ҬWqnmdv{Op4:h9&ώG?$ E@뺵wyE.Tc3Ș1 P>ZN<ѝǙ9UѶp9hm8zHӭAu4 1|,]Kq0~5\H2zt2Q> CUUh *D컝z?β f C B+42Rmk=ScJUf!%_Лo[}1SqMge)-hA<,@s ܱFT߃|Գ_=p7JQe)D%GP!\c)u,X> Y$wo:3=N١~HsGŪ+ɸ{*Mh$łSQG߂S^ҡUQ>J@-+2:Y)o< F3$\f4lU/cD)袓H3Wk"R ]yӵ^C<Ui?Vy!1CJqM=Е$jwb<`ryEb`nx$g7և=[4$c4^U 0'cdcyag%We2)n]3q/:dZFL͡24G?B*hD5{B"c9,50Nc{{鱿ϳHctk#ʄ4:INyUŀQ5EZFX5놷 wF ( M"69"  >斸O;=evK$O`Eu׈_'XpZ8!tyR*SEE hJtҵ I}8h|5faV_0OOh+0ZESieYV.k$HseJn[ZpI2^GQѼ:."Lx)%^Q<EQbju[oZ)u]@b('qG8ι߽șpmrEz$ Ɖc&eUm"9W-k#ʨ324V3Z=Uk \8dq;R+!+| tN*^G]GT+HDՃp$e}vk~==f *xĮR>JW$f";?áj{]b,p *H- [Z`!3YzڴuUѣT2(J>FrLw_pt<^zй +DO>LۉUE Fy(؜.49I`/yQaOJҷvKF%%`w?/ ;{1I>@Nd8GRfQջ< _(ߒ3::Pa!z&dG6<&Rj8u"28w>^?\\(RL>hS3 "iRL̛:փ@tD/ZfϚ&2ɨ>g Kh$6qf] +:UTJ { Hh( #պRː"kW.A!WTeN9"[qOی'?&8U@w?_u~Ū&S6q7%۬oQ4ϙ3{QG~4~֫].pO'X O fTZC6aYARîX_o2`*0:j͑JGf F˅sKn~3s/Mz7Ͻ([|*G:2`3l̢W*X)z5N/C2LrڛA&TKBb{ *<ICO3ŮGӓ|>)vc#|isIͶ_0͝|\H+ɪeַ !ۨ|ݑra*1Y }/DkQNGy͝$&d 'Ú(!Y8o'7Yp 5w`6e1M Ԉr)!( %?WNSuM!:nL/:y s^ە_K*l1t^ag~:>UZQ6*\자;՟y }ɸHJ9_Lc9 !lOz3JƻR;6.|\%4JqR_ .ڝF]7VE]5kֺppj|G Ok4Hb/l(T?{Ώ&aR') ݕ? j(.S|D"p{d}vD~;UH:_hP,y!@A ^'P2~S{mbY7p#T?lWCb1bTud,+IOYh*>F>4z@jauaƪHϨ-cD )y&7_ʕ߰pvՊ| *''jOB5Apb]k w H"lD7]lbϺi>j^2~ݽ=73PA'P_InTEzn NJIf \ɕ59^,awb tG̬q93K3z1**KHZr||[!>J*H?뺕qDDG9Q %۷ hГK4/&О; &η>QƆH6f΢n87]*zc|{ \pԱdT~-sX,}x}/<%`Qtl.UfW5vaFzEUIҦ}92AR㤌S`VZ| i AjdˆJcY>ZJ(0䨓۟!:rA qCr% 9}-Hxc-;#H $f'*Goў%]4*7L% CN;+fD/\sVy 4l gL"|:D3M2u T8&x⠌Q7ŸXAуAD=ɦ޻롆wY$_0"Y*h-*E h,RMqTQ@yLgz>jvBQ:HjD"W;@%skmfXQW|5y>ƵpMWwC%[~2^%pVEp5FV"f/x(+z6=9WDgRʭƈ񋙹_Q̬=x:VQ}8DIx%L &zOF=e^-`*v@BGJ~yѸ~!~pHȈCϱjaզg]B ZZy¿?ѬqDP~Dߥ?'{ۥ}׵ :bj.i|[|23g`Hx,Hݕ1E/="x1A7S-@aer+ĜW}*08Im5j3%2;ee𽶾SeSphӭ7}J;" N+r0ŧn'cƘ( ݾYVS*R'vVN뀔nn):NH #J I(KUG5?F.u<+z(9lX)hGwm$0תxɇv TƝ5KT,{8Ȍh&+RX=x?ͫ ^ٳIs;6;X xa r*C^Q+d9#։cgYcdD1XDZ[!vO4ImI0aL:HM1:\zӏKY:g*7*9ص ؝S6iʏ#TxHn3I`IU0Ù ƭc"]Ljm6ZC(}r~Q*%S(NN,׼W/0K6{2o@'C|}S'DaN$ZR K14j,y6P|19X043a<똫M} g)+!)*)Z55xAJ*~6>*k:XcC.7{WfF*|^0fXgF["\4f,GA )[YW 7#aoN'HP(YU|wY9L.|$3!ю0vgs]~5ϓ- ЊdVhS\c0Ayn:rq~iR8M(1"~&SϪ'pw=n|̀Ӵ-`P:Pi܇<K{*oԢK bF"-g#=<}$2ۭH+bnDofW;E*y+_ v+S,%PԒqf'wAxd'5jbUd%݌Zˊ\mU\>N^V5~~-Hދ¿䠥`/RTbotFӬIYTM|TRgAiNf1+t4@2̓5ODvS[hD=sGaВ۬/3A(汃K?俯H>h#IA\vtC/e'W)x|+pN{cs 51'nnAIBMTt0Aw3~[zƎpOc5Q<ʛГR`X?G?p ~_Ĺ3290,,B'AIycֿ.R u+Ex+:M$xM݀jrcsنW2r(_t9gO`f1.ң0Y2hݱ'XVe[oYV5C?Ŧ$5%|g$I;R WCb)8XZ?nu=a4 xm}b6[{@tqR6QHHL%8(u,l1yV֤k7H3cE;˦NУV@ˆ. COV5K/,r',6'c$~!jgOrV/F_FdtR'`,Tf/.MO._I[bIv БH}|(_>Խh%d ysH>&g ApUjh Gԋp-G"u2 yݠ+&rduVT#Rlgf2>R^͵oyT@OSqNmR;I0&-(|EȄ`9R\zY$seJEc,Neyq)0zKZ2Ah@,pZw |<$y Sܼ1_{[Ed3r_)epl<$IY}$l.ʆksf(11Yͣ;qL>N˼FĂ{]plnAߔ j, iCI%``Kno_6ąrA)vچA> !J>po%bjhaӣ rӿ}V1MЙO5[9}4=3ΗL,)l; "]m ̉&_}C5ZmI[d,#7k,D4LcLtONvԌ@:Da2/Wk㨾kZlf'ę>U߇?$p fQQ 5OrSzK_au.?6b/@VV>>G}?ϋŽ_'x:ޮc/OR^tnE{@PiP=~) 8_ѧ"[Oe?%M7$xL8՗0! !ޥ #.ߜaáZV*l@qe$1;D'ZcwD&q\{Y5D:x54I)1ljU#[`% T07f?$)]ҺP&$5+Ε#\ п+PDIa1hEo?\w[}HUrz_܄ OIC?6B>d+w"!zҔ:UX|7 $1P{AO6oĚ͛Pov6,=*YO~K`:z|{e2 =0uAK*u j̸BuC%m]~ْΉFF%OC^ erS3&a2f&6vuh`|0MgG wS>glXuqc7/=M R5\mqgN UQ(C18pxCM9N܂[#}&Ԉ~AbO&>9Oošݹ'B)9BseV2$8N[̯XG̹p§rձ(JEy݈n.AsُdW|`NCn]UÅ7շŧ_5wYqJ(S(o#*aBDHt ]|oׅGn4^-&x!谵4E4/Ԭ#=Q!HWӉѪ]CF°E|ys ȢE7/瀈CD471gbk$EFT%f{ ګ, bz2wLה'1AY{^ex$$/4Mf䠣 }"k\XX1pM& @_Ek\{ABJeo|CŌ;%UFqxؔh!K:Ȅϛ[>ņ qHSߟ$q{N.=a<9>6 ̳ 35z 2(u!lm(0^h(ULl~Gw3sے3"=)1 eʥ)g+XW8X0mЗR*jGT Sc&2)tIE+>bo5uV>+~%ـ=֊7U٩N5-2&*6>o;m]2>ސ3C ]'gQ[?X;29qUK-kgCN }kR/޷}5؟ Mқ'ϷbB !aY\k$&T?V`٨|R/ n'iպ A=<`?Uayטs' T~S kzG.x;O ̯2W^7,xU Ǹ-lA`C/!( #ʌَT<̭T)qӒ"B:\KȒKljKNv- N_# R?9y/ VkosqgH5?GZP_euzʀ26H"wC/3933QBXS h'd]J;öоIӇR65J43;2,k62xV8uU"tk1=#sH"rW`X~oX|7QN%%OaPoiZiS}B**U@#rxNWf역טA[Wi|B50UUQ'i1~#K&.T6~/)j7a3fTO$0πW2eY*kpK#|QM `%Ad9 lJaDݰl&p`Q b:?fJrq!47|aO4veۻPsi{N,Fߝ0C;=@;X㴲zmbʊ-DG`rPe#JZTt1gz[Lo׵uJ,;yU7Z4 6*Nw'j.s4>mr&Ok.jPϚzbU*%dub`kʁC"2;)²J)B>zaIV]|ZYS;FeUmҀtJCof= -fiBw?n!hXYVO[سIV_%ت¼嬑2;,)=YL(8plHtPΜlK'qH 9|p<=ػ`ѡQ ",TjaZ6vWfSKE6ɀfs|u"3K;<OPmؒgH 5i9%w!4MPde)ݷxҼ[9̿.;]8sqb툱38 V6֧feUa1G<[^ IQ 6jAGዬR+Sʊ][6`"Z5sZQk!]Dfn`k/ b7ndA`SXpf<]TJ`A;cRezt"L&=Zlcձ(xx6[z,7޻,e^2;6`( p鏨i_VR>ȝ##LJ|t{69Չ6!h),=1N{B{hBc #v wzh}3a25䳎`SU^Us\TO;$ňkv+ėiڙ^;A4sMͥs[TJ(7K_^(ɩ9)- I{-⠁uH}cS !IUj1o:G_vJAVh9Fխ]7)vaj(V ;'&$Ǣn Ġ^SH}m ׈DZ0՟ llYptmE(x5'Vrx3_S콵G i1@=Ctá3j)יa^6d$J>}`=4bjvM*W}z姊Tb>@/ u_g"3 U$"Ýg`?QtHf^ AS#6[17kn,~bw<=ϖM|@we+H;ú$Qg9POm`R6zITաT؟)끞Mw;V%2D3O]O \^ݛwwDLS6 ヵZE!AX6)ioVplTUfv\ڌRCwEH 1uvPLUeZ Lr8iW> t"Fێ (]܇tRkBtP]:S^w(]lx0WʩW gAXv3~lqx*@ {Y!U+kiy-Z  „!ihB߂gx^]e0v}RK| ItcrzwgQ}F>]@P9.rjE"-r! SDπ?# \:懋Ș|ilr"l f1tng֪Z  K~Eh{`9_qd얚*w_jpMɃ-ӗ#,%71밆EGʌ$Ekj`܁Z3.U6o =+p 0ȗğYHn7kօ/(*;ԃo%g#tP H2Ti%"3àQZh錀il P.?"?x"j$vck )j]d+Ax/0 ):I6嶸=U_Gkgu V|BCnL)G " .6ubq5= K{V4NrinBB8>䂎:eo,hn q⃤pGp߂~h X(75 ԉ<;VY>8.h΀'dHJon`4niiZ*hQ-ˉ)_ kMP(k"?΀厅aHѨ2Ȥ(f'0gaF#hcYŴKJR?˵= t,sR.]Hb? r֬Җ/>`QR₊> `$r7?c0_/> Z;K`~^*o%4=2O^M%ihwkoWK"Psκ]$F'$š,8Bp]fkғjnBc>Oqb=GPe2i9x}Z>sl1)j{QX>˜~NT0ݘDUx&P 7lʇGcdd<~7ko Q#1́wo q?+Y-h2xG EtihCj#r& 2_aaҏXG|b80.@x'lo}`kF}~7kj5A_Ӂtuo#"8I}?}(<D #c_H1ؤhp{VuF{ ٗO}v JPŎxȌT3d'}BVNuHj.ԊcV"}8}CR L(0BlнCߧh8Z2?֯NY)EB؄{[qJd]? 810 `5$0ȀS A=NOdY?BM l0!hu9vr?D/7;yۂpUzHic (`)Jḩ+<X*?@pX/GZl;8M KȔI >OV| `giT5+NN ]<%vO ; %4jQnӀǵu=Be=kwA;5NBu.({7-w'6*A]R1QK+. S@\}O*kM:؟mJuMx(JVLQ^?ƹ4@T\\EWHX9o(!5DP>)ֱPQ.S.RЂur:iD Uh 0L@p@=O=U KCVDZQ μ7plSY7;}*=F,޺e/nw!TVׁ.O%wPwδ-/ `ч-1$:LW60|?fڄ&vmzf Y9Vzz2H.ckvJ\~7hX,rϰ&OjAA"bQyz y3,鸷x\)pC"fz&UYsU?0S+qĐXW.%Nt DŽaV`սyct~qX+QmǒM2zZM?ˑ5鐫?pY!O;ZHQ5:}3wMFdzlH _?jx~# ,^>$GL*;޴޲?,IwD(lmd0dž]H.ɧ*$T}eFM ;Li_5%Sӭ|4|D7$Ҟ32&K܊&QP'?^"Տq KӤ>qJsg*r uQ47<6 '{-ǂ_)A8RZ(I!E FזD}2K|(Zj#fyyYF:fH/F`@4sF(c =¿+'F|`)ߩYb1lk9!b5A:?!\ꥬAepNʖ~!x(Llm5ij @|ߝz 2 ANc>䠥eu":>FԄ%x۷i\ j )%TWЛ|; ˯<`Ǯw tp6:mi ]aF '@2fA8~b!(< :1d;ٮ2{)YNJ'^aY:BwnK(lm$V"cڦHcz?tPӗC왛g; ^pn*cȾV-6l|Åe2U<ԉYX̢TYeU{!rjI8'P!cK~Nws(Eׇ.fY*`xdh)l7>u+$ՌKG/]+cJ>[f=CJTzbL_ 6GUp}a{k y:gL7nISwmqy.N{KP#!/6,f?}T2Sx4K[22B0_:oqVw`M~N]m^ /Z)Kt×ޢV`fQ1Ҷ1˦tF}cS(yʨ i(Im;ܚ+Mhir(:S:}(o;Olç~|9EoJK= &pUlPk7a,P;vm};iV BɸMN ԥ_0ӻdx/ Iw3-H##>=uzl:C'74ocT"1xְsռ>a#uޒ|(95JYzɿ-nj+OK=JDm'UP,D@Qf*]~-2eߙ~hWʆ wK߲hKDvd'Dus&fA-،6KZHY'>@Q1> AJ! 0{<ȉQ2$xCe "ͯվ pg@dI[F)i~ ~@M΍Va|é>3`_np-7Xb1E"Y%hüQ)fr&riESO eS٪o-N%A^/7]Es/>= XjM4O)ok(Mǒ?n"R+| gȤ0VD;PbfvсcXpgycoˡ9PDz0peXv5]NV.:jLd<+wlc3ؽه@ڦj;,ި}l,Vŗ YBRcip!WK( !ʊN?2 ?Ep # j(*郵.RŎ47xbյI^ 1c\ ]]p_T!kwD{"tꝅ{y՞{zմzEQ[8H};W8]~E>{>P8b9 ((aE"QΙ]3wuf?h]?>8A,# In,*͔:qGk_V7Glc2'>wYb52Z S)4'vpE;Q%Z*qНΞ!Zǟ.UzYkh*:&L(g pK$ hG1cANcq=j$yBmz"de|5`qŤz獷7PYg9;L6-H?`~er4}]\b7 Z`35$6% ( aZþXk؉ 2%ǽURHCCeήg}~/UZnseQ?4d;9QH`/C!.xGiO{#$qez`Eoon[|U6\R(M6t2:)uF3!jϻumI:}7Xh;RL7e>ePIV~P% S[a:Ky!n5J~Niac}k@|S B.(5/\V4ΫYm"5ڟoĹ~ӚNP@ەV)>A=WH(acV5>B|l5lӇL"\*Y!:_bQ%ѤA;.ۖ$,p{f'{gv~MWBcsh+H/΍O[aݧ#J<;aqt^"ii 9iڐ&rPЗ5G؄8z2\;S$-޲+  DfIVM #֗w9h@?YmgB]*،N+2]=}PX൅yRԷoZp,^*,خGqMʷzt3@J~[L`8Ԁ#tx5sد:UwD[ |&nk{W_zHSZ{Xq!Թ[o*2vUL(Ox:dVh"x0$8&RjIXd D`XyW~ J$':nΠcDAY E!j^$EBy ~Gv.*²n?ȒûfJht,M3shCJ0L=dU:>5D44hϛFYW R1Vk)^Ӌk!)KMnj!$y\.umxNYB YdvpyVӎC=lN+h+2KudjP>#1lIv\~cxj?/5j4zQZ)2bSM=&V֖h~?$1pw:zNt C]l YUl<"NIԇєIA^!8;tN|’ďC|&"&!5+(f~ƮչϷ\ Zmj8Tg|}r> $-LLЧ `FWճ'jvP`rih5I^[5(`}D[%)s9Ԧ/ߜlL R T`mAU~uP,C4=¹}o.E(8= n OM1~W3wۯVYm I]-;6Ԟoo}D) )"1C$ՎSO|Hc`;0nX:>䈓ϳ37eϿ 1b꿂_7Pgn^wv<(8Σ43F/򖯌>ʧ75>$ӷQ:Tr#[o(&͎޺A+xX~B'ժ] U#C 9+-}Nl]y[Q|qBBo?|hUgCgt|J:.<ҲQ7Pu#k,[d^^mLM6BZB">!gWC.N *p3z/ɣ4|>D\ p456vJ_\I[mZ\ʸM@l( %wl/( R`28ϘC܅$gKeHcbmH? JFFrԟoM{[鋶Qvt:$+v Dww0{  zlOK[2Zs-Uۀ5o߃96ŸB.WLX4߈(1{+=…b\v=NEyey:~s1H#7Yjs@$')%m9eWJbL]:d@@f -@A6OՂꨶ3>a M ˅N: V}u}MomZ!W&GV&XWo S:\TwWq].bQ%H&a̅?bGIfusxSɏA/Q#[{5/PXF%u4LjU0iG쒱95r.ϰ8yN(֭KSI~Y%уP~u!$j}΀z%faT=tɶD% )?\lgu+bJ؞˜pqG9̷͈mI!\p|pܤ:LJf~d "+osFİ4j1OOm`rӛ۳-2H3KaC}Ʃ̒"[' *?6 6"EXћI ()ձ&;i3SUW瞜`\s9sx폞-%! .6xt38KFΣμ9!8#!O/AO',Q並g۞X,֌KqW"u*-ޢRknP/cwOTx C>9>YǃiIyD8ĝHMr@~<Ǫk{wD*`sT0m+2n~I;"9k3!qWDNnx 2*&E)6X @Ki  ~L,M z\{.ʘ ƍFR ;k\.˃DܹIʣQ#pZj"g P-hٱ Z1QORPabm8YYʐ/V_kP'xFEj!崺/'!#[ka?ewbȉrxH8pQΑcM5*j$l ;ú:Bh.}ku[i:rU PDH5B;W49gsMFiti`|2gvL./D#&m{\ܙHi>\(%\Q33Yέ *`BIiَٹRh<igջx Yݢc!3Cf#;rXX&1ow}dKU3X@Fj9t+:A8$G+Vԗnpڭ^2'܈y׈@ .:icN;qrc%as/oô@I> j_Ot[tZ ql4Mmxvzu.1`i^꫑_sO3 Y+!uWߺtsujKv- 0]`LP6ԓ*~ 좁̢ \yn]0R_/Cg|[lb5Ӈ_q>][BյsuԽf`B%n_BŬxO JNYzxIWUpJͽKK-b7r i'(sZ3krO'cy:a0Yhxx@818i?ѹO1/uJ9s7(yMGR^8}5f xzo\!\4+^!=R=~Y ̩2:'a3xTkh?@?/2|.hnSpR(A֫CC+T/b5S}oK%/lZwn0O 4U&XߖZ>5!.zः ѧ3)/ h / %㊥esS"1HXB#~}Ny}_Vm"Z]vPeU.LO:Tߴ[.x!rcb<6~?4k͈P8AXU>ܮ^%7cM)hPأPs'%>4 nȘ(qaeM-dӠl{4~VIr#>q3A/23Vdׁ*'י#MR=١.9 *Xif>$s ;$sK.8p6J* :n#zOgץT,6lA.V D>Zti>Pup-4c涶WCGZ% hqea<Cs%*yjY+q>P'Kdt֥:ܙ=@ Cb5ғjMz2񂯂QWy:dSsC,z>-^L, xNl`@ ([c7zfl2t b ?|`6l+W|{n&~ U]Kl%Nld`^a{D-Q}왒")#Ti&ڕW^c.у5`9ղVmµ*#E8&\+I)0 =.^;i9SD-Д|E8a9lJyu/d7S*B/+>O Omm*, O Ӏ9H5El0, p׿ }i_ >,-  yۄ 5gn{6[ni&G;> 391.×Ǯ{ ^  m?Pn6(HTGub{:BsJ]Ks*S㖀~0'o6 g]k9[CSE19};(K5*C}vs3()%V ?smH,bFP# C#L#tbhsA&+(-X}~?ȁpĞvu6"ukQ:=%i BWٟk\X<Шc!+n3lssU YH]eYol-`iAW61Q#jX&X':+{p5,0aS|^f 7БT<7{n(Md]%jA-^aD*$c:x甭\,-qF/ h\ jD\4},Ǩ,u@K)]%7n}Tjݑ|qGW=?i8boA >NvL_8S' v6I˴A;Q2z,sza[jߒF{}͖&>A]C#*-N,tͶ|cX[Wn Igxw K#0R[ s|dHH }H6B3k\dZ# s y[%LZ jn YmN򀴼3`8lh5fx([^Yg}sqpIr/д{))ܶ".bdx9DŽ ;#}dΥaSEPwudO'FȑW&*' ;V%7 htBł)ޤ f28h6 I8t jƿN.99/)(fʂ+k&Եq?Tl/E h[$"no5]&b|?#^RQ2rk027/$F`gzBwćNY]w|T_݆*~xP>cd'U nb&7hN󥜷0Pޕ~IB0?W;c3~ҐZMDJ`IroTm-A(K5W sy5ȁtwóF/sLJV pfk}F^u]5"C҅@f# ,n-4)})،{Oaą se ݤn/.kwFTqÌkl.!F(̧Iy?3Px0&րJKDRok*L[rնDq DKrR܅e'ekJ]o.x%rt*j0Fydb,\hgnZ崢Sz!3sDt;Q^`Cз{D43ȒZyt 9%z [҈'̞eL''~]2Og3] J}hq6"TeX;ڠ ARnGcmt;EPNragP<* f#ґ W=d|M{_g`%8VU!?Ue_ih"C!]  ۘ~.o&bGGiOXe4G|p a5)PxF]x&5ipޕyy@~Zs`NE 4&=ܘC#iDa80;&EtVnd~6 YlF-]xܒ;8o+u`t̐ Ӝׅ x7h5 GpH6\cPˣӡRXHd-&Fnk>kbGNq0ڌ`um!g5PjCnd+_eqf81q [5Y a_v:K.+\0Rw=\ҸcS!DA' `,uj"x#!̢s{L<>0:I:.C ,98+OQ%Fž[PO$Y*~XdD֭o$;x> S8Ȧ*# ,`?гVGUh<Ҽ˗gl2ձz$rORګj Ru@_KB֍{LLz@xChAV_=u&.Qt^L*%CMJ"z ќ&gc5X4tUݧ^I!rv(r&s!]>j8>CadHD vo,"i"{"W{<*M&E7BЫ!Pv #? B.b"ǎeqe|kBcT;r&:yӦ#튃xdu!C~88LKعDV㾟Yyf!$U|2Zy&Xa0n"fi9ܐѯR%x7,uр0s|a*sPI9`Ȇ}#\7Ԍv}V#TN9w&mqPN!Jec>2M}ѧТsh C_ &`,FhpHTO)1kq$x6ز.ޕhPN?OVc {۝SsAp_Z_2:._́ڣ[9%5?e-F%޹S]Pڨ5.a xͷ'ہVl9í$ﴲ7zX=cRzqdbuҴTnX XD4ַ'+ ]xsC H<.joi93؁ 7b\1¶~}PDLH5y0_ t0x@Ecg$"$oͯK\҈Ύ}oNY4:wFw N X]%%XuV>gCܛ,1fgMJXBagӫS)iQf)ӱSWLA㾭7Of0<trPdNPhsI4=;z #uʥ~{/#]`P@rҎ&Gs"((E ~x=˨TJe @5MWAS-"%b$Q%;r>$:P64HZ.DdT@_e 8<okjªg"sv#Pz.V,NP?8{?V_Hjp2k#[yea _vZ1s"Dz"t%?{62Td9F_)-*@WNH^D)bVW6s?LUJ;FiF%Yf'tdZ$=1yQ@53Y4-F> 55 T!0(M03&]PȻ:2#Lܫpg7,`EU2(Byg1ZBiu8Z$g }"a#RdH  32aW֕'JNjW- F4]* XF%[`ޥcA5= *W9|3+ - ۆ_.b$kbsX*o$ k5h ]z=x IF̨e# J M=a^4ùx57oUTפ[-\͘$pD.̺kL,|D*/IohLu K|#2Puj&U;O8t wI$aZӳV.[Yj԰9-Y^20SU&KQH(^wiaҴ*vPg4s3Tcy{C FG* G&>3+ah;BDm揘l@1|xAD/q(p}۪]J>8I.'W0DyGڝ8 |~05tY8?`1'm4rHd?~xO#,7˰ŻAYgOT#TI" w튙,]5?|fQ(c;%б fҐi' B'#{{I7f#( 8ϸZ^AߥKp+1cz:prhQS- ~9>gt,/(s<Ƈ݂lК7 e27^ڙ=z6F7S_|v"8 hyG)X.9]߈y+ghsl"k- p46?&ɜ;qȡ^|(|V5ųԅ[_;3j7 9.h~8u~.1p[֪ "E= j3=T"rܬIfģ?׈p0ׂ>ԉmmeZ+ݛK7Y<Wax~18%ی7G:ʊ- uG$mRg8/f'(>ڕA۝Sk'moЖV;ڙjѨh#3ڏt\68?cbo|zͣ@dSo71s {Ɉ&"Az/{6`u-|vKw/6oQ-}+PR}nAwI*hP|]qi[qڼϣom ֘ii*ǣQ,KL;P/Lo%6жf{ iӆ_:r{4ծlLYSYᢿq'P=(} #.`9<>3C6IV/]ɵ\ȕ*.sk : Y܋0 4d! jXp069d1ΨL,Ql<>k;W]{`c;ӒMQ㺙߼,SHGz~tMSC (XoD*a91 -J[jQ.n`D5N RPbН9R6/hڝ7+EQWj y 0xK/ĵU96zG)W:?Q& 8&{BEgEC.,.GLac,]٠=P|+!!B&x y1'& ai< B'~(XNr}&4 ӴoT {t=R] t=d=ݏNld&dIQ+FTܶ vIˠ3t<[uzA nJbkD^`NJGV$2JJO5"Nb{QlRgx(d Y}K[}+ԣ ^wNy \ HzeRcǠ@qQ ?(K&^ TIh.P%IL*ޅ_q\hI9ԫzQ@GK7J%·M+o5dS$)ʯ,77Ѩ{er}!dd O,^\phd{uh9\u?l!j(Fˈnw|oATOœ-(QD]qOřZaz [#9>L2FcCJC"%ꝷ(wCHmf1 vTڬ[MioIv?OtA⿐5*foeRR]0N#T@rsU`K 3g*9~J6Z$QXxBXP CNϜαw*z]0#emi5M%m );l"֘U⊪R]'C<5n?a@ouuPE =<FcI7sFt1RQlmt1\Ѩ5 -T*:FU:V  '\7(Rm'r+ S|7#W hԊ^f@\"?0SVos@v ĉ&= o^KH70v~[Ug'\&upf$_#;2a4z9}3$#HSO"cFvJdەq^@ #X"3D* u|U +K6;@u}a6Œt,}nL4Nm_(H5Ǔ]J,!K.i^{9I)R e[atM;}@z=YU#Qw)3Lvk?Q x8Gd JzXjY-. FYarثe_562`c:\-Kll-5ƕyNi%uF8(O&یڈJS Sg~QfQ=Uǁ)؈?os0˹~"9SM aR93aJ3>W y!nsࡠk>qc#ۯW#}1dF+N2 W"f@1<~YڜZR[LH;E0Xܜf^wY`:'1La2Cu4z6>l-ҟLYk .10_m*Tf p&k y;a 8B3crNT@XoE:N'~BGު3 Bcўya*Y %?=̳P\8Sb"rq$WjJk;9aW+znv[~_Dxoo>vL`_꤂Oh^z /v5s|#P~$34e3 xsJ}ASM ;72*m9Gb;X-W3?ћo;$pcmTjAC g'Ic(6u\/÷hlhˉ}Eʙwd;뭍Cbu?ܩ(`u9*rP57lo*spSXpi7?P&MoM9t*Q)YsA~V$nvR [X_u,=ө5]:/o:ߴZ A3<޹scj[lQ+M$[=_Nvq*+a)O}~%q/vr=0t kGՆPʩ4 B\>4b–9[tdxB/%@5ZBY724LҋPJ `eͱ6YH5|/%\SH|Re-/ ,6ʻϋejpgǖȈtI1)Q]rN8l):8A%#ޙvs>.TsV::D:=>EKW*Thr({E7fZ0cZ,40a&-W +K!?VܝTMw(ny *ˆldžVaaR]*~ iaѦ{#q\4GCC4sՉ~;ݥRb\vD]`5QV*ֹ۠5Y.$f^HHJcezLoh7;sGUa1$5;r?qTPEzOqȿ2:RD Bd2_o`>9Ӫ1GpPYh2a*K@I>{;8r:2* ,ծtvgXqZ8|Dra̫+vd=<vSQ,-`mpijO F1UuFYN/ EwYc`"I-ZàkF1.zuq~@#" (9g7 +ǔXr9JkZ"Fp͢h\6c'l촷prp2ط˙'7~o|tQ ~Fձ C05k;Mpޯߠp%-5 o!ZLunsW9JX&fJpM6͔ߢ DX;$:O7Nܹl[i F A=`~Pn-Ѹd.J#dҔ` *2j/'[ǔ)X` Ƌ␝OB/jdP >?z__ފS<(%|&ÏyF"2Hli6B3?{??x3az6iXN":p,+aWq/;.EU}6;gUo||;}y) ruhd$RXax;_{^tr2b e*" YҨN G\B$Pb"a/Abm\g0`FxdsP:%#A.8q#`;*5c| 7j< ɾ!9YQ5޺f/<(BòiowL/u&ЈX;zn `!+ϻV~*:z4[l/|)Y-1@hPҨGo/S~P'WsMjShI咣޶"'%h8,J]"㾑6pB+I\ 1VeЦn^֥pBnM1Zħq)9k>"XCHM(%._ h֟pPLUỾs8:Ƚ=4O!ºw]d.U,S]ͩƢ?ۑg`hHD zQzq \+:v3D<@bb CCWE*a`D;Tb9 IJJ/ATٞ2uR*7ӠlYmvgĚ!&D#<3 /xoh{u|RN4͝p\ NkcfϠ&F`SFَ Pui Q/K;j;ԻYR a\4mj#ͦ+-%f/ +UVwwG1Vl@L$j<Qe _r 6?SsKYE9uY+Fḩ҂x&thrhB%vOC] #?Y}ܞb#~9ݹd*B;cW.<6߱)W`6s:&ebҵX.D@M"[p};e*ttk>])O(?oyy̪dRʖWQza>(>u  :?l;^I$?%\Ӌ u\>%7 OГNjK󄷄ٖ7 ).!G3> g;6#{h +!A͟8PgJU6:n8݀kvV{tЫԄ)24Gߘ~RgEڷ;-REN=/|P\R ί^7 [PdWU$-ײ)'C㎯i"III2]>HGA_Pny-tB7ի8NO7,U(&].Q1Na?<{[%6tZi&=c! xٗ1(zO `C!%l&C+MFBܩO JC&;e$r.AAa=r y!8'`9r\ѳRS*U4>y'nIcTpgdgKC-жJ|t:Θ؛v|92[2d?fr% bl,Jt.JvR:.{˚TO<"]Њ//2h\~Ӻ/0:&HmH59F(4)07/&M0l~EsjV2E/T8+hP? g#s5Jz|d",} # `4wIi tVLNo DKk4L/+A=6e "ʅ_ЎPc̣KF &U(;RoeKPJUsؑWM8yF ׇN`VZ}7!ںy5[&ƤL{u>rA(bD:<_[FdQ+!~K6V&ڕrSNHL7=X4vL4%Ɂ_is ,&E3]u= 5)nɹbuBLt竕y<H*$"(Ґ"E}B"k2Z@yf/_Z9:l Zޣ(1Wil:އdV_dj bۼZmcvY@rh3.}pZY\>Mmjbh[ `9yEaHGR+_t  2 F9\񟖽 [$՜SRׄ$Ͼ+jG+_p؜@|1L=u`tMLrJ#&1d ;DKi_abVd{}6LF#ia6 ^Y0`:Q ;S*5㧟LoaAG̥7ON\%LW-܄Ϻ+%T֐9 K>F.%[\8PNήUJbNO *9g!-3' ff'X3{@RމI $.^}Cg.Ʉ9׋#NzI# U=kz8>eAz;ck&|M3ځ}mޕsa2R<7W{LDݷXWXQ oz GZ=|u&;.ly!Z_-w).{Ye}4 jUJ> E౥"汷ս"cZT o*qqpw57.Ѿ*BWɿE&*7nΕS\*yZP&6XK>Qx*)]LVsZc٘35c2z ԟ+gC>Uaz qQ,:s/ TRYQtt['rdiz]ڮҹ|l9?xIg$LKhMZ5UʧdqLCf`T=te~RshКi5Β^]6z9HALٝ҄M'8ASzҎmPĮ \*[BB r*eܛ_怦x][oQ╟ܜc¡?{W6HԴlwR3-:3Z,[nmO)EEF2kTr!ۏlOp=[,|r`9wX"-|+ ĐW0>5Cot_:aߋt@!"mjw@8. =tjў 1o@xLy\"WxFmǞ"WKA[:_>+wemЀK|.\px2k®3#odJDn Ӹ&4LUʝpBd 8@աED8|r["un?q}a[OX#VǕ'٭b5.Ap?f00_zBG"mؽ;5<u§f=Pbcz)_';긣v9s~cFC2 fg)&O W\J8 hj6M)`QK `'7NO[9P<176}J7a$3 sABg!]$_a@ZL+9L 2e%=JfN /Ow.܊$$oGcWrK Q'aH*5?VjᓕFnwtIPjvTRڼ9u-rJKdloy280b;L\5& DY+D-f9eOd=,7mÐ+B^eA ?A2?)=6b;OPv|lbfF92)BlP[VH[T9~ͽ"6WLOʆgN8̰E eZ[Wd(l=KFt x vAåߋ"؈>]c&/K_GC[LGWJ/: gOm?i0SQ 5';lbVHFC4 FfpAARO8?eRmN|DJ[4tj| *w䦦K0zK 7yW ~b~MQSgK#TW_U0SM5G 1]j}d}Az ;5mˈ߳8\W K2N{WOZ#TNbtAKzT5Jj"$i0L&6n=ȇ?=-ln>~C*EU hę?VwE=^g+#äF`BXu#{O/='&6LꕞP懫Ҫ"\ỈdKކ =h|Q*pnl|:4jSdUWυ2l9|6!T[Dl{:H`GqC?V/Tx !ǧ:Uս=?,b2xK-NyAN4"]ב |)tz[ϔbRU#㲼Z]e  /,)Uz`O|x0f LSϱA#\"hA:;'*>tъΟj <o(}lcld ,ѹc`#T@?ծ}&.R1힩)?"8;xLD$QrOJРSdRU.]i-,ZMHpDmZȠGasK7hۮuCCy)3 cMPAA@W'x9A@aLV 5wȰj_ؓKlfdWw7AE7F0x1|UP1sCnYhE BszT.TԵEQ`nن'JKgIf!H Ӌk\Lc3CZgEDP`!lgǫ`zgz`<7aN'9?1<.#Y]\20FbQurmSFNz|Q9$hL{17ow/^*-kBs=ÃzCPFIˤ)j }i-~  I}?[>mklVoOU/8)ՒGIY̓(Y |3\3Yrd:e0ÜVBf84Ma}$ˊO,j 3ź~_ {rm+DtuJ׷[f'"׭C4ӥrthe88oQ] OSiYFcXp|VO#~=v׃T X"5*`bkH,p2n"xÑ{8bn uHd̽F"G#QXZ 9J' 1 otY,ջ! D*Hh<Ε!cÙ҈80 N 7EֱN@TyA腏 v)Z-)˿,X$YKXI> gdɦݭ,6 ]\5VQiz"*y6˨2o r;NUu`盎ʳd:<_0'Oenyĝf$M! d\?H<ޗi<EIf+z !0%m+^EL_9HEiP6eZԎjv =?7u/}FqA7DG)(8T}S1Iq$?S="m2HiHTmV85D!{bsj #!$ O.sAo8'b)q4W:9B}~5[oLxW;2H4+·͔PzrM$XWvA2K>80\& {>ߣ8dShJkiGKC)9֦@Rۺw:r,ia|CJlyj7 Xߜ@t;_k=E :; M]ɒSɴAysdt1]O^OSY' $v܅RƬ˃}uc~ܟosv@D@w0qI[ZTLo+A#3ˆ s oq phS=5רl>u%Õ$_׀ BC?$a/zsqKJ;n%d+oJ Ě_椢j! '\XF>9x,yQN5?$SC~AΖn]47ʄ+׶ś?R'! ͭq,x6Mq 'y=Yq}wZlb t%Rʒ-',tѫ :ȞkzIXTYTLOݺJf׭aU:CĨΊؤ}z|zzEUW l )!́{k9/5&jVOKxp%hy]ӥ$"KKe[)6|x1V]uUz<4=OLof>YI T@-qbMO _o|gQԓ?6ZTu0 lz@ fwMO|Gߵ)J5LW"3?* Ҝa3jY>~Dy:<+q0#ixȸ [tj郓36Rčat.Uc `k7d}Ƀ+xv0Tt4YЈ +H9e3q<6*@f ҧrnM=yb?'s{X3JhpuB|&}J'T1622ztTC%RT>h;5*}d9`qޙO`^)E,W`lφf#-75"rJnDQ D7zA4bk|K˙wG.+ J^7Nn2#х!C}Qz8JH=n3Og`<\#xY!]ψC,aufE*2+r.ĨKVխo!Zj6:1ã;FnsO7@-b$Wt֥4Yݢ=RC vw:{bQD5S6-9jd3ReE* z3_"` [QwFD9LJ$z{5rP;0o,7H˥M/ܔv]3LæpEĻz>04NE-k]sOԗ睉ᱏ \݂ͱQ=b+Ưa*`|pDxv]o ,]yLpOf'ѡ"J-Av*!:O^݊nw%N;y碼dhqS*cze\{SR R{.Zʢh6M~ D^0G} r6NĄ1o82^̰/_t-X"LG۵ G*xVx+;9IJyM9v+yϢo֦ / #h&t-ȉ<,(h*=aLx 2Ǣ cnn`T5pJٕ~axn4j1W] d'_pgۂCȰ#!~y>ԽRwXUS*tm8Cr3o3`ս!G6U3h 4T$圁ִvۯc,M-JS.,l#NBtQىf ny2MpOa/ D{b_T$9ϼ(hxګqc7-ٖ;5(1hzccn`&)w)9Ws)훯m`NB jgL[_F's{ ~z6Ŝ]2ojK M$2U "zx}}%f"NdWh6n)at8PjoU ʞO{^_w)!*y~"x|*w&?VPNyT^&úC4#/V??[!T&]b>skUud$:A_M@9R /=:{Jj2s»7 ;Tw^-GtܷlHMCS3XDPif".5e( ԩ*Yh췙gN ’dP8A\I š|p3J5ꒋ/T)}[=ce.wj$ 1\hۆ|p9sQ0%g-dY$']}L}?P:y;mFGLm_ ?ϰf? V 9{Sr(0Kw!7nxEй,Rv71Z[G}FNS4t,"Sp:-Xky&xC'`ʨm9UiգK(_1{*OuE$kDŽv!^k̳q[sa92nrj}'0}4 ==@=P ֥hkFMBxjX,ġ WMp, =TمUv&&?};O+-Q+XI}a q2?6$ёS`S>f[@l؏8*dfbfB&Gh7^4:gxيAӛ\&AZFu$*;f` }( 5]pYVљB>XN=|RB \IJiXiXYgUiu';ZcfLp{yPpI@Br%lOs*Сt>K cU/]s(/:k3,q|ß%5q.,S㗚;$]&{~o #g(@ok9nb#*&aLoM;luoźҗPɟ'u&nJ܏< .F&D5d(G!|a[%5 cH٤ΧeG3 }Ug6bb>j W$٨ܿ-̀u$҉ ePrMf;Vm~#!m&.v<DE,N*;¨|R8[!s{`mdrk*˂kxo/س)(_&,m߬9y'&^qcgSѦ_}ɟ03XN4X'*fH*%$d'{&>)(zu46/WebQ,6y E0x@㓁YuHŶ_ ѐ/dWC_=XV}N04T/du.JڣKeBz=g6Ӄ_ynug8u6Hۗʻ5us\J?AT;= `ЩD(uikB6.bW,'%4QuzoR &?p'GC $ WoO%DѦf{-\-|,\ůOwn!j -P$CMTniY %xr=o쇖ea>6"9Kdpe &$buj8Hp'Ps Y5gl[OԪuqgRSye8FIl4m?].ODb y$ڞ #,1}?Q)̪p@u2K' uhD\øEo"dA5jSdɱt&_Fu:\=vAȃ{> P*p>2ݿrI3szXiA\!Y}XEeKU-r<!U1cf3 ~=y@pVZ9XƳAVc@OaQV_v;xEb >BCF镀M8IJ1ϫy.OeqfnU-폝%]C͉N0\ЗW覈?Ȗ41n[㟘y̮v-y$U%7\ûbNHCTlQGN#rG?Fđ&Hߪl4&WD^)*knID%~{IVA pbF`$wrb9#f@"]*=VP"Kv,+!_vϚtxˑq޷r]̏˖dc%: :Eh\@xMaqn/„i:l/s^R8+ !_l ׯ<1Qg󘱈NaNO"GK;OqiS_UIqU%Ӽ98#! '兢,\I.z sQwpUtM dX5ZαppɀZ:p\UA8w<Aa:-/ڨ`-JssucݸNɁbwPĎNWZ%g_98%3*ܾi/&<`/P%SL$G_D K)G(qPY_RD:2dI1t?}֩aե2j H&x3.Hwe>c76^[.6# 0όJy&H={ †^b m<4@CEЌr j_4[ t}ZA[.9ct ff@vKp%yU÷4v lI,(zi'yVD0,SbFRk̐R -X 9lM䵯C-? Md6 +}:sE)=ՁKBUm\:ڷ]<؝ѩ{2m PV$ i3Qճ 1$s׻h+:[H"nnLtu9x^}Uđ1|c[owJoݮؕJM6:xPx R}o51)"(> iì,#hC<ď|,|ghĴF$Gʝt \ʀ⧒Lneмמd7VJ$CKpro&e<&̦E{rƿeNo ,*Lc+gª\,t-3VyAbv6Q(_G1#ǩw7eo#e?ԃK]N?b c`0ͩ( 5Zw+e8`/R@#HOJ³^s3w_N~05KRVdH8b<q|LЕ(J;£S8!Z*>CƔ%n"k6;(PP0e ҞtSP8Cd07ٮ ݔ"JLQ{s؍V@vgWhm_= X"Z!,fM $dU`y k%:;]_1%p?Wb}ZbzKjs_){e9Wx|WԜT CWl̙>(6@r(r W">o19hSM&Hf7-{Aq35.e! TSOָ"ռ]6)bz)t˜(a& S61sFklJkD`KEa&OѦe9Ni2\0a1|{ah}aU h+(DL> J(`<3 ANh,=h]{eboHhQ[UoXIj5>gKNBS!jD%snNDf.ňݶ0fE Ͷœ3;I5A]u⽩m֧*o.?%FVai݌] w>K𮝎"0vN|T]s:OCS d v bfTg_dۃ$[\$i% K{a_wWޛ/e-}y@ܬ9 eZu5Ƕ=U&/ЬTu=:Q#b1f+>sI0+ -\=4+OU|_[CERT>vm*h=_4"Iob[uZ%HgWŐq^x>bIංHޯ@g9@ [㞜.&\': (o#;6`xz~uMٚ5{<;fNz$ݑO1ܢl{L>L+?f_mOKgۅiщFbvkgAW|o yr%sy '-+4-k|z{nLQDxAO0<` SPW{%ivѷ#5:PfN aaG _^HBTg/>LqȈu8:$~d$py Qܔ=bqfz_t0;05 Qs*_ct XTm47ziE[HĐJK,BYt#̾83Q4ʋWA%tMڡyL7ĉa*D)݀8fuvq7U-=16/wD^h\%UJǥ M?@(=D 5`=@S7$Z˷w_UY漽̹ E䮹XbO.}_4n,)03pU^\]sĔ&`kְS<:K:цzrT0&W^uFyC}z #^]"eb׊W9/DK51~jc'@:J{FJ]T:><3ͤj;מҧ5g+X}MvSipΙ/y3zg7rHa7+<  ׃#>mdR֖zN4Ïܽfm=ТʨZ6K?tPN2$XcФܳhbCR 176ZCq![+p;/Ώ@0]pn'ACO|:4pHE^]hy"P͞YLbRI@tD K0~pF6ҭn<.qs4CΞϠ-hbkC g!r/X/H  nƄm <`P^樱>X"DcɟKb PSs{z mv?W[}1NK(Xs4N ֐:>'2&4c0 =_#n>0 YZtimeSeries/man/0000755000176200001440000000000014550733426013147 5ustar liggesuserstimeSeries/man/base-diff.Rd0000644000176200001440000000227014546302210015243 0ustar liggesusers\name{diff} \alias{diff} \alias{diff.timeSeries} \title{Difference a 'timeSeries' object} \description{ Difference a \code{"timeSeries"} object. } \usage{ \method{diff}{timeSeries}(x, lag = 1, diff = 1, trim = FALSE, pad = NA, \dots) } \arguments{ \item{x}{ an object of class \code{"timeSeries"}. } \item{lag}{ an integer indicating which lag to use. } \item{diff}{ an integer indicating the order of the difference. } \item{trim}{ a logical flag. Should \code{NA}s at the beginning of the series be removed? } \item{pad}{ a numeric value with which \code{NA}s should be replaced at the beginning of the series. } \item{\dots}{ currently not used. } } %\details{ %} \value{ the differenced \code{"timeSeries"} object } \seealso{ \code{\link[base]{diff}} for \verb{base::diff}, \code{\link{lag}} } \examples{ ## load Microsoft dataset x <- MSFT[1:12, ] x ## compute differences diff(x) ## trimmed differences diff(x, trim = TRUE) ## padded differences diff(x, trim = FALSE, pad = 0) } \keyword{chron} \keyword{ts} timeSeries/man/fin-wealth.Rd0000755000176200001440000000142614436330754015502 0ustar liggesusers\name{wealth} \alias{index2wealth} \title{Conversion of an index to wealth} \description{ Converts an index series to a wealth series normalizing the starting value to one. } \usage{ index2wealth(x) } \arguments{ \item{x}{ an object of class 'timeSeries'. } } \value{ returns a time series object of the same class as the input argument \code{x} normalizing the starting value to one. } \seealso{ \code{\link{returns}}, \code{\link{cumulated}}, \code{\link{drawdowns}}, \code{\link{splits}}, \code{\link{spreads}}, \code{\link{midquotes}}, %\code{\link{index2wealth}} } \examples{ ## Load MSFT Open Prices - INDEX <- MSFT[1:20, 1] INDEX ## Compute Wealth Normalized to 100 - 100 * index2wealth(INDEX) } \keyword{chron} timeSeries/man/base-subsetting.Rd0000644000176200001440000001060414546503312016530 0ustar liggesusers\name{TimeSeriesSubsettings} \alias{TimeSeriesSubsettings} \alias{$,timeSeries-method} \alias{[,timeSeries,ANY,index_timeSeries-method} \alias{[,timeSeries,character,character-method} \alias{[,timeSeries,character,index_timeSeries-method} \alias{[,timeSeries,character,missing-method} \alias{[,timeSeries,index_timeSeries,character-method} \alias{[,timeSeries,index_timeSeries,index_timeSeries-method} \alias{[,timeSeries,index_timeSeries,missing-method} \alias{[,timeSeries,matrix,missing-method} \alias{[,timeSeries,missing,character-method} \alias{[,timeSeries,missing,index_timeSeries-method} \alias{[,timeSeries,missing,missing-method} \alias{[,timeSeries,time_timeSeries,ANY-method} \alias{[,timeSeries,time_timeSeries,character-method} \alias{[,timeSeries,time_timeSeries,index_timeSeries-method} \alias{[,timeSeries,time_timeSeries,missing-method} \alias{[,timeSeries,timeDate,character-method} \alias{[,timeSeries,timeDate,index_timeSeries-method} \alias{[,timeSeries,timeDate,missing-method} \alias{[,timeSeries,timeSeries,index_timeSeries-method} \alias{[,timeSeries,timeSeries,missing-method} \alias{$<-,timeSeries,ANY-method} \alias{$<-,timeSeries,factor-method} \alias{$<-,timeSeries,numeric-method} \alias{[<-,timeSeries,character,ANY-method} \alias{[<-,timeSeries,character,missing-method} \alias{[<-,timeSeries,timeDate,ANY-method} \alias{[<-,timeSeries,timeDate,missing-method} \alias{head} %\alias{head,timeSeries-method} \alias{head.timeSeries} \alias{tail} %\alias{tail,timeSeries-method} \alias{tail.timeSeries} \alias{outlier} \alias{outlier,timeSeries-method} \alias{outlier,ANY-method} \title{Subsetting time series} \description{ Objects from class \code{"timeSeries"} can be subsetted in different ways. Methods are defined for the subsetting operators \code{"$"}, \code{"["} and their assignment versions, as well as for some related functions from base \R. A function to drop or extract outliers is also described here. } % \method{[}{timeSeries}(x, i, j, drop) % \method{[}{timeSeries}(x, i, j) <- value \usage{ \method{head}{timeSeries}(x, n = 6, recordIDs = FALSE, \dots) \method{tail}{timeSeries}(x, n = 6, recordIDs = FALSE, \dots) outlier(x, sd = 5, complement = TRUE, ...) } \arguments{ \item{x}{ an object of class \code{timeSeries}. } % \item{from, to}{ % starting date and end date, \code{to} must be after \code{from}. % } % \item{start, end}{ % starting date and end date, \code{end} must be after \code{start}. % } % \item{i, j}{ % ["["] - \cr % index arguments used for subsettings. % } \item{n}{ an integer specifying the number of lines to be returned. By default \code{n=6}. } \item{recordIDs}{ a logical value. Should the \code{recordIDs} be returned together with the data matrix and time series positions? } \item{sd}{ a numeric value of standard deviations, e.g. 10 means that values larger or smaller than ten times the standard deviation will be removed from the series. } \item{complement}{ a logical flag. If \code{TRUE}, the default, return the series free of outliers. If \code{FALSE}, return the outliers series. } % \item{value}{ % a numeric value to use as a replacement. It will be repeated a % whole number of times if necessary. % } \item{\dots}{ arguments passed to other methods. } } \details{ The \code{"timeSeries"} methods for the subsetting operators \code{"$"}, \code{"["} and their assignment versions, as well as for the functions \code{head} and \code{tail} are meant to do what the user expects. \strong{TODO:} Further details are needed here, despite the above paragraph. \code{outlier} drops the outliers if \code{complement = TRUE} and returns only them if \code{complement = FALSE}. All functions described here return \code{"timeSeries"} objects. See also \code{\link{window}} which extracts the sub-series between two datetimes. } \value{ All functions return an object of class \code{"timeSeries"}. } \seealso{ \code{\link{window}} } \examples{ ## Create an Artificial 'timeSeries' Object setRmetricsOptions(myFinCenter = "GMT") charvec <- timeCalendar() set.seed(4711) data <- matrix(exp(cumsum(rnorm(12, sd = 0.1)))) tS <- timeSeries(data, charvec, units = "tS") tS ## Subset Series by Counts "[" tS[1:3, ] ## Subset the Head of the Series head(tS, 6) } \keyword{chron} timeSeries/man/base-scale.Rd0000755000176200001440000000353114436333131015432 0ustar liggesusers\name{scale} \alias{scale} \alias{scale,timeSeries-method} \title{Center and scale 'timeSeries' objects} \description{ Center and scale a \code{"timeSeries"} object. } \usage{ \S4method{scale}{timeSeries}(x, center = TRUE, scale = TRUE) } \arguments{ \item{x}{ an object from class \code{"timeSeries"}. } \item{center, scale}{ a numeric vector or a logical value, see \sQuote{Details}. } } \details{ \code{scale} centers and/or scales the columns of a \code{"timeSeries"} object. The value of \code{center} determines how column centering is performed. If \code{center} is a numeric vector with length equal to the number of columns of \code{x}, then each column of \code{x} has the corresponding value from \code{center} subtracted from it. If \code{center} is TRUE then centering is done by subtracting the column means (omitting NAs) of \code{x} from their corresponding columns, and if \code{center} is FALSE, no centering is done. The value of \code{scale} determines how column scaling is performed (after centering). If \code{scale} is a numeric vector with length equal to the number of columns of \code{x}, then each column of \code{x} is divided by the corresponding value from \code{scale}. If \code{scale} is TRUE then scaling is done by dividing the (centered) columns of \code{x} by their standard deviations if \code{center} is TRUE, and the root mean square otherwise. If \code{scale} is FALSE, no scaling is done. } \value{ a centered and/or scaled \code{"timeSeries"} object } \examples{ ## Load Series: x <- 100* LPP2005REC[, c("SBI", "SPI")] ## Scale and Center - X <- scale(x) hist(X[, 1], prob=TRUE) s <- seq(-3, 3, length=201) lines(s, dnorm(s), col="red") } \keyword{chron} \keyword{ts} timeSeries/man/base-attach.Rd0000755000176200001440000000350214436342653015616 0ustar liggesusers\name{attach} \alias{attach} \alias{attach,timeSeries-method} \title{Attach a 'timeSeries' to the search path} \description{ Attaches a \code{"timeSeries"} object to the search path. } \usage{ \S4method{attach}{timeSeries}(what, pos = 2, name = deparse(substitute(what)), warn.conflicts = TRUE) } \note{ The function \code{detach} from the \code{base} package can be used to detach the attached objects. } \arguments{ \item{name}{ alternative way to specify the database to be attached. See for details \code{help(attach, package = base)}. } \item{pos}{ an integer specifying position in \code{search()} where to attach the database. See for details \code{help(attach, package = base)}. } \item{warn.conflicts}{ a logical value. If \code{TRUE}, warnings are printed about conflicts from attaching the database, unless that database contains an object \code{.conflicts.OK}. A conflict is a function masking a function, or a non-function masking a non-function. See for details \code{help(attach, package = base)}. } \item{what}{ database to be attached. This may currently be a \code{"timeSeries"} object, a data.frame, a list, an R data file created with \code{save}, \code{NULL}, or an environment. See for details \code{help(attach, package = base)}. } } \value{ the environment, invisibly, with a \code{name} attribute } \examples{ ## Load Microsoft Data Set - x <- MSFT[1:10, ] colnames(x) ## Attach the Series and Compute the Range - attach(x) range <- High - Low range ## Convert Vector to a \code{"timeSeries"} Object - timeSeries(data=range, charvec=time(x), units="Range") ## Detach the series from the search path - detach("x") ans <- try(High, silent=TRUE) cat(ans[1]) } \keyword{chron} timeSeries/man/base-merge.Rd0000755000176200001440000000452714436333306015454 0ustar liggesusers\name{merge} \docType{methods} \alias{merge} \alias{merge-methods} \alias{merge,ANY,ANY-method} \alias{merge,ANY,timeSeries-method} \alias{merge,matrix,timeSeries-method} \alias{merge,numeric,timeSeries-method} \alias{merge,timeSeries,ANY-method} \alias{merge,timeSeries,matrix-method} \alias{merge,timeSeries,missing-method} \alias{merge,timeSeries,numeric-method} \alias{merge,timeSeries,timeSeries-method} \title{Merge 'timeSeries' objects} \description{ Merges several object types with \code{"timeSeries"} objects. The number of rows must match. } \usage{ merge(x, y, \dots) } \arguments{ \item{x,y}{ objects to merge, at least one of class \code{"timeSeries"}. } \item{...}{further objects to merge.} } %\details{ %} \value{ a \code{"timeSeries"} object } \section{Methods}{ \describe{ \item{\code{signature(x = "timeSeries", y = "missing")}}{ %% ~~describe this method here~~ } \item{\code{signature(x = "timeSeries", y = "ANY")}}{ %% ~~describe this method here~~ } \item{\code{signature(x = "timeSeries", y = "matrix")}}{ %% ~~describe this method here~~ } \item{\code{signature(x = "timeSeries", y = "numeric")}}{ %% ~~describe this method here~~ } \item{\code{signature(x = "timeSeries", y = "timeSeries")}}{ %% ~~describe this method here~~ } \item{\code{signature(x = "ANY", y = "ANY")}}{ %% ~~describe this method here~~ } \item{\code{signature(x = "ANY", y = "timeSeries")}}{ %% ~~describe this method here~~ } \item{\code{signature(x = "matrix", y = "timeSeries")}}{ %% ~~describe this method here~~ } \item{\code{signature(x = "numeric", y = "timeSeries")}}{ %% ~~describe this method here~~ } } } \seealso{ \code{\link{cbind}} } \examples{ ## Load Series - x <- MSFT[1:12, ] ## Merge 'timeSeries' with missing Object - merge(x) \dontshow{set.seed(1234)} ## Merge 'timeSeries' with numeric Object - y <- rnorm(12) class(y) merge(x, y) ## Merge 'timeSeries' with matrix Object - y <- matrix(rnorm(24), ncol=2) class(y) merge(x, y) ## Merge 'timeSeries' with matrix Object - y <- timeSeries(data=rnorm(12), charvec=time(x)) class(y) merge(x, y) } \keyword{methods} \keyword{chron} \keyword{ts} timeSeries/man/statistics-smoothLowess.Rd0000755000176200001440000000463314436334072020342 0ustar liggesusers\name{smooth} \alias{smoothLowess} \alias{smoothSpline} \alias{smoothSupsmu} \title{Smooths time series objects} \description{ Smooths a \code{"timeSeries"} object. } \usage{ smoothLowess(x, f = 0.5, \dots) smoothSpline(x, spar = NULL, \dots) smoothSupsmu(x, bass = 5, \dots) } \arguments{ \item{x}{ an univariate \code{"timeSeries"} object. } \item{f}{ the lowess smoother span. This gives the proportion of points in the plot which influence the smooth at each value. Larger values give more smoothness. } \item{spar}{ smoothing parameter, typically (but not necessarily) in (0,1]. By default \code{NULL}, i.e. the value will be automatically selected. } \item{bass}{ controls the smoothness of the fitted curve. Values of up to 10 indicate increasing smoothness. } \item{\dots}{ optional arguments to be passed to the underlying smoothers. } } \details{ The functions \code{smoothLowess}, \code{smoothSpline}, \code{smoothSupsmu} allow to smooth \code{timeSerie} object. The are interfaces to the function \code{lowess}, \code{supmsu}. and \code{smooth.spline} in R's \code{stats} package. The \code{\dots} arguments allow to pass optional arguments to the underlying \code{stats} functions and tailor the smoothing process. We refer to the manual pages of these functions for a proper setting of these options. } \value{ a bivariate \code{"timeSeries"} object, the first column holds the original time series data, the second the smoothed series. } \author{ The R core team for the underlying smoother functions. } \examples{ ## Use Close from MSFT's Price Series - head(MSFT) MSFT.CLOSE <- MSFT[, "Close"] head(MSFT.CLOSE) ## Plot Original and Smoothed Series by Lowess - MSFT.LOWESS <- smoothLowess(MSFT.CLOSE, f = 0.1) head(MSFT.LOWESS) plot(MSFT.LOWESS) title(main = "Close - Lowess Smoothed") ## Plot Original and Smoothed Series by Splines - MSFT.SPLINE <- smoothSpline(MSFT.CLOSE, spar = 0.4) head(MSFT.SPLINE) plot(MSFT.SPLINE) title(main = "Close - Spline Smoothed") ## Plot Original and Smoothed Series by Supsmu - MSFT.SUPSMU <- smoothSupsmu(MSFT.CLOSE) head(MSFT.SUPSMU) plot(MSFT.SUPSMU) title(main = "Close - Spline Smoothed") } \keyword{chron} timeSeries/man/timeSeries-deprecated.Rd0000644000176200001440000000325114546275751017655 0ustar liggesusers\name{timeSeries-deprecated} \alias{seriesData} % removed \alias{removeNA} \alias{substituteNA} \alias{interpNA} \title{Deprecated functions in 'timeSeries' package} \usage{ removeNA(x, \dots) substituteNA(x, type = c("zeros", "mean", "median"), \dots) interpNA(x, method = c("linear", "before", "after"), \dots) } \arguments{ \item{x}{ a numeric matrix, or any other object which can be transformed into a matrix through \code{x = as.matrix(x, ...)}. If \code{x} is a vector, it will be transformed into a one-dimensional matrix. } \item{method}{ for \code{interpNA}, how to interpolate the matrix column by column, see Section \sQuote{Details}. } \item{type}{ Three alternative methods are provided to remove NAs from the data: \code{type="zeros"} replaces the missing values with zeros, \code{type="mean"} replaces the missing values with the column mean, \code{type="median"} replaces the missing values with the column median. } \item{\dots}{ arguments to be passed to the function \code{as.matrix}. } } \description{ \tabular{ll}{ \code{seriesData} (removed) extracts data slot from a 'timeSeries'. use \code{\link{as.matrix}} instead. \cr % \item{object}{ % [is][seriesData][seriesPositions][show][summary] - % an object of class \code{timeSeries}. % } % \code{.time.timeSeries} \tab Extracts the time(s) from a % 'timeSeries', use \code{\link{time}} instead. \cr % \code{seriesPositions} \tab Extracts positions slot from a 'timeSeries', \cr % \code{newPositions<-} \tab Modifies positions of a 'timeSeries' object, \cr } } \keyword{internal} timeSeries/man/base-t.Rd0000755000176200001440000000071614436342260014613 0ustar liggesusers\name{t} \alias{t,timeSeries-method} \title{Transpose 'timeSeries' objects} \description{ Returns the transpose of a \code{"timeSeries"} object. } \usage{ \S4method{t}{timeSeries}(x) } \arguments{ \item{x}{ a 'timeSeries' object. } } \value{ a matrix } \examples{ ## Dummy 'timeSeries' with NAs entries data <- matrix(1:24, ncol = 2) s <- timeSeries(data, timeCalendar()) s ## Transpose 'timeSeries' - t(s) } \keyword{chron} timeSeries/man/utils-structure.Rd0000644000176200001440000000140214546003174016624 0ustar liggesusers\name{str-methods} \alias{str-methods} \alias{str} \alias{str.timeSeries} \title{Display the structure of 'timeSeries' objects} \description{ Compactly display the structure of a \code{"timeSeries"} object. } \usage{ \method{str}{timeSeries}(object, \dots) } \arguments{ \item{object}{ an object of class \code{timeSeries}. } \item{\dots}{ arguments passed to other methods. } } \value{ \code{NULL}, invisibly. The function is called for its side effect of printing a compact representation of the structure of the \code{"timeSeries"} object. } \examples{ ## Load Microsoft Data Set data(MSFT) X <- MSFT[1:12, 1:4] colnames(X) <- abbreviate(colnames(X), 4) ## Display Structure str(X) } \keyword{chron} timeSeries/man/base-apply.Rd0000755000176200001440000001430214435656374015506 0ustar liggesusers\name{apply} \alias{apply} \alias{apply,timeSeries-method} \alias{fapply} \alias{applySeries} \alias{rollDailySeries} \title{Apply functions over time windows} \description{ Applies a function to a \code{"timeSeries"} object over regular or irregular time windows, possibly overlapping. } \usage{ \S4method{apply}{timeSeries}(X, MARGIN, FUN, \dots, simplify = TRUE) fapply(x, from, to, FUN, \dots) applySeries(x, from = NULL, to = NULL, by = c("monthly", "quarterly"), FUN = colMeans, units = NULL, format = x@format, zone = x@FinCenter, FinCenter = x@FinCenter, recordIDs = data.frame(), title = x@title, documentation = x@documentation, \dots) rollDailySeries(x, period = "7d", FUN, \dots) } \arguments{ \item{x,X}{ an object of class \code{timeSeries}. } \item{MARGIN}{ a vector giving the subscripts which the function will be applied over, see base R's \code{\link[base]{apply}}. } \item{FUN}{ the function to be applied. For the function \code{applySeries} the default setting is \code{FUN = colMeans}. } \item{simplify}{ simplify the result? } \item{from, to}{ starting date and end date as \code{"timeDate"} objects. Note, \code{to} must be time ordered after \code{from}. If \code{from} and \code{to} are missing in function \code{fapply} they are set by default to \code{from=start(x)}, and \code{to=end(x)}. } \item{by}{ a character value either \code{"monthly"} or \code{"quarterly"} used in the function \code{applySeries}. The default value is \code{"monthly"}. Only operative when both arguments \code{from} and \code{to} have their default values \code{NULL}. In this case the function \code{FUN} will be applied to monthly or quarterly periods. } \item{units}{ an optional character string, which allows to overwrite the current column names of a \code{timeSeries} object. By default \code{NULL} which means that the column names are selected automatically. } \item{format}{ the format specification of the input character vector in POSIX notation. } \item{zone}{ the time zone or financial center where the data were recorded. } \item{FinCenter}{ a character value with the the location of the financial center named as "continent/city", or "city". } \item{recordIDs}{ a data frame which can be used for record identification information. Note, this is not yet handled by the apply functions, an empty data.frame will be returned. } \item{title}{ an optional title string, if not specified the input's data name is deparsed. } \item{documentation}{ optional documentation string, or a vector of character strings. } \item{period}{ a character string specifying the rollling period composed by the length of the period and its unit, e.g. \code{"7d"} represents one week. } \item{\dots}{ arguments passed to other methods. } } \details{ The \code{"timeSeries"} method for \code{apply} extracts the core data (a matrix) from \code{X} and calls \code{apply}, passing on all the remaining arguments. If the result is suitable, it converts it to \code{"timeSeries"}, otherwise returns it as is. \sQuote{Suitable} here means that it is a matrix or a vector (which is converted to a matrix) and the number of observations is the same as \code{X}. Like \code{apply} applies a function to the margins of an array, the function \code{fapply} applies a function to the time stamps or signal counts of a financial (therefore the \dQuote{f} in front of the function name) time series of class \code{"timeSeries"}. \code{applySeries} takes a \code{"timeSeries"} object as input and applies \code{FUN} to windows of \code{x}. The windows are specified by \code{from} and \code{to}, which need to have the same length. Then \code{from[i], to[i]} specifies the \code{i}-th window. If \code{time(x)} is a \code{"timeDate"} object, then \code{from} and \code{to} are converted to \code{"timeDate"} (if they are not already such objects), otherwise they are converted to integers. An alternative way to specify the window(s) on which \code{applySeries} operates is with argument \code{by}. It is used only if \code{from} and \code{to} are missing or \code{NULL}. \code{by = "monthly"} or \code{by = "quarterly"} applies \code{FUN} to the data for each year-month or year-quarter, respectively. By year-month we mean that there are separate windows for the months in different years. The resulting time stamps are the time stamps of the \code{to} vector. The periods can be regular or irregular, and they can even overlap. If \code{from = start(x)} and \code{to = end(x)}, then the function behaves like \code{apply} on the column margin. \code{fapply} is the same as \code{applySeries} (in fact, the former calls the latter), except that the defaults for \code{from} and \code{to} are \code{start(x)} and \code{end(x)}, respectively. (GNB: in addition, \code{fapply} throws error if \code{x} is a \sQuote{signal series}.) \code{rollDailySeries} rolls a daily 'timeSeries' on a given period. } \value{ for \code{rollDailySeries}, an object of class \code{"timeSeries"} with rolling values, computed from the function \code{FUN}. } \examples{ ## Percentual Returns of Swiss Bond Index and Performance Index - LPP <- 100 * LPP2005REC[, c("SBI", "SPI")] head(LPP, 20) ## Aggregate Quarterly Returns - applySeries(LPP, by = "quarterly", FUN = colSums) ## Aggregate Quarterly every last Friday in Quarter - oneDay <- 24*3600 from <- unique(timeFirstDayInQuarter(time(LPP))) - oneDay from <- timeLastNdayInMonth(from, nday = 5) to <- unique(timeLastDayInQuarter(time(LPP))) to <- timeLastNdayInMonth(to, nday = 5) data.frame(from = as.character(from), to = as.character(to)) applySeries(LPP, from, to, FUN = colSums) ## Alternative Use - fapply(LPP, from, to, FUN = colSums) ## Count Trading Days per Month - colCounts <- function(x) rep(NROW(x), times = NCOL(x)) applySeries(LPP, FUN = colCounts, by = "monthly") ## TODO: examples for rollDailySeries() } \keyword{chron} \keyword{ts} timeSeries/man/statistics-colSums.Rd0000755000176200001440000000442714435106306017256 0ustar liggesusers\name{colStats} \alias{colStats} \alias{colSums,timeSeries-method} \alias{colMeans,timeSeries-method} \alias{colSds} \alias{colVars} \alias{colSkewness} \alias{colKurtosis} \alias{colMaxs} \alias{colMins} \alias{colProds} \alias{colQuantiles} % \alias{colAvgs} \alias{colStdevs} % removed, but leave the alias for now % \alias{mean.timeSeries} % \alias{var.timeSeries} \title{Column statistics} \description{ A collection of functions to compute column statistical properties of financial and economic time series data. } \usage{ colStats(x, FUN, \dots) colSds(x, \dots) colVars(x, \dots) colSkewness(x, \dots) colKurtosis(x, \dots) colMaxs(x, \dots) colMins(x, \dots) colProds(x, \dots) colQuantiles(x, prob = 0.05, \dots) } % colAvgs(x, \dots) % \method{mean}{timeSeries}(x, \dots) % \method{var}{timeSeries}(x, \dots) \arguments{ \item{x}{ a rectangular object which can be transformed into a matrix by the function \code{as.matrix}. } \item{FUN}{ a function name, the statistical function to be applied. } \item{prob}{ a numeric value in [0,1]. } \item{\dots}{ arguments to be passed. } } \details{ \tabular{ll}{ \code{colStats}\tab calculates column statistics, \cr \code{colSums} \tab calculates column sums, \cr \code{colMeans} \tab calculates column means, \cr \code{colSds} \tab calculates column standard deviations, \cr \code{colVars} \tab calculates column variances, \cr \code{colSkewness} \tab calculates column skewness, \cr \code{colKurtosis} \tab calculates column kurtosis, \cr \code{colMaxs} \tab calculates maximum values in each column, \cr \code{colMins} \tab calculates minimum values in each column, \cr \code{colProds} \tab computes product of all values in each column, \cr \code{colQuantiles} \tab computes quantiles of each column. } } \value{ each function returns a numeric vector of the statistics, one for each column } \seealso{ \code{\link{rollStats}} } \examples{ ## Simulated Return Data in Matrix Form - x = matrix(rnorm(252), ncol = 2) ## Mean Columnwise Statistics - colStats(x, FUN = mean) ## Quantiles Column by Column - colQuantiles(x, prob = 0.10, type = 1) } \keyword{univar} timeSeries/man/timeSeries-isUnivariate.Rd0000755000176200001440000000166214436147016020215 0ustar liggesusers\name{isUnivariate} \alias{isUnivariate} \alias{isMultivariate} \title{Checks if a time series is univariate} \description{ Checks if a time series object or any other rectangular object is univariate or multivariate. } \usage{ isUnivariate(x) isMultivariate(x) } \arguments{ \item{x}{ an object of class \code{"timeSeries"} or any other rectangular object. } } \details{ A rectangular object \code{x} is considered to be univariate if the function \code{NCOL(x)} returns one, and is considered to be multivariate if \code{NCOL(x)} returns a value bigger than one. } \value{ a logical value } \examples{ ## Load Microsoft Data - setRmetricsOptions(myFinCenter = "GMT") data(MSFT) Open = MSFT[, "Open"] ## Is the 'timeSeries' Univariate - isUnivariate(MSFT) isUnivariate(Open) ## Is the 'timeSeries' Multivariate - isMultivariate(MSFT) isMultivariate(Open) } \keyword{chron} timeSeries/man/stats-lag.Rd0000644000176200001440000000246214546270607015343 0ustar liggesusers\name{lag} \alias{lag} \alias{lag.timeSeries} \title{Lag a 'timeSeries' object} \description{ Compute a lagged version of a \code{"timeSeries"} object. } \usage{ \method{lag}{timeSeries}(x, k = 1, trim = FALSE, units = NULL, \dots) } \arguments{ \item{x}{ an object of class \code{timeSeries}. } \item{k}{ an integer number, the number of lags (in units of observations). By default 1. Can also be a vector, in which case the result is a multivariate \code{"timeSeries"} in which column \code{i} contains the series lagged by \code{k[i]}, see the examples. } \item{trim}{ a logical value. By default \code{TRUE}, the first missing observation in the return series will be removed. } \item{units}{ an optional character string, which allows to overwrite the current column names of a \code{"timeSeries"} object. By default \code{NULL} which means that the column names are selected automatically. } \item{\dots}{ arguments passed to other methods. } } \value{ an object of class \code{"timeSeries"} } \seealso{ \code{\link[stats]{lag}} for \verb{stats::lag}, \code{\link{diff}} } \examples{ ## Load Micsrosoft Data Set x <- MSFT[1:20, "Open"] ## Lag the 'timeSeries' Object lag(x, k = -1:1) } \keyword{chron} timeSeries/man/fin-align.Rd0000755000176200001440000001076414435660560015315 0ustar liggesusers\name{align-methods} \docType{methods} \alias{align} \alias{align-methods} \alias{align,timeSeries-method} \alias{alignDailySeries} \alias{daily2weekly} \alias{daily2monthly} \title{Align a 'timeSeries' object to equidistant time stamps} \description{ Aligns a \code{"timeSeries"} object to equidistant time stamps. There are also functions for the common cases of changing daily to weekly and daily to monthly. } \usage{ \S4method{align}{timeSeries}(x, by = "1d", offset = "0s", method = c("before", "after", "interp", "fillNA", "fmm", "periodic", "natural", "monoH.FC"), include.weekends = FALSE, ...) alignDailySeries(x, method = c("before", "after", "interp", "fillNA", "fmm", "periodic", "natural", "monoH.FC"), include.weekends = FALSE, units = NULL, zone = "", FinCenter = "", ...) daily2monthly(x, init = FALSE) daily2weekly(x, startOn = "Tue", init = FALSE) } \arguments{ \item{x}{ an object of class \code{"timeSeries"}. } \item{by}{ a character string denoting the period. } \item{offset}{ a character string denoting the offset. } \item{method}{ the method to be used for the alignment. A character string, one of \code{"before"}, use the data from the row whose position is just before the unmatched position, or \code{"after"}, use the data from the row whose position is just after the unmatched position, or \code{"linear"}, interpolate linearly between \code{"before"} and \code{"after"}. } \item{include.weekends}{ a logical value. Should weekend dates be included or removed from the series? } \item{units}{ an optional character string, which allows to overwrite the current column names of a \code{timeSeries} object. By default \code{NULL} which means that the column names are selected automatically. } \item{zone}{ the time zone or financial center where the data were recorded. } \item{FinCenter}{ a character with the the location of the financial center named as \code{"continent/city"}. } \item{startOn}{ a character string, specifying the day of week as a three letter abbreviation. Weekly aggregated data records are then fixed to the weekdays given by the argument \code{startOn}. } \item{init}{ a logical value, if set to \code{TRUE} then the time series will be indexed to 1 for its first value. By default \code{init} is set to \code{FALSE}. } \item{\ldots}{ further arguments to be passed to the interpolating function. } } \details{ TODO: complete. \code{alignDailySeries} aligns a daily 'timeSeries' to new positions, Effectively, it is a frontend to the \code{"timeSeries"} method for \code{align} with \code{by = "1d"}, and \code{offset = "0s"}. In addition, there are two tailored functions for common cases: \code{daily2monthly} and \code{daily2weekly} which aggregate \code{"timeSeries"} objects from daily to monthly or weekly levels, respectively. In the case of the function \code{daily2weekly} one can explicitly set the starting day of the week, the default value is Tuesday, \code{startOn = "Tue"}. } \seealso{ \code{\link{aggregate}}, \code{\link{apply}} } \value{ a \code{"timeSeries"} object, for \code{alignDailySeries}, a weekly aligned daily \code{"timeSeries"} object from a daily time series with missing holidays. } \examples{ ## Use Microsofts' OHLCV Price Series - head(MSFT) end(MSFT) ## Use MSFT and Compute Sample Size - dim(MSFT) ## Align the Series - MSFT.AL <- align(MSFT) ## Show the Size of the Aligned Series - dim(MSFT.AL) ## alignDailySeries ## Cut out April Data from 2001 - Close <- MSFT[, "Close"] tsApril01 <- window(Close, start="2001-04-01", end="2001-04-30") tsApril01 ## Align Daily Series with NA - tsRet <- returns(tsApril01, trim = TRUE) GoodFriday(2001) EasterMonday(2001) alignDailySeries(tsRet, method = "fillNA", include.weekends = FALSE) alignDailySeries(tsRet, method = "fillNA", include.weekends = TRUE) ## Align Daily Series by Interpolated Values - alignDailySeries(tsRet, method = "interp", include.weekend = FALSE) alignDailySeries(tsRet, method = "interp", include.weekend = TRUE) ## Load Microsoft Data Set - x <- MSFT ## Aggregate daily records to end of month records - X <- daily2monthly(x) X isMonthly(X) ## Aggregate daily records to end of week records - X <- daily2weekly(x, startOn="Fri") X dayOfWeek(time(X)) } \keyword{methods} \keyword{chron} timeSeries/man/utils-description.Rd0000755000176200001440000000047514433602271017121 0ustar liggesusers\name{description} \alias{description} \title{Creates date and user information} \description{ Creates and returns a string containing the user, the current datetime and the user name. } \usage{ description() } \examples{ ## Show Default Description String - description() } \keyword{programming} timeSeries/man/methods-plot.Rd0000644000176200001440000002005114546503744016056 0ustar liggesusers\name{plot-methods} \alias{plot} \alias{lines} \alias{points} \alias{plot,timeSeries-method} \alias{lines,timeSeries-method} \alias{points,timeSeries-method} \alias{pretty.timeSeries} \title{Plot 'timeSeries' objects} \description{ \code{"timeSeries"} methods for \code{\link[base]{plot}}, \code{\link[graphics]{lines}} and \code{\link[graphics]{points}}. } \usage{ \S4method{plot}{timeSeries}(x, y, FinCenter = NULL, plot.type = c("multiple", "single"), format = "auto", at = pretty(x), widths = 1, heights = 1, xy.labels, xy.lines, panel = lines, nc, yax.flip = FALSE, mar.multi = c(0, 5.1, 0, if (yax.flip) 5.1 else 2.1), oma.multi = c(6, 0, 5, 0), axes = TRUE, \ldots) \S4method{lines}{timeSeries}(x, FinCenter = NULL, \dots) \S4method{points}{timeSeries}(x, FinCenter = NULL, \dots) \method{pretty}{timeSeries}(x, n=5, min.n=n\%/\%3, shrink.sml=0.75, high.u.bias=1.5, u5.bias=0.5+1.5*high.u.bias, eps.correct=0, \dots) } \details{ Our original method \code{plot} was build along R's plotting function \code{plot.ts} with an additional argument to tailor the position marks at user defined position specified by the argument \code{at}. We call this style or theme \code{"ts"}. With verson R 3.1 we have inroduced two new additional plotting themes called \code{"pretty"} and \code{"chick"}. They are becoming active when we set \code{at = "pretty"} or \code{at = "chic"}. Plot style or theme \code{"pretty"} is an extension of our original plotting method. Plot style or theme \code{"chic"} is an implementation along the contributed packages \code{xts} and \code{PerformanceAnalytics} from the Chicago finance group members (\code{"chic"} is an abbreviation of Chicago. For both themes, \code{"pretty"} and \code{"chic"}, additional arguments are passed through the \code{\dots} arguments. These are: \tabular{lll}{ \code{Argument} \tab Default \tab Description \cr \code{type} \tab "l" \tab types pf plot \cr \code{col} \tab 1 \tab colors for lines and points \cr \code{pch} \tab 20 \tab plot symbol \cr \code{cex} \tab 1 \tab character and symbol scales \cr \code{lty} \tab 1 \tab line types \cr \code{lwd} \tab 2 \tab line widths \cr \code{cex.axes} \tab 1 \tab scale of axes \cr \code{cex.lab} \tab 1 \tab scale of labels \cr \code{cex.pch} \tab 1 \tab scale of plot symbols \cr \code{} \tab \tab \cr \code{grid} \tab TRUE \tab should grid lines plotted? \cr \code{frame.plot} \tab TRUE \tab should b box around the plot? \cr \code{axes} \tab TRUE \tab should be axes drawn on the plot? \cr \code{ann} \tab TRUE \tab should default annotations appear? } Concerning the plot elements, the length of these vectors has to be the same as the number of columns in the time series to be plotted. If their length is only one, then they are repeated. There is an almost 70 pages vignette added to the package, with dozens of examples of tailored plots. Have a look in it. } \arguments{ \item{x, y }{ objects of class \code{timeSeries}. } \item{FinCenter}{ a character with the the location of the financial center named as \code{"continent/city"}. } \item{plot.type}{ for multivariate time series, should the series by plotted separately (with a common time axis) or on a single plot? } \item{format}{POSIX label format, e.g. "\%Y-\%m-\%d" or "\%F" for ISO-8601 standard date format. } \item{at}{ a \code{timeDate} object setting the plot label positions. If \code{at=pretty(x)}, the postitions are generated automatized calling the function \code{pretty}. Default option \code{at="auto"} selects 6 equal spaced time label positions. For the new plot themes set at="pretty" or at="chic". In this case additional arguments can be passed through the \code{\dots} arguments, see details. } \item{widths, heights}{ widths and heights for individual graphs, see \code{layout}. } \item{xy.labels}{ logical, indicating if \code{text()} labels should be used for an x-y plot, _or_ character, supplying a vector of labels to be used. The default is to label for up to 150 points, and not for more. } \item{xy.lines}{ logical, indicating if \code{lines} should be drawn for an x-y plot. Defaults to the value of \code{xy.labels} if that is logical, otherwise to \code{TRUE} } \item{panel}{ a \code{function(x, col, bg, pch, type, ...)} which gives the action to be carried out in each panel of the display for \code{plot.type="multiple"}. The default is \code{lines}. } \item{nc}{ the number of columns to use when \code{type="multiple"}. Defaults to 1 for up to 4 series, otherwise to 2. } \item{yax.flip}{ logical indicating if the y-axis (ticks and numbering) should flip from side 2 (left) to 4 (right) from series to series when \code{type="multiple"}. } \item{mar.multi, oma.multi}{ the (default) \code{par} settings for \code{plot.type="multiple"}. } \item{axes}{ logical indicating if x- and y- axes should be drawn. } \item{n}{ an integer giving the desired number of intervals. } \item{min.n}{ a nonnegative integer giving the minimal number of intervals. } \item{shrink.sml}{ a positive numeric by a which a default scale is shrunk in the case when range(x) is very small. } \item{high.u.bias}{ a non-negative numeric, typically > 1. Larger high.u.bias values favor larger units. } \item{u5.bias}{ a non-negative numeric multiplier favoring factor 5 over 2. } \item{eps.correct}{ an integer code, one of 0, 1, or 2. If non-0, a correction is made at the boundaries. } \item{\dots}{ additional graphical arguments, see \code{plot}, \code{plot.default} and \code{par}. } } \value{ \code{NULL} (invisibly), the functions are called for the side effect of producing plots } \seealso{ \code{vignette("timeSeriesPlot", package="timeSeries")}, which provides extensive plot examples. } \examples{ ## load Swiss pension fund benchmark data LPP <- LPP2005REC[1:12, 1:4] colnames(LPP) <- abbreviate(colnames(LPP), 2) finCenter(LPP) <- "GMT" ## Example Plot 1 plot(LPP[, 1], type = "o", col = "steelblue", main = "LPP", xlab = "2005", ylab = "Return") plot(LPP[, 1], at="auto", type = "o", col = "steelblue", main = "LPP", xlab = "2005", ylab = "Return") ## Example Plot 2 plot(LPP[, 1:2], type = "o", col = "steelblue", main = "LPP", xlab = "2005", ylab = "Return") ## Example Plot 3 plot(LPP[, 1], LPP[, 2], type = "p", col = "steelblue", main = "LPP", xlab = "Return 1", ylab = "Return 2") ## Example Plot 4a, the wrong way to do it! LPP <- as.timeSeries(data(LPP2005REC)) ZRH <- as.timeSeries(LPP[,"SPI"], zone = "Zurich", FinCenter = "Zurich") NYC <- as.timeSeries(LPP[,"LMI"], zone = "NewYork", FinCenter = "NewYork") finCenter(ZRH) finCenter(NYC) plot(ZRH, at="auto", type = "p", pch = 19, col = "blue") points(NYC, pch = 19, col = "red") ## Example Plot 4b, convert NYC to Zurich time finCenter(ZRH) <- "Zurich" finCenter(NYC) <- "Zurich" at <- unique(round(time(ZRH))) plot(ZRH, type = "p", pch = 19, col = "blue", format = "\%b \%d", at = at, xlab = paste(ZRH@FinCenter, "local Time"), main = ZRH@FinCenter) points(NYC, pch = 19, col = "red") ## Example 4c, force everything to GMT using "FinCenter" argument finCenter(ZRH) <- "Zurich" finCenter(NYC) <- "NewYork" at <- unique(round(time(ZRH))) plot(ZRH, type = "p", pch = 19, col = "blue", format = "\%b \%d", at = at, FinCenter = "GMT", xlab = "GMT", main = "ZRH - GMT") points(NYC, FinCenter = "GMT", pch = 19, col = "red") } \keyword{chron} timeSeries/man/base-start.Rd0000644000176200001440000000150314546004273015476 0ustar liggesusers\name{start} \alias{start} \alias{start.timeSeries} \alias{end} \alias{end.timeSeries} %\alias{start,timeSeries-method} %\alias{end,timeSeries-method} \title{Start and end of a 'timeSeries'} \description{ Returns start or end time stamp of a \code{"timeSeries"} object. } \usage{ \method{start}{timeSeries}(x, \dots) \method{end}{timeSeries}(x, \dots) } \arguments{ \item{x}{ an uni- or multivariate \code{"timeSeries"} object. } \item{\dots}{ optional arguments passed to other methods. } } \value{ a \code{"timeSeries"} object } \examples{ \dontshow{set.seed(1234)} ## Create a dummy \code{"timeSeries"} tS <- dummyMonthlySeries()[, 1] tS ## Return start and end time stamp c(start(tS), end(tS)) range(time(tS)) } \keyword{chron} timeSeries/man/methods-mathOps.Rd0000644000176200001440000000632514546254374016525 0ustar liggesusers\name{math} \alias{math} \alias{Math,timeSeries-method} \alias{Math2,timeSeries-method} \alias{Summary,timeSeries-method} \alias{Ops,vector,timeSeries-method} \alias{Ops,array,timeSeries-method} \alias{Ops,ts,timeSeries-method} \alias{Ops,timeSeries,vector-method} \alias{Ops,timeSeries,array-method} \alias{Ops,timeSeries,ts-method} \alias{Ops,timeSeries,timeSeries-method} %\alias{-,timeSeries,missing-method} %\alias{+,timeSeries,missing-method} \alias{cummax,timeSeries-method} \alias{cummin,timeSeries-method} \alias{cumprod,timeSeries-method} \alias{cumsum,timeSeries-method} \alias{trunc,timeSeries-method} \alias{log,timeSeries-method} %\alias{\%*\%,timeSeries,vector-method} %\alias{\%*\%,timeSeries,ANY-method} %\alias{\%*\%,ANY,timeSeries-method} \alias{quantile} \alias{quantile.timeSeries} \alias{median} \alias{median.timeSeries} \title{Mathematical operations on 'timeSeries'} \description{ Functions and methods for mathematical operations on \code{"timeSeries"}. } \usage{ \S4method{Ops}{timeSeries,timeSeries}(e1, e2) \S4method{Math}{timeSeries}(x) \S4method{Math2}{timeSeries}(x, digits) \method{quantile}{timeSeries}(x, \dots) \method{median}{timeSeries}(x, na.rm = FALSE, \dots) } \arguments{ \item{x}{ an object of class \code{timeSeries}. } \item{digits}{ number of digits to be used in 'round' or 'signif'. } \item{e1, e2}{ at least one of the two objects is from class \code{"timeSeries"} (for the methods described on this page). } \item{na.rm}{ a logical value: should missing values be removed? } \item{\dots}{ arguments to be passed. } } \details{ The methods for the \code{Math} and \code{Math2} groups of mathematical functions return 'timeSeries' objects. Most of them work element-wise on the data part of the time series with the exception of \code{cummin}, \code{cummax}, \code{cumsum}, and \code{cumprod} which work columnwise. The \code{Ops} group includes mathematical operators. For the binary operators methods are defined for pairs of at least one 'timeSeries' object. These work as expected on the data parts of the arguments. If the operation gives a value of the same dimension as the data part of the 'timeSeries' object, it replaces the original data in the object. There are also methods for \code{quantile} and \code{median}. } \value{ the value from a mathematical or logical operation operating on objects of class \code{"timeSeries"} or the value computed by a mathematical function. } \seealso{ \code{\link[=colCum]{colCumXXX}} } \examples{ ## create an artificial 'timeSeries' object setRmetricsOptions(myFinCenter = "GMT") charvec = timeCalendar() set.seed(4711) data = matrix(exp(cumsum(rnorm(12, sd = 0.1)))) TS = timeSeries(data, charvec, units = "TS") TS ## mathematical operations: | +/- * ^ ... TS^2 TS[2:4] OR = returns(TS) OR OR > 0 ## median, quantile median(TS) quantile(TS) TS[3] <- NA # to demonstrate 'na.rm' median(TS) # NA #quantile(TS) # error median(TS, na.rm = TRUE) quantile(TS, na.rm = TRUE) } \keyword{chron} \keyword{methods} timeSeries/man/timeSeries-getDataPart.Rd0000755000176200001440000000060514436333424017746 0ustar liggesusers\name{DataPart,timeSeries-method} \alias{getDataPart,timeSeries-method} \alias{setDataPart,timeSeries-method} \title{DataPart,timeSeries-method} \description{ Utilities called to implement object@.Data of \code{timeSeries} objects. } \examples{ ## Load Microsoft Data - X <- MSFT[1:10, 1:4] ## Get Data Part - DATA <- getDataPart(X) class(DATA) } \keyword{chron} timeSeries/man/stats-na.omit.Rd0000644000176200001440000001532614546275654016157 0ustar liggesusers\name{na} \alias{na} \alias{na.omit} \alias{na.omit.timeSeries} \title{Handle missing values in 'timeSeries' objects} \description{ Functions for handling missing values in \code{"timeSeries"} objects. } \usage{ \method{na.omit}{timeSeries}(object, method = c("r", "s", "z", "ir", "iz", "ie"), interp = c("before", "linear", "after"), FUN, \dots) } \arguments{ \item{object}{ an object of class \code{"timeSeries"}. } \item{method}{ the method of handling NAs, see section \sQuote{Details}. } \item{interp}{ Three alternative methods are provided to remove NAs from the data: \code{type="zeros"} replaces the missing values with zeros, \code{type="mean"} replaces the missing values with the column mean, \code{type="median"} replaces the missing values with the column median. } \item{FUN}{ a function or a name of a function, such as \code{"mean"} or \code{median}. \code{FUN} is applied to the non-NA values in each column to determine the replacement value. The call looks like \code{FUN(coli, na.rm = TRUE)}, so \code{FUN} should have argument \code{na.rm}. All arguments except \code{object} are ignored if \code{FUN} is specified. } \item{\dots}{ arguments to be passed to the function \code{as.matrix}. } } \details{ Functions for handling missing values in \code{"timeSeries"} objects and in objects which can be transformed into a vector or a two dimensional matrix. For \code{na.omit} argument \code{method} specifies how to handle \code{NA}s. Can be one of the following strings: \describe{ \item{method = "s"}{\code{na.rm = FALSE}, skip, i.e. do nothing, } \item{method = "r"}{remove NAs,} \item{method = "z"}{substitute NAs by zeros,} \item{method = "ir"}{interpolate NAs and remove NAs at the beginning and end of the series,} \item{method = "iz"}{interpolate NAs and substitute NAs at the beginning and end of the series,} \item{method = "ie"}{interpolate NAs and extrapolate NAs at the beginning and end of theseries.} } % For \code{interpNA} argument \code{method} specifies how to % interpolate the matrix column by column. One of the following % character strings: \code{"linear"}, \code{"before"}, \code{"after"}. % For interpolation the function \code{approx} is used. % % The functions are listed by topic. \cr % % \tabular{ll}{ % \code{removeNA} \tab removes NAs from a matrix object, \cr % \code{substituteNA} \tab substitute NAs by zero, the column mean or median, \cr % \code{interpNA} \tab interpolates NAs using R's "approx" function. } % % % \bold{Missing Values in Price and Index Series:} % % Applied to \code{timeSeries} objects the function \code{removeNA} % just removes rows with NAs from the series. For an interpolation % of time series points one can use the function \code{interpNA}. % Three different methods of interpolation are offered: \code{"linear"} % does a linear interpolation, \code{"before"} uses the previous value, % and \code{"after"} uses the following value. Note, that the % interpolation is done on the index scale and not on the time scale. % % \bold{Missing Values in Return Series:} % % For return series the function \code{substituteNA} may be useful. The % function allows to fill missing values either by \code{method="zeros"}, % the \code{method="mean"} or the \code{method="median"} value of the % appropriate columns. } \note{ When dealing with daily data sets, there exists another function \code{alignDailySeries} which can handle missing data in un-aligned calendrical \code{"timeSeries"} objects. % The functions \code{removeNA}, \code{substituteNA} and \code{interpNA} % are older implementations. Please use in all cases if possible the % new function \code{na.omit}. \strong{Additional remarks by GNB:} \code{removeNA(x)} is equivalent to \code{na.omit(x)} or \code{na.omit(x), methods = "r"}. \code{interpNA} can be replaced by a call to \code{na.omit} with argument method equal to \code{ir}, \code{iz}, or \code{ie}, and argument \code{"interp"} equal to the \code{"method"} argument for \code{interpNA} (note that the defaults are not the same). \code{substituteNA(x, type = "zeros")} is equivalent to \code{na.omit(x, method = "z")}. For other values of \code{type} one can use argument \code{FUN}, as in \code{na.omit(x, FUN = "mean")}. A final remark: the three deprecated functions are non-generic. \code{removeNA(x)} is completely redundant as it simply calls \code{na.omit}. The other two however may be useful for matrix-like objects. Please inform the maintainer of the package if you use them on objects other than from class \code{"timeSeries"} and wish them kept in the future. } \references{ Troyanskaya O., Cantor M., Sherlock G., Brown P., Hastie T., Tibshirani R., Botstein D., Altman R.B., (2001); \emph{Missing Value Estimation Methods for DNA microarrays} Bioinformatics 17, 520--525. } \seealso{ \code{\link{alignDailySeries}} } \examples{ X <- matrix(rnorm(100), ncol = 5) # Create a Matrix X X[3, 5] <- NA # Replace a Single NA Inside X[17, 2:4] <- c(NA, NA, NA) # Replace Three in a Row Inside X[13:15, 4] <- c(NA, NA, NA) # Replace Three in a Column Inside X[11:12, 5] <- c(NA, NA) # Replace Two at the Right Border X[20, 1] <- NA # Replace One in the Lower Left Corner X Xts <- timeSeries(X) # convert X to timeSeries Xts ## remove rows with NAs na.omit(Xts) ## Subsitute NA's with zeros or column means (formerly substituteNA()) na.omit(Xts, method = "z") na.omit(Xts, FUN = "mean") na.omit(Xts, FUN = "median") ## Subsitute NA's with a trimmed mean na.omit(Xts, FUN = function(x, na.rm) mean(x, trim = 0.10, na.rm = na.rm)) ## interpolate NA's linearily (formerly interpNA()) na.omit(X, method = "ir", interp = "linear") na.omit(X, method = "iz", interp = "linear") na.omit(X, method = "ie", interp = "linear") ## take previous values in a column na.omit(X, method = "ir", interp = "before") na.omit(X, method = "iz", interp = "before") na.omit(X, method = "ie", interp = "before") ## examples with X (which is a matrix, not "timeSeries") ## (these examples are not run automatically as these functions are ## deprecated.) if(FALSE){ ## Remove Rows with NAs removeNA(X) ## subsitute NA's by zeros or column means substituteNA(X, type = "zeros") substituteNA(X, type = "mean") ## interpolate NA's linearily interpNA(X, method = "linear") # Note the corner missing value cannot be interpolated! ## take previous values in a column interpNA(X, method = "before") # Also here, the corner value is excluded } } \keyword{math} timeSeries/man/base-rank.Rd0000755000176200001440000000354714436332513015310 0ustar liggesusers\name{rank} \alias{rank} \alias{rank,timeSeries-method} \title{Sample ranks of a time series} \description{ Compute the sample ranks of the values of a 'timeSeries' object. } \usage{ \S4method{rank}{timeSeries}(x, na.last = TRUE, ties.method = ) } \arguments{ \item{x}{ an univariate object of class \code{timeSeries}. } \item{na.last}{ for controlling the treatment of \code{NA}s. If \code{TRUE}, missing values in the data are put last; if \code{FALSE}, they are put first; if \code{NA}, they are removed; if \code{"keep"} they are kept with rank \code{NA}. } \item{ties.method}{ a character string specifying how ties are treated; can be abbreviated. } } \details{ If all components are different (and no \code{NA}s), the ranks are well defined, with values in \code{seq_len(x)}. With some values equal (called \sQuote{ties}), argument \code{ties.method} determines the result at the corresponding indices. The \code{"first"} method results a permutation with increasing values at each index set of ties. The \code{"random"} method puts these in random order, whereas the default, \code{"average"}, replaces them by their mean, and \code{"max"} and \code{"min"} replace them with their maximum and minimum respectively, the latter being the typical sports ranking. \code{NA} values are never considered to be equal: for \code{na.last = TRUE} and \code{na.last = FALSE} they are given distinct ranks in the order in which they occur in \code{x}. } \value{ a \code{"timeSeries"} object } \examples{ ## Load Microsoft Data - X <- 100 * returns(MSFT) ## Compute the Ranks - head(rank(X[, "Open"]), 10) ## Only Interested in the Vector, then use - head(rank(series(X[, "Open"])), 10) } \keyword{chron} timeSeries/man/timeSeries-isRegular.Rd0000644000176200001440000000466414547725354017523 0ustar liggesusers\name{isRegular} \alias{isRegular} \alias{isRegular,timeSeries-method} \alias{isRegular.timeSeries} \alias{isDaily} \alias{isDaily,timeSeries-method} \alias{isDaily.timeSeries} \alias{isMonthly} \alias{isMonthly,timeSeries-method} \alias{isMonthly.timeSeries} \alias{isQuarterly} \alias{isQuarterly,timeSeries-method} \alias{isQuarterly.timeSeries} \alias{frequency} \alias{frequency,timeSeries-method} \alias{frequency.timeSeries} \title{Checks if a time series is regular} \description{ Checks if a time series is regular. } \usage{ \S4method{isDaily}{timeSeries}(x) \S4method{isMonthly}{timeSeries}(x) \S4method{isQuarterly}{timeSeries}(x) \S4method{isRegular}{timeSeries}(x) \S4method{frequency}{timeSeries}(x, \dots) } \arguments{ \item{x}{ an R object of class 'timeSeries'. } \item{\dots}{ arguments to be passed. } } \details{ What is a regular time series? If a time series is daily, monthly, or weekly, then we speak of a regular series. This can be tested calling the functions \code{isDaily}, \code{isMonthly}, \code{isQuarterly}, or in general \code{isRegular}. If the series is regular then its frequency can be determined by calling \code{frequency}. Here are the definitions of daily, monthly, and quarterly time series: \describe{ \item{daily}{if the series has no more than one date/time stamp per day.} \item{monthly}{if the series has no more than one date/time stamp per month.} \item{quarterly}{if the series has no more than one date/time stamp per quarter.} } A regular series is either a monthly or a quarterly series. Note that with the above definitions a monthly series is also a daily series, a quarterly series is also a monthly series. On the other hand, a daily series is not regular! NOT yet implemented is the case of weekly series. } \value{ The \code{is*} functions return \code{TRUE} or \code{FALSE} depending on whether the series fulfills the condition or not.\cr \code{frequency} returns in general 1, for quarterly series 4, and for monthly series 12. } \seealso{ \code{\link[timeDate]{isRegular}} \code{\link[stats]{frequency}} } \examples{ data(MSFT) isRegular(MSFT) # FALSE frequency(MSFT) # 1 ## a monthly ts ap <- as.timeSeries(AirPassengers) isRegular(ap) # TRUE frequency(ap) # 12 ## a quarterly ts pres <- as.timeSeries(presidents) isRegular(pres) # TRUE frequency(pres) # 4 } \keyword{chron} timeSeries/man/statistics-colCumsums.Rd0000755000176200001440000000433414436326462017770 0ustar liggesusers\name{colCum} \alias{colCum} \alias{colCummaxs} \alias{colCummins} \alias{colCumprods} \alias{colCumreturns} \alias{colCumsums} \alias{colCummaxs,matrix-method} \alias{colCummaxs,timeSeries-method} \alias{colCummins,matrix-method} \alias{colCummins,timeSeries-method} \alias{colCumprods,matrix-method} \alias{colCumprods,timeSeries-method} \alias{colCumreturns,matrix-method} \alias{colCumreturns,timeSeries-method} \alias{colCumsums,matrix-method} \alias{colCumsums,timeSeries-method} \title{Cumulated column statistics} \description{ Functions to compute cumulative column statistics. } \usage{ \S4method{colCumsums}{timeSeries}(x, na.rm = FALSE, \dots) \S4method{colCummaxs}{timeSeries}(x, na.rm = FALSE, \dots) \S4method{colCummins}{timeSeries}(x, na.rm = FALSE, \dots) \S4method{colCumprods}{timeSeries}(x, na.rm = FALSE, \dots) \S4method{colCumreturns}{timeSeries}(x, method = c("geometric", "simple"), na.rm = FALSE, \dots) } \arguments{ \item{x}{ a time series, may be an object of class \code{"matrix"}, or \code{"timeSeries"}. } \item{na.rm}{ a logical. Should missing values be removed? } \item{method}{ a character string to indicate if geometric (\code{TRUE}) or simple (\code{FALSE}) returns should be computed. } \item{\dots}{ arguments to be passed. } } \details{ These functions compute the requested cumulative quantities columnwise to obtain a matrix of the same dimension as the data. The \code{"timeSeries"} methods replace the data part of the original object with the resulting matrix. The \code{"timeSeries"} methods for the \code{Math} group functions \code{cummin}, \code{cummax}, \code{cumsum}, and \code{cumprod}, work similarly but don't have the \code{na.rm} argument. } \value{ \code{"matrix"} for the default methods of all functions, \code{"timeSeries"} for the \code{"timeSeries"} methods } \seealso{ \code{\link{Math,timeSeries-method}}, \code{\link{rowCumsums}} } \examples{ ## simulate return data x <- matrix(rnorm(24), ncol = 2) X <- as.timeSeries(x) ## cumulative sums by column - class(colCumsums(x)) # "matrix" class(colCumsums(X)) # "timeSeries" colCumsums(X) } \keyword{univar} timeSeries/man/fin-spreads.Rd0000755000176200001440000000312514436612715015655 0ustar liggesusers\name{spreads} \alias{spreads} \alias{midquotes} \alias{spreadSeries} % removed \alias{midquoteSeries} % removed \title{Spreads and mid quotes} \description{ Compute spreads and midquotes from price streams. } \usage{ spreads(x, which = c("Bid", "Ask"), tickSize = NULL) midquotes(x, which = c("Bid", "Ask")) } \arguments{ \item{x}{ an object of class \code{timeSeries}. } \item{which}{ a vector with two character strings naming the column names of the time series from which to compute the mid quotes and spreads. By default these are the bid and ask prices with column names \code{c("Bid", "Ask")}. } \item{tickSize}{ the default is \code{NULL} to simply compute price changes in original price levels. If \code{ticksize} is supplied, the price changes will be divided by the value of \code{inTicksOfSize} to compute price changes in ticks. } } \value{ all functions return an object of class \code{timeSeries} } \seealso{ \code{\link{returns}}, \code{\link{cumulated}}, \code{\link{drawdowns}}, \code{\link{splits}}, %\code{\link{spreads}}, \code{\link{midquotes}}, \code{\link{index2wealth}} } \examples{ ## Load the Microsoft Data - setRmetricsOptions(myFinCenter = "GMT") data(MSFT) X = MSFT[1:10, ] head(X) ## Compute Open/Close Midquotes - X.MID <- midquotes(X, which = c("Close", "Open")) colnames(X.MID) <- "X.MID" X.MID ## Compute Open/Close Spreads - X.SPREAD <- spreads(X, which = c("Close", "Open")) colnames(X.SPREAD) <- "X.SPREAD" X.SPREAD } \keyword{chron} timeSeries/man/stats-filter.Rd0000755000176200001440000000266514436343667016102 0ustar liggesusers\name{filter} \alias{filter} \alias{filter,timeSeries-method} \title{Linear filtering on a time series} \description{ Applies linear filtering to a univariate \code{"timeSeries"}. } \usage{ \S4method{filter}{timeSeries}(x, filter, method = c("convolution", "recursive"), sides = 2, circular = FALSE, init = NULL) } \arguments{ \item{x}{ an object from class \code{"timeSeries"}. } \item{filter}{ coefficients of the filter. } \item{method}{ \code{"convolution"} or \code{"recursive"}. } \item{sides,circular}{ for convolution filters only. Onesided if \code{sides = 1}, centred around lag 0 if \code{sides = 2}. Circular if \code{circular = TRUE.} } \item{init}{ for recursive filters only. Values before the start of the time series. } } \details{ \code{filter} is a generic function with default method \code{stats::filter}. The method for \code{"timeSeries"} is a wrapper for the latter. See \code{?stats::filter} for details about the arguments. } \value{ a \code{"timeSeries"} object } \seealso{ base R function \code{\link[stats]{filter}} } \examples{ ## Creata a dummy signal 'timeSeries' - data <- matrix(rnorm(100), ncol = 2) s <- timeSeries(data, units=c("A", "B")) head(s) ## Filter the series - f <- filter(s, rep(1, 3)) head(f) ## Plot and compare the first series - plot(cbind(s[, 1], f[, 1]), plot.type="s") } timeSeries/man/fin-dummy.Rd0000755000176200001440000000260214436046541015344 0ustar liggesusers\name{dummyTimeSeries} \alias{dummyTimeSeries} \alias{dummyDailySeries} \alias{dummyMonthlySeries} \alias{dummySeries} % deprecated; now removed \title{Create dummy time series} \description{ Create dummy daily and monthly time series for examples and exploration. } \usage{ dummyDailySeries(x = rnorm(365), units = NULL, zone = "", FinCenter = "") dummyMonthlySeries(\dots) } \arguments{ \item{x}{ an object of class \code{timeSeries}. } \item{units}{ an optional character string, which allows to overwrite the current column names of a \code{timeSeries} object. By default \code{NULL} which means that the column names are selected automatically. } \item{FinCenter}{ a character with the the location of the financial center named as \code{"continent/city"}. } \item{zone}{ the time zone or financial center where the data were recorded. } \item{...}{ optional arguments passed to \code{timeSeries}. } } \details{ \code{dummyDailySeries} creates a \code{timeSeries} object with dummy daily dates from a numeric matrix with daily records of unknown dates. \code{dummyMonthlySeries} creates a dummy monthly \code{"timeSeries"} object. } \value{ a \code{"timeSeries"} object } \examples{ dd <- dummyDailySeries() head(dd) tail(dd) dummyMonthlySeries(y = 2022) } \keyword{chron} \keyword{ts} timeSeries/man/fin-drawdowns.Rd0000755000176200001440000000421114436331171016213 0ustar liggesusers\name{drawdowns} \alias{drawdowns} \alias{drawdownsStats} \title{Calculations of drawdowns} \description{ Compute series of drawdowns from financial returns and calculate drawdown statisitcs. } \usage{ drawdowns(x, \dots) drawdownsStats(x, \dots) } \arguments{ \item{x}{ a \code{"timeSeries"} object of financial returns. Note, drawdowns can be calculated from an uni- or multivariate time deries object, statistics can only be computed from an univariate time series object. } \item{\dots}{ optional arguments passed to \code{na.omit}. } } \value{ for \code{drawdowns}, an object of class \code{timeSeries}. for \code{drawdownsStats} an object of class \code{"data.frame"} with the following components: \item{drawdown}{the depth of the drawdown, } \item{from}{the start date, } \item{trough}{the trough period, } \item{to}{the end date, } \item{length}{the length in number of records, } \item{peaktrough}{the peak trough, and } \item{recovery}{the recovery length in number of records.} } \details{ The code in the core of the function \code{drawdownsStats} was borrowed from the package \code{PerformanceAnalytics} authored by Peter Carl and Sankalp Upadhyay. } \author{ Peter Carl and Sankalp Upadhyay for code from the contributed R package \code{PerformanceAnalytics} used in the function \code{drawdownsStats}. } \seealso{ \code{\link{returns}}, \code{\link{cumulated}}, %\code{\link{drawdowns}}, \code{\link{splits}}, %\code{\link{spreads}}, \code{\link{midquotes}}, \code{\link{index2wealth}} } \examples{ ## Use Swiss Pension Fund Data Set of Returns - head(LPP2005REC) SPI <- LPP2005REC[, "SPI"] head(SPI) ## Plot Drawdowns - dd = drawdowns(LPP2005REC[, "SPI"], main = "Drawdowns") plot(dd) dd = drawdowns(LPP2005REC[, 1:6], main = "Drawdowns") plot(dd) ## Compute Drawdowns Statistics - ddStats <- drawdownsStats(SPI) class(ddStats) ddStats ## Note, Only Univariate Series are allowd - ddStats <- try(drawdownsStats(LPP2005REC)) class(ddStats) } \keyword{chron} timeSeries/man/stats-aggregate.Rd0000755000176200001440000000337014435660315016524 0ustar liggesusers\name{aggregate-methods} \alias{aggregate-methods} \docType{methods} \alias{aggregate} \alias{aggregate.timeSeries} \alias{aggregate,timeSeries-method} \title{Aggregate time series} \description{ Aggregate a \code{"timeSeries"} object over general periods. } \usage{ \S4method{aggregate}{timeSeries}(x, by, FUN, \dots) } \arguments{ \item{x}{ an object of class \code{"timeSeries"}. } \item{by}{ a sequence of \code{"timeDate"} objects denoting the aggregation periods, see section \sQuote{Details}. } \item{FUN}{ the function to be applied. } \item{\dots}{ arguments passed to other methods. } } \details{ \code{aggregate} aggregates \code{x} by applying \code{FUN} on the values of the time series in each of the aggregation periods, specified by argument \code{by}. Argument \code{by} should be of the same class as \code{time(x)}. \code{by} is sorted and duplicated values are removed from it. Each pair of consecutive values in \code{by} then determines a period over which to apply the aggregation function \code{FUN}, see \code{\link[base]{findInterval}}. } \value{ an object of class \code{"timeSeries"} } \seealso{ \code{\link{apply}}, \code{\link{align}} } \examples{ ## Load Microsoft Data Set - x <- MSFT ## Aggregate by Weeks - by <- timeSequence(from = start(x), to = end(x), by = "week") aggregate(x, by, mean) ## Aggregate to Last Friday of Month - by <- unique(timeLastNdayInMonth(time(x), 5)) X <- aggregate(x, by, mean) X dayOfWeek(time(X)) isMonthly(X) ## Aggregate to Last Day of Quarter - by <- unique(timeLastDayInQuarter(time(x))) X <- aggregate(x, by, mean) X isQuarterly(X) } \keyword{methods} \keyword{chron} timeSeries/man/timeSeries-slotFinCenter.Rd0000755000176200001440000000205314436344104020321 0ustar liggesusers\name{finCenter} \alias{finCenter} \alias{finCenter<-} \alias{finCenter,timeSeries-method} \alias{finCenter<-,timeSeries-method} \alias{getFinCenter} \alias{setFinCenter<-} \title{Get and set Financial center of a 'timeSeries'} \description{ Get or assign a financial center to a \code{"timeSeries"} object. } \usage{ \S4method{finCenter}{timeSeries}(x) \S4method{finCenter}{timeSeries}(x) <- value getFinCenter(x) setFinCenter(x) <- value } \arguments{ \item{x}{ a \code{"timeSeries"} object. } \item{value}{ a character with the the location of the financial center named as \code{"continent/city"}. } } \seealso{ \code{\link[timeDate]{listFinCenter}} and \code{\link[timeDate]{finCenter}} in package \code{"timeDate"} } \examples{ ## An artificial 'timeSeries' Object - tS <- dummyMonthlySeries() tS ## Print Financial Center - finCenter(tS) getFinCenter(tS) ## Assign New Financial Center - finCenter(tS) <- "Zurich" tS setFinCenter(tS) <- "New_York" tS } \keyword{programming} timeSeries/man/fin-periodical.Rd0000644000176200001440000000422114546503405016317 0ustar liggesusers\name{periodical} \alias{endOfPeriod} \alias{endOfPeriodSeries} \alias{endOfPeriodStats} \alias{endOfPeriodBenchmarks} \title{End-of-Period series, stats, and benchmarks} \description{ Computes periodical statistics back to a given period. } \usage{ endOfPeriodSeries(x, nYearsBack = c("1y", "2y", "3y", "5y", "10y", "YTD")) endOfPeriodStats(x, nYearsBack = c("1y", "2y", "3y", "5y", "10y", "YTD")) endOfPeriodBenchmarks(x, benchmark = ncol(x), nYearsBack = c("1y", "2y", "3y", "5y", "10y", "YTD")) } \arguments{ \item{x}{ an end-of-month recorded multivariate \code{"timeSeries"} object. One of the columns holds the benchmark series specified by argument \code{benchmark}, } \item{nYearsBack}{ a period string. How long back should the series be treated? Options include values from 1 year to 10 years, and year-to-date: "1y", "2y", "3y", "5y", "10y", "YTD". } \item{benchmark}{ an integer giving the position of the benchmark series in \code{x}. By default this is the last column of \code{x}. } } \details{ \code{endOfPeriodSeries} extract the data for the last few years, as specified by argument \code{nYearsBack}. \code{endOfPeriodStats} computes basic exploratory statistics for the last few years in the data. \code{endOfPeriodBenchmarks} returns benchmarks back to a given period. \code{x} must be end of month data. Such series can be created using functions like \code{align}, \code{alignDailySeries}, \code{daily2monthly}. } \value{ for \code{endOfPeriodSeries}, a \code{"timeSeries"}, for \code{endOfPeriodStats}, a data frame, for \code{endOfPeriodBenchmarks} - currently \code{NULL} (invisibly), the function is unfinished. } \examples{ ## load series: column 1:3 Swiss market, column 8 (4) benchmark x <- 100 * LPP2005REC[, c(1:3, 8)] colnames(x) x <- daily2monthly(x) x ## Get the Monthly Series - endOfPeriodSeries(x, nYearsBack="1y") ## Compute the Monthly Statistics endOfPeriodStats(x, nYearsBack="1y") ## Compute the Benchmark endOfPeriodBenchmarks(x, benchmark=4) } \keyword{chron} timeSeries/man/methods-show.Rd0000644000176200001440000000422514546252757016072 0ustar liggesusers\name{print-methods} \alias{show,timeSeries-method} \alias{print.timeSeries} \title{Print 'timeSeries' objects} \description{ Print \code{"timeSeries"} objects. } \usage{ \S4method{show}{timeSeries}(object) \method{print}{timeSeries}(x, FinCenter = NULL, format = NULL, style = c("tS", "h", "ts"), by = c("month", "quarter"), ...) } \arguments{ \item{object,x}{ an object of class \code{"timeSeries"}. } \item{FinCenter}{ a character with the the location of the financial center named as "continent/city". } \item{format}{ the format specification of the input character vector, a character string with the format in POSIX notation. } \item{style}{ a character string, one of \code{"tS"}, \code{"h"}, or \code{"ts"}. } \item{by}{ a character string, one of \code{"month"}, \code{"quarter"}. } \item{\dots}{ arguments passed to the print method for the data part, which is a \code{"matrix"} or, in the case of \code{style = "ts"}, to the print method for class \code{"ts"}. } } % \item{recordIDs}{ % for the \code{print} method, a logical value - should the % \code{recordIDs} be printed together with the data matrix and time % series positions? \details{ \code{show} does not have additional arguments. The \code{print} method allows to modify the way the object is shown by explicitly calling \code{print}. The default for \code{style} is \code{tS}. For univariate time series \code{style = "h"} causes the object to be printed as a vector with the time stamps as labels. Finally, \code{style = "ts"} prints like objects from base R class \code{"ts"}, which is suitable for quarterly and monthly time series. } \value{ Prints an object of class \code{timeSeries}. } \examples{ ## Load Micsrosoft Data setRmetricsOptions(myFinCenter = "GMT") LPP <- MSFT[1:12, 1:4] ## Abbreviate Column Names colnames(LPP) <- abbreviate(colnames(LPP), 6) ## Print Data Set print(LPP) ## Alternative Use, Show Data Set LPP # equivalently, show(LPP) ## a short subseries to demo 'print' hC <- head(MSFT[ , "Close"]) class(hC) print(hC) print(hC, style = "h") } \keyword{chron} timeSeries/man/methods-stats.Rd0000755000176200001440000000431014435105645016234 0ustar liggesusers\name{timeSeries-method-stats} \docType{methods} \alias{sd-methods} \alias{var-methods} \alias{cov-methods} \alias{cor-methods} %\alias{dcauchy-methods} %\alias{dnorm-methods} %\alias{dt-methods} %\alias{sd,timeSeries-method} %\alias{var,timeSeries-method} %\alias{cov,timeSeries-method} %\alias{cor,timeSeries-method} %\alias{dcauchy,timeSeries-method} %\alias{dnorm,timeSeries-method} %\alias{dt,timeSeries-method} \title{Base R functions applied to 'timeSeries' objects} \description{ Many base R statistical functions work on (the data part of) \code{timeSeries} objects without the need for special methods, e.g., \code{var}, \code{sd}, \code{cov}, \code{cor}, probability densities, and others. This page gives some examples with such functions. } %% 2023-05-29: these S4 methods don't exist! (and the functions are not generic!) %\usage{ %\S4method{cov}{timeSeries}(x, y = NULL, use = "all.obs", % method = c("pearson", "kendall", "spearman")) % %\S4method{cor}{timeSeries}(x, y = NULL, use = "all.obs", % method = c("pearson", "kendall", "spearman")) %} % %\arguments{ % \item{x}{ % an univariate object of class \code{timeSeries}. % } % \item{y}{ % \code{NULL} (default) or a \code{timeSeries} object with compatible % dimensions to \code{x}. The default is equivalent to \code{y = x} % (but more efficient). % } % \item{use}{ % an optional character string giving a method for computing % covariances in the presence of missing values. This must be (an % abbreviation of) one of the strings \code{"all.obs"}, % \code{"complete.obs"} or \code{"pairwise.complete.obs"}. % } % \item{method}{ % a character string indicating which correlation coefficient (or % covariance) is to be computed. One of \code{"pearson"} (default), % \code{"kendall"}, or \code{"spearman"}. Can be abbreviated. % } %} % %\value{ % covariance or correlation matrix %} \seealso{ \code{\link{colStats}}, \code{\link{colVars}}, and other \code{colXXX} functions } \examples{ ## Load Microsoft Data Set - data(MSFT) X = MSFT[, 1:4] X = 100 * returns(X) ## Compute Covariance Matrix - cov(X[, "Open"], X[, "Close"]) cov(X) cor(X) } \keyword{methods} \keyword{chron} timeSeries/man/fin-runlengths.Rd0000755000176200001440000000164614436440633016411 0ustar liggesusers\name{runlengths} \alias{runlengths} \title{Runlengths of a time series} \description{ Computes runlengths of an univariate \code{"timeSeries"} object. } \usage{ runlengths(x, \dots) } \arguments{ \item{x}{ an univariate time series of class \code{"timeSeries"}. } \item{\dots}{ arguments passed to the function \code{na.omit}. } } \details{ Runlengths are defined here as contiguous sequences of values having the same sign. Zeroes are treated as \code{NA}s. } \value{ an object of class \code{"timeSeries"} } \examples{ ## random time series - set.seed(4711) x <- rnorm(12) tS <- timeSeries(data = x, charvec = timeCalendar(), units = "x") tS ## return runlengths - runlengths(tS) ## replace the middle value of the negative stretch of 3 values tS[5] <- NA ## the two negative values separated by NA are still one run runlengths(tS) } \keyword{chron} timeSeries/man/statistics-orderColnames.Rd0000755000176200001440000001023114435063651020421 0ustar liggesusers\name{orderColnames} \alias{orderColnames} \alias{sortColnames} \alias{sampleColnames} \alias{statsColnames} \alias{pcaColnames} \alias{hclustColnames} \title{Reorder column names of a time series} \description{ Functions and methods dealing with the rearrangement of column names of 'timeSeries' objects. \cr \tabular{ll}{ \code{orderColnames} \tab Returns ordered column names of a time Series, \cr \code{sortColnames} \tab Returns sorted column names of a time Series, \cr \code{sampleColnames} \tab Returns sampled column names of a time Series, \cr \code{statsColnames} \tab Returns statistically rearranged column names, \cr \code{pcaColnames} \tab Returns PCA correlation ordered column names, \cr \code{hclustColnames} \tab Returns hierarchical clustered column names. } } \usage{ orderColnames(x, \dots) sortColnames(x, \dots) sampleColnames(x, \dots) statsColnames(x, FUN = colMeans, \dots) pcaColnames(x, robust = FALSE, \dots) hclustColnames(x, method = c("euclidean", "complete"), \dots) } \arguments{ \item{x}{ an object of class \code{timesSeries} or any other rectangular object which can be transformed by the function \code{as.matrix} into a numeric matrix. } \item{FUN}{ a character string indicating which statistical function should be applied. By default statistical ordering operates on the column means of the time series. } \item{method}{ a character string with two elements. The first determines the choice of the distance measure, see \code{\link[stats]{dist}}, and the second determines the choice of the agglomeration method, see \code{\link[stats]{hclust}}. } \item{robust}{ a logical flag which indicates if robust correlations should be used. } \item{\dots}{ further arguments to be passed to the underlying functions doing the main work, see section \sQuote{Details}. } } \details{ These functions reorder the column names of a \code{"timeSeries"} object according to some statistical measure. \bold{Statistically Motivated Rearrangement} The function \code{statsColnames} rearranges the column names according to a statical measure. These measure must operate on the columns of the time series and return a vector of values which can be sorted. Typical functions ar those listed in help page \code{colStats} but custom functions can be used that compute for example risk or any other statistical measure. The \code{\dots} argument allows to pass additional arguments to the underlying function \code{FUN}. \bold{PCA Ordering of the Correlation Matrix} The function \code{pcaColnames} rearranges the column names according to the PCA ordered correlation matrix. The argument \code{robust} allsows to select between the use of the standard \code{cor} and computation of robust correlations using the function \code{covMcd} from contributed R package \code{robustbase}. The \code{\dots} argument allows to pass additional arguments to the two underlying functions \code{cor} or \code{covMcd}. E.g., adding \code{method="kendall"} to the argument list calculates Kendall's rank correlations instead the default which calculates Person's correlations.\cr \bold{Ordering by Hierarchical Clustering} The function \code{pcaColnames} uses the hierarchical clustering approach \code{hclust} to rearrange the column names of the time series. } \value{ for \code{orderColnames}, an integer vector representing the permutaion that will sort the column names, for the other functions, a character vector giving the rearranged column names } \examples{ ## Load Swiss Pension Fund Benchmark Data - data <- LPP2005REC[,1:6] ## Abbreviate Column Names - colnames(data) ## Sort Alphabetically - sortColnames(data) ## Sort by Column Names by Hierarchical Clustering - hclustColnames(data) head(data[, hclustColnames(data)]) } \keyword{chron} timeSeries/man/00timeSeries-package.Rd0000644000176200001440000002711714546273601017307 0ustar liggesusers\name{timeSeries-package} \docType{package} \alias{timeSeries-package} \title{Utilities and tools package} \description{ Package \pkg{timeSeries} is part of the Rmetrics suit of R packages. It provides a class, \code{timeSeries}, particularly aimed at analysis of financial data, along with many methods, functions, and utilities for statistical and financial computations on time series. } \author{ Diethelm Wuertz [aut] (original code), Tobias Setz [aut], Yohan Chalabi [aut], Martin Maechler [ctb] (), Georgi N. Boshnakov [cre, aut] Maintainer: Georgi N. Boshnakov } \details{ The following sections have not been updated for some time. } \section{timeSeries - S4 'timeSeries' Class}{ % \code{getDataPart, series} \tab ... \cr \tabular{ll}{ \code{\link{timeSeries}} \tab Creates a \code{"timeSeries"} from scratch\cr \code{\link{series}}, coredata \tab Extracts the data \cr \code{\link{getUnits}} \tab Extracts the time serie units \cr \code{\link{time}} \tab Extracts the positions of timestamps \cr \code{x@format} \tab Extracts the format of the timestamp \cr \code{\link{finCenter}} \tab Extracts the financial center \cr \code{x@recordIDs} \tab Extracts the record IDs \cr \code{x@title} \tab Extracts the title \cr \code{x@documentation} \tab Extracts the documentation } } \section{Base Time Series Functions}{ % \code{comment} \tab ? ... \cr \tabular{ll}{ \code{\link[=apply,timeSeries-method]{apply}} \tab Applies a function to blocks of a \code{"timeSeries"} \cr \code{\link{cbind}} \tab Combines columns of two \code{"timeSeries"} objects \cr \code{\link{rbind}} \tab Combines rows of two \code{"timeSeries"} objects \cr \code{\link{diff}} \tab Returns differences of a \code{"timeSeries"} object \cr \code{\link[=dim,timeSeries-method]{dim}} \tab returns dimensions of a \code{"timeSeries"} object \cr \code{\link{merge}} \tab Merges two \code{"timeSeries"} objects \cr \code{\link[=rank,timeSeries-method]{rank}} \tab Returns sample ranks of a \code{"timeSeries"} object \cr \code{\link[=apply,timeSeries-method]{rev}} \tab Reverts a \code{"timeSeries"} object \cr \code{\link{sample}} \tab Resamples a \code{"timeSeries"} object \cr \code{\link{scale}} \tab Scales a \code{"timeSeries"} object \cr \code{\link[=sort.timeSeries]{sort}} \tab Sorts a \code{"timeSeries"} object \cr \code{\link[=start.timeSeries]{start}} \tab Returns start date/time of a \code{"timeSeries"} \cr \code{\link[=end.timeSeries]{end}} \tab Returns end date/time of a \code{"timeSeries"} \cr \code{\link[=apply,timeSeries-method]{end}} \tab Returns end date/time of a \code{"timeSeries"} \cr \code{\link[=t,timeSeries-method]{t}} \tab Returns the transpose of a \code{"timeSeries"} object \cr \code{\link[=attach,timeSeries-method]{attach}} \tab Attaches a \code{"timeSeries"} to the search path } } \section{Subsetting 'timeSeries' Objects}{ % \code{.subset_} \tab Subsets \code{"timeSeries"} objects \cr % \code{.findIndex} \tab Index search in a \code{"timeSeries"} object \cr \tabular{ll}{ \code{[} \tab Subsets a \code{"timeSeries"} object \cr \code{[<-} \tab Assigns values to a subset \cr \code{$} \tab Subsets a \code{"timeSeries"} by column names \cr \code{$<-} \tab Replaces subset by column names \cr \code{\link[=head.timeSeries]{head}} \tab Returns the head of a \code{"timeSeries"} \cr \code{\link[=tail.timeSeries]{tail}} \tab Returns the tail of a time Series \cr \code{\link{na.omit}} \tab Handles NAs in a \code{"timeSeries"} object \cr \code{\link{removeNA}} \tab removes NAs from a matrix object \cr \code{\link{substituteNA}} \tab substitutes NAs by zero, column mean or median \cr \code{\link{interpNA}} \tab interpolates NAs using R's "approx" function } } \section{Mathematical Operation}{ \tabular{ll}{ \code{\link[=Ops,timeSeries,timeSeries-method]{Ops}} \tab S4: Arith method for a \code{"timeSeries"} object \cr \code{\link[=Math,timeSeries-method]{Math}} \tab S4: Math method for a \code{"timeSeries"} object \cr \code{\link[=Math2,timeSeries-method]{Math2}} \tab S4: Maths method for a \code{"timeSeries"} object \cr \code{abs} \tab Returns absolute values of a \code{"timeSeries"} object \cr \code{sqrt} \tab Returns square root of a \code{"timeSeries"} object \cr \code{exp} \tab Returns the exponential values of a \code{"timeSeries"} object \cr \code{log} \tab Returns the logarithm of a \code{"timeSeries"} object \cr \code{sign} \tab Returns the signs of a \code{"timeSeries"} object \cr \code{\link{diff}} \tab Differences a \code{"timeSeries"} object \cr \code{\link{scale}} \tab Centers and/or scales a \code{"timeSeries"} object \cr \code{\link[=quantile.timeSeries]{quantile}} \tab Returns quantiles of an univariate \code{"timeSeries"}} } \section{Methods}{ \tabular{ll}{ \code{\link{as.timeSeries}} \tab Defines method for a \code{"timeSeries"} \cr \code{as.*.default} \tab Returns the input \cr \code{as.*.ts} \tab Transforma a 'ts' object into a \code{"timeSeries"} \cr \code{as.*.data.frame} \tab Transforms a 'data.frame' intp a 'timeSeries \cr \code{as.*.character} \tab Loads and transforms from a demo file \cr \code{as.*.zoo} \tab Transforms a 'zoo' object into a \code{"timeSeries"} \cr \code{as.vector.*} \tab Converts univariate \code{"timeSeries"} to vector \cr \code{as.matrix.*} \tab Converts \code{"timeSeries"} to matrix \cr \code{as.numeric.*} \tab Converts \code{"timeSeries"} to numeric \cr \code{as.data.frame.*} \tab Converts \code{"timeSeries"} to data.frame \cr \code{as.ts.*} \tab Converts \code{"timeSeries"} to ts \cr \code{as.logical.*} \tab Converts \code{"timeSeries"} to logical \cr \code{\link{is.timeSeries}} \tab Tests for a \code{"timeSeries"} object \cr \code{\link[=plot,timeSeries-method]{plot}} \tab Displays a X-Y \code{"timeSeries"} Plot \cr \code{\link[=lines,timeSeries-method]{lines}} \tab Adds connected line segments to a plot \cr \code{\link[=points,timeSeries-method]{points}} \tab Adds Points to a plot \cr \code{\link[=show,timeSeries-method]{show}} \tab Prints a 'timeSeries oobject} } \section{Financial time series functions}{ \tabular{ll}{ \code{\link{align}} \tab Aligns a \code{"timeSeries"} to time stamps \cr \code{\link{cumulated}} \tab Computes cumulated series from a returns \cr \code{\link{alignDailySeries}} \tab Aligns a \code{"timeSeries"} to calendarical dates \cr \code{\link{rollDailySeries}} \tab Rolls a 'timeSeries daily\cr \code{\link{drawdowns}} \tab Computes series of drawdowns from financial returns \cr \code{\link{drawdownsStats}} \tab Computes drawdowns statistics \cr \code{\link{durations}} \tab Computes durations from a financial time series \cr \code{\link{countMonthlyRecords}} \tab Counts monthly records in a \code{"timeSeries"} \cr \code{\link{rollMonthlyWindows}} \tab Rolls Monthly windows \cr \code{\link{rollMonthlySeries}} \tab Rolls a \code{"timeSeries"} monthly \cr \code{\link{endOfPeriodSeries}} \tab Returns end of periodical series \cr \code{\link{endOfPeriodStats}} \tab Returns end of period statistics \cr \code{\link{endOfPeriodBenchmarks}} \tab Returns period benchmarks \cr \code{\link{returns}} \tab Computes returns from prices or indexes \cr \code{\link{returns0}} \tab Computes untrimmed returns from prices or indexes \cr \code{\link{runlengths}} \tab Computes run lenghts of a \code{"timeSeries"} \cr \code{\link{smoothLowess}} \tab Smoothes a \code{"timeSeries"} \cr \code{\link{smoothSpline}} \tab Smoothes a \code{"timeSeries"} \cr \code{\link{smoothSupsmu}} \tab Smoothes a \code{"timeSeries"} \cr \code{\link{splits}} \tab Detects \code{"timeSeries"} splits by outlier detection \cr \code{\link{spreads}} \tab Computes spreads from a price/index stream \cr \code{\link{turns}} \tab Computes turning points in a \code{"timeSeries"} object \cr \code{\link{turnsStats}} \tab Computes turning points statistics } } \section{Statistics Time Series functions}{ \tabular{ll}{ \code{\link{colCumsums}} \tab Computes cumulated column sums of a \code{"timeSeries"} \cr \code{\link{colCummaxs}} \tab Computes cumulated maximum of a \code{"timeSeries"} \cr \code{\link{colCummins}} \tab Computes cumulated minimum of a \code{"timeSeries"} \cr \code{\link{colCumprods}} \tab Computes cumulated pruduct values by column \cr \code{\link{colCumreturns}} \tab Computes cumulated returns by column \cr \code{\link[=colSums,timeSeries-method]{colSums}} \tab Computes sums of all values in each column \cr \code{\link[=colMeans,timeSeries-method]{colMeans}} \tab Computes means of all values in each column \cr \code{\link{colSds}} \tab Computes standard deviations of all values in each column \cr \code{\link{colVars}} \tab Computes variances of all values in each column \cr \code{\link{colSkewness}} \tab Computes skewness of all values in each column \cr \code{\link{colKurtosis}} \tab Computes kurtosis of all values in each column \cr \code{\link{colMaxs}} \tab Computes maxima of all values in each column \cr \code{\link{colMins}} \tab Computes minima of all values in each column \cr \code{\link{colProds}} \tab Computes products of all values in each column \cr \code{\link{colStats}} \tab Computes statistics of all values in each column \cr \code{\link{orderColnames}} \tab Returns ordered column names of a \code{"timeSeries"} \cr \code{\link{sortColnames}} \tab Returns alphabetically sorted column names \cr \code{\link{sampleColnames}} \tab Returns sampled column names of a \code{"timeSeries"} \cr \code{\link{pcaColnames}} \tab Returns PCA correlation ordered column names \cr \code{\link{hclustColnames}} \tab Returns hierarchically clustered columnames \cr \code{\link{statsColnames}} \tab Returns statisticall rearrange columnames \cr \code{\link{orderStatistics}} \tab Computes order statistics of a \code{"timeSeries"} object \cr \code{\link{rollMean}} \tab Computes rolling means of a \code{"timeSeries"} object \cr \code{\link{rollMin}} \tab Computes rolling minima of a \code{"timeSeries"} object \cr \code{\link{rollMax}} \tab Computes rolling maxima of a \code{"timeSeries"} object \cr \code{\link{rollMedian}} \tab Computes rolling medians of a \code{"timeSeries"} object \cr \code{\link{rollStats}} \tab Computes rolling statistics of a \code{"timeSeries"} objectcr \cr \code{\link{rowCumsums}} \tab Computes cumulated column sums of a \code{"timeSeries"} \cr \code{\link{smoothLowess}} \tab Smoothes a series with lowess function \cr \code{\link{smoothSupsmu}} \tab Smoothes a series with supsmu function \cr \code{\link{smoothSpline}} \tab Smoothes a series with smooth.spline function } } \section{Misc Functions}{ \tabular{ll}{ \code{\link{dummyDailySeries}} \tab Creates a dummy daily \code{"timeSeries"} object \cr \code{\link[=isMonthly,timeSeries-method]{isMonthly}} \tab Decides if the series consists of monthly records \cr \code{\link[=isDaily,timeSeries-method]{isDaily}} \tab Decides if the series consists of daily records \cr \code{\link[=isQuarterly,timeSeries-method]{isQuarterly}} \tab Decides if the series consists of Quarterly records \cr \code{\link{description}} \tab Creates default description string % \code{\link{getArgs}} \tab Extracts arguments from a S4 method } } \keyword{package} \keyword{ts} timeSeries/man/timeSeries.Rd0000755000176200001440000001266514436343326015563 0ustar liggesusers\name{TimeSeriesClass} \alias{TimeSeriesClass} \alias{timeSeries} \alias{timeSeries,ANY,ANY-method} \alias{timeSeries,ANY,missing-method} \alias{timeSeries,ANY,timeDate-method} \alias{timeSeries,matrix,ANY-method} \alias{timeSeries,matrix,missing-method} \alias{timeSeries,matrix,timeDate-method} \alias{timeSeries,missing,ANY-method} \alias{timeSeries,missing,missing-method} \alias{timeSeries,missing,timeDate-method} \alias{timeSeries,matrix,numeric-method} \alias{index_timeSeries} \alias{time_timeSeries} \alias{index_timeSeries-class} \alias{time_timeSeries-class} \alias{summary.timeseries} \title{Create objects from class 'timeSeries'} \description{ \code{timeSeries} creates a \code{"timeSeries"} object from scratch. } \usage{ timeSeries(data, charvec, units = NULL, format = NULL, zone = "", FinCenter = "", recordIDs = data.frame(), title = NULL, documentation = NULL, \dots) } \arguments{ \item{data}{ a \code{matrix} object or any objects which can be coerced to a matrix. } \item{charvec}{ a character vector of dates and times or any objects which can be coerced to a \code{"timeDate"} object. } \item{units}{ an optional character string, which allows to overwrite the current column names of a \code{"timeSeries"} object. By default \code{NULL} which means that the column names are selected automatically. } \item{format}{ the format specification of the input character vector, a character string with the format in POSIX notation. } \item{zone}{ the time zone or financial center where the data were recorded. } \item{FinCenter}{ a character with the the location of the financial center named as "continent/city". } \item{recordIDs}{ for \code{timeSeries}, a data frame which can be used for record identification. } \item{title}{ an optional title string, if not specified the input's data name is deparsed. } \item{documentation}{ optional documentation string, or a vector of character strings. } \item{\dots}{ arguments passed to other methods. } } \value{ an S4 object of class \code{"timeSeries"} } \details{ \bold{Generation of Time Series Objects:} \cr We have defined a \code{"timeSeries"} class which is in many aspects similar to the S-Plus class with the same name, but has also some important differences. The class has seven Slots, the 'Data' slot which holds the time series data in matrix form, the 'position' slot which holds the time/date as a character vector, the 'format' and 'FinCenter' slots which are the same as for the 'timeDate' object, the 'units' slot which holds the column names of the data matrix, and a 'title' and a 'documentation' slot which hold descriptive character strings. Date and time is managed in the same way as for \code{timeDate} objects. \code{\link{as.timeSeries}} also creates \code{"timeSeries"} objects. \code{as.timeSeries(x)} is mostly equivalent to \code{timeSeries(x)} but the two functions have different methods. Beside that, the main difference between the two functions is that \code{as.timeSeries} doesn't accept additional arguments. The one argument call is naturally interpreted as \sQuote{convert to}, so \code{\link{as.timeSeries}} is more expressive and is recommended in that case. \code{"timeSeries"} methods are provided for many base R functions, including arithmetic operations, mathematical functions, \code{print}, \code{summary}, and time series functions. Not all are explicitly documented, since they can just be used. } % \note{ % % These functions were written for Rmetrics users using R and Rmetrics % under Microsoft's Windows operating system where time zones, % daylight saving times and holiday calendars are insuffeciently % supported. % % } \seealso{ \code{\link{as.timeSeries}}, class \code{\linkS4class{timeSeries}}, } \examples{ ## Load Microsoft data - # Microsoft Data: setRmetricsOptions(myFinCenter = "GMT") data(MSFT) head(MSFT) ## Create a 'timeSeries' object, the direct Way ... Close <- MSFT[, 5] head(Close) ## Create a 'timeSeries' object from scratch - data <- as.matrix(MSFT[, 4]) charvec <- rownames(MSFT) Close <- timeSeries(data, charvec, units = "Close") head(Close) c(start(Close), end(Close)) ## Cut out April data from 2001 - tsApril01 <- window(Close, "2001-04-01", "2001-04-30") tsApril01 ## Compute Continuous Returns - returns(tsApril01) ## Compute Discrete Returns - returns(tsApril01, type = "discrete") ## Compute Discrete Returns, Don't trim - returns(tsApril01, trim = FALSE) ## Compute Discrete Returns, Use Percentage Values - tsRet <- returns(tsApril01, percentage = TRUE, trim = FALSE) tsRet ## Aggregate Weekly - GoodFriday(2001) to <- timeSequence(from = "2001-04-11", length.out = 3, by = "week") from <- to - 6*24*3600 from to applySeries(tsRet, from, to, FUN = sum) ## Create large 'timeSeries' objects with different 'charvec' object classes - # charvec is a 'timeDate' object head(timeSeries(1:1e6L, timeSequence(length.out = 1e6L, by = "sec"))) head(timeSeries(1:1e6L, seq(Sys.timeDate(), length.out = 1e6L, by = "sec"))) # 'charvec' is a 'POSIXt' object head(timeSeries(1:1e6L, seq(Sys.time(), length.out = 1e6L, by = "sec"))) # 'charvec' is a 'numeric' object head(timeSeries(1:1e6L, 1:1e6L)) } \keyword{chron} timeSeries/man/stats-window.Rd0000644000176200001440000000171414546503254016103 0ustar liggesusers\name{window} \alias{window} \alias{window,timeSeries-method} \alias{window.timeSeries} \title{Methods for 'window' in package 'timeSeries'} \description{ Extract a part from a \code{"timeSeries"} object. } \usage{ \method{window}{timeSeries}(x, start, end, \dots) } \arguments{ \item{x}{ an object of class \code{"timeSeries"}. } \item{start, end}{ starting date and end date, \code{end} must be after \code{start}. } \item{\dots}{ arguments passed to other methods. } } \details{ \code{window} extracts the subset of the \code{"timeSeries"} object \code{x} observed between the times \code{start} and \code{end}. } \seealso{ \code{\link[=head.timeSeries]{head}}, \code{\link{outlier}} } \examples{ ## load LPP benchmark returns x <- LPP2005REC[, 7:9] range(time(x)) ## extract data for January 2006 window(x, "2006-01-01", "2006-01-31") } \keyword{chron} timeSeries/man/fin-splits.Rd0000755000176200001440000000272614436330424015532 0ustar liggesusers\name{splits} \alias{splits} \title{splits} \description{ Searches for outlier splits in a \code{"timeSeries"} object. } \usage{ splits(x, sd = 3, complement = TRUE, ...) } \arguments{ \item{x}{ a \code{"timeSeries"} object. } \item{sd}{ \code{numeric(1)}; deviations of how many standard deviations to consider too big? Can be fractional. E.g., 5 means that values larger or smaller than five times the standard deviation of the series will be detected. } \item{complement}{ a logical flag, should the outlier series or its complements be returned? } \item{\dots}{ arguments to be passed. } } \details{ This function finds splits in financial price or index series. If a price or index is splitted we observe a big jump of several standard deviations in the returns, which is identified usually as an outlier. } \value{ a \code{"timeSeries"} object } \seealso{ \code{\link{returns}}, \code{\link{cumulated}}, \code{\link{drawdowns}}, %\code{\link{splits}}, \code{\link{spreads}}, \code{\link{midquotes}}, \code{\link{index2wealth}} } \examples{ ## Create a Return Series with a Split - data <- runif(12, -1, 1) data[6] <- 20 x <- timeSeries(data, timeCalendar(), units="RUNIF") x ## Search for the Split: splits(x, sd=3, complement=TRUE) splits(x, sd=3, complement=FALSE) } timeSeries/man/fin-monthly.Rd0000644000176200001440000000574014546503452015707 0ustar liggesusers\name{monthly} \alias{monthly} \alias{countMonthlyRecords} \alias{rollMonthlyWindows} \alias{rollMonthlySeries} \title{Special monthly series} \description{ Functions and methods dealing with special monthly \code{"timeSeries"} objects. } \usage{ rollMonthlyWindows(x, period = "12m", by = "1m") rollMonthlySeries(x, period = "12m", by = "1m", FUN, \dots) countMonthlyRecords(x) } \arguments{ \item{x}{ a \code{"timeSeries"} object. } \item{period,by}{ character strings specifying the rollling period composed by the length of the period and its unit. Examples: \code{"3m"}, \code{"6m"}, \code{"12m"}, and \code{"24m"} represent quarterly, semi-annual, annual and bi-annual shifts, respectively. It is the responsibility of the user to determine proper start of the series. } \item{FUN}{ the function for the statistic to be applied. For example, \code{colMean} in the case of aggregation. } \item{\dots}{ arguments passed to the function \code{FUN}. } } \details{ \code{rollMonthlySeries} computes the statistics defined by the function \code{FUN} over rolling windows, internally computed by the function \code{rollMonthlyWindows}. Note, the periods may be overlapping, may be dense, or even may have gaps. \code{countMonthlyRecords} computes a \code{"timeSeries"} that holds the number of records for each month, see examples. The dates are set to the end of the month. \code{rollMonthlyWindows} computes start and end dates for rolling time windows. Argument \code{period} specifies the length of the periods over which \code{FUN} is applied, while \code{by} gives the amount by which the window is shifted. Non-overlapping windows correspond to \code{by >= period}. } \value{ for \code{countMonthlyRecords} and \code{rollMonthlySeries}, a \code{"timeSeries"} object. for \code{rollMonthlyWindows}, a list with attribute \code{"control"} keeping the \code{start} and \code{end} dates of the series. The components of the list are: \item{from}{an object from class \code{"timeDate"}.} \item{to}{an object from class \code{"timeDate"}.} } \seealso{ \code{\link{isMonthly}}, \code{\link{isRegular}} } \examples{ ## load Microsoft daily dataset x <- MSFT ## count monthly records head(x) # 3 obs. for Sep 2000 counts <- countMonthlyRecords(x) counts ## diy computation of the counts diy <- rollMonthlySeries(x[ , 1], period = "1m", by = "1m", FUN = NROW) ## difference is only in some attributes (e.g. column names) all.equal(diy, counts) ## quaterly non-overlapping time periods windows <- rollMonthlyWindows(counts[-1, ], period = "3m", by = "3m") windows ## nicely print results as a data.frame, each row is a time window data.frame(cbind(FROM = format(windows$from), TO = format(windows$to))) ## compute the average number of monthly trading days per quarter rollMonthlySeries(counts[-1, ], period = "3m", by = "3m", FUN = mean) } \keyword{chron} timeSeries/man/fin-turnpoints.Rd0000755000176200001440000000644614435105524016444 0ustar liggesusers\name{turns} \alias{turns} \alias{turnsStats} \title{Turning points of a time series} \description{ Extracts and analyzes turning points of an univariate \code{"timeSeries"} object. } \usage{ turns(x, \dots) turnsStats(x, doplot = TRUE) } \arguments{ \item{x}{ an univariate \code{"timeSeries"} object of financial indices or prices. } \item{\dots}{ optional arguments passed to the function \code{na.omit}. } \item{doplot}{ a logical flag, should the results be plotted? By default TRUE. } } \details{ The function \code{turns} determines the number and the positions of extrema (turning points, either peaks or pits) in a regular time series. The function \code{turnsStats} calculates the quantity of information associated with the observations in this series, according to Kendall's information theory. The functions are borrowed from the contributed R package \code{pastecs} and made ready for working together with univariate \code{timeSeries} objects. You need not to load the R package \code{pastecs}, the code parts we need here are builtin in the \code{timeSeries} package. We have renamed the function \code{turnpoints} to \code{turns} to distinguish between the original function in the contributed R package \code{pastecs} and our Rmetrics function wrapper. For further details please consult the help page from the contributed R package \code{pastecs}. } \value{ for \code{turns}, an object of class \code{timeSeries}.\cr for \code{turnsStats}, an object of class \code{turnpoints} with the following entries: \item{data}{The dataset to which the calculation is done.} \item{n}{The number of observations.} \item{points}{The value of the points in the series, after elimination of ex-aequos.} \item{pos}{The position of the points on the time scale in the series (including ex-aequos).} \item{exaequos}{Location of exaequos (1), or not (0).} \item{nturns}{Total number of turning points in the whole time series.} \item{firstispeak}{Is the first turning point a peak (TRUE), or not (FALSE).} \item{peaks}{Logical vector. Location of the peaks in the time series without ex-aequos.} \item{pits}{Logical vector. Location of the pits in the time series without ex-aequos.} \item{tppos}{Position of the turning points in the initial series (with ex-aequos).} \item{proba}{Probability to find a turning point at this location.} \item{info}{Quantity of information associated with this point.} } \author{ Frederic Ibanez and Philippe Grosjean for code from the contributed R package \code{pastecs} and Rmetrics for the function wrapper. } \references{ Ibanez, F., 1982, Sur une nouvelle application de la theorie de l'information a la description des series chronologiques planctoniques. J. Exp. Mar. Biol. Ecol., 4, 619--632 Kendall, M.G., 1976, Time Series, 2nd ed. Charles Griffin and Co, London. } \examples{ ## Load Swiss Equities Series - SPI.RET <- LPP2005REC[, "SPI"] head(SPI.RET) ## Cumulate and Smooth the Series - SPI <- smoothLowess(cumulated(SPI.RET), f=0.05) plot(SPI) ## Plot Turn Points Series - SPI.SMOOTH <- SPI[, 2] tP <- turns(SPI.SMOOTH) plot(tP) ## Compute Statistics - turnsStats(SPI.SMOOTH) } \keyword{chron} timeSeries/man/methods-is.Rd0000755000176200001440000000131514436112162015504 0ustar liggesusers\name{is.timeSeries} \alias{is.timeSeries} \alias{is.signalSeries} \title{Check if an object is from class 'timeSeries'} \description{ \code{is.timeSeries} tests if its argument is a \code{timeSeries}. \code{is.signalSeries} tests if series has no timestamps. } \usage{ is.timeSeries(x) is.signalSeries(x) } \arguments{ \item{x}{ an object. } } \value{ a logical value, \code{TRUE} or \code{FALSE}. } \examples{ ## Create an artificial 'timeSeries' object - setRmetricsOptions(myFinCenter = "GMT") charvec <- timeCalendar() data <- matrix(rnorm(12)) TS <- timeSeries(data, charvec, units = "RAND") TS ## Test for 'timeSeries' - is.timeSeries(TS) } \keyword{chron} timeSeries/man/timeSeries-slotTime.Rd0000755000176200001440000000347314434446143017355 0ustar liggesusers\name{time} \title{Get and set time stamps of a 'timeSeries'} \alias{time} \alias{time<-} \alias{time,timeSeries-method} \alias{time.timeSeries} \alias{time<-.timeSeries} \alias{time<-.default} \alias{getTime} \alias{setTime<-} \description{ Functions and methods extracting and modifying positions of 'timeSeries' objects. } \usage{ \S4method{time}{timeSeries}(x, \dots) \method{time}{timeSeries}(x) <- value getTime(x) setTime(x) <- value } \arguments{ \item{value}{ a valid value for the time component of \code{x}. } \item{x}{ an object of class \code{timeSeries}. } \item{\dots}{ optional arguments passed to other methods. } } \details{ \code{time} and \code{time<-} are generic functions with methods for class \code{"timeSeries"}. They get and set the time component of the object. \code{getTime} and \code{setTime} are non-generic alternatives are non-generic wrappers of \code{time} and \code{time<-}, respectively. There is another generic function \code{time<-} defined in package \pkg{zoo}. When that package is loaded its \code{time<-} gets the \code{"timeSeries"} method. Also, if \code{"time<-"} is called with an object from class other than \code{"timeSeries"}, the call is dispatched to \code{"zoo:time<-"} to apply a suitable method. } \value{ for \code{time} and \code{getTime}, a \code{"timeDate"} object, for \code{time<-} and and \code{setTime}, the modified \code{"timeSeries"} object. } \examples{ ## Create Dummy 'timeSeries' - X <- timeSeries(matrix(rnorm(24), 12), timeCalendar()) ## Return Series Positions - getTime(X) time(X) ## Add / Subtract one Day from X setTime(X) <- time(X) - 24*3600 # sec X time(X) <- time(X) + 24*3600 # sec X } \keyword{chron} timeSeries/man/methods-as.Rd0000644000176200001440000000677214550240547015513 0ustar liggesusers\name{as} \alias{as} \alias{as.timeSeries} \alias{as.timeSeries.default} \alias{as.timeSeries.data.frame} \alias{as.timeSeries.character} \alias{as.timeSeries.ts} \alias{as.timeSeries.zoo} \alias{as.matrix,timeSeries-method} \alias{as.data.frame,timeSeries-method} \alias{as.list,timeSeries-method} %\alias{as.ts,timeSeries-method} % S3 versions of the above \alias{as.matrix.timeSeries} \alias{as.data.frame.timeSeries} \alias{as.list.timeSeries} \alias{as.ts} \alias{as.ts.timeSeries} % for as(x, "class") where x is the 1st element of the signature \alias{coerce,ANY,timeSeries-method} \alias{coerce,data.frame,timeSeries-method} \alias{coerce,character,timeSeries-method} \alias{coerce,ts,timeSeries-method} % for as(x, "class") where x is timeSeries \alias{coerce,timeSeries,matrix-method} \alias{coerce,timeSeries,data.frame-method} \alias{coerce,timeSeries,list-method} \alias{coerce,timeSeries,ts-method} \alias{coerce,timeSeries,tse-method} \title{Convert objects to/from class 'timeSeries'} \description{ Functions and methods dealing with the coercion between \code{"timeSeries"} and other classes. } \usage{ ## convert to 'timeSeries' as.timeSeries(x, \dots) ## convert from 'timeSeries' to other classes \method{as.ts}{timeSeries}(x, \dots) \S4method{as.matrix}{timeSeries}(x, \dots) \S4method{as.data.frame}{timeSeries}(x, row.names = NULL, optional = FALSE, \dots) \S4method{as.list}{timeSeries}(x, \dots) } \arguments{ \item{x}{ the object to be converted, see Section \sQuote{Details} for the special case when \code{class(x)} is \code{"character"}. } \item{row.names}{ \code{NULL} or a character vector giving the row names for the data frame. Missing values are not allowed. } \item{optional}{ a logical value. If \code{TRUE}, setting row names and converting column names (to syntactic names) is optional. } \item{\dots}{ arguments passed to other methods. } } \details{ Functions to create \code{"timeSeries"} objects from other objects and to convert \code{"timeSeries"} objects to other classes. \code{as.timeSeries} is a generic function to convert an object to \code{"timeSeries"}. There are specialised methods for the following classes: \code{"ts"}, \code{"data.frame"}, \code{"character"}, and \code{"zoo"}. The default method is equivalent to calling \code{"timeSeries()"}, so \code{x} can be of any type that \code{"timeSeries()"} accepts. The \code{character} method of \code{as.timeSeries} is special, in that its contents are parsed and evaluated, then \code{as.timeSeries} is called on the returned value (passing also the \code{"..."} arguments. Care is needed to avoid infinite recursion here since currently the code doesn't guard against it. } \value{ for \code{as.timeSeries}, an object of class \code{"timeSeries"}. \cr for \code{as.numeric}, \code{as.data.frame}, \code{as.matrix}, \code{as.ts}, \code{as.list} - a numeric vector, a data frame, a matrix, an object of class \code{ts}, or a \code{"list"}, respectively. } \seealso{ \code{\link{timeSeries}}, class \code{\linkS4class{timeSeries}} } \examples{ ## Create an Artificial 'timeSeries' Object setRmetricsOptions(myFinCenter = "GMT") charvec <- timeCalendar() data <- matrix(rnorm(12)) TS <- timeSeries(data, charvec, units = "RAND") TS ## Coerce to Vector as.vector(TS) ## Coerce to Matrix as.matrix(TS) ## Coerce to Data Frame as.data.frame(TS) } \keyword{chron} \keyword{ts} timeSeries/man/timeSeries-class.Rd0000644000176200001440000004421514545535516016664 0ustar liggesusers\name{timeSeries-class} \Rdversion{1.1} \docType{class} \alias{timeSeries-class} % \alias{[,timeSeries,ANY,index_timeSeries-method} % \alias{[,timeSeries,character,character-method} % \alias{[,timeSeries,character,index_timeSeries-method} % \alias{[,timeSeries,character,missing-method} % \alias{[,timeSeries,index_timeSeries,character-method} % \alias{[,timeSeries,index_timeSeries,index_timeSeries-method} % \alias{[,timeSeries,index_timeSeries,missing-method} % \alias{[,timeSeries,matrix,missing-method} % \alias{[,timeSeries,missing,character-method} % \alias{[,timeSeries,missing,index_timeSeries-method} % \alias{[,timeSeries,missing,missing-method} % \alias{[,timeSeries,time_timeSeries,ANY-method} % \alias{[,timeSeries,time_timeSeries,character-method} % \alias{[,timeSeries,time_timeSeries,index_timeSeries-method} % \alias{[,timeSeries,time_timeSeries,missing-method} % \alias{[,timeSeries,timeDate,character-method} % \alias{[,timeSeries,timeDate,index_timeSeries-method} % \alias{[,timeSeries,timeDate,missing-method} % \alias{[,timeSeries,timeSeries,index_timeSeries-method} % \alias{[,timeSeries,timeSeries,missing-method} % \alias{[<-,timeSeries,character,ANY-method} % \alias{[<-,timeSeries,character,missing-method} % \alias{[<-,timeSeries,timeDate,ANY-method} % \alias{[<-,timeSeries,timeDate,missing-method} % \alias{$,timeSeries-method} % \alias{$<-,timeSeries,ANY-method} % \alias{$<-,timeSeries,factor-method} % \alias{$<-,timeSeries,numeric-method} % \alias{aggregate,timeSeries-method} % \alias{align,timeSeries-method} % \alias{apply,timeSeries-method} % \alias{as.data.frame,timeSeries-method} % \alias{as.list,timeSeries-method} % \alias{as.matrix,timeSeries-method} % \alias{as.ts,timeSeries-method} % \alias{attach,timeSeries-method} % \alias{cbind2,ANY,timeSeries-method} % \alias{cbind2,timeSeries,ANY-method} % \alias{cbind2,timeSeries,missing-method} % \alias{cbind2,timeSeries,timeSeries-method} % \alias{coerce,ANY,timeSeries-method} % \alias{coerce,character,timeSeries-method} % \alias{coerce,data.frame,timeSeries-method} % \alias{coerce,timeSeries,data.frame-method} % \alias{coerce,timeSeries,list-method} % \alias{coerce,timeSeries,matrix-method} % \alias{coerce,timeSeries,ts-method} % \alias{coerce,ts,timeSeries-method} % \alias{colCummaxs,timeSeries-method} % \alias{colCummins,timeSeries-method} % \alias{colCumprods,timeSeries-method} % \alias{colCumreturns,timeSeries-method} % \alias{colCumsums,timeSeries-method} % \alias{colMeans,timeSeries-method} % \alias{colnames,timeSeries-method} % \alias{colnames<-,timeSeries-method} % \alias{colSums,timeSeries-method} % \alias{comment,timeSeries-method} % \alias{comment<-,timeSeries-method} % \alias{coredata,timeSeries-method} % \alias{coredata<-,timeSeries,ANY-method} % \alias{coredata<-,timeSeries,matrix-method} % \alias{cummax,timeSeries-method} % \alias{cummin,timeSeries-method} % \alias{cumprod,timeSeries-method} % \alias{cumsum,timeSeries-method} % \alias{diff,timeSeries-method} % \alias{dim,timeSeries-method} % \alias{dim<-,timeSeries-method} % \alias{dimnames,timeSeries-method} % \alias{dimnames<-,timeSeries,list-method} % \alias{end,timeSeries-method} % \alias{filter,timeSeries-method} % \alias{finCenter,timeSeries-method} % \alias{finCenter<-,timeSeries-method} % \alias{frequency,timeSeries-method} % \alias{getDataPart,timeSeries-method} % \alias{head,timeSeries-method} \alias{initialize,timeSeries-method} % \alias{is.na,timeSeries-method} % \alias{is.unsorted,timeSeries-method} % \alias{isDaily,timeSeries-method} % \alias{isMonthly,timeSeries-method} % \alias{isQuarterly,timeSeries-method} % \alias{isRegular,timeSeries-method} % \alias{lag,timeSeries-method} % \alias{lines,timeSeries-method} % \alias{median,timeSeries-method} % \alias{merge,ANY,timeSeries-method} % \alias{merge,matrix,timeSeries-method} % \alias{merge,numeric,timeSeries-method} % \alias{merge,timeSeries,ANY-method} % \alias{merge,timeSeries,matrix-method} % \alias{merge,timeSeries,missing-method} % \alias{merge,timeSeries,numeric-method} % \alias{merge,timeSeries,timeSeries-method} % \alias{na.contiguous,timeSeries-method} % \alias{na.omit,timeSeries-method} % \alias{names,timeSeries-method} % \alias{names<-,timeSeries-method} % \alias{Ops,array,timeSeries-method} % \alias{Ops,timeSeries,array-method} % \alias{Ops,timeSeries,timeSeries-method} % \alias{Ops,timeSeries,ts-method} % \alias{Ops,timeSeries,vector-method} % \alias{Ops,ts,timeSeries-method} % \alias{Ops,vector,timeSeries-method} % \alias{outlier,timeSeries-method} % \alias{plot,timeSeries-method} % \alias{points,timeSeries-method} % \alias{print,timeSeries-method} % \alias{quantile,timeSeries-method} % \alias{rank,timeSeries-method} % \alias{rbind2,ANY,timeSeries-method} % \alias{rbind2,timeSeries,ANY-method} % \alias{rbind2,timeSeries,missing-method} % \alias{rbind2,timeSeries,timeSeries-method} % \alias{returns,timeSeries-method} % \alias{rev,timeSeries-method} % \alias{rowCumsums,timeSeries-method} % \alias{rownames,timeSeries-method} % \alias{rownames<-,timeSeries,ANY-method} % \alias{rownames<-,timeSeries,timeDate-method} % \alias{sample,timeSeries-method} % \alias{scale,timeSeries-method} % \alias{series,timeSeries-method} % \alias{series<-,timeSeries,ANY-method} % \alias{series<-,timeSeries,matrix-method} % \alias{setDataPart,timeSeries-method} % \alias{show,timeSeries-method} % \alias{sort,timeSeries-method} % \alias{start,timeSeries-method} % \alias{str,timeSeries-method} % \alias{t,timeSeries-method} % \alias{tail,timeSeries-method} % \alias{time,timeSeries-method} % \alias{window,timeSeries-method} \title{Class 'timeSeries' in package timeSeries} \description{ Class \code{"timeSeries"} in package timeSeries. } \section{Objects from the Class}{ The main functions for creating objects from class \code{"timeSeries"} \code{\link{timeSeries}} and \code{\link{as.timeSeries}}. Objects can also be created by calls of the form \code{new("timeSeries", .Data, units, positions, format, FinCenter, recordIDs, title, documentation)} but this is not recommended for routine work. } \section{Slots}{ The structure of the \code{"timeSeries"} objects should, in general, be considered internal. The accessor functions to get and set the components should be used to get and set values of the slots. \describe{ \item{\code{.Data}:}{ Object of class \code{"matrix"} containing the data, one column for each variable. } \item{\code{units}:}{ Object of class \code{"character"}, the unit (or variable, or column) names of the time series object. } \item{\code{positions}:}{ Object of class \code{"numeric"}, the datetime stamps. If the time series doesn't have datetime stamps, then \code{positions} is of length zero. } \item{\code{format}:}{ Object of class \code{"character"}, a datetime format (such as \code{"\%Y-\%m-\%d"}). if there are no time stamps \code{"format"} is equal to \code{"counts"}. } \item{\code{FinCenter}:}{ Object of class \code{"character"}, the financial center. } \item{\code{recordIDs}:}{ Object of class \code{"data.frame"} ~~ } \item{\code{title}:}{ Object of class \code{"character"}, a title for printing. } \item{\code{documentation}:}{ Object of class \code{"character"}, by default it is set to the current date. } } } \section{Extends}{ Class \code{"\linkS4class{structure}"}, from data part. Class \code{"\linkS4class{vector}"}, by class "structure", distance 2, with explicit coerce. } \section{Methods}{ Below is a list of the methods that have \code{"timeSeries"} in their signature. It can be useful for technical purposes, for example in reporting bugs but most methods that need explanation are documented with the corresponding functions and looking at their help pages is recommended. There are short explanations for methods for functions that are not supposed to be called directly. \describe{ \item{[}{\code{signature(x = "timeSeries", i = "ANY", j = "index_timeSeries")}: ... } \item{[}{\code{signature(x = "timeSeries", i = "character", j = "character")}: ... } \item{[}{\code{signature(x = "timeSeries", i = "character", j = "index_timeSeries")}: ... } \item{[}{\code{signature(x = "timeSeries", i = "character", j = "missing")}: ... } \item{[}{\code{signature(x = "timeSeries", i = "index_timeSeries", j = "character")}: ... } \item{[}{\code{signature(x = "timeSeries", i = "index_timeSeries", j = "index_timeSeries")}: ... } \item{[}{\code{signature(x = "timeSeries", i = "index_timeSeries", j = "missing")}: ... } \item{[}{\code{signature(x = "timeSeries", i = "matrix", j = "missing")}: ... } \item{[}{\code{signature(x = "timeSeries", i = "missing", j = "character")}: ... } \item{[}{\code{signature(x = "timeSeries", i = "missing", j = "index_timeSeries")}: ... } \item{[}{\code{signature(x = "timeSeries", i = "missing", j = "missing")}: ... } \item{[}{\code{signature(x = "timeSeries", i = "time_timeSeries", j = "ANY")}: ... } \item{[}{\code{signature(x = "timeSeries", i = "time_timeSeries", j = "character")}: ... } \item{[}{\code{signature(x = "timeSeries", i = "time_timeSeries", j = "index_timeSeries")}: ... } \item{[}{\code{signature(x = "timeSeries", i = "time_timeSeries", j = "missing")}: ... } \item{[}{\code{signature(x = "timeSeries", i = "timeDate", j = "character")}: ... } \item{[}{\code{signature(x = "timeSeries", i = "timeDate", j = "index_timeSeries")}: ... } \item{[}{\code{signature(x = "timeSeries", i = "timeDate", j = "missing")}: ... } \item{[}{\code{signature(x = "timeSeries", i = "timeSeries", j = "index_timeSeries")}: ... } \item{[}{\code{signature(x = "timeSeries", i = "timeSeries", j = "missing")}: ... } \item{[<-}{\code{signature(x = "timeSeries", i = "character", j = "ANY")}: ... } \item{[<-}{\code{signature(x = "timeSeries", i = "character", j = "missing")}: ... } \item{[<-}{\code{signature(x = "timeSeries", i = "timeDate", j = "ANY")}: ... } \item{[<-}{\code{signature(x = "timeSeries", i = "timeDate", j = "missing")}: ... } \item{$}{\code{signature(x = "timeSeries")}: ... } \item{$<-}{\code{signature(x = "timeSeries", value = "ANY")}: ... } \item{$<-}{\code{signature(x = "timeSeries", value = "factor")}: ... } \item{$<-}{\code{signature(x = "timeSeries", value = "numeric")}: ... } \item{aggregate}{\code{signature(x = "timeSeries")}: ... } \item{align}{\code{signature(x = "timeSeries")}: ... } \item{apply}{\code{signature(X = "timeSeries")}: ... } \item{as.data.frame}{\code{signature(x = "timeSeries")}: ... } \item{as.list}{\code{signature(x = "timeSeries")}: ... } \item{as.matrix}{\code{signature(x = "timeSeries")}: ... } \item{as.ts}{\code{signature(x = "timeSeries")}: ... } \item{attach}{\code{signature(what = "timeSeries")}: ... } \item{cbind2}{\code{signature(x = "ANY", y = "timeSeries")}: ... } \item{cbind2}{\code{signature(x = "timeSeries", y = "ANY")}: ... } \item{cbind2}{\code{signature(x = "timeSeries", y = "missing")}: ... } \item{cbind2}{\code{signature(x = "timeSeries", y = "timeSeries")}: ... } \item{coerce}{\code{signature(from = "ANY", to = "timeSeries")} } \item{coerce}{\code{signature(from = "character", to = "timeSeries")} } \item{coerce}{\code{signature(from = "data.frame", to = "timeSeries")} } \item{coerce}{\code{signature(from = "timeSeries", to = "data.frame")} } \item{coerce}{\code{signature(from = "timeSeries", to = "list")}: } \item{coerce}{\code{signature(from = "timeSeries", to = "matrix")} } \item{coerce}{\code{signature(from = "timeSeries", to = "ts")}: } \item{coerce}{\code{signature(from = "ts", to = "timeSeries")}: \code{coerce} should not be called directly. Use \code{as(object, "target_class")} instead. } \item{colCummaxs}{\code{signature(x = "timeSeries")}: ... } \item{colCummins}{\code{signature(x = "timeSeries")}: ... } \item{colCumprods}{\code{signature(x = "timeSeries")}: ... } \item{colCumreturns}{\code{signature(x = "timeSeries")}: ... } \item{colCumsums}{\code{signature(x = "timeSeries")}: ... } \item{colMeans}{\code{signature(x = "timeSeries")}: ... } \item{colnames}{\code{signature(x = "timeSeries")}: ... } \item{colnames<-}{\code{signature(x = "timeSeries")}: ... } \item{colSums}{\code{signature(x = "timeSeries")}: ... } \item{comment}{\code{signature(x = "timeSeries")}: ... } \item{comment<-}{\code{signature(x = "timeSeries")}: ... } \item{coredata}{\code{signature(x = "timeSeries")}: ... } \item{coredata<-}{\code{signature(x = "timeSeries", value = "ANY")}: ... } \item{coredata<-}{\code{signature(x = "timeSeries", value = "matrix")}: ... } \item{cummax}{\code{signature(x = "timeSeries")}: ... } \item{cummin}{\code{signature(x = "timeSeries")}: ... } \item{cumprod}{\code{signature(x = "timeSeries")}: ... } \item{cumsum}{\code{signature(x = "timeSeries")}: ... } \item{diff}{\code{signature(x = "timeSeries")}: ... } \item{dim}{\code{signature(x = "timeSeries")}: ... } \item{dim<-}{\code{signature(x = "timeSeries")}: ... } \item{dimnames}{\code{signature(x = "timeSeries")}: ... } \item{dimnames<-}{\code{signature(x = "timeSeries", value = "list")}: ... } \item{end}{\code{signature(x = "timeSeries")}: ... } \item{filter}{\code{signature(x = "timeSeries")}: ... } \item{finCenter}{\code{signature(x = "timeSeries")}: ... } \item{finCenter<-}{\code{signature(x = "timeSeries")}: ... } \item{frequency}{\code{signature(x = "timeSeries")}: ... } \item{getDataPart}{\code{signature(object = "timeSeries")}: ... } \item{head}{\code{signature(x = "timeSeries")}: ... } \item{initialize}{\code{signature(.Object = "timeSeries")}: don't call \code{"initialize"}, call \code{new("timeSeries", ...)} instead. Even better, call \code{timeSeries}. } \item{is.na}{\code{signature(x = "timeSeries")}: ... } \item{is.unsorted}{\code{signature(x = "timeSeries")}: ... } \item{isDaily}{\code{signature(x = "timeSeries")}: ... } \item{isMonthly}{\code{signature(x = "timeSeries")}: ... } \item{isQuarterly}{\code{signature(x = "timeSeries")}: ... } \item{isRegular}{\code{signature(x = "timeSeries")}: ... } \item{lag}{\code{signature(x = "timeSeries")}: ... } \item{lines}{\code{signature(x = "timeSeries")}: ... } \item{median}{\code{signature(x = "timeSeries")}: ... } \item{merge}{\code{signature(x = "ANY", y = "timeSeries")}: ... } \item{merge}{\code{signature(x = "matrix", y = "timeSeries")}: ... } \item{merge}{\code{signature(x = "numeric", y = "timeSeries")}: ... } \item{merge}{\code{signature(x = "timeSeries", y = "ANY")}: ... } \item{merge}{\code{signature(x = "timeSeries", y = "matrix")}: ... } \item{merge}{\code{signature(x = "timeSeries", y = "missing")}: ... } \item{merge}{\code{signature(x = "timeSeries", y = "numeric")}: ... } \item{merge}{\code{signature(x = "timeSeries", y = "timeSeries")}: ... } \item{na.contiguous}{\code{signature(object = "timeSeries")}: ... } \item{na.omit}{\code{signature(object = "timeSeries")}: ... } \item{names}{\code{signature(x = "timeSeries")}: ... } \item{names<-}{\code{signature(x = "timeSeries")}: ... } \item{Ops}{\code{signature(e1 = "array", e2 = "timeSeries")}: ... } \item{Ops}{\code{signature(e1 = "timeSeries", e2 = "array")}: ... } \item{Ops}{\code{signature(e1 = "timeSeries", e2 = "timeSeries")}: ... } \item{Ops}{\code{signature(e1 = "timeSeries", e2 = "ts")}: ... } \item{Ops}{\code{signature(e1 = "timeSeries", e2 = "vector")}: ... } \item{Ops}{\code{signature(e1 = "ts", e2 = "timeSeries")}: ... } \item{Ops}{\code{signature(e1 = "vector", e2 = "timeSeries")}: ... } \item{outlier}{\code{signature(x = "timeSeries")}: ... } \item{plot}{\code{signature(x = "timeSeries")}: ... } \item{points}{\code{signature(x = "timeSeries")}: ... } \item{print}{\code{signature(x = "timeSeries")}: ... } \item{quantile}{\code{signature(x = "timeSeries")}: ... } \item{rank}{\code{signature(x = "timeSeries")}: ... } \item{rbind2}{\code{signature(x = "ANY", y = "timeSeries")}: ... } \item{rbind2}{\code{signature(x = "timeSeries", y = "ANY")}: ... } \item{rbind2}{\code{signature(x = "timeSeries", y = "missing")}: ... } \item{rbind2}{\code{signature(x = "timeSeries", y = "timeSeries")}: ... } \item{returns}{\code{signature(x = "timeSeries")}: ... } \item{rev}{\code{signature(x = "timeSeries")}: ... } \item{rowCumsums}{\code{signature(x = "timeSeries")}: ... } \item{rownames}{\code{signature(x = "timeSeries")}: ... } \item{rownames<-}{\code{signature(x = "timeSeries", value = "ANY")}: ... } \item{rownames<-}{\code{signature(x = "timeSeries", value = "timeDate")}: ... } \item{sample}{\code{signature(x = "timeSeries")}: ... } \item{scale}{\code{signature(x = "timeSeries")}: ... } \item{series}{\code{signature(x = "timeSeries")}: ... } \item{series<-}{\code{signature(x = "timeSeries", value = "ANY")}: ... } \item{series<-}{\code{signature(x = "timeSeries", value = "matrix")}: ... } \item{setDataPart}{\code{signature(object = "timeSeries")}: ... } \item{show}{\code{signature(object = "timeSeries")}: ... } \item{sort}{\code{signature(x = "timeSeries")}: ... } \item{start}{\code{signature(x = "timeSeries")}: ... } \item{str}{\code{signature(object = "timeSeries")}: ... } \item{t}{\code{signature(x = "timeSeries")}: ... } \item{tail}{\code{signature(x = "timeSeries")}: ... } \item{time}{\code{signature(x = "timeSeries")}: ... } \item{window}{\code{signature(x = "timeSeries")}: ... } } } \seealso{ \code{\link{timeSeries}} and \code{\link{as.timeSeries}} for creating and converting to \code{"timeSeries"}, \code{\link{readSeries}} for importing from a text file, \code{\link{dummyDailySeries}} for creation of dummy daily and monthly time series, \code{\link{as.matrix}}, \code{\link{time}}, \code{\link{finCenter}}, \code{\link{getUnits}}, \code{\link{dim}}, \code{\link{start}}, etc., for accessing properties of the time series. } \examples{ ## see the help page for timeSeries() showClass("timeSeries") } \keyword{classes} timeSeries/man/fin-cumulated.Rd0000755000176200001440000000324014436327735016202 0ustar liggesusers\name{cumulated} \alias{cumulated} \alias{cumulated.default} \title{Cumulated time series from returns} \description{ Computes a cumulated financial \code{"timeSeries"}, e.g. prices or indexes, from financial returns. } \usage{ cumulated(x, \dots) \method{cumulated}{default}(x, method = c("continuous", "discrete", "compound", "simple"), percentage = FALSE, \dots) } \arguments{ \item{x}{ an object of class \code{timeSeries}. } \item{method}{ a character string, the method for computation of returns. } \item{percentage}{ a logical value. By default \code{FALSE}, if \code{TRUE} the series will be expressed in percentage changes. } \item{\dots}{ ignored by the default method. } } \details{ Note, the function \code{cumulated} assumes as input discrete returns from a price or index series. Only then the cumulated series agrees with the original price or index series. The first values of the cumulated series cannot be computed, it is assumed that the series is indexed to 1. } \value{ a \code{"timeSeries"} object } \seealso{ \code{\link{returns}}, %\code{\link{cumulated}}, \code{\link{drawdowns}}, \code{\link{splits}}, %\code{\link{spreads}}, \code{\link{midquotes}}, \code{\link{index2wealth}} } \examples{ ## Use the Microsofts' Close Prices Indexed to 1 - MSFT.CL <- MSFT[, "Close"] MSFT.CL <- MSFT.CL/MSFT[[1, "Close"]] head(MSFT.CL) ## Compute Discrete Return - MSFT.RET <- returns(MSFT.CL, method = "discrete") ## Cumulated Series and Compare - MSFT.CUM <- cumulated(MSFT.RET, method = "discrete") head(cbind(MSFT.CL, MSFT.CUM)) } \keyword{chron} timeSeries/man/statistics-rowCumsums.Rd0000755000176200001440000000161114436050534020007 0ustar liggesusers\name{rowCum} \alias{rowCum} \alias{rowCumsums} \alias{rowCumsums,ANY-method} \alias{rowCumsums,timeSeries-method} \title{Cumulative row statistics} \description{ Compute cumulative row statistics. } \usage{ \S4method{rowCumsums}{ANY}(x, na.rm = FALSE, \dots) \S4method{rowCumsums}{timeSeries}(x, na.rm = FALSE, \dots) } \arguments{ \item{x}{ a time series, may be an object of class \code{"matrix"} or \code{"timeSeries"}. } \item{na.rm}{ a logical. Should missing values be removed? } \item{\dots}{ arguments to be passed. } } \value{ for the default method, a matrix, for the \code{"timeSeries"} method, an S4 object of class \code{"timeSeries"}. } \seealso{ \code{\link[=colCum]{colCumXXX}} } \examples{ ## Simulated Monthly Return Data - X = matrix(rnorm(24), ncol = 2) ## Compute cumulated Sums - rowCumsums(X) } \keyword{univar} timeSeries/man/fin-durations.Rd0000755000176200001440000000251414436606710016223 0ustar liggesusers\name{durations} \alias{durations} \alias{durationSeries} % removed \title{Durations from a 'timeSeries'} \description{ Computes durations from an object of class \code{"timeSeries"}. } \usage{ durations(x, trim = FALSE, units = c("secs", "mins", "hours", "days")) } \arguments{ \item{x}{ an object of class \code{"timeSeries"}. } \item{trim}{ a logical value. By default \code{TRUE}, the first missing observation in the return series will be removed. } \item{units}{ a character value or vector which allows to set the units in which the durations are measured. By default durations are measured in seconds. } } \details{ Durations measure how long it takes until we get the next record in a \code{timesSeries} object. We return a time series in which for each time stamp we get the length of the period from when we got the last record. This period is measured in length specified by the argument \code{units}, for daily data use \code{units="days"}. } \value{ an object of class \code{"timeSeries"} } \examples{ ## Compute Durations in days for the MSFT Sereries - head(durations(MSFT, units = "days")) head(durations(MSFT, trim = TRUE, units = "days")) ## The same in hours - head(durations(MSFT, trim = TRUE, units = "hours")) } \keyword{chron} timeSeries/man/fin-returns.Rd0000755000176200001440000000460114436327673015724 0ustar liggesusers\name{returns} \alias{returns} \alias{returns,ANY-method} \alias{returns,timeSeries-method} \alias{returns0} \alias{returnSeries} \alias{getReturns} \title{Financial returns} \description{ Compute financial returns from prices or indexes. } \usage{ returns(x, \dots) returns0(x, \dots) \S4method{returns}{ANY}(x, method = c("continuous", "discrete", "compound", "simple"), percentage = FALSE, \dots) \S4method{returns}{timeSeries}(x, method = c("continuous", "discrete", "compound", "simple"), percentage = FALSE, na.rm = TRUE, trim = TRUE, \dots) } \arguments{ \item{x}{ an object of class \code{timeSeries}. } \item{method}{ a character string. Which method should be used to compute the returns, one of "continuous", "discrete", or "compound", "simple". The second pair of methods is a synonym for the first two methods. } \item{percentage}{ a logical value. By default \code{FALSE}, if \code{TRUE} the series will be expressed in percentage changes. } \item{na.rm}{ a logical value. Should NAs be removed? By default \code{TRUE}. } \item{trim}{ a logical value. Should the time series be trimmed? By Default \code{TRUE}. } \item{\dots}{ arguments to be passed. } } \value{ an object of class \code{timeSeries}. \code{returns0} returns an untrimmed series with the first row of returns set to zero(s). } \note{ The functions \code{returnSeries} and \code{getReturns} will be removed in the near future. They are synonyms for the function \code{returns} and their use was discouraged for many years. Just use \code{returns}. The function \code{returnSeries} is no longer exported. \code{getReturns} is exported only because we are waiting for a package on CRAN to be updated. } \seealso{ %\code{\link{returns}}, \code{\link{cumulated}}, \code{\link{drawdowns}}, \code{\link{splits}}, \code{\link{spreads}}, \code{\link{midquotes}}, \code{\link{index2wealth}} } \examples{ ## Load Microsoft Data - setRmetricsOptions(myFinCenter = "GMT") data(MSFT) X = MSFT[1:10, 1:4] X ## Continuous Returns - returns(X) returns0(X) ## Discrete Returns: returns(X, method = "discrete") ## Don't trim: returns(X, trim = FALSE) ## Use Percentage Values: returns(X, percentage = TRUE, trim = FALSE) } \keyword{chron} timeSeries/man/statistics-orderStatistics.Rd0000755000176200001440000000164614436046244021024 0ustar liggesusers\name{orderStatistics} \alias{orderStatistics} \title{Order statistics} \description{ Computes the order statistics of a \code{"timeSeries"} object. } \usage{ orderStatistics(x) } \arguments{ \item{x}{ a \code{"timeSeries"} object. } } \details{ \code{orderStatistics} computes the order statistics for each column of a \code{"timeSeries"} object. The output is a named list with the order statistics for each column in a separate component. } \value{ a named list, in which each component is an univariate \code{"timeSeries"} containing the order statistics of the corresponding column of the input time series. } \examples{ ## Load Swiss Pension Fund Benchmark Data - setRmetricsOptions(myFinCenter = "GMT") X <- LPP2005REC[, "SPI"] colnames(X) ## Compute 1\% Order Statistics - N <- round(0.01*nrow(X)) N OS <- orderStatistics(X)[[1]] OS[1:N, ] } \keyword{chron} timeSeries/man/timeSeries-slotSeries.Rd0000755000176200001440000000430614434376477017721 0ustar liggesusers\name{series-methods} \docType{methods} \alias{series} \alias{series<-} \alias{series,timeSeries-method} \alias{series<-,timeSeries,matrix-method} \alias{series<-,timeSeries,ANY-method} \alias{series<-,timeSeries,data.frame-method} \alias{series<-,timeSeries,vector-method} \alias{coredata} \alias{coredata<-} %\alias{coredata,timeSeries-method} %\alias{coredata<-,timeSeries,matrix-method} %\alias{coredata<-,timeSeries,ANY-method} %\alias{coredata<-,timeSeries,data.frame-method} %\alias{coredata<-,timeSeries,vector-method} \alias{coredata.timeSeries} \alias{coredata<-.timeSeries} \title{Get and set the data component of a 'timeSeries'} \description{ Get and set the data component of a 'timeSeries'. } \usage{ series(x) series(x) <- value } \arguments{ \item{x}{ a \code{timeSeries} object. } \item{value}{ a \code{vector}, a \code{data.frame} or a \code{matrix} object of numeric data. } } \details{ \code{series} returns the \code{@.Data} slot of a \code{timeSeries} object in \code{matrix} form. The assignment version of \code{series} replaces the values of the time series with \code{value}. The row and column names of \code{value} are used if not \code{NULL}, otherwise they are left as in \code{x}. The most natural use is when \code{value} has the same dimensions as \code{as.matrix(x)}, but if that is not the case the result is almost as if \code{value} was converted to \code{"timeSeries"} directly. Methods for \code{zoo::coredata} and its assignment counterpart are defined, as well. Users who wish to use them should ensure that \code{zoo::coredata} is visible (e.g., by calling \code{library('zoo')} or \code{library('xts')}) or employ the \code{zoo::} prefix in the calls. These methods are equivalent to \code{series} and \code{`series<-`}, respectively. } \seealso{ \code{\link{timeSeries}} } \examples{ ## A Dummy 'timeSeries' Object ts <- timeSeries() ts ## Get the Matrix Part - mat <- series(ts) class(mat) mat ## Assign a New Univariate Series - series(ts) <- rnorm(12) ts ## Assign a New Bivariate Series - series(ts) <- matrix(rnorm(12), ncol = 2) ts } \keyword{programming} timeSeries/man/base-cbind.Rd0000755000176200001440000000476414436342036015437 0ustar liggesusers\name{cbind} \alias{cbind} \alias{rbind} \alias{cbind2} \alias{rbind2} % \alias{cbind,timeSeries-method} % \alias{rbind,timeSeries-method} \alias{cbind.timeSeries} \alias{rbind.timeSeries} % \alias{c.timeSeries} \alias{cbind2,ANY,timeSeries-method} \alias{cbind2,timeSeries,ANY-method} \alias{cbind2,timeSeries,missing-method} \alias{cbind2,timeSeries,timeSeries-method} \alias{rbind2,ANY,timeSeries-method} \alias{rbind2,timeSeries,ANY-method} \alias{rbind2,timeSeries,missing-method} \alias{rbind2,timeSeries,timeSeries-method} \title{Bind 'timeSeries' objects by column or row} \description{ Binds \code{"timeSeries"} objects either by column or by row. } % \S4method{merge}{timeSeries,timeSeries}(x, y, ...) \usage{ \method{cbind}{timeSeries}(\dots, deparse.level = 1) \method{rbind}{timeSeries}(\dots, deparse.level = 1) \S4method{cbind2}{timeSeries,ANY}(x, y) ## other methods for 'cbind2' with the same arguments, see Details \S4method{rbind2}{timeSeries,ANY}(x, y) ## other methods for 'rbind2' with the same arguments, see Details } \arguments{ \item{x, y}{ objects, at least one of whom is of class \code{"timeSeries"}. } \item{\dots}{ further arguments to bind. } \item{deparse.level}{ see the documentation of \code{base::cbind}. } } \details{ These functions bind the objects by row \code{rXXX} or column (\code{cXXX}. \code{cbind} and \code{rbind} are S3 generics, so the \code{"timeSeries"} methods describe here are called only when the first argument is \code{"timeSeries"}. \code{cbind2} and \code{rbind2} are S4 generics which dispatch on the first two arguments. The \code{"timeSeries"} methods for these are invoked whenever at least one of the first two arguments is of class \code{"timeSeries"}. All functions can be called with more than two arguments. After the first two are merged, the result is merged with the third, and so on. } \value{ an object of class \code{"timeSeries"} } \seealso{ \code{\link{merge}} for another way to merge \code{"timeSeries"} object column-wise. \code{\link[base]{rbind}} and \code{\link[base]{cbind}} from base R, \code{\link[methods]{rbind2}} and \code{\link[methods]{cbind2}} from package \code{"methods"}, } \examples{ ## Load Microsoft Data Set - x <- MSFT[1:12, ] x ## Bind Columnwise - X <- cbind(x[, "Open"], returns(x[, "Open"])) colnames(X) <- c("Open", "Return") X ## Bind Rowwise - Y <- rbind(x[1:3, "Open"], x[10:12, "Open"]) Y } \keyword{chron} timeSeries/man/base-sample.Rd0000755000176200001440000000301214436343200015614 0ustar liggesusers\name{sample} \alias{sample} \alias{sample,timeSeries-method} \title{Resample 'timeSeries' objects} \description{ Takes a sample of the specified size from the elements of a \code{"timeSeries"}. } \usage{ \S4method{sample}{timeSeries}(x, size, replace = FALSE, prob = NULL) } \arguments{ \item{x}{ an object from class \code{"timeSeries"}. } \item{size}{ a non-negative integer giving the number of items to choose. } \item{replace}{ sample with replacement if \code{TRUE}, otherwise without replacement. } \item{prob}{ a vector of probability weights for obtaining the elements of the vector being sampled. } } \details{ The function takes a sample of size \code{size} from the elements of the time series with or without replacement depending on argument \code{replace}. The result is returned as a \code{"timeSeries"} object. For details about the arguments see the documentation of \code{base:sample}. } \value{ an object from class \code{"timeSeries"} } \seealso{ \code{\link[base]{sample}} (\code{sample} in base \R), \code{\link[timeDate]{sample}} (the \code{"timeDate"} method) } \examples{ ## Monthly Calendar Series - x <- daily2monthly(LPP2005REC[, 1:2])[3:14, ] \dontshow{set.seed(1234)} ## Resample the Series with respect to the time stamps - resampled <- sample(x) resampled is.unsorted(resampled) } \keyword{chron} timeSeries/man/stats-na.contiguous.Rd0000644000176200001440000000264614550240211017357 0ustar liggesusers\name{na.contiguous} \alias{na.contiguous} \alias{na.contiguous.timeSeries} \alias{is.na} \alias{is.na,timeSeries-method} \title{Find longest contiguous stretch of non-NAs or check for NAs} \description{ Find the longest consecutive stretch of non-missing values in a \code{"timeSeries"} object. In the event of a tie, the first such stretch. Also, \code{"timeSeries"} method for \code{is.na}. } \usage{ \method{na.contiguous}{timeSeries}(object, ...) \S4method{is.na}{timeSeries}(x) } \arguments{ \item{object,x}{ a \code{"timeSeries"} object. } \item{\dots}{ further arguments passed to other methods. } } \value{ for the \code{na.contiguous} method, a \code{"timeSeries"} object without missing values, for the \code{is.na} method, a \code{"timeSeries"} object whose data part is a logical matrix of the same dimension as in \code{x} indicating if the corresponding values are \code{NA} or not. } \examples{ ## Dummy 'timeSeries' containing NAs \dontshow{set.seed(2023)} data <- matrix(sample(c(1:20, rep(NA,4))), ncol = 2) s <- timeSeries(data, timeCalendar(2023)) is.na(s) ## Find the longest consecutive non-missing values na.contiguous(s) ## tied longest stretches: 1:3, 6:9 and 10:12 x <- c(1:3, NA, NA, 6:8, NA, 10:12) ## should return the 1st one na.contiguous(x) # correct for R > 4.3.0 na.contiguous(timeSeries(x)) # correct for timeSeries version > 4030.106 } timeSeries/man/internals.Rd0000755000176200001440000000120414436472544015441 0ustar liggesusers\name{internals} %\alias{.align.timeSeries} % \alias{.appendList} % \alias{.axTicksByTime2} \alias{.colorwheelPalette} % \alias{.endpoints2} % \alias{.ohlcDailyPlot} % \alias{.periodicity2} % \alias{.plotOHLC} % \alias{.xtsPlot} \title{Exported internal functions} \description{ Internal functions which are still exported only because some packages are using them. The intent is to stop exporting or removing them. } \usage{ .colorwheelPalette(n) } \arguments{ \item{n}{ } } \details{ If you think that any of these functions are useful and don't have exported analogs, please contact the maintainer. } \keyword{internal} timeSeries/man/statistics-rollMean.Rd0000755000176200001440000000424014436334355017403 0ustar liggesusers\name{rollMean} \alias{rollMean} \alias{rollStats} \alias{rollMin} \alias{rollMax} \alias{rollMedian} \title{Rolling statistics} \description{ Computes rolling mean, min, max and median for a \code{"timeSeries"} object. } \usage{ rollStats(x, k, FUN = mean, na.pad = FALSE, align=c("center", "left", "right"), \dots) rollMean(x, k, na.pad = FALSE, align = c("center", "left", "right"), \dots) rollMin(x, k, na.pad = FALSE, align = c("center", "left", "right"), \dots) rollMax(x, k, na.pad = FALSE, align = c("center", "left", "right"), \dots) rollMedian(x, k, na.pad = FALSE, align = c("center", "left", "right"), \dots) } \arguments{ \item{x}{ an uni- or multivariate \code{"timeSeries"} object. } \item{k}{ an integer width of the rolling window. Must be odd for \code{rollMedian}. } \item{FUN}{ the function to be rolled. } \item{na.pad}{ a logical flag. Should NA padding be added at beginning? By default \code{FALSE}. } \item{align}{ a character string specifying whether the index of the result should be left- or right-aligned or centered compared to the rolling window of observations. The default choice is set to \code{align="center"}. } \item{\dots}{ optional arguments to be passed. } } \value{ an object of class \code{"timeSeries"} } \details{ The code in the core of the functions \code{rollMean}, \code{rollMin}, \code{rollMax}, and \code{rollMedian} was borrowed from the package \code{zoo} authored by Achim Zeileis, Gabor Grothendieck and Felix Andrews. } \author{ Achim Zeileis, Gabor Grothendieck and Felix Andrews for code from the contributed R package \code{zoo} used in the functions \code{rollMean}, \code{rollMin}, \code{rollMax}, and \code{rollMedian}. } \examples{ ## Use Swiss Pension Fund Data Set of Returns - head(LPP2005REC) SPI <- LPP2005REC[, "SPI"] head(SPI) ## Plot Drawdowns - rmean <- rollMean(SPI, k = 10) plot(rmean) } \keyword{chron} timeSeries/man/methods-comment.Rd0000755000176200001440000000146514436344170016547 0ustar liggesusers\name{comment} \alias{comment} \alias{comment<-} \alias{comment,timeSeries-method} \alias{comment<-,timeSeries-method} \title{Get and set comments for 'timeSeries' objects} \description{ Get or assign new comment to a \code{timeSeries} object. } \usage{ \S4method{comment}{timeSeries}(x) \S4method{comment}{timeSeries}(x) <- value } \arguments{ \item{x}{ a \code{timeSeries} object. } \item{value}{ a character vector, the comment. } } \details{ Objects from class \code{"timeSeries"} have a slot for documentation. These functions get and change its contents. } \examples{ ## Get description from a 'timeSeries' - comment(LPP2005REC) ## Add User to comment - comment(LPP2005REC) <- paste(comment(LPP2005REC), "by User Rmetrics") comment(LPP2005REC) } \keyword{chron} timeSeries/man/timeSeries-slotDocumentation.Rd0000755000176200001440000000414514436343567021275 0ustar liggesusers\name{attributes} \alias{attributes} \alias{getAttributes} \alias{setAttributes<-} \alias{documentation} \title{Get and set optional attributes of a 'timeSeries'} \description{ Extracts or assigns optional attributes from or to a \code{"timeSeries"} object. } \usage{ getAttributes(obj) setAttributes(obj) <- value } \arguments{ \item{obj}{ a \code{timeSeries} object whose optional attributes are to be accessed. } \item{value}{ an object, the new value of the attribute, or NULL to remove the attribute. } } \details{ Each \code{timeSeries} object is documented. By default a time series object holds in the documentation slot a string with creation time and the user who has defined it. But this is not all. Optionally the whole creation process and history can be recorded. For this the \code{@documentation} slot may have an optional \code{"Attributes"} element. This attribute is tracked over the whole life time of the object whenever the time series is changed. Whenever you like to be informed about the optional attributes, or you like to recover them you can dot it, and evenmore, whenever you like to add information as an addiitonal attribute you can also do it. The two functions \code{getAttributes} and \code{setAttributes} provide access to and allow to modify the optional attributes of a \code{timeSeries} object. %The replacement form causes the named attribute to take the value %specified (or create a new attribute with the value given). %Optional attributes are attached to the \code{@documentation} slot of the %S4 \code{timeSeries} object. These attributes are preserved during operations %on \code{timeSeries} objects using the internal function \code{.appendList}. } \examples{ \dontshow{set.seed(1234)} ## Create an artificial 'timeSeries' Object - tS <- dummyMonthlySeries() tS ## Get Optional Attributes - getAttributes(tS) tS@documentation ## Set a new Optional Attribute - setAttributes(tS) <- list(what="A dummy Series") tS getAttributes(tS) tS@documentation } \keyword{programming} timeSeries/man/base-dim.Rd0000755000176200001440000000611714436341416015124 0ustar liggesusers\name{dimnames} \alias{dim,timeSeries-method} \alias{dim<-,timeSeries-method} \alias{dimnames,timeSeries-method} \alias{dimnames<-,timeSeries,list-method} \alias{colnames<-,timeSeries-method} \alias{colnames,timeSeries-method} \alias{rownames,timeSeries-method} \alias{rownames<-,timeSeries,timeDate-method} \alias{rownames<-,timeSeries,ANY-method} \alias{names,timeSeries-method} \alias{names<-,timeSeries-method} \title{Dimension and their names for 'timeSeries' objects} \description{ Get and assign names, row names, column names, and dim names of \code{"timeSeries"} objects. } % \usage{ % %\S4method{dim}{timeSeries}(x) % %\S4method{dimnames}{timeSeries}(x) % %\S4method{dimnames}{timeSeries}(x) <- value % dim(x) % dimnames(x) % dimnames(x) <- value % colnames(x) % colnames(x) <- value % rownames(x) % rownames(x) <- value % \method{is.array}{timeSeries}(x) % } %\arguments{ % % \item{value}{ % a valid value for names component of \code{dimnames(x)}. % For a \code{"timeSeries"} object this is either \code{NULL} or a % character vector of length the column dimension. Not, row names % cannot be assigne for a \code{"timeSeries"} object, the function % \code{rownames()} will stop and return an error message. % } % \item{x}{ % an object of class \code{timeSeries}. % } % %} \details{ \code{"timeSeries"} methods are available for base R functions working on dimension names, including \code{dim}, \code{dimnames}, \code{colnames}, \code{rownames}, \code{names} and their assignment variants. \code{dim} is the dimension of the underlying data matrix. \code{rownames} gives the datetime stamps as a character vector. \code{rownames<-} sets them. \code{colnames} gives the values of \code{x@units}. These are conceptually the column names of the data matrix. \code{colnames<-} sets slot \code{units} of \code{x}. \code{dimnames} gives \code{list(rownames(x), colnames(x)}. \code{dimnames<-} calls \code{rownames} and \code{colnames} on \code{value[[1]]} and \code{value[[2]]}, respectively. } \note{ (GNB; todo) The \code{"dim<-"}, currently converts \code{x} to a vector if \code{value} is \code{NULL}, otherwise it ignores \code{value}, does nothing and returns \code{x} unchanged. This behaviour should not be relied upon and may be changed in the future, e.g. by issuing warning when \code{value} is not \code{NULL}. Or throwing error altogether if assignment with \code{"dim<-"} is attempted. } \examples{ ## Load Swiss Pension Fund Benchmark Data - X <- LPP2005REC[1:10, 1:3] ## Get Dimension - dim(X) ## Get Column and Row Names - dimnames(X) ## Get Column / Row Names - colnames(X) rownames(X) ## Try your own DIM - DIM <- function(x) {c(NROW(x), NCOL(x))} DIM(X) DIM(X[, 1]) ## Try length / LENGTH - length(X) length(X[, 1]) LENGTH <- function(X) NROW(X) LENGTH(X) ## Columns / Rows - ncol(X); NCOL(X) nrow(X); NROW(X) ## See also - isUnivariate(X) isMultivariate(X) } \keyword{chron} timeSeries/man/timeSeries-slotUnits.Rd0000755000176200001440000000137114436343424017554 0ustar liggesusers\name{units} \alias{getUnits} \alias{getUnits.default} \alias{setUnits<-} \title{Get and set unit names of a 'timeSeries'} \description{ Gets and sets the column names of a \code{"timeSeries"} object. The column names are also called units or unit names. } \usage{ getUnits(x) setUnits(x) <- value } \arguments{ \item{x}{ a \code{"timeSeries"} object. } \item{value}{ a character vector of unit names. } } \seealso{ \code{\link{timeSeries}} } \examples{ ## A Dummy 'timeSeries' Object tS <- dummyMonthlySeries() tS ## Get the Units - getUnits(tS) ## Assign New Units to the Series - setUnits(tS) <- c("A", "B") head(tS) } \keyword{programming} timeSeries/man/data-examples.Rd0000755000176200001440000000240214436334724016165 0ustar liggesusers\name{TimeSeriesData} \alias{TimeSeriesData} \alias{LPP2005REC} \alias{MSFT} \alias{USDCHF} \title{Time series data sets} \description{ Three data sets used in example files. } \details{ The following datasets are available: \describe{ \item{MSFT}{ Daily Microsoft OHLC (Open-high-low-close) prices and volume from 2000-09-27 to 2001-09-27. } \item{USDCHF}{ USD/CHF intraday foreign exchange rates. } \item{LPP2005REC}{ Swiss pension fund assets returns benchmark from 2005-11-01 to 2007-04-11. } } The datasets are objects from class \code{"timeSeries"}. } \note{ No further information about the \code{LPP2005REC} is available. The meaning of the columns? } \seealso{ \code{\link{readSeries}}, \code{\link{timeSeries}} } \examples{ ## LPP2005 example data set data(LPP2005REC) plot(LPP2005REC, type = "l") class(LPP2005REC) dim(LPP2005REC) head(LPP2005REC) LPP2005REC[1:5, 2:4] range(time(LPP2005REC)) summary(LPP2005REC) ## MSFT example data set data(MSFT) plot(MSFT[, 1:4], type = "l") plot(MSFT[, 5], type = "h") class(MSFT) range(time(MSFT)) head(MSFT) ## Plot USDCHF example data set data(USDCHF) plot(USDCHF) range(time(USDCHF)) head(USDCHF) } \keyword{datasets} timeSeries/man/base-sort.Rd0000644000176200001440000000641114550267634015342 0ustar liggesusers\name{sort} \alias{sort} \alias{sort.timeSeries} \alias{is.unsorted} \alias{is.unsorted.timeSeries} \alias{is.unsorted,timeSeries-method} \title{Sort a 'timeSeries' by time stamps} \description{ Sort a \code{"timeSeries"} object with respect to its time stamps. } \usage{ \method{sort}{timeSeries}(x, decreasing = FALSE, \dots) \S4method{is.unsorted}{timeSeries}(x, na.rm = FALSE, strictly = FALSE) } \arguments{ \item{x}{ a \code{"timeSeries"} object. } \item{decreasing}{ a logical flag. Should we sort in increasing or decreasing order? By default \code{FALSE}. } \item{na.rm}{ a logical value, should missing values be removed? } \item{strictly}{ logical indicating if the check should be for strictly increasing values. } \item{\dots}{ optional arguments passed to other methods. } } \details{ The method for \code{sort} sorts \code{x} either in increasing or decreasing time stamp order. The method for \code{is.unsorted} returns \code{TRUE} if the time stamps of \code{x} are not sorted in increasing order (including the case when they are sorted in decreasing order) and \code{FALSE} otherwise. \code{is.unsorted} may also return \code{NA} when there are \code{NA}s among the time stamps of \code{x}. All this is in line with the documented functionality of \code{base::is.unsorted}. } \value{ for \code{sort}, a \code{"timeSeries"} object, for the \code{is.unsorted} method, \code{TRUE}, \code{FALSE}, or \code{NA}, as described in section \sQuote{Details}. } \note{ If \code{is.unsorted} returns \code{NA} when there are \code{NA}s in the data but not in the time stamps use \code{library{timeSeries}} or call the function as \code{timeSeries::is.unsorted}. If you need more details, read the rest of this note. \code{base::is.unsorted} 'sees' the method for \code{"timeSeries"} objects when package timeSeries is loaded (whether or not it is attached). However, due to the way \code{base::is.unsorted} is implemented, it may give wrong answers when there are \code{NA}'s among the values of the time series. Developers of packages applying \code{is.unsorted} on timeSeries objects should import if from package timeSeries. The above feature is not a shortcoming of \code{base::is.unsorted} but a consequence of the fact that the timeSeries method is not consistent with its semantics. For example, it works on the time stamps, while \code{is.na} works on the data values. } \seealso{ \code{\link[base]{is.unsorted}} for further details on the \code{NA} case } \examples{ ## a monthly calendar series x <- daily2monthly(LPP2005REC[, 1:2])[3:14, ] \dontshow{set.seed(1234)} ## resample the series with respect to the time stamps, resampled <- sample(x) ## the time stamps are unordered resampled is.unsorted(resampled) # TRUE (i.e., not sorted) ## Now sort the series in decreasing time order backward_in_time <- sort(resampled, , decreasing = TRUE) ## time stamps ordered in decreasing order ## but is.unordered requires increasing order: backward_in_time is.unsorted(backward_in_time) # still TRUE ## Is the reverted series ordered? forward_in_time <- rev(backward_in_time) forward_in_time is.unsorted(forward_in_time) # FALSE (i.e., sorted) } \keyword{chron} timeSeries/man/timeSeries-readSeries.Rd0000755000176200001440000000540614436334637017647 0ustar liggesusers\name{readSeries} \alias{readSeries} \title{Read a 'timeSeries' from a text file} \description{ Reads a file in table format and creates a \code{"timeSeries"} object from it. The first column of the table must hold the timestamps. } \usage{ readSeries(file, header = TRUE, sep = ";", zone = "", FinCenter = "", format, \dots) } \arguments{ \item{file}{ the filename of a spreadsheet dataset from which to import the data records. } \item{header}{ a logical value indicating whether the file contains the names of the variables as its first line. If missing, the value is determined from the file format: 'header' is set to 'TRUE' if and only if the first row contains one fewer fields than the number of columns. } \item{sep}{ the field seperator used in the spreadsheet file to separate columns, by default \code{";"}. If \code{sep = ";"} and reading the series fails, then the reading is automatically repeated with \code{sep=","}. } \item{zone}{ the time zone or financial center where the data were recorded. By default \code{zone = ""} which is short for GMT. } \item{FinCenter}{ a character with the the location of the financial center named as "continent/city". } \item{format}{ a character string with the format in POSIX notation specifying the timestamp format. The format has not to be specified if the first column in the file has the timestamp format specifier, e.g. "\%Y-\%m-\%d" for the short ISO 8601 format. } \item{\dots}{ Additional arguments passed to \code{read.table()} which is used to read the file. } } \details{ The file is imported with \code{\link{read.table}}. Note the different default for argument \code{"sep"}. The first column of the table must hold the timestamps. Format of the timestamps can be either specified in the header of the first column or by the \code{format} argument. } \value{ an object of class \code{"timeSeries"} } \seealso{ \code{\link{as.timeSeries}}, \code{\link{timeSeries}}, \code{\link{dummyMonthlySeries}}, \code{\link{dummyDailySeries}} } \examples{ ## full path to an example file fn <- system.file("extdata/msft.csv", package = "timeSeries") ## first few lines of the file readLines(fn, n = 5) ## import the file msft <- readSeries(fn) head(msft) ## is msft the same as the data object MSFT? all.equal(msft, MSFT) ## ... almost, except for slot 'documentation' c(msft@documentation, MSFT@documentation) ## actually, all.equal() says 'attribute', not slot. this is ok too: c(attr(MSFT, "documentation"), attr(msft, "documentation")) ## make 'documentation' equal, here "", and compare again: msft@documentation <- "" all.equal(msft, MSFT) # TRUE } timeSeries/man/base-rev.Rd0000644000176200001440000000105514546271520015140 0ustar liggesusers\name{rev} \alias{rev.timeSeries} \title{Reverse a 'timeSeries'} \description{ Reverses an uni- or multivariate \code{"timeSeries"} object. } \usage{ \method{rev}{timeSeries}(x) } \arguments{ \item{x}{ an uni- or multivariate \code{"timeSeries"} object. } } \value{ a \code{"timeSeries"} object } \examples{ \dontshow{set.seed(1234)} ## Create Dummy "timeSeries" tS <- dummyMonthlySeries() ## reverse series rev(tS) } \keyword{chron} timeSeries/DESCRIPTION0000644000176200001440000000305014551002402014060 0ustar liggesusersPackage: timeSeries Title: Financial Time Series Objects (Rmetrics) Version: 4032.109 Authors@R: c(person("Diethelm", "Wuertz", role="aut", comment = "original code") , person("Tobias", "Setz", role = c("aut"), email = "tobias.setz@live.com") , person("Yohan", "Chalabi", role = "aut") , person("Martin","Maechler", role="ctb", email="maechler@stat.math.ethz.ch", comment = c(ORCID = "0000-0002-8685-9910")) , person(given = c("Georgi", "N."), family = "Boshnakov", role = c("cre", "aut"), email = "georgi.boshnakov@manchester.ac.uk") ) Description: 'S4' classes and various tools for financial time series: Basic functions such as scaling and sorting, subsetting, mathematical operations and statistical functions. Depends: R (>= 2.10), timeDate (>= 2150.95), methods Imports: graphics, grDevices, stats, utils Suggests: RUnit, robustbase, xts, zoo, PerformanceAnalytics, fTrading LazyData: yes License: GPL (>= 2) URL: https://geobosh.github.io/timeSeriesDoc/ (doc), https://r-forge.r-project.org/scm/viewvc.php/pkg/timeSeries/?root=rmetrics (devel), https://www.rmetrics.org BugReports: https://r-forge.r-project.org/projects/rmetrics NeedsCompilation: no Packaged: 2024-01-14 10:27:34 UTC; georgi Author: Diethelm Wuertz [aut] (original code), Tobias Setz [aut], Yohan Chalabi [aut], Martin Maechler [ctb] (), Georgi N. Boshnakov [cre, aut] Maintainer: Georgi N. Boshnakov Repository: CRAN Date/Publication: 2024-01-14 16:00:02 UTC timeSeries/build/0000755000176200001440000000000014550733426013473 5ustar liggesuserstimeSeries/build/vignette.rds0000644000176200001440000000033014550733426016026 0ustar liggesusersb```b`afb`b2 1# '*M N-L-/ +GS! /KWPGUWOJM.)&`\AJ t nC zּTtk]R RR@g;<E T [fN*ސ89 d Bw(,/׃# @?{49'ݣ\)%ziE@ wvBtimeSeries/tests/0000755000176200001440000000000014263246022013526 5ustar liggesuserstimeSeries/tests/msft.dat.csv0000755000176200001440000003146414263246022015776 0ustar liggesusers"X.Y..m..d";"Open";"High";"Low";"Close";"Volume" "1";"2000-09-27";63.4375;63.5625;59.8125;60.625;53077800 "2";"2000-09-28";60.8125;61.875;60.625;61.3125;26180200 "3";"2000-09-29";61;61.3125;58.625;60.3125;37026800 "4";"2000-10-02";60.5;60.8125;58.25;59.125;29281200 "5";"2000-10-03";59.5625;59.8125;56.5;56.5625;42687000 "6";"2000-10-04";56.375;56.5625;54.5;55.4375;68226700 "7";"2000-10-05";55.5;57.25;55.25;55.375;40549700 "8";"2000-10-06";55.8125;56.75;54.75;55.5625;30897000 "9";"2000-10-09";55.625;55.75;53;54.1875;29161800 "10";"2000-10-10";53.9375;55.5625;53.8125;54.5625;31033100 "11";"2000-10-11";54;56.9375;54;55.75;50602900 "12";"2000-10-12";56.3125;56.875;53.8125;54.375;45109800 "13";"2000-10-13";53.875;54.875;52.125;53.75;52260600 "14";"2000-10-16";53.5;53.8125;49.5625;50.375;59879500 "15";"2000-10-17";51.875;52.4375;50.25;50.4375;40638300 "16";"2000-10-18";49.625;53.25;48.4375;51.75;55268200 "17";"2000-10-19";58.4375;62.1875;58;61.875;128496600 "18";"2000-10-20";61.3125;66.125;61.125;65.1875;80189300 "19";"2000-10-23";64.625;66.25;60.6875;62.125;92585200 "20";"2000-10-24";62.625;62.9375;60.1875;61.5;47213700 "21";"2000-10-25";61.9375;63.4375;60.4375;61.25;83801900 "22";"2000-10-26";61;65.0625;60.8125;64.4375;57413300 "23";"2000-10-27";64.6875;69.1875;64.625;67.6875;62146200 "24";"2000-10-30";67.5;70.125;67.375;69.0625;55028800 "25";"2000-10-31";69;69.5;68;68.875;52237000 "26";"2000-11-01";68.5;70.0625;68.4375;69.625;40654700 "27";"2000-11-02";70.375;70.8438;69.625;70.3125;38992600 "28";"2000-11-03";69.25;69.625;68.0625;68.25;34355500 "29";"2000-11-06";68.6875;70.125;68.25;69.5;37425700 "30";"2000-11-07";69.75;71.875;69.5;70.5;52165600 "31";"2000-11-08";71.125;72.375;68;69.4375;103074700 "32";"2000-11-09";68.5;71.3125;68.4375;70.875;45529300 "33";"2000-11-10";69.9375;70.3125;66.8125;67.375;46872200 "34";"2000-11-13";66.6875;68.125;64.4062;66.4375;41682400 "35";"2000-11-14";68;69.8125;67.3125;68.8125;42109300 "36";"2000-11-15";69.0625;70.875;68.6875;70.0625;30211100 "37";"2000-11-16";69.4375;71.5;68.9375;68.9375;46064300 "38";"2000-11-17";69.4375;70;67.7969;69.0625;53262800 "39";"2000-11-20";68.125;68.5;65.5625;67.1875;40078600 "40";"2000-11-21";67.375;69.25;67.375;67.75;29743800 "41";"2000-11-22";66.0625;69.5;66;68.25;38171600 "42";"2000-11-24";69;70.4375;68.5;69.9375;17219600 "43";"2000-11-27";71.4375;72.25;70.625;70.6875;42653800 "44";"2000-11-28";69.375;69.75;66.8125;67;63723100 "45";"2000-11-29";66.8125;67.125;63.25;65.0625;49140200 "46";"2000-11-30";62;62.0625;57;57.375;98600400 "47";"2000-12-01";58.0625;60.625;56.0625;56.625;54904900 "48";"2000-12-04";57.25;59;55.1875;56.4375;40203600 "49";"2000-12-05";59.1875;60.5;58.25;59.875;50867200 "50";"2000-12-06";60;60.0625;56.0625;56.6875;45280400 "51";"2000-12-07";53.4375;54;52.25;53.125;72654200 "52";"2000-12-08";54.625;55.875;53.4375;54.4375;60469900 "53";"2000-12-11";55.5;58.75;55;58.0625;47788100 "54";"2000-12-12";57.8125;60;56.75;58.375;31553000 "55";"2000-12-13";60.5;60.5;56.8125;57.25;49180200 "56";"2000-12-14";57.9375;58.7344;55.375;55.5;35600700 "57";"2000-12-15";51.0469;52;47.75;49.1875;58449900 "58";"2000-12-18";49;50;47;47.8125;53593700 "59";"2000-12-19";47.4375;48;44.5;44.8125;60135900 "60";"2000-12-20";42.8125;44;41.375;41.5;74518900 "61";"2000-12-21";40.75;45.125;40.3125;43.4375;81586500 "62";"2000-12-22";44.75;47.125;44.75;46.4375;54775900 "63";"2000-12-26";46.875;48.5625;45.875;46.875;33470800 "64";"2000-12-27";46.125;46.8125;45;46.4375;34501900 "65";"2000-12-28";45.125;46.25;43.875;44.5625;38809600 "66";"2000-12-29";43.9375;45.8125;43;43.375;49988800 "67";"2001-01-02";44.125;45;42.875;43.375;41206600 "68";"2001-01-03";43.1875;48.875;43.125;47.9375;67981100 "69";"2001-01-04";47.8125;50.5;46.875;48.4375;56198500 "70";"2001-01-05";48.5;49.875;47.5625;49.125;46707300 "71";"2001-01-08";48.9375;49.75;46.6875;48.9375;39908800 "72";"2001-01-09";50;52.625;49.75;51.8125;57482700 "73";"2001-01-10";51;53.8125;50.75;52.875;45115100 "74";"2001-01-11";53;55.75;52.3125;55;50927400 "75";"2001-01-12";54.875;55;52.5;53.5;36856000 "76";"2001-01-16";53.375;53.5;51.125;52.5625;34231200 "77";"2001-01-17";53.625;54.875;52.5625;52.9375;36422100 "78";"2001-01-18";53.6875;56.1875;52.625;55.5;54894400 "79";"2001-01-19";60;61.4375;58.875;61;104674400 "80";"2001-01-22";60.75;61;59;60.125;38336500 "81";"2001-01-23";59.75;60.9375;58.9375;60.5625;35147600 "82";"2001-01-24";61;63.4375;60.75;62.9375;55227500 "83";"2001-01-25";62.75;64;61.5625;61.8125;42828700 "84";"2001-01-26";61;64.3125;61;64;46540000 "85";"2001-01-29";63.5625;64.625;63.5;64.5;42491900 "86";"2001-01-30";64.5;64.75;62.875;63.375;28638400 "87";"2001-01-31";63;63.75;61;61.0625;40949400 "88";"2001-02-01";60.8125;62.625;60.375;62.375;35896400 "89";"2001-02-02";62.5;63.375;60.75;60.8125;35550000 "90";"2001-02-05";60.75;62.0625;60.25;61.9375;25699600 "91";"2001-02-06";62.0625;63.8125;61.6875;62.5625;48221000 "92";"2001-02-07";62;65.0625;61.8125;64.6875;63030900 "93";"2001-02-08";63.75;64.5;62;62.25;44020600 "94";"2001-02-09";61.3125;61.5625;58.5;59.125;50287600 "95";"2001-02-12";58.8125;59.4375;57.1875;58.75;35644700 "96";"2001-02-13";59.625;61.0625;58.125;58.1875;38035300 "97";"2001-02-14";57.625;59;56.375;58.375;30864200 "98";"2001-02-15";59;60.1875;57.875;58.8125;32813900 "99";"2001-02-16";57;58.25;56.125;57.3125;33479200 "100";"2001-02-20";57.375;58.25;55.375;55.875;30365400 "101";"2001-02-21";55.25;58.0625;55.1875;56.25;31973600 "102";"2001-02-22";56.3125;56.8125;53.875;55.1875;50408200 "103";"2001-02-23";54.4375;57.5;54.3125;56.75;46310300 "104";"2001-02-26";57.625;59.9375;57.375;59.5625;43968400 "105";"2001-02-27";59.375;61.1875;58.6719;59.375;49574300 "106";"2001-02-28";59.5625;60.0781;58.1875;59;42304200 "107";"2001-03-01";58.5625;59.5;56.25;59.3594;40890800 "108";"2001-03-02";57.5;58.125;56.4375;56.6875;39900400 "109";"2001-03-05";57.25;58.625;56.5625;57.4375;24691800 "110";"2001-03-06";58.625;60;58.375;59.4375;33390900 "111";"2001-03-07";59.875;61.125;59.3125;60.6875;29871800 "112";"2001-03-08";60.3125;60.5938;58.4375;59.25;27313000 "113";"2001-03-09";57.9375;58.1875;54.875;56.6875;51897200 "114";"2001-03-12";54.6875;55;51.625;51.9375;57188000 "115";"2001-03-13";52.1875;54.75;52;54.1875;45517800 "116";"2001-03-14";52.5;55.25;52.1875;54;45343100 "117";"2001-03-15";55.3125;56.0781;53.5;53.6875;35819200 "118";"2001-03-16";52.5;55.125;52.4844;54.5625;56424400 "119";"2001-03-19";54.5;55.5;53.125;54.3125;30518200 "120";"2001-03-20";54.5625;56.125;52.625;52.6875;45911400 "121";"2001-03-21";52.25;53.25;49.75;50.0625;62494300 "122";"2001-03-22";50.5625;54.0625;50.5;54;63181600 "123";"2001-03-23";54.9375;57;54.375;56.5625;49759800 "124";"2001-03-26";57.125;57.5;55.5625;56.0625;31559300 "125";"2001-03-27";56.0625;58.5625;55.875;58.25;47567800 "126";"2001-03-28";57.375;57.9375;55.375;55.5625;39340800 "127";"2001-03-29";55.375;57.1875;54.5625;55.375;43492500 "128";"2001-03-30";55.75;56.1875;53.875;54.6875;45600800 "129";"2001-04-02";54.8125;56.9375;54.625;55.8125;37962000 "130";"2001-04-03";55.3125;55.3125;52.75;53.375;47093800 "131";"2001-04-04";53.375;55;51.0625;51.9375;52023300 "132";"2001-04-05";53.75;57.375;53.5;56.75;56682000 "133";"2001-04-06";56.375;57.1875;55.0625;56.1875;46311000 "134";"2001-04-09";56.57;57.42;55.66;57.15;28147800 "135";"2001-04-10";57.95;60.09;57.78;59.68;54599700 "136";"2001-04-11";60.65;61.5;59.7;60.04;54939800 "137";"2001-04-12";59.56;62.31;59.35;62.18;43760000 "138";"2001-04-16";61.4;61.58;60.12;60.79;32928700 "139";"2001-04-17";60.52;62.11;60.04;61.48;42574600 "140";"2001-04-18";63.39;66.31;63;65.43;78348200 "141";"2001-04-19";65.81;69;65.75;68.04;79687800 "142";"2001-04-20";70.3;71.1;68.5;69;96459800 "143";"2001-04-23";68.11;68.47;66.9;68.25;46085600 "144";"2001-04-24";68.2;69.93;67.14;67.55;44588300 "145";"2001-04-25";67.57;69.79;67.25;69.69;38372000 "146";"2001-04-26";70.07;71;68.25;69.13;59368800 "147";"2001-04-27";69.53;69.68;66.21;67.12;60786200 "148";"2001-04-30";68.53;69.06;67.68;67.75;37184100 "149";"2001-05-01";67.66;70.3;67.6;70.17;41851400 "150";"2001-05-02";71;71.15;69.35;69.76;46432200 "151";"2001-05-03";69.25;70.18;68.14;68.53;33136700 "152";"2001-05-04";68;71.05;67.96;70.75;59769200 "153";"2001-05-07";70.83;72.15;70.7;71.38;54678100 "154";"2001-05-08";71.75;72.1;70.75;72.06;37542000 "155";"2001-05-09";71.24;71.3;69.86;70.4;38338300 "156";"2001-05-10";71.13;71.24;69.96;70;32167300 "157";"2001-05-11";69.96;70;68.65;69.4;25564400 "158";"2001-05-14";69.13;69.2;68.3;68.72;22484000 "159";"2001-05-15";68.74;69.3;68;68.27;30692800 "160";"2001-05-16";67.7;69.88;67.33;69.16;45946900 "161";"2001-05-17";69.1;70.14;67.55;68.17;53492400 "162";"2001-05-18";67.69;69.2;67.25;68.09;45302700 "163";"2001-05-21";68.05;69.99;67.75;68.79;51745800 "164";"2001-05-22";69.45;70.35;69.18;70.31;41727800 "165";"2001-05-23";70.39;71.6;69.51;69.7;46818700 "166";"2001-05-24";69.94;71.78;69.27;71.72;40390800 "167";"2001-05-25";71.66;71.9;70.36;70.91;26373800 "168";"2001-05-29";70.8;71.75;70.05;70.34;35605400 "169";"2001-05-30";69.56;70.58;68.65;69.19;43250900 "170";"2001-05-31";69.49;70.38;68.4;69.18;35341300 "171";"2001-06-01";69.6;70.7;68.7;70.34;28793800 "172";"2001-06-04";70.55;71.02;69.8;70.78;21868300 "173";"2001-06-05";70.76;73.08;70.5;72.6;44727100 "174";"2001-06-06";72.89;73.48;71.55;72.36;40011400 "175";"2001-06-07";72.12;73.73;72.08;73.68;33480000 "176";"2001-06-08";73.7;73.75;72.05;73.19;25933500 "177";"2001-06-11";72.85;72.85;71.51;72.12;23672800 "178";"2001-06-12";71.02;72.41;70.81;72.08;33357300 "179";"2001-06-13";72.05;72.3;70.64;70.69;27651200 "180";"2001-06-14";70.22;70.55;68.4;68.9;35986200 "181";"2001-06-15";67.51;68.3;66.4;68.02;54177200 "182";"2001-06-18";67.95;67.96;66.01;66.88;28423400 "183";"2001-06-19";68.21;68.85;66.85;67.32;31728700 "184";"2001-06-20";67.14;69.59;67.1;69.41;32054200 "185";"2001-06-21";69.15;70.55;68.92;69.84;34801900 "186";"2001-06-22";70;70.61;68.58;68.83;25546000 "187";"2001-06-25";69.1;69.81;67.77;68.85;24607800 "188";"2001-06-26";67.82;70.21;67.7;70.14;31538500 "189";"2001-06-27";69.86;71.53;69.36;71.14;34599900 "190";"2001-06-28";71.55;76.15;70.53;72.74;64487800 "191";"2001-06-29";72.6;73.41;71.4;73;47141900 "192";"2001-07-02";72.05;73.15;70.15;70.6;36405100 "193";"2001-07-03";70.3;70.8;69.93;70.47;14018700 "194";"2001-07-05";70.22;70.72;68.44;68.51;24621300 "195";"2001-07-06";68.3;68.4;65.67;66.06;33733900 "196";"2001-07-09";66.2;66.91;65.04;65.69;33238300 "197";"2001-07-10";65.9;66.25;64.35;64.48;33281300 "198";"2001-07-11";64.21;66.75;64.2;66.5;36911300 "199";"2001-07-12";70.7;72.05;70.33;71.6;64039000 "200";"2001-07-13";71.4;72;70.94;71.34;29467300 "201";"2001-07-16";71.45;72.16;70.15;71.18;27995400 "202";"2001-07-17";70.66;72.01;70.14;71.82;31620500 "203";"2001-07-18";70.6;71.5;69.87;70.57;28795400 "204";"2001-07-19";71.22;73;71.22;72.57;38274700 "205";"2001-07-20";68.03;69.4;67.94;69.18;62101800 "206";"2001-07-23";69.24;69.24;66.35;67.09;39999700 "207";"2001-07-24";67;67.99;65.7;66.32;33765100 "208";"2001-07-25";66.26;67.52;65.61;67.48;37032700 "209";"2001-07-26";67.12;67.32;65.5;66.59;38987000 "210";"2001-07-27";66.05;66.25;65.05;65.47;32698000 "211";"2001-07-30";65.65;66.88;65.54;65.8;21098200 "212";"2001-07-31";66.01;67.39;65.85;66.19;29515800 "213";"2001-08-01";66.8;66.81;65.76;66.47;27839500 "214";"2001-08-02";67.21;67.54;66.26;67.45;27099200 "215";"2001-08-03";67.3;67.36;66;66.89;21630200 "216";"2001-08-06";66.53;67.12;65.68;66.13;13915800 "217";"2001-08-07";66.04;67.05;65.99;66.35;15673900 "218";"2001-08-08";66.51;67.24;64.49;64.86;27498200 "219";"2001-08-09";64.98;65.55;64.3;65.01;22768100 "220";"2001-08-10";64.77;65.86;62.9;65.52;25878200 "221";"2001-08-13";65.24;65.99;64.75;65.83;16337700 "222";"2001-08-14";65.75;66.09;64.45;64.69;18240600 "223";"2001-08-15";64.71;65.05;63.2;63.2;19751500 "224";"2001-08-16";62.84;64.71;62.7;64.62;21952800 "225";"2001-08-17";63.78;64.13;61.5;61.88;26117100 "226";"2001-08-20";61.66;62.75;61.1;62.7;24185600 "227";"2001-08-21";62.7;63.2;60.71;60.78;23555900 "228";"2001-08-22";61.13;61.15;59.08;60.66;39053600 "229";"2001-08-23";60.67;61.53;59;59.12;25906600 "230";"2001-08-24";59.6;62.28;59.23;62.05;31699500 "231";"2001-08-27";61.9;63.36;61.57;62.31;22281400 "232";"2001-08-28";62.34;62.95;60.58;60.74;23711400 "233";"2001-08-29";61.05;61.3;59.54;60.25;24085000 "234";"2001-08-30";59.04;59.66;56.52;56.94;48816000 "235";"2001-08-31";56.85;58.06;56.3;57.05;28950400 "236";"2001-09-04";57.19;59.08;56.07;56.1;33594600 "237";"2001-09-05";56.18;58.39;55.39;57.74;44735300 "238";"2001-09-06";56.56;58.39;55.9;56.02;56178400 "239";"2001-09-07";56.11;57.36;55.31;55.4;44931900 "240";"2001-09-10";54.92;57.95;54.7;57.58;42235900 "241";"2001-09-17";54.02;55.1;52.8;52.91;63751000 "242";"2001-09-18";53.41;55;53.17;54.32;41591300 "243";"2001-09-19";54.46;54.7;50.6;53.87;63475100 "244";"2001-09-20";52.35;52.61;50.67;50.76;58991600 "245";"2001-09-21";47.92;50.6;47.5;49.71;92488300 "246";"2001-09-24";50.65;52.45;49.87;52.01;42790100 "247";"2001-09-25";52.27;53;50.16;51.3;42470300 "248";"2001-09-26";51.51;51.8;49.55;50.27;29262200 "249";"2001-09-27";50.1;50.68;48;49.96;40595600 timeSeries/tests/doRUnit.R0000755000176200001440000000164214263246022015243 0ustar liggesusers#### doRUnit.R --- Run RUnit tests ####------------------------------------------------------------------------ ### Origianlly follows Gregor Gojanc's example in CRAN package 'gdata' ### and the corresponding section in the R Wiki: ### http://wiki.r-project.org/rwiki/doku.php?id=developers:runit ### MM: Vastly changed: This should also be "runnable" for *installed* ## package which has no ./tests/ ## ----> put the bulk of the code e.g. in ../inst/unitTests/runTests.R : if(require("RUnit", quietly = TRUE)) { ## --- Setup --- wd <- getwd() pkg <- sub("\\.Rcheck$", '', basename(dirname(wd))) library(package = pkg, character.only=TRUE) path <- system.file("unitTests", package = pkg) stopifnot(file.exists(path), file.info(path.expand(path))$isdir) source(file.path(path, "runTests.R"), echo = TRUE) } ################################################################################ timeSeries/vignettes/0000755000176200001440000000000014550733426014404 5ustar liggesuserstimeSeries/vignettes/colorPalettes2Fig.pdf0000755000176200001440000010337314263246021020430 0ustar liggesusers%PDF-1.4 %ρ\r 1 0 obj << /CreationDate (D:20140430203415) /ModDate (D:20140430203415) /Title (R Graphics Output) /Producer (R 3.0.2) /Creator (R) >> endobj 2 0 obj << /Type /Catalog /Pages 3 0 R >> endobj 7 0 obj << /Type /Page /Parent 3 0 R /Contents 8 0 R /Resources 4 0 R >> endobj 8 0 obj << /Length 30481 /Filter /FlateDecode >> stream xK&;v$"䂥x?HC1fD6 NwTGS&%ӿ򋬌 vfU&w޿_o{6.qz[o6oOo_Ͽߺ{ßݷ-K!k_´uoO/}e6{_ۑ㞆Psn߆ a+}ǰ_ mosҰp04[㘆㷉_i8}XkP?i?޶o2L.e7_O`K\/QOݑeQr)p1LO@ٞF1m 6FBždltCs_f_\p46;' eX>l,/.EIPYpP(ydlL{6q?/\X1 s4,İcb gq6C,@C) xaW`ąo(,eqK8)CIPP2,0Hm䚇+1Ya* 6ϕ~a# [(6ϿbXLѧ_}SwpC~v=nS&hmD)VB0nC*ym|ǭގ4n!roz e\7yTNU3SeXy8yW&NJ^8yV6NOUCei+''rgHWĢ'*;!0=4u\~3Gb悘if(R\~*+JrC6-Kt,'ҵTNwӧg4>2x >Q뽲x^ &DSeՈ,@y. f2-oh2s*%=JhG* E2}wߧ.l~s,a"2}R/ CZ}2"!Bl@LՈs1۔;R3y~SͰyeE)V( =W.P Y²V9A=@h5>@q =&k}!;G3t08_{B*܊{Av.&j|<*cRGȿce i{MqJ㱮ROU,C?}!.@X&tB. _ .|+w.-_B\[|9|㋼ |  ~JkE0~O_ojiXajKb^ˏQ᎓}#pc}ec f-]}|\&NeypF9 $p y]Yy<33=w`fǹ };i2zi$x f\0M0~#05NϽ򸯬!|5¨cA5ik s<*+kHEj[`eer̤s;.aXq⸝4C앙Cef G C&"5t SǫUwRA_NoJDjͬafxK!I?aWyz֦~7fbNdV/7'l(㡶vdg\Y;,rYwk;+/FmgmgXY;sWY7v\kmgRYy\Y1ũw/Lps?f`e-a3G̱`dhlq4@4H4P4X`hp x HψuSDS|?3GV3`]LA;o4Ik^ZjAܖx:]ץPKjM\x@]7P%YkdZhZ&kNZkŖOkSܝBmN;|6yZW0@4ݠ7sx3Z'OiKԖ9-rZ[伶$ȉmY3 AmKܖ 9-rz[.ˆLSl;!|j]T:&8޴һVkPzX#c;[F{ЛлF ơgG z z1^׺|uv`C$"ZT, E1Hņު R*VA$b1!D(!1Dʸ BCQ/DESg hbnѴxHmkP=5?C+p?܂A&Tlx0 M6@[t;tи%AS܃x),OZ6/5,/o9qLu५GYgqmTy[yOuzZaz}yU Q<*ok8.k,Sӕ]m=zU~wcƺ+o f .wheU֘4uKYZ~ Bzx~KZKjsRy[yW֘6W1bofq tm] .xmj(n瘾׀oQzװm5V*jsmeҸ}}%7Ji4kokkZ2?P{['y[_slnh(\jo+ڻ:okٝxŏ׏__mm~si\R;l|rND6\94L=ipko frVg7L3y|*a?/m}jF:}OЯy gw|,]6bΓmfYK>afg]_y[__g%̔u$rnL=G̱`dhlqt@tHtPtX`hp x JψSDW|?3o)Ϡլ73mN%m3P Bx]rjI y]r!jUȉGȍu!G\Zr&jiȝ![s>Mջ+jÇjәuoʵ4sx3N?8gN8o[3 Am_ܾ 9}rz.ˆS>8w>CۺS{3M9`c^0Pc7}T{xiyEyPcuKG;]=:>+o6kgRy[y9 wh1~wM̠^╷u 3pB˓Nz4sx KG DD E J @tꁙ0sm]̊S:e޵τ^䶕OJC-nvy%!քhBԪQBnD 90Jʐ3QKCD 984!jwCۺksK/gBrg ]2tp7g _ Q˗'9| p=|Uw!Fmq* p|8uI+T^Ci5=5G%J5F@oA]Ai5лF >^;0^i̠>fD^ITN!̛9E2o\ (XPs1HbCň"E@3.v] )2XRt1HbKBCQʼnʼnީu4j܌i'nH5ެmY'|RftjM0+`L7¬nY rs|^-=0 {0 {SVޞwm̹/k`y! aCF 3tlڰAfڰfڰf ۰1sZ04ܙqأR2&nT C7G̍#3@7NPOȅCx87 }lClg] u>_% d[W籱E LݡDqƼ4,Gr f5Û jsG❍qg'R!"!KN=FOa)ՎɕiXTLZHLyygG(dAoZ @XԝfEN$ j&/c\ A_;6Nd fͅ Mb=0zvZXL;-0.[;?36KxN 50-dwi+k4i~H};qy7T;E^C{ ];-00ZPad@kq!ðQFe }o0Z` ` 5;<]FQ-x~׆`xm׌fPymW!` TDfè{SNU6҅o RYpo0^5O׏K6ʍ^ x f<̥\Dn(iOa:D 8LrnWD/yrP3 !j:'q0 Z;H%҇03Dtz_{l<耨'h_9IQd}M˩Ď!ie+#X^`A;Q P7C%ɷ||\y 1!$ ~"~lay# w_r>!5SwhCN~:Yͱgb>#C|`2wUHv)1YYu]"4RUGKiV=[QnCIEK.ʚL7ה,a5% F9>e孈z|"0@;ELy 5e~"wEMR?O֦ȂHqɄ9{ N 0)nvEw*\4Phj<6!הN7CLݡӎыK {i *lx$Âe F[f.xI?7 az ype@T~.C#ԕ_SunNMJ{=+UYTTEP)SDMՋj:U>wTN /_O_<8r/]p⶙Ci=բE)uBRL.I]T;x[I%ޱ"ԍ-pR5R5l$8;ø0ع|u/DS05S1%S255S3ES45US5eS6 u@r@+ůksv\@N;])PҖ GY c ?npDj OpEr _fpFIz opG ^pHɉ P1 S0VjL_<sqH@PTJP̮UJ`HViJpįW9JAXJYJ9!y&JWbk5bz\@Lkܑ<eϰySBLi 2+̔g#)FS HaL6)%L6bm3ڟ`0ڈa*a*#t1Zi^;ڽ3ݻ<]*xW&ɻ0UIRLwc]{<*C~v\e{_0yUV%&ϟDF.Pf)P+yLf&j_d0Y3MSWQeTxv3q4"b&q-!br̷C7]ѕ=,)[va^^!v^A6^aF@߿W6F^S/JBpi H'D9b 1mbN<+̷\݊Dmƣ]\vykT%ͩHS*$OUJdCU9U%IJT̳P%W%)J$PU:qtj?o1ƋIJӔ/&*_LUN1]b²ĔH&-BL[,1u9 b2HYOWo0<|+ IJrԍ [@7bd7fl6BmAƍ0vF y#ݾL5ZOՄvF gԕl/m7J^)yd2@Ie%9٠*C\(Qtd2HIe(%IYJJx.K-Kμ m uusE5ۛR7Wo.K_\|qe%ĵ[ך7K'0O,O3V!+ oae{X?wibqC _>#LJ&%<&hn=8͉8g,(($)ޯAS&*|L m>7?J4!̧@hֶL4]L4;q`Y3wr4sx8jGEڌ*nF|7}Q>ΨDZsF1JTTJE9JTԣNEAJUT$WAtO3: 3W>TXl\fgJWd~ePfleFPleʆPfl ePleQfleFQlaDF 0U2Z[[1'N% ,;>opvr1ck 1f?#̆6m1[i2fv1lk}>,hcYcY'^%̔;,[?ٰ˙̀w`Fk 3]kZ z*fԻ1޵6vo3kn3kE*Y;0s޵&eΟYLkgrԴãWۑck;kg;k_F Ccmgmgxve;k YivsClgxOKy/N#@Y s?>󳼔-wh9V5P5R5T5V. I'FCn1ĠEb"1lπE ~FcM=16OaѺ7uNxGf;rkműk/KkKkD2iu"U UVJT-֩Z+-TXrym)֦V;|6xZ>-o1sx3J/)K@T8,qZY⼲$ĉeY3;Z8,qrY&Te#29, q֢xZW03i>u7ZMcѻ7w6[#콍!{wc16`S;g {mcØA}k]PN4-S3E0oɼSDs1bAń"U#|.V](QDt1bI)RZ2EsB#Qʼn޳Iޙu4}鶇R4xXmzsOW>~_t 9 Z?&@7o ЭSt3R?d@7D4nk=;ter~ڇ-ƕ}nRƗ4eVF:eeVƘ:meWF:ueWƙ:}eI PF`<`+%AkR&%BmR*&5HfutfWY3뮤3ݺݭv JqS9JS=JSA%J1TE-JqT]bXebce!uB_7)f(Qቭrݺg9pߡ5sgh*' ytbjNTmP|jF:}'~D؆}bl A|,_X0 3޳ rg5>Sr+w1ꃵꓵFꣵ공Å._#cAĨub:1nH :njzb̉u3kaP޶X ^n{9 vXK-@Ԛx Ȃ!kE2 u$Y -XVZd-ZkAXymwQZtn]̌rox9Ü>9rN;vY,y 3ANl炜 r>Ĺ匈9g"N/Eu΁TNCݺ_mosx79Fk6o!zXM?ս0/M7CN%{{?c߯\R#F&}Fߘd,fk[W@m(?u;E0JRDXp,D:?>+UoRSb&PN"DFK*)Ul%bz*N-NܭK)TN i&.(5^RjX|Rbrp ݲ@l7OnYݎ1X}|=x="t/>v~E5iܪRԥ)LR)+ELRi+LRԩ+LR+MJRҤ(EMJR֤4(MJRڤT(jSJ5SgTgٗSf'l3CrmIxR7(MqRW8:qRw(OqR(PqR(QqR$(RqR4(SqRDi=f(Q񉭂鬜r`FVyB5S[ET[UU[eV[u"Y[̅3X;'̕Y;/ĈݭwQN-洶NWcF9'%*xqwɞc9 Z/{5d~ט#jj1hc Nc0q[3}FyБJ<1<wfn-w[iI$s}ҁ9> x`OR0g'-C̩I $s}#-T\o5$inTsxqW[9%vܭ<+w+kYiXk>Yk>Zk>[k>\PN'cAĨub:1nX :Ōzb̉uo*XY{;r9<[p^oAk= ~5Y,VYPd-ZgAЂ%kMR DY:& MTm:q`f)g-wȹ판9*g 1bwG8pT<āܭ+KZq.z;{Әc^^#^C^c{kcw䨡77ػQ0a\ځ>>gk3 zSw hp g߿qd"6sd%HdSb"NF"D>+*f U$"JdTb*RV"9$Q$QݺӔc2zbR*֋uJ+/*7@VnXb dv#ȪVu +1oݒ`ϲ`?nT{wxߖ/ž[?i)c~Zr@Y0yDa$#Z-w&g؈ep0Uy3-moiȆ/N~PrsL+1tC,_\BpW) o)]<D o5@D[W.籱%1\CŴ"!1#(|C<aQ`yo#Y2q.wn@?roa> *ܹʒ_EDzBڐ}]._. !}a`<+݈e-oF3uY CKlh s;ys/&FLlN"KDa@;k_b^ 6A ;b}<,bqp 0 Ȕ?Hq)2̔•<6p| M`sLlyi/!б(%":iԆ $Zf6m"0F፰}YYlG(gK[ xxofhyow!@,B\Di{0.Oi8UkXQbtXz)To RYf3 {d?ZSaW.Ӆ2آ, 5#s)) [<3 Li _©dM栗8?ht(}PLk ޡ&i0#tz( QN囋%Q.v_IP\]WOyO9,JFʒ%Hʂ&JrO7!QtR $u6u&3Ds[mfx\.O`#\lL$/F_Fz؂Ԕ[fmi]O'a3wކV? B2,QDc:]qU"4RrRmx.(EsQ$jJ~g2.#쿸䷥^Chgꚩ;D>h^%H`>0EhMA Ӑ]|"t!.hmw$ "%q[<1; #.NP\4}_@F J{Nh3u@O,CO;G/ ZK/O/U``K+ flB҂(mm&t`+l}aypEl_~R#SW~MI95)TT gNPRCL:U6U/jpmTTߩ.R;%TT(~=YT(~%tu.0Ɵw)bE(HQ -H[B&erO"E])RxOR,inls\llyf_["TVWoo?ۋ<ݛ}MHgpAiytd/bF;Nf!eƘUfeF]ffƙ{effF;mfgƚtfgF|fY`ƛfUd晛hf}E3Z%dy:u_fZbP-ZbС1!Z;cP5)ZycТ91ZcPe=9ZcУEAAZ3dP%EIZ}܍$`4Fd s1q=nAbt ҁ0$N)'H#: = с$D?&DBW1WOܕ){ RcG{H}*TH*T2G*TRH*TrH*؏R=$hWC;јatfBv솽얍vFm#ݸnd7o7T ڈaw,b]9SW̮w<;L3%/oļS2s2AeˌP!Jz.S\( Q2t2Ie,% %<%Jxϖ%Jxg~t7VKR7פno.J]\,}s]̕;Kӗ0זo!..__k."/!Cܗ>ܗ>OXR>m5걲>~Eﮚ ux|ON"0,V"P,]"p: 67rŲ:gxW>Ӫ18o8@88̊@7? 8k8 y}ٹ.YW0ȷxhA4t`Oc'v쥫_:yiPd{tQ  QK)Q:޿UBd}2DGxW~־VڡyJ~־ҜDGmBõg8reVwhe<ԎVը4kGkgGk_Frxڠ4kGkGoGk/ooqÎVp=Є=Z~ v&0]+K>S^Y'd6sxO'ܧ#!Ęub:1j@[g:?#1㾞i0sbj}3?9rzq2Z;S%4Z[SE6Z%9QLrjHBɕ3UK%wJU-|^|M'֕}f- ;w9<SJ+ N*@U8\q^r-ęHN-C[8\qv*r]ZX.8pR<ŁO+ʥ &|[$gKi1zX^#^C^c{kc1cn 7Fqj P[`am̰~3Ϭo85xXfN̛=E4l.\L(ҹ^U1bEŌ"EDC.!}"o'S<'4\(=[$ꝙ[TgwBi s!:|.^υPDυ1f>B8|\ s!z֏eυp6F֙mi6A3#LIwG|a+ag>%<3e v MxWg kSU>J>}gx lV^cϖmgECH]0 3C9^[x^yPܮXg9%̔npos5mzXCƱƛ{kaDdo)ٻJ~ג6W1Lj zm?:^Y̨>m͆~ǡv`~"_c){Yt~Vfȧb%PL"DDC*!UL%RJ<'4T$=[$\vpş)b4RƋUJ딚/V*_Unþn^\rĚFU˭붛AVn+Vߺ%brer~ :\o.}htjcݶ7Sܰ1%M1S43eM5St3M9Sܴ3M=S3%͢S,0e͢S,:0͢S,Z0-!UPeꙛ|}+쫠Գ3qM,醚8Bo+88Cw;8DK88E[8Fk88G{8H88c,23$źiat!5.䦆х\0FrYBnk]u UDJ.ƆI\0Q;& riÄ!Flt s\BwWcF9'F@z\f+S 9ͱw5Fs`UNbҁ1O)vȯ #:0 }yUbUɋ~3̋>1.aP88Ԁ88848T8te >m >uC, c:TSa.}@.õgFץڄ#;%)qôh(2ƵÚTKetqW]cZJ2x<++^]e*+pق">|setT^[T۵I?P];wFcfP/躄rb;k9VK5Pˬ5RK5t5vKN e'FCn1KĠ%bԒ1lɁ$π% ~F b->1ӶOa΁t ޶X^n{9kwXKXd-vZem#kIBk6YK}Ze-}Z%6ZSkSPv))ms$ '@j6ymR gANm& 9M2Ym#6N9p$eS躴ϔX8m}.1]mF}썽읍{XConw7aj¸}-|ϰ6fk?gFץƩlqC"6sd%HdSb"NF"D>+*f U$"JdTb*RV"9$Q$Q ަHmk/V)^SjX~Vbr z&mk!V-BnYݎ>X}|=x=+3F]%-?&ynsKm7؂~Ы!CzHX2pg[xD>qo{ZD#Ý!qiHKI(H7EPsPާ9erW0sC|_Hy{eg}Cy+aDSvYj`bQ͘E}Cpcx ֱOt@>a 5Ab`y %&˯Qĸ+H9M}SwhC^vޑvl|YyC [ A(ˢQ,ng5 PN(Oix-Ҷz@eq (g5MkJA~W6籱C/SI"rMQ!Q\{!yH E>yi.kᰛ!UJsa.ü a(ýi ed/'hylEHpie=ui/c,Ji-cJ {hZ  ^ af D+m6ن lO zGFk\%K3[?w 8iGvsjRXPRڥ*B-L5J*u4'l^TۨЩQS]wJ8(~PzPZ΅R';$9Qѣ\-H1[$R($pL䢟EN)RJUZQt5]b6 wa(=Lr=|2QddmI @lL6] 2qd@m!2N-2+#E2Z(+f*cBi1a뉗u3H; u`;SckX#8"Ukhc)S!LcL6Rm2fʵ1 %} S SOܬK|CDVsWx3Hsi# >jV M>j !!jQ˷UHZuw*Y;pY;/S7Ts>tMH61Ϻ|鰙ã` 4kCkgC+?,SZiֆiІVOmhmh10v-Z;.aJ6*>(Z-Z~6/0;Z (/;k M 'ܦ#n!Ęeb21j@[g2?#R1㶞i0si]3Yj1{6VX |_XK|cWX|gJjjF:R+U+fJTZ,6kS>UN\++m|F8D}rJ6ImT @kSئ9M rj6EmT!":6)ȁ3)g֥T^]}-Z5Dok90:0;0<06кF Ʃ3@m}v`ӘA}l]h߼#,Dv`)yb@ł" E:x.F\(Q$tbHŒ"SdFEgD3oI-dć p1bxO)[ȸwkdؖas:)2NqW[/0LML3wfQ-qO 'Ƭ Qİub:?)tL?w fXAy>c-{7X ,رVXc-QkA@m`ZeÂ#kIB 4YK-xZe-|^m@ԦV@|6[r8Xt&gN?8g8tN8o8\3 Amg 9rz;/ˆܭSN8wNCݺm.yWdwi5ǥw֠PjJ[!4XM?U1;^DoQV%zxt m ¤vw2-3Icu 4[9?oh)E0J̏RD Yp,D:?@KRSb&PN"DFK*)Ul%bz*N-Nܭ+Aay,F#]QjXzNbRZ8[VO앻%AYnX nbr;冈շnGX܃gY܃zpEݭoҏФI1c_T{sI[w< 0m so 1 so 2 *so 3 :so?uxԬ0h¤^vЇM0BBYXgw>Ͼ >;`/o0%fsx( 11 2Q"12$Q2&q2(#2Q2tA¢5E&,~)~9f:kK)d}чR-:4Ob4.Fb.Fb4.Fb.FF8aw1:^ e0z^ i0P~;(~\[1( ft-~#=nj`0kg!#ƌ6 US!FLc6Qm2fĵ1 "}FёU1 f2\vz;lllʛ:(88۱~ƕt$zDY D?\Mw] .^7`ãST~Wߕ]w[3Zi>gkfk?ڧ~%wxXf.LD4l*TL$ҩHS1ȧb%PL"DDC*!UL%RJ<'4T$=[$]W@sNa]QjXzNbRZ-땛 V,AYnX nbr;冈շnGX܃gY܃ƹ\|fߋ4ܙ{ J?z2RWf e@+Vg/F]>:09$ߛ4sU\~|~zX ,~Y \~!ydחz>Lܡšd<Ɓ샩q͙{_qkP` F"` ϖyD 9 d0rXPqEd氂1sXQ#P/u 2p,n^ZWFF_nN]~Al&Pd@@a2u;ZQv,yUsTt#oJITdgiPAp{o:޾ޞ_SgvtU']ʟ}ԅ\OP)6Y]Au=װ_h K-qQ N Gx)o*.kF^@P5iYڶ)n~!L&i4OfiDo.4SnL8ճlq U&nـQq(ih:kfOFR2e/Ov[m'Ovi;" h:H  zY .X D,x\h=tg5k>ƩXd=kPB"Ҿ H{6%PCRfAKjj 0dITA~;TM=X M%<_>͗zJ"\ЉE "Qa,GuZ ڵ!mGTtY~%5k; Vz}GTZH兩TP卩?UW啩UY<3䝩7VZg奩Vo孩/WvIQ~YUej{_5F.{<^ӕh(RPj"%F)ppJ%uHC)]<HDdLHEl\HFitlHG)||HH /ˆD hHl/d#y 7-RSRKGT"TROz+URS+UURW+UR[+UrR_+VfRc(UVV!^*)^)xaOy/FW\;gׇ^?2{}ggㇹs?'s_R̭6kœg9Ϗ1'$\;K3׽3;۽3Lw}a]j~ꫵjʅ5zzK-'E@`@JN 5"ᐶsuJ?*TBxC;d3nԸKpcYǪ!EE:kD>$)XYФIXd9j)It7*ViӪW*8 }Ȭ.]dWlq79E"+,M׾+cIYdq&&|Yg>,4eVekmf}٩)F8KWif+g;53x8sΌ1hF4#}>cHBڌ4nFJT$CE&JZTGE.JT$WADf31Wd |jÌlgpru%J|Wy%JWr}%JW%x/jzfB 䋒I'%mJ'@*{TVa'˖ iA-K$\9AF)@Bz <B^  YM0cnK3_S W[)_8zcтXw4ЗhۍRt0~#Zd@|5]_T'xf7n(^!yӇ^9j 8hu.E\AtN۶}*9Bmࣜfo^O!W!^94t_:+}c/S:<,- .ӣ*>,OB 5V 2<%G*%ݴu;é<Ĵ-}M F)JmԨ* K*`K(+Kh+૯rR@XT8<ժF_c@&@e`&F^lzVWx3nh3r"Ռ8wK@3s$)Obr$)Obr$)Pbr%)GPbr%*O 1/10$BusFI1 VrX|e9]@ B}wlgpbܧb_#~q~q~"q~Aq~`q~q2$*Bq24*Cq2DYN/xR?-x@j0r5cAzǃ  +c*e`Wgˉƶzlˉȶlˉʶ(>rb(-'6rb-'>1 AG bJRw;m91ܖm91ܖm91:ݖxGoJ[Nnhw`f07?1ZG(UII'L>6[TfrPDZ6pۇxGq_X4^76 ]oeWu ϳ !3ifBwO[NC3y> endobj 4 0 obj << /ProcSet [/PDF /Text] /Font <> /ExtGState << >> /ColorSpace << /sRGB 5 0 R >> >> endobj 5 0 obj [/ICCBased 6 0 R] endobj 6 0 obj << /Alternate /DeviceRGB /N 3 /Length 2596 /Filter /FlateDecode >> stream xwTSϽ7PkhRH H.*1 J"6DTpDQ2(C"QDqpId߼y͛~kg}ֺLX Xňg` lpBF|،l *?Y"1P\8=W%Oɘ4M0J"Y2Vs,[|e92<se'9`2&ctI@o|N6(.sSdl-c(2-yH_/XZ.$&\SM07#1ؙYrfYym";8980m-m(]v^DW~ emi]P`/u}q|^R,g+\Kk)/C_|Rax8t1C^7nfzDp 柇u$/ED˦L L[B@ٹЖX!@~(* {d+} G͋љς}WL$cGD2QZ4 E@@A(q`1D `'u46ptc48.`R0) @Rt CXCP%CBH@Rf[(t CQhz#0 Zl`O828.p|O×X ?:0FBx$ !i@ڐH[EE1PL ⢖V6QP>U(j MFkt,:.FW8c1L&ӎ9ƌaX: rbl1 {{{;}#tp8_\8"Ey.,X%%Gщ1-9ҀKl.oo/O$&'=JvMޞxǥ{=Vs\x ‰N柜>ucKz=s/ol|ϝ?y ^d]ps~:;/;]7|WpQoH!ɻVsnYs}ҽ~4] =>=:`;cܱ'?e~!ańD#G&}'/?^xI֓?+\wx20;5\ӯ_etWf^Qs-mw3+?~O~endstream endobj 9 0 obj << /Type /Encoding /BaseEncoding /WinAnsiEncoding /Differences [ 45/minus 96/quoteleft 144/dotlessi /grave /acute /circumflex /tilde /macron /breve /dotaccent /dieresis /.notdef /ring /cedilla /.notdef /hungarumlaut /ogonek /caron /space] >> endobj 10 0 obj << /Type /Font /Subtype /Type1 /Name /F2 /BaseFont /Helvetica /Encoding 9 0 R >> endobj 11 0 obj << /Type /Font /Subtype /Type1 /Name /F3 /BaseFont /Helvetica-Bold /Encoding 9 0 R >> endobj xref 0 12 0000000000 65535 f 0000000021 00000 n 0000000163 00000 n 0000030846 00000 n 0000030929 00000 n 0000031052 00000 n 0000031085 00000 n 0000000212 00000 n 0000000292 00000 n 0000033780 00000 n 0000034037 00000 n 0000034134 00000 n trailer << /Size 12 /Info 1 0 R /Root 2 0 R >> startxref 34236 %%EOF timeSeries/vignettes/symbolTableFig.pdf0000755000176200001440000001670514263246021020005 0ustar liggesusers%PDF-1.4 %ρ\r 1 0 obj << /CreationDate (D:20140417140611) /ModDate (D:20140417140611) /Title (R Graphics Output) /Producer (R 3.0.2) /Creator (R) >> endobj 2 0 obj << /Type /Catalog /Pages 3 0 R >> endobj 7 0 obj << /Type /Page /Parent 3 0 R /Contents 8 0 R /Resources 4 0 R >> endobj 8 0 obj << /Length 3433 /Filter /FlateDecode >> stream x\i6~W36vBihZHӄ^_Gg|ӤR4|G>HW˃ӍՋ+OyӓZR |zuZOr FܺޕW˕^] ywy|oy'˵ܾ'Y6c(anx̣3Q+x2| ʧ=+gLn2zܨOޥ#vmJ ;Vlh=Z*$W1Z<):bю2FcU{/0]UV4N0/.1 DCr*qaLjCUQ5jA" !b20Eo6 swT%dd v X`kh; Q]" nbuU *,%-5ɮ=(} F2*Sߺ*$;`.6/X K#T7d S%J +l č%b˷d G>اq+ѦZ\HMgkVҔѨTCL=٦$0s0J"M+HHnD}G~ˎI&+D3+"/- 4Q!d &\hfգBLkx\$H̪GHn@ͬzq]m "_u'"yo/ 4R!2S⬶l!C D2fV[*D wd 7 TZ4|W"y+.,7d  F\ߗHfʨK޶<d 9hos?̼Pju)G2[uλڂWe ҊPg[C_hVh[CX"Yy;.9Я@G+.6[ke weR2i] K"@$%}e2iu i0d .&ܬm76ןf(ݬ8KԻ\"}7-OtwmySb2Pj+k[2Ymtm_@$ft --Ym)}y7d Ym)\L6;2ijKmhZ)xyV[b^Lї}!PiվR"}?.KCJ"}?.:U_p)]d4_J D2^@]/ߍoD 2Ŕ_@$/ڿ'~V[2iy)Ӣ}ye b1,c*ôh7j'~'#҂oCHKaZ^J-] Eo@ZǙ1 DraZ^LZ;"iI?L *H-40mO̖AMK;t]dAM *,k{2iQԤz6ץ" ~:2ߗHnԤhbFfAM*LM| >IIm,7HԤƴz$)?IA6>HΤ Fdt&ytWc|s@[,3A˨cl?1L x`|"o.i1\`|*m+i}ElS1Lڙ/)/2b֙f_ Fu&J8Sl_1Lk F2:0I".t&a$83%C")?΄ZK"#*Ql~Wt$D=0YA1j~lgUFm;=`}п3k޿3ܿs3ۿ3y `a:lm fNFwhӺ"7 `Z=ʰK~FV@2cQݠ2Q60Q160(øo r2fa'XL:3i1lo VY7+<~`M?j0`5|Orevan` ւ)&X ja,#2-#2"2|QPQ00FvFr>(XGe-2Gvx;( eqa쵰O|}um,׵`[05r~|~ f9>?߂Yo,`c|~ q>`k0c|~ f9>|>`[0->?߂i-r~|~ q>k VYol?߂Yo,`i>r >endstream endobj 3 0 obj << /Type /Pages /Kids [ 7 0 R ] /Count 1 /MediaBox [0 0 432 432] >> endobj 4 0 obj << /ProcSet [/PDF /Text] /Font << /F1 10 0 R /F2 11 0 R /F3 12 0 R >> /ExtGState << >> /ColorSpace << /sRGB 5 0 R >> >> endobj 5 0 obj [/ICCBased 6 0 R] endobj 6 0 obj << /Alternate /DeviceRGB /N 3 /Length 2596 /Filter /FlateDecode >> stream xwTSϽ7PkhRH H.*1 J"6DTpDQ2(C"QDqpId߼y͛~kg}ֺLX Xňg` lpBF|،l *?Y"1P\8=W%Oɘ4M0J"Y2Vs,[|e92<se'9`2&ctI@o|N6(.sSdl-c(2-yH_/XZ.$&\SM07#1ؙYrfYym";8980m-m(]v^DW~ emi]P`/u}q|^R,g+\Kk)/C_|Rax8t1C^7nfzDp 柇u$/ED˦L L[B@ٹЖX!@~(* {d+} G͋љς}WL$cGD2QZ4 E@@A(q`1D `'u46ptc48.`R0) @Rt CXCP%CBH@Rf[(t CQhz#0 Zl`O828.p|O×X ?:0FBx$ !i@ڐH[EE1PL ⢖V6QP>U(j MFkt,:.FW8c1L&ӎ9ƌaX: rbl1 {{{;}#tp8_\8"Ey.,X%%Gщ1-9ҀKl.oo/O$&'=JvMޞxǥ{=Vs\x ‰N柜>ucKz=s/ol|ϝ?y ^d]ps~:;/;]7|WpQoH!ɻVsnYs}ҽ~4] =>=:`;cܱ'?e~!ańD#G&}'/?^xI֓?+\wx20;5\ӯ_etWf^Qs-mw3+?~O~endstream endobj 9 0 obj << /Type /Encoding /BaseEncoding /WinAnsiEncoding /Differences [ 45/minus 96/quoteleft 144/dotlessi /grave /acute /circumflex /tilde /macron /breve /dotaccent /dieresis /.notdef /ring /cedilla /.notdef /hungarumlaut /ogonek /caron /space] >> endobj 10 0 obj << /Type /Font /Subtype /Type1 /Name /F1 /BaseFont /ZapfDingbats >> endobj 11 0 obj << /Type /Font /Subtype /Type1 /Name /F2 /BaseFont /Helvetica /Encoding 9 0 R >> endobj 12 0 obj << /Type /Font /Subtype /Type1 /Name /F3 /BaseFont /Helvetica-Bold /Encoding 9 0 R >> endobj xref 0 13 0000000000 65535 f 0000000021 00000 n 0000000163 00000 n 0000003797 00000 n 0000003880 00000 n 0000004015 00000 n 0000004048 00000 n 0000000212 00000 n 0000000292 00000 n 0000006743 00000 n 0000007000 00000 n 0000007084 00000 n 0000007181 00000 n trailer << /Size 13 /Info 1 0 R /Root 2 0 R >> startxref 7283 %%EOF timeSeries/vignettes/characterTableFig.pdf0000755000176200001440000007333014263246021020431 0ustar liggesusers%PDF-1.4 %ρ\r 1 0 obj << /CreationDate (D:20090325151403) /ModDate (D:20090325151403) /Title (R Graphics Output) /Producer (R 2.8.1) /Creator (R) >> endobj 2 0 obj << /Type /Catalog /Pages 3 0 R >> endobj 5 0 obj << /Type /Page /Parent 3 0 R /Contents 6 0 R /Resources 4 0 R >> endobj 6 0 obj << /Length 7 0 R >> stream q Q q BT 0.000 0.000 0.000 rg /F3 1 Tf 14.00 0.00 -0.00 14.00 172.98 397.45 Tm (Table of Characters) Tj ET Q q 73.44 73.44 328.32 299.52 re W n BT 0.000 0.000 0.000 rg /F6 1 Tf 8.00 0.00 -0.00 8.00 122.60 342.74 Tm ( ) Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 122.60 342.74 Tm ( ) Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 160.27 340.12 Tm (!) Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 160.27 340.12 Tm (!) Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 196.75 339.92 Tm (") Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 196.75 339.92 Tm (") Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 235.60 340.11 Tm (#) Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 235.60 340.11 Tm (#) Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 273.40 339.91 Tm ($) Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 273.40 339.91 Tm ($) Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 310.27 340.26 Tm (%) Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 310.27 340.26 Tm (%) Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 348.49 340.17 Tm (&) Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 348.49 340.17 Tm (&) Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 387.84 340.81 Tm (') Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 387.84 340.81 Tm (') Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 122.27 331.25 Tm (\() Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 122.27 331.25 Tm (\() Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 160.27 331.25 Tm (\)) Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 160.27 331.25 Tm (\)) Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 197.60 330.44 Tm (*) Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 197.60 330.44 Tm (*) Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 235.40 331.05 Tm (+) Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 235.40 331.05 Tm (+) Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 274.60 333.37 Tm (,) Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 274.60 333.37 Tm (,) Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 311.40 331.09 Tm (-) Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 311.40 331.09 Tm (-) Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 350.60 332.87 Tm (.) Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 350.60 332.87 Tm (.) Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 388.49 330.67 Tm (/) Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 388.49 330.67 Tm (/) Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 121.60 320.93 Tm (0) Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 121.60 320.93 Tm (0) Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 159.60 320.92 Tm (1) Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 159.60 320.92 Tm (1) Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 197.60 320.87 Tm (2) Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 197.60 320.87 Tm (2) Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 235.60 320.93 Tm (3) Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 235.60 320.93 Tm (3) Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 273.60 320.87 Tm (4) Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 273.60 320.87 Tm (4) Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 311.60 320.91 Tm (5) Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 311.60 320.91 Tm (5) Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 349.60 320.93 Tm (6) Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 349.60 320.93 Tm (6) Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 387.60 320.99 Tm (7) Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 387.60 320.99 Tm (7) Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 121.60 311.37 Tm (8) Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 121.60 311.37 Tm (8) Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 159.60 311.38 Tm (9) Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 159.60 311.38 Tm (9) Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 198.49 312.28 Tm (:) Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 198.49 312.28 Tm (:) Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 236.49 312.82 Tm (;) Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 236.49 312.82 Tm (;) Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 273.40 311.96 Tm (<) Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 273.40 311.96 Tm (<) Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 311.40 311.93 Tm (=) Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 311.40 311.93 Tm (=) Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 349.40 311.96 Tm (>) Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 349.40 311.96 Tm (>) Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 387.82 311.37 Tm (?) Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 387.82 311.37 Tm (?) Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 121.40 302.59 Tm (@) Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 121.40 302.59 Tm (@) Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 158.71 301.80 Tm (A) Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 158.71 301.80 Tm (A) Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 196.93 301.80 Tm (B) Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 196.93 301.80 Tm (B) Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 234.71 301.80 Tm (C) Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 234.71 301.80 Tm (C) Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 273.15 301.74 Tm (D) Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 273.15 301.74 Tm (D) Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 311.16 301.80 Tm (E) Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 311.16 301.80 Tm (E) Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 348.55 301.80 Tm (F) Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 348.55 301.80 Tm (F) Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 387.19 301.80 Tm (G) Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 387.19 301.80 Tm (G) Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 120.71 292.23 Tm (H) Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 120.71 292.23 Tm (H) Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 160.27 292.23 Tm (I) Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 160.27 292.23 Tm (I) Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 197.08 292.24 Tm (J) Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 197.08 292.24 Tm (J) Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 234.71 292.23 Tm (K) Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 234.71 292.23 Tm (K) Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 272.86 292.17 Tm (L) Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 272.86 292.17 Tm (L) Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 310.04 292.23 Tm (M) Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 310.04 292.23 Tm (M) Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 348.71 292.26 Tm (N) Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 348.71 292.26 Tm (N) Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 386.71 292.25 Tm (O) Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 386.71 292.25 Tm (O) Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 120.53 282.67 Tm (P) Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 120.53 282.67 Tm (P) Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 158.64 282.69 Tm (Q) Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 158.64 282.69 Tm (Q) Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 197.38 282.67 Tm (R) Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 197.38 282.67 Tm (R) Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 235.23 282.67 Tm (S) Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 235.23 282.67 Tm (S) Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 273.16 282.67 Tm (T) Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 273.16 282.67 Tm (T) Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 310.84 282.67 Tm (U) Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 310.84 282.67 Tm (U) Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 349.84 284.29 Tm (V) Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 349.84 284.29 Tm (V) Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 386.53 282.61 Tm (W) Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 386.53 282.61 Tm (W) Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 121.02 273.11 Tm (X) Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 121.02 273.11 Tm (X) Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 158.42 273.06 Tm (Y) Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 158.42 273.06 Tm (Y) Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 197.16 273.11 Tm (Z) Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 197.16 273.11 Tm (Z) Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 236.27 273.72 Tm ([) Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 236.27 273.72 Tm ([) Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 272.15 273.85 Tm (\\) Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 272.15 273.85 Tm (\\) Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 312.27 273.72 Tm (]) Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 312.27 273.72 Tm (]) Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 348.97 273.10 Tm (^) Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 348.97 273.10 Tm (^) Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 387.60 276.60 Tm (_) Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 387.60 276.60 Tm (_) Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 121.60 259.04 Tm (`) Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 121.60 259.04 Tm (`) Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 159.08 264.31 Tm (a) Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 159.08 264.31 Tm (a) Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 197.40 264.16 Tm (b) Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 197.40 264.16 Tm (b) Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 235.40 265.16 Tm (c) Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 235.40 265.16 Tm (c) Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 273.62 263.35 Tm (d) Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 273.62 263.35 Tm (d) Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 311.84 264.30 Tm (e) Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 311.84 264.30 Tm (e) Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 349.52 264.44 Tm (f) Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 349.52 264.44 Tm (f) Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 387.96 265.14 Tm (g) Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 387.96 265.14 Tm (g) Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 121.19 255.42 Tm (h) Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 121.19 255.42 Tm (h) Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 160.28 254.73 Tm (i) Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 160.28 254.73 Tm (i) Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 197.19 255.57 Tm (j) Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 197.19 255.57 Tm (j) Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 235.40 254.67 Tm (k) Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 235.40 254.67 Tm (k) Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 273.40 253.78 Tm (l) Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 273.40 253.78 Tm (l) Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 311.30 255.56 Tm (m) Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 311.30 255.56 Tm (m) Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 349.52 254.71 Tm (n) Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 349.52 254.71 Tm (n) Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 387.40 254.75 Tm (o) Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 387.40 254.75 Tm (o) Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 121.40 245.24 Tm (p) Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 121.40 245.24 Tm (p) Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 159.52 244.42 Tm (q) Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 159.52 244.42 Tm (q) Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 197.40 246.03 Tm (r) Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 197.40 246.03 Tm (r) Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 235.19 245.19 Tm (s) Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 235.19 245.19 Tm (s) Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 273.84 245.18 Tm (t) Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 273.84 245.18 Tm (t) Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 311.30 245.15 Tm (u) Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 311.30 245.15 Tm (u) Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 348.75 244.85 Tm (v) Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 348.75 244.85 Tm (v) Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 386.86 245.18 Tm (w) Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 386.86 245.18 Tm (w) Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 121.63 235.38 Tm (x) Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 121.63 235.38 Tm (x) Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 158.86 236.46 Tm (y) Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 158.86 236.46 Tm (y) Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 197.62 235.42 Tm (z) Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 197.62 235.42 Tm (z) Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 235.68 235.58 Tm ({) Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 235.68 235.58 Tm ({) Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 274.80 235.89 Tm (|) Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 274.80 235.89 Tm (|) Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 311.68 235.58 Tm (}) Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 311.68 235.58 Tm (}) Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 349.40 235.50 Tm (~) Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 349.40 235.50 Tm (~) Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 389.60 237.54 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 389.60 237.54 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 123.60 227.98 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 123.60 227.98 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 161.60 227.98 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 161.60 227.98 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 199.60 227.98 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 199.60 227.98 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 237.60 227.98 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 237.60 227.98 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 275.60 227.98 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 275.60 227.98 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 313.60 227.98 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 313.60 227.98 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 351.60 227.98 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 351.60 227.98 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 389.60 227.98 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 389.60 227.98 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 123.60 218.42 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 123.60 218.42 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 161.60 218.42 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 161.60 218.42 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 199.60 218.42 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 199.60 218.42 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 237.60 218.42 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 237.60 218.42 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 275.60 218.42 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 275.60 218.42 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 313.60 218.42 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 313.60 218.42 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 351.60 218.42 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 351.60 218.42 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 389.60 218.42 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 389.60 218.42 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 123.60 208.86 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 123.60 208.86 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 161.60 208.86 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 161.60 208.86 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 199.60 208.86 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 199.60 208.86 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 237.60 208.86 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 237.60 208.86 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 275.60 208.86 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 275.60 208.86 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 313.60 208.86 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 313.60 208.86 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 351.60 208.86 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 351.60 208.86 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 389.60 208.86 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 389.60 208.86 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 123.60 199.29 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 123.60 199.29 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 161.60 199.29 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 161.60 199.29 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 199.60 199.29 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 199.60 199.29 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 237.60 199.29 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 237.60 199.29 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 275.60 199.29 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 275.60 199.29 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 313.60 199.29 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 313.60 199.29 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 351.60 199.29 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 351.60 199.29 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 389.60 199.29 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 389.60 199.29 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 120.60 187.04 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 120.60 187.04 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 159.12 186.99 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 159.12 186.99 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 198.61 184.95 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 198.61 184.95 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 235.40 187.17 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 235.40 187.17 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 274.93 187.07 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 274.93 187.07 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 310.75 187.62 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 310.75 187.62 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 349.60 187.76 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 349.60 187.76 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 386.59 187.70 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 386.59 187.70 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 120.59 178.11 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 120.59 178.11 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 158.59 178.17 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 158.59 178.17 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 196.59 178.12 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 196.59 178.12 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 233.43 178.18 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 233.43 178.18 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 271.65 178.18 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 271.65 178.18 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 311.19 176.53 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 311.19 176.53 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 347.65 178.18 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 347.65 178.18 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 387.19 176.70 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 387.19 176.70 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 122.00 166.32 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 122.00 166.32 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 159.40 168.02 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 159.40 168.02 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 197.96 165.82 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 197.96 165.82 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 235.40 168.05 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 235.40 168.05 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 273.40 168.47 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 273.40 168.47 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 310.75 168.49 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 310.75 168.49 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 349.62 167.70 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 349.62 167.70 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 387.76 168.26 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 387.76 168.26 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 121.40 158.93 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 121.40 158.93 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 159.40 158.94 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 159.40 158.94 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 197.40 158.94 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 197.40 158.94 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 235.40 158.92 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 235.40 158.92 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 271.60 160.73 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 271.60 160.73 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 311.19 157.48 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 311.19 157.48 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 347.60 159.06 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 347.60 159.06 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 386.97 158.59 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 386.97 158.59 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 120.31 148.92 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 120.31 148.92 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 158.86 148.73 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 158.86 148.73 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 196.42 148.60 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 196.42 148.60 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 233.65 150.03 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 233.65 150.03 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 272.53 148.85 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 272.53 148.85 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 310.53 148.84 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 310.53 148.84 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 348.31 148.70 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 348.31 148.70 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 386.53 149.44 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 386.53 149.44 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 120.53 140.01 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 120.53 140.01 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 158.75 140.03 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 158.75 140.03 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 196.75 140.53 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 196.75 140.53 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 234.75 140.03 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 234.75 140.03 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 272.75 140.03 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 272.75 140.03 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 310.75 140.53 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 310.75 140.53 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 348.75 140.04 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 348.75 140.04 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 386.75 139.92 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 386.75 139.92 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 120.53 129.66 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 120.53 129.66 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 158.75 129.55 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 158.75 129.55 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 196.44 129.73 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 196.44 129.73 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 234.44 129.71 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 234.44 129.71 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 272.04 128.49 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 272.04 128.49 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 310.31 129.75 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 310.31 129.75 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 349.40 128.83 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 349.40 128.83 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 388.60 130.27 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 388.60 130.27 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 120.75 121.63 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 120.75 121.63 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 159.19 120.97 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 159.19 120.97 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 197.19 120.88 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 197.19 120.88 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 233.43 120.83 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 233.43 120.83 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 271.65 120.79 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 271.65 120.79 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 311.19 119.13 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 311.19 119.13 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 347.65 120.83 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 347.65 120.83 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 387.19 119.30 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 387.19 119.30 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 121.62 110.24 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 121.62 110.24 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 160.28 111.03 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 160.28 111.03 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 196.44 110.62 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 196.44 110.62 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 234.44 110.58 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 234.44 110.58 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 272.46 109.36 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 272.46 109.36 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 310.75 110.65 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 310.75 110.65 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 350.06 110.69 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 350.06 110.69 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 388.06 109.86 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 388.06 109.86 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 122.06 101.13 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 122.06 101.13 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 160.06 100.28 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 160.06 100.28 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 198.06 100.28 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 198.06 100.28 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 236.06 100.28 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 236.06 100.28 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 273.62 100.30 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 273.62 100.30 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 311.62 100.26 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 311.62 100.26 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 349.62 100.22 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 349.62 100.22 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 387.62 100.26 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 387.62 100.26 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 123.60 94.10 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 123.60 94.10 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 160.28 91.90 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 160.28 91.90 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 198.50 90.86 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 198.50 90.86 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 234.86 90.77 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 234.86 90.77 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 272.86 90.55 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 272.86 90.55 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 310.86 90.76 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 310.86 90.76 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 350.06 91.56 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 350.06 91.56 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 388.06 90.74 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 388.06 90.74 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 122.06 82.00 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 122.06 82.00 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 160.06 81.15 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 160.06 81.15 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 198.06 81.15 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 198.06 81.15 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 236.06 81.15 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 236.06 81.15 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 273.62 81.17 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 273.62 81.17 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 311.62 81.13 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 311.62 81.13 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 349.62 81.09 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 349.62 81.09 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 389.60 84.53 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 389.60 84.53 Tm () Tj ET BT /F4 1 Tf 8.00 0.00 -0.00 8.00 121.38 359.13 Tm (0) Tj ET BT /F4 1 Tf 8.00 0.00 -0.00 8.00 159.38 359.05 Tm (1) Tj ET BT /F4 1 Tf 8.00 0.00 -0.00 8.00 197.38 359.05 Tm (2) Tj ET BT /F4 1 Tf 8.00 0.00 -0.00 8.00 235.38 359.13 Tm (3) Tj ET BT /F4 1 Tf 8.00 0.00 -0.00 8.00 273.38 359.05 Tm (4) Tj ET BT /F4 1 Tf 8.00 0.00 -0.00 8.00 311.38 359.19 Tm (5) Tj ET BT /F4 1 Tf 8.00 0.00 -0.00 8.00 349.38 359.13 Tm (6) Tj ET BT /F4 1 Tf 8.00 0.00 -0.00 8.00 387.38 359.11 Tm (7) Tj ET BT /F4 1 Tf 8.00 0.00 -0.00 8.00 83.38 339.93 Tm (4) Tj ET BT /F4 1 Tf 8.00 0.00 -0.00 8.00 83.38 330.50 Tm (5) Tj ET BT /F4 1 Tf 8.00 0.00 -0.00 8.00 83.38 320.88 Tm (6) Tj ET BT /F4 1 Tf 8.00 0.00 -0.00 8.00 83.38 311.30 Tm (7) Tj ET BT /F4 1 Tf 8.00 0.00 -0.00 8.00 81.15 301.75 Tm (10) Tj ET BT /F4 1 Tf 8.00 0.00 -0.00 8.00 81.15 292.11 Tm (11) Tj ET BT /F4 1 Tf 8.00 0.00 -0.00 8.00 81.15 282.55 Tm (12) Tj ET BT /F4 1 Tf 8.00 0.00 -0.00 8.00 81.15 273.06 Tm (13) Tj ET BT /F4 1 Tf 8.00 0.00 -0.00 8.00 81.15 263.42 Tm (14) Tj ET BT /F4 1 Tf 8.00 0.00 -0.00 8.00 81.15 253.94 Tm (15) Tj ET BT /F4 1 Tf 8.00 0.00 -0.00 8.00 81.15 244.37 Tm (16) Tj ET BT /F4 1 Tf 8.00 0.00 -0.00 8.00 81.15 234.73 Tm (17) Tj ET BT /F4 1 Tf 8.00 0.00 -0.00 8.00 81.15 225.25 Tm (20) Tj ET BT /F4 1 Tf 8.00 0.00 -0.00 8.00 81.15 215.61 Tm (21) Tj ET BT /F4 1 Tf 8.00 0.00 -0.00 8.00 81.15 206.04 Tm (22) Tj ET BT /F4 1 Tf 8.00 0.00 -0.00 8.00 81.15 196.56 Tm (23) Tj ET BT /F4 1 Tf 8.00 0.00 -0.00 8.00 81.15 186.92 Tm (24) Tj ET BT /F4 1 Tf 8.00 0.00 -0.00 8.00 81.15 177.43 Tm (25) Tj ET BT /F4 1 Tf 8.00 0.00 -0.00 8.00 81.15 167.87 Tm (26) Tj ET BT /F4 1 Tf 8.00 0.00 -0.00 8.00 81.15 158.23 Tm (27) Tj ET BT /F4 1 Tf 8.00 0.00 -0.00 8.00 81.15 148.74 Tm (30) Tj ET BT /F4 1 Tf 8.00 0.00 -0.00 8.00 81.15 139.18 Tm (31) Tj ET BT /F4 1 Tf 8.00 0.00 -0.00 8.00 81.15 129.61 Tm (32) Tj ET BT /F4 1 Tf 8.00 0.00 -0.00 8.00 81.15 120.05 Tm (33) Tj ET BT /F4 1 Tf 8.00 0.00 -0.00 8.00 81.15 110.49 Tm (34) Tj ET BT /F4 1 Tf 8.00 0.00 -0.00 8.00 81.15 100.92 Tm (35) Tj ET BT /F4 1 Tf 8.00 0.00 -0.00 8.00 81.15 91.36 Tm (36) Tj ET BT /F4 1 Tf 8.00 0.00 -0.00 8.00 81.15 81.80 Tm (37) Tj ET Q endstream endobj 7 0 obj 29175 endobj 3 0 obj << /Type /Pages /Kids [ 5 0 R ] /Count 1 /MediaBox [0 0 432 432] >> endobj 4 0 obj << /ProcSet [/PDF /Text] /Font <> /ExtGState << >> >> endobj 8 0 obj << /Type /Encoding /BaseEncoding /WinAnsiEncoding /Differences [ 45/minus ] >> endobj 9 0 obj << /Type /Font /Subtype /Type1 /Name /F3 /BaseFont /Helvetica-Bold /Encoding 8 0 R >> endobj 10 0 obj << /Type /Font /Subtype /Type1 /Name /F4 /BaseFont /Helvetica-Oblique /Encoding 8 0 R >> endobj 11 0 obj << /Type /Font /Subtype /Type1 /Name /F6 /BaseFont /Symbol >> endobj xref 0 12 0000000000 65535 f 0000000021 00000 n 0000000163 00000 n 0000029541 00000 n 0000029624 00000 n 0000000212 00000 n 0000000292 00000 n 0000029520 00000 n 0000029727 00000 n 0000029821 00000 n 0000029922 00000 n 0000030027 00000 n trailer << /Size 12 /Info 1 0 R /Root 2 0 R >> startxref 30105 %%EOF timeSeries/vignettes/colorPalettes1Fig.pdf0000755000176200001440000012056214263246021020426 0ustar liggesusers%PDF-1.4 %ρ\r 1 0 obj << /CreationDate (D:20140430203415) /ModDate (D:20140430203415) /Title (R Graphics Output) /Producer (R 3.0.2) /Creator (R) >> endobj 2 0 obj << /Type /Catalog /Pages 3 0 R >> endobj 7 0 obj << /Type /Page /Parent 3 0 R /Contents 8 0 R /Resources 4 0 R >> endobj 8 0 obj << /Length 37256 /Filter /FlateDecode >> stream xK-9z$_̅ƴzZ# AnTRAп ㋾[~oۿۿ歟o6߆m\/??o7ooMӼ5տ'|?o/o?о6_?~oCm޶<4L2p vK+m52l淡iMKÖ;upҰ? > oYpNy8|[2\f O~*c)6wwDנ,r{[aZy*6o~lzݿK2lSaYi2\V :ml6/Nðop.ےmSvk.yƵLHd0o4Cga3aƘ(_o}4b GHm#lOn</܅6c<lt_FlnaLͩ I6acZ38vƔ2l\ ɋSưoåǰ_\&+ oCWm萾i..2' COyp6py{usE!O@&l`fo_vK퇡ϟ>o 1S~jJ {r~ 0*\ ]0'aɉö pEx=6}#^MHߋ 7cװq-66˿-\y_> c4,Dbb gq .AeCUҰJ[W0؍H{ucԔ|Hn)]s뱑_myK\&4iV22 .g}P4H5OW+,Ȥ7]w殀t+l0|Fmꂋ/N.7 pT36_}c7u'6FS5ccQ&j^~툫yxT1Tֱ Ke6R@/19LLa`ݧ5 eu{Eȿފ7cfr~2Af/=J9<;~rVCl#S/-vr~.s>Rlnc[Ø<Ƣ2lw`@Kk5fh B҆(mm&x@kla+lͯ.n6*Gޑ+yz(Vг\'v@ sR  *486(t|\_.*n-*2WW)v*(9A6у\m1$R)$pL䦟MN!B7zN#Kubʸܞ63ceX*1=Jko{mX6@KM +MX9?Ke!~ &FSy5brCzlFL"Z!f7y~ aZnɢRP7 v3N{=~+'(wfjZei\]m=@L*O(Ы~: g0O[MiZ,uT7VPn졶W4*ybUQP]BxJE*UpjǤh}^LfiLiú 1^`Ceq[9Fm oL4ǚq_F-:nx|2uqCʹ󸲎򸯼1Ǖ}Me_u=dqLDqZsQO\98ధ.Esy #:g}e_qSW].e}]e_uY|woIV!v_vkhp?u3X6:p?yFN`PXy;XN2D>;.@G2q G`PyR[Lou3]p^*0˵? ]Wj<*KMX]G1vue@ti+ `㮲ܯTV]ea#`&,wsqWY;2x渍6V6Ҹtld幫uY+_J6x#V1<0󮝿 3G^9füoV^gʆ>T8Ԃ*hJe)Ԛ-tKVYEd-Zg*%kULRVAY-4֦8N56Y0SNk0]pgONif9rV 6ymF۬ gANmf9rv)6[Y9;s&|gL~^slh76o!zXc΁ցށ!1AQahqhlAA}7fk:Z@SD 4I$f,6{hQ z$S"].F=oGXAb0D(XBk)V2D'^'z7'z9d=/J PN=r>nC͏ P>?܀z c ^ [8nO ЭKt3Pc@7DܒǠ)A<fLkkZ/~Vnw믿wBWֳȨ .2򸯚<*c+SQ[+c(lx<* F E<*c+;>G!O?h_DFc_v=cc fSt_z2*Og<Ϝ8celqS[}_ { xt2/VelikZKyVϤ0Z9m8}el鯌-bSڕc tllr>íc ^B5^V_[žJ6IהB ckI6Vec+v~j߻;6b.ym7[Tb-. ւ;~o?)ckaZxX<Ҹ~[؜,C$i4LK~3[kS̴W ]_n7>lX#J~o\hׂ;> ~opHa,ԯqSV[t038]?[/ #c f.;v?[̱Z`ZdZhZlq@HPXH`HhHpH xH DψuCDK̼kȏu3ޢֶ@iq-<.-z}3<.*D#FԺ"Q CD -4NBQ-8֦EOAÛjӑy̼~7q)C SMp0it S8L pf6=ȹm4!gBNoEuȁä~gRāAߔ{jG5hK!XE?T1;ޘDoOP K%xA m>^;^D}3fk[_͸}LH!ۮWh2l;{8v-]6,UJ.E@3.v] )2XRt1HbK DQDQhan{?vFfT:曕R7k`VKnY1ffv+ȺfNJݒ'Y0݃Y0݃/:8ݕorO]~s[Vue\ZE\<;r\Ao/GjT)yAC`\}p^=>v`&_3neTV!r\~ZF:cjq_ZyVVrUVOI @|,>6f1~rw\cS/~ @t灙wM9rc&*ULh@3SIh68ԂfhZBjM3OK(D !,FԺ"Q CD !4NBQCm>M!6oMGyτ >8e(mc8mz5@#N8s8xs#-9&tVӇB:UU8u3q_7޴j R[C{w Ӡcqj P[xϠ̠׾3] i* E0oɼSDs1bAń" E<#|.V](QDt1bIŔ"-E'EECW ~7fT*uR7+oJ7nY/b ft#̪Vu +1߻%O`7`_r'fô~CH[|Iѕ3 hi݄Ƙj݄j݌k 83ɬÛpe[>G[$} H^x7_'̏C\?@m`]"AuK#[ :wwDK4oc#U߫20u JӰmL^1˘voNmxtg5HtsblA̒ZLL PS*Ӱ̰y勑pM)9,wag- l,yLj m]H&: X_F>|6 WsMȞ;0  @$r`0!v`X0v ofmx7 90Lcɱ黊啱Zl09v:QXǿW c65{biGԳA^2xA}oSEL TO- 1Z0c@kA0CoFjL68}'68W?8N]Ui7 !ڮ͜/By 60^%*@ WyJá*^TںbOu`A*N &ի0Κ¤~y,F9"myK\W< 7ET2ɹMYA4փi^@ĵChm$!FJ%(} 2 ٢ }s ^ǩnijӣ"XVo`A=In PiC%z|@y 1!ڎ$܎xq.6ڕwv7jlStiĿWMrkl9j< }lY}ѵRDUKɚYrN`c-i߫n'ڠyi3$0+CP4 Y^'+mWԴ!.hmvkކ,L0Ms`h:*n\4}7ݟE&lUccI^{UzbzӒaJf%(&m8ȉ8f(()Sf*|BYl>ʬ6>.!@]]\.;c].L=C}>PBfhv3'z Eq:VPE:g袔G2JThK:JT裔OBJ[~$@9CJ1[!}d`L?]Gpsz{JWPz_PʟPz PQz_F`= XG(uG3Lc=cfn7$A e9)̱3`ʳ1hc)SA(SaTLg)O>3L}3L}>0c&>_nNc^δvLsw-`ڻk]KZ"ͻV1޵iuLŴ{X+pX+PZD>ty&[.`c^gsqWX:x}}u/-> E>Vٷm~X+}w/c\X -a#fOjkEŹ5F1VsWkXkYkZk[PwN{'cAĨb1nH:ƌybf߅+2L/ ZL3eL;fLCg|o1MO1m/111ϵ1U&`e(-V&de(mV&0"fؘκ7-^]_Ln/Kѥc ^\ʏ5 0'6l6m6(vb*.Vb.^3J{1뫘ɒe6n6n6o6oc,6^o>Lj`:TM(m>^Ë&]_L.~=fvsgh({txjW-|jF:mЇ~Zp؂}xlA|,_^[03^arGF1o/L=[̱ZbZfZjZnZra!Ę%bВ1jI@[g?#҅1ٷwa*fM9ܼ[{^omk=֒x&D-vZem#kIBk6YK}Ze-}\u@ԦxWm:0K8~7sF69mD g@Nk&9M rfSI"N.E]&8LaDF1iA7-nGFW1sMͽi1zXF}c /~od*1K~ڀ¤v2-3${{1^*hvY; ,E4K-oBr[B-E>+*f U$"JdTb*RV"1$Q$Q*h.rIܬ5JZ/)5_TjXz%܂265ۍhӭ 붛AVn+VwKbrerbtu3.-\?X\#˞;\W^RΗ:5倩VNe利VΘm吩WNu嘩WΙ}I PNIMPΚIPN YbY`Tfkk2*:8qq!JuS T9NDT=JS TA&J5TTE.JuT TI6JTTM>JT TQFZy(JET^E|9f3enJyV.&b2.&b.&b2.&bkb2&=a&}!Fp}Zp1uV3Jj=p`&^k ʞc Z&0{5dט #jc A(a&XLg # 7cAS3ݧ Lzi&4}ZI>My`Oc0ާ5dLiPyUW?N<3J &[<pL\ȹ 3neTW*+riTVÕ}pq[9\y*sW9\y<է&\4++ڄܧ}L~p^N#,f=-X@HPX0^q/O 'Ƭ Qk İbZ?* t̾ 3t-fvsy/ƽޢkE; z%Xk, Y4dZfё΢$kEKJ=Yk-[y>MY"]:ˁ/L=9}rJvI] 0,p^v/șnS ;BNnD.rz/ĈCX{&|pn71]mF}썽읍{HTConw7aj¸}-x6W$Ȏ!ep<,NRiy`,yX| $!Z!JyX\<$AVn<\aA)fW~kSR4qbR{X : | /`00!o0;G]4od{}x{1L_?2b#W..nӆ6~(lʻQ(. E$?DgF(@X4ByJCd/+QQoY 4P{(}"qTSs@}Ԕ~k⚒_z`dFzm"rB4/O$0W"槵 iHWE>vdjڷPI\}x6cb ۓ焏%s0k<|Ew*\༕#C,6rzݕmj=h=h(h-dhoJ?N Vх~)3jqJ.f L48S3նA$&Sztp^L)n̴m8NTSGH0fEBwi`MVv3矏]t-f}WmW]VPMVX=\Q. PB!\Z>" sB̾ 1 V\]\2vylT%ѩHS§*$PUJCU9U%MJTͳP%W%)J{it8@ ̦ - nfR$%ڋiJ/*G@LV1a bL$Y!-/CL\V1y%B,c+Aw4||uh0Xt^!v^Av^avFi#ݶncn7BTpPMxǰ6b]ߋvG ОOf8%1o\(LPrs$2#;Te%?1J.s ]))LRrt$2K D ޲D ȳ4d \jZpnH\&u{sQe 70`L\| qqm|\s/2 }}|Z񭶲H/?]ORS{_.U! >>U8t8&p\p>M<ULZ[[Ywo,*b*b$+b+b 1mwĢAQĢ3_E;2NaepS^aFaFaFbG^bGb y9J|yq:y&hy6iyF7if:hc:xwZ1[C}dqL[Waf7Q38U0xY00]P0ap08e0x i00"fjǂAcA&̄ufvs)c7#n zxB^# :0C R4FpFv`@}ҁJߍJ\g0Uᦠ{= H>j棖 >j 5ZeMy: >ʻV >joM ?2`&#)ZQj8qNrY6ʍ[!N,7CٹrCĹ喈Mg"N/7Fú^݋8u3u]7Ros5׈אט1am 77ػQ0cځ?3쵍7cu4v],x͜"7{h.\,(¹PsbDŊ"EB;.],)Bj2EJ\yLh$8QԻ8I;2>X pwO5>|_;t$݂x1nB<(!q~̀n:vnc=Sterb{Xv??~n=姷*6;KAhO~QeK&] ?1]̽2K9{L/s/t3L?s/t4LOt5kL_t6k Lot7kLt8ELK#-ͽ?JK{ٽv_g0?/ˇOy{o-_KyX}}f+|\@𙱥ę|g"ܺ"$δ-xHýyR/:~Uip9V5P'5R5t'5vN 'FCV1+ĠbJ1l%Rπ ~F$cƝ?1́u3]a2㔙<]gsy/$ǽޒk%= K~% </Iʒ#k%I:K4Y+-yZedZ,]6エM{tL[80ͥBu) s; '@j9 rb{NU$7"-D\ފ8qzy3ˆcl/xeŁ3i Z9#gJ{e}/1]c 5DokF{J~͒do0Lj~IځڤpϨCŌz#hiv\+@"HWd)Yl-Dx"_ n)XIT1Hb'QP"DHS*1 D='z'zG)UMӒ.qIܬ5JZ/)5_TjXg)܂65ˍ[!m7nG?V~`ѯan!Qj(:;L;ڴM1kt5Bs!"c@tg51H"8QD^Gdv|datlU" #̭3(X0 -!=%M)]-f^\AOF2zdAf>"3/ I3>(8x(k̭3tX8^gsqS[}T[yWV7'4+s+2\U2xM4giN zn<,D.,Ap|$0 )(b~&"O^Ǡ8:hcԴ+=kW Lk; ޮw]!Lb:ݕG (Ep+mgqGN l  5WDn+HaUooYIY󥒲LrgM 0;<*H =p ѹ%&/fx qOks+QF{13(:ntEz6mʫPخ7O3/BafރB!]`ebt i%Rbr:G) yhיRڦ^VutP' (S"qTSD_d )7| Fq pnmUk0 lRl4 CvE@(َLMpjM\[-6դ7qP<,6sp\`R B1M(#;y%E[ѢĖ}L{icQJkKVXU;Dj05THh 34!ZiC6\f~o56ފ 6N1qi/hTvsI9ҎL]I5U'ԤSR%:AKUZj 2U hOTTQS~HupPRQugQ55σ#0OP8vsIr -GZ4bH"nQH "E?)Rbu/bKy^H1}Qf ";[X5j~'jkI]es Ⱥ.6 sO\1ws3\2-s+\3w=s#\4Ms\5w]s\6ms \7w}\8K+IPɜ47I{Akv@̲BRvE n /vpCK[ ?pD c OnpEj _pFr ofpGKz pH ^pIˉ P1c0wzܫ3X~|A ^L+x/yf?R+AUBV+U2Z+U"^+Vb(AVf(Vj>(V愲e<@ _%+u1L|=~N f.d4_q>j?S=Li 0+Ĕg SL6"m0eb Ɣj#)F(S``HɎOR1L6b*}/b*}@T:+ nJz]I#)>J i> 7!J!>X[ *E|vl{T)Uh *v1<Q\sUBrOt1|\Gcv3/Sl[$lWej68$&xt6pL)JO0m2ed6)ȴa SB&oDt|m0saG 4Ŗ|Mh5å[VtBvc [t@tPt`pPMxǠĠ1]3)*Bd+pmyJf.\&(Psd2DIe%A9J.]&)9RtdPsYwoYwUL9rٍ%n 7%˛kR7oJ\.}sa ̥Kkӷ0aN\~< }s_r__q2YϷ[X,,&=EG&1`q%G&#'*3.CV͍ z4ghÞ N{V1hmeb1F:I:㌦"-Ρ"-"-N"cve)PĞk{]=;rNa+N+6n##+3;CK=o>8iϖ#1#$-P2& -p2/($-1?LLʑN0|9fz |3YJuA;M*_*@*A!*B1 +CA,+DQL+Eq2`A%亷%^8Yg03`c0 9α3`@1icAT 6pm#;>~00ژa`͘a`u3R^.gvs)=r^ Z %ZE /ުV!>j5{+3k]QdfmfH%3k]Pi 6!`#7 fpAc%n2j;+xžLmg\Y+AY<緝Zlga;+BpHY눃h.n 09p:2s0\bOp I 'ܤ#n!7ĘEb"1j@[g"?#ҁ1㦞7wa:WjSќn˭qZR,ZR5.ZRUUˤ5IT-VZ)-STZjPbǵ7X]:vDXL^N͜Q>9%rN[䤶 Ym)r %ANl˂ٖ9-rn["LmrFdjr`[,8u3|W 㲾ɶ{jZ5Dok90:0;0<0ѸF Ʃ3@m>^;0^n̠>NI,y3H͞"E6 p.&\l(QsbFŎ"!EFKwLג)bz.N-N]$nV}jS|O?݂xnB!o qSp3ssK {p/ {%ok_~(=wE;^j7]]C 3$̝2CI3d̝6C܉3̝:Cz% 9+w!iV f%K)BzAT"f!nVjV_GG;{j+5;r>]ϊ ³ĴA+nL#"ǴB+vL3ǴC+~LC"ȴD+LSȴE+Lcw2!ͱz B<ꄾo>!-Ҫ = ")njG)"*q3Bi9ʱ_5Bѕs߂'–`[|lE8~o!9$N-xGyYR̂9pcw f>0pO'ܧ#!Ęub:1j@[g:?#1㾞wa:HSe ܸ[c-`ZaA$Dy]!kE2 u$Y -XVZd-ZkAXqmwQ]:\$/3S]w;,ӆ8q8v6ȩ|s!'sBng΋0"wSΩ[g0ӕkU}-޵ZB 5*oРc}P{xiy+*f U$"JdTb*RV"1$Q$Q:G? %XFjXxJbRJ p-X+wKnXjbr3v ߻%``_z{0t~J8{?r˞\w& a_n憘aan&憚acnF憜aenf~.;k: Y0`AJ[! Q`X (p 7spw >^S\L.z\qy?R-1S -1S-1 S-2U"S-<2$S-\2&S-|2(S#C|(ZHd;!i,>2cf.{i?MbM.ƣb|M.ƫbM.Ƴb|M.ƻF_mr1 cm0^ gm04&(&Zū1f-̲^p@h?c=njY0kĘf!cƌy6TC63m 2eL1kc1@ }FNX1XM8qapS 8y(4ZmӇC:U(V 8u3h튙4\/޴һ5Bk8s`u`w[ie qi H[xϠ̠׾3M3 n˿Yf.LD4l*TL$ҩHS1ȧb%PL"DDC*!UL%RJ<&4T$[$\g@3O-GJ/M=vFbR:拕Jk V+@WnXfbr+ĺfk"VwKbrerbreU&m~ys4TM_*u3 YШ1+Y 3Im*3gmI3-kę"- WmeҎLk 1s̘9d勑XO ol]h9*-?a>F[;|_x`e}J%(v)bk119#`xc~{sc^8)Oot=s?7 ixgw< NŽwe7 &T=FYaQ3t nf(, 2%ANuC2rkJn6%vm.S]?>hos+dG.ͼ44|=ʚMb@0oXS7/bۓE3o`~羁7|ܾuB( MH.7Rd0[[RgJ1*v)ӊgO:$H!%{*ZP`BjA&c |-p3sp`$HD <2N"cF N&nS bfkfqkgJU \{ޫt_TpVdVׁ v83dj  sb: iW10pѷ1>Q4Ra܊68+"Pw<3/JaқY?%c,X35͠Jb77C!6P.`˾S3ƈLӰdAovnMy) ʵw"σ4$}1Wi۸ (w|{yVj{Wu^{ݽdi bѕhtP=Vs [[TQ~BC+TUo)ˊJpP8/NySYQ-{d|˔U5\Ui]OFt} [Vz>_aё˴1,>|ˬ5)BU.d6 iT0 z +Mݵ|+]Mפy(,42J#75_Fv`|/ě\@IJ ⤀ΙxAz %g)Pj%)QZ%)@QJ%)Q:%)Q*> )p//EGgqKhBC ΁(v SI8 T Hn UX Vhf WIx Xʈ_ |ȇyfJoW^p1^z`|/s\-h7S==LI0Eǔe/SLi6>l0b Gd˔i)?S/Lm6^|+^|`|/\q{?sԽ3g;sؽ39yw}a`s]#Ŝy7л19̹w}mq a.soG?0n>Nˀ^ Ҕ ^F<^]eV=^v;y>ԙ ?j܅/Ÿ~S+̀@KmC1VԮ +~* h|bA`.A`/;[ӈԔ;DYfps>*3'9h4}>dM]gO#/.|C?|DO.|E龏Af^{5bz˗YC4s1R*]1R3*^1RS*_1rs*@1r*A1r&*B1r6*C15SXӽSj0Z:;ta1cV+0XALxl0,aİe#aF F#aF0ÞpA'{ Ó'ߋf'K'3~7G{gwyF 02U"\wa`#]*wW9F]bd%F]b%F?1hwUbDUI  k%Rn2j)7jΠdVK+s//g kiyK+^g_ZyIRϵĈ K+^B>"&ġV+/- p$˭~a5\7\!7\A7\a7Dr"M;䦞sOZ B-p+|<$ <ѲoAˁt,-q M4lٰ6v>J/F A- ,kY$:(Jd͔`ɒ*9WJa"rS~Lh"wKtz6BI'mJ'O*oTV|aG'˓ cA-?$\n9A.!@B76xPL Wm0cnK3_S W[)_8zcтXw4ЗhۍRt0~#-^xA>2<¤M&[3$-oPC%r 6q.6\ PAs"i!#-TcAۭՅۑtjmMWn.-2r8Drk}SuJq\xauyqC\wiQxHNIVJIKfS.0e vM.H%PJR+5JR,5JR-5JRJ+II_|%IPD%IDPd%sU7̥[\\/` bp390OB$)pOB$)OB$)OB%)0PB` !4f?VCI@ { {/GGv 8<^q g?s9s;s=F^ _ ``a%b-\S=\TM"nz0̓W#1vIr{$f7c! X!9+nb:&nb&nb:& l˶l{Ҍm71V(n:\~rA4~7gnb&fnb&fnb&>r_Ãn>t w`ƻm0އ:cO["3{ Y+B`B`Rߢ[zP2lZ`aS4nX>Xs"݂c4>yZ|ku,J~a>8U!b:mڿa{ֆJu:Ԏxxǥ0YDݲzfmU#uIL(4Qq%xʮԟ xO9NUUy!_X/!htB>ئe~Qશ@`@,k4ZYl pDM~OM'֧)wgӇHv;̘Ҁ̗4֥0Xƚ.ޡꍅ~HDїuE~z]eDGAw~`|d7!of'F!iQ(^~X\Zxִi~jDbCNR >1 *r U)#@Re<T]Z](M'1 ?}o .nG\̏x$vFI𢕒M _Th,ZYDe16˂EAڽ0Io\^ûMlԜ4VށϷ21J Ԣ*qJ-*J-"+J-b+1ubԢ+qK-+K$(K,0!+,JڷLz2u`6ALybf4y?$)N2:!"O2$)XO2$)O2$*O2$#*P2%C*XP2-D $)o/1GfyRzť nǴLM״MMNMOM(TWMUQ['R[!DͦQާ&}#Fqf Ġmbm613L+_S~L 3%`p {1cJHeʱd#)0ExQp!U^0Tl:jKmZo`0+G%# fH}Y>s`T0+G.#Z fHڏy}V%EM'3ilA+ "̦~npFǖLǚ/+Ӵ XTٔ}e6q[Myl*SWMy<Ǻ&ұ$\My<&5#boUfSrtj M'34q*t3+஘+䮙+讚+쮛pWNk'a@DU آn ՞C'Z=h90NYC?_"iJvp(VP;ᡴXCduu!ʚET=(V%Q3YZDŵ\|T,{ρtG k)W -ԃNZ۴2j \5B }ksDx h`65@myl61S*v&g̦C]y+mBަ34y^^5t^S4^qZ*HC_nm7J lpjOvȆ:{l:"$jqmҬ5SMK:1mT(`PmS9bCNR >1 *r U)#@Re<T]Z](M' aFGi>Q$.^(]Qh$zNIE[e"핅 Z,AYh- LU+Udo0~~'f/8zEK*'NgHJ^DŽ4xS^WEW&TmWb K[aizT= +ZF r𦀸dy" ,OKkІ >4sx(31noXh!/ޅl~cx4*JFŕW!19F3y58CF(.CD#bDZN0›m8v_Rs`C7`ћ#9b9 kq QeFr\ĀUqvqhqa*iT\Dd+8 xL8߀qU:0n<-@\hϧ1PNPV31׳Yz=U(ɾ^k}MkՑ$,D eXhAtb B RN$ HC>, :> 98G1SKW}i.7FDB/$u+wIntfwy(!74![17_{?K>m9xK_ՌmU;n>:z7Ϋ{Ϋy:B']˿2Q3jt -RQ&'ͮDigEʅ6Z[;!kAZ,[S^ $z6쵷f^i;v4X[\;ɣ*&Y!(mp0B{SĎ:[r0vG-FY 3|LQzNxg10}ȖWglcßi*fVtu^7D7UG(DZa I Й ZNtB.ݣ}0> 7 ς`(^o m[Bі F1$mՐwCYH?$#I*TR C@R)|2iK% !Hbb{AWzWz6WdŽ׊Ag+> X\x cqDМ-GwR&'=ವ}B-B-/܃鲦6&fD'xKd^1bԀ0IC1I #&2!J=$`2_J'Ot* RSl+uLR;\,LR#L- 1eJ])Cm) SfYd}xM9oR{')q3/'sM'muk'Uw'=y˘'%i{٘'#2T'͊Iu{$=0> {\py=q!GH ̖II̥J̴rKÔʹL ҔZΤMIo$qQ__uȔ-2vdn3vDuo歮gsP:G i|U&!\#U`ve0s^? nn)VeM$EIuٺnlPJPB*2R6%WU}7We=Spq';:~|9[4jbXԐ=\{Cȶ@6 re E %&bπm5}f5=ܩ =;z]{7 6wܶþ^_ٴ?}^!\\ureZ";M06Ÿ?}^g"lQ5I\;ЇRt4r2'?M-.ke=v[/ Qvfkq#82sj#z<[k#F#3eG{c|2&ە441:#E-ңSQ9UoА+ XGfg)= Rl5KQk^0/g&j,dQM&c>Snᖶoͣ5N$;acT6 O< ihfʧmbFq~fi;(';sYT=>V? WnVF&lp1tpK-ߺ?3p*z2pҸZ{ A.G-͉bp<׀.4wa5 _8u Ck6ƃ_+O~Xύܡ HN}on)]Av؋Cflnc#Px=DȆE6M}XClNeGXv`e C4_Y|,r2]dR#nnn)u]X"t}c\7e _-obnQ f Z_O)BJ вjڀ,;ܮGzD[Lgd=̡E{Ò@L\EJ%µ Nj`g;߀JmM3kJԓQxYkw|wtKj;&ּPj ;d?of5F;;]8e3]c<T1|Fj ڟًg?ܮ>}.nqak35ٔZlY ,e5AkT4I[4݈PKD5X;5!L:ewʧhc2]OϼtvK@660+z?s e]("~Biޖ4.Y]W|)|MSh6{ySjd`s6u|t9".FvڼFiEl\azFi>ħ5mLU8mm#4%x si;Z(m:Y/\>>?ln81^^67K ˋ.0n -xRӪJë,+D1 1s6j;!>K"gaɑ'259g=<:Ae! ƐYѬOlV/28k w'޴HeQ!:$me|Y{`2GD~L ~LD~MG#D_?-Ooߊc~iMj~f77c<F1_21: (:@CK 6:7;eC?z]7'Hc֕T.S}Ma:5H h/@f9`Gͭ#3v閲ƚPD*[5 XhGkzZ3՚ȅ{2p|lj035 7 hi BKۇl?& nnx5znr }j 08&^'>=ѷ`+0E_RP)@ Bh/D |EX'۵q_y&btK’_cO!ACn I{δwP{cF XOG{g֔'۵SB,R7p{?,w{7`{/$ {7{ { 7x}? nmtO&p]X .0 kn0놾lLkK+w^>^P }<+zmÆ&&}znLm7Wq<[vk49Hr%$uI2IaP*Gc]tI(9ZSRVdpmIZߵ.&ݛ6 ZT~YT~7aUvk4rn+@^궁 $&n \-1yτmNuMƶ|ކiumwcyjn4hR_zS- n~۽V<_n77S$Oh=ņSPphAǁ z레C*/Ǩ=z0CH2J0̠ v9ĠaA}pts9n閒Q+ԯo +İfc59 mZXdMB*k&YPΚ煁ִ/f5) ]6`5f {l6)~7[#;-9 bxn :ER8n4Q@Ht?)tEg0 G7FnFͭWz]nԻFPnR7 t U!OUf̪*os#ӕ3jdts6.<1-RְtHN;bƱ3|N#;;Yx~#d@K><[Sޮn(etKAc  ߁ /: ;G۽J߽޻N X^CEֽFi^4sc㛛C΍-.lf>4R-eCul1莑!鬑ʑ葷~LYF{|6&;1; N^ttKd#*k,s-z/ e"bF1tQ (^y6> Q eѠi;)lԔ}vJMnn?7j{6H1>}8-Mz"'Wyԩy2IZ gN$jI(9ZSRVdpmIZߵ.&ݛ6 ZT~YT~F7eK΃ıYs[mW L&1Qw[m0L4{[mlϧmx{?ֆz7Fٍ&5}Pa? endstream endobj 3 0 obj << /Type /Pages /Kids [ 7 0 R ] /Count 1 /MediaBox [0 0 432 432] >> endobj 4 0 obj << /ProcSet [/PDF /Text] /Font <> /ExtGState << >> /ColorSpace << /sRGB 5 0 R >> >> endobj 5 0 obj [/ICCBased 6 0 R] endobj 6 0 obj << /Alternate /DeviceRGB /N 3 /Length 2596 /Filter /FlateDecode >> stream xwTSϽ7PkhRH H.*1 J"6DTpDQ2(C"QDqpId߼y͛~kg}ֺLX Xňg` lpBF|،l *?Y"1P\8=W%Oɘ4M0J"Y2Vs,[|e92<se'9`2&ctI@o|N6(.sSdl-c(2-yH_/XZ.$&\SM07#1ؙYrfYym";8980m-m(]v^DW~ emi]P`/u}q|^R,g+\Kk)/C_|Rax8t1C^7nfzDp 柇u$/ED˦L L[B@ٹЖX!@~(* {d+} G͋љς}WL$cGD2QZ4 E@@A(q`1D `'u46ptc48.`R0) @Rt CXCP%CBH@Rf[(t CQhz#0 Zl`O828.p|O×X ?:0FBx$ !i@ڐH[EE1PL ⢖V6QP>U(j MFkt,:.FW8c1L&ӎ9ƌaX: rbl1 {{{;}#tp8_\8"Ey.,X%%Gщ1-9ҀKl.oo/O$&'=JvMޞxǥ{=Vs\x ‰N柜>ucKz=s/ol|ϝ?y ^d]ps~:;/;]7|WpQoH!ɻVsnYs}ҽ~4] =>=:`;cܱ'?e~!ańD#G&}'/?^xI֓?+\wx20;5\ӯ_etWf^Qs-mw3+?~O~endstream endobj 9 0 obj << /Type /Encoding /BaseEncoding /WinAnsiEncoding /Differences [ 45/minus 96/quoteleft 144/dotlessi /grave /acute /circumflex /tilde /macron /breve /dotaccent /dieresis /.notdef /ring /cedilla /.notdef /hungarumlaut /ogonek /caron /space] >> endobj 10 0 obj << /Type /Font /Subtype /Type1 /Name /F2 /BaseFont /Helvetica /Encoding 9 0 R >> endobj 11 0 obj << /Type /Font /Subtype /Type1 /Name /F3 /BaseFont /Helvetica-Bold /Encoding 9 0 R >> endobj xref 0 12 0000000000 65535 f 0000000021 00000 n 0000000163 00000 n 0000037621 00000 n 0000037704 00000 n 0000037827 00000 n 0000037860 00000 n 0000000212 00000 n 0000000292 00000 n 0000040555 00000 n 0000040812 00000 n 0000040909 00000 n trailer << /Size 12 /Info 1 0 R /Root 2 0 R >> startxref 41011 %%EOF timeSeries/vignettes/colorwheel.pdf0000755000176200001440000014243414263246021017244 0ustar liggesusers%PDF-1.6 % 7 0 obj <> endobj 13 0 obj <>/Filter/FlateDecode/ID[<295E44FDAE254B2AA171513D3A17C178>]/Index[7 8]/Info 6 0 R/Length 40/Prev 50176/Root 8 0 R/Size 15/Type/XRef/W[1 2 0]>>stream hbbd`b`bb`ab`< #801|y 1 endstream endobj startxref 0 %%EOF 14 0 obj <>stream hb```a``|2`30D0020p,Ya230Ҍ@| r endstream endobj 8 0 obj <> endobj 9 0 obj <>>>/Rotate 0/Type/Page>> endobj 10 0 obj <>stream q 180 0 0 199.9199982 0 0 cm /Im0 Do Q endstream endobj 11 0 obj <>stream HA /i14Bց}"<鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝鰝.0FȄ\a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;1CĹP # endstream endobj 12 0 obj <>stream Adobed     '$''''$25552;;;;;;;;;;   %%#(((((#,0000,7;;;7;;;;;;;;;;   %%#(((((#,0000,7;;;7;;;;;;;;;;A"r    a!16Aa"2QTqBU#$35CRSbert%&D '()*4789:EFGHIJVWXYZcdfghijsuvwxyz O9!AQ12Raq"#3B $%&'()*456789:CDEFGHIJSTUVWXYZbcdefghijrstuvwxyzᢣ !1Aa2q 3BQ"#$%&'()*456789:CDEFGHIJRSTUVWXYZbcdefghijrstuvwxyz "?dVEd寓y8|7D̊w<2C5Bi8ǁHv|xdayp1q!^mLxdayǁHv|!^mq)ǁHv|xdayp1q!^mLxdayǁHv|!^mq)ǁHv|xdayp1q!^mLxdayǁHv|!^mq)ǁHv|xdayp1q!^mLxdayǁHv|!^mq)ǁHv|xdayp1q!^mLxdayǁHv|!^mq)ǁHv|xdayp1q!^mLxdayǁHv|!^mq)ǁHv|xdayp1q!^mLxdayǁHv|!^mq)ǁHv|xdayp1q!^mLxdayǁHv|!^mq)ǁHv|xdayp1q!^mLxdayǁHv|!^mq)ǁHv|xdayp1q!^mLxdayǁHv|!^mq)ǁHv|xdayp1q!^mLxdayǁHv|!^mq)ǁHv|xdayp1q#/'&lkTI"=xNv(Uzg7fh~5Bi/m:''%Xgl5*q>q[M(*i)bX*d*$DsqM+PҎ =)t7'Sw&w+Ͳ,lt'=Flkb ]wzQWxg'["%i\q|\gT+PҕVT[cZTNeMSH]/&Cy?u7rgx!)آeKѬb#Z]%_ekcVz+4*tJ\j~qg=s7@e@0Zд(GJa1s']Odo3(YpZSC^ք٭GEabE&8r//BseVNѕ<8qdlQ r5UUpD6 {Ϥ[V{QI3\M ]A:.r%Ŷ\'f̽LX\Įj=\UθPߒ;#xi><8V{( 5WG+U| lVgkڎETX4V]5[Ips"Cqɺ'S+*}O_z[ AJk)YShd e[I#U\W>c7K3tgp [E%=-k㥙ZӉPUGQtFحfj.t-/j& R4&o= ?HSNʪxb\Y,m{WȊyuaUeʰEtʙCv֧72Q`w_)O>_Z2j\%Nw*]Wxg*.--[F[:ةYLIOjΡl4Ƈ|r>ҖJIx-tĭzU7U2SK:7QW?:UNꚙjY^W*Um^Ҕa*~z@ewBc®SnuNJ\<ɱ >Q̉L)J:CaFډ#UkĊQc:lddNՏ rfTj/TqYsFmW-^w0F'>c =C:ӼkVGbYQSF֫co4r"p:g*8wbWթy Y""p89PI^=-3lI~h܋E:{6ޖ#HcUks\3 i-vꦣ_HZ&8o9g穃vOWkA)'mSy 3{CKΐ1H1Meu|yc壕Iʹ몥rY˟:5i,6ZFT9抈F"Nge\PQS31ГFMB'^GLl*'<Ĝ+7hK^jH"bڸfruQ %Ubڪj).G5ΊOZck܈hETO [݅%vNC3Or^~f/:˩{]+R5DcQDщ͚2ӕVc:hH>S*ܥX*#2Wf΅P2ژ#XOfص)*GOବn94hN4+ό3 zV՞Vɪޘ1j'b|1V ~1ŲE4baZ%C:ػ3@ֺ[Sj-j==>Rkի e|94sGHv{Zf+ʉO޶dt=*i^5zj$LxOҝ|znlʍ爓;F.tX4Um89L5zeN $sFbr=j9L訹I˚DcyŰ֧xG:-HpEsDt6ev|t.WIaqMϯe/P`{6\ =Ѱz?xo=h{6%M-7h{6%M- Ujq̐9UQ=k: tEFrb[1C@ wpڼ:^*B̪J+FȎl3EΊU*GS7z` > zޘᦳJ׵x ΎLSc uJFT5ّp\~f<Ǭ(hqJxS<iuTܧKUήjT_1MSL +,AYFG_,GV&H`>~zm%KI4A3\s;S =DUPGSJ{QSsW9QÜ_͇@؍G4-vЯr&u$g ۃ,R BȗD#Aiv$=ho)EGLEO|ɛJW.wJx0`FgϺJ_ 5;\3CRԷK#^,.**y@ɖtbjh9ԔF͡lHH5k[Ns7|)g9ڪ3~|F$yAh4%dʧ%TDxSlN%Tʝ'4cX#w!S7)+ԬT]ruS7(2i=>=C3۞h{;ٲȂbb9x/_p7^gղ)=S{t>meZqZ%@d^˥UW(, v6{bX"Ȫ+"EN7C4=0tosU9QUn͞8$r6fp/])@?T{E?sw8ES2Z,V,mVM.9׬n\C|{Üh{/ox2,H23)Y SQ|8292^҂&VFI`Ue&PYTԬag* 9ׄ૕O ɘ|1>ZG15W7YJqx`mz:W##HәZ"׮XY/zvoVɇk4ҹƇ_GY^Ț7ޕN` <3U}X`f{e09/[7lsMo/j}Jrb5Bi8}Yoy-}a[iChυ`+ mk4./̽ dؔ,5rΠ_~_rܜ2rqTÈg=s7B]cr9!*zYʶjhDDO-}&SżzXic苂sQ]J#%d2r9zE=7ǂTG8mM:f0ںJFfUǦ }`Xx6,s&L& eGf[1F@9"hʋګ5;8-by*<]VKX\Hx.N=LKW+2 c'=ԵB, ɱٔ̃9L^:긪$r#([YBTj.dxpSKQG3t2ps"{'R6zd^TogCd;&oѥ~'iS9==W1C$\<8%%m*Jv/]xnPZev,5UNHݛœ͋ɂg_Ѣb"';vfId퐨*(#Ӛ?v T-ƓzQܾF1kFάE]7**90Ǖ:~=RIJMB&rtT΀M^T6|T62Jd`d"gÌ2(hFY g9+TῃЅlU]7&ɊySKu+N{▣)dUoha7Yt1Ry<~Z.EWSB⦍N5D;t4v|)OC #PZVu5C-X'j5VSݲ6&O|2 R+\ƊE=̽%AOeCg"b9Uˆ+&+2nђ'VG+åVUȬ~LQFpڍTG˧ s*/Xjku=dL'ic,zIN/m,2S$ұX˃Q ]TJ84kSxẬ'ļ`+8e+ 0W"bqPS&l?t>g'L2h0yODr+WB J>rQs kh{ &켜Xl9ܯΉi:cY?.Cpӕ7 _V*O t'1ju Y-9̑a{`?,T17-)3pЈ`6666& kQ^{6ЕH$NsDOhtbվMI+=DTK ^RWb| =̍,X9-dd6[-g7oW8᧶u2K=Mo)׹ߦ;Gt[*-̎2vo|X10 <MYy9ٌs;ܯ43;:6Җפ_ET{3zHdUΊNUv.V#^]-S dXj=L"**ryYK9cO#GΆru#抢90j;?o6ԽR72ȣrS4#S?lc*pp~V"Rj;D3'ի)]fd0p1z̛dcQu<ȘZ*JֵF1j""&dDN#SKMY D,z#H[>KVN6&͡ʆ౓\aed[z<QOH.N =z5mK_+eG9˂`͎~2-$yTɜDrWbW=/!jȑSR#b%UȩƘCjY }j+Uj\thfYx䟶e)h(i8h)Q[ F1xKr{g7fi}2ٿ{e߻PoNL]ƨQm7ԧs|_Lo|1-_9 -j}Jpg7fi}2ٿ{e߻PoNL]ƨQm7ԧ,˜s'W,oY qW-Kmo!JS[>xꜘu|iԵW=kʢ.3FK%Z^PDŽw h;䞠:ٝK^#Lv=ƽSU<ɢr/'4HPRpR|ʄ^,d$3f=dŋN3aج_ICIo'NPNjw>| l߽4c9/[7ls@;q[M)ɋ -EJB&w>ʐ\x{\UH5b&g+7QG˞\TirU\5Zk91&. 1QUEE),ӧl949 {r=2V#NSrkYQW1-nI^V㺱3,}2ٿ{ehs|_Lo|wT(Sq[M)⨓qx:ƪ$RJ^k*u-̇)Wľ;RK أ^ټs3Ic2+-XR_TO)Hg>C{bm6x;o/F3e~4wERPoNԴZ޺{gh/K׫$fȨSPE]=PUF*"iÚ1L`{77yޜ{`X*Suɰ)g7fi}2ٿ{e߻PoNL]ƨQm7ԧi t>@jޕ*.XE!V4z G;Zuٔ2͢6oU91kRw9Q.7pێ}[NF=jpVċܧͅ4}L;VsӚRH2@9UԴϬ[\m:N=Li2jc]Bk'y WK.9OJ,fuAYtQV]-rfsWN9ZUEE垝3בthnw]|7bÐAE*gvl F,F'*vf"ץC iTխW RrhPOIoջk:?SVuI҉o MeRqst]NE+xv|&%`֎DLէs1t{Gu(rWE%rI3g7fi}2ٿ{e߻PoNL]ƨQm7ԧ{1M"Jҿr̉Tiag6r5W2UYZq+- wK=blkr҆%u5Jt'm 3uyg3W<@+nrܛϷ4ڗSʺJʖbт޴!T9%N?Z()'Td\|Iv!#CȨj[kEEЩ>ԩrpk5W!\1z)IlJ @d>i dž)Pc EIq`yRK<<Ig1ʋwE$P1Oq!Nz9%GyQhAFҧ 3=O5gGePGH9‘vw9{jvg[{l;ȝ>_ ;3C'~6}Sbr#z C-ْD\Z'*)XT]BcPՇS"r93r8s6%Z5o+]̏C{qsI8KԷ9MҨ̄WSo!g[Ll&5x1ww UU:UDLW2'ȯX0s+BvZԵ]R$̪]a]b,Ȗ$lk \R49_+^5>U:TI, ~بTlc.)$( :uOӍErJ+BS8Ӷy jieIa\4YJj*aIəE66Tb"ZT["%]=@g7fi}2ٿ{e߻PoNL]ƨQm7ԧiYNEEU $PhχWfc}'4THer\UTV[P\dCDJV;[=9<:TI2M :xZ*U: IYəE=:̮uJID\kڸȊȥ$e;smpΈJfvO<)4j4ΊscL੦IO,cVS5)0FЪEsDUt"!湊r`pyj FIs ջ tHZODmʷKwd6<\((8(>_s'!eb[Kb11r5N1$,F'֞ҧ,± lTKKVrթ~,H &qmAS8bt*/LUJ=.rV/+XLH,Y|S+b-Y&=[IYCCL{ՙYLJ*I2)Y4m5ŮLQOŰ*צz=;F$$ b%ڥeKR'Fn:3g7fi}2ٿ{e߻PoNL]ƨQm7ԧJkYFwQ],Soi3!ӗĠBY껑՞hKk52ӽqt+WA4{Ѝ1&,_Gv$,ͬK~}Sw$pNԚjGj;7=`Yks*m]1ž6u7s=9W(=uΧnQ\EƊIvKgībNVMFޕxm&e:y=_OjYBL#s=SL|vmoKflu)b9VD֢bl=NY 癘S\tn'42KYY%iV4/)An:̴̞ɏkEG"*hTČ*9/]<E"Iɒ_`p[`d[#g7fi}2ٿ{e߻PoNL]ƨQm7ԧpHicBWU^5Ĵbm;"ɖ$M5'}z4oO &QfTP]∽t>O^g}͍-srK}KS;"4Wc|'HeGt}CHII/.J6rG2Jܳ_2hCմ{Rj G3ErrC,*ɬKIqU#sٱ{.TSOe5,rÔ{UQtL[yU4ۤ*g#♈98syUˍdʾwxbodhiѱ繻&OS#+z\lr+&J{>>^jS]4;&ܥKzg6",s|_Lo|1-_9 -j}Jp:YzTo 6yè TI]*ڪJzn5W| z'&4J̱Ԏsf^ي<37W=lU%^)[CVٖ<*w7S;xp=5xڨ!ޝ@xYæ"4f/4UЭ=\/z\N&z<a&c9S{<ЉM^ okRJHj`N" ȭrb*.BjUfLpWg9t5t c6G{=cΪ$ԲJBu]-=HgSK%fg'Lnۋ+j;_8~@ڙ\լJ”/RfĝoWRGiXݛN5¢B`$U3Rxc diِZg^9yr1\"USuIҪ5\"iU̇")5VFQ"q3t6[i9Zs8xj?\擣XBN| kԫUqŝڜeUH[;= -VUd:N\X)4ⳮ{>q~ {+v։qmKב9<rN9c^E.XVƨQVtPe ]EfB@CFeѥe9kZq+ǻJHUi^,hiI鞏j P%,:Vԇl:+,1xog9}2ٿ{ehs|_Lo|wT(Sq[M)uIgBH4cy8NܷiZ~yM+ʽd3Fӫ*^D897 gM"՝[.*Y"MQ=KJ+JU0bW*ڐɼ̚|4%,*F˧Y$͘Ӷ@Qʖ6U[݄[´ z =3$nLQ\PemXӤ;"^/)YV-J4{jףI΅j3XG9JEljfrpM ᫦e];~&e/enm[TCqW}Jy] )!**,j0(rnܙҳTQYP#˝zƥ0 iXD;b6J7]y@V9/N̕Qi=^>ۗ:ŧ gM_>t+SK޹U=<&}mMhZ犧q92&68"5LȈ3j"v<5-?Ds R*.()⬤Z:♊ǵzqrbzg͓V6~Gi}vUM ݖ6zb"U;gt/zĥyZ>E#OV3rXbr5âbNZ]T::jw%\rh*TTS2Kg-TDSdސؓJ)bGJģX L.to>0L6['mjxuTQ՛K+ J1/"Vm[R.f;4lr:ʊQP"uZ֔[~f&hoerؖ^X6vJI,/v@uYEPBz/R=0}kj̩T#8]OfC[Nژ3/)?k:ͫF}Q*dN$8EEDT΋%$vO%6v-K,1{ vP}2ٿ{ehs|_Lo|wT(Sq[M)zvD*`ˡpr[FZx݌ʬn[65'%<*Ҫ}]KOzȜHNMcZ=cj"\X$91 ʜ43]:wp毠y|YS;E.]DkVM%<@}7j)&jNlTVɂ਺Kjجx0d}gvNGfcHv_5Tw K42fQO-QQfZJi}􍈮sD}駪"/̲"o4~S;ĞLJjG͓f_gNnD:5-B(_\g _jgRmF&D:#Ǘ(>ͱ_Z$F'SeEcYPļ%bpz|*TPT#a]fe}yӔ 9ֳ:(k]Šv#Lt=fo:wKfگtbKGiBjY)S/q;ѹXV3*.e,VΧOV&zi%ˬ-#ą3^Qp챬Ng9TJުV5g7O.e!E jn(TEv-5| g悒p] 䝊+ 8y:<4qFےCU["O챞eXLY i^5B88ӂ֦|#SL4"&#C6frڹmQ^ȕwXH'2Xek)5Evܺ9SM]41Bl5Sۦ*fkȮЇvJxiڌ#ЈAs&;fΒ3:nv9QɋWs @ S͢( M,EVEzI,Y%r1L\*5U3#SԽِwVwǩ{+ {`<,6Vc n=lSI#$F1Dj']UO[ԽِwVw=z̃yਧg48Lr=1b@گzZ\"'}^ 6jpb/kԽِwVwVѠl, McF&E:qC%j[֋pܒ+WLPNg^SxjVJ֮ əT5WQjb8WԽِwVw=l+,yiy[<cUDTW5Īd.RœQKSKS ՂyS )";Tk`u<ձ#]vNފQQȨzT7uQp]?%,b#JfUVUOfLyl持X#j9tာʪWV)|VRڵI3͡xΣ~VDg$S:WUN q#>KN`b΋#ђ,Y303-*ҝքk\la۴ٳk<Yu5 H:5[U͊c궏%;,| NhQWџAyDr5X`֢6$}44+j)bcd'%Bc52-UZIiRJGF/ g·'rvUU#d,…UcxKk\/YF`ZZ5nMMSJeP5{|'4r5ʞI㓙d=E+|l=ç\q;RV$VHhT8Ied@I4WjŪ_Ҫ*r-ئJNgmTpV)QT}V%*vV^ZT̩L{A׾xez>WNs+xW*?Ky5WǛ,{^ bGTW:5Uju<& q\3=E\/evd՝lU0v㕊ǵs JT9W3s_oS9se͒ծW-2sZJu\n(&SٓSiY٭ 9ڝ}y;&Т*beb+{׵ET\Q@:=K]ug|[GTiZFSVkEI^;;<WQU9YMBZVa57vѹYBR{-"Q:Ȉ|l%Ls|_Lo|1-_9 -j}Jp&M ƫ\P4|ZG1};T&gyJg3Jyd7i= 0= jjx}$U4nTEW5}:Xr=Q8MLOiVt(iIdwՉ1F4"fCnV](s/Y!s18Ytgw˚V5fRUpL R¢eSS*`zwLy귄YRmB9[x^ :x*}=Lm)U:ʇIЮNxM:iNQ ,.#[\ǜCS E"p^&-T^%9 ߉ͧTriOvΉ`W1(|r5Z:*.eE>Fu 3&{9 )R*h6_r*ŢaN=4!ﵝϲ(6%!LQY6lnS95tc@%J{kQs*)W&Mm:ЮNxM{6mGAO;^'66QWF+{#"t*.eC9] 牴ͣ\6Vֹ̳}fn8hQ:.e>@)r['UVΧUUWt+&w6PP6euM:ȈXڍ {`|i̤]McXFK:r5{Rk{2 bϚ|#zW'TǦv9Q@=~rsn١,5},Tz"9cj5U> ŧ=]4}г*Sڰ$NG&srߓ=#$};W9UUU\B9m7sieY:Z H\ڍUM8f=2Lt{ܮsUU\t+\6([&ΕfEo]Q{GeuXƧK;pr~!bzvm*))T1zM T+:-R^aW=h/34uܯ|\UUA ܱ{Z^%CEږ-5MὋ<1RR11 Z=$zuYG%UD,v ʼI="pdj91Es)P,Vef>jB-\MWUӲJ$71[!{j5J*+#U-{Ӫ\}&%e4)vM::hLQvѾ[F^P)땳<9/[7lsMo/j}Jrb5Bi8}dcdczb׵ZE̦Wlϲi*;׮Ίj *?R|Ysx8=6u]8aY*3r`*.a+|.8. xigtVKXׂ󗴢cA,QwwÔ}ZY-W#jiUPa+K)m+Qzc :/n@zHJhNTN6c=6´-p)^f#F>Q+*xF>w5TFs2_&[e++V̚R4^.\dJE=%sj&2Ek8MMIF蘭7V2Dz6ͩ gM_6~ff19U@9nZp:1N EErE؈ֵ2!ɛ.j 7Wt犧qԳv@[&KJQ=$|6UrfS9gGZ=qdѯU/iN3Uٷh7mg:Thd SiX6q0#s;WWjKeQcUobqvT4+{ar2EcTʙV;,jYsz$vw9} I47:3Vo.CW7b I $bS6Ei4iN ѶD$E=2zǕqZvS ~B[Xd-M= om/8E`Ygm3}yqKUZ8G۶V(% y7Hj* T}b;:SB8b811NQVKӎNS1cQЍL9""ZtӢB*:=JNXĩ!*}6L.QY+K-WO,Ԛ=5}{ޕ|'iik.Ά,#Kz{* {Rj G;N*.s ɬ;I٪ؽ*vO)'zIak= R6閙zi@ xi*b=N4\6ԣu%WT航ֵWt"X3e~4ьl߽ƨQm7ԧ&.T(SLUpDҫZ9_`ʬ%<$>_+1V'>e8]Ifjb*8+=MS:^ ΠURf ;ɵZoB霨܏O!p PF͡-sVlU%iZ/)8**ZDei {2 ^ϚϨeng&3ʊ{ddŧ=U4uг*:Svܢ̭*(Xt8C]aƭ\P1푍6e퍊5EW*DDΪ}ܦО rZޞ3W+ cRl7OfxEܺ9 SOO,@dQ1ƦDL Q&(>@͒ W |sC]H=)^P's:\RʚY+3{KOLYF:\DY+39;\h[v65%tsplQU$'*dՕ5+ׇhW?ƜLǧ RPmd=ccSxip^&B=^1"yl\^"FkVUEa}J:SYT8TYײR=-.mK:馢8׬EwtcbF6G,\<UUW^5Χth% KEjseĶ%FG)<9_bJ,ڨV&z)-t۴3|T(i/#\F2Fr9V4*. v쬴U+$uXr.3%ȴ]3USY`z&moPZp%;JDƼd3YWM;I\UT 7ZVU]0+ȎVlҬPcUk0SDFD7vMfT(,\llrj2"Oqv'ZI'>RTضaXnAhӢt;4tLFϨeU\QS^Le<?GWz>%&X)4%[1V`:@#ִk)+ˆNU\+%gH-]i$r.TIMI옫IjrGi}vUM P5W2&uRC(rWQYnI:i^7}V7`zn'H TgV1oWv&j1򪪪U|tIr>'X(\ܩJm ٴ2]E)|.)SBaFtNRUN˅ʙw%m寋jDM\DU"5E*NǨaZ9g7fi}2ٿ{e߻PoNLƨQm7Ԧʛ}1QjfŰ7ȇeF˂"bȆEíZYq5XN$kx}&HLu;D9f JX4rG\.uU]*};.0{m\uIE^/"6Ձf-h->:s+ צ=0[ilQ(v\t#*t2TNXմ4RduUMUO#f|\[*u PgSY)s1[WʋdQ,2hYHUc=*r*ygyfPޢ,MsJ\_ѝI9(-砳\(QzˢYm'=$^iS*R_Aʊ 6kWSL"^gNSgWtPһG7t^TS&i>;6tmKJ*/)6RڳPҲ8v{+zʽT-UMIOG#]¨{uLcƍENigtHܗ>- gEC’E#ʪIezZ)H);:FLK*Z$:}Vj=sUʺUWIZKS-Du0/u[G\Z$j*Yx2·!ׅ5̩cO)vqh_BɑU(ԸJexW@g7fi}2ٿ{e߻PoNL]ƨQm7ԧYZ+gX3 :612b**4\>UO!B 3'Cs$R[2Ǻ7\EE*gCfkҲSL7IZRcKN(IڋYN];rIkXz/ikGl"]\.tG' %Jy*j&+Јqc³mb={*2rk>͢b1ҫʧ&)毚|jZ3zWiRϷ,:J7/LςT꣕΀dݭ%DV'\|hnӓ:rjc+N,Eiqɻm]<#Ts^3EUz Br7WJg>r1U_'uM\βHy*iS"iH) {/TpVy[:$Oԭ-M&8"ȌwiَqɣzikھB.E|U EZFƻضS@g7fi}2ٿ{e߻PoNL]ƨQm7ԧ ޮgi% bډOogv9]]T=R\+6cl[EGW==9Uk1ÄLƦcZ^JuW&~BڵbN0;3O]Zq[NDPU}?@-ֱ"5DDDЈ<TyڏVΊ*4M}DڝTHz\XkU\UUt"!WOh5DOg[,3M\er; ݊1zp\EVxilY2jk3[MWY5hfU6kQP^cT_1>^IG.I"`ىڝw'}Ofͅj- xS?f'Q'TJbN-I7j&1:O8 0>K--_9g7fh~5Bi91wER!o2Uu_5̮VӰ"bc$Icyۀj= ڷ$Swt & Q;;MS͢HأL^#ZuU ɢmf715ҫeлQ$V)IhGCZޕh^FsJ~Mc$cz+\ΊPTʈVΊi#dtr' Ekt*.r{+N\UOf=q{m](޲$+] U;nP,{V ;Z%C:ʫ*i[NB\NttYmu(Mܫ5nbzH:V-SlT#XZ&^5*F\EclZ[J*fo9qq7h3!ᤤ^SU jjZͲݗVV ( l߽4c9/[7ls@;q[M)ɋ -OeVJCnG[zWhGS1QRps\)k'r[0oƜXq)-48 V(`(mtCL\$pr`2r:,TΛ$>27dmWs#ZAObd^ƒ 8/\\m5YtU܂oz86m[kT5{JV]W O'rvqftfY46E:SƑ;Kܽu^3:"%$%kP'{EiWt3Wԯ8^9Us3]e76jO8m*b:g%* բWZnI^8v;ͣM۬ϴk:>)QQSΊxiiKUeDvtT>kXc2 <Y9,WCxj髠Zj4NTUcW4uRMUUn :u Uҥ2!dZ5WQ' rfSa6tuN4KG+s=SLvm-lY펩<,U/";BS}Ki@lGt/jOd2E385(bk+]g+O ӵ9Pk.*E_fGһSC=8k|d͍nZJ5w=*jGPקdEj)rR܉}qNPO[y"JuSXׯ9t9m:?xJܕs‘]D>$(.nʡ.5qTkQUW2"gR!DN6Ęaٖj"B?n?fH:݊ݩZ]0-KX!SVt=iMM-bGSjPw@dmjڐUVwfEbĀs3e~4ьl߽ƨQm7ԧ&.T(Sm5ұ_?L>ZR1(+I#n̑Uij%p==ݔO9_FzU4;FhյD|[!TZeT#o+XZ6ueى4q/"b%qSƫ=%q+0|*&+Vs9TH)b|4%,{5^Dʺ_+|r\dߞW"/DzSuSIIe#R$u buqzhv@}%8ctҹ5\.dDLpr2zҭЙ$*Q7I&Ỷ=kFԢ(bzTE·89/_Q´ur%ܩLw짤Hrj'e^P]Ke3L{h<s|_Lo|1-_9 -j}Jp=ZJ̉g18޸*J6«NMIyL%u 6p 񲒡WI;zѱ|bsߕK"BoQ<3"ڪ!m`cqm*ңTeRo|A-_XmyMRvOz/%3VSUVēJ٣v1Qw|;sU2FSL eifCUS 2t8cl15ڍkS2"&dC¢9 MYJ9m>pWg9t5dBe btQ䚖TY] /'RrM*s:Ĺ3Py[cY^m*{..|uЇ9lFy^ӋݒvYx*;!oUMC25JF5 +)bZN;EeM]3MP/D8JwbUyuֻCJYM~KVԁ Ex TmLק^ {3)lWL}'H/OdlV>iSȵMΛ[<$Pd8s|_Lo|1-_9 -j}Jp>4gR3*/ =ϡ3Ԧ(%pωKv=Bҝjkt;ЇDD`e6:Ogr*hS>jb|u ZMNs&O QXU(F+oMeF`PКֱƦ j""&DЇȕ*=^ 3*/!>ZzF6jja q/yUklƥ+Umd>Բ}Idd1>iFsNdLTVZR=$f@8:ѣm{lő9,bE{ zvEdSMcѩ[^!mku 草=H[jڵvS݊PZd0Ō%7VJwIy[ݑ{Jz>%=gʜ.fq)k^cTPӹUqt}JħUʱu,TiBš{N4 <TsWM {-(M>畉B4$3*yS:v WaԤ**sXCe3ŽhC O Ԣ*nef^ҥee+QȘ],ЬJ. JNOw`s|_Lo|1-_9 -j}JpYd%H*ꚸidz{k 掚 *%^ "c^$jbmڒ6ׯ=1󭵹:̝z:skN7>^i\|DN#wPm5#G$brr9LʊO26\&$TJ0dwiNmۆG;'Td˙|e6TTT4)&U}+k.>@\2TyKY5SdJ6߲[lϥEs5RZySLr;>9y;jIjY,up=U1S %fg*r.:hT3W.vjMNU\3&,2[jO IRG*?eĝz5K_Q<SSFK,pDTkst"&u>_MF2`L4S@ZǕZx^6I-h:eUHYčOUW,jڕ8фar1W&בD`fYZj^ ƚ֩X3:91Cz~gUUOeh Z ܒYuO d%4c\");#-e+R'S¯vd2+J`who/F3e~4wERPoN׋hO."NKթWU"dOSO8+HC 䪦c|:iǧq{R{UfV2״\ m Mjaʆْږ%S>g'3_86jVK*W5=>!՗6xtWɟP[ fDDDq\96]dE5ρϭ7><9Ux(̡ɧDE5! W5snTUYıE#akis6gv8h'ʙPQ:&㨞DL4bq^^SQh$(9[ jfGt@K=4v2ҲdN=\3[Jך&c+ifFꊩq@:*, ,+*̖H̕kQgr&keUSj)5%trg@ KɗENhz&QUQS≘YulwIXr=&)=LpDLW>T-mʋ#2giRRM?{U1^=tʫ:ҧRj_ORNujҔV~X4I4j̺Qzʚʲ3{N3zzDoSʜNMŒ™*W&W#;3@q:@y \Sʦ+=:feN֕,雁J%s|_Lo|1-_9 -j}Jp9ʹA.fKbVTIJ.^Yc^T\*!\M=IL|pAy $7cy ] P /qwXc*jDpg4᎜hS 5+bxȪ`#tJfc])Em➘a?wG{{zbO])Em➘{{zawG(Em➘t])?wG{{zbO])mMeZ0M3eV"ձ6ˈ+ eE=_,oLdH♕1u/Em➘vYlY|,U_";J{{zawG(Em➘-Zڧ˵اv!D^k&w.bIZ=Nj.kc)Y "r9;6(zv}^eW6&}P{x뜹PTFeڼkVH:w7F.VP[k)݉cN 8MnEbJ7 5,".|t.sQUSII=hX0V`JN%|:w V*`> fJ btC1"a9~3է_SIg(掞%RlW le-ye'`` U)>s)>`'m1s矶R|>tr*,R**`@kWsD:ɜ:W^qQRK_Y )瑬nhi#$D'S/|k*|OWve3dHbi]*dN52SP{'*{ŵ ty /u=IM8I*xě\W9suS DM5ZJ;}]z9նun'A=$IIcęixMQoiGYO<=/(T掊d=[p%`\0 FAz9Q"WBYWel7qK"x˜ďrIH{WsUQQ{hb|ࡇorv\[ks"Nooڐ)j`eM,))ыJUjM=D:Vt|r33{W{jb\j"tj}|<[=}<+1.͊鞞䩘>{#jkSÜVPe1]IbLQ.Ο%N>ؚsmAjDVZtl|ҺvBH间Tj(YgӾuMz6*AUʳHdrz9PTu8m"mUyE {xKTW-rWzôw>̇BTt.5ds`u(&]HקUj bV% cř%R] vtC;XZvCZdD>+N:ֶNJвmj'~8uqgzʇq#ԕƲ0ڏcEEL:\,RB6S:5i6ױ=WTne򎼥ɛA]B>RG;\u 8LR-eId39e٫VD̾|/8Mz%lkū<--\"P)@3e~4ьl߽ƨQm7ԧ&.T(S/ '̴сV*p<2xPNֲ魊 h*Hq99P'd[ ]F~ڱ:շ;W?½NC+)`|*􉨭QgSOr1ʳ"R]OuRޕLƺA RAGO-3QDkEXW-]lltTkZUЈLfOVֵi,j'V;&dwSmz+bj2bw{Y]R[֋) Ul ^וN JM'HiDrGWz̞N T氮zoYN >9TT m5Ke#Hn-T !ErP?:"gǮdwixSNt%G]5ES᫇ 퉬Y覎&V.eV2mDEjfffDCeZT6216CFlҶ-Z{J\[o*{ykYLtT&gIʍМōb9X-ULpSI$F.dDM*}L%sţv LƼLIʹ(ʼV{ݑʼ֑TNVQ1pUL"uhNӧQQOjδ쪦ѽXtNOMI30Ij]c!=֨Y∸H'7]5ࢫ:wpoVw4fP-l)}ÅzMNT[E>ԕ)qw%z7#cjEL}KɥlP3zt'OD'bt],;.e%R8Twgʍjb"&uP=QQӧ I\NNAC =LLDǮk<ɿQpsc}kjv׌;xt D*VMEJNǻw99/[7lsMo/j}Jrf5Bi0'riL[C#rzѰ*V tzr/_e-|Dצ(v J]ml#7L =RbyUSuMf=cN75x+](qڴU5 `Ѵ4êpcO.\7iOۑ'z`3FT<8VY)$k$ Xiɛ޺՗eQlb26&u^7* Tb`ֵ}ɱlJ F-g@&:'A\ckh5 t4x,:8=i}ɭ=j)U"*Ի22R˄u8M`CM I]Fp((*k~xiWv:7S'i{g|πFR--(,;Ȑt kսyṗgPSٔPR Fu^U]'= reeZ4s5<Y'J'stu-o"Uk2""y$9ɤůyJ,Gh[ݰ,yQeo]ŕZ>ѧb̥jk\1UEjTO"}I{CZ +"-jG':BUީs"NjdRYׇ9aFI5LUTlmSl|Scb fpT~w{:gjbl-̬ѻ oH o/F3e~4wERPoN>EVL"9<8yu6x5*sv6ŭ;U"FG i,""*<GAC 49buXj[qVj5DЈ!dT4{L&i4ϕsyUq6}ɥ)eS;C wOݓP%KWgQlS(SP*N∩Ƙ'U9tl_))|*&+5G5QQstSX4nDŏjEL٥kfj+,|u^5jLZ}#)mYVRЧЮ0gYHL{V5gEB+Ո$\\;ܽPxJeV|R%lITL|{kJбQWh|jj*)q^b֯m/dWd|\p%v^-Ueթ]4r򹩏͑9=*h{D[u;&,(IM`㏫\?{^OB4TE>YLL0YTZzGMAEF ,žE=hZ򓓺owx@}2ٿ{ehs|_Lo|wT(Sq[M)ҶbYȓ:T*a$sT^0JVE#gUHVޗ}DtXTCtjk*tLQgkgLqBD C=O!SX8OfOWMg,ze:בɘJȴ,k̒7jc3zt)#Hy]4v<{#jF36 ʵR'8IZ ΩrQѱIJ\B`el#HT2.Pqo1bu#lb ӬT爑.Lf3KϝN5ʋ.% m/Ⱥ|rYh}DFGUrDDLUO\"9S:*kFJ:sHeLU1Lqìb>NOC-].UVQ%Eύˁî)ȘDkֵ3""fD>?qVsJҏ/i|tDJq8sKBBWx>jǓ~)+W6["Z]  E8rN1wAo8 3e~4ьl߽ƨQm7ԧ&.T(S˯ZKaL#b* N>UXnY5=_ _sN/3,hw>79Z*](PO7eeUc|d"驦ez1N5Si[. mw/uq(BtIX%ճ#;H291-3;+7Tajr!Kk[oU[=,,űei,W9qUUZ="\:#bs-Ki:`ip;nuil y;KyT"rMm W.dDT.U,9db͋ o/ YdWM3{rUUҧ[*[Vij JB\S-N5Ne>Ax^ftibuc}db[\ZVډhUϠxUr-z<6+qsˊKE[}Lș>y)&4VKriEC_ɫv+zeJ`ٙNγF8w2["؍)U"82%0NaBf[N`OvNG`DJV5b:%(h=kڪjTT҇Ҳ$#kQ#D雡a3楕T1r`sEY5'}7 lɧZ)]V(v('k}rg$*mw4\q\ΓOO ,,bGmF̈qU8,1A:pwd}>舉fD|q"@}2ٿ{ehs|_Lo|wT(Sq[M)&r!e]QO%RW:G/'kdcV$4X>6cQ0\v!J+.&Ojɛ UZ8᚜y-vG'v[-WAY85Ta=)w=ͦÉ@ElF.J :2X"E>W'kd8KvI Y|$UVM(1LQ]|+O|ET\S2|l1hj$tR.쪕}U"G9͠9&I1 [9=fqj$"wӑNe(5(eFakd=g+o=™QhcrFQȨYefצ };[),#}3QY?2B\<\3|~b}C[ իFv &+$r+!ӣkQ1O 'Q)K:jGN7G'4Զ [Qi*fLzmkX"5B&d>Ok>\DkZFD̈||8s|_Lo|1-_9 -j}J`V֦giO48-:IxN.^KRM$F>@TVLS34+;Bu(8P%-f|Ữ3`J(UODЌ^o]/G|U *Ǯu6s|_Loټ1-_9 -j}JpWHDԮcyhZ̤}Jص4hcWGM2AuF{$` V0T\T|>l|lq.{DÙM,6DNL&z^z6-YU5 i&sS$urIݓ`p>@g7fi}2ٿ{e߻PoNL]ƨQm7ԧ*˛ lUQ7 jWSB?7&ͦ۲)>Jpצ1Fϩ$oHEN''"dlЭ#̨> | ^@Xk_izѮ-COIlb:FL Mɳ))ƙ׍].^֕Em [5U긱ps|_Lo|1-_9q[M) -.R.PS`#MtֹX*MufV5.c{W2W']T-K"اZzFWh{WgZT*4S4NP*k;woTd>,/XczikZY;| TH@J"|VEuT1zF']T.[5fwfPTMCDӇTU:eMe&U,XYdNd'24ʝ3d:9\m`|0o/F3e~45Bi16GԔu+y {ZʺJ{nP{n'Qu'Q{nP{n'Qu'Q{nP{n'Qu'Q{nP{n'Qu'Q{nP{n'Qu'Q{nP{n'Qu'Q{nP{n'Qu'Q{nP{n'Qu'Q{nP{n'Qu'Q{nP{n'Qu'Q{nP{n'Q{5Uh[Oܮjp']5UcMuz'i{|F7slGC*Mbdԗ_OLEOյ_ycS):'i{|F7sĘ/ 9=]NZOkv ߣh,p(==N{n'Q9Tro:O(wFD=7to|`>OxM4ѽ9}4ѽ>OxM>OxM4ѽ9}4ѽ>OxM>OxM4ѽ9}4ѽ>OxM>OxM4ѽ9}4ѽ>OxM>OxM4ѽ9}4ѽ>OxM>OxM4ѽ9}4ѽ>OxM>OxM4ѽ9}4ѽ>OxM>OxM4ѽ9}4ѽ>OxM>OxM4ѽ9}4ѽ>OxM>OxM4ѽ9}4ѽ>OxM}2ٿ{eYtO(wF;յlF1T+%\(cp''2|''| >O| | | >>>O>O|>||i> endstream endobj 1 0 obj <>stream 2014-05-14T21:14:07+02:00 2014-05-14T21:13:01+02:00 2014-05-14T21:14:07+02:00 Adobe Acrobat 10.0 application/pdf uuid:9cb91169-7cbd-f84f-b1db-2ddbe477f4c4 uuid:ccc87a8c-c8d3-f143-b142-fbf798839731 Adobe Acrobat 10.0 Image Conversion Plug-in endstream endobj 2 0 obj <>stream h2U0Pw/+Q0L)T$w endstream endobj 3 0 obj <>stream h2S0Pw.JM,sI,Ip2204105412446060R70Pׄ/pLOJUpL.OJ,Q043Olb`PRMgnbzs~^YjQ1 9麙yvv7. endstream endobj 4 0 obj <>/Filter/FlateDecode/ID[<295E44FDAE254B2AA171513D3A17C178>]/Info 6 0 R/Length 37/Root 8 0 R/Size 7/Type/XRef/W[1 2 0]>>stream hbb```bܪ[ ķm , endstream endobj startxref 116 %%EOF timeSeries/vignettes/colorTableFig.pdf0000755000176200001440000004400114263246021017604 0ustar liggesusers%PDF-1.4 %ρ\r 1 0 obj << /CreationDate (D:20101228123754) /ModDate (D:20101228123754) /Title (R Graphics Output) /Producer (R 2.12.1) /Creator (R) >> endobj 2 0 obj << /Type /Catalog /Pages 3 0 R >> endobj 5 0 obj << /Type /Page /Parent 3 0 R /Contents 6 0 R /Resources 4 0 R >> endobj 6 0 obj << /Length 7 0 R >> stream 1 J 1 j q Q q BT 0.000 0.000 0.000 rg /F3 1 Tf 14.00 0.00 -0.00 14.00 160.63 397.45 Tm [(T) 80 (ab) 10 (le of Color Codes)] TJ ET Q q 59.04 73.44 342.72 299.52 re W n BT 0.000 0.000 0.000 rg /F2 1 Tf 8.00 0.00 -0.00 8.00 82.49 331.40 Tm (0) Tj ET 66.33 301.00 m 77.13 301.00 l 77.13 311.80 l 66.33 311.80 l h f BT /F2 1 Tf 8.00 0.00 -0.00 8.00 82.49 303.59 Tm (1) Tj ET 1.000 0.000 0.000 rg 66.33 273.27 m 77.13 273.27 l 77.13 284.07 l 66.33 284.07 l h f BT 0.000 0.000 0.000 rg /F2 1 Tf 8.00 0.00 -0.00 8.00 82.49 275.85 Tm (2) Tj ET 0.000 0.804 0.000 rg 66.33 245.53 m 77.13 245.53 l 77.13 256.33 l 66.33 256.33 l h f BT 0.000 0.000 0.000 rg /F2 1 Tf 8.00 0.00 -0.00 8.00 82.49 248.20 Tm (3) Tj ET 0.000 0.000 1.000 rg 66.33 217.80 m 77.13 217.80 l 77.13 228.60 l 66.33 228.60 l h f BT 0.000 0.000 0.000 rg /F2 1 Tf 8.00 0.00 -0.00 8.00 82.49 220.39 Tm (4) Tj ET 0.000 1.000 1.000 rg 66.33 190.07 m 77.13 190.07 l 77.13 200.87 l 66.33 200.87 l h f BT 0.000 0.000 0.000 rg /F2 1 Tf 8.00 0.00 -0.00 8.00 82.49 192.79 Tm (5) Tj ET 1.000 0.000 1.000 rg 66.33 162.33 m 77.13 162.33 l 77.13 173.13 l 66.33 173.13 l h f BT 0.000 0.000 0.000 rg /F2 1 Tf 8.00 0.00 -0.00 8.00 82.49 165.00 Tm (6) Tj ET 1.000 1.000 0.000 rg 66.33 134.60 m 77.13 134.60 l 77.13 145.40 l 66.33 145.40 l h f BT 0.000 0.000 0.000 rg /F2 1 Tf 8.00 0.00 -0.00 8.00 82.49 137.25 Tm (7) Tj ET 0.745 0.745 0.745 rg 66.33 106.87 m 77.13 106.87 l 77.13 117.67 l 66.33 117.67 l h f BT 0.000 0.000 0.000 rg /F2 1 Tf 8.00 0.00 -0.00 8.00 82.49 109.53 Tm (8) Tj ET 66.33 79.13 m 77.13 79.13 l 77.13 89.93 l 66.33 89.93 l h f BT /F2 1 Tf 8.00 0.00 -0.00 8.00 82.49 81.80 Tm (9) Tj ET 1.000 0.000 0.000 rg 95.18 328.73 m 105.98 328.73 l 105.98 339.53 l 95.18 339.53 l h f BT 0.000 0.000 0.000 rg /F2 1 Tf 8.00 0.00 -0.00 8.00 109.12 331.40 Tm (10) Tj ET 0.000 0.804 0.000 rg 95.18 301.00 m 105.98 301.00 l 105.98 311.80 l 95.18 311.80 l h f BT 0.000 0.000 0.000 rg /F2 1 Tf 8.00 0.00 -0.00 8.00 109.12 303.59 Tm (11) Tj ET 0.000 0.000 1.000 rg 95.18 273.27 m 105.98 273.27 l 105.98 284.07 l 95.18 284.07 l h f BT 0.000 0.000 0.000 rg /F2 1 Tf 8.00 0.00 -0.00 8.00 109.12 275.85 Tm (12) Tj ET 0.000 1.000 1.000 rg 95.18 245.53 m 105.98 245.53 l 105.98 256.33 l 95.18 256.33 l h f BT 0.000 0.000 0.000 rg /F2 1 Tf 8.00 0.00 -0.00 8.00 109.12 248.20 Tm (13) Tj ET 1.000 0.000 1.000 rg 95.18 217.80 m 105.98 217.80 l 105.98 228.60 l 95.18 228.60 l h f BT 0.000 0.000 0.000 rg /F2 1 Tf 8.00 0.00 -0.00 8.00 109.12 220.39 Tm (14) Tj ET 1.000 1.000 0.000 rg 95.18 190.07 m 105.98 190.07 l 105.98 200.87 l 95.18 200.87 l h f BT 0.000 0.000 0.000 rg /F2 1 Tf 8.00 0.00 -0.00 8.00 109.12 192.73 Tm (15) Tj ET 0.745 0.745 0.745 rg 95.18 162.33 m 105.98 162.33 l 105.98 173.13 l 95.18 173.13 l h f BT 0.000 0.000 0.000 rg /F2 1 Tf 8.00 0.00 -0.00 8.00 109.12 165.00 Tm (16) Tj ET 95.18 134.60 m 105.98 134.60 l 105.98 145.40 l 95.18 145.40 l h f BT /F2 1 Tf 8.00 0.00 -0.00 8.00 109.12 137.19 Tm (17) Tj ET 1.000 0.000 0.000 rg 95.18 106.87 m 105.98 106.87 l 105.98 117.67 l 95.18 117.67 l h f BT 0.000 0.000 0.000 rg /F2 1 Tf 8.00 0.00 -0.00 8.00 109.12 109.53 Tm (18) Tj ET 0.000 0.804 0.000 rg 95.18 79.13 m 105.98 79.13 l 105.98 89.93 l 95.18 89.93 l h f BT 0.000 0.000 0.000 rg /F2 1 Tf 8.00 0.00 -0.00 8.00 109.12 81.80 Tm (19) Tj ET 0.000 0.000 1.000 rg 124.03 328.73 m 134.83 328.73 l 134.83 339.53 l 124.03 339.53 l h f BT 0.000 0.000 0.000 rg /F2 1 Tf 8.00 0.00 -0.00 8.00 137.96 331.40 Tm (20) Tj ET 0.000 1.000 1.000 rg 124.03 301.00 m 134.83 301.00 l 134.83 311.80 l 124.03 311.80 l h f BT 0.000 0.000 0.000 rg /F2 1 Tf 8.00 0.00 -0.00 8.00 137.96 303.59 Tm (21) Tj ET 1.000 0.000 1.000 rg 124.03 273.27 m 134.83 273.27 l 134.83 284.07 l 124.03 284.07 l h f BT 0.000 0.000 0.000 rg /F2 1 Tf 8.00 0.00 -0.00 8.00 137.96 275.85 Tm (22) Tj ET 1.000 1.000 0.000 rg 124.03 245.53 m 134.83 245.53 l 134.83 256.33 l 124.03 256.33 l h f BT 0.000 0.000 0.000 rg /F2 1 Tf 8.00 0.00 -0.00 8.00 137.96 248.20 Tm (23) Tj ET 0.745 0.745 0.745 rg 124.03 217.80 m 134.83 217.80 l 134.83 228.60 l 124.03 228.60 l h f BT 0.000 0.000 0.000 rg /F2 1 Tf 8.00 0.00 -0.00 8.00 137.96 220.39 Tm (24) Tj ET 124.03 190.07 m 134.83 190.07 l 134.83 200.87 l 124.03 200.87 l h f BT /F2 1 Tf 8.00 0.00 -0.00 8.00 137.96 192.73 Tm (25) Tj ET 1.000 0.000 0.000 rg 124.03 162.33 m 134.83 162.33 l 134.83 173.13 l 124.03 173.13 l h f BT 0.000 0.000 0.000 rg /F2 1 Tf 8.00 0.00 -0.00 8.00 137.96 165.00 Tm (26) Tj ET 0.000 0.804 0.000 rg 124.03 134.60 m 134.83 134.60 l 134.83 145.40 l 124.03 145.40 l h f BT 0.000 0.000 0.000 rg /F2 1 Tf 8.00 0.00 -0.00 8.00 137.96 137.19 Tm (27) Tj ET 0.000 0.000 1.000 rg 124.03 106.87 m 134.83 106.87 l 134.83 117.67 l 124.03 117.67 l h f BT 0.000 0.000 0.000 rg /F2 1 Tf 8.00 0.00 -0.00 8.00 137.96 109.53 Tm (28) Tj ET 0.000 1.000 1.000 rg 124.03 79.13 m 134.83 79.13 l 134.83 89.93 l 124.03 89.93 l h f BT 0.000 0.000 0.000 rg /F2 1 Tf 8.00 0.00 -0.00 8.00 137.96 81.80 Tm (29) Tj ET 1.000 0.000 1.000 rg 152.88 328.73 m 163.68 328.73 l 163.68 339.53 l 152.88 339.53 l h f BT 0.000 0.000 0.000 rg /F2 1 Tf 8.00 0.00 -0.00 8.00 166.81 331.40 Tm (30) Tj ET 1.000 1.000 0.000 rg 152.88 301.00 m 163.68 301.00 l 163.68 311.80 l 152.88 311.80 l h f BT 0.000 0.000 0.000 rg /F2 1 Tf 8.00 0.00 -0.00 8.00 166.81 303.66 Tm (31) Tj ET 0.745 0.745 0.745 rg 152.88 273.27 m 163.68 273.27 l 163.68 284.07 l 152.88 284.07 l h f BT 0.000 0.000 0.000 rg /F2 1 Tf 8.00 0.00 -0.00 8.00 166.81 275.93 Tm (32) Tj ET 152.88 245.53 m 163.68 245.53 l 163.68 256.33 l 152.88 256.33 l h f BT /F2 1 Tf 8.00 0.00 -0.00 8.00 166.81 248.20 Tm (33) Tj ET 1.000 0.000 0.000 rg 152.88 217.80 m 163.68 217.80 l 163.68 228.60 l 152.88 228.60 l h f BT 0.000 0.000 0.000 rg /F2 1 Tf 8.00 0.00 -0.00 8.00 166.81 220.46 Tm (34) Tj ET 0.000 0.804 0.000 rg 152.88 190.07 m 163.68 190.07 l 163.68 200.87 l 152.88 200.87 l h f BT 0.000 0.000 0.000 rg /F2 1 Tf 8.00 0.00 -0.00 8.00 166.81 192.73 Tm (35) Tj ET 0.000 0.000 1.000 rg 152.88 162.33 m 163.68 162.33 l 163.68 173.13 l 152.88 173.13 l h f BT 0.000 0.000 0.000 rg /F2 1 Tf 8.00 0.00 -0.00 8.00 166.81 165.00 Tm (36) Tj ET 0.000 1.000 1.000 rg 152.88 134.60 m 163.68 134.60 l 163.68 145.40 l 152.88 145.40 l h f BT 0.000 0.000 0.000 rg /F2 1 Tf 8.00 0.00 -0.00 8.00 166.81 137.26 Tm (37) Tj ET 1.000 0.000 1.000 rg 152.88 106.87 m 163.68 106.87 l 163.68 117.67 l 152.88 117.67 l h f BT 0.000 0.000 0.000 rg /F2 1 Tf 8.00 0.00 -0.00 8.00 166.81 109.53 Tm (38) Tj ET 1.000 1.000 0.000 rg 152.88 79.13 m 163.68 79.13 l 163.68 89.93 l 152.88 89.93 l h f BT 0.000 0.000 0.000 rg /F2 1 Tf 8.00 0.00 -0.00 8.00 166.81 81.80 Tm (39) Tj ET 0.745 0.745 0.745 rg 181.73 328.73 m 192.53 328.73 l 192.53 339.53 l 181.73 339.53 l h f BT 0.000 0.000 0.000 rg /F2 1 Tf 8.00 0.00 -0.00 8.00 195.66 331.40 Tm (40) Tj ET 181.73 301.00 m 192.53 301.00 l 192.53 311.80 l 181.73 311.80 l h f BT /F2 1 Tf 8.00 0.00 -0.00 8.00 195.66 303.59 Tm (41) Tj ET 1.000 0.000 0.000 rg 181.73 273.27 m 192.53 273.27 l 192.53 284.07 l 181.73 284.07 l h f BT 0.000 0.000 0.000 rg /F2 1 Tf 8.00 0.00 -0.00 8.00 195.66 275.85 Tm (42) Tj ET 0.000 0.804 0.000 rg 181.73 245.53 m 192.53 245.53 l 192.53 256.33 l 181.73 256.33 l h f BT 0.000 0.000 0.000 rg /F2 1 Tf 8.00 0.00 -0.00 8.00 195.66 248.20 Tm (43) Tj ET 0.000 0.000 1.000 rg 181.73 217.80 m 192.53 217.80 l 192.53 228.60 l 181.73 228.60 l h f BT 0.000 0.000 0.000 rg /F2 1 Tf 8.00 0.00 -0.00 8.00 195.66 220.39 Tm (44) Tj ET 0.000 1.000 1.000 rg 181.73 190.07 m 192.53 190.07 l 192.53 200.87 l 181.73 200.87 l h f BT 0.000 0.000 0.000 rg /F2 1 Tf 8.00 0.00 -0.00 8.00 195.66 192.73 Tm (45) Tj ET 1.000 0.000 1.000 rg 181.73 162.33 m 192.53 162.33 l 192.53 173.13 l 181.73 173.13 l h f BT 0.000 0.000 0.000 rg /F2 1 Tf 8.00 0.00 -0.00 8.00 195.66 165.00 Tm (46) Tj ET 1.000 1.000 0.000 rg 181.73 134.60 m 192.53 134.60 l 192.53 145.40 l 181.73 145.40 l h f BT 0.000 0.000 0.000 rg /F2 1 Tf 8.00 0.00 -0.00 8.00 195.66 137.19 Tm (47) Tj ET 0.745 0.745 0.745 rg 181.73 106.87 m 192.53 106.87 l 192.53 117.67 l 181.73 117.67 l h f BT 0.000 0.000 0.000 rg /F2 1 Tf 8.00 0.00 -0.00 8.00 195.66 109.53 Tm (48) Tj ET 181.73 79.13 m 192.53 79.13 l 192.53 89.93 l 181.73 89.93 l h f BT /F2 1 Tf 8.00 0.00 -0.00 8.00 195.66 81.80 Tm (49) Tj ET 1.000 0.000 0.000 rg 210.58 328.73 m 221.38 328.73 l 221.38 339.53 l 210.58 339.53 l h f BT 0.000 0.000 0.000 rg /F2 1 Tf 8.00 0.00 -0.00 8.00 224.51 331.40 Tm (50) Tj ET 0.000 0.804 0.000 rg 210.58 301.00 m 221.38 301.00 l 221.38 311.80 l 210.58 311.80 l h f BT 0.000 0.000 0.000 rg /F2 1 Tf 8.00 0.00 -0.00 8.00 224.51 303.66 Tm (51) Tj ET 0.000 0.000 1.000 rg 210.58 273.27 m 221.38 273.27 l 221.38 284.07 l 210.58 284.07 l h f BT 0.000 0.000 0.000 rg /F2 1 Tf 8.00 0.00 -0.00 8.00 224.51 275.93 Tm (52) Tj ET 0.000 1.000 1.000 rg 210.58 245.53 m 221.38 245.53 l 221.38 256.33 l 210.58 256.33 l h f BT 0.000 0.000 0.000 rg /F2 1 Tf 8.00 0.00 -0.00 8.00 224.51 248.20 Tm (53) Tj ET 1.000 0.000 1.000 rg 210.58 217.80 m 221.38 217.80 l 221.38 228.60 l 210.58 228.60 l h f BT 0.000 0.000 0.000 rg /F2 1 Tf 8.00 0.00 -0.00 8.00 224.51 220.46 Tm (54) Tj ET 1.000 1.000 0.000 rg 210.58 190.07 m 221.38 190.07 l 221.38 200.87 l 210.58 200.87 l h f BT 0.000 0.000 0.000 rg /F2 1 Tf 8.00 0.00 -0.00 8.00 224.51 192.79 Tm (55) Tj ET 0.745 0.745 0.745 rg 210.58 162.33 m 221.38 162.33 l 221.38 173.13 l 210.58 173.13 l h f BT 0.000 0.000 0.000 rg /F2 1 Tf 8.00 0.00 -0.00 8.00 224.51 165.00 Tm (56) Tj ET 210.58 134.60 m 221.38 134.60 l 221.38 145.40 l 210.58 145.40 l h f BT /F2 1 Tf 8.00 0.00 -0.00 8.00 224.51 137.32 Tm (57) Tj ET 1.000 0.000 0.000 rg 210.58 106.87 m 221.38 106.87 l 221.38 117.67 l 210.58 117.67 l h f BT 0.000 0.000 0.000 rg /F2 1 Tf 8.00 0.00 -0.00 8.00 224.51 109.53 Tm (58) Tj ET 0.000 0.804 0.000 rg 210.58 79.13 m 221.38 79.13 l 221.38 89.93 l 210.58 89.93 l h f BT 0.000 0.000 0.000 rg /F2 1 Tf 8.00 0.00 -0.00 8.00 224.51 81.80 Tm (59) Tj ET 0.000 0.000 1.000 rg 239.42 328.73 m 250.22 328.73 l 250.22 339.53 l 239.42 339.53 l h f BT 0.000 0.000 0.000 rg /F2 1 Tf 8.00 0.00 -0.00 8.00 253.36 331.40 Tm (60) Tj ET 0.000 1.000 1.000 rg 239.42 301.00 m 250.22 301.00 l 250.22 311.80 l 239.42 311.80 l h f BT 0.000 0.000 0.000 rg /F2 1 Tf 8.00 0.00 -0.00 8.00 253.36 303.66 Tm (61) Tj ET 1.000 0.000 1.000 rg 239.42 273.27 m 250.22 273.27 l 250.22 284.07 l 239.42 284.07 l h f BT 0.000 0.000 0.000 rg /F2 1 Tf 8.00 0.00 -0.00 8.00 253.36 275.93 Tm (62) Tj ET 1.000 1.000 0.000 rg 239.42 245.53 m 250.22 245.53 l 250.22 256.33 l 239.42 256.33 l h f BT 0.000 0.000 0.000 rg /F2 1 Tf 8.00 0.00 -0.00 8.00 253.36 248.20 Tm (63) Tj ET 0.745 0.745 0.745 rg 239.42 217.80 m 250.22 217.80 l 250.22 228.60 l 239.42 228.60 l h f BT 0.000 0.000 0.000 rg /F2 1 Tf 8.00 0.00 -0.00 8.00 253.36 220.46 Tm (64) Tj ET 239.42 190.07 m 250.22 190.07 l 250.22 200.87 l 239.42 200.87 l h f BT /F2 1 Tf 8.00 0.00 -0.00 8.00 253.36 192.73 Tm (65) Tj ET 1.000 0.000 0.000 rg 239.42 162.33 m 250.22 162.33 l 250.22 173.13 l 239.42 173.13 l h f BT 0.000 0.000 0.000 rg /F2 1 Tf 8.00 0.00 -0.00 8.00 253.36 165.00 Tm (66) Tj ET 0.000 0.804 0.000 rg 239.42 134.60 m 250.22 134.60 l 250.22 145.40 l 239.42 145.40 l h f BT 0.000 0.000 0.000 rg /F2 1 Tf 8.00 0.00 -0.00 8.00 253.36 137.26 Tm (67) Tj ET 0.000 0.000 1.000 rg 239.42 106.87 m 250.22 106.87 l 250.22 117.67 l 239.42 117.67 l h f BT 0.000 0.000 0.000 rg /F2 1 Tf 8.00 0.00 -0.00 8.00 253.36 109.53 Tm (68) Tj ET 0.000 1.000 1.000 rg 239.42 79.13 m 250.22 79.13 l 250.22 89.93 l 239.42 89.93 l h f BT 0.000 0.000 0.000 rg /F2 1 Tf 8.00 0.00 -0.00 8.00 253.36 81.80 Tm (69) Tj ET 1.000 0.000 1.000 rg 268.27 328.73 m 279.07 328.73 l 279.07 339.53 l 268.27 339.53 l h f BT 0.000 0.000 0.000 rg /F2 1 Tf 8.00 0.00 -0.00 8.00 282.21 331.40 Tm (70) Tj ET 1.000 1.000 0.000 rg 268.27 301.00 m 279.07 301.00 l 279.07 311.80 l 268.27 311.80 l h f BT 0.000 0.000 0.000 rg /F2 1 Tf 8.00 0.00 -0.00 8.00 282.21 303.59 Tm (71) Tj ET 0.745 0.745 0.745 rg 268.27 273.27 m 279.07 273.27 l 279.07 284.07 l 268.27 284.07 l h f BT 0.000 0.000 0.000 rg /F2 1 Tf 8.00 0.00 -0.00 8.00 282.21 275.85 Tm (72) Tj ET 268.27 245.53 m 279.07 245.53 l 279.07 256.33 l 268.27 256.33 l h f BT /F2 1 Tf 8.00 0.00 -0.00 8.00 282.21 248.20 Tm (73) Tj ET 1.000 0.000 0.000 rg 268.27 217.80 m 279.07 217.80 l 279.07 228.60 l 268.27 228.60 l h f BT 0.000 0.000 0.000 rg /F2 1 Tf 8.00 0.00 -0.00 8.00 282.21 220.39 Tm (74) Tj ET 0.000 0.804 0.000 rg 268.27 190.07 m 279.07 190.07 l 279.07 200.87 l 268.27 200.87 l h f BT 0.000 0.000 0.000 rg /F2 1 Tf 8.00 0.00 -0.00 8.00 282.21 192.79 Tm (75) Tj ET 0.000 0.000 1.000 rg 268.27 162.33 m 279.07 162.33 l 279.07 173.13 l 268.27 173.13 l h f BT 0.000 0.000 0.000 rg /F2 1 Tf 8.00 0.00 -0.00 8.00 282.21 165.00 Tm (76) Tj ET 0.000 1.000 1.000 rg 268.27 134.60 m 279.07 134.60 l 279.07 145.40 l 268.27 145.40 l h f BT 0.000 0.000 0.000 rg /F2 1 Tf 8.00 0.00 -0.00 8.00 282.21 137.25 Tm (77) Tj ET 1.000 0.000 1.000 rg 268.27 106.87 m 279.07 106.87 l 279.07 117.67 l 268.27 117.67 l h f BT 0.000 0.000 0.000 rg /F2 1 Tf 8.00 0.00 -0.00 8.00 282.21 109.53 Tm (78) Tj ET 1.000 1.000 0.000 rg 268.27 79.13 m 279.07 79.13 l 279.07 89.93 l 268.27 89.93 l h f BT 0.000 0.000 0.000 rg /F2 1 Tf 8.00 0.00 -0.00 8.00 282.21 81.80 Tm (79) Tj ET 0.745 0.745 0.745 rg 297.12 328.73 m 307.92 328.73 l 307.92 339.53 l 297.12 339.53 l h f BT 0.000 0.000 0.000 rg /F2 1 Tf 8.00 0.00 -0.00 8.00 311.06 331.40 Tm (80) Tj ET 297.12 301.00 m 307.92 301.00 l 307.92 311.80 l 297.12 311.80 l h f BT /F2 1 Tf 8.00 0.00 -0.00 8.00 311.06 303.66 Tm (81) Tj ET 1.000 0.000 0.000 rg 297.12 273.27 m 307.92 273.27 l 307.92 284.07 l 297.12 284.07 l h f BT 0.000 0.000 0.000 rg /F2 1 Tf 8.00 0.00 -0.00 8.00 311.06 275.93 Tm (82) Tj ET 0.000 0.804 0.000 rg 297.12 245.53 m 307.92 245.53 l 307.92 256.33 l 297.12 256.33 l h f BT 0.000 0.000 0.000 rg /F2 1 Tf 8.00 0.00 -0.00 8.00 311.06 248.20 Tm (83) Tj ET 0.000 0.000 1.000 rg 297.12 217.80 m 307.92 217.80 l 307.92 228.60 l 297.12 228.60 l h f BT 0.000 0.000 0.000 rg /F2 1 Tf 8.00 0.00 -0.00 8.00 311.06 220.46 Tm (84) Tj ET 0.000 1.000 1.000 rg 297.12 190.07 m 307.92 190.07 l 307.92 200.87 l 297.12 200.87 l h f BT 0.000 0.000 0.000 rg /F2 1 Tf 8.00 0.00 -0.00 8.00 311.06 192.73 Tm (85) Tj ET 1.000 0.000 1.000 rg 297.12 162.33 m 307.92 162.33 l 307.92 173.13 l 297.12 173.13 l h f BT 0.000 0.000 0.000 rg /F2 1 Tf 8.00 0.00 -0.00 8.00 311.06 165.00 Tm (86) Tj ET 1.000 1.000 0.000 rg 297.12 134.60 m 307.92 134.60 l 307.92 145.40 l 297.12 145.40 l h f BT 0.000 0.000 0.000 rg /F2 1 Tf 8.00 0.00 -0.00 8.00 311.06 137.26 Tm (87) Tj ET 0.745 0.745 0.745 rg 297.12 106.87 m 307.92 106.87 l 307.92 117.67 l 297.12 117.67 l h f BT 0.000 0.000 0.000 rg /F2 1 Tf 8.00 0.00 -0.00 8.00 311.06 109.53 Tm (88) Tj ET 297.12 79.13 m 307.92 79.13 l 307.92 89.93 l 297.12 89.93 l h f BT /F2 1 Tf 8.00 0.00 -0.00 8.00 311.06 81.80 Tm (89) Tj ET 1.000 0.000 0.000 rg 325.97 328.73 m 336.77 328.73 l 336.77 339.53 l 325.97 339.53 l h f BT 0.000 0.000 0.000 rg /F2 1 Tf 8.00 0.00 -0.00 8.00 339.90 331.40 Tm (90) Tj ET 0.000 0.804 0.000 rg 325.97 301.00 m 336.77 301.00 l 336.77 311.80 l 325.97 311.80 l h f BT 0.000 0.000 0.000 rg /F2 1 Tf 8.00 0.00 -0.00 8.00 339.90 303.66 Tm (91) Tj ET 0.000 0.000 1.000 rg 325.97 273.27 m 336.77 273.27 l 336.77 284.07 l 325.97 284.07 l h f BT 0.000 0.000 0.000 rg /F2 1 Tf 8.00 0.00 -0.00 8.00 339.90 275.93 Tm (92) Tj ET 0.000 1.000 1.000 rg 325.97 245.53 m 336.77 245.53 l 336.77 256.33 l 325.97 256.33 l h f BT 0.000 0.000 0.000 rg /F2 1 Tf 8.00 0.00 -0.00 8.00 339.90 248.20 Tm (93) Tj ET 1.000 0.000 1.000 rg 325.97 217.80 m 336.77 217.80 l 336.77 228.60 l 325.97 228.60 l h f BT 0.000 0.000 0.000 rg /F2 1 Tf 8.00 0.00 -0.00 8.00 339.90 220.46 Tm (94) Tj ET 1.000 1.000 0.000 rg 325.97 190.07 m 336.77 190.07 l 336.77 200.87 l 325.97 200.87 l h f BT 0.000 0.000 0.000 rg /F2 1 Tf 8.00 0.00 -0.00 8.00 339.90 192.73 Tm (95) Tj ET 0.745 0.745 0.745 rg 325.97 162.33 m 336.77 162.33 l 336.77 173.13 l 325.97 173.13 l h f BT 0.000 0.000 0.000 rg /F2 1 Tf 8.00 0.00 -0.00 8.00 339.90 165.00 Tm (96) Tj ET 325.97 134.60 m 336.77 134.60 l 336.77 145.40 l 325.97 145.40 l h f BT /F2 1 Tf 8.00 0.00 -0.00 8.00 339.90 137.26 Tm (97) Tj ET 1.000 0.000 0.000 rg 325.97 106.87 m 336.77 106.87 l 336.77 117.67 l 325.97 117.67 l h f BT 0.000 0.000 0.000 rg /F2 1 Tf 8.00 0.00 -0.00 8.00 339.90 109.53 Tm (98) Tj ET 0.000 0.804 0.000 rg 325.97 79.13 m 336.77 79.13 l 336.77 89.93 l 325.97 89.93 l h f BT 0.000 0.000 0.000 rg /F2 1 Tf 8.00 0.00 -0.00 8.00 339.90 81.80 Tm (99) Tj ET Q endstream endobj 7 0 obj 17300 endobj 3 0 obj << /Type /Pages /Kids [ 5 0 R ] /Count 1 /MediaBox [0 0 432 432] >> endobj 4 0 obj << /ProcSet [/PDF /Text] /Font <> /ExtGState << >> >> endobj 8 0 obj << /Type /Encoding /BaseEncoding /WinAnsiEncoding /Differences [ 45/minus ] >> endobj 9 0 obj << /Type /Font /Subtype /Type1 /Name /F2 /BaseFont /Helvetica /Encoding 8 0 R >> endobj 10 0 obj << /Type /Font /Subtype /Type1 /Name /F3 /BaseFont /Helvetica-Bold /Encoding 8 0 R >> endobj xref 0 11 0000000000 65535 f 0000000021 00000 n 0000000164 00000 n 0000017667 00000 n 0000017750 00000 n 0000000213 00000 n 0000000293 00000 n 0000017646 00000 n 0000017842 00000 n 0000017936 00000 n 0000018032 00000 n trailer << /Size 11 /Info 1 0 R /Root 2 0 R >> startxref 18134 %%EOF timeSeries/vignettes/timeSeriesPlot.Rnw0000644000176200001440000015272614472112613020051 0ustar liggesusers%\VignetteIndexEntry{Plotting 'timeSeries' Objects} \documentclass[10pt,a4paper]{article} \usepackage{hyperref} \hypersetup{colorlinks,% citecolor=black,% linkcolor=blue,% urlcolor=darkgreen,% } \title{\bf Plotting 'timeSeries' Objects} \author{Diethelm W\"urtz and Tobias Setz\\ETH Zurich and Rmetrics Association Zurich} \date{May 12, 2014} \begin{document} \SweaveOpts{concordance=TRUE} \maketitle \tableofcontents \setlength{\parskip}{20pt} %\SweaveOpts{strip.white=FALSE} \setkeys{Gin}{width=0.9\textwidth} % plot.ts <- function ( % x, y = NULL, plot.type = c("multiple", "single"), % xy.labels, xy.lines, panel = lines, nc, % yax.flip = FALSE, % mar.multi = c(0, 5.1, 0, if (yax.flip) 5.1 else 2.1), % oma.multi = c(6, 0, 5, 0), axes = TRUE, ...) % plot.zoo <- function ( % x, y = NULL, screens, plot.type, panel = lines, % xlab = "Index", ylab = NULL, main = NULL, % xlim = NULL, ylim = NULL, % xy.labels = FALSE, xy.lines = NULL, % yax.flip = FALSE, % oma = c(6, 0, 5, 0), % mar = c(0, 5.1, 0, if (yax.flip) 5.1 else 2.1), % col = 1, lty = 1, lwd = 1, pch = 1, type = "l", log = "", % nc, widths = 1, heights = 1, ...) % plot.xts <- function ( % x, y = NULL, type = "l", auto.grid = TRUE, % major.ticks = "auto", minor.ticks = TRUE, major.format = TRUE, % bar.col = "grey", candle.col = "white", % ann = TRUE, axes = TRUE, ...) % .plot.timeSeries <-function( % x, y, FinCenter = NULL, type = NULL, plot.type = c("multiple", "single"), % format = "auto", at = c("chic", "pretty"), % col, pch, cex, lty, lwd, % grid = FALSE, frame.plot = TRUE, panel = lines, % axes = TRUE, ann = TRUE, cex.axis = 1, cex.lab = 1, % yax.flip = FALSE, % mar.multi = c(0, 5.1, 0, if (yax.flip) 5.1 else 2.1), % oma.multi = c(7.75, 1.1, 6.1, 1.1), % ...) % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % 1 \newpage\thispagestyle{empty}\mbox{} \pagebreak \section{Introduction} The Rmetrics \texttt{timeDate} and \texttt{timeSeries} packages are workhorses to deal with chronological objects. Since their inception 2009 under their original names \texttt{fCalendar} and \texttt{fSeries} they have been only slightly modified. With version R 3.1. we have essentially improved the \texttt{plot} function, but we also took care that the functionality is almost upward compatible. In this vignette we show how to work with the recently updated S4 generic plot function \texttt{plot}. The function is written to display Rmetrics S4 \texttt{timeSeries} objects. The basic functionality of the \texttt{plot} function is to display single and multiple views on univariae and multivariate \texttt{timeSeries} objects. The function \texttt{plot.ts} from R's base environment, which displays basic \texttt{ts} time series objects, served as a model for our design of the generic S4 \texttt{plot} function for \texttt{timeSeries} objects. Similarily, \texttt{plot.ts} can be considered as the prototype for the S3 \texttt{plot.zoo} method. The \texttt{xts} plot function was build to display univariate \texttt{xts} time series objects which inherit from \texttt{zoo}'s objects for ordered time series objects. The generic S4 time series plotting function can dispay \emph{univariate} and \emph{multivariate} time series in \emph{single} and \emph{multiple} frames. The plots can be tailored with respect to several viewing components: colors (col), line types (lty), plot symbols (pch), line widths (lwd), symbol sizes (cex), axis layout (pretty, chic, tailored), minor tick mark appearence, font styles and font sizes, frame positioning (mar, oma), as well as tailored panel functions (panel). \noindent\emph{General Plot Settings and Design Apects}: \noindent\emph{Plot Type}: Univariate time series are displayed by default in \texttt{plot.type="single"} frames, multivariate time series are displayed by default in \texttt{plot.type="multiple"} frames. The default line style for a plot is \texttt{type ="l"} is drawn with "lines". \noindent\emph{Time Axis Layout}: For the time axis layout the function \texttt{pretty} determines in an automative way the \texttt{at="pretty"} positions of the ticks. The \texttt{format="auto"} is extracted from the time stamps of the time series object or can be overwritten by the user with a POSIX format string. Alternatively, one can select \texttt{"chic"} to generate time axis styles. We called this method "chic" to give reference to the underlying function \texttt{axTicksByTime} from the Chicago \texttt{xts} package which generates tick positions and axis labels. Furthermore, a "tailored" method can be applied which allows for fully arbitrary user defined positions and formatted labels. Minor ticks can be added in several fashions. \noindent\emph{Annotations}: The annotations of the plots are reduced to the y-label. These are taken by default from the column names of the time series object. This gives the user the freedom to have full control about his views how the plot should be look like. Note, multivariate time series in single plots show the string \texttt{"Values"} as label on the y-axis. Main title, sub title, and the x-label on the time axis are not shown by default. We prefer and recommend to add these decorations calling the function \texttt{title}. This allows also much more flexibility compared to passing the arguments through the plot functions. All default annotations (including the y-label) can be suppressed setting the plot function argument to \texttt{ann=FALSE}. The argument \texttt{axes=FALSE} suppresses to draw both axes on the plot frame. \noindent\emph{Decorations}: There are several options to decorate the plot: These include colors (col), plotting symbols (pch), scaling factor of plotting characters and symbols (cex), line types (lty), and lindwidths (lwd). Note, all these parameters may be vectors of the same length as the number of time series, so that each series can be addressed to its own individual style, color, and size. A grid and the plot frame (box) can be added or suppresse specifying the arguments \texttt{grid} and \texttt{frame.plot} in the argument list of the \texttt{plot} function. \noindent\emph{Panel Function}: In the case of multiple plots the plot frames, are also called \emph{panels}. By default in each panel the appropriate curve is drawn calling R's \texttt{lines} function \texttt{panel=lines}. This function can be replaced by a user defined function. This offers a wide range of new views on your time series. So for example yo can show zero or any other reference lines on the panels, or you can add rugs to (return) charts, or you can add for an example an EMA indicator (or any other kind of indicator) to curves shown in individual panels. \noindent\emph{Example "timeSeries" Objects}: To demonstrate the wide range of options to dispaly S4 \texttt{timeSeries} objects, we use the the daily index values from the Swiss Pension Fund Benchmark \emph{LPP2005}. The time series is part of the \texttt{timeSeries} package. For this we have introduced some abbreviations: <>= Sys.setlocale("LC_ALL", "C") @ <>= require(timeSeries) require(xts) require(PerformanceAnalytics) require(fTrading) tS1 <- 100 * cumulated(LPP2005REC[, 1]) # SBI (univariate) tS2 <- 100 * cumulated(LPP2005REC[, 1:2]) # SBI & SPI (bivariate) tS3 <- 100 * cumulated(LPP2005REC[, 1:3]) # SBI, SPI, SWIIT (Swiss Market) tS6 <- 100 * cumulated(LPP2005REC[, 1:6]) # Swiss and Foreign Market Indexes @ % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % 2 \newpage\thispagestyle{empty}\mbox{} \newpage\thispagestyle{empty}\mbox{} \pagebreak \section{Standard Time Series Plots} The \texttt{plot} function from the \texttt{timeSeries} package allows for five different views on standard plot layouts. These include \begin{itemize} \item Univeriate single plots \item Multivariate single plots \item One column multiple plots \item Two column multiple plots \item Scatter plots \end{itemize} \noindent The only argument we have to set is the \texttt{plot.type} parameter to determine the layout of the plot. The default value is \texttt{"multiple"}, and the alternative value is \texttt{"single"}. The arguments can be abbreviated as \texttt{"m"} or \texttt{"s"}, respectively. \noindent \emph{Univariate Single Plots} were designed to plot univariate \texttt{timeSeries} objects in one single graph frame. Nothing then the \texttt{timeSeries} object has to be specified, the \texttt{plot.type} is forced to \texttt{"s"}. \noindent \emph{Multivariate Single Plots} will be used when a set of multivariate \texttt{timeSeries} objects should be drawn in one common data frame. For this argument the vlue \texttt{plot.type="s"} has to be specified. \noindent \emph{One Column Multiple Plots} display multivariate \texttt{timeSeries} objects, such that each series is plotted in its own frame. Up to four series, the frames are displayed in one column, for more series the frames are arranged in a two colum column display. \noindent \emph{Two Column Multiple Plots} handel the case of more than four \texttt{timeSeries} objects. Then the the series are displayed in two colums. In total, the number of rows is not restricted. % ---------------------------------------------------------------------------- \pagebreak \subsection{Univariate Single Plots} The most simple time series plot shows an univariate curve in a single plot. The axis is designed from "pretty" positions calculated from R's base function \texttt{pretty}. The labels are printed in the ISO 8601 standard date/time format. <>= par(mfrow=c(1, 1)) plot(tS1) @ \medskip \begin{center} \begin{figure}[h] <>= <> @ \caption{The chart shows an univariate time series (here the Swiss Bond Index) in a single frame. For all plot options default values have been chosen. You can decorate the plot, making it more conveniant to your needs, e.g.: change the color (col), add a main title and x-label calling the function \texttt{title}, or remove the grid lines setting the argument \texttt{grid=FALSE}. You can also design the minor tick marks, setting instead of the value \texttt{"auto"} oe of the following spreads: \texttt{"day"}, the default, \texttt{"week"}, or \texttt{"month"}. } \end{figure} \end{center} % ---------------------------------------------------------------------------- \pagebreak \subsection*{} Two other plot function implementations for \texttt{xts} time series objects can be found in the contributesd R packages \texttt{xts} and \texttt{PerformanceAnalytics}. Let us compare how they generate plot positions and time label formats. \vspace{-0.3cm} <>= require(PerformanceAnalytics) par(mfrow=c(3, 1)) xts::plot.xts(as.xts(tS1)) PerformanceAnalytics::chart.TimeSeries(as.xts(tS1)) plot(tS1) @ \medskip \begin{center} \begin{figure}[h] <>= <> @ \caption{The group of the three charts shows an univariate time series in a single frame for the plot functions as implemented in the packages \texttt{xts}, \texttt{PerformanceAnalytics}, and \texttt{timeSeries}. For example in the case of daily time series records \texttt{xts} uses U.S. style labels whereas \texttt{PerformanceAnalytics} and \texttt{timeSeries} use ISO standard date labels \texttt{YYYY-mm-dd}. The plot decorations are those from default settings.} \end{figure} \end{center} % ----------------------------------------------------------------------------- \pagebreak \subsection{Multivariate Single Plots} Multivariate time series plots in a single panel are constructed by default in the way that the first curve is plotted calling the function \texttt{plot} and the remaining curves by calling the function \texttt{lines}. <>= par(mfrow=c(1, 1)) plot(tS3, plot.type="s") @ \medskip \begin{center} \begin{figure}[h] <>= <> @ \caption{This chart shows a multivariate time series in a single frame. Note, we have to set the argument \texttt{plot.type="s"}. Again, for all plot options the default settings have been used. You can decorate the plot, making it more conveniant to your needs, e.g.: change the color vector (col), add a main title and x-label calling the function \texttt{title}, or remove grid lines setting the argument \texttt{grid=FALSE}. Note, to change the color settings you can set the argument \texttt{col=1:3} which would result in "black", "red", "green" for the three curves, or you can just set the colors by name, or selecting them from a color palette.} \end{figure} \end{center} % ----------------------------------------------------------------------------- \pagebreak \subsection*{} Now let us compare the plot function from the \texttt{timeSeries} package with the \texttt{chart.TimeSeries} plotting function from the \texttt{PerformanceAnalytics} function. (Note, the \texttt(xts) has no multivariate plot function implemented.) <>= par(mfrow=c(2, 1)) require(PerformanceAnalytics) PerformanceAnalytics::chart.TimeSeries(as.xts(tS3)) plot(tS3, plot.type="s") @ \medskip \begin{center} \begin{figure}[h] <>= <> @ \caption{The two charts show a multivariate time series plotted in a single frame. We use for the plot the functions as implemented in the packages \texttt{PerformanceAnalytics}, and \texttt{timeSeries}.} \end{figure} \end{center} % ----------------------------------------------------------------------------- \pagebreak \subsection{Multiple Plots} Multiple plots enormously simplify the display of different curves in multiple panels. These are the ideal plots when it comes to the task to create a quick overview over several time series. Multiple plotting is exclusive to \texttt{timeSeries} objects, \texttt(xts) and \texttt{PerformanceAnalytics} offer no multiple plotting tool. <>= par(mfrow=c(1, 1)) plot(tS3, plot.type="m") @ \begin{center} \begin{figure}[h] <>= <> @ \caption{As long as we plot less than 4 time series in a multivariate frame, we get a one column layout. Annotations show by default only the y-labels which are taken from the colmun names of the time series to be drawn. Feel free to add main title, sub title, and x-label calling the function \texttt{title}}. \end{figure} \end{center} % ----------------------------------------------------------------------------- \pagebreak \subsection*{} For more than four curves the frames of the plot design are arranged in two columns. <>= par(mfrow=c(1, 1)) plot(tS6, plot.type="m") @ \medskip \begin{center} \begin{figure}[h] <>= <> @ \caption{The graph shows the layout how it is created for six curves. There are two columns with three panels to the left and also three panels to the right. Note, it is easily possible to adapt the margin sizes and the gap between the two columns of plots calling the function \texttt{mar} and \texttt{oma}.} \end{figure} \end{center} % ----------------------------------------------------------------------------- \pagebreak \subsection*{} If you like a design with a small gap between the panel rows, you can modify the \texttt{mar} parameter to introduce a small gap, here with a width of 0.3. Feel free to modify it. <>= par(mfrow=c(1, 1)) plot(tS3, plot.type="m", mar=c(gap=0.3, 5.1, gap=0.3, 2.1)) @ \medskip \begin{center} \begin{figure}[h] <>= <> @ \caption{One can use in a multiple plot the \texttt{mar} parameter setting to create a small gap between the rows of the individual charts. This lets a plot look more elegant.} \end{figure} \end{center} % ----------------------------------------------------------------------------- \pagebreak \subsection{Combining Single Plots} You can also create your own multiple panel plots. Just combine single panels in an array of rows and columns using the parameter settings for \texttt{mfrow}, \texttt{mfcol}, and \texttt{mar}. <>= par(mfrow=c(2, 1)) par(mar = c(bottom=1.5, 5.1, top=4, 2.1)) plot(tS2[, 1]) par(mar = c(bottom=4, 5.1, top=1.5, 2.1)) plot(tS2[, 2]) @ \begin{center} \begin{figure}[h] <>= <> @ \caption{One can use in single plots the \texttt{mfrow} and \texttt{mar} parameter settings to place single plots either row by row or column by column. Here, \texttt{mfrow} and \texttt{mfcol} to the job. In this case a vector of the form \texttt{c(nr, nc)} draws subsequent figures in an nr-by-nc array on the device by columns (mfcol) or rows (mfrow), respectively.} \end{figure} \end{center} % ----------------------------------------------------------------------------- \pagebreak \subsection{Layout of Single Plots} There is another option in R to create panel layouts, not necessarilly in an rectangular array. Have a look to the help page of the function \texttt{layout}, her comes a simple example. <>= nf <- layout(mat=matrix(c(1, 1, 2, 3), byrow = TRUE, nrow=2)) par(mar = c(bottom=2, 5.1, top=3, 2.1)) plot(tS3[, 1]) par(mar = c(bottom=3, 5.1, top=2, 1.1)) plot(tS3[, 2]) par(mar = c(bottom=3, 4.1, top=2, 2.1)) plot(tS3[, 3]) @ \medskip \begin{center} \begin{figure}[h] <>= <> @ \caption{With the function \texttt{layout} you can devide the plot device in rows and columns expressed in matrix form defined by the argument \texttt{mat}. } \end{figure} \end{center} %To be more specific, the graph \texttt{i} is allocated a region composed %from a subset of these rows and columns, based on the rows and columns %in which \texttt{i} occurs in the matrix \texttt{mat}. %The argument \texttt{layout.show(n)} plots (part of) the current layout, %namely the outlines of the next \texttt{n} figures. % ----------------------------------------------------------------------------- \pagebreak \subsection*{} In addition widths and heights of the layout can be different from row to row, and/or from column to column. The sizes are expressed by the arguments \texttt{widths} and \texttt{heights} of the function \texttt{layout}. <>= nf <- layout(mat=matrix(c(1, 1, 2, 3), byrow=TRUE, nrow=2), heights=c(2.5,1)) par(mar = c(bottom=2, 5.1, top=3, 2.1)) plot(tS3[, 1]) par(mar = c(bottom=3, 5.1, top=1.5, 1.1)) plot(tS3[, 2]) par(mar = c(bottom=3, 4.1, top=1.5, 2.1)) plot(tS3[, 3]) @ \begin{center} \begin{figure}[h] <>= <> @ \caption{With the function \texttt{layout} one can also define the widths and heights of the columns and rows.} \end{figure} \end{center} % ----------------------------------------------------------------------------- \pagebreak \subsection{Bivariate Scatter Plots} For historical reasons, like in the function \texttt{plot.ts}, there is also the option to create an scatter plot from two univariaye time series. Since this is not a "true" time series plot, we will not go in further detail for this display. <>= par(mfrow=c(1,1)) plot(tS2[, 1], tS2[, 2]) @ \begin{center} \begin{figure}[h] <>= <> @ \caption{If \texttt(x) and \texttt(y) are univariate time series, then the plot function will display a scatter plot.} \end{figure} \end{center} % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % 3 \newpage\thispagestyle{empty}\mbox{} \newpage\thispagestyle{empty}\mbox{} \pagebreak \section{Time Axis Layout} The function \texttt{plot} comes with three options to design the time axis layout: \texttt{"pretty"}, \texttt{"chic"}, and \emph{} (note this not a string argument. \emph{} should just abbreviate that we have to input character strings of fully arbitray \texttt{at} positions. For the first two options the style of the axis annotation is generated in a fully automated way, whereas in the tailored case each tick on the axis to be user defined. \noindent The \emph{"pretty"} time axis layout is the default setting for the argument \texttt{at}. Internally the function \texttt{pretty} is used to compute a sequence of about \texttt{n+1} equally spaced round values which cover the range of the values in the time stamps \texttt{time(x)} of the series \texttt{x}. The values are chosen so that they are 1, 2 or 5 times a power of 10. \noindent The \emph{"chic"} time axis layout is the alternative setting for the argument \texttt{at}. Internally the function \texttt{axTicksByTime} from the package \texttt{xts} is used to compute the sequence of axis positions and the format labels. \noindent The \emph{} time axis layout leaves it to the user to specify by himself the positions (at), the time label formatting (format), and the minor tick marks (minor.ticks). % ----------------------------------------------------------------------------- \pagebreak \subsection{Time Axis: "pretty" or "chic"?} Our plotting function comes with two axis-styles. The first is called \texttt{"pretty"}, which is the default style, and calculates positions from R's base function \texttt{pretty}. The other is called \texttt{"chic"} to remember its origin, arising from the "Chicago" \texttt{xts} package. \vspace{-0.7cm} <>= par(mfcol = c(2, 1)) plot(tS1, at = "pretty") plot(tS1, at = "chic") @ \vspace{-0.3cm} \begin{center} \begin{figure}[h] <>= <> @ \caption{The graph shows the two flavours from the \texttt{at="pretty"} and the \texttt{"chic"} axis designs. The first style uses the function \texttt{pretty} from R's \texttt{base} environment to compute the positions for the major ticks. The second style uses the function \texttt{axTicksByTime} from the \texttt{xts} package to compute x-axis tick mark locations by time. In the upper graph the minor ticks are calendar days, whereas in the lower graph weekdays are drawn (therefore the small gaps between the minor ticks become visible). Note, the time series is in both cases an object of class \texttt{timeSeries}.} \end{figure} \end{center} % ----------------------------------------------------------------------------- \pagebreak \subsection*{} Now let us plot a multivariate 3-column time series in a single panel. Again we compare the outcome of the \texttt{"pretty"} and the \texttt{"chic"} axis style. <>= par(mfcol=c(2, 1)) plot(tS3, plot.type="s", at="pretty") plot(tS3, plot.type="s", at="chic") @ \medskip \begin{center} \begin{figure}[h] <>= <> @ \caption{The only difference of this graph compared to the previous is the fact that we consider here a multivariate time series. Three curves are shown in a common plot. Note, when using the \texttt{"chic"} style, then the vertical gridlines are narrower compared to the \texttt{"pretty"} style.} \end{figure} \end{center} % ----------------------------------------------------------------------------- \pagebreak \subsection{Time Axis - Selecting Minor Tick Marks} The \texttt{"pretty"} style allows to draw the minor tick marks on different time scales. These are: \texttt{"day"}, \texttt{"week"}, and \texttt{"month"}. <>= par(mfrow=c(3, 1)) plot(tS1, minor.ticks="day", at="pretty") plot(tS1, minor.ticks="week", at="pretty") plot(tS1, minor.ticks="month", at="pretty") @ \medskip \begin{center} \begin{figure}[h] <>= <> @ \caption{It is worth to note that a good selection of minor tick marks makes a plot much better readable.} \end{figure} \end{center} % ----------------------------------------------------------------------------- \pagebreak \subsection{Time Axis - One Column Multiple Plot Layout} In the multiple plot layout the axis are drawn along the same principles as they are drawn in the case of the single plot layout. <>= par(mfrow=c(1, 1)) plot(tS3, plot.type="m", at="pretty") @ \medskip \begin{center} \begin{figure}[h] <>= <> @ \caption{This graph shows a one column multiple plot layout. The one column layout is generated for up to four time series. When the multivariate time series has more then four time series then a two column layout is displayed. It is up to you which axis style you prefer, \texttt{at="pretty"} or \texttt{at="chic".}} \end{figure} \end{center} % ----------------------------------------------------------------------------- \pagebreak \subsection{Time Axis - Two Column Multiple Plot Layout} Concerning the style of the axis, there is now difference between the one and two column plot designs. <>= par(mfrow=c(1, 1)) plot(tS6, plot.type="m", at="chic") @ \medskip \begin{center} \begin{figure}[h] <>= <> @ \caption{When we have more then four time series, then the display will be generated in two columns. Note, it is possible to modify the width of the gap between the two columns.} \end{figure} \end{center} % ----------------------------------------------------------------------------- \pagebreak \subsection{Tick and Format Layout: The axis style} The third alternative to style the axis offers the users to define format positions according to his preferences. Here comes an example: <>= par(mfrow=c(2, 1)) at <- paste0("200", c("6-01", "6-04", "6-07", "6-10", "7-01", "7-04"), "-01") plot(tS3, plot.type="s", format="%B\n%Y", at=at) plot(tS3, plot.type="s", format="%b/%y", at=at) @ \medskip \begin{center} \begin{figure}[h] <>= <> @ \caption{This graph shows plots with user tailored positions and formatted axis labels.} \end{figure} \end{center} % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % 4 \newpage\thispagestyle{empty}\mbox{} %\newpage\thispagestyle{empty}\mbox{} \pagebreak \section{Annotations} Plot annotations are elelents which can be added to plots or completely discarded. To discard all annotations you have to set \texttt{ann=FALSE} in the argument list of the timSeries \texttt{plot} function. To display annotation you can call the function \texttt{title}. This allows to add the main title, the sub title, and the x- and y-labels to a plot. Together with the appropriate character strings, you can also specify the placement of these annotations by the arguments \texttt{line} and \texttt{outer}. There are additional functions to add annotations to a plot. These are \texttt{text} and \texttt{mtext}. % ----------------------------------------------------------------------------- \pagebreak \subsection{Discarding all Annotations} In a default plot we display only the value-label(s) which are taken from the units or column names of the time time series object. Title, sub title, and time-label are not shown. To discard the appearance of all annotations on a plot you have to set the plot argument \texttt{ann=FALSE}. <>= par(mfrow=c(2, 2)) plot(tS1, ann=FALSE) plot(tS3, plot.type="s", ann=FALSE, at="pretty") plot(tS6, plot.type="s", ann=FALSE, at="pretty") @ \begin{center} \begin{figure}[h] <>= <> @ \caption{This graph shows a plot where all annotations have been discarded. Now feel free to add your own annotations.} \end{figure} \end{center} % ----------------------------------------------------------------------------- \pagebreak \subsection{Adding Title and Labels} To add a main title, a sub, title, and x- and y-labels you can call the function \texttt{title}. <>= par(mfrow=c(2, 2)) plot(tS1); title(main = "Index") plot(tS3, plot.type="s"); title(main = "Index") plot(tS3, plot.type="s"); title(main = "Index", xlab = "Date") plot(tS6, plot.type="s"); title(main = "Index", xlab = "Date") @ \medskip \begin{center} \begin{figure}[h] <>= <> @ \caption{This graph displays in a two by two array four single plots. We have added title and x-lable annotations.} \end{figure} \end{center} % ----------------------------------------------------------------------------- \pagebreak \subsection{Changing Axis Font Size} Sometimes the axis font size may be considered as too small or too large. Then you can use the plot argument \texttt{cex.axis} to upsize or downsize the font. <>= par(mfrow=c(3, 1)) plot(tS3, at="chic", plot.type="s", cex.axis=0.75) plot(tS3, at="chic", plot.type="s", cex.axis=1.00) plot(tS3, at="chic", plot.type="s", cex.axis=1.25) @ \medskip \begin{center} \begin{figure}[h] <>= <> @ \caption{This is an example how to change the size of the axis labels relatively to its default value. The upper graph shows a font size decreased by 20\%, the lower graph a font size increased by 25\%. You can proceed in the same way when using the \texttt{"pretty"} axis style.} \end{figure} \end{center} % ----------------------------------------------------------------------------- \pagebreak \subsection{Flipping Value Axes} Flipping every second axis label in a multiple plot from left to rigth might be meaningful in the case when axis labels overwrite themselves. <>= par(mfrow=c(1, 1)) plot(tS3, plot.type="m", yax.flip = TRUE) @ \medskip \begin{center} \begin{figure}[h] <>= <> @ \caption{The graph shows an one column multiple plot, where the axis of the middle panel is flipped from the left to the right. Note, the same procedure can also be applied two two column multiple plots.} \end{figure} \end{center} % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % 5 \newpage\thispagestyle{empty}\mbox{} %\newpage\thispagestyle{empty}\mbox{} \pagebreak \section{Decorations} There exist several options to decorate plots in different ways. Plot types (lines, points, horizontal bars, etc.) can be modified, colors can be changed, lines can be modified by style and seize, points can be selected by symbol and size. \noindent In the following we will give some examples \begin{itemize} \item Modifying Types \item Changing Colors by Names \item Changing Colors by Color Palettes \item Changing Line Styles \item Modifying Line Widths \item Changing Plot Symbols \item Modifying Plot Symbol Sizes \item Discarding Grid Lines \item Drawing a Box \end{itemize} \noindent to show a few of the many types of cdecorations. Play around to achieve your perfect layout. % ----------------------------------------------------------------------------- \pagebreak \subsection{Modifying Types} <>= par(mfrow=c(1, 1)) plot(tS3, plot.type="m", type=c("l", "p", "h"), at="pretty") @ \medskip \begin{center} \begin{figure}[h] <>= <> @ \caption{If we like to consider in a multiple plot for each panel its own plot style then we can set the parameter \texttt{type}.} \end{figure} \end{center} % ----------------------------------------------------------------------------- \pagebreak \subsection{Changing Colors by Names} Colors can be changed in several ways. Just by their numbers, e.g. 1 (black), 2 (red), 3 (green) etc., or by name, e.g. "black", "red", "green", etc. or by using well designed color palettes. <>= par(mfrow=c(1, 1)) plot(tS3, plot.type="m", col=c("blue", "orange", "darkgreen")) @ \medskip \begin{center} \begin{figure}[h] <>= <> @ \caption{This graph shows how to assign colors by name in the case of a multiple plot. You can do it in the same way setting \texttt{plot.type="s"} if you like to display all three curves in a common single plot.} \end{figure} \end{center} % ----------------------------------------------------------------------------- \pagebreak \subsection{Changing Colors by Color Palettes} When the number of curves increases, then it can become quite difficult to find a set of nice colors. In such cases it is convenient to select the colors from color palettes. <>= par(mfrow=c(1, 1)) plot(tS6, plot.type="s", col=heat.colors(n=6, alpha = 1), at="chic", format = "%B\n%Y") @ \medskip \begin{center} \begin{figure}[h] <>= <> @ \caption{This graph shows an example of six curves diplayed in a sequence of reds. For this we called the function \texttt{seqPalette}.} \end{figure} \end{center} \pagebreak \begin{verbatim} FUNCTION: COLOUR PALETTE rainbowPalette Contiguous rainbow colour palette heatPalette Contiguous heat colour palette terrainPalette Contiguous terrain colour palette topoPalette Contiguous topo colour palette cmPalette Contiguous cm colour palette greyPalette R's gamma-corrected gray palette timPalette Tim's MATLAB-like colour palette rampPalette Colour ramp palettes seqPalette Sequential colour brewer palettes divPalette Diverging colour brewer palettes qualiPalette Qualified colour brewer palettes focusPalette Red, green and blue focus palettes monoPalette Red, green and blue mono palettes \end{verbatim} % ----------------------------------------------------------------------------- \pagebreak \subsection{Changing Line Styles} In multiple plot to each curve an own line style \texttt{lty} can be assigned: 0 "blank", 1 "solid", 2 "dashed", 3 "dotted", 4 "dotdash", 5 "longdash", or 6 "twodash". <>= par(mfrow=c(1, 1)) plot(tS3, plot.type="m", col=1, lty=1:3, at="chic") @ \medskip \begin{center} \begin{figure}[h] <>= <> @ \caption{When we like to print plots in black and white, then its makes much sense to use different line types so that we can distinguish the curves one from each other.} \end{figure} \end{center} % ----------------------------------------------------------------------------- \pagebreak \subsection{Modifying Line Widths} Not only the line type, but also the line width can be modified for each curve in an individual kind. <>= par(mfrow=c(1, 1)) plot(tS3, plot.type="m", col=1, lwd=3:1, at="chic") @ \medskip \begin{center} \begin{figure}[h] <>= <> @ \caption{The graph shows three line widths, the upper's curve width is thick, the middle's curve width is medium, and the lowest's curve width is the thinnest one.} \end{figure} \end{center} % ----------------------------------------------------------------------------- \pagebreak \subsection{Changing Plot Symbols} To use different plot symbols we can assign them by the parameter \texttt{pch}. Don't forget also to set \texttt{type="p"}. %<>= %par(mfrow=c(1, 1)) %tS3weekly <- align(tS3, by="1w") %plot(tS3weekly, plot.type="s", type="p", col=1:3, pch=21:23, at="chic") %@ \medskip %\begin{center} %\begin{figure}[h] %<>= %<> %@ %\caption{This plot shows how to assign different plot symbols to the curves %in a single plot.} %\end{figure} %\end{center} % ----------------------------------------------------------------------------- \pagebreak \subsection{Modifying Plot Symbol Sizes} The argument \texttt{cex.pch} allows to increase or decrease plot symbol sizes with respect to the current plot symbol size. <>= par(mfrow=c(1, 1)) plot(tS3, plot.type="s", type="p", col=1:3, pch=21:23, cex.pch=c(0.2, 0.2, 0.2), at="pretty") @ \medskip \begin{center} \begin{figure}[h] <>= <> @ \caption{This plot show how to change the size of plot symbols in a single plot setting the argument \texttt{cex.pch}. Note, for each curve its own size can be set. The same approach can be used also for multiple plots.} \end{figure} \end{center} % ----------------------------------------------------------------------------- \pagebreak \subsection{Discarding Grid Lines} By default grid lines are displayed. To discard the grid lines from the plot set the arguments \texttt{grid=FALSE}. <>= par(mfrow=c(1, 1)) plot(tS3, plot.type="s", grid=FALSE) @ \medskip \begin{center} \begin{figure}[h] <>= <> @ \caption{By default a grid is drawn on top of the plot. You can remove it by setting the argument \texttt{grid=FALSE}} \end{figure} \end{center} % ----------------------------------------------------------------------------- \pagebreak \subsection{Drawing a Box} <>= par(mfrow=c(1, 1)) plot(tS3, plot.type="s", frame.plot=FALSE, grid=FALSE) box() box(bty = "7", col = "white") # boxL grid(NA, NULL, col = "darkgrey") # hgrid @ \medskip \begin{center} \begin{figure}[h] <>= <> @ \caption{By default the plots are displayed as frame plots. This means that the graphs are surrounded by a box. This box can be discarded setting the plot argument \texttt{frame.plot=FALSE}.} \end{figure} \end{center} % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % 6 \newpage\thispagestyle{empty}\mbox{} %\newpage\thispagestyle{empty}\mbox{} \pagebreak \section{The Panel Function} Multiple plots are very powerful plotting designs. Each panel in a graph can individually tailored by the user. By default each curve in a panel is generated by the function \texttt{lines}. You can define your own panel function(s) by setting the plot argument \texttt{panel} to a user dfined functions. In the following we will show three examples. % ----------------------------------------------------------------------------- \pagebreak \subsection{Adding a Horizental Zero Line} In this example we show how to write a panel function which allows to add a horizontal zero line to each plot panel. <>= par(mfrow=c(1, 1)) lines2 <- function(X, Y, type, xlab, ylab, col, pch, lty, lwd, cex) { lines(x=X, y=Y, col=col) abline(h=0, col = "brown", lwd=2)} plot(returns(tS3), plot.type="m", col = .colorwheelPalette(3), panel=lines2, at="pretty") @ \begin{center} \begin{figure}[h] <>= <> @ \caption{This multiple plot shows panels with curves having a horizontal zero reference line.} \end{figure} \end{center} % ----------------------------------------------------------------------------- \pagebreak \subsection{Adding an Rug to Multiple Return Plots} This example shows how to add in each panel rugs to the righ Y-axis. <>= par(mfrow=c(1, 1)) lines2 <- function(X, Y, type, xlab, ylab, col, pch, lty, lwd, cex) { lines(x=X, y=Y, type="h", col=col) rug(Y, side=4, col="steelblue") } plot(returns(tS6), plot.type="m", col = .colorwheelPalette(6), panel=lines2, at="pretty") @ \begin{center} \begin{figure}[h] <>= <> @ \caption{This multiple plot shows panels with rugs on the right Y-axis.} \end{figure} \end{center} % ----------------------------------------------------------------------------- \pagebreak \subsection{Adding an EMA to Multiple Index Plots} This example shows how to add an EMA indicator to each plot panel. The \texttt{emaTA()} function is provided by the \texttt{fTrading} package. <>= par(mfrow=c(1, 1)) lines2 <- function(X, Y, type, xlab, ylab, col, pch, lty, lwd, cex) { lines(x=X, y=Y, type="l", col=col) lines(x=X, y=emaTA(Y), col="black") } plot(tS3, plot.type="m", col = .colorwheelPalette(3), panel=lines2, grid=TRUE, at="pretty") @ \begin{center} \begin{figure}[h] <>= <> @ \caption{A multiple graph with EMA indicators in each panel.} \end{figure} \end{center} % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % 7 \newpage\thispagestyle{empty}\mbox{} \newpage\thispagestyle{empty}\mbox{} \pagebreak \section{Conclusions} The \texttt{plot} function in the \texttt{timeSeries} package is a very powerful tool to create plots from time series objects. This includes to display univariate and multivariate time series in single and multiple panels, to select from two styles for the time-axis or even to tailor positions and formats according to his own needs, and to modifiy annotations and decorations of plots. % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % 8 \newpage\thispagestyle{empty}\mbox{} \pagebreak \section{Appendix} In the appendix we have summarized graphs and tables which are useful tools to create plots. We have reprinted the default color table from R, we have summarized several color palettes as available in the \texttt{fBasics} package and other contributed R packages, and two tables with font characters and plot symbols. % ----------------------------------------------------------------------------- \pagebreak \subsection{Margins: mar and oma} <>= # Plot: # - oma stands for 'Outer Margin Area' # - mar represents the 'figure Margins' # - The default size is c(5,4,4,2) + 0.1 # - The axes tick marks will go in the first lines par(mfrow=c(1, 1)) par(oma=c(3,3,3,3)) # all sides have 3 lines of space par(mar=c(5,4,4,2) + 0.1) plot(x=1:10, y=1:10, type="n", xlab="X", ylab="Y") # Add Text tot the Plot Part - red text(5,5, "Plot", col="red", cex=2) text(5,4, "text(5,5, \"Plot\", col=\"red\", cex=2)", col="red", cex=1) box("plot", col="red", lwd=2) # Add text to thebThe Figure Part - grey mtext("Margins", side=3, line=2, cex=1.5, col="grey") mtext("par(mar=c(5,4,4,2) + 0.1)", side=3, line=1, cex=1, col="grey") mtext("Line 0", side=3, line=0, adj=1.0, cex=1, col="grey") mtext(" 1", side=3, line=1, adj=1.0, cex=1, col="grey") mtext("Line 2", side=3, line=2, adj=1.0, cex=1, col="grey") mtext("Line 3", side=3, line=3, adj=1.0, cex=1, col="grey") mtext("Line 0", side=2, line=0, adj=1.0, cex=1, col="grey") mtext("Line 1", side=2, line=1, adj=1.0, cex=1, col="grey") mtext("Line 2", side=2, line=2, adj=1.0, cex=1, col="grey") mtext("Line 3", side=2, line=3, adj=1.0, cex=1, col="grey") box("figure", col="grey") # The title will fit in the third line on the top of the graph. title("Ttitle - Third Line") # Note 'outer=TRUE' moves us from the figure to the outer margins. mtext("Outer Margin Area", side=1, line=1, cex=1.8, col="brown", outer=TRUE) mtext("par(oma=c(3,3,3,3))", side=1, line=2, cex=1, col="orange", outer=TRUE) mtext("Line 0", side=1, line=0, adj=0.0, cex=0.8, col="orange", outer=TRUE) mtext("Line 1", side=1, line=1, adj=0.0, cex=1, col="orange", outer=TRUE) mtext("Line 2", side=1, line=2, adj=0.0, cex=1, col="orange", outer=TRUE) box("outer", col="orange") @ \pagebreak \subsection*{} \begin{center} <>= <> @ \end{center} % ----------------------------------------------------------------------------- \pagebreak \subsection{Character Table} \begin{center} \begin{figure}[h] \includegraphics[width=\textwidth]{characterTableFig.pdf} \end{figure} \end{center} % ----------------------------------------------------------------------------- \pagebreak \subsection{Color Table} \begin{center} \begin{figure}[h] \includegraphics[width=\textwidth]{colorTableFig.pdf} \end{figure} \end{center} % ----------------------------------------------------------------------------- \pagebreak \subsection{Color Palettes I} \medskip \begin{center} \begin{figure}[h] \includegraphics[width=\textwidth]{colorPalettes1Fig.pdf} \end{figure} \end{center} \pagebreak \subsection{Color Palettes II} \medskip \begin{center} \begin{figure}[h] \includegraphics[width=\textwidth]{colorPalettes2Fig.pdf} \end{figure} \end{center} % ----------------------------------------------------------------------------- \pagebreak \subsection{Symbol Table} \begin{center} \begin{figure}[h] \includegraphics[width=\textwidth]{symbolTableFig.pdf} \end{figure} \end{center} % ----------------------------------------------------------------------------- \pagebreak \subsection{Axis Style "pretty"} <>= FORMAT <- tS1@format FORMAT POSITIONS <- pretty(tS1) POSITIONS LABELS <- pretty(tS1) LABELS @ % ----------------------------------------------------------------------------- \pagebreak \subsection{Axis Style "chic"} <>= axTicksByTime <- function (x, ticks.on = "auto", k = 1, labels = TRUE, format.labels = TRUE, ends = TRUE, gt = 2, lt = 30) { if (timeBased(x)) x <- xts(rep(1, length(x)), x) tick.opts <- c("years", "months", "weeks", "days", "hours", "minutes", "seconds") tick.k.opts <- c(10, 5, 2, 1, 6, 1, 1, 1, 4, 2, 1, 30, 15, 1, 1) if (ticks.on %in% tick.opts) { cl <- ticks.on[1] ck <- k } else { tick.opts <- paste(rep(tick.opts, c(4, 2, 1, 1, 3, 3, 1)), tick.k.opts) is <- structure(rep(0, length(tick.opts)), .Names = tick.opts) for (i in 1:length(tick.opts)) { y <- strsplit(tick.opts[i], " ")[[1]] ep <- endpoints(x, y[1], as.numeric(y[2])) is[i] <- length(ep) - 1 if (is[i] > lt) break } nms <- rev(names(is)[which(is > gt & is < lt)])[1] cl <- strsplit(nms, " ")[[1]][1] ck <- as.numeric(strsplit(nms, " ")[[1]][2]) } if (is.null(cl)) ep <- NULL else ep <- endpoints(x, cl, ck) if (ends) ep <- ep + c(rep(1, length(ep) - 1), 0) if (labels) { if (is.logical(format.labels) || is.character(format.labels)) { unix <- ifelse(.Platform$OS.type == "unix", TRUE, FALSE) time.scale <- periodicity(x)$scale fmt <- ifelse(unix, "%n%b%n%Y", "%b %Y") if (time.scale == "weekly" | time.scale == "daily") fmt <- ifelse(unix, "%b %d%n%Y", "%b %d %Y") if (time.scale == "minute" | time.scale == "hourly") fmt <- ifelse(unix, "%b %d%n%H:%M", "%b %d %H:%M") if (time.scale == "seconds") fmt <- ifelse(unix, "%b %d%n%H:%M:%S", "%b %d %H:%M:%S") if (is.character(format.labels)) fmt <- format.labels names(ep) <- format(index(x)[ep], fmt) } else { names(ep) <- as.character(index(x)[ep]) } ep } } @ <>= ticks <- axTicksByTime(as.xts(tS1)) ticks @ % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \pagebreak \section*{About the Authors} % ----------------------------------------------------------------------------- % Diethelm Wuertz \noindent\textbf{Diethelm W\"urtz} is professor at the Institute for Theoretical Physics, ITP, and for the Curriculum Computational Science and Engineering, CSE, at the Swiss Federal Institute of Technology in Zurich. He teaches Econophysics at ITP and supervises seminars in Financial Engineering. Diethelm is senior partner of Finance Online, an ETH spin-off company in Zurich, and co-founder of the Rmetrics Association in Zurich.\\ % ----------------------------------------------------------------------------- % Tobias Setz \noindent \textbf{Tobias Setz} has a Bachelor and Master in Computational Science from ETH in Zurich and has contributed with his Thesis projects on wavelet analytics and Bayesian change point analytics to this handbook. He is now a PhD student in the Econophysics group at ETH Zurich at the Institute for Theoretical Physics.\\ % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \pagebreak \section*{About Rmetrics} \noindent\emph{Rmetrics Open Source Project} With hundreds of functions built on modern methods, the Rmetrics open source software combines exploratory data analysis, statistical modelling and rapid model prototyping. The R/Rmetrics packages are embedded in R, building an environment which creates a first class system for applications in teaching statistics and finance. Rmetrics covers Time Series Econometrics, Hypothesis Testing, GARCH Modelling and Volatility Forecasting, Extreme Value Theory and Copulae, Pricing of Derivatives, Portfolio Analysis, Design and Optimization, and much more. \noindent\emph{The Rmetrics Association}\\ is a non-profit taking association working in the public interest. The Rmetrics Association provides support for innovations in financial computing. We believe that the Rmetrics Open Source software has become a valuable educational tool and that it is worth ensuring its continued development and the development of future innovations in software for statistical and computational research in finance. Rmetrics provides a reference point for individuals and institutions that want to support or interact with the Rmetrics development community. Rmetrics encourages students to participate in Rmetrics' activities in the context of Student Internships. \noindent\emph{Rmetrics Software Evalution}\\ If you like to get an impression of the size and quality of the Open Source Rmetrics Program have a look on the Ohloh Rmetrics Software Evaluation. The Evalutions gives an overview about the Software Development (Code Analysis, Estimated Cost), the people behind it, and its community. \noindent\emph{Contributions to Rmetrics}\\ are coming from several educuational institutions world wide. These include the Rmetrics web site and documentation project supported by ITP/CSE ETH Zurich, the organization of Summerschools and Workshops supported by ITP/CSE ETH Zurich, the R-sig-Finance Help and Mailing List, supported by SfS ETH Zurich, the R-forge development server, supported by University of Economics in Vienna, CRAN Test and Distribution Server for R software, supported by University of Economics Vienna, the Debian Linux integration supported by the Debian Association. Many thanks to all behind these projects who gave us continuous support over the last years.\\ \noindent Rmetrics Association\\ www.rmetrics.org % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \pagebreak % References \begin{thebibliography}{99} \bibitem{zoo} Achim Zeileis and Gabor Grothendieck (2005): \emph{ zoo: S3 Infrastructure for Regular and Irregular Time Series.} Journal of Statistical Software, 14(6), 1-27. URL http://www.jstatsoft.org/v14/i06/ \bibitem{tseries} Adrian Trapletti and Kurt Hornik (2007): \emph{tseries: Time Series Analysis and Computational Finance.} R package version 0.10-11. \bibitem{rmetrics} Diethelm W\"urtz et al. (2007): \emph{Rmetrics: Rmetrics - Financial Engineering and Computational Finance.} R package version 260.72. http://www.rmetrics.org \bibitem{ISO} International Organization for Standardization (2004): \emph{ISO 8601: Data elements and interchage formats --- Information interchange --- Representation of dates and time} URL http://www.iso.org \bibitem{R} R Development Core Team: \emph{R: A Language and Environment for Statistical Computing}, R Foundation for Statistical Computing, Vienna, Austria. ISBN 3-900051-07-0, URL http://www.R-project.org \bibitem{quantmod} Jeffrey A. Ryan (2008): \emph{quantmod: Quantitative Financial Modelling Framework.} R package version 0.3-5. URL http://www.quantmod.com URL http://r-forge.r-project.org/projects/quantmod \end{thebibliography} \end{document} timeSeries/R/0000755000176200001440000000000014550715335012574 5ustar liggesuserstimeSeries/R/AllClass.R0000755000176200001440000001272514263246022014420 0ustar liggesusers# # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # A copy of the GNU General Public License is available at # ../../COPYING ################################################################################ # CLASS: REPRESENTATION: # setClass Classify 'timeSeries' # setValidity Validate 'timeSeries' # setMethod Initialize 'timeSeries' ################################################################################ # CLASS: REPRESENTATION: # 'signalSeries' Deprecated S4 Class representation # 'timeSeries' Deprecated S4 Class representation ################################################################################ # YC: Note if slots are added or removed, don't forget to edit # getDataPart,timeSeries-method and setDataPart,timeSeries-method !! setClass("timeSeries", representation(.Data = "matrix", units = "character", positions = "numeric", format = "character", FinCenter = "character", recordIDs = "data.frame", title = "character", documentation = "character"), contains = "structure", prototype(matrix(NA), units = character(0), positions = numeric(0), format = character(0), FinCenter = character(0), recordIDs = data.frame(), title = character(0), documentation = character(0))) # ------------------------------------------------------------------------------ .validity_timeSeries <- function(object) { if ((length(object@positions) > 0) && NROW(object) != length(object@positions)) return("length of '@positions' not equal to '@.Data' extent") if (NCOL(object) != length(object@units)) return("length of '@units' not equal to '@.Data' extent") if (NROW(object@recordIDs) > 0 & NROW(object@recordIDs) != nrow(object)) return("length of '@recordIDs' not equal to '@.Data' extent") # Return Value: TRUE } setValidity("timeSeries", .validity_timeSeries) # ------------------------------------------------------------------------------ # Note it is faster to assign manually all slots of the timeSeries objects. setMethod("initialize", "timeSeries", function(.Object, .Data = new("matrix"), units = character(0), positions = numeric(0), format = character(0), FinCenter = "", #<< FIXME: use identical in code rather than FinCenter == "" recordIDs = data.frame(), title = character(0), documentation = character(0)) { # as.double -> crucial for speed improvement in subsetting if (!is.double(positions)) positions <- as.double(positions) .Object <- timeSeries::setDataPart(.Object, value = .Data) `slot<-`(.Object, "units", value = units) `slot<-`(.Object, "positions", value = positions) `slot<-`(.Object, "format", value = format) `slot<-`(.Object, "FinCenter", value = FinCenter) `slot<-`(.Object, "recordIDs", value = recordIDs) `slot<-`(.Object, "title", value = title) `slot<-`(.Object, "documentation", value = documentation) # Check only one we needs rather than using validObject anyStrings <- function(x) if (identical(x, TRUE)) character() else x error <- anyStrings(.validity_timeSeries(.Object)) if (length(error) > 0) stop(paste("Initialize timeSeries :", error, collapse = "\n"), call. = FALSE, domain = NA) # Return Value: .Object }) ################################################################################ ## setClass("signalSeries", ## representation( ## .Data = "matrix", ## units = "character", ## recordIDs = "data.frame", ## title = "character", ## documentation = "character"), ## contains = "structure", ## validity = function(object) { ## if (NCOL(getDataPart(object)) != length(object@units)) ## return("length of '@units' not equal to '@.Data' extent") ## TRUE ## }) ## # ------------------------------------------------------------------------------ ## setClass("timeSeries", ## representation(positions = "numeric", ## format = "character", ## FinCenter = "character"), ## contains = "signalSeries", ## validity = function(object) { ## if (NROW(getDataPart(object)) != length(object@positions)) ## return("length of '@positions' not equal to '@.Data' extent") ## if (NCOL(getDataPart(object)) != length(object@units)) ## return("length of '@units' not equal to '@.Data' extent") ## TRUE ## }) ################################################################################ timeSeries/R/methods-plot.R0000644000176200001440000004014514550214103015325 0ustar liggesusers# # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # A copy of the GNU General Public License is available at # ../../COPYING ################################################################################ # FUNCTION: DESCRIPTION: # plot,timeSeries Plots a 'timeSeries' object # .plot.timeSeries Internal function called by plot.timeSeries # lines,timeSeries Adds lines to a 'timeSeries' plot # points,timeSeries Adds points to a 'timeSeries' plot # FUNCTION: DESCRIPTION: # pretty.timeSeries Returns a sequence of equally spaced round values ################################################################################ ## 2024-01-11 GNB: streamlined S4/S3 combination ## ## Keeping .plot.timeSeries for now since cached plot methods for timeSeries in fGarch, ## fBasics built with previous version of timeSeries cause test failure in fExtremes ## because .plot.timeSeries is not found! Took me some time to figure this out. ## ## To remove .plot.timeSeries will need to rebuild at least some of the above packages with ## this version of timeSeries. Alternatively, new releases of those packages could require ## this version of timeSeries. Or maybe ask CRAN to rebuild those packages with this ## version of R? Indeed, this is the case. Actually, it seems not necessary to rebuild ## fExtremes (which is good, I don't manage it), it looks like the imported offending ## method comes from fGarch (which defines plot methods and exports them. ## ## To summarize: keep .plot.timeSeries for now, remove it when the above packages are ## updated and/or rebuilt with timeSeries > 4032.108. Preferably, updated versions of those ## packages would require timeSeries > 4032.108. .plot.timeSeries <- plot.timeSeries <- function(x, y, FinCenter = NULL, plot.type = c("multiple", "single"), format = "auto", at = pretty(x), widths = 1, heights = 1, xy.labels, xy.lines, panel = lines, nc, yax.flip = FALSE, mar.multi = c(0, 5.1, 0, if (yax.flip) 5.1 else 2.1), oma.multi = c(6, 0, 5, 0), axes = TRUE, ...) { # A function implemented by Diethelm Wuertz and Yohan Chalabi # Description: # Plots 'timeSeries' objects # Arguments: # see plot.ts() # Additional Arguments: # format, at to beautify axis.POSIXct() function # widths, heights to handle layout() function # Details: # This function is build in exactly the same way as the function # plot.ts() for regular time series (R's ts) objects... # Examples: # x = as.timeSeries(data(msft.dat))[, 1:4] # .plot.timeSeries(x) # .plot.timeSeries(x[,1], x[,2], pch = 19) # .plot.timeSeries(x, plot.type = "single", col = 2:5) # FUNCTION: # Check Missing: if (missing(y)) y <- NULL # Check for "pretty' and "chic": if (is.character(at)) { if (at[1] == "pretty" || at[1] == "chic") { return(.xtplot.timeSeries( x=x, y=y, FinCenter = FinCenter, plot.type = plot.type, format = format, at = at, panel = panel, yax.flip = yax.flip, mar.multi = mar.multi, oma.multi = oma.multi, axes=axes, ...) ) } } # Labels: xlabel <- if (!missing(x)) deparse(substitute(x)) ylabel <- if (!missing(y)) deparse(substitute(y)) # Take care of FinCenter: if (!is.null(FinCenter)) { finCenter(x) <- FinCenter if (!is.null(y)) finCenter(y) <- FinCenter if (is(at, "timeDate")) at@FinCenter <- FinCenter } # Return Value: .plotTimeSeries(x = x, y = y, plot.type = plot.type, xy.labels = xy.labels, xy.lines = xy.lines, panel = panel, nc = nc, xlabel = xlabel, ylabel = ylabel, axes = axes, mar.multi = mar.multi, oma.multi = oma.multi, yax.flip = yax.flip, format = format, at = at, widths = widths, heights = heights, ...) } ## setMethod("plot", "timeSeries", ## function(x, y, FinCenter = NULL, ## plot.type = c("multiple", "single"), ## format = "auto", at = pretty(x), ## widths = 1, heights = 1, ## xy.labels, xy.lines, panel = lines, nc, yax.flip = FALSE, ## mar.multi = c(0, 5.1, 0, if (yax.flip) 5.1 else 2.1), ## oma.multi = c(6, 0, 5, 0), axes = TRUE, ...) ## .plot.timeSeries(x = x, y = y, FinCenter = FinCenter, ## plot.type = plot.type, ## format = format, at = at, ## widths = widths, heights = heights, ## xy.labels=xy.labels, xy.lines=xy.lines, ## panel = panel, nc = nc, yax.flip = yax.flip, ## mar.multi = mar.multi, ## oma.multi = oma.multi, axes = axes, ...)) setMethod("plot", "timeSeries", plot.timeSeries) ## # until UseMethod dispatches S4 methods in 'base' functions ## plot.timeSeries <- function(x, y, ...) .plot.timeSeries(x, y, ...) # ------------------------------------------------------------------------------ # Internal Function called by plot(): .plotTimeSeries <- function(x, y = NULL, plot.type = c("multiple", "single"), xy.labels, xy.lines, panel = lines, nc, xlabel, ylabel, type = "l", xlim = NULL, ylim = NULL, xlab = "Time", ylab, log = "", col = 1:ncol(x), bg = NA, pch = 1:ncol(x), cex = par("cex"), lty = par("lty"), lwd = par("lwd"), axes = TRUE, frame.plot = axes, ann = par("ann"), main = NULL, mar.multi, oma.multi, yax.flip, format, at, widths, heights, grid = FALSE, ...) { # A function implemented by Diethelm Wuertz and Yohan Chalabi # Description: # Plots timeSeries objects - Internal Function # Details: # A modified copy of R's internal 'plotts()' function, # see 'plot.ts()'. # FUNCTION: # Utility Function: plot.type <- match.arg(plot.type) nser <- NCOL(x) if (format == "auto") format = x@format X <- if (x@format == "counts") time(x) else as.POSIXct(time(x)) if (is.character(at) && identical(at, "auto")) { # Index = round(seq(1, length(time(x)), length = 6)) # at = X[Index] at = seq(X[1], X[length(X)], length = 6) } if(is(at, "timeDate")) at = as.POSIXct(at) # YC : force col and pch to be of same length as NCOL(x) otherwise # time series might not be plotted at all. col <- rep(col, length.out = nser) pch <- rep(pch, length.out = nser) # Multiple Plots, each one Curve, on one Page: if (plot.type == "multiple" && nser > 1) { ngraph = nser panel <- match.fun(panel) nser <- NCOL(x) if (nser > 10) stop("cannot plot more than 10 series as \"multiple\"") if (is.null(main)) main <- xlabel nm <- colnames(x) if (is.null(nm)) nm <- paste("Series", 1:nser) if (missing(nc)) nc <- if (nser > 4) 2 else 1 nr <- ceiling(nser/nc) oldpar <- par(mar = mar.multi, oma = oma.multi, mfcol = c(nr, nc)) on.exit(par(oldpar)) nr <- ceiling(ngraph/nc) layout(matrix(seq(nr * nc), nr), widths = widths, heights = heights) for (i in 1:nser) { plot(X, series(x)[, i], axes = FALSE, xlab = "", ylab = "", log = log, col = col[i], bg = bg, pch = pch[i], ann = ann, type = "n", ...) panel(X, series(x)[, i], col = col[i], bg = bg, pch = pch[i], type = type, ...) if (frame.plot) box(...) y.side <- if (i%%2 || !yax.flip) 2 else 4 do.xax <- i%%nr == 0 || i == nser if (axes) { axis(y.side, xpd = NA) if (do.xax) { if (x@format == "counts") { axis(1) } else { axis.POSIXct(1, at = at, format = format) } } } if (ann) { mtext(nm[i], y.side, line = 3, ...) if (do.xax) mtext(xlab, side = 1, line = 3, ...) } if(grid) abline(v = at, lty = 3, col = "grey") } if (ann && !is.null(main)) { par(mfcol = c(1, 1)) cex.main = par("cex.main") font.main = par("font.main") col.main = par("col.main") mtext(main, side = 3, line = 3, cex = cex.main, font = font.main, col = col.main, ...) } return(invisible()) } # Scatter Plot: if (!is.null(y)) { stopifnot(isUnivariate(x)) stopifnot(isUnivariate(y)) xy = cbind(x, y) xy <- xy.coords(series(xy)[, 1], series(xy)[, 2], xlabel, ylabel, log) xlab <- if (missing(xlab)) xy$xlab else xlab ylab <- if (missing(ylab)) xy$ylab else ylab xlim <- if (is.null(xlim)) range(xy$x[is.finite(xy$x)]) else xlim ylim <- if (is.null(ylim)) range(xy$y[is.finite(xy$y)]) else ylim n <- length(xy$x) if (missing(xy.labels)) xy.labels <- (n <= 150) if (!is.logical(xy.labels)) { if (!is.character(xy.labels)) stop("'xy.labels' must be logical or character") do.lab <- TRUE } else { do.lab <- xy.labels } ptype <- if (do.lab) "n" else if (missing(type)) "p" else type plot.default(xy, type = ptype, xlab = xlab, ylab = ylab, xlim = xlim, ylim = ylim, log = log, col = col, bg = bg, pch = pch, axes = axes, frame.plot = frame.plot, ann = ann, main = main, ...) if (missing(xy.lines)) { xy.lines <- do.lab } if (do.lab) text(xy, labels = if (is.character(xy.labels)) xy.labels else seq_along(xy$x), col = col, cex = cex) if (xy.lines) { type = if (do.lab) "c" else "l" lines(xy, col = col, lty = lty, lwd = lwd, type = type) } return(invisible()) } # Multiple Curves all in one Plot, on one Page: if (missing(ylab)) { ylab <- colnames(x) if (length(ylab) != 1) ylab <- xlabel } if (is.null(ylim)) ylim <- range(x, na.rm = TRUE) i = 1 X <- if (x@format == "counts") time(x) else as.POSIXct(time(x)) plot(X, series(x)[, i], ylim = ylim, col = col[(i - 1)%%length(col) + 1], lty = lty[(i - 1)%%length(lty) + 1], lwd = lwd[(i - 1)%%length(lwd) + 1], bg = bg[(i - 1)%%length(bg) + 1], pch = pch[(i - 1)%%length(pch) + 1], type = type, axes = FALSE, ylab = "", xlab = "") if (NCOL(x) > 1) for (i in 2:NCOL(x)) lines(X, series(x)[, i], col = col[(i - 1)%%length(col) + 1], lty = lty[(i - 1)%%length(lty) + 1], lwd = lwd[(i - 1)%%length(lwd) + 1], bg = bg[(i - 1)%%length(bg) + 1], pch = pch[(i - 1)%%length(pch) + 1], type = type) if (ann) title(main = main, xlab = xlab, ylab = ylab, ...) if (axes) { if (x@format == "counts") axis(1, ...) else axis.POSIXct(1, at = at, format = format) axis(2, ...) } if (frame.plot) box(...) if(grid) abline(v = at, lty = 3, col = "grey") return(invisible()) } # ------------------------------------------------------------------------------ ## GNB: 2024-01-11 GNB: streamlined and removed the S4 method lines.timeSeries <- function(x, FinCenter = NULL, ...) { # A function implemented by Diethelm Wuertz and Yohan Chalabi # Description: # NEW lines method for an object of class "timeSeries" # Arguments: # x - a "timeSeries" object # Example: # plot(MSFT[, 1]); lines(MSFT[, 1], col = "red") # FUNCTION: # Change FinCenter: if (!is.null(FinCenter)) finCenter(x) <- FinCenter # Lines: positions <- time(x) if (x@format == "counts") { lines(x = positions, y = series(x), ...) } else { lines(x = as.POSIXct(positions), y = series(x), ...) } # Return Value: invisible(x) } ## GNB: 2024-01-11 GNB: streamlined and removed the S4 method ## setMethod("lines", "timeSeries", function(x, FinCenter = NULL, ...) ## .lines.timeSeries(x, FinCenter, ...)) ## ## # until UseMethod dispatches S4 methods in 'base' functions ## lines.timeSeries <- function(x, FinCenter = NULL, ...) ## .lines.timeSeries(x, FinCenter = FinCenter, ...) # ------------------------------------------------------------------------------ ## GNB: 2024-01-11 GNB: streamlined and removed the S4 method points.timeSeries <- function(x, FinCenter = NULL, ...) { # A function implemented by Diethelm Wuertz and Yohan Chalabi # Description: # Plot method for an object of class "timeSeries" # Arguments: # x - a "timeSeries" object # Value: # Plots a 'timeSeries' object. # FUNCTION: # Change FinCenter: if (!is.null(FinCenter)) finCenter(x) <- FinCenter # Points: positions <- time(x) if (x@format == "counts") { points(x = positions, y = series(x), ...) } else { points(x = as.POSIXct(positions), y = series(x), ...) } # Return Value: invisible(x) } ## GNB: 2024-01-11 GNB: streamlined and removed the S4 method ## setMethod("points", "timeSeries", ## function(x, FinCenter = NULL, ...) ## .points.timeSeries(x, FinCenter = FinCenter, ...)) ## ## # until UseMethod dispatches S4 methods in 'base' functions ## points.timeSeries <- function(x, FinCenter = NULL, ...) ## .points.timeSeries(x, FinCenter = FinCenter, ...) ################################################################################ pretty.timeSeries <- function(x, n = 5, min.n = n%/%3, shrink.sml = 0.75, high.u.bias = 1.5, u5.bias = 0.5 + 1.5 * high.u.bias, eps.correct = 0, ...) { # A function implemented by Diethelm Wuertz # Description: # Returns a sequence of equally spaced round values. # Details: # Computes a sequence of about n+1 equally spaced ?round? # values which cover the range of the values in x. # The values are chosen so that they are 1, 2 or 5 times # a power of 10. # Arguments: # x - a timeSeries object from which the time is # extracted # n - integer giving the desired number of intervals. # min.n - nonnegative integer giving the minimal # number of intervals. # shrink.sml - positive numeric by a which a default # scale is shrunk in the case when range(x) is # very small. # high.u.bias - non-negative numeric, typically > 1. # Larger high.u.bias values favor larger units. # u5.bias - non-negative numeric multiplier favoring # factor 5 over 2. # eps.correct - integer code, one of {0,1,2}. If # non-0, a correction is made at the boundaries. # ... - further arguments for methods. # FUNCTION: td <- time(x) if (inherits(x, "timeDate")) { x <- as.POSIXct(td) as.timeDate(pretty(x, n=n, min.n=min.n, shrink.sml=shrink.sml, high.u.bias=high.u.bias, u5.bias=u5.bias, eps.correct=eps.correct, ...)) } else { #-> signal series pretty(td) } } ############################################################################### timeSeries/R/utils-structure.R0000644000176200001440000000453714546002721016117 0ustar liggesusers# # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # A copy of the GNU General Public License is available at # ../../COPYING ################################################################################ # FUNCTION: DESCRIPTION: # str,timeSeries Displays the structure of a 'timeSeries' object ################################################################################ str.timeSeries <- function(object, ...) { # A function implemented by Diethelm Wuertz and Yohan Chalabi # Description: # Displays the structure of a 'timeSeries' object. # Arguments: # object - an object of class 'timeSeries'. # ... - # FUNCTION: # Series Name: cat("Time Series: ") cat("\n Name: ", as.character(c(substitute(object)))) # YC : as.character(c( important to handle str(timeSeries()) # Data Matrix: Dim = dim(object) cat("\nData Matrix: ") cat("\n Dimension: ", Dim) cat("\n Column Names: ", colnames(object) ) firstName = rownames(object)[1] lastName = rownames(object)[Dim[1]] cat("\n Row Names: ", firstName, " ... ", lastName) # Date/Time Positions: cat("\nPositions: ") cat("\n Start: ", as.character(start(object))) cat("\n End: ", as.character(end(object))) # Other Attributes: cat("\nWith: ") cat("\n Format: ", object@format) cat("\n FinCenter: ", object@FinCenter) cat("\n Units: ", object@units) cat("\n Title: ", object@title) cat("\n Documentation: ", object@documentation) cat("\n") # Return Value: invisible() } ## setMethod("str", "timeSeries", ## function(object, ...) .str.timeSeries(object, ...)) ################################################################################ timeSeries/R/timeSeries-slotFinCenter.R0000755000176200001440000000610714263246022017605 0ustar liggesusers # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # A copy of the GNU General Public License is available at # ../../COPYING ################################################################################ # FUNCTION: DESCRIPTION: # finCenter,timeSeries Get financial center slot from a 'timeSeries' # finCenter<-,timeSeries Set financial center slot from a 'timeSeries' # FUNCTION: DESCRIPTION: # getFinCenter Get financial center slot from a 'timeSeries' # setFinCenter<- Set new financial center slot from a 'timeSeries' ################################################################################ setMethod("finCenter", "timeSeries", function(x) { # A function implemented by Yohan Chalabi and Diethelm Wuertz # Description: # Get financial center slot from a 'timeSeries' object # Arguments: # x - an object of class 'timeSeries' # FUNCTION: # Extract financial center: ans <- x@FinCenter # Return Value: ans }) # ------------------------------------------------------------------------------ setMethod("finCenter<-", "timeSeries", function(x, value) { # A function implemented by Yohan Chalabi and Diethelm Wuertz # Description: # Set financial center slot from a 'timeSeries' object # Arguments: # x - an object of class 'timeSeries' # value - a character string, setting the name of the financial # center. # FUNCTION: # Check: if (x@format == "counts") stop(as.character(match.call())[1], " is for time series and not for signal series.") # Convert to user financial centre: positions <- timeDate(charvec = time(x), zone = finCenter(x), FinCenter = value) # Assign Positions to Time Stamps: time(x) <- positions # Return Value: x }) ################################################################################ getFinCenter <- function(x) { # Description: # Get financial center slot from a 'timeSeries' object # Arguments: # x - a 'timeSeries' object # FUNCTION: # Return Value: finCenter(x) } # ------------------------------------------------------------------------------ "setFinCenter<-" <- function(x, value) { # Description: # Set new financial center slot from a 'timeSeries' object # FUNCTION: # Arguments: # x - a 'timeSeries' object # Assign Financial Center Slot: finCenter(x) <- value # Return Value: x } ################################################################################ timeSeries/R/fin-returns.R0000644000176200001440000001144214546277024015200 0ustar liggesusers# # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # A copy of the GNU General Public License is available at # ../../COPYING ################################################################################ # FUNCTION: DESCRIPTION: # returns,ANY Computes returns from a 'matrix' object # returns,timeSeries Computes returns from a 'timeSeries' object # FUNCTION: DESCRIPTION: # returns0 Compute untrimmed returns # OLD FUNCTIONS: KEEP THESE FUNCTIONS FOR COMPATIBILITY: # returnSeries Deprecated, use returns() # getReturns Deprecated, use returns() ################################################################################ setMethod("returns", "ANY", function(x, method = c("continuous", "discrete", "compound", "simple"), percentage = FALSE, ...) { # A function implemented by Diethelm Wuertz and Yohan Chalabi # Description: # Computes returns from a 'matrix' object # Arguments: # x - data object containing ordered price observations # method - "continuous == "compound" and "discrete" == "simple" # percentage # Note: # To make it conform with PortfolioAnalytics: # "compound" == "continuous" # "simple" == "discrete" # FUNCTION: # Settings: method <- match.arg(method) # Calculate Returns: data <- as.matrix(x) positions <- time(x) if(method == "compound" || method == "continuous") { data <- rbind( data[1, , drop = FALSE]*NA, apply(log(data), 2, diff)) } if(method == "simple" || method == "discrete") { data <- apply(rbind(data, NA*data[1,]), 2, diff) / data data <- rbind(data[1, , drop = FALSE]*NA, data) data <- data[-(length(positions) + 1), , drop = FALSE] } if (percentage) data <- 100*data # Return Value: data } ) # ----------------------------------------------------------------------------- setMethod("returns", "timeSeries", function(x, method = c("continuous", "discrete", "compound", "simple"), percentage = FALSE, na.rm = TRUE, trim = TRUE, ...) { # A function implemented by Diethelm Wuertz and Yohan Chalabi # Description: # Returns the returns of an object of class 'timeSeries' # Arguments: # x - an object of class 'timeSeries' # method - # percentage - # na.rm - # trim - # FUNCTION: # Check Arguments: stopifnot(is.timeSeries(x)) # Extract Title and Documentation: Title <- x@title Documentation <- x@documentation # Make sure that series is ordered: x <- sort(x) # Get Returns: if (na.rm) x <- na.omit(x, ...) series(x) <- returns(as(x, "matrix"), method, percentage) if (trim) x <- na.omit(x, "r") # Preserve Title and Documentation: x@title <- Title x@documentation <- Documentation # Return Value: x } ) ############################################################################### returns0 <- function(x, ...) { # A function implemented by Diethelm Wuertz # Description: # Returns the untrimmed returns of an object of class 'timeSeries' # Arguments: # x - an object of class 'timeSeries' # FUNCTION: # Compute Untrimmed Returns: x <- returns(x = x, trim = FALSE) x[1, ] <-0 # Return Value: x } ############################################################################### # DEPRECATED: ## returnSeries <- ## function(...) ## { ## # A function implemented by Diethelm Wuertz ## ## # FUNCTION: ## # .Deprecated("returns", "timeSeries") ## ## returns(...) ## } # ----------------------------------------------------------------------------- ## TODO: remove when fTrading is updated, see note in file NAMESPACE getReturns <- function(...) { # A function implemented by Diethelm Wuertz # Description: # Computes returns # FUNCTION: # .Deprecated("returns", "timeSeries") # Return Value: returns(...) } ############################################################################### timeSeries/R/stats-na.omit.R0000644000176200001440000002540114546272667015435 0ustar liggesusers# # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # A copy of the GNU General Public License is available at # ../../COPYING ################################################################################ # FUNCTION: DESCRIPTION: # na.omit,timeSeries Handles missing values in objects # .naOmitMatrix Internal function called from na.omit.timeSeries # OLD FUNCTIONS: DESCRIPTION: # removeNA Remove NAs from a matrix object # substituteNA Substitute NAs by zero, the column mean or median # interpNA Interpolate NAs using R's "approx" function ################################################################################ # DW: # I think we should deprecate the following functions: # removeNA, substituteNA, and interpNA since the function # na.omit() can already handle all these cases. # DW: # note we do interpolation with approx(), zoo also offers # interpolation by splines, we should also add this. ################################################################################ ## 2023-05-28 GNB: added argument 'FUN' ## 2024-06-01 GNB: renamed .na.omit.timeSeries to na.omit.timeSeries; ## dropped the S4 method na.omit.timeSeries <- function(object, method = c("r", "s", "z", "ir", "iz", "ie"), interp = c("before", "linear", "after"), FUN, ...) { # Description # Handles NAs in timeSeries objects # Details: # Linear Interpolation is done by the function approx. # Spline interpolation like in zoo is not yet supported. # Arguments: # object - an object of class 'timeSeries' # method - how to handle NAs # interp - how to interpolate NAs # ... - arguments passed to function approx() # FUNCTION: # Check Arguments: stopifnot(is.timeSeries(object)) # Extract Title and Documentation: Title <- object@title Documentation <- object@documentation # Settings: method <- match.arg(method) interp <- match.arg(interp) # Skip ? if (method == "s") return(object) if(!missing(FUN)) { # GNB FUN <- match.fun(FUN) data <- object@.Data data <- apply(data, 2, function(z) { z[is.na(z)] = FUN(z, na.rm = TRUE) z }) object@.Data <- data return(object) } # Handle NAs: if (method == "r") { # Remove NAs: # DW: # object <- stats:::na.omit.default(object) object <- as.timeSeries(na.omit(series(object))) } else if (method == "z") { # Substitute NAs by Zero's: object[is.na(object)] <- 0 } else if (substr(method, 1, 1) == "i") { # Interpolate: interp = match.arg(interp) f = 0 if (interp == "before") { interp = "constant" f = 0 } if (interp == "after") { interp = "constant" f = 1 } n = nrow(object) for (i in 1:ncol(object)) { y = object[, i] idy = (1:n)[!is.na(y)] ## DW: ... added # Linear/Constant Interpolation: y = approx(x = idy, y = y[idy], xout = 1:n, method = interp, f = f, ...)$y object[, i] = y } modID = FALSE if (method == "ir") { # Remove Start and End NAs: # DW: # object <- stats:::na.omit.default(object) object <- as.timeSeries(na.omit(series(object))) } else if (method == "iz") { # Set Start and End NAs to Zero: object[is.na(object)] = 0 } else if (method == "ie") { n = nrow(object) for (k in 1:ncol(object)) { y = object[, k] if (NA %in% y) { start = sum(cumprod(is.na(y))) if (start > 0) for (i in start:1) y[i] = y[i+1] end = n+1 - sum(cumprod(rev(is.na(y)))) if (end <= n) for (i in end:n) y[i] = y[i-1] object[, k] = y } } } } # Handle recordIDs ... recordIDs <- object@recordIDs modID <- c(r = TRUE, z = FALSE, ir = TRUE, iz = FALSE, ie = FALSE) if(modID[method] > 0 && sum(dim(recordIDs)) > 0 ) { index <- attr(object, "n.action") recordIDs <- recordIDs[index, ] } # Preserve Title and Documentation: object@title <- Title object@documentation <- Documentation # Return Value: object } ## setMethod("na.omit", "timeSeries", function(object, ## method = c("r", "s", "z", "ir", "iz", "ie"), ## interp = c("before", "linear", "after"), FUN, ...) ## .na.omit.timeSeries(object, method, interp, FUN, ...)) ## # until UseMethod dispatches S4 methods in 'base' functions ## na.omit.timeSeries <- function(object, ...) .na.omit.timeSeries(object, ...) # ------------------------------------------------------------------------------ .naOmitMatrix <- function(object, method = c("r", "s", "z", "ir", "iz", "ie"), interp = c("before", "linear", "after")) { # Description: # Internal Function called from na.omit.timSeries() # Arguments: # FUNCTION: # Extract matrix: x = object stopifnot (is.matrix(x)) # Match Arguments: method <- match.arg(method) interp <- match.arg(interp) # Handle NAs: if (method == "r") { # Remove NAs: x <- na.omit(x) } else if (method == "z") { # Substitute NAs by Zero's: x[is.na(x)] <- 0 } else if (substr(method, 1, 1) == "i") { # Interpolate: interp = match.arg(interp) f = 0 if (interp == "before") { interp = "constant" f = 0 } if (interp == "after") { interp = "constant" f = 1 } n = nrow(x) for (i in 1:ncol(x)) { y = x[, i] idy = (1:n)[!is.na(y)] y = approx(idy, y[idy], 1:n, method = interp, f = f)$y x[, i] = y } modID = FALSE if (method == "ir") { # Remove Start and End NAs: x = na.omit(x) } else if (method == "iz") { # Set Start and End NAs to Zero: x[is.na(x)] = 0 } else if (method == "ie") { n = nrow(x) for (k in 1:ncol(x)) { y = x[, k] if (NA %in% y) { start = sum(cumprod(is.na(y))) if (start > 0) for (i in start:1) y[i] = y[i+1] end = n+1 - sum(cumprod(rev(is.na(y)))) if (end <= n) for (i in end:n) y[i] = y[i-1] x[, k] = y } } } } # Add Control: if (substr(method, 1, 1) == "i") { attr(x, "control") = c(method = method, interp = interp) } else { attr(x, "control") = c(method = method) } # Return Value: x } ################################################################################ removeNA <- function (x, ...) { # A function implemented by Diethelm Wuertz and Yohan Chalabi # Description: # Remove NA's from objects which can be transformed to a matrix # Arguments: # x - an object which can be transformed to a matrix # FUNCTION: .Deprecated("na.omit", package = "timeSeries", msg = c("'removeNA' is deprecated.\n", "Use 'na.omit' instead.", " See help('na.omit.timeSeries').\n")) # GNB na.omit(x, ...) } # ------------------------------------------------------------------------------ substituteNA <- function(x, type = c("zeros", "mean", "median"), ...) { # A function implemented by Diethelm Wuertz # Description: # Imputes missing data by zeros, the median or the # mean values of all matrix elements # Arguments: # x - an object which can be transformed to a matrix # type - method specifies the substitution method to be # used. Choices are "zeros", "mean", or "constant" # FUNCTION: .Deprecated("na.omit", msg = c("'substituteNA' is deprecated.\n", "Use 'na.omit' instead.", " See help('na.omit.timeSeries').\n")) # GNB if (!inherits(x, "matrix") && !inherits(x, "timeSeries")) x <- as(x, "matrix") # Type: type <- match.arg(type) ans <- switch(type, "zeros" = apply(x, 2, function(z) { z[is.na(z)] <- 0 z}), "median" = apply(x, 2, function(z) { z[is.na(z)] = median(z, na.rm = TRUE) z}), "mean" = apply(x, 2, function(z) { z[is.na(z)] = mean(z, na.rm = TRUE) z})) # Return Value: ans } # ------------------------------------------------------------------------------ interpNA <- function(x, method = c("linear", "before", "after"), ...) { # A function implemented by Diethelm Wuertz # Description: # Interpolates missing values in a matrix object # Arguments: # x - a numeric vector or time series object of class 'ts'. # method - the method how to interpolate the vector, one of # the applied vector strings: "linear", "before" or # after. # Details: # To interpolate the function 'approx' is used. # Value: # Returns a vector or time series object where the missing # values are interpolated. # FUNCTION: .Deprecated("na.omit", msg = c("'interpNA' is deprecated.\n", "Use 'na.omit' instead.", " See help('na.omit.timeSeries').\n")) # GNB if (!inherits(x, "matrix") && !inherits(x, "timeSeries")) x <- as(x, "matrix") # Internal Function: interpVectorNA <- function(x, method, f) { n <- length(x) idx <- (1:n)[!is.na(x)] x <- approx(idx, x[idx], 1:n, method = method, f = f)$y x} # Select Method: method = method[1]; f = 0 if (method == "before") { method = "constant" f = 0 } if (method == "after") { method = "constant" f = 1 } # For each Column: for (i in 1:ncol(x)) { x[, i] = interpVectorNA(x[, i], method, f) } # Return Value: x } ################################################################################ timeSeries/R/statistics-orderStatistics.R0000755000176200001440000000301614263246022020271 0ustar liggesusers# # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # A copy of the GNU General Public License is available at # ../../COPYING ################################################################################ # FUNCTION: DESCRIPTION: # orderStatistics Compute order statistic of a 'timeSeries' object ################################################################################ orderStatistics <- function(x) { # A function implemented by Diethelm Wuertz and Yohan Chalabi # Description: # Compute the order statistics for a 'timeSeries object # Value: # A named list with the order statistics for each column of # the inputted series. # FUNCTION: # Order Statistics: td <- time(x) # Return Value: mapply( function(cl, nm) { S <- sort(cl, index.return = TRUE) timeSeries(data = S$x, charvec = td[S$ix], units = nm)}, as.list(x), colnames(x), SIMPLIFY = FALSE) } ################################################################################ timeSeries/R/base-rank.R0000755000176200001440000000377014263246022014565 0ustar liggesusers# # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # A copy of the GNU General Public License is available at # ../../COPYING ################################################################################ # FUNCTION: COLUMN STATISTICS IN FUTILITIES: # rank,timeSeries Returns sample ranks of a 'timeSeries' object ################################################################################ setMethod("rank", "timeSeries", function(x, na.last = TRUE, ties.method = eval(formals(rank)$ties.method)) { # Description: # Returns the sample ranks of the values in a 'timeSeries' # Arguments: # x - an object of class 'timeSeries' # ties.method - # "average", replaces them by their mean, # "first" method results in a permutation with increasing # values at each index set of ties. # "random" method puts these in random order whereas the # default, # "max" and "min" replaces them by their maximum and minimum # respectively, the latter being the typical sports ranking. # Note: # Ties (i.e., equal values) and missing values can be handled # in several ways. # FUNCION: # Return Value: apply(x, 2, rank, na.last = na.last, ties.method = ties.method) } ) ################################################################################ timeSeries/R/methods-plot2.R0000755000176200001440000004700414322333453015422 0ustar liggesusers# # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # A copy of the GNU General Public License is available at # ../../COPYING ############################################################################### # FUNCTION: DESCRIPTION: # .xtplot.timeSeries Plots a 'timeSeries' object # ... support for at = c("pretty", "chic") ############################################################################### # FUNCTION: DESCRIPTION: # .xtsPlot Internal xts plot unitility # .axTicksByTime2 Takes care of "chic" axis creation # .endpoints2 ... determines appropriate axis end points # .periodicity2 ... determines appropriate axis periodicity # .colorwheelPalette ############################################################################### # .plot.timeSeries <- # function( # x, y, FinCenter = NULL, # plot.type = c("multiple", "single"), # format = "auto", at = pretty(x), # widths = 1, heights = 1, # xy.labels, xy.lines, panel = lines, nc, yax.flip = FALSE, # mar.multi = c(0, 5.1, 0, if (yax.flip) 5.1 else 2.1), # oma.multi = c(6, 0, 5, 0), axes = TRUE, ...) # x=dummyMonthlySeries(); y = NULL; FinCenter = NULL; plot.type = "s" # format = "auto"; at = "pretty"; panel = lines; yax.flip = FALSE # mar.multi = c(0, 5.1, 0, if (yax.flip) 5.1 else 2.1) # oma.multi = c(7.75, 1.1, 6.1, 1.1) # dots <- list() # y = NULL; FinCenter = NULL # plot.type = c("single", "multiple") # format = "auto"; at = c("pretty", "chic") # panel = lines; yax.flip = FALSE # mar.multi = c(0, 5.1, 0, if (yax.flip) 5.1 else 2.1) # oma.multi = c(7.75, 1.1, 6.1, 1.1) # axes = TRUE # ... <- NULL .xtplot.timeSeries <- function( x, y = NULL, FinCenter = NULL, plot.type = c("single", "multiple"), format = "auto", at = c("pretty", "chic"), panel = lines, yax.flip = FALSE, mar.multi = c(0, 5.1, 0, if (yax.flip) 5.1 else 2.1), oma.multi = c(7.75, 1.1, 6.1, 1.1), # oma.multi = c(6, 0, 5, 0), axes = TRUE, ...) { # A function implemented by Diethelm Wuertz # Description: # Plots timeSeries objects - Internal Function # Details: # A modified copy of R's internal 'plotts()' function, # see 'plot.ts()'. # FUNCTION: dots <- list(...) minor.ticks <- dots$minor.ticks %||% "auto" type <- dots$type %||% "l" col <- dots[["col"]] %||% { 1:NCOL(x) } pch <- dots$pch %||% 20 cex <- dots$cex %||% 1 lty <- dots$lty %||% 1 lwd <- dots[["lwd"]] %||% 1 grid <- dots$grid %||% TRUE col.grid <- dots$col.grid %||% "darkgrey" lwd.grid <- dots$lwd.grid %||% 1 frame.plot <- dots$frame.plot %||% TRUE ann <- dots$ann %||% TRUE cex.axis <- dots$cex.axis %||% 1 cex.lab <- dots$cex.lab %||% 1 cex.pch <- dots$cex.pch %||% 1 log <- dots$log %||% "" equilogs <- dots$equilogs %||% TRUE main <- dots$main %||% "" xlab <- dots$xlab %||% "" ylab <- dots$ylab %||% { cn <- colnames(x) if(length(cn) > 1 && (plot.type == "single" || plot.type == "s")) "Values" else cn } xax <- dots[["xax"]] %||% FALSE xaxs <- dots$xaxs %||% "r" yaxs <- dots$yaxs %||% "r" # Continue ... if (minor.ticks == "auto") minor.ticks <- .periodicity2(x)$units if (at[1] == "chic") minor.ticks <- TRUE if (format != "auto") minor.ticks <- TRUE # FinCenter - take care of it: if (!is.null(FinCenter)) { finCenter(x) <- FinCenter if (!missing(y)) finCenter(y) <- FinCenter if (is(at, "timeDate")) at@FinCenter <- FinCenter } # Plot Type: plot.type <- plot.type[1] if(isUnivariate(x)) plot.type <- "single" if(is.timeSeries(y)) plot.type <- "scatter" # Axis Positions and Format: AT <- at[1] FORMAT <- format[1] if (x@format == "counts") FORMAT <- "counts" # Decorations: # if (is.null(col)) col <- 1:ncol(x) # if (col[1] == 0) col = 1 else col <- .colorwheelPalette(ncol(x)) # if (is.null(pch)) pch <- 20 # if (is.null(cex)) cex <- 1 # if (is.null(lty)) lty <- 1 # if (is.null(lwd)) lwd <- 2 if(is.null(type[1])) type <- "l" if (length(type) == 1) type <- rep(type, times=NCOL(x)) if (length(col) == 1) col <- rep(col, times=NCOL(x)) if (length(pch) == 1) pch <- rep(pch, times=NCOL(x)) if (length(cex) == 1) cex <- rep(cex, times=NCOL(x)) if (length(lty) == 1) lty <- rep(lty, times=NCOL(x)) if (length(lwd) == 1) lwd <- rep(lwd, times=NCOL(x)) if (length(cex.pch) == 1) cex.pch <- rep(cex.pch, times=NCOL(x)) if (length(ylab) == 1) ylab <- rep(ylab, times=NCOL(x)) TIME <- time(x) if (is.integer(TIME)) { X <- TIME AT <- "counts" } else { X <- as.POSIXct(TIME) } Y <- series(x) if (AT == "pretty") { at <- pretty(x) } if (AT == "chic" ) { ep <- .axTicksByTime2(x, format=FORMAT) at <- TIME[ep] } # SINGLE PLOT: if (plot.type == "single" || plot.type == "s") { # All curves in one Frame: ylim <- dots$ylim %||% range(Y, na.rm=TRUE) xlim <- dots$xlim # even if it is NULL plot(X, Y[,1], type= "n", xlim = xlim, ylim = ylim, axes = FALSE, main = "", xlab = "", ylab = "", log=log, xaxs=xaxs, yaxs=yaxs) for (i in 1:ncol(x)) { lines(X, series(x)[, i], type = type[i], col = col[i], lty = lty[i], lwd = lwd[i], pch = pch[i], cex = cex.pch[i]) } if (ann) { title(main = main, xlab = xlab, ylab = ylab[1], cex.lab = cex.lab) } if (axes) { # Y - Axis: axis(2, cex.axis = cex.axis) } if (axes || xax) { # X - Axis: if (AT == "counts") { axis(1, cex.axis = cex.axis) } else if (AT == "pretty") { at <- pretty(time(x)) if (FORMAT == "auto") format <- "%Y-%m-%d" if (!is.null(minor.ticks)) { minor.at <- timeSequence(time(x)[1], time(x)[nrow(x)],by = minor.ticks) axis.POSIXct(1, at=minor.at, labels=FALSE, col='#BBBBBB',cex.axis = cex.axis) } axis.POSIXct(1, at = at, format = format, cex.axis = cex.axis) } else if (AT == "chic" ) { ep <- .axTicksByTime2(x, format=FORMAT) if (minor.ticks) axis.POSIXct(1, at=TIME, labels=FALSE, col='#BBBBBB',cex.axis = cex.axis) axis.POSIXct(1, at = TIME[ep], labels=names(ep),las=1, lwd=1, mgp=c(3, 1, 0), cex.axis = cex.axis) } else { if (minor.ticks) { axis.POSIXct(1, at=TIME, labels=FALSE, col='#BBBBBB', cex.axis = cex.axis) axis.POSIXct(1, at = at, format = format, cex.axis=cex.axis) } } } if (frame.plot) { box("plot") } if(grid) { if (!(AT %in% c("pretty","chic"))) at <- axTicks(1) abline(v = at, lty = 3, col = col.grid, lwd = lwd.grid) grid(NA, NULL, lty = 3, col = col.grid, lwd = lwd.grid, equilogs=equilogs) } return(invisible()) } # MULTIPLE PLOT: if (plot.type == "multiple" || plot.type == "m") { nser <- ncol(x) nc <- if (nser > 4) 2 else 1 nr <- ceiling(nser/nc) oldpar <- par(mar = mar.multi, oma = oma.multi, mfcol = c(nr, nc)) on.exit(par(oldpar)) for (i in 1:nser) { plot(X, Y[, i], axes = FALSE, ann = TRUE, type = "n", xlab = "", ylab = "", # log = log, col = col[i], pch = pch[i], lty = lty[i], lwd = lwd[i], cex = cex[i]) panel(X, Y[, i], type = type[i], xlab = "", ylab = "", col = col[i], pch = pch[i], lty = lty[i], lwd = lwd[i], cex = cex.pch[i]) y.side <- if (i%%2 || !yax.flip) 2 else 4 do.xax <- i%%nr == 0 || i == nser if (frame.plot) { box() } if (axes) { axis(y.side, xpd = NA, cex.axis=cex.axis) } if (axes || xax) { if (do.xax) { if (AT == "counts") { axis(1, cex.axis = 1.2 * cex.axis) at <- axTicks(1) } else if (AT == "pretty") { at <- pretty(time(x)) if (FORMAT == "auto") format <- "%Y-%m-%d" TIME <- time(x) if (!is.null(minor.ticks)) { minor.at <- timeSequence( time(x)[1], time(x)[nrow(x)], by=minor.ticks) axis.POSIXct(1, at=minor.at, labels=FALSE, cex.axis = 1.2 * cex.axis, col='#BBBBBB') } axis.POSIXct(1, at = at, format = format, cex.axis = 1.2 * cex.axis) } else if (AT == "chic" ) { ep <- .axTicksByTime2(x, format=FORMAT) at <- time(x)[ep] format <- attr(ep, "format") formatLabels <- names(ep) TIME <- time(x) if (minor.ticks) axis.POSIXct(1, at=TIME, labels=FALSE, col='#BBBBBB', cex.axis = 1.2 * cex.axis) axis.POSIXct(1, at = TIME[ep], labels=names(ep), las=1, lwd=1, mgp=c(3, 1, 0), cex.axis = cex.axis) } else { TIME <- time(x) if (minor.ticks) axis.POSIXct(1, at=TIME, labels=FALSE, col='#BBBBBB', cex.axis = 1.2 * cex.axis) axis.POSIXct(1, at = at, format = format, cex.axis = 1.2 *cex.axis) } } } if (ann) { mtext(text = ylab[i], side = y.side, line = 3, cex = cex.lab) if (do.xax) mtext(xlab, side = 1, line = 3, cex = cex.lab) if (i==1) { cex.main <- if (is.null(dots$cex.lab)) par("cex.main") else cex.lab mtext(main, side = 3, line = 3, cex = cex.main, font = par("font.main"), col = par("col.main")) } } if(grid) { abline(v = at, lty = 3, col = col.grid, lwd = lwd.grid) grid(NA, NULL, lty = 3, col = col.grid, lwd = lwd.grid, equilogs=equilogs) } } # end of nser loop return(invisible()) } # SCATTER PLOT: if (!is.null(y)) { stopifnot (isUnivariate(x)) stopifnot (isUnivariate(y)) plot(series(x), series(y), xlab="", ylab="", col=col, pch=pch, cex=cex) return(invisible()) } } ############################################################################### # Test function for xts-plot-like axis positions and labels. .xtsPlot <- function(x, y=NULL, type = "l", ann = TRUE, axes = TRUE, major.ticks = 'auto', minor.ticks = TRUE, major.format = TRUE, grid = TRUE, box = TRUE, ...) { # A function written by Diethelm Wuertz # Descroption: # A simple example to test the xts functions to generate # nice axis positions and Lebels # Example: # x <- 100 * cumulated(LPP2005REC[, 2]); xtsPlot(x) # Settings: # time.scale <- periodicity2(x)$scale ep <- .axTicksByTime2(x, major.ticks, format.labels=major.format) # PLOT COORDS: xycoords <- xy.coords(time(x), x[, 1]) # RAW PLOT: plot(xycoords$x, xycoords$y, type=type, axes=FALSE, ann=FALSE, ...) # ADD GRID: if (grid) { abline(v=xycoords$x[ep], col='grey', lty=3) grid(NA, NULL) } # ADD AXIS: if(axes) { if(minor.ticks) axis(1, at=xycoords$x, labels=FALSE, col='#BBBBBB') axis(1, at=xycoords$x[ep], labels=names(ep), las=1, lwd=1, mgp=c(3,2,0)) axis(2) } # ADD BOX: box() } # ----------------------------------------------------------------------------- # Borrowed from ... # Package: xts # Title: eXtensible Time Series # Version: 0.9-7 # Date: 2013-06-26 # Author: Jeffrey A. Ryan, Joshua M. Ulrich # Maintainer: Jeffrey A. Ryan # License: GPL (>= 2) # URL: http://r-forge.r-project.org/projects/xts/ # Packaged: 2014-01-02 18:00:13 UTC; ripley # NeedsCompilation: yes # Repository: CRAN # Date/Publication: 2014-01-02 19:18:28 .axTicksByTime2 <- function( x, ticks.on='auto', k=1, labels=TRUE, format.labels=TRUE, ends=TRUE, gt = 2, lt = 30, format = "auto") { # A modified function borrowed from the xts-package # Arguments: # x - a 'timeSerie' Object # Example: # x <- 100 * cumulated(LPP2005REC[, 2]); .axTicksByTime2(x) tick.opts <- c( "years", "months", "weeks", "days", "hours", "minutes", "seconds") tick.k.opts <- c( 10, 5, 2, 1, 6, 1, 1, 1, 4, 2, 1, 30, 15, 1, 1) if (ticks.on %in% tick.opts) { cl <- ticks.on[1] ck <- k } else { tick.opts <- paste(rep(tick.opts, c(4, 2, 1, 1, 3, 3, 1)), tick.k.opts) is <- structure(rep(0,length(tick.opts)), .Names = tick.opts) for(i in 1:length(tick.opts)) { y <- strsplit(tick.opts[i], ' ')[[1]] ep <- .endpoints2(x, y[1], as.numeric(y[2])) is[i] <- length(ep) -1 if(is[i] > lt) break } nms <- rev(names(is)[which(is > gt & is < lt)])[1] cl <- strsplit(nms, " ")[[1]][1] ck <- as.numeric(strsplit(nms, " ")[[1]][2]) } ep <- if (is.null(cl)) NULL else .endpoints2(x, cl, ck) if(ends) ep <- ep + c(rep(1,length(ep)-1),0) if (labels) { if(is.logical(format.labels) || is.character(format.labels)) { # format by level of time detail, and platform unix <- ifelse(.Platform$OS.type=="unix", TRUE, FALSE) time.scale <- .periodicity2(x)$scale fmt <- ifelse(unix, '%n%b%n%Y', '%b %Y') if (time.scale == "weekly" | time.scale == "daily") fmt <- ifelse(unix, '%b %d%n%Y', '%b %d %Y') if (time.scale == "minute" | time.scale == "hourly") fmt <- ifelse(unix, '%b %d%n%H:%M', '%b %d %H:%M') if (time.scale == "seconds") fmt <- ifelse(unix, '%b %d%n%H:%M:%S', '%b %d %H:%M:%S') if(is.character(format.labels)) fmt <- format.labels if (format != "auto") fmt <- format names(ep) <- format(time(x)[ep], fmt) } else { names(ep) <- as.character(time(x)[ep]) } } attr(ep, "format") <- fmt # Return Value: ep } ################################################################################ .endpoints2 <- function (x, on = c("months", "years", "quarters", "weeks", "days", "hours", "minutes", "seconds"), k = 1) { # A modified function borrowed from the xts-package # Arguments: # x - a 'timeDate' object # Example: # x <- 100 * cumulated(LPP2005REC[, 2]); .endpoints2(x) stopifnot(is(x, "timeSeries")) x <- time(x) on <- match.arg(on) posix <- as.POSIXct(x, origin="1970-01-01") .posix <- unclass(posix) if (on == "years") { ans <- as.integer(which(diff(as.POSIXlt(posix)$year%/%k + 1) != 0)) } else if (on == "quarters") { ans <- as.integer(which(diff((as.POSIXlt(posix)$mon%/%3) + 1) != 0)) } else if (on == "months") { ans <- as.integer(which(diff(as.POSIXlt(posix)$mon%/%k + 1) != 0)) } else if (on == "weeks") { ans <- as.integer( which(diff((.posix + (3L * 86400L))%/%604800L%/%k + 1) != 0)) } else if (on == "days") { ans <- as.integer(which(diff(.posix%/%86400L%/%k + 1) != 0)) } else if (on == "hours") { ans <- as.integer(which(diff(.posix%/%3600L%/%k + 1) != 0)) } else if (on == "minutes" || on == "mins") { ans <- as.integer(which(diff(.posix%/%60L%/%k + 1) != 0)) } else if (on == "seconds" || on == "secs") { ans <- as.integer(which(diff(.posix%/%k + 1) != 0)) } ans <- c(0, ans, NROW(x)) # Return Value: ans } ############################################################################### .periodicity2 <- function (x) { # A modified function borrowed from the xts-package # Arguments: # x - a 'timeDate' object # Example: # x <- 100 * cumulated(LPP2005REC[, 2]); .periodicity2(x) # FUNCTION: # Check Argument: stopifnot(is(x, "timeSeries")) x <- time(x) p <- median(diff(as.integer(as.POSIXct(x, origin="1970-01-01")))) if (is.na(p)) stop("cannot calculate periodicity of 1 observation") units <- "days" scale <- "yearly" label <- "year" if (p < 60) { units <- "secs" scale <- "seconds" label <- "second" } else if (p < 3600) { units <- "mins" scale <- "minute" label <- "minute" p <- p/60L } else if (p < 86400) { units <- "hours" scale <- "hourly" label <- "hour" } else if (p == 86400) { units <- "days" scale <- "daily" label <- "day" } else if (p <= 604800) { units <- "weeks" scale <- "weekly" label <- "week" } else if (p <= 2678400) { units <- "months" scale <- "monthly" label <- "month" } else if (p <= 7948800) { units <- "quarter" scale <- "quarterly" label <- "quarter" } # Return Value: list( difftime = structure(p, units = units, class = "difftime"), frequency = p, start = start(x), end = end(x), units = units, scale = scale, label = label) } ############################################################################### .colorwheelPalette <- function(n) { # A function implemented by Diethelm Wuertz # FUNCTION: # Color Wheel: orig <- c( "#FFF200", "#FBAA19", "#F26522", "#EF4823", "#ED1D24", "#A9285F", "#662D91", "#4D2F91", "#2E3092", "#00707E", "#00A650", "#8CC63F") orig <- orig[-1] # Splice Wheel if (n == 11) return(orig) rgb.tim <- t(col2rgb(orig)) temp <- matrix(NA, ncol = 3, nrow = n) x <- seq(0, 1, , 11) xg <- seq(0, 1, , n) for (k in 1:3) { hold <- spline(x, rgb.tim[, k], n = n)$y hold[hold < 0] <- 0 hold[hold > 255] <- 255 temp[, k] <- round(hold) } ans <- rgb(temp[, 1], temp[, 2], temp[, 3], maxColorValue = 255) # Return Value: ans } ############################################################################### timeSeries/R/fin-splits.R0000755000176200001440000000726014263246022015010 0ustar liggesusers # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # A copy of the GNU General Public License is available at # ../../COPYING ################################################################################ # FUNCTION: DESCRIPTION: # outlier,timeSeries Removes outliers from a 'timeSeries' object ################################################################################ # DW: # We should call this function no longer outlier, much better woud be # splits() since the function tries to detect splits by large outliers. # For outlier detection we should use better methods than just the sd(). # ------------------------------------------------------------------------------ splits <- function(x, sd = 3, complement = TRUE, ...) { # Return Value: outlier(x=x, sd=sd, complement=complement, ...) } # ------------------------------------------------------------------------------ setMethod("outlier", "ANY", function(x, sd = 3, complement = TRUE, ...) { # A function implemented by Diethelm Wuertz # Description: # Returns outlier splits # Arguments: # x - a numeric vector # sd - a numeric value of standard deviations, e.g. 5 # means that values larger or smaller tahn five # times the standard deviation of the series will # be detected. # complement - a logical flag, should the outlier series # or its complements be returned. # Note: # This function is thought to find splits in financial # price or index series If a price or index is splitted we # observe in the returns a big jump of several standard # deviations which is identified usual as an outlier. # FUNCTION: # Check arguments: stopifnot(is.timeSeries(x)) # Extract Title and Documentation: Title <- x@title Documentation <- x@documentation # Find Outliers: SD <- sd * sd(x) if (complement) { ans <- x[x <= SD] } else { ans <- x[x > SD] names(ans) <- as.character(which(x > SD)) } # Preserve Title and Documentation: ans@title <- Title ans@documentation <- Documentation # Return Value: ans }) # ------------------------------------------------------------------------------ setMethod("outlier", "timeSeries", function(x, sd = 3, complement = TRUE, ...) { # A function implemented by Diethelm Wuertz # Description: # Returns outliers in a timeSeries object or the complement # Arguments: # x - an object of class 'timeSeries'. # sd - a numeric value of standard deviations, e.g. 5 # means that values larger or smaller tahn ten # times the standard deviation of the series will # be removed. # complement - a logical flag, should the outler series # or its complement be returned. # FUNCTION: # Check if univariate Series: if (!isUnivariate(x)) stop("Supports only univariate timeSeries Objects") # Find Outliers: SD = sd * sd(x) if (complement) { x = x[abs(x) <= SD,] } else { x = x[abs(x) > SD,] } # Return Value: x }) ################################################################################ timeSeries/R/statistics-orderColnames.R0000755000176200001440000001304114263246022017677 0ustar liggesusers# # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # A copy of the GNU General Public License is available at # ../../COPYING ################################################################################ # FUNCTION: DESCRIPTION: # statsColnames Returns statistically rearranged column names # orderColnames Returns ordered column names of a time Series # sortColnames Returns sorted column names of a time Series # sampleColnames Returns sampled column names of a time Series # pcaColnames Returns PCA correlation ordered column names # hclustColnames Returns hierarchical clustered column names ################################################################################ statsColnames = function(x, FUN = colMeans, ...) { # A function implemented by Diethelm Wuertz # Description: # Returns statistically rearranged column names # Arguments: # x - an object of class timeSeries # FUN - a character string, the name of the function to be used # ... - optional arguments to be passed to FUN # Note: # Example of function Candidates: # colStats calculates column statistics, # colSums calculates column sums, # colMeans calculates column means, # colSds calculates column standard deviations, # colVars calculates column variances, # colSkewness calculates column skewness, # colKurtosis calculates column kurtosis, # colMaxs calculates maximum values in each column, # colMins calculates minimum values in each column, # colProds computes product of all values in each column, # colQuantiles computes quantiles of each column. # FUNCTION: # Apply colStats Function: fun = match.fun(FUN) Sort = sort(fun(x, ...)) Order = names(Sort) ans = colnames(as.matrix(x)[, Order]) attr(ans, "control") <- Sort # Return Value: ans } # ------------------------------------------------------------------------------ orderColnames = function(x, ...) { # A function implemented by Diethelm Wuertz # Description: # Returns ordered column names of a time Series # Arguments: # x - an object of class timeSeries # FUNCTION: # Order: ans = order(colnames(as.matrix(x)), ...) # Return Value: ans } # ------------------------------------------------------------------------------ sortColnames = function(x, ...) { # A function implemented by Diethelm Wuertz # Description: # Returns sorted column names of a time Series # Arguments: # x - an object of class timeSeries # FUNCTION: # Sort: ans = sort(colnames(as.matrix(x)), ...) # Return Value: ans } # ------------------------------------------------------------------------------ sampleColnames = function(x, ...) { # A function implemented by Diethelm Wuertz # Description: # Returns sampled column names of a time Series # Arguments: # x - an object of class timeSeries # FUNCTION: # Sample: ans = sample(colnames(as.matrix(x)), ...) # Return Value: ans } # ------------------------------------------------------------------------------ pcaColnames = function(x, robust = FALSE, ...) { # A function implemented by Diethelm Wuertz # Description: # Returns PCA correlation ordered column names # Arguments: # x - an object of class timeSeries # robust - a logical, should we use robust covariance estimation? # FUNCTION: # Order: if (robust) { x.cor = robustbase::covMcd(as.matrix(x), cor = TRUE, ...)$cor } else { x.cor = cor(as.matrix(x), ...) } x.eigen = eigen(x.cor)$vectors[,1:2] e1 = x.eigen[, 1] e2 = x.eigen[, 2] Order = order(ifelse(e1 > 0, atan(e2/e1), atan(e2/e1)+pi)) ans = colnames(as.matrix(x))[Order] # Return Value: ans } # ------------------------------------------------------------------------------ hclustColnames = function(x, method = c("euclidean", "complete"), ...) { # A function implemented by Diethelm Wuertz # Description: # Returns hierarchical clustered column names # Arguments: # x - an object of class timeSeries # method - the agglomeration method to be used. This should # be (an unambiguous abbreviation of) one of "ward", "single", # "complete", "average", "mcquitty", "median" or "centroid". # ... optional arguments passed to the function hclust # FUNCTION: # Order: Order = hclust(dist(t(as.matrix(x)), method = method[1]), method = method[2], ...)$order ans = colnames(as.matrix(x))[Order] # Return Value: ans } ################################################################################ timeSeries/R/base-sample.R0000755000176200001440000000211714263246022015105 0ustar liggesusers# # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # A copy of the GNU General Public License is available at # ../../COPYING ################################################################################ # FUNCTION: DESCRIPTION: # sample,timeSeries Resamples a 'timeSeries' object in time ################################################################################ setMethod("sample", "timeSeries", function(x, size, replace = FALSE, prob = NULL) { x[sample(seq(NROW(x)), size, replace, prob), ] } ) ################################################################################ timeSeries/R/fin-drawdowns.R0000755000176200001440000001525014263246022015500 0ustar liggesusers# # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # A copy of the GNU General Public License is available at # ../../COPYING ################################################################################ # FUNCTION: DESCRIPTION: # drawdowns Generate 'timeSeries' object of drawdown levels # drawdownsStats Compute drawdown stats for univariate time series # FUNCTION: DESCRIPTION: # .drawdownsHistPlot Displays a histogram plot ################################################################################ drawdowns <- function(x, ...) { # A function implemented by Diethelm Wuertz and Tobias Setz # Description: # Generate 'timeSeries' object of drawdown levels # Arguments: # x - an uni- or multivariate 'timeSeries' object of financial # returns # ... - arguments passed to the function na.omit() # Value: # returns an object of class 'timeSeries'. # FUNCTION: # Check Arguments stopifnot(is.timeSeries(x)) # Extract Title and Documentation: Title <- x@title Documentation <- x@documentation # Handle Missing Values: r <- na.omit(x, ...) # The starting point of every time series is set to zero. # This ensures that the starting value for cumprodReturns below # (which is the wealth index) is 1. startup <- timeSeries(data=t(rep(0, ncol(r))), charvec=time(r)[1]) # Preset Drawdowns: nms <- colnames(r) drawdowns <- r <- rbind(startup,r) colnames(drawdowns) <- colnames(r) <- nms # Compute multivariate 'timeSeries' of Drawdowns: cumprodReturns <- colCumprods(1 + r) cummaxReturns <- colCummaxs(cumprodReturns) series(drawdowns) <- series(cumprodReturns)/series(cummaxReturns) - 1 drawdowns <- drawdowns[-1, ] # Preserve Title and Documentation: drawdowns@title <- Title drawdowns@documentation <- Documentation # Return Value: drawdowns } # ------------------------------------------------------------------------------ drawdownsStats = function(x, ...) { # A function implemented by Diethelm Wuertz and Tobias Setz # Description: # Finds the drawdowns in an univariate 'timeSeries' object # Arguments: # x - an uni- or multivariate 'timeSeries' object of financial # returns # ... - arguments passed to the function drawdowns() # Value: # returns an object of class 'data.frame' returning # drawdown - the depth of the drawdown # from - the start date # trough - the trough period # to - the end date # length - the length in number of records # peaktrough - the peak trough # recovery - the recovery length in number of records # Author: # Based on Peter Carl, # partly from contributed R package Performance Analytics # Note: # modified with permission from function by Sankalp Upadhyay # # Examples: # x = drawdownsStats(as.timeSeries(data(edhec))[,1]) # FUNCTION: # Check Arguments: stopifnot(isUnivariate(x)) # Compute Drawdowns: drawdowns <- as.vector(drawdowns(x, ...)) time <- time(x) # Find Drawdowns from a Numeric Vector of Returns: draw <- begin <- end <- length <- trough <- c() index <- 1 if (drawdowns[1] >= 0) { priorSign <- 1 } else { priorSign <- 0 } from <- 1 sofar <- drawdowns[1] to <- 1 dmin <- 1 for (i in 2:length(drawdowns)) { thisSign <- ifelse(drawdowns[i] < 0, 0, 1) if (thisSign == priorSign) { if(drawdowns[i]< sofar) { sofar <- drawdowns[i] dmin <- i } to <- i + 1 } else { # @todo: recovery time (in days) draw[index] <- sofar begin[index] <- from trough[index] <- dmin end[index] <- to #cat(sofar, from, to) from <- i sofar <- drawdowns[i] to <- i + 1 dmin <- i index <- index + 1 priorSign <- thisSign } } draw[index] <- sofar begin[index] <- from trough[index] <- dmin end[index] <- to ## length: as.timeDate(pos[x$to])-as.timeDate(pos[x$from]) # If the time series ends in the middle of a drawdown, return the last # date of the time series and set the recovery time to NA endt <- end; endr <- end; if(to > length(time)) { endt[index] <- to - 1 endr[index] <- NA } # Result - an index list with all drawdowns ... ans <- data.frame(from = as.vector(as.character(time[begin])), trough = as.vector(as.character(time[trough])), to = as.vector(as.character(time[endt])), drawdown = as.vector(draw), length = (end - begin + 1), peaktotrough = (trough - begin + 1), recovery = (endr - trough), stringsAsFactors = FALSE) attr(ans, "series") <- x attr(ans, "names") <- c("From", "Trough", "To", "Depth", "Length", "ToTrough", "Recovery") ans <- ans[ans[, "Depth"] < 0, ] # Order Drawdowns: ans <- ans[order(ans[, "Depth"]), ] rownames(ans) <- 1:dim(ans)[1] # Return Value: ans } # ------------------------------------------------------------------------------ if (FALSE) { .drawdownsHistPlot <- function(x, labels = TRUE, col = "steelblue", add.fit = TRUE, rug = TRUE, skipZeros = TRUE, ...) { # Note: # We require(fExtremes) move this function to fAssets # Check Arguments: stopifnot(isUnivariate(x)) # Plot Drawdowns Histogram: X = drawdowns(x, ...) histPlot(X, labels = labels, col = col, add.fit = FALSE, rug = rug, skipZeros = skipZeros, ...) # Add GPD Fit: if (add.fit) { z = -as.vector(X) par = gpdFit(z, u = 0)@fit$par.ests u = seq(0, max(abs(z)), length = 200) v = dgpd(u, xi = par[1], mu = 0, beta = par[2]) lines(-u, v, col = "brown", lwd = 2) } # return Value: invisible() } } ################################################################################ timeSeries/R/timeSeries-isOHLC.R0000755000176200001440000000432714263246022016111 0ustar liggesusers# # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # A copy of the GNU General Public License is available at # ../../COPYING ################################################################################ # FUNCTION: DESCRIPTION: # .isOHLC Is the series an Open-High-Low-Close series? # .isOHLCV Is the series an Open-High-Low-Close-Volume series? ################################################################################ # DW: # I think we need a better method to detect if a series is a OHLC(V) series # or not. A possible approach would be: # any High >= Open, Close, Low # any Low <= Open, Close, High # Volume >= 0 # number of columns 4(5) # ----------------------------------------------------------------------------- .isOHLC <- function(object) { # A function implemented by Diethelm Wuertz # Description: # Is the series an Open-High-Low-Close series? # Arguments: # object - an object of class 'timeSeries' # FUNCTION: colNames <- c("Open", "High", "Low", "Close") if (colnames(object)[1:4] == colNames) { return(TRUE) } else { return(FALSE) } } # ------------------------------------------------------------------------------ .isOHLCV <- function(object) { # A function implemented by Diethelm Wuertz # Description: # Is the series an Open-High-Low-Close-Volume series? # Arguments: # object - an object of class 'timeSeries' # FUNCTION: colNames <- c("Open", "High", "Low", "Close", "Volume") if (colnames(object) == colNames) { return(TRUE) } else { return(FALSE) } } ################################################################################ timeSeries/R/fin-durations.R0000755000176200001440000000457714263246022015512 0ustar liggesusers# # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # A copy of the GNU General Public License is available at # ../../COPYING ################################################################################ # FUNCTION: FINANCIAL TIME SERIES: # durations Computes durations from a 'timeSeries' object ################################################################################ durations <- function(x, trim = FALSE, units = c("secs", "mins", "hours", "days")) { # A function implemented by Diethelm Wuertz and Yohan Chalabi # Description: # Computes durations from a financial price series # Arguments: # x - a univariate or multivariate 'timeSeries' object or a # numeric vector or matrix. # trim - a logical flag, by default TRUE, the first missing # observation in the return series will be removed. # units - a character value or vector which allows to set the # units in which the durations are measured # Value: # Returns a S4 object of class 'timeSeries'. # FUNCTION: # Check Arguments: stopifnot(is.timeSeries(x)) # Extract Title and Documentation: Title <- x@title Documentation <- x@documentation # Check for Signal Series: if (x@format == "counts") stop(as.character(match.call())[1], " is for time series and not for signal series.") # Match Arguments: units <- match.arg(units) # Get Positions and Durations: pos <- time(x) dur <- c(NA, diff(as.integer(difftime(pos, pos[1], units = units[1])))) # Data Matrix: ans <- timeSeries(data = dur, charvec = pos, units = "Duration") if (trim) ans <- ans[-1, ] # Preserve Title and Documentation: ans@title <- Title ans@documentation <- Documentation # Return Series: ans } ################################################################################ timeSeries/R/stats-window.R0000644000176200001440000000756614546000352015367 0ustar liggesusers# # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # A copy of the GNU General Public License is available at # ../../COPYING ################################################################################ # FUNCTION: DESCRIPTION: # window,timeSeries Extracts a piece from a 'timeSeries' object ################################################################################ window.timeSeries <- function(x, start, end, ...) { # A function implemented by Diethelm Wuertz and Yohan Chalabi # Description: # Windows a piece from a 'timeSeries' object. # Arguments: # x - a 'timeSeries' object # from, to - two 'timeDate' position vectors which size the # blocks # Details: # from and to, are both included in the window. # Value: # Returns a S4 object of class 'timeSeries'. # FUNCTION: # Check Arguments: stopifnot(is.timeSeries(x)) # Extract Title and Documentation: Title <- x@title Documentation <- x@documentation # Check for Signal Series if (x@format == "counts") stop(as.character(match.call())[1], " is for time series and not for signal series.") # check if all argument names are used if (length(dot <- list(...))) { if (any(names(dot) %in% c("from", "to"))) { if (!is.null(from <- dot$from)) start <- from if (!is.null(to <- dot$to)) end <- to warning("Arguments 'from/to' are deprecated.\nUse instead 'start/end'.", call. = FALSE) } } start <- timeDate(start) end <- timeDate(end) Positions <- time(x) test <- (Positions >= start & Positions <= end) ans <- x[test,] # Preserve Title and Documentation: ans@title <- Title ans@documentation <- Documentation # Return Value: ans } ## (2024-01-05) GNB: stop making window() S4 ## setMethod("window", "timeSeries", ## function(x, start, end, ...) .window.timeSeries(x, start, end, ...)) ############################################################################### ## 2023-05-26 removed this cut method ## (it is not compatible with the purpose of the generic function cut) ## ## .cut.timeSeries <- ## function (x, from, to, ...) ## { ## # A function implemented by Diethelm Wuertz and Yohan Chalabi ## ## # Description: ## # Cuts out a piece from a 'timeSeries' object. ## ## # Arguments: ## # x - a 'timeSeries' object ## # from, to - two 'timeDate' position vectors which size the ## # blocks ## ## # Value: ## # Returns a S4 object of class 'timeSeries'. ## ## # FUNCTION: ## ## .Deprecated("window", "timeSeries") ## ## stopifnot(is.timeSeries(x)) ## if (x@format == "counts") ## stop(as.character(match.call())[1], ## " is for time series and not for signal series.") ## ## from = timeDate(from) ## to = timeDate(to) ## Positions = time(x) ## ## test = (Positions >= from & Positions <= to) ## ans <- x[test,] ## ## # Return value: ## ans ## } ## ## ## setMethod("cut", "timeSeries", ## function (x, from, to, ...) .cut.timeSeries(x, from, to, ...)) ## ## ## # until UseMethod dispatches S4 methods in 'base' functions ## cut.timeSeries <- function(x, ...) .cut.timeSeries(x, ...) ################################################################################ timeSeries/R/timeSeries-slotDocumentation.R0000755000176200001440000000550614322333513020541 0ustar liggesusers# # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # A copy of the GNU General Public License is available at # ../../COPYING ################################################################################ # FUNCTION: DESCRIPTION: # getDocumentation # setDocumentation ################################################################################ # FUNCTION: MANAGING ATTRIBUTES # getAttributes # setAttributes<- # INTERNAL FUNCTION: # .appendList ################################################################################ getAttributes <- function (obj) { # A function implemented by Diethelm Wuertz # Description: # FUNCTION: # Check Argument: stopifnot(inherits(obj, "timeSeries")) # Extract Attributes: ans <- attr(obj@documentation, "Attributes") # Return Value: ans } # ----------------------------------------------------------------------------- `setAttributes<-` <- function(obj, value) { # A function implemented by Diethelm Wuertz # Description: # Example: # obj <- dummyMonthlySeries(); getAttributes(obj) # setAttributes(obj) <- list(mat=matrix(1:4, ncol=2)); getAttributes(obj) # getAttributes(obj)$mat[[1]] # FUNCTION: # Check Arguments: stopifnot(inherits(obj, "timeSeries") , is.list(value) , length(value) == 1) # Compose New Attribute: name <- names(value) names(value) <- NULL A <- list(value) names(A) <- name # print(A) # Get Already Existing Attribute B <- getAttributes(obj) if(is.null(B)) B <- list() # print(B) # Join Attributes: JOINED <- sapply(unique(c(names(A), names(B))), function(x) list(c(A[[x]], B[[x]]))) # print(JOINED) # Assign Attribute: attr(obj@documentation, "Attributes") <- JOINED # Return Value: obj } # ----------------------------------------------------------------------------- .appendList <- function (A, B) { # A function implemented by Diethelm Wuertz # Description: # Appends list B to list A # Arguments: # A - first named list element # B - second named list element # FUNCTION: # Append list B to list A JOINED <- sapply(unique(c(names(A), names(B))), function(x) list(c(A[[x]], B[[x]]))) # Return Value: JOINED } ############################################################################### timeSeries/R/fin-align.R0000755000176200001440000001077114263246022014565 0ustar liggesusers# # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # A copy of the GNU General Public License is available at # ../../COPYING ################################################################################ # FUNCTION: DESCRIPTION: # align Aligns a 'timeSeries object' to time stamps # .align.timeSeries Aligns a 'timeSeries object' to time stamps ################################################################################ # DW: See also ... # in package timeDate # setMethod("align", "ANY", # setMethod("align", "timeDate", # ------------------------------------------------------------------------------ .align.timeSeries <- function(x, by = "1d", offset = "0s", method = c("before", "after", "interp", "fillNA", "fmm", "periodic", "natural", "monoH.FC"), include.weekends = FALSE, ...) { # A function implemented by Diethelm Wuertz and Yohan Chalabi # Description: # Aligns a 'timeSeries' object to equidistant time stamps # Arguments: # x - an object of class "timeSeries". # by - # offset - # method - # "before" - use the data from the row whose position is # just before the unmatched position; # "after" - use the data from the row whose position is # just after the unmatched position; # "linear" - interpolate linearly between "before" and # "after". # "fillNA" - fill missing days with NA values # include.weekends - a logical value. Should weekend dates be # included or removed? # Example: # data(usdthb) # data = matrix(usdthb[, "BID"]) # charvec = as.character(usdthb[, "XDATE"]) # USDTHB = timeSeries(data, charvec, format = "%Y%M%d%H%M") # align(USDTHB, by = "3h", offset = "92m") # MSFT = as.timeSeries(data(msft.dat)) # align(MSFT) # See also: # in package timeDate # setMethod("align", "ANY", # setMethod("align", "timeDate", # FUNCTION: # Settings: Title <- x@title Documentation <- x@documentation # Check for Signal Series: if (x@format == "counts") stop(as.character(match.call())[1], " is for time series and not for signal series.") # check if series sorted if (is.unsorted(x)) x <- sort(x) # Adjustment: Method <- match.arg(method) fun <- switch(Method, before = function(x, u, v) approxfun(x = u, y = v, method = "constant", f = 0, ...)(x), after = function(x, u, v) approxfun(x = u, y = v, method = "constant", f = 1, ...)(x), interp = , fillNA = function(x, u, v) approxfun(x = u, y = v, method = "linear", f = 0.5, ...)(x), fmm = , periodic = , natural = , monoH.FC = function(x, u, v) splinefun(x = u, y = v, method = Method, ...)(x)) # Align timeDate stamps td1 <- time(x) td2 <- align(td1, by = by, offset = offset) # extract numerical values u <- as.numeric(td1, units = "secs") xout <- as.numeric(td2, units = "secs") N = NCOL(x) data <- matrix(ncol = N, nrow = length(td2)) xx <- getDataPart(x) for (i in 1:N) { v <- as.vector(xx[, i]) # New Positions and approximated values: yout <- fun(xout, u, v) if (Method == "fillNA") yout[!(xout %in% u)] = NA # Compose data: data[, i] = yout } # build time series ans <- timeSeries(data, td2, units = colnames(x)) # Remove Weekends: if(!include.weekends) ans <- ans[isWeekday(td2), ] # Preserve Title and Documentation: ans@title <- Title ans@documentation <- Documentation # Return Value: ans } # ------------------------------------------------------------------------------ setMethod("align", "timeSeries", .align.timeSeries) ################################################################################ timeSeries/R/stats-na.contiguous.R0000644000176200001440000000500114546302626016643 0ustar liggesusers# # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # A copy of the GNU General Public License is available at # ../../COPYING ################################################################################ # FUNCTION: DESCRIPTION: # na.contiguous,timeSeries Finds the longest consecutive of non-missing values ################################################################################ ## 2024-01-06 GNB: converted the S4 method to an S3 method and removed the S4 one. na.contiguous.timeSeries <- function(object, ...) { # A function imlemented by Diethelm Wuertz and Yohan Chalabi # fixed by GNB for the case with tied stretches one of whom starts at # the beginning of the series, see comments below. # Description: # Finds the longest consecutive of non-missing values # Details: # adapted stats:::na.contingous.default to timeSeries objects # Yohan Chalabi # ## FUNCTION: good <- apply(!is.na(object), 1L, all) if (!sum(good)) stop("all times contain an NA") tt <- cumsum(!good) tt <- c(0, tt) # GNB, see my bug report to R-devel for stats::na.contiguous from # 2023-06-02 and the discussion there (see # https://stat.ethz.ch/pipermail/r-devel/2023-June/082642.html) # The fix is my proposed way to patch that. ln <- sapply(0:max(tt), function(i) sum(tt == i)) seg <- (seq_along(ln)[ln == max(ln)])[1L] - 1 keep <- (tt == seg) keep <- keep[-1] # GNB, see above comment st <- min(which(keep)) if (!good[st]) st <- st + 1 en <- max(which(keep)) omit <- integer(0L) n <- NROW(object) if (st > 1) omit <- c(omit, 1L:(st - 1)) if (en < n) omit <- c(omit, (en + 1):n) if (length(omit)) { object <- object[st:en, ] attr(omit, "class") <- "omit" attr(object, "na.action") <- omit } # Return Value: object } ################################################################################ timeSeries/R/zzz.R0000755000176200001440000000201614263246022013547 0ustar liggesusers# # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # A copy of the GNU General Public License is available at # ../../COPYING ################################################################################ .onLoad <- function(libname, pkgname) { if(!is.numeric(getRmetricsOptions("max.print"))) setRmetricsOptions(max.print = 100) #-> show() of large matrices # YC: This should really go in methods package. keep it here for # the time being. (R -2.9.0) setOldClass("difftime") } ################################################################################ timeSeries/R/timeSeries.R0000755000176200001440000002551114263246022015030 0ustar liggesusers# # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # A copy of the GNU General Public License is available at # ../../COPYING ################################################################################ # FUNCTION: DESCRIPTION: # .signalSeries Creates a signal series from scratch # .timeSeries Creates a time series from scratch # METHODS: # timeSeries,ANY,ANY # timeSeries,matrix,missing # timeSeries,matrix,timeDate # timeSeries,matrix,numeric # timeSeries,matrix,ANY ################################################################################ ## .signalSeries : generate units, title, documentation if NULL ## data must be a matrix .signalSeries <- function(data, charvec, units = NULL, format, zone = "", FinCenter = "", recordIDs = data.frame(), title = NULL, documentation = NULL, ...) { # Description: # Arguments: # Note: # it is possible that a ts object is considered as a # matrix when timeSeries method as dispatched. Hence this check # FUNCTION: if (!is(data, "matrix")) data <- as(data, "matrix") # Add units, title and Documentation: if (is.null(units)) units <- colnames(data) if (is.null(units)) units <- paste("SS.", seq.int(dim(data)[2]), sep = "") if (is.null(title)) title = "Signal Series Object" if (is.null(documentation)) documentation = as.character(date()) # remove rownames of data but keep colnames for # functions like var, cov ... # Note that if it fails, new("timeSeries" should fail to - normal try(dimnames(data) <- list(NULL, units), silent = TRUE) ### new("signalSeries", ### .Data = data, ### units = units, ### recordIDs = recordIDs, ### title = title, ### documentation = documentation) new("timeSeries", .Data = data, units = units, positions = numeric(0), FinCenter = "", format = "counts", recordIDs = recordIDs, title = title, documentation = documentation) } # ------------------------------------------------------------------------------ ## .timeSeries : generate units, title, documentation if NULL ## data must be a matrix and charvec a timeDate object .timeSeries <- SERIES <- function(data, charvec, units = NULL, format, zone = "", FinCenter = "", recordIDs = data.frame(), title = NULL, documentation = NULL, ...) { # Description: # Creates a time series from scratch # Arguments: # Note: # it is possible that a ts object is considered as a # matrix when timeSeries method as dispatched. Hence this check # FUNCTION: if (!is(data, "matrix")) data <- as(data, "matrix") stopifnot(is(charvec, "numeric")) # Add units, title and Documentation: if (is.null(units)) units <- colnames(data) if (is.null(units)) units <- paste("TS.", seq.int(dim(data)[2]), sep = "") if (is.null(title)) title <- "Time Series Object" if (is.null(documentation)) documentation <- as.character(date()) if (missing(format)) format <- "%Y-%m-%d" if (identical("", FinCenter)) FinCenter <- "GMT" # Remove rownames of data but keep colnames for # functions like var, cov ... # Note that if it fails, new("timeSeries" should fail to - normal try(dimnames(data) <- list(NULL, units), silent = TRUE) positions <- charvec # as.numeric(charvec, "sec") attributes(positions) <- NULL new("timeSeries", .Data = data, positions = positions, units = units, format = format, # charvec@format, FinCenter = FinCenter, # charvec@FinCenter, recordIDs = recordIDs, title = title, documentation = documentation) } # ------------------------------------------------------------------------------ ## missing ANY setMethod("timeSeries", signature(data = "missing", charvec = "ANY"), function (data, charvec, units = NULL, format = NULL, zone = "", FinCenter = "", recordIDs = data.frame(), title = NULL, documentation = NULL, ...) { .signalSeries(data = matrix(NA), units = units, recordIDs = recordIDs, title = title, documentation = documentation, ...) }) # ------------------------------------------------------------------------------ ## missing missing setMethod("timeSeries", signature(data = "missing", charvec = "missing"), function (data, charvec, units = NULL, format = NULL, zone = "", FinCenter = "", recordIDs = data.frame(), title = NULL, documentation = NULL, ...) { .signalSeries(data = matrix(NA), units = units, recordIDs = recordIDs, title = title, documentation = documentation, ...) }) # ------------------------------------------------------------------------------ ## ANY ANY setMethod("timeSeries", signature(data = "ANY", charvec = "ANY"), function (data, charvec, units = NULL, format = NULL, zone = "", FinCenter = "", recordIDs = data.frame(), title = NULL, documentation = NULL, ...) { data <- as(data, "matrix") if (!is(data, "matrix")) stop("Could not coerce 'data' to a matrix") callGeneric(data = data, charvec = charvec, units = units, format = format, zone = zone, FinCenter = FinCenter, recordIDs = recordIDs, title = title, documentation = documentation, ...) }) # ------------------------------------------------------------------------------ ## ANY missing setMethod("timeSeries", signature(data = "ANY", charvec = "missing"), function (data, charvec, units = NULL, format = NULL, zone = "", FinCenter = "", recordIDs = data.frame(), title = NULL, documentation = NULL, ...) { data <- as(data, "matrix") if (!is(data, "matrix")) stop("Could not coerce 'data' to a matrix") callGeneric(data = data, units = units, format = format, zone = zone, FinCenter = FinCenter, recordIDs = recordIDs, title = title, documentation = documentation, ...) }) # ------------------------------------------------------------------------------ ## matrix missing setMethod("timeSeries", signature(data = "matrix", charvec = "missing"), function (data, charvec, units = NULL, format = NULL, zone = "", FinCenter = "", recordIDs = data.frame(), title = NULL, documentation = NULL, ...) { charvec <- rownames(data) if (is.null(charvec)) { .signalSeries(data = data, units = units, recordIDs = recordIDs, title = title, documentation = documentation, ...) } else { callGeneric(data = data, charvec = charvec, units = units, format = format, zone = zone, FinCenter = FinCenter, recordIDs = recordIDs, title = title, documentation = documentation, ...) } } ) # ------------------------------------------------------------------------------ ## matrix timeDate setMethod("timeSeries", signature(data = "matrix", charvec = "timeDate"), function (data, charvec, units = NULL, format = NULL, zone = "", FinCenter = "", recordIDs = data.frame(), title = NULL, documentation = NULL, ...) { if (any(is.na(charvec))) return(.signalSeries(data = data, units = units, recordIDs = recordIDs, title = title, documentation = documentation, ...)) if (any(!c(zone, FinCenter) %in% "")) charvec <- timeDate(charvec, format = format, zone = zone, FinCenter = FinCenter) .timeSeries(data = data, charvec = as.numeric(charvec, "sec"), units = units, format = charvec@format, FinCenter = charvec@FinCenter, recordIDs = recordIDs, title = title, documentation = documentation, ...) } ) # ------------------------------------------------------------------------------ ## matrix numeric setMethod("timeSeries", signature(data = "matrix", charvec = "numeric"), function (data, charvec, units = NULL, format = NULL, zone = "", FinCenter = "", recordIDs = data.frame(), title = NULL, documentation = NULL, ...) { if (any(!c(zone, FinCenter) %in% "")) { td <- timeDate(charvec, zone = zone, FinCenter = FinCenter) charvec <- as.numeric(td, "sec") FinCenter <- finCenter(td) } .timeSeries(data = data, charvec = charvec, units = units, FinCenter = FinCenter, recordIDs = recordIDs, title = title, documentation = documentation, ...) } ) # ------------------------------------------------------------------------------ ## matrix ANY setMethod("timeSeries", signature(data = "matrix", charvec = "ANY"), function (data, charvec, units = NULL, format = NULL, zone = "", FinCenter = "", recordIDs = data.frame(), title = NULL, documentation = NULL, ...) { # if charvec NULL returns a signal series if (is.null(charvec)) return(.signalSeries(data = data, units = units, recordIDs = recordIDs, title = title, documentation = documentation, ...)) # coerce charvec to timeDate charvec <- timeDate(charvec = charvec, format = format, zone = zone, FinCenter = FinCenter) if (any(is.na(charvec))) # Note : there is already a warning in timeDate if there are NA's .signalSeries(data = data, units = units, recordIDs = recordIDs, title = title, documentation = documentation, ...) else .timeSeries(data = data, charvec = as.numeric(charvec, "sec"), units = units, format = charvec@format, FinCenter = charvec@FinCenter, recordIDs = recordIDs, title = title, documentation = documentation, ...) } ) ################################################################################ timeSeries/R/base-start.R0000644000176200001440000000401414546004076014761 0ustar liggesusers# # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # A copy of the GNU General Public License is available at # ../../COPYING ################################################################################ # FUNCTION: DESCRIPTION: # start,timeSeries Extracts start date of a 'timeSeries' object # end,timeSeries Extracts end date of a 'timeSeries' object ################################################################################ start.timeSeries <- function(x, ...) { # Description: # Extracts start date of a 'timeSeries' object # FUNCTION: # Extract Date: if (length(x@positions)>0) timeDate(min(x@positions), zone = "GMT", FinCenter = x@FinCenter) else NULL } ## setMethod("start" , "timeSeries", start.timeSeries) ## # until UseMethod dispatches S4 methods in 'base' functions ## start.timeSeries <- function(x, ...) .start.timeSeries(x, ...) # ------------------------------------------------------------------------------ end.timeSeries <- function(x, ...) { # Description: # Extracts start date of a 'timeSeries' object # FUNCTION: # Extract Date: if (length(x@positions)>0) timeDate(max(x@positions), zone = "GMT", FinCenter = x@FinCenter) else NULL } ## setMethod("end", "timeSeries", function(x, ...) end.timeSeries(x, ...)) ## # until UseMethod dispatches S4 methods in 'base' functions ## end.timeSeries <- function(x, ...) .end.timeSeries(x, ...) ################################################################################ timeSeries/R/stats-lag.R0000644000176200001440000000766114546255376014641 0ustar liggesusers# # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # A copy of the GNU General Public License is available at # ../../COPYING ################################################################################ # FUNCTION: DESCRIPTION: # lag,timeSeries Lags a 'timeSeries' object ################################################################################ ## GNB: made it an S3 method and removed the S4 one ## setMethod("lag" , "timeSeries", lag.timeSeries <- function(x, k = 1, trim = FALSE, units = NULL, ...) { # A function implemented by Diethelm Wuertz # Description: # Lags a 'timeSeries' object. # Arguments: # x - a 'timeSeries' object. # k - an integer indicating which lag to use. By default 1. # Note, negative lags are to data in the future. # trim - a logical. Should NAs at the beginning of the # series be removed? By default FALSE. # units - # ... - # Details: # The arguments differ in the following way from the function # stats::lag - lag(x, k = 1, ...) # Value: # Returns a lagged object of class 'timeSeries'. # Example: # SPI = 100* as.timeSeries(data(LPP2005REC))[1:20, "SPI"] # Note negative lags are to data in the future ! # lag(SPI, k = -2:2) # lag(SPI, k = 0:2 , trim = TRUE) # FUNCTION: # Check Arguments: stopifnot(is.timeSeries(x)) # Extract Title and Documentation: Title <- x@title Documentation <- x@documentation # Internal Function: tslagMat <- function(x, k = 1) { # Internal Function: tslag1 = function(x, k) { y = x if (k > 0) y = c(rep(NA, times = k), x[1:(length(x)-k)]) if (k < 0) y = c(x[(-k+1):length(x)], rep(NA, times = -k)) y } # Bind: ans <- NULL for (i in k) { ans <- cbind(ans, tslag1(x, i)) } # As Vector: if (length(k) == 1) ans <- as.vector(ans) # Return Value: ans } # Convert: y <- getDataPart(x) Dim <- dim(y)[2] # Lag on each Column: z <- NULL for (i in 1:Dim) { ts <- tslagMat( y[, i], k = k) #, trim = FALSE) z <- cbind(z, ts) } # Positions pos <- x@positions # Record IDs: df <- x@recordIDs # Trim: if (trim){ idx <- !is.na(apply(z, 1, sum)) z <- z[idx, , drop = FALSE] pos <- pos[idx] if (sum(dim(df)) > 0) { df <- df[idx, , drop = FALSE] rownames(df) <- seq.int(sum(idx)) } } # Augment Colnames: cn <- colnames(x) a <- if (is.null(units)) # ensure that colnames is replicated according to the length # of lag indexes. as.vector(matrix(cn, nrow = length(k), ncol = length(cn), byrow = TRUE)) else units kcols <- rep(k, times = ncol(y)) b <- paste("[", kcols, "]", sep="") ab <- paste(a, b, sep = "") units <- ab # Result: ans <- timeSeries(data = z, charvec = pos, units = units, format = x@format, FinCenter = x@FinCenter, recordIDs = df) # Preserve Title and Documentation: ans@title <- Title ans@documentation <- Documentation # Return Value: ans } ## # until UseMethod dispatches S4 methods in 'base' functions ## lag.timeSeries <- function(x, ...) timeSeries::lag(x, ...) ################################################################################ timeSeries/R/statistics-colCumsums.R0000755000176200001440000001750114270257546017254 0ustar liggesusers# # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # A copy of the GNU General Public License is available at # ../../COPYING ################################################################################ # FUNCTION: COLUMN CUMULATIVE SUMS: # colCumsums Computes sample cumulated sums by column # colCumsums,matrix S3 default method (for matrix objects) # colCumsums,timeSeries S3 method for timeSeries objects # FUNCTION: COLUMN CUMULATIVE MAXIMA: # colCummaxs Computes cumulated maximum values # colCummaxs,matrix S3 default method (for matrix objects) # colCummaxs,timeSeries S3 method for timeSeries objects # FUNCTION: COLUMN CUMULATIVE MAXIMA: # colCummins Computes cumulated maximum values # colCummins,matrix S3 default method (for matrix objects) # colCummins,timeSeries S3 method for timeSeries objects # FUNCTION: COLUMN CUMULATIVE MINIMA: # colCumprods Computes cumulated product values # colCumprods,matrix S3 default method (for matrix objects) # colCumprods,timeSeries S3 method for timeSeries objects # FUNCTION: COLUMN CUMULATIVE RETURNS: # colCumreturns Computes cumulated product values # colCumreturns,matrix S3 default method (for matrix objects) # colCumreturns,timeSeries S3 method for timeSeries objects ################################################################################ # ------------------------------------------------------------------------------ setMethod("colCumsums", "matrix", function(x, na.rm = FALSE, ...) { if (na.rm) x <- na.omit(x) ans <- apply(x, 2, cumsum, ...) # special treatment when x has one row because apply returns a vector if (NROW(x) == 1) ans <- matrix(ans, nrow = 1, dimnames = dimnames(x)) ans }) # ------------------------------------------------------------------------------ setMethod("colCumsums", "timeSeries", function(x, na.rm = FALSE, ...){ ## GB: split to debug #2121; was: ## setDataPart(x, callGeneric(getDataPart(x), na.rm = na.rm, ...)) ## 2022-07-27 bug #2121 ## can't delegate omitting NA to the matrix method since we need the time ## info after na.omit() here (to set the time properly if(na.rm) x <- na.omit(x) m = getDataPart(x) wrk = callGeneric(m, na.rm = FALSE, ...) # note: na.rm = FALSE res <- setDataPart(x, wrk) res }) # ------------------------------------------------------------------------------ setMethod("colCummaxs", "matrix", function(x, na.rm = FALSE, ...) { if (na.rm) x <- na.omit(x) ans <- apply(x, 2, cummax, ...) # special treatment when x has one row because apply returns a vector if (NROW(x) == 1) ans <- matrix(ans, nrow = 1, dimnames = dimnames(x)) ans }) # ------------------------------------------------------------------------------ setMethod("colCummaxs", "timeSeries", function(x, na.rm = FALSE, ...){ ## GB: split to debug #2121; was: ## setDataPart(x, callGeneric(getDataPart(x), na.rm = na.rm, ...)) ## 2022-07-27 bug #2121 ## can't delegate omitting NA to the matrix method since we need the time ## info after na.omit() here (to set the time properly if(na.rm) x <- na.omit(x) m = getDataPart(x) wrk = callGeneric(m, na.rm = FALSE, ...) # note: na.rm = FALSE res <- setDataPart(x, wrk) res }) # ------------------------------------------------------------------------------ setMethod("colCummins", "matrix", function(x, na.rm = FALSE, ...) { if (na.rm) x <- na.omit(x) ans <- apply(x, 2, cummin, ...) # special treatment when x has one row because apply returns a vector if (NROW(x) == 1) ans <- matrix(ans, nrow = 1, dimnames = dimnames(x)) ans }) # ------------------------------------------------------------------------------ setMethod("colCummins", "timeSeries", function(x, na.rm = FALSE, ...){ ## GB: split to debug #2121; was: ## setDataPart(x, callGeneric(getDataPart(x), na.rm = na.rm, ...)) ## 2022-07-27 bug #2121 ## can't delegate omitting NA to the matrix method since we need the time ## info after na.omit() here (to set the time properly if(na.rm) x <- na.omit(x) m = getDataPart(x) wrk = callGeneric(m, na.rm = FALSE, ...) # note: na.rm = FALSE res <- setDataPart(x, wrk) res }) # ------------------------------------------------------------------------------ setMethod("colCumprods", "matrix", function(x, na.rm = FALSE, ...) { if (na.rm) x <- na.omit(x) ans <- apply(x, 2, cumprod, ...) # special treatment when x has one row because apply returns a vector if (NROW(x) == 1) ans <- matrix(ans, nrow = 1, dimnames = dimnames(x)) ans }) # ------------------------------------------------------------------------------ setMethod("colCumprods", "timeSeries", function(x, na.rm = FALSE, ...){ ## GB: split to debug #2121; was: ## setDataPart(x, callGeneric(getDataPart(x), na.rm = na.rm, ...)) ## 2022-07-27 bug #2121 ## can't delegate omitting NA to the matrix method since we need the time ## info after na.omit() here (to set the time properly if(na.rm) x <- na.omit(x) m = getDataPart(x) wrk = callGeneric(m, na.rm = FALSE, ...) # note: na.rm = FALSE res <- setDataPart(x, wrk) res }) # ------------------------------------------------------------------------------ setMethod("colCumreturns", "matrix", function(x, method = c("geometric", "simple"), na.rm = FALSE, ...) { # A function implemented by Diethelm Wuertz and Yohan Chalabi # Description: # Cumulates Returns from a stream of returns # Arguments: # x : a matrix object # method : generate geometric or simple returns, # default "geometric". # FUNCTION: # Handle Missing Values: if (na.rm) x <- na.omit(x, ...) method <- match.arg(method) # Return Value switch(method, "geometric" = colCumsums(x), "simple" = colCumprods(1+x) - 1) }) # ------------------------------------------------------------------------------ setMethod("colCumreturns", "timeSeries", function(x, method = c("geometric", "simple"), na.rm = FALSE, ...) { # A function implemented by Diethelm Wuertz and Yohan Chalabi # Description: # Cumulates Returns from a stream of returns # Arguments: # x : a timeSeries object # method : generate geometric or simple returns, # default "geometric". # FUNCTION: # Handle Missing Values: if (na.rm) x <- na.omit(x, ...) method <- match.arg(method) # Return Value switch(method, "geometric" = colCumsums(x), "simple" = colCumprods(1+x) - 1) }) ################################################################################ timeSeries/R/aaa-Deprecated.R0000755000176200001440000000377214436616227015516 0ustar liggesusers# # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # A copy of the GNU General Public License is available at # ../../COPYING ################################################################################ # DEPRECATED: # .description # durationSeries # midquoteSeries # spreadSeries ################################################################################ ## removed on 2023-06-03 ## ## .description <- ## function() ## { ## # Deprecated: ## .Deprecated(new = "description", package = "timeSeries") ## ## # Return Value: ## description() ## } ## ## ## # ------------------------------------------------------------------------------ ## ## ## durationSeries <- ## function(...) ## { ## # Deprecated: ## .Deprecated(new = "returns", package = "timeSeries") ## ## # Return Value: ## durations(...) ## } ## ## ## # ------------------------------------------------------------------------------ ## ## midquoteSeries = ## function(...) ## { ## # Deprecated: ## .Deprecated(new = "midquotes", package = "timeSeries") ## ## # Return Value: ## midquotes(...) ## } ## ## ## # ------------------------------------------------------------------------------ ## ## ## spreadSeries = ## function(...) ## { ## # Deprecated: ## .Deprecated(new = "spreads", package = "timeSeries") ## ## # Return Value: ## spreads(...) ## } ################################################################################ timeSeries/R/statistics-colSums.R0000755000176200001440000000772714433671346016557 0ustar liggesusers # This library is free software; you can redistribute it and/or # modify it under the terms of the GNU Library General Public # License as published by the Free Software Foundation; either # version 2 of the License, or (at your option) any later version. # # This library is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU Library General Public License for more details. # # You should have received a copy of the GNU Library General # Public License along with this library; if not, write to the # Free Foundation, Inc., 59 Temple Place, Suite 330, Boston, # MA 02111-1307 USA ################################################################################ # FUNCTION: COLUMN STATISTICS: # colStats Computes sample statistics by column # colSums Computes sums of all values in each column # colMeans Computes means of all values in each column # colSds Computes standardard deviation of each column # colVars Computes sample variance by column # colSkewness Computes sample skewness by column # colKurtosis Computes sample kurtosis by column # colMaxs Computes maximum values in each colum # colMins Computes minimum values in each colum # colProds Computes product of all values in each colum # colQuantiles Computes quantiles of all values in each colum ################################################################################ colStats <- function(x, FUN, ...) { # A function implemented by Diethelm Wuertz # Description: # Computes sample statistics by column # FUNCTION: # Statistics: if (inherits(x, "timeSeries")) apply(na.omit(getDataPart(x), ...), 2, FUN, ...) #<< YC : as.matrix is slow ! else apply(na.omit(as.matrix(x), ...), 2, FUN, ...) } # ------------------------------------------------------------------------------ # YC important because default colSums is unefficient since it retrieves # full dimnames, i.e. rownames which is very time consuming if (getRversion() < "2.9.0") { setMethod("colSums", "timeSeries", function(x, na.rm = FALSE, dims = 1L) { x <- getDataPart(x) callGeneric() }) } else { setMethod("colSums", "timeSeries", function(x, na.rm = FALSE, dims = 1L, ...) { x <- getDataPart(x) callGeneric() }) } # ------------------------------------------------------------------------------ # YC important because default colSums is unefficient since it retrieves # full dimnames, i.e. rownames which is very time consuming if (getRversion() < "2.9.0") { setMethod("colMeans", "timeSeries", function(x, na.rm = FALSE, dims = 1L) { x <- getDataPart(x) callGeneric() }) } else { setMethod("colMeans", "timeSeries", function(x, na.rm = FALSE, dims = 1L, ...) { x <- getDataPart(x) callGeneric() }) } # ------------------------------------------------------------------------------ colSds <- function(x, ...) { colStats(x, "sd", ...) } colVars <- function(x, ...) { colStats(x, "var", ...) } colSkewness <- function(x, ...) { colStats(x, "skewness", ...) } colKurtosis <- function(x, ...) { colStats(x, "kurtosis", ...) } colMaxs <- function(x, ...) { colStats(x, "max", ...) } colMins <- function(x, ...) { colStats(x, "min", ...) } colProds <- function(x, ...) { colStats(x, "prod", ...) } # ------------------------------------------------------------------------------ colQuantiles <- function(x, prob = 0.05, ...) { # FUNCTION: stopifnot(length(prob) == 1) colStats(x, "quantile", probs = prob, ...) } timeSeries/R/base-subsetting.R0000755000176200001440000005436214434676524016042 0ustar liggesusers# # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # A copy of the GNU General Public License is available at # ../../COPYING ################################################################################ # METHOD: SUBSETTING METHODS ON DATA: # .subset_timeSeries # .findIndex # $,timeSeries Subsets a time series by column names # $<-,timeSeries Replaces subset by column names # [,timeSeries Subsets a time series object # [<-,timeSeries Assigns value to subsets of a time series ################################################################################ ################################################################################ # index ################################################################################ # Note : no "character" -> because needs to be coerced to timeDate object. setClassUnion("index_timeSeries", members = c("numeric", "logical")) setClassUnion("time_timeSeries", members = c("POSIXt", "Date")) # ------------------------------------------------------------------------------ .subset_timeSeries <- function(x, i, j) { stopifnot(inherits(x, "timeSeries")) stopifnot(is(i, "index_timeSeries")) stopifnot(is(j, "index_timeSeries")) # subset data and positions t <- try(data <- .subset(x, i, j, drop = FALSE), silent = TRUE) if (inherits(t, "try-error")) { # cast error and remove calling function msg <- sub("Error in.*: \n *", "", t) stop(msg, call. = FALSE) } pos <- if (length(x@positions)>0) .subset(x@positions, i) else numeric(0) units <- .subset(x@units, j) # Record IDs: df <- x@recordIDs if (prod(dim(df))) df <- df[i, , drop = FALSE] # Result new("timeSeries", .Data = data, title = x@title, documentation = x@documentation, format = x@format, FinCenter = x@FinCenter, units = units, recordIDs = df, positions = pos) } # ------------------------------------------------------------------------------ .findIndex <- function(ipos, pos) { attributes(ipos) <- NULL if (unsorted <- is.unsorted(pos)) { or <- order(pos) pos <- pos[or] } i <- findInterval(ipos, pos) if (!identical(ipos, pos[i])) stop("subscript out of bounds", call. = FALSE) if (unsorted) i <- or[i] i } ################################################################################ # [,timeSeries Subsets of a 'timeSeries' object ################################################################################ ## i <- c("index_timeSeries", "character", "timeDate", ## "timeSeries", "missing", "ANY") ## j <- c("index_timeSeries", "character", "timeSeries", ## "missing", "ANY") ## expand.grid(i = i, j = j) ## > i j ## 1 index_timeSeries index_timeSeries ## 2 character index_timeSeries ## 3 timeDate index_timeSeries ## 4 timeSeries index_timeSeries ## 5 missing index_timeSeries ## 6 ANY index_timeSeries ## 7 index_timeSeries character ## 8 character character ## 9 timeDate character ## 10 timeSeries character ## 11 missing character ## 12 ANY character ## 13 index_timeSeries timeSeries ## 14 character timeSeries ## 15 timeDate timeSeries ## 16 timeSeries timeSeries ## 17 missing timeSeries ## 18 ANY timeSeries ## 19 index_timeSeries missing ## 20 character missing ## 21 timeDate missing ## 22 timeSeries missing ## 23 missing missing ## 24 ANY missing ## 25 index_timeSeries ANY ## 26 character ANY ## 27 timeDate ANY ## 28 timeSeries ANY ## 29 missing ANY ## 30 ANY ANY ## YC : Added i=time_timeSeries i <- "time_timeSeries" j <- c("index_timeSeries", "character", "timeSeries", "missing", "ANY") expand.grid(i = i, j = j) ## 1 time_timeSeries index_timeSeries ## 2 time_timeSeries character ## 3 time_timeSeries timeSeries ## 4 time_timeSeries missing ## 5 time_timeSeries ANY # ------------------------------------------------------------------------------ ## FIXME : deal with signal series # ------------------------------------------------------------------------------ ## 1 index_timeSeries index_timeSeries setMethod("[", signature(x = "timeSeries", i = "index_timeSeries", j = "index_timeSeries"), function(x, i, j, ..., drop = FALSE) .subset_timeSeries(x, i, j)) # ------------------------------------------------------------------------------ ## 2 character index_timeSeries setMethod("[", signature(x = "timeSeries", i = "character", j = "index_timeSeries"), function(x, i, j, ..., drop = FALSE) { td <- timeDate(i) if (any(is.na(td))) return(as.vector(NA)) # bad to use directly @Data but more efficient in this case i <- .findIndex(td@Data, x@positions) .subset_timeSeries(x, i, j) }) # ------------------------------------------------------------------------------ ## 3 timeDate index_timeSeries setMethod("[", signature(x = "timeSeries", i = "timeDate", j = "index_timeSeries"), function(x, i, j, ..., drop = FALSE) { # bad to use directly @Data but more efficient in this case i <- .findIndex(i@Data, x@positions) .subset_timeSeries(x, i, j) }) # ------------------------------------------------------------------------------ ## 4 timeSeries index_timeSeries setMethod("[", signature(x = "timeSeries", i = "timeSeries", j = "index_timeSeries"), function(x, i, j, ..., drop = FALSE) { if (x@format != "counts" && i@format != "counts" && finCenter(x) != finCenter(i)) stop("FinCenter of timeSeries and subset do not match") .subset_timeSeries(x, as.vector(i), j) }) # ------------------------------------------------------------------------------ ## 5 missing index_timeSeries setMethod("[", signature(x = "timeSeries", i = "missing", j = "index_timeSeries"), function(x, i, j, ..., drop = FALSE) .subset_timeSeries(x, TRUE, j)) # ------------------------------------------------------------------------------ ## 6 ANY index_timeSeries setMethod("[", signature(x = "timeSeries", i = "ANY", j = "index_timeSeries"), function(x,i,j, ..., drop = FALSE) stop("invalid or not-yet-implemented 'timeSeries' subsetting")) # ------------------------------------------------------------------------------ ## 7 index_timeSeries character setMethod("[", signature(x = "timeSeries", i = "index_timeSeries", j = "character"), function(x, i, j, ..., drop = FALSE) { j <- pmatch(j, slot(x, "units"), duplicates.ok = TRUE) if (any(is.na(j))) stop("subscript out of bounds", call. = FALSE) .subset_timeSeries(x, i, j) }) # ------------------------------------------------------------------------------ ## 8 character character setMethod("[", signature(x = "timeSeries", i = "character", j = "character"), function(x, i, j, ..., drop = FALSE) { j <- pmatch(j, slot(x, "units"), duplicates.ok = TRUE) if (any(is.na(j))) stop("subscript out of bounds", call. = FALSE) callGeneric(x=x, i=i, j=j, drop=drop) }) # ------------------------------------------------------------------------------ ## 9 timeDate character setMethod("[", signature(x = "timeSeries", i = "timeDate", j = "character"), function(x, i, j, ..., drop = FALSE) { # bad to use directly @Data but more efficient in this case i <- .findIndex(i@Data, x@positions) j <- pmatch(j, slot(x, "units"), duplicates.ok = TRUE) if (any(is.na(j))) stop("subscript out of bounds", call. = FALSE) .subset_timeSeries(x, i, j) }) # ------------------------------------------------------------------------------ ## 10 timeSeries character # inherited method works fine # ------------------------------------------------------------------------------ ## 11 missing character setMethod("[", signature(x = "timeSeries", i = "missing", j = "character"), function(x, i, j, ..., drop = FALSE) { j <- pmatch(j, slot(x, "units"), duplicates.ok = TRUE) if (any(is.na(j))) stop("subscript out of bounds", call. = FALSE) .subset_timeSeries(x, TRUE, j) }) # ------------------------------------------------------------------------------ ## 12 ANY character setMethod("[", signature(x = "timeSeries", i = "ANY", j = "index_timeSeries"), function(x,i,j, ..., drop = FALSE) stop("invalid or not-yet-implemented 'timeSeries' subsetting")) # ------------------------------------------------------------------------------ ## 13 index_timeSeries timeSeries ## 14 character timeSeries ## 15 timeDate timeSeries ## 16 timeSeries timeSeries ## 17 missing timeSeries ## 18 ANY timeSeries ## rely on inherited methods # ------------------------------------------------------------------------------ ## 19 index_timeSeries missing setMethod("[", signature(x = "timeSeries", i = "index_timeSeries", j = "missing"), function(x, i, j, ..., drop = FALSE) { if(nargs() == 2) { # same sub-setting as matrix if(any(as.logical(i)) || prod(dim(x)) == 0) as.vector(x)[i] } else { .subset_timeSeries(x, i, TRUE) } }) # ------------------------------------------------------------------------------ ## 20 character missing setMethod("[", signature(x = "timeSeries", i = "character", j = "missing"), function(x, i, j, ..., drop = FALSE) { if (nargs() == 2) as.numeric(NA) #-> return NA if comma missing else callGeneric(x=x, i=i, j=TRUE) }) # ------------------------------------------------------------------------------ ## 21 timeDate missing setMethod("[", signature(x = "timeSeries", i = "timeDate", j = "missing"), function(x, i, j, ..., drop = FALSE) { # do not return NA if comma missing because timeDate index # bad to use directly @Data but more efficient in this case i <- .findIndex(i@Data, x@positions) .subset_timeSeries(x, i, TRUE) }) # ------------------------------------------------------------------------------ ## 22 timeSeries missing setMethod("[", signature(x = "timeSeries", i = "timeSeries", j = "missing"), function(x, i, j, ..., drop = FALSE) { if (x@format != "counts" && i@format != "counts" && finCenter(x) != finCenter(i)) stop("FinCenter of timeSeries and subset do not match") if(nargs() == 2) { if(any(as.logical(i)) || prod(dim(x)) == 0) as.vector(x)[as.vector(i)] } else { .subset_timeSeries(x, as.vector(i), TRUE) } }) # ------------------------------------------------------------------------------ ## workaround i <- matrix. setMethod("[", signature(x = "timeSeries", i = "matrix", j = "missing"), function(x, i, j, ..., drop = FALSE) { if(nargs() == 2) { # same sub-setting as matrix if(any(as.logical(i)) || prod(dim(x)) == 0) as.vector(x)[i] } else { .subset_timeSeries(x, as.vector(i), TRUE) } }) # ------------------------------------------------------------------------------ ## 23 missing missing setMethod("[", signature(x = "timeSeries", i = "missing", j = "missing"), function(x, i, j, ..., drop = FALSE) x) # ------------------------------------------------------------------------------ ## 24 ANY missing setMethod("[", signature(x = "timeSeries", i = "ANY", j = "index_timeSeries"), function(x,i,j, ..., drop = FALSE) stop("invalid or not-yet-implemented 'timeSeries' subsetting")) # ------------------------------------------------------------------------------ ## 25 index_timeSeries ANY setMethod("[", signature(x = "timeSeries", i = "ANY", j = "index_timeSeries"), function(x,i,j, ..., drop = FALSE) stop("invalid or not-yet-implemented 'timeSeries' subsetting")) # ------------------------------------------------------------------------------ ## 26 character ANY setMethod("[", signature(x = "timeSeries", i = "ANY", j = "index_timeSeries"), function(x,i,j, ..., drop = FALSE) stop("invalid or not-yet-implemented 'timeSeries' subsetting")) # ------------------------------------------------------------------------------ ## 27 timeDate ANY setMethod("[", signature(x = "timeSeries", i = "ANY", j = "index_timeSeries"), function(x,i,j, ..., drop = FALSE) stop("invalid or not-yet-implemented 'timeSeries' subsetting")) # ------------------------------------------------------------------------------ ## 28 timeSeries ANY setMethod("[", signature(x = "timeSeries", i = "ANY", j = "index_timeSeries"), function(x,i,j, ..., drop = FALSE) stop("invalid or not-yet-implemented 'timeSeries' subsetting")) # ------------------------------------------------------------------------------ ## 29 missing ANY setMethod("[", signature(x = "timeSeries", i = "ANY", j = "index_timeSeries"), function(x,i,j, ..., drop = FALSE) stop("invalid or not-yet-implemented 'timeSeries' subsetting")) # ------------------------------------------------------------------------------ ## 30 ANY ANY setMethod("[", signature(x = "timeSeries", i = "ANY", j = "index_timeSeries"), function(x,i,j, ..., drop = FALSE) stop("invalid or not-yet-implemented 'timeSeries' subsetting")) # ------------------------------------------------------------------------------ ## 1 time_timeSeries index_timeSeries setMethod("[", signature(x = "timeSeries", i = "time_timeSeries", j = "index_timeSeries"), function(x,i,j, ..., drop = FALSE) { i <- timeDate(i) callGeneric(x=x, i=i, j=j, drop=drop) }) # ------------------------------------------------------------------------------ ## 2 time_timeSeries character setMethod("[", signature(x = "timeSeries", i = "time_timeSeries", j = "character"), function(x,i,j, ..., drop = FALSE) { i <- timeDate(i) callGeneric(x=x, i=i, j=j, drop=drop) }) # ------------------------------------------------------------------------------ ## 4 time_timeSeries missing setMethod("[", signature(x = "timeSeries", i = "time_timeSeries", j = "missing"), function(x,i,j, ..., drop = FALSE) { i <- timeDate(i) callGeneric(x=x, i=i, drop=drop) }) # ------------------------------------------------------------------------------ ## 5 time_timeSeries ANY setMethod("[", signature(x = "timeSeries", i = "time_timeSeries", j = "ANY"), function(x,i,j, ..., drop = FALSE) { i <- timeDate(i) callGeneric(x=x, i=i, j=j, drop=drop) }) ################################################################################ # $,timeSeries Subset by column names ################################################################################ # should behave the same way as $,data.frame setMethod("$", signature(x = "timeSeries"), function (x, name) { nc <- colnames(x) nr <- names(x@recordIDs) dataIdx <- pmatch(name, nc) recordIDsIdx <- pmatch(name, nr) ## if none or more than one match return NULL. ## ## GNB: 'more than one match' is in the sense that 'name' has a match in ## both colnames(x) and names(x@recordIDs). Note that 'name is of ## length 1, the matches are of length one and there is no problem in ## the 'if'. if ((is.na(dataIdx) && is.na(recordIDsIdx)) || (!is.na(dataIdx) && !is.na(recordIDsIdx))) return(NULL) if (!is.na(dataIdx)) return(.subset(x, TRUE, dataIdx)) if (!is.na(recordIDsIdx)) return(x@recordIDs[[recordIDsIdx]]) NULL }) # methods to generate completion after $ .DollarNames.timeSeries <- function(x, pattern) grep(pattern, names(x), value = TRUE) ################################################################################ # $<-,timeSeries Subset by column names ################################################################################ .dollar_assign <- function(x, name, value) { stopifnot(inherits(x, "timeSeries")) # check size of value if (NROW(value) < nrow(x)) { value <- rep(value, length.out = nrow(x)) } else if (NROW(value) > nrow(x)) { stop(gettextf("replacement has %i rows, time series has %i", NROW(value), nrow(x))) #, call. = FALSE) } # assign value to recordIDs if (length(x@recordIDs)) { x@recordIDs[[name]] <- value } else { x@recordIDs <- as.data.frame(value) colnames(x@recordIDs) <- name } # check if object is valid validObject(x) x } setReplaceMethod("$", signature(x = "timeSeries", value = "numeric"), function(x, name, value) { # check size of value if (NROW(value) < nrow(x)) { value <- rep(value, length.out = nrow(x)) } else if (NROW(value) > nrow(x)) { stop(gettextf("replacement has %i rows, time series has %i", NROW(value), nrow(x))) #, call. = FALSE) } # get data part data <- getDataPart(x) # coerce value to matrix ncol <- NCOL(value) value <- matrix(value, ncol = NCOL(value), dimnames = NULL) # set up colnames cn <- colnames(value) if (any(is.null(cn))) cn <- if (ncol > 1) paste(name, ".", seq.int(ncol), sep = "") else name colnames(value) <- cn # if name already present - subsitute ... if (any(cdata <- (colnames(data) %in% cn))) { cvalue <- cn %in% colnames(data) data[,cdata] <- value[,cvalue] value <- cbind(data, value[,!cvalue]) ans <- setDataPart(x, value) } else { ans <- .dollar_assign(x, name, as.vector(value)) } # return ans }) setReplaceMethod("$", signature(x = "timeSeries", value = "factor"), function(x, name, value) .dollar_assign(x, name, value)) setReplaceMethod("$", signature(x = "timeSeries", value = "ANY"), function(x, name, value) .dollar_assign(x, name, value)) ################################################################################ # [<-,timeSeries Assign value to subsets of a 'timeSeries' object ################################################################################ # Note that most of the generic function works by default with [<-,timeDate # only need to deal with special cases that are i <- ("timeDate", "character") # ------------------------------------------------------------------------------ # timeDate setReplaceMethod("[", signature(x = "timeSeries", i = "timeDate", j = "ANY"), function(x, i, j, value) { # bad to use directly @Data but more efficient in this case i <- .findIndex(i@Data, x@positions) callGeneric(x=x, i=i, j=j, value=value) }) setReplaceMethod("[", signature(x = "timeSeries", i = "timeDate", j = "missing"), function(x, i, j, value) callGeneric(x=x, i=i, j=TRUE, value=value)) # ------------------------------------------------------------------------------ # character setReplaceMethod("[", signature(x = "timeSeries", i = "character", j = "ANY"), function(x, i, j, value) { i <- timeDate(i) callGeneric(x=x, i=i, j=j, value=value) }) setReplaceMethod("[", signature(x = "timeSeries", i = "character", j = "missing"), function(x, i, j, value) { i <- timeDate(i) callGeneric(x=x, i=i, j=TRUE, value=value) }) ################################################################################ timeSeries/R/stats-aggregate.R0000644000176200001440000001350714547777762016031 0ustar liggesusers# # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # A copy of the GNU General Public License is available at # ../../COPYING ################################################################################ # FUNCTION: DESCRIPTION: # aggregate,timeSeries Aggregates a 'timeSeries' object # FUNCTION: DESCRIPTION: # daily2monthly Aggregates a daily to monthly 'timeSeries' object # daily2weekly Aggregates a daily to weekly 'timeSeries' object ################################################################################ ## GNB: 2024-01-11 GNB: streamlined and removed the S4 method aggregate.timeSeries <- function(x, by, FUN, ...) { # A function implemented by Yohan Chalabi and Diethelm Wuertz # Description: # Aggregates a 'timeSeries' object # Details: # This function can be used to aggregate and coursen a # 'timeSeries' object. # Arguments: # x - a 'timeSeries' object to be aggregated # by - a calendarical block # FUN - function to be applied, by default 'colMeans' # ... - additional argument to be passed to the newly generated # 'timeSeries' object # Value: # Returns a S4 object of class 'timeSeries'. # Examples: # Quarterly Aggregation: # m = matrix(rep(1:12,2), ncol = 2) # ts = timeSeries(m, timeCalendar()) # Y = getRmetricsOptions("currentYear"); Y # from = paste(Y, "04-01", sep = "-"); to = paste(Y+1, "01-01", sep = "-") # by = timeSequence(from, to, by = "quarter") - 24*3600; by # ts; aggregate(ts, by, sum) # Weekly Aggregation: # dates = timeSequence(from = "2009-01-01", to = "2009-02-01", by = "day") # data = 10 * round(matrix(rnorm(2*length(dates)), ncol = 2), 1); data # ts = timeSeries(data = data, charvec = dates) # by = timeSequence(from = "2009-01-08", to = "2009-02-01", by = "week") # by = by - 24*3600; aggregate(ts, by, sum) # FUNCTION: # Check Arguments: if (!((inherits(by, "timeDate") && x@format != "counts") || (is.numeric(by) && x@format == "counts"))) stop("'by' should be of the same class as 'time(x)'", call.=FALSE) # Extract Title and Documentation: Title <- x@title Documentation <- x@documentation # Make sure that x is sorted (by timedate): if (is.unsorted(x)) x <- sort(x) # Sort and remove duplicated entries in by: by <- unique(sort(by)) INDEX <- findInterval(x@positions, as.numeric(by, "sec") + 1) INDEX <- INDEX + 1 is.na(INDEX) <- !(INDEX <= length(by)) # YC : ncol important to avoid problems of dimension dropped by apply data <- matrix(apply(getDataPart(x), 2, tapply, INDEX, FUN), ncol=ncol(x)) rownames(data) <- as.character(by[unique(na.omit(INDEX))]) colnames(data) <- colnames(x) ans <- timeSeries(data, ...) # Preserve Title and Documentation: ans@title <- Title ans@documentation <- Documentation # Return Value: ans } ## GNB: 2024-01-11 GNB: streamlined and removed the S4 method ## setMethod("aggregate", "timeSeries", function(x, by, FUN, ...) ## .aggregate.timeSeries(x, by, FUN, ...)) ## ## # until UseMethod dispatches S4 methods in 'base' functions ## aggregate.timeSeries <- function(x, ...) .aggregate.timeSeries(x, ...) ################################################################################ daily2monthly <- function (x, init = FALSE) { # A function implemented by Diethelm Wuertz # Description: # Converts daily to monthly series # Arguments: # x - daily time series # init - should the index series converted to a wealth series # FUNCTION: # Save Colnames: colNames <- colnames(x) # Fill to end of Month: Time <- unique(sort(timeLastDayInMonth(time(x)))) x.endOfMonth <- x[nrow(x), ] time(x.endOfMonth) <- rev(Time)[1] x <- rbind(x, x.endOfMonth) x <- alignDailySeries(x, include.weekends=TRUE) # Cut Properly on end of Month: today <- timeDate(Sys.Date()) first <- timeFirstDayInMonth(today) x <- x[time(x) < first, ] Time <- unique(sort(timeLastDayInMonth(time(x)))) # Align Properly: mSeries <- alignDailySeries(x, include.weekends=TRUE) mSeries <- mSeries[Time, ] # Optionally Initialize: if (init) for (i in 1:ncol(mSeries)) mSeries[, i] <- mSeries[, i]/as.vector(mSeries[1, i]) colnames(mSeries) <- colNames # Return Value: mSeries } # ----------------------------------------------------------------------------- daily2weekly <- function(x, startOn="Tue", init=FALSE) { # A function implemented by Diethelm Wuertz # Description: # Converts daily to weekly series # Arguments: # x - daily time series # init - should the index series converted to a wealth series # FUNCTION: # Convert Series: mSeries <- alignDailySeries(x, include.weekends = TRUE) start <- which(dayOfWeek(time(mSeries[1:7, ])) == startOn) mSeries <- mSeries[seq(start, nrow(mSeries), by = 7), ] # Wealth Initialization: if (init) for (i in 1:ncol(mSeries)) mSeries[, i] <- mSeries[, i]/as.vector(mSeries[1, i]) # Return Value: mSeries } ############################################################################### timeSeries/R/utils-old2new.R0000755000176200001440000000524414263246022015430 0ustar liggesusers# # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # A copy of the GNU General Public License is available at # ../../COPYING ################################################################################ .old2newTimeSeries <- function(x) { # Version 1: if ("Data" %in% slotNames(x)) { data <- x@Data charvec <- timeDate(x@positions, zone = x@FinCenter, FinCenter = x@FinCenter) units <- x@units recordIDs <- x@recordIDs title <- x@title documentation <- x@documentation x <- timeSeries(data = data, charvec = charvec, units = units, recordIDs = recordIDs, title = title, documentation = documentation) } # Version 2: if ((".Data" %in% slotNames(x)) && is.character(x@positions)) { data <- x@.Data charvec <- timeDate(x@positions, zone = x@FinCenter, FinCenter = x@FinCenter) units <- x@units recordIDs <- x@recordIDs title <- x@title documentation <- x@documentation x <- timeSeries(data = data, charvec = charvec, units = units, recordIDs = recordIDs, title = title, documentation = documentation) } x } # ------------------------------------------------------------------------------ ## # Example ## library(timeSeries) ## setwd("~/r/fPortfolio/data") ## rda <- dir() ## sapply(rda, .old2newRda, suffix = "") .old2newRda <- function(file, suffix = "_new") { stopifnot(length(file) == 1) local({ load(file) nm <- ls() lold <- mget(nm, envir = environment(NULL)) test <- sapply(lold, is.timeSeries) lold <- lold[test] lnew <- lapply(lold, .old2newTimeSeries) objects <- names(lold) for (nm in objects) assign(nm, lnew[[nm]]) newFile <- paste(file, suffix, sep = "") save(list = objects, file = newFile) }) invisible(TRUE) } ################################################################################ timeSeries/R/methods-comment.R0000755000176200001440000000266614263246022016030 0ustar liggesusers# # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # A copy of the GNU General Public License is available at # ../../COPYING ################################################################################ # FUNCTION: DESCRIPTION: # comment, timeSeries Get documentation slot of a timeSeries object # comment<-,timeSeries Set documentation slot of a timeSeries object ################################################################################ setMethod("comment", "timeSeries", function(x) { # A function implemented by Yohan Chalabi and Diethelm Wuertz # Return Value: x@documentation } ) # ------------------------------------------------------------------------------ setMethod("comment<-", "timeSeries", function(x, value) { x@documentation <- paste(value, collapse = " ") # Return Value: x } ) ################################################################################ timeSeries/R/base-diff.R0000644000176200001440000000641114546301755014543 0ustar liggesusers# # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # A copy of the GNU General Public License is available at # ../../COPYING ############################################################################### # FUNCTION: DESCRIPTION: # diff.timeSeries Differences a 'timeSeries' object ############################################################################### diff.timeSeries <- function(x, lag = 1, diff = 1, trim = FALSE, pad = NA, ...) { # A function implemented by Diethelm Wuertz # Modified by Yohan Chalabi # Description: # Differences 'timeSeries' objects. # Arguments: # x - a 'timeSeries' object. # lag - an integer indicating which lag to use. # By default 1. # diff - an integer indicating the order of the difference. # By default 1. # trim - a logical. Should NAs at the beginning of the # series be removed? # pad - a umeric value with which NAs should be replaced # at the beginning of the series. # Value: # Returns a differenced object of class 'timeSeries'. # FUNCTION: # Ceck Arguments: stopifnot(is.timeSeries(x)) # Extract Title and Documentation: Title <- x@title Documentation <- x@documentation # Convert: y <- getDataPart(x) # as.matrix(x) # Check NAs: # if (any(is.na(y))) stop("NAs are not allowed in time series") # Difference: z <- diff(y, lag = lag, difference = diff) diffNums = dim(y)[1] - dim(z)[1] # Trim Positions: if (!trim) { zpad <- matrix(0*y[1:diffNums, ] + pad, nrow = diffNums) z <- rbind(zpad, z) } pos <- if (!trim) x@positions else x@positions[-(1:diffNums)] # Record IDs: df <- x@recordIDs if (trim && sum(dim(df)) > 0) { df <- df[-seq.int(diffNums), , drop = FALSE] rownames(df) <- seq.int(NROW(df)) } # Diff Result: ans <- timeSeries(data = z, charvec = pos, units = colnames(z), format = x@format, zone = x@FinCenter, FinCenter = x@FinCenter, recordIDs = df) # Preserve Title and Documentation: ans@title <- Title ans@documentation <- Documentation # Return Value: ans } # ----------------------------------------------------------------------------- ## 2024-01-06 GNB: removed the S4 method ## ## setMethod("diff", "timeSeries", ## function(x, lag = 1, diff = 1, trim = FALSE, pad = NA, ...) ## diff.timeSeries(x, lag, diff, trim, pad, ...) ## ##x <- getDataPart(x) ## ##callGeneric() ## ) ## # until UseMethod dispatches S4 methods in 'base' functions ## diff.timeSeries <- function(x, ...) .diff.timeSeries(x, ...) ############################################################################### timeSeries/R/base-apply.R0000755000176200001440000000606614322357566014774 0ustar liggesusers# # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # A copy of the GNU General Public License is available at # ../../COPYING ################################################################################ # FUNCTION: DESCRIPTION: # apply Applies a function to blocks of a 'timeSeries' ################################################################################ setMethod("apply", "timeSeries", function(X, MARGIN, FUN, ...) { # A function implemented by Diethelm Wuertz and Yohan Chalabi # Description: # Apply Functions Over 'Array' timeSeries' Margins # Arguments: # X - an array, including a matrix. => GNB: actually the code throws error if X # is not 'timeSeries'. # MARGIN - a vector giving the subscripts which the function # will be applied over. E.g., for a matrix 1 indicates rows, # 2 indicates columns, c(1, 2) indicates rows and columns. # Where X has named dimnames, it can be a character vector # selecting dimension names. # FUN - the function to be applied: see ???Details???. In the case # of functions like +, %*%, etc., the function name must be # backquoted or quoted. # ... - optional arguments to FUN. # Value: # Returns a vector or array or list of values obtained by # applying a function to margins of a 'timeSeries'. If the # returned value is a matrix, and if the input argument X and # the returned value have the same number of rows, then the # returned value will be transformed into a 'timeSeries' object. # FUNCTION # Check arguments: stopifnot(is.timeSeries(X)) # Extract Title and Documentation: Title <- X@title Documentation <- X@documentation # Settings: pos <- X@positions rec <- X@recordIDs FinCenter <- finCenter(X) X <- getDataPart(X) ans <- callGeneric() # Manage when univariate timeSeries drops the apply to vector: if( is(ans, "vector") && identical(length(ans), NROW(X)) ) { ans <- matrix(ans, ncol=1) } # Result: if (is(ans, "matrix") && identical(NROW(ans), NROW(X))) { # Compose timeSeries ans <- timeSeries( data = ans, charvec = pos, one = FinCenter, FinCenter = FinCenter, recordIDs = rec) # Preserve Title and Documentation: ans@title <- Title ans@documentation <- Documentation } # Return Value: ans }) ############################################################################### timeSeries/R/timeSeries-readSeries.R0000755000176200001440000001026014263246022017107 0ustar liggesusers# # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # A copy of the GNU General Public License is available at # ../../COPYING ################################################################################ # FUNCTION: DESCRIPTION: # readSeries Reads a CSV file and creates a 'timeSeries' ################################################################################ # DW: # I think we should add a similar function for writeSeries() using # write.table(). Proceed in the same way as in the case of the read # function. # ------------------------------------------------------------------------------ readSeries <- function(file, header = TRUE, sep = ";", zone = "", FinCenter = "", format, ...) { # A function implemented by Diethelm Wuertz # Description: # Reads from a spreadsheet and creates a 'timeSeries' object # Arguments: # file - the name of the file which the data are to be read # from. Each row of the table appears as one line of the # file. If it does not contain an absolute path, the file # name is relative to the current working directory, # getwd(). Tilde-expansion is performed where supported. # As from R 2.10.0 this can be a compressed file. # header - a logical value indicating whether the file contains # the names of the variables as its first line. If missing, # the value is determined from the file format: header is # set to TRUE if and only if the first row contains one fewer # field than the number of columns. # sep - he field separator character. Values on each line of # the file are separated by this character. If sep = "" (the # default for read.table) the separator is ?white space?, # that is one or more spaces, tabs, newlines or carriage # returns. # zone - the time zone or financial center where the data were # recorded. # FinCenter - a character with the the location of the # financial center named as "continent/city". By default # an empty string which means that internally "GMT" will # be used. # format - the format of the timestamps as recoreded in the # first column of the data in the.. # ... - optional arguments passed to the function read.table(). # Value: # Returns a S4 object of class 'timeSeries'. # Notes: # Note we expect that the header of the spreadsheet file in # the first cell holds the time/date format specification! # FUNCTION: # Read Data: df <- read.table(file = file, header = header, sep = sep, check.names = FALSE, ...) # Get 'timeDate' from first column with header specifying the format charvec <- as.character(df[[1]]) if (missing(format)) format <- names(df)[1] td <- try(timeDate(charvec = charvec, format = format, zone = zone, FinCenter = FinCenter), silent=TRUE) # DW: 2014-09-16 # If sep=";" fails try with sep=",": if (sep == ";" && inherits(td, "try-error")) { return(readSeries(file, header = header, sep = ",", zone = zone, FinCenter = FinCenter, ...)) } # If format provided in file or with format argument, try to guess it if (all(is.na(td))) warning("Conversion of timestamps to timeDate objects produced only NAs. Are you sure you provided the proper format with argument 'format' or in the header of your file ?") # Extract data data <- as.matrix(df[-1]) # Create Time Series from Data Frame: ans <- timeSeries(data = data, charvec = td) # Return Value: ans } ################################################################################ timeSeries/R/timeSeries-isUnivariate.R0000755000176200001440000000314214263246022017465 0ustar liggesusers# # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # A copy of the GNU General Public License is available at # ../../COPYING ################################################################################ # FUNCTION: DESCRIPTION: # isUnivariate Tests if a 'timeSeries' object is univariate # isMultivariate Tests if a 'timeSeries' object is multivariate ################################################################################ isUnivariate <- function(x) { # A function implemented by Diethelm Wuertz and Yohan Chalabi # Description: # Tests if a time series or rectangular object is univariate # FUNCTION: # Return Value: if (NCOL(x) == 1) TRUE else FALSE } # ------------------------------------------------------------------------------ isMultivariate <- function(x) { # A function implemented by Diethelm Wuertz and Yohan Chalabi # Description: # Tests if a time series or rectangular object is multivariate # FUNCTION: # Return Value: if (NCOL(x) > 1) TRUE else FALSE } ################################################################################ timeSeries/R/stats-filter.R0000755000176200001440000000572614263246022015346 0ustar liggesusers# # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # A copy of the GNU General Public License is available at # ../../COPYING ################################################################################ # FUNCTION: DESCRIPTION: # filter,timeSeries Applies linear filtering to a 'timeSeries' object ################################################################################ setMethod("filter", "timeSeries", function(x, filter, method = c("convolution", "recursive"), sides = 2, circular = FALSE, init = NULL) { # Description: # Applies linear filtering to a 'timeSeries' object # Arguments: # x - a univariate or multivariate time series. # filter - a vector of filter coefficients in reverse time order (as # for AR or MA coefficients). # method - Either "convolution" or "recursive" (and can be # abbreviated). If "convolution" a moving average is used: # if "recursive" an autoregression is used. # sides - for convolution filters only. If sides=1 the filter # coefficients are for past values only; if sides=2 they are # centred around lag 0. In this case the length of the filter # should be odd, but if it is even, more of the filter is # forward in time than backward. # circular - for convolution filters only. If TRUE, wrap the filter # around the ends of the series, otherwise assume external # values are missing (NA). # init - for recursive filters only. Specifies the initial values # of the time series just prior to the start value, in reverse # time order. The default is a set of zeros. # Value: # Returns a 'timeSeries' object. # FUNCTION: # Check Arguments: stopifnot(is.timeSeries(x)) # Extract Title and Documentation: Title <- x@title Documentation <- x@documentation # Filter: ans <- filter(getDataPart(x), filter = filter, method = method, sides = sides, circular = circular, init = init) # Note: do not use as.matrix because ts objects might # not be coerced properly ans <- as(ans, "matrix") # Add Column Names: colnames(ans) <- colnames(x) ans <- setDataPart(x, ans) # Preserve Title and Documentation: ans@title <- Title ans@documentation <- Documentation # Return Value: ans }) ################################################################################ timeSeries/R/methods-is.R0000644000176200001440000001271014550271517014773 0ustar liggesusers# # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # A copy of the GNU General Public License is available at # ../../COPYING ################################################################################ # FUNCTION: DESCRIPTION: # is.timeSeries Tests for a 'timeSeries' object ################################################################################ is.timeSeries <- function (x) { # A function implemented by Diethelm Wuertz # Description: # Tests for a 'timeSeries' object. # Arguments: # object - a 'timeSeries' object to be tested. # Value: # Returns 'TRUE' or 'FALSE' depending on whether its # argument is of 'timeSeries' type or not. # Changes: # # FUNCTION: # Check: ans <- is(x, "timeSeries") # Return Value: ans } # ------------------------------------------------------------------------------ is.signalSeries <- function(x) { !as.logical(length(x@positions)) } # ------------------------------------------------------------------------------ # YC: # Note if is.na returns a timeSeries object then we have problem # with the function quantile... setMethod("is.na", "timeSeries", function(x) setDataPart(x, is.na(getDataPart(x))) ) ## 2024-01-12 GNB: ## TODO: create method for anyNA? ## The default anyNA works fine (it calls is.na), ## but a timeSeries method might gain some efficiency/ # ------------------------------------------------------------------------------ # something like this would be needed if is.unsorted again became an internal generic #if(getRversion() >= "3.3.0") { # setGeneric("is.unsorted", signature = "x", useAsDefault = base::is.unsorted) #} ## ## 2024-01-11 GNB: the notes below need consolidation, I wrote them as I worked on this. ## ## 1. is.unsorted is internal generic, though I didn't find in NEWS R- x.x notes about it ## changing its status as internal generic. ## ## 2. changed the method to S3 ## setMethod("is.unsorted", "timeSeries", ## function(x, na.rm = FALSE, strictly = FALSE) ## callGeneric(x@positions, na.rm = na.rm, strictly = strictly)) ## ## 3. since is.unsorted is primitive, it may be better to define an S4 method but the ## implicit generic created by setMethod has the wrong signature and creates a new ## function which needs to be exported. So, an explicit setGeneric to limit the ## dispatch only to 'x', see the example above by a previous maintainer. ## I haven't tried that. ## ## 2024-01-12 GNB: ## ## This works: is.unsorted.timeSeries <- function(x, na.rm = FALSE, strictly = FALSE) { is.unsorted(x@positions, na.rm = na.rm, strictly = strictly) } ## (GNB: cont.) ## (in the sense that it is dispatched) but it gives wrong results if there are NA's in ## the data. Indeed we have ## ## > base::is.unsorted ## function (x, na.rm = FALSE, strictly = FALSE) ## { ## if (length(x) <= 1L) ## return(FALSE) ## if (!na.rm && anyNA(x)) ## return(NA) ## if (na.rm && any(ii <- is.na(x))) ## x <- x[!ii] ## .Internal(is.unsorted(x, na.rm, strictly)) ## } ## ## the internal function is internal generic but before calling that, 'base::is.unsorted' ## handles the 'NA' cases. The time series method for is.na() works on the data, and so we ## get wrong result if there are NA's in the time series data. ## ## The S4 method creates a new generic with default 'base::is.unsorted' so there is no ## problem there. ## ## The core problem in my (GNB) opinion is that the timeSeries methods for is.unsorted and ## sort() have different semantics from that of the method for is.na (the former work on ## the time stamps, while the latter works on the data). ## ## So, returning the S4 method. Notice that we do not try to keep is.unsorted internal but ## rather export the generic so that it is calledand the time series method kiks in for ## timeSeries objects and avoids the above NA problem. ## ## Note that we keep also the S3 method, so that if the S4 generic is not visible, the ## result will be correct at least when there are no NA's in the data. setMethod("is.unsorted", "timeSeries", function(x, na.rm = FALSE, strictly = FALSE) callGeneric(x@positions, na.rm = na.rm, strictly = strictly)) # if (getRversion() < "2.8.0") # { # setMethod("is.unsorted", "timeSeries", function(x, na.rm = FALSE) # callGeneric(x@positions, na.rm = na.rm)) # } else { # setMethod("is.unsorted", "timeSeries", function(x, na.rm = FALSE, strictly = FALSE) # callGeneric(x@positions, na.rm = na.rm, strictly = strictly)) # } ################################################################################ timeSeries/R/base-applySeries.R0000755000176200001440000002626114321331264016130 0ustar liggesusers# # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # A copy of the GNU General Public License is available at # ../../COPYING ################################################################################ # FUNCTION: DESCRIPTION: # applySeries Applies a function to blocks of a 'timeSeries' # fapply Applies a function to 'timeSeries' windows # DEPRECATED: (now removed) DESCRIPTION: # .applySeries Applies a function to blocks of a 'timeSeries' # .fapply Applies a function to 'timeSeries' windows ################################################################################ applySeries <- function(x, from = NULL, to = NULL, by = c("monthly", "quarterly"), FUN = colMeans, units = NULL, format = x@format, zone = x@FinCenter, FinCenter = x@FinCenter, recordIDs = data.frame(), title = x@title, documentation = x@documentation, ...) { # A function implemented by Diethelm Wuertz # Description: # Apply a function to the margins of a 'timeSeries' object # Details: # This function can be used to aggregate and coursen a # 'timeSeries' object. # Arguments: # x - a 'timeSeries' object to be aggregated # from, to - two 'timeDate' position vectors which size the # blocks # by - calendarical block, only active when both 'from' # and 'to' are NULL # FUN - function to be applied, by default 'colMeans' # units - a character vector with column names, allows to # overwrite the column names of the input 'timeSeries' # object. # Value: # Returns a S4 object of class 'timeSeries'. # Notes: # The size of the 'moving' window and the selection of an # 'adj'-acent endpoint are not needed, all the information # is kept in the 'from' and 'to' position vectors. # FUNCTION: # .Deprecated("aggregate", "timeSeries") # Check object: if (!inherits(x, "timeSeries")) stop("s is not a timeSeries object") ### if (x@format == "counts") ### stop(as.character(match.call())[1], ### " is for time series and not for signal series.") # Monthly and Quarterly from and to: if (is.null(from) & is.null(to)) { if (by[1] == "monthly") { # Use monthly blocks: from = unique(timeFirstDayInMonth(time(x))) to = unique(timeLastDayInMonth(time(x))) } else if (by[1] == "quarterly") { from = unique(timeFirstDayInQuarter(time(x))) to = unique(timeLastDayInQuarter(time(x))) } else { stop("by must be eiter monthly or quarterly") } from@FinCenter = to@FinCenter = FinCenter } # Column Names: colNames = units # Function: fun = match.fun(FUN) ### # Blocks: ### j.pos = as.POSIXct(time(x)) ### j.from = as.POSIXct(from) ### j.to = as.POSIXct(to) # Blocks: j.pos = time(x) if (is(j.pos, "timeDate")) { j.from = as.timeDate(from) j.to = as.timeDate(to) } else { j.from = as.integer(from) j.to = as.integer(to) } # Iterate: pos = time(x) rowNames = rownames(x) rowBind = NULL for (i in seq_len(length(from))) { test <- (j.pos >= j.from[i] & j.pos <= j.to[i]) if (!sum(test)) stop("outsite of range") # make sure that cutted is a matrix ... cutted = as.matrix(x[test, ]) # YC : *AND* make sure the matrix is not subbsetted to a vector!!! # YC : here it is fine because as.matrix of a timeSeries checks it # YC : but prefer to check it one more time at the end of the loop... ### if (sum(test)>0) rownames(cutted) <- rowNames[test] ans = fun(cutted, ...) rowBind = rbind(rowBind, ans) } stopifnot(NCOL(rowBind) == NCOL(x)) # YC : see above # YC : length(to) might not be == NCOL(rowBind) if (length(as.character(to)) == NROW(rowBind)) rownames(rowBind) = as.character(to) if (is.null(colNames)) { units = x@units } else { units = colNames } # Return Value: timeSeries(data = rowBind, units = units, format = format, zone = zone, FinCenter = FinCenter, recordIDs = recordIDs, title = title, documentation = documentation, ...) } # ------------------------------------------------------------------------------ fapply <- function(x, from, to, FUN, ...) { # .Deprecated("aggregate", "timeSeries") # Check x: stopifnot(is(x, "timeSeries")) if (x@format == "counts") stop(as.character(match.call())[1], " is for time series and not for signal series.") # Check for missing form/to: if(missing(from)) from = start(x) if(missing(to)) to = end(x) # Return Value: applySeries(x = x, from = from, to = to, FUN = FUN, ...) } ################################################################################ # *** OLD *** # Check if it is still used somewhere ... # 2022-10-07 GNB : apparently not, commenting out # .applySeries <- # function (x, from = NULL, to = NULL, by = c("monthly", "quarterly"), # FUN = colMeans, units = NULL, ...) # { # # Old/Alternative Version # # # Chreck for 'timeSeries' Object: # stopifnot(is.timeSeries(x), # is(from, "timeDate") || is.null(from), # is(to, "timeDate") || is.null(to)) # # # Allow for colMeans: # if (substitute(FUN) == "colMeans") FUN = "colAvgs" # # # Monthly and Quarterly from and to: # if (is.null(from) & is.null(to)) { # by = match.arg(by) # if (by == "monthly") { # from = unique(timeFirstDayInMonth(time(x))) # to = unique(timeLastDayInMonth(time(x))) # } # else if (by == "quarterly") { # from = unique(timeFirstDayInQuarter(time(x))) # to = unique(timeLastDayInQuarter(time(x))) # } # from@FinCenter = to@FinCenter = x@FinCenter # } # # # Start Cutting Process: # fun = match.fun(FUN) # cutted = NULL # i = 1 # # # Find First Interval which is not empty: # while (is.null(cutted)) { # cutted = cut(x, from[i], to[i]) # if (!is.null(cutted)) { # # Non empty Interval: # ans = fun(cutted, ...) # } # i = i + 1 # } # # Continue up to the end: # for (j in seq_len(length(from))) { # cutted = cut(x, from[j], to[j]) # if (!is.null(cutted)) { # # Non empty Interval: # newAns = fun(cutted, ...) # ans = rbind(ans, newAns) # } # } # # # Return Value: # ans # } ################################################################################ # *** OLD *** # Check if it is still used somewhere ... ## removed by GNB ## ## .fapply <- ## function(x, from, to, FUN, ...) ## { ## # A function implemented by Diethelm Wuertz ## ## # Description: ## # Applies a function to 'timeSeries' windows ## ## # Details: ## # This function can be used to aggregate and coursen a ## # 'timeSeries' object. ## ## # Arguments: ## # x - a 'timeSeries' object to be aggregated ## # from, to - two 'timeDate' position vectors which size the blocks ## # FUN - function to be applied, by default 'colMeans' ## ## # Value: ## # Returns a S4 object of class 'timeSeries' if FUN returns ## # a time series object, otherwise a list, where the entries ## # for each window is the output of the function FUN. ## ## # Notes: ## # The size of the 'moving' window and the selection of an ## # 'adj'-acent endpoint are not needed, all the information ## # is kept in the 'from' and 'to' position vectors. ## ## # FUNCTION: ## ## # Check object: ## if (!inherits(x, "timeSeries")) stop("s is not a timeSeries object") ## ## # Monthly and Quarterly from and to: ## if (is.null(from) & is.null(to)) { ## if (by[1] == "monthly") { ## # Use monthly blocks: ## from = unique(timeFirstDayInMonth(time(x))) ## to = unique(timeLastDayInMonth(time(x))) ## } else if (by[1] == "quarterly") { ## from = unique(timeFirstDayInQuarter(time(x))) ## to = unique(timeLastDayInQuarter(time(x))) ## } else { ## stop("by must be eiter monthly or quarterly") ## } ## from@FinCenter = to@FinCenter = x@FinCenter ## } ## ## # Column Names: ## colNames = units ## ## # Function: ## fun = match.fun(FUN) ## ## # Blocks: ## j.pos = as.POSIXct(time(x)) ## j.from = as.POSIXct(from) ## j.to = as.POSIXct(to) ## ## # Iterate: ## y = series(x) ## pos = time(x) ## rowNames = rownames(x) ## ## # Compute for the first window ... ## i = 1 ## test = (j.pos >= j.from[i] & j.pos <= j.to[i]) ## # make sure that cutted is a matrix ... ## cutted = as.matrix(y[test, ]) ## ### if (sum(test)>0) rownames(cutted) <- rowNames[test] ## ans = fun(cutted, ...) ## ## if (is.timeSeries(ans)) { ## ## DW can this happen - check ? ## rowBind = ans ## for (i in 2L:length(from)) { ## test = (j.pos >= j.from[1] & j.pos <= j.to[1]) ## # make sure that cutted is a matrix ... ## cutted = as.matrix(y[test, ]) ## ### if (sum(test)>0) rownames(cutted) <- rowNames[test] ## ans = fun(cutted, ...) ## rowBind = rbind(rowBind, ans) ## } ## rownames(rowBind) = as.character(to) ## if (is.null(colNames)) { ## units = x@units ## } else { ## units = colNames ## } ## # Return Value: ## ans = timeSeries(data = rowBind, charvec = as.character(to), ## units = units, format = format, zone = x@zone, FinCenter = ## x@FinCenter, recordIDs = x@recordIDs, title = x@title, ## documentation = x@documentation, ...) ## return(ans) ## } else { ## listBind = list() ## ## DW [] -> [[]] ## listBind[[1]] = ans ## for (i in 2L:length(from)) { ## test = (j.pos >= j.from[i] & j.pos <= j.to[i]) ## # make sure that cutted is a matrix ... ## cutted = as.matrix(y[test, ]) ## ### if (sum(test)>0) rownames(cutted) <- rowNames[test] ## ans = fun(cutted, ...) ## ## DW [] -> [[]] ## listBind[[i]] = ans ## } ## # Return Value: ## ans = listBind ## attr(ans, "control") <- list(x = x, from = from, to = to) ## return(invisible(ans)) ## } ## ## # Return Value: ## return() ## } ################################################################################ timeSeries/R/timeSeries-getDataPart.R0000755000176200001440000000527714263246022017235 0ustar liggesusers# # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # A copy of the GNU General Public License is available at # ../../COPYING ################################################################################ # S4 METHODS: DESCRIPTION: # getDataPart,timeSeries Get data slot of an object of class 'timeSeries' # setDataPart,timeSeries Set data slot of an object of class 'timeSeries' ################################################################################ # YC: # This makes getDataPart a bit faster than default function setMethod("getDataPart", "timeSeries", #"signalSeries", function(object) { value <- object attributes(value) <- NULL attr(value, "dim") <- attr(object, "dim") attr(value, "dimnames") <- attr(object, "dimnames") value } ) # ------------------------------------------------------------------------------ # YC: # This makes setDataPart a bit faster than default function if (getRversion() < "2.8.0") { setMethod("setDataPart", "timeSeries", function(object, value) { #-> Note : do not use as.matrix because ts objects might #-> not be coerced properly value <- as(value, "matrix") supplied <- attributes(object) valueAttrs <- attributes(value) supplied[names(valueAttrs)] <- valueAttrs # YC: force @unit to be identical to colnames(value) supplied[["units"]] <- colnames(value) attributes(value) <- supplied asS4(value, TRUE) } ) } else { setMethod("setDataPart", "timeSeries", function(object, value, check = TRUE) { #-> Note : do not use as.matrix because ts objects might #-> not be coerced properly if (check) value <- as(value, "matrix") supplied <- attributes(object) valueAttrs <- attributes(value) supplied[names(valueAttrs)] <- valueAttrs # YC: force @unit to be identical to colnames(value) supplied[["units"]] <- colnames(value) attributes(value) <- supplied asS4(value, TRUE) } ) } ################################################################################ timeSeries/R/base-cbind.R0000755000176200001440000002575614321332643014721 0ustar liggesusers # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # A copy of the GNU General Public License is available at # ../../COPYING ################################################################################ # FUNCTION: DESCRIPTION: # Generic functions defined in {base} # cbind.timeSeries Combines two 'timeSeries' objects by column # rbind.timeSeries Combines two 'timeSeries' objects by row ################################################################################ # Generic functions defined in {methods} # cbind2.timeSeries Combines two objects by column # rbind2.timeSeries Combines two objects by row ################################################################################ cbind.timeSeries <- function(..., deparse.level = 1) { # A function implemented by Yohan Chalabi and Diethelm Wuertz # Description: # Binds columns of two 'timeSeries' objects # Arguments: # ... # deparse.level # FUNCTION: # Columnwise bind: dots <- list(...) # Preserve the title of the first ... element # counter <- NULL # for (i in 1:length(dots)) counter <- c(counter, is.timeSeries(dots[[i]])) # Index <- which(counter[1]) Title <- "" #dots[[Index]]@title # Compose Attributes - Documentation : Attributes <- list() for (i in 1:length(dots)) { if (inherits(dots[[i]], "timeSeries")) { nextAttributes <- getAttributes(dots[[i]]) Attributes <- .appendList(Attributes, nextAttributes) } } Documentation <- as.character(date()) attr(Documentation, "Attributes") <- Attributes # remove NULL from dots args if (any(t <- unlist(lapply(dots, is.null)))) dots[t] <- NULL # deal with numeric values vecIdx <- sapply(dots, function(obj) (!inherits(obj, "timeSeries") && prod(dim(obj)) == 1)) if (any(vecIdx)) dots[vecIdx] <- lapply( dots[vecIdx], function(vec) as.timeSeries(rep(as.vector(vec), len = NROW(dots[[1]])))) # coerce to timeSeries object if not a timeSeries if (any(t <- !unlist(lapply(dots, inherits, "timeSeries")))) dots[t] <- lapply(dots[t], as.timeSeries) # note that new timeSeries get FinCenter of first entry of args FinCenter = finCenter(dots[[1]]) # get names of arguments if any units <- unlist(lapply(dots, colnames)) if (length(t <- as.logical((nchar(nm <- names(units)))))) units[t] <- nm[t] # change colnames if they are the same if (length(unique(units)) != length(units)) { for (name in unique(units)) { pos <- grep(name, units) if (length(pos) != 1) units[pos] <- paste(units[pos], seq(pos), sep = ".") } } # ensure that data is sorted dots <- lapply(dots, sort) # get list of timestamps and recordIDs tds <- lapply(dots, slot, "positions") rec <- lapply(dots, slot, "recordIDs") # Fast version when timeSeries have identical timestamps # or with signal series if (any(co <- unlist(lapply(dots, function(ts) ts@format == "counts"))) || (any(!co) & all(sapply(tds[!co], identical, tds[!co][[1]])))) { # check if all have same number of rows if (diff(range((unlist(lapply(dots, NROW)))))) stop("number of rows must match") td <- if (any(!co)) tds[!co][[1]] else NULL data <- array(unlist(dots), dim=c(NROW(dots[[1]]), sum(sapply(dots, ncol)))) recordIDs <- if (sum(recIdx <- sapply(rec, length))) do.call(cbind, rec[recIdx]) else data.frame() ans <- timeSeries(data = data, charvec = td, units = units, zone = "GMT", FinCenter = FinCenter, recordIDs = recordIDs) } else { # Aligned timestamps: td <- sort(unique(unlist(tds))) fun <- function(ts, td, ref) { mm <- matrix(NA, ncol = ncol(ts), nrow = length(ref)) mm[findInterval(td, ref),] <- getDataPart(ts) mm} data <- mapply(fun, ts = dots, td = tds, MoreArgs = list(ref=td), SIMPLIFY = FALSE) data <- array(unlist(data), dim=c(length(td), sum(sapply(dots, ncol)))) # Note that recordIDs are not preserved when time stamps are # not equal because don't know what value we should use for # missing entries if (sum(sapply(rec, length))) { msg <- "@recordIDs cannot be binded when timestamps are not identical" warning(msg, call. = FALSE) } # note that new timeSeries get FinCenter of first entry of args ans <- timeSeries(data = data, charvec = td, units = units, zone = FinCenter, FinCenter = FinCenter) } # Preserve Title and Documentation: ans@title <- Title ans@documentation <- Documentation # Return Value: ans } # ------------------------------------------------------------------------------ ## # YC: ## # Note that since 2.9.0 S3 methods can not be defined for an S4 class ## # which extends an object like matrix. Therefore we turn all S3 ## # generics to S4 generics for backward compatibility ## # Note that since 2.8.0 it is possible to define methods for functions ## # with dots ... ## if (getRversion() < "2.9.0") { ## cbind.timeSeries <- ## function(..., deparse.level = 1) ## .cbind.timeSeries(..., deparse.level = deparse.level) ## } else { ## setGeneric("cbind", signature = "...") #-> creates warning but ## # cannot avoid it with ## # current dotsMethods scheme ## setMethod("cbind", "timeSeries", function(..., deparse.level = 1) ## .cbind.timeSeries(..., deparse.level = deparse.level)) ## } # ------------------------------------------------------------------------------ setMethod("cbind2", c("timeSeries", "timeSeries"), function(x, y) cbind(x, y)) setMethod("cbind2", c("timeSeries", "ANY"), function(x,y) callGeneric(x, as(y, "timeSeries"))) setMethod("cbind2", c("ANY", "timeSeries"), function(x,y) callGeneric(as(x, "timeSeries"), y)) setMethod("cbind2", c("timeSeries", "missing"), function(x,y) x) # ------------------------------------------------------------------------------ rbind.timeSeries <- function(..., deparse.level = 1) { # A function implemented by Yohan Chalabi and Diethelm Wuertz # Description: # Binds rows of two 'timeSeries' objects # Arguments: # ... # deparse.level # FUNCTION: # Row bind: dots <- list(...) # Preserve the title of the first ... element # counter <- NULL # for (i in 1:length(dots)) counter <- c(counter, is.timeSeries(dots[[i]])) # Index <- which(counter[1]) Title <- "" # dots[[Index]]@title # Compose Attributes - Documentation : Attributes <- list() for (i in 1:length(dots)) { if (inherits(dots[[i]], "timeSeries")) { nextAttributes <- getAttributes(dots[[i]]) Attributes <- .appendList(Attributes, nextAttributes) } } Documentation <- as.character(date()) attr(Documentation, "Attributes") <- Attributes # Remove NULL from dots args if (any(t <- unlist(lapply(dots, is.null)))) dots[t] <- NULL # Coerce to timeSeries object if not a timeSeries if (any(t <- !unlist(lapply(dots, inherits, "timeSeries")))) dots[t] <- lapply(dots[t], as.timeSeries) if (diff(range((unlist(lapply(dots, ncol)))))) stop("number of columns must match") # get names of arguments if any otherwise use colnames units <- unlist(lapply(dots, colnames)) if (length(t <- as.logical((nchar(nm <- names(units)))))) units[t] <- nm[t] units <- structure(units, dim = c(ncol(dots[[1]]), length(dots))) units <- apply(units, 1, paste, collapse = "_") # Bind: # data <- base::rbind(...) # no because S3 method dispatch done in C level data <- do.call(base::rbind, lapply(dots, getDataPart)) if (any(unlist(lapply(dots, function(ts) ts@format == "counts")))) { return(timeSeries(data=data, units = units)) } # recordIDs part if (length(dots) > 1) recordIDs <- tryCatch(do.call(rbind, lapply(dots, slot, "recordIDs")), error = function(e) { msg <- paste("@recordIDs cannot be binded :", conditionMessage(e)) warning(msg, call. = FALSE) data.frame()}) else recordIDs <- slot(dots[[1]], "recordIDs") tds <- unlist(lapply(dots, slot, "positions")) ans <- timeSeries(data = data, charvec = tds, zone = "GMT", FinCenter = finCenter(dots[[1]]), units = units, recordIDs = recordIDs) # Preserve Title and Documentation: ans@title <- Title ans@documentation <- Documentation # Return Value: ans } # ------------------------------------------------------------------------------ ## # YC: ## # Note that since 2.9.0 S3 methods can not be defined for S4 classes ## # which extends an object like matrix. Therefore we turn all S3 ## # generics to S4 generics for backward compatibility ## # Note that since 2.8.0 it is possible to define methods for functions ## # with dots ... ## if (getRversion() < "2.9.0") { ## rbind.timeSeries <- ## function(..., deparse.level = 1) ## .rbind.timeSeries(..., deparse.level = deparse.level) ## } else { ## setGeneric("rbind", signature = "...") #-> creates warning but ## # cannot avoid it with ## # current dotsMethods scheme ## setMethod("rbind", "timeSeries", function(..., deparse.level = 1) ## .rbind.timeSeries(..., deparse.level = deparse.level)) ## } # ------------------------------------------------------------------------------ setMethod("rbind2", c("timeSeries", "timeSeries"), function(x, y) rbind(x, y)) setMethod("rbind2", c("timeSeries", "ANY"), function(x,y) callGeneric(x, as(y, "timeSeries"))) setMethod("rbind2", c("ANY", "timeSeries"), function(x,y) callGeneric(as(x, "timeSeries"), y)) setMethod("rbind2", c("timeSeries", "missing"), function(x,y) x) ################################################################################ timeSeries/R/base-t.R0000755000176200001440000000177314263246022014076 0ustar liggesusers # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # A copy of the GNU General Public License is available at # ../../COPYING ################################################################################ # FUNCTION: DESCRIPTION: # t,timeSeries Returns the transpose of timeSeries object ################################################################################ setMethod("t", "timeSeries", function(x) callGeneric(getDataPart(x))) ################################################################################ timeSeries/R/timeSeries-signalCounts.R0000755000176200001440000000267614263246022017506 0ustar liggesusers# # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # A copy of the GNU General Public License is available at # ../../COPYING ################################################################################ # FUNCTION: DESCRIPTION: # .signalCounts Creates charvec for integer indexed time stamps ################################################################################ .signalCounts <- function(int) { # A function implemented by Diethelm Wuertz and Yohan Chalabi # Descriptions: # Creates the charvec for integer indexed time stamps # Arguments: # int - a vector of integers, the counts. # FUNCTION: # Check that int is an integer # ... # Check that all int's are positive ... # ... # Format: cint <- as.character(int) ans <- format(cint, width = max(nchar(cint)), justify = "right") # Return Value: ans } ################################################################################ timeSeries/R/timeSeries-dummy.R0000755000176200001440000000530114434622223016155 0ustar liggesusers# # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # A copy of the GNU General Public License is available at # ../../COPYING ################################################################################ # FUNCTION: DESCRIPTION: # dummyMonthlySeries Creates a dummy monthly 'timeSeries' object # dummyDailySeries Creates a dummy daily 'timeSeries' object ################################################################################ # DW: # A more natural name for the function dummySeries() would be # dummyMonthlySeries() to have the same naming conventions like in the # case of the dummy daily series. dummyMonthlySeries <- function(...) { # A function implemented by Diethelm Wuertz # Description: # Creates a monthly dummy 'time Series' object # Arguments: # ... - optional arguments passed to the function timeSeries(). # FUnction: # Return Value: timeSeries(matrix(runif(24), ncol = 2), as.character(timeCalendar()), ...) } ## dummySeries <- function(...) { # GNB ## .Deprecated("dummyMonthlySeries") ## dummyMonthlySeries(...) ## } # ------------------------------------------------------------------------------ dummyDailySeries <- function(x = rnorm(365), units = NULL, zone = "", FinCenter = "") { # A function implemented by Diethelm Wuertz # Description: # Creates a dummy daily time Series # Arguments: # x - a numeric vector # origin - the first date in the series # FUNCTION: if (zone == "") zone <- getRmetricsOptions("myFinCenter") if (FinCenter == "") FinCenter <- getRmetricsOptions("myFinCenter") # Check: stopifnot(is.numeric(x)) if (is.null(units)) units <- paste("X", 1:NCOL(x), sep = "") stopifnot(length(units) == NCOL(x)) # Time Series: if (is.vector(x)) data = matrix(x, ncol = 1) if (is.matrix(x)) data = x positions <- timeSequence(from = "1970-01-01", length.out = NROW(data), zone = zone, FinCenter = FinCenter) ans <- timeSeries(data = data, charvec = positions, units = units, zone = zone, FinCenter = FinCenter) # Return Value: ans } ################################################################################ timeSeries/R/timeSeries-slotTime.R0000644000176200001440000001054214545272444016633 0ustar liggesusers# # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # A copy of the GNU General Public License is available at # ../../COPYING ################################################################################ # FUNCTION: DESCRIPTION: # time,timeSeries Extracs time positions from a 'timeSeries' # time<- Defines S3 UseMethod # time<-.timeSeries ... to avoid problems with zoo # FUNCTION: DESCRIPTION: # getTime Get time slot from a 'timeSeries' # setTime<- Set new time slot to a 'timeSeries' ################################################################################ # DEPRECATED: DESCRIPTION: # seriesPositions Deprecated, use time # newPositions<- Deprecated, use time<- ################################################################################ ## GNB: swapped the definitions of .time.timeSeries and time.timeSeries ## in preparation to drop the former ## .time.timeSeries <- time.timeSeries <- function(x, ...) { # A function implemented by Diethelm Wuertz and Yohan Chalabi # Description: # Extracs time positions from a 'timeSeries' # Arguments: # x - a 'timeSeries' object. # Value: # Returns a time resampled object of class 'timeSeries'. # FUNCTION: if (length(x@positions)>0) timeDate(x@positions, zone = "GMT", FinCenter = x@FinCenter) else seq.int(NROW(x)) } ## setMethod("time", "timeSeries", time.timeSeries) # ------------------------------------------------------------------------------ `time<-` <- function(x, value) { UseMethod("time<-") } # ------------------------------------------------------------------------------ `time<-.default` <- function(x, value) { # A function implemented by Georgi Boshnakov zoo::time(x) <- value x } `time<-.timeSeries` <- function(x, value) { # A function implemented by Yohan Chalabi # Note: # To avoid conflict with zoo package. # FUNCTION: # Assign Rownames: rownames(x) <- value # Return Value: x } ############################################################################### getTime <- function(x) { # Description: # Get time slot from a 'timeSeries' object. # Arguments: # x - a 'timeSeries' object # FUNCTION: # Return Value: time(x) } # ------------------------------------------------------------------------------ "setTime<-" <- function(x, value) { # Description: # Set time slot to a 'timeSeries' object. # Arguments: # x - a 'timeSeries' object # FUNCTION: # Assign Time Slot: time(x) <- value # Return Value: x } ############################################################################### # DEPRECATED ## seriesPositions <- ## function(object) ## { ## # A function implemented by Diethelm Wuertz ## ## # Description: ## # Extracts the positions of a 'timeSeries' objects and ## # converts them to a 'timeDate' object. ## ## # Arguments: ## # object - a 'timeSeries' object ## ## # Value: ## # Returns 'timeSeries' positions as 'timeDate' objects. ## ## # FUNCTION: ## ## # Deprecated: ## .Deprecated(new = "time", package = "timeSeries") ## ## # Return Value: ## time(object) ## } # ------------------------------------------------------------------------------ # Deprecated: ## "newPositions<-" <- ## function(object, value) ## { # A function implemented by Diethelm Wuertz ## ## # FUNCTION: ## ## # Deprecated: ## .Deprecated(new = "time<-", package = "timeSeries") ## ## # Assign Rownames: ## rownames(object) <- value ## ## # Return Value: ## object ## } ################################################################################ timeSeries/R/fin-cumulated.R0000755000176200001440000000573214263246022015457 0ustar liggesusers# # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # A copy of the GNU General Public License is available at # ../../COPYING ############################################################################### # FUNCTION: DESCRIPTION: # cumulated Computes cumulated series from financial returns # cumulated.default Computes cumulated series, default method ############################################################################### cumulated <- function(x, ...) { # A function implemented by Diethelm Wuertz # Description: # Computes cumulated series from financial returns # Return Value: UseMethod("cumulated") } # ------------------------------------------------------------------------------ cumulated.default <- function(x, method = c("continuous", "discrete", "compound", "simple"), percentage = FALSE, ...) { # A function implemented by Diethelm Wuertz # Description: # Computes cumulated series from financial returns # supports 'matrix' and 'timeSeries'. # Arguments: # x - data object containing ordered price observations # method - "continuous == "compound" and "discrete" == "simple" # Example: # X = as.timeSeries(data(msft.dat))[1:10, "Close"]; X = X/series(X)[1, 1] # x = returns(X, "continuous"); x; X; cumulated(x, "continuous") # x = returns(X, "discrete"); x; X; cumulated(x, "discrete") # Note: # To make it conform with PortfolioAnalytics: # "compound" == "continuous", and "simple" == "discrete" # FUNCTION: # Check Arguments: stopifnot(is.timeSeries(x)) # Settings: method <- match.arg(method) # Extract Title and Documentation: Title <- x@title Documentation <- x@documentation # Handle Missing Values: # if (na.rm) x = na.omit(x, ...) # Transform data: if (percentage) x <- x/100 positions <- time(x) # Calculate Cumulates: # ... colCumsums and colCumprods are generic functions with # methods for 'matrix' and 'timeSeries'. if(method == "geometric") { ans <- colCumsums(x) } if(method == "compound" || method == "continuous") { ans <- exp(colCumsums(x)) } if(method == "simple" || method == "discrete") { ans <- colCumprods(1+x) } # Preserve Title and Documentation: ans@title <- Title ans@documentation <- Documentation # Return Value: ans } ################################################################################ timeSeries/R/timeSeries-slotSeries.R0000755000176200001440000001467314434372166017202 0ustar liggesusers# # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # A copy of the GNU General Public License is available at # ../../COPYING ################################################################################ # FUNCTION: DESCRIPTION: # series,timeSeries Get data slot from a'timeSeries' # series<-,timeSeries,ANY Set new data slot to a 'timeSeries' # series<-,timeSeries,matrix Set new data slot to a 'timeSeries' # SYNONYMES: DESCRIPTION: # coredata,timeSeries Get data slot from a'timeSeries' # coredata<-,timeSeries,ANY Set new data slot to a 'timeSeries' # coredata<-,timeSeries,matrix Set new data slot to a 'timeSeries' ################################################################################ # ------------------------------------------------------------------------------ ## 2022-10-08 GNB: ## ## TODO: In principle, we could just not define 'coredata<-' generic and do: ## ## "coredata<-" <- "series<-" ## ## but this doesn't seem desirable since 'coredata<-' may be exported by ## other packages, too (e.g., zoo). Maybe, do it the other way round: ## define the methods for 'coredata<-' and do ## ## "series<-" <- "coredata<-" ## ## This may have the analogous problem since other packages may rely on a ## generic 'series<-'. Admittedly, this is far less likely. ## 2023-05-27 GNB: renaming from .series_assign <- 'coredata<-.timeSeries' <- function(x, value) { # A function implemented by Diethelm Wuertz and Yohan Chalabi # Description: # Assign the series Data to a timeSeries object. # Arguments: # object - a 'timeSeries' object # Value: # Assign to be assign as series Data of a timeSeries. # FUNCTION: ## 2023-05-27 GNB: added this when converted the two S4 methods into a ## single S3 one. if(class(value)[1] != "matrix") value <- as.matrix(value) # if value same dimension as time series # we we can assign the value directly to @.Data # This can speed up math Ops significantly if (identical(dim(x), dim(value))) { x@.Data <- value if (!is.null(cn <- colnames(value))) colnames(x) <- cn return(x) } if (is.null(charvec <- rownames(value))) charvec <- rownames(x) if (is.null(units <- colnames(value))) units <- colnames(value) # now that we have charvec and units, better to remove # dimnames of value to avoid problems attr(value, "dimnames") <- NULL if (!identical(length(units), NCOL(value))) units <- NULL # if now same dim , drop charvec and returns .signalSeries if (!identical(length(charvec), NROW(value))) return(.signalSeries(value, units)) format <- x@format zone <- FinCenter <- finCenter(x) title <- x@title documentation <- x@documentation recordIDs <- if (identical(NROW(x), NROW(value))) x@recordIDs else data.frame() # Return Value: timeSeries(data = value, charvec = charvec, units = units, format = format, zone = zone, FinCenter = FinCenter, recordIDs = recordIDs, title = title) } # ------------------------------------------------------------------------------ setMethod("series", "timeSeries", function(x) { # A function implemented by Diethelm Wuertz and Yohan Chalabi # Description: # Returns the series Data of an ordered data object. # Arguments: # x - a 'timeSeries' object # Value: # Returns an object of class 'matrix'. # FUNCTION: # Get Data Slot: ans <- as.matrix(x) # Return Value: ans } ) # ------------------------------------------------------------------------------ setMethod("series<-", signature(x = "timeSeries", value = "ANY"), function(x, value) { # A function implemented by Yohan Chalabi # Return Value: callGeneric(x, as(value, "matrix")) } ) setMethod("series<-", signature(x = "timeSeries", value = "matrix"), `coredata<-.timeSeries`) ################################################################################ # COREDATA SYNONYM ## GNB: replacing the S4 generic coredata and its method with an S3 method, ## which is exported and registered directly as a method for zoo::coredata. ## ## The S4 coredata() in 'timeSeries' was not exported although is method ## was 'seen' by 'zoo::coredata' when zoo was attached. I suspect that that ## was by chance, not as a design in the S3/S4 methods handling in R. Of ## course, coredata() was only visible when zoo was attached (or xts which ## exports it). ## setMethod("coredata", "timeSeries", ## function(x) ## { ## # A function implemented by Diethelm Wuertz and Yohan Chalabi ## ## # Description: ## # Returns the series Data of an ordered data object. ## ## # Arguments: ## # x - a 'timeSeries' object ## ## # Value: ## # Returns an object of class 'matrix'. ## ## # FUNCTION: ## ## # Get Data Slot: ## ans <- as.matrix(x) ## ## # Return Value: ## ans ## }) coredata.timeSeries <- function(x) as.matrix(x) # ------------------------------------------------------------------------------ ## GNB: replacing the S4 generic 'coredata<-' and its methods with an S3 method, ## which is exported and registered directly as a method for zoo::coredata<-. ## ## Note that although the S4 methods were seen when zoo was loaded, they ## didn't work properly since they dispatch on two arguments, while the ## function is S3. ## setMethod("coredata<-", signature(x = "timeSeries", value = "ANY"), ## function(x, value) ## { ## # A function implemented by Diethelm Wuertz and Yohan Chalabi ## ## # Return Value: ## callGeneric(x, as(value, "matrix")) ## }) ## ## setMethod("coredata<-", signature(x = "timeSeries", value = "matrix"), ## .series_assign ) timeSeries/R/base-dim.R0000755000176200001440000002022414322333342014372 0ustar liggesusers# # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # A copy of the GNU General Public License is available at # ../../COPYING ################################################################################ # S4 METHOD: DIM OPERATIONS ON DATA: # dim,timeSeries Returns dimension of a 'timeSeries' object # dim<-,timeSeries Assigns dimension of a 'timeSeries' object # dimnames,timeDSeries Returns dimension names of a 'timeSeries' object # dimnames<-,timeSeries Assign dimension names of a 'timeSeries' object # colnames,timeSeries Return column names to a 'timeSeries' object # rownames,timeSeries Return row names to a 'timeSeries' object # colnames<-,timeSeries Assigns column names to a 'timeSeries' object # rownames<-,timeSeries Assigns row names to a 'timeSeries' object # names,timeSeries Return column names of a 'timeSeries' object # names<.,timeSeries Assigns column names of a 'timeSeries' object ################################################################################ # Base Functions: # Generate from Matrix: # edhec.tS = timeSeries(edhec.mat, rownames(edhec.mat)) # edhec.ts = ts(edhec.mat, start = c(1997, 1), frequency = 12) # Univariate time Series: # edhec1.tS = edhec.tS[, 1] # dim # dim(edhec.tS) # 20 4 # dim(edhec1.tS) # 20 1 # DIM # DIM = function(x) {c(NROW(x), NCOL(x))} # DIM(edhec.tS) # 20 4 # DIM(edhec1.tS) # 20 1 # length # length(edhec.tS) # 1 # # LENGTH # LENGTH = function(x) NROW(x) # LENGTH(edhec.tS) # 20 # LENGTH(edhec1.tS) # 20 # # ncol / nrow # ncol(edhec.tS) # 4 # # ncol(edhec1.tS) # 1 # # NCOL / NRWO # NCOL(edhec.tS) # 4 # # NCOL(edhec1.tS) # 1 # # isUnivariate # isUnivariate = function(x) NCOL(x) == 1 # isUnivariate(edhec.tS) # isUnivariate(edhec1.tS) # # isMultivariate # Just Negation of isUnivariate # # # # ------------------------------------------------------------------------------ # length # dim # ncol # nrow # LENGTH # DIM # NCOL # NROW # ------------------------------------------------------------------------------ # Note it is faster to access attribute rather than accessing @.Data setMethod("dim", "timeSeries", function(x) attr(x, "dim")) # This should make functions like # model.response(model.frame(dummyMonthlySeries() ~1)) work setReplaceMethod("dim", "timeSeries", function(x, value) { # dim(x) <- NULL returns a vector if (is.null(value)) return(as.vector(x)) else x #<< returns same object : # setting new dim # is forbidden for a timeSeries object } ) # ------------------------------------------------------------------------------ # colnames - faster to have dedicated method than relying on dimnames[[2]] setMethod("colnames", "timeSeries", # "signalSeries", function(x, do.NULL = TRUE, prefix = "col") x@units ) # ------------------------------------------------------------------------------ # rownames ## setMethod("rownames", "signalSeries", ## function (x, do.NULL = TRUE, prefix = "row") NULL) ## setMethod("rownames", "timeSeries", ## function (x, do.NULL = TRUE, prefix = "row") as.character(time(x))) setMethod("rownames", "timeSeries", function (x, do.NULL = TRUE, prefix = "row") { if (length(x@positions) > 0) as.character(time(x)) else NULL } ) # ------------------------------------------------------------------------------ setMethod("dimnames", "timeSeries", # "signalSeries", function(x) { list(rownames(x),colnames(x)) } ) # ------------------------------------------------------------------------------ setMethod("colnames<-", "timeSeries", function(x, value) { units <- as.character(value) if(!length(units)) if (x@format == "counts") units <- paste("SS", seq(NCOL(x)), sep = ".") else units <- paste("TS", seq(NCOL(x)), sep = ".") if (length(units) != NCOL(x)) stop("length of 'colnames' not equal to array extent",call.=FALSE) x@units <- units colnames(x@.Data) <- units x } ) # ------------------------------------------------------------------------------ setMethod("rownames<-", c("timeSeries", "timeDate"), #c("signalSeries", "timeDate"), function (x, value) { .timeSeries( data = getDataPart(x), charvec = as.numeric(value, "sec"), units = colnames(x), format = value@format, FinCenter = value@FinCenter, recordIDs = x@recordIDs, title = x@title, documentation = x@documentation) } ) # ------------------------------------------------------------------------------ setMethod("rownames<-", "timeSeries", # "signalSeries", function (x, value) { # if charvec NULL returns a signal series if (is.null(value)) return(.signalSeries(data = getDataPart(x), units = colnames(x), recordIDs = x@recordIDs, title = x@title, documentation = x@documentation)) # coerce charvec to timeDate charvec <- timeDate(charvec = value) if (any(is.na(charvec))) # Note : there is already a warning in timeDate if there are NA's .signalSeries(data = getDataPart(x), units = colnames(x), recordIDs = x@recordIDs, title = x@title, documentation = x@documentation) else .timeSeries(data = getDataPart(x), charvec = as.numeric(charvec, "sec"), units = colnames(x), format = charvec@format, FinCenter = charvec@FinCenter, recordIDs = x@recordIDs, title = x@title, documentation = x@documentation) } ) # ------------------------------------------------------------------------------ setMethod("dimnames<-", c("timeSeries", "list"), # c("signalSeries", "list"), function(x, value) { rownames(x) <- value[[1]] colnames(x) <- value[[2]] x } ) # ------------------------------------------------------------------------------ # important for completion with $ setMethod("names", "timeSeries", # "signalSeries", function(x) c(colnames(x), names(x@recordIDs))) setReplaceMethod("names", "timeSeries", # "signalSeries", function(x, value) { nc <- ncol(x) nv <- length(value) nr <- length(x@recordIDs) # Note that using [][] ensure that length of the # names are equal to array extent colnames(x) <- value[seq.int(nv)][seq.int(nc)] if (nv > nc) names(x@recordIDs) <- value[-seq.int(nc)][seq.int(nr)] x }) ################################################################################ timeSeries/R/fin-periodical.R0000755000176200001440000001442614320521273015605 0ustar liggesusers# # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # A copy of the GNU General Public License is available at # ../../COPYING ################################################################################ # FUNCTION: DESCRIPTION: # endOfPeriodSeries Returns series back to a given period # endOfPeriodStats Returns statistics back to a given period # endOfPeriodBenchmarks Returns benchmarks back to a given period ################################################################################ endOfPeriodSeries <- function(x, nYearsBack = c("1y", "2y", "3y", "5y", "10y", "YTD")) { # A function implemented by Diethelm Wuertz # Description: # Returns series back to a given period # Arguments: # x - a monthly 'timeSeries' object of returns # nYearsBack - a period string. How long back should the series # be extracted? Options include values from 1 year to 10 years. # and year to date: "1y", "2y", "3y", "5y", "10y", "YTD". # FUNCTION: # Check: stopifnot(is.timeSeries(x)) # Match Arguments: nYearsBack <- match.arg(nYearsBack) # Settings: if (nYearsBack == "YTD") monthsBack = atoms(end(x))$m else if (nYearsBack == "1y") monthsBack = 12 else if (nYearsBack == "2y") monthsBack = 24 else if (nYearsBack == "3y") monthsBack = 36 else if (nYearsBack == "5y") monthsBack = 60 else if (nYearsBack == "10y") monthsBack = 120 stopifnot( nrow(x) >= monthsBack ) # ReturnValue: rev(rev(x)[1:monthsBack, ]) } # ------------------------------------------------------------------------------ endOfPeriodStats <- function(x, nYearsBack = c("1y", "2y", "3y", "5y", "10y", "YTD")) { # A function implemented by Diethelm Wuertz # Description: # Returns series statistics back to a given period # Arguments: # x - a monthly 'timeSeries' object of returns # nYearsBack - a period string. How long back should the series # be extracted? Options include values from 1 year to 10 years. # and year to date: "1y", "2y", "3y", "5y", "10y", "YTD". # FUNCTION: # Check: stopifnot(is.timeSeries(x)) # Match Arguments: nYearsBack <- match.arg(nYearsBack) # Series: Series <- endOfPeriodSeries(x, nYearsBack = nYearsBack) # Internal Function: .cl.vals <- function(x, ci) { x = x[!is.na(x)] n = length(x) if (n <= 1) return(c(NA, NA)) se.mean = sqrt(var(x)/n) t.val = qt((1 - ci)/2, n - 1) mn = mean(x) lcl = mn + se.mean * t.val ucl = mn - se.mean * t.val c(lcl, ucl) } # Statistics: for (i in 1:ncol(Series)) { # Basic Statistics: X = as.vector(Series[, i]) X.length = length(X) X = X[!is.na(X)] X.na = X.length - length(X) ci = 0.95 z = c(X.length, X.na, min(X), max(X), as.numeric(quantile(X, prob = 0.25, na.rm = TRUE)), as.numeric(quantile(X, prob = 0.75, na.rm = TRUE)), mean(X), median(X), sum(x), sqrt(var(X)/length(X)), .cl.vals(X, ci)[1], .cl.vals(X, ci)[2], var(X), sqrt(var(X)), skewness(X), kurtosis(X)) znames = c("nobs", "NAs", "Minimum", "Maximum", "1. Quartile", "3. Quartile", "Mean", "Median", "Sum", "SE Mean", "LCL Mean", "UCL Mean", "Variance", "Stdev", "Skewness", "Kurtosis") stats1 <- matrix(z, ncol = 1) row.names(stats1) <- znames # Monthly Return Statistics: xData <- as.vector(x) noNegativePeriods <- length(xData[xData < 0 ]) noPositivePeriods <- length(xData[xData > 0 ]) stats1 = rbind(stats1, worstPeriod = min(xData), negativeValues = noNegativePeriods, positiveValues = noPositivePeriods) MaximumDrawdown = NA TimeUnderWater = NA AnnualizedVolatility = NA SharpeRatio = NA InformationRatio = NA ValueAtRisk = NA ExpectedShortfall = NA # Bind: if (i > 1) { stats <- cbind.data.frame(stats, stats1) } else { stats <- stats1 } } colnames(stats) <- colnames(x) # Return Value: stats } # ------------------------------------------------------------------------------ ## 2022-10-09 :TODO: GNB: this function is unfinished and returns NULL. ## It should be removed or completed. ## I don't know what it is supposed to do. endOfPeriodBenchmarks <- function(x, benchmark = ncol(x), nYearsBack = c("1y", "2y", "3y", "5y", "10y", "YTD")) { # A function implemented by Diethelm Wuertz # Description: # Returns benchmarks back to a given period # Arguments: # x - a monthly 'timeSeries' object of financial returns # nYearsBack - a period string. How long back should the series # be extracted? Options include values from 1 year to 10 years. # and year to date: "1y", "2y", "3y", "5y", "10y", "YTD". # FUNCTION: # Checks: stopifnot(is.timeSeries(x)) # Match Arguments: nYearsBack <- match.arg(nYearsBack) # Series: Series <- endOfPeriodSeries(x[, -benchmark], nYearsBack = nYearsBack) y <- Benchmark <- endOfPeriodSeries(x[, benchmark], nYearsBack = nYearsBack) stats <- NULL for (i in 1:ncol(Series)) { # Gdet Series: x <- Series[, i] # Compute Statistics: stats1 <- c( TrackingError = NA, Alpha = NA, Beta = NA, CorrelationToBenchmark = NA) # Bind Results: stats <- rbind(stats, stats1) } # Return Value: ## GNB: stats? invisible() } ################################################################################ timeSeries/R/statistics-rowCumsums.R0000755000176200001440000000330014263246022017263 0ustar liggesusers# # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # A copy of the GNU General Public License is available at # ../../COPYING ################################################################################ # FUNCTION: DESCRIPTION: # rowCumsums,ANY Computes cumulated sums by row # rowCumsums,timeSeries Computes cumulated sums by row for timeSeries ################################################################################ setMethod("rowCumsums", "ANY", function(x, na.rm = FALSE, ...) { # Transform: if (!inherits(x, 'matrix')) x <- as(x, "matrix") if (na.rm) x <- na.omit(x) ans <- apply(x, 1, cumsum, ...) # special treatment when x has one row because apply returns a vector if (NCOL(x) > 1) t(ans) else matrix(ans, ncol = 1, dimnames = dimnames(x)) }) # ------------------------------------------------------------------------------ setMethod("rowCumsums", "timeSeries", function(x, na.rm = FALSE, ...) setDataPart(x, callGeneric(getDataPart(x), na.rm = na.rm, ...))) ################################################################################ timeSeries/R/fin-turnpoints.R0000755000176200001440000002363214263246022015720 0ustar liggesusers# # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # A copy of the GNU General Public License is available at # ../../COPYING ################################################################################ # FUNCTION: DESCRIPTION: # turns Returns turnpoints from a 'timeSeries' # turnsStats Computes statistics of turn points # BUILTIN: DESCRIPTION: # .turnpointsPastecs Builtin function from package pastecs # .extract.turnpointsPastecs Extractor function from package pastecs # .plot.turnpointsPastecs Plot function from package pastecs # .summary.turnpointsPastecs Summary function from package pastecs # DEPRECATED: DESRIPTION: # .turnpoints2 Deprecated, use function turns # .turnpointsSeries Deprecated, use function turns # .turnpointsStats Deprecated, use function turnsStats ################################################################################ # DW: # This function is originally borrowed from the contributesd R package pastecs. # It is not necessary to load pastecs, the functions required are builtin. # ----------------------------------------------------------------------------- turns <- function(x, ...) { # A function implemented by Diethelm Wuertz # Description: # Returns turnpoints from a timeSeries # Arguments: # x - an univariate timeSeries object, e.g. a price or index series. # ... - arguments passed to the function na.omit() # FUNCTION: # Check arguments: stopifnot(is.timeSeries(x)) stopifnot(isUnivariate(x)) # Extract Title and Documentation: Title <- x@title Documentation <- x@documentation # Handle Missing Values: x <- na.omit(x, ...) # Convert to Vector: X <- x x <- as.vector(x) # Turnpoints: ans <- .turnpointsPastecs(x) tp <- .extract.turnpointsPastecs(ans) data <- cbind(x, tp) colnames(data) <- c(colnames(X), "TP") series(X) <- data # Preserve Title and Documentation: X@title <- Title X@documentation <- Documentation # Return Value: X } # ---------------------------------------------------------------------------- turnsStats <- function(x, doplot = TRUE) { # A function implemented by Diethelm Wuertz # Description: # Computes turnpoints statistics # Arguments: # x - an univariate timeSeries object, e.g. a price or index series # doplot - a logical flag, should an optional plot be displayed? # Value: # Returns an object of class turnpoints. # FUNCTION: # Settings stopifnot(isUnivariate(x)) X <- x x <- as.vector(x) # Turnpoints: ans <- .turnpointsPastecs(x) # Summary Statistics: .summary.turnpointsPastecs(ans) # Optional Plot: if(doplot) .plot.turnpointsPastecs(ans) # Return Value: invisible(ans) } ################################################################################ .turnpoints2 <- function(...) { # Deprecated: .Deprecated(new = "turns", package = "timeSeries") # Return Value: turns(...) } # ----------------------------------------------------------------------------- .turnpointsStats <- function(...) { # Deprecated: .Deprecated(new = "turnsStats", package = "timeSeries") # Return Value: turnsStats(...) } ################################################################################ # Package: pastecs # Title: Package for Analysis of Space-Time Ecological Series # Version: 1.3-4 # Date: 2006-11-28 # Author: Frederic Ibanez , # Philippe Grosjean & # Michele Etienne # Description: Regulation, decomposition and analysis of space-time series. # The pastecs library is a PNEC-Art4 and IFREMER # (Benoit Beliaeff ) initiative # to bring PASSTEC 2000 # (http://www.obs-vlfr.fr/~enseigne/anado/passtec/passtec.htm) # functionnalities to R. # URL: http://www.sciviews.org/pastecs # Maintainer: Philippe Grosjean # License: GNU Public Licence 2.0 or above at your convenience # Depends: boot, stats # Packaged: Tue Nov 28 15:33:42 2006; Philippe Grosjean .turnpointsPastecs <- function(x) { data <- deparse(substitute(x)) if (is.null(ncol(x)) == FALSE) stop("Only one series can be treated at a time") # if (exists("is.R") && is.function(is.R) && is.R()) # We are in R # Now done with Depends: field require(stats) x <- as.vector(x) n <- length(x) diffs <- c(x[1]-1, x[1:(n-1)]) != x uniques <- x[diffs] n2 <- length(uniques) poss <- (1:n)[diffs] exaequos <- c(poss[2:n2], n+1) - poss - 1 if (n2 < 3) { # We need at least 3 unique values!!! warning("Less than 3 unique values, no calculation!") nturns <- NA firstispeak <- FALSE peaks <- rep(FALSE, n2) pits <- rep(FALSE, n2) tppos <- NA proba <- NA info <- NA } else { # The following code is faster in R, but do not work all the time! #if (exists("is.R") && is.function(is.R) && is.R()) { # We are in R # ex <- embed(uniques, 3) # Works only in R! # peaks <- c(FALSE, max.col(ex) == 2, FALSE) # pits <- c(FALSE, max.col(-ex) == 2, FALSE) #} else { # We are in S+ m <- n2 - 2 ex <- matrix(uniques[1:m + rep(3:1, rep(m, 3)) - 1], m) peaks <- c(FALSE, apply(ex, 1, max, na.rm=TRUE) == ex[, 2], FALSE) pits <- c(FALSE, apply(ex, 1, min, na.rm=TRUE) == ex[, 2], FALSE) #} tpts <- peaks | pits if (sum(tpts) == 0) { # No turning point nturns <- 0 firstispeak <- FALSE peaks <- rep(FALSE, n2) pits <- rep(FALSE, n2) tppos <- NA proba <- NA info <- NA } else { # This way, we consider the last element of duplicates, as # in PASSTEC 2000 tppos <- (poss + exaequos)[tpts] tptspos <- (1:n2)[tpts] firstispeak <- tptspos[1] == (1:n2)[peaks][1] nturns <- length(tptspos) if (nturns < 2) { inter <- n2 + 1 posinter1 <- tptspos[1] } else { inter <- c(tptspos[2:nturns], n2) - c(1, tptspos[1:(nturns-1)]) + 1 posinter1 <- tptspos - c(1, tptspos[1:(nturns-1)]) } posinter2 <- inter - posinter1 posinter <- pmax(posinter1, posinter2) proba <- 2 / (inter * gamma(posinter) * gamma(inter - posinter + 1)) info <- -log(proba, base = 2) } } res <- list(data = data, n = n, points = uniques, pos = (poss + exaequos), exaequos = exaequos, nturns = nturns, firstispeak = firstispeak, peaks = peaks, pits = pits, tppos = tppos, proba = proba, info = info) class(res) <- "turnpoints" res } # ------------------------------------------------------------------------------ .extract.turnpointsPastecs <- function(e, n, no.tp = 0, peak = 1, pit = -1, ...) { if (missing(n)) n <- -1 res <- rep(no.tp, length.out= e$n) res[e$pos[e$peaks]] <- peak res[e$pos[e$pits]] <- pit # Keep only the first n points if (n < length(res) & n > 0) res <- res[1:n] res } # ------------------------------------------------------------------------------ .plot.turnpointsPastecs <- function(x, level = 0.05, lhorz = TRUE, lcol = 2, llty = 2, type = "l", xlab = "data number", ylab = paste("I (bits), level = ", level*100, "%", sep = ""), main = paste("Information (turning points) for:",x$data), ...) { # The next function actually draws the graph turnpoints.graph <- function(X, Level, Lhorz, Lcol, Llty, Type, Xlab, Ylab, Main, Sub, ...) { plot(X$tppos, X$info, type = Type, xlab = Xlab, ylab = Ylab, main = Main, ...) abline(h = -log(Level, base = 2), lty = Llty, col = Lcol) } # Return Value: invisible(turnpoints.graph(x, level[1], lhorz, lcol, llty, type, xlab, ylab, main, ...)) } # ------------------------------------------------------------------------------ .summary.turnpointsPastecs <- function(object, ...) { cat("Turning points for:", object$data, "\n\n") cat("nbr observations :", object$n, "\n") cat("nbr ex-aequos :", sum(object$exaequos), "\n") if (object$firstispeak) { cat("nbr turning points:", object$nturns, "(first point is a peak)\n") typep <- c("peak", "pit") } else { cat("nbr turning points:", object$nturns, "(first point is a pit)\n") typep <- c("pit", "peak") } cat("E(p) =", 2 / 3 * (object$n - 2), "Var(p) =", (16 * object$n - 29) / 90, "(theoretical)\n") cat("\n") # construct the table summarizing all turning points typepts <- rep(typep, length.out=object$nturns) tablepts <- as.data.frame(list(point = object$tppos, type = typepts, proba = object$proba, info = object$info)) print(tablepts) # Return Value: invisible(object) } ################################################################################ .turnpointsSeries = function(...) { # Deprecated: .Deprecated(new = "turns") # Return Value: turns(...) } ################################################################################ timeSeries/R/methods-mathOps.R0000644000176200001440000001542514546226144016002 0ustar liggesusers# # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # A copy of the GNU General Public License is available at # ../../COPYING ################################################################################ # FUNCTION: DESCRIPTION: # Ops,timeSeries Returns group 'Ops' for a 'timeSeries' object # cummax Returns cumulated maxima # cummin Returns cumulated minima # cumprod Returns cumulated products # cumsum Returns cumulated sums # ##diff,timeSeries Differences a timeSeries object # ##scale,timeSeries Scales a timeSeries object # quantile,timeSeries Samples quantiles of a timeSeries object # median,timeSeries Samples median of a timeSeries object ################################################################################ setMethod("Ops", c("vector", "timeSeries"), function(e1, e2) { lattrs <- attributes(e2) e2 <- getDataPart(e2) value <- callGeneric(e1, e2) if (identical(dim(value), dim(e2))) { attributes(value) <- lattrs value <- asS4(value, TRUE) } value } ) # ------------------------------------------------------------------------------ setMethod("Ops", c("array", "timeSeries"), function(e1, e2) { e1 <- as.vector(e1) lattrs <- attributes(e2) e2 <- getDataPart(e2) value <- callGeneric(e1, e2) if (identical(dim(value), dim(e2))) { attributes(value) <- lattrs value <- asS4(value, TRUE) } value } ) # ------------------------------------------------------------------------------ setMethod("Ops", c("ts", "timeSeries"), function(e1, e2) { e1 <- as(e1, "matrix") lattrs <- attributes(e2) e2 <- getDataPart(e2) value <- callGeneric(e1, e2) if (identical(dim(value), dim(e2))) { attributes(value) <- lattrs value <- asS4(value, TRUE) } value } ) # ------------------------------------------------------------------------------ setMethod("Ops", c("timeSeries", "vector"), function(e1, e2) { lattrs <- attributes(e1) e1 <- getDataPart(e1) value <- callGeneric(e1, e2) if (identical(dim(value), dim(e1))) { attributes(value) <- lattrs value <- asS4(value, TRUE) } value } ) # ------------------------------------------------------------------------------ setMethod("Ops", c("timeSeries", "array"), function(e1, e2) { lattrs <- attributes(e1) e1 <- getDataPart(e1) value <- callGeneric(e1, e2) if (identical(dim(value), dim(e1))) { attributes(value) <- lattrs value <- asS4(value, TRUE) } value } ) # ------------------------------------------------------------------------------ setMethod("Ops", c("timeSeries", "ts"), function(e1, e2) { lattrs <- attributes(e1) e1 <- getDataPart(e1) e2 <- as(e2, "matrix") value <- callGeneric(e1, e2) if (identical(dim(value), dim(e1))) { attributes(value) <- lattrs value <- asS4(value, TRUE) } value } ) # ------------------------------------------------------------------------------ setMethod("Ops", c("timeSeries", "timeSeries"), function(e1, e2) { # Note keep recordIDs of e1 only # check if conformable arrays if (!identical(dim(e1), dim(e2))) stop("non-conformable arrays") # check if positions are identical if (!identical(e1@positions, e2@positions)) stop("positions slot do not match") lattrs <- attributes(e1) e1 <- getDataPart(e1) e2 <- getDataPart(e2) value <- callGeneric(e1, e2) if (identical(dim(value), dim(e1))) { attributes(value) <- lattrs value <- asS4(value, TRUE) } value } ) ## 2023-05-31 GNB: making these work column-wise and return 'timeSeries' ## # ------------------------------------------------------------------------------ ## setMethod("cummax", "timeSeries", function(x) callGeneric(getDataPart(x))) ## setMethod("cummin", "timeSeries", function(x) callGeneric(getDataPart(x))) ## setMethod("cumprod", "timeSeries", function(x) callGeneric(getDataPart(x))) ## setMethod("cumsum", "timeSeries", function(x) callGeneric(getDataPart(x))) .cum_fun <- function(x, FUN){ wrk <- apply(getDataPart(x), 2, FUN) if (NROW(x) == 1) wrk <- matrix(wrk, nrow = 1, dimnames = dimnames(x)) x@.Data <- wrk x } setMethod("cummax", "timeSeries", function(x) .cum_fun(x, cummax)) setMethod("cummin", "timeSeries", function(x) .cum_fun(x, cummin)) setMethod("cumprod", "timeSeries", function(x) .cum_fun(x, cumprod)) setMethod("cumsum", "timeSeries", function(x) .cum_fun(x, cumsum)) # ------------------------------------------------------------------------------ ## setMethod("diff", "timeSeries", function(x, ...) { ## x <- getDataPart(x) ## callGeneric() ## }) # ------------------------------------------------------------------------------ ## setMethod("scale", "timeSeries", function(x, ...) { ## x <- getDataPart(x) ## callGeneric() ## }) # ------------------------------------------------------------------------------ ## GNB: make an S3 method, drop the S4 one ## ## setMethod("quantile", "timeSeries", function(x, ...) { ## x <- getDataPart(x) ## callGeneric() ## }) quantile.timeSeries <- function(x, ...) { x <- getDataPart(x) NextMethod("quantile") } # ------------------------------------------------------------------------------ ## GNB: make an S3 method, drop the S4 one ## ## setMethod("median", "timeSeries", function(x, na.rm, ...) { ## x <- getDataPart(x) ## callGeneric(x, na.rm=na.rm) ## }) median.timeSeries <- function(x, na.rm = FALSE, ...) { x <- getDataPart(x) NextMethod("median") } ################################################################################ timeSeries/R/base-sort.R0000644000176200001440000000351414550234304014611 0ustar liggesusers# # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # A copy of the GNU General Public License is available at # ../../COPYING ################################################################################ # FUNCTION: DESCRIPTION: # sort,timeSeries Sorts a 'timeSeries' object in time ################################################################################ sort.timeSeries <- function (x, decreasing = FALSE, ...) { # A function implemented by Diethelm Wuertz and Yohan Chalabi # Description: # Time sorts a 'timeSeries' object # Arguments: # x - a 'timeSeries' object. # Value: # Returns a time sorted object of class 'timeSeries'. # FUNCTION: # check if really necessary to sort x ## NB: is.unsorted can return NA if (!decreasing && !isTRUE(is.unsorted(x@positions))) return(x) if (length(x@positions)>0) x[order(x@positions, decreasing = decreasing), ] else x } ## setMethod("sort", "timeSeries", function (x, decreasing = FALSE, ...) ## sort.timeSeries(x, decreasing = decreasing, ...)) ## # until UseMethod dispatches S4 methods in 'base' functions ## sort.timeSeries <- function(x, decreasing = FALSE, ...) ## .sort.timeSeries(x, decreasing = decreasing, ...) ################################################################################ timeSeries/R/base-merge.R0000755000176200001440000001376214321370314014730 0ustar liggesusers# # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # A copy of the GNU General Public License is available at # ../../COPYING ################################################################################ # FUNCTION: DESCRIPTION: # merge,timeSeries,ANY Merges 'timeSeries' object and ANY # merge,timeSeries,missing Merges 'timeSeries' object and missing # merge,timeSeries,timeSeries Merges two 'timeSeries' objects # merge,ANY,timeSeries Merges ANY and 'timeSeries' object ################################################################################ setMethod("merge", c("timeSeries", "ANY"), function(x, y, ...) { callGeneric(x, as(y, "timeSeries"), ...) } ) # ------------------------------------------------------------------------------ setMethod("merge", c("timeSeries", "missing"), function(x, y, ...) { x } ) # ------------------------------------------------------------------------------ setMethod("merge", c("timeSeries", "numeric"), function(x, y, ...) { # Deal with names of numeric vectors units <- names(y) if (is.null(units)) units <- paste((substitute(x)), collapse = ".") if (length(y) == 1) { y <- rep(y, times = nrow(x)) return(merge(x, timeSeries(y, time(x), units = units), ...)) } else if (length(y) == nrow(x)) { return(merge(x, timeSeries(y, time(x), units = units), ...)) } else { stop("number of rows must match") } } ) # ------------------------------------------------------------------------------ setMethod("merge", c("timeSeries", "matrix"), function(x, y, ...) { # deal with names of matrix units <- colnames(y) if (is.null(units)) { units <- paste((substitute(y)), collapse = ".") if ((nc <- ncol(y)) > 1) units <- paste(units, seq(nc), sep = ".") } if (nrow(y) != nrow(x)) stop("number of rows must match") else merge(x, timeSeries(y, time(x), units = units), ...) }) # ------------------------------------------------------------------------------' merge.timeSeries <- function(x, y, ...) { # A function implemented by Diethelm Wuertz and Yohan Chalabi # Description: # Merges two objects of class 'timeSeries' # Arguments: # x, y - two objects of class 'timeSeries' # FUNCTION: # Compose Attributes - Documentation : xAttributes <- getAttributes(x) yAttributes <- getAttributes(y) Attributes <- .appendList(xAttributes, yAttributes) Documentation <- as.character(date()) attr(Documentation, "Attributes") <- Attributes # Merge: if (is.signalSeries(x) | is.signalSeries(y)) { data <- merge(getDataPart(x), getDataPart(x)) return(timeSeries(data = data, units = colnames(data))) } # Convert to Data Frame tx <- as.numeric(time(x), "sec") ty <- as.numeric(time(y), "sec") df.x <- if (prod(dim(rec.x <- x@recordIDs))) data.frame(positions = tx, getDataPart(x), rec.x) else data.frame(positions = tx, getDataPart(x)) df.y <- if (prod(dim(rec.y <- y@recordIDs))) data.frame(positions = ty, getDataPart(y), rec.y) else data.frame(positions = ty, getDataPart(y)) # Merge as Data Frame: df <- merge(df.x, df.y, all = TRUE) #-> To avoid problems when using invalid data.frame colnames nx <- make.names(colnames(x)) nxrec <- colnames(rec.x) ny <- make.names(colnames(y)) nyrec <- colnames(rec.y) dataIdx <- colnames(df) %in% c(nx, ny) recIdx <- colnames(df) %in% c(nxrec, nyrec) data <- as.matrix(df[,dataIdx, drop=FALSE]) recordIDs <- if (any(recIdx)) df[,recIdx, drop=FALSE] else data.frame() units <- names(df)[dataIdx] charvec <- as.numeric(df[,1]) # Return Value: ans <- timeSeries(data = data, charvec = charvec, units = units, zone = "GMT", FinCenter = finCenter(x), recordIDs = recordIDs) ans@documentation <- Documentation ans } setMethod("merge", c("timeSeries", "timeSeries"), ## function(x, y, ...) merge.timeSeries(x, y, ...)) merge.timeSeries) ## # until UseMethod dispatches S4 methods in 'base' functions ## merge.timeSeries <- function(x, y, ...) .merge.timeSeries(x, y, ...) # ------------------------------------------------------------------------------ setMethod("merge", c("numeric", "timeSeries"), function(x, y, ...) { # Deal with names of numeric vectors units <- names(x) if (is.null(units)) units <- paste((substitute(x)), collapse = ".") if (length(x) == 1) { x = rep(x, times = nrow(y)) return(merge(timeSeries(x, time(y), units = units), y, ...)) } else if (length(x) == nrow(y)) { return(merge(timeSeries(x, time(y), units = units), y, ...)) } else { stop("number of rows must match") } } ) # ------------------------------------------------------------------------------ setMethod("merge", c("matrix", "timeSeries"), function(x, y, ...) { # Deal with names of matrix units <- colnames(x) if (is.null(units)) { units <- paste((substitute(x)), collapse = ".") if ((nc <- ncol(x)) > 1) units <- paste(units, seq(nc), sep = ".") } if (nrow(x) != nrow(y)) stop("number of rows must match") else merge(timeSeries(x, time(y), units = units), y, ...) }) setMethod("merge", c("ANY", "timeSeries"), function(x, y, ...) { callGeneric(as(x, "timeSeries"), y, ...) } ) ################################################################################ timeSeries/R/utils-description.R0000755000176200001440000000252714263246022016402 0ustar liggesusers # This library is free software; you can redistribute it and/or # modify it under the terms of the GNU Library General Public # License as published by the Free Software Foundation; either # version 2 of the License, or (at your option) any later version. # # This library is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU Library General Public License for more details. # # You should have received A copy of the GNU Library General # Public License along with this library; if not, write to the # Free Foundation, Inc., 59 Temple Place, Suite 330, Boston, # MA 02111-1307 USA ################################################################################ # FUNCTION: DESCRIPTION: # description Creates default description string ################################################################################ description <- function() { # A function implemented by Diethelm Wuertz # Description: # Sets default description string: # FUNCTION: # Get Description String: ans <- paste(as.character(date()), "by user:", Sys.getenv("USERNAME")) # Return Value: ans } ################################################################################ timeSeries/R/utils-head.R0000644000176200001440000000701114550715335014755 0ustar liggesusers# # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # A copy of the GNU General Public License is available at # ../../COPYING ################################################################################ # METHOD: SUBSETTING METHODS ON DATA: # head,timeSeries Returns the head of a 'timeSeries' object # tail,timeSeries Returns the tail of a 'timeSeries' object ################################################################################ setGeneric("head") setGeneric("tail") head.timeSeries <- function(x, n = 6, recordIDs = FALSE, ...) { # A function implemented by Diethelm Wuertz # Description: # Returns the head of a 'timeSeries' object # Arguments: # x - a 'timeSeries' object. # n - a single integer. If positive, number of the first n records (rows) # to be returned. If negative, all but the n first number of # elements of x are returned. # recordIDs - a logical flag, should the record identification # be shown? By default FALSE. # ... - # Value: # Returns the tail of an object of class 'timeSeries'. # FUNCTION: # Head: if (recordIDs & dim(x)[1] == dim(x@recordIDs)[1]) cbind(head.matrix(x, n = n, ...), head(x@recordIDs, n = n, ...)) else head.matrix(x, n = n, ...) } # ------------------------------------------------------------------------------ ##' @title Returns the tail of a 'timeSeries' object ##' ##' @param x a 'timeSeries' object. ##' @param n a single integer. If positive, number of the last n records (rows) ##' to be returned. If negative, all but the n last number of ##' elements of x are returned. ##' @param recordIDs a logical flag, should the record identification ##' be shown? By default FALSE. ##' @param ... ##' ##' @return ##' Returns the tail of an object of class 'timeSeries'. ##' ## Martin Maechler: if("keepnums" %in% names(formals(tail.matrix))) ## R-devel (2020-01) ## refactored somewhat by GNB; *TODO:* is a similar thing needed for head.timeSeries? tail.timeSeries <- if(getRversion() >= "4.0.0") { function(x, n = 6, recordIDs = FALSE, ...) { if (recordIDs && nrow(x) == nrow(x@recordIDs)) cbind(tail.matrix(x, n = n, keepnums = FALSE, ...), tail(x@recordIDs, n = n, keepnums = FALSE, ...)) else tail.matrix(x, n = n, keepnums = FALSE, ...) } } else { function(x, n = 6, recordIDs = FALSE, ...) { if (recordIDs & dim(x)[1] == dim(x@recordIDs)[1]) cbind(tail.matrix(x, n = n, addrownums = FALSE, ...), tail(x@recordIDs, n = n, addrownums = FALSE, ...)) else tail.matrix(x, n = n, addrownums = FALSE, ...) } } ## (2024-01-05) GNB: stop making head() and tail() S4 ## setMethod("head", "timeSeries", head.timeSeries) ## setMethod("tail", "timeSeries", tail.timeSeries) ################################################################################ timeSeries/R/timeSeries-slotUnits.R0000755000176200001440000000344614263246022017035 0ustar liggesusers# # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # A copy of the GNU General Public License is available at # ../../COPYING ################################################################################ # FUNCTION: DESCRIPTION: # getUnits Get units slot from a 'timeSeries' # setUnits<- Set new units slot to a 'timeSeries' ################################################################################ getUnits <- function(x) { # A function implemented by Diethelm Wuertz # FUNCTION: # Return Value: UseMethod("getUnits") } getUnits.default <- function(x) { # Description: # Get units slot from a 'timeSeries' object. # Arguments: # x - a 'timeSeries' object # FUNCTION: # Return Value: colnames(x) } # ------------------------------------------------------------------------------ "setUnits<-" <- function(x, value) { # Description: # Set units slot to a 'timeSeries' object. # Arguments: # x - a 'timeSeries' object # FUNCTION: # Assign Time Slot: colnames(x) <- value # Return Value: x } ################################################################################ timeSeries/R/base-rev.R0000644000176200001440000000172514546271374014435 0ustar liggesusers# # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # A copy of the GNU General Public License is available at # ../../COPYING ################################################################################ # FUNCTION: DESCRIPTION: # rev.timeSeries Reverts a 'timeSeries' object in time ################################################################################ ## GNB: removed the S4 method rev.timeSeries <- function(x) x[NROW(x):1,] ## setMethod("rev", "timeSeries", rev.timeSeries) timeSeries/R/statistics-rollMean.R0000755000176200001440000003030714263246022016657 0ustar liggesusers # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # A copy of the GNU General Public License is available at # ../../COPYING ################################################################################ # FUNCTION: DESCRIPTION: # rollStats Returns rolling statistics of a 'timeSeries' object # rollMean Returns rolling mean of a 'timeSeries' object # rollMin Returns rolling minimum of a 'timeSeries' object # rollMax Returns rolling maximum of a 'timeSeries' object # rolMedian Returns rolling median of a 'timeSeries' object # DEPRECATED: DESCRIPTION: # .rollmean.timeSeries Returns rolling mean of a 'timeSeries' object # .rollmin.timeSeries Returns rolling minimum of a 'timeSeries' object # .rollmax.timeSeries Returns rolling maximum of a 'timeSeries' object # .rolmedian.timeSeries Returns rolling median of a 'timeSeries' object ################################################################################ rollStats <- function(x, k, FUN=mean, na.pad=FALSE, align=c("center", "left", "right"), ...) { # Description: # Returns rolling statistics of a 'timeSeries' object # Arguments: # x - an object of class timeSeries # k - integer width of the rolling window. # FUN - statistical function to be rolled. # na.pad - a logical. Should NA padding be added at beginning? # align - character specifying whether result should be left- or # right-aligned or centered (default). # ... - furter arguments passed to function FUN. # Note: # Internal function are borrowed from package zoo ... # Example: # x <- timeSeries(matrix(sample(1:24), ncol = 2), timeCalendar()) # cbind(x, roll(x, k=3, FUN = mean, align="right", na.pad = TRUE)) # Internal Function: .rollstats <- function(x, k, fun, na.pad = FALSE, align = c("center", "left", "right"), ...) { window <- matrix(1:(length(x)+1-k), ncol = 1) winFun <- function(i, fun, y, k, ...) { fun = match.fun(fun) from = 1:(length(y)+1-k) to = from + k -1 fun(y[i:to[i]], ...) } rval <- apply(window, 1, FUN=winFun, fun=FUN, y=x, k=k, ...) if (na.pad) { rval <- switch(match.arg(align), "left" = { c(rval, rep(NA, k-1)) }, "center" = { c(rep(NA, floor((k-1)/2)), rval, rep(NA, ceiling((k-1)/2))) }, "right" = { c(rep(NA, k-1), rval) }) } rval } # Roll: ans <- apply(x, 2, FUN=.rollstats, k=k, fun=FUN, na.pad=na.pad, align=align, ...) x <- setDataPart(x[seq.int(1,NROW(ans)),], ans) colnames(x) <- paste(colnames(x), "RSTATS", sep = "_") if(!na.pad) x = na.omit(x) # Return Value x } ############################################################################### rollMean <- function(x, k, na.pad=FALSE, align=c("center", "left", "right"), ...) { # Description: # Returns rolling mean of a 'timeSeries' object # Arguments: # x - an object of class timeSeries # k - integer width of the rolling window. # na.pad - a logical. Should NA padding be added at beginning? # align - character specifying whether result should be left- or # right-aligned or centered (default). # ... - furter arguments passed to methods. # Note: # Internal function are borrowed from package zoo ... # Example: # X = timeSeries(matrix(rnorm(24), ncol = 2), timeCalendar()) # R = rollMean(x = X, k = 3); R; plot(R) # FUNCTION: # Internal Function: .rollmean.default <- function(x, k, na.pad = FALSE, align = c("center", "left", "right"), ...) { n <- length(x) y <- x[k:n] - x[c(1, 1:(n-k))] y[1] <- sum(x[1:k]) rval <- cumsum(y)/k if (na.pad) { rval <- switch(match.arg(align), "left" = { c(rval, rep(NA, k-1)) }, "center" = { c(rep(NA, floor((k-1)/2)), rval, rep(NA, ceiling((k-1)/2))) }, "right" = { c(rep(NA, k-1), rval) }) } rval } # Roll: ans <- apply(x, 2, .rollmean.default, k = k, na.pad=na.pad, align=align) x <- setDataPart(x[seq.int(1,NROW(ans)),], ans) colnames(x) <- paste(colnames(x), "RMEAN", sep = "_") if(!na.pad) x = na.omit(x) # Return Value: x } # ------------------------------------------------------------------------------ rollMax <- function(x, k, na.pad=FALSE, align=c("center", "left", "right"), ...) { # Description: # Returns rolling maximum of a 'timeSeries' object # Arguments: # x - an object of class timeSeries # k - integer width of the rolling window. # na.pad - a logical. Should NA padding be added at beginning? # align - character specifying whether result should be left- or # right-aligned or centered (default). # ... - furter arguments passed to methods. # Note: # Internal function are borrowed from package zoo ... # Example: # X = timeSeries(matrix(rnorm(24), ncol = 2), timeCalendar()) # R = rollMax(x = X, k = 3); plot(R) # FUNCTION: # Internal Function: .rollmax.default <- function(x, k, na.pad = FALSE, align = c("center", "left", "right"), ...) { n <- length(x) rval <- rep(0, n) a <- 0 for (i in k:n) { rval[i] <- if (is.na(a) || is.na(rval[i=1]) || a==rval[i-1]) max(x[(i-k+1):i]) else max(rval[i-1], x[i]); # max of window = rval[i-1] a <- x[i-k+1] # point that will be removed from window } rval <- rval[-seq(k-1)] if (na.pad) { rval <- switch(match.arg(align), "left" = { c(rval, rep(NA, k-1)) }, "center" = { c(rep(NA, floor((k-1)/2)), rval, rep(NA, ceiling((k-1)/2))) }, "right" = { c(rep(NA, k-1), rval) }) } rval } # Roll: ans <- apply(getDataPart(x), 2, .rollmax.default, k = k, na.pad=na.pad, align=align) x <- setDataPart(x[seq.int(1,NROW(ans)),], ans) colnames(x) <- paste(colnames(x), "RMAX", sep = "_") if(!na.pad) x = na.omit(x) # Return Value: x } # ------------------------------------------------------------------------------ rollMin <- function(x, k, na.pad=FALSE, align=c("center", "left", "right"), ...) { # Description: # Returns rolling minimum of a 'timeSeries' object # Arguments: # x - an object of class timeSeries # k - integer width of the rolling window. # na.pad - a logical. Should NA padding be added at beginning? # align - character specifying whether result should be left- or # right-aligned or centered (default). # ... - furter arguments passed to methods. # Note: # Internal function are borrowed from package zoo ... # Example: # X = timeSeries(matrix(rnorm(24), ncol = 2), timeCalendar()) # R = rollMin(x = X, k = 3); R; plot(R) # FUNCTION: .rollmax.default <- function(x, k, na.pad = FALSE, align = c("center", "left", "right"), ...) { n <- length(x) rval <- rep(0, n) a <- 0 for (i in k:n) { rval[i] <- if (is.na(a) || is.na(rval[i=1]) || a==rval[i-1]) max(x[(i-k+1):i]) else max(rval[i-1], x[i]); # max of window = rval[i-1] a <- x[i-k+1] # point that will be removed from window } rval <- rval[-seq(k-1)] if (na.pad) { rval <- switch(match.arg(align), "left" = { c(rval, rep(NA, k-1)) }, "center" = { c(rep(NA, floor((k-1)/2)), rval, rep(NA, ceiling((k-1)/2))) }, "right" = { c(rep(NA, k-1), rval) }) } rval } .rollmin.default <- function(x, k, na.pad = FALSE, align = c("center", "left", "right"), ...) { ans = -.rollmax.default(-x, k, na.pad = na.pad, align = align, ...) ans } # Roll: ans <- apply(getDataPart(x), 2, .rollmin.default, k=k, na.pad=na.pad, align=align) x <- setDataPart(x[seq.int(1,NROW(ans)),], ans) colnames(x) <- paste(colnames(x), "RMIN", sep = "_") if(!na.pad) x = na.omit(x) # Return Value: x } # ------------------------------------------------------------------------------ rollMedian <- function(x, k, na.pad=FALSE, align=c("center", "left", "right"), ...) { # Description: # Returns rolling median of a 'timeSeries' object # Arguments: # x - an object of class timeSeries # k - integer width of the rolling window. Must be odd for rollmedian. # na.pad - a logical. Should NA padding be added at beginning? # align - character specifying whether result should be left- or # right-aligned or centered (default). # ... - furter arguments passed to methods. # Note: # Internal function are borrowed from package zoo ... # Example: # X = timeSeries(matrix(rnorm(24), ncol=2), timeCalendar()) # R = rollMedian(x = X, k = 3); R; plot(R) # FUNCTION: # Internal Function: .rollmedian.default <- function(x, k, na.pad = FALSE, align = c("center", "left", "right"), ...) { stopifnot(k <= length(x), k %% 2 == 1) n <- length(x) m <- k %/% 2 rval <- runmed(x, k, ...) attr(rval, "k") <- NULL rval <- rval[-c(1:m, (n-m+1):n)] if (na.pad) { rval <- switch(match.arg(align), "left" = { c(rval, rep(NA, k-1)) }, "center" = { c(rep(NA, floor((k-1)/2)), rval, rep(NA, ceiling((k-1)/2))) }, "right" = { c(rep(NA, k-1), rval) }) } rval } # Roll: ans <- apply(x, 2, .rollmedian.default, k=k, na.pad=na.pad, align=align) x <- setDataPart(x[seq.int(1,NROW(ans)),], ans) colnames(x) <- paste(colnames(x), "RMED", sep = "_") if(!na.pad) x = na.omit(x) # Return Value: x } ################################################################################ .rollmean.timeSeries <- function(...) { # FUNCTION: # Deprecated: .Deprecated("rollMean") # Return Value: rollMean(...) } # ------------------------------------------------------------------------------ .rollmin.timeSeries <- function(...) { # FUNCTION: # Deprecated: .Deprecated("rollMin") # Return Value: rollMin(...) } # ------------------------------------------------------------------------------ .rollmax.timeSeries <- function(...) { # FUNCTION: # Deprecated: .Deprecated("rollMax") # Return Value: rollMax(...) } # ------------------------------------------------------------------------------ .rollmedian.timeSeries <- function(...) { # FUNCTION: # Deprecated: .Deprecated("rollMedian") # Return Value: rollMedian(...) } ################################################################################ timeSeries/R/methods-as.R0000644000176200001440000002610214547775743015003 0ustar liggesusers# # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # A copy of the GNU General Public License is available at # ../../COPYING ################################################################################ # METHOD: CREATE A TIMESERIES FROM OTHER OBJECTS: # as.timeSeries Defines method for a 'timeSeries' object # as.timeSeries.default Returns the input # as.timeSeries.ts Transforms a 'data.frame' into a 'timeSeries' # as.timeSeries.data.frame Transforms a 'data.frame' into a 'timeSeries' # as.timeSeries.character Loads and transformas from a demo file # as.timeSeries.zoo Transforms a 'zoo' object into a 'timeSeries' # METHOD: TRANSFORM A TIMESERIES INTO OTHER OBJECTS: # as.vector.timeSeries Converts a univariate 'timeSeries' to a vector # as.matrix.timeSeries Converts a 'timeSeries' to a 'matrix' # as.numeric.timeSeries Converts a 'timeSeries' to a 'numeric' # as.data.frame.timeSeries Converts a 'timeSeries' to a 'data.frame' # as.ts.timeSeries Converts a 'timeSeries' to a 'ts' # as.ts.logical Converts a 'timeSeries' to 'logical' # as.list.timeSeries Converts a 'timeSeries' to 'list' ################################################################################ # YC: # here keep S3 methods because it should expect an oldClass object as argument # ------------------------------------------------------------------------------ as.timeSeries <- function(x, ...) { UseMethod("as.timeSeries") } # ------------------------------------------------------------------------------ as.timeSeries.default <- function(x, ...) { # A function implemented by Diethelm Wuertz and Yohan Chalabi # FUNCTION: # Return Value: ans <- timeSeries(x, ...) ans } setAs("ANY", "timeSeries", function(from) as.timeSeries(from)) # ------------------------------------------------------------------------------ as.timeSeries.ts <- function(x, ...) { asTime <- unclass(time(x)) yearPart <- trunc(asTime) decimalPart <- asTime - yearPart leapYears <- yearPart%%4 == 0 & (yearPart%%100 != 0 | yearPart%%400 == 0) days <- trunc(decimalPart * (365 + leapYears)) + 1 freq <- frequency(x) charvec <- if (freq == 4) { # Quarterly Data: days <- days + 1 ans <- timeDate(format(strptime(paste(yearPart, days), format = "%Y %j")), zone = "GMT", FinCenter = "GMT") timeLastDayInQuarter(ans) } else if (freq == 12) { # Monthly Data: days <- days + 1 ans <- timeDate(format(strptime(paste(yearPart, days), format = "%Y %j")), zone = "GMT", FinCenter = "GMT") timeLastDayInMonth(ans) } else { NA } # Result: tS = timeSeries(x, charvec, ...) attr(tS, "ts") <- c(start = round(start(x)), frequency = round(frequency(x)), deltat = deltat(x)) # Return Value: tS } setAs("ts", "timeSeries", function(from) as.timeSeries(from)) # ------------------------------------------------------------------------------ as.timeSeries.data.frame <- function(x, ...) { # A function implemented by Diethelm Wuertz and Yohan Chalabi # Description: # Converts a data.frame into a timeSeries object # Notes: # The first column must contain the dates. # Examples: # data(bmwRet); head(as.timeSeries(data(bmwRet))) # FUNCTION: if (all(!(num <- unlist(lapply(x, is.numeric))))) stop("x contains no numeric columns") # Check if rownames(x) or the first column has a valid ISO-format: if (num[1]) # is.numeric() is better than format == "unkown" # which can give wrong result. i.e. whichFormat(0.1253328600) suppressWarnings(charvec <- timeDate(rownames(x))) else suppressWarnings(charvec <- timeDate(as.vector(x[,1]))) data <- as.matrix(x[, num]) units <- names(x)[num] if (any(!(cl <- num[-1]))) { recordIDs <- as.data.frame(x[, !c(TRUE, cl)]) # do not take first column names(recordIDs) <- names(x)[!c(TRUE, cl)] } else { recordIDs <- data.frame() } # Create Time Series Object: timeSeries(data = data, charvec = charvec, units = units, recordIDs = recordIDs, ...) } setAs("data.frame", "timeSeries", function(from) as.timeSeries(from)) # ------------------------------------------------------------------------------ as.timeSeries.character <- function(x, ...) { # A function implemented by Diethelm Wuertz and Yohan Chalabi # Example: # as.timeSeries(data(nyse)) # FUNCTION: # Load Demo File - Returns a data frame: x <- eval(parse(text = eval(x))) # timeSeries: ans <- as.timeSeries(x, ...) # Return Value: ans } setAs("character", "timeSeries", function(from) as.timeSeries(from)) # ------------------------------------------------------------------------------ as.timeSeries.zoo <- function(x, ...) { # A function implemented by Diethelm Wuertz and Yohan Chalabi # FUNCTION: # as. timeSeries: ans <- timeSeries(data = as.matrix(x), charvec = as.character(attr(x, "index")), ...) # Return Value: ans } ################################################################################ # YC: # Since 2.9.0 must define proper S4 methods .as.matrix.timeSeries <- function(x, ...) { # A function implemented by Diethelm Wuertz # Description: # Converts a multivariate "timeSeries" to a matrix # Arguments: # x - a 'timeSeries' object # Value: # Returns the data slot of a 'timesSeries' object as a vector. # FUNCTION: # Check: if (!inherits(x, "timeSeries")) stop("x is not a timeSeries object!") # Convert: ans <- getDataPart(x) # is matrix dimnames(ans) <- dimnames(x) # Results ans } setMethod("as.matrix", "timeSeries", function(x, ...) .as.matrix.timeSeries(x, ...)) # until UseMethod dispatches S4 methods in 'base' functions as.matrix.timeSeries <- function(x, ...) .as.matrix.timeSeries(x, ...) setAs("timeSeries", "matrix", function(from) as.matrix(from)) # ------------------------------------------------------------------------------ .as.data.frame.timeSeries <- function(x, row.names = NULL, optional = FALSE, ...) { # A function implemented by Diethelm Wuertz # Description: # Converts a multivariate "timeSeries" to a data.frame # Arguments: # x - a 'timeSeries' object # row.names, optional - not used # Value: # Returns the data slot of a 'timesSeries' object as a data frame. # FUNCTION: # get rownames from timeSeries if (is.null(row.names)) row.names <- rownames(x) if (any(duplicated(row.names))) stop("cannot convert to data.frame with duplicate timestamps") ans <- if (!length(x@recordIDs)) data.frame(as.list(x), row.names = row.names, ...) else data.frame(as.list(x), x@recordIDs, row.names = row.names, ...) # Return Value: ans } setMethod("as.data.frame", "timeSeries", function(x, row.names = NULL, optional = FALSE, ...) .as.data.frame.timeSeries(x, row.names = row.names, optional = optional, ...)) # until UseMethod dispatches S4 methods in 'base' functions as.data.frame.timeSeries <- function(x, ...) .as.data.frame.timeSeries(x, ...) setAs("timeSeries", "data.frame", function(from) as.data.frame(from)) # ------------------------------------------------------------------------------ ## 2024-01-11 GNB: streamlined and removed the S4 method as.ts.timeSeries <- function(x, ...) { # A function implemented by Diethelm Wuertz # Description: # Converts a colum from a 'timeSeries' object into an object # of class 'ts'. # Example: # # x = dummyMonthlySeries(); as.ts(x) # # x = timeSeries(seq(12), timeSequence(by = "month", length.out = 12)) # as.ts(x) # # x = dummyMonthlySeries()[c(3,6,9,12),]; as.ts(x) # x = dummyMonthlySeries()[c(2,5,8,11),]; as.ts(x) # x = dummyMonthlySeries()[c(1,4,7,10),]; as.ts(x) # # x = dummyMonthlySeries()[c(4,7,10,1),]; as.ts(x) # Changes: # # FUNCTION: # check if monthly or quarterly data td <- time(x) m <- c(timeDate::months(td)) #-> c() to remove attributes # (m[1] -1) -> shift vector to match first entry in m monthly <- seq(from = m[1]-1, length.out=length(m)) %% 12 + 1 quarterly <- seq(from = m[1]-1, by = 3, length=length(m)) %% 12 + 1 # get year of first entry y1 <- as.numeric(format(td[1], "%Y")) # important to use vector/matrix to avoid troubles with ts() data <- if (isUnivariate(x)) as.vector(x) else matrix(x, ncol = ncol(x)) if (identical(monthly, m)) # Monthly data return(ts(data, start = c(y1, m[1]), frequency = 12)) if (identical(quarterly, m)) # Quarterly data return(ts(data, start = c(y1, m[1]%/%4+1), frequency = 4)) # other frequencies not implemented yet; return default value ans <- ts(data, names = colnames(x)) attr(ans, "positions") <- time(x) ans } setAs("timeSeries", "ts", function(from) as.ts(from)) ## GNB: 2024-01-11 GNB: streamlined and removed the S4 method ## setMethod("as.ts", "timeSeries", function(x, ...) .as.ts.timeSeries(x, ...)) ## ## # until UseMethod dispatches S4 methods in 'base' functions ## as.ts.timeSeries <- function(x, ...) .as.ts.timeSeries(x, ...) # ------------------------------------------------------------------------------ # YC: # Unneeded since timeSeries inherits from the structure class # as.logical.timeSeries <- function(x, ...) as.logical(series(x), ...) # ------------------------------------------------------------------------------ # YC: # Important for functions like lapply and sapply to work properly .as.list.timeSeries <- function(x, ...) { data <- getDataPart(x) ncols <- NCOL(data) value <- vector("list", ncols) for (i in seq.int(ncols)) value[[i]] <- as.vector(data[, i]) names(value) <- colnames(x) value } setMethod("as.list", "timeSeries", function(x, ...) .as.list.timeSeries(x, ...)) # until UseMethod dispatches S4 methods in 'base' functions as.list.timeSeries <- function(x, ...) .as.list.timeSeries(x, ...) setAs("timeSeries", "list", function(from) as.list(from)) ################################################################################ timeSeries/R/fin-runlengths.R0000755000176200001440000000422014263246022015654 0ustar liggesusers # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # A copy of the GNU General Public License is available at # ../../COPYING ################################################################################ # FUNCTION: DESCRIPTION: # runlengths Returns 'timeSeries' object of runlengths ################################################################################ runlengths <- function(x, ...) { # A function implemetned by Diethelm Wuertz # Description: # Returns 'timeSeries' object of runlengths # Arguments: # x - an univariate 'timeSeries' object of financial returns # ... - arguments passed to the function na.omit() # Value: # runlengths an object of class 'timeSeries'. # Note: # Zeroes are handled as NA. # Example: # set.seed(4711) # x.tS = timeSeries(data=rnorm(12), charvec=timeCalendar(), units="x") # runlengths(x.tS) # FUNCTION: # Check arguments: stopifnot(is.timeSeries(x)) stopifnot(isUnivariate(x)) # Extract Title and Documentation: Title <- x@title Documentation <- x@documentation # Handle Missing Values: x[x == 0] <- NA x.vec = sign(as.vector(na.omit(x, ...))) # Compute Run Lengths: n <- length(x.vec) y <- x.vec[-1L] != x.vec[-n] Index <- c(which(y | is.na(y)), n) X = x[Index, ] series(X) <- matrix(diff(c(0L, Index)), ncol = 1) # Reset recordIDs: X@recordIDs <- data.frame() # Preserve Title and Documentation: X@title <- Title X@documentation <- Documentation # Return Value: X } ################################################################################ timeSeries/R/statistics-smoothLowess.R0000755000176200001440000001507314263246022017617 0ustar liggesusers# # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # A copy of the GNU General Public License is available at # ../../COPYING ################################################################################ # FUNCTION: DESCRIPTION: # smoothSupsmu Smoothes a timeSeries with the supsmu function # smoothLowess Smoothes a timeSeries with the lowess function # smoothSpline Smoothes a timeSeries with the smooth.spline function # DEPRECATED: DESCRIPTION: # .supsmuSmoother Smoothes a timeSeries with the supsmu function # .lowessSmoother Smoothes a timeSeries with the lowess function # .splineSmoother Smoothes a timeSeries with the smooth.spline function ################################################################################ # DW: # These are older functions which have to be rewritten ... # The functions are thought to be used to smooth financial # price or index series. # ------------------------------------------------------------------------------ smoothSupsmu <- function(x, bass = 5, ...) { # A function implemented by Diethelm Wuertz # Description: # Smoothes a time series with the supsmu function # Arguments: # x - an univariate timeSeries object, e.g. a price or index series # bass - controls the smoothness of the fitted curve. Values of up # to 10 indicate increasing smoothness. # ... - further arguments passed to the function supsmu() # Example: # x <- smoothSupsmu(MSFT[, 4], bass = 0.1); x; plot(x) # FUNCTION: # Settings: stopifnot(isUnivariate(x)) # Extract Title and Documentation: Title <- x@title Documentation <- x@documentation # Handle Missing Values: x <- na.omit(x) # Convert to Vector: X <- x x <- as.vector(x) # Smooth: ans <- stats::supsmu(x = 1:length(x), y = x, bass = bass, ... ) data <- cbind(x, ans$y) colnames(data) <- c(colnames(X), "supsmu") rownames(data) <- as.character(time(X)) series(X) <- data # Preserve Title and Documentation: X@title <- Title X@documentation <- Documentation # Return Value: X } # ------------------------------------------------------------------------------ smoothLowess <- function(x, f = 0.5, ...) { # A function implemented by Diethelm Wuertz # Description: # Smoothes a time series with the lowess function # Arguments: # x - an univariate timeSeries object, e.g. a price or index series # f - the smoother span. This gives the proportion of points in the # plot which influence the smooth at each value. Larger values # give more smoothness. # ... - further arguments passed to the function lowess() # Example: # x = smoothLowess(MSFT[, 4], f = 0.05); x; plot(x) # FUNCTION: # Settings: stopifnot(isUnivariate(x)) # Extract Title and Documentation: Title <- x@title Documentation <- x@documentation # Handle Missing Values: x <- na.omit(x) # Convert to Vector: X <- x x <- as.vector(x) # Smooth: ans <- stats::lowess(x, f = f, ...)$y data <- cbind(x, ans) colnames(data) <- c(colnames(X), "lowess") rownames(data) <- as.character(time(X)) series(X) <- data # Preserve Title and Documentation: X@title <- Title X@documentation <- Documentation # Return Value: X } # ------------------------------------------------------------------------------ smoothSpline <- function(x, spar = NULL, ...) { # A function implemented by Diethelm Wuertz # Description: # Smoothes a time series with the smooth.spline function # Arguments: # x - an univariate timeSeries object, e.g. a price or index series # f - the smoother span. This gives the proportion of points in the # plot which influence the smooth at each value. Larger values # give more smoothness. # ... - further arguments passed to the function smooth.spline() # Details: # smooth.spline(x, y = NULL, w = NULL, df, spar = NULL, cv = FALSE, # all.knots = FALSE, nknots = NULL, keep.data = TRUE, df.offset = 0, # penalty = 1, control.spar = list()) # Example: # x = smoothSpline(MSFT[, 4], spar = NULL); x; plot(x) # x = smoothSpline(MSFT[, 4], spar = 0.4); x; plot(x) # FUNCTION: # Settings: stopifnot(isUnivariate(x)) # Extract Title and Documentation: Title <- x@title Documentation <- x@documentation # Handle Missing Values: x <- na.omit(x) # Convert to Vector: X <- x x <- as.vector(x) # Smooth: ans <- stats::smooth.spline(x, spar = spar, ...)$y data <- cbind(x, ans) colnames(data) <- c(colnames(X), "spline") rownames(data) <- as.character(time(X)) series(X) <- data # Preserve Title and Documentation: X@title <- Title X@documentation <- Documentation # Return Value: X } ################################################################################ .supsmuSmoother <- function(...) { # FUNCTION: # Deprecated: .Deprecated("smoothSupsmu") # Return Value: smoothSupsmu(...) } # ------------------------------------------------------------------------------ .lowessSmoother <- function(...) { # FUNCTION: # Deprecated: .Deprecated("smoothLowess") # Return Value: smoothLowess(...) } # ------------------------------------------------------------------------------ .splineSmoother <- function(...) { # FUNCTION: # Deprecated: .Deprecated("smoothSpline") # Return Value: smoothSpline(...) } ################################################################################ timeSeries/R/fin-daily.R0000755000176200001440000002014314263246022014567 0ustar liggesusers# # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # A copy of the GNU General Public License is available at # ../../COPYING ################################################################################ # FUNCTION: DESCRIPTION: # alignDailySeries Aligns a 'timeSeries' object to new positions # rollDailySeries Rolls daily a 'timeSeries' on a given period # OBSOLETE: DESCRIPTION: # .ohlcDailyPlot Plots open high low close bar chart # .plotOHLC Internal called by function ohlcDailyPlot() ################################################################################ alignDailySeries <- function (x, method = c("before", "after", "interp", "fillNA", "fmm", "periodic", "natural", "monoH.FC"), include.weekends = FALSE, units = NULL, zone = "", FinCenter = "", ...) { # A function implemented by Diethelm Wuertz and Yohan Chalabi # Description: # Aligns a 'timeSeries' object to new positions # Arguments: # x - an object of class "timeSeries". # method - # "before" - use the data from the row whose position is # just before the unmatched position; # "after" - use the data from the row whose position is # just after the unmatched position; # "linear" - interpolate linearly between "before" and # "after". # "fillNA" - fill missing days with NA values # include.weekends - a logical value. Should weekend dates be # included or removed? # Note: alignDailySeries is now based on align timeSeries method. # FUNCTION: # Preserve Title and Documentation: Title <- x@title Documentation <- x@documentation # Adjust zone and FinCenter if provided if (zone != "" || FinCenter != "") { if (zone == "") zone <- getRmetricsOptions("myFinCenter") if (FinCenter == "") FinCenter <- getRmetricsOptions("myFinCenter") x <- timeSeries(x, zone = zone, FinCenter = FinCenter) } # Run Generic Function align() ans <- .align.timeSeries(x = x, by = "1d", offset = "0s", method = method, include.weekends = include.weekends, ...) ans@title <- Title ans@documentation <- Documentation # Add New Units: if (!is.null(units)) colnames(ans) = units # Return Value: ans } # ------------------------------------------------------------------------------ rollDailySeries <- function(x, period = "7d", FUN, ...) { # A function implemented by Diethelm Wuertz # Description: # Rolls daily a 'timeSeries' on a given period # Arguments: # x - an univariate "timeSeries" object or a numeric vector. # n - an integer specifying the number of periods or # terms to use in each rolling/moving sample. # trim - a logical flag: if TRUE, the first n-1 missing values in # the returned object will be removed; if FALSE, they will # be saved in the returned object. The default is TRUE. # FUN - the rolling function, arguments to this function can be # passed through the \code{\dots} argument. # FUNCTION: # Check Arguments: stopifnot(is.timeSeries(x)) # Check for Signal Series: Message <- " is for time series and not for signal series." if (x@format == "counts") stop(as.character(match.call())[1], Message) # Preserve Title and Documentation: Title <- x@title Documentation <- x@documentation # Fix missing matrix method for quantile(), still to do ... .quantile.matrix = function(x, probs = 0.95, ...) { apply(as.matrix(x), 2, quantile, probs = probs) } # Settings: periodLength = as.numeric(substr(period, 1, nchar(period) - 1)) periodUnit = substr(period, nchar(period), nchar(period)) N = nrow(x) Start = start(x) + (periodLength-1)*24*3600 Positions = time(x) to = Positions[Positions > Start] from = to - periodLength*24*3600 # Apply Function: ans <- applySeries(x = x, from = from, to = to, FUN = FUN, ...) ans@title <- Title ans@documentation <- Documentation # Return Value: ans } ################################################################################ # OBSOLETE: .ohlcDailyPlot <- function(x, volume = TRUE, colOrder = c(1:5), units = 1e6, xlab = c("Date", "Date"), ylab = c("Price", "Volume"), main = c("O-H-L-C", "Volume"), grid.nx = 7, grid.lty = "solid", ...) { # A function implemented by Diethelm Wuertz # Description: # Plots open | high | low | close bar chart # Arguments: # x - an S4 object of class 'timeSeries' with named entries: # Open, High, Low, Close, and Volume # Reference: # Build on top of Adrian Trapletti's plotOHLC() # function from his R-package "tseries". # FUNCTION: stopifnot(is.timeSeries(x)) if (x@format == "counts") stop(as.character(match.call())[1], " is for time series and not for signal series.") # Next: x.filled = alignDailySeries(x, method = "fillNA", include.weekends = TRUE) jul = as.integer(julian(time(x.filled))) X = ts(as.matrix(x.filled)[, 1:4], start = min(jul), end = max(jul)) # Plot OHLC: .plotOHLC(X, origin = "1970-01-01", xlab = xlab[1], ylab = ylab[1]) # print(axTicks(1)) # print(axTicks(2)) title(main = main[1]) grid(nx = grid.nx, ny = NULL, lty = grid.lty, ...) # Include Volume? if (volume) { Volume = x[, 5]/units plot(Volume, type = "h", xlab = xlab[2], ylab = ylab[2]) title(main = main[2]) grid(nx = grid.nx, ny = NULL, lty = grid.lty, ...) } # Return value: invisible() } # ------------------------------------------------------------------------------ .plotOHLC = function (x, xlim = NULL, ylim = NULL, xlab = "Time", ylab, col = par("col"), bg = par("bg"), axes = TRUE, frame.plot = axes, ann = par("ann"), main = NULL, date = c("calendar", "julian"), format = "%Y-%m-%d", origin = "1899-12-30", ...) { # A Copy from Contributed R Package 'tseries' # Description: # Internal called by function .ohlcDailyPlot() # FUNCTION: # Check for mts: if ((!is.mts(x)) || (colnames(x)[1] != "Open") || (colnames(x)[2] != "High") || (colnames(x)[3] != "Low") || (colnames(x)[4] != "Close")) stop("x is not a open/high/low/close time series") xlabel <- if (!missing(x)) deparse(substitute(x)) else NULL if (missing(ylab)) ylab <- xlabel date <- match.arg(date) time.x <- time(x) dt <- min(lag(time.x) - time.x)/3 if (is.null(xlim)) xlim <- range(time.x) if (is.null(ylim)) ylim <- range(x[is.finite(x)]) plot.new() plot.window(xlim, ylim, ...) segments(time.x, x[, "High"], time.x, x[, "Low"], col = col[1], bg = bg) segments(time.x - dt, x[, "Open"], time.x, x[, "Open"], col = col[1], bg = bg) segments(time.x, x[, "Close"], time.x + dt, x[, "Close"], col = col[1], bg = bg) if (ann) title(main = main, xlab = xlab, ylab = ylab, ...) if (axes) { if (date == "julian") { axis(1, ...) axis(2, ...) } else { n <- NROW(x) lab.ind <- round(seq(1, n, length = 5)) D <- as.vector(time.x[lab.ind] * 86400) + as.POSIXct(origin, tz = "GMT") DD <- format.POSIXct(D, format = format, tz = "GMT") axis(1, at = time.x[lab.ind], labels = DD, ...) axis(2, ...) } } if (frame.plot) box(...) # Return Value: invisible() } ################################################################################ timeSeries/R/fin-wealth.R0000755000176200001440000000237214263246022014755 0ustar liggesusers# # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # A copy of the GNU General Public License is available at # ../../COPYING ############################################################################### # FUNCTION: DESCRIPTION: # index2wealth Converts an index to a wealth series ############################################################################### index2wealth <- function(x) { # A function implemented by Diethelm Wuertz # Description: # Converts an index to a wealth series # FUNCTION: # x - index time series to be converted # FUNCTION: # Wealth Initialization: for (i in 1:ncol(x)) x[, i] <- x[, i]/as.vector(x[1, i]) # Return Value: x } ############################################################################### timeSeries/R/fin-monthly.R0000755000176200001440000001316514263246022015165 0ustar liggesusers# # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # A copy of the GNU General Public License is available at # ../../COPYING ################################################################################ # FUNCTION: FOR MONTHLY OPERATIONS: # countMonthlyRecords Returns a series with monthly counts of records # rollMonthlyWindows Returns start/end dates for rolling time windows # rollMonthlySeries Rolls Monthly a 'timeSeries' on a given period ################################################################################ # DW: # I think we should call these functions: # countRecordsMonthly, rollWindowsMonthly, rollSeriesMonthly, ... # ------------------------------------------------------------------------------ countMonthlyRecords <- function(x) { # A function implemented by Diethelm Wuertz and Yohan Chalabi # Description: # Returns a series with monthly counts of records # Example: # x = as.timeSeries(data(msft.dat)); countMonthlyRecords(x) # x = as.timeSeries(data(edhec)); countMonthlyRecords(x) # FUNCTION: # Check Arguments: stopifnot(is.timeSeries(x)) # Extract Title and Documentation: Title <- x@title Documentation <- x@documentation # Check for Signal Series: if (x@format == "counts") stop(as.character(match.call())[1], " is for time series and not for signal series.") # Count: ans <- rollMonthlySeries(x[, 1], period = "1m", by = "1m", FUN = NROW) colnames(ans) <- "Counts" # Preserve Title and Documentation: ans@title <- Title ans@documentation <- Documentation # Return Value: ans } # ------------------------------------------------------------------------------ rollMonthlyWindows <- function(x, period = "12m", by = "1m") { # A function implemented by Diethelm Wuertz and Yohan Chalabi # Description: # Returns start and end dates for rolling time windows # Arguments: # x - a 'timeSerie's object of asset returns # period - a character string denoting the length of the rolling # window, e.g. "24m" means 24 months # by - a character string denoting the shift of the rolling window, # e.g. "3m" means one quarter # FUNCTION: # Check Arguments: stopifnot(is.timeSeries(x)) # Extract Title and Documentation: Title <- x@title Documentation <- x@documentation # Check for Signal Series: if (x@format == "counts") stop(as.character(match.call())[1], " is for time series and not for signal series.") # Get Window Parameter: periodLength <- as.numeric(substr(period, 1, nchar(period)-1)) periodUnit <- substr(period, nchar(period), nchar(period)) byLength <- as.numeric(substr(by, 1, nchar(by)-1)) byUnit <- substr(by, nchar(by), nchar(by)) stopifnot(periodUnit == "m") stopifnot(byUnit == "m") # Get Window Parameter: periodLength <- as.numeric(substr(period, 1, nchar(period)-1)) periodUnit <- substr(period, nchar(period), nchar(period)) byLength <- as.numeric(substr(by, 1, nchar(by)-1)) byUnit <- substr(by, nchar(by), nchar(by)) stopifnot(periodUnit == "m") stopifnot(byUnit == "m") # Make Windows - We expect monthly data records ... positions <- time(x) Positions <- unique(timeFirstDayInMonth(positions)) numberOfPositions <- length(Positions) startDates <- Positions[1:(numberOfPositions-periodLength)] endDates <- Positions[(periodLength+1):numberOfPositions]-24*3600 # Windows: windows <- list(from = startDates, to = endDates) attr(windows, "control") = c(start = start(positions), end = end(positions)) # Return Value: windows } # ------------------------------------------------------------------------------ rollMonthlySeries <- function(x, period = "12m", by = "1m", FUN, ...) { # A function implemented by Diethelm Wuertz and Yohan Chalabi # Description: # Rolls monthly a 'timeSeries' on a given period # Arguments: # x - a 'timeSerie's object of asset returns # period - a character string denoting the length of the rolling # window, e.g. "24m" means 24 months # by - a character string denoting the shift of the rolling window, # e.g. "3m" means one quarter # FUN - function to be applied # FUNCTION: # Check Arguments: stopifnot(is.timeSeries(x)) # Extract Title and Documentation: Title <- x@title Documentation <- x@documentation # Check for Signal Series: stopifnot(is(x, "timeSeries")) if (x@format == "counts") stop(as.character(match.call())[1], " is for time series and not for signal series.") # Settings: windows <- rollMonthlyWindows(x = x[, 1], period = period, by = by) # Apply Function: ans <- applySeries(x = x, from = windows$from, to = windows$to, FUN = FUN, ...) # Preserve Title and Documentation: ans@title <- Title ans@documentation <- Documentation # Return Value: ans } ################################################################################ timeSeries/R/fin-spreads.R0000755000176200001440000000513414263246022015131 0ustar liggesusers# # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # A copy of the GNU General Public License is available at # ../../COPYING ################################################################################ # FUNCTION: DESCRIPTION: # spreads Computes spreads from a 'timeSeries' object # midquotes Computes mid quotes from a 'timeSeries' object ################################################################################ # DW: # Setting bid and ask for column names is maybe the best choice. Examples # are the TED spread or the Libo OIS spread. The spread between High and Low # is the range. # ------------------------------------------------------------------------------ spreads <- function(x, which = c("Bid", "Ask"), tickSize = NULL) { # A function implemented by Diethelm Wuertz # Description: # Computes spreads from a 'timeSeries' object # FUNCTION: # Check arguments: stopifnot(is.timeSeries(x)) # Extract Title and Documentation: Title <- x@title Documentation <- x@documentation # Compute Spread: spread <- x[, which[2]] - x[, which[1]] if (!is.null(tickSize)) series(spread) <- round(series(spread)/tickSize) # Preserve Title and Documentation: spread@title <- Title spread@documentation <- Documentation # Return Value: spread } # ------------------------------------------------------------------------------ midquotes = function(x, which = c("Bid", "Ask")) { # A function implemented by Diethelm Wuertz # Description: # Computes mid quotes from a 'timeSeries' object # FUNCTION: # Check arguments: stopifnot(is.timeSeries(x)) # Extract Title and Documentation: Title <- x@title Documentation <- x@documentation # Compute Mid Quotes: midquotes = 0.5 * ( x[, which[1]] + x[, which[2]] ) # Preserve Title and Documentation: midquotes@title <- Title midquotes@documentation <- Documentation # Return Value: midquotes } ################################################################################ timeSeries/R/aaa-utils.R0000755000176200001440000000135114263246022014573 0ustar liggesusers## Copyright (C) 2020 Martin Maechler ## ## This program is free software; you can redistribute it and/or modify ## it under the terms of the GNU General Public License as published by ## the Free Software Foundation; either version 2 of the License, or ## (at your option) any later version. ## ## This program is distributed in the hope that it will be useful, ## but WITHOUT ANY WARRANTY; without even the implied warranty of ## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ## GNU General Public License for more details. ## ## A copy of the GNU General Public License is available at ## https://www.R-project.org/Licenses/ ## Not my idea .. but really nice : `%||%` <- function (L, R) if (is.null(L)) R else L timeSeries/R/stats-model.frame.R0000755000176200001440000000670514263246022016250 0ustar liggesusers# # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # A copy of the GNU General Public License is available at # ../../COPYING ################################################################################ # FUNCTION: DESCRIPTION: # model.frame.default Allows to use model.frame for "timeSeries" ################################################################################ # YC : remove model.frame because more problems than benefits. Rely on # default model.frame as long as as.data.frame.timeSeries works in # 'base' function model.frame.default ## setMethod("model.frame.default", signature(data = "timeSeries"), ## function(formula, data = NULL, ## subset = NULL, na.action = na.fail, ## drop.unused.levels = FALSE, xlev = NULL, ...) ## { ## # A function implemented by Diethelm Wuertz ## # Description: ## # Extracting the Environment of a Model Formula ## # Arguments: ## # formula - a model formula ## # data - a 'timeSeries' object ## # Details: ## # Allows to use model.frame() for "timeSeries" objects. ## # Examples: ## # x = as.timeSeries(data(msft.dat))[1:12, ] ## # model.frame( ~ High + Low, data = x) ## # model.frame(Open ~ High + log(Low), data = x) ## # FUNCTION: ## data <- as(data, "data.frame") ## ### model.frame.default(formula, data, ## ### subset, na.action, ## ### drop.unused.levels, ## ### xlev, ...) ## model.frame(formula, data, ...) ## }) ## ## ### # Create Model Frame: ## ## ### format <- data@format ## ## ### FinCenter <- finCenter(data) ## ## ### recordIDs <- data@recordIDs ## ## ### title <- data@title ## ## data <- as(data, "data.frame") ## ## Model <- model.frame(formula, data, ...) ## ## #-> should be in parent.frame? ## ## ### recordIDs <- ## ## ### if (NROW(Model) == NROW(recordIDs)) ## ## ### recordIDs ## ## ### else ## ## ### data.frame() ## ## ### # Convert to timeSeries: ## ## ### ans <- timeSeries(data = as.matrix(Model), ## ## ### charvec = rownames(Model), ## ## ### units = colnames(Model), ## ## ### format = format, ## ## ### FinCenter = FinCenter, ## ## ### recordIDs = recordIDs, ## ## ### title = title, ## ## ### documentation = description() ## ## ### ) ## ## ### # Return value: ## ## ### ans ## ## Model ## ## }) ################################################################################ timeSeries/R/base-attach.R0000755000176200001440000000265614263246022015100 0ustar liggesusers# # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # A copy of the GNU General Public License is available at # ../../COPYING ################################################################################ # S4 METHOD: DATABASE ATTACHEMENT: # attach,timeSeries Attaches a 'timeSeries' object to the search path ################################################################################ setMethod("attach", "timeSeries", function(what, pos = 2, name = deparse(substitute(what)), warn.conflicts = TRUE) { # A function implemented by Diethelm Wuertz and Yohan Chalabi # Description: # Attaches a 'timeSeries' object # Details: # The function works in the same way as in the case of a # data.frame, i.e. the return values are vectors. # FUNCTION: # Return Value: callGeneric(as.data.frame(what), pos, name, warn.conflicts) }) ################################################################################ timeSeries/R/AllGeneric.R0000755000176200001440000000666614434360630014740 0ustar liggesusers# # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # A copy of the GNU General Public License is available at # ../../COPYING ################################################################################ # GENERIC: DESCRIPTION # returns Computes returns # rowCumsums Computes row cumulated sums # series Extracts series data # series<- Assigns series data # coredata Extracts series data # index deprecated # index <- deprecated # outlier Returns outliers # timeSeries Returns timeSeries # colCumsums Computes column cumulated sums # colCummaxs Computes column cumulated maxima # colCummins Computes column cumulated minima # colCumprods Computes column cumulated products # colCumreturns Computes column cumulated returns ################################################################################ setGeneric("returns", function(x, ...) standardGeneric("returns"), package = "timeSeries") setGeneric("rowCumsums", function(x, na.rm = FALSE, ...) standardGeneric("rowCumsums"), package = "timeSeries") setGeneric("series", function(x) standardGeneric("series"), package = "timeSeries") setGeneric("series<-", function(x, value) standardGeneric("series<-"), package = "timeSeries") ## 2023-05-27 GNB: making non-generic, see comments in timeSeries-slotSeries.R ## ## setGeneric("coredata", ## function(x) ## standardGeneric("coredata"), package = "timeSeries") setGeneric("coredata<-", function(x, value) standardGeneric("coredata<-"), package = "timeSeries") ## setGeneric("index", function(x, ...) ## standardGeneric("index"), package = "timeSeries") ## setGeneric("index<-", function(x, value) ## standardGeneric("index<-"), package = "timeSeries") setGeneric("outlier", function(x, sd = 5, complement = TRUE, ...) standardGeneric("outlier")) setGeneric("timeSeries", function (data, charvec, units = NULL, format = NULL, zone = "", FinCenter = "", recordIDs = data.frame(), title = NULL, documentation = NULL, ...) standardGeneric("timeSeries")) setGeneric("colCumsums", function(x, na.rm = FALSE, ...) standardGeneric("colCumsums")) setGeneric("colCummaxs", function(x, na.rm = FALSE, ...) standardGeneric("colCummaxs")) setGeneric("colCummins", function(x, na.rm = FALSE, ...) standardGeneric("colCummins")) setGeneric("colCumprods", function(x, na.rm = FALSE, ...) standardGeneric("colCumprods")) setGeneric("colCumreturns", function(x, method = c("geometric", "simple"), na.rm = FALSE, ...) standardGeneric("colCumreturns")) ################################################################################ timeSeries/R/timeSeries-isRegular.R0000644000176200001440000000353314547754710016775 0ustar liggesusers # This R package is free software; you can redistribute it and/or # modify it under the terms of the GNU Library General Public # License as published by the Free Software Foundation; either # version 2 of the License, or (at your option) any later version. # # This R package is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU Library General Public License for more details. # # You should have received a copy of the GNU Library General # Public License along with this R package; if not, write to the # Free Foundation, Inc., 59 Temple Place, Suite 330, Boston, # MA 02111-1307 USA ################################################################################ # FUNCTION: DESCRIPTION: # isDaily,timeSeries-method Tests if a time series is a daily series # isMonthly,timeSeries-method Tests if a time series is a monthly series # isQuarterly,timeSeries-method Tests if a time series is a quarterly series # isRegular,timeSeries-method Tests if a time series is a regular series # frequency,timeSeries-method Returns the frequency of a regular time series ################################################################################ setMethod("isDaily", "timeSeries", function(x) callGeneric(time(x))) setMethod("isQuarterly", "timeSeries", function(x) callGeneric(time(x))) setMethod("isMonthly", "timeSeries", function(x) callGeneric(time(x))) setMethod("isRegular", "timeSeries", function(x) callGeneric(time(x))) ## GNB: made the method S3 ## setMethod("frequency", "timeSeries", function(x, ...) callGeneric(time(x), ...)) frequency.timeSeries <- function(x, ...) { frequency(time(x), ...) } ################################################################################ timeSeries/R/base-scale.R0000755000176200001440000000312614321371041014707 0ustar liggesusers# # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # A copy of the GNU General Public License is available at # ../../COPYING ################################################################################ # FUNCTION: DESCRIPTION: # scale,timeSeries Centers and/or scales a 'timeSeries' object ################################################################################ scale.timeSeries <- function(x, center = TRUE, scale = TRUE) { # A function implemented by Diethelm Wuertz and Yohan Chalabi # Description: # Centers and/or scales a 'timeSeries' object. # Arguments: # FUNCTION: # Scale: setDataPart(x, scale(x = getDataPart(x), center = center, scale = scale)) } setMethod("scale", "timeSeries", function(x, center = TRUE, scale = TRUE) scale.timeSeries(x, center = center, scale = scale)) ## # until UseMethod dispatches S4 methods in 'base' functions ## scale.timeSeries <- function (x, center = TRUE, scale = TRUE) ## .scale.timeSeries(x, center = center, scale = scale) ################################################################################ timeSeries/R/methods-show.R0000644000176200001440000001175214546210602015336 0ustar liggesusers# # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # A copy of the GNU General Public License is available at # ../../COPYING ################################################################################ # FUNCTION: DESCRIPTION: # show,timeSeries Prints a 'timeSeries' object # print,timeSeries Prints a 'timeSeries' object # .print.timeSeries Called by function print,timeSeries ################################################################################ setMethod("show", "timeSeries", function(object) { # A function implemented by Diethelm Wuertz and Yohan Chalabi # Description: # Print method for an S4 object of class "timeSeries" # FUNCTION: # Check records to get printed: maxRmetrics <- as.numeric(getRmetricsOptions("max.print")) maxR <- as.numeric(getOption("max.print")) maxR <- floor(maxR / (NCOL(object) + NCOL(object@recordIDs))) max <- min(na.omit(c(maxRmetrics, maxR, Inf))) #-> Inf to cast case when maxRmetrics and maxR are NULL if (ptest <- ((omitted <- NROW(object) - max) > 0)) object <- object[seq.int(max),] data <- as(object, "matrix") recordIDs <- object@recordIDs FinCenter <- finCenter(object) # Series: cat(FinCenter, "\n", sep = "") if (prod(dim(recordIDs)) & (nrow(data) == NROW(recordIDs))) { dataIDs <- as.matrix(recordIDs) colnames(dataIDs) <- paste(colnames(dataIDs), "*", sep = "") #-> use format(data) to have same number of digits when timeSeries # is printed without @recordIDs print(cbind(format(data), dataIDs), quote = FALSE, right = TRUE) } else { print(data, quote = FALSE) #-> to be consistent with @recordIDs print } # print message if (ptest) cat(gettextf("...\n [ reached getRmetricsOption('max.print') | getOption('max.print') -- omitted %i rows ]]\n", omitted)) # Return Value: invisible(NULL) # as specified in ?show } ) # ------------------------------------------------------------------------------ ## GNB: streamlined somewhat the calls and removed the S4 method print.timeSeries <- function(x, FinCenter = NULL, format = NULL, style = c("tS", "h", "ts"), by = c("month", "quarter"), ...) { # A function implemented by Diethelm Wuertz and Yohan Chalabi # Description: # Allows for horizontal and ts like print output. # Arguments: # x - an object of class timeSeries # FinCenter - print with time stamps according to FinCenter # format - use specified format for printing # style - a character value specifying how to print: # "tS" Rmetrics' default vertical print style # "h" horizontal print style, # "ts" R's base style for regular time series # by - specifies the period for a regular time serie, # note only active for style="ts". # Example: # x = timeSeries(); print(x, format = "%d %b %Y"); x # FUNCTION: # Change Financial Center: if (!is.null(FinCenter)) finCenter(x) <- FinCenter # Match Arguments: style = match.arg(style) by = match.arg(by) # Change Format: if (is.null(format)) { charvec = rownames(x) } else { ans = timeDate(charvec = rownames(x), zone = "GMT", FinCenter = finCenter(x)) if (format == "%Q") { Quarters = rep(paste("Q", 1:4, sep = ""), each = 3) Y = atoms(ans)[, 1] Q = Quarters[atoms(ans)[, 2]] charvec = paste(Y, Q) } else { charvec = format(ans, format) } } # Styles: if (style == "tS") { cat(finCenter(x), "\n") X <- getDataPart(x) rownames(X) = charvec print(X, ...) } else if (style == "h") { stopifnot(isUnivariate(x)) # print(as.vector(x)) ans = as.matrix(x)[,1] names(ans) = charvec print(ans, ...) } else if (style == "ts") { freq = c(month = 12, quarter = 4) start(x) start = unlist(atoms(start(x))) end = unlist(atoms(end(x))) ts = ts(as.vector(x), start[1:2], end[1:2], freq[by]) print(ts, ...) } # Return Value: invisible(x) } # ------------------------------------------------------------------------------ ## setMethod("print", "timeSeries", ## .print.timeSeries) ################################################################################ timeSeries/R/base-summary.R0000644000176200001440000000604514437130426015325 0ustar liggesusers# # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # A copy of the GNU General Public License is available at # ../../COPYING ## Author: Georgi N. Boshnakov ## setMethod("summary", c(object = "timeSeries"), ## function(object, alwaysNA = TRUE, ...){ ## start = as.character(start(object)) ## end = as.character(end(object)) ## ## ## stats <- cbind( ## ## "Min." = colMins(object), ## ## "1st Qu." = colQuantiles(object, prob = 0.25, type = 1), ## ## "Median" = colQuantiles(object, prob = 0.50, type = 1), ## ## "3rd Qu." = colQuantiles(object, prob = 0.75, type = 1), ## ## "Max." = colMaxs(object) ## ## ## , check.names = FALSE ## ## ) ## ## stats <- summary(as.matrix(object)) ## ## attr(stats, "start") <- start ## attr(stats, "end") <- end ## attr(stats, "nobs") <- nrow(object) ## attr(stats, "Format") <- object@format ## attr(stats, "FinCenter") <- object@FinCenter ## ## class(stats) <- c("timeSeries_summary", class("stats")) ## stats ## }) summary.timeSeries <- function(object, ...) { ## stats <- cbind( ## "Min." = colMins(object), ## "1st Qu." = colQuantiles(object, prob = 0.25, type = 1), ## "Median" = colQuantiles(object, prob = 0.50, type = 1), ## "3rd Qu." = colQuantiles(object, prob = 0.75, type = 1), ## "Max." = colMaxs(object) ## ## , check.names = FALSE ## ) stats <- summary(as.matrix(object)) attr(stats, "start") <- as.character(start(object)) attr(stats, "end") <- as.character(end(object)) attr(stats, "nobs") <- nrow(object) attr(stats, "Format") <- object@format attr(stats, "FinCenter") <- object@FinCenter class(stats) <- c("timeSeries_summary", class("stats")) stats } print.timeSeries_summary <- function(x, quote = FALSE, ...) { cat("Start Record:", attr(x, "start") , "\n") cat("End Record: ", attr(x, "end") , "\n") cat("Observations:", attr(x, "nobs") , "\n") cat("Format: ", attr(x, "Format") , "\n") cat("FinCenter: ", attr(x, "FinCenter"), "\n") cat("\n") class(x) <- class(x)[-1] attr(x, "start") <- attr(x, "end") <- attr(x, "nobs") <- attr(x, "Format") <- attr(x, "FinCenter") <- NULL print(x, quote = quote, ...) invisible(x) } timeSeries/NEWS.md0000644000176200001440000001660314550512461013472 0ustar liggesusers## timeSeries 4032.109 - deprecated function `returnSeries` is now defunct, use `returns` instead. - a number of generic functions from base R now get only S3 methods for 'timeSeries' objects. Previously they were turned into S4 generics with S4 methods. - streamlined timeSeries methods for a number of functions. Left only S3 methods or only S4 methods were suitable. - consolidated the NAMESPACE. ## timeSeries 4032.108 - fixed 'Lost braces; missing escapes or markup?' NOTE from CRAN. ## timeSeries 4031.107 - refactored the 'timeSeries' methods for `head` and `tail`. - fixed a bug in the 'timeSeries' method for `stats::na.contiguous`, which caused the wrong stretch to be returned in the case of tied longest stretches one of whom starts at the beginning of the series. Similar bug was present in `stats::na.contiguous.default`, see my bug report to R-devel from 2023-06-02 and the discussion there (https://stat.ethz.ch/pipermail/r-devel/2023-June/082642.html) - removed deprecated functions `spreadSeries`, `midquoteSeries`, and `durationSeries`. Use `spreads`, `midquotes`, and `durations`, respectively. - removed deprecated function `colStdevs`, use `colSds()` instead. - removed deprecated function `.description`, use `description()` instead. - removed deprecated 'timeSeries' method for function `cut()`, use `window()` instead. The method was not compatible with the generic function `cut()`. Now applying `cut(x)` on a 'timeSeries' object `x` will work on the underlying time series data. - replaced the S4 methods for `zoo::coredata` and `zoo::'coredata<-'`. The ones for `zoo::'coredata<-'` were not working at all, since `zoo::'coredata<-'` is an S3 generic and the methods dispatch on two arguments. It is also a mistery why the methods for the unexported S4 generics in 'timeSeries' were associated with the corresponding 'zoo' generics. If `zoo` is not attached, the calls need to be prefixed with `zoo::` or, alternatively, since the new methods are exported, they can be called directly as `coredata.timeSeries()` and ``coredata.'timeSeries<-'() <- value`. - added a default method for `time<-` to improve its interaction with 'zoo'. - added 'zoo' to 'Suggests:'. - removed the deprecated `dummySeries`, use `dummyMonthlySeries` instead. - added argument `FUN` to the `timeSeries` method for `na.omit` to allow it to compute replacement values using functions, such as `mean`, `median`, or user defined. - formally deprecated `removeNA`, `interpNA`, and `substituteNA`. These had been informally deprecated in the documentation for a long time. - the help page for `orderStatistics` erroneously claimed that the input should be an univariate `timeSeries` object, while it is explicitly written to cover the multivariate case. - moved package 'methods' back to 'Depends' to avoid subtle problems when 'methods' is loaded but not attached. For example, it seems that 'Math' methods for 'structure' are not seen for `cummin` and other `cumXXX` functions, when called on time series objects (the other math functions work ok). - `cumsum`, `cumprod`, `cummin`, and `cummax` now work on the columns of the 'timeSeries' object and keep its class and other attributes. This is a breaking change since previously the return value was numeric vector, the result of applying the base R functions to the data part of the object. This was not particularly useful, especilly for multivariate time series. With this change all functions from the S4 `Math` group return 'timeSeries' when their argument is 'timeSeries' object. - stopped exporting some internal functions that were accidentally used by other packages (after those packages were updated on CRAN). - Numerous improvements to the documentation and further changes in the code. ## timeSeries 4030.106 - removed UTF8 characters from NAMESPACE (fixes CRAN warning to that effect). ## timeSeries 4021.105 - updated and significantly improved the documentation. - class `timeSeries` now has a dedicated summary method. Previously it was falling back to the method for matrices. - `colCumsums`, `colCummaxs`, `colCummins`, and `colCumprods` no longer throw error for `timeSeries` objects when called with `na.rm = TRUE`. Fixes bug #2121 reported by Shane Haas. - corrected USDCHF dataset. The year information was wrong (the data started from year 8295). The bug had been introduced in version 2100.84 when the dataset file was converted from a `usdchf.csv` to `USDCHF.rda`. `USDCHF@documentation` contains a short note about this change. Also changed the FinCenter to Zurich (neither the documentation nor the csv file contain FinCenter information). - the original source file `msft.dat.csv` of the `MSFT` data is included now as `inst/extdata/msft.csv` (note the different name). The file had been removed in v2100.84. Note that there is a file ``msft.dat.csv` in `test/` but it is a modified and abbreviated version of the original file. - `dummySeries` has been renamed to the more expressive `dummyMonthlySeries`. The old name is still available but is deprecated. - The functions `returnSeries` and `getReturns` are no longer exported and will be removed in the near future. They are synonyms for the function `returns` and their use was discouraged for many years. Just use `returns`. - function `cut` is now formally deprecated. Use `window` instead. - deprecated function `seriesData` is now defunct. Use `as.matrix()` instead. - deprecated function `seriesPositions` is now defunct. Use `time()` instead. - deprecated function `newPositions<-` is now defunct. Use `time<-` instead. - deprecated function `colAvgs` is now defunct. Use `colMeans()` instead. - deprecated function `colStdevs` is now defunct. Use `colSds()` instead. ### Technical changes - stopped exporting (almost) all functions whose names start with a '.'. Historically, the package was exporting all functions, including those start with a '.'. This should be of no concern for users since these functions were not documented but the developers of some Rmetrics packages where using such functions. - the additional arguments of the S3 `timeSeries` method for `diff()` are now in its signature, which previously was `diff(x, ...)`. An intermediate function, `.diff.timeSeries`, was eliminated in the process. - the bodies of the methods of `series<-()` and `coredata<-` for signature `"matrix"` of value were identical. Now the body is a separate, unexported function, which is used as the definition of both of these methods. - eliminated `.merge.timeSeries` and other redundancy in the implementation of the `c("timeSeries", "timeSeries")` method. - eliminated `.rev.timeSeries` in the definition of the `rev` method. - eliminated `.scale.timeSeries` in the definition of the `scale` timeSeries method. - same as above for `.sort.timeSeries`. - eliminated `.start.timeSeries`and redundancy in the implementation of the `timeSeries` method. - eliminated `.end.timeSeries`and redundancy in the implementation of the `timeSeries` method. - the function `.applySeries` is now defunct. It was obsoleted long time ago and was exported for historical reasons only. Use `applySeries()` instead. ## timeSeries 4021.104 - new maintainer: Georgi Boshnakov. - moved package `methods` to `Imports`. - fixed CRAN NOTE `Escaped LaTeX specials: \_ \_` in `methods-plot.Rd`. ## timeSeries 3062.100 and older See file `ChangeLog`. timeSeries/MD50000644000176200001440000002754514551002402012701 0ustar liggesusers655dcc268ec612659050ace08950239c *ChangeLog 0ae06c220aa0ab34ae4e32815e446a6a *DESCRIPTION d7bc50ff82487e41a270da9c12096ccc *NAMESPACE c784aaf52ae91c2b68b286528e831185 *NEWS.md 7417a25041ce9a1531aa2dd338eba8fe *R/AllClass.R d3edf10575203354ea8dd35002dfc85d *R/AllGeneric.R 265850ce81bf120965f0fbff81a08847 *R/aaa-Deprecated.R 7f05b9160586788d7769cd477f37bbb7 *R/aaa-utils.R 92bdf85ad88e5dad33f2eb41f7f9e703 *R/base-apply.R 1ca0af4dd866f63058a2f835b2530eef *R/base-applySeries.R 968c421f42d0ceb9992dda28dbb92d2c *R/base-attach.R f2b2adb80b6b8ababb256f876dad2ead *R/base-cbind.R a8c557a596bce446e5c4449e9b6e6ed4 *R/base-diff.R a46fc4895fb6f5d27d1c6d928cf6ea31 *R/base-dim.R 7fe6efc4ba24fef61e45daedcabffdbc *R/base-merge.R 6ed798fb2f8a96ddca7221d2efc6d377 *R/base-rank.R d8a2ce279f26687ddf562c5db75ad91b *R/base-rev.R a4ab768410837ac64ea14dab3f463fe7 *R/base-sample.R 20ea1c4cc89a27463aef3bbfa66e4487 *R/base-scale.R b0f09d7acd1a7d27e0d2f5cd428836eb *R/base-sort.R 31105a6dc2b3455ea62cbf03d8dadc18 *R/base-start.R 8e547ccf563a5134f438b299514b718c *R/base-subsetting.R c36e64e19fc7cf9c0cf8beeb2ec7aff2 *R/base-summary.R 787d5636b21ee586692fa57b10271810 *R/base-t.R e38b8155ba182239b14be153ac03f1f7 *R/fin-align.R 35a05ba21a2743468d78e824f64786f0 *R/fin-cumulated.R ee0188b9b207406a9870a19331cfeece *R/fin-daily.R 7927233d883f79c8d7d40930fe6ef2f9 *R/fin-drawdowns.R 29283f111ed012385b7f23844bc9a1b3 *R/fin-durations.R 5d06a2c8bc2f9a895fad418b8705976c *R/fin-monthly.R adefaa5d26ecebe033cdda94cfbcd881 *R/fin-periodical.R 1f85e125241cb2c6a724cb979bd1d38f *R/fin-returns.R f2dc2572b00b06518008493859833ed3 *R/fin-runlengths.R 5d37cb40e1478469171d33d825395b2e *R/fin-splits.R 2aefc803b5781c629297e053a4e8a791 *R/fin-spreads.R 5dc45f885c86a7205b8d9ebaa8cf7038 *R/fin-turnpoints.R 71580b37ec7a5f795a8fc6aeaa55d4f4 *R/fin-wealth.R d323ff3c3c55941073c83c995e675512 *R/methods-as.R 58f5a50dfbf8669c239615e1ccdbf58f *R/methods-comment.R 62c43cc67894dbf23483cbfef6396564 *R/methods-is.R 8524c024939ea1297173fc1cbfbb5a1a *R/methods-mathOps.R 3cd57facd28eb9bcc970ddd0e1a16ba7 *R/methods-plot.R ff8a9deb554937cf44e6b7738e887cd7 *R/methods-plot2.R 94b7b7ea45a480602b94b615b9f1ad93 *R/methods-show.R c59ac79b5a1165c989f5fd0f2f374590 *R/statistics-colCumsums.R 0c4a729667fe29341e15dde9065f3922 *R/statistics-colSums.R 628cf16ba73fea29c0ab4d0f9ba050ff *R/statistics-orderColnames.R 97d48f32243b61df5214da1acb00006d *R/statistics-orderStatistics.R 4e7187c17a34e389652ea79585e69bd2 *R/statistics-rollMean.R 2127cd77fff199b213284e448c4af346 *R/statistics-rowCumsums.R 0f837efdd75d10bdf5288a57d927b009 *R/statistics-smoothLowess.R f2f9ebb8ca20f32598639493c27722ab *R/stats-aggregate.R 8199839fd45182174f57e337f774685f *R/stats-filter.R e7b10a1ecb15fa46ac90740fb6a6cce8 *R/stats-lag.R 96e4b067a6f6de0b52987775e7dcde48 *R/stats-model.frame.R 1b2f4d6e8ea5cab7e17f9293630f9cd2 *R/stats-na.contiguous.R 0398b96ec7aff8a0650270ba79420c0b *R/stats-na.omit.R 8dbf0e86388a4c35659de207ee12979f *R/stats-window.R 0e6dc00950c93d137d65819d5ff54b89 *R/timeSeries-dummy.R b6019c6be24f38b69ca42404d3a48a56 *R/timeSeries-getDataPart.R 56489f9b98c52a583063b3bec3841172 *R/timeSeries-isOHLC.R e4f031dbbf5c58e0a70573a81f49fc27 *R/timeSeries-isRegular.R 41515d1a8ea45269896af20e17c45cca *R/timeSeries-isUnivariate.R aa6b610c7793a3e0fcaf2ec1aab16d96 *R/timeSeries-readSeries.R 184369cd20ebaf4cc05464ef17aa00f4 *R/timeSeries-signalCounts.R 43e0e604a42c831eea70c6d7ec497dd3 *R/timeSeries-slotDocumentation.R 3497ade73292c5dec2652335dd984588 *R/timeSeries-slotFinCenter.R 121962bec1e968195f3b968e4933a252 *R/timeSeries-slotSeries.R 790fa882672533bc7d1c250764255367 *R/timeSeries-slotTime.R 4918b16308209845926c89ec171d2bd9 *R/timeSeries-slotUnits.R 5dca5b8ed59e58f0890cb60d45110d01 *R/timeSeries.R 4f24ad3daf9dfd14c6f3b3ca847cb0a1 *R/utils-description.R 637ea07af0000fff9f57ad78fa299999 *R/utils-head.R c4d5d58ff1dfb91f1c1db4e742d87c0c *R/utils-old2new.R 0f096d915dbadb5091ff294062493040 *R/utils-structure.R e83fb0c03a5b5909b6be7103e364ec85 *R/zzz.R 219eb2bb1a7f10e4b401d7a8cb318bfa *README.md 54f12188944daf719a2023b3e8c6b83e *build/vignette.rds 08783f26722d600f1d895921a23adb91 *data/LPP2005REC.rda 99535a09b0b8189278aff6d651041d6f *data/MSFT.rda fef224cc858248dc279e326ed178f294 *data/USDCHF.rda 575a9649d181e899167b5b7fd7811c4d *inst/COPYING 29ddc76d19a7435c4101fdbd13ec0146 *inst/COPYRIGHTS df11bf613071e8b06eaeeccab8e9faac *inst/README 68b329da9893e34099c7d8ad5cb9c940 *inst/THANKS 6a055dde3c367d6039e57eca4b4c9658 *inst/_pkgdown.yml 26f1e7c7b1bfa86789532fed789ad211 *inst/doc/timeSeriesPlot.R 085e8932df19f10701373f78fa9b5d1d *inst/doc/timeSeriesPlot.Rnw 6d9af8bf2a2976ecbc3e7d0f020da874 *inst/doc/timeSeriesPlot.pdf 0606ffb4675ae15060bd825afe8a7d16 *inst/doc/timeSeriesRefCard.pdf 63a08580cf247052d3e8c939e75e2928 *inst/extdata/msft.csv 00240e3af8ce216961a315a1c0dbeb79 *inst/extensionsTests/aggregateWrappers.R 7322559e6dae10dc40a67c7434c2e30d *inst/extensionsTests/alignWrappers.R 2c0fddccf06540c4ad0ac44173b002b9 *inst/extensionsTests/attributesExtension.R 30e3c046e97879e7293ce8cf5397b165 *inst/extensionsTests/chicPlots.R df134f2efe48f0a98c3728ffa6227404 *inst/extensionsTests/endpointsWrappers.R 6ff348d414cad9dba24940f24d066584 *inst/extensionsTests/xtsWrappers.R 208fe0557b8016098ffc7813db644c1d *inst/pkgdown.yml c6df0a8aafc7cfa9f914919f7f043ff3 *inst/unitTests/Makefile 89dc29af114e6a2a3c80a502b4f4c95b *inst/unitTests/runTests.R 63d0f736e1454c6745cb7aad063ef759 *inst/unitTests/runit.NA.R 94ab54bfea1b4edec5a3b5f04167d42b *inst/unitTests/runit.Omit.R 42504a80169f26a6d37ceda28a269139 *inst/unitTests/runit.TimeSeriesClass.R 8e685661d5ae69c3347782f6ce75d9a0 *inst/unitTests/runit.TimeSeriesCoercion.R 849fa2a5ae5a5b1f6d16e8b86ff3cac5 *inst/unitTests/runit.TimeSeriesData.R 90b7820b07832910daf1afd5dc224856 *inst/unitTests/runit.TimeSeriesPositions.R c132373dac907f3ce1ee549d855652d3 *inst/unitTests/runit.aggregate.R 54e1197ea897c2b1fed028f45cf3e1e8 *inst/unitTests/runit.align.R 3bda0d794fe86888602d8f23414f39f2 *inst/unitTests/runit.apply.R e191857ac1bc06d68bc96c0b351cf39a *inst/unitTests/runit.as.R f2dee6d70982efbc28ae37bbb8ee57da *inst/unitTests/runit.attach.R 85016a1405dd51befbd7325f60d42a4c *inst/unitTests/runit.bind.R 9af6d13110613bf27e278d9e18109ae7 *inst/unitTests/runit.colCum.R b29286da34454a7726303e760cf88c23 *inst/unitTests/runit.colStats.R 96e213d2502e0135529b0700a7ed7f11 *inst/unitTests/runit.cor.R a5852317cc1bfc175a3781cee79012a0 *inst/unitTests/runit.cumulated.R 21c034e99f1666e27dcee33d785bb2da *inst/unitTests/runit.daily.R ef380731926ca03e283be11bf34e3f32 *inst/unitTests/runit.dim.R ddf81974440ba5c80cb35bbe6ea5213a *inst/unitTests/runit.drawdowns.R 00d0cb67d039b13011e43567f187a4f6 *inst/unitTests/runit.durations.R 1db68ab137b059cdeaafb194ffad9bea *inst/unitTests/runit.lag.R 37d375e0d22e63b663a8fed4bf71d6a2 *inst/unitTests/runit.mathOps.R 458df9d4fcc5c19781b40f0036353311 *inst/unitTests/runit.merge.R e0352cd00443ed64c2a0004bd4fb3fdc *inst/unitTests/runit.methods-plot.R e6868109cc1c537fea76ac57c333740a *inst/unitTests/runit.methods-print.R 3ad927a3804d96a9736216041a9a87e9 *inst/unitTests/runit.methods-summary.R 18fbd863b2c420249df32513d41dad5f *inst/unitTests/runit.model.frame.R 334271359fb9c749a7dfde8f6608defc *inst/unitTests/runit.monthly.R eb124eec56065e3395c63cab251bcf13 *inst/unitTests/runit.na.contiguous.R c3bf679bb5a7bdd5e3b9df1cf1a0d124 *inst/unitTests/runit.order.R d073d9b64074dc094dff6f987c519288 *inst/unitTests/runit.periodical.R 0965a3517f6e21aca3d18841387b1c5b *inst/unitTests/runit.rank.R a49a96a4356e8deae4b44daedab98373 *inst/unitTests/runit.returns.R d8ba4ac6486f022a81ab101ed8e631a3 *inst/unitTests/runit.rowCum.R d33bd4274e713eb2d401b53feb7c9461 *inst/unitTests/runit.signalCounts.R 56b7c45751ad846a43a4f18c70337828 *inst/unitTests/runit.spreads.R e9dcc24a88ed5e4a547f57b8ebff16f2 *inst/unitTests/runit.subset.R 8c98a57d8736b0515851139c13a08036 *inst/unitTests/runit.time.R 31c51655d159665b6391203a329965ea *inst/unitTests/runit.timeSeries.R 19cfd89772a1968a00e8a49918207aa8 *man/00timeSeries-package.Rd bba1ee287c398eab001e1183eff84fa9 *man/base-apply.Rd 5640d89dbec45dc2c1b91b678c7a196c *man/base-attach.Rd 162eb074e5049944408de0336185d630 *man/base-cbind.Rd 04a07fdfa713adbe80953a40120a8f2b *man/base-diff.Rd 430dee87a135e18c266bfc5649640d6b *man/base-dim.Rd 673542baea273a24e8819fa56cb8937e *man/base-merge.Rd 9e42a67a8fa5295b45ad741f04c5132e *man/base-rank.Rd 6e79f4b84991c3a451f47e4ef30d54cf *man/base-rev.Rd b06c4f464878498805e943bd77766eee *man/base-sample.Rd b3863fac028d79bf07458f420b3e45a8 *man/base-scale.Rd 0154228d466e18ade1797cc8930ff569 *man/base-sort.Rd 437b4fc783011911844e90d8f0d2a2e3 *man/base-start.Rd 7351bb16573fe16b600cf39b4931a467 *man/base-subsetting.Rd a7e99ac5af71ebfaee6394c724cf10b8 *man/base-t.Rd 5957894e663eff31bbfb029dc83bae1b *man/data-examples.Rd 9f973540f2165c0527b5f993c8962ddd *man/fin-align.Rd cc0fc794bcd3648da79adc3bc8d99d48 *man/fin-cumulated.Rd e1c333ab4794ce0ae0522c93dda81220 *man/fin-drawdowns.Rd aadc3c82ce30a2755e67ff831dc64b2d *man/fin-dummy.Rd cfc133b2f19c1732233aeb117d94ca68 *man/fin-durations.Rd 0efede3d3877bc282497a30a105afc38 *man/fin-monthly.Rd 82fa2c9c70f536b43b56f0c0880ae4ee *man/fin-periodical.Rd 6558081d2a2235141e7deac75e92d2dd *man/fin-returns.Rd 071c7a96b4a461c113142fd47674c24a *man/fin-runlengths.Rd 47f21b16273c1940bb68915e5449d821 *man/fin-splits.Rd 6185b2f2fddbfd6dda755e0a0eac5812 *man/fin-spreads.Rd facfda2d7e2e2dda1856cc9c5314d7ff *man/fin-turnpoints.Rd c3fbfabac7dff8d72bc04acf58b060ef *man/fin-wealth.Rd b51c826bab54dda9ba212918ecbb6999 *man/internals.Rd fc45cdf9d6e780036d76040a48331b5a *man/methods-as.Rd c70c22e1b172a27f19477b13b4991427 *man/methods-comment.Rd dc181c5bb7fc9cd851bde301e988498a *man/methods-is.Rd d553c81643c254365f802f0219864cd9 *man/methods-mathOps.Rd fca9dde15f3880bf3a8db1e98326ad5e *man/methods-plot.Rd 24639d8d582c29f043e5816ce9349aaa *man/methods-show.Rd 3a9f64c02bacc430c88dd1c29bea386e *man/methods-stats.Rd d124ec6de752732c11c3415d0be57601 *man/statistics-colCumsums.Rd a9d50c6e1b6a7c2c591875f1260a31bc *man/statistics-colSums.Rd ed415ce0c92c56260574de872f92a578 *man/statistics-orderColnames.Rd 8f106cbebc15171d5de451ff900623f2 *man/statistics-orderStatistics.Rd 4cdcaee7ab831f692dbeba19a4e03767 *man/statistics-rollMean.Rd 02fa562a75b8611cdb41836182092d1f *man/statistics-rowCumsums.Rd f89b7b3a0db7a0e1eda3d21874a58c4a *man/statistics-smoothLowess.Rd 316df3844ef9e641c1d7408ae2175825 *man/stats-aggregate.Rd fcdff42245399a90ba25b672bb837b1c *man/stats-filter.Rd 7166eab5c067085895c5f5daf1f03655 *man/stats-lag.Rd 5b7af0b8a62d2abe3158367c3f26b096 *man/stats-na.contiguous.Rd 1e5f69ccff67c209e9e4dfd46b4c9fb3 *man/stats-na.omit.Rd a10f480bb53714fe9fac85339b47b739 *man/stats-window.Rd d6db205773307994cb2d8d47f82da9b5 *man/timeSeries-class.Rd 817c9eabcec373cf219f6e3d5e854602 *man/timeSeries-deprecated.Rd 76d23739621c7975470ac217e9465709 *man/timeSeries-getDataPart.Rd 3b55e80f339eae7ff317c87c29a5fbf8 *man/timeSeries-isRegular.Rd 27c24c5de3d2adb1b8bf279b239412ae *man/timeSeries-isUnivariate.Rd d02a1934d7f2286cc88eabeb0f0a7a85 *man/timeSeries-readSeries.Rd 157e7bb25da9cac4cd0e4dabcce43ed4 *man/timeSeries-slotDocumentation.Rd 91f0a86fdca3b423610f508c4700b2e9 *man/timeSeries-slotFinCenter.Rd 6f03d54ec413d65045436f42d72c75be *man/timeSeries-slotSeries.Rd bce2abf52cf969bd7ad0dfa3395b63f9 *man/timeSeries-slotTime.Rd 495af2ee0c3310f39f502cd398093434 *man/timeSeries-slotUnits.Rd cfcb36e3b7ba13ae9c5397d340e6e3b0 *man/timeSeries.Rd 7afbd0cd1eabdba46b48de0cfe44cf0a *man/utils-description.Rd 81f6e042d39af60ff2282cef34de9e09 *man/utils-structure.Rd 2f5fc3b43ee968e0dfdcf69c1e84424e *tests/doRUnit.R d9fbe377cad1b0d2f684d3b71f324966 *tests/msft.dat.csv e0082956f0c082294af55dff827fd17a *vignettes/characterTableFig.pdf c1f351531201d1c5a99319debe31a159 *vignettes/colorPalettes1Fig.pdf 96410e04a3f1eac571ec2de10f40c901 *vignettes/colorPalettes2Fig.pdf 61bf91e727aa32ae300c067888d136e1 *vignettes/colorTableFig.pdf efb5d1677a5e3f01559bf066ec86cc1a *vignettes/colorwheel.pdf 3c2c1851329140ae3c375a6da33bd27c *vignettes/symbolTableFig.pdf 085e8932df19f10701373f78fa9b5d1d *vignettes/timeSeriesPlot.Rnw timeSeries/inst/0000755000176200001440000000000014546500452013345 5ustar liggesuserstimeSeries/inst/pkgdown.yml0000644000176200001440000000033314546500466015545 0ustar liggesuserspandoc: 2.9.2.1 pkgdown: 2.0.7 pkgdown_sha: ~ articles: {} last_built: 2024-01-07T10:47Z urls: reference: https://geobosh.github.io/timeSeriesDoc/reference article: https://geobosh.github.io/timeSeriesDoc/articles timeSeries/inst/README0000755000176200001440000000012014263246021014214 0ustar liggesusersintroduction of timeSeries package in the Rmetrics suite after svn revision 3319timeSeries/inst/THANKS0000755000176200001440000000000114263246021014245 0ustar liggesusers timeSeries/inst/doc/0000755000176200001440000000000014550733426014116 5ustar liggesuserstimeSeries/inst/doc/timeSeriesPlot.R0000644000176200001440000006142214550733426017216 0ustar liggesusers### R code from vignette source 'timeSeriesPlot.Rnw' ################################################### ### code chunk number 1: environment ################################################### Sys.setlocale("LC_ALL", "C") ################################################### ### code chunk number 2: library ################################################### require(timeSeries) require(xts) require(PerformanceAnalytics) require(fTrading) tS1 <- 100 * cumulated(LPP2005REC[, 1]) # SBI (univariate) tS2 <- 100 * cumulated(LPP2005REC[, 1:2]) # SBI & SPI (bivariate) tS3 <- 100 * cumulated(LPP2005REC[, 1:3]) # SBI, SPI, SWIIT (Swiss Market) tS6 <- 100 * cumulated(LPP2005REC[, 1:6]) # Swiss and Foreign Market Indexes ################################################### ### code chunk number 3: univariateSingle ################################################### par(mfrow=c(1, 1)) plot(tS1) ################################################### ### code chunk number 4: univariateSinglePlot ################################################### par(mfrow=c(1, 1)) plot(tS1) ################################################### ### code chunk number 5: univariateSingle2 ################################################### require(PerformanceAnalytics) par(mfrow=c(3, 1)) xts::plot.xts(as.xts(tS1)) PerformanceAnalytics::chart.TimeSeries(as.xts(tS1)) plot(tS1) ################################################### ### code chunk number 6: univariateSingle2Plot ################################################### require(PerformanceAnalytics) par(mfrow=c(3, 1)) xts::plot.xts(as.xts(tS1)) PerformanceAnalytics::chart.TimeSeries(as.xts(tS1)) plot(tS1) ################################################### ### code chunk number 7: multivariateSingle ################################################### par(mfrow=c(1, 1)) plot(tS3, plot.type="s") ################################################### ### code chunk number 8: multivariateSinglePlot ################################################### par(mfrow=c(1, 1)) plot(tS3, plot.type="s") ################################################### ### code chunk number 9: multivariateSingle2 ################################################### par(mfrow=c(2, 1)) require(PerformanceAnalytics) PerformanceAnalytics::chart.TimeSeries(as.xts(tS3)) plot(tS3, plot.type="s") ################################################### ### code chunk number 10: multivariateSingle2Plot ################################################### par(mfrow=c(2, 1)) require(PerformanceAnalytics) PerformanceAnalytics::chart.TimeSeries(as.xts(tS3)) plot(tS3, plot.type="s") ################################################### ### code chunk number 11: oneColMultiple ################################################### par(mfrow=c(1, 1)) plot(tS3, plot.type="m") ################################################### ### code chunk number 12: oneColMultiplePlot ################################################### par(mfrow=c(1, 1)) plot(tS3, plot.type="m") ################################################### ### code chunk number 13: twoColMultiple ################################################### par(mfrow=c(1, 1)) plot(tS6, plot.type="m") ################################################### ### code chunk number 14: twoColMultiplePlot ################################################### par(mfrow=c(1, 1)) plot(tS6, plot.type="m") ################################################### ### code chunk number 15: gapMultiple ################################################### par(mfrow=c(1, 1)) plot(tS3, plot.type="m", mar=c(gap=0.3, 5.1, gap=0.3, 2.1)) ################################################### ### code chunk number 16: gapMultiplePlot ################################################### par(mfrow=c(1, 1)) plot(tS3, plot.type="m", mar=c(gap=0.3, 5.1, gap=0.3, 2.1)) ################################################### ### code chunk number 17: combineSingle ################################################### par(mfrow=c(2, 1)) par(mar = c(bottom=1.5, 5.1, top=4, 2.1)) plot(tS2[, 1]) par(mar = c(bottom=4, 5.1, top=1.5, 2.1)) plot(tS2[, 2]) ################################################### ### code chunk number 18: combineSinglePlot ################################################### par(mfrow=c(2, 1)) par(mar = c(bottom=1.5, 5.1, top=4, 2.1)) plot(tS2[, 1]) par(mar = c(bottom=4, 5.1, top=1.5, 2.1)) plot(tS2[, 2]) ################################################### ### code chunk number 19: layoutSingle ################################################### nf <- layout(mat=matrix(c(1, 1, 2, 3), byrow = TRUE, nrow=2)) par(mar = c(bottom=2, 5.1, top=3, 2.1)) plot(tS3[, 1]) par(mar = c(bottom=3, 5.1, top=2, 1.1)) plot(tS3[, 2]) par(mar = c(bottom=3, 4.1, top=2, 2.1)) plot(tS3[, 3]) ################################################### ### code chunk number 20: layoutSinglePlot ################################################### nf <- layout(mat=matrix(c(1, 1, 2, 3), byrow = TRUE, nrow=2)) par(mar = c(bottom=2, 5.1, top=3, 2.1)) plot(tS3[, 1]) par(mar = c(bottom=3, 5.1, top=2, 1.1)) plot(tS3[, 2]) par(mar = c(bottom=3, 4.1, top=2, 2.1)) plot(tS3[, 3]) ################################################### ### code chunk number 21: layout2Single ################################################### nf <- layout(mat=matrix(c(1, 1, 2, 3), byrow=TRUE, nrow=2), heights=c(2.5,1)) par(mar = c(bottom=2, 5.1, top=3, 2.1)) plot(tS3[, 1]) par(mar = c(bottom=3, 5.1, top=1.5, 1.1)) plot(tS3[, 2]) par(mar = c(bottom=3, 4.1, top=1.5, 2.1)) plot(tS3[, 3]) ################################################### ### code chunk number 22: layout2SinglePlot ################################################### nf <- layout(mat=matrix(c(1, 1, 2, 3), byrow=TRUE, nrow=2), heights=c(2.5,1)) par(mar = c(bottom=2, 5.1, top=3, 2.1)) plot(tS3[, 1]) par(mar = c(bottom=3, 5.1, top=1.5, 1.1)) plot(tS3[, 2]) par(mar = c(bottom=3, 4.1, top=1.5, 2.1)) plot(tS3[, 3]) ################################################### ### code chunk number 23: scatter ################################################### par(mfrow=c(1,1)) plot(tS2[, 1], tS2[, 2]) ################################################### ### code chunk number 24: scatterPlot ################################################### par(mfrow=c(1,1)) plot(tS2[, 1], tS2[, 2]) ################################################### ### code chunk number 25: pretty ################################################### par(mfcol = c(2, 1)) plot(tS1, at = "pretty") plot(tS1, at = "chic") ################################################### ### code chunk number 26: prettyPlot ################################################### par(mfcol = c(2, 1)) plot(tS1, at = "pretty") plot(tS1, at = "chic") ################################################### ### code chunk number 27: chicUnivariateSingle ################################################### par(mfcol=c(2, 1)) plot(tS3, plot.type="s", at="pretty") plot(tS3, plot.type="s", at="chic") ################################################### ### code chunk number 28: chicUnivariateSinglePlot ################################################### par(mfcol=c(2, 1)) plot(tS3, plot.type="s", at="pretty") plot(tS3, plot.type="s", at="chic") ################################################### ### code chunk number 29: minorTicks ################################################### par(mfrow=c(3, 1)) plot(tS1, minor.ticks="day", at="pretty") plot(tS1, minor.ticks="week", at="pretty") plot(tS1, minor.ticks="month", at="pretty") ################################################### ### code chunk number 30: minorTicksPlot ################################################### par(mfrow=c(3, 1)) plot(tS1, minor.ticks="day", at="pretty") plot(tS1, minor.ticks="week", at="pretty") plot(tS1, minor.ticks="month", at="pretty") ################################################### ### code chunk number 31: chicOneColMultiple ################################################### par(mfrow=c(1, 1)) plot(tS3, plot.type="m", at="pretty") ################################################### ### code chunk number 32: chicOneColMultiplePlot ################################################### par(mfrow=c(1, 1)) plot(tS3, plot.type="m", at="pretty") ################################################### ### code chunk number 33: chicTwoColMultiple ################################################### par(mfrow=c(1, 1)) plot(tS6, plot.type="m", at="chic") ################################################### ### code chunk number 34: chicTwoColMultiplePlot ################################################### par(mfrow=c(1, 1)) plot(tS6, plot.type="m", at="chic") ################################################### ### code chunk number 35: tailoredAxis ################################################### par(mfrow=c(2, 1)) at <- paste0("200", c("6-01", "6-04", "6-07", "6-10", "7-01", "7-04"), "-01") plot(tS3, plot.type="s", format="%B\n%Y", at=at) plot(tS3, plot.type="s", format="%b/%y", at=at) ################################################### ### code chunk number 36: tailoredAxisPlot ################################################### par(mfrow=c(2, 1)) at <- paste0("200", c("6-01", "6-04", "6-07", "6-10", "7-01", "7-04"), "-01") plot(tS3, plot.type="s", format="%B\n%Y", at=at) plot(tS3, plot.type="s", format="%b/%y", at=at) ################################################### ### code chunk number 37: annSingle ################################################### par(mfrow=c(2, 2)) plot(tS1, ann=FALSE) plot(tS3, plot.type="s", ann=FALSE, at="pretty") plot(tS6, plot.type="s", ann=FALSE, at="pretty") ################################################### ### code chunk number 38: annSinglePlot ################################################### par(mfrow=c(2, 2)) plot(tS1, ann=FALSE) plot(tS3, plot.type="s", ann=FALSE, at="pretty") plot(tS6, plot.type="s", ann=FALSE, at="pretty") ################################################### ### code chunk number 39: titleSingle ################################################### par(mfrow=c(2, 2)) plot(tS1); title(main = "Index") plot(tS3, plot.type="s"); title(main = "Index") plot(tS3, plot.type="s"); title(main = "Index", xlab = "Date") plot(tS6, plot.type="s"); title(main = "Index", xlab = "Date") ################################################### ### code chunk number 40: titleSinglePlot ################################################### par(mfrow=c(2, 2)) plot(tS1); title(main = "Index") plot(tS3, plot.type="s"); title(main = "Index") plot(tS3, plot.type="s"); title(main = "Index", xlab = "Date") plot(tS6, plot.type="s"); title(main = "Index", xlab = "Date") ################################################### ### code chunk number 41: axisFontSize ################################################### par(mfrow=c(3, 1)) plot(tS3, at="chic", plot.type="s", cex.axis=0.75) plot(tS3, at="chic", plot.type="s", cex.axis=1.00) plot(tS3, at="chic", plot.type="s", cex.axis=1.25) ################################################### ### code chunk number 42: axisFontSizePlot ################################################### par(mfrow=c(3, 1)) plot(tS3, at="chic", plot.type="s", cex.axis=0.75) plot(tS3, at="chic", plot.type="s", cex.axis=1.00) plot(tS3, at="chic", plot.type="s", cex.axis=1.25) ################################################### ### code chunk number 43: flipAxisOne ################################################### par(mfrow=c(1, 1)) plot(tS3, plot.type="m", yax.flip = TRUE) ################################################### ### code chunk number 44: flipAxisOnePlot ################################################### par(mfrow=c(1, 1)) plot(tS3, plot.type="m", yax.flip = TRUE) ################################################### ### code chunk number 45: typeMultiple ################################################### par(mfrow=c(1, 1)) plot(tS3, plot.type="m", type=c("l", "p", "h"), at="pretty") ################################################### ### code chunk number 46: typeMultiplePlot ################################################### par(mfrow=c(1, 1)) plot(tS3, plot.type="m", type=c("l", "p", "h"), at="pretty") ################################################### ### code chunk number 47: colorNamesMultiple ################################################### par(mfrow=c(1, 1)) plot(tS3, plot.type="m", col=c("blue", "orange", "darkgreen")) ################################################### ### code chunk number 48: colorNamesMultiplePlot ################################################### par(mfrow=c(1, 1)) plot(tS3, plot.type="m", col=c("blue", "orange", "darkgreen")) ################################################### ### code chunk number 49: palettesMultiple ################################################### par(mfrow=c(1, 1)) plot(tS6, plot.type="s", col=heat.colors(n=6, alpha = 1), at="chic", format = "%B\n%Y") ################################################### ### code chunk number 50: palettesMultiplePlot ################################################### par(mfrow=c(1, 1)) plot(tS6, plot.type="s", col=heat.colors(n=6, alpha = 1), at="chic", format = "%B\n%Y") ################################################### ### code chunk number 51: ltyMultiple ################################################### par(mfrow=c(1, 1)) plot(tS3, plot.type="m", col=1, lty=1:3, at="chic") ################################################### ### code chunk number 52: ltyMultiplePlot ################################################### par(mfrow=c(1, 1)) plot(tS3, plot.type="m", col=1, lty=1:3, at="chic") ################################################### ### code chunk number 53: lwdMultiple ################################################### par(mfrow=c(1, 1)) plot(tS3, plot.type="m", col=1, lwd=3:1, at="chic") ################################################### ### code chunk number 54: lwdMultiplePlot ################################################### par(mfrow=c(1, 1)) plot(tS3, plot.type="m", col=1, lwd=3:1, at="chic") ################################################### ### code chunk number 55: symbolsSizeMultiple ################################################### par(mfrow=c(1, 1)) plot(tS3, plot.type="s", type="p", col=1:3, pch=21:23, cex.pch=c(0.2, 0.2, 0.2), at="pretty") ################################################### ### code chunk number 56: symbolsSizeMultiplePlot ################################################### par(mfrow=c(1, 1)) plot(tS3, plot.type="s", type="p", col=1:3, pch=21:23, cex.pch=c(0.2, 0.2, 0.2), at="pretty") ################################################### ### code chunk number 57: gridSingle ################################################### par(mfrow=c(1, 1)) plot(tS3, plot.type="s", grid=FALSE) ################################################### ### code chunk number 58: gridSinglePlot ################################################### par(mfrow=c(1, 1)) plot(tS3, plot.type="s", grid=FALSE) ################################################### ### code chunk number 59: noBoxSingle ################################################### par(mfrow=c(1, 1)) plot(tS3, plot.type="s", frame.plot=FALSE, grid=FALSE) box() box(bty = "7", col = "white") # boxL grid(NA, NULL, col = "darkgrey") # hgrid ################################################### ### code chunk number 60: gridSinglePlot ################################################### par(mfrow=c(1, 1)) plot(tS3, plot.type="s", grid=FALSE) ################################################### ### code chunk number 61: horizMultiple ################################################### par(mfrow=c(1, 1)) lines2 <- function(X, Y, type, xlab, ylab, col, pch, lty, lwd, cex) { lines(x=X, y=Y, col=col) abline(h=0, col = "brown", lwd=2)} plot(returns(tS3), plot.type="m", col = .colorwheelPalette(3), panel=lines2, at="pretty") ################################################### ### code chunk number 62: horizMultiplePlot ################################################### par(mfrow=c(1, 1)) lines2 <- function(X, Y, type, xlab, ylab, col, pch, lty, lwd, cex) { lines(x=X, y=Y, col=col) abline(h=0, col = "brown", lwd=2)} plot(returns(tS3), plot.type="m", col = .colorwheelPalette(3), panel=lines2, at="pretty") ################################################### ### code chunk number 63: rugMultiple ################################################### par(mfrow=c(1, 1)) lines2 <- function(X, Y, type, xlab, ylab, col, pch, lty, lwd, cex) { lines(x=X, y=Y, type="h", col=col) rug(Y, side=4, col="steelblue") } plot(returns(tS6), plot.type="m", col = .colorwheelPalette(6), panel=lines2, at="pretty") ################################################### ### code chunk number 64: rugMultiplePlot ################################################### par(mfrow=c(1, 1)) lines2 <- function(X, Y, type, xlab, ylab, col, pch, lty, lwd, cex) { lines(x=X, y=Y, type="h", col=col) rug(Y, side=4, col="steelblue") } plot(returns(tS6), plot.type="m", col = .colorwheelPalette(6), panel=lines2, at="pretty") ################################################### ### code chunk number 65: emaMultiple ################################################### par(mfrow=c(1, 1)) lines2 <- function(X, Y, type, xlab, ylab, col, pch, lty, lwd, cex) { lines(x=X, y=Y, type="l", col=col) lines(x=X, y=emaTA(Y), col="black") } plot(tS3, plot.type="m", col = .colorwheelPalette(3), panel=lines2, grid=TRUE, at="pretty") ################################################### ### code chunk number 66: emaMultiplePlot ################################################### par(mfrow=c(1, 1)) lines2 <- function(X, Y, type, xlab, ylab, col, pch, lty, lwd, cex) { lines(x=X, y=Y, type="l", col=col) lines(x=X, y=emaTA(Y), col="black") } plot(tS3, plot.type="m", col = .colorwheelPalette(3), panel=lines2, grid=TRUE, at="pretty") ################################################### ### code chunk number 67: margins ################################################### # Plot: # - oma stands for 'Outer Margin Area' # - mar represents the 'figure Margins' # - The default size is c(5,4,4,2) + 0.1 # - The axes tick marks will go in the first lines par(mfrow=c(1, 1)) par(oma=c(3,3,3,3)) # all sides have 3 lines of space par(mar=c(5,4,4,2) + 0.1) plot(x=1:10, y=1:10, type="n", xlab="X", ylab="Y") # Add Text tot the Plot Part - red text(5,5, "Plot", col="red", cex=2) text(5,4, "text(5,5, \"Plot\", col=\"red\", cex=2)", col="red", cex=1) box("plot", col="red", lwd=2) # Add text to thebThe Figure Part - grey mtext("Margins", side=3, line=2, cex=1.5, col="grey") mtext("par(mar=c(5,4,4,2) + 0.1)", side=3, line=1, cex=1, col="grey") mtext("Line 0", side=3, line=0, adj=1.0, cex=1, col="grey") mtext(" 1", side=3, line=1, adj=1.0, cex=1, col="grey") mtext("Line 2", side=3, line=2, adj=1.0, cex=1, col="grey") mtext("Line 3", side=3, line=3, adj=1.0, cex=1, col="grey") mtext("Line 0", side=2, line=0, adj=1.0, cex=1, col="grey") mtext("Line 1", side=2, line=1, adj=1.0, cex=1, col="grey") mtext("Line 2", side=2, line=2, adj=1.0, cex=1, col="grey") mtext("Line 3", side=2, line=3, adj=1.0, cex=1, col="grey") box("figure", col="grey") # The title will fit in the third line on the top of the graph. title("Ttitle - Third Line") # Note 'outer=TRUE' moves us from the figure to the outer margins. mtext("Outer Margin Area", side=1, line=1, cex=1.8, col="brown", outer=TRUE) mtext("par(oma=c(3,3,3,3))", side=1, line=2, cex=1, col="orange", outer=TRUE) mtext("Line 0", side=1, line=0, adj=0.0, cex=0.8, col="orange", outer=TRUE) mtext("Line 1", side=1, line=1, adj=0.0, cex=1, col="orange", outer=TRUE) mtext("Line 2", side=1, line=2, adj=0.0, cex=1, col="orange", outer=TRUE) box("outer", col="orange") ################################################### ### code chunk number 68: marginsPlot ################################################### # Plot: # - oma stands for 'Outer Margin Area' # - mar represents the 'figure Margins' # - The default size is c(5,4,4,2) + 0.1 # - The axes tick marks will go in the first lines par(mfrow=c(1, 1)) par(oma=c(3,3,3,3)) # all sides have 3 lines of space par(mar=c(5,4,4,2) + 0.1) plot(x=1:10, y=1:10, type="n", xlab="X", ylab="Y") # Add Text tot the Plot Part - red text(5,5, "Plot", col="red", cex=2) text(5,4, "text(5,5, \"Plot\", col=\"red\", cex=2)", col="red", cex=1) box("plot", col="red", lwd=2) # Add text to thebThe Figure Part - grey mtext("Margins", side=3, line=2, cex=1.5, col="grey") mtext("par(mar=c(5,4,4,2) + 0.1)", side=3, line=1, cex=1, col="grey") mtext("Line 0", side=3, line=0, adj=1.0, cex=1, col="grey") mtext(" 1", side=3, line=1, adj=1.0, cex=1, col="grey") mtext("Line 2", side=3, line=2, adj=1.0, cex=1, col="grey") mtext("Line 3", side=3, line=3, adj=1.0, cex=1, col="grey") mtext("Line 0", side=2, line=0, adj=1.0, cex=1, col="grey") mtext("Line 1", side=2, line=1, adj=1.0, cex=1, col="grey") mtext("Line 2", side=2, line=2, adj=1.0, cex=1, col="grey") mtext("Line 3", side=2, line=3, adj=1.0, cex=1, col="grey") box("figure", col="grey") # The title will fit in the third line on the top of the graph. title("Ttitle - Third Line") # Note 'outer=TRUE' moves us from the figure to the outer margins. mtext("Outer Margin Area", side=1, line=1, cex=1.8, col="brown", outer=TRUE) mtext("par(oma=c(3,3,3,3))", side=1, line=2, cex=1, col="orange", outer=TRUE) mtext("Line 0", side=1, line=0, adj=0.0, cex=0.8, col="orange", outer=TRUE) mtext("Line 1", side=1, line=1, adj=0.0, cex=1, col="orange", outer=TRUE) mtext("Line 2", side=1, line=2, adj=0.0, cex=1, col="orange", outer=TRUE) box("outer", col="orange") ################################################### ### code chunk number 69: prettyAppendix ################################################### FORMAT <- tS1@format FORMAT POSITIONS <- pretty(tS1) POSITIONS LABELS <- pretty(tS1) LABELS ################################################### ### code chunk number 70: axTicks ################################################### axTicksByTime <- function (x, ticks.on = "auto", k = 1, labels = TRUE, format.labels = TRUE, ends = TRUE, gt = 2, lt = 30) { if (timeBased(x)) x <- xts(rep(1, length(x)), x) tick.opts <- c("years", "months", "weeks", "days", "hours", "minutes", "seconds") tick.k.opts <- c(10, 5, 2, 1, 6, 1, 1, 1, 4, 2, 1, 30, 15, 1, 1) if (ticks.on %in% tick.opts) { cl <- ticks.on[1] ck <- k } else { tick.opts <- paste(rep(tick.opts, c(4, 2, 1, 1, 3, 3, 1)), tick.k.opts) is <- structure(rep(0, length(tick.opts)), .Names = tick.opts) for (i in 1:length(tick.opts)) { y <- strsplit(tick.opts[i], " ")[[1]] ep <- endpoints(x, y[1], as.numeric(y[2])) is[i] <- length(ep) - 1 if (is[i] > lt) break } nms <- rev(names(is)[which(is > gt & is < lt)])[1] cl <- strsplit(nms, " ")[[1]][1] ck <- as.numeric(strsplit(nms, " ")[[1]][2]) } if (is.null(cl)) ep <- NULL else ep <- endpoints(x, cl, ck) if (ends) ep <- ep + c(rep(1, length(ep) - 1), 0) if (labels) { if (is.logical(format.labels) || is.character(format.labels)) { unix <- ifelse(.Platform$OS.type == "unix", TRUE, FALSE) time.scale <- periodicity(x)$scale fmt <- ifelse(unix, "%n%b%n%Y", "%b %Y") if (time.scale == "weekly" | time.scale == "daily") fmt <- ifelse(unix, "%b %d%n%Y", "%b %d %Y") if (time.scale == "minute" | time.scale == "hourly") fmt <- ifelse(unix, "%b %d%n%H:%M", "%b %d %H:%M") if (time.scale == "seconds") fmt <- ifelse(unix, "%b %d%n%H:%M:%S", "%b %d %H:%M:%S") if (is.character(format.labels)) fmt <- format.labels names(ep) <- format(index(x)[ep], fmt) } else { names(ep) <- as.character(index(x)[ep]) } ep } } ################################################### ### code chunk number 71: axTicks2 ################################################### ticks <- axTicksByTime(as.xts(tS1)) ticks timeSeries/inst/doc/timeSeriesPlot.pdf0000644000176200001440000356461014550733426017600 0ustar liggesusers%PDF-1.5 % 176 0 obj << /Length 1525 >> stream concordance:timeSeriesPlot.tex:timeSeriesPlot.Rnw:1 13 1 1 0 156 1 1 2 7 0 2 2 1 0 7 1 3 0 1 2 69 1 1 2 1 0 1 1 3 0 1 2 4 1 1 -6 1 10 23 1 1 2 1 0 4 1 3 0 1 2 4 1 1 -6 1 10 20 1 1 2 1 0 1 1 3 0 1 2 4 1 1 -6 1 10 24 1 1 2 1 0 3 1 3 0 1 2 4 1 1 -6 1 10 18 1 1 2 1 0 1 1 3 0 1 2 3 1 1 -5 1 9 17 1 1 2 1 0 1 1 3 0 1 2 4 1 1 -6 1 10 18 1 1 2 1 0 1 1 3 0 1 2 4 1 1 -6 1 10 16 1 1 2 1 0 4 1 3 0 1 2 3 1 1 -5 1 9 19 1 1 2 1 0 6 1 3 0 1 2 4 1 1 -6 1 10 25 1 1 2 1 0 6 1 3 0 1 2 3 1 1 -5 1 9 17 1 1 2 1 0 1 1 3 0 1 2 2 1 1 -4 1 8 58 1 1 2 1 0 2 1 3 0 1 2 4 1 1 -6 1 10 22 1 1 2 1 0 2 1 3 0 1 2 4 1 1 -6 1 10 17 1 1 2 1 0 3 1 3 0 1 2 4 1 1 -6 1 10 15 1 1 2 1 0 1 1 3 0 1 2 4 1 1 -6 1 10 17 1 1 2 1 0 1 1 3 0 1 2 4 1 1 -6 1 10 15 1 1 2 1 0 3 1 3 0 1 2 4 1 1 -6 1 10 39 1 1 2 1 0 3 1 3 0 1 2 2 1 1 -4 1 8 15 1 1 2 1 0 4 1 3 0 1 2 4 1 1 -6 1 10 15 1 1 2 1 0 3 1 3 0 1 2 4 1 1 -6 1 10 18 1 1 2 1 0 1 1 3 0 1 2 4 1 1 -6 1 10 49 1 1 2 1 0 1 1 3 0 1 2 4 1 1 -6 1 10 16 1 1 2 1 0 1 1 3 0 1 2 4 1 1 -6 1 10 16 1 1 2 1 0 1 2 4 0 1 2 4 1 1 -6 1 10 34 1 1 2 1 0 1 1 3 0 1 2 4 1 1 -6 1 10 14 1 1 2 1 0 1 1 3 0 1 2 4 1 1 -6 1 10 43 1 1 2 1 0 1 2 4 0 1 2 4 1 1 -6 1 10 15 1 1 2 1 0 1 1 3 0 1 2 4 1 1 -6 1 10 10 1 1 2 1 0 4 1 3 0 1 2 4 1 1 -32 1 36 34 1 1 2 1 0 1 3 2 0 1 2 4 0 1 2 3 1 1 -5 1 9 12 1 1 2 1 0 1 3 2 0 1 2 4 0 1 2 3 1 1 -5 1 9 12 1 1 2 1 0 1 3 2 0 1 2 4 0 1 2 3 1 1 -5 1 9 39 1 1 7 6 0 3 1 1 3 1 0 2 1 1 3 1 0 10 1 1 3 1 0 1 3 1 0 5 1 3 0 1 2 6 1 1 -8 1 12 66 1 1 2 1 0 1 1 5 0 2 1 6 0 2 1 7 0 1 2 6 1 1 49 51 0 2 2 1 0 1 1 13 0 1 2 122 1 endstream endobj 210 0 obj << /Length 1238 /Filter /FlateDecode >> stream xݙ[o6)&M 4نfoAD,2;ԡėrP,E/?9t\Ip"r=Ӏ1R (4PJ`4 ޓڢ #҆,o|9#,{ Jc#%srkiXk)yOEco]JjGf>/V t];҈OٟJ{ofu""E ;߻4e"`<ľN3W( ,PsZ04`I|urJl :X$Aޞ* (\[ R #$`607JtJĖ~V[f|YjNFXB joTKi:+f `@Fan4a^RrsA$˶{0(Lg}Y&a̽W%'u:/.$gƔ~.Ξ]Jazve{a= A2ϋ }瘗QDz#ZznQ}|eJ6XJ{#Sg҃Eį8?{o=c@Yશ4M c;{fyf9ο #!$ٻnrk=_=ޏR?˕b}w>@^BӢBD>;r|E|` {ssxSúO+[wXt5dJ/4s{CjGeNV_B3(?k҂dgQ2c3ͼ=[I]>,YQM>3ϖm22- 'h7 _Uu9gxJ ,:q>*fcH:?}:/}g_IÎ jxZx /0Isp֛R겳[-ý[Mg,SD'eq}|V;?F <(Qql&m(;i<ŃIqVjkk+#7YvW[9trlt/(66s9t1s?@ʻnz){.`Lo.ebo8MK> PKh+&j=`T"XoFjI-3$0lWIHޤ6<[<Խ7`ϚMHoɕNbQu~%۹%?fv?ŵ} _M%L1jw_^ endstream endobj 2 0 obj << /Type /ObjStm /N 100 /First 830 /Length 1834 /Filter /FlateDecode >> stream xZ[SV~ׯ8ӧ_:L:$3mgJxOf@}c i`t{V+ɂqf2 L(=&=bJfZ{&^1ᙕI噔ipe[& ZR$.84RyNe T9ϴd8Ŵar4L{ d(H5`1ax&W H2\"] &qK {F0Gnz5/ ƀ(|%a<2ЋK8}N*,$\ЋC'5fKU,/ xG1DC;GGþb11Y1\L .F("$EP/ epd7eYPN (+aG R2B`FZ 0v05`_ \x`F,)0K D:'2H@l@fRN jS: q#F@<^UG;yN# v"7dp4#(Ulvz8e7h8O'x^^|R>qfB9mf6 q<;yjD֍D 'Yלa4vIs,*g}E[ؾn85-b8^9=f{1Vi#_Ϭ}5yu1ubnETxo8i w_t<]ˏYblȯM8!)wjc1pwq1eqJhgO\7W*;/zzvq_s^3>$We"&e8̚<bP5b2cR#tx7M˴^X Ҏl2R՜ܫ^ݐLۑI&-&E?lD[*It뢖kE-[9CXܼ9[JӴD!U-myjs*6onzn˴Hm7YՋI(xŴeuK4%^7m_VFvFؖO_iwhre߃z]r:IR~{s~ˬ)CϝE竀'8NU ݚ{:¶: z /1pU1$v"e7;7'7"NX]mi{$KKRzL)q+=g%}<Սm=g}ڎbėA_$zŶ[8JIJMg|kV{Le:ݯ^@o㪪8xw>`\/_ړuJO`g,I [`Xm~9l?.fpwhot6>ٙް#cŜe^܇ fP d G'JN_(dRRRRҔҖK}J}J}J}J}J}N伔wlp8ɗl3fxn~H|8G=2VN-ļm%v0ϕ? "RNr0VLk9r]3b:7w!s,BX6 0H)mΑګ\xQbyn"YG8D `Ѹ(L Mȵ\,VPirpӏŮ9ksGRTM0&7s5o"SQe(mP彄M,fxaJs`p&rm? ,f`EmXb endstream endobj 234 0 obj << /Length 580 /Filter /FlateDecode >> stream xݖM0 }Hvle۪H+6z" A}:ݤ^_Lwb >Z (I== >' c@JP_PJLAEHI@&KHFEF~:AJ- 4*Y3v J lqMWAP1*ΛB`JQ ,7 =b0M2MY_K}ύnǤ! 8Ɨ31dr-6=6ƃm~PYoׅۢfږVv\ 8|5}A ` '04ꡎ i*$[3/ܚΧQ.h_8Z. ]J\|Oy4-|Bc gˮNx|quo @xҥ מӗBwMNor7Cž&XtN37CeXwU7Msm{cT$?қ?_:%'|OUM/([3U|<0>Wnx `M8  #yzo  endstream endobj 238 0 obj << /Length 19 /Filter /FlateDecode >> stream x3PHW0Pp2Ac( endstream endobj 242 0 obj << /Length 2823 /Filter /FlateDecode >> stream xYY~_aee`%)`fw3 d0AmɶҲdHrS͞޷u%lIP Fo*DB޿0g cR@A<N`mS[ҾG$x'.ehHQӀ<CЪܿz"|HRF(m1XR1}CMT3HY(\'؈HţqEƾ4EANO}kmI=v0E(Y9rSaJ"5ta8Հ7~> +xlמPե2HS> *iSh=T{IN:FNn̋h{GWPyΎ`GYKPn5=2 Lz,Qo)]l krZǮq5qs;DW|ɡ{E׭Δ0Wtmq2Ff]ރ^YUpW&[ __9 2VDUsKn[{J%4AN3kV[>KS=l@yW%O47n@! (ߥ !hN*`$X (cTgKebđ. ?F$-yߵ'8VEPL0QX*' XqDmzza0 >gYYp(r=QhH;^}`Jo'梬o;njAY8aʆ^v^ǎcobO$Q߱\ܗ@ K|?/SS*7SNU ~(  ?L#Sk u}50}h8\؅V. R0[~z.B%Ym}d o 8~6deuL vHDIsRըi?ضUd\x^+åbadK"0d$a!>Nnc%_XEE"NG^e<:kbyq m2Hq2BXCJi02 ڨfQp)jFITZ(ePs/8T/ xV.P!v^wSB e<^U L ٔhhe8_Cdm7ʟ˟bҕTcd%nѼ2 6NBH{cG(qL0|qʅ lF`3zζ5PS e$ @EAtF_l Scjݡ/ִGF{&25{1g bFw1lŮ|ȟ*;WRmXꠖa8F˘j~q=gVctpK&H)l+?[]Jpr4e$B@ۥ⋻}$ije%dxiȋED9 VIh;Mi ׅ3B~:qH@_(70FimMIsd_lbFI錫KVp0g)r$8rIbt: st8NszZk#hyƴ;Бaܩd=ˏkѵ%ջA ؈6T+%V?\ҧsU࿙]&nbh#h03`˫D"O4i_ H- H*7rgDΗ|Af x4qcTybB}ݡmYdIWȌt r߃ ȟ}s=Pv' 6bꃫxLH ehO9,`^Ƅ:^{RtW9i8BM#[Ctq+\XN0 9{]#Dr]KW;z.?8uL95cӹi=9x@)AI"ƴfGνy0zC C=Y˿v?t (O5R3!<5^Sg*-)fëGFb:A &xdZ]^q-ղgI|SKe:%gܸxUs}: bX| ҵzµKּ|PٗJ¡hz /5)|BwwKg7/HKxcVYW,dR'C a8'lא7 Di H(+ ZЌ [b}^6h#Fjv2!opd_}J6`ҧ{F`S W8XR}z95<_GiȖl n$ bM$Jř@Y.8N endstream endobj 248 0 obj << /Length 2491 /Filter /FlateDecode >> stream xڥYmo8_;Pk%zqr:=4[,łh[[YR^ ԋv/9g3 d{❼ի.ԝFAtڜw/8ae|r<I4 SѬ%o*)rĩK"Y8GʦsZ[iI7vʦ.SGeh%y8ve4FqxЉ0$crS~O;yEMx97e-_.GzY:D-iOH*YQY:jgU?0H+GEa&IZ8w6;=8#9 44yL0vEfy:76$D/hb"5ĝ4?eƅ8ƒ+``N¤`A{<O*7 ,a$C%7".)+.{IX,Ej ;X+QgeƢi-o¹g)ָeZ$Ur+ xd8JgʇC\ M1h!M׸}ĵ=ʧ>˳ٞ 8SmcC+A܃pJ6LъH*rGA:xE}zYΛ^OkQвMUD)%WgDNS\2@ַ _ήp+Q P7o`s1oy無SzF9:QV`ș%Vɲ4nGD'2Ơ=1_26gOY.D]^{L#fD"˜5*Vi<\͡ 0@#:P):d]eE<1ghdeR$2+v>\:Ɯ޵( 뺬h\n?;FY) Ԅ |%'h 4`((|OFvO05%\YZ5cPMƓvQEM^"*”A),#td؅QF.HDnETB̋-/GN~m@leTr`&eLҨ u·40]{Ul˸y8}{Q`YoWd`BiL =QJkޭǐg%GRɄK@7krQl+j3=bfkn^wՆJMU4TGc: "[;"|vZ8ZG8w\/ZTfHc uIKmN+AwvlW9H[bF|c3]A|oYkf!{kj`WMKGuzKiRҜ6yȟ%AA1rx;M] 1ǂ7H-(ODo*3Zw2( EPP5[K {Q} nث±oUփa} m1:j(Gރ!ʲoI0G$P~nr#-RfZqĬOZDUl| ܖMk/]|Vu^B`W̮N_ũN.:lvO<|-.`zNWWM7'Z/,~y$H~3rgsWp+xx7߬ `l,}qn/Nٙ*F 3z YmO`|HB5u6J(/6EMҧ?'yD;};I9Ľ_|zm?S " pƸ)e,)&0aSWZtfwU3o'?.NGg=|}јV Nk]̶E_7/:eQA&!'  endstream endobj 253 0 obj << /Length 19 /Filter /FlateDecode >> stream x3PHW0Pp2Ac( endstream endobj 257 0 obj << /Length 19 /Filter /FlateDecode >> stream x3PHW0Pp2Ac( endstream endobj 262 0 obj << /Length 1450 /Filter /FlateDecode >> stream xWK6W9@)Q^Z4E -ΩkimdF}g8%9rXE/5q17l߼䆫XDlO.Tlؤ,6|G$;z[ͷ;$Ѿ<J-WMm|Y"U~$u!yԡsM.17K~kdtu8p}_76;(䌥K!/р l{X9+%W"wrU0J]oROu̲KB lF =.E.F!Z 7Ӿ=–5 ʣ }ΥN҃xpBȯWvwT܌ο={]>,HH~ "m_C/>4NYduYx]")-ǿ+IQ--rRiSд)mkAe0t )[=:1Wm]IQq {+ɼTE*cW$3QD&z֜HCQ\#.{]y] q/9Hz+I /mf-\!$#eM@ZU p}lKA<~mH󚾸Gp(V S'yK =i7U|iI{\4!&\L Ck&^t*r T G.~L- fŗsQWy±17~3yh'F!_98ͪ(qJϞof ľ[BʡsG9*["H a #AB@ 2vj 7xAӜHWi ȉO,$q*2A ,2!!me"I}x gE"=\o1) >Fr!IjNhM ?-QJ=N ڎmm}ty0dWGsּ#NofKtpʒN\OķBLSЛZv+3OW %)ReVH,09 RiN)K3'.SnhQmNBGncϩڽ:)l?_XaH{v Y,ewiPqOy endstream endobj 268 0 obj << /Length 1062 /Filter /FlateDecode >> stream x}VKo6WTbF$E=]tSXE#ѶIt%jh([N"43|DO?VwqprD\,DF "veg(l9*ml2UCjOZ[o|{s'"AQ\8 ;TW O!UMWGi[RJQV ݷBV^UO d!|LYxꉢo)IlC$8WRjZ߿*C[]Jp> /ExtGState << >>/ColorSpace << /sRGB 274 0 R >>>> /Length 2727 /Filter /FlateDecode >> stream xYK&Gpp*׵a $#q8#Xy-=g+Kt=3##3k푏/_:Tg);6Y__߼3t|͟^<ۑ?-p6n8?NtDg̙^~p<> Ys93Z>s ;`=M#9FXP;lS0;1/F9 !LpШ o; p`RϞ6ت9y1O#^ppLtU+LEyVbCk8`g,gz /&e-`:xy/ 3“4aqsJe ;TL#Zbф4: #w\IT]w8sY^ē_Nld/0h,sYS8!|VFYOog[k<0h8v;r3ŦXڙbI:5{=:|.`b 77Wt_n R"X> D<6b7?D$i<,‡3\_^aW_FQb}'q͈5m?hX7@b ozPòc>uҞʓ .W 5h r =XJOq>(Ki$qR6 T] 7Kr! ̍ԍxRVEb7b}E)\7K\??+hcAh$/yo0ʌk"n94;e 'rlnē$sf Cg3~Bd؀{d%b9#J r <ְ+l Hൃ[>а́*MIV!1Q0, "o8 {%h@`i>0 Gzq_F>OYOH5"Z1m7 VHq[ ΔQ@I m/ "XZ .#`BH'ݾn;Q'7/X}! ժK0S ̭Gʅ'k q\Q XR2rZ $U2E\y}-i_brS{-HSJ O5H\ΔxNaJU"<+JtK,Eփ)88Sr!;ax ElfJ(iacdVh-S̐=L"v?LMXXK-L>#}Y6ZȐ[6K+Ck0|?Bks] SkhZLjKk[[XZ"76&?!Y=SnbԮUZ0Oi'è¬mQ͘?T^-!X"?q;7*)(QXv&ubFڦ-Q໗b _g΁UȳuT;XCZՐkmBZԐKQ> b\C_x7>MEk&\m^_z|WZS$f[g϶r#H-km,դ𨅭Kx?![vV\œΏ\ڮ͉ن!?}`2kg}ZXbS+6ҲZ6C{%CZ${Zu?R֮W[hH]i0 q086^`镵+b{*q92lt|ӕxD-FðW CEB~g~}`L{|WMǁ~}OqpGFFbsăD1kxę?(Zg^Oˈ:#}!f~; թSXt[oPocBJ|FԮ0 R&_9k4,n]L} 6 3^֛9kMWw9^XZ_C>kܰ ,D#Y.΅ޟ[x+a%>g/ȯ:+{^"5_ۥ|KڑOϭ'Mzk_oW[! ޘE뭀%|^xmx+H˾^akomȋx| Vp鍳pi7/U=@B֤ 4\o!mO[߈Vz}Kݼٯ{mk7z+XzNL!|^L/7ގ/`o 2Ͱ~78߽)qn⑅^o'Hl}`0nFbbzkq&t? ndao{7ouG30d?X";aeSbzt,Gg =pzTcYcJd,[xO?(ҏ8ׇ#0 >A Z}ˇ^56R9T,!߿5UMP%:o,f=`ۀWk> AQ[Gqo_>gϯ2E-PIoN_$~9Ğ="f) hq X> d9`e=`mz `%r{mWJUNS=x6"g甾x+q$ ]pA e _w4 endstream endobj 276 0 obj << /Alternate /DeviceRGB /N 3 /Length 2596 /Filter /FlateDecode >> stream xwTSϽ7PkhRH H.*1 J"6DTpDQ2(C"QDqpId߼y͛~kg}ֺLX Xňg` lpBF|،l *?Y"1P\8=W%Oɘ4M0J"Y2Vs,[|e92<se'9`2&ctI@o|N6(.sSdl-c(2-yH_/XZ.$&\SM07#1ؙYrfYym";8980m-m(]v^DW~ emi]P`/u}q|^R,g+\Kk)/C_|Rax8t1C^7nfzDp 柇u$/ED˦L L[B@ٹЖX!@~(* {d+} G͋љς}WL$cGD2QZ4 E@@A(q`1D `'u46ptc48.`R0) @Rt CXCP%CBH@Rf[(t CQhz#0 Zl`O828.p|O×X ?:0FBx$ !i@ڐH[EE1PL ⢖V6QP>U(j MFkt,:.FW8c1L&ӎ9ƌaX: rbl1 {{{;}#tp8_\8"Ey.,X%%Gщ1-9ҀKl.oo/O$&'=JvMޞxǥ{=Vs\x ‰N柜>ucKz=s/ol|ϝ?y ^d]ps~:;/;]7|WpQoH!ɻVsnYs}ҽ~4] =>=:`;cܱ'?e~!ańD#G&}'/?^xI֓?+\wx20;5\ӯ_etWf^Qs-mw3+?~O~ endstream endobj 280 0 obj << /Length 1001 /Filter /FlateDecode >> stream xڝVo6 ~_G8,G ذuank0l{J-s^&=w׭}ER|qzUuRPE&Ri^ E+ 6m*gؘf݄fI=Ɓ]ػ x[m?6jsqFëLNWSkq]( dS*Yx>͌a]㣶 `9'ɔ*4UIkcx4u%IьԽ?z7Gi9`v慄eax]{ȓ,ĩgwn|{;4},JNqT)LJlfv (~LU 6#I;7D-,yƹd `h <e>dg(/PE,K(2lr~F8p5>`!_qh ~;_4(oТē6W5ApOEM !kp|ۅ7z ;K$ .d4Ê ')NmoO2eEȗHum;bJ1NRls{xKF>C)<J K1OTM\@+`BuH ;ki45ľ8C+e}kZ q 'ލuY1Q^yOo89Zl㠃ғԺ==mf}f.į8~`*MF#xN72 endstream endobj 277 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (/tmp/RtmpnZmxNj/Rbuild6f0944457700/timeSeries/vignettes/timeSeriesPlot-univariateSingle2Plot.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 284 0 R /BBox [0 0 432 432] /Resources << /ProcSet [ /PDF /Text ] /Font << /F2 285 0 R/F3 286 0 R>> /ExtGState << >>/ColorSpace << /sRGB 287 0 R >>>> /Length 12127 /Filter /FlateDecode >> stream xK-qWa0vTၤCf-Q~{#X utsۅ* H_~_O?eݶ?\1to//Gyyܯm{}+!}o~7;q_ߌeߤ~T}_{KIz D`R'ᚐc{=w@Lr'4!QL2N@L#rl &8^oׄ\ubzݱ!ӄؐiDz=&dnkBB⚐qznkBp  8׈Q|[ ˇJ~'|{<\y,=)ܕ2&DzL2 #90 (g$77q?_Nh;$]:< ѷQ.;;~pzUD`-tKA@*(&FDnQ.uzaGhz*}0p<1AGD`-tKM@厺ή l tK+h6QoLP7yK'v*wT} Nr@h tKFBGD`-tKA@[@&1WL2NwT;_ tKu _w( B@j@GD`-IM@~.tK}i'`V hQ}-<.(:%咁 hQ}-I`}ۈ }co bDКvdt;#}_ < ALRHБ7"_P}6_o:ӈ [s b/]7vkB5'r0e\/HKƮsMzb^n~6^;uiBFSיFݺDK7FuiB"ba׹&zAl^ 5r B5 wcd1h&d'?4!WzAM9AՑ4T lr&-Ҟҗ~~Fd8tѮ 9;@#'G=Є\#& ==Є4B[ d.ex1& )4!'yMݢЄ\KC׳|ЄTB/O iA&kh"Hx-%~ThBBr. φΥP!*4!7yT S^B2:{׈ =Є[^Br, φΥP!+􂠗ЄTB/Hic?FWWwko[ ɩ Š9gC] )y^Brz蚐NXA,4"DG/4!;7zA!ׄ숹&bG5!1 BkBFrMHc5!éL/y|9C &d'/4!'9bĒ:b  MH!G,H/ R? MH{DL P44RBr# XhB.rBR^Oׄ!3җ):b 䈅F5ЄMA9M^t8Br/c8*$ i䈅^1R׮uЈn GhBx'4!9 䱄#>IhB]^ لFdx蓄&d'#4!9Єp#eA:uOzAje.]wPhBx}(4"wB/: MAGA#4!ׂCwhBvnPC 9MEwhB ޡmoNv`hBġ d{^v3pH!ׄܐkBNC/ޡ MH!;`?4!LЄ4C P44Rj5!&``hB. sƿ#  F] KCP'&4"D$4!9 9 p&"#4!7CR' 4Ԟ ulB#v B⚐5!'_vMH!G78r#^ P}6Ԗڣ#Єn3[rq ؒK51yZ!'~8e"A#"x!A& "B+",V!A|#D>0͆>"<(V_e_^l?Lۗa|_|7__8P]ǁ'P}?y1^_+Σn2<~.KVy"w&=G g0+~o~}-sdLM_o/5g2FS>Y2_uWdv̒?aw <(vLlyQ39-Ϥ~řHsʮi3IVOO?c9 [Л-~o}Z8e v=cn߿_I&Sn~^>~yM~f{Aô?oE47 @\f4%ѠtW??ɜtH}{4a_3!4Zo~4dH''/<+_>!;'D B5c}[짯-vW7|c:oդصUbS..e1G^He[_o[}UHi!ZH`ғMKmU/-O$}xS-KbrmlʡR/q7y=UŎiۯ}١,wW}8g;mg[eG Cvqd=I<<ߵ/7.7Ů唖_"*m ror#bqݲo۸W+Li67 mI&W[~P:*]+YvkS>]7.Ůܮ)o|nr|Cmr_:|?om>&}8"Bq 1Zbjؗjܔ7q*ܶHbmQv1޷vs\^ml]oӶs~w6hvXb7l߶^-g,Pp6U/.)Iz<|N-w=/X=j [nfMSq<ޞmKͅ1i݅էJ8Cb`̞IcGݮ~swm}lxߟw-#7ch2[n+5o{}ko{n;|>8o-og=ܸVtC[Rm߬l~~Lr(jn.rxc-~]Ѿ;`wwl }Y^}x/.bubTf˯/vFU?umϓݵL߾u Kݯ7%IRw Io71^Dy}ԶE(@emRm0Tz|[O3 aG&|}w2ky}79}Mw_+sY]0ӷHbL˷2>j ^~bjߓRrCʘf,H!2ǴG7w">\Hxo>v1u=OeoE޺L3z>gmH?{3rYO#[W ̎ﰕcݣ}?{ @ ]";LHaNC$J߷S1|aG&s8Jr{Br}qg >Lkz8:лט&Z-)_߽?dks3scixs+Z=-Ok6}MhEC8?̀r*磼CoGbfؑ=)S[~%j޾]gN$ߏI2NmَGjc1?I1Ebs-ØO#0*xL|GrxL#/ 8$y^WyyΤ-ވE.]U$E0#b?Hv̶D[ jG6ZE|#,l#bbܰqߞE\ǟsf['ճ}KsFu~|=*'7%0?xFT>/KhuxK$6,$Ӻ7Zۏ3"FiF9=(9E :ܲ}A<|<'gLm<\v>֣|Ow=^c-=Yj@ͧ's05F_+a [F?u=N|:_ D Db DI&bz1M&bL4!iDܿM5!M4!eL4!f8O4!fM4"n${#O4!iBliBQiB霈iD[D&װ=)ܕ2up &']Knn~4΀&nndl91ԝeKp F)&]KA@厲 G K41ԋtFE&r1PltPKa. $T([@ L%4xuPu(]ȝ n!88j'rGق\KpI@h2\\KpI@;hK?t1`rr`3KI@㎲e _ |M%иly|.Pu. h7 & M%иlq~.\1 $uw-O% x"@#}[Ak 5#}g yF HF5#dR!Mc5 0Ќ􋑾t?D0, @\3oFuKkD4׌pC!:'5 Bn^"1җ@\#9FD>qH!?5#Py6t/ φ9fn,ƿL$4"; @\3>@jDQMWGPy6TʳK{K_?gKHhD8IQjFCJE>RjD 9A RCSJH#_)5"ԌԓHhDR#rהtR#r- ]φnR#R{JOiAF[(a$C"EA?*5"yR9gCl?<ԈTR3^UjD4 ׀XfDB#oR#r, φΥP!+5#eF&?+5"<ԌXj@,wn"ٹЌPC9 ŎXhD ;b!G,4"kDG4?@\3B_x2`"KI/$XjD.rR#RKH/ Ԉh" fꏆ,q"9KIXjFKEXjD4y׈!3җK@y"& }u<7s"c5y,r Iy<{*d{sZi"h{F&;5"lԌ`?5"lԀVFd';5#PhDEwjD ީA;5"7ީOH'85#dd}oDB#sCB#rlԈS37'V;rS?5"LԈtS3nF7L$4";7lԌlԈS3ԈT2S#NH';5#P4d&R#rR?5#OE~wP?5" Ԉ4JJH_φ:y6X AGjDNr8R3GjD.r8R#rS?5"|Ԍ`zWjDP{6ɳI m&HhF_B#rpF]thD 9bőԈ GjFl- GCn"KV|fKg_?C{ůwYR:6Gٷ|)^|Iy|ЊU|Gp'"ăaFL.D>x! P]vů5Qů<~Vk>/~=Oů?VXwn'_L5ܕOX_Aן>/~|&__g<+^3IV̀h,|mj7YBIn?Vy߉.Ţծo~,Zծ 9iL>djS|jYs(lfI͚!2 7K ny 7K n> 7G](,߅](, 7YAftr((ܬ 7p@f 7K. n>Nf[EBfpd@fPYdff9g(ܬCfn>Ψ[1͞S(w0 79Cfę](, 7ˑpP.,,.PyJ͍(,PY$n>ʉԼEBfI@͒4`~Wwpd~@f.ns͇p{͚2 7Cff9g(,;PY:rpfAfX9Go{{*xXYSph,Lzpqu*,Ws,| 7 s,,]/p&$Afh_ cfpne[d.cfXYx,ܬizPYpacnI,,<n6ɔs,,!n7XYmg(,X>o6TYXph,ܬ9PYtpbfI͚> XY~pdbfI͒Xuߕ$AcfI͒YB͢piXY ,,XY>ͤeQ AfI͢pXYpXnԩpK5bfڀuČp3h}g۶Ecfp_^i/u{lccߩpo*, 7y=#s<i 7뵭}GoTYn 75,,cf9nϱp\np<1큈zVy>pnV7 7Xxk s]9~|ˀX9  7_SkN\n9nrYXY4n͢psߞ(?yˊrXYN 7cbc|?z 7碱ps:W'K3 7i{.xZ~gyiaf>nNEcf9 ,ܬ s, ljiA7=O:AOr,,_ x"sٞrԛ+nNߓXY4n 7i թpKpn 7c乺bc= 7?Oe`7n*,נp,ܬ(, 7m͢pt3nۄs,, 7m͇8PyEu@fmSfК) 7`(r>X9I},ܜǏJ2̠p38 7xJqTYn1z΢y!5p? ϣes~t~s~lX[ps[<)gmp3it*ܜ1:Oa2[ 7Z2N9,y-;󀅛s(cVwr!TwO^/;^b]P16h.iW] J愍:lxQB S}“_R{a!>Fw]E_w Q׉ңkgWZ:9OyN)Ρ,iAŪ~~ռv2ŗ/Ɯ)#Oڳ@kGuhFf껨iR#>r'ŚL 5hVՙȀơ5LJ}!Vnj\h*AJ  Jϕހ\Yq̓ahLG_* It Mo2vw %@^0*͚6* 峚1軽^$lpz=G}p&B~OWc$aaM̒?&uSLKqOinCO h>U\.AzD=Ld. ڏ4},-z ~fA!)av[hav}.˜-NdR0s@k"-|hE8Q̳M:G"1"UJS1Ȯ=ig5 @MGsk6dm|ZMVaQ1ϐ?#kGEn UO?-=A`0}#"kcFzCj^r5jC|gNy٧j>ɵs)!1]g]P)Ӯ?b8Pqk a1Z0q#!^T;4$e61YE[']~EܻQMRm)]|{@#U=G`wv}r9m:_k5uz1gk]R/&c>7DŽ\ /F .r KJU^w%xlx׏ǡ_.kn)Zh]/Tb)&ڄi*qe`dsvl_JRnQg2ĩ]|kMbMҼw{Ol] `npءn#*ޭ!]s<ۏ4^}&"ax|t-A}^6{RntT eLN+>AIw 5 n:Tz;e̮4K.h8*u*OcŒyCB2#j>64N]IVEO3/ZjZ#&-FH\NVogo_ o4+a$<+Wnc2\&/͟x[hQ7q7ϴDڈ-C }p34T5F8c+~aa}KC ,Kk0Eq%ܺ9Zl 0ky(Fۥ>ohHNs17(n$KћA~zh0<^Hϡęǘc#JyLmኊ*!f SO8zƫ'،DGMQNOUB嘽qj$7<7,Ǭ$Rl_|x4|l(gWK$Gm>-b+ HO LKlw>%l>]dl@u';xi(@,wrw)-LY'DArW/2,S[962=cGD@dk*9IooQPr=ɗHRp6ȑqz\->aaO)_~aO52==欚Nv[諪>a>V3|p-OwS0l55*Q'cFzT0ئ>aġDW*heڈbʒ%Rpf\ oZ إV|Jl\:vu)%q^{ 4/+~~0d!%煼O)_?we C2g#&3;"i3wnn&{G8DC{^~?Q,l~U Ylc"}Yt0?ǦccZ| mwDDe+zu%3_sE -[H /BvI&;iٮ endstream endobj 289 0 obj << /Alternate /DeviceRGB /N 3 /Length 2596 /Filter /FlateDecode >> stream xwTSϽ7PkhRH H.*1 J"6DTpDQ2(C"QDqpId߼y͛~kg}ֺLX Xňg` lpBF|،l *?Y"1P\8=W%Oɘ4M0J"Y2Vs,[|e92<se'9`2&ctI@o|N6(.sSdl-c(2-yH_/XZ.$&\SM07#1ؙYrfYym";8980m-m(]v^DW~ emi]P`/u}q|^R,g+\Kk)/C_|Rax8t1C^7nfzDp 柇u$/ED˦L L[B@ٹЖX!@~(* {d+} G͋љς}WL$cGD2QZ4 E@@A(q`1D `'u46ptc48.`R0) @Rt CXCP%CBH@Rf[(t CQhz#0 Zl`O828.p|O×X ?:0FBx$ !i@ڐH[EE1PL ⢖V6QP>U(j MFkt,:.FW8c1L&ӎ9ƌaX: rbl1 {{{;}#tp8_\8"Ey.,X%%Gщ1-9ҀKl.oo/O$&'=JvMޞxǥ{=Vs\x ‰N柜>ucKz=s/ol|ϝ?y ^d]ps~:;/;]7|WpQoH!ɻVsnYs}ҽ~4] =>=:`;cܱ'?e~!ańD#G&}'/?^xI֓?+\wx20;5\ӯ_etWf^Qs-mw3+?~O~ endstream endobj 293 0 obj << /Length 1113 /Filter /FlateDecode >> stream xڅVo6 _ajՒl>nuذ aQr#%q\0E?~$Uob~'E9+TcEXYE?]ĹHß;%C=ښ]$4|!צ^B 9\zd(U!Q[F3f3Ⱥ_MRҝiv ^wҚg(/ǀ: endstream endobj 290 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (/tmp/RtmpnZmxNj/Rbuild6f0944457700/timeSeries/vignettes/timeSeriesPlot-multivariateSinglePlot.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 296 0 R /BBox [0 0 432 432] /Resources << /ProcSet [ /PDF /Text ] /Font << /F2 297 0 R>> /ExtGState << >>/ColorSpace << /sRGB 298 0 R >>>> /Length 6675 /Filter /FlateDecode >> stream xM.QSym"@RXBDH! ԩs( H9n\>WO~~ۯ?=}R{fV>c>?|SYL~z{ ??{}V㱊5>}ζ&̍jNޡSK(eOv3\I2ڔJ7ʙ(gU OOsUQ?)CB5ZS:%듊˾(G߼nȕ)@vB'AVܼ˧twQM]Qm=Y' *y|ٯNtzX_]x!Jr-7㶱]7jkjV]u.(S[%wr>;ߺ#8} =()]O;F|ѓ:-ttux՘uE~*:'C[9'Bߛ*g A9oD.>_ fKE==7K?{@ytA.SKЫ]_"LL0n/k^^hKFG0`zڐ u҃ړGia6[ٞ~f{ZBx2߿rf{ͭbXz{d`Lo9yoAG4bQa3Y%yryLV<tŦ˔vOdc.6}Bd_5{=!g:XrADEKBZZw^mQKԍ@jۥ'%hvuم%$$n sĕ~ XT iǮV^y//!-6 Zb4ByB)Cts,DI~j,Oyܼ=1&Uæ`/6ەƆIhQyT\(+է6ѵ[N%FvJl #;&䙰uLѲ ȈmEQxc! ߛ}7xW16<_A"1NNŦҿ+ɤ7=JOȌ ߥy ɤ@nfJoȳw.4 /6My יȓ&A,mVГv6}ݤ7 ˨\hV}\H|Ŋ6.ʘ0^\ ޿X6Brrzb+·؜p-6 .. uBR b[Լ|sCis_BD]aa^ eoO&eҿfĶߍK -mn|LBXheM.$>ub/ ͨ_Hv43tf<3*tAŠо0.7k,rt5I$ii3/Al5=> دMi<_zxrE#>saUkԱkҋ3{O>ū|~#僉~|ckԯɕV6Ddԅz2d>yqZm,(Ւqƹ2w )[ظ{лjӨ6;6Gnm,=F̚16kYm2D&f<|||]m6.[Mݨ76զQm}֥nT6^m,@I^hcX |6zW-%~u,TOxM96ӑoy0>|豮|iZF[__ܸ 4@t>ejkz7Q:*tg϶ʷTo6NɍZ mQpm?_Q|YC#?|[5^l>l_ƻILOӃugjO=Mjgն_"8R]>qB6 D| m4ƛͷ鋞QG/Ƴ/7m%X8'#eK< OAꎥR99z&R35#::0::$:W%X'Y[툥"((΋sl mpܬ#͵a&nW^u5"FxNtu MGxnx#$4O: tmVz''^oZ^5z= w wmwFV憸x}Laul>!"'>[%^d'MA^>3_>gxu xݒkSCY7bW#0M;4ԙWu >G>#)*) ('s{סus>6&ωױ!n'^?4Nx}iNG|n, P׉{m qxtu{ǃp;^ߕ;:X~^EO,՟؁fMx#b/I1v@@r%u/)Xs{ w'9F=߱;QhÏ/DsC@r\O.ywWq'x<_zr_!G :G _<ki"`B# Q~hKyG{3m-€@ݨwm:Jpn'&|&vyF_ ;TCaAJT߻1(?m:"/5(&>ԘTLn"E%Gy%dU||ё=x AlT:HQR[RRTaRDEs~eTÂܩ~iϡlTߛ'Q}tN ꫛ/'_,+Co>TXT2꣘zAoOEˌHR}ד(T'wP}׏Tp<3=T`_ϡx-OI< GoMJTd$OR}ThR+>Bc>^s|RR}ԑ 5| q$O*GMϡh_R9R}N#|G+X;aH \p!aF*Kap>\Tħ>TTa#G{HHKnD+~nu\TUzG;/wS}>ǟLNޤhvROR}t7&'>ԔT TFG1<5!kEQ )0=T>x TϡզLT(,Ԏ[Ry֟TMSI];կ]>`{=GԤkIEE#Շ^9Ty /~S}OJNa|DW8 u+>OHkE-y*Ah!_m}SR}'_) >&G(A%–Tav3 lOR}O#A=KPz_x~R;P}'G~vx.WR}cXnڒ>(|Bv 7[)@v9Zdkסl퍕]MvdekW[}Hc~]kis㺃 N-5;R225 Dl KEwhg:_}m{x#b㍈GD츟KH벹_K"rK b0=GXD(GDx/;8ѡr;;4PK b'|]g>b/Kb?-j"R"GBg| ƍcbG~փzbK!^q,^.7-|eb|K'Ğ;@Y~VBDXM(bE1?b BF@Ȉ+Ğ ĞBa ĞĎ#C:ډSU 'myH#bGa_骟{_{ *~BZbw#$y34r=i|[_KHN=7ؓ!v7E9)}p!v<#%"vi_#/sD%r߱zb ^%b 8oq~a286Ldq/籺:F~sq~q}CG>aב1k}xa_ |_/[盎8/c1 |0} ,8 %2w0(/#'#UG*q~]x=a_W;ekO8_|7]1wq~rq>~hyq Qqɸ&@zaq^?48y|r 1'!8Oycy"uME?9yq>o!M~X_q/^q%a/leTc=y[8_Ë0۴S#4ο[#VY8oٷqG^__M7׻B4c=KN)_y ;"tq08_Sylit2hukeD4W'8bbw?j wHU& R1- vhP}4w.6 18ߋƋmA9\8ߓ+|[_M0wY8*˧qniG vly |>MM&~y4#8M |ӑq[8/|i8Q>_v47,~ aoq&|Xz8 0w_8ߧ\Ďm?d:2|);a > 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 304 0 obj << /Length 708 /Filter /FlateDecode >> stream xڍTk0~_a$CZ$ۅ6t4mQNme]YR+Xw4Diy⚗QIKU\G Z}x-^\ yƒ3Nrd`ܙ6pӽXJ7Cm=pU"WQ-tPV._{(,m&ND)N"LjQ?OR[ӯme޷zh R;G%i͢$RTHeR "R+emfdvN`u;["5 ؜ Huߙƴ1ω5+:;i D@"s\ʼnІG #?AD`޻77Tf./w>2ڻ 0mDŽjl8 ǡ\`æ;N;gyU~Asi^^qn ~* [ \כQD\PNI[n_c'۰P3k#;  P\6;b) n Lxa8HqFx<U'ܬ-Xr9H?`fAeqn8u[ߒ iIYoeyŹ endstream endobj 301 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (/tmp/RtmpnZmxNj/Rbuild6f0944457700/timeSeries/vignettes/timeSeriesPlot-multivariateSingle2Plot.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 308 0 R /BBox [0 0 432 432] /Resources << /ProcSet [ /PDF /Text ] /Font << /F2 309 0 R>> /ExtGState << >>/ColorSpace << /sRGB 310 0 R >>>> /Length 16736 /Filter /FlateDecode >> stream xˮ5q{yJ  x h l4mk}MibWΝʬ_?c۶WXZ~wqc>xckc?,?so>_oֿ\߬wfW.zuwmx sXGmA]BSt 3c{> t Y7C8҅Kq|T(%:?3@v}B%d\Gt9lOu YuhO?2u R.%dޝ~h2VeMK]BQ*uyj=dx϶?㹊xG@%e ?+P~Oe >#P)e ?;PV/Ѿ\}Y\?sAQnP>*TP%%ׂW٦rLǙd Xe JZP]/q*ۖ(SRAI~VPE=Wd w Q/AM%V٦,^ ޺Fe ־<)`x_% jm.'oKGd 8j}^ M%V J1RAIU$S*TP%`%`#(&! Lw!@YYF-q~ܩ$SLcO%Y]F-?TP)`m.0Z V$SRAIH%YF/\e^pܩ$S@8RAI1K5WrL@V"BאՐ {~Bs*+Pאא\ia!9 ![!!\ۅ ͏V:\E']CUC[GE'COӟ2kl5d~\t9}\kHPz1KQUSu"]C!Uw!GH:qQ.:r?t ^]}(9dAF yKs+?t9?kH!>!9~Bۅ\sx+\[̯2(t YsQFGsYGkH!!W#!w!-TH)!BYFKkH?kH/k$GLsQLsYFMkH!ۅje:2z ]C)te:LFOu !qQsQFRsvη _/tTʈ*teLQU ڑCs,#5^h~_rXrXbsUbsqr!-TȜ5dX2@,t 9ORhBא<C2C\OsH{ 2]sIBQbkHjH/::u&t9ʀ#t 9!Wp!-S!E'CLPG6SUrB琽 8B琣 8Bא<C2C/:ʘ$t 齆PRB!y:e:eGr\_C2& CV碓!y(tsFsH BVkHp!{p!ۅL|c9sI:GRBYSGR.ԿL((!uF(tʘ$t uf)tsKsH ]CVC{2BFb ]CʅƗ)c6K-CΚ{K琫59䮉to!kȨt )t5N!k@g[B琣59䬹tjb-]CJb-C[Hk-CFͽsȬt OȹF9C{!gɽCאX!u#tio!kH/ws9d;teV!t {!9C{!gICאX![5;t%]Cr:C5̹w;t ɹwr:t9.t~]r5$ޡsH+wKd:̒{N!Vr9d/wR.$C _/t;tK;ti%Czs,)q2{k@s9d!B9,wr;tK;ti!ġs,w2Z y˽5 -!{t9K;tJ:%]C2CzICQr9d;t _.B9(sY`ar:!5$;BQ]s|zYF6Sm1IrGrGsUsH+?teLd{W2.4^hM2Z.5t9jH琳~iRt@,tie :5^xr59d/90O/YssKrv^c ?!m<|}Car!߰xo8ir7|)[9U9>|wosƠ#|#!r7%Rϯ-9^y?vV_O"lzJm?~w_sYXu^?Ox o~k;~}ͫz߇m*ngX֜oW??'1{sd5S?|mϹUsm@KĦK֯bSJ;Xs_~'կ~T~Ν\;?N!{9ϊʮ5O~N ÎW].\_+9k鯷UZ%Pq]E#:uɈ4RtX+>БV6 7ZL(µ`߶ڧ Ow+Q:ndXB֧lLaZևrU_'%G_Y.mi}j5oSkwkD?weݗB~jmH#V3vY?VvrL΅Oz]Evf+.aSW6&HŨXz uOI.+ma}jMiH,5X!ͣrо6>s ;O\wug1/olZi7ݩ'~yOZUx籄 X/ipősXizseVĸ>8OƬ o*.U."Q:Zqj Z%?3>c^/jKx@|>cނh oߍ{Ùg;I-[(O[7\51 rfsmu{q!\gҪ>jky;p[fxT{pYZ?נmo~ {1a0|r0;?z ^Ág20%[Nj XʫWˬ쎴*WKE}ҨIQP7=S+VLDžJ%_ZQ7Z>azXw 8.%KzG,?ϕ z<)tq5 +~q,@S6҂un\w3b@ّt;}4\ğaӯɜFN|q>;y-~ޮף{ 4}.jkM&BwO~'uGֺ0 \6ը}|]I,F޽~7q=_rtO~%70y[Kw?,ˮf/Y庶xi=᧶4OxiC3ߑlqXyo?;?:=؞_z[i>Ytw ` d'79yמWhxz;ǁ2qz<Қk#3Kӭ}6{񀼳`y(kG<\)(]~hnUC*VB}Gu}-wR@}?=tW޿Dyc3?=3&V8?\KK=JfMpfa+ehȆןY'-_n̷|>Qr@|_88N/].,6pQ̇K|pZ~vP{~1p{*݆U{gpɵ|4zmd̳|wfO_7=sn\&gyxO >tHֶ+FGQP[E;ژzϖGd!WyXcbS3+ pNk53<{k}YYOk^4a W@{:K o/eK5;8KԊ&ǻ;3ORΦyodc2Ԩ-ߝNWnȮQ_yTr}/;_(Y/jkmX3/32F}S 3l:sƒs"Ǵ+tטҳF}o4&k}<ܸi@5̫W;u_ 8{vVtB:^٭c; g7m #g_l|>D2@n좿ٛrvk$$g_t>9L%gZrIEneG9g٭K>ovzoJcrɮ}^<ě}oh7rv]%9dNEnMppvC+8dG+Of#+G.>9CC*(<ݏ::,۟ bq!onx8g:'gpvK?g 0Mz n:Q>_RxKn7 8]\ ҟ{rvMpHpvK gxppv;$9kpx즛\89j6O;8Oy~ggݴH;g'9"8\y^9 ݮw[_+8} n;gw? +9;'pJpvK?#g7ݮWpvK_8\얮z%uWpvqoO\#gcΏn2ݗ`g9i^g9ggO9wvGv}pKpvKM- ݎ;g@&=ًxpv+_̻Wpv^tpxDɩgrv>?{e pv+O٭}<8Wޔ[{qd>'pvky=<9{[=&9v?ިp7qotٽ5g]y8pw=GgvS|p !8ݮy pv5pv; DŽ^Kp~_pv;.8=qs}M Μ8}8yg?ܚ'g7\ 8 xFnhcP+8߯nWv>rxMv}pv;~'ny8y9ǃ;g7|%n8(98Onp78Wpv?np8 n4 pvg[i{{{{Gg["g;Wpvǁ΅ 'C8Wpv}٭~0ށjrv-qv{gVpe^O #g9=qwk?qn9mgpًO]߯'EpSvyypSpprvc58u}qpS{g7g?-7wn8 ~"- ~ 5svz0~nG}gO*-\6rQpkcNήd[<ݾv}o;gxplpS>7r@pv٨|2gOR݆EFa>}Ҧ*>gn=49g 9da}^3gg(^~v&9g>>!>otD~vT`3iY#mi4}C>1}ד}⡒}] 9{g F'V$gN8{9{Pݎc-'r'glUg4#Ͼ-;:#qM~v6N/?g?Pgu*Y{.?;/rnlE7Dz=hoݽarca}pUS#8-թ]g% KϞxpmwYgG3g/=8=\~vߟ~M~Fpc&?~(//+?{c#?{Ugo8K(?Jtgo蟐 mҟK?{c'?{#9?{禟џ"?{[XIgo/i~F?M\~FM 7qI5=4쏆ҥg8F~v.ݴ^7r 7Iw,<y?wgσ|~?;g7L?{;gogogMܙ~GM?{kx?7go亮 _l/gߟ~Gקi}9{_D;٣7ٍ[@'ߗ~(_rF8{M~y7ٛzU3gowq}?烟~]ܚ~&.G?{~&F?{7yǦ]G~&8jgo{CZv:}g?{~&J?Ϯ=gf&qv9KÿL?7gW(?ˉG/?{,O5]#o3?;k~vϾ|H1pGF$nR~vϾN?&NI|o؏~~x1rGnyc(~vgEy&ٙ׏o!Y~rd}g_~Ϸ\~vrkG~g^~vϾ??ߓo5~x~#mćY~v.D?)NN?ӻ~vͣ~ɏN?[~vgXgg5yO~v7stӟN?MgGK~vI3k=8>gϤ_~~nz rSg*?5>]s5Ės[~GϞuO]gz5ޗ=޳]#q٣|gxT~vgkzgW{*?kcgW{/?y 5~ cٵE]Dk|+?hIk=;vC'8+jogC?xvg =~vok/?{?)ތ~Mwac~wDg~ N?{-2k<RN>F}9͎#{7?Fڕ17n->+jl'o&4m}^E? ͯ1};{CG#=g!6Y#gm?3GzBeϷ>$}=]>˞n?ҳ,{ !y˞nΑ'th>$#=_r=ˑn麀d6#=Or'! 틞[ֶg>iI;/zx>о>iI;/zOڡ}5ޡ} h_hf:;5no4EV>齴E疗>-~ooןoן'O(M?}ѹ'O.=}ѹ Oz.рI /:7IB?о'}şowW Oڡ1ZIz/=}[ށ>VBG= h^zBE瞂>iIY?>'}>I;Ozоܿ'о_'}>^Bg_ hQ BsAhC='=KAht >K{Mh_tn &/=}Gi 퓮=}7}5'UxB^'}>VoBkOhfI諒&/:ׄIߥ&/z?5}[|M vht']|BG]_S}BG^I|>YkBK<}gm?.'}M~'=k hQO@~]K@{m?퓞MhQOBs{Iht{ӽI~?о~'}>M~'>飴Iߥ$Oо?>齴IoWi? '}ҽ仄E>'}>黴I'=KIhh@h_tn? 퓾KIht/!}ҳO(/}9%O..}љ'=gi >J{Mh_tn n%%/:Bgi .OO.}5&Ozx@_ڇN#}pu{}?4wV_O ISS ᠍ `bNt NPPڕ-/]'fl?斗Zja۞xؽ`ݺ#KRt !o58:|y0;|,ԺC ͝|tC6Ecvr*kM2Ʉ]/`醵!WH'ͦo0tq%#3{/mo7x V[N4~p":!b\-؟]o0%n yhoý{UqQgpww 쐸sǡ},[r= Kʍ./=,TIgQ n-cqhObwU|S}zNJir|fd^Sؖc~7{lFՎ{cջY783i丢3=E Ӈ1H%䩍Q./+cpQp~~%nm M\r9d_M]oJE\۽][۵#O* bop5Gx7J4~}Wfw2('?ly'[@lq;cnb yծ6F+R ړ|s |ڀ8<\@?dt'͗w/|n>pTռgn"Ql2\cݧIu]t/aۄ~lY:~z⃭asq~x;6\6fdx;msԝrUv;a[Lk(Ӿ!#e. i3ќ?~:_b,.>{ISd_vD;\gtu7<Ϗ2ý=6o"lw\1MinhwMD4$lr.UFaۂo6z!fTo\Tco OI*ڹSa]u&'$6UQwDWÚmL+޹eırO.;'Hq7Uiպ68mgv 1ƵQN/M.?|=YI½z؍S7CUp_pF琢nؐ< 㠫N^(=,?rec9sۇ(<߾I9[;pln F>'nI5ʮ-W|ɶ\ȟR 1#6zB]7hEu|l=e  5M$v?[dȾ't%ݫ(w2|)؟u/:nsW?F/ |C  v|sBwspzϫ^<[?dw ɡNer89~1f !Juڝ&H]9a||97 Я9/~6Eƃqr|?_aw?NZEwjGͫ-yUtj>8ӽb+}Ҡշ bi[eI a5_K|mS^`,CN %R~JtalWFxϋ #P06p~a:-Sh}58B#M,c 8Icǎ%0bh igeڎ*9Xuː ;Ƣ1X>0nܻFȃ]{HG){pmy`< -}6鴗䥝[1qhkOm<8;gӖӋn^ؚ9ŇQVXAUsn,ߊۺgX8we9KGd=TzvO?]L类д!߮gv>;Ȳ\  \ڮnMBVwDֻvQ&6.η[xNuҎĮz|ۦkkP~{ezv~m`QA8wvClvv20|yޑ{6}kw-;ȴogTxS ݧMđu#mk.ÝiLjMpUv]{CW}N5@~DnIGhk9DmLVS;ZrmYW1wnζĄl{jm{Ibwɶ+ڝٶmO[l{$U[n{7`η-Nj+*"+U%>{j`nuܓ-51'']nt[Ou{ϒX<~>nhdЎ]a;Nځ?ix{χ7T^@o{W`oy}4g;'N¾@}[.}Y=wCoOϊo?>^]'+P%c?{PpӨইʼsKpZVM0nǹpSڒԝQ?89q n)x*!B>퓲|CqSM*C>qKh14n[MK8}=ɡML"H}CwDn3H+ŭ>z^A|ߞZ+cN88J y=8>+No~Wt<z/~rHn$`T@tO]z<|->,^IqnnBVG!MEg<4?@ݾ?}q.b wuHw+s`u.m_qgA[דv^k^pA*! (>ع50?ס}Wۀq<;g"8%@?'KYݎ]ߠQ@-~hko/~6` 176~[woXw;Qv8z J]n[m}]C^ JޮCx@y\7}@=Ҿ.|Y!˸goz$+ϋ]@}8/"V?1%(o؀[7ا3@^Ȁ|3!iH4K|+}C3 Mo?}^ڌa^)> ssY? ngl}i>\ps;n7Jw/ܼwdzܼMP杜<"qnQpNnzpζ\&pI'$yܼs n{8bl9pin]le3ls'YOm}p`탠퐰lӿ 6Y,- l')>%Z/Z9eNYO8Zuaن3,ۧX<@ ޹zˣ ?lHBS?mPjXSlqò-k<-{lwL˶Lʴli>de[?-rӲ}קe+a> 6,'A-'lwYAP$KLfв}`ӲѲ}qѲXshٖazc%,țAg1-ۃ-]ΚC˶,e[&VZnȲ݉i{3ivl7퐰l7XZɲ7rɲ8+Dvce òyZ&`bgPx! 8Hj ъen`:G =ߎnoi`A=؂zUAQ"y7{ VӁ޺B=w?i{rZqy [ΉtOws_gSsݤ܃{/'㶯qnG{oG|{o Hۣˣ\rO( %K=Ķ4εG'xVB=Mbֺm`m=$_X{ke`m;=oھ}AL ^T/nL[+!thγ\ -iv'B,[ ȲQȲ<%/PVd]QE=pz {`%{(`?u~= Q^mxOx]zȑ[Sہ7ֺCy:Z=-jSSmZTdedNx^O˰l_UVZв}=LFSmQSc>G#,I-zi٦lee6lҲe~YUl&òe1a>цeΖm3-z2-ۺɰl+в}=δBSɲwOlҲ}X 8);ӲIDz sXA h欫,5lSo۔e0m>e(l²t˲inĚlBҲu?lgeoaekdV̓Yɲ=Ih~!f2;dٞDl4ߛL>t3^z>ۨx|Y|~@ /ןPHvvTx֨zT!9vt'?$lowߏ\ `<-+;VKyþt9`w9{tBL}ngw|ڪs/}g]]"^1˒/wVbr endstream endobj 312 0 obj << /Alternate /DeviceRGB /N 3 /Length 2596 /Filter /FlateDecode >> stream xwTSϽ7PkhRH H.*1 J"6DTpDQ2(C"QDqpId߼y͛~kg}ֺLX Xňg` lpBF|،l *?Y"1P\8=W%Oɘ4M0J"Y2Vs,[|e92<se'9`2&ctI@o|N6(.sSdl-c(2-yH_/XZ.$&\SM07#1ؙYrfYym";8980m-m(]v^DW~ emi]P`/u}q|^R,g+\Kk)/C_|Rax8t1C^7nfzDp 柇u$/ED˦L L[B@ٹЖX!@~(* {d+} G͋љς}WL$cGD2QZ4 E@@A(q`1D `'u46ptc48.`R0) @Rt CXCP%CBH@Rf[(t CQhz#0 Zl`O828.p|O×X ?:0FBx$ !i@ڐH[EE1PL ⢖V6QP>U(j MFkt,:.FW8c1L&ӎ9ƌaX: rbl1 {{{;}#tp8_\8"Ey.,X%%Gщ1-9ҀKl.oo/O$&'=JvMޞxǥ{=Vs\x ‰N柜>ucKz=s/ol|ϝ?y ^d]ps~:;/;]7|WpQoH!ɻVsnYs}ҽ~4] =>=:`;cܱ'?e~!ańD#G&}'/?^xI֓?+\wx20;5\ӯ_etWf^Qs-mw3+?~O~ endstream endobj 316 0 obj << /Length 901 /Filter /FlateDecode >> stream xuUKo6W{%R[ E lu{`d*VC^CX*|p^f89,}5<]DsF,$4o!'Iov7 "!%|c*t+P۷[iV&B18m\ tnnFWƢQR]?CZ?t9lHU+ޘ%PQNC$?~>,Wm d2F)&jh7,QAq_o-tɘޤTn<'Xc<]&`Y?LxWw$5M|^WoSۣШcx w$\VƯ @=4(Q n'yk|>à%[ArC'3[@Z+lo^1Og<  ɍVAKl1|tTT-*BċNFrpBEm .Z M#wd Mt5x> Qk?&50To4^aK҂/i~ KzU2^XjZbþwn mQ%kHwOMx;#Z_V> /ExtGState << >>/ColorSpace << /sRGB 323 0 R >>>> /Length 6917 /Filter /FlateDecode >> stream xM.7R%,La{r$0,Sw]Un''!NrvSmen?m׾o]Σ*xk?lulujw_oM緿vmۿwwoowys;K>u8k?qyjގjC*2&5.uq}!v5_l6[fcݗm=̱iiO8}Tɬ}T}Շqyaqj|n~jl[0o{F{znu7_`s_5>+˫nܔsoc~mz~n{4v]~3f)Os*1uo_]/8Ӝ20=6lcxc\fλj׿*;ƽ˃f >33W?vu\]0a{!qv'<1b{s{({rP[< ߵ⮰e[r{Go}w;l< qGe9V}=҈ f[vO1JX( Da(n_7=N뺈b"\'HNۃ&,/oKu chZeOcgXoj*bXE=l_E/V?/!{*Kvmenr{(,dކ+P\D ׅ>] 3BuK\Ȯ-keG^-#2}nWˮeG]M]"ˍjְ[FeJWnd-=6hşkc+~L|k,_&c;aYͅ6w%]uiath.Ƌj\MY06߶z-#z,la/zz\mK$^6U{պA_ gFպWk? _n?,lzi=^| ڣ6_y6D x@w[\O=6ӮǶmi{ 2uGmx멑=pp\uG3e7[-qo- 9Ajq=t?(;n_OU 2؊O ԝ?ZYO>o?V~ qa}4z *s-8nK]m|0"?kǒ׆c򗹑qڸF棣}:zlalD!=|OvǃaI¥QV98҈(?g+7"?b6? ?4죆j?*A~lio־EBxu%Ma랟ɖ?lZwړ?%ɏ-vVX=VB®,mcWL3/,W=z"SVg%~||T5<=6YMv۟x<~Nq>Q[Oa{ s\mw=R]h߲9rՎRb9K}ޝG]ȗv_?x|֗j?^OF 8^ї]m>ݿg3| 8/˾qaT ՟.W=K[x?B2qx+8~޸sY/B/<}?|µ'uzFǩЦ~-7z|48_RUذG_[ =>C?[qxl\o =W_X=^S:^:zc?Yo9:z<_Y!>Fj>1σzFs+ 8c?_nFW{Pgc>U!WG>JϴO[ͧ۷كvn+(gr^Km ̵21j, xl7?oV<+mSԽ&Fwoj/M_zA-7kuqsɛ9c}ſg~M$լ| @,*s]-A-m_󬿜E:fj,J&<ɓ@վ(=VM-i+dlR-ynX߰,>,[XTQmt㯨uR LZ޾Gxn-%3,J%ZR/,J%Xj(]VEs.,]i0,ڧ Qr`QjO<â߀]Qܓtvxn֍?z,J%e,J6}걞`Q*9?,J rxaQ?+%,J#`Qa (leWi+E kE$N<âtÒ-m,ߗӃ=¢t' Ǵ4>N,J%y >,Ė,J[EdJ]džEy5](E%XTiE}`Q%jGɢseQ3^EO=xSa(_,JgL=vC`(Ϻ(/-w/X/qEæcsSO=z#^aQ1E4r=EX^X(Z/,j6YW~,J-=Xr}edW=Q?B|{`Q{,Jai(ߏ`Q9RnE)L`(]rLz|3 =zM =N^ǓMx+˃E:*/,J6B,JzJ,J6m`aQ5x(v$bX(]cٰ%gH¢t-jEib}¢txEd?/,JmX6cOX}&vb¢tV/,iRߑ2ªcۖXúaQE3,=cE)E)[&u,JEB`Q_#,JiF/W<-aQ,?z =zك%¢t?E,JWE)+lzcǫ)ʷdzXTPɢljEW+* ?>AQkXJ۔fa o<smfeR&/F~,Tfq_|a_|37?}O.?wX?~u]-?iE?C~eDYrХs+wSe'(W~oj{t -?+ӧҙ[wH=lFWFlqiP뎟´HAZ)-MC) V%Β5US}`Nm[H'}I8 b_K#b(C< A ӖYb۪D喟ЭO WUjF"؃h>w_Q\uoz=V9V߾MfղD_]ZM G'W/ U=~gU-QJ =EATiTىOzFE0ƾTT# |J1&̰6H¦DMͯD S# `J!)M;OLi4`JG-)MОM0\``da/g0@c~SZ THGBUO~'L;_6bSݏ 0eS0U#SZT `J)00Q(t|?do4}<.Sz0.GR? 0%`jmc=?Li~0UO0`7L}%~#P``JX @͏6!R 0%]44#?R0UJLɎ@9LMʏ,L飸hqL0?fLI/X0Uj` 0g7j?vvS{L>%^'TSZ StOK;S%J 2ABI3IH΂H)+X>-ypOKQzL_<2m(m$G(}ck~WAzyAT3n0(=hAPJ6 lsU9z M:a^?Y#G*$}'OwzLW2 <ףB+jaNriO87G~nR M"450@Iu 49*i'ˁ}Cz7 S&z$"bCr|4)|iR:*RFb6Y$yw\`%i*ƙ`JT&R J@Dz$/"?z~ MK[XN&JUXr#TLF4)R"l@׃!D pK<%R?8|4-=Wӓs@GӱLI i&FB6 B3Ш'AlĈF:LsF|LТC(HqG)T4⫾ E#~hvH6WG$5sM*"6=◙mAiob[ M=>m-|hn4(|ﱂD!zg{1mT6 >-*i|#iG؝sSO+oISKq6M:H;v>;;C3 >S| wËkM6%y⧶Uv~iv$?}L!:li.|HK|$>TC?|4U{Ca!_>NӴ'M=r}t:_!‡d3~l >k 8! >$~‡~wB!4QG|w~{D`!{σy.O)[o?ו.QV|H6S,̢~?u%/~%/2t^$ŏB9)+<6zڃ'WC'?E+LZɏ2}Z.sRqny./e,vq.` sm YRk30-n=/%/j"ꤕ/rug~ Ŗ%} 159VU6HiOQ?J?U~|O>׃mvѾ >EQ,dS҄!7|喥'viuwqnzQ'{?sӽ endstream endobj 220 0 obj << /Type /ObjStm /N 100 /First 884 /Length 2074 /Filter /FlateDecode >> stream xZnG}aR՗a։\ &0&G x~O 4% er =3=u9.e+ :E)%١ *LaQ$mRYF(pJQgVdI:t0a/3JGD8Q:(؂E佢h#F/{ڤD/)0=StHy!C^yv |ʹ" 6J'MOECq*Dt!F*,EaC/JhkTLA{/Eq k8s01`N/L 8 с(B8bBNb'Rѓ(A4 %fJ)E[L'pKOV&!QI*N&(ZR(o*+p ,+lū =Vb kdY=Y3 SE =\$'ar<+ XQQ*2Cy['p#ѠEU@EB2bêO+?ef2oWy"0μ2g̛fT0>F]?@-.B;ߗ`mN :4]OǒX] E͞m,[Uo_zCdl5^-=hAœv;/ٲC%9RPT 96R֤Ii g^RKe5rW2gxm3[.uo/|,RC3/ڏ I.`,u=P]x<I*u(ԺM7mشi7i3_֭v=ihDR\ uD:po Q iLD?a!2(h`@^ A#!X= ,<?=׊PdwײM)(ihY9dAi6d$Ͳ/EM_?AJwƒXPUQЙ'R&;er&C1H^'j1 Q@B5s26d`Fm2c*sW8#E,9ÒSJa}A''8yį!8J/@ 5#wnnkn O3i>ʐaߐXCC yR,٣~o\0Ӂ0A,YGB 8\e`q1ySK8d9;,xF};?6-OIj)0]zHVn2?7&Ei|LjQ]Fx2~ڬ¼:;鱒kxl1|ru@[ Lf*jʹZ*Xb11ԣղ1|6r27ۙy?o !hCXLF+3ǻFNO7[ͮfZngfT|t K'z |l|?w=2ū)pv/\R(\.ݳpy{ELo/yðQa*<_ waHrz}P!G+}GtT}T#RnocBHTvcr]\^# oG--E|tp>/ 'k+|vtqq/@\xHx NN/ܴ endstream endobj 325 0 obj << /Alternate /DeviceRGB /N 3 /Length 2596 /Filter /FlateDecode >> stream xwTSϽ7PkhRH H.*1 J"6DTpDQ2(C"QDqpId߼y͛~kg}ֺLX Xňg` lpBF|،l *?Y"1P\8=W%Oɘ4M0J"Y2Vs,[|e92<se'9`2&ctI@o|N6(.sSdl-c(2-yH_/XZ.$&\SM07#1ؙYrfYym";8980m-m(]v^DW~ emi]P`/u}q|^R,g+\Kk)/C_|Rax8t1C^7nfzDp 柇u$/ED˦L L[B@ٹЖX!@~(* {d+} G͋љς}WL$cGD2QZ4 E@@A(q`1D `'u46ptc48.`R0) @Rt CXCP%CBH@Rf[(t CQhz#0 Zl`O828.p|O×X ?:0FBx$ !i@ڐH[EE1PL ⢖V6QP>U(j MFkt,:.FW8c1L&ӎ9ƌaX: rbl1 {{{;}#tp8_\8"Ey.,X%%Gщ1-9ҀKl.oo/O$&'=JvMޞxǥ{=Vs\x ‰N柜>ucKz=s/ol|ϝ?y ^d]ps~:;/;]7|WpQoH!ɻVsnYs}ҽ~4] =>=:`;cܱ'?e~!ańD#G&}'/?^xI֓?+\wx20;5\ӯ_etWf^Qs-mw3+?~O~ endstream endobj 330 0 obj << /Length 611 /Filter /FlateDecode >> stream xڕSM WX{Қخ=TmPjnml$۸te *{"{3̐MHqEnZoXԸL$&㊰DWC;ڤUM3rrwwSV!5;Drce@y;サWncT$Ca9Ogҟ>R\Et~0^^$陜6 VQ }cLz9ZS& Gp-S?lW$aɮ_Zᒊ@8[cQE`{+["f!_k\2ZG{^Hmhެ f> /ExtGState << >>/ColorSpace << /sRGB 337 0 R >>>> /Length 13698 /Filter /FlateDecode >> stream x%g( wNmHhmW4zBVm 7e3Tg)+Jq9\z^|q]V}PO~U3d[l9H }Ե6%5JsAv1d['Go$[㒜Oj^1* ׏$ ^$; 7܏r _ r5ʄ=}dN=2f-Z?e- $cH}.9Q"9[|-d|%˷;$νdߟ-}k`#-ƾ9ȼM]e}-._j_l˼sDžeޟg)Lw5%q߁J@9W)?Mx1j4Cم8) N,I\jI$܎T3ے̓/Vt}C% n9]Uw8RqZJ0C8)Eh0n/h)lɖa8j (a}4UI ~q<*㨽q/2ι8qxSƉ3mKմq.4[[8Ɩ}r5v4Ehnl_RMלP=IVf%ܒjFu7_Sٍ¥ۺ%ahF%|Kْ5g8稌qX2NZKIK_2Nʸ=%~’qR38{b˿d}.%sSq@ӳ{R6PKƹ_sMSqq /[l˵" /\Hl.4F޷O.ռBOׅVKyhz'JAc< )JڝZ5]u?(W|Z(o:Boe:&ۖl%'O5颍G]GIy9xRtLO 7mT^vڏU5_֣ C)8jkXc_>a5F*[cX1Vُ}IsPe9Jr{JrVjcA[YzX %+1RMoPGzt֏Ke'' ǻ4}՞HI].4Z-m&ҟף4;nEV?~􂗓i7q9gk dv#|Pf/=cMEʅm?[}.+hY{_huZdZVj6od Rs%>4.Tj jTtjTᷭU 6t}+/לu=mڬ9/h"3ǔ= 4CTCO U"{g<3;\hakԱjz0-uEQE[oog(IC SXziAXIءjOo%k-֩o{$Q{b;z?h4KXS嗎7M!m>U~24'\]/m]5և䷭9*Do#+M~ÜߧoZ$km,5mDi ד0J+=ϗ]ۭ=P<9ox/%>O} ƈq~g{/f"o&ݿG~ۓ~?~n[ͥ7;oǯ~ ?t[̮ᷘ"~YoOٺڣn5^o=So1.~s˄F~giȟԨ튏iOqzS>:巭[b_h-=jm͐b fBߞhί5ܿ9͉|[#9fԘ˫ -fМM:Ӑ"y~oC~)<4onochVǁݞ#1`(Wh#RԿPRQnkD>oS~~Ng#MyS~;~%cS~;ÔN0i ~s%Mov<~xoo O-blio>O-b4ioOqƄH~ !Ћ y0 wu! Z]gMŏ_ Fe;UEs8Gw,Ln5tS ޯO_+W-՚~}O{^gys+Y[OON?yXѿ_ثq2ӿ}aF.n.sgs#Nu nΊЅA91@2+n`Wp#H!x7b7⣭jFѷӼ܈]͍7BL#n#~g(\9ҴF8*$Mry^77B*EIJ G+FwaH1ɮK]ez7¹(čgōF+QR=n!;FOY~B}7C -hi0-n7)nENLM%Ĺ I<:^(UK+čӖKD^EQBDy0qFiy4%nPnDY^ u#F 1RCWp#7 LɰXNFA2rDG97QrgdnK(!H",GčɄd1q>H8ޗiQFFrP^G*!}Fr7\čx"} /ōPUTč{97Qč5W- 6Υ5čxeq#H F8WiHF9FɠL=Uz7¹rlčrJjsč2| G_q0yz7$7FEAQ/>C*g:Wp#<+ˮM(#OP6Hzn!j8vyQr 1d~ 8&|O}?q#|Ʊ3gLJuS}ߧ>9v꧸۶.n(ÅyQQō}uu8o}=[OF ٟZ~"?tۮv\c]57Xv\ psq8ñō~Wh́+s#7a ז{pպ|.n[ōp<G75_ X#nDᷭU?ō"8Z_q#7WN#巾ܟA7E( n?ōp}s,r#_ E  T7xKCUqNDNE|;dMENE7oH 759|}_7^Wy/i&M<"L3I@s+p]xi '0Ҩ`Kۅb"Qƕ:v?AyUO6ojzWQ&IDzWvV&&2خa+78^$=v͑V!: vk"-A$ @n!<*x{DBn#DgH)uHT"/FLKnD{nmQ8Wb1A[*H"1__RDU(#fI  B̂H  GE`05B[# Cq<D¹lᾺl(G /n)MIk*. $t* ދUXMAxA$5Dzh\@P29["m 9s "969 g%NJF"5h|Dtc~;"t6/"a{YlFR痗,%3=5E MHa܀H)D"HkԀHx#|tڜH_zH"4r@zCZOi@3v$!IzkźN1ѺzǦ91[6+19:MP ,n((ь 1 6F\[})9b?^`Ċ4 nE<6ZZhhkCCg?a:QAA<ńux(&"4caP 2̓*ش`abA)BA$(8AN(F+ +dK' [ \W(#2# ӹ2),]2NuK"3c5 㔛T.ji(s!r=Y;e{w8+`S0;fL|bm3g [08f= c7)3XQal쪋e m#=8G8!wb:b+78#۹=@9+8 l3t ,syΊr:K uVtb:T+vr2:hpnlmB 5e}A,˺izM:UrrnyPW6كXb E_$srqkURf9h,gFzh:Mc쿻1%z }xkb9o[O8_.a'>c젃`/8b9՘֘$1˹b9cߗkXl'k<`XcψX1#R4;{dr؏kYrv~q9Xڞ`9h׋ærs*yi5=`98ndFJC,փ尃֘rp~viArrSL JGE~o%rzjrpZ=~Ϟ뭼V[o[~[Mj7tjbE[[k 9g\__~kmoh&oٓ%f'qm7kfid9lBc}XΛ.*iGb,GqrW켁'\lˡ?g(8J>SRO@]7|Y(D?@_h1>ߊ2Nzrcm{]^1]ޏ[eNp}-Wopx>;=_W͕~Q_~ӗ( ݖew_:qJaY :$aׯc1%W{4C۟C0 GB?|rfq/sYc"K8{̞BYsz hficuC^l,š`69;%!tWcySekv5_2e}ξαJz]Ov޿ Qn1RL=F6ĥ{ɫ~$gnf]]OkdI>;+լ]`:%g HXF&y22 (I֮Vd$[۹x5FN2,3橽͚)<Ӏnڭuv U۹:Vef12 lI#MM[.P5҃fvaVD=Vi2JBC9RF%vSMsX#Lviqټ"߰wYo1@%y6Rt[_u~IeUEHAʤkN+#lhm׷6 ?K~`O[>\4PAolH>i-y;'F kŚٗ\ݰBlKKv%\ܐO^la*)?Co4T[ۭ>d EŎ y>˫ؠ0h*~vd5Ckhf;L lgE 45wL*14+1Qy͆R㌨C3ۙ+f6w@cU/lt4u?jtUjƪU%6 vc24VeN.H4vLDG삎²n>f8N`S}!GoaR,Fͺ+;']%o#XEa'KXEep5޿8f;4G"}hȰwy'"4VA ߢ<>+sxt=[cU(oluHhʜ¼ô MraC}1XUh6 M7M>ͻx7Z3%Wn Mg@#ߖ#^zdt] V[WW4v%v!mݥ~Si똝0YEe^xÁRd=PkUɴvvARݿ7/*[߼j~ThoήW7g7r&k6[~K^/&$媿FM[oȟU~+1PBG2w'jTq/Va(eVL+#43{ $oYWwƆ9~>Ɠ|շdiv254Ɠ>ML4~>'KIiGOp}FHIu$~cg]~nK~6z>Ŵcם~^Kx[a[ʱ<ݿ`yz;Te4Sn~9Fo%7DrvL.vź[ugl\/ּtybryT[)>t94TvC]~Cj 5_69Z]~C$Z3Y]~g[2䷞|C~}~ȏlgݻ1-Ϝt2|G? /φ64/!u؁.Ff-uaJ[uWSooӚb1&tU@v6Oio ΜIi]0fv5zS~Cj1Sd;xko-{S~]4efe;k?̬lg^Ԟ})}hdCdӺ)?%~R17gfvAw)Z(۬K!B7W{37ts|S~V4(k(7G})hXZ/=7S~.voC*^WdxhoXR0]Pwo-e9qw -k?eQղ bqA+Gg$AQT쪪?~Xm56,mD7e ˒|5%_K~([dO߆c0Yv(]b˼Bo% 4hW8W?ѳ5J7u+[dk*_Xu̾(bmMJ9;2SM}['oOy}H[9㬔CEߊ gQDHcp~+ǻ<Ņ׈ TF3 dRgqv^~^?u6Wg Q ? k }%ϸzcsw?qͺqYna} =JaqeXQe..;i˨2:,>!lø.KxָI}1Y[ՔJvĴ^c8IpFh:\UeHҴ಴߸ [/, Z5s^p?%2>o౦w=pρǘt*~e8_W,0.~: IR'=B2h"2$y2h5Jq?2h8Es2SymteL_1RJ$#\/s4.CR8ܪŸedŽTW*xyuqY 1I:~?eLxIpp:,>0.CҢ8 dҎDqeL7_QzMIݸ Džxups'.ccL~.<6.Ceذl|}:RdeHBeL$ܣ}B2s&-^R>{aqYm\UM 7I5*$W2/U_\cqY?Nb\S8S5 Aˠ>.C))R |K~NFm\$KO\59tWR8m))eHvx,eqy^RCi=)NEѸ,m3pYqGq',c g/ \#a\8Iz~c9H˸, O˴e)ez)߯KO~˲ۋec5&y \-2f}2ؿ=p3_oL"!\=YUW_~c.d]5>tS ϣpYZβl\8ץ+YQbe'qyG9~UpgOk,|Us2^__J_z6.KQ6.zY} awWe%UBp㲓fݔPSAף؟>p[QaUkMVϫk ?_ 1%v27eX,+\Spzye\ʡ~xx<9y<z<}jyאqYZk\g<+\e oz5tUR҃"i!YvߌОH:yr6.c8ޔ4RGIG.OD?kJ$@B, aUlh|R eeAߒV8],4?rr#2x4\e͜Q˘8ia>-ú?68~.CTB~.c>&'1dZ;Sze%Ɠy<#\cyqpor,w4.CEg2_28 ~+LqM\OpY>8Y _e941y^ 1 1pVbp'\$!e9q 'e%Upǟ\.c}L>x=/k&ÚK~8VF:F}.CeHHe'q-k&URe(=ppXsRIpq/\zeHZg|%50.c:ᣬ@ iK埸 QIeHjeHbX I1 pfZoyUp=w˘1p"iqq֓O2$;ǙTzM2e<.#y2$%ˠ !(\a.#q֧2eú) c}2&u&.;Ipw2hːpcR)b,O.=7/6.C8m>|%2& F9qY>/e96%.(2ϸ IW{\8, e(f\ߓt?e98qI"i\Ƥ ԸI2J8t%Uߌ˘e'ؽG2l]eE]Dr5<tnoE."[BD{_ ɸ7a+1$8_Z_Ih_u656$iE.@VFgXd՝"4 fz7d ;9~uccs Fl^Qb5ZlXcD}ߨq#F^d'4n ƈZ$W]d}W7caU08en F%&@4 1Ăq Xq#v\ӫIUYz f+W^j9HI,%Ԍv?AYbKaj2"PGjݜW9ItjEɃ=e&\iq"ԼbTrBR:TJ@ i&IOŮ7|Ŧ-D؄"괜v S BʬAk~ Eyy~S&u Uݎ?Mf}fcorgKR; I 43MG6fVL3ވ ӊ%bLgGӌSH&jWLKt)ҌX,ΫEfXÁĕLd2U'SP)z83Kf4Di8 vdIuK-Pv{2#٘YSiK$ -x :(:cQ)0!;vc,3's|{D>ӣ~oEiƩ*tah"' dK8SVFQ[Ō|hWG Eb}ъ $X \th7l;RO'IOS ^{@FEL^AEMnDf+~,V>F)\XvDt.F=HlYH_֘#p54>)E7wIAD6wI=Ȋ/?H֑86R%+1qo&E r' =rɤNoM^) GN!4(?HQIlڤYE)ZljJHZ:$K)Tyr&C"Ϥ(E"̤ )LDfsl)ZLWlJBA|:+RN!wSx^-)b*^oYOgjR[)Ru96^o98" hA{vVƪ#.RnByoGH()RޘuD0&E)IӸ6kׇԉsr&Eη9H+R)6Ro֤)&E̫{#ւ!jX[ -R7D o+qMO)qo<;) ~kNlRej?DOC~k^kR{Wh>DN?"Kq*|x@O$Elt)bJi픍56Ro!EMOL"G~gΤ("EXS"'[O"Z~&EL1I_CRl6))Lx:'zlb@qjl$#):) MYS9R9 "g㏹;WzD:1n.ϣJo)7rcVte_"︊UB;b3ORҠo3\qv>ipٍ3!.ѹ4}$qQwFLiC> > 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 343 0 obj << /Length 633 /Filter /FlateDecode >> stream xڅS[o0~ﯰHk;N E!3/(߾* 룫4۟̕LlcR&8OQREWp;u)$th~7pzڎx;Nes=֋tいK.|(g;k&Qo~&MY >i:~a6<˚QU%pŔ#/I2] endstream endobj 340 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (/tmp/RtmpnZmxNj/Rbuild6f0944457700/timeSeries/vignettes/timeSeriesPlot-gapMultiplePlot.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 347 0 R /BBox [0 0 432 432] /Resources << /ProcSet [ /PDF /Text ] /Font << /F2 348 0 R/F3 349 0 R>> /ExtGState << >>/ColorSpace << /sRGB 350 0 R >>>> /Length 6969 /Filter /FlateDecode >> stream xM6rWh,HI <@$@AVp0"9O=}IQ"U<,#޴fK۷۟eӶ}:5ivS+'=s=ŕOw<^a6UcKB-n7++cnA*~KM]M1jokj^0tS};dr9ú?%=M7}К}g\}U9-rrdn_&ŃW< }'5LzG#ir>?v=?u4Ge{˕_ݥSvxϟwΐOWvFi0WDj(f!.[ՇҜ# EMWnװFd]HhSv:?M 6/V6ۧ)(o:cO3}޾__4^)oU>W>ͪWAڌ?i?6ט7"e-[mMeF񾳴JzI8wE[}rݰ-Ƌm5έ(rj%Sv8^S_zGTkYcsvzq_G}rlzrZs_j=}Y_8? nq_Fφ?6z>zn{N =ۆc-coxOǫm=v=˔'[ӗ!syG&[*zwχl1}rBGsBf&R¢sy҉dDvE 9 ;s^^nc [%۶?h?[swg3i)[Ӆ>l='w!NϋJ z%lϬp0Ћ|s?^qӟ|! uiq?x#k{z}gq;C=gxz!VyzY=/[z_:O㥰c/w#^|׻} =6"2|]8CD":!|G.ޟD.;mǃgB|<wZϛ_+\?%_{}x3.x"~w;}#>@۹#^w7F5l~=ְa7ǿ#>=OE=OE\#>Î86K"gC}~Z㍪lϬ|-3Ư0jzb]HF_N}6=$v&;yzsQN|ƣX'yCyx=ףrՖt|B(+xro>G/%Xnl?3]}Xa` [3c%QxJȸw?kn[/%=2zc¾gJX'g#ck%̱?}6z6A6z c=~lxCx9sڨ~W||lq詄kOBqhHN Z°g,,c 3|s߹.tngo‘̐O=v|cы~?Wq ,sKrԳ<9?}/'G|z MwQ~ǡG|FܑX$DrA4?zv|CO5o7z|ѿm付?=٥,P|Ɯ/=#rTxO3FTx[]{EGhF>cs+4xG;0>lTg<6zڍ|Pq/>(KӿN簿^g$էۇ_l=?V8 ! }a9*O̵21+j,鬰<c~gW}Wi+j87۷ƵZK{kۗ^kӾŚW\~dL?bf\$i(% ,꧚Z(g,*))E)UyEƄE%¢d:ERjKT)Ӌ9,J-;6Et]i¢:$npel¢TjjR7(|m(-,J&|ʣyC4`Q2RMGc=܎Et(H%Ӂ),J]h3[aQ*ugwbEG~*Xjlڃu,j`Qz w?\%[ɢ ?ÖXkf&zKBe}z8E2XbO=}Ǒk e7LdQbǓXzaQ*?-9r[Y_`QnEI6Is܃=+<)GψgEI`?}J6¢,#6YvD||]Ymm(s?3D|Vɢt}^X<=y<֯`QEz;, =>`(ٌ?,*dx(s,.Xǫ6zwÆc!MǏo/E٦iE3Ocmm%هT?Xöx¢?^`A豖!XzmױMنMeghI ef¢,(þ`Q rM¢eXZx(/cG`(, =.r@O`Q +`ǰ()VXl%B`QXX'lX?oXʽz + =`(6REXkvzb]\[{,r¢T~-,J6%E (Q_Xbǫmh1`{Tf tâz8&R$%lL'\+4L0 [۬Z7׳Ze`Ub&u9ӗ^{_c/}º3KkɏϿ.3tDC ۬=N?tUsq6~nribe#q3We-_uUQ,kXiɅoi>ɫOoݽ״}lD*d֬,`-r*'bR+*}D*BJ-A?b8jaX5>a X{ޡW][|1+Uq'\<@6΄ >C{}@҄.62_r,j5{WxW\%9NJ;>V);yF@U !rˁ89/ZJކ@*m}F%/>ņ>>H? ջrg6)攓#SA42A~ 2A2OHG]О3zCBCB^b2%ׂT@T?/dJygroe!Sd2dB4dJrJJ-dJC42Ȕzд[)] LvA$@R7"|bd|!S*SU|w,dJC!S6bqcu2%>)FT SALY0 O|#b'dJLI3;%2@40_ S*|y)8%IC S)E(d6KtR 25#Te9%򲒩L' S s9L3!S_ #H S"ǔ?ANdL)dj S-rg CBV*GR*&&)STK Yk| @5Qj5%j|w,c'$JgJ-5$RRՕBj|Ja-[y8.-AX~-=?ͧ?i$5 IaEVz@!4cZm{z#N#H to9e+IQ\99 p-0B7Uh4f4Qb4> `:9A;7VnCi%Ĵny>ѩllN-4,hLPa@vD> ddNl4Q)3iqة`q8axmqX05q5;|@/ iY@6">J}@DM"L=#L@- Jg^1vuD R}Ȼgb?Q#Q:D8ߗJn/mɎM]g@$)[@ST}DFp I0 riw xa%߶"Yv.츞ۦDi @$` ?mzQRa$: Pk_y>bǫݨp) /HO>݃BM C[OIo^n0Sűoy| YW!0 ]Å\+^g̵=2d80NAu L*)>K/DJ|ŒAa^^UA>Fa>޵⩰vy+:"򾗯r}yY4q&lN<&?|._.YZ6}#}]~./6Ӹ'{?eL endstream endobj 352 0 obj << /Alternate /DeviceRGB /N 3 /Length 2596 /Filter /FlateDecode >> stream xwTSϽ7PkhRH H.*1 J"6DTpDQ2(C"QDqpId߼y͛~kg}ֺLX Xňg` lpBF|،l *?Y"1P\8=W%Oɘ4M0J"Y2Vs,[|e92<se'9`2&ctI@o|N6(.sSdl-c(2-yH_/XZ.$&\SM07#1ؙYrfYym";8980m-m(]v^DW~ emi]P`/u}q|^R,g+\Kk)/C_|Rax8t1C^7nfzDp 柇u$/ED˦L L[B@ٹЖX!@~(* {d+} G͋љς}WL$cGD2QZ4 E@@A(q`1D `'u46ptc48.`R0) @Rt CXCP%CBH@Rf[(t CQhz#0 Zl`O828.p|O×X ?:0FBx$ !i@ڐH[EE1PL ⢖V6QP>U(j MFkt,:.FW8c1L&ӎ9ƌaX: rbl1 {{{;}#tp8_\8"Ey.,X%%Gщ1-9ҀKl.oo/O$&'=JvMޞxǥ{=Vs\x ‰N柜>ucKz=s/ol|ϝ?y ^d]ps~:;/;]7|WpQoH!ɻVsnYs}ҽ~4] =>=:`;cܱ'?e~!ańD#G&}'/?^xI֓?+\wx20;5\ӯ_etWf^Qs-mw3+?~O~ endstream endobj 356 0 obj << /Length 882 /Filter /FlateDecode >> stream xڥVKo6Б,H mriHrʴ@7zPC pޜ,yHXdžV TJ$ I I4Lw'"L3΅"o]욾AD,/$9NZOXh4_oUIK-’,749'59q3(AGjG穜ԃ&Ts(S0N;hzާBL1A c?!ba¾ڜ1Rs*YwQڵs#"9kWCȎv@i1 QN:*&`w? xTՊ#EG7%7 d2tJ/ .Qa%WT ^ x$"/0L7'ŕ= kHlotsN^*5 a@0Q|}bʗӯ%'0ƏK;T<ͷ -F#\D ~י7U=f'.:1*<7i&!A <I؀I+s [ǵxuJAJH%@:(?R h ۪% V,ӡ\O <]DCf 7%һG9p̟vk#ʂ UϜQɊ3EA_DмLEWeȻ>^5#hQVbwkp [&C}}E\ Fwz nf{&B-Y.%U8!ç:ܜ|uA`@ǦtO?} @h)  x2A敯Cy},^]:55J2 ?wxpKG endstream endobj 353 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (/tmp/RtmpnZmxNj/Rbuild6f0944457700/timeSeries/vignettes/timeSeriesPlot-combineSinglePlot.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 359 0 R /BBox [0 0 432 432] /Resources << /ProcSet [ /PDF /Text ] /Font << /F2 360 0 R>> /ExtGState << >>/ColorSpace << /sRGB 361 0 R >>>> /Length 4933 /Filter /FlateDecode >> stream xK&7߯%,h|l H,+.A,9;D&)Im]*WWWw)Wni9]1{?p_]{ w:|ozx-QoG>vqRBf2ߓ9_9;fynr1Hjr޽NdC)Pxg({ic仡HIY#d ݒ䰁bx&]0~9sJNm|j ht!9lhNyO(x'tlwlE'_ְkԃkxƷ=d L'f^$B/f7yWwt\C593k}Oo70qNxi *)}]~4el nmE_+w<^Z~G.tݮ6C?0: ;sMgyg<8K(Yp`6{H3arBPNA:NԦgidl4ްx_82hٿigbWOc1=l~}{8tyRmb6d~6CI &b.g^mm;xPmkm!M6U!&3 Di2J'3Tf E|_P+wc/{ .Bpmkǐ?"^<y[Lf;?';(as~%J-M{OtҘdfX3ua]wnH|`!=c :^mk-5|&yHe?oٵdnSߏxgx-1^IH1^ŲI|xN@z$~[B 6Hit?3+Ykws3ao"mB lHHd N{I '쇟 ]`H+nx]iUӟx-ۋo;=kߩ2|#^W[hߒ&i6d_幅7?ϵ)y|*_a`(osS\{b>.G3u|=Y_@fM=x=Χ薡'7{x CDCl/x=|> |>w'k@4 ]S0dYU:*Ͼϡe9LԞϙ?Бϛ[h\?k뱻fޔ (/1_f>_ ^~7t$RUa+,>3_nם7ⵍgHl+.߶8vz>۱ QE|%F5ݿݷa KW$v=/9?&쯲&anj |y3_7yai#j%p,:daiqv {hSz/|}x&ǣC`4,7 ܿm0T;;_Z?vAvj'p[Wu G4o}wz8ا?ǟ4^9_аOPp3<8*ߖg!>ik+ʷB~->#cr-ꯩh577^poo@#̑s<ܿqYp̓B>/8 '6u?)yCN|oMŷup\?濹3{AxH`:>1zK]m?>ߘA}h֣yGO.["aϦQɈׁ9xzfF"z7ܿ㩙z2Wocx\b(/kkj__o?yoWa!{MLJz޳O½'/ ADDLJ˽^׻4:00IB,iO&=MRJpQoZBI׭w: ?4_t a i,G `H ~t>ptYOkc?DZ#$)G$Mp~^ib?|N|M{/)8*#e~oW{#\#Gz>5yױﻜګa?aaxa?x^\x<G&m#ҧµC)w:K2LA8k#?XozswƁT EHJ}s9#{$IM|ó*|/*GgF6 3^_H8&|{+:ݳrF7K[ўuJ>A`%m>sjߪL- zs8CxP9|# Ƶ!k#Љ@8гV]:C*{C.1 $C2*{C{Ga?a˂m LfõaƗs'u6C˚``^c#\{k<C[C^WqV01> 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 367 0 obj << /Length 759 /Filter /FlateDecode >> stream xڥTKo0 Wh_òðv찵vh{P%5f[ͿeifCȏ`zz1;>E)U$9AFSx,EIŌ$"m$Xh6C, yծk }tp| I R> /ExtGState << >>/ColorSpace << /sRGB 372 0 R >>>> /Length 7198 /Filter /FlateDecode >> stream x|Ie9r>[ڋ~m !6lW^^F3}K7 <dC0qo_?/~}櫶>׫>U|oWᏯoxoV^{o~VzxΫe8#`}׻א^j٣p{w#/HwyhUWǷGaz7n8#S{x/C|~h> pFCzW4tPpGC/J +n3Ѣv yxa{lS8Gz{xޭ -NE\8X\ xvY5GݸG%0 ]Wqaw/1WWgt+p)hD{cbwYB|%xX*9QP,(_w_K/vx>ވU-9Q0qwXD&|P㑫c`3Mnro 7{:~a0S\UXŅ\QQ_g{cٴ1xqb)W|[`(iqI)caG/߇S^=27VC{ۚ3\.?K~W^4ǽ~=\wπ1ðb<2V}}=~Cx_Oq8 )=>M_ƣ0xn~볿`S`A a1ўƷ+7/#p> ǤoGƷTŷ;1#!`+wƻyACSdoc<x} yҾc"܇`aOiMw#f3wmIj8`TI{<4փk1b|ُk0m~ٌ`\m} q{?X ,>~6/<; Xϛ}C͓9yJCτaf<0;nc_R_?/y([} G_ݟµտ^GqP+0?7?߾~ӷ#gG?eJ)/[i^"7"ҩSGC"y7ODM#]k*_↓ײ~z;;-k_PZtxv~ '<$YY@g]Gƣ ֋~l#GYl*sxa]SλNcSaZƱ$2aogk3:g꬧-ꦏ:D%yH!f_BR?y:}lLK}dG=Ɗ(t._Zn&_ cYFgs5E}[/)Bȇ.u-ol( 3jA<" Yf#Φ5:~nʎGwC/Ῠ߰,zۮa=GG` Agӎ;u' a=ղcY׷#~س.S9Ã[2L Љq sɝm;r6Fz9/~a!7q>n9+ë( mg0*rYcjHqha0 qٿ {eOXhyMywz:MLy)Ht+1g[Iz٧RrTUO6@iogJxKz4!JO4dhfwsj"&Aaj"8aHZ*B R N2Ngdv"@ aؔݼ~= _S0,N" =?T_}Ԡ"ܹ-`ʇ1IKpK } a>: b_)akܩ>ɝ79._`j-Q$Q$-ߖ-a UU?mCeFKF[͍jOdRtƲ OwX 2g U_1d,_>I^,ߌz"dͱ%?^ŲmME~SL ,35/n?bB L_ڬپ[Ue6k$l;Jr|/c_rRn g10a-0W_);dž\xktAs-\3bu>=$וfU,ƨOA>ҞBr}IRhoE7U?NQȋ}x?WyS%|Y\v9?up%Ӣ* S~˧[sCJp-Ona`ܗ.dxbGO`=ʓ)>Jw Kʙ,,AyKn^~sǀ6If_Sw&-M"؍)wn{~_j_orkES7qj|/GA2̺f.Xۧ\Hyrq _,4f̎% kY[r I 2WrBRPSrI1X?:oرMOפE5KګCnhHHXl}'EVf;9Ub߾yΞ 9s/_8+q2q/hAMʅyTq~ > <5 < :#ɲNj$Gr'Fb8}rgA]@Y@= <: rXH0$\.6/4m~y'Vorޯf^+X?%eLU*g ItL8xDYp  F[Rj04b5^6\L֭d^^0tQV4:^fz{ѭ*">80Ҿ !-kX<{YBj$jJEՓ4^`u"dd]W:Bj^Ց5hVԶ`K`,ہ -1(7͙ӛ:I%t)w!5;I2!4;! J8 #9G8-5 /O&o;wjh,J)ߛO> Q`$r!tp5G>|yn/M=q*ff#sp-"a*o䱒?}N,u5 fivEy>LSv辭$x K%Ae(iS\آ0X{U* qU}sɹ L|GS̙EEbLW?oܗKW2OC\;'k.Gٺ'կ]93N'(IĐf>iGI+QckʫR-߽۫\ S#r#ź>`K׮]ZWZf}?Fu- ՙgP.SNmJgY)w%P[OLŔO=IvLr$O }Cs|mؙD4ɞ3{, UrUCco/I.Co/fO‡R}`#j%ݳD:.+.RjbdCLYм1_m阆}|y'm3.ggW$|qJAGGj:+pT̿J$v~JϪ뜣].hE!Պ$fhR^;w;[ɷ tXJ|ѧ;ndwꀽߞ<4޷M6!Wжəh4ߟOq%cU* KnʗNZ:4gͳ[nCsh PtCޙvp-ȉy쭑dVzt'j-,ru̐c$2[#'Q92^ԄjMNf{ʙŚW^}:7찝OAĨ2P&=̙bT;x4@[&UT9Iu붽hziFdtxI~>&&T{*H'==SiN2UM3iL6L_2|}Vk\dR1.,*U)v-QnnJd1E/Y;H~+7מ<~y}WיՐ|fGݣ}: endstream endobj 374 0 obj << /Alternate /DeviceRGB /N 3 /Length 2596 /Filter /FlateDecode >> stream xwTSϽ7PkhRH H.*1 J"6DTpDQ2(C"QDqpId߼y͛~kg}ֺLX Xňg` lpBF|،l *?Y"1P\8=W%Oɘ4M0J"Y2Vs,[|e92<se'9`2&ctI@o|N6(.sSdl-c(2-yH_/XZ.$&\SM07#1ؙYrfYym";8980m-m(]v^DW~ emi]P`/u}q|^R,g+\Kk)/C_|Rax8t1C^7nfzDp 柇u$/ED˦L L[B@ٹЖX!@~(* {d+} G͋љς}WL$cGD2QZ4 E@@A(q`1D `'u46ptc48.`R0) @Rt CXCP%CBH@Rf[(t CQhz#0 Zl`O828.p|O×X ?:0FBx$ !i@ڐH[EE1PL ⢖V6QP>U(j MFkt,:.FW8c1L&ӎ9ƌaX: rbl1 {{{;}#tp8_\8"Ey.,X%%Gщ1-9ҀKl.oo/O$&'=JvMޞxǥ{=Vs\x ‰N柜>ucKz=s/ol|ϝ?y ^d]ps~:;/;]7|WpQoH!ɻVsnYs}ҽ~4] =>=:`;cܱ'?e~!ańD#G&}'/?^xI֓?+\wx20;5\ӯ_etWf^Qs-mw3+?~O~ endstream endobj 378 0 obj << /Length 670 /Filter /FlateDecode >> stream xڥUMo0 Whbòeaݶeء@lu,I(:(z|%*Aď5QNhF@9T DMc&Ҩ(Zud6YEݨv5?TF*hc3 1Wƪj\TNYGQG~dH.p.<c#1AF ߪwby]U}_nt):6&!bk.N>w{V"I 99a >CQY,#RZ1keY EŜdaxR{}.&  9%Y!́d9O1TDڍs)|]hg+SF:u1Sǯ+h휎wXRi9 \z37٩!ypYj`r1K&@;FrcOZL BSU33!RpCXEM_O0/wa6\כm743H>y[̝t_f7\XNhcWh=ОPze%<808ۧnm+9yl0p?׋>}#ֽ5F'wiDain4.d/% endstream endobj 375 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (/tmp/RtmpnZmxNj/Rbuild6f0944457700/timeSeries/vignettes/timeSeriesPlot-layout2SinglePlot.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 382 0 R /BBox [0 0 432 432] /Resources << /ProcSet [ /PDF /Text ] /Font << /F2 383 0 R>> /ExtGState << >>/ColorSpace << /sRGB 384 0 R >>>> /Length 7131 /Filter /FlateDecode >> stream x\KϥQϯ8KX#@f,'RȂO=~{&؎d|Twy#?{ÿ<#Q[(m=W~{ï?gJq)u~|ȏ}(>|4k>>Yף=ޏ3oz8< ug׳7Ѣp{ %z>&Fl+?G T,r)z՞X*ˊ՞YT) l7++= gLC0_vW:çhhObIR8SpD7xV9&3.#)?FF 5R7sflg 1k*stJigL@MY%0YxnR uo8UKg!ot xiaFC7kh&c6Bg qZ*ߟsgK2d0-{~KLt3w1X~^.϶bfvH1l鋎/W՚8;g7؎8e?3c>58iYHe0~Ll0,zd9&nX-xF{Cэҍwe$c"+{cZiݐ}bFCA5am) Q  { V(>~x»₃"{ᕑas[X7Ņ?g6^tf aw{?tel (^M_1! ^~s>/g?qI' 1Űt/h0xc>p-frQyvEy?r6f= WpCf|G34e[yW⻚t?] |1q-ߊ`Šb~3i xg郡a>V|פn#hLM/uxU_W1c G1b#2 +[a F| c>.Y Wyw!9;x#މkP|w+D|[Gyů5R{1Fs+;wg? 0e| qu:(/WcV|wJÃ>Ɵl|ww+g`XnSx ;Œlc_DzS`^Ç޷OG^Q}9q+>۫߇Dqړn8v 0}i_=3jg|w`q{n|:u?˿q[_G| qkW{Uf` rӜgӮ,ggZeY5g&~8?d/<?0ο>W>wox^G͞=.wpc_k})gV\mm78Xzy gK|{>V^`vg?~GF=qz?}~ͧ}|}SV雛8X㷿9c?/3Oyg5>?쥍<>E ӿ*rWwŷ^E~T/x LEp7I9a%x׈s/̯NB|J@`?;T '~* -FmsY-4K:Vz(9JgeٓOm+pPzV^dWE}x= Y1=ujBk:Zu:}OkFk1{-Ƹx5f\;#c||K.SF zYqfɯ&YMl1l^W^| rk*+s# S 1\={pC(yH8T-˭LC4$&\8^]uaB:쮑t#};ϛZ ld2іYS˖j\'R4G]a(*WcbuFT>'*S;_ukAк5 |C2 %5(Fahn$"๎.%ejM]z<5H0ʬ}yƻ3#됓B; y%Ь=A^-z47CkXMTQ[' R_IqtӠT3A{x J=|+tCiD2tQEit]ɔglU rF:bXW 'Chr]1,22Q=PBVap݆М| >4ƺӬC|W0 ac0|(0^1#f01~uU`8;lz{_Nd5mS9bur]J7a2.0f ^MZy;]ᠴHsc _Tm(clڙO>.hr5# ̀\0ԝv!υy#}I~R-X{*4;5GPHăb[t`OcuB x]b0$E,1Z(,c~3g=b0`@4I~Տ<&'^/O>bs@iBB2 1Rv Jd`'U@ԵZXwoCh7lRX)@ͺbN%RPm] hY׽GXyZ(tJR*W]n.-i1 <űUN9Z zI?x8p3!RXZRq@3ӑ%CCކ}va2fVqH5v]CIG qu,>:-ҡ `HsМ9{FP [ʞK;ծ\0th>^|iY ڌnw!ڃe88ɶ ZHIQi4@*.)dtd@n bi?yiNZ[uj>n0i5lL}ZF'KG@+L{>dr%eĹE/]Q|oWI.Ϭ!ryp)> 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 390 0 obj << /Length 648 /Filter /FlateDecode >> stream xڕT;o0+L`1<$hMN-- rLT\I_G)v!x<N.xw*+d% ˹ 7 DAH3I 4/m9I*3MWU9uM7;\rʜI>%c۪lpеү2_ȩOf}]VZ̩YN 3rWZ4p5ż.Cse 1!9$B2$űbu'& M0MN&mQ}'סZw%&܁z pCz`I$Еj6v]c}}`)eu_4ݖ3lӠ5$s2\s{?i4n건ĶFnphb?,yv3,WgT;'|&{Xy PpZ.՗G]gKoR74OS\_ p '0Jh4H_^ :iac: {[pi/Bg1/='9FGc$a{A`c̈́[G?a !tn )'YȩlǃcEd: ( O6:>RM̿ h psL #᥹¿$oT R=PG_ iA endstream endobj 387 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (/tmp/RtmpnZmxNj/Rbuild6f0944457700/timeSeries/vignettes/timeSeriesPlot-scatterPlot.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 394 0 R /BBox [0 0 432 432] /Resources << /ProcSet [ /PDF /Text ] /Font << /F2 395 0 R>> /ExtGState << >>/ColorSpace << /sRGB 396 0 R >>>> /Length 21462 /Filter /FlateDecode >> stream x}K.qY&xivldax5NN}K}Q-Ty-?>~>~1r|\8>>s_>?~_~R/ۇ{Q>G~hy\{c)ꚟgmzyϙ8ʟ?H\K+TeR*kmKxR7ŵq}c>~!9.Ky%NTdwI\}3kur}lGZ%E8WcI,rY*neDVˈ{3>NMS.r.l♣8O<>o-ݤrRv1ly&;g^TL#Z􄨞ywO4cMAa=glnP^Jle~Aw9W^4j\%g1VtR?ۦ{s.vuқ83ЧĔ'XCAI3aEA7-@-liݤ\1)\v gbn/`1_ĔXD#:-y0t4c+ښuU6嶋ؗ~dsfyb Lʟ Ǘ%xM?Յ5~^/FVcE*[r%n˼ _QM}f1~<_=fg:XI}_K.^J9g|lŌr|>A9+ Gm&eOM=Sn}٭g:\ | u`~Lb{XN /懖Ouޜev뮹wْ.aw]f]Q=܉:t}FNʭ9s/){DOI-Fْ.ձn=ˬCT}8&|afXt 'ƒnZ+Fkc{-ݤ`-vrDE1s*Ƥ+_Woyt姾K\譔nRQKؗ.t}_cc4ZImye/=kr#1sN,7MSOz~lpİLcȆ]؆~ʺ[c.[r%n#*\̤'fY+H|SgԹwxK3ŗg;nR1\ ۽ɖlq_~`k:Y+F<\j\1n=u׷WԪUMw-v23EМߜySB|B-TZWS\!3bٕou\!leJ,g9'>+YPgɱJbEAwF\ma[1S7W.aw,sǖK>%q"s6'T-kzw16.Mz!e~ɖ>rnigS^c]g-FmXS#|fAt[lmZ6ݿM7sX5s/O$wCROXQi67f%]v9>5DRik/}I׺쎋zGK=ĒnZ+}Mf䤥c3i7biQFR(QVG_XS+xs3˙usKi~-Kr0 }g`0~Ƒף<>š%9y$G%˖\v g\q/9#<+=Fi|(=}}xwc/ŠJ__r=XRwleR/x;\Q(ѭgƈџQHr"30+ݢ\b3:Ēn?y,jYTǒRawWYk <zGZ@Ċ]$MhݤWeis+@ =R_1VԵv9c76}nRKn? ϖq}ͻ3F7RY%ד +e\9tRmwm/^۟Ŝ_6X^۳pfM*%9,~ޟe[.O6j֡߼'e"ƋjbjO΋;0#mmOςӳA,,,:b~{׳02ގezoJnaJL;ܚ[} 9zfx>gv˹;d8%$c`}}E-v¹ësbWgX7+ft.~1eɹ;$/9G"9u7:gٔ.b_vY:z@>ګcV̱9~Tcc}t{ˆC-%eûWW9 QT65rkhcIQXcO(a#tw&:1DrY*nו8Rsx[S.m$ <اK7)+Q̕qAFc&88 r+*`Ӹ lClek%Cם~Kq&&>o5fF¿0FlM^'_Tn?ˁ8}/9spwW'ֵ7Lš3rwHXLRwɽP-v=\vT1>XXQ3w79il1αk6ek>֨aHbc$3C͉YǙؤFs#ٺ{>le3 Gc6S#Յ!)Ϲ7";Ut8iF(M*Wnuiwd s4o+b7DUķ8g|󐥛Tzmʒ.cwk^99r::v.ֹs l,ky̹dlU.ݤ5Tuf29sTh=ϔ,PbNuќ'mL)"˦v{)]̙?K,%!K@ 0{x;le[t#gFę7=y^.y">Lu}9F+Z@<5EctYKn1/p{'Uz?݅r4THSsphK7/rEnB٧ds_q`j$5?X*šnZ3:ccv,ݤk-"eus*s$ ̍byA)91/0DJ&_le/<,"n- (6Z~ d,0ۄePٖRaw,-^#l9M4t)XfQlbEf0Ӝfv3&_gvrߜ vwwVrwaE97lv魻eK.ֳp,\r.J ŗ]28,mHH%+cJM˲%o g 5rrf1MD^Pi >驔wuz)Kuwle~>{lHW=8l/ᄿIEٺ/9ZbEU%1F\I,r%ne`E~ěp')[wNsZ)|&U3BacuM\renf*9ӎXsGŋmQ(6kʱXQgspZ5]}v-vr!{2K\ Ҏʋ\ }>!:5aUz%˦vto,su8Q*Wᆈ|ʎ-?ف Jkq.tYƓ-n"J] ۭg9/L s_^˛cbo2aM\İH,i_li/W{lחJw@(WnaׇM7Ɗ*h'/c+uo>v%v2ޥgell][I> kx+칍[kdkKۭgќ-v}sa=o6~jyTXS^p[#MO~{rEn?b 1ѫO%Hμƒn[wЯNWnR쮎ezs f-=+62˒ĚZ˜JM{.]|\ؗy?g9RNHsnv9 ΄PQIi +kq`3mK7)> ˶\Rٶg ;f*]}a6▟+jzg89'a +um%nHT{ak-*RYޱšΊ$6nQ5˶v9uerM$G-y,s\Wxȵ䓳aE29:#l))ZeK.'3R@u:NSiX;Ċ:rVmvSl5g.a ۭgi7 ;am+ϻYoHA uZ9QkbuEtוֹe[N}g\Y<xH °}R(qsrn+:fNgaSHw:%]vYjcki)EnTtHByrLi+ kqLe*1{lɛ`w]]GگL΁V$¥b.NGeG rw8FR(a V-gݿVْˮR}g,h|1#rg|٦sfGZC_.uۺϪxtwGfٔ.b_vYB&B'9w8p¤/e[K.v`sx|2b-)֚G˚Z^sxMX^`ݤ{e/,8jwerҏ4_R%6^$5sa ˲%]ľ^%$[(4B>)ZRKr:OZnɲ%]ľ~xl@^,G{H#k9U[yo>eK./xyj LQ ջ"BQ@2fu͌+Vf`f\eZ\&4 :|3(1bj Qz-8=f`QHt_ 8̸3; W..O DN0=kS_!5(qHwf`ĺ,LxOLBiZC9e)9ЩXIeq } YܻOྐྵF'!?yFHӧ4sd'/ѹt3-GsӍggTsúN[\`3(.d,3@XQ3F\x$a`bu&3]K.~?蹛md/N,,VcEܗ4˭T./%]vA9'5 QyRoObE;g c\rweK.s|xW&תtʕDчX o-<kj^blsn˧%]ľs̋Ew/7Y}tо4ÙPqߝN ,CA^eN.s,n? =s"X@c(^rF=+*s s` n,3Y1-]vMz0)jĊs7\jݤ6ieoV عG٘d}_/J%5>9ӣQӦMʾv,,vsrgLw'rzwԶsrcOp8J#, Y+Mݳ|Urpݱ6.w7D?u̜{/v<"v{=rzgh;.7H٫sygޜ⴨9}䕮.r%nXCH/>!^4:1pZs,93VTXqdzMb/.nR5˶/`waԙ;#9t}`t Yr-l>$kqllgt,vٖwg!?Ov#lp'VŐ3O,opr{hmL[%ݤ3z_ H|6R-Qukް&0-GĊ*>aN}&B@I,reneŋ|;QﹱD=2ֳ k9l5I7)> ˖vu A?Mȧo_OrƭK7)VvpCۋ8wU$Y㾫"H}JWL)]熝S:A_5>%eW%Ǧrd9jŨ5q1j1EĪWV8K8_\S鼔U؆u,vْˮnoһlAN?|ՑزGy9R%VTfOUt/֝lekG u{06vp;.-,Y) J쥋|GNrN8}ҽtn]vY.Χ2'%j_>jMhePƗ +Mh6 3=tʝ䲔ؗݫ]\K3r~z1U,01VT8 {(-⧥f]v`R.Toڣ}|l,OS?s7#%uГ.`G-ݤ]lm/,^"d8We ,}ŏng#:6A?o^XSէo9K(εtՖv [aL7nN~30kYe-&M\BS813uBm ʊ?3&p횾՜ YjA!Dux+8#yu6)=vnR5˶\ SMkšw\-ZWgm12HwM˦|qdO2c!΅ci<$zSV|!ľ~ś8r*N8<z,5t|44xp'8"[:cIQ7-t^_W|$n%{|$Rn,[!7Y=ZRkq؞Utg,{4eW-7xl89EC +VM^A{%E{]S[aAI,rY*ntސpTZ-j¥\Ֆƚ:Ok.[#.rEKdx/tu7nwfc\זMQŠ a2|a;tUU䶋ؗ.A*U9=6 7gu_阦25Nҙ3A{p"Gs\n}CyRXr!aMxGؒn^$]ľ^}!ѠG^Q>c&c` Ϲte[.K~^1qN6.KxW疮uW,Ǚ'cMSt_,wk{sa_vw){ڒs1"9k;s'ԾKi9kZ騅m\Iw.v,wjsc@8Tޫ)yu:s.^a(I7urMMEyHuM*o(N v̡Ymm1C [WSCsܻhUrdK2) r#88'>o9:L~:I>Xkux懫btVeK.3M7+4<ӷl @Z̼ga.bMZcOi ,ݤe[>۽V `EVdejSR,I>*3k[la[ϥ~-?S nKcͩHFūz#Q&n.,)^F\I,rY*nw<4^qj"\<<}7ɧ3^kqp؂+]˶\ g_t'9\*ѥDeؖe됪_Ɉ9Þtoe[Nv{X}\pu: //Q)maE!&=XeSn}X7N\w5X R%<6ITVu KIe-K.K}Z:_j$[I+.qJd %EXEbEA7-WI,ݤkmv[rq7'+^ё8Bȡ(wq|:+mT>=tYn?9LpuM^vܐ4gi)! cMi`L,ܩWtٔ.b_vrjΟ۳1]-ל?Spo^ 뙃y{b9ٷlen/sD 8qoϤ'zR#:)ۭkwb閩7ըle~>$ջL"Z3Ɛ_Ꙉ5սONE4Sw&˖\v :{0lėُ"\8Քk]R>qGrx[1_IQ7˶\v 28^r*^S/|ёk\I޹r#Tqd90&߼\v ߅۶zVY4HgڞE-HV=Krre ѳv[2,^vqwGSk권 K~ÕeNNz":ugu-쪾lQ}o}9]J)ق$̩8*=-eKGv8}r؉Z#pby34YÍ7G'cnYKwۏګ7c-'[ζ-F?qp{q}Mjo.b_vM^2 9:Ƿd=K*g%mɑXSc*.LlG&y#˦v[rn9I*넢2V[3ۧMȕb,Rwfʲ%]vYNLiܫs8׽qu\nЋ2'Im15Iw_mQe[N}g{cޛ+#ȱC-zzVIH+*=^)؆uYKn=KӅ;{ㄣ  Q(y5((o M 56L8孡.[r[Jn=KO &ץq zH Mte +z՜+혈Y7)ZINwAǸJ3`]uv+q'6:a/i)5u *AOݙ{<˖\v gK,{ :7˃ DyiE%yg=aMKfmSws+'ֆ}*e[.wᥗΡg1f{tழ^V)ɟR>+DVrp_I,r%n/8oY;/HHTl]9b#Bs%h,^+qY7Թle~.@˙T [K%(sɹT6Vԕ`naЖnR_~.aw]X'OueX$6V̞T.c_]I,r%n 7Bs*ֱHKe .>XQ=A "V>/ev {AFa*b=@ӳ"e2"Mʾv2T|&19~PIsBaLr^;.;mMʞYS.}m؉pt]lMty V8|$ kj$krx ͻhc=䲫{wsn+EdNPrv#tȢҺc;sbMicOUZe\䶋ؗ~Ց#Q{GdT\K>ZԱġ澘ˮY7nOu3׮gfW:^5Scqz9le^wuf̕98>rg̕}5 +*O0&!\aYKn77KzŤQ[X1՗ߧv'aךۿ3tY䶋ؗ.A&X޹k\̂6'TŠ:]ۗ[鏒U*[r%n@EB.,/Fc=R\K `,)ƞHkeݤk--%e|n=8pg9ͪ)C)D ꈓQnR_zv2ܧAg?NB@ip5QɁ؋{}=m"e@7׺sSl#t57faEu92vr(s+UKn=˅d I/^HX& ]rI`s&vmٺI,renɹ0o?+Ŝ-*P)$GĊ97ǩ0s~-v߅x8o ʈO~aE ^b$O-.[r%n;p"{v LnR(ospqN`~e4ﺖ@cMg|OĎ=<&T-es>[Co{o>s۷\v{۷_^Oڋ9H27uЧ/ ɆW'Vԕ.Fbd;u>'eK.~cN?8ga(5~LrSŠ7vu1e~V-abگfʵ%A}WrX,#-v]mr~R_UYO$W*{;Q!MjcRawݏulDkXi 1[5n}zo+zYaO Mnu\O&n[=l^8|\Hyw'Rk{c%*ڽY+}kcS+vT/ $EuY'+Qqp\<]᲋cK}ٽXl}D|!un,lXQ%}pXX7)\renNf9ئy0Rc3XQ+9|u_e[.MccL`NJ9$³ XS(H|ƚnza|1I[I=se{̑CcX>%ű[wcE-9>#^>%]8e;|^,9pW9x5R܇c|^,˦v{L=8~L7E~QM}KY!EŠ+~HH0˺\furenxΛs0{7nvqBys7UXSyCrp閱k=%]ľ^ςc>=dsR":-'G;B=ڒ7bM ³3]]|-2(|j S+ QG3Eso͠;aIQp.a%ݤkm,v/','<+<dz ׉9KQ%%nbIlEWm)/'jh7g"LGz3je/-9.cMe& vE3eSn}ٽT*F19z~Πnۘ4Hd޻ᨦpU-u7G5eْ.b_vY%Θ4N}|fZyN (f{8'yd-v{QTX]؆b 7@= FȞܮkVT,51YUNNw苒?D`1uŎɐsaMSrx,lct{,'M/A~ȓcOON)8|ZhcEbJa;˲%]vxX7>y9g%mlp콛cF cE'SV#yM#.}9uss:O78QNer^>7s !lԡTD%n/:%qlQ >}_RrnΩp6r<>\AQ˙XS3w99#O(}UKn-ܑ{ J.y(S-FX &6sy98%0ŞBew8doW>X5GNQjM}iV=%ݎGN[}ԝYKnH1_r=u%OMŤG+*wk2ht5leWsyte+snQQ#5Xe},'?, ʒo+sAM+n=T9iWanJG-o8r1,h0/O>ʐ$qenbECsxICyyXʶ\v :Gҟ,P1/ƹAQD:0VT[dqElϥT%嶋ؗݯʰ|WA# SW52NWm^m2Kٚ3w9 kiՔA-KuaEQbgPjb֥TΏzm)/,H|~r_8L1 L.-Hnse]XKL}eh>v{T꼣|9MXrUW#Q7)jO,{ԲcsG?͉Fs3mի7-t}'uU9=8I7}>f,vuN.0۬W7ZC<9Q‘ؤ.4!v.  mvfLN^Ijom`0LpD2 ;Raw}rO.$O'5眫o}{''K.KrCq^3PS );Y?'VTs_K7/ˮ0)/f9eOٵ)űppݔ]KAXQ5cH)8[rSnRn]0'* R^y4;gr5\K٢9`+AWٖ.awGw΁VSJl63;ƚy*Üܙu<%]vL-JS=zɵߝɲK[n} }΂LDi L\Z8qГ{>ga' ]@KݢqK.K}ٽrdz:VAYY8etEk7uX\rzFV8czw]EF^wm/].m97VW4X}aMͬ\t;^tL;Bn}ٽb\9$Ugu. ɑ5̑zsI;#a[K^n+7kNF QDkNI}Wb9JFiSn4Ad-e))gy e+x=,O$7sÊjhN#GtY岫;6z5K˝k6)<շ9vr.%˙uP[̘ey)c Yk'NXa<䕓JaM8 ܚlugzӟ7pf剔=Vbk^ p f.#e5 :3KHh$uso\`6GB(v5qM*}Gmcn/\Td 8ũ&Rr?vՔqgR~[OOa;u骗6vc{ڝxs-ds$WNep;)tJlaʾ4'-mo3NIjǁ cbS*>f83IDcbu:XΥTDے.bvYS"r\5&h)./ ]3ںް"l;h \qJ,rnrvΩ>$u:"TC#+JZ'N>bs&/"IӆM{s%Ι)޸71<2q+fWXSc;% 1UV̕ʖ\vukM_OY1jӝ£1J)~Wo~t|y(~w?bT>GBbol*|DX? Uhڰ׿C~O~~ЭS?ҕWlXw?op | )J.r}Ay&Q /'996qȽjqm]? n? @6 ؞?l/# o끧oU?AG8 ~VkYχw0>o*ܤG<]5q sw?7Uo endstream endobj 398 0 obj << /Alternate /DeviceRGB /N 3 /Length 2596 /Filter /FlateDecode >> stream xwTSϽ7PkhRH H.*1 J"6DTpDQ2(C"QDqpId߼y͛~kg}ֺLX Xňg` lpBF|،l *?Y"1P\8=W%Oɘ4M0J"Y2Vs,[|e92<se'9`2&ctI@o|N6(.sSdl-c(2-yH_/XZ.$&\SM07#1ؙYrfYym";8980m-m(]v^DW~ emi]P`/u}q|^R,g+\Kk)/C_|Rax8t1C^7nfzDp 柇u$/ED˦L L[B@ٹЖX!@~(* {d+} G͋љς}WL$cGD2QZ4 E@@A(q`1D `'u46ptc48.`R0) @Rt CXCP%CBH@Rf[(t CQhz#0 Zl`O828.p|O×X ?:0FBx$ !i@ڐH[EE1PL ⢖V6QP>U(j MFkt,:.FW8c1L&ӎ9ƌaX: rbl1 {{{;}#tp8_\8"Ey.,X%%Gщ1-9ҀKl.oo/O$&'=JvMޞxǥ{=Vs\x ‰N柜>ucKz=s/ol|ϝ?y ^d]ps~:;/;]7|WpQoH!ɻVsnYs}ҽ~4] =>=:`;cܱ'?e~!ańD#G&}'/?^xI֓?+\wx20;5\ӯ_etWf^Qs-mw3+?~O~ endstream endobj 401 0 obj << /Length 19 /Filter /FlateDecode >> stream x3PHW0Pp2Ac( endstream endobj 405 0 obj << /Length 19 /Filter /FlateDecode >> stream x3PHW0Pp2Ac( endstream endobj 409 0 obj << /Length 1369 /Filter /FlateDecode >> stream xڕWKo6W9h̥У( thѣom,ldM;ád+53e:;wZ%+vJ湐L2c Ww<ᦘ IZ-9w*k-}|P5eEH]̰$Ky^Lo|,TpM@= Lyz-d5ڡ fRf!LXݘ(Y#v9TZ0ۛ,D~co`xNx+,bzP n(s5.h6\&ӜFSvP;h@;Z&v!%ӡVL2|M%| :Cɰ!b 5dxcȜ* g~*NϧU"Bɢ Z#MDZS<ug7׉oߵ' T3{jBڨIku .-g,lh2Ocr7N)b׹FfP."B]Fk^;y041~qnFDO<: 8ly*B'#HW%%<}80KC˜ sŖք{5DĻ ''ׄDqI{K*x ၧ?$6A<3wč endstream endobj 414 0 obj << /Length 1189 /Filter /FlateDecode >> stream xڥVKo6WT"OI,-mZ[Fmm,ɕM;CRr<~Yа_-?H1FR{Шxo(LW~?-LJ}; UؔC6*~T ;^O ƥcmOT,^?LUPWޮRɵ&10יO/Bw(.JJQϞ &h8v6:Yۍ9OLYl? 6\?$)㶯0^&Lb{5 g`#gtNcTlɅ4Ak Vw;Htlȑ;P"y~-zϨ ؝d4Z& yшMÕ"΢^ 9˼sX3.,U':ꝧf|X!2f;>p` R- e [Ρ9e0n9rTm"L[Ҍ 9Ɵe&\as<t3jnTIY 6a;L/Y_C B_FALB1wx;K/puOAw4J6H'e0SY<|'!HB !T2$^_=-LK,YN(ۮAY5ͬ> /ExtGState << >>/ColorSpace << /sRGB 419 0 R >>>> /Length 9968 /Filter /FlateDecode >> stream xK%Q)^RU%FH,,< b@`ۓs0cɞuVeEDFfe_o_/_:*g?߼ =}ܯ_]ޭ~ʂw|7p ӯuo?v^z}5sE99VlgQ\3eDY29Nog>MγQٺ8DkYM9׻S:4iG~9"^/2xYl~..p?HKwYw7y/ޯ gGyGϹѻyyNt2{\ϣϩ[Nt=Ii7oͺ\n|O=|`cUp)_S^i}u<}p/z=v[{p~z(j0uۖߥW0~]xj˽~OZ*n<{k' XOSW~{Jx]L-y~jsvmv=~:zz9Oys= `ng>eϥgGzͿ43ct3?x> n{慺L\kcU׼zY}H_fX3ղ^Pkj^UWͬt\:uZy=_OE͊j~O-jcg7zV|床K?ڟgU]NՏ_NM3ӆk| [4Sv-v1oTM-f<ͬЯ=ޚzzy@ڟv]NuʹG=??{#Yx?^U{?_?ъ}I,>z_,֩W}D?rE?tkv>SnuҍDk&O7?Ku<׼ ?˼boxМgeWǵ>]OM̏}_|ïy Djo%3 u=(0K*֟O/ ;$h#15f7鸊oq'Wu{!?C>O%|][įucy߉{;/kvO%~ԌnES5=="(D?/F14-v L4~.8{P2xLk.~O%~㺙U_]_R/o{uo_QK}?joXSC .x]q|I˘\sK:kM3zvbH%~wƷ}YhO/[z^%0u=;<ۢ}f7筟/ƇJUkF=,_z{<.35Ѐd?ߏ=20:~DڶX [#ic{q<3쭏0{@8XïX/T3\ޮWoVGǵMjoM*k<ӿ>mOVVˎ7u`:}Y +ݦb|绗ߔ%<\0 ) 4Zth. $*Щ @'6P fl6Htp `I-: Fp %\ @6@MNm%3A@%Mƕp z $^T~6mp. tlJ1%8bL%܀K:=:\P xdPF@gӦP7T݀Kj'ipI@g'@<p= HMH͈⚑q02 Q kFH;@\32223 FDqHKHˈh⚑.A ѩr@\3bY02; )GfUFZM⚑5"q5#-!-#U6⚑FEhD4 kFZBZF YЌi[,kD.5B3R #5=Ӷ׌<5":5#5!5#׌t>B#qHMHM1ҌHOϴD5""ЌHMuIJ ׌C#kcqHMHHeo4#=!=#:kD:{i iL8 !o4 g#K#+qy)h5##!##{хGf%eao4##!##rif%eS 4#FdP 4 oDdiF/I9ЌNFLBhFZBZFnNf y(Ҍ`V!4" ,B#2(K-ɧ4#5!9%sbZ8Zc9ZFXjiFzBr,U+RK#8ZKαҌXK-HMHɱҌP,4"c8ZFXjiFzBr,Fr,4#5!9jr<XjiD:RK#28ѳ4#K- H?8Z%/HXjiFZBr_K-HH͉y8ZKRWBg^9ZƱ҈tN,RK#28Z/ɱҌD(K-HHű҈K-HKHñҌP,4"ciK-RK#9ZҌP,Ft3  9i&4"kB3RR3rќMhFzBzFn NB#MhFjBjF*'Ј4 H$4#8A8 I.Qg:4"'f&fHOHEЈC3RR3P'4#C#RiZ'4"=AoN: C" 4#-!-#'yЌJF"o=AouB#R)i4NIhDMf%$%zuPp I:)fS(Ry(JЈ4JEf&$'WTDhFzBzF'KrHMHҌ`*"4"R88YLEFTDhFzBrp"+-^JЌԄnHOHHdiD"B3RRb'K3ЈHdiF0R sS*"4""B3R*"4##!##锊HKHdiF0y998YLEFP*"4##!98{)ԇҌTJEF_NЌ_AЀR!o4"'"B#R(K#rq*biFzBr*B^0gziDNE,HMHNE~iFzBr*5NE,Hgo4#5!9"fҀ듈,ɩ  ɩ~qp4"7"f&$"ҌP*biD*"Fqp4#XΩ lTҀSK3BsiD~|>` ^|>Gۏ}.siFFB7sy>s. 39~|>WziO#!}siDϥi I($4#>C#r H!t}F&ty}f'g H#N34#=!=#gh@NۇfghDNr )>C#r HMHM34#=!=#<H%ۇfghD:Ј>4#>Cb/odiFzBzFNr)>C32rQ&?4##!##<CЌ>4#HL~hDxlFdP&?4##!)8}64"'eC32R(ۇFL~hFZBZFxlFR&?4"<fC#)&ɗ +09VRr& $' WN>4"{ }hF/kDxlK#2(4?64"'eC3RR3R/HOHEЈf&fL~hF/HL~hDeC3B~iD:eC32222/ mi i9/HHL~hD.Nf6|XR I}(JЌĶTPCHdiD"B3R 'K3ЈHdiF0SK32vs*biDNE,HKHNl@gY*v"$'s*biFzBr*ˮ ɱT]C#/f'$R_v Ku~54#=!9y>:KƱҌDO]C#28Zz#_[)σ>x{,I.-nE1*Qq_ EQ:|.υe|>pe,-u`ԒܨUpSw|y#_)M?:"zJG@x ׈M֥^^^ +'vY;Gi'"oCeٓ*v l<Ud"<@ecWVBe}bUVBePYE *YAeݥBa<窬"*kUV|TVMY."{&@ePYE`J* TV]UAei*~We9g"gU{i[+XYE4VV hݰF7$* =VVᱲUH[_*UDce}{UM|"*rXYEx"cerWQYe 쐀Udk"F`eXYEw*J%Qc>CxrQYEPUXYE*TV*VV+(U"VVU~ 3n8v^ **~ۢf"+H*bTts"ʖjTK?TJE$TR [:*2*ZEEPDE:PZCJ/T?W*2 UOA}avʖZ:e,ACˡcP$r(B9XEx,/"ˡDPPb[K W g{8X|,'~<>,I+(MwF+ʡͦ%Pˡfʾ~6Gʍn`>،~^l4$>KI?wNXek+w+I6/C$C95(ˡDˡʡr(5PˡPhU eX EQ4)LADP %fbp}ep?U%~B(:k شLLjIMifU ? I>?jtҏ7ɓ糥|?kF?qo^mhl{7jvi; Yyp}v"c:9bLvO?ƛAӴ~t㽤 CVN_#\H˞/"KMșcؖHM1lor'Lv5O[|Wr(ytvI"SS!^/"Wxɱc؛Y?_Qu=>_Su_Uu_~_Or endstream endobj 421 0 obj << /Alternate /DeviceRGB /N 3 /Length 2596 /Filter /FlateDecode >> stream xwTSϽ7PkhRH H.*1 J"6DTpDQ2(C"QDqpId߼y͛~kg}ֺLX Xňg` lpBF|،l *?Y"1P\8=W%Oɘ4M0J"Y2Vs,[|e92<se'9`2&ctI@o|N6(.sSdl-c(2-yH_/XZ.$&\SM07#1ؙYrfYym";8980m-m(]v^DW~ emi]P`/u}q|^R,g+\Kk)/C_|Rax8t1C^7nfzDp 柇u$/ED˦L L[B@ٹЖX!@~(* {d+} G͋љς}WL$cGD2QZ4 E@@A(q`1D `'u46ptc48.`R0) @Rt CXCP%CBH@Rf[(t CQhz#0 Zl`O828.p|O×X ?:0FBx$ !i@ڐH[EE1PL ⢖V6QP>U(j MFkt,:.FW8c1L&ӎ9ƌaX: rbl1 {{{;}#tp8_\8"Ey.,X%%Gщ1-9ҀKl.oo/O$&'=JvMޞxǥ{=Vs\x ‰N柜>ucKz=s/ol|ϝ?y ^d]ps~:;/;]7|WpQoH!ɻVsnYs}ҽ~4] =>=:`;cܱ'?e~!ańD#G&}'/?^xI֓?+\wx20;5\ӯ_etWf^Qs-mw3+?~O~ endstream endobj 425 0 obj << /Length 681 /Filter /FlateDecode >> stream xڝTo0~_)Ͽ CJR:6|s|vsu <3)!8@k}?}Q ^Zg&p{mCHު\% R1j8IdS1*bH>b=(JJa R潿O߷\Q%Ba,VGaoPb[v3-f!Z WDwz}RL#ΗQ *u:pȫ.z؟Siئ>.qw1EԈuMSz u w bqR;iB&E8ī$qJ|SCQD%K|ri]7cp9?3~=0{2h rN!w$/NoY:r°qj5VQ^~_[!7Z7(+ص?>òit8TG0h(evnVt.5`P8`T1 endstream endobj 422 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (/tmp/RtmpnZmxNj/Rbuild6f0944457700/timeSeries/vignettes/timeSeriesPlot-chicUnivariateSinglePlot.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 429 0 R /BBox [0 0 432 432] /Resources << /ProcSet [ /PDF /Text ] /Font << /F2 430 0 R>> /ExtGState << >>/ColorSpace << /sRGB 431 0 R >>>> /Length 18245 /Filter /FlateDecode >> stream xq_HD)` R郑u[vHZ397?Z jm})rs~~9?/q|9ޒ?^_d}Oڗ>ҿMWAOw|?Wy/??O?y~r~KLʥr|&r !KrB9ˎ/Tzf9〜bWu*/}uB.&\|9N|r8~_yafr4r^5iJ5CM/ j5HT/d*/09䀼"MNe_[&KíkR ';CnҠǠ^2&trB/|$[j{L{Sjci)zB[;9fܩw=ߣȟĦz =V?~y.4g ]@z[rA_8|@}}ibߧ= 庩لr%r߿bѦw h;OI7dzY/pk8~kczQnOGZ/\H} }Mk:Axu~97ڰA__ΞףٝS^ua86 mywfZީZuާӃz[u7;V'tz=oU+޵C `{/9qeao>o}FC{c 8e}=OFً} t7ƷsZўB_{E(=~ezО/G[{iQmiE5ߣ=w'Sv 3bg}=wm ݭ>kF֞;ˣq6>?ОۏLD^boF1y{ _ٞP=^ynxt&l mןziF{hگw@ ck 9 텠=8=i;Syg߲ix{@K3}#hWAȴ=-۳GOz?=6j'7og낾'W했\3~h/G?ɁM,TOh3v%za~=:[ ST߈_|7a[@xja&A{573 +QhTij6ix{ǯ蟟}-x~==ŃM:[Η3{=pqS'UO m_3NOx}.~iG 4߈_~mb%COm8|>,~]|>v?=73~6asύTmߟl>x7momg 4/m8]3>\Gۅ|OWuR _xY{P-i~֟nw'|Q \X؟l{b/ W׋ϒ< mkו淽w?+[{T?-[o|l3fk?فgCSXŃϲxM'OۦiBcO -ϣn>-xJ^`!ۿiB<&Og>ǣOɿ,xjh|ۅQ53g|_D*yl׻{5_9B)x.ykROh}+ٞ>=Cˁ՟GgmϏ??tį~ҟ W.og>K0o'Ђ<9NUZkFuH^umvY{02l/h)F;dۧ^>A@6'E7 o{~kpj '(QN ߟ;QxՠtvT(jJI5X^q~«*('q&ǍAYA8V)@M' ׷«@QAC럟zؠkwNRZP\ }'-45(7o_꟠F8)QՓFJ^=P:Px }9)(^?U*Px=>@ɍv (jq Wz>=Qx~?A#! ^(|Ǥv'(W8nD|`}@A o>oƃD?>?,^(&vA} ow#~!)|AqA8B{^A=' GE7 oM6@ n (iPuIOw6zmPpe6OPxg6OPxA )^ukeDRH op~|ގ'(DUg op(;Qx@IA«F{W F@#6-o} ^V@8'(^_w=Prz~Px;nWxJ Z/o^aV%@ ܇(m^?AU*!(jRpǪ(˩Ydp (jRzma_PxS}@U78Jn^uw jno=?(T(¯( q\/(D'7 <›/(6 277?AUc^K(Ǫ(6 7m^? G p {}^ t~N/_)+))u~  yR#)j\(=q*oy "C ׋ L^5?o^?($(AO&Ek{wy(jPWPf')iPoU ^E7 sQx ky~}z^ԠFxE ǃhOWMjo^a6 *(}^>AMo^a1 po4Qxՠ {|qkxzSRx>m`R?WPxՒ(i>}@UD}@*ўo^/(jPdPxZ8>ОO_0Фy^h߀«DU|^tn* (=PrQxGw t/R`쀜?zf (8(NG*)AM 0r 0о)S.-8(({B 46kփj5()A)qqPhoH}^_H=\x,¿ p 0}^ hKD ;SQSc8e?ڃNNNZy ?8+u ǡAR>{¿ t C 7)A ޟwS7Ru}\&Z?9?֓7:/AmsU)N7~1ws"{.Spυ_@ ﹩ /ڞ / Z< snXOe?ߔ ʗrA ?8xAFK 8%?Sx/ks n{<=Sx)/?5)VhPW6^0HmIQr-LIg~>O ]dW£Y^<(0O;W wrp b|)'{ʪS ?Rxq sOIO_U ?SmPx@>q72Y,/RxPU?O:??Rx`N 0K)G{'*Sx<Ǫ*Sc9W fߟ^¿Aȥ?8[‡v Y?NOBt N Y:83Sxvy)B<(IOT^vyPW¿dSx=ޟ_a[/ͯ n~/}/+u9~4_O?OO?/ÿ^͟7wܷG[v/2t z(۔> ـ0pa8pUaHy[/Io~ϰaoǟW|\L>`wkݓYTbXհ6@ k,Y s3`* Š `2dV(A\`2,~ Űam,5pA .aV Xt e1jXR_e2 }aL,F5̀%0PNYd2؋证2bF}64bjj\&Ùz@Y fh(AA6M@ XH e1j"@Y 2A0P&p@Y Caga, d_k8$26-X_~-ղjYf*k,Ljgs$B]-k݂EB-X-27-X=-ղ6-6KlkYfFvaq]-뮖uolwZ8"tQ-sljYedlAkYndYn%-yx-27-aq]-cr(#tY-=Lx-KZF=x-"Evm~,قTB]-c݂B]-YdH>Bg,26,g jQ-=zy-J$ZƬ=r͒Zdn`:['kYnuw]-YdXjPgu2w 6|-RF{5:[k2ڻKNjYe^G{ق ?_ u2w]G{ղ6-02hZfE 9]-ew-Ѓr2ڻΖ0ղ6-'Zfj=ӡ,9el[ZCWl-r>t2v]@Ojɣ}leY'tzBWKCgeղ6-eY't2wYFղ6-hZf*'t>teY'tzBWKCg,:em['ee27zZ?JpZNl9˲Nli%8 ]-EΖ^PDjYe햫rZdnEΖYPDjeNZdnY58q,QPDje얳'% -'%rZd\i2 ]-c5 ]-YdH N\g*("tͲ} '%r:[Z N\WKFZfك*("tEYEYn58q-RPDjeUՒQDdGAj("t"BW,{p2z]gUPDjeN]G{ղ6-2hZfE ]-ew-2"BWK]gYPDliE2ڻΖ^QjͲyuEYv1G]WlEYQl:ڻYv1WEE_rVZfكػ,;^rUZfQ58q]-EΖQQl58q]-E(ufكXAeE2|ΖmnlهOZW빽nuW>|(c\_ kۯZOz-sms'jīŲ؍)Y5^jdٮlنOՒr3t2|<|Ζ^r3t3te ]-Yd2|ΖY26-R"Ev*gd9>t3te ]-Yd2|Ζ^26-W>CWl-un:[F>CW,cԹ}jgl2|Ζ:]-y ,,n"EvYZfZfYCg]H~je:]-ΖYH~lsՒI~lY䇮Y u䇮Yni䇮YnsrZfCWK&e:[>td:[ղ6xkY;-3]-YU!_˹|/ZNvd I|0-[>tuw]-cR5/_ uԹ}j)lY䇮,Knu䇮Yniuw]-YdBCgUG{26-w!e:[f!E ]-kݲh:YX4,en[:ڻYniΖ^R6|p-WAem=8wAeZfك}-sG^6[nΖUPDjeCN N\WKF,("t"BgK(uͲ'(uEY5v_ Ek_V͖=8RQjͲY_v ]-k챔ԗ]CgK}5tfc)/ΖkjeZd챔5r-e26KɬjͲ/ΖUc)ׯۛ7I}xHfywQh͍uvg߷6CI4^[~G*Q2G:rfo]kj{.TY\SӍm\cN?\z.흺~JL Wo4lo Z~!dٲǷ 7sǏ?uc`voiڰRyKn;sɁ= pT%t1e{a 2WiJO 6S=Քb)[_]+6wNNr`_hlۤ2.GpOBl$ĐtlIX[ wnE}e5,b TǦCr[l3 a #]m~;]bO9/!6PQ{G9Y,GGy5qdYkl_J۪O/r؂FmS,;Ondˍ]@`j%NmU*ҼҺmH|l"4J6+GɍIt1؄D`Ñ8 -@Ke`iR tjXGOiޮh&0#~_l!,|-,/)^i"^>[N<,Ҽm2f/h.˫v eH4Vq w=4ָ&rz ۰@X'Fr6144ɒx_-_.-bJ½pu\fTKfU,JصgWֽ BNv=A W(ʯƏ+dzd^ZWmTye./bWWCmYve.VAaW|>E?K=#szyq>D],EQWZMPꟂHUBAQPOE[;ߗTw]R^J{OE/nT=\^}jR(͛5T ^ *Y@$L/W)sz52'xJDqf+2'+[rʜ~V8eN .ʦLֺdՔ8d&:DdTLgS)z)G\րF)^lŊf+ 2krY)% L[:)oL*&mER^i5RB+lB(2Ldyt&Qe./aNJ(Dz4k(s>QE8ˢxΪ(n(>Z&O"(<ăP,0kxR(,DB(rz <$g|Ln5Pd!t@yOeR(x'j~"^OP䍮YWV>O$[YDU=fa7<(%O&X$ hz$Buk#&l؉O.X;GY'N,t"' Ήoqޒٞ*a k1RK!pT8^ib(^:OM5ƕs'H?dɈq*{)CzI8ee"VwyK9aA9He{Oeik*q83BŤ0#A hD% HUcv2&]b"KO6ѕj 2u:&8yf2bV&)ē IXriC}eFꏴR翤f\>YNUK|ZʄHiS\ b:>V(HrcDxǔT8HI"!3!ğ_&`5!*L>ydf_)Xt>c(,>pBr;} )O;3M; DO/A .5c{$. q3z.iZlug ].4 \(vEhWX֕M&߶$+ ˯B\j˪zR1WX O7+d4~,:XR. %huXZ7=GEN,<MO# Q鵾sp'Qtękă###ڼQd!ZtX;j;A <(CJ^*+rX`b E?M[5*ذp<)> ͆8anخ7Bl*!bmV P`ڐT[[`(K=qX((mlY5?opYusFZ/Y5@b!\_yd^ v$FT,)+-f? ̬gKl+ HjUf;_bEH;Z6%5A6ru86ڼ.nAM܌hK'[\AudMY!m^p"\0k+eZ'5֪jm͟'k;?pk;`z>h I5^q^8, O[3l f`qg$T['H-4] 'm']hϡ-Z[yqݪ?6] Ɲب.juB  ȑt 6FPTo-6 "!з5и:aDoo=F{V?H,jr#:a]І``y?i\Pp+51  A  ?og@VGxpO7~<%qW$eō|Lɍ+Pe=g[2CU5ظGqmB{%K|\$@f$~5psOI7U6nZ2m\/Orzpp7 psM!)?,Ȯ|>}=ω~|r7Oΐ'pI n|.Ӧ_L#kDp/ŗ3e0o[&no6t#Qj<+ | A-IEAhH`ѐExgfq+v `>X::up1{1#^slu150,O6-D=±[˳~}n,|[$o J2=kڞM| p;Pm!%d[mlgX Upmޫk3Sck&%k3H4@µAbm c'tf0kY`mq -lX;r#kAJa"0C$m m<;=4;9lŌ,[B-'Y*Xvec$qU &D9.|!A=8!֛Fm GI"W5~- = #:.#FZ:#tt_DIԝ$jI 3I_oН1aszL.#*Z2ڟ&Q_oyG$I191;D>b>=!IԞ$jO*fuDM\IԞTI6IwbrYM|{hD5?ۙv$jDl7KL7ؙD7iyX$jDn&QD͉'Q;eI&Q3ē2/2J$Q7ϚF>3 DI L1$OIAi4M&Qߞ$ͩ^6 I\}I L檫'Q;auc#Ko5`" I@Yo5.nOLĚLv $jI=ZDͷ1n]v0ݐzjx qT=Uc%ʇMú~T>?l*j6U{Q0Kt (< UrxXbæUz0~T>U?l*26UrxXæaaS(mk?~T=,尔\a|E~T=,XPæa0aS(G=5(?l*Ƣ6UɇGikXæa)–,[z &7:a`K0d1k0Y dL-`jf07;`qf0 va .uW-`|fXհ6-`f07}3e1XLnY s3CSf"Y 4L-VsOMF+Q$8_byk0F5` fj ߦ,r3(mKd1Sn1a6`l5 f R l 5,[~ &7Ci! a,[J~ &8k0Y L-@aV wi!_0anɱ/f=-d1RfV5JgY =aV L(9fH0e1SV/ ae, 0al[x &*fd1e R QLr3H5lXĕ]F5xY !`kfj0xY 3G!`)d1Xk0 0 pZ/ 7ìl`2^@nY x$0_F$03),U Ͱa F Y g&&aV pr3j !LnDO(aŰJgELKy 2I f虦Pn W)aΜr3$BY 3sbܙSnV(<2],30al{Z ʘSnRȘf, 9,1 e6hRS2@nY s3,1 f07Õ͐zZb3f,1 fXհ6ΜV,aVC,0 e1ܙSn6SCa3fXհ6Ý;sbPa3fհu`-d6\G,aT g!7C )尙Y(7T֙_w)a䰙r3j:KJgY +c0͚M;s͐fbhPCϘr3j:a3e19l,1 e1ҙC䰙r3ja2Y:s͐0 e16SnU [g>zi!Θr3jXa䰙fi!7ìV,0Y(7Ci!a3e16SC̜l`6CnQ [جMB+j0F5ͰJ rO rM`r3H5f3,͐aT6̜f!7C!AJ a,"RfC35mϔULjDHCkܟ07, d1҉AnY c (7C ) e1܉QÕ;1͐Ebܟr3H5f,ɝfjͰܟ2RCH)NzSnQ c3\,;10alA.fHsb Rfd3yOY -)7ìJDJY wSnY s3 r)7ŰjDRkm4װ?vLd1y鐲ZSCH)s0anRCH)7CS?fXհuHh k[2c{ ?fհuH }3U>d3yOY %" ,PbZb()e6 Q? p?f06C+=-d1\9\ fܟr3F^2,sͰamUzZl a fhyOY t搛!CÕfͰa(9d1< fҙCa3e6Ŋ0@ÙJgRLY ͐p?fհux5=lƋaa3^Ȇ3%%r3j  d19łr3H5fe,G_ý1~ {RHRR(a2rɟ*w򿿟`\&}7]"w4~0' |w|FB޷m0Nl>UG%N2ό?2YxG\@^#.1z2c{폻]=<O>lx똵`=&Oۥ^r!kz|co#~-?6ICIq|s,)̓vVͣv4Iux<Կ)󀲝e;e89dǷRVJqU2l;edQ_oº߅uǏ 6,F endstream endobj 433 0 obj << /Alternate /DeviceRGB /N 3 /Length 2596 /Filter /FlateDecode >> stream xwTSϽ7PkhRH H.*1 J"6DTpDQ2(C"QDqpId߼y͛~kg}ֺLX Xňg` lpBF|،l *?Y"1P\8=W%Oɘ4M0J"Y2Vs,[|e92<se'9`2&ctI@o|N6(.sSdl-c(2-yH_/XZ.$&\SM07#1ؙYrfYym";8980m-m(]v^DW~ emi]P`/u}q|^R,g+\Kk)/C_|Rax8t1C^7nfzDp 柇u$/ED˦L L[B@ٹЖX!@~(* {d+} G͋љς}WL$cGD2QZ4 E@@A(q`1D `'u46ptc48.`R0) @Rt CXCP%CBH@Rf[(t CQhz#0 Zl`O828.p|O×X ?:0FBx$ !i@ڐH[EE1PL ⢖V6QP>U(j MFkt,:.FW8c1L&ӎ9ƌaX: rbl1 {{{;}#tp8_\8"Ey.,X%%Gщ1-9ҀKl.oo/O$&'=JvMޞxǥ{=Vs\x ‰N柜>ucKz=s/ol|ϝ?y ^d]ps~:;/;]7|WpQoH!ɻVsnYs}ҽ~4] =>=:`;cܱ'?e~!ańD#G&}'/?^xI֓?+\wx20;5\ӯ_etWf^Qs-mw3+?~O~ endstream endobj 437 0 obj << /Length 625 /Filter /FlateDecode >> stream xڭTKO0ﯰ896?@RJٍ̮6Q},PZem|3 mC_W,٥~@%-G)  3dD LqF `Ӛu6~o1bf ~~.VrC0DDI}3$+Taq4־,II%p/Kĺmoxq܌:u]L%\*OJ}hf4CTnDɥD$vbN{ќ/@VT9^̟N:])+٘v'7 \Q -R4gsib*^!VBD-e2m|S{狵S"|,6[HQ5v?]jFPM>,/_`9SQGqd8@>r$8})biW]2 <#RFCxfD > /ExtGState << >>/ColorSpace << /sRGB 443 0 R >>>> /Length 10181 /Filter /FlateDecode >> stream xKU߯x02MH A1 (JG }|MIHН~^_ʻv-{8?~/ue U.ǿN:^^Wc|u?w_dw_/}9?~7_NrWkE~/w}]Gmu͏~y,2U[}!zY~"Ukz?\K{чmo6G^ZWOՏW;\˰~{ZǻR/(z֞楺F{?Bk{痌6ѷnҞ4^!ףާy֨癌J9? e=_>~ ?m/7ڰ(i{iY]O):J{_޽rtO}^ZuaXz?kU/'}>~Wھ۵o &wD{liUwgk]/mjnDgudi5k6z}nC]3>绩wУx6gѺWc<A d2xu]/͟ynFu@E:j`Zkϗ%?=?l|rkbo5D[ ,ځIp5om@`F7 tbfAχ={o}:;!B|wwcM_J%ޕKM|M$p \0 q67I%K$`Ckm<$O%FRЌPЈ4B3BRhD:J(fЈLMo5#>8~ 96_B#R8~ Y$6_B#rq^l5#Fq3ml5#Fdp]5#Fl$q/)FzF\3BKhD._B#bƖfЈ4_B#bfЈ _B#bVfЀЌ|t?9~ H%4#bd>NW_B#rq_B#+Fq_B#uz#fЈL]ވk@KhF(~ ȩFp_B#bfFR3BKhD̥׈bTjF(~ ٿ6^J/1F\2ya*5# ȩf=m}Jmxҡ(fJh:u*LIo䥪ԈbUjD:J@iXR#29P JmJpҩ9)PJJԈT R3RjDx+5"7J@)5"Ԉt R3RjDxA+5"ԌHZ9)PJFR#R)PJFR32;#y7FR32/F(׈rWjF|@)5 R3RjDN R#K_@)5"ԈXjFFadϓ(FR3#yғԀT^KJ9)PJfԈT R#+bi<Ԍ`^KH@)5#(FWR#2)PJJxE,5"'J@)5""JRjFp>5""Ќ<ƁRhD:J'#yҼ"ɁRhF`䱤;a'V' B3ԈXjD*J@)4""ЌP^KH@)4#(FWR3BRhD&Ji" B#rr^KJmEL_eÓf"IoRԌPVJ(FWR3BR{[(P HԌPVJ?9P f" IFWR3BR[ )P f"o.I@Iڢϥb/6 @)4#s2Xڗ%)P ɁRhFpi?5"ЈTB3K8P ́RhF|t@)4"ЌPRhD&J@)4 @)4"|O]Gj#u5SW󑺚恵H]|{j>RW=u5l7"H]|{j>RW=u5Nx7Ԉp*5#ƗN]FSW5Ԉp*5#32'ͩԈp*5#bd>OSWUjF|4Rrr*5#FSWUjF0"KR#©Ԍx4R#©ԌH4R#©ԌH4RR8uR#©Ԉp*5#FSWUjFZg=OSWUjD8uN]fSWUjD8uL]r*5"JR#©Ԉp*5#ƗN]FSW@)5"Ԉp*5#(FSWUjFOaN]fSWUjD8u^鏓8uN]fMF9uN]f5F9u ԕ|L-u%@~K]ŗ0yJ7R#©ԌPtyK]yK]G#@UjD8u U|c#oFRW3P9uƩԌPRW呍c$yK]IyJSWUjF(PjoFRWy)<ƩԈ;5#(U|e#o` "@s*5"JJUjD8u B#©Ԉp*5#`d>OSWUjFFgd~}T?HB?M$o ͟|Gqo.Ď,sO؇dP}t>*l×ļoSj_#u) {rť\A|] >0We}4 ʏg~7":] E|P EP ELP E܍P kQ ELP E*B%"GP䨠z30#MP E$TBQ宄] E~*J(C%16B%P E`" PC%HVl8P EB%Q E~*AsWB*J(ܕP P+ *lw#TBk TB PDB%-u@P E$TBQ⮄"fGw9X E|X E+J(nUJ(bJ(+ X EJ(J(rT"+dOgd=VBP@k"?Ph"+c%B%َPzb%َPb%}͵K*c%S +J('X E*VBQ#:TBV E VB끕PDc%JN\WBɉWBPtXJ(KP*烕P`%X E)TBP*"/a%X _FJ(MlJ(ڭJ݌ : $fB%="۱lJ({fPpTB^MprX edJ(r? *J(9uG\ܺ3iLMY9v>& h6"PJ=kZ{JJr>#+drNnڝ3qLX %nJ;Pr~v9"Pr~~9~P2# ?VB|&rqn?|dX %!nIol}wgoj?l/kr~X %^j۟-KJ(ٲlJ(+fX e_?[і3k{|=>*/ؚ_Y|/ok}\_߭JnV %9^ X&++d+fP@hX EVBǒߤ}ZPt++l@˔DX %6$c 1|J(2 s+O9^ZAal$~K4܀Il#hغD.ac&5 Vp@0 MFqM17⚐fDL#bI델&DЀFRqM>=1M~9ӈw67*% o8n5!C@L#b܈kB01}{n# @L#b5ۈkB+`&Di@ S&D'Fľ^ׄ SFľׄ8Fľׄh ӈ=6 El5!jP4!j4"F\2,}iD&Dߠ4"F\G@L#bو&u 5!7]Ј~# &d M7⚐AW74"6݈kBt. iDlzׄt˰'bDn5!:/4"6ۈkBtiB&E9F\&@L#b3&dP/Bhw4 |];v*ocY`@7MЀ|OZgXx?j틓 +_\в־l:7qi@|dO"nK5텧q)?gD3gyʏXξ+|}ƅ>Co7ZzGG_h3#[zC;_|}OVFO'.m}|}Ot[ L|Dⶅot*6Qо7tIm{b=)%{Fݣ=vYoS+öu;FCKskY/nYЬ'{,VT:7~>=qLlyr/:KϿSRhћ9_Ao'Ӟ7V4]7od͓3O`̓07F'WޒhʋFូnɓ[ɐn1ȍ7&$/ޒhś9`[[ч'/d O<ɄW$y<1O|:`ˋcQ~$!0[Fན"`덜wRw NO`RLd4F~;}nN^]?kOv7]klvˮu2ٵA;Ya':TݖjkEV[ YZ%g];XwOݝlu$Wݖ:l݃Khorҭh/ѭE];Er yaCZZ%]dksyS>Nr5ܖj5\+k̎lfk\s \䙋햹h8 sq+v{[dyFVSnd{F6"}In{F\Xw݃ r'Suǵq sڊ޸ 5rEgwc\ p7m'eױq&C\kkpK 2õA^6 c;6# d\n'yi8Lѳdo-~"hv[Dn}םo}m; lomI4FqMx]mw@nnivn"[tՍn|is]nR{LnM`q(n [${nmjIo[(69"Bvc[L6n\mVS[yAu56a~6y l&7L96' 3i4v4xI3[νls Z;LxZ~:!+Zd;Zd;Z&l{feV6-~decV96f%۬dci`b~h_;bmms-ռ6OIֵ{RlKף-gn[˫ai-F%KZtwh膵gݯ9 nnVW-&nUҍjcOm $]jږŇlE jcA-fcӲm;-nN4 x"#yLAʍi1v_Z^+$1tNHO-FaŰ4 e2;ڼȍhb/ڬdEˎcNy-в[I܅Lhٻ̓,hku5-ϲՙlLrms=<[ϲ,n<|gsYuLg[6oh9[G3`pydU663dYnV)+Lf'b{Zl65+4,TL,٥1Rlv7*Plv7{>3x j&+K_.s2g$Xu\`O%s xLe}&{%p 6ݖW.?lhC?y{~̿1{1s1?+~!sqA9寿rۮ'=e?:nc ďw$|8XZ}Sį᧏sķ $/ endstream endobj 445 0 obj << /Alternate /DeviceRGB /N 3 /Length 2596 /Filter /FlateDecode >> stream xwTSϽ7PkhRH H.*1 J"6DTpDQ2(C"QDqpId߼y͛~kg}ֺLX Xňg` lpBF|،l *?Y"1P\8=W%Oɘ4M0J"Y2Vs,[|e92<se'9`2&ctI@o|N6(.sSdl-c(2-yH_/XZ.$&\SM07#1ؙYrfYym";8980m-m(]v^DW~ emi]P`/u}q|^R,g+\Kk)/C_|Rax8t1C^7nfzDp 柇u$/ED˦L L[B@ٹЖX!@~(* {d+} G͋љς}WL$cGD2QZ4 E@@A(q`1D `'u46ptc48.`R0) @Rt CXCP%CBH@Rf[(t CQhz#0 Zl`O828.p|O×X ?:0FBx$ !i@ڐH[EE1PL ⢖V6QP>U(j MFkt,:.FW8c1L&ӎ9ƌaX: rbl1 {{{;}#tp8_\8"Ey.,X%%Gщ1-9ҀKl.oo/O$&'=JvMޞxǥ{=Vs\x ‰N柜>ucKz=s/ol|ϝ?y ^d]ps~:;/;]7|WpQoH!ɻVsnYs}ҽ~4] =>=:`;cܱ'?e~!ańD#G&}'/?^xI֓?+\wx20;5\ӯ_etWf^Qs-mw3+?~O~ endstream endobj 449 0 obj << /Length 724 /Filter /FlateDecode >> stream xuTY0~﯈HGi-CԦM\$)x)EUpb<5Fy'UXD\[oLsR*e {\Dxs:,˛: ?*gjG>fa?cHEp-5ExBȉ}38p:PxUlٳ/ /n ՟j4C^z# 1'G s*S.TkrS!6 &r+P6 ]=%`󲆒'+K?0. #]>ow( fDsk67c/ieq<.',[/$“TFHަ^^XFp`rc-]|$ &NlN౒C?`L~ }uI69inN s>ȡ"U1> /ExtGState << >>/ColorSpace << /sRGB 454 0 R >>>> /Length 10410 /Filter /FlateDecode >> stream x}-9Rw,vsh@ $Y!B^# gW,(O.p nEGpQ֡Z (/|yӥ}. :3~Y26֧kFYuprz~smKFpOlA\P3:^*:Buu M_Qxj#?F"?eVoGFbu_5C"Ciz[Y-eT|X=:?x4XeCJ2~qɠ//Dži[xhi9G& _ՋlV`2^Ua8>eGYCa]gk_h/:^kX5ूHpjZk`[i xazp{YfeDM{TD}yUsvefQ7 OE]f]Xka "6DFx+n~֬&㵮a&XniK x 2^F~0bI* ,”Nio2^+]#/  k$γ5S'^%~ayEpgp0 ^3-_ngh<\:~xzyMׅxk<6/CgN34u[>Oq^4e6τXf3u<6F<==|t"L{MCxD<}~x/uٕ/5m]~&VB<6F?uxjxl,:xlSp|XXs~T\a?7`Xgg/ оל5o+'Ɉ3Tǰ nb͟܈/G?w?Y—˭܈fβpX>W,e^%^" eXӰ>DnXa `]6~5qB,X׃\o6zPu\3\s{ v^^Ν#^W߷#/.,㵆w \&.=~x&*O$zO0\s$KGiXgZmC('7b/rX{XgOǂLXK@sb}%:1.~zEav]/J ZE׉0kxzs?ǂg"_ZK1b? .XFňbfe<q Lg?!e:lxܹ~,'! {G-X)gxl;#~=x~ ܟ~Ccq/#5I^վeRLU8<ڳ]/7>wQ nKSMǿt7x*Z˓Gxx/c8k<^SǷ04xp,1O27xҠSG|ij}Uc ɇ|x|no4{ǖ/}ECù.İ~Wn1wkq<O=~D[>?).`X^3vooҵX+[dXQ0 n~02L_ӿB<WDnևן?^?Io'\+s>麾b_{/:\.n Lv6ZHF"6+ﻆE P0腒FJ}8PWJ;D/Fꅒf^PW K~Z+!?}/P/>zoB_D~2} zC߂^(ic}J&B7腂aA^(Pp^W0 P'x P^(BG rmxг = zg^Eާ|kWϠ> Pڇ/xb<7 W|)lPd3)Bɯ ;^(Cn}zzBџN=za^(C腉= P/,> Iyx z ;BgJE<Ǚ3w<޸#^Aυ^(^(7;d<^ ~'.c5s?NP;C5Lð_Dz8B~ƭgD;L^s9Wc eؑ^c:~k:_Aϻ1oxByb*G6ӎ7^<@P7Cc<^_ؼlPB]8P_5}z? P7pˠ=CK6?Ao_^(z0Bo鋌3)7o ux|<B^(| u>^(Qv<P̈#K<ʯ@^(+j4}PqxW_yz`)Ʒ2ox* PfI;P0_' Br-x./*?^( f녂 cz/9jOh~wA/^(aҎ!/|9POqzi\?@C<+^(aBB B ȷC/0۠?"_[/T>  e|1^ #m Q pe#{,zvz` eP]Q/iCC ^4lJئއx\ ^(`ϐ0^(Ћ*#qy:OP/i Pa ^B/i6B6*x,|a e sk_=z\^ ?#7f2BOD<^z<B? By@;^xEotzB^[/vB|yU ~ eA}z.Kz?|F{rB3腺Lfz,¼UN/}J;z==@/C?DM#7%^ܔO~՟e١GͿRd|ç,THT#jeޡ^q&GyW8,y :AQFו*z{Mh(*SpTuo#Aq@s2ƹC]z,1ȋb"^^ώ'C^(_|.A^tYyg)/m@ ȋbh>մLn9䚆UAWȋ8Jya囐=9yQy1Y9Eqە# d`/ŧ8q57E?ȋ|~ȋ1ސzv yQ'(;rDِe0Nx<G<.+o(ʐT-/>y7ȋ/`ߐOy'=w%d X@^t=$]GhR `_8EٰӤ y1Cd廐Sb:`=m&EG^AyʙL^S+Oʋ{S^XEʋۿ)/lrf7< y=Eu<.@&/^h ɱ&/8㿔wutp/:-TAbd8Π88(W8qATyyVah[P ANjW3dxPj#LDye!_[G\@F\CSîhxfCv!$m)P^ nCw>PY!js*ģrhk ꪠNl8wUfA4&4\sPbA:Rȅ[ Z8 B[V8xTR-\lP8.ېp p{ DB;FFEQﯭ]_!VPAM+P(nap uA2֯~X6H@CܮIpt*fPE-nw(^yPlTX|*^R]kuU:^k`5~8Mʧ*쑓zb?[ՠFWTpj٪nv'Qxʉ*`PPd7 U Sdw  *_S TUSC2UN-8/aɰU>>9OکԲ26'sT>ٝO F FD'gSd<'O0T`|2|rP\;N|r?&zD=|nV凴C%xo5<|mF@Tz8'%ժVL!RB'-3q OvT?}=T4b0f &7|Š'd-=b0~tx1 {HW p8'<~:Nq#;'8C@ q=!!0zJpHC 58a$x!zpHC #8'8pd=!!8FwBOzB C q=!0zBC #8a$x!pDg#;'8tzF¹UA!O8ݺAOu[vFz禝¹mq%O8HS{*anjؿ8C87@Oh<H=I ~C>r6!:B_H)zdOq#;'8p!8PzB C q=!0zC 38a$x!t9:I q=!!0zJpHC 58'8zpHC #8'8D$'8rpBOFwBO(q=!8ЂFwBOq=a!80>=t`$81 ;AOq Fsp{1 s<:Y`$dcw0@G'(2 ;H5NzBc0`$81 wPaq zB C q=!0z C q!_q=!!8z0zB C 58a$x!zpHC #8a$x!+8a$x!rpHC wpBO(q#;'Hs-E<R> O8#;}&(;N9Z&:YN@8AOSl@8AO-<'qʙmp8N PCr`$xǩgr א0 qПqgr@X39.)ǩ!9`Br`$xǩgr@ f39;y&_39 E8qв39Rp#;N;Mqڙ/G=39 -<ZD;y&_39Fgr@~_;N;P)i!9`039Ngr@wLAO)_N39X5!9`Br`$xgr@|'䀖@8AO#qGr`HɁ#90br`|$FLɁ190>#&Gr`HɁ#90br`|$FLɁ190>#&Gr`H̘Ɂ#90cr`~$fL̏ɁHpAO' zB89`0jN^ ' >I`$=!0 u?TNpr`$d89`G AOHW H#pr#pr`$81 AO' FsNpr`$d0 `$xIg9 pY\O8' Fwt?8up8N=!T8,s0 qY(p \!_qr0 b`$xgCՀAGC݀Hs,~gY>kO8#;}!e,~g!=p;PM`0gAq8YRp)`$x)gYYV ;a$x)gY+YVRp6)'eW㔳,+`'SBYHSβoB= 䏦zǩgYwzwYVxgYIǩ'ej}'ϲ|'SCYAOe#;N= ,+?i:β9i'e!pYV ew e#;N; ,+A< PV`BYHβ&?JβJ'CYHϲ#;N?p&L4#&Gr`HɁ#90br`|$FLɁ190>#&Gr`#e zB89`f89`0\:ڠ'=!0 .mN ' Fœ0N=!0 3<:N|_ŘN8_-$CQAߪyu+3oj?\釯CN֮zޤM$W_7T3H_o`?2/ |{? ycĿ~Fi!V/Dž_!} \z~a_@ endstream endobj 326 0 obj << /Type /ObjStm /N 100 /First 880 /Length 1520 /Filter /FlateDecode >> stream xZMo71>t5䐅66Ai6uUYK-KPAq8R\yG(oY9ʱc'CG4(9=AGYY FpVY`;!xeֺ 3 ) A FYf0Y; vrֈBЄ 8`:>.(r&Xhv!,cɡ 蔔*ÖaVHe2wh!“CXdt >,&THH/yERhpD- @b'BP!qyS9]ߌ"=q3zZotUF\oǣFTt꺙zbY;G͕bl]7v<>+'t~3I+7M0su)1үeB2qeFL0-6ɹS<\^t^*}AR̢rE*AѧԂ~M0|/ _(Ы#/Vyu ^ 3ҽ/Y7rJ5T Փ S:;-S~*8ٴW}#c-b0'ڍm{"[ԣiugټ'FJ+t'Duȯ1awd# ~yK`QxM8Anż1C(N"uU|]K{ѐJъV]=]-SbGW󺫼i7{JH'\{UZt;TvjfjZha\8;6drF˛<_zsP| .ۥ9aWXo:/uxGb_Gw;0l͐!a" Yl= e S(9ͼ{uD~>%> _{hۏ/2E endstream endobj 457 0 obj << /Alternate /DeviceRGB /N 3 /Length 2596 /Filter /FlateDecode >> stream xwTSϽ7PkhRH H.*1 J"6DTpDQ2(C"QDqpId߼y͛~kg}ֺLX Xňg` lpBF|،l *?Y"1P\8=W%Oɘ4M0J"Y2Vs,[|e92<se'9`2&ctI@o|N6(.sSdl-c(2-yH_/XZ.$&\SM07#1ؙYrfYym";8980m-m(]v^DW~ emi]P`/u}q|^R,g+\Kk)/C_|Rax8t1C^7nfzDp 柇u$/ED˦L L[B@ٹЖX!@~(* {d+} G͋љς}WL$cGD2QZ4 E@@A(q`1D `'u46ptc48.`R0) @Rt CXCP%CBH@Rf[(t CQhz#0 Zl`O828.p|O×X ?:0FBx$ !i@ڐH[EE1PL ⢖V6QP>U(j MFkt,:.FW8c1L&ӎ9ƌaX: rbl1 {{{;}#tp8_\8"Ey.,X%%Gщ1-9ҀKl.oo/O$&'=JvMޞxǥ{=Vs\x ‰N柜>ucKz=s/ol|ϝ?y ^d]ps~:;/;]7|WpQoH!ɻVsnYs}ҽ~4] =>=:`;cܱ'?e~!ańD#G&}'/?^xI֓?+\wx20;5\ӯ_etWf^Qs-mw3+?~O~ endstream endobj 461 0 obj << /Length 588 /Filter /FlateDecode >> stream xuSQ0 ~߯Jk$m" @@T㡷e])mؿ'64uv|cP"ay-q(%y0Te1"HrTl/IAB+b\9ǀSC/zT]j=Cwi6Ys &l= yF8PɃn7oU[|q/AƀeTKS"cʭV#[[qnT`y B\G'e{_Svka BXq0VjMUF^w#$}7^abҕcDͮƪta=1ྫ5$(k!㩓y3_r\7{O$z_̨Q"Da #hHJ\x֜cBycCzgoS"KΉyDRF}kUܠE(~ebs'Y/рvS>`l앴⩸ OCW'V5<^"L%[ٗڸV-kh mIQJrF@v.{h;y8խԥ* ,4, "=$KVe`--,6 endstream endobj 458 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (/tmp/RtmpnZmxNj/Rbuild6f0944457700/timeSeries/vignettes/timeSeriesPlot-chicTwoColMultiplePlot.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 464 0 R /BBox [0 0 432 432] /Resources << /ProcSet [ /PDF /Text ] /Font << /F2 465 0 R>> /ExtGState << >>/ColorSpace << /sRGB 466 0 R >>>> /Length 19790 /Filter /FlateDecode >> stream x}ˮ%Irܾ,xG,$p@-\D@ynUOk1*,O+?__qhor@XoBc:ڸן|u:^?C+oJm`}շ|JYoG}}}*y?Rlou&R\ Mo~N&oR,TkηcS̓4y*paBAn[|ħp6&0[9/SjpQ#%<2䙗\[myɵc}cp&ַܰaKo+!\;a}m_,e"׎47\6wi[o9X7eM/tG-ԾߑT /~ \;e3a,PTr~K]sv<1&: 5h3 MNR/LB"DI~5l0OyR7lU~~Ծ!_{̈́dyzUw0pGU/%`l!ANzA8p e 684UB|ٿR  My_~fydw&'^9^M ֆ8Ɔ}H%?HKM:i76/kNT(+R 7FFu7_Rc'g7 8c bQ^b|gC9s2pr/8im,NZc1pR"pRWX 8[_ }4nM 8[IZ ca`#95B n8Բ%-b9v]B(pIIɻQ-$|thUQ\:KU%Ѐ_oϔڝZ`I+_/!wJu1z RZ d CO'qw]q}DRޯeN}DXwLj X+F<0Ѯ "jc(Fb|B"Frc*xU1rd ed A#+5ICk0B %FcŚ_M`Ma'!gG1}%PR;Yf{Bܦr(ޑGB-m&ťϓ` Xwp+ U`76f .,|ыbd2?K*g1""mY6.=X3%`h! L:Oj]j6C獤…jI>+cCPbۮF3PbƬf 6p |~͙xۯ6/hRaYXzI,]U@` 0,gLYv",# .4SOH+FWv4LK7i)4KiuW ^OQIxj;MS4/v}m>*%P,.LF^[H!#v4Xۙ/oЄ2f{RolVzjI1RTo;Qo풸CbC~R<_,oBh}~V񙟧zvPxۘVo6xoQ?* KÈ|~%+FoKVx}~x4,4I1mKNmDv} ݩx%=mPx0m8~4~l刷]^}גmXoae5xۿ7M-#̉%޴ ,VU:׮f5ުMgYf]x33<:ִۣ~k9<nj7IOgY2aH# cO5])5k1Qjd{mof4oFYwxaf0ެ xx5TtX:Y``t孽?f=`v:`hg`YXc(p cWO=ǠpT|_*`g2T81F>xl?'goSk{5o3g1x;ۇx;ۇx;ej Ճ#(i?ogg1ߛo#x7cKvx14oX%LO'FD7 L4K~y/{ܐz ]Aş e؍jw}8,{FP l&N w^ӿ~_1Oݢ?ϟ_?, bi\*,M#^x1X_Dդ3gaw5Svcu.At3NAcI`p= :8< :6Xf ő"z(gO!B(u_{ ;E;¾EѾPH(L=EьST]Mrn q#8KǓCtnz<"I8t- L:Os]m>sRu:tn՛-n21[VKa8<: Ks(s+:(^:9d$.f/SOs tnVd:i9(Iג,ҪFr#9tnZe˜[\[.W MRbC6ǐA/ *̹'tn9ժ=U 5_/snTR "mtn3L04E& unau ')Ȅ:I[(KF/b9S-Ԝ\@bOL2`SShN.B(H:)A4s{Lԟ59KmG.X9Ts[9j8:r@ͧ? (?[|":#SY62BVgsr&`'92&t)I=I@!JɦJY9s 3BTOunTT"չz?U' _unōÑ jɑQundϫۙs0ȊKg9r܊Sp;9oιǑ7:te _Ki|^u._.y(S"3+mr1'Qe#eY5kqR:Ҧ'o'VٚYu˜Ь5t$1řYU|uUϬu [_0,5i@V;EqRΑl:\3[mCӹEy7`Ǒf:_1'6GtC,>] sn+ [αJZέ9yWSlӢԹ9IչE:T]-0Oж\0vLBv5Pgݜ]ƬtnsF3%4s 4gw[?gйs3\3JיNtns1skιf}s+oN-2!;#*6Oӹs>sשoxk$f1ފ$СSHչ~Qx6Sms#l5ňs&[`ӹgιs+M1⭚^Bl.s^ox|ds \ W}ޤx󊓔J}b4L=ѹ߇fhVX.Nōp-~[>T3I{dňw:x9,jT\~ӹ߷(ʷr[|-/[o#Doo/dxvoZd+GjN8IyWs_tn3&>fH}s4963Ih\sr<Pxۯ-;ݜ٢E3YfN[gsfoL:yK1me.9:bƬtn3Gp>skeҹE:>)e]|[_'tnsn84sf}sr'[|:_pPGbN.V}sTsMsrx$j Wn.m7+ѹM-x+O7NSx}й3-2'Moo˜b785ޖ9oK!:rsr%ފtnQs{a:#?:g.Wsnutnz8-|>SbY$ XenE;ӿAUޕhÙVN5%h#>?^h1 I7P_wkN]JAwwse9e95&D W;u8M_dɗ @HRy:0lװeDxkv6^v어_^2V"4]j^腝^qˌ^-2zRΐ'_f9tM.#:4z Gu] {P{F/L6"Y-^Iškr3f{Ә:T q]1.W27ApʵDd! x4zzi _f.)(X"#iF/KViD:AJcOWt0ы4]KtŪ+/3zb{Af_6ڗY1iōүDH4zšd4uiO@"f"'ɶ$`m3^>ыS˖JJu5zzhqFQwKt$@^{fK"l[PJŞ% &%ы&ƀfl_#4if1^SfP-=3z>=q5zؕfJl+F.NwG´%ZԜ@-u'KlA91$-lkR)BünP12dN=i4v,55Q[w(uug qō[}:ȌT|94tdgQOfOE7*knwO^`ZsN'O&ûDԹW^X7*õB-ekS.:WJ-[Dv_Ѳ$4oUn!MC~ѹ6J@vyJQqӖд$S=۩Բ][*s>3Rh@uk-QrjVrj+d3‹a+j󕑩M9s8hTBVueI#24px>ƚyOQ@UDԭu/C[P{6f[E߳b~o6RVL0?4x.JdHV"w2;w*:b*fMWoFUO8hFjV=h[9~k:wf*P?;M{s+eq}r~+"3l%,X|o*[PLl*XK+9oW9=[ylzzT?|[9W2ʺ0mc&So5vo]+goMobW?NfWu=\LNrnU-|~k|Oqnm̻]&}>-2fLg +fOŊr/Sb"Bqm-Cg1Q(vIP`Ex$XQ(vB5BPP T.T+պ BBPP+"W}eR]eR]eR3$0>**2)rW&EU&Ex$_<=uQУZ =uQУZ =uQУZ =uQУZ BBPP T.T+պ BBz]2"{ =!`$ .1 kš} dO FBj z'#=T Yan!;_H(=Jz~{NE ;a@X[H5=ΗH3F qE!LqHwy2G D3=N z̨tΠ'3 eBwS;Π'3 º"H-jF q{A Fh0ng0uOoqi=nX,և,(!5b}bXX,և,(!5F NL[U8HmBGt֓0|0|0|RhF0oȡR R R R 27"FozB mHmHmBO 0|zhFoFozbSvt^'RwN4s'(NE((('Aa$+ނ/B ԝS=ᖺsEԝ=anQB0|0|0|dfE +RwSwSw M/a$]a$Qw0¨H =A^HhG N =!bb8,,(!#x∲88,,(!#x∲88,,(!#x∲88,,(!#x∲88,,(!#x∲88,,r'RwN[aSw.ۨ;W \H)jH NH88,·,(!3|⌲88,·,(!3|⌲88,·,(!3|⌲88,·,(!qLzLIqLzLIqLzLIqLzLIqLzLIqLzLIqLzLIqLzLIqLzL!#n,,(!+kJ̡hg ~0i30#GCsC#!ߏ>aq*.|bUNPZr-Y P??|駿{rw?E1s7h-y);Oo^G櫫"Ez|y8=Cu~kO~?|34Y0a|ƎG;7vw6vd5clm1ݗE_^i}{-/_H <^mcmc111GFawǫ}L}ݥƌ220m"620m$#V20f젇]vrv2rq.2L-:L-BL[7啘RLc|y-:Zhν~tиҾ7|k,zln^8N}{qp^$ ∑%*9'y[-[>p+O_ð1o)aI00lrNes‹aز`(a9qC%`zu`ٹ~씒;]XCSyp60M#<yGC6ʑs-b-bu˒<9 ;Bߏsʦ%8 ;unᐧ Q7>b>||*8<=qI~%lyh)z60.sK>3{ [EQ^<<)aEn<]?a8 b 3S.Kށq6D0ðaNŋ7o-ͱ2a=r,IWaIi%>[DdӒ}$Bzy?9 DpQY6J87x4K1Ͷȋv}[xkbx~/\r 4*x.[x_G,x+w+0m׷6#ފbe=GNOe}4ozDěF+ )ۧBxKz(0Jbk \O7AÝe6eX|o3NzTo3.xSOo~dy^}CXF 0#D?Ooz䙼CKk`at Gn ,z# Vޕ$&as(hVb1$%޴ Ǝ+pU岕Tq ? NS1 0A3șHb%_G $xS1򑩻 pq(~$޲ #C)06,E0TØ(i_Md0N zB2H1iHQ{aM=Mjzd!0m9hoC XPo%tXě1xC?a-B xifΎbߣȃ~dÕ|ȏHRd I{}v%;CTfZz0mC%IR2b7==Tշb;\M_yXL};4ޫ[[O}cV[}둘7*&Tܘ/x2`|V[-oDJ~p'l$N*[J-$F(=ҭCGW;& 5|r_֘OK|RF>Yx>d݁Oc>#x3.gOxm{6ixY.V8_xu/&]1#xڟ*V[խKceV,?lҰS_pvRl1>l&?d'N+0bo3ްe[Sx++o댷:5茷fzoMwr.t³Pmt[#ovD0 f(Fmg쌷o|_fAga ֬7 U1e0z~\7;7 9\^{U~-z}H#x`D~` =6V^ 3޺nx#;GxC5oִ x뺉10ƀoo0{3޺֚G&h/ [2oh`2ޚ\&Y5ox# K`0^2~MyO9+ `M?47>X?KcjZ'Fυ;m%ޒxKLdNdU=rQH2o}5o-*^|^o& eb[3Y7 6ŕz1ޚn^\moc֬?oiiѭ6n9Ϣ(F~HղdRW%'9 _ 6h/(mRxzEYaoʳ#ކ?xĭf~-۾g1ަ x:>xh=ozm? fK>xͦ` ݲֵx:Uƛ! x%FY!FnuŃ畎\Wk>T9F~d #F-5ermw|YͨIvW>돱겸x^ݚL1c莢'ņe# ?ldSt/@!B(_4uQ/)>\Nx 30(tG¼S(EQT-NGtw!(l}}`%6+-QҒ+-)WKk:[ixiڅMw8w&L_ɝɍ0YϽܘ4hrcVo1S;lDSWFKir ίNvܘ%&vݧɝ5v?1ݒ&w±+|>1pd>#ii>jrcB(Mf6i頻܉iri}/(h 5SLm-Bn7_zܸ?MQrd|&wbVACWXM^13Lgrdg vjwojzSs,hrD M"57_MVny)L xy0ݲjrۤ 3꧙-Ƥ&+|ÛyM-.3 Jɍh&8L7lfcϫX{_7:jrdOɝR{_ #޲pjrbcٹ5frgm/F<)xpxFW ^}s&7 e3qNlf:Ks&軙8&7?_ XMh Mn<Hhr_&7Ԇf&?Mn,e$MnORyo|LkebW걚Q&ߗ&>|&/m^5,6.vX-CR }MMn'xGژTbɍnTr9Cjr#)H|LB;)4)M̴ɍ)]ރKx>orKr[Vvɍ&M|NkO~ΔOfr'3Lnwзd&7i8[x)LlGa(c5%$0S`ɝ&wf3Lnd7bhrgLjU$iX"&70+|Aܹ$aS|4ghrg&70_njf}ɝmܹ걽jr?hrO3o&ҍ}ɝI 4q=&wIx_43y|^x5QoKܹI Mn`Mnپәܨ|R߆bdԙyI,E1d3o&k刷2dgU4sI4sIjr4gqOfrhp&7~?Gܙw}2;W3ir )xjRx(xK;e3jr~LmGLE7%PirgsMWir,ugr3^hr7cxk6&ws&IxkLs[ɝ{&wUx3C1ۤՙRNӖfęPx릷41H; Ob[43t4tt3lR Mn\&70kܹ٤Eܨ/jsڤbܙ}2_MM ~1|h}~F}?MlR}ISKMU;9jr#K~&w:&7A~?5sSUq҄f5=4\Mn𥾩ɍxQhxܨx&7 \4;OPɝƛy 0{z&Z}y3Lnler1GvE8PpIЗUN(\sQt]T. q\~%\6ʿHƎэ|Fx_4go3шhhN{3sڛ%ތ(fI7śތ(fE 7/J0}Q9hG7/J0}Q9ioF_`N{3Q9ioFhN{3Q9nw6_nϚ㯴xFJgxFq- j>rm,F;ݬ2vԪ:NuըS#m;ܐ:f©I=̣G=K5ՕPb =7]iAC]/IVly YC'x7=l4[n.ʨv#;shVrZߡՓ,RiL03I]s 4HCuG*c6?Sq:De7tb#i ͭNzfdy-n3?l2bJV)$Nam-` ֳ'?S TG*?ϧD7$JY M%e49Nq4UM׺f$roIMۦdSjR7 W5I$~KUum:}8"f)sعu2-; 8]7\$ͮya4_ZrP洨iytK$_-]"EJuHil_,q_Z:g=1\d[7K EغfLqfAbm28|Y7,uyK1-[f@ Xγu͈=e/_ׁ3Y8: X2)z9eh:guXR{%YXMi.m_Zj13r3Q S8 g-ň75yo%_ol]3m+xq0>ox+Yu8鬘x+x+Z׌x+:F0!+Vl(-`,|ZbIs-`wdr-WK*پlj UY1zSK*<-`75l3Z_Z8)ٺfۖi1 7 Fuˈk]5ٔ mםﭖ۰x;ơjvyjQ3ުMi o~4lJ-`|uѓDoV?3l,+[x3\-`9 +N i'D-`È9ff>?N XYˆ7tZ\Ԫ 85g"?j,j:V= X5Ww pOCzNTBO[*0%)KVqέgB]y4C_+XSNn~ٺ_:soz^&ƍETƶ;N ^ƫsF;5`$#GBCAO~/m0 SPQ#@hN%՟d0J r{͟d0 ?nR {SZ -?5`$u (wZnaS z&!;@hN)⁧7 so0ܩI#@=%vT'a-^r;LPFOx$u$=;a@[˰lB50 r B{b@09#a@[LjH(3ʼz ^uºo0 ^CWeq=dqEY\Y{0Au~=an!0 J {EF q'v #@(d`$e Beb=c"F zB8`$ .3 kŠѝ±=aL`$y Bw<aW#eb=! F;z`$=#@NX9h0j z{h0 :Qanz#b~b,,(!9b~"&.VNa$xYYQCse1?d1GYYQCse8>8>8>8>8>8>8>8>#ȢAOh0J 6!l~ M pGaGl>=cm[|8(/H$!>~εXZ[V9ϯk:O?~L\:v݋<˿?1C'{o8˶-˱>q 93S.'t){_as[iKbƻMf`fzfdD)ly5-6-2rM>3dž3GFaϫLݥ3l30m=32k?3tynhA8]Se;]_^]5_Yj]=W^kW endstream endobj 468 0 obj << /Alternate /DeviceRGB /N 3 /Length 2596 /Filter /FlateDecode >> stream xwTSϽ7PkhRH H.*1 J"6DTpDQ2(C"QDqpId߼y͛~kg}ֺLX Xňg` lpBF|،l *?Y"1P\8=W%Oɘ4M0J"Y2Vs,[|e92<se'9`2&ctI@o|N6(.sSdl-c(2-yH_/XZ.$&\SM07#1ؙYrfYym";8980m-m(]v^DW~ emi]P`/u}q|^R,g+\Kk)/C_|Rax8t1C^7nfzDp 柇u$/ED˦L L[B@ٹЖX!@~(* {d+} G͋љς}WL$cGD2QZ4 E@@A(q`1D `'u46ptc48.`R0) @Rt CXCP%CBH@Rf[(t CQhz#0 Zl`O828.p|O×X ?:0FBx$ !i@ڐH[EE1PL ⢖V6QP>U(j MFkt,:.FW8c1L&ӎ9ƌaX: rbl1 {{{;}#tp8_\8"Ey.,X%%Gщ1-9ҀKl.oo/O$&'=JvMޞxǥ{=Vs\x ‰N柜>ucKz=s/ol|ϝ?y ^d]ps~:;/;]7|WpQoH!ɻVsnYs}ҽ~4] =>=:`;cܱ'?e~!ańD#G&}'/?^xI֓?+\wx20;5\ӯ_etWf^Qs-mw3+?~O~ endstream endobj 472 0 obj << /Length 608 /Filter /FlateDecode >> stream xڭTn0+( i ]KQ]FmJL}Iiz+yPCv Λz\ QVYPE$ $O)PA1O8en33Nxao@Xz=QN]Dq>1ARig9ޒ~X5Nd#0E>y@ 'c!%x=m'($rJq84{:m\vgIӠV4+[E7^ŷ95JS-/^?zA@= ceZ5ůEZϒwQxz_Kf/z/){ei8|ewڭH=&`"4?p;S>Gb0Fc|k;Ϣ:5׉hn-2KHD*<#+_:Hj endstream endobj 469 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (/tmp/RtmpnZmxNj/Rbuild6f0944457700/timeSeries/vignettes/timeSeriesPlot-tailoredAxisPlot.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 475 0 R /BBox [0 0 432 432] /Resources << /ProcSet [ /PDF /Text ] /Font << /F2 476 0 R>> /ExtGState << >>/ColorSpace << /sRGB 477 0 R >>>> /Length 11676 /Filter /FlateDecode >> stream xM/qS̒\QtW/c 1lB‘eĒ$>}TT](/H{?/W~{ۧzG&㾯~.O~}W|*+?~WS~ 4W[Yf"w r|Ȅ?KT>QT5TSr~T)Tykx™|TQ(U~R.G+)*73? <3WQ,QVgp4PIT^wUg>>]Zo^>H}izytQ uÃ;>?𼶶ݏ|_aIdŇULۘ/TuOŃQ=L/V}=ܦ'u<Etl6BJ=}tz|5-lOcq}=nlGTf7mskoo4hT\ghڞ'S8vNuϫZLzԕB7֓kݓkOmsxop=fG&gzO]X>L/߳r?}vo[Oj>_\g7Noo{57쁾ھڞo}o{>-Oy~Lk9=4;Zuo{~xp{ڳ[gy֞/n }=wy4iB-ooΏ-Sql{~/ڞO[ gkozsPKSpgϧwғ֕ig]=_h=xLx[Y޼}z;~C=>/[~mG_S8 CԶ}:ׯ5^\AmϷ=.zrjY?CcVzϧX@Ojڞ_%{tL~~={؞'m֛mL[Y^m{>miZm㭭۞_ ޣj׳i{-_bzPs|k~j={>ֶ~`Km^ /wi/\ְRzR,ptsc6j?\.6xl|ʩ'g/.cRD._{?^tA5zс9 62Lw֍J86<,_h8e\ϯB{><ux,9.Oz\SjyUomc%_wVôt}|j1~S^6uxeぞgR<9=x [OomMߏ-s}k[W}gOz x6z^ ,}mo޿xۧOzzH=6y7hoz}{Znmη}~[g}S_{> [vqmmϯ+ߘ\ y/}>{?kz[~{~]3=LJaϷ]B{֞_ޞp}auykKUOOY׳}g ̲$=~=Z؞?{jpV('P\(#_e/} ˋy4C,wԩ}RbT'Bbex!u'Ǚ T׆qCHV'&bLŤNl$Gڈq&c_߱cKޮv8bR[Y?$Ա_KHЉ77}bx`=ZQna('f"& Zy7l_/^c5CLCɰb't7I_?4 +ea"f%g`h-ea+1+uQΰq}Z?#%ߧV?q' efJ^،'Qn^y,n# QXWߛcHbqq|?GF0a%+ `O ˮr}Z>Qoz{~0a3aPbw4Au2 5?3C[@?Vv :_5+э&WMlKZI쯴Pa:?׉ _%`pbh?41O1Os'w.=[%wvtO7^ْ-9˓;_')ɓm{œm{xm='r-D/ғom9=so$ߋQaO|%[ISx$+I=>h >J(woҜ{2I_F<ޯMg2|=߾1>|IC=%O!ܒO%{'{r'{xr%{Od|x2˒}=~Y3 _zP3jbFKQx._ %K'/68/k—(Qx,II1 _SwRҭ}/ v _<(|)3Rxt;RpRbɤNK(QW—f(|USx@5,rRx×B/͢F/|mx(u o)/Im[T)<[ɋ뾾{%zSdOw ('{2'ߋQmO=K?Z<:('{2'ǐ'ޯϓ-$ߋ%K{'z򽭗N{Oі|Tԓ[SOOO~eޓ=֓=֓=*گ'/Ğ|zxx}z{1J˩%[Iw˓绯_SEmԜLSdOeޓsOrJoˣ|Syx'{'{'{oFEN':߄'PxlBrmH¿M'ϱy|oY)!QO&3NT^Ǻ''ߋ} GJ7qr{?_O,|ۓz{~<&7O'%{r8~o=(<`9>)oؿom;ө{~QxWՍR{&(INHC2~̢!ߐ|OI-q|p ,IK3k85 _c1p I}lˎ˺q I[HLy)|FR¿ Q[e{]oI^\y/ÞQs~>~v _,*IGaz)<0IYG8/1SQ>v _M)|SxOYu _eY0 Y N]?=(|Qڜj#˃Oy?Fw%72YloY$l_FᑡJN _+Nkgœэp 볽GW;O _VŢNrO  orR}RbuXֵSS(|lO Y?NC_jRxl HISpgEHz)|Qxr O 5ۣQj,)gA9G.'5)Ie8|~b_~kÏ8׿ڮz}WW w7շoVOLJ"rc~𾁟gS9g_x'`]7?rtd 29U\Ufrt25]ou;wVoT~!__|z??￾b^_?-C9g;ik'?~x}4-^߸=}}lWu ao~_r?{?{[(?o, k*X4j:Wb-|o_1afÒ S8޳W0+tŌeSUB^թ.' {8=Z<K=pO8|To.?Ů0i&0/7]Fӹ眔h9'%:IsX~sRݜ6'%I^sR՜4'%3)fNJt=&s81'5ZIsXG_IrR.'%-'5Zm^c9WNj]FS9 r n('5a&;Wj@a`&( gKKVrҒ\Sel%9iDaXbKKr[F9i?2IKqE8i;ki9NZ2Bl'r-5ơ4IMqL,j}/Ra'-ŽRCZ22zIKVqҒSd'-IK6qx%N<.8w~Qji!Nj2aZjrḋ:ik8)CZMKIpR-*WWv'd -8 h1i)dž¤$7Sx\ n7W2+J6p( .pӿvdc0, ͕ $Wjߦ$.>O) D<G۷9ۜ:2ϙ,߶os&÷9ۜ X7ϑ0M9ۜm6gy)-Jed[oS۔dv^ `Q$c)mJul幒\mdۂD- v ZDٟLfns&/9dpr3͙|L6ns&7.NyvN(rlm}"emJ2odV(_pygiOIm>nXxJl;mQWjxJrkJkJnms%6&'\,5y2ڢþ/z-6q KMlR+/-.,5yaE,ٰlR!{* KMvl/,,-yh0֢W }i`iɅ<ؤ% 6iɁW-0Zp_4g‚D'+d "RdV>rQ_iq b2 ֤'5l ѕd&=9ᮃњ&=٬,+=;YEVw'5^MJ㻐[휙]gS]`U;Ȯ䪆Lʂdtԕ ռYHכEt}c]ߴZ<7EO Vj||Ԥ%5i)_\Ya\ߖZ< q}f1\,nӼXׇ>j[Gق-v BӴȭo-p+-gd;> b|iQf9إ9-| oZ(,Z{YXԞkfG$´Y1J;z ҾZ?1Ғ9 Ϟv,;tfQ|Ѥ%[qLγbXt+FeXPndOfH4~Fd,X@ce8:Fc%'#=XN=Ma!OmufAq}`_X4~&g'X$:Ig/dD3Lf4==dD3LV4<~g" L$VVgE3|5}Ly%mLVg(]':'':;;;z?lhlz5swmCǜyX=,^y5Ap3rU7f =#4XgO15܆=3B1}G3hcT)~Fy1|:8}t1[+<ޏ@{ZJr0ӟfsARtt0C`VϷ.I p`V7%hԏf(fL78i @*:!E3`\``㣃YuB`-58`̠x ̴/3`̠Y1z.qjt``VkIf ::iyp0L/8tt0%3`̒F{%9AG3]·SA+Z5/:`(:<:``㣃ʣY Ŷ`l^t0C`VVJI6tt0fL?:8::af:%3΀!m 3iR,h_ph_Vχ?<4 d;顓Tt/i(ٓ5wٺu\J2.{ ږ's}5ƶO.=6fH~ek&2},\{+?m<]G`WCFy+y?ؕv}6̽$yRW~,zUz7]=kP,uʪg=֑,xU5oixtf ^eճ zCGYu _IAG2\O*HckUVw.W2CG^[xu/\cɢWւѫ :~%ʰ6^eV ^ezUߋ^e(^eUpU UʠWѫ7Qq,nWt*6zAG2,hWt*CUVݫ8G2]2Up*m%2Uf ɡWG2=*$8_*;z&w2a$UK*$l_ۑ,d%0d&_H-Ip$o0d & %~mLfr;=l[$yy5-39E/I~`2*E&#Yy4_M4'ɝl'0Lz,'I--aTbi_˿(2 F&/$Wg{Δ>I_ڌeKK_R%/Ռd"1* f_''pȨa,iJ'w_KO&_0z-=Y|OIt}:I'{/Kz2eo,e'g/iK_`vO^h%=yzCLپ;zb)w򕌧ld剨ݓIR햌N&ldVfvK&^'lG /iKj27e;wqRygbzvM]Rs'yʶߓmN>Iَ]ҒgVݒcd؅Ҙݒ]yvKf]>)-Yu<)ѨKZ±1e%.iɤ\Iَ]ʣC<ɠ {%w;sɓ̹N\Kq/d%=rLɓKd}Mَ\'RG㒑ܸd$3.ɋKfS%q$.KJr򥚧l%,VI\+[F-"1e{%W2e{%U*w뜙@y亵J2ݒw*W/,/"'*MP='I/̊JW??~eWo~_t%/2\TϞgK-`6\:Ֆn `d2VL oxMBğlx4q[BnKhےu-7W%kZ:R>v endstream endobj 479 0 obj << /Alternate /DeviceRGB /N 3 /Length 2596 /Filter /FlateDecode >> stream xwTSϽ7PkhRH H.*1 J"6DTpDQ2(C"QDqpId߼y͛~kg}ֺLX Xňg` lpBF|،l *?Y"1P\8=W%Oɘ4M0J"Y2Vs,[|e92<se'9`2&ctI@o|N6(.sSdl-c(2-yH_/XZ.$&\SM07#1ؙYrfYym";8980m-m(]v^DW~ emi]P`/u}q|^R,g+\Kk)/C_|Rax8t1C^7nfzDp 柇u$/ED˦L L[B@ٹЖX!@~(* {d+} G͋љς}WL$cGD2QZ4 E@@A(q`1D `'u46ptc48.`R0) @Rt CXCP%CBH@Rf[(t CQhz#0 Zl`O828.p|O×X ?:0FBx$ !i@ڐH[EE1PL ⢖V6QP>U(j MFkt,:.FW8c1L&ӎ9ƌaX: rbl1 {{{;}#tp8_\8"Ey.,X%%Gщ1-9ҀKl.oo/O$&'=JvMޞxǥ{=Vs\x ‰N柜>ucKz=s/ol|ϝ?y ^d]ps~:;/;]7|WpQoH!ɻVsnYs}ҽ~4] =>=:`;cܱ'?e~!ańD#G&}'/?^xI֓?+\wx20;5\ӯ_etWf^Qs-mw3+?~O~ endstream endobj 482 0 obj << /Length 19 /Filter /FlateDecode >> stream x3PHW0Pp2Ac( endstream endobj 486 0 obj << /Length 742 /Filter /FlateDecode >> stream xڅUKo0 Whj=,ˇ:00 ; pvߏi 9ȤThѷ4_˛G%#TZD6B1(O5㢈:dy}?vvC~J~`h8˕"0'%ElOpMOpҺ *ۓ9و(.}*gY iY\k6yhҁ-d:k H/!YK>0:;7dZa[;j^ytn7DkJMBNB] g[.Cknq'ݫq-5Dாfm6,f}QLH}z%/G7W L.3c誄>a )ԵÂmG|!"qE> stream xڥT[k0~ϯyV->ȠѼm{Pm%l!~G>rF :>\=#i^)ᜥa(fKX {"%|˹m9df~RYUH4M.fp~n\6ei$"#0q܀T⓫+m>|UF1Uˡa6txvɩpZ' U/sQf mm}Y5HLwc +g}$XS Z|}0A̼H̚:4\Gv?BGa:ٛqa̐H*̄NSz!26[#w[p>tjWu6ղ~J!q> /ExtGState << >>/ColorSpace << /sRGB 497 0 R >>>> /Length 25575 /Filter /FlateDecode >> stream xO.;ⷄŜ) Wnb5H0 [ΈpΞf`sN޴T\Q~Vr5_O_?oϿoÿ?~-?rϟYOJW/?OT0_q6vR~~_ưگQ`N۸Ӝs9_9w6nO di#'D~`i˯`ex a&0an4#P`\`_丱ôϷ ߃`Zڡ~(t3<<9scl8Gy1is50fk魿 UjB0QhS[L64`oc9-Be[,TZxM7a~-0g,t=v41,{ETyY5ގq`ڸW*0 10;<8 ?"\ݽTyḾqH&>`ξi sx_Ӽ)h94Y5qB W9 FBwEo7Y#9flZ4{}`Z䈻Fx-gv&?Xxޒ[|/i`'ݴgZ8h~˕ {qN.󮵎s=w_/nm޳m\Ӷ<sF{Xܴ_s=Li|ȴ?xsx{}4e=meyMOw>EN{\mNΗJ+^bls1<=nwLfEʴ/?f^%~o?Ĵͯm90L:ӞWIMӿkӿ=H!&M{^l~ -e`[?c=mq hi?Ȟ`ooo=L{S>;jZx\zxLUkuzڙȶXwҧm~.{grg|=[O<߬eom kg?" ?dW a}-C'v>Ukg,q|2~c["iO|~?-֧m|C|XFcڿeGu-|' bhO4c'_{gw- _kHmWz?+[ _͆ݎW=W='A{\ \ᯜ=-cމ5㷈ig_{oy g?Ӷ+P|>5Ϳ~C ?{L?{"-^1E5Үmѿc1JOΏw"Z{2k>Yoj}ZviWv$"]o^{m?m':?dcvm&&ߏ|pxIٌ?Yf׼?~4y 6&3kz{3k?NؘЌx'?K1^{t26Pe{L]ApZ>6QEmܫWHi??[4Gbޚaa&G?Co7'l 9[7O?">O'?md.{Qd>L Si^4)ZP{$ՀtkAW SWNvǰ'b?u?wbo"[<\- 5%eᡐ?~pD|K/ٟ5OϺ boeiji==_p qk#YvAKf3{{FL?g7n,?r&6{3ަ=ȴ'bٿ"~ߖGӦoH~LnO-~}4mωvۓ6FwB[mh5=N[g|{ѓE_6Ѷi[q=۽MU~>[טhuacg6yRkG|?2 mGG0=?G;o f|\# ~rx́cgUbf阷4Ƕxgq=6.}-:<U'[ǧ~_^{{d-g[߰7 ?Ҧc״-~g7z`~;yX_1mOznJ~^ 62ޜmEihVୗx4Ϙ_ӶYǣF~0gЦ?Fڃ~Oo49.7g ,*l~I7$cm2G {?G1{M?o(*iɏxq^ҏCc>?Kf|{|6qtg[wz xQ~Gn+&ďNqc>+ziK=VϸOot2z'6 ~#:Y@4_:m/5?vIxl2m~?f|OWF{l{Oz({'%GJY1hˏxElg =/R'aOXM^/>[IMq?yI]e3Cf|g9D??g_A+??m>*~O-~5m_x$?d?avIsYYb#WS䏲Gڌ㟛GbzCqyD+o& ?cy<3kKv]Ƕ޶\zycQ98%+>gIKk}>"|=cmiW'W~8_O|=5f3G~-Cis|ܟP|_}35e{|=?|=1I+N:J;ha~Y~z~̿5>s/j~\ߵ?j ^كّvm{uC~̿zmgRu(GzGY6mm~܏>f\-aߞϦ>mG>mYli_dzz߮zo+4|pf~'O~u'_3|mb}|=?7=?=Pnx l`OB~yNkv<&QH|v[E1z~zU/2|ov:o?kJPacD|o;]o7zq+meK#)>#zY~䳑W|aЦT2OX&>igϣ?4G~_A|^ofm1mx>3Gxe<6xŃ<yɃI O?H <`YxQB1s'N<5xz+Kyy3#޾l$OoegnOotY<[n$C#xz+om7{F@R$ t!Ye3?xx|( x5V).pHhmӎ?x^P&7ivoC4~O?+g3~/?xx&yx{'O?IvF"q6c>Ǔ{ Oo[QŻO6)-{^ l<1 xz+m۶>mT= x9N8iC=`f7n3m nئQLp>4.~#Oe6 ~ݏz64Dމq=駍 xz^6qm#xU۴W'GM x9-1?62\OM<>ޝA^YUO_d3>4ϪzzUOk|!C<~WZUOuŪ/g=}Q=w~ڬUO?Տ~NUzeGR=ύz񰾙"P<ԪGXC تoXUO|]q#ns~6;>gSxxogP~_򏍧Χ# _/O?^zP=uoi ?=_PO?tĻz]Qmc߃zp駟9PO?* c==~_#zQxb=⩃g8L'ztЦ/Eh*^~+zfOӫTz.V==SV==JW=;~CQ=xR}n\;Osޯ流ztwR=}z߫z|zzAUO>ޞO?5zz䫯V=}y|W=}zzg=}{ 뽭xtc==tW_k}zzދ>&O^W'O=yGϟEߙS<:ߔ I)_Glp/$X&g ?Ai9ϫdfFR`خ8v7Y9{\vEiw>X.,c  KX%z,=xaK$%]Xǒ.,cI KX%{,’=ٛ7UfgX&G)W⣴+R/,c KXꅥz,+ʍf&K%\X.,c  KX%z,=xaK$%]Xǒ.,cI KX%{,’=+vwwϻʻ~nny_y˗{&}I4e\Q]X.,ci汴 KX{,=~aKte\X2.,c᱌ pXX >XdM*.,c ౄ KX…%x,=xaKD%^Xǒ.,cI䱤 KX҅%y,’=|aKd%_XR.,c)ⱔ KXʅx,W>+wǕwϻʻ&W>+w@&fMf &&MҮ(Kte\X2.,c᱌ ˸IM}6ٱ,lҮ(GW%\X.,c ౄ KX%z,=xaKD%]Xǒ.,cI䱤 KX%{,’=|aKd\XR.,c)ⱔ KXꅥz,R=s41l2d &&MҮ(K4_X/,cdԫ}okBl$(|qE[_gIX£.,c ౄ KX…%x,=xaKD%^Xǒ.,cI䱤 KX҅%y,’=|aKϔ4(K\XR.,c) KXꅥz,R=zaK4]X.,ci KX{,=+wÕwϻʻpnny7^y7φMrqMs6ik2(b[gKX…%x,XdM2w\Qpa K%\X.,cny7_y7}W>+fwwϻzѤvdɸHJ||kBl$( KXʅx,R+w˕wϻʻrn^IeMeQL%xkBlrbKT^X.,ci汴 KXڅy,=~aKt_X2.,c᱌ Xƅe8,9>XdMR+{ornny^y[[}ޭWޭ>+Vwwϻʻznny^y[[}ޭWޭ>+Vwwϻʻznֻկwޭ~[nzw_k[z^׻Zޛ\׻ʻznny^y[[}ޭWޭ>+Vwwϻʻznny]yۮ|mWm>_Qpa K%\X.,c KX%z,=taIK$%]Xǒ.,c KX%{,’=ra)˵m~ۮnvw_kz]׻Z6mzWZ6mWm>+6wەwϻʻvnny*{qPkBl$(R}qEPDb5}69>+ʍ{%\X.,c ౄ KX%z,=xaKD%]Xǒ.,cI䱤 KX%{,’=|aKd\XR.,c)ⱔ KXꅥz,R=zaKT]X.,ci汴 KX{,=~a˕wϻʻ~nny_y;;|W>{Z\MUf~MhMs6>J8,S_2i&FTPD-L?@3ׂϴ[#S-肖~WLmdzW3jzϴNkϔjtIܼ6zg5gz57h!iViJՔ`X||רZ c6 N5~SV !@Vj*iN,L3!/ȘE(>Ӥm>SHm 1YjZi_k%kyZtEI-4b6SUhO3|೯e4.,h1~6w[T2[4'[gLX1M vI3m0)wcڕidvި8|4~'v1ա5mBoW\O.gOםt$mnT0{^֯gj U7m{-;=Rs7,F)jwS,4u3rAY8m5cU"xvSSa&SPa:C÷N*1lkuZoe@agz؇@}3AQ̾VYgײ,5lg6gY ʰ_kZrVm]ݕߩ>Y7ieؗ\&zZOঙW޶ l#&MD!`Ni֌ 4۳.ioN/s/ȽDd6]s_ulr]sZ+yU"`jmFv57ut7\0Pb_lҬ *2+?R=`ei*+^hH^4L1U# <)hS沱|iL^ǂib9Z4D&}1L cSFVO5l kBllBezqR d XoiljW:5~y8`[[ خEcF5 DZljVeƠD_d@i[w!d+_?o4+^vr@o9zٖv-pȾ%zq_ȉ^$sli|3U/¸;6a4~-`EKXlh UF\p2R <`X5#dsPI&lrlWn-6{&%4{Uf©4Ns/ZcdLf/ce:#gy9nȸL^c B9DdhPamnҋQM&}=ы[LO#}i[赯LmU0v"TP.6U[TmG-A6~"TmbT-E6~,TmpUD6lF UP=aUyUIPSl.Z<UӢqgLoP4VUIՇ@ծF{ IGZ} TR9O>vZCfTm'DPߝj;fɊ/N5N2Tm d$AsjWj%0.5Q0wAҒ#v~jw"5FP#U;">Av0yAՎvJQ 6v4dPtOjYGNZ3&? vo7jaU;RPIe}Td6ت|\D&zmZ_K.Kd΁)+eZp_+i;cm, 6ze?gۉ6[⏨iEvѕ~DNJ-kDW;v-&xG>ts'oKvr-q"~j5,:Ov .8#2wblni|"R@[ ~jqmYZwmnFqo7~DξnX@kzV;mQE?7ѻӫ'<iEFGX}K#z_oDl\hξΨpJw^ވ9.A=׬I@Do;rIPF-Q;Ѐ蝓0I j=CE~0 &^(y.wE Ͼzӫ;)+ޱxczzԴk[jye0`{mЍ( -xw0A6$k7Jﴋx]5)i_[F?s6xpX!Y ܯ͸A_ѾϢҿi~#g<vN(`҃3w@ϩDFO?<'fi| xOx@&P.Fx*1^Pv|7o[i$ͧL=5gܲ#A$6#*Pmus/ gA(e12!-}  OC|@+/7{\~vm7!E.7.@'/ #c6^#0'k dafӊtw0?hiiEA54˴ol7٦am2m-{Pf6MiasZ`wiA|p< ?b>nql(6|=ۓO}8xxm м~ =l||=7'&Qm~mi7'іVaw8gC~!o96b@JW~-=O=i+Ӗvmvzq=EWs|FP4 z?Ѷ\_L:Yhi;,jRr5㞍XPC,(gYPܷ2:7s z#zVlŅeRW,(.VKԕkPԪK]<vԳcg?ҏˀ'b&D# +?XYgbԕ\"X1ROxY,ueYOŝų7ܷr #< ?+ZeAqƊ|̂bZ,({ `fPX[b[O, :\' ?|6 YfL/X }vaABdf!WUb1ME[Aʠ ba?]!ydlm͂XP\ =y@TPܱdAqƂbnJ`Aǂ; ; Ic.#M'e/hb,n~-` GOg;f*/FDl 2UܕE '7H`k@Dkx+(n*<bq ˄9ܸG7Jʭ}@9o+(n|Y3ijfxh|+(nS&8͚w8`Ν.殗ޠG]A6QIU[j/ke D ,xfpm9Ӌ%xm@u3fQ%?bB#2ֺug&"wyeb\&wFnG]Y\Ū]2`*(V% KXP9UXPy4XP+zcAqXfD"93 #Ȱ8r氠8~rx5.rVA1WA1 UPg/(֥ Y}]0#d"h\‚J$vŹ,(* ~X`K2ЛU_R." ,( łbWA1IZwqˆ7XkabA*VAqȬM.*N4 UP\LfEڔÂ"eC,1pֱ8s2bUPeaAf6Todp X*(ɯQP,(nŰXCXP\ ]) uggAPq. Y㤂Ι61r5ʊR~`j7%P{C'9KZ +YHMo0f#9 ٲѱUZ F>9T#(6Q T-N:6T-|Pt,(gj*6EܰӇEp %isT-w?$RA ' -Y^FeZR y q :ś5E=?]Tt [D)[~6P02Ϧ7#M$(Aզ T-%IiTmjT-e?ڸ[IM'Hr ZIlT-wRT-)zRDDjI*fϬA_fq0b捪,uI>,ҽ(>Q|A40,_=S+$ Bˑ~$+cƯLX~ 퇁; ѝidzA퇁N-Y D.e@/x!j?,62PL*P6[7*HLfTI:Ts.!mBJ*Ia%U響dh? EngqYDnj $ljyЛTꇩ0pDJUQapqEnj?t1~*ML]|rfd~#H.ڳ6v>Q'Ta޵xHa|b3d30>xj0 MA$0H>D>|8"U D»[x9DFn[!pS19Zm%UGcRq&$U'UzKR*$U{R UDA6}j[Cj]Aܢj\,"}wIA$TT-.Eծ_M'UU /H&r;jW)m ,uiz]?!3r۩ڬ`PYEˠj'z~wGvm RY"]Y;Ek?dA*/z@6&"U߻Z/R*$UTeT䝪k R"IڤjDʔ $RjE=QYq屢$C%$xAN_Tm*x'hқi"r7K̪e_Ѐ6ޱBTt}HJ1T4IՊ"UK+QF8 {U UQgUKWT-CeFRw7TmU)negj PTgm{nT/ tʨ"F*E{h?CP$j?Xa&dFzV`PA7j?O !jޮ a^ܭU?[8nёC!)J;XRA/&Ugۉy;Db($)`.*梊ܽ/(Ġck?qBU[sD#MBj?OEu~ZX$nEC+0j?p#DSA8$EůvzLx[DnR`]O&qbSA 6j?TNJk_j?Tq~v4j?ԃmUŹ޴Q~X̾4 "[R5fcU6$DUKqRC#q LrQKaЂC'qPoc$d'a7fcIvi?/_~Rii?tBnKr -ЅH?C^f,:gj?vCf=loM}J:Qh@>|I vHب!`h? j?T UDA]N:i?<8j;kj?|¼~h_UTQ#.%cu;j;IP`WŇYg"},]aX 6LFMw6nԨc_~_SR;/)5h?6PO"}UIT& ?|z'l]2hm|5JbA؎F1zm2P^[J$4. I%|KZO|`Jk$@FX\IoEY7bX{qk>PT,25 f|Hx$Xg'|`JvfSan%4Oɇu|x Jw;uQ|xX!ݜc|8z =L͒EW #ݡ݅ vߓ*5bwh+^E7ۗƯ ӈ. nצ*=.>Fv&Ubw~/A;ӀREJĮNZ/b]* WXUX m*~wlZ$n&jL0jp\ԃ3y+VTe(8G}^A2ڈݞŨڷkO/]fYFvmf .wp!TFanW ] v;$vAvA쮲] vA+%l"\KeMa @j5GbCa:V v$AjDbwBCj v*HmY@@Tݱꆍ\}:@J vO v!;Tbw;tz##pI~#v޵؝"\2ikQ׈!ec-;bwH,ԜRj!,avgs8KmpóJx!pã˔ Gm|pã7Rnb!B# JF 7B 7i[R!HU aBa~FZ|E6߳ 7,& 7.r !BpCXMV.?Vvŏ[)?B! Aog(ܰZ(TMᆠ3 7cSi̧nxTN'pHJnxl$z!ϡpãb; 7`nxmLpãnX !mpCXn*pC:^nwY1~>7tv`O i[|qcnP)E[|-( Fо]ZVP!(yQ!.`l*ApCԝ 1bpCd-6FP! Qo(%dD( Q8 7D¡pÌU-x+6! QZn" )u=Pq(II!nB /~bP!JX QnCEQN{igV[K!pC_Gᆠ,P!CAx^q%}]!TᆐA 7xn] AC 7HH^X4r̫uXSŠ#Vwi ΤRI#JEDں~",qL A1X% B:xp#GY3H1^oP,"LHPF1nSnn䟛_9;rL䘥%[z>]4fI1^& ۢ 8|>c>AS]XT2HV.Y[tvA5W<cy"Q=paQp3N`p#Hbq@%<(Q\ojf=*`g ,f`O>}|0Cs @5"ȟj>Ί%/>}{f{@IJaF$)/xm&Ys oZ5->+GCp m搊&fgJ^8m ?9@7ŇOMJ,$/H7^s- qaN<̻Ԅ!.̪\ S\X*Nb[{~Enf pӀ@G2Wa1eug]\xtֶC#ĽNpP8DG381qĜd/ .xC^֗(.\]K\ }`~hH?hHbi c i dHPh Ma… W kNqa-). /*_Y3c+%XQXiC=П ´),s~GK_(,6sJXXSL4(,V=7 QJXX~t%,RBMpͯ ֧p(,<aT! h 7GQN)FS9l& l.ڄi[t #:?cP0(E1Jxf,D?UOit_O,m ӱtlM⠺6>t\ Y'ICePr%N}m~ 9f HXP&~Q$?~Fz#aa}RKxI.),\Q.^_p1),.a%Aa"5!*M w.*U?ЦpVu KNt_O~: Q,vOaa┰^[JXU(⧳g%,䧳 Og]iT< L7Oaa.R*E$,MNM]~n /q+j ¾Υp4(LHXa+mE+> k',L*!0UtOW/.swՇ$,<$Lar*aOaa KXX$,܏RgKc9>O#% 7U?[|UHXXf&?]t'JX8IXXCӯM8tP C䧋> aaHXZOaaKX›]|;8?ۿW~29j+z߿Ͽ{w#o8,KK3 }a䆵秹7Hf57`73؟?wO?dIw>˟?o^{^Yպ}x?cS"ѴraL{7:۬ӽ]1v.c{z]1vǮc{v1vnc{~1vǶv]~mewǻw9zw;zcS0nX{.GrnGkp1v;c{x1vǎ;c{t1vN;c{|1v;c{r]1v.c{z]1vǮc{v1vnc{~1vkkkkkkkkkkkkx_tNw;z8zw8;ccp=v<Ǝ;ccx=v:N;cct=v>;cc|=v9.ccr]=v=Ʈccz]=v;nccvݎ=v?cc~ݏ=8{ccq=5v?ZZ?ZZ?ZZ?ZZ?ZZ?ZZSNZj9۬ӝwvnwqN;c{t1v;c{|1v.c{r]1vǮc{z]1vnc{v1vc{~1v{c{q=1>6ӽ tO%Z{*}ϓ۬ӝwvnwqƎ;c{xm!6t纻ݻ{1v;c{|1v.c{r]1vǮc{z]1vnc{v1vc{~1{c{q=Nj OjEgC81!N a'0Ct!: xb!gehpcH';YƐO w泲r4nОA{03k`Prb(C91PO a'0Cuډ9 vbhC;14O a'0CwƉa8 0qb81Cx 0;WvFh.8#‰!8 pbC81!O a'0Ct҉!9 ĐtbHC:1$!pd8dpy2y2<<\ g .O3O'Ù'˓1f^ r>|7g"3¸"Csډ9 vbhC?1tO a'0pƉa8 0qb7`^ v 0P]qF1Cp‰!8 pbC<1D!O a'0Cr҉!9 ĐtbHC>1d!ÐO a'0Cqʉ8 Prb(Ù'˓̓xddvy2y2<<]g.O3Of''˓̓|d>dvy2y2<<]g.O3Of''˓\Ofz2d>ד٭'˹,n=Ydqr'[Os=Yz֓̓rd9dqyy> 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 503 0 obj << /Length 562 /Filter /FlateDecode >> stream xڽTK0WX=9RƏ8 HhD$m6R$eV⴪曧Dh"!|c4c-b\4(e> /ExtGState << >>/ColorSpace << /sRGB 509 0 R >>>> /Length 25125 /Filter /FlateDecode >> stream xK-;r9_@G1 U@  Y-do1O* {/&\"}>o??S~I5']U?|__om?o\߿MZ?>?Jnw2~s#e?ǛǏ o2[xK19uayȷh]x"3G<߆uVmȌGqR*<cٗ׏[܆R)ˌG[RxK1ox`5S\?qcKhE$̈qQ̈|Hq*o_![os:d:ι[[&CfD~.?vsshиuC\ C押n-sE^;BE/ϳGlv=ODz\Ìu=1uFO:TmIm:#%wExI>?Yܲ2eϏsvֻqcqqoFaby+cVޡ>;Ɍlsꜟ{TeFۧ/<$x׋32Ƙ3Y2{96H-}} .:jDysfmeݫq1[Ϗ!sE.M{u\ms<}̸ǽ9]_3"zP۩}3̩& Y՝ǔ>f伾ެ!h+rzeFkڏgʏTd.oz˦Q⥛Ene>!Wzۖc)EŸ󂎁.O=eϻ7q]`Xl=gO<{}}^vmvOq㇎Շվ'σJӎeG{zz:Gǿ:T.ܲ}=-^<*>"ˎt%q|𲧮_iq}kמ-[W՗;-?0\vOM;^[7Ⱏw3 vgўezƯ_.&)+\Z~=_/&~Ӂ<3,{O̒3.?+c"?4\>;3Wc*#;cGy}g./?o {e]<(X緿~i}fu9f#{b<kW;˞5&=YT;=_V1/{+7{ڿc[vQzό|;^f}yLSŞ-j,籫&ȺFwyLS~8~ +~c>&jߘ o^^5sIOZ{aU~u#7_z~9M~#>CZ|yq_yWG,ϺeY&.o#IKe>v;^LO^3}_¶c/WZ^^qz^h?_;۞޷[&~bsmUϺ1]Wdzt;kJb xǮ[ ecv?^ԽH^{ᛞ/={~+ϏY&kɪuCcW_MyD,cy왎/?eG|\Bcm1]g`=5t=7^m/T&wk}=ŹREN2sc}{W^hy Y 7B5>,:ƇgKga=Yvvs!5Wg_ſs@ }~>/lD?X 1l? {ɟ|k|.uu?*ZҿY\ҵ X 0y@C#t8?_Kjhܥo#ZW~fC(gq+l?]+uUu"OϛB?/yE?Yyey"=<~{ ;|{-^voM򚴫հX6Ϸִl_?egďZZFe._|شo폹߲;JY6?G}xĒJvƖMZ:kXniش}clǷVz1@_?;vK/;02ёns}1i `)6x~Or,wś>ρ닍!~^e-;ke_L5vYi{s5zY_ }ēگa%[6oyc@Yz_~~z~~߳$~n|<_]oe*C溑)ޯeGh??ecS82G[keG{:/ Hzoq")@??36:6[Þ:mGW_}?WjMl9cOMn*ѳ`[W侚lN۟I$}}]^7sYESHUJ26~t;Oj4~/E}|οۯʊ>vR[\2~~vlxٜ`+Z{+yʽo˟/Q$1holE񳾿˦>_wMn;+wVUew V;އ{IG^_7||w(CaG-4ß }[I _WMƃb?ˎQn߱W# {?߯)5^j+6E̥ NjW)ʍ-u?'B Oo}-u/ gKk$WWޯz}V㏂oawˎ7k-[y~z[>]Y1oG//w&lW{rGlϗ=5_T[q^O$c;x>w=\\o Mgگ}r{_ߒOYȞkr/?¼GJٰ+ϋUu=+"_>>"7Wnܚ&Ƈ|z[w{-rgq>;;B$oiʽz'S]x꘼]`зC[_x;6"߇{?g&~חM|};g_~>KG?5z~{0k~m!ˮ_}|o/o?Ϗxsa_n{F,wb*3\fr{o3oö<2{0jYx6o?5>{Ư6^gƦ懳ۿmzv<ڃ9?cT_R|޷e;O|cįonf|r`|u?*9s79>XMJl]ɁYH Jr`^Ɂɞ'Fic |&90!:90$Ɂ!9Y\$I,̍D;9η8yj8l AAm@~1ΟXe}'pZ_%0X0ǴN+p2`v`o39ɀ 9,?D|I>hS9yoNszxJ7>%Xv?;9d”_8%XއɾK`0Ɂ۱Ge,Rr 0JşR,?DIڮj?< ~q2@Cr`L&(a?5a3Ur 0ʂ矙)9lMޔXI^T$>ئjɶy:IfHY)9 Wr OTkO&;J,Qy'kェ$v H;|)9eUr`/#Ɂ\(7Y~3J,]v_J|WPr`O@l5ؿ5$J`vL=+J,:+>3t|%coر&%bYžFIɁ49lI%VO8s؝;۵fMv~qGCO'VCr 6Z%l6> \{&ygKH-Ɂվ]hJgaT)9wJxZy~$q*1$9Xϫ Ɂ'P1&3>6\/JHOGr ^o_o E~:9ߛg7$V78@j?,jJP篍SyO[J,[%xm~:9QɁPr`u+nmZ㑓l,k1@8Wr 酽6doJĮ#9e;6e%M@o﯒y+9lJD#9u;t~8T|`Ta|l$XRׯ=Sr t,Ʃ%0ٸ 6V{~go@ gT(9N{oXwqz_%1ڞ7iRr`ݶA>C$$8Gr`SSr`VJ/4iW}Vr v7lo?/' }*9nG%6@<jcV'%pGɁOl6N)٥@NL,[5%| 6RO'F!kcMJɁHb;6$X@v)9ND|/x[czS1^v6@tSQr ~aO5Pr`_=_%{Qs2EĻ&ٿo6NƩ俒e5ٿ64'{XRCɁؘg?h|Vr`Qr`=6d?ɄHkUr`uJnZɁf{a;Y_dnrQJ~9^WɁxl:n?`~wdqaB`NɁw2ar}ފ3/)9v_ǛwʑBN1L䋒^#[kz7X?%Ѝ5:)WJAɁ5{Ϯ;1|J&+9h? ?'l/~=ߝ, \'q &WH&l1Ν/&g&l$n?6?k\$Y~n&s_7?d? |8MSto'_8IY$MS gğo&7y&&CM"O &ӤuH8wqaR>$mgW2^!s۟LǿqE6 bH&Ulqp$~]0I<8}b&C:pϸuS'oqHR |8cz>NO.ĿNIˁWl2Oj\?3z ?oH??+$HyH}?>_!%O&O /Ihig/$IxJ^[%?$ i$$Mn\^_$aΗc7._!m%l?G&MX&f}eT8OPgtqyo0Moƫ&M/_įC/c@w$b]$Mds]?7g ^:I{> Z&OLC~k߿o_gH$iH/iEd??q<&'$`q^HM&4$i$uL?CH<1p˛>s5Noq+'N9 NU_/*h G|p˛Lj\դ~+/Ny~ N%_pyupy,pOp N7Y_/o6Ny+8t_pOl7I7.}uv~ NyA n/pepkp/'='y:pOO ͓2Nf/鯩&Uk'Ieq׊=Ϧ"C"ןl C$lOg U]Zλ< q~+c/`,JO~Vi_?c;_??9N釷>K~R>SHFzD,,V%,-EYiDGł\iӮz uv^PrAk\>HXP0ZA B *Tҥ%)-:AZK'U ,U$Ho>ҏ6AVuT hФT3WuUChVm~iڢ@&W2P'@=郫@+J,PΑu(o* djuB:dLU3}R9Q5NJtRu:,b B@+b2@=k2*@TC`P eKLqԙЎ]d:jyUCHUv9^(T(Q?餩U'ӡOOZޏ{O'b?ĻjttYUg[7N~t\ǴosPkj,qNU UlURv(Ov>뾬wB}ĝpe>R@e}:-UYt~\ԧJUf rZ;1\Χ3U5`*.T˧1MU)\|S*pOc:2>Ӡ@fGCIW5|fkUi SƄ_{tY#BzOy4|%d5|*Ϻ= i]L]hOcCT56HD |e4j=FlYzJj4v(QJ=oM:ȑ\lW?.W"*:Iv#1=& =O^3W9^8O=R=Ae\hs_<1YϪӺK E}<}(ieb҆˿\[R6j T)}'UߑBNOTPEO)x&PNga-d*^BUf*Ythj6V1v*ecJ6 (d^26ʍtӔW/j$`c6tiSbT/׼C5 " R ER >*dX|#Ý7 \ w :B[| *O =Iz  B +dx ! d, j TI2<ʶVN]@y!Ë"2Ȱτ [NȰ !ִ2<,dByvx]C VL۝]!Ç*/?8jĜF'מ_dؖyi@2Ɗić^`¸T 'KUgxƫ!/Yq/fLݜ(< 5l ƚ]qѓ# M3LX)xii>N t^q@m,"9y~ !z7&'Oe pdf^} Y/Ё-Umof"Ly_([J|vS^a6NI&߂Su@wZa?'&LO ly-DE_O8+u'.msFp$>i..Yಿ  \?*pypٛ]7pTjeO t׾A.Oש<O ^0\ \ŀH:6vt?&逗cju _^n=rNz>w i=/,h`jO˯խ(;2toou[` Ne2c":;?]~*?B[A[y~^K!tk)zf0xvƯ)[^` |6Y bS(v7vQ^3^RH5~#f.ek 8{_=_ه=OMm5(p;vBկ.OBW7X/]\ʟ]=d0{=6¸(~szosnBtG7+Sw>P@X.W ^Cwj x76ϲz/['{=mߙaͩQ{]/ OOs@װm+]߾@ߔO l}?'0}cE!x>Gc6~J79ʼ7Rv]@mT_:%8/?/Taa8~װmGm߿8?\}I[Ipu)"3D!+К|+#Spu6@D; 3ՍyjRp> \()zZa%z zCYNj\SW7J 6sFpu3pucf MW7 BdLb"s"(CdZބ̬I 2WH"2SJ"3D^DX\QLJ"!x`͗D !2Vخ Wo2VDf,1+̘ lZuܥ})H$Q>~<-=b ou AEd6AXDfv}Bdk-z z@<<̝<œ]ge^Aj% y\ney666JdkftaHk&4{d!P7 2wp5`~ {"1{x7y=J5w*`} нD /"sG_XXs XsgG1Xs,Xs7'{b(g~+bWbZmoi!ֳhL1s9_/H8J%dj+lK0sF^7``枠fg%- 2w=bf E:1u x=nimM)ks^检nH^a'7 ܍ U*wcn”wy\XAd.|d^@d.'bs o;.մ ̕'~L̆ 2;yf{ȼ\|+Vde ݠ9o2^Ȋm*r>HȜ~!2Cy@dv^ "YޛȬ"R/~ ܌+ "q0̈/,DoR!DfXBd6kr7}̎GIȬi+@dnyEd}"2&oc"Vdn{5~i"s1| Z^5l"3XȬ;1DfXDnVDfg!2w"2{{Dx_v!ZfDfJ< /@;.CgfNPaJ@ߑLF4w`<3?8Ng%OӔs:p{tsmM*fj[3%Gr.?iT/茋m9_7 oUz;YHZL G6Mt.!kؠqP;L ѯ`rk&ɵ~tXThE4nq5K~t*UQÊCc}XۃrrG'kKݒApJr(ѓZ\.'|tW5!kP'WDN"eX=;!Cm^-*{t R5r}vY]Y3^S ՝]ѣgDԩ] %y8/E5tOrCɦ" 7WT ytיQo료 x"GK o3*ګX&߱wX҇\5fCJwx(FgLmnճ;=gqm0BɎ*w2>ʶ4p(>q!#m]V::בP(a2t8L6]5t|y(ѱ+BGs!FH}$9UM+iކ %;>ܺ~ 0Gr4p,E{\dBE9 jrAiZ9pA R_(eO˛Rs;CIl9O\ qX3:Uņ*m4hU4U6UP8zJBn͟ Sn_:S&2|TXSb˽RIbޓwrCu/O[/OV.q.t.mz3<\NGeWo=c#t.ʯU}Cȸ4~aĐ[XPF<ly"]]VڒH\ϫ*ҬڲH]"M_Dw!ksU7bY /%d/Y @^W$su,eJeEѶ$=}Zݦf%nۢEy`;Bv?%[Tl;:v~Fsoxҫ& ١һ͒>ͥgWx{c1B x{= =7,D'aJ(gu[9Hmi.x{13x2Cۃۻ\m o =6x< ӷ}gD怷wY{kn[A〷hXl!%zJI(tF X|{ |{} |{" = \|{2]ߞW]]C'Ε\V@nşiۊA~(NN4leFvo$e7^ { HPJ{(_YVaޫR-QwP܁Y &vQE S~ߡVQ Rol=OnRD RIƓ䟎_ ݤ-|;lbRL' lţwbQI(-WZx(UlNH|ԵV4Hx)h, M끌_E~38~2""{ߍ7oEjT!RLZ'z+4ۡS')8)}oO˯vy(~? ߊ@8{i| qŞ:?P{ǾDk@G|C!}(:ѱcG|s8޿btb0 P>oK1~(NR2Rڍ/ *@7,&fgId,\Cnԅ|)*7;r3)_Hyk/p~@mZmHf HiJ 6[")w 4rRڋ#FtPRny'fRHyW76܁is2]p:r3%K@$܇)i|R7\-@P7Gævs%#*w]}Z~=*L֖w*jաr ~:+ܦCL7{fӢF]%TnѧĦTsp}#> smSϨG&Po`qMiTnhϛ%P'!Tn$8MFTnl|4zCF{}pm%})w3鄌w'$  x?0r mf7"DFV].s'2n%I[Af: @4)  = n9@n 0pk.7[>xN*wwC;H¾;nݧ9V2WiJ-m"@eSGб?xxKF05lOh٭+?\nh^/{$ {?Paݧ)]lv } nJXwG{º^:.@qڒo)5ԔW~@ߵ5c9nNXw/fSDni(7CSX ʕR6SGyu!ݓYգl"Aգl0[Doф| mA1G8Bhfv׷=P{V #u~!ݝ}ݛ)ۓ`N}KPn%OSy<ܞQo[|xc0-:m dlSbfJB *w1&o0 وx6MIRR*'UrW Q@*wynt t+r2n-/0 VEԆl{Mrj܂6[ Tn._*.pSWcS}5.Md'ro#MǶ)Zt1B-Zz;Tl*@o5[$a0[ju܆ r;ISqiEL鴩ՠrŐ">7iVjIn*}RۂP1[Gصt8 zWcܷ9Էu&&F2M$7 I5sKΎƃ6:~7[ʭOT8D("{_TYAiGQĔ0J~@署.g*'r-@׼ՇDkd ZF w>/oGOIohRyz877g6響]X/ GG6 *C(%ES1o\?%t2\^[^z;fvYxGhٍ6с+&UN T, S!q=2U@y$<ٵ'B7 LD[lmI>pmMGEvK@Rj4yR 4~w6z N6}^8gmuMFC~^/ݴ,}*,VM.jb gL"^hlX"T2b.dM.^bO..b.ޑ2oiE'\|U5\maʼn>p)W[E^7pOJͥ*1-!sPp參R=CsB5D0*Kou?6+iQ6L{kA1V2 Bd90(LA "++xM/MVd.aЖ1.nTs51W #oF{FaA/+/jts(ȕ^yczoFȍfJ+86y(A,+qAm+P &1( zfV1,A6.nu"Àp9~SPKW*u"&Bi?;P/޻(b3逋/k.wr#0pC_ Dwꁋ=أ7p \xCobBoX2b@0pja,6\܌#)omO#.NCoB e..u pAmYjV-?? ~//".fG[ؿNQ!h TeOŻmqɀ Sf1w:WQ TpLnhNSˀM..>nwd'\ p N߅__P p bv@.7gP7YC .7\&e_XCІa٬f (; \l(bU F[ xspԇbrˆ6\ p1ۋV'\LIDn\}<(Pz(#D&&+rKI[-p>nŔ4*j͉ wZꣅw<ë+2x^e?W_?qi)x[ .$剷pqGTẍ́w^QT.~ޙUUjpqоp` mnX:Dh[cڔ0zEkmʻȮfv:6sWcl,m qpHrotφGJ~. dGF,sZ48(e͍ƳEOg~ Yȿ.>t~M8KKi߿7LEF~6H"G|/`U7LƦluUg:ߨ>~=ptynk oqQxtox{7ʗJF~$Col9 7,C~cG~F_2 vC~X4T*Xy)$̈nn7 X%GZZK{2SNO˫Ѝɤ \f \2 \^furx呍&t(UpylTNˋ0k{ Gz6j{yE]ւ1Y.#e.7DEfֳ ;ݍM<.7gRSSݍaB/8Im\U+chpyXE pyxek.j.]\dvdLjs*ex\2.<QH_\^\V ޔ %M!Sq˞2.%yTU\ pyR)pyB4s.x8 \6pyRZpyn>qsc<\~&+.O[\ݝȷS a. ي!Hl_zр˳ pyZ+A%s+_<8\+tL\A_,e)Y8kS%qADkƵM"?D4.oBFDrV t,t*e%D4EѸ&FD!D4BD4gah$"̣DDc^ڞ:iqݶ*Zh\`p!(n9tâ?XU.Hb, "[4d;";D4ë KD2t͇"W$oh\ƔѸL:DDC5n"h\ @Dr?Hլ\h$jH&#`h$_h$_"|d>>D4քo`G|shKD㱑n.D4UH0s|_r D4/D4%Ȧb#%@D#gü,AlF="DD4EF7Hh9e#B!"2ghdhdh<6ؼD4!cEAD#[l"DD4!V]o"?F"y$%Ґ2hKz`>D43hc,Oh$xED#{e9D4R~A(YǞ:˼fX{?VGD#GD#S"9ٖFLhdȖ DD#;ׅF FFFH"]xo,a&-ōO/fE?>Yтӫ/}I:}^ `̂$}D^P-7}}ZY0-(;{djb\6~^;Fcd AMΞKtKlNƵ+zlzn⊚55 |oXnz\=櫋!^m&IwmBI@۔Ksݛ,7}i_P`lByƴfʖ%v=/KsOrs7+&MR 0ZH=0ws(4 dr2+z憣f{Z9LZ7po߇Rt7 ޣm>hy pi_80>,| n H7t[DHc/õXpԦ7 - ?d=[n_wnE:+7}JfCW-t] f{ 5ݞ6;ypw2;ypw/oKpLBZ(AWܝ\;3m Ô-7Xhpw,,L&~6e~/#5D]}/G6$"u/?t6 !lڮ:|oM_Xn2?wyzwiĦU"6]^ |wKKlvĦشU%.Fc]Kq;M۔ zqe[Rԛ`;!6]Ħ7Hش QjRTLjIBgc܍Őx3%̭>شnM;ش7MbeX[zzWzzOo}ZkZ');>OǴ n4)jJSF(k~/=Eh/4~o@h/VP5Bbv% M{_kGh0fGh4-4]ikXXhZhڅ%o3,4\ƿJ4K-4f9R7WB珊:^IIⷿo_|~7n~#TA_W'=?oTwh??%21!78(1]^'_W+=<U \t/k~w_x-uKo<8w Ѿ^< znXEǵQ_g| *ҭ^ȧ"OT{>?s"?=Tj endstream endobj 511 0 obj << /Alternate /DeviceRGB /N 3 /Length 2596 /Filter /FlateDecode >> stream xwTSϽ7PkhRH H.*1 J"6DTpDQ2(C"QDqpId߼y͛~kg}ֺLX Xňg` lpBF|،l *?Y"1P\8=W%Oɘ4M0J"Y2Vs,[|e92<se'9`2&ctI@o|N6(.sSdl-c(2-yH_/XZ.$&\SM07#1ؙYrfYym";8980m-m(]v^DW~ emi]P`/u}q|^R,g+\Kk)/C_|Rax8t1C^7nfzDp 柇u$/ED˦L L[B@ٹЖX!@~(* {d+} G͋љς}WL$cGD2QZ4 E@@A(q`1D `'u46ptc48.`R0) @Rt CXCP%CBH@Rf[(t CQhz#0 Zl`O828.p|O×X ?:0FBx$ !i@ڐH[EE1PL ⢖V6QP>U(j MFkt,:.FW8c1L&ӎ9ƌaX: rbl1 {{{;}#tp8_\8"Ey.,X%%Gщ1-9ҀKl.oo/O$&'=JvMޞxǥ{=Vs\x ‰N柜>ucKz=s/ol|ϝ?y ^d]ps~:;/;]7|WpQoH!ɻVsnYs}ҽ~4] =>=:`;cܱ'?e~!ańD#G&}'/?^xI֓?+\wx20;5\ӯ_etWf^Qs-mw3+?~O~ endstream endobj 515 0 obj << /Length 788 /Filter /FlateDecode >> stream xڽUY0~ϯ0jG!^)[ټZGI j;M}594[Rʲh43l|1YnqpNsD\4c"HYBȃ:Jb*Ès۝ne #*PZyL&+Ң4OD,dF%|f,k0qgPЈlECPTkPrF-E f&yUb_9TFLjg(faGȡRB7 d?`9VvDƗp86/#und(Wrr!о\YVn!ڡyK}*Yg&RQi*NߘboD,1/\7Jy+':;5#chSCq䴘W3nB TdAQ~htxazkwla:*S`X{;<"ɉ`/vpiT RF̣pv* mY!-H{9J{7ˇPVw|n(86F<*!+ 2rK2KA6`n3SSUd͂~܀юLq|o9˨)-56aD=Th &nl'/a&かc> /ExtGState << >>/ColorSpace << /sRGB 520 0 R >>>> /Length 26353 /Filter /FlateDecode >> stream xM-9r_˪ _KJ33cn2-zzZъ-=1I"wZ WɃ@8cq?o}9??n4տ]Wr?Ӯ/{JRHOo-wme~Oy۷cþo(ַ>rC>0XY'l_.&|,j?grVZV8xsKЪ1ĭ8x2a2x+#?j/'nu[5kFRp:/Ui{vܪrVח~q7`íVvQn<X:a__F aş/o5[/Z5 ਸlF/_i~^hQeӋ=tky?Ohx`oOKn '{/?٨sG֭o5ܼռzK{]݆ h{o \qr_CG>MWts7sGܿўNooƃCwsj=[={Dߟxz{b9{A.n粗j=g>1\xuv\OW~A?wr⧳r ;;W\oxZNw5Iҁ;' b+寁Q P5߇c<'ޟ>d9_ρs=."X|{׉x`ޟO9÷ywīgOso,h}M'^u'nOWM>lp=b>嗢;<0?݁į2ubd)Xgzլ_O6Nq?<'~io}/>k|dx]lfM鿍瓅ݜz9D;1{Lk~~>lt'ߏ~uq\9c粖O:q?ݳف{:K{.ƛ?'>\OY5^Oq?||ҳڙ^hī6ij}/13 u=Y^M},W{pvÖ?فyfο/̗'~== h6svw~zk}b6\_>\nw+|Ğ'ד|Rw|uyg|l=(k<~?О)'>^S9rm[G8=م^}vOr|W+9>_ʅDU>ܿjG-U?J '?oRUw;6N߮zj|i?]O~_ogW'~}kGk}.wvw׃|z3x~?M?a|O<_Bru?>B|p߉;|^7q??^~[g 94e[;E{iԠܧt 93QsG^{$`hE'5y9&94BIJc2ہO;4sAf59ߗ!RsSh+䤹W++1iUk. ͽJc^wޟ;RA#^9Ǘ^9lHs04OjO@إj {yAHC=4z}04W+KsZ ס[=41iBSj^oiܧT ˜L-ͽjM{ 4zK^ 5ר?ܫ{^&D}';;Ps/455jsKÜI7Dg7>ӷE_ࡹ?0 oAso7j0g@܋46j^ߤ'5&ͽ0ziQs-}ġT=4ҐcHsyh:{iZHs04pjp{ASs\Ps-}A>M ԤWHsx.]49'}Chg{Ys/4y4ʹ4)C^iL^/5Is04Tjz5^Jsף>1>Uc|mQs7S+iSjggJMICs?Is硹ס?ѿכ{<0slKsׁC<4ć^ER+gkGͽi͇&7ܟ ͟/isFݖ4~Qso䤹MF +X#{Ps0֨ϯߛ{&M}ږ>sGhe[ɚ;7Gj 4~[Aͽ1y`'lKs+#}ojs͉{|^{k|?590Mmi)Qso5_{kԔp%jj4w=_i6-}}[=Cs7z 4& ⤱jIA#G443jiS|W4硹75. ͽsW~{A}ahb(ͽf}NCq{J{L#ͽӃ*ͽs~/yRs=jGͽSA>1Csgj>Ƕ4!?49m<4pmi0C{BwKxw?juIPsع-'=ݱK#>8>vxZ]2`QsHsϩww% {g5-ݿ;g8/\߉w=wz¦<>n<Z܏9ZF5=;)4O\\;=iYlEű5wߨ__ը;9HEx'_wڋss@"qR;sL>w..;$x/LFsޣϝ9_ {}?j2 ~×5ϝY|jܡ.-L/|/mp}/~|e9ܡ~,>Kw'|wܵn|C|Ds&)%_<}5_/>ܥaN) |s>w3'v;si3'v4;ܫ|Ws5ܙcϽr߁|[>w1^^K]k,;]'5p|̹^^>BZ>w8jj~s>5 |k<h.s#{>wA^&"{X>w;Ͻ}/5[kVܽQsFԴ׾~O:4T;ߝ/5[k@ܧ+ ~~ࡹߍk(&}>"jwxD/1~3'>f!oj wCþj~SsWN.2\~WS||h]s皈k|~Sojx%li7sNi%_SjIsW|%cs|';~s4wRsKk4w~iS>wm3x.f#}_~OOsg|v{ >w}|4*#4^/sg>wZs}O/~|}oi.|U.;}^s}Ps!/_~~O|4s#|y;w;>"<>s-_/;|Mܩsľsf|W|}sG]CS^>wKX>* ^_\w;|=is|O~sG]_>wɻ]]>wޣ~kML>[ϝv*4sc?4?~s}8;5uWi#ϝks||ijj|js}_Ͻ._ 4`+5(ܛ4u9t{c{ss}|:Ͻϝkso/{{;Ͻe}ݟ>wi7j7x ޴&@{>wΧ->._;}| ;>}Sr;E(q><#@^s/\ӗ^L:4OͽУ#}6{z)}zR4vBg;RsRs0|g_h5y|ZS}|PQu_ϝbiTS#ͽpZNϡ4]iڥe܋=Ps/j咦}b|?4]iyjڠ4rgcpURs?(dJmB9gJ 6‹b\ǑE!ΔGʕHSq)ւ8Sh8Rj Y#`8RF 63^=|8RGʕL5S꫹Ggh2-Iv)8, qlg82e ĢʙE5Ǒr`8Sbq) P#%k3ͭ)8H"Li5Sڻ#,ǁr)83ǙǑcɢGJVGJIqlGJKLHJ@lGʑLHJHRr)%LwwskʏGJKLGwsGZt(WCH9R~8SHJHspԑ)ܬ9Cpl#e`#(5+m3%G#!K8Rl#F8SzϔnnIHJH9gJ 6‘2R~8PZVgJ Yf6\Hr9ΔveJ{7%)-HiaqԖ)ܑ#Ǚ2FDm3 Gʙp\)?r)Qv)wY‘Rsp)ܞ#H9d xPc 5^)B8p)Wj™1j|L+pDq![ǑS(ǙU?Ǒ}#%'b#%P#%P#%gʸ3e1ǑS(ǁrqĨ8RGJNGJNgJ?3[RTs)٥8SȔnnNGJNʙ 3%F5Ǒ1ǑS(ǑS(ǙR[wsKj3%&b#%P#%P#e8S8P9B9B9Δ9lVp)9s)9r)18lVp)#~3%PE8E8Rr 8R9ΔvfJ{5ΉH)H)L5S껹٬8SRȺ?$b!FEBiǢ|0+h;HT?Y6,ʇJHC %mIs)9s(5P3%!ΕE9ު6,D;d՜B9B9lVp)mϔnnNGJNgJ 6}7N#~3%,HrB9T?Ǚ2LDqqq;S^69E8R#F8SR;G#q%)-q#'HfǙ"p=9LGʙ3%E`[bs#NSǙ"pdHfǑғ|}5ݥ]gm0a},~b9b'+6Ii?|bR]9n1[foU:$Ƕ𻷱3Emn_Tkjs7tPf4~ }F>jRGi{zď Ӆ7'Ӝ1?ק[1ׯ%R׬_7_K뿽_B(+[1|+ 3UjEt+*~;a߿翽yݧ??lK7J9ώ"i1?lbufv_:k4{ƯĂ">oM,"Ha4Ģdpqbqe K]E˔rb(p|cb(ߚXD7&E|cb),'.j&gza_oۛq~ի6NW6|NQ`:fN Ci vѳ`J3Ox':$o>;b}vT๩4jh6f[YgsgqWi :Ohųܾ) ?<ȫ4VhCA#~o#Cf>@ܶϮ` 6@=v*&r'Af/Z4q˦vgl' { M*ͼ^Z!NX7U,bł7ĎmA;Ж&QXYkp^&߉Q:;z(lBá4=f>k.\r_CG< i8cxng\7/lJ%͝AհJ1977qP~cڍagwF>ԯq\eo ;A0{>O{iq|qݶj ~jV^J{K3b[fDd楙m4lc4;:{c)WlP hRzhuᎡQbSAW (ݍ6ć@!,lpܠI@륙 T^Py o,%4]5wEifk'FDiP9n逗f/<13,x:p~l^yJ3O̶ E+RØ|VfQ07އQ98QfGi4x_Py~QٮK3uv>6J3On5 Tsf^Py(pA4+L7>?Qo87J!uJ3ޟYڃRV^f?;J4yif(}cgiJf6C4J3Qjuo^9ܯY0o`~:~8z(7އ;7Cif?,lׅXK3[q;ӄS8R7gif??4anQof5hmQ}jz>gif,lX3C4;;f쉥-ti>ڇ>ugif4,l8f6~(iK3F]?c,]&^yC&K3|m>̟z(lm|8,e*#Q䟥t<"88D4O#r}~Δva'6\7/l~vT`Z#h>vyif;އN^n0a۵6~4F) F, _mpu}8 kQjYahuhryfοK`Hi0߇nR=qR^.J+>^ӵ0߇C CK3_4=t4xF8DhL.Di9tmBi&} z~MO4z~L=:Pn8[8ĀOK3"D?fv=:o[8 脳x]J3kӪ_q*Lh~U?jMJ8fJ58]?K+G8qoRGj{! -~^zbiؼ4.}7\oi8 ?=_NwXygfv= K3{:q~+h h-Pnmn55r -Bs^hV8hфMs?aiAs9M֠ϫMs_f"g~n 48ݮou$KڼpAfMPT 64y4w! ~;4^#w֓4yΝs.jssݾn!NˠC>C>lksg>hxM*fnw\s !Z{MsסAAsMsR }J+wC Bsױf}~*!ۃ>/< 8^d޿wAs︟iS*qAs>14DhДOܤ[gO}b'>1g9]!RrBO vi>h a|kMs x/w?}4W8qJw?>୿cjS9}~\s7i fk_:p6}b/h@sǚ 4_&o';;@s N5w5wO}> j6>Io&%8o.=As 4a Yh 4G8z\sO}~ς>o~Cn{Ǵ'DSsǍ!߃ w4w暻o'5#hF>|Cq|}bhm>{s[<?񇚻}^o:Bs?!Ÿn\s95w啕'?jؠx*51Änm[<!Nݠcs#jp]z O\;4q\"49ܭx9:^nDO|~i6zAsqnA1_ֱu<hh7K֠'>5gh,%G'Asg0kė49 |M0~As}64߯BskdܭJ/4}bQAs|wx~X}>q>7'F>q |~CsߛkmB}b܍_6}xOqsX }b&}b?hֆ%8W8qbhd'4ܭ?2F~@Kݟ/5{'Ӿn'4xOHɮO>]kz!C/5yxD5#}>_Rs?>AC>1GDߗy C`WF=( 3暻}8qbh_Ő;ÒkC>xDiO|9_Ssa .4ƠIBs0&VN&ugCnaѾq~xUj}i~Wj9'fnsBs ͝a5y?5 h5Ňn|hw*ʼnf}4#} ڏX`9xRh!iN !T+h6 G̑^稹xRhq} CG{iC8h|}4gt&4w}N0>@s !wC%"߽4|u?h~h>?=Nܼ8F7=aSsDϹW-Xϝ9Ͻ^Nϡ|,lA>wgsϽ`.;R)|N]M>w @Oc_"oT (t2s^(WŽs/iH>H.;y̰|2ܹ|s-޳ϽG;-ss {}?hn}×53\W3voa~ვϽISY5{>F Kw'|w}4܇|=.MR>!_<}|G>wiXӇ>wsw||cJsC̉y?<494]5ك}bjZ3ǖ>C>)Zc澟.5j CsߥyRs3>sQs㤹O~FO}?9SsסCs9\gK\C}jck |e[}=`h CsOٖ/5]kVܽQsF}?iSs핯}Cs%j c3uiM5 jSÕ?x?hk(K}}D5xI}g!ݟ59k'j;s{Ksw> w"M}^wjL}"|k|~r|N5w54k|sssܙs}W?sT>w>wǗ|. >z;q|s#ϝ.ˇ,{/}w||.sԸsY>wjsWsgϝ}7܏viU>Ghsg>wZs}|//X>wi.|U.;}^s}Ps\}`>+/܇|>7&~^>whN߹ɿ|aF{ϗ>s|}玿wOi9bC3^>wX>w~sG]CS^>wKX>* ^_\w;|=jywџ$|\wڻ|xϽG}ך59uh;T'ƾ#>~hF}ߩQs1|^>wO;N_C&}?QRs׃ؖs_5_澟ԀCs|R~5#iE 9\_04;95ʚ?4]$59M |'_|;4wE|5y>j}NۢS.;4w9N?5wy>G< F}o>1|w+>= }oCsSsё>_S`h;KiӓR?'5P\`i.w*WWWjw)Psߋ|wJs_ס@,}>UiHs߹F-}Js+#}vi;2i=PsjS֊>>j;W'>wHsSsߩ Js?swϓ4w9t/|wah5|ͬej~kٽlW_u/Em޳ ef?y)YE7(t}ބ[\h>.Ca$ WA"#rBh_On?+9kBhʇ̓z/m}ϸ=˙ΙR: k׃DNE[3Z #H"FוDNE[{Z #Q"֧H ̄aFj KHખ0J"W#%`$00:&`&H"H  J8#ks"FWD̄GHDhFrP@ B3DZO0(`&ؚ"L \0 J ] \0Ia&=Z0**`$pTLG"[h-UHS8 ̄V5YWi~Qڕ)zQDRTN:E-S껹%EDi):(dx7 NN1;EgDB(g‰r WB}Sz͔jVrC/t;C};/J7+NNbph]%FDjS N~QbNpG_12e~#ձs p#ED!~QbDNs plS_qdx7(%Da (dJ7%(#HQ>Q_62"N9޹sW^ )`ꀁ6*aS;񲂁Y7WԜ(N~QR$!HB(\s pp)/J$ĉrHB(\ t " qy'Jϑ8QVQHB)uϑ8QΔ'ʅy()'ʝ# qpi)L()'Jϑ8QL%EHiGK̑EwWsە# q9'JM" q4`98Qz$/J$đҹ+ qD9s$!~QR$!N.+;8QD9()' (Y紅EIi qw8Ep9d'ʝ ql_Ss?(dJmB9()BsN~QbN+DSNS_( 'J̈́`#(#^=|&(G Y‰r`#Ԛ)#h/h2-INZ(=e2ͥw)rfQM8Ql_lB}5'Jׄ_~fJ7`#(-D"jwsG Y‘r)'ʙDaE'JVڄ`#(5Di)?~Qb~$(Yi{OF8Ql_ 'JVڄJ!K8QJ6/J36Di)?~Q)ܑ6#9'ʑ#%.p 'ʙCq9'JE#S껹YiNCqle`C)5+m/J̏!8QlE=S%G‰6D9()'Hp ()dJO C\DJҮLi`C(=- (eJ}7wHE#S^cs8Q (QN;,D9'JE-S=Gĉ2r"JjR1H(Wj/JJDlR1j|LTo)CTS @y~^)1/TNpJEpdpDL8Qr %(9NG~QƝ)ܜ 'JN#)p) 'JNĄ%P/J?3[RTNR~QȔnnN%P‘rfpDL8Qr %(9~Qj˔nnIQMEpJ8Qr %(#E5%~‘rDL8Qr %(9~Q'(٬ (9NB (1'J6+'H\ׇDrHH|H\oj1D)pJE5S껹٬ uHQʇ4pʇ8p{(/OBpʇDGpʇKpʇʏPnnKpDL8RjN_lOhpV|0+9Y5P‰S(Df͉pJEI8Rt(ĉr$OEI!8Ql%P‰R'=Sƻ9NB 'JN_~gK3D!N#,Dr!~QR!N;G‰RR~$E(-q‰ғT8QYAEI8Rƞ‰r&"`V-Uĉr'" qdpdp0o_滻k?6O>uJgB? 18|&DZI'bg^vl+[PV*vۏcI7WlT;|m>w6Sۼl,.7"6Sp ~On %kܬ- ڊX^ϸ*'|/l,7vr+NOmyrK|t82ָVf#Ibb9Tܚ8Prq+aT~ض P-RdS ֿi`߄,l*$ mQU [NC֭C.*Zc\UPx]zŅ\+Zqa4+.uƩU9ٯ0=B%a{O PP,5UE"(R;؁џQx;ǺÅeYv0TVfauQ.Kj@V֓dz߬7\xHjÅYl"k "+ BQhx.VVgh,^j=v`_d%.|ti:ۭp! V7guE*(I뵅+ c׆+\t o0sPb"QakVڲ]E/~nՆ;g@ZPHl57gaMYEXъEgX cNDaY@XiKON*̝4e`MqY;Xo.| kκ OƳs xhŒ6[dpuʟ-h"ǂn^:ﰹJՂ;4qiR|R&(7n u Nf£Y%|(Y.k[>̟'Bf,\xJ; w:2 .!4$V.,Egvw#筂v E ϡ2SPT5ZVKaW=džXNS=M4PZBu+?KQ`[hZ5[gp.O9 s^ũfWQin+eqM!:r-mF)`9Kca/WUqd`FS FꥣPݛAe1*Ѥ0BtN[P ` K/Be^)*-ΟrJhD\QE]Xފ6{>Z4Ҷ&5 ȴ̿63e)y}L"bOyLIzh*jkSyE_g;zJi@A ة,:Ut<&lRi6V'%5I=JV3r|)|a/Ⱥ3G80_XUwpZ)E].`nE{통nh2#a ۋ:X\l/,JN]z%YPܼLBl,/j.XՁ;0 0C8/<3o f{1GkI'91zAM!6PmTPeedJr2_E5)JWqL9>V&phtB;5(6mi\ԡۘRmpQm$uCmIMZ/vΐ~5;[֤92Wo~AptHxHMǩAmNȿI PtߦH SmUs|YJM/;}s$Ĕ~x6ߦgAZ;ཹ;>|I [y9H n6Зp\m|~+[gH Cp ~_A5;Π EW'\A'EH~+#JUZ_DJPf[ّ(VK鷲#QL.)V}Myt5HuPxߩEA66\WY~+7[u<B[mHR!UJT~kc3 >͠kII1x~F~k_f.6.PmT)jȥox<_Im<*o̐o;uIs0jo׀o+< үJgPW Y~X-H'1Sm|)aJGY'Bm: lӹ~*~YK;A6U~OܙIMAm:,a%ؒ6D6keonѨ~;gA~οoגc>)3I39)Τ@Z3>oטSXާ vCCg8Im&v ~{_3Vhޒ;#˹ v樔~;?{o.v&~;O[Ӄu (?ͤ)1>B܅'[L\C˹wv euطv:[`'1[l9NcAVx1{T9sC#S?\[M'?6B '-'dk)9e'C !B[J81xHXu$Abb٦faG!6 ( GUK gUK Glb`<<$.B MWuj'Y3m֩ IGPd̀0TO<`*'~W*´Q{0T)QGE"\*u#,30UXe0-30"7@ 30nsЋ507Jm47*U47 s4s%Xf`Fvr6+pI3pB3 30j26fοpeDfAIf`H=f`., <xd3fA.#)0K>xPx`Yf!f!)šR;pxG"SubVWJ\EpV雿Zp`EV,'//+]qirVd̀+ԊB! .*! .%Bp(*Akt=6>bu_}gdՆֿke5Lh`(#DtR_ m.뗁˶zᗁe[@ͅ2P DᲭeuK"L./4,epVQ2P^6=q#6W<_#"~VtKZ߿꜎??˶_Mc7ƍm8ʨvO5_Y;c.@7Ï~?o`^?;_;X:r;/hދ_;l}1g[PD a1agsS7nDg8N*ϱ[mV׿jN TJf@^2V7,ԓbGxˌrbμvpi`|5Gyb|5'WCyb|5'v[`~m)~b^b^b^b9מspH endstream endobj 522 0 obj << /Alternate /DeviceRGB /N 3 /Length 2596 /Filter /FlateDecode >> stream xwTSϽ7PkhRH H.*1 J"6DTpDQ2(C"QDqpId߼y͛~kg}ֺLX Xňg` lpBF|،l *?Y"1P\8=W%Oɘ4M0J"Y2Vs,[|e92<se'9`2&ctI@o|N6(.sSdl-c(2-yH_/XZ.$&\SM07#1ؙYrfYym";8980m-m(]v^DW~ emi]P`/u}q|^R,g+\Kk)/C_|Rax8t1C^7nfzDp 柇u$/ED˦L L[B@ٹЖX!@~(* {d+} G͋љς}WL$cGD2QZ4 E@@A(q`1D `'u46ptc48.`R0) @Rt CXCP%CBH@Rf[(t CQhz#0 Zl`O828.p|O×X ?:0FBx$ !i@ڐH[EE1PL ⢖V6QP>U(j MFkt,:.FW8c1L&ӎ9ƌaX: rbl1 {{{;}#tp8_\8"Ey.,X%%Gщ1-9ҀKl.oo/O$&'=JvMޞxǥ{=Vs\x ‰N柜>ucKz=s/ol|ϝ?y ^d]ps~:;/;]7|WpQoH!ɻVsnYs}ҽ~4] =>=:`;cܱ'?e~!ańD#G&}'/?^xI֓?+\wx20;5\ӯ_etWf^Qs-mw3+?~O~ endstream endobj 526 0 obj << /Length 610 /Filter /FlateDecode >> stream xuSK0WX{r+IT$[$ pa9yHydl,R{Ɵ$'_qwMV,IٖK H~Pʹ !ʮ+U^iZ o.f~&7{8!W[b%5<U戮R(U/χ qxPTeW,U툾okWd6xe>Dv5pk6v(7t, sa]E]_Zށp,Tª[X`[`}}.xk{XGSa黹UxmqrY`acgvw +#~np>Y +p"n@PP~X$B x&ǜ ]lϟKW5'V0pi8laz@[H*+pOšhմm\衭Nd Asq'K+ǩ&WiS5=pؽBnf9`F;el׮~ڂ- 9Ƣ<;#ɁKç"QI*i .tP2,@g@[/p'aȶQC.> /ExtGState << >>/ColorSpace << /sRGB 532 0 R >>>> /Length 7101 /Filter /FlateDecode >> stream xOf7R笠KX6#@ %0HCsNN'fH'벫=N~wOot_}^\dtWj,T竎(UJ{R߾:`;?oo}[~g|kΫԆRzJY^߿ו_eoW֥Y_5jL\5 dez%h|ƺT(&*JFN,/*^$g8|°OVkݰQ|db* 5%0tY?!hy@NdaN3כx!i]蛴OXQS2Vze<TQN4EǡW:')QQ-d|X8_#p|h㠄RLkq.8缌{z{\opM{7f+S/֚>^Ar|E̟  0ӞEQ&Ў|GWȞ~G`=cjRr.E{  Ċ I|qbcU+lyW&Ǐ竻f~)|lW<_寠{?ƯqGo#?4:gXNɷ@rؿ)_gS^:^޻Cǘ_kؓS{LG8|QY@nbpqKw_a~Ƿm?M&R% f5|`ӿ.|u]_Zy龿r&XOV+KdrEo&?(ϳПP?1ɧg0Y/PVyPBIP2D*- 3I| $#0dd<Jc$ $sL U~0ɐP;$aKsc&I8\PxJ'- B˪BV*Mߟ CAC! ݊0S),, % EP@! n0 CPLE~y^ ËbPh# uJ+ CdtPȹe4H C=r(!_H C!7JYSa%n먙fJ|6b6N ٸXP)& J C=텡 # CQ q[ CARXU01/L# l"ӜPҨPkc< ϻ㶎PCT`(Fn D 0u]Ce6J:]m 쥰1P^Cr H텡11nPf CC}-4ҪVi,PP(}nP~aa(<6BuȞ{]ulm0' 쫰uȾ}a(fcU:hW |=[ C}_PvJCKP/{CA C!۫0Px>˵1TF]*O E=<1Tixc(]C â0TC1HCY kc(Fb<Pa(GA 8B& C CP/0PxV^ C °\O e/a(! Zb{"H0xkc(P9߾r1I`'+oCc%blP0S*g;4CqZ<χtf"4ʠ`GX^A*cV}P6ZP uPjP&PКoPl?4~$E ?b(N;ab(L+/ i Cy ,++ i(͉?a(,aQa(_]U ɟ CaZ (eٞ0TXT ZXK ˠ Z- j'OPh?v*ZH e5Po6 Ck Cq>kc(S=Pp[^E1}`(C>nP[eisa(g>0)˞~u х4C|6.eO/P453pK9_C*PIX(^͉ ] 1酡2 np>7Y4`c(|`X1y0Pxǵ1T>0 CC|6B.LE ;uŃ>k>CҎ؞0َK؈+wc(j'+PtsHWd7sT0Q ϡC:!|sOPh_XL z^dOP T x ϵKZ` ( 09C#_<;|BU_UP_! 0W`'?W|Pyc;a(C}}0ü010X ͨ=+gCP9~ WP6r;j% ]E>[DTwEʭGw)]EQ"GwRfUo;(jOPN_\)gOkoy˗teӵ̽* s_Y2{LCǚ*ݛ /^koOquOX qupu WV8J-m#"{&@p @;H8\petKWX>arQ-| 1hM+nWE-K hM?Zgc:p.9yu;q"W2QZr+ #&yj%(]9P1x#, q cy_`׋_Ni W1ή?Hur5߃yBq+6M?Vrj5[ܕn}Uvrd5wVW5**~>MV* 8qќP#[57T͝ȩmaE v=)Uk CJTTQ$X uM~tJ" e*\YoQ*NzmJ`S*Y׻%UkSGRaRa|DEҾ!JPR(.T(/(Jz/J~9 ED*{*RAkEP_Yy)JiR,UxK(._R+}#|z(VuSȒ2R֝(V(աI=Lfد;PKœNOq4@;K8J-HII H{`bi6HHVW\ izgKiwR(6Vվ~iWqWpWĎp"[FG+ȵ΄CGh>a?}tj<\;4Q9oMQ/#bt[Bvm^pr\/uZ9",/0Mm;5uWayhyEܶk"l#7ҽ~ƚ"*XuRT(ŏu";NE4~ h‰+ն㸳 6ӣZiͷV"n+;KGEbϓ(釭9,B mâd!w8^*'1]?~(u??^zzOywbԪ endstream endobj 534 0 obj << /Alternate /DeviceRGB /N 3 /Length 2596 /Filter /FlateDecode >> stream xwTSϽ7PkhRH H.*1 J"6DTpDQ2(C"QDqpId߼y͛~kg}ֺLX Xňg` lpBF|،l *?Y"1P\8=W%Oɘ4M0J"Y2Vs,[|e92<se'9`2&ctI@o|N6(.sSdl-c(2-yH_/XZ.$&\SM07#1ؙYrfYym";8980m-m(]v^DW~ emi]P`/u}q|^R,g+\Kk)/C_|Rax8t1C^7nfzDp 柇u$/ED˦L L[B@ٹЖX!@~(* {d+} G͋љς}WL$cGD2QZ4 E@@A(q`1D `'u46ptc48.`R0) @Rt CXCP%CBH@Rf[(t CQhz#0 Zl`O828.p|O×X ?:0FBx$ !i@ڐH[EE1PL ⢖V6QP>U(j MFkt,:.FW8c1L&ӎ9ƌaX: rbl1 {{{;}#tp8_\8"Ey.,X%%Gщ1-9ҀKl.oo/O$&'=JvMޞxǥ{=Vs\x ‰N柜>ucKz=s/ol|ϝ?y ^d]ps~:;/;]7|WpQoH!ɻVsnYs}ҽ~4] =>=:`;cܱ'?e~!ańD#G&}'/?^xI֓?+\wx20;5\ӯ_etWf^Qs-mw3+?~O~ endstream endobj 537 0 obj << /Length 19 /Filter /FlateDecode >> stream x3PHW0Pp2Ac( endstream endobj 541 0 obj << /Length 723 /Filter /FlateDecode >> stream xVKo0 W(kY~^ۮņn(P;,;pv)Id!NփGRGGҋ۳}/Dx< E^xE{y<.8"v榓6m>]܀@Yj $!j:q3zォN6t`6dn_jP̂9+ NN,pZ4 ^p-8g>r S=͢4j$@yX)BF ")t#=ʎsy9l.['AشYc9őt=ILQo+.w:zr$=\& )Sm:Aj萜+{Ѥj|8 ]<4!$cDE)- +0Mcҋntg]^g J[PQwR+yh2ImG֩ỴI\X3,;i> [oj,;pE ?9-m7&7ڻ;h4al&XNU_qk[|lӾñD<`}6A׺ˮ9uRtgY؝$K˃6eOy gH3֯1ii͂DpjJqW14z$Y;hq2ɱ3OѐIN8> stream xuSM0WX>98H`"q@pRWU=Lm<3Mf*ȉ9Hsc)j"U3H*.UN# a$2FZcS/MVY5agDS> /ExtGState << >>/ColorSpace << /sRGB 552 0 R >>>> /Length 30193 /Filter /FlateDecode >> stream x}K.m=L:c*#1lA{m?MX_dBKX\U]Ov_+L֯VQ9ퟹ_٦JQQ__/}?J_Gnsں1Ͼj?SÏ\)9~k|@F>JV8C k9&+<~ r|#ح92\V;9 }vCz:jaa4[m=:zg^C7_}} oGOG-}h{^Gxyf^kvL=G߻ۛS7A[<ݔ~tc ?4<脾e]qy@{\𳂶y7gye?Q_)hOAWhZ~gCPy,A죒S?VQjyO-R)6N/#~*C?Έ_7aIch+ǥ?n}g1GyX2i돟A*8&dtǏctǏ>(`y@?4cd Ike4'>.6pIg_:F—ᱍi4(#a#Ӈk:QcD W}?6ǃo_A}<8_129>gr|oAxafe?;?4>=1]5>=g? x>ϋ8>NcNaZ!&֑2~vVA']_?F{{*XZ?݂ߌWxl}c4>ej~PV0{szӳ4G#[JmgonKƙ[||G#>qK>G/ӟZGsFc c?jVϷq=k|q͏q?`|cS_g~k?Mfȗ.z?WG!ays='7ޑk&Gg=k~տY`{p]7s}~X9Zurb?Vz5\V&s?.lj8DG5jOh O3,6w [BZA|^W{_[;>^qzsFl8dz}ZwSٮqh7D<--ӿv4j7mWP3le&iEcEHElC,B.{*0"_E>M<ٟx3!W̟}\'~/deUuإؿh2_s>ϖHwV PR_^O^gfGxMJz7- [{$iVJʢd&̪Ҁgz7V/-{fl 6Ɓ%ALϓXAzAT>R2-PI #DkYO)Y> ؋&AL=[3^DF@z&[ )D+73'cBG Ola6tHOz$V%#juMH^^ob8c򗘤z7ZY2Cϗ6U6! xe|#~1?LgH!]ֺS%Nz͛>m?$Ϊ0Cu%6~~0j[~ӀWk8~1^*p1RyI/Di}ګV'PJCh\gRgBN[Y ĔwH}RzAzAl7 nqX3|au#!. UCZmQz$V/J4/7>~RލCgV:QO۞ b& Zh07|A:t4ލcՆ(HgHC(J× EKHU8V6!%X Urv^% BQ:|E JRQg-V' nO3j'TD (>Ң^O??UZkJz7Vg}1Y݀YATsHGkeQgx^ )D+0 ݜx8HvJG+ _NP5^ )@J qρ;"4HC(0l+&IOjEjuҀkT7bY;%ƾ^2Dt!v4Jq~16`<냳$)f\|+0Գʷjߴ!4} 3x8KiukZ(kke֦ql:Ch\yj aY*#?_ց &QZ|:H= Io\" n_Xc<>pC͇P6iQT{cX`HT^6!%X "~~14C7pqV1tRI/a"cZ'/iY:Achwc OS#+@JMq1mVb1R?r#=^+.v =l&D+wY'c > b9 =Cxy媵kp*X  }f}1 w&tk@ - iADL`#ZcQB6! xiDN۴~13_ w#HzT 4ku%N5+/a0x5Ĕݺz"+~R7O{~(iN"ibYz"V/ϓ^U M7Vߘ5;*b, D.ʐ &Aeyr*sj-dBz/oGdcXBqBAZ1Sf^H'5 ii7V/d+X$&d<Ԯipw1iHFZDE{ z kѢhRލk/~06`t} RCey1NHKi# nߴɢcurL 5Ceyh3^j&/7V~ל0VXC(Hf(4;`  k=fpJC 茺9J_G8;[z݆ >65ӻDLDOU$ᆰN[j]<لty=vcu?VpJd`؉ҤxQaA|ϚBJ@л҃!cn3u{?yQ\o_o ᑱ5i䊃 ƛ >X]wӉC,ę1ɸ(OQ^0nPGգHp$lS n~ȱ\RBg+ɫ¤ utpw d#|>xW-FwBsjU3q?r,KTt㭡[|d-ar[O/Q 9Qt)3)5zɱ/]REfa@޶o|_&w }|6)YXؗ.)nt}=eM9qQ-_Z?}sGI5|Mn&ǯ܄nvJvE|٬yp)j7 if%tuc]RY$LEar[ /`,6f(úX.)[I PNo^<1;N{!c4ӆLS@Jl_rlH8템n*B{M9qQ-_Ol%?a~eٴSr H8"]MD]}6uoe#fu7ǯCr{o<ȏn&ԣnۆ -7}/]y8Gn#/zR7Dt⠃.$ݴ)Oj{>w3i9H ]G 788!]P*۔uo%G̲>Ŕ"v $ntIu  ]u7mmʉ7dec a Sfl-HTђ)叨۩uuo[8՛bYkLB zDM>0Poñt$UwlSH-_bV}8X]1iH G. RT>Y)ݭ;G,۔uo#fCoS/йGy\cK29!za`o/QB7c;BipnۈuW[mi $3g"6/V-R2{ *(~YGy3VM6E|goδn}9oc4}Z0(]0`؎_qEǗ ,1^W2 tEMmBwLQu햄mȅ /e#fqI*!АrlaHԊ88-&Tuن\M_ƛJq֦[u{ HEJr>rgH׭X'$]솫8!)>\sW-BsiH s)tI~{Tn('TĘ "a)9%])4k[%ǻn7Ǐ<һc4H]R봮Gwzi]MUuo!fxZ:tMn#t^Vp0.fԪ;mʛZ/<5Aْ͆.@8\wql ]3&<[`domMSP4Q*wGB{%[9UݪTȻ~/~B׬k=Y+(a ΐ}ːo)9SlS,v'vȧZj/U[B~I !v4tŭkr =xؘm^vȧZXBYv-p CKеꊚ5`RT! ۔t_FZfa LR@ !J+`H4N!zp_De .BNRB7Iʱ.~&=4DoB.\}/5#K`;iSI ]G ]R^JcY^i]cl)۔R׽q˗QS'HJJv>r_T ݠ3ӽ.jar2Q0','QBI18Շ^z]c #۔uoe[ ޠ OvI ]G;&K*\boUuW٦{/CdžgoRCӉ *(=,Z?8nMmʉ7ƈ_6zY։/KR~#QnK|!'`@uXmʉ7n2#7˂GbzfRB#Q7F%uEdpl]AWWD..R׽q˗v`M,{]^}ɛHWTٟ`r,/٦|u*b/ lSebZlRB7tEy(HxVDo>nDZnbٞñY/wVAJoR@W0b.Fݠ4JwCQ%6E|Ɉ٬C)mm#'%tyHuIxMEy><٦<[Ĭ'9-|Jq uƆF{(۷P7ǑR׽q_0-޴>D ]G;&K*G 8[ 稊m޸K\o}ߜ'jZ71=)92bUzp.~lSN\Խq˗]1<>vD}RcOTjG[{E۔uow_ 9>p ɱZ;>@J|GhztlD0 D )1cP7J}u߼y |Ɉ1&O3V%tm.3ceR=O6Yyp˗>9֚+,|!%t9.(ԭ҃` ݇օAoH{/ 1;cYO=n#VYR70ƣ|`$J]RgK3jb[u=q٦{>,r/;wD8zB|ЍyAc`{LDR=ƭM9qQ-_z,,?AG<#n uI͘##CoFF#Ver[ 쎵-kMn#n uZ88JݴкP7ۑ.׽q_&TrlϦPc v%t}A%#gj&lt ӶE|~pYg\k'HX$Ƿ*{(fq+1nPjd?o ]$uQ9dr[?IƘ85, d=H*1#'2/q:S)'.޸KEg!_zB|.5D)RTo.˗򪖹 g^Z'T0>uGJ8sg| ݡqVYN]ek Jϩ#}[4- #%t㹜;&j HQ%6E|Z+94>;7!Jv>rH';^'MA *~tuo5/_8GvF<(x3}-]$pV3<6Kt_/#!@F |R~1sD.ar |وLA>#()}ɱc"]R%v3SדE9r6pӗ&ޫ8ɀV:?D "9vkKiqSj\L)'.޸KC=42.]\,X74.ծx&Qg?fEٲ6uoƻޕxZP`}—D ]G5u]R68dChSw ۔uo*ڈ1^KЕz1nPiDiT=;{y9r-_b6>pqݛ#gG8']\zS-MySeh4 #7e_C|1.s]Ck&;~U[ {BNs}YOQ0jۗٙ.˗-s؟଴m|W+sVDH+HGT;yk6>yl].#ea<}q7>U Jfn tWhs8vw 3s/_{̦N{/ 1c_d[`o&QBW{wk+*:O;=m@-_pݮ+ʗy=%t>ϥ5=V"a涤;Kk=Y!.pӗǢo:D4y>#U0ƣb4Hݠ4gOIXw)M9qQ}|xo~&,=JivPBc<F%5|trI{#vd{(4[>Y 7QBc<ʱc"]R3dq ת{ĘB)'.޸/3ΏWEG~ͼD WFM߯nP/Hd=H٦e[zα>&NA5Z~90I ]Gʱ>&N:&d6lk}LSG-_x񉳔-3Ůgl=5q&kKbwy}:FDȉ7n2b]}{أֺDž# ]ڽ _v0;qng6C;̷vp_xre"WP+(ȷN1o[js8JH&M*~q4%rlęt8#\7m%p8ou+rݸ<2--_n-̕8p wezz]HuONQΙ+qCijy;rV:8/9c1ytAF O||49j(/JkP"u o~>0?38: !Jz>rJF~3m0,an3nœ1%[΢fڡ$Jr?r没nP:o)N]4rNqH)'.޸/sBaۧ/syYr—V}B/|4qp{aKеz1..G]u7;l<2Q-_⼳g#OG7$ΘI I|ZR-R!l>u|_nN>\73 uo+?0%PW~.6QB3 ur0j/N%ȓSʩw)2qVa]*j^N946V)x3'O8u^NqpQ-_3f8Q c"J<%'J?r\>Virx1# !*~t䁔WƔk_ihd )?8WP7JΧm)H|ʲKp~jz%tuyU4YL2LPIH.ےto$^per^`j$G.v}5; Q[u;ҴMy2-_3 fguIyʇWy˥SbpR ]. nPlKHS}|RkBʳ4̣ Γg]lUÅbN&7l9u%|?b0D 3w^^G\,8G:uGNӰMyw4x%/C_` [u \rT)n#7ed ur܅mk;/4e|98KQ0j`(IQ5ZT>ҎDb|y Յ~-s[mU-_mRS>/̫SBt8D9 6yuxLnґ#~+ar 7}]4G8ٞ'QB/prݠ8G ݬίetK-_m˓>8V3y衈1M7@s&{Tpz(cNrtIGe6Vlrئe}|aױ>+-`RmмD A69P}qR;;Oa@C|1gqq66Na&tue#G7O%p˗0c21 kD 718ڥfڑuoeƷh'O`UYS:sowhu[C*iu9޸/azBRdI1./Wy/x:388x\|N{}>'n͹|jei߯O^گ|vQBJPSBwگԺlS_nRwYD[{5+hcԢ./4AGK{Vux6IyG]}|k=Y毵Eo\NGb=Ⱥhr没.VK7٦{/Yg!- IT棉#g.j1#9ԏ>=ꮱg!۔R׽q69XEw!JxGM']ԈQ8G:>)Om}|` 1Z0ת;,w$]uuAJ5&nP#/nœ1[wEɘԮlO*р.G.NrpF;T#N;3N)uo+SrN@OXH/c}ʡA_V}aq<'%^ۡ\pl>%]̵T64%rdXpO\7E\7.6TVE)zdFQ7(yμ.\7{/M40oalß-V+ȑFi/nA{`崗˽H-_ggNXFO2D G\7 J4Hל/mʉ7b _x(D ]Gn׈nq)|vͱP`:ݑLN)Ǹ)܋kHc5Der[,{R'p[ h9{ב\6=N_;]\ U%Ber wt8ֶn[wޙ&rPg#g.JkJ4LI+gنš}/;6~!fOy_Gs~j(1pj=^Uwن 5n#b[I7t]`j(g.Fvzdz;2m#/\—t OZw3QB7cFz_(Kl7E2BnRZk)fҙt櫡l۵1uq"]#۔|aȡ3]޴ j(g.USG?ӻ3=cZ)'.޸ s'k?wG>rNt䫑lT,R7{j *~qEe`|9;;l}|eC]RKٞ.=JwgCT޸Kǚ97NNsSFYO.# *s (97NےRŃ[`dݯ8 O"t{X>lV:Ԟye/ےuoñskhYr|p R.[u19 @ےW˼q˗x=oc%M|4'CBP:/S͘k|b-9qA[0ǧYxvk%t{9s@PKोd=b/I!.p_&LkST_YR)Ϛ[0g̶a)8E50yz%t6Ɠ2͎ݚI3t3NQȣ<;.i~>l`QqZnG%JV=rHTcٿ߭s|[%}/Ucϖ`}!jV%tm9vL˽uTZ1nP#'R޸ jO1q0B+ +)ȱc"]R9n爃tqDu(MyF׽qfg,h@H\6%Ub]Dϧ9FO۔uospi`}5Ѝyu#]R^7J~wݢ[ئ<[L{8X -;cP}H1<o@bl)۔R׽q|sXgzh|,GCJ|bDŽFHG<,Tw?oVڦ<2q|Oc@ϣgx Ocˉ}'vL{(-Q(.mʉ /et1<$L.XəuyHAil)NKӣD9ڢlS2]-_pV1f9NQM_nPeEa/l}i\Խq_ 9 "|c %ts9vLKjq7n3GG*Q}ɱc"ݠs-]\%'%no{>= 9ė@&}sP7Q%钚gx3Z#iئu˜Ǘ tvy/{QNHԌ5IwPuXSmiˈx瘟'jl0DzsNHB*Muo:;&uomOߜM X.d@Z  Q[;&%u2;| G9m޸ ;?Xa`tCy?hHj$GSB*MEar]#_lKHq ;Q SU֋(YrTN++R=4lC.\}>,`i-|cW 1j%t39vL u49 SճanP񛧐 )t_N1,K@gmgJqfcDrH7(qwVd`mɉ7ns-9ñ8ްύ}ɱc"ݠtQAg,<@KAV]9}qVr\n׸T}qeIw`3MyUref7dz~ܭ9%K1'|_uXm޸ bgap 9g- ֓(11.}qkf/;Nݑ;lSH /kCsZ@ѐ;&dƕ5;V64[Uήzx؛Kеz1nP%E鍾[lu۔uoeD7BߎLWGH\r$ .] ]j]jo7n}99P'7QB *+ƶ.ztF5MU?p_x_r_%t>ƃu&zW.L$X/̐3uEEf~C/\GZ˗Zp˗1*|;-p&%t;9vLK utշT7SO9?pӗε>8g#!"j #C部Eئ<[dr8Ϻ:OQ޴CM'C7s֝5NYOqQ-_iknV և(ț+]ir(MNG/"Gݑ77lSH}|Ɩ';=|4]5K*n_Q.1m޸K{.UIlG77QBWsDŽ]B77%}WD#{/]vmq:ڞpj QǴ #tI-6xKd@Zn~9cI~^nPIQCNћtTw~Hئ{>0~g1#%t}9wLK~_:v|Nl}\Խq˗ɭBv XYC";(nMrj';Gi닙Q:bئ<[S?Jn_i_YK+sOد<v#u|y_~slX' р:䫑loMI;]TxB.\}/-9K|y F|)ӡ\n\u' ۔R׽qi%敇c{z{L B9vLa{Qw` ۔uo_1g*@  (Jʱc"]R})8H ϝuv+׽qCo~6ͱWpjy֓(y.XnPiGuvt})n:)'.޸ ;85GR-W#9+HTS85sHQwS ۔R׽qwr֎[@M+C1aˑF?O6GMw6] {}|aBsI~1nPI˽dz$*~v޸ˈ1j/C- iy7z%tB9wL{7yBDzCEec=Csdq:bj%JV=rP7n4G>Ci]cF)lk|Ye)0 kE>˗|5# uE_HXU mDpp˗ _!/}گ/ܾp%kEK u_n"g'xp--" (>1nP3?Qkئyӗ _xbXKe#G. T LJu_4~_,8F357QBW(ǎtIeb c9՝b'۔uo C,Nfi" (CrP҇c#,6 [|@%{/LV-L-Q<"CސˆRNmkxr J)#-_3ǗEROXoxcDŽR4*$]{;%_ 9qQ1ە#q[_Q(q?HC lC.\}/ -}LD PhѬQBg\K$Z7Gx]PLlSN\ԽqwI9T/ irPC>q5䫑lFt?u(9#.޸/~͑@M[iBޕujx&v쩱~h[r[ g8m_N mW>1.Qw?m%.޸ rs1q|- h@ 8;&%b^ZnP#.޸/ԩnYa٦{/C>8'itxG3dCɑF[4!}Z{0mɇR[༳V[i[j)ȑFAIbGݠغ\>պ\-_368 ֓(=x KWTAqhf''~Z˗Z/ٽ5h |C>PBg wPWTVޞc37&=DED#~/8n6`98}Бof֭Q}ɱc"]RgeplP8}#Dئ<9"tNu)yC\wCs}FM9qQ-_pyL4g$h@H\6%58~S.t\=bZ)'.޸ ;.#n{*^D (_Jסf82.vjU'$۔2?p~ͱoGn}:I8 }tV#n˶E1L?ߗb~I$Jlꊊ/S]Ht۔R׽q˗YXpl:ӑnw[n@> 䫑lKꊱZ!}bL)~/oƓN_f%tu9vLT9lĘvk*S J)#'.޸ rƌ68HY1T6G3u`DrHԈl'EJN *~r4kΤ'8d0f1%DRBi9)K*)KűqȈt6f`ݠ7GHk-_pb83Nl Fr䲑nPZ%'!NC;mʉ7nI%8vVctLX_#G.Vxҭ;%_غ\\ҽq˗ͺ(`E>PB1˗R!dr<[mv_P=$6EeZ%`o QB )ǎtks8,'UَlSH]-_p}Xgu3'QBcDf36@԰;=5|ٚyU9|nIϤ3k.ѠʔOZ ]ن\}|ɪ [n!9tn}:߯lKd/|n]⎠lC.\}/9cD}qw M]D ]G^4ڈ)ksR *~vDJ|aΘ.OpؚGت,SYYH%uN9Q9 $۔4>p_!pfWĎ<%J,sDŽ>ɢnK7e[r"[yg[S3Ko" (:9sKź8~ҭYwuKٮg>7n, _v cޣhYW#9^tNGk{޾*}֝>p_6π9~-b1.h`QwlSHS-_|!dz,oEеy1.7K䣋̪umi Ρ@p|-$ﳉ=ﳉ}ɱc"]R񭁋cK]Qww6uo{= =ۉ}c  (\6uN'6穹8Zu'٦<[༳}viC>PBg҆98 lnb+۔W`θ[-y tW<[i=z.X/`oƞr%u S|L~0ꎜar[Lk<&voNGҮ,р luNñ1u;nyse[@Zˉ7g^>(4k{(.q|(vϨn]jok9cz18 fl<`:LΆ|cñqtFŘ_)-_3X#5n';}O1>1.~F ,Kuk۔ )t_/g-Nqde2I~1.(ԍ]ZnP񛷐}/;DFqѨUD^3i&o:Ai/I7_RWلU˯^`QS4-C(/ǡ@} %TGz wz)q< w~x h[qT@oO؂GwTreCƫHy ;+8e9;=2׍Z;v'ӢlEf[NezsZN/du"2 d} ɰzl=GmC|2̻l2#JL|^?S̻]cO)U02cOau Na/Ow٪~*fV&E | gaqʼc '_2Oxs2F3>dXh;c@Ѥ2`o}|0cp2> dXߒ l k_%|0am'1>bwi232L1y Nw>LU0^}E{D {g~%0[1 l{}XÆ`1 2e>dd$g68y`(Օ>b +3ek}N02*10 s,,)99NWU0r,9̟ 07X 08~2W`}N5zf>e1akN6x-sgw}~9Z۟0^9|?`6{}*>s.cAgWa~i&[Ǵ 5wq3U2P1 #Se,1 6nFI2{;Yn#} _@?GIFDKO D{왊,& 饊h[xXxnH[˒)5K>hVEYh9rY,9ί^w}\y @|hnD/MeũK:ΊgD;FR)b/V3ҫ!r bm?@yŒ@_M@,@`sA\Xߴϱ~Tw7=ŒvoK4|GJ֍-/}mYTjb9TXUCjU2 g/!z^]vK/|Tfa|Du0-e 8׉B+0x,@ 9 b#ffXR@3뵜~vǐ(*z-@L63D`./ddb5* =>,@`|{]״^jfsA^;azaFE{.K*B? 3%H5$oղ zaF`%r~>X| oY@?ű{]=vaF4K|o5 _q% k^Y΀|^9fzK!' exK|!\kF^?/~ۅ(,D:ߌ%9Bz=UJD/UBS| O"&*DZQŒ?Sg?@F ?xҼ,Y@`2=xAi$o8~s0,o8_py 6*JN_p"38bxE3l|_p.38J8ox'k8MU*.{GcfS{w[ ||y^Dn<`ƒf sIY#># &A~9ʌ1Ojߏtp38}<fqDy7LS,SR̬|`_}fV`Χc5V? ce %"ZNkza_eLciٿVQ!0W/y=X 0W&dL,@`DLf_R &s݇k5_~,@`eϱt+`$eg+fUo2{y9Gw^=3zF`2w:"Vamӎƾgv;"pFna-B`2zD`2Z{DGt3_̕?;li2GJ$O@"0Wl @"0W#w*3"ƖV! pF\s9wW2:vd~wNrwJֵvJ6P4rXnsx5xkJ,C20&KHՋ ;: =Mw5 {W35(q]978 "3\fq!yߢC-p(^E=J]yuCádun:uáhx=nád}x{yx]{:P2<>< p(&@pg@`@0 G]C6a  l(&@6a l(l(&@pc@pg@0 G;_C0/  hf@0 l(&@pe@pc@0;JPgx>[!TnH!%7;"%{"m/"%RlݑH@T`T`<MH.vJJ+)(얔 엔 .@I>왔 요 f<@uDW$f<@s\]!Ɓ$ :*7K@@*Ɓd@2q `@2q `@2P8 41lH!ƁTI@tonK"ƁT-Ɓd@*Ɓd@2P8 q hbHR6$CI@nR6$R6i:K:K::K0k?@H+I:  mTd`<@H$aoI<& @h:وKT@@2pq `@2q x8 q bHR6$]@*Ɓ$`$!`@2pq (bH8 bH1lH^1$U&ƁT@@208 q 1$R6$E-ƁT#Ɓd@*Ɓdq `@28 t1lHL2d \l 6NJ8)8)Ca|8)x8)&Y8)hl [nL`Tqfw5'%'d 6NJ8)8)x8)Mn|8)bH8 41$]!ƁTI@q 8 q (bHn1lH1$R6$U@@*Ɓdq `@2081lH.1$E[#ƁTɀR*ƹ8y^lۋWsKq %RHtg<^X}4NjHq %RHlg<^XfG)@J8Vgc?ci2k3i<_?>88>2z/LxSg'g[ ^EPB1݅/@br0ecM endstream endobj 554 0 obj << /Alternate /DeviceRGB /N 3 /Length 2596 /Filter /FlateDecode >> stream xwTSϽ7PkhRH H.*1 J"6DTpDQ2(C"QDqpId߼y͛~kg}ֺLX Xňg` lpBF|،l *?Y"1P\8=W%Oɘ4M0J"Y2Vs,[|e92<se'9`2&ctI@o|N6(.sSdl-c(2-yH_/XZ.$&\SM07#1ؙYrfYym";8980m-m(]v^DW~ emi]P`/u}q|^R,g+\Kk)/C_|Rax8t1C^7nfzDp 柇u$/ED˦L L[B@ٹЖX!@~(* {d+} G͋љς}WL$cGD2QZ4 E@@A(q`1D `'u46ptc48.`R0) @Rt CXCP%CBH@Rf[(t CQhz#0 Zl`O828.p|O×X ?:0FBx$ !i@ڐH[EE1PL ⢖V6QP>U(j MFkt,:.FW8c1L&ӎ9ƌaX: rbl1 {{{;}#tp8_\8"Ey.,X%%Gщ1-9ҀKl.oo/O$&'=JvMޞxǥ{=Vs\x ‰N柜>ucKz=s/ol|ϝ?y ^d]ps~:;/;]7|WpQoH!ɻVsnYs}ҽ~4] =>=:`;cܱ'?e~!ańD#G&}'/?^xI֓?+\wx20;5\ӯ_etWf^Qs-mw3+?~O~ endstream endobj 558 0 obj << /Length 726 /Filter /FlateDecode >> stream xuTn0+( bi+hR=0- R}9Ju 93O,#}ڰpmnUqN4qhDrQF*AR*sGM_ljmh"~ g_tglkp{BDYȂJ.1.8sqQÐT(h5Ϡ2nQW yjiFtu?$ $1Q8d){l]x0Zxƣ3 GhL*ԘiO0#$9w PSvdt[n>rB"|Jf 3|BOm5-4Y*RԽdCxҭ&c)]寇8-T8I"]r=J"sw;L3} $t:ݶޠ+CFfn #*ݺ̽n`_!Y}9/+n?wBFW[t2:kb^< ӹoy4Md"ccQTtDhL%h .%8s=k`h, `EDMtd .4צ6SsjPdQJpX_S *an]Q!uDv{s2X7 TKm)*TkNA4UcO^INg=-c <>xۅ]7NpܰK3YF> /ExtGState << >>/ColorSpace << /sRGB 564 0 R >>>> /Length 6914 /Filter /FlateDecode >> stream xM&qW2YuAr+# d A E 4-ټ1H5fb=o+m}r^DZGJ?~ɍ:hu*_oM&om}?woǷ;ڹVvoq9w~0)7q=ݼ_Wm2kWU̲wY_Gefm{ٟpzT̯T=ca6WQ4 9N׮oݟ{(Cϭj^Uu]y^`S=_ӯl`^wivs]Zy`n)OWsJ|ޘ-k ïv4LF*{:6Ά7e\}U/^o{=fݔs>7[WO{Cm'+JdnYxw"S:YIpڮ-lMX/KY4⧰SOv[JQXIWWnmK?!{*K7ҫeVe#]M["Ӎj叾26ۗ.p m뱑F^[cel=:mg.ĹݣKqzJ_~x>xƹ+8Xsڰdz~_Fj=}ڧg/[snwǹwT gFTqǹ7—G1mxǫ]F{ϗ7„#  =㽯_W'?j;~yG+q߶a;~GyG6xTpp#e-'xoN v 9Y5?Ogg=ʎ9?k!V_ǙiVtFOމ>g3i-s^s'gdOSPGAG؎پ?9sC/ϑG8qӟ\xw@gc'Wv# Wg>C}zu`?g;z=ӘS>'+_8Bk%Bk;W|wxȌǁ$_%;ޏEvȏxqd%}s>r.W5msAuیWw#[㑟k?42=SoT>O$\#?dG~ܸq$\i9lOAǁPBzkiOvȏ?q⭑k=f=}2'?Vl=-zcK+ם/J>-aug>;ɏDz[ ~\mx?= vƋ+l|=Q6z01KqAB'J~=.VIqijgGk=߲U6z<ίGF,x]gdsg\?*}}y0]F#Յv}_v*y\}^\>:^}TBy赅|j4Z{G]ֿ:ϨgZ8/˾qa[2V?Urik G|] ib{G=荅| =/Q C z<_RUa]nuYo% ,9Ⱡs?*e 6뱢ǣ~"}ԇJ=cWx[רBjF}ύzƨ =V4xG;G8]e5vA||B/,ӿN簿ͧ_۷ >VP$*ķ480,*a TciCge _7ϸ?7}OI_O]Q[io߽w ^7u۾^M7kuqsɛ9c}ſ gqof$լ~ MfKXWd“吇EtMʗZQdzENVdz?E1hVlj\9|¢R(]=J@,$y#E raQ.A(YEL5R`XRWv,j5 v `Q!0휊'E-v"EdhgR–:흻dQ*Qzp[dQ*1MMݦ6Rɑ&,Jשâ{XJXe& ΃Mj`Qâ4c >)۩=75JO T-+j]T={R-oߣVxa=TdS{ED`Q*օEK}T…Ekت} aC>\4Xϰ(`W>N`Q;Ei<7l52 %xEɾmXO(%Ype3^X_(ٰX۲c؍J`Q*qZ`Q*ϰ(]gâj$e.dQ~__O :T+?G%w(=;e('XJs[`Q?,* ,* ذ(=& ‚`QbذTJ`Qb)XT`QseQ3^ECjq YvaQ ^Y=i9Oz<^ aQZyaQ_BKo =.1_(G{=^lqEYaSqwS}%XG:^aQ1Eykcwm46# %SE8XoEy#`Q>uuQ MSڃu3,)x.,=`QjXc{X,¢4`Oc??ɢjr<Â؟`/G1Rq݃Eia(,+ vz<#xXXz%ɢ~EcX,JaңM0 ¢tZ8,z9ؓ _gz%Zz<{O6z,,*d(ٌ =nK()R;OB`Y豖A&](] xXTwexX eE&>`Q9PW&ö=Ҳm¢d~(-#3,J$[d;_e[Ei M?;25YMaNEοE9ؔ۰ǺNqEi~΅EYB*y,JL%EYvm(,\Xdmǚc,o,6z܏-7Xe~؎ȿE-6zڊ.yaQa}(maQFҶ|(Xlm`aQy`Q`IŰ`QDzaKgH¢tr{z|oEEib}¢txEE?mv Ҷq?z,qOX}&E: _X=# UeU}["`QEWSϸ`Aqo, =ZXXX⻤m(]g=XT,e=¢fq~,iEi|1'x+g YO(?zrB{`}<,caQE:Eɮ&aS}RȺ*y|#<;񉔏cR@/ ¨&R@kMuM@_Oɱ3xj8 ٧ҽ6QSd R`JΓS)%3tQ `JTNq 0Fa/cPG0@c~STH۰)L`0ڷ B~Ge)]O X=4>0Eu,I=SSe{?`J)'LiiGP}U JZMGsP}̓|>iI?X#F*$}'Oc V2 Yߗ<x25SDbjcؐ\,;M~ _+4~tiFb6Y$9w4JT%G C)QIH/(^1xTǗФ4Ik%m!IZe%+5`r0Ija"|=R4n@G烏G xqbzvTNh:r4G$F4FB6 B3Ш3M#r6e򶲏o\i)VnR2>rHߎ+jwAE- R'Zlisp (PD-cԽ|n4t *HM@ԟoLS ob[ M=>m,|hnkHS𡴷ўQoʹ.,4~|H'=~;iƴISU!eVI/N;Ů;[NV.*-8qv|tv|Hw!]w‡fZ|HkVUϻE5rk|Hg4x'-Uv~: >l; J !]]u=i1|Hs-|H6FC?$g>$dC?R@rON>&hՃQ6C/-|Hy!W)ŸƷK(!f?/~ ^$Ci~;> 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 570 0 obj << /Length 678 /Filter /FlateDecode >> stream xuTn0 }W XZ|=t[ úUQb?JdP4(88qefވ2`iʃ>`\"Ag2_$I1Sݡap~Q~N^N(ޅ #1zВl8&,@?*݁ˉ4 ] 2!WTǾu-G=c1k=Sd3[qw}djjT,yh0jzjQR^4DR[Ob_yE x z@ْsj Mgn4Leǘ;FoOxaJG9yF) QqVVd+"Tٻ13e5Լz9.Whtוb6֡[9VxKQAeRRiKj5C+A~.4^7v@A4M@Yo{"/͐ ݳ]z 4 Sԇi͏K{;z Vn@uBqz;IOn:bvY#3 |9.wōj%~t0/LޠwnQ HuA\*4.)ST / p/|RNyfSzͅr眔_` endstream endobj 567 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (/tmp/RtmpnZmxNj/Rbuild6f0944457700/timeSeries/vignettes/timeSeriesPlot-palettesMultiplePlot.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 573 0 R /BBox [0 0 432 432] /Resources << /ProcSet [ /PDF /Text ] /Font << /F2 574 0 R>> /ExtGState << >>/ColorSpace << /sRGB 575 0 R >>>> /Length 15245 /Filter /FlateDecode >> stream xK%u)rZ\ Ȁ܍BB#a R-ǘo?<'"dvI]]Q<7o>|x7\__o~2>|rhc|x?O?~ͧquo~trǧ_,ŧ>Z?qS)Oypȗ}[7>TܦG*WT("j}Wj"+?TŎR'S0=|a'31,4o+o+vڽ|RZ#BfMY# @vHq#f#Znc}t =!+~mmzd.+m䨐{-د{nqnum.+c]Gp]?qwf>#S7;mԣNu(LBHnǛz4|ϯ%f߯'z<\Wf}t0Z׾{YLg{ U^ӡRW;}b:E GO]2cG%N|^Zl4^][RȇN6՟OfwzR/2]u~~f4H;*vPӰϿP_eC틞E~}gNv~<[} -DE hnv"ނH7h\oފ}}fv%YL -D{FLޖߐ#t|Z5Vkj{4oOgCWLqVNo k6 5X4[47SV/-h-}6xSVTZNlRaW5#y-dvF{DhCOYw>2Y;z%N3k@uS)̾p^GpS:;ᕡukKDS3ٔ`o{djhho!K.g-ߖ)&L9+ ^8.2ժ}jqu+E3B#K]}B9_bPo@Ȃ=SY.lVYI ' a={]z mhCΆM,VBά"Zl{q*v~38VW*g/*ꍔv !Z;ir VE{סQSΔeeX ׺az女+*Z1,49,MuzHqaKm 1Mr]޼y7E{xqxø77y~5=.nL*:PadgOh cDGg7n~.yduoJ`tP%%dZU ="]6DiѤXo۞׺>Ť5/{][׸?ή7&[XU,>қB#ht.꫏Qj(3ZKd`WZq}~F}6k+רtǨmKUvcYY(=YbϨ7Q&Gqr4V;u-#_1,%%U⽛]alL1ʌ|g3gv>)7H?g>I~Fq6Z>-v)@Pe{|(Sg Jy};i 7tB}nƑ1+j|;9Ǒ6YB>_`sfisj vֽًܟg/x~p}>ك3 ^ޡ~Nכlp>.|]MÍ,.L]˟Wp]1eFBYY:fM|_+9+eof59 35Y@yF}^`־9g^3:M#=4;QکfK̊ӜUݟٯz{Ya=fiv=֞45N 31ާ١7Cىr@ttZ>GG͊IL~=hp7=I1QQxM$ M'(|~71D)(< 3pYα [[Y Yx& Ϝ7熑}5hGdPܙl\a Xnh^tl><ݴr^ӵf"r֋cн]!}'Pt>#FjApt~<t{i#v9'6^(|+)U;PfPM;?V@ٝc$w oՀ;~VE@ n.Zcj oU(|i{2]u|\oN bx<Px,PbPxr;ۈƵ(k?PF o%2efx›iI2xV oxINK!=Lz@6G j^QxkƺNRHᣲMH}")߶Q )?PfP o)SxkHѝ1)/'PxkF%f)|°uQx{m?T oGmޚQxoF@q@7 o5(8SM;tG}N\U7e^)mR~!2=c t68@莘/gz$Gz艹@OT)Ӽy|{"w"}:+۝t"} (ț4m 7Oy .NڧW}p }p>:!鬄s6Z+\PN U L8TJ8_ ]cP9 { }p.hM7h&t+| @=pҷGI8V9'̈́Nuص}wn 6 }6;a_6Qulsjf+ZJHz6$6 pesqke+X6"6$$A+$69Ȗ'a@n}>$xm {亯{\ Q$6G"Q$쑄E=&tHH#Gh"IЖpnz$a V7nm#^۵i v¾i'Zoݟ/ڝ{v7kX{}w1M;_t-n+0 a@2ѭ>'h"\z7C8>{d1 ]n׋E¾ {d{ " {J}=oG(A¾oy|t>$zEح}!aߵZFz'"C-g}"y)"A=0I=$$`) %~sYq=J]pIoݓ+D݈-Ao"w"&aW^EAصRAAonka1?G]+"Ho DoUgJ® -xy@" nSkq< waFJ*a" ق4O'F+'v+[$ݿ?]; ?CSP;SP:a-[ԯysOR{J\b{"sOZa{jʃG{Ve{dR3_ ._/r#x _]r|nL9BE$UYMs? exd9 /_5Z db|Z# =i{<89bCܳM1Yw%3r' >ɓ+/_૲U+_VV<_ \s9|>w9t}?__h)_Kc_U__*_d!Ǘ,fO9 %`LNMo/>TV;.yRHX୥K&=}-n0(b>o!HE0Zn WӸA_{Ea2<` E60J LKdy(' )܇Q7-i`aqcc%mvMCNQQtd؇$nl0)֖\` |GV$7]aDj0E.0.0>znv3JFڄrC?BU \E$!"7}/˩ܞ8#N8x>PF0B4$U4e4Q<`i3HE9k]\y΢\\<0U<[Ԝ#E#)y$e5'X|e5q-ju!j5W-j>DI9X|pGԜkVeD͹wQs5ۈANH kߜy>EQEA̓܃D͓fH͹rQxRNjUQ55Wy$5ߩyએy(C5"7Py$5_ϓRD 7\dEí<*#TijCj6yȢ!U/Rse١<# 5Cj.Q@+jo}hr;Wr.w(è>ӝqgDiw+b-;-Wlqq\z AC]f-x䮣3X ݎ\s䮏q8ǵNQX.ceкs;r-7r/7",{ r׻ 0w}D#wk/s׻rə޺>r׫?殗~X[;LgrדܱrǙukνD]O˼Ƃ s rTn #w=)3w]~]ޛܩ.]rgObFy| w=R1w=QԄ뱓1w=rrG@r##]{ nu an η0; .* 924(|%bPY# sY9+z(|2)E wʉF _rAg7L _D _˓ƷO]cm:(|)|gzeQxР-i )|#. _ HᫌIkd o[@m&W·k MתUPxQww7;(|_|I;~D{`n>)|O _R Z0;̭;M;Θ[wf[5uq&0U07&ܼt +0f;LЪ aVswtY.tDw)rYt ϋ000?Äpx#ג0QntrtY0r;L\y& I0˳~QyP^BwF郢Nr3)a'wIƞ(=aע~A,r;LL;Lpf&.Ow(w\\X7EG$&rZ0QntIpnn޺ [77 oĠnj]ng\[7j oVET~@0{Y[|\. 3{7r~[7UPxvvcN(a;n ;ȍn\r+nQ[/(3-7wjn AAMg|6)TWx*)ŃB۰pIa"KRxb a&*w7 o5Nmއ}[X5;~#C0a|H o{npC{ oC(mV* +Nm8͍+i/(_m]ӳ)Aɝ0,{}އ]>p17w oo o1;LOoHoZs{+)v{[>V /G9`'/gG 5- ϗSdv$.`s)|̋O̻g3% / # ϟ3]^( /G Qx, ϵE᫲IHڲ(DJP׏#wyD^GgWe+hG(RD9+׬gQx9ȣ}9У}e—Ԙ:hz+^TXeEkѮ֘CQ~jqP_z$\ňo. ?_S.O{ys(hEG{57j *>lpRQOFJ o~pԱ<ڋc@Gң}2+_ wr- ۨ>ˁ- "Ov^G{* =ڃVѾ~@-~l2QfAq^M dGEU zӑG{ eZ.v<#vQdy(=ګAeݵ9У]%x?o}A6/£=ң=p#EУ=ӣ=Vyã( 4<ڣKNYhG{O(|fV(|/'9.m"j (D5+Za /% __R]QxƢV? ( _/—UFRF %QR;^d ,*Q )|] _7ǘeWF< 7.{OJ@\tz'ՖG{=r,vyWQ)y'o MP 9ʀw.)|S/)|g(|G<9\ph*(|_TlG~Q\_OQ7RxE$ Q<* =7pD~큿 LUy>hWO?Ϯӽe?O?s~}O`?ӿX3t{ׯ?fCo~'ֿ o>M}>~SSoŧ2dg9WyYTt+r |@` N'g$۞[g_Sf*ZŮb_"\Ůz׳y*v*vu׾ףaq:Q܏b.I p 03W1G/k>._|\NПG>._ hO#Ov3˫+00 O#fOW8+lG/>._ h͔G>._ hД{W pybH{KM g'+KOW@?+6U g:{M g'+Pπ ' OWBX_G?._\<< p hg@{<.rv K{I(#`+`?~y@a'&vW@: # +b#ЏGc ( GOwB g@}P_yo)7支Pm*G@sWV(pt;_|3R_y,G@<Y(c##`옅rY(_ hG@1 +?+`ki)c#혅0΀ {cNyPpb[0 Ɯ ))_ 7G@1 a3+J ` |3јCa3a3wB g1e6Su6Sjs?s#`옅PπslI{c ؆͔G@1 vB g1/y6Se6Su,G@;s#fW@;+`9` [|l0΀Wc^Be,qW@͔݇G@;ZZW@;+`옅rhY(_{K y}Ly}LyS<1l|35lӭNBYAzW8͐} !O z\_h!| !_ x mVi!v4搯} yc g1G <Y{9g_s>?ӎsD:~0"EPލR3xhv4G81W@;F |lE# F{#F ؆G@~W@1#+0?1-pH)7bG@zW@ޛA#+vK G@ߛA=i+π ܟܟ΀ 8FG@vW@A.+`#`u O@ܟ){٘3g}@a_:<><)?+pi)cDJ G@qs?dy}O g1G^sP?pH)_{K y}OycZ#R: )_ xG@އzW@<dFy}O gx b@^qSh!_{1a3+`Ƽ֣1<>|3`јCc6Sұ )x4搯mLyc y}O hg1N'Z{MWcގۥ0:1`ut*cUZ-491`rt,ctBCZ-Gg;#⳽yۉ|?†\E?#aK"\ۦ_~9 endstream endobj 455 0 obj << /Type /ObjStm /N 100 /First 874 /Length 1547 /Filter /FlateDecode >> stream xZnF+f/yyFƮ,I5`(a+D\Qe)ZΜs_rf(GV(ȉh $ႰQ g애8k~O"j9ELDb7BkGNX[%HLhD Y $K yvBe2"0=(ؔ'3F4lAhƒ1 KacV t͠! "lwPx 0 %&z¤'a(kxčHOpäI>4"| `Gi3tL)( cR@Ƴ7=F 2gG`iV_aҘǥ[ ?ex"Jzd"ab,J  ;,^$XFD6#W<(y"N:l3!&K lAxv!!Ef3(NE KfÇ(` ZF#E"!!tx,V"o >ZqF L#7eǙu%Y3j3~SgL&_1BZ Vm]yT6ztّTw˗ٹ|}rz~[nL|G=i4O닋j\j"!I^գD$/6m5.ZpAɤk%rVbXȶ*yUf$?+`0(jA%&D棦TreY ᰸2]հlF?,X(Ol5[x* _(&.3;1k yL w&M=pc uoe!- ݍ  B~|煮x}:ߎ}"$iҳ-.L@ x.7jLP.]opu ؙc d@ ]v*'hftZxqQtZZ{ѱ5Ex'~_r"Li{6՘G]nsstV]G}#wūy K_zr _VP[n' H"="!E╲^K8Plyߝ"1O;Q$.S$Bv@VR/vUȂEY0XM_[bwq@rSmvi@ls0Z:RXT7 e§=%Kz6|ᛈ96iWU3;C9,/%:8FR>p>yBi'jZ⡶{֏{&<4z_94h{k_z`ۚ}|c5;,{uOtYsѣEK w %Z>*sJD=gi阜^V5S[dSt3tLnl&q\sFWmp۔Ǒ&_oRz]-:tݭ{|5|χ/x;C/`ky>OBTw]1N> 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 581 0 obj << /Length 479 /Filter /FlateDecode >> stream xڝr0E 3,DPwkwqUV.d,SMeH&018]1wϻһ`my^pJGA Gw7c}~Ňp‡,h6b?CA%A8qJ+fioeB+ͦii}`"HLϔ-c AEWɢp]\V^$sBLݦbٚ~uŇ&y ts+LޚZuˆSi Zi_4\E'C.MAT湄V%Z9O (daw؅~kUS:?c`X|ϑa@9 h_WGmHsW]yҪGյw]Wl73wtK ~nqS&)]B>7J5Mn,RW/ҞMrys4A> stream xuTn0+( bK HK=4=(bt }108||f8;׀T AQ)(D`?@'MNKSH7)Qw=Q|J9#oR!Y)ܳ]sZmS q@硙^' j P Flkr؍Ygm,97͊Xrnd*(B%pAH8_:+dFӏuפ p{;,nV0Tf_"5۹A`&`*;0ضʹ ^ε;Y% auSݤ]> /ExtGState << >>/ColorSpace << /sRGB 592 0 R >>>> /Length 9897 /Filter /FlateDecode >> stream xM&q+j9\2#3lC(X d -ޮ?o[ϗmf__68/~r׷o1s×yZߪdS*s# ~;ao}@mr ߎyc)Vo8(nrn3u;'JXʠdǯU8JSbz|w.F{ qI4݇Ͱ,]ڋ_7DycBA^f.iG<_cc8X nw6fb:8-T?ʲsY<;/{gi5^9i?g̵VSf7ߥt{ ,oQ˥{~\̸66' 9igҝa{1떮vgzFMmɣ\LFֿ73FîJ#~0GO5Rd}1 4cJ;er34hG3O]xIxpԈX 5N?qIq{uܾKuҤg,mٸ ,pgA0-CMz_ԟqqDԳ<-׹nAg-׹[q6GW4aӥ?f>^=n~yAXؑ| 1_x_w-~t3OmeWݙckwm3Xyԝ1bm㩱n;_ЍkϷZzk)/Ǹ?۟Zs㧲+bqmFL}p?ug+҈Z9>?ohVkԙ 6Z m|mi9=_ԣ9Ǐ=*j+~G+/`<43~vS^a+6||y\OS=w诩w=xZm<}z&FeMce[=QʗԋԌԋEATbu%|XJ?];fp)~n:Qodz/n joݟSB6[~zPfGkS}|_CTzՃkS}YAP|w]|<5wjF|9\yy?:|<Â3T>QX֮xgx]^?(Ӫa>B$R(?Y/=?yo1n| }Tig}x%v`zmV/"mAX3hǼ;Y>E=Y\i?3 v/1 g+fyf>FFgpbQx|TA#~V(}xO6*n+4󱿿x{AQ9hQg0=sٳngs{Gy|o~r5Utq$ks>j<ڋnӞ6}t>^O\`Z>V0c~Z5? }c%\U-T7HLWo`ϧVЍ}f7z/cg؋x}%?bQK3b7.[ m} V>q߹?nxǞ5V>+n1t AyZxkǧgS>|[c>gj׆'|'Cg>^s>c|x;~g>3/a|w|a;Vx|e`>1N/|ƣ0{LyD}ktѾmpj"!}`8ẙnePt9u?n?_纕%MF gfEfB,y, ptmljOyHjɇmm·!F%L4)=1䀹sB|̐F!9tCk!9k+ȇ1em0f]αV{ 'aȇmvےupNq Sݔy>|A>p͢۶vel·o8 }ɇm6a9@ÐEZJ>ؕup'i%&0N90uNgOteh}03Ň1{})u[|NN|,\|btUx7||#O#f %M:x|zȇq|Saha!3oxoOH>l |/?΃Q8/oǓCx&=a`4a+ xk C_䳖py^ ȇq<04yy]l<>9?ɇh'_6}otbt F{w^쏥}V|x%I)> LD> x.z9Oɇw.T>|/.>%%o&.MS|48$/&.u><F>E|xԕނ|N>|d(Wҍ|>Mw(7/a_ć-3n;e>4aŇ6v'2zYjL|NB>=o؞#_||L%>k0*-n+>G:?V>w9->΋ϗ|||

>*k>M||p|q?;xa||؞v}sc=ag>F>zaO[tlR_ǧ|Wg|x]]|]'p |)aS0O>}21K|?ȃVŠ||ÀC>\$ưcXzȇ1Lɇ1,ɇõzhnl۰aм>a #ga [z]|Â||F>l0$|l?Ň=y=pe'O>[%>y1gjua [/ae[|^AKֻ4a>&?f} ~f+C/[|[|ڹ?ǧæ0O^B> MG>\>-[2zxbCI>ѬLjg>F;|<0in?V2smae,ag |->4KB>4{73g;zC|"NZ#|<_[ɇ-ͻQSf>3z ||3a'0׋|5 Pcg>I>ľoK>vcal%~Wj[p,#1|,1ȇ'? 09e>~]cOGÈVŇD>C>\$Fr<|ƥ%=0Ώ|?vN>\O'0%F;|2_v|b`*>x作x4q64}bj1>,#.݃5[h4%#Ӧ<2x! uZd(mmaTTkL:'cX^q(q2B$dv87{;ACqvŢ Ļ,vS4d -(Fq;qr/.Nb?y6q2K; 'cPsc(q2\@ %N~Ο8x[8ĕ*΀׉gwG &N\BlcqIq'~1'=撞?_&N'Rx#N~8M p0W '#e0Yr}4OC"0|84,m^)y>qr)N/C8?WtcC/pr?©k| 'yG'kr;N8yE\Lq2ƻq>W8y}8Z/3)i"sH 6x md] AΙXW8زoZ-^ҧM3S"8P(궸<+v=ږvx ZgEf#b\ 1p0^|dbmֆ?ǵ kM-&c?%$FI|"^_ & ^QG>C?!8<,lSa/\E2 36.gk)¾QLk#!ah"|a_82`S-e$ wKƶĺ__oACBq@po"k8b[ċa0Ei.t"o kX[a߮U{kZC/!WN$'ձ^ N@"C/&6ziun#y_ce~mvfA)ɔxGO-|ŗxZ,;CC",#;W˛ؖz$ ŋ`֝WmeJ4X% Յ&!cVLL I[~.I/NIHuWY'2TT*JQ]E ?)nVf,2u6)3. jb*S,;w(+Wa,S^Duuֿ=Xv+XR]IIuU [+wrzU濶Eu\"~j-Br*.fS\ǩUmФe=.&I1X%!nU*eBTO*2T-,%P]r:ަgz 9To#P]h?.43.Nqǩ&Յfi Ա-gb .y4lϬG[ۿb%P]_C#յjN`U1W=Z?_sZ.4>eUSnR]_Ny_k{߯Iuv^+_C#{(9hOZuE_P72ol:q |Sf<&㼙*r8KF1<K&bW 28\_9dD\$W[oBg@ϟBB!a^R^ѬoW3Uhm5S1*4[XTrj Rsc3ThfoJc#|h5Sf L{=]7j ͖V3UhL;6-Mf?n.c̆rRHFCO# Je6-X]A2j l# !c@ 1$N# -d6% =(h)$a0F2jQp% 1$J# w l9J2ZQSI>[e6q %(Pcr !\Fe4\1`\f(0^q2Z 90b̆v%CYph(1Ğr.20.d/br w 9h)`$!d4\fɐs-  5d4)`$_q2rRHfC h1Ğq%x金BN2F2j l9J2$L!' v v v 1G-i_CLhHl9|-4.r$!.!.!.!exkȝv W*]fCQk]Tx̆rѐ oѐ oѐ osZxc` 9hHhHl9z-m bEW2ܝ oѐ oѐ osZxrѐ o~-md^rԕe4&.!(h8SXe4&.!-5q =(l9J2bp&.!-5q 1GIFÑrd4*.!-5q ihh)GIfCQѐ e6% 5(l!^sZxZx냊Zx hxQ--Vq v =]s=]rXEvYO*~p%6w >N~:ٌ/ڟ$>>ji洯Oǯ=߾^~Oy<磽\ͳF_}Ѷ}pVq>aқÏ>+]k8~> ?|[_x~ ,\om>۾rs_xOnö?lA=_7hI?w`q9aMz>*(8Wrk̗& 'Wj~B??Çtr|N+}S{yN1Wד:M^}w~T/gɿut|N;9>|b'Vgv|/_0? 3ۿWr|3f9|_ endstream endobj 594 0 obj << /Alternate /DeviceRGB /N 3 /Length 2596 /Filter /FlateDecode >> stream xwTSϽ7PkhRH H.*1 J"6DTpDQ2(C"QDqpId߼y͛~kg}ֺLX Xňg` lpBF|،l *?Y"1P\8=W%Oɘ4M0J"Y2Vs,[|e92<se'9`2&ctI@o|N6(.sSdl-c(2-yH_/XZ.$&\SM07#1ؙYrfYym";8980m-m(]v^DW~ emi]P`/u}q|^R,g+\Kk)/C_|Rax8t1C^7nfzDp 柇u$/ED˦L L[B@ٹЖX!@~(* {d+} G͋љς}WL$cGD2QZ4 E@@A(q`1D `'u46ptc48.`R0) @Rt CXCP%CBH@Rf[(t CQhz#0 Zl`O828.p|O×X ?:0FBx$ !i@ڐH[EE1PL ⢖V6QP>U(j MFkt,:.FW8c1L&ӎ9ƌaX: rbl1 {{{;}#tp8_\8"Ey.,X%%Gщ1-9ҀKl.oo/O$&'=JvMޞxǥ{=Vs\x ‰N柜>ucKz=s/ol|ϝ?y ^d]ps~:;/;]7|WpQoH!ɻVsnYs}ҽ~4] =>=:`;cܱ'?e~!ańD#G&}'/?^xI֓?+\wx20;5\ӯ_etWf^Qs-mw3+?~O~ endstream endobj 598 0 obj << /Length 557 /Filter /FlateDecode >> stream xڅSM0+\HX)=TmVmH=t{`k|l_1٤ڪB3~of̃G660E48$Jx1/åڟUw08gU~rWi3ܔKJQ "z4`5gb<P3hyG?0K$~3o3bl#@TTU h0L5sI`eՅs}U9 ğL텄$7~=hi[X6bf6{ӄe7zp,!XmWj lͩ܊F>nWER ]#NHQz=3 ^МXX.ؚiy\HW3o,t),(9w0sy8 (>Pk OlǺ͹Ơ8lB,΅x1P Tʸ(O|3Ksp E˦6r%%_mF jRMi?"J:Iu;G'zk"7׊$#KD!Y~ g endstream endobj 595 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (/tmp/RtmpnZmxNj/Rbuild6f0944457700/timeSeries/vignettes/timeSeriesPlot-lwdMultiplePlot.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 601 0 R /BBox [0 0 432 432] /Resources << /ProcSet [ /PDF /Text ] /Font << /F2 602 0 R>> /ExtGState << >>/ColorSpace << /sRGB 603 0 R >>>> /Length 9898 /Filter /FlateDecode >> stream xM7qϧh&VFX83c4Jl! SܙXgx.Vc)o~/VvyTrm/?l4>ޮ?o[w_[i۷l/./wyv[qe^)* <cN[m~keۧw~Cc^kʶێ=ʱL9p]YJ;ev|:3o;{^vJ8s߮i>+~/o49/`3L=;oE9vփS9]r6pݱ)k1*~9;ePZlGeǞ`o:ONU>-6=8ؘga6%:ǖt:55c_e?yKl bd{3-H]4@9xR+N ]-R Ӈs˺cO?n?h6Ji>u;'JXϽʠdׯU8JSbz~w.F{ qI4݇Ͱ,9ԭn2c>?\`3X2G`-H߽K(XV@wO%]s,x8We|̳gl?fZ+'37T;דJ{ja绔n2jpO=w>f{u1>L3|/f? [ީ_S[(/;ԋaW?s̷ko)̾U1Qf2]g`Mz4S𣙃.v$_ԈX 5N?qIxu~~KuҤg,mٸ ,rgA0-CMz_ԟq8qDԳ-ynEg-yZ]q6GW6aӥ?f>^=n|~EXؑ| 1z^x_w-~t3OmeWݙkkwm3Xyԝ5bm㩱n;_ЍkZR?_h5H-|:??;#/OeW n7J㧩W?|r<-}0~?k3a2h%(Ga>>-~0~`>|Q?8Rw09|\ЃxOc@+WFmǧ{_S3Ocz*/?|H#xfU/փTMFϸt z1ϟmD*' ԋԌOHgQК8pٟ^cT4%s0åYtެg7_zՃkS}YAP||<5wjF>|9^\<:=xgl>QX֮xgx]&KH\iUg0T6O-~Kx>`}l?,CUYcs>e^{1NSbv_"n4c>֝~,C"znߠ?V(m>u|<=ohOGe>iomƫM<3cs}g|~~|\HeϺQ3-a]h-crTt89ZZ"]6>`G3lן|DmskKFjX[>zh|c%J[oo` VЍu1WtaK1~.c_/b%Y疸B~C`[ho]CZ8;|\Gz||4c_na=3or=zoMTlUؘxkWyؙ}C~+?tgҙ1wc_o9:zg}}Q{c1W<gz1Q ca g<8 y'TԳq* Ik1BˇT A[!%9ʔTd^e R2>T䌖2 Q2V#BUHXv9G ZI*V+Hqf[#5qK*¥;)mby>T6o ~6*\,p*lkvͩLͩ0Ta/?Tؖq!Rag\T#6&h=*SY GxVX & c5JZt^AWvv c:STfYN͢LmQa9QbpQa,NMSR %@@*vR-RaTpTT;6}l CzSC*듚 Cʐ ~PDym?#0oRu?Eթ/PJ@{,* r:FVv6,!'&",HKz€!hh5rWL!$.xwƐJBxRZRPT~307HI!vh'$ܤ7 b C3Ho_]T'He-B~Iqw z/RahR>Ra?RfK8p=x}RKpsXz N1IO*\AHum ߲-*lӵ T)K?Y0J*ۛRTpT0,*\Js*  *\<ߩ}40!^]TK*K* HM*\pi\p* IJL*\TxTxŋ+2+s0T:Ra_擡|\5~K7+R{Ra0/o(7ߡ|Hq>R]8hZuNJ|<+FAHvcmTRw1Qat; z [ۢ"=zߊ x^T砾::/ecR,Q]NDѿTWxe!v_Q}5"ױ=TxWz Pa<)mQa~/x~IEI-IeHA)VDII-*+K+wQC)+oH]w>mQaII}lTq|LG*0Gu[TaBJO*vR)Ra˗N-_K󿔏JTR>%V>}qU$$7 C/"*|x IWx8Uf>0ۢwa )0qWQa c z?I1l{H1{H1LHI1,HIµzhEl ۰MU=**a]}FϤ&jDm0)7004TOm'aHkn xRzR:NT׷KTSbԤ_6˶p=|r6-*li| *MjVIR&U 40|O/EMmQaTT-* }R[>!%e>>4xbCI*ߣ|vx=Pa<3PaK<~!e>ܬۢHˤXs[TiTTi&ef>=EvS0E*GxN[HI-ͻQ f>3z TԝTR3RaFk!Qah KETi[Tb0u>chR^[@ TTǷvM W%#*'0w ~ Pkg>I*ľo 9%F;10g ?~Ra+5zNTbԘxhRaTlzݜ2O.1rˆ#Paw+ۢhx"x!J #~9IQfBs=XT;TGߟ|L |(23.O*8?0Tq;u' T%F;T2_v}Rb`**x\x4q6|bj1*, SH#.=+F![h2%#ۦ<\2x.! e7X [{֟}0Gm?`F|~QgwRuϧ>u^#u^L#u~,BGX$ cI:Rǒ(t˒)tΏ%QHKБ:?D#u~,BG,BGX$ cI:Rǒ(t_5kzbzڔySSodN!<WJDێCdŤefetq{į#4rZ Y4g-q_\!oenm֒)Blj[(DϷ&v^>@OE oQ Y?k>!vnO4a&t̙5#箩:s pF5Ef9mXN6ei,V5clIsi eqoGa 2/# "f fn~_nӈ"|s zm=!#Y|C`g+6&{ʸgч%Y2pɬNF@lc ̦o &gdXgEι$|36-[V"yeBd< 2%!2?%DSc / "[lJ"#|-*هkB uve[9hBЧ؄h/"8z(AuO秡sS!24BdSfoA:BdR$T'$ݡ!24sS!KBd\ϻOܴ@9hy472!2/!r!k[7B'/߄ s?O$^)B꣹P==#2VkOĈvĈ"E[Adhzȫ?D?58ty "Gm#*| Ʒ rǏ 4!F9j돝o ȻCAdOKa8Dvݡ8+temBDyT}G<4:Cx8=FU>)ٯd{H6x mqc] AԸr0Wزo-^gMQŸP(h+va=bٖvAx![ZwERa|@Nܵ,L<)1ɂլmv?׵ |kHm cc?%FI{^_ %^QG* =dCCHx^4^pھ$h_r|K_Ƽ#E{tDžX1mH9Sf[aqLi|]SF%%R_e 0v\aɈ\|\mWe<P} $DQ]]f.Umf6]TLgĄflIc5Sf!*4|y5Sfl i5S=ͤ?,G:9j 8*5{DJ*4[f[T*5wl4B C8H=$Y,]T9Th>b8H3Tj=6|rW3Uhc0IA*5p Ͷ~fB8oJ!Bs R9|"LRpJ!BsE*4[Rs&Y@]FC2Bq GL1.Q2.^.bq =&pɐLt$(q !鸌ӎh8b+Flh{2 c_l4~h)$a ĕ\FCe4rp̆0pŔ2BRr w 9h)`$ă֓!g'!eBN2j h8RHFÙrd6% W 9hh)`$̆$a%   Bv Fv Jv 1Gc8_CLhHղl9|-EkɬrW]FC]FC]fCQkx 9,a\@ c$d42 =l% ax DA2l[c̆v%Cpc 2ƕ e4X?{ [2~ A2Xc f{$dhZI!' G l# 3qs Oe6ĐF2z h0T(np~PSHfC he4_| CN20RHfCQSBN2FI# 1`$% GQCN20p̆$% =c-<%\fCPbr 5(Be41`\Fe6 wQ.Ős #lhW2䀱?&.! %(Be41`\Fe6 WQ.N!' =d6Āsl#rV$#d6#%Θ\FÕBN2Z l# =(0d/0RIQRHFCM# 1GIFÑrd4)$!.!.!.!-mkȝv v 1G7u޶Y.d4e4e4e6u޶ /C{ 3.Jl9z- oCN2R2R2R2b^ ol!' v v 1G]mA p޶)JS2R2R2b_ oA2R2bܯmx-~x-+?Ċkv v v 1GIFC*]fC ZxccgQ𶭞Đ ol+  -d4»+G.ǻ{{+G.ǻ{rѐV]fCXt ie4qe6LѐV]FCZv5 .!@P"dq ie6;%Ҋh"dq 2Ҋl=%F,.}&.!x̆0.!x3BBe4]#.!q qd4Y\FC{2j?2b-$T d.p@mi'hH{I\fؓa\2~p=%.!DۿCyQk:ѐve6% wQѐe6Ā9^h2HfCQѐ6e4&.!(hRYe4&.!D[xQc /9JU\FCj2Vsd4)GIFCڬ2Vѐrd6% i`Vѐ̆$H9J2fѐe4$!(hHU\CK[M\FCj2brd6ĐkUcx-cx-Acx-E4䨖6Tx ywݬ;û»»+{.»»+{ڬ2Ҋl.!x \FCZv ie4o\FCڬ2Ҋl%%Ҋ/g|{?8O;|F?lO~?]flߧ%ɧχ'A?yy>9Ӿ̷_o^?,eY;wu߯>n-pVqOa7}t,vp w}_&o oK`wsރhaۏ|{gn|/g<hC4 Kk*aMz@/(O7*ט& 2; ~?~G'LJ/-W,={gNa6:߇K|W_/h+V񶎎_:9>|a'LJoyY:;;$001o|,7>c1χ-$ endstream endobj 605 0 obj << /Alternate /DeviceRGB /N 3 /Length 2596 /Filter /FlateDecode >> stream xwTSϽ7PkhRH H.*1 J"6DTpDQ2(C"QDqpId߼y͛~kg}ֺLX Xňg` lpBF|،l *?Y"1P\8=W%Oɘ4M0J"Y2Vs,[|e92<se'9`2&ctI@o|N6(.sSdl-c(2-yH_/XZ.$&\SM07#1ؙYrfYym";8980m-m(]v^DW~ emi]P`/u}q|^R,g+\Kk)/C_|Rax8t1C^7nfzDp 柇u$/ED˦L L[B@ٹЖX!@~(* {d+} G͋љς}WL$cGD2QZ4 E@@A(q`1D `'u46ptc48.`R0) @Rt CXCP%CBH@Rf[(t CQhz#0 Zl`O828.p|O×X ?:0FBx$ !i@ڐH[EE1PL ⢖V6QP>U(j MFkt,:.FW8c1L&ӎ9ƌaX: rbl1 {{{;}#tp8_\8"Ey.,X%%Gщ1-9ҀKl.oo/O$&'=JvMޞxǥ{=Vs\x ‰N柜>ucKz=s/ol|ϝ?y ^d]ps~:;/;]7|WpQoH!ɻVsnYs}ҽ~4] =>=:`;cܱ'?e~!ańD#G&}'/?^xI֓?+\wx20;5\ӯ_etWf^Qs-mw3+?~O~ endstream endobj 608 0 obj << /Length 319 /Filter /FlateDecode >> stream xmQ=o +P`ХԩRؑ2TU}i+eq{0 ,wbqNR= aJ)zÊjRp ߷uT؇^'"o pz^{K=)3TCI"F>M΄G :DadhdpjYk[wX{h2;%dϗj֯S~)+csa^I BJ&L88RHO}?6.7X}Iw W”prX^I$95B&#iJ+*!H9S endstream endobj 614 0 obj << /Length 700 /Filter /FlateDecode >> stream xڅTߏ0 ~_S+Y&C @7tV]J1_;.۟adOy`~}U.Yi$;…9$c) | " >0ymv9KO6Nzt!X3oHE"lйuFME\IZu~m60 s`> /ExtGState << >>/ColorSpace << /sRGB 619 0 R >>>> /Length 34372 /Filter /FlateDecode >> stream x|%?$裡'(~zv/0j` x;tΗ_T(O_wjfگY~_ۯO)_ˣ~ȿlǯ_3WN~(4)7df/; S* ; _Ne %?^Q߫>ϟ6 x5rB׺ +.)BC šgv7W/~(*pWw~YaBG6s^Jo= {Iޠ=]^KE婺T~%7$&nÿ?2nWҞNw|];dlͿ'q JXr('J7Jx& M;]olQ3ns#;{D hdLV`Ӟ.mOVr^ 'pam_0Onbr嚨BɃ&66lwW~&ÿ06?2;ӝd0I%(a7lY6>o?[O`9ŏчY$[ 4M@>տ&~BwgGyY6˞4WR;6/{Cx[7 6wӿ,yMÿ$ln~,޻=?2ZsYKdkk>%BK$EVJv~jyMzTPvV+}r /Ux: i.0@Nc]讗5}sەf[mHv&iy^$)?/SGpSPֿQD+ ;[Ͳ- X0?2h_e%&PFWhfwCKCG~aNl.Azy=DgГdaNb2|6:w.!K+da`6?2nl= OÃcۭ B5s= S˽jso=Amgg(f3a@6waBBEC_^!ihsIx,[5 %K /tS*r >ݟBC)=+O ݻa^(gD$ҟRaR _N`@\IyCx(+o4B '6>] _Pv>@yR/lp U+' 3(ȩaG^Ts)ERvB|Ю>n?p(>C99BPMCQWaV^cT.׋\I|X]R;i@Md54YcGF*nt}PON/!&%7J؅Г.q'r`S'W_p]>> m[mPv!ԩ?"ͰVCJ6N!6aLU[ſ5ȌW/M6FH]?p}^顩b́$Wm9 vwz]bեۛͺ0;&lwH^^񆾪XBIu8yԅS?uf]5{Hb.mCKh,vZS7/ O}wN 5Mj+CIصtؚ-UKqd2(&SXsE]!f|pm>}N|hK}ՅeN#}>uAݬ?5kxy>mH]BSƱm>](x*㋷ҽc {eӛᣱ6Ӵ!kjz:Ю[=Ts2鋷2V5a=pݐfMhħK)2c;|Cߐ9'޿x̭Y$ZCQn|ۖR?uc;qaMuYԵ 5%I>>Fn[JU Mm#﮽(qo/cb]:uue"ǤmH_7x'mG$]Ӂ(;[u2v[J{kvn}}n}}MEx||%{"[IX]e߶|_>o֥d n4B\o4%v()S cF tN( 1JPفe_{9?+$v-kj:߃|^T6Uoեxմ_KkjDWs|[JMƾz.MQ6`oեz0~jls6xq x- I6xl+ƪ>uE]~;{[*xĮ܂햢桩"|SsMvՊGtM!0#1"14>헭O*(1v\7x`QVW7݀g6$GcwUeN^i|>u?'?2/!E]Bú̋+}_uѳ%fy%2$]7΍؆h8"-z*x㋷R|+ /rIv!WWmHZ<ePwA8yV]|azH-$/w޵ې%MàQTN!Eɋ7oեy1?A%$(6<96]|lEۛҽ:ui& qq.KuM؆O:4eXAeN^=O]{F]&Kl_Ͷ)q IU-fc0oH_UYh9'WH^J;] )ޚzl;cF'Zx.pdXHW+z,d$Zې4C88w`{>ulSkerq7ƚǺ}D7?en;]M؇+ێK Eă)loުVq4E+Ҝ Ra+8hlF-[8YeN}>u V^zHb.&R⭺=9k0[ܶՄ']j|ېʊnrdl ]b>n>uaRԅG/zHb xچ'i*,zΓ&^ ۛR'o_hVMp!]<h-l7oՅ^9^`<ϖhUxU^چWil]MOyx}„G]·90{1 8riKgBa Mwq&tt/ުЁB+ƚ6i6uB6X˅mHWM֛fN1TăW_UӅ!9{LVG4uD+m)S햴r/6aCSĐybq/ާ." 5YmenC1,~cT$:x%e-  R$ i'AAԡH-&ZzA2u6}rζV1+GٙG?]UvnG^W@ ?<R ;1(ܩ:Lv.Dh=쐓C^#a$*zrJ Zi;5@dvJ ۏػ_Tٞ. {jO-j [YBlM8zk[WaPW6 .MZDg }1pEM`L 87<^y+L'WKd z[IGbn#x:3 AO u2Oz/ =¾ c$e6(ӑkW=(ٸ͕xntݟ+[#F7GI-Mv*H{ Ca]@N~Q(. Cv5)k3 .G{ X6~9 ˅Z 4IjM(J ^{,ؔU=IP,Ã-Ͻ;j%h'A LyL;ֈ\dDvWO2{)<}x(ߓrAA#;>a !ʍ:=Cz]1\ J N]\a'SWvȩ!qCe>>VwPRQ3/1BRNvx3Z"`eZs]\ XCa#Ɂ6v@8sA᫡uabWY&Q㓫OX{)\۶@B}bcNtsᬱ–ri+Zcv2.؅,.P2m6@Qv.܄T!E-&7,3P롿]F}y1:&:]re,,ؔUj#sp۔$Az Iώ"հ`z=k,`ÚWҟ uiu% }Yf^v> ϓE#~QV#C+NBЗ"հ#Az2M\EUtf({Dʃt&^L QNB>M%h %5GP&$lhwq}Z]IEml$018"Qv.X+A5Ǫ4 .]1BvmPTo=–u@NB;D^]ӑ.3UòEnXj O_KNb#H z=,3:zodT(E(l?v"s%ʁz^XI.hwgݰLb'WG-=AL[KvAڍvB/SoY$lhwq%IPG Nv/hBvD A;'H> s*Hmjۣ+qZ5P佒 +Cax[FcP,*ȏf,$\(d ꅎv kVi:cAe]\E)5b9 N ^Pe[⑝ dBQvMLuF&)롿ev u[HdoDPqB=/\e(j!z]ʰ2M͟\E YG _8~W+EB*|? +; S4Q@;f֟i7Um:?ʸP롿ǻ/o7`cNtnw_Îo{}/*޴zdS|"˗ !wP'NCecy#XevWG3Q JVn$ӊ#䰓<(-dH2u6 v ?Nms!z8)R;s֗e]\EֈD*E[t PNl ݉C/0b'#=uN ɕV [ܞkǠ(Zf^; ل@/]p=kBDk!UMH6.rAںY΅ӕPL'WGZOmZ d;IPMGzΓeZz]\E0@[ƬԚFߕq_}PNNW,?]vWh]p=7q"X>c[?Cv"9'MbsoXJBQwZ ~Y((/ -P z= %,32zok^4roFM7yv}/T}qoK6r!YA}5vHBd瑬z]Y&QgCOe]isq}{[ ( j..N"3@M\K=/Iiō&A!ۓ^`ڑzM:2fp} CΪe@! A{,.]+|v Hgeu6>RYc~(HU.D ⴥ(!=iw/pnmU{HAӾ?ӽO[A+ c}xVc'!+zY=[z:WRFƊ: "^qcA؟CKnG5LliQPgn Nv_ ߲C.@]p=ax|9 oԷ`'!Ga IɹNz 6>Xף. ^P6Pv.d5GKek5kBeXzo]RR  `S N]T#%7Zt(Ie=]\E"w_ Xob'S%xAtЕNBK)#ϣ2MN\E0b(% >$~PK+R ;DkUbP:]\}sT] D =C%Pi@"LQI5r*LOt1QUNA8%$ tnWpq$*6e|rŀ+:јfd}P(;"(;k#uz VHa?WN'$Ä&ĈC/IP#Tsty h1+Ym}Wnv)Sʠq }Ɵ̰^̐TJM\Eu΀(Ʉ}sq C/I_aH,iKe\y4Ek(5i-z4bh@w4P+z=+ ,Shs~}ӗbo߾O|}y&WqO]Qr$y:&2u6~߬R 2 e Y8At̰s!Sɷ :c2.7kjGe lGƢ=6Ww?urx*3P#TP_QP%&t 4Kvfg@Pzx=2uz u!C7HkPڻq0 o ^.mPC?3+dYS'b oN )3hðF*m5nQ:,}T'X2,XE>݂A׾~] i'Oe=]\E M=hG W6Dfعpї4*;tn\`wqʮ%Gݷu/u+ƍ'!@(;,kD@3O>[C{AHP8Qh wEa7ש `ITl*]e1i(h2Z $xAYvWs(lvV׈eS:^>>쬭+Tl$AA x/[ Nk: {pJѷM^]..Ģӕ2ej& x}RA~i\v. |&[?xuAK@vWџ R劍^-)H[nKdw[z(BZ>IJpyA7CNitsK v⍐&fnpF H`1d?xy68$#^ؼd>^9)P)铫{Zt-Wd}o . (&~- .yc^6C :=~<6v?!~ZG?)Т%♬;5@ cS%,[b^w E8=ө#4+z={[,U G1zHӯkZ ; yğ.F^n.WzH\s[GVld M8|{\v.0S '5mLΆvWѯ< (Z)pa< um!I#))V5iI(7+7=]\E0&TUE^U$F'!tDk o]Hס@kDz 8`*IzRv[΄S>:{|m[+ĩ 5$(!6]G^{?̮*Nf* QT# iVd'!鍘k5K=%W~Wџ̓Pb?M ZCtcE; =Jn1 !b hLb/(|Eh˳{d\'pm "юVR ǎc b־x.[&RR4(.+I3)RK-ww.Ga=$t|R܃:DZ> :Le.dQLN] Րk|LM[Jzӏƶ5Àڅx<RyfEg`HI|^dpGd$/.+ 7|ݰ kj>8Sɫ/ުKQ:]E?mu |}ͳ|ӫ߭D I1GcEN" BeN^yLOL:^NH5$#mKIݣkuټzG])j"e9Zن~lSSW 7oŏ [4;^wu"t / >ֱ I%G֎[;αW/޼U~j,O[LuE.>=7mC+=s=`{V]Ɩv}Տg*ٔiRU]B5S:eN^=O]tDPcKWy \rHb>p^ېk'6w&`{V]f<';%yy[ֵ I1lq4#|*;p]ޑx,. 5׷_X)ϳ|ۖxGSʱ=e^y.#XJM'_c\By#{ǖRVhl"#[,s&La{V]%GSukH^^x1'mCү(ow_ԕ8{9x%mL-Xy|9)IƼq^;N[Jڞ>(A&`{V]_S8 4pBy|:*qx9RVhz=^. eN~V]_tTcXy4*Or Iօ} IJi &#-:w> =w\8>uμPCs-!]ye9lC.X*[Ǡ/޼UV ~jLm_⒗> _~mCNul1ߑ(⭺lpO- =.Ǎb&aD7uivhea{$Uy<>uA?5*yå$vxv:T=zf1gҖ >ޏ-_G9TvdS:wIOUH9 Kb7ˍq!kjl-[* #T6`:o3X[WGc~#6l)n 3i\JHb?mHC=bx.Sm'̩6<݌41sE8,mHF">d@=9|[u|6Za CqkafGb,;p}6\cˣ,ׯq㼲!ily4u[;[l/ު͔Jiz7LWyz+W ǗgyhemO 8e. 5.o=z-pn΃g_mHƳEȶbT"Ulm?x.+u9|xE|*c+a΢Ku,)moުK6؅X/Gf]p ͡īЖRnb`[칩7S>.,gm}FW9#ېKr4e["-U6UoեzUuۥ]Iyk WU|%(QmHJQu4ۊ]qBe^}V]mߗ5Kv3$k !i;hj;U)W7gفmoե{^b|4vVNz˃Vvy =;S1 Is䣱sM黜ߜe^y.W<;Κ>qvϓ_8w7S9R+Gcq--w99&L[⭺La; +ZZKv7aBeace޼O]|Bdyߡ[-xB|zX6UoeG{yxu߾Hېߧ>m:7o1r4g_9fH(5>mH:R{4c/[.\=]}2}&Xsԅ{~${;d.{׼m)ihR> '|QăloުgMzU+A}V#m7$^Uvd ۛ/d,zFZ= \;{n;]ǖV9&cZ;dGăloު k#i_[1͑4݈rl)EFKcc]z2 N1NVă)loު 5pѷ=^xdՄԘTl/qI2mXNSTvj~hm}o4c._WmU^y/^v/f8uy^tp ÁmHu_Sf&I()=T'4x.ȸt}/;򶾇ꁔbuY [J\V-K8V]-[} <6><ɷ-6wSey.~m]j\b?7k_ut%4+}e揺9uit%4{y^FHbqr.lClh#H`ӼmSKIogĮېzcl/ު Qoß æUش ېrk?HW]yloުT_\|f,Hv4Bz_'mCyh>MW'/ާ.c~ER+0>籥t}K[~}},x0[uY?j--'wH;'S޼O]Ԇר 5CwZHb7?o[JKa7--oβmoުK6-jc\52W9mhQcˣl}(glyʹ/ުK]x{i"؞ .Iv?x*l]JPҌ Q˷Kƍ)mSѠkG]ϗo|cz.=t[FM3b. u /-sȶ؊E. 'Ӿx0)VQ^n֦/؄k8і€c[ݘJJ*`{V]"yP;-ͧlx"qmHтcN βx.[U;[ hmn8G .{¢IKiGca@EVc)E eO]@⥙.s){@j!7ٷSh7R8p@bᅷͺCcg0ߌGtg3W{#ʣ Gf|JM<[uɑ LnH=^b{RT--6CTvJRxQlMΞIM'EVyh4|3aJGjJ|il!P MZl/ު b5]d+2<ܛj{,ߍ8b`۴a6DnUS޼UC㱣n:l}q IwmHIc*xKxLeކuf{>q=az#ip;lq<|!(xSϺoե+"M b!TGЅ" ؆Y4졄*m-f*;pY}$vvPBPE؆ql}>/g:x.3fG^Bc[Q{ۊK K=n[JQNǶb5M9&N^y./tsum5mHog:Fm|>yS&4Y˧ݚGhHTᶒN|4hWͥMfă)loުK$R0ѐ={7 =}Į}ࣇ4ɝ]h+Kχ~f]F$c2Kcq҉%H3$g<*/mCRw4e[$K ߑLzNɫ/ުK\u"v4{ʳ15Z٥KaRKcӵ Uف[ih4 mjHE;߾Kې q4[LSwmd8y>uQpr)F1LvkKi|^|_em~f]fR@룱`G ~ʛY\؆iuQ5.JYt\EYԇPґ4*9G=x.E:t46 lij:>ut(hr>~Hϡ$8yԅ P<$؍W6Ж³ Cz|EMD2[uijp% NlϦk|Z9>m "\fԲQW*x0[u꯶.\$/o(P=Vڂf#m\=k}ꢐuf9;w պon-%|e+}_T6ۛ2lu$8e"\mH8ZUPăW_UYk8hl7uN?hqNh kN]|؆**g?w;"3=U3Khgǹg]V3+ReGrluNJΊV:h{V]<)V:F}̭#) hkt#GJ4~C~ Dρxoe%laV.!ݾ#\ͱ/hlW@',|w]seN=O]b{F%+H۳V_=GX|l=vGOlʮ؞ުKQS^zi2oū ҈UN/mH!MK AeN^)V]<)Vj1;xo -c*?؆ؘJ 5c*;p}P&N4<]X RBulC-ڎ-hHe^}V]v=H@yފ6/;*l]]=jt H[[+*;pϤ/ާ.S1GӅ1fw]]ĹH[JW͕¾[ٕr<ܾx.]qQАϼ2|窋:xR%4C[r e=ϡT*KhgzFGtW]V\K j؆u Ж\gQ]fI7/޼O]_տzghk騋֯a-rj'ZqUs]_nc}V]VD.i,Qiqo Szlq >|ꭸ^y[],cr pi ?XMX~3|]eU3F#ڰ!Z4Xop -~>Jn9~C/Tn!{C,?@:zzez h~xC7Ws^N[-M5yCma+>O14cV{/I. D7F2s~m/Ȧ'RD7Ϲ_ ~mU:z}5\9W-+VLɳMLX!LO򍕧ӵ˯Pqh^Xb玤'VvtR~mcR]X@f^{Vo1KWm'ÕsvY~o V#wnNmϮ~QbPg?ъ/-w;je6b]˳ذ+୭~xFOtFuDЗA9:OCk?pĿEqBAjwE:M?ɗwႃRP'9`'-R$jeW L/؅zhi o6t*KF/~C1bD(_+nzOc m{޿C=]*Dl:r58.zڵ4~:}wGj#FMdUȭugS|I2z[o ~~Gs:/Zk_Z.0~m貎touVo6b#tSֽ@No7̚m1'}z5Cmhf5օXmamYYىq⇡m_R<o~)80lB{QK?цylo=5֍6DZ٢~R2(eun Y sp!̀ >yY-y0xya֕Z}8UJűoЁ5=o(Јsb&P6Ag[]ЌVf/oN~/Z1}y 3D;.Kڈ9Nil_VlJÅW Qf+4}Z_/@!W^#z˓\>~وѳD1Q8g˺JkKv\gݑXK_>bju Ϯ׶} j26F>I;S`ӼU2l[ lC罪+Fxޞ][~Sm-o3/=);mPkz{'}ݻL?RnCۨL,Ɣ3Ci?[?N~UHoeX,yן 4~߉ePw .$7/j |6uĸV¡A?Qֳ_݆sٵ֊d}F} {@7ܗn4e=.~޺:KuߞFZ?{do_n~o}^Tcm&wt{ 5f/3MCOveώRDEX=ɗ]:aJ<7贷e}.MVf鶴qȷ^֟ VtwV_c&l~_Af[Њu\Hg[ւp 1:N̿/s+uSyk%n%~i_Z|mX'wշVPcƄ祷)ѷ7&&͐| ݱYae~+I~cYG9V22t{ݗ9 펾*u{Z4\oUW&(^$}ystF؟^5OWVʉv)9IK_ljfzy}j#tI^~Kp,>e(L${0-c^q_wnhz<_}ĘfOvfo#a5θI;)V 痕C-|y݉YnlZg/BlV+y[Sc0*oIxa}[Po/s {:Q#NJpoPo#{~{s,j^8 ( D℟jO31M?–u0~F#h9lFG…!=)a3S썽? 7( 9D&&x!$}a}꾙;ubz0Ɔ% -ꮁ3# $<= 0Ήg[L} 0=AJ;0n7k1Oci?|MF.,{;lB"?lS ~%?v'w -zU? ba!a6tO90>u__(sئYV=0ba1W1|[hX+afuhvlci81v`[[ho,,DovG~1ke5 I[ =ߋ0b;׿vwz[ֆv`vmrkmc8h;NՑH?p{[:zODAOM[lltϰ}miEz sX8GR>l_&d尿.U㛴 S,ﳱ̵0mf)UqM{Ru q-nh[,y!y$8rY>2ME(s |)wUpBǺx ۆ Ճd l>OQ/oY+7>^~:p˟>K|L-/;7}Gcy}?uF2%]7+uL~{oy|cz|dTz#oi>2o ;Z}Xp>H>6?([pf/N܅~ciD? A8O\>ޱ xzLj;=.M9= jVcGfM_'Ȃ3/6xjrt}.=w#w -vFov'v0O?)98y2}l%.$L0Y0I&}^5 C/Y>w|(%RFe‡MY|q\Y>wz} 2 Os'R)3хEzP"DLPD)<2K}aD){t1!$&-r$Oݝ0o)swSzg]:Eo.ÏߝuJURr-LUJʲ_;=b:8M9ݨQXGeupX^?n+S,~7hGVעN7GQc>=Q7lNamw;/#^ߋpetp->}Mo#@r R1}`Nm>ڤ>}^}BoiY?ߜob+nħI^S qWelZ ΋}Qampĺ5 `V8|4̽òytR>8>*R9xiF2Si,=pWỄr% ->0'G[RhGXassʷ F7~4loYRK&[[ }` ~&&|›/ ;-}`n-ʬ0׏!V> || AqoT_4ßqϰ ʖYJf_o?'8kZ_+0'&%&j6d* u w>?>8>|b7Dž8.$v5FqL3? @Bbb,нH!>]Uvw ! %TO{Μ3.._bthe/TFa:7V bq{6}46_^p4{k<~Ljiϵcf29G gP+/Ɵt 1&b O&_'=֔]9ߌgl'N?x{r'_4i#Zy {^x+fe0Y`#=V}+_>Ox/}na6+fWb;wct5cXy cU:Ab < yo1a{N|+}-Qx喨ܲܲ`ѝ[WZx-4qxgo^1&rI/rc#;}7s^L&;^C~D|_&vXx}n^B|-Lwv1F =;څzbo1~{^7jW5>8F/71:^C€5#}/_^MO^^+F5l;|5[өo1덣rl<1jW5Ջw56֋cxM֣yĀ/0Z9lh7+] ~rl@ ~1񼰖+gZ-Ƥon'(߭vYpyk1{3hgФb-AEI?\1knuN)x'vd[E;L;O .FG.̱{ajo |}ka壞}50äo,Sc-+八N5.{b - s_,q'{=cb{ _ݪ4,08 Ob5c RsՋG<>IG1﯁cVkʃ9q5_a?+>vH;Ń`ճV`KW95 KAۋu &x𗵍4m :rj3F5#ϟ ?_8_`5+I+? 07.`JA+Fߋ؃q݌y$mZFV5v^8V/^1&#Yت0uj:_kݵx|:G YgyѡHG@ϵՅt8V7@YxĠPn><~}߿61!&֍>;m:Ô'>CZ8{ Qg j\\Xc/4]^5^%Tc{Rq1tw?]]PgU=ց>|gMh|x06j,Xd\ƫKwxa=jtez5v/X0F 56ƆA=4 Ogpe_ZUR׈syՁrpmyEmQ^1ko/7xĀztXYk~UH)fraCe_XBeMoo\Ê9fW#}}L.֛PkxXzql _/1OډĀ1^1zj6c/{~,`_1kźZD?1֐~5s]e_6R 0\C<ſ%+ֺERI7+|++kɿ1,xĀ_c \c< sze_bth0fE a=3_o̱.b *^{<T{cl7eܻRYnz0`~u=^czo+c*1C7cLB{G/b<;_@sݮk+rO˯Uòoe_ t`j4gQYcr> o~2f_`拮xĀo7s븃ZAmlP_Yo1}~7/c߸Vg}}߰^SwlvX.mss=g_߸Žrqd3b>s,kfZX7yW55;XLUYV}a_;k'G b c'-xu11}k{ Q˟zxĀol&p5Ƹ&k5*5?ǯc=ֱ翿??{/㧿?_>N-VZ@VÏ6Y9'hh#m 뻥 Xc ~l:~ӿk^:A}?_/OkRk/WJ:˟!I0̗n}MyeFۓsӆ"==#m=,7mVߴH@H شHߕF6'iC rӆ"lu7ڴH@Hܴ!G4@6iC MYM5eݴ!O'۴H@H2M;t7MYMtnQ$6h("iCnn6iC6wiC6iCnn>6===A6m#6m(mx{ xlPGG- 98 a(hI`Kr`+ .kG`0 KՏ`(I`I ˠ`(I`}-`(I`[`Xj|GATI0 oX#0ŏI[։ &C 5<IУ'>I0`&Ac;aX;#0= zL?zd$hQВc o0 Z&a0&a 9 `(H9Lk! r$hQr6B# Rfa_!L)wa0APB50Is xB# R_?A-0IТ 0_4a͸g SIs@/Wa`FAXm %0IУ Mqr$Qr) xC= R`{AS0za`)$9 `̐&41r$Q8f 9 `(H9̬! '0IУ 0 9 `0Za0 |#0A0Cz>t|I0`$kAP|Հ0 Z$r@# F<>= EAK$pU 辎@çIj A0}50 FZ {0n_S L- y `DH8#/a(hI)$p#/a4_\ 8A0|q0 f$~%ra(Ip0 f$(~0y GAOOq&y  h~0 K`FL @= %$p }q0Os ޘ&7AzcN# F4o {cN- Rz0 F$!=Ɯ0 Z$CzΘAƜ0jHs x1'L)=X;,ܽ s$hQ҃{cN# FƜ0 ZDcnB0 1' s (!=Lg zcN3 Rz>ޘ9a(Hۼ1'L3 zH`xcN= z̐&3^.o `8cNs$Q҃V 7IУ X}oy9a4o 0 z$ޘ&y`zcN&yƜ07IG^ &dF^ x1Lɘ~Lɘ9`0&Ad 0  0`EAJVDw&dWC/9=O0IТ 0 1 9`&7A01L)=3s@/W0I5 wEA/HAɃڌw?5$Q5<7jhw-j3z[A_fAm55t;58I5 FjI5 ~P# jI5 xF# F4?Aa(hI0F# FL?z> 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 625 0 obj << /Length 522 /Filter /FlateDecode >> stream x}M0 kOFZRݬZZ.U $BJHW{ PZ!=y=3~dM8yxh9HRe\[&dN|eq"4/˾j8Q}SgeVZ'I2B#[A验=f@/e_jMˌݧXigvK[UߵW~M7i_W @O L pk5};tGF2ѕRHY,ӡz]P|h*`ߋJe4TbW ]=ݣ)Qn詈\ YeX*,:f~c Vf䱋3%dr鹽t, \4'GTfDkWS GU-0U0s|oqhw@ }v?pZH}:q nk7 n_US4 ?3zImA ;. endstream endobj 622 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (/tmp/RtmpnZmxNj/Rbuild6f0944457700/timeSeries/vignettes/timeSeriesPlot-gridSinglePlot.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 628 0 R /BBox [0 0 432 432] /Resources << /ProcSet [ /PDF /Text ] /Font << /F2 629 0 R>> /ExtGState << >>/ColorSpace << /sRGB 630 0 R >>>> /Length 6675 /Filter /FlateDecode >> stream xM.QSym"@RXBDH! ԩs( H9n\>WO~~ۯ?=}R{fV>c>?|SYL~z{ ??{}V㱊5>}ζ&̍jNޡSK(eOv3\I2ڔJ7ʙ(gU OOsUQ?)CB5ZS:%듊˾(G߼nȕ)@vB'AVܼ˧twQM]Qm=Y' *y|ٯNtzX_]x!Jr-7㶱]7jkjV]u.(S[%wr>;ߺ#8} =()]O;F|ѓ:-ttux՘uE~*:'C[9'Bߛ*g A9oD.>_ fKE==7K?{@ytA.SKЫ]_"LL0n/k^^hKFG0`zڐ u҃ړGia6[ٞ~f{ZBx2߿rf{ͭbXz{d`Lo9yoAG4bQa3Y%yryLV<tŦ˔vOdc.6}Bd_5{=!g:XrADEKBZZw^mQKԍ@jۥ'%hvuم%$$n sĕ~ XT iǮV^y//!-6 Zb4ByB)Cts,DI~j,Oyܼ=1&Uæ`/6ەƆIhQyT\(+է6ѵ[N%FvJl #;&䙰uLѲ ȈmEQxc! ߛ}7xW16<_A"1NNŦҿ+ɤ7=JOȌ ߥy ɤ@nfJoȳw.4 /6My יȓ&A,mVГv6}ݤ7 ˨\hV}\H|Ŋ6.ʘ0^\ ޿X6Brrzb+·؜p-6 .. uBR b[Լ|sCis_BD]aa^ eoO&eҿfĶߍK -mn|LBXheM.$>ub/ ͨ_Hv43tf<3*tAŠо0.7k,rt5I$ii3/Al5=> دMi<_zxrE#>saUkԱkҋ3{O>ū|~#僉~|ckԯɕV6Ddԅz2d>yqZm,(Ւqƹ2w )[ظ{лjӨ6;6Gnm,=F̚16kYm2D&f<|||]m6.[Mݨ76զQm}֥nT6^m,@I^hcX |6zW-%~u,TOxM96ӑoy0>|豮|iZF[__ܸ 4@t>ejkz7Q:*tg϶ʷTo6NɍZ mQpm?_Q|YC#?|[5^l>l_ƻILOӃugjO=Mjgն_"8R]>qB6 D| m4ƛͷ鋞QG/Ƴ/7m%X8'#eK< OAꎥR99z&R35#::0::$:W%X'Y[툥"((΋sl mpܬ#͵a&nW^u5"FxNtu MGxnx#$4O: tmVz''^oZ^5z= w wmwFV憸x}Laul>!"'>[%^d'MA^>3_>gxu xݒkSCY7bW#0M;4ԙWu >G>#)*) ('s{סus>6&ωױ!n'^?4Nx}iNG|n, P׉{m qxtu{ǃp;^ߕ;:X~^EO,՟؁fMx#b/I1v@@r%u/)Xs{ w'9F=߱;QhÏ/DsC@r\O.ywWq'x<_zr_!G :G _<ki"`B# Q~hKyG{3m-€@ݨwm:Jpn'&|&vyF_ ;TCaAJT߻1(?m:"/5(&>ԘTLn"E%Gy%dU||ё=x AlT:HQR[RRTaRDEs~eTÂܩ~iϡlTߛ'Q}tN ꫛ/'_,+Co>TXT2꣘zAoOEˌHR}ד(T'wP}׏Tp<3=T`_ϡx-OI< GoMJTd$OR}ThR+>Bc>^s|RR}ԑ 5| q$O*GMϡh_R9R}N#|G+X;aH \p!aF*Kap>\Tħ>TTa#G{HHKnD+~nu\TUzG;/wS}>ǟLNޤhvROR}t7&'>ԔT TFG1<5!kEQ )0=T>x TϡզLT(,Ԏ[Ry֟TMSI];կ]>`{=GԤkIEE#Շ^9Ty /~S}OJNa|DW8 u+>OHkE-y*Ah!_m}SR}'_) >&G(A%–Tav3 lOR}O#A=KPz_x~R;P}'G~vx.WR}cXnڒ>(|Bv 7[)@v9Zdkסl퍕]MvdekW[}Hc~]kis㺃 N-5;R225 Dl KEwhg:_}m{x#b㍈GD츟KH벹_K"rK b0=GXD(GDx/;8ѡr;;4PK b'|]g>b/Kb?-j"R"GBg| ƍcbG~փzbK!^q,^.7-|eb|K'Ğ;@Y~VBDXM(bE1?b BF@Ȉ+Ğ ĞBa ĞĎ#C:ډSU 'myH#bGa_骟{_{ *~BZbw#$y34r=i|[_KHN=7ؓ!v7E9)}p!v<#%"vi_#/sD%r߱zb ^%b 8oq~a286Ldq/籺:F~sq~q}CG>aב1k}xa_ |_/[盎8/c1 |0} ,8 %2w0(/#'#UG*q~]x=a_W;ekO8_|7]1wq~rq>~hyq Qqɸ&@zaq^?48y|r 1'!8Oycy"uME?9yq>o!M~X_q/^q%a/leTc=y[8_Ë0۴S#4ο[#VY8oٷqG^__M7׻B4c=KN)_y ;"tq08_Sylit2hukeD4W'8bbw?j wHU& R1- vhP}4w.6 18ߋƋmA9\8ߓ+|[_M0wY8*˧qniG vly |>MM&~y4#8M |ӑq[8/|i8Q>_v47,~ aoq&|Xz8 0w_8ߧ\Ďm?d:2|);a > 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 635 0 obj << /Length 549 /Filter /FlateDecode >> stream xڅT[o0}ϯ؋#5I&1eڄ*M͞=B4BٱC^&|s`5~d픧 AAr` b,)r !T{BFڔab[&M<1)J%%栾08[R7nɍpHCXۉ^7鞘xԎn\R@63͞|i^ ys$=(d,YF~UuŨK?fXٖ>cɕShe,Y@r?11:HWC~i h0{{D$wgVNb@~#pr sIX,nݹ@v*nvV!1 ,ro]7Y7*٪@u6|16Rە)F`Nf-M̝W4"#Fg N:ąڜ<9BM[tؿ!g|lJX_fq6$iꋯ/kjrh@{o{!Yl1ʸ?)V endstream endobj 640 0 obj << /Length 19 /Filter /FlateDecode >> stream x3PHW0Pp2Ac( endstream endobj 644 0 obj << /Length 522 /Filter /FlateDecode >> stream xmSMo 5R6jJ=R5=5E"x古 vH{f`y304 wa$Jꎈ E[&P4 G&H%?dF#}اHC:dR6JAkX9T)|2cT|DMT&]?xqwLI?C96. 0 nv sNM]a{Ն(Ib}'׃q7DnJLRhS`l Φ(fG?>&$ w2 >~i?5I\,[tw(D(}}U EZ~V^T _ru !Z'~/fsZ8_sγn+RV6< $u#M0~s1c/wh\kVw0TXunz6Jrڶ}Ԡq &<}fD%oOsl4kGۯGN_O.XWWOΈ endstream endobj 649 0 obj << /Length 663 /Filter /FlateDecode >> stream x}TM0WX=9b㍝oD@X>DrviRPUxyܑD~}9\^%%᜕i*lAHX G$9J!"/X,vwA m? bNE CNg.de&2<."a\sjvJ+glQPMtY b4LÇh閕vpjmpQwҹT!)r*Q(Y5gto~ߩ{oV endstream endobj 646 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (/tmp/RtmpnZmxNj/Rbuild6f0944457700/timeSeries/vignettes/timeSeriesPlot-horizMultiplePlot.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 653 0 R /BBox [0 0 432 432] /Resources << /ProcSet [ /PDF /Text ] /Font << /F2 654 0 R>> /ExtGState << >>/ColorSpace << /sRGB 655 0 R >>>> /Length 10759 /Filter /FlateDecode >> stream x%9u&ȸ@f uZZ$Ffp#+ (hYmI;q8I"Nyo}vSnB?gsq}q_F?Uڣo4]o[q ?~g[ǧow\};ojj5!O9cVmLyiggi5&[r|y?rc >3e\׬,ťZ};s'~%۽}nj6ܹ(g-\伕I9l~oj |8]y|-4N?ס/Bi/)g3d;~s{ 3ly i d(;,J?gdo~@5oݎ[;:]vFevCơw'q$y W`{47vu9tE q _ϵg3-J]9@Ju4{_oe>!&*)t:9szWN|lj̖#V>Tv9rOQzN,t*wNCpT71 2/Ğy:y]oqh~煮:y wP3k6FE8GW ~4?_>ss |ft4̥O\D3;dgܜCoHyY71]3$?}Zp/ۡs5^oaY[fEfg,8c k ~s]C|ZsCX8\ʠƇm쯂a@T~(7/vش k kbx~6--;gx_ K޼9ԿS}qus fT?9>XX~0>0]AꏩT{ |W%y?V;s:.ڣbOB7mi8+ֿ:G x~x~x~h;1/S~iԝ|~mQ\t=3^XNnnUOoh)OB?y+;y|U\`fC#>gT,$wwiw+4jCߌN09_;G/L??üQswӈ>>?ܘc| Mφ׼sX4y?!E2]my#آ?U{t[\ϋY ڵC[|PΎB|8m]]ZTnѹuv)>Vs̩WQ|(Ќ~шh?Ϲp0۱8o߅׋G&f?ֿC jMn3QЕ4+m];n3;I85}>/Nؿ_<,CW|pY|w>Džڸr?/mϾw<}[g5͏+jgыg۟^?~~<ן74ywur^owzxյ?X'㹶a҈!b;mPaa{[[g:wh_}`|khٿ?gwy_M:aS<4ǩxq<wN7&V NxBri6'qicC^*^@}뼡a-}0fB^sC3p~{XRU<hڟ=)E*>/s>O J+{ey;1Cɶ瘊zv?Wkvj*h6w LI 9`2V;!}2:OL4__ݿ[\ RDUY?oOy OFxŏM.?73{NgeVOfG`WhHw?v3-/t|>=~yڄ}a>}L#VBfdK>9ܧ晋ߌ gpӑ!<2֗ȰC;'!C;2o2- B8s)dXA!CĹVbGd!êD#CT|!n߀ WȰnAQ!:;[_!C$lRoB5 Wn :dJr%dX dL$Bh ]YvURĐVAsDq2v Ȑfc`?Bux.2D, bl0,dJ2#dYWɐẖ!C\ Vm!CT[zCU' q+ Cd-d̓!BTyvD7d[2 1^kdx N Jk/y!E+dL}~"C4.dѦ!a_/dX=cȐS w@4 QdՏ N bB:B BI02xҐ!G2c]OȐKTwD+dȵUDh!{!ç~B_BbB*<  mװaGmV[ )\m!CO-d2D|ra#2e iW9!H!="ç} 6$HdzsB!H!߾-d,dϐ!Qyzf82ĎdB2,Z2)rD/BtBJ r!]HO- C\d !d [~"zt q!y9zC!2Dy 2|b2"1d2~DЪ!H+d2D5B !C؄` ~!?/!>2|ƣa!Cts D/dȰS| qEEClG0!d` 6 !օ ]3#9 ?&2x p BXBhe| Z?ϛg!C!vy!C! !CSsBBܟm!COȐS: ~BL ~J r|:o ?e;\]#2U]`׿2~J!CĻ"DGevl |!׶!-?7\Ƅos;/2BS\u F@w+K !z!C3OȐyQ!#B$sլBDȐn V$ː? fY~Ȑ!]пE`a_;"C !F![n1癌2HFpSxXQ2VC '2HF .~舼u,xFhc>^~2˟%D;odPreddddݱo?6%0q7&9 xfR_?P/\ of őeP,b913sY|!ؗpep%@J5>#*\ٌV:1lV`%U7JV9 cU A`[\**mƹaF%,SD*AD}TA%^Þm>L h ─IܝsJ5"@*bSUEqJpn)·SN9,.L \0e5aHaSfٌRKD,`Q R l411JvR#DHMNv"9L@(m P>U,Z%7p(1r!켥ޠ$I@?IKaDW ΉBrm1eMK|Z]l[&ؤbчrCO MO-dΦӖ&Y6#DnM6"i}d_g/OL"f0'F`rXŸ$FG \۱Ѱ$%X)*֋q1((pf(&`oW?6D$=emHrCF$9ڶL$zV@(/ 98dƫ#qĀ5Hr;N'GcDh$GI#aK0r'ȧY"f|zI,'"ycdd:!Yh6["9&C*mkȧzB {ۑ(mjafDuvPF"LΓ'x DAWo)MnqaX0$~l*aAbOeB墐si B>-#9PD0ՍAb/d!$7*f*|}b,`Uw9gs_ro^`68?,x%{Fػޜ$<곸$#B*%/!go2;{ c;JxSi$aG};kl : 2ruMVioБ+4#7.^ba, {D3sjvs#dǶ#BcQ{j"R"#ʏ"Fc?<GzLiY9 x#h$n,5O: .LŤhhUti5v^ $mv 0؈HpN7 5rÆj%wv-%$ha03{l0#ǫ>~im:fnV~nzѱ+T~2ȈӶ#W1c?-C"nƵ=5}olA5  0 8b]N{ @ /r )Ŋ[Fif?`tQFKtgxHNo.zOl [DD hqQuWEZ=E*D.I, ,"o."=poB +r"Šv8XXq<Lj:*b4ۋO U&чmvޗA`AEp5AEr<'Iy8eRYP]HCپ-i-)/=\;ډ=AgDq(b.mь)r$Dx"M}Dή-1WzO2]jf'fX~rDD8p,'c, !ȖP1)J-@DoD5"F.F@@Kx됳QȒq-HIQ[D7#ނB\[mCrBد BR(M8@@@#8NjS‡B0<!i5`;"C1 F0agy!35U4T&E r Ѡ\P߇݌7: s gϟ2:MըB$X*bTDf*g,S𴹩T@$r_T 'Rɞ h) ̆Q!e0 |L1HfC?г"A2c̆v%CR3Ap0h2–e4Ʉ NB<h | {2/) sOad6-h5A2c̆v$C}rd4 1 +A.᎛vbe6;12F:̆MGZPe6Mh12Be412c̆>+k]FO.!N1 =M'hi &!s]FC']'+KWrt%'+SWrru%'+[gB_̆pu w<&+kWrڮv%'+sWrꮼrw%'+{WB_̆pv %]FCg╜+<^ɉ䕜+\^ɼq&Nb&!%+WrZz%'+Wrjr{%'+Wrz{x.1MfC<+,_i+L_ɩ+l_&!MFCKbѐ~+9W^S+9W^ٿß/LFCMb&!+Xr"2%+Xr2%+TC_&!MFCJ W^`yeKN Wn`}k WnOɐ| P bѐr97X_s97X_s97X_d` PKP'dh_"+7Xsnr5+7Xsnr5+7h/?ṖC_̆p(v )7X_s97X_s97X_A>}$C=]FÈbp_ɐ5+7Xsnr5+7Xsnr|\NAp|&!+7Xsnr5+7Xsnr5+70E{{0e6 97Xsnr5+7Xsnr5+7Xsnr|$NϹ0 W.!+7Xsnr5+7Xsnr5+7_пň{{d` R97X_s97X_skao2e4\12Br5+7Xsnr5+7Xsnr|c#_d{{d4`}k Wn?R.!kn`}k Wnd{{d412Be4p =8\fC &a0h2=MfCHqS.!8\FC)plad4) +MfCۛ;8\FC)R.h) ̆M}a2d4p 58\fCHq#8\FÙ lad4\ioo27 !2ZLqS.>RS.!Ad`h(ioo2Be4Ԙp GLq̆p gJq+Aàhd6hh)a2zJq̆0 #8L&!APd4Դ7 1a20 g:̆xR3 WM{d4ܩ7MFCKi2boNj&al'5;th(7]fCMPco#&\fC83\fC8+\FOj.d_*be4r $C#\\Nj.ēh1a2Be41a2%&'5pœl'5pǓhh1a2ZO=&\FÈae6 f2̆pRs %\FC'5V.ae41 ̆pRs W<;\fC8Oj.DŽlad4MfhɐOj2Oj.!\FC'5pĄlad4) +\fC8;\FC'5Nj.DŽlad4M^Nj.ēh2Ie41a2Θr 1 +ApǓl'5Ie6h2FLX̆Mދ_PIe6h2xRs 2Θr 1 +Apǽl{{Ie4xRs 2FLX {Oad60h2Jۛ&!hpĄl +pƄhR4 1 ;MFCK{{d_DŽh1a2ZM_sXPR4 1 &!hpD2Θr !a2r w &!Ad47 mO/FLq̆p e0 %Aàhioo27 !2Δ0 WJq̆0 w &0h2d44qLfC8&ac2 Z`21 %MFCMb&Hd4 97xrG s+7x;MFCKb&!Wn?=tR~E_}(WO_GF-ҍ^~ kٹz}HMAh"kfP `9-9a;U Gp~hSB_i?s\oӷ%m endstream endobj 657 0 obj << /Alternate /DeviceRGB /N 3 /Length 2596 /Filter /FlateDecode >> stream xwTSϽ7PkhRH H.*1 J"6DTpDQ2(C"QDqpId߼y͛~kg}ֺLX Xňg` lpBF|،l *?Y"1P\8=W%Oɘ4M0J"Y2Vs,[|e92<se'9`2&ctI@o|N6(.sSdl-c(2-yH_/XZ.$&\SM07#1ؙYrfYym";8980m-m(]v^DW~ emi]P`/u}q|^R,g+\Kk)/C_|Rax8t1C^7nfzDp 柇u$/ED˦L L[B@ٹЖX!@~(* {d+} G͋љς}WL$cGD2QZ4 E@@A(q`1D `'u46ptc48.`R0) @Rt CXCP%CBH@Rf[(t CQhz#0 Zl`O828.p|O×X ?:0FBx$ !i@ڐH[EE1PL ⢖V6QP>U(j MFkt,:.FW8c1L&ӎ9ƌaX: rbl1 {{{;}#tp8_\8"Ey.,X%%Gщ1-9ҀKl.oo/O$&'=JvMޞxǥ{=Vs\x ‰N柜>ucKz=s/ol|ϝ?y ^d]ps~:;/;]7|WpQoH!ɻVsnYs}ҽ~4] =>=:`;cܱ'?e~!ańD#G&}'/?^xI֓?+\wx20;5\ӯ_etWf^Qs-mw3+?~O~ endstream endobj 661 0 obj << /Length 621 /Filter /FlateDecode >> stream xڅTM0WX=9q$ "H ( iYz`Dr8j+g;m37chaf\QJ0dhC P}aO) 3݂j<83^e8.kst(i{u|ZWBEE|"rSp);X$.pW[ᣋ/G a Yc-Yn dT6nZ i6N3$%+ᘿd >1D e]LUYɎYov}벮 ַ=U̓٣brVR ٣s܎4Ɩ( t)i[b鼘_99_n &P]wZJz9 癩6 h;ǁ_#SpA`nt˔Z(̙Ӄ~*3q((2H 2_3"pX6<@c?B7ÇbP#  Hw.}4K"-9-7F_7|W(mK{Uk=U+`9d#ٲ#IoE4$ᑙF@x>&MH endstream endobj 658 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (/tmp/RtmpnZmxNj/Rbuild6f0944457700/timeSeries/vignettes/timeSeriesPlot-rugMultiplePlot.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 664 0 R /BBox [0 0 432 432] /Resources << /ProcSet [ /PDF /Text ] /Font << /F2 665 0 R>> /ExtGState << >>/ColorSpace << /sRGB 666 0 R >>>> /Length 38953 /Filter /FlateDecode >> stream xK/r7?b VyF؈8A0$bYS[gm[@y76zݏHGz??XP?K[?/|Zߞ_;O/z՟j9ˏ?TgzP֟O?@i|2]gSԇ%z#i~Ol?*w)Agz ?K8-# RόPY^~6^D5N'ـm OD~oݷ8`2% Rs6 ,Y~6|\$CT7P_D&lz|9LūW^\.?Wk:@LS I]¨L|_{*&hWȘZm^W'r Շ#hL>i#hL~mT9?;0EIf&~P3Qe}-4j[$Lgm9Χ' O 5_.Q3Yig%e:w,iw,r ~#5kv|AFRN&02),{ШkcW2^[np3>"ïk滑Bj/rMFDudVFDyΉ*Yk=߾*uS 2RP_c[n>H,Ng ȴdr(gFVTb ˎ'`C2"Rm}J}0@;í?}r-9Q]IG2#51bˎ\̧ٜH Զj'2/ m]!2[C[^6[4_ItYAzq̧ii#d>MˣHO:ih1C=3҃=D4- Ob66|[_\sVFndme4 A9pdL8H4C-3"y"i›&Ol6G𙖘xƯսPJsrLJJoWC[àpM'6鎐4 olFa"JB!uBs~Q9D眴]>;Iϴ==xN?|ϭ}#gIy|`G֒#0"Z;l>9DӴklL}L*#N8BqS;w>ͧ׻8 7Q9Dqiy.2aF4Ćo q!MqjMqޯjKhyt4 o)lLXѴ/UMw̧i._S_yqkhřJc2!2?`gk2 Myf!M7ĔCd>Mk<s4-cJ2| sxC;T&#%z!iZWwG"gqii ;ϭ;J^Yzx$EdL |F҆^eȊdж14;Q޽(sFD}t{˼#z.OROlL'eQb!M^錫ͧiރͧgZ'>i.radiCah O=58bZF#dT˔~ōPhZ d>Mt 9DgE!{ttō!I9n4-ϥ8Be;Dti†A(n$mH*8U6[CT-bƆϴxMh!M rng58!2KlLKō?M{!i})1\T_qe];Dq>-BQh43=/O賿lL܅}2N 7 /ŗiOug6|?|$=shZsӅFig!^O*!QhZ\Ǎ[g_Cd>Mq!2ɗNt"\#7N9n4]}`iZy5G|._Ȝ':Ց<w~S:Yg!2K;)σ&i~.'MìWFщPƭL̈Rbv6]gii%E'2nphZTuWFukl>MK8:#2|Bqi<|8n'iKUw7YGllWw+ >ʞ!X_M0D8s{ V\BbqrF#7f ސ"_9F@@| `䍿"7@ ZuFZxG: ~_˚q 6}ᄜ/~#kw$7Fr ȚQ0pvFjj{#kf 0SǑw0޿2FF~F֌S@|* ed]o]r}k<`F @Ñew&RIXwgxt~tk|#D3H8M6RB𯼿+0⵼\pt#3 JipH#H:@FB@x-9<|?BƆ,@r@^ݵe;MafO2MW`q!oe7r_ Q藐I~ZBrH~ Ia1r_OwOwB$$uv?oz2r\ɱ#r}+\e$/!ttGq Lt|)pHL3!5 _k DgZ83/72'y8}!D%V g!#\e }-MM佑t#Ṕr#- Lt@XB^\7kH H5HHjcFb}If6|8r|_V&ƧktyF;jrG%rƵpG徣wT"?5,NH/ZWZWï~ۍZvt~)\_n/w [1_!}GnM5\\~ ktK/ZkHv8e##ѸhcGCR@b[SUjMa$6d3 ?i#uOǑdhzCJ@)H Hѐ`Itj ?jd>SZHw;ܣr_sHHl_2w OwsH []KG [5d$~T=V7:ٯӆ kP H w;j2?DqH~.~.k !5 |v 2r~%@]Fuu#qѸ<\H H|G8`# DxG?ߝ9t绳_!2/w`"l Ѽh8 v$_p_7t6H o$]]{U)]GHq!)JRx@t TFʍ̀ )]t_Kv ] I%sLy WW~%Щ]Nm^tCwtK.wwnQ}4H|5%MR[6 ʗ{P^'2r Ł*HM0mP1]1MƴN$\MpGzp#Gh6nCwr}:!l##|G #|GMuBbwnHR'v<!erGnse.q8B=7 7F) NޗP qHbۈ9BO82¯-2 Bi# ؙj.2Y4 2sYK'  :u4 եt+Vp#-\Kq/,h \z//GPqCGf@b_ s=XGwK?,7xpq!=Jk}dC% c#;ҥS-*W>Iyখ8,$8HecBmkHSBɛZPl)?a݌ۜ $inӫUɮ~dw9y 3y?jlɜOW&r@)x %+*eK0OTU'S,x'j)D@ iLzO&B )B|O[O! Rzvxe  P? ZhOҰx /엥`MSi)Lc5"j;5"sBxM<'T4&}z&B`|04"ubb9py+"w"[)Dx/%ʓϡ+*aHO!d yhv~Y XG5&dST`%r@el PQoVO! Ƕh)L&OuO!rx&<x qRP'KֳLO! RvJ<{"&B@lԼa%r@e`QO! 2]fmSjIN-"q M<|XpI\J&iy,&B`I_~X#sM<ʒ5?M&5_+k)zAJO$SxS@4"j)T~Ξ?);1JSTO3&&j%`IN6IFdǯSIګ4\;"{M<@G}r@=dLXP%`I_0Y&IG)d?%:J0m&r@u7Ш̾NO!;5 t2I$7q֖|SJOTFd{M<#x %۱xʁ=JO!P'q$f2?!vt9ew׆S_GÈi)B:+gCN"t׼SR2% ^;iXeyYfi)B>NX(yQ4HT({gN"Ӳڙ!yQ-ip*BĞ62-Jw큧(Z!kdX$MFD2H=t"64ѼSHlPe[rCN ֝nQ]`"dp lyQ-g"""Ӳ'ެEܺLuu y;Eȧe3AN:'_y мSqkd۶. )e ٶUayQ/C׼S.Y)DgWNbxռS32SWҼSj)BDd;kԼS}ӞS [r;ͭ{w ոAD+g·"di&t[gh5!qo2; =74lyQow;l>MɎs-!K?>(yQ_̮yzw ոV@N"5w2KPmq"{yY6bмS~aM"Dt0w ղZrVFxh)Bٞ;l>Mח8tqGN"fO[g^H&#zskLJ6m +; FU 1]/#9MKed÷5X{;EHQh)BzdӼS >VMN9bZF#d~i)@LOyYӟ"DtHN":?gNk"Dt> WN:?2BKs*BۺyYq#lyQ_@eiZ]u̧Öw ߷r̄"d"w'kl>YwgY4$w/,мS^Oӹl>Mg؊DN"=; >j)BDHNud?w )lLgؐMNbv ҼSQ"5!KCD54Y)B65j)@To6[w4!It4 ꁘ"dō4SN"Z[ml>M569:>-h)BV)~9n4-6\`iZ#d>.L6|;EHS4+ d>ڦz: 76rhZ¹ϭWL;0U]Nb_ctOMN4D6w +fgis;j[68nܺyYq#wω&O0EN9&KNbFyxW"ĦʜּS~wjk)Bl@NyGw~ͧ!Tbi;5 GO@(n4w+4 ?cj)BDK$yYh&ʆo侔"k8wvNѼS.>NCwq5 3h)B B5!Àw չy:,|ռSNA6V"d81rtN"Dz^MōPNud[)@Lg6RNIGwOˏ7TN"fjwdQN&o_4!+n,#w vG|gGNҬJcgmn5!M15!w h)B{^Nbydy)-;EHi)@T6:w׊h)GHFyǍ[~=XyA۽(Ct^#8OKj@`z#)ld|6D4xl˧Y *$0Jw#kbrmX\LH̬C+@!d_Δ](w+NEH#^N7q2f)dIw%$lG`ӂIq}9x-|ac./Dž>Ȍw) ݀tt B++\:pD=wЍ4N?#%3R ; "dFkåmHi7 H '*Zf]Ԩx-'~8GM_;^۠ !;9ɑN4pkݨx-3ؼ!E{)GpC1\nCiD>nu p:{,uJυwtus6ZK!I3XW !1ddm8-jaARx.~.dDd@b#) 13#$W+ىM"$zA7%ɴKm2q) Ԩ#5\KkP~Q Wb+x]BҜr@F@MF.!KKP8}.ht;':(}5t_BV\H HKhj_xd$h.n@]m1!W}5%S$\n/k^@eg;8p:ik:@R@ҍpvNt= ߕ',<6Ñˈϥ4H|=Ժkd[kHzT\6\\z7A!=~j6rlGFx~lmnBJ@ⵌ`mF gHgH#q\q~v2~#xAH##(޳\ TgBGr}3|Cd{ uF#r'uҼGJ@oIV6R}=(vh:"F7=_7on{ޭ ozoF 8џAt6#8`7@2t6@r@Ԁ722/;*pGbaB3c洞s ݳMd@&.dM&K4p@!_il9#p-VHr7Ժ+g-Z%RoRW^JH|/8+a@&2Qp;ïWzxQ h#3ԗbf޴g;H m]ۺj]k] MPtt 1ݯ1QWZt>CsӹxG/`#@@)_i'l !\5rhsN on3Nsr$Z2wfgm*U*U :_Dw?n HR`/@J]❑/wz _r 2ߝTpٜ#wC]H=8Y6W&[lGekU&`>Dz@bQďD$$z%L,O2 |y@8_JW#1]lgkDp&کf#C\r;%8v  S6=e3$Kw;[HH#Zs bbr&ڜrqFFHُp-㾖0%S53!qUdC/=|[:["RRodd\uANzwjBԽ3$Kw8[H̖WJ9B"$l T}tߴqFHZiwMGaS_CeYiN*gTPr7FHʴڣ$rJd0d^i.b)M>?N&+Y<]d`&?Y_^+Y4+y~1~]_PZ4q(~8Jk[r]I߯s߯N?~ǒP)TXLX]u孒+ˉdc9_s]!4|4ՕK~~4|τ+9d/Bh%%3O]!}<˗>O\a A?Ms%خB=&F\y`VZ ^>*@)\eq4ǕKN5|W,N)wB3\yJYmЖ)$rdtU 2Xһ5sUmhSnMp FHX X7X\! Rⓝ(2YY WL>K\! R8vL/GSp4"&B[!<ؚʁ%eW/G+ran*iv+>9|}&r1Mnd5Ky5\n M>9'[І> J3[y7li}5T~Aܩsk^+,oj#y$l#id:1B@dgu&TyȄ|=tW%>9|3MjKvZoiK90=W!f}N˧9XkdLJކzLf_98*+80R#FRN&0Q-ӌVʁ#_O3Z9`ҧjF+>9Ԛ ˗>UYbS=l'MM{-q KBmI|^O,дU UdL& ޶~aD+2S#4m!39KVZx陑lf"d.s1ѤU@,=EМUDչ '[>!:y7"d:ʭ'l(ξ2. 6rX*"ƏǣJ;'c v|U@6 dT?r|tUN"9Q*E;#lUP)A_7 ZɪYz¶t DcUE4W!(SĞF+S#TU, !DUD~(w R[ħGX*" or_T4l i1H,H/|-Ka՝f"ĺ5OTYYZA7G(T=a7QEİnkaKi:j*B>݋o)0x^U|YJ/"Kz‚;MP;i*B,|U@NOEHQB IWa#z6_O`P A_NEȧ'&jlTKmNP,uZsS2'T,=}LRStWmְ ZSSRץ`+hf*"DKtnyܺALEhٻY=페?qLFTIh?)^뫗u'K'N51 ל S5l 4-}R"uխfbٽפTDXgiHRE;9&4l IyƲ!kl,LqNo&DuK4iR*B'G($T=a I ɰ[K֜THVkIEH[s:hL|ZFbNflBj)~ǚO?YZa"mztT@+ tT* ՟[)2[Kңߜ kZgQΑ>E p9BTT>vLQm4M8[nh** LO^ERi )󬙨LT|4\dci5#[w?B"d|j*@T~ۯ#dLǚ ՟yh*BLy-IP2x̶δP`z6 ;(BEq9f"DzPaxMBZIAED׈kQHT|z-K7X] !!!}z̏&띖u:awshAn]L ^ :a8, txYL4A7ԝ~7>E@6i%ڱdr 3FMޓs^[rN}37:ɻNkEgG/Ui Sj@ ''W.;kcCuEE!ü@1E#Fpb\|Gq+@9 =t`0pz0zW )7-thtzq"eeq.yԑnE"qM<@'Y'YIƷN]b].&? NHNNO У @mJDY6dcPWw(۹ si!# p\lh1 - ? Fq"- rM>&^2o%WZ佐(w H ܏VFj/p~\f|.vR#o|)t^c_c"s{VR:?D..cc ;$<]3.O@F@suI!9 zА!;,@f@k,zzry|BK!3Rc5d$~֘_Cf@Xw˭岅? :rw߂nwh58uk;RchÉ}nj;E4AܑIr{RR=X~[,9bH ){p @viԀCpKX_&\eg m@^mAH WL[H|3ƎP=o!x]HHE҄!WI.7[o;~CM/!K|ucGB/{W.#$wԹ W;w;]ÉOs;QldOس]7 |LָM/!0%7+I4 J ' vzvzrd;B!{gUώ*hGz{z!9 FZ@څ+df؄s]zHxgGr@Ը) ^ $]ɩm ,6VX[@Lמ} =dɗw8}2 e& =J$q- uEBZ\Fl$8vt!q4W7"d/s\FxGSyȤ*ې#]3lkG`냼[cl$ U,M{FWR_)܍L$Zz~Jf+)Ww[HbݭFk4ZmH ݖDW= fD9ITr2Q4, [P)*I7 P@Im-=?'GȒfWcX;ZyX/ƃbQT=A(Es`((^IiN**'ŝ/I)VEi`q,%_ښyUQqNXS(ţ`K[IlN** s -aqKx ,|i+)VEְP<O4ٸ/ť`qBlX<4g)VEe`q,|iɓU8SBqMX\S(EAJsUQA(*>mιş3ŢHvUQqXk(n/7Ń/m9Ū8O,3ŭbK[Y}N**.KmbqxV,|i+)VEťcq顸g,9ωœ/m%:ŪX\P;w5xUQqXf(k Aكv)*subqxT,tiSsCqXr(_8tUQqy ,n#[c 35ST n)*tkLQ15SP\ѭ1E֘bpkLQ15[c1E֘bpkLAqG[c1E֘n)*[c1ST n)*[cʋǃn)*[c _tkLQ15STwʲP n)*[c 35ST n)*tkLQ15ST n)(֘bpkLQ15SPЭ1E֘bpkLQ15[c1E֘n)*[c1ST n)*[cʋ5.6E֘bpkLQ15E[cb850E` LQ1XST<;O~jkq)VEebqW,Ԋ8Ū8u,N=׌5brMAq 50E` LQ1XSPb)*k` ;ZST 50E` LA@k`b)(h LQ1XST 50k!_ۖ Aؒ0 ["Qؒ0 [2P+F`p Ö L@hhn A@hV"0f"ed$J@0@XxKJ#D@O.aL%!>荀.cd%iFj!.r`%9S B91Rޒ--R 5S.$3oI[2Җ+m@)ПF 0ޒd-9mN[2Ӗ I@YЃڒN@.'%kK@{#0:#\dCjK$ J@/3\dGjKJ&I@.r%Pzz&I@p$'^䌎d{ ?GKEd- etL"etL2P'uF`TFDI2:Z&@G$- etL2VS)d:Z)NXJ4bKJqJJ^'UuJ4bKhfŖ 䊕D+DetRd& hŖL-@G++c^" 8Z[l͸ؒtRt!GJqʷV[2V/Vhe%4cK B@2:Z&@G$h8CfL 9VS2VN@p2%h85c{ V["@3dh쀕he%4OcKqAG+rkĂxqƚ V96VFA8qC 9V7VFB8}CLs8,-@Gĉrr\hͱ%{2:Z&Hhd- UԎB;d'xfxl:Z%Nh8cO|V["@s=d{̉h%4cK*qʼ8V["@s?dtJ"G*q %mt`a?Kو@y#:G`ffh@ޓdTJ@ of'-L2=Z&joIڛdIڛD Q7V{ `7V{d&jo&joBI00&$ `|a/L2I&$_Dㄨ-H"P5Ezȁd ?'P[F"`\0P@.:4@`$_d `|a `|a/L2I&$_d d/L2I00@$_d `|aJI00&$ `|a h9c0EvrL2I2:Z&hd- etL"02:Z&Chd- etL"etL2I2@"G$hd- eLI2:Z&@G$- etL2I*9Z&@G$hDetL2I2@'G$hd- eAI2:Z&@G$- СIG$h@$hd- e- etL2I9Z&@G$hD etL2I2@!G$hd- eJI2:Z&@G$- 1Z 1@'c8&@c8&dqL2$hqL"0d-Id-I$-,|dM:[Y _~Fԟ p *Q]Vc޵#=OvX{GZ=2v˯;H'u:ǿ0pkMv#?s8*U{+{iX^Sƿۯ 􆋸 h~ØCsU-c~őtes#Ij _GѲA|~~=]ʉ9?ѭ(.w"d$Y#c0"{R^:{Cɡ0%ZcDtMgK94#3ʛ k@fcdʛg1Ndɡ2&diCکOG7d!8ٻR_eC['Dt-$x"=j/#+FgDtg$3"?]Ig>-*s+K s9IPɌ,ϾrMFDMީMʈRN$Q=Cs28;Ot"%ï };f9;#K }CEu$Irh$DEgFDICyyШ,๬=}Q=ÚяMcmgA9T^F~ju:#gώ l.*zbDtj, xdVJu͟x#KƕilL6ÑZYڷCai&6Ӭg?I9DskOff#eWבLoMKMs~߳}~_P,}Pό,AɈ|LskY)zNTm(ɡ4קeHƣT(nZx!iZV$U6gr_Addb^:j9Ց28茈٪p"2s+#g:oRqwō%8.\M䡂QsQSB;2|[oC1"ˡY{W 9]I)Ouxy}[jl˾2"oCd>M^Pl>M2mozphZ͵!F9|ŗٓ!MgC7~c2.4>5Jo$xd!M!Mo;Dts|>ӥtX4JőRYڳʡ2"ZZ쌈.=qNFӯI!Mz2!2kV;DtP&Tq{\M aiZW>̧UlF9Dqn}9n4]|d Osq{TO_+u<𙖘d:BqiY Uty<AEOӭRUvqr2 !M{qCd>Mc+e\TK:!g:'ƭ\nt}"iZ:OӲyt ]:8nTs7t#d>Mg&dinIÆϴX5@(n4rh:?~eiZ̧i%6|!5w-{(EQhxr2Oq/HtFDW1[ag:wph%%5Igw O8*Oώ3No[.@TK!@dD8!i3tpӝ pqi#9Bq7ŗiMu2K6 #7MgϞ.|ŗƹl.4FӥpW9n4f2 ii~#d>MNxqeUb꼠qi(,}wd>M6ϥ3-\u$FraGIfY=~<Sڛ,tnm<@F/t/qi{2eۚOӯi}b>8n4=5zFb#d>M/ Oӹxs86|[77YZq霼 /O_tB4L#zH7==pͧ{ͧ駺"I,DuFٳa!4sq2Q|y,+:99DqAeh7n]=ͧ5gԗӴ42|nphZ:Ѵ>r2 6vwL6|K*59n4phZ:#d>χͧ{s8_6|M|9nz6$qhNoCd>McP8O1(D}(n4q y4]<,+: a0"2fRi:1¯t}&NWΈllL5;Ǎ[C703;ϭO(ͧꤹ lL99n4]OFӹMO6׽9|n +E 2|:ql䥸q\OCh>~'|n';{CP댈~Ȟ,j˓|"Px8RErLF^ؔ'C3bmc>ƍ ƍG3$.IH uB O6Jα2pur$@:Ț%:ȊP1"- Ztf#0S k# > U[B@fed\d΀x(}52#3#](dMħ#rtFJW$dXtiiFz<1 Y> 3#9_ȈHg*#->JFOpO&p:&c3wwԩO Hόt}G8x HɌWjzJs( G ԥ"DF@ƅH7z )pv!ڑtl!/f\ H R_# 墱9+~e_yM7 ;y^Iu$7Fr|tkB!_xύsys))ħkLkLrDJ@ r}##H!WFr|˟{@f@k\ey㣫/׌ᖡ-  P]W ޛH|G:\ ȼ `22 %\nӿ F?HE6'H 2]Jߴ"xZ'*2o:7 }R;#_˰a 3hPw]wF2j o(FYgrX_2/ M<@fylIa_ l?q#qBd$>*Lt`DEks< n uur[V rz5TzWZz1ا+1K=O{K M~L-\?X~%*DMg0K ϥϥs8 !]cH|=T~Wq#0˭@ۃC}#QI+I*D#qۃ9X~00 .`ݛ%\>1,,o? -[5KHCi;LswnBϡ3]:)ؾV@ޫe^n`. T`[4@%ηK2õHX$]#rSx.~.kR6#+# R7,E`1@Z\FB%q5y5  `"# d6° 3(: ru:kPB*w**w+UB+UVpB;ou+Fg"d*U8&r 5WIHu~2!G9ʂ= ZyLۺqu#TqWgAf < 1y73y^3윆 H|t34An&õщD?r5ĞF=KIW.!$G!mWnFH#%DRdy 'ߴn H((Q @!w nE H_C] !v=LbҮdK\x# = 1)aXg3=x,SX {QlH<+{a"9 ފrVM؈.cqdmoj#X}N%_`NDf@+lHݯW4zOcͱ\wU\V7 $~5Pt1!gV7]858tWHBb_nNȌ.LT]ȸ:oy  ȼZFH'uӺ[#{ *{8]|$$~Ge!Qҭ&4Bla>fc^ǀ+T'Kb6:HIl !Vkw[LP` g2.pR?ko4eCy~!ue0MՈ<'b~i# |E5!57R}\oiɌIƻ!qXyIEm+o_~l:UdJk~u[~W%J8?L騲 Ո~ӄVb%|1_/f#Q}1`91P#,#ڟK:f؟K:/:KrұkI1r/!Dt#K2jԇӘ7FDt|8K2q4!>kYCKΎHhLˆ;ɘ#\`+!alђ:K2Fi,!Y1BDo|d ղA<'#D q1@L0o%#DtIXdѹyM2^~Bnp+ {dѺA$"ʗaf`%sdV1BD94!eIf":k1@nÑ]|%#Dtk%#D̀8w:rI2N}$c/2՗}Ѥ%#D @Fi4!>5 ZI!&#V1BDg$c./Q[YB]IQ-R#eD8|ɑ6Y^Z1@LfINOӨItOiIbZ7=OoD_/>ӏٳ$cTm; aDL8Hbi H|?e6|e%#dr5-!`IY4j'>#M2&#di_fnIW2NM76|['o15 K$ukN(![]Gs_qÙ`I6p`8t60`/U%r=۷tr-mI"UO/jȫ6f2&ۦ b:\7*fL ҅{w541 S_e&2|nϥvj72k9Lƀ^d ȫ/|D)=dL?|u51AL;W7 {& jn&c@^wK3酈ՙL1=g#zfy#5gdX}Hd հLqįL7~:KǶ#|.f72982>=GK*؅LƀLvJ&c@yff2&$f2dP3x~&c@^Sߧ/111 SOk#y}uf2dXXw b:=>Lqā`$Ld ȫݳЍ7bk`Aȫmfb&c%b."?3[n|Ncf2{3uc@mOh:G?Yjkh&cqCns ƥRo&c@.ft3A>]9wיɘ [c:]&cFEç,2d Ե. mߘf2d HDedCuO3ĵ33겇f32vvh&c@eˎi |oi4]?}:换W&cL~ gznƸ7/"3ۈY6zN |abU |%&Z7损N% bz<At:霛ɶ."kZ=^dL?oZ>iyl3v\}!Het=ԍ Jd ԥ6xtA>]_C>3b`&c@52ɘ -`0|~Zqd Hv>ݶGyuٽd ;o̻/ b:]{01 3Ĵy}W}cɘ 3yuEf2&$md H/F0otvA>]1D>]'51 QL dLӹLƀZf2ٺd ɘ N&c@_H_2OI̵lȻ*Wf2&mpZԸF\i_#32- f2]v{d01ALnn&c@mgf2kf&ci41 SݼMq-f2ҰLƀ>dLޝd ȏgu F_F_2] k51 ݞɘ g#d| G1?߻wٵLƀL='by##3Nu]Uu?-3?ū0|!MǀLe1Lq- 3܂ |~iq01 79ot$7|⭙y>dLi\g]7~Z .Oh:dkwp1AL_us޸%yb9D= OK |~)&c@ 632X>]'ÚWVɘ .r1 Z_Tn`# vf2z b&c嵎z߯ |~zfaeL+ɘ uFsF0otŕLƀ{ y,xeB^b&c@epdLI"yui41 ~J zל7LƀxʚdLYd Hif2&$f2$۫VLƀ4Kn"ϭ(e&cF.|kH7~Z$f2dr -hf2&youK3Ĵ."d501 >o\ 3;'f2&.hƭambf&c@vq`&c߼7yk)r1AL6(iY21 n$01 r21 ׽k&cNM 2ç[ bguOY32=vT31ALߒ5=\qZ=d Hխ>]9| §$f2&ku77佚%z֍ |wB&c t6q_dLE#d Hjx&c@Mܷփt]Zd ȫLƀh&ce&c@Z7ĵ421 S?VL=)WA\Zze M1=;]bRW1o\zg(1~IRIT>޿oD/U,d`Cw6"c MZxAkr.:WfBtYL0z! |`!PRԀ_u@AJ^L*..]H/-9uq@m K HbAJ@Y܈DNApFR7'v$(.fkዢn=2l! }HDmiS)0H]*x뛋c.3:hyBUv)ψ^ZH HUC_U}H H|C9-9ƺ Eڂ@ a;B.uxa3a;jS"8#,)5o"= !:Zz#5$\~^Ψg8nWIᤏcD6H~%=)R$|JjH%Ղ8m[G$݄ _o{ $^Fۘ#} V!N7x6U W)PpF1M@tJ]^sO!y# 1[|Ac:ܪt "5 !H"⋇٤󝍵#/è&uܿc)9%%.$vBE§hkG$u32=ÍQ!ru- q~0bͽȖH_{tW)3d!I H;s꓁7C 7C:oQ:QlSd$މ/|_F9\|^|>9$L2) 9q )9O/:̙s.ІD)Ro^:kSD$Q 9a>{lqn Z9t9t w9o_Cz@[Qxtxys,"|'ҹgUYP CP=_@ZwyYw in:Kd~ a2d6,s9)g6R[?]\9w"lS-Y a(Ü0BMDpyU:~ a g \m>iHHBmE:k+lXEJ H\-D/'*}tɇXFtWz _򹠑CF>+4/*ps8خa ms /9W'}36JG9E:2]n=ڂ&_aml)W$ޘW} O j>' ? cM>gֿyFX%>M8Z 1Y3"sL-;^"ם3^f3F\r;:Awt*Ȝzܹ3S6b:٬;ZmWLI̡*p ~9qqg0 SŽ`AnAz'!e3 S] ;:k շXo`@]~LwZž dyS^g0ALϖm#va`@^=>/wĴG. "S{)̝q du2u*ǜ6齜`@dmP`l$ "ޚAy#9:ojw2u~1g0 ΰ{𻘞5,b&6NLus3W}c3}: ~yuײLwXJD^3W?ۦǜަYGALԝ:: bz̮7% Zqg0A\mF d꫈k d[ﲼ8 ȫf3={R71u<ɌLe0c0ALϷ!F=]O)quڛ ȫk d( ȫ/q3럠y㞤 f &32On:3wٖp{' bg`{y33 ԷE1 ]l`@yl1 k`@u#Ml!բьL=ɼqL gT={/ɍH_ z~:bH7t#3ĵX61W߻ :I*32w:3ϧf [B=ީ B0 2VDO[1W_U Zz1.HǴӹ[WGϯzεi n &HDw#7ۈt|f d9=QW}י1 yHD׍i`@ۿp7ĵxmw+#zqJ5~:ݵ|Lլy罯 bzv{dT"Sߗ?mn2 ɝH/Z] wOqӷ7_0AL˴}zϱ ȫg`@ymAtλWygEӷti36=MϾ{bs} wV(f dK- ldx`yuWۭsO}BZ#oK YQ|muiun)2O9m]@^=V bzV% Hew\1={xȫݪ\Ls vںާ%+"?z6\'1e=򘛂>k`@^=3> ?=taθtÂ:_Aaȫnk12XFz'+NytS0 3OXu HSEYX~zZR\'Tf }G`7SG1O0!L\[צl@9]L] N]Uu*çk`@ZS|/^3QT>u;>j=[ܽ:'ӮsO0A\{2g`@,O?#l#32O0 S_uu &i)uO0 oL;3O0 SF0k]7Y㧳|Qbta@eO='lWz-'W!yc`oF\k2O0A^'l21O0 ' +<]ѵ% ѵ[vO0 S>]؛' %|'euqÄyy=€Tn<1} 'nqz{aݜ7 | y#Ţas=# [@ Hݵo`6RZg!7jBnޘ3H휪dA.A_7-f\DJ<܄f  C&n2RIAj&R?.E EM*;o? Qú = f4mZAz?Q3;^V^Z.HDR@v%@ڟ - !)i,Nٓ6Axyk1ycVhMx m$DR]Z d2>Z`DzF7[lAIQ?Ϩ7? )XqǾ=۸h ڻF2¯{xx mg4nJ HdSx#\q^j"- q|nv/jpcn FF1Q Hō"= @`t,))'RRO8%^]tBn&J2DSR"5$|Q:á,h*r>>%dV>C$ 7*i"pJM~icagp{brb%q@b`yb3TrLJa! 0I8q}DcI`P}fu$fH0E>eOIZJ{A[8>GYsβ\)sN5._@ry{RO[  _t\i$$."<9G;\jw A!V`AR:"k:EߥpԀćY%R)NX{8{H<>HN \hPsa9Ѹ=9R_CYPł+(_Ĵi;k% # ظ.%#a9{L OX!x+RO$R.iዎM"% il22\аwDIwnA8t'O@#f?G52)DjHרy\6 IsU2%5=WN~p<kB$^q#/_F_ypyF <"- !d%v 5EF@Ɓ |ʖAr@9Om%SiHZ@ N@+Id3aexs LX:)r<\cJM x,=)ዎ+n}3p,q&lyfkpM>xXP* Oӹ%ۼ@f@b<5/6e _"׍I \а*K"M<"9 q|Ido"O@⯛'{/@-6+tx#[:ZE9r8|Qn>UوH H]J_9Ώ 9 ǠZBT+gT+IALRćpj)U݂p?Wl'x5wk92T.uJ Aa[;ݧOr<$5d]ݼY+@Z A4Za ǽ 8-ٱ-Ӻ-g#x/-iB Ӂ霹R9R̥-ZuҲ>-`vfkqNqTڶэ6҅urKؗ/a"VΉ%LCFo؁r3KO0+R7׎<eRRt1 -~Va|۔>4;ȡLo#כkf[vp+$xww}j>lsJZK?ǣ!F0L(rEU-3 $tO@J@p?LHDtGg=7`@R@}' }0I _Z Ap&  @"0* 0I wGe-dmt]x*F<6L[o~SXڲ @O\H@*7zG7iS0I iDD`F85L @N@Um$1pL(7rG5-s(@)7uڀI)H)e(# ۜl$>pL7|GvG@- $Z. h咀&Z. hRsZKh$Kn$Z. h咀&Z. hRKh$KhT !rI@-4rI@- d$Z. h咀&Z. hRD%M\D%M\*Ph$KhT!rI@-4rIu-dr4rI@-4r@咀&Z. h咀&Z.70$$I>I@OD ܚh}@Nr@(F8GO @nh @K4$r(wZAfM>IR~ &Z$"P2" jIH-5)} &Z$oDOIFOIq>I`4#cVm$<V4. < "P" SO*p ( @i @h$Tzwz"Νq\Ј㒀F4T #$%8. hq@AqI@#Kq\ЈR㒀F4T!$%8. hq@GqI@#KP s(60I uGf5G`\f\D@$ SO*prk=\h@ tjIO  @ujI ,:$TOzAV@+h$K-4rI@-F0Av&Z. hRD%M\D%M\ 0 ]D%M\D˥7-4rI@-4rD%M\D%M\*h$Kh$K2-4rI@-4r@A咀&Z. hRD%M\D%M\*Аh$K:wI@.H\D%M\D˥Kh$KhX2m5ʱXuoBQIhX6AX6^BQIPIh$V*)X X4ʱXeEU_4ʱX%e|&Z9Nhe|R|&Z9̿hc2VF' hc/yVF'@'   H\D%M\D+bi8V*/hXZ6!(V*$V* $Z*T*$V*fbO*bODbMJ,VDbES2 @H U>I@U^L=X2V*/hXoAbMJ,Vy7 h|R|&Z%̿hUbYDXJ*_gҐhT#rI@-4*XBUPIhX U>I@Uç&Z5.hU|R|&Z5@H*U>U>I@U^o $Z*T*$V*/hX2V*J_'ա9*P[F08L@.h7vG@_TաKnz};n۾}mߎ۾omyqw;o~8n~m?~7$ t~ᒀ/\*pc~ᒀ/\K:pK:pI@.HZIO@y":2k' @"P*R#=RrաKХ+Z. %_$ 4/\K:pI@._$ t~ᒀ/\*00pI@. ¥sÅK:pI@. ¥7. %_$ <_$ F%r@B咀&Z. h咀&Z.H\D%M\D˥Kh$]*P咀&Z. h咀&Z.hH\D%M\D˥Kh$KhT` rI@-4rI@-C\D%M\D˥7-4rI@- p&Z$ $|DO*4|DOhvE`T#dֈI=-h FOx*F<pU#' @"P:0a0fJ?~Qߛ}iw;7'Mr-RCW|Co/?v(i/iO+ܿ endstream endobj 668 0 obj << /Alternate /DeviceRGB /N 3 /Length 2596 /Filter /FlateDecode >> stream xwTSϽ7PkhRH H.*1 J"6DTpDQ2(C"QDqpId߼y͛~kg}ֺLX Xňg` lpBF|،l *?Y"1P\8=W%Oɘ4M0J"Y2Vs,[|e92<se'9`2&ctI@o|N6(.sSdl-c(2-yH_/XZ.$&\SM07#1ؙYrfYym";8980m-m(]v^DW~ emi]P`/u}q|^R,g+\Kk)/C_|Rax8t1C^7nfzDp 柇u$/ED˦L L[B@ٹЖX!@~(* {d+} G͋љς}WL$cGD2QZ4 E@@A(q`1D `'u46ptc48.`R0) @Rt CXCP%CBH@Rf[(t CQhz#0 Zl`O828.p|O×X ?:0FBx$ !i@ڐH[EE1PL ⢖V6QP>U(j MFkt,:.FW8c1L&ӎ9ƌaX: rbl1 {{{;}#tp8_\8"Ey.,X%%Gщ1-9ҀKl.oo/O$&'=JvMޞxǥ{=Vs\x ‰N柜>ucKz=s/ol|ϝ?y ^d]ps~:;/;]7|WpQoH!ɻVsnYs}ҽ~4] =>=:`;cܱ'?e~!ańD#G&}'/?^xI֓?+\wx20;5\ӯ_etWf^Qs-mw3+?~O~ endstream endobj 672 0 obj << /Length 703 /Filter /FlateDecode >> stream xڍTmo0_a#/ 4D4i@^5$msN_ PU9ydITIԄ,D@~gUOYX'{Wy ɸc?8RRRGG\j CŁ}׎+@:՛hW}Is9 (7OSxrrޔ n::mᶆSw{E]^ZT;M1(p4~]F(F6dca鼞49'n V|OlHO¾avuA hN70hC#ݑ-e_f?/]5|~F-M>v$cf?f,!:x0ݲW+v~N8OZKBVPe|5_A$ʴaβW]}7ǁ464lWv&8p'_+Z^t4x endstream endobj 669 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (/tmp/RtmpnZmxNj/Rbuild6f0944457700/timeSeries/vignettes/timeSeriesPlot-emaMultiplePlot.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 675 0 R /BBox [0 0 432 432] /Resources << /ProcSet [ /PDF /Text ] /Font << /F2 676 0 R>> /ExtGState << >>/ColorSpace << /sRGB 677 0 R >>>> /Length 16054 /Filter /FlateDecode >> stream xA8r+2YkEr;F@83@AVNpp9ToAWuuu)V|*?|:O2e-ٿ}<|0;[cVuk5ʄ}c*}hټqںs~??[}X .szXϻ2qںr]ڰ?ö O*-%Vx>߽,ILOaeĺ|o_Qn?{9_XSmo[3'm.=J/Sh}@{hnG}zP;}/Ӭ_/oV%f[{,{hO\^@=څh/.ǤF,;^W{{Ǵje?o3~^ZVx{tkpxm"JL'bs[Yk/&كs,p4}!ϞMYj^i}|HB}l&lkטnOf32Ƅ{~4du G] !iH.kٞ)Ⱦ wgr#4Zc#?6r_G>lVGcY7k#/=וD;>[T\W.j/;~螌ٸ 잎z8L٫F{'i߿|liO/l8|q]DekN|q]A~8=zN|\cx4ςXf6n|1|? \!|D>>V@q|lvx=&F@>Vzx0cV'>C=՟^Ղ|[KAav>GvChj8 qmmg'?:ۧ? m?|"}DxO] >|nAu?*D>Vg?ySm,|x9'?'c3_'C}1lj^zY{-b>fG>^ږmUƃ☘ڐϸ;!*& ԆFƚԆfQfsj׆ѱaxl%}`EۧXӉzc|_>g=8A` ·l9ެLA}^6w^qXc 3W@' ƃup||`g69>dUXBK?YMh/]11>^mb|lٯz>6Ώoωx"-Z{a>>3c?|l,x?6qnpzZ_d[{%2?b{Nǝ7S{EG"ljlc_ϊ|҂?>O<syc6>9k@0V|s9ݯh#{>2.t}&*mD"~㖸i>U{1yOo<Ӑ lbߐ/}>~x߸0?ul?{Ǯncs{!+3v>;yō||vc/{Ae5sxgg>x[G>^ߏ|ջ ק 8O̾i@>o9[|ў#;>^;'N/tw+!NٻX;]_xm/=ۡՈ7Ow{vÞk7{`-b6D󓽛"{@_?d,kI,>l{7vKcտ;yZMЄ͜xj;鞑Hϴ{P{ {_Eۏ}u+-Xzb nS {dmv[u 靟C ٻ!CBZ>{7VEQXVlnS>h=`6%`H+E|ZػMYOޝf6F{7d6e'>1W}M>dSZ T!{7dP>{{P;{@{wn׃ ؗ콮g\kҿ5wkLw69'{?V ٻiןꑏ!ˏ{yb7Y.ػ#ٻ#u{?`kbbb,L]ZXX}27{o=b\{#{olqsZ-6*@Q{C+{7+Q[{Wow(C9"˿?_du#[~'{_ِػ'??ٻ+qC,} ^X{amv|\uޫX7{D.[${?7;G>^Gd|ݞ`<ݖ {쮵bٻ!&|<"{7V쿷o}6\{S>{W{/X2{F}ݶ{Xy{[ywwYk'fKol#{2oja#d ͓s|;su~hEdMZ*ٻvS#{o(n,6{&9"+#{Ӈ>}/x{7d?nMblχX;M,Z{;%{Wyػ=vڑ1f#^ީo^ub5w~yB6L8{o7{Ǚf{lεVWjbb%^1^읫d7{O3nfW]a{V-n~|.pB޸Kq"n Z[?S콋eWt?{In~8^>//NU>v|gvC/B'O\+~~A/4t!v|juT8 q>d겋t1zqJgGC/ vEVza]i腆G x ݮFLꅆ/X3-BC`?x;B;x?B|m;C=f0vgzWl l zOegvZE}p>M1=jBG^h~?=u͆x=B-x3#Y^dzC^hRmB>/fz_jH_^hv CI/C;l/áA/> d'&?VZB~Z3;<6jup=ٵMձE juLZҩwR/,]B t KQ _Oxk| z wXcd2Wxz#j|ܓ^w0ٞzw fuxP?^۸B8|[/jiN >{zF{ixƒ }k mrR?[/~ 1yz?^xyϭZC@ПgGbkWB^2E'ԦP/fC?^h=FBF<壠Z7ЎVza ~\;/|ZXf1}a>}x z^X ZqxRߺ;B;?ѻ@-'@/0VR/aB;ރ^ha֛ z:Xa} zjVB|+z(B BV-9^ha̞|^Q/Co =WϢ^h a'оz$B;~vϲz- zul^i -o^i׃|lB1>ţߐU;Fz:fϠqKn Xl +d} ^qk6|z'?A/?z):|lq>eVjuXz8Bk_dF>/@/4/_≏|m?ZQ c#M F^菁PS^6kmaB;! yB;}zCD>YNvz=8ª=~>&>PF zG>^ z=&A/7ׯQ/o> zBGթFQ˃|K 8Nv~Чֽ>zPc :ֿ{lЎ#Z<@/Vz_#Bf66 Zcw^g]#{q?BjqB~})&^lh{<R/4ǵ:6_waŊ]^R을R b\ ~3޹8a d"c"Olds{'e{gR{?Hb̈bs{C이X]{{Hmbو__sw. xػ޹HF]%{'{У3{w[57D;'bJldC}p-Z\MN[H'~@콈{߬|ߡVLaoZwi b'kO"z>U_db-eڜ` g'Y@{tc)2{$xwg3犬G `fC{?t~CAdahsjuUwՖsf N6O^UkC^SN`dJ읂f6{:k.wţZYjuVmh[bsf{"Cػ|dN}?a,J8>YUЈM#-Alε%#wՎk2wGwsd3}zxwډ_m΂Yo{Zu=h\;ZިVXZ`U:V4>;?;VSٻkVǐz'˵5sE]lH}Zw; yu}Gn?3nͤڜmlX}c"^Ⱦ6K}6{׾8bE=d`{Z˳/הvnڀ;6*vZSZz{GmM&~}؍{羇k!wOZ1퐽oW8n {: ڏ;fڧ(h5bvK6OhowCh𿥥|{kO>dY>X;m37{l3aN~NB :/f{{ :fߑ`=3}UKEn,P-x{>hbsf﬽T-ZCwޥeE#{-{}TM:zjuwU[&{׾obd/#wޥUA=Tb7ػx${?6vs2>ϩ}ޙ6{{{d󓽗TiZJ6O~\F9익OsJ``Gb:..6DniݯZzeP [QdO/Xػj?޹+fU2d,U]ڌjuj7{6޹w%bIf7!ػioVI!{o<; ޵7{vC8{)BG>P1d{DuG>6dmvi[`twU '^OƯI/~U'εbwG>޵edɪZw~k{bEVp*:U${>bmz6TD}=7{6!k{ޕ[S qZlZ/{w{obޛ {'/{ lZ޹fFWv'{FmxF!{&/^b:\kuhڝXkuϻ[~~ ihFO1X`OT'pU!\_Ѻ_Ɗ[?YSm@> _?B-ПYR|rmP.6(m\kK @%b<)d=b Rx깋!^,?Q+ðRuvPwFjeⳞيTyFI*on 'Dz[F@A4ʛ7@)C9@ysɛ OnOovӟ:7!?ɛɛC9}0)aͲaȒ7'P%5(i,`LO9 έQ Hv]葝˘ Gvnr5skp-rp9:H{?JR4A I[D@Hz $t8`gzO,qh8T]!) ңUN{C?wU@sDG3m8Τ7\J}욡9%<St5I=:(mqpꌆgˌS*P;D]1v!=s}Ti Em%yp"E%'.* ٔ+4 ` ǡRȋp /zRc6UBCOA\Fy1ҠX99y5 -Nɍ6y>Tjyl/!/-B^5ȋv?v?~zp!/Ƹ>V{h߇ hKa)/Z{Ҟ`cccǡ@^!/"9 /> nO)*J¥U-e Y@^ 6{#ʋ /Z&@hvU&ŲJX7XQ$7C^,5ȋ{XZEK{v{GPiɟE;=~'XB]C,ҞRUJXҞCKYmoC[A^<4R$B^T)Ew_ʋ0觓ZS\4-}8C"J=8Π8988<4<zQS|L3g+Tg@=q9}8JzNR"ǩ-=*i"$!CZ:pBA\KqJA?DlP]vN+Lʡ('poqJ=6&8C~3C-`{¡R%ȅ jᔘ pR+ZR)ڄB<s-C&hP w@$T}95B(C3>/@8w/'ȃcp CZYWT!AB Ψ JTdC>Bz4GbEp$p8rM>mJoqM8:8fUM뢼=ϪOV0[zPAr61Oχ-P0LU\aGrLcrъu|{XGφYT1LUE;U> GTd0cVgF(Pc05Nxχ8V,?0pGϧAa'vtgqG>;U*RY+w0j7|}Tj" *Vl\TQcv]͞A+z[U>NUX{\\BlT#𩷷@*h/|E2W|v~Pq;"T>;;KPy6* km{{M~T> LUjUp6ZqU>PVA}Jt~k8gky|e*_٪2C6j g8蟘<\a:4!{`d}s ɍY\A 뛫o!Y5>YϸMFd5 D֝0Ț[";nfuu6DxD֬!&%曼5:D|=z|6:C"k" d}ZZr@7)@7=<Yw!deYw^dYw/A d=XIdmÀ\YnKdˆ Yk=?Pơ!? 5'DփkɈG{^!_} W4ga f0[X5ΆkDz8 r!֙/շ`ϭ,/c ` J%hI ]d=gͳqNJjR Ɛ@*! Ed=Y\LbB''ZL\=EA'M>$~V=|چzO`#fX͚ /V7V[<XZ X}7 V_z̆-˜wV_z a, /p}L6j[Ĕ,P Շun}!%X͵V߼?g]Rڷ >Va1&\ |.>9YE)JzZV7熰՜nX}ZJz/`2`5aj ;OjjWj VQjƄE gºm}F`CYQjaU spԫZ;1 Pjaf`SY3NLZȬS ;0@f=H:0t%IȬ)ɬ誮H}>Hf} 'pX2kZ5045WY7$$Y}zh32kCf-*Mf 7KaAdCZ`CچYϵC[YUmf}" YO_0k؂r32))vhͬɝ1<Zud ͬ{d|$94ckŬ^Z[YOֳYYkg72k%2.>7Lfҵ梄B-2x0kUYsW1k5h2k>uŬ{dYwcD~V3=,|ÈLf8Ybwd>w7nhh`6 JYk`2kY"@DօED֕5DZNd-CdMMA3"몭)O?f#kZȺEd!Xkb멷WeS!xa^"X2`!V0%F5uz%:^SF&.ܢaj~j-SZ:%V0~oׇ )x2ٰ# eVjvSJHmLpE7>^VnEXm םVWmCX]auUIauma__CXOϦWVV~*X}As+jna`>NX}u67VI``M.X}YsjWj>6n*Y!hj6n1ހÄjoj޿XlsFV_JPn#ltB V_yUKbɶ` /n Xݸ`~}aؠfz` ެb%)X+RK"Xrt]E~ܟ9a,a.y|؄+v- pr`7ys ʹSOL-EL *d^|n^%4V'fMZ1haðaðcaaO*0ps> +#<ðafð~=_}V:"\^1ђ+pdFdf8V"p+5ZrxΕz| 39Jp@fph 1pxI8 "XK ^R+pZ2C2C V)og/ |^b7pxOKbo8B"pE%^a/ e1p7+pdf8xeS7Nj|Áz'8 38dFdf8 *N pZrxNOp@ftHp@fvpE @  #Á  7802p`|#Á  7802p`|#Á  7802p`|#Á  7802p`|3Á  7803p`~3Á  780!2CZ9 3:2C@eFr@ftH+df~%ȴr@H9aVq^9piVNuiV}$ȴr@ftqЏ_Vs$ȴr@fp(iGftH+dFr@fv#3:2CZ9 3;+9EJ!1pʻû ո8%Ȍ*@fvSޅgM2C bwy w+wK+pjbww˕w뗣+pjRŀΚd3 1pw˪ww +pTA 3;9E~e,~ޅ9S-萪 df8绠&|[Y$70_{]I+ z}/_xA/yugzpow#yk!U{ o.?]!`{!z`!z`!m0w??r) endstream endobj 679 0 obj << /Alternate /DeviceRGB /N 3 /Length 2596 /Filter /FlateDecode >> stream xwTSϽ7PkhRH H.*1 J"6DTpDQ2(C"QDqpId߼y͛~kg}ֺLX Xňg` lpBF|،l *?Y"1P\8=W%Oɘ4M0J"Y2Vs,[|e92<se'9`2&ctI@o|N6(.sSdl-c(2-yH_/XZ.$&\SM07#1ؙYrfYym";8980m-m(]v^DW~ emi]P`/u}q|^R,g+\Kk)/C_|Rax8t1C^7nfzDp 柇u$/ED˦L L[B@ٹЖX!@~(* {d+} G͋љς}WL$cGD2QZ4 E@@A(q`1D `'u46ptc48.`R0) @Rt CXCP%CBH@Rf[(t CQhz#0 Zl`O828.p|O×X ?:0FBx$ !i@ڐH[EE1PL ⢖V6QP>U(j MFkt,:.FW8c1L&ӎ9ƌaX: rbl1 {{{;}#tp8_\8"Ey.,X%%Gщ1-9ҀKl.oo/O$&'=JvMޞxǥ{=Vs\x ‰N柜>ucKz=s/ol|ϝ?y ^d]ps~:;/;]7|WpQoH!ɻVsnYs}ҽ~4] =>=:`;cܱ'?e~!ańD#G&}'/?^xI֓?+\wx20;5\ӯ_etWf^Qs-mw3+?~O~ endstream endobj 682 0 obj << /Length 19 /Filter /FlateDecode >> stream x3PHW0Pp2Ac( endstream endobj 686 0 obj << /Length 19 /Filter /FlateDecode >> stream x3PHW0Pp2Ac( endstream endobj 690 0 obj << /Length 517 /Filter /FlateDecode >> stream xmTM0WhK$4Wĕ܀I!$]c;%z|{3cӁ}wxz1Y 9FĸuR1F)|?]G~!߻O֭)$)s]b3HZ  s( 4^}I%xulGjU#BLO"JasjT&-{RE7@7ML)֐s;gk$U, =6M4X*oRR9Mdkɭ$; UPpM*D+68Hspe2W^C6uZ]DӷjwzT} cb@92wHW8ip E޲FJ۔%hjQ>\^_ /13UR~@7/# endstream endobj 694 0 obj << /Length 19 /Filter /FlateDecode >> stream x3PHW0Pp2Ac( endstream endobj 578 0 obj << /Type /ObjStm /N 100 /First 884 /Length 1538 /Filter /FlateDecode >> stream xYo6~_E$,[mu Jͱ3[.~iEcE `㑼xE.hAE.0 0Q -~ C4dIm0>Y A(4%hABcU (B{4+L-K,<*%A /&DBθ $2mtaK W#y O5^GA^cT0s2v-C6 FpicIeG - ZLQ@$أVPxyc%^83 3eˀ\kK &X+ ,B}8hp)6 fg{#({ 2l&po+yz4G !kX; -,a7 VZ{1[ 8170 ؘylF%yUDq@2"BeyeBdZL/B0X_(ø6!?$~Tk@f Xlv|7+!I=bY}yzlY>/.E5+8˫zZySM,r2orYEEj*Y֋ruu1>ɦN*yUL_T,Y#'5XKͤ -jROWXŪWϷ.]i8w%^ 9NFg-v}v`r.N9GGl>kg@3o J 0|?U4Ηyj%限oOz_U&O`0^gUN[x6$\Nhu;V ZQu FoMy\z<lz'hh*'BqQZ[fO'ēWEq.Ū^5GoUY-&,::e}>PghM_[5X5uYd_ޖ֞pRd  ]{rBG9snVؐ4cG%_,-|I{>;4cnߤ/嶆|J>1G>N7S-.D x y8 r猶oOrM9 ~9g匮rprX~IԣB2//d=|(ƚQ5vwŘy lN8(W9_s `[8[9y{;gjaivHf`/#n޺:A8ڹ-5OMq~SMqjjJW\Q{,$} E|ﺓo"~ EPd}|">E*oHG9(N`nmԣHPE-G!nCHHWV&'0fyP>_0Qjǚp!155 H1>vҰ̈pM endstream endobj 699 0 obj << /Length 466 /Filter /FlateDecode >> stream xmS=0 +4EK+CAqبܴ5M9H7~|$)ˆg> stream xڽX[o6~ϯڨŒKh@vŠ=0l-V~")Ɏ.ICM+oW7^d"ƨ,-B=bjGFVZBD!>qʷ0m;nf|E|Áȧ- K\e5sǗ!M樇ƨ j,fLpBBrmE7((~2 *j0E{PeZ?m%Zl'}js1 hxeYWj" Q"wF5ҐiE?ZW0[xp`-(!͓.,?dƋwk]\yU m[^.m#Lv\H%(ZY("5պ&Oκ wh;~7b/*lhnZ-zeg"6<DqȥCL xl_׏,~=6O{w%oTK[UV'1}G~_:RQҖa~W  ޭIϘ!BOǘ-kDzOLT4ML|n^5j{%Ǒt٦˵ne.bA+QL%] ֖ U3R2Ǥd"]^֬`>ʦUn0o1 >w/{_?2u2t[$; >ۇbNd<;817 ZMwtBuㅾWEv< ꝍ`:ig6RCU;݌_Vh(y a=M'F7ǚ}S0ڽh7h;wIf|ʳ 7;(IˀxBa7oaޚlv'F@ܙ5%=-R*3+0J+>s|.QW\2sh9ul8zC udZd֣mͿG^@wQ[|HQeGg%WLK endstream endobj 710 0 obj << /Length 128 /Filter /FlateDecode >> stream xu A <ŔZ\.ɮJ߿<A0W6$[Шs4é;q4>Z/~_r3/vW]ٓ% ̕Sp ٢̏u&*=&( endstream endobj 707 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (/tmp/RtmpnZmxNj/Rbuild6f0944457700/timeSeries/vignettes/timeSeriesPlot-marginsPlot.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 713 0 R /BBox [0 0 432 432] /Resources << /ProcSet [ /PDF /Text ] /Font << /F2 714 0 R/F3 715 0 R>> /ExtGState << >>/ColorSpace << /sRGB 716 0 R >>>> /Length 833 /Filter /FlateDecode >> stream xWn@}Wj2!MVz y@6D@~~gMpkϞ9p+D7pq1dA^]_? 08\>2.r4 Gf+ځT6*gTvJ5S7(eviW@d#";}-;pR\*h V@>B~7u5O|B1:5=|@_wTeY̙@AuT u-m)8:K߂xlk6tkDiA:F41"bj"4e"IŠS %/wn;lΒk~OeR;f+-GKk;b O*F,?BP10}Y=&>U!& Rx"ϻ~isR:MD[c!;7T>C ף>pB8;ZNo s&F qppԬLyivUҵE+)u#$ wbՃU#QZjU$9^lHU&9q"p:"-zDOSs㬫"XmcGIm8Ļy薾VGyЌ}?G+–},K9tYTf5UeexKJ۲Zٺ w ߐ杍abkS [VڜzMSnEy}.ixzUUЧ>#Бs?a=r Yc!xu&ҿ;^s ԋ͋ʊ"c kӨ?˞ endstream endobj 718 0 obj << /Alternate /DeviceRGB /N 3 /Length 2596 /Filter /FlateDecode >> stream xwTSϽ7PkhRH H.*1 J"6DTpDQ2(C"QDqpId߼y͛~kg}ֺLX Xňg` lpBF|،l *?Y"1P\8=W%Oɘ4M0J"Y2Vs,[|e92<se'9`2&ctI@o|N6(.sSdl-c(2-yH_/XZ.$&\SM07#1ؙYrfYym";8980m-m(]v^DW~ emi]P`/u}q|^R,g+\Kk)/C_|Rax8t1C^7nfzDp 柇u$/ED˦L L[B@ٹЖX!@~(* {d+} G͋љς}WL$cGD2QZ4 E@@A(q`1D `'u46ptc48.`R0) @Rt CXCP%CBH@Rf[(t CQhz#0 Zl`O828.p|O×X ?:0FBx$ !i@ڐH[EE1PL ⢖V6QP>U(j MFkt,:.FW8c1L&ӎ9ƌaX: rbl1 {{{;}#tp8_\8"Ey.,X%%Gщ1-9ҀKl.oo/O$&'=JvMޞxǥ{=Vs\x ‰N柜>ucKz=s/ol|ϝ?y ^d]ps~:;/;]7|WpQoH!ɻVsnYs}ҽ~4] =>=:`;cܱ'?e~!ańD#G&}'/?^xI֓?+\wx20;5\ӯ_etWf^Qs-mw3+?~O~ endstream endobj 722 0 obj << /Length 178 /Filter /FlateDecode >> stream x]P aJWluҡzۏ;E}^FZf4@Y +u1kESI3\SIqyV9FMT 팵Hl[aC71]k }m _;a7fj#(^F5 V?m endstream endobj 719 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (/tmp/RtmpnZmxNj/Rbuild6f0944457700/timeSeries/vignettes/characterTableFig.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 724 0 R /BBox [0 0 432 432] /Resources << /ProcSet [ /PDF /Text ] /Font << /F3 725 0 R/F4 726 0 R/F6 727 0 R>> /ExtGState << >>>> /Length 29175 >> stream q Q q BT 0.000 0.000 0.000 rg /F3 1 Tf 14.00 0.00 -0.00 14.00 172.98 397.45 Tm (Table of Characters) Tj ET Q q 73.44 73.44 328.32 299.52 re W n BT 0.000 0.000 0.000 rg /F6 1 Tf 8.00 0.00 -0.00 8.00 122.60 342.74 Tm ( ) Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 122.60 342.74 Tm ( ) Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 160.27 340.12 Tm (!) Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 160.27 340.12 Tm (!) Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 196.75 339.92 Tm (") Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 196.75 339.92 Tm (") Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 235.60 340.11 Tm (#) Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 235.60 340.11 Tm (#) Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 273.40 339.91 Tm ($) Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 273.40 339.91 Tm ($) Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 310.27 340.26 Tm (%) Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 310.27 340.26 Tm (%) Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 348.49 340.17 Tm (&) Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 348.49 340.17 Tm (&) Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 387.84 340.81 Tm (') Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 387.84 340.81 Tm (') Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 122.27 331.25 Tm (\() Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 122.27 331.25 Tm (\() Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 160.27 331.25 Tm (\)) Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 160.27 331.25 Tm (\)) Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 197.60 330.44 Tm (*) Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 197.60 330.44 Tm (*) Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 235.40 331.05 Tm (+) Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 235.40 331.05 Tm (+) Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 274.60 333.37 Tm (,) Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 274.60 333.37 Tm (,) Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 311.40 331.09 Tm (-) Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 311.40 331.09 Tm (-) Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 350.60 332.87 Tm (.) Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 350.60 332.87 Tm (.) Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 388.49 330.67 Tm (/) Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 388.49 330.67 Tm (/) Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 121.60 320.93 Tm (0) Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 121.60 320.93 Tm (0) Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 159.60 320.92 Tm (1) Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 159.60 320.92 Tm (1) Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 197.60 320.87 Tm (2) Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 197.60 320.87 Tm (2) Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 235.60 320.93 Tm (3) Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 235.60 320.93 Tm (3) Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 273.60 320.87 Tm (4) Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 273.60 320.87 Tm (4) Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 311.60 320.91 Tm (5) Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 311.60 320.91 Tm (5) Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 349.60 320.93 Tm (6) Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 349.60 320.93 Tm (6) Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 387.60 320.99 Tm (7) Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 387.60 320.99 Tm (7) Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 121.60 311.37 Tm (8) Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 121.60 311.37 Tm (8) Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 159.60 311.38 Tm (9) Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 159.60 311.38 Tm (9) Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 198.49 312.28 Tm (:) Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 198.49 312.28 Tm (:) Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 236.49 312.82 Tm (;) Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 236.49 312.82 Tm (;) Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 273.40 311.96 Tm (<) Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 273.40 311.96 Tm (<) Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 311.40 311.93 Tm (=) Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 311.40 311.93 Tm (=) Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 349.40 311.96 Tm (>) Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 349.40 311.96 Tm (>) Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 387.82 311.37 Tm (?) Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 387.82 311.37 Tm (?) Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 121.40 302.59 Tm (@) Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 121.40 302.59 Tm (@) Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 158.71 301.80 Tm (A) Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 158.71 301.80 Tm (A) Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 196.93 301.80 Tm (B) Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 196.93 301.80 Tm (B) Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 234.71 301.80 Tm (C) Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 234.71 301.80 Tm (C) Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 273.15 301.74 Tm (D) Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 273.15 301.74 Tm (D) Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 311.16 301.80 Tm (E) Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 311.16 301.80 Tm (E) Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 348.55 301.80 Tm (F) Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 348.55 301.80 Tm (F) Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 387.19 301.80 Tm (G) Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 387.19 301.80 Tm (G) Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 120.71 292.23 Tm (H) Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 120.71 292.23 Tm (H) Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 160.27 292.23 Tm (I) Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 160.27 292.23 Tm (I) Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 197.08 292.24 Tm (J) Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 197.08 292.24 Tm (J) Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 234.71 292.23 Tm (K) Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 234.71 292.23 Tm (K) Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 272.86 292.17 Tm (L) Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 272.86 292.17 Tm (L) Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 310.04 292.23 Tm (M) Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 310.04 292.23 Tm (M) Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 348.71 292.26 Tm (N) Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 348.71 292.26 Tm (N) Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 386.71 292.25 Tm (O) Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 386.71 292.25 Tm (O) Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 120.53 282.67 Tm (P) Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 120.53 282.67 Tm (P) Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 158.64 282.69 Tm (Q) Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 158.64 282.69 Tm (Q) Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 197.38 282.67 Tm (R) Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 197.38 282.67 Tm (R) Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 235.23 282.67 Tm (S) Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 235.23 282.67 Tm (S) Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 273.16 282.67 Tm (T) Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 273.16 282.67 Tm (T) Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 310.84 282.67 Tm (U) Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 310.84 282.67 Tm (U) Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 349.84 284.29 Tm (V) Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 349.84 284.29 Tm (V) Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 386.53 282.61 Tm (W) Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 386.53 282.61 Tm (W) Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 121.02 273.11 Tm (X) Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 121.02 273.11 Tm (X) Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 158.42 273.06 Tm (Y) Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 158.42 273.06 Tm (Y) Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 197.16 273.11 Tm (Z) Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 197.16 273.11 Tm (Z) Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 236.27 273.72 Tm ([) Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 236.27 273.72 Tm ([) Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 272.15 273.85 Tm (\\) Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 272.15 273.85 Tm (\\) Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 312.27 273.72 Tm (]) Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 312.27 273.72 Tm (]) Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 348.97 273.10 Tm (^) Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 348.97 273.10 Tm (^) Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 387.60 276.60 Tm (_) Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 387.60 276.60 Tm (_) Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 121.60 259.04 Tm (`) Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 121.60 259.04 Tm (`) Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 159.08 264.31 Tm (a) Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 159.08 264.31 Tm (a) Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 197.40 264.16 Tm (b) Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 197.40 264.16 Tm (b) Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 235.40 265.16 Tm (c) Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 235.40 265.16 Tm (c) Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 273.62 263.35 Tm (d) Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 273.62 263.35 Tm (d) Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 311.84 264.30 Tm (e) Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 311.84 264.30 Tm (e) Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 349.52 264.44 Tm (f) Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 349.52 264.44 Tm (f) Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 387.96 265.14 Tm (g) Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 387.96 265.14 Tm (g) Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 121.19 255.42 Tm (h) Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 121.19 255.42 Tm (h) Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 160.28 254.73 Tm (i) Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 160.28 254.73 Tm (i) Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 197.19 255.57 Tm (j) Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 197.19 255.57 Tm (j) Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 235.40 254.67 Tm (k) Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 235.40 254.67 Tm (k) Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 273.40 253.78 Tm (l) Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 273.40 253.78 Tm (l) Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 311.30 255.56 Tm (m) Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 311.30 255.56 Tm (m) Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 349.52 254.71 Tm (n) Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 349.52 254.71 Tm (n) Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 387.40 254.75 Tm (o) Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 387.40 254.75 Tm (o) Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 121.40 245.24 Tm (p) Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 121.40 245.24 Tm (p) Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 159.52 244.42 Tm (q) Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 159.52 244.42 Tm (q) Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 197.40 246.03 Tm (r) Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 197.40 246.03 Tm (r) Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 235.19 245.19 Tm (s) Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 235.19 245.19 Tm (s) Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 273.84 245.18 Tm (t) Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 273.84 245.18 Tm (t) Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 311.30 245.15 Tm (u) Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 311.30 245.15 Tm (u) Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 348.75 244.85 Tm (v) Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 348.75 244.85 Tm (v) Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 386.86 245.18 Tm (w) Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 386.86 245.18 Tm (w) Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 121.63 235.38 Tm (x) Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 121.63 235.38 Tm (x) Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 158.86 236.46 Tm (y) Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 158.86 236.46 Tm (y) Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 197.62 235.42 Tm (z) Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 197.62 235.42 Tm (z) Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 235.68 235.58 Tm ({) Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 235.68 235.58 Tm ({) Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 274.80 235.89 Tm (|) Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 274.80 235.89 Tm (|) Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 311.68 235.58 Tm (}) Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 311.68 235.58 Tm (}) Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 349.40 235.50 Tm (~) Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 349.40 235.50 Tm (~) Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 389.60 237.54 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 389.60 237.54 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 123.60 227.98 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 123.60 227.98 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 161.60 227.98 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 161.60 227.98 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 199.60 227.98 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 199.60 227.98 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 237.60 227.98 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 237.60 227.98 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 275.60 227.98 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 275.60 227.98 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 313.60 227.98 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 313.60 227.98 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 351.60 227.98 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 351.60 227.98 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 389.60 227.98 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 389.60 227.98 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 123.60 218.42 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 123.60 218.42 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 161.60 218.42 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 161.60 218.42 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 199.60 218.42 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 199.60 218.42 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 237.60 218.42 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 237.60 218.42 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 275.60 218.42 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 275.60 218.42 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 313.60 218.42 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 313.60 218.42 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 351.60 218.42 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 351.60 218.42 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 389.60 218.42 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 389.60 218.42 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 123.60 208.86 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 123.60 208.86 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 161.60 208.86 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 161.60 208.86 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 199.60 208.86 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 199.60 208.86 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 237.60 208.86 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 237.60 208.86 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 275.60 208.86 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 275.60 208.86 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 313.60 208.86 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 313.60 208.86 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 351.60 208.86 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 351.60 208.86 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 389.60 208.86 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 389.60 208.86 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 123.60 199.29 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 123.60 199.29 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 161.60 199.29 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 161.60 199.29 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 199.60 199.29 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 199.60 199.29 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 237.60 199.29 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 237.60 199.29 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 275.60 199.29 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 275.60 199.29 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 313.60 199.29 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 313.60 199.29 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 351.60 199.29 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 351.60 199.29 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 389.60 199.29 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 389.60 199.29 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 120.60 187.04 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 120.60 187.04 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 159.12 186.99 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 159.12 186.99 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 198.61 184.95 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 198.61 184.95 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 235.40 187.17 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 235.40 187.17 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 274.93 187.07 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 274.93 187.07 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 310.75 187.62 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 310.75 187.62 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 349.60 187.76 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 349.60 187.76 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 386.59 187.70 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 386.59 187.70 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 120.59 178.11 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 120.59 178.11 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 158.59 178.17 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 158.59 178.17 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 196.59 178.12 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 196.59 178.12 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 233.43 178.18 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 233.43 178.18 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 271.65 178.18 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 271.65 178.18 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 311.19 176.53 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 311.19 176.53 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 347.65 178.18 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 347.65 178.18 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 387.19 176.70 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 387.19 176.70 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 122.00 166.32 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 122.00 166.32 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 159.40 168.02 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 159.40 168.02 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 197.96 165.82 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 197.96 165.82 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 235.40 168.05 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 235.40 168.05 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 273.40 168.47 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 273.40 168.47 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 310.75 168.49 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 310.75 168.49 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 349.62 167.70 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 349.62 167.70 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 387.76 168.26 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 387.76 168.26 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 121.40 158.93 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 121.40 158.93 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 159.40 158.94 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 159.40 158.94 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 197.40 158.94 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 197.40 158.94 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 235.40 158.92 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 235.40 158.92 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 271.60 160.73 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 271.60 160.73 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 311.19 157.48 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 311.19 157.48 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 347.60 159.06 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 347.60 159.06 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 386.97 158.59 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 386.97 158.59 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 120.31 148.92 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 120.31 148.92 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 158.86 148.73 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 158.86 148.73 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 196.42 148.60 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 196.42 148.60 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 233.65 150.03 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 233.65 150.03 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 272.53 148.85 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 272.53 148.85 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 310.53 148.84 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 310.53 148.84 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 348.31 148.70 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 348.31 148.70 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 386.53 149.44 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 386.53 149.44 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 120.53 140.01 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 120.53 140.01 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 158.75 140.03 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 158.75 140.03 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 196.75 140.53 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 196.75 140.53 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 234.75 140.03 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 234.75 140.03 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 272.75 140.03 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 272.75 140.03 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 310.75 140.53 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 310.75 140.53 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 348.75 140.04 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 348.75 140.04 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 386.75 139.92 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 386.75 139.92 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 120.53 129.66 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 120.53 129.66 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 158.75 129.55 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 158.75 129.55 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 196.44 129.73 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 196.44 129.73 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 234.44 129.71 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 234.44 129.71 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 272.04 128.49 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 272.04 128.49 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 310.31 129.75 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 310.31 129.75 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 349.40 128.83 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 349.40 128.83 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 388.60 130.27 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 388.60 130.27 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 120.75 121.63 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 120.75 121.63 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 159.19 120.97 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 159.19 120.97 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 197.19 120.88 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 197.19 120.88 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 233.43 120.83 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 233.43 120.83 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 271.65 120.79 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 271.65 120.79 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 311.19 119.13 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 311.19 119.13 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 347.65 120.83 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 347.65 120.83 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 387.19 119.30 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 387.19 119.30 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 121.62 110.24 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 121.62 110.24 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 160.28 111.03 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 160.28 111.03 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 196.44 110.62 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 196.44 110.62 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 234.44 110.58 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 234.44 110.58 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 272.46 109.36 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 272.46 109.36 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 310.75 110.65 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 310.75 110.65 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 350.06 110.69 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 350.06 110.69 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 388.06 109.86 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 388.06 109.86 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 122.06 101.13 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 122.06 101.13 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 160.06 100.28 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 160.06 100.28 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 198.06 100.28 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 198.06 100.28 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 236.06 100.28 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 236.06 100.28 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 273.62 100.30 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 273.62 100.30 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 311.62 100.26 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 311.62 100.26 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 349.62 100.22 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 349.62 100.22 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 387.62 100.26 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 387.62 100.26 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 123.60 94.10 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 123.60 94.10 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 160.28 91.90 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 160.28 91.90 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 198.50 90.86 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 198.50 90.86 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 234.86 90.77 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 234.86 90.77 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 272.86 90.55 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 272.86 90.55 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 310.86 90.76 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 310.86 90.76 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 350.06 91.56 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 350.06 91.56 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 388.06 90.74 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 388.06 90.74 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 122.06 82.00 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 122.06 82.00 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 160.06 81.15 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 160.06 81.15 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 198.06 81.15 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 198.06 81.15 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 236.06 81.15 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 236.06 81.15 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 273.62 81.17 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 273.62 81.17 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 311.62 81.13 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 311.62 81.13 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 349.62 81.09 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 349.62 81.09 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 389.60 84.53 Tm () Tj ET BT /F6 1 Tf 8.00 0.00 -0.00 8.00 389.60 84.53 Tm () Tj ET BT /F4 1 Tf 8.00 0.00 -0.00 8.00 121.38 359.13 Tm (0) Tj ET BT /F4 1 Tf 8.00 0.00 -0.00 8.00 159.38 359.05 Tm (1) Tj ET BT /F4 1 Tf 8.00 0.00 -0.00 8.00 197.38 359.05 Tm (2) Tj ET BT /F4 1 Tf 8.00 0.00 -0.00 8.00 235.38 359.13 Tm (3) Tj ET BT /F4 1 Tf 8.00 0.00 -0.00 8.00 273.38 359.05 Tm (4) Tj ET BT /F4 1 Tf 8.00 0.00 -0.00 8.00 311.38 359.19 Tm (5) Tj ET BT /F4 1 Tf 8.00 0.00 -0.00 8.00 349.38 359.13 Tm (6) Tj ET BT /F4 1 Tf 8.00 0.00 -0.00 8.00 387.38 359.11 Tm (7) Tj ET BT /F4 1 Tf 8.00 0.00 -0.00 8.00 83.38 339.93 Tm (4) Tj ET BT /F4 1 Tf 8.00 0.00 -0.00 8.00 83.38 330.50 Tm (5) Tj ET BT /F4 1 Tf 8.00 0.00 -0.00 8.00 83.38 320.88 Tm (6) Tj ET BT /F4 1 Tf 8.00 0.00 -0.00 8.00 83.38 311.30 Tm (7) Tj ET BT /F4 1 Tf 8.00 0.00 -0.00 8.00 81.15 301.75 Tm (10) Tj ET BT /F4 1 Tf 8.00 0.00 -0.00 8.00 81.15 292.11 Tm (11) Tj ET BT /F4 1 Tf 8.00 0.00 -0.00 8.00 81.15 282.55 Tm (12) Tj ET BT /F4 1 Tf 8.00 0.00 -0.00 8.00 81.15 273.06 Tm (13) Tj ET BT /F4 1 Tf 8.00 0.00 -0.00 8.00 81.15 263.42 Tm (14) Tj ET BT /F4 1 Tf 8.00 0.00 -0.00 8.00 81.15 253.94 Tm (15) Tj ET BT /F4 1 Tf 8.00 0.00 -0.00 8.00 81.15 244.37 Tm (16) Tj ET BT /F4 1 Tf 8.00 0.00 -0.00 8.00 81.15 234.73 Tm (17) Tj ET BT /F4 1 Tf 8.00 0.00 -0.00 8.00 81.15 225.25 Tm (20) Tj ET BT /F4 1 Tf 8.00 0.00 -0.00 8.00 81.15 215.61 Tm (21) Tj ET BT /F4 1 Tf 8.00 0.00 -0.00 8.00 81.15 206.04 Tm (22) Tj ET BT /F4 1 Tf 8.00 0.00 -0.00 8.00 81.15 196.56 Tm (23) Tj ET BT /F4 1 Tf 8.00 0.00 -0.00 8.00 81.15 186.92 Tm (24) Tj ET BT /F4 1 Tf 8.00 0.00 -0.00 8.00 81.15 177.43 Tm (25) Tj ET BT /F4 1 Tf 8.00 0.00 -0.00 8.00 81.15 167.87 Tm (26) Tj ET BT /F4 1 Tf 8.00 0.00 -0.00 8.00 81.15 158.23 Tm (27) Tj ET BT /F4 1 Tf 8.00 0.00 -0.00 8.00 81.15 148.74 Tm (30) Tj ET BT /F4 1 Tf 8.00 0.00 -0.00 8.00 81.15 139.18 Tm (31) Tj ET BT /F4 1 Tf 8.00 0.00 -0.00 8.00 81.15 129.61 Tm (32) Tj ET BT /F4 1 Tf 8.00 0.00 -0.00 8.00 81.15 120.05 Tm (33) Tj ET BT /F4 1 Tf 8.00 0.00 -0.00 8.00 81.15 110.49 Tm (34) Tj ET BT /F4 1 Tf 8.00 0.00 -0.00 8.00 81.15 100.92 Tm (35) Tj ET BT /F4 1 Tf 8.00 0.00 -0.00 8.00 81.15 91.36 Tm (36) Tj ET BT /F4 1 Tf 8.00 0.00 -0.00 8.00 81.15 81.80 Tm (37) Tj ET Q endstream endobj 732 0 obj << /Length 173 /Filter /FlateDecode >> stream x]9@ E9L1ƞ5nYtI BH(r//~/ )2 0`!?ǒ,$V TaX5U%_d-\>hɊ[AjV$MLdb_;F۠<ᨙ\0[A6(0Ɣ@+ _= endstream endobj 729 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (/tmp/RtmpnZmxNj/Rbuild6f0944457700/timeSeries/vignettes/colorTableFig.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 734 0 R /BBox [0 0 432 432] /Resources << /ProcSet [ /PDF /Text ] /Font << /F2 735 0 R/F3 736 0 R>> /ExtGState << >>>> /Length 17300 >> stream 1 J 1 j q Q q BT 0.000 0.000 0.000 rg /F3 1 Tf 14.00 0.00 -0.00 14.00 160.63 397.45 Tm [(T) 80 (ab) 10 (le of Color Codes)] TJ ET Q q 59.04 73.44 342.72 299.52 re W n BT 0.000 0.000 0.000 rg /F2 1 Tf 8.00 0.00 -0.00 8.00 82.49 331.40 Tm (0) Tj ET 66.33 301.00 m 77.13 301.00 l 77.13 311.80 l 66.33 311.80 l h f BT /F2 1 Tf 8.00 0.00 -0.00 8.00 82.49 303.59 Tm (1) Tj ET 1.000 0.000 0.000 rg 66.33 273.27 m 77.13 273.27 l 77.13 284.07 l 66.33 284.07 l h f BT 0.000 0.000 0.000 rg /F2 1 Tf 8.00 0.00 -0.00 8.00 82.49 275.85 Tm (2) Tj ET 0.000 0.804 0.000 rg 66.33 245.53 m 77.13 245.53 l 77.13 256.33 l 66.33 256.33 l h f BT 0.000 0.000 0.000 rg /F2 1 Tf 8.00 0.00 -0.00 8.00 82.49 248.20 Tm (3) Tj ET 0.000 0.000 1.000 rg 66.33 217.80 m 77.13 217.80 l 77.13 228.60 l 66.33 228.60 l h f BT 0.000 0.000 0.000 rg /F2 1 Tf 8.00 0.00 -0.00 8.00 82.49 220.39 Tm (4) Tj ET 0.000 1.000 1.000 rg 66.33 190.07 m 77.13 190.07 l 77.13 200.87 l 66.33 200.87 l h f BT 0.000 0.000 0.000 rg /F2 1 Tf 8.00 0.00 -0.00 8.00 82.49 192.79 Tm (5) Tj ET 1.000 0.000 1.000 rg 66.33 162.33 m 77.13 162.33 l 77.13 173.13 l 66.33 173.13 l h f BT 0.000 0.000 0.000 rg /F2 1 Tf 8.00 0.00 -0.00 8.00 82.49 165.00 Tm (6) Tj ET 1.000 1.000 0.000 rg 66.33 134.60 m 77.13 134.60 l 77.13 145.40 l 66.33 145.40 l h f BT 0.000 0.000 0.000 rg /F2 1 Tf 8.00 0.00 -0.00 8.00 82.49 137.25 Tm (7) Tj ET 0.745 0.745 0.745 rg 66.33 106.87 m 77.13 106.87 l 77.13 117.67 l 66.33 117.67 l h f BT 0.000 0.000 0.000 rg /F2 1 Tf 8.00 0.00 -0.00 8.00 82.49 109.53 Tm (8) Tj ET 66.33 79.13 m 77.13 79.13 l 77.13 89.93 l 66.33 89.93 l h f BT /F2 1 Tf 8.00 0.00 -0.00 8.00 82.49 81.80 Tm (9) Tj ET 1.000 0.000 0.000 rg 95.18 328.73 m 105.98 328.73 l 105.98 339.53 l 95.18 339.53 l h f BT 0.000 0.000 0.000 rg /F2 1 Tf 8.00 0.00 -0.00 8.00 109.12 331.40 Tm (10) Tj ET 0.000 0.804 0.000 rg 95.18 301.00 m 105.98 301.00 l 105.98 311.80 l 95.18 311.80 l h f BT 0.000 0.000 0.000 rg /F2 1 Tf 8.00 0.00 -0.00 8.00 109.12 303.59 Tm (11) Tj ET 0.000 0.000 1.000 rg 95.18 273.27 m 105.98 273.27 l 105.98 284.07 l 95.18 284.07 l h f BT 0.000 0.000 0.000 rg /F2 1 Tf 8.00 0.00 -0.00 8.00 109.12 275.85 Tm (12) Tj ET 0.000 1.000 1.000 rg 95.18 245.53 m 105.98 245.53 l 105.98 256.33 l 95.18 256.33 l h f BT 0.000 0.000 0.000 rg /F2 1 Tf 8.00 0.00 -0.00 8.00 109.12 248.20 Tm (13) Tj ET 1.000 0.000 1.000 rg 95.18 217.80 m 105.98 217.80 l 105.98 228.60 l 95.18 228.60 l h f BT 0.000 0.000 0.000 rg /F2 1 Tf 8.00 0.00 -0.00 8.00 109.12 220.39 Tm (14) Tj ET 1.000 1.000 0.000 rg 95.18 190.07 m 105.98 190.07 l 105.98 200.87 l 95.18 200.87 l h f BT 0.000 0.000 0.000 rg /F2 1 Tf 8.00 0.00 -0.00 8.00 109.12 192.73 Tm (15) Tj ET 0.745 0.745 0.745 rg 95.18 162.33 m 105.98 162.33 l 105.98 173.13 l 95.18 173.13 l h f BT 0.000 0.000 0.000 rg /F2 1 Tf 8.00 0.00 -0.00 8.00 109.12 165.00 Tm (16) Tj ET 95.18 134.60 m 105.98 134.60 l 105.98 145.40 l 95.18 145.40 l h f BT /F2 1 Tf 8.00 0.00 -0.00 8.00 109.12 137.19 Tm (17) Tj ET 1.000 0.000 0.000 rg 95.18 106.87 m 105.98 106.87 l 105.98 117.67 l 95.18 117.67 l h f BT 0.000 0.000 0.000 rg /F2 1 Tf 8.00 0.00 -0.00 8.00 109.12 109.53 Tm (18) Tj ET 0.000 0.804 0.000 rg 95.18 79.13 m 105.98 79.13 l 105.98 89.93 l 95.18 89.93 l h f BT 0.000 0.000 0.000 rg /F2 1 Tf 8.00 0.00 -0.00 8.00 109.12 81.80 Tm (19) Tj ET 0.000 0.000 1.000 rg 124.03 328.73 m 134.83 328.73 l 134.83 339.53 l 124.03 339.53 l h f BT 0.000 0.000 0.000 rg /F2 1 Tf 8.00 0.00 -0.00 8.00 137.96 331.40 Tm (20) Tj ET 0.000 1.000 1.000 rg 124.03 301.00 m 134.83 301.00 l 134.83 311.80 l 124.03 311.80 l h f BT 0.000 0.000 0.000 rg /F2 1 Tf 8.00 0.00 -0.00 8.00 137.96 303.59 Tm (21) Tj ET 1.000 0.000 1.000 rg 124.03 273.27 m 134.83 273.27 l 134.83 284.07 l 124.03 284.07 l h f BT 0.000 0.000 0.000 rg /F2 1 Tf 8.00 0.00 -0.00 8.00 137.96 275.85 Tm (22) Tj ET 1.000 1.000 0.000 rg 124.03 245.53 m 134.83 245.53 l 134.83 256.33 l 124.03 256.33 l h f BT 0.000 0.000 0.000 rg /F2 1 Tf 8.00 0.00 -0.00 8.00 137.96 248.20 Tm (23) Tj ET 0.745 0.745 0.745 rg 124.03 217.80 m 134.83 217.80 l 134.83 228.60 l 124.03 228.60 l h f BT 0.000 0.000 0.000 rg /F2 1 Tf 8.00 0.00 -0.00 8.00 137.96 220.39 Tm (24) Tj ET 124.03 190.07 m 134.83 190.07 l 134.83 200.87 l 124.03 200.87 l h f BT /F2 1 Tf 8.00 0.00 -0.00 8.00 137.96 192.73 Tm (25) Tj ET 1.000 0.000 0.000 rg 124.03 162.33 m 134.83 162.33 l 134.83 173.13 l 124.03 173.13 l h f BT 0.000 0.000 0.000 rg /F2 1 Tf 8.00 0.00 -0.00 8.00 137.96 165.00 Tm (26) Tj ET 0.000 0.804 0.000 rg 124.03 134.60 m 134.83 134.60 l 134.83 145.40 l 124.03 145.40 l h f BT 0.000 0.000 0.000 rg /F2 1 Tf 8.00 0.00 -0.00 8.00 137.96 137.19 Tm (27) Tj ET 0.000 0.000 1.000 rg 124.03 106.87 m 134.83 106.87 l 134.83 117.67 l 124.03 117.67 l h f BT 0.000 0.000 0.000 rg /F2 1 Tf 8.00 0.00 -0.00 8.00 137.96 109.53 Tm (28) Tj ET 0.000 1.000 1.000 rg 124.03 79.13 m 134.83 79.13 l 134.83 89.93 l 124.03 89.93 l h f BT 0.000 0.000 0.000 rg /F2 1 Tf 8.00 0.00 -0.00 8.00 137.96 81.80 Tm (29) Tj ET 1.000 0.000 1.000 rg 152.88 328.73 m 163.68 328.73 l 163.68 339.53 l 152.88 339.53 l h f BT 0.000 0.000 0.000 rg /F2 1 Tf 8.00 0.00 -0.00 8.00 166.81 331.40 Tm (30) Tj ET 1.000 1.000 0.000 rg 152.88 301.00 m 163.68 301.00 l 163.68 311.80 l 152.88 311.80 l h f BT 0.000 0.000 0.000 rg /F2 1 Tf 8.00 0.00 -0.00 8.00 166.81 303.66 Tm (31) Tj ET 0.745 0.745 0.745 rg 152.88 273.27 m 163.68 273.27 l 163.68 284.07 l 152.88 284.07 l h f BT 0.000 0.000 0.000 rg /F2 1 Tf 8.00 0.00 -0.00 8.00 166.81 275.93 Tm (32) Tj ET 152.88 245.53 m 163.68 245.53 l 163.68 256.33 l 152.88 256.33 l h f BT /F2 1 Tf 8.00 0.00 -0.00 8.00 166.81 248.20 Tm (33) Tj ET 1.000 0.000 0.000 rg 152.88 217.80 m 163.68 217.80 l 163.68 228.60 l 152.88 228.60 l h f BT 0.000 0.000 0.000 rg /F2 1 Tf 8.00 0.00 -0.00 8.00 166.81 220.46 Tm (34) Tj ET 0.000 0.804 0.000 rg 152.88 190.07 m 163.68 190.07 l 163.68 200.87 l 152.88 200.87 l h f BT 0.000 0.000 0.000 rg /F2 1 Tf 8.00 0.00 -0.00 8.00 166.81 192.73 Tm (35) Tj ET 0.000 0.000 1.000 rg 152.88 162.33 m 163.68 162.33 l 163.68 173.13 l 152.88 173.13 l h f BT 0.000 0.000 0.000 rg /F2 1 Tf 8.00 0.00 -0.00 8.00 166.81 165.00 Tm (36) Tj ET 0.000 1.000 1.000 rg 152.88 134.60 m 163.68 134.60 l 163.68 145.40 l 152.88 145.40 l h f BT 0.000 0.000 0.000 rg /F2 1 Tf 8.00 0.00 -0.00 8.00 166.81 137.26 Tm (37) Tj ET 1.000 0.000 1.000 rg 152.88 106.87 m 163.68 106.87 l 163.68 117.67 l 152.88 117.67 l h f BT 0.000 0.000 0.000 rg /F2 1 Tf 8.00 0.00 -0.00 8.00 166.81 109.53 Tm (38) Tj ET 1.000 1.000 0.000 rg 152.88 79.13 m 163.68 79.13 l 163.68 89.93 l 152.88 89.93 l h f BT 0.000 0.000 0.000 rg /F2 1 Tf 8.00 0.00 -0.00 8.00 166.81 81.80 Tm (39) Tj ET 0.745 0.745 0.745 rg 181.73 328.73 m 192.53 328.73 l 192.53 339.53 l 181.73 339.53 l h f BT 0.000 0.000 0.000 rg /F2 1 Tf 8.00 0.00 -0.00 8.00 195.66 331.40 Tm (40) Tj ET 181.73 301.00 m 192.53 301.00 l 192.53 311.80 l 181.73 311.80 l h f BT /F2 1 Tf 8.00 0.00 -0.00 8.00 195.66 303.59 Tm (41) Tj ET 1.000 0.000 0.000 rg 181.73 273.27 m 192.53 273.27 l 192.53 284.07 l 181.73 284.07 l h f BT 0.000 0.000 0.000 rg /F2 1 Tf 8.00 0.00 -0.00 8.00 195.66 275.85 Tm (42) Tj ET 0.000 0.804 0.000 rg 181.73 245.53 m 192.53 245.53 l 192.53 256.33 l 181.73 256.33 l h f BT 0.000 0.000 0.000 rg /F2 1 Tf 8.00 0.00 -0.00 8.00 195.66 248.20 Tm (43) Tj ET 0.000 0.000 1.000 rg 181.73 217.80 m 192.53 217.80 l 192.53 228.60 l 181.73 228.60 l h f BT 0.000 0.000 0.000 rg /F2 1 Tf 8.00 0.00 -0.00 8.00 195.66 220.39 Tm (44) Tj ET 0.000 1.000 1.000 rg 181.73 190.07 m 192.53 190.07 l 192.53 200.87 l 181.73 200.87 l h f BT 0.000 0.000 0.000 rg /F2 1 Tf 8.00 0.00 -0.00 8.00 195.66 192.73 Tm (45) Tj ET 1.000 0.000 1.000 rg 181.73 162.33 m 192.53 162.33 l 192.53 173.13 l 181.73 173.13 l h f BT 0.000 0.000 0.000 rg /F2 1 Tf 8.00 0.00 -0.00 8.00 195.66 165.00 Tm (46) Tj ET 1.000 1.000 0.000 rg 181.73 134.60 m 192.53 134.60 l 192.53 145.40 l 181.73 145.40 l h f BT 0.000 0.000 0.000 rg /F2 1 Tf 8.00 0.00 -0.00 8.00 195.66 137.19 Tm (47) Tj ET 0.745 0.745 0.745 rg 181.73 106.87 m 192.53 106.87 l 192.53 117.67 l 181.73 117.67 l h f BT 0.000 0.000 0.000 rg /F2 1 Tf 8.00 0.00 -0.00 8.00 195.66 109.53 Tm (48) Tj ET 181.73 79.13 m 192.53 79.13 l 192.53 89.93 l 181.73 89.93 l h f BT /F2 1 Tf 8.00 0.00 -0.00 8.00 195.66 81.80 Tm (49) Tj ET 1.000 0.000 0.000 rg 210.58 328.73 m 221.38 328.73 l 221.38 339.53 l 210.58 339.53 l h f BT 0.000 0.000 0.000 rg /F2 1 Tf 8.00 0.00 -0.00 8.00 224.51 331.40 Tm (50) Tj ET 0.000 0.804 0.000 rg 210.58 301.00 m 221.38 301.00 l 221.38 311.80 l 210.58 311.80 l h f BT 0.000 0.000 0.000 rg /F2 1 Tf 8.00 0.00 -0.00 8.00 224.51 303.66 Tm (51) Tj ET 0.000 0.000 1.000 rg 210.58 273.27 m 221.38 273.27 l 221.38 284.07 l 210.58 284.07 l h f BT 0.000 0.000 0.000 rg /F2 1 Tf 8.00 0.00 -0.00 8.00 224.51 275.93 Tm (52) Tj ET 0.000 1.000 1.000 rg 210.58 245.53 m 221.38 245.53 l 221.38 256.33 l 210.58 256.33 l h f BT 0.000 0.000 0.000 rg /F2 1 Tf 8.00 0.00 -0.00 8.00 224.51 248.20 Tm (53) Tj ET 1.000 0.000 1.000 rg 210.58 217.80 m 221.38 217.80 l 221.38 228.60 l 210.58 228.60 l h f BT 0.000 0.000 0.000 rg /F2 1 Tf 8.00 0.00 -0.00 8.00 224.51 220.46 Tm (54) Tj ET 1.000 1.000 0.000 rg 210.58 190.07 m 221.38 190.07 l 221.38 200.87 l 210.58 200.87 l h f BT 0.000 0.000 0.000 rg /F2 1 Tf 8.00 0.00 -0.00 8.00 224.51 192.79 Tm (55) Tj ET 0.745 0.745 0.745 rg 210.58 162.33 m 221.38 162.33 l 221.38 173.13 l 210.58 173.13 l h f BT 0.000 0.000 0.000 rg /F2 1 Tf 8.00 0.00 -0.00 8.00 224.51 165.00 Tm (56) Tj ET 210.58 134.60 m 221.38 134.60 l 221.38 145.40 l 210.58 145.40 l h f BT /F2 1 Tf 8.00 0.00 -0.00 8.00 224.51 137.32 Tm (57) Tj ET 1.000 0.000 0.000 rg 210.58 106.87 m 221.38 106.87 l 221.38 117.67 l 210.58 117.67 l h f BT 0.000 0.000 0.000 rg /F2 1 Tf 8.00 0.00 -0.00 8.00 224.51 109.53 Tm (58) Tj ET 0.000 0.804 0.000 rg 210.58 79.13 m 221.38 79.13 l 221.38 89.93 l 210.58 89.93 l h f BT 0.000 0.000 0.000 rg /F2 1 Tf 8.00 0.00 -0.00 8.00 224.51 81.80 Tm (59) Tj ET 0.000 0.000 1.000 rg 239.42 328.73 m 250.22 328.73 l 250.22 339.53 l 239.42 339.53 l h f BT 0.000 0.000 0.000 rg /F2 1 Tf 8.00 0.00 -0.00 8.00 253.36 331.40 Tm (60) Tj ET 0.000 1.000 1.000 rg 239.42 301.00 m 250.22 301.00 l 250.22 311.80 l 239.42 311.80 l h f BT 0.000 0.000 0.000 rg /F2 1 Tf 8.00 0.00 -0.00 8.00 253.36 303.66 Tm (61) Tj ET 1.000 0.000 1.000 rg 239.42 273.27 m 250.22 273.27 l 250.22 284.07 l 239.42 284.07 l h f BT 0.000 0.000 0.000 rg /F2 1 Tf 8.00 0.00 -0.00 8.00 253.36 275.93 Tm (62) Tj ET 1.000 1.000 0.000 rg 239.42 245.53 m 250.22 245.53 l 250.22 256.33 l 239.42 256.33 l h f BT 0.000 0.000 0.000 rg /F2 1 Tf 8.00 0.00 -0.00 8.00 253.36 248.20 Tm (63) Tj ET 0.745 0.745 0.745 rg 239.42 217.80 m 250.22 217.80 l 250.22 228.60 l 239.42 228.60 l h f BT 0.000 0.000 0.000 rg /F2 1 Tf 8.00 0.00 -0.00 8.00 253.36 220.46 Tm (64) Tj ET 239.42 190.07 m 250.22 190.07 l 250.22 200.87 l 239.42 200.87 l h f BT /F2 1 Tf 8.00 0.00 -0.00 8.00 253.36 192.73 Tm (65) Tj ET 1.000 0.000 0.000 rg 239.42 162.33 m 250.22 162.33 l 250.22 173.13 l 239.42 173.13 l h f BT 0.000 0.000 0.000 rg /F2 1 Tf 8.00 0.00 -0.00 8.00 253.36 165.00 Tm (66) Tj ET 0.000 0.804 0.000 rg 239.42 134.60 m 250.22 134.60 l 250.22 145.40 l 239.42 145.40 l h f BT 0.000 0.000 0.000 rg /F2 1 Tf 8.00 0.00 -0.00 8.00 253.36 137.26 Tm (67) Tj ET 0.000 0.000 1.000 rg 239.42 106.87 m 250.22 106.87 l 250.22 117.67 l 239.42 117.67 l h f BT 0.000 0.000 0.000 rg /F2 1 Tf 8.00 0.00 -0.00 8.00 253.36 109.53 Tm (68) Tj ET 0.000 1.000 1.000 rg 239.42 79.13 m 250.22 79.13 l 250.22 89.93 l 239.42 89.93 l h f BT 0.000 0.000 0.000 rg /F2 1 Tf 8.00 0.00 -0.00 8.00 253.36 81.80 Tm (69) Tj ET 1.000 0.000 1.000 rg 268.27 328.73 m 279.07 328.73 l 279.07 339.53 l 268.27 339.53 l h f BT 0.000 0.000 0.000 rg /F2 1 Tf 8.00 0.00 -0.00 8.00 282.21 331.40 Tm (70) Tj ET 1.000 1.000 0.000 rg 268.27 301.00 m 279.07 301.00 l 279.07 311.80 l 268.27 311.80 l h f BT 0.000 0.000 0.000 rg /F2 1 Tf 8.00 0.00 -0.00 8.00 282.21 303.59 Tm (71) Tj ET 0.745 0.745 0.745 rg 268.27 273.27 m 279.07 273.27 l 279.07 284.07 l 268.27 284.07 l h f BT 0.000 0.000 0.000 rg /F2 1 Tf 8.00 0.00 -0.00 8.00 282.21 275.85 Tm (72) Tj ET 268.27 245.53 m 279.07 245.53 l 279.07 256.33 l 268.27 256.33 l h f BT /F2 1 Tf 8.00 0.00 -0.00 8.00 282.21 248.20 Tm (73) Tj ET 1.000 0.000 0.000 rg 268.27 217.80 m 279.07 217.80 l 279.07 228.60 l 268.27 228.60 l h f BT 0.000 0.000 0.000 rg /F2 1 Tf 8.00 0.00 -0.00 8.00 282.21 220.39 Tm (74) Tj ET 0.000 0.804 0.000 rg 268.27 190.07 m 279.07 190.07 l 279.07 200.87 l 268.27 200.87 l h f BT 0.000 0.000 0.000 rg /F2 1 Tf 8.00 0.00 -0.00 8.00 282.21 192.79 Tm (75) Tj ET 0.000 0.000 1.000 rg 268.27 162.33 m 279.07 162.33 l 279.07 173.13 l 268.27 173.13 l h f BT 0.000 0.000 0.000 rg /F2 1 Tf 8.00 0.00 -0.00 8.00 282.21 165.00 Tm (76) Tj ET 0.000 1.000 1.000 rg 268.27 134.60 m 279.07 134.60 l 279.07 145.40 l 268.27 145.40 l h f BT 0.000 0.000 0.000 rg /F2 1 Tf 8.00 0.00 -0.00 8.00 282.21 137.25 Tm (77) Tj ET 1.000 0.000 1.000 rg 268.27 106.87 m 279.07 106.87 l 279.07 117.67 l 268.27 117.67 l h f BT 0.000 0.000 0.000 rg /F2 1 Tf 8.00 0.00 -0.00 8.00 282.21 109.53 Tm (78) Tj ET 1.000 1.000 0.000 rg 268.27 79.13 m 279.07 79.13 l 279.07 89.93 l 268.27 89.93 l h f BT 0.000 0.000 0.000 rg /F2 1 Tf 8.00 0.00 -0.00 8.00 282.21 81.80 Tm (79) Tj ET 0.745 0.745 0.745 rg 297.12 328.73 m 307.92 328.73 l 307.92 339.53 l 297.12 339.53 l h f BT 0.000 0.000 0.000 rg /F2 1 Tf 8.00 0.00 -0.00 8.00 311.06 331.40 Tm (80) Tj ET 297.12 301.00 m 307.92 301.00 l 307.92 311.80 l 297.12 311.80 l h f BT /F2 1 Tf 8.00 0.00 -0.00 8.00 311.06 303.66 Tm (81) Tj ET 1.000 0.000 0.000 rg 297.12 273.27 m 307.92 273.27 l 307.92 284.07 l 297.12 284.07 l h f BT 0.000 0.000 0.000 rg /F2 1 Tf 8.00 0.00 -0.00 8.00 311.06 275.93 Tm (82) Tj ET 0.000 0.804 0.000 rg 297.12 245.53 m 307.92 245.53 l 307.92 256.33 l 297.12 256.33 l h f BT 0.000 0.000 0.000 rg /F2 1 Tf 8.00 0.00 -0.00 8.00 311.06 248.20 Tm (83) Tj ET 0.000 0.000 1.000 rg 297.12 217.80 m 307.92 217.80 l 307.92 228.60 l 297.12 228.60 l h f BT 0.000 0.000 0.000 rg /F2 1 Tf 8.00 0.00 -0.00 8.00 311.06 220.46 Tm (84) Tj ET 0.000 1.000 1.000 rg 297.12 190.07 m 307.92 190.07 l 307.92 200.87 l 297.12 200.87 l h f BT 0.000 0.000 0.000 rg /F2 1 Tf 8.00 0.00 -0.00 8.00 311.06 192.73 Tm (85) Tj ET 1.000 0.000 1.000 rg 297.12 162.33 m 307.92 162.33 l 307.92 173.13 l 297.12 173.13 l h f BT 0.000 0.000 0.000 rg /F2 1 Tf 8.00 0.00 -0.00 8.00 311.06 165.00 Tm (86) Tj ET 1.000 1.000 0.000 rg 297.12 134.60 m 307.92 134.60 l 307.92 145.40 l 297.12 145.40 l h f BT 0.000 0.000 0.000 rg /F2 1 Tf 8.00 0.00 -0.00 8.00 311.06 137.26 Tm (87) Tj ET 0.745 0.745 0.745 rg 297.12 106.87 m 307.92 106.87 l 307.92 117.67 l 297.12 117.67 l h f BT 0.000 0.000 0.000 rg /F2 1 Tf 8.00 0.00 -0.00 8.00 311.06 109.53 Tm (88) Tj ET 297.12 79.13 m 307.92 79.13 l 307.92 89.93 l 297.12 89.93 l h f BT /F2 1 Tf 8.00 0.00 -0.00 8.00 311.06 81.80 Tm (89) Tj ET 1.000 0.000 0.000 rg 325.97 328.73 m 336.77 328.73 l 336.77 339.53 l 325.97 339.53 l h f BT 0.000 0.000 0.000 rg /F2 1 Tf 8.00 0.00 -0.00 8.00 339.90 331.40 Tm (90) Tj ET 0.000 0.804 0.000 rg 325.97 301.00 m 336.77 301.00 l 336.77 311.80 l 325.97 311.80 l h f BT 0.000 0.000 0.000 rg /F2 1 Tf 8.00 0.00 -0.00 8.00 339.90 303.66 Tm (91) Tj ET 0.000 0.000 1.000 rg 325.97 273.27 m 336.77 273.27 l 336.77 284.07 l 325.97 284.07 l h f BT 0.000 0.000 0.000 rg /F2 1 Tf 8.00 0.00 -0.00 8.00 339.90 275.93 Tm (92) Tj ET 0.000 1.000 1.000 rg 325.97 245.53 m 336.77 245.53 l 336.77 256.33 l 325.97 256.33 l h f BT 0.000 0.000 0.000 rg /F2 1 Tf 8.00 0.00 -0.00 8.00 339.90 248.20 Tm (93) Tj ET 1.000 0.000 1.000 rg 325.97 217.80 m 336.77 217.80 l 336.77 228.60 l 325.97 228.60 l h f BT 0.000 0.000 0.000 rg /F2 1 Tf 8.00 0.00 -0.00 8.00 339.90 220.46 Tm (94) Tj ET 1.000 1.000 0.000 rg 325.97 190.07 m 336.77 190.07 l 336.77 200.87 l 325.97 200.87 l h f BT 0.000 0.000 0.000 rg /F2 1 Tf 8.00 0.00 -0.00 8.00 339.90 192.73 Tm (95) Tj ET 0.745 0.745 0.745 rg 325.97 162.33 m 336.77 162.33 l 336.77 173.13 l 325.97 173.13 l h f BT 0.000 0.000 0.000 rg /F2 1 Tf 8.00 0.00 -0.00 8.00 339.90 165.00 Tm (96) Tj ET 325.97 134.60 m 336.77 134.60 l 336.77 145.40 l 325.97 145.40 l h f BT /F2 1 Tf 8.00 0.00 -0.00 8.00 339.90 137.26 Tm (97) Tj ET 1.000 0.000 0.000 rg 325.97 106.87 m 336.77 106.87 l 336.77 117.67 l 325.97 117.67 l h f BT 0.000 0.000 0.000 rg /F2 1 Tf 8.00 0.00 -0.00 8.00 339.90 109.53 Tm (98) Tj ET 0.000 0.804 0.000 rg 325.97 79.13 m 336.77 79.13 l 336.77 89.93 l 325.97 89.93 l h f BT 0.000 0.000 0.000 rg /F2 1 Tf 8.00 0.00 -0.00 8.00 339.90 81.80 Tm (99) Tj ET Q endstream endobj 741 0 obj << /Length 182 /Filter /FlateDecode >> stream x];P +:^j{gpn(@@Г4 b71X >xr*@|EfhYYyJ4[Y4M&V5] Bΐ{%}3ٯF0XUk-}tn\ǫ?i@ endstream endobj 738 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (/tmp/RtmpnZmxNj/Rbuild6f0944457700/timeSeries/vignettes/colorPalettes1Fig.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 744 0 R /BBox [0 0 432 432] /Resources << /ProcSet [ /PDF /Text ] /Font << /F2 745 0 R/F3 746 0 R>> /ExtGState << >>/ColorSpace << /sRGB 747 0 R >>>> /Length 37256 /Filter /FlateDecode >> stream xK-9z$_̅ƴzZ# AnTRAп ㋾[~oۿۿ歟o6߆m\/??o7ooMӼ5տ'|?o/o?о6_?~oCm޶<4L2p vK+m52l淡iMKÖ;upҰ? > oYpNy8|[2\f O~*c)6wwDנ,r{[aZy*6o~lzݿK2lSaYi2\V :ml6/Nðop.ےmSvk.yƵLHd0o4Cga3aƘ(_o}4b GHm#lOn</܅6c<lt_FlnaLͩ I6acZ38vƔ2l\ ɋSưoåǰ_\&+ oCWm萾i..2' COyp6py{usE!O@&l`fo_vK퇡ϟ>o 1S~jJ {r~ 0*\ ]0'aɉö pEx=6}#^MHߋ 7cװq-66˿-\y_> c4,Dbb gq .AeCUҰJ[W0؍H{ucԔ|Hn)]s뱑_myK\&4iV22 .g}P4H5OW+,Ȥ7]w殀t+l0|Fmꂋ/N.7 pT36_}c7u'6FS5ccQ&j^~툫yxT1Tֱ Ke6R@/19LLa`ݧ5 eu{Eȿފ7cfr~2Af/=J9<;~rVCl#S/-vr~.s>Rlnc[Ø<Ƣ2lw`@Kk5fh B҆(mm&x@kla+lͯ.n6*Gޑ+yz(Vг\'v@ sR  *486(t|\_.*n-*2WW)v*(9A6у\m1$R)$pL䦟MN!B7zN#Kubʸܞ63ceX*1=Jko{mX6@KM +MX9?Ke!~ &FSy5brCzlFL"Z!f7y~ aZnɢRP7 v3N{=~+'(wfjZei\]m=@L*O(Ы~: g0O[MiZ,uT7VPn졶W4*ybUQP]BxJE*UpjǤh}^LfiLiú 1^`Ceq[9Fm oL4ǚq_F-:nx|2uqCʹ󸲎򸯼1Ǖ}Me_u=dqLDqZsQO\98ధ.Esy #:g}e_qSW].e}]e_uY|woIV!v_vkhp?u3X6:p?yFN`PXy;XN2D>;.@G2q G`PyR[Lou3]p^*0˵? ]Wj<*KMX]G1vue@ti+ `㮲ܯTV]ea#`&,wsqWY;2x渍6V6Ҹtld幫uY+_J6x#V1<0󮝿 3G^9füoV^gʆ>T8Ԃ*hJe)Ԛ-tKVYEd-Zg*%kULRVAY-4֦8N56Y0SNk0]pgONif9rV 6ymF۬ gANmf9rv)6[Y9;s&|gL~^slh76o!zXc΁ցށ!1AQahqhlAA}7fk:Z@SD 4I$f,6{hQ z$S"].F=oGXAb0D(XBk)V2D'^'z7'z9d=/J PN=r>nC͏ P>?܀z c ^ [8nO ЭKt3Pc@7DܒǠ)A<fLkkZ/~Vnw믿wBWֳȨ .2򸯚<*c+SQ[+c(lx<* F E<*c+;>G!O?h_DFc_v=cc fSt_z2*Og<Ϝ8celqS[}_ { xt2/VelikZKyVϤ0Z9m8}el鯌-bSڕc tllr>íc ^B5^V_[žJ6IהB ckI6Vec+v~j߻;6b.ym7[Tb-. ւ;~o?)ckaZxX<Ҹ~[؜,C$i4LK~3[kS̴W ]_n7>lX#J~o\hׂ;> ~opHa,ԯqSV[t038]?[/ #c f.;v?[̱Z`ZdZhZlq@HPXH`HhHpH xH DψuCDK̼kȏu3ޢֶ@iq-<.-z}3<.*D#FԺ"Q CD -4NBQ-8֦EOAÛjӑy̼~7q)C SMp0it S8L pf6=ȹm4!gBNoEuȁä~gRāAߔ{jG5hK!XE?T1;ޘDoOP K%xA m>^;^D}3fk[_͸}LH!ۮWh2l;{8v-]6,UJ.E@3.v] )2XRt1HbK DQDQhan{?vFfT:曕R7k`VKnY1ffv+ȺfNJݒ'Y0݃Y0݃/:8ݕorO]~s[Vue\ZE\<;r\Ao/GjT)yAC`\}p^=>v`&_3neTV!r\~ZF:cjq_ZyVVrUVOI @|,>6f1~rw\cS/~ @t灙wM9rc&*ULh@3SIh68ԂfhZBjM3OK(D !,FԺ"Q CD !4NBQCm>M!6oMGyτ >8e(mc8mz5@#N8s8xs#-9&tVӇB:UU8u3q_7޴j R[C{w Ӡcqj P[xϠ̠׾3] i* E0oɼSDs1bAń" E<#|.V](QDt1bIŔ"-E'EECW ~7fT*uR7+oJ7nY/b ft#̪Vu +1߻%O`7`_r'fô~CH[|Iѕ3 hi݄Ƙj݄j݌k 83ɬÛpe[>G[$} H^x7_'̏C\?@m`]"AuK#[ :wwDK4oc#U߫20u JӰmL^1˘voNmxtg5HtsblA̒ZLL PS*Ӱ̰y勑pM)9,wag- l,yLj m]H&: X_F>|6 WsMȞ;0  @$r`0!v`X0v ofmx7 90Lcɱ黊啱Zl09v:QXǿW c65{biGԳA^2xA}oSEL TO- 1Z0c@kA0CoFjL68}'68W?8N]Ui7 !ڮ͜/By 60^%*@ WyJá*^TںbOu`A*N &ի0Κ¤~y,F9"myK\W< 7ET2ɹMYA4փi^@ĵChm$!FJ%(} 2 ٢ }s ^ǩnijӣ"XVo`A=In PiC%z|@y 1!ڎ$܎xq.6ڕwv7jlStiĿWMrkl9j< }lY}ѵRDUKɚYrN`c-i߫n'ڠyi3$0+CP4 Y^'+mWԴ!.hmvkކ,L0Ms`h:*n\4}7ݟE&lUccI^{UzbzӒaJf%(&m8ȉ8f(()Sf*|BYl>ʬ6>.!@]]\.;c].L=C}>PBfhv3'z Eq:VPE:g袔G2JThK:JT裔OBJ[~$@9CJ1[!}d`L?]Gpsz{JWPz_PʟPz PQz_F`= XG(uG3Lc=cfn7$A e9)̱3`ʳ1hc)SA(SaTLg)O>3L}3L}>0c&>_nNc^δvLsw-`ڻk]KZ"ͻV1޵iuLŴ{X+pX+PZD>ty&[.`c^gsqWX:x}}u/-> E>Vٷm~X+}w/c\X -a#fOjkEŹ5F1VsWkXkYkZk[PwN{'cAĨb1nH:ƌybf߅+2L/ ZL3eL;fLCg|o1MO1m/111ϵ1U&`e(-V&de(mV&0"fؘκ7-^]_Ln/Kѥc ^\ʏ5 0'6l6m6(vb*.Vb.^3J{1뫘ɒe6n6n6o6oc,6^o>Lj`:TM(m>^Ë&]_L.~=fvsgh({txjW-|jF:mЇ~Zp؂}xlA|,_^[03^arGF1o/L=[̱ZbZfZjZnZra!Ę%bВ1jI@[g?#҅1ٷwa*fM9ܼ[{^omk=֒x&D-vZem#kIBk6YK}Ze-}\u@ԦxWm:0K8~7sF69mD g@Nk&9M rfSI"N.E]&8LaDF1iA7-nGFW1sMͽi1zXF}c /~od*1K~ڀ¤v2-3${{1^*hvY; ,E4K-oBr[B-E>+*f U$"JdTb*RV"1$Q$Q*h.rIܬ5JZ/)5_TjXz%܂265ۍhӭ 붛AVn+VwKbrerbtu3.-\?X\#˞;\W^RΗ:5倩VNe利VΘm吩WNu嘩WΙ}I PNIMPΚIPN YbY`Tfkk2*:8qq!JuS T9NDT=JS TA&J5TTE.JuT TI6JTTM>JT TQFZy(JET^E|9f3enJyV.&b2.&b.&b2.&bkb2&=a&}!Fp}Zp1uV3Jj=p`&^k ʞc Z&0{5dט #jc A(a&XLg # 7cAS3ݧ Lzi&4}ZI>My`Oc0ާ5dLiPyUW?N<3J &[<pL\ȹ 3neTW*+riTVÕ}pq[9\y*sW9\y<է&\4++ڄܧ}L~p^N#,f=-X@HPX0^q/O 'Ƭ Qk İbZ?* t̾ 3t-fvsy/ƽޢkE; z%Xk, Y4dZfё΢$kEKJ=Yk-[y>MY"]:ˁ/L=9}rJvI] 0,p^v/șnS ;BNnD.rz/ĈCX{&|pn71]mF}썽읍{HTConw7aj¸}-x6W$Ȏ!ep<,NRiy`,yX| $!Z!JyX\<$AVn<\aA)fW~kSR4qbR{X : | /`00!o0;G]4od{}x{1L_?2b#W..nӆ6~(lʻQ(. E$?DgF(@X4ByJCd/+QQoY 4P{(}"qTSs@}Ԕ~k⚒_z`dFzm"rB4/O$0W"槵 iHWE>vdjڷPI\}x6cb ۓ焏%s0k<|Ew*\༕#C,6rzݕmj=h=h(h-dhoJ?N Vх~)3jqJ.f L48S3նA$&Sztp^L)n̴m8NTSGH0fEBwi`MVv3矏]t-f}WmW]VPMVX=\Q. PB!\Z>" sB̾ 1 V\]\2vylT%ѩHS§*$PUJCU9U%MJTͳP%W%)J{it8@ ̦ - nfR$%ڋiJ/*G@LV1a bL$Y!-/CL\V1y%B,c+Aw4||uh0Xt^!v^Av^avFi#ݶncn7BTpPMxǰ6b]ߋvG ОOf8%1o\(LPrs$2#;Te%?1J.s ]))LRrt$2K D ޲D ȳ4d \jZpnH\&u{sQe 70`L\| qqm|\s/2 }}|Z񭶲H/?]ORS{_.U! >>U8t8&p\p>M<ULZ[[Ywo,*b*b$+b+b 1mwĢAQĢ3_E;2NaepS^aFaFaFbG^bGb y9J|yq:y&hy6iyF7if:hc:xwZ1[C}dqL[Waf7Q38U0xY00]P0ap08e0x i00"fjǂAcA&̄ufvs)c7#n zxB^# :0C R4FpFv`@}ҁJߍJ\g0Uᦠ{= H>j棖 >j 5ZeMy: >ʻV >joM ?2`&#)ZQj8qNrY6ʍ[!N,7CٹrCĹ喈Mg"N/7Fú^݋8u3u]7Ros5׈אט1am 77ػQ0cځ?3쵍7cu4v],x͜"7{h.\,(¹PsbDŊ"EB;.],)Bj2EJ\yLh$8QԻ8I;2>X pwO5>|_;t$݂x1nB<(!q~̀n:vnc=Sterb{Xv??~n=姷*6;KAhO~QeK&] ?1]̽2K9{L/s/t3L?s/t4LOt5kL_t6k Lot7kLt8ELK#-ͽ?JK{ٽv_g0?/ˇOy{o-_KyX}}f+|\@𙱥ę|g"ܺ"$δ-xHýyR/:~Uip9V5P'5R5t'5vN 'FCV1+ĠbJ1l%Rπ ~F$cƝ?1́u3]a2㔙<]gsy/$ǽޒk%= K~% </Iʒ#k%I:K4Y+-yZedZ,]6エM{tL[80ͥBu) s; '@j9 rb{NU$7"-D\ފ8qzy3ˆcl/xeŁ3i Z9#gJ{e}/1]c 5DokF{J~͒do0Lj~IځڤpϨCŌz#hiv\+@"HWd)Yl-Dx"_ n)XIT1Hb'QP"DHS*1 D='z'zG)UMӒ.qIܬ5JZ/)5_TjXg)܂65ˍ[!m7nG?V~`ѯan!Qj(:;L;ڴM1kt5Bs!"c@tg51H"8QD^Gdv|datlU" #̭3(X0 -!=%M)]-f^\AOF2zdAf>"3/ I3>(8x(k̭3tX8^gsqS[}T[yWV7'4+s+2\U2xM4giN zn<,D.,Ap|$0 )(b~&"O^Ǡ8:hcԴ+=kW Lk; ޮw]!Lb:ݕG (Ep+mgqGN l  5WDn+HaUooYIY󥒲LrgM 0;<*H =p ѹ%&/fx qOks+QF{13(:ntEz6mʫPخ7O3/BafރB!]`ebt i%Rbr:G) yhיRڦ^VutP' (S"qTSD_d )7| Fq pnmUk0 lRl4 CvE@(َLMpjM\[-6դ7qP<,6sp\`R B1M(#;y%E[ѢĖ}L{icQJkKVXU;Dj05THh 34!ZiC6\f~o56ފ 6N1qi/hTvsI9ҎL]I5U'ԤSR%:AKUZj 2U hOTTQS~HupPRQugQ55σ#0OP8vsIr -GZ4bH"nQH "E?)Rbu/bKy^H1}Qf ";[X5j~'jkI]es Ⱥ.6 sO\1ws3\2-s+\3w=s#\4Ms\5w]s\6ms \7w}\8K+IPɜ47I{Akv@̲BRvE n /vpCK[ ?pD c OnpEj _pFr ofpGKz pH ^pIˉ P1c0wzܫ3X~|A ^L+x/yf?R+AUBV+U2Z+U"^+Vb(AVf(Vj>(V愲e<@ _%+u1L|=~N f.d4_q>j?S=Li 0+Ĕg SL6"m0eb Ɣj#)F(S``HɎOR1L6b*}/b*}@T:+ nJz]I#)>J i> 7!J!>X[ *E|vl{T)Uh *v1<Q\sUBrOt1|\Gcv3/Sl[$lWej68$&xt6pL)JO0m2ed6)ȴa SB&oDt|m0saG 4Ŗ|Mh5å[VtBvc [t@tPt`pPMxǠĠ1]3)*Bd+pmyJf.\&(Psd2DIe%A9J.]&)9RtdPsYwoYwUL9rٍ%n 7%˛kR7oJ\.}sa ̥Kkӷ0aN\~< }s_r__q2YϷ[X,,&=EG&1`q%G&#'*3.CV͍ z4ghÞ N{V1hmeb1F:I:㌦"-Ρ"-"-N"cve)PĞk{]=;rNa+N+6n##+3;CK=o>8iϖ#1#$-P2& -p2/($-1?LLʑN0|9fz |3YJuA;M*_*@*A!*B1 +CA,+DQL+Eq2`A%亷%^8Yg03`c0 9α3`@1icAT 6pm#;>~00ژa`͘a`u3R^.gvs)=r^ Z %ZE /ުV!>j5{+3k]QdfmfH%3k]Pi 6!`#7 fpAc%n2j;+xžLmg\Y+AY<緝Zlga;+BpHY눃h.n 09p:2s0\bOp I 'ܤ#n!7ĘEb"1j@[g"?#ҁ1㦞7wa:WjSќn˭qZR,ZR5.ZRUUˤ5IT-VZ)-STZjPbǵ7X]:vDXL^N͜Q>9%rN[䤶 Ym)r %ANl˂ٖ9-rn["LmrFdjr`[,8u3|W 㲾ɶ{jZ5Dok90:0;0<0ѸF Ʃ3@m>^;0^n̠>NI,y3H͞"E6 p.&\l(QsbFŎ"!EFKwLג)bz.N-N]$nV}jS|O?݂xnB!o qSp3ssK {p/ {%ok_~(=wE;^j7]]C 3$̝2CI3d̝6C܉3̝:Cz% 9+w!iV f%K)BzAT"f!nVjV_GG;{j+5;r>]ϊ ³ĴA+nL#"ǴB+vL3ǴC+~LC"ȴD+LSȴE+Lcw2!ͱz B<ꄾo>!-Ҫ = ")njG)"*q3Bi9ʱ_5Bѕs߂'–`[|lE8~o!9$N-xGyYR̂9pcw f>0pO'ܧ#!Ęub:1j@[g:?#1㾞wa:HSe ܸ[c-`ZaA$Dy]!kE2 u$Y -XVZd-ZkAXqmwQ]:\$/3S]w;,ӆ8q8v6ȩ|s!'sBng΋0"wSΩ[g0ӕkU}-޵ZB 5*oРc}P{xiy+*f U$"JdTb*RV"1$Q$Q:G? %XFjXxJbRJ p-X+wKnXjbr3v ߻%``_z{0t~J8{?r˞\w& a_n憘aan&憚acnF憜aenf~.;k: Y0`AJ[! Q`X (p 7spw >^S\L.z\qy?R-1S -1S-1 S-2U"S-<2$S-\2&S-|2(S#C|(ZHd;!i,>2cf.{i?MbM.ƣb|M.ƫbM.Ƴb|M.ƻF_mr1 cm0^ gm04&(&Zū1f-̲^p@h?c=njY0kĘf!cƌy6TC63m 2eL1kc1@ }FNX1XM8qapS 8y(4ZmӇC:U(V 8u3h튙4\/޴һ5Bk8s`u`w[ie qi H[xϠ̠׾3M3 n˿Yf.LD4l*TL$ҩHS1ȧb%PL"DDC*!UL%RJ<&4T$[$\g@3O-GJ/M=vFbR:拕Jk V+@WnXfbr+ĺfk"VwKbrerbreU&m~ys4TM_*u3 YШ1+Y 3Im*3gmI3-kę"- WmeҎLk 1s̘9d勑XO ol]h9*-?a>F[;|_x`e}J%(v)bk119#`xc~{sc^8)Oot=s?7 ixgw< NŽwe7 &T=FYaQ3t nf(, 2%ANuC2rkJn6%vm.S]?>hos+dG.ͼ44|=ʚMb@0oXS7/bۓE3o`~羁7|ܾuB( MH.7Rd0[[RgJ1*v)ӊgO:$H!%{*ZP`BjA&c |-p3sp`$HD <2N"cF N&nS bfkfqkgJU \{ޫt_TpVdVׁ v83dj  sb: iW10pѷ1>Q4Ra܊68+"Pw<3/JaқY?%c,X35͠Jb77C!6P.`˾S3ƈLӰdAovnMy) ʵw"σ4$}1Wi۸ (w|{yVj{Wu^{ݽdi bѕhtP=Vs [[TQ~BC+TUo)ˊJpP8/NySYQ-{d|˔U5\Ui]OFt} [Vz>_aё˴1,>|ˬ5)BU.d6 iT0 z +Mݵ|+]Mפy(,42J#75_Fv`|/ě\@IJ ⤀ΙxAz %g)Pj%)QZ%)@QJ%)Q:%)Q*> )p//EGgqKhBC ΁(v SI8 T Hn UX Vhf WIx Xʈ_ |ȇyfJoW^p1^z`|/s\-h7S==LI0Eǔe/SLi6>l0b Gd˔i)?S/Lm6^|+^|`|/\q{?sԽ3g;sؽ39yw}a`s]#Ŝy7л19̹w}mq a.soG?0n>Nˀ^ Ҕ ^F<^]eV=^v;y>ԙ ?j܅/Ÿ~S+̀@KmC1VԮ +~* h|bA`.A`/;[ӈԔ;DYfps>*3'9h4}>dM]gO#/.|C?|DO.|E龏Af^{5bz˗YC4s1R*]1R3*^1RS*_1rs*@1r*A1r&*B1r6*C15SXӽSj0Z:;ta1cV+0XALxl0,aİe#aF F#aF0ÞpA'{ Ó'ߋf'K'3~7G{gwyF 02U"\wa`#]*wW9F]bd%F]b%F?1hwUbDUI  k%Rn2j)7jΠdVK+s//g kiyK+^g_ZyIRϵĈ K+^B>"&ġV+/- p$˭~a5\7\!7\A7\a7Dr"M;䦞sOZ B-p+|<$ <ѲoAˁt,-q M4lٰ6v>J/F A- ,kY$:(Jd͔`ɒ*9WJa"rS~Lh"wKtz6BI'mJ'O*oTV|aG'˓ cA-?$\n9A.!@B76xPL Wm0cnK3_S W[)_8zcтXw4ЗhۍRt0~#-^xA>2<¤M&[3$-oPC%r 6q.6\ PAs"i!#-TcAۭՅۑtjmMWn.-2r8Drk}SuJq\xauyqC\wiQxHNIVJIKfS.0e vM.H%PJR+5JR,5JR-5JRJ+II_|%IPD%IDPd%sU7̥[\\/` bp390OB$)pOB$)OB$)OB%)0PB` !4f?VCI@ { {/GGv 8<^q g?s9s;s=F^ _ ``a%b-\S=\TM"nz0̓W#1vIr{$f7c! X!9+nb:&nb&nb:& l˶l{Ҍm71V(n:\~rA4~7gnb&fnb&fnb&>r_Ãn>t w`ƻm0އ:cO["3{ Y+B`B`Rߢ[zP2lZ`aS4nX>Xs"݂c4>yZ|ku,J~a>8U!b:mڿa{ֆJu:Ԏxxǥ0YDݲzfmU#uIL(4Qq%xʮԟ xO9NUUy!_X/!htB>ئe~Qશ@`@,k4ZYl pDM~OM'֧)wgӇHv;̘Ҁ̗4֥0Xƚ.ޡꍅ~HDїuE~z]eDGAw~`|d7!of'F!iQ(^~X\Zxִi~jDbCNR >1 *r U)#@Re<T]Z](M'1 ?}o .nG\̏x$vFI𢕒M _Th,ZYDe16˂EAڽ0Io\^ûMlԜ4VށϷ21J Ԣ*qJ-*J-"+J-b+1ubԢ+qK-+K$(K,0!+,JڷLz2u`6ALybf4y?$)N2:!"O2$)XO2$)O2$*O2$#*P2%C*XP2-D $)o/1GfyRzť nǴLM״MMNMOM(TWMUQ['R[!DͦQާ&}#Fqf Ġmbm613L+_S~L 3%`p {1cJHeʱd#)0ExQp!U^0Tl:jKmZo`0+G%# fH}Y>s`T0+G.#Z fHڏy}V%EM'3ilA+ "̦~npFǖLǚ/+Ӵ XTٔ}e6q[Myl*SWMy<Ǻ&ұ$\My<&5#boUfSrtj M'34q*t3+஘+䮙+讚+쮛pWNk'a@DU آn ՞C'Z=h90NYC?_"iJvp(VP;ᡴXCduu!ʚET=(V%Q3YZDŵ\|T,{ρtG k)W -ԃNZ۴2j \5B }ksDx h`65@myl61S*v&g̦C]y+mBަ34y^^5t^S4^qZ*HC_nm7J lpjOvȆ:{l:"$jqmҬ5SMK:1mT(`PmS9bCNR >1 *r U)#@Re<T]Z](M' aFGi>Q$.^(]Qh$zNIE[e"핅 Z,AYh- LU+Udo0~~'f/8zEK*'NgHJ^DŽ4xS^WEW&TmWb K[aizT= +ZF r𦀸dy" ,OKkІ >4sx(31noXh!/ޅl~cx4*JFŕW!19F3y58CF(.CD#bDZN0›m8v_Rs`C7`ћ#9b9 kq QeFr\ĀUqvqhqa*iT\Dd+8 xL8߀qU:0n<-@\hϧ1PNPV31׳Yz=U(ɾ^k}MkՑ$,D eXhAtb B RN$ HC>, :> 98G1SKW}i.7FDB/$u+wIntfwy(!74![17_{?K>m9xK_ՌmU;n>:z7Ϋ{Ϋy:B']˿2Q3jt -RQ&'ͮDigEʅ6Z[;!kAZ,[S^ $z6쵷f^i;v4X[\;ɣ*&Y!(mp0B{SĎ:[r0vG-FY 3|LQzNxg10}ȖWglcßi*fVtu^7D7UG(DZa I Й ZNtB.ݣ}0> 7 ς`(^o m[Bі F1$mՐwCYH?$#I*TR C@R)|2iK% !Hbb{AWzWz6WdŽ׊Ag+> X\x cqDМ-GwR&'=ವ}B-B-/܃鲦6&fD'xKd^1bԀ0IC1I #&2!J=$`2_J'Ot* RSl+uLR;\,LR#L- 1eJ])Cm) SfYd}xM9oR{')q3/'sM'muk'Uw'=y˘'%i{٘'#2T'͊Iu{$=0> {\py=q!GH ̖II̥J̴rKÔʹL ҔZΤMIo$qQ__uȔ-2vdn3vDuo歮gsP:G i|U&!\#U`ve0s^? nn)VeM$EIuٺnlPJPB*2R6%WU}7We=Spq';:~|9[4jbXԐ=\{Cȶ@6 re E %&bπm5}f5=ܩ =;z]{7 6wܶþ^_ٴ?}^!\\ureZ";M06Ÿ?}^g"lQ5I\;ЇRt4r2'?M-.ke=v[/ Qvfkq#82sj#z<[k#F#3eG{c|2&ە441:#E-ңSQ9UoА+ XGfg)= Rl5KQk^0/g&j,dQM&c>Snᖶoͣ5N$;acT6 O< ihfʧmbFq~fi;(';sYT=>V? WnVF&lp1tpK-ߺ?3p*z2pҸZ{ A.G-͉bp<׀.4wa5 _8u Ck6ƃ_+O~Xύܡ HN}on)]Av؋Cflnc#Px=DȆE6M}XClNeGXv`e C4_Y|,r2]dR#nnn)u]X"t}c\7e _-obnQ f Z_O)BJ вjڀ,;ܮGzD[Lgd=̡E{Ò@L\EJ%µ Nj`g;߀JmM3kJԓQxYkw|wtKj;&ּPj ;d?of5F;;]8e3]c<T1|Fj ڟًg?ܮ>}.nqak35ٔZlY ,e5AkT4I[4݈PKD5X;5!L:ewʧhc2]OϼtvK@660+z?s e]("~Biޖ4.Y]W|)|MSh6{ySjd`s6u|t9".FvڼFiEl\azFi>ħ5mLU8mm#4%x si;Z(m:Y/\>>?ln81^^67K ˋ.0n -xRӪJë,+D1 1s6j;!>K"gaɑ'259g=<:Ae! ƐYѬOlV/28k w'޴HeQ!:$me|Y{`2GD~L ~LD~MG#D_?-Ooߊc~iMj~f77c<F1_21: (:@CK 6:7;eC?z]7'Hc֕T.S}Ma:5H h/@f9`Gͭ#3v閲ƚPD*[5 XhGkzZ3՚ȅ{2p|lj035 7 hi BKۇl?& nnx5znr }j 08&^'>=ѷ`+0E_RP)@ Bh/D |EX'۵q_y&btK’_cO!ACn I{δwP{cF XOG{g֔'۵SB,R7p{?,w{7`{/$ {7{ { 7x}? nmtO&p]X .0 kn0놾lLkK+w^>^P }<+zmÆ&&}znLm7Wq<[vk49Hr%$uI2IaP*Gc]tI(9ZSRVdpmIZߵ.&ݛ6 ZT~YT~7aUvk4rn+@^궁 $&n \-1yτmNuMƶ|ކiumwcyjn4hR_zS- n~۽V<_n77S$Oh=ņSPphAǁ z레C*/Ǩ=z0CH2J0̠ v9ĠaA}pts9n閒Q+ԯo +İfc59 mZXdMB*k&YPΚ煁ִ/f5) ]6`5f {l6)~7[#;-9 bxn :ER8n4Q@Ht?)tEg0 G7FnFͭWz]nԻFPnR7 t U!OUf̪*os#ӕ3jdts6.<1-RְtHN;bƱ3|N#;;Yx~#d@K><[Sޮn(etKAc  ߁ /: ;G۽J߽޻N X^CEֽFi^4sc㛛C΍-.lf>4R-eCul1莑!鬑ʑ葷~LYF{|6&;1; N^ttKd#*k,s-z/ e"bF1tQ (^y6> Q eѠi;)lԔ}vJMnn?7j{6H1>}8-Mz"'Wyԩy2IZ gN$jI(9ZSRVdpmIZߵ.&ݛ6 ZT~YT~F7eK΃ıYs[mW L&1Qw[m0L4{[mlϧmx{?ֆz7Fٍ&5}Pa? endstream endobj 749 0 obj << /Alternate /DeviceRGB /N 3 /Length 2596 /Filter /FlateDecode >> stream xwTSϽ7PkhRH H.*1 J"6DTpDQ2(C"QDqpId߼y͛~kg}ֺLX Xňg` lpBF|،l *?Y"1P\8=W%Oɘ4M0J"Y2Vs,[|e92<se'9`2&ctI@o|N6(.sSdl-c(2-yH_/XZ.$&\SM07#1ؙYrfYym";8980m-m(]v^DW~ emi]P`/u}q|^R,g+\Kk)/C_|Rax8t1C^7nfzDp 柇u$/ED˦L L[B@ٹЖX!@~(* {d+} G͋љς}WL$cGD2QZ4 E@@A(q`1D `'u46ptc48.`R0) @Rt CXCP%CBH@Rf[(t CQhz#0 Zl`O828.p|O×X ?:0FBx$ !i@ڐH[EE1PL ⢖V6QP>U(j MFkt,:.FW8c1L&ӎ9ƌaX: rbl1 {{{;}#tp8_\8"Ey.,X%%Gщ1-9ҀKl.oo/O$&'=JvMޞxǥ{=Vs\x ‰N柜>ucKz=s/ol|ϝ?y ^d]ps~:;/;]7|WpQoH!ɻVsnYs}ҽ~4] =>=:`;cܱ'?e~!ańD#G&}'/?^xI֓?+\wx20;5\ӯ_etWf^Qs-mw3+?~O~ endstream endobj 753 0 obj << /Length 185 /Filter /FlateDecode >> stream x]=0yҖ~'M!*?B%^CAAf(O`aN Yd!<"s4Iʬ4UIR2yJ4[Um:FQ8k8N 8<:Gx tXo~4 UQk FcЂdm:3;yVَZyFxLh ?VA endstream endobj 750 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (/tmp/RtmpnZmxNj/Rbuild6f0944457700/timeSeries/vignettes/colorPalettes2Fig.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 755 0 R /BBox [0 0 432 432] /Resources << /ProcSet [ /PDF /Text ] /Font << /F2 756 0 R/F3 757 0 R>> /ExtGState << >>/ColorSpace << /sRGB 758 0 R >>>> /Length 30481 /Filter /FlateDecode >> stream xK&;v$"䂥x?HC1fD6 NwTGS&%ӿ򋬌 vfU&w޿_o{6.qz[o6oOo_Ͽߺ{ßݷ-K!k_´uoO/}e6{_ۑ㞆Psn߆ a+}ǰ_ mosҰp04[㘆㷉_i8}XkP?i?޶o2L.e7_O`K\/QOݑeQr)p1LO@ٞF1m 6FBždltCs_f_\p46;' eX>l,/.EIPYpP(ydlL{6q?/\X1 s4,İcb gq6C,@C) xaW`ąo(,eqK8)CIPP2,0Hm䚇+1Ya* 6ϕ~a# [(6ϿbXLѧ_}SwpC~v=nS&hmD)VB0nC*ym|ǭގ4n!roz e\7yTNU3SeXy8yW&NJ^8yV6NOUCei+''rgHWĢ'*;!0=4u\~3Gb悘if(R\~*+JrC6-Kt,'ҵTNwӧg4>2x >Q뽲x^ &DSeՈ,@y. f2-oh2s*%=JhG* E2}wߧ.l~s,a"2}R/ CZ}2"!Bl@LՈs1۔;R3y~SͰyeE)V( =W.P Y²V9A=@h5>@q =&k}!;G3t08_{B*܊{Av.&j|<*cRGȿce i{MqJ㱮ROU,C?}!.@X&tB. _ .|+w.-_B\[|9|㋼ |  ~JkE0~O_ojiXajKb^ˏQ᎓}#pc}ec f-]}|\&NeypF9 $p y]Yy<33=w`fǹ };i2zi$x f\0M0~#05NϽ򸯬!|5¨cA5ik s<*+kHEj[`eer̤s;.aXq⸝4C앙Cef G C&"5t SǫUwRA_NoJDjͬafxK!I?aWyz֦~7fbNdV/7'l(㡶vdg\Y;,rYwk;+/FmgmgXY;sWY7v\kmgRYy\Y1ũw/Lps?f`e-a3G̱`dhlq4@4H4P4X`hp x HψuSDS|?3GV3`]LA;o4Ik^ZjAܖx:]ץPKjM\x@]7P%YkdZhZ&kNZkŖOkSܝBmN;|6yZW0@4ݠ7sx3Z'OiKԖ9-rZ[伶$ȉmY3 AmKܖ 9-rz[.ˆLSl;!|j]T:&8޴һVkPzX#c;[F{ЛлF ơgG z z1^׺|uv`C$"ZT, E1Hņު R*VA$b1!D(!1Dʸ BCQ/DESg hbnѴxHmkP=5?C+p?܂A&Tlx0 M6@[t;tи%AS܃x),OZ6/5,/o9qLu५GYgqmTy[yOuzZaz}yU Q<*ok8.k,Sӕ]m=zU~wcƺ+o f .wheU֘4uKYZ~ Bzx~KZKjsRy[yW֘6W1bofq tm] .xmj(n瘾׀oQzװm5V*jsmeҸ}}%7Ji4kokkZ2?P{['y[_slnh(\jo+ڻ:okٝxŏ׏__mm~si\R;l|rND6\94L=ipko frVg7L3y|*a?/m}jF:}OЯy gw|,]6bΓmfYK>afg]_y[__g%̔u$rnL=G̱`dhlqt@tHtPtX`hp x JψSDW|?3o)Ϡլ73mN%m3P Bx]rjI y]r!jUȉGȍu!G\Zr&jiȝ![s>Mջ+jÇjәuoʵ4sx3N?8gN8o[3 Am_ܾ 9}rz.ˆS>8w>CۺS{3M9`c^0Pc7}T{xiyEyPcuKG;]=:>+o6kgRy[y9 wh1~wM̠^╷u 3pB˓Nz4sx KG DD E J @tꁙ0sm]̊S:e޵τ^䶕OJC-nvy%!քhBԪQBnD 90Jʐ3QKCD 984!jwCۺksK/gBrg ]2tp7g _ Q˗'9| p=|Uw!Fmq* p|8uI+T^Ci5=5G%J5F@oA]Ai5лF >^;0^i̠>fD^ITN!̛9E2o\ (XPs1HbCň"E@3.v] )2XRt1HbKBCQʼnʼnީu4j܌i'nH5ެmY'|RftjM0+`L7¬nY rs|^-=0 {0 {SVޞwm̹/k`y! aCF 3tlڰAfڰfڰf ۰1sZ04ܙqأR2&nT C7G̍#3@7NPOȅCx87 }lClg] u>_% d[W籱E LݡDqƼ4,Gr f5Û jsG❍qg'R!"!KN=FOa)ՎɕiXTLZHLyygG(dAoZ @XԝfEN$ j&/c\ A_;6Nd fͅ Mb=0zvZXL;-0.[;?36KxN 50-dwi+k4i~H};qy7T;E^C{ ];-00ZPad@kq!ðQFe }o0Z` ` 5;<]FQ-x~׆`xm׌fPymW!` TDfè{SNU6҅o RYpo0^5O׏K6ʍ^ x f<̥\Dn(iOa:D 8LrnWD/yrP3 !j:'q0 Z;H%҇03Dtz_{l<耨'h_9IQd}M˩Ď!ie+#X^`A;Q P7C%ɷ||\y 1!$ ~"~lay# w_r>!5SwhCN~:Yͱgb>#C|`2wUHv)1YYu]"4RUGKiV=[QnCIEK.ʚL7ה,a5% F9>e孈z|"0@;ELy 5e~"wEMR?O֦ȂHqɄ9{ N 0)nvEw*\4Phj<6!הN7CLݡӎыK {i *lx$Âe F[f.xI?7 az ype@T~.C#ԕ_SunNMJ{=+UYTTEP)SDMՋj:U>wTN /_O_<8r/]p⶙Ci=բE)uBRL.I]T;x[I%ޱ"ԍ-pR5R5l$8;ø0ع|u/DS05S1%S255S3ES45US5eS6 u@r@+ůksv\@N;])PҖ GY c ?npDj OpEr _fpFIz opG ^pHɉ P1 S0VjL_<sqH@PTJP̮UJ`HViJpįW9JAXJYJ9!y&JWbk5bz\@Lkܑ<eϰySBLi 2+̔g#)FS HaL6)%L6bm3ڟ`0ڈa*a*#t1Zi^;ڽ3ݻ<]*xW&ɻ0UIRLwc]{<*C~v\e{_0yUV%&ϟDF.Pf)P+yLf&j_d0Y3MSWQeTxv3q4"b&q-!br̷C7]ѕ=,)[va^^!v^A6^aF@߿W6F^S/JBpi H'D9b 1mbN<+̷\݊Dmƣ]\vykT%ͩHS*$OUJdCU9U%IJT̳P%W%)J$PU:qtj?o1ƋIJӔ/&*_LUN1]b²ĔH&-BL[,1u9 b2HYOWo0<|+ IJrԍ [@7bd7fl6BmAƍ0vF y#ݾL5ZOՄvF gԕl/m7J^)yd2@Ie%9٠*C\(Qtd2HIe(%IYJJx.K-Kμ m uusE5ۛR7Wo.K_\|qe%ĵ[ך7K'0O,O3V!+ oae{X?wibqC _>#LJ&%<&hn=8͉8g,(($)ޯAS&*|L m>7?J4!̧@hֶL4]L4;q`Y3wr4sx8jGEڌ*nF|7}Q>ΨDZsF1JTTJE9JTԣNEAJUT$WAtO3: 3W>TXl\fgJWd~ePfleFPleʆPfl ePleQfleFQlaDF 0U2Z[[1'N% ,;>opvr1ck 1f?#̆6m1[i2fv1lk}>,hcYcY'^%̔;,[?ٰ˙̀w`Fk 3]kZ z*fԻ1޵6vo3kn3kE*Y;0s޵&eΟYLkgrԴãWۑck;kg;k_F Ccmgmgxve;k YivsClgxOKy/N#@Y s?>󳼔-wh9V5P5R5T5V. I'FCn1ĠEb"1lπE ~FcM=16OaѺ7uNxGf;rkműk/KkKkD2iu"U UVJT-֩Z+-TXrym)֦V;|6xZ>-o1sx3J/)K@T8,qZY⼲$ĉeY3;Z8,qrY&Te#29, q֢xZW03i>u7ZMcѻ7w6[#콍!{wc16`S;g {mcØA}k]PN4-S3E0oɼSDs1bAń"U#|.V](QDt1bI)RZ2EsB#Qʼn޳Iޙu4}鶇R4xXmzsOW>~_t 9 Z?&@7o ЭSt3R?d@7D4nk=;ter~ڇ-ƕ}nRƗ4eVF:eeVƘ:meWF:ueWƙ:}eI PF`<`+%AkR&%BmR*&5HfutfWY3뮤3ݺݭv JqS9JS=JSA%J1TE-JqT]bXebce!uB_7)f(Qቭrݺg9pߡ5sgh*' ytbjNTmP|jF:}'~D؆}bl A|,_X0 3޳ rg5>Sr+w1ꃵꓵFꣵ공Å._#cAĨub:1nH :njzb̉u3kaP޶X ^n{9 vXK-@Ԛx Ȃ!kE2 u$Y -XVZd-ZkAXymwQZtn]̌rox9Ü>9rN;vY,y 3ANl炜 r>Ĺ匈9g"N/Eu΁TNCݺ_mosx79Fk6o!zXM?ս0/M7CN%{{?c߯\R#F&}Fߘd,fk[W@m(?u;E0JRDXp,D:?>+UoRSb&PN"DFK*)Ul%bz*N-NܭK)TN i&.(5^RjX|Rbrp ݲ@l7OnYݎ1X}|=x="t/>v~E5iܪRԥ)LR)+ELRi+LRԩ+LR+MJRҤ(EMJR֤4(MJRڤT(jSJ5SgTgٗSf'l3CrmIxR7(MqRW8:qRw(OqR(PqR(QqR$(RqR4(SqRDi=f(Q񉭂鬜r`FVyB5S[ET[UU[eV[u"Y[̅3X;'̕Y;/ĈݭwQN-洶NWcF9'%*xqwɞc9 Z/{5d~ט#jj1hc Nc0q[3}FyБJ<1<wfn-w[iI$s}ҁ9> x`OR0g'-C̩I $s}#-T\o5$inTsxqW[9%vܭ<+w+kYiXk>Yk>Zk>[k>\PN'cAĨub:1nX :Ōzb̉uo*XY{;r9<[p^oAk= ~5Y,VYPd-ZgAЂ%kMR DY:& MTm:q`f)g-wȹ판9*g 1bwG8pT<āܭ+KZq.z;{Әc^^#^C^c{kcw䨡77ػQ0a\ځ>>gk3 zSw hp g߿qd"6sd%HdSb"NF"D>+*f U$"JdTb*RV"9$Q$QݺӔc2zbR*֋uJ+/*7@VnXb dv#ȪVu +1oݒ`ϲ`?nT{wxߖ/ž[?i)c~Zr@Y0yDa$#Z-w&g؈ep0Uy3-moiȆ/N~PrsL+1tC,_\BpW) o)]<D o5@D[W.籱%1\CŴ"!1#(|C<aQ`yo#Y2q.wn@?roa> *ܹʒ_EDzBڐ}]._. !}a`<+݈e-oF3uY CKlh s;ys/&FLlN"KDa@;k_b^ 6A ;b}<,bqp 0 Ȕ?Hq)2̔•<6p| M`sLlyi/!б(%":iԆ $Zf6m"0F፰}YYlG(gK[ xxofhyow!@,B\Di{0.Oi8UkXQbtXz)To RYf3 {d?ZSaW.Ӆ2آ, 5#s)) [<3 Li _©dM栗8?ht(}PLk ޡ&i0#tz( QN囋%Q.v_IP\]WOyO9,JFʒ%Hʂ&JrO7!QtR $u6u&3Ds[mfx\.O`#\lL$/F_Fz؂Ԕ[fmi]O'a3wކV? B2,QDc:]qU"4RrRmx.(EsQ$jJ~g2.#쿸䷥^Chgꚩ;D>h^%H`>0EhMA Ӑ]|"t!.hmw$ "%q[<1; #.NP\4}_@F J{Nh3u@O,CO;G/ ZK/O/U``K+ flB҂(mm&t`+l}aypEl_~R#SW~MI95)TT gNPRCL:U6U/jpmTTߩ.R;%TT(~=YT(~%tu.0Ɵw)bE(HQ -H[B&erO"E])RxOR,inls\llyf_["TVWoo?ۋ<ݛ}MHgpAiytd/bF;Nf!eƘUfeF]ffƙ{effF;mfgƚtfgF|fY`ƛfUd晛hf}E3Z%dy:u_fZbP-ZbС1!Z;cP5)ZycТ91ZcPe=9ZcУEAAZ3dP%EIZ}܍$`4Fd s1q=nAbt ҁ0$N)'H#: = с$D?&DBW1WOܕ){ RcG{H}*TH*T2G*TRH*TrH*؏R=$hWC;јatfBv솽얍vFm#ݸnd7o7T ڈaw,b]9SW̮w<;L3%/oļS2s2AeˌP!Jz.S\( Q2t2Ie,% %<%Jxϖ%Jxg~t7VKR7פno.J]\,}s]̕;Kӗ0זo!..__k."/!Cܗ>ܗ>OXR>m5걲>~Eﮚ ux|ON"0,V"P,]"p: 67rŲ:gxW>Ӫ18o8@88̊@7? 8k8 y}ٹ.YW0ȷxhA4t`Oc'v쥫_:yiPd{tQ  QK)Q:޿UBd}2DGxW~־VڡyJ~־ҜDGmBõg8reVwhe<ԎVը4kGkgGk_Frxڠ4kGkGoGk/ooqÎVp=Є=Z~ v&0]+K>S^Y'd6sxO'ܧ#!Ęub:1j@[g:?#1㾞i0sbj}3?9rzq2Z;S%4Z[SE6Z%9QLrjHBɕ3UK%wJU-|^|M'֕}f- ;w9<SJ+ N*@U8\q^r-ęHN-C[8\qv*r]ZX.8pR<ŁO+ʥ &|[$gKi1zX^#^C^c{kc1cn 7Fqj P[`am̰~3Ϭo85xXfN̛=E4l.\L(ҹ^U1bEŌ"EDC.!}"o'S<'4\(=[$ꝙ[TgwBi s!:|.^υPDυ1f>B8|\ s!z֏eυp6F֙mi6A3#LIwG|a+ag>%<3e v MxWg kSU>J>}gx lV^cϖmgECH]0 3C9^[x^yPܮXg9%̔npos5mzXCƱƛ{kaDdo)ٻJ~ג6W1Lj zm?:^Y̨>m͆~ǡv`~"_c){Yt~Vfȧb%PL"DDC*!UL%RJ<'4T$=[$\vpş)b4RƋUJ딚/V*_Unþn^\rĚFU˭붛AVn+Vߺ%brer~ :\o.}htjcݶ7Sܰ1%M1S43eM5St3M9Sܴ3M=S3%͢S,0e͢S,:0͢S,Z0-!UPeꙛ|}+쫠Գ3qM,醚8Bo+88Cw;8DK88E[8Fk88G{8H88c,23$źiat!5.䦆х\0FrYBnk]u UDJ.ƆI\0Q;& riÄ!Flt s\BwWcF9'F@z\f+S 9ͱw5Fs`UNbҁ1O)vȯ #:0 }yUbUɋ~3̋>1.aP88Ԁ88848T8te >m >uC, c:TSa.}@.õgFץڄ#;%)qôh(2ƵÚTKetqW]cZJ2x<++^]e*+pق">|setT^[T۵I?P];wFcfP/躄rb;k9VK5Pˬ5RK5t5vKN e'FCn1KĠ%bԒ1lɁ$π% ~F b->1ӶOa΁t ޶X^n{9kwXKXd-vZem#kIBk6YK}Ze-}Z%6ZSkSPv))ms$ '@j6ymR gANm& 9M2Ym#6N9p$eS躴ϔX8m}.1]mF}썽읍{XConw7aj¸}-|ϰ6fk?gFץƩlqC"6sd%HdSb"NF"D>+*f U$"JdTb*RV"9$Q$Q ަHmk/V)^SjX~Vbr z&mk!V-BnYݎ>X}|=x=+3F]%-?&ynsKm7؂~Ы!CzHX2pg[xD>qo{ZD#Ý!qiHKI(H7EPsPާ9erW0sC|_Hy{eg}Cy+aDSvYj`bQ͘E}Cpcx ֱOt@>a 5Ab`y %&˯Qĸ+H9M}SwhC^vޑvl|YyC [ A(ˢQ,ng5 PN(Oix-Ҷz@eq (g5MkJA~W6籱C/SI"rMQ!Q\{!yH E>yi.kᰛ!UJsa.ü a(ýi ed/'hylEHpie=ui/c,Ji-cJ {hZ  ^ af D+m6ن lO zGFk\%K3[?w 8iGvsjRXPRڥ*B-L5J*u4'l^TۨЩQS]wJ8(~PzPZ΅R';$9Qѣ\-H1[$R($pL䢟EN)RJUZQt5]b6 wa(=Lr=|2QddmI @lL6] 2qd@m!2N-2+#E2Z(+f*cBi1a뉗u3H; u`;SckX#8"Ukhc)S!LcL6Rm2fʵ1 %} S SOܬK|CDVsWx3Hsi# >jV M>j !!jQ˷UHZuw*Y;pY;/S7Ts>tMH61Ϻ|鰙ã` 4kCkgC+?,SZiֆiІVOmhmh10v-Z;.aJ6*>(Z-Z~6/0;Z (/;k M 'ܦ#n!Ęeb21j@[g2?#R1㶞i0si]3Yj1{6VX |_XK|cWX|gJjjF:R+U+fJTZ,6kS>UN\++m|F8D}rJ6ImT @kSئ9M rj6EmT!":6)ȁ3)g֥T^]}-Z5Dok90:0;0<06кF Ʃ3@m}v`ӘA}l]h߼#,Dv`)yb@ł" E:x.F\(Q$tbHŒ"SdFEgD3oI-dć p1bxO)[ȸwkdؖas:)2NqW[/0LML3wfQ-qO 'Ƭ Qİub:?)tL?w fXAy>c-{7X ,رVXc-QkA@m`ZeÂ#kIB 4YK-xZe-|^m@ԦV@|6[r8Xt&gN?8g8tN8o8\3 Amg 9rz;/ˆܭSN8wNCݺm.yWdwi5ǥw֠PjJ[!4XM?U1;^DoQV%zxt m ¤vw2-3Icu 4[9?oh)E0J̏RD Yp,D:?@KRSb&PN"DFK*)Ul%bz*N-Nܭ+Aay,F#]QjXzNbRZ8[VO앻%AYnX nbr;冈շnGX܃gY܃zpEݭoҏФI1c_T{sI[w< 0m so 1 so 2 *so 3 :so?uxԬ0h¤^vЇM0BBYXgw>Ͼ >;`/o0%fsx( 11 2Q"12$Q2&q2(#2Q2tA¢5E&,~)~9f:kK)d}чR-:4Ob4.Fb.Fb4.Fb.FF8aw1:^ e0z^ i0P~;(~\[1( ft-~#=nj`0kg!#ƌ6 US!FLc6Qm2fĵ1 "}FёU1 f2\vz;lllʛ:(88۱~ƕt$zDY D?\Mw] .^7`ãST~Wߕ]w[3Zi>gkfk?ڧ~%wxXf.LD4l*TL$ҩHS1ȧb%PL"DDC*!UL%RJ<'4T$=[$]W@sNa]QjXzNbRZ-땛 V,AYnX nbr;冈շnGX܃gY܃ƹ\|fߋ4ܙ{ J?z2RWf e@+Vg/F]>:09$ߛ4sU\~|~zX ,~Y \~!ydחz>Lܡšd<Ɓ샩q͙{_qkP` F"` ϖyD 9 d0rXPqEd氂1sXQ#P/u 2p,n^ZWFF_nN]~Al&Pd@@a2u;ZQv,yUsTt#oJITdgiPAp{o:޾ޞ_SgvtU']ʟ}ԅ\OP)6Y]Au=װ_h K-qQ N Gx)o*.kF^@P5iYڶ)n~!L&i4OfiDo.4SnL8ճlq U&nـQq(ih:kfOFR2e/Ov[m'Ovi;" h:H  zY .X D,x\h=tg5k>ƩXd=kPB"Ҿ H{6%PCRfAKjj 0dITA~;TM=X M%<_>͗zJ"\ЉE "Qa,GuZ ڵ!mGTtY~%5k; Vz}GTZH兩TP卩?UW啩UY<3䝩7VZg奩Vo孩/WvIQ~YUej{_5F.{<^ӕh(RPj"%F)ppJ%uHC)]<HDdLHEl\HFitlHG)||HH /ˆD hHl/d#y 7-RSRKGT"TROz+URS+UURW+UR[+UrR_+VfRc(UVV!^*)^)xaOy/FW\;gׇ^?2{}ggㇹs?'s_R̭6kœg9Ϗ1'$\;K3׽3;۽3Lw}a]j~ꫵjʅ5zzK-'E@`@JN 5"ᐶsuJ?*TBxC;d3nԸKpcYǪ!EE:kD>$)XYФIXd9j)It7*ViӪW*8 }Ȭ.]dWlq79E"+,M׾+cIYdq&&|Yg>,4eVekmf}٩)F8KWif+g;53x8sΌ1hF4#}>cHBڌ4nFJT$CE&JZTGE.JT$WADf31Wd |jÌlgpru%J|Wy%JWr}%JW%x/jzfB 䋒I'%mJ'@*{TVa'˖ iA-K$\9AF)@Bz <B^  YM0cnK3_S W[)_8zcтXw4ЗhۍRt0~#Zd@|5]_T'xf7n(^!yӇ^9j 8hu.E\AtN۶}*9Bmࣜfo^O!W!^94t_:+}c/S:<,- .ӣ*>,OB 5V 2<%G*%ݴu;é<Ĵ-}M F)JmԨ* K*`K(+Kh+૯rR@XT8<ժF_c@&@e`&F^lzVWx3nh3r"Ռ8wK@3s$)Obr$)Obr$)Pbr%)GPbr%*O 1/10$BusFI1 VrX|e9]@ B}wlgpbܧb_#~q~q~"q~Aq~`q~q2$*Bq24*Cq2DYN/xR?-x@j0r5cAzǃ  +c*e`Wgˉƶzlˉȶlˉʶ(>rb(-'6rb-'>1 AG bJRw;m91ܖm91ܖm91:ݖxGoJ[Nnhw`f07?1ZG(UII'L>6[TfrPDZ6pۇxGq_X4^76 ]oeWu ϳ !3ifBwO[NC3y> 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 764 0 obj << /Length 180 /Filter /FlateDecode >> stream x]0 E|dHllZZU=UUYl_[G 4tYu7Ʃ D|3O*h=p"E2H+g7%[@ endstream endobj 761 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (/tmp/RtmpnZmxNj/Rbuild6f0944457700/timeSeries/vignettes/symbolTableFig.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 766 0 R /BBox [0 0 432 432] /Resources << /ProcSet [ /PDF /Text ] /Font << /F1 767 0 R/F2 768 0 R/F3 769 0 R>> /ExtGState << >>/ColorSpace << /sRGB 770 0 R >>>> /Length 3433 /Filter /FlateDecode >> stream x\i6~W36vBihZHӄ^_Gg|ӤR4|G>HW˃ӍՋ+OyӓZR |zuZOr FܺޕW˕^] ywy|oy'˵ܾ'Y6c(anx̣3Q+x2| ʧ=+gLn2zܨOޥ#vmJ ;Vlh=Z*$W1Z<):bю2FcU{/0]UV4N0/.1 DCr*qaLjCUQ5jA" !b20Eo6 swT%dd v X`kh; Q]" nbuU *,%-5ɮ=(} F2*Sߺ*$;`.6/X K#T7d S%J +l č%b˷d G>اq+ѦZ\HMgkVҔѨTCL=٦$0s0J"M+HHnD}G~ˎI&+D3+"/- 4Q!d &\hfգBLkx\$H̪GHn@ͬzq]m "_u'"yo/ 4R!2S⬶l!C D2fV[*D wd 7 TZ4|W"y+.,7d  F\ߗHfʨK޶<d 9hos?̼Pju)G2[uλڂWe ҊPg[C_hVh[CX"Yy;.9Я@G+.6[ke weR2i] K"@$%}e2iu i0d .&ܬm76ןf(ݬ8KԻ\"}7-OtwmySb2Pj+k[2Ymtm_@$ft --Ym)}y7d Ym)\L6;2ijKmhZ)xyV[b^Lї}!PiվR"}?.KCJ"}?.:U_p)]d4_J D2^@]/ߍoD 2Ŕ_@$/ڿ'~V[2iy)Ӣ}ye b1,c*ôh7j'~'#҂oCHKaZ^J-] Eo@ZǙ1 DraZ^LZ;"iI?L *H-40mO̖AMK;t]dAM *,k{2iQԤz6ץ" ~:2ߗHnԤhbFfAM*LM| >IIm,7HԤƴz$)?IA6>HΤ Fdt&ytWc|s@[,3A˨cl?1L x`|"o.i1\`|*m+i}ElS1Lڙ/)/2b֙f_ Fu&J8Sl_1Lk F2:0I".t&a$83%C")?΄ZK"#*Ql~Wt$D=0YA1j~lgUFm;=`}п3k޿3ܿs3ۿ3y `a:lm fNFwhӺ"7 `Z=ʰK~FV@2cQݠ2Q60Q160(øo r2fa'XL:3i1lo VY7+<~`M?j0`5|Orevan` ւ)&X ja,#2-#2"2|QPQ00FvFr>(XGe-2Gvx;( eqa쵰O|}um,׵`[05r~|~ f9>?߂Yo,`c|~ q>`k0c|~ f9>|>`[0->?߂i-r~|~ q>k VYol?߂Yo,`i>r > endstream endobj 772 0 obj << /Alternate /DeviceRGB /N 3 /Length 2596 /Filter /FlateDecode >> stream xwTSϽ7PkhRH H.*1 J"6DTpDQ2(C"QDqpId߼y͛~kg}ֺLX Xňg` lpBF|،l *?Y"1P\8=W%Oɘ4M0J"Y2Vs,[|e92<se'9`2&ctI@o|N6(.sSdl-c(2-yH_/XZ.$&\SM07#1ؙYrfYym";8980m-m(]v^DW~ emi]P`/u}q|^R,g+\Kk)/C_|Rax8t1C^7nfzDp 柇u$/ED˦L L[B@ٹЖX!@~(* {d+} G͋љς}WL$cGD2QZ4 E@@A(q`1D `'u46ptc48.`R0) @Rt CXCP%CBH@Rf[(t CQhz#0 Zl`O828.p|O×X ?:0FBx$ !i@ڐH[EE1PL ⢖V6QP>U(j MFkt,:.FW8c1L&ӎ9ƌaX: rbl1 {{{;}#tp8_\8"Ey.,X%%Gщ1-9ҀKl.oo/O$&'=JvMޞxǥ{=Vs\x ‰N柜>ucKz=s/ol|ϝ?y ^d]ps~:;/;]7|WpQoH!ɻVsnYs}ҽ~4] =>=:`;cܱ'?e~!ańD#G&}'/?^xI֓?+\wx20;5\ӯ_etWf^Qs-mw3+?~O~ endstream endobj 775 0 obj << /Length 308 /Filter /FlateDecode >> stream xSMK@W,ۙ~$ b mF^$ ̿wmZ>y3; # '2%P?> stream xڵXߏ8~߿"B Ym+uݞN{-}(`tώa 3|3'6>_y3xV1[;17t4OT7u2l9G.0(?։ZaTmݩ8DWtxSܔ3g^i* 1wL~Oc۾=-1Ue18p 3D0)S\`[r ޠLNT_㙎MثU*Lb|pI\8=opAr:V0}kE9h`VPhzly<*0 &l 3fFrfk=ͺqFY:j,}Z./^9/H]C gMv֛q" khرzlɒzWxunvQZRʝwhdQmTHQ>\iS ض%B0q5A  W揔ѕ`f%+Fx5lwz]wJY@9'VU\(⤏-C\hUIuijW&UhGCS}'B+IDAqTCۚr[:Ɂ(0?yj{>E5hEN-Y$?Xq:|+=.&zj̻OTg$P#Œ-Qpn6ƽa_V[ Y0|C$m5.qy".yZM"Gڟe'ےKWÿ]vyMr567 yUyO9PޞrI}(X.A.9܉qZ :T)j"?d}=vG;[ ?%@XӉorCg+Gng6^ endstream endobj 783 0 obj << /Length 390 /Filter /FlateDecode >> stream x}MO1K̖NbBܛxXq%DE"]`@:o;R ( B#Kb  2",J3'Z/ bd#g7ƇI 29ڧ˯|F%6dWlʨxTT˙;@_ X1J6'*q(f? p!?JkRN n3^ 2JU5꘤io-Uvab< S68/;YV,4K*29BDv\UUs5ѝח&gY—9 HHw\;lb0?ѳ">jH]B1 endstream endobj 787 0 obj << /Length 831 /Filter /FlateDecode >> stream xuUK0h mꪋTK6#0]m}g, T^y7nuN[z2oVfR6[ꚾ,H*;', ]\ BlFE^lol@cw3iC.8!/߀iӀv~8oBhU/!<}O1g/<~9yĿEyU,qyϹgF/D endstream endobj 793 0 obj << /Length 2102 /Filter /FlateDecode >> stream xڍ˒۸-P%S|JxTFʺ*9@$$a"<%J]@wn0'7|y}MʘGPIrHDhD0/Yeu)k[G5j𰧰pHͮ͟Sjt4܂z1VQ&WFݶĠ$i xBQ+^][A^?@VNR|vs㙆3$DbDfPK chp:ImfAN3ʚQ Z:hчio"Z97b49NoKW+VDb{*\ +' ܋߱Tmp9F"/TP{ .jeH!G$u"y嶻X1Ш.8qF7܂q5ڽbGv6B4ܩ0J`$mo$aiN=(g}[%#bu*ju!9u.elԧzBng\6+K{T}/C _z?AD+*pf 0(0_|7`gopɤf$0=nBW" 7`ucXCt3A];|I9]'Mimgku?[ڈr–Gg8M jAĭΑ(d37țT )8>M"t^^__*J&znP3mQq+r L͚`)NeCX}K ޑ à84bG'Gȕg{z`x{%E$%˸0o{=ϐ2@󬔂X87]~ڞ @d6zYV,&/)XxѪ{6v*baE5e![%YLQҚM%Ti⪕,^@v64hPGoÖ@돛/׏y| }S* ^W0J˄~XqP:lka(5}F\-8S)^l\b_9ip-6`c @邇6{8s< I[y70p*e`.!%gQrC`Vo,nhpDW1 b3o}KZb5U _ ߢvZ Y=MEx'7ꆤۈהw^4EL5%x(XY`#"^U(8_W)󉇼&qzn0|Kt]#:W'YKB02չN waܴRBBx E&2z5! ]+o/,2ssIJi9ҜNi:_f ]h"zܼ?) endstream endobj 798 0 obj << /Length 1268 /Filter /FlateDecode >> stream xڍVMs6WΘA|8u6S[mgjJX"U'@ERX{`2cW,&Jf\QȦ EK&2 ʦ\󮝹><[> 0TѪ iY>X1rra} )5+qPy_0i޵G%yf1 -?=\f/6!,(B`]9BiMn$8Q\ v6lῒ, p * iu(΄r!Zx<v<==/P=B;i`U2e`oW%$of 4]$J[rٴu; )rcX9uAԡBrmHt9߃aǠ+I)&.OqPT+(h睴qlW4 `^BWY|3C!ND@-l eӆBe^X"Vc4b/^*VC McRDGՋOr?UNu`<>e6-(YБ(%XtKs11'XgKR`Ia1!RC8ʭ];k5V$M AJg1u}]30q*(t~mG]D!][ưR] ;eT(y=>v=>H!VJ$ɷ{7}wwnUM'Gayѳ[u@3Bf#0SWObPjxFj 5.>g"R  p *>YmU*Y,5rWx}P@MŻB^1 b6*nƵm[:r ⫛׿FReQ1xfقz.6 x`|q3fn莤J(d&|pwLJツʒ o(tTKP2m.C2TA,^lOa/ ls̭%}vO8P[1nzeHH4F9F4=c'$cT~`0q7XƜY ?U־XPԎĵA{h!7qWv9+CU;`λ endstream endobj 701 0 obj << /Type /ObjStm /N 100 /First 885 /Length 2558 /Filter /FlateDecode >> stream x[KsW2w)Ve8C-U٬yP-! BT.AMh4~9bNJ+ZmqYO*fR&[9ey| x*8RFU˕%ߪT A5OWɇ2dqQ#6/UUoz'Ioq>z(|~=gE:3>Ȟqk ¬ cI?՗c!: t^ͻr<^ ՟Bn@9}Gޏ̼U?2-ԛjv5<^3f=$9h߭n-3͠~ ߺor<ڿLGcj=&nx܂[P^!Z7.]/ۮQtP9fn-qv\qq>kղkGhu7>kl;`p41Xm3-ovc2ndZiv4d}OQrr \Ffx${77F2ý㞄krqWapqܑ9cԘ/Ι#ܦ?d;KuUf6]}f):]]g; ow6Xg~xƞNpt'< =kdOE7OLtdzFjM8ݹ##5Y'0zf篭YҾ+| u$P0_y< ['P_[{ /|'gx<@%L??]! nE$Vod$<92$pHB>3ԾYOGyG:tBP :$6=ɜ H:RNOtxp>8cL@ pA@! \@~DŽc֍IHasfDc(S'Wgq>Soɶtx\=5ƫq'IxpTdYq2{u.5 4fvRM/Qfh/S#Sbm7 6X)@12%毻YU'"{BmHDChL]_| mq 0+"pሷPN˸d˳%k~ORDK11%5aLTʞ("ͣdhgDϋf,QϹ@HcՅnwAWJ 'g8"qzr/.^_z‰N\rh .6EجwBsNKdpktx A}[!\$_ć=vFk6 NsOT$o2RcEhr3P(-q˸u"RBEfgnG9T]jnl# eyj9WDֵ$R'XESԯ <_k~YcZ+;\[r\ cpɜ(;ͅAR ȸ墳8H}lq P[\V p sM7ԫ7HRnq'Sh,c9%ֈ ݚVF%kć4@MOUch㶬'c8> stream xlspf>vضmv&N&L2q&msyOFW^{ڵ)H$Խ, ,̼5IQmfff3# A ԀNV+33 @ @mFo%@hamfpugtqd'H Yv@ZJQ tMf@W `_\ 0 G{:@BI] ``'͕o׿dgJku06s-ś#?jsw>?́x)bNn@9 hgr:mbom?2n&!`QYJZ{͕?JR髹$cӐ1Y&.Y?3_()[+X{5$+?/QQG/_VV ' M?wqfpKf|a6ųttK,SzVFxwx3;2w-& @XH%Jˀ7׆H+M\{3E[eI켳ZY2T)XHĕ)*_=YEWB/`;FVEN 6b`CZT}z,f/?E-o]=K9L ;?28 o*d0 L?kėﺕS ~m2Vm.ԣmKʱ!{+nV ­Jc,7mzy^k׸l|̅ϖjb%g|@_3+p _Q ',Xy,_$scA/˄aTΑشN?)9%תxم/C{חZhʀly5^ aωiG\ /B$?&!בv=)p)jա]גSi&&j.I=JlL0<\)sˆ7_xHgbW{4(S AAe84G(7iL.y}yCuAseNܒ~Wܼ‹ĥ)n! #wT0;c VCl=HfܑI ,ڮ9B .סozbCY}YQz#k_.I8]Ksg_T w0[sZr(yr$9%ч6i,ԑ5N& zL.y]rѻ:Fc&K2>kJ%g*2;{9c6;zN9=UjXo\؆4m r=Ua)^F?fPBp,Rf>T/L/-A ٿ2jJ4 &ݸ ?J|zɓh]Or9ѦVvk9˵[_S28?Gk}lSf6~uH8S&j(δщ=JX"m 4uo<:[qEOͺp @yZnY{x4_(9Fo$)a* BU>bfpQeִ rJLZ\g17c.E-^!rwUhmے:*!Zd_FuDc]/I6>َǞ X U Xp?SoޮU{gIOq0;B {S1O CjҖ*0y0ˆoF_g"#Vy[p1V>˘)Gz:]y#!X3vަX+>*ogcOT-*џ$7<Ei2Pu,߿Is.HMlak^2#0etuJ&8^'/ebmΊ#z-eAa?Pp\H&:S*ma/E9B|_ȍ9Ӗ<ⓀV-zX<qs QQkL,ҰsӸ5Hspe yXU:VpXEV5E nb g8I 6W3rs|4,Dc1ԺCct//8ΰ!6;cHV-2N<{)E4G˜1D KeL+ji'bP_V#kTӋF ݿmL[7&|0AuaFN Y~>|Hs-[!>y;!e{E .CijBI0C\X!mhFO ~ا)߸ fh8W@OsVecHD"5s 0X*UP oyA~ wuЩH DA&j0.m phxf61sat宽3^,7%o8,*kJ[ZLa#:JG*p_p/QҶht1sVV`WVX =bBM%dށYeݣyǖ_|oJ[|`"jFaC S pN 8S"QuvPQ 5Ԅ%;@s@sw'^|=.}9:o; ɩ/D휈-i黩ޞl_ ǷƤ0^B0106Cl"{iDG -B>s`h`RZ}",w7݅rw{ޥl$R֮_(OZ aq G05͢ުwQj|htUBLr"n+Jzʚ+$w wfwjxO ux̔8{zcZoA`vW,N8jn\v;ZgV|.ߣ35Skd'M+k!T%’Xd> #FW砙]HA=#;pyK_,#4pp [L \c =eGt⨮j}MA0"nVFꖚv?zYl")' /Zi-i^Vz y,LM<#kI2H!a6*/r]6 XV 8Jfuc ~I [ 2NcAIژ琄JFGғrUI#HfHrnT[(Ø#,(~ż D]dz(QC xH9=ɺ Yer8Z̠ZST6*ǕQ:8Q?1WCy 0z(fhPNk1^5yFQ73[[=7[R% ٯCݬ#^uE$6*^~׳F!"r8AzO^kqҢ{V}]9V% Όe3RaAAnH NuE2B"_d5؟T[9*\;?YU^*͘М._aJ:@T&% bThz$mBUcbysuJ|1 Z lT-U>jLfOK0jZ"`guӜ7myݙ)lX305ɩj6xӤZ;_an~2H=kӳǂOBm7 ùޮyd5${>`;}z!1+wJZ%B)76voNeîE,TPHK[!c̈́П~M # HDa5lE5]Uq9o"o^8b<%Yǖ߸tfB(d35`Mzyk݋R2, ͺA[aHl*뽭LzY([P'q/lWϗ;[7OǀI%7R"VG7ci@4Q@J߹L[x/o~ XRa諱'pM $NX {Bk&+$;w ACnJFlù"-oYsV>=,5̯6TmlR8 ),1IU߽6ސ/ǦcJ@YG޸^XNsd9{ⰼ dDO>SI fnݵӽ(ʹaB {rD3\&G¿k8tMjy.ɸ8htST;J%$~fqIfك\$YR0Ϻq";qa0#δn$(tm덆=WEU;旉Ƚh´?#5R@@dWr% o9ة1.]U܅gͰ8gzl[ͼ)&0Z?xѹ42#YǙVَS(AΘ1;kdWogTY:bH*/?ħ|;e=(R #[pGv z8JhF_"j6߽_1#07'B٘)˸opj`n eDet~AC0[R_'B=SGa֡75h/Y.ޡju#x0ݱE7Y7gQcgr!ls H#ͣW>Ml5}RP7>u|GkXGoD=ܥ[-~-#,tBc%yݱi~K8ռ=H,/vlCsPDbX6pUB&vuLVG]Q{oSQ!!ۺÝ'ImFLylFF5E5ZM2MjBy+`HsB P~8kEQ*Gy_zzUlFVy~[`k?ERݢoi F~ !i9eao& \WH{F C[փaIJBٜe^ekTV9'/Hj/a; Nʃ ДUhHtj:f ׫<qlxwY+q^rzl>/'"$ȵ/Cp'ov^=Su&kTcɚ{vt-Vٲ:$L*_pueU1ʨV i`BKJv|f\Fi'ƆY> r9ޒ\KzD綜S8orˠ]f,vW^ $&X姐G 2Py+S9iܭ\tN~."$%KG$jЮ+vSK{˿5^d&$#oK&esx2&~!vI0J@ܐbH>Y}fAfO/Ļa2g0+Ͽ۴$uDwȉSٺgLAqX|TZAMm4yY/[mdaNSqV9dZ&|pMSsݗ?(DX!Ǘ_+Ip[8}W(J|LŽ'+S3T4}K-%E[f#S eq)wQ} RW&q$F(hh5SßcCsv?Y"xA^ܑ: 8z/:lHfKd/YXJU\A=@/NSL6`sP/0u:^&skϗ%//MUg&a O{ST>3"&bwߏ" _i6f4ߓ'tY'(&Ak Ŵ;s(4 @kLMte:vÌr"xm6#꽒[&H:OT[ \BGih:~OF;.O+w>m3,pK;'ڈsG{¸TX'762SiJ5xU1+V`D>cKuٌ/"-d Bw>jO(S:עu;ԫ'jriWYķCpP^Cwd7AY/lN|83Vy$;ኲ@P4ҙq6)~("Abo=ѓ=}O;/gJ_L+ZQ;vzLzf*s+AE0nGF5xCfs])OZ:u`xRizt Yh8TjIkq-/FAlJgp."dMgji# Kݬ~꙲دt"/9ܤp?ϻO>N(5p^p37tW삳UtB)lV26DVpO'*j&Kkk (3Y)5<?t-~OaS!4neKQH{Z4a5>Clxu6&Wr+NPu;B[7|`W$N~b(6&7¿Cf!Դ5O[(64p BO(R#P"t_tOLrdA%maw, v X&:.bM3BƍcζFS64! Ydd ;r1wy JRsj ^XՐ HHy'#ζE(Ϛ\v[Z ʵ`|>=+@х@N6~.k7Le{ZEQHܾ=|ɏMc>/G<0%(ջo/h>~+VQW_mZ;ĜpÇN+|nxWF6Ekї[˛ 2 EBa9!<܅ȥ&*iTऎ4px+G.x&S]+=xw25ud*]{H@h~"eueq"* 9oJq5sѨ"TŕUMNހmKo r3兵i meo6:O+TF D|` 1/Z?<ȳdĿ 5pu,U8X]3 -58@SCu}BuAcا^G:^`cWL2후eܜp|e] d^͚lAtExAigmBq?b*FԔ`J2.hő4>?$&6.oTQ}~O ">sVA-]zUh)aք@o!'pQJezŸ#4D<^dU%T9:ALJ)@C}HhV-IB2Dօ!XPN0gaGކ ʇ.N'gm `' T/YߕEa~yGR&/>W>)CW}wuQ xa}JSD4tG^;)dhb"c"1-575{F4h5z)GL`NL\]VQ1A0H$o@ٺ,H~qp! fE\|.ʵydCyw5([wh<ˆ}z&P=,L5{ ԃEq |[TgO1s<*Jyvz1|њVotZV"b忛THMtX2$Cy { |scw ِ@rZlEuxn ![fCxAPn [ e uܸ,(c+s⺜RLB1D dgIXL H1ǟGQdN j47bx%,,-䫧2 #iUK*L4v૾Hza G?[3`iU I%='}H  !TIKX- Ƌc"7JE?a ~q2I' hQIYp(T6E4ypYV7P'<_fY6*[X.(;MI~+ Zwoأ.u^_ȔU #Sr,6AD9QH910wfE" GnoDG7 CO!P 4vd̒DD1Tg,v}WS 66V²ܾ Ȑ,^jD?p)f9iՖ"*W!v;o5yOo'Ȫr K=s+/iMb#h+)SSKã('}|Iu50ؐt_k+wҕth~^#ʼnxPk 'S%pϓcoouZ(;n$ޏI0xO$6v#;Bt&q8!cࡌQ#QR9.x,M_T̔e1ӡ$na$^Ҧ|BOdYypܠ&wwe`se݅RAN3\zrFPޒjC1x1 CK\ ߺ'UP*VTu3*FDbLr YӛF2M$hS_C 9<ˮqxz+lo =MwpPHLf28@1da"fuqϭ|܊0J$J@z;ɏs |ywF2_tiNrJ2TՑgZ-꿈32ě bP^sn46):֟ +Ջxyo.VȠTǟv0]3]N^m$8a$BC"&i,_C/׃ ƒLfzR4z3lgxGJ]Tܩ80CN@$}uH7M.üt;'[!#[@EFWa6R<%h:vMm_zϪz7Ko#9R#qk}ULR:!kB2Eݺn@e[1L$t*1ߘP`nkV8jK<ߟ/^ {\~Δ`mP*XeY+DjU ,QaO=I>Q\.[O®!>cvdH䨵Qڷ6l[ jikfeI'>oԈ/17a"U$$lr ~|((0O 9~+2i Yixcs2g`Ղ]eխٹ {:ұռx_ڈω7*1766˒ƛ/pGM|](|D|47Z6*{a Y_e&SAiDع'Bz# /b9ӎ[8xB()7Dd Z6h/"SV*Wp5m߄&A[1(FnKKr?S M^EK8o,\6 i5'ƍ9x\8f$"ީNVqx]$kr: 11oKR]ꁮ"3eCL paA|,J I7t.$-xop"It8Z8S~aM&*eXb8z+/㫢Z wVzTbH[I  @*@w@O2 Dw ȡF#xp@WG'v6wژy2=w6D$**%zSڱ1MO~UuR%D%;#Y6HyznhD5FK.Ǝ`DpSը"I}6KSfڧ[; /(**9dsX%& |`7x#8)wOVF`>>i-i3xº￿uUIL{Ajj(| Kh7tM1gaValD+ חdh۠b6 9tFOH+\L?}A"ү=o!y+Bbʚl&q:pYD/XY./̜%Ǿ@ W:(yIꀃ9x";~J( MDsP2x_-/`#䨿8;ҶXXKItv|tO!/+VGi1}[ӱQw==[\f (3U;#0b!qf6X5!mSԲ ǜYLRJԐaeA#Gmk]0κ} ا6(j"rx .S~KYkraUQj(oBWg2C}bl]7s޴44kuDW+,GjR ޯWF%@Ẁ{agJ7)Bs {u:%B-S!p1NL57=-LK#HΫUBګlBx7DrpWz%l%\4LUͩ-8ݔټ|PG% +GC$ňv]uM}34iۉ}F>!KTw_-`doBMP|M2SpPP״ ^ARͮźOeX+Ig\&| HȓD9QYd[ c{#>my5'1ʫ%[o;>!YO<&&뚍;X?ҶTnd'[b;Z(@vAXׇ(..@ d\d> eS4R"!?~~=0C#IowQEv,->aM$u+Ly왒Mv'/oV*ǣ2Jӆ\doLfex޳d}49OdYIzv4I& a@񉚯uf;7fZ'Dxg~UFdv6LDNŨ~.DBگ0lun KU F1qłvt8˟ F]9 [o…D]@{j_؏\ף#i{fl1zrS)|P&[NKTQ}.AդṣOԧ!_:F&Ztys|Ԫ'R46LA<P($csq1JD~fc5p!ШZ^EKEǭ/6 `&ǃluH=oxA|V:.aDX X J1ʱҲ8C̰4 Nl3T86#uð*Fݖ387h ^,֏RtIٟv?"qP4%C4anxDVQfF^KP,=҅SXh{NoN h ڂ*;` ć:s095R$i y aI>#Mߦʳ>aE.,NKR &~{\e>rϢI'[[SII!QV]Iw_% L0"i͙/(MѶħͪ?j.ƣ=@(LGk5n_91c!QQw(iRfM:+\4&g:|#%I,h w:Z;Wey)jWg%F"r Ҷ҃b` { s%gMPvU ?HDUգψ^O1LΔv#Rzbℒε2l:??d]O?1:9.Ii7iZ'YR_#4 hܰr/@}}XG̻ :ڛEyu874hvժkh'sS$+4!l=5,ap>U")S0D JrrzQkzhw.dY<nT%>pNy{YL2EM?iaP|CO*!$n;2 > uh.Oc&A.n}aIi1'EgZ;k$+C93zP5ҀeЄOxg'x 嵇.!m+ܛ/*̓10XMpw*Od*TY.2,!foSuKdbmFJ?/IdȻû0dbg&8/Ɇab~SF<}t-؈ !$27+I?0yEpƸ?X>5ðfGa䂗LVo[?WKE _ŔD|L:_IE$3DZ_+vSpEh QjPDYyDΛw*cI87!R>J HBlI!}ϏγQNa" m{w- G5CLEC0Ewjyd$>Efд٭UO #Bԋd%I,x%UB?hN*m"@IaסUDflvSgDrS\r*y0`HRHU7_ C;Z9=rhcy7hMVy^%y0]QH(t,Qo]PD*ߘv*^ ݍkժ &-=wH&Q6X)‰偣ߑA ^mzK)Dntl* cp^-7@_8x+!PngIswP/L۹Gfh|qDhϵkK[\H5$ȓO&|X.hG{7^4Vs<:"rOKb~C"oYL6EcMk}#`C1ޓ (>]0.Ǎ,*Un!Í JOӟ&ȅU_J%eܢKq$ (sM{Zw%kҪE.6ܑB81-: {Æ7A8.EOO>jr ꕦ ʕ/wMCYDal]|]A`~/w9 5B׊cTޔ[ LeъTYkDrǃq<^t25 HY!*O7PZG8[ D֯tǦYQtC%ox/Gx~Q?܄CU۾KQ 1$W)C G~gT/Ya01)CB=z7m@4دIU7IP퉞jve"  JA#G~s c~=,v,P_r"jόr^A4efn4~3aUsy1ȶ?40 ,%N)ҩ6m;0XHEڑA蚬wy?׆{~s*/Ԡϋ$gPp.0.'Q5'QuaQWQ-3Rb#$umrcK7GzXܕewgzy|q".JE$@z1g 94CGXz:#Ycj>y\-Tjd'VæJ8]9x2W*cZO6?q1g{YKh=3rl\r.bF&Ƕ*fcN)h%_7Ke;A^"f&gLFW>h:OMmILwGڃe1ʤsԨ<0S876؏=! T{V^tufys T_\,u(ϼ;@kO ;A;L!O[js  bC"!پ}y2q#(H~KUU{[ɝ S#xv^2.X"g0P4ͯ endstream endobj 824 0 obj << /Length1 727 /Length2 21996 /Length3 0 /Length 22557 /Filter /FlateDecode >> stream xlsfͲ=ܶͧmO۶m>m۶m6i6{{F|\rUڵɉ\T= LqaMf&&+9N Tf?f8r ʄN@&$ bY" ZR* y5ddPt54Z휁3{'{;Sqrf7;7?̜mrbB 1FU)@Vv.&?XcO?33` 4cnRvfM]?ThH 0v7Dm\]N9{S@ 3mdki)3GA,-=.HnfdTk>Jv6/?;,bv&v5r2ǿÊFRoOw,gdabW0(aa{ozV=+3;'5qurڹ[jzM֖MxBZ*Ċ*!if hAW{otP-,L pUqfv/w[HǓS1z˸/%~[oJ 8&7w.kA4S?rkP%c ; QV$(25(s/{k`78F,! QZӥUb;kyxlĩW[58ĺ4wgѥȴe0sOr.nxp W41RX֦pHY;˳lj}?uY$0VT,3O6mxtY{'efF@}E,XmRTHE4b ຀>‡'ӏ޳|P?*JgmVJ?$afC-auZ(&+vĩ>8rِa(UC)Y Sy(Kn;#m`GNC[*:_'GYpMmLj٠fA:J7a?m2<,˦z%q&_Y&da˃qr%zDVb \|.U˘ R'(A&8Et"ʁK->17ybݜ(ˍg9X%[W¬=7]BZ6, 8)Av UCQ #w^sa;eMWڕa[⸿=-gl'NMA^F~W}fLO&.C u9Cq3$=6ϩ4% ?n{/Iѱ$ois$>6%u:fXPih]s%FHnH6ǂ:#X 7+Bo 9KM)j4Q<BH J|\paШ )UrU{1jT d@Dk9V})k|Tス~ +&]-FwjL*=<>h}q%e3Wh𧒪,T}zʂ~9x&[kFEb{38ꛒ+i;Y71ʯȩu|\[~@2#gt:<,2]>AE2T-,JA諾TS 㸹E.F&;rb]9P߾Q)޴3\;D"K#*:^T2}h!h[9J9?k)X$î5 X;fQ((DVw*r$CWoF@eXHo%9al6eug,r6 q3?,}TuK72U U'Nki -DPWPE漡ӳZ'#< ݬ s_3y#oƔ6PhT ˢꏁ<݌¢:ˤ/tJD'.a؋wmKXF!:3F C^#ExV`lkSzp,xPh9=mW ,ODF~V9<>ch}6-O{C+qb?v&{fon1Y:3懻`+}}s@iC{U1& V^xC]`4F)B:=7PǤ1\%U/lא3WNݮ'P,e +#q/C{5(7[V!n`jŝ G+#ިYa {_0W ;W::gOf1 8Ydot#5LMD0y.g}$k(j֓B!@A1)8xƝ bJg1vjtYNT}U٧A2'wASh p T7t(3w4oc/Aw]ii̹y o1&_-Wh1~ɿ gZGomZ}'(˛GtֆHwr fʪV_Js`-PW-ȏG6T7C ve.ȱ#LvxM]mr[-`X1X~ᐐױ0m=k=gOK',߿-#ܤJWe#4-ۿV]z0/|g34t[_J9L )] !xSEzk1oZZ,in7/F!<ᕈD^W^+hZ*7D$o˅H$Q#}nEWմ$ j~ M~NЀ|no6]/iT%|/oUOژn vʽ>K2!|++cs4M80La[XYT6.$q=X>OΣ*:+w!̏Fb"#%U&Up] !-רOJ |TkQ}*:3'FrVJ 2o :& bnE(o̠WvDhѝ/vS[hA#YF{q5~nO6 $N5URzk'dΜVl78U:TNx;rb.5nGazodb}M£^_*ɮR$R(qkY*kí4," X ! aPh(2, J{Un~?|\/TQ=} DMy.2f^{wiCqk$V߯)>,,Egj \7򙧈7z84 7[恥[C꫁T>ϫƗ[j`j;fzN$eV5 KGQ(,@\^y"F>g_rs"LLAFWB^ ښQg QЮgCu)7Ucɴ2⹭NM.r4 63.Cy]ely%W-s<Qd->ӼkԮ/Mtù"qgZ#sz[[X~懥C-.iZv#I`>j* IXʣ߬ ]?_ z7JFmM=8LtP>[7ϸwS˺-A 8o'NaDz cQͺ ?Yn:MJ /o1x{HI^L`=:4qS ypD2<Þ-1GDqxuHF:/ Jn&E\)ib ND\h:ҬWnk:xԅ7eo i2A`/(l»YIX4p]v8"HQaz/vz%(Q1;ôbSs^2rY9DpmTQ;p9=} b';j7KfguPmq벼|NxB n(dVvAĽ6hbuu6u6beNN?1&%Ҹ^+C4V52xlQw3P]zX6 ku$vy QPYzI7~-Xџ `qk<.VƧhd+pSUSL&0mw4}Kss8D[L߆/ץd%ݥ5p3!%byWG?CB lrQ/5<`Dk 2|3+韶0oXJϾqoZmM` s/ҏbJ'FRsƁƗod*taJ}t2K l)5>E܍nj_`GVJ); Qӯx/"~-= E%rpUuF5̊Uda휼=pՉ<~`Ψ]q&+~s##W,J_Fm }eQ[>~cSծ![%-3W Vh~u goQx?W+]@ l}0{vvhNtޗM00m5C(J<-w{܄ f])ۜrz<&q^U|f|n>X6L?re.lV`(jӐu7W'xĶe΄TIKp {u{ /\z*w:dLs-Op $+Qbn)]Jꌘ Qnkkղo( *՞Dw]HCayߦ~7tu sݟAjE,XO)sW0 '`rR| ŝ0fEtp߯Wb%mC5d!%IsO'ڞ!ekvqF^ҏ3k&)ye<~M ATPfi<}5/ur>vW:7igM_Bt5`\3<HA2FQCqqqb۲Gz9BM1B`)Eâ)Y[V!%*TݔHHmq3N?#c H>mOujp'"ТrV/ZgҌDrt:m)1R0bq6䡵7z =#&jH=Ӕa*7ȏ#G;.ۻnX1t(aک=fܻ( xܣ:bq?5$ ])YLV#>z ,O .RBY'|UϬH8J;ok cսgܘ;()Mv*%S .!馷UP Gɝ|1 {`"m9}D6:z&W:waMWthwM8rb٠~jz>Y+ێ |ڋ ;~3{:Zu1ϩ>Bi}hMsb.Kɪ;Id fk GE 8s1k̜P3oY.,|Pg@ TDhbu 1m!~s(c4^5B}e:v5 E.I$7k,RoËadsx+çrOSdfy\kE-}DDk~ͮAS>M."qw+H,?v97 arъ12VͿ">BNJ?FN^Tw@$52_9=#=|}L,$\&$̕&?o!.2O<$:1pJ^ <ġ X =#v*Ȼg}!.Ov'[vm[_ B/Sh48 ƍC$#,Rg4[Mݰjybg OΓk *~c 0` r$<-Xk!ȿBahS^픹Ff`U?Y{[(Nt)eZ8F씀Be?n?Jvy;2QtU2PEO).隩kaަ1K QѦH6r–PUyࡩT?0)\ׂ.7gH~s<NL0b H4VX9)2>S`?MBRרJr ?+Ֆ[k=J/kI|=Q!w8vAiOIC'*'X9>9HlI!p SN:wKW&oBW kU<,At+Z/!(=6D Tn%FOgl튚O vm-&%qzP{[X8zCxhX.U~'f%KnsyW:qCjmܝ?͟رEmLb4Z`/Vwdp& 2>=a:: 6Pe#2emz7UmH/6ɘ\_$8#Y*--Vt :irXlf3aæ{}wgOдP"hIdMBxD$\XCAMY*e?sVmcfLM۬0ɛJK+d qo_WM;--e؉BeЈMsӁ f!ԓX.TmB#EH!jƔ~-tgAQg0K8DeBJWGŧ "0 0ѭ;`hX*Sl-c=rMwӆ?:=^K0ozЃc8DTOp ,2G؝k~35Nn*\nxfkaaOeۑ9ŨǞD9> E&W=e2ZEF agwVDϪrwچk .%.EW0*G !>K:ԙx5=Pa0",yoPG駶r7GYP=\Pag@tAdi b ;_s`E6gׇ$ k:G:/س3@Mq6`  2Wi`Kh/tB$#qFz 1xp$ $f󛩅=(mF9DL~" GDdVS(6 X}lGHOjAūHC} y aowC7 7mD:YsGc?'=29aBZkb Պ۞=܄6#6GT<72C}ԯ *[Օ]iLXe''R5zQu)yqgGW2ՐJHbn5:~MU׍S]Tݽm^'3"At1ں |۠I>ŧǜ8VK.$ڶ2u^]xfqmv7jzvt|qĒn[*:@UVwb0_5.4 6k8KM}{{͜w yխl n=^RF ZMu~`wZƶ |}:b.9>Sl[U!ERצN9b 2gD,qL9D=Sg? [j54qsX<Y©&(c_h^mD ]vy.8TeGm2^ky?g]RK;Ý &G|tk_Awb5֖~3un={=ۉSӻsۍnZSYib %+h8:l,ߪL].}IwYoK4E Թ%Sǂ.IU;[-k&Ɓqc}uޓ2lm$tg-]ʮi&y?MaA?vn~͛5OEAג෋rhL^^ +Nt,4j3#Nՙ;:Gqt+fbCQjo{ԕmϚʽGx9;w ȴIhMmgZzޥ1U7ޜ,2I6%ˇb'Uv_ GUd`[ҁ,aG'o:`  vB,+m(#7J6.ʛgmu899iZ0T_=p~T~qwn]nީ-UjU+]Jڢ܌'u*"ܸwVMߢ]rxe:KH1n.Yo8#՛(Τ˩_pߤ5o" Rq[,jGNyI⬆%2⠼8#?lgb+rHܐ!eV=>6N(P*ʄYFL׽P CD1SwzB-_Z?h h"& d$EXXӢ4u_--!+疸'\:ic PVW1޸ۉd&ksC e6T]Jpo뻺8"Hټj}~$4W k."Uz{<魰eGW:s_!DDc<֌Vlz!9Vo0eq-ob_^h9_}Kۡ& v"qX-R0 #KLH֎W2^ E`iv(9"G+)o躔KL*3b1mfQ$)rxʩdp96Kt˘#k^5SoP"pv;[;z\IR灞W͍?=F9s`HwGcF$Pc9uvHE'%*PNTݶzr|cQ ޒ(# a y}Z^?;'R)n-7FZsi.1lXPXX)5+?l!oWӑtbql`>x;h` GO [¹b ,Oᨤt6P;z(9Y9ɭVrֳļuؽA>66]@3*hr&Jm"nϷ%7Lp|p髛}њ˦Ŋs@JYJoe/4X_w% /2Z#WC)ꔾ SStD[Krz/p5B H)$U2D I'B;# 3e bF(F/V@1K95F#!)8y tG[`Dݝ7#rc%~ٔOѦ: 0] rú'[q٩?;@w !WJA</nVHGNfXVJ>]|$kG^)ɞyO :4rs>g^IJ&IwXI\(eϷwUg~-㵪@a$q7cvvFRC.&$ۛMJ(S. {hяfp `$V/(TWeevSL"F2Lc֖~ TDDߐ}zH*6iSHB\)iUëtwe4$n3ZpW=3$,\xNzJbl&0UFO0Sd_L93RK濯P[bH%pB H_00.Ìj/U& >A#V=y$T?́$'tb\EB/6~ !X62D*H>7ǯ񱟰^yE₉̙M&puRִtNw2|rk{H134VJUdo]4Ȯ%L Uhluk7a|Dw2B&A@1nL'Xסvr틉y##?-Hߎ1qL-gCӡzt+qLC,I G2{>$I>;aۀ,n$?]-A9mI\v:k uf&KB gDW.7i1]6L4\7 "leQ#ō#b0Ԇ:2+ei h3-HĢ$~ЙO:Io f05=ֻCoR5;,\88\G^N-6LyĵD 2c/6Qqkc}]JB(Kչ(ip;7((ZftN7 `@/0YBf\fпO=z )]XH$Ml a-,__~?U)=O S0DH`5@URRiHnǃ{3wqEرUz~FdcvmyoSG9nޤ^ et霩hjBaU{(?8kc)FHe8hyީedELt "m%Jt\9Qw.`ҁro@l2q@ G4xU!CxʙF^`X4!G^_q!$:& PpшK|3wl܋/mۯ }X@N?"=r;5Ң9[$/idEfc?*W+0%~yF`xKz x#:ɞ հCXE.r]" p2+b54.E_哖85?P[vϘER>Q9Tx*S U2+oBT2mUrx&:!e1E(u/<$6yQqs5ȨYcCYPt3ߣw EJϤ> 5-x A'UY`xPq 4:+>NT|&&h7WE$.h= 8@devK봿|ͧP'ȍ[QB^k U- Ugӈn5$jM7$dF&`TX5i?t΅ą/RgKD^h )Z9C0t޸YǚvwzIᩣd+qnsɋd1bX) X<CS!-OXXg&Yl83vC23t:xp#cv1nhAGlïneSXr,&ʗ:#6uk\sMXY\")pudqGPy(4KOo;UvoV'w5&}# T9PCEk;x`j<@ KL0i[5&>vܫ]dG3TeYp 8[r2=z}ka2|TEt00<*]Y^֍`6p5q(mbU 0IBS.c<6(fJ|6mxfUAͶ$AP+_!Q08Α&\{IT]@p5[q/lP$ c(ð^ȺF4u'K{Dq5Hܾ5!Bw"7g?Q;ȋ$Mg 6PA.y +P [R;)LUJoi`J$& L`c[3O$Db_.䭬ZI4'IC$!_fGjӹM 1N='{Ph?ErSzIdT6ZS@͝p99=aj6&5Hz :|Tᄴ>Ȁ9D>iwrOlE13TMn# qwk36h#&M\f:_C95?CBj9#{T1(Ђ=n|#vKuHE*׵a3tO՛hao6cܜZk:(E=WԽQI gq&19)J'*h\o6r]їNΛye|>(ͽ(ԗH<VmA?hHO#) ls6 8\_"LRD9vb䇉3OPOƧ2e-҄>cͤ˜a0xS>74t9>G$M?$hh]T^vu%:@)qsT0=L|:'dP,gki}ҍXBwB[jKo@&yW$O,o$z25+Vt2-Cl-6-]آ}+Ƶ$QϜOPp;͓[#VN @^9QC&sH@}r}:'-9b*Ji.Pw=2ģ'>*`8\yó>!2|Lp%.a.l=5>l͏x ʧ_8C壨ӟ*$u*KfO[(03|+TTaf <,S<BļSmX K z"G/ wPMê=1TFZ .:}z]5]_ez EYT ($ۏݙ"|s74C)n`_Ϙ,6_/DGgX&]"q>C)&nflxw&)IP%F;UOrT^5`VB(\=(Br5}CZ=ЌYd~BLj)XZgJ榶Pw8Oe_Ak'(e^k+Ms,S`9'sP*\ |Ny-UB`.,WDܫ\;!} nv$Ӟ!K9I4HQz075p? ň\aUI4@ Q^G%gd [jQ69  [HLO)ޑ^Pōw*77 4[*^&[3U4c̍I?@_ >#7[_|7DT-!t RsBF"AN>V^/_1BKWΊnҔ,} JcB?QK=GZwO:9j9Փ\٪Ext%1ߊIb ~*ͦr]Aq} .@K,Y,.mS2Hg%NhFaQVº5>?۝%ɬ֩z*АOydV#2r,stO./>/Zօ}bN(phqݡ}uZzr LWD3A09ȀeUw>)MSt(Y=p,$r|QEM|T1kq? c>*xɥXYs&"oO7ErK@FZpL߹ɦ;T2RcT;9ƒȄPcf3 bwmgLk[ݛH7ݺ)Ui0e4^94肋sшFހQQ,ڄ>bvfjV̈́YӥY:(Oe_ qeOYߺ_ +x/B# ԔԵn7Gh.Um{+嵴!WߛX4Ld!i@rc/T^jF1NݹK v|3@;OLR-wCA«1gk`,n|oP#.Wg%X-4ڳJطQskou&)*m<Iռ(\hHVU<-YJ^6kl*P7fUvz9A*>Os(1=(&ٶCdӿc=:OG,4-\ ށJ`Y7wsCP, ]tC5BB_DftG4+Bp JD3 ڑ^I.CC8B48u;[d ݹRᡨ?& F]/ƙou*l>? hȊ&ا\do_+/C4d['R,_+ ,7 CaId%ҍ@^6£ˑ>( +5pB.UUh9 09ټP5(~-e._EUT\_hwۇXnXJnx ZDŽ) {:yq 2z:s 4xt vTٿeWڈF[+ܜE>#λ]dGƕa%LO] ig= O )7ܐA5X$CRI!}fX󴀋=%bC&|SzKIs*6bJ@7}¨l̈́ѽЛY8DJxk GPe_thP*;"-$Kmld rq ?@y9"q#Go8I`=Kʾaj;h؆7ڏ!ơTD̢ΟSQ>˂],)"PNFg<NQҩVK6j$,ʷή?#[7 2TgWj%Ql!L #"hl0o^-ʲ,tl=\*d7h50wR|q_ZR\6o$c5ÆVb2&|14NjY4:+q]]6;ZލgC` @v(0?Fqj3lꉃ1, G91ܦ*ݰi9ftOҾ̞᷸_N4s%FWN"V>lUq"_Kui[/z#CΧÿݳEuGSW7})5$DC&{ ! RlсGJ>pDO9 9"=M/^>KZ;v{& EQ=HmFNeg$L[:2j1 $J=u.>ֳi)?/Y |]l7y %#dc~`o;0 7miFj`z5+Uv>'g:L'xr𨄨_ibLO^Je@pc"5ef\&E- bnwz^RϞm`JI䐽D󲜂F׉bG!g}*ztY*^;v4jEE۫jFϩ \Щvz CSN!ؿɛw47otT f/~h{j2衉5̝ҺCLϪQ!w'9s<0c5vlf% &R8NY3xz/YGS+v(c@%EѯIà޴f$8ey̡a{BAwjbBUʶhzbEٛ|tz=(?[bT*ROÐ>O!wאQ;L5.:Ci2Ͳ=T}}ӧgjn Z& d~evok;yNګ8E`.\@jʗ i?ۨLo pE2z-m ǒJ"jS![퉧c1.1n?6($EњۯNp(J2`Awg>kT~q27r`PjgnnlS#@?cO XkeO j+ p|F|h15i<%2mI;XT)z9s2nY91Rf4PpXH=8hw E|JYqBGg0jsi'(f'8 ]\,YG&k/ YCy\y4n) ϹA@H˝Sm8;򾉾HN5N1uD{Szc lyga(9sM"Q=ѵ;6 Ȕ))x}F7L`?p K*[ 偁?Oi߂9@B#: /;ɣHE[ϒtƮd924Nst% 'lAyH1 oز1`z#HvʙĜh $Q\|}G srabV` Wg(,^zhl;8;nkuM:Ss2wDUnЙіڒYS'^vs 9'CPY^WRcv`|p I } q8vjY$ }(d ^"7 &ݪD I \kȜ ?:w7NYgEjإ+b0i73 _dzV0[vz* s^gt^v>}AnHEoQ"D(-,At#TUz%V4O(QSw ¾r[A`\ARgGOзf(d-0'!^D߲Wi6e[mccfGf+G0|ie;TtG9II I@I L6BIzAG߾SZ$=R^JOuO)Xa-K]3^Za.E5ה?n }w9!f g*ƞ$beu? B>h4.A&2Jk0,gWWk endstream endobj 826 0 obj << /Length1 727 /Length2 15035 /Length3 0 /Length 15637 /Filter /FlateDecode >> stream xmct&\-c;yb;mNضm۶mc8ܙuvڵ~rb1;[g{ 3=3@YLH \hlag+b M@{3 9@@eL @fgmjalquupuraptcH8@8J\N :Z\-2@[' 5``lgkb/NN &` tt @VTEPL^N *̨" 05HSnhl g_?ff3hfa_Iښ~'lb?GCj  @%lgc tڙmBv&Qwg hC k_EH:? 2'd$f4QpGrSCw\ig&v?(iQ[c; [3?:/ﴂnT{S:;Zu$LztJH݋@ku_s[VWBҮ0hX ^ޫ^H޷ᏧuWp_JH+|k ^!pl n"36hٲrkxQę ; mũu)Q35!F/{`aA78aZXim@l? E:`kd 2x3(Xsg"/Ԩiw&'eॲھ@6,hmgtUbj 3E4S|\pe/t:9'nU1Zi}fk9S sG~H̆4¿N\AI;*OVI@r %D3۫ה !􈸵 9:s5G4~] k*[ώ9b)yGkQE 9è]@bXqnWiX[`4hI̛ggH#樖iQVE". L?Bt{K;9J;(@2q*HJWLt gΟ k8E u@=GzxC9l͍WUX^0sϭ.n )DŻxpIk_QxӃTsG(iVpNrV<&c (x>E,)P&}XpPQڐ~)x:jyiC-$YQvY$?mQLTk҆^}sE\ ּizM,!h⧭__jLٽ G|SO+ sVW>TQ1yZ,^;xJ]*AFK6 -gͣy#W@6ALKӢNO1D^CC"XTlބyhi_!ha8Av9,WpqK.(j?obMjK#J^B,?`K՘<\U 3-r֍~#7bae-53pS ڎT[ܻU2.SgܳEOo#pvbБ('K!YBLzJcEL/̵=1/B6ڊ7IXy~;v#^R:fw"&;L&5lߴG /|PZ4h< l'} Z)A>>ookE:ӆ79xxUwX }G?w˟PF.Mec#nXȔ%j)p ɾ>G"ωa6WeIq|%H4`ʍS`fu|tpURsy&0DJn7$wgUԵ8BY2w%oj #!Jw3\ 4 -X9ETe_Url7vL] 4\?ܓQnWK}|V32#\{1pЦ3/SVSyAjO5/vNUcfM`D245JXtVS؆iVH" L :nϗV9A3lėPNRFUi'"J9X{:Sd; Y"{dɋCT\,ߙ(}W!}VҚA)WA;s`ͤ^hte321n/ԑudĉ!VQGǔ8h5_U $[ f#ܩV9K Jh:\ٱOL XH'ڟp׊=#*݁}0n cu]0xWI- s;f&g?;,VQuTZXma =<fdzzf 4c̢H" =V."+]5"As2 ?]Ok6-n4 "d>F_Sh8pk UjQrrHR{ )UrE,ffN.fd8Qs.5E-H/Q+$-W2pyXzg<1p756XnVH0:0č80b4I) mV\=~8+f$Ԭd#;EwaF(9;&bä(SQ֗9{n{WmYJ#F7ԲM 9 #-\cѭl.%R _"C_IT)äZ.r96jŽњ|ei\ B*e7ij5jqь ya?Ʊ?p3H_YI7zW'΀7xϏ32pv9j#u(1I wSa{::z#د_GތH%IнI)ѹΐhϭ0V8vjt=!j+59&Fk *q'1@Cq,Qe?97uBSiB261߬Iw?nqñ˜8phVE48vUߕkKc6SbcS /ag^Z;宷e7RJl8ѫTh3dUhߡ\߫@gZ-4Z=S:X|QQC;[0~ɰnD-DNaE{B0B ĮWZ,ֆ6J!'U{.јhk~Fms ;F|/9[В@+8)HJCiX;T ndS q<T3-TG _M㘵1S_NV"!.^oEryظA#w[p(Bp]P:8Ee;'>rU}\5 k$wA_Nn#ɔ/ K.6;i(Y?`U<+%K_Ս., )f4Ϛ"k "Ӎ^(h`1~!ɨ#K%=Ս  ͉,khݡ_5۪{IT |&GQMC8>ڝZo*Y a@DJPR7njF09Uw\ưsnT7/oڦH)zd?y_X(!ϚmEmLۓ|E!8P躏Nu{%Y r8\XDb+:AYnT;/΅{I4@8;D1*Ԝ(:RD"֚%Ke Rsr۾BӻNg\4K+C+GɄ ICa(Y6JA4vFVd'Ml'ˬc!_ ־)ݣxGy:.}0Zb/8FM`}jsm_1+Pݹw}MM/sjB~hac*)'TOH*D&v횿'vZ2?$`3UzDQpt$'cT귟~/}K^%\.&lg5b^CiƔb@dcG>?WrN~})Gc8qJ7>kCȂR$j#Xh(3 ,80э@ /`.uc̀A{ a/fze;<^"S_\eݪ&EN/;Vm&e%u&ڋ9/L׆#,dycZ.S[t@xSCRDW\MpF^!H"q ~ux|rIGz[ (uG=Fc7`7dukto Iⳤ { +޼ewl?V^pߵ`AR#lsH#8?`P ɛk,IOͼĝRh$+2Km5!}{BLЬYv׶C 39W?8;9g$ QSfj}Ӹ. ڣr"=*gqa*;] Kev]d*l=)ReSGa6뢙`M9px!" } ]{x O([ӓr 9$(EzEC( 1^x5+ [UY:Wv D#E>Q r~)]k/Y D[WD89ocJ=|ʏŵ<b2VΓºD"09bN,dm$wW G]OwCbZ<8pN}.r?$OP{W-#9aVp#[hF^27yl" M)O3Dؿ=.h:G.4q"rFHfL#.!َ ~Nw.$1{TVMIwo/aϫ)ꉫJV\{z=`VH(dd)ZX;̧eD*V2=YWVYA݆e2?5[/U3p\g,.S Y̞t`#R"#+ %-]^$Ο ߙ:aO9#8ρW]уf#hmRO\UIQf'`n7];:SZ4;FmÄ;kW^uҩT-Q.ڇJN#'Rb xı+A/wKI#+!¬nmKt)niN4/~Wlb!oZ8L0yUYؕǿJPЮRZΘ%C.a2Q:@ ;#10 o^h$,1%5y̸XR\Ʊ E)SD8gPV.‚p>yyP>]qtN_V| I?9u>!!P9ecQʞI!H.عcI] ,B"4ςud=a#2 } unlLrm);@)aoWwV|h[2;ƮvݥH{WkLK5~Y4;E/F8]ńv;Hщ`~iĿfq፪aY JrXe C}oעھp ʦ`(v8h|&L>J*|@X]αRyLn7Y*;̠I'{ɛӶͽrLo5 X~d5"rvф*'Q[|ǘ)X~B2"Wn#G_;ܭVAe#\t벉#8U<54;Id@#WsVY@?HGHViVkܤi\3 й |`.iϾ**z*VMC]|Hjn*#|ڍ!{ TXⅽs${M)\P{˸dwY V?t|?4{U6y+6Rc`D+;ADH=#dʐNjE Ԃ0ysfֳ hrv?0jf+FP[ռ"0)2XޅecM|hJhY&9ԹD[8XkYZcO$Eu({TxXxfkߊ(th⬏jAaa  2˚&<9m 9/G:8"!Lր'ܓf m9ԚbYXWVOJ(wQlL,7R_GW1ͫ!dnƆ)]H`}E/͜d*-63WD$ǯGvaE!e}ŮL©w̆Y M Ԯ@x x:EFٙMx?)ؔX=@2:XFۨD0) 1Tq@%;_@5K,'/+skJRͯQq޲x\b$ ;fYG\Zg} ingi.S_qvl6$E|$03>Cy8|mX˜#٘qL>DP9*DT fA!8ɫyA^.b" &ڭ']3>p1(7 j txz\ž*raĜRKsifTTvCu. U dإh~ ,HFP'.^0Cb%ƶvp9@)A * mi !]>ha/v :t/y檦؟GH1(zi10%W-ٟ٣V8ȭL!hnuS^U0%gti:.\AP%FB7V<](/ޖpH9co,I4KZ?0fBm)%|פ sYxzn5(OvzؾRՌ3@"ly1RAzf`n+tdlǖw6py'?6SF|OL'TI3^Yv8sp RR*3UvHcu 8Hxdfo׆cQ|fdR)MGVȠx Y12 +Q4 [}%i>uh{J7LYɡ \Jȍ~J;X{ Q+#(̶ 60 & ės'$PJUwC3j(x_8-*K(`8F(ե± !ϣ5>;ٟCS{ JxPP+cݠUu$"Śͳy71untCn2kbho:&c}]C4a1Bꡉk1' EZ97#-s곅]nk5t7Dh?>Df5F\{M|`);t\K8kK< p>[#Ϳ;Q>L-M5@~)݃E*%,9ZFL1 M8и*ݴ"吥VxqY0s;E'M3ކv3RPpHypSۑ3Z\ 2{/ط%Q S+5JMR<|Wj[X<^#t];jZՑ\z.Қr`l* p-HӬSpVjϢj fTnnesW|sa&hY|0`.uPS}q>rqo/:dW3| Q?Wwq-ϱ paiŋĠ+9{vTc~aXM`Px0Ѥ$Rb8Oe>0R(h>%b#pb* 5L'R= v7 Lؕ7S"'l{Jp+KU\O?h#L/ W hCK;ԥqǽgʭDjzƲmQ±Ƶ}ǣ"v՗Ag8@4 ImřO瘽]st#ilw?D ^ˍIL{%uSh(ۂEdN3 +2Ef1|fߤ>S 7Y\%?B BB˹f~co'xߣ{g:Vjɯl=h]G]WsbcXσ8߻{_ŭnzufe|u~*x9ځߏE.D7|贿w+/Fn'^&|Kfխ5W+2,C͢* YgSrZQ 'kOR]}ح4dYX8حnHx,%\+Ὶ}MR{_kø")nX)rIJor{ٸ9ΦU(>L0T GCqrBC!nA| NbDC!Ұ^o"T[ mm*z ֡sm~,|G |f)a54 <`, jw̍σFxυ 7qFs=K!hCidՄ60rڱmϯ#zngi?SER>6Ǭ}*a oh9ͭߑDLmj2Y7n[A$`rD|</+vUn;ylO5{o .[1|H #my,?Z]X&D{2?nԤf6{uIg;`0F(\s^$R]n.+:cR">n!Z.*\ ^u)7mPg86?fJR57 3T! G“A%<8ٌάSBWq+q^r^g& +TM|kxꔍe+9~(lp4ċK!ezH2j"SJ09lnX>wT:jVdS/or t#voiID|<|[|=X6q;o=9# 颿 GO`y%|t8 ӻdHm֩XbߘE<_LhDoOҸ:H}(|8=%Us]07$utӠeO?۪ZIu lVFҤMr7DMp5P 0L!C}8o fx!ٺkJ_ z=vqgiuhmf:k qeCA~vl)I5(zl ^3t$OGvx+zZ#l}AT_>m?`ߨd[G9@ lҞHDhDvxѰ:4r17<Gr:qTtEliXTtaZ+%Q75o8HlX]|S ~z/{큍2` pl'Ey §kAiζbkIE2%}7džqJ[cp]ynU!C@,Uɽ ^cV|#k6a@ 89 U\Qۇx+ދjByX,W:4\")Xeۏn_dxeӃҧ !G -N9)lh\8Uq+XOkPZsX 3ԟXVI@lLx!{rLJ?"ׇhS]f?DIFSiL:fM[ -ƉyE?C\bMo"?nV5=12lE1%'j^m= a?fNouLL]`gh]_Gi$pz敷Emk,,Wָ*)&sq£"LCo!Ȣ?H5gFzbu'?gxjьKFHDx8 :߈Sjab-KKu' d`f%0ÞT8{dY~VVc9gA"亯X?C 5"}m ^l{tlMy.UjXWokʼ Vѡ74w$8&#j&9CjXYȪ晱8.H'u:IPx6nA1˿UUb-z$ mJ~?_PCL%Ĩ1k|?<:f2k9Z5pZ% } s3ٹ6Ů}G0m)+3306pwm̤b8SF7>nBiA 7]w,lU^ u359qYA$>F;sg'AX;S)py%OWǷobi`tczݸsxa1|aD} I.`sa/A4G2Ojү&kGshԿ}VLA{f ,=۩-n,<r]ԥM Q6.bd}Nn}^8kQu,7g4`".an jA䠙 E7f. ͹ 2qOE5IiW}RRon (Qs!4/ؿGt%-Gc#ut8Ϭq{V&6kˇCi] C{% We"/PAsN7@ _.,I9:ؖ?3~EXz9 1%Qcs۪tP~9!l7Z+1݉RFT2>S۸/LUr%ON`aEY8i;0Q'NWA1⟜Э˶fq/%~?WDvjCuDjuO3XmWG]bH?΃[mwuW9d `l4/*řӻxĹnJ@7ʎd/˳^{e`&rD~'65WqrT-+џ~W R}K n {E&+^ n-n!*jV۰C,P@~}Wc!]֔#Å&+ʈXWaOBsV=H>[k?v1' endstream endobj 828 0 obj << /Length1 727 /Length2 12316 /Length3 0 /Length 12888 /Filter /FlateDecode >> stream xmzcpݶulVǶm$;펓mvIǶy=֭31f1ǚ<=".`b`E 'q9lE< )@h`f011#D=A*uk#S ngm 2𺺺 :083-R@QPԒPIȫ$@G#k5 2:fv;;[Sп891C @NLUH\A^ &¨*05J-uvk::-kZutŀ 08 [&ekfw?PՐ` 4v7Dl]9;S-@ 5md!lW![ 2;rMA%73+?q _]﹚Z{OÿӎQEMASAkOZdkPq@ޡPNח3rvt$Lc/JX݋@``p3s&.@[d; t ,ڙ|Li-+)2T]d_A Zܨ!OmmI4'-<}+7xQ{ ׿RǷ1q휶H3}R-P‡.eXVZ#] K[6ca,tIo`_`{gԎsLk6lf$oWG&;gstrF6FS6|s44 C22{' R@ N`vmBTZiWcisΛnU=mtO\6D=c' vGJJ. RQHv@ KXDHq3;*Xf\\Qx^XǸ)UiOGr=؋E]UӇnG{D`2vQZ &m٘\<6%uɞu(:՝j.4ȩO59;랋)~v>U8+K!ͷr-.Ws[ns?U (S> WBA0R-CsLJbE"ѿKޗޮm(EMGʫt 7ߔۭv7(: .%-nPPk*xv&i5I !/c|onz\!*x29Ģ,l~8"{jC4_=r̍ܜ(\d ܅c@FsWSHnyOQtC;kk"nI:z1&w ޘ­<ʄ=rnu>زPS<PVvf nLACjR"tZO {Hlj5Ϸ ߱dPI|Zq$KWM?@9Z,z' ֎!$e:i/5z-"=|`hbͬ {OW̳ĝT8MvL ѷ=TjL< T_fC$rQ9]ueȬg3ܩ9r(?}ͿW U Vx(d;74؎c\T)͐Մ^l /@\eN_D?&$0{{ZwqB~?!\a~?&sJȕp NvA *rigA =Bj3z8ˤμHuQ7嫞 8hw$i^I?S9 O[x3M Ik*ڽ*lRMc[u,rf%3`4^? `%4UO/axx}&gqgSK_jLJ[eY"W]ǃVuӦ)&*v \G̨>tKHվB!37!{R_*&ȪP;?{UO*C,>ȅSř2K]ia{7$/Rhģj^`16#Σk4WYhlɜk2z B*J݈.D)'V?}0N sYצsrNP剄FK₽(ߴC*LqaarCG>ao~ Ysg,r!>XnCnq `jm7X('ڪCvɽMnB4}|,~ltyǷ٬e.}U:!WIۅ]F;dz5z;:L@{c!%`Nb{7* 'ƢJ݊+=+gs9[.;@EM{,kI~n`NC;2T] 6wiHNX!Q9aG5͓rc?~0\ꍡˢjhEGLr}oDZߥ"*(\:|fзOƓ!G ?To7PiV>'AZ8-o2E˂}*2R=qm͊ceRdZ GgR)2hL+gl>V;}`zǘڵ>d|23171Ӥ^ѩn>Б|Kղ bfް9M ,c]JiX,nHpG4nY۞` ˑ?jXנz*;(NJY.Σus lr^6+a|ldu KY/)fBp%Xj>-5g\Z tIl(2aǔT| }iñ$oE+ɍ:#V@[bkϡXwQ87 ^hlj7nFDpq*Xlncjj5#ͻ06 6|#CYx<(oxbAh<FQh8d4G=Tg^0W *h$Z?jU(aG zR|M"*\7 ;J?s 鮬,M`zo?ҩp-[) mb}.j'['b |I ߦ 9ohKHȡϩUޢ[p!?H+_&e) p, QqcGtߒ&nݥ)0|*5_1E^'%w1& (,%+Ey]ՃTAAZlMRQf]q-ÀgȐ~V8VrD_K3gt4"]ZpM'㤐=Ik![G~~z Ԙr\mD"hB{ߋnh!\6=?#X錌jHIہF` ao܁jH:=U%58]CN̶dD߁gYBuAOmfOSZȫrqҭcdXullYᙱG(\A+a{섾8FJV6R+9"D./ uee띪@׽"Ru%cvpyɽ lA3A=L'$/&g<̒_,?2es}]/b*䣤U$봸F !> K?3燣[D5Dtᗙ9,>Tn@|GCQqBi'c(̆[Y%Mq^[9XH Jx?~{G 8*#6uʩLyuӲbb|U~8/4GtAߡll(~}JEpo!.丟 vLΛLjP/ }_{è3zEb\V|v[Ilz@ 5H39oLpc[Zޜ;eڅG3n_o@ {\ïݮ_bnj1nM(::9χjO8B00Wgk\ w0СL26vS̾oOPFz,"w=XҐgrwEc%GXF!!sjL|PM;f[C#lKЗTޕQE٫ɣ$$Aw9OxruFqP>\M@nkVط|2NLqPA1/ǔh3)q3E|FF}%IN|jGl;Ng&հZ 8v꧔ڮj%gץ`ueW *Zખt$D_X囥Ѝ|Cƚk"'_>P~hɃE_'zݶfuBtO{ת4w҉ƅ0@R%Q j̳Qc Kq=m_] o*iI#> й.VÍmEB֥˛/~x_Pq\?MdR;[nmP`5!p%Cy]\@8~p?έ\5fu}M Rļ-DbV-V@L- 2C˩Gˡx 0b1SB6ԥ_fzcW }Ƥ}IDЫ)r!!fg{2NOF;qRuXXrXTsWv, .3I6c )Xj.˙v{Mm07f= ,3o%6&"?AuI uHz3vUM??wD>2ǟ+۸pW3Blu[Qi߄R̟C m-9%:R1.rxXیj?kr@aS3)p'z1xi"iMى{Dfkm Hy9XE⤦wY/,. ͉~SkU$cmE|9.N AS;}QA qgFH*ugO&W VQ/qC2wkN|AsEBól74$eDin LvsT`LEIվEG>p0my [, !CVwv [7S;<~7~U6vsN?DŽur ȉA9_:3w9 #wڵ1\㩪' 'Wۣ\m0RJ0Zpw>{7VvCqocHљ)7>~l"a=RY/XK+Kt%4hݱ`ɤB-zf×(~ Tk=@?鱃Q460Xn;rg= 7ULt 4vqّi-)t(a(5JCIJUh-2|T^ke> P5NJas{K0 'Pې٢@nQB@6UyyvD$W1- \^ ?4T[HB|af-]J~}VZeyq 9 Ӎ$iu{9K3ub|rŪC2q{hp-f#}rZB6 Po-uՔEbټ"- RAbi[('PnLNG)yvi i>{bİ9}L@N{sܻ̅FvVbek`x:%ϸ@yJbe^uD#/VN`gvk 8n'`F.Ś{rYTU 70J?EOUAB6vsry~#[7TiZ_K3Ju^(Ek|9@+4U0?'jtv͒Z5|cJ୐ yQPC ͤ7 PNQuK6IW,Ao%m}#`#ʒ$g21,ju')c`ϟ hvZ{\8XrCZ9H`Rg7əh~d uZ0SWa2zEel[5Ds%d8#ISfmuHi` M;1 aG7Wãz)`gݩ&PNY ¤+R\܊j#*ca\më냎խ{9Y;i,\̐(V~ :c< Er{I:F Vn3njNt$.BOYۥVnuxFqo~pMteM[bh>e(܏[%m7 D$ Eu'R<\?6d Z.P6gRVGcKasnZ_|g̱ Vd5& +Mh[S*%s^?m !R:*\vr| mB@m/^UOUg. WeJRҮ)=KySXlѵ2TӨL9 R2lU6V!8n6x~UeDa\%8P ^*عe$SEVgl8Nv-4A`{^@;%-gaԂ%0(]_рT7Bf?2fe SSyiKJ[ OUFH73u|)Jv a_:%4v{aH5iCh, L٣~c'[#M9-PǗ(?VYں@(ۨ*BSsU5h#qx}``^x)|Ct{fdav牲y'q>HVN!ЈS q`_m_TY2`w|"5 λ*i.Է/kUL0kX~ׯ݄mWS"n[YѰ٦ N W,[ wןs;v ;9 ,=M׃ͨ+N.%qKDK-,AJ=[0".~ٍP 5]PcrfHL*\J4ީNM3'T}\JE$STtVF~7"1!w{;J6xi RC8Qzʻ | 4 MRșJZڧ8SzcP؊Z ͗\Z7!YkdQH΂ˆa? ]~N!ؗyXOTyI/6w:39%3 hDI6DD&Sr|0}IQx^@>梯Y-ϑRQt!1JvH~w[0nm 3BIƼ)Z?* Ѵmל/oP*ѯAղwU+D2'5Mc97]:_|ISTzV) 6C9QP.ij̢b)Ѭ?N7 C sQ6Ra҂uwqLM8Π4`Ҋn`G([2)HSVJ_GED C \0;1qD}D*O _5CzbW'mIi[,qn`>J]舡$vDw?C![4lEd4ȑETjr/./ZΝ6!8ൃ=2:4l r#8WO?=;t&.w,Hz1 8q"Bв6Az]iFdƷjCg"K^*Qd֢m$3rU'S;C ڝG+#;:_$$jF ;xN*(y)#3 ST!x G7M/p郠ǣAˁ\O)1y>v=};nx;gP&YtzދI\gpŵX 0@rB1授(ltv*V`S) # Nj8̄p9C kGt\Dq`J iVE^?0* x=DYW*Ǣ ֗y].)Q*T4烡¯zi<\!" {EF7˻/x+DimU2Tډ!:=L;Hor¼#ddz)':6̓і~^V&ZcSiUR%-OF J3*Г`S|rx %A֜[S4J4Y\@|#yARD"lYӃt˜P!IV;JUy}‹dcƢ}LQכ;(Z P Vl1g(nԐ9kKQfS#X%F=2YUtGَKu+l͝3 5n|gWmtG>nztHi%o*ˮuՠr1)OY* <2m'4`ߌ'fG|XȝD#+х75р2AR ~$LJ>_rXX%Ny)k4z+LqFI^/Rzv]//:+S8&?tSĸm}хΙ;-(<:L?|kXpVI7I'$CԮѲ=UzRf ',YϚn-&)?QnK?uNM͗$EJd\6_ۓ{oَ+QSF jUI(QGdq]__*Fw9. 8)w&2c,~~tҴ7kSPӰ۔{w]Tb+)6o> ]UqT+!DlmUb"cf9([&B96ǜm]{~nŁ6f;4r*Dw$AkYKN m<{ȰIM#{v^?+Y`͓uRO[Oea7Η endstream endobj 830 0 obj << /Length1 721 /Length2 25031 /Length3 0 /Length 25620 /Filter /FlateDecode >> stream xlcp.L-vvrb۶m۶m9m8;sV}6֮^{dDbv.*LtLe1%Y&FFF#= )7@l`b0322<,-\Tl M,m-j6n_nnnnήN|)\,Lf6ayMI9q*@jdci 46s6;lL,əL\!fdo US 3 L2۹8s65vWwY6g/ `bi025anvfM\?hH015jc#ghk upu1uڛ:m 2?:ڙBb& .HmfhD\dMM,]mSo6! iQ;c{K;s?Z:/ﴂd;M8Yz5Zt/JHÛ @`becpp?t]L\-? zìXUWҬ2F0?¹W)pß 4ݻܕo%67;!]y-%2~W,|kлSö5sXRf;r,Eg1GIX[zҥ@3=E-6_ /ރ!ַ( t8 ׼7fU5s^tϒ>9>*FJ)$!XV^c="w}TB#|ZZAҶRG|>ܩd6>n{b ڥ'Z'+ bگaM:$~Ѵ!'X~יED#^pR^imnXz޹B~Y; 33N]YpUfrnf[9@$C] ej0iZ\{`jL2fD {\Ud}ዎ~bLDJ[ 3`٫+ լ.߈)c<'"~Rz926^+C`a>*u4'">,̲/xR}*;77 Jo`96񍾮orR^ W""șK|Dw:YjGδʰ- (?wڜ7+:S3F³8D"/4p48E8!\ḭj,mGgN$ { N] ?؃d $wb;u!VԱR5MR9+7"`gl&ߒ2'fq)?쩶d4{gCIHzm%PdlH0 W{Ώ6F@@NL=}Wزpb5͡SUeWg<ICXR%xꄄDV=v&FRTNDu!I8)JkqxG'4o6<WVDK6E?`I,X AJp?a|:!@b: {xtD:W^!!^Sß~cL~̶y5}iUi:!n׻6:3Ŝ96M3|욵fa=2)²>>(Js̜IsUGf;7erTX%Tqk0[ YhrDG(;0d#!"z8> #^EŭywPPk4cʚGo-ClI]3^d Q4/\5V\cc.Ng2B ehBMwvKo=Koq QNNuӫ?&ҿ !lZF ߪl>m7kTO7xw\9^P&Sgz3I ?#tGfI=6KZ5s<]CYU,lGWh4w̓H|l& M At(]$'T xrB$eo00!?qIbAdE&U'.-9 LYiOw 5VYTR 9Ha;lŭZΪcy[dgYTJzYOkf#v>Ɵr.8NL$d0W'>{tB,-nHݺn\ܰ)j2Kɓ rŤ&>}O_+QnrwAH> kglOu(M8]@ t W܅`(1n@?iO%\:eop\2Ϧ#^"ͼwVSXTDs9wr &oZUQўCȷJH6[ ׮3 E6"_ qH=1Pw%yF%- %r4IʊEiAOX"Vӊi78V GMru7ڛoq7RcղʀZPp9NOQ;J+_OēܪLc3PΩ׽Ӈ'J?c_>oTp˞ 0r7'4|+}:5^L݅{FcgkXu֘ncB*Ba=םY{}KuÓTRr8T̨̡/tzp26:kOa0Aȍ$ _;op` &AD. i꾙Ykn3Hr᳌s~Ա0/(=9rt&jtkNX=L%Se=( r{Qܹpel73"I Gc륂j *Uj>5tCV7 Ay:`WO0Kmk+l (~يopbִ5cDsNFSC 02C,_5uݞD=yvX*t "Ѫ}fZh@vKC P-*Ko?@iI\Wqgܮujn pDp]N}8mqա"p(~d`$$!z dNA8\s@T!3aUo !ـs*8HFV\?Svi qU1jmԟX^}fI^hb;*b&ˑ|iҗX3Hthvp*Ɛ/)iD&!dIȽX~vS)ȸ wzaRF{z|zF-7 $ŮQ  S 5!?V:| J4 6`~;)[ӲcĎ 2cn@yHˢ~F+ lu.͸GSm=#Q?(ҮW+c!O^֢xIM`6v_5'D2c5j}x:N⥺c6@߿e\n;(k8t%*uђ^.ymo)4pV.@ ő"|')J|i{;PYÝ&DPZ\|TQ֥HGhuVy@~ gM__%(5Y*'iJvF ʂ7}. Hu<{OXNy_ 1^m$7/xGVK!4}f!Vz~/z s_! c =.;ikUVG,^P%""CG) 8АH䢬G|zb8Rҵnu-ZxJW+Y<2)^wnESXh1n ^!XifI&8:׷S%~}h8Ni%e $AKM.=3aUu 7EAC,Iwj,fTVfN\WK;lwpY+xRO{r\zW Nj &Ln./i^ž|pͳ;eJ/ćR[Saaۗ`5#dF}wi0`۩]A[I'>C}^.|g%~׊ћ@EGf BiXtE50. 7 zd?&d9UPLxefc{: qdٺ0NmgzdpDmfۆ=\])$Pqx.5#ף\!u>{DuBֱ=xmllv<:F*H`S4ג怑Eۂ|6.L{$J5] 6̷|Y(# 5cc4sH8XZX)skc>A zeR'6={p]v`Q4^\в:d~l:͇ebQ%t?k#]N֕@>,'1fX4* lZX(})݅jIO{[c'4[&(1QB0tQ=p*W֒6W`S\LŦpb;ph}.db?ECw[yY">0ʌ4PUܧ$[.XzM7$yWÌ`WX~Rqr;(N~O=xG1fC zHFij"7i<@?Rzv@?]I-BD*No_/Q qZTиhT8{:"b$EۜwQk`%I$ȵZ1VΎZ>a;ؖu EX5br]j^QK2YQ RU{vKϮ4u7̱|Q@g2#e0u"]NSl%;e%]_CK8?Cݓ[5{) 0 @DU(-RLu߁Eۉ>OԒA: ]"\~-r\x!T/.IZz,8 lFplsɈΤxF՟GȸvZhc}㢩ǑJ΅&%;@ kH۹FuC6.q)VA NRtuY ϲATM ܯ Kz+TTZ.~ͪ>7b䇗r/:tlGՓ%ܫ6B;2BIcsPI!g[핋<*B-WPy >3R HB&>J)eV2K2K/]Id2Y? /gw~= ħ2 45.GL_ne? "AȂ^s+3e[QiDL5dkXrFC9o:7v:B|& 9jv)^.dxjFde7I>1niP(S7~5%ÙDZېtM |11wo~qYe;9E۠l/Z6,0lH3]\g('%2V5_Q|Q1@SJ=8GYrsgGoو̏yZ =4/n9^mRs,VTKA D4taݡ@C/Sƌu}hq)1P3ڟ\e> 6vb_ q@{mb ^nrFf^TU";Q mMc$(#h=1} ߲d'*mUAUSȭ6ұ+&~ n PČ5$ Ov>\'lǷgNs@đߒP3edh(# æT |pR:ȮVS2 x]gp]-ygajԾ"#.Q^8MjQEȔv5:cM|9tryr)(*)bhdW}U4ia?*H8G(68$dZ#;?dkonK`$-3NX! 꽳SYFq GPNJ_^}.i<|nܺڷWqڹP6Ga R}*6E}B$QsK5 {+v,,k/$B8Lh&ʣ1bkҖh7BWd[2(6y?f7źXP - g/,uYϨ Ӷ.N$sx:ToXJO 5S>֮CB2][N.WS6O/9 Q,ߞ=ߠj5p]%aVKP\lioÑ%|5B tjmNbij\ZUɩ4:MxXF!sŮ5 +ױ"{s:Z??PyRXRDj]K89r*g8oڦ7eChwh$H91\#.aĜTl]/J*i W.9iB6dFzQJ2o4 -9t#Ф OݞpG[GX<Ϧo|҉@r9d:16e︗k]Js䇳`.%f{!z<$Y(> ? a^ݭ<m(c3w1}mo9(n(᫇xUgn;FVp|p@1 ɒDv~N6 7GۦOK~a0g3^t̂ǒ ccjiSpO~G.t;3{ iHo m˳\F^)ߛpJwy,XF-35}fV^(,jm={oKj "9Zy==`k=k͆3 W$^!#p|8Sѻ⾤6NhN9¨?t̏G,xcymG)+ KLsӤHR|{*@I >େ,>*UVC;UK T^"BCFo(H)yn+FHi0R18J,3m'PG3-" W2Wxy)!%\ٸdו>,ߡ}5&Sy'/AcP(E"$VP\j?No8( J7B4I"+`\IXO)E뻯О~=] UJ{-"b>w}4fײ?uS`DV²Xb%tG[7g K}Ɋ Qޖz({EM? ]3~oos$v1$<4I`R]dz(xAOQQ1 LX8-.v8|'"DsI8IyW67 Z˯}-ɛL/.0rJ>ÞI5s֣YdÑ$lU6FT%(l=4i.s78 D<2]ޖ9p>#yk:lD(q;36D!3s,hxVT*w[8>LedUԊ+^iy2謓F LL5~͸« 3z 3_Ἢt/]0P< w_Q%0_hل#eV:##k+(,|uuXUw3*-~ZF1 HǼ$Āɀ;n< !ɬ?1h*Ik\iKw%nmecEK٩Fs&l㇔Mv oHsºIerz[]ti+EVpqKWoc>C9˶39(R\mmʲ1EEk"oNW o{,o@@t(V%R!TE'P_RI(6d31Aa._]d(G2_27"a neU^ ō$5HnIj =#+ぼrk"W&ұųωA⹧[ho<حaim郵;npYO(ϼpk@3 g87>NR#UҰsHzC|X)Ge+euݓ3n%SY{!"=dIiSX{A=#&rX.V@`.#{w'1@6f]0d&*1b3H vC1_6B%f1Db'C(UtLZtdeu A#4YY-v^2Je>?t4;6m"R4'c:Pk ר{ʀ`N%_{O{W~ l-ioRxH呏>-4#8!^2AWVraVHL},NnAzݮ'xk/&$Z4wi?, WʱTdQ<ߘ``p>ʇu7ױM2Y8 (WDBȐ]܅ j< KF뚨Ϣ@[z チ4 ĸ}^efvVMPb*<A_I4'I|AgzbgIMbL"^tl_~p-@@eu&(O}rb($)Ņd$;EjzS¼v$io$^e&@fžnI5EŊcX64r$D>6f =ET'p 5`C_:9X Hsev5P̲{~F{0 -A2A%ŤnW!AMӘ'8w*҄}nO×O晭eR[KFI\z*Ϲa9^ɷ\&5(GspB:nM(XM}.[D&OqZzH|O'eyI;7w5/F5wBa&SSZ|`f-~MOPƘ%K[xoAS1\ 2I# gOGdV5\ZHt[)eW@qZ4mON 3oH@XoGQ8q"b8 W'jeC52X$jRTٮlg4ݰv(=HuZ3T?9Rvyb0SVn"@+-FC[Wpw`C-L{)iỵiB'ջ..HuO)YB5keiv,>l9zJ99xT\!,/E.LyVo b"oĭ؎$.,Vx=DTMOF?T޽FߋUr;%! " ö[N)r:ՓH:Ev66ǣ9jq`yo?jJI08L]u& ܠ=7Be 'akl.Vu'3.<*)10syE?W5i`PN'v},ӂI BT`UBW#65naL<_{I=G4lsK2fLNpbVf^!> 0;p+2a+#11:ٺ؊^_yUB 5=+1{Ol.=:҆ =ܷKqwC۪gLSK%oـtJWM WI")nek6I%+x{LXJZWr Ÿ {''rPALrQ4Zq\8EK n'& <{H?Q˶6AY>5G} ĂMcYIEz2-a<Nh{T2uV~ #2+<Ո%aZscNR>QSMU {ʫݢ_ilQ-JUDI)Cݩ&(`1aDOR v#}CtJ.&TQ7mJoqc7u? [0gɨ}՗ˢ++Ɋ~Q`M9灘wɝ80cx%|z 9 $6=wך{X|ճ-׊r&_ejB>ů%?#B˫F`SM(6sTȶkBܼ/"qQ8a#V 5-0fC!Prnc.]@DZ @wbZ{Qm0?{0/lzmČecSIڵDJٷ$~~Gp~v?!ž2 dQ@ZoEuعXNZҒF"<2ǘQ!- 0L,bl d$$ zQS74R9 yI^-I (缙H?Vl$m1΀NPdMlf+F9^>x9{gJ5CktChxGaUSj84 *$5G o_]MU(”,)ٹӟ 4N/ey6eh#[X#taW$R~D}"6k0W A[Ү8)6z).Kbg}犑Iy8V#t\tm%P ʃfgjQƠzY:urDG qH&lX||:LS6hm T:9O5|A !?ɘKޓǂ*N3t+ՌJ;5;J`1g{?XB 4wb=P]mXT'fLe^,LXxθ~|wpՁGȠIUM4b9oRQ%yF >߰k$+-;?7?:6aۍ|۞QkVߔMao@Rg4^p,Z?@a%BgiAH7*d!-5 y S`!k:71}`AS4MOyđm+&6s1^CPq<CJr+4毓^ $9Gu{LnJm0U}4g HC?dj:%@-Cûղj 8;t637ք0 P76S d.u@#(2gWt|6IzWM)4XO=KU.C.-sm#O4e}pSi]-@2⢆Se1E2ltu-UGn -KK:5UxQ|dp_ mjȧ2I%QCCf;beT7j4u 1ͧstIS*}s)A V$¸wQbXېΑ&kF`]ZW`n11鯦 # `P0! s_.ȦE iJ '6qmfK'}ƻlu埍[|8ff Ec~gL+){:n_$S@o\:9UDS=dӽk{^E# Ap:R=;gx!9^eZir1_HJWjΠ\[u݄YĺފD&q0sS(6) ¥>wp-&w:5)cׂ̟3kНn`)&kX0hn8XvG00,{^U1WL`9O[Fjo͵iBY3x衝LDǍOd4[DaKzLNo0_T ɀ :-'TM?YdlJntiܓy[^̞rv嗀g^B0cJ@M>2QH5eN *alN5Oqa\̮ 3Qz~Ѧ<+eu)1 VGkjWS0Ir,6q]{dNo-=[{[Jww<1-`#Gӕީor%:hbRZ¶^Vb T%.GcYJ@B+0+ZAsJM9h3YPn? hG:jH}0ᚗ>#_',s+pctygșs݃H=,=ڶH5qN$\ڲKckO,Thyۛ؏P{_XS7e+s=Y8D+~ùU[|ȴ:/^KKZn1#QYLZ2N3qj(^ Jq?JSk’m_YP Sɴn'0"2HaR%rcs NSEY']*>MY9v]}iXm4 Y{J1#OhSvmtE۝h 4[!j%չ'bA`e%|/7Q{+ٜlN>Ԫ5!Yd^jH:uE{爠Msh߉Z14Q[n_>YW-ՋËnjƖRLR[ا݀w }ٝ{)||p6GzFO>AE1cJ ![q5ݑC4O=V0ާGҽ ߳;d0)Kp!`̆Awt`%#O>x FV-w1T kr%k&b2*>YunpboT C $eBO,$]gwhM\41eIyjrѸP6g, Fkut3|$Bۥp.s b^iC=8Bա }Hw N*afUoƭ$wqHp*d$:g,xT 9!醂[UD央'xLIzM-MF5ԍThdub_f,1g-ZK9n̴nUzw+!SnՙwcV6/$f"R**,'nOiLP׺, ,ZnF4aO$;@<xK/Jy7ɉлE%P몼 be-5!@.("щeֶ/HgU7Bd@x؜H3e?N)"tATswD[ÿvz5.ags8HxjxJQrWLK8(%O7`U1Lx>q T#X;HRۜxuTQH?=J[ pZI50h B߿퀽^lel稴JdKt U 8D0H#,j؃qog`dk7:0Wt FC$b )ih*&p|-AR x"8n |aXy|L1KU[ԄEu8Ʃ - ?3]$5jw+&Ye@,F&*υ8̊& =Zsfuhqc('2~ګ}!E쏁OGuҞm^MׯNߣ7So %oB. x*"DWyG',V_BBp݄AP\ޟΦcM]Z|>7laĐ<$Y{fi SE8!pYƗW(dϵmU>(Rэ}zE }.ǔKg=[xkv9Roޏ7a%jMԁ>:RL^ ܞS"k!|ff{Ťe?O'R TecHJ4r,/W3\N-}G AP@~ _ʱUxN O32Po iDki.a튞գ2P~Y;3JTnWa|:ZPL3\HPt Eb3?s).Y-_ <ux#Y#`.Ι9 ) 72ɡ8z*rJ' O t=9X#Q2d/J6`%2_k9י]ú=Ʋk?Pl}/!nSew'GUnj>yڶ iڛ¤ SZ~*+pM(t"4M^7^;{k:S;S5uxeXgPуѕdh_/T K@v/sZ03T?>J}5쐷_$2d`3c[ cJ ӽ/2C/39boȗ43x Z 38qQF^fNΰ'BcRbt0(P9q G0TpZ@v6&`F_ruǽIȼo~cc&nXʖtw(s|ڨU-fUx.<@$7XzR6i$a9kHDQ@i=K܃RUy-tȧȶ :OrW`+XnD dgZGQ)h}\o\Bѹ1wߺhH@MKǐ#K}n?w4{EuM0e,W4j˟?u?)=NJVaGBr7u<M3S5p]ľdP RRnnq 2gSCDL6t ̭u\u*02e5>o~Ol)GMр! [ 4>Q~wY^Vʙ U-DzWUxR+yo:zXxVp.7bSDg] Wر"L2*Q G:3̬cO?"?".9`)"Q24&Xd}M8F-~hO[VpU=Щx.$gcvW_}FrcodIqηGEW~k+6&cI>Z!Dvg^ ^ g,IT=HX)8jM^ؓ|( c0, V* k¤Pەy>O)ݥqn$' #67Me kYo>ۇ)䵲4(t5ȧte.WkTW/LeL/5Ҳ*QZ?;Rb){)t,Hfةjlw}͕S.#iV]DAK覘}h(i`쌋9Ϫ7>3vQ8ܨD}i>['Йc 4'˛w9`Qxw )1m[rxlto;  qZ}))_z"$Q-Jyu{zHڟ4X9U] "h҉HT:ؠeU?M9VI!dߗ $( g9yR'Yd"0xk"2yaKFAzmV3 ˿u Q!3yx%;Qq}cp5gn||ި́-C--ż%Fm ܗ'6iT%[/yAi:# Ţ1:W' wajtawo0V_@IQEÓ1DØn)Wq3=Eˬg00$c-wZ])B3E`.,ys :4x+Q`}*p4Tq_6LgJ-<38,Bd}/u,̭Cj]Jl͂;/MCڽ%Uvmo_:R"|1OW螿 5OCP"TLu]r2mCk22 KǼRyyז+~?sqsǗԿ26tnPAf< 1&XSsxu&F)5 .'5̒ endstream endobj 832 0 obj << /Length1 721 /Length2 15130 /Length3 0 /Length 15687 /Filter /FlateDecode >> stream xmpf-vضNNw'm۶m۶9[߭vծ1k5֬$6Nv&, ,̼Ie9Vff3#FɄab P1QlfNj#V@k@hdwqqvqtftpdHdn0ZdRj)+hdbhB0uX#ظ88C '*" cR~JSnfGpee_nXX@#'t1p;ll?GC?hg++yk@lkm`52N bcr%n&Ɗ@65G5L.r&@gכ?+jlkcgIYRR[Q 𯴄1  +hw }9'3]ʬypXhn. y~a_V6[{v7@H* {dAM_tW\U o?^-%]8,:&ebDdnZaerT+)L"0zN-Cac]qSSDzMNbK.26kǝ쐍*0XHH%ޡ[vr`mat?dѻ^mΉWc*3O]r)bk:'BholF:9XAhH},ﹺBTޯ''炪UNg {T+|R CFu6Ȓ[@jU)<%XqHnhⳐhWN(鴆o2R'_D#orWz)cTY1u#B1Nwf4*QGg$ 1ppk˹g()  v4Wm|9W؞-y Z?0N9,B;0 C):8}S7Z!v*R兞1D85oK=K.8;hqk]]9$VhdJmw&.޼o/"UY΋Q~Ɛx;X|Rhqj 6l ؗ ؇ZC}vHcpգ\֚]cqV4y`j1 ̇ȊShx[*o.* cr/gC )M~鈆.!oN3ޑ1`uqb&L[QwCr @<1b|1Ɠiæ!H8'! Bd=Z } iꡎ6gc_Qb4Ws%|`c,H90|K#q_лGjT )<]Vgix +=qsS9?2*y(|tEoMgt*%F$?”EG[ o,FTRmkZ!Υ`\,TCn,xKi˸ʕ0&T#x(kҽ40k q[cFHitkĝ͐oyKn'%EM<ПywN GHºt<2N ̧af\&Ϡ7qit㶑YiH# Oz nMk fjJZ؞b*^C~7ڪ)顊=@}6=x9[>{a^%T?̭->nYK.yb:_t DSh٘^ IZ zI֫mw )\LmUҬ *$`g[ܾL[q&-$j2e͜ ո]OvegC~~QRc)299(đ{@ 1ł\z'eF͍DqGjMmJ K:z`uK @dq1O C BDOd: yn rd71wLP׷ycQ}s/uS'n659+婲J;F3U`=æg&Z'Xwږ˥f2vJ`!Z!sžU8܏Sd~(vྦn]RkM-^zdf*7ڻIxn ρhs߹iw! ݯ2a@A@ ,Ϻ\ذ'Ln#&Mc_M# i孝w3ݛp8a0}7~'j-ٜh}+x_zhf@fuDK+DՅpCsăڊ>p&!]JSƂbánWzP !z~рP.`5w[5kBt5F75Ma?ywnFBY &ҡF6x (s|ˈ*j(7l95Jhjl(i`=^ Eauk.NwYx־R.D٨ҪP{-V=GX3YkpPG ʗ^XW_G/#^u%\ .Er%CčpDY]>5Eu*U+5g=J:J&ޟu\Vf`CRulxҪA5  |֫|F m=Q>Civ]< GcZH$r`lu-oVuZҲ<䧃CVWɐږ;~#l̦nh:.l 79T@NJmi/rgFm$Z#uocJ[f41H1rʔuU\s񈣪<5q=le絿JrT/@DQF<=QsrO R"/ NDVQ_rĘ XΘmդ[& ˄*1G:: z?:at_nڔocrUITpu!x'kږF++\gf3ʕX;JqݬU:}dY䒧rp3s.HkOxB<ߴIhwT:}(6Yk7.AS;9QgBh͹u$^‹-']i- /mT)Pm]Zq[kYv95{\nTR/o-2dɋbȗ x+}Sd9E۟=*ay|T&6 QFB5 B,dbV\Wj[1xzSTaan#ؔ?aqy-q}B <~PTӁd yMx8+$O"'LlVT1>R!.L"&9dv~v3饥]RV #rvTc#ƒ1!/q*G|co*D )Og?G kqFȓHk+j俭hFeu(.i߸ƱTb2gX?I`D%6{',K'aSsZW?w3uZmZ ^r6h~AU䎵b@͵U=uCn =@!hK^K#痡2pY纴xC޶*nYx#noA؛Eh,yz~3;&$)a~O l] e s# j:uCZfRVZLIw1$ q2`@ .FګF\ۢ9u,y܄+Tط ڐCoYPywMd2MN2=:4ZbSυu%*j]btB9u3CwQ78NPklLi5 ħMOKkOJV Էx td`J )3Eoc/oȭ0Ǒo`UtFu8u%[Q&Vӑ]^9ƫ3hTf˔x,X yS}˰ng~f'$y@aoVERs[̯c.hz %h' ^uq^RgokČq'>dW,srzM&h$BU*g7pR{rFN;W>>?%CosF.~b._z(ZHU u ?gb V.%aR7 p*޲6 FWS~3^q}l$X'xMEJ< st@ʼn&nN&(!ovڪG/Jx^RQ9=Q8 R@F-{^KtpM2ݮWVomgaw,y{^AEsɊ'd~{[Oc\H)Z+b3o۰Xa0[!˺|&ueD=&2(Cw$%Ϣ ̄6RQfC"Eo+hCn>VP~{8 n]|ZMA`k) le<%ˇvH ga8( IlZܠ9< KgEzvoHV^1{(}JޗB69>z r"HB8(gS)@ irODb%wW8/I<}/y;vD:2,ȎB~"/K1#Vz=jE 1ÝKa:3)nb6EYj]W9"[Q=A~h\]^i.Jꆩ\; AAQ}-e`}[_԰-6=1e JK18sTw=ipFK.9T0WjX28I~ybyή᜙ETkR ܙ ŕ6]H E׀εZGQ;Q辳ǃ[ګd6sYH/mKbHKRmKsD*-Agʌ9sM(/[e4*ږY48n:{:!v:..Un2EeI)_vL4-lc[8D0]}uXH1'ޞa =OSNCy-FKj?VG|T`ktFJyP/^S#@cߛOKz꬇hR7gO(̔R0wMC<Þ$t {/,x9l$;1IܰL_Z;v_vk-4R5)' nޞZ]lw…䜐늷y(+jbUENί17;rr"8ljPڔNF',"EJUʭW^HZaVl.wYZQ%ǘ*(͇M4@5%@߰X|T ;4}!i06&wwfwʍQ\)G^BVjVзZF~z7P]UH{(}v#N;PRΩO:mg[?9Ay|?i3F۰|o~"`y'B7$+E~3`Ȗ8 ohk~@iۭt[1ѶQg]F vc hd}X9j8dpIbz:̨ ,(ˌ+g~b/!(R?6[Cp֢o఩i}h:= ("U +|uFL>=i̤^#XFAs–ɩhM)va9= w@k zyWżgR; +}_ńbg /fb^'=ɩ(1Ϊ葧;yE:cv2rN9YAdZ"*G1 ŬWf*e^ǒgJVH'}`tzdҡ',.=^8f@c- V$@!Hms4~qVkPAɦ8 Ume F>7(K_txYH1#_gUOڲi$޸j>"D3K@'1)BRJdTxǿ7pKHnPAH.×B*Zp&U_]ܩ,Mr}8o Yv,(ZŲ?]̸9wR O97M܄*Tti R%=ґG1bk-R$جQkJ>&OҐMRɿ.-- knzdr2# "T n$>T2Xt.Q쾿H4+JՖ1n2-<2-KW,7y;Ya6# _8!%x>| NK* U^ =";ĩߥ\x|g+q> YwO1bs3^/5g2&Qъ4߭? Alz׋"c ^{tBerJ`Fh]e 4}IC8{!s p4n,d4FǻCd:{T?QtL0^Bx0?nN7 .Hԩ BUOБmn[ES"E YM7 1YD6`d:YlR#d\6 Ex=0oa4Gi5Dv}3xf'QԃWժClWo6+NVXN Ӎٽطټ? ORiڐڃkiE==}⼙8+$):ޠ:2*?H7w)}:1;' <[~GOLcniMbPMIt JʟBM=S8 NwHbRp^Wsa9׍z=I1J>e'pKZdfDCW"ۑsr:O. iqYex\ 1cXl?4v+@a-WM+@&|BaճVqZcum@)Ҹ9[^r{=g FM mIlbK^?GO6}#x5PQOF SnG@ū"n =lT3mD!L'>,u+#==>Gn]r#!iRFNޞHM>*^ 0 L&O6y˭<'Dh+lz΄R%ٴotaW.P)l^;&燑b]h3h^S"mEધ7DdAD_V`9H(b%}^Zn-zF(+ ODY8ժ]>,")Hĵfj_7v΢%nzn% LæoA D )EMZ#Vϰs4ZE)yqv);Zz"lRjH,#NUi]pf\sɼ_&Wm{n{\f4T>E"~̡TO$8Hۃ b`JZEGlH\|V־Ě,;"ɇZZ v^+Y_eOt?ggpB:bvSvKS(gϏeNA//lqR\=.uk&>)d=XN?Suv+@ K.A1ZhVa sKeݧlh` c96/1,q7|jy|I<_Ow{aƙ?Gߙ֫pVf0no C+l0Fs>`ƣ~Tf/vp,Д,G๳u8Ԝuz4}%yZW<H' >IGYWtSd0qutv]t%ЂuE#F$ҰsHn_jbD~CеEN3¬[V[$@$% 7vus22Ðm#-jL~ʟywh, N܅Rk޻D:[mS##jm .#O .v0 .=DƝy^%Ǻΐh: + ӚQ ](c4'AO)*H^,jC lU.,sIڼAqѮ_ HsMߘ t~2mE6ȎJD;IR)=c^co^Hm6s53!,V!/ז. Z.$YhhZR91dK昂i=e.FK'5MZ !IN;wֈOF<޼^m -yo*(X'W!:LOh>[[ T7,S Ƕ%#q'Wq2HdKN_둔 f [:Pn3A uՋ{mQut-o[J ?ۊٍ ~mCI,ZEkXg=c(@`t0'N)t[ش2op~v}#,8YʲQNJ5:9 p,oNď v69$3h Lc=CJxBi:!20DYb1"ul^IT|>${sVP%鿫B3,F 1+|fq0V?uQ*g+2?z/-I!ʑZ9W7*-O8l)?jKu^JtZك,Js8aGj<\!=W$!Wby71Gj/%" k7MK5AqY`_sNy߽1y2o<՞Uw$l3fX&/qؕȎ O?m{KrZڻ OJ:]tzM Ȓ|~(f aZIӤ#*Mն"Aj?$>rL <5Fg䚇wS)(~*b 9c=7uE#= m#CHSv5Io3sndzJ` *ɫ:>Gj2-kUryU@fZcRc{+L-nβ42 o}y: `aH8ȸ(v3s7Gx]!c!ϦÒpA5MNHn=9~QufւeDǝ׽EMPRH$>&.Jy/iiR:I Ѧq)pÜS;6a &#x! um&_Bh|(,7H@xg5'eʖ==Y;n0f3WX h2 "pVr $Ế6qڟTV1lL#y_g,رTg7֫"I"y2VL^?dJ!1 f?#֊-w!)XQEiv'm𭭒LTqvz /QC{ XF?Iz5u㨝}ރE.@TlJcGAfr27AK-Tan=P:/핈Jw, r3"Ch$֥3\v9D6kOZ1OHQ9UVS$;b7G{wՒToHBR!nGD |i^^_mn9 w%-MOȿtdJ2>"%dE9b PL,Bp pO\TIHh}_}Lǧ^?kTGFZ+!PaT43mQYw?Th~68٘k:Х]/P<Ȏ'VO8a;xRp3䩎pPԯ]XmuY3xi:S[Q^b"jH(Ğ;"e ,GݺCj}'U5U;6`NzR ǹDP*΅~xlh>JLjr ҳZ]k.* J:ՐxL{ڵ~jLM~; zGϵ}M%H?A?O1rR cTh#<.;y${#qJJL{&8̜3Q"n;7-)ldk{Ng[ +杮H.)MWU%o;?2:0OV<[b<W9¥gD_&@Tȩ~#OsB~G$=CI2sn؆bUMݮ !Ums{.䪏Hw0v9cVK6 Fu:X wt)ZX9~jѥKq8rn(] >TD%<,&n{)  وfMÑyrOqWCdS&?ߕ5`#`'rMH+KjFl4 EGBڬԻH2vwD*C t,7M7'qD=n Yڊ*xgVNuS}]u[ٺ9y} PJ{Ҫ0;FIV#9q'؉nYZkKE,r0H5ǽaǹ{:`Бq^R~i-3G' Ƴ+/1ţlj?/?K~ɉb? H'G '.s'ylG`hYeFt٤[\7\d j]H" g>mg vsKNμY[ <\łHx A5VȦnR`ERCe]n"M#Ӵk*$11ŦS31ם S.EVny]d1!?c,"=l%Gf  [ւ'Ji!+fVb݁'@ywtcn҆oYo^-t@#z7rǶ?r1h6ʔfdsOIq˚s8LD1 8D/ЪR(ʘ,76* jc+Cpm%)ăufu$|Ki0rX?`2AKPi1{f~\I9k'/PЙsٙ>,@q ~qՁu3ք ?>鏾 fFUtI)1ogV?1XE|-qK!czϲ\TgܞXi7v5aZɵبџ2XPIF8 ^7qEsQb%yEȭY> stream xlpf6vضmO4m;'۶m<SVժ}]ݫ* `fduXۉy@3* `eff;x:YYXMimhYZ94mݬL-nnnnήN$K UTҖVPK*$v@'c)@h ;lL̬ə܀N.3wȋH(*EDvf9\y::z%J&u02u-ś=?f3Wq|8vQ0Em\]Ny{3_ܻ;YˢjclO%blke"]!Ex9cr)Yý+?fMIhfj! xY)s2ɨIK!37í v+[w,W7vq23]~f`d0bapq/NN@;/?=pK|!iae~ⅳtFtK,S׺Vfxwjxy3&;wM@%br 7׺+ \[S[ %Ig2,1F QV$i2u{tU(W&B/`y;e:u֢Js,Rعba[nqA"wlP"KzyLPQ[B7ًQ;3n~ӚzTQ.T[2pA#d9 {󬏭hY&n`VDFr:-xs٦npYnnhw 'z;z*P@40jd oo)p vߋ!hrKbl̹wf^At˰*uHWqZ~0\ tH[/ĥ,+'F|۰ǯYTН< =qx$b`~t<)+ѻ4{l:;dTH wTݺ&«~wKbxg\~+%pS0%a6Ӑ@͓3AdnV ΩPLu~d4G^w\jo3byE.blI hg6e;D6A/ӈyS#iAG{vyk}|sPm=]k8%?Oe&w$?_-G<f 5YDLd2h+ا6 A^ttt+* /y${nTC [e=W@1O / Ӟ|o۩SxNjqȢiWvS:G7fB,jmw}y٠?hژ2T:svS| 38X+2 /Lac:҄^H>nfF3.V*G 6G)y#ao/ ?E#^byu4KWF$ic$l,0pPif86[6,AU%CΏ&8\~lNKJ]@ #H,ͯxvpb3K?'^i`q%>AT3,WVP}FRgY6{|v] ȉȰN3R'6U֜d_$1 m#>>DRqښdȍǤp*~#p `ֺ1oj<DmfCUǓi{Cvp$]YEbtв׵Eв !j /5:n?p+1 h.yp;8׳BQQL>H$^BA3܈@ ڴQ @*3;F+F?smhXyIbbCɧ\}]dKp&/qYr l1ƫY4q8~5lu>VÖ7se^CpGWZd :Q)86QPGxR-_-4iuAw7Olg*CqjܳНV" *Y2>{ŊuumѠIA}`"&RX1F?Lq[JG 6#:Ke4%a>aPMeg}m+AԒ#뜟ԈU1KIj- nfv,T›߅dҊ69R#h|=|a5Cx#_.`h3LH1fћQF~mx>VOzd[rVЮud6?Y667v}A{weQZ<8P-}f"vSs &[G^a.D6t5@}OW4`UO+#C{#Vs+7t ,fn:+{\Ti~CVqԝV+jR7,QTɫ:%QQ P%|Qd]sC'2iS8SgwZՈBҙFZ{sGiz:'(9:>۸=zy-XP7&3Yᖵ2RZ^6_S.u\]vräV^O}C`7E d H}Fj6E޵N$ŲB>ж>(^.+4G.v9!f: u<~ÂB6eF4,US2Jy^jIo6Yb?;&F[`[}$:N^6x >&y[j:.3MGZXE Nsu㟎&gkS#mkyZZ˛h 5Vٺf#XpO*z W|?[Z* uZOiq֠@dMF+տza֫NZ}RfUeA_DT޹svBFjTHiK ."@ҨueHXx<\sE'2ǞxewE ]M!&@/0ң] |5F^u ɺxwd*D֏|v#I* R#HTWV\:\ E;I1;n[l>&Fb52 =݅ϭhD~b2pO>6.҃8) f"mf~tAJ>ei8!3WvR#%| ʩ%v'kcJvq=!fEPL+RAxpq Lʒdﰑ~hZM;M 1SqGl9)"'=!1 Ayv[S^)&AZPQ^>Li/ kVjH|7>{؊o^O~A4e?*;2uPJ'DkN3O23U>xGb젋$kӣЈH. T8:!N]ecz&;f/V-(-$!qOM޲ ˧4ͳƀ&vG>i(<m/:*>!ȪF j߯bA_9nX|w3Db%`>"zqH>6Vg}E?$ 3|Jzu _Ϩ,)hH~}xV@,k3Q!wL,/J03AҴEzEOB>n-G(pSC^) *mb_Sa$R w*V&6 I.k衳)y O5m'Eah'Mxn] VCbV8WWPInz]KGxK5juaHs}3ijr imɎn.ah3IYY'W h*`͎zzx5kL?O(R C;0r[yr%<^ʛS}[qiDft0w9!9t*..D9N;A<#;0HgF-fk&]'XlfKη (wog \# zڝqS#ͳ*A;h= ^PW;:>i&U&0Y6ћ|O}һL*ѷTLWW.ǝMl8!rư{*n+S +y&3vm?0`Y+]L8Wʁ̀jyAN{0c=߬_Iѽ%Ð/9cϘ_ +ɹ?1SXnOVۗ|IF/z!?e?~%a&}dwHD~ Gԡp máL7*8)4n YTLyZF@ pT-=uӼ1ufu)arD}rKUl%3_Og^l۶qof:#AV͟G\4qXD_I+LyfGUi&Y^f^T*Y}/RY[&_4EL8\Ri "ĴL^닮Uh MY8`4P;p/q2e[oTױU8o@*PmO`LNMCGnpA9yv$Nڜlcڄ} ~m2%F}TnpH-e"oEV뚊#jgW2~”]zp}9AF( USN  "{VL>" \1.>2þ x>&RzRퟢ jb1l y,ٓ[v!!e"֑]_Jjϻ@~&"DtP5`Rilz 6 3Sb"a՛FG,f (umt݀}9a-@g^ĨG7Fn.Rj:R0~M8%1+fȔ\n(mէ[m:pCLv#s=dxIxȁhw|86hj|$Ղl%,Lw*H;s(39OzDcXF3BxTfx7A-52O\P 5ZF>#Ɂ6RVf'/ >bU \$zts69WH>~X7j?.!u ]8[ TUz'#a PsT?TT/Z(h3Dko|^\]M"}xs:xz<Pth֩vZ:nzD\Typ97͉ D#m\vS6ٖJ<ĕOCKÁ#T>/?*2ޯ&[~$R>oli܁5)$JmGD@=u`(9wX?ۊWLn;q6? pe9d[g9"2T &a+3d"_{I%O 'shxUWU0/rMdަY0)mǝ̽>r,5_RE,(w%[Rh'Jcy*{¦q}O!{uW}9۪*.3'>&Ϥ~gй[ "Q0]_TFs< nOK][[4 c 2пv'&j/fWd?ne w~.հH 9ݘ u8eH8 ?nu*L\Đ>~W1EOY#&]JԄݎhDe^E7V2?'%f1ڙvt%kYLGg1T}&OHkG~g{Y!<Ҵ%`rK)ޏ.]7SsE&ZdB9|P-F&673MiaܨW50O*.[1/tLp6 `r.Hw|2q,.V0hY͠*LJ$j`9dDEN16 +I6h)UΚ Rotޛ=!ݽ>V^?s"M#8B_̠PG ] u=B]giZ4߶HeeAsʤ$=1!o.`p X;eOVSR>|;`h.-5 w!ѭ|hgkSqU޻}!&$@mBn+w-A4_++%C>XP6 94`jmX9xG|owC Y߻{I/ڷSiAJD*!2w ΄ܒӅ{~YkKת{dw),Wp})N@<<`;.fa=5cEAP-6ם\⾳)Ssh1E2 |ڈɆUGI'O'Ҩ>'`MՈ]"l6"mS]{]Li, !/PfgfCblj! uM4> ,*#q^_yr&e*:7uaN ŷ`59iYw2\rTdDNTdGh*oaS Vt.̦IH֣r\Vb8k 6)OT?{!K:*[Mɐ^@YnѨXʙT*֕ZmnK|#ĸ*r_D+eU^G }IWMfA1Uo3c}CIc`aimeRs&1]PWnm2ti/K:[y tgB ZE> y/RLj #3 4 j;wq뮙oYX&c_c$^G~gVBVkG#4wMYy܇`\a^z^F ԵRgVE2vO@Y:i_/W\|'Bov vn2_ 3 ֌\"h]SZfBb1fhAMq;JѮ:NTxC \ٲrydv^o<ѻrm(<:3;WMojEsV`YLK o(Ħ.+&`*nT6- ~8zl|Fvfo*%S 'Vv J&N=E=l~G+egl@"`ީ{ ٷcrRg2l&/pr ]xH-RV)T~5 5jb,`0#ԗ6 qr a/[~&i{ b.d?ƕ.YA v$oceVpNp /(8=\FW˘Zևk.oi3K?N'2k_H{U8Hfx8gQ&ޢ YÒ#cӻЀ+'g$Ar@#_8EzpK+8#KZRޟ!vg|-" +L"W;) ]s % !t'0bFri/V!Co1xqzYIڒza\V_bċpѢIUe~mhHU.ӯGRO:6$2flG@r3ӓ 2-Qz;%?m+:+V 6mH!*M*!]ILfWWe4g\6Q#}9 r!E^ޏ.hF2S2$h+dۥ|V'Ͽ7΍r=.ANA$'[Џf}3u re;[t@y! '[M~CPL{Q7MApA(]5p$)@Dsׇ/« ٜ/o%Hu8cg+՘ .;!n=t 9(FlA\dR]QrTp|KCwP0c\]GfA=j[”nek#ga%I|;U8R&pjIjZ(Jo[ 6$a7ƙq I7uOgMFDp&$ap̼G3.>Ccݚ7!-' p^iF́m[4?vC:i>wr0G=_hGoCTGiansp:evJBπ/ooݧGu.uyT>׾okT͗$KH^ZXfVzl^+W).l~r}h1&8WbQ^_2Mt20)R8S2"v'98!F3׸ x^V5߳>/Y_AkB/}yAnV`kCj-XF5YN OP )kjS0t1b$ J;[贫e_˕xp/L2`ѡ? zNtI^'elsDe8f! y:yuLKfL A͛h4bZ* r\FJG'[<*wuiOnV+_w˰ROT*@^a+wC;J^C< ;P0Jo lULTO3#h39}Ъ0b^i:tZ.ubdN?GXm)ȣE wD~/Bj3yH >1fAi'#g}UF cu(9kwr4w~c'HZ>D0Yo2}a{\}Yi>DnMbv$M-i:XV1򑪵gY8P۷tR?TvvP:΂ kA7/trP<@^A,QF`BBR9y!S?r].47 $PbwSdkμ2QK|:G1ܔ,W2.p!OaJ  Djfr]:1Ĝ+a*K/7[J2ldz86ī 2ay4"E0&XAbDȢQP$0ގͽ5MP/r"U0x6gpj>azM0KVK~?P?p+ӠJ]nOPJ1Oub"XW$72e-۾&! 0߸v+GW&4 L{NྒྷŢJpq8Jk)znb /wB5NA' *#bGSBΐ7az! w_C 7[U"#i (5tL$^֡TȚ4 ߧ+-BDwX/R40J)a}F1Օn*2<ȍʖ67VGx|N6)U[q]Zr20)wx*2"0HG3ÏA# Vq(tgjZ;*cH8_̬`{Û6l~ȫM*~x2] eM!oʿe BQΙޥjsOMK'\*\LWə0Q+"QNn0Vb(xIi5?(|~;{ 0n\w]xe=v7 |A3Q?*Jll{4;o!9"rg&1Pz񁵄դűm{]m0&,HZJZܰr-xHD?o@Ơ Ç\mz&<Ū94AU^aw8VP0QpoC}^,9C5Z|&KD]r{˩;E!X(h pLo`t^gʤvQXmo:2S'܁@_Tr;Zz8haX[8.9Z6 ~+ A VqV0,oEȖUQ@5 !F*H{Y8+m(u_zATh~hB*,#XP8|'Gy2틉$rnR&!#'TˤؠՋ[,z#AdшP-OQYx4ݓ.yx 9.9&` )7_p)h44O?G)4:S &N'Kp(uMP 4>aj@;럌5_P#&Ws?l3+vl/N{BH$^g~8.7m)-5=L ~1$E-k|YI{F)Rß\X2jU"Q@?~?:j|%OB'8:+;([F6ϧNz %T[PGQA,erc2 [xA*}kz7k_xGahVZPzZ!y3(,"4 |0HRBYa͹jUՐR t},M,U=]6 1RT ȪFXXSL֘TΟ fKd v{1ӿ!yJ6Z[妔].<϶Ep=?p[-̐U[(sn%A4V,{ \yl>ȿ ]*Eջx#׉b ڡ-jkۮ;$`t@A2H!z4Qt?%"'`Pc 㝷ay\IeF]`{!h>6ruvw`/rOC$\j dZO eO|;c&c\ۿlY5|q}Ewb^~!AFY49lo5]2J#$Q#U*Xvhd1#Ntj9esM%LѼĭ/t@WYN80=H{jG fPdhO)p H&` FZn]t 뜂,v|37aEe'EyG;\څp?JFkGx3!WP9.NTPJ!E})NmßhBPQ#1*X v,eKua*lK ~(!@ܭ)ĺIq7ڵuA-S{\L:N 9X{I,SbtYO܃:;_Y&W5h]y_jw;cڰ~} /{0O~ϡ9)o*H ]0|@sQIyr` fǤgҏ.;N2$)Y,{>{r63Jui~NMJۀjEM/dqܦMlxmJpb1S ҜC'AdBw M56lmVbϹc%VAAmW($+'uVLW-qAKKtU<b*uڍY x?/o_ K ;OW.ZA䖸v#5-?Q (R;PߖU]öN nRt䑺9cO+{~)A)9X36Rii{ O c / X{|h\NW9+^a1944uyeFOzA9Ăe&Aa2 7an!/ k9Ū%#QnuMٔ9c_T,c[xz Hx[#z:@ ą3%]x`gfs(TK+"4<:n2bFjB #o=G@Z)~''y@ M{tnV9]rA&Kut*ݨ}&+JF]$g*%M *qL< .㵎g_R Lqt Q5g_IDR "{! WNFԱiX}jyK:4svaJ .7eZmgP+<L)VUU g:E)wtimOo\OH?ź=B'ے]2!A b"BWen+4@-`~סgwn;YBJP "7#\(C9~P.mH~6r$(J}d%]NJo_M"G[Z͟3M3LkDrӕ '%!Zd ;8kG!46|?H][7dm;$4BRGE=ʥ܍b/ѦgzIAُZ6/ $f$莗aBO$@iWp~pWuů1WhJ+:tJ#,OŘ*lY‰&̰|9 ŵ9|rJ kEԲ30np̲D,N|!i>q ; \jdmfϗ*2Ə=s3ug$h0ax'aI hS"֡be'77F C{ʤWF!" Ӭ A@ .5AH?A)tԡz"[aޝYo}A]▄o4r[nyRZOw 9ٽ]- ]F7(8mj^i=&:qmQUtйAnIҟ k-v:?ͷ`_<t\&!ă$HuLu'N:;}˚,Y %LۭCskZK#n2=õA񸌁P-qLy9|!r/XEI sز)3Gy&9vBؠz6򖷭;zͬr^i Sy;=3\W%8瀿6Yw1#F@cCm H| ŬKf幊V$F},Z.s?ãThVX$6i{@wjH\ t|X4o(N~q4 $9X ą RvI[˿THuܳCfŀc^'or -\diB-{O6,?{g;gYMI~)&l\|/qӝV5 ^Z!c9.咭vQEMW m8^pdlzVӿqn+܃EHӫɄf^GF&}VV1 Sv~EWU~x} ? 6TSb7-f/ CÕ ?!]L}ݴ ݶ}٤sѬuS8 _,pR;\[Jhzq@/" |ewNE6ePoXk8{|6'öoͣ@mᒕ' 8H CφN&dnv걶l"ꍛ֑Kj $torăNW)纝etfwccghz)JvG̐{/ J)@9Xg?uhڈcGi«6^lt~p뗢jJHϽ|iWGFWҹ8#~\L!&"߂0ϻ$^΢z._xl^,A(BcoU dWדAрgR.?!аPS؋n4J1DnAnb= Nӥ@Z3[裠xZ*IYW{ p+$fwPHqb=mbKLgV[؜nϻC5oMx#o6mD$D:ϑ9h5pUE*Xz,%NZ",+g;q\v$@b[l{=t=Vzb:7 8y5ٻe/з5&ybM Xu5CcPGx1ֹe!i"e:tfT56EVu*/G*,sP_ =AN9_nrMW]\V+ځo"}jԩksd|\"|r4tvX?i0-&a]Y0UqH;0A|p辱֙maɖfť\\6Ly6AaB4Q}J 6 ,uT1bNL7t] r ϋ SL(i)w䨧!kН;!dK5i= j_)THQ)} Jh cry)2;*B/X82) q[EeYjU0H-KygPOnOF-o\nY R  |Mp,TJ*5BT_Tf9Ѩl@Cu8"`9}L7⧼; \:SҋiTuY}Ts [( C~DDZG5V'aj%:$yf ұYn_HJ5+e P5&~ߙ-4_փ/gkwyCcs~Jεo_zbTJ];_wwRU$Wo#K^_| ]@Hl3 [^p˰B-tj_?}ҩHEH\2$J Z@?IRc y$wE3%[ ||nL䴫;n'+>:2MCPXSX8N8бJǫQ'hbS* GWe u[Ƃ2![2{z"7zvhfw߰5O-ES 7T/n` x?(qLf>S˵+r͋.V&qՆt[0/lwqK#8L860uWchuWϲ{Zɦc/>_\^Ϫu|jN4 =#Pa,g ŢqwOM]a+ZۮY׏#]5أ- 5(} %Ƿ "~PZy2zp6 %6Nދs@5x~DGE+$:XR|W2+ߒEۧaH? 2g5GrstR+n0*I)SmWti%@Ηv 8=#2ZǤ0,rLM^tXO# 5 hwn^8 `|,LWR]1tw5L,lPf}+x9T$`[*vxd xkN= CqT0A@o˒{_kNYu|mCgfܤ 'B/fXzQuIPP`qmh[ i!sE_>~* nRm#R9Iq 쵕 YZƈh t/O=s=D.@V>VSHh< H}4,M#fzAt>7:;9x2PT,<…^B3%:,>:N*RSBsuWɁPjV5s f,P•3(}!9Fe2Fc n˟u8i_jiফ F7,K偍+Խ3DN4~O Gw *6jV].\#r 㬚^6!"sM{qB<̝+Uq:(A1uYKU)[M֬TPԘכq^{ͱtj?n,y9N7lirUg\Q\+AUwY&$sq2'BeST{)k3Od?q~0T‘Ö2tP| #cs7Yv; "x'hN$˜W.H94Sc-3p70xXwuq.~1{FJ&"%7QJv)dTQzeFW~_@/ ,0 'f6UlM]og,u*oZHWD> 3 ,`Tx広+ҳ?kWhD fvyz-מZx|C2ģ3(Pk|QW-D]088KK#ujb^obwS4S ֆWClRH B]HjtN' 2A~85r oL &+dP//')Y0۷Y=WDI6^] ]#k }l ٫XX>oG R(b[ qI?'Hg3 UA]T{6` bN+em4>Z &:]@w##ft сHc* -VmGmȱy] ^Ki1,M@#~MxSphyI>AgyO?0 dx(E>t^/ӈ̭mzu~W 51Dl:*wAњa݉R_n.8 &Fnn+㱊}bdcZ{oh{&jp9LMn%*A[̅[Qne>^Pgƃ`dvdR"jeMCUfGfO}B2ԄʞwuR8`cCC-,AZf nF.c"ƱxFWqe~ ~^%k}Ϧ;NЋп*J5r7*UǤS Z1HxQҕ/G'>B +}:*#q(*mH{lEc(`H;z1ځR$mt膠o6_y܏Eӆ AjE\_uwe2R skԫ.+ŗ\q?~46qK>GJN ?p*8b^jK(xa@i, 7yr:n<]NQ3B]p-[&e;C0A|pNBh6bRfpvӍhDF8W n JRi*N>n Kp&9+JDZ4 n T45گ̨fZr{@Wʌ1@^weme<- t,H^GåU*g5[1BY*O5a.B5Lrg%kH5f5 >rIBX3*=j=jCl\hr燼w&LJN'|u貾\m]"k Bt\u!ki}q'O뽃jkc%b1hT{ nN ?-4#^)%Kq\W煮 ιR,*a4s. HK/KD~6p BI<'Vע#}R~I{ }{ PuSy_5j&(]Z m47zTE+6N Xe2/|lDۖamM݉k s~gŘb_duGE訳 [ y &Y8DvVS[]f2nH#̄L-˕3;o Nś{bu;ehnHP4c0]E&, Ƭ@/>SlJt5n շ3zc v<~V1yT@G[Krnc=k_/uq,Avi7 ݑon}?"Pgc`y@u#P);*ņ.]M%ŕ.^u8 ߕ;1L%11ݜkV2cU筫GeF%`]e^c}[8[q|}0:!mdl`5v zFSJv8 8!-!G^(}rR?W~<\AA$: "Y_ʠ|]qWrEUh޿T r 6}snYy (.?y6O>x/cU{~ڼͬ(H*9;: n`Hjfu48`Kݓ(RnTCsej.{ԁErĝ 52?`3O0`p4ʵmwh8p&\!nN`~xp=N@RX:MH;mZ2{OJxktHIZ 7$䈻/<LNϞ!t{.nJkx/nlHbԘyI^Zn]U9|RIJ9V mL֠$S5tv^l#I&=@8G/cz 7<]gK0=7_Iq ȕzuU_EDyXᗦ5ԏvK1bF*/(}n +O7M֢ڀuV̦1]WlWL]7a^FCqcH`Q/"NC #B'K_Qd0p`-/k 1Q mfD8t@*"ϐ\>:[`V(yW{ad8ᮻNPoE'p?\z1jUFWPT6iU,z6lk>h Eҽ/\Q&G mSOx7SUjMPދ[ׇ`z{w=ZK |q=€4%QzNFe_fQqY}VXWW1,f [_fbrCKgINXwlDxdxZ K~AVQ#!E xs~G%oB~ߎU|`/f'\%XLZ)ߌ=l.u,5sW0-f˾KLn~>)d¨p#I΋bGÃW3y275{WlT W !) ]H<9; $Y;$>#g?}l(5nj,,tC"5 "g">B5G)Cʑ sg{xgahK\CH;ᎾVRO.0++JGNG޲ ΫVܝMgѶ3061z%xW@g>: g@ ՔT0Y`$3bF G 51} mn7MH8]e~&BÌ0*43 ?ӑ4ÃG3z.fM *M!wW G^(:@ӽ9vq2Miu-FatE5]M,hFۜa v4+Kk* u=V_f9;wl/}4[Ѵ,GL9}ўF@%Ƴ8/?jR?1Tyj.@ ]u$x[˥ٱ w\ :-<$X8ۯÄHR Ȫ0!%-g=7ScCOc owܾ f<ԩ& k ,C?HWiHd6ZrGj%]dNiyzLJI܋VJd6]yH"%9~2dž1 ew/LiF#*1gPL!o`mUηָG"SMP\ke T & B쟶m|Gʔ5#{P0N@x;-}Z }va#72+2V$x^5J/Mw`Ny׼mu8Ǯ+J!% o477S 3zSj^Mv#ƹz|Ce569'漆W[ }9&U &ƵФ_Yu r1\SI9|w)Hi#qSG O@ӢTCEmK~ s-z+-O/w1 FWZ})I4i +#aNEmD K`;:57 vqDSu]lsҁ]q0`9v!l]uoΙ({8=Ҙ+.e%P9*_Z9KP;z4_֞Z2>hk:tu[Lʩ<_(3")NWP+(jyI)${ڰv%?mt!%ÑYaIB -<5Mj9[#n}{yj6$}bMQuniW ouEi Y&~ d%PƝ7逌+*t2<4MmBV̾"WL ea3Q|H)p~IsTMwa9\?kUEIԥ0VaؽWl426Nh9h܉Vߴ%3KmFH cMnX| n>܃,(WKNBS =BF`ߗJ;x۱!x4zzlN2tG ^KiwyKhcGO;%.ÖP (Ԝ7lfOyHCdtUմ)#6_wԜ@{һH-'=l*)C4;%Ն *#{Tɢ2AAIN`ݓF ᥄F.l7ɻiw3ofl"9Zw/ޙDn ȵ]vVkJI& S j↰meeI#G Q+YÌb-_A oX4⧜dtL ƉyQ[,:.yq)-ƬYAMb:`CqnN`80 Y權%{+qx |aEy (ZՏYi[\,HGdRpuk>lmqf1'o-<Lu*ejbDk[\ijMYlًeMdJ֕sm7U%K<׺~I*ӯ> *l(W߷.UR>2+39t]G''r7U8Gw<+(\K5R3m[h^e86D*pYwt 0䢝xV2T ʫO r/˫âO\g X[يsQqRԜaVIy|@zIoV۬f]""퓊]c͈ap:kl\Tenm?];AUϜpGM˭x;>N5' 1 BSRg`ϊ]ގG 75 5@k+Y{sҐc!z@aྰtƀ[Pj"حgl7{YAԴ3E7)g!d#kOq+:gG(3GeHXLr{ GQ9 K+c:.{_\u l_KH= SP*NȢ:V%1"3AvypZ`T{LomGQ U+MHP).W$bwӷ4T/>KVֺ,6P YWK$M3Db5 ly>?V!fJ#%`i7Hj]%IM3$x3Фc' I(DPW:aguή"7I+.L(B>7|ŅpP&ht변Q 6% \liV[AdŢ; nXʧ/~x&HtQLĨZ%QQ{{>1 ́Ew8:]ƝN=h#͓k kϙǦW}(MUFvT],"ƎE5kL [vw0nA+AG?Rsk?Χv+ d͑q-p2 6Z%RHHaW?V B>tUY,`8|ya  DNMouD5ŋ/o`UN,E0dNkq*V|Mưd\;Uj+WZR3?k&|)s_ϕ6Ïۨ$iW/Hh\t8ETnT#BK]+|#d*]aFhq^ gQzrBX 1De fMU\}{aY(vp "B~ÿF1U‰|5Dr״uN9-KIZ<-FÄZw>][0fwl/b3×ސ4`.{ г@E")/YL_dx]Q-eh iS\hnS~k²d ry~ud[emU2K.)C<,2ḡr YNҖIlTw>Q)g1Duw~ ę40Jg=j%9d?xIO[O,-9⎣}gb|Ȣ8O;68J\ t\-{KbKŁ <)n׏E$<%Cu6fDHa奁.9jKjcLA-vRH):pm'V2"Qf 'N@UvI  /(CPvuw<$2Φ@+uKBЀׅ|P'S)D~{܆ڿq?FSFV|AmGVJY7 8b @H8M˸ tx/J}tۃ-`F t>_8;$- <1t.'." =u\|Cѷ_dG*#j|ӷzqꐈcog&N<$B3iE Yu]2|/8Z"t+q6e+ no =ej'l|`хA4Ccf ot !J*kTCVkoh2x/2#ղATE\,QB:%?/%(~G=E@\ӟ,T3Nmí> stream xlzS0m۶mk۶m۶mڶm۶u9gLMխl$kTBJ(jgaoHHI$,@@ EJ*hblag+llIfbLdbODEJ dghafL@aD #9+ /?LLML-M5$d(dULlM ] --LlL( L [''u5qt 21?m8A9[Wu4 cO##3-&akjGacIC~hHI`lbZƄBđ@і@f`ca7p[edc`wIXM _q5Ϳ1GJ,,+N6WZ֌@E WZ=Dg__@X:s`%efb$`dad%`f?l\Ml?n21q71Z_3 Lk )W^a\B27;zPw 0ٻڕxh&239& Yz+!4P(xo׽QŴ1wXbʽt(Ac/E؉_[|!G19A3)1{_ ڃ%3/? Ӹ؄tal;1پbk9 ]2Xܗ!=s9x=>B9[1~"}[ @I "N1LXPQ_6{#dܾ5P% wå -5U^8oOC(O&+EATl#T ri :jK jn#x2Y/}tGJˆ9$cT#6Ef#@sEDoY2^C&7@ ͢7/\2 '?G$o^ d,Dfǧ>s17cd'L\҉Bj0ֱpb +]ekpDB aHTՈZIq.F72S|i>rsO|_jh{w]گ׵d}wzS;$0G&T`)%O$}2&&z1nO$#iy" 莑_ثC$`W!:/4:ħ ޓ(no{:&$`@B֫ᣢEydۺD9g m.sj͏51 G|a3AŊq=H'*mxl UjQxscbT]Ž܇y7n-;gl4E9AIlltΠsZW6wAB9b{qʘp(_"7q.\|蚡;['N'M a-1ONyd34R8K p7#2F IP*E,|m>o GdX>\>RIW}%M~n;eǘ7C4qIam *At h-n) $N7{UpR4;^ƀ_TLl|Shv{Su&5gĸj=.}` zuHSwڂɍɷ3L>}ƩI'8g `Qҽ#(X~l/\X-|`8y%.;Q՛KXA>Q*i?S"=b6l)ֳpɗg.OR)+|ucx%lwo"YnKt_ ME%T=ImG.Řk#'f=4 \ K?b0KIq3x6(!mQWp & 0B0lFÞsdA[4+&yaEeg%!;bhlvPcyU`Q#"OB{ċMR۠v6O{%bufɖ [2:6@%+<>Tw8s}G|`̝ f8x=$DHIUM)QK),I=!.XWĴ<8׻4ȿl6jCa2w$Uifv;09g8+hWU-V ڷ˰{ tg}`ٱiFW4-aR,bܥ iP|E=OĴR '$"DBSkAE9/ {'ym*L<+.i*耾> nTRB wstJ4]3 C3|wMُ&GͬΝuZ1_̦jb.&׊}BW*\<<p䖑t2 Wx$\%zBZuc*%WK[CxtgJ lقLx)6jNJ؇3Z942}28nz@X(Q'ܐ%  .Sh ^5 FbG"7<=mY. eōr?U!K笶#00æoXh@L-0׭ė\^?èL>(E{/&7R]^[̸PӘ#hWC~jE2PN ^>rd}.s l*"#b@{ltc]3mU#'y^0EF9Bjrz/]FFz_%ڠ(yMjЊ7;L̖QX5Z !|2p{{>vx:Z`Jݵ]n$}?:M9WKvVaxFc5 'S#)^v%tw&𮘤g k˺F{XEd|XZh`!ȘS֒F9CuJ=IikB́o_dR$e3OBya+RZUrhdu΃TuEApGs|ޅ82Oꩂvs&g/xu͐oN8߾[PAԇY]$^Qek1YV|vynӏ%L>Ԧ=Qb8AzXO%4cLBn>ˡl:Ԋ_"bC'6|C̝r/#rC)1Fޫz*/ф4"~Ä_djd4rnn9;~?O!m-Iq#7PBG|9ك!K۪{DH gxnm<9M0̮u:Q ^s^f FUb)ovC6v:-B^onWqa3e[[:+!<⺑%MPiT-_ɌDU~WG ,j`AYԞ_Pd]!%)kQF9IՖ0 ƪyBTRwy5ON=? v)YRZپ6m"-}XM>XΙՆ "FENH9!BH⺅x亹|b_=j3U~ͬeƉ(?Kx}f%ɺ(Ėƙ3Am*m#.!\//tѯ,*FI /2v~F-Չxz)6Z==~ix޽>f=tG#Qv6h#{}'9bR$ӎJ1Km{gJ\ןCnZn֤e-+?xƵrJYO4ZG_'ͻrP_8mq0-pKUq)wr{p =$]P4J9;M ZEuCd7"S!Cm5`j^$ ]YMύ嫇ΐʠJȡ~?Y`f6ˈL0!M>kշ p),/!b %W)~.9\VhoZp(f=K8~qvel>?L ʌQk1] E)-lMS>|O^* (KU6Qfx1,E'@ SF&eU_n$!Xag[rCch"W~I*TF~6'Q=%Pw\5.ePSdl gUh!D)50܁<{ݏC屧2RFz|%lPIY⯜~ dԋ1w.g6 x f7opH1SJ`8'^6YI0zi&` p-b A<6zg/]OE ,3VwW4Y)%lĿRh_i阫f~7ye6YD-G0(̞n1 1QƵr#aØaoM:#I$⃸P ?̗`6g.r+Z=d w` *r?{N11ʩڳa׆BG3ұjv^fdqIIR &rX-_:ͪC:Ꮿ%Z'f01@fj,$ ݵ*=X0lGCq̭UX`f^-TДg5C@-ŽCɏKBxgH`nb!( 0""pb1V{+Sr/z㘶kr& 9Hyn)+䡕)X%p3z -nLXqGT,nk$;RD?o;F$KZz1Å$Q@$H@z}k NT20UGifg{@ f[f?)8viq$ent>6М`Im"d|厨ȧ`]\݅#ֳ_\!dtcBYu@r Kk"0Y; ,91DͩKt'Ӕ&1)%v#>Qz?rT5ҤIʡ[a2=-aOfN# drpcNkg}w&Vd%3cWߣDg37*0݉Hv?V/MH~u9RUʲU_n+86Sgz-\o"vms ީ+&]':x/QKKQ1}ßdG؎ udiοK5j_Ǻc6ټ8gJG 7ƭ9;B(>M>i9#B:u[f-.dzzu7.y]Ef>Pۧhm>~o/Q\ قiD#E!6+<8(*&NX/i~[7֐}dܪ|&Lq `Nӛ\KΔ! #󾞶sm>%XE>YjOV@^..HેYAUE]+;,OZ:N pT*7d5K?fre@4WUdtrO;_8'$-lNRO!.?x2('0QS:aq)}^Ǒ.YE%{1#dsB WzBW#z˫ y_,LCWÿΣ{ Eڛ}08S%؀uߠ#5*(3q v)e k~̒5\A!йS_,4MT6SJ΍̉>fGUZ2i'U=.^̼kp'rx'(UD?dQ n #<s4Q))4ogB X\} }9wL[aؔȅȔkpTbzRopOmg=ka%۽l^ 90?,Ib?z}Q(#t_IG5dzeu+&`_35}Ge-0ζ%~QLXYu8^Me]'Ba|iΈ|e)c %(Mc3alidb`d'm/­H"QA==#m#7lEɢgڋ >jC(,eRwR~*FCUIH0 L g3h6g7O2ԈEa$\q˔Fz}r|!RwDth%VՂpc1&汀 /&uro5W7UjY0]ía"ʨ)*@ Dfp"'oif., qZ&#Ķ̳W 7[d2GF'L F[(^Cuh~w=MRR;i,(ASW G%|ԝͣ eZclcxaҾ*W8N{`GDڹUnгu1'8'엇 ;.A>J*H !uRU*0[gAbLGEXCrl+ʷBXz/J qu^'9H)k. %d^=} yΝȗiZ̆h G4 i)=Gz?aOH$fKWB3E:z-8&=ح{Et GQ9U4YH]f(Gx$|[uبȮ#h%gٲm)c|HJRGIKHٰHN#4,^\?j+2@Z**ӦClo (uHrr<0[>= B4͇T2DM R=x܁{jE0> +刹w"u"c̐a;La4XIRHeCNMϾ ,_9a5`U80E:3hZ<5׻G,&KvrƺZaLh}jQe0t.eI<沂-7v(?F&{>/l*^>QĐkh(1gLDg8Kݕy4+Ҁ$^Gsg6 )a]:l9$gzFw凼7vJ#R8j|,ayokAD wdC0D߿4]~謢Z4@ʠɋlKcK%]-ba@t`(Z2hG1\j\8rao߽jP`JI lh{ip(qxTѸ#%xT< G%l`MmnA9%vz{}LB}>lKw)(7n.3ƖcwdCَ*T@F'fXdџ%lj1#9|ac2[_H r+&B=$*3:|8( >  QAU4w E Z tROft#J$nn\>%-&>҄#oHhO9gx*ũ # +)C$51A_ 3@c~$!Q,CpD<I "ܻE хjh6dܖRHh vot 27so]gUF+FtMB6; \(Dhv,ukӌfBmzzǶql"q4b 7#&9xc|9+9$t$ o;/gP]וaܡ9t{'!v@ ) (fc9jW`Ptsz<0;nMM+*{1fƮUZ<˷hnٵeƒҐ[Ñg=a.G;N]T9r:E|&,iI-FWqLs(.;;r(2-kOnZhAQ"Z1eZn,;mU\LYl 6ϯu_p]>~I7=`P~^_JOw.ub+nN9e kUdACL%^\R;b=6I3qBD 3_%ECC?bR[82F`X,pJNpGc%W6xSJ9{['|p~NIK0q\ϧ:rCP&DXX()L$ ;_'*ZerŢ7>,y4%s0dujnbh<=9 uUul^QTN~O T-uG@D.I cWn(U!ҞxMRibT3VdDN)}J|,Qpho5+{\%'l5H0gL&Ui=> NSh55ؖh1CYݤ8U,$ SZ/eaw){Si'@nVR>A`| ke'橩44:: Y0 ]oY;4+AkDjFg%VI`%|WEiF(약&K8_n6/=9dnqPebuLBJ$Ja*H?Ãk>煤P|Tp$լbu0"m L p'I"7<uhe,uk?sH%+\gU .vtOhUd .Ǚ)E5@,4kJ J>_dksᶊǞb}(ѣ^ϑxÔs .*T@4`EKL!$(gCx @=)*QN;޽p9ǡ-",|=j(dm=y0l:{mQڅ&c̉T(ׅS {.4c{Ł8<݁7 ]0l(׵gF7c, 5 '͎ٱz>@Dމ_t{e@";enHp?EYmQa(w}PdK2TNGD{`xD]??gZd-AfPY@ ӲtZ~2ߑU|\RtɣٱК쩒_Pۺkc{1)D}ř+bN+&en l%5I]4 ~$cY1!ڲ^Uda>)߷!o41%\-{ODLcD$+uқ { [=&jŀMz2D,RՙیB$ U8u!`::Cx^uxao`nr4NƆr+xMpwWқ0F=R?R6c<Ն`B,BEH6ǩ x I}(oHXq@݀ޡ1.⺿`t>43h%`逋\iGB3ڽp4e:MZ6L ,L_z8lSEPR/I>l ^6/)p7rd[s[N Ne[߼e1;Y]J'u$WybD]?ЕvZ` /kvD$ӌDoXx;UG=rp+f6 tsFo @3!l&2#yBsjMÂFztz.=" 9_ӵ.¼ND{\4Oʓ䆠p7< $;E:Jυ\ }lw9<{|5Vb{&\T'NJ-^x3{!*q&)UHaK q' 3Z/>ѝ>wʕ0]g;~|Eawg9P0QisY2uGɸ ʍoT@,g$DbrnA? <A-ࡌb@q?P s[Yȹ|zZr@[Aư񘤺@8Ғ7kS3xȂYm'[Mc=sƗG[}{D$QAᏋy󏣀 U߳-LKe)ASVE.X3eћ.N)v 0bFÎz2\z5vǯK Lz XENnቂNG]~ss>Fߩɛ&B;|\a2UVڦ ـFVdˏwu#&"ikWW,cvn:g+4uZkF (fʑaшGk G*k1 #f"LE$fR2 FnU0)<2ڔ&-~Ze:[ԯ2xU#b#``"QNo[C }ln Uw*rAQXkheaJhBbh;rocB_u׿\YepO8p_N J!S{Mٯ<Vfvb% -U𞵢..NJĝk caA݌!1-{WW,1o7-b0_A],1jYoх%`(%`vKoOݺ d 9we7Wle=ҼB┯M ur5RV>qROH~F䚪V? 4뷻i_bmILZ{Ӌ 9cщuDIn )XC$t4#=w,@몘x E br춯ZJ9a.nG4SiN'M$K@<ˁ/ :Pw\LC|euxv2+FMFyvy&%X&hISӌ. U?H/>k󱂯:o7"@*{ Z.* BQ1h}ōhةAVŃ49ӄx:B+ cϟr6JEWr_N2_ ڕĦoR+Q[8yq5&QӾEH|Qяe3$vF )+Tsbfbgf{aq|`-5UK3gUn~;KJW e#)Mдm(Qė#e 9V4O0{K#$zX2֢oxֱ*(F2hZr rWtELotVU[;ഢ{m#EҐ bAw 3y|&Y9nFGNERg}UI)u>8Q+br>7<,U(~EYlL{^_t#JDQIqmn8/:ePy she ;jr0!\P:0!-S7ϓ8,n<=CuI=Jk يbJ0qŝKzY[# 8alГI·}k 2O]FN0\O<3@4-R10}\ 3L*9L| Eb]G.,:ӓ_wS,JPc/z*KR Qe6H1`#wa1!7㌫;[$qamhudlU7}B v7ԓiʐ#kbV@κh2I*HSƌ%HRxxœw*J-R23ZlGW#YDgudY .{73aBCSlbx=߫8韄A=]33* P2vE˾ݖoyQ(Y߸* +U0EUTAvx5*~EIs5"[൏L*^v4A.PEvA:}_s|w>v0GJhl# ,xl=9~۠X|>wA($$M꺕ZІO=EPm[8(x$/WMQ`8 .Vi? wExvW*a2ju?2n"Xa` F,!^XO$h<̜d"YGO @ǏDuLNj+0ݜ.ݥQw-ECKq}SO%`ؾa?IdTِR:4 ϗAn(2[\OR?*zm94덷I`#;T0c$ 6it)XƣS!B~_,jr8Ԍ㍘P WWj~pФ$vdlBTG褆f@@̕pu@i-ڝza=aCt:_j E/i߹$ iF^drlXN{r%Iם' T@&Bϰؘjկ;ܰb;hG, O [4bA$M OH t}`Y]Z#8;0H!$A ;Q<8!0Ysʥ$ 9ͪq)t. ue/}ZyRζ t}о=/ ?>zcl%48U*tF:!3k( w#>SDa=LbE6@bsY QO9`ٍ @@|Oճm=uti_We&|T-ϋ+@N$Ln'^ h!wے ὄ7IF&D$\D Gh~=Q1v)Zy:sDH.xä`1;"HMֈ(<&bAzbp閲,0)f/Yc#oQv;ՊڎUa&6.οƝо Zs&B/f'iN Ef>K5uekNypY~e(K=1{BUpH:v4APS$.ÑYRe{E@DPN/TݒxRӡQ#_]ѵ}}ꮙ#:gN8 =_w(CzCFr72G s%´LThH2}S>8~C$/2qc,s[KoQ{(h- k4wW:}$r+B -EU* Pq<3 ^ 5tpVW.%цףc{< 6}]/amwRs#z3CS,f@/_c;hW9WpUj߄5'jp6ӬR54]3nsN?54mr-x /4D 3LZTCN$|ی*<0{rOPCK\Y;dwl(pViK׎/3.-@͈O!BR!9~o0*Ruh{Q͋g?ɂ%ϊ9=/#_/+֎:̒e(jHJG]b-U?f!]͌'|$l&$nmsʢ)Ni\;"(̶.(&xi=T.sc>_)W'#$HϘvfKţye~L9ޓJ-PzL˸_bCke-;^o\ɂ~I_6?>< }{|RA&7Ϭe(0Ruﴭ 8{eS`@!pcqbbN*[xu囧tGrk<́*k g+:Y #oGmO SNP0̾*iMQCp]_+A}:G+Ay(|Vܣ!~(xI/yOcn*idL\>έxp]访ٯa'V3zNKq+kMOv3 gUYde`T 0'L_jdʠGP?;FIšff fP2Yd'_>ȹo&vp41LH+,洩}}' ?վ1oz`ӥ5[c`~mL(7?0l;|.3frPHKe@)\oܜ^%$k#|`8atT /hY.+temy#`O,9a v1ȧi!Z[L9*ąnF/a4aT~AQ؞q-%m`:9G "_dҵk[~*--/>k$s9,}NF`]0!r~ݧ*jںر ,̍%fC:9mw2f1{grQ'Sd\w~l!Iͼ|iIӖɊRo=XksޝTIv:C,Z6~{ش9iqlX-9ckZ[T GutLcCtd?{J- 6-iQ )JjCi/B{̿$ Yf:լPN}zM׭皺F@'`,6T~!Iٛa MӜE܅?4jټG0UUE/ÏGBcw]ڍLjh>ߍ֦Jly Ќ%))""8%})4*p) s)A cCJ,Jӆ[v$\wݪ8dxdxLHձ#.,$ELɼr-gDx3@؞!i4@{ˎ")E Q\t YLzgyn~4n/Qy%CNj.d= }E`Kg(|IHeތ 1PmK3X2vvAd$jO͚&Inզ9˖$} [< _}4'Yۤ5΃}306pO]D]ǃ9-D1 r#D}kv~)jxA4?[L!i 7ܥ$B /C$~8l(`/w\;3@7-eGX[NB:BT- io|SPn7mɶ,!wf,ui,nzճNJl4uٛt295i.W=`e][iLj~il6U ]2%^IwMx+S~-ޭ1?D'y5+!S'gOՄWngKx$㶍 {^`Mj'%"YÊP|d54?>sI٧?#Tl%1" &DsA~Ҁ})FAS)&(N- .o^/F")Et5z]ӌ?Iݥ ,JB8O<D4)ڟc1RLtƿګ6``F&Lɗ *yiH(ȏHXv8΃.y"/~YG#лzMk,)Qjl AYhHfv B{} FO6F6wJ=GnώˋrPNx&g,C`%ў[kX1rdn+8_/2Ҩ,B?xS ; 0 E1ŻY}q_f C%@BC ZdѠr'N>8Ʀ%"\f렞b/h0z/ G0 Ii͚k%+-%,epYCDcvHB+\ 9JZ /yU-j686h'&YLPS3)dvxvߒ7ZuF>b ҧA{ -ﮨÓC~hwݐwܱ`]̜$hܣw}+}$ Vu9Qn m\`OTue",NR{v!R~vGj直M%-Abæ`f]ayRf[oo҃ʘ25`LoDvi50Mïr ˔66 >i?> (&snze0b9z<ڐ 4n i/X\$x,x>01^*& xd(KJWO2zs xxOxhݚZzنG"Յ #h~k/p\GԂ$*6S'QKs=w nƂ7) [r%w_3F IJr*"GcZ`80*0`A arBz,s6@ߤB2僤0wVg8sR'sk?ۺBPRnXBHpnjF~Ni2h"L J S ;3}˧fNqzE:,%+9Xc4lKer0 ;q{}G(ꀥR@ܰƽ)WN7+ R@AvdHɮ "!Vsٞ$_ Q ((X.>>b"tA)LQkgҶd?KH#xo!X>SvM1_v0N=6Va=, '켥C. )ܥ逛GD3/dc/(+ [{kرqaHp!lp`mRXY\"kW@\a ]c[chj\1-KGl5US~ b:xK{n¯;Vjq쑙&Uv-hE p?s%+\ie=z1>ҕzɉ55uXîZAg>  >Jd%>uҺuO7:MzW+łQ)`#\{>2pBsC$(u3EoqSF! RSxj6*"B㓜^]30+KqҜ׷/fdʗ(~;(fc`D1Z\mc\WQ]nXaع.]boQ4וaDm?*ߡ`ӳ'P4#6OBT^VwۨTdiTEƩ $ }r<tL-Sdx|8BG]PU*Uu%s˞E>mB{we '܋398JS՘ݹp(wt"ynZdXS[` X`9{H!3pZȠ ̖.'2iNјȀXSo=ٞ{iyօ J?y:  U%S)bI'rx"}iYmG\'Mk6ӻA(}ZMņMm'^T3ڥ%Z1!@M'4 R\g}sbѸw^SDlDbtHqXA0m`T^[&[@ ºGob + 95> fvv<.VhfFIYHT %T!>,N+b#;\cөj|ߣXwPWۺ>j1rvKNQsDbI=俦FFIicL_Ё.=K)x.n= 6Da\{_JlFAJ-BMMQ5)_na'v\EHQ))FXZߔbK#^Ц|[$?++~i_VUߺHG_ŖD̾whBl(@I6ދv;`aDuy _gMH9o=jmld<ޖƤ.1#GSur9tChɓ쬚Q2ws +,+0x i<|3|%ocŌh Iu+4KD(M2C$U:s4b!48R),~Έa$!]Yd5 ~ Md]lm> ,b<ZY_ZKo4WFɇ &l тet SE1}h;jwP+Aڬ :qw㏌\ylBa:v?:* B뉵.& /K[5[Ӗs*BRh#CJ1[ EE_n(QI%?&(Yb󨌓- ?PԹd:F$˘ P-6/rA{H{*[*dX1Ch !T.ŽI L߉Ӑ!?2'ÃTŲ9퐽nC3|6rFgW콛bCHvFeB-6(XzFbmBe aO|d?WDG$yYF9mu1D`\a+L"xȊ[捫ͧ1OOr{9DS9Jӊ4rrV#]'7ޅ`ž,e)[#Ty鋧 aQtq-KfƂҞv=w 4Hjb)oPo^~FFzG?yuۇS#WfB2s6h/(2xEbC[΀U?n JO_q8^%#ѶؕizYzeclL Tch{U=l#WIAOȋ iyW-tS\9ؓ|aսvxMxK?mi8V'I y=0~9Bй?ш.ð b5ólAoV&Ĵ@H)q 5ׄ& ӮimI$6Ȑ\;L0]n*?:3!R 4{?eQ3KV듐Zue:u ~zah`BJvx}Thq?c.XXyz D!,C&hF|%SǺ|}7Tн̆?ޖQ=<_`Ulg~  `PK42Y><:uB@=5U.W+ft"JO^PuHEĀ0@ZG(QAt),z:6AyC*0G~g&ȍΌZAFv7{ 1Ägf,3,B\L6uEGNTz#+| ณ)ZQIN>nU:a@\qꤐSXd&W_e,{ߞIm؅C z/":V/eHf+*|,[qud!VGR/X c,n{f b?ѬgyXܙEr.:~'=y^z7SwVeEC]_+@eߦ-~3"qS;ꥷ~l)[%lCy2zKaP*hD jYaZd=w,@zWkV ɿ'n K>MI^خh]M|N,Y>>SscH(Xg! 5^O& N7JN-h=*tMPac\_h]u`΢v;g%ԼXҲIZ#vjR ) Ƀ.V[NH_[{xKUWCٰ9_NFLs}7aVEgTQ ?@c6ꡃ@Þ9c]Pnb&Hv.mgIpQO3,cVͩA5%@zePwUE.nJ#9Ґ˿q2:8b&40yDkZe~%fOٹ&:w$ZGc95@sNuRabN endstream endobj 838 0 obj << /Length1 725 /Length2 37060 /Length3 0 /Length 37531 /Filter /FlateDecode >> stream xlc.ݲ-ܶ~ڶmݫmj\m۶mj{w'grȌHE"`g!#q25t5t1hTLLfFF&2 ҘJ@&JOO)`fic QPԒPJȫ$LL mF6YKcS;gS*? 09?̜mrbB 1U @Vp;gM]\U-$G$z&& _Iٙ6qu@P!oWyC[S@/ݝ,xHC?1Ge,najh.NQk7r& 7jbog2Sʿ1H (j,fglobigPqOC'Q۬hh /N ],=ڌ]t73#' d_p]L\M?wa2505Y_7 Jk]'V8WN37cF:sl9datW'6ЈojWo3a)T4Q k1I_R[} :n3/9\ԶHk͋C&$Em\9߸$f0l̈́~JܮLܻ㾲ɲj{z lhzz?4B8,W|ײV#+:SYy}+Z4Kvf+#à uqAIu KKm`I)t5&1_dSQnmq xB3,ț9 VE7ȳW"F9,]ZOJYuXa |U ᜀy [Re|5 bG9a}S/m0Kl#iģMչ2q>㹟`J/vYN .K'?0Yȇ%H񐑚\bp'\t/S(ײ\#(v{rd9X %i'y"9gi 񸔝gkoB&ʵ]Fg]LΧm,(0G`t5Q\1ZE(.~1{h!'_VA#sz0,8 ]C| \d8婔䴗Ed>NYo3L9:I>Ul,^!*GBײE\wX0RVª_SbYuJ13_4RD7qOļydL]:00w/WH׭.〃GtK}m[AC 1l16H/y{V 6qFSFH>Ѭ&Iv:#:,?Bfo+-UDTizn+OכJm쟇4Z,&݀)L9u~ T,nOF1O.HY6=hG$]_Xڔ(7nD~TKOⰴ1&s,h}+?gFH== (O#@i5ٚվ1ӯR#ʶ@)hdsH gD:JN&-j>+BZҸ_jIn`3,7t^Q7@bƺ7&3g";]]y4p~/'wxY}!B.NdQ}lC H^o#ઽm\A%%|%VoetM½GȋؒI N0LӶ[`L0QrDcUj d=`{VLu71C0Pv UEHE'_ٱlAl4/%zdsc'sU3۹,P<PtJQlۈTO.NRizYg}se3`0 ꭮,^c5T6$uw/xFXD3y;r!.b3+.ݘ2,8l\Ie/k=0=i }5!v?: Dc6jIjx8anpu U#mr[58Qa$z#E3W z3 ļpGGX|/u>pCf0'R,#֊ZSsҢѲ-}th6Xdtcd yaBKY]fkN 1>*quT)nwVOX/c s^iu J`5D_?;rEUnesyΦCN. ymh9,yTL֧`" }?0Y偼fQ6B_|Bz/VXw"mt< |M{.߭) BqZrj@zc/' eNtz_xppj|4fA(O[NV\#9[S )l=VݛHތL g]띂1l )DPȈVYţU̵|v,>ؾDt 1i0%ߜi7[E5-sin}doR$ǻZ^oa@C@# {`$$*cy}Z-V8yL{#k*>ѿC-xT8M4d'KVv- '380zCDq4E^7/CM*2cc,mzwjV\U*빉2G qt|[1+4X\sZW9KBDuVV 0h mls:)RDz067-lrd'YoW36 o_WƟ|dyYKe[PT{b4ߍP1:ʼTD]]1Y2)֣yyf^yzO$+/w'(A),&vL&$6i>@TL6ˌ%L33 E,rͷYU*󞴨M 'Ր;[&~ClXBRNJt}P!rDgd҈+T%71g0P-]埰K;\6A|h"b~Y,GHpO-BK4[D+$u!8ecDvf&4*aw+$1]r<(BEGBzNd0cq\GW,;Zq }LIw!ql{GƤk1'AZfI+Mu/ƨGk)1.hfWCobA0ZM(>RZ s5ҕcŲ-zM]#g%BR,H+Z)TWkP6pQ펻Zs:"\g}$ɇhdM}; ~kiU)s %eͤ>[S}oɫJB珃Hҋjo`ye-G"ځ `22K;;{AmfD;_dtmUuAR#-=q2Db(ۃeSR*2t?<G~,eU{kC1Ko-嗌ɒ6&tޯ4H*L4,[bm[fГ`OG|]5llȾXӡUmYkaw)Nk|}y߄ o^/[3,G-/\k'o3t㼢qnMȻ(ia`x7q3YtWp/B_OGσj1O*r&EIѪ愝YTt1%hlԺ'vbtؗTM֯81̱]ҦK,zՂCH^ 3̵•[; <^xi Fbo'Xw'b-f~|tj)E ]:IjvީAԌ+űʇMf5Eܵk^ zXeΎ^# bсH'v߂\D4!"-~n(Ui좂B,< FK|[^Iwڐ[2x:Q- ic0hOZs8(}^jtyH8)]@ܵEY4SX`ȼ(;/cM`R30UPps$[E.,6/ȿqB}w=R)YdC @n2@AfN"WYf__i,Z^#suR# 0D`DP5E"!"2J臂A1x/KAv!ig! *o7ߺfNi'&A8t %4޴p!⁀3i7O#+9旾5Ԙh$Bȇ_ I#x2D I쎿fx4Gf*gp8f@!Yon)uY֮pTg IIm@J"N-nRSzǦOs;VEW{ M Ň"~ B.Ӏ[mIi|W;kHY3%7&Ws7t#l^arG% Â^܌3%VyN=C |ezҲ"wqն-$d~iy U *vI/UհBtUm[ir6`QE9C&֛:m=-Hq/B~;#*qb愧.c%$V@^|F -'6:] қc (JB=z|.7JT.__ٳФ^FZT?J1P_`<=zV}}BϿ=(e23VŽWƗ? kC|gd! @NGGSzL0~ntldl wBox}>=yvܲDN[1)/{j"KmB3⼂jET ӛ0mH݉;56@XXˉHo<&{M}[-ŃG#0_)?D|#6C@'k"&a qyȏWE'n.lr^K.Fd&Lʰ<7A#KlMQ.BHtq5ʝj~3!: a $VpxoТ!gUuU_ TRJU_y˷Lmo#Qx2rzc:œ( DH%:rdFۋ pupd7xp~foYSY,OueX'd'nxA qe3)}cKWUYT(IFxŅ ð[4L#g(ÆQ*Y? {EAiD/1dڥu'Gqջ~q*dPt[ #m֭|dדaFR??RCh|Oqa6v2Ĉ+1(st@|($*pg9C8U`1 )@5Y yY՚u6vXyWZ}}v*(u!Q^s J73􏨵/P U$j\h}a૓HcIaxGG}<%EPHNCXqOKDL>1I ΞV(J*Zqiّ/ ,|1*/P&8$p4Tn7LNH ^-?p&\(}SS鴵OKƆIj dTl"NT߷h\M럴e7ajZy_1W OY$by1/0H5?(!$Fc߇DT%r1%tqC^1J/B==I%~m8KpC \$E@cOih-"} ֨ޯY0#3JeIri|o,2ڔJ86e:ݵfGMF][w qRrYƲw)Zi) SZӚ&*E6"rf"`sE] '?_ CQ=/2rjAuUk`~u\L!TBIJD(HVYX_33-ufW2YjFK^Hrd3]҅:Y#Tlki}PnVnG1 m%͌ Ye.٪/-`)m}ON_A"wC_; w2bf ثphפ'ׅ%y]z9c۰llb̼fD|ǜlɶ {g<"Ѽ55y2nď!gs|Ms]XHfWGJ/<(`_ζl6n}b(OQפW ii~$cJ֑iT]??~y3ۋ}DuA^?ğʁAt=E7٧k~Ҕ9 1@n Ӈ88Mz}r>t 8Z͘Zi`gz|EUȬ#ro^@Vu>J`?m)O.xm왜NCYXr]=SB0)dF@| xh'jRijVSi뎄M#BFY?8k?do\5"oY&o_XiwRg4g [?v ҄2ǩ}(+HXꝈ!-џI)T])s4Kgf58VTS4D@ jnm%Iin(~kܾdML~*:TMsL3nieۉhr H;=2h|n~".H{ZĞB{ogo9i1g]犈dYn s1:{'l8X<`Y-bױ,3P[%<[)qKlX@0 T4G݄}s3X>{tejFjG8j c*u5T !GǭQ2NO\EU&eBj_%3R^r]2s}&wi!FFD؝{"B#8+Q==̴1򃡧Hm}2h-Fc ho lhm+)0@ ~JI8 D /}=؈!Ģ▋5.% !~閏X\{LXk-rcvق" w2S:,PP%H oo.cDW y\(?g&!8ȣA@pzH))) b;Î*:oZFxQ?魮=3{Β)?N ݲ bI5M#Q0^؝8X#&M'q=4, XB,!tp"(}ObZ ªpZl`Es<h/avwyK›u; X ~4Yp76r.sBP"L{Yq(w+t$Zix1] ;}孹QL}6zgǠy'(B}sHqT 2XOCTtJ؀~8m hѡ?xۆ刷 ň/6ȝz/s3,5s ²,”^1Q=g >"nڷnP>s#;%t%6l? $j`l;pϭѽ} =Y e˙pǦZα8:\XAT8=,.vrD֎i;fgykrw<"7oU@mKϴ"Ƿr܎ɓPuef!nofGJeegz|dop~>Ԓw%zjuUJKQ-If4ͤ>']+chڋr]#3wYsoElVbit>+ /&(mv;4ܣ$(}䛦>{wR{3QLDoX!z'u*>m&cɶF}#B'm+1 ֪?aW2ƜZѮ ꈞ TS'+9w/PJ0eR?Q@na\UsϺ1K=xX1߆u*N%ZT9:ZR,4>q$Y>++{cxI9dTDa}-A!Qҭ|[$ 9Ã'9=O9>ߎ\ylU݄N/։ NB mT1Uz4d:R_-:y-p}iw ϶5K ̷'{x}=7'sB00cc ll7j者50V6XC- QF2ev?y^ KS qR1 ѩ65wg77@Nv9xc1/_K "_cxuOhS"DYOt0Z>:|փ ~ܖ%mП;"k:(}zTZ]-2 |Pd?1#o@x е@@\88aY,L5k7=ƮlV}LcAG{y69[t8"QJa;$vV 1Ah3i_?p\Pgӝ(Pio :?_-]<{LS ˤ3%K-R"2k \RdZ%Y.opBouVxY<VgLmxwD'Kh^X& SgP`Wi3*U7~sk[qz{3Nst$=-tzߕFtV1VY]͝kUZ GW(%P cJ"QrTrLՄk8(zXXL8>,uwmwưg]TDZĖuJt^3iߟ ]RL:cyS;΄䊫-aŖ5N5s19Iѱڞzv+; ]^nK3 C|>Gz#pycc8&s+(M"cӇs2a!5sX4v s7خ"{DYے ]LuϘL!h\I)j~yBqF5ed[ Q knKe$se?:3kKF+VFc`/{9]Rnnh3c60~EuɲtPbu^LBys^MQ-}'M~{k7x3T̉O3e'&fc\%op8Q<ϣur|s%(+zlm`ڴ*'`nddO`aHbD ,TdPU6%'~/8dkc &yu4cC+6,WX $~^kȂW>|#iq2=~51tZh*\ SǨtɐ:(E!̀|@J p෭~og8NԉQLh5vblpd1@#Cc#M^IK3`t sáa:=ATqN+][/nDo=-d|"xzO(8 Ԫ/u]_r{?١$:XH[nDfW*߈J2QΡG3:q`1bh Kid+ ةkتo%aV:?MI΅SB@7bZXk%à+H)* Tl+sHB"H5;6 dÐ2'%GcC/0D"| W(s.qM/ ,=Xoio8HVqm)ĵTϙy%qYV|t}QKS>Q$9XTCiv4"zSmne(DۭgoTQ68),EȞ9fBdG$]IuKF݉Х gQXYVFV?hGx O&ɢ(ue>9?aߦ:9;AC 7IDS-x.%MU3wӊ5zo]J&-p|J8%qGR!tBٿ3K9Hɂqݲ6] 4W%H7z+BIr?W+HA-y:}F+ Pє0ˑmLW'\/7<+4rrPgJ}9v1!zTЃK P6r?qp&xN`ʞ:ǒɫEFRA 0E~SDLhdm\>f6ZdsXPT2M j:>?hYydqY|&>DGœEQu~F4y_.#i@6IJ}ZL?9-j21οD-g9 /}TAp{Nd8pMmvE Y Ms ҹ$#HbgExu053Ŕ1 I:m}$Uk  'CvٶU<4u~I))r٫OfY~U ~ 3qND>-)v8vGF8:V@yN鈨{sV2C",!2'#ul xdGM3KGiEW/O&˷Y]Nl/GZ$)wvQ`j & <#2D)֣&퀰J[SR#!^bP~\J&vRВYъ|x).Ӹ}NӍGIWSDd`eYdTP=gPyhսJFH hGAf dvɖ vnp]֚U5j_Zd[HJ_imJ0\ڹj3X/D8Fpt<36ػJO{kEk3+^c_\Z@n,Kf.Q]"Ae~Cbp_TFq'7Zn~%n:ɲջOU΁w90rDC(T߀i95/E\"Uz9!2d(z[*h`m#B4{goS5B䨍j;͊*+*4:#_nOe7WlzovWOꎬңM9z"U>gp˅tNQDerO;7LM‰#,C:r\0M& oXE'F. ;΃7 PSDh۽+|{,u#VYtl <(&_H[xz=͜3 M/RExHNV*|w@ B+/qxؿ'T ;3:T Wf,`h?90J 8S=;uP:~ahNSB:^X+q;; ^F.ntbK"!%5uK]?lD[G #MĊϠ 9 q=w2s{ Lr p1AK7ؿ[U}L Uŵ2D!Ew^S3 & :*Vf82'IGqP[X~gt;%aK192Fm }BB.qe)CbƸJ<_r!wNB-$9AUS5Ch^)f1ؾ=IXglQ Lr{l)3 hU ZhB!_'x@#*垚ʡ|=70?IyBvcNhjN"31P]Ho|0jVKf$n{C^RGM^rG<ˍ&Pv2ýi ]r}zX+A5xuɜ߅Qu]8*U9S}Dz)mmy/zOeP.ȡ"tv' e_@on@]6y8$d aG[J}C4>f*mş,p!ojaT}mx6I!{5筬?['yɷ +q$M)V[?Ҥ0aTe[?KA!UT^Lnz&i6KAZ_c23 Q7CmzP~ hݗ>!k k¡u| 7{EJ=^K,S*Ze&+Ix/M<$~ZZv2T>""Iy5hb_+2)9z)"}ٵIbx׶cxq>dè+p! }vl ]:7HյwMk\#0 عPN'1G=hU7qKp}Ҥz)n[IXPcNo+|fw)NAw~IKc3d?<suFA]r҇TATˋ2uXXҬՒs؂5Ղ̼!p,Ϩ14 J7YTpܻL {0W 3w Jlخ[G,FBj,۾+[v3o tL\4V& %lUAQE|]9˿g"R1} L0 ^hv+u w#ޙ 2|xD(~258_R]o:-IzFCE<ە>&q#$f2bH k~s$)R5 ݚS;Alu\J:ЍC?wx4)瓢']+>}Iti"koV.76ƺL85DnSPLL&^_ 5袶 ڇ{(_@$CSHĖIyvj`li dVdxkLY97MʌI AVϔo'dbBYB`R>)Ege41`zȶCD A|r=J'-sc'Rfߖz}wJ濱la3YG֢e^z8}=x8H M0/7U8YTEmH;bShHl|I`Mms&ŏ%qHsrFAj-_spys<}'˟184y-{pD &j'yݞp`h+k35֮2a;kڔN .#tD [E^)\zglgq~Z. UGǞ7q 1dLMސ{]8޸<U " wހXg;/%ldbQ:h #Sf0x$NJUkzeBju5ItZ.Pwde~zc̬e)<#6'uMu4΁l4cC:f.Ѿ 4^j<عYnN ?.8=X9g+^Y1C-328Sщ/)V;C/)[ DԛJ$] "BL[(3>c tFGCCkK'KJo^2!< тMB k\J8N27Gs,× -T&J.nryS#څdmHCν进~> ;DE{@5$WɷDԵ%wZ^g*,')hc"*Ыe ܻs1bO㌮Q)GBb[Z R;MGE0=.Tdh9vh/ 3kDtV_7%UhX[DqI#Bs(wՊ1vS\45cpnج5E 厒wv18&+7nE~pbr@oNiBSazd Ro-oH{җ5;5KĎh37|??~X Z F{^1l;(y\n+3ӿy^yW:Œ}kZkJ,z4Œv5hDavVQ 3Rt.} (SE""m8S1SEMo~) # `Z<&ʹk2VJaޘ`6ҍ_eiT1JYssH;X/\ v;H7B*K2JS:y8%7cd}<ؘyEܫK'c'>, #6yH5NoLM3EGUhs\}ʼn3X%ዴ`P1X-K'Ѿj;bFHxc~i kd<+Uok"5+a߾-zI,!u UTBNDrD{"ֆofaJ5]V8bظ(Ç:˱YC f t,$ HPB&MI,)En떰o45)v2;!qk9VTj8#^b8Ᵹ%9Siq&/3(U00hk# !O(}*_a*o q^x!`{Q? +-3AaGAʀ)4opRΘ#OĿ2Nɯ/\//Y#a]=M*Vd@bze(nJ8GB =4Y5HLY7QZW?>Yd V88~躯 %d5RzR8y/x3o%ɣz|IJm]fbT'b.U 6FhF}uKǽB (r|qcJU s\[8-6 tBF!OlG%.idWBw}iDd,h₼)TqT&PA\Sԓ Eՠ/xmٔroI.At?(C 4IٹIJ[!j:{kIFxHLG=g&I.Vȹ@HtJ[[1csӿs;,4L9<ڜ"q\kaCyS˃/]È~EqW75* 1=\w-ϦkzW0ׇ^<53Ym}23  !D']+)ޅ'Xz7P}[?$ Lo$Z1ry̿dDcL+Tu3K{=c8WCz[/ sed{ho"69X0P^$*Ù ù!ڏEb_˝0翕W8qvV lgkwOzx;}R tCu23z6D>@ރN[6r=Պ#u$vgt퍱;]ދjS5T?egX)ɞ{}cRPh' N+QOCN{)bˮ[ }yA (ȇRcZ+0{,>(Gx|(Hߢk>% z/%eRb]XZu 4gH˻O9z  Uu>ޒՓS􀚅zSRɑrS+^N,oڒkǧ^Fex[8mݍɢl2T*˛wIPNR)x.IOJr4-Y^ is!_1D ;Gca/UgFp D7rQ)~j ˍe=dĴ>ɑ}a$)}w%o,uL,V<.+[TMr ,QU_,G-AU(Y[-DƤf{M0Kֹ-荒"~gƧUGx6τF`BտimK*kr -X`DжM=,zZsʪ9otYo%ѕaqG++?;C_+,E{%a Y.v#.Zh"5V4DRT'N ԤG/}8XXEܚ>DIg)go BkL|rlus;pE8w~K~Ar˺g"'li*\HZV&^W@~Rα9Y-EAPʼn9Z@3j ##5Yj[Mmܟ92(+PN5ml8A?~NO}qfO?>UfT"ZA5,̮˃]!u)JFMO6g}/"2Y{ YKWlˁ!,9/ZvO.߫TBsUP5yƼ% uwtFzTxݩR hn\)O>MiF߁0h];gz1Jӂ<M,B8-ܿ spEzʗD 3Ըmp xxĜx|\ &3IA/ߣɩ6jh .JWL-}¶RIuQFgMB^H> 8k5M aP7HWxge{窒!;nSaR7Žڱg[bg.r˙KpT4l-ktFG"YVU2a5F=}[bf֚c_p ıS*e92A@WTУ5Q#X6CYYTEHJYV)=u4g8(=wh8-U1J_!*A֑ : R lbZ!uو"'"eט=K…4}pN侩pBoS&JN+1ERzהƏcwmÚ"qT4j^B9(#ty} xV+DMIT6f*lwPp~Ј(f eyUPyJ=Ne;~õlrkdv"oZ AQB,.4-F+^dD!Vڵ;q5 ОB H6xmL0 Ż) Q7̩dɿ?ժ:]Z<km_K GF ">AIctugK}5+t@.s>,TjAulD>#09fv zmOqdji#_s#BnoKiX՘{j9O,lk3]xքUg~eEi.gHRtDA$/#SV=x)M`^m|Da^t_U5L7j*Dt.-:%b"j2 \0ˢtG-k/vE^1p;V_/0B ^uwݸnse҃=B5wդ&6p++3мk15:{NC Kl9>L)EL_0 $|X#ϩ?B i&.f<2Vwhq7=/]7bϙM(;dQ.y4h؛)͑,90͞ Y©KvR}57`$ A`@M <|Bk5;(r# S5$O5 BLv, |_Zz1qoG`zAQp?{Wײ@@^q.N^]Lyt{ᯋ vЏN6]&.G#԰@Fs ^ews|L"@ e$r!_Vrд7fd <_PMd> ymBymxR S֋+оԱ9e\>8]BW+"P5t^!sM.}l24yv#= _4,|S4%EVw,W"}A* mUe)tx֊ȯFڒ~#S`*{{bHKEBD+TZU^⹳P9w8Ĭi:Lgc5P{*)}{c!~:tXaɹznk P\<^DYVkKqG>o;j3# M 8l>R^M| ( k2Ce!TECa˱"0%>!.j7Zjn$m >]Me Fq*rZyOW_H\,)vF`'w[sak@.l^d˃J>KM~ITrzw[Hg[V征b'59O'k{}Ϗxm)'1P q8oCfGe5事n[y]6:B>:cPC1&~C3q$X5KtaIp0qs8W^~Ƹʾ!c&BRWʿ)ZI#dJ,}ڙ49vcu.98h8 KG0ٺ[rG|y,c!Sӧ1Qiiy|p. T娌vt[ndF:V{NLֽ& }z_.aqn0jL59ۛgyV:d k֙P ũ 2sќy!s@$3، ML>qg/e"B5j=R"JD$)dQ.E4gjR|.r?'(xpIL^MpZS8FO@1#v uYe~M!*XeW^ ܕ;M*ZC-Ls#ehoMflb@8~|cu>'^pF.oٻU&#05HRԐU_JF¡!0(: C;vPZlc%:38#QVn n@q̲Ob(0/*ґq$GW zLt}TđO7yA>#3ruv1ʤJ N(ia[?U.%6仺u| 7D{O 8o,t! #pVkt P[l噀I|:r<:ըPdbfqKZduN%'zWfcNVx;%PbZ#UQ?dNaH6hDA^JLw2ZEG Ǫ f\ H̛'FNU砛+oDBKnI!Pm  qIсkE}PE\5'YĘ W,~:%SD,&[ڵ 6:c'QG$.p"ntqKcajC |}Gf! qT~[ԍ2̼n3uW>d{B+14dU#& MI9v0rt#{A䩂^[Ԇ=bpHשaɽtzjֲWv1{@J?&,Ѯ5Q\1U쒕r舃0+ q(@@ rKЕ)&@?gsзW =qGF>_ѧ>|: )fSLVz;5kmxk].knҺiCgkuKXTVbW2:* >snQRl1qt_ڐZO'*2/0"]*zŊ qչNbE D0yFtSVska{V[K 7`ʇз.iU!ni_OjfC/̃؃K0 8j:|s),j9+3J,<ߦa5!B)5U8EJmIA{6 `rܑp"73-UC^sR<K5Zn$S-c? ?ҙq %l;"*2glKbKAgDF;Q1r, !9~Xiwu~ct3cRZ\-uB0[Gd&h{bc"Z'*w'R]TT.)gdY> /~'r42WBS!p}iZڡL fMOr4h!D7d7s4~Uel_UaQ)q nԼ Y= n`2&|!ͼMvF>$J ;@F-)?[B J&=aԶӲo+$ ]\sv&kW%UiW^<#)UH:M͂__XKg@Jif^ZK: &nI{*m*yom:3.1u"]0i!AɸZN@ubKHmVްy0C4H{nD؋ߨf")uLF)gw@*V`xZ|ElS5RNY8YI ,F L)csr'l%W?W>iDaV>N)V)uW$7>NEx=0 ÉQ2e`8\1v>pDoaӰǬ^4iekbjXmvyU3n:DbЇ3FB rD2z{|KopRA(w:{bs+[-䡀:\[jƔU.>1BkKS`8U[}7<HT J$Pd A9B-4Nff p 4(5v²[%]Sc S伈RR_LUOoa5ԎBnE;%e79 [=< "s6q.?+> 3(`uEXyq$8|h@ /&3}@FxP'6,IA{lzrܤ܁Gv 5\` f,hk# Rx]1X-T8]Z7$0KB`r 5V߯֡:Y%#90thV9Ba Yhjv&|UB<;n&X2 ĮC n᧖6N ogv*xTh T) K\;Ḥw^~tHPǸ+KmFxujA3]Jco^ϗRP̧(M*,Hgy<{ j̬@mu0l n:)VI>X }r,g~(#J@J 2&57:! ;Ob2siVHr^ k!cϴ҂~RRUՂm璌\KNsL h,nsy"eD)P=jɗ]@JLݑm߷o8xQ7>c̪3y\=/:^/:Q׎̉P~+ k}ҨrA?SzZXM~hk!!uRKk9yd]MIѠPcr8#, I&cLHlW D6gLzP Hb s<P^ 7bjlq 6+Xe>MW4yxr붒(v dÖGΘTtFT5%ɧέ-yDA#kd"Q.R)+2dƷUa8vAg[~|IR@ZL}ioL ;CJIy0ӥ='c Unշᓇ<8B6 5Ղ2r$4[μ/ ppmG E>!Gro6R\;'mF܂/bŶ绊}6D2͒8-(fKCʌa~Ҧ |&SqM3/',vYo"RC<-2%~HɄ,^[U1ϊbQz% ʹTl@W3@EV聚y6ScY1l )zk׭c3vI$.ܮ> qPz5j1v(A:n c lkb"ӱ=YNIh5X[K / S4eCB> stream x}UMk@WlxW1$ |hPzuj%#%m 9ؼ}3IڽضߺItՓ;q\]U}s9|\qtY.Wժ۟oo C}? F`PޗS3ߎN6[w:n7l̵^y]/׵IFsuB`nlB =@ )U 9yI(ѥ S*043``ÍSqf|kiCc, pDˆzF:x0)ljsn l9u}SrI4"nXCA8%&ٵ6AIǚc:˿#7^YHOupQF^odž1BЖEQ?1^׆ƨАԗ039+ãbLi~jЙ}s~zrCOe fYJ|֟uМ8gΈrYφ}ŊϘъ1LҊkgigϘ݊og3f3|3ߊY[3 =L3f/gd ,' f)Rx jb&'W *~8d0UPt" ~7a3t> stream x}UMk@WlxW1$ |hPzuj%#%m 9ؼ}3IڽضߺItՓ;q\]U}s9|\qtY.Wժ۟oO+>G|V|~+>C1 V|B|FB|/g)g1{!>_|&~'a9i0K!cB{XTK5;)NŽbPq<${y儢 1 螡SsWѱ?"~t(Vu endstream endobj 842 0 obj << /Length 852 /Filter /FlateDecode >> stream x}UMk@WlxW1$ |hPzuj%#%m 9ؼ}3IڽضߺItՓ;q\]U}s9|\qtY.Wժ۟oG|F/+>㽴3Z~Z83f3[:٭ ߬Lg3t33 ~!>CO!>S 33>IY ?BXIAup*Çq&#{U-'H8qe%@ 8{Y;lFz?< endstream endobj 843 0 obj << /Length 852 /Filter /FlateDecode >> stream x}Un0CƆ"RVmkN7RI̤߯]U=$zyuOka8TW;;ߝw7a'Tm}oW|۷ΟYJ?(.ωo׿MIN{?Nf=,g[ a;7\kC`wհ`h*,wQ5F&Vݶ=ʊ]pOo!1l齊cm.?OCb: u/wW/~g>imXc;t_~\/>kPYD3ޜMuR,A)`*R2$!`8li9UEХGSj043`4`4Ý(f_Q  rt\e #q5p眛[q>x \iEܰpNMk l4\? ?5=cMuϜx1g1=ia4c̓˳G6ڀ cxmcfƨog!/lmΘ8+^P_-C#[34IN؆1t?E߂ޡSrY ֟gg9433.XgB3\iafq3fts ,>G|F/'>t3:~:83fw3;:ٝ ߜLgw3t33 ~)>CO)>SK3- ,YJa)SMV襤:?85JC4G潺N$ĸBO4{Nu޿_Ea,vFo?@" endstream endobj 844 0 obj << /Length 851 /Filter /FlateDecode >> stream x}Un0+CW`$ MEDbɐCUA6ّD^}{l; imXc3t5n/.XjR˺^o3򼟸kյ uA )`JbD>`2$`TY'``9&Dkx,+0*NXXQQ3c 7M/߻Q 𭑦 btX& #q,pg'~ι58|%Nb'QDa 8g"h~ ' ~XkzǚOx! !=iaM4c̓ʳGym: C[1Flx L^"K~2&NCC&^P_,KV0d 1էMw"CgcY ~Y =9O('=g)YB|֙Bs:Sb+>cF+>3qg3K+>#>cv+>CӊϘ݊͊T_|~+>Cg!>o!>_33Ϙ/>?㓁41K!=,ߊTG^1|8Gh=¼WrBщWI\_tЩUtȢa5}n endstream endobj 845 0 obj << /Length 851 /Filter /FlateDecode >> stream x}Un0+CW`$ MEDbɐCUA6ّD^}{l;y| #:##0)%T\`YQqJƚ`ci|1Mލbo4m `2WQ/cW888sέ-./qJ;&\ k(d?F#h0\?IúXs>Tg ]IncT5obY:socsOPcYB?9Os֙3\Q.4ٰX3Z9#>^Z} ?L[ V|V|oV|3[: } B|)W|L| ,Y a!SMV,鸞:?8C8G潪N$ĸBO2{Nu]ޯpDQ endstream endobj 846 0 obj << /Length 851 /Filter /FlateDecode >> stream x}Un0+CW`$ MEDbɐCuA6ّD^}{l?YtգиY}w 9]7puewSClݤMӍ'oܺ sR^}5s89 4Rӫ~R~K}O7Sk`."wAg LC3Ɋw۷qrMR8 o&݋L'lϧӫJnz_~NͿvr*aMߺkܰ^\zu \g$y=W/Q &)H8@hcRe]*q8cMC0c F F 1e|qi.Ke0^Ǣ9^'-pʹ)pq[[G]p_/+v5MĹPN~v-G`~uX}/S/w"': fyRy(#c^g!ch"ƨ-kC^d cRx~h K^| МQV14Nd5cY9Y?C9돡'g ?%>O:ShYggΈrYgDg>[bghX|&^V|{ig33qgng3tZ[Yog,g-g B|B|\3gg|2?f)O5[TT+?MGZN(:p y?0K:q:~Gw2 endstream endobj 847 0 obj << /Length 851 /Filter /FlateDecode >> stream x}Un0+CW`$ MEDbɐCuA6ّD^}{l;~\N=Cu.7զOu½t}5s9Ngiy| #:##0)%T\`YQqJƚ`c2U{75Ҵ!\,18"\aD E_sN[sS9)9^W$js7 GZ ׏p$cMϱXS_ 7^EHOupQF^odž1BЖEQ?[0^׆ƨАԗ0 9+ãbLi~jЙ}s~zrCOe fYJ|֟uМ8gΈrYφ}ŊϘъ1LҊkgigϘ݊og3f3|3ߊY[3 =L3f/gd ,' f)Rx jb&'W *~8d0UPt" ~7q3t> stream x}Un0+CW`$ MEDbɐCUA6ّD^}{l?Ytգ;q\]U}s9n\i|ٺQ]jOtusR^}5s89Ηfi<WOlKQn8N[-#;skQ70j(+o!$oΣ;n},j7Fzoкнzr::Q:XTߙOo'BZ;vv݋ ZԲW<'suB`ilB =@ )U 9yI(ѥ S*043``MSin|kiCXc, pDˆzA:x0)ljsn l9u}SrI4"nXCA8%&ٵ6AIǚc:7^EHOupQF^odž1BЖEQ?[0^׆ƨАԗ0 9+ãbLi~jЙ}s~zrCOe fYJ|֟uМ8gΈrYφ}ŊϘъ1LҊkgigϘ݊og3f3|3ߊY[3 =L3f/gd ,' f)Rx jb&'W *~8d0UPt" ~7a3t> stream x}TMo0+J6*ħöUSEj9߯ IVcf͏睟ݛ{)^؝}]u:vzyu|CW$nmmΑmq5)M{`qjS5үxO%r^q &\TƦkw(:m>8+>4m="${Jљ8=tz-/nqOR|-M.nTSXlDmqb]goo*co߭r#el[⌷L @ baomBҽ$`$@B)@p@)p2 d Ί?a.e8s`Wg+`#)S%~8NTҌYE, (6*3FӪr44P#Yf͞hhӰCkE88+j"7G9~PpC+R2C#`p˜1q EE5=F]=7z&`qp&bð| _/cSMrΤ f/%m Ȱw \ԉCb֓x5cfw(:Kzgqf1iXg3Np y/hHS>W#/5ferTapC w=衡xz* endstream endobj 850 0 obj << /Length 719 /Filter /FlateDecode >> stream x}TMo0+J6*ħöUSEj9߯ IVcf͏睟ݛ{)^؝}]u:vzyu|CW$nmmΑmq5)M{`qjS5NJJWG> stream x}TMo0+J6*ħöUSEj9߯ IVcf͏睟ݛ{)^؝}]u:vzyu|CW$nmmΑmq5)M{`qjS5MJJWG> stream xڽ[[s۶~ׯceBaBS+i+48B[?i>8[h AbqMԡoj}i!Qf  CL #!Qc +J>] *(cɘXD儹=#(, pLBؠ,EuB@ R>!dQt(B@|+7h4h+0(D6 q-؀(0BOJ| %,zWh7Yk&!K9 6UR; /N5DyEfhC#`¤Z%06Trf R%N4y?1OQ0Hb8@`t8gv nE+ wTGXCWk6t^>!6 5qIg܆qbX t 8a:\_eY7T8(6n5vb{&|Kvq!(?WKnlJe麖qO8kD(s~>f-):,d\=W݌^< irMU'Q>[7j>]Ó_>?~'>@-/|v.y`xAl4!jknVU}jAϳl^/.UO6/ RfjS#!yDg%yCN)grFIErQvEHM,Ȓ,!+&k ِժ%%u|#?jy|1xy7ǝ{_yl<ȃW8*@O#g*92ߓ_grQ{I.WlS!W\5؞W뵣|Q 7ժ^/zS/Muy>ꐯ/ b/7m /PT~oA |l}:yϖff6fR_ڥ9SA䏖 B+GImߏߝö<\:z|vh.x>'/-j3.63v>6m.-giῚqc,gj컑Y<ٟ^g ݖ*}\ɓ߼gîz|݆,xcǏF|?OBqlapYT:ӧ?8:9IUGk63?Ō̮!ֳ91seKMtr>%M:U_ngd?n?rW6o.LZHeHڣ#`lFj{zSgceSOzzpRݧbʪ m<92\7'Qg|w<R4deMKԷQͷ.%wͼHUdAy9<^-:8GB8«۵kuE4&:5; bt\ӱ)zp7Sܱ߻ss7)炆<6އMjgwfCI2NautpdO\t:GGv&Y?ZnÿۧqqNȃٺ'\a'j-_>!盫5~!esnt~Qޕ=2RrG=9.vAG}fꣴ{T" J]:H GINYfaq) R . 3ZÁyy/;“6-QájW|فw>e:TЩNm:`'KSy1panQ./tdC1A N.aNqWH$*d kWkd*/ޗPhlh3SY[IѠ8Ȑ3d!u]F)B@ݙ`!vz^nſx㏴'Ҵ+ 1 `Vͪ~ZvRWշe`FtQ]e+%UKdtIXؖlV%UF܋{^t܋jc[tlm#e$|/4E@3R97 PreLN9YG;y}CDSpBF_ngU4?qGu+7;ŸKT_]ԗjJ'Tyڛ9Z9vdÜig?B<#|3I=L [z;a.slOA}Hr(쟙T/ϡnnJћd$R( Iɀ;UlwO)px:ЙtC09Pz.@깘îU/SD`Ӕ`3|$@E\C\ λw3YFiq٣N*c-bQ, =\a]K`hIV=R&jiZm@/U(`#HQ51XeW K!XkgN.Of8V\z <,y aIIJ:&PbMBP"9II$'byj+o a endstream endobj 892 0 obj << /Producer (pdfTeX-1.40.22) /Author()/Title()/Subject()/Creator(LaTeX with hyperref)/Keywords() /CreationDate (D:20240114102733Z) /ModDate (D:20240114102733Z) /Trapped /False /PTEX.Fullbanner (This is pdfTeX, Version 3.141592653-2.6-1.40.22 (TeX Live 2022/dev/Debian) kpathsea version 6.3.4/dev) >> endobj 872 0 obj << /Type /ObjStm /N 20 /First 171 /Length 831 /Filter /FlateDecode >> stream xڕVn0+x 4K P$>Ѵ"VN}g%ڥV.gg4IQFQJ{mgPڮI,\pď,z˹TKci%(ƍOVOL*?-R,-i!%I7f>MxȦW9MbαaCwVLJ0Qx649u* 3?Hj`vgÇQg2iL5f4㰷 7|f򳆟B9}!O sޤnR./eS߿8E~K yjzyX>g($|lvvvmz]ńLnvڀ%3 endstream endobj 893 0 obj << /Type /XRef /Index [0 894] /Size 894 /W [1 3 1] /Root 891 0 R /Info 892 0 R /ID [<3773C830659C541D10E69D3E40BA7B8F> <3773C830659C541D10E69D3E40BA7B8F>] /Length 2257 /Filter /FlateDecode >> stream x%}lVWyB)mi }-}o)PB -*>Y4&_Hlqd1蜒%ˈ#adl0!\X5YNbPY\B:6?{Ϲ1R7v̀CݓaG48 fKW90kH'|ݖNEKW; a̻Q(U;,۪1c;+gK7]$f~ҍ$1O|b"K _d/t_d f>1_ V[SBT~ d_jIk-E]% ~HHKI􉨿 gI3۬ǒ'@}"wY&yɳLy2:$HO}2LC3eoH.7Zc1cF2ݟ#R,gy:u责wAb2U5ȕ?,3@t z', a7e H,yVއ-L^Z}byuV-V ZI+ӊZ)+*mP+mE?V]Q+coOt&ď3!~V7C\}ګ!n qy#DpG7A[ʋj`̂@1fC@H-NUR<(D9Z> stream x]kwq޿FWgmgNr''GhraK3Ns UxAe9=gZ$`֭ByݡfvS_u}[VQ^~T7U;-jf<#E?5 $k_? }[ݼ~ G"^TSNW流_7jvT.E[]=eo}s~s>s=yv~gg begWck~j׸TWov$oXP\Yus<ԓzF(kЁVǖuo' [{8pG}?j{vPS5zܩ.jE3t>?Ct}J8G};c~vZ3Xu]Uw<уlj?KÒ4T_V}uqb@˪Sjo/2^|vzZ 58|lr*Bi߻ܱr}Y v&znuzmp@kFўxqN<Qnu`1\tS s9. XXX :~gJ?7n>K5d ,oRR6M?sv%H%D[_@։uV:%1<}PUs3c?ml7Նcw|i#ʞPMbs(gcˏ_d \ǃR,.oXp]$;hwpYy7q:&+Bc)J9Sô~oFɕ)6 @G^ `;> hSgJp& riBf(EYk~^ۀpD4j䉊 bͤ&,FY; w"?\ُWA ֙t =`AR]45Ƭ]݌݀1Z8cRSwUS߅ ䷫3pd5+N#Ypb @hMTb&mջ¶#pn'n٫CDCa-Hi@vSO ٪at8Ļo#achOьʷ`lZecC6㏯?^4;Hba", ]i7"N.NH똛x2vď^@ ] ؆ , rXPqL3 *>AQ&_ntx@6$`!P@돝<0. 0`gx`bI%jCy3`',*Dvitvd{n-"ӄe(q໇?| ?GC#4J0K4qrAVcjDbǓU +xҊ4Z`P'E,@@$SY97b)'~#meQ]]0H`iJ]k ꙸqqdz{,H7鷘<zJ Fosnd>vX96oqliY2"4MAslpb2W.Ȅ90TS1NLcfY ~uK/j|g##V(ڹDPϿ[y,T"OKQVnҞz\(B]Sfz\iOE==oWvJ9 v3!EabR&.YNri(%Fs'Dx1D;1sbL L1y 8L,=^ߧۘLO[Q\iKFꏉcmq֟"A=|qaGs 9=`oF) 99fD_1b\Eb#[+A3Kߪ LG؟Dp+b;@̣V[ %=63e#~,a wPL3B=*RQz.@!p軇B6>Fl;<?8~ًh@ghY\2Cצ(%SS1T2wrqyE(*,LuKvr()awn+g(U+"BlJ3Efʏ=e&DÅ eϟgx1s5 Ca48\Vwt0 p-ZG(XVt|gG6=_]M)Ͼ?y@i_jg3 JWev n D5yxJT7< *6$C@Ru@vd32i Q~zqMpoU)]idP!.: {Xj=S//*;7@H{$ ~BbȜ I ^O%]//P+-ͧ '4\82ZF)2”SSQd|:ތs6q{zFG'H .$T8r=x99~~_1pP0gwp(*em8olq%λ1 ij,H#Zi+}uۀ@3@U>%.Զtacޗ)hmBÃŖȓѩKٶ.&9ÞŢozjߤosH'w|k݅uDnl|ZGnwȾY]jHaP.͒Ԑa~/o#f7ʹj`it0\uLFk!vC\{OlՕV4*\&V}u;gL3͇/Vd@uΔsZS]x,ub0xUQ@ Y\9&S 9)4mf HTpިQ"- {GFY*)1Hvv ]3lH4&=z^#/cf{"G5C.C -+g5̀@IHмpy@`CyjC[i]. j 8)F}J3=RK3nfc@ބHi3jf&цNN89~ũQ:52"{v?MM8 9 *A4 v2lFk@>neinֺ<7ci4c2!DK" 7w1dJ8*L=ap8%mο, Xm 8*TRf`Wyhig3T^b9g:$j`|ei+-|݈G.{]Okek'r>yРIΐL]\ Ҟ53.1E39 ]cj*f3h4 @!PPdpg* vhvD^4aR"PL>G1?,.¤Uu X:j]^y@!Ї^!:_?ТV0Ad̂w6`Tjʾ@uKbvy@X r)f& =݃tvjF(:dcx$6m*݄}A0zРz 7:h뢬sqZ/)5KScؾrWqޝ}6/߹ڶvYv-3s#6os{t9A7O_جj?DG `ߗ̓|H:XwX,8 Y3oa>kĴpX׊ߜpo' |ai[:I =gxO,D̀J(4|ͯ3*ibN>]igw6Ea7 x3[ Sgs P Ȧ!'P`: cM'Kt+@fd J'A049dB˗ uxK%0u.zq!]j)'c;WcaFsH{>6/Bv2fg2(bB 2΋۱D97jsMT6GY ,E=͇wﰚ4#ݢ}:9ҊQߣ к+_صɪe_ˆWj>ZŰ S|$h2>@-@n?yf 8@"0Htַeu|޼ɠ`o7IgLҺVWBcvt8õz(uzoZkx]ϫڥA8K$_kϊiVyEad5x~)3teA2a=:A4y\l.Ņ_P|8בWXz!pd:J΃atzЪ$p:Wgfy%У+9Y pYuf?2ʤ6 r&|6q>4#㥃8[j'L×4vYrwâɮtO "lMY;(Ǒ;HLxJcI1γrLR/16B>̐kD泊\N[nxO"  *kbC5aq h*KJ H4MKsC4&_O;/}92$W^mIÓw";73jyIlPaW Oy9E I N*&+_#0<\AUةSFܺqfHp2,u _H1p& S`.tf -?w9Ý#털 #IMx#ϛg=oF9γ5Jéٲ5޽oLњKx)Vd=' hFP(y0mas*%vkH6^ ILb˕U &ߺ:<BPx|th20&'#6}: #| գ큶GK\T}vBKeDzd}XtDaZ_0V ?)LN};Kd>xCB0[f@rCS|w{mf)=uE{ ̴B S:3ŒhV`bleSz2D3R,Ϧ3ʰ)i :ycUY#bUע70v갳ʀ{gy,@x&@%$x4iZ8BЌKK8}KKPl #^$\rn?77~p+ցmުDW~e2 UG-O |TteH*4{8]sQdL\PcJ?Jg33{c?;7Yɲ)i-|*xs럾}?N ӔL8=9RDeݢΕ,,} 9 NG)a e[xNת) gL7y4 ;!C,gS{ݕV#,9|`Wާq.ۄ"WJ,UH^;u`LԵʭ~^@Cxp>/#7`ΖC5*''VPq`Jo4\څٙ) XOڍyJg.WX YS1Ϭ|e2A5 y3^{ _ȥ<"X lau p)B/]LdS4XƉ2ݥvJۄ?+a@[|g îWۈ^KXR"+wћbڊ[D5 "4-E ,;")[@Y &k&gn3/Gk;u?ثC:j +Zd!@|:mhUv79teP;%-|!ruLMky%. @`(qSlKyP״mG5&U7/X2(uoN=IQs @s3ճ"K'#o2`Sdm\Yj}r{nR;9|I<@%ow!ki=$}{+р'Q':jLsL)}=%wCOVDV??4]*!7 endstream endobj 5 0 obj 8638 endobj 2 0 obj << /Type /Page /Parent 3 0 R /Resources 6 0 R /Contents 4 0 R /MediaBox [0 0 612 792] >> endobj 6 0 obj << /ProcSet [ /PDF /Text ] /ColorSpace << /Cs1 7 0 R >> /Font << /F2.1 11 0 R /F3.1 13 0 R /F6.1 18 0 R /F7.1 20 0 R /F1.1 9 0 R /F5.0 16 0 R /F4.1 15 0 R >> >> endobj 21 0 obj << /Length 22 0 R /N 3 /Alternate /DeviceRGB /Filter /FlateDecode >> stream xwTSϽ7" %z ;HQIP&vDF)VdTG"cE b PQDE݌k 5ޚYg}׺PtX4X\XffGD=HƳ.d,P&s"7C$ E6<~&S2)212 "įl+ɘ&Y4Pޚ%ᣌ\%g|eTI(L0_&l2E9r9hxgIbטifSb1+MxL 0oE%YmhYh~S=zU&ϞAYl/$ZUm@O ޜl^ ' lsk.+7oʿ9V;?#I3eE妧KD d9i,UQ h A1vjpԁzN6p\W p G@ K0ށiABZyCAP8C@&*CP=#t] 4}a ٰ;GDxJ>,_“@FXDBX$!k"EHqaYbVabJ0՘cVL6f3bձX'?v 6-V``[a;p~\2n5׌ &x*sb|! ߏƿ' Zk! $l$T4QOt"y\b)AI&NI$R$)TIj"]&=&!:dGrY@^O$ _%?P(&OJEBN9J@y@yCR nXZOD}J}/G3ɭk{%Oחw_.'_!JQ@SVF=IEbbbb5Q%O@%!BӥyҸM:e0G7ӓ e%e[(R0`3R46i^)*n*|"fLUo՝mO0j&jajj.ϧwϝ_4갺zj=U45nɚ4ǴhZ ZZ^0Tf%9->ݫ=cXgN].[7A\SwBOK/X/_Q>QG[ `Aaac#*Z;8cq>[&IIMST`ϴ kh&45ǢYYF֠9<|y+ =X_,,S-,Y)YXmĚk]c}džjcΦ浭-v};]N"&1=xtv(}'{'IߝY) Σ -rqr.d._xpUەZM׍vm=+KGǔ ^WWbj>:>>>v}/avO8 FV> 2 u/_$\BCv< 5 ]s.,4&yUx~xw-bEDCĻHGKwFGEGME{EEKX,YFZ ={$vrK .3\rϮ_Yq*©L_wד+]eD]cIIIOAu_䩔)3ѩiB%a+]3='/40CiU@ёL(sYfLH$%Y jgGeQn~5f5wugv5k֮\۹Nw]m mHFˍenQQ`hBBQ-[lllfjۗ"^bO%ܒY}WwvwXbY^Ю]WVa[q`id2JjGէ{׿m>PkAma꺿g_DHGGu;776ƱqoC{P38!9 ҝˁ^r۽Ug9];}}_~imp㭎}]/}.{^=}^?z8hc' O*?f`ϳgC/Oϩ+FFGGόzˌㅿ)ѫ~wgbk?Jި9mdwi獵ޫ?cǑOO?w| x&mf endstream endobj 22 0 obj 2612 endobj 7 0 obj [ /ICCBased 21 0 R ] endobj 24 0 obj << /Length 25 0 R /Filter /FlateDecode >> stream x]iwu޿iqz;ZđeI+^4?DáfpsW 4%9$@_n^=1MǬ,MV.]VmeWyvu+ESRVATFf1e| I|111e.?~ ۉE"Z"1t.`Dzt ~abM!d4 _WBqwmk@"iKhm]*@i1" qԺK{ h-F?a u mAFeC*B_*T3ɎQo #7'|y39N/`| E7Ŷ,DŽb_DD`R1.aL b3^P.6vn>7yjػ 77E8mKXyX3Y}Hb1RWU{:g9,GYj.ΟIX#cr۽rAFw?!|Q[tZ2-'r]EF3L6Kswf̹]噇|8U]_Ŝ|ozS]-;MuC0gG_kA rG1^p:"B* >T'c|:zߎ';'H0jwLL.flۮ 4M#M|93o ne$bYD-"E?yY> TTeE%w'?j \ao zRǴ@Zeo=1yonݾn"TPjm XwS򄷡mVlhkUݕt ͫ76 `jxSKRDCdĈkoµquE58,үV:-k'nJ[WBqq)'dutƊeߧ T 1!reR'8^0ҨlsgfRH1+3+n(G 'HR ݷ@w.ίFNckdW4=aa + g;GDJm[Ύhrida1|>.nnÄ>q.cNBʩbK9m,El5>uEOcn;;>aM6Q$;yrqpw˧1#1Q ހvhjtsьrײKtcD2mqnی5D0OגVu)r8Rb1ubY#hk" U% z5h5˜mogl:2m`Vq#B^ð-;*&B6s1wC $LOKpГz6V: {5nh)K_<|U'%论":96HU(#Z)ص-B2!8wyAC=porز]Y8;=ُwWb:" ie|5XB^}n=L^ωLLv&k~+~#\+F`Yuز?ia3ʨQܸ:~pChM,]g ?d qG{4' -\չ9Aj0v 4cWtbBBazثCuc:zS[3 >\i0ZǭBxS#離 b62fN!JN^B2SC(V$LUylxژ՜xɿ /*60?%pHK%Y\|9(LGN'R`]. gnCAāU%*73X˯ރEWUg S\~SI!2S B~#*_AnP)?-3$C %xPw,Xȑ̃%օK*cChL`%r,+,v-Fd^&L%5ch24O^ vH!_LDJ#H: dX~p#G _ 7q ":C 8k~G/wGBCCekpwpdTq`\3|m8 OBӦ6Z<N%DW^ʢ~lZyIQ8mN8&?oXy) r5Rh=V˅GQ٩2vCjkLҦC<)GLǬS 5A nPXj͑z(PC!K]Ha^Gw_2e[s/ ~.֟ Qwf\(Ѱ6;a nw0˺x\vft ܍KuOQqϸni*~x`dyX6fo:I)l[T/} S6Ir[tUVb٠ZJ5:(5:UFmQUc,P7qǓ(<-L+"}_Úx9n w$qNٱq!.%ju G:d3Bf5R.\<*|q?45 Й^@:׺)tVAXS2mq`яz>?84962\F)8ۺL_FH&͗lB$s<N'اn+Щ_lE>͇!mkw~Y"aT3)BeUAv+ґM+ 3>9R! >l5h=| 98T!|M&_{D UJ'=ټPr[ ~_1*E_ 3XZm8Y=2Lʂ{"|ӈNTSs$_]3"!'W }!QbhM\60f-`wc$bk|AŰխv([]`-%25w-;d#3&Zoˎ1h3sK:Na'^L0F䜸XRuBNƲeׅ61!сB`蝽ף0CSXE¶h4h3㉺awSM]=rM6:u64uʑe`ekvuABf s"2#)!,\K &̡vS^x5Luñ`y-6o{R2K͵u7:a(g8[1NikTGxhWO 7Njb T05<}NoH= h%IVmG{L!,;Ř_#ٓ/ι "X\8uԁ볈u*t:,4%k:gW[쪪5'S(Hzʚ~.E.ZrW0V⃈5,iLuQm5M ;mڲ3wbUnw-)s&$cGμk_f]_Sad/~q/M]?Yc*#.BKiC#lPav$E71-9&?Av<69u@ؔn8VW.cUz҆T,,_Wr.֪Rn&4&m B sBɚ6{FaJBR.4VsĠS]Rxa.6(_E{ksc/ۊ`0= IBg ݜcf˕ÙRٸcqJn~wz3<I<^Ǝ^T I)Q䈸 3@8@2س8j0OD=_M- 7ZŭKp?%TTV}Z8Î3o#|Pժ }،),/nWA3Yf m:thT{9K~H/c`iҠ,ej̃]['rlqɪ/OfK"Q*gؘ k 1%1.CwD]hnJzU&?._nEPFMۚk/ʦRWڦScV,G-x6wm꫇+i.}Vb_~R.{zI1lES.m梑~ @B\h3/pPEQQ;9vJ!s7@:"/7lh,cgtlg;}Z.H{0ZCx N Pc&Q}dwWmh$JׄDye / 0l(HI3li7"^N&\ | ):CS =ܩP*y_W5<, =jDY'}PF: q`1ϋ#t}x.Ll@`yhj]_dJ) ·DsfB%޸ytH,3W [f.~w~uaVX؇wAڴD},`̇>'so/brl9mjTn?Т_MXO)Wf9KQu1/v3vz"J1*rerҨz(pr85]45US[?;1 ~s$Z3YepHYG قR_еP6kXUdдpcapu 92\& !jC#3,w?!V. .ZTE"TJ DǍ >-2ؼH)cLe{1_1Uٗ,dV3@/r*Ptq>p,ɏ&@3!ȼ\OdHvNv9w:#SӒESd_JNvuZqo5+dsHL1)xSi!>bȶK^\:&6f =c]vv.5 Y[3$hZ&C-n!H\aX)wW1Y_CՑqp/p=Xqb6 7!nn?\A@njh^}qt o//Kn=cu PivgHr.ڴMu1YlaڻlxR]{qSDx7=MOUrqCQ->7Ŧf#FA!HpF!y BO7Dp&na[R6% ~сԒE&%'II aJ0d)cmΥie8tڈj)bs3<_T\@/U /$[? ~!^RH@uYJ"\e"i7Gn=*{k_I[~e}H2 ޏjEff'K3!iȋM&5]MܻAPWX!O)8AU n54ZQ٥kMAwWavRi7C 6!VVG3rp0}xHOa F}VjN3JbIO36'YQW>#ٛEtdޠze"}p'{=W+j٧q; qۋ7Ctuf^8sGBʸ3F6EAV{F6a&8nbnQ1>墶'vvvCZ[tO ) 6he6~Z,+ķ!H+!= 3iFRd9X˙r#֘1q>&G<:$&Kj |\+QL!'ǜ.tsdHjwvCP\ߗZzk5˛gV 7ϠE=xXHveZLƴDĆ ?.ڔem1)r]ky)2,ATfo cm|2NyKH+ 8t%~s (Vrx}XU_V;`j.uj Gf1k9,%{0Dv JX%^|d˹˼XBԲ`'qH"V](8'x7Q9 ;}`DF$uDہ0 +ʸ#͔KNW׏p M2Jj|XXyzjxXδ!餈39dgKϲ%D0T94 N"br]=\ϰ6Lzy0ݼcL#X^.m7 ttԴYkAڸ;D?+yuk%5M!#`69FV Ư"b[ XWXBz[MqDq[ [|{@F=6=EK~m7?.ꈐh|M8-*b_O UbLL!-vn*&u-+Vϋtw>*L}Sfꐗ/zheiEe࣡?|)z+% tTL-DB vضRo$jԦ1yꄙrws7 RC'!~Ԑ ,JF9/d"#!˨{X%/aD3FB*a'CۣIE˹]{|`O4MPPbtӆAx1he 8 R 1(laJj#BձygZV_eb"rDeLn#cE:yȢ| O!z5#StVQoS[CA@!R޲ Fje$ns>yb:*zjkg2 MD*xpR@ND+UUJ_.'pIOnm' 0}+#Pt~{o$JqT 9mD 1:|Аe=^Dx-W'rk|='C(L!*)C2X/23K-W\_޿EgO%tAW^ܘL)d8K: 陨|`~ c=BUnhġz Z>Mq"=U59V}è7kQT/[I/.}hof{ͅrH\g yI^c6x/Oϱ I8lױ)Hƛn\%a7`^0`|BP#+pЍGD4"!تyUCH$!;O4kROH\9a8 }*X d@| A8ƬYaBvezc;+頼X8 !bCܒWwzMQ土2E੨/aL>Gܫ@Q4Hܩ6ȳUy 5{^f͊H`G14Y.; Eqgo ?ay ^7 MN endstream endobj 25 0 obj 12480 endobj 23 0 obj << /Type /Page /Parent 3 0 R /Resources 26 0 R /Contents 24 0 R /MediaBox [0 0 612 792] >> endobj 26 0 obj << /ProcSet [ /PDF /Text ] /ColorSpace << /Cs1 7 0 R >> /Font << /F2.1 11 0 R /F6.1 18 0 R /F7.1 20 0 R /F1.1 9 0 R /F5.0 16 0 R /F4.1 15 0 R /F8.1 28 0 R >> >> endobj 3 0 obj << /Type /Pages /MediaBox [0 0 612 792] /Count 2 /Kids [ 2 0 R 23 0 R ] >> endobj 29 0 obj << /Type /Catalog /Pages 3 0 R >> endobj 30 0 obj << /Length 31 0 R /Length1 17180 /Filter /FlateDecode >> stream x{y`Sי9^%Kfy,K-۲,X ׶lm6f%KCp$$$4K@})tɤ6i:6]YZ@2H|f; =$?xDW]:hL)U(Iϩly~f.??? i|4͜K3ȯi4~y/͜I3[i'i444s*͜L3ifOK34swO3 L_M3=i+t4ӞfjLE 4SfTiFfd⤤Ks & >/sDIC  %|F¿;ߒ) ~M'$_$} 𸄟!  }W»%<&{$<*,ַ;G6 !^&9p$qHh$0 p?I~ БGp@0xppD!B!B!B!B!"j P P P(T7yp=p>ݲ Kĥ7.tᒐ$'/L ՂÞ~ppAZ^$o\Ţ׋zU|TRZJu'$h,ɻ\kO+[_Oohzn\kqܸvMٛ6gsVa%, ۚ[ yRqpr-wtK=Bv0%' @aDo>OYnϑ,w8GӘmܝDzw@m)fnDWp c#gM(g"_` CaUc#ϠwVHύ@8r[8-|snLR6zSt7_؅4%w3-pK!9\77t7(5,iolF19[7BCi9zZD!`1`` E$5sPSz٬LHь|JZ_p4+PeRB}rnpTAy25-ACzcҔȀ8L7D:163Hne=5OMצhMV3E@Y`VS3` ck$8W)[9gR4Ӂ*9r4UB9(GX%cr(wEO) EV$:d3Rt>]ĔBPV)b,E? =M?AYOǐx DMPH0b4&'|g5#Q펎3D^;ɹp3S܈ƔDGQk78רF&!I>b##GI##Gn6"ܼxᐆBOx1MW?6'5K2?!Nyd *?J=*?W#y`ޯTCC:=:|OߎQCxKJ§N‚N6E'}>F{Қ~#Y#=X }8rGeq(F O<+zVv+;FKߧ=԰!쮩KC܍OoL3&A???/6/!ʪ ƺ90;I['imDNs=ðP#ϝۨj+qmtۨ'(SGã3FFi(Qb՘fcY2k+ͪY^afRny"e%RQg8qd\.Cy$ ZZ+Z^i@h|,} ՗PCH1DM/r 42MTNǩjll`,]⺋O^@/t5 @P( L\}g sOb>}{?v&;ފ{-v"j˱bߏǞ7;6'6m[늵Śb' }<"X> Iǫ2y!£8uDz̓0yvW(:a d>CIkb{yݒ?R (NwdL^ [>lv=YHfyd YAr(j A KNΒ_c+!<&r Ozz}|A vsXbl'Pk/_[aC_"-`?$`XAT|B`oNbI̸ĞÛBHQer3dzXxF!$0C{@%OeK42e ۱91!yEN~W? \vJMPNn&_Wa0, rCf".Z5@׈EPxP6_?翐} }Fܻ!D2".\[d}zgvvhmnj"ӦkTW*RIq)ty9lj1g}NQ LqQJmq[so˪y{kg]t}eZq?NLq"̊.4pX6\އnͽ.#y"| (rfIW/c"Ժ{yd-9yia΢cq9'YD^Y ODE8z H N>SSgbJ>5;]7d[nDcWdz!)Qs9ݛr\Ҡqr;Q71 -AhXԲ~jpږQ >#n UqqwrCJ nYA53"9ʸ8'c3e~m\1q{Z{9] ALQ 19[cH(^^>̄(S5tM8puh?b[dɱ9WX9Y˪&eI8#&)G=茏,[;xo]c.hAKL bTV۽\`ΖUQ!C녽-3@ym]!0z&|8c|Os\t'ѾTVJ!.Dؤ +<;enTg WP6QVe։\so9Ԇ:csLHdcN |I:01G$_`^yZVM #%a1pN*\̟v2$#szi'Y8BĀz`%&lbI ,]O✻~rrm\^׸X~oHYs8p^}̄sIDSܳ92O;Mg0A6fh+/w*3*JR,Ϭu-Ȇs졽+وNSror2/{Po讔'D <] RIM^JLU q FJfgU_b9Fݷĩ$QQ u,$kƾ/})=,J2Wf6=&oeN㤧& D$}cg81o7HKLY/ΖUĚ1ʽ3wdQ"e'/\!7n"?[?‹?KAR$+d%[2̭&͑UDd.WJ"s gz{x AIL p¹ZhEEr˱ p"x+PI9X*=lypiEa_vRި(W<(Ta uUm-Y{ZZ /-!ET*!źRR Wj5UBu )W&SVIé zTeZ| 2CS_Uܔz.ꚚPegB"7fw5te2-%VCX("4 #NYa|~yI~YKkxJ}@(*̻+<7Z쭯k-srk£A!=9;rO V1T d n+p xY,;?0jRj j^W;g;LiVi|:J,rX`HC(` 35i 8fgI8\ x(d ePȰsbbAU]A*>K!,V BC4s*6ޓ(/65$och5y{xsh$_TVx{nJg^:m81͓_xTVf<^hNFo+T8rxHiC@gLc-j%c0ZrU圯eqfs[fsSd9xa0['S*͞r:\j^zԔ則Ktj:z?i ̺`PgI]5'N6ڴ4Qꭰ?c~!  +2MQ+OG]^Eh4~,$?>)S=AM8S d.w?o2/lZj;+U+|fR_5}Fc'g|-^諝Zu V/ҸcBnN;m.&'{&ju)շ5lpߺ֭KhO^+Ȩ0{O4s9l洍؄ f 9e/L>gImVk^_QtN$+$f LҶܙIProcr`)mÓr84 ok_[ 7̟fEWۼj˭w5{ Y[t4Vov~N!xFkC 9{*/޷dj7)p;Iezch&ϧ:>??Se'vṃ|:֔tl.6 i~jLҋ iI00lBuf27 SYSl9ʃ)&*iH6/qp~%Zl >"cxe z󧈗Tɳ YQ8 E8fQH񾯊5#fB#Aӥy@s@# |`zNS)n*8{+mLYHu\sWff7yT+CUz:dTQ$? aoTda%% ̵HȏJ c뭮*0AlĂXX̐.K. ߹?縊Zj>024tKSgJj֊i7>q*'U[Az^n7݀HdQ;rDbY1__LAֹy>Qgɶfe1xQb1$?PWNz3&3],.v#s^ѾY}ϧefUr]=|>^O(3 yFU/oT^yu/Vbݰ0Y:m#Nb4F^oz#F[f~hc' i2Ɯ[!ESq U/|l 9"HQb VV@*J2+lS,Cb;wl[xlt}ښhSm]/v[07 B,|`̡-$ U6pTAT=j*L̼R6U_ŔmL1+bpO񱨖A慔YO"Z}║G6+MkחNȸJj.k梋pٖD,:51qBZQ/ЮElr,yL>˥wN;5v`-4y|>Qn$ό3ozKV.t7]`zG)Q##3_syXoDW|ELsOvq?2nF] aq}6[ؕjRq84P~tN8pt<zs ¯bE\~nԦGQCU[Z٘2m8d+@#W ؿ*QgCy,kV[3unSLrWס;/TsmVcc)[!"#;Tf׀O+.k8H$JH &WϧV5rD jxUMM@MEbf"!07Ldn`QtOJo's |þt2!CyD;[z8UQP(Cf[df;=jtB;J$9غ;z,~SW Sf 6¦!PcX6CHZ)m)%F,Z]T1v|`kIZ2]׎ύt6G/;onuuM.0j+3Wί]B?hm9&Sk=^CӺ%u‹[VLu%,mnqf⍭|Ѿ`)w|y;fἊ;l{Uqj*Y%Fx&]2D2|Qqᨱ줹\>CSGkIjGmqVLrg{oH*5'xbv$+3w1,/5¬ДYzߴ_U=H+MΥpY+gv;4 0o9JuwFHVϷ(DpGԚ/Xp8j7ZS=. 0Nh1R%7 AߜV$vvNuZqDMYuMsfUkKGK,Okgiplbc h8BuLe,2gȞ6\LQpH_jW ZfT/--86sLY$u܃^]iѥyUHSq%`aɠ49<>_kWrG}Th_\U3Ĭ҂jiFqnf~g{EbwޯSBW\=7J?!jĢ) δlW; u^ydl"?E b]ީa_pYob㉑Į5/ݸ; pu?Uڽz'd3݂,"dD,ab:܋C>k~l?`y; S  xO08زQIU3{Vş%)!etHś3Wb:{T>6$UVEb̦V_u:}}Ec?~Knn>{Q`jsqT~a[]QQUzJh{ Й vt`+t{֌eС<݆sΥgLYej`&P8n ky QJ;5[ڌu-G&tJצ+tܸFϐW+II#DVgT\T*RmnRW1&3X4*G8t@9~ٳgY%.-B}h(='J<dMEJ6uUHA_z ?B>rEz7Yv endstream endobj 31 0 obj 11010 endobj 32 0 obj << /Type /FontDescriptor /Ascent 950 /CapHeight 674 /Descent -222 /Flags 4 /FontBBox [-1475 -2463 2867 3117] /FontName /TWYTYI+Cambria /ItalicAngle 0 /StemV 0 /AvgWidth 615 /MaxWidth 2919 /XHeight 475 /FontFile2 30 0 R >> endobj 33 0 obj [ 338 278 832 488 496 414 430 220 593 552 303 552 558 441 531 271 555 488 504 547 563 621 623 681 205 556 332 494 205 ] endobj 34 0 obj << /Length 35 0 R /Filter /FlateDecode >> stream x]n0z Ci[1 (R?ȕ+Z>;ø)k]?>Ҵ[QW3N)f zRXީ܅_e!ʘ;J.kqyJ'XnegMM}VSCD|Zo㶨Dh^G sfNZu"}Wн`/>= /޳ոXh4Px6}G=-#q[lql%eP(;bB-/G 2@X@8"R@ Ⱦn(`C (gvpCl % sܔ}dw*c+~[a(4j0G!X[}۶pVV wkJ/Xܹ endstream endobj 35 0 obj 430 endobj 11 0 obj << /Type /Font /Subtype /TrueType /BaseFont /TWYTYI+Cambria /FontDescriptor 32 0 R /Widths 33 0 R /FirstChar 33 /LastChar 61 /ToUnicode 34 0 R >> endobj 36 0 obj << /Length 37 0 R /Length1 5168 /Filter /FlateDecode >> stream xX{p[WΕ,YӲe˾I|k9vةb)ܛ*Er*$ [҇ ބX(%2;wwvfLy]C`١3NJ+I&9^˧^ /' z¿FY|dY; {zȷ-hT^(zF h'១mV߾u5 Ͽ3Fxx]LURgs}~O}'?E:q P}dO\~5%TQ-[wvi{<{ rҩ++WULK=/.K뗜IK}yER*soW||>ϴ]>Eo\sRى>˾,;4Ӟ|A{ꙭ]1ms QyvQZDF"p7q FmTXSj8= ڍ?|+oH>-Яn5+t+OX04y}.wl|.G%/C1ϲc5ϯ/y=tptXA>'_&ƈ>ihf^fΧ6C\V'۟3rf[(g׳Fvofv<S3/ YGX hgċ> Tk<3s\J\3Sbs0 &!"4&qo\u9_[דrٸ.a h~瑈kQDoO>|ԆN7'} o默qI feC'>E/ozp} yd$=M#:DMuj꽗ȧ,> 2ǝXkk@r*awWm 5J˰Y}^iv>,?tNqXx8rܾNeғ&$=6kȎ᡻zĻխ1kMrgG-n~v58~Ѵ]<|1S1P o(5jpv;8^u_{\XwXLR4HxB9T6~7 Fc9o }@YMZu3Z;Nv}K^x=k5Jpg-EHn!]%5[ZFKwuzhL1sNoc1KhdY}۔V M8Zk f9|H5P_Xe.Q3(-Rp\Df3ج4wB(7hY!bfv1!k yjjh޲vL2F2x*1 q(_mخ*XZ(h9= N)y5*~n(xīBIr@^PU~`hjyVUFG)u*oS2eBec娪Ts3Oe 7/|C2mYHl9SM[f SM)jlT5yEL1 b !;ʔH5VyhT,:#&"[* >J$YDÈgT%ǰ<"VQ,xPIQ ʬn:*H;eF>=nQQd{7r{ݷf5N0 O XyZC%9k8!B{ Iɚ|, RJ]q6>"te[ aUkC|JLb)j?YӺLȝ:JV) cs%R! z l\gD `.GU{+G?{(L>@Byn ^(Z !c|{Q8jgԊj;v0ޤ.Lr:) OظKnuP*u3"u!\XxW*ȠWyc? 7o(y{J nt2=XS]S\bRZP.`NJ Ml/ CGl0̰:d]'8obg%B 1f>A b^T<gtI nug.U&E$q,GoX{cAnJFU^Hs*,xW!`XfBs꣜Yr>^ *X1. K6'Y󕍯 =*y]8&7.0oa$Qfl}5X&Pgpa4c6d :@O)<>LJ6VGO$į0'橗ivP!r_Ti84, oi-C1<0sp8q5<]MoLTW:~y,ʏǚ1{v;Fv[[ٹsxhi D#k5"ru{ǕO>O`w_鉸ßbo(=֑SssC[>e᩻zL nrWsf\Ay}{tӋɇ w?0  endstream endobj 37 0 obj 3262 endobj 38 0 obj << /Type /FontDescriptor /Ascent 950 /CapHeight 674 /Descent -222 /Flags 68 /FontBBox [-1110 -299 1378 1047] /FontName /OTYLGF+Cambria-BoldItalic /ItalicAngle -6 /StemV 0 /AvgWidth 585 /MaxWidth 1387 /XHeight 492 /FontFile2 36 0 R >> endobj 39 0 obj [ 220 ] endobj 40 0 obj << /Length 41 0 R /Filter /FlateDecode >> stream x]j >%&eBC>IVhT&搷hz9ͥмSf|pk"8 U.&a_3.}"(%FL;\xo|u3l)}!ZÉǽjq_8o$X$fJJW-0'{3$TjR",FBe2nDf.Y|RLz~q endstream endobj 41 0 obj 234 endobj 13 0 obj << /Type /Font /Subtype /TrueType /BaseFont /OTYLGF+Cambria-BoldItalic /FontDescriptor 38 0 R /Widths 39 0 R /FirstChar 33 /LastChar 33 /ToUnicode 40 0 R >> endobj 42 0 obj << /Length 43 0 R /Length1 27520 /Filter /FlateDecode >> stream xսy|T>~df2LB$ **JJ֭X AZ-Pk]ZtѪME|sϜ~Og,=ﳿϝv˦ˉ'4v ldU(VlX,~yTzͿnm"\׿v9W#aTЍŸ Y8M,\ >Q\DpG@vzԺ<_īA!g3]M\I)uF~MO.^|@|TLIzk8\b{n.vqv.q-\lb#X:.rq%Wp\b%+X \,㢟>.r^.s\p.sE'Eshb6h㢕.h⢑.깨㢖\"E \LbSE\TpQd.ʸ(墄b.&qQE!\s"\.rr",.\dr"E .ҹHυ /.\pr΅ +.\0raBυ -.\PrBBB0(#\|'\\c.>C.ſ'\|\rqxw osO\?p?\\׹7\_qK.^U.^e.~K\x8ϸ)?\!?{\|\<3\|osq80x\8I.Hp$Op-.1..!.׹rsqrqwsqG*wrq_se.nV.nK\f.n7rqsqrqk8\b{n.vqv.q-\lbz.q+5\b+Xr.b\q%\rE\,䢇n.p1..:\.pl.ڸh墅f.h䢁z.긨=NWX5'3X3'3,tu2c BYh "nFdtU2}Hׂ3h+KBmb3qFcY2ɴz\h5UV2ZLC,4h2F-e]B-bQnF gŨFG7/w}߀.A/[M+2 ?{{uw_f, ~xeec$ %c~q?3 '?qM9?0 õ|3w 6l 1lli&Ħ76d;{|?߽hiصkñ]VZ\]kձ]+*\_׵kɱޮŕ [SݵWvvuW5XGW{وUvXSWceCW= O,i4B`vq O%fP{yoJf 1o0_p7w6tINZ6׬NZ㮚:œr# f`vb})Y l17#0c$M fc(ҏ1C>j`bW]/5 q}" A'?O#8 9°pPXuXC&4s%gcaBuCt-\=$_΄c! _{0ޚHםx 5"NIr=%nŶ,ǒ[b?4?$-@X6[m%<#4cA2(^`7 \ۀ`3k++5j`X,`K%@/X,zn`0:y\Y@ @4@P fqӀ *r`2P%@10 (  y@.D da A d@|n8`lftj@(Ō1|J!Q`| ||O߁. #77~ 5+k+///灟?~C9gggOap8< << << <|:5A~>^n.(UN+vm-M!Fz:Z28cpp5]N*`lMF`XUJ`e@?,b`| s9@;0hZhj0x=_|KC>%!2!~w9Ln'ϒߐe0y$wɏk]30zr-1H 8vaa`Xis;BvER̘e쯟cakK?_U8VNx- }O>rY,"I/#( YEV2W+ZNCJ-E.%k=@֓Md J ЛS!Qo%rIvdOs);HKf&dř\CkQkדȍq{܏6C bNmCr*+Hw rRJ˞T ĭ(ӗImDpeWbie@]c܋ >U4Szb}yӾNAB]LDHї"< I#䌳%8L+ևuరp]' YVDPW= /XhضP}_]A0Նk ɐNJ7 9Ղ,Ĝ)C"&Ĝ:(#ǑZ^ UmB-+:g&7yB >a%ruܝD,k;BBm SOOŨ-"4qL kg|}d,$I/$>r8h~2~y_m[I_,GlRo*PBؒtiSO~hR:E Gx&6"pKXl}Q }EM^Ӥt썡x))#=9ZTJPD?"%=0_O{y%@*3yf;ECk |gNC%bAZ3?-T]v&\ ƥM<Ќ?L{㣱r&kf/q]kQП~ :үx<. |<4EO^5md@rFĬ8D2WbE9*-# }'WHsd2Z᝱WjJ9?}Op}tOG{IrL\~|G.xf OrzSrq77?܂pL&gr L$V%.GksO$ňH9z=m~K2&%]Bto) FRH&a-nT"O2U:XD٠5YuX6 'jԇέy}/ت.E{7-jkӕnhl.gU=ߕOjW~rDRM]\%}U*pǛ75~6BX [\[تz{*+rZ z/ 'v.J6yT I&)WnuX )jKv m*֏yҳ͂FH*hF0gR~/|ooRHjV:cQP.ERoHƬ?<|QVW9HwƑti|9fΧioΞ&RX8r?2#?qâ%n|@V/}}Q6,ԝBn7ec9bFuPfd4V9C pJTͣOssBdˑWlF9#ʅ-ss˽xڈyʹy@Tq 9ҦO\ Mv͑fF}w)聴݂Vfȼ=^i˱;Pf {PZr_62#Xn1ා# η!i !%k%/ы&!^$-zѿ՟v,[MU]~\V '|j]:dn,lES5 kTf<5X~j9OqaA7g#‹!QyQcG4o7aŠU"Œ+:d>̤[3jFn%Wh*!РBQhmVZ5ZK注G5V\R'%Tre*N>iL'jU 93;tLHE笩nұJX>-u`QXOu\< ǞMji[#RJ%>ODrhUC$5k4Pm:yth Jᡵg$F`4JQs``',JXrL( UEgxПތINЩqseJ;媷Nެ+;P䚅W|s[MǖO5yeUqe٦,^6X|{_؅[[,KvM023w=X.\3j44ۨIz]p/ ̹s05Bؐ2X60+Xr:LdMsgzj}=z:GI܉%nFH'nr(?4w\L qYA0\>nP#`x$ucbe ,%D9G :4#ǡioȡgm4bVTa?'s~- em tX<1Q7v,̕(@x\B7n3=vx*i:Ml{ZȌˏh'jњ:Xj8ǑlBi骲cv;Rx.bZ~X<,aDF[7TIEEBG.РimJf<+X~V9֗Ul0hOG۟?.V6q/5uVy6y U@_ذ+Ex۲Z߄V芯P 퍮3DPJT:U1#uqT; ^mּ]_ ەuz_ ]k *u'G:dQnKyY_y^֞LJ+N=5v(3 $3l~[0㐍+,,, oK,UBYBXHF\]9ҙNxX,R`30KE"Ѱ{eH]Zb3VstUpF({ 4@U^^R0^WЦit`?O/oTtG˧:sF~T6[~]|m̥lax[2Jv}jmPqf*kgz<#e\ܫT9WePG8´g)c|rj4WfQ^LX*n#_~妺#'aWF޹i]Kr;th邇ыO.?[fw|f妳7tsiIR  "3 hp[өyҩy-ЖNw/ĚJe@1ǝ @xJD1a'=k!/|3om'.Ϳ+Y7mp_W-h_Sf8q0(q9#3, B.E-U \wʭR@Ɍ24`4`y4ɴB ևOm {:,p2N(銩6Cn,S'R-ϥn\ )%r].,DR#^zvgAuXًgZ7ώg. 84#us5=Z703AF>.^\&aM]Hp ͪэ@zo`򁼽Ar.ЄUX/lk_Ì頼W7iiv;sѕC&*jȺxz9Yr'`BGQt*6x=\^M`m!^nlyWD+/0͗ O)Lh+hFdlZYVKt@QdPPbHNl>yVQCӇUѫj'x<30h׺ eюQf]ED0:)"+meeL5qRf)-v:e3bHeo (@7:\lIoUK0-z0Of1cNqwdB^UZR^!Xim; 1a1jذkSW>9PNOEZ *!,Mf7:͘si%deD P[]V(R:pko!} x imjYvӂ'ex}nwmuwWxk뙃 Ȕu^ 7Jyȟr+Ö$n˛Y2ztނibApb8F:!ߠmdNDv Av&`ytɑ2}XdL޷q)}x"[L%8XP iact>R>2L3)(*iEw,󩵘Z>>YFLד)R,19lSPBWܪ*BVH>hҾ&7^f;٘%9;: ¡ tbr٠jh;hl.2*I4e|aWgb[ _9&h7^z-|w¶tƛ)w`N {Sk4>-3e6j?M>}Iئ3j%LZ2hՙ;jI~샗jmD 7TV=ޠ/S(_gy'(4b~n+4L'BXv2Ɍ*˭Z22\%̯M9ܖ99ԋ2+mLXq˷EXd3 ` dk ߪqFKuCAesAkLJIt' tpِLƩ| v#js==]U[GV-Jni쩛d)hmZ90^b3ccjУ i]9uyv m|B #q3AZ賵Qkڤ =]1vx*&|t*51i)+hf5ss3)koܴyz7❳/eDwBWh<&Wȱ VyFW^[?jO״7 kִ7 Zw֙{Olw7XVUUeK6GGH6ԷB$:oI !7`,b̭ ;dO(0|_ _V(n//ɩC5鷩sfu,;D [!Z'e۷idG7At.^Wl;skG{ǃiKꃵIY뺸 ct|33<9ͦ4՜( o,śI;;cS2k{g,:ޙ]1|7tps[D%-iọ/9ҬGOpK sffO]M7/fl啁,VJNl,D̩Ff ̴qR$Vć6Z"fgI p/OM4W|:5"j4,w) -GgLJ7 I2ZV(lI @sMy],it:I~wc٪p w+9a|8rcg Imb~R H!4~OuCXBGpÓP ݻ9>~COZ\o3'ȎR x]pAOQY| &%fOZP?ɥSЃXʼ4>#͝knVӔ\ZHf7s9]QT%udX~[<;RȌUϟ69`sZ f굨]^=<)-:9'7nBc*E'r5\2æ`.rF,6\7/[-{E/]iP9coX?`򚜺%ĵK00Okї=[wl3UJshZbQzŤUehL41ë0U.JIƚ (mAQڂ!*RQNk`?ErR],[EՕBB!"A!"B$] 9 !WLNK/ JvP3ACI,36hQcX--, Kj6g7O5_ȧitԴ]M+ui_=WSsdm.6`c2UX7n o\2)}(B+]2mW5QxUσڥJk#/U١QCةZԐ/v#5X $UD;Ma+Z^7 1PyOAy ' Q.AK[k f*B^֊^_<)97;-9쾖0av6l|DG6cM܈驦 j@FةW5ޙ׭V~`zءSQ6Q;qnPbw I8%:%O JThͺVE;i^lbjuQJvh IŽHѭ]vjtZ4ƒ*AHe eYU'-Va61)bqP|ծWb$=XԾzXP=co!L[VlZ{̘+yS;{cAP}Ɏ.9+^_AJcҌ!C8ЪRYBT_B~U؜ޝ?lܪ}hڭnVѯSFExs@ }/hSlA [N Z!}bw)OQёl ث038S(?05 nT2È 'Bq:~#e:A 8Ɣ Xh.OZR8D2TVrx@y4OܔfJ80TѨE+®Vז**r[J\jvj$WҤ`aaPJ{ِv >0 80_1ݢU8c=zl]u֖ XG6]҂OB|$^IZ!T)šڤr)ՀBټ&[wl=!V߱@ǹK AV*4m_z٦ endstream endobj 43 0 obj 15298 endobj 44 0 obj << /Type /FontDescriptor /Ascent 952 /CapHeight 644 /Descent -269 /Flags 4 /FontBBox [-503 -307 1240 964] /FontName /HRLCTQ+Calibri /ItalicAngle 0 /StemV 0 /AvgWidth 521 /MaxWidth 1328 /XHeight 476 /FontFile2 42 0 R >> endobj 45 0 obj [ 631 498 525 349 479 335 391 226 229 471 229 527 799 459 305 423 525 533 525 525 453 525 239 488 433 579 487 662 525 306 623 420 715 567 525 543 452 455 544 615 855 386 252 221 252 395 646 268 250 498 250 517 459 ] endobj 46 0 obj << /Length 47 0 R /Filter /FlateDecode >> stream x]n0E .E`Z)x,snfq\ g8wDj-MffC;252wmwec5f 󜎻;Ȝ[|'> endobj 48 0 obj << /Length 49 0 R /Length1 5472 /Filter /FlateDecode >> stream xX l[yKHҵK_Qu%SdYiI2De^YIiN][Β4\ݒyt@@70X3-mvn؊[Ь(!k'[q}^J~,-]s9_R gϓFӅ3d> 5wD9~ښz5 1<_(Ysq 5gSW#<ԀNJuzs#1W*ã{ΜәNdFH(-m|f[@ '"'h,}ջ`}sD~@gj]v?_~ZCn4끜닷DyoܯמS f~fkۺGtxUMtϠ;1t}UCv,? t<_sۣ-n|3j=EM(?%R /,o<#i/=sy;]_+ڔ/ ^޳!fo~ac,Kg%-D,x*goIZP["PHlR3I{>y|J>}Ѧ~]۰g m`Y1llw91sfCLtiKhO5\totj;##pp80[΁--s 0s٘0ci14RŁqQM`eڏ |Sh&Ϧ@wG}Z`Rʆ9)l=^k; VI=<\@Nl_ 8=y;i۰v?lJW_טRE\plh)6;hvث;ٗM$]ɍI%ٙd8ٜ $IgҖ9Mr6ej9>WmX.]Zf4헖% Ce.k\g M[K:_\oA<ޠ:眉9pN9ޛ}y=TZ0*q.1Lnq .xi6;y:ld0H`g4A qO6FK ݨ>Q[vGW_ГtQ%l[zU P)tv:sOnW7:Pqj~xs_"lO~2?9|/ojLzbwj|lWrmC[[=c]ƨs:=47~np9vĨEx$gOtQ cSU_SK*F ebw/+YnUJgVkt\ ツRiA01Suіk?FYwN u;CܣzN*y),n"X1dFqBrYx?tBAtR͖Nmް,U*JeVoQSiiLFU6zrʼc$ovGU,͊v. \W$,& 1sOLsr .+վʕ kޒZ*ѹdes|]nPP-_V3f'dJsGf z7Tϋ0ay5;/EWdDR7iqc?ml"ʒ_F ߧT*vbٓc58U2\Pѓ•VQxa`J('!iǠT.ϛGb dOfD~:Czfa0m{eQޮ J%+T, vTÚ 'dA4O͙͙>Bƨ g CrwŖ[T"wxH FJ_nVfDtSJގoMY\9D?r@\%Sދ$+yTQP蠎(bl+&d56#=qn,9-5p"Ѩȧ): _ѭBG(ǼReq&W᷈&3W7jZlWf%! ;;U+s83]ߒm$XIM@$oLAaTJPUi}ENJ Œg/E~:J gIZPWa=QIVX`ܥZ*Y#wpԕ-345+~bMKLC3_wSrZWP3&dp6W$ko3AG[;@QR8 z~2{MM_* 9:AvD̬rwNipf&m5<&|ULsn]CZ%|\dU]إkA"ҜĤt~¨v_SR&VX,Pa_¿LD"~8 8FE1qU> 8K8'P1)*^iq\j "[#.cU&9QuB~;ޥN 2RW(:!,\)˵*uT(wƎ5C>-X,=DB*amALq7VpWǤ)YFr,Ħ {h;-%bQiV㍱%H`}f!412LGx]^h^TU+n6 3[ލKlI{ +`,e(l΀0e]iJw ֿ,ӬgEͭ\ s_lK>Kk5J- 's˵?RItu`TE( b}&Ri}e(V! *\mǶ ¾ b9WV1_FOcW}1G= :@THBN4m ȧ<@C!ihWk 4md`(~9onK\/!:?xޔD&[ض1imp/m##CR8m)$-v)]|3غ@WOf7nkmnJP`ounY?4{ldoS:C_ʭؿ1{S|hYIaLjgO NdC, endstream endobj 49 0 obj 3462 endobj 50 0 obj << /Type /FontDescriptor /Ascent 950 /CapHeight 674 /Descent -222 /Flags 68 /FontBBox [-1105 -279 1222 1047] /FontName /OTYLGF+Cambria-Italic /ItalicAngle -6 /StemV 0 /AvgWidth 542 /MaxWidth 1224 /XHeight 475 /FontFile2 48 0 R >> endobj 51 0 obj [ 220 ] endobj 52 0 obj << /Length 53 0 R /Filter /FlateDecode >> stream x]j >%&eBC>IVhT&搷hz9ͥмSf|pk"8 U.&a_3.}"(%FL;\xo|u3l)}!ZÉǽjq_8o$X$fJJW-0'{3$TjR",FBe2nDf.Y|RLz~q endstream endobj 53 0 obj 234 endobj 20 0 obj << /Type /Font /Subtype /TrueType /BaseFont /OTYLGF+Cambria-Italic /FontDescriptor 50 0 R /Widths 51 0 R /FirstChar 33 /LastChar 33 /ToUnicode 52 0 R >> endobj 54 0 obj << /Length 55 0 R /Length1 20348 /Filter /FlateDecode >> stream xy`gvuXdYeZ![qlG۱E$N\9MH 0(g9CRB)RH)g \$'9NJoOαof޼]ذnxѐ'EZC6ego`9!kN= 2z榕 M]bh9 UaZ ^uֆs07b <Ĺ͈Msg#kkceP B8q:4*ĩe! b b1bsT@ "^DbхDEt mVD b6фhDB4 f"DD=1QAT#b*xJDQ(E ˆbDA(%AD!@#jlUA.D&"D#;†",x4#S&a@:A*,3HB!x"N"&oG_#J-Rz"F~ )/#O#!>D|xx?Ŭ;Nx7fCx'fۈbY}M1kD6^Cx-e,7XaK_u/ ~xqYX3_`F9;7Ay5WY^-ȣ ?9 CS[Qӛc&686rAlDFB4f"DD=1قHCV/ A; oCyY_< A9A'A A d7ȭqyb&p*ĩe! b b1bяCG z!DU](@̧ /0|aP3g0|\Li:|07߹."[W|}kѮu8ȵ{]vn3]Κl\WN\ǯmYYsusޱ V_gZkNYߟEnA&cz#z|M P須ӂFV<52Xlйu쐎 u:jupivjhZ*jy͟'՜OT*nRE O=>R9kF{{rr^{4ka^ؽ ,J" RzU(fFڻ`ICf{4/zgf{t+dNH樕4^~C`} C̆a@p`gΏD-eZ?dʀJ`YNoY~ؾd1۽%di md'K&?#$/Ϩ/!?ȧ S% *5O?8X~2yt&߇Mi dLN7qD|ykܳP:6y+,mcҝ(5ʯ!09l"ɹd 9\@.&m2r98\I=r-\On 7r+vrّHc;ߍR*KK#&C'Ƀ1~b$?{!u?yQ2Jbd7md(N'C$NCk>BЎC>!űdO)4yzƳ9r1[$7Ofv_t41- d8Q:Zs5,5#4RK|HsBؓc"_Qhos2N& <8~v@共b1 #N)J5zY]d)[0!K1"QnT#2U'TB~Nx[5*iZ8' ҾEBP֜- 88@rJ產X+=QV!5ӵԾ=[J%'0Ӣۗ /ڕ5--'%&=#)B{(x`A(CWT`mC)4 yd(>uȨ(i\U `Dh]>"B[J~s3u*i `{FzYH/Yз|Ye}1V ַِC(r,E,`%̓@߹_GT!\LGɲ8qd>d'Jqf_Mvɳ5yF"VhJQ*ԑ('] QY|=+XRhR+& `'adyⓓ}Cα~/ E r_dgG.b ld.뇱,FUP*Qha.Zm (]ѭiiF1JZjhv,Sg7 aֱ!kTƠ؍beOB͗ l- #z-Uv`eDit*;@SRKm pocT5OSe$6<3VLw*-J Qu?^2y1cQdO䏄M$X$бIх‚cuRH/@}lW^5ydt 8lA/V^E?#e|eJ]FW YXAZW 1i垂&DI\  <|ֹ@/ɂ/,W:30+t 7Z)DNvmZbRIq5$ɀ=P vOx*y>Y1AJEK1P(9B(]48Y/)M+^R?7áԪ!zs1S"j$IsJB!dyII++ YzN+-K.SDZ0_o6ykz4೹))ۥx Byn\)ʜ!-y='#3Ǯffǟ~*/k.:uǿ.]>qp?ʴrFX <= N`#eCeEʊtiLT"lL^8\OC¦#;fJJL%˽ݻ`$Pf\N(l?vjQd2TwQVV;ӸB)/?PRfyQgC6 823y9vƱ?L_XRni~uAW}:I#[b1hS? !ܭzS_ƤU4U-Ɉ`n[raƀd N3^)Ӵy'vL'lfRߟWu8?mt.jhv48nk3K sgT7}ieoeFƠ4&-)I0Oi)cuf}nUkp/žTb{Ff'篔H+ynڛkl! DM *68-3dOqhOa LUUqvĄBl:@b!+(++EWPl|s.zp٬}5ʠ֗tn-SQԱtҎE]uiJ9+uMQ󢊀:Z>~w-ZYAw~ƛ E3"vW&gk3N43AZ@"=& ǻ&EjRNY0 ?:?̕4e(pgA5q@*38q@WpmshMu&֑why_9 d>pr׉ZqS8]4Cy|egu6%bJLcd4_6?qlƇ]:e36]Z58oyum[h5df6ߒ"<|V!99:5Fo٨--ߔRMqjoeQ~K,N Y,N+ʒe4*eڍ#h(hnjwEmCIߍ( 0 X ;X)̬h_d%;ݟɰvZsMKtYbQܢ4~(h᝻'`벭>..m>%-yk+6[gf(GX:HZU0uK#PnWRX͂e ! _Y $Osi0Uba[vcwu(4e_?݊$zEg>'¿(ghUeI_!əZnJvz:>,ydt?A]u2fϘp*+穉 U"&RNpxna%x&rSdd J5JQWWk\@ԉqfkIHchOX|9*%^CkwaR4e7m{G la`e~S($>i7Jf[i)ˍuQv#Ǎ uH%r~u!/1 ǜ _ȩx\߼jherȹTw!>'ӫ]oLmҎj&$B.lZ&PJ'm'f{8^4twCmnU:IޅwTn|3ڋoj}Zas4?KZӔg:rr"8æp8C|\a.T9S&:JD /|^밍M))VV.iwXRpn -P!0#1_ӇrVԟCve~:ḫoɯbU55'AU(.M+Ό }z22ÎNI \)is7GsXT0x(5qLPxG+ =>;L|piZL{m\6` S*U)F9V>+q~Gvwrxދ/ype^ڽ]keWj20j+ͩ-tܕ.^n9&EWֺ{F|Q^ԠSQU.Mɡ8E*ŹkwS|w{!dT[D0/`9xʁH|8;?Т  NўK>nr30/J`2Q%U *ೀ=5pl&R`qCv v×go4|zܔﷻ=29OaW{Icou45;TUMUUT#(Rkx_f6=m.t+*=Ʃ7ǵ;Vx ƺ VR=\YO%sZwmk/ άa$vbTn'RNPNz!y@VOJat5k^dɫ˯Yԩt)rH1k⊛猬NWIސOi^+[SpڌPm3}dᖖw^dN*)ff yu6>忘 endstream endobj 55 0 obj 11244 endobj 56 0 obj << /Type /FontDescriptor /Ascent 952 /CapHeight 646 /Descent -269 /Flags 4 /FontBBox [-519 -306 1240 971] /FontName /ENWEPA+Calibri-Bold /ItalicAngle 0 /StemV 0 /AvgWidth 536 /MaxWidth 1328 /XHeight 483 /FontFile2 54 0 R >> endobj 57 0 obj [ 563 813 503 347 355 246 418 399 226 316 537 529 494 537 495 473 459 537 538 276 561 537 474 874 537 246 267 653 474 606 745 507 507 507 ] endobj 58 0 obj << /Length 59 0 R /Filter /FlateDecode >> stream x]͎0F<g"!j菚6CyωR{/qXL#McH2]a,V _s;%eO cʟ\t3OO=d~usc1!lh|홮ns4LD>B̭Om귷coME]Xk.Z{U?WnM*CH(X[K7(w{P@(jk׹8J4ѣ@ Tp G8J'تNXZ) '(J8w*zu!(~U^JVWR^GVy*w7*YY5Y3k*JjǗj )q&ߐ0Əff_ x endstream endobj 59 0 obj 447 endobj 9 0 obj << /Type /Font /Subtype /TrueType /BaseFont /ENWEPA+Calibri-Bold /FontDescriptor 56 0 R /Widths 57 0 R /FirstChar 33 /LastChar 66 /ToUnicode 58 0 R >> endobj 60 0 obj << /Length 61 0 R /Length1 20776 /Filter /FlateDecode >> stream x|y`Tս9YLfL&w̒} "DWTdQZH-ZD*hY n5hmbEZ:͏Z*> 眙`{ ߳sn\ߺb)%#"z[ו%Djz[yĿzrO>_!r͒|^=ܸ!EHEkQjāk,=ו#oP ̿~r yM,B<ܼl9ϒf?Et!ŏZ )"w!ϋR^6޽*]?Aͻ{bM>~p7^R/B۳xFΡr7RXßGP:(|i MrG񰑌Ft-FI لW Y/I0N4srä! e-Ez𜇗H]:eqv,-R;BX6D9"VPeu3:tՓhg5,-ROkxXbZDhB?H1rjHUѓqrJ^CN9(%hK ʵXu6@y-r,-&њ|ϓ"w<ϱH"Fȗ!Ԝ5kDB?|POr)xH:ZPDbSOFJT?ϱH3bEY'oWci~Nv"3i@Q"#1|"f#?eF>Ө<#f$1rH>5~Ҋ<<_3r[?k;%飼7loxE6)ѳH"o2tvy׼A,7V闅SH^!/+WjL(c5"BkeFD֒PaއH/ཽ`9K XH| x>>y>V#yՈȱ1)̉Ո<-$ oc!yyiu)wpySd;ۧ䧤' fei<ƟylBl%[PH6?5c6!Feȏx䇜Y( lH|W\_xdK^^}Nk9MCF"7^cWpzy%1_ x[ '(G[ہ0zKVxle<KЂ"(W I@?K-}hlGPз"ceB{{VD|kM9.a)-_Cc;ZfȲ+ Yk$ł]@V#S^Z2=Uc4kc jQ)==Bp=-j7U=dU_ N%({Ġz?U~wN7ym(lހߖȤcd1oޓ0G[oG&!X[_A<&f&( m{gv*q1g"hE< { (F ݓMO(,xrXȤbҠK =uM +d ?g/NH?7ⅆ懴 ,DdHBơT$I44*H>&/nUFؠ)ykP)~j_˼Q-͵U Xet@j15NNt`eCyPGhDk*&ɵSҞ$"O*3ϫћ{3~ca{{{J֦`54RA}QʅdumUZfuѪLmMu(I+iMu:eNrQk!iV}rHDJM]bV =!4.Y볆+ ȴ+Myn~"!/ vxu.eJ|EwtMzGh< EvkYM@Y/I7r4]HЯZl 'k[:kp((7CL- =-Ӓ^AQnԪ%} Hg*ie]P簔z3ͽKAPO $Σ:rB~~:Εa \1yAR1cb P#q}Go N^u 9p9[;[[rpW sEZ,oq8fMCgSm ͵MFt15}Lپ>gY ׿"tQˎ -Eͩ$w%#U*2eVoNﰶBs1YѸmc>l-s>ώt) <~o9p3 {( `3{LND[z:jkzEco>@y ҦjSɰ^^A+%mReZl^c`'Փ! ЌZনQ;{V._j׫ ry7fڝ{O?t ay^2$!*WVԫ B99 ժբm+KVH-u^zCc3uc߫U\WypǑ'w :TMmΝes ו[=nT}N|=1r$&^}5ί~2-f+WV4\9(# }IkQo6U[ ^fl1 Iu}cRR( $̶d+)ИT\KW _^% IҌyTZ}l CD%W0+Ty7s|#*+!MsߺS_ \mlt疇MnEbi:_kU_@U45PBcz.&UI+^Xy;o_y !FᮀT0͛\MP cj{Rk5Sjc?JFddvS/yQtT3 uח=-ۇ+ξ[4,ހ۠ńU}OI"@<^}X,((E'Z}qJ*L=A~*Jt'wppQ170'-wL/nid"H}h&p4>L! 6 fZgzvBtn$[2hG XX|0cBNOmR+*1n$b`B;R;)Ħ>4dr6"̯r#e˟9S4"/fW ?/(sV|!hr8? )N[ E2_(y@4:E'_S:&iF=VV%z~ahC.F?y]!Waxr=bxLWBﺾrL϶ .`r9ar8sCR Oӏk;„3w4ꦥN_Wr(t1S8^;CxK N[#}.qJ&t| eG[-?V=ء|:r%!CiVS."-">szWӡsѯ1CQ OM7K6"G*~S-g3O4l›3^e'&L g8ovaajmuTm{N/T7-=pQG@I jv;\س:jMӓi5`:Vk$UM7̿;~\o7W$-;꼦-ԍ!TB!H퍗6[UkrN>"ΓT`Н_/[IZHaOa[AcЇ3@c:4=5L:SCp\ 8hQ~ zF R#x7hz7C3v p`DϬw 63Qs9<ʲgAe8QƦfL8Aōl!@fT~|-׽zgLYTu#j$/ԇ1@0d wCkVy:;i৖0 m0:c-OH?GTYDp*x:@9!'vcU!>po$w].` oۀs0AAR {ape9ܥZ fы":S|oO78Fa`Ĩ0;_*Cм9phNp83('kDž+&SO_vq=BjvК Ӏ;21bcA۞zP v& @ϜH8J3v8d8S 7\NhB|=e]VI#/ \3k% `+ gL|J}/r?Ex3U6v y2s_&y&s_r'/zL;sM^< '}|汳_&*erGkbߨQq~Pe5oFʃ&5ȗJCMTvQ[qP''"32UzxBȂ̃tXe9!+w2+Lz.T}+Q.\,]`XHVnu(HySF*F~TǨx*X{hHt afa N!gc@d'?I ^ɟ{\B+Z"F~G@z1%K(H*#͉\X=C2"}?v!Z~ gƃ>" ):q6t@e~v(HovK^ (!Z]p.zL]:V,_qű-؝+.L}bv'̎n6;2@-bjGQCS `~qx G+=iqT+nkJtڃQ_ <0l3۫-^}NY5GGUᐐ{9a:)3k/d|.xt1OΛ)xl.2MIZ5V89˾`yh.fkc ew@*j} }W V\lbK%3R=֋9gfrW- 4L2,=f{sqo"櫾d&MZFH /F"L AomH0^WTv}#.痉{AV2)O[鎗J:tjz۰CCz1YX6(~^36 ]YySys˖#ry |9 .{ᇏyx/PP]}9,~::` CtB dNv7],F*Fitor"< *wx'@b5F}ЧN<1^x^o!4&]|f3RR`0M}$ ~}no0bb0%O#0K`5oawP(u#UMU0mO^6Lkw}{$P @ߓlә-sgu ϭ{ݷ| p411' f}>6pЗ¾0;|vbw;)*ks+x=9BfVFNLg asx`Aߌw2 ?`U >F , 9fլ9a7 Rݯnw=Ǚ&kO!}~;,ޙ;[koo1X1[@][0(9d-[̔%2SFf@y4:KPg:b/If3T[R_"QJh/*#gpqoo}S׺$6.Ԑz+~ym'4F|;w/sosZ+,okjMΣ`8U^}y`G ~ B&oun@'hR`/U7+vEfEMԉsZHm(SoT% ?'ʱjQw܂@M+tj\%W>=ׂ\g2U^$J d\+bq1nxznhyn3$@uܶvPXLu`o"w_ϟ2}{H4w͝uG?xɏK%]>5_z岕oډ _p7j[gw4?p=?ə̊dߘ]2VRsvje:_Z FomUZJ<PX)@ ~YuGeQ&lFqbxϙ`:O!~:Sw)XPCcR+_C8Db(@Rp^t"p5sr.nZ?͆PKr'.~qa7m u& | ^SwAiz71(a>$%k7| \sNƒHhݵd>Z1\-n6-MTeCs<2r"^M\l#d(~] 6u]O>iiȑvﻖ>ޖ ;TQ-qrNzq-%t)^Ǟ `CgS?7TWBF\{.\uyf>lO}t]ԧkrYWLr6&&MU?GųSW6 C2Z`M*srhPGPù$3vM09yIAƅQ@? | {O\ThS{dZ uH3s [f.gUF` 0H2l N)cߘd`քavV̫yS`%lX=pg b>/Ek3֒I$% 9 c'Z\$,<=n$L!U2bÿw;7) 9_oU 9 MDO xv&ʸ=U)4ǗM;"WeO22nnբXü4~;,LS7y&m?nDmD}Dc|##]#G/:"<;>~;Og3FgjD~G37|"4i~mD#F`'1 endstream endobj 61 0 obj 13670 endobj 62 0 obj << /Type /FontDescriptor /Ascent 754 /CapHeight 595 /Descent -246 /Flags 32 /FontBBox [-655 -409 764 1089] /FontName /LMFXOD+Courier /ItalicAngle 0 /StemV 0 /MaxWidth 823 /XHeight 462 /FontFile2 60 0 R >> endobj 63 0 obj [ 600 0 0 0 600 0 0 0 0 0 600 0 600 600 600 0 0 0 0 0 0 0 0 0 0 0 0 0 600 0 0 0 0 600 600 600 600 0 600 0 600 600 0 600 600 600 0 600 600 600 600 600 600 600 600 600 0 0 0 600 0 0 0 600 0 600 600 600 600 600 600 600 600 600 0 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 ] endobj 16 0 obj << /Type /Font /Subtype /TrueType /BaseFont /LMFXOD+Courier /FontDescriptor 62 0 R /Widths 63 0 R /FirstChar 32 /LastChar 122 /Encoding /MacRomanEncoding >> endobj 64 0 obj << /Length 65 0 R /Length1 15076 /Filter /FlateDecode >> stream x{x\ŵ{wnUmҪ쪗ݵUlI^J^eb08b" %(5E^C @H C`靹gW|ߜ3gΜ9sho|ѐC#e#;wm}~k[7޴y,_!UdžG'lL`.@9]#@O~ 1_`t> ޵ww^0_OR''Fs A˧eD4_~1y]o} .wtՙ﫭l(<:!/:|ܖCpSqS쁔7^pAʫ|REG؇*{S Oyk Fؕցp',a[y[A G   Y3R>F8‡C M1#5/FQG4C-¼w~ۨ -!FʱS+{PcPx ?^EȽ" pGj~?PwG8Cc7#@>x t@=@@}{5bݚ+@_]@wt;nnE} n F@77W_NEߵ;|ר] 򫀮|sQgg&/_2y09hv &/`FJ6~lu_3L~%9x|xO'g8}(^<3߹qG|+4pKtS|h|lr4>GM\&+AEt G'=ee _wOv;h[:OlH,ZBLS[t[FI3nlebv.u] , /:~Cf%mn휍;tZRl3gc[}62ٞ6hd `5 zY='#mOǬ:k{ 7hz4ihn5emc >ڦrș)cP?+]dLӧط*2IV'15y i[W_M<]IO"%`W$DкBc}! r <<9j~/|j^r\^w2stH/J}!9r59J&?!g!u+|$ɳ̅D=FB{yYdYϑ~qfJa&j}j sf4%u5gC O3ܻ 8YAVAC>%0!dl$f쵍l';NdMq>}i  r ^D.< .!?C2xYl 9r\I>H e r\y dgS4} zr6Er$=Jn&_W 4Nr͗A=K5"OoO}| iH=Gsg-5 bj%EF:n,~>A^o C _&Y 8AѸl^ i(ѺU3V?kQYZ=3pVr-m`Y4c2O| nxq8Nd)|3ȃ!qy!Z?%o=A"/eAcsϐe_co_'w^l[nի}=˖vwuv/ikminjj/E#5ե%`^sZMFNV)y\Ʊ mCdp() ŔA0sfJ2Ù4A mˑ)l&y/lpXLC4L-Nser `Vu(=o3yh8 #+}<'І&!ؒ pژJAx:/,v'BZPI^TIks K%K[,H@ZЗxTξu>^I mG lHnLܣ w ) %,| ^@2t;)  BS-d d6d-i ZP0\^s;8@3ʹ6ɠmӦ6mPue^T tm,E%vڇ0 i?d+,SQtןƄA|HMƷ_i^2(%Ik aHq*K$~m?'#P ]BBv `Aچ61<5{h1Q:yL ctBOXJ}t1]Ma=Mʾc"seF cxO(IY*B i90JIH!)W& $~ @Ɛ)eƌ 2DI6a0[tx.<14H'P—I2B=IB=ڤZkJj&*o+LAL N%(>afgL5@IUy^'-4%C#ô$S̎A A#T@M*C J<4 ї&$ic }QY Iua *hð$q /K{k#d add\cH $ʂcLBitꤪ*/MkJB`y;VwhQp):Ax,o,.H-.c?׀Df C]<*u@)O{syS 8P$ĹPqXyT''&\!BdO/"KܝD&>:nt4 Yts I1@(/seH!*Ad\Nv/i>!@/oh\>@ {%HLaASl%j8"p*r$,n7-+WRTJ_hj^|->p˽E[,z)ەjft1 3*el^Du}L_ Bgxoq$SiSX1LY,+BN TVVԳU% VWճz2T5%)(S)'3 "_eϭj_s(zJ,@uAX VT( 䴬[5kxneV,.lM?gfoʫ6-ߢV2)#oq[[ V/ b:Q:ZkjiW L |,,''؃%$7aģR+/ S쀨(yQWX M1/ k vC{=Gt/neZ D7}u[eq ^S˖lhjUϯhʶ RvpYYP"5,oh\ {˦WU7הƞ͵F T,19=q9?(SC󃋕S̃Cp)+:,D8Tp:k>Kn%7`WoLW*\`μLxAE+4PA0 -6…eE,#Gײv|qzkUVXd(c~Tfes.kB]CfI/5oŢ}uknjWs{jSjߵVlZcBju`{H1i"/h֘<^_Dcٱlsd(KLX4GW~ߙm6idzGC_qWjinN֟k`c2р2)*^wn;rա 3_P-cԬp9f+ cڝyVjOfP)Pj"`b/m-b¤7Q\tԤn+:ڥB1jק.wSrKǘLኹ"[Qx<o/z$ꮯmdV3ٙS0M-~cSIz_W[tG5Y%.fr9Q^RJ =h+nX3˗Eiy۵$uvͥ"C*z#Pdž]Qos}7?C*=&ǜMg* s]M$w55zpл ;Ej)0k:Eϧyܙ.)3{ g[Zl.&'\E-;YPزC+4o9m0 V-7dZbu8&FnǷC'ilY?<}ˆ- 1B&N endstream endobj 65 0 obj 8690 endobj 66 0 obj << /Type /FontDescriptor /Ascent 952 /CapHeight 644 /Descent -269 /Flags 68 /FontBBox [-725 -276 1259 1014] /FontName /ADOVGS+Calibri-Italic /ItalicAngle -5 /StemV 0 /AvgWidth 521 /MaxWidth 1328 /XHeight 476 /FontFile2 64 0 R >> endobj 67 0 obj [ 335 229 791 478 452 343 389 306 498 252 543 226 514 514 268 514 513 514 416 305 514 514 229 ] endobj 68 0 obj << /Length 69 0 R /Filter /FlateDecode >> stream x]N0y ဲIhK(!(> endobj 70 0 obj << /Length 71 0 R /Length1 5940 /Filter /FlateDecode >> stream xX p[q/AH$Gz"M!"J,@T#@|AHcI-4NSۊtɤ?> ٙlk&m]Wq4I3-#@K{&Ƿ{{{w{w8rt4Ifj9:LT,ytBxD?| w\&r~}~e/+єӧhקZrJڢGAmRSFsU.,Çax㟾[^J59*dV_bI.n=G,o.l+S?-U3kxY oəB٘He+c[YV[ j DU,@ DI(.QT lZ ,ߒߓĿW#[R&__K(g$>/YH|Z$~RSOJ|RxP%"pV@݀{'<x2Nc <88 yNl:ZeU'*=QϿ8 !TrG+574PFgzp1WL/OVt%˷/E[jgBQj;#WFHS07:=?= Z﹆.0}3&Lw_aNܼٙ3[[k?C4< sƦ:'+Νa@[x]^}^[Y&]U&xsQ~QiۍI/m+zͽTs=e.Gee3uNwmrk0O9nfz0;5OCq|=7*c~2TVXmϾ*)Tm*e~Q@+2W/ AG4)8&xyY:(w dzI\n:7(-fMhû㳬Z(sh^ˍ8MvA<](o֣OH;%KZ/C'ohBk7Exs$lzz8a'}ޭYp|`»re`8ɗk=Q~ܥgeMـj 2X-Pn@ l+f2>136~eceҸjfj\1~n\6~j?1Ƌƌ1mdYqxx8eL'qc0-ƽ~A}lfu'#]b?k9zqaω[C9kmc޸`¨Qv{`]MRJH|ֳAY G3BvH4{]&SU]'!K}=#%ݑVVӇ>#ޠװZ9ӗmg6ޅJKk:_ xJ'V)[BKTd¾\7!8J;6&=k kegio~,.Xq% 5|vJwƆ=ڿes_ogSkc _vM}m[/5jk+j݊ey[.-q9Evb61jf> #yu8:<*wm_ʩ\keDK^[uNˢb PG{Uss)j[x)7MeI|y8+ޭ)!~NqvIP(tb+w9ʚ,ɺý*zW-t oıQ+gp36tbصωAدE1DH~Ӆ\DjF (~4`<,kbx ;q p$LȆJranD~Nz7H}&]SDS"I5-9#1JqVYM.C3RܜQY2" FiUlwDbHZ͠/tZ/7ңI&,Bǧ TK3ߘ*̔_) $YD4"{Ď.m~CnNh:ɽ3B3`0RT#_#-htuF|U#{~ډѻ⑴ c~^LD2` j0#AM(:=aɆbrb(՛ȳ XLs"ۑǒ2y8b_l'㹾J{(ԪcB2_xw dA4"Z•KQ,`C9yW}H>Yչ]R&ܹCXpi,w!r q\yzz;7 s;v𙬞_21S8ٓCS$"#BE2H+s!I)H5)hIgϒ$ L86ࡁt&\".&+L6/F{Snmoz(uIj(qRXBrS@]\ z'8`zBVm{3I ;Db=?EKB;0#?4\b5Ild'th|LXڢmආPk"SŁ)[A(9 XLGx.X>Ak$b,4hio7pFq[pQRH-sYR1!^A;WcB"p',j#DS0^fpcɈʥ@  Np4|c`9.vK~f=&4kbq (D̽ >^ndg2E%? V̢FƐNAm -^~ ~GdQr>_ ]:kQ#5SƐNgV.X֚nssz6nm. R][~&o:fʫce2mMU {SV_HχFjfk/}{9imeeiݪ5Zt}œ+V׮RCƾu[,װ^ZFˈ%ܧSKzDm3 endstream endobj 71 0 obj 3653 endobj 72 0 obj << /Type /FontDescriptor /Ascent 950 /CapHeight 674 /Descent -222 /Flags 4 /FontBBox [-1110 -299 1372 1047] /FontName /OTYLGF+Cambria-Bold /ItalicAngle 0 /StemV 0 /AvgWidth 600 /MaxWidth 1380 /XHeight 492 /FontFile2 70 0 R >> endobj 73 0 obj [ 220 ] endobj 74 0 obj << /Length 75 0 R /Filter /FlateDecode >> stream x]j >%&eBC>IVhT&搷hz9ͥмSf|pk"8 U.&a_3.}"(%FL;\xo|u3l)}!ZÉǽjq_8o$X$fJJW-0'{3$TjR",FBe2nDf.Y|RLz~q endstream endobj 75 0 obj 234 endobj 28 0 obj << /Type /Font /Subtype /TrueType /BaseFont /OTYLGF+Cambria-Bold /FontDescriptor 72 0 R /Widths 73 0 R /FirstChar 33 /LastChar 33 /ToUnicode 74 0 R >> endobj 76 0 obj (Microsoft Word - timeSeriesRefCard2.docx) endobj 77 0 obj (Mac OS X 10.6.8 Quartz PDFContext) endobj 78 0 obj (Diethelm Wuertz) endobj 79 0 obj (Microsoft Word) endobj 80 0 obj (D:20120319140701Z00'00') endobj 81 0 obj () endobj 82 0 obj [ ] endobj 1 0 obj << /Title 76 0 R /Author 78 0 R /Producer 77 0 R /Creator 79 0 R /CreationDate 80 0 R /ModDate 80 0 R /Keywords 81 0 R /AAPL:Keywords 82 0 R >> endobj xref 0 83 0000000000 65535 f 0000103745 00000 n 0000008754 00000 n 0000024668 00000 n 0000000022 00000 n 0000008734 00000 n 0000008858 00000 n 0000011770 00000 n 0000000000 00000 n 0000074498 00000 n 0000000000 00000 n 0000036831 00000 n 0000000000 00000 n 0000040970 00000 n 0000000000 00000 n 0000098790 00000 n 0000088976 00000 n 0000000000 00000 n 0000057698 00000 n 0000000000 00000 n 0000062033 00000 n 0000009034 00000 n 0000011749 00000 n 0000024384 00000 n 0000011806 00000 n 0000024362 00000 n 0000024491 00000 n 0000000000 00000 n 0000103319 00000 n 0000024758 00000 n 0000024808 00000 n 0000035909 00000 n 0000035931 00000 n 0000036169 00000 n 0000036305 00000 n 0000036811 00000 n 0000036993 00000 n 0000040345 00000 n 0000040366 00000 n 0000040616 00000 n 0000040640 00000 n 0000040950 00000 n 0000041143 00000 n 0000056532 00000 n 0000056554 00000 n 0000056789 00000 n 0000057021 00000 n 0000057678 00000 n 0000057860 00000 n 0000061412 00000 n 0000061433 00000 n 0000061679 00000 n 0000061703 00000 n 0000062013 00000 n 0000062202 00000 n 0000073537 00000 n 0000073559 00000 n 0000073799 00000 n 0000073955 00000 n 0000074478 00000 n 0000074664 00000 n 0000088425 00000 n 0000088447 00000 n 0000088668 00000 n 0000089149 00000 n 0000097930 00000 n 0000097951 00000 n 0000098196 00000 n 0000098308 00000 n 0000098770 00000 n 0000098959 00000 n 0000102702 00000 n 0000102723 00000 n 0000102965 00000 n 0000102989 00000 n 0000103299 00000 n 0000103486 00000 n 0000103545 00000 n 0000103597 00000 n 0000103631 00000 n 0000103664 00000 n 0000103706 00000 n 0000103725 00000 n trailer << /Size 83 /Root 29 0 R /Info 1 0 R /ID [ ] >> startxref 103904 %%EOF 1 0 obj <> endobj 29 0 obj <> endobj 83 0 obj <>stream application/pdf Diethelm Wuertz Microsoft Word - timeSeriesRefCard2.docx 2012-03-19T14:07:01Z Microsoft Word 2012-03-19T15:07:25+01:00 2012-03-19T15:07:25+01:00 Mac OS X 10.6.8 Quartz PDFContext uuid:9be220ff-bcb7-1a48-8336-e3d0105b57a8 uuid:93a93106-32da-534b-b718-6c8847c64fa3 endstream endobj 84 0 obj <> endobj xref 0 2 0000000000 65535 f 0000105723 00000 n 29 1 0000105980 00000 n 83 2 0000106083 00000 n 0000109858 00000 n trailer <<6F42369626D0482CB77739AF2A8958FB>]/Prev 103904>> startxref 109899 %%EOF timeSeries/inst/doc/timeSeriesPlot.Rnw0000644000176200001440000015272614472112613017563 0ustar liggesusers%\VignetteIndexEntry{Plotting 'timeSeries' Objects} \documentclass[10pt,a4paper]{article} \usepackage{hyperref} \hypersetup{colorlinks,% citecolor=black,% linkcolor=blue,% urlcolor=darkgreen,% } \title{\bf Plotting 'timeSeries' Objects} \author{Diethelm W\"urtz and Tobias Setz\\ETH Zurich and Rmetrics Association Zurich} \date{May 12, 2014} \begin{document} \SweaveOpts{concordance=TRUE} \maketitle \tableofcontents \setlength{\parskip}{20pt} %\SweaveOpts{strip.white=FALSE} \setkeys{Gin}{width=0.9\textwidth} % plot.ts <- function ( % x, y = NULL, plot.type = c("multiple", "single"), % xy.labels, xy.lines, panel = lines, nc, % yax.flip = FALSE, % mar.multi = c(0, 5.1, 0, if (yax.flip) 5.1 else 2.1), % oma.multi = c(6, 0, 5, 0), axes = TRUE, ...) % plot.zoo <- function ( % x, y = NULL, screens, plot.type, panel = lines, % xlab = "Index", ylab = NULL, main = NULL, % xlim = NULL, ylim = NULL, % xy.labels = FALSE, xy.lines = NULL, % yax.flip = FALSE, % oma = c(6, 0, 5, 0), % mar = c(0, 5.1, 0, if (yax.flip) 5.1 else 2.1), % col = 1, lty = 1, lwd = 1, pch = 1, type = "l", log = "", % nc, widths = 1, heights = 1, ...) % plot.xts <- function ( % x, y = NULL, type = "l", auto.grid = TRUE, % major.ticks = "auto", minor.ticks = TRUE, major.format = TRUE, % bar.col = "grey", candle.col = "white", % ann = TRUE, axes = TRUE, ...) % .plot.timeSeries <-function( % x, y, FinCenter = NULL, type = NULL, plot.type = c("multiple", "single"), % format = "auto", at = c("chic", "pretty"), % col, pch, cex, lty, lwd, % grid = FALSE, frame.plot = TRUE, panel = lines, % axes = TRUE, ann = TRUE, cex.axis = 1, cex.lab = 1, % yax.flip = FALSE, % mar.multi = c(0, 5.1, 0, if (yax.flip) 5.1 else 2.1), % oma.multi = c(7.75, 1.1, 6.1, 1.1), % ...) % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % 1 \newpage\thispagestyle{empty}\mbox{} \pagebreak \section{Introduction} The Rmetrics \texttt{timeDate} and \texttt{timeSeries} packages are workhorses to deal with chronological objects. Since their inception 2009 under their original names \texttt{fCalendar} and \texttt{fSeries} they have been only slightly modified. With version R 3.1. we have essentially improved the \texttt{plot} function, but we also took care that the functionality is almost upward compatible. In this vignette we show how to work with the recently updated S4 generic plot function \texttt{plot}. The function is written to display Rmetrics S4 \texttt{timeSeries} objects. The basic functionality of the \texttt{plot} function is to display single and multiple views on univariae and multivariate \texttt{timeSeries} objects. The function \texttt{plot.ts} from R's base environment, which displays basic \texttt{ts} time series objects, served as a model for our design of the generic S4 \texttt{plot} function for \texttt{timeSeries} objects. Similarily, \texttt{plot.ts} can be considered as the prototype for the S3 \texttt{plot.zoo} method. The \texttt{xts} plot function was build to display univariate \texttt{xts} time series objects which inherit from \texttt{zoo}'s objects for ordered time series objects. The generic S4 time series plotting function can dispay \emph{univariate} and \emph{multivariate} time series in \emph{single} and \emph{multiple} frames. The plots can be tailored with respect to several viewing components: colors (col), line types (lty), plot symbols (pch), line widths (lwd), symbol sizes (cex), axis layout (pretty, chic, tailored), minor tick mark appearence, font styles and font sizes, frame positioning (mar, oma), as well as tailored panel functions (panel). \noindent\emph{General Plot Settings and Design Apects}: \noindent\emph{Plot Type}: Univariate time series are displayed by default in \texttt{plot.type="single"} frames, multivariate time series are displayed by default in \texttt{plot.type="multiple"} frames. The default line style for a plot is \texttt{type ="l"} is drawn with "lines". \noindent\emph{Time Axis Layout}: For the time axis layout the function \texttt{pretty} determines in an automative way the \texttt{at="pretty"} positions of the ticks. The \texttt{format="auto"} is extracted from the time stamps of the time series object or can be overwritten by the user with a POSIX format string. Alternatively, one can select \texttt{"chic"} to generate time axis styles. We called this method "chic" to give reference to the underlying function \texttt{axTicksByTime} from the Chicago \texttt{xts} package which generates tick positions and axis labels. Furthermore, a "tailored" method can be applied which allows for fully arbitrary user defined positions and formatted labels. Minor ticks can be added in several fashions. \noindent\emph{Annotations}: The annotations of the plots are reduced to the y-label. These are taken by default from the column names of the time series object. This gives the user the freedom to have full control about his views how the plot should be look like. Note, multivariate time series in single plots show the string \texttt{"Values"} as label on the y-axis. Main title, sub title, and the x-label on the time axis are not shown by default. We prefer and recommend to add these decorations calling the function \texttt{title}. This allows also much more flexibility compared to passing the arguments through the plot functions. All default annotations (including the y-label) can be suppressed setting the plot function argument to \texttt{ann=FALSE}. The argument \texttt{axes=FALSE} suppresses to draw both axes on the plot frame. \noindent\emph{Decorations}: There are several options to decorate the plot: These include colors (col), plotting symbols (pch), scaling factor of plotting characters and symbols (cex), line types (lty), and lindwidths (lwd). Note, all these parameters may be vectors of the same length as the number of time series, so that each series can be addressed to its own individual style, color, and size. A grid and the plot frame (box) can be added or suppresse specifying the arguments \texttt{grid} and \texttt{frame.plot} in the argument list of the \texttt{plot} function. \noindent\emph{Panel Function}: In the case of multiple plots the plot frames, are also called \emph{panels}. By default in each panel the appropriate curve is drawn calling R's \texttt{lines} function \texttt{panel=lines}. This function can be replaced by a user defined function. This offers a wide range of new views on your time series. So for example yo can show zero or any other reference lines on the panels, or you can add rugs to (return) charts, or you can add for an example an EMA indicator (or any other kind of indicator) to curves shown in individual panels. \noindent\emph{Example "timeSeries" Objects}: To demonstrate the wide range of options to dispaly S4 \texttt{timeSeries} objects, we use the the daily index values from the Swiss Pension Fund Benchmark \emph{LPP2005}. The time series is part of the \texttt{timeSeries} package. For this we have introduced some abbreviations: <>= Sys.setlocale("LC_ALL", "C") @ <>= require(timeSeries) require(xts) require(PerformanceAnalytics) require(fTrading) tS1 <- 100 * cumulated(LPP2005REC[, 1]) # SBI (univariate) tS2 <- 100 * cumulated(LPP2005REC[, 1:2]) # SBI & SPI (bivariate) tS3 <- 100 * cumulated(LPP2005REC[, 1:3]) # SBI, SPI, SWIIT (Swiss Market) tS6 <- 100 * cumulated(LPP2005REC[, 1:6]) # Swiss and Foreign Market Indexes @ % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % 2 \newpage\thispagestyle{empty}\mbox{} \newpage\thispagestyle{empty}\mbox{} \pagebreak \section{Standard Time Series Plots} The \texttt{plot} function from the \texttt{timeSeries} package allows for five different views on standard plot layouts. These include \begin{itemize} \item Univeriate single plots \item Multivariate single plots \item One column multiple plots \item Two column multiple plots \item Scatter plots \end{itemize} \noindent The only argument we have to set is the \texttt{plot.type} parameter to determine the layout of the plot. The default value is \texttt{"multiple"}, and the alternative value is \texttt{"single"}. The arguments can be abbreviated as \texttt{"m"} or \texttt{"s"}, respectively. \noindent \emph{Univariate Single Plots} were designed to plot univariate \texttt{timeSeries} objects in one single graph frame. Nothing then the \texttt{timeSeries} object has to be specified, the \texttt{plot.type} is forced to \texttt{"s"}. \noindent \emph{Multivariate Single Plots} will be used when a set of multivariate \texttt{timeSeries} objects should be drawn in one common data frame. For this argument the vlue \texttt{plot.type="s"} has to be specified. \noindent \emph{One Column Multiple Plots} display multivariate \texttt{timeSeries} objects, such that each series is plotted in its own frame. Up to four series, the frames are displayed in one column, for more series the frames are arranged in a two colum column display. \noindent \emph{Two Column Multiple Plots} handel the case of more than four \texttt{timeSeries} objects. Then the the series are displayed in two colums. In total, the number of rows is not restricted. % ---------------------------------------------------------------------------- \pagebreak \subsection{Univariate Single Plots} The most simple time series plot shows an univariate curve in a single plot. The axis is designed from "pretty" positions calculated from R's base function \texttt{pretty}. The labels are printed in the ISO 8601 standard date/time format. <>= par(mfrow=c(1, 1)) plot(tS1) @ \medskip \begin{center} \begin{figure}[h] <>= <> @ \caption{The chart shows an univariate time series (here the Swiss Bond Index) in a single frame. For all plot options default values have been chosen. You can decorate the plot, making it more conveniant to your needs, e.g.: change the color (col), add a main title and x-label calling the function \texttt{title}, or remove the grid lines setting the argument \texttt{grid=FALSE}. You can also design the minor tick marks, setting instead of the value \texttt{"auto"} oe of the following spreads: \texttt{"day"}, the default, \texttt{"week"}, or \texttt{"month"}. } \end{figure} \end{center} % ---------------------------------------------------------------------------- \pagebreak \subsection*{} Two other plot function implementations for \texttt{xts} time series objects can be found in the contributesd R packages \texttt{xts} and \texttt{PerformanceAnalytics}. Let us compare how they generate plot positions and time label formats. \vspace{-0.3cm} <>= require(PerformanceAnalytics) par(mfrow=c(3, 1)) xts::plot.xts(as.xts(tS1)) PerformanceAnalytics::chart.TimeSeries(as.xts(tS1)) plot(tS1) @ \medskip \begin{center} \begin{figure}[h] <>= <> @ \caption{The group of the three charts shows an univariate time series in a single frame for the plot functions as implemented in the packages \texttt{xts}, \texttt{PerformanceAnalytics}, and \texttt{timeSeries}. For example in the case of daily time series records \texttt{xts} uses U.S. style labels whereas \texttt{PerformanceAnalytics} and \texttt{timeSeries} use ISO standard date labels \texttt{YYYY-mm-dd}. The plot decorations are those from default settings.} \end{figure} \end{center} % ----------------------------------------------------------------------------- \pagebreak \subsection{Multivariate Single Plots} Multivariate time series plots in a single panel are constructed by default in the way that the first curve is plotted calling the function \texttt{plot} and the remaining curves by calling the function \texttt{lines}. <>= par(mfrow=c(1, 1)) plot(tS3, plot.type="s") @ \medskip \begin{center} \begin{figure}[h] <>= <> @ \caption{This chart shows a multivariate time series in a single frame. Note, we have to set the argument \texttt{plot.type="s"}. Again, for all plot options the default settings have been used. You can decorate the plot, making it more conveniant to your needs, e.g.: change the color vector (col), add a main title and x-label calling the function \texttt{title}, or remove grid lines setting the argument \texttt{grid=FALSE}. Note, to change the color settings you can set the argument \texttt{col=1:3} which would result in "black", "red", "green" for the three curves, or you can just set the colors by name, or selecting them from a color palette.} \end{figure} \end{center} % ----------------------------------------------------------------------------- \pagebreak \subsection*{} Now let us compare the plot function from the \texttt{timeSeries} package with the \texttt{chart.TimeSeries} plotting function from the \texttt{PerformanceAnalytics} function. (Note, the \texttt(xts) has no multivariate plot function implemented.) <>= par(mfrow=c(2, 1)) require(PerformanceAnalytics) PerformanceAnalytics::chart.TimeSeries(as.xts(tS3)) plot(tS3, plot.type="s") @ \medskip \begin{center} \begin{figure}[h] <>= <> @ \caption{The two charts show a multivariate time series plotted in a single frame. We use for the plot the functions as implemented in the packages \texttt{PerformanceAnalytics}, and \texttt{timeSeries}.} \end{figure} \end{center} % ----------------------------------------------------------------------------- \pagebreak \subsection{Multiple Plots} Multiple plots enormously simplify the display of different curves in multiple panels. These are the ideal plots when it comes to the task to create a quick overview over several time series. Multiple plotting is exclusive to \texttt{timeSeries} objects, \texttt(xts) and \texttt{PerformanceAnalytics} offer no multiple plotting tool. <>= par(mfrow=c(1, 1)) plot(tS3, plot.type="m") @ \begin{center} \begin{figure}[h] <>= <> @ \caption{As long as we plot less than 4 time series in a multivariate frame, we get a one column layout. Annotations show by default only the y-labels which are taken from the colmun names of the time series to be drawn. Feel free to add main title, sub title, and x-label calling the function \texttt{title}}. \end{figure} \end{center} % ----------------------------------------------------------------------------- \pagebreak \subsection*{} For more than four curves the frames of the plot design are arranged in two columns. <>= par(mfrow=c(1, 1)) plot(tS6, plot.type="m") @ \medskip \begin{center} \begin{figure}[h] <>= <> @ \caption{The graph shows the layout how it is created for six curves. There are two columns with three panels to the left and also three panels to the right. Note, it is easily possible to adapt the margin sizes and the gap between the two columns of plots calling the function \texttt{mar} and \texttt{oma}.} \end{figure} \end{center} % ----------------------------------------------------------------------------- \pagebreak \subsection*{} If you like a design with a small gap between the panel rows, you can modify the \texttt{mar} parameter to introduce a small gap, here with a width of 0.3. Feel free to modify it. <>= par(mfrow=c(1, 1)) plot(tS3, plot.type="m", mar=c(gap=0.3, 5.1, gap=0.3, 2.1)) @ \medskip \begin{center} \begin{figure}[h] <>= <> @ \caption{One can use in a multiple plot the \texttt{mar} parameter setting to create a small gap between the rows of the individual charts. This lets a plot look more elegant.} \end{figure} \end{center} % ----------------------------------------------------------------------------- \pagebreak \subsection{Combining Single Plots} You can also create your own multiple panel plots. Just combine single panels in an array of rows and columns using the parameter settings for \texttt{mfrow}, \texttt{mfcol}, and \texttt{mar}. <>= par(mfrow=c(2, 1)) par(mar = c(bottom=1.5, 5.1, top=4, 2.1)) plot(tS2[, 1]) par(mar = c(bottom=4, 5.1, top=1.5, 2.1)) plot(tS2[, 2]) @ \begin{center} \begin{figure}[h] <>= <> @ \caption{One can use in single plots the \texttt{mfrow} and \texttt{mar} parameter settings to place single plots either row by row or column by column. Here, \texttt{mfrow} and \texttt{mfcol} to the job. In this case a vector of the form \texttt{c(nr, nc)} draws subsequent figures in an nr-by-nc array on the device by columns (mfcol) or rows (mfrow), respectively.} \end{figure} \end{center} % ----------------------------------------------------------------------------- \pagebreak \subsection{Layout of Single Plots} There is another option in R to create panel layouts, not necessarilly in an rectangular array. Have a look to the help page of the function \texttt{layout}, her comes a simple example. <>= nf <- layout(mat=matrix(c(1, 1, 2, 3), byrow = TRUE, nrow=2)) par(mar = c(bottom=2, 5.1, top=3, 2.1)) plot(tS3[, 1]) par(mar = c(bottom=3, 5.1, top=2, 1.1)) plot(tS3[, 2]) par(mar = c(bottom=3, 4.1, top=2, 2.1)) plot(tS3[, 3]) @ \medskip \begin{center} \begin{figure}[h] <>= <> @ \caption{With the function \texttt{layout} you can devide the plot device in rows and columns expressed in matrix form defined by the argument \texttt{mat}. } \end{figure} \end{center} %To be more specific, the graph \texttt{i} is allocated a region composed %from a subset of these rows and columns, based on the rows and columns %in which \texttt{i} occurs in the matrix \texttt{mat}. %The argument \texttt{layout.show(n)} plots (part of) the current layout, %namely the outlines of the next \texttt{n} figures. % ----------------------------------------------------------------------------- \pagebreak \subsection*{} In addition widths and heights of the layout can be different from row to row, and/or from column to column. The sizes are expressed by the arguments \texttt{widths} and \texttt{heights} of the function \texttt{layout}. <>= nf <- layout(mat=matrix(c(1, 1, 2, 3), byrow=TRUE, nrow=2), heights=c(2.5,1)) par(mar = c(bottom=2, 5.1, top=3, 2.1)) plot(tS3[, 1]) par(mar = c(bottom=3, 5.1, top=1.5, 1.1)) plot(tS3[, 2]) par(mar = c(bottom=3, 4.1, top=1.5, 2.1)) plot(tS3[, 3]) @ \begin{center} \begin{figure}[h] <>= <> @ \caption{With the function \texttt{layout} one can also define the widths and heights of the columns and rows.} \end{figure} \end{center} % ----------------------------------------------------------------------------- \pagebreak \subsection{Bivariate Scatter Plots} For historical reasons, like in the function \texttt{plot.ts}, there is also the option to create an scatter plot from two univariaye time series. Since this is not a "true" time series plot, we will not go in further detail for this display. <>= par(mfrow=c(1,1)) plot(tS2[, 1], tS2[, 2]) @ \begin{center} \begin{figure}[h] <>= <> @ \caption{If \texttt(x) and \texttt(y) are univariate time series, then the plot function will display a scatter plot.} \end{figure} \end{center} % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % 3 \newpage\thispagestyle{empty}\mbox{} \newpage\thispagestyle{empty}\mbox{} \pagebreak \section{Time Axis Layout} The function \texttt{plot} comes with three options to design the time axis layout: \texttt{"pretty"}, \texttt{"chic"}, and \emph{} (note this not a string argument. \emph{} should just abbreviate that we have to input character strings of fully arbitray \texttt{at} positions. For the first two options the style of the axis annotation is generated in a fully automated way, whereas in the tailored case each tick on the axis to be user defined. \noindent The \emph{"pretty"} time axis layout is the default setting for the argument \texttt{at}. Internally the function \texttt{pretty} is used to compute a sequence of about \texttt{n+1} equally spaced round values which cover the range of the values in the time stamps \texttt{time(x)} of the series \texttt{x}. The values are chosen so that they are 1, 2 or 5 times a power of 10. \noindent The \emph{"chic"} time axis layout is the alternative setting for the argument \texttt{at}. Internally the function \texttt{axTicksByTime} from the package \texttt{xts} is used to compute the sequence of axis positions and the format labels. \noindent The \emph{} time axis layout leaves it to the user to specify by himself the positions (at), the time label formatting (format), and the minor tick marks (minor.ticks). % ----------------------------------------------------------------------------- \pagebreak \subsection{Time Axis: "pretty" or "chic"?} Our plotting function comes with two axis-styles. The first is called \texttt{"pretty"}, which is the default style, and calculates positions from R's base function \texttt{pretty}. The other is called \texttt{"chic"} to remember its origin, arising from the "Chicago" \texttt{xts} package. \vspace{-0.7cm} <>= par(mfcol = c(2, 1)) plot(tS1, at = "pretty") plot(tS1, at = "chic") @ \vspace{-0.3cm} \begin{center} \begin{figure}[h] <>= <> @ \caption{The graph shows the two flavours from the \texttt{at="pretty"} and the \texttt{"chic"} axis designs. The first style uses the function \texttt{pretty} from R's \texttt{base} environment to compute the positions for the major ticks. The second style uses the function \texttt{axTicksByTime} from the \texttt{xts} package to compute x-axis tick mark locations by time. In the upper graph the minor ticks are calendar days, whereas in the lower graph weekdays are drawn (therefore the small gaps between the minor ticks become visible). Note, the time series is in both cases an object of class \texttt{timeSeries}.} \end{figure} \end{center} % ----------------------------------------------------------------------------- \pagebreak \subsection*{} Now let us plot a multivariate 3-column time series in a single panel. Again we compare the outcome of the \texttt{"pretty"} and the \texttt{"chic"} axis style. <>= par(mfcol=c(2, 1)) plot(tS3, plot.type="s", at="pretty") plot(tS3, plot.type="s", at="chic") @ \medskip \begin{center} \begin{figure}[h] <>= <> @ \caption{The only difference of this graph compared to the previous is the fact that we consider here a multivariate time series. Three curves are shown in a common plot. Note, when using the \texttt{"chic"} style, then the vertical gridlines are narrower compared to the \texttt{"pretty"} style.} \end{figure} \end{center} % ----------------------------------------------------------------------------- \pagebreak \subsection{Time Axis - Selecting Minor Tick Marks} The \texttt{"pretty"} style allows to draw the minor tick marks on different time scales. These are: \texttt{"day"}, \texttt{"week"}, and \texttt{"month"}. <>= par(mfrow=c(3, 1)) plot(tS1, minor.ticks="day", at="pretty") plot(tS1, minor.ticks="week", at="pretty") plot(tS1, minor.ticks="month", at="pretty") @ \medskip \begin{center} \begin{figure}[h] <>= <> @ \caption{It is worth to note that a good selection of minor tick marks makes a plot much better readable.} \end{figure} \end{center} % ----------------------------------------------------------------------------- \pagebreak \subsection{Time Axis - One Column Multiple Plot Layout} In the multiple plot layout the axis are drawn along the same principles as they are drawn in the case of the single plot layout. <>= par(mfrow=c(1, 1)) plot(tS3, plot.type="m", at="pretty") @ \medskip \begin{center} \begin{figure}[h] <>= <> @ \caption{This graph shows a one column multiple plot layout. The one column layout is generated for up to four time series. When the multivariate time series has more then four time series then a two column layout is displayed. It is up to you which axis style you prefer, \texttt{at="pretty"} or \texttt{at="chic".}} \end{figure} \end{center} % ----------------------------------------------------------------------------- \pagebreak \subsection{Time Axis - Two Column Multiple Plot Layout} Concerning the style of the axis, there is now difference between the one and two column plot designs. <>= par(mfrow=c(1, 1)) plot(tS6, plot.type="m", at="chic") @ \medskip \begin{center} \begin{figure}[h] <>= <> @ \caption{When we have more then four time series, then the display will be generated in two columns. Note, it is possible to modify the width of the gap between the two columns.} \end{figure} \end{center} % ----------------------------------------------------------------------------- \pagebreak \subsection{Tick and Format Layout: The axis style} The third alternative to style the axis offers the users to define format positions according to his preferences. Here comes an example: <>= par(mfrow=c(2, 1)) at <- paste0("200", c("6-01", "6-04", "6-07", "6-10", "7-01", "7-04"), "-01") plot(tS3, plot.type="s", format="%B\n%Y", at=at) plot(tS3, plot.type="s", format="%b/%y", at=at) @ \medskip \begin{center} \begin{figure}[h] <>= <> @ \caption{This graph shows plots with user tailored positions and formatted axis labels.} \end{figure} \end{center} % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % 4 \newpage\thispagestyle{empty}\mbox{} %\newpage\thispagestyle{empty}\mbox{} \pagebreak \section{Annotations} Plot annotations are elelents which can be added to plots or completely discarded. To discard all annotations you have to set \texttt{ann=FALSE} in the argument list of the timSeries \texttt{plot} function. To display annotation you can call the function \texttt{title}. This allows to add the main title, the sub title, and the x- and y-labels to a plot. Together with the appropriate character strings, you can also specify the placement of these annotations by the arguments \texttt{line} and \texttt{outer}. There are additional functions to add annotations to a plot. These are \texttt{text} and \texttt{mtext}. % ----------------------------------------------------------------------------- \pagebreak \subsection{Discarding all Annotations} In a default plot we display only the value-label(s) which are taken from the units or column names of the time time series object. Title, sub title, and time-label are not shown. To discard the appearance of all annotations on a plot you have to set the plot argument \texttt{ann=FALSE}. <>= par(mfrow=c(2, 2)) plot(tS1, ann=FALSE) plot(tS3, plot.type="s", ann=FALSE, at="pretty") plot(tS6, plot.type="s", ann=FALSE, at="pretty") @ \begin{center} \begin{figure}[h] <>= <> @ \caption{This graph shows a plot where all annotations have been discarded. Now feel free to add your own annotations.} \end{figure} \end{center} % ----------------------------------------------------------------------------- \pagebreak \subsection{Adding Title and Labels} To add a main title, a sub, title, and x- and y-labels you can call the function \texttt{title}. <>= par(mfrow=c(2, 2)) plot(tS1); title(main = "Index") plot(tS3, plot.type="s"); title(main = "Index") plot(tS3, plot.type="s"); title(main = "Index", xlab = "Date") plot(tS6, plot.type="s"); title(main = "Index", xlab = "Date") @ \medskip \begin{center} \begin{figure}[h] <>= <> @ \caption{This graph displays in a two by two array four single plots. We have added title and x-lable annotations.} \end{figure} \end{center} % ----------------------------------------------------------------------------- \pagebreak \subsection{Changing Axis Font Size} Sometimes the axis font size may be considered as too small or too large. Then you can use the plot argument \texttt{cex.axis} to upsize or downsize the font. <>= par(mfrow=c(3, 1)) plot(tS3, at="chic", plot.type="s", cex.axis=0.75) plot(tS3, at="chic", plot.type="s", cex.axis=1.00) plot(tS3, at="chic", plot.type="s", cex.axis=1.25) @ \medskip \begin{center} \begin{figure}[h] <>= <> @ \caption{This is an example how to change the size of the axis labels relatively to its default value. The upper graph shows a font size decreased by 20\%, the lower graph a font size increased by 25\%. You can proceed in the same way when using the \texttt{"pretty"} axis style.} \end{figure} \end{center} % ----------------------------------------------------------------------------- \pagebreak \subsection{Flipping Value Axes} Flipping every second axis label in a multiple plot from left to rigth might be meaningful in the case when axis labels overwrite themselves. <>= par(mfrow=c(1, 1)) plot(tS3, plot.type="m", yax.flip = TRUE) @ \medskip \begin{center} \begin{figure}[h] <>= <> @ \caption{The graph shows an one column multiple plot, where the axis of the middle panel is flipped from the left to the right. Note, the same procedure can also be applied two two column multiple plots.} \end{figure} \end{center} % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % 5 \newpage\thispagestyle{empty}\mbox{} %\newpage\thispagestyle{empty}\mbox{} \pagebreak \section{Decorations} There exist several options to decorate plots in different ways. Plot types (lines, points, horizontal bars, etc.) can be modified, colors can be changed, lines can be modified by style and seize, points can be selected by symbol and size. \noindent In the following we will give some examples \begin{itemize} \item Modifying Types \item Changing Colors by Names \item Changing Colors by Color Palettes \item Changing Line Styles \item Modifying Line Widths \item Changing Plot Symbols \item Modifying Plot Symbol Sizes \item Discarding Grid Lines \item Drawing a Box \end{itemize} \noindent to show a few of the many types of cdecorations. Play around to achieve your perfect layout. % ----------------------------------------------------------------------------- \pagebreak \subsection{Modifying Types} <>= par(mfrow=c(1, 1)) plot(tS3, plot.type="m", type=c("l", "p", "h"), at="pretty") @ \medskip \begin{center} \begin{figure}[h] <>= <> @ \caption{If we like to consider in a multiple plot for each panel its own plot style then we can set the parameter \texttt{type}.} \end{figure} \end{center} % ----------------------------------------------------------------------------- \pagebreak \subsection{Changing Colors by Names} Colors can be changed in several ways. Just by their numbers, e.g. 1 (black), 2 (red), 3 (green) etc., or by name, e.g. "black", "red", "green", etc. or by using well designed color palettes. <>= par(mfrow=c(1, 1)) plot(tS3, plot.type="m", col=c("blue", "orange", "darkgreen")) @ \medskip \begin{center} \begin{figure}[h] <>= <> @ \caption{This graph shows how to assign colors by name in the case of a multiple plot. You can do it in the same way setting \texttt{plot.type="s"} if you like to display all three curves in a common single plot.} \end{figure} \end{center} % ----------------------------------------------------------------------------- \pagebreak \subsection{Changing Colors by Color Palettes} When the number of curves increases, then it can become quite difficult to find a set of nice colors. In such cases it is convenient to select the colors from color palettes. <>= par(mfrow=c(1, 1)) plot(tS6, plot.type="s", col=heat.colors(n=6, alpha = 1), at="chic", format = "%B\n%Y") @ \medskip \begin{center} \begin{figure}[h] <>= <> @ \caption{This graph shows an example of six curves diplayed in a sequence of reds. For this we called the function \texttt{seqPalette}.} \end{figure} \end{center} \pagebreak \begin{verbatim} FUNCTION: COLOUR PALETTE rainbowPalette Contiguous rainbow colour palette heatPalette Contiguous heat colour palette terrainPalette Contiguous terrain colour palette topoPalette Contiguous topo colour palette cmPalette Contiguous cm colour palette greyPalette R's gamma-corrected gray palette timPalette Tim's MATLAB-like colour palette rampPalette Colour ramp palettes seqPalette Sequential colour brewer palettes divPalette Diverging colour brewer palettes qualiPalette Qualified colour brewer palettes focusPalette Red, green and blue focus palettes monoPalette Red, green and blue mono palettes \end{verbatim} % ----------------------------------------------------------------------------- \pagebreak \subsection{Changing Line Styles} In multiple plot to each curve an own line style \texttt{lty} can be assigned: 0 "blank", 1 "solid", 2 "dashed", 3 "dotted", 4 "dotdash", 5 "longdash", or 6 "twodash". <>= par(mfrow=c(1, 1)) plot(tS3, plot.type="m", col=1, lty=1:3, at="chic") @ \medskip \begin{center} \begin{figure}[h] <>= <> @ \caption{When we like to print plots in black and white, then its makes much sense to use different line types so that we can distinguish the curves one from each other.} \end{figure} \end{center} % ----------------------------------------------------------------------------- \pagebreak \subsection{Modifying Line Widths} Not only the line type, but also the line width can be modified for each curve in an individual kind. <>= par(mfrow=c(1, 1)) plot(tS3, plot.type="m", col=1, lwd=3:1, at="chic") @ \medskip \begin{center} \begin{figure}[h] <>= <> @ \caption{The graph shows three line widths, the upper's curve width is thick, the middle's curve width is medium, and the lowest's curve width is the thinnest one.} \end{figure} \end{center} % ----------------------------------------------------------------------------- \pagebreak \subsection{Changing Plot Symbols} To use different plot symbols we can assign them by the parameter \texttt{pch}. Don't forget also to set \texttt{type="p"}. %<>= %par(mfrow=c(1, 1)) %tS3weekly <- align(tS3, by="1w") %plot(tS3weekly, plot.type="s", type="p", col=1:3, pch=21:23, at="chic") %@ \medskip %\begin{center} %\begin{figure}[h] %<>= %<> %@ %\caption{This plot shows how to assign different plot symbols to the curves %in a single plot.} %\end{figure} %\end{center} % ----------------------------------------------------------------------------- \pagebreak \subsection{Modifying Plot Symbol Sizes} The argument \texttt{cex.pch} allows to increase or decrease plot symbol sizes with respect to the current plot symbol size. <>= par(mfrow=c(1, 1)) plot(tS3, plot.type="s", type="p", col=1:3, pch=21:23, cex.pch=c(0.2, 0.2, 0.2), at="pretty") @ \medskip \begin{center} \begin{figure}[h] <>= <> @ \caption{This plot show how to change the size of plot symbols in a single plot setting the argument \texttt{cex.pch}. Note, for each curve its own size can be set. The same approach can be used also for multiple plots.} \end{figure} \end{center} % ----------------------------------------------------------------------------- \pagebreak \subsection{Discarding Grid Lines} By default grid lines are displayed. To discard the grid lines from the plot set the arguments \texttt{grid=FALSE}. <>= par(mfrow=c(1, 1)) plot(tS3, plot.type="s", grid=FALSE) @ \medskip \begin{center} \begin{figure}[h] <>= <> @ \caption{By default a grid is drawn on top of the plot. You can remove it by setting the argument \texttt{grid=FALSE}} \end{figure} \end{center} % ----------------------------------------------------------------------------- \pagebreak \subsection{Drawing a Box} <>= par(mfrow=c(1, 1)) plot(tS3, plot.type="s", frame.plot=FALSE, grid=FALSE) box() box(bty = "7", col = "white") # boxL grid(NA, NULL, col = "darkgrey") # hgrid @ \medskip \begin{center} \begin{figure}[h] <>= <> @ \caption{By default the plots are displayed as frame plots. This means that the graphs are surrounded by a box. This box can be discarded setting the plot argument \texttt{frame.plot=FALSE}.} \end{figure} \end{center} % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % 6 \newpage\thispagestyle{empty}\mbox{} %\newpage\thispagestyle{empty}\mbox{} \pagebreak \section{The Panel Function} Multiple plots are very powerful plotting designs. Each panel in a graph can individually tailored by the user. By default each curve in a panel is generated by the function \texttt{lines}. You can define your own panel function(s) by setting the plot argument \texttt{panel} to a user dfined functions. In the following we will show three examples. % ----------------------------------------------------------------------------- \pagebreak \subsection{Adding a Horizental Zero Line} In this example we show how to write a panel function which allows to add a horizontal zero line to each plot panel. <>= par(mfrow=c(1, 1)) lines2 <- function(X, Y, type, xlab, ylab, col, pch, lty, lwd, cex) { lines(x=X, y=Y, col=col) abline(h=0, col = "brown", lwd=2)} plot(returns(tS3), plot.type="m", col = .colorwheelPalette(3), panel=lines2, at="pretty") @ \begin{center} \begin{figure}[h] <>= <> @ \caption{This multiple plot shows panels with curves having a horizontal zero reference line.} \end{figure} \end{center} % ----------------------------------------------------------------------------- \pagebreak \subsection{Adding an Rug to Multiple Return Plots} This example shows how to add in each panel rugs to the righ Y-axis. <>= par(mfrow=c(1, 1)) lines2 <- function(X, Y, type, xlab, ylab, col, pch, lty, lwd, cex) { lines(x=X, y=Y, type="h", col=col) rug(Y, side=4, col="steelblue") } plot(returns(tS6), plot.type="m", col = .colorwheelPalette(6), panel=lines2, at="pretty") @ \begin{center} \begin{figure}[h] <>= <> @ \caption{This multiple plot shows panels with rugs on the right Y-axis.} \end{figure} \end{center} % ----------------------------------------------------------------------------- \pagebreak \subsection{Adding an EMA to Multiple Index Plots} This example shows how to add an EMA indicator to each plot panel. The \texttt{emaTA()} function is provided by the \texttt{fTrading} package. <>= par(mfrow=c(1, 1)) lines2 <- function(X, Y, type, xlab, ylab, col, pch, lty, lwd, cex) { lines(x=X, y=Y, type="l", col=col) lines(x=X, y=emaTA(Y), col="black") } plot(tS3, plot.type="m", col = .colorwheelPalette(3), panel=lines2, grid=TRUE, at="pretty") @ \begin{center} \begin{figure}[h] <>= <> @ \caption{A multiple graph with EMA indicators in each panel.} \end{figure} \end{center} % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % 7 \newpage\thispagestyle{empty}\mbox{} \newpage\thispagestyle{empty}\mbox{} \pagebreak \section{Conclusions} The \texttt{plot} function in the \texttt{timeSeries} package is a very powerful tool to create plots from time series objects. This includes to display univariate and multivariate time series in single and multiple panels, to select from two styles for the time-axis or even to tailor positions and formats according to his own needs, and to modifiy annotations and decorations of plots. % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % 8 \newpage\thispagestyle{empty}\mbox{} \pagebreak \section{Appendix} In the appendix we have summarized graphs and tables which are useful tools to create plots. We have reprinted the default color table from R, we have summarized several color palettes as available in the \texttt{fBasics} package and other contributed R packages, and two tables with font characters and plot symbols. % ----------------------------------------------------------------------------- \pagebreak \subsection{Margins: mar and oma} <>= # Plot: # - oma stands for 'Outer Margin Area' # - mar represents the 'figure Margins' # - The default size is c(5,4,4,2) + 0.1 # - The axes tick marks will go in the first lines par(mfrow=c(1, 1)) par(oma=c(3,3,3,3)) # all sides have 3 lines of space par(mar=c(5,4,4,2) + 0.1) plot(x=1:10, y=1:10, type="n", xlab="X", ylab="Y") # Add Text tot the Plot Part - red text(5,5, "Plot", col="red", cex=2) text(5,4, "text(5,5, \"Plot\", col=\"red\", cex=2)", col="red", cex=1) box("plot", col="red", lwd=2) # Add text to thebThe Figure Part - grey mtext("Margins", side=3, line=2, cex=1.5, col="grey") mtext("par(mar=c(5,4,4,2) + 0.1)", side=3, line=1, cex=1, col="grey") mtext("Line 0", side=3, line=0, adj=1.0, cex=1, col="grey") mtext(" 1", side=3, line=1, adj=1.0, cex=1, col="grey") mtext("Line 2", side=3, line=2, adj=1.0, cex=1, col="grey") mtext("Line 3", side=3, line=3, adj=1.0, cex=1, col="grey") mtext("Line 0", side=2, line=0, adj=1.0, cex=1, col="grey") mtext("Line 1", side=2, line=1, adj=1.0, cex=1, col="grey") mtext("Line 2", side=2, line=2, adj=1.0, cex=1, col="grey") mtext("Line 3", side=2, line=3, adj=1.0, cex=1, col="grey") box("figure", col="grey") # The title will fit in the third line on the top of the graph. title("Ttitle - Third Line") # Note 'outer=TRUE' moves us from the figure to the outer margins. mtext("Outer Margin Area", side=1, line=1, cex=1.8, col="brown", outer=TRUE) mtext("par(oma=c(3,3,3,3))", side=1, line=2, cex=1, col="orange", outer=TRUE) mtext("Line 0", side=1, line=0, adj=0.0, cex=0.8, col="orange", outer=TRUE) mtext("Line 1", side=1, line=1, adj=0.0, cex=1, col="orange", outer=TRUE) mtext("Line 2", side=1, line=2, adj=0.0, cex=1, col="orange", outer=TRUE) box("outer", col="orange") @ \pagebreak \subsection*{} \begin{center} <>= <> @ \end{center} % ----------------------------------------------------------------------------- \pagebreak \subsection{Character Table} \begin{center} \begin{figure}[h] \includegraphics[width=\textwidth]{characterTableFig.pdf} \end{figure} \end{center} % ----------------------------------------------------------------------------- \pagebreak \subsection{Color Table} \begin{center} \begin{figure}[h] \includegraphics[width=\textwidth]{colorTableFig.pdf} \end{figure} \end{center} % ----------------------------------------------------------------------------- \pagebreak \subsection{Color Palettes I} \medskip \begin{center} \begin{figure}[h] \includegraphics[width=\textwidth]{colorPalettes1Fig.pdf} \end{figure} \end{center} \pagebreak \subsection{Color Palettes II} \medskip \begin{center} \begin{figure}[h] \includegraphics[width=\textwidth]{colorPalettes2Fig.pdf} \end{figure} \end{center} % ----------------------------------------------------------------------------- \pagebreak \subsection{Symbol Table} \begin{center} \begin{figure}[h] \includegraphics[width=\textwidth]{symbolTableFig.pdf} \end{figure} \end{center} % ----------------------------------------------------------------------------- \pagebreak \subsection{Axis Style "pretty"} <>= FORMAT <- tS1@format FORMAT POSITIONS <- pretty(tS1) POSITIONS LABELS <- pretty(tS1) LABELS @ % ----------------------------------------------------------------------------- \pagebreak \subsection{Axis Style "chic"} <>= axTicksByTime <- function (x, ticks.on = "auto", k = 1, labels = TRUE, format.labels = TRUE, ends = TRUE, gt = 2, lt = 30) { if (timeBased(x)) x <- xts(rep(1, length(x)), x) tick.opts <- c("years", "months", "weeks", "days", "hours", "minutes", "seconds") tick.k.opts <- c(10, 5, 2, 1, 6, 1, 1, 1, 4, 2, 1, 30, 15, 1, 1) if (ticks.on %in% tick.opts) { cl <- ticks.on[1] ck <- k } else { tick.opts <- paste(rep(tick.opts, c(4, 2, 1, 1, 3, 3, 1)), tick.k.opts) is <- structure(rep(0, length(tick.opts)), .Names = tick.opts) for (i in 1:length(tick.opts)) { y <- strsplit(tick.opts[i], " ")[[1]] ep <- endpoints(x, y[1], as.numeric(y[2])) is[i] <- length(ep) - 1 if (is[i] > lt) break } nms <- rev(names(is)[which(is > gt & is < lt)])[1] cl <- strsplit(nms, " ")[[1]][1] ck <- as.numeric(strsplit(nms, " ")[[1]][2]) } if (is.null(cl)) ep <- NULL else ep <- endpoints(x, cl, ck) if (ends) ep <- ep + c(rep(1, length(ep) - 1), 0) if (labels) { if (is.logical(format.labels) || is.character(format.labels)) { unix <- ifelse(.Platform$OS.type == "unix", TRUE, FALSE) time.scale <- periodicity(x)$scale fmt <- ifelse(unix, "%n%b%n%Y", "%b %Y") if (time.scale == "weekly" | time.scale == "daily") fmt <- ifelse(unix, "%b %d%n%Y", "%b %d %Y") if (time.scale == "minute" | time.scale == "hourly") fmt <- ifelse(unix, "%b %d%n%H:%M", "%b %d %H:%M") if (time.scale == "seconds") fmt <- ifelse(unix, "%b %d%n%H:%M:%S", "%b %d %H:%M:%S") if (is.character(format.labels)) fmt <- format.labels names(ep) <- format(index(x)[ep], fmt) } else { names(ep) <- as.character(index(x)[ep]) } ep } } @ <>= ticks <- axTicksByTime(as.xts(tS1)) ticks @ % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \pagebreak \section*{About the Authors} % ----------------------------------------------------------------------------- % Diethelm Wuertz \noindent\textbf{Diethelm W\"urtz} is professor at the Institute for Theoretical Physics, ITP, and for the Curriculum Computational Science and Engineering, CSE, at the Swiss Federal Institute of Technology in Zurich. He teaches Econophysics at ITP and supervises seminars in Financial Engineering. Diethelm is senior partner of Finance Online, an ETH spin-off company in Zurich, and co-founder of the Rmetrics Association in Zurich.\\ % ----------------------------------------------------------------------------- % Tobias Setz \noindent \textbf{Tobias Setz} has a Bachelor and Master in Computational Science from ETH in Zurich and has contributed with his Thesis projects on wavelet analytics and Bayesian change point analytics to this handbook. He is now a PhD student in the Econophysics group at ETH Zurich at the Institute for Theoretical Physics.\\ % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \pagebreak \section*{About Rmetrics} \noindent\emph{Rmetrics Open Source Project} With hundreds of functions built on modern methods, the Rmetrics open source software combines exploratory data analysis, statistical modelling and rapid model prototyping. The R/Rmetrics packages are embedded in R, building an environment which creates a first class system for applications in teaching statistics and finance. Rmetrics covers Time Series Econometrics, Hypothesis Testing, GARCH Modelling and Volatility Forecasting, Extreme Value Theory and Copulae, Pricing of Derivatives, Portfolio Analysis, Design and Optimization, and much more. \noindent\emph{The Rmetrics Association}\\ is a non-profit taking association working in the public interest. The Rmetrics Association provides support for innovations in financial computing. We believe that the Rmetrics Open Source software has become a valuable educational tool and that it is worth ensuring its continued development and the development of future innovations in software for statistical and computational research in finance. Rmetrics provides a reference point for individuals and institutions that want to support or interact with the Rmetrics development community. Rmetrics encourages students to participate in Rmetrics' activities in the context of Student Internships. \noindent\emph{Rmetrics Software Evalution}\\ If you like to get an impression of the size and quality of the Open Source Rmetrics Program have a look on the Ohloh Rmetrics Software Evaluation. The Evalutions gives an overview about the Software Development (Code Analysis, Estimated Cost), the people behind it, and its community. \noindent\emph{Contributions to Rmetrics}\\ are coming from several educuational institutions world wide. These include the Rmetrics web site and documentation project supported by ITP/CSE ETH Zurich, the organization of Summerschools and Workshops supported by ITP/CSE ETH Zurich, the R-sig-Finance Help and Mailing List, supported by SfS ETH Zurich, the R-forge development server, supported by University of Economics in Vienna, CRAN Test and Distribution Server for R software, supported by University of Economics Vienna, the Debian Linux integration supported by the Debian Association. Many thanks to all behind these projects who gave us continuous support over the last years.\\ \noindent Rmetrics Association\\ www.rmetrics.org % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \pagebreak % References \begin{thebibliography}{99} \bibitem{zoo} Achim Zeileis and Gabor Grothendieck (2005): \emph{ zoo: S3 Infrastructure for Regular and Irregular Time Series.} Journal of Statistical Software, 14(6), 1-27. URL http://www.jstatsoft.org/v14/i06/ \bibitem{tseries} Adrian Trapletti and Kurt Hornik (2007): \emph{tseries: Time Series Analysis and Computational Finance.} R package version 0.10-11. \bibitem{rmetrics} Diethelm W\"urtz et al. (2007): \emph{Rmetrics: Rmetrics - Financial Engineering and Computational Finance.} R package version 260.72. http://www.rmetrics.org \bibitem{ISO} International Organization for Standardization (2004): \emph{ISO 8601: Data elements and interchage formats --- Information interchange --- Representation of dates and time} URL http://www.iso.org \bibitem{R} R Development Core Team: \emph{R: A Language and Environment for Statistical Computing}, R Foundation for Statistical Computing, Vienna, Austria. ISBN 3-900051-07-0, URL http://www.R-project.org \bibitem{quantmod} Jeffrey A. Ryan (2008): \emph{quantmod: Quantitative Financial Modelling Framework.} R package version 0.3-5. URL http://www.quantmod.com URL http://r-forge.r-project.org/projects/quantmod \end{thebibliography} \end{document} timeSeries/inst/extensionsTests/0000755000176200001440000000000014322333073016562 5ustar liggesuserstimeSeries/inst/extensionsTests/xtsWrappers.R0000755000176200001440000002451014263246021021254 0ustar liggesusers require(xts) require(timeSeries) X <- cumulated(LPP2005REC)[, 1:3] for (i in 1:3) X[, i] <- 100*X[, i]/as.vector(X[1,i]) Data <- alignDailySeries(X) # add: startDate Index <- time(Data) # Generate time Series: x.tS <- timeSeries(data=Data, charvec=format(Index)) x.xts <- xts(x=Data, order.by=strptime(Index, format="%Y-%m-%d"), tzone="GMT") ############################################################################### # Class: class(x.xts) class(x.tS) # ----------------------------------------------------------------------------- # coredata # "coredata" methods for time series objects strip off the index/time # attributes and return only the observations. # xts/zoo: COREDATA <- zoo::coredata(x=x.xts) class(COREDATA) head(COREDATA) dimnames(COREDATA) # timeSeries: coredata2 <- function(x) methods::getDataPart(x) COREDATA <- coredata2(tS) class(COREDATA) head(COREDATA) dimnames(COREDATA) # timeSeries: SERIES <- series(tS) class(SERIES) head(SERIES) dimnames(SERIES) # Extractor Function # getDataPart # setDataPart # ----------------------------------------------------------------------------- # index # Generic functions for extracting the index of an object and replacing it. # xts/zoo: INDEX <- zoo::index(x=x.xts) class(INDEX) head(INDEX) # xts/zoo: TIME <- stats::time(x=x.xts) class(TIME) head(TIME) # xts/zoo: INDEX <- index(x=x.tS) class(INDEX) head(INDEX) TIME <- stats::time(x=x.tS) class(TIME) head(TIME) # Extractor Function: # getTime # setTime # ----------------------------------------------------------------------------- # indexClass # The specified value for indexClass<- must be a character string # containing one of the following: Date, POSIXct, chron, yearmon, # yearqtr or timeDate. indexClass(x.xts) tclass(x.xts) indexClass <- function(x) class(time(x)) tclass <- function(x) class(time(x)) class(x.tS) indexClass(x.tS) tclass(x.tS) # ----------------------------------------------------------------------------- # indexFormat # Functions to extract, replace, and format the class of the index of # an xts object. FORMAT <- indexFormat(x.xts) FORMAT indexFormat <- function(x) getSlot(x, "format") indexFormat(x.tS) indexFormat <- function(x) slot(x, "format") indexFormat(x.tS) indexFormat <- function(x) x.tS@format indexFormat(x.tS) # Extractor Function # getFormat # setFormat # ----------------------------------------------------------------------------- # indexTZ xts::indexTZ(x.xts) xts::tzone(x.xts) indexTZ <- function(x) getSlot(x.tS, "FinCenter") tzone(x.xts) getFinCenter(x.tS) x.tS@FinCenter getSlot(x.tS, "FinCenter") ############################################################################### # endpoints # extract index values of a given xts object corresponding to the last # observations given a period specified by on require(timeSeries) tD <- timeCurrentYear(2011) tM <- timeCalendar(2011) ############################################################################### # aggregate: # from stats Package: The function aggregate splits the data into subsets, # computes summary statistics for each, and returns the result in a # convenient form. # AGGREGATION OVER NON-OVEWRLAPPING PERIODS # starting point: aligned daily Data # Aggregation Statistics: open <- function(x) as.vector(x)[1] close <- function(x) rev(as.vector(x))[1] high <- function(x) max(x) low <- function(x) min(x) spread <- function(x) max(x) - min(x) # Aggregation Levels: # weekly/biweekly: endOfWeek, onTuesdays, lastBusinessDay # monthly: endOMonth, lastFriday, lastBusinessDay # quarterly: 3-monthly # half-annually: 6-monthly # yearly: 12-monthly # timeSeries: Weekly - end of week tD <- time(x.tS) tD <- tD[dayOfWeek(tD) == "Fri"] by <- timeSequence(from=start(tD), to=end(tD), by = "week") endOfWeek <- aggregate(x.tS, by, mean) endOfWeek # timeSeries: Weekly on Tuesdays tD <- time(x.tS[-(1:5), ]) by <- timeSequence(from=start(tD), to=end(tD), by = "week") tuesdays.period <- aggregate(x.tS, by, last) dayOfWeek(time(tuesdays.period)) cbind( open=aggregate(x.tS[, 1], by, open), high=aggregate(x.tS[, 1], by, high), low=aggregate(x.tS[, 1], by, low), close=aggregate(x.tS[, 1], by, close)) period1 <- as.timeSeries(period1) cbind(period1, period2, period3) # Aggregate to Last Friday of Month - tD <- timeSequence(from=start(tD), to=end(tD), by = "week") by <- unique(timeLastNdayInMonth(tD, nday=5)) aggregate(x.tS, by, mean) # Aggregate to Last Day of Quarter - by <- unique(timeLastDayInQuarter(tD)) aggregate(x.tS, by, mean) # ----------------------------------------------------------------------------- # rolling 52-weekly-highs and lows # xts: Mean on weekly Periods ep <- xts::endpoints(x.xts, on='weeks', k=1) by1 <- index(x.xts)[ep[-1]] period1 <- xts::period.apply(x.xts, INDEX=ep, FUN=mean) ############################################################################### # xts::apply.monthly FUN <- mean x <- x.xts apply.daily(x, FUN) apply.weekly(x, FUN) apply.monthly(x, FUN) apply.quarterly(x, FUN) apply.yearly(x, FUN) # timeDate::align FUN <- mean x <- unique(time(x.tS)) alignDaily(x, include.weekends=FALSE) by1 <- unique(alignMonthly(x, include.weekends=FALSE)) x1 <- timeSeries::aggregate(x.tS, by1, FUN) by2 <- unique(alignMonthly(x, include.weekends=TRUE)) x2 <- timeSeries::aggregate(x.tS, by2, FUN) by1 <- unique(alignQuarterly(x, include.weekends=FALSE)) x1 <- timeSeries::aggregate(x.tS, by1, FUN) by2 <- unique(alignQuarterly(x, include.weekends=TRUE)) x2 <- timeSeries::aggregate(x.tS, by2, FUN) cbind(x1,x2) ############################################################################### xts::first(x.xts) xts::last(x.xts) first2 <- function(x) x[start(x), ] last2 <- function(x) x[end(x), ] first2(x.tS) last2(x.tS) # ----------------------------------------------------------------------------- INDEX <- seq(1, nrow(xts), by=21) INDEX .period.apply(tS, INDEX, FUN=max) .period.max <- function(x, INDEX, FUN=max) .period.apply(x, INDEX, max) .period.max(tS[, 1], INDEX) .period.min <- function(x, INDEX) .period.apply(x, INDEX, min) .period.min(tS[, 1], INDEX) xts::period.apply(xts[, 1], INDEX, FUN=max) xts::period.max(xts[, 1], INDEX) xts::period.min(xts[, 1], INDEX) xts::period.prod(xts[, 1], INDEX) xts::period.sum(xts[, 1], INDEX) # ----------------------------------------------------------------------------- # timeBased is.timeBased <- function (x) { if (!any(sapply(c( "Date", "POSIXt", "chron", "dates", "times", "timeDate", "yearmon", "yearqtr", "xtime"), function(xx) inherits(x, xx)))) { ans <- FALSE } else { ans <- TRUE } ans } timeBased <- function(x) { is.timeBased(x) } # ----------------------------------------------------------------------------- alignDaily(x=time(tS), include.weekends=FALSE) alignMonthly(x=time(tS), include.weekends=FALSE) # error alignQuarterly(x=time(tS), include.weekends=FALSE) # error tD <- Sys.timeDate() + 1:1000 timeDate::align(tD, by="10s") timeDate::align(tD, by="60s") timeDate::align(tD, by="10m") # error td <- as.xts(Sys.time()) + 1:1000 xts::align.time(td, n=10) # every 10 seconds xts::align.time(td, n=60) # align to next whole minute xts::align.time(td, n=10*60) # align to next whole 10 min interval xts::shift.time(td, n=10) xts::shift.time(td, n=60) xts::shift.time(td) # ----------------------------------------------------------------------------- xts::to.minutes(x,k,name,...) xts::to.minutes3(x,name,...) xts::to.minutes5(x,name,...) xts::to.minutes10(x,name,...) xts::to.minutes15(x,name,...) xts::to.minutes30(x,name,...) xts::to.hourly(x,name,...) xts::to.daily(x,drop.time=TRUE,name,...) xts::to.weekly(x,drop.time=TRUE,name,...) xts::to.monthly(x,indexAt='yearmon',drop.time=TRUE,name,...) xts::to.quarterly(x,indexAt='yearqtr',drop.time=TRUE,name,...) xts::to.yearly(x,drop.time=TRUE,name,...) xts::to.period( x, period = 'months', k = 1, indexAt, name=NULL, OHLC = TRUE, ...) # ----------------------------------------------------------------------------- # Convert an object to a specified periodicity lower than the given data # object. For example, convert a daily series to a monthly series, or a # monthly series to a yearly one, or a one minute series to an hourly # series. data(sample_matrix) xts <- as.xts(sample_matrix) # is daily to.weekly(xts) to.monthly(xts) to.quarterly(xts) to.yearly(xts) tS <- as.timeSeries(sample_matrix) % ----------------------------------------------------------------------------- as.numeric(as.POSIXct(time(tS))) getFinCenter(tS) indexTZ(xts, ) tzone(xts, ) tzone(xts) <- "GMT" .index(xts, ) indexClass(xts) class(time(tS)) % ----------------------------------------------------------------------------- .index <- function(x) as.numeric(as.POSIXct(time(x))) .indexDate <- function(x) .index(x)%/%86400L .indexday <- function(x) .index(x)%/%86400L .indexmday <- function(x) as.POSIXlt(.POSIXct(.index(x)))$mday .indexwday <- function(x) as.POSIXlt(.POSIXct(.index(x)))$wday .indexweek <- function(x) .indexmon <- function(x) .indexyday <- function(x) .indexyear <- function(x) .indexhour <- function(x) .indexmin <- function(x) .indexsec <- function(x) # Atoms # atoms # Roll over fixed periods of length k point by point ... # Functions borrowed from zoo timeSeries::rollMin( x, k, na.pad = FALSE, align = c("center", "left", "right"), ...) timeSeries::rollMax( x, k, na.pad = FALSE, align = c("center", "left", "right"), ...) timeSeries::rollMean( x, k, na.pad = FALSE, align = c("center", "left", "right"), ...) timeSeries::rollMedian( x, k, na.pad = FALSE, align = c("center", "left", "right"), ...) timeSeries::rollStats( x, k, FUN = mean, na.pad = FALSE, align = c("center", "left", "right"), ...) # Roll over Calendarical periods: rollDailySeries(x, period="7d", FUN, ...) rollMonthlySeries(x, period="12m", by="1m", FUN, ...) # e.g. rollQuarterlySeries(x, period="12m", by="3m", FUN) # e.g. rollYearlySeries rollMonthlyWindows(x, period="12m", by="1m") # apply # applySeries # period.apply # Apply a specified function to data over a given interval, where the # interval is taken to be the data from INDEX[k] to INDEX[k+1], for # k=1:(length(INDEX)-1). # ----------------------------------------------------------------------------- timeSeries/inst/extensionsTests/endpointsWrappers.R0000755000176200001440000001457114263246021022447 0ustar liggesusers require(timeSeries) ############################################################################### # FUNCTION: # timeNdayInWeek # timeLastBizdayInWeek # FUNCTION: # timeLastDayInMonth # timeLastNdayInMonth # timeLastBizdayInMonth # timeNthNdayInMonth # FUNCTION: # timeLastDayInQuarter # timeLastNdayInQuarter # timeLastBizdayInQuarter # timeNthNdayInQuarter ############################################################################### ############################################################################### # endpoints # extract index values of a given time Series object corresponding to # the last calendarical observation in the specified period require(timeSeries) # Daily and Monthly Series in 2011: tD <- timeCurrentYear(2011) tM <- timeCalendar(2011) ############################################################################### # Weekly Endpoints # ----------------------------------------------------------------------------- # On Given nDay of Week: timeNdayInWeek <- function(x, nday=5) { X <- align(x) DOW <- c("Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat") X[dayOfWeek(X) == DOW[nday+1], ] } LastDayInWeek <- timeNdayInWeek(tD) LastDayInWeek dayOfWeek(LastDayInWeek) # ----------------------------------------------------------------------------- # Last Bizday In Week: timeLastBizdayInWeek <- function(x, holidays=holidayNYSE) { # Extend time Sequence: x <- timeSequence( from = timeDate(x[1]), to = timeDate(x[length(x)]), by = "day") # Bizdays Function: FUN <- function(x, holidays = holidays) { holidays <- holidayNYSE() posix <- as.POSIXct(x, zone = "", origin = "1970-01-01") check <- isBizday(as.timeDate(posix), holidays = holidays, wday = 1:5) ans <- rev(x[check])[1] ans } # Create Periods from: by <- timeDayInWeek(x, nday=5) bySec <- as.numeric(by, "sec") xSec <- as.numeric(x, "sec") # Compute Index: INDEX <- findInterval(xSec, bySec + 1) INDEX <- INDEX + 1 is.na(INDEX) <- !(INDEX <= length(by)) dates <- matrix(apply(matrix(xSec, ncol=1), 2, tapply, INDEX, FUN), ncol=1) dates <- as.timeDate(as.POSIXct(dates, zone="GMT", origin="1970-01-01")) # Return Value: dates } LastNYBizdayInWeek <- timeLastBizdayInWeek(tD, holidays=holidayNYSE) LastNYBizdayInWeek dayOfWeek(LastNYBizdayInWeek) # Can we attribute the day of week? ans <- timeSeries( data = rnorm(length(LastBizdayInWeek)), charvec = timeLastBizdayInWeek(tD), recordIDs = data.frame(DOW=dayOfWeek(LastBizdayInWeek))) ############################################################################### # Monthly Endpoints # ----------------------------------------------------------------------------- # Last Calendar Day in Month: LastDayInMonth <- timeLastDayInMonth(tX, unique=TRUE) LastDayInMonth dayOfWeek(LastDayInMonth) # ----------------------------------------------------------------------------- # Last Friday in Month: LastFridayInMonth <- timeLastNdayInMonth(tX, nday=5, unique=TRUE) LastFridayInMonth dayOfWeek(LastFridayInMonth) # ----------------------------------------------------------------------------- # Last New-York Bizday in Month holidayNYSE(2011) LastNYBizdayInMonth <- timeLastBizdayInMonth(tD, holidays=holidayNYSE(), unique=TRUE) LastNYBizdayInMonth dayOfWeek(LastNYBizdayInMonth) # ----------------------------------------------------------------------------- # 2nd Tuesday in Month: SecondTuesdayInMonth <- timeNthNdayInMonth(tX, nth=2, nday=2, unique=TRUE) SecondTuesdayInMonth dayOfWeek(SecondTuesdayInMonth) ############################################################################### # Quarterly Endpoints # ----------------------------------------------------------------------------- # Last Day in Quarter: timeLastDayInQuarter <- function(charvec, format="%Y-%m-%d", zone="", FinCenter="", unique = FALSE) { # Description: # Returns Last Nday in Quarter ans <- timeLastDayInMonth(charvec, format, zone = "", FinCenter, unique) INDEX <- which ( atoms(ans)[, 2] %in% c(3, 6, 9, 12) ) ans[INDEX] } LastDayInQuarter <- timeLastDayInQuarter(tD, unique=TRUE) LastDayInQuarter dayOfWeek(LastDayInQuarter) # ----------------------------------------------------------------------------- # Last Friday in Quarter: timeLastNdayInQuarter <- function(charvec, nday = 1, format = "%Y-%m-%d", zone = "", FinCenter = "", unique = FALSE) { # Description: # Returns Last Nday first/mid/last inMonths of Quarters ans <- timeLastNdayInMonth(charvec, nday, format, zone, FinCenter,unique) INDEX <- which ( atoms(ans)[, 2] %in% c(3, 6, 9, 12) ) ans[INDEX] } LastFridayInQuarter <- timeLastNdayInQuarter(tD, nday=5, unique=TRUE) LastFridayInQuarter dayOfWeek(LastFridayInQuarter) # ----------------------------------------------------------------------------- # Last Bizday in Quarter: timeLastBizdayInQuarter <- function(charvec, holidays = holidayNYSE(), format = "%Y-%m-%d", zone = "", FinCenter = "", unique = FALSE) { ans <- timeLastBizdayInMonth(charvec, holidays, format, zone, FinCenter, unique) INDEX <- which ( atoms(ans)[, 2] %in% c(3, 6, 9, 12) ) ans[INDEX] } LastNYBizdayInQuarter <- timeLastBizdayInQuarter(tD, holidayNYSE(), unique=TRUE) LastNYBizdayInQuarter dayOfWeek(LastNYBizdayInQuarter) # ----------------------------------------------------------------------------- # nth-of Mar/Jun/Sep/Dec Nday in Quarter: timeNthNdayInQuarter <- function(charvec, nday = 1, nth = 1, inMonths = c(3, 6, 9, 12), format = "%Y-%m-%d", zone = "", FinCenter = "", unique = FALSE) { ans <- timeNthNdayInMonth(charvec, nday, nth, format, zone, FinCenter, unique) INDEX <- which ( atoms(ans)[, 2] %in% inMonths) ans[INDEX] } # 2nd Tuesday in (last) Months 3/6/9/12: SecondTuesdayInLastQuarterMonth <- timeNthNdayInQuarter(tD, nth=2, nday=2, unique=TRUE) SecondTuesdayInLastQuarterMonth dayOfWeek(SecondTuesdayInLastQuarterMonth) # 2nd Tuesday in (first) Months 1/4/7/10: SecondTuesdayInFirstQuarterMonth <- timeNthNdayInQuarter(tD, nth=2, nday=2, inMonths=c(1, 3, 7, 10), unique=TRUE) SecondTuesdayInFirstQuarterMonth dayOfWeek(SecondTuesdayInFirstQuarterMonth) # IMM Dates: # The dates are the third Wednesday of March, June, September and December datesIMM <- timeNthNdayInQuarter(tD, nth=3, nday=3, inMonths=c(3, 6, 9, 12), unique=TRUE) datesIMM dayOfWeek(datesIMM) ############################################################################### timeSeries/inst/extensionsTests/alignWrappers.R0000755000176200001440000001722514322333051021531 0ustar liggesusers # artificial 1 sec data with missing Data tX <- timeSequence("2014-03-07 00:00:00", "2014-03-07 23:59:59", by="sec") s <- sample(1:length(tX))[1:length(tX)/10] tX <- tX[-s] ############################################################################### # align # extract index values of a given xts object corresponding to the last # observations given a period specified by on require(timeSeries) # Random Seed: set.seed(1953) # Create a day of 1s time stamps: tX <- timeSequence("2014-03-07 09:03:17", "2014-03-07 15:53:16", by="sec") # Remove randomly 10% of the data: s <- sample(1:length(tX))[1:length(tX)/10] tX <- sort(tX[-s]) tS <- 201.7*cumulated(timeSeries(data=rnorm(length(tX))/(24*3600), charvec=tX)) plot(tS) head(tS) tZ <- align(tS, by="1min", method="fillNA", offset="42s") head(tZ) tZ <- align(tS, by="3min", method="fillNA", offset="162s") head(tZ) tZ <- align(tS, by="5min", method="fillNA", offset="102") head(tZ) tZ <- align(tS, by="15min", method="fillNA", offset="702s") head(tZ) tZ <- align(tS, by="30min", method="fillNA", offset="1602s") head(tZ) tZ <- align(tS, by="60min", method="fillNA", offset="3402") head(tZ) toPeriod <- function(x, by, method, offset="0s"") { open <- function(x) as.vector(x)[1] high <- function(x) max(x) low <- function(x) min(x) close <- function(x) rev(as.vector(x))[1] cbind( aggregate(SPI, by, open), aggregate(SPI, by, high), aggregate(SPI, by, low), aggregate(SPI, by, close)) } A1 <- timeSeries::align(tS, by="60min") A2 <- xts::to.period(as.xts(tS), period = "minutes", k = 2) open <- function(x) as.vector(x)[1] close <- function(x) rev(as.vector(x))[1] high <- function(x) max(x) low <- function(x) min(x) SPI <- tS[, "SPI"] by <- timeLastDayInMonth(time(tS)) OHLC <- cbind( aggregate(SPI, by, open), aggregate(SPI, by, high), aggregate(SPI, by, low), aggregate(SPI, by, close)) OHLC xts::to.minutes(x,k,name,...) xts::to.minutes3(x,name,...) xts::to.minutes5(x,name,...) xts::to.minutes10(x,name,...) xts::to.minutes15(x,name,...) xts::to.minutes30(x,name,...) xts::to.hourly(x,name,...) # ----------------------------------------------------------------------------- # Time alignment: alignDaily(x=time(tS), include.weekends=FALSE) alignMonthly(x=time(tS), include.weekends=FALSE) # error alignQuarterly(x=time(tS), include.weekends=FALSE) # error tD <- Sys.timeDate() + 1:1000 timeDate::align(tD, by="10s") timeDate::align(tD, by="60s") timeDate::align(tD, by="10m") # error td <- as.xts(Sys.time()) + 1:1000 xts::align.time(td, n=10) # every 10 seconds xts::align.time(td, n=60) # align to next whole minute xts::align.time(td, n=10*60) # align to next whole 10 min interval xts::shift.time(td, n=10) xts::shift.time(td, n=60) xts::shift.time(td) # ----------------------------------------------------------------------------- xts::to.daily(x,drop.time=TRUE,name,...) xts::to.weekly(x,drop.time=TRUE,name,...) xts::to.monthly(x,indexAt='yearmon',drop.time=TRUE,name,...) xts::to.quarterly(x,indexAt='yearqtr',drop.time=TRUE,name,...) xts::to.yearly(x,drop.time=TRUE,name,...) xts::to.period( x, period = 'months', k = 1, indexAt, name=NULL, OHLC = TRUE, ...) # ----------------------------------------------------------------------------- Convert an object to a specified periodicity lower than the given data object. For example, convert a daily series to a monthly series, or a monthly series to a yearly one, or a one minute series to an hourly series. data(sample_matrix) xts <- as.xts(sample_matrix) # is daily to.weekly(xts) to.monthly(xts) to.quarterly(xts) to.yearly(xts) tS <- as.timeSeries(sample_matrix) % ----------------------------------------------------------------------------- as.numeric(as.POSIXct(time(tS))) getFinCenter(tS) indexTZ(xts, ) tzone(xts, ) tzone(xts) <- "GMT" .index(xts, ) indexClass(xts) class(time(tS)) % ----------------------------------------------------------------------------- .index <- function(x) as.numeric(as.POSIXct(time(x))) .indexDate <- function(x) .index(x)%/%86400L .indexday <- function(x) .index(x)%/%86400L .indexmday <- function(x) as.POSIXlt(.POSIXct(.index(x)))$mday .indexwday <- function(x) as.POSIXlt(.POSIXct(.index(x)))$wday .indexweek <- function(x) .indexmon <- function(x) .indexyday <- function(x) .indexyear <- function(x) .indexhour <- function(x) .indexmin <- function(x) .indexsec <- function(x) atoms # Roll over fixed periods of length k point by point ... # Functions borrowed from zoo timeSeries::rollMin( x, k, na.pad = FALSE, align = c("center", "left", "right"), ...) timeSeries::rollMax( x, k, na.pad = FALSE, align = c("center", "left", "right"), ...) timeSeries::rollMean( x, k, na.pad = FALSE, align = c("center", "left", "right"), ...) timeSeries::rollMedian( x, k, na.pad = FALSE, align = c("center", "left", "right"), ...) timeSeries::rollStats( x, k, FUN = mean, na.pad = FALSE, align = c("center", "left", "right"), ...) # Roll over Calendarical periods: rollDailySeries(x, period="7d", FUN, ...) rollMonthlySeries(x, period="12m", by="1m", FUN, ...) # e.g. rollQuarterlySeries(x, period="12m", by="3m", FUN) # e.g. rollYearlySeries rollMonthlyWindows(x, period="12m", by="1m") apply applySeries # period.apply # Apply a specified function to data over a given interval, where the # interval is taken to be the data from INDEX[k] to INDEX[k+1], for # k=1:(length(INDEX)-1). x1 <- xts(matrix(1:(9*6),nc=6), order.by=as.Date(13000,origin="1970-01-01")+1:9) x2 <- x1 xtsAttributes(x1) <- list(series1="1") xtsAttributes(x2) <- list(series2="2") xtsAttributes(x1) xtsAttributes(x2) x3 <- x1+x2 xtsAttributes(x3) x33 <- cbind(x1, x2) xtsAttributes(x33) x33 <- rbind(x2, x1) xtsAttributes(x33) ############################################################################### appendList <- function (x, value) { stopifnot(is.list(x), is.list(value)) xnames <- names(x) for (v in names(value)) { x[[v]] <- if (v %in% xnames && is.list(x[[v]]) && is.list(value[[v]])) appendList(x[[v]], value[[v]]) else c(x[[v]], value[[v]]) } x } "setAttributes<-" <- function(obj, value) { stopifnot(is.list(value)) ATTRIBUTES <- getAttributes(obj) VALUE <- appendList(ATTRIBUTES, value) attr(obj@documentation, "Attributes") <- VALUE obj } getAttributes <- function(obj) { attr(obj@documentation, "Attributes") } obj1 <- dummyMonthlySeries() getAttributes(obj1) setAttributes(obj1) <- list(series="obj1") getAttributes(obj1) obj2 <- dummyMonthlySeries() getAttributes(obj2) setAttributes(obj2) <- list(series="obj2") getAttributes(obj2) getAttributes(obj1+obj2) # returns the attributes only for the first getAttributes(obj1-obj2) # returns the attributes only for the first getAttributes(cbind(obj1, obj2)) getAttributes(cbind(obj1, as.matrix(obj2))) # matrix fails getAttributes(rbind(obj1, obj2)) getAttributes(rbind(obj1, as.matrix(obj2))) # matrix fails getAttributes( rev(obj) ) getAttributes( obj[, 1] ) getAttributes( sample(obj) ) getAttributes( sort(sample(obj)) ) getAttributes( scale(obj) ) getAttributes( returns(obj) ) getAttributes( cumulated(returns(obj)) ) BIND(# Add another Attribute: ATTRIBUTES <- attr(obj@documentation, "Attributes") ATTRIBUTES ATTRIBUTES <- appendList(ATTRIBUTES, list(say="hello")) ATTRIBUTES attr(obj@documentation, "Attributes") <- ATTRIBUTES cbind(obj, obj, documentation = obj@documentation) # Documentation # Series: # dim(@.Data) # @units # @positions # @format # @FinCenter # @recordIDs # @title # @documentation # attributes(@documentation, "attributes) timeSeries/inst/extensionsTests/attributesExtension.R0000755000176200001440000002312714322333073023000 0ustar liggesusers # Enhancing the Documentation Slot # Series: # @.Data # @ positions # @ format # @ FinCenter # @ units # @ recordIDs # @ title # @ documentation # attributes(@documentation, "Attributes") # inspect the Information use # slotNames(object) # slot(object, name) # Load Library: require(timeSeries) ############################################################################### # Data obj1 <- timeSeries(rnorm(12), timeCalendar()) getAttributes(obj1) setAttributes(obj1) <- list(series=series(obj1)[1:6, , drop=FALSE]) getAttributes(obj1) obj2 <- timeSeries(rnorm(12), timeCalendar()) getAttributes(obj2) setAttributes(obj2) <- list(series=as.matrix(obj2)[7:12, , drop=FALSE]) getAttributes(obj2) ############################################################################### # Base Functions: # base-apply.R getAttributes( apply(obj1, 1, mean) ) # ok # base-applySeries.R # should be deprecated, use generic apply() and aggregate() functions # base-cbind.R cbind(obj1, obj2) getAttributes( cbind(obj1, obj2) ) # ok getAttributes( rbind(obj1, obj2) ) # ok # ... more base-cbind.R # cbind ... getAttributes(cbind(obj1, obj2)) # ok getAttributes(cbind(obj1, as.matrix(obj2))) # ok getAttributes(cbind(as.matrix(obj1), obj2)) # ok getAttributes(cbind(obj1)) # ok # rbind ... getAttributes(rbind(obj1, obj2)) # ok getAttributes(rbind(obj1, as.matrix(obj2))) # ok getAttributes(rbind(as.matrix(obj1), obj2)) # ok getAttributes(rbind(obj1)) # ok # base-diff.R getAttributes( diff(obj1) ) # ok # base-merge.R getAttributes( merge(obj1, obj2) ) # ok # base-rank.R getAttributes( rank(obj1) ) # ok # base-rev.R getAttributes( rev(obj1) ) # ok # base-sample.R getAttributes( sample(obj1) ) # ok # base-scale.R getAttributes( scale(obj1) ) # ok # base-sort.R getAttributes( sort(obj1) ) # ok ################################################################################ # Subsetting: # base-subsetting.R # .subset_timeSeries # .findIndex # $,timeSeries Subsets a time series by column names # $<-,timeSeries Replaces subset by column names # [,timeSeries Subsets a time series object # [<-,timeSeries Assigns value to subsets of a time series # Should work by dafault ... getAttributes( obj1[3:4, 1] ) # ok getAttributes( head(obj1) ) # ok getAttributes( tail(obj1) ) # ok ################################################################################ # Methods: # methods-mathOps.R # here the multiplications "*", works also with "+", "=", "/". ... getAttributes( obj1 * 2) # ok getAttributes( obj1 * (1:12) ) # ok getAttributes( obj1 * matrix(1:12, ncol=1) ) # ok getAttributes( obj1 * as.ts(1:12) ) # ok getAttributes( obj1 * obj2 ) # ok ??? getAttributes( 2 * obj2 ) # ok getAttributes( (1:12) * obj2 ) # ok getAttributes( matrix(1:12, ncol=1) * obj2) # ok getAttributes( as.ts(1:12) * obj2) # ok getAttributes( obj2 * obj1) # ok ??? # More Math Functions getAttributes( abs(obj1) ) # ok getAttributes( exp(obj1) ) # ok getAttributes( obj1^2 ) # ok # ... # Round and Truncate: getAttributes( round(obj1, digits=2) ) # ok getAttributes( trunc(obj1, digits=2) ) # ok getAttributes( signif(obj1, digits=3) ) # ok getAttributes( ceiling(100*obj1) ) # ok getAttributes( floor(100*obj1) ) # ok ################################################################################ # Financial 'timeSeries' Functions # fin-align.R getAttributes( align(obj1) ) # ok # fin-cumulated.R getAttributes( cumulated(obj1) ) # ok # fin-daily.R # align(obj1) and alignDailySeries(obj1) are the same # deprecate align Daily Series getAttributes( alignDailySeries(obj1) ) # ok # Can we use the generic function aggregate ? getAttributes( rollDailySeries(obj1, FUN=mean) ) # ok # fin-drawdowns.R getAttributes( drawdowns(obj1) ) # ok # fin-durations.R getAttributes( durations(obj1) ) # ok # fin-monthly.R getAttributes( rollMonthlySeries(obj1, "3m", FUN=mean) ) # ok getAttributes( countMonthlyRecords(obj1) ) # ok # fin-periodical.R # todo .endOfPeriodSeries .endOfPeriodStats .endOfPeriodBenchmarks # fin-returns.R OBJ1 <- cumulated(obj1) getAttributes( returns(OBJ1) ) # ok # fin-runlengths.R getAttributes( runlengths(obj1) ) # ok # fin-splits.R getAttributes( outlier(obj1) ) # ok # fin-spreads.R SPREADS <- spreads(obj3, which=c(1, 2)) getAttributes( SPREADS) # ok fails MIDQUOTES <- midquotes(obj3, which=c(1,2)) getAttributes( MIDQUOTES ) # ok fails # fin-turns.R INDEX <- cumulated(obj1) getAttributes( turns(INDEX) ) # ok ################################################################################ # Statistics timeSeries Functions # statistics-colCumsums.R getAttributes( colCumsums(obj1) ) # ok # statistics-colSums.R # returns no timeSeries objects # statistics-orderColnames.R # returns no timeSeries objects # statistics-orderStatistics.R # returns no timeSeries objects # statistics-rollMean.R getAttributes( rollStats(obj1, k=1, FUN=mean) ) # ok getAttributes( rollMean(obj1, k=1) ) # ok getAttributes( rollMin(obj1, k=1) ) # FAILS getAttributes( rollMax(obj1, k=1) ) # FAILS getAttributes( rollMedian(obj1, k=1) ) # ok # statistics-rowCumsums.R # statistics-smoothLowess.R getAttributes( smoothLowess(obj1) ) # ok getAttributes( smoothSupsmu(obj1) ) # ok getAttributes( smoothSpline(obj1) ) # ok ################################################################################ # stats # stats-aggregate.R by1 <- time(obj1[3*(1:4),]) getAttributes( aggregate(obj1, by=by1, FUN=mean) ) # ok # stats-filter.R getAttributes( filter(obj1, filter=c(1,1)) ) # ok # stats-lag.R getAttributes( lag(obj1) ) # ok # stats-na.contiguous.R # returns no timeSeries objects # stats-na.omit.R obj3 <- obj1; obj3[4, 1] <- NA; obj3 getAttributes( na.omit(obj3) ) # ok # What about? - They should be deprecated. # removeNA # substituteNA # interp NA # stats-window.R Time <- time(obj1) getAttributes( window(obj1, Time[3], Time[6]) ) # ok ################################################################################ # Attributes Functions getAttributes <- function (obj) { # FUNCTION: # Check Argument: stopifnot(class(obj) == "timeSeries") # Extract Attributes: ans <- attr(obj@documentation, "Attributes") # return Value: ans } # ----------------------------------------------------------------------------- `setAttributes<-` <- function(obj, value) { # Example: # obj <- dummyMonthlySeries(); getAttributes(obj) # setAttributes(obj) <- list(mat=matrix(1:4, ncol=2)); getAttributes(obj) # getAttributes(obj)$mat[[1]] # FUNCTION: # Check Arguments: stopifnot(class(obj) == "timeSeries") stopifnot(is.list(value)) stopifnot(length(value) == 1) stopifnot(!is.null(value)) # Compose New Attribute: name <- names(value) names(value) <- NULL A <- list(value) names(A) <- name # print(A) # Get Already Existing Attribute B <- getAttributes(obj) if(is.null(B)) B <- list() # print(B) # Join Attributes: JOINED <- sapply(unique(c(names(A), names(B))), function(x) list(c(A[[x]], B[[x]]))) # print(JOINED) # Assign Attribute: attr(obj@documentation, "Attributes") <- JOINED # Return Value: obj } ############################################################################### timeSeries/inst/extensionsTests/chicPlots.R0000755000176200001440000002521314263246021020643 0ustar liggesusers x = tS1 FinCenter = NULL type = NULL plot.type = c("multiple", "single") format = "auto" at = c("pretty", "chic") main <- xlab <- ylab <- ""; nm = colnames(x); log = "" col = 1; pch = 19; cex = 1; lty = 1; lwd = 1 grid = TRUE; frame.plot = TRUE xlim = NULL; ylim = NULL axes = TRUE; ann = TRUE; cex.axis = 1, cex.lab =1, yax.flip = FALSE mar.multi = c(0, 5.1, 0, if (yax.flip) 5.1 else 2.1) oma.multi = c(7.75, 1.1, 6.1, 1.1) # Plot Function Extensions written by Diethel Wuertz # ... first Version 2014-05-12 ############################################################################### # 1 Standard Plots # 1.1 Single Plots # 1.2 Multiple Plots # 1.2 Scatter Plots # 2 Time Axis Layout # 2.1 Pretty Axis Layout # 2.2 Chic Axis Layout # 2.3 Tailored Axis Layout # 3 Annotations # 3.1 Adding Title and Labels # 3.2 Removing Annotations # 3.3 Changing Font Size # 3.4 Flipping Value Axes # 4 Decorations # 4.1 Modifying Types # 4.2 Changing Colors # 4.3 Changing Line Styles # 4.4 Changing Plot Symbols # 4.5 Modifying Line Widths # 4.6 Modifying Plot Symbol Sizes ############################################################################### # First let us see what plot.ts can do in the multiple plot mode: require(timeSeries) tS1 <- 100 * cumulated(LPP2005REC[, 2]) tS2 <- 100 * cumulated(LPP2005REC[, 2:3]) tS3 <- 100 * cumulated(LPP2005REC[, 1:3]) tS6 <- 100 * cumulated(LPP2005REC[, 1:6]) tS7 <- 100 * cumulated(LPP2005REC[, 1:7]) # ----------------------------------------------------------------------------- # 1.3 Scatter Plots: mat <- getDataPart(tS2) par(mfrow=c(2,2)) plot(mat[, 1], mat[, 2]) plot(mat[, 1], mat[, 2], pch=19, cex=0.2) ################################################################################ # 2. Time Axis Layout: # Changing Time-Axis Size: # One Column Multiple Plots - Each curve in its own Graph: par(mfrow=c(1, 1)) plot(tS3, at="chic", plot.type="m", cex.axis=0.8) par(mfrow=c(1, 1)) plot(tS3, at="chic", plot.type="m", cex.axis=1.1) # Two Columns Multiple Plots - Each curve in its own Graph: par(mfrow=c(1, 1)) plot(tS6, at="chic", plot.type="m", cex.axis=0.8) par(mfrow=c(1, 1)) plot(tS6, at="chic", plot.type="m", cex.axis=1.1) ################################################################################ # 3 Annotations # ------------------------------------------------------------------------------ # 3.1 Adding Title and Labels # Single Plot - All Curves in one Graph: par(mfrow=c(2, 2)) plot(tS1); title(main = "Index") plot(tS3, plot.type="s"); title(main = "Index") plot(tS3, plot.type="s"); title(main = "Index", xlab = "Date") plot(tS6, plot.type="s"); title(main = "Index", xlab = "Date") # One Column Multiple Plots - Each curve in its own Graph: par(mfrow=c(1, 1)) plot(tS3, plot.type="m"); title(main = "Index", xlab = "Date") # Two Column Multiple Plots: par(mfrow=c(1, 1)) plot(tS6, plot.type="m"); title(main = "Index", xlab = "Date") # One Column Multiple Plots - User designed Title par(mfrow=c(1, 1)) plot(tS3, plot.type="m", at = "chic") mtext("Swiss Market", side=3, line=1, adj=-0.025) # Two Column Multiple Plots - User designed Title par(mfrow=c(1, 1)) plot(tS6, plot.type="m", at = "chic") mtext("Swiss Market", side=3, line=1, adj=-0.3) mtext("Foreign Market", side=3, line=1, adj=0.7) # ------------------------------------------------------------------------------ # 3.2 Remove all Annotations: # Two Column Multiple Plots - Each curve in its own Graph: par(mfrow=c(1, 1)) plot(tS6, plot.type="m", ann=FALSE) # Single Plot - All Curves in one Graph: par(mfrow=c(2, 1), mar = c(4, 4, 1, 2) + 0.1) plot(tS1, at="chic", ann=FALSE) title(ylab = colnames(tS1), cex.axis=0.8, cex.lab=0.8) plot(tS1, at="chic", ann=FALSE) title(ylab = colnames(tS1), cex.axis=1.2, cex.lab=1.2) ################################################################################ # 4 Decorations # ------------------------------------------------------------------------------ # 4.1 Modifying Types # "type" par(mfrow=c(1,1)) plot(tS3, type = c("l", "p", "h"), plot.type="m") # ------------------------------------------------------------------------------ # 4.2 Changing Colors # Selecting Colors: par(mfrow=c(2, 2)) plot(tS3, col = 1, plot.type="s") plot(tS3, col = 1:3, plot.type="s") plot(tS3, col = c("blue", "orange", "brown"), plot.type="s") # ------------------------------------------------------------------------------ # 4.3 Changing Line Styles # Single Plot: par(mfrow=c(1,1)) plot(tS3, lty = 3:1, plot.type="s") # One Column Multiple Plot: par(mfrow=c(1,1)) plot(tS3, lty = 3:1, plot.type="m") # ------------------------------------------------------------------------------ # 4.4 Changing Plot Symbols par(mfrow=c(1,1)) plot(tS3, pch = c(17, 18, 19), plot.type="m") # 4.5 Modifying Line Widths par(mfrow=c(1,1)) plot(tS3, lwd = c(17, 18, 19), plot.type="m") par(mfrow=c(2, 2)) plot(tS3, type=rep("p", 3), cex = rep(1.2, 3), plot.type="s") plot(tS3, type = rep("p", 3), pch = 1:3, col = c("blue", "orange", "brown"), plot.type="s") plot(tS3, type = "p", pch = 19, col = c("blue", "orange", "brown"), plot.type="s") # ----------------------------------------------------------------------------- chart.TimeSeries function (R, auto.grid = TRUE, xaxis = TRUE, yaxis = TRUE, yaxis.right = FALSE, type = "l", lty = 1, lwd = 2, main = NULL, ylab = NULL, xlab = "Date", date.format.in = "%Y-%m-%d", date.format = NULL, xlim = NULL, ylim = NULL, element.color = "darkgray", event.lines = NULL, event.labels = NULL, period.areas = NULL, event.color = "darkgray", period.color = "aliceblue", colorset = (1:12), pch = (1:12), legend.loc = NULL, ylog = FALSE, cex.axis = 0.8, cex.legend = 0.8, cex.lab = 1, cex.labels = 0.8, cex.main = 1, major.ticks = "auto", minor.ticks = TRUE, grid.color = "lightgray", grid.lty = "dotted", xaxis.labels = NULL, ...) { y = checkData(R) columns = ncol(y) rows = nrow(y) columnnames = colnames(y) if (is.null(date.format)) { freq = periodicity(y) yr_eq <- ifelse(format(index(first(y)), format = "%Y") == format(index(last(y)), format = "%Y"), TRUE, FALSE) switch(freq$scale, seconds = { date.format = "%H:%M" }, minute = { date.format = "%H:%M" }, hourly = { date.format = "%d %H" }, daily = { if (yr_eq) date.format = "%b %d" else date.format = "%Y-%m-%d" }, weekly = { if (yr_eq) date.format = "%b %d" else date.format = "%Y-%m-%d" }, monthly = { if (yr_eq) date.format = "%b" else date.format = "%b %y" }, quarterly = { if (yr_eq) date.format = "%b" else date.format = "%b %y" }, yearly = { date.format = "%Y" }) } rownames = as.Date(xts:::time.xts(y)) rownames = format(strptime(rownames, format = date.format.in), date.format) time.scale = periodicity(y)$scale ep = axTicksByTime(y, major.ticks, format.labels = date.format) logaxis = "" if (ylog) { logaxis = "y" } plot.new() if (is.null(xlim[1])) xlim = c(1, rows) if (is.null(ylim[1])) { ylim = as.numeric(range(y, na.rm = TRUE)) } plot.window(xlim, ylim, xaxs = "r", log = logaxis) if (is.null(ylab)) { if (ylog) ylab = "ln(Value)" else ylab = "Value" } if (ylog) dimensions = 10^par("usr") else dimensions = par("usr") if (!is.null(period.areas)) { period.dat = lapply(period.areas, function(x, y) c(first(index(y[x])), last(index(y[x]))), y = y) period.ind = NULL for (period in 1:length(period.dat)) { if (!is.na(period.dat[[period]][1])) { period.ind = list(grep(period.dat[[period]][1], index(y)), grep(period.dat[[period]][2], index(y))) rect(period.ind[1], dimensions[3], period.ind[2], dimensions[4], col = period.color, border = NA) } } } if (auto.grid) { abline(v = ep, col = grid.color, lty = grid.lty) grid(NA, NULL, col = grid.color) } abline(h = 0, col = element.color) if (!is.null(event.lines)) { event.ind = NULL for (event in 1:length(event.lines)) { event.ind = c(event.ind, grep(event.lines[event], rownames)) } number.event.labels = ((length(event.labels) - length(event.ind) + 1):length(event.labels)) abline(v = event.ind, col = event.color, lty = 2) if (!is.null(event.labels)) { text(x = event.ind, y = ylim[2], label = event.labels[number.event.labels], offset = 0.2, pos = 2, cex = cex.labels, srt = 90, col = event.color) } } if (length(lwd) < columns) lwd = rep(lwd, columns) if (length(lty) < columns) lty = rep(lty, columns) if (length(pch) < columns) pch = rep(pch, columns) for (column in columns:1) { lines(1:rows, y[, column], col = colorset[column], lwd = lwd[column], pch = pch[column], lty = lty[column], type = type, ...) } if (xaxis) { if (minor.ticks) axis(1, at = 1:NROW(y), labels = FALSE, col = "#BBBBBB") label.height = cex.axis * (0.5 + apply(t(names(ep)), 1, function(X) max(strheight(X, units = "in")/par("cin")[2]))) if (is.null(xaxis.labels)) xaxis.labels = names(ep) else ep = 1:length(xaxis.labels) axis(1, at = ep, labels = xaxis.labels, las = 1, lwd = 1, mgp = c(3, label.height, 0), cex.axis = cex.axis) title(xlab = xlab, cex = cex.lab) } if (yaxis) if (yaxis.right) axis(4, cex.axis = cex.axis, col = element.color, ylog = ylog) else axis(2, cex.axis = cex.axis, col = element.color, ylog = ylog) box(col = element.color) if (!is.null(legend.loc)) { legend(legend.loc, inset = 0.02, text.col = colorset, col = colorset, cex = cex.legend, border.col = element.color, lty = lty, lwd = 2, bg = "white", legend = columnnames, pch = pch) } if (is.null(main)) main = columnnames[1] title(ylab = ylab, cex = cex.lab) title(main = main, cex = cex.main) } timeSeries/inst/extensionsTests/aggregateWrappers.R0000755000176200001440000002151214263246021022363 0ustar liggesusers require(timeSeries) X <- cumulated(LPP2005REC)[, 1:3] for (i in 1:3) X[, i] <- 100*X[, i]/as.vector(X[1,i]) Data <- alignDailySeries(X) # add: startDate Index <- time(Data) # Generate time Series: tS <- timeSeries(data=Data, charvec=format(Index)) tR <- returns(tS) ############################################################################### # aggregate: # from stats Package: The function aggregate splits the data into subsets, # computes summary statistics for each, and returns the result in a # convenient form. # AGGREGATION OVER NON-OVEWRLAPPING PERIODS # starting point: aligned daily Data # Aggregation Function: # function (x, by, FUN, ...) # Aggregation Levels: # weekly/biweekly: endOfWeek, onTuesdays, lastBusinessDay # monthly: endOMonth, lastFriday, lastBusinessDay # quarterly: 3-monthly # half-annually: 6-monthly # yearly: 12-monthly # Aggregation Statistics: # mean, sd, var, median, ... open <- function(x) as.vector(x)[1] close <- function(x) rev(as.vector(x))[1] high <- function(x) max(x) low <- function(x) min(x) spread <- function(x) max(x) - min(x) # ----------------------------------------------------------------------------- # Weekly # End-of-week: by <- timeLastDayInMonth(time(tS)) mean.tR <- aggregate(tR[, "SPI"], by, mean) sd.tR <- aggregate(tR[, "SPI"], by, sd) plot(cbind(mean.tR, sd.tR), type="h") # Weekly - Last Zurich Business Day In Week by <- timeLastBizdayInMonth(time(tS), holidays = holidayZURICH()) mean.tR <- aggregate(tR[, "SPI"], by, mean) sd.tR <- aggregate(tR[, "SPI"], by, sd) plot(cbind(mean.tR, sd.tR), type="h") # Weekly on Tuesdays by <- timeSequence(from=start(tD), to=end(tD), by = "week") mean.tR <- aggregate(tR[, "SPI"], by, mean) sd.tR <- aggregate(tR[, "SPI"], by, sd) plot(cbind(mean.tR, sd.tR), type="h") # ----------------------------------------------------------------------------- # Monthly # ----------------------------------------------------------------------------- # Quarterly ############################################################################### # ----------------------------------------------------------------------------- # End-of-Month Statistics # ----------------------------------------------------------------------------- # Monthly Open-High-Low-Close open <- function(x) as.vector(x)[1] close <- function(x) rev(as.vector(x))[1] high <- function(x) max(x) low <- function(x) min(x) SPI <- tS[, "SPI"] by <- timeLastDayInMonth(time(tS)) OHLC <- cbind( aggregate(SPI, by, open), aggregate(SPI, by, high), aggregate(SPI, by, low), aggregate(SPI, by, close)) OHLC # ----------------------------------------------------------------------------- # Monthly Spread / Percentual Spread spread <- function(x) max(x) - min(x) pspread <- function(x) (max(x) - min(x)) / (0.5 * (max(x) + min(x))) SPI <- tS[, "SPI"] by <- timeLastDayInMonth(time(tS)) SPREAD <- cbind( Points=aggregate(SPI, by, spread), Percent=100*aggregate(SPI, by, pspread)) SPREAD <- round(SPREAD, 2) SPREAD ################################################################################ # Rolling: Aggregation with Overlappinng Periods # ----------------------------------------------------------------------------- # rolling 52-weekly-highs and lows # xts: Mean on weekly Periods ep <- xts::endpoints(x.xts, on='weeks', k=1) by1 <- index(x.xts)[ep[-1]] period1 <- xts::period.apply(x.xts, INDEX=ep, FUN=mean) ############################################################################### # xts::apply.monthly FUN <- mean x <- x.xts apply.daily(x, FUN) apply.weekly(x, FUN) apply.monthly(x, FUN) apply.quarterly(x, FUN) apply.yearly(x, FUN) # timeDate::align FUN <- mean x <- unique(time(x.tS)) alignDaily(x, include.weekends=FALSE) by1 <- unique(alignMonthly(x, include.weekends=FALSE)) x1 <- timeSeries::aggregate(x.tS, by1, FUN) by2 <- unique(alignMonthly(x, include.weekends=TRUE)) x2 <- timeSeries::aggregate(x.tS, by2, FUN) by1 <- unique(alignQuarterly(x, include.weekends=FALSE)) x1 <- timeSeries::aggregate(x.tS, by1, FUN) by2 <- unique(alignQuarterly(x, include.weekends=TRUE)) x2 <- timeSeries::aggregate(x.tS, by2, FUN) cbind(x1,x2) ############################################################################### xts::first(x.xts) xts::last(x.xts) first2 <- function(x) x[start(x), ] last2 <- function(x) x[end(x), ] first2(x.tS) last2(x.tS) # ----------------------------------------------------------------------------- INDEX <- seq(1, nrow(xts), by=21) INDEX .period.apply(tS, INDEX, FUN=max) .period.max <- function(x, INDEX, FUN=max) .period.apply(x, INDEX, max) .period.max(tS[, 1], INDEX) .period.min <- function(x, INDEX) .period.apply(x, INDEX, min) .period.min(tS[, 1], INDEX) xts::period.apply(xts[, 1], INDEX, FUN=max) xts::period.max(xts[, 1], INDEX) xts::period.min(xts[, 1], INDEX) xts::period.prod(xts[, 1], INDEX) xts::period.sum(xts[, 1], INDEX) # ----------------------------------------------------------------------------- # timeBased is.timeBased <- function (x) { if (!any(sapply(c( "Date", "POSIXt", "chron", "dates", "times", "timeDate", "yearmon", "yearqtr", "xtime"), function(xx) inherits(x, xx)))) { ans <- FALSE } else { ans <- TRUE } ans } timeBased <- function(x) { is.timeBased(x) } # ----------------------------------------------------------------------------- alignDaily(x=time(tS), include.weekends=FALSE) alignMonthly(x=time(tS), include.weekends=FALSE) # error alignQuarterly(x=time(tS), include.weekends=FALSE) # error tD <- Sys.timeDate() + 1:1000 timeDate::align(tD, by="10s") timeDate::align(tD, by="60s") timeDate::align(tD, by="10m") # error td <- as.xts(Sys.time()) + 1:1000 xts::align.time(td, n=10) # every 10 seconds xts::align.time(td, n=60) # align to next whole minute xts::align.time(td, n=10*60) # align to next whole 10 min interval xts::shift.time(td, n=10) xts::shift.time(td, n=60) xts::shift.time(td) # ----------------------------------------------------------------------------- xts::to.minutes(x,k,name,...) xts::to.minutes3(x,name,...) xts::to.minutes5(x,name,...) xts::to.minutes10(x,name,...) xts::to.minutes15(x,name,...) xts::to.minutes30(x,name,...) xts::to.hourly(x,name,...) xts::to.daily(x,drop.time=TRUE,name,...) xts::to.weekly(x, drop.time=TRUE, name,...) xts::to.monthly(x, indexAt='yearmon', drop.time=TRUE,name,...) xts::to.quarterly(x, indexAt='yearqtr', drop.time=TRUE,name,...) xts::to.yearly(x,drop.time=TRUE,name,...) xts::to.period( x, period = 'months', k = 1, indexAt, name=NULL, OHLC = TRUE, ...) # ----------------------------------------------------------------------------- Convert an object to a specified periodicity lower than the given data object. For example, convert a daily series to a monthly series, or a monthly series to a yearly one, or a one minute series to an hourly series. data(sample_matrix) xts <- as.xts(sample_matrix) # is daily to.weekly(xts) to.monthly(xts) to.quarterly(xts) to.yearly(xts) tS <- as.timeSeries(sample_matrix) % ----------------------------------------------------------------------------- as.numeric(as.POSIXct(time(tS))) getFinCenter(tS) indexTZ(xts, ) tzone(xts, ) tzone(xts) <- "GMT" .index(xts, ) indexClass(xts) class(time(tS)) % ----------------------------------------------------------------------------- .index <- function(x) as.numeric(as.POSIXct(time(x))) .indexDate <- function(x) .index(x)%/%86400L .indexday <- function(x) .index(x)%/%86400L .indexmday <- function(x) as.POSIXlt(.POSIXct(.index(x)))$mday .indexwday <- function(x) as.POSIXlt(.POSIXct(.index(x)))$wday .indexweek <- function(x) .indexmon <- function(x) .indexyday <- function(x) .indexyear <- function(x) .indexhour <- function(x) .indexmin <- function(x) .indexsec <- function(x) atoms # Roll over fixed periods of length k point by point ... # Functions borrowed from zoo timeSeries::rollMin( x, k, na.pad = FALSE, align = c("center", "left", "right"), ...) timeSeries::rollMax( x, k, na.pad = FALSE, align = c("center", "left", "right"), ...) timeSeries::rollMean( x, k, na.pad = FALSE, align = c("center", "left", "right"), ...) timeSeries::rollMedian( x, k, na.pad = FALSE, align = c("center", "left", "right"), ...) timeSeries::rollStats( x, k, FUN = mean, na.pad = FALSE, align = c("center", "left", "right"), ...) # Roll over Calendarical periods: rollDailySeries(x, period="7d", FUN, ...) rollMonthlySeries(x, period="12m", by="1m", FUN, ...) # e.g. rollQuarterlySeries(x, period="12m", by="3m", FUN) # e.g. rollYearlySeries rollMonthlyWindows(x, period="12m", by="1m") apply applySeries # period.apply # Apply a specified function to data over a given interval, where the # interval is taken to be the data from INDEX[k] to INDEX[k+1], for # k=1:(length(INDEX)-1). timeSeries/inst/_pkgdown.yml0000644000176200001440000000721014546500452015700 0ustar liggesusersurl: https://geobosh.github.io/timeSeriesDoc/ deploy: install_metadata: true template: bootstrap: 5 search: exclude: ['news/index.html'] reference: - title: "Overview of package timeSeries" contents: - "timeSeries-package" - TimeSeriesData - title: "Create 'timeSeries' objects" contents: - timeSeries - readSeries - dummyMonthlySeries - dummyDailySeries - as.timeSeries - as.matrix.timeSeries - as.ts.timeSeries - as.data.frame.timeSeries - title: "Explore 'timeSeries' objects" contents: - plot - "lines,timeSeries-method" - "points,timeSeries-method" - pretty.timeSeries - "print.timeSeries" - str - is.timeSeries - is.signalSeries - isUnivariate - isMultivariate - isDaily.timeSeries - isMonthly.timeSeries - isQuarterly.timeSeries - isRegular - "is.na" - "is.unsorted,timeSeries-method" - title: "Subset 'timeSeries' objects" desc: > There are 'timeSeries' methods for subsetting operators, like '[' and '[<-', as well as functions and methods which broadly perform some kind of subsetting. contents: - window - TimeSeriesSubsettings - na.contiguous - na.omit - removeNA - substituteNA - interpNA - endOfPeriodSeries - endOfPeriodStats - endOfPeriodBenchmarks - title: "Aggregate and smooth 'timeSeries' objects" contents: - filter - smoothLowess - smoothSpline - smoothSupsmu - aggregate - align - alignDailySeries - daily2monthly - daily2weekly - fapply - applySeries - rollDailySeries - rollMonthlySeries - countMonthlyRecords - rollMonthlyWindows - title: "Manipulate 'timeSeries' objects" contents: - series - "series<-" - getFinCenter - "setFinCenter<-" - finCenter - "`finCenter<-`" - time - "time<-" - getUnits - "setUnits<-" - start - end - getAttributes - "setAttributes<-" - comment - "`comment<-`" - orderColnames - sortColnames - sampleColnames - statsColnames - pcaColnames - hclustColnames - title: "Transform 'timeSeries' objects" contents: - scale - diff - colCum - colCummaxs - colCummins - colCumprods - colCumreturns - colCumsums - rowCumsums - lag - sort - rev - runlengths - durations - rank - sample - math - title: "Financial computations on 'timeSeries' objects" contents: - returns - returns0 - cumulated - drawdowns - drawdownsStats - splits - spreads - midquotes - midquoteSeries - spreadSeries - index2wealth - title: "Compute statistics on timeSeries objects" contents: - "cov-methods" - "cor-methods" - colStats - colSds - colVars - colSkewness - colKurtosis - colMaxs - colMins - colProds - colQuantiles - turns - turnsStats - orderStatistics - rollStats - rollMean - rollMin - rollMax - rollMedian - title: "Combine time series" contents: - cbind - rbind - cbind2 - rbind2 - merge - title: "Mathematical operations on 'timeSeries'" contents: - math - t - title: "Other" contents: - "timeSeries-class" - dimnames - "DataPart,timeSeries-method" - description - attach - internals timeSeries/inst/COPYRIGHTS0000755000176200001440000000770514263246021014772 0ustar liggesusers________________________________________________________________________________ Copyrights (C) for R: see R's copyright and license file Version R 2.0.0 claims: - The stub packages from 1.9.x have been removed. - All the datasets formerly in packages 'base' and 'stats' have been moved to a new package 'datasets'. - Package 'graphics' has been split into 'grDevices' (the graphics devices shared between base and grid graphics) and 'graphics' (base graphics). - Packages must have been re-installed for this version, and library() will enforce this. - Package names must now be given exactly in library() and require(), regardless of whether the underlying file system is case-sensitive or not. ________________________________________________________________________________ for Rmetrics: (C) 1999-2005, Diethelm Wuertz, GPL Diethelm Wuertz www.rmetrics.org info@rmetrics.org ________________________________________________________________________________ for non default loaded basic packages part of R's basic distribution MASS: Main Package of Venables and Ripley's MASS. We assume that MASS is available. Package 'lqs' has been returned to 'MASS'. S original by Venables & Ripley. R port by Brian Ripley . Earlier work by Kurt Hornik and Albrecht Gebhardt. methods: Formally defined methods and classes for R objects, plus other programming tools, as described in the reference "Programming with Data" (1998), John M. Chambers, Springer NY. R Development Core Team. mgcv: Routines for GAMs and other generalized ridge regression with multiple smoothing parameter selection by GCV or UBRE. Also GAMMs by REML or PQL. Includes a gam() function. Simon Wood nnet: Feed-forward Neural Networks and Multinomial Log-Linear Models Original by Venables & Ripley. R port by Brian Ripley . Earlier work by Kurt Hornik and Albrecht Gebhardt. ________________________________________________________________________________ for the code partly included as builtin functions from other R ports: fSeries:bdstest.c C Program to compute the BDS Test. Blake LeBaron fSeries:fracdiff R functions, help pages and the Fortran Code for the 'fracdiff' function are included. S original by Chris Fraley R-port by Fritz Leisch since 2003-12: Martin Maechler fSeries:lmtest R functions and help pages for the linear modelling tests are included . Compiled by Torsten Hothorn , Achim Zeileis , and David Mitchell fSeries:mda R functions, help pages and the Fortran Code for the 'mars' function are implemeted. S original by Trevor Hastie & Robert Tibshirani, R port by Friedrich Leisch, Kurt Hornik and Brian D. Ripley fSeries:modreg Brian Ripley and the R Core Team fSeries:polspline R functions, help pages and the C/Fortran Code for the 'polymars' function are implemented Charles Kooperberg fSeries:systemfit Simultaneous Equation Estimation Package. R port by Jeff D. Hamann and Arne Henningsen fSeries:tseries Functions for time series analysis and computational finance. Compiled by Adrian Trapletti fSeries:UnitrootDistribution: The program uses the Fortran routine and the tables from J.G. McKinnon. fSeries:urca Unit root and cointegration tests for time series data. R port by Bernhard Pfaff . timeSeries/inst/extdata/0000755000176200001440000000000014550733426015003 5ustar liggesuserstimeSeries/inst/extdata/msft.csv0000755000176200001440000002571411066463144016501 0ustar liggesusers"%Y-%m-%d";Open;High;Low;Close;Volume 2000-09-27;63.4375;63.5625;59.8125;60.625;53077800 2000-09-28;60.8125;61.875;60.625;61.3125;26180200 2000-09-29;61;61.3125;58.625;60.3125;37026800 2000-10-02;60.5;60.8125;58.25;59.125;29281200 2000-10-03;59.5625;59.8125;56.5;56.5625;42687000 2000-10-04;56.375;56.5625;54.5;55.4375;68226700 2000-10-05;55.5;57.25;55.25;55.375;40549700 2000-10-06;55.8125;56.75;54.75;55.5625;30897000 2000-10-09;55.625;55.75;53;54.1875;29161800 2000-10-10;53.9375;55.5625;53.8125;54.5625;31033100 2000-10-11;54;56.9375;54;55.75;50602900 2000-10-12;56.3125;56.875;53.8125;54.375;45109800 2000-10-13;53.875;54.875;52.125;53.75;52260600 2000-10-16;53.5;53.8125;49.5625;50.375;59879500 2000-10-17;51.875;52.4375;50.25;50.4375;40638300 2000-10-18;49.625;53.25;48.4375;51.75;55268200 2000-10-19;58.4375;62.1875;58;61.875;128496600 2000-10-20;61.3125;66.125;61.125;65.1875;80189300 2000-10-23;64.625;66.25;60.6875;62.125;92585200 2000-10-24;62.625;62.9375;60.1875;61.5;47213700 2000-10-25;61.9375;63.4375;60.4375;61.25;83801900 2000-10-26;61;65.0625;60.8125;64.4375;57413300 2000-10-27;64.6875;69.1875;64.625;67.6875;62146200 2000-10-30;67.5;70.125;67.375;69.0625;55028800 2000-10-31;69;69.5;68;68.875;52237000 2000-11-01;68.5;70.0625;68.4375;69.625;40654700 2000-11-02;70.375;70.8438;69.625;70.3125;38992600 2000-11-03;69.25;69.625;68.0625;68.25;34355500 2000-11-06;68.6875;70.125;68.25;69.5;37425700 2000-11-07;69.75;71.875;69.5;70.5;52165600 2000-11-08;71.125;72.375;68;69.4375;103074700 2000-11-09;68.5;71.3125;68.4375;70.875;45529300 2000-11-10;69.9375;70.3125;66.8125;67.375;46872200 2000-11-13;66.6875;68.125;64.4062;66.4375;41682400 2000-11-14;68;69.8125;67.3125;68.8125;42109300 2000-11-15;69.0625;70.875;68.6875;70.0625;30211100 2000-11-16;69.4375;71.5;68.9375;68.9375;46064300 2000-11-17;69.4375;70;67.7969;69.0625;53262800 2000-11-20;68.125;68.5;65.5625;67.1875;40078600 2000-11-21;67.375;69.25;67.375;67.75;29743800 2000-11-22;66.0625;69.5;66;68.25;38171600 2000-11-24;69;70.4375;68.5;69.9375;17219600 2000-11-27;71.4375;72.25;70.625;70.6875;42653800 2000-11-28;69.375;69.75;66.8125;67;63723100 2000-11-29;66.8125;67.125;63.25;65.0625;49140200 2000-11-30;62;62.0625;57;57.375;98600400 2000-12-01;58.0625;60.625;56.0625;56.625;54904900 2000-12-04;57.25;59;55.1875;56.4375;40203600 2000-12-05;59.1875;60.5;58.25;59.875;50867200 2000-12-06;60;60.0625;56.0625;56.6875;45280400 2000-12-07;53.4375;54;52.25;53.125;72654200 2000-12-08;54.625;55.875;53.4375;54.4375;60469900 2000-12-11;55.5;58.75;55;58.0625;47788100 2000-12-12;57.8125;60;56.75;58.375;31553000 2000-12-13;60.5;60.5;56.8125;57.25;49180200 2000-12-14;57.9375;58.7344;55.375;55.5;35600700 2000-12-15;51.0469;52;47.75;49.1875;58449900 2000-12-18;49;50;47;47.8125;53593700 2000-12-19;47.4375;48;44.5;44.8125;60135900 2000-12-20;42.8125;44;41.375;41.5;74518900 2000-12-21;40.75;45.125;40.3125;43.4375;81586500 2000-12-22;44.75;47.125;44.75;46.4375;54775900 2000-12-26;46.875;48.5625;45.875;46.875;33470800 2000-12-27;46.125;46.8125;45;46.4375;34501900 2000-12-28;45.125;46.25;43.875;44.5625;38809600 2000-12-29;43.9375;45.8125;43;43.375;49988800 2001-01-02;44.125;45;42.875;43.375;41206600 2001-01-03;43.1875;48.875;43.125;47.9375;67981100 2001-01-04;47.8125;50.5;46.875;48.4375;56198500 2001-01-05;48.5;49.875;47.5625;49.125;46707300 2001-01-08;48.9375;49.75;46.6875;48.9375;39908800 2001-01-09;50;52.625;49.75;51.8125;57482700 2001-01-10;51;53.8125;50.75;52.875;45115100 2001-01-11;53;55.75;52.3125;55;50927400 2001-01-12;54.875;55;52.5;53.5;36856000 2001-01-16;53.375;53.5;51.125;52.5625;34231200 2001-01-17;53.625;54.875;52.5625;52.9375;36422100 2001-01-18;53.6875;56.1875;52.625;55.5;54894400 2001-01-19;60;61.4375;58.875;61;104674400 2001-01-22;60.75;61;59;60.125;38336500 2001-01-23;59.75;60.9375;58.9375;60.5625;35147600 2001-01-24;61;63.4375;60.75;62.9375;55227500 2001-01-25;62.75;64;61.5625;61.8125;42828700 2001-01-26;61;64.3125;61;64;46540000 2001-01-29;63.5625;64.625;63.5;64.5;42491900 2001-01-30;64.5;64.75;62.875;63.375;28638400 2001-01-31;63;63.75;61;61.0625;40949400 2001-02-01;60.8125;62.625;60.375;62.375;35896400 2001-02-02;62.5;63.375;60.75;60.8125;35550000 2001-02-05;60.75;62.0625;60.25;61.9375;25699600 2001-02-06;62.0625;63.8125;61.6875;62.5625;48221000 2001-02-07;62;65.0625;61.8125;64.6875;63030900 2001-02-08;63.75;64.5;62;62.25;44020600 2001-02-09;61.3125;61.5625;58.5;59.125;50287600 2001-02-12;58.8125;59.4375;57.1875;58.75;35644700 2001-02-13;59.625;61.0625;58.125;58.1875;38035300 2001-02-14;57.625;59;56.375;58.375;30864200 2001-02-15;59;60.1875;57.875;58.8125;32813900 2001-02-16;57;58.25;56.125;57.3125;33479200 2001-02-20;57.375;58.25;55.375;55.875;30365400 2001-02-21;55.25;58.0625;55.1875;56.25;31973600 2001-02-22;56.3125;56.8125;53.875;55.1875;50408200 2001-02-23;54.4375;57.5;54.3125;56.75;46310300 2001-02-26;57.625;59.9375;57.375;59.5625;43968400 2001-02-27;59.375;61.1875;58.6719;59.375;49574300 2001-02-28;59.5625;60.0781;58.1875;59;42304200 2001-03-01;58.5625;59.5;56.25;59.3594;40890800 2001-03-02;57.5;58.125;56.4375;56.6875;39900400 2001-03-05;57.25;58.625;56.5625;57.4375;24691800 2001-03-06;58.625;60;58.375;59.4375;33390900 2001-03-07;59.875;61.125;59.3125;60.6875;29871800 2001-03-08;60.3125;60.5938;58.4375;59.25;27313000 2001-03-09;57.9375;58.1875;54.875;56.6875;51897200 2001-03-12;54.6875;55;51.625;51.9375;57188000 2001-03-13;52.1875;54.75;52;54.1875;45517800 2001-03-14;52.5;55.25;52.1875;54;45343100 2001-03-15;55.3125;56.0781;53.5;53.6875;35819200 2001-03-16;52.5;55.125;52.4844;54.5625;56424400 2001-03-19;54.5;55.5;53.125;54.3125;30518200 2001-03-20;54.5625;56.125;52.625;52.6875;45911400 2001-03-21;52.25;53.25;49.75;50.0625;62494300 2001-03-22;50.5625;54.0625;50.5;54;63181600 2001-03-23;54.9375;57;54.375;56.5625;49759800 2001-03-26;57.125;57.5;55.5625;56.0625;31559300 2001-03-27;56.0625;58.5625;55.875;58.25;47567800 2001-03-28;57.375;57.9375;55.375;55.5625;39340800 2001-03-29;55.375;57.1875;54.5625;55.375;43492500 2001-03-30;55.75;56.1875;53.875;54.6875;45600800 2001-04-02;54.8125;56.9375;54.625;55.8125;37962000 2001-04-03;55.3125;55.3125;52.75;53.375;47093800 2001-04-04;53.375;55;51.0625;51.9375;52023300 2001-04-05;53.75;57.375;53.5;56.75;56682000 2001-04-06;56.375;57.1875;55.0625;56.1875;46311000 2001-04-09;56.57;57.42;55.66;57.15;28147800 2001-04-10;57.95;60.09;57.78;59.68;54599700 2001-04-11;60.65;61.5;59.7;60.04;54939800 2001-04-12;59.56;62.31;59.35;62.18;43760000 2001-04-16;61.4;61.58;60.12;60.79;32928700 2001-04-17;60.52;62.11;60.04;61.48;42574600 2001-04-18;63.39;66.31;63;65.43;78348200 2001-04-19;65.81;69;65.75;68.04;79687800 2001-04-20;70.3;71.1;68.5;69;96459800 2001-04-23;68.11;68.47;66.9;68.25;46085600 2001-04-24;68.2;69.93;67.14;67.55;44588300 2001-04-25;67.57;69.79;67.25;69.69;38372000 2001-04-26;70.07;71;68.25;69.13;59368800 2001-04-27;69.53;69.68;66.21;67.12;60786200 2001-04-30;68.53;69.06;67.68;67.75;37184100 2001-05-01;67.66;70.3;67.6;70.17;41851400 2001-05-02;71;71.15;69.35;69.76;46432200 2001-05-03;69.25;70.18;68.14;68.53;33136700 2001-05-04;68;71.05;67.96;70.75;59769200 2001-05-07;70.83;72.15;70.7;71.38;54678100 2001-05-08;71.75;72.1;70.75;72.06;37542000 2001-05-09;71.24;71.3;69.86;70.4;38338300 2001-05-10;71.13;71.24;69.96;70;32167300 2001-05-11;69.96;70;68.65;69.4;25564400 2001-05-14;69.13;69.2;68.3;68.72;22484000 2001-05-15;68.74;69.3;68;68.27;30692800 2001-05-16;67.7;69.88;67.33;69.16;45946900 2001-05-17;69.1;70.14;67.55;68.17;53492400 2001-05-18;67.69;69.2;67.25;68.09;45302700 2001-05-21;68.05;69.99;67.75;68.79;51745800 2001-05-22;69.45;70.35;69.18;70.31;41727800 2001-05-23;70.39;71.6;69.51;69.7;46818700 2001-05-24;69.94;71.78;69.27;71.72;40390800 2001-05-25;71.66;71.9;70.36;70.91;26373800 2001-05-29;70.8;71.75;70.05;70.34;35605400 2001-05-30;69.56;70.58;68.65;69.19;43250900 2001-05-31;69.49;70.38;68.4;69.18;35341300 2001-06-01;69.6;70.7;68.7;70.34;28793800 2001-06-04;70.55;71.02;69.8;70.78;21868300 2001-06-05;70.76;73.08;70.5;72.6;44727100 2001-06-06;72.89;73.48;71.55;72.36;40011400 2001-06-07;72.12;73.73;72.08;73.68;33480000 2001-06-08;73.7;73.75;72.05;73.19;25933500 2001-06-11;72.85;72.85;71.51;72.12;23672800 2001-06-12;71.02;72.41;70.81;72.08;33357300 2001-06-13;72.05;72.3;70.64;70.69;27651200 2001-06-14;70.22;70.55;68.4;68.9;35986200 2001-06-15;67.51;68.3;66.4;68.02;54177200 2001-06-18;67.95;67.96;66.01;66.88;28423400 2001-06-19;68.21;68.85;66.85;67.32;31728700 2001-06-20;67.14;69.59;67.1;69.41;32054200 2001-06-21;69.15;70.55;68.92;69.84;34801900 2001-06-22;70;70.61;68.58;68.83;25546000 2001-06-25;69.1;69.81;67.77;68.85;24607800 2001-06-26;67.82;70.21;67.7;70.14;31538500 2001-06-27;69.86;71.53;69.36;71.14;34599900 2001-06-28;71.55;76.15;70.53;72.74;64487800 2001-06-29;72.6;73.41;71.4;73;47141900 2001-07-02;72.05;73.15;70.15;70.6;36405100 2001-07-03;70.3;70.8;69.93;70.47;14018700 2001-07-05;70.22;70.72;68.44;68.51;24621300 2001-07-06;68.3;68.4;65.67;66.06;33733900 2001-07-09;66.2;66.91;65.04;65.69;33238300 2001-07-10;65.9;66.25;64.35;64.48;33281300 2001-07-11;64.21;66.75;64.2;66.5;36911300 2001-07-12;70.7;72.05;70.33;71.6;64039000 2001-07-13;71.4;72;70.94;71.34;29467300 2001-07-16;71.45;72.16;70.15;71.18;27995400 2001-07-17;70.66;72.01;70.14;71.82;31620500 2001-07-18;70.6;71.5;69.87;70.57;28795400 2001-07-19;71.22;73;71.22;72.57;38274700 2001-07-20;68.03;69.4;67.94;69.18;62101800 2001-07-23;69.24;69.24;66.35;67.09;39999700 2001-07-24;67;67.99;65.7;66.32;33765100 2001-07-25;66.26;67.52;65.61;67.48;37032700 2001-07-26;67.12;67.32;65.5;66.59;38987000 2001-07-27;66.05;66.25;65.05;65.47;32698000 2001-07-30;65.65;66.88;65.54;65.8;21098200 2001-07-31;66.01;67.39;65.85;66.19;29515800 2001-08-01;66.8;66.81;65.76;66.47;27839500 2001-08-02;67.21;67.54;66.26;67.45;27099200 2001-08-03;67.3;67.36;66;66.89;21630200 2001-08-06;66.53;67.12;65.68;66.13;13915800 2001-08-07;66.04;67.05;65.99;66.35;15673900 2001-08-08;66.51;67.24;64.49;64.86;27498200 2001-08-09;64.98;65.55;64.3;65.01;22768100 2001-08-10;64.77;65.86;62.9;65.52;25878200 2001-08-13;65.24;65.99;64.75;65.83;16337700 2001-08-14;65.75;66.09;64.45;64.69;18240600 2001-08-15;64.71;65.05;63.2;63.2;19751500 2001-08-16;62.84;64.71;62.7;64.62;21952800 2001-08-17;63.78;64.13;61.5;61.88;26117100 2001-08-20;61.66;62.75;61.1;62.7;24185600 2001-08-21;62.7;63.2;60.71;60.78;23555900 2001-08-22;61.13;61.15;59.08;60.66;39053600 2001-08-23;60.67;61.53;59;59.12;25906600 2001-08-24;59.6;62.28;59.23;62.05;31699500 2001-08-27;61.9;63.36;61.57;62.31;22281400 2001-08-28;62.34;62.95;60.58;60.74;23711400 2001-08-29;61.05;61.3;59.54;60.25;24085000 2001-08-30;59.04;59.66;56.52;56.94;48816000 2001-08-31;56.85;58.06;56.3;57.05;28950400 2001-09-04;57.19;59.08;56.07;56.1;33594600 2001-09-05;56.18;58.39;55.39;57.74;44735300 2001-09-06;56.56;58.39;55.9;56.02;56178400 2001-09-07;56.11;57.36;55.31;55.4;44931900 2001-09-10;54.92;57.95;54.7;57.58;42235900 2001-09-17;54.02;55.1;52.8;52.91;63751000 2001-09-18;53.41;55;53.17;54.32;41591300 2001-09-19;54.46;54.7;50.6;53.87;63475100 2001-09-20;52.35;52.61;50.67;50.76;58991600 2001-09-21;47.92;50.6;47.5;49.71;92488300 2001-09-24;50.65;52.45;49.87;52.01;42790100 2001-09-25;52.27;53;50.16;51.3;42470300 2001-09-26;51.51;51.8;49.55;50.27;29262200 2001-09-27;50.1;50.68;48;49.96;40595600timeSeries/inst/unitTests/0000755000176200001440000000000014322333240015336 5ustar liggesuserstimeSeries/inst/unitTests/runit.durations.R0000755000176200001440000000235514322333240020641 0ustar liggesusers # Rmetrics is free software; you can redistribute it and/or # modify it under the terms of the GNU Library General Public # License as published by the Free Software Foundation; either # version 2 of the License, or (at your option) any later version. # # Rmetrics is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU Library General Public License for more details. # # You should have received a copy of the GNU Library General # Public License along with this library; if not, write to the # Free Foundation, Inc., 59 Temple Place, Suite 330, Boston, # MA 02111-1307 USA ################################################################################ test.durations <- function() { # RUnit Test: # Signal Series: tS = sort(sample(dummyMonthlySeries())[1:6, ]) tS durations(tS) durations(tS, trim = TRUE) durations(tS, trim = TRUE)/(24*3600) # Time Series: tS = sort(sample(dummyMonthlySeries(format = "counts"))[1:6, ]) tS # BUG !!! # durations(tS) # durations(tS, trim = TRUE) } ################################################################################ timeSeries/inst/unitTests/runit.rank.R0000755000176200001440000000162614263246021017570 0ustar liggesusers # Rmetrics is free software; you can redistribute it and/or # modify it under the terms of the GNU Library General Public # License as published by the Free Software Foundation; either # version 2 of the License, or (at your option) any later version. # # Rmetrics is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU Library General Public License for more details. # # You should have received a copy of the GNU Library General # Public License along with this library; if not, write to the # Free Foundation, Inc., 59 Temple Place, Suite 330, Boston, # MA 02111-1307 USA ################################################################################ test.rank <- function() { NA } ################################################################################ timeSeries/inst/unitTests/runit.merge.R0000755000176200001440000000317614322333240017732 0ustar liggesusers # Rmetrics is free software; you can redistribute it and/or # modify it under the terms of the GNU Library General Public # License as published by the Free Software Foundation; either # version 2 of the License, or (at your option) any later version. # # Rmetrics is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU Library General Public License for more details. # # You should have received a copy of the GNU Library General # Public License along with this library; if not, write to the # Free Foundation, Inc., 59 Temple Place, Suite 330, Boston, # MA 02111-1307 USA ################################################################################ test.merge.timeSeries = function() { # RUnit Test: # Time Stamps: x = timeSeries()[,1] x y = timeSeries() y merge(x, y) # Signal Counts: x = timeSeries(format = "counts")[,1] x y = timeSeries(format = "counts") y merge(x, y) x <- dummyMonthlySeries()[,1] x y <- dummyMonthlySeries() y merge(x, y) # check that merge method can deal with timeSeries that have # colnames that are invalid data.frame colnames. For example # "S[-1]". data <- matrix(runif(18), ncol = 3) charvec <- rev(paste("2009-0", 1:6, "-01", sep = "")) S <- timeSeries(data, charvec) colnames(S) <- paste("S", 1:3, sep = ".") ts <- merge(S[,2], lag(S[,1], -1:1)) checkIdentical(dim(ts), c(6L,4L)) } ################################################################################ timeSeries/inst/unitTests/runit.subset.R0000755000176200001440000001244014322333000020124 0ustar liggesusers # Rmetrics is free software; you can redistribute it and/or # modify it under the terms of the GNU Library General Public # License as published by the Free Software Foundation; either # version 2 of the License, or (at your option) any later version. # # Rmetrics is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU Library General Public License for more details. # # You should have received a copy of the GNU Library General # Public License along with this library; if not, write to the # Free Foundation, Inc., 59 Temple Place, Suite 330, Boston, # MA 02111-1307 USA ################################################################################ test.subset <- function() { ts <- dummyMonthlySeries() mat <- as.matrix(ts) # we want the same subset-ting rules as for a matrix # but we always print result in vertical style ! # -------------------------------------------------------------------------- # index checkIdentical( ts[], ts) checkTrue(suppressWarnings(is.na(ts[""]))) checkTrue(is.na(mat[""])) checkIdentical( as.matrix(ts[seq(4),2]), mat[seq(4),2,drop=FALSE]) checkIdentical( as.matrix(ts[rep(FALSE, 3), 1]), mat[rep(FALSE, 3), 1,drop=FALSE]) checkIdentical( as.matrix(ts[FALSE, 1]), mat[FALSE, 1, drop = FALSE]) checkIdentical( as.matrix(ts[rep(TRUE), 2]), mat[rep(TRUE), 2, drop=FALSE]) charvec <- as.character(timeCalendar()[1:3]) checkIdentical( as.matrix(ts[charvec, 1]), mat[charvec, 1, drop = FALSE]) checkIdentical( as.matrix(ts[seq(4),]), mat[seq(4),,drop=FALSE]) checkIdentical( as.matrix(ts[rep(FALSE, 3), ]), mat[rep(FALSE, 3), ,drop=FALSE]) checkIdentical( as.matrix(ts[FALSE, ]), mat[FALSE, ,drop=FALSE]) checkIdentical( as.matrix(ts[rep(TRUE), ]), mat[rep(TRUE), ,drop=FALSE ]) dd <- as.character(time(ts)[1]) checkIdentical( as.matrix(ts[dd, ]), mat[dd, ,drop=FALSE]) checkIdentical( as.matrix(ts[,2]), mat[,2,drop=FALSE]) checkIdentical( as.matrix(ts[2,FALSE]), mat[2,FALSE, drop=FALSE]) # prefer to have an empty timeSeries instead of empty data with row names checkIdentical( as.matrix(ts[,FALSE]), mat[,FALSE, drop = FALSE]) checkIdentical( as.matrix(ts[,TRUE ]), mat[,TRUE ,drop=FALSE]) checkIdentical( as.matrix(ts[, "TS.1"]), mat[, "TS.1", drop = FALSE]) # -------------------------------------------------------------------------- # timeDate checkIdentical( ts[timeCalendar()[1:5], 2], ts[1:5,2]) checkIdentical( ts[timeCalendar()[1:5], ], ts[1:5,]) # -------------------------------------------------------------------------- # logical matrix and timeSeries i <- ts < 0.4 checkException(ts[series(i), ], silent = TRUE) checkException(ts[i, ], silent = TRUE) checkException(mat[series(i), ], silent = TRUE) # it fails as expected checkIdentical( as.matrix(ts[series(i)[,1], ]), mat[series(i)[,1], , drop=FALSE]) checkIdentical( as.matrix(ts[i[,1], ]), mat[series(i)[,1], , drop=FALSE]) checkIdentical( as.matrix(ts[series(i)[,1],1]), mat[series(i)[,1],1,drop=FALSE]) checkIdentical( as.matrix(ts[i[,1],1]), mat[series(i)[,1],1,drop=FALSE]) # this should fail checkException(ts[series(i), 2], silent = TRUE) checkException(ts[i, 2], silent = TRUE) checkException(ts[series(i), 1], silent = TRUE) checkException(ts[series(i),1], silent = TRUE) checkException(ts[i,1], silent = TRUE) checkException(mat[series(i),1], silent = TRUE) checkException(ts[series(i),], silent = TRUE) checkException(mat[series(i),], silent = TRUE) checkIdentical( ts[series(i)], mat[series(i)]) checkIdentical( ts[i], mat[series(i)]) # -------------------------------------------------------------------------- # $,timeSeries method df <- as.data.frame(ts) checkIdentical( ts$TS., df$TS.) checkIdentical( ts$TS.1, df$TS.1) checkIdentical( ts$a, df$a) colnames(ts) <- c("aa", "bb") colnames(df) <- c("aa", "bb") checkIdentical( ts$a, df$a) checkIdentical( ts$b, df$b) } ################################################################################ timeSeries/inst/unitTests/runit.colStats.R0000755000176200001440000000266114322333240020425 0ustar liggesusers # Rmetrics is free software; you can redistribute it and/or # modify it under the terms of the GNU Library General Public # License as published by the Free Software Foundation; either # version 2 of the License, or (at your option) any later version. # # Rmetrics is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU Library General Public License for more details. # # You should have received a copy of the GNU Library General # Public License along with this library; if not, write to the # Free Foundation, Inc., 59 Temple Place, Suite 330, Boston, # MA 02111-1307 USA ################################################################################ test.colStats = function() { # RUnit Test: # Signal Series: tS = dummyMonthlySeries(format = "counts") tS colStats(tS, mean) colSums(tS) colMeans(tS) colSds(tS) colVars(tS) colSkewness(tS) colKurtosis(tS) colMaxs(tS) colMins(tS) colProds(tS) colQuantiles(tS) # timDate Series: tS = dummyMonthlySeries() tS colStats(tS, mean) colSums(tS) colMeans(tS) colSds(tS) colVars(tS) colSkewness(tS) colKurtosis(tS) colMaxs(tS) colMins(tS) colProds(tS) colQuantiles(tS) } ################################################################################ timeSeries/inst/unitTests/runit.timeSeries.R0000755000176200001440000000327614263246021020751 0ustar liggesusers # Rmetrics is free software; you can redistribute it and/or # modify it under the terms of the GNU Library General Public # License as published by the Free Software Foundation; either # version 2 of the License, or (at your option) any later version. # # Rmetrics is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU Library General Public License for more details. # # You should have received a copy of the GNU Library General # Public License along with this library; if not, write to the # Free Foundation, Inc., 59 Temple Place, Suite 330, Boston, # MA 02111-1307 USA ################################################################################ test.signalSeries.Internal <- function() { # RUnit Test: x = rnorm(12) y = rnorm(12) timeSeries:::.signalSeries(as.matrix(x), 1:12) timeSeries:::.signalSeries(as.matrix(cbind(x,y)), 1:12) } # ------------------------------------------------------------------------------ test.timeSeries.Internal <- function() { # this is to test the problem when a ts object is passed to # timeSeries. It seems that as.matrix does not convert the object # to a matrix !!! z <- ts(matrix(rnorm(300), 100, 3), start=c(1961, 1), frequency=12) # class(as.matrix(z)) #<< mts ts and not matrix in R 2.9.0 # Note that is is possible that a ts object is considered as a # matrix when timeSeries method as dispatched. Hence this check t <- timeSeries(z) checkTrue(identical(as(z, "matrix"), as(t, "matrix"))) } ################################################################################ timeSeries/inst/unitTests/runit.mathOps.R0000755000176200001440000000215314322333240020240 0ustar liggesusers # Rmetrics is free software; you can redistribute it and/or # modify it under the terms of the GNU Library General Public # License as published by the Free Software Foundation; either # version 2 of the License, or (at your option) any later version. # # Rmetrics is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU Library General Public License for more details. # # You should have received a copy of the GNU Library General # Public License along with this library; if not, write to the # Free Foundation, Inc., 59 Temple Place, Suite 330, Boston, # MA 02111-1307 USA ################################################################################ test.mathOps <- function() { # RUnit Test: tS = dummyMonthlySeries(format = "counts") tS tS - 2 log(abs(tS)) diff(tS) scale(tS) tS = dummyMonthlySeries() tS tS - 2 log(abs(tS)) diff(tS) scale(tS) } ################################################################################ timeSeries/inst/unitTests/runit.methods-plot.R0000755000176200001440000000162614263246021021254 0ustar liggesusers # Rmetrics is free software; you can redistribute it and/or # modify it under the terms of the GNU Library General Public # License as published by the Free Software Foundation; either # version 2 of the License, or (at your option) any later version. # # Rmetrics is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU Library General Public License for more details. # # You should have received a copy of the GNU Library General # Public License along with this library; if not, write to the # Free Foundation, Inc., 59 Temple Place, Suite 330, Boston, # MA 02111-1307 USA ################################################################################ test.plot <- function() { NA } ################################################################################ timeSeries/inst/unitTests/runit.monthly.R0000755000176200001440000000163114263246021020323 0ustar liggesusers # Rmetrics is free software; you can redistribute it and/or # modify it under the terms of the GNU Library General Public # License as published by the Free Software Foundation; either # version 2 of the License, or (at your option) any later version. # # Rmetrics is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU Library General Public License for more details. # # You should have received a copy of the GNU Library General # Public License along with this library; if not, write to the # Free Foundation, Inc., 59 Temple Place, Suite 330, Boston, # MA 02111-1307 USA ################################################################################ test.monthly <- function() { NA } ################################################################################ timeSeries/inst/unitTests/runit.Omit.R0000755000176200001440000000346714263246021017552 0ustar liggesusers # Rmetrics is free software; you can redistribute it and/or # modify it under the terms of the GNU Library General Public # License as published by the Free Software Foundation; either # version 2 of the License, or (at your option) any later version. # # Rmetrics is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU Library General Public License for more details. # # You should have received a copy of the GNU Library General # Public License along with this library; if not, write to the # Free Foundation, Inc., 59 Temple Place, Suite 330, Boston, # MA 02111-1307 USA ################################################################################ test.naOmitMatrix = function() { x = as.timeSeries(data(LPP2005REC))[1:20, 1:4] colnames(x) = abbreviate(colnames(x), 6) x[1, 1] = NA x[3:4, 2] = NA x[18:20, 4] = NA show(x) timeSeries:::.naOmitMatrix(as.matrix(x)) timeSeries:::.naOmitMatrix(as.matrix(x), "s") timeSeries:::.naOmitMatrix(as.matrix(x), "z") timeSeries:::.naOmitMatrix(as.matrix(x), "ir") timeSeries:::.naOmitMatrix(as.matrix(x), "iz") timeSeries:::.naOmitMatrix(as.matrix(x), "ie") # Return Value: return() } # ------------------------------------------------------------------------------ test.na.omit = function() { x = as.timeSeries(data(LPP2005REC))[1:20, 1:4] colnames(x) = abbreviate(colnames(x), 6) x[1, 1] = NA x[3:4, 2] = NA x[18:20, 4] = NA show(x) na.omit(x) na.omit(x, "s") na.omit(x, "z") na.omit(x, "ir") na.omit(x, "iz") na.omit(x, "ie") # Return Value: return() } ################################################################################ timeSeries/inst/unitTests/runit.cumulated.R0000755000176200001440000000213314322333240020606 0ustar liggesusers # Rmetrics is free software; you can redistribute it and/or # modify it under the terms of the GNU Library General Public # License as published by the Free Software Foundation; either # version 2 of the License, or (at your option) any later version. # # Rmetrics is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU Library General Public License for more details. # # You should have received a copy of the GNU Library General # Public License along with this library; if not, write to the # Free Foundation, Inc., 59 Temple Place, Suite 330, Boston, # MA 02111-1307 USA ################################################################################ test.cumulated = function() { # RUnit Test: # Signal Series: tS = dummyMonthlySeries(format = "counts") # problem with Fincenter cumulated(tS) # timeDate Series: tS = dummyMonthlySeries() cumulated(tS) } ################################################################################ timeSeries/inst/unitTests/runit.model.frame.R0000755000176200001440000000163514263246021021026 0ustar liggesusers # Rmetrics is free software; you can redistribute it and/or # modify it under the terms of the GNU Library General Public # License as published by the Free Software Foundation; either # version 2 of the License, or (at your option) any later version. # # Rmetrics is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU Library General Public License for more details. # # You should have received a copy of the GNU Library General # Public License along with this library; if not, write to the # Free Foundation, Inc., 59 Temple Place, Suite 330, Boston, # MA 02111-1307 USA ################################################################################ test.model.frame <- function() { NA } ################################################################################ timeSeries/inst/unitTests/runit.TimeSeriesPositions.R0000755000176200001440000000513214263246021022612 0ustar liggesusers # Rmetrics is free software; you can redistribute it and/or # modify it under the terms of the GNU Library General Public # License as published by the Free Software Foundation; either # version 2 of the License, or (at your option) any later version. # # Rmetrics is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU Library General Public License for more details. # # You should have received a copy of the GNU Library General # Public License along with this library; if not, write to the # Free Foundation, Inc., 59 Temple Place, Suite 330, Boston, # MA 02111-1307 USA ################################################################################ test.time = function() { # Generate nivariate daily random sequence set.seed(4711) data = round(rnorm(12), 2) charvec = timeCalendar(2006) uTS = timeSeries(data, charvec, units = "uTS") uTS # Get Positions: POS = time(uTS) POS checkIdentical(charvec, POS) # Return Value: return() } # ------------------------------------------------------------------------------ "test.time<-" = function() { # Generate nivariate daily random sequence set.seed(4711) data = round(rnorm(12), 2) charvec = timeCalendar(2006) uTS = timeSeries(data, charvec, units = "uTS") uTS # Add one Day to Positions: POS = time(uTS) time(uTS) <- POS + 24*3600 uTS # Return Value: return() } # ------------------------------------------------------------------------------ test.timeSeriesOrdering = function() { # sample.timeSeries - Resamples a 'timeSeries' object in time # sort.timeSeries - Sorts reverts a 'timeSeries' object in time # rev.timeSeries - Reverts a 'timeSeries' object in time # start.timeSeries - Extracts start date of a 'timeSeries' object # end.timeSeries - Extracts end date of a 'timeSeries' object # Generate univariate monthly random sequence: set.seed(4711) data = cbind(1:12, round(rnorm(12), 2)) positions = timeCalendar(2006) uTS = timeSeries(data, positions) uTS # Sample/Sort: target = uTS target # current = sort(sample(uTS)) # current # checkIdentical(target, current) # Revert: target = uTS target current = rev(rev(uTS)) current checkTrue(!sum(target - current)) # Start/End date of Series: start(uTS) end(uTS) # Return Value: return() } ################################################################################ timeSeries/inst/unitTests/runit.dim.R0000755000176200001440000000344514263246021017407 0ustar liggesusers # Rmetrics is free software; you can redistribute it and/or # modify it under the terms of the GNU Library General Public # License as published by the Free Software Foundation; either # version 2 of the License, or (at your option) any later version. # # Rmetrics is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU Library General Public License for more details. # # You should have received a copy of the GNU Library General # Public License along with this library; if not, write to the # Free Foundation, Inc., 59 Temple Place, Suite 330, Boston, # MA 02111-1307 USA ################################################################################ test.dim.timeSeries = function() { # RUnit Test: # Univariate Case: tS = timeSeries(format = "counts")[, 1] dim(tS) NCOL(tS) NROW(tS) ncol(tS) nrow(tS) dimnames(tS) colnames(tS) rownames(tS) # colnames<- # rownames<- is.array(tS) # Multivariate Case: tS = timeSeries(format = "counts") dim(tS) NCOL(tS) NROW(tS) ncol(tS) nrow(tS) dimnames(tS) colnames(tS) rownames(tS) # colnames<- # rownames<- is.array(tS) # Univariate Case: tS = timeSeries()[, 1] dim(tS) NCOL(tS) NROW(tS) ncol(tS) nrow(tS) dimnames(tS) colnames(tS) rownames(tS) # colnames<- # rownames<- is.array(tS) # Multivariate Case: tS = timeSeries() dim(tS) NCOL(tS) NROW(tS) ncol(tS) nrow(tS) dimnames(tS) colnames(tS) rownames(tS) # colnames<- # rownames<- is.array(tS) } ################################################################################ timeSeries/inst/unitTests/runit.periodical.R0000755000176200001440000000163414263246021020747 0ustar liggesusers # Rmetrics is free software; you can redistribute it and/or # modify it under the terms of the GNU Library General Public # License as published by the Free Software Foundation; either # version 2 of the License, or (at your option) any later version. # # Rmetrics is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU Library General Public License for more details. # # You should have received a copy of the GNU Library General # Public License along with this library; if not, write to the # Free Foundation, Inc., 59 Temple Place, Suite 330, Boston, # MA 02111-1307 USA ################################################################################ test.periodical <- function() { NA } ################################################################################ timeSeries/inst/unitTests/runTests.R0000755000176200001440000000453314263246021017324 0ustar liggesuserspkg <- "timeSeries" if(require("RUnit", quietly = TRUE)) { library(package=pkg, character.only = TRUE) if(!(exists("path") && file.exists(path))) path <- system.file("unitTests", package = pkg) ## --- Testing --- ## Define tests testSuite <- defineTestSuite(name = paste(pkg, "unit testing"), dirs = path) if(interactive()) { cat("Now have RUnit Test Suite 'testSuite' for package '", pkg, "' :\n", sep='') str(testSuite) cat('', "Consider doing", "\t tests <- runTestSuite(testSuite)", "\nand later", "\t printTextProtocol(tests)", '', sep = "\n") } else { ## run from shell / Rscript / R CMD Batch / ... ## Run tests <- runTestSuite(testSuite) if(file.access(path, 02) != 0) { ## cannot write to path -> use writable one tdir <- tempfile(paste(pkg, "unitTests", sep="_")) dir.create(tdir) pathReport <- file.path(tdir, "report") cat("RUnit reports are written into ", tdir, "/report.(txt|html)", sep = "") } else { pathReport <- file.path(path, "report") } ## Print Results: printTextProtocol(tests, showDetails = FALSE) printTextProtocol(tests, showDetails = FALSE, fileName = paste(pathReport, "Summary.txt", sep = "")) printTextProtocol(tests, showDetails = TRUE, fileName = paste(pathReport, ".txt", sep = "")) ## Print HTML Version to a File: ## printHTMLProtocol has problems on Mac OS X if (Sys.info()["sysname"] != "Darwin") printHTMLProtocol(tests, fileName = paste(pathReport, ".html", sep = "")) ## stop() if there are any failures i.e. FALSE to unit test. ## This will cause R CMD check to return error and stop tmp <- getErrors(tests) if(tmp$nFail > 0 | tmp$nErr > 0) { stop(paste("\n\nunit testing failed (#test failures: ", tmp$nFail, ", R errors: ", tmp$nErr, ")\n\n", sep="")) } } } else { cat("R package 'RUnit' cannot be loaded -- no unit tests run\n", "for package", pkg,"\n") } ################################################################################ timeSeries/inst/unitTests/runit.drawdowns.R0000755000176200001440000000234614263246021020645 0ustar liggesusers # Rmetrics is free software; you can redistribute it and/or # modify it under the terms of the GNU Library General Public # License as published by the Free Software Foundation; either # version 2 of the License, or (at your option) any later version. # # Rmetrics is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU Library General Public License for more details. # # You should have received a copy of the GNU Library General # Public License along with this library; if not, write to the # Free Foundation, Inc., 59 Temple Place, Suite 330, Boston, # MA 02111-1307 USA ################################################################################ test.drawdowns <- function() { # RUnit Test: tS = timeSeries( data = matrix(rnorm(200, sd = 1e-3), 100), charvec = format(timeSequence(length.out = 100)) ) tS drawdowns(tS) tS = timeSeries( data = matrix(rnorm(200, sd = 1e-3), 100), charvec = 1:100, format = "counts" ) tS drawdowns(tS) } ################################################################################ timeSeries/inst/unitTests/runit.daily.R0000755000176200001440000000162714263246021017740 0ustar liggesusers # Rmetrics is free software; you can redistribute it and/or # modify it under the terms of the GNU Library General Public # License as published by the Free Software Foundation; either # version 2 of the License, or (at your option) any later version. # # Rmetrics is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU Library General Public License for more details. # # You should have received a copy of the GNU Library General # Public License along with this library; if not, write to the # Free Foundation, Inc., 59 Temple Place, Suite 330, Boston, # MA 02111-1307 USA ################################################################################ test.daily <- function() { NA } ################################################################################ timeSeries/inst/unitTests/runit.colCum.R0000755000176200001440000000370314322333240020051 0ustar liggesusers # Rmetrics is free software; you can redistribute it and/or # modify it under the terms of the GNU Library General Public # License as published by the Free Software Foundation; either # version 2 of the License, or (at your option) any later version. # # Rmetrics is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU Library General Public License for more details. # # You should have received a copy of the GNU Library General # Public License along with this library; if not, write to the # Free Foundation, Inc., 59 Temple Place, Suite 330, Boston, # MA 02111-1307 USA ################################################################################ test.colCum <- function() { # RUnit Test: # Signal Series ts <- dummyMonthlySeries(format = "counts") colCumsums(ts) colCummaxs(ts) colCummins(ts) colCumprods(ts) colCumreturns(ts) # Time Series: ts <- dummyMonthlySeries() colCumsums(ts) colCummaxs(ts) colCummins(ts) colCumprods(ts) colCumreturns(ts) # check that timeSeries with one row still works ... t <- ts[1,] checkTrue(is(colCumsums(t), "timeSeries")) checkTrue(is(colCummaxs(t), "timeSeries")) checkTrue(is(colCummins(t), "timeSeries")) checkTrue(is(colCumprods(t), "timeSeries")) checkTrue(is(colCumreturns(t), "timeSeries")) checkEquals(nrow(colCumsums(t)), 1) checkEquals(nrow(colCummaxs(t)), 1) checkEquals(nrow(colCummins(t)), 1) checkEquals(nrow(colCumprods(t)), 1) checkEquals(nrow(colCumreturns(t)), 1) ## 2022-07-27 GB: check fix for #2121 x=dummyMonthlySeries() x[1,2]=NA colCumsums(x, na.rm = TRUE) colCummaxs(x, na.rm = TRUE) colCummins(x, na.rm = TRUE) colCumprods(x, na.rm = TRUE) } ################################################################################ timeSeries/inst/unitTests/runit.methods-summary.R0000755000176200001440000000163114263246021021767 0ustar liggesusers # Rmetrics is free software; you can redistribute it and/or # modify it under the terms of the GNU Library General Public # License as published by the Free Software Foundation; either # version 2 of the License, or (at your option) any later version. # # Rmetrics is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU Library General Public License for more details. # # You should have received a copy of the GNU Library General # Public License along with this library; if not, write to the # Free Foundation, Inc., 59 Temple Place, Suite 330, Boston, # MA 02111-1307 USA ################################################################################ test.summary <- function() { NA } ################################################################################ timeSeries/inst/unitTests/runit.TimeSeriesCoercion.R0000755000176200001440000001554114263246021022371 0ustar liggesusers # Rmetrics is free software; you can redistribute it and/or # modify it under the terms of the GNU Library General Public # License as published by the Free Software Foundation; either # version 2 of the License, or (at your option) any later version. # # Rmetrics is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU Library General Public License for more details. # # You should have received a copy of the GNU Library General # Public License along with this library; if not, write to the # Free Foundation, Inc., 59 Temple Place, Suite 330, Boston, # MA 02111-1307 USA ################################################################################ test.asTimeSeries = function() { # as.timeSeries.default - Returns the input # as.timeSeries.numeric - Transforms a numeric vector into a 'timeSeries' # as.timeSeries.data.frame - Transformas a 'data.frame' into a 'timeSeries' # as.timeSeries.matrix - Trasformas a 'matrix' into a 'timeSeries' # as.timeSeries.ts - Tranf orms a 'ts' object into a 'timeSeries' # as.timeSeries.character - Loads and transformas from a demo file # as.timeSeries.zoo - Transforms a 'zoo' object into a 'timeSeries' # Create timeSeries Object: RNGkind(kind = "Marsaglia-Multicarry", normal.kind = "Inversion") set.seed(4711, kind = "Marsaglia-Multicarry") data = round(rnorm(12), 3) charvec = timeCalendar(2006) uTS = timeSeries(data, charvec, units = "uTS") uTS checkTrue(inherits(uTS, "timeSeries")) checkTrue(is.timeSeries(uTS)) # Check Positions: positions = timeCalendar() class(positions) whichFormat(format(positions)) whichFormat(as.character(positions)) # Data Input is a Vector - Returns a timeSeries with dummy positions: RNGkind(kind = "Marsaglia-Multicarry", normal.kind = "Inversion") set.seed(4711, kind = "Marsaglia-Multicarry") x = rnorm(12) # as.numeric - add dummy dates: data = as.numeric(x) tS = as.timeSeries(data) head(tS) # as. numeric [as.vector] - add dummy dates: data = as.vector(x) tS = as.timeSeries(data) head(tS) # Data Inpiut is a data.frame: data(MSFT) x.df = as.data.frame(MSFT) head(x.df) # First Column holds Positions: tS = MSFT head(tS) # Missing Positions - return signal series # x.df = msft.dat[, -1] # head(x.df) # tS = as.timeSeries(x.df) # head(tS) # Data Input is a Matrix: data(MSFT) x.mat = as.matrix(MSFT) # tS = as.timeSeries(x.mat) # head(tS) # CHECK # Data Input is an Univariate/Muiltivariate timeSeries: x = MSFT class(x) tS = as.timeSeries(x) head(tS) # Note, data is a demo file ... tS = MSFT head(tS) # Return Value: return() } # ------------------------------------------------------------------------------ test.asTimeSeriesDJ1 = function() { # Load Data: # use instead dummy data set just for testing ... Data = matrix(exp(cumsum(rnorm(30*100, sd = 0.1))), ncol = 30) Positions = format(timeSequence("2006-01-01", length.out = 100)) DowJones30 = data.frame(Positions, Data) # Taking Dates from First Column: DJ = DowJones30[21:30, c(1, 11:15)] DJ class(DJ) as.timeSeries(DJ) # Adding Dates through Rownames Assignment: DJ = DowJones30[21:30, c(11:15)] rownames(DJ)<-DowJones30[21:30, 1] DJ as.timeSeries(DJ) # Missing Dates - Using Dummy Dates: DJ = DowJones30[21:30, c(11:15)] DJ class(DJ) as.timeSeries(DJ) # With recordIDs: if (FALSE) { DJ = DowJones30[21:30, c(1,11:15)] DJ = cbind(DJ, LETTERS[1:10]) class(DJ) tsDJ = as.timeSeries(DJ) tsDJ tsDJ@recordIDs } DJ = DowJones30[21:30, c(11:15)] rownames(DJ) = DowJones30[21:30, 1] DJ = cbind(DJ, LETTERS[1:10]) tsDJ = as.timeSeries(DJ) tsDJ tsDJ@recordIDs DJ = DowJones30[21:30, c(11:15)] DJ =cbind(DJ, LETTERS[1:10]) tsDJ = as.timeSeries(DJ) tsDJ tsDJ@recordIDs # Return Value: return() } # ------------------------------------------------------------------------------ test.fromTimeSeriesUV = function() { if (FALSE) { # DW has to be fixed ... # as.vector.timeSeries - Converts a univariate 'timeSeries' to a vector # as.matrix.timeSeries - Converts a 'timeSeries' to a 'matrix' # as.data.frame.timeSeries - Converts a 'timeSeries' to a 'data.frame' # as.ts.timeSeries - Converts a 'timeSeries' to a 'ts' # Univariate Case: RNGkind(kind = "Marsaglia-Multicarry", normal.kind = "Inversion") set.seed(4711, kind = "Marsaglia-Multicarry") data = round(rnorm(12), 3) charvec = timeCalendar(2006) uTS = timeSeries(data, charvec, units = "uTS") uTS # Vector: VEC = as.vector(uTS) head(VEC) class(VEC) checkIdentical(class(VEC), "numeric") # Numeric: # VEC = as.numeric(uTS) # Not implemented ! # head(VEC) # class(VEC) # checkIdentical(class(VEC), "numeric") # Matrix: MAT = as.matrix(uTS) head(MAT) class(MAT) checkIdentical(class(MAT), "matrix") # Data Frame: DF = as.data.frame(uTS) head(DF) checkIdentical(class(DF), "data.frame") # Time Series: TS = as.ts(uTS) head(TS) class(TS) checkIdentical(class(TS), "ts") } # Return Value: return() } # ------------------------------------------------------------------------------ test.fromTimeSeriesMV = function() { if (FALSE) { # DW has to be fixed ... # as.vector.timeSeries - Converts a univariate 'timeSeries' to a vector # as.matrix.timeSeries - Converts a 'timeSeries' to a 'matrix' # as.data.frame.timeSeries - Converts a 'timeSeries' to a 'data.frame' # as.ts.timeSeries - Converts a 'timeSeries' to a 'ts' # Multivariate Case: RNGkind(kind = "Marsaglia-Multicarry", normal.kind = "Inversion") set.seed(4711, kind = "Marsaglia-Multicarry") data = matrix(round(rnorm(24), 3), ncol = 2) charvec = timeCalendar(2006) mTS = timeSeries(data, charvec) mTS # Matrix: MAT = as.matrix(mTS) head(MAT) class(MAT) checkIdentical( target = class(MAT), current = "matrix") checkIdentical( target = as.vector(MAT[, 1]), current = as.numeric(MAT)[1:12]) # Data Frame: DF = as.data.frame(mTS) head(DF) class(DF) checkIdentical( target = class(DF), current = "data.frame") # Time Series: TS = as.ts(mTS) head(TS) class(TS) checkIdentical( target = class(TS), current = c("mts", "ts")) } # Return Value: return() } ################################################################################ timeSeries/inst/unitTests/runit.cor.R0000755000176200001440000000213514322333240017410 0ustar liggesusers # Rmetrics is free software; you can redistribute it and/or # modify it under the terms of the GNU Library General Public # License as published by the Free Software Foundation; either # version 2 of the License, or (at your option) any later version. # # Rmetrics is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU Library General Public License for more details. # # You should have received a copy of the GNU Library General # Public License along with this library; if not, write to the # Free Foundation, Inc., 59 Temple Place, Suite 330, Boston, # MA 02111-1307 USA ################################################################################ test.cor.timeSeries = function() { # RUnit Test: # Signal Series tS = dummyMonthlySeries(format = "counts") tS cor(tS) cov(tS) # timeDate Series: tS = dummyMonthlySeries() tS cor(tS) cov(tS) } ################################################################################ timeSeries/inst/unitTests/runit.na.contiguous.R0000755000176200001440000000245214263246021021427 0ustar liggesusers # Rmetrics is free software; you can redistribute it and/or # modify it under the terms of the GNU Library General Public # License as published by the Free Software Foundation; either # version 2 of the License, or (at your option) any later version. # # Rmetrics is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU Library General Public License for more details. # # You should have received a copy of the GNU Library General # Public License along with this library; if not, write to the # Free Foundation, Inc., 59 Temple Place, Suite 330, Boston, # MA 02111-1307 USA ################################################################################ test.na.contiguous = function() { ## Dummy timeSeries with NAs entries data1 <- matrix(c(NA, 1), ncol = 2) data2 <- matrix(rep(2, 4), ncol = 2) data3 <- matrix(c(NA, 3), ncol = 2) data4 <- matrix(rep(4, 4), ncol = 2) data <- rbind(data1, data2, data3, data4) ts <- timeSeries(data, timeCalendar()[1:6]) ## Find the longest consecutive non-missing values ans <- na.contiguous(ts) check <- getDataPart(ans) dimnames(check) <- NULL checkIdentical(data2, getDataPart(check)) } timeSeries/inst/unitTests/runit.align.R0000755000176200001440000000254714263246021017732 0ustar liggesusers # Rmetrics is free software; you can redistribute it and/or # modify it under the terms of the GNU Library General Public # License as published by the Free Software Foundation; either # version 2 of the License, or (at your option) any later version. # # Rmetrics is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU Library General Public License for more details. # # You should have received a copy of the GNU Library General # Public License along with this library; if not, write to the # Free Foundation, Inc., 59 Temple Place, Suite 330, Boston, # MA 02111-1307 USA ################################################################################ test.align.timeSeries <- function() { # RUnit Test: # .align.timeSeries(x, method = c("before", "after", "interp"), # startOn = "hours", by = "30 m") set.seed(1953) tD = timeCalendar( y = rep(2008, times = 6), m = rep(4, times = 6), d = rep(10:11, each = 3), h = sample(1:23)[1:6], min = sample(1:59)[1:6], s = sample(1:59)[1:6]) tS = timeSeries(rnorm(6), tD) align(tS) align(tS, method="interp") # Note, we should als add an argument to trim NAs } ################################################################################ timeSeries/inst/unitTests/Makefile0000755000176200001440000000042414550733426017016 0ustar liggesusersPKG=timeSeries TOP=../.. SUITE=doRUnit.R R=R all: inst test inst: # Install package -- but where ?? -- will that be in R_LIBS ? cd ${TOP}/..;\ ${R} CMD INSTALL ${PKG} test: # Run unit tests export RCMDCHECK=FALSE;\ cd ${TOP}/tests;\ ${R} --vanilla --slave < ${SUITE} timeSeries/inst/unitTests/runit.as.R0000755000176200001440000000253114322333240017230 0ustar liggesusers # Rmetrics is free software; you can redistribute it and/or # modify it under the terms of the GNU Library General Public # License as published by the Free Software Foundation; either # version 2 of the License, or (at your option) any later version. # # Rmetrics is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU Library General Public License for more details. # # You should have received a copy of the GNU Library General # Public License along with this library; if not, write to the # Free Foundation, Inc., 59 Temple Place, Suite 330, Boston, # MA 02111-1307 USA ################################################################################ test.as <- function() { # RUnit Test: # Note, you can also use ... is(timeSeries(), "timeSeries") # Series ts = dummyMonthlySeries() x = timeSeries:::.signalSeries(as.matrix(ts)) y = timeSeries:::.timeSeries(as.matrix(ts), as.numeric(time(ts), "sec")) # A vector to a timeSeries as.vector(x) as.vector(x[,1]) as.vector(y) as.vector(y[,1]) # as.numeric: as.numeric(x) as.numeric(x[,1]) as.numeric(y) as.numeric(y[,1]) } ################################################################################ timeSeries/inst/unitTests/runit.bind.R0000755000176200001440000000512314322333240017541 0ustar liggesusers # Rmetrics is free software; you can redistribute it and/or # modify it under the terms of the GNU Library General Public # License as published by the Free Software Foundation; either # version 2 of the License, or (at your option) any later version. # # Rmetrics is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU Library General Public License for more details. # # You should have received a copy of the GNU Library General # Public License along with this library; if not, write to the # Free Foundation, Inc., 59 Temple Place, Suite 330, Boston, # MA 02111-1307 USA ################################################################################ test.bind <- function() { Documentation <- as.character(date()) Title <- "Dummy Series" ts <- dummyMonthlySeries() ts@documentation <- Documentation ts@title <- Title # -------------------------------------------------------------------------- # if NULL are in args, result identical except @documentation !!! cts <- cbind(ts, NULL) rts <- rbind(ts, NULL) ##> checkTrue(!identical(slot(cts, "documentation")[[1]], Documentation)) ##> checkTrue(!identical(slot(rts, "documentation")[[1]], Documentation)) # ... DW [[1]] removes attributes, check this # ... also take care of the title! # check that the rest is identical cts@documentation <- Documentation rts@documentation <- Documentation cts@title <- Title rts@title <- Title checkIdentical(cts, ts) checkIdentical(rts, ts) # -------------------------------------------------------------------------- ts1 <- ts[seq(1, nrow(ts), by = 2),] ts0 <- ts[seq(2, nrow(ts), by = 2),] # test rbind checkTrue(all(time(rbind(ts1, ts0)) == c(time(ts1),time(ts0)))) # test cbind checkIdentical(as.vector(is.na(cbind(ts1, ts0))), c(rep(c(FALSE, TRUE), 12), rep(c(TRUE, FALSE), 12))) checkTrue(all(time(cbind(ts1, ts0)) == time(ts))) # -------------------------------------------------------------------------- # issues with single number element a <- timeSeries(1, as.Date(0, origin="2010-01-01") ) b <- timeSeries( 2:3, as.Date(1:2, origin="2010-01-01") ) d <- timeSeries( 2:10, as.Date(1:9, origin="2010-01-01") ) cbind(a, b) cbind(b, a) cbind(b, d) cbind(d, b) cbind(a, 1) cbind(b, 1) cbind(a, matrix(1)) cbind(b, matrix(1)) } ################################################################################ timeSeries/inst/unitTests/runit.order.R0000755000176200001440000000266214263246021017751 0ustar liggesusers # Rmetrics is free software; you can redistribute it and/or # modify it under the terms of the GNU Library General Public # License as published by the Free Software Foundation; either # version 2 of the License, or (at your option) any later version. # # Rmetrics is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU Library General Public License for more details. # # You should have received a copy of the GNU Library General # Public License along with this library; if not, write to the # Free Foundation, Inc., 59 Temple Place, Suite 330, Boston, # MA 02111-1307 USA ################################################################################ test.order <- function() { # RUnit Test: tS = timeSeries(matrix(rnorm(500), 100), units = sample(LETTERS[1:5])) head(tS) colnames(tS) sortColnames(tS) sampleColnames(tS) orderColnames(tS) statsColnames(tS, FUN = colMeans) pcaColnames(tS) hclustColnames(tS) tS = timeSeries(matrix(rnorm(500), 100), units = sample(LETTERS[1:5]), format = "counts") head(tS) colnames(tS) sortColnames(tS) sampleColnames(tS) orderColnames(tS) statsColnames(tS, FUN = colMeans) pcaColnames(tS) hclustColnames(tS) } ################################################################################ timeSeries/inst/unitTests/runit.lag.R0000755000176200001440000000305214322333240017367 0ustar liggesusers # Rmetrics is free software; you can redistribute it and/or # modify it under the terms of the GNU Library General Public # License as published by the Free Software Foundation; either # version 2 of the License, or (at your option) any later version. # # Rmetrics is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU Library General Public License for more details. # # You should have received a copy of the GNU Library General # Public License along with this library; if not, write to the # Free Foundation, Inc., 59 Temple Place, Suite 330, Boston, # MA 02111-1307 USA ################################################################################ test.lag <- function() { # RUnit Test: tS = round(dummyMonthlySeries(flormat = "counts"), 3)[, 1] tS lag(tS) lag(tS, k = -2:2) lag(tS, k = -2:2, trim = TRUE) tS = round(dummyMonthlySeries(), 3)[, 1] tS lag(tS) lag(tS, k = -2:2) lag(tS, k = -2:2, trim = TRUE) # check colnames when using multiple lag indexes. data <- matrix(runif(12), ncol = 2) charvec <- rev(paste("2009-0", 1:6, "-01", sep = "")) S <- timeSeries(data, charvec) colnames(S) <- paste("S", 1:2, sep = ".") ts <- lag(S, -1:1) checkIdentical(colnames(ts), c("S.1[-1]", "S.1[0]", "S.1[1]", "S.2[-1]", "S.2[0]", "S.2[1]")) } ################################################################################ timeSeries/inst/unitTests/runit.apply.R0000755000176200001440000000243414263246021017760 0ustar liggesusers # Rmetrics is free software; you can redistribute it and/or # modify it under the terms of the GNU Library General Public # License as published by the Free Software Foundation; either # version 2 of the License, or (at your option) any later version. # # Rmetrics is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU Library General Public License for more details. # # You should have received a copy of the GNU Library General # Public License along with this library; if not, write to the # Free Foundation, Inc., 59 Temple Place, Suite 330, Boston, # MA 02111-1307 USA ################################################################################ test.apply <- function() { x = timeSeries(rnorm(90), timeSequence(length.out = 90)) fapply applySeries <- function(x, from = NULL, to = NULL, by = c("monthly", "quarterly"), FUN = colMeans, units = NULL, format = x@format, zone = x@FinCenter, FinCenter = x@FinCenter, recordIDs = data.frame(), title = x@title, documentation = x@documentation, ...) applySeries(x, from = start(x), to = end(x)) } ################################################################################ timeSeries/inst/unitTests/runit.spreads.R0000755000176200001440000000200514322333240020262 0ustar liggesusers # Rmetrics is free software; you can redistribute it and/or # modify it under the terms of the GNU Library General Public # License as published by the Free Software Foundation; either # version 2 of the License, or (at your option) any later version. # # Rmetrics is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU Library General Public License for more details. # # You should have received a copy of the GNU Library General # Public License along with this library; if not, write to the # Free Foundation, Inc., 59 Temple Place, Suite 330, Boston, # MA 02111-1307 USA ################################################################################ test.spreads <- function() { # RUnit Test: tS = dummyMonthlySeries(units = c("Bid", "Ask")) head(tS) midquotes(tS) spreads(tS) } ################################################################################ timeSeries/inst/unitTests/runit.rowCum.R0000755000176200001440000000163014263246021020104 0ustar liggesusers # Rmetrics is free software; you can redistribute it and/or # modify it under the terms of the GNU Library General Public # License as published by the Free Software Foundation; either # version 2 of the License, or (at your option) any later version. # # Rmetrics is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU Library General Public License for more details. # # You should have received a copy of the GNU Library General # Public License along with this library; if not, write to the # Free Foundation, Inc., 59 Temple Place, Suite 330, Boston, # MA 02111-1307 USA ################################################################################ test.rowCum <- function() { NA } ################################################################################ timeSeries/inst/unitTests/runit.TimeSeriesClass.R0000755000176200001440000002602014263246021021667 0ustar liggesusers # Rmetrics is free software; you can redistribute it and/or # modify it under the terms of the GNU Library General Public # License as published by the Free Software Foundation; either # version 2 of the License, or (at your option) any later version. # # Rmetrics is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU Library General Public License for more details. # # You should have received a copy of the GNU Library General # Public License along with this library; if not, write to the # Free Foundation, Inc., 59 Temple Place, Suite 330, Boston, # MA 02111-1307 USA ################################################################################ test.timeSeries = function() { # timeSeries - Creates a 'timeSeries' object from scratch # Settings: setRmetricsOptions(myFinCenter = "GMT") set.seed(4711) data = matrix(round(rnorm(12), 3)) data class(data) charvec = format(timeCalendar(2006)) charvec class(charvec) # Compose Univariate daily random sequence setRmetricsOptions(myFinCenter = "GMT") uTS = timeSeries(data, charvec, units = "uTS") series(uTS) print(uTS) # FinCenter Functionality: timeSeries(data, charvec, units = "uTS", zone = "GMT", FinCenter = "GMT") timeSeries(data, charvec, units = "uTS", zone = "Zurich", FinCenter = "Zurich") timeSeries(data, charvec, units = "uTS", zone = "GMT", FinCenter = "Zurich") timeSeries(data, charvec, units = "uTS", zone = "Zurich", FinCenter = "GMT") # Return Value: return() } # ------------------------------------------------------------------------------ test.readSeries = function() { # readSeries - Reads from a spreadsheet and creates a 'timeSeries' # Load Microsoft Data: data(MSFT) MSFT.df = as.data.frame(MSFT) # Read Data Frame: write.table(MSFT.df, file = "msft.dat.csv", sep = ";") read.table("msft.dat.csv", sep = ";") # Read Time Series: # X = readSeries("msft.dat.csv") # X = X[1:12, ] # class(X) # Show Part of Series: # head(X)[, 1:5] # head(X[, 1:5]) # head(X[, 1:5], 2) # Return Value: return() } # ------------------------------------------------------------------------------ test.returns = function() { # returns - Computes returns from a 'timeSeries' object # Load Time Series: X = MSFT head(X) # returns : OPEN = X[, 1] print(OPEN) MSFT.RET = returns(OPEN) print(MSFT.RET) # Return Value: return() } # ------------------------------------------------------------------------------ test.applySeries = function() { # applySeries - Applies a function to blocks of a 'timeSeries' NA # Return Value: return() } # ------------------------------------------------------------------------------ test.orderStatistics = function() { # orderStatistics - Compute order statistic of a 'timeSeries' # Load Data: X = MSFT head(X) # returns: OPEN = X[, 1] print(OPEN) # ORDER STATISTICS: orderStatistics(OPEN) orderStatistics(X[, -5]) orderStatistics(X[, -5])$Open # Return Value: return() } # ------------------------------------------------------------------------------ test.series = function() { # series - Extracts data slot from 'timeSeries' object # Load Microsoft Data: X = MSFT X = X[1:12, ] class(X) # Return Series: OPEN = X[, 1] OPEN returns(OPEN) # Volatility Series: abs(returns(OPEN)) # Data Matrix: series(OPEN) Y = series(X) Y class(Y) # Position Vector: PO = time(OPEN) PO PX = time(X) PX class(PX) checkEquals( target = sum(as.integer(PO - PX)), current = 0) # Return Value: return() } # ------------------------------------------------------------------------------ test.isUnivariate = function() { # isUnivariate Tests if an object of class 'timeSeries' is univariate # Load Microsoft Data: X = MSFT OPEN = X[, 1] # Is Univariate? checkTrue(!isUnivariate(X)) checkTrue(isUnivariate(OPEN)) checkTrue(isMultivariate(X)) checkTrue(!isMultivariate(OPEN)) # Return Value: return() } # ------------------------------------------------------------------------------ test.isMultivariate = function() { # isMultivariate - Tests if an object of class 'timeSeries' is multivariate # Load Microsoft Data: X = MSFT OPEN = X[, 1] # Is Multivariate? checkTrue(isMultivariate(X)) checkTrue(!isMultivariate(OPEN)) # Return Value: return() } # ------------------------------------------------------------------------------ test.displayMethods = function() { # print.timeSeries Print method for a 'timeSeries' object # plot.timeSeries Plot method for a 'timeSeries' object # lines.timeSeries Lines method for a 'timeSeries' object # points.timeSeries Points method for a 'timeSeries' object ## FIXME(MM) - if we store this -- make it a package data set! ## Microsoft Data: ## MSFT.df = data.frame(matrix(c( ## 20010326, 57.1250, 57.5000, 55.5625, 56.0625, 31559300, ## 20010327, 56.0625, 58.5625, 55.8750, 58.2500, 47567800, ## 20010328, 57.3750, 57.9375, 55.3750, 55.5625, 39340800, ## 20010329, 55.3750, 57.1875, 54.5625, 55.3750, 43492500, ## 20010330, 55.7500, 56.1875, 53.8750, 54.6875, 45600800, ## 20010402, 54.8125, 56.9375, 54.6250, 55.8125, 37962000, ## 20010403, 55.3125, 55.3125, 52.7500, 53.3750, 47093800, ## 20010404, 53.3750, 55.0000, 51.0625, 51.9375, 52023300, ## 20010405, 53.7500, 57.3750, 53.5000, 56.7500, 56682000, ## 20010406, 56.3750, 57.1875, 55.0625, 56.1875, 46311000, ## 20010409, 56.5700, 57.4200, 55.6600, 57.1500, 28147800, ## 20010410, 57.9500, 60.0900, 57.7800, 59.6800, 54599700, ## 20010411, 60.6500, 61.5000, 59.7000, 60.0400, 54939800, ## 20010412, 59.5600, 62.3100, 59.3500, 62.1800, 43760000, ## 20010416, 61.4000, 61.5800, 60.1200, 60.7900, 32928700, ## 20010417, 60.5200, 62.1100, 60.0400, 61.4800, 42574600, ## 20010418, 63.3900, 66.3100, 63.0000, 65.4300, 78348200, ## 20010419, 65.8100, 69.0000, 65.7500, 68.0400, 79687800, ## 20010420, 70.3000, 71.1000, 68.5000, 69.0000, 96459800, ## 20010423, 68.1100, 68.4700, 66.9000, 68.2500, 46085600, ## 20010424, 68.2000, 69.9300, 67.1400, 67.5500, 44588300, ## 20010425, 67.5700, 69.7900, 67.2500, 69.6900, 38372000, ## 20010426, 70.0700, 71.0000, 68.2500, 69.1300, 59368800, ## 20010427, 69.5300, 69.6800, 66.2100, 67.1200, 60786200, ## 20010430, 68.5300, 69.0600, 67.6800, 67.7500, 37184100, ## 20010501, 67.6600, 70.3000, 67.6000, 70.1700, 41851400, ## 20010502, 71.0000, 71.1500, 69.3500, 69.7600, 46432200, ## 20010503, 69.2500, 70.1800, 68.1400, 68.5300, 33136700, ## 20010504, 68.0000, 71.0500, 67.9600, 70.7500, 59769200, ## 20010507, 70.8300, 72.1500, 70.7000, 71.3800, 54678100), ## byrow = TRUE, ncol = 6)) ## colnames(MSFT.df) = c("YYMMDD", "Open", "High", "Low", "Close", "Volume") # Data: X = MSFT X = X[1:12, ] OPEN = X[, 1] # Print: print(X) print(OPEN) # Plot: par(mfrow = c(1, 1)) plot(OPEN, type = "l") # GMT - Plot: tC = timeCalendar(2006, 1, 1, 0:23, 0, 0, zone = "GMT", FinCenter = "GMT") tS = timeSeries(data = matrix(rnorm(24), ncol = 1), charvec = tC) plot(tS) # Zurich - Plot: tC = timeCalendar(2006, 1, 1, 0:23, 0, 0, zone = "GMT", FinCenter = "Zurich") tS = timeSeries(data = matrix(rnorm(24), ncol = 1), charvec = tC, zone = "GMT", FinCenter = "Zurich") plot(tS) # New York - Plot: tC = timeCalendar(2006, 1, 1, 0:23, 0, 0, zone = "GMT", FinCenter = "NewYork") tS = timeSeries(data = matrix(rnorm(24), ncol = 1), charvec = tC, zone = "GMT", FinCenter = "NewYork") plot(tS, type = "h") lines (tS, col = "red", lty = 3) points(tS, col = "blue", pch = 19) abline(h=0, col = "grey") # Return Value: return() } # ------------------------------------------------------------------------------ test.dummyDailySeries = function() { # dummyDailySeries - Creates a dummy daily 'timeSeries' object # Create Dummy Time Series: setRmetricsOptions(myFinCenter = "GMT") tS = dummyDailySeries(matrix(rnorm(12))) print(tS) # Return Value: return() } # ------------------------------------------------------------------------------ test.alignDailySeries = function() { # alignDailySeries - Aligns a 'timeSeries' object to new positions # Time Series: setRmetricsOptions(myFinCenter = "GMT") tS = MSFT[1:25, ] print(tS) dim(tS) # Align Daily Series: alignDailySeries(tS, method = "interp") # Align Daily Series: alignDailySeries(tS, method = "fillNA") # Align Daily Series: alignDailySeries(tS, method = "fillNA", include.weekends = TRUE) # Return Value: return() } # ------------------------------------------------------------------------------ ## DW > ## test.ohlcDailyPlot = ## function() ## { ## # ohlcDailyPlot - Plots openhighlowclose bar chart ## ## # Price or Incdex Series: ## setRmetricsOptions(myFinCenter = "GMT") ## tS = MSFT[1:25, ] ## print(tS) ## dim(tS) ## colnames(tS) ## ## # Graph Frame: ## par(mfrow = c(2, 1), cex = 0.7) ## ohlcDailyPlot(tS) ## ## # Return Value: ## return() ## } # ------------------------------------------------------------------------------ test.modelSeries = function() { if (FALSE) { # Move to fArma ... # Undocumented Material: Matrix = cbind(X = rnorm(10), Y = rnorm(10)) Matrix = cbind(Matrix, Z = Matrix[, "Y"] - Matrix[, "X"]) TS = dummyDailySeries(Matrix, units = c("X", "Y", "Z") ) head(TS) .modelSeries(Y ~ ar(2), data = TS, lhs = TRUE) .modelSeries(log(abs(Z)) ~ lm(X + sin(Y)), data = TS, fake = TRUE) .modelSeries(log(abs(Z)) ~ lm(X + sin(Y)), data = TS, lhs = TRUE) .modelSeries(Y ~ ar(2), data = as.data.frame(TS), lhs = TRUE) .modelSeries(log(abs(Z)) ~ lm(X + sin(Y)), data = TS, fake = TRUE) .modelSeries(log(abs(Z)) ~ lm(X + sin(Y)), data = TS, lhs = TRUE) require(timeSeries) .modelSeries(Y ~ ar(2), data = rnorm(10)) .modelSeries(Y ~ ar(2), data = as.ts(rnorm(10))) .modelSeries(x ~ arima(2, 0, 1), data = armaSim(n=10)) .modelSeries(~ ar(2), rnorm(10)) # attach(TS) # CHECK # .modelSeries(Y ~ ar(2), lhs = TRUE) .modelSeries(Y ~ ar(2) + garch(1,1), data = rnorm(10)) .modelSeries(Y ~ ar(2) + garch(1,1), data = rnorm(10), lhs = TRUE) .modelSeries(Y ~ ar(2) + garch(1,1), data = TS, lhs = TRUE) } else { NA } # Return Value: return() } ################################################################################ timeSeries/inst/unitTests/runit.NA.R0000755000176200001440000000653614263246021017140 0ustar liggesusers # Rmetrics is free software; you can redistribute it and/or # modify it under the terms of the GNU Library General Public # License as published by the Free Software Foundation; either # version 2 of the License, or (at your option) any later version. # # Rmetrics is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU Library General Public License for more details. # # You should have received a copy of the GNU Library General # Public License along with this library; if not, write to the # Free Foundation, Inc., 59 Temple Place, Suite 330, Boston, # MA 02111-1307 USA ################################################################################ test.removeNA = function() { # Create matrix object: set.seed(1985) M = 5 N = 20 x = matrix(round(rnorm(M*N), 3), ncol = M) colnames(x) = 1:M rownames(x) = 1:N nNA = 10 nCol = trunc(runif(nNA, 1, M+1)) nRow = trunc(runif(nNA, 1, N+1)) for (i in 1:nNA) x[nRow[i], nCol[i]] = NA print(x) ans = removeNA(x) print(ans) # Create data.frame object: x.df = as.data.frame(x) class(x.df) ans = removeNA(x.df) print(ans) class(ans) # Create timeSeries object: tD = timeCalendar(m = 1, d = 1:N) x.tS = timeSeries(x, tD) print(x.tS) ans = removeNA(x.tS) print(ans) class(ans) # Return Value: return() } # ------------------------------------------------------------------------------ test.substituteNA = function() { # Create matrix object: set.seed(1985) M = 5 N = 20 x = matrix(round(rnorm(M*N), 3), ncol = M) colnames(x) = 1:M rownames(x) = 1:N nNA = 10 nCol = trunc(runif(nNA, 1, M+1)) nRow = trunc(runif(nNA, 1, N+1)) for (i in 1:nNA) x[nRow[i], nCol[i]] = NA print(x) # Substitute: ans = substituteNA(x) print(ans) ans = substituteNA(x, "mean") print(ans) ans = substituteNA(x, "median") print(ans) # Create data.frame object: x.df = as.data.frame(x) print(x.df) class(x.df) # Substitute: ans = substituteNA(x.df) print(ans) ans = substituteNA(x.df, "mean") print(ans) ans = substituteNA(x.df, "median") print(ans) # Create timeSeries object: tD = timeCalendar(m = 1, d = 1:N) x.tS = timeSeries(x, tD) print(x.tS) class(x.tS) # Substitute: ans = substituteNA(x.tS) print(ans) ans = substituteNA(x.tS, "mean") print(ans) ans = substituteNA(x.tS, "median") print(ans) # Return Value: return() } # ------------------------------------------------------------------------------ test.interpNA = function() { # Interpolate Column-by-Column # Create matrix object: set.seed(1985) M = 5 N = 20 x = matrix(round(rnorm(M*N), 3), ncol = M) colnames(x) = 1:M rownames(x) = 1:N nNA = 10 nCol = trunc(runif(nNA, 1, M+1)) nRow = trunc(runif(nNA, 1, N+1)) for (i in 1:nNA) x[nRow[i], nCol[i]] = NA print(x) # Interpolate: ans = interpNA(x, "linear") print(ans) ans = interpNA(x, "before") print(ans) ans = interpNA(x, "after") print(ans) # Return Value: return() } ################################################################################ timeSeries/inst/unitTests/runit.time.R0000755000176200001440000000162614263246021017573 0ustar liggesusers # Rmetrics is free software; you can redistribute it and/or # modify it under the terms of the GNU Library General Public # License as published by the Free Software Foundation; either # version 2 of the License, or (at your option) any later version. # # Rmetrics is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU Library General Public License for more details. # # You should have received a copy of the GNU Library General # Public License along with this library; if not, write to the # Free Foundation, Inc., 59 Temple Place, Suite 330, Boston, # MA 02111-1307 USA ################################################################################ test.time <- function() { NA } ################################################################################ timeSeries/inst/unitTests/runit.returns.R0000755000176200001440000000163114263246021020333 0ustar liggesusers # Rmetrics is free software; you can redistribute it and/or # modify it under the terms of the GNU Library General Public # License as published by the Free Software Foundation; either # version 2 of the License, or (at your option) any later version. # # Rmetrics is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU Library General Public License for more details. # # You should have received a copy of the GNU Library General # Public License along with this library; if not, write to the # Free Foundation, Inc., 59 Temple Place, Suite 330, Boston, # MA 02111-1307 USA ################################################################################ test.returns <- function() { NA } ################################################################################ timeSeries/inst/unitTests/runit.TimeSeriesData.R0000755000176200001440000002416514263246021021503 0ustar liggesusers # Rmetrics is free software; you can redistribute it and/or # modify it under the terms of the GNU Library General Public # License as published by the Free Software Foundation; either # version 2 of the License, or (at your option) any later version. # # Rmetrics is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU Library General Public License for more details. # # You should have received a copy of the GNU Library General # Public License along with this library; if not, write to the # Free Foundation, Inc., 59 Temple Place, Suite 330, Boston, # MA 02111-1307 USA ################################################################################ test.diffTimeSeries = function() { # diff.timeSeries - Differences a 'timeSeries' object # Univariate Series: # Multivariate Data Set: set.seed(4711) data = cbind(RNORM = round(rnorm(6), 2)) charvec = timeCalendar()[1:6] recordIDs = data.frame(IDs = LETTERS[1:6]) uTS = timeSeries(data, charvec, recordIDs = recordIDs) uTS uTS@recordIDs # Differencing over 1 lag X = diff(x = uTS, lag = 1, diff = 1, trim = FALSE, pad = NA) X X@recordIDs # X = diff(x = uTS, lag = 1, diff = 1, trim = TRUE, pad = NA) # X # X@recordIDs X = diff(x = uTS, lag = 1, diff = 1, trim = FALSE, pad = 0) X X@recordIDs # Differencing over 2 lags X = diff(x = uTS, lag = 2, diff = 1, trim = FALSE, pad = NA) X X@recordIDs # X = diff(x = uTS, lag = 2, diff = 1, trim = TRUE, pad = NA) # X # X@recordIDs X = diff(x = uTS, lag = 2, diff = 1, trim = FALSE, pad = 0) X X@recordIDs # Differencing twice: # X = diff(x = uTS, lag = 1, diff = 2, trim = FALSE, pad = NA) #ERROR # X # X@recordIDs # X = diff(x = uTS, lag = 2, diff = 2, trim = FALSE, pad = NA) # ERROR # X # X@recordIDs # X = diff(x = uTS, lag = 1, diff = 2, trim = TRUE, pad = NA) # X # X@recordIDs # X = diff(x = uTS, lag = 2, diff = 2, trim = TRUE, pad = NA) # X # X@recordIDs # Return Value: return() } # ------------------------------------------------------------------------------ test.lagTimeSeries = function() { # lag.timeSeries - Lags a 'timeSeries' object # Univariate Series: set.seed(4711) data = cbind(RNORM = round(rnorm(6), 2)) charvec = timeCalendar()[1:6] recordIDs = data.frame(IDs = LETTERS[1:6]) uTS = timeSeries(data, charvec, recordIDs = recordIDs) # Multivariate Data Set: set.seed(4711) data = cbind(round(rnorm(12), 2), round(rt(12, df = 4), 2) ) charvec = format(timeCalendar(2006)) mTS = timeSeries(data, charvec, units = c("RNORM", "RT")) mTS # Time Series Lags: X = lag(x = uTS, k = 1, trim = FALSE, units = NULL) X X@recordIDs X = lag(x = uTS, k = c(2,4), trim = FALSE, units = NULL) X X@recordIDs X = lag(x = uTS, k = c(2,4), trim = TRUE, units = NULL) X X@recordIDs X = lag(x = uTS, k = -1:1, trim = FALSE, units = LETTERS[1:3]) X X@recordIDs # Multivariaye Series: diff(mTS, 1, 1) lag(mTS, 1) # Return Value: return() } # ------------------------------------------------------------------------------ test.mergeTimeSeries = function() { # merge.timeSeries - Merges two 'timeSeries' objects # scale.timeSeries - Centers and/or scales a 'timeSeries' object # summary.timeSeries - Summarizes a 'timeDate' object # var.timeSeries - Returns variance for a 'timeSeries' object # Univariate Series: set.seed(4711) data = cbind(RNORM = round(rnorm(6), 2)) charvec = timeCalendar()[1:6] recordIDs = data.frame(IDs = LETTERS[1:6]) uTS = timeSeries(data, charvec, recordIDs = recordIDs) # Merge: X = uTS Y = log(abs(uTS)) merge(x = X, y = Y, units = "One column") colnames(Y) <- "log" merge(x = X, y = Y, units = c("RN", "logAbsRN")) merge(x = X[-6,], y = Y[-3,], units = c("RN", "logAbsRN")) merge(x = X[2:5,], y = Y[4:6,], units = c("RN", "logAbsRN")) # Return Value: return() } # ------------------------------------------------------------------------------ test.scaleTimeSeries = function() { # scale.timeSeries - Centers and/or scales a 'timeSeries' object # Univariate Series: set.seed(4711) data = cbind(RNORM = round(rnorm(6), 2)) charvec = timeCalendar()[1:6] recordIDs = data.frame(IDs = LETTERS[1:6]) uTS = timeSeries(data, charvec, recordIDs = recordIDs) # Multivariate Data Set: set.seed(4711) data = cbind(round(rnorm(12), 2), round(rt(12, df = 4), 2) ) charvec = format(timeCalendar(2006)) mTS = timeSeries(data, charvec, units = c("RNORM", "RT")) # Scale: scale(uTS) scale(mTS) # Return Value: return() } # ------------------------------------------------------------------------------ test.summaryTimeSeries = function() { # summary.timeSeries - Summarizes a 'timeDate' object # Univariate Series: set.seed(4711) data = cbind(RNORM = round(rnorm(6), 2)) charvec = timeCalendar()[1:6] recordIDs = data.frame(IDs = LETTERS[1:6]) uTS = timeSeries(data, charvec, recordIDs = recordIDs) # Multivariate Data Set: set.seed(4711) data = cbind(round(rnorm(12), 2), round(rt(12, df = 4), 2) ) charvec = format(timeCalendar(2006)) mTS = timeSeries(data, charvec, units = c("RNORM", "RT")) # Summary: summary(uTS) summary(mTS) # Return Value: return() } # ------------------------------------------------------------------------------ test.varTimeSeries = function() { # var.timeSeries - Returns variance for a 'timeSeries' object # Univariate Series: set.seed(4711) data = cbind(RNORM = round(rnorm(6), 2)) charvec = timeCalendar()[1:6] recordIDs = data.frame(IDs = LETTERS[1:6]) uTS = timeSeries(data, charvec, recordIDs = recordIDs) # Multivariate Data Set: set.seed(4711) data = cbind(round(rnorm(12), 2), round(rt(12, df = 4), 2) ) charvec = format(timeCalendar(2006)) mTS = timeSeries(data, charvec, units = c("RNORM", "RT")) # Covariance Matrix: var(x = uTS, y = NULL, na.rm = FALSE) var(x = mTS, y = NULL, na.rm = FALSE) # Note, using function cov() fails, since cov() requires an atomic # object as input. # Return Value: return() } # ------------------------------------------------------------------------------ test.mathOpsTimeSeries = function() { # Ops.timeSeries - Arith method for a 'timeSeries' object # abs.timeSeries - Returns abolute values of a 'timeSeries' object # sqrt.timeSeries - Returns sqrt values of a 'timeSeries' object # exp.timeSeries - Returns exponentials of a 'timeSeries' object # log.timeSeries - Returns logarithms of a 'timeSeries' object # quantile.timeSeries - produces sample quantiles of a 'timeSeries' object # Univariate Series: setRmetricsOptions(myFinCenter = "GMT") data = matrix(round(rnorm(12), 2)) charvec = format(timeCalendar(2006)) uTS = timeSeries(data, charvec, units = "RNORM") uTS # Multivariate Series: data = cbind(round(rnorm(12), 2), round(rt(12, df = 4), 2) ) charvec = format(timeCalendar(2006)) mTS = timeSeries(data, charvec, units = c("RNORM", "RT")) mTS # Univariate Ops: uTS < 0 uTS == abs(uTS) # Math Operations: uTS + 5 uTS - 5 100 * uTS uTS / 100 uTS^2 # mathematical Functions: log(abs(uTS)) sqrt(exp(uTS)) # Quantiles: quantile(uTS) quantile(uTS, probs = c(0.9, 0.95)) quantile(uTS, probs = c(0.9, 0.95), type = 5) # Logical Operations: mTS < 0 # Return Value: return() } # ------------------------------------------------------------------------------ test.subsetTimeSeries = function() { # [.timeSeries - subsets of a 'timeSeries' object # cut.timeSeries - cuts a block from a 'timeSeries' object # head.timeSeries - returns the head of a 'timeSeries' object # tail.timeSeries - returns the tail of a 'timeSeries' object # outlier.timeSeries - Removes outliers from a 'timeSeries' object # Univariate Series: setRmetricsOptions(myFinCenter = "GMT") data = matrix(round(rnorm(12), 2)) charvec = format(timeCalendar(2006)) uTS = timeSeries(data, charvec, units = "RNORM") uTS # Multivariate Series: data = cbind(round(rnorm(12), 2), round(rt(12, df = 4), 2) ) charvec = format(timeCalendar(2006)) mTS = timeSeries(data, charvec, units = c("RNORM", "RT")) mTS # Subsets: X = uTS[4:6, ] X X@recordIDs # Head and Tail: head(uTS) tail(uTS) head(mTS) tail(mTS) # Data Subsetting: mTS[, 1] # First Series mTS[4:6, 1] # Second Quarter # Return Value: return() } # ------------------------------------------------------------------------------ test.dimOpsTimeSeries = function() { # dim - Returns the dimension of a 'timeSeries' object # dimnames - Returns the dimension names of a 'timeSeries' object # colnames<-.timeS* - Assigns column names to a 'timeSeries' object # rownames<-.timeS* - Assigns row names to a 'timeSeries' object # is.array.timeSeries - Allows that NCOL and NROW work properly # Univariate Series: setRmetricsOptions(myFinCenter = "GMT") data = matrix(round(rnorm(12), 2)) charvec = format(timeCalendar(2006)) uTS = timeSeries(data, charvec, units = "RNORM") uTS # Multivariate Series: data = cbind(round(rnorm(12), 2), round(rt(12, df = 4), 2) ) charvec = format(timeCalendar(2006)) mTS = timeSeries(data, charvec, units = c("RNORM", "RT")) mTS # Dimension: dim(uTS) == c(12, 1) dimnames(uTS) # Column and Rownames: # X = uTS # colnames(X) = "X" # rownames(X) = as.character(timeCalendar()+24*3600) # X # series(X) # Array: is.array(uTS) # Number of Columns/Rows: NCOL(uTS) NROW(uTS) ncol(uTS) nrow(uTS) # Return Value: return() } ################################################################################ timeSeries/inst/unitTests/runit.signalCounts.R0000755000176200001440000000255714263246021021312 0ustar liggesusers # Rmetrics is free software; you can redistribute it and/or # modify it under the terms of the GNU Library General Public # License as published by the Free Software Foundation; either # version 2 of the License, or (at your option) any later version. # # Rmetrics is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU Library General Public License for more details. # # You should have received a copy of the GNU Library General # Public License along with this library; if not, write to the # Free Foundation, Inc., 59 Temple Place, Suite 330, Boston, # MA 02111-1307 USA ################################################################################ test.signalCounts <- function() { # RUnit Test: int = c(1, 10, 100, 21, 135) print(timeSeries:::.signalCounts(sample(int))) nc = timeSeries:::.signalCounts(int) nc ns = sample(nc) ns sorted = sort(ns) sorted as.integer(sorted) ns ordered = order(ns) ordered ns[ordered] as.integer(ns[ordered]) timeSeries:::.signalCounts(1:12) timeSeries:::.signalCounts(sample(1:12)) timeSeries:::.signalCounts(timeSeries:::.signalCounts(1:12)) } ################################################################################ timeSeries/inst/unitTests/runit.aggregate.R0000755000176200001440000000447414263246021020567 0ustar liggesusers # Rmetrics is free software; you can redistribute it and/or # modify it under the terms of the GNU Library General Public # License as published by the Free Software Foundation; either # version 2 of the License, or (at your option) any later version. # # Rmetrics is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU Library General Public License for more details. # # You should have received a copy of the GNU Library General # Public License along with this library; if not, write to the # Free Foundation, Inc., 59 Temple Place, Suite 330, Boston, # MA 02111-1307 USA ################################################################################ test.aggregate.timeSeries <- function() { # RUnit Test: # aggregate.timeSeries(x, by = c("monthly", "quarterly"), FUN = colMeans, # units = NULL, ...) # A daily Series: charvec <- timeSequence(length.out = 365) x <- timeSeries(rnorm(365), charvec) # Aggregate Returns Monthly: by <- unique(timeFirstDayInMonth(charvec)) aggregate(x, by, sum, units = "MonthReturns") # Count Monthly Records: aggregate(sign(abs(x)), end(charvec), sum, units = "NoOfRecords") # Aggregate Returns Quarterly: by <- unique(timeLastDayInQuarter(charvec)) aggregate(x, by, sum, units = "QrtReturns") # Another example x <- as.timeSeries(data(LPP2005REC))[,1:4] by <- timeSequence(from = "2006-01-01", to = "2008-01-01", by = "quarter") aggregate(x, by, mean) x <- timeSeries(seq(12), timeCalendar()) # relative from and to to make test work for future years ... from <- timeCalendar(y=getRmetricsOptions("currentYear") - 1, m=1, d=1) to <- timeCalendar(y=getRmetricsOptions("currentYear") + 1, m=1, d=1) by <- timeSequence( from = from, to = to, by = "quarter") x a <- aggregate(x, by, sum) a ### DW here are mismatches - corrected above ... checkEquals(sum(x[1]), a[1]) checkEquals(sum(x[2:4]), a[2]) checkEquals(sum(x[5:7]), a[3]) checkEquals(sum(x[8:10]), a[4]) checkEquals(sum(x[11:12]), a[5]) } ################################################################################ timeSeries/inst/unitTests/runit.methods-print.R0000755000176200001440000000162714263246021021433 0ustar liggesusers # Rmetrics is free software; you can redistribute it and/or # modify it under the terms of the GNU Library General Public # License as published by the Free Software Foundation; either # version 2 of the License, or (at your option) any later version. # # Rmetrics is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU Library General Public License for more details. # # You should have received a copy of the GNU Library General # Public License along with this library; if not, write to the # Free Foundation, Inc., 59 Temple Place, Suite 330, Boston, # MA 02111-1307 USA ################################################################################ test.print <- function() { NA } ################################################################################ timeSeries/inst/unitTests/runit.attach.R0000755000176200001440000000200214263246021020066 0ustar liggesusers # Rmetrics is free software; you can redistribute it and/or # modify it under the terms of the GNU Library General Public # License as published by the Free Software Foundation; either # version 2 of the License, or (at your option) any later version. # # Rmetrics is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU Library General Public License for more details. # # You should have received a copy of the GNU Library General # Public License along with this library; if not, write to the # Free Foundation, Inc., 59 Temple Place, Suite 330, Boston, # MA 02111-1307 USA ################################################################################ test.attach.timeSeries = function() { # RUnit Test: # Attach Signal Series tS = timeSeries() attach(tS) SS.1 detach(tS) } ################################################################################ timeSeries/inst/COPYING0000755000176200001440000004310714263246021014403 0ustar liggesusers GNU GENERAL PUBLIC LICENSE Version 2, June 1991 Copyright (C) 1989, 1991 Free Software Foundation, Inc. 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. Preamble The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users. This General Public License applies to most of the Free Software Foundation's software and to any other program whose authors commit to using it. (Some other Free Software Foundation software is covered by the GNU Library General Public License instead.) You can apply it to your programs, too. When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for this service if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs; and that you know you can do these things. To protect your rights, we need to make restrictions that forbid anyone to deny you these rights or to ask you to surrender the rights. These restrictions translate to certain responsibilities for you if you distribute copies of the software, or if you modify it. For example, if you distribute copies of such a program, whether gratis or for a fee, you must give the recipients all the rights that you have. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights. We protect your rights with two steps: (1) copyright the software, and (2) offer you this license which gives you legal permission to copy, distribute and/or modify the software. Also, for each author's protection and ours, we want to make certain that everyone understands that there is no warranty for this free software. If the software is modified by someone else and passed on, we want its recipients to know that what they have is not the original, so that any problems introduced by others will not reflect on the original authors' reputations. Finally, any free program is threatened constantly by software patents. We wish to avoid the danger that redistributors of a free program will individually obtain patent licenses, in effect making the program proprietary. To prevent this, we have made it clear that any patent must be licensed for everyone's free use or not licensed at all. The precise terms and conditions for copying, distribution and modification follow. GNU GENERAL PUBLIC LICENSE TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION 0. This License applies to any program or other work which contains a notice placed by the copyright holder saying it may be distributed under the terms of this General Public License. The "Program", below, refers to any such program or work, and a "work based on the Program" means either the Program or any derivative work under copyright law: that is to say, a work containing the Program or a portion of it, either verbatim or with modifications and/or translated into another language. (Hereinafter, translation is included without limitation in the term "modification".) Each licensee is addressed as "you". Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running the Program is not restricted, and the output from the Program is covered only if its contents constitute a work based on the Program (independent of having been made by running the Program). Whether that is true depends on what the Program does. 1. You may copy and distribute verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and give any other recipients of the Program a copy of this License along with the Program. You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee. 2. You may modify your copy or copies of the Program or any portion of it, thus forming a work based on the Program, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions: a) You must cause the modified files to carry prominent notices stating that you changed the files and the date of any change. b) You must cause any work that you distribute or publish, that in whole or in part contains or is derived from the Program or any part thereof, to be licensed as a whole at no charge to all third parties under the terms of this License. c) If the modified program normally reads commands interactively when run, you must cause it, when started running for such interactive use in the most ordinary way, to print or display an announcement including an appropriate copyright notice and a notice that there is no warranty (or else, saying that you provide a warranty) and that users may redistribute the program under these conditions, and telling the user how to view a copy of this License. (Exception: if the Program itself is interactive but does not normally print such an announcement, your work based on the Program is not required to print an announcement.) These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Program, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Program, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it. Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Program. In addition, mere aggregation of another work not based on the Program with the Program (or with a work based on the Program) on a volume of a storage or distribution medium does not bring the other work under the scope of this License. 3. You may copy and distribute the Program (or a work based on it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you also do one of the following: a) Accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, b) Accompany it with a written offer, valid for at least three years, to give any third party, for a charge no more than your cost of physically performing source distribution, a complete machine-readable copy of the corresponding source code, to be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, c) Accompany it with the information you received as to the offer to distribute corresponding source code. (This alternative is allowed only for noncommercial distribution and only if you received the program in object code or executable form with such an offer, in accord with Subsection b above.) The source code for a work means the preferred form of the work for making modifications to it. For an executable work, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the executable. However, as a special exception, the source code distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable. If distribution of executable or object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place counts as distribution of the source code, even though third parties are not compelled to copy the source along with the object code. 4. You may not copy, modify, sublicense, or distribute the Program except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense or distribute the Program is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance. 5. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Program or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Program (or any work based on the Program), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Program or works based on it. 6. Each time you redistribute the Program (or any work based on the Program), the recipient automatically receives a license from the original licensor to copy, distribute or modify the Program subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties to this License. 7. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Program at all. For example, if a patent license would not permit royalty-free redistribution of the Program by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Program. If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply and the section as a whole is intended to apply in other circumstances. It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system, which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice. This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License. 8. If the distribution and/or use of the Program is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Program under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License. 9. The Free Software Foundation may publish revised and/or new versions of the General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Program specifies a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of this License, you may choose any version ever published by the Free Software Foundation. 10. If you wish to incorporate parts of the Program into other free programs whose distribution conditions are different, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally. NO WARRANTY 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. END OF TERMS AND CONDITIONS How to Apply These Terms to Your New Programs If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms. To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively convey the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. Copyright (C) This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Also add information on how to contact you by electronic and paper mail. If the program is interactive, make it output a short notice like this when it starts in an interactive mode: Gnomovision version 69, Copyright (C) year name of author Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details. The hypothetical commands `show w' and `show c' should show the appropriate parts of the General Public License. Of course, the commands you use may be called something other than `show w' and `show c'; they could even be mouse-clicks or menu items--whatever suits your program. You should also get your employer (if you work as a programmer) or your school, if any, to sign a "copyright disclaimer" for the program, if necessary. Here is a sample; alter the names: Yoyodyne, Inc., hereby disclaims all copyright interest in the program `Gnomovision' (which makes passes at compilers) written by James Hacker. , 1 April 1989 Ty Coon, President of Vice This General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Library General Public License instead of this License.