1 TNSeq of S. agalacticae 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

## Found 1 entry.
##                             Genome     Phylum Paper     Loaded Complete #Chr.
## 3107 Streptococcus agalactiae A909 Firmicutes   yes 2006-01-18      yes     1
##      #Plasmids #Genes tax_id
## 3107         0   2136 205921
## The species being downloaded is: Streptococcus agalactiae A909
## Downloading: http://www.microbesonline.org/cgi-bin/genomeInfo.cgi?tId=205921;export=tab
## 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.

3.2 Strain cjb111

## Found 1 entry.
##                               Genome     Phylum Paper     Loaded Complete #Chr.
## 3108 Streptococcus agalactiae CJB111 Firmicutes   yes 2007-05-08       no    NA
##      #Plasmids #Genes tax_id
## 3108        NA   2208 342617
## The species being downloaded is: Streptococcus agalactiae CJB111
## Downloading: http://www.microbesonline.org/cgi-bin/genomeInfo.cgi?tId=342617;export=tab
## 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.

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.

## Found 1 entry.
##                                Genome     Phylum Paper Loaded Complete #Chr.
## 3105 Streptococcus agalactiae 2603V/R Firmicutes   yes             yes     1
##      #Plasmids #Genes tax_id
## 3105         0   2273 208435
## The species being downloaded is: Streptococcus agalactiae 2603V/R
## Downloading: http://www.microbesonline.org/cgi-bin/genomeInfo.cgi?tId=208435;export=tab
## 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.

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

## Reading the sample metadata.
## The sample definitions comprises: 9 rows(samples) and 29 columns(metadata fields).
## Reading count tables.
## Reading count tables with read.table().
## /mnt/sshfs/cbcbsub/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 tables.
## 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.
## Writing the first sheet, containing a legend and some summary data.
## Writing the raw reads.
## Graphing the raw reads.
## 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...
## 
## Total:14 s
## Placing factor: condition at the beginning of the model.
## Writing the normalized reads.
## Graphing the normalized reads.
## 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...
## 
## Total:16 s
## Placing factor: condition at the beginning of the model.
## Writing the median reads by factor.

4.2 Strain cjb111

## Reading the sample metadata.
## The sample definitions comprises: 9 rows(samples) and 29 columns(metadata fields).
## Reading count tables.
## Reading count tables with read.table().
## /mnt/sshfs/cbcbsub/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 tables.
## 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.
## Writing the first sheet, containing a legend and some summary data.
## Writing the raw reads.
## Graphing the raw reads.
## 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...
## 
## Total:11 s
## Placing factor: condition at the beginning of the model.
## Writing the normalized reads.
## Graphing the normalized reads.
## 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...
## 
## Total:13 s
## Placing factor: condition at the beginning of the model.
## Writing the median reads by factor.

4.3 Strain 2603vr

## Reading the sample metadata.
## The sample definitions comprises: 9 rows(samples) and 29 columns(metadata fields).
## Reading count tables.
## Reading count tables with read.table().
## /mnt/sshfs/cbcbsub/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 tables.
## 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.
## Writing the first sheet, containing a legend and some summary data.
## Writing the raw reads.
## Graphing the raw reads.
## 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...
## 
## Total:11 s
## 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:6 s
## Placing factor: condition at the beginning of the model.
## Writing the normalized reads.
## Graphing the normalized reads.
## 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...
## 
## Total:15 s
## Placing factor: condition at the beginning of the model.
## Writing the median reads by factor.

5 A Few diagnostic plots

5.3 Strain 2603V/R

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"]]
## Scale for 'y' is already present. Adding another scale for 'y', which will
## replace the existing scale.

## Scale for 'y' is already present. Adding another scale for 'y', which will
## replace the existing scale.

## Scale for 'y' is already present. Adding another scale for 'y', which will
## replace the existing scale.

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

## Parsed with 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()
## )
## Parsed with 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()
## )
## Parsed with 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()
## )
## Plotting a PCA before surrogates/batch inclusion.
## Not putting labels on the plot.
## Assuming no batch in model for testing pca.
## Not putting labels on the 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.

## Deleting the file excel/20200211-a909_tables-v20191105.xlsx before writing the tables.
## 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
## Working on 2/2: high_vs_control which is: cal_high/control.
## Found inverse table with control_vs_cal_high
## Adding venn plots for low_vs_control.

## Limma expression coefficients for low_vs_control; R^2: 0.996; equation: y = 0.998x + 0.0239
## Deseq expression coefficients for low_vs_control; R^2: 0.991; equation: y = 0.991x + 0.0985
## Edger expression coefficients for low_vs_control; R^2: 0.997; equation: y = 0.999x + 0.0131
## Adding venn plots for high_vs_control.

## Limma expression coefficients for high_vs_control; R^2: 0.996; equation: y = 0.998x + 0.0239
## Deseq expression coefficients for high_vs_control; R^2: 0.991; equation: y = 0.991x + 0.0985
## Edger expression coefficients for high_vs_control; R^2: 0.997; equation: y = 0.999x + 0.0131
## Writing summary information, compare_plot is: TRUE.
## Performing save of excel/20200211-a909_tables-v20191105.xlsx.

7.2 Strain 2603V/R

## Plotting a PCA before surrogates/batch inclusion.
## Not putting labels on the plot.
## Assuming no batch in model for testing pca.
## Not putting labels on the 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.

## Deleting the file excel/20200211-vr2603_tables-v20191105.xlsx before writing the tables.
## 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
## Working on 2/2: high_vs_control which is: cal_high/control.
## Found inverse table with control_vs_cal_high
## Adding venn plots for low_vs_control.

## Limma expression coefficients for low_vs_control; R^2: 0.996; equation: y = 1x - 0.003
## Deseq expression coefficients for low_vs_control; R^2: 0.992; equation: y = 0.996x + 0.0363
## Edger expression coefficients for low_vs_control; R^2: 0.997; equation: y = 0.999x + 0.00572
## Adding venn plots for high_vs_control.

## Limma expression coefficients for high_vs_control; R^2: 0.996; equation: y = 1x - 0.003
## Deseq expression coefficients for high_vs_control; R^2: 0.992; equation: y = 0.996x + 0.0363
## Edger expression coefficients for high_vs_control; R^2: 0.997; equation: y = 0.999x + 0.00572
## Writing summary information, compare_plot is: TRUE.
## Performing save of excel/20200211-vr2603_tables-v20191105.xlsx.

7.3 Strain CJB111

## Plotting a PCA before surrogates/batch inclusion.
## Not putting labels on the plot.
## Assuming no batch in model for testing pca.
## Not putting labels on the 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.

## Deleting the file excel/20200211-cjb111_tables-v20191105.xlsx before writing the tables.
## 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
## Working on 2/2: high_vs_control which is: cal_high/control.
## Found inverse table with control_vs_cal_high
## Adding venn plots for low_vs_control.

## Limma expression coefficients for low_vs_control; R^2: 0.995; equation: y = 0.996x + 0.0383
## Deseq expression coefficients for low_vs_control; R^2: 0.991; equation: y = 0.987x + 0.147
## Edger expression coefficients for low_vs_control; R^2: 0.996; equation: y = 0.997x + 0.0308
## Adding venn plots for high_vs_control.

## Limma expression coefficients for high_vs_control; R^2: 0.995; equation: y = 0.996x + 0.0383
## Deseq expression coefficients for high_vs_control; R^2: 0.991; equation: y = 0.987x + 0.147
## Edger expression coefficients for high_vs_control; R^2: 0.996; equation: y = 0.997x + 0.0308
## Writing summary information, compare_plot is: TRUE.
## Performing save of excel/20200211-cjb111_tables-v20191105.xlsx.

8 Circos

## 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
## Wrote karyotype to circos/conf/karyotypes/a909.conf
## This should match the karyotype= line in a909.conf
## 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.92.  Use it as the outer for the next ring.
## Writing data file: circos/data/a909_lowdeseq_logfc_hist.txt with the lowdeseq_logfc column.
## Writing data file: circos/data/a909_highdeseq_logfc_hist.txt with the highdeseq_logfc column.
## Writing data file: circos/data/a909_control_tilecontrol_call_tile.txt with the control_call column.
## Writing data file: circos/data/a909_low_tilelow_call_tile.txt with the low_call column.
## Writing data file: circos/data/a909_high_tilehigh_call_tile.txt with the high_call column.

9 Circos email conversation

Here is (most of) the text of a recent email from Kevin:

" I think a plot of the following might be the best for the paper. It would just remove the 2 Bayesians of the high and low, and add the mapping of the transposon (krait) to the genome:

    • Strand ORFs (COG colored)
    • Strand ORFs (COG colored)
    • Strand Krmit insertions
    • Strand Krmit insertions
  1. DESeq2 low/control samples
  2. DESeq2 high/control samples
  3. DeJesus Bayesian result for control sample only combined.

That way we can see the coverage of the Krmit insertions and only the Bayesian in control conditions (broadly essential). "

I am thinking that this is not a problem, but I will probably do 3 and 4 as 3 rings, one each for the +/- strand control/low/high samples.

In another hallway query, Kevin suggested rpkm of the control/low/high ‘master’ libraries.

ergo…

## Reading the sample metadata.
## The sample definitions comprises: 3 rows(samples) and 11 columns(metadata fields).
## Reading count tables.
## Reading count tables with read.table().
## /mnt/sshfs/cbcbsub/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/cbcbsub/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/cbcbsub/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 tables.
## 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.
## 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.
## 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/a909v2.conf with a reasonable first approximation config file.
## Wrote karyotype to circos/conf/ideograms/a909v2.conf
## This should match the karyotype= line in a909v2.conf
## Wrote ticks to circos/conf/ticks_a909v2.conf
## Wrote karyotype to circos/conf/karyotypes/a909v2.conf
## This should match the karyotype= line in a909v2.conf
## Writing data file: circos/data/a909v2_plus_go.txt with the + strand GO data.
## Writing data file: circos/data/a909v2_minus_go.txt with the - strand GO data.
## Wrote the +/- config files.  Appending their inclusion to the master file.
## Returning the inner width: 0.89.  Use it as the outer for the next ring.
## Writing data file: circos/data/a909v2_control_rpkmcontrol_hist.txt with the control_rpkmcontrol column.
## Writing data file: circos/data/a909v2_low_rpkmlow_hist.txt with the low_rpkmlow column.
## Writing data file: circos/data/a909v2_high_rpkmhigh_hist.txt with the high_rpkmhigh column.
## Writing data file: circos/data/a909v2_control_tilecontrol_call_tile.txt with the control_call column.
## Writing data file: circos/data/a909v2_low_tilelow_call_tile.txt with the low_call column.
## Writing data file: circos/data/a909v2_high_tilehigh_call_tile.txt with the high_call column.
## Writing data file: circos/data/a909v2_lowdeseq_logfc_hist.txt with the lowdeseq_logfc column.
## Writing data file: circos/data/a909v2_highdeseq_logfc_hist.txt with the highdeseq_logfc column.
## 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/a909v3.conf with a reasonable first approximation config file.
## Wrote karyotype to circos/conf/ideograms/a909v3.conf
## This should match the karyotype= line in a909v3.conf
## Wrote ticks to circos/conf/ticks_a909v3.conf
## Wrote karyotype to circos/conf/karyotypes/a909v3.conf
## This should match the karyotype= line in a909v3.conf
## Writing data file: circos/data/a909v3_plus_go.txt with the + strand GO data.
## Writing data file: circos/data/a909v3_minus_go.txt with the - strand GO data.
## Wrote the +/- config files.  Appending their inclusion to the master file.
## Returning the inner width: 0.89.  Use it as the outer for the next ring.
## Writing data file: circos/data/a909v3_control_rpkmcontrol_hist.txt with the control_rpkmcontrol column.
## Writing data file: circos/data/a909v3_low_rpkmlow_hist.txt with the low_rpkmlow column.
## Writing data file: circos/data/a909v3_high_rpkmhigh_hist.txt with the high_rpkmhigh column.
## Writing data file: circos/data/a909v3_lowdeseq_logfc_hist.txt with the lowdeseq_logfc column.
## Writing data file: circos/data/a909v3_highdeseq_logfc_hist.txt with the highdeseq_logfc column.
## Reading the sample metadata.
## The sample definitions comprises: 3 rows(samples) and 11 columns(metadata fields).
## Reading count tables.
## Reading count tables with read.table().
## /mnt/sshfs/cbcbsub/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/cbcbsub/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/cbcbsub/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 tables.
## 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.
## 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.
## 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/a909v4.conf with a reasonable first approximation config file.
## Wrote karyotype to circos/conf/ideograms/a909v4.conf
## This should match the karyotype= line in a909v4.conf
## Wrote ticks to circos/conf/ticks_a909v4.conf
## Wrote karyotype to circos/conf/karyotypes/a909v4.conf
## This should match the karyotype= line in a909v4.conf
## Writing data file: circos/data/a909v4_plus_go.txt with the + strand GO data.
## Writing data file: circos/data/a909v4_minus_go.txt with the - strand GO data.
## Wrote the +/- config files.  Appending their inclusion to the master file.
## Returning the inner width: 0.89.  Use it as the outer for the next ring.
## Writing data file: circos/data/a909v4_control_rpkmcontrol_hist.txt with the control_rpkmcontrol column.
## Writing data file: circos/data/a909v4_low_rpkmlow_hist.txt with the low_rpkmlow column.
## Writing data file: circos/data/a909v4_high_rpkmhigh_hist.txt with the high_rpkmhigh column.
## Writing data file: circos/data/a909v4_control_tilecontrol_call_tile.txt with the control_call column.
## Writing data file: circos/data/a909v4_low_tilelow_call_tile.txt with the low_call column.
## Writing data file: circos/data/a909v4_high_tilehigh_call_tile.txt with the high_call column.
LS0tCnRpdGxlOiAiUy4gYWdhbGFjdGlhZSAyMDE5MTEwNTogUG9raW5nIGF0IHNvbWUgVE5TZXEuIgphdXRob3I6ICJhdGIgYWJlbGV3QGdtYWlsLmNvbSIKZGF0ZTogImByIFN5cy5EYXRlKClgIgpvdXRwdXQ6CiAgaHRtbF9kb2N1bWVudDoKICAgIGNvZGVfZG93bmxvYWQ6IHRydWUKICAgIGNvZGVfZm9sZGluZzogc2hvdwogICAgZmlnX2NhcHRpb246IHRydWUKICAgIGZpZ19oZWlnaHQ6IDcKICAgIGZpZ193aWR0aDogNwogICAgaGlnaGxpZ2h0OiB0YW5nbwogICAga2VlcF9tZDogZmFsc2UKICAgIG1vZGU6IHNlbGZjb250YWluZWQKICAgIG51bWJlcl9zZWN0aW9uczogdHJ1ZQogICAgc2VsZl9jb250YWluZWQ6IHRydWUKICAgIHRoZW1lOiByZWFkYWJsZQogICAgdG9jOiB0cnVlCiAgICB0b2NfZmxvYXQ6CiAgICAgIGNvbGxhcHNlZDogZmFsc2UKICAgICAgc21vb3RoX3Njcm9sbDogZmFsc2UKICBybWRmb3JtYXRzOjpyZWFkdGhlZG93bjoKICAgIGNvZGVfZG93bmxvYWQ6IHRydWUKICAgIGNvZGVfZm9sZGluZzogc2hvdwogICAgZGZfcHJpbnQ6IHBhZ2VkCiAgICBmaWdfY2FwdGlvbjogdHJ1ZQogICAgZmlnX2hlaWdodDogNwogICAgZmlnX3dpZHRoOiA3CiAgICBoaWdobGlnaHQ6IHRhbmdvCiAgICB3aWR0aDogMzAwCiAgICBrZWVwX21kOiBmYWxzZQogICAgbW9kZTogc2VsZmNvbnRhaW5lZAogICAgdG9jX2Zsb2F0OiB0cnVlCiAgQmlvY1N0eWxlOjpodG1sX2RvY3VtZW50OgogICAgY29kZV9kb3dubG9hZDogdHJ1ZQogICAgY29kZV9mb2xkaW5nOiBzaG93CiAgICBmaWdfY2FwdGlvbjogdHJ1ZQogICAgZmlnX2hlaWdodDogNwogICAgZmlnX3dpZHRoOiA3CiAgICBoaWdobGlnaHQ6IHRhbmdvCiAgICBrZWVwX21kOiBmYWxzZQogICAgbW9kZTogc2VsZmNvbnRhaW5lZAogICAgdG9jX2Zsb2F0OiB0cnVlCi0tLQoKPHN0eWxlIHR5cGU9InRleHQvY3NzIj4KYm9keSwgdGQgewogIGZvbnQtc2l6ZTogMTZweDsKfQpjb2RlLnJ7CiAgZm9udC1zaXplOiAxNnB4Owp9CnByZSB7CiBmb250LXNpemU6IDE2cHgKfQo8L3N0eWxlPgoKYGBge3Igb3B0aW9ucywgaW5jbHVkZT1GQUxTRX0KbGlicmFyeSgiaHBnbHRvb2xzIikKZGV2dG9vbHM6OmxvYWRfYWxsKCJ+L2hwZ2x0b29scyIpCmtuaXRyOjpvcHRzX2tuaXQkc2V0KHdpZHRoPTEyMCwKICAgICAgICAgICAgICAgICAgICAgcHJvZ3Jlc3M9VFJVRSwKICAgICAgICAgICAgICAgICAgICAgdmVyYm9zZT1UUlVFLAogICAgICAgICAgICAgICAgICAgICBlY2hvPVRSVUUpCmtuaXRyOjpvcHRzX2NodW5rJHNldChlcnJvcj1UUlVFLAogICAgICAgICAgICAgICAgICAgICAgZHBpPTk2KQpvbGRfb3B0aW9ucyA8LSBvcHRpb25zKGRpZ2l0cz00LAogICAgICAgICAgICAgICAgICAgICAgIHN0cmluZ3NBc0ZhY3RvcnM9RkFMU0UsCiAgICAgICAgICAgICAgICAgICAgICAga25pdHIuZHVwbGljYXRlLmxhYmVsPSJhbGxvdyIpCmdncGxvdDI6OnRoZW1lX3NldChnZ3Bsb3QyOjp0aGVtZV9idyhiYXNlX3NpemU9MTApKQpydW5kYXRlIDwtIGZvcm1hdChTeXMuRGF0ZSgpLCBmb3JtYXQ9IiVZJW0lZCIpCnByZXZpb3VzX2ZpbGUgPC0gIiIKdmVyIDwtICIyMDE5MTEwNSIKCiMjdG1wIDwtIHNtKGxvYWRtZShmaWxlbmFtZT1wYXN0ZTAoZ3N1YihwYXR0ZXJuPSJcXC5SbWQiLCByZXBsYWNlPSIiLCB4PXByZXZpb3VzX2ZpbGUpLCAiLXYiLCB2ZXIsICIucmRhLnh6IikpKQojI3JtZF9maWxlIDwtICIwM19leHByZXNzaW9uX2luZmVjdGlvbl8yMDE4MDgyMi5SbWQiCmBgYAoKIyBUTlNlcSBvZiBTLiBhZ2FsYWN0aWNhZSBhbmQgMyBjb25jZW50cmF0aW9ucyBvZiBjYWxwcm90ZWN0aW4uCgpUaGlzIHdvcmtzaGVldCBhaW1zIHRvIGxheSBvdXQgdGhlIHRhc2tzIEkgcGVyZm9ybWVkIHdoZW4gYW5hbHl6aW5nIHNvbWUgVE5TZXEKZGF0YSBvZiBhIGdyb3VwIEIgc3RyZXB0b2NvY2N1cy4KCiMgVGhyZWUgY29uY2VudHJhdGlvbnMgb2YgY2FscHJvdGVjdGluIChub25lLCA2MCwgYW5kIDQ4MCAtLSBpcyB0aGlzIFttTV0sIG1nL21MLCBvciB3aGF0PykKCkl0IGxvb2tzIHRvIG1lLCB0aGF0IGRlc3BpdGUgdGhlIG9kZGl0aWVzIGluIHByb2Nlc3NpbmcgdGhlIHJhdyByZWFkcywgdGhlcmUgaXMKbmljZSBjb3ZlcmFnZSBhbmQgc29tZSBvYnZpb3VzbHkgZXNzZW50aWFsIGdlbmVzLiAgVGhlIG5leHQgcXVlc3Rpb246IGRpZCBhbnkKY2hhbmdlIHN0YXR1cyBhcyBtb3JlIGNhbHByb3RlY3RpbiB3YXMgYWRkZWQ/CgojIEdyYWIgYW5ub3RhdGlvbiBkYXRhIGZvciBTdHJlcHRvY29jY3VzIGFnYWxhY3RpYWUuCgpUaGUgSUQgZm9yIHN0cmFpbiBhOTA5IGF0IG1pY3JvYmVzb25saW5lLm9yZyBpczogMjA1OTIxLgoKTGV0IHVzIGxvYWQgdXAgYW5ub3RhdGlvbnMgZnJvbSBteSBnZmYgZmlsZSBhbG9uZyB3aXRoIHRoZSBtaWNyb2Jlc29ubGluZS4KCkFzIGEgaGVhZHMgdXAsIHRoZSBjb3VudCB0YWJsZXMgYXJlIHVzaW5nIElEcyB3aGljaCBsb29rIGxpa2U6IFNBS19SUzAwMTg1LgpUaGlzIGFwcGVhcnMgdG8gYmUgdGhlICdzeXNOYW1lJyBjb2x1bW4gZnJvbSBtaWNyb2Jlc29ubGluZSBhbmQgdGhlIGxvY3VzX3RhZwpjb2x1bW4gZnJvbSB0aGUgZ2ZmIGFubm90YXRpb25zLiAgSW4gYWRkaXRpb24sIHRoZXJlIGFyZSBhIGJ1bmNoIG9mIHVudXNlZApjb2x1bW5zIGluIGJvdGggZGF0YSBzZXRzIHdoaWNoIHdlIGxpa2VseSB3YW50IHRvIHBydW5lLgoKQWhoLCB0aGF0IGlzIGluY29ycmVjdCwgdGhlIG1pY3JvYmVzb25saW5lICdzeXNOYW1lJyBpcyB0aGUgc2FtZSBhcwonb2xkX2xvY3VzX3RhZycgY29sdW1uLgoKVGhlcmUgYXJlIHRocmVlIHJlbGF0aXZlbHkgY2xvc2VseSByZWxhdGVkIHN0cmFpbnMgd2hpY2ggbWF5IGJlIHN1ZmZpY2llbnRseQpzaW1pbGFyIHRvIHVzZSBpbiB0aGlzIGFuYWx5c2lzLiAgVGhlIF9hY3R1YWxfIHN0cmFpbiBpcyBjamIxMTEsIGJ1dCB0aGF0IGhhcwpub3QgeWV0IGJlZW4gcXVpdGUgZmluaXNoZWQsIGFzIGZhciBhcyBJIGNhbiB0ZWxsLiAgVGhlcmVmb3JlIEkgd2lsbCByZXBlYXQKbW9zdChhbGw/KSB0YXNrcyB3aXRoIHN0cmFpbnMgYTkwOSBhbmQgdnIyNjAzIHRvIHNlZSBpZiB0aGV5IG1heSBiZSBtb3JlIHVzZWZ1bC4KCiMjIFN0cmFpbiBhOTA5CgpgYGB7ciBhbm5vdGF0aW9uc19hOTA5fQphOTA5X21pY3JvYmVzIDwtIGxvYWRfbWljcm9iZXNvbmxpbmVfYW5ub3RhdGlvbnMoc3BlY2llcz0iQTkwOSIpCmE5MDlfZ2ZmIDwtIGxvYWRfZ2ZmX2Fubm90YXRpb25zKCJyZWZlcmVuY2Uvc2FnYWxhY3RpYWVfYTkwOV9hbGwuZ2ZmIikKYTkwOV9taWNyb2JlcyA8LSBhcy5kYXRhLmZyYW1lKGE5MDlfbWljcm9iZXMpCnJvd25hbWVzKGE5MDlfZ2ZmKSA8LSBtYWtlLm5hbWVzKGE5MDlfZ2ZmW1sibG9jdXNfdGFnIl1dLCB1bmlxdWU9VFJVRSkKIyMgSSBhbSBnb2luZyB0byBvbmx5IHBheSBhdHRlbnRpb24gdG8gdGhlIGZpcnN0IGFubm90YXRpb24gZm9yIGVhY2ggbG9jdXMgdGFnIGZyb20gbWljcm9iZXNvbmxpbmUuCmE5MDlfbWljcm9iZXNbWyJzeXNOYW1lIl1dIDwtIG1ha2UubmFtZXMoYTkwOV9taWNyb2Jlc1tbInN5c05hbWUiXV0sIHVuaXF1ZT1UUlVFKQphOTA5X2Fubm90IDwtIG1lcmdlKGE5MDlfZ2ZmLCBhOTA5X21pY3JvYmVzLCBieS54PSJvbGRfbG9jdXNfdGFnIiwgYnkueT0ic3lzTmFtZSIpCnJvd25hbWVzKGE5MDlfYW5ub3QpIDwtIG1ha2UubmFtZXMoYTkwOV9hbm5vdFtbImxvY3VzX3RhZyJdXSwgdW5pcXVlPVRSVUUpCiMjIFJlbmFtZSB0aGUgbWVyZ2VkIHN0YXJ0L3N0cmFuZCBjb2x1bW5zCmNvbG5hbWVzKGE5MDlfYW5ub3QpWzNdIDwtICJzdGFydCIKY29sbmFtZXMoYTkwOV9hbm5vdClbNl0gPC0gInN0cmFuZCIKIyMgQW5kIGRyb3AgdGhlIGR1cGxpY2F0ZXMKYTkwOV9hbm5vdFssIGMoMzksIDQxKV0gPC0gTlVMTApgYGAKCiMjIFN0cmFpbiBjamIxMTEKCmBgYHtyIGFubm90YXRpb25fY2piMTExfQpjamIxMTFfbWljcm9iZXMgPC0gbG9hZF9taWNyb2Jlc29ubGluZV9hbm5vdGF0aW9ucyhzcGVjaWVzPSJDSkIxMTEiKQpjamIxMTFfZ2ZmIDwtIGxvYWRfZ2ZmX2Fubm90YXRpb25zKCJyZWZlcmVuY2Uvc2FnYWxhY3RpYWVfY2piMTExLmdmZiIpCmNqYjExMV9taWNyb2JlcyA8LSBhcy5kYXRhLmZyYW1lKGNqYjExMV9taWNyb2JlcykKcm93bmFtZXMoY2piMTExX2dmZikgPC0gbWFrZS5uYW1lcyhjamIxMTFfZ2ZmW1sibG9jdXNfdGFnIl1dLCB1bmlxdWU9VFJVRSkKIyMgSSBhbSBnb2luZyB0byBvbmx5IHBheSBhdHRlbnRpb24gdG8gdGhlIGZpcnN0IGFubm90YXRpb24gZm9yIGVhY2ggbG9jdXMgdGFnIGZyb20gbWljcm9iZXNvbmxpbmUuCmNqYjExMV9taWNyb2Jlc1tbInN5c05hbWUiXV0gPC0gbWFrZS5uYW1lcyhjamIxMTFfbWljcm9iZXNbWyJzeXNOYW1lIl1dLCB1bmlxdWU9VFJVRSkKY2piMTExX2Fubm90IDwtIG1lcmdlKGNqYjExMV9nZmYsIGNqYjExMV9taWNyb2JlcywgYnkueD0ibG9jdXNfdGFnIiwgYnkueT0ic3lzTmFtZSIpCnJvd25hbWVzKGNqYjExMV9hbm5vdCkgPC0gbWFrZS5uYW1lcyhjamIxMTFfYW5ub3RbWyJsb2N1c190YWciXV0sIHVuaXF1ZT1UUlVFKQojIyBSZW5hbWUgdGhlIG1lcmdlZCBzdGFydC9zdHJhbmQgY29sdW1ucwpjb2xuYW1lcyhjamIxMTFfYW5ub3QpWzNdIDwtICJzdGFydCIKY29sbmFtZXMoY2piMTExX2Fubm90KVs2XSA8LSAic3RyYW5kIgpjamIxMTFfYW5ub3RbLCBjKDE5LCAyMSldIDwtIE5VTEwKYGBgCgojIyBTdHJhaW4gdnIyNjAzCgpJIHRoaW5rIHRoaXMgbWlnaHQgYWN0dWFsbHkgYmUgMjYwM3ZyLCBJIGdldCBjb25mdXNlZCwgYW5kIHVuZGVyIGEgZmV3IHNwZWNpZmljCmNpcmN1bXN0YW5jZXMgUiBhY3RzIHN0cmFuZ2Ugd2hlbiB0aGluZ3Mgc3RhcnQgd2l0aCBudW1iZXJzLgoKYGBge3IgYW5ub3RhdGlvbl8yNjAzdnJ9CnZyMjYwM19taWNyb2JlcyA8LSBsb2FkX21pY3JvYmVzb25saW5lX2Fubm90YXRpb25zKHNwZWNpZXM9IjI2MDNWIikKdnIyNjAzX2dmZiA8LSBsb2FkX2dmZl9hbm5vdGF0aW9ucygicmVmZXJlbmNlL3NhZ2FsYWN0aWFlXzI2MDN2ci5nZmYiKQp2cjI2MDNfbWljcm9iZXMgPC0gYXMuZGF0YS5mcmFtZSh2cjI2MDNfbWljcm9iZXMpCnJvd25hbWVzKHZyMjYwM19nZmYpIDwtIG1ha2UubmFtZXModnIyNjAzX2dmZltbImxvY3VzX3RhZyJdXSwgdW5pcXVlPVRSVUUpCiMjIEkgYW0gZ29pbmcgdG8gb25seSBwYXkgYXR0ZW50aW9uIHRvIHRoZSBmaXJzdCBhbm5vdGF0aW9uIGZvciBlYWNoIGxvY3VzIHRhZyBmcm9tIG1pY3JvYmVzb25saW5lLgp2cjI2MDNfbWljcm9iZXNbWyJzeXNOYW1lIl1dIDwtIG1ha2UubmFtZXModnIyNjAzX21pY3JvYmVzW1sic3lzTmFtZSJdXSwgdW5pcXVlPVRSVUUpCnZyMjYwM19hbm5vdCA8LSBtZXJnZSh2cjI2MDNfZ2ZmLCB2cjI2MDNfbWljcm9iZXMsIGJ5Lng9ImxvY3VzX3RhZyIsIGJ5Lnk9InN5c05hbWUiKQpyb3duYW1lcyh2cjI2MDNfYW5ub3QpIDwtIG1ha2UubmFtZXModnIyNjAzX2Fubm90W1siSUQiXV0sIHVuaXF1ZT1UUlVFKQojIyBSZW5hbWUgdGhlIG1lcmdlZCBzdGFydC9zdHJhbmQgY29sdW1ucwpjb2xuYW1lcyh2cjI2MDNfYW5ub3QpWzNdIDwtICJzdGFydCIKY29sbmFtZXModnIyNjAzX2Fubm90KVs2XSA8LSAic3RyYW5kIgp2cjI2MDNfYW5ub3RbLCBjKDMzLCAzNSldIDwtIE5VTEwKYGBgCgojIENyZWF0ZSBFeHByZXNzaW9uc2V0cwoKVGhlIGZvbGxvd2luZyBibG9jayBtZXJnZXMgdGhlIHZhcmlvdXMgY291bnRzLCBhbm5vdGF0aW9ucywgYW5kIGV4cGVyaW1lbnRhbAptZXRhZGF0YS4KCkp1c3QgYXMgd2l0aCB0aGUgYW5ub3RhdGlvbnMsIEkgd2lsbCBjcmVhdGUgb25lIGV4cHJlc3Npb25zZXQgZm9yIGVhY2ggc3RyYWluLgoKIyMgU3RyYWluIGE5MDkKCmBgYHtyIGE5MDlfZXhwdCwgZmlnLnNob3c9ImhpZGUifQphOTA5X2V4cHQgPC0gY3JlYXRlX2V4cHQobWV0YWRhdGE9InNhbXBsZV9zaGVldHMvc2FnYWxhY3RpY2FlX3NhbXBsZXMueGxzeCIsCiAgICAgICAgICAgICAgICAgICAgICAgICBiYXRjaD1GQUxTRSwgZ2VuZV9pbmZvPWE5MDlfYW5ub3QsIGZpbGVfY29sdW1uPSJhOTA5X2ZpbGVuYW1lIikKYTkwOV93cml0dGVuIDwtIHdyaXRlX2V4cHQoYTkwOV9leHB0LAogICAgICAgICAgICAgICAgICAgICAgICAgICBleGNlbD1nbHVlOjpnbHVlKCJleGNlbC97cnVuZGF0ZX0tYTkwOV9jb3VudHMtdnt2ZXJ9Lnhsc3giKSkKYGBgCgojIyBTdHJhaW4gY2piMTExCgpgYGB7ciBjamIxMTFfZXhwdCwgZmlnLnNob3c9ImhpZGUifQpjamIxMTFfZXhwdCA8LSBjcmVhdGVfZXhwdChtZXRhZGF0YT0ic2FtcGxlX3NoZWV0cy9zYWdhbGFjdGljYWVfc2FtcGxlcy54bHN4IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2VuZV9pbmZvPWNqYjExMV9hbm5vdCwgZmlsZV9jb2x1bW49ImNqYjExMV9maWxlbmFtZSIpCmNqYjExMV93cml0dGVuIDwtIHdyaXRlX2V4cHQoY2piMTExX2V4cHQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhjZWw9Z2x1ZTo6Z2x1ZSgiZXhjZWwve3J1bmRhdGV9LWNqYjExMV9jb3VudHMtdnt2ZXJ9Lnhsc3giKSkKYGBgCgojIyBTdHJhaW4gMjYwM3ZyCgpgYGB7ciB2cjI2MDNfZXhwdCwgZmlnLnNob3c9ImhpZGUifQp2cjI2MDNfZXhwdCA8LSBjcmVhdGVfZXhwdChtZXRhZGF0YT0ic2FtcGxlX3NoZWV0cy9zYWdhbGFjdGljYWVfc2FtcGxlcy54bHN4IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2VuZV9pbmZvPXZyMjYwM19hbm5vdCwgZmlsZV9jb2x1bW49InZyMjYwM19maWxlbmFtZSIpCnZyMjYwM193cml0dGVuIDwtIHdyaXRlX2V4cHQodnIyNjAzX2V4cHQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhjZWw9Z2x1ZTo6Z2x1ZSgiZXhjZWwve3J1bmRhdGV9LXZyMjYwM19jb3VudHMtdnt2ZXJ9Lnhsc3giKSkKYGBgCgojIEEgRmV3IGRpYWdub3N0aWMgcGxvdHMKCiMjIFN0cmFpbiBBOTA5CgpgYGB7ciBzb21lX3Bsb3RzX2E5MDl9CmE5MDlfd3JpdHRlbltbImxlZ2VuZF9wbG90Il1dCmE5MDlfd3JpdHRlbltbInJhd19saWJzaXplIl1dCmE5MDlfd3JpdHRlbltbInJhd19kZW5zaXR5Il1dCiMjIGF3ZXNvbWUKCmE5MDlfd3JpdHRlbltbIm5vcm1fZGlzaGVhdCJdXQphOTA5X3dyaXR0ZW5bWyJub3JtX2NvcmhlYXQiXV0KYTkwOV93cml0dGVuW1sibm9ybV9wY2EiXV0KYGBgCgojIyBTdHJhaW4gQ0pCMTExCgpgYGB7ciBzb21lX3Bsb3RzX2NqYjExMX0KY2piMTExX3dyaXR0ZW5bWyJyYXdfbGlic2l6ZSJdXQpjamIxMTFfd3JpdHRlbltbInJhd19kZW5zaXR5Il1dCiMjIGF3ZXNvbWUKCmNqYjExMV93cml0dGVuW1sibm9ybV9kaXNoZWF0Il1dCmNqYjExMV93cml0dGVuW1sibm9ybV9jb3JoZWF0Il1dCmNqYjExMV93cml0dGVuW1sibm9ybV9wY2EiXV0KYGBgCgojIyBTdHJhaW4gMjYwM1YvUgoKYGBge3Igc29tZV9wbG90c19jamIxMTF2Mn0KdnIyNjAzX3dyaXR0ZW5bWyJyYXdfbGlic2l6ZSJdXQp2cjI2MDNfd3JpdHRlbltbInJhd19kZW5zaXR5Il1dCiMjIGF3ZXNvbWUKCnZyMjYwM193cml0dGVuW1sibm9ybV9kaXNoZWF0Il1dCnZyMjYwM193cml0dGVuW1sibm9ybV9jb3JoZWF0Il1dCnZyMjYwM193cml0dGVuW1sibm9ybV9wY2EiXV0KYGBgCgpJIHRoaW5rIHRoaXMgbG9va3MgcmVhc29uYWJsZSwgdGhvdWdoIGl0IG1ha2VzIG1lIHNsaWdodGx5IHdvbmRlciBpZiAwNCBhbmQgMDkKYXJlIHN3aXRjaGVkLiBCdXQgYXMgbG9uZyBhcyB3ZSBhcmUgd2lsbGluZyB0byBzdGF0ZSB0aGF0IHRoZSBwcmltYXJ5IGRpZmZlcmVuY2UKaXMgYmV0d2VlbiBjYWxwcm90ZWN0aW4gYW5kIGNvbnRyb2wsIHRoZW4gSSB3b3VsZCBzdWdnZXN0IGFnYWluc3QgY29uc2lkZXJpbmcKaXQuICBJIHRoaW5rIGl0IGlzIHJlYXNvbmFibGUgdG8gYXNzdW1lIHRoZSBzYW1wbGVzIGFyZSBub3Qgc3dpdGNoZWQgYW5kIHRoaXMKaXMganVzdCBob3cgdGhleSBhcmUuICBJZiBob3dldmVyLCB0aGUgcHJpbWFyeSBnb2FsIGlzIHRvIGludmVzdGlnYXRlIGNoYW5naW5nCmNvbmNlbnRyYXRpb25zIG9mIGNhbHByb3RlY3RpbiwgdGhlbiBJIHdvdWxkIHdhbnQgdG8gY2hlY2sgaW50byB0aGlzCmRpc3RyaWJ1dGlvbiBvZiBzYW1wbGVzIG9yIG1ha2UgdGhlIHN0YXRlbWVudCB0aGF0IHRoZXNlIHR3byBjb25jZW50cmF0aW9ucyBoYXZlCm5vIHNpZ25pZmljYW50IGRpZmZlcmVuY2UgdW5sZXNzIHdlIGdldCBtb3JlIHNhbXBsZXMgdG8gbG9vayBhdC4KCiMgQ2hlY2sgdG5zZXEgc2F0dXJhdGlvbgoKSSBtb3ZlZCB0aGlzIGFib3ZlIHRoZSBkaWZmZXJlbnRpYWwgImV4cHJlc3Npb24iLyJmaXRuZXNzIiBhbmFseXNpcyBzbyB0aGF0IHdlCmNhbiBhZGQgdGhlIHJlc3VsdHMgZnJvbSBpdCBhcyBhbm5vdGF0aW9uIGRhdGEgdG8gdGhlIERFIHRhYmxlcyBpZiByZXF1ZXN0ZWQuCgpgYGB7ciB0bnNlcV9zYXR1cmF0aW9uX2E5MDksIGV2YWw9RkFMU0V9CnNhdHVyYXRpb25fMDEgPC0gdG5zZXFfc2F0dXJhdGlvbigKICAicHJlcHJvY2Vzc2luZy8wMS9vdXRwdXRzL2Vzc2VudGlhbGl0eV9zYWdhbGFjdGlhZV9hOTA5L3RyaW1tZWRfY2EtdjBNMS53aWciLAogIGFkanVzdD0yKQpzYXR1cmF0aW9uXzAxJHBsb3QKc2F0dXJhdGlvbl8wMSRoaXRzX3N1bW1hcnkKZXNzX3BsdHMgPC0gcGxvdF9lc3NlbnRpYWxpdHkoCiAgInByZXByb2Nlc3NpbmcvMDEvb3V0cHV0cy9lc3NlbnRpYWxpdHlfc2FnYWxhY3RpYWVfYTkwOS9taF9lc3MtdHJpbW1lZF9jYS12ME0xX2dlbmVfdGFzX20yLmNzdiIpCmVzc19wbHRzW1siemJhciJdXQoKc2F0dXJhdGlvbl8wMiA8LSB0bnNlcV9zYXR1cmF0aW9uKAogICJwcmVwcm9jZXNzaW5nLzAyL291dHB1dHMvZXNzZW50aWFsaXR5X3NhZ2FsYWN0aWFlX2E5MDkvdHJpbW1lZF9jYS12ME0xLndpZyIpCnNhdHVyYXRpb25fMDIkcGxvdApzYXR1cmF0aW9uXzAyJGhpdHNfc3VtbWFyeQplc3NfcGx0cyA8LSBwbG90X2Vzc2VudGlhbGl0eSgKICAicHJlcHJvY2Vzc2luZy8wMi9vdXRwdXRzL2Vzc2VudGlhbGl0eV9zYWdhbGFjdGlhZV9hOTA5L21oX2Vzcy10cmltbWVkX2NhLXYwTTFfZ2VuZV90YXNfbTIuY3N2IikKZXNzX3BsdHNbWyJ6YmFyIl1dCgpzYXR1cmF0aW9uXzAzIDwtIHRuc2VxX3NhdHVyYXRpb24oCiAgInByZXByb2Nlc3NpbmcvMDMvb3V0cHV0cy9lc3NlbnRpYWxpdHlfc2FnYWxhY3RpYWVfYTkwOS90cmltbWVkX2NhLXYwTTEud2lnIikKc2F0dXJhdGlvbl8wMyRwbG90CnNhdHVyYXRpb25fMDMkaGl0c19zdW1tYXJ5CmVzc19wbHRzIDwtIHBsb3RfZXNzZW50aWFsaXR5KAogICJwcmVwcm9jZXNzaW5nLzAzL291dHB1dHMvZXNzZW50aWFsaXR5X3NhZ2FsYWN0aWFlX2E5MDkvbWhfZXNzLXRyaW1tZWRfY2EtdjBNMV9nZW5lX3Rhc19tMi5jc3YiKQplc3NfcGx0c1tbInpiYXIiXV0KCnNhdHVyYXRpb25fMDQgPC0gdG5zZXFfc2F0dXJhdGlvbigKICAicHJlcHJvY2Vzc2luZy8wNC9vdXRwdXRzL2Vzc2VudGlhbGl0eV9zYWdhbGFjdGlhZV9hOTA5L3RyaW1tZWRfY2EtdjBNMS53aWciKQpzYXR1cmF0aW9uXzA0JHBsb3QKc2F0dXJhdGlvbl8wNCRoaXRzX3N1bW1hcnkKZXNzX3BsdHMgPC0gcGxvdF9lc3NlbnRpYWxpdHkoCiAgInByZXByb2Nlc3NpbmcvMDQvb3V0cHV0cy9lc3NlbnRpYWxpdHlfc2FnYWxhY3RpYWVfYTkwOS9taF9lc3MtdHJpbW1lZF9jYS12ME0xX2dlbmVfdGFzX20yLmNzdiIpCmVzc19wbHRzW1siemJhciJdXQoKc2F0dXJhdGlvbl8wNSA8LSB0bnNlcV9zYXR1cmF0aW9uKAogICJwcmVwcm9jZXNzaW5nLzA1L291dHB1dHMvZXNzZW50aWFsaXR5X3NhZ2FsYWN0aWFlX2E5MDkvdHJpbW1lZF9jYS12ME0xLndpZyIpCnNhdHVyYXRpb25fMDUkcGxvdApzYXR1cmF0aW9uXzA1JGhpdHNfc3VtbWFyeQplc3NfcGx0cyA8LSBwbG90X2Vzc2VudGlhbGl0eSgKICAicHJlcHJvY2Vzc2luZy8wNi9vdXRwdXRzL2Vzc2VudGlhbGl0eV9zYWdhbGFjdGlhZV9hOTA5L21oX2Vzcy10cmltbWVkX2NhLXYwTTFfZ2VuZV90YXNfbTIuY3N2IikKZXNzX3BsdHNbWyJ6YmFyIl1dCgpzYXR1cmF0aW9uXzA2IDwtIHRuc2VxX3NhdHVyYXRpb24oCiAgInByZXByb2Nlc3NpbmcvMDYvb3V0cHV0cy9lc3NlbnRpYWxpdHlfc2FnYWxhY3RpYWVfYTkwOS90cmltbWVkX2NhLXYwTTEud2lnIikKc2F0dXJhdGlvbl8wNiRwbG90CnNhdHVyYXRpb25fMDYkaGl0c19zdW1tYXJ5CmVzc19wbHRzIDwtIHBsb3RfZXNzZW50aWFsaXR5KAogICJwcmVwcm9jZXNzaW5nLzA2L291dHB1dHMvZXNzZW50aWFsaXR5X3NhZ2FsYWN0aWFlX2E5MDkvbWhfZXNzLXRyaW1tZWRfY2EtdjBNMV9nZW5lX3Rhc19tMi5jc3YiKQplc3NfcGx0c1tbInpiYXIiXV0KCnNhdHVyYXRpb25fMDcgPC0gdG5zZXFfc2F0dXJhdGlvbigKICAicHJlcHJvY2Vzc2luZy8wNy9vdXRwdXRzL2Vzc2VudGlhbGl0eV9zYWdhbGFjdGlhZV9hOTA5L3RyaW1tZWRfY2EtdjBNMS53aWciKQpzYXR1cmF0aW9uXzA3JHBsb3QKc2F0dXJhdGlvbl8wNyRoaXRzX3N1bW1hcnkKZXNzX3BsdHMgPC0gcGxvdF9lc3NlbnRpYWxpdHkoCiAgInByZXByb2Nlc3NpbmcvMDcvb3V0cHV0cy9lc3NlbnRpYWxpdHlfc2FnYWxhY3RpYWVfYTkwOS9taF9lc3MtdHJpbW1lZF9jYS12ME0xX2dlbmVfdGFzX20yLmNzdiIpCmVzc19wbHRzW1siemJhciJdXQoKc2F0dXJhdGlvbl8wOCA8LSB0bnNlcV9zYXR1cmF0aW9uKAogICJwcmVwcm9jZXNzaW5nLzA4L291dHB1dHMvZXNzZW50aWFsaXR5X3NhZ2FsYWN0aWFlX2E5MDkvdHJpbW1lZF9jYS12ME0xLndpZyIpCnNhdHVyYXRpb25fMDgkcGxvdApzYXR1cmF0aW9uXzA4JGhpdHNfc3VtbWFyeQplc3NfcGx0cyA8LSBwbG90X2Vzc2VudGlhbGl0eSgKICAicHJlcHJvY2Vzc2luZy8wOC9vdXRwdXRzL2Vzc2VudGlhbGl0eV9zYWdhbGFjdGlhZV9hOTA5L21oX2Vzcy10cmltbWVkX2NhLXYwTTFfZ2VuZV90YXNfbTIuY3N2IikKZXNzX3BsdHNbWyJ6YmFyIl1dCgpzYXR1cmF0aW9uXzA5IDwtIHRuc2VxX3NhdHVyYXRpb24oCiAgInByZXByb2Nlc3NpbmcvMDkvb3V0cHV0cy9lc3NlbnRpYWxpdHlfc2FnYWxhY3RpYWVfYTkwOS90cmltbWVkX2NhLXYwTTEud2lnIikKc2F0dXJhdGlvbl8wOSRwbG90CnNhdHVyYXRpb25fMDkkaGl0c19zdW1tYXJ5CmVzc19wbHRzIDwtIHBsb3RfZXNzZW50aWFsaXR5KAogICJwcmVwcm9jZXNzaW5nLzA5L291dHB1dHMvZXNzZW50aWFsaXR5X3NhZ2FsYWN0aWFlX2E5MDkvbWhfZXNzLXRyaW1tZWRfY2EtdjBNMV9nZW5lX3Rhc19tMi5jc3YiKQplc3NfcGx0c1tbInpiYXIiXV0KCgpzYXR1cmF0aW9uX2NvbnRyb2wgPC0gdG5zZXFfc2F0dXJhdGlvbigKICAicHJlcHJvY2Vzc2luZy9jb21iaW5lZF9jb250cm9sL291dHB1dHMvZXNzZW50aWFsaXR5X3NhZ2FsYWN0aWFlX2E5MDkvdHJpbW1lZF9jYS12MW0xLndpZyIpCnNhdHVyYXRpb25fY29udHJvbCRwbG90CmVzc19wbHRzIDwtIHBsb3RfZXNzZW50aWFsaXR5KAogICJwcmVwcm9jZXNzaW5nL2NvbWJpbmVkX2NvbnRyb2wvb3V0cHV0cy9lc3NlbnRpYWxpdHlfc2FnYWxhY3RpYWVfYTkwOS9taF9lc3MtdHJpbW1lZF9jYS12MW0xX2dlbmVfdGFzX20yLmNzdiIpCmVzc19wbHRzW1siemJhciJdXQpgYGAKCmBgYHtyIHRuc2VxX2NqYjExMV9wbG90fQpwbHQgPC0gdG5zZXFfbXVsdGlfc2F0dXJhdGlvbihtZXRhPXBEYXRhKGNqYjExMV9leHB0KSwgbWV0YV9jb2x1bW49ImNqYjExMWVzc3dpZyIpCnBsdFtbInBsb3QiXV0gKyBnZ3Bsb3QyOjpzY2FsZV95X2NvbnRpbnVvdXMobGltaXRzPWMoMCwgMTIwMDApKQojIyBJIGV4cGVjdCB0aGUgc2F0dXJhdGlvbiBvZiB0aGlzIHRvIGJlIGEgYml0IGJldHRlciB0aGFuIDI2MDNWL1IuCgpwbHQgPC0gdG5zZXFfbXVsdGlfc2F0dXJhdGlvbihtZXRhPXBEYXRhKHZyMjYwM19leHB0KSwgbWV0YV9jb2x1bW49InZyMjYwM2Vzc3dpZyIpCnBsdFtbInBsb3QiXV0gKyBnZ3Bsb3QyOjpzY2FsZV95X2NvbnRpbnVvdXMobGltaXRzPWMoMCwgMTIwMDApKQojIyBobW0gdGhpcyBpcyBub3QgZGVmaW5pdGl2ZS4gIEl0IGxvb2tzIGxpa2UgY2piMTExIGhhcyBtb3JlIFRBcyB3aXRoIH4gMSBoaXQuCiMjIGJ1dCBSL1YgaGFzIG1vcmUgaGl0cyB3aXRoIH4gMTY8eDw2NCBoaXRzLgoKcGx0IDwtIHRuc2VxX211bHRpX3NhdHVyYXRpb24obWV0YT1wRGF0YShhOTA5X2V4cHQpLCBtZXRhX2NvbHVtbj0iYTkwOWVzc3dpZyIpCnBsdFtbInBsb3QiXV0gKyBnZ3Bsb3QyOjpzY2FsZV95X2NvbnRpbnVvdXMobGltaXRzPWMoMCwgMjAwMDApKQojIyBJIGFtIG5vdCBxdWl0ZSBzdXJlIGhvdyB0byBpbnRlcnByZXQgdGhpcyBvbmUsIHdlIGhhdmUgbXVjaCBtb3JlIGRpc2NyZXRlCiMjIG51bWJlcnMgb2YgcmVhZHMgdGhhbiB0aGUgb3RoZXJzLgpgYGAKCiMgQ2hhbmdlZCBnZW5lcwoKRm9yIGRpZmZlcmVudGlhbCBleHByZXNzaW9uLCBJIGFtIGdvaW5nIHRvIGFzc3VtZSB1bnRpbCBJIGhlYXIgb3RoZXJ3aXNlLCB0aGF0Cm15IGJhdGNoIGFzc2lnbm1lbnRzIGFyZSBub3QgY29ycmVjdCBhbmQgdGhhdCB0aGUgMSwyLDMgYXNzaWdubWVudHMgb2YgdGhlCnNhbXBsZSBuYW1lcyBkbyBub3QgYWN0dWFsbHkgZGVsaW5lYXRlIHNlcGFyYXRlIGJhdGNoZXMuICBUaG91Z2gsIGlmIHRoZXkgX2RvXwpkZWxpbmVhdGUgc2VwYXJhdGUgYmF0Y2hlcywgaXQgbWlnaHQgYmUgdGFrZW4gYXMgYSAodmVyeSlzbWFsbCBkZWdyZWUgb2YgZXZpZGVuY2UgdGhhdAowNCBhbmQgMDkgd2VyZSBzd2l0Y2hlZC4KCiMjIFN0cmFpbiBhOTA5CgpgYGB7ciBkZV9hOTA5fQpjb21iaW5lZF9lc3NlbnRpYWxpdHkgPC0gbGlzdCgKICAiY29udHJvbCIgPSAicHJlcHJvY2Vzc2luZy9jb21iaW5lZF9jb250cm9sL291dHB1dHMvZXNzZW50aWFsaXR5X3NhZ2FsYWN0aWFlX2E5MDkvbWhfZXNzLXRyaW1tZWRfY2EtdjFtMV9nZW5lX3Rhc19tMi5jc3YiLAogICJsb3ciID0gInByZXByb2Nlc3NpbmcvY29tYmluZWRfbG93L291dHB1dHMvZXNzZW50aWFsaXR5X3NhZ2FsYWN0aWFlX2E5MDkvbWhfZXNzLXRyaW1tZWRfY2EtdjFtMV9nZW5lX3Rhc19tMi5jc3YiLAogICJoaWdoIiA9ICJwcmVwcm9jZXNzaW5nL2NvbWJpbmVkX2hpZ2gvb3V0cHV0cy9lc3NlbnRpYWxpdHlfc2FnYWxhY3RpYWVfYTkwOS9taF9lc3MtdHJpbW1lZF9jYS12MW0xX2dlbmVfdGFzX20yLmNzdiIpCmVzc190YWJsZSA8LSBkYXRhLmZyYW1lKCkKZm9yIChmIGluIDE6bGVuZ3RoKGNvbWJpbmVkX2Vzc2VudGlhbGl0eSkpIHsKICBuYW1lIDwtIG5hbWVzKGNvbWJpbmVkX2Vzc2VudGlhbGl0eSlbZl0KICBjb2x1bW5fbmFtZXMgPC0gYygib3JmIiwgImsiLCAibiIsICJyIiwgInMiLCAiemJhciIsICJjYWxsIikKICBuYW1lcyA8LSBwYXN0ZTAobmFtZSwgIl8iLCBjb2x1bW5fbmFtZXMpCiAgciA8LSByZWFkcjo6cmVhZF90c3YoY29tYmluZWRfZXNzZW50aWFsaXR5W1tmXV0sIGNvbW1lbnQ9IiMiLCBjb2xfbmFtZXM9bmFtZXMpCiAgY29sbmFtZXMocilbMV0gPC0gIm9yZiIKICBpZiAoZiA9PSAxKSB7CiAgICBlc3NfdGFibGUgPC0gcgogIH0gZWxzZSB7CiAgICBlc3NfdGFibGUgPC0gbWVyZ2UoZXNzX3RhYmxlLCByLCBieT0ib3JmIikKICB9Cn0Kcm93bmFtZXMoZXNzX3RhYmxlKSA8LSBnc3ViKHg9ZXNzX3RhYmxlW1sib3JmIl1dLCBwYXR0ZXJuPSJeY2RzXyIsIHJlcGxhY2VtZW50PSIiKQplc3NfdGFibGVbWyJvcmYiXV0gPC0gTlVMTAoKYTkwOV9kZSA8LSBhbGxfcGFpcndpc2UoYTkwOV9leHB0LCBtb2RlbF9iYXRjaD1GQUxTRSwgcGFyYWxsZWw9RkFMU0UpCmE5MDlfY29udHJhc3RzIDwtIGxpc3QoCiAgImxvd192c19jb250cm9sIiA9IGMoImNhbF9sb3ciLCAiY29udHJvbCIpLAogICJoaWdoX3ZzX2NvbnRyb2wiID0gYygiY2FsX2hpZ2giLCAiY29udHJvbCIpKQphOTA5X3RhYmxlcyA8LSBjb21iaW5lX2RlX3RhYmxlcygKICBleHRyYV9hbm5vdD1lc3NfdGFibGUsCiAgYTkwOV9kZSwga2VlcGVycz1hOTA5X2NvbnRyYXN0cywKICBleGNlbD1nbHVlOjpnbHVlKCJleGNlbC97cnVuZGF0ZX0tYTkwOV90YWJsZXMtdnt2ZXJ9Lnhsc3giKSkKIyNhOTA5X3NpZyA8LSBleHRyYWN0X3NpZ25pZmljYW50X2dlbmVzKAojIyAgYTkwOV90YWJsZXMsCiMjICBleGNlbD1nbHVlOjpnbHVlKCJleGNlbC9hOTA5X3NpZy12e3Zlcn0ueGxzeCIpKQpgYGAKCiMjIFN0cmFpbiAyNjAzVi9SCgpgYGB7ciBkZV8yNjAzdnJ9CnZyMjYwM19kZSA8LSBhbGxfcGFpcndpc2UodnIyNjAzX2V4cHQsIG1vZGVsX2JhdGNoPUZBTFNFLCBwYXJhbGxlbD1GQUxTRSkKdnIyNjAzX3RhYmxlcyA8LSBjb21iaW5lX2RlX3RhYmxlcygKICB2cjI2MDNfZGUsIGtlZXBlcnM9YTkwOV9jb250cmFzdHMsCiAgZXhjZWw9Z2x1ZTo6Z2x1ZSgiZXhjZWwve3J1bmRhdGV9LXZyMjYwM190YWJsZXMtdnt2ZXJ9Lnhsc3giKSkKIyN2cjI2MzBfc2lnIDwtIGV4dHJhY3Rfc2lnbmlmaWNhbnRfZ2VuZXMoCiMjICB2cjI2MDNfdGFibGVzLAojIyAgZXhjZWw9Z2x1ZTo6Z2x1ZSgiZXhjZWwve3J1bmRhdGV9LXZyMjYwM19zaWctdnt2ZXJ9Lnhsc3giKSkKYGBgCgojIyBTdHJhaW4gQ0pCMTExCgpgYGB7ciBkZV9jamIxMTF9CmNqYjExMV9kZSA8LSBhbGxfcGFpcndpc2UoY2piMTExX2V4cHQsIG1vZGVsX2JhdGNoPUZBTFNFLCBwYXJhbGxlbD1GQUxTRSkKY2piMTExX3RhYmxlcyA8LSBjb21iaW5lX2RlX3RhYmxlcygKICBjamIxMTFfZGUsIGtlZXBlcnM9YTkwOV9jb250cmFzdHMsCiAgZXhjZWw9Z2x1ZTo6Z2x1ZSgiZXhjZWwve3J1bmRhdGV9LWNqYjExMV90YWJsZXMtdnt2ZXJ9Lnhsc3giKSkKIyNjamIxMTFfc2lnIDwtIGV4dHJhY3Rfc2lnbmlmaWNhbnRfZ2VuZXMoCiMjICBhOTA5X3RhYmxlcywKIyMgIGV4Y2VsPWdsdWU6OmdsdWUoImV4Y2VsL3tydW5kYXRlfS1jamIxMTFfc2lnLXZ7dmVyfS54bHN4IikpCmBgYAoKIyBDaXJjb3MKCmBgYHtyIGNpcmNvc30KIyMgQmVjYXVzZSBJIGRpZCBub3QgcHJvcGVybHkgY2xlYW4gdXAgbXkgbWVyZ2VzLgphbm5vdCA8LSBhOTA5X2Fubm90CgojIyBGb3IgcHJldHR5IHBsdXMvbWludXMgcGxvdHMKZ29fdGFibGUgPC0gYW5ub3RbLCBjKCJzdGFydCIsICJlbmQiLCAic3RyYW5kIiwgIkNPR0Z1biIpXQpjb2xuYW1lcyhnb190YWJsZSkgPC0gYygic3RhcnQiLCAic3RvcCIsICJzdHJhbmQiLCAiQ09HRnVuIikKZ29fdGFibGVbWyJnbyJdXSA8LSAiIgoKZXNzX2NpcmNvcyA8LSBlc3NfdGFibGVbLCBjKCJjb250cm9sX2NhbGwiLCAibG93X2NhbGwiLCAiaGlnaF9jYWxsIildICU+JQogIGRwbHlyOjptdXRhdGUoY29udHJvbF9udW0gPSBkcGx5cjo6Y2FzZV93aGVuKAogICAgICAgICAgIGNvbnRyb2xfY2FsbCA9PSAiRSIgfiAyLAogICAgICAgICAgIGNvbnRyb2xfY2FsbCA9PSAiTkUiIH4gMCwKICAgICAgICAgICBjb250cm9sX2NhbGwgPT0gIlMiIH4gLTEsCiAgICAgICAgICAgY29udHJvbF9jYWxsID09ICJVIiB+IDEpLAogICAgICAgICBsb3dfbnVtID0gZHBseXI6OmNhc2Vfd2hlbigKICAgICAgICAgICBsb3dfY2FsbCA9PSAiRSIgfiAyLAogICAgICAgICAgIGxvd19jYWxsID09ICJORSIgfiAwLAogICAgICAgICAgIGxvd19jYWxsID09ICJTIiB+IC0xLAogICAgICAgICAgIGxvd19jYWxsID09ICJVIiB+IDEpLAogICAgICAgICBoaWdoX251bSA9IGRwbHlyOjpjYXNlX3doZW4oCiAgICAgICAgICAgaGlnaF9jYWxsID09ICJFIiB+IDIsCiAgICAgICAgICAgaGlnaF9jYWxsID09ICJORSIgfiAwLAogICAgICAgICAgIGhpZ2hfY2FsbCA9PSAiUyIgfiAtMSwKICAgICAgICAgICBoaWdoX2NhbGwgPT0gIlUiIH4gMSkpCmVzc19jaXJjb3NbWyJjb250cm9sX2NhbGwiXV0gPC0gYXMuZmFjdG9yKGVzc19jaXJjb3NbWyJjb250cm9sX2NhbGwiXV0pCmVzc19jaXJjb3NbWyJsb3dfY2FsbCJdXSA8LSBhcy5mYWN0b3IoZXNzX2NpcmNvc1tbImxvd19jYWxsIl1dKQplc3NfY2lyY29zW1siaGlnaF9jYWxsIl1dIDwtIGFzLmZhY3Rvcihlc3NfY2lyY29zW1siaGlnaF9jYWxsIl1dKQpyb3duYW1lcyhlc3NfY2lyY29zKSA8LSByb3duYW1lcyhlc3NfdGFibGUpCmNvbG9ycyA8LSBjKCI5OTAwMDAiLCAiMDA4ODAwIiwgIjAwMDAwMCIsICIwMDAwQUEiKQpuYW1lcyhjb2xvcnMpIDwtIGMoIkUiLCAiTkUiLCAiUyIsICJVIikKCmNpcmNvc19jZmcgPC0gY2lyY29zX3ByZWZpeCgiYTkwOSIpCmE5MDlfa2FyeSA8LSBjaXJjb3Nfa2FyeW90eXBlKG5hbWU9ImE5MDkiLCBmYXN0YT0icmVmZXJlbmNlL3NhZ2FsYWN0aWFlX2E5MDkuZmFzdGEiKQphOTA5X3BsdXNfbWludXMgPC0gY2lyY29zX3BsdXNfbWludXMoZ29fdGFibGUsIGNmZ291dD1jaXJjb3NfY2ZnLCB3aWR0aD0wLjA0KQpsb3dfZGYgPC0gYTkwOV90YWJsZXNbWyJkYXRhIl1dW1sibG93X3ZzX2NvbnRyb2wiXV0KYTkwOV9sb3cgPC0gY2lyY29zX2hpc3QoYTkwOV90YWJsZXNbWyJkYXRhIl1dW1sibG93X3ZzX2NvbnRyb2wiXV0sIGNmZ291dD1jaXJjb3NfY2ZnLAogICAgICAgICAgICAgICAgICAgICAgICBhbm5vdF9kZj1hbm5vdCwgY29sbmFtZT0iZGVzZXFfbG9nZmMiLCBiYXNlbmFtZT0ibG93IiwKICAgICAgICAgICAgICAgICAgICAgICAgb3V0ZXI9YTkwOV9wbHVzX21pbnVzLCBmaWxsX2NvbG9yPSJibHVlIiwgd2lkdGg9MC4wNCkKYTkwOV9oaWdoIDwtIGNpcmNvc19oaXN0KGE5MDlfdGFibGVzW1siZGF0YSJdXVtbImhpZ2hfdnNfY29udHJvbCJdXSwgY2Znb3V0PWNpcmNvc19jZmcsCiAgICAgICAgICAgICAgICAgICAgICAgICBhbm5vdF9kZj1hbm5vdCwgY29sbmFtZT0iZGVzZXFfbG9nZmMiLCBiYXNlbmFtZT0iaGlnaCIsCiAgICAgICAgICAgICAgICAgICAgICAgICBvdXRlcj1hOTA5X2xvdywgZmlsbF9jb2xvcj0iZ3JlZW4iLCB3aWR0aD0wLjA0KQphOTA5X2NvbnRyb2xfdGlsZSA8LSBjaXJjb3NfdGlsZShlc3NfY2lyY29zLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbm5vdF9kZj1hbm5vdCwgY2Znb3V0PWNpcmNvc19jZmcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbG5hbWU9ImNvbnRyb2xfY2FsbCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbG9ycz1jb2xvcnMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhc2VuYW1lPSJjb250cm9sX3RpbGUiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRlcj1hOTA5X2hpZ2gsIHdpZHRoPTAuMDQpCmE5MDlfbG93X3RpbGUgPC0gY2lyY29zX3RpbGUoZXNzX2NpcmNvcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbm5vdF9kZj1hbm5vdCwgY2Znb3V0PWNpcmNvc19jZmcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sbmFtZT0ibG93X2NhbGwiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbG9ycz1jb2xvcnMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFzZW5hbWU9Imxvd190aWxlIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRlcj1hOTA5X2NvbnRyb2xfdGlsZSwgd2lkdGg9MC4wNCkKYTkwOV9oaWdoX3RpbGUgPC0gY2lyY29zX3RpbGUoZXNzX2NpcmNvcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbm5vdF9kZj1hbm5vdCwgY2Znb3V0PWNpcmNvc19jZmcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sbmFtZT0iaGlnaF9jYWxsIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xvcnM9Y29sb3JzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhc2VuYW1lPSJoaWdoX3RpbGUiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dGVyPWE5MDlfbG93X3RpbGUsIHdpZHRoPTAuMDQpCmE5MDlfc3VmZml4IDwtIGNpcmNvc19zdWZmaXgoY2lyY29zX2NmZykKbWFkZSA8LSBjaXJjb3NfbWFrZSgiYTkwOSIpCmBgYAoKIyBDaXJjb3MgZW1haWwgY29udmVyc2F0aW9uCgpIZXJlIGlzIChtb3N0IG9mKSB0aGUgdGV4dCBvZiBhIHJlY2VudCBlbWFpbCBmcm9tIEtldmluOgoKIgpJIHRoaW5rIGEgcGxvdCBvZiB0aGUgZm9sbG93aW5nIG1pZ2h0IGJlIHRoZSBiZXN0IGZvciB0aGUgcGFwZXIuICBJdCB3b3VsZCBqdXN0CnJlbW92ZSB0aGUgMiBCYXllc2lhbnMgb2YgdGhlIGhpZ2ggYW5kIGxvdywgYW5kIGFkZCB0aGUgbWFwcGluZyBvZiB0aGUKdHJhbnNwb3NvbiAoa3JhaXQpIHRvIHRoZSBnZW5vbWU6CgoxLiAgKyBTdHJhbmQgT1JGcyAoQ09HIGNvbG9yZWQpCjIuICAtICBTdHJhbmQgT1JGcyAoQ09HIGNvbG9yZWQpCjMuICArIFN0cmFuZCBLcm1pdCBpbnNlcnRpb25zCjQuICAtICBTdHJhbmQgS3JtaXQgaW5zZXJ0aW9ucwo1LiAgREVTZXEyIGxvdy9jb250cm9sIHNhbXBsZXMKNi4gIERFU2VxMiBoaWdoL2NvbnRyb2wgc2FtcGxlcwo3LiAgRGVKZXN1cyBCYXllc2lhbiByZXN1bHQgZm9yIGNvbnRyb2wgc2FtcGxlIG9ubHkgY29tYmluZWQuCgpUaGF0IHdheSB3ZSBjYW4gc2VlIHRoZSBjb3ZlcmFnZSBvZiB0aGUgS3JtaXQgaW5zZXJ0aW9ucyBhbmQgb25seSB0aGUgQmF5ZXNpYW4KaW4gY29udHJvbCBjb25kaXRpb25zIChicm9hZGx5IGVzc2VudGlhbCkuCiIKCkkgYW0gdGhpbmtpbmcgdGhhdCB0aGlzIGlzIG5vdCBhIHByb2JsZW0sIGJ1dCBJIHdpbGwgcHJvYmFibHkgZG8gMyBhbmQgNCBhcyAzCnJpbmdzLCBvbmUgZWFjaCBmb3IgdGhlICsvLSBzdHJhbmQgY29udHJvbC9sb3cvaGlnaCBzYW1wbGVzLgoKSW4gYW5vdGhlciBoYWxsd2F5IHF1ZXJ5LCBLZXZpbiBzdWdnZXN0ZWQgcnBrbSBvZiB0aGUgY29udHJvbC9sb3cvaGlnaCAnbWFzdGVyJwpsaWJyYXJpZXMuCgogZXJnby4uLgoKYGBge3IgY2lyY29zdjJ9CmNvbWJpbmVkX2V4cHQgPC0gY3JlYXRlX2V4cHQoInNhbXBsZV9zaGVldHMvc2FnYWxhY3RpYWVfY29tYmluZWRfc2FtcGxlcy54bHN4IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZW5lX2luZm89YTkwOV9hbm5vdCkKY29tYmluZWRfbm9ybSA8LSBub3JtYWxpemVfZXhwdChjb21iaW5lZF9leHB0LCBjb252ZXJ0PSJycGttIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFuc2Zvcm09ImxvZzIiLCBuYV90b196ZXJvPVRSVUUpCmNvbWJpbmVkX2V4cHJzIDwtIGV4cHJzKGNvbWJpbmVkX25vcm0pCgpjaXJjb3N2Ml9jZmcgPC0gY2lyY29zX3ByZWZpeCgiYTkwOXYyIikKYTkwOV9rYXJ5IDwtIGNpcmNvc19rYXJ5b3R5cGUobmFtZT0iYTkwOXYyIiwgZmFzdGE9InJlZmVyZW5jZS9zYWdhbGFjdGlhZV9hOTA5LmZhc3RhIikKYTkwOV9wbHVzX21pbnVzIDwtIGNpcmNvc19wbHVzX21pbnVzKGdvX3RhYmxlLCBjZmdvdXQ9Y2lyY29zdjJfY2ZnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGg9MC4wNSwgc3BhY2luZz0wLjAxLCB0aGlja25lc3M9NzUpCmE5MDlfY29udHJvbF9ycGttIDwtIGNpcmNvc19oaXN0KGNvbWJpbmVkX2V4cHJzLCBjZmdvdXQ9Y2lyY29zdjJfY2ZnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWR0aD0wLjA1LCBzcGFjaW5nPTAuMDEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFubm90X2RmPWFubm90LCBjb2xuYW1lPSJjb250cm9sIiwgYmFzZW5hbWU9ImNvbnRyb2xfcnBrbSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dGVyPWE5MDlfcGx1c19taW51cywgZmlsbF9jb2xvcj0idmRwYmx1ZSIpCmE5MDlfbG93X3Jwa20gPC0gY2lyY29zX2hpc3QoY29tYmluZWRfZXhwcnMsIGNmZ291dD1jaXJjb3N2Ml9jZmcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGg9MC4wNSwgc3BhY2luZz0wLjAxLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFubm90X2RmPWFubm90LCBjb2xuYW1lPSJsb3ciLCBiYXNlbmFtZT0ibG93X3Jwa20iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dGVyPWE5MDlfY29udHJvbF9ycGttLCBmaWxsX2NvbG9yPSJkcGJsdWUiKQphOTA5X2hpZ2hfcnBrbSA8LSBjaXJjb3NfaGlzdChjb21iaW5lZF9leHBycywgY2Znb3V0PWNpcmNvc3YyX2NmZywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGg9MC4wNSwgc3BhY2luZz0wLjAxLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFubm90X2RmPWFubm90LCBjb2xuYW1lPSJoaWdoIiwgYmFzZW5hbWU9ImhpZ2hfcnBrbSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0ZXI9YTkwOV9sb3dfcnBrbSwgZmlsbF9jb2xvcj0iYmx1ZSIpCmE5MDlfY29udHJvbF90aWxlIDwtIGNpcmNvc190aWxlKGVzc19jaXJjb3MsIGFubm90X2RmPWFubm90LCBjZmdvdXQ9Y2lyY29zdjJfY2ZnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWR0aD0wLjA2LCBwYWRkaW5nPTAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbG5hbWU9ImNvbnRyb2xfY2FsbCIsIGNvbG9ycz1jb2xvcnMsIGJhc2VuYW1lPSJjb250cm9sX3RpbGUiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRlcj1hOTA5X2hpZ2hfcnBrbSkKYTkwOV9sb3dfdGlsZSA8LSBjaXJjb3NfdGlsZShlc3NfY2lyY29zLCBhbm5vdF9kZj1hbm5vdCwgY2Znb3V0PWNpcmNvc3YyX2NmZywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWR0aD0wLjA2LCBwYWRkaW5nPTAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sbmFtZT0ibG93X2NhbGwiLCBjb2xvcnM9Y29sb3JzLCBiYXNlbmFtZT0ibG93X3RpbGUiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dGVyPWE5MDlfY29udHJvbF90aWxlKQphOTA5X2hpZ2hfdGlsZSA8LSBjaXJjb3NfdGlsZShlc3NfY2lyY29zLCBhbm5vdF9kZj1hbm5vdCwgY2Znb3V0PWNpcmNvc3YyX2NmZywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGg9MC4wNiwgcGFkZGluZz0wLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xuYW1lPSJoaWdoX2NhbGwiLCBjb2xvcnM9Y29sb3JzLCBiYXNlbmFtZT0iaGlnaF90aWxlIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0ZXI9YTkwOV9sb3dfdGlsZSkKYTkwOV9sb3cgPC0gY2lyY29zX2hpc3QoYTkwOV90YWJsZXNbWyJkYXRhIl1dW1sibG93X3ZzX2NvbnRyb2wiXV0sIGNmZ291dD1jaXJjb3N2Ml9jZmcsCiAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoPTAuMDYsIHNwYWNpbmc9MC4wLAogICAgICAgICAgICAgICAgICAgICAgICBhbm5vdF9kZj1hbm5vdCwgY29sbmFtZT0iZGVzZXFfbG9nZmMiLCBiYXNlbmFtZT0ibG93IiwKICAgICAgICAgICAgICAgICAgICAgICAgb3V0ZXI9YTkwOV9oaWdoX3RpbGUsIGZpbGxfY29sb3I9InZ2ZHBncmVlbiIpCmE5MDlfaGlnaCA8LSBjaXJjb3NfaGlzdChhOTA5X3RhYmxlc1tbImRhdGEiXV1bWyJoaWdoX3ZzX2NvbnRyb2wiXV0sIGNmZ291dD1jaXJjb3N2Ml9jZmcsCiAgICAgICAgICAgICAgICAgICAgICAgICB3aWR0aD0wLjA2LCBzcGFjaW5nPTAuMCwKICAgICAgICAgICAgICAgICAgICAgICAgIGFubm90X2RmPWFubm90LCBjb2xuYW1lPSJkZXNlcV9sb2dmYyIsIGJhc2VuYW1lPSJoaWdoIiwKICAgICAgICAgICAgICAgICAgICAgICAgIG91dGVyPWE5MDlfbG93LCBmaWxsX2NvbG9yPSJ2ZHBncmVlbiIpCmE5MDlfc3VmZml4IDwtIGNpcmNvc19zdWZmaXgoY2lyY29zdjJfY2ZnKQptYWRlIDwtIGNpcmNvc19tYWtlKCJhOTA5djIiKQpgYGAKCgpgYGB7ciBjaXJjb3N2M30KY2lyY29zdjNfY2ZnIDwtIGNpcmNvc19wcmVmaXgoImE5MDl2MyIpCmE5MDlfa2FyeSA8LSBjaXJjb3Nfa2FyeW90eXBlKG5hbWU9ImE5MDl2MyIsIGZhc3RhPSJyZWZlcmVuY2Uvc2FnYWxhY3RpYWVfYTkwOS5mYXN0YSIpCmE5MDlfcGx1c19taW51cyA8LSBjaXJjb3NfcGx1c19taW51cyhnb190YWJsZSwgY2Znb3V0PWNpcmNvc3YzX2NmZywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoPTAuMDUsIHNwYWNpbmc9MC4wMSwgdGhpY2tuZXNzPTc1KQphOTA5X2NvbnRyb2xfcnBrbSA8LSBjaXJjb3NfaGlzdChjb21iaW5lZF9leHBycywgY2Znb3V0PWNpcmNvc3YzX2NmZywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGg9MC4wNSwgc3BhY2luZz0wLjAxLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbm5vdF9kZj1hbm5vdCwgY29sbmFtZT0iY29udHJvbCIsIGJhc2VuYW1lPSJjb250cm9sX3Jwa20iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRlcj1hOTA5X3BsdXNfbWludXMsIGZpbGxfY29sb3I9InZkcGJsdWUiKQphOTA5X2xvd19ycGttIDwtIGNpcmNvc19oaXN0KGNvbWJpbmVkX2V4cHJzLCBjZmdvdXQ9Y2lyY29zdjNfY2ZnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoPTAuMDUsIHNwYWNpbmc9MC4wMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbm5vdF9kZj1hbm5vdCwgY29sbmFtZT0ibG93IiwgYmFzZW5hbWU9Imxvd19ycGttIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRlcj1hOTA5X2NvbnRyb2xfcnBrbSwgZmlsbF9jb2xvcj0iZHBibHVlIikKYTkwOV9oaWdoX3Jwa20gPC0gY2lyY29zX2hpc3QoY29tYmluZWRfZXhwcnMsIGNmZ291dD1jaXJjb3N2M19jZmcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoPTAuMDUsIHNwYWNpbmc9MC4wMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbm5vdF9kZj1hbm5vdCwgY29sbmFtZT0iaGlnaCIsIGJhc2VuYW1lPSJoaWdoX3Jwa20iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dGVyPWE5MDlfbG93X3Jwa20sIGZpbGxfY29sb3I9ImJsdWUiKQphOTA5X2xvdyA8LSBjaXJjb3NfaGlzdChhOTA5X3RhYmxlc1tbImRhdGEiXV1bWyJsb3dfdnNfY29udHJvbCJdXSwgY2Znb3V0PWNpcmNvc3YzX2NmZywKICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGg9MC4wNiwgc3BhY2luZz0wLjAsCiAgICAgICAgICAgICAgICAgICAgICAgIGFubm90X2RmPWFubm90LCBjb2xuYW1lPSJkZXNlcV9sb2dmYyIsIGJhc2VuYW1lPSJsb3ciLAogICAgICAgICAgICAgICAgICAgICAgICBvdXRlcj1hOTA5X2hpZ2hfcnBrbSwgZmlsbF9jb2xvcj0idnZkcGdyZWVuIikKYTkwOV9oaWdoIDwtIGNpcmNvc19oaXN0KGE5MDlfdGFibGVzW1siZGF0YSJdXVtbImhpZ2hfdnNfY29udHJvbCJdXSwgY2Znb3V0PWNpcmNvc3YzX2NmZywKICAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoPTAuMDYsIHNwYWNpbmc9MC4wLAogICAgICAgICAgICAgICAgICAgICAgICAgYW5ub3RfZGY9YW5ub3QsIGNvbG5hbWU9ImRlc2VxX2xvZ2ZjIiwgYmFzZW5hbWU9ImhpZ2giLAogICAgICAgICAgICAgICAgICAgICAgICAgb3V0ZXI9YTkwOV9sb3csIGZpbGxfY29sb3I9InZkcGdyZWVuIikKYTkwOV9zdWZmaXggPC0gY2lyY29zX3N1ZmZpeChjaXJjb3N2M19jZmcpCm1hZGUgPC0gY2lyY29zX21ha2UoImE5MDl2MyIpCmBgYAoKYGBge3IgY2lyY29zdjR9CmNvbWJpbmVkX2V4cHQgPC0gY3JlYXRlX2V4cHQoInNhbXBsZV9zaGVldHMvc2FnYWxhY3RpYWVfY29tYmluZWRfc2FtcGxlcy54bHN4IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZW5lX2luZm89YTkwOV9hbm5vdCkKY29tYmluZWRfbm9ybSA8LSBub3JtYWxpemVfZXhwdChjb21iaW5lZF9leHB0LCBjb252ZXJ0PSJycGttIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFuc2Zvcm09ImxvZzIiLCBuYV90b196ZXJvPVRSVUUpCmNvbWJpbmVkX2V4cHJzIDwtIGV4cHJzKGNvbWJpbmVkX25vcm0pCgpjaXJjb3N2NF9jZmcgPC0gY2lyY29zX3ByZWZpeCgiYTkwOXY0IikKYTkwOV9rYXJ5IDwtIGNpcmNvc19rYXJ5b3R5cGUobmFtZT0iYTkwOXY0IiwgZmFzdGE9InJlZmVyZW5jZS9zYWdhbGFjdGlhZV9hOTA5LmZhc3RhIikKYTkwOV9wbHVzX21pbnVzIDwtIGNpcmNvc19wbHVzX21pbnVzKGdvX3RhYmxlLCBjZmdvdXQ9Y2lyY29zdjRfY2ZnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGg9MC4wNSwgc3BhY2luZz0wLjAxLCB0aGlja25lc3M9NzUpCmE5MDlfY29udHJvbF9ycGttIDwtIGNpcmNvc19oaXN0KGNvbWJpbmVkX2V4cHJzLCBjZmdvdXQ9Y2lyY29zdjRfY2ZnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWR0aD0wLjA1LCBzcGFjaW5nPTAuMDEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFubm90X2RmPWFubm90LCBjb2xuYW1lPSJjb250cm9sIiwgYmFzZW5hbWU9ImNvbnRyb2xfcnBrbSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dGVyPWE5MDlfcGx1c19taW51cywgZmlsbF9jb2xvcj0idmRwYmx1ZSIpCmE5MDlfbG93X3Jwa20gPC0gY2lyY29zX2hpc3QoY29tYmluZWRfZXhwcnMsIGNmZ291dD1jaXJjb3N2NF9jZmcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGg9MC4wNSwgc3BhY2luZz0wLjAxLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFubm90X2RmPWFubm90LCBjb2xuYW1lPSJsb3ciLCBiYXNlbmFtZT0ibG93X3Jwa20iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dGVyPWE5MDlfY29udHJvbF9ycGttLCBmaWxsX2NvbG9yPSJkcGJsdWUiKQphOTA5X2hpZ2hfcnBrbSA8LSBjaXJjb3NfaGlzdChjb21iaW5lZF9leHBycywgY2Znb3V0PWNpcmNvc3Y0X2NmZywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGg9MC4wNSwgc3BhY2luZz0wLjAxLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFubm90X2RmPWFubm90LCBjb2xuYW1lPSJoaWdoIiwgYmFzZW5hbWU9ImhpZ2hfcnBrbSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0ZXI9YTkwOV9sb3dfcnBrbSwgZmlsbF9jb2xvcj0iYmx1ZSIpCmE5MDlfY29udHJvbF90aWxlIDwtIGNpcmNvc190aWxlKGVzc19jaXJjb3MsIGFubm90X2RmPWFubm90LCBjZmdvdXQ9Y2lyY29zdjRfY2ZnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWR0aD0wLjA2LCBwYWRkaW5nPTAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbG5hbWU9ImNvbnRyb2xfY2FsbCIsIGNvbG9ycz1jb2xvcnMsIGJhc2VuYW1lPSJjb250cm9sX3RpbGUiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRlcj1hOTA5X2hpZ2hfcnBrbSkKYTkwOV9sb3dfdGlsZSA8LSBjaXJjb3NfdGlsZShlc3NfY2lyY29zLCBhbm5vdF9kZj1hbm5vdCwgY2Znb3V0PWNpcmNvc3Y0X2NmZywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWR0aD0wLjA2LCBwYWRkaW5nPTAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sbmFtZT0ibG93X2NhbGwiLCBjb2xvcnM9Y29sb3JzLCBiYXNlbmFtZT0ibG93X3RpbGUiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dGVyPWE5MDlfY29udHJvbF90aWxlKQphOTA5X2hpZ2hfdGlsZSA8LSBjaXJjb3NfdGlsZShlc3NfY2lyY29zLCBhbm5vdF9kZj1hbm5vdCwgY2Znb3V0PWNpcmNvc3Y0X2NmZywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGg9MC4wNiwgcGFkZGluZz0wLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xuYW1lPSJoaWdoX2NhbGwiLCBjb2xvcnM9Y29sb3JzLCBiYXNlbmFtZT0iaGlnaF90aWxlIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0ZXI9YTkwOV9sb3dfdGlsZSkKYTkwOV9zdWZmaXggPC0gY2lyY29zX3N1ZmZpeChjaXJjb3N2NF9jZmcpCm1hZGUgPC0gY2lyY29zX21ha2UoImE5MDl2NCIpCmBgYAoKCmBgYHtyIHNhdmVtZSwgZXZhbD1GQUxTRX0KcGFuZGVyOjpwYW5kZXIoc2Vzc2lvbkluZm8oKSkKbWVzc2FnZShwYXN0ZTAoIlRoaXMgaXMgaHBnbHRvb2xzIGNvbW1pdDogIiwgZ2V0X2dpdF9jb21taXQoKSkpCnRoaXNfc2F2ZSA8LSBwYXN0ZTAoZ3N1YihwYXR0ZXJuPSJcXC5SbWQiLCByZXBsYWNlPSIiLCB4PXJtZF9maWxlKSwgIi12IiwgdmVyLCAiLnJkYS54eiIpCm1lc3NhZ2UocGFzdGUwKCJTYXZpbmcgdG8gIiwgdGhpc19zYXZlKSkKdG1wIDwtIHNtKHNhdmVtZShmaWxlbmFtZT10aGlzX3NhdmUpKQpgYGAK