Getting species annotation for intergenic mapping reads

require(GenomicRanges)
Loading required package: GenomicRanges
Loading required package: stats4
Loading required package: BiocGenerics
Loading required package: parallel

Attaching package: ‘BiocGenerics’

The following objects are masked from ‘package:parallel’:

    clusterApply, clusterApplyLB, clusterCall, clusterEvalQ, clusterExport, clusterMap,
    parApply, parCapply, parLapply, parLapplyLB, parRapply, parSapply, parSapplyLB

The following objects are masked from ‘package:dplyr’:

    combine, intersect, setdiff, union

The following objects are masked from ‘package:stats’:

    IQR, mad, sd, var, xtabs

The following objects are masked from ‘package:base’:

    anyDuplicated, append, as.data.frame, basename, cbind, colnames, dirname, do.call,
    duplicated, eval, evalq, Filter, Find, get, grep, grepl, intersect, is.unsorted, lapply,
    Map, mapply, match, mget, order, paste, pmax, pmax.int, pmin, pmin.int, Position, rank,
    rbind, Reduce, rownames, sapply, setdiff, sort, table, tapply, union, unique, unsplit,
    which.max, which.min

Loading required package: S4Vectors

Attaching package: ‘S4Vectors’

The following objects are masked from ‘package:dplyr’:

    first, rename

The following object is masked from ‘package:tidyr’:

    expand

The following objects are masked from ‘package:base’:

    expand.grid, I, unname

Loading required package: IRanges

Attaching package: ‘IRanges’

The following objects are masked from ‘package:dplyr’:

    collapse, desc, slice

The following object is masked from ‘package:purrr’:

    reduce

Loading required package: GenomeInfoDb
require(GenomicFeatures)
Loading required package: GenomicFeatures
Loading required package: AnnotationDbi
Loading required package: Biobase
Welcome to Bioconductor

    Vignettes contain introductory material; view with 'browseVignettes()'. To cite
    Bioconductor, see 'citation("Biobase")', and for packages 'citation("pkgname")'.


Attaching package: ‘AnnotationDbi’

The following object is masked from ‘package:dplyr’:

    select
require(GenomicAlignments)
Loading required package: GenomicAlignments
Loading required package: SummarizedExperiment
Loading required package: MatrixGenerics
Loading required package: matrixStats

Attaching package: ‘matrixStats’

The following objects are masked from ‘package:Biobase’:

    anyMissing, rowMedians

The following object is masked from ‘package:dplyr’:

    count


Attaching package: ‘MatrixGenerics’

The following objects are masked from ‘package:matrixStats’:

    colAlls, colAnyNAs, colAnys, colAvgsPerRowSet, colCollapse, colCounts, colCummaxs,
    colCummins, colCumprods, colCumsums, colDiffs, colIQRDiffs, colIQRs, colLogSumExps,
    colMadDiffs, colMads, colMaxs, colMeans2, colMedians, colMins, colOrderStats, colProds,
    colQuantiles, colRanges, colRanks, colSdDiffs, colSds, colSums2, colTabulates,
    colVarDiffs, colVars, colWeightedMads, colWeightedMeans, colWeightedMedians,
    colWeightedSds, colWeightedVars, rowAlls, rowAnyNAs, rowAnys, rowAvgsPerColSet,
    rowCollapse, rowCounts, rowCummaxs, rowCummins, rowCumprods, rowCumsums, rowDiffs,
    rowIQRDiffs, rowIQRs, rowLogSumExps, rowMadDiffs, rowMads, rowMaxs, rowMeans2,
    rowMedians, rowMins, rowOrderStats, rowProds, rowQuantiles, rowRanges, rowRanks,
    rowSdDiffs, rowSds, rowSums2, rowTabulates, rowVarDiffs, rowVars, rowWeightedMads,
    rowWeightedMeans, rowWeightedMedians, rowWeightedSds, rowWeightedVars

The following object is masked from ‘package:Biobase’:

    rowMedians

Loading required package: Biostrings
Loading required package: XVector

Attaching package: ‘XVector’

The following object is masked from ‘package:purrr’:

    compact


Attaching package: ‘Biostrings’

The following object is masked from ‘package:base’:

    strsplit

Loading required package: Rsamtools

Attaching package: ‘GenomicAlignments’

The following object is masked from ‘package:dplyr’:

    last
require(AnnotationDbi)

library(methods)
library(data.table)
data.table 1.14.0 using 28 threads (see ?getDTthreads).  Latest news: r-datatable.com

Attaching package: ‘data.table’

The following objects are masked from ‘package:GenomicAlignments’:

    first, last, second

The following object is masked from ‘package:SummarizedExperiment’:

    shift

The following object is masked from ‘package:GenomicRanges’:

    shift

The following object is masked from ‘package:IRanges’:

    shift

The following objects are masked from ‘package:S4Vectors’:

    first, second

The following objects are masked from ‘package:dplyr’:

    between, first, last

The following object is masked from ‘package:purrr’:

    transpose
library(yaml)

source("/data/share/htp/prime-seq_Paper/Fig_gdna_priming/analysis/count_intergenic/count_intergenic_functions.R")

outdir<-"/data/share/htp/prime-seq_Paper/Fig_gdna_priming/zUMIs/"

gtf<-"/data/share/htp/prime-seq_Paper/genomes/HsapMmus/gencode.v35.vM25.primary_assembly.annotation.gtf"
  
  
  txdb <- suppressWarnings(suppressMessages(GenomicFeatures::makeTxDbFromGFF(file=gtf, format="gtf")))

  
  ## Make Gene-range GR-object
  se <- suppressMessages(
    AnnotationDbi::select(txdb, keys(txdb, "GENEID"),
                              columns=c("GENEID","TXCHROM","TXSTART","TXEND","TXSTRAND"),
                              keytype="GENEID") %>%
    dplyr::group_by(GENEID,TXCHROM,TXSTRAND)  %>%
    dplyr::mutate( txstart =ifelse(TXSTART<TXEND,min(TXSTART),min(TXEND)),
                   txend  =ifelse(TXSTART<TXEND,max(TXEND),min(TXSTART) ) ) %>%
    dplyr::select(GENEID,TXCHROM,TXSTRAND,txstart,txend)  %>% unique()
    )

  gr.gene<-GenomicRanges::GRanges(seqnames = se$TXCHROM,
                                  ranges =  IRanges(start= se$txstart,
                                                    end=  se$txend,
                                                    names=se$GENEID),
                                  strand =  se$TXSTRAND,
                                  gid    =  se$GENEID)

  ### Get non-overlapping Introns/Exons
  intron<-GenomicFeatures::intronsByTranscript(txdb, use.names=T)
  exon<-GenomicFeatures::exonsBy(txdb, by="tx",use.names=T)

  intron.exon.red <- c( GenomicRanges::reduce(unlist(intron),ignore.strand=T), GenomicRanges::reduce(unlist(exon),ignore.strand=T) )
  intron.exon.dis <- GenomicRanges::disjoin(intron.exon.red, ignore.strand=T)
  intron.only<-GenomicRanges::setdiff(intron.exon.dis, unlist(exon) ,ignore.strand=T)
  intergenic.only<-gaps(intron.exon.dis)
  
  ol.in<-GenomicRanges::findOverlaps(intron.only, gr.gene, select="arbitrary")
  ol.ex<-GenomicRanges::findOverlaps(unlist(exon), gr.gene, select="arbitrary")
  ol.ig<-GenomicRanges::findOverlaps(intergenic.only, gr.gene, select="arbitrary")

  intron.saf<-data.frame(GeneID= names(gr.gene)[ol.in],
                         Chr   = seqnames(intron.only),
                         Start = start(intron.only),
                         End     =   end(intron.only),stringsAsFactors = F)
  exon.saf<-data.frame(GeneID= names(gr.gene)[ol.ex],
                       Chr   = seqnames(unlist(exon)),
                       Start = start(unlist(exon)),
                       End   =   end(unlist(exon)),
                       Strand =  strand(unlist(exon)),stringsAsFactors = F)

  intergenic.saf<-data.frame(GeneID= seqnames(intergenic.only),
                       Chr   = seqnames(intergenic.only),
                       Start = start(intergenic.only),
                       End   =   end(intergenic.only),
                       Strand = rep("+",times=length(intergenic.only)),
                       stringsAsFactors = F)
  
  intergenic.saf<-rbind(intergenic.saf,data.frame(GeneID= seqnames(intergenic.only),
                       Chr   = seqnames(intergenic.only),
                       Start = start(intergenic.only),
                       End   =   end(intergenic.only),
                       Strand = rep("-",times=length(intergenic.only)),
                       stringsAsFactors = F))
  
  intron.saf<-dplyr::left_join(intron.saf,unique(exon.saf[,c("GeneID","Strand")]),by=c("GeneID"))
  

  

  saf <- list(introns=unique(intron.saf),exons=unique(exon.saf),intergenic=unique(intergenic.saf))
  
saveRDS(saf, file="/data/share/htp/prime-seq_Paper/Fig_gdna_priming/analysis/count_intergenic/inex_intergenic.saf.RDS")
paste0(outdir,project[i])
[1] "/data/share/htp/prime-seq_Paper/Fig_gdna_priming/zUMIs/rep1"

#get Intergenic reads from zUMIs-stats2.R
gtf2<-"/data/share/htp/prime-seq_Paper/Fig_gdna_priming/zUMIs/rep1/Bulk_opt_gDNA_priming_rep1.final_annot.gtf"
user_seq<- getUserSeq(gtf2) 
spec_seq<- getSpecies(gtf2)

####
bcb<-c("/data/share/htp/prime-seq_Paper/Fig_gdna_priming/zUMIs/rep1/zUMIs_output/Bulk_opt_gDNA_priming_rep1kept_barcodes_binned.txt",
       "/data/share/htp/prime-seq_Paper/Fig_gdna_priming/zUMIs/rep2/zUMIs_output/Bulk_opt_gDNA_priming_rep2kept_barcodes_binned.txt",
       "/data/share/htp/prime-seq_Paper/Fig_gdna_priming/zUMIs/rep3/zUMIs_output/Bulk_opt_gDNA_priming_rep3kept_barcodes_binned.txt")

BCstats<-c("/data/share/htp/prime-seq_Paper/Fig_gdna_priming/zUMIs/rep1/Bulk_opt_gDNA_priming_rep1.BCstats.txt",
           "/data/share/htp/prime-seq_Paper/Fig_gdna_priming/zUMIs/rep2/Bulk_opt_gDNA_priming_rep2.BCstats.txt",
           "/data/share/htp/prime-seq_Paper/Fig_gdna_priming/zUMIs/rep3/Bulk_opt_gDNA_priming_rep3.BCstats.txt")

kbc<-c("/data/share/htp/prime-seq_Paper/Fig_gdna_priming/zUMIs/rep1/zUMIs_output/Bulk_opt_gDNA_priming_rep1kept_barcodes.txt",
       "/data/share/htp/prime-seq_Paper/Fig_gdna_priming/zUMIs/rep2/zUMIs_output/Bulk_opt_gDNA_priming_rep2kept_barcodes.txt",
       "/data/share/htp/prime-seq_Paper/Fig_gdna_priming/zUMIs/rep3/zUMIs_output/Bulk_opt_gDNA_priming_rep3kept_barcodes.txt")

for (i in 1:3){
  bccount<-fread(bcb[i])

bccount<-splitRG(bccount=bccount, mem= 75,read_layout = "SE")

binmap <- BCbin(bccount_file =BCstats[i],
                  bc_detected  = bccount,
                nReadsperCell = 100,
                nthread = 10,
                BarcodeBinning = 2)

# samouts <- prep_samtools(featfiles = ffiles,
#                          bccount   = bccount,
#                          cores     = 10,
#                          project = project[1],
#                          BarcodeBinning = 2,
#                          outdir=outdir)


bc<-data.table::fread(kbc[i],select = 1, header = T)

featfile_vector <- c(paste0(outdir,project[i],"/Bulk_opt_gDNA_priming_",project[i],".filtered.tagged.Aligned.out.bam.ex.featureCounts.bam"),
                       paste0(outdir,project[i],"/Bulk_opt_gDNA_priming_",project[i],".filtered.tagged.Aligned.out.bam.in.featureCounts.bam"),
                       paste0(outdir,project[i],"/Bulk_opt_gDNA_priming_",project[i],".filtered.tagged.Aligned.out.bam.inter.featureCounts.bam"))

typeCount <- sumstatBAM( featfiles = featfile_vector,
                         cores = 10,
                         outdir= outdir,
                         user_seq = user_seq,
                         bc = bc,
                         outfile = paste0(outdir,project[i],".bc.READcounts.rds"),
                         BCstats = BCstats[i],
                         nReadsperCell = 100,
                         mem_limit = 75,
                         bccount = bccount,
                         project = project[i],
                         BarcodeBinning = 2,
                         mem = 75,
                         read_layout = "SE",
                         spec_seq = spec_seq,
                         binmap=binmap)

tc<-data.frame(typeCount)
tc$type<-factor(tc$type, levels=rev(c("Exon","Intron","Intergenic_mouse","Intergenic_human","Intergenic","Ambiguity","Unmapped","User")))
write.table(tc,file = paste(outdir,project[i],".readspercell.txt",sep=""),sep="\t",row.names = F,col.names = T)
}
LS0tCnRpdGxlOiAiQ291bnQgSW50ZXJnZW5pYyBwZXIgc3BlY2llcyIKb3V0cHV0OiBodG1sX25vdGVib29rCi0tLQoKCkdldHRpbmcgc3BlY2llcyBhbm5vdGF0aW9uIGZvciBpbnRlcmdlbmljIG1hcHBpbmcgcmVhZHMKCmBgYHtyfQpyZXF1aXJlKEdlbm9taWNSYW5nZXMpCnJlcXVpcmUoR2Vub21pY0ZlYXR1cmVzKQpyZXF1aXJlKEdlbm9taWNBbGlnbm1lbnRzKQpyZXF1aXJlKEFubm90YXRpb25EYmkpCgpsaWJyYXJ5KG1ldGhvZHMpCmxpYnJhcnkoZGF0YS50YWJsZSkKbGlicmFyeSh5YW1sKQoKc291cmNlKCIvZGF0YS9zaGFyZS9odHAvcHJpbWUtc2VxX1BhcGVyL0ZpZ19nZG5hX3ByaW1pbmcvYW5hbHlzaXMvY291bnRfaW50ZXJnZW5pYy9jb3VudF9pbnRlcmdlbmljX2Z1bmN0aW9ucy5SIikKCm91dGRpcjwtIi9kYXRhL3NoYXJlL2h0cC9wcmltZS1zZXFfUGFwZXIvRmlnX2dkbmFfcHJpbWluZy96VU1Jcy8iCgpndGY8LSIvZGF0YS9zaGFyZS9odHAvcHJpbWUtc2VxX1BhcGVyL2dlbm9tZXMvSHNhcE1tdXMvZ2VuY29kZS52MzUudk0yNS5wcmltYXJ5X2Fzc2VtYmx5LmFubm90YXRpb24uZ3RmIgogIAogIAogIHR4ZGIgPC0gc3VwcHJlc3NXYXJuaW5ncyhzdXBwcmVzc01lc3NhZ2VzKEdlbm9taWNGZWF0dXJlczo6bWFrZVR4RGJGcm9tR0ZGKGZpbGU9Z3RmLCBmb3JtYXQ9Imd0ZiIpKSkKCiAgCiAgIyMgTWFrZSBHZW5lLXJhbmdlIEdSLW9iamVjdAogIHNlIDwtIHN1cHByZXNzTWVzc2FnZXMoCiAgICBBbm5vdGF0aW9uRGJpOjpzZWxlY3QodHhkYiwga2V5cyh0eGRiLCAiR0VORUlEIiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbHVtbnM9YygiR0VORUlEIiwiVFhDSFJPTSIsIlRYU1RBUlQiLCJUWEVORCIsIlRYU1RSQU5EIiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleXR5cGU9IkdFTkVJRCIpICU+JQogICAgZHBseXI6Omdyb3VwX2J5KEdFTkVJRCxUWENIUk9NLFRYU1RSQU5EKSAgJT4lCiAgICBkcGx5cjo6bXV0YXRlKCB0eHN0YXJ0ID1pZmVsc2UoVFhTVEFSVDxUWEVORCxtaW4oVFhTVEFSVCksbWluKFRYRU5EKSksCiAgICAgICAgICAgICAgICAgICB0eGVuZCAgPWlmZWxzZShUWFNUQVJUPFRYRU5ELG1heChUWEVORCksbWluKFRYU1RBUlQpICkgKSAlPiUKICAgIGRwbHlyOjpzZWxlY3QoR0VORUlELFRYQ0hST00sVFhTVFJBTkQsdHhzdGFydCx0eGVuZCkgICU+JSB1bmlxdWUoKQogICAgKQoKICBnci5nZW5lPC1HZW5vbWljUmFuZ2VzOjpHUmFuZ2VzKHNlcW5hbWVzID0gc2UkVFhDSFJPTSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhbmdlcyA9ICBJUmFuZ2VzKHN0YXJ0PSBzZSR0eHN0YXJ0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5kPSAgc2UkdHhlbmQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lcz1zZSRHRU5FSUQpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyYW5kID0gIHNlJFRYU1RSQU5ELAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2lkICAgID0gIHNlJEdFTkVJRCkKCiAgIyMjIEdldCBub24tb3ZlcmxhcHBpbmcgSW50cm9ucy9FeG9ucwogIGludHJvbjwtR2Vub21pY0ZlYXR1cmVzOjppbnRyb25zQnlUcmFuc2NyaXB0KHR4ZGIsIHVzZS5uYW1lcz1UKQogIGV4b248LUdlbm9taWNGZWF0dXJlczo6ZXhvbnNCeSh0eGRiLCBieT0idHgiLHVzZS5uYW1lcz1UKQoKICBpbnRyb24uZXhvbi5yZWQgPC0gYyggR2Vub21pY1Jhbmdlczo6cmVkdWNlKHVubGlzdChpbnRyb24pLGlnbm9yZS5zdHJhbmQ9VCksIEdlbm9taWNSYW5nZXM6OnJlZHVjZSh1bmxpc3QoZXhvbiksaWdub3JlLnN0cmFuZD1UKSApCiAgaW50cm9uLmV4b24uZGlzIDwtIEdlbm9taWNSYW5nZXM6OmRpc2pvaW4oaW50cm9uLmV4b24ucmVkLCBpZ25vcmUuc3RyYW5kPVQpCiAgaW50cm9uLm9ubHk8LUdlbm9taWNSYW5nZXM6OnNldGRpZmYoaW50cm9uLmV4b24uZGlzLCB1bmxpc3QoZXhvbikgLGlnbm9yZS5zdHJhbmQ9VCkKICBpbnRlcmdlbmljLm9ubHk8LWdhcHMoaW50cm9uLmV4b24uZGlzKQogIAogIG9sLmluPC1HZW5vbWljUmFuZ2VzOjpmaW5kT3ZlcmxhcHMoaW50cm9uLm9ubHksIGdyLmdlbmUsIHNlbGVjdD0iYXJiaXRyYXJ5IikKICBvbC5leDwtR2Vub21pY1Jhbmdlczo6ZmluZE92ZXJsYXBzKHVubGlzdChleG9uKSwgZ3IuZ2VuZSwgc2VsZWN0PSJhcmJpdHJhcnkiKQogIG9sLmlnPC1HZW5vbWljUmFuZ2VzOjpmaW5kT3ZlcmxhcHMoaW50ZXJnZW5pYy5vbmx5LCBnci5nZW5lLCBzZWxlY3Q9ImFyYml0cmFyeSIpCgogIGludHJvbi5zYWY8LWRhdGEuZnJhbWUoR2VuZUlEPSBuYW1lcyhnci5nZW5lKVtvbC5pbl0sCiAgICAgICAgICAgICAgICAgICAgICAgICBDaHIgICA9IHNlcW5hbWVzKGludHJvbi5vbmx5KSwKICAgICAgICAgICAgICAgICAgICAgICAgIFN0YXJ0ID0gc3RhcnQoaW50cm9uLm9ubHkpLAogICAgICAgICAgICAgICAgICAgICAgICAgRW5kCSA9ICAgZW5kKGludHJvbi5vbmx5KSxzdHJpbmdzQXNGYWN0b3JzID0gRikKICBleG9uLnNhZjwtZGF0YS5mcmFtZShHZW5lSUQ9IG5hbWVzKGdyLmdlbmUpW29sLmV4XSwKICAgICAgICAgICAgICAgICAgICAgICBDaHIgICA9IHNlcW5hbWVzKHVubGlzdChleG9uKSksCiAgICAgICAgICAgICAgICAgICAgICAgU3RhcnQgPSBzdGFydCh1bmxpc3QoZXhvbikpLAogICAgICAgICAgICAgICAgICAgICAgIEVuZAkgPSAgIGVuZCh1bmxpc3QoZXhvbikpLAogICAgICAgICAgICAgICAgICAgICAgIFN0cmFuZCA9ICBzdHJhbmQodW5saXN0KGV4b24pKSxzdHJpbmdzQXNGYWN0b3JzID0gRikKCiAgaW50ZXJnZW5pYy5zYWY8LWRhdGEuZnJhbWUoR2VuZUlEPSBzZXFuYW1lcyhpbnRlcmdlbmljLm9ubHkpLAogICAgICAgICAgICAgICAgICAgICAgIENociAgID0gc2VxbmFtZXMoaW50ZXJnZW5pYy5vbmx5KSwKICAgICAgICAgICAgICAgICAgICAgICBTdGFydCA9IHN0YXJ0KGludGVyZ2VuaWMub25seSksCiAgICAgICAgICAgICAgICAgICAgICAgRW5kCSA9ICAgZW5kKGludGVyZ2VuaWMub25seSksCiAgICAgICAgICAgICAgICAgICAgICAgU3RyYW5kID0gcmVwKCIrIix0aW1lcz1sZW5ndGgoaW50ZXJnZW5pYy5vbmx5KSksCiAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nc0FzRmFjdG9ycyA9IEYpCiAgCiAgaW50ZXJnZW5pYy5zYWY8LXJiaW5kKGludGVyZ2VuaWMuc2FmLGRhdGEuZnJhbWUoR2VuZUlEPSBzZXFuYW1lcyhpbnRlcmdlbmljLm9ubHkpLAogICAgICAgICAgICAgICAgICAgICAgIENociAgID0gc2VxbmFtZXMoaW50ZXJnZW5pYy5vbmx5KSwKICAgICAgICAgICAgICAgICAgICAgICBTdGFydCA9IHN0YXJ0KGludGVyZ2VuaWMub25seSksCiAgICAgICAgICAgICAgICAgICAgICAgRW5kCSA9ICAgZW5kKGludGVyZ2VuaWMub25seSksCiAgICAgICAgICAgICAgICAgICAgICAgU3RyYW5kID0gcmVwKCItIix0aW1lcz1sZW5ndGgoaW50ZXJnZW5pYy5vbmx5KSksCiAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nc0FzRmFjdG9ycyA9IEYpKQogIAogIGludHJvbi5zYWY8LWRwbHlyOjpsZWZ0X2pvaW4oaW50cm9uLnNhZix1bmlxdWUoZXhvbi5zYWZbLGMoIkdlbmVJRCIsIlN0cmFuZCIpXSksYnk9YygiR2VuZUlEIikpCiAgCgogIAoKICBzYWYgPC0gbGlzdChpbnRyb25zPXVuaXF1ZShpbnRyb24uc2FmKSxleG9ucz11bmlxdWUoZXhvbi5zYWYpLGludGVyZ2VuaWM9dW5pcXVlKGludGVyZ2VuaWMuc2FmKSkKICAKc2F2ZVJEUyhzYWYsIGZpbGU9Ii9kYXRhL3NoYXJlL2h0cC9wcmltZS1zZXFfUGFwZXIvRmlnX2dkbmFfcHJpbWluZy9hbmFseXNpcy9jb3VudF9pbnRlcmdlbmljL2luZXhfaW50ZXJnZW5pYy5zYWYuUkRTIikKYGBgCgoKYGBge3J9CgpzYWY8LXJlYWRSRFMoZmlsZT0iL2RhdGEvc2hhcmUvaHRwL3ByaW1lLXNlcV9QYXBlci9GaWdfZ2RuYV9wcmltaW5nL2FuYWx5c2lzL2NvdW50X2ludGVyZ2VuaWMvaW5leF9pbnRlcmdlbmljLnNhZi5SRFMiKQojIyMgT2sgbm93IGxldCdzIHRyeSB0byBjb3VudCAKCnByb2plY3Q8LSBjKCJyZXAxIiwicmVwMiIsInJlcDMiKQoKYWJhbWZpbGU8LWMocGFzdGUwKCIvZGF0YS9zaGFyZS9odHAvcHJpbWUtc2VxX1BhcGVyL0ZpZ19nZG5hX3ByaW1pbmcvelVNSXMvIixwcm9qZWN0WzFdLCJfbm9NdWx0aS9CdWxrX29wdF9nRE5BX3ByaW1pbmdfIixwcm9qZWN0WzFdLCIuZmlsdGVyZWQudGFnZ2VkLkFsaWduZWQub3V0LmJhbSIpLAogICAgICAgICAgIHBhc3RlMCgiL2RhdGEvc2hhcmUvaHRwL3ByaW1lLXNlcV9QYXBlci9GaWdfZ2RuYV9wcmltaW5nL3pVTUlzLyIscHJvamVjdFsyXSwiX25vTXVsdGkvQnVsa19vcHRfZ0ROQV9wcmltaW5nXyIscHJvamVjdFsyXSwiLmZpbHRlcmVkLnRhZ2dlZC5BbGlnbmVkLm91dC5iYW0iKSwKICAgICAgICAgICBwYXN0ZTAoIi9kYXRhL3NoYXJlL2h0cC9wcmltZS1zZXFfUGFwZXIvRmlnX2dkbmFfcHJpbWluZy96VU1Jcy8iLHByb2plY3RbM10sIl9ub011bHRpL0J1bGtfb3B0X2dETkFfcHJpbWluZ18iLHByb2plY3RbM10sIi5maWx0ZXJlZC50YWdnZWQuQWxpZ25lZC5vdXQuYmFtIikKICAgICAgICAgICAgKSAgCgpmb3IgKGkgaW4gMTozKSB7CmZuZXg8LS5ydW5GZWF0dXJlQ291bnQoYWJhbWZpbGVbaV0sCiAgICAgICAgICAgICAgICAgICAgICAgc2FmPXNhZiRleG9ucywKICAgICAgICAgICAgICAgICAgICAgICBzdHJhbmQ9MSwKICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJleCIsCiAgICAgICAgICAgICAgICAgICAgICAgcHJpbWFyeU9ubHkgPSBGLAogICAgICAgICAgICAgICAgICAgICAgIGNwdSA9IDEwLAogICAgICAgICAgICAgICAgICAgICAgIG1lbSA9IDc1LAogICAgICAgICAgICAgICAgICAgICAgIG91dGRpcj1wYXN0ZTAob3V0ZGlyLHByb2plY3RbaV0pKQpmZmlsZXM8LWZuZXgKCmZuaW4gIDwtLnJ1bkZlYXR1cmVDb3VudChhYmFtZmlsZVtpXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgc2FmPXNhZiRpbnRyb25zLAogICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJhbmQ9MSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0iaW4iLAogICAgICAgICAgICAgICAgICAgICAgICAgICBwcmltYXJ5T25seSA9IEYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGNwdSA9IDEwLAogICAgICAgICAgICAgICAgICAgICAgICAgICBtZW0gPSA3NSwKICAgICAgICAgICAgICAgICAgICAgICAgIG91dGRpcj1wYXN0ZTAob3V0ZGlyLHByb2plY3RbaV0pKQoKZmZpbGVzPC1jKGZmaWxlcyxmbmluKQoKZm5pbnRlciAgPC0ucnVuRmVhdHVyZUNvdW50KGFiYW1maWxlW2ldLAogICAgICAgICAgICAgICAgICAgICAgICAgICBzYWY9c2FmJGludGVyZ2VuaWMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmFuZD0xLAogICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJpbnRlciIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW1hcnlPbmx5ID0gRiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgY3B1ID0gMTAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lbSA9IDc1LAogICAgICAgICAgICAgICAgICAgICAgIG91dGRpcj1wYXN0ZTAob3V0ZGlyLHByb2plY3RbaV0pKQoKZmZpbGVzPC1jKGZmaWxlcyxmbmludGVyKQoKc3lzdGVtKHBhc3RlMCgiZm9yIGkgaW4gIixwYXN0ZShmZmlsZXMsY29sbGFwc2U9IiAiKSwiIDsgZG8gc2FtdG9vbHMgc29ydCAtbiAtTyAnQkFNJyAtQCAiLHJvdW5kKDEwLzIsMCksIiAtbSAxNUcgLW8gJGkgJGkudG1wICYgZG9uZSA7IHdhaXQiKSkKc3lzdGVtKHBhc3RlKCJybSIscGFzdGUwKGZmaWxlcywiLnRtcCIsY29sbGFwc2U9IiAiKSkpCn0KCgpgYGAKCmBgYHtyfQoKI2dldCBJbnRlcmdlbmljIHJlYWRzIGZyb20gelVNSXMtc3RhdHMyLlIKZ3RmMjwtIi9kYXRhL3NoYXJlL2h0cC9wcmltZS1zZXFfUGFwZXIvRmlnX2dkbmFfcHJpbWluZy96VU1Jcy9yZXAxL0J1bGtfb3B0X2dETkFfcHJpbWluZ19yZXAxLmZpbmFsX2Fubm90Lmd0ZiIKdXNlcl9zZXE8LSBnZXRVc2VyU2VxKGd0ZjIpIApzcGVjX3NlcTwtIGdldFNwZWNpZXMoZ3RmMikKCiMjIyMKYmNiPC1jKCIvZGF0YS9zaGFyZS9odHAvcHJpbWUtc2VxX1BhcGVyL0ZpZ19nZG5hX3ByaW1pbmcvelVNSXMvcmVwMS96VU1Jc19vdXRwdXQvQnVsa19vcHRfZ0ROQV9wcmltaW5nX3JlcDFrZXB0X2JhcmNvZGVzX2Jpbm5lZC50eHQiLAogICAgICAgIi9kYXRhL3NoYXJlL2h0cC9wcmltZS1zZXFfUGFwZXIvRmlnX2dkbmFfcHJpbWluZy96VU1Jcy9yZXAyL3pVTUlzX291dHB1dC9CdWxrX29wdF9nRE5BX3ByaW1pbmdfcmVwMmtlcHRfYmFyY29kZXNfYmlubmVkLnR4dCIsCiAgICAgICAiL2RhdGEvc2hhcmUvaHRwL3ByaW1lLXNlcV9QYXBlci9GaWdfZ2RuYV9wcmltaW5nL3pVTUlzL3JlcDMvelVNSXNfb3V0cHV0L0J1bGtfb3B0X2dETkFfcHJpbWluZ19yZXAza2VwdF9iYXJjb2Rlc19iaW5uZWQudHh0IikKCkJDc3RhdHM8LWMoIi9kYXRhL3NoYXJlL2h0cC9wcmltZS1zZXFfUGFwZXIvRmlnX2dkbmFfcHJpbWluZy96VU1Jcy9yZXAxL0J1bGtfb3B0X2dETkFfcHJpbWluZ19yZXAxLkJDc3RhdHMudHh0IiwKICAgICAgICAgICAiL2RhdGEvc2hhcmUvaHRwL3ByaW1lLXNlcV9QYXBlci9GaWdfZ2RuYV9wcmltaW5nL3pVTUlzL3JlcDIvQnVsa19vcHRfZ0ROQV9wcmltaW5nX3JlcDIuQkNzdGF0cy50eHQiLAogICAgICAgICAgICIvZGF0YS9zaGFyZS9odHAvcHJpbWUtc2VxX1BhcGVyL0ZpZ19nZG5hX3ByaW1pbmcvelVNSXMvcmVwMy9CdWxrX29wdF9nRE5BX3ByaW1pbmdfcmVwMy5CQ3N0YXRzLnR4dCIpCgprYmM8LWMoIi9kYXRhL3NoYXJlL2h0cC9wcmltZS1zZXFfUGFwZXIvRmlnX2dkbmFfcHJpbWluZy96VU1Jcy9yZXAxL3pVTUlzX291dHB1dC9CdWxrX29wdF9nRE5BX3ByaW1pbmdfcmVwMWtlcHRfYmFyY29kZXMudHh0IiwKICAgICAgICIvZGF0YS9zaGFyZS9odHAvcHJpbWUtc2VxX1BhcGVyL0ZpZ19nZG5hX3ByaW1pbmcvelVNSXMvcmVwMi96VU1Jc19vdXRwdXQvQnVsa19vcHRfZ0ROQV9wcmltaW5nX3JlcDJrZXB0X2JhcmNvZGVzLnR4dCIsCiAgICAgICAiL2RhdGEvc2hhcmUvaHRwL3ByaW1lLXNlcV9QYXBlci9GaWdfZ2RuYV9wcmltaW5nL3pVTUlzL3JlcDMvelVNSXNfb3V0cHV0L0J1bGtfb3B0X2dETkFfcHJpbWluZ19yZXAza2VwdF9iYXJjb2Rlcy50eHQiKQoKZm9yIChpIGluIDE6Myl7CiAgYmNjb3VudDwtZnJlYWQoYmNiW2ldKQoKYmNjb3VudDwtc3BsaXRSRyhiY2NvdW50PWJjY291bnQsIG1lbT0gNzUscmVhZF9sYXlvdXQgPSAiU0UiKQoKYmlubWFwIDwtIEJDYmluKGJjY291bnRfZmlsZSA9QkNzdGF0c1tpXSwKICAgICAgICAgICAgICAgICAgYmNfZGV0ZWN0ZWQgID0gYmNjb3VudCwKICAgICAgICAgICAgICAgIG5SZWFkc3BlckNlbGwgPSAxMDAsCiAgICAgICAgICAgICAgICBudGhyZWFkID0gMTAsCiAgICAgICAgICAgICAgICBCYXJjb2RlQmlubmluZyA9IDIpCgojIHNhbW91dHMgPC0gcHJlcF9zYW10b29scyhmZWF0ZmlsZXMgPSBmZmlsZXMsCiMgICAgICAgICAgICAgICAgICAgICAgICAgIGJjY291bnQgICA9IGJjY291bnQsCiMgICAgICAgICAgICAgICAgICAgICAgICAgIGNvcmVzICAgICA9IDEwLAojICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9qZWN0ID0gcHJvamVjdFsxXSwKIyAgICAgICAgICAgICAgICAgICAgICAgICAgQmFyY29kZUJpbm5pbmcgPSAyLAojICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRkaXI9b3V0ZGlyKQoKCmJjPC1kYXRhLnRhYmxlOjpmcmVhZChrYmNbaV0sc2VsZWN0ID0gMSwgaGVhZGVyID0gVCkKCmZlYXRmaWxlX3ZlY3RvciA8LSBjKHBhc3RlMChvdXRkaXIscHJvamVjdFtpXSwiL0J1bGtfb3B0X2dETkFfcHJpbWluZ18iLHByb2plY3RbaV0sIi5maWx0ZXJlZC50YWdnZWQuQWxpZ25lZC5vdXQuYmFtLmV4LmZlYXR1cmVDb3VudHMuYmFtIiksCiAgICAgICAgICAgICAgICAgICAgICAgcGFzdGUwKG91dGRpcixwcm9qZWN0W2ldLCIvQnVsa19vcHRfZ0ROQV9wcmltaW5nXyIscHJvamVjdFtpXSwiLmZpbHRlcmVkLnRhZ2dlZC5BbGlnbmVkLm91dC5iYW0uaW4uZmVhdHVyZUNvdW50cy5iYW0iKSwKICAgICAgICAgICAgICAgICAgICAgICBwYXN0ZTAob3V0ZGlyLHByb2plY3RbaV0sIi9CdWxrX29wdF9nRE5BX3ByaW1pbmdfIixwcm9qZWN0W2ldLCIuZmlsdGVyZWQudGFnZ2VkLkFsaWduZWQub3V0LmJhbS5pbnRlci5mZWF0dXJlQ291bnRzLmJhbSIpKQoKdHlwZUNvdW50IDwtIHN1bXN0YXRCQU0oIGZlYXRmaWxlcyA9IGZlYXRmaWxlX3ZlY3RvciwKICAgICAgICAgICAgICAgICAgICAgICAgIGNvcmVzID0gMTAsCiAgICAgICAgICAgICAgICAgICAgICAgICBvdXRkaXI9IG91dGRpciwKICAgICAgICAgICAgICAgICAgICAgICAgIHVzZXJfc2VxID0gdXNlcl9zZXEsCiAgICAgICAgICAgICAgICAgICAgICAgICBiYyA9IGJjLAogICAgICAgICAgICAgICAgICAgICAgICAgb3V0ZmlsZSA9IHBhc3RlMChvdXRkaXIscHJvamVjdFtpXSwiLmJjLlJFQURjb3VudHMucmRzIiksCiAgICAgICAgICAgICAgICAgICAgICAgICBCQ3N0YXRzID0gQkNzdGF0c1tpXSwKICAgICAgICAgICAgICAgICAgICAgICAgIG5SZWFkc3BlckNlbGwgPSAxMDAsCiAgICAgICAgICAgICAgICAgICAgICAgICBtZW1fbGltaXQgPSA3NSwKICAgICAgICAgICAgICAgICAgICAgICAgIGJjY291bnQgPSBiY2NvdW50LAogICAgICAgICAgICAgICAgICAgICAgICAgcHJvamVjdCA9IHByb2plY3RbaV0sCiAgICAgICAgICAgICAgICAgICAgICAgICBCYXJjb2RlQmlubmluZyA9IDIsCiAgICAgICAgICAgICAgICAgICAgICAgICBtZW0gPSA3NSwKICAgICAgICAgICAgICAgICAgICAgICAgIHJlYWRfbGF5b3V0ID0gIlNFIiwKICAgICAgICAgICAgICAgICAgICAgICAgIHNwZWNfc2VxID0gc3BlY19zZXEsCiAgICAgICAgICAgICAgICAgICAgICAgICBiaW5tYXA9YmlubWFwKQoKdGM8LWRhdGEuZnJhbWUodHlwZUNvdW50KQp0YyR0eXBlPC1mYWN0b3IodGMkdHlwZSwgbGV2ZWxzPXJldihjKCJFeG9uIiwiSW50cm9uIiwiSW50ZXJnZW5pY19tb3VzZSIsIkludGVyZ2VuaWNfaHVtYW4iLCJJbnRlcmdlbmljIiwiQW1iaWd1aXR5IiwiVW5tYXBwZWQiLCJVc2VyIikpKQp3cml0ZS50YWJsZSh0YyxmaWxlID0gcGFzdGUob3V0ZGlyLHByb2plY3RbaV0sIi5yZWFkc3BlcmNlbGwudHh0IixzZXA9IiIpLHNlcD0iXHQiLHJvdy5uYW1lcyA9IEYsY29sLm5hbWVzID0gVCkKfQoKYGBg