NetSAM/DESCRIPTION0000644000175400017540000000205213746150015014376 0ustar00biocbuildbiocbuildPackage: NetSAM Type: Package Title: Network Seriation And Modularization Version: 1.30.0 Date: 2014-01-23 Author: Jing Wang Maintainer: Bing Zhang Description: The NetSAM (Network Seriation and Modularization) package takes an edge-list representation of a network as an input, performs network seriation and modularization analysis, and generates as files that can be used as an input for the one-dimensional network visualization tool NetGestalt (http://www.netgestalt.org) or other network analysis. License: LGPL LazyLoad: yes Depends: R (>= 2.15.1), methods, igraph (>= 0.6-1), seriation (>= 1.0-6), graph (>= 1.34.0) Imports: methods Suggests: RUnit, BiocGenerics Collate: zzz.R NetSAM.R biocViews: Visualization, Network git_url: https://git.bioconductor.org/packages/NetSAM git_branch: RELEASE_3_12 git_last_commit: d866104 git_last_commit_date: 2020-10-27 Date/Publication: 2020-10-27 NeedsCompilation: no Packaged: 2020-10-28 01:57:33 UTC; biocbuild NetSAM/NAMESPACE0000644000175400017540000000003613746055306014116 0ustar00biocbuildbiocbuildimport(methods) export(NetSAM)NetSAM/R/0000755000175400017540000000000013746055306013101 5ustar00biocbuildbiocbuildNetSAM/R/NetSAM.R0000644000175400017540000004250513746055306014321 0ustar00biocbuildbiocbuildNetSAM <- function(inputNetwork, outputFileName, minModule=(-1), maxStep=4, method="Modularity Cutoff", ModularityThr=0.2, ZRandomNum=10, permuteNum=100, pThr=0.05){ calculateRandomWalkerAdjectMatrix <- function(network_igraph,step){ #calculate the random walk distance for the network protein_in_ppi <- V(network_igraph)$name network_igraph <- add.edges(network_igraph,rbind(protein_in_ppi,protein_in_ppi)) #walktrap algorithm adds all self interactions for each node adjMatrix <- get.adjacency(network_igraph) degree <- igraph:::degree(network_igraph)-1 #after adding self interactions, the degree will increase 2 for each node. Thus, we should substract degree by 1. W_unweighted <- adjMatrix*(1/degree) #cat("Create transition Matrix...\n") tranM <- W_unweighted if(step>1){ for(i in c(1:(step-1))){ tranM <- tranM%*%W_unweighted } } rm(W_unweighted) degreesquar <- sqrt(degree) tranM <- as.matrix(tranM) tranMdegree <- t(tranM)/degreesquar tranMdegree <- t(tranMdegree) rm(tranM) gc() #cat("Calculate EU distance...\n") smat <- apply(tranMdegree,1,crossprod) mat1 <- matrix(smat,nrow=length(protein_in_ppi),ncol=length(protein_in_ppi)) mat3 <- tcrossprod(tranMdegree) mat4 <- mat1+t(mat1)-2*mat3 mat4[mat4<0] <- 0 diag(mat4) <- 0 adjMatrix <- sqrt(mat4) adjMatrix <- as.matrix(adjMatrix) return(adjMatrix) } transformFromWalktrapToHclust <- function(walktrap){ #transform walktrap to hclust merge <- walktrap$merges name <- walktrap$names N <- length(name) merge[which(merge[,1]<=N),1] <- (-merge[which(merge[,1]<=N),1]) merge[which(merge[,2]<=N),2] <- (-merge[which(merge[,2]<=N),2]) merge[which(merge[,1]>N),1] <- (merge[which(merge[,1]>N),1]-N) merge[which(merge[,2]>N),2] <- (merge[which(merge[,2]>N),2]-N) height <- c(1:(N-1)) dend <- as.dendrogram(walktrap) order <- order.dendrogram(dend) labels <- name ht <- list(merge=merge,height=height,order=order,labels=labels,method="walktrap",call=match.call(),dist.method="randomwalk") class(ht) <- "hclust" return(ht) } evaluateWalktrapStep <- function(network_igraph,maxStep,level){ #evaluate the optimal Step for the network network_info <- list() network_walktrap <- walktrap.community(network_igraph,steps=2) modularityMax <- max(network_walktrap$modularity) optimalwalktrap <- network_walktrap optimalStep <- 2 for(i in c(3:maxStep)){ network_walktrap <- walktrap.community(network_igraph,steps=i) network_modularity <- max(network_walktrap$modularity) #cat("Modularity:",network_modularity,"\n") if(network_modularity>modularityMax){ optimalwalktrap <- network_walktrap optimalStep <- i modularityMax <- network_modularity } } network_adjMatrix <- calculateRandomWalkerAdjectMatrix(network_igraph,optimalStep) network_adjMatrix <- as.dist(network_adjMatrix) network_hclust <- transformFromWalktrapToHclust(optimalwalktrap) network_order <- seriate(network_adjMatrix,method="OLO",control=list(hclust=network_hclust)) network_order <- get_order(network_order) maxWalktrap <- list(walktrap=optimalwalktrap,step=optimalStep,network=network_igraph,order=network_order,level=level) return(maxWalktrap) } identifySig <- function(network_info,method,ModularityThr, ZRandomNum, permuteNum, pThr){ #identify whether the network can be separated again network_walktrap <- network_info$walktrap network_modularity <- max(network_walktrap$modularity) network_igraph <- network_info$network degree <- igraph:::degree(network_igraph) ranmodu <- vector() step <- network_info$step sig <- 0 if(method=="Modularity Cutoff"){ if(network_modularity>ModularityThr){ sig <- 1 } } if(method=="ZScore"){ for(i in c(1:ZRandomNum)){ suppressWarnings(rannet <- degree.sequence.game(degree,method="vl")) ran_walktrap <- walktrap.community(rannet,steps=step) ranModularity <- max(ran_walktrap$modularity) ranmodu <- c(ranmodu,ranModularity) } ranmodu_mean <- mean(ranmodu) ranmodu_sd <- sd(ranmodu) if(ranmodu_sd == 0 && network_modularity>ranmodu_mean){ sig <- 1 }else{ Z_network_modularity <- (network_modularity-ranmodu_mean)/ranmodu_sd p <- pnorm(Z_network_modularity,mean=0,sd=1,lower.tail=F) if(p=network_modularity])/permuteNum if(p0 && start!=si){ currentNetwork <- sigHir[[start]] start <- start+1 currentNetwork_level <- currentNetwork$level currentNetwork_walktrap <- currentNetwork$walktrap currentNetwork_igraph <- currentNetwork$network currentNetwork_node <- currentNetwork_walktrap$names currentNetwork_membership <- currentNetwork_walktrap$membership currentNetwork_membership <- data.frame(node=currentNetwork_node,membership=currentNetwork_membership,stringsAsFactors=F) currentNetwork_membership_count <- tapply(currentNetwork_membership[,1],currentNetwork_membership[,2],length) currentNetwork_membership_count <- currentNetwork_membership_count[currentNetwork_membership_count>=minModule] if(length(currentNetwork_membership_count)==0){ next } currentNetwork_membership_group <- as.integer(names(currentNetwork_membership_count)) subLevel <- currentNetwork_level+1 if(subLevel==levelid){ cat("Evaluate Level ",levelid," networks...\n",sep="") levelid <- levelid+1 } for(i in c(1:length(currentNetwork_membership_group))){ subnetwork_node <- currentNetwork_membership[currentNetwork_membership[,2]==currentNetwork_membership_group[i],1] subnetwork_igraph <- induced.subgraph(currentNetwork_igraph,subnetwork_node) subnetwork_info <- evaluateWalktrapStep(subnetwork_igraph,maxStep,subLevel) subnetwork_sig <- identifySig(subnetwork_info,method,ModularityThr, ZRandomNum, permuteNum, pThr) allHir[[ai]] <- subnetwork_info ai <- ai+1 if(subnetwork_sig==1){ sigHir[[si]] <- subnetwork_info si <- si+1 } } } return(allHir) } orderDiffLevel <- function(subnetworkInfo,geneorder){ #reorder all genes in the network according to the optimal position in each level for(l in c(1:length(subnetworkInfo))){ allHir <- subnetworkInfo[[l]] for(i in c(1:length(allHir))){ ori <- allHir[[i]]$order walktrap <- allHir[[i]]$walktrap node <- walktrap$names node <- node[ori] node <- data.frame(id=c(1:length(node)),name=node,stringsAsFactors=F) node <- node[order(node[,2]),] geneorder_subpos <- which(geneorder[,5] %in% node[,2]) geneorder_sub <- geneorder[geneorder_subpos,] geneorder_sub <- geneorder_sub[order(geneorder_sub[,5]),] geneorder_sub <- cbind(geneorder_sub,node[,1]) geneorder_sub <- geneorder_sub[order(geneorder_sub[,6]),] geneorder_sub <- geneorder_sub[,c(1:5)] geneorder[geneorder_subpos,] <- geneorder_sub } } geneorder[,1] <- c(1:nrow(geneorder)) return(geneorder) } createHMIFile <- function(subnetworkInfo,geneorder){ #create HMI file hmiFile <- data.frame(best="N",level=0,order=1,name="ALL",start=1,end=nrow(geneorder),stringsAsFactors=F) hi <- 2 for(l in c(1:length(subnetworkInfo))){ allHir <- subnetworkInfo[[l]] for(i in c(1:length(allHir))){ subnetwork <- allHir[[i]]$network node <- V(subnetwork)$name position <- which(geneorder[,5] %in% node) start <- min(position) end <- max(position) level <- allHir[[i]]$level if(level==2){ best <- "Y" }else{ best <- "N" } hmiFile[hi,1] <- best hmiFile[hi,2] <- level hmiFile[hi,3] <- 0 hmiFile[hi,4] <- "" hmiFile[hi,5] <- start hmiFile[hi,6] <- end hi <- hi+1 } } hmiFile <- hmiFile[order(hmiFile[,2],hmiFile[,5]),] allLevel <- sort(unique(hmiFile[,2])) for(i in c(1:length(allLevel))){ position <- which(hmiFile[,2]==allLevel[i]) start <- min(position) end <- max(position) hmiFile[start:end,3] <- c(1:(end-start+1)) } hmiFile[,4] <- paste("Level",hmiFile[,2],"Module",hmiFile[,3],sep="_") return(hmiFile) } createGMTFile <- function(hmiFile,geneorder){ allgene <- geneorder[,4] allgene <- paste(allgene,collapse="\t") humancatfile <- data.frame(name="01",childnum=1,gene=allgene,start=1,end=nrow(geneorder),level=0,stringsAsFactors=F) for(i in c(2:nrow(hmiFile))){ st <- hmiFile[i,5] en <- hmiFile[i,6] l <- hmiFile[i,2] for(j in c(1:nrow(humancatfile))){ pl <- humancatfile[j,6] if(pl==(l-1)){ ps <- humancatfile[j,4] pe <- humancatfile[j,5] if(st>=ps && en<=pe){ pcu <- humancatfile[j,1] pcu_c <- humancatfile[j,2] if(pcu_c < 10){ pcu_c <- paste("0",pcu_c,sep="") }else{ pcu_c <- as.character(pcu_c) } c_cu <- paste(pcu,pcu_c,sep="-") humancatfile[j,2] <- humancatfile[j,2] + 1 humancatfile[i,1] <- c_cu humancatfile[i,2] <- 1 cg <- geneorder[c(st:en),4] cg <- paste(cg,collapse="\t") humancatfile[i,3] <- cg humancatfile[i,4] <- st humancatfile[i,5] <- en humancatfile[i,6] <- l break } } } } humancatfile[,7] <- humancatfile[,5]-humancatfile[,4]+1 gmtFile <- humancatfile[,c(1,7,3)] return(gmtFile) } if(missing(inputNetwork)){ stop("Please input the network!\n") } if(missing(outputFileName)){ stop("Please input the output file name!\n") }else{ if(substr(outputFileName,nchar(outputFileName),nchar(outputFileName))=="/"){ stop("Please input the output file name!\n") } } #require(igraph) || stop("Package igraph version 0.6 is required!") #require(seriation) || stop("Package seriation version 1.0-10 is required!") #require(graph) || stop("Package graph version 1.34.0 is required!") if(length(which(method %in% c("Modularity Cutoff","ZScore","Permutation")))==0){ stop("The inputted 'method' is invalid! Please select a method from 'Modularity Cutoff','ZScore' and 'Permutation'!\n") } #load Network if(class(inputNetwork)=="character"){ network <- read.graph(inputNetwork,format="ncol") }else{ if(class(inputNetwork)=="data.frame"){ if(ncol(inputNetwork)!=2){ stop("data object should contain two columns!\n"); }else{ inputNetwork <- as.matrix(inputNetwork) inputNetwork_S <- as.character(inputNetwork) inputNetwork_S <- array(inputNetwork_S,dim=dim(inputNetwork)) network <- graph.edgelist(inputNetwork_S,directed=F) rm(inputNetwork,inputNetwork_S) gc() } }else{ if(class(inputNetwork)=="matrix"){ if(ncol(inputNetwork)!=2){ stop("data object should contain two columns!\n"); }else{ inputNetwork_S <- as.character(inputNetwork) inputNetwork_S <- array(inputNetwork_S,dim=dim(inputNetwork)) network <- graph.edgelist(inputNetwork_S,directed=F) rm(inputNetwork,inputNetwork_S) gc() } }else{ if(class(inputNetwork)=="graphNEL"){ network <- igraph.from.graphNEL(inputNetwork) rm(inputNetwork) gc() }else{ stop("The input network should be from a file or a data object with data.frame or matrix class. Other type of input is invalid!\n") } } } } proteinInNetwork1 <- V(network)$name cat("Network has ",vcount(network)," nodes and ",ecount(network)," edges\n",sep="") network <- simplify(network) proteinInNetwork <- V(network)$name if(length(proteinInNetwork1) != length(proteinInNetwork)){ cat("After removing self interactions and loop interactions, network remains ",vcount(network)," nodes and ",ecount(network)," edges\n",sep="") } if(minModule == (-1)){ if(round(length(proteinInNetwork)*(0.003))>5){ minModule <- round(length(proteinInNetwork)*(0.003)) }else{ minModule <- 5 } } #if the outputfile is used for NetGestalt (NetGestalt is TRUE), the inputfile should only contain official gene symbols #if(NetGestalt==TRUE){ #require(org.Hs.eg.db) || stop("Package org.Hs.eg.dbs version 2.8.0 is required!") #genesymbolPath <- system.file("extdata","Hsapiens_gene_symbol.txt",package="NetSAM") #cat(genesymbolPath,"\n") #genesymbol <- read.table(genesymbolPath,header=F,sep="\t",stringsAsFactors=F) #cat("all genesymbol:",nrow(genesymbol),"\n") #genesymbol <- as.vector(as.matrix(genesymbol)) #genesymbol <- keys(org.Hs.egSYMBOL2EG) #overlap_genesymbol_networkP <- intersect(proteinInNetwork, genesymbol) #if(length(overlap_genesymbol_networkP) != length(proteinInNetwork)){ #if(length(overlap_genesymbol_networkP)>(0.8*length(proteinInNetwork))){ # network <- induced.subgraph(network,overlap_genesymbol_networkP) # cat("After removing IDs which are not official HUGO Symbols, Network has ",vcount(network)," nodes and ",ecount(network)," edges\n",sep="") # }else{ # stop("Over 20% IDs in the inputted network are not official Human HUGO Symbols. Please first transform IDs to official HUGO Symbols and then run NetSAM!\n") # } #} #} cat("\nIdentifying the hierarchical modules of the network...\n\n") overlap_genesymbol_networkP <- V(network)$name subnetworkInfo <- list() subnetworkInfo_index <- 1 network_cluster <- clusters(network) network_cluster_size <- network_cluster$csize if(length(network_cluster_size[network_cluster_size>=minModule])==0){ stop("The size of all subnetworks in the inputted network are less than ",minModule,". Please adjust the parameter 'minModule'!\n\n") } network_cluster_size <- data.frame(id=c(1:length(network_cluster_size)),cluster_size=network_cluster_size,stringsAsFactors=F) network_cluster_size <- network_cluster_size[order(-network_cluster_size[,2]),] network_cluster_membership <- network_cluster$membership network_ordered_node <- vector() subnetwork_id <- 1 for(i in c(1:nrow(network_cluster_size))){ sub_network_size <- network_cluster_size[i,2] if(sub_network_size>=minModule){ cat("Start to analysis subnetwork ",subnetwork_id,"!\n") subnetwork_id <- subnetwork_id+1 subnetwork_node <- overlap_genesymbol_networkP[which(network_cluster_membership==network_cluster_size[i,1])] subnetwork <- induced.subgraph(network,subnetwork_node) allHir <- identifyHierOr(subnetwork,minModule, maxStep, method, ModularityThr, ZRandomNum, permuteNum, pThr) subnetworkInfo[[subnetworkInfo_index]] <- allHir subnetworkInfo_index <- subnetworkInfo_index+1 network_ordered_node <- c(network_ordered_node,subnetwork_node) cat("\n") } } cat("\nReorder the genes in the one dimentional layout...\n") geneorder <- data.frame(ruler_id=c(1:length(overlap_genesymbol_networkP)),node_type="Gene",node_db="Entrez Gene",node_db_id=overlap_genesymbol_networkP,node_name=overlap_genesymbol_networkP,stringsAsFactors=F) rownames(geneorder) <- overlap_genesymbol_networkP unann_node <- setdiff(overlap_genesymbol_networkP,network_ordered_node) if(length(unann_node) !=0){ network_ordered_node <- c(network_ordered_node,unann_node) } geneorder <- geneorder[network_ordered_node,] geneorder <- orderDiffLevel(subnetworkInfo,geneorder) hmiFile <- createHMIFile(subnetworkInfo,geneorder) #if(NetGestalt==FALSE){ # gmtFile <- createGMTFile(hmiFile,geneorder) #} network_edges <- get.edgelist(network) #if(NetGestalt==TRUE){ outputFile <- paste(outputFileName,".nsm",sep="") note <- "## Ruler file ##" write.table(note,file=outputFile,row.names=F,col.names=F,quote=F) suppressWarnings(write.table(geneorder,file=outputFile,row.names=F,col.names=T,append=T,quote=F,sep="\t")) note <- "## HMI file ##" write.table(note,file=outputFile,row.names=F,col.names=F,quote=F,append=T) suppressWarnings(write.table(hmiFile,file=outputFile,row.names=F,col.names=T,quote=F,append=T,sep="\t")) note <- "## Network file ##" write.table(note,file=outputFile,row.names=F,col.names=F,quote=F,append=T) write.table(network_edges,file=outputFile,row.names=F,col.names=F,quote=F,append=T,sep="\t") netgestalt <- list(rulfile=geneorder,hmifile=hmiFile,network=network_edges) cat("Processing completed!\n\n") return(netgestalt) #}else{ #outputFile1 <- paste(outputFileName,".gmt",sep="") #write.table(gmtFile,file=outputFile1,row.names=F,col.names=F,sep="\t",quote=F) #outputFile2 <- paste(outputFileName,".rul",sep="") #write.table(geneorder,file=outputFile2,row.names=F,col.names=T,sep="\t",quote=F) #outputFile3 <- paste(outputFileName,".net",sep="") #write.table(network_edges,file=outputFile3,row.names=F,col.names=T,sep="\t",quote=F) #result <- list(gmtfile=gmtFile,rul=geneorder,network=network_edges) #cat("Processing completed!\n\n") #return(result) #} } NetSAM/R/zzz.R0000755000175400017540000000050313746055306014062 0ustar00biocbuildbiocbuild.onLoad <- function(lib, pkg) { cat("******************************************\n") cat("* *\n") cat("* Welcome to use NetSAM ! *\n") cat("* *\n") cat("******************************************\n") require(methods) } NetSAM/build/0000755000175400017540000000000013746150015013770 5ustar00biocbuildbiocbuildNetSAM/build/vignette.rds0000644000175400017540000000036013746150015016326 0ustar00biocbuildbiocbuilduQ 0 9@eG?xG:lF{$jZrwf͚Qe|H{ƍϭz6y?̞O}O/Yb'nJ>lQt}'i9飜pp ^!@z17K:A/|Ÿ;2$lQǨvџ[%ݵ'=u'X6{uk6zvwli{]{{.H($.HMsN)}j8$!.(ԭ]rW㡯ݓS3oauȊ,ƨiz>>5&p>f16EA/ds{*Hf0Ix#lPd|:{Y 5-n^S<[kHG2?HQw)KS ɚ7QO#j 75|Ό͇h}1̋Nq{EQnRE=kݣ ^ygZ;To涟';ah"v[QGR>쐆gS4r]'#?1V7< D 5cRwLɢTg[daKHi~6seƷ e3q|l3olHK:Έ&oYkֽ.;#aLzvqN駋M|L5;S#?Oif[4˳|9~Άiٝ$,O^8QB]H9JQ;ϸ' 5LW!lA#ʿlge"V)Ky.ԉY7Q?[~3vy' k|tV#iޙwė#SWJWdAFl8Ӕ:'[_ek1z䇄9uTrv>oh~D}_: J7֩]^j=Udjd>3c{^:*V `S啗Kŀzb"d=jɳŠCKzc;rzƔ;ehm^ΈU2BvwBY^իh-̛iכ~`{ҦDrw,e.M֩)=dFs9% 9nƐE)AАj&hw} LKmF=}lR.~j}6,M - o Ax=:6@˭_ s@IaAxc)$E@Aw=/ < S >D]ɺiT'nBg zAWMʸjg o!(N x q嵤/ O!~ 'q{O1V% Шb_M5POg?x ~t2t/ ~݇t}x~9E[EeP#Xy]5,LV)COmW&y'؛V.]=d6o2ܠ  %AطMl &xg};p5y؋?{cR q|({?l+L|8CdQ1'Q9<QctKR`Jp&d{$8,u4]0C'(E6IlّӨ{W —Pn oQ\nFepA)%.&s)//]B\<|Jx(8LEh8U$(H+qU+ql؞ނP*,+jR&,!h82!'\%Zb-ITA֯o\QpC%Z%{8|+W~򾅒ܬ ,|X^1< =Rxphi~V8XJrheUˠ&|2TbW֭?S.B'ߊRl/Xi ͞}2Jp痲d.$d'glw3zq8$@{e?P10CpvJ!ÕӏB%Mx2\Vxz\nR; ~ɛ7.|+R0자`lg MFEcBAknR`_C8fEhۇ:dӰ*7 m.NO m]vU0%c/_Q'K]8*7/=p3'K~y%Kk*| iJ1*=!]D)@ c'S4$ hIAHG\ GSp=RFE~"~{“(6ºuʍ':u\*Tߟ9V{2’_srz2NFXWA'RC]tx4DM!N N-aavUn7oLA![U s֬O;~t!c {]DjJ> kN3nt/)x谊(Y\bȉ뾏+٦_|%[L@_en씰xz/ի lg|Bw"_B ') 2`''q myG**g+Kf΅ֱ`1#oyGf RfETF۴\%S}P#W*fAf.4WcX20V۷oY«-zęp_exXnj>qf gBx.$G&*<:JW,tSBN{#Okiop<Ǿ&Xgp%Kȃ"(h^%Hm~"? Mcmyբ)|u[^"nRKýqU>8A8!Tq&ؠ#PDױ6ESuH*Qk=a|+_1T3{ɑΫJM%z'`rRW06ەS[.ɪiՏG(b?@ O0 S47^cɅo"M 70H7+tF?B%i/t~ҿ=`wRxL0JN2# x0qx\<8[P(6(oJ>#b-8#nҠ+{qڦ|}E`oo"`[F_׈i8õN"+;OQ}TȀz#({xfT655o@+{JV;"IT[%4Z?C qZsܵ9^]FgٿM4:5ϬuK+H5.\xk}uak0Gf⌿yBg!-^PFO8 ō)yzM/!I0V žl_.vR<(<'r|n8oxM#<-([D ㌼YxYd\K !AA [Be/עF _76 #[zfX xEܤ5' w)VC?9Z"]sy\}mP ,W : XZ};#- 4Y]o hvB(?B)J R ?k\=؜ѕ>ZzyCݵ5ۏVSmL!Ed`7i7G`3x_zT_p"Dܠ V /\F ڡƆѸGS`xuA~u/r'hÍE8kA 8 t8nC,5mDˋkiqfmڒc o$~n ZsH:'l :C\qz.cw*$F~a qڈށG ڦMu c"a=WԱDF ʥ8 <h_u4q1`#袯0WMˀU~\ Fm=-뱛 wV|eruջ"p3HbZ(A>e9mӸAp"wcs +\ O `;%llʬ?rK}L````;ȧP3>ޓo,xG*~׊w7/amCT2Le*ST2Le*ST2Le*ST2Le*ST2Le*ST2Le*ST2Le*ST2Le*ST2Le*ST2Le*ST2Le*ST2Le*ST2Le*ST2Le*ST2Le*ST2Le*ST2Le*ST2Le*ST2Le*ST2Le*ST2Le*ST2Le*ST2Le*ST2Le*ST2Le*ST2Le*ST2Le*ST2Le*ST2Le*ST2Le*ST2Le*ST2Le*ST2Le*ST2Le*ST2Le*ST2Le*ST2Le*ST2Le*ST2Le*ST2Le*ST2Le*ST2Le*ST2Le*S<w鴛٢>6ޟ@@]s 4X1{V^:]g*j~( elD>tE|0b0:}zm,=UqY'3h:lU,P!T3on,z($ebBdz"Lek mE|yw2<8TCq!$O)' d,aO}^n@RR8Zf2zYvv-Wv&ytDmzlO|gyQxͭ{)WȆݖ,x1] tRQ|6y cs[3YtsQ葟(B~ij"i1Il!l2Ik9S#o-D  _mz65brwc$pYiw+^]sIA)Kl Fdxcr14uN<28`Itb.zOf6gnUq&EiXh2?OrHtaP[}x!U'oGKia|5ż6'-34MBS<ZU-/fUt:L\Y}lO;Ch1IE :pH0mC|BSTE 0OB L2iB$&7 ǞPXW=WBB.t{B׵f +S^|92[B${{4(x?$4D&:ۻ;aiTMM  @Qߣɤ(7D+;&mnA֮FCo^lL:ȧZNZ1̅RlZ:M )zq[Rskџm<&F5eMo+;KDu`X FT~ }Y%txa=ȧR~F÷=u%$X xiު oDl ,, _;H rA4~nqu_H5$ݢ%K0qc@-օxQ vgYg!b (u!o>jtPBF@؂ ua1D4ȰݶM~a?aMgpA6w0o=@X0]ֻfz^=:2 P08A Q7uS1o' |7 \(QtI w,p@;KnQC=Ίi H+YPR:L|p0 `TAK\R(;01V(2'@j,6([$f0 $܉S o]c]LnbnSG9}5[%2[pe!<`1g[5v߄HA[#>*s tZETl~!. _4-h\nNLq!|Ua'3W/Aս^3M]XDt5 y#}1ps $cV^X a5ӱSK9N| э,{a| x Y'3WG!~ϊA{YnQ:/d"%d&߱y=.3 p ~nj% X6=! Ad2i7oF{ZK3a=FԚ]h8 6-2f/AIA >we;ub9ڤuUV ԜkX q쳔ᖂ6Z%{M4-Ü2Vdvn"@ NFh2. iz#4Ϝ1oag0dUĂ]>CY|50ϊ׷k !zn^ XWn/;02،F|hN9sZU*k0aC5?}VFᛚ}9|T3Py.ys sExN9Ga״fO{..fi:(Uա;*t:g@C]0?dCyge5NIY1ΖXkU!*òsm &ҜߙGJ8A"bE> !mBvY2;o4$(ǖk/)Y;h.o9oqZM-p v$3frwjLTT@MD:74 93A%V:kg»my ?7A]V^N[{ >,('G,"NEȒ@^cMR xƱ_{dYCQ[NLX4d e HmW1Y{t' btOOԅAջDSZUY02*=  181lmn]=:@cXk/:K%h_4,Єaҵ`ԗ;ٙ:\ng4 I*Ht*aPꚇ*ԮBD;3{AQ,&Du;@tHw;!!$.@88*!,ar6Ėu V$, ?vnآUj 㧺U\]8 Eۆf Oo6m\!$OC5"~ύ.;K0(פ\vC̻lԗfc67Q6He-Pyaq H|VrjP7_/LU$x|c̩^`H.J̮2n,P泼ΰy;Y@Nƛ!Ӛ\)8kڤT*6S^C,0~es YH|&  qs;wυfEA]옛e3.^.=OBn]F]wq/YG7\2#M\iG363l<p xgRӥ`JIivU?k!? doAM4{غ#2zwk b %8i_qVvʧRu`3k⬦(o.VWDy HB-3q5 O'Gڡv(]ct"!.  &]qM]Թ}}xbus5aAmS Z|ĒXRM_j(N*9!M,"rьН*t Jtaҭ q=<~.}3~)w2aC Cx6ڇ}ۖ(TYRu+trM)g#5\k,f%anÔ|l\l6-^7s,cA߶m{půO@] 4fFT"(ʖ{' 1m2S(i2{V+)%H"i2s8?F m}iVVV.98x!;8萣nGu;ZQEnGKt;ZZTEXUY@.F7qw}1{uh-- !b6L~#LT|7l n .{I%GKvy;<` [O9Ns]@1]YVho  쎶G 6rޑCFb9 vi?VE,* ^f:䆝p C qBg T {֕C"~ ٥??euBYtWJ7Q *y-KƩ<\miC!7`qo6◙kogCM\\. ;%`/q  )wBd }Mk vn/_a˹#Ra{$34<}f@SNBH~4}7;VLoϤP[k:D0U%YݎKba1 dֺ=㌗j8 v9,`Ql(K=4s<,^ijRظ* t{qiD&.d Ү NG_Ir>B|^D`e{ɕv3 i6fgo;@ BkYFxc,qֲ]r D>) cwLT8>ue-XߝӰWҙ4q&Y¶3BC 2!“wŽ'ܯg7\Ƿ#Q*8$ط_9H(|6h%'=\ޅ: ?hS.?}yƾZq1 E~tBYM UL\~X6 NwN&6gcpK[v/=CSk~;gI*;s?kvL4~'=s80-e i{Y6Kfr;pz/ VmBowye`l=E/[E f]6۸8y ]p[Pme8y&b ?d\7ٰg)mED6(94b UY[By"FĿ=O4axZYJ"69Ϋ6v+@gϞ'Oޙ1mA7H "6X n5 _i!1/FEjٷ mVLkVnxV9 !gw߲*~lHx\1Xإ#L/Pzh~$Je0_HER[v)?I yN9ǜslݢʥ=MY6;YȪzӉ26tU2g9ʔh1bff:ɡаav V$"g#X  >g'9Z,7 n7Ha;)u­D^43EFv&C4u&s2! E=f&殥)k0=t2x˨IW@BC`/@&$lK 1`wsBﻛ!"SN˴~6ht^͸䝆2. e^f;a ӝ˱s[xO'A޽ygzqw2#Hf+, ~"&.Vny~`PM|-״=Há&@Ԍ6.EBSK8\" c?!0frîwjX ΙΎ$A™:?!,+KA%{}!vNwM*f{ON#z%n~Q#/03ߧ[s>t+vg7̆Qx@lIl}E< ֿVFa9/șc.Znp)"tܯZp=6#Ք&<\K'jO=ۗ?oѓ^>yo'?'A7Oɋg gVܳOA/>xw^=}nkFgz,{ɻX)%(u޿WOy=&L/__5f֟: A\NetSAM/inst/0000755000175400017540000000000013746150015013646 5ustar00biocbuildbiocbuildNetSAM/inst/doc/0000755000175400017540000000000013746150015014413 5ustar00biocbuildbiocbuildNetSAM/inst/doc/NetSAM.R0000644000175400017540000000117213746150015015626 0ustar00biocbuildbiocbuild### R code from vignette source 'NetSAM.Rnw' ################################################### ### code chunk number 1: Example ################################################### library("NetSAM") cat("The input network can be a file.\n") inputNetwork <- system.file("extdata","exampleNetwork.txt",package="NetSAM") cat("The input network can be also a data object, such as graphNEL object.\n") data(inputNetwork) outputFileName <- paste(getwd(),"/NetSAM",sep="") result <- NetSAM(inputNetwork, outputFileName, minModule=(-1), maxStep=4, method="Modularity Cutoff", ModularityThr=0.2, ZRandomNum=10, permuteNum=100, pThr=0.05) NetSAM/inst/doc/NetSAM.Rnw0000755000175400017540000002011613746055306016204 0ustar00biocbuildbiocbuild%\VignetteIndexEntry{NetSAM} %\VignetteKeywords{Network, seriation, hierarchical modulization, NetGestalt} %\VignettePackage{NetSAM} \documentclass[a4paper, oneside, 10pt]{article} \usepackage[pdftex]{graphicx} \usepackage{calc} \usepackage{sectsty} \usepackage{caption} \usepackage{underscore} \renewcommand{\captionfont}{\it\sffamily} \renewcommand{\captionlabelfont}{\bf\sffamily} \allsectionsfont{\sffamily} % page style %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \usepackage[a4paper, left=25mm, right=20mm, top=20mm, bottom=25mm, nohead]{geometry} \setlength{\parskip}{1.5ex} \setlength{\parindent}{0cm} \pagestyle{empty} \usepackage{hyperref} \hypersetup{% unicode=true, CJKbookmarks=true, bookmarksnumbered=true, bookmarksopen=true, bookmarksopenlevel=1, breaklinks=true, colorlinks=false, plainpages=false, pdfpagelabels, pdfborder=0 0 0 } \urlstyle{same} \begin{document} \title{Manual of NetSAM} \author{Jing Wang, Bing Zhang} \maketitle \section{Introduction} The last decade of systems biology research has demonstrated that networks rather than individual genes govern the onset and progression of complex diseases. Meanwhile, real-world complex networks usually exhibit hierarchical organization, in which nodes can be combined into groups that can be further combined into larger groups, and so on over multiple scales. Thus, identifying the hierarchical organization of a network becomes indispensable in complex disease studies. A traditional and useful method for revealing hierarchical architecture of network is hierarchical clustering, which groups data over a variety of scales by creating a hierarchical tree. However, hierarchical clustering has three major limitations. First, there are many different leaf node orderings consistent with the structure of a hierarchical tree, and hierarchical clustering does not optimize the ordering. Secondly, hierarchical clustering does not assess the statistical significance of the modular organization of a network. Finally, it does not specify relevant hierarchical levels and modules at different scales. To address these limitations, we developed the NetSAM (Network Seriation and Modularization) package which will identify the hierarchical modules from a network (network modularization) and find a suitable linear order for all leaves of the identified hierarchical organization (network seriation). NetSAM takes an edge-list representation of a network as an input and generates as files that can be used as an input for the one-dimensional network visualization tool NetGestalt (\href{http://www.netgestalt.org}{http://www.netgestalt.org}) or other network analysis. NetSAM uses random walk distance-based hierarchical clustering to identify the hierarchical modules of the network and then uses the optimal leaf ordering (OLO) method to optimize the one-dimensional ordering of the genes in each module by minimizing the sum of the pair-wise random walk distance of adjacent genes in the ordering. The detailed description of the NetSAM method can be found in our recently published Nature Methods paper "NetGestalt: integrating multidimensional omics data over biological networks" (http://www.nature.com/nmeth/journal/v10/n7/full/nmeth.2517.html). \section{Environment} NetSAM requires R version 2.15.1 or later, which can be downloaded from the website \href{http://www.r-project.org/}{http://www.r-project.org/}. Because the seriation step requires pair-wise distance between all nodes, NetSAM is memory consuming. We recommend to use the 64 bit version of R to run the NetSAM. For networks with less than 10,000 nodes, we recommend to use a computer with 8GB memory. Using our computer with 2.7 GHz Intel Core i5 processor and 8 GB 1333 MHz DDR3 memory, NetSAM took 402 seconds to analyze the HPRD network (\href{http://www.hprd.org}{http://www.hprd.org}) with 9198 nodes. For networks with more than 10,000 nodes, a computer with at least 16GB memory is recommended. NetSAM requires the following packages: igraph ($>$=0.6-1), seriation ($>$=1.0-6) and graph ($>$=1.34.0), which can be installed as follows. $>$install.packages("igraph") $>$install.packages("seriation") $>$if (!requireNamespace("BiocManager", quietly=TRUE)) $>$install.packages("BiocManager") $>$BiocManager::install("graph") \section{Network Seriation and Modularization} After building up the basic environment mentioned above, the users can install the NetSAM package and use it to analyze networks. <>= library("NetSAM") cat("The input network can be a file.\n") inputNetwork <- system.file("extdata","exampleNetwork.txt",package="NetSAM") cat("The input network can be also a data object, such as graphNEL object.\n") data(inputNetwork) outputFileName <- paste(getwd(),"/NetSAM",sep="") result <- NetSAM(inputNetwork, outputFileName, minModule=(-1), maxStep=4, method="Modularity Cutoff", ModularityThr=0.2, ZRandomNum=10, permuteNum=100, pThr=0.05) @ \subsection{Input} This section describes the arguments of the NetSAM function: 1. \emph{inputNetwork} is the network under analysis, which can be the name of the input network file in the edge-list format (each row represents an edge with two node names separated by a tab or space) or be a data object in R (data object must be graphNEL class or data.frame (or matrix) class with two columns). 2. \emph{outputFileName} is the name of the output file. If no file path is provided, the output file will be saved to the current path. 3. \emph{minModule} is the minimum number of nodes for a module (or minimum module size). If the size of a module identified by the function is less than the specified number, the module will not be further partitioned into sub-modules. The default is -1 which means NetSAM will set \emph{minModule} as 5 or 0.3 percent of the number of nodes in the input network, whichever is larger. 4. Because NetSAM uses random walk distance-based hierarchical clustering to reveal the hierarchical organization of an input network, it requires a specified length of the random walks. To get the optimal length, the function will test a range of lengths ranging from 2 to \emph{maxStep}. The default is 4. 5. To test whether a network under consideration has a non-random internal modular organization, the function provides three options: "Modularity Cutoff", "ZScore" and "Permutation". "Modularity Cutoff" means if the modularity score of the network is above a specified cutoff value, the network will be considered to have internal organization and will be further partitioned. For "ZScore" and "Permutation", the function first uses the edge switching method to generate a given number of random networks with the same number of nodes and an identical degree sequence and calculates the modularity scores for these random networks. Then, "ZScore" method will transform the real modularity score to a z score based on the random modularity scores and then transform the z score to a p value assuming a standard normal distribution. The "Permutation" method will compare the real modularity score with the random ones to calculate a p value. Finally, under a specified significance level, the function determines whether the network can be further partitioned. The default is "Modularity Cutoff". 6. \emph{ModularityThr} is the threshold of modularity score for the "Modularity Cutoff" method. The default is 0.2. 7. \emph{ZRandomNum} is the number of random networks that will be generated for the "ZScore" calculation. The default is 10. 8. \emph{permuteNum} is the number of random networks that will be generated for the "Permutation" p value calculation. The default is 100. 9. \emph{pThr} is the significance level for determining whether a network has non-random internal modular organization for the "ZScore" or "Permutation" methods. \subsection{Output} The NetSAM function outputs a "nsm" file that can be used as an input for the one-dimensional network visualization tool NetGestalt (\href{http://www.netgestalt.org}{http://www.netgestalt.org}). Meanwhile, the NetSAM function also outputs a list object in R which contains all information in "nsm" file. \end{document} NetSAM/inst/doc/NetSAM.pdf0000644000175400017540000034066513746150015016213 0ustar00biocbuildbiocbuild%PDF-1.5 % 28 0 obj << /Length 3306 /Filter /FlateDecode >> stream xڵnF}›' hKvΕ`=Y8}E%R!q<_u69yȃ>n{qƄWAA]ݭBzL2+;ɬvYNt&X^&^W {&LO;6"g3_-V`B(ZK/33̮N𯾟/! }ۇg y&JE h6 7/#Rpjj]$wWD<],0%'lH@|.D£%S3G\o[U="K?yh eN[o2nK>>87gܾEP\Ȼ|/[n'-8FT iȑ4R/Y!$!4b~keF@Cwg"R#5ْ;mJ^t"P"' L8}fi۷ BF#qqG`Dq,3$zWj9U{C-^2D|m{qV4/J2YDFO 6 8GƖ8oΟ`01V +'cP\1`ȵL\hҪ%zkf>l/حCkp.{BV5 &Km^J3C!8Mʙ ռuNxل jE~lDh^0XWL˙0}Lǘgt54eY pob¨oDi(q##ϛ>cR7%?AtQӚ=/ ~lI{~=E%u:38Y\\6#Xȣ87K2 NiK|22+ Sq/`KŇtֽ0=Vvsz9v'bJY2+tt{X.eY&nDjS,#::?u#/夛r >-th=Bq2, s_\IȀrdEWwm:_MA])> ;cFSd)$[PvM(44($BӟT8DӴ21u'kjqBVד{y||zC!)x&!~菰vBZ O숟lɮ: 3|S-wH(EC# †,sZeh2i(,p@kٗMS;j)i|]W N[*[]hy.RyPDH.Ὀaew0|Pi|47&$ MX+"HuؤTP=)`n#U3&-U6nB שK]b 2L463陮+#.VeYyV%NtXf ʣtyP5{N#™iWSiZBϐU!g&c%\%-vfT]P\ cpj.OG0Fa28J.ˑ e;*B4UW9{WJZ5~h=6#boVGzJ97h@`_a5Μ cL)E^e,5pk/al:;&ϓi?=,ةҚ:ł/o(jͮkK".v/l7l# .P4a=dCGYT@l %¼cd_CL/^~ڢIZ/q=/4-K3`p' B;ۗ/؍Vb$n֝:D!wO6%wcF`YK=<EG16c!ߝ9lף|#1ڑ} : w\0T D da<!oeQ6'䌶z wWcQTnr&q{Sgv ,e˅qtVO>["Mf'bVtRYyw$oDI#T耉 )ف6[ Aoxf[Q?ҝ5eA{]kT>U9Sb@e[@ 'dȋ8DePzi}BIXHb7tMoH+>a4ˀiYE~M$[ # *n.c<7z#/(B?Flch> stream xYF_x<>@bWR>8sĎ섰waxgk{ƿ>zB#2Jr~$4PFOBw]w;O ?T&wS6Z෮`2jA+T[`{($L@`4 3?B l,fG@qJ=+XL㞀a H4=-iD01oUW l< A$ʉZsb^cK %9R$oↆd.aF=Ϯ`_́qtbBɔ:AByA_-@I4 Ì,L*ފ X&-gV1[4%XX7AsL̸Q\/?y|((+h vގ,jfSmW5KmJ.;EN:gCn2Wca/.*35ː@tbbcBmMqju͝Cҟ C[(ϩu#}l$L{uYR`MØ~ o3ȶ-qk`Иh- G~Xs5 آkXapC۾a u;/Kt}#_C N̶AGAu/Z> stream xڕYɒWtF 1 nBG!$4 .7dG_|Y @pzt&*+++ח>|)i~.˧*Oӿ<͛~filofIϘ/D3uzu,_{{Af^gY{CW;S.qg|{%۶u1s,gYmw,^,E#&:߀pru/`Xv9wr΀,?yMQN ܴGW|;aRG5>V/sGQ%::]{ZΓ]wV6rFͳ2oId%$Q* xZl-2ڎL^QViՆJ ôFѵB1r~A~wuΛCú Sa~DbABY!tl8p@pPe%Soj|.xrŕbֈCl/ꅝ8U;Y}*pNF6"NT D}7t-(7 ſ 5g݁vb+ vYqZ>Mt؜lYOi5m<\32!M֮ uJ >ajMTqz׹nA^r`{avJ5x2Tg}6,簑zpTI>mp ukDU.U^':9Zh9"(N'+-wP}΅lLtR,N;<{[\q{J4I@$/Q 0/g{ Pc \ǻ T*ُyf,"k/zDMPWknk?}􉥛TpT  qYq.`RY$C+xVe9K5KmWUyGUxsN14MVuz `)ej:^K:οaUpAZv*AD=KOR$Z21v@ŵb,7']6EMU;aVm\WRih,#-Pd=F;0UWgUܣ$&Œomڛ`EDԠ=7Lho*N=Θ p8nn54:| 0sL5UA U':,d^g (ȩ֎^9|A{/[-UMXIкd5ܝ^g>0LM)طL4p9Πt`tNN2Mb4Y5挀0 F./Oki.xtlوfR2rWaMps  Kf}Pd|nPh g%mq^ #qxLއۛx&2gY L@`b&Q {JRN?oW} ږq6u|*ý!dp_zYhC}W+YH8KO<2{X ldw; mwftwwc4^zѭ}o1IoXಗg.D~i~K%g0}O>j Kl IhĝGʫg),Ny1;W( k~ ?j{;7&i?OXLyMNL*̸\Kq:/㻟k endstream endobj 58 0 obj << /Length1 1399 /Length2 5943 /Length3 0 /Length 6897 /Filter /FlateDecode >> stream xڍwT6 JD6&* $${"TQtHQQzA}{WJy̻p޼k$h!X H A AHi Ǻ8Mah 2t*,D"@$"R@+B"`2卆;:aqy~rCy`I;܁n04 Au!X'.# 4BB0?Bp8a()!!OOOAFvz±N@C/[A`Zp#q W8\ ah .;HS!~u~+@p/gtCAp# b@q qb*TS4BpEQX z٣e1"앑nn0OAq-g.'owlJwT9°@1 1 : ]&0F~j\($ kw~ E? áX;:N s-揆{-@8Ͽp G"\ 5b!MU-%?-˨ @@0HTx8w!?u& vY/ l8€f%H }|e]W_v߀qzA[]$n 5]]=[5:("q D5. uMz˅s#`wˆ2 Vk2 TCE_n8FC$1/0_ "X ׳?\Z\(xyg#8˿APPЎZEfOQ#sakRlRQ^`5k.=%+ ޢjvSW&S|YnMQ=2KWb*Ge&w3C']ڊ\zI/ mvƫb{ |rKY˾-y HZe}#K*=Ȣ"JRc:[Dc+NVa˾OQގΖM;N/>ǬԨY:LtaZL~;Aˀ\!ƴ' rVDdoCue+W7q>po6zE>g!5o;lLB"өXlV2=МZD<ڄBI_N%iDMbì_vɣmЫFhV]ҁ_ג΀ԿʧM{X=fWth`{ԭ}JD{ §'{Ax"ؓ--lCui.G>r|?3DA#g"Smt|E+4KaotSW(hg l$'v(.L1O~Q!D*(s֞#3n,E w%Ӓa[_Wr^.Bv60I<%;mzϪ&4U%KXv_XAAlzt+{^6Ԃ #6ӉѨ%? \`|a91n# wXm` 5 >~IifppțB~X>m0Q%MZ"64/fMC(di(N/! 'Vƪ/ NWV7ٙTs+>ɨJZ]6/ iu'ppM6S.Ahd8a}F&(윦oݱN}5$=lWn2N汲ra4Y5s\4M4Jw=E/&nozQIu."Rצ ;=eۿJ0vJf|9&[BjĻ$m-1G( ,>0O@C^ =1_T@{( f2Do+\ ,^nFg=q}rý(O&&ݭb~ަh1'e7j nC:)`6  k٘ҏ>%*(%G~L7ߔq/˃9Gέ;M>.*vX <=Ѫ b㬽 gE['udej *_+H(I6,cE?ÎGx_3;mHI/WT<8&Ź%WsՈ_}5^qYP=O쾈[8˩N4Il>z4dQ{ ԍp=1`D{L/~b gsa"~V5f9j4Tw&`pA!I|1+o|R9:M>iwr_,d%{kh5rإWz\-ëy&w|{zV3#11 $Ђgv!.&㽃&,. gǏT)O,ߌedh X 3 ɍ|a85,?C/36T{"zIMC7׌t]Kszu{f=y*1;~;7[ԢF[ϙ6uRm ҵ49{ r`w3t_=,ֲ`Hp"O* x"Hl1?<8A>|wJqoە;xYJBvmDo_ɺ)ҟ&I&Ψᗚ; LO@1P@4nZ` Uu6%GGBLużʹ|w3M7cIJ7Le}>LwOitYw6=(^+hܢcɻ;iR0^+5}yQyݥO!)P'kCך wz~z*w>X̵q!Nl*ZST ~ SE ʹ7+՟ Pt?wIZ ` KD-td\oeTV/L{[P߻' &&Nխp89`k,%D~CBŹI'8f$ջ( lb^]d2$Iiw<0"K&1[@eil]EP)󨆹s͙KA hm(8~2i&߷,,﷞8\? 唍O4xn̗Ub W9 N/gYRmF)|ZڰlS<.59mp2 ##/ pR-1ߜkg;^l0Ԟ`RK>XB]:#k /T7#cw{i4s'3 -g_tjCz$/o俼ux97n .xPW=IH鲵kBIUv <* 4NM3kckY}dwgm&A.7(槯C:N>txߣ- SɪaJ&ƺL mr7Uog1^=Zt@Q:ʡ{52qK(SMPe'rSFj)tsmPGca kQ©bczk=hhh;㭕 bkdЉc;tUVs]Yz0h~*RWҐTjoDk ~jc=HE&6&8Tq]Eq#h^rxvP;!}\㹚̽a?zv,MR k{6;OW\+9]}@ِzږs;k"nm.ܞ+KV0*<"Ӱ$d&O0W N߶*9+{r /RZ95uc%EtYj[nڊ3%aюJ ։er ڮ "ؤe<|#Au r_yLT |~P=4sϮ[UNX(c(f>ςU*4,Y~~W}i{Qe6k})Tg|5# ,ɗ)elb_<5!zнH\4YizYB>L> ѳ8$=oԏ]$nfe6b ~<ԚU=pҏy. g%2+`!b0tAv܋:'Lw&Kw(-Dwmʶry*0"vbkK }[N[^q;]حac) >kvmki'^x<;/{cN@EL1CX`J*Շ)C\=tK ʃ-O*_ 3./+%G-Xc3}p^^^2V;Jh|5 B|K ufh7tt2&a\,I2ۑ\v|RҤc/MsMT7#=)G9n-LqN#c[3ů-d'>0{-tkx%!0Su1m`E> Hwy 5fٻzE[wlˠXSv؃wyl<00hIr("Ɛ`]2LPd%S絕m[qm'݈r&azAp),iKݻEcnu'kTnQ1rH|"`4Dzsf۶ QRhmkP|+WGj=sRm/K68nFT '0,z ܲ8gyiO{"1]E^}WEC53l'`c=jEA&(0|2~XHI?uj2ѐ:G2]4k1|;xpyλ=rPSXt"+bm`uk҈[^"yOp0L4 =Gހ{}ws] R~>ƒDwsZ"v9_ F2_32Q,H!yT;/:gؤ^*"'KnuJKs䅽&;n}w]1 oi:|/\N£)֝02 )Ie,"J,$(ʕC+wz=褵f`o"a6KQ0Q{tWO62+ ݞs9/në`8T*@cHƎ$uU| ^e/ endstream endobj 60 0 obj << /Length1 2416 /Length2 20577 /Length3 0 /Length 21984 /Filter /FlateDecode >> stream xڌPm4N-%@p  Npw8f&ުsߵ}g筦 QVc1w0J:ػ202TYl̬V)4.V9M\A2qW=@`eef23 nneP`:])>X@mF`;@lefbP0qځ2̬^ՑÃ΅ = t:(ni\ l̀. 7{s3&#Prc,=XY޿YPgtt؛64uqXٚ U @RD`j9[90Xnwbvv@{W[9@{1s6>V0wsdҰrrʈ$#tp033sN%^)Y~A8:8,@M,xw < ` `e':H  = @e`o_ˤ-&DOՉ:x|ؙ Cz0&V./_{ ?ՂhO/ c):3f/ϣ/;ې߂$lmGmbgeoк@T *ͭV"lK'\iG{l.VhZf64RA)%+' t a9_C `bwp@,('I `Lb7I0Iq1$  `L2(ʧ)A|JEܠ|(ʠ P((ҙAZL P-fE -#ag-d "Xgoh#au:F[A>J?9~C;9d/OO ,-YdVAPA6AMADڃ/=9?ŀG jVZᔝRT#rx@t&?ԃprsp/ H, B\tbdԧ_!@I/\-7W@1 < _/bOqH@Rϝc _oЅw< 4_w0 m&;.0CJ Mufȗm ewa*mOFUv'~L0 8j@urFVG/[4W)\6T_>l23rCr^U6+vn΢.zp*~O9?/ĵd0D!GW l )c:߬b/"OX /b]~)`<լh(P!9b;h sk~u[^.jyp^.:S+4/S50E)MJ$ \/)ى;]S{-ue2TEK raKE"nYk;3Qb)2V Ɍ:4/^Dɼ7zǶIF}l+|i)Iӯ6#_-"5#Ǹ*k[jX$\LWT*k9RS/fJ29cE3C"^,pl(~WntCiw؝(nBk[BZn,'mzW7%B}rIXf48#w??VR nN]?èyt$+5g/+Oizp;țOWm;h2E \?0't9x?&O8vKдG7,nzl;(%Xx4EhD˰N9IJE 6l|FZ%aHaRB}TPԱw!LE^|gRP7^ >w y(qvܙf +1eI^'5ymWPX}YӃxk C-{('B-jikC Xa5cuI @u(g1tCMzC}1 GVɭFRW~q}'8.8X&>6'a]ćFU㍄-97Mܧq50a-g!-AS0u V6 T†uɷ>>VĨiE]>Or}MaRG9{<ӧϝAԶM+cHF<`l9i5\ mN]c3쑽?wþ,/'5E=/sF,/ qWR!zLYޖ ~ýB=8neW>s3 ji 4G {[Dh. ދR/׳ek͕Eĭ, QdQ@m# ZZxñ$]C'M#!)r/Eْ7\㐨[=HD#1ZmIjy~HM$hۄ>ubxFwDx%wN=T?EV 9Ȝ:?"9q:{j9Sau*Ԁ')FgQrLfJ1>2sanIŰ(o3|]fm$a"m,2y:ODyޠm5v?z(zKW8$1 ㏚C}*E}[S!eSllw< <Ǻ1.8V1}+%U>\q,CF *mٍ4&{#/yX# >r +6=N `WL 5[}ܷ7V[YRНDN]`݀Mk(v9w05K"&Fm˨x|Fnjmir99Ôml] ϶@jY7) Ɲ+O^ DkWNGKcDZ僭aE"qr; ASdR0iĆ^xŽ'{\L_ﴞV1PtID9JΔܳ$q(9 rɶ\50AF6~.TGvԫKro%V%1Ġ 󪢱jt:*S5$T5~Yg[ˡP\ wq=}~@u<u#qJ-yr2psK:‹(FA=HJۮ" HQ)BFXFW>`$4gc1&6yR"'~ k^% /t`]'OY EL1|p [nxw\dkaxׅHP3K b8AĖ$٨Sge;/ʋ$j8R>/9M DMzu( XeCR_4Tv9^4+&ɕ-3n1~{K`04S$#:_=̂QIT7=e.ȮfZQ-GT>[09zpuJ&xb Ju> s&mLQg~D iGvt \Mc\ΛIZL&_Nv ڑ0nhߖ1VLnO8ۃqeIok֔_Txyo^adxC'N(GdcH8:M*UZOe2nX[KY!!pvzlD,JI vh,1 v2l{rm*<һ+TbBAij8/m'#ߺ/+qM*0D"?:h+P_85/LXBVRl֐?( $HT ;"-Z)@g5fl;?"Vry;_&]}q3s'yY3zĿ:F֠tͥٳ╾TطB]eT :$|up;c y1CZW"N} i{gsD4Ƌ"PQ}MJhSC6a-j{AZx5>b"ŦY(ŝ*pjLmGmt++Qf^ZʍH*}קLѳ1[5,FO~0t{ex, K  [n8a =ڠvdDJ,D7tP*{vz/;ΎtQ onyb͉ީAE\Q1hZM Z-&xf`qxpCQJMw<> %6*mAxF; xAP'[pt5ZuBטhӉx?(d~`7v8&Ɯ_ ?Oảʔ5dlru)Rz<xsT"؄1{R$zSA_3Fwia.>նBWQ_ѢO( %=k߇\ʄZG~?G&`ο ,Q4H޹@ T=uׇ1xzܩ4^tG沊IGvoBڬ=%c ݓN@T+ĻI.cWi%"\>TX]_\v>h_'XfNAnM<ѡ/}Ֆ8.NFdkVvE kYzrzI@|/{K,2Mb.9{j N|xP]C$<=> fk!SsS}/-et] PRWaD; ZzF΁¢5 B{BЛO扦oJk{b1A"8/ I~|Б3r3ds%^ g! |f9T_&STM<ɚcٮFyˬMQOV(]e?cSz;$t\4.Hu`hЉ7)ɇBHYBnU_-s)=;v=I%{"(yNM{rSk&ݢER2nqNP z製 =BbuB*4g}ZqU'qQgwLFovB@X{yN}[g!M'!<2~X3 >gl?.v$3- G ?(o Hćs~(|:94˻inMVRni(E8^R+nWe2 bq{1دO~^ =7ТlήG,n\ O^ybljQ%%2N{_Nk"ίU]SU=rľp'hg§>g뭮ktk@/Rl(q|)&ˬp~ؾchZ B]KK?NhH\٫]_9O\F ߘ)<?b{~%2Sv,HwaMHmW9jJL*onrzTuqRZDgGkVrMBAhV9+JޖOod>_=B ~;8'i{q\ (m`E4UUU# _8&_H91īޗCZkp]F׬Ս׌@:B%3a'z@-#LRLl1w_kfSڅ ܡEDk}}ֻpHUЙ C1}&05kL :ӀtGA+U#wB!Y 0\媃 0I2Jtm,2x4$\(ܼHm)h$*HGGYY(hcZ?7j[Zړ-C*>`5_R#Was9I U׎ޱJI_gـ;AOa>m>r|yI՞KYIп[@F_!؝i|p(\do),/l#a?<;z+< 망XhvwW: M~,K=Fq ~>+Lm,{n`5~gyPad6X1ɋ(}rSs7LģSU1䚛T/>3@sh:TU#U5k>:Wpĸ+H5B e`ʟzYʚtkĥ+PfTc]sUXKXB?EpL=gD)jgM2l)`vufsUR*|)gͣCk.hc#fveÀs_7+L=sZ0aPKȫ[ҏAOo69}&E bDH'dxӎ~/L a(b+Z8jV:X9Eɝy2ZdX1?u5B!Sl77䛃cx;%9[U ,EUN*tg LQ#9ǠOh9ZhT`-]w,cLL}~aFj׉j&^6~ ^7J3gn_cx1Jʮwk{> $6FdaSX ,i sHv~! u.;7Jzp+]G,lcD{v(7$+lw0 )?lIǥ߃#J1d<4P5NqWY@N~Zl#YZr%H1;+w O>|~==;Tŭ3~A} RDP~ȹDڹWUl9w˜O^Xqbov㿖2^Sk7s՟/&]hW+;cg'Y0 Mjl;;*2^7-:FyjpWѰ{1L5Bt){^ s2D Kb摝&PeYa"V1Th]<'m^0T(GX;c2=4)^,U18NitGc BK%X"ER%YI=-Z:pa}NkdH}ȳT/Uc 1Jq3daq\F;:Hlrӣ̌Z[H(6{/CfX;4YúX/s=%n.؎Q@ێ3 ZiL{y('&k 1[xWJz;-iWYLy/rCTMRЪ WHܞzE~46ꠟШ'֘С,=׋lEvǁf/*8(kOOL"](xCJ^A?2<|ͨJB o%m?nV찼G8J?˘lЂM:~͙ٷi RJԾhT%0R> R iw(cm)ĵcO8ٗMwVnCD#waک4ʝeQ[S뼙 FGԏ}(}.# {-/ܽ0gʘTY E4tg:{PȢ]B"&4ҍLɳ;?1mC/ %ZNi'\`Dl5k  3+bO?<4X![4.Ǚ2kI4O8gWl0bˈ^Bzb$tXB\|<V p. \um(R=ґmtZgFAܫN# HKNOaPyjemͿeD$zy' &o}-U Jd6$qQYO#feq2̹=V*25Ws!$|S_A~rZOPP>SKq8nJw/|V[vzzoy`\$ ;Zźŏ8ʑZ"8IH_mh#,ŸgA.ȰuA:}l?- [ CTKڕ&hz9:Ȣ:?i]#Q͂}^L(\J3\fckd/:bCwgf3pL cN K/{we܊Lؽ!LSIB.":YnTI ct z[W`5ښ4"^P{E6u9cRbyɱֹ=RMx1niI(w/Ƴ.蹛eK@WQ;|1WU"5֤(JSp&+Z ^/I= C%[g$Pp%*>F|{V?юN6BpjG7 ?~3PRA)s+ۆ5"\DA!WKzX91 w]aPCþoÍecxgxt ;OEJ&E v4ߊz <&{KyZ}|Tocc6+9WG*xFv FW^5m9GΙF\4n, ^5|/Ar%&mv ,)f`+JaX>JmD9eon_m8Γ 7gi"R1jnK{nyBq "07*`'"ZέSy0LXx[=Vh&۵H_PR Im Nn'`;^p!\ʅsKX3.nugG2gW8p ga]M:EthnBJ>ѕKnwLHF 9 BiR~sZj;:.dAwWkF[V˞/Lzɞu9Ig5խpdc>BZrQ72BUcnLOϲ#YiEl-{Yp$2Y# ^2+6|IjD}Tyu[Q4WWnFVdki";ӟ{v%eӰD6]JS=&> I?<Gg:u=lǞFt@}e۩R?iOϩO h_C0}NC#qԨ}2^vS#[k%kD}dv!Ь̰d,i6DH(P:ZTVrC8#_yQpLy1L< ;0 ѩީ ~R4&^J@2GhW~R}5w!qu@l2I^#E _Y3Rgna|Iƴ=i3^)Dָ8r SzHEX)nH_I mY- dՄj߽6zHpF|wl/rcfKAL})Yi/ ;v]ma>j,Cۙ˯慎x/6?U`Cc5صBF4Mb74G< $93-Ia8]ed[ ۅ=%G)2 +7S%Js}Fg@Z y H5@ OLuHİ#;5TA4& | c Ь7rrt?ܯ{zsʔ7˚${W]]z.rp0$dw¿SL'v/ ];/wѻ.|I{5Dٶ#SXW}';sRHP',oͅJ`w$)ܶT5!fB,RC#Xف3VG$~8z(L^ Oan ^I-ИQ:,XBh)=u zGzv$, XzG6G΋&FNsje|fBFbg]<"9C[ǚ\J ܨҖ8p3gHSt _H R3:J%)P_EEZIpf֤*©:S s3wQlqT@1΋MwI7aTj Y^[ }L*h$ftn⑜SU9R=. !Ԙke@O.@.wS)5/8!B9RQ,|8biVCё=Yڡ7P_sXS,H~΋͓P,63r$ug#րY~LjvvA׃Dk#<>e!W\|SbD%*f) *g ̆RP jA(CNS guO#1D~˵$g&N S{ R'( RVuKK&lUrߺVveX1\AF`'X0ugPIOi շ6UERE]y;Ƭ]FvL~2 co~i0'Pt7G?78PPEiEC驋P끊o>x [vV<ϤPl'LRZ;•|Elu!캰0'fHΞNe̽^䆒.}CĠ9AwTSKNώtlVLpȔ>V=hNSD~Q6: I0焟C=! F~<֡y{TMDšC9c}~@36VJDO3L.2f4DSo_jZ!vNʒ] B!y"+a TG4#ԝMoZyfTO@݆G-f6t˘MoHK}!L,3AcB-qs $Ӗ ,^+ O 7Ov$p0ў0c.T8CQsψw6EFBwHUR!Uy-{]4hrHXmM(iQ.*:=fd%K~~x_۠ O֔2#'~{4{kb=SXgS#9P]6#u`c! cJ ٠Y%& Ϧ6PGc4Dn p0 tf:};j}8o>ItYY V|u#OR(.!dt eLm]_Ȓ[֨kZ@}SY+V)TZϗm>xYÀT5[NHaӖtҿ30iLCY=M*_ijB|`ߎl(ԝVI|6A۹ڌ#tFzhA vYvNe.12vm&os=(B7O=ucP8Hl杖6S Úm^؍۰ׇX= r+p#&sg 5x"itԛ*J)7m50n#QKn \E4_SA-J#,o n3p֚L5oU5kib~2+Ӯ3'AsZ1ui=/w_ R7[&Wr.pwtE={d?SE2L\11*_o{Rǜ(1l$_V$@^<=Vgդ\;;frWPJy2YP:^R$mkU}(Â9 . Ws#J'ne3%wK5A:0 .2$_T?$ 9Ǎ/@e Zt~k`M{U@k^zdeH:\PxX撧3 İu3/CJWEZM JOa1g5'kr˴fb@ѵ- ve^< ը* k/76 X9$-0H4.cG MzO[37;MZ૨ x.rp !B ՙK:\ esk"2})"?r%$Ͱ)%km 0=u2nvI;OXo gyH!2n=GŌu(,R}HK /wgۮ&G%/|OқnPCy- /z9בM2rI|yysUᚄKs]e"%tD[tUog__nr,D~$pr)%0ר.b7r̈́-NJCkntr ԗt\T\$@W$d ݅T_91 =kIf=0Ζ"ؙ`i SF}WK0y\8V'auG݄2\%i.b_`B7Ϸ+cYڭq{RP :4"@k6"Q^<0,lVBjudX V$'Aeِ3^VWnSL\mr?/OB!Zh _I׀~fd  23.B V:4( RY ճVSحUIHsc# bO $`V p :j*CwDmH4{ y!vCuopZ- Rqqu)M"`&r=}/9tJI?~T=wAؑ#r~Sm?`fza0ŇDV] GGYfF\u ܇߹*6.E7AH"uU`_gdƈ y"A|9x?+e49;K;[\a!Sx40kc7 &u,`Y.f@ɿةQbA40$fPv T9N(L-{H@H7>FARCmlI3l\+ѹKBzDX o"d_ $h5DȜNVG*8]w:9xshs>gd~~X+myeU@~WFgw;!)!e;@eO&0u,dN=Fbnϰ̚;uPW ,39e؋eQFZ攤i"^<#DF7GCf|< =6-wmZɄHE%\*L#2Wj|X"luVuš;Y9pEZD75!zn,4' =Zqk@/0pVX CǠJҍ_ z"S6pYǼ6f5GX^mu̾6(.N |~!?5ZIxb]Lhߴޯ}"U *P_{JPQ#ikX.4[\J6|pb<#R8(]1W+'Ji }p_ZPG"f$)PeAģ_ÊT>+ʌ O@lMP:d>o"Eb׳EG Fmh F{hO"㵋71-w3D 9xst# 1#8 ~8Dm08u?m8%;=lhLNX䐎 UO P]ġK8$wv]K 6ws-gu>WXY »)SYi(hV}Wĝnٺ0yZ V-ӈ2ɚ+BtVTq5\[h7:`\uR%_  zHE{W miKȘħ`W蛸?S@U`~\n}baM|p8_*m!1FD솻 -3\3L)PpW ˜$ ֧P,AǩKLPfa7~/Pڭ>]3S+٤'k(͐MmJf 2Bf^+3o/4'J^܌) $_kX<4'B/I!pQ&rQJwiDAݲ`_uMI!e UF\; :1zyH̱{տZ NC-.L4ٰyI\25Drp9ôjHwr`;!zޠb5q7 D(cZJgH]c9Ҧ)ȨeJ;be#}vI,>lv  49˪xFu\[IzfA8Tn2H&4ԗ2߉Qa'a#?aZXHaG?F%%aRP_ۻ^|\A2xV s%M!n5ax60Ie(cRUxQPE`ġ]"&YjT"UxXLP{ h@͍W~oMxwggwF{GDS#K%+l0v>4!!rb 6/ 0RP%1-,时unoyP c4}rÈh2A4(*aSԀX;i%y*xdB<`s,cAv9WțڌQ&^^o7@ }7 *S H۴]= #C'4T¹[.G jk9I|s!CmLhuܲBgq`}ҧ{ӧmKbC߂YK#ħJSDF7 g6[F Ff &.iK_IL3@9Fl' !ش0v4Meе<)`qŠtW^'qb"jn2X;T4be'9,<ե/a% %Qhe6>ytʲ\ 8-f}d@~ųQXAu`%"|9!hEn*k wa᥈ B IDL]C2JZ|At,}1%hx{,jixwGu g[1R굓N7*8I5PSN6܋gkm^pY?Ws !3ᓀ 2bn\`P{$u>S9/6k֞S"'C2B}WD+~Ԉ&:rО^|7˭1[>8ϸG. E 7q#*â+}Z|WՁzXmKv{&j@=ƨp X+. endstream endobj 62 0 obj << /Length1 1649 /Length2 9086 /Length3 0 /Length 10163 /Filter /FlateDecode >> stream xڍT.Swš@p)P E $@.E)ŋkh"Eז9s[Y+7l&zMNiDdմyx@ ȋĤ EC2c3C.PGp`!xj0=#(#$ x@9 P8 .LNp ZxDDv @ 8|?+?jo r{ExЬ+Aj[_ϝUUF@fm. PXS,~/=tt~U<@6pyP.0KG p'6AHoUC<0 x< rcQAAoHpk#A>?Hmzb78Ypjnȿ _!_P <|H/ >L7{?d4-]w珽x?9b0h<Ķ.Fʝs4ӖA1f2[uV*R:y<"ݝ~KfxkVfړ[moi9u}}P[;U]k])z-nimW Y6*d)"3S '#vci{:xl߃"o5؛^_*ty]()iP/G'evRTKVᣩI;xwXԵủL㢬ܨʯW[J0UV=OZ,\i$@5qDosv0YI õmH`4ȹ̏# Ɛ2򅸱Y䱹%b bI\|W'LJgM,kEta!a{  $ ݜG[mM*MF< W:JM斥!8DKSm0/(mV:[Ts¿=ٱdJ|utyHY| .s6((Vմㄽ߭F%04E[3OCJS+wR,DXojtmn)ػuQ!P2:ff <emVܾCuS RּsW`fl_]@@Ki~݄ 6\jiSl:ș U G3/^Ws4g%L-W_ φ(*]}t *,#}{ $c !E-EN^5H|t` [, /cXrv]oK[G4f,uћڧ:`܄gSR&;dZ.`h@'Ϙ?.Rռ|9Q*SS>NȠYxuƉ H2 FdBHBHU)0j[Zr2,,4(5F'̑_~ ș (_&ҹիx=i$bb:6SU[7Ibըh>`Цy<~W \E-tPZ]e0ެf 57fZI,XdmiFro@_*̰`?[CT]ݺ(+G`Cb?mM"B쉯zrHHRBZdgyF]'}a&;uxbX=p>)ppkz[N>,Rƒ=^㵾FtK@-y\xz*nY ֍󅒖' t T۱?R(zl)Q"_s=|r ((*(&2bgP3\}V*EumAMn )!)7St[m$R*Wgk[{차 \c xB>e kk0}#e%Z鍞^O~K`!G#GSn[?`#tt+ %X*D"z9Ұ<氲YOtqۖ[?ElR!)sٌwypyg9VQh.H9:eb(3BՇ76QayI腢+6?5%Kԭj&a`UfV~fgEv:1@Y"zt )u}+/7+5o{|I0&"1"ׇCjÇ >ȖswzZF듹/rMmy*1 ?Wr+X?IYQz'PJ qW91o=/6AVoJ$/c\lm{\@Rdd_B+K}N\zo$6m?Q`j1]哩;ڰQmžZ"C9jjT,5K[`̍ӽ}K >.,'H.Y"cGO] Tbha EΣk9;1F,u{I3rT7 CG-5+D6i&"+KfVn GFG2bU{e%/.ٽG.ѯhdoyT>c|jni}!5`gV*+ed($ ODH*Δ xt$$*T>9HK^S^)XI䢱C$ÁGa*Wif#寮2J,DZde$3 ö3n_kϱC%_`צBZDƕ+z9ٷBE<ψWodOUW"6F;13^IwvO 9Vȴ/. .2n Vbi~e#RI΄_gek jO(1<H^*lnݙ1R6tOs5ѳ?8nCd{SXrNF44VmQ[î^ p[:=sh~H׸ par]I#ka8%Gml$>Mo4ǘCMt2H& F鼘^ 2qވ篬ۥDme\>RӾm4Z}\p[֧?4%̸ձ}c&К2^={6# XohO'gJG\Bkۊd]B =[wRa:ɯI1o9ײUrԡ /iJr~uCRĒH0>4m$GEΆ$Ї7 \/oI%80Â9ӐJJԥ~2#0iiŭ"ßb63ha'?喐|k1w60k]˘;s%KKă-$wai;V[ZLuUog ~x١' AyA\~iAhΒa]v^o'X_"3٪*Ci鸛{, Q]H[v}'=&v4ڴ]#>ʈ(3QSf~kp,_'{𕕣sMV9 i~ |uqQGu.F\zB6.C^3L͇C^C$϶784lf \L 8`'YaůwtwNS=t _\[~_>ӣ.e|ݥD]fC8<%P%ԷfƓ{4_~*?7_|Acm]2vY3l/4g/ -W6SzBϑLY;}p=}MH^u᫋T,@ow9јxSssKLAtA?e{5N=-'M$QH/'ݦ*X dQ#JPO1Pާd d3GoU'rsmEXlty/eRZ>5>45YdԲ4[(0n(BŗxQzr+6ExW C$= D$IG"%jXApwy>ÃRBuZb`cP8\#m~۴ϻ,?+_ce*>@b#b4XEp]oV RɉX8nѪ2m>*8[~uR(<$/0ѻ5Hut[JG__I/u& RgG5Pl&a,.5~#aX|ҳY T ڵ'Lf2dǃӱoKzTqo$|;Y<)c#Wc|a\6{/[T$ܫ8',aݺꎞqXV@b4,n`Z"[&pIuƫ5G:tZwWN-w,+ 'aiN bzw{ r ?_>ybL|KUHocPdrgf}zhq\np 7]If}8`~~hN T# .7p3Sb&˸ )D/<]|XWUƨRgp'.6MiC}2+’>0Ei*8b"U.md8@NXe#vurqv.-~l1 ݛlOsg?S^fd#A} E8m.Qz1s0 N^{9Hh&zZ4%vyH`l$3 B_?$vKupf~6~{%cgwp>_2.!#VS>R\~O7{c =~ЏCp"`3L"$odIMv YЮ*8);*O g̬ܰV=f8kL.% QhǤ)s.oRͥrƎARl'ZGj4?Wa}fԢ5mZM?@]Q.lM)ʆ&6֘c}m珣dmxn(n::7(w{mWZ[/b_VȵyLjfҺkf̵>2;OV^i[-Y鲷0PΕVslP(' iB. 7]eLщ Z2|k6Š"w̷Jsm.?)$Qj 7;h/\<2vo2! G> stream xڍvP\[5݃,;ww2nBpנA;$ UթsV{5j,P3 .Tssj]@Qiu@N`(DI'&ty)C!W;WO."I t[Y PVvyZ?zsp= l. ́vM9]\YάP'+f;r9,AtƊJ в;aׄZ@'q~pXO4 d?̀?W?%C~͡@'bہ2J.. h }v@'ʁqu?s6w;8:~+.KC,$ 3N mddm!Pw Մ6 dBfr𰳳 @5ۯZN_|˧&@`K 8|7BX]f +0OfC'q=}= |dd/`ap΢YߡK(@bv?y߹TOkvv+.Hqv4e@ cfA`Wʻ@be6e 5bîkVpimn'EvKJC̡&trz? 4 B.O!|P'_'`el#~_ xbBOdr, 9lX? /i!_}:9=Moe>mkBͅBljB>]WpgMe`wjsDzPt)s7Ҧ4Ń^sRx[;{VԹ/{}d(,Zb;>>:p:hs]1{e=jJGfw*yK&YhǼ,3˚!Bta!Cf=PH`B`3fkLӹ؀ wd⥷d¯X9#Q(鍷zm/ע^zچw|d>I!Gzt ثB>㰚b\v\ϸ(L0FWb; d2zhv[KE:KcM]FXTKkZI16A>JF>u̬ݸbe9u꭯mI'1ZUz)WVYr l"a7/7ugv/_2zlXO~Z'wOvJ|-?{ϥC-}`A>e9BHY~uwE=&YvltuH--+!1orc To_d1Nbu yTJ^J[N~Ts&goU])pCZ3.-7*^̲Y2@hfV~2ծ`χtcMm%yc5!Ec) Ƕ p̹a]st/-,£򝉲fVY=ߩ'mړbQbJ }B!4^z~!e";4g v_~O*%NR(Lj /D;x*$lu^EEߺeQ2b".Rb Õ4'g#J*|+c>qV\o xb<82@J(hMom~vya$n`is#[0ǿ-hd?ޔ ڽT#WƉ\($#|.ml>K.RȘAX%,c{rb/dTEδ茪'ٓ4f7LvE'Ȋ]bb%ؽHW_{?x3Ѕgzz yaNKړߜ=u>fUƋT-׈vuwtgza1gu}|l^:,P tK,놇[|r$C`)[ r (~;LS,_EvX-c+~A3 WOjg `1?X7]qX*L+v!DْLQʖ5"מi?;~֫ZfH0TiOHZJb{l N8 MR'Q}5*A@mݺ۱h~ѡ|~9-V:8z75aߞ]D|=MoH9_F+>gNt5%Z {Zʤ*6^N>).߮O~%ȬUnx~Tӯ`xd .FƏ٘ hce < Sڤ&l@Rv1џr,Lj1tژhL榔RS$Dyvjsz} Yvdp^9{pPwB;vP-9ݳ|*i^~km17R/anyt ^kQ!{]xDd HcKϿgQ'rSR|lӲ V ^<>b yՍ2_T:wPQ3w uuNY<)Ao˗LCѮ0'H2p* T򕎥utP&Sr q@`j`oyUN:}!#İY~s-&P/%*G4\|o R,,Kjq<$ $Q:7vTYB4yň%.qQ'yVJ:-oG[% $lpUEi(3x? < ESҴv[rNFo?_00d]hz?̓}lr93۾Nd!x6+c{$=5e-qrN_d\RcFx6>m.iRva_0T<6DC!G $j|҃g:sQ27sw-Q/Q,ap˧Tr:1@ \pv gKAlCkcCRYڴiF|0zYb9Q@wj'l/6^U u泉/jʤA&5EeJz:XhdWY>{Ş&~Al(lwmGɾ`=Td_Qހx,^';{u[Pt;9b× ǹ{IXM/-7%Qv0{i)~o%tT(hk ]rl6D}[jNBhwrUGX{/M$E7sDq_lj^(uҹ SU'V6Υc[/hT]⑉5.S!uYkVjܯ5 h6E#H|1 iM784D3]K,$\B6ɵȋWh'̄StD15ahFϏ?6wQW/:l5X3aل[N^  ɣN~&Z+${O9k5gQ_AefS9IV8yײj3%8+Ȱ$jV3 A"gqbv)8ysgL!WW׾ٛq[u2C3ͺ D∿/ɍ)'jd6g`ߊ`zzN|2U x󶇔ieCrLbM 51:8/‡䔦' 햏lPngX6u5/`MB"%3*0=E)51'Q4c {r6:okNod)ulGYқr`$.Mj"2M׋݄_Ҷ.jB* \ x]jTe3<ëh"~嘗aQKˆ?7 !Cn6 J̰+2{l,OVi.8F0vI%5,SYCȂ<Iʻ ws u;jwR QƣNES5~3j}[7,ҕqksKK@4$ˈܔ1aE! { i5ukwRx#oIO2{:Z"Rn%"N?2zX.0eW:R??rqRkt=APXݭL0O~<{Jģ"1f *=FoOhЬ[] R/픧Wi6%AxyG HHQ4:(T0"[U2H#HG_ `omhbx& 6S((f GgS=;f/J@JpvLuHtj[)F=1 K _>,gߨ -tuƄۥz;denB7Juf4b>앆Q%؁xǨdeE;<şo]n]/'fS(D= ;K,E k%.`$+,N|DžyL,F^d8q[,pUh*M{oU](dj ָGTإK0wƊ(kيi@He W?l|%VэVwT4{K/ Ѱ?&~yGY5;i>M#8Z΁dǨ&>t k}'ԷU];6F2)&<@LZccnןuMhkWI/=28{Uz .HW}R6 cL C S˦dg [QʐumЗkO[ӗ9%'N1ܽMj\2/pUol|^QX ͥ1]MzBQ~eAgTvVkY݌4ꥫ ]x~1MW"&US\+\GİL=KY`ŵT j*Vr /Yu`|9gyO5[]&<x f9a⌚ XBH\떰T~Vu6s\IL?ͦP4oc~Yp?${bγVEb6le *ɪkg&}q C!́蜌C!Cef옑t}D2ݘЊ-ʹUdv$\*|+cd{m%iΰ-eՋWfn Qq8l5nZ^jNRA7ty%=n%m fĶ d=[St/Y`Eaj QWzer DKskd!Oq;Gg.Ȍ%L$ ɾWa]sBιk2 Tq% \k: |Q UҰg`$WOpo,"ioRcd3̖Jܜ\fK+L`=aϱ6{>n2E6aɕQppK!EG#Z(O$[GPoڀ{垟kK?n;UCCυuR[jI kJ9wBrz^0I"WsSk=A[兴O)J"w[zG&i5{1OVo Ñ+.>{W|mZ᭿Cg{KORXWr='GH8G4U+7Nшss;W)gly[;`)BN*S%^$\͝2/`UnhY$`K o>oC/[tE7AZhlO@A3h.mֿ4,/uIs|7MhQȯ+8^uEYVJ^£޳3$kԻY Qíw) y)Sb*X.vY7 ncGS9vyC~J yU)\Մzb#|KjH&$Z0\xZyLd(:x`n %6yT9B#7ee@e*H41qBU1M_=BS79(ۚO1>Bs$HX/P5@0I <ʻll$d5į >o@imd=h,)b_"!dZ_q΍9I0u8]NWxnK؋ 9c)? Ēr'ͥ`^jbz;H]ȱ5ᗊGl.y^ ry&0纚r/&F0p Nd1{bOoSϩL}ƀ`:} ; UHڂEʏ5MZdHnKّ|Er.D@ۙd!"S/ʚMGg2qVmF_5[zgqK6$DS%-u7+kI(0:N)dKc*agw0),yp}V'c&fa‡ 9up]u"0ٰlwO`}6>-L+$ d3m i{ntWRFlڪF5Wf%%? m5 |fSe O\I;)[[hעo+-o?!U1|}j)NIEyލX58XN%i"[Žm ϾGLdrFB endstream endobj 66 0 obj << /Length1 2188 /Length2 13466 /Length3 0 /Length 14781 /Filter /FlateDecode >> stream xڍveTز.h,4и;$w!h9w2-jJwMI b`twe`ad)ɫ0Y()խ\mA4 g+{qĜA@78`uX8yYx3e^?$fk(hgeRo-VYo+m-D-Fo'L1[{lA.V 3ҽ횩u6@oQ%M~+' B`~*Vry}>'C)(6N !qUQ5" C%i[^=-3T- R ?Mu*x{&zY,{K?R}/z,ON!̥ pZ*.x6q#d!85Oʻi otRb)#;k 4^qc}182bKZSGa"^m%9 uR]PFe5!zEDgtcrۋXz],@]^YwݟjfX*Ogݧ E_:)D ?\Ҁ{IQа#wYNΑu^+EƩkM3>! BR7]'0[:B6b&Xa^@yHKt ^"Y y^0 `Xݗ~Ɨ&f*Hߦ}4~ʼӃQXN,kQYwcZb^IӋ&BJD2 +s~<1;cXJví=kК׹(52ih}7Ls#xjf.==(/\Uc47 [nl]d|Ʉ3j`| 9kZOxuuT XQ>f@)r9Z$VQwش(07ν5HWvu) 6 @5tO*\CpT? L}f YH.7vox3:5UiV*(*i ?4vx4>$~BF6 2Z%!fXU^)vw TsFƺg: 0wۍ[Ơ8M̙BļjhlRg 塧= #!U: dAPjØR ^Jxf[ ;5LtBz!IQ5Sա ja.ѲJH&yQVp $W\&PBHCK R7TJḚ  >n,qrE{eKvZgV'~V.C ; ، -DD@◇%wSÄ{e M)Fbwuʸ-‹M8e uKYIӆ&M('? ag<+qhZ,O3A5=:i] nD#( CQk'QӄQ~Đ/k4%}J$w-DNeS*lkQG>`:e8#a\^jŢ>g3{_إGZ?!36ubyKI(rŶ]S6/|=`_kex۽ohdI sF)mY"DoqofS!"mZX#%vI U=r-=4Z랽p=s@“ie׌g CWmI &;qd}Ț<+P]m~b62"! Ӈxuc0=0l|mf7guYpT5xr Q%AmaWH%kQJp-}b<$Ʀe ox>E1/4:_h7{x/)Me O_ nJ ԰h/In)U^&cv-Ќ\tH}c|Kg wZ>nA-@F/#.L1_jȍ>"_a3,+8SчT@Oੑ&WL 25QA\nl o e]2]OG"='>~rF4$Sy$뮕e+rK1k{?r!ꞁ+YRXbو_֮lѻb>)}j@O{ء?sMQy^CKtHzV|@cgl3y&eF܄̓^MSEG<;fȻA ;FK6bn\#Y;QTK^&}bOD"E^qثR2Pe ;ɫoˣg'_.^XCg g³RG+y]R6UpE)dAƅŖl?2lN@¨*K=*un3HwLc Lw0_qH Q_#džIp'&tSzn/"mҩ:t f{ ӯ/&\ߵG#" 66y+q$O׈xccLi87KgRs4 t>n^da&c$6liLg F!Hj2 楇;#RNbvC\6׼ĹH#9P;xp.7h̺.Z,#=cmBMÍKd:|]DRf.S S{`F)?/7l8S)xQ!{Q}<:ٚx"̄!(R1Ab gu̥gR8kϺƻg˂4甉3s=o^rЩvȪYA9Ӕ^x\1Y޳MHH/IOFY2)#IjW!YP\]n{BaAl~9[5pɝ")"!Z_jŇZr|eٽP:34'q:Α._X>x߰2EN[:gxRTV3>9qiz!Q% m$B+_cTF<_џOqczNWԚR O]Ca].V~c9uA$XjC-ٸ"3mzW42tOϺ!KE(f=c#[~?xM+ʄ_"0#1xw3P:IgEQc⏚nAK5LQhf-YĂؾ ueb/hJ/ԅݶ"O;/0&֯Z޷:tܹYLֶbqlvW-pFhOfcAvW%mYL`rmN/^@2^W1賚m_ydnѰ#%0<pa{._5|Hz,,}œ cHTg:1 , Hq hL>;ʯweRP,@^=v,XN`YoT2_q{Fv#;%YYFު(7GWk:*궵& ޮrzqk"n:y2hw7Bݏ>iJ|ݦS1k;/ܙ s?mȶ6;D,3)|`+SI h{!}NC]&>ւ3o>㹥 *'/I+YGLQ%{$ q.?]ō._qٞvk{8Z dfH*OR6 ffJ/ށc5tJ'\l$íJ/uBAv(MlaO$8W7nS|կdrZ9ڀ9N-Uˁ#&.GO8pCA }@ $cH%EQ9.d1踉x[/j&bvEFwL9Ū ض[=oU5?% $Y?iH;̈Ⱦ8qa&F1'ݰ_w1ĝϒA!_2O,7~? }4uN`]RHFtۼpX"_KP֑ U'-L} /E\L?h#=V~ZT_?j J)<9q֤Lh<iId?J]ᵛ棈w A*vn0kzgg3hǓ"Fl ['4Jٍ}Je(jTV*I厩LVKd 5M#1)q0+2~[䎔FF -OFZ٧Y9u^YX, .@]姴~y{4Ѝ8$OpXۈRd;yH>C!fK#;ᐮ7G'UkP"hӟc1.-Pй\߿~xJ6>Y:Ld?Dv:J/fC Ea+de7EÐe)ڻP^[:334Ry!HT\'m j8샘?WHs[E?$ ba1c,B>'Qe^+$4@&1=6/ջnw#lx兜נN8J_+ƃS_ 6"n *X?rMBl⤏uR,+4+8&Lzzc(W8@B ՜rJ &&p]2r'ә[gH&Eg)?5p 2ԋQx{tV n6&+DR{Ocs¯l;9f. E cE'T>R NOLW5S \#y 5oB9l%M}toCĭf_C !pmbRv:W_E:QGJ7qz>mcӋ"3qpwNhhyl$pKeV qrX,cB?F^h H({w!^._:ڽ{tKBrRJM dju 8rEw&m'F3~0]q4էrQYVYKǒ/+ƹ91\2nG4Zw|J 5v)6Jjb১.=V! ?ߏZ!4sK?3,3a?qi&BB-[t)ɘ0ܛ N=Dqy[̒\_(ɋAFnZ+Ev1eƫ]y[V* e/fTfݎB%hMWKf3iRj;ǟ_wz<5$^d2c;BgQnLj@⇈7$E_t{G> qGhYI/Y'@ZnflaH.vciFu_@P9vgTȊcW]# pRf7_hV6֛Vǂ[Ud0PWnYCZ %~>F7vƗ>"~c+WX%/}3A1P}w$)GK\eRҼ>HljEAr ܇@#~>Y4WvV7Ǘ[%ESHCnЪms;%|whJ6IP@LpH ԕ gVk1'@eJ/]R=PNd/tkѧi%@]^5BNK>MLr[EnCBKfGw/-|BHqa_DѳױsG&ŏv$OBC|ڇGQ]-II4(`sYňfľ "Y'yfd+m3>eIt]߇S ^'L+I\bݵlK|ry#Vx_nˤJl)c5$oő}A2K.]kagJэҪ\R%?H k+}KERp>>mI!&8Y-3/TXnR'~38Nv'*e> )Ғ}Ò9]ǐߪXXN 0!Z H=$6+нt;rBF;KGs t`~&ckRNx[:d?׫`szIA uTZkK$3.; uME9A,ji_c˽*ƚ:`B[WD& iMh܄:g~zF5Z'$\^ [YeN1Ni\~3ڭM_7mpYɋ-5 a L&D9i{ӟQs.*6\jѪ6-3<<vcb*5ݹW~;(hjCuf#^)тKS$u"$= P^/3\ i*yO A׭T!J/l0/bNC醞֍3 6g+2Rl|so1Z@}[+3}½g 1pv;i: m>؄霖P8 }ԁΉdNwC NKKaeL8e`Ț@x} [_杵Ue+ v - yU=Kd(5<+jWBSۡoi7;,6vUB?ccW;*;m% h 9/Őn!Cn.XԦkbǦAu1XDa m飔CBAZ@Q_ڥ,48TW<̱FWr* #e߅tw+ź8{;r1~U<9<@S1vl3ׁlꜙp6|#~j)):Vp'(~wӌx4Wf_ P?b:~]tPO0Bj øn?گlUN'p_Y"~1yњғ16=4&i"]J1E _'/%W7u֨$NW a0њW绞ȓ%Iwb'9+S*&*>k4+.+.t5@_N}ozJ> g֟G9*p) c#/ 6hR$pQl?%m.Gwd jڊq] suF_Pu6 {C qk P;hX)ʩ+ȣ^t4$#CTqʇXW= zՒX0Mkj'h6*[0{hks%Zjs^++Έqy>w5q'g}W ZslP˞b$_%'eSODZ蟳F,s,OaN#bֲj( Yan L79$JRx?wyCš/QyJĬіNZN$rrliǮMri·о3l#s3gK݀ȡkYxXX:p8S<س2uyܙs?{4!HʼmG)ohVjPalDnZeüRp%`,"jӈzavfuGRb.Sy=@͚ۘr}'A5CY賥G[xpkĬI!B?Ei8 !O?<Q*)X'_ -A~XK ș jFaA|O!:ׯ j`G(;~'jnvWY}_fcĭ,s.9Y ʝGS~K5}~Pw}.Zͬ\~ ks"tHh>NqSzln7պxh,JN\)$]sdxp >i˿Lpe׸t ŏ>ح܏]NKR+@FZ uV [ˠo2N^۶rnݭ =\:AÃ:<]9첸K|TphS@3'N 5q_[pBbJJO4os=1&_"W#7νNyܴ{B$0MYlۙzEk| |KQulܡRj|w> $_s}|Xh)$IO%P饌(a>k E Y#I3{/vRqz;|%OXn?p7xڜ{]0ltstc[+L `=ın5Gu"ڇ< |j6\/C=xf/.3Sj:\5v:ap% #|;rsiH[ cxV>сG{:|wME_& C</1Y>/Q^k:Z ~y>F,W/Lj@w<;ӓ j_nI@ilԏI ҙQcOK_1\NZۿy3mlUsgdo՝(`1;-CbHև8ӓ͵%_D FL>Oxw4ܼ4-i)]/dh,N:T eUkn>o(z{P_Arzo.ɻRh ~{tXDxrJ|5W4j Wͺ9B,0B̺ e-r!UC֠mK/X WǹڪZ4S?Q= ΤĬ~-e*yBWҗwBߦLVisb zn*ȫ\Y{) B$lUARsqu?G#ĸH>Y[G]Uü2<щMZ4 ytjO+2wJs;Z쳐 <|l#ߊ2Q۸)&#'9]H&{ r;p~sXh3d5?w5 ƊOmI֬u˖wpߧ0V{Z1k<6Pn̅+3W)-^t6Dc{^Y5 Z~ mq b`C>œ#R`erS>< RL>ps2lC=)R\G/JuMG Vaf_7q;Vi|-zIEXtGL1V3 K@>xY/`uy۶3 9|LL-rt+Ada{T䗍 Lm;lRD 1NO1i{h\K6hS\f:+%8ȸ{PϽwqUh#JgJ|Mȗa/& acw,s$CD.-3W\LfVu~{[V˵X, -6Ka]jFB!='L6A G2ܙ fr̨ZZ0H>?ˏ)9 P` w{mJF2(HHQQC0Q]^EKI1Qs8RJ¨V|]lW,ME 6:uBbQLĘ;2/x_2LbwPw2%At}&ﱶ"dp3q$2ThZ |Ǻd,aQJ/F4L⤃'a|UE: v诛Gȥ!qDQKMn=?hunkGj'; 1 ^}.y{@ }|hl= h? zjd0f J30t0 VhYŒ /pBӻtdj tyq3;)W(IBBۗ3x)?3*0<>=©Dc877Ak>i;2%]2V")&B1@^/by6 U+J3E@n$T9eT7=5Pʯ~ BMa.PwNw_ N#I;6c{d7KԈ\JK$2Z+  }ILŃ>ʸ8sw{''^E1H鱛9J:GpG1 endstream endobj 68 0 obj << /Length1 1777 /Length2 9550 /Length3 0 /Length 10661 /Filter /FlateDecode >> stream xڍteX-PR<;@p+KqP;Sh^).s=ޏ5g60+ HjkK8\:w'? z=0  # [?d,0(@ @B.NNap!'PAn080Y3@l$p%jnv~< }+aۉ1 - nf 9 z=O6< `c <VTU$w'@9XB} P;- PSpvgXBm~-`񖞖'KG[$5=ա5q%wNjHÜPw7@`Ǜ=bG( @mlbԅB\=2M^NNNN>>DG ` 8b ~s;a@; lb ?s>l`P' (&kw`?v~ p;%J,S_J`kQK `0prZ?~eGKkprŰt8y԰>T}k,s_VHBJlqS4u րA~?3v')q{T.Pk}X>~D?bڀ2? '6@?Aq#8c?i7#_y@ȿc&3; >f y\?nGHؿJGQ@w{8{Xǿcyx=%|o+ ƘY :ԅ_Hyo_pN'jd/(ə9tI^]UOsN%kGe?p%f!_?URޏATƮ_ǟk;9~vw*ohZ l`p ٌ6LSˤQH]\ R > wǓ$A[*-<'8/-\ΛU߭s+V>ÞFot{-ҩ^EIg)О/姥(LLI&-mQdMy{:KES|n$]tRs U)ml$?EŴLf-6xqkM,";:q٧vu W R\U E \4Қe:*˝xyv&oc)U 0]";;o ړEeFH~z..|zdY7}p| '_f.a &֥OD?}ߥVA&m/S,*8;iQyл[yv ;oa Yd3jWE1OQV!-]kď1WF^U@і> Q]VȒLV}}S-$F5$R1ooW",1&ܔ!VZkck8\ ΠbqbDD)g6L|Y5k gWq>+/تLJ'D`E^_j}{rTqvQ@2Cnp|LϟA` :KEd'J[KA'&nU{#1 ?e[c rE~*ȮGy$340 %)f54n0Kh2e(.Y^Z1Fz[BnYSc@J"([;N1.aKD*UYA4=PmMWb`tK/nO$ɰs "֭ G{o.I(0'UsؗF BwA'=¾TB^6 tZ.o3Sb0g^Y v0Z5sB8_gMK >_\/+b *4jlX7 U[/W \rX9b ⻎XcʬW(}2- BBT$14.&!OKo@ᕤpL\;qu1$Amׄ*eRW2EP rQb\R5%zyhy!vCWt_~, ZFR 5Ҫ6̃|Z>,G#Mpdy9H>!G(A--߸CBs5"L?dR2uCj5'HU|)Ond{vma/cͪOZ,STTANt}{O<,6kV-~H!j|L#M T #*}f]>J*;_EO^TԊrݖ(x'OMaz\ׂ@TSs$5ցdj_XtWhD"oMa?5Z27r `?@Յg0+' #bT7ߗHK]'hS1_dJQs=7=VP /&Kuau8w1#~$g;3\>Ir[Uӏ-N.}Vxl$m*ih0ҵXUf>b3ap},RALat~g:b˭**s_(ɩef(W"LZlVϑ!X'F,=-)r-0bo#'R$Lyw9@pO~J":#kSY׫YBR >:6Ř ʺ;0 =ΚGN-;=C1v3VHi^ғ/ e9}5i_%W[GпYE$ewjpCOJ~GͶjܭJ}B\Sʡɛq5v UiPr1|iwȅ4cmǵ9M;̑dZʼnzE^l0j_30ٹ]Å0Mrjm):؃g ڰVa$r%unmB:}*>V\aDl#p-y&Wl,A6=  DxUUygIv?1@YMGA} J~_Nj'0IXFfR9"5㺲87 ~F*/|%k(<03z2qƅZi*_zP_XDpPVpGܠu7t%VB>;|e,99ZBIIKpWA'.ukٚUVZSՍK$FiKt"M:߹l87.XN4{ѯC0T/=ܸnzr;`ﴮqjQ .4ɚx/|ommØS(>w<E7f%Xʂx9]JK LM撊[i1=S]K/hoxmzҗNYzIs[ 1COirteב*|)Z~T9YY 4t $+Ȅ7}z^C܄^)dޛL;ج /:s M( GiS'EyE! 5'KaF[Ճ0^Fs4YgY2 h5&qSZV2>&}ѪmaLEe+{ޖEʼoUtfF<ִ42N}BUlQVlUIokl4S^`\@G̩6jRRt8TP9 E$^Uo]]3qԖV`6{Qk.֨׮ym;:KQJn'rv*Q~`\.BS/sM9 5;{ޣҪ^ZrXyå?an]^c<@^ײ 2;} ;ߖGnRZ{[TĽ%ҥȁhsݮXYj 9șq(BX7("Ң<ې$==S%yYb%i\9LLOsdU.]D1s0>:3%YdgE͘5>v]xCohOS*y])s#9[|ɒ1̭{s}ϳk,vZ pf_OlB?ŬkIF7d|Kl"!zNa Sf;E~SF4g~5C?'X1u_~#Gm:!k0d vѺH-*l(\<'I~y7ץ+ŀHx,Rgbj_qA+ugX݆OP fNf [:ń0s Oĩ!F n:mK CcaLo] <|ܠh[<Ľ*0E >|l P@qw;Hݾ*.aB\N(zX-ވ+2+Q;d#1Gi[^1kg40CO2k&HĎdrNˮN}LEu[{ ۏ-m'_^}(h"pUg rL=j)f!L@Q_goӠ"IL'NVJyOA K*xP]ӆ:kFD:(o:%VSqҸhv46*bӟ}OKerHQIʵߙ$Y2{=E=swgF8z)C PxbQJ>&kf$΅PsnOáR`rEs$x{CM&xߠR!c&(YsѴŅY2#KMZ&aE[h櫡l*:'_0R?Q084*q>z 6޿el ގ.UTz$Ww:k.ciurP卄e Wluai1u,޻ obW|fؼ!7+p\Z0s>Ԝ"9#m隧rMȓd`zUTLj1uY4/[$hGwdG)fBuT[dn'#"i6 ݂!6&nR~!V+bcY|1p)~KRb$KKy'd1~GK~+-Z7CR^lVOXB5d ?>1"3D  !'boÆ y*:Z5rTRvȠh2vDy^%NCx/nbml`Uq6!5B4FK40 f8bOB㚯cvN'x J^N$G]=wV`iœ -.}tжΕRhˋ >eFYjyȜ"R/SdZux},]NGfb 3룋YiHMԗG::\REaQšPgƹmz Ve`l47!&kV+h$y'H*F{ؾ;c FJ# ъǶ8>Ƭ""3{m? nGl{yÞe)@dsJ: $>'n m!yvZM'keI_Hfʃ(CP')casRUHn׷OPOTG;y=bӫ"FA>+ 'b!ߒo- q!ƎHL|H%/_/ Sl1ſu}χEi)aCjd-Ukh$bvr0y[mj%~MlAwC!##af#}.QwS}-nֶۃчFD<6Imu/^p}yd SSϟG* ڐ''Bݑ:C˓[N$TKJ^Ƙl ^{\m)+ώzz\=ҝK|'vǎ:UfY5úVW'gZ;qG 2Mݨ}9STT;[? Խڸ +p,M">dzkB4*V!0ȓvt&/Uc[_|K*S#ha։Pꍊ<T ]?Oe  Gs .]|ԾgX8=9Vp6f1iU<'F3oT_ޒW!og۰I6$ ߞ;LG\ۂ֌GseJv:}Hws߾DC.LS:pv7go^9Q5>óCє ^ejm"giZfve; WkSxӜh`8 wH>Өtg F)/M|HW7"@8.ZrwۜIoɡ1,Lr9v |;C>}L(JhlļkR Y Okgio{H};qq ,q~֏vd%EKz?o*Q̲yH=j/]9F[>&i5)iÛ<&#yl]h]"6˖#M'ŽfEid:|etAC? q0//|C@jћ䕋Bn=$6Rf5!tؠxTK"_o -(#2KxY4K›q; HZF٤rs>%-1T5_0%|VTxgUXahmXZD}71v54-kiZA/уL{͋#ЫC![W9h.y]yL>fϗ92 X"}~,_pp|]`5[VXe&kdV^&qo{r©j~?$?mU Rh8FdFvU u_V‚iK=ADqsz,hThq=1s}tZ-t~`D<T]]%W&! Toq5Rq+ .U7S_Z<1"Ѫ.D+r5R4EbdYj pgb .M'Ц{c$" _|~N9'Eѹ"=i,DZtn#1tL\s<\lL 5bk@3x+ VRQ:sBJڎl<::N[v9?# tXyL1p.,틅۹BhH4^8o}62ϥws=JU:DQ>pXF#~x5h"8Z{7~`-^j[olgnw`Yj lےgF4`uk|ҷֆ:XU]8ගV1T=-ͫkT ^f/Õ[I8>lHՇ ƝdC* )a\SLe<(TX/\K~SS*AJ_'?AD&Nܤ}&Gv bP e6'oC{ObJC+nǢ-K eqP]OWZ- ?oխ}t D"OtZ\ӸtLJKCr2ᯥ w?hKL_E))$ 0`)3YY|&[Y|'9A"XȊfQW!s:i׬2D*h9zc̷-ۼS`9ה<,U(aJNiHt/HJCшUC&XEqrgEO4yJyoYW_ds8գnwU;=mth' @D{J?ja9Y0 }ͬZ P7 =@wB0\đeMdO&)KCZWKə$8.)Qt<&ՃReCZD[ .'yRF=j[ZM;l^v}g/ɉpC;Mt ڧa['+u` R8e%P ]D=3j=?y_#Q}`ܳ`!MEW(9r^CO+d|qګR={;*lQ W[L9w"o(* O8$Sm3]:x4t~ܲcup<%Si*TˊgW&;%n :S.K[p{5.Rz89R_U-ub4*M!%u O^&-zA#|&A:½-ɒaS >VJ@!*qV4L+QUW׷SF+%/6dN_'m5htXq0#S9zc7^T;7URکj0mթœH|eѻaRQ>;R'1cN':;?d֡*}s_L]Ħ1{  t_l;zseJ\p94m:D8m /?H +.t` &ΪI4gy4N漽P]S jk-Vp->.A:)$IpSrBqA?hl\ʿQ?G 1:2_cr/\"Y`^7XPQ[],m 8>tC)9M2بhSTZ#޾LoVL|c)*V}uم9 FKZ۱J ᣁRRinvjfH74\t&$19Aqx<y$( rrV0r*C&OABի8v(Ely%ǬMe8F3$lޡj("*2}Ԓv#͗=$]`WbKCy34/z 4w6tZò endstream endobj 70 0 obj << /Length1 1714 /Length2 12271 /Length3 0 /Length 13364 /Filter /FlateDecode >> stream xڍP\ր5&@p,x @pwwwNp'_߫j1jRkJZA,0C fBA]@п,9P(:8|BB.Bn + @JA^V/qr@PF'h3Kq8ì `APKۿ/!.?n/{2K[5T_fʀ-!V /_2V63 ^jXC8X~ UK\vصK/1 ?jdr؁—@B^;__> |v%_Rӿ%u$r^}$,]_n?'^@%p]uPM$;1.Wg.Pev4DnϹs"%;g~Eܮp>77YNzPۊhm=+zwKЌleQsBbٴ=92cdlpcQDpAmimo$gh\$enSFx7Y`A).žv(Mie?3\}dp#=q&i(?ߗ /dU MaO yܼ%%rx󨲓پ(y+W Mƙh$O䱌|ūW:㜴Dtm# ɈBs0] V`ɣRa}:8xK7~4*'"Hgogočc?:"豺˄<0 QeLduZX@mS=kِ"K,0L7 W@ ^vYO?6m?Ոy>T=MrH?K~&ש^3>Ē%X4+fxMVGuqo%MBZ--;F. YI)7_k.lȘnoNu+&EVNeϞ7UD ,pϦKHZ^QLc45CDCx8`bZԾ{t/+CKa@37F¤u.G&c3EVIܑGJO''HE2AU-+ϿW&N"oӵH`i^V llMJYc@m)j[l1T:shE0p,~]fa L3 U%[7"53 ,7[Qټܻd*.tDiQD/hax(rJH|ό\?b+1ΰ95r5/btNcuUxF7jkW -1N5Fl梼8+@ńW,*{K`g"'I]E=zE.ZMfdOYP e)X fMG%KǏ)rEF춓`gj|b'hnm踲*0./1(;a* 7bk&dCac U]Onz+tJ3Pܚa(Tɕ!~~:$aܜS+-6'ouiHu|oד1&F>`'џwGuGb|$*b#Der󌉍~<C. X<%!+mN,n$&Ԕ +qEKw.%0!.ADr ^2d%yy_|Vz՗F4el)ZaTNG9>Hqb.1:P%⃸Jo0޵tRB1Pa率g{Jc~B> m* և-H g9wc$QF"V%;ד@`/gK>I[ wC85 1UZ KHv3dzF^=![o rmTMY[XZ:50co;2z0^ڗj/5)_<,$p-*7K9u2BN}nW/QvbE`(39k{ V)W]f?jrYQ,EiT#%Zlât3?Y## T8=X&StJ,ej*!V␞]bVqg)2ն)P>w}D?6xb.Z>ܿe/#3ƾ}߹N#q]II Y_)"@M7)N:bwi&;cS2TF`uʗ<]b5%!D.^aDӎ %~Up˒ڠOtbR_L88vw&o+t`GBMiI*`OvspXэQT^r*Ln,As0z_I܈Lfv & .H˄^L&KMS60QY^!>83sw81 + 7N+rOyqޢl#9vv` qUڠBd1m:we.b‡BH]5)3`=kt~xWf!8ܸzYԂBˡD~<BW;;E: :-5Z{WN8&J:8 KMo7]v^tȂ踆-Ec.'Ǯ;fyBΈHf6n:gCﳚ? ,(nN9}?s^1762j_q7= M)* <%LlyywwMӘ]{@$Q፻FΙ(lW>#f?:8-wٚˁ WaN -QO-g ЧW銺|)b/ACq !N1s7 FѱuSDbթF e+}aOGhU -{2سN-,( ~zZbme@Wƚ wAG)5aN0.K ԟ LLr8"f2_<| C|o}Oo#ƽ%:m8{CdyȸimgDG" ZN\ʚ=j'@ㅹ3gږC%T(Iz+hƳ G~Hw%(lۚ{ٵci5Q"94-xwz| p\(RKmȶOjD~`_}65ցȬJܧ>f-ı~dVwMǻپP x?Z~2%go9vq䕛]| Ko&%iKӏ!(&p ) Ŭ, VĐtHN\kjյwupXρ1j3:*$S@&HԻmӺHF0L Ja^]>Ėt↽e8m#ckf,iL.>§}=Bb`?;m t3Cy+YK,ځ%OE3ߎ*=[ _{gQW,E=N.ͷofhxzq#qL(zz;cdL}DCQt3> oҙP~߅{IsόrLMj?8D""5Uf.`M\$&^{^< ^ӡaJl<&yfaa+nYU~7s@36UH?4.H ◌t$:D$L kWO6tU2Wx=Op*Iu6Ű*wcnHAՆeJdXB̴~=YV~:<:xgfA)\.^_R'jMBjfʧo^M܊Hp)tL;OJl^x4|8j׸g}Cb4:1ך}5.*.NuM)w pre<F$Fh$%NLFwJtXԁ&d7B6AtU۽xV<+kC$^qbq|MݚuH\콳ݿIpףZ{\ǷҴ Q~ nYU?[Xq@Μ͘ n"$9nO؈TUUga64b7o=`A:jrG;sHqꑎ$,~d07}4V׉Cd_yCH1 mD:f+/ r@L巏!u!e1NTВ"\ȏgtye[\sE%g$aJE_7j)=ήݏ2-N৤VpWᨉo"P0XNd&|lkA|d|$9 '}޴ǣs5iT4X@&=7Y1þa.m7\7F-UE=ظ_YX oMXz Ez*1Q2"n אKQ/:|1fe+7 @W.,ri7ˠu&u?h\J`,^'BO%UG[7. g &Ns=K5:a`hDZmP(*&1ӎ(k^K!Musm)Jlט5-}V(S `^l)\^ùj@|łӌ\1l񖗰=ARÒ6ʗ#n3[1LŦ)]2X]3ЗǕG$\\4 (%s=-Av+t)3|0-_gs-ń02.#\V#8 4/ D}Id16<<]} A^Yc2YaƼ,_)*2Y[Q34 %$T2Պ?,}FNS$.ԒqvΨ<+#ݽV{<n`hd=uZjy?paTƌZeD:.?rO!n)&vgG]"Hd2 #)?/nٻ*M uD?yTHT7^a+ ɗdbK(s-礟1yi*BJN5@o.7 HLK{n'd]Nja,m@::$#w]/89U)fTďpbiBFqYG`qifDo)[W&!½œL&E5YK5lߊG ph[#S"Yy-ww૤P,]R6\ƍ ƓrYj˿}5X6Kv'0r T`uP& hM"kԝ~_)y\ 3 ~^NԃqK)؛kW!·$[H*SX\=%3L=̔a#MՄ]Ǚꃣ:]IBd{~c6Cu|.R/0BKaX,A]Ui8.*Ȭ+HkX dΙu蓚be7.b,]% 9fTcY/X{e|wxqs0C(-ud K٭a0عG.I6n`m:)eʱ]]ӵǞ u!p(OծuLd)bӔ:eAE<4lnzԃϖlӁwRekkUyڹ"IX%l=UX[9TCfj=m.x@ib@XXz1(݂)$m#x<sjw}k$o-j ADH9_Ǫn%H0\|\{rZc{رDgqS)/9Y 4E/Dbtr.%1/8fhrﲇTsܲk>h!rTl~N"b&X0 m;bmy1,iH=6G掓DB,f.ˮ*ܯTv e'K2u&4 a _6/ȸg̙(OHQYP|4tLxUpMW}+N9[koZ>;?rn2@#i)插#x\k&aTvÂ+E"+hģP8ap;& 83mJ*ݞ(KZPNFcK@K{;قlQ]nKGPඩ\'NC_Pf?rBt Ucu9Nz]HM2M;EVW?ؑU"B?xJ?r6Y@yҼ'D%&@m/U69>+!M|(sL{  Dž7w?cj> 2"R#&Ot%IIA,m~*!&YTѓ^|MD $:Yiv(]6Dd $n]y0hE#V $Yt=cnƨq^^efw{J؇ L^lEʻjmJ@ (qBTO\}Hn|@>A\w*2#|.tqB?5UӊE MrboqҟDkvIt:TmXv,!j :~gb1?n'C3MjS+3ÎVq"3_o?0ˁ.s:gА[ӣ?K4'{V[U~1rFD@nLv!hkS##k;2 tǑD:)v?Knn!*zwF^8!JƸs,9?XngA7έ%'M.)U >_g}~tz9i}PvLSе8FsEչŢ ,JeY6Fxsb(yǢB޽?%E@~*QN3Xt6f֍!HW#<NMgm7xۓo"DsMq k =Պq&Ô4KɅ9ŎÕ㨇7ۜXV:P$I[ǃ3k܍o3N/K޻`|bK )ԁ%^9Y)N+F$R4~όjkgOndyɧzuEsɲNW_$T$epċ$_G"m+|l@ 0ZJwƔzw ~.CM 4D0J*!C;Dg+*}zEN75kʜN$s-#"ned÷d[ JUk_n;&?O}E7޹~^1a7m^ٰaO<f0ii֥#zCrg |2;e儁Q>3"P4[lzZ)yԮ#4.^ ~̏링t0,{ݕ-\mIE.ZpS`}2x(d]m} 1*/r 1ŕӒ?ҳ\% Psޯ}TPblȫO s gkKEta^prf~-3 fA]b#3@C<>xTʍhbN m3'Ô=!dGu"&teNަg8| Η /% =2{7Z3ꬍ̖.sBzB)0D+6끗ӋjɡS_[K PƃGGW`Zn^mީ`6yde"!7a"*E>6TMv!d2Ղn|!(\WE\{ y5|-/IIsӽiYx~Yg;LWbY&nsiQ{dKenFB ̉3s (ƿuI`1i0)ۍB-F4cWDպA'z(jGuO>#Q*Sa#.30ņ h [\j"_H",ݟ26G\B1+r]7\JVN{5s/)go["n#U!偙)8ħO=ƕ*ty|6f{J{ɶЫ;*ŦD̙|uPewְ@"mHĺ7%P'}l>#:ZG^h2Μ6C6w;s%Й5 m[@#÷0Wz|YD1ZRS &q%Ơ9 ,Pxҗu|L1n=B+c6v3ʼF7ggSطcT@ 3 rZ߾Rt=9 BgdR=I+ a.}WO8◛/>ɶ~9vQ]R zCXil#upe'PXA3AwK'LyX؃cBNeIpQ*jcu[*zII9Gn̻VN 6H"^*N\] 5Oȸ1][Ƒm$=t.F$uW};=>e+isV~=ԚB!~Nَr[j\9؟ .8h{4C,䛑9\~r oHL$nܡhfBV 6≮ߨd_x,#FGPl_!bD^]W]xg^p9JsŸD0SxI>9$0Xy<>iTtdg4cE0MŐ~?g={pvp u|lz)Y'*eR~k,#fqP}i0 x`p^c{CNnR\L,߂]}BPά}fRٍ@h~/h敩?Q1!m:붂'{T#k*$~xDƵECj~U)0ԅcYW&"Im&JrQuS#t@6sMPG7hiWlZ6jvno]x'ێH4]9 _q7^*I1iħٹJ̪g:QՀjfσ82aO!;yWXP:ؖ*#rbMʍ)l_i8>϶V@1ݶ,H O-)YQ73U ,Lcu=O%-]>aB5s>8RßlsjU^.8bX0%0Q$y6wJelRGƷ烇wڏÃhfå>p#c nY.ٱ_<, CsH)B)C)_#vauc/3@6լ3l_G ?+$m>>l]Snd({MA yu+Je pϞb%ȋ1$y=j\6Ɵ) :b Ea5=*]uوrhI=FES]`F-C<ʪ߲!N Ǧ1GqVbZ TZ t 6.T53[C uf"Q 2~Dqu>#YIuWf$`('$5NVZ ـS8pieG9|r-'oYA{w̾|1łc/S`Uk u(go拰uyݨߺ-~ox+ME ֈuJ-vhZ1-Eȗ=,>j?rl endstream endobj 72 0 obj << /Length1 2062 /Length2 14554 /Length3 0 /Length 15805 /Filter /FlateDecode >> stream xڍpk ǶN&m۶:m۞I2'dbۘdb;dΩ~kkO59* Pޕ *`bbe`bb#'WrGGtvr3C&fa(`q09x9y,LL1tp[2@8rQG/g+ K׏V@{7{33#;@UZܿ nW +MM-V@+/Cc[cwc+[cK7H+? _ fq{3Q;; _Y9M?õw273#PZ6"?2 +t=M-J[#b:|_ 02u-D?1~>}03{[?12)W)" gгY9dl*)moW]O5c)8|-@gؙL??.f(c+p[O/׿->c>6j@3+7v5a{ 6EhdjjlKמZ\YLLG\6H~f7u0kX9^pLaF3C `dwpp|;8uFDBF"NV`8QῈ UA15?Gccrc(G+Oh `~Gla/?GJZ~?.(cj1PqC;QHc(O >]>?1]?qt)c|]=??#ן?l ?`Fؔ_?@'ne7Ժ>7a|I9=LjzN'$4 ;ᴑ^q[UWFg$iBXz5}W'_ 6.|'7.$ ?k9d_*fcJ L>/BР]z"͡M$Ʊl?.xWtߢP`/n/}af "9ѕFfu^'h` CS5rwt[Φ[aC;*j`\'KÃ6uD4L )+.3hqBᓐOS Êg3OO'-':#Z[24 n1صWwt "R@'u&){cwґq,m["tsɱD^FFk%z-Td&T甂[ߑo+u RV}יY ҤM;ɡ@kk_%&S{7c|h`::&Eܴngp002'2Gi׺]1.p༇^h$!TywW4C0įovwkk1C>D-_/_$/* ?7ft.d&JKcs aq ?+*!E3Ư'JZk}O~o=u+VI}ghUKy>rg)Tۥ)vg_z,u]gGFW cs-o[MrhVJaa9Q Z9_}h[6k!YjE/~l-:|:{u޹+%kܒظW6p~L0m!yn's/U vk]1 xK0xh>e9ub6@sXXЁVR|A6)'"r,pʩ~jz0 ] Baߪ<5}Pk l]c TFijRzK{9LkK%tc"759Sr˯ =v)8-(SȍZObI(|fAM-Զ=,OD}Xm3iѪ]@]<H`tÒ:Iܚ) &T1ۭ(Q$6fʳtp's"1Znj*L"걪 Ξ6yuQoL?d4yW> te3*\i "G*#oOU S}mۂ_UR)jkSK4Ei }G2 H9g@~*2JÀm#M SœWQPo`vI/@1K Y%h􎾉7e0ޔpcE-+X  SuT$&(WV }+K}'/~J/_Ke<ҸT~n1`bF7ސD&q-8+7L]gKTT7@^PīXݧm-L/hdPW;~Z;/ }i p<1 ;~G j&M: m٨_qTH꧛/e25{(0|5uC`G#&9 GC4cqkת`CѐCez-m[s+HAfY.#D?cZ(Sra WTא`χS1c"vsG(q l8I &MfIS='s0S,x)o˦! J.~pKH^Ma_dZXq+&qwYLz6`@YE//CgIA7 'yKliiB/Hfl~9 -5BUShf/$ȻP#qFg}(x,L's i ĞdKw͉k"W,5q̈B fC<5 ՘TFye+ Jv+I>.o'y\=*Hmwz;,< hg--Vӂ[;lK_ky/`[|Zf@YD͖@ZX|vmq^LDG%gz*fUi؅ykaS1J-o)e''ȌÎԓrdCA@%0r-lhXnr.XAYkyIK5;T#'*z5&i9%gRUfwkYwyހ\/yTTiz7TsOh2Y aSͦ4"e՘kf~S*nY&J-6:ey !g/M'ty(U;6#`\-yFƑ FPG,,VeOcTB;% ; Zt`EcA@Od Ej7,K睮йHxGh陼.rLRKeq3}LdsgCZ=,Y{|T~8 ^VR>#>-:H/jCԷZT5i2<')|Ke/-T@$q% o(J1.F7jC]_\lZ9 ؏ǩ,K0NU[֪ k(exL+XKYxXEEyQFI#p}0:(>ߤejfr\FzW|784c:R[Ǘ~zֺ5x?r><]= )4$ص9k4hb@ӻ8;/P6XH$EPGtd0'Z˱jP SQqv{bw;Ԟjhd=gT0 }O vhMp[pt@.t b$ <}&1V;&b Dr{th֤iG ^&9mEt R5!(3%u1)Rʕ=[)pO2yudO3Ҷ5^J7+/fsD33 GZ\h>>kWɰ`]R9fFsRRoQi+#qPW7X/NHj&enDyنC-?zIP{kg PADYхяϧ 8߭8=O\7ri3ȐOh!Yq[tҠ5ٯ%h_JAuƓB3wy(nhyD<ý3%XWQX[fhoF). ]H`,Njԝg^ 1tIUq1SKI3P:&[zp:I_WҺ,$CC ]BDP5 nwvyڜGXj2m)Б v+"Ҝ%4WO4Pa-i!|~8ָ0)t]}gz޲^}xiVBz3diP6kzYqVm̌'ag U#%IJk'IP>K1|d`$i }Taͽ7<ZDjɰUV~ iuJpKz ^JVSRJOp{-QXsBc1P`a'>i ȘU;|LGj=J 9gtn7hCy gp|4DOGv+?ނZ[I@*_!5 O.צ$ϓjդapp5gRG_lKPNOc3ޟw,{ !zlp/ˉ--vȌD N?d ~/̨f+݆n!EDž~?a3kQQ#5+oCQ9IYY9 Z+Q10Xx%6zP8陘NuCǘ!SU#}c@lUou$݋8 ƖIF15|Ln’ZP.Dġ_+ e&hNφ@qo ,uB= aĵP$Q*hiq4t2u0t}`YQ~ႇTE d X;u^|5$t{b!óưf" xxRyiF:cAkQϓ{Sv"˯> fЯb-hG X/6~p< E|Ѕũ AwD:8Y zNݤiq vȍ9J\z0Ap;-XMJUL-q4i=įE3Q!"7(hJG/gt|K>}I ƃ6x1*m6m.5RCYNyu=a5>Əb?rpK>`vj0+ohf(>zHꁼŌ4WҌB]-ŬT!nqdY8F!)孨9_i~D҅6'U׫{ K}>&͢-J~}lQc~H;<<>\iQ"h!אV ݱpHQ⭦t nvT.{n_d|u-ہ(wJW eys-:uGUl!:NuuXK\l&pxϯ֡"8 q*54&Y;B"ռ.lt6"0,h8ѷ~̓ Mɮؐ\"ܽOb׋kT:kfM'@P49E'"WF CG#v \%gF8 ݨSmg/[9竹cbEUnb@Klؐ}7\*r+2 ]~/c|Y(^*4xhʹǜw{"JC|J.9){$xLgnly:c|᫣U '/l'iMvbǔJ`.ɕIgy< ,$՞V9$'%:uϗyU[JL:C(l ƹ2pnd}]n*v,vV<#P V_H ,ԸU74Ye?wȎ rw fkG l-sJŚZOw_G*nzL*JaPm'aRjM jXwȜ}>ca"r,5o rKCisuj>kiKC9:~`|ImQPdHI0+z,c%MUM@# ]kx}RR5_{vtkm;a<︁ᾒq0C-b~MA]xpSD[0P-ns|-zP1ӵd;\\ Uxւ~HXYGuw-PLu0#Rt 'K9?($^di>%+Wy/xW<5%~@r|A'جOdC;HycNlyH0n4+41QܓoBl¶+^*br&ni' ÞxC|5c.H0^gdl)raʕm 2#cp2/_SCx(6~?"N{E?dʷqwlQO=?!6;Vr#_·TπIJwB.ܻ/9mN<2|O{EI]٤iy?鸕^olQt B,+fVbow}k"yz`akuixv>|ޢ\F5 13dMC.V~ѹiGہ *kt<^ǻj[_ʌ<\*˹MS2RK% 'd8/] #f3^=n |p1e?3*.O#;U8" 3͆oZ`ݨ=T*qEl)C`k?!i [2nMfaIJ@մx ]I "+ݓ5H"zw0uQZl/s bP5ܴvjI_ ɍ?k9@['W#TZ UI(>Prwجq\ڝC' [0sa1hF?N_yñnHm95NP]΂BaZ\KU)? uWiQFqF=n5'P5GC="Re5:~ vEAݫ aְW=<q6KVF4P+";`To~\QE<@8 L\7c9|-)Pp \" %nj# cB!cݦL[#'o]a<ߙ2> r,z 䎛]"=5VלFET@ɡB'Z ;*wǑ!.]]ֲŀ¸Nc"f Z :Bt bdmZŲ+"וNE≺<<# bVnVp)A i&_L3x%ZL?eacUEďg6eZZxO`j@4|s -bW˓CX,Bʹ#*TC:jj+co\`MZA{.UehqV '-pЇ/9{ܴߜ4<oΈ\`@Sɩ.} RPNԒ6hf鼔뇈DfFFRw9oo5$Գ4[ĨmhJ{@Dt"Q@׆tByqX25⟖l@"6k{2 710l,K\!r[{וx6 Ј{[1fA 0is',! fȠ ax>rc T{ a/.yzwϪlirrӑ_%EXUYmٵN'UٓP %Sҵ wRfs]VucV( kFrاc;Vo yK@?GChA` fƊ˝CǹNʷVM$4I £33Ԓ>8 仂e@fl#8%8 )>Wjv1}MeT˖LArbAFCXJghR’P͐_0f6n@dJ*.˻q3a%C$Cfv£{m{+u "aCk"k,!e2 WuٮN?eXKX-\6ǎ E&4#wz[  H_ jF4X2p}4<|̼O`I ZZY_Ke`%BYңQ1tOd& xbA;G :|5z"UvecbXw%l "Rq&NmBO(HC$ցK%(K)!=w;` r޳q\ߨ7vѷ^pHɧZ{]b38 VNFf*$\0~\Jb0#;bjoAF Swd=Q6᷐L e'uV5PA]k̡ҒXWIHu,(oR ĸO' {">y#Բn.yj8ʖ@UT+80TɇZbsR`Wj石Klsv˴X k4g 1G)`ZvPQkf,7-acyK֬= PEUgh% |$?^eRG~_l-lp,yR%vnT@s} ]}qt䘍 "/hL6짷eC؁ iB'+O}G'lGMtew쿕ȑ֓;6!`[^Mֻa@+ׁOuMa 9 ]?|J5y4o׊\׮"taYRv6PgF!,l?0D|{in}_b=َr NJ"O3 0[qxD\N#(~AXAe]S hwQ#xn%,5[9++Ro=xL{|lv^F›#*dҳ "֏iPL > endobj 2 0 obj << /Type /ObjStm /N 67 /First 511 /Length 2829 /Filter /FlateDecode >> stream xZIs8WTbR]e;v⎗tLA[YR$:I(1KW /)rfʙeBhV059R14xi-3`3c.)LOJfMl faRC(10L䁘3`6J0= ("Ha, ؊\1֖idi\ z[Թx{ q\K@0 k0 P2QE[Yt5YlNClf$4EA<[1'A s9y%{$yA$b^&XcA\9i?HzK.˼3Z=|*dPHXVH+T,obG?elc`^d-/+g!\>fLME͌ 5P3hVx\(S{ %ٰpMM䬛Z'Rb N1=m@g _ME:}A~[' "߼od wOV`þb̓%xܒsQ9-޿,{|w2q5g`(瓛٠Č3GŰ3 I"yxf@@ нtFRlF +aOLf,PS~w1@R:'{sUZrV" (po?zc~_8UUM/_qY]?r |ݓ53(}id QBfmp:?oB·>3HBL$NsL\`晃fE1ʌE-@x-#}@LoFPנ涠VYRy PT*HWAx_QGUTkAğ&*F?gZ㮕tN#,Ey oFBS^13\˥T.Ҧ$pJ PޔE:cʅ{ ZS;.[k씚6{g*':)2: CAT з7}iv% 0 Ig(,wƙ(.=4+ q3k"\O ͉7Z춖xVaM>{H#<-4b4)M⪈JB @Mu$N2JzJv")-)kuJp;S* j-@٬K+u0*n3me_:CY!Hs2A؛ 0 µ a<9ӡq9̆j25V~;;u_GG"¨;H ׏M>! 됂q ؞a @O^^ƵpǗ38`=ޥWl+?F$zooO ы.p{ʋ(_cNqO•c~Ÿ/=d[`r}%/?G:C}.\%WN1?G>|q'|vʧt]؛r6\Oͤ*/ޏ tW>Wլ,yeogo[9]L`*{L%Xc)i+ڂP )& jX]EgO]*zi+ŭE7:))'q?}H؊߬H"ݫ7~tgg]a() x髎MbE@6J)[iU/}1 rVL6*rf\Eت#\.=>}KN,`,[4El e/=AIUޢfͷmܩ l~ 8.qօo*qw:~ IW+ΐJ_Ϟ9|Ba:ƠQ?{M[ԾW?GP ")w]n֭uZ*בr0 1v2gq|?+e𢺚w;nmVI[&M6kH wݪ-ڪM[딶K[ŲE۬ܬvKKYkW+K$w[O-kmɷs*qr.=;vj_9u!fN_bn3J?^̛Ooɡ-!k,R L? al#kmmo{B|V~ߛ5;ƝBvfg鄦O4` Tz(W N8rC0GطRROOڢ_:LaS,ܢ8-j~ɯp 6նa"J~"j߆a$EѦ kC7纈݁aX!=Q'/E,wc_Gx9 endstream endobj 81 0 obj << /Type /XRef /Index [0 82] /Size 82 /W [1 3 1] /Root 79 0 R /Info 80 0 R /ID [<1478452565F35338354E0AB703FEA4AB> <1478452565F35338354E0AB703FEA4AB>] /Length 210 /Filter /FlateDecode >> stream x;2]HBAB~f,2t(,CauxO[3sf$) j .4\  C:0g1 BrqA {p0 ;pPw[8#Y",2a kV;6V>j=EmXQ-7m[Qvze?Dm)\AR/ endstream endobj startxref 114664 %%EOF NetSAM/inst/extdata/0000755000175400017540000000000013746150015015300 5ustar00biocbuildbiocbuildNetSAM/inst/extdata/exampleNetwork.txt0000644000175400017540000002112013746055306021051 0ustar00biocbuildbiocbuildA2M AMBP A2M KLK3 A2M CTSB A2M CTSE A2M CELA1 A2M KLK2 A2M LEP A2M NGF A2M PDGFA A2M PDGFB A2M TGFBI A2M ADAMTS1 A2M C11orf58 AMBP F2 AMBP ALB AMBP FN1 KLK3 SERPINA5 KLK3 ALB KLK3 FN1 KLK3 PLG KLK3 IGFBP3 KLK3 SERPINA1 KLK3 PZP KLK3 SEMG1 KLK3 SEMG2 KLK3 SLPI CTSB CTSD CTSB SLPI CTSB BGLAP CTSB CST3 CTSB INS CTSB CSTA CTSB CSTB CTSB SERPINB13 CTSB PLAU CTSB CST7 CTSB SRPX2 CTSE INS CELA1 LPA CELA1 SERPINA1 CELA1 CSN2 KLK2 SERPINA5 KLK2 SERPINE1 KLK2 SEMG1 KLK2 SEMG2 KLK2 SERPINC1 KLK2 SERPINF2 KLK2 SERPINA4 KLK2 SERPINB6 LEP CLU LEP HK3 NGF PLG NGF NGFR PDGFA HSPG2 PDGFA SPARC PDGFA PDAP1 PDGFB THBS1 PDGFB HSPG2 PDGFB ART1 PDGFB COL1A1 PDGFB PDAP1 TGFBI COL4A1 TGFBI FN1 TGFBI COL2A1 TGFBI COL1A2 TGFBI COL4A2 TGFBI COL4A3 TGFBI COL1A1 TGFBI COL4A4 ADAMTS1 VEGFA ADAMTS1 VCAN CTRB1 SERPINA1 CTRB1 SERPINF2 CTSG THBS1 CTSG KNG1 CTSG IGFBP3 CTSG SERPINA1 CTSG F2R CTSG F2RL1 CTSG CXCL12 CTSG F2RL2 CTSG SELPLG CTSG SERPINB13 CTSG GP1BA CTSG SERPIND1 CTSG SDC1 CTSG VCAM1 ELANE SERPINE1 ELANE THBS1 ELANE KNG1 ELANE LPA ELANE SERPINA1 ELANE SLPI ELANE ELN ELANE ITGAM ELANE SERPING1 ELANE F2R ELANE F2RL1 ELANE CXCL12 ELANE CSF3 ELANE SERPINF2 ELANE SERPINB13 ELANE SERPIND1 ELANE SDC1 ELANE VCAM1 ELANE SERPINB1 ELANE YARS ELANE NOTCH2NL ADAMTS4 FN1 ADAMTS4 SERPINA1 ADAMTS4 HP ADAMTS4 SRPX2 AANAT F2 F2 SERPINA5 F2 SERPINE1 F2 THBS1 F2 KNG1 F2 IGFBP3 F2 SERPINC1 F2 SERPING1 F2 F2R F2 F2RL1 F2 F2RL2 F2 FGA F2 SERPINE2 F2 CPB2 F2 PLAU F2 GP1BA F2 SERPIND1 F2 F11 F2 F13A1 F2 GP5 F2 HGFAC F2 IGFBP5 F2 SERPINB6 F2 PROZ F2 F2RL3 MUC1 GALNT1 MUC1 GALNT2 MUC1 SIGLEC1 MUC1 GALNTL2 COL4A1 FBLN2 COL4A1 DCN COL4A1 FN1 COL4A1 COL4A2 COL4A1 NID1 COL4A1 COL7A1 COL4A1 BMP3 COL4A1 CD93 COL4A1 MATN2 COL4A1 HABP2 COL4A1 OSM COL4A1 SERPINE2 COL4A1 SAA1 COL4A1 SAA2 COL4A1 SAA4 LAMA1 ITGA2 LAMA1 NT5E LAMA1 FBLN2 LAMA1 ITGA1 LAMA1 PLAT LAMA1 PLG LAMA1 HSPG2 LAMA1 NID1 LAMA1 COL7A1 LAMA1 TMPRSS6 LAMA1 SAA1 LAMA1 SAA2 SERPINA5 PLAT SERPINA5 SEMG2 SERPINA5 FGB SERPINA5 FGA SERPINA5 PLAU SERPINA5 F11 SERPINA5 KLKB1 SERPINA5 FGG SERPINA5 KLK1 ACP5 GPC4 ACP5 SNRNP40 GPC4 COL18A1 ITGA2 COL1A2 ITGA2 HSPG2 ITGA2 AUP1 ITGA2 COL1A1 ITGA2 CD9 ITGA2 COL8A1 NT5E FN1 EZR TSC1 EZR RDX EZR SDC2 EZR SELP EZR SPN EZR VCAM1 EZR ICAM1 EZR MSN EZR ICAM2 EZR ICAM3 EZR TMEM8B EZR SCYL3 SERPINE1 ORM1 SERPINE1 VTN SERPINE1 PLAT SERPINE1 PLG SERPINE1 LRP1B SERPINE1 PLAU SERPINE1 IGFBP5 BMP1 HSPG2 BMP1 COL1A1 BMP1 COL5A1 BMP1 COL5A2 BMP1 COL7A1 BMP1 LAMA3 BMP1 LAMB3 BMP1 LAMC2 AGA ALB ALB ORM1 ALB CUBN FBLN1 FN1 FBLN1 HSPG2 FBLN1 NID1 FBLN1 ELN FBLN1 ECM1 FBLN1 HBEGF FBLN1 FGB FBLN1 VCAN FBLN1 NOV FBLN1 MFAP5 FBLN2 FN1 FBLN2 COL4A2 FBLN2 COL4A3 FBLN2 COL4A5 FBLN2 COL4A6 FBLN2 HSPG2 FBLN2 NID1 FBLN2 ELN FBLN2 LAMC2 FBLN2 FBN1 FBLN2 VCAN FBLN2 PRELP FBLN2 COL4A4 FBLN2 COL18A1 TNR VCAN TNR SIGLEC1 THBS1 KNG1 THBS1 DCN THBS1 FN1 THBS1 PLG THBS1 COL2A1 THBS1 COL1A1 THBS1 COL5A1 THBS1 COL7A1 THBS1 LAMB3 THBS1 HRG THBS1 COL3A1 THBS1 FGA THBS1 SPARC THBS1 IGFBP5 THBS1 TNFRSF11B KNG1 VTN KNG1 PLG KNG1 CTSL1 KNG1 CTSS KNG1 CD93 KNG1 ITGB2 KNG1 HABP2 KNG1 GP1BA KNG1 CTSK KNG1 PLAUR KNG1 F11 KNG1 KLKB1 KNG1 KLK1 DCN FN1 DCN C1QA DCN COL1A2 DCN COL4A3 DCN COL4A5 DCN COL4A6 DCN ELN DCN COL1A1 DCN WISP1 DCN COL5A1 DCN FBN1 DCN COL14A1 DCN COL4A4 DCN DPT TSC1 RDX TSC1 MSN TSC1 TBC1D7 VEGFA VTN VEGFA FLT1 VEGFA SPARC VEGFA IGFBP7 CUBN LGALS3 CUBN SCGB1A1 FN1 ITGA3 FN1 COL2A1 FN1 C1QA FN1 LPA FN1 COL1A2 FN1 COL4A2 FN1 COL4A3 FN1 COL4A5 FN1 COL4A6 FN1 CTSD FN1 IGFBP3 FN1 SDC2 FN1 COL1A1 FN1 COL7A1 FN1 CXCL12 FN1 LGALS3BP FN1 ITGA4 FN1 MATN2 FN1 PRELP FN1 SPARC FN1 TMPRSS6 FN1 COMP FN1 MAG FN1 COL4A4 FN1 COL13A1 FN1 NOV FN1 LTBP1 FN1 F13A1 FN1 IGFBP5 FN1 HGF FN1 ITGB6 FN1 TNFRSF11B FN1 SCGB1A1 FN1 MIA FN1 ITGA8 FN1 GALNT6 FN1 LACRT FN1 LRG1 VTN PLAUR VTN IGFBP5 VTN HGF VTN FGG VTN ITGB6 VTN TNFRSF11B VTN ITGA8 VTN LACRT VTN ITGB8 ITGA1 AUP1 ITGA1 COL8A1 ITGA1 COL13A1 ITGA3 CD82 ITGA3 CD9 ITGA3 TSPAN4 ITGA3 CD151 ITGA3 LGALS8 APOH PLG APOH LRP8 APOH F12 APOH LPA PLAT PLG PLAT LRP1B PLAT LAMA3 PLAT SERPING1 PLAT FGA PLAT SPARC PLAT PLAU PLAT CLEC3B PLAT SERPINI1 PLG IGFBP3 PLG SERPINC1 PLG LAMA3 PLG SERPING1 PLG HRG PLG F2R PLG F2RL1 PLG SPARC PLG PCOLCE PLG CPB2 PLG SERPINF2 PLG SERPINB13 PLG PLAU PLG SERPINB6 PLG TFPI2 PLG CLEC3B PLG SERPINI1 PLG CDCP1 COL2A1 C1QA COL2A1 BGN COL2A1 CHAD COL2A1 PRELP COL2A1 SPARC COL2A1 COL9A2 COL2A1 COL9A3 COL2A1 COMP COL2A1 MAG COL2A1 PCOLCE COL10A1 P4HB C1QA C1R C1QA C1S C1QA C1QB C1QA C1QC C1QA HRG C1QA PTX3 C1QA CD93 APOB BGN APOB LDLR APOB LIPC APOB MTTP APOB PPIB APOB PDIA4 APOB SEC61A2 BGN COL1A2 BGN COL4A2 BGN ELN BGN COL1A1 BGN MFAP2 BGN WISP1 LDLR SNX17 LDLR PCSK9 PPIB PRL VLDLR CLU VLDLR RELN VLDLR SNX17 LRP8 CLU LRP8 RELN LRP8 SNX17 F12 CD93 F12 GP1BA F12 KLKB1 F12 MMP12 LPA FGB LPA MMP12 CLU MMP25 COL1A2 CD93 COL1A2 VWF COL1A2 P4HB COL1A2 SPARC COL1A2 COL5A3 COL4A2 BMP3 COL4A2 CD93 COL4A2 MATN2 COL4A2 HABP2 COL4A2 OSM COL4A2 SERPINE2 COL4A2 SAA1 COL4A2 ANTXR2 COL4A3 MFAP2 COL4A3 CD93 COL4A3 MATN2 COL4A3 HABP2 COL4A3 OSM COL4A3 SERPINE2 COL4A3 SAA1 COL4A3 ANTXR2 COL4A3 USH2A COL4A5 CD93 COL4A5 MATN2 COL4A5 HABP2 COL4A5 OSM COL4A5 SERPINE2 COL4A6 CD93 COL4A6 MATN2 COL4A6 HABP2 COL4A6 OSM COL4A6 SERPINE2 CTSD IGFBP3 CTSD BGLAP CTSD CST3 CTSD INS CTSD CSTB CTSD SERPINA4 HSPG2 NID1 HSPG2 ECM1 HSPG2 FBN1 HSPG2 PRELP HSPG2 SPARC HSPG2 COL13A1 HSPG2 NID2 HSPG2 VWA1 IDE INS NID1 ITGAV NID1 COL1A1 NID1 LAMC2 NID1 FGB NID1 LGALS3BP NID1 FGA NID1 PRELP NID1 COL13A1 NID1 PLAU NID1 LACRT NID1 LAMC1 NID1 PLXDC1 PRSS2 SERPINA1 PRSS2 SLPI PRSS3 SERPINA1 LRP1B PLAUR IGFBP3 CTSL1 IGFBP3 COL1A1 IGFBP3 LTBP1 IGFBP3 KLKB1 IGFBP3 IGFALS IGFBP3 PAPPA2 SERPINA1 PRTN3 SERPINA1 MMP11 PZP CPB2 SEMG1 SEMG2 SEMG1 TGM1 SEMG2 TGM1 SLPI CTSL1 SLPI CTSS RANBP9 ITGB2 RANBP9 ENTPD1 RANBP9 HMBS RANBP9 ITGAL RANBP9 MPHOSPH8 AP4M1 CD63 RDX ITGB2 RDX ICAM2 CTSL1 CST3 CTSL1 CTSC CTSL1 CD74 CTSL1 CSTA CTSL1 CSTB CTSL1 SERPINB13 CTSL1 PLAU CTSL1 CST7 CTSL1 SERPINB3 CTSL1 COL18A1 ELN MFAP2 ELN FBN1 ELN PRTN3 ELN NID2 ELN LGALS3 ELN FBN2 ELN FCN1 ELN FKBP10 SERPINC1 KLK6 SERPINC1 SDC2 KLK6 SERPINF2 SDC2 LAMA3 SDC2 SPARC SDC2 HGF SDC2 KAL1 AUP1 ITGAM AUP1 ITGAV ITGAM CD209 ITGAM ITGB2 ITGAM HP ITGAM GP1BA ITGAM PLAUR ITGAM ICAM1 ITGAM JAM3 ITGAM FGG ITGAM THY1 ITGAM ICAM2 ITGAM CLEC4M ITGAM ICAM4 ITGAV AZGP1 ITGAV F2R ITGAV ITGB6 ITGAV THY1 ITGAV ICAM4 ITGAV CYR61 ITGAV ANGPTL3 ITGAV ITGB8 ITGAV EDIL3 HBEGF CD82 HBEGF CD9 RTN4 RTN4R RTN4 RTN4IP1 BGLAP CTSS CTSS CST3 CTSS SERPINB3 COL1A1 COL7A1 COL1A1 CD93 COL1A1 VWF COL1A1 P4HB COL1A1 MATN2 COL1A1 DDR2 COL1A1 PRELP COL1A1 SPARC COL1A1 TMPRSS6 MFAP2 FBN1 MFAP2 FBN2 CD209 ICAM2 CD209 ICAM3 CD209 CLEC4M COL5A1 LGALS3BP COL5A1 COL5A3 COL7A1 LAMB3 COL7A1 LAMC2 COL7A1 ZC3H7A COL7A1 SHKBP1 LAMA3 LAMB3 LAMA3 SLC35E1 LAMB3 LAMC2 SERPING1 C1R SERPING1 C1S SERPING1 SELP C1R C1S C1R C1QB SELP VCAN SELP SELPLG SELP GP1BA SELP CD24 SELP SNX17 C1QB C1QC C1QB HRG C1QB PTX3 C1QC PTX3 HRG FGA CD93 COL4A4 CD93 MSN CD46 TSPAN4 CD46 MSN CST3 PDZD2 COL3A1 DDR2 COL3A1 SPARC COL3A1 MAG COL3A1 PCOLCE FBN1 VCAN FBN1 LTBP1 FBN1 MFAP5 FBN1 FBN2 FGB FGA FGB FGG VWF GP1BA VWF TNFRSF11B VWF ADAMTS13 PRTN3 F2R PRTN3 F2RL1 PRTN3 ITGB2 PRTN3 SERPINB13 PRTN3 SERPINB1 PRTN3 IL32 CD82 CD63 CD82 PTGFRN CD82 IGSF8 CD82 ITGB2 CD82 ITGA4 F2RL1 ST14 PTGDS HK3 NGFR MAG NGFR RTN4R NGFR NTF4 NGFR ZNF274 NGFR LINGO1 CD9 CD63 CD9 CD81 CD9 PTGFRN CD9 TSPAN4 CD9 IGSF8 CD74 HLA-DQB1 P4HB P4HA2 P4HB P4HA3 LGALS1 LGALS3BP LGALS1 SPN HLA-DQA2 HLA-DQB1 HLA-DQA2 INS HLA-DQB1 INS CD63 PTGFRN CD81 PTGFRN CD81 TSPAN4 CD81 IGSF8 CD81 RNF128 CD81 ITGA4 PTGFRN CD151 CD14 ITGB2 CD14 LGALS3BP ITGB2 HP ITGB2 ICAM1 ITGB2 ICAM2 ITGB2 ICAM3 ITGB2 ITGAD ITGB2 ICAM4 ITGB2 ICAM5 ITGB2 VNN2 ITGB2 ESM1 LGALS3BP LGALS3 LGALS3BP PPIC HP CD163 RNF128 CD151 VCAN ITGA4 VCAN SELPLG MADCAM1 ITGA4 ITGA4 ICAM4 ITGA4 LGALS8 ITGA4 ADAM28 F2RL2 F2RL3 F2RL2 JAM2 F2RL2 JAM3 FGA SERPINF2 FGA F13A1 FGA FGG MATN2 COL4A4 MATN2 FBN2 SPARC COL13A1 SPARC CTSK COL9A2 MAG COL9A3 MAG COMP COL9A1 MAG COL9A1 MAG RTN4R HABP2 COL4A4 OSM COL4A4 SERPINE2 COL4A4 SAA1 COL4A4 ANTXR2 COL4A4 COL13A1 NID2 NID2 LAMC1 INS NOV INS IGFBP7 CSN2 CSN3 LGALS3 LIM2 LGALS3 CYHR1 SELPLG MSN SELPLG GALNT4 SPN ICAM1 SPN MSN SPN SIGLEC1 SERPINF2 PLAU SERPINF2 F11 SERPINF2 F13A1 SERPINF2 KLK13 SERPINF2 SERPINB12 SERPINB13 CTSK PLAU PLAUR PLAU SERPINB6 PLAU ST14 PLAU HGF SRPX2 PLAUR SERPINA4 KLK1 GP1BA F11 GP1BA GP5 GP1BA GP9 SDC1 HGF SDC1 LACRT SDC1 IGFBP7 VCAM1 MSN VCAM1 ITGAD CTSK SERPINB3 MEGF6 MFAP5 LTBP1 FBN2 PLAUR MMP12 MFAP5 FBN2 ICAM1 FGG ICAM1 MSN F11 HGF F11 TFPI2 F13A1 F13B F13A1 FGG HGFAC HGF HGFAC KLKB1 HGFAC SPINT1 IGFBP5 IGFALS IGFBP5 PAPPA2 ST14 HGF ST14 SPINT1 ST14 CDCP1 JAM2 JAM3 HGF KLKB1 HGF CLEC3B TFPI2 KLKB1 F13B FGG GP9 GP1BB RARRES3 TGM1 MSN ICAM2 MSN ICAM3 ICAM3 ITGAD ICAM3 ITGAL ICAM3 CLEC4M ITGAL ICAM5 SLC35E1 MCOLN1 RTN4R LINGO1 RTN4R RTN4IP1 NetSAM/inst/unitTests/0000755000175400017540000000000013746055306015657 5ustar00biocbuildbiocbuildNetSAM/inst/unitTests/test_NetSAM.R0000644000175400017540000000035613746055306020134 0ustar00biocbuildbiocbuildtest_NetSAM <- function(){ data(inputNetwork) outputFileName <- paste(getwd(),"/NetSAM",sep="") result <- NetSAM(inputNetwork, outputFileName) checkTrue(!is.na(result[1])) checkTrue(!is.na(result[2])) checkTrue(!is.na(result[3])) } NetSAM/man/0000755000175400017540000000000013746055306013453 5ustar00biocbuildbiocbuildNetSAM/man/NetSAM-package.Rd0000644000175400017540000000162213746055306016423 0ustar00biocbuildbiocbuild\name{NetSAM-package} \alias{NetSAM-package} \docType{package} \title{ Network Seriation and Modularization } \description{ The NetSAM (Network Seriation and Modularization) package takes an edge-list representation of a network as an input, performs network seriation and modularization analysis, and generates as files that can be used as an input for the one-dimensional network visualization tool NetGestalt (http://www.netgestalt.org) or other network analysis. } \details{ \tabular{ll}{ Package: \tab NetSAM\cr Type: \tab Package\cr Version: \tab 1.3.0\cr Date: \tab 2014-01-23\cr License: \tab LGPL\cr LazyLoad: \tab yes\cr } } \author{ Jing Wang Maintainer: Bing Zhang } \references{ NetGestalt: integrating multidimensional omics data over biological networks. Nature Methods 10, 597-598 (2013). } \seealso{ \code{\link{NetSAM}} } \keyword{ package } NetSAM/man/NetSAM.Rd0000644000175400017540000001037413746055306015036 0ustar00biocbuildbiocbuild\name{NetSAM} \alias{NetSAM} \title{ Network Seriation and Modularization } \description{ The NetSAM function uses random walk distance-based hierarchical clustering to identify the hierarchical modules of the network and then uses the optimal leaf ordering (OLO) method to optimize the one-dimensional ordering of the genes in each module by minimizing the sum of the pair-wise random walk distance of adjacent genes in the ordering. } \usage{ NetSAM(inputNetwork, outputFileName, minModule = (-1), maxStep = 4, method = "Modularity Cutoff", ModularityThr = 0.2, ZRandomNum = 10, permuteNum = 100, pThr = 0.05) } \arguments{ \item{inputNetwork}{ The network under analysis. inputNetwork can be the name of the input network file in the edge-list format (each row represents an edge with two node names separated by a tab or space) or be a data object in R (data object must be graphNEL class or data.frame (or matrix) class with two columns). } \item{outputFileName}{ The name of the output file. If no file path is provided, the output file will be saved to the current path. } \item{minModule}{ The minimum number of nodes for a module (or minimum module size). If the size of a module identified by the function is less than the specified number, the module will not be further partitioned into sub-modules. The default is -1 which means NetSAM will set \code{minModule} as 5 or 0.3 percent of the number of nodes in the input network, whichever is larger. } \item{maxStep}{ Because NetSAM uses random walk distance-based hierarchical clustering to reveal the hierarchical organization of an input network, it requires a specified length of the random walks. To get the optimal length, the function will test a range of lengths ranging from 2 to \code{maxStep}. The default is 4. } \item{method}{ To test whether a network under consideration has a non-random internal modular organization, the function provides three options: "Modularity Cutoff", "ZScore" and "Permutation". "Modularity Cutoff" means if the modularity score of the network is above a specified cutoff value, the network will be considered to have internal organization and will be further partitioned. For "ZScore" and "Permutation", the function first uses the edge switching method to generate a given number of random networks with the same number of nodes and an identical degree sequence and calculates the modularity scores for these random networks. Then, "ZScore" method will transform the real modularity score to a z score based on the random modularity scores and then transform the z score to a p value assuming a standard normal distribution. The "Permutation" method will compare the real modularity score with the random ones to calculate a p value. Finally, under a specified significance level, the function determines whether the network can be further partitioned. The default is "Modularity Cutoff". } \item{ModularityThr}{ Threshold of modularity score for the "Modularity Cutoff" method. The default is 0.2 } \item{ZRandomNum}{ The number of random networks that will be generated for the "ZScore" calculation. The default is 10. } \item{permuteNum}{ The number of random networks that will be generated for the "Permutation" p value calculation. The default is 100. } \item{pThr}{ The significance level for determining whether a network has non-random internal modular organization for the "ZScore" or "Permutation" methods. } } \note{ Because the seriation step requires pair-wise distance between all nodes, NetSAM is memory consuming. We recommend to use the 64 bit version of R to run the NetSAM. For networks with less than 10,000 nodes, we recommend to use a computer with 8GB memory. For networks with more than 10,000 nodes, a computer with at least 16GB memory is recommended. } \author{ Jing Wang } \examples{ cat("The input network can be a file.\n") inputNetwork <- system.file("extdata","exampleNetwork.txt",package="NetSAM") cat("The input network can be also a data object, such as graphNEL object.\n") data(inputNetwork) outputFileName <- paste(getwd(),"/NetSAM",sep="") result <- NetSAM(inputNetwork, outputFileName, minModule = (-1), maxStep = 4, method = "Modularity Cutoff", ModularityThr = 0.2, ZRandomNum = 10, permuteNum = 100, pThr = 0.05) } \keyword{ methods } NetSAM/man/inputNetwork.Rd0000644000175400017540000000060613746055306016455 0ustar00biocbuildbiocbuild\name{inputNetwork} \alias{inputNetwork} \docType{data} \title{ A network example with graphNEL class } \description{ The network is a sub-network of HPRD (Human Protein Reference Database) network with 320 nodes and 769 edges, which is an example to show how to input network with graphNEL class into the package. } \usage{data(inputNetwork)} \format{graphNEL} \keyword{datasets} NetSAM/tests/0000755000175400017540000000000013746055306014042 5ustar00biocbuildbiocbuildNetSAM/tests/runTests.R0000644000175400017540000000004513746055306016013 0ustar00biocbuildbiocbuildBiocGenerics:::testPackage("NetSAM") NetSAM/vignettes/0000755000175400017540000000000013746150015014701 5ustar00biocbuildbiocbuildNetSAM/vignettes/NetSAM.Rnw0000755000175400017540000002011613746055306016472 0ustar00biocbuildbiocbuild%\VignetteIndexEntry{NetSAM} %\VignetteKeywords{Network, seriation, hierarchical modulization, NetGestalt} %\VignettePackage{NetSAM} \documentclass[a4paper, oneside, 10pt]{article} \usepackage[pdftex]{graphicx} \usepackage{calc} \usepackage{sectsty} \usepackage{caption} \usepackage{underscore} \renewcommand{\captionfont}{\it\sffamily} \renewcommand{\captionlabelfont}{\bf\sffamily} \allsectionsfont{\sffamily} % page style %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \usepackage[a4paper, left=25mm, right=20mm, top=20mm, bottom=25mm, nohead]{geometry} \setlength{\parskip}{1.5ex} \setlength{\parindent}{0cm} \pagestyle{empty} \usepackage{hyperref} \hypersetup{% unicode=true, CJKbookmarks=true, bookmarksnumbered=true, bookmarksopen=true, bookmarksopenlevel=1, breaklinks=true, colorlinks=false, plainpages=false, pdfpagelabels, pdfborder=0 0 0 } \urlstyle{same} \begin{document} \title{Manual of NetSAM} \author{Jing Wang, Bing Zhang} \maketitle \section{Introduction} The last decade of systems biology research has demonstrated that networks rather than individual genes govern the onset and progression of complex diseases. Meanwhile, real-world complex networks usually exhibit hierarchical organization, in which nodes can be combined into groups that can be further combined into larger groups, and so on over multiple scales. Thus, identifying the hierarchical organization of a network becomes indispensable in complex disease studies. A traditional and useful method for revealing hierarchical architecture of network is hierarchical clustering, which groups data over a variety of scales by creating a hierarchical tree. However, hierarchical clustering has three major limitations. First, there are many different leaf node orderings consistent with the structure of a hierarchical tree, and hierarchical clustering does not optimize the ordering. Secondly, hierarchical clustering does not assess the statistical significance of the modular organization of a network. Finally, it does not specify relevant hierarchical levels and modules at different scales. To address these limitations, we developed the NetSAM (Network Seriation and Modularization) package which will identify the hierarchical modules from a network (network modularization) and find a suitable linear order for all leaves of the identified hierarchical organization (network seriation). NetSAM takes an edge-list representation of a network as an input and generates as files that can be used as an input for the one-dimensional network visualization tool NetGestalt (\href{http://www.netgestalt.org}{http://www.netgestalt.org}) or other network analysis. NetSAM uses random walk distance-based hierarchical clustering to identify the hierarchical modules of the network and then uses the optimal leaf ordering (OLO) method to optimize the one-dimensional ordering of the genes in each module by minimizing the sum of the pair-wise random walk distance of adjacent genes in the ordering. The detailed description of the NetSAM method can be found in our recently published Nature Methods paper "NetGestalt: integrating multidimensional omics data over biological networks" (http://www.nature.com/nmeth/journal/v10/n7/full/nmeth.2517.html). \section{Environment} NetSAM requires R version 2.15.1 or later, which can be downloaded from the website \href{http://www.r-project.org/}{http://www.r-project.org/}. Because the seriation step requires pair-wise distance between all nodes, NetSAM is memory consuming. We recommend to use the 64 bit version of R to run the NetSAM. For networks with less than 10,000 nodes, we recommend to use a computer with 8GB memory. Using our computer with 2.7 GHz Intel Core i5 processor and 8 GB 1333 MHz DDR3 memory, NetSAM took 402 seconds to analyze the HPRD network (\href{http://www.hprd.org}{http://www.hprd.org}) with 9198 nodes. For networks with more than 10,000 nodes, a computer with at least 16GB memory is recommended. NetSAM requires the following packages: igraph ($>$=0.6-1), seriation ($>$=1.0-6) and graph ($>$=1.34.0), which can be installed as follows. $>$install.packages("igraph") $>$install.packages("seriation") $>$if (!requireNamespace("BiocManager", quietly=TRUE)) $>$install.packages("BiocManager") $>$BiocManager::install("graph") \section{Network Seriation and Modularization} After building up the basic environment mentioned above, the users can install the NetSAM package and use it to analyze networks. <>= library("NetSAM") cat("The input network can be a file.\n") inputNetwork <- system.file("extdata","exampleNetwork.txt",package="NetSAM") cat("The input network can be also a data object, such as graphNEL object.\n") data(inputNetwork) outputFileName <- paste(getwd(),"/NetSAM",sep="") result <- NetSAM(inputNetwork, outputFileName, minModule=(-1), maxStep=4, method="Modularity Cutoff", ModularityThr=0.2, ZRandomNum=10, permuteNum=100, pThr=0.05) @ \subsection{Input} This section describes the arguments of the NetSAM function: 1. \emph{inputNetwork} is the network under analysis, which can be the name of the input network file in the edge-list format (each row represents an edge with two node names separated by a tab or space) or be a data object in R (data object must be graphNEL class or data.frame (or matrix) class with two columns). 2. \emph{outputFileName} is the name of the output file. If no file path is provided, the output file will be saved to the current path. 3. \emph{minModule} is the minimum number of nodes for a module (or minimum module size). If the size of a module identified by the function is less than the specified number, the module will not be further partitioned into sub-modules. The default is -1 which means NetSAM will set \emph{minModule} as 5 or 0.3 percent of the number of nodes in the input network, whichever is larger. 4. Because NetSAM uses random walk distance-based hierarchical clustering to reveal the hierarchical organization of an input network, it requires a specified length of the random walks. To get the optimal length, the function will test a range of lengths ranging from 2 to \emph{maxStep}. The default is 4. 5. To test whether a network under consideration has a non-random internal modular organization, the function provides three options: "Modularity Cutoff", "ZScore" and "Permutation". "Modularity Cutoff" means if the modularity score of the network is above a specified cutoff value, the network will be considered to have internal organization and will be further partitioned. For "ZScore" and "Permutation", the function first uses the edge switching method to generate a given number of random networks with the same number of nodes and an identical degree sequence and calculates the modularity scores for these random networks. Then, "ZScore" method will transform the real modularity score to a z score based on the random modularity scores and then transform the z score to a p value assuming a standard normal distribution. The "Permutation" method will compare the real modularity score with the random ones to calculate a p value. Finally, under a specified significance level, the function determines whether the network can be further partitioned. The default is "Modularity Cutoff". 6. \emph{ModularityThr} is the threshold of modularity score for the "Modularity Cutoff" method. The default is 0.2. 7. \emph{ZRandomNum} is the number of random networks that will be generated for the "ZScore" calculation. The default is 10. 8. \emph{permuteNum} is the number of random networks that will be generated for the "Permutation" p value calculation. The default is 100. 9. \emph{pThr} is the significance level for determining whether a network has non-random internal modular organization for the "ZScore" or "Permutation" methods. \subsection{Output} The NetSAM function outputs a "nsm" file that can be used as an input for the one-dimensional network visualization tool NetGestalt (\href{http://www.netgestalt.org}{http://www.netgestalt.org}). Meanwhile, the NetSAM function also outputs a list object in R which contains all information in "nsm" file. \end{document} NetSAM/vignettes/underscore.sty0000644000175400017540000002473513746055306017635 0ustar00biocbuildbiocbuild% underscore.sty 21-Sep-2005 Donald Arseneau asnd@triumf.ca % Make the "_" character print as "\textunderscore" in text. % Copyright 1998,2001,2005,2006 Donald Arseneau; % License: LPPL version 1.2 or later. % Instructions follow after the definitions. \ProvidesPackage{underscore}[2006/09/13] \begingroup \catcode`\_=\active \gdef _{% \relax % No relax gives a small vulnerability in alignments \ifx\if@safe@actives\iftrue % must be outermost test! \string_% \else \ifx\protect\@typeset@protect \ifmmode \sb \else \BreakableUnderscore \fi \else \ifx\protect\@unexpandable@protect \noexpand_% \else \protect_% \fi\fi \fi} \global\let\ActiveUnderscore=_ \gdef\normalUnderscoreDef{\let_\ActiveUnderscore} \endgroup % At begin: set catcode; fix \long \ttdefault so I can use it in comparisons; % reapply definition of active _ in output routine (\@firstofone to strip % away braces, so avoiding deeper nesting). \AtBeginDocument{% {\immediate\write\@auxout{\catcode\number\string`\_ \string\active}}% \catcode\string`\_\string=\active \edef\ttdefault{\ttdefault}% \output=\expandafter\expandafter\expandafter {\expandafter\expandafter\expandafter\normalUnderscoreDef \expandafter\@firstofone\the\output}% } \newcommand{\BreakableUnderscore}{\leavevmode\nobreak\hskip\z@skip \ifx\f@family\ttdefault \string_\else \textunderscore\fi \usc@dischyph\nobreak\hskip\z@skip} \DeclareRobustCommand{\_}{% \ifmmode \nfss@text{\textunderscore}\else \BreakableUnderscore \fi} \let\usc@dischyph\@dischyph \DeclareOption{nohyphen}{\def\usc@dischyph{\discretionary{}{}{}}} \DeclareOption{strings}{\catcode`\_=\active} \ProcessOptions \ifnum\catcode`\_=\active\else \endinput \fi %%%%%%%% Redefine commands that use character strings %%%%%%%% \@ifundefined{UnderscoreCommands}{\let\UnderscoreCommands\@empty}{} \expandafter\def\expandafter\UnderscoreCommands\expandafter{% \UnderscoreCommands \do\include \do\includeonly \do\@input \do\@iinput \do\InputIfFileExists \do\ref \do\pageref \do\newlabel \do\bibitem \do\@bibitem \do\cite \do\nocite \do\bibcite \do\Ginclude@graphics \do\@setckpt } % Macro to redefine a macro to pre-process its string argument % with \protect -> \string. \def\do#1{% Avoid double processing if user includes command twice! \@ifundefined{US\string_\expandafter\@gobble\string#1}{% \edef\@tempb{\meaning#1}% Check if macro is just a protection shell... \def\@tempc{\protect}% \edef\@tempc{\meaning\@tempc\string#1\space\space}% \ifx\@tempb\@tempc % just a shell: hook into the protected inner command \expandafter\do \csname \expandafter\@gobble\string#1 \expandafter\endcsname \else % Check if macro takes an optional argument \def\@tempc{\@ifnextchar[}% \edef\@tempa{\def\noexpand\@tempa####1\meaning\@tempc}% \@tempa##2##3\@tempa{##2\relax}% \edef\@tempb{\meaning#1\meaning\@tempc}% \edef\@tempc{\noexpand\@tempd \csname US\string_\expandafter\@gobble\string#1\endcsname}% \if \expandafter\@tempa\@tempb \relax 12\@tempa % then no optional arg \@tempc #1\US@prot \else % There is optional arg \@tempc #1\US@protopt \fi \fi }{}} \def\@tempd#1#2#3{\let#1#2\def#2{#3#1}} \def\US@prot#1#2{\let\@@protect\protect \let\protect\string \edef\US@temp##1{##1{#2}}\restore@protect\US@temp#1} \def\US@protopt#1{\@ifnextchar[{\US@protarg#1}{\US@prot#1}} \def\US@protarg #1[#2]{\US@prot{{#1[#2]}}} \UnderscoreCommands \let\do\relax \let\@tempd\relax % un-do %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \endinput underscore.sty 13-Sep-2006 Donald Arseneau Features: ~~~~~~~~ The "\_" command (which normally prints an underscore character or facsimile) is altered so that the hyphenation of constituent words is not affected, and hyphenation is permitted after the underscore. For example, "compound\_fracture" hyphenates as com- pound\_- frac- ture. If you prefer the underscore to break without a hyphen (but still with the same rules for explicit hyphen-breaks) then use the [nohyphen] package option. A simple "_" acts just like "\_" in text mode, but makes a subscript in math mode: activation_energy $E_a$ Both forms use an underscore character if the font encoding contains one (e.g., "\usepackage[T1]{fontenc}" or typewriter fonts in any encoding), but they use a rule if there is no proper character. Deficiencies: ~~~~~~~~~~~~ The skips and penalties ruin any kerning with the underscore character (when a character is used). However, there doesn't seem to be much, if any, such kerning in the ec fonts, and there is never any kerning with a rule. You must avoid "_" in file names and in cite or ref tags, or you must use the babel package, with its active-character controls, or you must give the [strings] option, which attempts to redefine several commands (and may not work perfectly). Even without the [strings] option or babel, you can use occasional underscores like: "\include{file\string_name}". Option: [strings] ~~~~~~~~~~~~~~~~ The default operation is quite simple and needs no customization; but you must avoid using "_" in any place where LaTeX uses an argument as a string of characters for some control function or as a name. These include the tags for "\cite" and "\ref", file names for "\input", "\include", and "\includegraphics", environment names, counter names, and placement parameters (like "[t]"). The problem with these contexts is that they are `moving arguments' but LaTeX does not `switch on' the "\protect" mechanism for them. If you need to use the underscore character in these places, the package option [strings] is provided to redefine commands that take such a string argument so that protection is applied (with "\protect" being "\string"). The list of commands is given in "\UnderscoreCommands", with "\do" before each; plus several others covering "\input", "\includegraphics, "\cite", "\ref", and their variants. Not included are many commands regarding font names, everything with counter names, environment names, page styles, and versions of "\ref" and "\cite" defined by external packages (e.g., "\vref" and "\citeyear"). You can add to the list of supported commands by defining "\UnderscoreCommands" before loading this package; e.g. \usepackage{chicago} \newcommand{\UnderscoreCommands}{% (\cite already done) \do\citeNP \do\citeA \do\citeANP \do\citeN \do\shortcite \do\shortciteNP \do\shortciteA \do\shortciteANP \do\shortciteN \do\citeyear \do\citeyearNP } \usepackage[strings]{underscore} Not all commands can be supported this way! Only commands that take a string argument *first* can be protected. One optional argument before the string argument is also permitted, as exemplified by "\cite": both "\cite{tags}" and "\cite[text]{tags}" are allowed. A command like "\@addtoreset" which takes two counter names as arguments could not be protected by listing it in "\UnderscoreCommands". *When you use the [strings] option, you must load this package last* (or nearly last). There are two reasons: 1) The redefinitions done for protection must come after other packages define their customized versions of those commands. 2) The [strings] option requires the "_" character to be activated immediately in order for the cite and ref tags to be read properly from the .aux file as plain strings, and this catcode setting might disrupt other packages. The babel package implements a protection mechanism for many commands, and will be a complete fix for most documents without the [strings] option. Many add-on packages are compatible with babel, so they will get the strings protection also. However, there are several commands that are not covered by babel, but can easily be supported by the [strings] and "\UnderscoreCommands" mechanism. Beware that using both [strings] and babel might lead to conflicts, but none are seen yet (load babel last). Implementation Notes: ~~~~~~~~~~~~~~~~~~~~ The first setting of "_" to be an active character is performed in a local group so as to not interfere with other packages. The catcode setting is repeated with "\AtBeginDocument" so the definition is in effect for the text. However, the catcode setting is repeated immediately when the [strings] option is detected. The definition of the active "_" is essentially: \ifmmode \sb \else \BreakableUnderscore \fi where "\sb" retains the normal subscript meaning of "_" and where "\BreakableUnderscore" is essentially "\_". The rest of the definition handles the "\protect"ion without causing "\relax" to be inserted before the character. "\BreakableUnderscore" uses "\nobreak\hskip\z@skip" to separate the underscore from surrounding words, thus allowing TeX to hyphenate them, but preventing free breaks around the underscore. Next, it checks the current font family, and uses the underscore character from tt fonts or otherwise "\textunderscore" (which is a character or rule depending on the font encoding). After the underscore, it inserts a discretionary hyphenation point as "\usc@dischyph", which is usually just "\-" except that it still works in the tabbing environment, although it will give "\discretionary{}{}{}" under the [nohyphen] option. After that, another piece of non-breaking interword glue is inserted. Ordinarily, the comparison "\ifx\f@family\ttdefault" will always fail because "\ttdefault" is `long' whereas "\f@family" is not (boooo hisss), but "\ttdefault" is redefined to be non-long by "\AtBeginDocument". The "\_" command is then defined to use "\BreakableUnderscore". If the [strings] option is not given, then that is all! Under the [strings] option, the list of special commands is processed to: - retain the original command as "\US_"*command* (e.g., "\US_ref") - redefine the command as "\US@prot\US_command" for ordinary commands ("\US@prot\US_ref") or as "\US@protopt\US_command" when an optional argument is possible (e.g., "\US@protopt\US_bibitem"). - self-protecting commands ("\cite") retain their self-protection. Diagnosing the state of the pre-existing command is done by painful contortions involving "\meaning". "\US@prot" and "\US@protopt" read the argument, process it with "\protect" enabled, then invoke the saved "\US_command". Modifications: ~~~~~~~~~~~~~ 13-Sep-2006 Reassert my definition in the output routine (listings). 21-Sep-2005 \includegraphics safe. 12-Oct-2001 Babel (safe@actives) compatibility and [nohyphen] option. Test file integrity: ASCII 32-57, 58-126: !"#$%&'()*+,-./0123456789 :;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~