DNAcopy/DESCRIPTION0000644000175200017520000000122014516030315014570 0ustar00biocbuildbiocbuildPackage: DNAcopy Title: DNA Copy Number Data Analysis Version: 1.76.0 Author: Venkatraman E. Seshan, Adam Olshen Description: Implements the circular binary segmentation (CBS) algorithm to segment DNA copy number data and identify genomic regions with abnormal copy number. Maintainer: Venkatraman E. Seshan LazyData: yes License: GPL (>= 2) biocViews: Microarray, CopyNumberVariation NeedsCompilation: yes git_url: https://git.bioconductor.org/packages/DNAcopy git_branch: RELEASE_3_18 git_last_commit: de0b0ad git_last_commit_date: 2023-10-24 Date/Publication: 2023-10-24 Packaged: 2023-10-24 21:02:05 UTC; biocbuild DNAcopy/NAMESPACE0000644000175200017520000000060714516003605014313 0ustar00biocbuildbiocbuilduseDynLib(DNAcopy) import(stats,graphics) importFrom("grDevices", "dev.cur", "dev.interactive", "dev.new") importFrom("utils", "data") export("CNA","exon.segment","getbdry","segment","segments.p","segments.summary","smooth.CNA","glFrequency","plotSample","zoomIntoRegion") S3method(print, CNA) S3method(plot, DNAcopy) S3method(print, DNAcopy) S3method(subset, CNA) S3method(subset, DNAcopy) DNAcopy/NEWS.md0000644000175200017520000000103414516003605014165 0ustar00biocbuildbiocbuild# DNAcopy 1.75.5 (10/08/2023) * Fixed the bug in passing weights for weighted segmentation # DNAcopy 1.75.4 (07/05/2023) * Updated the reference and source for Coriell data # DNAcopy 1.75.3 (06/29/2023) * Added init.c to register native (Fortran) routines and to disable symbol search * Gzipped cytoBand.tab and converted default.DNAcopy.bdry to rda file in data directory # DNAcopy 1.75.2 (06/27/2023) * Added a `NEWS.md` file to track changes to the package. * changed all dfloat in fortran to dble (Ripley email for CRAN/clinfun) DNAcopy/R/0000755000175200017520000000000014516003605013272 5ustar00biocbuildbiocbuildDNAcopy/R/DNAcopyMethods.R0000644000175200017520000003571414516003605016250 0ustar00biocbuildbiocbuildCNA <- function(genomdat, chrom, maploc, data.type=c("logratio","binary"), sampleid=NULL, presorted=FALSE) { if (is.data.frame(genomdat)) genomdat <- as.matrix(genomdat) if (!is.numeric(genomdat)) stop("genomdat must be numeric") if (!is.numeric(maploc)) stop("maploc must be numeric") data.type <- match.arg(data.type) ina <- (!is.na(chrom) & is.finite(maploc)) if (sum(!ina)>0) warning("markers with missing chrom and/or maploc removed\n") if (!presorted) { sortindex <- which(ina)[order(chrom[ina], maploc[ina])] } else { sortindex <- which(ina) } if (is.factor(chrom)) chrom <- as.character(chrom) # added to allow arrays of single dimension - results from data.frame ops if (is.array(genomdat)) { if (length(dim(genomdat)) == 1) { genomdat <- as.matrix(genomdat) } } if (is.vector(genomdat)) genomdat <- as.matrix(genomdat) if (!missing(sampleid)) { if (length(sampleid) != ncol(genomdat)) { warning("length(sampleid) and ncol(genomdat) differ, names ignored\n") sampleid <- paste("Sample", 1:ncol(genomdat)) } } else { sampleid <- paste("Sample", 1:ncol(genomdat)) } colnames(genomdat) <- sampleid zzz <- data.frame(chrom=I(chrom), maploc=maploc, genomdat) zzz <- zzz[sortindex,] # check for duplicate probes (i.e. repeated maploc within a chromosome) if (length(ii <- which(diff(maploc)==0)) > 0) { if (any(chrom[ii]==chrom[ii+1])) warning("array has repeated maploc positions\n") } attr(zzz, "data.type") <- data.type class(zzz) <- c("CNA","data.frame") zzz } subset.CNA <- function(x, chromlist=NULL, samplelist=NULL, ...) { if (!inherits(x, 'CNA')) stop("First arg must be of class CNA") chrom <- x$chrom uchrom <- unique(chrom) if (missing(chromlist)) chromlist <- uchrom if (length(setdiff(chromlist, uchrom)) > 0) stop("chromlist contains chromosomes not in the data") if (length(chromlist) > length(unique(chromlist))) warning("duplicate chromosomes in chromlist removed") sampleid <- colnames(x)[-(1:2)] if (missing(samplelist)) samplelist <- sampleid nsample <- length(sampleid) if (length(setdiff(samplelist, 1:nsample)) > 0 & length(setdiff(samplelist, sampleid)) > 0) stop("samplelist should be a list of valid sample numbers or names") if (!is.numeric(samplelist)) samplelist <- match(samplelist, names(x)) - 2 if (length(samplelist) > length(unique(samplelist))) warning("duplicate samples in samplelist removed") samplelist <- unique(samplelist) y <- x[chrom %in% chromlist,c(1:2,samplelist+2)] attr(y, "data.type") <- attr(x, "data.type") y } smooth.CNA <- function(x, smooth.region=10, outlier.SD.scale=4, smooth.SD.scale=2, trim=0.025) { if (!inherits(x, 'CNA')) stop("First arg must be of class CNA") nsample <- ncol(x)-2 chrom <- x$chrom uchrom <- unique(chrom) if(attr(x, "data.type")=="binary") stop("Not smoothing binary data ") for (isamp in 1:nsample) { genomdat <- x[,isamp+2] ina <- which(is.finite(genomdat)) trimmed.SD <- sqrt(trimmed.variance(genomdat[ina], trim)) outlier.SD <- outlier.SD.scale*trimmed.SD smooth.SD <- smooth.SD.scale*trimmed.SD k <- smooth.region n <- length(genomdat[ina]) cfrq <- diff(c(which(!duplicated(chrom[ina])), n+1)) nchr <- length(cfrq) # to allow for some chrom with all missing smoothed.data <- .Fortran("smoothLR", as.integer(n), as.double(genomdat[ina]), as.integer(nchr), as.integer(cfrq), sgdat=double(n), as.integer(k), as.double(outlier.SD), as.double(smooth.SD), PACKAGE = "DNAcopy")$sgdat x[,isamp+2][ina] <- smoothed.data } x } print.CNA <- function(x, ...) { if (!inherits(x, 'CNA')) stop("First arg must be of class CNA") cat("Number of Samples", ncol(x)-2, "\nNumber of Probes ", nrow(x), "\nData Type ", attr(x,"data.type"),"\n") } plot.DNAcopy <- function (x, plot.type=c("whole", "plateau", "samplebychrom", "chrombysample"), xmaploc=FALSE, altcol=TRUE, sbyc.layout=NULL, cbys.nchrom=1, cbys.layout=NULL, include.means=TRUE, zeroline=TRUE, pt.pch=NULL, pt.cex=NULL, pt.cols=NULL, segcol=NULL, zlcol=NULL, ylim=NULL, lwd=NULL, ...) { if (!inherits(x, "DNAcopy")) stop("First arg must be the result of segment") xdat <- x$data nsample <- ncol(xdat)-2 if(missing(ylim)) { uylim <- max(abs(xdat[,-(1:2)]), na.rm=TRUE) ylim <- c(-uylim, uylim) } xres <- x$output if(dev.cur() <= 1) dev.new() int.dev <- dev.interactive() plot.type <- match.arg(plot.type) op <- par(no.readonly = TRUE) parask <- par("ask") if (int.dev & !parask & nsample>1) par(ask = TRUE) sampleid <- colnames(xdat)[-(1:2)] chrom0 <- xdat$chrom uchrom <- unique(chrom0) nchrom <- length(uchrom) if (xmaploc) { maploc0 <- as.numeric(xdat$maploc) if(length(uchrom)>1 & max(maploc0[chrom0==uchrom[1]]) > min(maploc0[chrom0==uchrom[2]])) { plen <- max(maploc0[chrom0==uchrom[1]]) for(i in 2:nchrom) { maploc0[chrom0==uchrom[i]] <- plen + maploc0[chrom0==uchrom[i]] plen <- max(maploc0[chrom0==uchrom[i]]) } } } if (missing(pt.pch)) pt.pch <- "." if (missing(pt.cex)) { if (pt.pch==".") { pt.cex <- 3} else {pt.cex <- 1} } wcol0 <- rep(1, length(chrom0)) if (altcol) { j <- 0 for (i in uchrom) { j <- (j+1) %% 2 wcol0[chrom0==i] <- 1+j } } if (missing(pt.cols)) pt.cols <- c("black","green") if (missing(segcol)) segcol <- "red" if (missing(zlcol)) zlcol <- "grey" if (missing(lwd)) lwd <- 3 if (plot.type == "chrombysample") { cat("Setting multi-figure configuration\n") par(mar = c(0, 4, 0, 2), oma = c(4, 0, 4, 0), mgp = c(2, 0.7, 0)) if (missing(cbys.layout)) { nrow <- ncol <- ceiling(sqrt(nsample)) if (nrow*ncol - nsample > 0) { nrow <- nrow - 1 ncol <- ncol + 1 } if (nrow*ncol - nsample >= nrow) ncol <- ncol - 1 cbys.layout <- c(nrow, ncol) } lmat0 <- lmat1 <- c(1:nsample, rep(-cbys.nchrom*nsample, prod(cbys.layout) - nsample)) for(i in 1:(cbys.nchrom-1)) { lmat1 <- c(lmat1,lmat0+nsample*i) } lmat1[lmat1<0] <- 0 lmat <- matrix(lmat1, nrow = cbys.layout[1], ncol = cbys.nchrom*cbys.layout[2], byrow = FALSE) layout(lmat) } if (plot.type == "samplebychrom") { cat("Setting multi-figure configuration\n") par(mar = c(4, 4, 4, 2), oma = c(0, 0, 2, 0), mgp = c(2, 0.7, 0)) if (missing(sbyc.layout)) { nrow <- ncol <- ceiling(sqrt(nchrom)) if (nrow*ncol - nchrom > 0) { nrow <- nrow - 1 ncol <- ncol + 1 } if (nrow*ncol - nchrom > ncol) ncol <- ncol - 1 sbyc.layout <- c(nrow, ncol) } lmat <- matrix(c(1:nchrom, rep(0,prod(sbyc.layout)-nchrom)), nrow = sbyc.layout[1], ncol = sbyc.layout[2], byrow=TRUE) layout(lmat) } if (plot.type == "chrombysample") { atchrom <- 0.5/cbys.nchrom for (ichrom in uchrom) { if (xmaploc) maploc1 <- maploc0[chrom0==ichrom] for (isamp in 1:nsample) { genomdat <- xdat[chrom0==ichrom, isamp+2] ina <- which(is.finite(genomdat)) genomdat <- genomdat[ina] if (xmaploc) maploc <- maploc1[ina] ii <- cumsum(c(0, xres$num.mark[xres$ID == sampleid[isamp] & xres$chrom==ichrom])) mm <- xres$seg.mean[xres$ID == sampleid[isamp] & xres$chrom==ichrom] kk <- length(ii) zz <- cbind(ii[-kk] + 1, ii[-1]) if (xmaploc) { plot(maploc, genomdat, pch = pt.pch, cex=pt.cex, xaxt="n", ylim = ylim, ylab = sampleid[isamp]) } else { plot(genomdat, pch = pt.pch, cex=pt.cex, xaxt="n", ylim = ylim, ylab = sampleid[isamp]) } if(zeroline) abline(h=0, col=zlcol, lwd=lwd) if (isamp%%cbys.layout[1] == 0) { axis(1, outer=TRUE) title(xlab="Index") } if (include.means) { if (xmaploc) { segments(maploc[zz[,1]], mm, x1=maploc[zz[,2]], y1=mm, col = segcol, lwd=lwd) } else { segments(zz[,1], mm, x1=zz[,2], y1=mm, col = segcol, lwd=lwd) } # for (i in 1:(kk - 1)) { # if (xmaploc) { # lines(maploc[zz[i, ]], rep(mm[i], 2), col = segcol, lwd=lwd) # } else { # lines(zz[i, ], rep(mm[i], 2), col = segcol, lwd=lwd) # } # } } } mtext(paste("Chromosome",ichrom), side = 3, line = 1, at = atchrom, outer=TRUE, font=2) atchrom <- atchrom + 1/cbys.nchrom atchrom <- atchrom - floor(atchrom) } } else { for (isamp in 1:nsample) { genomdat <- xdat[, isamp+2] ina <- which(is.finite(genomdat)) genomdat <- genomdat[ina] wcol <- wcol0[ina] chrom <- chrom0[ina] if (xmaploc) maploc <- maploc0[ina] ii <- cumsum(c(0, xres$num.mark[xres$ID == sampleid[isamp]])) mm <- xres$seg.mean[xres$ID == sampleid[isamp]] kk <- length(ii) zz <- cbind(ii[-kk] + 1, ii[-1]) if(missing(ylim)) ylim <- range(c(genomdat, -genomdat)) if (plot.type=="whole") { if (xmaploc) { plot(maploc, genomdat, pch = pt.pch, cex=pt.cex, col=pt.cols[wcol], main = sampleid[isamp], ylab = "", ylim = ylim) if(zeroline) abline(h=0, col=zlcol, lwd=lwd) } else { plot(genomdat, pch = pt.pch, cex=pt.cex, col=pt.cols[wcol], main = sampleid[isamp], ylab = "", ylim = ylim) if(zeroline) abline(h=0, col=zlcol, lwd=lwd) } if (include.means) { if (xmaploc) { segments(maploc[zz[,1]], mm, x1=maploc[zz[,2]], y1=mm, col = segcol, lwd=lwd) } else { segments(zz[,1], mm, x1=zz[,2], y1=mm, col = segcol, lwd=lwd) } # for (i in 1:(kk - 1)) # { # if (xmaploc) { # lines(maploc[zz[i, ]], rep(mm[i], 2), col = segcol, lwd=lwd) # } else { # lines(zz[i, ], rep(mm[i], 2), col = segcol, lwd=lwd) # } # } } } if (plot.type=="samplebychrom") { cc <- xres$chrom[xres$ID == sampleid[isamp]] for (ichrom in uchrom) { if (xmaploc) { plot(maploc[chrom == ichrom], genomdat[chrom == ichrom], pch = pt.pch, cex=pt.cex, xlab="maploc", ylab = "", main = paste("Chromosome", ichrom), ylim = ylim) } else { plot(genomdat[chrom == ichrom], pch = pt.pch, cex=pt.cex, ylab = "", main = paste("Chromosome", ichrom), ylim = ylim) } if(zeroline) abline(h=0, col=zlcol, lwd=lwd) if (include.means) { jj <- which(cc==ichrom) jj0 <- min(jj) if (xmaploc) { segments(maploc[zz[jj,1]], mm[jj], x1=maploc[zz[jj,2]], y1=mm[jj], col = segcol, lwd=lwd) } else { segments(1+zz[jj,1]-zz[jj0,1], mm[jj], x1=1+zz[jj,2]-zz[jj0,1], y1=mm[jj], col = segcol, lwd=lwd) } # for (i in jj) # { # if (xmaploc) { # lines(maploc[zz[i, ]], rep(mm[i], 2), col = segcol, lwd=lwd) # } else { # lines(1+zz[i, ]-zz[jj0,1], rep(mm[i], 2), col = segcol, lwd=lwd) # } # } } } mtext(sampleid[isamp], side = 3, line = 0, outer = TRUE, font=2) } if (plot.type=="plateau") { omm <- order(mm) ozz <- zz[omm,] ina <- unlist(apply(ozz, 1, function(ii) ii[1]:ii[2])) plot(genomdat[ina], pch = pt.pch, cex=pt.cex, main = sampleid[isamp], ylab = "", ylim = ylim) if(zeroline) abline(h=0, col=zlcol, lwd=lwd) if (include.means) { ii <- cumsum(c(0, xres$num.mark[xres$ID == sampleid[isamp]][omm])) smm <- mm[omm] zz <- cbind(ii[-kk] + 1, ii[-1]) segments(zz[,1], smm, x1=zz[,2], y1=smm, col = segcol, lwd=lwd) # for (i in 1:(kk-1)) lines(zz[i, ], rep(smm[i], 2), col = segcol, lwd=lwd) } } } } on.exit( if (plot.type=="chrombysample" | plot.type=="samplebychrom") { par(op) } else { if(int.dev & !parask & nsample>1) par(ask=parask) }) } print.DNAcopy <- function(x, showSegRows=FALSE, ...) { if (!inherits(x, "DNAcopy")) stop("Object is not the result of segment") if (!is.null(cl<- x$call)) { cat("Call:\n") dput(cl) cat("\n") } if (showSegRows) { if (is.null(x$segRows)) { print(x$output) warning("segRows missing. Object may be a subset or from DNAcopy < 1.23.2.\n") } else { print(cbind(x$output, x$segRows)) } } else { print(x$output) } } subset.DNAcopy <- function(x, chromlist=NULL, samplelist=NULL, ...) { if (!inherits(x, 'DNAcopy')) stop("First arg must be of class DNAcopy") zdat <- x$data zres <- x$output chrom <- zdat$chrom uchrom <- unique(chrom) if (missing(chromlist) | is.null(chromlist)) chromlist <- uchrom if (length(setdiff(chromlist, uchrom)) > 0) stop("chromlist contains chromosomes not in the data") if (length(chromlist) > length(unique(chromlist))) warning("duplicate chromosomes in chromlist removed") sampleid <- colnames(zdat)[-(1:2)] if (missing(samplelist)) samplelist <- sampleid nsample <- length(sampleid) if (length(setdiff(samplelist, 1:nsample)) > 0 & length(setdiff(samplelist, sampleid)) > 0) stop("samplelist should be a list of valid sample numbers or names") if (!is.numeric(samplelist)) samplelist <- match(samplelist, names(zdat)) - 2 if (length(samplelist) > length(unique(samplelist))) warning("duplicate samples in samplelist removed") samplelist <- unique(samplelist) jj <- unlist(sapply(sampleid[samplelist], function(i, id) {which(id==i)}, zres$ID )) zres <- zres[jj,] y <- list() y$data <- zdat[chrom %in% chromlist,c(1:2,samplelist+2)] attr(y$data, "data.type") <- attr(zdat, "data.type") y$output <- zres[zres$chrom %in% chromlist,] class(y) <- "DNAcopy" y } # Chromosome.Lengths <- c(263, 255, 214, 203, 194, 183, 171, 155, 145, 144, 144, 143, 114, 109, 106, 98, 92, 85, 67, 72, 50, 56, 164, 59) # names(Chromosome.Lengths) <- c(as.character(1:22),"X","Y") DNAcopy/R/changepoints.R0000644000175200017520000001674114516003605016110 0ustar00biocbuildbiocbuildchangepoints <- function(genomdat, data.type="logratio", alpha=0.01, weights= NULL, sbdry, sbn, nperm=10000, p.method="hybrid", min.width=2, kmax=25, nmin=200, trimmed.SD=NULL, undo.splits="none", undo.prune=0.05, undo.SD=3, verbose=1, ngrid=100, tol=1e-6) { n <- length(genomdat) if (missing(trimmed.SD)) trimmed.SD <- mad(diff(genomdat))/sqrt(2) # start with the whole seg.end <- c(0,n) k <- length(seg.end) change.loc <- NULL weighted <- ifelse(is.null(weights), FALSE, TRUE) while (k > 1) { current.n <- seg.end[k]-seg.end[k-1] if (verbose>=3) cat(".... current segment:",seg.end[k-1]+1,"-",seg.end[k],"\n") if(current.n >= 2*min.width) { current.genomdat <- genomdat[(seg.end[k-1]+1):seg.end[k]] # check whether hybrid method needs to be used hybrid <- FALSE delta <- 0 if ((p.method=="hybrid") & (nmin < current.n)) { hybrid <- TRUE delta <- (kmax+1)/current.n } # call the changepoint routine if (weighted) { # get the weights for the current set of probes current.wts <- weights[(seg.end[k-1]+1):seg.end[k]] current.rwts <- sqrt(current.wts) current.cwts <- cumsum(current.wts)/sqrt(sum(current.wts)) # if all values of current.genomdat are the same don't segment if (isTRUE(all.equal(diff(range(current.genomdat)), 0))) { zzz <- list() zzz$ncpt <- 0 } else { # centering the current data will save a lot of computations later current.avg <- sum(current.genomdat*current.wts)/sum(current.wts) current.genomdat <- current.genomdat - current.avg # need total sum of squares too current.tss <- sum(current.wts*(current.genomdat^2)) zzz <- .Fortran("wfindcpt", n=as.integer(current.n), x=as.double(current.genomdat), tss=as.double(current.tss), wts=as.double(current.wts), rwts=as.double(current.rwts), cwts=as.double(current.cwts), px=double(current.n), sx=double(current.n), nperm=as.integer(nperm), cpval=as.double(alpha), ncpt=integer(1), icpt=integer(2), hybrid=as.logical(hybrid), al0=as.integer(min.width), hk=as.integer(kmax), mncwt=double(kmax), delta=as.double(delta), ngrid=as.integer(ngrid), sbn=as.integer(sbn), sbdry=as.integer(sbdry), tol= as.double(tol), PACKAGE="DNAcopy") } } else { # if all values of current.genomdat are the same don't segment if (isTRUE(all.equal(diff(range(current.genomdat)), 0))) { zzz <- list() zzz$ncpt <- 0 } else { # centering the current data will save a lot of computations later current.avg <- mean(current.genomdat) current.genomdat <- current.genomdat - current.avg # need total sum of squares too current.tss <- sum(current.genomdat^2) zzz <- .Fortran("fndcpt", n=as.integer(current.n), x=as.double(current.genomdat), tss=as.double(current.tss), px=double(current.n), sx=double(current.n), nperm=as.integer(nperm), cpval=as.double(alpha), ncpt=integer(1), icpt=integer(2), ibin=as.logical(data.type=="binary"), hybrid=as.logical(hybrid), al0=as.integer(min.width), hk=as.integer(kmax), delta=as.double(delta), ngrid=as.integer(ngrid), sbn=as.integer(sbn), sbdry=as.integer(sbdry), tol= as.double(tol), PACKAGE="DNAcopy") } } } else { zzz <- list() zzz$ncpt <- 0 } if(zzz$ncpt==0) change.loc <- c(change.loc,seg.end[k]) seg.end <- switch(1+zzz$ncpt,seg.end[-k], c(seg.end[1:(k-1)],seg.end[k-1]+zzz$icpt[1],seg.end[k]), c(seg.end[1:(k-1)],seg.end[k-1]+zzz$icpt,seg.end[k])) k <- length(seg.end) if(verbose>=3) cat(".... segments to go:",seg.end,"\n") } seg.ends <- rev(change.loc) nseg <- length(seg.ends) lseg <- diff(c(0,seg.ends)) if (nseg > 1) { if (undo.splits == "prune") { lseg <- changepoints.prune(genomdat, lseg, undo.prune) } if (undo.splits == "sdundo") { lseg <- changepoints.sdundo(genomdat, lseg, trimmed.SD, undo.SD) } } segmeans <- 0*lseg ll <- uu <- 0 for(i in 1:length(lseg)) { uu <- uu + lseg[i] if (weighted) { segmeans[i] <- sum(genomdat[(ll+1):uu]*weights[(ll+1):uu])/sum(weights[(ll+1):uu]) } else { segmeans[i] <- mean(genomdat[(ll+1):uu]) } ll <- uu } list("lseg" = lseg, "segmeans" = segmeans) } changepoints.prune <- function(genomdat, lseg, change.cutoff=0.05) { n <- length(genomdat) nseg <- length(lseg) ncpt <- nseg-1 zzz <- .Fortran("prune", as.integer(n), as.double(genomdat), as.integer(nseg), as.integer(lseg), as.double(change.cutoff), double(nseg), as.integer(ncpt), loc=integer(ncpt), integer(2*ncpt), pncpt=integer(1), PACKAGE="DNAcopy") pruned.ncpt <- zzz$pncpt pruned.cpts <- cumsum(lseg)[zzz$loc[1:pruned.ncpt]] pruned.lseg <- diff(c(0,pruned.cpts,n)) pruned.lseg } changepoints.sdundo <- function(genomdat, lseg, trimmed.SD, change.SD=3) { change.SD <- trimmed.SD*change.SD cpt.loc <- cumsum(lseg) sdundo <- TRUE while(sdundo) { k <- length(cpt.loc) if (k>1) { segments0 <- cbind(c(1,1+cpt.loc[-k]),cpt.loc) segmed <- apply(segments0, 1, function(i,x) {median(x[i[1]:i[2]])}, genomdat) adsegmed <- abs(diff(segmed)) if (min(adsegmed) < change.SD) { i <- which(adsegmed == min(adsegmed)) cpt.loc <- cpt.loc[-i] } else { sdundo <- FALSE } } else { sdundo <- FALSE } } lseg.sdundo <- diff(c(0,cpt.loc)) lseg.sdundo } trimmed.variance <- function(genomdat, trim=0.025) { n <- length(genomdat) n.keep <- round((1-2*trim)*(n-1)) inflfact(trim)*sum((sort(abs(diff(genomdat)))[1:n.keep])^2 / (2*n.keep)) } inflfact <- function(trim) { a <- qnorm(1-trim) x <- seq(-a,a,length.out=10001) x1 <- (x[-10001] + x[-1])/2 1/(sum(x1^2*dnorm(x1)/(1-2*trim))*(2*a/10000)) } DNAcopy/R/exonsegment.R0000644000175200017520000000324114516003605015751 0ustar00biocbuildbiocbuildexon.segment <- function(gene, eloc, edat, ngrid=100, tol=1e-6) { ii <- order(gene, eloc) gene <- gene[ii] eloc <- eloc[ii] if (is.matrix(edat)) { edat <- edat[ii,] } else { edat <- cbind(edat[ii]) } ugene <- unique(gene) ngene <- length(ugene) nsample <- ncol(edat) out.stat <- out.loc <- out.p <- matrix(0, ngene, nsample) ss <- 3*(1:nsample) for(i in 1:ngene) { exondat <- edat[gene==ugene[i],] gout <- exon.changepoint(exondat, ngrid, tol) out.stat[i,] <- gout[[1]] out.loc[i,] <- gout[[2]] out.p[i,] <- gout[[3]] } rownames(out.stat) <- rownames(out.loc) <- rownames(out.p) <- ugene list(statistic=out.stat, location=out.loc, p.value=out.p) } exon.changepoint <- function(exondat, ngrid=100, tol=1e-6) { # # exondat -- is a matrix of normalized expression values # rows are ordered by location and columns are samples # nsample <- ncol(exondat) # number of samples n <- nrow(exondat) # number of exons in the gene # initialize sample specific output estat <- epval <- eloc <- rep(0, nsample) # calculate the max t-stat, location and p-value for(i in 1:nsample) { exondati <- exondat[,i] # center the data exondati <- (exondati - mean(exondati)) # call the p-value subroutine zzz <- .Fortran("esegp", as.integer(n), as.double(exondati), ostat=double(1), eloc=integer(1), pval=double(1), as.integer(ngrid), as.double(tol), PACKAGE="DNAcopy") estat[i] <- zzz$ostat epval[i] <- zzz$pval eloc[i] <- zzz$eloc } list(estat, eloc, epval) } DNAcopy/R/getbdry.R0000644000175200017520000000076414516003605015064 0ustar00biocbuildbiocbuildgetbdry <- function(eta, nperm, max.ones, tol= 1e-2) { bdry <- rep(0, max.ones*(max.ones+1)/2) zz <- .Fortran("getbdry", as.double(eta), as.integer(max.ones), as.integer(nperm), as.integer(max.ones*(max.ones+1)/2), bdry=as.integer(bdry), etastr=double(max.ones), as.double(tol), PACKAGE="DNAcopy") # list("eta.star"=zz$etastr, "boundary"=zz$bdry) zz$bdry } DNAcopy/R/glFrequency.R0000644000175200017520000000214614516003605015704 0ustar00biocbuildbiocbuildglFrequency <- function(xout, threshold=1) { if (!inherits(xout, 'DNAcopy')) stop("First arg must be of class DNAcopy") nsample <- ncol(xout$data)-2 snames <- names(xout$data) xmad <- rep(NA,nsample) for(i in 2+(1:nsample)) { sout <- xout$output[xout$output$ID==snames[i],] xmad[i-2] <- mad(na.omit(xout$data[,i]) - rep(sout$seg.mean,sout$num.mark)) } pfreq <- gain <- loss <- rep(0, nrow(xout$data)) for(i in 1:nsample) { # ii <- !is.na(xout$data[,i+2]) genomdat <- xout$data[,i+2] # ii = location of the missing values and infinity ii <- which(is.finite(genomdat)) # segment means as a vector segout <- xout$output[xout$output$ID==snames[i+2],] segmean <- rep(segout$seg.mean, segout$num.mark) # gains and losses pfreq[ii] <- pfreq[ii] + 1 gain[ii] <- gain[ii] + 1*((segmean - median(segmean))/xmad[i] > threshold) loss[ii] <- loss[ii] - 1*((segmean - median(segmean))/xmad[i] < -threshold) } out <- list() out$chrom <- xout$data$chrom out$maploc <- xout$data$maploc out$pfreq <- pfreq out$gain <- gain/pfreq out$loss <- loss/pfreq as.data.frame(out) } DNAcopy/R/plotSample.R0000644000175200017520000000424314516003605015540 0ustar00biocbuildbiocbuildplotSample <- function(x, sampleid=NULL, chromlist=NULL, xmaploc=FALSE, col=c("black","green"), pch=".", cex=NULL, altcol=TRUE, segcol="red", lwd=3, zeroline=TRUE, zlcol="grey", xlab=NULL, ylab=NULL, main=NULL, ...) { if (!inherits(x, 'DNAcopy')) stop("First arg must be a DNAcopy object") if (missing(sampleid)) {sampleid <- 1} subx <- subset(x, chromlist=chromlist, samplelist=sampleid[1]) # get the data for plotting genomdat <- subx$data[,3] ina <- is.finite(genomdat) genomdat <- genomdat[ina] chrom <- subx$data[ina,1] uchrom <- unique(chrom) segres <- subx$output # setup the X-axis based on xmaploc if (xmaploc) { maploc <- subx$data[ina,2] rmaploc <- sapply(uchrom, function(i, maploc, chrom) range(maploc[chrom==i]), maploc, chrom) nc <- length(uchrom) if ((nc>1) && any(rmaploc[1,-1] < rmaploc[2,-nc])) { cmaploc <- cumsum(as.numeric(rmaploc[2,])) for (i in 2:nc) { maploc[chrom==uchrom[i]] <- cmaploc[i-1] + maploc[chrom==uchrom[i]] } } xlabel <- "Genomic Position" } else { maploc <- 1:sum(ina) xlabel <- "Index" } # setup altenating colors if (altcol & length(uchrom)>1) { colvec <- rep(1, length(chrom)) j <- 0 for(i in uchrom) { j <- (j+1) %% 2 colvec[chrom == i] <- j+1 } } else { colvec <- 1 } # set other graphical parameters if (missing(cex)) cex <- ifelse(pch == ".", 3, 1) if (missing(main)) main <- names(subx$data)[3] if (missing(xlab)) xlab <- xlabel if (missing(ylab)) { if (attr(subx$data, "data.type") == "logratio") {ylab <- "log(relative CN)"} else {ylab <- "LOH"} } # plot the data plot(maploc, genomdat, col=col[colvec], pch=pch, cex=cex, main=main, xlab=xlab, ylab=ylab, ...) # add the segment means ii <- cumsum(c(0, segres$num.mark)) mm <- segres$seg.mean kk <- length(ii) segments(maploc[ii[-kk]+1], segres$seg.mean, x1=maploc[ii[-1]], y1=segres$seg.mean, col = segcol, lwd=lwd) # for (i in 1:(kk - 1)) { # lines(maploc[c(ii[i]+1,ii[i+1])], rep(mm[i], 2), col = segcol, lwd=lwd) # } # add the zeroline if (zeroline) abline(h=0, col=zlcol, lwd=lwd) } DNAcopy/R/segment.R0000644000175200017520000000737014516003605015066 0ustar00biocbuildbiocbuildsegment <- function(x, weights=NULL, alpha=0.01, nperm=10000, p.method= c("hybrid","perm"), min.width=2, kmax=25, nmin=200, eta=0.05, sbdry=NULL, trim = 0.025, undo.splits= c("none","prune", "sdundo"), undo.prune=0.05, undo.SD=3, verbose=1) { if (!inherits(x, 'CNA')) stop("First arg must be a copy number array object") call <- match.call() if (min.width < 2 | min.width > 5) stop("minimum segment width should be between 2 and 5") if (nmin < 4*kmax) stop("nmin should be >= 4*kmax") if (missing(sbdry)) { if (nperm==10000 & alpha==0.01 & eta==0.05) { if (!exists("default.DNAcopy.bdry")) data(default.DNAcopy.bdry, package="DNAcopy",envir=environment()) sbdry <- get("default.DNAcopy.bdry", envir=environment()) } else { max.ones <- floor(nperm*alpha) + 1 sbdry <- getbdry(eta, nperm, max.ones) } } weighted <- ifelse(missing(weights), FALSE, TRUE) # rudimentary error checking for weights if (weighted) { if (length(weights) != nrow(x)) stop("length of weights should be the same as the number of probes") if (min(weights) <= 0) stop("all weights should be positive") } sbn <- length(sbdry) nsample <- ncol(x)-2 sampleid <- colnames(x)[-(1:2)] uchrom <- unique(x$chrom) data.type <- attr(x, "data.type") p.method <- match.arg(p.method) undo.splits <- match.arg(undo.splits) segres <- list() segres$data <- x allsegs <- list() allsegs$ID <- NULL allsegs$chrom <- NULL allsegs$loc.start <- NULL allsegs$loc.end <- NULL allsegs$num.mark <- NULL allsegs$seg.mean <- NULL segRows <- list() segRows$startRow <- NULL segRows$endRow <- NULL for (isamp in 1:nsample) { if (verbose>=1) cat(paste("Analyzing:", sampleid[isamp],"\n")) genomdati <- x[,isamp+2] ina <- which(is.finite(genomdati)) genomdati <- genomdati[ina] trimmed.SD <- sqrt(trimmed.variance(genomdati, trim)) chromi <- x$chrom[ina] # maploci <- x$maploc[ina] if (weighted) { wghts <- weights[ina] } else { wghts <- NULL } sample.lsegs <- NULL sample.segmeans <- NULL for (ic in uchrom) { if (verbose>=2) cat(paste(" current chromosome:", ic, "\n")) segci <- changepoints(genomdati[chromi==ic], data.type, alpha, wghts[chromi==ic], sbdry, sbn, nperm, p.method, min.width, kmax, nmin, trimmed.SD, undo.splits, undo.prune, undo.SD, verbose) sample.lsegs <- c(sample.lsegs, segci$lseg) sample.segmeans <- c(sample.segmeans, segci$segmeans) } sample.nseg <- length(sample.lsegs) sample.segs.start <- ina[cumsum(c(1,sample.lsegs[-sample.nseg]))] sample.segs.end <- ina[cumsum(sample.lsegs)] allsegs$ID <- c(allsegs$ID, rep(isamp,sample.nseg)) allsegs$chrom <- c(allsegs$chrom, x$chrom[sample.segs.end]) allsegs$loc.start <- c(allsegs$loc.start, x$maploc[sample.segs.start]) allsegs$loc.end <- c(allsegs$loc.end, x$maploc[sample.segs.end]) allsegs$num.mark <- c(allsegs$num.mark, sample.lsegs) allsegs$seg.mean <- c(allsegs$seg.mean, sample.segmeans) segRows$startRow <- c(segRows$startRow, sample.segs.start) segRows$endRow <- c(segRows$endRow, sample.segs.end) } allsegs$ID <- sampleid[allsegs$ID] allsegs$seg.mean <- round(allsegs$seg.mean, 4) allsegs <- as.data.frame(allsegs) allsegs$ID <- as.character(allsegs$ID) segres$output <- allsegs segres$segRows <- as.data.frame(segRows) segres$call <- call if (weighted) segres$weights <- weights class(segres) <- "DNAcopy" segres } DNAcopy/R/segmentp.R0000644000175200017520000001016514516003605015242 0ustar00biocbuildbiocbuildsegments.p <- function(x, ngrid=100, tol=1e-6, alpha=0.05, search.range=100, nperm=1000) { if (!inherits(x, "DNAcopy")) stop("First arg must be the result of segment") xdat <- x$data xout <- x$output nsample <- ncol(xdat)-2 sampleid <- colnames(xdat)[-(1:2)] chrom0 <- xdat$chrom maploc0 <- xdat$maploc uchrom <- unique(chrom0) nchrom <- length(uchrom) bstat <- pval <- lcl <- ucl <- rep(NA, nrow(xout)) ll <- 0 iisamp <- 2 for (isamp in sampleid) { iisamp <- iisamp + 1 # genomdat = logratio data of sample isamp genomdat <- xdat[, iisamp] # ina = location of the missing values and infinity ina <- which(is.finite(genomdat)) # subset out the missing & infinity locations genomdat <- genomdat[ina] chrom <- chrom0[ina] maploc <- maploc0[ina] for(ichrom in uchrom) { # kk = number of segments in chromosome ichrom of sample isamp kk <- sum(1*(xout$ID == isamp & xout$chrom == ichrom)) if (kk > 1) { # gendat = logratio data in chromosome ichrom of sample isamp gendat <- genomdat[chrom == ichrom] # seglen = lengths of the segments in chromosome ichrom of sample isamp seglen <- xout$num.mark[xout$ID == isamp & xout$chrom == ichrom] # segmean = means of the segments in chromosome ichrom of sample isamp segmean <- xout$seg.mean[xout$ID == isamp & xout$chrom == ichrom] # xresid = residuals of the data in chromosome ichrom of sample isamp xresid <- gendat - rep(segmean, seglen) ibstat <- ipval <- ilcl <- iucl <- rep(NA, kk) # begin with the first 2 segments lo & hi are the start & end points lo <- 1 hi <- sum(seglen[1:2]) for(i in 1:(kk-1)) { # prep data from adjacent segments gendati <- gendat[lo:hi] xresidi <- xresid[lo:hi] # standardize data gendati <- (gendati - mean(gendati))/sd(xresidi) n <- length(gendati) # call the p-value subroutine zzz <- .Fortran("bsegp", as.integer(n), as.double(gendati), ostat=double(1), pval=double(1), as.integer(ngrid), as.double(tol), PACKAGE="DNAcopy") ibstat[i] <- zzz$ostat ipval[i] <- zzz$pval # additional data for CI routine # k = location of change-point # sr = search range # sumxk = partial sum at k (all paths are pegged at that point) # var.factor = variance for 2-sample t-statistic k <- seglen[i] sr <- c(max(2, k-search.range),min(n-2,k+search.range)) sumxk <- sum(gendati[1:k]) var.factor <- n/((1:n)*(n:1 - 1)) var.factor[n] <- 0 # call the confidence subroutine zzz <- .Fortran("bsegci", as.integer(n), as.integer(k), as.double(sumxk), as.double(gendati), px = double(n), sr = as.integer(sr), vfact = as.double(var.factor), as.integer(nperm), bsloc = integer(nperm), PACKAGE="DNAcopy") bsloc <- zzz$bsloc bsci <- quantile(bsloc, c(alpha/2, 1-alpha/2), type=1) ilcl[i] <- bsci[1] iucl[i] <- bsci[2] # increment to the next segment lo <- lo + seglen[i] if(i < kk-1) hi <- hi + seglen[i+2] } ibstat[kk] <- ipval[kk] <- ilcl[kk] <- iucl[kk] <- NA } else { seglen <- ibstat <- ipval <- ilcl <- iucl <- NA } bstat[ll + (1:kk)] <- ibstat pval[ll + (1:kk)] <- ipval # convert the lcl & ucl from probe number to maploc lcl[ll + (1:kk)] <- maploc[chrom == ichrom][cumsum(seglen) + (ilcl - seglen)] ucl[ll + (1:kk)] <- maploc[chrom == ichrom][cumsum(seglen) + (iucl - seglen)] ll <- ll + kk } } cbind(xout, bstat, pval, lcl, ucl) } DNAcopy/R/segmentsummary.R0000644000175200017520000000204514516003605016476 0ustar00biocbuildbiocbuildsegments.summary <- function(x) { if (!inherits(x, "DNAcopy")) stop("First arg must be the result of segment") xdat <- x$data xout <- x$output nsample <- ncol(xdat)-2 sampleid <- colnames(xdat)[-(1:2)] seg.median <- seg.sd <- seg.mad <- rep(NA, nrow(xout)) ll <- 0 iisamp <- 2 for (isamp in sampleid) { iisamp <- iisamp + 1 # genomdat = logratio data of sample isamp genomdat <- xdat[, iisamp] # ina = location of the missing values and infinity ina <- which(is.finite(genomdat)) # subset out the missing & infinity locations genomdat <- genomdat[ina] seglen <- xout$num.mark[xout$ID == isamp] kk <- length(seglen) seg.sd[ll+(1:kk)] <- tapply(genomdat, rep(1:kk,seglen), sd) seg.median[ll+(1:kk)] <- tapply(genomdat, rep(1:kk,seglen), median) seg.mad[ll+(1:kk)] <- tapply(genomdat, rep(1:kk,seglen), mad) ll <- ll + kk } xout$seg.sd <- round(seg.sd, 4) xout$seg.median <- round(seg.median, 4) xout$seg.mad <- round(seg.mad, 4) xout } DNAcopy/R/zoomIntoRegion.R0000644000175200017520000000301614516003605016377 0ustar00biocbuildbiocbuildzoomIntoRegion <- function(x, chrom, sampleid, maploc.start=NULL, maploc.end=NULL, pt.pch=NULL, pt.cex=NULL, pt.col=NULL, segcol=NULL, seglwd=NULL, main=NULL, xlab=NULL, ylab=NULL, ...) { if (!inherits(x, 'DNAcopy')) stop("First arg must be a DNAcopy object") tmp <- subset(x, chrom=chrom[1], samplelist=sampleid[1]) lrdata <- tmp$data if (missing(maploc.start)) maploc.start <- min(lrdata$maploc, na.rm=T) - 1 if (missing(maploc.end)) maploc.end <- max(lrdata$maploc, na.rm=T) + 1 ii <- ((lrdata$maploc >= maploc.start) & (lrdata$maploc <= maploc.end)) if (missing(pt.pch)) pt.pch <- "." if (missing(pt.cex)) pt.cex <- ifelse(pt.pch==".", 3, 1) if (missing(pt.col)) pt.col <- "green3" if (missing(segcol)) segcol <- "red" if (missing(seglwd)) seglwd <- 3 if (missing(main)) main <- paste("chr", chrom, ": ", maploc.start,"-", maploc.end, " from sample ", sampleid, sep="") if (missing(xlab)) xlab = "Genomic Position" if (missing(ylab)) ylab = "log-ratio" plot(lrdata[ii,2], lrdata[ii,3], main = main, xlab=xlab, ylab = ylab, pch = pt.pch, cex = pt.cex, col = pt.col, ...) segs <- tmp$output jj <- ((segs$loc.start <= maploc.end) & (segs$loc.end >= maploc.start)) segs <- segs[jj,] k <- nrow(segs) segs$loc.start[1] <- maploc.start segs$loc.end[k] <- maploc.end segments(segs$loc.start, segs$seg.mean, x1=segs$loc.end, y1=segs$seg.mean, col = segcol, lwd = seglwd) # for(i in 1:k) { # lines(c(segs$loc.start[i],segs$loc.end[i]), rep(segs$seg.mean[i],2), col=segcol, lwd=seglwd) # } } DNAcopy/R/zzz.R0000644000175200017520000000012714516003605014252 0ustar00biocbuildbiocbuild.onLoad <- function(libname, pkgname) { library.dynam("DNAcopy", pkgname, libname) } DNAcopy/README.md0000644000175200017520000000026514516003605014353 0ustar00biocbuildbiocbuild# DNAcopy Bioconductor package implementing the circular binary segmentation (CBS) algorithm to segment DNA copy number data and identify genomic regions with abnormal copy number. DNAcopy/build/0000755000175200017520000000000014516030315014166 5ustar00biocbuildbiocbuildDNAcopy/build/vignette.rds0000644000175200017520000000033214516030315016523 0ustar00biocbuildbiocbuildb```b`afd`b2 1# 'vsL/ +GbJQ& 7 h0XX%cؗZDh3ܤ"ǼĜbsxVDQU▙ sWHf e2|q  "9'= RKҊAo?=DNAcopy/chrom-lengths0000644000175200017520000000043014516003605015563 0ustar00biocbuildbiocbuildChromosome, {Length (Mb)}; 1, {263}; 2, {255}; 3, {214}; 4, {203}; 5{194}; 6, {183}; 7, {171}; 8, {155}; 9, {145}; 10, {144}; 11, {144}, 12, {143}; 13, (114}; 14, {109}; 15, {106}; 16, {98}; 17, {92}; 18, {85}; 19, {67}; 20, {72}; 21, {50}; 22, {56}; X {164}/Y {59} (total = 3286)DNAcopy/data/0000755000175200017520000000000014516003605014002 5ustar00biocbuildbiocbuildDNAcopy/data/coriell.rda0000644000175200017520000015267714516003605016145 0ustar00biocbuildbiocbuild%U{n$g*A`V8=fatLw$*J IA@@ " $ﳧ:ܻキ[ ;|w8U5寸׊׸|,1f42t1Zsc[e|ɘ~Ywd.|^?.7s&3F;3G|~җ -KdZw5|? i~2u_c s~KP5%2~+׭}HGd!ƣSH hBϫ~;1y phq~{3oyki\\>8i]JQ9C@>ўz/={mV)"Hw^ᓵOy_|:<+^l*|߆/>B>k|"|,<(cg'f=_WD"CuTc])G%ç[!k_1;:0Nuw^u~[zB.ZΛX emցlx,}٠eL5R~A7ߠ=;L,0vetF eƄ'f]r+=wrЅҎmK_؋ #^~-ȷ< I؇9/K}~xz ϯ@gk#b\cؗ=OBCEx_qЩ*cUDGE"S؃VЗ=F"6ZDo.³>|G 0s@\o{6`P "_qvPAeD6l+_0p3|+ > >}%냡7"VDQ"NWK@FVFne!K*""tp~8$ DvYoeG~{"c]Wz[AFU_y>\{/ì"8x9 `ex^z&/,o"/76TC?3r)2>_ ]!`^9(=Ƶ ozUnʌ[`@ (;nŚJB,G~vQ}S|MEքUצ.Wb2-"s_>[[A&zU@~oh=UĮ\Y2""xW\xmogQ+v͕>oٚ6`f73oY[GT~ΉK;L5/*V+UU_obG0p".Wd⿙E_t: "\Ğ`P{/WC]u |wC͘++eo SFK  {*w'%&Ad*P{+_zO0ذnAe,-sOxXL^],>cWYgE+w2t*k[2{-aS6+`Ktʚm?U 2>w`b X&~(m3WbQB z]dOE<2ns=S-aMN])*9}r,5%)BIt[.ѷ.c:_sHs!|aU`+O?Uf%ZB*Ȩ(%a4;mB9%#t؛{Syw{.%R9`:]qX^\tgw$8Q0[-1Y` ;4A+⃰QV F92[ %UY?x\FFd| 7G<)qEt= lk\Hg$;hU[OeZŶΰ2|3ز#:,NLFsz# `QI|5択G%ȲNlʕğ##XosEɃVo 20ؠ?#'%a*q> 6iХ 3Uaٔ QxZ沗 cGGxI QC#<` 8_YJl <-Il'2g]29#1'+DLb#ĎKߑ`Xb)[QeO4 4b݄UY4Ydͮءo-d\ɝo ~ VowYK ,aKUr"н*l6`wY_~%*b1@Ar)'E &%Pb.rEeb{%DU.~:`p *!SWW2-! )J.Nv[4~Ey+ ys[[y+"XRdE %V'F,UEtEA]؈؁|ZUZH<r%qmU^ȿ$z*1Cys%~$qeț+1%4`U`s 3C-%ހ7 vљ"y-oE͕мmAka$gWe?K_.NY$] +=rWr1P(K|,/]s$+$(zR_$֪H>#{]tM$O'e e2SAv\@+cEz\/26Wc⍒b*\"</.!˞|UaɟcYr~*U&4bo׉VKĶ2g VGH+ףe#Q۩JNfWEߤ *!}+R#A s 7Grog@/ TKS,_UD*,#9+% cQ SoKB]l0NyW/[+\W<ؤK/HTDP?$wvȪeqEl]BO%tĘU$!)c%\*;K *ؘ]t!q!Fr]Iɵ^DwGE%UBw+ k ",> H= TVY +Ȯ"vbߌ]D ^QjQ_.^$n./:?1o)JΧGJl^:Rr.|sJ)}Vn"8GEpqǑ:'Ěɿ"a -K΀}U,. c#EpW%n>oīF$8C\ZVi9V ?G{T!sFo]DW&6^H("'X\S%^qlt.!n iQc$!%́?*o$)a#eİ$Nfn#@? p$xSAϪ*-* UbE\&&*tQye=r[X*7k,I"6\ȥ Uͤ>,o,ÍRk!xTet,ޕ~$ **몠UxO]1?E>R%^2늎ւi$^\g=⃊Nf^UсSX{kW/Eqq }H= Y' V!5 u" 7Wrlp{\~J-Kb,xYk]Uk;Cê}`UłIY UI0?.Ì7b")`EwUj`hU&~Я,׉}7 a-eCŮEo%|Q _Q6CR_n+ё0*umJAGSA>*[K%Kƒ/$YWe%b3UM$?]ߢK.*YT-I>9I)4ed_0>">E  FAWvp$1ج؞$*5{b̪(P q%FЙfIjCI,q& 좫Uɷ%5h$b*SH WJ}RGr yg%M`e,6JcJP6 [yIb9 ":b+Ux_x9KS3 wuV LWo`e{|!6G>T>,Ҋ %fD*%^1r `}YrD^{p.6/ e|N[el9`DIH!XCز r,ae%< ]-I=@x$~HTr)wY*VàWI >cE-^oLVZ.k(J"2ZVH'~ 2//ö\J,5ЭJ.:O_Wj[oK< Z vmUjaUtUaΪ !5r93 ^!~rU" (Y&?M5"|1rߔyȨJ}MU!9,Am2|s#u+{hC v_.tHErX#%7\"k側̩ѮďR vq|L?bWrN'5K y.:R/@itVnWс:H|!NG*#1uBThp*rF'gr--Keb@WjGa9Ol/ &J^ z-FM25Nd_Ȣ*5ȹ7[$nIQW.Y{Uf?#*2(EKdV$u Kr>/elY<98z^^j}"Fb%x[DAhyM sG;o9k /I E,JƖ%;b"1qVU8#VO99P&,I<3Ƞ #Z 15:FJj^<" 9ĶȑZ^ĉKMT FbaEݥF8K#"Hȱ.]NJGF_i\(U"X;*FwԤD[}jdsY~+Zqò oEѢ:c7c ̌z/A N_Z=9fz0w9@Ģd@~O8Mu^=%y,0^6?-'dfț; wH‰M{ͦMB/!bo̫񬻕)lQX?fq8}MfA5hXo,kYNـZlN.*?-wMS|M?/.Ir⨻q8,.Iؙ6iAg%X%PUoh m$ G\׸i▞rqj aY_4E;kk\u40zJ9uAT{-ա)ʼaY8 !ѼƥDg6 Qk!m"[ݛZ8!ⰡC0/j0oXwv FBO kH¹^lgBHk 6Fsm6%.i#M%^מ6ek6߃fžMYmۥwL"CWE{Sxf~%`YnG4}I/ɲFWS oΦ~rR,5aԼFK7X9advk$Acȯ_m貜攙i}tw ښ唰65ޯj]G]g}5O jPV!f ̈́:X_NHz^"RAtQik8EVW]!7,*KgODa6 &ͺR,LzRiBԯrZ Z38 AT[`6DsʽXeĝ8b+ b֌.IAcbeBA2 m$Ɨvh?]aKhbUk Hn "I 4lCF x:ƵɅv͒ -vaʯk׮hY5zVzCZB C*xZ3<9waom;[UPإ[]G^ Džúkh GG4؅K5/ѕpf%:Q:jVkjV6-R6m7WCwj|azxZWЫ. YX3V, Zkݏe:C9t$EVim[Qv:#<)"c#ݺ06XL\) 3q̒P3ak:͍a٘sqYx6j( ! bkveRq -֦2Y,%5yiUHj&^gEhgegaOYؓxZo֛UfH_6$hЖV2 ,RhaOhH¥"֌uDͳ[iX3 DӋH-HYJWZ:YH #I-fafn $-w>MԶtiםmI.d$5%#:IFtH#ޗi:Hks )Ԥ~ imT+qZ[?sԳ^7bzo"~aRu;TX'A)10K8cUM~ט4j-FFcҔ&9i6[3VVڟ-XwdpLg#{0;eR^NhoxpS`9acQOQ=>z{L(]k5BRkfz@|yqAb<=<$ר}Aj)R.S&&+H? iZN$ԧ| A [Dk=[$]$]!WV_NrtH' :-Z1/U%=|(|/w3Aҷ@k-5%wIk'ڏCҧtR} iF-/OA xZ#Dֶ3}{/o6MX&]{6(oWG[X-F5xK4:yc+_ӷ4& }uHXXz5/}+ՀLMwif~Эe豰hP?E?҇ѐB, [< @A!I62aA֕-ZRwc4Ǣsci_bLձ|Lh5}O$ .A~ i!X~ OBpZ@߫2 ϊA ui[ 4k5chպ0 gm;AZd-z"mA< O@ҏ4@ :AוbdGI5 V_-mm.b`@~0\s{kM4 BOZAҧ6-~%0зB[YIrXiREYN-Ґz&`z]""-&O(=VO!-NnQj5 4ćZC}ǧ뀫)cc8;jV;?iF~ȷp"9d9($ ,,d-5XU/ i=f VQn'!Yb#:4n ,ٽ&HGi(շ_BҏB 𣺧't)j hui!Zy%,aLڞjҰ^ܼ{=ɱߢV 5ԫu> z,~:_^a,Uߌ#}I?R/;B[=Nڬ^=|,}b7T? .D'!Jǝ:({-1uیh?[exT{x7ezIrIMDHImT+m7c Z!Y$KIh$IO ' !IlE^IlS![&%~~~~dVdK$mƑth3jӪ|6uDɄR}& Y7=@үB;=V'!iDNk᠖LZTM"}s*X}vV40M,$LX4iof6juՠR+FM=~D+_TG5FtBcs֢J`Qd-Ƌid?#[f]5fgLp6f>DVuϾtl09NfSn0؜Уn@.'[DS zAU%1AC1[)Z#*$ j ӕrgᠦ<-VFy|W-Tx>잾y&}yK5z+ fed`Zu2!_w/zYs[gAТ9өg>Zk=rA7+ GˡӔ.ui|-Pǰ򼳦gPpuR > `SdSS:T#Q^P fA4髴 %Zq}UlJܥE"5NċhUHrATkkZҔ>fFrAL+ л L?UdzhFjdK5dc"ASwE]ʣ=ꞧ`6" P>?5zaLvB,u*%k_Bam@+%z>*k&<=ׄ©ksy: ^B[P#>Cz=.;zC(/}_`!ݺOúH)E"k%z~h9 °_s#{4e\%a,;Zzc|=Y4%Z E<7V)Jܬ7 مFeA *(G!]Uqk:4e^aҧ0* '1-Da27 AI,HJ~%Tޡ'A{94eAM_s-f_j]5jai3a֭,%ӡ\gPal\O5q+~jaraKMTv\?U)°r zQQ=˸JqcB#%TFu͚txz]4=FDQk%J"U)lbCToCOQ*=N*}~ۈZsgȦ)}V\ګFy!t%.,u~ES[OF~ߢvk¨ahb_3ӔdV kzv폢@䣺')(Qݭ=O0M.OmDPOsVC ùz~u_E( ǵV}UԮ hFG:2)c.#8P$ZblEܪ'u]ڜQEEE~Z(Jj Kt4!!-dHJ(͈G͞h{Ju)J^F{s E^YEj9tuD~N+J'YFLQ֩t-O68*QLSG]_^Ozs[=FXDTa 1E41",ta0u)k>qmBEIPEuRbMQv{J7WA S(j~j'tm,t =kzkUl &&Y)\w데P_guٵˈqO/_K9LPmӔau~fkXhVi)Ύbkq_Eo#l'e8Vq"KyzƑ QOq4bQ)5vc]N͠Xqr iʠE[ޒC_G֤3iRԢ"a)HtѼeFӔZE9NZi A=(S!NSz42BLg4gNF(Zو5X6tܮ ^",R2֏Q#P맦 Iݍ]KԤ㞦!NRӞ 5>Hjux&7{.h,c.nuO"ykK>OS*]N|}P 3빆$bXWT2u965:uJJߓW hV{@K#z;`L9$LH6n'u/[65IToNLg=Ik7d}D$/L9&HWŢï$iՂNt,Iڭ>Cɐ5FLs#iMR_aI-/},Jq5[>t@'t:J8bt6ϢʷP80A-lG$-*K4CC t)OdJA!UJOIu2gY|fLpZ!/ E#iHmHwZ2?cs#\p_JkԙәF5KoUY}kz.ܦްW^!ݥ~7@QD9>8#VN_fG?_@>is4Xd!IV6a~iJ=ԷcGЅ)vF4E}ZnԞGjɕF:J1u @',ƺƭC#,>HQX1㚒X֜wD|dsi4ѥ4vjeٛ[T앦WS}:NQ71Mi)c&f͚ϙ~f?)[S47{>M[diru@[Qۺ~P9j:p: C*5N:fYMEY>;UPVϗLS(%jd5]ͬnV+MSguoAXקRiR EsUlc$ =M_t)X^, 7YKHY YϗP6 5x@Q&=z=a^sKHYa2 'Cfs4עXRMYWԾb˚be>b}{Ӻa,^`GygVU4Y2_3*nf.8fɘ^a%r>zIߢV1,Fnʲd MhUR]9MЗS؞i{g ʳ>=퀪rfCW#DA!s0[G8''4g ! J$L"j~x# )#Ǭ<;eY2 OdפQPh9WU 7:{qsZwmn SewK$n6BwI~//]xұXZ*Ta?nlk+~>lZ??lʇakhۇ‡D[ai+}>l?lm ۪Wme[f5>lmmB#u7k h;d̆{=_u?`L3cv̘^cv~ޘ=fߵ|`c139Ϙc2[9kO9˜ƌ9}cĘ 7w5~ޘǾn+gcQT:jU3Z#i7ΜgYiݮ5^#nZޖc%;.8W=ka[w_Dq LWW6΋w^+6;29͸ŀe\~/m~ݸmWaܾ=.qʴ;7/5{ȸpO̸۽yyNl'23-}@{U&P|ʧCF)lX21O\79o)BL{>})촋)|vLa‘±5SLwL·67]` Wͺoe_2&1:˘dו3<@/N:Ҙ321:t6px[4Φgwv<2|8=e/K3s.UsY6d쒷]۞yĸĸ+oW4q>|qﳏՋL^688M3{’kMISmøv~ܘ/_91'pǁcNg"uy\w5rf]%o?o0Og9 1S~v<š1ObSǍy{" Dk̶U:y[ {YT㬳./g3ŗi`&ض=Xc9쀌?}q>qet|8`g7c-kwyqc0L887/{5Ώ33pۍEw9>qsio˟6ύ[[۸+`ܕ&б&n>}mn>͉is;y ƍ1nq?uvݧ6tۭ߸{,.0>wÍۿ8V|=yBfcޣ .Ӷ5휭{ƽ 4śq6M׌{+swNTG}q?~߸wָb kQ#w\1+Vr4t|d-~:5&|Ҙ杍iט3=o4Ϙ1:1ØS/1R9ǀ-keƼ/=2{WNA!Usڍ5gGB];77>1tnjs.ƹy6qCx]qo^ķ}yoyܧ[׸+nܕM;l[3{4Ͷ Ҹ]cܓi +{')hyI~ո7^DV= n_onu~a?0cWd \K >loc> oB̵)>| o;zuw=+{@vK38#g]Wsr;8J73-_6!v?08|.cyëB̅Sg3v<|@O|Nqq~pqn n݃y ~9ɋw'7cwW[w)>z|;r8._6Lb k;s<^l̊Jme5ׁwٍ/6 4oŶ:<9ս|0|ksO/c#ˍ}'-y bm63ζo5NX'>+ֵlqv'>co}ELj G4Rp@b*簟⑿5Q1щ1b}bK|bIbQWW#osnb}~bb^a>fÃƇ98OG><|^"yOrk{_N4jGwaĠ 6|c~cˣ6I`\sb\Nobmr;ؕuwb=7ɢyS189áW@d]%\8eicfĝs>[aKܒ ]نkSgycy{_y{˛k5`쁘$ⷭWM~7ƙw#nv튾;;{?p*wEÍӏs[-AڛG<~܋y;kWt[7v9Wӷ}}E/p^ƼVX\C8V{3Gm#&.{xj;rKX( N_#:׌t*|#5W'Nk{ѐf=[ 6`Ϡs͈ S.-u ۇ1/bb8ˌs4r z,>q惿 vyׅ50+nۘ~iJv1lU?C}ߴO7ueUphuwBg˶lܚ̷מ6NrmYJs||,۟kНQ 3{8r">˽'q`Y767[w /*w/'d] |՘]6oհtU6#1N? NŞwoϾn }>}у9ՐF _et_ n: zx.}c }Nunj_w?=a?|^jߙ~W^rJEV|}ց_lH1 ? 2#fH Nd͍3 {h 898rs6}:٠' s>1ʋ's_M\~ `݌qϷb})^sh?3d9_`ÿ?r?V$_"?ՠ~qs9 ġ+[N66.dcmEyh[9_̛wT" v _)mEg:yK,5yoPfBejQxM*`M޾vjWx>og&oo{ |]ǡױ[6xq;. w޽oߖ7\yfr4گK\6~7YBgq"RF7JG;GkVoFa8os6>lޝ؎<}%^E7For,1b#{ `+B{Sⵇ65Q]'AJD@`Z4dT%}ք7k#Ӎh!Oxօlw>X 8'^,xnM,D|21砋.Eb~,9n&!JqyVkHc?U䉿9Ŗ%[;ӏO6 mmI~b=>C˱`~ɍ&=dbm]^Hzyb{ /<Ǒ/-ӗs^,9ҖS\jGO;nNp0b>_,Byy$~48} {"qp@WV"F^ m}=}d)8˞7bK$Q;5;[TmG.<1ӱudSS?so]Ȟ/w.ȅy{bqد~ 5b7ɿo#y)9!4\#&7 ;=?yK:(x>fpqK& tz>yV#Y)[sf[/$%n']k.I2?A%a_OMr츝󳰓OƆOY#S/}qU\~#>zv5u]=M, nF.w ӓ >oL;x|1{#{%Szq(yٿzx\dwoνy|⓹/ޞXih*=n-E_Ͳ373{:;rU%ino¿C8Ǫ9y0^#^םn6z|Mjc5쏯̊ ;툭}P|x jz{<ױG.?b LvsO&%ƭЏJ& vq1)|2=HO!ם%a]b6n-{ uO&=|v<y\XI_]Ͼ|_7&[A`]9<ڞǤ>? ⊹ ^?Vx8k/>ռm/? mCܻy=~C8 !mD4c-̼ FJSN4 ЁmQ5¿;Lܑ}5?;a-a]`^[s=N^Jny<}>ǼI|-2x"X ,rM6%m+3h2N+<voqc%$ZּQd3J^v(u8xqy=񲛦~.&{}d fM|/1oM_=aw/@̸26T|> mʬu1::`q^ޤoUۡۃ}'}'o쥛53;r,&n |u?GnG-㥣1Q92zd~p)^;tAb'O:4|WЫ߾o#X4Րk_ d_<8ooPys>~g\xxjwۚzP[ /s?H_JCwv@.;4#6tئqmv /u=}>{9 vE{#-猑oT^_).xQ1oy~^p lwr?|In~TX _Sar=XdO~ }Nr=tqwwdv8yytq_&(-_$v '79l򏳱o+8+t'?R [^=ٸ?4nǶƝgRwdߕ˚YsyO}?צzWMg?O~߮p -M᯾u䭽￸*N~}7mڶ{tf]O.ztێo1k5}C.z4u]o;w:m:G?{k՚.u|-tC\I}hC.` GM^C)g_4ksKӕ{ѳL]|ӿ:kMw߯uJt̵o

o'g]^u:NiMwfxz[eMW޽{^|_4+?SxCf 6S<3ٛoΓ}}'MoX{IA}k/oj:9cf]c_/V}.9ko%4YctXMȶS~_=+~|? 'Mgn3 Y_U}b؊b ,@E:gM J؊""ߜ{/3{ܹ眽Z{|4sPr Yy"wC| ;B`>LpĕRl t md\4T_q%ddp =/| Iw̆|Hs+[;~VLXTg:t&=nѿp>#k`g՚[ZY*WiQbrӵ=C~ OGN)D~{CUDI**s} sj XRz7=pO#͡<c+F4܌l_b؄WBO[. K [G5e!;!3%\TuC\}s  vuw5Ʉ0E3.0qֵB /H vX i D0%N{ \wCÿ3i.gf ;% mCo*逴Eh-)=VE{ z72Dcˤ/cnҍ9xuD}XXzAqw~^6:r$ e磿!igu.ƵamӪ`mۧמSfF+w[dlLnh5ޓ A)btWD0lbWݷa[QANQ D: 7×ƣמ%B\={h3$5xAh%3]}y;WtADZ ?zaKL8OC1V5YuGK> =ig~<<ǾX\3R_qrMzL0Vc޲Bx8w{.ϖC6# a%E~W7iw#{yw\-Zysfps't"S tT&!!1QO2q$]݉oJNF hmxj" d|M1}.!{+r,h$MEE[+G 1ҼL"1u.{=x6~0nk0˦E]ðVQ$\ ]>(h:1ڿazU"a܊X;~دn1<35l/-,z^df+r]xcR'L2$uԆ1dD5xFJ,&Ջq snڮن0']:[C`=l\|J-LdG1^ ;~ǿ.*uy ֬W /.-TG/INUЏkmwW1F`cD= BL^tz}ex 8:ޖzDr:M%L'rz7 g0߬X2vjCQNMaPߴt9y楼 hȑȎ֜q0\Sn5 z[Tzpj{ܻנ3R°2+Z`č>-c/}~ .N>e(Z}T.E,ʁOԷBܩ6ClZ`PgGR MifpW,oq&J$7>0ÿ|ydW6뮋'riC yÅ=}bߪYS7-WLxծ:g`6wtIwvKq#^ɤpy}RCL7acPGf } {Vq rAForLa$S;1By_bΐIc'a<+Z&Ew.~9#&;%p&>h<9hck);̀HJd4|7x͚<Lm`D YO֊*BS2ԕ%G7M `Z0<61vq "r]vUHtӖb1R0g7&L<,8yaIEX{¬|޺zy|&] ?^/G徝0+rC* qr{[IOX|bIXpWǎ7QvzaGڥC0w)۷b7<")e9)kRE|CӐrg8wNDFMՁO1@dD$d[D_/ O$(<"tB9΀GE3O/ Tw&YW ^4|ԬFȪ1Li(Z(SLX)Z]q cUME{IiOy%4Pz y#)N>p戏) Fnf4`/).1Oˎ L-17Oizj e*zVT5`3ԁ^ TxDDK̥-(OA Qadw*-Fϣ!fQg6U2'Ny0ck*w:dj d[ ?eqyyqMPZX)*r}U ‹;!k.I@J,^z9  RGc&]_bJ*h0^Ѥ )756$C꒭[;BݳxKbnp&nLXw"^8w_/ ЉIFY%RӒj{%DDR}x.:'YA-w~f&MK9$3T`&G <3,{mXNC .PO+0!;!}\u$pLM>] T=1aI:#co]6[ *q?y/"h.e_4I¸qoàmG'[|ņ? NVAx"GpJ̳!)p{ay.Rj7-,?EaSMC=r{4ܛ eA[BM :lU Bΐ@Oa*5帩30<[^}Gp &TZ,$z7V:ӯ U,H~3hD>D9sFWs-y`\h[6TR=}v«ZӉorF I`E#K [gzƸvL Cr&yoy]I__\Bo\i$b y֊5Eؗ _C(B__#G}lI:t3Ňљ~4U6k$S:VW^?E[15K ڍw /.Ye:38=WTi}Rfu{"07u/FTwi4S( ]89MHc& bSJ6{I*='G/gؕ`/5C! TM}E߯8lQ;n˺t/3;= ²L@80͔q9 jL}I~23^v8\lzO Ʉ"ߎ>T3 C.ȩ'_\~.:LF<1Ąwm>q {}ABxxSS~I4 MG/ncH*| 1y+e0~nbzP(ƋhM !o܃5x=6x1t.kDw0ڇ0j+xf^c1A :^[h"a3o1# /oŢ#Zq3#`< Njx.̢#8O.-$[a4 0ì16q Tl(HoIp:݋a |(gt|Ҷ8RbcBǓ6¥N"8.~ѫdAvߘB,"},, I?H34߃K"?7ʤWgcUjC؍cZa{9ݓ7Y=&rzџ=h[c,,DSI7VhB& y*&"rxy| )I\7*٘ 0/tvM14AGBvc^dYy7&C0)w>a͋l/V:V:dpiÃ?UkIjrkerBiHlfGd~Vm⇧`'* *U{5՘Hv nәG5o1`?o>E&m@N5l ZaK~W'b\Lzxՙm,K?K? חƈiZ/lĖ•f@Єo!eL) ?tUWolcSwI]"!?80E!*IrqIa${ui _*z"suk0U-O;wN.DŽAXO0nYLrRΩw xJZTKP21.a7'.+#!MMѝƽLdK1yc_f!p"m86NinK[C=SK 8xG3wt6{<2Qwy3BkS߲11!Kh1tO4u hg.5ͫ룯nD1}@Wf)@3ww/~}qnLP_E)$hqve ~~.w VΆw{OqД E]*#=?_ihάkRʖ>U / M/3<4fnP7<[U;a|FD>(ʋTY2 r.2$ ˧ng~>&ro AooU`)^l9RH?O&cГ4^ )r~˷<5#ſ Mk=7AfɚkaH#L;E_;%P{>JK̠Rv]I^S\fj7pPY 1CF)dG6~OIL A`~:0n%bywon[.`DZ O~JPp|& U\R6ޟ2 nEۿ !_CKLddz#3Ń!Ʃ罭 Ӌ 14c>!Yr@3c=mx/,`o7>U%XQyrFPr4sY}\䈑*^Ud>b-Jy"4S0t`*ס fbۭJԏCo]P_4v14[I 6k2-TCi_NJF1<ޅ]zv2%®Ǽ 28'^QV8B},7j#AR^+).b-Z';ؗEK_YG(d˞u\,G !CqxZu(fY}/ny ү%b/޳lpŇ{4S*<oT(F'n2q~T7UFFNDqǜndIHgI `]6LSe'è4 &0K J2+wb<%Fgg0O"Q+bmzvssV ,V_AP^syqFvǬӐQ{(Z\ *pL';F-L@%;{RN?ں!L9o2t͡ #;f=U~A/SeP,`f͟^t71=W; uL ܏<A/2& *>l"}vNww2֍}lߟ!IρҘ:OJr|J #RDCƻRYc K#yi@ `3ӡIPƫt^UL]8/dC;5`$v.B[ \;-uB5g(~.H՜iC+3kCe,1 tsS7`ㄟ3P>7Ooړ1*CiO+l]Eʱ ǚؼev{0@A~6G1[uGixȭO>+NA% qژW6&Cî7&1zgOL`{=; h IbJ ?vpv{4Iu΄Z%ʛs]leru@lELgx̐:Ek[PwǾIv5n\;ǏzxϾt`ӷrdYw`A3ul`GvpdX5#(l/-'- <&VyQDx? <(e t?=WBi=קP#rh]fHPWگd<5JYy-W8G4Cc25s7kty@]]\>hxc>o'BgR!Le];bDnL5ώkP=O^t) z65%e"Ọ}<=Wj-0$Obؚ?”3w[.R_@/yȂ\k-`dxK>>=Q)p^wKvcqEC%5f UЊuӽL0K!a=>186Ljή=-#fPC[4y 9lSl;0z/O&.&SaBbx*CaW7.|ö)72OM][Tؐ2\D" h@XD/"^xx&j_*?GF?>_;P0bmآ, :9#<ʏ붎w/34C3Fߔ@329| A?@WkH ϡd؏-m-E4Lx(~wnY5uр j*<C șL=`lG~// ( OUbAUBٍ">hf3I >YWBvtǴb#ӣvswAVdԱO4k~AGi{;CZjNb:+Bh׃Sutg۱Y;w(7D >$Sl^wN#1rf_ $ \AxU_#bGoFCP,.`3L\;n6An ):t*Rq1D(A1>Z˞I4~E=ƥAQ,w:pm"QRU|qL :*y#oA땗LLۧB? 1t21*;٥LАSl @6<ܻC)憜=_-?wADII=PGH0oYh[QhVNjR8#Em!҇<$[μ3$Ӽ fv8XQ(Km&c z-P[atɌo3}m8{bw`B-KXּIs0]$=VaY| $9UmT0uXKt0u叒W nʱN13`Rlx`M('R)~ ty6pp=_3Bѓ7GF۩;Lx*1Z.I3R=fI& hZ1z"ڿ !=#9 2ݲ(c+E*=Ѳv/o,&|{DG.ٸmƥƑy4? 얮§G !+bv.-N9eS"p1;Tad1~d vC{#zx V]k&1.%L֫s|;}VrW4'jx &5YT4l.}QI"xyP6㨿bq-Pީakbߋ1+%b#8D X ~Tc.U8O1+!dC8e Ѭ1)2lEpfC2َj'φY˗HVW Z }8W(N<0:*O2yc+#i 6 1R]׶oGNrz뷉1v1;z e~x~Bbt:LǢdKNɳ%q^\<*I|)-x+E'8 icVga!<F-`AnGEmn [\wׄ:༗8hC A=j'9E0U!a>SF-/SjM"uL8ǐbh)e|=t]'z+^39EJ$hY3 i. i}yslp3Z~*|𤄎Ъ^=m`Hd.̌R'm]j Ihf t;=.xAk;ҕ߰ :J;Ȅh?e8mSh(J99>7>ՙM+9Ai.rR!th…w҄O ġdžP[3*ء{U{ @ǎAk앪]?2= 7,7ԮtbQ\En ;4Fb@3(2V)w't] Cr'B;oZĭx\):d4xB&~@N}QN S͡V8a# 2ws8R;Lx6jhpO+ɌEg 2xOϊ^G ח/FBU-B!ૂ۬Ï|2H\?+0@kȼ++{Sq^J59 }xsQFO1T"НFӛg07KG_~*uO9L'OaΕDH\k`\:ƉeG95`i>0L,T>zAw"UPG7pv·()DQ\WMo& it 49 '.F2 L8*{n!sj x]߹ eHXJj ` ^,ts-^ŶZ4'-YyݶȕGmn~3^WtVޡZ u.vBA2M&[q:+<۪Xh@B6_xQFʿlu@x/ԟmiCչMT ڼd%"P7dxhYFhBo~ D+3K;!I/wyI NVdQDhqSG׆CUJ몤>wo 9Yռ7y"4;I;w ^NҚqh,mޅ>_/Q /oO i{Ҏ@x jBQra&$/^: 3~cGǭ;6[^[L={]{b0` ͫB㯰bؐ Ր #L]{%VvqL㡤i}E ͊)y..ѻ2G0yvH!soѶS0ZD㽇ͣDg`mǧ͔aApǤ7 khmi~K bhZy VsCz#yOkbV ѣ.f0ȟ@ٗ6b %l]7^[eZW+%́@|U3%|љLUۏ']" VwB !L <[ȍϐL搱m㰑!cw8% `137]Cy dsY]h"q 6~ #U`PC u F s0Gl1Jn9XN L,h~ [FE'f~K(j U$n R,!8Wt7hH_?a"Ճ>4 }KBꚕCs(83FF7oD炼sN}FHʌN0Ş׾+;Zv`!柸b/HL >8#NL؇YBSo59oJo}Lwjt!YFpfE ͮ*tzt%*TrƂbl@cFTDdO) Ml F7ɲxͧB| c%kd,\ 0:brx{#țh{_T#:9v ص?3ᄶˁ8uUЃ} ˃WC殹1WH;OOk5YXs`R(ף C 됼=_E^HEd/B%Ⓝj|3,uuX@,q"؝6H"3稹$Llu|SB`Y/?/SȝBJ:Ө'1jjzcȥ))Jː=͊A hРs9+=YKAk|d q9Pci]/f uh&, mV(Bxu˨0qva>+>?$TZGMVuݧE̮=͋fpg=qA=ȧAL)e0{oD:OZa6ȡ]81]:-S,SLT6Aca5i "Pbn/R/:c>}hnjNJC1qT_B}ʆ-.2jܧ$A w,c9`_bEO2I'D&9V9@O?VZ6u8VI\oSEgřzUdRxS;F"cY֧boeԐkB!>N#MGv#z9-M1:dz0"!c=a8Et 1>'XudmۊX 0ۄ%d:#λH.b?{_;ڰXY(>`.QYUt=g'԰D XAو%ڗD"ӏID/b'k$~!^>)5]f.vL4v:Q cFj?bgbOv<}_-R-+K I.;oe`0y,E_uq$ʜ=,jyq鋹IR{;<i^Zbۃ;: d=1Dz Q'nWZ;V?>:撲G)F2v9-ҊL r)~'e"ҎVteM;X}݃.RzA{K1$>7&;w@eDfsk[:^]w $wkb^1"&Q>gðMBV6e8|e$c5jg#׳ .dgFaP"y@g.b|ñt];$i5cg4I4~D\J|]=(/#o%A<3i=$nUn*?=#xKyVtB֡ Ѽ>QL|*m ՏgCM#Rh{jb)Oc% (XZѥolF*)C+C;fR5aQ0&&M1cdTo(yq`CC+$]Ԅe4y͵nDnmfGFDҤ)2jJtۡ?1krͮ+ȥ8V1z ^N}cЅueϝX2B 4tp.rΟL6_U ]i>c=(D/7:2d^g#O=x9ҪV|5N ,F&:sSxh2(Y2o}& Nޒ3pMWPP}fגDwo0}Gs~O ̝* XFa> yeK,FG@C'Y{17fEPB@Fj1pC.vA2}y IS F" Ne $Y>5opu͏0*< ̼Bdr p>uY-!8c>bLΙ'lo&{OӔthP1~fveVcQO1a] |H9"h#gK;}"jyL-XfED"TE.d'|^XdBMxP A%TO!1s8$H NLd~YX$˪yyBvw?l};8F=m9Jv |z>7zʢ.@,C($.#P1AW]nDSc!YbjA|οތ!W u6_EAn laSoa w*%Y٠Ä}Q:1g umъwg|.7<{/בu,1%159= =7K 4ͧA@iO%(]g [GVATЦ|1S22uU6&=W> pTzp*F<(AV!a* QehϢ:]B(%yB\~A]~8.׾*ܾYM{9w>}[9m_gwikK*wVG!mxUO{櫯rur96xW^zWuYpxmJݖ6W:\TE G[pO[WKҼyDڏzt4'ΎxUG)AsWnKq7>/uSzauW7+;$9s7pO?9G>>}2^) lt:%D߆8.Eu^;lێEhQbWUۗqݓOjb{ΥQnz܎ .Jn١pܐQUt]tQRlHqy|\f}gn|{:Z(ãF7=7Qrc.[/8gju#zDO]},qkw!E7?4νv^o=暯>'{}Gڿãn[G;˒>ՎnkrOwח^p+ud5>qswd΀+o:Z@Û9A\s?\پػ'ч. ~/ -OeD7I.-Nkumnz;\_u vINTzFancrV>?[|$nI_ VީϢk8޻8VUϞx?]dm>|Ǎ?7CzJ6I͹k|܆rEt|/ZuKqsIEٟpI21ޏxt.$Vv#qxWU/=vGx9a総=&ra2ߖޕ,*Y–˾ts=\ޒ/tR?5 ;?ujѴw O[~m/9gN-]zW|gt+uGTs%Yk>ύNO W O?\[ G\c=o(Jns?hR!gq-t&?[[w;g\MK g}ƿ :nurFæG~ޕ9nѓq"Z ?Ҏ>[EW<>9}҃}~&_umwU$s <Naym|3/zsǯliu~=pqkWO|?yɺ@+Nj$;.r\ϭ5|RzY^{6:Gh=Seux'=3^ʵi^`#9+ѷuiOO^OC\}boS&&7,kn)$ݧ/Ygp%sK~A'}_^<%j[vygm\r]tm[ı4YsW^nǥ}+]9k+N 5[˓&мۅRcO\YWUͿy eQr0 $xc|\{_;밎7.םǓSM : ~];l/dR+Z7y^ބ7GijxR˗=_|,[o)ol|Gwl>ʻg̋v}yh79k^ !7G V\MN?|}ǿͮ,j۱54Z•soṋyboOgaOd=KW;nx^'}}#%s wQ|,_Ǧor74q_6Orsݢk=jn_T˸sɮv5>|AsH#J7I%./oDWA(Mi"ןs+S<ˉvgo yyWs<,U;=ѷg3p`弨gNф~hzitVTS>3뤟Ms腹|}گ|sڧ!nېkߺI5nƕ>osMroZ/mm{-Lx~b{_-m|N sĚxM`|nz򌶗ϫ6ʢv8>Nr+>mK~Ӗ.7Qnw+6V7'W닋l^uCMyerM** w״u??r<SAQ^qZ\{崯8+Lsr2;׌pr.k/-IG's$t8:_!4KW=u-~=Эcq1߭]|L閤66ď7uiU:G=/yN>ngŵRoW^}j^= {\p @[qa;mlkn~%\ou3[k>ʳysr+N}>Kjc yK2Ǐ'mM뢬-=?mp?yy^:iC6qҏ9XnR<[^Ήr%>}Cr#{M:t?XG9^s/% `&Q6<n.&ۍ$Ǖ< kuWK*Yr+_gOVR-qy0L̍9wǍ\^O4??Uh8yBܰ( yU&G^HϿW5ѴxZȟUG&Oҭ҆vc1^FǛCξ w5W۽X+ nQ<%}Ҹ=i\>>ӈh Rnr::orIN+iQ7\}EϺ ^9'8JIN\yQo6?[&?}|W^:p>\Xrd4ckz<˯{_ϫCOƒB.>[h |EB_C3I%˟؟Ouɾ&/eЏo3ݠwyq\7$s%Qlto:٭Vܖ[OO&vh ]\C4 \qIq1IuӴF+{-M΁U5v ҤN<-X~? ٖws&6>Eݞ [O;yܯ֦}Fo[1i_|Ӧ{-^ViS~iS]ߪ~>y>w>OT]I2 Mعt ve ׷pnS/q{K/"}xie@.y<+;9ե< Mi۸wܸ8JyҮ]Dn]6ztW'=;ɼ^1pE.I}/Ǎ볿j4d7uG|PknS^]v]Opuf7<==9ʋh'4qo퉃nv4nf\_&Ne43W-q[yL1zusUB%z蘭7NIYsI)^ߘCצ'y_@굣3'tg?Ͼ{QOG}Á ['R_oxpɔvkx|;Xn^`w=.spo?˅scc积WE\շy꾛9mEoMy/ Cxe8z\6k1TinAQ# їN}toNz~.ū_Z/T-X hd8h­Jw݂Î^(%Ӽ1k6hs>]/wv/DBk'sG.h]~W'tGΙa/w'>eɀh=o[|{f#WsYg7īqYr/qi܆+g4/4,YQ Vr- s~nCsp)RSeQqUCoΌc\~=7G\ o;2o:,0-4~⧯) M o\J<{`\7vv֋w>op%Aቪ<}+Mm\Wv\q}WwN87</j}GߊDrhM?>Uy>]Έ<{vTF5}>dȽvuͭ~xϿ{DtqS?ק8G5IDXW;SVOzE_xg}ԉ Nxaql=/rfq}gaWWn>d?^tRK;줱\Se3][71]|.HH/3 &nSvW=uݯov/?=N=Wkxyr~14>/7|yc'%jG+>(s z\ZwsU,ȑ'l{ki!g$=Ys݌9W+IQ,YeGolՍ_ׇ5~׎$?{_dN{>YK/;>y%siӲOs7}>WpEڟ_*;劢;lʭ&xF4&oxUƬEI]!ޘpiƙ wKz>.z==>sr#Sx ~kv]xq];?d|^M >O?^r*ws&wlr6wxgdW^vEٕʮtve+? +]e5(AY jPVՠe5(AY PY PY PY PY PY Y Y Y Y Y 0Y 0Y 0Y 0Y 0Y ?g5~VjY ?g5FAV#jY d5FհY հY հY հY հY aV#jY0f52 aV#; RɥK#\riRyR͓jT'u}C]P7 nu@P7ZkZkZBP7! nuCB]<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<+"+"+"+"+"+"+"+"+"+"+"+"+"+"+"+"+"+"+"+"+"+"+"+"+"JW Rx+^)JW Rx+^)JW Rx+^)JW Rx+^)JW Rx+^)JW Rx+^)JW Rx+^)JW Rx+^)JW Rx+^)JW Rx+^)JW Rx+^)JW Rx+^)JW R4x+ ^iJW4x+ ^iJW4x+ ^iJW4x+ ^iJW4x+ ^iJW4x+ ^iJW4x+ ^iJW4x+ ^iJW4x+ ^iJW4x+ ^iJW4x+ ^iJW4x+ ^iJW4x+ ^iʀW2 xe+^ʀW2 xe+^ʀW2 xe+^ʀW2 xe+^ʀW2 xe+^ʀW2 xe+^ʀW2 xe+^ʀW2 xe+^ʀW2 xe+^ʀW2 xe+^ʀW2 xe+^ʀW2 xe+^ʀW2||||||||||||||||||||||||||||||||||||||||||||||||||**************************************************,xe+ ^YʂW,xe+ ^YʂW,xe+ ^YʂW,xe+ ^YʂW,xe+ ^YʂW,xe+ ^YʂW,xe+ ^YʂW,xe+ ^YʂW,xe+ ^YʂW,xe+ ^YʂW,xe+ ^YʂW,xe+ ^YʂW,xe+ ^Y*B*B*B*B*B*B*B*B*B*B*B*B*B*B*B*B*B*B*B*B*B*B*B*B*B*B*B*B*B*B*B*B*B*B*B*B*B*B*B*B*B*B*B*B*B*B*B*B*B* No'ȷ v|;A No'ȷ v|;A No'ȷ v|;A No'ȷ v|;A No'ȷ v|;A No'ȷ v|;A No'ȷ v|;A No'ȷ v|;A No'ȷ v|;A No'ȷ v|;A No'ȷ v|;A No'ȷ v|;A No'ȷ v|;A No'ȷ v|;A No'ȷ v|;A No'ȷ v|;A No'ȷ v|;A No'ȷ v|;A No'ȷ v|;A No'ȷ v|;A No'ȷ v|;A No'ȷ v|;A No'ȷ v|;A No'ȷ v|;A No'ȷ v|;A No'ȷ v|;A No'ȷ v|;A No'ȷ v|;A No'ȷ v|;A No'ȷ v|;A No'ȷ v|;A No'ȷ v|;A No'ȷ v|;A No'ȷ v|;A|?5>DNAcopy/data/cytoBand.tab.gz0000644000175200017520000001430114516003605016653 0ustar00biocbuildbiocbuildu˖dmE鏩u?SO4[Zv*%oFf(Jw| 2?~}/׷Ͽ6۟eoכ+?iU$aET!K$D-rUd]٧vB[A^ȤD*T \(SVR( NKz- VI}R( ]華Z !<"; [P( H/{25(ZdVʻO)9Owys~xl UB@bs]sȮ!Bnfv:Jv #4ˢ̯3-k2vrE!{Ag<|X9#~gm֔r Zk+8ގMA֖@֯F zX* g|xvSZdE(uBR8-u&bl]GQ UD.V*7e:G6zDng|rt"< c?j#י^a(UR_zR #򺶵ہzz~Q Ձ:_'3爤d))'y:_"8k^N5]";Q( \8<`ePHpj3U=J혔Tt5A"GeM{Gŭ: @F<T+YP)OUZEIՄ%I)?n"l7fP&v 2mXnWQ,:<ٙ`L^ pJ1Of(T.@+ےҌBiRZADmnfa6U,Phlp9;%*b- SBXcnȰ9;.8=D6xBi,+:ðlQ,->+Яc>JG3_Ju$lbq1`MË̝U NZg? /vQ(zR/ =RkyBck)&Uثgѻ*sPb.-M,!pSŶ~ `ʝ.ԡkR.Q;Z:'Z, 5Ҁo3Ҁ1@T %lح?BK5DRi=#MR5)"@-jI欐M_@&1v0 <:^Am =W0x@6:$rf*m#R!>;]<,jN=I%y ]Q?RVBRAHicqUj(x sWOYH\ x$ ן W#p\J2.͕2lM8CfǨpbC%Ywӏz'_I9W2YWrӔ2c8XpJ;YgY-ul&"J؍Dd8 X{eq8YC}@R#DUެ# QW7Э@m0J`ǥNh1RSlЭX{B[K [fBaia~DゥC[ΘjA0%52y4g87M#*=WE<[I?rRPj$.}7 Tպ)i$BNcӀt Xʍk= >-2,mF &qz&iE|1D8# ztK8u]S(xsEfE9V@Wc=&a/@ qkd,gUb-..KqΒ:^Df)jKR*u57 Ò.^:rcw/1)V4@O Ot =7Ձadf"Ċo-0w@2 y )6I%[Hqv #,(16ۉ%ro]Xb4e{j#-{,!$Iz`g9JC 2=w@q] | <4rVɈEđ-YtQq!N?u dW]yd8+;y+%Os:בx/[*ՁEKV ݫ.&BJ4DF6P*vm7[ d?X$f;^E(ױ1y!]s'OMK;63x)GsFQ(bN4֣9qc77lUZ!WϛAE MaƊTZVi1 or1Sci@Z=4`M n\ZIAq`_@֍}qC0 Ճf(1:7z-F""Ar_.<$ҝ灯{1d@$Q,]5EIde,V’CujWP2V)_rm[,E)5GFN.)Sr3rB9e^NN5kE -'/5E`ʝ&X7$bp-DFH?zSLubʄUf|Il$$o9K~ eFj Үpu)XkkIz1T@$o$j@Si+(:Yڔd .Zv @I]ԼӬT#4c"C#ɠP!V Z0s@an3iZQÁ8z( ҽ?k9V0 Pch&{#JH,]cPgEf6]$4*" Υ%wYK E'O% g/K^)f 9H(h9D6a}X}xx3#9t;r, әDЙ?l;XĆE !XT:DM—/J*׾"aB}N0.QAki&k:.WUqE>1H%6,Dfi(f$M%2+r JŤAJJ]H,qYN)M̪% Z7Mhu/etˮ7\pK#(џ0"71^{G/Zb0)h4Aɢ&@9W/Ԅ5&M *HϛXB&44Pţ ,c.K<煬{T=P7jCL`}lB%sIGC2Xƨ 1,%.qrQ,4[zded0I"Bpw]dKN4HAB%Z 03ڝTou[;J~z3OM)&r`\o] :J].m"&sH"&!1OԤ 5&z,gQeyHRCB/;`aY2~%Xʃi87L[  ?9I|gF?^=qzǻ dwPb@|I7:8ڞr#%j0yȔ"bXdE@\"kĹ[ HxMO#a|6=OEAā nM'ƨZ, H&UҀu3,aJt`bu|cD5 rF;$$+&k5vոlяodi@z[ܙX/Ż.=O 0+a>d%"Ș,f^'3N' ]W) r?SWrb8iAoEC_cq;!ɟFHi]RNvjd6xt]"MaDTZQ_UD[5IRCGqfVѓd椓LaI'[WiutExI72C PQgJރGDZ;h&"@O\AΧȉX_qd Zu!U%۔:  OM.|Kz:ih0*Vp d=wK,fz <ӕPk^[ h/$ 熐г󍇜2/p!=Кf.*!N$'&"޸xDS> q /mO'1SOcY/}УuNE@ʞ}?9+z\B}cQW2`c^cxoĕ=kWll DYdFk]EdmYӁr~]%Le񻜝 ^rl*Q8ߋ)% I汜@e3՘7$/;P-vUM(H ]5ϕP$jQ`GM͢5˗ad6Qyq[^)U pKq\$s킐^͵ q<~9w|~O{TQ̴!X{*JA* & 4q, 7VSZ 65͎ !mϵp=DOzrsjQX >*o28a{\YogH<:;jOw~'%%1- ;WҀ8*ɼbp ѻQ=vP3bI6UEt)B2NБ͟%Oh 1u0]aE@R6/ ޵(W_;=KjzOUyA&.:z/~YfWz^4/KpDvyۇH^g ߯xfޅ{]mz@'2ɦZ{</ >j*F|%dz@u}@'ҭ꿓-=P郼2Ih_Z~\zDNAcopy/data/default.DNAcopy.bdry.rda0000644000175200017520000002714214516003605020357 0ustar00biocbuildbiocbuildmw,U[ι+WEDDkD0 (A!0 k0 $AEDƀ"Jp0<{7tW Z{yO{JY*gu3yXZi99/^v}G-_r+^=~*"T3*JpjPxYX**Jz2;{$sx|gR]KaRɟT60W2{}R^xo^T^],d>K^p+Q ̲RfV*8 N>W*=d̹%s=!m07d\/狯s?l`Iϸ2>b|X_cgl'fMaFald\ѷ4>~) |]` bs_C?^KxCلRɐ_q=]Vsmde oSցc#,;ASx]'@J4sZW"_ҀqYsM \ O#gkg1N.0cb;W{h{'sjb~|7Eob]2Bߙ>ǜ؍hַ9gCp7&s^Ĝ_dN";'9\d=]d\^ۘӇ;'3;v8Y{Ch7>U23|Ƚw{4?t5Mm;XЃ>3ι̏ϟ`.6=<4`sh p!#\!?,%L Ȑw*{*˅Zjv>|8;ȅа<XG Ĭ7A 5 ωsrT< /Yw pͷk9`[?8`!:6bcXeoYspc>v^^-<1Z0(Ϡ;8Lm/e+Z Kvy 65—NXpg{G %z!z1g%`@A /NF`l4u iSj|=sз3{&υ7kh 2Є>9X"OصS RBsu4as h|tq`:Y~Lbzs;/@~K"1`c)6 rI6t' _`]MF;j]hs!? VM3tg<с<П%Cl4#mܗ.lȅ{,dWѶ9{m:Ȼ -=x71*ts` :X; b3("aӎ5:d6ȢI/ !<c1A\d<)4yb=l2÷d\mL)^/nC-xF;r^([W&` ϧxΰ9㝤7P*6RO9~wMyÙ=f6ٚp>uЁ.C^}7km@3C8q?]~ʳ3bn6G?>G%0{d;E%w)::!Ąe Lli&϶<ȫx}!6 2ctnžυSpx:}GY2ǒx!$΋6ă Iбb1GnZ -%2.ѝAmZPgClA#{|8ǦMo( .vv5K!>22%< ڡЪ,ւ{k)>u/kı 61Sĥ=-;NzC,2nL'v%>oBc-5S68, Jэ ?ag9q| d^T³Xb@]68F=]gb#lfl.i  ;l<Ğlsc|L&)v=u oGon C-ԱͿB~?փ֠}7߷m0ta~ό:~1EGg[~s=‡@b%t/7"jdz5#˱/=.cʇmZ:E6iz`R?>Jn|Ȕgߡ\Ç XsKh 3BLH < Ώs-ͺְ4kkб6zsM}<t:&fqcƜ,rf(d Z eCttl %Дb{('sb1yD׭ yXل8;]t! ~%]4{\kV&*ɔf`9Ϻ+&DC !:b+6;_9G1msbs_bO%^޼n}x [ÍWiKSzчۚuk;x9.Ofb26'X{X\-z$~ѻF^&>Ǧ/ /kö tadUUxMkmu]6 :&t/鳾Cd 'Ǔ 6%G| +;ˡ5"&丸'9X5G~uzQ|G{G6[֭5L ZWnCsآ VYwlgQ16K&kSS|l{4x脿4oŞF[I mݼA/-uos/ p06dP޺nYm-lv=`;`sOΩFy ~jB<䂵Sl;$-E<0G[r!`OMﴵ=bJ-5!Z<_\&SZ#Uش^t3u줁<MdYK@C{Ax| X:=39HtnLോ\}!ъ?c9>z ^\ܯ|4Y2fosO_}$^ )6~Z{~Qe%:5V5l`Mo6ez& >6@;m|<.6)>iz'Ӝ5xɃ>8sb%1 ܊ѭWIџfK9|Ϗ1IyˣպucU:: oKO{r"ԟ(]~~a z5Rq'ьa~bo;fA  פֿ/ѓ9",bx33%-5u(fjJЖ,*u-Q׭vt<&s6:(eN r\tmDL9&~J9fle0vV-v:G=d ;Xtl]025bx1O=$a~fk׵·笹4߫l竖W*cXcrlTyb51t ]}SY?tL7 9A\paj{gI)1 ]  wr*kK%h>&5{2blR-T,ydӯUYȺ> c7m|V]LJ񗉝G3BfKG:g'sbO` Tom?J ߈MB\okܚg9ϴ4>X˧mzK~āUN5Mt }j;Ce<Lg:aOSs#ʁb>,LbN~^䋈"b$9FM135[b|R_.йBLi~sut?m@sZݶ_{ǿџ5Dw_GsYFWg.{ijVxq 4'{m\8H舾8%ޓr3W{P9Xl~wYEI]z"x}@yWӯ&ܛ)2K%?naaz}^z3Myodo*XRCw~ȶ- uXoߺCz>>s!!v?dM0FG1=Fg'`tM~SSlpf۷4Gf^O;#Z%c~ɩ}`V9lS@^40{8;kll2g8tk ?3g9gr|߿VL/'8uUG?k9g+ p#}ˈ3+^ UN ]0n>SW߯aW׉w)ojp`c{>p<[;7܊A1Xm?&Fg3G6s9&s'-3­TG6Fw*˄=vQ}?@fr(s V}VqC.Wdm?VM'u|3ǀc̆;)7J#/xXmmpU1 +55Bp;Z,X́c_7C#g2M*v\ :5%#Еkd h/ʧ7՛ְ W*:S7gۄ|kU;:=Uq6G}d?`Ù|`7#tmCE\pfz85Q>_"]1"~Z¿%tUǷ*5a]'$/g6o#fs^3g4y|gQWn}UbձrnI{g|P5y>tQc=`D;d8F x8wl8j~sb9>rs-L^\ ,Yߒ=`H|O5C7&v4) wkiD9>57=>M-Ln6ھʇ \cQE54ƍ c{H`K]E^=;`WCpe_dW#e\;F'oRLNIz{l~+y|1{5і¿93ox./SO}}ǞcC<)PMW6u|5|dXfz} m#j }]=f  ,P>:)bm*w\?O/V>לtč]_gLml9=< ̎/BOÎ?$A̹t3#ʱ_l{W}')7W}byCxUY[xy[Kn"ۖiƦĊbnS.#}d?=|ar5NcwB{r_);_<̻L{`jvO#/?}QAL[1ivV=/rF.!_C/]㞺mM0yj`t3A~].Ak#l?C78b5f16'=5O&c7kl?ǧ/+,e'+bՔn+ gb=qmrC\ qPZht]>V3ԯ7{O|8 4ϱ=-|r9uL$?vGlC>:<0=#w~!op9ǷNn$j/fm|cgАC~[3PYU+L[5dUC_k- %sfaP=]4;x~C>9]!6:&cCsΜK/לAϧ,lM|s'ڃ9MxZM>uumq{\mC~HVGq\*-ONT5'}3Nsh_|ه`N|#l3D>|'o'Gy3T?2lo꜀UC}Qo˵: пW_ #JZ-M Սԓ_Ys"GUg~b79<ɞ.N[朱ϙ#;f~NU\Aѩi /LM>D4zL ǪhIOWᯪj߳i~/~i YTvRC'>7Gf=7%`ez ޘՉ7}ݩ<6;Љ1c%UPl)|Q3t|]sb9{9^'6Ys4s۫žY(2L=_bILNT /B#=o],sβ]'c5좊veC{54YFܺTFdAd=@qf {pb<^砈F1Y%\>Yɪ!s~fip_1)Yy;l-d!Dcy >F=gSd3q:;ȷў KE:V_=LUk`@} ̙Ft,ZΩlkv:[bC}t<6=)Ngh09c3tv1z^cliAz9็?>cO ] IEעK`klSC},Л/9-NPP_ɣr֗7gB{ʱzE9?O>Qb?RCİ547z[OTKPM\i6w q4s^;&mz3csל$ޘꞯZ)nTsk WFoef>0}:_^B!h -zĈNc吹'v}AN~cj*_ESJtρWp[vI{ytn`:yrr~ofαaϼ=)y bIl Kt~O{7 |a%/s`z"t_S O /¼?75uŷ s| ݫ"*:SC`}i`+m/j}iW;l_[tLya+rddߟni|7߱gV͝ƞ\嬉̈gvlc{{^}|ЍMǯ/{M^mdH\!Cg>HvҞL ~6)=RK˞EWy\ֹ$F-f%bt߱5YugDf5bF盦;O=Uw2}?Pr{.͙O3j=5Ŀ:ݣsֱ:U{ٝ?¾`F]+ؿVIgV꿼\y(F;V_x>|=Ee=<[q m%'W:wr}\u'_{cWq^Ce .Tιcŷb+hߜ[w˼o't;W?3y ozÞz\.־ۍ.S>Al9,M_>վNQXЦ.ՠXQ}Ϫo'.X#X*z͜B6y o!6:fMl'N{Mx}ɪ?29kڳ؜F6FG'/Ԭi_Non:G8Qo#EG';GGD mςBܓ3Wk9'e]_׼>U?/T6AϵI5tz 'ruӫuz=-0mMt}WGx]{zq ;*o GZ{zvhgUhKG2q'+{Vv}3*~kG>U_+7gS3Sv~OQli"OS1#:v%a{zh: C}7}䰿 [CS>x`MNxg˜}9~|vNvAoRq:mԙw\Mtn}oy9\!YwR|1YÞ< ~>3G)3!1GÈxfgË3g)'GIƚlw ʉUIgv/-tLhK9kUk?UviO`(k?:OV]ќ-E纞]ЃUE/Tԡ\`c+Fioݬ:7jN}GOw3:S8sbUx;W \?/־[cigUӛL>]љυ6 n-k, not and) in smoothCNA.f Changes in Version 1.21.5 o ADDED packageStartupMessage THAT CNA DATA FORMAT WILL CHANGE o changed filename of NEWS to CHANGES; file format didn't work with news o changed function .First.lib to .onLoad o in the function CNA, changed code for ordering by chrom and maploc because of "na.last=NA" slowed it down terribly o removed the unnecessary rownames command in CNA Changes in Version 1.21.4 o moved CHANGES file to inst/NEWS o documentation of CNA and segment say that missing values will be removed Changes in Version 1.21.3 o forgot to deallocate memory in the new code Changes in Version 1.21.2 o changed the code for htmaxp & hwtmaxp for the hybrid Changes in Version 1.21.1 o changed our affiliations in the vignette 1.19.6 became 1.20.0 in Bioconductor 2.5 & =1.21.0 now ------------------------------------------------------ Changes in Version 1.19.6 o added function glFrequency to calculate gains and losses Changes in Version 1.19.5 o Changed smooth.CNA from all R to Fortran backbone Changes in Version 1.19.4 o Fixed infinite loop when the logratio is constant across a segment Changes in Version 1.19.3 o Redundancy check by Henrik Bengtsson o Bioconductor fixes (license version, BiocViews etc.) Changes in Version 1.19.2 o Fixed a rarely triggered bug in the new code Changes in Version 1.19.1 o Faster algorithm to compute the CBS maximum t-statistic 1.17.5 became 1.18.0 in Bioconductor 2.4 & =1.19.0 now ------------------------------------------------------ Changes in Version 1.17.5 o For weighted CBS return weighted segment means (not ordinary mean). Changes in Version 1.17.4 o Bug fixes to wtermp code and how it's called in wfindcpt. Changes in Version 1.17.3 o Weighted segmentation code added. Weights per probe can be used. Changes in Version 1.17.1 o NAMESPACE file added and man pages fixed to reflect it. 1.15.4 became 1.16.0 in Bioconductor 2.3 & =1.17.0 now ------------------------------------------------------ Changes in Version 1.15.4 o make sure there are at least 10 obsns when t-stat threshold is used Changes in Version 1.15.3 o the minimum width of segment is user selectable (argument min.width). Changed from the fixed value of 2 based on user demand. Max value 5. Changes in Version 1.15.2 o changed to a faster algorithm for calculating the max t-statistic o changed to a faster code for undoing edge effects (redundant perm) o added basic functions exon.segment and exon.changepoint (workhorse) These functions are used for finding a translocation using binary segmentation. The data for this should be properly normalized. o fortran code re-arranged into different files Changes in Version 1.15.1 o updated the call to get(getOption("device")) to use dev.new 1.13.3 became 1.14.0 in Bioconductor 2.2 & =1.15.0 now ------------------------------------------------------ Changes in Version 1.13.3 o Added segments.summary to give the median, sd & mad for each segment. Changes in Version 1.13.2 o Modified the p-value function to replace p > 1 with 1. Changes in Version 1.13.1 o Modified the p-value function. Added pseudo confidence intervals for the change-points. o Windowing option has been removed (R & fortran code modified). 1.11.2 became 1.12.0 in Bioconductor 2.1 & =1.13.0 now ------------------------------------------------------ Changes in Version 1.11.2 o Added a p-value function for the change-points. This is based on binary segmentation and not necessarily correct but gives an idea of the relative importance of the change-points. Changes in Version 1.11.1 o Changed Venkat's affiliation from MSKCC to Columbia University 1.9.3 became 1.10.0 in Bioconductor 2.0 & =1.11.0 now ----------------------------------------------------- Changes in Version 1.9.3 o Added warning that windowing will be deprecated in the next version. Changes in Version 1.9.2 o Added code to not bother with p-values and split the segment when the maximal T is large (p-value will be tiny if T > 7). o Added code to not split when the maximal T is small (fixes a numerical problem where a constant large segment can have a significant split). Changes in Version 1.9.1 o The mod function in fortran inflicts serious time penalty -- code rewritten to fix it 1.5.3 became 1.6(8).0 in Bioconductor 1.8(9) & =1.9.0 now --------------------------------------------------------- Changes in Version 1.5.3 o Fixed the subset functions to enable sample re-ordering Changes in Version 1.5.2 o Bug fix in plot.DNAcopy (triggered only when #chrom=1) o Added information about stopping rule in the Vignette o Cytoband data from the goldenPath repository added for future plots Changes in Version 1.5.1 o Add a sequential stopping rule to declare change early o Bug fix - make the object from subset.DNAcopy of class DNAcopy ############################################################### ### ### ## E. S. Venkatraman is the new package maintainer ## ### ### ############################################################### 1.2.5 became 1.4.0 in Bioconductor 1.7 & =1.5.0 in the development branch ------------------------------------------------------------------------- Changes in Version 1.2.5 o Updated the vignette to include references to additional features. Changes in Version 1.2.4 o Seg fault occurs if window.size is set when hybrid method is used. Fixed by setting window.size to be NULL in the function segment. o Added options to plot command to draw line at y=0 and control its color and lwd of all lines. o If ylim is missing it's calculated from all the data instead of just the first sample. Changes in Version 1.2.3 o Modifications to the plot function to make par("ask") behave better. Changes in Version 1.2.2 o Modified the plot function. X-axis is either the index or (cumulative) map location. Incorporate col, pch, ylim etc. to provide better control over plots. Changes in Version 1.2.1 o Added the hybrid method for computing p-values to determine splits. This speeds up the computations considerably and so has been made the default. DNAcopy/inst/benchmark/0000755000175200017520000000000014516003605016000 5ustar00biocbuildbiocbuildDNAcopy/inst/benchmark/benchmark,20090610,segment.R0000644000175200017520000001230414516003605022412 0ustar00biocbuildbiocbuild###################################################################### # Type: Redundancy test # Created by: Henrik Bengtsson # Created on: 2009-06-10 ###################################################################### # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - # Startup # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - scriptName <- "benchmark,20090610,segment" library("DNAcopy") library("R.utils") # Record current random seed sample(1) # Assert that a random seed exists oldSeed <- .Random.seed # Alway use the same random seed set.seed(0xbeef) # Tolerance (maybe decrease?) tol <- .Machine$double.eps^0.5 pd <- packageDescription("DNAcopy") pkgStr <- sprintf("%s v%s", pd$Package, pd$Version) figPath <- Arguments$getWritablePath("figures") benchmarkName <- paste(c(scriptName, gsub(" ", "_", pkgStr)), collapse=",") logFilename <- sprintf("%s.log", benchmarkName) log <- Verbose(logFilename, threshold=-10, timestamp=TRUE) log && header(log, "BENCHMARKING") log && cat(log, "Script: ", scriptName) log && print(log, sessionInfo()) benchmarkFilename <- sprintf("%s.Rbin", benchmarkName) force <- FALSE # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - # Main benchmarking loop # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - # Sizes of data sets to be benchmarked Js <- c(1e3, 1e4, 1e5, 2e5, 5e5, 1e6) if (!force && isFile(benchmarkFilename)) { benchmarkData <- loadObject(benchmarkFilename) } else { benchmarkData <- data.frame(J=NULL, seg=NULL, weightSeg=NULL) } for (jj in seq(along=Js)) { # Number of loci J <- as.integer(Js[jj]) log && enter(log, sprintf("Case #%d (J=%d) of %d", jj, J, length(Js))) if (is.element(J, benchmarkData$J)) { log && cat(log, "Already done.") log && exit(log) next } # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - # Simulating copy-number data # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - x <- sort(runif(J, min=0, max=1000)) w <- runif(J) mu <- double(J) jj <- (200 <= x & x < 300) mu[jj] <- mu[jj] + 1 jj <- (650 <= x & x < 800) mu[jj] <- mu[jj] - 1 w[jj] <- 0.001 eps <- rnorm(J, sd=1/2) y <- mu + eps # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - # Setting up a raw CNA object # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - cnR <- CNA( genomdat = y, chrom = rep(1, times=J), maploc = x, data.type = "logratio", sampleid = "SampleA" ) log && print(log, cnR) # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - # Non-weighted segmentation # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - log && enter(log, "Non-weighted segmentation") t1 <- system.time({ fitR <- segment(cnR, verbose=1) })[3] log && printf(log, "Processing time: %.3f secs\n", t1) log && print(log, fitR) log && exit(log) # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - # Weighted segmentation # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - log && enter(log, "Weighted segmentation") t2 <- system.time({ fitR <- segment(cnR, weights=w, verbose=1) })[3] log && printf(log, "Processing time: %.3f secs\n", t1) log && print(log, fitR) log && exit(log) # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - # Record benchmarking # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - timings <- data.frame(J=J, seg=t1, weightSeg=t2) benchmarkData <- rbind(benchmarkData, timings) log && print(log, benchmarkData) # Saving to file saveObject(benchmarkData, file=benchmarkFilename) # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - # Cleanup # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - # Reset to previous random seed .Random.seed <- oldSeed log && exit(log) } # for (jj ...) # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - # Benchmarking summary # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - log && print(log, benchmarkData) log && header(log, "APPENDIX") log && print(log, sessionInfo()) figName <- paste(c(scriptName, gsub(" ", "_", pkgStr)), collapse=",") width <- 640 height <- 0.618*width filename <- sprintf("%s.png", figName) pathname <- file.path(figPath, filename) devNew(png, pathname, width=width, height=height) n <- ncol(benchmarkData)-1 matplot(benchmarkData[1], benchmarkData[,-1], type="b", pch=20, lwd=3, xlab="J", ylab="seconds", main=pkgStr) legend("topleft", colnames(benchmarkData)[-1], col=1:n, lty=1:n, lwd=3) devDone() ###################################################################### # HISTORY: # 2009-06-10 # o Benchmarking show a major improvement in the algorithm when going # from DNAcopy v1.19.0 to the recent DNAcopy v1.19.2. It was # roughly O(J*ln(J)) and now it is O(J). For a chromosome with # 500,000 loci, we observed a speed up in the weighted case going # from 20 mins to 30 seconds, which is a 40 times speedup. # o Created. ###################################################################### DNAcopy/inst/doc/0000755000175200017520000000000014516030315014611 5ustar00biocbuildbiocbuildDNAcopy/inst/doc/DNAcopy.R0000644000175200017520000000422614516030315016235 0ustar00biocbuildbiocbuild### R code from vignette source 'DNAcopy.Rnw' ################################################### ### code chunk number 1: DNAcopy.Rnw:74-75 ################################################### library(DNAcopy) ################################################### ### code chunk number 2: DNAcopy.Rnw:78-79 ################################################### data(coriell) ################################################### ### code chunk number 3: DNAcopy.Rnw:85-88 ################################################### CNA.object <- CNA(cbind(coriell$Coriell.05296), coriell$Chromosome,coriell$Position, data.type="logratio",sampleid="c05296") ################################################### ### code chunk number 4: DNAcopy.Rnw:96-97 ################################################### smoothed.CNA.object <- smooth.CNA(CNA.object) ################################################### ### code chunk number 5: DNAcopy.Rnw:105-106 ################################################### segment.smoothed.CNA.object <- segment(smoothed.CNA.object, verbose=1) ################################################### ### code chunk number 6: DNAcopy.Rnw:120-121 ################################################### plot(segment.smoothed.CNA.object, plot.type="w") ################################################### ### code chunk number 7: DNAcopy.Rnw:129-130 ################################################### plot(segment.smoothed.CNA.object, plot.type="s") ################################################### ### code chunk number 8: DNAcopy.Rnw:157-158 ################################################### plot(segment.smoothed.CNA.object, plot.type="p") ################################################### ### code chunk number 9: DNAcopy.Rnw:169-172 ################################################### sdundo.CNA.object <- segment(smoothed.CNA.object, undo.splits="sdundo", undo.SD=3,verbose=1) ################################################### ### code chunk number 10: DNAcopy.Rnw:177-178 ################################################### plot(sdundo.CNA.object,plot.type="s") DNAcopy/inst/doc/DNAcopy.Rnw0000644000175200017520000001560514516003605016607 0ustar00biocbuildbiocbuild%\VignetteIndexEntry{DNAcopy} %\VignetteDepends{} %\VignetteKeywords{DNA Copy Number Analysis} %\VignettePackage{DNAcopy} \documentclass[11pt]{article} \usepackage{amsmath} \usepackage[authoryear,round]{natbib} \usepackage{hyperref} \SweaveOpts{echo=FALSE} \setlength{\textheight}{8.5in} \setlength{\textwidth}{6in} \setlength{\topmargin}{-0.25in} \setlength{\oddsidemargin}{0.25in} \setlength{\evensidemargin}{0.25in} \begin{document} \setkeys{Gin}{width=0.99\textwidth} \title{\bf DNAcopy: A Package for Analyzing DNA Copy Data} \author{Venkatraman E. Seshan$^1$ and Adam B. Olshen$^2$} \maketitle \begin{center} $^1$Department of Epidemiology and Biostatistics\\ Memorial Sloan-Kettering Cancer Center\\ {\tt seshanv@mskcc.org}\\ \ \\ $^2$Department of Epidemiology and Biostatistics\\ University of California, San Francisco\\ {\tt olshena@biostat.ucsf.edu} \end{center} \tableofcontents %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \section{Overview} This document presents an overview of the {\tt DNAcopy} package. This package is for analyzing array DNA copy number data, which is usually (but not always) called array Comparative Genomic Hybridization (array CGH) data \citep{pinkel98, snijders01, wigler03}. It implements our methodology for finding change-points in these data \citep{olshen04}, which are points after which the (log) test over reference ratios have changed location. Our model is that the change-points correspond to positions where the underlying DNA copy number has changed. Therefore, change-points can be used to identify regions of gained and lost copy number. We also provide a function for making relevant plots of these data. \section{Data} We selected a subset of the data set presented in \cite{snijders01}. We are calling this data set {\tt coriell}. The data correspond to two array CGH studies of fibroblast cell strains. In particular, we chose the studies {\bf GM05296} and {\bf GM13330}. After selecting only the mapped data from chromosomes 1-22 and X, there are 2271 data points. There is accompanying spectral karyotype data (not included), which can serve as a gold standard. The data can be found at \\ \url{http://www.nature.com/ng/journal/v29/n3/suppinfo/ng754_S1.html} \section{An Example} Here we perform an analysis on the {\bf GM05296} array CGH study described above. <>= library(DNAcopy) @ <>= data(coriell) @ \noindent Before segmentation the data needs to be made into a CNA object. <>= CNA.object <- CNA(cbind(coriell$Coriell.05296), coriell$Chromosome,coriell$Position, data.type="logratio",sampleid="c05296") @ \noindent We generally recommend smoothing single point outliers before analysis. It is a good idea to check that the smoothing is proper for a particular data set. <>= smoothed.CNA.object <- smooth.CNA(CNA.object) @ \noindent After smoothing, if necessary, the segmentation is run. Here the default parameters are used. A brief discussion of parameters that can be adjusted is in the Tips section. <>= segment.smoothed.CNA.object <- segment(smoothed.CNA.object, verbose=1) @ %Plot whole studies \noindent There are a number of plots that can be made. The first is ordering the data by chromosome and map positons. The red lines correspond to mean values in segments. Note that the points are in alternate colors to indicate different chromosomes. \pagebreak \begin{center} <>= plot(segment.smoothed.CNA.object, plot.type="w") @ \end{center} \noindent Another possibility is to plot by chromosome within a study. \begin{center} <>= plot(segment.smoothed.CNA.object, plot.type="s") @ \end{center} %Plot each chromosome across studies (6 per page) %\begin{center} %<>= %plot(segment.smoothed.CNA.object, plot.type="c", % cbys.layout=c(2,1), % cbys.nchrom=6) %@ %\end{center} %Plot by plateaus \noindent If there are multiple studies, one could plot by chromosome across studies using the option {\tt plot.type='c'}. A final plot orders the segment by their chromosome means. One can take the plateaus in this plot to determine what the mean values should be for calling segments gains or losses. In this case, maybe $0.4$ for gains and $-0.6$ for losses. For most data, these plateaus are much closer to zero. The next generation of this software will have automatic methods for calling gains and losses. \begin{center} <>= plot(segment.smoothed.CNA.object, plot.type="p") @ \end{center} \noindent Change-points are often found due to local trends in the data. An undo method is needed to get rid of unnecessary change-points. Below all splits that are not at least three SDs apart are removed. The following plot shows that all splits not corresponding to the gold standard results have been removed. <>= sdundo.CNA.object <- segment(smoothed.CNA.object, undo.splits="sdundo", undo.SD=3,verbose=1) @ \begin{center} <>= plot(sdundo.CNA.object,plot.type="s") @ \end{center} \section{Tips} \noindent A function that may be of interest that has not been mentioned is {\tt subset.CNA}. It allows for subsetting of a CNA object by chromosome and sample so that segmentation does not have to be run on a whole data set. Similarly, {\tt subset.DNAcopy} allows subsetting of DNAcopy objects, which contain the output of segmentation. The original default segmentation algorithm, because it was based on permutation, took $O(N^2)$ computations, where $N$ is the number of markers on a chromosome. The new default algorithm is much faster. It includes a hybrid approach to compute the $p$-value for segmenting based partly on permutation and partly on a Gaussian approximation (available in all versions after 1.2.0) and a stopping rule (available in all versions after 1.5.0) to declare change when there is a strong evidence for its presence \citep{venkat07}. We no longer recommend using overlapping windows for larger data sets. It is still possible to run the full permutations analysis using the option {\tt p.method='perm'}. If the new algorithm is still too slow, one can reduce the number of permutations in the hybrid method using the parameter {\tt nperm} (default is 10,000). However, the lower {\tt alpha} (the significance level for the test to accept change-points) is, the more permutations that are needed. The stopping boundary needs to be computed for any choice of {\tt nperm} and {\tt alpha} which is not the default which is done automatically within the function {\tt segment} or can be done externally using the function {\tt getbdry} and passed on to {\tt segment}. %\newpage \bibliographystyle{apalike} \bibliography{DNAcopy} \end{document} DNAcopy/inst/doc/DNAcopy.pdf0000644000175200017520000063174014516030315016614 0ustar00biocbuildbiocbuild%PDF-1.5 % 36 0 obj << /Length 1365 /Filter /FlateDecode >> stream xڽVKs6WHΘ(u>! 5IhHJ뻋p8="}ﷻ[]*`Rdj\/g"W9bFz"M916DGmp(ZndJe0Gg α*$.8HRRF{3׭̣E [lQ-%B4 Ĝْ@H.tW׺]0 [3kťE9hYId PYW{0`z2$ Y\3d,!_`W1rpU HPBF0ȭagkZ׸)"dF=aWb%`+)Ti]ouC"'3'{ݭ|pw\^W_vx^7QLV&2Fd|o=Z6NK4ٸ׍N묾 )w =+7-Rڤxo?-_ kf=BfUЩJf){I )/sH6T'$&":`GɌ`_@:1PIY1+fkQ9'HIsXh"Y,nd2o,,f˭k3V # hska`Lxo:ׂGΣǧ HʕRX?Lƹ¶DK L,q v$;_tg,H4җR 13%G02L~ 7t Orͼ[ BDd2uBެMo`+(X` 9i\M<XE`RU>2c t2tN;զtT|w= K; ,:^7;psȫP)| \ ͎ |!S3ÍJ$0SuzXqpJ!أ~05(lk:ĮL)Ѷ#H`:8sF_Dwԃ55Ӯ'[UU"ti*'80T8"' v+zKrÛN endstream endobj 56 0 obj << /Length 1583 /Filter /FlateDecode >> stream xڕW6 ޿"(.-u+4àEW $n~Hqu))LJ_,,,/l5ɬl8٪"M$z%e&Kfi7I|2[<,RESjpUDSh*#)4 DmxH1]))(IL[ə`eݭ{=QiVь5h`p,⦪p5V[yhXE =px`?_mM?Ut1!|oC?"v?%YfKiecIYC~(HԃC[2z(h/ UC(lK 4=18wH8虷&h)U\V((9S׉8OY%*x7^Y8y"+X%NЃ㳬"{]!xAEjc͎(,3;2ӅD~+3@YEKiYUX i7z@x 6n mn/C=e8GX$z Ah- sqC:aVJouFnITٻBKw,Qv{VqL bcn t>?@*-9A;,lac`*?>\aPIMem.?r7*2';8%ҌI1vǏ+ ~p0<\i%Sߓ%aySB-L( rkS;ٲ\$OeDINz/z4`Շ#r™ [!ƪ> nwf%ߐl:f;1E#k#4ĝV2&8-zb8ng){/(Pz#;tXZGWS=^ފ^=ڛN} W\ { :V9U{4IˤΩ= 8O@硅3ѩ8&IVUIȻ0"nW eyJ WHT_C1Ufrx:5L=d tnMof O,iaǂSfi= F7B6=yz endstream endobj 63 0 obj << /Length 331 /Filter /FlateDecode >> stream xڭRN1W4ĖN˲ۃ&ĸ7Kv h2ML'U6g+@)F3( CyΝ&Wn=s~yS:GV\B){2@< % aKT7WƔ<gito'LsI~N`ݍhaGo ΙB{"J|(`۞L&dNB[Ϫc&:D>6mg~q$,n <8YWp?WL94U{oU=7ХYw:kvϙ7bDoYd,&{iy<ߟ endstream endobj 59 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (/tmp/Rtmp84bRYJ/Rbuild25da3221d0e11a/DNAcopy/vignettes/DNAcopy-006.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 65 0 R /BBox [0 0 432 432] /Resources << /ProcSet [ /PDF /Text ] /Font << /F2 66 0 R/F3 67 0 R>> /ExtGState << >>/ColorSpace << /sRGB 68 0 R >>>> /Length 14005 /Filter /FlateDecode >> stream xMw;RS! 8lSPH@K FM=H>~j٧+:nsovٮ\UN>~h|Qj#ǿ~_}?=|??糷g_gI}II~gҕ LWI` 5SL̹!,P,o ̟uC6Y $=Z(7+3m|)%.]ْ o{!pWV|wp?gۮϔ =`Wjؐ,> BB5lh?s-g7_gn†RR6 w6wv ڃw9zB=Z\f2,#]R-޶=!dC#'y`JjF ԟ#f=I% =gn;?K 2?.k3,+Е oF/?3_+$@Iiنj8AО; ڍ@ͷ†m|[P 5~6(*3f`{ [h2-p^KtvMa*1`Y`WFͷA hܠZ|^A"g00 F  +x5cqTb9ayIW5K6'xSW~{污 VÆ҈~+<ƿa l2 Ql#;=V`]`Y60s̶p 7QIbNDl1#n3ñݝMb]Ww֘?tb cVt6(٦a"&``r.xA+|^WLg†hT5wsLOEg5(k` 6ij6DF=ÆQϰ!-`CˆWV\ʰ z: ʆ*|oyjH U``iџ`CLx_;߭y֡eCqm\Ǣuȵ`k4`cyGnY{w/kA[om 6A?(~Yfa6+ԟŖUʵ!pI5> K^޶ ж5l(#+]en{hr"k&Ms)L#4Y~$>Ea)ZZඦ{lQ]-bn RI+2?6=Ą7(ew8hb*-(mIDԈh&d4dJދPe |͆g::||d-!Mh% /f=~6 #wvlJ ^|nȓ**%ʼK.ӶlXlm#3kl/O-tZf&f­zc27Y!Ga禽z[xJ3`PyeSs6\sļU3PQZ'",ݹ[Flu=J#ۮfL9v_ 45BmrDƵ+}4KM;  h9^RIdڞ2&B Hgq*pҙd"G2Mz+3hOz,q!UQwoY :Π3V`Ȑ{"炵= ލЂ*E/ǁ=(I+BߙlC4ϥe"ӾWާUYIP?7+&<[:( Tu\] *kkgp3C6WO-44lPF PC9f I τVk4#eGzi!۰=e;)!{ hZđbysʮE $e6Plm0$o&i|6"=g2"2a,V/J z4 ZB:z-t#I\]9p6i^*l.MlCG.eh+$[7,99`tX/w^ip(&BPq¾3vt;lt̷>G"odeU͑Ns$'h^F̶X`׺w&VzDRS\=|`~nh@p `)րrbVeڹ8' Ѻv^!t{hD d@_^R`6hh@I%TëWj Pkɟ؊YP!4Ihr /\]^5ѴٞfLPڄCLt^,iKaR|C}rЀ6zE\YfՇxݨڅN4 3Q}nyNծdT-cVg5Vk ҄QW/VsWW\ꬖVs@C/z5WcxB5WXרw7PysrMyzJ16iW,oHív?8ZONrрmTYsXhm`WUGjaW+=Y|-l\Y7**ʮwĸ̨kq@ VsYVk1C+&PkQ3/3F U*FClTū)n[?±$q|FuQT hsIhh@+Zc$:GUot1j+߲>To^GB$|2l8OʻչvEܵy(]5X;\}vıښz8BzbQwn2WHwz 'w(O|hG·Nښ86:EvytY/M]"ϼ9H2@(ZِeӘQKv/Oil'^e暍6+Rl["/sX*YL >XjQs73x4S~-CmeSѦ=0VnWF idR;w+C 6:H+ϵ` VF#7hq| q#G(,EA.JĨ۴]a H*$6ZAf%Xsr.{"%M"{Fly`fк^#7*/ve.z\=sI7WsUn\=յIoeGa߷[:ǧ7#G-) p uVA:Gݛ`42*=.CFCqdwaWh10+ڪ\ővz#ڳ]ӴpnE#;4A(jmc$;&~BB#s.zZ3Vݎ˾M7W~v5 |6:F q@Ѐ**;/cRyfpՋ9psi%cŪ͸*uӤYO2 Ep݅Z GNo4[#vt%mV:%]r%ay( +i}~Eqs3( `Tfʨu3x tZf'fw|8~6Z"V7:E 6FJI9hq%*v2苜}8mX,*LB.mc#bM*f,gCZ8\pFCܒQg9m49XI;-OI;a<:{"_)6gya/6}>W"jw74ѝUhh*>"?r灻gۄk =%}ȻUQ7W=9vEty׮o_*J9‡׍*Vz e^^#V0X0IXR™ ȇz7W}a V\]0uH/ꊗ皫 sqcx-'ukК2[YެkP;oٳ WOu}DӕN ˚8*8ji [{\V&s[ȯ^PS߈*WX~*/) EsʿHZyoӝWgmqˮ#znp+4WўK .YJV1nza G$5|:vkJUE5`Y(ߤpΫŘݤ={tӎt1ǗtI3S;kWߤp##c:q%ONyQ<̝UyPys-aN1*jӬ\~2ӬNPf/|g5vsEpD\~JU+[ۙnk3V5bUF}DrG>ޕ]ύ/#|g=w9/f=îx-SQ O(PZ@QJ\ ~+> w+U'L_`}I^ L.^ge^usu"'W}}9%wez FZJ~C5ѣ.ɹ,%H_+:I/\Kfh>>Veڍ"YUMˡ 9aL˲c's)^qyHzF=Qgċ6:MŚ',,zl깡ڲƍxOə\=sEejgs̚qz[2 mΦÙa 1p(oTki3 \ZVU:>@>(ƊEpuUNS%zPh>G =Qg0ʄvG4)g,eWkbšCУ- 'fx mOJJ0?)zc!TD*PB?Chs$Az`,RY@l 1jF BOpTheQK{lBg}Y(t'9Et`>&%۰Y*BnLq%x0G%U=ߟ;}-{J@Bm"BMBdrX^溔q8"棅VpWn=4 =3p=Oj@_P}9EJj{[YʮJ'V6V=PX8 D9 ج-!LD-} z¸(Hw2= 0"0H2ȯ%7k^HCP 8ETx W}09:8{ Z\]v;7 `ko_G!Ctu"~6 N`Tv$k5 ~|t^3})l)ZEΘ{ϵS['ClM*9d9 >n0b8h=OaE>DD{\ Rŧ=)&T [%~Έ^xP'*hX˜ _X֠|Vrq8bHMou5vxywO czXsmn+ bP?ds`Ps$6"=;xv1KTm9/6mGZ\yKsCG:oyp#pu@.t8փ:DJ5Wwe4[{"ݪ)KWXKag޸zK/4+~os׃՞Jz؟l#=Y}z@В/;~9Mh: SQyƅV_[\avZĚZ#͡zG-ˆ%|![:-iUn O\%⥕!}d.(CUؗtzO S-_{2hUVm93~o21§Y I@RћofcezrFMf\n 7Rsʮ H9Gb©W4~d ;Twe'4s pu':q3hǠ\5lMGA=ǣLܐh>FՖVny}x rqO^P0~⨷iaȁVUˍ°%M񸶹;^ eZSF=;ػ.~."g$؝LRfV⳥ڇ)Ϝ5|q9tɍ8 gUsYp>4&4Uq| 'F/k֌4>zO QoUE8 <E誯]±n)#N+iBϹ`Zy+* 4FUѓ sէО]j%ic~tŠ眷s:Sm>-**izb v[[k ԙy!kJ&dJsw#R=9;Ms<[>׶Wz^Bs ,sqn2W;e$3%44 d:_#} sk47m3-Bi+jISqex藏HD7,9cy!F+29rrR'8+?8B]V =.'@\(^V Uj?XWK⪿V%hD9 wpZv3-3 b(kvF3IeYvN-}{~OQ62xFˡ'/]8 VX/zXˮLK3Qq+GWmyHVW<)CA*'Bor zGiꨢ-s\QQ^f֭MZ2Wx kCu+Ḛn XJC9ŸgX;VAh6c?Bzs9ĩG<.PC8BX5l: xB[ƆB'.X[V`tn+y:>tQrϦIhvDBK{=ڜl `:ɭB#:HH>uުL?f)  O Ἤ _x9{BOB3º+t9r ۭ NBO 3({!oM6 u&99wPI(,aW"aEbg^\xuBQ:BXP- }#<)XShDqY&1Xg_| B5 4ڜ>><'Q:ia<\H2cVS%`DRr:^ srd"(*1`UZRG] hoB j #)(ݨ3lgkQ%B#慪*zcP|"q9 /tjL ^hQNJI-˕tq06BljpQNb|ØliX =zDG g-ي~ ]ԯ֏~Au9CBkCް8C x>FnhztH|+TLg#ĢOv3_S q1^rzQ %#4K1唤.X{B Pxaf4oyco>i _Ĥޘ!~;C̐3sr ,4ó֣v云-T;^Aύ弜\I(в5B'wwq"IwDx ^OQ{Ar~2L(4 O7z ,LcY>%#^!z+sB zϑޒ/zF6υt3fܗsinJ >ce=(ҋ.pM\p>Ǯr='e| >K;u<7ƪ]vi, XDx7*'M1c=֢@Vw3>J)A&9 GHwڃPv8A]'TْUZ L_8>0BeN3 >Wy;5|cUqQ2rG9rαCX41 +O*QK[V +% ֤ "~ZRLWz U{KO"T+u<7f朳NQ}B_r&%M1]%VfiҎ$Q- `މ" /X]ax~[UK"₆ ,@jG*wڿaMOu謁XՋzJTM |zO('VNG]H;-.Q7ëECYJv#hT،Ng]|`RR<~OvnΆ|ȩrbx)f\Rhrvi >'\-ʸ.[Uxc%V\ֲ`| z+SfLCieY1/^Pv^VywC}8([7Ԭϧ˵q?P|H8_ J]9]93bZOjT֪|]z<}j"'\1XN5ϬT3ڱkY?T3ȅ.W!FuN9QuBVjax2Q$hq 3@Uu-ުCU%} 7:t+.=ZNа+/Ѻmt`&RvUڮ2DxfUir;[ guϱs!a-4b;:ƓYjf[a\3O'/XU" 9$~BOUițDz]աs CvƖ̷Ri=ؑ7|uhBy)͇x$l9` aPu)1 G#Y0JxJWivl^݌m2ԋ kZ#Bs5ɿhfOy%fo6a31 m~. EofV\v޵Z]x&?zi[kb OՋ:$f^ytEFRcCKh0l0\h -sO'N5[%Tyc<7fV2O:А6>|j9ވfq9HQͺ' {-䁫E/ްsuDȷ9Ƹޏn S:?2,ⅳH**}Z%e^;zpü>_0;_%s0a{ >߬Jv{s.xGSxxDQ된Jvf8C(3uq̛牌g׿w2p׳&0Kϭ[ޙZ2x}=R/|N*TbӼ~M7.?)ןR?muSΟ~N5~pvΟ?`x;}?ߜ&^#}_>|݃uϞ?Ϳ_~wKu?^۞?8,puzg;pmY?\xN+K{FξNd'~?f_??c Ck,BP婆oO<>Dst3OiD30ˊloWFHXшg?sǟ?_ɽ򬨵qm~f٨:Oh[R؟?ϸl%;{}-^/O_rI:GR7RΉ7QE' tcuy>?Tퟴ2B-ޥRqҝ]C?Yt*Q$u'}En7Vcw,OĜWs'u$T'RT?O0.NoeQn9"NOz$JIb?t:Os\rgq=XwwYgɮc~Pۋb9lܿXn?>h'٧KvOE|Q9DiG#o䜻[!EE>''QE?w7)2 m'3jE ?Yw~wq endstream endobj 70 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 74 0 obj << /Length 752 /Filter /FlateDecode >> stream xڅUn0+^BMJ-.C5=0mDW_"CN]>h8fL#?U)2NqJXT_+!SXNDY`o4V_72Y|]7H HE.HUmIȴrHx"EC؛6ǦڿTL'ZƋ2yz n'5(9Z=){QwOH0D=NUH ZJ9`to+ދ"i̩8aYn dl}0t०FNګr?6xƽNZڲ-v2f-`,~Zi+Y59T,G_迦,SF9 > /ExtGState << >>/ColorSpace << /sRGB 82 0 R >>>> /Length 19358 /Filter /FlateDecode >> stream x}I,MV\V-Hl HMI@B?"|]swsxN|۷o-jス>ۈ)ןۿ?WoBxo{!lQ-=Z{LDn. rBn{+8 3WK{%5Lewr>LI𞙼g}Q `@Q"^gg:B_z{!rDalɤ^®;u=>!k>D8 c{Whqf6ة{v\B|lɕC?va=trPpr Kpؑ ng;iɆ1ey75Ma1e\HS4P|OX135Ot>(v!g!EH͊"C3 s6]l=sCʉɤ]gPŔiyTchbLk6vT4 < :VTz¢*-T.C {b(_o~ķ]u[2FS͊MF:+ny밴ubpk[o:|޼uEo]Y~Gg?r]/W/rl/Rmt\kX殚uhQ걃6K~ͽ~ͽòfptA=>`3Q/^gW.Tcц0Vۺ{_֛ÿ&?S8*bNh5֑ig{W~i;OLMuw/?~?ozǷ?3qٗ-CtߖVwyǡ쇽Է/Ä!6/#e׶s\ԡmgǁ ϊҸ<$`\Yah0CNw~9X r6,NEL%S2SA"JĵdAE1x3j˖h"K\Bk9%wRj3/`%znjb# ]-sxHzAyRCyv7rjT}yӝ}D1J!Hߡw&T[sLK jF|NKe0ŷ9P tH;H )SBp}BQQ\3_FZPi9Zt X&ً@*7W,E;}e8ISzfBS  )S(}2,RaR5Rj{k,ۃF{gXOdwrT&ݽ3{Rnn).6csգ5s!.!)ڡ8>y" nuTV&bn!pͭ%r!xMl雽ho:zܺx{{Goߺ`æp<.kuc-]uYoKn/mWlb|MwvPzZl{rYvm;u5+ooͩK&wq̻lFw9]벫0bwS,W5[/5vvrgy/h K-2di,+IEqh^ڱ0&7,,Ca'1 jLQT94U34kTq2)/uR44"5#\)9Z~Mg%9JC|>`so-ʐUҡL}y048GM3/";RT-!F"2_ҩQLX14#}5=▗4/ 8XRp/}!j,R؝*}|֐a/ J9y>[ (.:K}6'QRdAWsM3Z3sěO+c>AuذYWtqKHǥnlƮYFߌ;ݟ|^E$鴐<R=D26u]$$cWqI" WgL $< ФAFʰ?󕱘l'=-0>k:!q3@jQc|&n\3ENإcEpt\\\-=;Ugisp;ySsĨszNgiDIGrYj m&{_ Mt^`Ps64ӓMu"=hǤsrġ^!: vs~d {s*!t].޾P!f{K̫.jy{rx~_5#h8בM|m[ڵPG]7XC4)Fk]A](u9,OqZGjs`mR6$\{g=v ʯٮ#A~A٠s&QۇiC9>e_*V_z(Q! b@jWMp7nuJ9XjqS@UTM)/9 jPbL<"\֢/L1Hݜf5W!@ 6y!/Vc[emxR8q6=_ z 4H 2 LQ2֐JZŰq.@j_vjK]lZ(ˬ l@eX$6EٜD헮ƒﻤCCziHqpjY5# Wިkca%& @3gwxr֒>Kc6ec-piU';Q92[jl^R Y7W2{Y5Ǿڢf/qazN<ѲScIfт"5] t$9a!љET]?ߏka=v u&z/^sa ; ~5M5)SFߝAݬt3J0t`vkL0H.0Ks&-x3Z 2_)v٘e_ ,^|4ŋ,@Y@J"UQkќ2{=U׵P^GJ9u-L?HIدR HR -+8+iWCZU!'!;>thy@9j#D@U셯&Q6oa xuK<[xGoo]~{{o_?`篅|ŷ_v8N]|xx- ]ܽ]6w(w٢ w(HI+Q(_M .wQo{?FA:h~ua<(ȓq ԇd~Ϧi4P3Go[p<*µKss!n /RjlI|fvOӵiDi "4_iO6"w 9ǖtjzLW@?_YSn2Kt+LKWmuV^/]j542OÀtxeSTviÚgR\*] uo/ȞE56ITK̺&'K Wi3u(~P*+jV)TUlb 8-⮱3oc,6Q )'o4QkȞ*f=UHҦΘU3[L3DM';]{= xCf<T]xN2^ļq݁B4i4$]d'l˾]-TOh'ߨY bcHz׳d3kR+Kkl1‘,䙣Tb:*ٵmn-UsŢ4iW'۲$f-6uSRH%g㥒׽T~k^*zh%y^)襪ir/G^ Fʓ^'=4/z^*q혗*1l[4v9X"'k z!56_zež:MVZ0=ϗC\z9 H㲔kyyURQVZuPAtjzힷNsf;LO%C&c` á&ȩ.h6n=_tFx HΫ/[mJ ĸif?v9rR.޺<lDwGu6SM~k]q@^CS8KX-s$n{{]N]esxö'Xe.ﲹ3.6엿 >Gv?Z #@{IF.iC w?2qap@)ej>A \I{q`8]P!4&%^'B%Yx$$2ȕ+YVi2BBɇRO*%|} %xHAF vu٬IbPAwBֿ@AU,f$SSdPf@ Tё1MX|]6elYq,&,k T Bl@i.^iR'ς8 d(%d5/ 06@)O퍄%@ Vr[ܖEMO\%bb5X٤L%[IICA.&1xInGw5hxIvƅ:%*+wUT|@B3M.nXld6IIN!;ū y<zDU+Cq Ru}&=SĮ2…XM`_lF(-#6,p9BUi*ܑFU/ck1#lOʃFWXjO]'. dKRW.Z*yZo+MU) >)Sr4BHsJ@Y3Yk n@T3I' @WT_9eU#;Wfv8egq(KXƕ~;8# jIO$ f6U)[ *[{`䁺*܅k_ʊĦ>IT2ϩ 7yAەiW4S/ ZbV)Yy}mRA'm7?11M#?d6Q̢7 Sd#Z(9gUO}LcAGTJ3Miy~HOP2rf_=DalOJt)g'(raMM$Hy9`ͭuuSl]Be%_sR]|oԒOT┻i(KFy'6:taJA[;XsOutI.Ȭ/P^,)a4>WvWKGP;JP3@4ELy$3g K+`ިHgV22!2D`v>RwzP@.!֝$7ͥvTSEB;ہKГ"&-^]H#EF\.󝿁\NsÆx{#Oo]u)+!k]~,E,ƗQ]H/ѡC#]?[{wS(M.N.?ݻK{.ݥn]vݺ|ƫnޯv5w߻_FónÕZ7w/uO㳌ϸןQQ >t%~dnZik(/ ZT:'3 ݳgx<1ne(4xh(߸ǃ*$0s1*"HMg#WɱfZR,lUIc@9C!Qe s9s.ڡ3'pqMӉ]-8%]oR`p>۔cb G%OiZS|ʾ^""0+kRϑcwl1`}-0/* sY@jIŒ:w>on~`\I}K4Үv87{m=sUtd^6E]K% nL:/Lr&zyl4P1W6]eÖf'ΒN󣑱*ɣkx}tX-St7+KNxY)w5 aXu [ # b~lo/S\_ :Zܹ6=_'6$ eq,WW) ͧDĬ\YCagihSa1!͇y9# wv,7(&-Δ%*<Y3ߙb`B <%\XAm3xo!m)#r"dN|Vj==sWt1zhZBhRFhIJ[㠺?-c>+ڏTg(Eq&2t,AoW2jyX'\Rdyz"V(\C ^ȃKS=ss|4v1’=N̠4Jv }Q9zq!m|5knB2F,薒]ĀChj1Hef3hzlT 6΍A3!A υ}^㐚hʾ-1Hbs+C: hhrLRfwMQZe-vJa/ s>N(΍YXFШ[6$>OZ;?)qi ٳ|؜l`7x [*(1;R ƬW(Pɺ@)Bo!T27J'$_[¤TMF f]6)0vkIӊh\H(bR©ЋƠs NH߫V5Ff$EJs׹@!Yw ]U/s#F>s5CFt:7%TgGZK::ZFCCd:7"*Jq&xܠyZB䩈RSeKeN4!$ܘX'VM0؝p媂's3)P4foʈ>$Rt$dئ;Wk(E4Ot#ُ`H3jԅ9<Y5t}IDڕ/ԗYBJݯ$Hɰun @.fĉ# ՋbiESA]9`%KU{&(.޻ CuEcl.޺ܿ=)B䞄wO~L`Q[V ڻEIwߦwqߦw|ŝFesooӺǻuo8_m6jۼw|ևoڇ/Gѷi7ԷYD~ی 87t~ >{GW m*[}ⷶuSXN@kV95@/rɵI_]!*dGr!:T=c27d[!A/# ȎꅡTxQmk{BM0 '& z4 ҮQׂ;^jېZELHd6R a0y ^ҬoğioW{!W,8C{̕@eaktlLg~cp}jK2f lg#mɵ!pT)ZUfΒ[H|&9O 17 k!7ʞo('J.Ƃv 碔 wnR.bFRApo%05<]OF+!m:ũ Utf=5@4U)Rs=5zcx_S(kM+h0P rYzUqQHyBo~Tc#Ĭ{ȞxqB*FSch !j t`nI-vy2ԠWʩX"(;؉3Ԩ\}CjUԌ7ʹЂa@ZU# T 9̀&zjg>K-G3P`R*fTsz8N JRɓ[(KIH -Tfyx#`HOI)m;[f!nD6VX A 䤃ԫa {f5(LvQH хHQdW["#[({ScfV$ϠE-~E~LN+Q4[R}}t5 >ۑb:xcUɯScHUvj4д&Ba;/BZu4 鰊 6VǩA2!mVξ"N8I;5KGv>;R~ㅐ|KzjbH%&DK}K` )7D[ʎ=NVEa!sp{A`:r:JaϬɀt\W$H`lFa-٩Az6sߵS)^iZD(ӋyP6&sbsߨĹ57yi!.ާ&poq6c}9BQkRnUu +d"0*a`6 Cރbuq"LgaK8*e @@p10ՇDbz,Yb=DiIZ @U{b[Nk-HМ4R5K緌;~hH RI5μ=;Rƀct[PQ Yʾ^4&5V-dRܞ#Umil1 tfJ:cG/+% |YW99^-TbtMn֗E 6 ˮm&A}E 0_ҩ6(w`+T7Ջ1ԲRWH^ِ<^,〒}BjH$F4*]G#rjG mHƝhTltlנ:%uԲ[f:wd>ٝ =3XwT +k=صV?)撚FA@v(q[i56M 5X5PB0y\`o*J޲j4[qF ҮAjZTM5F~sZ3ґ_^k˙'zF_^9{^X{s*@ٳw鷹&wF!-x{rx>GÕۥk]ێkCɜ.':- 7a77߸[7_î{SkYgh<7Z ܿѦ0ܿo@~ҿmq7п#˅0PvPW`/qV4}r:^00g8QΪEܖC\qVIҿs=9]%?J L*x $%}x'|;K)Zgyn_2bQXlpJdP|< iNdNɋ•,#F1 x b jj2Ɩ6.@2CORSp[/_ 3(C P=@V!ֆdi o/ku1IMn+&xOTdm9XNF9N¾ʬ:i:8mR#gJT 8 ؁J'Z)mS"2 sXh)_CE"sk 0bѶdP;xany[$[o: -޼u=n] C? ܮ|NnJ!UkXnꂢ:ZnͽCQwȲ;TaD?:hsOutIۨV/2 L|q75ѵ(O7gef2cyǸkV/V -LIݸԊVH1/}3]Ѳrڏ/F+:? Q/.Y F*:F}+3ukCm*XS)hbTB2+*'ͪSJ֤;,5*X:K*htr:W1;((QyQ+*kZ+U87jԫK[giRs*F`,-UNYuQ956QH΃, TtD2J)|WRPEe%J-6G/`K5Ah:Sx82]FyasJ2J P "/)YH?^Nv27N^,(gl0x|r7u 1g616Dxŀ)gN&ךsv-JeZa^z{N]n7A۠e3Bˡ[]۷.nz[Ϙ-jh7Ya`۠&i,O36铆xycUj1aߒgfZMBs0s6"pxTB)bQ<0Y%u:Q$Iզn4*UuT uJL:coJ->)[Q[5~jEo2vg,T(7W.Ojb%W cզ|َԃ<@vdÒ*g70,Q:u±IG{K­.k=K"[oo]^r{ -~a~o>o 'Uxͦò6C#M +ZX.l]ТuqλŻǻu\x1-`?0aYbxFܦepz*U5[CSXo N~dpz=P3.,hR!kVsLJ\'xㆂ>.O~J=Y':Y6e)mK"[t xKYHMiEW)Y؁DOTaעI4 >D6XM<{3{K+}\:MPԢtԊ)Z)"xit3*hUuό exrBS!!i:)c5jь>0y-0 ,.ULYMtr&_sE"k%uKj,Ep 1=L,D3EGUb$霼}ƍ6] ?cMvBIjBQ,qb;gE]/VO Haؗ}3͡6gA9"MpCTnR Y_/+.l7 n2aߺx{rͦ;[>lu.w/tl:tؒ_2T`f$(Ynyfyו˦+{f?ޭgl:xզ_jjqaYx錸tF\s}Ik<18{T+$U#$'Mg|q%Idԗ[xS(?jA*WRaFF~bH5 BzU? + \R@ٵSHB,F5( 4ՠ1ZQDtZ0FC8!d}#?: 2Q3FUrFi#wMKCŗN}#z"?|XAxԥMy 5k(qx{Vˋz0U 3\W'XojL޽ȋ#bV qJP.c!hB,M$t]G _}sGf~r}#Tc$QAV +tZ8T0d~y(Н۬r)ēKFQLic=jpV5f*w;Q {Ưm3 ?w״ЌH3 ~tgty(JĚ /5e}Cpe Ѩ{]!c$mϩi=1cJ_0MUiYG,\uQTbQ /7E8C)m֝aPlhUp-,^3LR5Ӱt/h< m mYgOZ_C=橏Ca 'ڏ8/ '<HE Z ʟ 4[2`A;_<ՔPCw39QǘΙ{֬!4/bGF_3#װ1@@hjPU+U- 8]CL-룜,9\##zڌeRsR5 Q]؝m@Qwj3dIGX/$Mzg))ؠpB\t^_\2|bL1 d=5;4|Fqy) p6-صF8J5ӄ͍:Ι#Hޙ,h9TT2ZZ̐ l KZf82YoӀ: t.G{њ]uC޺X[*,з.Ai7}Ok򂺏>6 vm~Zd]{c0.'T⦂wLr`L]T.px.1 ;US.T𫩩pF`48FT0_j*pMYgL'WCS+E؀+\_ŭǢH6HL+țFS:ީW'WATZ˹73?ɤ}hX pubD:EPNKΚIR]91P#vӄw K&bu9=! P脯*}N'Ә  |PFf@&ĹRY. hb 8t ` X Tk:^ B(~k0,*B G(|@b$䫐\~2~!\HW0M bXd &DCa)xO4zgITNSrNےluwЇpGry|>"0r !@"$r׼4)Rxȉ5hZs<"N*`k-IVX춂)i 8@q15 1d0 8C-yzdeG%&\vrG\>68Nd+@6 d b8q6:7qe9D@[# QW,Q]xX哑G)ta,^|B L%;-bB{lS]gPl@tT8_!~2a(xO`ȁΰF2 g%ӵUe$.NV/줼5Ҵ\] ew QN{g-I Ӏ1Λ -wConv0oV7o탰š[$Gkn=䷙ڀitOPk&O`4"u7zd/n;rf?P{~(G qxcy`͛~r uxsD>:XsЗGkn3:v ak~_@%Z=kB*٬%m'G}I+U5밇Vqj=\U{x /EXWB,'1@?\Usܶ##Nۯ(JUiU4aqޞR !nִML n|p{9G:8d`rq 5=ޕMV"l J ,h Ш^52A8NhbVCp4őpӤr@AOδb&4>UBeGCx-Bau({~ێV`օ R? ZS3$Dspy졐3h|h|d|xXGO=hWv>:=6G0o~h7??OwěNܴ8AnY#ͫǟAL,eLJl (X18 h": >_3VhBjt139E2flR*"CARj&P6 "ٸD_`*xH= PڲY 5FBH"P@Pf`J{N 3ΊȆ@%pxhY*kx!>Ad^FWt&RۤQA`Ȝ@`eH d`~`h~D.I5$Hujf QSB8#'@@Z/!0HB.7f0)Ψ>+H4nĦER@ ; J}F4Kf,> 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 88 0 obj << /Length 617 /Filter /FlateDecode >> stream xڍTMo ﯰrjL ,j*壑C*{k{ ]akDf#Ufx312+jXrd[FХhnZ^жk) |Dq{ U:X/NDk-+֛ .kxSu\nM++"n%,mqFTs88\GX:5f|6Vgfϗ 9ϱ 4G†z1 Rǒ/քd4"nZg  3ra@G5x!Ыhr,B=!(&\C!Y4m~fr؍Ѻ$>7nS~[v$ǐ#أUGsl|/yzĕغQe *~Lߟa62iR̿yQ3\Kq8P *ra-zN/|rٖqlQO΁Mӏ_SL$ѣkgGX 7no7g *3tn[?%]-y{?3^x i%.D ;*ύ ! Bd"j3lqX#9* vI_8W+n D-czX^ endstream endobj 71 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (/tmp/Rtmp84bRYJ/Rbuild25da3221d0e11a/DNAcopy/vignettes/DNAcopy-008.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 90 0 R /BBox [0 0 432 432] /Resources << /ProcSet [ /PDF /Text ] /Font << /F2 91 0 R/F3 92 0 R>> /ExtGState << >>/ColorSpace << /sRGB 93 0 R >>>> /Length 13878 /Filter /FlateDecode >> stream xˎn;r)j( TZS `6 Z 㛑AVoVAt׍Ldۏo>ϧ~YGs䏼g/w?7x>~糷Tg.3u?ǿ G<}etZ?^YL`i6i_9?'>s+kݿWYS7}e5Xm\|.hݑ>s%p^BV;ue|;g4OK;ԕsPIon[?mMU6"h*y ~ 6PN{?dCym Iؖж-cmaCywz`Jx#H65-4?xmY#~hT4(PYţyDNY%l#&=>|Y8=9LvK0?ӰQC#xض!2YvmMa~ snͷlC{e}|J,mlC<-"ÆR|ѯȆLwn0J V d&}o jA~{r/1< liRbz){Y~nN~j+QoP߾-,3̿ie+ lP3M`doPCzx53_hW@+1o;;W| YB=x6V+ ۶lsE۶NaۨWbú2x[ m~lW*? jm }flO vچд %gvtۆ %r JnP6~ lC_Ȯ66qscoĸAyIOoڷ)u!^|+q~rAO Nk0fpWom6(=0}ۨaߠd {3s ^U;27 j?$؏؆cܠdwP ʆ.R63m ړqK(aC`d\W Xciܠlh3: liB _H6 lքX ^wPi₍pq2DބXZ[TomEnmEmۣi~ iRQU4A# *#hwZH` 4Vmo AU &-(. r~ QͰ7aaC%Ea X uE5׺JQfCQLcUD$4(q&CaC eS k}mYDC&2R  -W#Who2(Tֶ6D=Q*s}~2(0*LU5ZBY% RrbՠHhZخlE%*gnb*c:VBB}+@h %MsNZh\b ڛE fdpݲ,B%SKprŹ햄=պB۫"tqW 8=:^aհ]erWPhM(JGsq~ۘaW 028B]aJb[.=x:dCzΦo-i>P,`F)uypݞe7F*P5_pDŽV˝U }? erHBQ6n{d3BӶA>vV읐"ש/ʖi*x*\Q2׷k< GbBeWj zô]N%}:=]X^,meD.{"OUۊX[NtE}$CtAszjaApڰnvvNlv/v6 ,{BcaYgqfe;V^qUH*Z%ரjņxFU8:У[ڃ@jO)HBAqd;@eWw^nn_YԃkU5OJ}QwpY@m<Ս_ic[&#WӘʬ>eg3ϓf5RoZhv lV.IFabv:2Xq zrtd;B|:N HU {&MT~]V_[mi,lTvU0lUB^njj&=oTvUpQh8"]T/V/ڋiVh^1ۑLkT+g_V)|Nhsɓ)_学bЮ kPŬ83q\pz/Elzn =[Bϭaui{Bll͢- 蹖4Oҝ5G<8_m4jgkqiV{XG:CSC}F =vEU1+_bVOjzge63+ObVx+OkPE(–3ICo8!>B#h=dQ%WPjBE#ő "ly ڭ># !p4\骣[B]dp7:NUu ՎB5a##4XYZ43*>N=|q;'^O5ߴ(ZY9j1DhsJv@X0M贒@) =ZnvZn=E%.A-8#mtoDtZK&[)4*U,)5az񵲫#Rh[Cj+&FyFî&v=zR06m`z .U5+/Ck2+0E>X9 fOwV{0uEhq ǹ~Yu^ԋ2V\dV6N:>5ڧ2SPu*Bp;Z\x9,K\wٮ&T^FO*aYs{;dNw֜+2fV'lfFY9gV?˅^hf墔f}fV yy`sw^VhߪC\rى`mGm';'CFlnFXEHf-uT/[c=ξ=yM#Jvg_lY)w}PºFU&'YyzekJk7grŜڠŶA~]_9WVf圯ӝ&j=iWhW]\CIՀ.}xD6zb{c{*pU="rKsgypu+ ngZI^U6z {^tK :djuTv?r̂H =1 ݃^u~X9| =nV`2\f{gG2&0ڭn>l6}9+覧}J푄Mu 4b{7vB@ 7rAV޽m޽ x'y!靋c0E_h: $ŕ~H^3Gg ґ/Dy*@r.#4;faVXWc :*r΄B`zXROh>dV͕t Ix ;WUcddLuO_gn]{2ȃh{O*>"~8i0[xr4\ܒf™pخ&򅍞 AZه>ZJme+q)1smVWa qX9GL6%=cָbr,&jB|\5W& 'MUj=So8< [s#c(dUn%RD 5n i'%{\^%SUѵnQ;[ȩ]bՔFC{m*7̙Ӭ%&pV{Ӭ\ |mu ,7vZYhӬ#koz}Oc :䷊r<[]3PIPE6/)*"VPPRKc :2;ۃeʮpZN&&sL.Za }yXBmA+4+QY.`Mf_ !/ZV{:P VӖ^u餖g:2+pj9V_^*ƬύF؃W5&71c\:"&7o6h[x;o}'c.K #T6IQˬk yA#eVaPuYf/|gVZf幢OX9˛/~Ej˓\b|U=/ڭ~Q6ZN"jzc{6-Ls2i~8c9W3ePmaW/oe]U,&T&s]QlTvU3[%C^*>*R7*Oneˬ%rV愊w܌Y+=r=L: fJ9rOU|--';buk'*u.${^p$éC_йM $3?1c4&(w춢/R:E sjBq*L-X9B2+G=kDy%Kf5Һ+_8_؀ $iÍEd6񝛯?ܐ!ǖrChqݞِ|V$Xi)qA؃x3Ƃbplׅ+ki8܅g3+,!v2c GF~ pn%͸m'=׬4(u]x<R# \ׯ*qu۳D Qe׃|ɕ1u/g1D-tL8U{@EeX<g1)DS T|2ZF X<$O7( 7AU |MlX9)Y GGX\k(͢r[Sf9\I,\ޒ9~.}]%a;7\73. ȣ'sR|M<~K9߹خ0=;j rzTD7irVnjeT!rhϖ~CĹn8 Ϯ)j1c)aFZi:U쐁qBߙTsl ?$ю2oU%._ĵhdȏcprW!9ZfV&2|Xyr<8+4/W$qAdŬ^L$y<ѿ/ou4~6$Xx`$"gU{;5`ڛۙbᙴv-4a=R#,9|oTs=Y` AF-dI)I5TQ-NwxHv6%D9Fm*ẔOrA\Vp=*`TL"sCoo1W g HL>#\6E?.83rįP{+kB/\aCh=X9(#ݡۃ7?c^ye51Q-)toZʸu{hO8:YAlW8kWGB_=F7)db[{vǝC) 49>ʬYW MVUօUwõw: =|Q|_ެ$PWQ >j1S N ӗ[47:HF7fXFQl>,cei7yśs5E#_6WmzaB#f OA}Tn&Y&/Vkɻf٬֛Eh3Yͫg~g++z 4RDsl2V4̛z \=-zPcku{H%>e'/zЇq݊ yE:?SKE{qt2ڛa_T4Bi&Ng6nQ=J̠;pۃGwAs Sp~.*3HQhdr=joVڍ#XD fu7z3| 4{BOۻzC#e{&t±.@7gq4c[Vu?ڃ'  YyZMAAR{ )8|V+rj+:o]QEߵHV"&)vOO@pu^V{8;IeW UTvU8uXܳꆋpzsg-!s#=r͓VbS <4G#*ʹ'2+hvd蝽`=s]~ٗᐮQ Tt!ԃ"E稷J3;6ai"\Fjq ̼lyPE_a+N=*"Wbjo5v7`w: aV8;ixȬϚzb{pL.Zak^rjTW;7[d o(4*b{^;o&ËK_ Kȕ3yUDʘ؂B;Vî*~j]ºտiT\z+Th>vÝ͸up tyV{ӬvZD8r!fuU{E3Nȁ)xڈs;Wӄ =տ|O`'b,:c*Q4N.S8,7f {DׂxǷ>kj}Z$/w֫"bKV=;=6nj%TaX#Ehqyȳ  f=\}v3nrh9jӬyX:T&ݱLؒݱ=}7"z 5$4AشS_XnOtr~Ph`յ<]67փ/s=%' V{gUጌ]jo.J ZտIhӬ+ ] ?gZ2+\aOYf|PNlL ++R{xtU9du˛ kCңSofb+Ճ^ܒ&+5V*"ˉGAQw/WUn Q :e.?y%S!L.|z3HXf^f%mJ3ԞeV^0GxuXya 7t9s@[s͎G"ֶ= 7\m".o9Σ_fl߾ƭۃo5® VzG=QT7Lm.WdZRKk<Ɲc+=*"slYʜ5Gھ;XEٱ=pDw7r뜔#p7ӱypΌSO )p'$4X('8cƜkitrO`U23J 2G 4ԞE U9E2zP7ޡ/jWmjm9:.4eWOɥ]hPr6eQp-zPzP8]D*W3}^{Y)ЬB*cuJž B,xy9)ke -e؄9s+srYY9,4b0:Ugr,f9X+ow' f 98}Ljf+'(׹n7U FHkI)Tj|-ŇbV Aǀ[i,Vim+ }-q5B[v9#~pK1ṊΆ3GXS`;WtŬt`VӵfAVE96~`K\~QK(V*e޺=ً1B> wv?C"+Ņ78v'ʳr& vU_7U\U{]ntN@\@qw]f ϋ)츚Kk#zb{;tO`'oz!ha [}e@E2 (16ؿ>-ONPeQjX,Uf~U{{zAZ%BK+ٮh. U>:6+Ugckvbԃ\h@]Q{R6_C CkJ5+0Tg D!jk3}h]f婱]3Cu{hO:>v]ǭL{u3Ю|C,0qBO~.vjo^a儘X X+dr~;yA.F"T*y2{usYyHfV"*շuhf 댕~X9GJՅjxv5_K^PQ?#B5}374 {T) qXXu&wjon|PLB XQh{݁nڔ;F=*bwzmRD1cvr,&$47T!Y= +?Ј˺YynW3N+urId9f==ؿ>6c%)2mtf[T~3hNko4hnBz:ØYgMUGlCUWE$okW)5Q,?bVyJϝaW ]#M3.422> auQ `nVް rs_i O*Z}-Yx3:\<*[ڛcNU99ݺ=K5D<|ph2~u#߳NgU{{>-vg:jo~g^X+ 2S rp^Qf3_n)+@eWO*F,*xа~¢2M_d=R&kV96Xy3dH# VvwT@3?Ӭ|e?7Cg~~?}<#}߿HQq|5ԥ?? _=N5ϟ~pN?8a|띾^oN~7#E6族?{7?&/M&=rNϟt@."OO 8ciz/#:'A??ИΟ?ϯs Skؙ9PS~ HoXh:OWޞ1|>gOL P׼2.1+uzYQ]oۧ", o_~{}~(G=Tǿ|<ˎ6?WldβӀ?{¹{D2F*\^OzzvOݳBǴ?ץ85ry3~p~ؤs )Ucx|>?YǤS'ǧX?)&3Oٙ$K;UNyCsNuQZe.wTD5tOsrO%v<Y4_9'4u`{IM7 OZr#Is12ROw[uHpyvpӊ/Zod{LkYZ[L bVy\ޒzy\''&7[~-C.h?9'nTɜN 9z޿ڦN6O`O\LCqvR\56DYm'ӥ2Zvqw~Qj endstream endobj 95 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 100 0 obj << /Length 1627 /Filter /FlateDecode >> stream xڕWI6ϯ-20fHr!m6=$(j$h$d}Bɲ) [H~*"lhD$M7w k`5#~|,+^*PFhGd2*C^))CՏ??~`mov(SյNn™ `HÒݑǪEq}r#otŢܩ// mZi 'XNoЉi}pu$|yL* WMUkiIq-Mxкݬ ,Op4tM7vM{-蚾c{lD)g9v@*#/xP9 L?.pny|jOR6uVHTMU~٥:VDɍ~xw˖R-T'P#ɀ)¾D8c=W.F+ /[jyc:<gphk}8 &3+N=mոRaQݹ]W?CE"{f7<̫lxۍ\*A)1ޥE->2etTđ}IZa81aDd$Ld[[F$vE-ANjTy^w-I"[Y+ i'I M0pB^= w:@$f ay|f+ k7-8&!D @(,^2iB9ۼ>~ ɆÉ2P~) g:U"1vfI|At^:H~3(Q/qڰwT6 0f9fr9^ H͛h̗Y18˺@~}7yE &IImҹ5 v)C 5Wyd5ZϔG+Nfs&`>e)ߤd4 endstream endobj 85 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (/tmp/Rtmp84bRYJ/Rbuild25da3221d0e11a/DNAcopy/vignettes/DNAcopy-010.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 102 0 R /BBox [0 0 792 648] /Resources << /ProcSet [ /PDF /Text ] /Font << /F2 103 0 R/F3 104 0 R>> /ExtGState << >>/ColorSpace << /sRGB 105 0 R >>>> /Length 19307 /Filter /FlateDecode >> stream x}I,MV\V-Hl HMI@B?"|]swsxN|۷o-jス>ۈ)ןۿ?WoBxo{!lQ-=Z{LDn. rBn{+8 3WK{%5Lewr>LI𞙼g}Q `@Q"^gg:B_z{!rDalɤ^®;u=>!k>D8 c{Whqf6ة{v\B|lɕC?va=trPpr Kpؑ ng;iɆ1ey75Ma1e\HS4P|OX135Ot>(v!g!EH͊"C3 s6]l=sCʉɤ]gPŔiyTchbLk6vT4 < :VTz¢*-T.C {b(_o~ķ]u[2FS͊MF:+ny밴ubpk[o:|޼uEo]Y~Gg?r]/W/rl/Rmt\kX殚uhQ걃6K~ͽ~ͽòfptA=>`3Q/^gW.Tcц0Vۺ{_֛ÿ&?S8*bNh5֑ig{W~i;OLMuw/?~?ozǷ?3qٗ-CtߖVwyǡ쇽Է/Ä!6/#e׶s\ԡmgǁ ϊҸ<$`\Yah0CNw~9X r6,NEL%S2SA"JĵdAE1x3j˖h"K\Bk9%wRj3/`%znjb# ]-sxHzAyRCyv7rjT}yӝ}D1J!Hߡw&T[sLK jF|NKe0ŷ9P tH;H )SBp}BQQ\3_FZPi9Zt X&ً@*7W,E;}e8ISzfBS  )S(}2,RaR5Rj{k,ۃF{gXOdwrT&ݽ3{Rnn).6csգ5s!.!)ڡ8>y" nuTV&bn!pͭ%r!xMl雽ho:zܺx{{Goߺ`æp<.kuc-]uYoKn/mWlb|MwvPzZl{rYvm;u5+ooͩK&wq̻lFw9]벫0bwS,W5[/5vvrgy/h K-2di,+IEqh^ڱ0&7,,Ca'1 jLQT94U34kTq2)/uR44"5#\)9Z~Mg%9JC|>`so-ʐUҡL}y048GM3/";RT-!F"2_ҩQLX14#}5=▗4/ 8XRp/}!j,R؝*}|֐a/ J9y>[ (.:K}6'QRdAWsM3Z3sěO+c>AuذYWtqKHǥnlƮYFߌ;ݟ|^E$鴐<R=D26u]$$cWqI" WgL $< ФAFʰ?󕱘l'=-0>k:!q3@jQc|&n\3ENإcEpt\\\-=;Ugisp;ySsĨszNgiDIGrYj m&{_ Mt^`Ps64ӓMu"=hǤsrġ^!: vs~d {s*!t].޾P!f{K̫.jy{rx~_5#h8בM|m[ڵPG]7XC4)Fk]A](u9,OqZGjs`mR6$\{g=v ʯٮ#A~A٠s&QۇiC9>e_*V_z(Q! b@jWMp7nuJ9XjqS@UTM)/9 jPbL<"\֢/L1Hݜf5W!@ 6y!/Vc[emxR8q6=_ z 4H 2 LQ2֐JZŰq.@j_vjK]lZ(ˬ l@eX$6EٜD헮ƒﻤCCziHqpjY5# Wިkca%& @3gwxr֒>Kc6ec-piU';Q92[jl^R Y7W2{Y5Ǿڢf/qazN<ѲScIfт"5] t$9a!љET]?ߏka=v u&z/^sa ; ~5M5)SFߝAݬt3J0t`vkL0H.0Ks&-x3Z 2_)v٘e_ ,^|4ŋ,@Y@J"UQkќ2{=U׵P^GJ9u-L?HIدR HR -+8+iWCZU!'!;>thy@9j#D@U셯&Q6oa xuK<[xGoo]~{{o_?`篅|ŷ_v8N]|xx- ]ܽ]6w(w٢ w(HI+Q(_M .wQo{?FA:h~ua<(ȓq ԇ\< - R(Hm$ nr.6p(W$+fHX]}@_!'ВNM,">2%D@:ӕ'H+ MfiAO뮰M4 0'&^4>'x"7DÙT}uHݏFe:Y? Mm<O:K!TGwUK|,M# Չdl EA 8(*WTilcMT7މtT n;Mw[) %RU̳PgӺNW^ FlHaՐ3ꜾT54VՖY ҡ;0ZHK&шtM߁mY&5Kۯ߹Pl#iS!W048Cw̼]-Xye -U8^<┅H XU=Y&40)Ow{J:cǬ3w_:yAj3}ߥ2ܞ [3y1tO?+к |4<4Xs}El]Y!TyN öepKsnjG!0X_q2 Ri(TӤjC^/3te젗T.@:.{ьwW5,5/Azk]X ]=0IG'L4۵TH:2h2VHU/ۯ0i򍜤#Σ<ҩ 1u8 f\ o`{NGKi{J 'tEg`~[j@RWKgT ަT kmcaG-:˃FtWb[oo]o{o3۔*WLq(pVh5dTh2wI7]]6w9lyD.. n]>hK~k.~~m7 ]!>r]Лt`}#wKnx_&˓}EYƽ`Bʇ"<|ɓM31]z gfc YYi =JVTp:iYTӲ Iht' .n*"Ɩ%J2~U uRXT1e˃: |l2M(:+ u: r$㓱 >-N43 L#nr[( 3yRkKѩ!d)QxWa9@R"3\)`Xe&#Dn+dz*,/dR´wɪ iY"aXV@bI6/fX twY+Sok QUnkO25SO ԫ @ӄׅ&SƖ%HybRI+@ "pf p%~&t2,x B[BH&X" RH[d a.%OImYT@dHU"%/&Xq\M꣱Ȥ^ªu#Ibovt4!7]p%ui#s+;5N~V{|2Q@IDޝ lRTmR],R)%T!B@mY#sp_&.Z!n'h\]2.P5yIg+Dn+aXD̆OfsO_#^ʐwȓGT2?$ )Qgb!ڃ *clWV_ӐN]gYdBIv< zSĬ7O_D ,ޜ*HL 8Xf^`kUoz>A*1%}dR)Y̐6=] >i CU d˝K}}R4)EqJ,sjvʽ55ے 弃5C׍wWoOu:$}|?JvŹ]RKK?QSW',Iby㭃p;꠴A{)GmnJj`ͽ>a{'YH )R{@݋H\uH_1.YN y4$AMHU1II GA/H~?#4 ##-l]$Onxɒs1Hhz)RS!2WU"={UW׀2F߷YcQߗx!m€Z0=tqOAZմ>UeMVZ.jg28́9gT"Ãu3iׅ@Bi%NTEqBZ/# AhU:F7iYJ B)Khϣ{p'- h@}M1Prb0RJƤ0d_pFW'fCZӕSRugTIAS!ʷ=RӬJgQ%KJz57+H\crSEC}Q=9TPfb;H4w{Բ !4A< m|P(HJd6Ei 5TؾiU19Vw~Ff/j(d'&xdW8]; &:]OvJ>C#E@kg I _2:ܠv3Hdg183S _LTb봘rӤmW';~_ ZE‘e6}_oTt ! e,3}j&.꼡@:}I Ȑx3씄yzz! + ]fef9jP0Yw~6S;&qN72X e~C/;RՓ ҮuQS7Yݹy^V" 8{ k@jqN_ZiHnY~7'n-nI-GN3-,/[9';{"AZ-hHI Յ^("K>HZdܹBZwB^(7vSM Cl.AOvxIvQo#$@wq95~?|(6sWuĥ\J_էL`3.hf MMńR(>sع_k$8/8;St|0WX1Fvqd|gR#0Зpc⽅@?}A:OJYIZ]}CR󰳽 )3}MxʍS} )bأү% \"~cYw/{`$s/?;թ7G([Ʀ.Bo+o]$.޻fsjy{r7zh>b] {߮=r<}ň@{˞ j]usAse]Ask K')wn\Yj2_$?\ϒ?k$ezjzk?Կ$ř ?G A^Ha9OXpI-Ah93[ zp %x9 -Om%>ωK`ԟK5hK81(-􍊎F$$լu %[Jv鞣I  ddF<<~JR̳QY67|:7τ<ZyeCj js{*o  4Z'~1)JKmGlݹ7fDAj+acn0Оz b@:^3:7faBnِa%]N.qAq.s#.shIe4 '1/:^t48|:Z 2eEf(]F gy*Fmnd3tV˾΍hH8a=gR4m FE-):b0gŞX܈4(řnN-si v">@HenDNr-9%xgcnP`j XQ4bw"2Ù NԓS΁sϨB~@x횾%g(H k ÓHJVUXΓX\?!әd?F"NyP2Odg^ ij"athW:I_fa t  ֹ1(Fk'ޏW@j .T/6'k[(uOa&^K+ {JDJ=1FmYy7,bKkS{}}emzwyiM63Mc~շ闿۴ouPOMkLGߦURfAo3rO?|=5c7=u\U& mPڶNK`mG]`}iiWvHGJԑ@H&EU7 זTH\h2دX(t$t+UٞVƀN-L}ɑy^ kؓ(`ݎ4Vq{ѐ)1*i ĠCooZ¸4k9qVAەc^ؾJ˻'0h`dڇә3}/_0mR(tB9wF:Gj8r~8ȃ V(c>IB $RAj'So4;Ia/CS]*Ð(_,C靛8!RbT9uI cFSjHm#COuPx=5 aUĵ\OXi"ޗ}FZs0Ӫi ^U*^GҩsMo|Zf )/2x'3p>;L'qPؗ쓐07ZL -zN% ewAZ#/p=l'ӱS;#".IiW';4fkP2H 좐aȮiD^5P̬R5HAZ|3hF1; pQڏ }lSCڬ؜}})uq:5vjY{v.i!!!)ÐK4کRrW AXd! #v~K7[|t$uQžYO p>CQ5El#ZS mYckFaQHKr!$wmp+EKGB ;s> S8-۩ATB<4etkجIS.({R?&vj4 -ԸxF2#*vj~ss"vf;5(+|A:C›l&.{tm;hoS+ Z{߾= 32ނhW.1]<]8w9e_o{ͺqǻuL _jgpgWx4~y"8[|:V-8ۓ1lԿq6lL(v!'+Qs3koC]OWM =lFr lg#f2˛)}Hؠf@:4=(gs :8*  @V@p$1&0ՇDbz,QY=YDi&Z @U{b[NH-HМ4qR5K;8h0 RI5Hμ=;RFop[P! Xʾ^4&5 E-QdRZܞ͍#Umil1 tI:cG/+|YW99-ITbtMnFŗAE r6 ʮm&@}E._ҩ6(w+T7ZNՋ|ϲR?^CՐ$^,2yBj0$F*[G\cijGkHƝPSl\lנ:elR[f:몂wCd>ٝ =3Xw k=صV)W撚FA@v(Ai5M 5XNB0y\`o2޲j4[qƩ rAjZTM5F~jrZґ_^kʙ'zF_^9{^X{s*@کw鷹&wF(x{rx>G Õۥk]ێkCɜ.', 7a7_7߸[7i_î{fYgh<7Z ܿѦܿo@~ҿmq7п#˅0PvxOPW0/qV<4yZ9AU/+0 g8QJEܖV:\pV&ҿs=9]%?J L*x $zx'|:K)bAQgyn[2bQX!xoJdPs< iNdNɋ•,#UD1 x b jjU2Ɩ6.@2CORSp[/_ 3(C`G=@VaֆdiYp !o/kSq1IMn+%xOTm9(NF N¾ʬ:i:mR#gJT 8 qJ'Zm "2" pXh)_p?E"sjrbѶ`P;xany[$[o: ޼u=n]C? ܮ|NnUkyXnQ:ZnͽC@wȲ;T;?:hsOutINۨV/ ;L|N75ѵ(O7ef2cyGkV/M -LI>ݸԊVH1/}3>]ѲOڏ|/Ƨ+:? Q/.Y *:k+3uϸiAwCk*5Seb< +*gͪSդ;#5W#:K*h\rV1;(V+*k+U87ӫK[giRs*N,-UYuQ85QH΃ StD2)dVR Ee%J-6G-=KY3p8SH82]mya{rJ2J PǤQ";!s`KR8nT27صº'-g Npֽ;7/)dYH?Ϙ\Nv27N^,(gl0x|r7u 1g616Dxŀ)gN&ךsv-JeZa^z{N]m7A۠e3Bˡ[]۷.nz[ϘF-jh7Ya`۠&i, 36铆HycUj$t8$ HHBYj$t8G`[ s"9U(ݛ9s+3.@W4@f'Z705nMՋYU0mWuUP>pJHvw*ۅA b@)BfATb;<d4vmUU2eC|lN&҄CT5`w 0 ҙcDcLTa˽YP%F(K'e~hrE7S)!b 3p-W*AI o59Cp0֒gfYMBs0s"pxTB)bQ<T%u:Qj$Iզn4*TuT uJL:cLJ->)Q[5~ jEo2vg,T(VZ.Ojb%W cզ|َԃ<@vd}*g7'⁻:u±IG{K­.k=K"[oo]^r{ -~a~o>o Txͦò6CcD +ZX.l]ТuqλŻǻu\x1-`?0;aYbx錝Fܦgz*U5z[CSXoL~gz=P3.,!`RkVs4I\'x#~>.,~J=Y':Y6e) \K"[t 4 HI6HMFXEW)YD}OTעI4 =D6P(K<{3{(+}D9MPFԢtԊ)Z)"Hgt*%hUuόp exrBS!!i:),jь>лy-0 -UL)Kt"_sfE"H%uKj,E 1z=L,D3EGUbv$霼 }S6]=cMvB IjBQ,qb;gE]/VO Ha@ϗ}~͡6A9팴"MpCTnR Y_/i).l7 n\ߺx{ͦ;[>lu.w/tl:tؒ_2T`f$(nyfyו˦+{f?ޭgl:#xզ_jj+aYx錕tJs}Ik<18{TY)$U#$'Mg|q%IJSFԗ[xS(?jA*WQaFF~bH5 BzU? + \R@ٵSHB,F5( 4ՠ1ZQDtZ0FCd}#?: 2Q3FUrFi#wMKCŗN}#z"?|XAxԥMy 5k(qx{Vˋz0U 3\W'XojL޽ȋ#bV qJP.c!hB,M$t]G _}sGf~r}#Tc$QAV +\Z8T0d~y(Н۬r)ēKFQLic=jpV5f*w;Q {Ưm3 ?w״ЌH3 ~tgty(JĚ /5e}Cpe Ѩ{]!c$mϩi=1cJ_0MUiYG,\uQTbQ /7E8C)m֝aPlhUp-,^3LR5Ӱt/h< m mYgOZ_C=橏Ca 'ڏ8/ '<HE Z ʟ 4[2`A;_<ՔPCw39QǘΙ{֬!4/bGF_3#װ1@@hjPU+U- 8]CL-룜,9\##zڌeRsR5 Q]؝m@Qwj3dIGX/$Mzg))ؠpB\t^_\2|bL1 d=5;4|Fqy) p6-صF8J5ӄ͍:Ι#Hޙ,h9TT2ZZ̐ l KZf82YoӀ: t.G{њ]uC޺X[*,з.Ai7}Ok򂺏>6 vm~Zd]{c0.'T⦂wLr`L]T.px.1 ;US.T𫩩pF`48FT0_j*pMYgL'WCS+E؀+\_ŭǢH6HL+țFS:ީW'WATZ˹73?ɤ}hX pubD:EPNKΚIR]91P#vӄw K&bu9=! P脯*}N'Ә  |PFf@&ĹRY. hb 8t ` X Tk:^ B(~k0,*B G(|@b$䫐\~2~!\HW0M bXd &DCa)xO4zgITNSrNےluwЇpGry|>"0r !@"$r׼4)Rxȉ5hZs<"N*`k-IVX춂)i 8@q15 1d0 8C-yzdeG%&\vrG\>68Nd+@6 d b8q6:7qe9D@[# QW,Q]xX哑G)ta,^|B L%;-bB{lS]gPl@tT8_!~2a(xO`ȁΰF2 g%ӵUe$.NV/줼5Ҵ\] ew QN{g-I Ӏ1Λ -wConv0oV7o탰š[$Gkn=䷙ڀitOPk&O`4"u7zd/n;rf?P{~(G qxcy`͛~r uxsD>:XsЗGkn3:v ak~_@%Z=kB*٬%m'G}I+U5밇Vqj=\U{x /EXWB,'1@?\Usܶ##Nۯ(JUiU4aqޞR ph#>6 )~10֞',CƸ`ql$o @kPnN\[6Ԧ)ʑi CDve l)~ˤGijp須3fO_ ;rd&oCon9st%vr.^IWN΂ɞ_%ꇛclcEَ?ǟu؎?[uضǟu؎:z|3d?uwI6~9čwH<i ?<=||=w| ǩ fӧ*6l^= fE@,cRj Y6\)Im 0,? )U ץ #()VdHIo. adX2 0My"N3xW%ʤ@O{D@> ԖuRl-! !(EXq2 SbsRl9tVD6!?CRY㈯3q!%ڤ& *D+#D DpC"riL10 vSs 4Vi>)ȇpHleJl, ه9Gw1C H)2FYAB5PJaY| 6-R1'lI"GV~g6^ugЪF r1i7@At#}7Kۦ?t,`mnʛ[qù5c۔oCR"poJy{XYr6crS[ۭæ[C7RѦYۭæ?Sz!:կdA;pݡ%\O?FAo7(_9Hc9k0>7m? DBN~k0]p 9 5GgJMR pc6"c& endstream endobj 107 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 111 0 obj << /Length 1606 /Filter /FlateDecode >> stream xڥW_s6 #}Wy4]d$^,$ilz$ o_yI2*&Y8/'iSUtK%\G˦naꙘO_wM=IoTT$"]mlݓwAidn:W`pQ mo۹z'32dk&|gY9!H++-|v3t?~&ZߌY*,`R&Y$Ɠ8:J̔eœbV赽)NIbp}UJ\K^B &~;Q,X0'Yt;Kyv s\ٶcE[d0tl\;-n=d2lÁMTadC|Dr3Փ; g3yZ@ f8kխmx_tx߼4M[%Z3J\5m䅯$V[U>CHD" 12p>5ޣ7SpSUEe-혫hӶ8͠uGYkZ6փ7_s= c3+[7KEg IK4un[w8ٿЕ!6"nk1h$ 55XOcqTPe%RRI+,8C-$9- /TpX&uR5ܮzɇ<ĵmeZs8?jhq*h-}sWQz"7LPK6$_y;?1ਬ7<.Ca޻ѮB-ԪDGic:)Hde':j?]Ъʈz#.n"tL&~,nK !(>QSY%p?Z֝w礩*Wwpz0D.IKEr;"EXcgɋSZ2'jsf^yO<M3$Z 88m5W\:L\;T~嶦? "G®ȑRr!νz?$bks 1@5ժ>7ߥnܛv{2l~ Ɩ8jolq5sKVʲTEeid:LZ2 ;c_?MZ endstream endobj 116 0 obj << /Length 97 /Filter /FlateDecode >> stream x3233W0P04F )\\ %D89ɓK?\KDx*r;8+r(D*ry(177@:.WO@.t endstream endobj 117 0 obj << /Length 265 /Filter /FlateDecode >> stream xmN@ ]e@GK H01NPshy> stream xuAJ@ &G躀&qqtBA] *Nnr`e8xPMU%|wQBvh1lR|yՄƗ41>:? ]\c!T0i+-/zB6j!|cu (+>MzؒΨqj[`iۭ3։a{ _3Q7fZVkF~> stream x]AJ0(d10 l+v1PG AW.ĕ(Blof#dEkRҴ@giRuo\=gM*wLUWeRߨn/U&zceW G `;"ˣdxT;> stream xMͽPR2/&`F0nX`!ZZW|+>m,IDLsLج'F< hIH>3̩ˍɋx~X}Iј>{VtVpM\<Ȑ(뎎VRt5DXl㍕!=*%i+m&W'I֘6qE׎s m ] endstream endobj 121 0 obj << /Length 191 /Filter /FlateDecode >> stream xm= P ,dھ ҂V8PZ֣ot(j/䃄=4@ |tQ(̀N'fox6ْۑjR(K*mѱ9TՇb(5('ʎEZnBS?@_L=lV$p03Z!:p endstream endobj 122 0 obj << /Length 194 /Filter /FlateDecode >> stream xu= @෤ B. f.%i`0XB-GR#V2M3%cl4 '.k4LӜ-ǚ+]'KΰS>g W Bxjz R_5A"EYՔ֯KUJ9'"}hP^"mOނhӆqD endstream endobj 123 0 obj << /Length 222 /Filter /FlateDecode >> stream xڥϻ 0Yb hz 8A>Bbi` .f$wkj m,{XvXq |WnX1.Yo : 8qОBE&׎0R<xZJNC:qP&z 8g!MOya9KKyR2{Gt;'3#N)-Z"&ga֣jHb endstream endobj 124 0 obj << /Length 199 /Filter /FlateDecode >> stream x3233W0P0W5T06P03PH1*22 \.'O.p##.}0BIQi*Sm`P~"A v>rd  @[ DȂX??PFPf j`og`j@B endstream endobj 125 0 obj << /Length 272 /Filter /FlateDecode >> stream x]ϽJ@R Ly/I0nRH +VQ$⋍o22Epatߜ9Mӄ"J c$W)%s(ץ ic ){C71EܐӢhPwv\|u곅h::CEݢQO 0@5e|a9vsm|.vn ;{\PfnjcnŇ9, rQ{E.|k F9ߪx5<+!D endstream endobj 126 0 obj << /Length 228 /Filter /FlateDecode >> stream xMϱJAYX"л B ^BR%B 17[da+ͿvaդB&rYx$Mok֯<88ǘj)/ny!hBTYMU̍mh` taMC;N{y⹪MjR<7kR;ugH [ ?i}ĂzG7lVxBfeI']ŏ|[ endstream endobj 127 0 obj << /Length 201 /Filter /FlateDecode >> stream xMο P# ·{RI+!!-GQ|GɎVs|''z:ӱA'_2 zߓETܝNCqWMz=&r=?:HPUO) pr]X5rT$GpʬLvCO" &q"Lǰ E`/^ ,SGOt endstream endobj 128 0 obj << /Length 189 /Filter /FlateDecode >> stream xU1 07 .IiB`A'qRGh=JѡT8 '8PJ\ NR~r|q| o xc E( iIΨ,Y)3TLT?گʬ"!X^4[C`R;0KտP/? endstream endobj 129 0 obj << /Length 196 /Filter /FlateDecode >> stream x-1 @пXSd. )"*BBRPQ$GQr-SflCy9JxAӅ"-ːG?QQHS5ْot5ege3hW <LD(_O5z Ne)Q ( ?e&"L! U;/ѠU˳x#4hMHH; endstream endobj 130 0 obj << /Length 185 /Filter /FlateDecode >> stream xڕ1 @ )B@Tp A+ RKAEJh9JB5&{yJ1eԕJi+0&fFDrB|PIcZIר^7S[SYc{ۚqyZ|gVa,+;P?a]MʼnJ endstream endobj 137 0 obj << /Length 211 /Filter /FlateDecode >> stream xڕ1 ` S Yzs[-*T;:9::(GR}?( {I^kJd3JҗmYtCDN9,gLgt> stream xڝ= P_H&Gp/TVb]r#XZYbi4$18 0Gg|'e9r&Xr;fw[9+[)5<_JYh0hAJVzƒ5/M[ߗGr:c#Mm'rIT2f6}]]b}[q7S3 endstream endobj 139 0 obj << /Length 183 /Filter /FlateDecode >> stream xڝ1 @E'(%1[ZYZZ(Zǣy2EpQcz? xL"M1KvO;bjQ)QY TrJUFCz6#LO-AGЯyp{w?~;W4zRB.cRHU}{3'h,$EH2 endstream endobj 140 0 obj << /Length 174 /Filter /FlateDecode >> stream xڥ1 1EW,i ʺ),J--=G#|yf\pʎ]{ A) X~ƧyG:ْ.xe٬9A^ok)Ȑr _6| PcGԾ?1F>w=F$ ӂ޳I endstream endobj 141 0 obj << /Length 156 /Filter /FlateDecode >> stream x31ӳP0PP0W0T0PH1*21PACDr.'~PKW4K)YwQ6T0tQ```gqHȃ=`Aԃ: ?Ŀ0 ԡ`L|E<Փ+ G` endstream endobj 142 0 obj << /Length 143 /Filter /FlateDecode >> stream x=1 @wn^Xbhi(m,-q#(|cYj9֌YJUT΢yךTN̖Y ƭx܎b*N7qDoRp, endstream endobj 143 0 obj << /Length 99 /Filter /FlateDecode >> stream x31ӳP0P0Ɔ )\\@$lIr p{IO_T.}g E!'E@!ncr h endstream endobj 144 0 obj << /Length 129 /Filter /FlateDecode >> stream x31ӳP0P0S04W05P0PH1*21 (Bds<L=\ %E\N @BA, `Ad"@j&3p? \\\I endstream endobj 145 0 obj << /Length 103 /Filter /FlateDecode >> stream x31ӳP0P04T04W01R02VH1*26PA3Lr.'~BIQi*S!BA,B?$ r \A(a endstream endobj 146 0 obj << /Length 143 /Filter /FlateDecode >> stream x31ӳP0P04W06P01S05WH1*2(Cs<,=\ %E\N \. ц \. AA=ga{n@Cq `ar S< endstream endobj 147 0 obj << /Length 297 /Filter /FlateDecode >> stream x}J0 =Gh^@k +؃='A붏Vk"!tʲ(xI;-؜ùifvbkEsV6UuKՙ[ծ y<$GIf443yL/tQ:ۋ(]!5*:=t%I>Yl,P) HK . O@Kj7:3,E{o[JG]}ד}t2y1: s)`W+]^oe:oյ> endstream endobj 148 0 obj << /Length 193 /Filter /FlateDecode >> stream xe̽0[x "~- &2`A+Zl+ z1xK7}`|8CQ'p7.h nv7Z͐1nc!孅+ ݗД>!uBG3%9mM5F4V.կf֚RFiHk7e0)#W^a> endstream endobj 149 0 obj << /Length 254 /Filter /FlateDecode >> stream xڕбN@42/(V$HaRK r-%aYL,$/0;?S5K>ǒ^hquyxmG-W*.LEwoOTlϹbw%1'\|zp"_^D"j|tF}Z;6ޏf6$Z fnݐ}^-~'?pNNr]nQZ]k* iMDE~0gzgJBd:̬L7Zs! endstream endobj 150 0 obj << /Length 219 /Filter /FlateDecode >> stream x}н @ H!KyZt;:9::(ZpCLrE>%ɋhH)#tyT?D@(rIfRfFی3'zj[Cp\; f[ k} H{wZI Nd;j<WJX2.&,iT !q^P endstream endobj 151 0 obj << /Length 232 /Filter /FlateDecode >> stream xuAJP?dM9/T f!ʅ.]( ]+@"9/Ibd>f_dzt2㘏 S^'Di̮dtGZn8I]ȖT~/ϯWgZm+F EQ$>B>$@Q Y¯"8(: ,:QBM?jlӞokb{tM_+u5 endstream endobj 152 0 obj << /Length 215 /Filter /FlateDecode >> stream x}бn0n|OPBP:!T*CfeJ;fhծGQx (JXbٟtg4{y]SLK^+}&iƵq`Q=P}.rG?_h %htL(>a%ȽwGk]BrQN &Cv&̍A FȗF7"'1u&<کZ܆dT?s1ݭC&Vo} endstream endobj 153 0 obj << /Length 262 /Filter /FlateDecode >> stream xu1N@E"4>Xq ,  * ()@ QaK\#Eg xyxԙ.rS/I9,/ݣkoK~<>H:Bn JQ 'PG>&f_S3 H#>%Xh:Y3ICE2%3ЁUmr88va;7;׫g*zɴ'H 8o3.7F>se弖k" endstream endobj 154 0 obj << /Length 219 /Filter /FlateDecode >> stream xMϱJ1"0>Bt7BBGˣ#\yŒYC_„kJςƵƠoA{]VyfIc/ݝ]Íqh H<YNW͌!#|i~8-v:Q,b#X}n}Hْj`O:Aom"jAk1xp3YvG-m endstream endobj 155 0 obj << /Length 235 /Filter /FlateDecode >> stream xu=N0\X&G\hVE"T+*D49# '@|{SYO7-մ-3.ư١m--Z.sUwE/oXmϩjG;vd)3v(&_*r) ԗ(G^KoNP=:F#Ȑb0caߨ``u`;}!A%gyY$ქ<K~ endstream endobj 156 0 obj << /Length 210 /Filter /FlateDecode >> stream xڅ1N048feH-AK|%G2amCEg[|w[>]r-;mzM[.NGxSӜpϟ_{ ۇv}a@ZJhD2Ȅ$2c4dvJuNͨ (p7Rij/M)vAm+uӿ@"S endstream endobj 157 0 obj << /Length 232 /Filter /FlateDecode >> stream xmαN@ `W"yG8DJS:TD$02ʚY%AC:d) MܜSE-ԬiSTk> stream xU1N1Ei|kBR[ AEQA h.SD;&O͟7+nykzeayH={ɏ#~@~  ,FI# $Hy!p9sP SlQ S]BS3O?9Cz 5I[lIݐ\N+*iD=ktSn'-o endstream endobj 159 0 obj << /Length 286 /Filter /FlateDecode >> stream xuJ@g"0y!SZYZZ(]-rvABs.ovI{F%t\tZSSc/ش\-iYqaqKM%ױ 9UXl订 d ybR.aa cX"`?5̆o,, ߫0Ȅg_RPg)$.z4/@ciJKJʓnyA u%>@+ +0@:ɝs<#Nz3b:%^txۺ endstream endobj 160 0 obj << /Length 207 /Filter /FlateDecode >> stream x}; @49 SZYZZ(f=Z"xSg7 ?2Aɥ ^H[]McajIj*UTNp>"՘VkQrtaQ d,ɹu|--"1^JBR̉*z&v:N{X5gS\Uo.Nb\ endstream endobj 161 0 obj << /Length 168 /Filter /FlateDecode >> stream xڕʱ 0+[| LBI Njh}x&A Ifz9mPkcaP,IkSע03:;|L EI+Er$ 4./ @'PE \b<<Iya9PpbpO)T< endstream endobj 162 0 obj << /Length 210 /Filter /FlateDecode >> stream xڕ; @YRxtJ +P,x4#XZH 6.W 34yP#PKkwFzV[s #cQ':t@>!-| 䪧䟘L=̿;w3'EP+l7jӯi=|:s+b-SJ}e GrQ3|d endstream endobj 163 0 obj << /Length 159 /Filter /FlateDecode >> stream x31ӳP0P0b#S3CB.cS I$r9yr+r{E=}JJS ]  b<]``Q"? ?8 8{0u L?` .WO@.R_^ endstream endobj 164 0 obj << /Length 177 /Filter /FlateDecode >> stream x}ʱ 0J-}{B(u* ftr'utPt+G#t< pwxb1?p dsԍaw\XL@y B-r@) -=/4mVgu𤆚N-.Ѧt+.Jf{m?FN3w!ct1]a`/B' endstream endobj 165 0 obj << /Length 190 /Filter /FlateDecode >> stream xm1 P ,jEB`A'qRGE>֣<;B|?Ns42!Mgohu۶՞Lj-)tC*.G'}4!r8FJp-27sX;+YJ>!PDhxհ#qʩe#\Y.D*~ps endstream endobj 166 0 obj << /Length 217 /Filter /FlateDecode >> stream xe=n0 ^ !Ȕt"YkMG4z0R :]ށ"ħ=,\'7O>i:aAOtL}eÞܖ[V($FFUG"@'C;MBMIU (5[resKMSCЩAgC4jFV"j"kJh+bo endstream endobj 167 0 obj << /Length 247 /Filter /FlateDecode >> stream xuпN0/`<JUeTD$02G#d|P,'?.n\uۚPk^kozETkToj/ ׯԭ 6~9H$؀BzF{baIu=L1;> stream x}= 0 kI NEzbIJS$.(qfc.1xIjsq$Uj"ۯ1)Fy#ҜN&"Yy 2$P5sΚʮTz)z@=qQg5椳[o }6 dcq endstream endobj 169 0 obj << /Length 222 /Filter /FlateDecode >> stream xm=N0_4{2lXҲH@j D (GQr.L(4~sr>p>ܟq q<> stream xuϽ@ ^H.1::htG K6idP@ 5E5^0PጙAKaRݮzNi)أ F8/nO+y\җ1DgiP->Ձan,Oz౽R0ʞ^ endstream endobj 171 0 obj << /Length 187 /Filter /FlateDecode >> stream xe=@!$p? b"VJ--4ں{4 Fiͼ$)%)]"c0;9߰jP(PlL񺢨v+Pt(> stream xM1 @'49(I F0X]09ZRY73las.O>t%ߓ1y8^(NIHdK*]87 vI%w9PpHZ..XM!/3(ѯz?Gh ź1n_*U JU@h ;0" cd:0&I˔dU~ endstream endobj 173 0 obj << /Length 204 /Filter /FlateDecode >> stream x]=Q+In$~SHB tˆB9;0f0;0A_r)*kUW*PFgD3gpQH)nQ]Z.VS^-:dmV{9muju*<5MfوݼoϽ=f<\?l@/!g"bf#~vOhr endstream endobj 174 0 obj << /Length 232 /Filter /FlateDecode >> stream xMαn02 ݒG^:DSD$:u@LЪ:DGˣ=D1>$N}q2QDcMMtR1% '3̶{FܽBيԂ4570ze(mi_,h[i[s?v%| ϛ'a73UVWhvV۩~rk endstream endobj 175 0 obj << /Length 240 /Filter /FlateDecode >> stream xu=N0g4$TE"T Ah>E3ih>Kckf>y悟kzU+Ŋ7 :*yRy-e*~8P=?\=RgDnrT#t6"9!7:aJjT&M/?RȀޝDzN񈉳Ba(9duek!J $5Kf| !@W'}r endstream endobj 176 0 obj << /Length 179 /Filter /FlateDecode >> stream xm; @YL#8'p+U F0XٛQr)$㬈k ?S`O'QD4>&)"fwļD$E3\|=ɗS)bY LTUB3K2Pmr/*qOrZv_Ծ~bnJ\ \T endstream endobj 177 0 obj << /Length 244 /Filter /FlateDecode >> stream x]N0 @qK?j`Jc N'q@p%~J>a)ODiVkh)Y5a}[mpaxfV;x|ŰÖj?D˃yp̓gYYC;@!&_@b˔?ճGefoT8g~цv@Q6tozazkz4Ut_)ΔQMEјw>7x@ endstream endobj 178 0 obj << /Length 251 /Filter /FlateDecode >> stream xU=NPrai_{p,9TBpED hc-G\[+ό\]TЕ^ZVַB>,(.tYMY7?kYH~OYA~%_?*Սn9"F>= 3ڌvвb8cw?2gFGD=2;x)fNUSgf91.؝¹jvb4qsItag}@SC$<ؐ rȓew endstream endobj 179 0 obj << /Length 225 /Filter /FlateDecode >> stream xuбn09rOjJg{mT$ߛN[“ҀY $HI'xi%'c2D0#j|,| endstream endobj 180 0 obj << /Length 256 /Filter /FlateDecode >> stream x}1N0E'Jai#d.I,-D $(PR@p%%GH <=kiq'K+3yVV럗grs17?q>us"RQ#׉ DeLU걘E@H(補x@5dD#;D/D8cNl'"k3T{ 蕁 5BVnBolU)3PϿ59ዞo endstream endobj 181 0 obj << /Length 261 /Filter /FlateDecode >> stream xmJ@D'l&$ +P5, eu/`%LszrJ%[9ieھئ4vyxΖTlJ^ߟl>ږ{^|P`TG . dCE Hf&&/ҫG\1!\6$E:ꢉА*-z kaOZKpS<9<;T"LM٧^Yѐ> stream x}бN0a["ݒG'j JȀ@AG2z1 pRϗ׭*깄WpW<`[~P߂o ݕ*Ac=;X)8̥];N и>om n]h} &$$NEȀ܃6JJYK&0xx\G Tzq A9x`I5 dK'h>,(lkn> endstream endobj 186 0 obj << /Length 221 /Filter /FlateDecode >> stream x=0o|': &2`A3x&)%/|0a#qc)rx48wkgf 3`iPb.i)K|E4Zo '^QZp6*/?aT|bUYeTݍ'e[x? endstream endobj 187 0 obj << /Length 198 /Filter /FlateDecode >> stream x}ѽ 0['bp+ vtr'utPQ|xm.Id)LqDƨ*:mv`wd*dN]H^$r-qCKPx "oS%zgs6QTֽ1(#ǘYIY{sop oCGqjc1[¬-GǏ endstream endobj 188 0 obj << /Length 279 /Filter /FlateDecode >> stream xڽN@?!yO%5I=yhZGЛdٝ~?B b|sYrq9=Q?S{iM :Li}/ϯNS:E-305€&J^U: 'Ogk DtQTvi:E7"C,"Ոn2 CbX&;k~ U >>}<=ZqBlMlq~Yt8m难JfŇ endstream endobj 189 0 obj << /Length 269 /Filter /FlateDecode >> stream xڅҿJP2\8Kޠ9O`"Z B:H(t2|lF\v(^j $| w&';?!pS,z(KyqAɌsRR\ %)cwW82b}bܷG+q cǕW?61粅ϣl:^ÑIw(v6 ň kUňhFL>#lk|U9W,I]+~:|nV:hmtV%}fo endstream endobj 190 0 obj << /Length 269 /Filter /FlateDecode >> stream xڽ=NP e%G/^4e H0u@sr%GȘ!4AEy{~ ͨT\soX)kyzeaKí1TwayÚsZ3`]|#HR zMju3hX"Ps؊ɻWRM!s 3U\S}? ?0{[AkwMLQ%4N2d , [qmpS~ endstream endobj 191 0 obj << /Length 151 /Filter /FlateDecode >> stream x3732V0P0b3 3CCB.3 HrW03r{*r;8+. ц \. NC=7h? Of5FW@hB-Gf 4-8i.WO@.ڬ endstream endobj 192 0 obj << /Length 226 /Filter /FlateDecode >> stream xmϽN0-y P'4d-`b@'+Q"`8;UO}ȳf]qShypw-Q7פ=do4M%dWr~0$HX `~@} I VV&$}R˴`\Se^BM#3]Gd>r˽^R|KKJ,uO?} endstream endobj 193 0 obj << /Length 208 /Filter /FlateDecode >> stream xm1j@/T s{h!"eS0)l MGT!4[;]f{gN8Yα{ϔv>˦o**v ٕ^^gEX/8%[6䝪H N@ F>J4^{!g#Ѕwo9&K Ck`DZ8eEotWq endstream endobj 194 0 obj << /Length 129 /Filter /FlateDecode >> stream x3г0S0P0b#33CB.#C I$r9yr+r{E=}JJS. @-\. ?0c  R@@eH?3-?Փ+ !;X endstream endobj 195 0 obj << /Length 106 /Filter /FlateDecode >> stream x3г0S0P0b#s3cCB.## I$r9yr+q{E=}JJS ]  b<]3GB7qzrr] endstream endobj 196 0 obj << /Length 191 /Filter /FlateDecode >> stream x= P ,tvtr'utPG{G*:=GA I/ {n&ʻIyy"> 'Oܖb*i`67dJb$%]S`}F] RqjKOmVulr/=jҏ )0JRw h"o9, endstream endobj 197 0 obj << /Length 153 /Filter /FlateDecode >> stream x353W0P0bS3CCB.SC I$r9yr+r{E=}JJS|hX.O ! fHH1?``gRB}S0RPl'W  endstream endobj 198 0 obj << /Length 203 /Filter /FlateDecode >> stream xڵ1 @ [ h` A+ RK Er28ΚbՃ?,;M܋)>u-iDfTvGLR d4s1Lt9_& I:`\AQȼ&s ׏]޴[e endstream endobj 199 0 obj << /Length 154 /Filter /FlateDecode >> stream x3135Q0P0bCJ1*26" \.'O.pcs.}(BIQi*Sm`?{`WaH s`` t$ApzrrX] endstream endobj 200 0 obj << /Length 223 /Filter /FlateDecode >> stream x=ϱJ1` ̼f n!he!Vwvr#lE8A dHlϯ/g+B԰zO";J~p5?wܾPf f(pCU|KNC;~$&ԉhDڞmJFm=ZR*'28H3#: td{w"$#۞n g endstream endobj 201 0 obj << /Length 154 /Filter /FlateDecode >> stream x313T0P0R5T06Q0PH1*26 (ZBds< =\ %E\N @QhX.O ̏呰=CF fbGŒP9*b9B A@=:б \\\1j endstream endobj 202 0 obj << /Length 218 /Filter /FlateDecode >> stream xmͱJA`7OX1WZYU2ABN|Wnn l! S_U\nsuɫ^)9L}z,74o>qS+߶k.Yc^]G!`<2%sJ@!Ꮙ2ShRxV&GL#>|G@#"@&{ @ωCdw" 1E{rb,mK Sc} endstream endobj 203 0 obj << /Length 245 /Filter /FlateDecode >> stream x}αJ@YLop7؍9 'BBR+N,|o )gl# 39:.Oi#b5;*+٢ ;/s8(fn!o`@ld*=lJzx3^GP\0(afQwK+5fLYq>Ch*g 4ՐC>UOB6!FK@ endstream endobj 204 0 obj << /Length 231 /Filter /FlateDecode >> stream xmϱj0 tO٩ i PH SӱCBoW> stream xڽ1@EPL (V$&ZY+h G(βPhiyM濅LRHUC 1?RlG~_)$3f) 2=yJـ#SM`sfjB*MwUtmph|gdxi endstream endobj 206 0 obj << /Length 125 /Filter /FlateDecode >> stream x35Գ4V0P0bS3CB.c1s<͹=\ %E\N \. ц \. @ "ꁘ?b;=?.WO@.v)aG endstream endobj 207 0 obj << /Length 247 /Filter /FlateDecode >> stream xeнJ@H0>sSZYZ^qy^]E⣴> stream xuJ@ 30<.zXWAOēz}y>B=$++B$,^lNm9*6MWuXSZdx|zw{I򿧇D#v{/R図x^9H`mZt/O/eegZx~ǜ endstream endobj 209 0 obj << /Length 197 /Filter /FlateDecode >> stream xڝ @`\|'h4 ԩCtAY>ћ9`fgoNe9~SO]ܕTS;ҫtq&oNx{4a0TeЂ6t~l*hB ofU)h墍8`%R4 E:v#6~U3)mܤ endstream endobj 210 0 obj << /Length 247 /Filter /FlateDecode >> stream xڝнJ@U)LkyMs'6.'B RK E;!HQ)XnXbcdvv>vO%8ny'j^[nWg,;mx>(*1> stream x}J@'8&p,m 'BRK E;!h(yAQgg?r'+i'wĭ]=F/ՙཕ{4 LTyS!T*/p1*3J`=s6:IG&c Mi5~1| qOefrRǴ[[6Md`5Y:"CF(|5B endstream endobj 212 0 obj << /Length 260 /Filter /FlateDecode >> stream x}нJ@ )Gȼ&CX8O0aW^he_,#lXnqȉ #;߉;>QC-9jOiУ'l5n6谾vu伤%pYbPnl&Y*}__k9J'Qso2SO;2YhQ'\4VٙG RLVY0ϩeM" endstream endobj 216 0 obj << /Length 327 /Filter /FlateDecode >> stream xڕӿj0q%C `*B]WC:Nm-vG#dt&?RiD ~i]_\V;WzG*I꒚M dߑ%)YRtZ@m^HwYmVaܶbN4RbXMΔ\uNnnb| mbީLE捴]$ⱱ7!3ilz.2Ob'z>уt!򸴏97 טC.k&) 7Lʬ k ͹!!KkK!#ܥm<Fk(4J@?mG/c endstream endobj 217 0 obj << /Length 338 /Filter /FlateDecode >> stream x͓?N@gC6QڸHaRK vF8%^0 Z-;;3|qvrXЧhsJL6~Em*iS^o*\R[}OT@WdR;Ȉ,QG9Ci 7rXK0A@$s;:>GOÔ11PVGG { r(ܑ  J}1*7S($;SheIL>oC^fi0ӤIΧ C4qHGnJ谬cC +{7Z۶> ࿢*E!en/ endstream endobj 218 0 obj << /Length 258 /Filter /FlateDecode >> stream x1n0` x'b R"5SS۱Cd(9BFcWGRZ}l_Y1S#=e}EeEzYNzm6|<>I/O^捪ko?n>CK(I֪ov^سs`'rVr\w I˼ދ/np=g?;ؗ= 13rً E7Z1ӌk kmgj.=WMs endstream endobj 219 0 obj << /Length 228 /Filter /FlateDecode >> stream xڕ= t y G('v3#NI4:(IӾH~iՍE[LK;nc<`gq\$A95(8;H(beYc6,wh*.9)"1RH HP+whyś(/*P#qRDҥLSc_擽P[+^& I)Jt*Jl)sŪJSN2\U\ endstream endobj 220 0 obj << /Length 325 /Filter /FlateDecode >> stream x͓N0 @PK?h Hכ*D$02`~J?c&rNldH^؎{U.+,p'%ΰ:ޠ%On _ K,!C#44~d32DCĚZAO3%,Fb= _&g2dFLdt^c;ȓhMZE=p8}ډݴ1Mt=[liq<3Mu;oϚ0qfUȱ:ؠqZwѻ$D#BHI!ihD W xkD endstream endobj 221 0 obj << /Length 290 /Filter /FlateDecode >> stream xڵӱN `H&GJkNM3NIM{4"Rȍ%) ~ٜoK<+>Lcuz^aہxĦqkAtwb{%>X> stream xڳ431W0P0b 3 CCB. rAɹ\N\ \@Q.}O_T.}g E!P E?!u?3bSWbWbWa1gXu0V6V eG,eƒ'c1%r C< endstream endobj 223 0 obj << /Length 270 /Filter /FlateDecode >> stream xڕJ@'LsL 'BB> stream xڵN0/`?BdS` Heꀘh XI-#d`stgۿ~Iy)x 5_XQ&oG\7vWEF<z{O5 Tb!ȣO!2J`@;PP<;Gg3E9c̈*l09t / inm';)),bߘ^Jq݂zlgF endstream endobj 225 0 obj << /Length 244 /Filter /FlateDecode >> stream xڅJ1g"0M!`Dy[ZYZZ(ںy}<•aǙP1|?IO :1H=>cTPc;Ocw!^_[^ʙ;V8?dmgPj\Rq :dĄ* |Vbn;gE d1o( ؁ahDBc!D[o1En %in6N:\Z` æ]H_I<?y뭜 endstream endobj 226 0 obj << /Length 175 /Filter /FlateDecode >> stream xн 0>B L*)j3:9vtPtnG#8f:M|~3z> stream x3635Q0Pacc CB.# I$r9yr+Yp{E=}JJS ]  b<]``0f+ɃԂ 0a@\\\٥; endstream endobj 228 0 obj << /Length 107 /Filter /FlateDecode >> stream x3635Q0Pac cCB.#K I$r9yr+Yr{E=}JJS ]  b<]0a\= endstream endobj 229 0 obj << /Length 232 /Filter /FlateDecode >> stream xҽjA W#>WZL+vrp!ET+ -vXqt;';됱j-->xsiNY-gOّy+#CYEI O$Rx%4DJʤn ׮UH@Y$߸Np⧤D@(Ax^ 9Eۄip xviC endstream endobj 230 0 obj << /Length 184 /Filter /FlateDecode >> stream xѱ@ & &]xHLtr0NUy{ጃ zw6d4JBGqlfiG{1+P)QEz@-ibc|!Pi ౮!`{.TV6ߡA_y48+po endstream endobj 231 0 obj << /Length 231 /Filter /FlateDecode >> stream xڵ0kHnЂ0 &2`A3<#02^KL%!_s{I!.qa@CT9 +@P% 7 v+@x0> stream x͒N@ ]uG_.!MBH 02<Gx۹F:.˓"J:lN錞c|,5<WO(m(KѭEGWbtK=b$(#!@5@oJ 4{aŌfJ`o}4.lO%wm_mte4](z`_TU` endstream endobj 233 0 obj << /Length 169 /Filter /FlateDecode >> stream x;0 t#' VbTD$02`nQzT dj20XY陞c+4xRps?aq@iA W<ix=   E^6ɱC:_:Wѫ}O_ /h m Ij^ endstream endobj 234 0 obj << /Length 259 /Filter /FlateDecode >> stream x]1N@4;ۊB$\ Q%ڬ\vY)yTk.拊57 UIJ/Kn6O\k*ybx[~|nXp8HDF#々~7'QȔ^;LKZ+45qj@.dtv!"ieh֔j]dV絳Su ?hgcfKxhGZ endstream endobj 235 0 obj << /Length 186 /Filter /FlateDecode >> stream x3534S0P0R5T01Q07SH1*21 (Cds<L =\ %E\N @QhX.OON2bH$;&=A$3?8HAN7PJ`$H `( E` qzrr:p endstream endobj 236 0 obj << /Length 252 /Filter /FlateDecode >> stream xڅбJ@YR#d^@7l 'BB+RgvE8X>Y؟/Η%YJyN^RaaB> stream xڕ1j@7Xx6l6@RXR%)S$$fB.2Ni!7.V?u~f*U+uW9o(fKUn*< ݖIu>?_dRLjG/zV!C؃@p` 'h'đv3k"t{O<8 F evb883MmH Є̎io“z>Ba"0i5s?hb8T0c00c*Cٻ1 i<8^gvJpi\DXו!) endstream endobj 238 0 obj << /Length 270 /Filter /FlateDecode >> stream xڅN@EPL'~ >X<&ZY+h+| K$\gfX){ʪߗu%B-k_Weʡ/ϯ7/nyS壼'7e"0қ0Dr92DI-٨l+s@!٘b4Hfoq!C?I?b`6|tC t} lLD2r1uIU'TuIk*T%5P%5!.>Z/1 endstream endobj 239 0 obj << /Length 137 /Filter /FlateDecode >> stream x3337W0P04  )\\&f  ,ɥ`bƥU()*Mw pV0wQ6T0tQ```c;0D0I~0Y"I ?&D(I"\=VI endstream endobj 240 0 obj << /Length 301 /Filter /FlateDecode >> stream x}MJ0)YؖG_]x>.]W҅h=Je? گiftߟ ChÞ6 s/\knCs%ux^ߟ\s>k o@B,D'DdZ"-,-B/63"x甙k p7q|$pF暿 dL@AvZHFӬYM5k|,ZdIeb4j`Mg!@Tt`[Bͻ.A8Ew̕bԊW'bt7}t endstream endobj 241 0 obj << /Length 305 /Filter /FlateDecode >> stream xڍN@LJlA gEr&ZY+h=> @IA烋 |gf.K xQz!eY^#[E{_o8_c#>UX>)EৣNGG#"qhfH8fEAEI=-Β%$#쵂H\Wfä hgcgݺi8iZG`s+,25\i`2[[E3)D/bZ1.8G IUuuR:X&oݴ]֯"Mߴo endstream endobj 242 0 obj << /Length 225 /Filter /FlateDecode >> stream xڽнj0 ['Pt!tP2;4qh~?G$C@Bw&,+]po1}R28^~в$IF~{͒/wu|'ܯ8&旘knLM@;&ED-tw>5 pU/jh:؊,PW+D5^ԝhma#:YVp=Dӊb~9ag/uwiS]]q endstream endobj 2 0 obj << /Type /ObjStm /N 100 /First 811 /Length 3476 /Filter /FlateDecode >> stream x[ێ7}W1~0K`%N $"ٝ m+H^Ic{~VwShFsIXd"YuȮB /A$-Z vFh+t c<09 5ydja cDEFBaF-:[bIJr ~d0xVpI'%HbX ¢e#H[<"q3Z?")9P¬HG|F%ځ`@e8/ (p`e#>Ɉ (Zl`K 8:X\2hVvS^ .g%R^cVzÕXa {bXR$87JO,>Iƒ 5^k߂ !zHeI cv9)jb* & 1Z8X)?ؤ8|cpY[n$F$׈G% YLK#5,1VNVQ8H\aKM3A'#% W-$̎=+Q}x3ŪW_r_E)Lj&˾8>>8H|ddw33E9L>4ϙg2k;LSϫ|qU⥨OקѨz~G|]+hjq+juS}}6?Y|' җ i=si7>lp÷>bHmJ-%wy:ښI3zu)7>,gYVV/'N9Z,Ӧ( 4U$m&CjW.IE@,&]Ʌ.l4K.Jؓ+τ2e"a+pwق XI2K !ôYGԗ1kԳ В[V9 w@ge5+si!)=3X_LV 3̄8};+2P `h\&'aLN3,S+\bzWϕљAw2T =Îx`p3~?Gb6;=$ӕRÉ x-5 _s6,Cmt<3<|g7y8_<~\.&j&gEMv,eyw;/˶ږM`=pݱ^Az,N[Ÿ ʀCό~}/]窱OVZ83tI6iS=~zx%ի/_ŻUG9/,Ϋ7|<>\mxfW8땖[V6BvepP[z Axm vW[lh?]cndz_|]Jz){AXXyZԵoitxlMV@Xb%r}X׳Ug ,j5.j.5 ۊKӻ(JJ(!2-%LQR*k(VjW r #ʜ@?Pn!<|F*rǣKdBGt:>}翏*39Ajر[qߐ; k!4V<DwB w 5V_,mn!(al&℩L[.VyϦǴuN$ku嚯7K]rʝrm'΋V<ԍ0'NK9vyqz"r~n0ƛ(4=[[5YPnKlKw&[~tC$#|%4JT,$JCG dP&@~eˀP>:PT」j(&&AS1Fiɨ>*@iBo<+J&Z1 t^k&aozPn:n DRW`Ⱦ6+sލK Hp}|Wb }Tb_bHCK#,T/1FN)x6m y$cXP8H$( ^/ t 24@ƈjrd,C4.qN:a dk!ŷGB6T8G"0lKH9u^>ȳ]'] JF=栱zúi-97J(C~r- ZW &kp47je~{ع롖꒙~78F,B;ccPkQ(}=?So=5? @yP>gi 03Dv%ne EqwzE27H6)>.ny2H7HZ6HF]d߉ǡȊcRNi "\d%&-MяM&p],K&"0*I}puNcG0w Z5n38{p9:QY㨮:VeP%i'^!\qXN;}`yP9y (^ũ[8HCTUQգA!jtw!M0 >ԟ^8ElJ`[J˾J˱J˹8TpFfT i KBރ4l@ZMָ5kn5n!8}qE(B^v(۠XD}fh@> stream x31ӳP0P0UеT01R5RH1*26 (C$s<͸=̹=}JJS ]  b<]L!W51 endstream endobj 247 0 obj << /Length 143 /Filter /FlateDecode >> stream x31ӳP0P04S02U06V05SH1* !T*9ɓK?s{*r;8+. ц \. ?조1aPoP`L.D endstream endobj 248 0 obj << /Length 96 /Filter /FlateDecode >> stream x31ӳP0P0@P!Ő H(`\.'O.pU()*Mw pV]zb<]\= endstream endobj 249 0 obj << /Length 162 /Filter /FlateDecode >> stream x31ӳP0P0UеP01R03VH1*26 (Bds<͸=\ %E\N @BA,<b@N ?8$D D`#2f2X3Iq,63 *@'W yK/ endstream endobj 250 0 obj << /Length 104 /Filter /FlateDecode >> stream x31ӳP0P0@dbUeh䃹`\.'O.pCC.}0BIQi*SPE!'EA0XA0Փ+ 9-I endstream endobj 251 0 obj << /Length 111 /Filter /FlateDecode >> stream x31ӳP0P0V04W01Q0PH1*21PA#CLr.'~PKW4K)YwQ6T0tQz ?*1pՓ+ JS endstream endobj 252 0 obj << /Length 102 /Filter /FlateDecode >> stream x31ӳP0PP04W0T02VH1*26PA3Dr.'~BIQi*S!BA,B?ĸ\=E:( endstream endobj 253 0 obj << /Length 254 /Filter /FlateDecode >> stream xڍ1N0E"49BD.!ҲH@Q V9#Xqabf4ҷoy5w|pw Raͫ~yzH==US53UKnC#[J  K(R( 4]7^/_2 (`\ <Lx\XgA7A:HÝְZjIKj)! "chI(QUJ{շ1Ge/]tG߹< endstream endobj 254 0 obj << /Length 190 /Filter /FlateDecode >> stream x31ӳP0P0bSSsCB.1s<L=\ %E\N \. ц \. P߀ J2~~d|"N`%값 hL F'y,$33oAYՓ+ H06 endstream endobj 255 0 obj << /Length 230 /Filter /FlateDecode >> stream xڥбJ@/L i +PysQ%o镶={[r\/䶷\C#;"L E(JdG)23!_#2C[{GE{ʐ :Z2 fFb֘9e)QSFO?V2C鎾?9ru endstream endobj 256 0 obj << /Length 197 /Filter /FlateDecode >> stream x31ӳP0P0bS3CB.C I$r9yr+r{E=}JJS. @-\. 700& @Y4$)&?H L2A :0Y&q RbbH.C _@|A! HC, !݈I endstream endobj 257 0 obj << /Length 199 /Filter /FlateDecode >> stream xe1 0-wӖZtP*AAAQPPRo7iqpT I( 8{~B&6}\9Ol[L,7@g@GEq;>:@8w^@8@X&as!eV^zH4 6Q25> stream xu1N@E'rai=1IL,  DѶ. (ig?lncQiں'Tl=yE&lk\FZ,6KNZa| 9|t5iûH Jbz<rd'0 (9qp&8 %?cFi=H^Q #t)g/pxLkDυ3zA endstream endobj 259 0 obj << /Length 220 /Filter /FlateDecode >> stream xu=N@ _b%79 H" * D[n&"ymafYy.\O:/wa\gVVOK{Ǵý~~|m]=(k}fϋ kEm&fhF hrá +'2ʉ3q4|PY؁0e齳s5\@e'XreSU4Q~MQd endstream endobj 260 0 obj << /Length 206 /Filter /FlateDecode >> stream xڥϽ 0+->Z+S*AAAѹ}>b$*.bBz:ԥVDJQܣmT;fiTTf3:; :Yc6\;lhkb⍹/N-Z6*p|ZX?4>usn tn N2\KKv endstream endobj 261 0 obj << /Length 205 /Filter /FlateDecode >> stream xڍn1 ]1%o )$n@S ZYG!i _ϲ=gzp;:٨T6{hh.DmyءQvF0`80cf̱b9)zA}T$"'S|_Q((M I +TPGey?4dѸYz1_ S endstream endobj 262 0 obj << /Length 220 /Filter /FlateDecode >> stream xڝ; @ )isJE"b=A aS~] endstream endobj 263 0 obj << /Length 216 /Filter /FlateDecode >> stream xu1N0E*ir ,-D $(VT@Iv(>–)VAaYO??V=ϝz`U6]oX?ݕvⷺ}qE XXͨ̎p[P0LhB M 4ESDiDf( DETHIc %)>/~Œ\r/_})oG endstream endobj 264 0 obj << /Length 164 /Filter /FlateDecode >> stream x31ӳP0P0bSsCB.c3 I$r9yr+q{E=}JJS ]  b<]300? C=`cf ?F%5Ƅ@.N%\=CSt endstream endobj 265 0 obj << /Length 275 /Filter /FlateDecode >> stream xڅ=N@ M_(E"T+*AD \%7!H9Ec{BHLid=RI'tT%=VjIM}h=<|ŕԱh UXiSQy :!1{.g t<A9Nt¿ɽ`n [Y'(3@ ~sPoi5E,b6y0ɬ1$V ٺ[Lz #h&;ij$^MR} ^x?m endstream endobj 266 0 obj << /Length 165 /Filter /FlateDecode >> stream xɱ @ : Y k 7:9utPt>ZpcҘ(@>?1t>C1I0IF*x܂ڡA ʮv@F G` t>'C/fH= b賚'b6l Q"Di endstream endobj 267 0 obj << /Length 137 /Filter /FlateDecode >> stream x31ӳP0P0bCSsCB.cc I$r9yr+s{E=}JJS ]  b<](B` D00 aDHpzrrȧYA endstream endobj 268 0 obj << /Length 168 /Filter /FlateDecode >> stream x1@!&p,`EVJ--4ͣ(-!5W? 9ER?֔$4hqF=`iP(QͤGet>]ń4֚ | f!N^ :^]寸3 lnO(N . k7 endstream endobj 269 0 obj << /Length 217 /Filter /FlateDecode >> stream xڭνn0pH' Q" vP+ċekdUGk?>48^iƏ%Ii?1B4,Ⱦr'd Wwc'/kL8TEk%t:u=|?Q ;DN d~U7 S[v0ؼ?bjv? k1N\*7V*=4#S endstream endobj 270 0 obj << /Length 123 /Filter /FlateDecode >> stream x31ӳP0P0b#S3CB.c3 I$r9yr+q{E=}JJS ]  b<]``? ×0? 'W g endstream endobj 271 0 obj << /Length 161 /Filter /FlateDecode >> stream x31ӳP0C CB.sD"9ɓK?\ĜK(ʥPRTʥ`ȥm`C}?  Yo`*?!*9=g!@d\= endstream endobj 272 0 obj << /Length 159 /Filter /FlateDecode >> stream x1 @бa1[ZYZZ(ZoG 2΢]> stream xڍ1@E #0eV$&ZY+h+{4(- 㲘ڼOϛ$ͦ񄇚1'O6MvV6&U~{I7 ֤rkT dR" "/x"o"x Aā, Ң~~5oU9qNȩ9IR 3,hK` endstream endobj 274 0 obj << /Length 221 /Filter /FlateDecode >> stream xڭбn0bt @Y"QPNt@hycs U.ɺϿm˧ > stream xڵ1 A i832VºSZYZZ(ZXYz#llXZO7荆d/9C;GtVibs0W,lQ9O=l1!洖}N)!0Z2-ygg"(.0P5tŷAUɲ+Y0\%-nYW endstream endobj 276 0 obj << /Length 218 /Filter /FlateDecode >> stream xM1J`b`w.~7hXW0VbZ * vnUra!,ǔK-tgQ ->Gy劲p3%WtpK-Ϗ kxzX 33䎅rCF40@:b #LɂY.dČ 曶AȺ lB{,Zxώ`1K{+orSN~o' endstream endobj 277 0 obj << /Length 160 /Filter /FlateDecode >> stream x31ӳP0P0R5T01P05PH1*26 \.'O.pcs.}0BIQi*Sm` $?` #$`'0   Sd.WO@.] endstream endobj 278 0 obj << /Length 159 /Filter /FlateDecode >> stream x31ӳP0P0R5T01U0TH1*21 (@es<L=\ %E\N \. ц \. `,dF }H<00g?`G"?\=kqt endstream endobj 279 0 obj << /Length 174 /Filter /FlateDecode >> stream x31ӳP0P0bScKCB.1s<L=\ %E\N \. ц \. 7P& eJ``$? @cg@%4*PFF2?F2~~F2?N7 H{ r V endstream endobj 280 0 obj << /Length 195 /Filter /FlateDecode >> stream xuν @ > stream xeαN02D%{pҊ.TD$: &73Ea+RősƂ)eTQS9mr|IJҌ.kk* C秗{˫3Q&l [f۲cvӨh+켍 R PPÛLm55wۃQ?ڋ_"|v։&Ԋ*Z IM ]4O`9kb{0D>7k endstream endobj 282 0 obj << /Length 171 /Filter /FlateDecode >> stream xڍ1 @ aM@ Fp A+ RK EۉG(2E:/u ͧB"IIR9|c#ʅgݺ+Kٕr%:/%!ԕIDeoKhѰj#0#0?Y` ` `]ГnS^yi endstream endobj 283 0 obj << /Length 218 /Filter /FlateDecode >> stream xڥ1n@E?@#\ ^ c)ʅ*q"QQ8%Ŋ2[$r~y.9R3.#OcE_/T_ܙt_?g~)O)'o6`Pv*;k . , UPC< èzDNe{Υ]ɷ~+| 2%E_Iqhҁ x endstream endobj 284 0 obj << /Length 143 /Filter /FlateDecode >> stream x31ӳP0PbSsCB.crAɹ\N\ \@Q.}O_T.}gC.}hCX.O@l``z 灸C??P szrrRZ endstream endobj 285 0 obj << /Length 232 /Filter /FlateDecode >> stream xmN0Kxe' 0Y*E"L vd(~wH`O,+¯.wZt7j='(IB??v7ϭo^x# `0#,yB=:F0A.O= {řs2t 9FtJ:ZTTwHsͪTU!,)b")3t#}wo endstream endobj 286 0 obj << /Length 239 /Filter /FlateDecode >> stream xMбN@ `G"yv~%-a H0u@LбCQn館?I}LeC-c%H00cRbL5hR"&\/d /N^J+Jx#jC(^ Nw6d`NV?1F3:=0+(-aO"{|ldy endstream endobj 287 0 obj << /Length 196 /Filter /FlateDecode >> stream xڕ=@%$p."AL0XF;pJ 87[syc Of|F&di\%8])Hلט6?/#)"*C Ė(\ -p- *XJ  pZZYjW ( 0G(Yb_/*:p^ endstream endobj 288 0 obj << /Length 217 /Filter /FlateDecode >> stream xڭα@4;/@NYYZZ(ښWG#Lq:q5_1xD1 P)> stream xm1N0E'ris v7,eHV ()@&9#L<| Q`ɯ9JrZ\\Q<^ W7(s W+:C-GnB"LdT@.ëGHF316 6P9n\ Pbf4RuYHq_#B}!\0gܜ!TFIAC$yDE}H#A _|o_ endstream endobj 290 0 obj << /Length 187 /Filter /FlateDecode >> stream xڕ1 @49s݄$@Vbz%GHbQgq80 qL) (#r(SjEAjgTzNe*]LG'o:+x*Pd܂H.'oR(@RB)`na \# endstream endobj 291 0 obj << /Length 261 /Filter /FlateDecode >> stream xmбJ@ )yŻgp` ,J--m/Zy/0`0h#eg?|%3Yq-SYc/> stream xڝ 0Eoq(PhP+AAQPQO}i,:IΔܓh4 b֜ 9yЙBf%HYAj͡&5}RłہTr@*MzKE΀N@F x-%08W\g-21鐹WZu2sw[Z,巷EVE\'hbD[ endstream endobj 297 0 obj << /Length 199 /Filter /FlateDecode >> stream xڝO @Bx @ػ@N( rԪEAEAKQt#ps}x4'cZ{RTYpH*}K@ ]6XV /a& +̌Sv47fUEc]~s|lm[sIaU].Gz]H||-scL endstream endobj 298 0 obj << /Length 132 /Filter /FlateDecode >> stream x=ɱ 0  :t AG˛i "~1WOjŊ/|:=PM-_Ul[Q6<*]+a˃.&dR 1YG$ endstream endobj 299 0 obj << /Length 95 /Filter /FlateDecode >> stream x3234R0PbC KCB.K &r9yr+Xr{O_T.}gC.}hCX.Oz 0X [x endstream endobj 300 0 obj << /Length 102 /Filter /FlateDecode >> stream x3234R0PbC cKCB.K 'r9yr+Xr{=}JJS ]  b<]d7`= S/'W " endstream endobj 301 0 obj << /Length 142 /Filter /FlateDecode >> stream x3234R0PP5P0T0TH1*24PASsTr.'~PKW4K)YKE!P EA 30z` pxڂ!Փ+ |-s endstream endobj 302 0 obj << /Length 94 /Filter /FlateDecode >> stream xMɻ@@E|wGb BT(H4]])8+61|cZGHO@BJJ7" endstream endobj 303 0 obj << /Length 91 /Filter /FlateDecode >> stream x313R0B#cS#SCB. D"9ɓK?\ĄKCKW4K)YKE!P E?|\\\KF endstream endobj 304 0 obj << /Length 177 /Filter /FlateDecode >> stream x3532U0P0b 3CB.3 I$r9yr+q{E=}JJS ]*c<]1@  d0%d= u  fh gdՓ+ =ŀ endstream endobj 305 0 obj << /Length 181 /Filter /FlateDecode >> stream xŐ @ A xxUp( vtr'utPtmh} bIbH `sȑ 3xćd|/'Js61Η|܎Ռ#o򌁎ԥ>Ŵ)mPN8J@ Gּ y[ʽVRl"紦 endstream endobj 306 0 obj << /Length 248 /Filter /FlateDecode >> stream xmнj0P6%hHSB;e(Bұd!C_[ǾBNWd,,~r3}iwo;w>ؾt;Ŵ3+mk`> stream xڕѽ @ G0opz'A+AAA>Zѡܙ^2T)dJh-Q6/.w\ehd--gd;z=74b4)bΘ|!T0' 4, L*0V}Uv~ݷ'CdxxJDv5vwԁ?/uҹ |.uB)&) endstream endobj 308 0 obj << /Length 269 /Filter /FlateDecode >> stream xڵJ@!E`8yHE p` A+ T,ɣQ)-[ww"ؙe|SǛN )9?fJEnYJᙶ .rR6L'R۫3H6'@hXkcznL 0>[DPiG Ѩ zCt`:D_drfZjF=c?`.-l[/Ǎ;b?Oy=^F.Dd/Z{ FF\n\3w* g7tMVXv endstream endobj 309 0 obj << /Length 211 /Filter /FlateDecode >> stream xڵ10p lAĉ1D'㤎z@j %Ŕp6# 8CWt4G΀)|4.1!Bv> stream x}ѱ 0ДCpuz_`5ŮDQPQpOS *Rr<.p c4£+(erQep$A/*l> stream x3гP0P0bSS3#CB.SC I$r9yr+r{E=}JJS. @-\. bH700C(`B1P(|Teb P`BPP9J>4 B&!^@\=6 endstream endobj 312 0 obj << /Length 268 /Filter /FlateDecode >> stream xڵJ0) B_`V4* ɃxR(}=ɔai I:S:<&Iso+ +nZT+T|TKQm=b%0V́a͖A;Cz\;Pf3b6~^\`pfg GDؿAGCF_> stream x3337U0P0b3S3#CB.3C I$r9yr+r{E=}JJS. @-\. ? t 0 lPoՓ+ _* endstream endobj 314 0 obj << /Length 106 /Filter /FlateDecode >> stream x3633V0Pc3#CB.#3 I$r9yr+q{E=}JJS ]  b<]?``o7drzrra endstream endobj 315 0 obj << /Length 170 /Filter /FlateDecode >> stream x1 @БbVj(2n6)F#9fÄ4᭤̇1lT+VI9_b1aIJr&S2"/:wԍ_OS#hG1;XD级[e endstream endobj 316 0 obj << /Length 266 /Filter /FlateDecode >> stream x];N0RDb}RneHJ$@P'b;NA(s#L`$ɏ؞ln]*[gv~ԅGԜ]1g큳-8ڛ\otdd<KKMKMa; .0. >>N w&`>koFc7$կHo8={jp?53j~ M7wנuI}Ri"ӡ|V ! endstream endobj 317 0 obj << /Length 144 /Filter /FlateDecode >> stream x353P0P0bS#3#CB. HrW0r{*r;8+r(D*ry(2`o^$3^L 0H9$Lց d Brzrr3nX endstream endobj 318 0 obj << /Length 252 /Filter /FlateDecode >> stream x}j1 . Wo;OZXB{ -= Jt(ڄ$btUd5"|D~8k '9s|)e(gg5JҺ1*/G)g*G=Cl-[VҚCZ 7=+q,A wTÀ&u4-U(qhK$)n;%<.<2!WxS endstream endobj 319 0 obj << /Length 250 /Filter /FlateDecode >> stream x]ѱJ@ )O`y),DPN:NEn}$!Grq63ͦXYbl1c7ƞ?ж7#zm)~zw{ix7!pu\ĵ khì>RQ|jbJg1T9XN`1,*/rpnLXb95#OSZʜ> stream xڵn01D%8AMPH@fN S(y (96c-ٟ"3(҄lFV@$Chw:;4ˏhSbM7 -oʼ.+aWy!a paN8(e~NHb+[&|EGMl#K!e_<۾zzP<vOlgԬEWGWWO} endstream endobj 321 0 obj << /Length 175 /Filter /FlateDecode >> stream x333T0P0bS33#CB.S# I$r9yr+q{E=}JJS ]  b<]J쁢 ??0BC0eB} B1PG@\ٹ+ ` (V9(P$ endstream endobj 322 0 obj << /Length 230 /Filter /FlateDecode >> stream xڝ @ azyZںfNSu *꬏#x ~iHwfC} /.~?A .Dh~f q+vX+%H cȇ\'izhIi|Ӵ&:/?ռw~R2}6rӿC991uΪ9ɿ66-M쩥]e'(,G%Vɕb0` Ox1 endstream endobj 323 0 obj << /Length 266 /Filter /FlateDecode >> stream xeϽJ@HMګ̾rw y),J--Gˣ#݂ˍ39TWEn0 *L2~5,'itvck]pXgͥy}y{:ۚ[t 6vZ5'@O6a&~`QLɤ䀄hADDND(An%=٨X }d*;Ad|HףMH+>o ߄k endstream endobj 324 0 obj << /Length 158 /Filter /FlateDecode >> stream x3332W0P0b3#J1*2" \.'O.pS .}(BIQi*S!BA,0`0?do `L3c ` }L3 D3@hQ'bDc&@ endstream endobj 325 0 obj << /Length 207 /Filter /FlateDecode >> stream xJ@?Py &^!`B=PBcAE[|4cZ/9avgaϮffzR}\^ 3f/U#n>wX\o;qbLk]Γ4І~,O~=[yR+>ɟ:ᑸgF#bn8&kufY f0AjekQ~uI endstream endobj 326 0 obj << /Length 262 /Filter /FlateDecode >> stream xmбJAYiSݻ ^!he!B@-s >=`y֙]T;3 etd3zJ 킇Y<:G}GvǨkx|FS2oȹ qĕ+yD>8c8c\4{`*n;5[F6UEJ8YHrg@s/>p뭃Xl7i$S>~w_Wiuqyؤom endstream endobj 327 0 obj << /Length 321 /Filter /FlateDecode >> stream xuK0+a;h;{A'a,7V4Nz|H&">NN1b\D8!/2Ih2IY.S`e^ Wg`w2]5(kv?=k@@# sG0qТ崖8n֩vI벒<=~ULlab[3'qݧe*&!R3- -*C7. )E{sܥ ). %sc^ CaĚh_eӯ0H:}󦃬\4e~8qC㠡vg穼 endstream endobj 328 0 obj << /Length 294 /Filter /FlateDecode >> stream x]AK0+^= O`, Ƀzh(=P|It'RVۥ~/Nي/OiTm[UEs?T֥*Y5["v?p=w,~F&rX Bv{[.*:ob}LƔ= ihO[ z<;=J> P/%jBE_R.T, yƞ 3 tiԃf endstream endobj 329 0 obj << /Length 251 /Filter /FlateDecode >> stream x1K@-f݀,b?B_T|ÿ%t_ endstream endobj 330 0 obj << /Length 232 /Filter /FlateDecode >> stream xڅбJA᳤&m:81+[bAPFGGsϚ])~.Sdz͵]L ]e-V祸*חgqs-ĭ^V>ضY2@Y=ޓ_h1|> stream xmο@/, ShuqZZ(ښ<$y<–!q,䎁 1v<qƖ혭᭡ٌcfiNmFzƤw>;Ռ 9ξ(35 !+PLpW.Pe@"Qmڢ i"1Ŕ"?OVHnqLUOUo*D6i|UԴiMעL endstream endobj 332 0 obj << /Length 210 /Filter /FlateDecode >> stream xڽн @ B>Bzm=(vtr'utPvIK: #=vDzAmHJ]t9UgnHbR2pĻ~E;G3=hNa1/kFˈ܉Slx`p:FlTveV`9zTbr^MRV R':q@&x endstream endobj 333 0 obj << /Length 193 /Filter /FlateDecode >> stream xڝ1 @E00Mntft` A+ RK E;19%Gu`ak?r}YЁ2+bvM6{*+K,Ȥr>bCz+險1CD(p.ܐ lQ4C!i(]W!pE#k%7)%c\_p0T78> endstream endobj 334 0 obj << /Length 210 /Filter /FlateDecode >> stream xڽ= @ )sĬSZYZZDo7hB\gwJ)|浂F3"$;ԎhbR0 9IbcɄE:ŐdH 5:Pi=uek=BЫjn_t+k-JffLWn噞\y U;3ygz? endstream endobj 335 0 obj << /Length 204 /Filter /FlateDecode >> stream xuο 0/t(`_@轀:YAAAMj-#8viQp0?K|6隌Nc8Sje57 N-鉌IS>N[ِ҃ / '+*F PWR7HU8##;o\]>K-AZ//>L^T^('N"nhAUhwdZ#=d# r!I endstream endobj 336 0 obj << /Length 143 /Filter /FlateDecode >> stream x3233V0P0bcc3CB.c1s< =\ %E\N @QhX.O ?00``?<3c:f 1%P}Pszrr_ endstream endobj 337 0 obj << /Length 261 /Filter /FlateDecode >> stream xڕ=N0_4>B|ȏ宴,)@T@IF(' 9e kb (H/˛tG}wȣ]>n~ndKuETgK՟秗{V'fӍk^".ٷtD\0_f+`Gt~΀~ܡLcxc㠤2%Ii(ئ4rB8F+ OƬܫ>Q=9'|V)X,i/ mh endstream endobj 338 0 obj << /Length 165 /Filter /FlateDecode >> stream x3532T0P0b 3cCB.S I$r9yr+r{E=}JJS ]ry(0`$;dt"H @҆ 3g`D\$3ؑr y endstream endobj 339 0 obj << /Length 124 /Filter /FlateDecode >> stream x3234R0Pc#3CCB.CK I$r9yr+Zr{E=}JJS|hCX.O  P001aqzrrHT endstream endobj 340 0 obj << /Length 150 /Filter /FlateDecode >> stream x3233V0P5Q5T02P03TH1*2 (Xs<=\ %E\N \. ц \.   P( ulj3cP\=v9E endstream endobj 341 0 obj << /Length 213 /Filter /FlateDecode >> stream xڽJ@`_@> stream x3234R0Pcc3cCB.#rAɹ\N\ F\@Q.}O_T.}gC.}hCX.O a0\=W endstream endobj 343 0 obj << /Length 186 /Filter /FlateDecode >> stream xб 0  Ej3:9::( NGˣ:4qqé8Hķ)tJRWI8^0(v$kgfAuFX lYhFAQJ*˂Yu*>P'sx'`‚ʷs3 endstream endobj 344 0 obj << /Length 154 /Filter /FlateDecode >> stream x3532T0P0b CB.S I$r9yr+r{E=}JJS ]ry(0` iH~`~ ?3 !d; \\\ep endstream endobj 345 0 obj << /Length 188 /Filter /FlateDecode >> stream xڍ1 ` _qVdV8h֣;5I䅼Dq><Y>X:SwN'Js2c2 K^nG2jƖL[H5pG %BxʃAxNӃX:>ŴI=JRh4 V\_螡yNkPM endstream endobj 346 0 obj << /Length 208 /Filter /FlateDecode >> stream xڭ1 @YR &] F0X`er%GH!u6 Z+ٿȧ>u!)P)N}fQrIJr2xޡc PƴSkLbF{z`)3Apڀ\A4ikh+/;Ň/׊y.L[ov3_nBk/cC:՘M$;| endstream endobj 347 0 obj << /Length 145 /Filter /FlateDecode >> stream x3634S0P0bccCB.c4H$r9yr+p{E=}JJS ]  b<]?~x?̟0~g 0cH`3szrrM[ endstream endobj 348 0 obj << /Length 203 /Filter /FlateDecode >> stream x-AjP?d70sBtB[ܙʷyŷqRq,Q^i4d6Wd4&S/y&3[ْYqgc$Ovw x 4tHB8tmԨuUupAD#r&iNBKZӚ.8W endstream endobj 349 0 obj << /Length 151 /Filter /FlateDecode >> stream x3634S0P0R5T06P05SH1*22 \.'O.p#s.}0BIQi*S!BA,Vl+313C1#T8fq{v r wSM6 endstream endobj 350 0 obj << /Length 160 /Filter /FlateDecode >> stream x3532T0P0R5T0P01PH1*21 (Bds<LL=\ %E\N @B4РX.O `G%00a`f$Н l0A?? $@?P'W rjy endstream endobj 351 0 obj << /Length 193 /Filter /FlateDecode >> stream x]= @YB\@71JL!he!B@- 19%GHi|{ G.?'T>.o=(D"壜q2|ݣ-䡜К6N(]9' {6*};:fViucfU)1[m?6*q_D endstream endobj 352 0 obj << /Length 248 /Filter /FlateDecode >> stream xmϱJP? Ĝ{j@`N"QPQpNP|d63|p?=.%ww =Qjx>礯85eM:{SNH:asCºXWU<&.*;d (Faы> stream xMαJA?lq0lk!< 8B*ERKHzh(ufL4/Y_Ttz%RKxMGnܓtu|9}ۼ> stream x]J@; x%'S~\#^/4Iq1w-}<9&{@ 7lz P@?[VqtPA8.=փdFDb+8w:+cw9<<#Oʬj\ԯR*ٕmm`giM?AP endstream endobj 355 0 obj << /Length 199 /Filter /FlateDecode >> stream x5= 1oI!Ls5"Z-n!he!Vjih9e`i!0 #vܗ|Ltԇ&% {Ov!d%_/#j9osv;*g7  $Oy $m}RK ****IQ $ Q&2JuWk D$_h^Қ8.G endstream endobj 356 0 obj << /Length 191 /Filter /FlateDecode >> stream xڽ1 @EL2͚DL!he!Vjih'(9B -)fsofyH0d@iNjő!5T>'.&Ien(@*/SC^^$N-8b,(p OA-iU۹*m_ ڰ^!c9- @m endstream endobj 357 0 obj << /Length 126 /Filter /FlateDecode >> stream x313R0Pbc 3CCB.#K I$r9yr+Yr{E=}JJS|hCX.O @@\ <yP\=sU endstream endobj 358 0 obj << /Length 242 /Filter /FlateDecode >> stream xuJ@% f$,ăSZYHV2u@J&llDmwjR_@> ; l?hٝv* ؄'!nE5i>p {Nhd42FJgaZtEjZ!'Ēh } lV~hp endstream endobj 359 0 obj << /Length 246 /Filter /FlateDecode >> stream xuN@ ed!/kBR$2 щ1c<==B ULp?77K%5ZGo?nY'[,vxK톞U/m#yTLP%d'd`ofAِ'~VN\'(uˈn(Eu,_ڡgŨxqGc/VJs5M#1%-~nn endstream endobj 360 0 obj << /Length 185 /Filter /FlateDecode >> stream xڕϱ @ BP:w> stream xڥбj@ @_ 4z|k:ŐPdc! (= t:IÄS~¹ӑB)fgW)NnxfOnk醪9 mvarU();'Q/$C 3!`.z7l(ki?n!a먠luAIu2θ ҫq42BT]E endstream endobj 362 0 obj << /Length 249 /Filter /FlateDecode >> stream xuϱJ@?LᾀSZY mr| 3J duM/|HհXhS-7YwkH~Ͳݍ~}~JR>Z=x~]賑ix o@ʺ\ur'x; endstream endobj 363 0 obj << /Length 202 /Filter /FlateDecode >> stream xڕ; @A  M QL!he!9ZGHB;RXW?#l hS+z*ߛņBQK'jF;LA0Ӫ]WCȋz&\e (t XLݷ!)&e~R27ukd1y ]msXp endstream endobj 364 0 obj << /Length 277 /Filter /FlateDecode >> stream x]J@EoH$j),J-- ɧͧ']ͪ x}|)TrBf1^զUٽʮYVY{#/*^J<?v+'@-0#" |'İ+Y X9"1fm)ӎz+~x/ȇ3FY g,ڏ@'DV{:RRh4zQc;uD*` "Ah^ᰥKp[Vݩoqg endstream endobj 365 0 obj << /Length 252 /Filter /FlateDecode >> stream xu1J@?f. ]@lbځuSZY,Vj)h+ Bn+oayTg+ιW?Be9 e\֔]6e?R>炲 o 0@:)vr"yĂILiNיvFoi􇐃 `%<)ơYto%SK u+P ˴N2(vGU*DF I2v: endstream endobj 370 0 obj << /Length 136 /Filter /FlateDecode >> stream x323P0PP5T02P04PH1*24(YBs< =\ %E\N @QhX.O9   fv6> $'W  ' endstream endobj 371 0 obj << /Length 95 /Filter /FlateDecode >> stream x323P0PaCKCCB. \.'O.p KLz*r;8+r(D*ry(177? 'W  endstream endobj 372 0 obj << /Length 257 /Filter /FlateDecode >> stream xuбj0d=A-pHRB;u(@19G#d`d |' 󟖋;}O5\RQ`ȻO}c~[zIc%a,D!Q$mbG2bWh*^jL/.i AjS]3}`qd;<z<ĠuH> stream xڥѽ 0ةP+AAAѹ}> stream xڅѽ 0+n/ t N&X؏+blkqRv= (+%66l8T(ԏPL]jFyb8QbL51|=3;*X(mu }6f\-~ͽ xTk݋6o]ÖoW1\9_?D߭k endstream endobj 375 0 obj << /Length 280 /Filter /FlateDecode >> stream xڽn@ Ǎ2 y/D%dCJS کC!Q&<#02\M90qwYSL)ݭ(K(3SR7n oN>f3?_h/{B@J lF3@.!-@A> Aވݜ*PB QAo"|s Fà \Ji oץ%Ocj{:T~LpaE `M5(QlWq2 endstream endobj 376 0 obj << /Length 289 /Filter /FlateDecode >> stream xe;N@rai=`;qѰR.@T@I.J|7a҈$Ci>˳؝I}^M iI/y78K6'of֘)nb-}~|bvwE)XQd9!a"[d72EW:,wX=0;rؙnW-WzUR,k9M<Iz:HxDLՐc|c=1;2؉^]Aĺ7_lo'kH;tۀ_"=\lhsoW endstream endobj 377 0 obj << /Length 280 /Filter /FlateDecode >> stream xuAK0W +<4œ`Z>J](6 SR+4)U%]\KwWfp֠zyTUsG_fk*Q$͜sP/r2 ~rFX cu jY1&ANdZ0#0@c+/=lDmGg&FK? vGcp8 h¬Xemۤ6P!!cx=K-{ endstream endobj 378 0 obj << /Length 229 /Filter /FlateDecode >> stream xuϱJAba yh+RPK E;1 tƽpS|?;?xžjs3TC=-r+SrgkkrKyrM͒a{ծlB-`a:`u)xuwGW2&e˯ɦnh huaǨk} [ bԪob"EzONoɌla endstream endobj 379 0 obj << /Length 213 /Filter /FlateDecode >> stream xѱ 0; 4X-P vtr'uTt7)7&/“ h4"rMӘzd endstream endobj 380 0 obj << /Length 203 /Filter /FlateDecode >> stream xڝ 0OKдv vtrAPGAEA0G#8:ANȹ-Lp;"dJ Z_V[UglJ#IWc>NҽIs-0pu@܀_x vZհu/{#ҡ^EA^UzN4 E A2;Wa V4'VhLr endstream endobj 381 0 obj << /Length 212 /Filter /FlateDecode >> stream xڽϱ0$7 x/$N$ &:9'utf,ƣ Fp $K8q b~bNe/DF4AFGi[?2%72byg6Nh:]hBQ֩L)϶?$nId[XmFiǞzՊuA63` ^j endstream endobj 382 0 obj << /Length 210 /Filter /FlateDecode >> stream xu1j0g<7 41'z(S$ MHXGQ|JW\(T 7uN3uki1}.Gq%Cf&u#U])Yϧz\R׹fi WOp_PI! I@*#f%#~,K{ǏT#,ΰq`(nYsLޖF^V2 endstream endobj 383 0 obj << /Length 167 /Filter /FlateDecode >> stream xα @ ;:'zx: 7:9: *:{G;s]!3pck8YǸh PsNA^/r9E l BuL[VeTɎdÞ@`_wV| 䈚 oafaosK endstream endobj 384 0 obj << /Length 220 /Filter /FlateDecode >> stream x1@`CW ,I0Q ne!V*Z'7J+)Shfe=1fOA2∇n'MxӞ#슓U|<)dg9P1csK^4Ї g Z7-Vj]p azկTP)*ܨF7́ ,a 0@ A/vP`iCiyA_ endstream endobj 385 0 obj << /Length 110 /Filter /FlateDecode >> stream x323P0P0b#S3KCB.#C I$r9yr+r{E=}JJS. @-\. ? C 1cqzrrp^ endstream endobj 386 0 obj << /Length 203 /Filter /FlateDecode >> stream x=@H\@ȜM B0X({+ba8垫|>2Pԏ~?Ѥ$|@jRRod5Ԍ;*gX@l$u8lSyEȞn!X#xiTCƩFHjODO'0vBJ#n $"&ݏ endstream endobj 387 0 obj << /Length 159 /Filter /FlateDecode >> stream x3534W0P0bSCCB. HrW01r{*r;8+r(D*ry(0a@R` `$@z ɀ a/ m?C&\=?qjS endstream endobj 388 0 obj << /Length 209 /Filter /FlateDecode >> stream xڝ= @GR2MtbSZYZZ(ډr2EH|((v̛ݝGa_ endstream endobj 389 0 obj << /Length 144 /Filter /FlateDecode >> stream x36׳4R0P0a3CB.c HrW06r{*r;8+r(D*ry(0`?l(g?6g u@lC{ pP endstream endobj 390 0 obj << /Length 213 /Filter /FlateDecode >> stream xMͱN@б\DTd""R.HE) h!kfg:[\ꗺXS)Ks"Z;׌oY2=7Ro0ͬ&a8YZi4 %:1X[z83L̺E[y!8}?+O2dWtm8 \\ղuY endstream endobj 391 0 obj << /Length 160 /Filter /FlateDecode >> stream x36׳4R0P0R5T06V03TH1*26PA3#Lr.'~PKW4K)YKE!P Ea9$luPفX$N#Ccagc{  00?r Jm endstream endobj 392 0 obj << /Length 207 /Filter /FlateDecode >> stream xڽ P FҡмVn?`A'qRGE7f}>BŚނ*3$|9VuQۀ}+5͞1%kTڤ|18Ux*%V738 \A&rOP deyܿ>X ?c\%#'q(IfNĴ) endstream endobj 393 0 obj << /Length 259 /Filter /FlateDecode >> stream x]J@Of!"." E0pA.Z v |˝gH0??pNNmnҮwYUϹ勧7wk"nssa q[{_AꭅBaD4%;>#p{%*édlW]HO˷df 3ÂױtK҇FoMfl=o,"E"pLΉ~WhFF*4& !3DWZnvj endstream endobj 394 0 obj << /Length 257 /Filter /FlateDecode >> stream xmJ0'y h[ 'i((ysƙ$;dfjj5u=5mMrPٿf~jg6wW`G*`Z@y`5@N08F  xP f͡HmVJ[\8 )qYTN KJ8L3#ęgDUk-2gB8&%1Dw>vq endstream endobj 395 0 obj << /Length 206 /Filter /FlateDecode >> stream xڥj@@CkB  A GAẸMb/hffӱZ'd?$u{<l(潽x3\h*fTK> stream x31V0P04F f& )\\@ IrW0 s{*r;8+r(D*ry(0~` C@L. \\\[^ endstream endobj 400 0 obj << /Length 382 /Filter /FlateDecode >> stream xڝ1N0D,yJȀb J(> U)",eUM~VJ^R, bm~|}gOvc;^|}~|p#$˷YU[LU7KeYF-1zVt qV9-Ti̬jcDG:U#F)R]"X )h[7(RfRd Vi%(E:8A}$](E7URhw.BL^dx')z TT2%AaΕ[Q/a`D a¢jBLx5 J%aQ4>TɨW;N˹IA 0!@Cn+~?]T endstream endobj 401 0 obj << /Length 402 /Filter /FlateDecode >> stream xՔN@l6< 5wy&RheaBh< @9aY]H$;;3;y~ә볍γ-ݙ~իowFߛqEJVW_~xVB*=\g:Ի@]V}JU! endstream endobj 402 0 obj << /Length 291 /Filter /FlateDecode >> stream xԱj0` [D% I PhS1CB;'G#x_"||2i=iY[{j]L~hڐn3?z_Ӣ!"8;Ly_ORԤVFzf%p3{xc6FrcUCag{i@]yC7xۣ伐G ]5 C@(8&cq*?uNj $@셼*b2@5BqچApK t/Tゖ7L? endstream endobj 403 0 obj << /Length 359 /Filter /FlateDecode >> stream x}ԱN@%$pkH3D+ cYZh{2s#`,;, kV֞sU[2~sSO/zݳƼ} bfA,bJ(Dz"c|LR)4$cTOb\ Q%4"g:ZPT0LقW,b* |@ch'>1)Ojda& endstream endobj 404 0 obj << /Length 228 /Filter /FlateDecode >> stream x34037T0P0bK J1*4" \.'O.pK#.}(BIQi*S!B4ИX.OP0$$$6H#Xp63XP- e4CHlFP6Bzl{#? p{ְEsvx: [!)3?6|@b@1 neK6"Igszrr endstream endobj 405 0 obj << /Length 308 /Filter /FlateDecode >> stream xڥ1N@gCA2 G`.@lI|&Rhea|x <Ć0̲ϼDmd`ggCګT״}Iz>\|ʼn|Ƣ=,VgGTaˊ+lvuLC! xr~`]T VIm o0/m+H-8٠HŴ̃%'b eA lR(~ FYtG%4xڂ~V *L ^TjCyĺ=LKg 9鏀-uO endstream endobj 406 0 obj << /Length 274 /Filter /FlateDecode >> stream xڽ1N0E"4>BHح,-D $(PR%>Z#l"WAg}{+nǚ^يXq{NiQy͖K9TꞺ=(te!LJBzpLa'=0s EsB5qgZoVVPJ}!J,D;'^Ezdg|F WѮ9!!9&g1#&$| 3fkj`GsA?M[ũt }gz endstream endobj 407 0 obj << /Length 275 /Filter /FlateDecode >> stream xڍj0 e2hCI PhS۱CCZJf endstream endobj 408 0 obj << /Length 191 /Filter /FlateDecode >> stream x313V0P0bS CCCB.SJrW05 s{*r;8+. ц \. @H2j1TH1P(y8gJ1R `JL1Нg|lG'W  endstream endobj 409 0 obj << /Length 369 /Filter /FlateDecode >> stream xڭN0/K~H*J#HHd@uFL x?GVn*Pb;]V-YsZx]XDsV4a]4ÍzxR-DQ nŰQhk$"THtPpA|ANmCb=\I*WEI?AFc.gTET{H~?d&>CKF (,@aR7C;aʀ a Gi11X"bW t>XV MNq2вI3 :f=>;3 s\raj.YI]l!fq5; „sp endstream endobj 410 0 obj << /Length 146 /Filter /FlateDecode >> stream x31V0P0bcKCCCB.cb%r9yr+p{=}JJS|hCX.O ?D PB1X/y`i؁A0za?J.WO@.3 endstream endobj 411 0 obj << /Length 286 /Filter /FlateDecode >> stream xAJP. :'{ U,]W҅b/xGR!d̼y$ L'Ci$%!, aJE:ۑ>NAO"j$Jj/XS:Q3j4~7N${%u,JXR7Աn()nͻy#_%\7 vP endstream endobj 412 0 obj << /Length 111 /Filter /FlateDecode >> stream x31V0P0aCCB.cSJrW06 s{*r;8+r(D*ry(0o`&A(1` r .s endstream endobj 413 0 obj << /Length 198 /Filter /FlateDecode >> stream xұ @ ДBE j;:9: * nS:vc!K.!K| %)E!֒639-ij)UT US*]@cfWl:%uW+~Ž> stream xڽN0utKʼnnJ+ &T9}>Jc(;۲,Ȑ|>.Uu(Gko+.h+u #4Ox?wh6tRdD gft: sQģ_zm>rU"Q-Ø whJ"5v[\nil4r?:XTG2oJI~E⁦$lt?,m/p{" endstream endobj 415 0 obj << /Length 285 /Filter /FlateDecode >> stream xҽN0`W"GȽrON" & ㊁GiŏCgmfȈb}E)^yEd^Mqz`V|IƮ,on>f>A@BN j]D;hH Q1Q󍊶e7F8XxiVWE} ?r^ ;jfԠӪUX{#[t屿-YպvZmc|y'˿ \p [a endstream endobj 416 0 obj << /Length 184 /Filter /FlateDecode >> stream xѽ 0-y'06 ftr'uTܚGQ;祝\݃~ +0.0xH:: eOPZPwA%ޮ#r5 )&;3D"Z*rLD^cj&Uؑˈ^t;;jUxa|t-?>W`na o? endstream endobj 417 0 obj << /Length 195 /Filter /FlateDecode >> stream x= @ )2(I#XQr)uv! jc_13{b-lHlH\J@2$]kH)F1!AtG "Ù`*Coz_kjSӵrgFOT&.Y<,I(d&t^Pkԏ-b0P0+f endstream endobj 418 0 obj << /Length 375 /Filter /FlateDecode >> stream xڍҽN0:TG_%tR$2 Ā[dc%oO"]\LK}ɽ(@"6 Ub)TelΣVN֎X%ҲFV8!TZ^՞j#{)'F2N4jvQWQڱ/";6lC4*f}X `aUca7Pl*L5L> stream xuJ@/PKa ېZ=yOуQ9z(;34 !&٦h}Wn.}5}Z*Yʃwpv)w3[Xx= f8 wȎp{.]z; `ǃd',+JvdEΕ,r֌*E,rvfqKv9frl'5tjmjmnҦEBgOewEj1nzz?ݼ endstream endobj 423 0 obj << /Length1 1441 /Length2 6590 /Length3 0 /Length 7574 /Filter /FlateDecode >> stream xڍwT6 "ED:COBW 5@P^HS( "ERJT_,{}]+gfyf7\췍0u$+KU ` ," LXz #PAàXN"KC$`0,7B}N@=!6T(4%ǑTPPuyvtzp!xd]X4+!.@_8h>0'ϒPO؟҄\@W8a@C`p.'h 4@?A@p/g#E.@g h+ @@PWP!O}G4a?k ;f5 b?Sasi;[r#"^0-? o KJHa^@+&(/#WCp :ʀÝa hoXp)  tGǩaοe\p?G?0'$_-h)_Fee0PPD((,B@ "qnC_-33|qw>HgBx Q7ӭb`G_.?23Re POX!qÀo9ޞmBq㠄pQZ"*c~0po֛88vbp^`pS莻F08n6A1jO框pD:>a1q pIb@nL`~  !X Ws0l$S[ %A @_5K4h\o׍SHG{n~T+1 mg.%-&L+;QXj5~fUQ*'K|6h4+n:˜ug5_U|fq׎Y8Iײz{G@/I|kp(ֿӨrx7#rzD [If?jA-"BϨ4jGRly zd]{ګ*@P7UdzSYxTh,hA+ ȕZxpr0/v}zޤc?r7klQ͚ kvbZXO5_ W]x!녽|I:[%Ihl4fF6S/j`۶JyinkBxL9*~tK+|,M,EӵPbG)*\D6LEvzڷp`Bq}ؗ?{sf+cfĿ(t:1g03ihmhi&~YK@ȏKG3-jq;ǏlShh3(aG8tPtRn-:*W[.M 16 E^ =+zz:CVO} f@L8X'egVM7"D3d0뮜tcK7ibCeBu/ꂜ< FXknEͯsɗE+ƈE3f.ݔ]F Ԓ<"3VmHavOVQG l[݊',Sa4^췌VHQgRK٣wPR%w7 ju-9'WY#7Un oETh3[ nd`=&ggrFX 9gԄҤp⛵rfףj^VIрZ{<kަv7@mxP n0H~X̝+ :S?<1ӽ7pS_rXp=A1-z+E>2Uݐ\ coRm`\M p2LllMHOivPۊ>)y@J xv±_ 2fc"CRIy%+-/ Ml}]#dx8GwȄV'bsɮxju*5&1+u@+*=573\Hd(¤&L|T\'( tto)}'hKRi&W0%2i2ҶjUp1!bSpB#Lꙙ?>rR^]Q+;=^1^4@X ix=k!k5/OknŎ7N޸J1Q[EŸpdUƻ=OYu8 ! j's>g)PtO%D|>BϑVY 7}=Q2m!rcaX.>(feP a8cHO jM橡͟/YQ=vo{ђכ^B3nVqήHwZ:iH8`dV ʝrbdsIO/9N2˙!#I *O&ϯ~z>HC%Nթ44go& "ǿwaS.q&{ʫӉ+9QnH~xHx^8iqfͲ5-2 VSed{5P]\ ^/]$(}\Ծ8} ut kWFvmD;l TzusG[\* D*S#'itxeU ⚲sCT;~6*)eԔdT3l*F& RkpHnU-Q5Eh[v]W,â)_[=4[7.Su{90GySݘfEZdL?=oI~=J$W=\5BY%8yvmMEWyeՏl/qpKP?TbkZ*H1h WFU訯uY]|#-!<b%:F&ϜVGR=|KXR:5fIX q&VpjiHƐeU[2W>ޭnT˹Ca2Sz8(" dyI1M5XYcfq$b|^*JMw 7oN͑<9[N`=D~M\#~db#BӮH[U56 !]-tWÊz]uf/ed-/Gt>o'oBw?eVzWXQ΂`$Vձn]UP1zʱ~k6?IѸ$Hr_Ӛ6X eTAU7t0mۦ(h+NRu}]DxMY&kZzqxYt =ꦎ[r⌽DDXÒ'kIJǩ9-WKYe( 5>ݽ I%aFqGrƸ,U\"mx *&ZXiƾCgLXhɑpwc^WSdir~ŭ=Dqڭ]&SWHD)?&_znJacqh7%IH{_VT^$%2[=WM 4jw+!zKe@Y BBڹ&(~%EUŗ>#;ӐÇFr?Խ!:>mwv? e!>Ж+u'ҝ,0'ij"Q+^F}~r9> 4W[l8fW4)J[2w+rPvpCMlM?Q`~Dw"= *"-,D#ƒt=xPgkѨ-4iy ㍂5( , X`䊡}oe狡c#\SSƏu-|a/z'?R Xlr37酻ϽŞ(ƐQzr؊>ޗ~+\6t »b`ER^D,aXZI6SFb_.FA:N?p8~]5!-/TNi[ {}_#Hfӯ# ]Kx=F=0gy\³b?TiObLM>Yx)uU,?I{U|V2bAckT` ~0)p P+ Wnc_8H+<1H_ECc wjEl} K97(uVU  ؈^3"Oi]p|h))A^>+DC}HfGBUԞ=8Y욈IMyg (`O^Jm`fr[}@%Toqh些j}/{NAhج%TK 1>\&eԺjZ+%.fRqB]{B4qTig5Vo GH\W:;jy TyfvD|lapH kEwNe.VneN^7m.{~%Zox 7Sg(lM12/5׫Qd8_ikIecfѓg ] `^a[=b:ۜNEv$lhz͉M7hkgcx2( e){?pm[ќN= > stream xڍtT6-! 0t%H3 Cw#!"]  ҡt %HJċq}5kg?{~ae3wہU0$/O@m ⲲAP_awyӆPPI $E#$J /@=pYn3-ow+ 3D{`!DI{{{\='N7 0{^`: WpYF?! BwbyyxCu-{7 z v]@0_ *Z|H$sEA=w / #P [=@+-+ᮮ`W~J}t1 qo {ՕR `N`$@D@@@LBv}7u6wwE!?\Dx;\ GN`?# > ;~^Y&&To+,Ln0z 4:5+c;ҁߩ -D>ov)W;!O(0\!P߿;z"@~7 6Vu$naN_#CvЃ nkʠXxZ_Ѳ|txI |79!89'eH I*7_|z1HУʜx`_a3CbڿdgƧI!MjAk``!YK)o A0U7đ k6[[NM]IL9o4s_{yç@RnYZ'o E¼d3 Z)XϜW&(R?%5pX@\uvO$? i7UmέgTBʶQYO $KՂ'++}RVDf~vOWZ\HT7'3nև)GvI:lz`M78QH,IAH^n|˳N;]#/F׆DBSm/y*ԕXKf5ffJ:ބȑ?9i{΁r?Sytf &?nh Q:W?C+-KR"d6ՐGK9coc{dMv0} Qg*&JuYˑdHl|XaYD:C63T%%8#Wyc>W4/b լSiӣZ(5/WK9#aoaJO&f0 R.`!b'Z' ÜUB@Vua%2tmONMҤ"PvfRIKaP} ח6 o6t=P<;Vyub&Kʭ7odle2l1-[}tGj(sRMMOƊ(ujS_J {zV%7u-l[}EֳaG-DP[B;L@eڔy' IzZј&߂&~v OEstQ&ϪDXX?._7R,[QnO{4Y42yr5Ǘ)fp ݋֮ʏd_|Wt.le՝?zn(`QH g2|ET"(`"losU$S>cOYnQrֹ_%<kyOaB_1i|wk0,t]c}uib^WAR*Ig`$<tIb|YTsG0&8(3.# 54;`6 3Skڛ!k? r i|3W GTͯ-]_߾W !V\bАc̘($*~3LX0웇P~)7 &o$/ЬЋ^A/oh9KJG&1DGFz'^O<)n7s`TOIPj3T#ڒkԏxM i+ =WZoqu6w[HbNhLA`8>q.n2E\}NgTSCˇrL*˗*Fv?'>r@s*7+&3&?[~ ) ^I4R<z8<͂%c߫,V,9EGe[RX*&aKq Fk$Jko >e Zl}}vtnd=P TpCEı˥PW+B;iZYD=++rYyq{:`jJgZEnLFWRbn>Tf+֋"U dĴy6 Mg_B8CHF |G{LG2R<~u|>aDS}TĦ@ὉgKzߓ9&+f gn^9tQə3e|',dF3JEeALeNDqPK,xؗR_Kn^wEM|p+ }$ݣtj"mV.V2!އQ`LBB-gz; Ѩ춫;9 I>޴9,tlP? A}ZȞ] ۢu&ݗy$M;T_VYwШpU,@$lZNlmË YK6Ȝڱ@d]t욹[jfhĝ͘E]+kMųˠ .#Yn3,8źZ`9k'A:?BO,el`Zxr?סT_?~e=|V {Tl\C쵲~P8%*Nst3_Bl~X~Ej';ͨOaglng~Cl܁wzh"MK#q#!~@SPV%_W;nǡ^?2p6 ~Ue&ZоLGw>B1SMfGS:y2>[W15 Yy+LmNablUI tW s<Q' ~Nj^~ ±W5KWX]{s 7A1fz~wN>d<HTUPI +QRKW*NH=UWKǩiYV5qMYdvi5<~=͕4e?]#g ئm+҆UM?jbR[*F8T/l 5!7#{x`s[oսZE`j2b|!w"M%IJ3[@}:W&mQ-9Ua8g[ԻC{TN$א5.rI}^ WP$5l^iyoc#RI45P$TK 2H =y}$Tv-nhF[   О1^ςMܯ#)jz 윟U˨\6oL0 09,};:zx&}ruϬ V4!X3{"g (- 3 Cč/HgZ>9"E/@kQ>JaB)'4A{,Я]`Ճ A泐!372U]]0YK-Y܋7$N5,ۆUu{9C5 [̖=  E$4G%rդBT)۲*c4מ3#nXfW~@/{WT3*;j{ޛ`xdj|xuZhU`212˨ֺv?]ftapFWAm3. yvEgPLCkoȥVR %͔ڂMQ9( #03y[(]{vuhur zUɸ^ǧB,@x3ۺmsV/W{. 3=q;E}&s.ivy*Q[IVȮy*nIk.^Uɘ?s#-YwfPGV)?+$4zHYh{YŕT#圜w\(:&8~рo;ڋ=ו}pCy`{@)J^xdJmeVjUOլ{? x7 +OjJ2nXN,teݨVr3cMR"{1eBaKfD!kFwƈNN%/RDy+xH9Wރ*; KXLzb~L 2,=bYvO}nG^䋡Αq@DB;>0%Oix#ɻ,ksɡo]YpM/uͺ=s4{?mA/c-b؎(uxScim@@ā.|YCo^:,s?A5Tּ(.qL7]7^Q2ۺ2ی½ŏ>7X[^=J!L1{KD. 'ao higJht'ɣKƊ#h\-h}N²:^ fMnqk?+II)>T%墽/cW2D^kw_x XBqcQy(OnٗwJ3}6ĥ1o(F6gF_M2O66+qFǦfl9':,^FfDO) }Bf?9Vp0Q՚FAZxٚܽ9Ņ9kr}30񋬼M9NiSg5۠]%ɀg?" -UDQm9R^=/JI Œeo<gJ6o P9F}}f=NG'd9!z}==G_Nʇ)dj_~l:AرIE9qo!(/}$;/\QlD /\1qz 2fn{scU6B%&˧=!87 QJ}otQuhoiXJpGK{ȟ-h*5[_- w۔"mC\?bK[/~">О.mvXPQY`=_|۫W#Hayi}VH`-7Lk4\'uy 0x0d|GODN#5mWjuۘc$G$2kf4h2/E(RoSbG0ҩ-3^ hDBMP'ORY䃜'hlJ>aˀ$ G9n)q;Ǘ͉ \hИ:Ãkf'F1Y!dU[ &_IC7b方T*khuDR'7KdТj6L^\y5-ӂ[́2UUDob11AIEZV)2(-1tk0:Fhŵ銭Lۓ.m#dǮXb{)x𻕗*uBQF:DOc|'ۉxfĎ|<\~6\kyp*=-2ي0g:d>W O/9L$* 1a|]ҁ7άjo01>qfX2x|G,WN'2Q&cXN:)YKp]j≬kI]Mt>fե4Ni9)ktr'fᑄXUWXipUwjQ|â)/Ķ1vEFn `cm+HA_oi$|,4c!G#h3jfPw~+ĤdBJӸU9zBV%̛#6q.~w s K 1xlU&$MGU`ٽ7x endstream endobj 427 0 obj << /Length1 1373 /Length2 6093 /Length3 0 /Length 7034 /Filter /FlateDecode >> stream xڍtT/]%Ȁ9H#) 00--J#tJK(ߨ9{Ͻkݻf<~mp/( P >"bc3?Z"6c0 $]:E ݡ#PT(&)(#! Py@Zu8 $bSz# (t\p Z #]m!`?Rp>vD\%<==A.H~8 /r胑`k\6{0~"6#GmGy`Z؂aHt;k 4:`g?;ѿA`ApWsC`&? ~9H8:@A6hߍrzzC" ($?54KV)]\0W} {|!0;_#ع  n`5ſ=*(vl~%7v6Vu#!`/`mD ( #OvlGFo dƖ *&yy(OHD̢ ݅b`pğfѷ=>36X0?7E0C,w?Po+/a@xuGG3߮OU Bs@%B/.e*Fp$׃ *[gD &?K*lv%$" ! o"ђ708 @#~SX ~~):(Ool4~ſߜDp[Pֳj9OQ)ͧ\|6 R4+>+q.0_~kÏhNkJҟl!8N7\m/!#ߵq3vf:[8nՙgWmopVƝI8XiW63tx(>&n/)ʗcIC6 nslj!v~ZIr `SĮ4&$ |R_R)dI@jHz&j3ڐR[iuӃr+Q^ujяza~(It)i/9K:*J(9镤+;xz$LiR8΀ہFmCRn|qnV.CǤ1K 2/tx;\<+1R]0sߕD55bM;EJp@*δ;3Ŧn(rD>IE7,(sA%V=0!J%a8.aS>h;Y&`=uʚK#H|!PSynf/1T4Shn^B!KIi!! 5J-#Q(ͼNqE3Ɠ#GZHLwW$wC>4l(B~ב:S6!U/~5&, YOlj hy̥U1 N\Id:v@ SQ/]tCG2uk@uѝ,$ ?c}Q0@u=44mg z{ I.DmX6WD(LkEhni(9}d{az 1,Ũe(ǻ3e,3&—$O^u'5oU;ЫM-([t` ?Rl}1Đ7N.ĩ2t7?ER=zYbf6]pD`@g31,ܹRo>3kMonFJy_^t.~X] |N"K#вMd Cb.ך"&z B##]],P A1±V^aV36~jzwQu0<~՚ζoULby[p#i:m:w \!ܾ-onVIz6(JhqSnuߧpk#Eq",_U@i CF)(؁XkaD5lPB- ^K=&j2}EHLjq2٩Y 13̾< fGSiU[x"5O-ݎ7u>1^E.)a&'ѩ' J:^DN.E\&mدg#bCbv^~v& -ޔ*,lc@+nNG)d_LQ0:}_U-!8]0ˎqksm1m 6. Ǒ$2Z{ګvZG7Ym&Ќw#0Gf}P${Ǖ])fDDzGbez"uO>sl"ɑÌxG^IĺO4Z >A[0OT_q"2Wng]ŸխTw ΧRټos`bA=swǴ-Wer{*RP)N{^Ou/|fYڏzΜ~4N NA)lV#xbg&G=We\[i3SSM/:Xа*s|^4OA#~kR2Vq`L׬=GY¨Eg dw%nMz.+1T SFv7rTr]LRSux·{pD+6:5YE#05.h߸=0п# lD)cZ͓_g)'IXg6}ܕM))=fL#C~}wiZ'I*屨{lּ.嵐]-u$#] pdi+t}%-ޮJ=ƭ? _(UwR&x@fTf֏;;Om-(a C䛨LQO'_y}#kjɔB̞UlU$uw:yx4tJlRB7Z+&2Y'cdy䴧}+ݔfmycj'DUzkɟX ܝ=XE-*b7x2G>[<9ЬOgș}u^=?XecYʀߨS0z@\)"Jҙ/~nwY1z:|wZpaťM*)j/b-HΫIƹ A’C _?cG>o\}ѭ$JrxdU=_!;YH}U, - o'PWoܳ L|] :Ut&UZl¥RFQ'iSW%bgGO i,CG_ޱwȓRi[J)`\R!zB+l[4Ct?4wSK5uƾ>VkS#9c^z`J"BNu0Y,e,5v;4fc>ج]™kXp8Hx>:4"9 P6!K@Hf./+w52:' 8G'0c@|#bySb?C(sv,l_}cu (g&1y6Qyt+z4TtHHVaGR#ikTʻe;m2 h v2\pI_c!@ڻ˛xԑm Pܽwyn@.=| joKLy[0c-lrF2[f1*1^5$WlyNvGZm A>Nh$!JRt6ܴѵ)cԄC]7ĔgWGScmVKZeWІI3/}FUTּXkꋪO%y~@5drjoSXz_yecvФ%^Fw ΂4:[Ay~Q5ewWHG)]3YgwIR!&y:gB;!]| +V\8t\GuX mz}mNv-N?(mۇS3o ;z?lt `VɊen" eԭ$ca~f6Us< /Gl#ڿhD;M2slFp^b*U yµR69 }$ܓlF_7(u"R%k9y:t5׼I bKc`UGܾ̃#-EKqiDr&"ViJ|Yςc9(C"U)7ݣ6%{5!9i!E͘0o"ؒ]3{Vp_} v Jv|'n`#uAAUcmͰw!}> _!1+m%O=XX%cpW/QjpAeRQ}zsJrKCy3PE5,('v\W`68cZ >,.hAQ Pgt}h=,J\"a.hR;LRXk:2#[\eCQiV[ٶ--dÛwQ+Bƒߕ^ȩԼUq)ey`ɖwڑ-^l7f@7-lHW0p+ YMyGQym!FF 2JcX>c3V<,oΦ jc-v/enHy.Qiʎ8UP*!ᅀfOnux\'x>|\vLgEO~ ͙T' CMk?n&_~5*^o5$ʽa]-M'}6qx,ez4rtxglޗt͛=!pk1!Z%xu@.;R Ϳ9sp Lo1;8!Z#xnÛxectk->g)6pzE ~F u`2٬ojrVS8tl-\5\KF PÑ4AM7=G6}S[C]IT"2VմV.^ۡ9 xW_-]` =1AD3M&ī^?-~){?g>cAM]Q?a|&_5jzhg4D\%&J=^Dt[)þN>ET mM$m}'݅{M0}C4C$M'{@͖L BN5S7R*9?ziZr. 8$x7{HH=5=ۊs]và)~YN8?S7 -) ʩb ?I#C>u"Љ*m9[OQE >OwmX3z`Ќ%}]nk;1Eq*- IuF%Jz{rAdEګgJ. Җ`^]e|lw3`(=y'Ǎ!գg'8Ы|[qM` e#&"VUp[&(D$_a1vy$ê endstream endobj 429 0 obj << /Length1 1379 /Length2 5902 /Length3 0 /Length 6848 /Filter /FlateDecode >> stream xڍxTT6"̀t "90 % H()] JZ߷f=繮=6;1#Re]cK! M(o;> EGm*(4PhyB"!1)!q)  J DxHT콠]F+#}=N(to\ n8p tQ`7tE= `A(qFܥݐ'9n>7 0#^`Gzn? Lȿ @`PDxtu@ gsBBJ'W"(w=psBN|P|{/= @{Cahj{C<( 54mV;*#pW*P0ツ@᎐_c8z ¡<*0hmN`@()&&*?}@΂ ;3#@(G{(Op:8BA( wv k> ;k4p῏XPLr*)!|’~I1 @HHH .. g{>#VA$jO\ g.=`׿( /BgWݑ' ۻAahz*Eo9/nD٣ՠwB3__v(R v4@//p AGC ~ 5Ϻp؄EFDBhU:}~ (G!nP'Ahߚ} 9H:exe"71յ$hQ3glGJv54#O *"y/} Y(@ao(};}frD9M? =J6d$¶L5z @r(='aɠG+wa>da[C [>$I 44|MPꈣa5܁"'Eڽb5~Z,#)ɹZ-H %s$VH,;3EEyT++Ŧb4t-ԝA_X`.5>1_Iӱhb鱸yZe ?n}1u`;dIMn=Gjƣ*מGtr''cR~ 0ɚh&B\hB:owR*B1xR3Vt`[*$w {ݶIr8Ƴ.zlWǩmKV9[)PadK^a${׭ ņ 磌2_Ovroh4]c; K Eە? PƘZ tyBϾY]H qn;r^HI@F̹!)Q!MmBU~)Tx. i߄k/QY=i%mRw?>e@^ 5* Ue [_EDw-kG*m8іWN#[I,gG, Tun7lִU 4}i)v9;ðһN%|qQ)=5 ,Kf+?ۇ) OS{ҘreGlUu=d֜M=etpH9};PhF/j$ӕ*RԼ4l^&/us]|Ob 765lkW!",k; $NX}_`ja/TL%Y1Lz><7lZ+ְ'3.E4O-l P'NU(K9I1 iFs7Vg>OE W'(J1{N~z 񏚴!Uq~&Y䟕>;xz`1) T>]Y|1B$ZFv}W}YU s0'+ԟ]1e=²Zbٿj_؞yxj3ĚTقl#nÝb/؞spqa*ӘP:q;8_Q$KLIt eWX?1uQAn-3=50P0!Jtd?Zh8_IWq̎Vsh_+ Tm9>m_m}-?Gyp*f:%ԏ-1mL2`_yD!vFAv+/iUF4 Յ@(wR(ܺC<+{hC7v}ƘXH66︇:T-l8rV~ok&x+!H`Mm$5]_xib:6GG]|̯yAcJ rn+4pn9r''+PCĎ-(ɹ,".\̛,_-l+6d6,p-N/1o_ač3o+~j /#HM\b&;}T\ԗJxr+Ew`o^朑juΎ\4Pn;bU $('<-ȷn*TNzUǵf6e5V& 7[(=Yy$BPMӛ^yD'yoZAx@[-րͱtZOעޮ.*nD5n 0LB|E1m5GeNôɧG ۳oI~$Zy%H=?3vd܀ĬBK9Ka>K^_z5s`*:GDB. ሳNNIU0%Q\xH轧Q_ ʕrl?9LFCmG z.=s/*^1c=w)j#b0_*aQRP񜯳)GMOHvFE(ܵXLVo03m7A3望ɡVQ~=#tHٺ!NccIբv$Y'<۵Ģ"%jN3 󔲶7s˫:8!f^}2u 7)8iPݝS9 <ˬ?HT=;Bg}x@`aѴr]jcYiPY7[<#8[8}1F\ OA znO?<`y20"2:m}'Εz6e'}nIyg@&J/&UQ:Z8ٸOˌEx]h<NV,G9M`25Hx暣e(@fuEAJ4QMpLc_N}LN;mfaMRƣۙrDc]"rZ~*z:,X%xt \"c/1Oc46zU. :(P>Y]"`4[rCY߫>AZ jI^)cg(~; 3}j9+aRV3G]jSض?fIS{pi'sIvㄸlXAG'r䡺ydlr ~s=ēv]ڨc_')c0dr W} [JUճOTWPSKN ٮ^R} ϕuTqXTe2bj0eK+;>_˼=I['DrSFJG @29/֕fscpȵe&-⮟j)iێNhvByFd2} /^ME铧j_M/ X_iGFVuL[vU\xPGzlFi'W\7d\Iq0_f)>+NiH5xf ڴJcп;lr*Z 3:y\ߩm+jB{p յ 5ZbkF+PLClݑHew*4q.q(R`u=aWH)SK\$/dkm,H{?WwfED~>1B94sRImuJ)wb, 4 XLw[TX֛/Rd,bܽIm|󕭍qPzlC؉W/q6__zxvP0ĠVh!Bc{Ik;_:gnfizo9r|Uq|V+5V1S:{mÙp -LՔ^ABzmeZL@`H(qHEo5iIKukFSdh߭O}&qʢN8}$lQO8cP\KXXi˅U 2Qrc=no9jNLF$đ΋%f$efo;NKjA9żO6,^*th3Ҿp9)x[CJͲFzv }a!V35],|ˋIpý[V9~)l`eYѧFv\ I}序7宒k|>l3]JWCzq, ^cIl?P(߱{ss!Fg̠ NJexގ6/hg[箄I{}n1Gy+9M&w߼a8Igj>Tfd7ݣUEGHz&w8e|񹏝1{[hreu%+p'~*8EoYk-h×tgu0s@--Jcvrmz[T|`3iRY]j97hc4TܐPTVnCga7_}oҪ,9W/,L'Yd5_=SkŦ _fZ#x^7$~5˚0M}dv[0U;zQyAշ̧Cc[޳?|-ӎwg\(\#mbf+i'0C/t7G1mvRa4ud'y3"\V{\,Tnƾ CFo}f0¸"k d#*j{oVUK5M,KR|3);"мYO0> stream xmTMo0Wx$ ! 8l[jWHL7IPV=M̼ su;Uٛ=w]yil;<[[j<=?׾+v`&ߴț<^*;~&Q>MS >_P{=s@dkx;`VY`s4JaQܡn.Uu9\Y6><ٴ.Z.4>Dӗ}~r:-d0VWk,8yLһʮӮђ[*mLr?q 5F8@=@)& 8Rx uD\j2HV0CzL] bctI g$`htы0\F0s jd< I6zg W qȐ+#k .bsrbmXK7ǵH7Gnb>&jؐu1VljOu$՟qWS/%1{\xB!K(hHTЖ枃Jρϯv=k2UKς_:~$/ ~E+7ˢ/ l(/} -+ZXukoԝE?ZKq endstream endobj 432 0 obj << /Length 739 /Filter /FlateDecode >> stream xmUMo0WxvHUdCmU^!1H#x?gx]OTm$|͜s_Iss :L;<Sz==׾f`*_`ɫڟk3'iѴ}=M;7rfnj-eSӵOLg~8 )ok A8 $`I\3`Af<Z]! xNky"7 _㓧q H`nḱRONH=CpB:# =%888QA~!*zƜАT?!~> tw8y*sύ }nFE>7*QύR>7G];~<6OIyktg>O:yұϓN|I/|yIg>O:y҅ϓ.}2 L> stream xmUMo0WxvHUdC۪TBb A!Gp?gxYOTm$|՜s_Iss :L;268{zb/}WUjWm?fd}Oi=7gRd{nCN8oͰof-%6'&9Pu`L/"tkں(a[ duS $xqa MN{}m}gىx` tw8y*sύ }nFE>7*QύR>7G];~<6OIyktg>O:yұϓN|I/|yIg>O:y҅ϓ.}2 L> stream xmUMo:W5?$R. d9M eCkmCp;;w~>|3E_?O]5߶w]Occ]=~?}Oyh9%?۹׬B|Ɯ>);vw%g43>\ 6 EJ78 1{~`W(-;]%=xe_,b+-O;q\L}UI--=BKE1p[! Mߊyu>.N5K)Wb٬8i[_uʕMzQ)V(Txޢjy!Z2P="Zd0\ÃGR\).2*Шa!U,H`+j.5Nα@VK-x%3%AYӀzΚ>kP#5m0Woþj.ZT$X/)n)#Wo(oRZ $Kp4Z-b\1ܰJ P"GXQi/8k^Zq:Zs9dB )sL-7xJ`aɽ)f$1 dъcCZC<73JgznHȰYɚTa,_-O87}KԴܗLloK+gJ.GZyVc48Wt]:P~`rZq.n1] S/Pu7Ue:?&?!d&1yHn5)yғBx#1ޞ]Go׏M?X endstream endobj 444 0 obj << /Producer (pdfTeX-1.40.22) /Author()/Title()/Subject()/Creator(LaTeX with hyperref)/Keywords() /CreationDate (D:20231024170205-04'00') /ModDate (D:20231024170205-04'00') /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 292 0 obj << /Type /ObjStm /N 40 /First 339 /Length 2771 /Filter /FlateDecode >> stream xZn}ࣝ@$/W8dl9CG*˝ϹddC d^^nmHH# #~׊0Z( 3^hJ5Ah(K'įNP;\ XZa(aIZka h 2N8q'pNjpA)"Ztx5F +e7A 5qDM(&> %/|Dx%#g0a sC8=y`2}^L.nR+i2}1}j|YͿ俒;-=Z=*N0MCͫ~:1}Z7h6}䩘yv?g⧟dZo鯳L>|Z- ūbL!p[vNqUֿ\)ɽܱvZ~Sr-#tCH DRH őS 8{)YƱ)ask8&DDh3#bWRCCaa-[+EշRllXbc l*.C%)糁5ބRT2P)A[ W UCquQ:Щ-oږ7l J8 oK8 %EO,v%aV%]KQ-ars%̿ H\%&,YKXb5`5 k,  $XKXz5ŽXoEh^u]`\B\rb`d2@L,H&4T"0VvAn;?*/PMٲؗ?;,9Cha:Pe"CF.6\i:K*=3nXmس[yS@caK8\2CdC1r@#h@qJ{d ,%xJ&|\;$,ƈ2$"iHÓ'O c}@5o2TTE%$JԨjRtG"=nh_;tzA]V>(7ʇ'||W~MH˿Saəs2ClJ5]:~ 3[갽 A1gh[#'E,xv9 2UDF( Q Q@FjRyw*SYAÓ~}_o|36<9^Qjvc F bg' w3xfv5?Qכ;+C*yF{_͗sO6N=|=ذ,dG9_79?j=T{|W ] /Length 1274 /Filter /FlateDecode >> stream xwtW߽OdDD5j"i{NmjVjZңjhP:O[N)-zZCߟ;<<s}ReIT2ŠDUU'DuUQ_WeE('Ea E&wQ sV12DO.b("DEƨCdnH?H9 EWWG$/X[TQCяNw4e %JŤ/oFyBDc߰0K=F]g0 c &IaJLUiKa0>̊ mLQ,L𜖰(%`.X++nAcX `jX^oCl(y#}wQ #|t\Y EL*CD1?/V+]E| ;˻-~_ ^u4x)/mǧouWY/L('?xƚ`g}',[Cch+C͆0rosmaïAįU$6zg|`'aJi b5[eM7U[%Z 3 3d߄d.Mj55h-΃:\!v@]n_ (6& fӠ9WȶP@-5hhQm{B;m_;u Թf袺vW|=Ub%YP/6 }ɾZoЏWhZjn_ȫB+P݅BΟdQF[Ok17}H^;j 1S`,oǵ㵡#`RcS0Muy0&Rf9Zܣ0?E$ʉ`c$Ӱ7̖pXݰD-JSoWi5VYclM 1 ARE REPLACED WITH 1. } \details{ The p-values are obtained by applying Siegmund's approximation for the maximal statistic from binary segmenting consecutive segments within a chromosome. This p-value is only to give the relative importance of the change-points as the CBS is different from the algorithm used here. The confidence intervals are obtained by a permutation algorithm. The data are permuted to the left and right of the identified change-point and the location of the maximal binary segmentation statistic computed. The confidence interval is given by the quantiles of the permutation distribution of the locations. The statistical properties of this confidence interval is unknown. It is used to give an idea of the uncertainity on the location of the change-points as the CBS is different from the algorithm used here. } \examples{ # test code on an easy data set set.seed(25) genomdat <- rnorm(500, sd=0.1) + rep(c(-0.2,0.1,1,-0.5,0.2,-0.5,0.1,-0.2),c(137,87,17,49,29,52,87,42)) plot(genomdat) chrom <- rep(1:2,c(290,210)) maploc <- c(1:290,1:210) test1 <- segment(CNA(genomdat, chrom, maploc)) segments.p(test1) } \author{Venkatraman E. Seshan} \keyword{nonparametric} DNAcopy/man/segments.summary.Rd0000644000175200017520000000171214516003605017455 0ustar00biocbuildbiocbuild\name{segments.summary} \alias{segments.summary} \title{Additional summary measured for the segments} \description{ This program computes the standard deviation, median and the mad of the data for each segment found by the CBS algorithm. } \usage{ segments.summary(x) } \arguments{ \item{x}{an object of class DNAcopy} } \value{ a data frame with nine columns. The sd, median and mad of each segment is added to the six columns from the segment command. } \examples{ # test code on an easy data set set.seed(25) genomdat1 <- rnorm(500, sd=0.1) + rep(c(-0.2,0.1,1,-0.5,0.2,-0.5,0.1,-0.2),c(137,87,17,49,29,52,87,42)) genomdat2 <- rnorm(500, sd=0.1) + rep(c(-0.2,0.1,1,-0.5,0.2,-0.5,0.1,-0.2),c(137,87,17,49,29,52,87,42)) genomdat1[sample(1:500,5)] <- NA chrom <- rep(1:2,c(290,210)) maploc <- c(1:290,1:210) test1 <- segment(CNA(cbind(genomdat1,genomdat2), chrom, maploc)) segments.summary(test1) } \author{Venkatraman E. Seshan} \keyword{nonparametric} DNAcopy/man/smooth.CNA.Rd0000644000175200017520000000314514516003605016047 0ustar00biocbuildbiocbuild\name{smooth.CNA} \alias{smooth.CNA} \title{Smooth a `Copy Number Array' data object} \description{ Detect outliers and smooth the data prior to analysis by programs such as circular binary segmentation (CBS). } \usage{ smooth.CNA(x, smooth.region=10, outlier.SD.scale=4, smooth.SD.scale=2, trim=0.025) } \arguments{ \item{x}{Copy number array data object} \item{smooth.region}{number of points to consider on the left and the right of a point to detect it as an outlier. (default=10)} \item{outlier.SD.scale}{the number of SDs away from the nearest point in the smoothing region to call a point an outlier.} \item{smooth.SD.scale}{the number of SDs from the median in the smoothing region where a smoothed point is positioned.} \item{trim}{proportion of data to be trimmed for variance calculation for smoothing outliers and undoing splits based on SD.} } \value{ An object of class \code{CNA} with outliers smoothed i.e the logratio values of singleton outliers is shrunk towards the values of its neighbors. The output is of the same dimension as the input. } \examples{ data(coriell) #Combine into one CNA object to prepare for analysis on Chromosomes 1-23 CNA.object <- CNA(cbind(coriell$Coriell.05296,coriell$Coriell.13330), coriell$Chromosome,coriell$Position, data.type="logratio",sampleid=c("c05296","c13330")) #We generally recommend smoothing single point outliers before analysis #Make sure to check that the smoothing is proper smoothed.CNA.object <- smooth.CNA(CNA.object) } \keyword{nonparametric} DNAcopy/man/subset.CNA.Rd0000644000175200017520000000246314516003605016045 0ustar00biocbuildbiocbuild\name{subset.CNA} \alias{subset.CNA} \title{Subset a `Copy Number Array' data object} \description{ Function to return a subset of a copy number array data object by a list of chromosomes and sample. } \usage{ \method{subset}{CNA}(x, chromlist=NULL, samplelist=NULL, ...) } \arguments{ \item{x}{Copy number array data object} \item{chromlist}{chromosomes of interest. Should be a subset of the valid chromosome names in the original data.} \item{samplelist}{samples of interest. Can be integers denoting the samples of interest or a vector of valid sample names.} \item{...}{other arguments which may be passed to \code{subset}.} } \value{ An object of class \code{CNA} with the data for the list of chromosomes and samples of interest. } \examples{ data(coriell) #Combine into one CNA object to prepare for analysis on Chromosomes 1-23 CNA.object <- CNA(cbind(coriell$Coriell.05296,coriell$Coriell.13330), coriell$Chromosome,coriell$Position, data.type="logratio",sampleid=c("c05296","c13330")) #Take the first ten chromosomes of the first sample #subset.CNA.object <- subset.CNA(CNA.object,chromlist=1:10,samplelist="c05296") subset.CNA.object <- subset(CNA.object,chromlist=1:10,samplelist="c05296") } \keyword{nonparametric} DNAcopy/man/subset.DNAcopy.Rd0000644000175200017520000000151614516003605016737 0ustar00biocbuildbiocbuild\name{subset.DNAcopy} \alias{subset.DNAcopy} \title{Subset a DNAcopy data object} \description{ Function to return a subset of a copy number array data object by a list of chromosomes and sample. } \usage{ \method{subset}{DNAcopy}(x, chromlist=NULL, samplelist=NULL, ...) } \arguments{ \item{x}{DNAcopy object} \item{chromlist}{chromosomes of interest. Should be a subset of the valid chromosome names in the original data.} \item{samplelist}{samples of interest. Can be integers denoting the samples of interest or a vector of valid sample names.} \item{...}{other arguments which may be passed to \code{subset}.} } \value{ An object of class \code{DNAcopy} with the input data and the results of segmenting them only for the chromosomes and samples of interest. } \keyword{nonparametric} DNAcopy/man/zoomIntoRegion.Rd0000644000175200017520000000507614516003605017125 0ustar00biocbuildbiocbuild\name{zoomIntoRegion} \alias{zoomIntoRegion} \title{Zoomed in view of genomic region} \description{ This program computes the frequency of gains and losses for each probe as a function of level of mad. } \usage{ zoomIntoRegion(x, chrom, sampleid, maploc.start=NULL, maploc.end=NULL, pt.pch=NULL, pt.cex=NULL, pt.col=NULL, segcol=NULL, seglwd=NULL, main=NULL, xlab=NULL, ylab=NULL, ...) } \arguments{ \item{x}{an object of class DNAcopy.} \item{chrom}{the chromosome in which the region lies.} \item{sampleid}{the sample of interest.} \item{maploc.start}{genomic start position of the region of interest. Default is the beginning of the chromosome.} \item{maploc.end}{genomic end position of the region of interest. Default is the end of the chromosome.} \item{pt.pch}{the plotting character used for plotting the log-ratio values (default is ".").} \item{pt.cex}{the size of plotting character used for the log-ratio values (default is 3 if "." and 1 otherwise).} \item{pt.col}{the color used for the points. Default is green3.} \item{segcol}{the color of the lines indicating the segment means. If missing the line color is set to be red.} \item{seglwd}{line weight of lines for segment mean and zeroline. If missing it is set to 3.} \item{main}{figure title. If missing will be generated by pasting the chromosome, range and sample name together.} \item{xlab}{x-axis label. If missing "Genomic position" will be used} \item{ylab}{y-axis label. If missing "log-ratio" will be used} \item{...}{additional plotting options.} } \details{ This command plots the region of interest with the log-ratio and segments. It works for a region from a single chromosome in a single sample. So if more than one chromosome and/or one sample are given only the first chromosome from the first sample will be used. } \examples{ data(coriell) #Combine into one CNA object to prepare for analysis on Chromosomes 1-23 CNA.object <- CNA(cbind(coriell$Coriell.05296,coriell$Coriell.13330), coriell$Chromosome,coriell$Position, data.type="logratio",sampleid=c("c05296","c13330")) #We generally recommend smoothing single point outliers before analysis #Make sure to check that the smoothing is proper smoothed.CNA.object <- smooth.CNA(CNA.object) #Segmentation at default parameters segment.smoothed.CNA.object <- segment(smoothed.CNA.object, verbose=1) zoomIntoRegion(segment.smoothed.CNA.object, chrom=10, sampleid="c05296") } \author{Venkatraman E. Seshan \email{seshanv@mskcc.org} } \keyword{nonparametric} DNAcopy/src/0000755000175200017520000000000014516030315013656 5ustar00biocbuildbiocbuildDNAcopy/src/cbsWtstats.f0000644000175200017520000005653114516003605016202 0ustar00biocbuildbiocbuildc these are the subroutines to do the weigthed version of CBS c which is useful in order to merge data from multiple platforms c -------------------------------------------------------------- c This is relevant only for log-ratio not binary data c -------------------------------------------------------------- c function for calculating the full max weighted t-statistic c new approach to maximizing t-statistic subroutine wtmaxo(n,x,wts,tss,sx,cwts,iseg,ostat,al0) integer n,iseg(2),al0 double precision x(n),wts(n),tss,sx(n),cwts(n),ostat c c look at the partial sums in blocks of size sqrt(n) c integer ipsmin, ipsmax, ipsmin0, ipsmax0, nb, i, j, k, l, nb1, 1 nb2, bi, bj, ilo, ihi, jlo, jhi, ihi1, jlo1, jhi1, 2 tmaxi, tmaxj, nal0 double precision psum, psmin, psmax, psmin0, psmax0, bssmax, 1 bsslim, rn, sij1, sij2, sijmx0, bijbss, awtmax, psrnov2, 2 psdiff, psrj, psrn, psrnj, awtlo, awthi, awt1 c c use local arrays for working within blocks c block partial sum max and min double precision, allocatable :: bpsmax(:), bpsmin(:) c location of the max and min integer, allocatable :: bb(:), ibmin(:), ibmax(:) c t statistic corresponding to max for block i,j double precision, allocatable :: bssbij(:), bssijmax(:), awt(:) c row, column and order vector for reordering bssbij integer, allocatable :: bloci(:), blocj(:), loc(:) c calculate number of blocks (nb) and block boundaries (vector bb) rn = dble(n) if (n .ge. 50) then nb = nint(sqrt(dble(n))) else nb = 1 endif c the number of paiwise block comparison nb2 = nb*(nb+1)/2 c allocate memory allocate(bpsmax(nb), bpsmin(nb)) allocate(bb(nb), ibmin(nb), ibmax(nb)) allocate(bssbij(nb2), bssijmax(nb2), awt(nb2)) allocate(bloci(nb2), blocj(nb2), loc(nb2)) c block boundaries do 110 i = 1, nb bb(i) = nint(rn*(dble(i)/dble(nb))) 110 continue c find the max, min of partial sums and their locations within blocks ilo = 1 psum = 0 psmin0 = 0 psmax0 = 0 ipsmin0 = n ipsmax0 = n do 20 j = 1, nb sx(ilo) = psum + x(ilo)*wts(ilo) psmin = sx(ilo) ipsmin = ilo psmax = sx(ilo) ipsmax = ilo do 10 i = ilo+1, bb(j) sx(i) = sx(i-1) + x(i)*wts(i) if (sx(i) .lt. psmin) then psmin = sx(i) ipsmin = i endif if (sx(i) .gt. psmax) then psmax = sx(i) ipsmax = i endif 10 continue c store the block min, max and locations ibmin(j) = ipsmin ibmax(j) = ipsmax bpsmin(j) = psmin bpsmax(j) = psmax c adjust global min, max and locations if (psmin .lt. psmin0) then psmin0 = psmin ipsmin0 = ipsmin endif if (psmax .gt. psmax0) then psmax0 = psmax ipsmax0 = ipsmax endif c reset ilo to be the block boundary + 1 psum = sx(bb(j)) ilo = bb(j) + 1 20 continue c calculate bss for max s_i - min s_i psdiff = psmax0 - psmin0 c if the segment is all constant then psdiff = 0 and so bssmax = 0 if (psdiff .le. 0) then bssmax = 0 go to 120 endif psrn = cwts(n) psrj = abs(cwts(ipsmax0) - cwts(ipsmin0)) psrnj = psrj*(psrn-psrj) bssmax = (psdiff**2)/psrnj tmaxi = min(ipsmax0, ipsmin0) tmaxj = max(ipsmax0, ipsmin0) c for a pair of blocks (i,j) calculate the max absolute t-statistic c at the (min_i, max_j) and (max_i, min_j) locations c for other indices the t-statistic can be bounded using this c c if a block doesn't have the potential to exceed bssmax ignore it c calculate the bsslim for each block and include ones >= bssmax psrnov2 = psrn/2 l = 0 nal0 = n - al0 do 40 i = 1, nb do 30 j = i, nb c calculate bsslim if (i .eq. 1) then ilo = 1 else ilo = bb(i-1) + 1 endif ihi = bb(i) if (j .eq. 1) then jlo = 1 else jlo = bb(j-1) + 1 endif jhi = bb(j) c for wCBS calculated hi and lo arc weights instead of lengths awthi = cwts(jhi) - cwts(ilo) if (jhi - ilo .gt. nal0) then awthi = 0 do 35 k = 1, al0 awthi = max(awthi, cwts(nal0+k) - cwts(k)) 35 continue endif if (i .eq. j) then awtlo = cwts(ilo+al0) - cwts(ilo) do 36 k = ilo + 1, ihi - al0 awtlo = min(awtlo, cwts(k+al0) - cwts(k)) 36 continue else if (i+1 .eq. j) then awtlo = cwts(jlo) - cwts(jlo-al0) do 37 k = jlo - al0 + 1, ihi awtlo = min(awtlo, cwts(k+al0) - cwts(k)) 37 continue else awtlo = cwts(jlo) - cwts(ihi) endif c max S_k over block j - min S_k over block i sij1 = abs(bpsmax(j) - bpsmin(i)) c max S_k over block i - min S_k over block j sij2 = abs(bpsmax(i) - bpsmin(j)) c if i = j then sij1 and sij2 are the same sijmx0 = max(sij1, sij2) psrnj = min(awtlo*(psrn-awtlo), awthi*(psrn-awthi)) bsslim = (sijmx0**2)/psrnj c if its as large as bssmax add block if (bssmax .le. bsslim) then l = l+1 loc(l) = l bloci(l) = i blocj(l) = j bssijmax(l) = bsslim c max sij in the (i,j) block, t-statistic etc if (sij1 .gt. sij2) then awt(l) = abs(cwts(ibmax(j)) - cwts(ibmin(i))) bssbij(l) = (sij1**2)/(awt(l)*(psrn-awt(l))) else awt(l) = abs(cwts(ibmin(j)) - cwts(ibmax(i))) bssbij(l) = (sij2**2)/(awt(l)*(psrn-awt(l))) endif endif 30 continue 40 continue nb1 = l c Now sort the t-statistics by their magnitude call qsort4(bssbij, loc, 1, nb1) c now go through the blocks in reverse order (largest down) do 100 l = nb1, 1, -1 k = loc(l) c need to check a block only if it has potential to increase bss c rjlo is the smalllest (j-i) in the block and rjhi is the largest bsslim = bssijmax(k) if (bssmax .le. bsslim) then c bi, bj give the block location bi = bloci(k) bj = blocj(k) awtmax = awt(k) if (bi .eq. 1) then ilo = 1 else ilo = bb(bi-1) + 1 endif ihi = bb(bi) if (bj .eq. 1) then jlo = 1 else jlo = bb(bj-1) + 1 endif jhi = bb(bj) awthi = cwts(jhi) - cwts(ilo) if (bi .eq. bj) then awtlo = 0 else awtlo = cwts(jlo) - cwts(ihi) endif c c if arc wt is larger than half total wt (psrn/2) make is psrn - arc wt c if (awtmax .gt. psrn - awtmax) awtmax = psrn - awtmax c c if awtlo <= psrn/2 start from (ihi, jlo) and go up c if awthi >= psrn/2 start from (ilo, jhi) and go down c if (awtlo .le. psrnov2) then if (bi .eq.bj) then ihi1 = ihi - al0 else ihi1 = ihi endif do 60 i = ihi1, ilo, -1 jlo1 = max(i + al0, jlo) do 55 j = jlo1, jhi awt1 = cwts(j) - cwts(i) if (awt1 .le. awtmax) then bijbss = (sx(j) - sx(i))**2/(awt1*(psrn-awt1)) if (bijbss .gt. bssmax) then bssmax = bijbss tmaxi = i tmaxj = j endif endif 55 continue 60 continue endif c c make arc wt psrn - arc wt c awtmax = psrn - awtmax if (awthi .ge. psrnov2) then do 70 i = ilo, ihi if ((bi .eq. 1) .and. (bj .eq. nb)) then jhi1 = min(jhi, jhi - al0 + i) else jhi1 = jhi endif do 65 j = jhi1, jlo, -1 awt1 = cwts(j) - cwts(i) if (awt1 .ge. awtmax) then bijbss = (sx(j) - sx(i))**2/(awt1*(psrn-awt1)) if (bijbss .gt. bssmax) then bssmax = bijbss tmaxi = i tmaxj = j endif endif 65 continue 70 continue endif endif 100 continue 120 if (tss.le.bssmax+0.0001) tss = bssmax + 1.0 bssmax = bssmax/((tss-bssmax)/(rn-2.0)) c deallocate memory deallocate(bpsmax, bpsmin, bb, ibmin, ibmax) deallocate(bssbij, bssijmax, bloci, blocj, loc, awt) ostat = bssmax iseg(1) = tmaxi iseg(2) = tmaxj return end c function for calculating the full max wtd t-statistic on permuted data c using a new approach to maximizing t-statistic double precision function wtmaxp(n,px,wts,sx,cwts,al0) integer n,al0 double precision px(n),wts(n),sx(n),cwts(n) c c look at the partial sums in blocks of size sqrt(n) c integer ipsmin, ipsmax, ipsmin0, ipsmax0, nb, i, j, k, l, nb1, 1 nb2, bi, bj, ilo, ihi, jlo, jhi, ihi1, jlo1, jhi1, nal0 double precision psum, psmin, psmax, psmin0, psmax0, bssmax, 1 bsslim, rn, sij1, sij2, sijmx0, bijbss, awtmax, psrnov2, 2 psdiff, psrj, psrn, psrnj, awtlo, awthi, awt1, ssq, tss c c use local arrays for working within blocks c block partial sum max and min double precision, allocatable :: bpsmax(:), bpsmin(:) c location of the max and min integer, allocatable :: bb(:), ibmin(:), ibmax(:) c t statistic corresponding to max for block i,j double precision, allocatable :: bssbij(:), bssijmax(:), awt(:) c row, column and order vector for reordering bssbij integer, allocatable :: bloci(:), blocj(:), loc(:) c calculate number of blocks (nb) and block boundaries (vector bb) rn = dble(n) if (n .ge. 50) then nb = nint(sqrt(dble(n))) else nb = 1 endif c the number of paiwise block comparison nb2 = nb*(nb+1)/2 c allocate memory allocate(bpsmax(nb), bpsmin(nb)) allocate(bb(nb), ibmin(nb), ibmax(nb)) allocate(bssbij(nb2), bssijmax(nb2), awt(nb2)) allocate(bloci(nb2), blocj(nb2), loc(nb2)) c block boundaries do 110 i = 1, nb bb(i) = nint(rn*(dble(i)/dble(nb))) 110 continue c find the max, min of partial sums and their locations within blocks ilo = 1 psum = 0 psmin0 = 0 psmax0 = 0 ipsmin0 = n ipsmax0 = n ssq = 0 do 20 j = 1, nb sx(ilo) = psum + px(ilo)*wts(ilo) ssq = ssq + (px(ilo)**2)*wts(ilo) psmin = sx(ilo) ipsmin = ilo psmax = sx(ilo) ipsmax = ilo do 10 i = ilo+1, bb(j) sx(i) = sx(i-1) + px(i)*wts(i) ssq = ssq + (px(i)**2)*wts(i) if (sx(i) .lt. psmin) then psmin = sx(i) ipsmin = i endif if (sx(i) .gt. psmax) then psmax = sx(i) ipsmax = i endif 10 continue c store the block min, max and locations ibmin(j) = ipsmin ibmax(j) = ipsmax bpsmin(j) = psmin bpsmax(j) = psmax c adjust global min, max and locations if (psmin .lt. psmin0) then psmin0 = psmin ipsmin0 = ipsmin endif if (psmax .gt. psmax0) then psmax0 = psmax ipsmax0 = ipsmax endif c reset ilo to be the block boundary + 1 psum = sx(bb(j)) ilo = bb(j) + 1 20 continue c calculate bss for max s_i - min s_i psdiff = psmax0 - psmin0 psrn = cwts(n) tss = ssq - (sx(n)/psrn)**2 psrj = abs(cwts(ipsmax0) - cwts(ipsmin0)) psrnj = psrj*(psrn-psrj) bssmax = (psdiff**2)/psrnj c for a pair of blocks (i,j) calculate the max absolute t-statistic c at the (min_i, max_j) and (max_i, min_j) locations c for other indices the t-statistic can be bounded using this c c if a block doesn't have the potential to exceed bssmax ignore it c calculate the bsslim for each block and include ones >= bssmax psrnov2 = psrn/2 l = 0 nal0 = n - al0 do 40 i = 1, nb do 30 j = i, nb c calculate bsslim if (i .eq. 1) then ilo = 1 else ilo = bb(i-1) + 1 endif ihi = bb(i) if (j .eq. 1) then jlo = 1 else jlo = bb(j-1) + 1 endif jhi = bb(j) c for wCBS calculated hi and lo arc weights instead of lengths awthi = cwts(jhi) - cwts(ilo) if (jhi - ilo .gt. nal0) then awthi = 0 do 35 k = 1, al0 awthi = max(awthi, cwts(nal0+k) - cwts(k)) 35 continue endif if (i .eq. j) then awtlo = cwts(ilo+al0) - cwts(ilo) do 36 k = ilo + 1, ihi - al0 awtlo = min(awtlo, cwts(k+al0) - cwts(k)) 36 continue else if (i+1 .eq. j) then awtlo = cwts(jlo) - cwts(jlo-al0) do 37 k = jlo - al0 + 1, ihi awtlo = min(awtlo, cwts(k+al0) - cwts(k)) 37 continue else awtlo = cwts(jlo) - cwts(ihi) endif c max S_k over block j - min S_k over block i sij1 = abs(bpsmax(j) - bpsmin(i)) c max S_k over block i - min S_k over block j sij2 = abs(bpsmax(i) - bpsmin(j)) c if i = j then sij1 and sij2 are the same sijmx0 = max(sij1, sij2) psrnj = min(awtlo*(psrn-awtlo), awthi*(psrn-awthi)) bsslim = (sijmx0**2)/psrnj c if its as large as bssmax add block if (bssmax .le. bsslim) then l = l+1 loc(l) = l bloci(l) = i blocj(l) = j bssijmax(l) = bsslim c max sij in the (i,j) block, t-statistic etc if (sij1 .gt. sij2) then awt(l) = abs(cwts(ibmax(j)) - cwts(ibmin(i))) bssbij(l) = (sij1**2)/(awt(l)*(psrn-awt(l))) else awt(l) = abs(cwts(ibmin(j)) - cwts(ibmax(i))) bssbij(l) = (sij2**2)/(awt(l)*(psrn-awt(l))) endif endif 30 continue 40 continue nb1 = l c Now sort the t-statistics by their magnitude call qsort4(bssbij, loc, 1, nb1) c now go through the blocks in reverse order (largest down) do 100 l = nb1, 1, -1 k = loc(l) c need to check a block only if it has potential to increase bss c rjlo is the smalllest (j-i) in the block and rjhi is the largest bsslim = bssijmax(k) if (bssmax .le. bsslim) then c bi, bj give the block location bi = bloci(k) bj = blocj(k) awtmax = awt(k) if (bi .eq. 1) then ilo = 1 else ilo = bb(bi-1) + 1 endif ihi = bb(bi) if (bj .eq. 1) then jlo = 1 else jlo = bb(bj-1) + 1 endif jhi = bb(bj) awthi = cwts(jhi) - cwts(ilo) if (bi .eq. bj) then awtlo = 0 else awtlo = cwts(jlo) - cwts(ihi) endif c c if arc wt is larger than half total wt (psrn/2) make is psrn - arc wt c if (awtmax .gt. psrn - awtmax) awtmax = psrn - awtmax c c if awtlo <= psrn/2 start from (ihi, jlo) and go up c if awthi >= psrn/2 start from (ilo, jhi) and go down c if (awtlo .le. psrnov2) then if (bi .eq.bj) then ihi1 = ihi - al0 else ihi1 = ihi endif do 60 i = ihi1, ilo, -1 jlo1 = max(i + al0, jlo) do 55 j = jlo1, jhi awt1 = cwts(j) - cwts(i) if (awt1 .le. awtmax) then bijbss = (sx(j) - sx(i))**2/(awt1*(psrn-awt1)) if (bijbss .gt. bssmax) bssmax = bijbss endif 55 continue 60 continue endif c c make arc wt psrn - arc wt c awtmax = psrn - awtmax if (awthi .ge. psrnov2) then do 70 i = ilo, ihi if ((bi .eq. 1) .and. (bj .eq. nb)) then jhi1 = min(jhi, jhi - al0 + i) else jhi1 = jhi endif do 65 j = jhi1, jlo, -1 awt1 = cwts(j) - cwts(i) if (awt1 .ge. awtmax) then bijbss = (sx(j) - sx(i))**2/(awt1*(psrn-awt1)) if (bijbss .gt. bssmax) bssmax = bijbss endif 65 continue 70 continue endif endif 100 continue if (tss.le.bssmax+0.0001) tss = bssmax + 1.0 wtmaxp = bssmax/((tss-bssmax)/(rn-2.0)) c deallocate memory deallocate(bpsmax, bpsmin, bb, ibmin, ibmax) deallocate(bssbij, bssijmax, bloci, blocj, loc, awt) return end c function for the max (over small arcs) wtd t-statistic on permuted data c new code to speed up this part 4/1/2010 double precision function hwtmaxp(n,k,px,wts,sx,cwts,mncwt,al0) integer n,k,al0 double precision px(n),wts(n),sx(n),cwts(n),mncwt(k) integer i, j, nmj, ipj, ipnmj double precision rn, rj, rnj, bssmax, bssij, psmin, psmax, psdiff, 1 bsslim, ssq, tss c create blocks of size k (or k+1) to span 1 thru n c block partial sum max and min double precision, allocatable :: bpsmax(:), bpsmin(:) c location of the max and min integer, allocatable :: bb(:) c variables to work on block specific data integer nb, ilo, ihi, l double precision psum, psdiffsq rn = dble(n) c number of blocks nb = int(rn/dble(k)) c allocate memory allocate(bpsmax(nb), bpsmin(nb)) allocate(bb(nb)) c block boundaries do 110 i = 1, nb bb(i) = nint(rn*(dble(i)/dble(nb))) 110 continue c don't need global min and max c find the max, min of partial sums and their locations within blocks ilo = 1 psum = 0 ssq = 0.0d0 bssmax = 0.0d0 rn = cwts(n) do 20 j = 1, nb sx(ilo) = psum + px(ilo)*wts(ilo) ssq = ssq + wts(ilo)*px(ilo)**2 psmin = sx(ilo) ipsmin = ilo psmax = sx(ilo) ipsmax = ilo do 10 i = ilo+1, bb(j) sx(i) = sx(i-1) + px(i)*wts(i) ssq = ssq + wts(i)*px(i)**2 if (sx(i) .lt. psmin) then psmin = sx(i) ipsmin = i endif if (sx(i) .gt. psmax) then psmax = sx(i) ipsmax = i endif 10 continue c store the block min, max and locations bpsmin(j) = psmin bpsmax(j) = psmax c reset ilo to be the block boundary + 1 psum = sx(bb(j)) ilo = bb(j) + 1 c calculate the bss at the block max & min pr i = abs(ipsmin - ipsmax) if ((i .le. k) .and. (i .ge. al0)) then rj = abs(cwts(ipsmax) - cwts(ipsmin)) rnj = rj*(rn-rj) bssij = (bpsmax(j) - bpsmin(j))**2/rnj if (bssmax .lt. bssij) bssmax = bssij endif 20 continue tss = ssq - (sx(n)/rn)**2 c check the first block ilo = 1 ihi = bb(1) psdiff = bpsmax(1) - bpsmin(1) psdiffsq = psdiff**2 do 40 j = al0,k rj = mncwt(j) bsslim = psdiffsq/(rj*(rn-rj)) if (bsslim .lt. bssmax) go to 50 sxmx = 0.0d0 do 30 i = ilo,ihi-j ipj = i+j rj = cwts(ipj) - cwts(i) bssij = (sx(ipj) - sx(i))**2/(rj*(rn-rj)) if (bssij .gt. bssmax) bssmax = bssij 30 continue 40 continue c now the minor arcs spanning the end (n) 50 psdiff = max(abs(bpsmax(1)-bpsmin(nb)), abs(bpsmax(nb)-bpsmin(1))) psdiffsq = psdiff**2 do 70 j = al0,k rj = mncwt(j) bsslim = psdiffsq/(rj*(rn-rj)) if (bsslim .lt. bssmax) go to 100 nmj = n-j do 60 i = 1,j ipnmj = i + nmj rj = cwts(ipnmj) - cwts(i) bssij = (sx(ipnmj) - sx(i))**2/(rj*(rn-rj)) if (bssij .gt. bssmax) bssmax = bssij 60 continue 70 continue c now the other blocks 100 do 200 l = 2,nb ilo = bb(l-1)+1 ihi = bb(l) psdiff = bpsmax(l) - bpsmin(l) psdiffsq = psdiff**2 do 140 j = al0,k rj = mncwt(j) bsslim = psdiffsq/(rj*(rn-rj)) if (bsslim .lt. bssmax) go to 150 sxmx = 0.0d0 do 130 i = ilo,ihi-j ipj = i+j rj = cwts(ipj) - cwts(i) bssij = (sx(ipj) - sx(i))**2/(rj*(rn-rj)) if (bssij .gt. bssmax) bssmax = bssij 130 continue 140 continue 150 psdiff = max(abs(bpsmax(l)-bpsmin(l-1)), 1 abs(bpsmax(l-1)-bpsmin(l))) psdiffsq = psdiff**2 do 170 j = al0,k rj = mncwt(j) bsslim = psdiffsq/(rj*(rn-rj)) if (bsslim .lt. bssmax) go to 200 do 160 i = ilo-j,ilo-1 ipj = i+j rj = cwts(ipj) - cwts(i) bssij = (sx(ipj) - sx(i))**2/(rj*(rn-rj)) if (bssij .gt. bssmax) bssmax = bssij 160 continue 170 continue 200 continue c call dblepr("bss max", 7, bssmax, 1) if (tss .le. bssmax+0.0001d0) tss = bssmax + 1.0d0 hwtmaxp = bssmax/((tss-bssmax)/(dble(n)-2.0d0)) c deallocate memory deallocate(bpsmax, bpsmin, bb) return end c the new statistic routine doesn't compute mncwt subroutine getmncwt(n, cwts, k, mncwt, delta) integer n, k double precision cwts(n), mncwt(k), delta integer i, j, nmj double precision rj, rn rn = cwts(n) do 30 j = 1,k mncwt(j) = cwts(j) nmj = n-j do 10 i = 1,nmj rj = cwts(i+j) - cwts(i) mncwt(j) = min(mncwt(j), rj) 10 continue do 20 i = 1, j rj = cwts(i+nmj) - cwts(i) mncwt(j) = min(mncwt(j), rn-rj) 20 continue 30 continue j = k+1 nmj = n-j delta = cwts(j) do 40 i = 1,nmj rj = cwts(i+j) - cwts(i) delta = min(delta, rj) 40 continue do 50 i = 1, j rj = cwts(i+nmj) - cwts(i) delta = min(delta, rn-rj) 50 continue delta = delta/cwts(n) return end DNAcopy/src/cbststats.f0000644000175200017520000006126514516003605016053 0ustar00biocbuildbiocbuildc new approach to maximizing t-statistic c dynamic memory allocation using allocatable arrays subroutine tmaxo(n,x,tss,sx,iseg,ostat,al0,ibin) integer n,iseg(2),al0 double precision x(n),tss,sx(n),ostat logical ibin c c look at the partial sums in blocks of size sqrt(n) c integer ipsmin, ipsmax, ipsmin0, ipsmax0, nb, i, j, k, l, nb1, 1 nb2, bi, bj, ilo, ihi, jlo, jhi, alenmax, i2j, sxmxi, 2 alenlo, alenhi, tmaxi, tmaxj, ixlo, ixhi, nal0 double precision psum, psmin, psmax, psmin0, psmax0, bssmax, 1 bsslim, rn, rj, rjhi, rjlo, rnjov1, sij1, sij2, sijmx0, 2 absx, sxmx, bijbss, rnov2, psdiff c c use local arrays for working within blocks c block partial sum max and min double precision, allocatable :: bpsmax(:), bpsmin(:) c location of the max and min integer, allocatable :: bb(:), ibmin(:), ibmax(:) c t statistic corresponding to max for block i,j (and max possible) double precision, allocatable :: bssbij(:), bssijmax(:) c row, column and order vector for reordering bssbij integer, allocatable :: bloci(:), blocj(:), loc(:), alen(:) c calculate number of blocks (nb) and block boundaries (vector bb) rn = dble(n) if (n .ge. 50) then nb = nint(sqrt(dble(n))) else nb = 1 endif c the number of paiwise block comparison nb2 = nb*(nb+1)/2 c allocate memory allocate(bpsmax(nb), bpsmin(nb)) allocate(bb(nb), ibmin(nb), ibmax(nb)) allocate(bssbij(nb2), bssijmax(nb2)) allocate(bloci(nb2), blocj(nb2), loc(nb2), alen(nb2)) c block boundaries do 110 i = 1, nb bb(i) = nint(rn*(dble(i)/dble(nb))) 110 continue c find the max, min of partial sums and their locations within blocks ilo = 1 psum = 0 psmin0 = 0 psmax0 = 0 ipsmin0 = n ipsmax0 = n do 20 j = 1, nb sx(ilo) = psum + x(ilo) psmin = sx(ilo) ipsmin = ilo psmax = sx(ilo) ipsmax = ilo do 10 i = ilo+1, bb(j) sx(i) = sx(i-1) + x(i) if (sx(i) .lt. psmin) then psmin = sx(i) ipsmin = i endif if (sx(i) .gt. psmax) then psmax = sx(i) ipsmax = i endif 10 continue c store the block min, max and locations ibmin(j) = ipsmin ibmax(j) = ipsmax bpsmin(j) = psmin bpsmax(j) = psmax c adjust global min, max and locations if (psmin .lt. psmin0) then psmin0 = psmin ipsmin0 = ipsmin endif if (psmax .gt. psmax0) then psmax0 = psmax ipsmax0 = ipsmax endif c reset ilo to be the block boundary + 1 psum = sx(bb(j)) ilo = bb(j) + 1 20 continue c calculate bss for max s_i - min s_i psdiff = psmax0 - psmin0 rj = dble(abs(ipsmax0 - ipsmin0)) rnjov1 = rn/(rj*(rn-rj)) if (ibin) then bssmax = rnjov1*(psdiff-0.5)**2 else bssmax = rnjov1*psdiff**2 endif tmaxi = min(ipsmax0, ipsmin0) tmaxj = max(ipsmax0, ipsmin0) c if the segment is all constant then psdiff = 0 and so bssmax = 0 if (psdiff .le. 0) then bssmax = 0 go to 120 endif c for a pair of blocks (i,j) calculate the max absolute t-statistic c at the (min_i, max_j) and (max_i, min_j) locations c for other indices the t-statistic can be bounded using this c c if a block doesn't have the potential to exceed bssmax ignore it c calculate the bsslim for each block and include ones >= bssmax rnov2 = rn/2 l = 0 nal0 = n - al0 do 40 i = 1, nb do 30 j = i, nb c calculate bsslim if (i .eq. 1) then ilo = 1 else ilo = bb(i-1) + 1 endif ihi = bb(i) if (j .eq. 1) then jlo = 1 else jlo = bb(j-1) + 1 endif jhi = bb(j) alenhi = jhi - ilo if (alenhi .gt. nal0) alenhi = nal0 rjhi = dble(alenhi) if (i .eq. j) then alenlo = 1 else alenlo = jlo - ihi endif if (alenlo .lt. al0) alenlo = al0 c max S_k over block j - min S_k over block i sij1 = abs(bpsmax(j) - bpsmin(i)) c max S_k over block i - min S_k over block j sij2 = abs(bpsmax(i) - bpsmin(j)) c if i = j then sij1 and sij2 are the same sijmx0 = max(sij1, sij2) rjlo = dble(alenlo) rnjov1 = rn/min(rjlo*(rn-rjlo), rjhi*(rn-rjhi)) if (ibin) then bsslim = rnjov1*(sijmx0-0.5)**2 else bsslim = rnjov1*(sijmx0**2) endif c if its as large as bssmax add block if (bssmax .le. bsslim) then l = l+1 loc(l) = l bloci(l) = i blocj(l) = j bssijmax(l) = bsslim c max sij in the (i,j) block, t-statistic etc if (sij1 .gt. sij2) then alen(l) = abs(ibmax(j) - ibmin(i)) rj = dble(alen(l)) rnjov1 = rn/(rj*(rn-rj)) if (ibin) then bssbij(l) = rnjov1*(sij1-0.5)**2 else bssbij(l) = rnjov1*(sij1**2) endif else alen(l) = abs(ibmin(j) - ibmax(i)) rj = dble(alen(l)) rnjov1 = rn/(rj*(rn-rj)) if (ibin) then bssbij(l) = rnjov1*(sij2-0.5)**2 else bssbij(l) = rnjov1*(sij2**2) endif endif endif 30 continue 40 continue nb1 = l c Now sort the t-statistics by their magnitude call qsort4(bssbij, loc, 1, nb1) c now go through the blocks in reverse order (largest down) do 100 l = nb1, 1, -1 k = loc(l) c need to check a block only if it has potential to increase bss c rjlo is the smalllest (j-i) in the block and rjhi is the largest bsslim = bssijmax(k) if (bssmax .le. bsslim) then c bi, bj give the block location bi = bloci(k) bj = blocj(k) c max arc length of interest in block alenmax = alen(k) if (bi .eq. 1) then ilo = 1 else ilo = bb(bi-1) + 1 endif ihi = bb(bi) if (bj .eq. 1) then jlo = 1 else jlo = bb(bj-1) + 1 endif jhi = bb(bj) alenhi = jhi - ilo if (alenhi .gt. nal0) alenhi = nal0 rjhi = dble(alenhi) if (bi .eq. bj) then alenlo = 1 else alenlo = jlo - ihi endif if (alenlo .lt. al0) alenlo = al0 rjlo = dble(alenlo) c c if arc length is larger than n/2 make is n - arc length c if (alenmax .gt. n - alenmax) alenmax = n - alenmax c c if alenlo <= n/2 start from (ihi, jlo) and go up c if alenhi >= n/2 start from (ilo, jhi) and go down c if ((rjlo .le. rnov2) .and. (alenlo .le. alenmax)) then do 60 i2j = alenlo, alenmax c excess calcultaions to set range of i ixlo = max(0, jlo - ilo - i2j) ixhi = max(0, ihi + i2j - jhi) sxmx = 0 do 55 i = ilo + ixlo, ihi - ixhi j = i+i2j absx = abs(sx(j) - sx(i)) if (sxmx .lt. absx) then sxmx = absx sxmxi = i endif 55 continue rj = dble(i2j) rnjov1 = rn/(rj*(rn-rj)) if (ibin) then bijbss = rnjov1*(sxmx-0.5)**2 else bijbss = rnjov1*(sxmx**2) endif if (bijbss .gt. bssmax) then bssmax = bijbss tmaxi = sxmxi tmaxj = sxmxi + i2j endif 60 continue endif c c make arclength n - arc length c alenmax = n - alenmax if ((rjhi .ge. rnov2) .and. (alenhi .ge. alenmax)) then do 70 i2j = alenhi, alenmax, -1 c excess calcultaions to set range of i ixlo = max(0, jlo - ilo - i2j) ixhi = max(0, ihi + i2j - jhi) sxmx = 0 do 65 i = ilo + ixlo, ihi - ixhi j = i + i2j absx = abs(sx(j) - sx(i)) if (sxmx .lt. absx) then sxmx = absx sxmxi = i endif 65 continue rj = dble(i2j) rnjov1 = rn/(rj*(rn-rj)) if (ibin) then bijbss = rnjov1*(sxmx-0.5)**2 else bijbss = rnjov1*(sxmx**2) endif if (bijbss .gt. bssmax) then bssmax = bijbss tmaxi = sxmxi tmaxj = sxmxi + i2j endif 70 continue endif endif 100 continue 120 if (ibin) then if (tss.le.0.0001) tss = 1.0 bssmax = bssmax/(tss/rn) else if (tss.le.bssmax+0.0001) tss = bssmax + 1.0 bssmax = bssmax/((tss-bssmax)/(rn-2.0)) endif c deallocate memory deallocate(bpsmax, bpsmin, bb, ibmin, ibmax) deallocate(bssbij, bssijmax, bloci, blocj, loc, alen) ostat = bssmax iseg(1) = tmaxi iseg(2) = tmaxj return end c function for calculating the full max t-statistic on permuted data c new approach to maximizing t-statistic using allocatable arrays double precision function tmaxp(n,tss,px,sx,al0,ibin) integer n,al0 double precision tss,px(n),sx(n) logical ibin c c look at the partial sums in blocks of size sqrt(n) c integer ipsmin, ipsmax, ipsmin0, ipsmax0, nb, i, j, k, l, nb1, 1 nb2, bi, bj, ilo, ihi, jlo, jhi, alenmax, i2j, alenlo, 2 alenhi, ixlo, ixhi, nal0 double precision psum, psmin, psmax, psmin0, psmax0, bssmax, 1 bsslim, rn, rj, rjhi, rjlo, rnjov1, sij1, sij2, sijmx0, 2 absx, sxmx, bijbss, rnov2, psdiff c c use local arrays for working within blocks c block partial sum max and min double precision, allocatable :: bpsmax(:), bpsmin(:) c location of the max and min integer, allocatable :: bb(:), ibmin(:), ibmax(:) c t statistic corresponding to max for block i,j (and max possible) double precision, allocatable :: bssbij(:), bssijmax(:) c row, column and order vector for reordering bssbij integer, allocatable :: bloci(:), blocj(:), loc(:), alen(:) c calculate number of blocks (nb) and block boundaries (vector bb) rn = dble(n) if (n .ge. 50) then nb = nint(sqrt(dble(n))) else nb = 1 endif c the number of paiwise block comparison nb2 = nb*(nb+1)/2 c allocate memory allocate(bpsmax(nb), bpsmin(nb)) allocate(bb(nb), ibmin(nb), ibmax(nb)) allocate(bssbij(nb2), bssijmax(nb2)) allocate(bloci(nb2), blocj(nb2), loc(nb2), alen(nb2)) c block boundaries do 110 i = 1, nb bb(i) = nint(rn*(dble(i)/dble(nb))) 110 continue c find the max, min of partial sums and their locations within blocks ilo = 1 psum = 0 psmin0 = 0 psmax0 = 0 ipsmin0 = n ipsmax0 = n do 20 j = 1, nb sx(ilo) = psum + px(ilo) psmin = sx(ilo) ipsmin = ilo psmax = sx(ilo) ipsmax = ilo do 10 i = ilo+1, bb(j) sx(i) = sx(i-1) + px(i) if (sx(i) .lt. psmin) then psmin = sx(i) ipsmin = i endif if (sx(i) .gt. psmax) then psmax = sx(i) ipsmax = i endif 10 continue c store the block min, max and locations ibmin(j) = ipsmin ibmax(j) = ipsmax bpsmin(j) = psmin bpsmax(j) = psmax c adjust global min, max and locations if (psmin .lt. psmin0) then psmin0 = psmin ipsmin0 = ipsmin endif if (psmax .gt. psmax0) then psmax0 = psmax ipsmax0 = ipsmax endif c reset ilo to be the block boundary + 1 psum = sx(bb(j)) ilo = bb(j) + 1 20 continue c calculate bss for max s_i - min s_i psdiff = psmax0 - psmin0 rj = dble(abs(ipsmax0 - ipsmin0)) rnjov1 = rn/(rj*(rn-rj)) if (ibin) then bssmax = rnjov1*(psdiff-0.5)**2 else bssmax = rnjov1*psdiff**2 endif c for a pair of blocks (i,j) calculate the max absolute t-statistic c at the (min_i, max_j) and (max_i, min_j) locations c for other indices the t-statistic can be bounded using this c c if a block doesn't have the potential to exceed bssmax ignore it c calculate the bsslim for each block and include ones >= bssmax rnov2 = rn/2 l = 0 nal0 = n - al0 do 40 i = 1, nb do 30 j = i, nb c calculate bsslim if (i .eq. 1) then ilo = 1 else ilo = bb(i-1) + 1 endif ihi = bb(i) if (j .eq. 1) then jlo = 1 else jlo = bb(j-1) + 1 endif jhi = bb(j) alenhi = jhi - ilo if (alenhi .gt. nal0) alenhi = nal0 rjhi = dble(alenhi) if (i .eq. j) then alenlo = 1 else alenlo = jlo - ihi endif if (alenlo .lt. al0) alenlo = al0 c max S_k over block j - min S_k over block i sij1 = abs(bpsmax(j) - bpsmin(i)) c max S_k over block i - min S_k over block j sij2 = abs(bpsmax(i) - bpsmin(j)) c if i = j then sij1 and sij2 are the same sijmx0 = max(sij1, sij2) rjlo = dble(alenlo) rnjov1 = rn/min(rjlo*(rn-rjlo), rjhi*(rn-rjhi)) if (ibin) then bsslim = rnjov1*(sijmx0-0.5)**2 else bsslim = rnjov1*(sijmx0**2) endif c if its as large as bssmax add block if (bssmax .le. bsslim) then l = l+1 loc(l) = l bloci(l) = i blocj(l) = j bssijmax(l) = bsslim c max sij in the (i,j) block, t-statistic etc if (sij1 .gt. sij2) then alen(l) = abs(ibmax(j) - ibmin(i)) rj = dble(alen(l)) rnjov1 = rn/(rj*(rn-rj)) if (ibin) then bssbij(l) = rnjov1*(sij1-0.5)**2 else bssbij(l) = rnjov1*(sij1**2) endif else alen(l) = abs(ibmin(j) - ibmax(i)) rj = dble(alen(l)) rnjov1 = rn/(rj*(rn-rj)) if (ibin) then bssbij(l) = rnjov1*(sij2-0.5)**2 else bssbij(l) = rnjov1*(sij2**2) endif endif endif 30 continue 40 continue nb1 = l c Now sort the t-statistics by their magnitude call qsort4(bssbij, loc, 1, nb1) c now go through the blocks in reverse order (largest down) do 100 l = nb1, 1, -1 k = loc(l) c need to check a block only if it has potential to increase bss c rjlo is the smalllest (j-i) in the block and rjhi is the largest bsslim = bssijmax(k) if (bssmax .le. bsslim) then c bi, bj give the block location bi = bloci(k) bj = blocj(k) c max arc length of interest in block alenmax = alen(k) if (bi .eq. 1) then ilo = 1 else ilo = bb(bi-1) + 1 endif ihi = bb(bi) if (bj .eq. 1) then jlo = 1 else jlo = bb(bj-1) + 1 endif jhi = bb(bj) alenhi = jhi - ilo if (alenhi .gt. nal0) alenhi = nal0 rjhi = dble(alenhi) if (bi .eq. bj) then alenlo = 1 else alenlo = jlo - ihi endif if (alenlo .lt. al0) alenlo = al0 rjlo = dble(alenlo) c c if arc length is larger than n/2 make is n - arc length c if (alenmax .gt. n - alenmax) alenmax = n - alenmax c c if alenlo <= n/2 start from (ihi, jlo) and go up c if alenhi >= n/2 start from (ilo, jhi) and go down c if ((rjlo .le. rnov2) .and. (alenlo .le. alenmax)) then do 60 i2j = alenlo, alenmax c excess calcultaions to set range of i ixlo = max(0, jlo - ilo - i2j) ixhi = max(0, ihi + i2j - jhi) sxmx = 0 do 55 i = ilo + ixlo, ihi - ixhi j = i+i2j absx = abs(sx(j) - sx(i)) if (sxmx .lt. absx) sxmx = absx 55 continue rj = dble(i2j) rnjov1 = rn/(rj*(rn-rj)) if (ibin) then bijbss = rnjov1*(sxmx-0.5)**2 else bijbss = rnjov1*(sxmx**2) endif if (bijbss .gt. bssmax) bssmax = bijbss 60 continue endif c c make arclength n - arc length c alenmax = n - alenmax if ((rjhi .ge. rnov2) .and. (alenhi .ge. alenmax)) then do 70 i2j = alenhi, alenmax, -1 c excess calcultaions to set range of i ixlo = max(0, jlo - ilo - i2j) ixhi = max(0, ihi + i2j - jhi) sxmx = 0 do 65 i = ilo + ixlo, ihi - ixhi j = i + i2j absx = abs(sx(j) - sx(i)) if (sxmx .lt. absx) sxmx = absx 65 continue rj = dble(i2j) rnjov1 = rn/(rj*(rn-rj)) if (ibin) then bijbss = rnjov1*(sxmx-0.5)**2 else bijbss = rnjov1*(sxmx**2) endif if (bijbss .gt. bssmax) bssmax = bijbss 70 continue endif endif 100 continue if (ibin) then if (tss.le.0.0001) tss = 1.0 tmaxp = bssmax/(tss/rn) else if (tss.le.bssmax+0.0001) tss = bssmax + 1.0 tmaxp = bssmax/((tss-bssmax)/(rn-2.0)) endif c deallocate memory deallocate(bpsmax, bpsmin, bb, ibmin, ibmax) deallocate(bssbij, bssijmax, bloci, blocj, loc, alen) return end c function for the max (over small arcs) t-statistic on permuted data c new code to speed up this part 3/31/2010 double precision function htmaxp(n,k,tss,px,sx,al0,ibin) integer n,k,al0 double precision tss,px(n),sx(n) logical ibin integer i, j, nmj double precision rn, rj, absx, sxmx, bssmx, psmin, psmax, psdiff, 1 bsslim, rnjov1 c create blocks of size k (or k+1) to span 1 thru n c block partial sum max and min double precision, allocatable :: bpsmax(:), bpsmin(:) c location of the max and min integer, allocatable :: bb(:) c variables to work on block specific data integer nb, ilo, ihi, l double precision psum, psdiffsq rn = dble(n) c number of blocks of size k (plus fraction since n/k may not be integer) nb = int(rn/dble(k)) c allocate memory allocate(bpsmax(nb), bpsmin(nb)) allocate(bb(nb)) c block boundaries do 110 i = 1, nb bb(i) = nint(rn*(dble(i)/dble(nb))) 110 continue c don't need global min and max c find the max, min of partial sums and their locations within blocks ilo = 1 psum = 0 htmaxp = 0.0d0 do 20 j = 1, nb sx(ilo) = psum + px(ilo) psmin = sx(ilo) ipsmin = ilo psmax = sx(ilo) ipsmax = ilo do 10 i = ilo+1, bb(j) sx(i) = sx(i-1) + px(i) if (sx(i) .lt. psmin) then psmin = sx(i) ipsmin = i endif if (sx(i) .gt. psmax) then psmax = sx(i) ipsmax = i endif 10 continue c store the block min, max and locations bpsmin(j) = psmin bpsmax(j) = psmax c reset ilo to be the block boundary + 1 psum = sx(bb(j)) ilo = bb(j) + 1 c calculate the bss at the block max & min pr i = abs(ipsmin - ipsmax) if ((i .le. k) .and. (i .ge. al0)) then rj = dble(i) rnjov1 = rn/(rj*(rn-rj)) if (ibin) then bssmx = rnjov1*(bpsmax(j) - bpsmin(j) -0.5)**2 else bssmx = rnjov1*(bpsmax(j) - bpsmin(j))**2 endif if (htmaxp .lt. bssmx) htmaxp = bssmx endif 20 continue c check the first block ilo = 1 ihi = bb(1) psdiff = bpsmax(1) - bpsmin(1) if (ibin) then psdiffsq = (psdiff-0.5)**2 else psdiffsq = psdiff**2 endif do 40 j = al0,k rj = dble(j) rnjov1 = rn/(rj*(rn-rj)) bsslim = rnjov1*psdiffsq if (bsslim .lt. htmaxp) go to 50 sxmx = 0.0d0 do 30 i = ilo,ihi-j absx = abs(sx(i+j) - sx(i)) if (sxmx.lt.absx) sxmx = absx 30 continue if (ibin) then bssmx = rnjov1*(abs(sxmx)-0.5)**2 else bssmx = rnjov1*sxmx**2 endif if (htmaxp.lt.bssmx) htmaxp = bssmx 40 continue c now the minor arcs spanning the end (n) 50 psdiff = max(abs(bpsmax(1)-bpsmin(nb)), abs(bpsmax(nb)-bpsmin(1))) if (ibin) then psdiffsq = (psdiff-0.5)**2 else psdiffsq = psdiff**2 endif do 70 j = al0,k rj = dble(j) rnjov1 = rn/(rj*(rn-rj)) bsslim = rnjov1*psdiffsq if (bsslim .lt. htmaxp) go to 100 sxmx = 0.0d0 nmj = n-j do 60 i = 1,j absx = abs(sx(i+nmj) - sx(i)) if (sxmx.lt.absx) sxmx = absx 60 continue if (ibin) then bssmx = rnjov1*(abs(sxmx)-0.5)**2 else bssmx = rnjov1*sxmx**2 endif if (htmaxp.lt.bssmx) htmaxp = bssmx 70 continue c now the other blocks 100 do 200 l = 2,nb ilo = bb(l-1)+1 ihi = bb(l) psdiff = bpsmax(l) - bpsmin(l) if (ibin) then psdiffsq = (psdiff-0.5)**2 else psdiffsq = psdiff**2 endif do 140 j = al0,k rj = dble(j) rnjov1 = rn/(rj*(rn-rj)) bsslim = rnjov1*psdiffsq if (bsslim .lt. htmaxp) go to 150 sxmx = 0.0d0 do 130 i = ilo,ihi-j absx = abs(sx(i+j) - sx(i)) if (sxmx.lt.absx) sxmx = absx 130 continue if (ibin) then bssmx = rnjov1*(abs(sxmx)-0.5)**2 else bssmx = rnjov1*sxmx**2 endif if (htmaxp.lt.bssmx) htmaxp = bssmx 140 continue 150 psdiff = max(abs(bpsmax(l)-bpsmin(l-1)), 1 abs(bpsmax(l-1)-bpsmin(l))) if (ibin) then psdiffsq = (psdiff-0.5)**2 else psdiffsq = psdiff**2 endif do 170 j = al0,k rj = dble(j) rnjov1 = rn/(rj*(rn-rj)) bsslim = rnjov1*psdiffsq if (bsslim .lt. htmaxp) go to 200 sxmx = 0.0d0 nmj = n-j do 160 i = ilo-j,ilo-1 absx = abs(sx(i+j) - sx(i)) if (sxmx.lt.absx) sxmx = absx 160 continue if (ibin) then bssmx = rnjov1*(abs(sxmx)-0.5)**2 else bssmx = rnjov1*sxmx**2 endif if (htmaxp.lt.bssmx) htmaxp = bssmx 170 continue 200 continue if (ibin) then if (tss .le. 0.0001d0) tss = 1.0d0 htmaxp = htmaxp/(tss/rn) else if (tss .le. htmaxp+0.0001d0) tss = htmaxp + 1.0d0 htmaxp = htmaxp/((tss-htmaxp)/(rn-2.0d0)) endif c deallocate memory deallocate(bpsmax, bpsmin, bb) return end DNAcopy/src/changepoints-wtd.f0000644000175200017520000001417314516003605017313 0ustar00biocbuildbiocbuildc Ternary segmentation with permutation reference distribution c probes have weights due to differences in variances subroutine wfindcpt(n,x,tss,wts,rwts,cwts,px,sx,nperm,cpval,ncpt, 1 icpt,hybrid,al0,hk,mncwt,delta,ngrid,sbn,sbdry,tol) integer n,nperm,ncpt,icpt(2),al0,hk,ngrid,sbn,sbdry(sbn) logical hybrid double precision x(n),tss,wts(n),rwts(n),cwts(n),px(n),sx(n), 1 cpval,mncwt(hk),delta,tol integer np,nrej,nrejc,iseg(2),n1,n2,n12,l,k double precision ostat,ostat1,pstat,tpval,pval1,pval2 c new functions to replace tmax and htmax (also tmaxo replaces tmax1) double precision tailp, wtmaxp, hwtmaxp, wtpermp external tailp, wtmaxp, hwtmaxp, wtpermp call rndstart() nrej = 0 ncpt = 0 c call the observed statistic routine call wtmaxo(n,x,wts,tss,sx,cwts,iseg,ostat,al0) ostat1 = sqrt(ostat) ostat = ostat * 0.99999 c if maximal t-statistic is too small (for now use 0.1) don't split if (ostat1 .le. 0.1) go to 500 c if maximal t-statistic is too large (for now use 7.0) split c also make sure it's not affected by outliers i.e. small seglength l = min(iseg(2) - iseg(1), n - iseg(2) + iseg(1)) if ((ostat1 .ge. 7.0) .and. (l .ge. 10)) go to 200 c o.w calculate p-value and decide if & how data are segmented if (hybrid) then call getmncwt(n, cwts, hk, mncwt, delta) c delta is a function of arc lengths pval1 = tailp(ostat1, delta, n, ngrid, tol) if (pval1 .gt. cpval) go to 500 pval2 = cpval - pval1 nrejc = int(pval2*dble(nperm)) k=nrejc*(nrejc+1)/2 + 1 do 50 np = 1,nperm c call permutation code for data with weights call wxperm(n,x,px,rwts) c call the small arc permutation statistic function pstat = hwtmaxp(n,hk,px,wts,sx,cwts,mncwt,al0) if (ostat.le.pstat) then nrej = nrej + 1 k = k + 1 endif if (nrej.gt.nrejc) go to 500 if (np .ge. sbdry(k)) go to 200 50 continue else nrejc = int(cpval*dble(nperm)) k=nrejc*(nrejc+1)/2 + 1 do 100 np = 1,nperm c call permutation code for data with weights call wxperm(n,x,px,rwts) c call full data permutation statistic function pstat = wtmaxp(n,px,wts,sx,cwts,al0) if (ostat.le.pstat) then nrej = nrej + 1 k = k + 1 endif if (nrej.gt.nrejc) go to 500 if (np .ge. sbdry(k)) go to 200 100 continue endif 200 if (iseg(2).eq.n) then ncpt = 1 icpt(1) = iseg(1) else if(iseg(1).eq.0) then ncpt = 1 icpt(1) = iseg(2) else l = 1 n1 = iseg(1) n12 = iseg(2) n2 = n12 - n1 tpval = wtpermp(n1,n2,n12,x(l),px,wts(l),rwts(l),nperm) if (tpval.le.cpval) then ncpt = 1 icpt(1) = iseg(1) endif l = iseg(1) + 1 n12 = n - iseg(1) n2 = n - iseg(2) n1 = n12 - n2 tpval = wtpermp(n1,n2,n12,x(l),px,wts(l),rwts(l),nperm) if (tpval.le.cpval) then ncpt = ncpt + 1 icpt(ncpt) = iseg(2) endif endif endif 500 call rndend() return end c ******* code to permute the data vector with weights ******** c since variance of probe i is inversely proportional to weights c multiply by square root, permute and then divide by square root subroutine wxperm(n,x,px,rwts) integer n double precision x(n),px(n),rwts(n) integer i,j double precision cc,tmpx double precision dunif external dunif do 10 i = 1,n px(i) = x(i)*rwts(i) 10 continue do 20 i = n,1,-1 cc = dunif() j = int(cc*dble(i))+1 tmpx = px(i) px(i) = px(j)/rwts(i) px(j) = tmpx 20 continue return end c function for the p-value of t-statistics for removing edge effects double precision function wtpermp(n1,n2,n,x,px,wts,rwts,nperm) integer n1,n2,n,nperm double precision x(n),px(n),wts(n),rwts(n) integer np,i,m1,j,nrej double precision xsum1,xsum2,xbar,ostat,pstat,rn1,rn2,rm1, 1 tstat, tss, rn, cc, tmpx double precision dunif external dunif if (n1.eq.1 .or. n2.eq.1) then nrej = nperm go to 110 endif xsum1 = 0.0 tss = 0.0 rn1 = 0.0 do 10 i=1,n1 px(i) = x(i)*rwts(i) xsum1 = xsum1 + wts(i)*x(i) tss = tss + wts(i)*x(i)**2 rn1 = rn1 + wts(i) 10 continue xsum2 = 0.0 rn2 = 0.0 do 20 i=n1+1,n px(i) = x(i) xsum2 = xsum2 + wts(i)*x(i) tss = tss + wts(i)*x(i)**2 rn2 = rn2 + wts(i) 20 continue rn = rn1 + rn2 xbar = (xsum1 + xsum2)/rn tss = tss - rn*(xbar**2) if (n1.le.n2) then m1 = n1 rm1 = rn1 ostat = 0.99999*abs(xsum1/rn1 - xbar) tstat = (ostat**2)*rn1*rn/rn2 else m1 = n2 rm1 = rn2 ostat = 0.99999*abs(xsum2/rn2 - xbar) tstat = (ostat**2)*rn2*rn/rn1 endif nrej = 0 tstat = tstat/((tss-tstat)/(dble(n)-2.0)) c if observed t is large (> 5) don't bother with permutation p-value c also make sure there are enough observations i.e. m1 >= 10 if ((tstat .gt. 25) .and. (m1 .ge. 10)) go to 110 do 100 np = 1,nperm xsum1 = 0 do 30 i = n,n-m1+1,-1 cc = dunif() j = int(cc*dble(i))+1 tmpx = px(i) px(i) = px(j) px(j) = tmpx c the observation should be divided by sqrt(wts(i)) to get the correct c probe variance. But should be multiplied by wts(i) for statistic xsum1 = xsum1 + px(i)*rwts(i) 30 continue pstat = abs(xsum1/rm1 - xbar) if (ostat.le.pstat) nrej = nrej + 1 100 continue 110 wtpermp = dble(nrej)/dble(nperm) return end DNAcopy/src/changepoints.f0000644000175200017520000001417114516003605016515 0ustar00biocbuildbiocbuildc Ternary segmentation with permutation reference distribution subroutine fndcpt(n,x,tss,px,sx,nperm,cpval,ncpt,icpt,ibin, 1 hybrid,al0,hk,delta,ngrid,sbn,sbdry,tol) integer n,nperm,ncpt,icpt(2),al0,hk,ngrid,sbn,sbdry(sbn) logical ibin,hybrid double precision x(n),tss,px(n),sx(n),cpval,delta,tol integer np,nrej,nrejc,iseg(2),n1,n2,n12,l,k double precision ostat,ostat1,pstat,tpval,pval1,pval2 c new functions to replace tmax and htmax (also tmaxo replaces tmax1) double precision tailp, tmaxp, htmaxp, tpermp external tailp, tmaxp, htmaxp, tpermp call rndstart() nrej = 0 ncpt = 0 c call tmax1(n,twon,x,tss,sx,tx,iseg,ostat,ibin) call tmaxo(n,x,tss,sx,iseg,ostat,al0,ibin) ostat1 = sqrt(ostat) ostat = ostat * 0.99999 c call dblepr("Max Stat",8,ostat,1) c call intpr("Location",8,iseg,2) c if maximal t-statistic is too small (for now use 0.1) don't split if (ostat1 .le. 0.1) go to 500 c if maximal t-statistic is too large (for now use 7.0) split c also make sure it's not affected by outliers i.e. small seglength l = min(iseg(2) - iseg(1), n - iseg(2) + iseg(1)) if ((ostat1 .ge. 7.0) .and. (l .ge. 10)) go to 200 c o.w calculate p-value and decide if & how data are segmented if (hybrid) then pval1 = tailp(ostat1, delta, n, ngrid, tol) if (pval1 .gt. cpval) go to 500 pval2 = cpval - pval1 nrejc = int(pval2*dble(nperm)) k=nrejc*(nrejc+1)/2 + 1 do 50 np = 1,nperm call xperm(n,x,px) c pstat = htmax(n,twon,hk,tss,px,sx,tx,ibin) pstat = htmaxp(n,hk,tss,px,sx,al0,ibin) if (ostat.le.pstat) then nrej = nrej + 1 k = k + 1 endif if (nrej.gt.nrejc) go to 500 if (np .ge. sbdry(k)) go to 200 50 continue else nrejc = int(cpval*dble(nperm)) k=nrejc*(nrejc+1)/2 + 1 do 100 np = 1,nperm call xperm(n,x,px) c pstat = tmax(n,twon,tss,px,sx,tx,ibin) pstat = tmaxp(n,tss,px,sx,al0,ibin) c call dblepr("Perm Max Stat",13,pstat,1) if (ostat.le.pstat) then nrej = nrej + 1 k = k + 1 endif c call intpr("num rej",7,nrej,1) if (nrej.gt.nrejc) go to 500 if (np .ge. sbdry(k)) go to 200 100 continue endif 200 if (iseg(2).eq.n) then ncpt = 1 icpt(1) = iseg(1) else if(iseg(1).eq.0) then ncpt = 1 icpt(1) = iseg(2) else l = 1 n1 = iseg(1) n12 = iseg(2) n2 = n12 - n1 tpval = tpermp(n1,n2,n12,x(l),px,nperm) c call dblepr("binseg p-value",14,tpval,1) if (tpval.le.cpval) then ncpt = 1 icpt(1) = iseg(1) endif l = iseg(1) + 1 n12 = n - iseg(1) n2 = n - iseg(2) n1 = n12 - n2 tpval = tpermp(n1,n2,n12,x(l),px,nperm) c call dblepr("binseg p-value",14,tpval,1) if (tpval.le.cpval) then ncpt = ncpt + 1 icpt(ncpt) = iseg(2) endif endif endif 500 call rndend() return end c code to permute the data vector subroutine xperm(n,x,px) integer n double precision x(n),px(n) integer i,j double precision cc,tmpx double precision dunif external dunif do 10 i = 1,n px(i) = x(i) 10 continue do 20 i = n,1,-1 cc = dunif() j = int(cc*dble(i))+1 tmpx = px(i) px(i) = px(j) px(j) = tmpx 20 continue return end c function for the p-value of t-statistics for removing edge effects double precision function tpermp(n1,n2,n,x,px,nperm) integer n1,n2,n,nperm double precision x(n),px(n) integer np,i,m1,j,nrej double precision xsum1,xsum2,xbar,ostat,pstat,rn1,rn2,rm1, 1 tstat, tss, rn, cc, tmpx double precision dunif external dunif rn1 = dble(n1) rn2 = dble(n2) rn = rn1 + rn2 if (n1.eq.1 .or. n2.eq.1) then nrej = nperm go to 110 endif xsum1 = 0.0 tss = 0.0 do 10 i=1,n1 px(i) = x(i) xsum1 = xsum1 + x(i) tss = tss + x(i)**2 10 continue xsum2 = 0.0 do 20 i=n1+1,n px(i) = x(i) xsum2 = xsum2 + x(i) tss = tss + x(i)**2 20 continue xbar = (xsum1 + xsum2)/rn tss = tss - rn*(xbar**2) if (n1.le.n2) then m1 = n1 rm1 = rn1 ostat = 0.99999*abs(xsum1/rn1 - xbar) tstat = (ostat**2)*rn1*rn/rn2 else m1 = n2 rm1 = rn2 ostat = 0.99999*abs(xsum2/rn2 - xbar) tstat = (ostat**2)*rn2*rn/rn1 endif c call dblepr("O-Stat",6,ostat,1) nrej = 0 tstat = tstat/((tss-tstat)/(rn-2.0)) c call dblepr("T-square",8,tstat,1) c if observed t is large (> 5) don't bother with permutation p-value c also make sure there are enough observations i.e. m1 >= 10 if ((tstat .gt. 25) .and. (m1 .ge. 10)) go to 110 do 100 np = 1,nperm c******************************************* c the following is very inefficient c******************************************* c call xperm(n,x,px) c xsum1 = 0.0 c do 30 i=1,m1 c xsum1 = xsum1 + px(i) c 30 continue c******************************************* c changed to the following: instead of c full permutation sample m1 w.o. repl c******************************************* xsum1 = 0 do 30 i = n,n-m1+1,-1 cc = dunif() j = int(cc*dble(i))+1 tmpx = px(i) px(i) = px(j) px(j) = tmpx xsum1 = xsum1 + px(i) 30 continue pstat = abs(xsum1/rm1 - xbar) c call dblepr("P-Stat",6,pstat,1) if (ostat.le.pstat) nrej = nrej + 1 100 continue 110 tpermp = dble(nrej)/dble(nperm) return end DNAcopy/src/esegment.f0000644000175200017520000000250314516003605015636 0ustar00biocbuildbiocbuildc for binary segmentation of exon data re-use the segment.p code c with one-sided p-value subroutine esegp(n, exndat, ostat, eloc, pval, ng, tol) integer n, eloc, ng double precision exndat(n), ostat, pval, tol double precision btailp external btailp integer i double precision tss tss = 0 do 10 i = 1, n tss = tss + exndat(i)**2 10 continue call etmax(n, exndat, tss, ostat, eloc) c call dblepr("Max Stat",8,ostat,1) pval = btailp(ostat, n, ng, tol) pval = pval/2 if (pval .gt. 1) pval = 1.0d0 return end c looking for increase in expression - use a one-sided t-statistic c t_i = S_i*sqrt(n/(i*(n-i)))/sqrt((tss - S_i^2*n/(i*(n-i)))/(n-2)) subroutine etmax(n, x, tss, ostat, eloc) integer n, eloc double precision x(n), tss, ostat integer i double precision sumxi, btmaxi, dn, di sumxi = x(1) ostat = 0.0 eloc = -1 dn = dble(n) di = 1.0 do 20 i = 2,n-2 di = di + 1.0 sumxi = sumxi + x(i) btmaxi = -sumxi/sqrt(di*(dn-di)) if (ostat .lt. btmaxi) then ostat = btmaxi eloc = i endif 20 continue ostat = (ostat/sqrt(tss - dn*ostat**2))*sqrt(dn*(dn-2)) return end DNAcopy/src/flchoose.c0000644000175200017520000000023114516003605015622 0ustar00biocbuildbiocbuild#include #include /* Fortran function for log-combinations */ double F77_SUB(flchoose)(double *n, double *k) { return lchoose(*n, *k); } DNAcopy/src/fphyper.c0000644000175200017520000000027414516003605015504 0ustar00biocbuildbiocbuild#include #include /* Fortran function for hypergeometric CDF */ double F77_SUB(fphypr)(double *i, double *m, double *n, double *k) { return phyper(*i, *m, *n, *k, 1, 0); } DNAcopy/src/fpnorm.c0000644000175200017520000000022514516003605015324 0ustar00biocbuildbiocbuild#include #include /* Fortran function for standard normal CDF */ double F77_SUB(fpnorm)(double *x) { return pnorm(*x, 0, 1, 1, 0); } DNAcopy/src/getbdry.f0000644000175200017520000000665514516003605015503 0ustar00biocbuildbiocbuild subroutine getbdry(eta, m, nperm, mb, ibdry, etastr, tol) integer m, nperm, mb, ibdry(mb) double precision eta, etastr(m), tol double precision eta0, etalo, etahi, plo, phi, pexcd integer j, l l = 1 ibdry(1) = nperm-int(dble(nperm)*eta) etastr(1) = eta eta0 = eta do 20 j = 2,m etahi = eta0*1.1 call etabdry(nperm, etahi, j, ibdry(l+1)) call pexceed(nperm, j, ibdry(l+1), phi) etalo = eta0*0.25 call etabdry(nperm, etalo, j, ibdry(l+1)) call pexceed(nperm, j, ibdry(l+1), plo) do 10 while ((etahi-etalo)/etalo .gt. tol) eta0 = etalo + (etahi-etalo)*(eta-plo)/(phi-plo) call etabdry(nperm, eta0, j, ibdry(l+1)) call pexceed(nperm, j, ibdry(l+1), pexcd) if (pexcd .gt. eta) then etahi = eta0 phi = pexcd else etalo = eta0 plo = pexcd endif 10 continue etastr(j) = eta0 l = l+j 20 continue return end subroutine etabdry(nperm, eta0, n1s, ibdry) integer nperm, n1s, ibdry(n1s) double precision eta0 double precision fphypr external fphypr integer i, k double precision di, dn, dn1s, dk, tprob dn1s = dble(n1s) dn = dble(nperm-n1s) k = 0 dk = 0.0d0 do 10 i = 1, nperm di = dble(i) tprob = fphypr(dk, dn1s, dn, di) if (tprob .le. eta0) then k = k+1 dk = dk + 1.0d0 ibdry(k) = i endif 10 continue return end subroutine pexceed(nperm, n1s, ibdry, pexcd) integer nperm, n1s, ibdry(n1s) double precision pexcd double precision dn, dk, dn1, dk1, dn2, dk2, dn3, dk3, dlcnk integer i double precision flchoose external flchoose dn = dble(nperm) dk = dble(n1s) dn1 = dble(nperm-ibdry(1)) dlcnk = flchoose(dn, dk) pexcd = exp(flchoose(dn1, dk) - dlcnk) if (n1s .ge. 2) then dn1 = dble(ibdry(1)) dn = dble(nperm-ibdry(2)) dk = dble(n1s-1) pexcd = pexcd + exp(log(dn1) + flchoose(dn, dk) - dlcnk) endif if (n1s .ge. 3) then dn1 = dble(ibdry(1)) dn2 = dble(ibdry(2)) dn = dble(nperm-ibdry(3)) dk = dble(n1s-2) pexcd = pexcd + 1 exp(log(dn1) + log(dn1-1.0) - log(2.0) + 2 flchoose(dn, dk) - dlcnk) + 3 exp(log(dn1) + log(dn2-dn1) + flchoose(dn, dk) - dlcnk) endif if (n1s .gt. 3) then do 10 i = 4, n1s dn1 = dble(ibdry(i-3)) dk1 = dble(i-1) dk2 = dble(i-2) dk3 = dble(i-3) dn2 = dble(ibdry(i-2)) dn3 = dble(ibdry(i-1)) dn = dble(nperm-ibdry(i)) dk = dble(n1s-i+1) pexcd = pexcd + 1 exp(flchoose(dn1, dk1) + flchoose(dn, dk) - dlcnk) + 2 exp(flchoose(dn1, dk2) + log(dn3-dn1) + 3 flchoose(dn, dk) - dlcnk) + 4 exp(flchoose(dn1, dk3) + log(dn2-dn1) + log(dn3-dn2) + 3 flchoose(dn, dk) - dlcnk) + 5 exp(flchoose(dn1, dk3) + log(dn2-dn1) - log(2.0) + 6 log(dn2-dn1-1.0) + flchoose(dn, dk) - dlcnk) 10 continue endif return end DNAcopy/src/init.c0000644000175200017520000000346114516003605014773 0ustar00biocbuildbiocbuild#include #include // for NULL #include /* NOTE: Fortran is not case sensitive; But in this file F77_NAME has to be in lower case to prevent "undefined symbol: smoothLR_" error */ /* .Fortran calls */ extern void F77_NAME(bsegci)(void *, void *, void *, void *, void *, void *, void *, void *, void *); extern void F77_NAME(bsegp)(void *, void *, void *, void *, void *, void *); extern void F77_NAME(esegp)(void *, void *, void *, void *, void *, void *, void *); extern void F77_NAME(fndcpt)(void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *); extern void F77_NAME(getbdry)(void *, void *, void *, void *, void *, void *, void *); extern void F77_NAME(prune)(void *, void *, void *, void *, void *, void *, void *, void *, void *, void *); extern void F77_NAME(smoothlr)(void *, void *, void *, void *, void *, void *, void *, void *); extern void F77_NAME(wfindcpt)(void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *); static const R_FortranMethodDef FortranEntries[] = { {"bsegci", (DL_FUNC) &F77_NAME(bsegci), 9}, {"bsegp", (DL_FUNC) &F77_NAME(bsegp), 6}, {"esegp", (DL_FUNC) &F77_NAME(esegp), 7}, {"fndcpt", (DL_FUNC) &F77_NAME(fndcpt), 18}, {"getbdry", (DL_FUNC) &F77_NAME(getbdry), 7}, {"prune", (DL_FUNC) &F77_NAME(prune), 10}, {"smoothLR", (DL_FUNC) &F77_NAME(smoothlr), 8}, {"wfindcpt", (DL_FUNC) &F77_NAME(fndcpt), 21}, {NULL, NULL, 0} }; void R_init_clinfun(DllInfo *dll) { R_registerRoutines(dll, NULL, NULL, FortranEntries, NULL); R_useDynamicSymbols(dll, FALSE); } DNAcopy/src/prune.f0000644000175200017520000000561114516003605015163 0ustar00biocbuildbiocbuild subroutine prune(n,x,nseg,lseg,pcut,sx,ncpt,loc,loc1,pncpt) integer n, nseg, lseg(nseg), ncpt, loc(ncpt), loc1(2,ncpt), pncpt double precision x(n), pcut, sx(nseg) integer i, j, k, kmj double precision ssq, wssqk, wssq1, wssqj logical jleft double precision errssq external errssq ssq = 0.0 do 10 i = 1,n ssq = ssq + x(i)**2 10 continue k = 0 do 15 i = 1,nseg sx(i) = 0 do 14 j = 1,lseg(i) k = k + 1 sx(i) = sx(i) + x(k) 14 continue 15 continue k = nseg - 1 do 16 i = 1,k loc(i) = i loc1(2,i) = i 16 continue wssqk = ssq - errssq(nseg,lseg,sx,k,loc) do 100 j = k-1, 1, -1 kmj = k - j jleft = .TRUE. do 20 i = 1,j loc(i) = i loc1(1,i) = i 20 continue wssqj = ssq - errssq(nseg,lseg,sx,j,loc) do 30 while(jleft) call combn(j, kmj, loc, jleft) wssq1 = ssq - errssq(nseg,lseg,sx,j,loc) if (wssq1 .le. wssqj) then wssqj = wssq1 do 25 i = 1,j loc1(1,i) = loc(i) 25 continue endif 30 continue if (wssqj/wssqk .gt. 1+pcut) then pncpt = j+1 do 35 i = 1,pncpt loc(i) = loc1(2,i) 35 continue return else do 40 i = 1,j loc1(2,i) = loc1(1,i) 40 continue endif 100 continue pncpt = 0 return end double precision function errssq(nseg,lseg,sx,k,loc) integer nseg, lseg(nseg),k,loc(k) double precision sx(nseg) double precision segsx integer segnx, i, j errssq = 0.0 segsx = 0.0 segnx = 0 do 10 i = 1,loc(1) segsx = segsx + sx(i) segnx = segnx + lseg(i) 10 continue errssq = errssq + segsx**2/dble(segnx) do 20 j = 2,k segsx = 0.0 segnx = 0 do 15 i = loc(j-1)+1,loc(j) segsx = segsx + sx(i) segnx = segnx + lseg(i) 15 continue errssq = errssq + segsx**2/dble(segnx) 20 continue segsx = 0.0 segnx = 0 do 25 i = loc(k)+1,nseg segsx = segsx + sx(i) segnx = segnx + lseg(i) 25 continue errssq = errssq + segsx**2/dble(segnx) return end c c This program generates Choose(n,r) combinations one at a time c Adapted from Algorithm AS 88 Appl. Statist. (1975) Vol.24, No. 3 c subroutine combn(r, nmr, loc, rleft) integer r, nmr, loc(r) logical rleft integer i,j i = r do 10 while (loc(i) .eq. nmr+i) i = i-1 10 continue loc(i) = loc(i) + 1 do 20 j = i+1,r loc(j) = loc(j-1)+1 20 continue if (loc(1) .eq. nmr+1) rleft = .FALSE. return end DNAcopy/src/rshared.c0000644000175200017520000000024114516003605015451 0ustar00biocbuildbiocbuild#include void F77_SUB(rndstart)(void) { GetRNGstate(); } void F77_SUB(rndend)(void) { PutRNGstate(); } double F77_SUB(dunif)(void) { return unif_rand(); } DNAcopy/src/segmentp.f0000644000175200017520000000417614516003605015661 0ustar00biocbuildbiocbuild subroutine bsegp(n, gendat, ostat, pval, ng, tol) integer n, ng double precision gendat(n), ostat, pval, tol double precision btmax, btailp external btmax, btailp ostat = btmax(n, gendat) c call dblepr("Max Stat",8,ostat,1) pval = btailp(ostat, n, ng, tol) if (pval .gt. 1) pval = 1.0d0 return end double precision function btmax(n, x) integer n double precision x(n) integer i double precision sumxi, btmaxi, dn, di, ostat sumxi = x(1) ostat = 0.0 dn = dble(n) di = 1.0 do 20 i = 2,n-2 di = di + 1.0 sumxi = sumxi + x(i) btmaxi = dn*(sumxi**2)/(di*(dn-di)) if (ostat .lt. btmaxi) then ostat = btmaxi c ibseg = i endif 20 continue btmax = sqrt(ostat) return end c pseudo confidence interval based on permutations subroutine bsegci(n, k, sumxk, x, px, sr, vfact, nperm, bsloc) integer n, k, sr(2), nperm, bsloc(nperm) double precision sumxk, x(n), px(n), vfact(n) integer k1, nk, np, ibseg call rndstart() k1 = k+1 nk = n-k do 10 np = 1, nperm call xperm(k,x,px) call xperm(nk,x(k1),px(k1)) call btmxci(n,k,sr,px,vfact,ibseg,sumxk) bsloc(np) = ibseg 10 continue call rndend() return end subroutine btmxci(n,k,sr,x,vfact,ibseg,sumxk) integer n,k,sr(2),ibseg double precision x(n),vfact(n),sumxk integer i double precision sumxi, ostat, btmaxi ostat = vfact(k)*(sumxk**2) ibseg = k sumxi = sumxk do 10 i = k-1,sr(1),-1 sumxi = sumxi - x(i+1) btmaxi = vfact(i)*(sumxi**2) if (ostat .lt. btmaxi) then ostat = btmaxi ibseg = i endif 10 continue sumxi = sumxk do 20 i = k+1,sr(2) sumxi = sumxi + x(i) btmaxi = vfact(i)*(sumxi**2) if (ostat .lt. btmaxi) then ostat = btmaxi ibseg = i endif 20 continue ostat = sqrt(ostat) return end DNAcopy/src/smoothCNA.f0000644000175200017520000000623214516003605015665 0ustar00biocbuildbiocbuildc n = length(gdat) i.e. number of markers and log-ratio c k is the neighborhood width c oSD = how far the outlier is to the nearest observation c sSD = how close should it be moved c nchr = number of chromosomes c cfrq = number of probes in respective chromosomes subroutine smoothLR(n, gdat, nchr, cfrq, sgdat, k, oSD, sSD) integer n, nchr, cfrq(nchr), k double precision gdat(n), sgdat(n), oSD, sSD integer i, j, ilo, ihi, k1, k2, j1, ic, cilo, cihi double precision mnnbd, mxnbd, distij, xmed c temporary array for finding median double precision, allocatable :: xnbhd(:) k2 = 2*k + 1 allocate(xnbhd(k2)) c initial values for start and end of chromosomes cilo = 1 cihi = 0 c loop over chromomsomes do 100 ic = 1, nchr c end of the current chromosome cihi = cihi + cfrq(ic) do 50 i = cilo, cihi c range of the neighborhood ilo = max(cilo, i-k) ihi = min(cihi, i+k) c check if ith observation is an outlier c initialize the distances to be large mxnbd = 100*oSD mnnbd = 100*oSD do 10 j = ilo, ihi if (j .ne. i) then c calculate distance from between ith and jth obsn distij = gdat(i) - gdat(j) c if distance is less than oSD no smoothing necessary if (abs(distij) .le. oSD) then sgdat(i) = gdat(i) go to 50 c otherwise calculate distances from above and below else c mxnbd is distance from above if (distij .lt. mxnbd) mxnbd = distij c mnnbd is distance from below if (-distij .lt. mnnbd) mnnbd = -distij endif endif 10 continue c if all the points in the nbhd are above than mxnbd will be negative c and mnnbd will be greater than oSD. Vice versa if all points below c c If both are negative then the ith point is singleton in the middle c but distance oSD away from all points in the nbhd. No smoothing done. if ((mxnbd .le. 0) .and. (mnnbd .le. 0)) then sgdat(i) = gdat(i) go to 50 else c calculate the median of the nbhd c number of points in the nbhd k1 = ihi - ilo + 1 c get the data into temporary array do 20 j = ilo, ihi xnbhd(j-ilo+1) = gdat(j) 20 continue c sort the data call qsort3(xnbhd, 1, k1) c median is the midpoint if n is odd and average of the two if even j1 = k1/2 if (k1 .eq. 2*j1) then xmed = (xnbhd(j1) + xnbhd(j1+1))/2 else xmed = xnbhd(j1+1) endif c if point is above the nbhd bring it down if (mxnbd .gt. 0) sgdat(i) = xmed + sSD c if point is below the nbhd bring it up if (mnnbd .gt. 0) sgdat(i) = xmed - sSD endif 50 continue c beginning of next chromosome cilo = cilo + cfrq(ic) 100 continue deallocate(xnbhd) return end DNAcopy/src/tailprobs.f0000644000175200017520000000601614516003605016031 0ustar00biocbuildbiocbuildc tail probability of circular binary segmentation statistic c from Siegmund (1988) or Yao (1989) paper double precision function tailp(b, delta, m, ngrid, tol) double precision b, delta, tol integer m, ngrid c it1tsq is the integral of 1/(t*(1-t))**2 double precision nu, it1tsq external nu, it1tsq double precision t, tl, dincr, bsqrtm, x, nux integer i dincr = (0.5d0 - delta)/dble(ngrid) bsqrtm = b/sqrt(dble(m)) tl = 0.5d0 - dincr t = 0.5d0 - 0.5d0*dincr tailp = 0.0d0 do 10 i = 1,ngrid tl = tl + dincr t = t + dincr x = bsqrtm/sqrt(t*(1-t)) nux = nu(x, tol) tailp = tailp + (nux**2)*it1tsq(tl, dincr) 10 continue tailp = 9.973557d-2*(b**3)*exp(-b**2/2)*tailp c since test is two-sided need to multiply tailp by 2 tailp = 2.0d0*tailp return end c integral of 1/(t*(1-t))**2 from x to x+a double precision function it1tsq(x, a) double precision x, a double precision y y = x + a - 0.5d0 it1tsq = (8.0d0*y)/(1.0d0 - 4.0d0*y**2) + 1 2.0d0*log((1.0d0 + 2.0d0*y)/(1.0d0 - 2.0d0*y)) y = x - 0.5d0 it1tsq = it1tsq - (8.0d0*y)/(1.0d0 - 4.0d0*y**2) - 1 2.0d0*log((1.0d0 + 2.0d0*y)/(1.0d0 - 2.0d0*y)) return end double precision function nu(x, tol) double precision x, tol double precision fpnorm external fpnorm double precision lnu0, lnu1, dk, xk integer i, k if (x .gt. 0.01d0) then lnu1 = log(2.0d0) - 2*log(x) lnu0 = lnu1 k = 2 dk = 0 do 10 i = 1, k dk = dk + 1 xk = -x*sqrt(dk)/2.0d0 lnu1 = lnu1 - 2.0d0*fpnorm(xk)/dk 10 continue do 50 while (dabs((lnu1-lnu0)/lnu1) .gt. tol) lnu0 = lnu1 do 20 i = 1,k dk = dk + 1 xk = -x*sqrt(dk)/2.0d0 lnu1 = lnu1 - 2.0d0*fpnorm(xk)/dk 20 continue k = 2*k 50 enddo else lnu1 = -0.583d0*x endif nu = exp(lnu1) return end c tail probability of binary segmentation statistic c from page 387 of Siegmund (1986) paper double precision function btailp(b, m, ng, tol) integer m, ng double precision b, tol double precision ll, ul, dincr, nulo, nuhi, x, x1, dm integer i, k double precision fpnorm, nu external fpnorm, nu dm = dble(m) k = 2 ll = b*sqrt(1.0/dble(m-k) - 1.0/dble(m)) ul = b*sqrt(1.0/dble(k) - 1.0/dble(m)) dincr = (ul - ll)/dble(ng) btailp = 0.0 x = ll x1 = x + (b**2)/(dm*x) nulo = nu(x1, tol)/x do 10 i = 1, ng x = x + dincr x1 = x + (b**2)/(dm*x) nuhi = nu(x1, tol)/x btailp = btailp + (nuhi + nulo)*dincr nulo = nuhi 10 continue btailp = b*exp(-b**2/2)*btailp/2.506628275 btailp = btailp + 2*(1.0-fpnorm(b)) return end DNAcopy/tests/0000755000175200017520000000000014516003605014233 5ustar00biocbuildbiocbuildDNAcopy/tests/redundancy,20090610,segment.R0000644000175200017520000000727314516003605021060 0ustar00biocbuildbiocbuild###################################################################### # Type: Redundancy test # Created by: Henrik Bengtsson # Created on: 2009-06-10 ###################################################################### # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - # Startup # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - library("DNAcopy") # Record current random seed sample(1) # Assert that a random seed exists oldSeed <- .Random.seed # Alway use the same random seed set.seed(0xbeef) # Tolerance (maybe decrease?) tol <- .Machine$double.eps^0.5 print(sessionInfo()) # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - # Simulating copy-number data # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - # Number of loci J <- 1000 x <- sort(runif(J, min=0, max=1000)) w <- runif(J) mu <- double(J) jj <- (200 <= x & x < 300) mu[jj] <- mu[jj] + 1 jj <- (650 <= x & x < 800) mu[jj] <- mu[jj] - 1 w[jj] <- 0.001 eps <- rnorm(J, sd=1/2) y <- mu + eps # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - # Setting up a raw CNA object # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - cnR <- CNA( genomdat = y, chrom = rep(1, times=J), maploc = x, data.type = "logratio", sampleid = "SampleA" ) print(cnR) # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - # Test: Non-weighted segmentation # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - t <- system.time({ fitR <- segment(cnR, verbose=1) }) cat("Processing time:\n") print(t) print(fitR) # Expected results # These were obtained by dput(fitR$output) using DNAcopy v1.19.0 truth <- structure(list(ID = c("SampleA", "SampleA", "SampleA", "SampleA", "SampleA"), chrom = c(1, 1, 1, 1, 1), loc.start = c(1.36857712641358, 201.604291098192, 303.775111911818, 650.741211604327, 800.302447052673 ), loc.end = c(199.083976913244, 301.066882908344, 647.42697100155, 798.971758922562, 999.329038895667), num.mark = c(209, 105, 337, 138, 211), seg.mean = c(0.0256, 1.0099, -0.0084, -0.9792, -0.0289 )), .Names = c("ID", "chrom", "loc.start", "loc.end", "num.mark", "seg.mean"), row.names = c(NA, -5L), class = "data.frame") stopifnot(all.equal(fitR$output, truth, tolerance=tol)) # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - # Test: Weighted segmentation # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - t <- system.time({ fitR <- segment(cnR, weights=w, verbose=1) }) cat("Processing time:\n") print(t) print(fitR) # Expected results # These were obtained by dput(fitR$output) using DNAcopy v1.19.0 truth <- structure(list(ID = c("SampleA", "SampleA", "SampleA"), chrom = c(1, 1, 1), loc.start = c(1.36857712641358, 201.604291098192, 303.775111911818 ), loc.end = c(199.083976913244, 301.066882908344, 999.329038895667 ), num.mark = c(209, 105, 686), seg.mean = c(0.0259, 1.0004, -0.0233)), .Names = c("ID", "chrom", "loc.start", "loc.end", "num.mark", "seg.mean"), row.names = c(NA, -3L), class = "data.frame") stopifnot(all.equal(fitR$output, truth, tolerance=tol)) # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - # Cleanup # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - # Reset to previous random seed .Random.seed <- oldSeed print(sessionInfo()) ###################################################################### # HISTORY # 2009-06-10 # o ROBUSTNESS: Added this test to assert that DNAcopy v1.19.2 and # newer will numerically give the same results as DNAcopy v1.19.0. # This test is ran each time with R CMD check. # o Created. ###################################################################### DNAcopy/vignettes/0000755000175200017520000000000014516030315015077 5ustar00biocbuildbiocbuildDNAcopy/vignettes/DNAcopy.Rnw0000644000175200017520000001560514516003605017075 0ustar00biocbuildbiocbuild%\VignetteIndexEntry{DNAcopy} %\VignetteDepends{} %\VignetteKeywords{DNA Copy Number Analysis} %\VignettePackage{DNAcopy} \documentclass[11pt]{article} \usepackage{amsmath} \usepackage[authoryear,round]{natbib} \usepackage{hyperref} \SweaveOpts{echo=FALSE} \setlength{\textheight}{8.5in} \setlength{\textwidth}{6in} \setlength{\topmargin}{-0.25in} \setlength{\oddsidemargin}{0.25in} \setlength{\evensidemargin}{0.25in} \begin{document} \setkeys{Gin}{width=0.99\textwidth} \title{\bf DNAcopy: A Package for Analyzing DNA Copy Data} \author{Venkatraman E. Seshan$^1$ and Adam B. Olshen$^2$} \maketitle \begin{center} $^1$Department of Epidemiology and Biostatistics\\ Memorial Sloan-Kettering Cancer Center\\ {\tt seshanv@mskcc.org}\\ \ \\ $^2$Department of Epidemiology and Biostatistics\\ University of California, San Francisco\\ {\tt olshena@biostat.ucsf.edu} \end{center} \tableofcontents %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \section{Overview} This document presents an overview of the {\tt DNAcopy} package. This package is for analyzing array DNA copy number data, which is usually (but not always) called array Comparative Genomic Hybridization (array CGH) data \citep{pinkel98, snijders01, wigler03}. It implements our methodology for finding change-points in these data \citep{olshen04}, which are points after which the (log) test over reference ratios have changed location. Our model is that the change-points correspond to positions where the underlying DNA copy number has changed. Therefore, change-points can be used to identify regions of gained and lost copy number. We also provide a function for making relevant plots of these data. \section{Data} We selected a subset of the data set presented in \cite{snijders01}. We are calling this data set {\tt coriell}. The data correspond to two array CGH studies of fibroblast cell strains. In particular, we chose the studies {\bf GM05296} and {\bf GM13330}. After selecting only the mapped data from chromosomes 1-22 and X, there are 2271 data points. There is accompanying spectral karyotype data (not included), which can serve as a gold standard. The data can be found at \\ \url{http://www.nature.com/ng/journal/v29/n3/suppinfo/ng754_S1.html} \section{An Example} Here we perform an analysis on the {\bf GM05296} array CGH study described above. <>= library(DNAcopy) @ <>= data(coriell) @ \noindent Before segmentation the data needs to be made into a CNA object. <>= CNA.object <- CNA(cbind(coriell$Coriell.05296), coriell$Chromosome,coriell$Position, data.type="logratio",sampleid="c05296") @ \noindent We generally recommend smoothing single point outliers before analysis. It is a good idea to check that the smoothing is proper for a particular data set. <>= smoothed.CNA.object <- smooth.CNA(CNA.object) @ \noindent After smoothing, if necessary, the segmentation is run. Here the default parameters are used. A brief discussion of parameters that can be adjusted is in the Tips section. <>= segment.smoothed.CNA.object <- segment(smoothed.CNA.object, verbose=1) @ %Plot whole studies \noindent There are a number of plots that can be made. The first is ordering the data by chromosome and map positons. The red lines correspond to mean values in segments. Note that the points are in alternate colors to indicate different chromosomes. \pagebreak \begin{center} <>= plot(segment.smoothed.CNA.object, plot.type="w") @ \end{center} \noindent Another possibility is to plot by chromosome within a study. \begin{center} <>= plot(segment.smoothed.CNA.object, plot.type="s") @ \end{center} %Plot each chromosome across studies (6 per page) %\begin{center} %<>= %plot(segment.smoothed.CNA.object, plot.type="c", % cbys.layout=c(2,1), % cbys.nchrom=6) %@ %\end{center} %Plot by plateaus \noindent If there are multiple studies, one could plot by chromosome across studies using the option {\tt plot.type='c'}. A final plot orders the segment by their chromosome means. One can take the plateaus in this plot to determine what the mean values should be for calling segments gains or losses. In this case, maybe $0.4$ for gains and $-0.6$ for losses. For most data, these plateaus are much closer to zero. The next generation of this software will have automatic methods for calling gains and losses. \begin{center} <>= plot(segment.smoothed.CNA.object, plot.type="p") @ \end{center} \noindent Change-points are often found due to local trends in the data. An undo method is needed to get rid of unnecessary change-points. Below all splits that are not at least three SDs apart are removed. The following plot shows that all splits not corresponding to the gold standard results have been removed. <>= sdundo.CNA.object <- segment(smoothed.CNA.object, undo.splits="sdundo", undo.SD=3,verbose=1) @ \begin{center} <>= plot(sdundo.CNA.object,plot.type="s") @ \end{center} \section{Tips} \noindent A function that may be of interest that has not been mentioned is {\tt subset.CNA}. It allows for subsetting of a CNA object by chromosome and sample so that segmentation does not have to be run on a whole data set. Similarly, {\tt subset.DNAcopy} allows subsetting of DNAcopy objects, which contain the output of segmentation. The original default segmentation algorithm, because it was based on permutation, took $O(N^2)$ computations, where $N$ is the number of markers on a chromosome. The new default algorithm is much faster. It includes a hybrid approach to compute the $p$-value for segmenting based partly on permutation and partly on a Gaussian approximation (available in all versions after 1.2.0) and a stopping rule (available in all versions after 1.5.0) to declare change when there is a strong evidence for its presence \citep{venkat07}. We no longer recommend using overlapping windows for larger data sets. It is still possible to run the full permutations analysis using the option {\tt p.method='perm'}. If the new algorithm is still too slow, one can reduce the number of permutations in the hybrid method using the parameter {\tt nperm} (default is 10,000). However, the lower {\tt alpha} (the significance level for the test to accept change-points) is, the more permutations that are needed. The stopping boundary needs to be computed for any choice of {\tt nperm} and {\tt alpha} which is not the default which is done automatically within the function {\tt segment} or can be done externally using the function {\tt getbdry} and passed on to {\tt segment}. %\newpage \bibliographystyle{apalike} \bibliography{DNAcopy} \end{document} DNAcopy/vignettes/DNAcopy.bib0000644000175200017520000000457414516003605017066 0ustar00biocbuildbiocbuild @ARTICLE{pinkel98, Author = {D. Pinkel and R. Segraves and D. Sudar and S. Clark and I. Poole and D. Kowbel and C. Collins and W. L. Kuo and C. Chen and Y. Zhai and S. H. Dairkee and B. M. Ljung and J. W. Gray and D. G. Albertson}, Journal = {Nat. Genet.}, Title = {High resolution analysis of DNA copy number variation using comparative genomic hybridization to microarrays}, Year = {1998}, volume = {20}, OPTnumber = {}, pages = {207-211} } @ARTICLE{snijders01, Author = {A. M. Snijders and N. Nowak and R. Segraves and S. Blackwood and N. Brown and J. Conroy and G. Hamilton and A. K. Hindle and B. Huey and K. Kimura and S. Law S and K. Myambo and J. Palmer and B. Ylstra and J. P. Yue and J. W. Gray and A. N. Jain and D. Pinkel and D. G. Albertson}, Journal = {Nat. Genet.}, Title = {Assembly of microarrays for genome-wide measurement of DNA copy number}, Year = {2001}, volume = {29}, OPTnumber = {3}, pages = {263-4} } @ARTICLE{wigler03, Author = {R. Lucito and J. Healey and J. Alexander and A. Reiner and D. Esposito and M. Chi and L. Rodgers and A. Brady and J. Sebat and J. Troge and JA West and S. Rostan and KC Nguyen and S. Powers and KQ Ye and A. Olshen and E. Venkatraman and L. Norton and M. Wigler}, Journal = {Nat. Genet.}, Title = {Representational oligonucleotide microarray analysis: a high resolution method to detect genome copy number variation}, Year = {2003}, volume = {13}, OPTnumber = {10}, pages = {2291-305} } @ARTICLE{olshen04, Author = {A. B. Olshen and E. S. Venkatraman and R. Lucito and M. Wigler}, Journal = {Biostatistics}, Title = {Circular binary segmentation for the analysis of array-based DNA copy number data}, Year = {2004}, volume = {5}, OPTnumber = {4}, pages = {557-72} } @ARTICLE{venkat07, Author = {E. S. Venkatraman and A. B. Olshen}, Journal = {Bioinformatics}, Title = {A faster circular binary segmentation algorithm for the analysis of array CGH data}, Year = {2007}, volume = {23}, OPTnumber = {6}, pages = {657-63} }