1 TNSeq of S. agalactiae and 3 concentrations of calprotectin.

This worksheet aims to lay out the tasks I performed when analyzing some TNSeq data of a group B streptococcus.

2 Three concentrations of calprotectin (none, 60, and 480 – is this [mM], mg/mL, or what?)

It looks to me, that despite the oddities in processing the raw reads, there is nice coverage and some obviously essential genes. The next question: did any change status as more calprotectin was added?

3 Grab annotation data for Streptococcus agalactiae.

The ID for strain a909 at microbesonline.org is: 205921.

Let us load up annotations from my gff file along with the microbesonline.

As a heads up, the count tables are using IDs which look like: SAK_RS00185. This appears to be the ‘sysName’ column from microbesonline and the locus_tag column from the gff annotations. In addition, there are a bunch of unused columns in both data sets which we likely want to prune.

Ahh, that is incorrect, the microbesonline ‘sysName’ is the same as ‘old_locus_tag’ column.

There are three relatively closely related strains which may be sufficiently similar to use in this analysis. The actual strain is cjb111, but that has not yet been quite finished, as far as I can tell. Therefore I will repeat most(all?) tasks with strains a909 and vr2603 to see if they may be more useful.

3.1 Strain a909

a909_microbes <- load_microbesonline_annotations(species="A909")
## Found 1 entry.
## Streptococcus agalactiae A909Firmicutesyes2006-01-18yes102136205921
## The species being downloaded is: Streptococcus agalactiae A909
## Downloading: http://www.microbesonline.org/cgi-bin/genomeInfo.cgi?tId=205921;export=tab
a909_gff <- load_gff_annotations("reference/sagalactiae_a909_all.gff")
## Trying attempt: rtracklayer::import.gff3(gff, sequenceRegionsAsSeqinfo=TRUE)
## Trying attempt: rtracklayer::import.gff3(gff, sequenceRegionsAsSeqinfo=FALSE)
## Had a successful gff import with rtracklayer::import.gff3(gff, sequenceRegionsAsSeqinfo=FALSE)
## Returning a df with 34 columns and 4426 rows.
a909_microbes <- as.data.frame(a909_microbes)
rownames(a909_gff) <- make.names(a909_gff[["locus_tag"]], unique=TRUE)
## I am going to only pay attention to the first annotation for each locus tag from microbesonline.
a909_microbes[["sysName"]] <- make.names(a909_microbes[["sysName"]], unique=TRUE)
a909_annot <- merge(a909_gff, a909_microbes, by.x="old_locus_tag", by.y="sysName")
rownames(a909_annot) <- make.names(a909_annot[["locus_tag"]], unique=TRUE)
## Rename the merged start/strand columns
colnames(a909_annot)[3] <- "start"
colnames(a909_annot)[6] <- "strand"
## And drop the duplicates
a909_annot[, c(39, 41)] <- NULL

3.2 Strain cjb111

cjb111_microbes <- load_microbesonline_annotations(species="CJB111")
## Found 1 entry.
## Streptococcus agalactiae CJB111Firmicutesyes2007-05-08noNANA2208342617
## The species being downloaded is: Streptococcus agalactiae CJB111
## Downloading: http://www.microbesonline.org/cgi-bin/genomeInfo.cgi?tId=342617;export=tab
cjb111_gff <- load_gff_annotations("reference/sagalactiae_cjb111.gff")
## Trying attempt: rtracklayer::import.gff3(gff, sequenceRegionsAsSeqinfo=TRUE)
## Trying attempt: rtracklayer::import.gff3(gff, sequenceRegionsAsSeqinfo=FALSE)
## Had a successful gff import with rtracklayer::import.gff3(gff, sequenceRegionsAsSeqinfo=FALSE)
## Returning a df with 14 columns and 2208 rows.
cjb111_microbes <- as.data.frame(cjb111_microbes)
rownames(cjb111_gff) <- make.names(cjb111_gff[["locus_tag"]], unique=TRUE)
## I am going to only pay attention to the first annotation for each locus tag from microbesonline.
cjb111_microbes[["sysName"]] <- make.names(cjb111_microbes[["sysName"]], unique=TRUE)
cjb111_annot <- merge(cjb111_gff, cjb111_microbes, by.x="locus_tag", by.y="sysName")
rownames(cjb111_annot) <- make.names(cjb111_annot[["locus_tag"]], unique=TRUE)
## Rename the merged start/strand columns
colnames(cjb111_annot)[3] <- "start"
colnames(cjb111_annot)[6] <- "strand"
cjb111_annot[, c(19, 21)] <- NULL

3.3 Strain vr2603

I think this might actually be 2603vr, I get confused, and under a few specific circumstances R acts strange when things start with numbers.

vr2603_microbes <- load_microbesonline_annotations(species="2603V")
## Found 1 entry.
## Streptococcus agalactiae 2603V/RFirmicutesyesyes102273208435
## The species being downloaded is: Streptococcus agalactiae 2603V/R
## Downloading: http://www.microbesonline.org/cgi-bin/genomeInfo.cgi?tId=208435;export=tab
vr2603_gff <- load_gff_annotations("reference/sagalactiae_2603vr.gff")
## Trying attempt: rtracklayer::import.gff3(gff, sequenceRegionsAsSeqinfo=TRUE)
## Had a successful gff import with rtracklayer::import.gff3(gff, sequenceRegionsAsSeqinfo=TRUE)
## Returning a df with 28 columns and 4611 rows.
vr2603_microbes <- as.data.frame(vr2603_microbes)
rownames(vr2603_gff) <- make.names(vr2603_gff[["locus_tag"]], unique=TRUE)
## I am going to only pay attention to the first annotation for each locus tag from microbesonline.
vr2603_microbes[["sysName"]] <- make.names(vr2603_microbes[["sysName"]], unique=TRUE)
vr2603_annot <- merge(vr2603_gff, vr2603_microbes, by.x="locus_tag", by.y="sysName")
rownames(vr2603_annot) <- make.names(vr2603_annot[["ID"]], unique=TRUE)
## Rename the merged start/strand columns
colnames(vr2603_annot)[3] <- "start"
colnames(vr2603_annot)[6] <- "strand"
vr2603_annot[, c(33, 35)] <- NULL

4 Create Expressionsets

The following block merges the various counts, annotations, and experimental metadata.

Just as with the annotations, I will create one expressionset for each strain.

4.1 Strain a909

a909_expt <- create_expt(metadata="sample_sheets/sagalactiae_samples.xlsx",
                         batch=FALSE, gene_info=a909_annot, file_column="a909_filename")
## Reading the sample metadata.
## The sample definitions comprises: 9 rows(samples) and 30 columns(metadata fields).
## Reading count tables.
## Reading count files with read.table().
## /mnt/sshfs/cbcbsub01/fs/cbcb-lab/nelsayed/scratch/atb/tnseq/sagalacticae_2019/preprocessing/01/outputs/bowtie_sagalactiae_a909/trimmed_ca-v0M1.count.xz contains 2212 rows.
## preprocessing/02/outputs/bowtie_sagalactiae_a909/trimmed_ca-v0M1.count.xz contains 2212 rows and merges to 2212 rows.
## preprocessing/03/outputs/bowtie_sagalactiae_a909/trimmed_ca-v0M1.count.xz contains 2212 rows and merges to 2212 rows.
## preprocessing/04/outputs/bowtie_sagalactiae_a909/trimmed_ca-v0M1.count.xz contains 2212 rows and merges to 2212 rows.
## preprocessing/05/outputs/bowtie_sagalactiae_a909/trimmed_ca-v0M1.count.xz contains 2212 rows and merges to 2212 rows.
## preprocessing/06/outputs/bowtie_sagalactiae_a909/trimmed_ca-v0M1.count.xz contains 2212 rows and merges to 2212 rows.
## preprocessing/07/outputs/bowtie_sagalactiae_a909/trimmed_ca-v0M1.count.xz contains 2212 rows and merges to 2212 rows.
## preprocessing/08/outputs/bowtie_sagalactiae_a909/trimmed_ca-v0M1.count.xz contains 2212 rows and merges to 2212 rows.
## preprocessing/09/outputs/bowtie_sagalactiae_a909/trimmed_ca-v0M1.count.xz contains 2212 rows and merges to 2212 rows.
## Finished reading count data.
## Matched 2048 annotations and counts.
## Bringing together the count matrix and gene information.
## Some annotations were lost in merging, setting them to 'undefined'.
## Saving the expressionset to 'expt.rda'.
## The final expressionset has 2207 rows and 9 columns.
a909_written <- write_expt(a909_expt,
                           excel=glue::glue("excel/{rundate}-a909_counts-v{ver}.xlsx"))
## Writing the first sheet, containing a legend and some summary data.
## Writing the raw reads.
## Graphing the raw reads.
## `geom_smooth()` using formula 'y ~ x'
## `geom_smooth()` using formula 'y ~ x'
## Warning in doTryCatch(return(expr), name, parentenv, handler): display list
## redraw incomplete

## Warning in doTryCatch(return(expr), name, parentenv, handler): display list
## redraw incomplete
## Attempting mixed linear model with: ~  (1|condition) + (1|batch)
## Fitting the expressionset to the model, this is slow.
## Dividing work into 100 chunks...
## Error in serialize(data, node$con, xdr = FALSE) : 
##   error writing to connection
## A couple of common errors:
## An error like 'vtv downdated' may be because there are too many 0s, filter the data and rerun.
## An error like 'number of levels of each grouping factor must be < number of observations' means
## that the factor used is not appropriate for the analysis - it really only works for factors
## which are shared among multiple samples.
## Retrying with only condition in the model.
## Loading required package: Matrix
## 
## Total:10 s
## Placing factor: condition at the beginning of the model.
## Writing the normalized reads.
## Graphing the normalized reads.
## `geom_smooth()` using formula 'y ~ x'
## `geom_smooth()` using formula 'y ~ x'
## Warning in doTryCatch(return(expr), name, parentenv, handler): display list
## redraw incomplete

## Warning in doTryCatch(return(expr), name, parentenv, handler): display list
## redraw incomplete
## Attempting mixed linear model with: ~  (1|condition) + (1|batch)
## Fitting the expressionset to the model, this is slow.
## Dividing work into 100 chunks...
## Error in serialize(data, node$con, xdr = FALSE) : 
##   error writing to connection
## A couple of common errors:
## An error like 'vtv downdated' may be because there are too many 0s, filter the data and rerun.
## An error like 'number of levels of each grouping factor must be < number of observations' means
## that the factor used is not appropriate for the analysis - it really only works for factors
## which are shared among multiple samples.
## Retrying with only condition in the model.
## 
## Total:9 s
## Placing factor: condition at the beginning of the model.
## Writing the median reads by factor.

4.2 Strain cjb111

cjb111_expt <- create_expt(metadata="sample_sheets/sagalactiae_samples.xlsx",
                           gene_info=cjb111_annot, file_column="cjb111_filename")
## Reading the sample metadata.
## The sample definitions comprises: 9 rows(samples) and 30 columns(metadata fields).
## Reading count tables.
## Reading count files with read.table().
## /mnt/sshfs/cbcbsub01/fs/cbcb-lab/nelsayed/scratch/atb/tnseq/sagalacticae_2019/preprocessing/01/outputs/bowtie_sagalactiae_cjb111/trimmed_ca-v0M1.count.xz contains 2213 rows.
## preprocessing/02/outputs/bowtie_sagalactiae_cjb111/trimmed_ca-v0M1.count.xz contains 2213 rows and merges to 2213 rows.
## preprocessing/03/outputs/bowtie_sagalactiae_cjb111/trimmed_ca-v0M1.count.xz contains 2213 rows and merges to 2213 rows.
## preprocessing/04/outputs/bowtie_sagalactiae_cjb111/trimmed_ca-v0M1.count.xz contains 2213 rows and merges to 2213 rows.
## preprocessing/05/outputs/bowtie_sagalactiae_cjb111/trimmed_ca-v0M1.count.xz contains 2213 rows and merges to 2213 rows.
## preprocessing/06/outputs/bowtie_sagalactiae_cjb111/trimmed_ca-v0M1.count.xz contains 2213 rows and merges to 2213 rows.
## preprocessing/07/outputs/bowtie_sagalactiae_cjb111/trimmed_ca-v0M1.count.xz contains 2213 rows and merges to 2213 rows.
## preprocessing/08/outputs/bowtie_sagalactiae_cjb111/trimmed_ca-v0M1.count.xz contains 2213 rows and merges to 2213 rows.
## preprocessing/09/outputs/bowtie_sagalactiae_cjb111/trimmed_ca-v0M1.count.xz contains 2213 rows and merges to 2213 rows.
## Finished reading count data.
## Matched 2208 annotations and counts.
## Bringing together the count matrix and gene information.
## Some annotations were lost in merging, setting them to 'undefined'.
## Saving the expressionset to 'expt.rda'.
## The final expressionset has 2208 rows and 9 columns.
cjb111_written <- write_expt(cjb111_expt,
                             excel=glue::glue("excel/{rundate}-cjb111_counts-v{ver}.xlsx"))
## Writing the first sheet, containing a legend and some summary data.
## Writing the raw reads.
## Graphing the raw reads.
## `geom_smooth()` using formula 'y ~ x'
## `geom_smooth()` using formula 'y ~ x'
## Warning in doTryCatch(return(expr), name, parentenv, handler): display list
## redraw incomplete

## Warning in doTryCatch(return(expr), name, parentenv, handler): display list
## redraw incomplete
## Attempting mixed linear model with: ~  (1|condition) + (1|batch)
## Fitting the expressionset to the model, this is slow.
## Dividing work into 100 chunks...
## Error in serialize(data, node$con, xdr = FALSE) : 
##   error writing to connection
## A couple of common errors:
## An error like 'vtv downdated' may be because there are too many 0s, filter the data and rerun.
## An error like 'number of levels of each grouping factor must be < number of observations' means
## that the factor used is not appropriate for the analysis - it really only works for factors
## which are shared among multiple samples.
## Retrying with only condition in the model.
## 
## Total:10 s
## Placing factor: condition at the beginning of the model.
## Writing the normalized reads.
## Graphing the normalized reads.
## `geom_smooth()` using formula 'y ~ x'
## `geom_smooth()` using formula 'y ~ x'
## Warning in doTryCatch(return(expr), name, parentenv, handler): display list
## redraw incomplete

## Warning in doTryCatch(return(expr), name, parentenv, handler): display list
## redraw incomplete
## Attempting mixed linear model with: ~  (1|condition) + (1|batch)
## Fitting the expressionset to the model, this is slow.
## Dividing work into 100 chunks...
## Error in serialize(data, node$con, xdr = FALSE) : 
##   error writing to connection
## A couple of common errors:
## An error like 'vtv downdated' may be because there are too many 0s, filter the data and rerun.
## An error like 'number of levels of each grouping factor must be < number of observations' means
## that the factor used is not appropriate for the analysis - it really only works for factors
## which are shared among multiple samples.
## Retrying with only condition in the model.
## 
## Total:10 s
## Placing factor: condition at the beginning of the model.
## Writing the median reads by factor.

4.3 Strain 2603vr

vr2603_expt <- create_expt(metadata="sample_sheets/sagalactiae_samples.xlsx",
                           gene_info=vr2603_annot, file_column="vr2603_filename")
## Reading the sample metadata.
## The sample definitions comprises: 9 rows(samples) and 30 columns(metadata fields).
## Reading count tables.
## Reading count files with read.table().
## /mnt/sshfs/cbcbsub01/fs/cbcb-lab/nelsayed/scratch/atb/tnseq/sagalacticae_2019/preprocessing/01/outputs/bowtie_sagalactiae_2603vr/trimmed_ca-v0M1.count.xz contains 2284 rows.
## preprocessing/02/outputs/bowtie_sagalactiae_2603vr/trimmed_ca-v0M1.count.xz contains 2284 rows and merges to 2284 rows.
## preprocessing/03/outputs/bowtie_sagalactiae_2603vr/trimmed_ca-v0M1.count.xz contains 2284 rows and merges to 2284 rows.
## preprocessing/04/outputs/bowtie_sagalactiae_2603vr/trimmed_ca-v0M1.count.xz contains 2284 rows and merges to 2284 rows.
## preprocessing/05/outputs/bowtie_sagalactiae_2603vr/trimmed_ca-v0M1.count.xz contains 2284 rows and merges to 2284 rows.
## preprocessing/06/outputs/bowtie_sagalactiae_2603vr/trimmed_ca-v0M1.count.xz contains 2284 rows and merges to 2284 rows.
## preprocessing/07/outputs/bowtie_sagalactiae_2603vr/trimmed_ca-v0M1.count.xz contains 2284 rows and merges to 2284 rows.
## preprocessing/08/outputs/bowtie_sagalactiae_2603vr/trimmed_ca-v0M1.count.xz contains 2284 rows and merges to 2284 rows.
## preprocessing/09/outputs/bowtie_sagalactiae_2603vr/trimmed_ca-v0M1.count.xz contains 2284 rows and merges to 2284 rows.
## Finished reading count data.
## Matched 2193 annotations and counts.
## Bringing together the count matrix and gene information.
## Some annotations were lost in merging, setting them to 'undefined'.
## Saving the expressionset to 'expt.rda'.
## The final expressionset has 2279 rows and 9 columns.
vr2603_written <- write_expt(vr2603_expt,
                             excel=glue::glue("excel/{rundate}-vr2603_counts-v{ver}.xlsx"))
## Writing the first sheet, containing a legend and some summary data.
## Writing the raw reads.
## Graphing the raw reads.
## `geom_smooth()` using formula 'y ~ x'
## `geom_smooth()` using formula 'y ~ x'
## Warning in doTryCatch(return(expr), name, parentenv, handler): display list
## redraw incomplete

## Warning in doTryCatch(return(expr), name, parentenv, handler): display list
## redraw incomplete
## Attempting mixed linear model with: ~  (1|condition) + (1|batch)
## Fitting the expressionset to the model, this is slow.
## Dividing work into 100 chunks...
## Error in serialize(data, node$con, xdr = FALSE) : 
##   error writing to connection
## A couple of common errors:
## An error like 'vtv downdated' may be because there are too many 0s, filter the data and rerun.
## An error like 'number of levels of each grouping factor must be < number of observations' means
## that the factor used is not appropriate for the analysis - it really only works for factors
## which are shared among multiple samples.
## Retrying with only condition in the model.
## 
## Total:11 s
## Placing factor: condition at the beginning of the model.
## Writing the normalized reads.
## Graphing the normalized reads.
## `geom_smooth()` using formula 'y ~ x'
## `geom_smooth()` using formula 'y ~ x'
## Warning in doTryCatch(return(expr), name, parentenv, handler): display list
## redraw incomplete

## Warning in doTryCatch(return(expr), name, parentenv, handler): display list
## redraw incomplete
## Attempting mixed linear model with: ~  (1|condition) + (1|batch)
## Fitting the expressionset to the model, this is slow.
## Dividing work into 100 chunks...
## Error in serialize(data, node$con, xdr = FALSE) : 
##   error writing to connection
## A couple of common errors:
## An error like 'vtv downdated' may be because there are too many 0s, filter the data and rerun.
## An error like 'number of levels of each grouping factor must be < number of observations' means
## that the factor used is not appropriate for the analysis - it really only works for factors
## which are shared among multiple samples.
## Retrying with only condition in the model.
## 
## Total:9 s
## Placing factor: condition at the beginning of the model.
## Writing the median reads by factor.

5 A Few diagnostic plots

5.1 Strain A909

a909_written[["legend_plot"]]

a909_written[["raw_libsize"]]

a909_written[["raw_density"]]

## awesome

a909_written[["norm_disheat"]]

a909_written[["norm_corheat"]]

a909_written[["norm_pca"]]

5.2 Strain CJB111

cjb111_written[["raw_libsize"]]

cjb111_written[["raw_density"]]

## awesome

cjb111_written[["norm_disheat"]]

cjb111_written[["norm_corheat"]]

cjb111_written[["norm_pca"]]

5.3 Strain 2603V/R

vr2603_written[["raw_libsize"]]

vr2603_written[["raw_density"]]

## awesome

vr2603_written[["norm_disheat"]]

vr2603_written[["norm_corheat"]]

vr2603_written[["norm_pca"]]

I think this looks reasonable, though it makes me slightly wonder if 04 and 09 are switched. But as long as we are willing to state that the primary difference is between calprotectin and control, then I would suggest against considering it. I think it is reasonable to assume the samples are not switched and this is just how they are. If however, the primary goal is to investigate changing concentrations of calprotectin, then I would want to check into this distribution of samples or make the statement that these two concentrations have no significant difference unless we get more samples to look at.

6 Check tnseq saturation

I moved this above the differential “expression”/“fitness” analysis so that we can add the results from it as annotation data to the DE tables if requested.

saturation_01 <- tnseq_saturation(
  "preprocessing/01/outputs/essentiality_sagalactiae_a909/trimmed_ca-v0M1.wig",
  adjust=2)
saturation_01$plot
saturation_01$hits_summary
ess_plts <- plot_essentiality(
  "preprocessing/01/outputs/essentiality_sagalactiae_a909/mh_ess-trimmed_ca-v0M1_gene_tas_m2.csv")
ess_plts[["zbar"]]

saturation_02 <- tnseq_saturation(
  "preprocessing/02/outputs/essentiality_sagalactiae_a909/trimmed_ca-v0M1.wig")
saturation_02$plot
saturation_02$hits_summary
ess_plts <- plot_essentiality(
  "preprocessing/02/outputs/essentiality_sagalactiae_a909/mh_ess-trimmed_ca-v0M1_gene_tas_m2.csv")
ess_plts[["zbar"]]

saturation_03 <- tnseq_saturation(
  "preprocessing/03/outputs/essentiality_sagalactiae_a909/trimmed_ca-v0M1.wig")
saturation_03$plot
saturation_03$hits_summary
ess_plts <- plot_essentiality(
  "preprocessing/03/outputs/essentiality_sagalactiae_a909/mh_ess-trimmed_ca-v0M1_gene_tas_m2.csv")
ess_plts[["zbar"]]

saturation_04 <- tnseq_saturation(
  "preprocessing/04/outputs/essentiality_sagalactiae_a909/trimmed_ca-v0M1.wig")
saturation_04$plot
saturation_04$hits_summary
ess_plts <- plot_essentiality(
  "preprocessing/04/outputs/essentiality_sagalactiae_a909/mh_ess-trimmed_ca-v0M1_gene_tas_m2.csv")
ess_plts[["zbar"]]

saturation_05 <- tnseq_saturation(
  "preprocessing/05/outputs/essentiality_sagalactiae_a909/trimmed_ca-v0M1.wig")
saturation_05$plot
saturation_05$hits_summary
ess_plts <- plot_essentiality(
  "preprocessing/06/outputs/essentiality_sagalactiae_a909/mh_ess-trimmed_ca-v0M1_gene_tas_m2.csv")
ess_plts[["zbar"]]

saturation_06 <- tnseq_saturation(
  "preprocessing/06/outputs/essentiality_sagalactiae_a909/trimmed_ca-v0M1.wig")
saturation_06$plot
saturation_06$hits_summary
ess_plts <- plot_essentiality(
  "preprocessing/06/outputs/essentiality_sagalactiae_a909/mh_ess-trimmed_ca-v0M1_gene_tas_m2.csv")
ess_plts[["zbar"]]

saturation_07 <- tnseq_saturation(
  "preprocessing/07/outputs/essentiality_sagalactiae_a909/trimmed_ca-v0M1.wig")
saturation_07$plot
saturation_07$hits_summary
ess_plts <- plot_essentiality(
  "preprocessing/07/outputs/essentiality_sagalactiae_a909/mh_ess-trimmed_ca-v0M1_gene_tas_m2.csv")
ess_plts[["zbar"]]

saturation_08 <- tnseq_saturation(
  "preprocessing/08/outputs/essentiality_sagalactiae_a909/trimmed_ca-v0M1.wig")
saturation_08$plot
saturation_08$hits_summary
ess_plts <- plot_essentiality(
  "preprocessing/08/outputs/essentiality_sagalactiae_a909/mh_ess-trimmed_ca-v0M1_gene_tas_m2.csv")
ess_plts[["zbar"]]

saturation_09 <- tnseq_saturation(
  "preprocessing/09/outputs/essentiality_sagalactiae_a909/trimmed_ca-v0M1.wig")
saturation_09$plot
saturation_09$hits_summary
ess_plts <- plot_essentiality(
  "preprocessing/09/outputs/essentiality_sagalactiae_a909/mh_ess-trimmed_ca-v0M1_gene_tas_m2.csv")
ess_plts[["zbar"]]

saturation_control <- tnseq_saturation(
    "preprocessing/combined_control/outputs/essentiality_sagalactiae_a909/trimmed_ca-v1m1.wig")
saturation_control$plot
ess_plts <- plot_essentiality(
    "preprocessing/combined_control/outputs/essentiality_sagalactiae_a909/mh_ess-trimmed_ca-v1m1_gene_tas_m2.csv")
ess_plts[["zbar"]]

plt <- sm(tnseq_multi_saturation(meta=pData(a909_expt), meta_column="a909esswig"))
plt$ggstats
plt <- tnseq_multi_saturation(meta=pData(cjb111_expt), meta_column="cjb111esswig")
## Registered S3 method overwritten by 'broom.mixed':
##   method      from 
##   tidy.gamlss broom
## Registered S3 methods overwritten by 'car':
##   method                          from
##   influence.merMod                lme4
##   cooks.distance.influence.merMod lme4
##   dfbeta.influence.merMod         lme4
##   dfbetas.influence.merMod        lme4
## Registered S3 method overwritten by 'DescTools':
##   method         from  
##   reorder.factor gplots
## Warning:  Number of labels is greater than default palette color count.
##  Try using another color `palette` (and/or `package`).
## 
plt[["plot"]] + ggplot2::scale_y_continuous(limits=c(0, 12000))
## Scale for 'y' is already present. Adding another scale for 'y', which will
## replace the existing scale.

## I expect the saturation of this to be a bit better than 2603V/R.

plt <- tnseq_multi_saturation(meta=pData(vr2603_expt), meta_column="vr2603esswig")
## Warning:  Number of labels is greater than default palette color count.
##  Try using another color `palette` (and/or `package`).
## 
plt[["plot"]] + ggplot2::scale_y_continuous(limits=c(0, 12000))
## Scale for 'y' is already present. Adding another scale for 'y', which will
## replace the existing scale.

## hmm this is not definitive.  It looks like cjb111 has more TAs with ~ 1 hit.
## but R/V has more hits with ~ 16<x<64 hits.

plt <- tnseq_multi_saturation(meta=pData(a909_expt), meta_column="a909esswig")
## Warning:  Number of labels is greater than default palette color count.
##  Try using another color `palette` (and/or `package`).
## 
plt[["plot"]] + ggplot2::scale_y_continuous(limits=c(0, 20000))
## Scale for 'y' is already present. Adding another scale for 'y', which will
## replace the existing scale.

## I am not quite sure how to interpret this one, we have much more discrete
## numbers of reads than the others.

7 Changed genes

For differential expression, I am going to assume until I hear otherwise, that my batch assignments are not correct and that the 1,2,3 assignments of the sample names do not actually delineate separate batches. Though, if they do delineate separate batches, it might be taken as a (very)small degree of evidence that 04 and 09 were switched.

7.1 Strain a909

combined_essentiality <- list(
  "control" = "preprocessing/combined_control/outputs/essentiality_sagalactiae_a909/mh_ess-trimmed_ca-v1m1_gene_tas_m2.csv",
  "low" = "preprocessing/combined_low/outputs/essentiality_sagalactiae_a909/mh_ess-trimmed_ca-v1m1_gene_tas_m2.csv",
  "high" = "preprocessing/combined_high/outputs/essentiality_sagalactiae_a909/mh_ess-trimmed_ca-v1m1_gene_tas_m2.csv",
  "previous" = "preprocessing/combined_previous/outputs/essentiality_sagalactiae_a909/mh_ess-combined_ca_ta-v0M1_gene_tas_m2.csv")
ess_table <- data.frame()
for (f in 1:length(combined_essentiality)) {
  name <- names(combined_essentiality)[f]
  column_names <- c("orf", "k", "n", "r", "s", "zbar", "call")
  names <- paste0(name, "_", column_names)
  r <- readr::read_tsv(combined_essentiality[[f]], comment="#", col_names=names)
  colnames(r)[1] <- "orf"
  if (f == 1) {
    ess_table <- r
  } else {
    ess_table <- merge(ess_table, r, by="orf")
  }
}
## 
## ── Column specification ────────────────────────────────────────────────────────
## cols(
##   control_orf = col_character(),
##   control_k = col_double(),
##   control_n = col_double(),
##   control_r = col_double(),
##   control_s = col_double(),
##   control_zbar = col_double(),
##   control_call = col_character()
## )
## 
## ── Column specification ────────────────────────────────────────────────────────
## cols(
##   low_orf = col_character(),
##   low_k = col_double(),
##   low_n = col_double(),
##   low_r = col_double(),
##   low_s = col_double(),
##   low_zbar = col_double(),
##   low_call = col_character()
## )
## 
## ── Column specification ────────────────────────────────────────────────────────
## cols(
##   high_orf = col_character(),
##   high_k = col_double(),
##   high_n = col_double(),
##   high_r = col_double(),
##   high_s = col_double(),
##   high_zbar = col_double(),
##   high_call = col_character()
## )
## 
## ── Column specification ────────────────────────────────────────────────────────
## cols(
##   previous_orf = col_character(),
##   previous_k = col_double(),
##   previous_n = col_double(),
##   previous_r = col_double(),
##   previous_s = col_double(),
##   previous_zbar = col_double(),
##   previous_call = col_character()
## )
rownames(ess_table) <- gsub(x=ess_table[["orf"]], pattern="^cds_", replacement="")
ess_table[["orf"]] <- NULL

a909_de <- all_pairwise(a909_expt, model_batch=FALSE, parallel=FALSE)
## Plotting a PCA before surrogate/batch inclusion.
## Not putting labels on the PC plot.
## Assuming no batch in model for testing pca.
## Not putting labels on the PC plot.
## Starting basic_pairwise().
## Starting basic pairwise comparison.
## Basic step 0/3: Filtering data.
## Basic step 0/3: Normalizing data.
## Basic step 0/3: Converting data.
## Basic step 0/3: Transforming data.
## Basic step 1/3: Creating mean and variance tables.
## Basic step 2/3: Performing 6 comparisons.
## Basic step 3/3: Creating faux DE Tables.
## Basic: Returning tables.
## Starting deseq_pairwise().
## Starting DESeq2 pairwise comparisons.
## The data should be suitable for EdgeR/DESeq/EBSeq. If they freak out, check the state of the count table and ensure that it is in integer counts.
## Choosing the non-intercept containing model.
## DESeq2 step 1/5: Including only condition in the deseq model.
## converting counts to integer mode
##   it appears that the last variable in the design formula, 'condition',
##   has a factor level, 'control', which is not the reference level. we recommend
##   to use factor(...,levels=...) or relevel() to set this as the reference level
##   before proceeding. for more information, please see the 'Note on factor levels'
##   in vignette('DESeq2').
##   it appears that the last variable in the design formula, 'condition',
##   has a factor level, 'control', which is not the reference level. we recommend
##   to use factor(...,levels=...) or relevel() to set this as the reference level
##   before proceeding. for more information, please see the 'Note on factor levels'
##   in vignette('DESeq2').
## DESeq2 step 2/5: Estimate size factors.
## DESeq2 step 3/5: Estimate dispersions.
## gene-wise dispersion estimates
## mean-dispersion relationship
## final dispersion estimates
## Using a parametric fitting seems to have worked.
## DESeq2 step 4/5: nbinomWaldTest.
## Starting ebseq_pairwise().
## The data should be suitable for EdgeR/DESeq/EBSeq. If they freak out, check the state of the count table and ensure that it is in integer counts.
## Starting EBSeq pairwise subset.
## Choosing the non-intercept containing model.
## Starting EBTest of cal_high vs. cal_low.
## Copying ppee values as ajusted p-values until I figure out how to deal with them.
## Starting EBTest of cal_high vs. control.
## Copying ppee values as ajusted p-values until I figure out how to deal with them.
## Starting EBTest of cal_low vs. control.
## Copying ppee values as ajusted p-values until I figure out how to deal with them.
## Starting edger_pairwise().
## Starting edgeR pairwise comparisons.
## The data should be suitable for EdgeR/DESeq/EBSeq. If they freak out, check the state of the count table and ensure that it is in integer counts.
## Choosing the non-intercept containing model.
## EdgeR step 1/9: Importing and normalizing data.
## EdgeR step 2/9: Estimating the common dispersion.
## EdgeR step 3/9: Estimating dispersion across genes.
## EdgeR step 4/9: Estimating GLM Common dispersion.
## EdgeR step 5/9: Estimating GLM Trended dispersion.
## EdgeR step 6/9: Estimating GLM Tagged dispersion.
## EdgeR step 7/9: Running glmFit, switch to glmQLFit by changing the argument 'edger_test'.
## EdgeR step 8/9: Making pairwise contrasts.

## Starting limma_pairwise().
## Starting limma pairwise comparison.
## libsize was not specified, this parameter has profound effects on limma's result.
## Using the libsize from expt$libsize.
## Limma step 1/6: choosing model.
## Choosing the non-intercept containing model.
## Limma step 2/6: running limma::voom(), switch with the argument 'which_voom'.
## Using normalize.method=quantile for voom.

## Limma step 3/6: running lmFit with method: ls.
## Limma step 4/6: making and fitting contrasts with no intercept. (~ 0 + factors)
## Limma step 5/6: Running eBayes with robust=FALSE and trend=FALSE.
## Limma step 6/6: Writing limma outputs.
## Limma step 6/6: 1/3: Creating table: cal_low_vs_cal_high.  Adjust=BH
## Limma step 6/6: 2/3: Creating table: control_vs_cal_high.  Adjust=BH
## Limma step 6/6: 3/3: Creating table: control_vs_cal_low.  Adjust=BH
## Limma step 6/6: 1/3: Creating table: cal_high.  Adjust=BH
## Limma step 6/6: 2/3: Creating table: cal_low.  Adjust=BH
## Limma step 6/6: 3/3: Creating table: control.  Adjust=BH
## Comparing analyses.
## Used reverse contrast for deseq.
## Warning in correlate_de_tables(results, annot_df = annot_df, extra_contrasts
## = extra_contrasts): The merge of limma, cal_low_vs_cal_high and deseq,
## cal_low_vs_cal_high failed.
## Used reverse contrast for deseq.
## Warning in correlate_de_tables(results, annot_df = annot_df, extra_contrasts
## = extra_contrasts): The merge of limma, control_vs_cal_high and deseq,
## control_vs_cal_high failed.
## Used reverse contrast for deseq.
## Warning in correlate_de_tables(results, annot_df = annot_df, extra_contrasts
## = extra_contrasts): The merge of limma, control_vs_cal_low and deseq,
## control_vs_cal_low failed.
## Used reverse contrast for edger.
## Warning in correlate_de_tables(results, annot_df = annot_df, extra_contrasts =
## extra_contrasts): The merge of deseq, cal_low_vs_cal_high=cal_low-cal_high, and
## edger, cal_low_vs_cal_high=cal_low-cal_high, failed.
## Used reverse contrast for edger.
## Warning in correlate_de_tables(results, annot_df = annot_df, extra_contrasts =
## extra_contrasts): The merge of deseq, control_vs_cal_high=control-cal_high, and
## edger, control_vs_cal_high=control-cal_high, failed.
## Used reverse contrast for edger.
## Warning in correlate_de_tables(results, annot_df = annot_df, extra_contrasts =
## extra_contrasts): The merge of deseq, control_vs_cal_low=control-cal_low, and
## edger, control_vs_cal_low=control-cal_low, failed.
## Used reverse contrast for ebseq.
## Warning in correlate_de_tables(results, annot_df = annot_df, extra_contrasts =
## extra_contrasts): The merge of deseq, cal_low_vs_cal_high=cal_low-cal_high, and
## ebseq, cal_low_vs_cal_high=cal_low-cal_high, failed.
## Used reverse contrast for ebseq.
## Warning in correlate_de_tables(results, annot_df = annot_df, extra_contrasts =
## extra_contrasts): The merge of deseq, control_vs_cal_high=control-cal_high, and
## ebseq, control_vs_cal_high=control-cal_high, failed.
## Used reverse contrast for ebseq.
## Warning in correlate_de_tables(results, annot_df = annot_df, extra_contrasts =
## extra_contrasts): The merge of deseq, control_vs_cal_low=control-cal_low, and
## ebseq, control_vs_cal_low=control-cal_low, failed.
## Used reverse contrast for basic.
## Warning in correlate_de_tables(results, annot_df = annot_df, extra_contrasts =
## extra_contrasts): The merge of deseq, cal_low_vs_cal_high=cal_low-cal_high, and
## basic, cal_low_vs_cal_high=cal_low-cal_high, failed.
## Used reverse contrast for basic.
## Warning in correlate_de_tables(results, annot_df = annot_df, extra_contrasts =
## extra_contrasts): The merge of deseq, control_vs_cal_high=control-cal_high, and
## basic, control_vs_cal_high=control-cal_high, failed.
## Used reverse contrast for basic.
## Warning in correlate_de_tables(results, annot_df = annot_df, extra_contrasts =
## extra_contrasts): The merge of deseq, control_vs_cal_low=control-cal_low, and
## basic, control_vs_cal_low=control-cal_low, failed.

a909_contrasts <- list(
  "low_vs_control" = c("cal_low", "control"),
  "high_vs_control" = c("cal_high", "control"))
a909_tables <- combine_de_tables(
  extra_annot=ess_table,
  a909_de, keepers=a909_contrasts,
  excel=glue::glue("excel/{rundate}-a909_tables-v{ver}.xlsx"))
## Writing a legend of columns.
## Printing a pca plot before/after surrogates/batch estimation.
## Working on 1/2: low_vs_control which is: cal_low/control.
## Found inverse table with control_vs_cal_low
## Used the inverse table, might need to -1 the logFC and stat.
## Warning in combine_single_de_table(li = limma, ed = edger, eb = ebseq, de =
## deseq, : The deseq table seems to be missing.
## Only 1 bin; IHW reduces to Benjamini Hochberg (uniform weights)
## Only 1 bin; IHW reduces to Benjamini Hochberg (uniform weights)
## Only 1 bin; IHW reduces to Benjamini Hochberg (uniform weights)
## Only 1 bin; IHW reduces to Benjamini Hochberg (uniform weights)
## Only 1 bin; IHW reduces to Benjamini Hochberg (uniform weights)
## Unable to find the table in the set of possible tables.
## The possible tables are: cal_low_vs_cal_high=cal_low-cal_high,, control_vs_cal_high=control-cal_high,, control_vs_cal_low=control-cal_low,
## Working on 2/2: high_vs_control which is: cal_high/control.
## Found inverse table with control_vs_cal_high
## Used the inverse table, might need to -1 the logFC and stat.
## Warning in combine_single_de_table(li = limma, ed = edger, eb = ebseq, de =
## deseq, : The deseq table seems to be missing.
## Only 1 bin; IHW reduces to Benjamini Hochberg (uniform weights)
## Only 1 bin; IHW reduces to Benjamini Hochberg (uniform weights)
## Only 1 bin; IHW reduces to Benjamini Hochberg (uniform weights)
## Only 1 bin; IHW reduces to Benjamini Hochberg (uniform weights)
## Only 1 bin; IHW reduces to Benjamini Hochberg (uniform weights)
## Unable to find the table in the set of possible tables.
## The possible tables are: cal_low_vs_cal_high=cal_low-cal_high,, control_vs_cal_high=control-cal_high,, control_vs_cal_low=control-cal_low,
## Adding venn plots for low_vs_control.

## Limma expression coefficients for low_vs_control; R^2: 0.994; equation: y = 0.996x + 0.0272
## Deseq expression coefficients for low_vs_control; R^2: 0.987; equation: y = 0.985x + 0.167
## Edger expression coefficients for low_vs_control; R^2: 0.994; equation: y = 0.996x + 0.0363
## Adding venn plots for high_vs_control.

## Limma expression coefficients for high_vs_control; R^2: 0.994; equation: y = 0.999x - 0.0103
## Deseq expression coefficients for high_vs_control; R^2: 0.988; equation: y = 0.993x + 0.0786
## Edger expression coefficients for high_vs_control; R^2: 0.995; equation: y = 0.997x + 0.0218
## Writing summary information, compare_plot is: TRUE.
## Performing save of excel/20201015-a909_tables-v20191105.xlsx.

##a909_sig <- extract_significant_genes(
##  a909_tables,
##  excel=glue::glue("excel/a909_sig-v{ver}.xlsx"))

7.2 Strain 2603V/R

vr2603_de <- all_pairwise(vr2603_expt, model_batch=FALSE, parallel=FALSE)
## Plotting a PCA before surrogate/batch inclusion.
## Not putting labels on the PC plot.
## Assuming no batch in model for testing pca.
## Not putting labels on the PC plot.
## Starting basic_pairwise().
## Starting basic pairwise comparison.
## Basic step 0/3: Filtering data.
## Basic step 0/3: Normalizing data.
## Basic step 0/3: Converting data.
## Basic step 0/3: Transforming data.
## Basic step 1/3: Creating mean and variance tables.
## Basic step 2/3: Performing 6 comparisons.
## Basic step 3/3: Creating faux DE Tables.
## Basic: Returning tables.
## Starting deseq_pairwise().
## Starting DESeq2 pairwise comparisons.
## The data should be suitable for EdgeR/DESeq/EBSeq. If they freak out, check the state of the count table and ensure that it is in integer counts.
## Choosing the non-intercept containing model.
## DESeq2 step 1/5: Including only condition in the deseq model.
## converting counts to integer mode
##   it appears that the last variable in the design formula, 'condition',
##   has a factor level, 'control', which is not the reference level. we recommend
##   to use factor(...,levels=...) or relevel() to set this as the reference level
##   before proceeding. for more information, please see the 'Note on factor levels'
##   in vignette('DESeq2').
##   it appears that the last variable in the design formula, 'condition',
##   has a factor level, 'control', which is not the reference level. we recommend
##   to use factor(...,levels=...) or relevel() to set this as the reference level
##   before proceeding. for more information, please see the 'Note on factor levels'
##   in vignette('DESeq2').
## DESeq2 step 2/5: Estimate size factors.
## DESeq2 step 3/5: Estimate dispersions.
## gene-wise dispersion estimates
## mean-dispersion relationship
## final dispersion estimates
## Using a parametric fitting seems to have worked.
## DESeq2 step 4/5: nbinomWaldTest.
## Starting ebseq_pairwise().
## The data should be suitable for EdgeR/DESeq/EBSeq. If they freak out, check the state of the count table and ensure that it is in integer counts.
## Starting EBSeq pairwise subset.
## Choosing the non-intercept containing model.
## Starting EBTest of cal_high vs. cal_low.
## Copying ppee values as ajusted p-values until I figure out how to deal with them.
## Starting EBTest of cal_high vs. control.
## Copying ppee values as ajusted p-values until I figure out how to deal with them.
## Starting EBTest of cal_low vs. control.
## Copying ppee values as ajusted p-values until I figure out how to deal with them.
## Starting edger_pairwise().
## Starting edgeR pairwise comparisons.
## The data should be suitable for EdgeR/DESeq/EBSeq. If they freak out, check the state of the count table and ensure that it is in integer counts.
## Choosing the non-intercept containing model.
## EdgeR step 1/9: Importing and normalizing data.
## EdgeR step 2/9: Estimating the common dispersion.
## EdgeR step 3/9: Estimating dispersion across genes.
## EdgeR step 4/9: Estimating GLM Common dispersion.
## EdgeR step 5/9: Estimating GLM Trended dispersion.
## EdgeR step 6/9: Estimating GLM Tagged dispersion.
## EdgeR step 7/9: Running glmFit, switch to glmQLFit by changing the argument 'edger_test'.
## EdgeR step 8/9: Making pairwise contrasts.

## Starting limma_pairwise().
## Starting limma pairwise comparison.
## libsize was not specified, this parameter has profound effects on limma's result.
## Using the libsize from expt$libsize.
## Limma step 1/6: choosing model.
## Choosing the non-intercept containing model.
## Limma step 2/6: running limma::voom(), switch with the argument 'which_voom'.
## Using normalize.method=quantile for voom.

## Limma step 3/6: running lmFit with method: ls.
## Limma step 4/6: making and fitting contrasts with no intercept. (~ 0 + factors)
## Limma step 5/6: Running eBayes with robust=FALSE and trend=FALSE.
## Limma step 6/6: Writing limma outputs.
## Limma step 6/6: 1/3: Creating table: cal_low_vs_cal_high.  Adjust=BH
## Limma step 6/6: 2/3: Creating table: control_vs_cal_high.  Adjust=BH
## Limma step 6/6: 3/3: Creating table: control_vs_cal_low.  Adjust=BH
## Limma step 6/6: 1/3: Creating table: cal_high.  Adjust=BH
## Limma step 6/6: 2/3: Creating table: cal_low.  Adjust=BH
## Limma step 6/6: 3/3: Creating table: control.  Adjust=BH
## Comparing analyses.
## Used reverse contrast for deseq.
## Warning in correlate_de_tables(results, annot_df = annot_df, extra_contrasts
## = extra_contrasts): The merge of limma, cal_low_vs_cal_high and deseq,
## cal_low_vs_cal_high failed.
## Used reverse contrast for deseq.
## Warning in correlate_de_tables(results, annot_df = annot_df, extra_contrasts
## = extra_contrasts): The merge of limma, control_vs_cal_high and deseq,
## control_vs_cal_high failed.
## Used reverse contrast for deseq.
## Warning in correlate_de_tables(results, annot_df = annot_df, extra_contrasts
## = extra_contrasts): The merge of limma, control_vs_cal_low and deseq,
## control_vs_cal_low failed.
## Used reverse contrast for edger.
## Warning in correlate_de_tables(results, annot_df = annot_df, extra_contrasts =
## extra_contrasts): The merge of deseq, cal_low_vs_cal_high=cal_low-cal_high, and
## edger, cal_low_vs_cal_high=cal_low-cal_high, failed.
## Used reverse contrast for edger.
## Warning in correlate_de_tables(results, annot_df = annot_df, extra_contrasts =
## extra_contrasts): The merge of deseq, control_vs_cal_high=control-cal_high, and
## edger, control_vs_cal_high=control-cal_high, failed.
## Used reverse contrast for edger.
## Warning in correlate_de_tables(results, annot_df = annot_df, extra_contrasts =
## extra_contrasts): The merge of deseq, control_vs_cal_low=control-cal_low, and
## edger, control_vs_cal_low=control-cal_low, failed.
## Used reverse contrast for ebseq.
## Warning in correlate_de_tables(results, annot_df = annot_df, extra_contrasts =
## extra_contrasts): The merge of deseq, cal_low_vs_cal_high=cal_low-cal_high, and
## ebseq, cal_low_vs_cal_high=cal_low-cal_high, failed.
## Used reverse contrast for ebseq.
## Warning in correlate_de_tables(results, annot_df = annot_df, extra_contrasts =
## extra_contrasts): The merge of deseq, control_vs_cal_high=control-cal_high, and
## ebseq, control_vs_cal_high=control-cal_high, failed.
## Used reverse contrast for ebseq.
## Warning in correlate_de_tables(results, annot_df = annot_df, extra_contrasts =
## extra_contrasts): The merge of deseq, control_vs_cal_low=control-cal_low, and
## ebseq, control_vs_cal_low=control-cal_low, failed.
## Used reverse contrast for basic.
## Warning in correlate_de_tables(results, annot_df = annot_df, extra_contrasts =
## extra_contrasts): The merge of deseq, cal_low_vs_cal_high=cal_low-cal_high, and
## basic, cal_low_vs_cal_high=cal_low-cal_high, failed.
## Used reverse contrast for basic.
## Warning in correlate_de_tables(results, annot_df = annot_df, extra_contrasts =
## extra_contrasts): The merge of deseq, control_vs_cal_high=control-cal_high, and
## basic, control_vs_cal_high=control-cal_high, failed.
## Used reverse contrast for basic.
## Warning in correlate_de_tables(results, annot_df = annot_df, extra_contrasts =
## extra_contrasts): The merge of deseq, control_vs_cal_low=control-cal_low, and
## basic, control_vs_cal_low=control-cal_low, failed.

vr2603_tables <- combine_de_tables(
  vr2603_de, keepers=a909_contrasts,
  excel=glue::glue("excel/{rundate}-vr2603_tables-v{ver}.xlsx"))
## Writing a legend of columns.
## Printing a pca plot before/after surrogates/batch estimation.
## Working on 1/2: low_vs_control which is: cal_low/control.
## Found inverse table with control_vs_cal_low
## Used the inverse table, might need to -1 the logFC and stat.
## Warning in combine_single_de_table(li = limma, ed = edger, eb = ebseq, de =
## deseq, : The deseq table seems to be missing.
## Only 1 bin; IHW reduces to Benjamini Hochberg (uniform weights)
## Only 1 bin; IHW reduces to Benjamini Hochberg (uniform weights)
## Only 1 bin; IHW reduces to Benjamini Hochberg (uniform weights)
## Only 1 bin; IHW reduces to Benjamini Hochberg (uniform weights)
## Only 1 bin; IHW reduces to Benjamini Hochberg (uniform weights)
## Unable to find the table in the set of possible tables.
## The possible tables are: cal_low_vs_cal_high=cal_low-cal_high,, control_vs_cal_high=control-cal_high,, control_vs_cal_low=control-cal_low,
## Working on 2/2: high_vs_control which is: cal_high/control.
## Found inverse table with control_vs_cal_high
## Used the inverse table, might need to -1 the logFC and stat.
## Warning in combine_single_de_table(li = limma, ed = edger, eb = ebseq, de =
## deseq, : The deseq table seems to be missing.
## Only 1 bin; IHW reduces to Benjamini Hochberg (uniform weights)
## Only 1 bin; IHW reduces to Benjamini Hochberg (uniform weights)
## Only 1 bin; IHW reduces to Benjamini Hochberg (uniform weights)
## Only 1 bin; IHW reduces to Benjamini Hochberg (uniform weights)
## Only 1 bin; IHW reduces to Benjamini Hochberg (uniform weights)
## Unable to find the table in the set of possible tables.
## The possible tables are: cal_low_vs_cal_high=cal_low-cal_high,, control_vs_cal_high=control-cal_high,, control_vs_cal_low=control-cal_low,
## Adding venn plots for low_vs_control.

## Limma expression coefficients for low_vs_control; R^2: 0.994; equation: y = 0.997x + 0.0108
## Deseq expression coefficients for low_vs_control; R^2: 0.989; equation: y = 0.998x - 0.00338
## Edger expression coefficients for low_vs_control; R^2: 0.995; equation: y = 0.999x + 0.00155
## Adding venn plots for high_vs_control.

## Limma expression coefficients for high_vs_control; R^2: 0.994; equation: y = 1x - 0.0297
## Deseq expression coefficients for high_vs_control; R^2: 0.99; equation: y = 0.993x + 0.0655
## Edger expression coefficients for high_vs_control; R^2: 0.995; equation: y = 0.999x + 0.00492
## Writing summary information, compare_plot is: TRUE.
## Performing save of excel/20201015-vr2603_tables-v20191105.xlsx.

##vr2630_sig <- extract_significant_genes(
##  vr2603_tables,
##  excel=glue::glue("excel/{rundate}-vr2603_sig-v{ver}.xlsx"))

7.3 Strain CJB111

cjb111_de <- all_pairwise(cjb111_expt, model_batch=FALSE, parallel=FALSE)
## Plotting a PCA before surrogate/batch inclusion.
## Not putting labels on the PC plot.
## Assuming no batch in model for testing pca.
## Not putting labels on the PC plot.
## Starting basic_pairwise().
## Starting basic pairwise comparison.
## Basic step 0/3: Filtering data.
## Basic step 0/3: Normalizing data.
## Basic step 0/3: Converting data.
## Basic step 0/3: Transforming data.
## Basic step 1/3: Creating mean and variance tables.
## Basic step 2/3: Performing 6 comparisons.
## Basic step 3/3: Creating faux DE Tables.
## Basic: Returning tables.
## Starting deseq_pairwise().
## Starting DESeq2 pairwise comparisons.
## The data should be suitable for EdgeR/DESeq/EBSeq. If they freak out, check the state of the count table and ensure that it is in integer counts.
## Choosing the non-intercept containing model.
## DESeq2 step 1/5: Including only condition in the deseq model.
## converting counts to integer mode
##   it appears that the last variable in the design formula, 'condition',
##   has a factor level, 'control', which is not the reference level. we recommend
##   to use factor(...,levels=...) or relevel() to set this as the reference level
##   before proceeding. for more information, please see the 'Note on factor levels'
##   in vignette('DESeq2').
##   it appears that the last variable in the design formula, 'condition',
##   has a factor level, 'control', which is not the reference level. we recommend
##   to use factor(...,levels=...) or relevel() to set this as the reference level
##   before proceeding. for more information, please see the 'Note on factor levels'
##   in vignette('DESeq2').
## DESeq2 step 2/5: Estimate size factors.
## DESeq2 step 3/5: Estimate dispersions.
## gene-wise dispersion estimates
## mean-dispersion relationship
## final dispersion estimates
## Using a parametric fitting seems to have worked.
## DESeq2 step 4/5: nbinomWaldTest.
## Starting ebseq_pairwise().
## The data should be suitable for EdgeR/DESeq/EBSeq. If they freak out, check the state of the count table and ensure that it is in integer counts.
## Starting EBSeq pairwise subset.
## Choosing the non-intercept containing model.
## Starting EBTest of cal_high vs. cal_low.
## Copying ppee values as ajusted p-values until I figure out how to deal with them.
## Starting EBTest of cal_high vs. control.
## Copying ppee values as ajusted p-values until I figure out how to deal with them.
## Starting EBTest of cal_low vs. control.
## Copying ppee values as ajusted p-values until I figure out how to deal with them.
## Starting edger_pairwise().
## Starting edgeR pairwise comparisons.
## The data should be suitable for EdgeR/DESeq/EBSeq. If they freak out, check the state of the count table and ensure that it is in integer counts.
## Choosing the non-intercept containing model.
## EdgeR step 1/9: Importing and normalizing data.
## EdgeR step 2/9: Estimating the common dispersion.
## EdgeR step 3/9: Estimating dispersion across genes.
## EdgeR step 4/9: Estimating GLM Common dispersion.
## EdgeR step 5/9: Estimating GLM Trended dispersion.
## EdgeR step 6/9: Estimating GLM Tagged dispersion.
## EdgeR step 7/9: Running glmFit, switch to glmQLFit by changing the argument 'edger_test'.
## EdgeR step 8/9: Making pairwise contrasts.

## Starting limma_pairwise().
## Starting limma pairwise comparison.
## libsize was not specified, this parameter has profound effects on limma's result.
## Using the libsize from expt$libsize.
## Limma step 1/6: choosing model.
## Choosing the non-intercept containing model.
## Limma step 2/6: running limma::voom(), switch with the argument 'which_voom'.
## Using normalize.method=quantile for voom.

## Limma step 3/6: running lmFit with method: ls.
## Limma step 4/6: making and fitting contrasts with no intercept. (~ 0 + factors)
## Limma step 5/6: Running eBayes with robust=FALSE and trend=FALSE.
## Limma step 6/6: Writing limma outputs.
## Limma step 6/6: 1/3: Creating table: cal_low_vs_cal_high.  Adjust=BH
## Limma step 6/6: 2/3: Creating table: control_vs_cal_high.  Adjust=BH
## Limma step 6/6: 3/3: Creating table: control_vs_cal_low.  Adjust=BH
## Limma step 6/6: 1/3: Creating table: cal_high.  Adjust=BH
## Limma step 6/6: 2/3: Creating table: cal_low.  Adjust=BH
## Limma step 6/6: 3/3: Creating table: control.  Adjust=BH
## Comparing analyses.
## Used reverse contrast for deseq.
## Warning in correlate_de_tables(results, annot_df = annot_df, extra_contrasts
## = extra_contrasts): The merge of limma, cal_low_vs_cal_high and deseq,
## cal_low_vs_cal_high failed.
## Used reverse contrast for deseq.
## Warning in correlate_de_tables(results, annot_df = annot_df, extra_contrasts
## = extra_contrasts): The merge of limma, control_vs_cal_high and deseq,
## control_vs_cal_high failed.
## Used reverse contrast for deseq.
## Warning in correlate_de_tables(results, annot_df = annot_df, extra_contrasts
## = extra_contrasts): The merge of limma, control_vs_cal_low and deseq,
## control_vs_cal_low failed.
## Used reverse contrast for edger.
## Warning in correlate_de_tables(results, annot_df = annot_df, extra_contrasts =
## extra_contrasts): The merge of deseq, cal_low_vs_cal_high=cal_low-cal_high, and
## edger, cal_low_vs_cal_high=cal_low-cal_high, failed.
## Used reverse contrast for edger.
## Warning in correlate_de_tables(results, annot_df = annot_df, extra_contrasts =
## extra_contrasts): The merge of deseq, control_vs_cal_high=control-cal_high, and
## edger, control_vs_cal_high=control-cal_high, failed.
## Used reverse contrast for edger.
## Warning in correlate_de_tables(results, annot_df = annot_df, extra_contrasts =
## extra_contrasts): The merge of deseq, control_vs_cal_low=control-cal_low, and
## edger, control_vs_cal_low=control-cal_low, failed.
## Used reverse contrast for ebseq.
## Warning in correlate_de_tables(results, annot_df = annot_df, extra_contrasts =
## extra_contrasts): The merge of deseq, cal_low_vs_cal_high=cal_low-cal_high, and
## ebseq, cal_low_vs_cal_high=cal_low-cal_high, failed.
## Used reverse contrast for ebseq.
## Warning in correlate_de_tables(results, annot_df = annot_df, extra_contrasts =
## extra_contrasts): The merge of deseq, control_vs_cal_high=control-cal_high, and
## ebseq, control_vs_cal_high=control-cal_high, failed.
## Used reverse contrast for ebseq.
## Warning in correlate_de_tables(results, annot_df = annot_df, extra_contrasts =
## extra_contrasts): The merge of deseq, control_vs_cal_low=control-cal_low, and
## ebseq, control_vs_cal_low=control-cal_low, failed.
## Used reverse contrast for basic.
## Warning in correlate_de_tables(results, annot_df = annot_df, extra_contrasts =
## extra_contrasts): The merge of deseq, cal_low_vs_cal_high=cal_low-cal_high, and
## basic, cal_low_vs_cal_high=cal_low-cal_high, failed.
## Used reverse contrast for basic.
## Warning in correlate_de_tables(results, annot_df = annot_df, extra_contrasts =
## extra_contrasts): The merge of deseq, control_vs_cal_high=control-cal_high, and
## basic, control_vs_cal_high=control-cal_high, failed.
## Used reverse contrast for basic.
## Warning in correlate_de_tables(results, annot_df = annot_df, extra_contrasts =
## extra_contrasts): The merge of deseq, control_vs_cal_low=control-cal_low, and
## basic, control_vs_cal_low=control-cal_low, failed.

cjb111_tables <- combine_de_tables(
  cjb111_de, keepers=a909_contrasts,
  excel=glue::glue("excel/{rundate}-cjb111_tables-v{ver}.xlsx"))
## Writing a legend of columns.
## Printing a pca plot before/after surrogates/batch estimation.
## Working on 1/2: low_vs_control which is: cal_low/control.
## Found inverse table with control_vs_cal_low
## Used the inverse table, might need to -1 the logFC and stat.
## Warning in combine_single_de_table(li = limma, ed = edger, eb = ebseq, de =
## deseq, : The deseq table seems to be missing.
## Only 1 bin; IHW reduces to Benjamini Hochberg (uniform weights)
## Only 1 bin; IHW reduces to Benjamini Hochberg (uniform weights)
## Only 1 bin; IHW reduces to Benjamini Hochberg (uniform weights)
## Only 1 bin; IHW reduces to Benjamini Hochberg (uniform weights)
## Only 1 bin; IHW reduces to Benjamini Hochberg (uniform weights)
## Unable to find the table in the set of possible tables.
## The possible tables are: cal_low_vs_cal_high=cal_low-cal_high,, control_vs_cal_high=control-cal_high,, control_vs_cal_low=control-cal_low,
## Working on 2/2: high_vs_control which is: cal_high/control.
## Found inverse table with control_vs_cal_high
## Used the inverse table, might need to -1 the logFC and stat.
## Warning in combine_single_de_table(li = limma, ed = edger, eb = ebseq, de =
## deseq, : The deseq table seems to be missing.
## Only 1 bin; IHW reduces to Benjamini Hochberg (uniform weights)
## Only 1 bin; IHW reduces to Benjamini Hochberg (uniform weights)
## Only 1 bin; IHW reduces to Benjamini Hochberg (uniform weights)
## Only 1 bin; IHW reduces to Benjamini Hochberg (uniform weights)
## Only 1 bin; IHW reduces to Benjamini Hochberg (uniform weights)
## Unable to find the table in the set of possible tables.
## The possible tables are: cal_low_vs_cal_high=cal_low-cal_high,, control_vs_cal_high=control-cal_high,, control_vs_cal_low=control-cal_low,
## Adding venn plots for low_vs_control.

## Limma expression coefficients for low_vs_control; R^2: 0.993; equation: y = 0.997x + 0.0131
## Deseq expression coefficients for low_vs_control; R^2: 0.985; equation: y = 0.984x + 0.172
## Edger expression coefficients for low_vs_control; R^2: 0.994; equation: y = 0.996x + 0.0349
## Adding venn plots for high_vs_control.

## Limma expression coefficients for high_vs_control; R^2: 0.993; equation: y = 1x - 0.0172
## Deseq expression coefficients for high_vs_control; R^2: 0.987; equation: y = 0.992x + 0.0875
## Edger expression coefficients for high_vs_control; R^2: 0.994; equation: y = 0.997x + 0.0239
## Writing summary information, compare_plot is: TRUE.
## Performing save of excel/20201015-cjb111_tables-v20191105.xlsx.

##cjb111_sig <- extract_significant_genes(
##  a909_tables,
##  excel=glue::glue("excel/{rundate}-cjb111_sig-v{ver}.xlsx"))

8 Circos

combined_expt <- create_expt("sample_sheets/sagalactiae_combined_samples.xlsx",
                             gene_info=a909_annot)
## Reading the sample metadata.
## The sample definitions comprises: 3 rows(samples) and 11 columns(metadata fields).
## Reading count tables.
## Reading count files with read.table().
## /mnt/sshfs/cbcbsub01/fs/cbcb-lab/nelsayed/scratch/atb/tnseq/sagalacticae_2019/preprocessing/combined_control/outputs/bowtie_sagalactiae_a909/trimmed_ca-v1m1.count.xz contains 2212 rows.
## /mnt/sshfs/cbcbsub01/fs/cbcb-lab/nelsayed/scratch/atb/tnseq/sagalacticae_2019/preprocessing/combined_low/outputs/bowtie_sagalactiae_a909/trimmed_ca-v1m1.count.xz contains 2212 rows and merges to 2212 rows.
## /mnt/sshfs/cbcbsub01/fs/cbcb-lab/nelsayed/scratch/atb/tnseq/sagalacticae_2019/preprocessing/combined_high/outputs/bowtie_sagalactiae_a909/trimmed_ca-v1m1.count.xz contains 2212 rows and merges to 2212 rows.
## Finished reading count data.
## Matched 2048 annotations and counts.
## Bringing together the count matrix and gene information.
## Some annotations were lost in merging, setting them to 'undefined'.
## Saving the expressionset to 'expt.rda'.
## The final expressionset has 2207 rows and 3 columns.
combined_norm <- normalize_expt(combined_expt, convert="rpkm",
                                transform="log2", na_to_zero=TRUE)
## This function will replace the expt$expressionset slot with:
## log2(rpkm(data))
## It will save copies of each step along the way
##  in expt$normalized with the corresponding libsizes. Keep libsizes in mind
##  when invoking limma.  The appropriate libsize is non-log(cpm(normalized)).
##  This is most likely kept at:
##  'new_expt$normalized$intermediate_counts$normalization$libsizes'
##  A copy of this may also be found at:
##  new_expt$best_libsize
## Filter is false, this should likely be set to something, good
##  choices include cbcb, kofa, pofa (anything but FALSE).  If you want this to
##  stay FALSE, keep in mind that if other normalizations are performed, then the
##  resulting libsizes are likely to be strange (potentially negative!)
## Leaving the data unnormalized.  This is necessary for DESeq, but
##  EdgeR/limma might benefit from normalization.  Good choices include quantile,
##  size-factor, tmm, etc.
## Not correcting the count-data for batch effects.  If batch is
##  included in EdgerR/limma's model, then this is probably wise; but in extreme
##  batch effects this is a good parameter to play with.
## Step 1: not doing count filtering.
## Step 2: not normalizing the data.
## Step 3: converting the data with rpkm.
## Step 4: transforming the data with log2.
## transform_counts: Found 436 values equal to 0, adding 1 to the matrix.
## Step 5: not doing batch correction.
combined_exprs <- exprs(combined_norm)

ess_circos <- ess_table[, c("control_call", "low_call", "high_call")] %>%
    dplyr::mutate(control_num = dplyr::case_when(
                                           control_call == "E" ~ 2,
                                           control_call == "NE" ~ 0,
                                           control_call == "S" ~ -1,
                                           control_call == "U" ~ 1),
                           low_num = dplyr::case_when(
                                                low_call == "E" ~ 2,
                                                low_call == "NE" ~ 0,
                                                low_call == "S" ~ -1,
                                                low_call == "U" ~ 1),
                           high_num = dplyr::case_when(
                                                 high_call == "E" ~ 2,
                                                 high_call == "NE" ~ 0,
                                                 high_call == "S" ~ -1,
                                                 high_call == "U" ~ 1))
ess_circos[["control_call"]] <- as.factor(ess_circos[["control_call"]])
ess_circos[["low_call"]] <- as.factor(ess_circos[["low_call"]])
ess_circos[["high_call"]] <- as.factor(ess_circos[["high_call"]])
rownames(ess_circos) <- rownames(ess_table)

colors <- c("990000", "008800", "000000", "0000AA")
names(colors) <- c("E", "NE", "S", "U")
low_df <- a909_tables[["data"]][["low_vs_control"]]
high_df <- a909_tables[["data"]][["high_vs_control"]]

circos_cfg <- circos_prefix(a909_annot, name="a909")
## This assumes you have a colors.conf in circos/colors/ and fonts.conf in circos/fonts/
## It also assumes you have conf/ideogram.conf, conf/ticks.conf, and conf/housekeeping.conf
## It will write circos/conf/a909.conf with a reasonable first approximation config file.
## Wrote karyotype to circos/conf/ideograms/a909.conf
## This should match the karyotype= line in a909.conf
## Wrote ticks to circos/conf/ticks_a909.conf
a909_kary <- circos_karyotype(circos_cfg, fasta="reference/sagalactiae_a909.fasta")
## Wrote karyotype to circos/conf/karyotypes/a909.conf
## This should match the karyotype= line in a909.conf
a909_plus_minus <- circos_plus_minus(circos_cfg, width=0.06, thickness=40)
## Writing data file: circos/data/a909_plus_go.txt with the + strand GO data.
## Writing data file: circos/data/a909_minus_go.txt with the - strand GO data.
## Wrote the +/- config files.  Appending their inclusion to the master file.
## Returning the inner width: 0.88.  Use it as the outer for the next ring.
a909_control_rpkm <- circos_hist(circos_cfg, combined_exprs, colname="control",
                                 basename="control_rpkm", outer=a909_plus_minus,
                                 fill_color="vvdpblue", width=0.06)
## Writing data file: circos/data/a909_control_rpkmcontrol_hist.txt with the control_rpkmcontrol column.
## Returning the inner width: 0.82.  Use it as the outer for the next ring.
a909_low_rpkm <- circos_hist(circos_cfg, combined_exprs, colname="low",
                             basename="low_rpkm", outer=a909_control_rpkm,
                             fill_color="vdpblue", width=0.06)
## Writing data file: circos/data/a909_low_rpkmlow_hist.txt with the low_rpkmlow column.
## Returning the inner width: 0.76.  Use it as the outer for the next ring.
a909_high_rpkm <- circos_hist(circos_cfg, combined_exprs, colname="high",
                              basename="high_rpkm", outer=a909_low_rpkm,
                              fill_color="dpblue", width=0.06)
## Writing data file: circos/data/a909_high_rpkmhigh_hist.txt with the high_rpkmhigh column.
## Returning the inner width: 0.7.  Use it as the outer for the next ring.
a909_control_tile <- circos_tile(circos_cfg, ess_circos, colname="control_call",
                                 colors=colors, basename="control_tile",
                                 outer=a909_high_rpkm, width=0.06)
## Writing data file: circos/data/a909control_call_tile.txt with the control_tilecontrol_call column.
## Returning the inner width: 0.64.  Use it as the outer for the next ring.
a909_low <- circos_hist(circos_cfg, low_df, colname="deseq_logfc", basename="low",
                        outer=0.60, fill_color="vvdpgreen", width=0.06, thickness=0.1)
## Writing data file: circos/data/a909_lowdeseq_logfc_hist.txt with the lowdeseq_logfc column.
## Returning the inner width: 0.54.  Use it as the outer for the next ring.
a909_high <- circos_hist(circos_cfg, high_df, colname="deseq_logfc", basename="high",
                         outer=a909_low, fill_color="vdpgreen", width=0.06, thickness=0.1)
## Writing data file: circos/data/a909_highdeseq_logfc_hist.txt with the highdeseq_logfc column.
## Returning the inner width: 0.48.  Use it as the outer for the next ring.
a909_suffix <- circos_suffix(circos_cfg)
made <- circos_make(circos_cfg, target="a909")

Yoann sent an email this morning with the following request:

“I have now the table summarizing the data and we would like to summarize it with a Circos plot. I was hoping you could do your amazing magic on this. The data is in the Excel file I am attaching to the email. The figure would look very similar to what you did not too long ago, but with extra data. The idea will be to have the genome information and then going down into the circle we would show the THY data (in column BE), than maybe a little space and we would show the RPMI-based data (BL, BS and BZ), then again a little space and we would have a final circle integrating all previous data for the final call (CI).”

I copied the xls file to the ‘from_yoann/’ directory and exported the relevant portions to a csv file named ‘gbs_essentiality.csv’.

I just realized that the material Yoann sent me is precisely what I already did in the above section which created the ess_circos table.

yoann_table <- readr::read_csv("from_yoann/gbs_essentiality.csv")
## Warning: Missing column names filled in: 'X51' [51], 'X58' [58], 'X65' [65],
## 'X72' [72], 'X79' [79], 'X80' [80], 'X81' [81], 'X82' [82], 'X83' [83],
## 'X84' [84], 'X86' [86], 'X88' [88]
## 
## ── Column specification ────────────────────────────────────────────────────────
## cols(
##   .default = col_character(),
##   X51 = col_logical(),
##   previousk = col_double(),
##   previousn = col_double(),
##   previousr = col_double(),
##   previouss = col_double(),
##   previouszbar = col_double(),
##   X58 = col_logical(),
##   controlk = col_double(),
##   controln = col_double(),
##   controlr = col_double(),
##   controls = col_double(),
##   controlzbar = col_double(),
##   X65 = col_logical(),
##   lowk = col_double(),
##   lown = col_double(),
##   lowr = col_double(),
##   lows = col_double(),
##   lowzbar = col_double(),
##   X72 = col_logical(),
##   highk = col_double()
##   # ... with 10 more columns
## )
## ℹ Use `spec()` for the full column specifications.
## The new column which is desired is actually the 'Final'.
## So, I will merge this with my existing ess_circos data frame and add a color for 'NC'.
## The wanted column names are:
## BE: previouscall BL: controlcall BS: lowcall BZ: highcall CI: 'Final call' (85)
wanted <- c("controlcall", "Final")
yoann_wanted <- as.data.frame(yoann_table[, wanted])
rownames(yoann_wanted) <- yoann_table[["row.names"]]

yoann_circos <- merge(ess_circos, yoann_wanted, by.x="row.names", by.y="row.names")
yoann_circos[["Final"]] <- as.factor(yoann_circos[["Final"]])
rownames(yoann_circos) <- yoann_circos[["Row.names"]]
yoann_circos[["Row.names"]] <- NULL
colors <- c("990000", "008800", "444444", "0000AA", "000000")
names(colors) <- c("E", "NE", "S", "U", "NC")

yoann_cfg <- circos_prefix(a909_annot, name="a909_yoann")
## This assumes you have a colors.conf in circos/colors/ and fonts.conf in circos/fonts/
## It also assumes you have conf/ideogram.conf, conf/ticks.conf, and conf/housekeeping.conf
## It will write circos/conf/a909_yoann.conf with a reasonable first approximation config file.
## Wrote karyotype to circos/conf/ideograms/a909_yoann.conf
## This should match the karyotype= line in a909_yoann.conf
## Wrote ticks to circos/conf/ticks_a909_yoann.conf
yoann_kary <- circos_karyotype(yoann_cfg, fasta="reference/sagalactiae_a909.fasta")
## Wrote karyotype to circos/conf/karyotypes/a909_yoann.conf
## This should match the karyotype= line in a909_yoann.conf
yoann_plus_minus <- circos_plus_minus(yoann_cfg, width=0.06, thickness=40)
## Writing data file: circos/data/a909_yoann_plus_go.txt with the + strand GO data.
## Writing data file: circos/data/a909_yoann_minus_go.txt with the - strand GO data.
## Wrote the +/- config files.  Appending their inclusion to the master file.
## Returning the inner width: 0.88.  Use it as the outer for the next ring.
yoann_control_tile <- circos_tile(yoann_cfg, ess_circos, colname="control_call",
                                  colors=colors, basename="control_tile",
                                  outer=yoann_plus_minus, width=0.06)
## Writing data file: circos/data/a909_yoanncontrol_call_tile.txt with the control_tilecontrol_call column.
## Returning the inner width: 0.82.  Use it as the outer for the next ring.
yoann_low_tile <- circos_tile(yoann_cfg, ess_circos, colname="low_call",
                              colors=colors, basename="low_tile",
                              outer=yoann_control_tile, width=0.06)
## Writing data file: circos/data/a909_yoannlow_call_tile.txt with the low_tilelow_call column.
## Returning the inner width: 0.76.  Use it as the outer for the next ring.
yoann_high_tile <- circos_tile(yoann_cfg, ess_circos, colname="high_call",
                              colors=colors, basename="high_tile",
                              outer=yoann_low_tile, width=0.06)
## Writing data file: circos/data/a909_yoannhigh_call_tile.txt with the high_tilehigh_call column.
## Returning the inner width: 0.7.  Use it as the outer for the next ring.
yoann_final_tile <- circos_tile(yoann_cfg, yoann_circos, colname="Final",
                                colors=colors, basename="final_tile",
                                outer=yoann_high_tile, width=0.06)
## Writing data file: circos/data/a909_yoannFinal_tile.txt with the final_tileFinal column.
## Returning the inner width: 0.64.  Use it as the outer for the next ring.
yoann_suffix <- circos_suffix(yoann_cfg)
made <- circos_make(yoann_cfg, target="a909_yoann")

9 Another Yoann query

First, between the COG categories and the THY data, I would like to add the saturation level of the library: this would be the blue lines from the Circos figure you produce a while back (see Circos plot attached to this email).

Second, I would like to add a new ring of essentiality that summarizes the data from the rings (1), (2), (3) and (4) abovementioned. The data is listed in the attached Excel document and is found in column CI, called Lindsey’s call. I would like the data to look a little different so it “pops” as it is a summary. I remember back in the day, we did something similar with some of my data in Group A strep, and we had the non-essential genes showing in yellow.

In order to do the above, I saved the excel file Yoann sent me, exported the relevant column to a 2 column cvs file, containing the gene IDs and calls. Now I will copy/paste the previous set of rings and add the new requests.

yoann_202006 <- readr::read_csv("from_yoann/lindsey_calls.csv")
## 
## ── Column specification ────────────────────────────────────────────────────────
## cols(
##   ID = col_character(),
##   Final = col_character()
## )
yoann_202006 <- as.data.frame(yoann_202006)
rownames(yoann_202006) <- yoann_202006[["ID"]]
colnames(yoann_202006) <- c("ID202006", "lindsey_call")

lindsey_colors <- c("e31212", "f0c505", "444444", "0000AA", "000000")
names(lindsey_colors) <- c("E", "NE", "S", "U", "NC")

yoann_circos_202006 <- merge(yoann_circos, yoann_202006, by.x="row.names", by.y="row.names")
rownames(yoann_circos_202006) <- yoann_circos_202006[["Row.names"]]
yoann_circos_202006[["Row.names"]] <- NULL

yoann_cfg_202006 <- circos_prefix(a909_annot, name="a909_yoann_202006")
## This assumes you have a colors.conf in circos/colors/ and fonts.conf in circos/fonts/
## It also assumes you have conf/ideogram.conf, conf/ticks.conf, and conf/housekeeping.conf
## It will write circos/conf/a909_yoann_202006.conf with a reasonable first approximation config file.
## Wrote karyotype to circos/conf/ideograms/a909_yoann_202006.conf
## This should match the karyotype= line in a909_yoann_202006.conf
## Wrote ticks to circos/conf/ticks_a909_yoann_202006.conf
yoann_kary_202006 <- circos_karyotype(yoann_cfg_202006, fasta="reference/sagalactiae_a909.fasta")
## Wrote karyotype to circos/conf/karyotypes/a909_yoann_202006.conf
## This should match the karyotype= line in a909_yoann_202006.conf
yoann_plus_minus_202006 <- circos_plus_minus(yoann_cfg_202006, width=0.05, thickness=40)
## Writing data file: circos/data/a909_yoann_202006_plus_go.txt with the + strand GO data.
## Writing data file: circos/data/a909_yoann_202006_minus_go.txt with the - strand GO data.
## Wrote the +/- config files.  Appending their inclusion to the master file.
## Returning the inner width: 0.9.  Use it as the outer for the next ring.
a909_control_rpkm_202006 <- circos_hist(yoann_cfg_202006, combined_exprs, colname="control",
                                        basename="control_rpkm", outer=yoann_plus_minus_202006,
                                        fill_color="vvdpblue", width=0.05)
## Writing data file: circos/data/a909_yoann_202006_control_rpkmcontrol_hist.txt with the control_rpkmcontrol column.
## Returning the inner width: 0.85.  Use it as the outer for the next ring.
a909_low_rpkm_202006 <- circos_hist(yoann_cfg_202006, combined_exprs, colname="low",
                                    basename="low_rpkm", outer=a909_control_rpkm_202006,
                                    fill_color="vdpblue", width=0.05)
## Writing data file: circos/data/a909_yoann_202006_low_rpkmlow_hist.txt with the low_rpkmlow column.
## Returning the inner width: 0.8.  Use it as the outer for the next ring.
a909_high_rpkm_202006 <- circos_hist(yoann_cfg_202006, combined_exprs, colname="high",
                                     basename="high_rpkm", outer=a909_low_rpkm_202006,
                                     fill_color="dpblue", width=0.05)
## Writing data file: circos/data/a909_yoann_202006_high_rpkmhigh_hist.txt with the high_rpkmhigh column.
## Returning the inner width: 0.75.  Use it as the outer for the next ring.
lindsey_tile_202006 <- circos_tile(yoann_cfg_202006, yoann_circos_202006, colname="lindsey_call",
                                   colors=lindsey_colors, basename="summary_tile", thickness=60,
                                   stroke_thickness=0.001,
                                   outer=a909_high_rpkm_202006, width=0.05)
## Writing data file: circos/data/a909_yoann_202006lindsey_call_tile.txt with the summary_tilelindsey_call column.
## Returning the inner width: 0.7.  Use it as the outer for the next ring.
yoann_control_tile_202006 <- circos_tile(yoann_cfg_202006, ess_circos, colname="control_call",
                                         colors=colors, basename="control_tile", thickness=60,
                                         stroke_thickness=0.001,
                                         outer=lindsey_tile_202006, width=0.05)
## Writing data file: circos/data/a909_yoann_202006control_call_tile.txt with the control_tilecontrol_call column.
## Returning the inner width: 0.65.  Use it as the outer for the next ring.
yoann_low_tile_202006 <- circos_tile(yoann_cfg_202006, ess_circos, colname="low_call",
                                     colors=colors, basename="low_tile",
                                     thickness=60, stroke_thickness=0.001,
                                     outer=yoann_control_tile_202006, width=0.05)
## Writing data file: circos/data/a909_yoann_202006low_call_tile.txt with the low_tilelow_call column.
## Returning the inner width: 0.6.  Use it as the outer for the next ring.
yoann_high_tile_202006 <- circos_tile(yoann_cfg_202006, ess_circos, colname="high_call",
                                      colors=colors, basename="high_tile",
                                      thickness=60, stroke_thickness=0.001,
                                      outer=yoann_low_tile_202006, width=0.05)
## Writing data file: circos/data/a909_yoann_202006high_call_tile.txt with the high_tilehigh_call column.
## Returning the inner width: 0.55.  Use it as the outer for the next ring.
yoann_final_tile_202006 <- circos_tile(yoann_cfg_202006, yoann_circos_202006, colname="Final",
                                       colors=colors, basename="final_tile",
                                       thickness=60, stroke_thickness=0.001,
                                       outer=yoann_high_tile_202006, width=0.05)
## Writing data file: circos/data/a909_yoann_202006Final_tile.txt with the final_tileFinal column.
## Returning the inner width: 0.5.  Use it as the outer for the next ring.
yoann_suffix_202006 <- circos_suffix(yoann_cfg_202006)
made <- circos_make(yoann_cfg_202006, target="a909_yoann_202006")

10 Yoann version 4ish

Here is this morning’s email:

For the information we want to display. - rings 1 and 2, from the outside: the genes by COG, which I think is already what you have there. - ring 3: the mutation saturation, how many Krmit insertions in the initial library in THY, which again I think is what you have. - ring 4: Bayesian essentiality data for the THY medium (this is column BE in the crazy table I sent you this morning). - ring 5: Bayesian essentiality data for the mRPMI medium (this is column BL in the crazy table). - ring 6: Bayesian essentiality data for the mRPMI medium + low Calprotectin (this is column BS in the crazy table). - ring 7: Bayesian essentiality data for the mRPMI medium + high Calprotectin (this is column BZ in the crazy table). - I was wondering if you could include a little space here (maybe it’s too much, don’t spend too much time on that).

Since all the stuff is apparently in the table Yoann called ‘crazy table’, I exported those columns into a csv with that name…

crazy_table <- read.csv("from_yoann/crazy_table.csv")
rownames(crazy_table) <- crazy_table[["row.names"]]
crazy_table[["row.names"]] <- NULL

cfgv4 <- circos_prefix(a909_annot, name="a909_v4")
## This assumes you have a colors.conf in circos/colors/ and fonts.conf in circos/fonts/
## It also assumes you have conf/ideogram.conf, conf/ticks.conf, and conf/housekeeping.conf
## It will write circos/conf/a909_v4.conf with a reasonable first approximation config file.
## Wrote karyotype to circos/conf/ideograms/a909_v4.conf
## This should match the karyotype= line in a909_v4.conf
## Wrote ticks to circos/conf/ticks_a909_v4.conf
karyv4 <- circos_karyotype(cfgv4, fasta="reference/sagalactiae_a909.fasta")
## Wrote karyotype to circos/conf/karyotypes/a909_v4.conf
## This should match the karyotype= line in a909_v4.conf
ring12v4 <- circos_plus_minus(cfgv4, width=0.05, thickness=40)
## Writing data file: circos/data/a909_v4_plus_go.txt with the + strand GO data.
## Writing data file: circos/data/a909_v4_minus_go.txt with the - strand GO data.
## Wrote the +/- config files.  Appending their inclusion to the master file.
## Returning the inner width: 0.9.  Use it as the outer for the next ring.
ring3v4 <- circos_hist(cfgv4, combined_exprs, colname="control",
                       basename="control_rpkmv4", outer=ring12v4,
                       fill_color="vvdpblue", width=0.05)
## Writing data file: circos/data/a909_v4_control_rpkmv4control_hist.txt with the control_rpkmv4control column.
## Returning the inner width: 0.85.  Use it as the outer for the next ring.
ring4v4 <- circos_tile(cfgv4, crazy_table, colname="previouscall",
                       colors=lindsey_colors, basename="previousv4", outer=ring3v4,
                       thickness=60, stroke_thickness=0.001,  width=0.05)
## Writing data file: circos/data/a909_v4previouscall_tile.txt with the previousv4previouscall column.
## Returning the inner width: 0.8.  Use it as the outer for the next ring.
ring5v4 <- circos_tile(cfgv4, crazy_table, colname="controlcall",
                       colors=lindsey_colors, basename="controlv4", outer=ring4v4,
                       thickness=60, stroke_thickness=0.001, width=0.05)
## Writing data file: circos/data/a909_v4controlcall_tile.txt with the controlv4controlcall column.
## Returning the inner width: 0.75.  Use it as the outer for the next ring.
ring6v4 <- circos_tile(cfgv4, crazy_table, colname="lowcall",
                       colors=lindsey_colors, basename="lowv4", outer=ring5v4,
                       thickness=60, stroke_thickness=0.001, width=0.05)
## Writing data file: circos/data/a909_v4lowcall_tile.txt with the lowv4lowcall column.
## Returning the inner width: 0.7.  Use it as the outer for the next ring.
ring7v4 <- circos_tile(cfgv4, crazy_table, colname="highcall",
                       colors=lindsey_colors, basename="highv4", outer=ring6v4,
                       thickness=60, stroke_thickness=0.001, width=0.05)
## Writing data file: circos/data/a909_v4highcall_tile.txt with the highv4highcall column.
## Returning the inner width: 0.65.  Use it as the outer for the next ring.
suffixv4 <- circos_suffix(cfgv4)
made <- circos_make(cfgv4, target="a909_v4")

10.1 Yoann 20200707

Here is today’s email:

“For the Bayesian representations, I was hoping we could display a total of 5 circles, four representing the data obtained for the four different conditions (i.e., THY -column BE-; RPMI -column BL-; RPMI+lowCal -column BS- and RPMI+highCal -column BZ-): for these 4 circles the non-essential genes would be shown in gree. Then, there would be one last circle, that is a summary of the results previously mentioned: this circle would integrate the data from column CI (also called Lindsey Call), and for this circle, I want the non-essential genes represented in yellow, so that we can see that this is a little different than the 4 other circles previously mentioned.”

If I read this correctly, the only thing I did wrong was to get some of the colors wrong?

main_colors <- c("e31212", "12e312", "444444", "0909AA", "090909")
names(main_colors) <- c("E", "NE", "S", "U", "NC")
summary_colors <- c("e31212", "f0c505", "444444", "0909AA", "090909")
names(summary_colors) <- c("E", "NE", "S", "U", "NC")

cfgv5 <- circos_prefix(a909_annot, name="a909_v5")
## This assumes you have a colors.conf in circos/colors/ and fonts.conf in circos/fonts/
## It also assumes you have conf/ideogram.conf, conf/ticks.conf, and conf/housekeeping.conf
## It will write circos/conf/a909_v5.conf with a reasonable first approximation config file.
## Wrote karyotype to circos/conf/ideograms/a909_v5.conf
## This should match the karyotype= line in a909_v5.conf
## Wrote ticks to circos/conf/ticks_a909_v5.conf
karyv5 <- circos_karyotype(cfgv5, fasta="reference/sagalactiae_a909.fasta")
## Wrote karyotype to circos/conf/karyotypes/a909_v5.conf
## This should match the karyotype= line in a909_v5.conf
ring12v5 <- circos_plus_minus(cfgv5, width=0.07, thickness=40)
## Writing data file: circos/data/a909_v5_plus_go.txt with the + strand GO data.
## Writing data file: circos/data/a909_v5_minus_go.txt with the - strand GO data.
## Wrote the +/- config files.  Appending their inclusion to the master file.
## Returning the inner width: 0.86.  Use it as the outer for the next ring.
ring3v5 <- circos_hist(cfgv5, combined_exprs, colname="control",
                       basename="control_rpkmv5", outer=ring12v5,
                       fill_color="vvdpblue", width=0.07)
## Writing data file: circos/data/a909_v5_control_rpkmv5control_hist.txt with the control_rpkmv5control column.
## Returning the inner width: 0.79.  Use it as the outer for the next ring.
ring4v5 <- circos_tile(cfgv5, crazy_table, colname="previouscall",
                       colors=main_colors, basename="previousv5", outer=ring3v5,
                       thickness=70, stroke_thickness=0.001,  width=0.07)
## Writing data file: circos/data/a909_v5previouscall_tile.txt with the previousv5previouscall column.
## Returning the inner width: 0.72.  Use it as the outer for the next ring.
ring5v5 <- circos_tile(cfgv5, crazy_table, colname="controlcall",
                       colors=main_colors, basename="controlv5", outer=ring4v5,
                       thickness=70, stroke_thickness=0.001, width=0.07)
## Writing data file: circos/data/a909_v5controlcall_tile.txt with the controlv5controlcall column.
## Returning the inner width: 0.65.  Use it as the outer for the next ring.
ring6v5 <- circos_tile(cfgv5, crazy_table, colname="lowcall",
                       colors=main_colors, basename="lowv5", outer=ring5v5,
                       thickness=70, stroke_thickness=0.001, width=0.07)
## Writing data file: circos/data/a909_v5lowcall_tile.txt with the lowv5lowcall column.
## Returning the inner width: 0.58.  Use it as the outer for the next ring.
ring7v5 <- circos_tile(cfgv5, crazy_table, colname="highcall",
                       colors=main_colors, basename="highv5", outer=ring6v5,
                       thickness=70, stroke_thickness=0.001, width=0.07)
## Writing data file: circos/data/a909_v5highcall_tile.txt with the highv5highcall column.
## Returning the inner width: 0.51.  Use it as the outer for the next ring.
ring8v5 <- circos_tile(cfgv5, crazy_table, colname="Final",
                       colors=summary_colors, basename="finalv5", outer=ring7v5,
                       thickness=70, stroke_thickness=0.001, width=0.07)
## Writing data file: circos/data/a909_v5Final_tile.txt with the finalv5Final column.
## Returning the inner width: 0.44.  Use it as the outer for the next ring.
suffixv5 <- circos_suffix(cfgv5)
made <- circos_make(cfgv5, target="a909_v5")

10.1.1 Experimenting with ggstatsplots and the 2018 data

a909_prev <- create_expt(metadata="sample_sheets/sagalactiae_combined_with_previous_samples.xlsx",
                         batch=FALSE, gene_info=a909_annot, file_column="file")
## Reading the sample metadata.
## The sample definitions comprises: 4 rows(samples) and 12 columns(metadata fields).
## Reading count tables.
## Reading count files with read.table().
## /mnt/sshfs/cbcbsub01/fs/cbcb-lab/nelsayed/scratch/atb/tnseq/sagalacticae_2019/preprocessing/combined_control/outputs/bowtie_sagalactiae_a909/trimmed_ca-v1m1.count.xz contains 2212 rows.
## /mnt/sshfs/cbcbsub01/fs/cbcb-lab/nelsayed/scratch/atb/tnseq/sagalacticae_2019/preprocessing/combined_low/outputs/bowtie_sagalactiae_a909/trimmed_ca-v1m1.count.xz contains 2212 rows and merges to 2212 rows.
## /mnt/sshfs/cbcbsub01/fs/cbcb-lab/nelsayed/scratch/atb/tnseq/sagalacticae_2019/preprocessing/combined_high/outputs/bowtie_sagalactiae_a909/trimmed_ca-v1m1.count.xz contains 2212 rows and merges to 2212 rows.
## preprocessing/combined_previous/outputs/bowtie_sagalactiae_a909/combined_ca_ta-v0M1.count_sagalactiae_a909_sno_gene_gene_id.count.xz contains 2212 rows and merges to 2212 rows.
## Finished reading count data.
## Matched 2048 annotations and counts.
## Bringing together the count matrix and gene information.
## Some annotations were lost in merging, setting them to 'undefined'.
## Saving the expressionset to 'expt.rda'.
## The final expressionset has 2207 rows and 4 columns.
saturation_control <- tnseq_saturation(
    "preprocessing/combined_control/outputs/essentiality_sagalactiae_a909/trimmed_ca-v1m1.wig")
saturation_control$plot
## Warning: Removed 16596 rows containing non-finite values (stat_bin).
## Warning: Removed 16596 rows containing non-finite values (stat_density).
## Warning: Removed 2 rows containing missing values (geom_bar).

control_plts <- plot_essentiality(
    "preprocessing/combined_control/outputs/essentiality_sagalactiae_a909/mh_ess-trimmed_ca-v1m1_gene_tas_m2.csv")
control_plts[["zbar"]]

saturation_low <- tnseq_saturation(
    "preprocessing/combined_low/outputs/essentiality_sagalactiae_a909/trimmed_ca-v1m1.wig")
saturation_control$plot
## Warning: Removed 16596 rows containing non-finite values (stat_bin).
## Warning: Removed 16596 rows containing non-finite values (stat_density).
## Warning: Removed 2 rows containing missing values (geom_bar).

low_plts <- plot_essentiality(
    "preprocessing/combined_low/outputs/essentiality_sagalactiae_a909/mh_ess-trimmed_ca-v1m1_gene_tas_m2.csv")
low_plts[["zbar"]]

saturation_high <- tnseq_saturation(
    "preprocessing/combined_high/outputs/essentiality_sagalactiae_a909/trimmed_ca-v1m1.wig")
saturation_control$plot
## Warning: Removed 16596 rows containing non-finite values (stat_bin).
## Warning: Removed 16596 rows containing non-finite values (stat_density).
## Warning: Removed 2 rows containing missing values (geom_bar).

high_plts <- plot_essentiality(
    "preprocessing/combined_high/outputs/essentiality_sagalactiae_a909/mh_ess-trimmed_ca-v1m1_gene_tas_m2.csv")
high_plts[["zbar"]]

saturation_prev <- tnseq_saturation(
    "preprocessing/combined_previous/outputs/essentiality_sagalactiae_a909/combined_ca_ta-v0M1.wig")
saturation_control$plot
## Warning: Removed 16596 rows containing non-finite values (stat_bin).
## Warning: Removed 16596 rows containing non-finite values (stat_density).
## Warning: Removed 2 rows containing missing values (geom_bar).

high_plts <- plot_essentiality(
    "preprocessing/combined_previous/outputs/essentiality_sagalactiae_a909/mh_ess-combined_ca_ta-v0M1_gene_tas_m2.csv")
high_plts[["zbar"]]

plt <- tnseq_multi_saturation(meta=pData(a909_prev), meta_column="a909esswig")
plt$plot

plt$ggstats
## notch went outside hinges. Try setting notch=FALSE.
## notch went outside hinges. Try setting notch=FALSE.
## notch went outside hinges. Try setting notch=FALSE.

pander::pander(sessionInfo())

R version 4.0.3 (2020-10-10)

Platform: x86_64-pc-linux-gnu (64-bit)

locale: LC_CTYPE=en_US.UTF-8, LC_NUMERIC=C, LC_TIME=en_US.UTF-8, LC_COLLATE=en_US.UTF-8, LC_MONETARY=en_US.UTF-8, LC_MESSAGES=en_US.UTF-8, LC_PAPER=en_US.UTF-8, LC_NAME=C, LC_ADDRESS=C, LC_TELEPHONE=C, LC_MEASUREMENT=en_US.UTF-8 and LC_IDENTIFICATION=C

attached base packages: splines, parallel, stats, graphics, grDevices, utils, datasets, methods and base

other attached packages: edgeR(v.3.30.3), ruv(v.0.9.7.1), lme4(v.1.1-23), Matrix(v.1.2-18), BiocParallel(v.1.22.0), variancePartition(v.1.18.3), hpgltools(v.1.0), testthat(v.2.3.2), R6(v.2.4.1), Biobase(v.2.48.0) and BiocGenerics(v.0.34.0)

loaded via a namespace (and not attached): corpcor(v.1.6.9), class(v.7.3-17), ps(v.1.4.0), Rsamtools(v.2.4.0), V8(v.3.2.0), lmtest(v.0.9-38), foreach(v.1.5.0), rprojroot(v.1.3-2), crayon(v.1.3.4), MASS(v.7.3-53), PMCMRplus(v.1.5.1), nlme(v.3.1-149), backports(v.1.1.10), metafor(v.2.4-0), ggcorrplot(v.0.1.3), sva(v.3.36.0), GOSemSim(v.2.14.2), rlang(v.0.4.7), XVector(v.0.28.0), readxl(v.1.3.1), performance(v.0.5.0), nloptr(v.1.2.2.2), callr(v.3.4.4), limma(v.3.44.3), bit64(v.4.0.5), loo(v.2.3.1), glue(v.1.4.2), rstan(v.2.21.2), pbkrtest(v.0.4-8.6), processx(v.3.4.4), AnnotationDbi(v.1.50.3), ggstatsplot(v.0.6.1), DOSE(v.3.14.0), haven(v.2.3.1), tidyselect(v.1.1.0), SummarizedExperiment(v.1.18.2), usethis(v.1.6.3), rio(v.0.5.16), XML(v.3.99-0.5), tidyr(v.1.1.2), zoo(v.1.8-8), SuppDists(v.1.1-9.5), GenomicAlignments(v.1.24.0), mc2d(v.0.1-18), xtable(v.1.8-4), MatrixModels(v.0.4-1), magrittr(v.1.5), evaluate(v.0.14), ggplot2(v.3.3.2), cli(v.2.0.2), zlibbioc(v.1.34.0), rstudioapi(v.0.11), miniUI(v.0.1.1.1), fastmatch(v.1.1-0), shiny(v.1.5.0), xfun(v.0.18), inline(v.0.3.16), askpass(v.1.1), parameters(v.0.8.6), pkgbuild(v.1.1.0), bridgesampling(v.1.0-0), caTools(v.1.18.0), tidygraph(v.1.2.0), WRS2(v.1.1-0), Vennerable(v.3.1.0.9000), Brobdingnag(v.1.2-6), expm(v.0.999-5), tibble(v.3.0.3), ggrepel(v.0.8.2), Biostrings(v.2.56.0), reshape(v.0.8.8), zeallot(v.0.1.0), ez(v.4.4-0), withr(v.2.3.0), rcompanion(v.2.3.25), slam(v.0.1-47), bitops(v.1.0-6), ggforce(v.0.3.2), RBGL(v.1.64.0), plyr(v.1.8.6), cellranger(v.1.1.0), e1071(v.1.7-3), coda(v.0.19-4), RcppParallel(v.5.0.2), pillar(v.1.4.6), gplots(v.3.1.0), GenomicFeatures(v.1.40.1), multcomp(v.1.4-14), Rmpfr(v.0.8-1), EBSeq(v.1.28.0), fs(v.1.5.0), europepmc(v.0.4), clusterProfiler(v.3.16.1), paletteer(v.1.2.0), vctrs(v.0.3.4), ellipsis(v.0.3.1), generics(v.0.0.2), nortest(v.1.0-4), urltools(v.1.7.3), devtools(v.2.3.2), tools(v.4.0.3), foreign(v.0.8-80), munsell(v.0.5.0), tweenr(v.1.0.1), fgsea(v.1.14.0), DelayedArray(v.0.14.1), fastmap(v.1.0.1), compiler(v.4.0.3), pkgload(v.1.1.0), abind(v.1.4-5), httpuv(v.1.5.4), rtracklayer(v.1.48.0), blockmodeling(v.1.0.0), sessioninfo(v.1.1.1), DescTools(v.0.99.38), ggExtra(v.0.9), GenomeInfoDbData(v.1.2.3), gridExtra(v.2.3), lattice(v.0.20-41), later(v.1.1.0.1), dplyr(v.1.0.2), prismatic(v.0.2.0), BiocFileCache(v.1.12.1), jsonlite(v.1.7.1), scales(v.1.1.1), graph(v.1.66.0), gld(v.2.6.2), pbapply(v.1.4-3), carData(v.3.0-4), genefilter(v.1.70.0), promises(v.1.1.1), tidyBF(v.0.3.0), car(v.3.0-10), BWStest(v.0.2.2), doParallel(v.1.0.15), R.utils(v.2.10.1), metaBMA(v.0.6.3), effectsize(v.0.3.3), pairwiseComparisons(v.3.0.0), sandwich(v.3.0-0), rmarkdown(v.2.4), openxlsx(v.4.2.2), cowplot(v.1.1.0), statmod(v.1.4.34), Rtsne(v.0.15), ipmisc(v.4.0.0), forcats(v.0.5.0), pander(v.0.6.3), downloader(v.0.4), selectr(v.0.4-2), logspline(v.2.1.16), igraph(v.1.2.6), survival(v.3.2-7), numDeriv(v.2016.8-1.1), yaml(v.2.2.1), metaplus(v.0.7-11), rstantools(v.2.1.1), htmltools(v.0.5.0), memoise(v.1.1.0), fastGHQuad(v.1.0), modeltools(v.0.2-23), locfit(v.1.5-9.4), graphlayouts(v.0.7.0), IRanges(v.2.22.2), quadprog(v.1.5-8), viridisLite(v.0.3.0), gmp(v.0.6-1), digest(v.0.6.25), assertthat(v.0.2.1), mime(v.0.9), rappdirs(v.0.3.1), bayestestR(v.0.7.2), RSQLite(v.2.2.1), LaplacesDemon(v.16.1.4), Exact(v.2.1), remotes(v.2.2.0), data.table(v.1.13.0), blob(v.1.2.1), R.oo(v.1.24.0), lpsymphony(v.1.16.0), S4Vectors(v.0.26.1), preprocessCore(v.1.50.0), labeling(v.0.3), rematch2(v.2.1.2), RCurl(v.1.98-1.2), broom(v.0.7.1), hms(v.0.5.3), colorspace(v.1.4-1), BiocManager(v.1.30.10), GenomicRanges(v.1.40.0), libcoin(v.1.0-6), broom.mixed(v.0.2.6), coin(v.1.3-1), Rcpp(v.1.0.5), mvtnorm(v.1.1-1), enrichplot(v.1.8.1), IHW(v.1.16.0), multcompView(v.0.1-8), fansi(v.0.4.1), grid(v.4.0.3), ggridges(v.0.5.2), lifecycle(v.0.2.0), EMT(v.1.1), StanHeaders(v.2.21.0-6), rootSolve(v.1.8.2.1), statsExpressions(v.0.5.1), zip(v.2.1.1), BayesFactor(v.0.9.12-4.2), curl(v.4.3), ggsignif(v.0.6.0), minqa(v.1.2.4), robustbase(v.0.93-6), broomExtra(v.4.0.6), fastcluster(v.1.1.25), DO.db(v.2.9), PROPER(v.1.20.0), qvalue(v.2.20.0), TH.data(v.1.0-10), desc(v.1.2.0), RColorBrewer(v.1.1-2), iterators(v.1.0.12), TMB(v.1.7.18), stringr(v.1.4.0), directlabels(v.2020.6.17), polyclip(v.1.10-0), triebeard(v.0.3.0), biomaRt(v.2.44.1), purrr(v.0.3.4), gridGraphics(v.0.5-0), rvest(v.0.3.6), mgcv(v.1.8-33), openssl(v.1.4.3), insight(v.0.9.6), lmom(v.2.8), bdsmatrix(v.1.3-4), codetools(v.0.2-16), matrixStats(v.0.57.0), GO.db(v.3.11.4), gtools(v.3.8.2), prettyunits(v.1.1.1), dbplyr(v.1.4.4), R.methodsS3(v.1.8.1), GenomeInfoDb(v.1.24.2), correlation(v.0.4.0), gtable(v.0.3.0), DBI(v.1.1.0), stats4(v.4.0.3), httr(v.1.4.2), KernSmooth(v.2.23-17), stringi(v.1.5.3), kSamples(v.1.2-9), progress(v.1.2.2), reshape2(v.1.4.4), farver(v.2.0.3), ggthemes(v.4.2.0), annotate(v.1.66.0), viridis(v.0.5.1), fdrtool(v.1.2.15), xml2(v.1.3.2), colorRamps(v.2.3), rvcheck(v.0.1.8), bbmle(v.1.0.23.1), boot(v.1.3-25), geneplotter(v.1.66.0), readr(v.1.4.0), ggplotify(v.0.0.5), DEoptimR(v.1.0-8), DESeq2(v.1.28.1), bit(v.4.0.4), scatterpie(v.0.1.5), ggraph(v.2.0.3), pkgconfig(v.2.0.3) and knitr(v.1.30)

message(paste0("This is hpgltools commit: ", get_git_commit()))
## If you wish to reproduce this exact build of hpgltools, invoke the following:
## > git clone http://github.com/abelew/hpgltools.git
## > git reset 4f025ebdf7b19ddfef0cf9ddaa9ebe2857477394
## This is hpgltools commit: Wed Aug 19 10:11:52 2020 -0400: 4f025ebdf7b19ddfef0cf9ddaa9ebe2857477394
this_save <- paste0(gsub(pattern="\\.Rmd", replace="", x=rmd_file), "-v", ver, ".rda.xz")
message(paste0("Saving to ", this_save))
## Saving to index-v20191105.rda.xz
tmp <- sm(saveme(filename=this_save))
loadme(filename=this_save)
LS0tCnRpdGxlOiAiUy4gYWdhbGFjdGlhZSAyMDE5MTEwNTogUG9raW5nIGF0IHNvbWUgVE5TZXEuIgphdXRob3I6ICJhdGIgYWJlbGV3QGdtYWlsLmNvbSIKZGF0ZTogImByIFN5cy5EYXRlKClgIgpvdXRwdXQ6CiAgaHRtbF9kb2N1bWVudDoKICAgIGNvZGVfZG93bmxvYWQ6IHRydWUKICAgIGNvZGVfZm9sZGluZzogc2hvdwogICAgZmlnX2NhcHRpb246IHRydWUKICAgIGZpZ19oZWlnaHQ6IDcKICAgIGZpZ193aWR0aDogNwogICAgaGlnaGxpZ2h0OiB0YW5nbwogICAga2VlcF9tZDogZmFsc2UKICAgIG1vZGU6IHNlbGZjb250YWluZWQKICAgIG51bWJlcl9zZWN0aW9uczogdHJ1ZQogICAgc2VsZl9jb250YWluZWQ6IHRydWUKICAgIHRoZW1lOiByZWFkYWJsZQogICAgdG9jOiB0cnVlCiAgICB0b2NfZmxvYXQ6CiAgICAgIGNvbGxhcHNlZDogZmFsc2UKICAgICAgc21vb3RoX3Njcm9sbDogZmFsc2UKICBybWRmb3JtYXRzOjpyZWFkdGhlZG93bjoKICAgIGNvZGVfZG93bmxvYWQ6IHRydWUKICAgIGNvZGVfZm9sZGluZzogc2hvdwogICAgZGZfcHJpbnQ6IHBhZ2VkCiAgICBmaWdfY2FwdGlvbjogdHJ1ZQogICAgZmlnX2hlaWdodDogNwogICAgZmlnX3dpZHRoOiA3CiAgICBoaWdobGlnaHQ6IHRhbmdvCiAgICB3aWR0aDogMzAwCiAgICBrZWVwX21kOiBmYWxzZQogICAgbW9kZTogc2VsZmNvbnRhaW5lZAogICAgdG9jX2Zsb2F0OiB0cnVlCiAgQmlvY1N0eWxlOjpodG1sX2RvY3VtZW50OgogICAgY29kZV9kb3dubG9hZDogdHJ1ZQogICAgY29kZV9mb2xkaW5nOiBzaG93CiAgICBmaWdfY2FwdGlvbjogdHJ1ZQogICAgZmlnX2hlaWdodDogNwogICAgZmlnX3dpZHRoOiA3CiAgICBoaWdobGlnaHQ6IHRhbmdvCiAgICBrZWVwX21kOiBmYWxzZQogICAgbW9kZTogc2VsZmNvbnRhaW5lZAogICAgdG9jX2Zsb2F0OiB0cnVlCi0tLQoKPHN0eWxlIHR5cGU9InRleHQvY3NzIj4KYm9keSwgdGQgewogIGZvbnQtc2l6ZTogMTZweDsKfQpjb2RlLnJ7CiAgZm9udC1zaXplOiAxNnB4Owp9CnByZSB7CiBmb250LXNpemU6IDE2cHgKfQo8L3N0eWxlPgoKYGBge3Igb3B0aW9ucywgaW5jbHVkZT1GQUxTRX0KbGlicmFyeSgiaHBnbHRvb2xzIikKZGV2dG9vbHM6OmxvYWRfYWxsKCJ+L2hwZ2x0b29scyIpCmtuaXRyOjpvcHRzX2tuaXQkc2V0KHdpZHRoPTEyMCwKICAgICAgICAgICAgICAgICAgICAgcHJvZ3Jlc3M9VFJVRSwKICAgICAgICAgICAgICAgICAgICAgdmVyYm9zZT1UUlVFLAogICAgICAgICAgICAgICAgICAgICBlY2hvPVRSVUUpCmtuaXRyOjpvcHRzX2NodW5rJHNldChlcnJvcj1UUlVFLAogICAgICAgICAgICAgICAgICAgICAgZHBpPTk2KQpvbGRfb3B0aW9ucyA8LSBvcHRpb25zKGRpZ2l0cz00LAogICAgICAgICAgICAgICAgICAgICAgIHN0cmluZ3NBc0ZhY3RvcnM9RkFMU0UsCiAgICAgICAgICAgICAgICAgICAgICAga25pdHIuZHVwbGljYXRlLmxhYmVsPSJhbGxvdyIpCmdncGxvdDI6OnRoZW1lX3NldChnZ3Bsb3QyOjp0aGVtZV9idyhiYXNlX3NpemU9MTApKQpydW5kYXRlIDwtIGZvcm1hdChTeXMuRGF0ZSgpLCBmb3JtYXQ9IiVZJW0lZCIpCnByZXZpb3VzX2ZpbGUgPC0gIiIKdmVyIDwtICIyMDE5MTEwNSIKCiMjdG1wIDwtIHNtKGxvYWRtZShmaWxlbmFtZT1wYXN0ZTAoZ3N1YihwYXR0ZXJuPSJcXC5SbWQiLCByZXBsYWNlPSIiLCB4PXByZXZpb3VzX2ZpbGUpLCAiLXYiLCB2ZXIsICIucmRhLnh6IikpKQpybWRfZmlsZSA8LSAiaW5kZXguUm1kIgpgYGAKCiMgVE5TZXEgb2YgUy4gYWdhbGFjdGlhZSBhbmQgMyBjb25jZW50cmF0aW9ucyBvZiBjYWxwcm90ZWN0aW4uCgpUaGlzIHdvcmtzaGVldCBhaW1zIHRvIGxheSBvdXQgdGhlIHRhc2tzIEkgcGVyZm9ybWVkIHdoZW4gYW5hbHl6aW5nIHNvbWUgVE5TZXEKZGF0YSBvZiBhIGdyb3VwIEIgc3RyZXB0b2NvY2N1cy4KCiMgVGhyZWUgY29uY2VudHJhdGlvbnMgb2YgY2FscHJvdGVjdGluIChub25lLCA2MCwgYW5kIDQ4MCAtLSBpcyB0aGlzIFttTV0sIG1nL21MLCBvciB3aGF0PykKCkl0IGxvb2tzIHRvIG1lLCB0aGF0IGRlc3BpdGUgdGhlIG9kZGl0aWVzIGluIHByb2Nlc3NpbmcgdGhlIHJhdyByZWFkcywgdGhlcmUgaXMKbmljZSBjb3ZlcmFnZSBhbmQgc29tZSBvYnZpb3VzbHkgZXNzZW50aWFsIGdlbmVzLiAgVGhlIG5leHQgcXVlc3Rpb246IGRpZCBhbnkKY2hhbmdlIHN0YXR1cyBhcyBtb3JlIGNhbHByb3RlY3RpbiB3YXMgYWRkZWQ/CgojIEdyYWIgYW5ub3RhdGlvbiBkYXRhIGZvciBTdHJlcHRvY29jY3VzIGFnYWxhY3RpYWUuCgpUaGUgSUQgZm9yIHN0cmFpbiBhOTA5IGF0IG1pY3JvYmVzb25saW5lLm9yZyBpczogMjA1OTIxLgoKTGV0IHVzIGxvYWQgdXAgYW5ub3RhdGlvbnMgZnJvbSBteSBnZmYgZmlsZSBhbG9uZyB3aXRoIHRoZSBtaWNyb2Jlc29ubGluZS4KCkFzIGEgaGVhZHMgdXAsIHRoZSBjb3VudCB0YWJsZXMgYXJlIHVzaW5nIElEcyB3aGljaCBsb29rIGxpa2U6IFNBS19SUzAwMTg1LgpUaGlzIGFwcGVhcnMgdG8gYmUgdGhlICdzeXNOYW1lJyBjb2x1bW4gZnJvbSBtaWNyb2Jlc29ubGluZSBhbmQgdGhlIGxvY3VzX3RhZwpjb2x1bW4gZnJvbSB0aGUgZ2ZmIGFubm90YXRpb25zLiAgSW4gYWRkaXRpb24sIHRoZXJlIGFyZSBhIGJ1bmNoIG9mIHVudXNlZApjb2x1bW5zIGluIGJvdGggZGF0YSBzZXRzIHdoaWNoIHdlIGxpa2VseSB3YW50IHRvIHBydW5lLgoKQWhoLCB0aGF0IGlzIGluY29ycmVjdCwgdGhlIG1pY3JvYmVzb25saW5lICdzeXNOYW1lJyBpcyB0aGUgc2FtZSBhcwonb2xkX2xvY3VzX3RhZycgY29sdW1uLgoKVGhlcmUgYXJlIHRocmVlIHJlbGF0aXZlbHkgY2xvc2VseSByZWxhdGVkIHN0cmFpbnMgd2hpY2ggbWF5IGJlIHN1ZmZpY2llbnRseQpzaW1pbGFyIHRvIHVzZSBpbiB0aGlzIGFuYWx5c2lzLiAgVGhlIF9hY3R1YWxfIHN0cmFpbiBpcyBjamIxMTEsIGJ1dCB0aGF0IGhhcwpub3QgeWV0IGJlZW4gcXVpdGUgZmluaXNoZWQsIGFzIGZhciBhcyBJIGNhbiB0ZWxsLiAgVGhlcmVmb3JlIEkgd2lsbCByZXBlYXQKbW9zdChhbGw/KSB0YXNrcyB3aXRoIHN0cmFpbnMgYTkwOSBhbmQgdnIyNjAzIHRvIHNlZSBpZiB0aGV5IG1heSBiZSBtb3JlIHVzZWZ1bC4KCiMjIFN0cmFpbiBhOTA5CgpgYGB7ciBhbm5vdGF0aW9uc19hOTA5fQphOTA5X21pY3JvYmVzIDwtIGxvYWRfbWljcm9iZXNvbmxpbmVfYW5ub3RhdGlvbnMoc3BlY2llcz0iQTkwOSIpCmE5MDlfZ2ZmIDwtIGxvYWRfZ2ZmX2Fubm90YXRpb25zKCJyZWZlcmVuY2Uvc2FnYWxhY3RpYWVfYTkwOV9hbGwuZ2ZmIikKYTkwOV9taWNyb2JlcyA8LSBhcy5kYXRhLmZyYW1lKGE5MDlfbWljcm9iZXMpCnJvd25hbWVzKGE5MDlfZ2ZmKSA8LSBtYWtlLm5hbWVzKGE5MDlfZ2ZmW1sibG9jdXNfdGFnIl1dLCB1bmlxdWU9VFJVRSkKIyMgSSBhbSBnb2luZyB0byBvbmx5IHBheSBhdHRlbnRpb24gdG8gdGhlIGZpcnN0IGFubm90YXRpb24gZm9yIGVhY2ggbG9jdXMgdGFnIGZyb20gbWljcm9iZXNvbmxpbmUuCmE5MDlfbWljcm9iZXNbWyJzeXNOYW1lIl1dIDwtIG1ha2UubmFtZXMoYTkwOV9taWNyb2Jlc1tbInN5c05hbWUiXV0sIHVuaXF1ZT1UUlVFKQphOTA5X2Fubm90IDwtIG1lcmdlKGE5MDlfZ2ZmLCBhOTA5X21pY3JvYmVzLCBieS54PSJvbGRfbG9jdXNfdGFnIiwgYnkueT0ic3lzTmFtZSIpCnJvd25hbWVzKGE5MDlfYW5ub3QpIDwtIG1ha2UubmFtZXMoYTkwOV9hbm5vdFtbImxvY3VzX3RhZyJdXSwgdW5pcXVlPVRSVUUpCiMjIFJlbmFtZSB0aGUgbWVyZ2VkIHN0YXJ0L3N0cmFuZCBjb2x1bW5zCmNvbG5hbWVzKGE5MDlfYW5ub3QpWzNdIDwtICJzdGFydCIKY29sbmFtZXMoYTkwOV9hbm5vdClbNl0gPC0gInN0cmFuZCIKIyMgQW5kIGRyb3AgdGhlIGR1cGxpY2F0ZXMKYTkwOV9hbm5vdFssIGMoMzksIDQxKV0gPC0gTlVMTApgYGAKCiMjIFN0cmFpbiBjamIxMTEKCmBgYHtyIGFubm90YXRpb25fY2piMTExfQpjamIxMTFfbWljcm9iZXMgPC0gbG9hZF9taWNyb2Jlc29ubGluZV9hbm5vdGF0aW9ucyhzcGVjaWVzPSJDSkIxMTEiKQpjamIxMTFfZ2ZmIDwtIGxvYWRfZ2ZmX2Fubm90YXRpb25zKCJyZWZlcmVuY2Uvc2FnYWxhY3RpYWVfY2piMTExLmdmZiIpCmNqYjExMV9taWNyb2JlcyA8LSBhcy5kYXRhLmZyYW1lKGNqYjExMV9taWNyb2JlcykKcm93bmFtZXMoY2piMTExX2dmZikgPC0gbWFrZS5uYW1lcyhjamIxMTFfZ2ZmW1sibG9jdXNfdGFnIl1dLCB1bmlxdWU9VFJVRSkKIyMgSSBhbSBnb2luZyB0byBvbmx5IHBheSBhdHRlbnRpb24gdG8gdGhlIGZpcnN0IGFubm90YXRpb24gZm9yIGVhY2ggbG9jdXMgdGFnIGZyb20gbWljcm9iZXNvbmxpbmUuCmNqYjExMV9taWNyb2Jlc1tbInN5c05hbWUiXV0gPC0gbWFrZS5uYW1lcyhjamIxMTFfbWljcm9iZXNbWyJzeXNOYW1lIl1dLCB1bmlxdWU9VFJVRSkKY2piMTExX2Fubm90IDwtIG1lcmdlKGNqYjExMV9nZmYsIGNqYjExMV9taWNyb2JlcywgYnkueD0ibG9jdXNfdGFnIiwgYnkueT0ic3lzTmFtZSIpCnJvd25hbWVzKGNqYjExMV9hbm5vdCkgPC0gbWFrZS5uYW1lcyhjamIxMTFfYW5ub3RbWyJsb2N1c190YWciXV0sIHVuaXF1ZT1UUlVFKQojIyBSZW5hbWUgdGhlIG1lcmdlZCBzdGFydC9zdHJhbmQgY29sdW1ucwpjb2xuYW1lcyhjamIxMTFfYW5ub3QpWzNdIDwtICJzdGFydCIKY29sbmFtZXMoY2piMTExX2Fubm90KVs2XSA8LSAic3RyYW5kIgpjamIxMTFfYW5ub3RbLCBjKDE5LCAyMSldIDwtIE5VTEwKYGBgCgojIyBTdHJhaW4gdnIyNjAzCgpJIHRoaW5rIHRoaXMgbWlnaHQgYWN0dWFsbHkgYmUgMjYwM3ZyLCBJIGdldCBjb25mdXNlZCwgYW5kIHVuZGVyIGEgZmV3IHNwZWNpZmljCmNpcmN1bXN0YW5jZXMgUiBhY3RzIHN0cmFuZ2Ugd2hlbiB0aGluZ3Mgc3RhcnQgd2l0aCBudW1iZXJzLgoKYGBge3IgYW5ub3RhdGlvbl8yNjAzdnJ9CnZyMjYwM19taWNyb2JlcyA8LSBsb2FkX21pY3JvYmVzb25saW5lX2Fubm90YXRpb25zKHNwZWNpZXM9IjI2MDNWIikKdnIyNjAzX2dmZiA8LSBsb2FkX2dmZl9hbm5vdGF0aW9ucygicmVmZXJlbmNlL3NhZ2FsYWN0aWFlXzI2MDN2ci5nZmYiKQp2cjI2MDNfbWljcm9iZXMgPC0gYXMuZGF0YS5mcmFtZSh2cjI2MDNfbWljcm9iZXMpCnJvd25hbWVzKHZyMjYwM19nZmYpIDwtIG1ha2UubmFtZXModnIyNjAzX2dmZltbImxvY3VzX3RhZyJdXSwgdW5pcXVlPVRSVUUpCiMjIEkgYW0gZ29pbmcgdG8gb25seSBwYXkgYXR0ZW50aW9uIHRvIHRoZSBmaXJzdCBhbm5vdGF0aW9uIGZvciBlYWNoIGxvY3VzIHRhZyBmcm9tIG1pY3JvYmVzb25saW5lLgp2cjI2MDNfbWljcm9iZXNbWyJzeXNOYW1lIl1dIDwtIG1ha2UubmFtZXModnIyNjAzX21pY3JvYmVzW1sic3lzTmFtZSJdXSwgdW5pcXVlPVRSVUUpCnZyMjYwM19hbm5vdCA8LSBtZXJnZSh2cjI2MDNfZ2ZmLCB2cjI2MDNfbWljcm9iZXMsIGJ5Lng9ImxvY3VzX3RhZyIsIGJ5Lnk9InN5c05hbWUiKQpyb3duYW1lcyh2cjI2MDNfYW5ub3QpIDwtIG1ha2UubmFtZXModnIyNjAzX2Fubm90W1siSUQiXV0sIHVuaXF1ZT1UUlVFKQojIyBSZW5hbWUgdGhlIG1lcmdlZCBzdGFydC9zdHJhbmQgY29sdW1ucwpjb2xuYW1lcyh2cjI2MDNfYW5ub3QpWzNdIDwtICJzdGFydCIKY29sbmFtZXModnIyNjAzX2Fubm90KVs2XSA8LSAic3RyYW5kIgp2cjI2MDNfYW5ub3RbLCBjKDMzLCAzNSldIDwtIE5VTEwKYGBgCgojIENyZWF0ZSBFeHByZXNzaW9uc2V0cwoKVGhlIGZvbGxvd2luZyBibG9jayBtZXJnZXMgdGhlIHZhcmlvdXMgY291bnRzLCBhbm5vdGF0aW9ucywgYW5kIGV4cGVyaW1lbnRhbAptZXRhZGF0YS4KCkp1c3QgYXMgd2l0aCB0aGUgYW5ub3RhdGlvbnMsIEkgd2lsbCBjcmVhdGUgb25lIGV4cHJlc3Npb25zZXQgZm9yIGVhY2ggc3RyYWluLgoKIyMgU3RyYWluIGE5MDkKCmBgYHtyIGE5MDlfZXhwdCwgZmlnLnNob3c9ImhpZGUifQphOTA5X2V4cHQgPC0gY3JlYXRlX2V4cHQobWV0YWRhdGE9InNhbXBsZV9zaGVldHMvc2FnYWxhY3RpYWVfc2FtcGxlcy54bHN4IiwKICAgICAgICAgICAgICAgICAgICAgICAgIGJhdGNoPUZBTFNFLCBnZW5lX2luZm89YTkwOV9hbm5vdCwgZmlsZV9jb2x1bW49ImE5MDlfZmlsZW5hbWUiKQoKYTkwOV93cml0dGVuIDwtIHdyaXRlX2V4cHQoYTkwOV9leHB0LAogICAgICAgICAgICAgICAgICAgICAgICAgICBleGNlbD1nbHVlOjpnbHVlKCJleGNlbC97cnVuZGF0ZX0tYTkwOV9jb3VudHMtdnt2ZXJ9Lnhsc3giKSkKYGBgCgojIyBTdHJhaW4gY2piMTExCgpgYGB7ciBjamIxMTFfZXhwdCwgZmlnLnNob3c9ImhpZGUifQpjamIxMTFfZXhwdCA8LSBjcmVhdGVfZXhwdChtZXRhZGF0YT0ic2FtcGxlX3NoZWV0cy9zYWdhbGFjdGlhZV9zYW1wbGVzLnhsc3giLAogICAgICAgICAgICAgICAgICAgICAgICAgICBnZW5lX2luZm89Y2piMTExX2Fubm90LCBmaWxlX2NvbHVtbj0iY2piMTExX2ZpbGVuYW1lIikKCmNqYjExMV93cml0dGVuIDwtIHdyaXRlX2V4cHQoY2piMTExX2V4cHQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhjZWw9Z2x1ZTo6Z2x1ZSgiZXhjZWwve3J1bmRhdGV9LWNqYjExMV9jb3VudHMtdnt2ZXJ9Lnhsc3giKSkKYGBgCgojIyBTdHJhaW4gMjYwM3ZyCgpgYGB7ciB2cjI2MDNfZXhwdCwgZmlnLnNob3c9ImhpZGUifQp2cjI2MDNfZXhwdCA8LSBjcmVhdGVfZXhwdChtZXRhZGF0YT0ic2FtcGxlX3NoZWV0cy9zYWdhbGFjdGlhZV9zYW1wbGVzLnhsc3giLAogICAgICAgICAgICAgICAgICAgICAgICAgICBnZW5lX2luZm89dnIyNjAzX2Fubm90LCBmaWxlX2NvbHVtbj0idnIyNjAzX2ZpbGVuYW1lIikKCnZyMjYwM193cml0dGVuIDwtIHdyaXRlX2V4cHQodnIyNjAzX2V4cHQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhjZWw9Z2x1ZTo6Z2x1ZSgiZXhjZWwve3J1bmRhdGV9LXZyMjYwM19jb3VudHMtdnt2ZXJ9Lnhsc3giKSkKYGBgCgojIEEgRmV3IGRpYWdub3N0aWMgcGxvdHMKCiMjIFN0cmFpbiBBOTA5CgpgYGB7ciBzb21lX3Bsb3RzX2E5MDl9CmE5MDlfd3JpdHRlbltbImxlZ2VuZF9wbG90Il1dCmE5MDlfd3JpdHRlbltbInJhd19saWJzaXplIl1dCmE5MDlfd3JpdHRlbltbInJhd19kZW5zaXR5Il1dCiMjIGF3ZXNvbWUKCmE5MDlfd3JpdHRlbltbIm5vcm1fZGlzaGVhdCJdXQphOTA5X3dyaXR0ZW5bWyJub3JtX2NvcmhlYXQiXV0KYTkwOV93cml0dGVuW1sibm9ybV9wY2EiXV0KYGBgCgojIyBTdHJhaW4gQ0pCMTExCgpgYGB7ciBzb21lX3Bsb3RzX2NqYjExMX0KY2piMTExX3dyaXR0ZW5bWyJyYXdfbGlic2l6ZSJdXQpjamIxMTFfd3JpdHRlbltbInJhd19kZW5zaXR5Il1dCiMjIGF3ZXNvbWUKCmNqYjExMV93cml0dGVuW1sibm9ybV9kaXNoZWF0Il1dCmNqYjExMV93cml0dGVuW1sibm9ybV9jb3JoZWF0Il1dCmNqYjExMV93cml0dGVuW1sibm9ybV9wY2EiXV0KYGBgCgojIyBTdHJhaW4gMjYwM1YvUgoKYGBge3Igc29tZV9wbG90c19jamIxMTF2Mn0KdnIyNjAzX3dyaXR0ZW5bWyJyYXdfbGlic2l6ZSJdXQp2cjI2MDNfd3JpdHRlbltbInJhd19kZW5zaXR5Il1dCiMjIGF3ZXNvbWUKCnZyMjYwM193cml0dGVuW1sibm9ybV9kaXNoZWF0Il1dCnZyMjYwM193cml0dGVuW1sibm9ybV9jb3JoZWF0Il1dCnZyMjYwM193cml0dGVuW1sibm9ybV9wY2EiXV0KYGBgCgpJIHRoaW5rIHRoaXMgbG9va3MgcmVhc29uYWJsZSwgdGhvdWdoIGl0IG1ha2VzIG1lIHNsaWdodGx5IHdvbmRlciBpZiAwNCBhbmQgMDkKYXJlIHN3aXRjaGVkLiBCdXQgYXMgbG9uZyBhcyB3ZSBhcmUgd2lsbGluZyB0byBzdGF0ZSB0aGF0IHRoZSBwcmltYXJ5IGRpZmZlcmVuY2UKaXMgYmV0d2VlbiBjYWxwcm90ZWN0aW4gYW5kIGNvbnRyb2wsIHRoZW4gSSB3b3VsZCBzdWdnZXN0IGFnYWluc3QgY29uc2lkZXJpbmcKaXQuICBJIHRoaW5rIGl0IGlzIHJlYXNvbmFibGUgdG8gYXNzdW1lIHRoZSBzYW1wbGVzIGFyZSBub3Qgc3dpdGNoZWQgYW5kIHRoaXMKaXMganVzdCBob3cgdGhleSBhcmUuICBJZiBob3dldmVyLCB0aGUgcHJpbWFyeSBnb2FsIGlzIHRvIGludmVzdGlnYXRlIGNoYW5naW5nCmNvbmNlbnRyYXRpb25zIG9mIGNhbHByb3RlY3RpbiwgdGhlbiBJIHdvdWxkIHdhbnQgdG8gY2hlY2sgaW50byB0aGlzCmRpc3RyaWJ1dGlvbiBvZiBzYW1wbGVzIG9yIG1ha2UgdGhlIHN0YXRlbWVudCB0aGF0IHRoZXNlIHR3byBjb25jZW50cmF0aW9ucyBoYXZlCm5vIHNpZ25pZmljYW50IGRpZmZlcmVuY2UgdW5sZXNzIHdlIGdldCBtb3JlIHNhbXBsZXMgdG8gbG9vayBhdC4KCiMgQ2hlY2sgdG5zZXEgc2F0dXJhdGlvbgoKSSBtb3ZlZCB0aGlzIGFib3ZlIHRoZSBkaWZmZXJlbnRpYWwgImV4cHJlc3Npb24iLyJmaXRuZXNzIiBhbmFseXNpcyBzbyB0aGF0IHdlCmNhbiBhZGQgdGhlIHJlc3VsdHMgZnJvbSBpdCBhcyBhbm5vdGF0aW9uIGRhdGEgdG8gdGhlIERFIHRhYmxlcyBpZiByZXF1ZXN0ZWQuCgpgYGB7ciB0bnNlcV9zYXR1cmF0aW9uX2E5MDksIGV2YWw9RkFMU0V9CnNhdHVyYXRpb25fMDEgPC0gdG5zZXFfc2F0dXJhdGlvbigKICAicHJlcHJvY2Vzc2luZy8wMS9vdXRwdXRzL2Vzc2VudGlhbGl0eV9zYWdhbGFjdGlhZV9hOTA5L3RyaW1tZWRfY2EtdjBNMS53aWciLAogIGFkanVzdD0yKQpzYXR1cmF0aW9uXzAxJHBsb3QKc2F0dXJhdGlvbl8wMSRoaXRzX3N1bW1hcnkKZXNzX3BsdHMgPC0gcGxvdF9lc3NlbnRpYWxpdHkoCiAgInByZXByb2Nlc3NpbmcvMDEvb3V0cHV0cy9lc3NlbnRpYWxpdHlfc2FnYWxhY3RpYWVfYTkwOS9taF9lc3MtdHJpbW1lZF9jYS12ME0xX2dlbmVfdGFzX20yLmNzdiIpCmVzc19wbHRzW1siemJhciJdXQoKc2F0dXJhdGlvbl8wMiA8LSB0bnNlcV9zYXR1cmF0aW9uKAogICJwcmVwcm9jZXNzaW5nLzAyL291dHB1dHMvZXNzZW50aWFsaXR5X3NhZ2FsYWN0aWFlX2E5MDkvdHJpbW1lZF9jYS12ME0xLndpZyIpCnNhdHVyYXRpb25fMDIkcGxvdApzYXR1cmF0aW9uXzAyJGhpdHNfc3VtbWFyeQplc3NfcGx0cyA8LSBwbG90X2Vzc2VudGlhbGl0eSgKICAicHJlcHJvY2Vzc2luZy8wMi9vdXRwdXRzL2Vzc2VudGlhbGl0eV9zYWdhbGFjdGlhZV9hOTA5L21oX2Vzcy10cmltbWVkX2NhLXYwTTFfZ2VuZV90YXNfbTIuY3N2IikKZXNzX3BsdHNbWyJ6YmFyIl1dCgpzYXR1cmF0aW9uXzAzIDwtIHRuc2VxX3NhdHVyYXRpb24oCiAgInByZXByb2Nlc3NpbmcvMDMvb3V0cHV0cy9lc3NlbnRpYWxpdHlfc2FnYWxhY3RpYWVfYTkwOS90cmltbWVkX2NhLXYwTTEud2lnIikKc2F0dXJhdGlvbl8wMyRwbG90CnNhdHVyYXRpb25fMDMkaGl0c19zdW1tYXJ5CmVzc19wbHRzIDwtIHBsb3RfZXNzZW50aWFsaXR5KAogICJwcmVwcm9jZXNzaW5nLzAzL291dHB1dHMvZXNzZW50aWFsaXR5X3NhZ2FsYWN0aWFlX2E5MDkvbWhfZXNzLXRyaW1tZWRfY2EtdjBNMV9nZW5lX3Rhc19tMi5jc3YiKQplc3NfcGx0c1tbInpiYXIiXV0KCnNhdHVyYXRpb25fMDQgPC0gdG5zZXFfc2F0dXJhdGlvbigKICAicHJlcHJvY2Vzc2luZy8wNC9vdXRwdXRzL2Vzc2VudGlhbGl0eV9zYWdhbGFjdGlhZV9hOTA5L3RyaW1tZWRfY2EtdjBNMS53aWciKQpzYXR1cmF0aW9uXzA0JHBsb3QKc2F0dXJhdGlvbl8wNCRoaXRzX3N1bW1hcnkKZXNzX3BsdHMgPC0gcGxvdF9lc3NlbnRpYWxpdHkoCiAgInByZXByb2Nlc3NpbmcvMDQvb3V0cHV0cy9lc3NlbnRpYWxpdHlfc2FnYWxhY3RpYWVfYTkwOS9taF9lc3MtdHJpbW1lZF9jYS12ME0xX2dlbmVfdGFzX20yLmNzdiIpCmVzc19wbHRzW1siemJhciJdXQoKc2F0dXJhdGlvbl8wNSA8LSB0bnNlcV9zYXR1cmF0aW9uKAogICJwcmVwcm9jZXNzaW5nLzA1L291dHB1dHMvZXNzZW50aWFsaXR5X3NhZ2FsYWN0aWFlX2E5MDkvdHJpbW1lZF9jYS12ME0xLndpZyIpCnNhdHVyYXRpb25fMDUkcGxvdApzYXR1cmF0aW9uXzA1JGhpdHNfc3VtbWFyeQplc3NfcGx0cyA8LSBwbG90X2Vzc2VudGlhbGl0eSgKICAicHJlcHJvY2Vzc2luZy8wNi9vdXRwdXRzL2Vzc2VudGlhbGl0eV9zYWdhbGFjdGlhZV9hOTA5L21oX2Vzcy10cmltbWVkX2NhLXYwTTFfZ2VuZV90YXNfbTIuY3N2IikKZXNzX3BsdHNbWyJ6YmFyIl1dCgpzYXR1cmF0aW9uXzA2IDwtIHRuc2VxX3NhdHVyYXRpb24oCiAgInByZXByb2Nlc3NpbmcvMDYvb3V0cHV0cy9lc3NlbnRpYWxpdHlfc2FnYWxhY3RpYWVfYTkwOS90cmltbWVkX2NhLXYwTTEud2lnIikKc2F0dXJhdGlvbl8wNiRwbG90CnNhdHVyYXRpb25fMDYkaGl0c19zdW1tYXJ5CmVzc19wbHRzIDwtIHBsb3RfZXNzZW50aWFsaXR5KAogICJwcmVwcm9jZXNzaW5nLzA2L291dHB1dHMvZXNzZW50aWFsaXR5X3NhZ2FsYWN0aWFlX2E5MDkvbWhfZXNzLXRyaW1tZWRfY2EtdjBNMV9nZW5lX3Rhc19tMi5jc3YiKQplc3NfcGx0c1tbInpiYXIiXV0KCnNhdHVyYXRpb25fMDcgPC0gdG5zZXFfc2F0dXJhdGlvbigKICAicHJlcHJvY2Vzc2luZy8wNy9vdXRwdXRzL2Vzc2VudGlhbGl0eV9zYWdhbGFjdGlhZV9hOTA5L3RyaW1tZWRfY2EtdjBNMS53aWciKQpzYXR1cmF0aW9uXzA3JHBsb3QKc2F0dXJhdGlvbl8wNyRoaXRzX3N1bW1hcnkKZXNzX3BsdHMgPC0gcGxvdF9lc3NlbnRpYWxpdHkoCiAgInByZXByb2Nlc3NpbmcvMDcvb3V0cHV0cy9lc3NlbnRpYWxpdHlfc2FnYWxhY3RpYWVfYTkwOS9taF9lc3MtdHJpbW1lZF9jYS12ME0xX2dlbmVfdGFzX20yLmNzdiIpCmVzc19wbHRzW1siemJhciJdXQoKc2F0dXJhdGlvbl8wOCA8LSB0bnNlcV9zYXR1cmF0aW9uKAogICJwcmVwcm9jZXNzaW5nLzA4L291dHB1dHMvZXNzZW50aWFsaXR5X3NhZ2FsYWN0aWFlX2E5MDkvdHJpbW1lZF9jYS12ME0xLndpZyIpCnNhdHVyYXRpb25fMDgkcGxvdApzYXR1cmF0aW9uXzA4JGhpdHNfc3VtbWFyeQplc3NfcGx0cyA8LSBwbG90X2Vzc2VudGlhbGl0eSgKICAicHJlcHJvY2Vzc2luZy8wOC9vdXRwdXRzL2Vzc2VudGlhbGl0eV9zYWdhbGFjdGlhZV9hOTA5L21oX2Vzcy10cmltbWVkX2NhLXYwTTFfZ2VuZV90YXNfbTIuY3N2IikKZXNzX3BsdHNbWyJ6YmFyIl1dCgpzYXR1cmF0aW9uXzA5IDwtIHRuc2VxX3NhdHVyYXRpb24oCiAgInByZXByb2Nlc3NpbmcvMDkvb3V0cHV0cy9lc3NlbnRpYWxpdHlfc2FnYWxhY3RpYWVfYTkwOS90cmltbWVkX2NhLXYwTTEud2lnIikKc2F0dXJhdGlvbl8wOSRwbG90CnNhdHVyYXRpb25fMDkkaGl0c19zdW1tYXJ5CmVzc19wbHRzIDwtIHBsb3RfZXNzZW50aWFsaXR5KAogICJwcmVwcm9jZXNzaW5nLzA5L291dHB1dHMvZXNzZW50aWFsaXR5X3NhZ2FsYWN0aWFlX2E5MDkvbWhfZXNzLXRyaW1tZWRfY2EtdjBNMV9nZW5lX3Rhc19tMi5jc3YiKQplc3NfcGx0c1tbInpiYXIiXV0KCnNhdHVyYXRpb25fY29udHJvbCA8LSB0bnNlcV9zYXR1cmF0aW9uKAogICAgInByZXByb2Nlc3NpbmcvY29tYmluZWRfY29udHJvbC9vdXRwdXRzL2Vzc2VudGlhbGl0eV9zYWdhbGFjdGlhZV9hOTA5L3RyaW1tZWRfY2EtdjFtMS53aWciKQpzYXR1cmF0aW9uX2NvbnRyb2wkcGxvdAplc3NfcGx0cyA8LSBwbG90X2Vzc2VudGlhbGl0eSgKICAgICJwcmVwcm9jZXNzaW5nL2NvbWJpbmVkX2NvbnRyb2wvb3V0cHV0cy9lc3NlbnRpYWxpdHlfc2FnYWxhY3RpYWVfYTkwOS9taF9lc3MtdHJpbW1lZF9jYS12MW0xX2dlbmVfdGFzX20yLmNzdiIpCmVzc19wbHRzW1siemJhciJdXQoKcGx0IDwtIHNtKHRuc2VxX211bHRpX3NhdHVyYXRpb24obWV0YT1wRGF0YShhOTA5X2V4cHQpLCBtZXRhX2NvbHVtbj0iYTkwOWVzc3dpZyIpKQpwbHQkZ2dzdGF0cwpgYGAKCmBgYHtyIHRuc2VxX2NqYjExMV9wbG90fQpwbHQgPC0gdG5zZXFfbXVsdGlfc2F0dXJhdGlvbihtZXRhPXBEYXRhKGNqYjExMV9leHB0KSwgbWV0YV9jb2x1bW49ImNqYjExMWVzc3dpZyIpCnBsdFtbInBsb3QiXV0gKyBnZ3Bsb3QyOjpzY2FsZV95X2NvbnRpbnVvdXMobGltaXRzPWMoMCwgMTIwMDApKQojIyBJIGV4cGVjdCB0aGUgc2F0dXJhdGlvbiBvZiB0aGlzIHRvIGJlIGEgYml0IGJldHRlciB0aGFuIDI2MDNWL1IuCgpwbHQgPC0gdG5zZXFfbXVsdGlfc2F0dXJhdGlvbihtZXRhPXBEYXRhKHZyMjYwM19leHB0KSwgbWV0YV9jb2x1bW49InZyMjYwM2Vzc3dpZyIpCnBsdFtbInBsb3QiXV0gKyBnZ3Bsb3QyOjpzY2FsZV95X2NvbnRpbnVvdXMobGltaXRzPWMoMCwgMTIwMDApKQojIyBobW0gdGhpcyBpcyBub3QgZGVmaW5pdGl2ZS4gIEl0IGxvb2tzIGxpa2UgY2piMTExIGhhcyBtb3JlIFRBcyB3aXRoIH4gMSBoaXQuCiMjIGJ1dCBSL1YgaGFzIG1vcmUgaGl0cyB3aXRoIH4gMTY8eDw2NCBoaXRzLgoKcGx0IDwtIHRuc2VxX211bHRpX3NhdHVyYXRpb24obWV0YT1wRGF0YShhOTA5X2V4cHQpLCBtZXRhX2NvbHVtbj0iYTkwOWVzc3dpZyIpCnBsdFtbInBsb3QiXV0gKyBnZ3Bsb3QyOjpzY2FsZV95X2NvbnRpbnVvdXMobGltaXRzPWMoMCwgMjAwMDApKQojIyBJIGFtIG5vdCBxdWl0ZSBzdXJlIGhvdyB0byBpbnRlcnByZXQgdGhpcyBvbmUsIHdlIGhhdmUgbXVjaCBtb3JlIGRpc2NyZXRlCiMjIG51bWJlcnMgb2YgcmVhZHMgdGhhbiB0aGUgb3RoZXJzLgpgYGAKCiMgQ2hhbmdlZCBnZW5lcwoKRm9yIGRpZmZlcmVudGlhbCBleHByZXNzaW9uLCBJIGFtIGdvaW5nIHRvIGFzc3VtZSB1bnRpbCBJIGhlYXIgb3RoZXJ3aXNlLCB0aGF0Cm15IGJhdGNoIGFzc2lnbm1lbnRzIGFyZSBub3QgY29ycmVjdCBhbmQgdGhhdCB0aGUgMSwyLDMgYXNzaWdubWVudHMgb2YgdGhlCnNhbXBsZSBuYW1lcyBkbyBub3QgYWN0dWFsbHkgZGVsaW5lYXRlIHNlcGFyYXRlIGJhdGNoZXMuICBUaG91Z2gsIGlmIHRoZXkgX2RvXwpkZWxpbmVhdGUgc2VwYXJhdGUgYmF0Y2hlcywgaXQgbWlnaHQgYmUgdGFrZW4gYXMgYSAodmVyeSlzbWFsbCBkZWdyZWUgb2YgZXZpZGVuY2UgdGhhdAowNCBhbmQgMDkgd2VyZSBzd2l0Y2hlZC4KCiMjIFN0cmFpbiBhOTA5CgpgYGB7ciBkZV9hOTA5fQpjb21iaW5lZF9lc3NlbnRpYWxpdHkgPC0gbGlzdCgKICAiY29udHJvbCIgPSAicHJlcHJvY2Vzc2luZy9jb21iaW5lZF9jb250cm9sL291dHB1dHMvZXNzZW50aWFsaXR5X3NhZ2FsYWN0aWFlX2E5MDkvbWhfZXNzLXRyaW1tZWRfY2EtdjFtMV9nZW5lX3Rhc19tMi5jc3YiLAogICJsb3ciID0gInByZXByb2Nlc3NpbmcvY29tYmluZWRfbG93L291dHB1dHMvZXNzZW50aWFsaXR5X3NhZ2FsYWN0aWFlX2E5MDkvbWhfZXNzLXRyaW1tZWRfY2EtdjFtMV9nZW5lX3Rhc19tMi5jc3YiLAogICJoaWdoIiA9ICJwcmVwcm9jZXNzaW5nL2NvbWJpbmVkX2hpZ2gvb3V0cHV0cy9lc3NlbnRpYWxpdHlfc2FnYWxhY3RpYWVfYTkwOS9taF9lc3MtdHJpbW1lZF9jYS12MW0xX2dlbmVfdGFzX20yLmNzdiIsCiAgInByZXZpb3VzIiA9ICJwcmVwcm9jZXNzaW5nL2NvbWJpbmVkX3ByZXZpb3VzL291dHB1dHMvZXNzZW50aWFsaXR5X3NhZ2FsYWN0aWFlX2E5MDkvbWhfZXNzLWNvbWJpbmVkX2NhX3RhLXYwTTFfZ2VuZV90YXNfbTIuY3N2IikKZXNzX3RhYmxlIDwtIGRhdGEuZnJhbWUoKQpmb3IgKGYgaW4gMTpsZW5ndGgoY29tYmluZWRfZXNzZW50aWFsaXR5KSkgewogIG5hbWUgPC0gbmFtZXMoY29tYmluZWRfZXNzZW50aWFsaXR5KVtmXQogIGNvbHVtbl9uYW1lcyA8LSBjKCJvcmYiLCAiayIsICJuIiwgInIiLCAicyIsICJ6YmFyIiwgImNhbGwiKQogIG5hbWVzIDwtIHBhc3RlMChuYW1lLCAiXyIsIGNvbHVtbl9uYW1lcykKICByIDwtIHJlYWRyOjpyZWFkX3Rzdihjb21iaW5lZF9lc3NlbnRpYWxpdHlbW2ZdXSwgY29tbWVudD0iIyIsIGNvbF9uYW1lcz1uYW1lcykKICBjb2xuYW1lcyhyKVsxXSA8LSAib3JmIgogIGlmIChmID09IDEpIHsKICAgIGVzc190YWJsZSA8LSByCiAgfSBlbHNlIHsKICAgIGVzc190YWJsZSA8LSBtZXJnZShlc3NfdGFibGUsIHIsIGJ5PSJvcmYiKQogIH0KfQpyb3duYW1lcyhlc3NfdGFibGUpIDwtIGdzdWIoeD1lc3NfdGFibGVbWyJvcmYiXV0sIHBhdHRlcm49Il5jZHNfIiwgcmVwbGFjZW1lbnQ9IiIpCmVzc190YWJsZVtbIm9yZiJdXSA8LSBOVUxMCgphOTA5X2RlIDwtIGFsbF9wYWlyd2lzZShhOTA5X2V4cHQsIG1vZGVsX2JhdGNoPUZBTFNFLCBwYXJhbGxlbD1GQUxTRSkKYTkwOV9jb250cmFzdHMgPC0gbGlzdCgKICAibG93X3ZzX2NvbnRyb2wiID0gYygiY2FsX2xvdyIsICJjb250cm9sIiksCiAgImhpZ2hfdnNfY29udHJvbCIgPSBjKCJjYWxfaGlnaCIsICJjb250cm9sIikpCmE5MDlfdGFibGVzIDwtIGNvbWJpbmVfZGVfdGFibGVzKAogIGV4dHJhX2Fubm90PWVzc190YWJsZSwKICBhOTA5X2RlLCBrZWVwZXJzPWE5MDlfY29udHJhc3RzLAogIGV4Y2VsPWdsdWU6OmdsdWUoImV4Y2VsL3tydW5kYXRlfS1hOTA5X3RhYmxlcy12e3Zlcn0ueGxzeCIpKQojI2E5MDlfc2lnIDwtIGV4dHJhY3Rfc2lnbmlmaWNhbnRfZ2VuZXMoCiMjICBhOTA5X3RhYmxlcywKIyMgIGV4Y2VsPWdsdWU6OmdsdWUoImV4Y2VsL2E5MDlfc2lnLXZ7dmVyfS54bHN4IikpCmBgYAoKIyMgU3RyYWluIDI2MDNWL1IKCmBgYHtyIGRlXzI2MDN2cn0KdnIyNjAzX2RlIDwtIGFsbF9wYWlyd2lzZSh2cjI2MDNfZXhwdCwgbW9kZWxfYmF0Y2g9RkFMU0UsIHBhcmFsbGVsPUZBTFNFKQp2cjI2MDNfdGFibGVzIDwtIGNvbWJpbmVfZGVfdGFibGVzKAogIHZyMjYwM19kZSwga2VlcGVycz1hOTA5X2NvbnRyYXN0cywKICBleGNlbD1nbHVlOjpnbHVlKCJleGNlbC97cnVuZGF0ZX0tdnIyNjAzX3RhYmxlcy12e3Zlcn0ueGxzeCIpKQojI3ZyMjYzMF9zaWcgPC0gZXh0cmFjdF9zaWduaWZpY2FudF9nZW5lcygKIyMgIHZyMjYwM190YWJsZXMsCiMjICBleGNlbD1nbHVlOjpnbHVlKCJleGNlbC97cnVuZGF0ZX0tdnIyNjAzX3NpZy12e3Zlcn0ueGxzeCIpKQpgYGAKCiMjIFN0cmFpbiBDSkIxMTEKCmBgYHtyIGRlX2NqYjExMX0KY2piMTExX2RlIDwtIGFsbF9wYWlyd2lzZShjamIxMTFfZXhwdCwgbW9kZWxfYmF0Y2g9RkFMU0UsIHBhcmFsbGVsPUZBTFNFKQpjamIxMTFfdGFibGVzIDwtIGNvbWJpbmVfZGVfdGFibGVzKAogIGNqYjExMV9kZSwga2VlcGVycz1hOTA5X2NvbnRyYXN0cywKICBleGNlbD1nbHVlOjpnbHVlKCJleGNlbC97cnVuZGF0ZX0tY2piMTExX3RhYmxlcy12e3Zlcn0ueGxzeCIpKQojI2NqYjExMV9zaWcgPC0gZXh0cmFjdF9zaWduaWZpY2FudF9nZW5lcygKIyMgIGE5MDlfdGFibGVzLAojIyAgZXhjZWw9Z2x1ZTo6Z2x1ZSgiZXhjZWwve3J1bmRhdGV9LWNqYjExMV9zaWctdnt2ZXJ9Lnhsc3giKSkKYGBgCgojIENpcmNvcwoKYGBge3IgY2lyY29zfQpjb21iaW5lZF9leHB0IDwtIGNyZWF0ZV9leHB0KCJzYW1wbGVfc2hlZXRzL3NhZ2FsYWN0aWFlX2NvbWJpbmVkX3NhbXBsZXMueGxzeCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2VuZV9pbmZvPWE5MDlfYW5ub3QpCmNvbWJpbmVkX25vcm0gPC0gbm9ybWFsaXplX2V4cHQoY29tYmluZWRfZXhwdCwgY29udmVydD0icnBrbSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNmb3JtPSJsb2cyIiwgbmFfdG9femVybz1UUlVFKQpjb21iaW5lZF9leHBycyA8LSBleHBycyhjb21iaW5lZF9ub3JtKQoKZXNzX2NpcmNvcyA8LSBlc3NfdGFibGVbLCBjKCJjb250cm9sX2NhbGwiLCAibG93X2NhbGwiLCAiaGlnaF9jYWxsIildICU+JQogICAgZHBseXI6Om11dGF0ZShjb250cm9sX251bSA9IGRwbHlyOjpjYXNlX3doZW4oCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250cm9sX2NhbGwgPT0gIkUiIH4gMiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRyb2xfY2FsbCA9PSAiTkUiIH4gMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRyb2xfY2FsbCA9PSAiUyIgfiAtMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRyb2xfY2FsbCA9PSAiVSIgfiAxKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgbG93X251bSA9IGRwbHlyOjpjYXNlX3doZW4oCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvd19jYWxsID09ICJFIiB+IDIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvd19jYWxsID09ICJORSIgfiAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb3dfY2FsbCA9PSAiUyIgfiAtMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG93X2NhbGwgPT0gIlUiIH4gMSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGhpZ2hfbnVtID0gZHBseXI6OmNhc2Vfd2hlbigKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhpZ2hfY2FsbCA9PSAiRSIgfiAyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGlnaF9jYWxsID09ICJORSIgfiAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGlnaF9jYWxsID09ICJTIiB+IC0xLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGlnaF9jYWxsID09ICJVIiB+IDEpKQplc3NfY2lyY29zW1siY29udHJvbF9jYWxsIl1dIDwtIGFzLmZhY3Rvcihlc3NfY2lyY29zW1siY29udHJvbF9jYWxsIl1dKQplc3NfY2lyY29zW1sibG93X2NhbGwiXV0gPC0gYXMuZmFjdG9yKGVzc19jaXJjb3NbWyJsb3dfY2FsbCJdXSkKZXNzX2NpcmNvc1tbImhpZ2hfY2FsbCJdXSA8LSBhcy5mYWN0b3IoZXNzX2NpcmNvc1tbImhpZ2hfY2FsbCJdXSkKcm93bmFtZXMoZXNzX2NpcmNvcykgPC0gcm93bmFtZXMoZXNzX3RhYmxlKQoKY29sb3JzIDwtIGMoIjk5MDAwMCIsICIwMDg4MDAiLCAiMDAwMDAwIiwgIjAwMDBBQSIpCm5hbWVzKGNvbG9ycykgPC0gYygiRSIsICJORSIsICJTIiwgIlUiKQpsb3dfZGYgPC0gYTkwOV90YWJsZXNbWyJkYXRhIl1dW1sibG93X3ZzX2NvbnRyb2wiXV0KaGlnaF9kZiA8LSBhOTA5X3RhYmxlc1tbImRhdGEiXV1bWyJoaWdoX3ZzX2NvbnRyb2wiXV0KCmNpcmNvc19jZmcgPC0gY2lyY29zX3ByZWZpeChhOTA5X2Fubm90LCBuYW1lPSJhOTA5IikKYTkwOV9rYXJ5IDwtIGNpcmNvc19rYXJ5b3R5cGUoY2lyY29zX2NmZywgZmFzdGE9InJlZmVyZW5jZS9zYWdhbGFjdGlhZV9hOTA5LmZhc3RhIikKYTkwOV9wbHVzX21pbnVzIDwtIGNpcmNvc19wbHVzX21pbnVzKGNpcmNvc19jZmcsIHdpZHRoPTAuMDYsIHRoaWNrbmVzcz00MCkKYTkwOV9jb250cm9sX3Jwa20gPC0gY2lyY29zX2hpc3QoY2lyY29zX2NmZywgY29tYmluZWRfZXhwcnMsIGNvbG5hbWU9ImNvbnRyb2wiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYXNlbmFtZT0iY29udHJvbF9ycGttIiwgb3V0ZXI9YTkwOV9wbHVzX21pbnVzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxsX2NvbG9yPSJ2dmRwYmx1ZSIsIHdpZHRoPTAuMDYpCmE5MDlfbG93X3Jwa20gPC0gY2lyY29zX2hpc3QoY2lyY29zX2NmZywgY29tYmluZWRfZXhwcnMsIGNvbG5hbWU9ImxvdyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFzZW5hbWU9Imxvd19ycGttIiwgb3V0ZXI9YTkwOV9jb250cm9sX3Jwa20sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsbF9jb2xvcj0idmRwYmx1ZSIsIHdpZHRoPTAuMDYpCmE5MDlfaGlnaF9ycGttIDwtIGNpcmNvc19oaXN0KGNpcmNvc19jZmcsIGNvbWJpbmVkX2V4cHJzLCBjb2xuYW1lPSJoaWdoIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFzZW5hbWU9ImhpZ2hfcnBrbSIsIG91dGVyPWE5MDlfbG93X3Jwa20sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGxfY29sb3I9ImRwYmx1ZSIsIHdpZHRoPTAuMDYpCmE5MDlfY29udHJvbF90aWxlIDwtIGNpcmNvc190aWxlKGNpcmNvc19jZmcsIGVzc19jaXJjb3MsIGNvbG5hbWU9ImNvbnRyb2xfY2FsbCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbG9ycz1jb2xvcnMsIGJhc2VuYW1lPSJjb250cm9sX3RpbGUiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRlcj1hOTA5X2hpZ2hfcnBrbSwgd2lkdGg9MC4wNikKYTkwOV9sb3cgPC0gY2lyY29zX2hpc3QoY2lyY29zX2NmZywgbG93X2RmLCBjb2xuYW1lPSJkZXNlcV9sb2dmYyIsIGJhc2VuYW1lPSJsb3ciLAogICAgICAgICAgICAgICAgICAgICAgICBvdXRlcj0wLjYwLCBmaWxsX2NvbG9yPSJ2dmRwZ3JlZW4iLCB3aWR0aD0wLjA2LCB0aGlja25lc3M9MC4xKQphOTA5X2hpZ2ggPC0gY2lyY29zX2hpc3QoY2lyY29zX2NmZywgaGlnaF9kZiwgY29sbmFtZT0iZGVzZXFfbG9nZmMiLCBiYXNlbmFtZT0iaGlnaCIsCiAgICAgICAgICAgICAgICAgICAgICAgICBvdXRlcj1hOTA5X2xvdywgZmlsbF9jb2xvcj0idmRwZ3JlZW4iLCB3aWR0aD0wLjA2LCB0aGlja25lc3M9MC4xKQphOTA5X3N1ZmZpeCA8LSBjaXJjb3Nfc3VmZml4KGNpcmNvc19jZmcpCm1hZGUgPC0gY2lyY29zX21ha2UoY2lyY29zX2NmZywgdGFyZ2V0PSJhOTA5IikKYGBgCgpZb2FubiBzZW50IGFuIGVtYWlsIHRoaXMgbW9ybmluZyB3aXRoIHRoZSBmb2xsb3dpbmcgcmVxdWVzdDoKCiJJIGhhdmUgbm93IHRoZSB0YWJsZSBzdW1tYXJpemluZyB0aGUgZGF0YSBhbmQgd2Ugd291bGQgbGlrZSB0byBzdW1tYXJpemUgaXQKd2l0aCBhIENpcmNvcyBwbG90LiBJIHdhcyBob3BpbmcgeW91IGNvdWxkIGRvIHlvdXIgYW1hemluZyBtYWdpYyBvbiB0aGlzLiBUaGUKZGF0YSBpcyBpbiB0aGUgRXhjZWwgZmlsZSBJIGFtIGF0dGFjaGluZyB0byB0aGUgZW1haWwuIFRoZSBmaWd1cmUgd291bGQgbG9vawp2ZXJ5IHNpbWlsYXIgdG8gd2hhdCB5b3UgZGlkIG5vdCB0b28gbG9uZyBhZ28sIGJ1dCB3aXRoIGV4dHJhIGRhdGEuIFRoZSBpZGVhCndpbGwgYmUgdG8gaGF2ZSB0aGUgZ2Vub21lIGluZm9ybWF0aW9uIGFuZCB0aGVuIGdvaW5nIGRvd24gaW50byB0aGUgY2lyY2xlIHdlCndvdWxkIHNob3cgdGhlIFRIWSBkYXRhIChpbiBjb2x1bW4gQkUpLCB0aGFuIG1heWJlIGEgbGl0dGxlIHNwYWNlIGFuZCB3ZSB3b3VsZApzaG93IHRoZSBSUE1JLWJhc2VkIGRhdGEgKEJMLCBCUyBhbmQgQlopLCB0aGVuIGFnYWluIGEgbGl0dGxlIHNwYWNlIGFuZCB3ZSB3b3VsZApoYXZlIGEgZmluYWwgY2lyY2xlIGludGVncmF0aW5nIGFsbCBwcmV2aW91cyBkYXRhIGZvciB0aGUgZmluYWwgY2FsbCAoQ0kpLiIKCkkgY29waWVkIHRoZSB4bHMgZmlsZSB0byB0aGUgJ2Zyb21feW9hbm4vJyBkaXJlY3RvcnkgYW5kIGV4cG9ydGVkIHRoZSByZWxldmFudApwb3J0aW9ucyB0byBhIGNzdiBmaWxlIG5hbWVkICdnYnNfZXNzZW50aWFsaXR5LmNzdicuCgpJIGp1c3QgcmVhbGl6ZWQgdGhhdCB0aGUgbWF0ZXJpYWwgWW9hbm4gc2VudCBtZSBpcyBwcmVjaXNlbHkgd2hhdCBJIGFscmVhZHkgZGlkCmluIHRoZSBhYm92ZSBzZWN0aW9uIHdoaWNoIGNyZWF0ZWQgdGhlIGVzc19jaXJjb3MgdGFibGUuCgpgYGB7ciBuZXdfY2lyY29zfQp5b2Fubl90YWJsZSA8LSByZWFkcjo6cmVhZF9jc3YoImZyb21feW9hbm4vZ2JzX2Vzc2VudGlhbGl0eS5jc3YiKQojIyBUaGUgbmV3IGNvbHVtbiB3aGljaCBpcyBkZXNpcmVkIGlzIGFjdHVhbGx5IHRoZSAnRmluYWwnLgojIyBTbywgSSB3aWxsIG1lcmdlIHRoaXMgd2l0aCBteSBleGlzdGluZyBlc3NfY2lyY29zIGRhdGEgZnJhbWUgYW5kIGFkZCBhIGNvbG9yIGZvciAnTkMnLgojIyBUaGUgd2FudGVkIGNvbHVtbiBuYW1lcyBhcmU6CiMjIEJFOiBwcmV2aW91c2NhbGwgQkw6IGNvbnRyb2xjYWxsIEJTOiBsb3djYWxsIEJaOiBoaWdoY2FsbCBDSTogJ0ZpbmFsIGNhbGwnICg4NSkKd2FudGVkIDwtIGMoImNvbnRyb2xjYWxsIiwgIkZpbmFsIikKeW9hbm5fd2FudGVkIDwtIGFzLmRhdGEuZnJhbWUoeW9hbm5fdGFibGVbLCB3YW50ZWRdKQpyb3duYW1lcyh5b2Fubl93YW50ZWQpIDwtIHlvYW5uX3RhYmxlW1sicm93Lm5hbWVzIl1dCgp5b2Fubl9jaXJjb3MgPC0gbWVyZ2UoZXNzX2NpcmNvcywgeW9hbm5fd2FudGVkLCBieS54PSJyb3cubmFtZXMiLCBieS55PSJyb3cubmFtZXMiKQp5b2Fubl9jaXJjb3NbWyJGaW5hbCJdXSA8LSBhcy5mYWN0b3IoeW9hbm5fY2lyY29zW1siRmluYWwiXV0pCnJvd25hbWVzKHlvYW5uX2NpcmNvcykgPC0geW9hbm5fY2lyY29zW1siUm93Lm5hbWVzIl1dCnlvYW5uX2NpcmNvc1tbIlJvdy5uYW1lcyJdXSA8LSBOVUxMCmNvbG9ycyA8LSBjKCI5OTAwMDAiLCAiMDA4ODAwIiwgIjQ0NDQ0NCIsICIwMDAwQUEiLCAiMDAwMDAwIikKbmFtZXMoY29sb3JzKSA8LSBjKCJFIiwgIk5FIiwgIlMiLCAiVSIsICJOQyIpCgp5b2Fubl9jZmcgPC0gY2lyY29zX3ByZWZpeChhOTA5X2Fubm90LCBuYW1lPSJhOTA5X3lvYW5uIikKeW9hbm5fa2FyeSA8LSBjaXJjb3Nfa2FyeW90eXBlKHlvYW5uX2NmZywgZmFzdGE9InJlZmVyZW5jZS9zYWdhbGFjdGlhZV9hOTA5LmZhc3RhIikKeW9hbm5fcGx1c19taW51cyA8LSBjaXJjb3NfcGx1c19taW51cyh5b2Fubl9jZmcsIHdpZHRoPTAuMDYsIHRoaWNrbmVzcz00MCkKeW9hbm5fY29udHJvbF90aWxlIDwtIGNpcmNvc190aWxlKHlvYW5uX2NmZywgZXNzX2NpcmNvcywgY29sbmFtZT0iY29udHJvbF9jYWxsIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbG9ycz1jb2xvcnMsIGJhc2VuYW1lPSJjb250cm9sX3RpbGUiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0ZXI9eW9hbm5fcGx1c19taW51cywgd2lkdGg9MC4wNikKeW9hbm5fbG93X3RpbGUgPC0gY2lyY29zX3RpbGUoeW9hbm5fY2ZnLCBlc3NfY2lyY29zLCBjb2xuYW1lPSJsb3dfY2FsbCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbG9ycz1jb2xvcnMsIGJhc2VuYW1lPSJsb3dfdGlsZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dGVyPXlvYW5uX2NvbnRyb2xfdGlsZSwgd2lkdGg9MC4wNikKeW9hbm5faGlnaF90aWxlIDwtIGNpcmNvc190aWxlKHlvYW5uX2NmZywgZXNzX2NpcmNvcywgY29sbmFtZT0iaGlnaF9jYWxsIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sb3JzPWNvbG9ycywgYmFzZW5hbWU9ImhpZ2hfdGlsZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dGVyPXlvYW5uX2xvd190aWxlLCB3aWR0aD0wLjA2KQp5b2Fubl9maW5hbF90aWxlIDwtIGNpcmNvc190aWxlKHlvYW5uX2NmZywgeW9hbm5fY2lyY29zLCBjb2xuYW1lPSJGaW5hbCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sb3JzPWNvbG9ycywgYmFzZW5hbWU9ImZpbmFsX3RpbGUiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dGVyPXlvYW5uX2hpZ2hfdGlsZSwgd2lkdGg9MC4wNikKeW9hbm5fc3VmZml4IDwtIGNpcmNvc19zdWZmaXgoeW9hbm5fY2ZnKQptYWRlIDwtIGNpcmNvc19tYWtlKHlvYW5uX2NmZywgdGFyZ2V0PSJhOTA5X3lvYW5uIikKYGBgCgojIEFub3RoZXIgWW9hbm4gcXVlcnkKCiBGaXJzdCwgYmV0d2VlbiB0aGUgQ09HIGNhdGVnb3JpZXMgYW5kIHRoZSBUSFkgZGF0YSwgSSB3b3VsZCBsaWtlIHRvIGFkZCB0aGUKIHNhdHVyYXRpb24gbGV2ZWwgb2YgdGhlIGxpYnJhcnk6IHRoaXMgd291bGQgYmUgdGhlIGJsdWUgbGluZXMgZnJvbSB0aGUgQ2lyY29zCiBmaWd1cmUgeW91IHByb2R1Y2UgYSB3aGlsZSBiYWNrIChzZWUgQ2lyY29zIHBsb3QgYXR0YWNoZWQgdG8gdGhpcyBlbWFpbCkuCgogU2Vjb25kLCBJIHdvdWxkIGxpa2UgdG8gYWRkIGEgbmV3IHJpbmcgb2YgZXNzZW50aWFsaXR5IHRoYXQgc3VtbWFyaXplcyB0aGUgZGF0YQogZnJvbSB0aGUgcmluZ3MgKDEpLCAoMiksICgzKSBhbmQgKDQpIGFib3ZlbWVudGlvbmVkLiBUaGUgZGF0YSBpcyBsaXN0ZWQgaW4gdGhlCiBhdHRhY2hlZCBFeGNlbCBkb2N1bWVudCBhbmQgaXMgZm91bmQgaW4gY29sdW1uIENJLCBjYWxsZWQgTGluZHNleSdzIGNhbGwuIEkKIHdvdWxkIGxpa2UgdGhlIGRhdGEgdG8gbG9vayBhIGxpdHRsZSBkaWZmZXJlbnQgc28gaXQgInBvcHMiIGFzIGl0IGlzIGEKIHN1bW1hcnkuIEkgcmVtZW1iZXIgYmFjayBpbiB0aGUgZGF5LCB3ZSBkaWQgc29tZXRoaW5nIHNpbWlsYXIgd2l0aCBzb21lIG9mIG15CiBkYXRhIGluIEdyb3VwIEEgc3RyZXAsIGFuZCB3ZSBoYWQgdGhlIG5vbi1lc3NlbnRpYWwgZ2VuZXMgc2hvd2luZyBpbiB5ZWxsb3cuCgogIEluIG9yZGVyIHRvIGRvIHRoZSBhYm92ZSwgSSBzYXZlZCB0aGUgZXhjZWwgZmlsZSBZb2FubiBzZW50IG1lLCBleHBvcnRlZCB0aGUKICByZWxldmFudCBjb2x1bW4gdG8gYSAyIGNvbHVtbiBjdnMgZmlsZSwgY29udGFpbmluZyB0aGUgZ2VuZSBJRHMgYW5kIGNhbGxzLgogIE5vdyBJIHdpbGwgY29weS9wYXN0ZSB0aGUgcHJldmlvdXMgc2V0IG9mIHJpbmdzIGFuZCBhZGQgdGhlIG5ldyByZXF1ZXN0cy4KCmBgYHtyIHlvYW5uXzIwMjAwNn0KeW9hbm5fMjAyMDA2IDwtIHJlYWRyOjpyZWFkX2NzdigiZnJvbV95b2Fubi9saW5kc2V5X2NhbGxzLmNzdiIpCnlvYW5uXzIwMjAwNiA8LSBhcy5kYXRhLmZyYW1lKHlvYW5uXzIwMjAwNikKcm93bmFtZXMoeW9hbm5fMjAyMDA2KSA8LSB5b2Fubl8yMDIwMDZbWyJJRCJdXQpjb2xuYW1lcyh5b2Fubl8yMDIwMDYpIDwtIGMoIklEMjAyMDA2IiwgImxpbmRzZXlfY2FsbCIpCgpsaW5kc2V5X2NvbG9ycyA8LSBjKCJlMzEyMTIiLCAiZjBjNTA1IiwgIjQ0NDQ0NCIsICIwMDAwQUEiLCAiMDAwMDAwIikKbmFtZXMobGluZHNleV9jb2xvcnMpIDwtIGMoIkUiLCAiTkUiLCAiUyIsICJVIiwgIk5DIikKCnlvYW5uX2NpcmNvc18yMDIwMDYgPC0gbWVyZ2UoeW9hbm5fY2lyY29zLCB5b2Fubl8yMDIwMDYsIGJ5Lng9InJvdy5uYW1lcyIsIGJ5Lnk9InJvdy5uYW1lcyIpCnJvd25hbWVzKHlvYW5uX2NpcmNvc18yMDIwMDYpIDwtIHlvYW5uX2NpcmNvc18yMDIwMDZbWyJSb3cubmFtZXMiXV0KeW9hbm5fY2lyY29zXzIwMjAwNltbIlJvdy5uYW1lcyJdXSA8LSBOVUxMCgp5b2Fubl9jZmdfMjAyMDA2IDwtIGNpcmNvc19wcmVmaXgoYTkwOV9hbm5vdCwgbmFtZT0iYTkwOV95b2Fubl8yMDIwMDYiKQp5b2Fubl9rYXJ5XzIwMjAwNiA8LSBjaXJjb3Nfa2FyeW90eXBlKHlvYW5uX2NmZ18yMDIwMDYsIGZhc3RhPSJyZWZlcmVuY2Uvc2FnYWxhY3RpYWVfYTkwOS5mYXN0YSIpCnlvYW5uX3BsdXNfbWludXNfMjAyMDA2IDwtIGNpcmNvc19wbHVzX21pbnVzKHlvYW5uX2NmZ18yMDIwMDYsIHdpZHRoPTAuMDUsIHRoaWNrbmVzcz00MCkKYTkwOV9jb250cm9sX3Jwa21fMjAyMDA2IDwtIGNpcmNvc19oaXN0KHlvYW5uX2NmZ18yMDIwMDYsIGNvbWJpbmVkX2V4cHJzLCBjb2xuYW1lPSJjb250cm9sIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhc2VuYW1lPSJjb250cm9sX3Jwa20iLCBvdXRlcj15b2Fubl9wbHVzX21pbnVzXzIwMjAwNiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGxfY29sb3I9InZ2ZHBibHVlIiwgd2lkdGg9MC4wNSkKYTkwOV9sb3dfcnBrbV8yMDIwMDYgPC0gY2lyY29zX2hpc3QoeW9hbm5fY2ZnXzIwMjAwNiwgY29tYmluZWRfZXhwcnMsIGNvbG5hbWU9ImxvdyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhc2VuYW1lPSJsb3dfcnBrbSIsIG91dGVyPWE5MDlfY29udHJvbF9ycGttXzIwMjAwNiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsbF9jb2xvcj0idmRwYmx1ZSIsIHdpZHRoPTAuMDUpCmE5MDlfaGlnaF9ycGttXzIwMjAwNiA8LSBjaXJjb3NfaGlzdCh5b2Fubl9jZmdfMjAyMDA2LCBjb21iaW5lZF9leHBycywgY29sbmFtZT0iaGlnaCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYXNlbmFtZT0iaGlnaF9ycGttIiwgb3V0ZXI9YTkwOV9sb3dfcnBrbV8yMDIwMDYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxsX2NvbG9yPSJkcGJsdWUiLCB3aWR0aD0wLjA1KQpsaW5kc2V5X3RpbGVfMjAyMDA2IDwtIGNpcmNvc190aWxlKHlvYW5uX2NmZ18yMDIwMDYsIHlvYW5uX2NpcmNvc18yMDIwMDYsIGNvbG5hbWU9ImxpbmRzZXlfY2FsbCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sb3JzPWxpbmRzZXlfY29sb3JzLCBiYXNlbmFtZT0ic3VtbWFyeV90aWxlIiwgdGhpY2tuZXNzPTYwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZV90aGlja25lc3M9MC4wMDEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0ZXI9YTkwOV9oaWdoX3Jwa21fMjAyMDA2LCB3aWR0aD0wLjA1KQp5b2Fubl9jb250cm9sX3RpbGVfMjAyMDA2IDwtIGNpcmNvc190aWxlKHlvYW5uX2NmZ18yMDIwMDYsIGVzc19jaXJjb3MsIGNvbG5hbWU9ImNvbnRyb2xfY2FsbCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sb3JzPWNvbG9ycywgYmFzZW5hbWU9ImNvbnRyb2xfdGlsZSIsIHRoaWNrbmVzcz02MCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJva2VfdGhpY2tuZXNzPTAuMDAxLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dGVyPWxpbmRzZXlfdGlsZV8yMDIwMDYsIHdpZHRoPTAuMDUpCnlvYW5uX2xvd190aWxlXzIwMjAwNiA8LSBjaXJjb3NfdGlsZSh5b2Fubl9jZmdfMjAyMDA2LCBlc3NfY2lyY29zLCBjb2xuYW1lPSJsb3dfY2FsbCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xvcnM9Y29sb3JzLCBiYXNlbmFtZT0ibG93X3RpbGUiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpY2tuZXNzPTYwLCBzdHJva2VfdGhpY2tuZXNzPTAuMDAxLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0ZXI9eW9hbm5fY29udHJvbF90aWxlXzIwMjAwNiwgd2lkdGg9MC4wNSkKeW9hbm5faGlnaF90aWxlXzIwMjAwNiA8LSBjaXJjb3NfdGlsZSh5b2Fubl9jZmdfMjAyMDA2LCBlc3NfY2lyY29zLCBjb2xuYW1lPSJoaWdoX2NhbGwiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbG9ycz1jb2xvcnMsIGJhc2VuYW1lPSJoaWdoX3RpbGUiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaWNrbmVzcz02MCwgc3Ryb2tlX3RoaWNrbmVzcz0wLjAwMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRlcj15b2Fubl9sb3dfdGlsZV8yMDIwMDYsIHdpZHRoPTAuMDUpCnlvYW5uX2ZpbmFsX3RpbGVfMjAyMDA2IDwtIGNpcmNvc190aWxlKHlvYW5uX2NmZ18yMDIwMDYsIHlvYW5uX2NpcmNvc18yMDIwMDYsIGNvbG5hbWU9IkZpbmFsIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sb3JzPWNvbG9ycywgYmFzZW5hbWU9ImZpbmFsX3RpbGUiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlja25lc3M9NjAsIHN0cm9rZV90aGlja25lc3M9MC4wMDEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dGVyPXlvYW5uX2hpZ2hfdGlsZV8yMDIwMDYsIHdpZHRoPTAuMDUpCnlvYW5uX3N1ZmZpeF8yMDIwMDYgPC0gY2lyY29zX3N1ZmZpeCh5b2Fubl9jZmdfMjAyMDA2KQptYWRlIDwtIGNpcmNvc19tYWtlKHlvYW5uX2NmZ18yMDIwMDYsIHRhcmdldD0iYTkwOV95b2Fubl8yMDIwMDYiKQpgYGAKCiMgWW9hbm4gdmVyc2lvbiA0aXNoCgpIZXJlIGlzIHRoaXMgbW9ybmluZydzIGVtYWlsOgoKRm9yIHRoZSBpbmZvcm1hdGlvbiB3ZSB3YW50IHRvIGRpc3BsYXkuCiAtIHJpbmdzIDEgYW5kIDIsIGZyb20gdGhlIG91dHNpZGU6IHRoZSBnZW5lcyBieSBDT0csIHdoaWNoIEkgdGhpbmsgaXMgYWxyZWFkeQogICB3aGF0IHlvdSBoYXZlIHRoZXJlLgogLSByaW5nIDM6IHRoZSBtdXRhdGlvbiBzYXR1cmF0aW9uLCBob3cgbWFueSBLcm1pdCBpbnNlcnRpb25zIGluIHRoZSBpbml0aWFsCiAgIGxpYnJhcnkgaW4gVEhZLCB3aGljaCBhZ2FpbiBJIHRoaW5rIGlzIHdoYXQgeW91IGhhdmUuCiAtIHJpbmcgNDogQmF5ZXNpYW4gZXNzZW50aWFsaXR5IGRhdGEgZm9yIHRoZSBUSFkgbWVkaXVtICh0aGlzIGlzIGNvbHVtbiBCRSBpbgogICB0aGUgY3JhenkgdGFibGUgSSBzZW50IHlvdSB0aGlzIG1vcm5pbmcpLgogLSByaW5nIDU6IEJheWVzaWFuIGVzc2VudGlhbGl0eSBkYXRhIGZvciB0aGUgbVJQTUkgbWVkaXVtICh0aGlzIGlzIGNvbHVtbiBCTCBpbgogICB0aGUgY3JhenkgdGFibGUpLgogLSByaW5nIDY6IEJheWVzaWFuIGVzc2VudGlhbGl0eSBkYXRhIGZvciB0aGUgbVJQTUkgbWVkaXVtICsgbG93IENhbHByb3RlY3RpbgogICAodGhpcyBpcyBjb2x1bW4gQlMgaW4gdGhlIGNyYXp5IHRhYmxlKS4KIC0gcmluZyA3OiBCYXllc2lhbiBlc3NlbnRpYWxpdHkgZGF0YSBmb3IgdGhlIG1SUE1JIG1lZGl1bSArIGhpZ2ggQ2FscHJvdGVjdGluCiAgICh0aGlzIGlzIGNvbHVtbiBCWiBpbiB0aGUgY3JhenkgdGFibGUpLgogLSBJIHdhcyB3b25kZXJpbmcgaWYgeW91IGNvdWxkIGluY2x1ZGUgYSBsaXR0bGUgc3BhY2UgaGVyZSAobWF5YmUgaXQncyB0b28KICAgbXVjaCwgZG9uJ3Qgc3BlbmQgdG9vIG11Y2ggdGltZSBvbiB0aGF0KS4KClNpbmNlIGFsbCB0aGUgc3R1ZmYgaXMgYXBwYXJlbnRseSBpbiB0aGUgdGFibGUgWW9hbm4gY2FsbGVkICdjcmF6eSB0YWJsZScsIEkKZXhwb3J0ZWQgdGhvc2UgY29sdW1ucyBpbnRvIGEgY3N2IHdpdGggdGhhdCBuYW1lLi4uCgpgYGB7ciB5b2FubnY0fQpjcmF6eV90YWJsZSA8LSByZWFkLmNzdigiZnJvbV95b2Fubi9jcmF6eV90YWJsZS5jc3YiKQpyb3duYW1lcyhjcmF6eV90YWJsZSkgPC0gY3JhenlfdGFibGVbWyJyb3cubmFtZXMiXV0KY3JhenlfdGFibGVbWyJyb3cubmFtZXMiXV0gPC0gTlVMTAoKY2ZndjQgPC0gY2lyY29zX3ByZWZpeChhOTA5X2Fubm90LCBuYW1lPSJhOTA5X3Y0IikKa2FyeXY0IDwtIGNpcmNvc19rYXJ5b3R5cGUoY2ZndjQsIGZhc3RhPSJyZWZlcmVuY2Uvc2FnYWxhY3RpYWVfYTkwOS5mYXN0YSIpCnJpbmcxMnY0IDwtIGNpcmNvc19wbHVzX21pbnVzKGNmZ3Y0LCB3aWR0aD0wLjA1LCB0aGlja25lc3M9NDApCnJpbmczdjQgPC0gY2lyY29zX2hpc3QoY2ZndjQsIGNvbWJpbmVkX2V4cHJzLCBjb2xuYW1lPSJjb250cm9sIiwKICAgICAgICAgICAgICAgICAgICAgICBiYXNlbmFtZT0iY29udHJvbF9ycGttdjQiLCBvdXRlcj1yaW5nMTJ2NCwKICAgICAgICAgICAgICAgICAgICAgICBmaWxsX2NvbG9yPSJ2dmRwYmx1ZSIsIHdpZHRoPTAuMDUpCnJpbmc0djQgPC0gY2lyY29zX3RpbGUoY2ZndjQsIGNyYXp5X3RhYmxlLCBjb2xuYW1lPSJwcmV2aW91c2NhbGwiLAogICAgICAgICAgICAgICAgICAgICAgIGNvbG9ycz1saW5kc2V5X2NvbG9ycywgYmFzZW5hbWU9InByZXZpb3VzdjQiLCBvdXRlcj1yaW5nM3Y0LAogICAgICAgICAgICAgICAgICAgICAgIHRoaWNrbmVzcz02MCwgc3Ryb2tlX3RoaWNrbmVzcz0wLjAwMSwgIHdpZHRoPTAuMDUpCnJpbmc1djQgPC0gY2lyY29zX3RpbGUoY2ZndjQsIGNyYXp5X3RhYmxlLCBjb2xuYW1lPSJjb250cm9sY2FsbCIsCiAgICAgICAgICAgICAgICAgICAgICAgY29sb3JzPWxpbmRzZXlfY29sb3JzLCBiYXNlbmFtZT0iY29udHJvbHY0Iiwgb3V0ZXI9cmluZzR2NCwKICAgICAgICAgICAgICAgICAgICAgICB0aGlja25lc3M9NjAsIHN0cm9rZV90aGlja25lc3M9MC4wMDEsIHdpZHRoPTAuMDUpCnJpbmc2djQgPC0gY2lyY29zX3RpbGUoY2ZndjQsIGNyYXp5X3RhYmxlLCBjb2xuYW1lPSJsb3djYWxsIiwKICAgICAgICAgICAgICAgICAgICAgICBjb2xvcnM9bGluZHNleV9jb2xvcnMsIGJhc2VuYW1lPSJsb3d2NCIsIG91dGVyPXJpbmc1djQsCiAgICAgICAgICAgICAgICAgICAgICAgdGhpY2tuZXNzPTYwLCBzdHJva2VfdGhpY2tuZXNzPTAuMDAxLCB3aWR0aD0wLjA1KQpyaW5nN3Y0IDwtIGNpcmNvc190aWxlKGNmZ3Y0LCBjcmF6eV90YWJsZSwgY29sbmFtZT0iaGlnaGNhbGwiLAogICAgICAgICAgICAgICAgICAgICAgIGNvbG9ycz1saW5kc2V5X2NvbG9ycywgYmFzZW5hbWU9ImhpZ2h2NCIsIG91dGVyPXJpbmc2djQsCiAgICAgICAgICAgICAgICAgICAgICAgdGhpY2tuZXNzPTYwLCBzdHJva2VfdGhpY2tuZXNzPTAuMDAxLCB3aWR0aD0wLjA1KQpzdWZmaXh2NCA8LSBjaXJjb3Nfc3VmZml4KGNmZ3Y0KQptYWRlIDwtIGNpcmNvc19tYWtlKGNmZ3Y0LCB0YXJnZXQ9ImE5MDlfdjQiKQpgYGAKCiMjIFlvYW5uIDIwMjAwNzA3CgpIZXJlIGlzIHRvZGF5J3MgZW1haWw6CgoiRm9yIHRoZSBCYXllc2lhbiByZXByZXNlbnRhdGlvbnMsIEkgd2FzIGhvcGluZyB3ZSBjb3VsZCBkaXNwbGF5IGEgdG90YWwgb2YgNQpjaXJjbGVzLCBmb3VyIHJlcHJlc2VudGluZyB0aGUgZGF0YSBvYnRhaW5lZCBmb3IgdGhlIGZvdXIgZGlmZmVyZW50IGNvbmRpdGlvbnMKKGkuZS4sIFRIWSAtY29sdW1uIEJFLTsgUlBNSSAtY29sdW1uIEJMLTsgUlBNSStsb3dDYWwgLWNvbHVtbiBCUy0gYW5kClJQTUkraGlnaENhbCAtY29sdW1uIEJaLSk6IGZvciB0aGVzZSA0IGNpcmNsZXMgdGhlIG5vbi1lc3NlbnRpYWwgZ2VuZXMgd291bGQgYmUKc2hvd24gaW4gZ3JlZS4gVGhlbiwgdGhlcmUgd291bGQgYmUgb25lIGxhc3QgY2lyY2xlLCB0aGF0IGlzIGEgc3VtbWFyeSBvZiB0aGUKcmVzdWx0cyBwcmV2aW91c2x5IG1lbnRpb25lZDogdGhpcyBjaXJjbGUgd291bGQgaW50ZWdyYXRlIHRoZSBkYXRhIGZyb20gY29sdW1uCkNJIChhbHNvIGNhbGxlZCBMaW5kc2V5IENhbGwpLCBhbmQgZm9yIHRoaXMgY2lyY2xlLCBJIHdhbnQgdGhlIG5vbi1lc3NlbnRpYWwKZ2VuZXMgcmVwcmVzZW50ZWQgaW4geWVsbG93LCBzbyB0aGF0IHdlIGNhbiBzZWUgdGhhdCB0aGlzIGlzIGEgbGl0dGxlIGRpZmZlcmVudAp0aGFuIHRoZSA0IG90aGVyIGNpcmNsZXMgcHJldmlvdXNseSBtZW50aW9uZWQuIgoKSWYgSSByZWFkIHRoaXMgY29ycmVjdGx5LCB0aGUgb25seSB0aGluZyBJIGRpZCB3cm9uZyB3YXMgdG8gZ2V0IHNvbWUgb2YgdGhlCmNvbG9ycyB3cm9uZz8KCmBgYHtyIHlvYW5udjV9Cm1haW5fY29sb3JzIDwtIGMoImUzMTIxMiIsICIxMmUzMTIiLCAiNDQ0NDQ0IiwgIjA5MDlBQSIsICIwOTA5MDkiKQpuYW1lcyhtYWluX2NvbG9ycykgPC0gYygiRSIsICJORSIsICJTIiwgIlUiLCAiTkMiKQpzdW1tYXJ5X2NvbG9ycyA8LSBjKCJlMzEyMTIiLCAiZjBjNTA1IiwgIjQ0NDQ0NCIsICIwOTA5QUEiLCAiMDkwOTA5IikKbmFtZXMoc3VtbWFyeV9jb2xvcnMpIDwtIGMoIkUiLCAiTkUiLCAiUyIsICJVIiwgIk5DIikKCmNmZ3Y1IDwtIGNpcmNvc19wcmVmaXgoYTkwOV9hbm5vdCwgbmFtZT0iYTkwOV92NSIpCmthcnl2NSA8LSBjaXJjb3Nfa2FyeW90eXBlKGNmZ3Y1LCBmYXN0YT0icmVmZXJlbmNlL3NhZ2FsYWN0aWFlX2E5MDkuZmFzdGEiKQpyaW5nMTJ2NSA8LSBjaXJjb3NfcGx1c19taW51cyhjZmd2NSwgd2lkdGg9MC4wNywgdGhpY2tuZXNzPTQwKQpyaW5nM3Y1IDwtIGNpcmNvc19oaXN0KGNmZ3Y1LCBjb21iaW5lZF9leHBycywgY29sbmFtZT0iY29udHJvbCIsCiAgICAgICAgICAgICAgICAgICAgICAgYmFzZW5hbWU9ImNvbnRyb2xfcnBrbXY1Iiwgb3V0ZXI9cmluZzEydjUsCiAgICAgICAgICAgICAgICAgICAgICAgZmlsbF9jb2xvcj0idnZkcGJsdWUiLCB3aWR0aD0wLjA3KQpyaW5nNHY1IDwtIGNpcmNvc190aWxlKGNmZ3Y1LCBjcmF6eV90YWJsZSwgY29sbmFtZT0icHJldmlvdXNjYWxsIiwKICAgICAgICAgICAgICAgICAgICAgICBjb2xvcnM9bWFpbl9jb2xvcnMsIGJhc2VuYW1lPSJwcmV2aW91c3Y1Iiwgb3V0ZXI9cmluZzN2NSwKICAgICAgICAgICAgICAgICAgICAgICB0aGlja25lc3M9NzAsIHN0cm9rZV90aGlja25lc3M9MC4wMDEsICB3aWR0aD0wLjA3KQpyaW5nNXY1IDwtIGNpcmNvc190aWxlKGNmZ3Y1LCBjcmF6eV90YWJsZSwgY29sbmFtZT0iY29udHJvbGNhbGwiLAogICAgICAgICAgICAgICAgICAgICAgIGNvbG9ycz1tYWluX2NvbG9ycywgYmFzZW5hbWU9ImNvbnRyb2x2NSIsIG91dGVyPXJpbmc0djUsCiAgICAgICAgICAgICAgICAgICAgICAgdGhpY2tuZXNzPTcwLCBzdHJva2VfdGhpY2tuZXNzPTAuMDAxLCB3aWR0aD0wLjA3KQpyaW5nNnY1IDwtIGNpcmNvc190aWxlKGNmZ3Y1LCBjcmF6eV90YWJsZSwgY29sbmFtZT0ibG93Y2FsbCIsCiAgICAgICAgICAgICAgICAgICAgICAgY29sb3JzPW1haW5fY29sb3JzLCBiYXNlbmFtZT0ibG93djUiLCBvdXRlcj1yaW5nNXY1LAogICAgICAgICAgICAgICAgICAgICAgIHRoaWNrbmVzcz03MCwgc3Ryb2tlX3RoaWNrbmVzcz0wLjAwMSwgd2lkdGg9MC4wNykKcmluZzd2NSA8LSBjaXJjb3NfdGlsZShjZmd2NSwgY3JhenlfdGFibGUsIGNvbG5hbWU9ImhpZ2hjYWxsIiwKICAgICAgICAgICAgICAgICAgICAgICBjb2xvcnM9bWFpbl9jb2xvcnMsIGJhc2VuYW1lPSJoaWdodjUiLCBvdXRlcj1yaW5nNnY1LAogICAgICAgICAgICAgICAgICAgICAgIHRoaWNrbmVzcz03MCwgc3Ryb2tlX3RoaWNrbmVzcz0wLjAwMSwgd2lkdGg9MC4wNykKcmluZzh2NSA8LSBjaXJjb3NfdGlsZShjZmd2NSwgY3JhenlfdGFibGUsIGNvbG5hbWU9IkZpbmFsIiwKICAgICAgICAgICAgICAgICAgICAgICBjb2xvcnM9c3VtbWFyeV9jb2xvcnMsIGJhc2VuYW1lPSJmaW5hbHY1Iiwgb3V0ZXI9cmluZzd2NSwKICAgICAgICAgICAgICAgICAgICAgICB0aGlja25lc3M9NzAsIHN0cm9rZV90aGlja25lc3M9MC4wMDEsIHdpZHRoPTAuMDcpCnN1ZmZpeHY1IDwtIGNpcmNvc19zdWZmaXgoY2ZndjUpCm1hZGUgPC0gY2lyY29zX21ha2UoY2ZndjUsIHRhcmdldD0iYTkwOV92NSIpCmBgYAoKIyMjIEV4cGVyaW1lbnRpbmcgd2l0aCBnZ3N0YXRzcGxvdHMgYW5kIHRoZSAyMDE4IGRhdGEKCmBgYHtyIHByZXZpb3VzfQphOTA5X3ByZXYgPC0gY3JlYXRlX2V4cHQobWV0YWRhdGE9InNhbXBsZV9zaGVldHMvc2FnYWxhY3RpYWVfY29tYmluZWRfd2l0aF9wcmV2aW91c19zYW1wbGVzLnhsc3giLAogICAgICAgICAgICAgICAgICAgICAgICAgYmF0Y2g9RkFMU0UsIGdlbmVfaW5mbz1hOTA5X2Fubm90LCBmaWxlX2NvbHVtbj0iZmlsZSIpCmBgYAoKYGBge3Igc2F0dXJhdGlvbnN9CnNhdHVyYXRpb25fY29udHJvbCA8LSB0bnNlcV9zYXR1cmF0aW9uKAogICAgInByZXByb2Nlc3NpbmcvY29tYmluZWRfY29udHJvbC9vdXRwdXRzL2Vzc2VudGlhbGl0eV9zYWdhbGFjdGlhZV9hOTA5L3RyaW1tZWRfY2EtdjFtMS53aWciKQpzYXR1cmF0aW9uX2NvbnRyb2wkcGxvdApjb250cm9sX3BsdHMgPC0gcGxvdF9lc3NlbnRpYWxpdHkoCiAgICAicHJlcHJvY2Vzc2luZy9jb21iaW5lZF9jb250cm9sL291dHB1dHMvZXNzZW50aWFsaXR5X3NhZ2FsYWN0aWFlX2E5MDkvbWhfZXNzLXRyaW1tZWRfY2EtdjFtMV9nZW5lX3Rhc19tMi5jc3YiKQpjb250cm9sX3BsdHNbWyJ6YmFyIl1dCgpzYXR1cmF0aW9uX2xvdyA8LSB0bnNlcV9zYXR1cmF0aW9uKAogICAgInByZXByb2Nlc3NpbmcvY29tYmluZWRfbG93L291dHB1dHMvZXNzZW50aWFsaXR5X3NhZ2FsYWN0aWFlX2E5MDkvdHJpbW1lZF9jYS12MW0xLndpZyIpCnNhdHVyYXRpb25fY29udHJvbCRwbG90Cmxvd19wbHRzIDwtIHBsb3RfZXNzZW50aWFsaXR5KAogICAgInByZXByb2Nlc3NpbmcvY29tYmluZWRfbG93L291dHB1dHMvZXNzZW50aWFsaXR5X3NhZ2FsYWN0aWFlX2E5MDkvbWhfZXNzLXRyaW1tZWRfY2EtdjFtMV9nZW5lX3Rhc19tMi5jc3YiKQpsb3dfcGx0c1tbInpiYXIiXV0KCnNhdHVyYXRpb25faGlnaCA8LSB0bnNlcV9zYXR1cmF0aW9uKAogICAgInByZXByb2Nlc3NpbmcvY29tYmluZWRfaGlnaC9vdXRwdXRzL2Vzc2VudGlhbGl0eV9zYWdhbGFjdGlhZV9hOTA5L3RyaW1tZWRfY2EtdjFtMS53aWciKQpzYXR1cmF0aW9uX2NvbnRyb2wkcGxvdApoaWdoX3BsdHMgPC0gcGxvdF9lc3NlbnRpYWxpdHkoCiAgICAicHJlcHJvY2Vzc2luZy9jb21iaW5lZF9oaWdoL291dHB1dHMvZXNzZW50aWFsaXR5X3NhZ2FsYWN0aWFlX2E5MDkvbWhfZXNzLXRyaW1tZWRfY2EtdjFtMV9nZW5lX3Rhc19tMi5jc3YiKQpoaWdoX3BsdHNbWyJ6YmFyIl1dCgpzYXR1cmF0aW9uX3ByZXYgPC0gdG5zZXFfc2F0dXJhdGlvbigKICAgICJwcmVwcm9jZXNzaW5nL2NvbWJpbmVkX3ByZXZpb3VzL291dHB1dHMvZXNzZW50aWFsaXR5X3NhZ2FsYWN0aWFlX2E5MDkvY29tYmluZWRfY2FfdGEtdjBNMS53aWciKQpzYXR1cmF0aW9uX2NvbnRyb2wkcGxvdApoaWdoX3BsdHMgPC0gcGxvdF9lc3NlbnRpYWxpdHkoCiAgICAicHJlcHJvY2Vzc2luZy9jb21iaW5lZF9wcmV2aW91cy9vdXRwdXRzL2Vzc2VudGlhbGl0eV9zYWdhbGFjdGlhZV9hOTA5L21oX2Vzcy1jb21iaW5lZF9jYV90YS12ME0xX2dlbmVfdGFzX20yLmNzdiIpCmhpZ2hfcGx0c1tbInpiYXIiXV0KYGBgCgpgYGB7ciBjb21iaW5lZF9zYXR1cmF0aW9ufQpwbHQgPC0gdG5zZXFfbXVsdGlfc2F0dXJhdGlvbihtZXRhPXBEYXRhKGE5MDlfcHJldiksIG1ldGFfY29sdW1uPSJhOTA5ZXNzd2lnIikKcGx0JHBsb3QKcGx0JGdnc3RhdHMKYGBgCgoKCmBgYHtyIHNhdmVtZX0KcGFuZGVyOjpwYW5kZXIoc2Vzc2lvbkluZm8oKSkKbWVzc2FnZShwYXN0ZTAoIlRoaXMgaXMgaHBnbHRvb2xzIGNvbW1pdDogIiwgZ2V0X2dpdF9jb21taXQoKSkpCnRoaXNfc2F2ZSA8LSBwYXN0ZTAoZ3N1YihwYXR0ZXJuPSJcXC5SbWQiLCByZXBsYWNlPSIiLCB4PXJtZF9maWxlKSwgIi12IiwgdmVyLCAiLnJkYS54eiIpCm1lc3NhZ2UocGFzdGUwKCJTYXZpbmcgdG8gIiwgdGhpc19zYXZlKSkKdG1wIDwtIHNtKHNhdmVtZShmaWxlbmFtZT10aGlzX3NhdmUpKQpgYGAKCmBgYHtyIGxvYWRtZSwgZXZhbD1GQUxTRX0KbG9hZG1lKGZpbGVuYW1lPXRoaXNfc2F2ZSkKYGBgCg==