1 Annotation version: 20200706

1.1 Genome annotation input

There are a few methods of importing annotation data into R. The following are two attempts, the second is currently being used in these analyses.

## Found the following hits: Leishmania major strain Friedlin, Leishmania major strain LV39c5, Leishmania major strain SD 75.1, choosing the first.
## Using: Leishmania major strain Friedlin.
## Found the following hits: Leishmania panamensis MHOM/COL/81/L13, Leishmania panamensis strain MHOM/PA/94/PSC-1, choosing the first.
## Using: Leishmania panamensis MHOM/COL/81/L13.
## Found: Leishmania mexicana MHOM/GT/2001/U1103
## Found: Leishmania amazonensis MHOM/BR/71973/M2269
## Found the following hits: Leishmania braziliensis MHOM/BR/75/M2904, Leishmania braziliensis MHOM/BR/75/M2904 2019, choosing the first.
## Using: Leishmania braziliensis MHOM/BR/75/M2904.
## Found the following hits: Leishmania donovani BPK282A1, Leishmania donovani CL-SL, Leishmania donovani strain BHU 1220, Leishmania donovani strain LV9, choosing the first.
## Using: Leishmania donovani BPK282A1.
## Found: Crithidia fasciculata strain Cf-Cl
##  org.Lpanamensis.MHOMCOL81L13.v46.eg.db is already installed.
##  org.Lbraziliensis.MHOMBR75M2904.v46.eg.db is already installed.
##  org.Ldonovani.BPK282A1.v46.eg.db is already installed.
##  org.Lmexicana.MHOMGT2001U1103.v46.eg.db is already installed.
##  org.Lmajor.Friedlin.v46.eg.db is already installed.
##  org.Cfasciculata.Cf.Cl.v46.eg.db is already installed.

Assuming the above packages got created, we may load them and extract the annotation data.

1.3 Extracting Cell Types

Maria Adelaida requested adding the xCell cell types to the data.

##             Length Class             Mode     
## spill           3  -none-            list     
## spill.array     3  -none-            list     
## signatures    489  GeneSetCollection list     
## genes       10808  -none-            character
## Loading required package: annotate
## Loading required package: XML
## Loading required package: graph
## 
## Attaching package: 'graph'
## The following object is masked from 'package:XML':
## 
##     addNode
## setName: aDC%HPCA%1.txt 
## geneIds: C1QA, C1QB, ..., CCL22 (total: 8)
## geneIdType: Null
## collectionType: Null 
## setIdentifier: PEDS-092FVH8-LT:623:Tue Jun  6 14:36:33 2017:2
## description: 
## organism: 
## pubMedIds: 
## urls: 
## contributor: 
## setVersion: 0.0.1
## creationDate:
##  [1] "aDC%HPCA%1.txt"          "aDC%HPCA%2.txt"         
##  [3] "aDC%HPCA%3.txt"          "aDC%IRIS%1.txt"         
##  [5] "aDC%IRIS%2.txt"          "aDC%IRIS%3.txt"         
##  [7] "Adipocytes%ENCODE%1.txt" "Adipocytes%ENCODE%2.txt"
##  [9] "Adipocytes%ENCODE%3.txt" "Adipocytes%FANTOM%1.txt"
## Starting 1: aDC
## Starting 2: Adipocytes
## Starting 3: Astrocytes
## Starting 4: B-cells
## Starting 5: Basophils
## Starting 6: CD4+ memory T-cells
## Starting 7: CD4+ naive T-cells
## Starting 8: CD4+ T-cells
## Starting 9: CD4+ Tcm
## Starting 10: CD4+ Tem
## Starting 11: CD8+ naive T-cells
## Starting 12: CD8+ T-cells
## Starting 13: CD8+ Tcm
## Starting 14: CD8+ Tem
## Starting 15: cDC
## Starting 16: Chondrocytes
## Starting 17: Class-switched memory B-cells
## Starting 18: CLP
## Starting 19: CMP
## Starting 20: DC
## Starting 21: Endothelial cells
## Starting 22: Eosinophils
## Starting 23: Epithelial cells
## Starting 24: Erythrocytes
## Starting 25: Fibroblasts
## Starting 26: GMP
## Starting 27: Hepatocytes
## Starting 28: HSC
## Starting 29: iDC
## Starting 30: Keratinocytes
## Starting 31: ly Endothelial cells
## Starting 32: Macrophages
## Starting 33: Macrophages M1
## Starting 34: Macrophages M2
## Starting 35: Mast cells
## Starting 36: Megakaryocytes
## Starting 37: Melanocytes
## Starting 38: Memory B-cells
## Starting 39: MEP
## Starting 40: Mesangial cells
## Starting 41: Monocytes
## Starting 42: MPP
## Starting 43: MSC
## Starting 44: mv Endothelial cells
## Starting 45: Myocytes
## Starting 46: naive B-cells
## Starting 47: Neurons
## Starting 48: Neutrophils
## Starting 49: NK cells
## Starting 50: NKT
## Starting 51: Osteoblast
## Starting 52: pDC
## Starting 53: Pericytes
## Starting 54: Plasma cells
## Starting 55: Platelets
## Starting 56: Preadipocytes
## Starting 57: pro B-cells
## Starting 58: Sebocytes
## Starting 59: Skeletal muscle
## Starting 60: Smooth muscle
## Starting 61: Tgd cells
## Starting 62: Th1 cells
## Starting 63: Th2 cells
## Starting 64: Tregs
##        found aDC Adipocytes Astrocytes B-cells Basophils CD4+ memory T-cells
## A1CF       0  NA         NA         NA      NA        NA                  NA
## A4GALT     0  NA         NA         NA      NA        NA                  NA
## AAAS       0  NA         NA         NA      NA        NA                  NA
## AADAC      0  NA         NA         NA      NA        NA                  NA
## AAK1       0  NA         NA         NA      NA        NA                  NA
## AAMP       0  NA         NA         NA      NA        NA                TRUE
##        CD4+ naive T-cells CD4+ T-cells CD4+ Tcm CD4+ Tem CD8+ naive T-cells
## A1CF                   NA           NA       NA       NA                 NA
## A4GALT                 NA           NA       NA       NA                 NA
## AAAS                   NA           NA       NA       NA                 NA
## AADAC                  NA           NA       NA       NA                 NA
## AAK1                 TRUE         TRUE     TRUE       NA                 NA
## AAMP                   NA           NA       NA       NA                 NA
##        CD8+ T-cells CD8+ Tcm CD8+ Tem cDC Chondrocytes
## A1CF             NA       NA       NA  NA           NA
## A4GALT           NA       NA       NA  NA           NA
## AAAS             NA       NA       NA  NA           NA
## AADAC            NA       NA       NA  NA           NA
## AAK1           TRUE       NA     TRUE  NA           NA
## AAMP             NA       NA       NA  NA           NA
##        Class-switched memory B-cells CLP CMP DC Endothelial cells Eosinophils
## A1CF                              NA  NA  NA NA                NA          NA
## A4GALT                            NA  NA  NA NA                NA          NA
## AAAS                              NA  NA  NA NA                NA          NA
## AADAC                             NA  NA  NA NA                NA          NA
## AAK1                              NA  NA  NA NA                NA          NA
## AAMP                              NA  NA  NA NA                NA          NA
##        Epithelial cells Erythrocytes Fibroblasts GMP Hepatocytes HSC iDC
## A1CF                 NA           NA          NA  NA        TRUE  NA  NA
## A4GALT             TRUE           NA          NA  NA          NA  NA  NA
## AAAS                 NA           NA          NA  NA          NA  NA  NA
## AADAC                NA           NA          NA  NA        TRUE  NA  NA
## AAK1                 NA           NA          NA  NA          NA  NA  NA
## AAMP                 NA           NA          NA  NA          NA  NA  NA
##        Keratinocytes ly Endothelial cells Macrophages Macrophages M1
## A1CF              NA                   NA          NA             NA
## A4GALT            NA                   NA          NA             NA
## AAAS              NA                   NA          NA             NA
## AADAC             NA                   NA          NA             NA
## AAK1              NA                   NA          NA             NA
## AAMP              NA                   NA          NA             NA
##        Macrophages M2 Mast cells Megakaryocytes Melanocytes Memory B-cells MEP
## A1CF               NA         NA             NA          NA             NA  NA
## A4GALT             NA         NA             NA          NA             NA  NA
## AAAS               NA         NA             NA          NA             NA  NA
## AADAC              NA         NA             NA          NA             NA  NA
## AAK1               NA         NA             NA          NA             NA  NA
## AAMP               NA         NA             NA          NA             NA  NA
##        Mesangial cells Monocytes MPP  MSC mv Endothelial cells Myocytes
## A1CF                NA        NA  NA   NA                   NA       NA
## A4GALT              NA        NA  NA   NA                   NA       NA
## AAAS                NA        NA  NA TRUE                   NA       NA
## AADAC               NA        NA  NA   NA                   NA       NA
## AAK1                NA        NA  NA   NA                   NA       NA
## AAMP                NA        NA  NA   NA                   NA       NA
##        naive B-cells Neurons Neutrophils NK cells NKT Osteoblast pDC Pericytes
## A1CF              NA      NA          NA       NA  NA         NA  NA        NA
## A4GALT            NA      NA          NA       NA  NA         NA  NA        NA
## AAAS              NA      NA          NA       NA  NA         NA  NA        NA
## AADAC             NA      NA          NA       NA  NA         NA  NA        NA
## AAK1              NA      NA          NA       NA  NA         NA  NA        NA
## AAMP              NA      NA          NA       NA  NA         NA  NA        NA
##        Plasma cells Platelets Preadipocytes pro B-cells Sebocytes
## A1CF             NA        NA            NA          NA        NA
## A4GALT           NA        NA            NA          NA        NA
## AAAS             NA        NA            NA          NA        NA
## AADAC            NA        NA            NA          NA        NA
## AAK1             NA        NA            NA          NA        NA
## AAMP             NA        NA            NA          NA        NA
##        Skeletal muscle Smooth muscle Tgd cells Th1 cells Th2 cells Tregs
## A1CF                NA            NA        NA        NA        NA    NA
## A4GALT              NA            NA        NA        NA        NA    NA
## AAAS                NA            NA        NA        NA        NA    NA
## AADAC               NA            NA        NA        NA        NA    NA
## AAK1                NA            NA        NA        NA        NA    NA
## AAMP                NA            NA        NA        NA        NA    NA

2 Putting the pieces together

The macrophage experiment has samples across 2 contexts, the host and parasite. The following block sets up one experiment for each. If you open the all_samples-species.xlsx files, you will note immediately that a few different attempts were made at ascertaining the most likely experimental factors that contributed to the readily apparent batch effects.

2.1 The human transcriptome mappings

Keep in mind that if I change the experimental design with new annotations, I must therefore regenerate the following.

## Reading the sample metadata.
## Dropped 1 rows from the sample metadata because they were blank.
## The sample definitions comprises: 11 rows(samples) and 56 columns(metadata fields).
## Reading count tables.
## Reading count files with read.table().
## /mnt/sshfs/cbcbsub01/fs/cbcb-lab/nelsayed/scratch/atb/rnaseq/lpanamensis_2016/preprocessing/hpgl0241/outputs/tophat_hsapiens/accepted_paired.count.xz contains 51046 rows.
## /mnt/sshfs/cbcbsub01/fs/cbcb-lab/nelsayed/scratch/atb/rnaseq/lpanamensis_2016/preprocessing/hpgl0242/outputs/tophat_hsapiens/accepted_paired.count.xz contains 51046 rows and merges to 51046 rows.
## /mnt/sshfs/cbcbsub01/fs/cbcb-lab/nelsayed/scratch/atb/rnaseq/lpanamensis_2016/preprocessing/hpgl0243/outputs/tophat_hsapiens/accepted_paired.count.xz contains 51046 rows and merges to 51046 rows.
## /mnt/sshfs/cbcbsub01/fs/cbcb-lab/nelsayed/scratch/atb/rnaseq/lpanamensis_2016/preprocessing/hpgl0244/outputs/tophat_hsapiens/accepted_paired.count.xz contains 51046 rows and merges to 51046 rows.
## /mnt/sshfs/cbcbsub01/fs/cbcb-lab/nelsayed/scratch/atb/rnaseq/lpanamensis_2016/preprocessing/hpgl0245/outputs/tophat_hsapiens/accepted_paired.count.xz contains 51046 rows and merges to 51046 rows.
## /mnt/sshfs/cbcbsub01/fs/cbcb-lab/nelsayed/scratch/atb/rnaseq/lpanamensis_2016/preprocessing/hpgl0246/outputs/tophat_hsapiens/accepted_paired.count.xz contains 51046 rows and merges to 51046 rows.
## /mnt/sshfs/cbcbsub01/fs/cbcb-lab/nelsayed/scratch/atb/rnaseq/lpanamensis_2016/preprocessing/hpgl0247/outputs/tophat_hsapiens/accepted_paired.count.xz contains 51046 rows and merges to 51046 rows.
## /mnt/sshfs/cbcbsub01/fs/cbcb-lab/nelsayed/scratch/atb/rnaseq/lpanamensis_2016/preprocessing/hpgl0248/outputs/tophat_hsapiens/accepted_paired.count.xz contains 51046 rows and merges to 51046 rows.
## /mnt/sshfs/cbcbsub01/fs/cbcb-lab/nelsayed/scratch/atb/rnaseq/lpanamensis_2016/preprocessing/hpgl0637/outputs/tophat_hsapiens/accepted_paired.count.xz contains 51046 rows and merges to 51046 rows.
## /mnt/sshfs/cbcbsub01/fs/cbcb-lab/nelsayed/scratch/atb/rnaseq/lpanamensis_2016/preprocessing/hpgl0638/outputs/tophat_hsapiens/accepted_paired.count.xz contains 51046 rows and merges to 51046 rows.
## /mnt/sshfs/cbcbsub01/fs/cbcb-lab/nelsayed/scratch/atb/rnaseq/lpanamensis_2016/preprocessing/hpgl0639/outputs/tophat_hsapiens/accepted_paired.count.xz contains 51046 rows and merges to 51046 rows.
## Finished reading count data.
## Matched 43897 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 51041 rows and 11 columns.
sampleid pathogenstrain experimentname tubelabel alias condition batch anotherbatch snpclade snpcladev2 snpcladev3 pathogenstrain1 label donor time pctmappedparasite pctcategory state sourcelab expperson pathogen host hostcelltype noofhostcells infectionperiodhpitimeofharvest moiexposure parasitespercell pctinf rnangul rnaqcpassed libraryconst libqcpassed index descriptonandremarks observation lowercaseid humanfile parasitefile bcftable salmonreads hssalmonmapped hssalmonmaprate lpsalmonmapped lpsalmonmaprate tophatpairs hstophataligned hstophatpct hstophatmulti hstophatdiscordant hstophatconcordantpct lptophataligned lptophatpct lptophatmulti lptophatdiscordant lpconcordantpct variantpositions file
HPGL0241 HPGL0241 none macrophage TM130-Nil (Blue label) Nil uninf a a undef undef undef none uninf_2 d130 undef undef 0 uninfected Ade Adriana none Human Human macs Max 2 mill 2h - 24h chase period NA unknown unknown 468 Y Wanderson Y 1 Uninfected human macrophages NA hpgl0241 preprocessing/hpgl0241/outputs/tophat_hsapiens/accepted_paired.count.xz undef undef 46628648 26156539 0.561 NA NA 46319335 40905961 0.8831 1374099 1430888 0.8522 NA NA NA NA NA NA null
## Before removal, there were 51041 entries.
## Now there are 18847 entries.
## Percent kept: 93.209, 95.095, 95.545, 96.588, 95.913, 96.249, 95.758, 96.106, 96.506, 96.391, 95.414
## Percent removed: 6.791, 4.905, 4.455, 3.412, 4.087, 3.751, 4.242, 3.894, 3.494, 3.609, 4.586

2.2 The parasite transcriptome mappings

The first three rows of the parasite experimental design.
sampleid pathogenstrain experimentname tubelabel alias condition batch anotherbatch snpclade snpcladev2 snpcladev3 pathogenstrain1 label donor time pctmappedparasite pctcategory state sourcelab expperson pathogen host hostcelltype noofhostcells infectionperiodhpitimeofharvest moiexposure parasitespercell pctinf rnangul rnaqcpassed libraryconst libqcpassed index descriptonandremarks observation lowercaseid humanfile parasitefile bcftable salmonreads hssalmonmapped hssalmonmaprate lpsalmonmapped lpsalmonmaprate tophatpairs hstophataligned hstophatpct hstophatmulti hstophatdiscordant hstophatconcordantpct lptophataligned lptophatpct lptophatmulti lptophatdiscordant lpconcordantpct variantpositions file
HPGL0242 HPGL0242 s2271 macrophage TM130-2271 Self-Healing sh a a white whitepink right s2271 sh_2271 d130 undef 30 3 self_heal Ade Adriana Lp Human Human macs Max 2 mill 2h - 24h chase period 0.0486 unknown unknown 276 Y Wanderson Y 8 Infected human macrophages. NA hpgl0242 preprocessing/hpgl0242/outputs/tophat_hsapiens/accepted_paired.count.xz preprocessing/hpgl0242/outputs/tophat_lpanamensis/accepted_paired.count.xz preprocessing/outputs/hpgl0242_parsed_count.txt 42742857 17945935 0.4199 8023463 0.1877 42612353 25394266 0.5959 869649 784620 0.5775 13117819 0.3078 350277 263923 0.3016 3930 null
HPGL0243 HPGL0243 s2272 macrophage TM130-2272 Self-Healing sh a a white whitepink right s2272 sh_2272 d130 undef 30 3 self_heal Ade Adriana Lp Human Human macs Max 2 mill 2h - 24h chase period 0.0486 unknown unknown 532 Y Wanderson Y 10 Infected human macrophages NA hpgl0243 preprocessing/hpgl0243/outputs/tophat_hsapiens/accepted_paired.count.xz preprocessing/hpgl0243/outputs/tophat_lpanamensis/accepted_paired.count.xz preprocessing/outputs/hpgl0243_parsed_count.txt 46796079 21046460 0.4497 6823750 0.1458 47344642 31160297 0.6582 1000248 924296 0.6386 11581460 0.2446 319338 245169 0.2394 NA null
HPGL0244 HPGL0244 s5433 macrophage TM130-5433 Chronic chr a a blue_self blue left s5433 chr_5433 d130 undef 15 1 chronic Ade Adriana Lp Human Human macs Max 2 mill 2h - 24h chase period 0.0486 unknown unknown 261 Y Wanderson Y 27 Infected human macrophages NA hpgl0244 preprocessing/hpgl0244/outputs/tophat_hsapiens/accepted_paired.count.xz preprocessing/hpgl0244/outputs/tophat_lpanamensis/accepted_paired.count.xz preprocessing/outputs/hpgl0244_parsed_count.txt 47150925 25281958 0.5362 3761371 0.0798 46925604 36379602 0.7753 1070964 991929 0.7541 5755998 0.1227 154830 116414 0.1202 85981 null

3 Supplemental Table 1

Table S1 is going to be a summary of the metadata in all_samples-combined This may also include some of the numbers regarding mapping %, etc.

Wanted columns:

  • Sample ID: HPGLxxxx
  • Donor Code: TM130 or PG1xx
  • Cell Type: Macrophage or PBMC
  • Infection Status: Infected or Uninfected
  • Disease Outcome: Chronic or Self-Healing or NA
  • Batch: A or B (macrophage); NA for PBMC
  • Number of reads that passed Illumina filter
  • Number of reads after trimming
  • Number of reads mapped - human
  • % reads mapped - human
  • Number of reads mapped - L.panamensis
  • % reads mapped - L.panamensis

This table is maintained as an excel file in the sample_sheets/ directory.

4 Sample Estimation, Macrophages: 20200706

This document is concerned with analyzing RNAseq data of human and parasite during the infection of human macrophages. A few different strains of L. panamensis were used; the experiment is therefore segregated into groups named ‘self-healing’, ‘chronic’, and ‘uninfected’. Two separate sets of libraries were generated, one earlier set with greater coverage, and a later set including only 1 uninfected sample, and 2-3 chronic samples.

4.1 Extract the macrophage experiment

The following subset operation extract the samples used for the macrophage experiment. The next three lines then change the colors from the defaults.

## The new colors are a character, changing according to condition.
## The new colors are a character, changing according to condition.

5 Compare methods

In our meeting this morning (20190708), Najib and Maria Adelaida asked for how the data looks depending on batch methodology.

## This function will replace the expt$expressionset slot with:
## log2(cpm(quant(cbcb(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
## 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: performing count filter with option: cbcb
## Removing 6993 low-count genes (11854 remaining).
## Step 2: normalizing the data with quant.
## Step 3: converting the data with cpm.
## Step 4: transforming the data with log2.
## transform_counts: Found 3 values equal to 0, adding 1 to the matrix.
## Step 5: not doing batch correction.
## Writing the image to: cpm_quant_filter_pca.png and calling dev.off().

## This function will replace the expt$expressionset slot with:
## log2(limma(cpm(quant(cbcb(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
## Step 1: performing count filter with option: cbcb
## Removing 6993 low-count genes (11854 remaining).
## Step 2: normalizing the data with quant.
## Step 3: converting the data with cpm.
## Step 4: transforming the data with log2.
## transform_counts: Found 3 values equal to 0, adding 1 to the matrix.
## Step 5: doing batch correction with limma.
## Note to self:  If you get an error like 'x contains missing values' The data has too many 0's and needs a stronger low-count filter applied.
## Passing off to all_adjusters.
## batch_counts: Before batch/surrogate estimation, 128654 entries are x>1: 99%.
## batch_counts: Before batch/surrogate estimation, 3 entries are x==0: 0%.
## batch_counts: Before batch/surrogate estimation, 1737 entries are 0<x<1: 1%.
## The be method chose 1 surrogate variables.
## batch_counts: Using limma's removeBatchEffect to remove batch effect.
## If you receive a warning: 'NANs produced', one potential reason is that the data was quantile normalized.
## There are 2 (0%) elements which are < 0 after batch correction.
## Setting low elements to zero.
## Writing the image to: lcqf_limma.png and calling dev.off().

## This function will replace the expt$expressionset slot with:
## log2(pca(cpm(quant(cbcb(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
## Step 1: performing count filter with option: cbcb
## Removing 6993 low-count genes (11854 remaining).
## Step 2: normalizing the data with quant.
## Step 3: converting the data with cpm.
## Step 4: transforming the data with log2.
## transform_counts: Found 3 values equal to 0, adding 1 to the matrix.
## Step 5: doing batch correction with pca.
## Note to self:  If you get an error like 'x contains missing values' The data has too many 0's and needs a stronger low-count filter applied.
## Passing off to all_adjusters.
## batch_counts: Before batch/surrogate estimation, 128654 entries are x>1: 99%.
## batch_counts: Before batch/surrogate estimation, 3 entries are x==0: 0%.
## batch_counts: Before batch/surrogate estimation, 1737 entries are 0<x<1: 1%.
## The be method chose 1 surrogate variables.
## Attempting pca surrogate estimation with 1 surrogate.
## There are 1 (0%) elements which are < 0 after batch correction.
## Setting low elements to zero.
## Writing the image to: lcqf_pca.png and calling dev.off().

## This function will replace the expt$expressionset slot with:
## log2(svaseq(cpm(cbcb(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
## Leaving the data unnormalized.  This is necessary for DESeq, but
##  EdgeR/limma might benefit from normalization.  Good choices include quantile,
##  size-factor, tmm, etc.
## Step 1: performing count filter with option: cbcb
## Removing 6993 low-count genes (11854 remaining).
## Step 2: not normalizing the data.
## Step 3: converting the data with cpm.
## Step 4: transforming the data with log2.
## transform_counts: Found 77 values equal to 0, adding 1 to the matrix.
## Step 5: doing batch correction with svaseq.
## Note to self:  If you get an error like 'x contains missing values' The data has too many 0's and needs a stronger low-count filter applied.
## Passing off to all_adjusters.
## batch_counts: Before batch/surrogate estimation, 128099 entries are x>1: 98%.
## batch_counts: Before batch/surrogate estimation, 77 entries are x==0: 0%.
## batch_counts: Before batch/surrogate estimation, 2218 entries are 0<x<1: 2%.
## The be method chose 1 surrogate variables.
## Attempting svaseq estimation with 1 surrogate.
## There are 2 (0%) elements which are < 0 after batch correction.
## Setting low elements to zero.
## Writing the image to: lcqf_svaseq.png and calling dev.off().

## This function will replace the expt$expressionset slot with:
## log2(fsva(cpm(cbcb(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
## Leaving the data unnormalized.  This is necessary for DESeq, but
##  EdgeR/limma might benefit from normalization.  Good choices include quantile,
##  size-factor, tmm, etc.
## Step 1: performing count filter with option: cbcb
## Removing 6993 low-count genes (11854 remaining).
## Step 2: not normalizing the data.
## Step 3: converting the data with cpm.
## Step 4: transforming the data with log2.
## transform_counts: Found 77 values equal to 0, adding 1 to the matrix.
## Step 5: doing batch correction with fsva.
## Note to self:  If you get an error like 'x contains missing values' The data has too many 0's and needs a stronger low-count filter applied.
## Passing off to all_adjusters.
## batch_counts: Before batch/surrogate estimation, 128099 entries are x>1: 98%.
## batch_counts: Before batch/surrogate estimation, 77 entries are x==0: 0%.
## batch_counts: Before batch/surrogate estimation, 2218 entries are 0<x<1: 2%.
## The be method chose 1 surrogate variables.
## Attempting fsva surrogate estimation with 1 surrogate.
## There are 2 (0%) elements which are < 0 after batch correction.
## Setting low elements to zero.
## Writing the image to: lcqf_sva.png and calling dev.off().

## This function will replace the expt$expressionset slot with:
## log2(combat(cpm(cbcb(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
## Leaving the data unnormalized.  This is necessary for DESeq, but
##  EdgeR/limma might benefit from normalization.  Good choices include quantile,
##  size-factor, tmm, etc.
## Step 1: performing count filter with option: cbcb
## Removing 6993 low-count genes (11854 remaining).
## Step 2: not normalizing the data.
## Step 3: converting the data with cpm.
## Step 4: transforming the data with log2.
## transform_counts: Found 77 values equal to 0, adding 1 to the matrix.
## Step 5: doing batch correction with combat.
## Note to self:  If you get an error like 'x contains missing values' The data has too many 0's and needs a stronger low-count filter applied.
## Passing off to all_adjusters.
## batch_counts: Before batch/surrogate estimation, 128099 entries are x>1: 98%.
## batch_counts: Before batch/surrogate estimation, 77 entries are x==0: 0%.
## batch_counts: Before batch/surrogate estimation, 2218 entries are 0<x<1: 2%.
## The be method chose 1 surrogate variables.
## batch_counts: Using combat with a prior, no scaling, and a null model.
## There are 13 (0%) elements which are < 0 after batch correction.
## Setting low elements to zero.
## Writing the image to: lcqf_combat.png and calling dev.off().

## This function will replace the expt$expressionset slot with:
## log2(combat_noprior(cpm(cbcb(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
## Leaving the data unnormalized.  This is necessary for DESeq, but
##  EdgeR/limma might benefit from normalization.  Good choices include quantile,
##  size-factor, tmm, etc.
## Step 1: performing count filter with option: cbcb
## Removing 6993 low-count genes (11854 remaining).
## Step 2: not normalizing the data.
## Step 3: converting the data with cpm.
## Step 4: transforming the data with log2.
## transform_counts: Found 77 values equal to 0, adding 1 to the matrix.
## Step 5: doing batch correction with combat_noprior.
## Note to self:  If you get an error like 'x contains missing values' The data has too many 0's and needs a stronger low-count filter applied.
## Passing off to all_adjusters.
## batch_counts: Before batch/surrogate estimation, 128099 entries are x>1: 98%.
## batch_counts: Before batch/surrogate estimation, 77 entries are x==0: 0%.
## batch_counts: Before batch/surrogate estimation, 2218 entries are 0<x<1: 2%.
## The be method chose 1 surrogate variables.
## batch_counts: Using combat without a prior and no scaling.
## This takes a long time!
## There are 18 (0%) elements which are < 0 after batch correction.
## Setting low elements to zero.
## Writing the image to: lcqf_combatnp.png and calling dev.off().

6 Figure S1

Figure S1 should include nice versions of the sample metrics. The normalization chosen is batch-in-model.

First, however, we will make some plots of the raw data.

Sample names are going to be ‘infectionstate_strainnumber’ : chr_7721

  • Panel A: Library sizes.
  • Panel B: Heatmap distance raw.
  • Panel C: PCA
  • Panel D: TSNE
## Writing the image to: fig_s1a_libsizes.tif and calling dev.off().
## Writing the image to: fig_s1b_heatmap.tif and calling dev.off().
## Writing the image to: fig_s1c_raw_pca.tif and calling dev.off().
## Writing the image to: fig_1a_norm_pca.tif and calling dev.off().

7 Differential Expression, Macrophage: 20200706

8 Differential expression analyses

The most likely batch method from the above is svaseq. Let us perform differential expression analyses with it along with a few other methods.

8.2 Batch in the model

8.2.1 Batch setup

In this attempt, we add a batch factor in the experimental model and see how it does.

## Plotting a PCA before surrogate/batch inclusion.
## Not putting labels on the PC plot.
## Using limma's removeBatchEffect to visualize with(out) batch inclusion.
## Not putting labels on the PC plot.
## Finished running DE analyses, collecting outputs.
## Comparing analyses.
## Writing a legend of columns.
## Printing a pca plot before/after surrogates/batch estimation.
## Working on 1/3: macro_chr-sh which is: chr/sh.
## Found inverse table with sh_vs_chr
## Working on 2/3: macro_chr-nil which is: chr/uninf.
## Found inverse table with uninf_vs_chr
## Working on 3/3: macro_sh-nil which is: sh/uninf.
## Found inverse table with uninf_vs_sh
## Adding venn plots for macro_chr-sh.
## Limma expression coefficients for macro_chr-sh; R^2: 0.994; equation: y = 0.999x + 0.0129
## Deseq expression coefficients for macro_chr-sh; R^2: 0.987; equation: y = 0.959x + 0.31
## Edger expression coefficients for macro_chr-sh; R^2: 0.992; equation: y = 0.987x + 0.138
## Adding venn plots for macro_chr-nil.
## Limma expression coefficients for macro_chr-nil; R^2: 0.994; equation: y = 0.999x + 0.0129
## Deseq expression coefficients for macro_chr-nil; R^2: 0.987; equation: y = 0.959x + 0.31
## Edger expression coefficients for macro_chr-nil; R^2: 0.992; equation: y = 0.987x + 0.138
## Adding venn plots for macro_sh-nil.
## Limma expression coefficients for macro_sh-nil; R^2: 0.994; equation: y = 0.999x + 0.0129
## Deseq expression coefficients for macro_sh-nil; R^2: 0.987; equation: y = 0.959x + 0.31
## Edger expression coefficients for macro_sh-nil; R^2: 0.992; equation: y = 0.987x + 0.138
## Writing summary information, compare_plot is: TRUE.
## Performing save of excel/20200709_hs_macr_batchmodel_contr-v20200706.xlsx.
## Writing a legend of columns.
## Printing significant genes to the file: excel/20200709_hs_macr_batchmodel_sig-v20200706.xlsx
## 1/3: Creating significant table up_deseq_macro_chr-sh
## 2/3: Creating significant table up_deseq_macro_chr-nil
## The up table macro_sh-nil is empty.
## The down table macro_sh-nil is empty.
## Adding significance bar plots.

8.3 SVA

8.3.1 sva setup

In this attempt, we tell all pairwise to invoke svaseq.

## batch_counts: Before batch/surrogate estimation, 130219 entries are x>1: 100%.
## batch_counts: Before batch/surrogate estimation, 77 entries are x==0: 0%.
## The be method chose 1 surrogate variables.
## Attempting svaseq estimation with 1 surrogate.
## Plotting a PCA before surrogate/batch inclusion.
## Not putting labels on the PC plot.
## Using svaseq to visualize before/after batch inclusion.
## Performing a test normalization with: raw
## This function will replace the expt$expressionset slot with:
## log2(svaseq(cpm(cbcb(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
## Leaving the data unnormalized.  This is necessary for DESeq, but
##  EdgeR/limma might benefit from normalization.  Good choices include quantile,
##  size-factor, tmm, etc.
## Step 1: performing count filter with option: cbcb
## Removing 0 low-count genes (11854 remaining).
## Step 2: not normalizing the data.
## Step 3: converting the data with cpm.
## Step 4: transforming the data with log2.
## transform_counts: Found 77 values equal to 0, adding 1 to the matrix.
## Step 5: doing batch correction with svaseq.
## Note to self:  If you get an error like 'x contains missing values' The data has too many 0's and needs a stronger low-count filter applied.
## Passing off to all_adjusters.
## batch_counts: Before batch/surrogate estimation, 128099 entries are x>1: 98%.
## batch_counts: Before batch/surrogate estimation, 77 entries are x==0: 0%.
## batch_counts: Before batch/surrogate estimation, 2218 entries are 0<x<1: 2%.
## The be method chose 1 surrogate variables.
## Attempting svaseq estimation with 1 surrogate.
## There are 2 (0%) elements which are < 0 after batch correction.
## Setting low elements to zero.
## Not putting labels on the PC plot.
## Finished running DE analyses, collecting outputs.
## Comparing analyses.
## Writing a legend of columns.
## Printing a pca plot before/after surrogates/batch estimation.
## Working on 1/3: macro_chr-sh which is: chr/sh.
## Found inverse table with sh_vs_chr
## Working on 2/3: macro_chr-nil which is: chr/uninf.
## Found inverse table with uninf_vs_chr
## Working on 3/3: macro_sh-nil which is: sh/uninf.
## Found inverse table with uninf_vs_sh
## Adding venn plots for macro_chr-sh.
## Limma expression coefficients for macro_chr-sh; R^2: 0.976; equation: y = 0.974x + 0.129
## Deseq expression coefficients for macro_chr-sh; R^2: 0.975; equation: y = 0.958x + 0.344
## Edger expression coefficients for macro_chr-sh; R^2: 0.975; equation: y = 0.958x + 0.27
## Adding venn plots for macro_chr-nil.
## Limma expression coefficients for macro_chr-nil; R^2: 0.976; equation: y = 0.974x + 0.129
## Deseq expression coefficients for macro_chr-nil; R^2: 0.975; equation: y = 0.958x + 0.344
## Edger expression coefficients for macro_chr-nil; R^2: 0.975; equation: y = 0.958x + 0.27
## Adding venn plots for macro_sh-nil.
## Limma expression coefficients for macro_sh-nil; R^2: 0.976; equation: y = 0.974x + 0.129
## Deseq expression coefficients for macro_sh-nil; R^2: 0.975; equation: y = 0.958x + 0.344
## Edger expression coefficients for macro_sh-nil; R^2: 0.975; equation: y = 0.958x + 0.27
## Writing summary information, compare_plot is: TRUE.
## Performing save of excel/20200709_hs_macr_svamodel_contr-v20200706.xlsx.
## Writing a legend of columns.
## Printing significant genes to the file: excel/20200709_hs_macr_svamodel_sig-v20200706.xlsx
## 1/3: Creating significant table up_deseq_macro_chr-sh
## 2/3: Creating significant table up_deseq_macro_chr-nil
## 3/3: Creating significant table up_deseq_macro_sh-nil
## Adding significance bar plots.

8.4 Compare these three results

## Testing method: limma.
## Adding method: limma to the set.
## Testing method: deseq.
## Adding method: deseq to the set.
## Testing method: edger.
## Adding method: edger to the set.
##  Starting method limma, table macro_chr-sh.
##  Starting method limma, table macro_chr-nil.
##  Starting method limma, table macro_sh-nil.
##  Starting method deseq, table macro_chr-sh.
##  Starting method deseq, table macro_chr-nil.
##  Starting method deseq, table macro_sh-nil.
## Warning in cor(x = fs[["x"]], y = fs[["y"]], method = cor_method): the standard
## deviation is zero
##  Starting method edger, table macro_chr-sh.
##  Starting method edger, table macro_chr-nil.
##  Starting method edger, table macro_sh-nil.

##  macro_chr-sh macro_chr-nil  macro_sh-nil 
##        0.6481        0.6568        0.9817
## Testing method: limma.
## Adding method: limma to the set.
## Testing method: deseq.
## Adding method: deseq to the set.
## Testing method: edger.
## Adding method: edger to the set.
##  Starting method limma, table macro_chr-sh.
##  Starting method limma, table macro_chr-nil.
##  Starting method limma, table macro_sh-nil.
##  Starting method deseq, table macro_chr-sh.
##  Starting method deseq, table macro_chr-nil.
##  Starting method deseq, table macro_sh-nil.
##  Starting method edger, table macro_chr-sh.
##  Starting method edger, table macro_chr-nil.
##  Starting method edger, table macro_sh-nil.

##  macro_chr-sh macro_chr-nil  macro_sh-nil 
##        0.6972        0.3393        0.4762

8.5 Two likely volcano plots

## The color list must have 4, setting it to the default.

## The color list must have 4, setting it to the default.

R version 4.0.0 (2020-04-24)

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: stats4, parallel, stats, graphics, grDevices, utils, datasets, methods and base

other attached packages: ruv(v.0.9.7.1), Homo.sapiens(v.1.3.1), TxDb.Hsapiens.UCSC.hg19.knownGene(v.3.2.2), org.Hs.eg.db(v.3.11.4), GO.db(v.3.11.4), OrganismDbi(v.1.30.0), GenomicFeatures(v.1.40.0), GenomicRanges(v.1.40.0), GenomeInfoDb(v.1.24.2), GSEABase(v.1.50.1), graph(v.1.66.0), annotate(v.1.66.0), XML(v.3.99-0.4), xCell(v.1.1.0), org.Cfasciculata.Cf.Cl.v46.eg.db(v.2020.07), org.Lmexicana.MHOMGT2001U1103.v46.eg.db(v.2020.07), org.Ldonovani.BPK282A1.v46.eg.db(v.2020.07), org.Lbraziliensis.MHOMBR75M2904.v46.eg.db(v.2020.07), org.Lpanamensis.MHOMCOL81L13.v46.eg.db(v.2020.07), org.Lmajor.Friedlin.v46.eg.db(v.2020.07), AnnotationDbi(v.1.50.1), IRanges(v.2.22.2), S4Vectors(v.0.26.1), futile.logger(v.1.4.3), hpgltools(v.1.0), testthat(v.2.3.2), Biobase(v.2.48.0) and BiocGenerics(v.0.34.0)

loaded via a namespace (and not attached): rappdirs(v.0.3.1), rtracklayer(v.1.48.0), AnnotationForge(v.1.30.1), R.methodsS3(v.1.8.0), tidyr(v.1.1.0), ggplot2(v.3.3.2), bit64(v.0.9-7), knitr(v.1.29), R.utils(v.2.9.2), DelayedArray(v.0.14.0), data.table(v.1.12.8), RCurl(v.1.98-1.2), doParallel(v.1.0.15), generics(v.0.0.2), preprocessCore(v.1.50.0), callr(v.3.4.3), cowplot(v.1.0.0), lambda.r(v.1.2.4), usethis(v.1.6.1), RSQLite(v.2.2.0), europepmc(v.0.4), rBiopaxParser(v.2.28.0), bit(v.1.1-15.2), enrichplot(v.1.8.1), xml2(v.1.3.2), httpuv(v.1.5.4), SummarizedExperiment(v.1.18.1), assertthat(v.0.2.1), viridis(v.0.5.1), xfun(v.0.15), hms(v.0.5.3), evaluate(v.0.14), promises(v.1.1.1), DEoptimR(v.1.0-8), fansi(v.0.4.1), progress(v.1.2.2), caTools(v.1.18.0), dbplyr(v.1.4.4), geneplotter(v.1.66.0), igraph(v.1.2.5), DBI(v.1.1.0), purrr(v.0.3.4), ellipsis(v.0.3.1), dplyr(v.1.0.0), backports(v.1.1.8), biomaRt(v.2.44.1), vctrs(v.0.3.1), remotes(v.2.1.1), withr(v.2.2.0), ggforce(v.0.3.2), triebeard(v.0.3.0), robustbase(v.0.93-6), AnnotationHubData(v.1.18.0), GenomicAlignments(v.1.24.0), prettyunits(v.1.1.1), DOSE(v.3.14.0), crayon(v.1.3.4), genefilter(v.1.70.0), edgeR(v.3.30.3), pkgconfig(v.2.0.3), labeling(v.0.3), tweenr(v.1.0.1), nlme(v.3.1-148), pkgload(v.1.1.0), devtools(v.2.3.0), rlang(v.0.4.6), lifecycle(v.0.2.0), downloader(v.0.4), BiocFileCache(v.1.12.0), directlabels(v.2020.6.17), AnnotationHub(v.2.20.0), rprojroot(v.1.3-2), polyclip(v.1.10-0), GSVA(v.1.36.2), matrixStats(v.0.56.0), Matrix(v.1.2-18), urltools(v.1.7.3), boot(v.1.3-25), base64enc(v.0.1-3), ggridges(v.0.5.2), processx(v.3.4.3), viridisLite(v.0.3.0), bitops(v.1.0-6), R.oo(v.1.23.0), KernSmooth(v.2.23-17), pander(v.0.6.3), Biostrings(v.2.56.0), blob(v.1.2.1), stringr(v.1.4.0), qvalue(v.2.20.0), gridGraphics(v.0.5-0), scales(v.1.1.1), memoise(v.1.1.0), magrittr(v.1.5), plyr(v.1.8.6), gplots(v.3.0.4), gdata(v.2.18.0), zlibbioc(v.1.34.0), compiler(v.4.0.0), scatterpie(v.0.1.4), RColorBrewer(v.1.1-2), lme4(v.1.1-23), DESeq2(v.1.28.1), Rsamtools(v.2.4.0), cli(v.2.0.2), XVector(v.0.28.0), ps(v.1.3.3), formatR(v.1.7), MASS(v.7.3-51.6), mgcv(v.1.8-31), tidyselect(v.1.1.0), stringi(v.1.4.6), EuPathDB(v.1.6.0), highr(v.0.8), yaml(v.2.2.1), GOSemSim(v.2.14.0), askpass(v.1.1), locfit(v.1.5-9.4), ggrepel(v.0.8.2), biocViews(v.1.56.1), grid(v.4.0.0), fastmatch(v.1.1-0), tools(v.4.0.0), rstudioapi(v.0.11), foreach(v.1.5.0), gridExtra(v.2.3), Rtsne(v.0.15), farver(v.2.0.3), ggraph(v.2.0.3), digest(v.0.6.25), rvcheck(v.0.1.8), BiocManager(v.1.30.10), pracma(v.2.2.9), shiny(v.1.5.0), quadprog(v.1.5-8), Rcpp(v.1.0.5), BiocVersion(v.3.11.1), later(v.1.1.0.1), httr(v.1.4.1), colorspace(v.1.4-1), rvest(v.0.3.5), fs(v.1.4.2), splines(v.4.0.0), RBGL(v.1.64.0), statmod(v.1.4.34), graphlayouts(v.0.7.0), shinythemes(v.1.1.2), ggplotify(v.0.0.5), sessioninfo(v.1.1.1), xtable(v.1.8-4), jsonlite(v.1.7.0), nloptr(v.1.2.2.2), futile.options(v.1.0.1), tidygraph(v.1.2.0), corpcor(v.1.6.9), Vennerable(v.3.1.0.9000), R6(v.2.4.1), RUnit(v.0.4.32), pillar(v.1.4.4), htmltools(v.0.5.0), mime(v.0.9), glue(v.1.4.1), fastmap(v.1.0.1), minqa(v.1.2.4), clusterProfiler(v.3.16.0), BiocParallel(v.1.22.0), interactiveDisplayBase(v.1.26.3), codetools(v.0.2-16), fgsea(v.1.14.0), pkgbuild(v.1.0.8), lattice(v.0.20-41), tibble(v.3.0.2), sva(v.3.36.0), pbkrtest(v.0.4-8.6), curl(v.4.3), colorRamps(v.2.3), gtools(v.3.8.2), zip(v.2.0.4), openxlsx(v.4.1.5), openssl(v.1.4.2), survival(v.3.2-3), limma(v.3.44.3), rmarkdown(v.2.3), desc(v.1.2.0), munsell(v.0.5.0), fastcluster(v.1.1.25), DO.db(v.2.9), GenomeInfoDbData(v.1.2.3), iterators(v.1.0.12), variancePartition(v.1.18.2), reshape2(v.1.4.4) and gtable(v.0.3.0)

## If you wish to reproduce this exact build of hpgltools, invoke the following:
## > git clone http://github.com/abelew/hpgltools.git
## > git reset 29c7dde0a24277fa95ac712188385a347c14c6f1
## This is hpgltools commit: Thu Jul 9 10:37:52 2020 -0400: 29c7dde0a24277fa95ac712188385a347c14c6f1
## Saving to macrophage_all_analyses_202007-v20200706.rda.xz
LS0tCnRpdGxlOiAiTC5wYW5hbWVuc2lzIDIwMjAwNzogRGlmZmVyZW50aWFsIEV4cHJlc3Npb24gaW4gaHVtYW4gbWFjcm9waGFnZXMuIgphdXRob3I6ICJhdGIgYWJlbGV3QGdtYWlsLmNvbSIKZGF0ZTogImByIFN5cy5EYXRlKClgIgpvdXRwdXQ6CiAgcm1kZm9ybWF0czo6cmVhZHRoZWRvd246CiAgICBjb2RlX2Rvd25sb2FkOiB0cnVlCiAgICBjb2RlX2ZvbGRpbmc6IHNob3cKICAgIGRmX3ByaW50OiBwYWdlZAogICAgZmlnX2NhcHRpb246IHRydWUKICAgIGZpZ19oZWlnaHQ6IDcKICAgIGZpZ193aWR0aDogNwogICAgaGlnaGxpZ2h0OiB0YW5nbwogICAgd2lkdGg6IDMwMAogICAga2VlcF9tZDogZmFsc2UKICAgIG1vZGU6IHNlbGZjb250YWluZWQKICAgIHRvY19mbG9hdDogdHJ1ZQogIEJpb2NTdHlsZTo6aHRtbF9kb2N1bWVudDoKICAgIGNvZGVfZG93bmxvYWQ6IHRydWUKICAgIGNvZGVfZm9sZGluZzogc2hvdwogICAgZmlnX2NhcHRpb246IHRydWUKICAgIGZpZ19oZWlnaHQ6IDcKICAgIGZpZ193aWR0aDogNwogICAgaGlnaGxpZ2h0OiB0YW5nbwogICAga2VlcF9tZDogZmFsc2UKICAgIG1vZGU6IHNlbGZjb250YWluZWQKICAgIHRvY19mbG9hdDogdHJ1ZQogIGh0bWxfZG9jdW1lbnQ6CiAgICBjb2RlX2Rvd25sb2FkOiB0cnVlCiAgICBjb2RlX2ZvbGRpbmc6IHNob3cKICAgIGZpZ19jYXB0aW9uOiB0cnVlCiAgICBmaWdfaGVpZ2h0OiA3CiAgICBmaWdfd2lkdGg6IDcKICAgIGhpZ2hsaWdodDogdGFuZ28KICAgIGtlZXBfbWQ6IGZhbHNlCiAgICBtb2RlOiBzZWxmY29udGFpbmVkCiAgICBudW1iZXJfc2VjdGlvbnM6IHRydWUKICAgIHNlbGZfY29udGFpbmVkOiB0cnVlCiAgICB0aGVtZTogcmVhZGFibGUKICAgIHRvYzogdHJ1ZQogICAgdG9jX2Zsb2F0OgogICAgICBjb2xsYXBzZWQ6IGZhbHNlCiAgICAgIHNtb290aF9zY3JvbGw6IGZhbHNlCi0tLQoKPHN0eWxlIHR5cGU9InRleHQvY3NzIj4KYm9keSwgdGQgewogIGZvbnQtc2l6ZTogMTZweDsKfQpjb2RlLnJ7CiAgZm9udC1zaXplOiAxNnB4Owp9CnByZSB7CiBmb250LXNpemU6IDE2cHgKfQo8L3N0eWxlPgoKYGBge3Igb3B0aW9ucywgaW5jbHVkZT1GQUxTRX0KbGlicmFyeSgiaHBnbHRvb2xzIikKdHQgPC0gZGV2dG9vbHM6OmxvYWRfYWxsKCIvZGF0YS9ocGdsdG9vbHMiKQprbml0cjo6b3B0c19rbml0JHNldChwcm9ncmVzcz1UUlVFLAogICAgICAgICAgICAgICAgICAgICB2ZXJib3NlPVRSVUUsCiAgICAgICAgICAgICAgICAgICAgIHdpZHRoPTkwLAogICAgICAgICAgICAgICAgICAgICBlY2hvPVRSVUUpCmtuaXRyOjpvcHRzX2NodW5rJHNldChlcnJvcj1UUlVFLAogICAgICAgICAgICAgICAgICAgICAgZmlnLndpZHRoPTgsCiAgICAgICAgICAgICAgICAgICAgICBmaWcuaGVpZ2h0PTgsCiAgICAgICAgICAgICAgICAgICAgICBkcGk9OTYpCm9sZF9vcHRpb25zIDwtIG9wdGlvbnMoZGlnaXRzPTQsCiAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nc0FzRmFjdG9ycz1GQUxTRSwKICAgICAgICAgICAgICAgICAgICAgICBrbml0ci5kdXBsaWNhdGUubGFiZWw9ImFsbG93IikKZ2dwbG90Mjo6dGhlbWVfc2V0KGdncGxvdDI6OnRoZW1lX2J3KGJhc2Vfc2l6ZT0xMCkpCnJ1bmRhdGUgPC0gZm9ybWF0KFN5cy5EYXRlKCksIGZvcm1hdD0iJVklbSVkIikKcHJldmlvdXNfZmlsZSA8LSAiaW5kZXguUm1kIgp2ZXIgPC0gIjIwMjAwNzA2IgoKIyN0bXAgPC0gc20obG9hZG1lKGZpbGVuYW1lPXBhc3RlMChnc3ViKHBhdHRlcm49IlxcLlJtZCIsIHJlcGxhY2U9IiIsIHg9cHJldmlvdXNfZmlsZSksICItdiIsIHZlciwgIi5yZGEueHoiKSkpCnJtZF9maWxlIDwtICJtYWNyb3BoYWdlX2FsbF9hbmFseXNlc18yMDIwMDcuUm1kIgpgYGAKCiMgQW5ub3RhdGlvbiB2ZXJzaW9uOiBgciB2ZXJgCgojIyBHZW5vbWUgYW5ub3RhdGlvbiBpbnB1dAoKVGhlcmUgYXJlIGEgZmV3IG1ldGhvZHMgb2YgaW1wb3J0aW5nIGFubm90YXRpb24gZGF0YSBpbnRvIFIuICBUaGUgZm9sbG93aW5nIGFyZQp0d28gYXR0ZW1wdHMsIHRoZSBzZWNvbmQgaXMgY3VycmVudGx5IGJlaW5nIHVzZWQgaW4gdGhlc2UgYW5hbHlzZXMuCgpgYGB7ciBtYWtlX29yZ2RifQptZXRhIDwtIEV1UGF0aERCOjpkb3dubG9hZF9ldXBhdGhfbWV0YWRhdGEod2Vic2VydmljZT0idHJpdHJ5cGRiIikKCmxtX2VudHJ5IDwtIEV1UGF0aERCOjpnZXRfZXVwYXRoX2VudHJ5KHNwZWNpZXM9IkxlaXNobWFuaWEgbWFqb3IiLCBtZXRhZGF0YT1tZXRhKQpscF9lbnRyeSA8LSBFdVBhdGhEQjo6Z2V0X2V1cGF0aF9lbnRyeShzcGVjaWVzPSJMZWlzaG1hbmlhIHBhbmFtZW5zaXMiLCBtZXRhZGF0YT1tZXRhKQpsbWV4X2VudHJ5IDwtIEV1UGF0aERCOjpnZXRfZXVwYXRoX2VudHJ5KHNwZWNpZXM9IkxlaXNobWFuaWEgbWV4aWNhbmEiLCBtZXRhZGF0YT1tZXRhKQpsYW1hX2VudHJ5IDwtIEV1UGF0aERCOjpnZXRfZXVwYXRoX2VudHJ5KHNwZWNpZXM9IkxlaXNobWFuaWEgYW1hem9uZW5zaXMiLCBtZXRhZGF0YT1tZXRhKQpsYl9lbnRyeSA8LSBFdVBhdGhEQjo6Z2V0X2V1cGF0aF9lbnRyeShzcGVjaWVzPSIyOTA0IiwgbWV0YWRhdGE9bWV0YSkKbGRfZW50cnkgPC0gRXVQYXRoREI6OmdldF9ldXBhdGhfZW50cnkoc3BlY2llcz0iZG9ub3ZhbmkiLCBtZXRhZGF0YT1tZXRhKQpjcml0X2VudHJ5IDwtIEV1UGF0aERCOjpnZXRfZXVwYXRoX2VudHJ5KHNwZWNpZXM9IkNyaXRoIiwgbWV0YWRhdGE9bWV0YSkKCnRlc3RpbmdfcGFuYW1lbnNpcyA8LSBFdVBhdGhEQjo6bWFrZV9ldXBhdGhfb3JnZGIoZW50cnk9bHBfZW50cnkpCnRlc3RpbmdfYnJhemlsaWVuc2lzIDwtIEV1UGF0aERCOjptYWtlX2V1cGF0aF9vcmdkYihlbnRyeT1sYl9lbnRyeSkKdGVzdGluZ19kb25vdmFuaSA8LSBFdVBhdGhEQjo6bWFrZV9ldXBhdGhfb3JnZGIoZW50cnk9bGRfZW50cnkpCnRlc3RpbmdfbWV4aWNhbmEgPC0gRXVQYXRoREI6Om1ha2VfZXVwYXRoX29yZ2RiKGVudHJ5PWxtZXhfZW50cnkpCnRlc3RpbmdfbWFqb3IgPC0gRXVQYXRoREI6Om1ha2VfZXVwYXRoX29yZ2RiKGVudHJ5PWxtX2VudHJ5KQp0ZXN0aW5nX2NyaXRoIDwtIEV1UGF0aERCOjptYWtlX2V1cGF0aF9vcmdkYihlbnRyeT1jcml0X2VudHJ5KQpgYGAKCkFzc3VtaW5nIHRoZSBhYm92ZSBwYWNrYWdlcyBnb3QgY3JlYXRlZCwgd2UgbWF5IGxvYWQgdGhlbSBhbmQgZXh0cmFjdCB0aGUKYW5ub3RhdGlvbiBkYXRhLgoKYGBge3IgbHBhbmFtZW5zaXNfb3JnZGJ9CndhbnRlZF9maWVsZHMgPC0gYygiYW5ub3RfY2RzX2xlbmd0aCIsICJhbm5vdF9jaHJvbW9zb21lIiwgImFubm90X2dlbmVfZW50cmV6X2lkIiwKICAgICAgICAgICAgICAgICAgICJhbm5vdF9nZW5lX25hbWUiLCAiYW5ub3Rfc3RyYW5kIiwgImdpZCIsICJnb19nb19pZCIsCiAgICAgICAgICAgICAgICAgICAiZ29fZ29fdGVybV9uYW1lIiwgImdvX29udG9sb2d5IiwKICAgICAgICAgICAgICAgICAgICJpbnRlcnByb19kZXNjcmlwdGlvbiIgLCJpbnRlcnByb19lX3ZhbHVlIiwgInR5cGVfZ2VuZV90eXBlIikKCmxtX29yZyA8LSBzbShFdVBhdGhEQjo6bG9hZF9ldXBhdGhfYW5ub3RhdGlvbnMocXVlcnk9bG1fZW50cnkpKQpscF9vcmcgPC0gc20oRXVQYXRoREI6OmxvYWRfZXVwYXRoX2Fubm90YXRpb25zKHF1ZXJ5PWxwX2VudHJ5KSkKbGJfb3JnIDwtIHNtKEV1UGF0aERCOjpsb2FkX2V1cGF0aF9hbm5vdGF0aW9ucyhxdWVyeT1sYl9lbnRyeSkpCmxkX29yZyA8LSBzbShFdVBhdGhEQjo6bG9hZF9ldXBhdGhfYW5ub3RhdGlvbnMocXVlcnk9bGRfZW50cnkpKQpsbWV4X29yZyA8LSBzbShFdVBhdGhEQjo6bG9hZF9ldXBhdGhfYW5ub3RhdGlvbnMocXVlcnk9bG1leF9lbnRyeSkpCmNmX29ydCA8LSBzbShFdVBhdGhEQjo6bG9hZF9ldXBhdGhfYW5ub3RhdGlvbnMocXVlcnk9Y3JpdF9lbnRyeSkpCmBgYAoKIyMgUmVhZCBhIGdmZiBmaWxlCgpJbiBjb250cmFzdCwgaXQgaXMgcG9zc2libGUgdG8gbG9hZCBtb3N0IGFubm90YXRpb25zIG9mIGludGVyZXN0IGRpcmVjdGx5IGZyb20KdGhlIGdmZiBmaWxlcyB1c2VkIGluIHRoZSBhbGlnbm1lbnRzLiAgTW9yZSBpbi1kZXB0aCBpbmZvcm1hdGlvbiBmb3IgdGhlIGh1bWFuCnRyYW5zY3JpcHRvbWUgbWF5IGJlIGV4dHJhY3RlZCBmcm9tIGJpb21hcnQuCgpgYGB7ciBnZW5vbWVfaW5wdXR9CiMjIFRoZSBvbGQgd2F5IG9mIGdldHRpbmcgZ2Vub21lL2Fubm90YXRpb24gZGF0YQpscF9nZmYgPC0gInJlZmVyZW5jZS9scGFuYW1lbnNpcy5nZmYiCmxiX2dmZiA8LSAicmVmZXJlbmNlL2xicmF6aWxpZW5zaXMuZ2ZmIgpoc19nZmYgPC0gInJlZmVyZW5jZS9oc2FwaWVucy5ndGYiCgpscF9mYXN0YSA8LSAicmVmZXJlbmNlL2xwYW5hbWVuc2lzLmZhc3RhLnh6IgpsYl9mYXN0YSA8LSAicmVmZXJlbmNlL2xicmF6aWxpZW5zaXMuZmFzdGEueHoiCmhzX2Zhc3RhIDwtICJyZWZlcmVuY2UvaHNhcGllbnMuZmFzdGEueHoiCgpscF9hbm5vdGF0aW9ucyA8LSBzbShsb2FkX2dmZl9hbm5vdGF0aW9ucyhscF9nZmYsIHR5cGU9ImdlbmUiKSkKcm93bmFtZXMobHBfYW5ub3RhdGlvbnMpIDwtIHBhc3RlMCgiZXhvbl8iLCBscF9hbm5vdGF0aW9ucyR3ZWJfaWQsICIuMSIpCgpsYl9hbm5vdGF0aW9ucyA8LSBzbShsb2FkX2dmZl9hbm5vdGF0aW9ucyhsYl9nZmYsIHR5cGU9ImdlbmUiKSkKCmhzX2dmZl9hbm5vdCA8LSBzbShsb2FkX2dmZl9hbm5vdGF0aW9ucyhoc19nZmYsIGlkX2NvbD0iZ2VuZV9pZCIpKQpoc19hbm5vdGF0aW9ucyA8LSBzbShsb2FkX2Jpb21hcnRfYW5ub3RhdGlvbnMoKSkkYW5ub3RhdGlvbgpoc19hbm5vdGF0aW9ucyRJRCA8LSBoc19hbm5vdGF0aW9ucyRnZW5lSUQKcm93bmFtZXMoaHNfYW5ub3RhdGlvbnMpIDwtIG1ha2UubmFtZXMoaHNfYW5ub3RhdGlvbnNbWyJlbnNlbWJsX2dlbmVfaWQiXV0sIHVuaXF1ZT1UUlVFKQpkaW0oaHNfYW5ub3RhdGlvbnMpCgpscF9zaXplX2Rpc3QgPC0gcGxvdF9oaXN0b2dyYW0obHBfYW5ub3RhdGlvbnNbWyJ3aWR0aCJdXSkKbHBfc2l6ZV9kaXN0Cgpoc19zaXplX2Rpc3QgPC0gcGxvdF9oaXN0b2dyYW0oaHNfYW5ub3RhdGlvbnNbWyJjZHNfbGVuZ3RoIl1dKQpoc19zaXplX2Rpc3QgKwogIGdncGxvdDI6OnNjYWxlX3hfY29udGludW91cyhsaW1pdHM9YygwLCAyMDAwMCkpCmBgYAoKIyMgRXh0cmFjdGluZyBDZWxsIFR5cGVzCgpNYXJpYSBBZGVsYWlkYSByZXF1ZXN0ZWQgYWRkaW5nIHRoZSB4Q2VsbCBjZWxsIHR5cGVzIHRvIHRoZSBkYXRhLgoKYGBge3IgeENlbGxfZGF0YX0KbGlicmFyeSh4Q2VsbCkKZGF0YSgieENlbGwuZGF0YSIsIHBhY2thZ2U9InhDZWxsIikKc3VtbWFyeSh4Q2VsbC5kYXRhKQpsaWJyYXJ5KEdTRUFCYXNlKQpkZXRhaWxzKHhDZWxsLmRhdGEkc2lnbmF0dXJlc1tbMV1dKQoKc2lncyA8LSB4Q2VsbC5kYXRhJHNpZ25hdHVyZXMKaGVhZChuYW1lcyhzaWdzKSwgbj0xMCkKIyMgSGVyZSB3ZSBzZWUgdGhhdCB0aGUgc2lnbmF0dXJlcyBhcmUgZW5jb2RlZCBhcyAzIGVsZW1lbnQgbGlzdHMsIHRoZSBmaXJzdCBlbGVtZW50IGlzIHRoZQojIyBjZWxsIHR5cGUsIGZvbGxvd2VkIGJ5IHNvdXJjZSwgZm9sbG93ZWQgYnkgcmVwbGljYXRlLnR4dC4KY2VsbF90eXBlcyA8LSB1bmxpc3QobGFwcGx5KHN0cnNwbGl0KHg9bmFtZXMoc2lncyksIHNwbGl0PSIlIiksIGZ1bmN0aW9uKHgpIHsgeFtbMV1dIH0pKQpjZWxsX3NvdXJjZXMgPC0gdW5saXN0KGxhcHBseShzdHJzcGxpdCh4PW5hbWVzKHNpZ3MpLCBzcGxpdD0iJSIpLCBmdW5jdGlvbih4KSB7IHhbWzJdXSB9KSkKdHlwZV9mYWN0IDwtIGFzLmZhY3RvcihjZWxsX3R5cGVzKQp0eXBlcyA8LSBsZXZlbHModHlwZV9mYWN0KQoKY2VsbHR5cGVzX3RvX2dlbmVzIDwtIGxpc3QoKQpmb3IgKGMgaW4gMTpsZW5ndGgodHlwZXMpKSB7CiAgdHlwZSA8LSB0eXBlc1tjXQogIGlkeCA8LSBjZWxsX3R5cGVzID09IHR5cGUKICBzZXQgPC0gc2lnc1tpZHhdCiAgZ2VuZXMgPC0gc2V0ICU+JQogICAgZ2VuZUlkcygpICU+JQogICAgdW5saXN0KCkKICBjZWxsdHlwZXNfdG9fZ2VuZXNbW3R5cGVdXSA8LSBhcy5jaGFyYWN0ZXIoZ2VuZXMpCn0KZ2VuZXNfdG9fY2VsbHR5cGVzIDwtIEJpb2Jhc2U6OnJldmVyc2VTcGxpdChjZWxsdHlwZXNfdG9fZ2VuZXMpCgpnMmNfZGYgPC0gZGF0YS5mcmFtZShyb3cubmFtZXM9dW5pcXVlKG5hbWVzKGdlbmVzX3RvX2NlbGx0eXBlcykpKQpnMmNfZGZbWyJmb3VuZCJdXSA8LSAwCmZvciAoYyBpbiAxOmxlbmd0aChjZWxsdHlwZXNfdG9fZ2VuZXMpKSB7CiAgY2VsbHR5cGVfbmFtZSA8LSBuYW1lcyhjZWxsdHlwZXNfdG9fZ2VuZXMpW1tjXV0KICBtZXNzYWdlKCJTdGFydGluZyAiLCBjLCAiOiAiLCBjZWxsdHlwZV9uYW1lKQogIGNlbGx0eXBlX2NvbHVtbiA8LSBhcy5kYXRhLmZyYW1lKGNlbGx0eXBlc190b19nZW5lc1tbY11dKQogIGNvbG5hbWVzKGNlbGx0eXBlX2NvbHVtbikgPC0gY2VsbHR5cGVfbmFtZQogIHJvd25hbWVzKGNlbGx0eXBlX2NvbHVtbikgPC0gbWFrZS5uYW1lcyhjZWxsdHlwZV9jb2x1bW5bWzFdXSwgdW5pcXVlPVRSVUUpCiAgY2VsbHR5cGVfY29sdW1uW1sxXV0gPC0gVFJVRQogIGcyY19kZiA8LSBtZXJnZShnMmNfZGYsIGNlbGx0eXBlX2NvbHVtbiwgYnk9InJvdy5uYW1lcyIsIGFsbC54PVRSVUUpCiAgcm93bmFtZXMoZzJjX2RmKSA8LSBnMmNfZGZbWzFdXQogIGcyY19kZiA8LSBnMmNfZGZbLCAtMV0KfQpoZWFkKGcyY19kZikKbmFfaWR4IDwtIGlzLm5hKGcyY19kZikKZzJjX2RmW25hX2lkeF0gPC0gRkFMU0UKYGBgCgojIyBHZXR0aW5nIG9udG9sb2d5IGRhdGEKCkFubm90YXRpb24gZm9yIGdlbmUgb250b2xvZ2llcyBtYXkgYmUgZ2F0aGVyZWQgZnJvbSBhIHNpbWlsYXJseSBsYXJnZSBudW1iZXIgb2YKc291cmNlcy4gVGhlIGZvbGxvd2luZyBhcmUgYSBjb3VwbGUuCgpgYGB7ciBvbnRvbG9neX0KIyMgVHJ5IHVzaW5nIGJpb21hcnQKaHNfZ29fYmlvbWFydCA8LSBzbShsb2FkX2Jpb21hcnRfZ28oKSkKIyMgb3IgdGhlIG9yZy5Icy5lZy5kYiBzcWxpdGUgZGF0YWJhc2UKdHQgPC0gc20obGlicmFyeSgiSG9tby5zYXBpZW5zIikpCmhzIDwtIEhvbW8uc2FwaWVucwojI2hzX2dvX2Vuc2VtYmwgPC0gbG9hZF9vcmdkYl9nbyhocywgaHNfYW5ub3RhdGlvbnMkZ2VuZUlEKQojI2RpbShoc19nb19iaW9tYXJ0KQojI2RpbShoc19nb19lbnNlbWJsKQojI2hzX2dvaWRzIDwtIGhzX2dvX2Jpb21hcnQKCiMjIFdoaWxlIHRlc3RpbmcsIEkgY2FsbGVkIHRoaXMgZGVzYywgdGhhdCB3aWxsIG5lZWQgdG8gY2hhbmdlLgojI2xwX3Rvb2x0aXBzIDwtIG1ha2VfdG9vbHRpcHMobHBfYW5ub3RhdGlvbnMpCiMjbGJfdG9vbHRpcHMgPC0gbWFrZV90b29sdGlwcyhsYl9hbm5vdGF0aW9ucykKCmxwX2xlbmd0aHMgPC0gbHBfYW5ub3RhdGlvbnNbLCBjKCJJRCIsICJ3aWR0aCIpXQpsYl9sZW5ndGhzIDwtIGxiX2Fubm90YXRpb25zWywgYygiSUQiLCAid2lkdGgiKV0KaHNfbGVuZ3RocyA8LSBoc19hbm5vdGF0aW9uc1ssIGMoImVuc2VtYmxfZ2VuZV9pZCIsICJjZHNfbGVuZ3RoIildCmNvbG5hbWVzKGhzX2xlbmd0aHMpIDwtIGMoIklEIiwgIndpZHRoIikKCmxwX2dvaWRzIDwtIHJlYWQuY3N2KGZpbGU9InJlZmVyZW5jZS9scGFuX2dvLnR4dC54eiIsIHNlcD0iXHQiLCBoZWFkZXI9RkFMU0UpCmxiX2dvaWRzIDwtIHJlYWQuY3N2KGZpbGU9InJlZmVyZW5jZS9sYnJhel9nby50eHQueHoiLCBzZXA9Ilx0IiwgaGVhZGVyPUZBTFNFKQpjb2xuYW1lcyhscF9nb2lkcykgPC0gYygiSUQiLCJHTyIsIm9udCIsIm5hbWUiLCJzb3VyY2UiLCJ0YWciKQpjb2xuYW1lcyhsYl9nb2lkcykgPC0gYygiSUQiLCJHTyIsIm9udCIsIm5hbWUiLCJzb3VyY2UiLCJ0YWciKQpgYGAKCiMgUHV0dGluZyB0aGUgcGllY2VzIHRvZ2V0aGVyCgpUaGUgbWFjcm9waGFnZSBleHBlcmltZW50IGhhcyBzYW1wbGVzIGFjcm9zcyAyIGNvbnRleHRzLCB0aGUgaG9zdCBhbmQgcGFyYXNpdGUuClRoZSBmb2xsb3dpbmcgYmxvY2sgc2V0cyB1cCBvbmUgZXhwZXJpbWVudCBmb3IgZWFjaC4gIElmIHlvdSBvcGVuIHRoZQphbGxfc2FtcGxlcy1zcGVjaWVzLnhsc3ggZmlsZXMsIHlvdSB3aWxsIG5vdGUgaW1tZWRpYXRlbHkgdGhhdCBhIGZldyBkaWZmZXJlbnQKYXR0ZW1wdHMgd2VyZSBtYWRlIGF0IGFzY2VydGFpbmluZyB0aGUgbW9zdCBsaWtlbHkgZXhwZXJpbWVudGFsIGZhY3RvcnMgdGhhdApjb250cmlidXRlZCB0byB0aGUgcmVhZGlseSBhcHBhcmVudCBiYXRjaCBlZmZlY3RzLgoKIyMgVGhlIGh1bWFuIHRyYW5zY3JpcHRvbWUgbWFwcGluZ3MKCktlZXAgaW4gbWluZCB0aGF0IGlmIEkgY2hhbmdlIHRoZSBleHBlcmltZW50YWwgZGVzaWduIHdpdGggbmV3IGFubm90YXRpb25zLCBJCm11c3QgdGhlcmVmb3JlIHJlZ2VuZXJhdGUgdGhlIGZvbGxvd2luZy4KCmBgYHtyIGhzX2V4cHR9CmhzX2ZpbmFsX2Fubm90YXRpb25zIDwtIGhzX2Fubm90YXRpb25zCmhzX2ZpbmFsX2Fubm90YXRpb25zIDwtIGhzX2ZpbmFsX2Fubm90YXRpb25zWywgYygiZW5zZW1ibF90cmFuc2NyaXB0X2lkIiwgImVuc2VtYmxfZ2VuZV9pZCIsICJjZHNfbGVuZ3RoIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJoZ25jX3N5bWJvbCIsICJkZXNjcmlwdGlvbiIsICJnZW5lX2Jpb3R5cGUiKV0KaHNfZmluYWxfYW5ub3RhdGlvbnMkcm4gPC0gcm93bmFtZXMoaHNfZmluYWxfYW5ub3RhdGlvbnMpCm5vdGUgPC0gIk5ldyBleHBlcmltZW50YWwgZGVzaWduIGZhY3RvcnMgYnkgc25wIGFkZGVkIDIwMTYtMDktMjAiCmhzX2ZpbmFsX2Fubm90YXRpb25zIDwtIG1lcmdlKGhzX2ZpbmFsX2Fubm90YXRpb25zLCBnMmNfZGYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ5Lng9ImhnbmNfc3ltYm9sIiwgYnkueT0icm93Lm5hbWVzIiwgYWxsLng9VFJVRSkKcm93bmFtZXMoaHNfZmluYWxfYW5ub3RhdGlvbnMpIDwtIGhzX2ZpbmFsX2Fubm90YXRpb25zJHJuCmhzX2ZpbmFsX2Fubm90YXRpb25zJHJuIDwtIE5VTEwKbmFfaWR4IDwtIGlzLm5hKGhzX2ZpbmFsX2Fubm90YXRpb25zJHhjZWxsX3R5cGVzKQpoc19maW5hbF9hbm5vdGF0aW9uc1tuYV9pZHgsICJ4Y2VsbF90eXBlcyJdIDwtICIiCgpoc19tYWNyIDwtIGNyZWF0ZV9leHB0KAogICAgbWV0YWRhdGE9Z2x1ZTo6Z2x1ZSgic2FtcGxlX3NoZWV0cy9tYWNyb3BoYWdlX3NhbXBsZXNfe3Zlcn0ueGxzeCIpLAogICAgZ2VuZV9pbmZvPWhzX2ZpbmFsX2Fubm90YXRpb25zLAogICAgZmlsZV9jb2x1bW49Imh1bWFuZmlsZSIsCiAgICBub3Rlcz1ub3RlKQpoc19hbm5vdGF0aW9ucyA8LSBmRGF0YShoc19tYWNyKQp1bmRlZl9pZHggPC0gaHNfYW5ub3RhdGlvbnMgPT0gInVuZGVmaW5lZCIKaHNfYW5ub3RhdGlvbnNbdW5kZWZfaWR4XSA8LSBGQUxTRQpmRGF0YShoc19tYWNyW1siZXhwcmVzc2lvbnNldCJdXSkgPC0gaHNfYW5ub3RhdGlvbnMKCmtuaXRyOjprYWJsZShoZWFkKGhzX21hY3IkZGVzaWduLCBuPTEpKQoKIyNjZHNfZW50cmllcyA8LSBmRGF0YShoc19tYWNyKQojI2Nkc19lbnRyaWVzIDwtIGNkc19lbnRyaWVzW1siZ2VuZV9iaW90eXBlIl1dID09ICJwcm90ZWluX2NvZGluZyIKIyNoc19jZHNfbWFjciA8LSBoc19tYWNyCiMjaHNfY2RzX21hY3IkZXhwcmVzc2lvbnNldCA8LSBoc19jZHNfbWFjciRleHByZXNzaW9uc2V0W2Nkc19lbnRyaWVzLCBdCiMjbmV3X2Nkc19lbnRyaWVzIDwtIGZEYXRhKGhzX2Nkc19tYWNyKQpoc19jZHNfbWFjciA8LSBleGNsdWRlX2dlbmVzX2V4cHQoaHNfbWFjciwgbWV0aG9kPSJrZWVwIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbHVtbj0iZ2VuZV9iaW90eXBlIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdHRlcm5zPSJwcm90ZWluX2NvZGluZyIpCmBgYAoKIyMgVGhlIHBhcmFzaXRlIHRyYW5zY3JpcHRvbWUgbWFwcGluZ3MKCmBgYHtyIHBhcmFzaXRlX2V4cHR9CmxwX21hY3IgPC0gc20oY3JlYXRlX2V4cHQoCiAgICBtZXRhZGF0YT1nbHVlOjpnbHVlKCJzYW1wbGVfc2hlZXRzL21hY3JvcGhhZ2Vfc2FtcGxlc197dmVyfS54bHN4IiksCiAgICBnZW5lX2luZm89bHBfYW5ub3RhdGlvbnMsIGZpbGVfY29sdW1uPSJwYXJhc2l0ZWZpbGUiKSkKa25pdHI6OmthYmxlKGhlYWQobHBfbWFjciRkZXNpZ24sIG49MyksCiAgICAgICAgICAgICBjYXB0aW9uPSJUaGUgZmlyc3QgdGhyZWUgcm93cyBvZiB0aGUgcGFyYXNpdGUgZXhwZXJpbWVudGFsIGRlc2lnbi4iKQpgYGAKCiMgU3VwcGxlbWVudGFsIFRhYmxlIDEKClRhYmxlIFMxIGlzIGdvaW5nIHRvIGJlIGEgc3VtbWFyeSBvZiB0aGUgbWV0YWRhdGEgaW4gYWxsX3NhbXBsZXMtY29tYmluZWQKVGhpcyBtYXkgYWxzbyBpbmNsdWRlIHNvbWUgb2YgdGhlIG51bWJlcnMgcmVnYXJkaW5nIG1hcHBpbmcgJSwgZXRjLgoKV2FudGVkIGNvbHVtbnM6CgoqIFNhbXBsZSBJRDogIEhQR0x4eHh4CiogRG9ub3IgQ29kZTogVE0xMzAgb3IgUEcxeHgKKiBDZWxsIFR5cGU6ICBNYWNyb3BoYWdlIG9yIFBCTUMKKiBJbmZlY3Rpb24gU3RhdHVzOiAgSW5mZWN0ZWQgb3IgVW5pbmZlY3RlZAoqIERpc2Vhc2UgT3V0Y29tZTogIENocm9uaWMgb3IgU2VsZi1IZWFsaW5nIG9yIE5BCiogQmF0Y2g6IEEgb3IgQiAobWFjcm9waGFnZSk7IE5BIGZvciBQQk1DCiogTnVtYmVyIG9mIHJlYWRzIHRoYXQgcGFzc2VkIElsbHVtaW5hIGZpbHRlcgoqIE51bWJlciBvZiByZWFkcyBhZnRlciB0cmltbWluZwoqIE51bWJlciBvZiByZWFkcyBtYXBwZWQgLSBodW1hbgoqICUgcmVhZHMgbWFwcGVkIC0gaHVtYW4KKiBOdW1iZXIgb2YgcmVhZHMgbWFwcGVkIC0gTC5wYW5hbWVuc2lzCiogJSByZWFkcyBtYXBwZWQgLSBMLnBhbmFtZW5zaXMKClRoaXMgdGFibGUgaXMgbWFpbnRhaW5lZCBhcyBhbiBleGNlbCBmaWxlIGluIHRoZSBzYW1wbGVfc2hlZXRzLyBkaXJlY3RvcnkuCgojIFNhbXBsZSBFc3RpbWF0aW9uLCBNYWNyb3BoYWdlczogYHIgdmVyYAoKVGhpcyBkb2N1bWVudCBpcyBjb25jZXJuZWQgd2l0aCBhbmFseXppbmcgUk5Bc2VxIGRhdGEgb2YgaHVtYW4gYW5kIHBhcmFzaXRlIGR1cmluZyB0aGUgaW5mZWN0aW9uIG9mCmh1bWFuIG1hY3JvcGhhZ2VzLiAgQSBmZXcgZGlmZmVyZW50IHN0cmFpbnMgb2YgTC4gcGFuYW1lbnNpcyB3ZXJlIHVzZWQ7IHRoZSBleHBlcmltZW50IGlzIHRoZXJlZm9yZQpzZWdyZWdhdGVkIGludG8gZ3JvdXBzIG5hbWVkICdzZWxmLWhlYWxpbmcnLCAnY2hyb25pYycsIGFuZCAndW5pbmZlY3RlZCcuICBUd28gc2VwYXJhdGUgc2V0cyBvZgpsaWJyYXJpZXMgd2VyZSBnZW5lcmF0ZWQsIG9uZSBlYXJsaWVyIHNldCB3aXRoIGdyZWF0ZXIgY292ZXJhZ2UsIGFuZCBhIGxhdGVyIHNldCBpbmNsdWRpbmcgb25seSAxCnVuaW5mZWN0ZWQgc2FtcGxlLCBhbmQgMi0zIGNocm9uaWMgc2FtcGxlcy4KCiMjIEV4dHJhY3QgdGhlIG1hY3JvcGhhZ2UgZXhwZXJpbWVudAoKVGhlIGZvbGxvd2luZyBzdWJzZXQgb3BlcmF0aW9uIGV4dHJhY3QgdGhlIHNhbXBsZXMgdXNlZCBmb3IgdGhlIG1hY3JvcGhhZ2UgZXhwZXJpbWVudC4gVGhlIG5leHQKdGhyZWUgbGluZXMgdGhlbiBjaGFuZ2UgdGhlIGNvbG9ycyBmcm9tIHRoZSBkZWZhdWx0cy4KCmBgYHtyIG1hY3JvcGhhZ2VzfQpuZXdfY29sb3JzIDwtIGMoIiMwMDk5MDAiLCAiIzk5MDAwMCIsICIjMDAwMDk5IikKbmFtZXMobmV3X2NvbG9ycykgPC0gYygidW5pbmYiLCAiY2hyIiwgInNoIikKCmhzX21hY3IgPC0gc2V0X2V4cHRfY29sb3JzKGhzX21hY3IsIGNvbG9ycz1uZXdfY29sb3JzKQpsYWJlbHMgPC0gYXMuY2hhcmFjdGVyKHBEYXRhKGhzX21hY3IpW1sibGFiZWwiXV0pCmhzX21hY3IgPC0gc2V0X2V4cHRfc2FtcGxlbmFtZXMoaHNfbWFjciwgbGFiZWxzKQoKaHNfY2RzX21hY3IgPC0gc2V0X2V4cHRfY29sb3JzKGhzX2Nkc19tYWNyLCBjb2xvcnM9bmV3X2NvbG9ycykKaHNfY2RzX21hY3IgPC0gc2V0X2V4cHRfc2FtcGxlbmFtZXMoaHNfY2RzX21hY3IsIGxhYmVscykKYGBgCgojIENvbXBhcmUgbWV0aG9kcwoKSW4gb3VyIG1lZXRpbmcgdGhpcyBtb3JuaW5nICgyMDE5MDcwOCksIE5hamliIGFuZCBNYXJpYSBBZGVsYWlkYSBhc2tlZCBmb3IgaG93CnRoZSBkYXRhIGxvb2tzIGRlcGVuZGluZyBvbiBiYXRjaCBtZXRob2RvbG9neS4KCmBgYHtyIGJhdGNoX21ldGhvZHN9CnN0YXJ0IDwtIG5vcm1hbGl6ZV9leHB0KGhzX2Nkc19tYWNyLCBmaWx0ZXI9VFJVRSwgY29udmVydD0iY3BtIiwgbm9ybT0icXVhbnQiLCB0cmFuc2Zvcm09ImxvZzIiKQpwcChmaWxlPSJjcG1fcXVhbnRfZmlsdGVyX3BjYS5wbmciLCBpbWFnZT1wbG90X3BjYShzdGFydCkkcGxvdCkKCmxpbW1hX2JhdGNoIDwtIG5vcm1hbGl6ZV9leHB0KGhzX2Nkc19tYWNyLCBmaWx0ZXI9VFJVRSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udmVydD0iY3BtIiwgbm9ybT0icXVhbnQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFuc2Zvcm09ImxvZzIiLCBiYXRjaD0ibGltbWEiKQpwcChmaWxlPSJsY3FmX2xpbW1hLnBuZyIsIGltYWdlPXBsb3RfcGNhKGxpbW1hX2JhdGNoKSRwbG90KQoKcGNhX2JhdGNoIDwtIG5vcm1hbGl6ZV9leHB0KGhzX2Nkc19tYWNyLCBmaWx0ZXI9VFJVRSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnZlcnQ9ImNwbSIsIG5vcm09InF1YW50IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zZm9ybT0ibG9nMiIsIGJhdGNoPSJwY2EiKQpwcChmaWxlPSJsY3FmX3BjYS5wbmciLCBpbWFnZT1wbG90X3BjYShwY2FfYmF0Y2gpJHBsb3QpCgpzdmFzZXFfYmF0Y2ggPC0gbm9ybWFsaXplX2V4cHQoaHNfY2RzX21hY3IsIGZpbHRlcj1UUlVFLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udmVydD0iY3BtIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zZm9ybT0ibG9nMiIsIGJhdGNoPSJzdmFzZXEiKQpwcChmaWxlPSJsY3FmX3N2YXNlcS5wbmciLCBpbWFnZT1wbG90X3BjYShzdmFzZXFfYmF0Y2gpJHBsb3QpCgpzdmFfYmF0Y2ggPC0gbm9ybWFsaXplX2V4cHQoaHNfY2RzX21hY3IsIGZpbHRlcj1UUlVFLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udmVydD0iY3BtIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zZm9ybT0ibG9nMiIsIGJhdGNoPSJmc3ZhIikKcHAoZmlsZT0ibGNxZl9zdmEucG5nIiwgaW1hZ2U9cGxvdF9wY2Eoc3ZhX2JhdGNoKSRwbG90KQoKY29tYmF0X2JhdGNoIDwtIG5vcm1hbGl6ZV9leHB0KGhzX2Nkc19tYWNyLCBmaWx0ZXI9VFJVRSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnZlcnQ9ImNwbSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFuc2Zvcm09ImxvZzIiLCBiYXRjaD0iY29tYmF0IikKcHAoZmlsZT0ibGNxZl9jb21iYXQucG5nIiwgaW1hZ2U9cGxvdF9wY2EoY29tYmF0X2JhdGNoKSRwbG90KQoKY29tYmF0bnBfYmF0Y2ggPC0gbm9ybWFsaXplX2V4cHQoaHNfY2RzX21hY3IsIGZpbHRlcj1UUlVFLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb252ZXJ0PSJjcG0iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFuc2Zvcm09ImxvZzIiLCBiYXRjaD0iY29tYmF0X25vcHJpb3IiKQpwcChmaWxlPSJsY3FmX2NvbWJhdG5wLnBuZyIsIGltYWdlPXBsb3RfcGNhKGNvbWJhdG5wX2JhdGNoKSRwbG90KQpgYGAKCiMgRmlndXJlIFMxCgpGaWd1cmUgUzEgc2hvdWxkIGluY2x1ZGUgbmljZSB2ZXJzaW9ucyBvZiB0aGUgc2FtcGxlIG1ldHJpY3MuClRoZSBub3JtYWxpemF0aW9uIGNob3NlbiBpcyBiYXRjaC1pbi1tb2RlbC4KCkZpcnN0LCBob3dldmVyLCB3ZSB3aWxsIG1ha2Ugc29tZSBwbG90cyBvZiB0aGUgcmF3IGRhdGEuCgpTYW1wbGUgbmFtZXMgYXJlIGdvaW5nIHRvIGJlICdpbmZlY3Rpb25zdGF0ZV9zdHJhaW5udW1iZXInIDogY2hyXzc3MjEKCiogUGFuZWwgQTogTGlicmFyeSBzaXplcy4KKiBQYW5lbCBCOiBIZWF0bWFwIGRpc3RhbmNlIHJhdy4KKiBQYW5lbCBDOiBQQ0EKKiBQYW5lbCBEOiBUU05FCgpgYGB7ciBmaWdfczFfd3JpdGUsIGZpZy5zaG93PSJoaWRlIn0KZmlnX3MxIDwtIHNtKHdyaXRlX2V4cHQoCiAgICBoc19jZHNfbWFjciwgbm9ybT0icmF3IiwgdmlvbGluPUZBTFNFLCBjb252ZXJ0PSJjcG0iLAogICAgdHJhbnNmb3JtPSJsb2cyIiwgYmF0Y2g9InN2YXNlcSIsIGZpbHRlcj1UUlVFLAogICAgZXhjZWw9cGFzdGUwKCJleGNlbC9maWd1cmVfczFfc2FtcGxlX2VzdGltYXRpb24tdiIsIHZlciwgIi54bHN4IikpKQoKcHAoZmlsZT0iZmlnX3MxYV9saWJzaXplcy50aWYiLCBpbWFnZT1maWdfczEkcmF3X2xpYnNpemUpCnBwKGZpbGU9ImZpZ19zMWJfaGVhdG1hcC50aWYiLCBpbWFnZT1maWdfczEkbm9ybV9kaXNoZWF0KQpwcChmaWxlPSJmaWdfczFjX3Jhd19wY2EudGlmIiwgaW1hZ2U9ZmlnX3MxJHJhd19zY2FsZWRfcGNhKQpwcChmaWxlPSJmaWdfMWFfbm9ybV9wY2EudGlmIiwgaW1hZ2U9ZmlnX3MxJG5vcm1fcGNhKQpgYGAKCiMgRGlmZmVyZW50aWFsIEV4cHJlc3Npb24sIE1hY3JvcGhhZ2U6IGByIHZlcmAKCiMgRGlmZmVyZW50aWFsIGV4cHJlc3Npb24gYW5hbHlzZXMKClRoZSBtb3N0IGxpa2VseSBiYXRjaCBtZXRob2QgZnJvbSB0aGUgYWJvdmUgaXMgc3Zhc2VxLiAgTGV0IHVzIHBlcmZvcm0KZGlmZmVyZW50aWFsIGV4cHJlc3Npb24gYW5hbHlzZXMgd2l0aCBpdCBhbG9uZyB3aXRoIGEgZmV3IG90aGVyIG1ldGhvZHMuCgpgYGB7ciBzZXR1cF9kZV9ub3JtLCBmaWcuc2hvdz0iaGlkZSJ9CmhzX2NvbnRyYXN0cyA8LSBsaXN0KAogICAgIm1hY3JvX2Noci1zaCIgPSBjKCJjaHIiLCJzaCIpLAogICAgIm1hY3JvX2Noci1uaWwiID0gYygiY2hyIiwidW5pbmYiKSwKICAgICJtYWNyb19zaC1uaWwiID0gYygic2giLCAidW5pbmYiKSkKIyMgU2V0IHVwIHRoZSBkYXRhIHVzZWQgaW4gdGhlIGNvbXBhcmF0aXZlIGNvbnRyYXN0IHNldHMuCmBgYAoKIyMgTm8gYmF0Y2ggaW4gdGhlIG1vZGVsCgojIyMgU2V0IHVwIG5vIGJhdGNoCgpQcmludCBhIHJlbWluZGVyIG9mIHdoYXQgd2UgY2FuIGV4cGVjdCB3aGVuIGRvaW5nIHRoaXMgd2l0aCBubyBiYXRjaCBpbmZvcm1hdGlvbi4KCmBgYHtyIG5vYmF0Y2hfc2V0dXB9CmhzX21hY3JfbG93ZmlsdCA8LSBzbShub3JtYWxpemVfZXhwdChoc19jZHNfbWFjciwgZmlsdGVyPVRSVUUpKQpoc19sb3dmaWx0X3BjYSA8LSBzbShwbG90X3BjYShoc19jZHNfbWFjciwgdHJhbnNmb3JtPSJsb2cyIikpCmhzX2xvd2ZpbHRfcGNhJHBsb3QKYGBgCgpgYGB7ciBtYWNyb19ub2JhdGNoMSwgZmlnLnNob3c9ImhpZGUifQpoc19tYWNyX25vYmF0Y2ggPC0gYWxsX3BhaXJ3aXNlKGlucHV0PWhzX2Nkc19tYWNyLCBtb2RlbF9iYXRjaD1GQUxTRSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW1tYV9tZXRob2Q9InJvYnVzdCIpCiMjIHdvdywgYWxsIHRvb2xzIGluY2x1ZGluZyBiYXNpYyBhZ3JlZSBhbG1vc3QgY29tcGxldGVseQptZWRpYW5zX2J5X2NvbmRpdGlvbiA8LSBoc19tYWNyX25vYmF0Y2gkYmFzaWMkbWVkaWFucwpleGNlbF9maWxlIDwtIGdsdWU6OmdsdWUoImV4Y2VsL3tydW5kYXRlfV9oc19tYWNyX25vYmF0Y2hfY29udHItdnt2ZXJ9Lnhsc3giKQpoc19tYWNyX25vYmF0Y2hfdGFibGVzIDwtIHNtKGNvbWJpbmVfZGVfdGFibGVzKGhzX21hY3Jfbm9iYXRjaCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGNlbD1leGNlbF9maWxlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtlZXBlcnM9aHNfY29udHJhc3RzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4dHJhX2Fubm90PW1lZGlhbnNfYnlfY29uZGl0aW9uKSkKZXhjZWxfZmlsZSA8LSBnbHVlOjpnbHVlKCJleGNlbC97cnVuZGF0ZX1faHNfbWFjcl9ub2JhdGNoX3NpZy12e3Zlcn0ueGxzeCIpCmhzX21hY3Jfbm9iYXRjaF9zaWcgPC0gc20oZXh0cmFjdF9zaWduaWZpY2FudF9nZW5lcyhoc19tYWNyX25vYmF0Y2hfdGFibGVzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhjZWw9ZXhjZWxfZmlsZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjY29yZGluZ190bz0iYWxsIikpCmBgYAoKIyMgQmF0Y2ggaW4gdGhlIG1vZGVsCgojIyMgQmF0Y2ggc2V0dXAKCmBgYHtyIGJhdGNoX3NldHVwfQpoc19sb3dmaWx0X2JhdGNoX3BjYSA8LSBzbShwbG90X3BjYShoc19jZHNfbWFjciwgdHJhbnNmb3JtPSJsb2cyIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udmVydD0iY3BtIiwgYmF0Y2g9ImxpbW1hIiwgZmlsdGVyPVRSVUUpKQpoc19sb3dmaWx0X2JhdGNoX3BjYSRwbG90CmBgYAoKSW4gdGhpcyAgYXR0ZW1wdCwgd2UgYWRkIGEgYmF0Y2ggZmFjdG9yIGluIHRoZSBleHBlcmltZW50YWwgbW9kZWwgYW5kIHNlZSBob3cgaXQgZG9lcy4KCmBgYHtyIG1hY3JvX2JhdGNoMSwgZmlnLnNob3c9ImhpZGUifQojIyBIZXJlIGp1c3QgbGV0IGFsbF9wYWlyd2lzZSBydW4gb24gZmlsdGVyZWQgZGF0YSBhbmQgZG8gaXRzIG5vcm1hbCB+IDAgKyBjb25kaXRpb24gKyBiYXRjaCBhbmFseXNlcwpoc19tYWNyX2JhdGNoIDwtIGFsbF9wYWlyd2lzZShpbnB1dD1oc19jZHNfbWFjciwgYmF0Y2g9VFJVRSwgbGltbWFfbWV0aG9kPSJyb2J1c3QiKQptZWRpYW5zX2J5X2NvbmRpdGlvbiA8LSBoc19tYWNyX2JhdGNoJGJhc2ljJG1lZGlhbnMKZXhjZWxfZmlsZSA8LSBnbHVlOjpnbHVlKCJleGNlbC97cnVuZGF0ZX1faHNfbWFjcl9iYXRjaG1vZGVsX2NvbnRyLXZ7dmVyfS54bHN4IikKaHNfbWFjcl9iYXRjaF90YWJsZXMgPC0gY29tYmluZV9kZV90YWJsZXMoCiAgaHNfbWFjcl9iYXRjaCwKICBrZWVwZXJzPWhzX2NvbnRyYXN0cywKICBleHRyYV9hbm5vdD1tZWRpYW5zX2J5X2NvbmRpdGlvbiwKICBleGNlbD1leGNlbF9maWxlKQpleGNlbF9maWxlIDwtIGdsdWU6OmdsdWUoImV4Y2VsL3tydW5kYXRlfV9oc19tYWNyX2JhdGNobW9kZWxfc2lnLXZ7dmVyfS54bHN4IikKaHNfbWFjcl9iYXRjaF9zaWcgPC0gZXh0cmFjdF9zaWduaWZpY2FudF9nZW5lcygKICBoc19tYWNyX2JhdGNoX3RhYmxlcywgZXhjZWw9ZXhjZWxfZmlsZSwKICBhY2NvcmRpbmdfdG89ImRlc2VxIikKZXhjZWxfZmlsZSA8LSBnbHVlOjpnbHVlKCJleGNlbC97cnVuZGF0ZX1faHNfbWFjcl9iYXRjaG1vZGVsX2FidW5kLXZ7dmVyfS54bHN4IikKaHNfbWFjcl9iYXRjaF9hYnVuIDwtIHNtKGV4dHJhY3RfYWJ1bmRhbnRfZ2VuZXMoCiAgaHNfbWFjcl9iYXRjaF90YWJsZXMsIGV4Y2VsPWV4Y2VsX2ZpbGUsCiAgYWNjb3JkaW5nX3RvPSJkZXNlcSIpKQpgYGAKCiMjIFNWQQoKIyMjIHN2YSBzZXR1cAoKYGBge3Igc3ZhX3NldHVwfQpoc19sb3dmaWx0X3N2YV9wY2EgPC0gc20ocGxvdF9wY2EoaHNfY2RzX21hY3IsIHRyYW5zZm9ybT0ibG9nMiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb252ZXJ0PSJjcG0iLCBtb2RlbF9iYXRjaD0ic3Zhc2VxIiwgZmlsdGVyPVRSVUUpKQpoc19sb3dmaWx0X3N2YV9wY2EkcGxvdApgYGAKCkluIHRoaXMgIGF0dGVtcHQsIHdlIHRlbGwgYWxsIHBhaXJ3aXNlIHRvIGludm9rZSBzdmFzZXEuCgpgYGB7ciBtYWNyb19zdmEsIGZpZy5zaG93PSJoaWRlIn0KaHNfbWFjcl9zdmEgPC0gYWxsX3BhaXJ3aXNlKGlucHV0PWhzX2Nkc19tYWNyLCBtb2RlbF9iYXRjaD0ic3Zhc2VxIiwgZmlsdGVyPVRSVUUsIGxpbW1hX21ldGhvZD0icm9idXN0IikKbWVkaWFuc19ieV9jb25kaXRpb24gPC0gaHNfbWFjcl9zdmEkYmFzaWMkbWVkaWFucwpleGNlbF9maWxlIDwtIGdsdWU6OmdsdWUoImV4Y2VsL3tydW5kYXRlfV9oc19tYWNyX3N2YW1vZGVsX2NvbnRyLXZ7dmVyfS54bHN4IikKaHNfbWFjcl9zdmFfdGFibGVzIDwtIGNvbWJpbmVfZGVfdGFibGVzKAogIGhzX21hY3Jfc3ZhLAogIGtlZXBlcnM9aHNfY29udHJhc3RzLAogIGV4dHJhX2Fubm90PW1lZGlhbnNfYnlfY29uZGl0aW9uLAogIGV4Y2VsPWV4Y2VsX2ZpbGUpCmV4Y2VsX2ZpbGUgPC0gZ2x1ZTo6Z2x1ZSgiZXhjZWwve3J1bmRhdGV9X2hzX21hY3Jfc3ZhbW9kZWxfc2lnLXZ7dmVyfS54bHN4IikKaHNfbWFjcl9zdmFfc2lnIDwtIGV4dHJhY3Rfc2lnbmlmaWNhbnRfZ2VuZXMoCiAgaHNfbWFjcl9zdmFfdGFibGVzLCBleGNlbD1leGNlbF9maWxlLAogIGFjY29yZGluZ190bz0iZGVzZXEiKQpleGNlbF9maWxlIDwtIGdsdWU6OmdsdWUoImV4Y2VsL3tydW5kYXRlfV9oc19tYWNyX3N2YW1vZGVsX2FidW5kLXZ7dmVyfS54bHN4IikKaHNfbWFjcl9zdmFfYWJ1biA8LSBzbShleHRyYWN0X2FidW5kYW50X2dlbmVzKAogIGhzX21hY3Jfc3ZhX3RhYmxlcywgZXhjZWw9ZXhjZWxfZmlsZSwKICBhY2NvcmRpbmdfdG89ImRlc2VxIikpCmBgYAoKIyMgQ29tcGFyZSB0aGVzZSB0aHJlZSByZXN1bHRzCgpgYGB7ciBjb21wYXJlX2RlX3Jlc3VsdHN9Cm5vYmF0Y2hfYmF0Y2ggPC0gY29tcGFyZV9kZV9yZXN1bHRzKGZpcnN0PWhzX21hY3Jfbm9iYXRjaF90YWJsZXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlY29uZD1oc19tYWNyX2JhdGNoX3RhYmxlcykKbm9iYXRjaF9iYXRjaCRsb2dmYwoKYmF0Y2hfc3ZhIDwtIGNvbXBhcmVfZGVfcmVzdWx0cyhmaXJzdD1oc19tYWNyX2JhdGNoX3RhYmxlcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWNvbmQ9aHNfbWFjcl9zdmFfdGFibGVzKQpiYXRjaF9zdmEkbG9nZmMKYGBgCgojIyBUd28gbGlrZWx5IHZvbGNhbm8gcGxvdHMKCmBgYHtyIHRhYmxlX3MyfQpiYXRjaG1vZGVsX3ZvbGNhbm8gPC0gcGxvdF92b2xjYW5vX2RlKAogICAgdGFibGU9aHNfbWFjcl9iYXRjaF90YWJsZXNbWyJkYXRhIl1dW1sibWFjcm9fY2hyLXNoIl1dLAogICAgY29sb3JfYnk9InN0YXRlIiwKICAgIGZjX2NvbD0iZGVzZXFfbG9nZmMiLAogICAgcF9jb2w9ImRlc2VxX2FkanAiLAogICAgc2hhcGVzX2J5X3N0YXRlPUZBTFNFLAogICAgbGluZV9wb3NpdGlvbj0idG9wIikKYmF0Y2htb2RlbF92b2xjYW5vJHBsb3QKCnN2YW1vZGVsX3ZvbGNhbm8gPC0gcGxvdF92b2xjYW5vX2RlKAogICAgdGFibGU9aHNfbWFjcl9zdmFfdGFibGVzW1siZGF0YSJdXVtbIm1hY3JvX2Noci1zaCJdXSwKICAgIGNvbG9yX2J5PSJzdGF0ZSIsCiAgICBmY19jb2w9ImRlc2VxX2xvZ2ZjIiwKICAgIHBfY29sPSJkZXNlcV9hZGpwIiwKICAgIHNoYXBlc19ieV9zdGF0ZT1GQUxTRSwKICAgIGxpbmVfcG9zaXRpb249InRvcCIpCnN2YW1vZGVsX3ZvbGNhbm8kcGxvdApgYGAKCmBgYHtyIHNhdmVtZX0KcGFuZGVyOjpwYW5kZXIoc2Vzc2lvbkluZm8oKSkKbWVzc2FnZShwYXN0ZTAoIlRoaXMgaXMgaHBnbHRvb2xzIGNvbW1pdDogIiwgZ2V0X2dpdF9jb21taXQoKSkpCnRoaXNfc2F2ZSA8LSBwYXN0ZTAoZ3N1YihwYXR0ZXJuPSJcXC5SbWQiLCByZXBsYWNlPSIiLCB4PXJtZF9maWxlKSwgIi12IiwgdmVyLCAiLnJkYS54eiIpCm1lc3NhZ2UocGFzdGUwKCJTYXZpbmcgdG8gIiwgdGhpc19zYXZlKSkKdG1wIDwtIHNtKHNhdmVtZShmaWxlbmFtZT10aGlzX3NhdmUpKQpgYGAK