TMRC3 202406: Differential Expression analyses, Tumaco only.

atb

2024-06-20

1 Changelog

  • 202406: Working entirely out of the container now, separated GSE/GSEA analyses.
  • 202309: Disabled GSVA analyses until/unless we get permission to include the mSigDB 7.5.1 release. I will simplify the filenames so that one may easily drop in a downloaded copy of the data and run those blocks. Until then, I guess you will have to trust me when I say those blocks all work?
  • 202309: Moved all Gene set enrichment analyses to 04lrt_gsea_gsva.Rmd
  • 202309 next day: Moving Gene set enrichment back because it adds too much complexity to save/reload the DE results for gProfiler and friends.
  • Still hunting for messed up colors, changed input data to match new version.

2 Introduction

The various differential expression analyses of the data generated in tmrc3_datasets will occur in this document.

2.1 Define contrasts for DE analyses

Each of the following lists describes the set of contrasts that I think are interesting for the various ways one might consider the TMRC3 dataset. The variables are named according to the assumed data with which they will be used, thus tc_cf_contrasts is expected to be used for the Tumaco+Cali data and provide a series of cure/fail comparisons which (to the extent possible) across both locations. In every case, the name of the list element will be used as the contrast name, and will thus be seen as the sheet name in the output xlsx file(s); the two pieces of the character vector value are the numerator and denominator of the associated contrast.

2.2 Gene set enrichment

The Gene set enrichment will follow each DE analysis during this document. I am adding a series of explicitly GSEA analyses in this most recent iteration, in these I will pass the full DE table and check the distribution of logFC values against the genes in each category as opposed to the simpler over-enrichment of the high/low DE values.

Most (all?) of the Gene set enrichment analyses used in this paper were done via gProfiler rather than goseq/clusterProfiler/topGO/GOstats. Primarily because it is so easy to invoke gprofiler.

clinic_contrasts <- list(
  "clinics" = c("Cali", "Tumaco"))
## In some cases we have no Cali failure samples, so there remain only 2
## contrasts that are likely of interest
tc_cf_contrasts <- list(
  "tumaco" = c("Tumacofailure", "Tumacocure"),
  "cure" = c("Tumacocure", "Calicure"))
## In other cases, we have cure/fail for both places.
clinic_cf_contrasts <- list(
  "cali" = c("Califailure", "Calicure"),
  "tumaco" = c("Tumacofailure", "Tumacocure"),
  "cure" = c("Tumacocure", "Calicure"),
  "fail" = c("Tumacofailure", "Califailure"))
cf_contrast <- list(
  "outcome" = c("Tumacofailure", "Tumacocure"))
t_cf_contrast <- list(
  "outcome" = c("failure", "cure"))
visitcf_contrasts <- list(
  "v1cf" = c("v1failure", "v1cure"),
  "v2cf" = c("v2failure", "v2cure"),
  "v3cf" = c("v3failure", "v3cure"))
visit_contrasts <- list(
  "v2v1" = c("c2", "c1"),
  "v3v1" = c("c3", "c1"),
  "v3v2" = c("c3", "c2"))
visit_v1later <- list(
  "later_vs_first" = c("later", "first"))
celltypes <- list(
  "eo_mono" = c("eosinophils", "monocytes"),
  "ne_mono" = c("neutrophils", "monocytes"),
  "eo_ne" = c("eosinophils", "neutrophils"))
ethnicity_contrasts <- list(
  "mestizo_indigenous" = c("mestiza", "indigena"),
  "mestizo_afrocol" = c("mestiza", "afrocol"),
  "indigenous_afrocol" = c("indigena", "afrocol"))

3 Only Tumaco samples

Start over, this time with only the samples from Tumaco. We currently are assuming these will prove to be the only analyses used for final interpretation. This is primarily because we have insufficient failed treatment samples from Cali.

3.1 All samples

Start by considering all Tumaco cell types. Note that in this case we only use SVA, primarily because I am not certain what would be an appropriate batch factor, perhaps visit?

t_cf_clinical_de_sva <- all_pairwise(t_clinical, model_batch = "svaseq", filter = TRUE)
## 
##    cure failure 
##      67      56
## Removing 0 low-count genes (14156 remaining).
## Setting 17331 low elements to zero.
## transform_counts: Found 17331 values equal to 0, adding 1 to the matrix.
t_cf_clinical_de_sva
## A pairwise differential expression with results from: basic, deseq, ebseq, edger, limma, noiseq.
## This used a surrogate/batch estimate from: svaseq.
## The primary analysis performed 15 comparisons.
## The logFC agreement among the methods follows:
##                 falr_vs_cr
## limma_vs_deseq      0.8063
## limma_vs_edger      0.8177
## limma_vs_ebseq      0.6054
## limma_vs_basic      0.8704
## limma_vs_noiseq    -0.7287
## deseq_vs_edger      0.9845
## deseq_vs_ebseq      0.6981
## deseq_vs_basic      0.8242
## deseq_vs_noiseq    -0.7317
## edger_vs_ebseq      0.6715
## edger_vs_basic      0.8285
## edger_vs_noiseq    -0.7370
## ebseq_vs_basic      0.6341
## ebseq_vs_noiseq    -0.5838
## basic_vs_noiseq    -0.7978
t_cf_clinical_table_sva <- combine_de_tables(
  t_cf_clinical_de_sva, keepers = t_cf_contrast,
  excel = glue("{cf_prefix}/All_Samples/t_clinical_cf_tables_sva-v{ver}.xlsx"))
t_cf_clinical_table_sva
## A set of combined differential expression results.
##             table deseq_sigup deseq_sigdown edger_sigup edger_sigdown
## 1 failure_vs_cure          93           183         103           159
##   limma_sigup limma_sigdown
## 1          50            38
## `geom_line()`: Each group consists of only one observation.
## i Do you need to adjust the group aesthetic?
## Plot describing unique/shared genes in a differential expression table.

t_cf_clinical_table_sva[["plots"]][["outcome"]][["deseq_ma_plots"]]

t_cf_clinical_sig_sva <- extract_significant_genes(
  t_cf_clinical_table_sva,
  excel = glue("{cf_prefix}/All_Samples/t_clinical_cf_sig_sva-v{ver}.xlsx"))
t_cf_clinical_sig_sva
## A set of genes deemed significant according to limma, edger, deseq, ebseq, basic.
## The parameters defining significant were:
## LFC cutoff: 1 adj P cutoff: 0.05
##         limma_up limma_down edger_up edger_down deseq_up deseq_down ebseq_up
## outcome       50         38      103        159       93        183        0
##         ebseq_down basic_up basic_down
## outcome         49       16          4

dim(t_cf_clinical_sig_sva$deseq$ups[[1]])
## [1] 93 69
dim(t_cf_clinical_sig_sva$deseq$downs[[1]])
## [1] 183  69

3.2 gProfiler search of all Tumaco samples

The following gProfiler searches use the all_gprofiler() function instead of simple_gprofiler(). As a result, the results are separated by {contrast}_{direction}. Thus ‘outcome_down’.

The same plots are available as the previous gProfiler searches, but in many of the following runs, I used the dotplot() function to get a slightly different view of the results.

t_cf_clinical_gp <- all_gprofiler(t_cf_clinical_sig_sva)
## Did not find the column:  in the significant genes.
## No results to show
## Please make sure that the organism is correct or set significant = FALSE
## No results to show
## Please make sure that the organism is correct or set significant = FALSE
## No results to show
## Please make sure that the organism is correct or set significant = FALSE
## No results to show
## Please make sure that the organism is correct or set significant = FALSE
## Add a little logic here to use enrichplot::dotplot().
## Did not find the column:  in the significant genes.
## No results to show
## Please make sure that the organism is correct or set significant = FALSE
## No results to show
## Please make sure that the organism is correct or set significant = FALSE
## No results to show
## Please make sure that the organism is correct or set significant = FALSE
## No results to show
## Please make sure that the organism is correct or set significant = FALSE
## No results to show
## Please make sure that the organism is correct or set significant = FALSE
## No results to show
## Please make sure that the organism is correct or set significant = FALSE
## No results to show
## Please make sure that the organism is correct or set significant = FALSE
## Add a little logic here to use enrichplot::dotplot().
t_cf_clinical_gp
## Running gProfiler on every set of significant genes found:
##              GO KEGG REAC WP TF MIRNA HPA CORUM HP
## outcome_up   51    0    5  3 28     1   0     0  0
## outcome_down 80    0    0  0  1     0   0     0  0
written <- write_gprofiler_data(
  t_cf_clinical_gp[["outcome_up"]],
  excel = glue("{xlsx_prefix}/Gene set enrichment/clinical_cure_up-v{ver}.xlsx"))
## `geom_line()`: Each group consists of only one observation.
## i Do you need to adjust the group aesthetic?
## `geom_line()`: Each group consists of only one observation.
## i Do you need to adjust the group aesthetic?
## `geom_line()`: Each group consists of only one observation.
## i Do you need to adjust the group aesthetic?
## `geom_line()`: Each group consists of only one observation.
## i Do you need to adjust the group aesthetic?
written <- write_gprofiler_data(
  t_cf_clinical_gp[["outcome_down"]],
  excel = glue("{xlsx_prefix}/Gene set enrichment/clinical_cure_down-v{ver}.xlsx"))
## `geom_line()`: Each group consists of only one observation.
## i Do you need to adjust the group aesthetic?
## `geom_line()`: Each group consists of only one observation.
## i Do you need to adjust the group aesthetic?
## `geom_line()`: Each group consists of only one observation.
## i Do you need to adjust the group aesthetic?
## `geom_line()`: Each group consists of only one observation.
## i Do you need to adjust the group aesthetic?
## Wikipathways of the up c/f genes
enrichplot::dotplot(t_cf_clinical_gp[["outcome_up"]][["WP_enrich"]])

## Transcription factor database of the up c/f genes
enrichplot::dotplot(t_cf_clinical_gp[["outcome_up"]][["TF_enrich"]])

## Reactome of the up c/f genes
enrichplot::dotplot(t_cf_clinical_gp[["outcome_up"]][["REAC_enrich"]])

## GO of the down c/f genes
enrichplot::dotplot(t_cf_clinical_gp[["outcome_down"]][["GO_enrich"]])

t_cf_clinical_gp[["outcome_up"]][["pvalue_plots"]][["BP"]]

## Reactome of the down c/f genes
enrichplot::dotplot(t_cf_clinical_gp[["outcome_down"]][["GO_enrich"]])

enrichplot::dotplot(t_cf_clinical_gp[["outcome_up"]][["GO_enrich"]])

3.3 clusterProfiler search of all Tumaco samples

t_cf_clinical_gp <- all_cprofiler(t_cf_clinical_sig_sva, t_cf_clinical_table_sva,
                                  orgdb = "org.Hs.eg.db")
## Error in all_cprofiler(t_cf_clinical_sig_sva, t_cf_clinical_table_sva, : could not find function "all_cprofiler"

4 Visit comparisons

Later in this document I do a bunch of visit/cf comparisons. In this block I want to explicitly only compare v1 to other visits. This is something I did quite a lot in the 2019 datasets, but never actually moved to this document.

tv1_vs_later <- all_pairwise(t_v1vs, model_batch = "svaseq", filter = TRUE)
## 
## first later 
##    40    69
## Removing 0 low-count genes (11910 remaining).
## Setting 9640 low elements to zero.
## transform_counts: Found 9640 values equal to 0, adding 1 to the matrix.
tv1_vs_later
## A pairwise differential expression with results from: basic, deseq, ebseq, edger, limma, noiseq.
## This used a surrogate/batch estimate from: svaseq.
## The primary analysis performed 15 comparisons.
## The logFC agreement among the methods follows:
##                 ltr_vs_frs
## limma_vs_deseq      0.8393
## limma_vs_edger      0.8457
## limma_vs_ebseq      0.7791
## limma_vs_basic      0.8133
## limma_vs_noiseq    -0.7094
## deseq_vs_edger      0.9983
## deseq_vs_ebseq      0.7809
## deseq_vs_basic      0.7946
## deseq_vs_noiseq    -0.7474
## edger_vs_ebseq      0.7868
## edger_vs_basic      0.7984
## edger_vs_noiseq    -0.7524
## ebseq_vs_basic      0.7513
## ebseq_vs_noiseq    -0.7736
## basic_vs_noiseq    -0.8068
tv1_vs_later_table <- combine_de_tables(
  tv1_vs_later, keepers = visit_v1later,
  excel = glue("{xlsx_prefix}/DE_Visits/tv1_vs_later_tables-v{ver}.xlsx"))
tv1_vs_later_table
## A set of combined differential expression results.
##            table deseq_sigup deseq_sigdown edger_sigup edger_sigdown
## 1 later_vs_first          24             7          22             7
##   limma_sigup limma_sigdown
## 1          23             7
## `geom_line()`: Each group consists of only one observation.
## i Do you need to adjust the group aesthetic?
## Plot describing unique/shared genes in a differential expression table.

tv1_vs_later_sig <- extract_significant_genes(
  tv1_vs_later_table,
  excel = glue("{xlsx_prefix}/DE_Visits/tv1_vs_later_sig-v{ver}.xlsx"))
tv1_vs_later_sig
## A set of genes deemed significant according to limma, edger, deseq, ebseq, basic.
## The parameters defining significant were:
## LFC cutoff: 1 adj P cutoff: 0.05
##                limma_up limma_down edger_up edger_down deseq_up deseq_down
## later_vs_first       23          7       22          7       24          7
##                ebseq_up ebseq_down basic_up basic_down
## later_vs_first        0          0        0          0

4.0.0.1 Gene set enrichment: V1 vs other visits.

tv1later_gp <- all_gprofiler(tv1_vs_later_sig)
## Did not find the column:  in the significant genes.
## No results to show
## Please make sure that the organism is correct or set significant = FALSE
## No results to show
## Please make sure that the organism is correct or set significant = FALSE
## No results to show
## Please make sure that the organism is correct or set significant = FALSE
## No results to show
## Please make sure that the organism is correct or set significant = FALSE
## No results to show
## Please make sure that the organism is correct or set significant = FALSE
## Add a little logic here to use enrichplot::dotplot().
## Did not find the column:  in the significant genes.
## No results to show
## Please make sure that the organism is correct or set significant = FALSE
## No results to show
## Please make sure that the organism is correct or set significant = FALSE
## No results to show
## Please make sure that the organism is correct or set significant = FALSE
## No results to show
## Please make sure that the organism is correct or set significant = FALSE
## Add a little logic here to use enrichplot::dotplot().
tv1later_gp
## Running gProfiler on every set of significant genes found:
##                     GO KEGG REAC WP TF MIRNA HPA CORUM HP
## later_vs_first_up   10    0    3  2  1     0   0     0  0
## later_vs_first_down 20    2    4  0  1     0   0     0 10
tv1later_gp[[1]]$pvalue_plots$BP

tv1later_gp[[2]]$pvalue_plots$BP

5 Sex comparison

t_sex <- subset_expt(tc_sex, subset = "clinic == 'Tumaco'")
## The samples excluded are: TMRC30156, TMRC30185, TMRC30186, TMRC30178, TMRC30179, TMRC30221, TMRC30222, TMRC30223, TMRC30224, TMRC30269, TMRC30148, TMRC30149, TMRC30253, TMRC30150, TMRC30140, TMRC30138, TMRC30176, TMRC30153, TMRC30151, TMRC30234, TMRC30235, TMRC30270, TMRC30225, TMRC30226, TMRC30227, TMRC30228, TMRC30229, TMRC30230, TMRC30231, TMRC30232, TMRC30233, TMRC30209, TMRC30210, TMRC30211, TMRC30212, TMRC30213, TMRC30216, TMRC30214, TMRC30215, TMRC30271, TMRC30273, TMRC30275, TMRC30272, TMRC30274, TMRC30276, TMRC30254, TMRC30255, TMRC30256, TMRC30277, TMRC30239, TMRC30240, TMRC30278, TMRC30279, TMRC30280, TMRC30257, TMRC30258, TMRC30281, TMRC30283, TMRC30284, TMRC30282, TMRC30285.
## subset_expt(): There were 184, now there are 123 samples.
t_sex
## 
t_sex_de <- all_pairwise(t_sex, model_batch = "svaseq", filter = TRUE)
## 
## female   male 
##     22    101
## Removing 0 low-count genes (14156 remaining).
## Setting 17311 low elements to zero.
## transform_counts: Found 17311 values equal to 0, adding 1 to the matrix.
t_sex_de
## A pairwise differential expression with results from: basic, deseq, ebseq, edger, limma, noiseq.
## This used a surrogate/batch estimate from: svaseq.
## The primary analysis performed 15 comparisons.
## The logFC agreement among the methods follows:
##                 mal_vs_fml
## limma_vs_deseq      0.8596
## limma_vs_edger      0.8663
## limma_vs_ebseq      0.7762
## limma_vs_basic      0.9481
## limma_vs_noiseq    -0.7351
## deseq_vs_edger      0.9909
## deseq_vs_ebseq      0.7608
## deseq_vs_basic      0.8703
## deseq_vs_noiseq    -0.7263
## edger_vs_ebseq      0.7802
## edger_vs_basic      0.8748
## edger_vs_noiseq    -0.7283
## ebseq_vs_basic      0.7161
## ebseq_vs_noiseq    -0.7147
## basic_vs_noiseq    -0.7498
t_sex_table <- combine_de_tables(
  t_sex_de, excel = glue("{xlsx_prefix}/Gene set enrichment/t_sex_table-v{ver}.xlsx"))
t_sex_table
## A set of combined differential expression results.
##            table deseq_sigup deseq_sigdown edger_sigup edger_sigdown
## 1 male_vs_female         129            96         116            95
##   limma_sigup limma_sigdown
## 1          54            74
## `geom_line()`: Each group consists of only one observation.
## i Do you need to adjust the group aesthetic?
## Plot describing unique/shared genes in a differential expression table.

t_sex_sig <- extract_significant_genes(
  t_sex_table, excel = glue("{xlsx_prefix}/Gene set enrichment/t_sex_sig-v{ver}.xlsx"))
t_sex_sig
## A set of genes deemed significant according to limma, edger, deseq, ebseq, basic.
## The parameters defining significant were:
## LFC cutoff: 1 adj P cutoff: 0.05
##                limma_up limma_down edger_up edger_down deseq_up deseq_down
## male_vs_female       54         74      116         95      129         96
##                ebseq_up ebseq_down basic_up basic_down
## male_vs_female       12         13       15         10

5.0.0.1 Gene set enrichment: Comparing Tumaco M/F

Let us see if we observe general male/female differences in the data. This has an important caveat: there are few female failures in the dataset and so the results may reflect that.

t_sex_gp <- all_gprofiler(t_sex_sig)
## Did not find the column:  in the significant genes.
## No results to show
## Please make sure that the organism is correct or set significant = FALSE
## No results to show
## Please make sure that the organism is correct or set significant = FALSE
## No results to show
## Please make sure that the organism is correct or set significant = FALSE
## No results to show
## Please make sure that the organism is correct or set significant = FALSE
## Add a little logic here to use enrichplot::dotplot().
## Did not find the column:  in the significant genes.
## No results to show
## Please make sure that the organism is correct or set significant = FALSE
## No results to show
## Please make sure that the organism is correct or set significant = FALSE
## No results to show
## Please make sure that the organism is correct or set significant = FALSE
## No results to show
## Please make sure that the organism is correct or set significant = FALSE
## No results to show
## Please make sure that the organism is correct or set significant = FALSE
## No results to show
## Please make sure that the organism is correct or set significant = FALSE
## No results to show
## Please make sure that the organism is correct or set significant = FALSE
## No results to show
## Please make sure that the organism is correct or set significant = FALSE
## Add a little logic here to use enrichplot::dotplot().
t_sex_gp
## Running gProfiler on every set of significant genes found:
##                     GO KEGG REAC WP TF MIRNA HPA CORUM HP
## male_vs_female_up   61    0    4  1 46     0   0     0  2
## male_vs_female_down 23    0    0  0  0     0   0     0  0
written <- write_gprofiler_data(
  t_sex_gp[[1]],
  excel = glue("{xlsx_prefix}/Gene set enrichment/sex_female_up-v{ver}.xlsx"))
## `geom_line()`: Each group consists of only one observation.
## i Do you need to adjust the group aesthetic?
## `geom_line()`: Each group consists of only one observation.
## i Do you need to adjust the group aesthetic?
## `geom_line()`: Each group consists of only one observation.
## i Do you need to adjust the group aesthetic?
## `geom_line()`: Each group consists of only one observation.
## i Do you need to adjust the group aesthetic?
written <- write_gprofiler_data(
  t_sex_gp[[2]],
  excel = glue("{xlsx_prefix}/Gene set enrichment/sex_male_up-v{ver}.xlsx"))
tc_sex_cure <- subset_expt(tc_sex, subset = "finaloutcome=='cure'")
## The samples excluded are: TMRC30178, TMRC30179, TMRC30221, TMRC30222, TMRC30223, TMRC30224, TMRC30017, TMRC30019, TMRC30071, TMRC30056, TMRC30105, TMRC30058, TMRC30094, TMRC30119, TMRC30122, TMRC30107, TMRC30096, TMRC30083, TMRC30115, TMRC30118, TMRC30121, TMRC30026, TMRC30048, TMRC30054, TMRC30046, TMRC30070, TMRC30049, TMRC30055, TMRC30047, TMRC30053, TMRC30068, TMRC30123, TMRC30072, TMRC30078, TMRC30116, TMRC30076, TMRC30088, TMRC30197, TMRC30199, TMRC30198, TMRC30201, TMRC30200, TMRC30203, TMRC30202, TMRC30205, TMRC30204, TMRC30177, TMRC30241, TMRC30237, TMRC30206, TMRC30207, TMRC30238, TMRC30074, TMRC30217, TMRC30208, TMRC30077, TMRC30219, TMRC30218, TMRC30079, TMRC30220, TMRC30264, TMRC30265.
## subset_expt(): There were 184, now there are 122 samples.
t_sex_cure <- subset_expt(tc_sex_cure, subset = "clinic == 'Tumaco'")
## The samples excluded are: TMRC30156, TMRC30185, TMRC30186, TMRC30269, TMRC30148, TMRC30149, TMRC30253, TMRC30150, TMRC30140, TMRC30138, TMRC30176, TMRC30153, TMRC30151, TMRC30234, TMRC30235, TMRC30270, TMRC30225, TMRC30226, TMRC30227, TMRC30228, TMRC30229, TMRC30230, TMRC30231, TMRC30232, TMRC30233, TMRC30209, TMRC30210, TMRC30211, TMRC30212, TMRC30213, TMRC30216, TMRC30214, TMRC30215, TMRC30271, TMRC30273, TMRC30275, TMRC30272, TMRC30274, TMRC30276, TMRC30254, TMRC30255, TMRC30256, TMRC30277, TMRC30239, TMRC30240, TMRC30278, TMRC30279, TMRC30280, TMRC30257, TMRC30258, TMRC30281, TMRC30283, TMRC30284, TMRC30282, TMRC30285.
## subset_expt(): There were 122, now there are 67 samples.
t_sex_cure_de <- all_pairwise(t_sex_cure, model_batch = "svaseq", filter = TRUE)
## 
## female   male 
##     13     54
## Removing 0 low-count genes (13971 remaining).
## Setting 8998 low elements to zero.
## transform_counts: Found 8998 values equal to 0, adding 1 to the matrix.
t_sex_cure_de
## A pairwise differential expression with results from: basic, deseq, ebseq, edger, limma, noiseq.
## This used a surrogate/batch estimate from: svaseq.
## The primary analysis performed 15 comparisons.
## The logFC agreement among the methods follows:
##                 mal_vs_fml
## limma_vs_deseq      0.7804
## limma_vs_edger      0.8380
## limma_vs_ebseq      0.7446
## limma_vs_basic      0.9284
## limma_vs_noiseq    -0.7515
## deseq_vs_edger      0.9294
## deseq_vs_ebseq      0.7224
## deseq_vs_basic      0.7994
## deseq_vs_noiseq    -0.6523
## edger_vs_ebseq      0.7687
## edger_vs_basic      0.8474
## edger_vs_noiseq    -0.6952
## ebseq_vs_basic      0.6679
## ebseq_vs_noiseq    -0.6566
## basic_vs_noiseq    -0.7882
t_sex_cure_table <- combine_de_tables(
  t_sex_cure_de, excel = glue("{xlsx_prefix}/DE_Sex/t_sex_cure_table-v{ver}.xlsx"))
t_sex_cure_table
## A set of combined differential expression results.
##            table deseq_sigup deseq_sigdown edger_sigup edger_sigdown
## 1 male_vs_female         174           129         162           143
##   limma_sigup limma_sigdown
## 1          64           108
## `geom_line()`: Each group consists of only one observation.
## i Do you need to adjust the group aesthetic?
## Plot describing unique/shared genes in a differential expression table.

t_sex_cure_sig <- extract_significant_genes(
  t_sex_cure_table, excel = glue("{xlsx_prefix}/DE_Sex/t_sex_cure_sig-v{ver}.xlsx"))
t_sex_cure_sig
## A set of genes deemed significant according to limma, edger, deseq, ebseq, basic.
## The parameters defining significant were:
## LFC cutoff: 1 adj P cutoff: 0.05
##                limma_up limma_down edger_up edger_down deseq_up deseq_down
## male_vs_female       64        108      162        143      174        129
##                ebseq_up ebseq_down basic_up basic_down
## male_vs_female       11         15       13          5

5.0.0.1.1 Gene set enrichment: Tumaco comparisons of M/F
t_sex_cure_gp <- all_gprofiler(t_sex_cure_sig)
## Did not find the column:  in the significant genes.
## No results to show
## Please make sure that the organism is correct or set significant = FALSE
## No results to show
## Please make sure that the organism is correct or set significant = FALSE
## No results to show
## Please make sure that the organism is correct or set significant = FALSE
## No results to show
## Please make sure that the organism is correct or set significant = FALSE
## Add a little logic here to use enrichplot::dotplot().
## Did not find the column:  in the significant genes.
## No results to show
## Please make sure that the organism is correct or set significant = FALSE
## No results to show
## Please make sure that the organism is correct or set significant = FALSE
## No results to show
## Please make sure that the organism is correct or set significant = FALSE
## No results to show
## Please make sure that the organism is correct or set significant = FALSE
## No results to show
## Please make sure that the organism is correct or set significant = FALSE
## No results to show
## Please make sure that the organism is correct or set significant = FALSE
## No results to show
## Please make sure that the organism is correct or set significant = FALSE
## No results to show
## Please make sure that the organism is correct or set significant = FALSE
## No results to show
## Please make sure that the organism is correct or set significant = FALSE
## Add a little logic here to use enrichplot::dotplot().
t_sex_cure_gp
## Running gProfiler on every set of significant genes found:
##                     GO KEGG REAC WP TF MIRNA HPA CORUM HP
## male_vs_female_up   63    2    7  0 36     0   0     0 10
## male_vs_female_down  0    0    0  0  0     0   0     0  0

6 Ethnicity comparisons

t_ethnicity_de <- all_pairwise(t_etnia_expt, model_batch = "svaseq", filter = TRUE)
## 
##  afrocol indigena  mestiza 
##       76       19       28
## Removing 0 low-count genes (14156 remaining).
## Setting 15869 low elements to zero.
## transform_counts: Found 15869 values equal to 0, adding 1 to the matrix.
t_ethnicity_de
## A pairwise differential expression with results from: basic, deseq, ebseq, edger, limma, noiseq.
## This used a surrogate/batch estimate from: svaseq.
## The primary analysis performed 15 comparisons.
t_ethnicity_table <- combine_de_tables(
  keepers = ethnicity_contrasts,
  t_ethnicity_de, excel = glue("{xlsx_prefix}/DE_Ethnicity/t_ethnicity_table-v{ver}.xlsx"))
t_ethnicity_table
## A set of combined differential expression results.
##                 table deseq_sigup deseq_sigdown edger_sigup edger_sigdown
## 1 mestiza_vs_indigena          83            97          67           108
## 2  mestiza_vs_afrocol          57            92          52            96
## 3 indigena_vs_afrocol         165           236         187           216
##   limma_sigup limma_sigdown
## 1          58            56
## 2          42            53
## 3         165           147
## Plot describing unique/shared genes in a differential expression table.

t_ethnicity_sig <- extract_significant_genes(
  t_ethnicity_table, excel = glue("{xlsx_prefix}/DE_Ethnicity/t_ethnicity_sig-v{ver}.xlsx"))
t_ethnicity_sig
## A set of genes deemed significant according to limma, edger, deseq, ebseq, basic.
## The parameters defining significant were:
## LFC cutoff: 1 adj P cutoff: 0.05
##                    limma_up limma_down edger_up edger_down deseq_up deseq_down
## mestizo_indigenous       58         56       67        108       83         97
## mestizo_afrocol          42         53       52         96       57         92
## indigenous_afrocol      165        147      187        216      165        236
##                    ebseq_up ebseq_down basic_up basic_down
## mestizo_indigenous        8          1        2          2
## mestizo_afrocol          10          1        2          9
## indigenous_afrocol       16         15       16         17

6.0.0.1 Gene set enrichment: Ethnicity differences

Performed once with both clinics and again with only Tumaco.

t_ethnicity_gp <- all_gprofiler(t_ethnicity_sig)
## Did not find the column:  in the significant genes.
## No results to show
## Please make sure that the organism is correct or set significant = FALSE
## No results to show
## Please make sure that the organism is correct or set significant = FALSE
## No results to show
## Please make sure that the organism is correct or set significant = FALSE
## No results to show
## Please make sure that the organism is correct or set significant = FALSE
## No results to show
## Please make sure that the organism is correct or set significant = FALSE
## No results to show
## Please make sure that the organism is correct or set significant = FALSE
## Add a little logic here to use enrichplot::dotplot().
## Did not find the column:  in the significant genes.
## No results to show
## Please make sure that the organism is correct or set significant = FALSE
## No results to show
## Please make sure that the organism is correct or set significant = FALSE
## No results to show
## Please make sure that the organism is correct or set significant = FALSE
## No results to show
## Please make sure that the organism is correct or set significant = FALSE
## No results to show
## Please make sure that the organism is correct or set significant = FALSE
## Add a little logic here to use enrichplot::dotplot().
## Did not find the column:  in the significant genes.
## No results to show
## Please make sure that the organism is correct or set significant = FALSE
## No results to show
## Please make sure that the organism is correct or set significant = FALSE
## No results to show
## Please make sure that the organism is correct or set significant = FALSE
## No results to show
## Please make sure that the organism is correct or set significant = FALSE
## No results to show
## Please make sure that the organism is correct or set significant = FALSE
## No results to show
## Please make sure that the organism is correct or set significant = FALSE
## No results to show
## Please make sure that the organism is correct or set significant = FALSE
## No results to show
## Please make sure that the organism is correct or set significant = FALSE
## Add a little logic here to use enrichplot::dotplot().
## Did not find the column:  in the significant genes.
## No results to show
## Please make sure that the organism is correct or set significant = FALSE
## No results to show
## Please make sure that the organism is correct or set significant = FALSE
## No results to show
## Please make sure that the organism is correct or set significant = FALSE
## No results to show
## Please make sure that the organism is correct or set significant = FALSE
## No results to show
## Please make sure that the organism is correct or set significant = FALSE
## Add a little logic here to use enrichplot::dotplot().
## Did not find the column:  in the significant genes.
## No results to show
## Please make sure that the organism is correct or set significant = FALSE
## No results to show
## Please make sure that the organism is correct or set significant = FALSE
## No results to show
## Please make sure that the organism is correct or set significant = FALSE
## No results to show
## Please make sure that the organism is correct or set significant = FALSE
## Add a little logic here to use enrichplot::dotplot().
## Did not find the column:  in the significant genes.
## No results to show
## Please make sure that the organism is correct or set significant = FALSE
## No results to show
## Please make sure that the organism is correct or set significant = FALSE
## No results to show
## Please make sure that the organism is correct or set significant = FALSE
## No results to show
## Please make sure that the organism is correct or set significant = FALSE
## No results to show
## Please make sure that the organism is correct or set significant = FALSE
## No results to show
## Please make sure that the organism is correct or set significant = FALSE
## No results to show
## Please make sure that the organism is correct or set significant = FALSE
## Add a little logic here to use enrichplot::dotplot().
t_ethnicity_gp
## Running gProfiler on every set of significant genes found:
##                         GO KEGG REAC WP TF MIRNA HPA CORUM HP
## mestizo_indigenous_up   21    0    2  0  7     0   0     0  0
## mestizo_indigenous_down 10    0    1  0  7     5   0     0  0
## mestizo_afrocol_up       5    0    0  0  0     0   0     0  0
## mestizo_afrocol_down    23    0    4  3  1     0   0     0  0
## indigenous_afrocol_up   63    1    2  0  1     0   1     0  0
## indigenous_afrocol_down 25    0    0  0  1     0   0     0  0
written <- write_gprofiler_data(
  t_ethnicity_gp[[1]],
  excel = glue("{xlsx_prefix}/Gene set enrichment/ethnicity_mi_up-v{ver}.xlsx"))
written <- write_gprofiler_data(
  t_ethnicity_gp[[2]],
  excel = glue("{xlsx_prefix}/Gene set enrichment/ethnicity_mi_down-v{ver}.xlsx"))
## `geom_line()`: Each group consists of only one observation.
## i Do you need to adjust the group aesthetic?
## `geom_line()`: Each group consists of only one observation.
## i Do you need to adjust the group aesthetic?
## `geom_line()`: Each group consists of only one observation.
## i Do you need to adjust the group aesthetic?
## `geom_line()`: Each group consists of only one observation.
## i Do you need to adjust the group aesthetic?
written <- write_gprofiler_data(
  t_ethnicity_gp[[3]],
  excel = glue("{xlsx_prefix}/Gene set enrichment/ethnicity_ma_up-v{ver}.xlsx"))
written <- write_gprofiler_data(
  t_ethnicity_gp[[4]],
  excel = glue("{xlsx_prefix}/Gene set enrichment/ethnicity_ma_down-v{ver}.xlsx"))
## `geom_line()`: Each group consists of only one observation.
## i Do you need to adjust the group aesthetic?
## `geom_line()`: Each group consists of only one observation.
## i Do you need to adjust the group aesthetic?
## `geom_line()`: Each group consists of only one observation.
## i Do you need to adjust the group aesthetic?
## `geom_line()`: Each group consists of only one observation.
## i Do you need to adjust the group aesthetic?
written <- write_gprofiler_data(
  t_ethnicity_gp[[5]],
  excel = glue("{xlsx_prefix}/Gene set enrichment/ethnicity_ia_up-v{ver}.xlsx"))
## `geom_line()`: Each group consists of only one observation.
## i Do you need to adjust the group aesthetic?
## `geom_line()`: Each group consists of only one observation.
## i Do you need to adjust the group aesthetic?
## `geom_line()`: Each group consists of only one observation.
## i Do you need to adjust the group aesthetic?
## `geom_line()`: Each group consists of only one observation.
## i Do you need to adjust the group aesthetic?
## `geom_line()`: Each group consists of only one observation.
## i Do you need to adjust the group aesthetic?
## `geom_line()`: Each group consists of only one observation.
## i Do you need to adjust the group aesthetic?
## `geom_line()`: Each group consists of only one observation.
## i Do you need to adjust the group aesthetic?
## `geom_line()`: Each group consists of only one observation.
## i Do you need to adjust the group aesthetic?
## `geom_line()`: Each group consists of only one observation.
## i Do you need to adjust the group aesthetic?
## `geom_line()`: Each group consists of only one observation.
## i Do you need to adjust the group aesthetic?
## `geom_line()`: Each group consists of only one observation.
## i Do you need to adjust the group aesthetic?
## `geom_line()`: Each group consists of only one observation.
## i Do you need to adjust the group aesthetic?
## `geom_line()`: Each group consists of only one observation.
## i Do you need to adjust the group aesthetic?
## `geom_line()`: Each group consists of only one observation.
## i Do you need to adjust the group aesthetic?
## `geom_line()`: Each group consists of only one observation.
## i Do you need to adjust the group aesthetic?
## `geom_line()`: Each group consists of only one observation.
## i Do you need to adjust the group aesthetic?
written <- write_gprofiler_data(
  t_ethnicity_gp[[6]],
  excel = glue("{xlsx_prefix}/Gene set enrichment/ethnicity_ia_down-v{ver}.xlsx"))
## `geom_line()`: Each group consists of only one observation.
## i Do you need to adjust the group aesthetic?
## `geom_line()`: Each group consists of only one observation.
## i Do you need to adjust the group aesthetic?
## `geom_line()`: Each group consists of only one observation.
## i Do you need to adjust the group aesthetic?
## `geom_line()`: Each group consists of only one observation.
## i Do you need to adjust the group aesthetic?

6.0.0.2 Gene set enrichment: Ethnicity differences among cures

written <- write_gprofiler_data(
  t_ethnicity_gp[["indigenous_afrocol_down"]],
  excel = glue("{xlsx_prefix}/Gene set enrichment/ethnicity_afrocol_down-v{ver}.xlsx"))
## `geom_line()`: Each group consists of only one observation.
## i Do you need to adjust the group aesthetic?
## `geom_line()`: Each group consists of only one observation.
## i Do you need to adjust the group aesthetic?
## `geom_line()`: Each group consists of only one observation.
## i Do you need to adjust the group aesthetic?
## `geom_line()`: Each group consists of only one observation.
## i Do you need to adjust the group aesthetic?

6.0.1 Separate the Tumaco data by visit

One of the most compelling ideas in the data is the opportunity to find genes in the first visit which may help predict the likelihood that a person will respond well to treatment. The following block will therefore look at cure/fail from Tumaco at visit 1.

6.0.1.1 Cure/Fail, Tumaco Visit 1

t_cf_clinical_v1_de_sva <- all_pairwise(tv1_samples, model_batch = "svaseq", filter = TRUE)
## 
##    cure failure 
##      30      24
## Removing 0 low-count genes (14023 remaining).
## Setting 7655 low elements to zero.
## transform_counts: Found 7655 values equal to 0, adding 1 to the matrix.
t_cf_clinical_v1_de_sva
## A pairwise differential expression with results from: basic, deseq, ebseq, edger, limma, noiseq.
## This used a surrogate/batch estimate from: svaseq.
## The primary analysis performed 15 comparisons.
## The logFC agreement among the methods follows:
##                 falr_vs_cr
## limma_vs_deseq      0.7398
## limma_vs_edger      0.7830
## limma_vs_ebseq      0.5530
## limma_vs_basic      0.6887
## limma_vs_noiseq    -0.5606
## deseq_vs_edger      0.9537
## deseq_vs_ebseq      0.7128
## deseq_vs_basic      0.6956
## deseq_vs_noiseq    -0.6069
## edger_vs_ebseq      0.6799
## edger_vs_basic      0.7228
## edger_vs_noiseq    -0.6304
## ebseq_vs_basic      0.6519
## ebseq_vs_noiseq    -0.6776
## basic_vs_noiseq    -0.7772
t_cf_clinical_v1_table_sva <- combine_de_tables(
  t_cf_clinical_v1_de_sva, keepers = t_cf_contrast,
  excel = glue("{cf_prefix}/Visits/t_clinical_v1_cf_tables_sva-v{ver}.xlsx"))
t_cf_clinical_v1_table_sva
## A set of combined differential expression results.
##             table deseq_sigup deseq_sigdown edger_sigup edger_sigdown
## 1 failure_vs_cure          27            75          28            55
##   limma_sigup limma_sigdown
## 1           3             3
## `geom_line()`: Each group consists of only one observation.
## i Do you need to adjust the group aesthetic?
## Plot describing unique/shared genes in a differential expression table.

t_cf_clinical_v1_sig_sva <- extract_significant_genes(
  t_cf_clinical_v1_table_sva,
  excel = glue("{cf_prefix}/Visits/t_clinical_v1_cf_sig_sva-v{ver}.xlsx"))
t_cf_clinical_v1_sig_sva
## A set of genes deemed significant according to limma, edger, deseq, ebseq, basic.
## The parameters defining significant were:
## LFC cutoff: 1 adj P cutoff: 0.05
##         limma_up limma_down edger_up edger_down deseq_up deseq_down ebseq_up
## outcome        3          3       28         55       27         75        0
##         ebseq_down basic_up basic_down
## outcome         37        0          0

dim(t_cf_clinical_v1_sig_sva$deseq$ups[[1]])
## [1] 27 69
dim(t_cf_clinical_v1_sig_sva$deseq$downs[[1]])
## [1] 75 69
6.0.1.1.1 Gene set enrichment: V1 gProfiler comparison

It looks like there are very few groups in the visit 1 significant genes.

t_cf_clinical_v1_sig_sva_gp <- all_gprofiler(t_cf_clinical_v1_sig_sva)
## Did not find the column:  in the significant genes.
## No results to show
## Please make sure that the organism is correct or set significant = FALSE
## No results to show
## Please make sure that the organism is correct or set significant = FALSE
## No results to show
## Please make sure that the organism is correct or set significant = FALSE
## No results to show
## Please make sure that the organism is correct or set significant = FALSE
## No results to show
## Please make sure that the organism is correct or set significant = FALSE
## No results to show
## Please make sure that the organism is correct or set significant = FALSE
## No results to show
## Please make sure that the organism is correct or set significant = FALSE
## No results to show
## Please make sure that the organism is correct or set significant = FALSE
## Add a little logic here to use enrichplot::dotplot().
## Did not find the column:  in the significant genes.
## No results to show
## Please make sure that the organism is correct or set significant = FALSE
## No results to show
## Please make sure that the organism is correct or set significant = FALSE
## No results to show
## Please make sure that the organism is correct or set significant = FALSE
## No results to show
## Please make sure that the organism is correct or set significant = FALSE
## No results to show
## Please make sure that the organism is correct or set significant = FALSE
## Add a little logic here to use enrichplot::dotplot().
t_cf_clinical_v1_sig_sva_gp
## Running gProfiler on every set of significant genes found:
##              GO KEGG REAC WP TF MIRNA HPA CORUM HP
## outcome_up    1    0    0  0  0     0   0     0  0
## outcome_down 30    0    0  1  2     2   0     0  0
## Wikipathways of the up c/f genes
enrichplot::dotplot(t_cf_clinical_v1_sig_sva_gp[["outcome_up"]][["GO_enrich"]])

enrichplot::dotplot(t_cf_clinical_v1_sig_sva_gp[["outcome_down"]][["GO_enrich"]])

6.0.1.2 Cure/Fail, Tumaco Visit 2

The visit 2 and visit 3 samples are interesting because they provide an opportunity to see if we can observe changes in response in the middle and end of treatment…

t_cf_clinical_v2_de_sva <- all_pairwise(tv2_samples, model_batch = "svaseq", filter = TRUE)
## 
##    cure failure 
##      20      15
## Removing 0 low-count genes (11562 remaining).
## Setting 2857 low elements to zero.
## transform_counts: Found 2857 values equal to 0, adding 1 to the matrix.
t_cf_clinical_v2_de_sva
## A pairwise differential expression with results from: basic, deseq, ebseq, edger, limma, noiseq.
## This used a surrogate/batch estimate from: svaseq.
## The primary analysis performed 15 comparisons.
## The logFC agreement among the methods follows:
##                 falr_vs_cr
## limma_vs_deseq      0.8138
## limma_vs_edger      0.8162
## limma_vs_ebseq      0.6903
## limma_vs_basic      0.7404
## limma_vs_noiseq    -0.6361
## deseq_vs_edger      0.9986
## deseq_vs_ebseq      0.7894
## deseq_vs_basic      0.7689
## deseq_vs_noiseq    -0.7586
## edger_vs_ebseq      0.7929
## edger_vs_basic      0.7702
## edger_vs_noiseq    -0.7602
## ebseq_vs_basic      0.7215
## ebseq_vs_noiseq    -0.8047
## basic_vs_noiseq    -0.8078
t_cf_clinical_v2_table_sva <- combine_de_tables(
  t_cf_clinical_v2_de_sva, keepers = t_cf_contrast,
  excel = glue("{cf_prefix}/Visits/t_clinical_v2_cf_tables_sva-v{ver}.xlsx"))
t_cf_clinical_v2_table_sva
## A set of combined differential expression results.
##             table deseq_sigup deseq_sigdown edger_sigup edger_sigdown
## 1 failure_vs_cure          51            15          50            11
##   limma_sigup limma_sigdown
## 1           0             0
## `geom_line()`: Each group consists of only one observation.
## i Do you need to adjust the group aesthetic?
## Plot describing unique/shared genes in a differential expression table.

t_cf_clinical_v2_sig_sva <- extract_significant_genes(
  t_cf_clinical_v2_table_sva,
  excel = glue("{cf_prefix}/Visits/t_clinical_v2_cf_sig_sva-v{ver}.xlsx"))
t_cf_clinical_v2_sig_sva
## A set of genes deemed significant according to limma, edger, deseq, ebseq, basic.
## The parameters defining significant were:
## LFC cutoff: 1 adj P cutoff: 0.05
##         limma_up limma_down edger_up edger_down deseq_up deseq_down ebseq_up
## outcome        0          0       50         11       51         15        0
##         ebseq_down basic_up basic_down
## outcome          0        0          0

dim(t_cf_clinical_v2_sig_sva$deseq$ups[[1]])
## [1] 51 69
dim(t_cf_clinical_v2_sig_sva$deseq$downs[[1]])
## [1] 15 69
6.0.1.2.1 Gene set enrichment: Visit 2 gProfiler searches

Up: 74 GO, 4 KEGG, 6 reactome, 4 WP, 56 TF, 1 miRNA, 0 HP/HPA/CORUM. Down: 19 GO, 1 KEGG, 1 HP, 2 HPA, 0 reactome/wp/tf/corum

t_cf_clinical_v2_sig_sva_gp <- all_gprofiler(t_cf_clinical_v2_sig_sva)
## Did not find the column:  in the significant genes.
## No results to show
## Please make sure that the organism is correct or set significant = FALSE
## No results to show
## Please make sure that the organism is correct or set significant = FALSE
## No results to show
## Please make sure that the organism is correct or set significant = FALSE
## Add a little logic here to use enrichplot::dotplot().
## Did not find the column:  in the significant genes.
## No results to show
## Please make sure that the organism is correct or set significant = FALSE
## No results to show
## Please make sure that the organism is correct or set significant = FALSE
## No results to show
## Please make sure that the organism is correct or set significant = FALSE
## No results to show
## Please make sure that the organism is correct or set significant = FALSE
## No results to show
## Please make sure that the organism is correct or set significant = FALSE
## Add a little logic here to use enrichplot::dotplot().
t_cf_clinical_v2_sig_sva_gp
## Running gProfiler on every set of significant genes found:
##              GO KEGG REAC WP TF MIRNA HPA CORUM HP
## outcome_up   78    4    6  4 54     1   0     0  0
## outcome_down 19    2    0  0  0     0   2     0  5
written <- write_gprofiler_data(
  t_cf_clinical_v2_sig_sva_gp[["outcome_up"]],
  excel = glue("{xlsx_prefix}/Gene set enrichment/t_cf_clinical_v2_up-v{ver}.xlsx"))
## `geom_line()`: Each group consists of only one observation.
## i Do you need to adjust the group aesthetic?
## `geom_line()`: Each group consists of only one observation.
## i Do you need to adjust the group aesthetic?
## `geom_line()`: Each group consists of only one observation.
## i Do you need to adjust the group aesthetic?
## `geom_line()`: Each group consists of only one observation.
## i Do you need to adjust the group aesthetic?
written <- write_gprofiler_data(
  t_cf_clinical_v2_sig_sva_gp[["outcome_down"]],
  excel = glue("{xlsx_prefix}/Gene set enrichment/t_cf_clinical_v2_down-v{ver}.xlsx"))

## Wikipathways of the up c/f genes
enrichplot::dotplot(t_cf_clinical_v2_sig_sva_gp[["outcome_up"]][["GO_enrich"]])

enrichplot::dotplot(t_cf_clinical_v2_sig_sva_gp[["outcome_up"]][["REAC_enrich"]])

enrichplot::dotplot(t_cf_clinical_v2_sig_sva_gp[["outcome_up"]][["TF_enrich"]])

enrichplot::dotplot(t_cf_clinical_v2_sig_sva_gp[["outcome_down"]][["GO_enrich"]])

6.0.1.3 Cure/Fail, Tumaco Visit 3

t_cf_clinical_v3_de_sva <- all_pairwise(tv3_samples, model_batch = "svaseq", filter = TRUE)
## 
##    cure failure 
##      17      17
## Removing 0 low-count genes (11452 remaining).
## Setting 1887 low elements to zero.
## transform_counts: Found 1887 values equal to 0, adding 1 to the matrix.
t_cf_clinical_v3_de_sva
## A pairwise differential expression with results from: basic, deseq, ebseq, edger, limma, noiseq.
## This used a surrogate/batch estimate from: svaseq.
## The primary analysis performed 15 comparisons.
## The logFC agreement among the methods follows:
##                 falr_vs_cr
## limma_vs_deseq      0.8530
## limma_vs_edger      0.8605
## limma_vs_ebseq      0.7614
## limma_vs_basic      0.8193
## limma_vs_noiseq    -0.7001
## deseq_vs_edger      0.9978
## deseq_vs_ebseq      0.8006
## deseq_vs_basic      0.7970
## deseq_vs_noiseq    -0.7532
## edger_vs_ebseq      0.8041
## edger_vs_basic      0.8030
## edger_vs_noiseq    -0.7622
## ebseq_vs_basic      0.7585
## ebseq_vs_noiseq    -0.7808
## basic_vs_noiseq    -0.8306
t_cf_clinical_v3_table_sva <- combine_de_tables(
  t_cf_clinical_v3_de_sva, keepers = t_cf_contrast,
  excel = glue("{cf_prefix}/Visits/t_clinical_v3_cf_tables_sva-v{ver}.xlsx"))
t_cf_clinical_v3_table_sva
## A set of combined differential expression results.
##             table deseq_sigup deseq_sigdown edger_sigup edger_sigdown
## 1 failure_vs_cure         120            61         120            50
##   limma_sigup limma_sigdown
## 1           3             1
## `geom_line()`: Each group consists of only one observation.
## i Do you need to adjust the group aesthetic?
## Plot describing unique/shared genes in a differential expression table.

t_cf_clinical_v3_sig_sva <- extract_significant_genes(
  t_cf_clinical_v3_table_sva,
  excel = glue("{cf_prefix}/Visits/t_clinical_v3_cf_sig_sva-v{ver}.xlsx"))
t_cf_clinical_v3_sig_sva
## A set of genes deemed significant according to limma, edger, deseq, ebseq, basic.
## The parameters defining significant were:
## LFC cutoff: 1 adj P cutoff: 0.05
##         limma_up limma_down edger_up edger_down deseq_up deseq_down ebseq_up
## outcome        3          1      120         50      120         61        0
##         ebseq_down basic_up basic_down
## outcome          0        0          0

dim(t_cf_clinical_v3_sig_sva$deseq$ups[[1]])
## [1] 120  69
dim(t_cf_clinical_v3_sig_sva$deseq$downs[[1]])
## [1] 61 69
6.0.1.3.1 Gene set enrichment: Visit 3 gProfiler searches

Up: 120 genes; 141 GO, 1 KEGG, 5 Reactome, 2 WP, 30 TF, 1 miRNA, 0 HPA/CORUM/HP Down: 62 genes; 30 GO, 2 KEGG, 1 Reactome, 0 WP/TF/miRNA/HPA/CORUM/HP,

t_cf_clinical_v3_sig_sva_gp <- all_gprofiler(t_cf_clinical_v3_sig_sva)
## Did not find the column:  in the significant genes.
## No results to show
## Please make sure that the organism is correct or set significant = FALSE
## No results to show
## Please make sure that the organism is correct or set significant = FALSE
## No results to show
## Please make sure that the organism is correct or set significant = FALSE
## Add a little logic here to use enrichplot::dotplot().
## Did not find the column:  in the significant genes.
## No results to show
## Please make sure that the organism is correct or set significant = FALSE
## No results to show
## Please make sure that the organism is correct or set significant = FALSE
## No results to show
## Please make sure that the organism is correct or set significant = FALSE
## No results to show
## Please make sure that the organism is correct or set significant = FALSE
## No results to show
## Please make sure that the organism is correct or set significant = FALSE
## No results to show
## Please make sure that the organism is correct or set significant = FALSE
## Add a little logic here to use enrichplot::dotplot().
t_cf_clinical_v3_sig_sva_gp
## Running gProfiler on every set of significant genes found:
##               GO KEGG REAC WP TF MIRNA HPA CORUM HP
## outcome_up   152    1    5  3 32     1   0     0  0
## outcome_down  31    2    1  0  0     0   0     0  0
written <- write_gprofiler_data(
  t_cf_clinical_v3_sig_sva_gp[["outcome_up"]],
  excel = glue("{xlsx_prefix}/Gene set enrichment/t_cf_clinical_v3_up-v{ver}.xlsx"))
## `geom_line()`: Each group consists of only one observation.
## i Do you need to adjust the group aesthetic?
## `geom_line()`: Each group consists of only one observation.
## i Do you need to adjust the group aesthetic?
## `geom_line()`: Each group consists of only one observation.
## i Do you need to adjust the group aesthetic?
## `geom_line()`: Each group consists of only one observation.
## i Do you need to adjust the group aesthetic?
## `geom_line()`: Each group consists of only one observation.
## i Do you need to adjust the group aesthetic?
## `geom_line()`: Each group consists of only one observation.
## i Do you need to adjust the group aesthetic?
## `geom_line()`: Each group consists of only one observation.
## i Do you need to adjust the group aesthetic?
## `geom_line()`: Each group consists of only one observation.
## i Do you need to adjust the group aesthetic?
written <- write_gprofiler_data(
  t_cf_clinical_v3_sig_sva_gp[["outcome_down"]],
  excel = glue("{xlsx_prefix}/Gene set enrichment/t_cf_clinical_v3_down-v{ver}.xlsx"))
## `geom_line()`: Each group consists of only one observation.
## i Do you need to adjust the group aesthetic?
## `geom_line()`: Each group consists of only one observation.
## i Do you need to adjust the group aesthetic?
## `geom_line()`: Each group consists of only one observation.
## i Do you need to adjust the group aesthetic?
## `geom_line()`: Each group consists of only one observation.
## i Do you need to adjust the group aesthetic?
## `geom_line()`: Each group consists of only one observation.
## i Do you need to adjust the group aesthetic?
## `geom_line()`: Each group consists of only one observation.
## i Do you need to adjust the group aesthetic?
## `geom_line()`: Each group consists of only one observation.
## i Do you need to adjust the group aesthetic?
## `geom_line()`: Each group consists of only one observation.
## i Do you need to adjust the group aesthetic?
## Wikipathways of the up c/f genes
enrichplot::dotplot(t_cf_clinical_v3_sig_sva_gp[["outcome_up"]][["GO_enrich"]])

enrichplot::dotplot(t_cf_clinical_v3_sig_sva_gp[["outcome_up"]][["REAC_enrich"]])

enrichplot::dotplot(t_cf_clinical_v3_sig_sva_gp[["outcome_up"]][["TF_enrich"]])

enrichplot::dotplot(t_cf_clinical_v3_sig_sva_gp[["outcome_down"]][["GO_enrich"]])

6.0.2 Repeat no biopsies

The biopsy samples are problematic for a few reasons, so let us repeat without them.

t_cf_clinical_nobiop_de_sva <- all_pairwise(t_clinical_nobiop,
                                            model_batch = "svaseq", filter = TRUE)
## 
##    cure failure 
##      58      51
## Removing 0 low-count genes (11910 remaining).
## Setting 9605 low elements to zero.
## transform_counts: Found 9605 values equal to 0, adding 1 to the matrix.
t_cf_clinical_nobiop_de_sva
## A pairwise differential expression with results from: basic, deseq, ebseq, edger, limma, noiseq.
## This used a surrogate/batch estimate from: svaseq.
## The primary analysis performed 15 comparisons.
## The logFC agreement among the methods follows:
##                 falr_vs_cr
## limma_vs_deseq      0.8463
## limma_vs_edger      0.8506
## limma_vs_ebseq      0.7814
## limma_vs_basic      0.8571
## limma_vs_noiseq    -0.7532
## deseq_vs_edger      0.9964
## deseq_vs_ebseq      0.8187
## deseq_vs_basic      0.8267
## deseq_vs_noiseq    -0.7746
## edger_vs_ebseq      0.8142
## edger_vs_basic      0.8367
## edger_vs_noiseq    -0.7818
## ebseq_vs_basic      0.7405
## ebseq_vs_noiseq    -0.7404
## basic_vs_noiseq    -0.8524
t_cf_clinical_nobiop_table_sva <- combine_de_tables(
  t_cf_clinical_nobiop_de_sva, keepers = t_cf_contrast,
  excel = glue("{cf_prefix}/No_Biopsies/t_clinical_nobiop_cf_tables_sva-v{ver}.xlsx"))
t_cf_clinical_nobiop_table_sva
## A set of combined differential expression results.
##             table deseq_sigup deseq_sigdown edger_sigup edger_sigdown
## 1 failure_vs_cure         140            75         142            67
##   limma_sigup limma_sigdown
## 1          54            46
## `geom_line()`: Each group consists of only one observation.
## i Do you need to adjust the group aesthetic?
## Plot describing unique/shared genes in a differential expression table.

t_cf_clinical_nobiop_sig_sva <- extract_significant_genes(
  t_cf_clinical_nobiop_table_sva,
  excel = glue("{cf_prefix}/No_Biopsies/t_clinical_nobiop_cf_sig_sva-v{ver}.xlsx"))
t_cf_clinical_nobiop_sig_sva
## A set of genes deemed significant according to limma, edger, deseq, ebseq, basic.
## The parameters defining significant were:
## LFC cutoff: 1 adj P cutoff: 0.05
##         limma_up limma_down edger_up edger_down deseq_up deseq_down ebseq_up
## outcome       54         46      142         67      140         75        1
##         ebseq_down basic_up basic_down
## outcome          7       29          7

dim(t_cf_clinical_nobiop_sig_sva$deseq$ups[[1]])
## [1] 140  69
dim(t_cf_clinical_nobiop_sig_sva$deseq$downs[[1]])
## [1] 75 69
6.0.2.0.1 Gene set enrichment: gProfiler of clinical samples without biopsies

Up: 137 genes; 88 GO, 0 KEGG, 6 Reactome, 1 WP, 46 TF, 1 miRNA, 0 others Down: 73 genes; 78 GO, 1 KEGG, 1 Reactome, 9 TF, 0 others

t_cf_clinical_nobiop_sig_sva_gp <- all_gprofiler(t_cf_clinical_nobiop_sig_sva)
## Did not find the column:  in the significant genes.
## No results to show
## Please make sure that the organism is correct or set significant = FALSE
## No results to show
## Please make sure that the organism is correct or set significant = FALSE
## No results to show
## Please make sure that the organism is correct or set significant = FALSE
## No results to show
## Please make sure that the organism is correct or set significant = FALSE
## Add a little logic here to use enrichplot::dotplot().
## Did not find the column:  in the significant genes.
## No results to show
## Please make sure that the organism is correct or set significant = FALSE
## No results to show
## Please make sure that the organism is correct or set significant = FALSE
## No results to show
## Please make sure that the organism is correct or set significant = FALSE
## Add a little logic here to use enrichplot::dotplot().
t_cf_clinical_nobiop_sig_sva_gp
## Running gProfiler on every set of significant genes found:
##              GO KEGG REAC WP TF MIRNA HPA CORUM HP
## outcome_up   93    0    6  2 41     1   0     0  0
## outcome_down 65    2    1  1  2     0   0     0  1
written <- write_gprofiler_data(
  t_cf_clinical_nobiop_sig_sva_gp[["outcome_up"]],
  excel = glue("{xlsx_prefix}/Gene set enrichment/t_cf_clinical_nobiop_up-v{ver}.xlsx"))
## `geom_line()`: Each group consists of only one observation.
## i Do you need to adjust the group aesthetic?
## `geom_line()`: Each group consists of only one observation.
## i Do you need to adjust the group aesthetic?
## `geom_line()`: Each group consists of only one observation.
## i Do you need to adjust the group aesthetic?
## `geom_line()`: Each group consists of only one observation.
## i Do you need to adjust the group aesthetic?
written <- write_gprofiler_data(
  t_cf_clinical_nobiop_sig_sva_gp[["outcome_down"]],
  excel = glue("{xlsx_prefix}/Gene set enrichment/t_cf_clinical_nobiop_down-v{ver}.xlsx"))
## `geom_line()`: Each group consists of only one observation.
## i Do you need to adjust the group aesthetic?
## `geom_line()`: Each group consists of only one observation.
## i Do you need to adjust the group aesthetic?
## `geom_line()`: Each group consists of only one observation.
## i Do you need to adjust the group aesthetic?
## `geom_line()`: Each group consists of only one observation.
## i Do you need to adjust the group aesthetic?
## `geom_line()`: Each group consists of only one observation.
## i Do you need to adjust the group aesthetic?
## `geom_line()`: Each group consists of only one observation.
## i Do you need to adjust the group aesthetic?
## `geom_line()`: Each group consists of only one observation.
## i Do you need to adjust the group aesthetic?
## `geom_line()`: Each group consists of only one observation.
## i Do you need to adjust the group aesthetic?
## `geom_line()`: Each group consists of only one observation.
## i Do you need to adjust the group aesthetic?
## `geom_line()`: Each group consists of only one observation.
## i Do you need to adjust the group aesthetic?
## `geom_line()`: Each group consists of only one observation.
## i Do you need to adjust the group aesthetic?
## `geom_line()`: Each group consists of only one observation.
## i Do you need to adjust the group aesthetic?
enrichplot::dotplot(t_cf_clinical_nobiop_sig_sva_gp[["outcome_up"]][["GO_enrich"]])

enrichplot::dotplot(t_cf_clinical_nobiop_sig_sva_gp[["outcome_up"]][["TF_enrich"]])

enrichplot::dotplot(t_cf_clinical_nobiop_sig_sva_gp[["outcome_down"]][["GO_enrich"]])

6.0.3 By cell type

Now let us switch our view to each individual cell type collected. The hope here is that we will be able to learn some cell-specific differences in the response for people who did(not) respond well.

6.0.3.1 Cure/Fail, Biopsies

t_cf_biopsy_de_sva <- all_pairwise(t_biopsies, model_batch = "svaseq", filter = TRUE)
## 
##    Tumaco_cure Tumaco_failure 
##              9              5
## Removing 0 low-count genes (13513 remaining).
## Setting 146 low elements to zero.
## transform_counts: Found 146 values equal to 0, adding 1 to the matrix.
t_cf_biopsy_de_sva
## A pairwise differential expression with results from: basic, deseq, ebseq, edger, limma, noiseq.
## This used a surrogate/batch estimate from: svaseq.
## The primary analysis performed 15 comparisons.
## The logFC agreement among the methods follows:
##                 Tmcflr_v_T
## limma_vs_deseq      0.7926
## limma_vs_edger      0.8628
## limma_vs_ebseq      0.7354
## limma_vs_basic      0.8497
## limma_vs_noiseq    -0.7628
## deseq_vs_edger      0.9516
## deseq_vs_ebseq      0.8629
## deseq_vs_basic      0.8164
## deseq_vs_noiseq    -0.7927
## edger_vs_ebseq      0.8844
## edger_vs_basic      0.8809
## edger_vs_noiseq    -0.8535
## ebseq_vs_basic      0.8011
## ebseq_vs_noiseq    -0.7965
## basic_vs_noiseq    -0.8819
t_cf_biopsy_table_sva <- combine_de_tables(
  t_cf_biopsy_de_sva, keepers = cf_contrast,
  excel = glue("{cf_prefix}/Biopsies/t_biopsy_cf_tables_sva-v{ver}.xlsx"))
t_cf_biopsy_table_sva
## A set of combined differential expression results.
##                         table deseq_sigup deseq_sigdown edger_sigup
## 1 Tumacofailure_vs_Tumacocure          17            11          19
##   edger_sigdown limma_sigup limma_sigdown
## 1            15           0             0
## `geom_line()`: Each group consists of only one observation.
## i Do you need to adjust the group aesthetic?
## Plot describing unique/shared genes in a differential expression table.

t_cf_biopsy_sig_sva <- extract_significant_genes(
  t_cf_biopsy_table_sva,
  excel = glue("{cf_prefix}/Biopsies/t_cf_biopsy_sig_sva-v{ver}.xlsx"))
t_cf_biopsy_sig_sva
## A set of genes deemed significant according to limma, edger, deseq, ebseq, basic.
## The parameters defining significant were:
## LFC cutoff: 1 adj P cutoff: 0.05
##         limma_up limma_down edger_up edger_down deseq_up deseq_down ebseq_up
## outcome        0          0       19         15       17         11       11
##         ebseq_down basic_up basic_down
## outcome         57        0          0

dim(t_cf_biopsy_sig_sva$deseq$ups[[1]])
## [1] 17 69
dim(t_cf_biopsy_sig_sva$deseq$downs[[1]])
## [1] 11 69
6.0.3.1.1 Gene set enrichment: gProfiler Biopsies

Up: 17 genes; 74 GO, 3 KEGG, 1 Reactome, 3 WP, 1 TF, 0 others Down: 11 genes; 2 GO, 0 others

FIXME: Add write_gprofiler_data() to other stanzas.

t_cf_biopsy_sig_sva_gp <- all_gprofiler(t_cf_biopsy_sig_sva)
## Did not find the column:  in the significant genes.
## No results to show
## Please make sure that the organism is correct or set significant = FALSE
## No results to show
## Please make sure that the organism is correct or set significant = FALSE
## No results to show
## Please make sure that the organism is correct or set significant = FALSE
## No results to show
## Please make sure that the organism is correct or set significant = FALSE
## Add a little logic here to use enrichplot::dotplot().
## Did not find the column:  in the significant genes.
## No results to show
## Please make sure that the organism is correct or set significant = FALSE
## No results to show
## Please make sure that the organism is correct or set significant = FALSE
## No results to show
## Please make sure that the organism is correct or set significant = FALSE
## No results to show
## Please make sure that the organism is correct or set significant = FALSE
## No results to show
## Please make sure that the organism is correct or set significant = FALSE
## No results to show
## Please make sure that the organism is correct or set significant = FALSE
## No results to show
## Please make sure that the organism is correct or set significant = FALSE
## No results to show
## Please make sure that the organism is correct or set significant = FALSE
## Add a little logic here to use enrichplot::dotplot().
t_cf_biopsy_sig_sva_gp
## Running gProfiler on every set of significant genes found:
##              GO KEGG REAC WP TF MIRNA HPA CORUM HP
## outcome_up   89    4    1  5  2     0   0     0  0
## outcome_down  2    0    0  0  0     0   0     0  0
t_cf_biopsy_gp_up_written <- write_gprofiler_data(
  t_cf_biopsy_sig_sva_gp[[1]],
  excel = glue("{xlsx_prefix}/Gene set enrichment/t_cf_biopsy_sig_sva_up.xlsx"))
## `geom_line()`: Each group consists of only one observation.
## i Do you need to adjust the group aesthetic?
## `geom_line()`: Each group consists of only one observation.
## i Do you need to adjust the group aesthetic?
## `geom_line()`: Each group consists of only one observation.
## i Do you need to adjust the group aesthetic?
## `geom_line()`: Each group consists of only one observation.
## i Do you need to adjust the group aesthetic?
t_cf_biopsy_gp_down_written <- write_gprofiler_data(
  t_cf_biopsy_sig_sva_gp[[2]],
  excel = glue("{xlsx_prefix}/Gene set enrichment/t_cf_biopsy_sig_sva_down.xlsx"))

enrichplot::dotplot(t_cf_biopsy_sig_sva_gp[["outcome_up"]][["GO_enrich"]])

enrichplot::dotplot(t_cf_biopsy_sig_sva_gp[["outcome_up"]][["WP_enrich"]])

enrichplot::dotplot(t_cf_biopsy_sig_sva_gp[["outcome_down"]][["GO_enrich"]])

6.0.3.2 Cure/Fail, Monocytes

Same question, but this time looking at monocytes. In addition, this comparison was done twice, once using SVA and once using visit as a batch factor.

t_cf_monocyte_de_sva <- all_pairwise(t_monocytes, model_batch = "svaseq",
                                     filter = TRUE)
## 
##    Tumaco_cure Tumaco_failure 
##             21             21
## Removing 0 low-count genes (10862 remaining).
## Setting 736 low elements to zero.
## transform_counts: Found 736 values equal to 0, adding 1 to the matrix.
t_cf_monocyte_de_sva
## A pairwise differential expression with results from: basic, deseq, ebseq, edger, limma, noiseq.
## This used a surrogate/batch estimate from: svaseq.
## The primary analysis performed 15 comparisons.
## The logFC agreement among the methods follows:
##                 Tmcflr_v_T
## limma_vs_deseq      0.8614
## limma_vs_edger      0.8663
## limma_vs_ebseq      0.7794
## limma_vs_basic      0.9210
## limma_vs_noiseq    -0.8064
## deseq_vs_edger      0.9989
## deseq_vs_ebseq      0.8556
## deseq_vs_basic      0.8506
## deseq_vs_noiseq    -0.7947
## edger_vs_ebseq      0.8564
## edger_vs_basic      0.8560
## edger_vs_noiseq    -0.8011
## ebseq_vs_basic      0.8470
## ebseq_vs_noiseq    -0.7829
## basic_vs_noiseq    -0.8949
t_cf_monocyte_tables_sva <- combine_de_tables(
  t_cf_monocyte_de_sva, keepers = cf_contrast,
  excel = glue("{cf_prefix}/Monocytes/t_monocyte_cf_tables_sva-v{ver}.xlsx"))
t_cf_monocyte_tables_sva
## A set of combined differential expression results.
##                         table deseq_sigup deseq_sigdown edger_sigup
## 1 Tumacofailure_vs_Tumacocure          60            52          56
##   edger_sigdown limma_sigup limma_sigdown
## 1            51          11            34
## `geom_line()`: Each group consists of only one observation.
## i Do you need to adjust the group aesthetic?
## Plot describing unique/shared genes in a differential expression table.

t_cf_monocyte_sig_sva <- extract_significant_genes(
  t_cf_monocyte_tables_sva,
  excel = glue("{cf_prefix}/Monocytes/t_monocyte_cf_sig_sva-v{ver}.xlsx"))
t_cf_monocyte_sig_sva
## A set of genes deemed significant according to limma, edger, deseq, ebseq, basic.
## The parameters defining significant were:
## LFC cutoff: 1 adj P cutoff: 0.05
##         limma_up limma_down edger_up edger_down deseq_up deseq_down ebseq_up
## outcome       11         34       56         51       60         52        0
##         ebseq_down basic_up basic_down
## outcome         23        8         21

dim(t_cf_monocyte_sig_sva$deseq$ups[[1]])
## [1] 60 69
dim(t_cf_monocyte_sig_sva$deseq$downs[[1]])
## [1] 52 69
t_cf_monocyte_de_batchvisit <- all_pairwise(t_monocytes, model_batch = TRUE, filter = TRUE)
## 
##    Tumaco_cure Tumaco_failure 
##             21             21 
## 
##  3  2  1 
## 13 13 16
t_cf_monocyte_de_batchvisit
## A pairwise differential expression with results from: basic, deseq, ebseq, edger, limma, noiseq.
## This used a surrogate/batch estimate from: batch in model/limma.
## The primary analysis performed 15 comparisons.
## The logFC agreement among the methods follows:
##                 Tmcflr_v_T
## limma_vs_deseq      0.8120
## limma_vs_edger      0.8150
## limma_vs_ebseq      0.7952
## limma_vs_basic      0.9509
## limma_vs_noiseq    -0.8326
## deseq_vs_edger      0.9998
## deseq_vs_ebseq      0.9932
## deseq_vs_basic      0.8505
## deseq_vs_noiseq    -0.7807
## edger_vs_ebseq      0.9935
## edger_vs_basic      0.8540
## edger_vs_noiseq    -0.7852
## ebseq_vs_basic      0.8470
## ebseq_vs_noiseq    -0.7829
## basic_vs_noiseq    -0.8949
t_cf_monocyte_tables_batchvisit <- combine_de_tables(
  t_cf_monocyte_de_batchvisit, keepers = cf_contrast,
  excel = glue("{cf_prefix}/Monocytes/t_monocyte_cf_tables_batchvisit-v{ver}.xlsx"))
t_cf_monocyte_tables_batchvisit
## A set of combined differential expression results.
##                         table deseq_sigup deseq_sigdown edger_sigup
## 1 Tumacofailure_vs_Tumacocure          43            93          47
##   edger_sigdown limma_sigup limma_sigdown
## 1           105           6            13
## `geom_line()`: Each group consists of only one observation.
## i Do you need to adjust the group aesthetic?
## Plot describing unique/shared genes in a differential expression table.

t_cf_monocyte_sig_batchvisit <- extract_significant_genes(
  t_cf_monocyte_tables_batchvisit,
  excel = glue("{cf_prefix}/Monocytes/t_monocyte_cf_sig_batchvisit-v{ver}.xlsx"))
t_cf_monocyte_sig_batchvisit
## A set of genes deemed significant according to limma, edger, deseq, ebseq, basic.
## The parameters defining significant were:
## LFC cutoff: 1 adj P cutoff: 0.05
##         limma_up limma_down edger_up edger_down deseq_up deseq_down ebseq_up
## outcome        6         13       47        105       43         93        0
##         ebseq_down basic_up basic_down
## outcome         23        8         21

dim(t_cf_monocyte_sig_batchvisit$deseq$ups[[1]])
## [1] 43 69
dim(t_cf_monocyte_sig_batchvisit$deseq$downs[[1]])
## [1] 93 69
6.0.3.2.1 Gene set enrichment: gProfiler Monocytes

Now that I am looking back over these results, I am not compeltely certain why I only did the gprofiler search for the sva data…

Up: 60 genes; 12 GO, 1 KEGG, 1 WP, 4 TF, 0 others Down: 53 genes; 26 GO, 1 KEGG, 1 Reactome, 2 TF, 0 others

t_cf_monocyte_sig_sva_gp <- all_gprofiler(t_cf_monocyte_sig_sva)
## Did not find the column:  in the significant genes.
## No results to show
## Please make sure that the organism is correct or set significant = FALSE
## No results to show
## Please make sure that the organism is correct or set significant = FALSE
## No results to show
## Please make sure that the organism is correct or set significant = FALSE
## No results to show
## Please make sure that the organism is correct or set significant = FALSE
## No results to show
## Please make sure that the organism is correct or set significant = FALSE
## Add a little logic here to use enrichplot::dotplot().
## Did not find the column:  in the significant genes.
## No results to show
## Please make sure that the organism is correct or set significant = FALSE
## No results to show
## Please make sure that the organism is correct or set significant = FALSE
## No results to show
## Please make sure that the organism is correct or set significant = FALSE
## No results to show
## Please make sure that the organism is correct or set significant = FALSE
## No results to show
## Please make sure that the organism is correct or set significant = FALSE
## Add a little logic here to use enrichplot::dotplot().
t_cf_monocyte_sig_sva_gp
## Running gProfiler on every set of significant genes found:
##              GO KEGG REAC WP TF MIRNA HPA CORUM HP
## outcome_up   23    1    0  1  5     0   0     0  0
## outcome_down 33    1    1  0  1     0   0     0  0
written <- write_gprofiler_data(
  t_cf_monocyte_sig_sva_gp[["outcome_up"]],
  excel = glue("{xlsx_prefix}/Gene set enrichment/t_cf_monocyte_up-v{ver}.xlsx"))
## `geom_line()`: Each group consists of only one observation.
## i Do you need to adjust the group aesthetic?
## `geom_line()`: Each group consists of only one observation.
## i Do you need to adjust the group aesthetic?
## `geom_line()`: Each group consists of only one observation.
## i Do you need to adjust the group aesthetic?
## `geom_line()`: Each group consists of only one observation.
## i Do you need to adjust the group aesthetic?
## `geom_line()`: Each group consists of only one observation.
## i Do you need to adjust the group aesthetic?
## `geom_line()`: Each group consists of only one observation.
## i Do you need to adjust the group aesthetic?
## `geom_line()`: Each group consists of only one observation.
## i Do you need to adjust the group aesthetic?
## `geom_line()`: Each group consists of only one observation.
## i Do you need to adjust the group aesthetic?
written <- write_gprofiler_data(
  t_cf_monocyte_sig_sva_gp[["outcome_down"]],
  excel = glue("{xlsx_prefix}/Gene set enrichment/t_cf_monocyte_down-v{ver}.xlsx"))
## `geom_line()`: Each group consists of only one observation.
## i Do you need to adjust the group aesthetic?
## `geom_line()`: Each group consists of only one observation.
## i Do you need to adjust the group aesthetic?
## `geom_line()`: Each group consists of only one observation.
## i Do you need to adjust the group aesthetic?
## `geom_line()`: Each group consists of only one observation.
## i Do you need to adjust the group aesthetic?
## `geom_line()`: Each group consists of only one observation.
## i Do you need to adjust the group aesthetic?
## `geom_line()`: Each group consists of only one observation.
## i Do you need to adjust the group aesthetic?
## `geom_line()`: Each group consists of only one observation.
## i Do you need to adjust the group aesthetic?
## `geom_line()`: Each group consists of only one observation.
## i Do you need to adjust the group aesthetic?
## `geom_line()`: Each group consists of only one observation.
## i Do you need to adjust the group aesthetic?
## `geom_line()`: Each group consists of only one observation.
## i Do you need to adjust the group aesthetic?
## `geom_line()`: Each group consists of only one observation.
## i Do you need to adjust the group aesthetic?
## `geom_line()`: Each group consists of only one observation.
## i Do you need to adjust the group aesthetic?
enrichplot::dotplot(t_cf_monocyte_sig_sva_gp[["outcome_up"]][["GO_enrich"]])

enrichplot::dotplot(t_cf_monocyte_sig_sva_gp[["outcome_up"]][["TF_enrich"]])

enrichplot::dotplot(t_cf_monocyte_sig_sva_gp[["outcome_down"]][["GO_enrich"]])

t_cf_monocyte_sig_batch_gp <- all_gprofiler(t_cf_monocyte_sig_batchvisit)
## Did not find the column:  in the significant genes.
## No results to show
## Please make sure that the organism is correct or set significant = FALSE
## No results to show
## Please make sure that the organism is correct or set significant = FALSE
## No results to show
## Please make sure that the organism is correct or set significant = FALSE
## Add a little logic here to use enrichplot::dotplot().
## Did not find the column:  in the significant genes.
## No results to show
## Please make sure that the organism is correct or set significant = FALSE
## No results to show
## Please make sure that the organism is correct or set significant = FALSE
## No results to show
## Please make sure that the organism is correct or set significant = FALSE
## No results to show
## Please make sure that the organism is correct or set significant = FALSE
## No results to show
## Please make sure that the organism is correct or set significant = FALSE
## Add a little logic here to use enrichplot::dotplot().
t_cf_monocyte_sig_batch_gp
## Running gProfiler on every set of significant genes found:
##              GO KEGG REAC WP TF MIRNA HPA CORUM HP
## outcome_up   42    6   20  5  0     3   0     0 22
## outcome_down 60    2    1  0  0     1   0     0  0
written <- write_gprofiler_data(
  t_cf_monocyte_sig_batch_gp[["outcome_up"]],
  excel = glue("{xlsx_prefix}/Gene set enrichment/t_cf_monocyte_batch_up-v{ver}.xlsx"))
written <- write_gprofiler_data(
  t_cf_monocyte_sig_batch_gp[["outcome_down"]],
  excel = glue("{xlsx_prefix}/Gene set enrichment/t_cf_monocyte_batch_down-v{ver}.xlsx"))
## `geom_line()`: Each group consists of only one observation.
## i Do you need to adjust the group aesthetic?
## `geom_line()`: Each group consists of only one observation.
## i Do you need to adjust the group aesthetic?
## `geom_line()`: Each group consists of only one observation.
## i Do you need to adjust the group aesthetic?
## `geom_line()`: Each group consists of only one observation.
## i Do you need to adjust the group aesthetic?
## `geom_line()`: Each group consists of only one observation.
## i Do you need to adjust the group aesthetic?
## `geom_line()`: Each group consists of only one observation.
## i Do you need to adjust the group aesthetic?
## `geom_line()`: Each group consists of only one observation.
## i Do you need to adjust the group aesthetic?
## `geom_line()`: Each group consists of only one observation.
## i Do you need to adjust the group aesthetic?
## `geom_line()`: Each group consists of only one observation.
## i Do you need to adjust the group aesthetic?
## `geom_line()`: Each group consists of only one observation.
## i Do you need to adjust the group aesthetic?
## `geom_line()`: Each group consists of only one observation.
## i Do you need to adjust the group aesthetic?
## `geom_line()`: Each group consists of only one observation.
## i Do you need to adjust the group aesthetic?
enrichplot::dotplot(t_cf_monocyte_sig_batch_gp[["outcome_up"]][["GO_enrich"]])

enrichplot::dotplot(t_cf_monocyte_sig_batch_gp[["outcome_up"]][["HP_enrich"]])

6.0.4 Individual visits, Monocytes

Now focus in on the monocyte samples on a per-visit basis.

6.0.4.1 Visit 1

t_cf_monocyte_v1_de_sva <- all_pairwise(tv1_monocytes, model_batch = "svaseq", filter = TRUE)
## 
##    Tumaco_cure Tumaco_failure 
##              8              8
## Removing 0 low-count genes (10482 remaining).
## Setting 190 low elements to zero.
## transform_counts: Found 190 values equal to 0, adding 1 to the matrix.
t_cf_monocyte_v1_de_sva
## A pairwise differential expression with results from: basic, deseq, ebseq, edger, limma, noiseq.
## This used a surrogate/batch estimate from: svaseq.
## The primary analysis performed 15 comparisons.
## The logFC agreement among the methods follows:
##                 Tmcflr_v_T
## limma_vs_deseq      0.8902
## limma_vs_edger      0.8905
## limma_vs_ebseq      0.8280
## limma_vs_basic      0.9441
## limma_vs_noiseq    -0.8548
## deseq_vs_edger      0.9999
## deseq_vs_ebseq      0.8945
## deseq_vs_basic      0.8866
## deseq_vs_noiseq    -0.8760
## edger_vs_ebseq      0.8950
## edger_vs_basic      0.8870
## edger_vs_noiseq    -0.8766
## ebseq_vs_basic      0.9060
## ebseq_vs_noiseq    -0.8785
## basic_vs_noiseq    -0.9062
t_cf_monocyte_v1_tables_sva <- combine_de_tables(
  t_cf_monocyte_v1_de_sva, keepers = cf_contrast,
  excel = glue("{cf_prefix}/Monocytes/t_monocyte_v1_cf_tables_sva-v{ver}.xlsx"))
t_cf_monocyte_v1_tables_sva
## A set of combined differential expression results.
##                         table deseq_sigup deseq_sigdown edger_sigup
## 1 Tumacofailure_vs_Tumacocure          14            52          15
##   edger_sigdown limma_sigup limma_sigdown
## 1            57           0             0
## `geom_line()`: Each group consists of only one observation.
## i Do you need to adjust the group aesthetic?
## Plot describing unique/shared genes in a differential expression table.

t_cf_monocyte_v1_sig_sva <- extract_significant_genes(
  t_cf_monocyte_v1_tables_sva,
  excel = glue("{cf_prefix}/Monocytes/t_monocyte_v1_cf_sig_sva-v{ver}.xlsx"))
t_cf_monocyte_v1_sig_sva
## A set of genes deemed significant according to limma, edger, deseq, ebseq, basic.
## The parameters defining significant were:
## LFC cutoff: 1 adj P cutoff: 0.05
##         limma_up limma_down edger_up edger_down deseq_up deseq_down ebseq_up
## outcome        0          0       15         57       14         52        0
##         ebseq_down basic_up basic_down
## outcome         15        0          0

dim(t_cf_monocyte_v1_sig_sva$deseq$ups[[1]])
## [1] 14 69
dim(t_cf_monocyte_v1_sig_sva$deseq$downs[[1]])
## [1] 52 69
6.0.4.1.1 Gene set enrichment: gProfiler Monocytes by visit, V1

V1: Up: 14 genes; No categories V1: Down: 52 genes; 20 GO, 5 TF

t_cf_monocyte_v1_sig_sva_gp <- all_gprofiler(t_cf_monocyte_v1_sig_sva)
## Did not find the column:  in the significant genes.
## No results to show
## Please make sure that the organism is correct or set significant = FALSE
## No results to show
## Please make sure that the organism is correct or set significant = FALSE
## No results to show
## Please make sure that the organism is correct or set significant = FALSE
## No results to show
## Please make sure that the organism is correct or set significant = FALSE
## No results to show
## Please make sure that the organism is correct or set significant = FALSE
## No results to show
## Please make sure that the organism is correct or set significant = FALSE
## No results to show
## Please make sure that the organism is correct or set significant = FALSE
## No results to show
## Please make sure that the organism is correct or set significant = FALSE
## Add a little logic here to use enrichplot::dotplot().
## Did not find the column:  in the significant genes.
## No results to show
## Please make sure that the organism is correct or set significant = FALSE
## No results to show
## Please make sure that the organism is correct or set significant = FALSE
## No results to show
## Please make sure that the organism is correct or set significant = FALSE
## No results to show
## Please make sure that the organism is correct or set significant = FALSE
## No results to show
## Please make sure that the organism is correct or set significant = FALSE
## No results to show
## Please make sure that the organism is correct or set significant = FALSE
## No results to show
## Please make sure that the organism is correct or set significant = FALSE
## Add a little logic here to use enrichplot::dotplot().
t_cf_monocyte_v1_sig_sva_gp
## Running gProfiler on every set of significant genes found:
##              GO KEGG REAC WP TF MIRNA HPA CORUM HP
## outcome_up    1    0    0  0  0     0   0     0  0
## outcome_down 19    0    0  0  2     0   0     0  0
written <- write_gprofiler_data(
  t_cf_monocyte_v1_sig_sva_gp[["outcome_up"]],
  excel = glue("{xlsx_prefix}/Gene set enrichment/t_cf_monocyte_v1_up-v{ver}.xlsx"))
written <- write_gprofiler_data(
  t_cf_monocyte_v1_sig_sva_gp[["outcome_down"]],
  excel = glue("{xlsx_prefix}/Gene set enrichment/t_cf_monocyte_v1_down-v{ver}.xlsx"))

enrichplot::dotplot(t_cf_monocyte_v1_sig_sva_gp[["outcome_down"]][["GO_enrich"]])

6.0.4.2 Visit 2

t_cf_monocyte_v2_de_sva <- all_pairwise(tv2_monocytes, model_batch = "svaseq", filter = TRUE)
## 
##    Tumaco_cure Tumaco_failure 
##              7              6
## Removing 0 low-count genes (10523 remaining).
## Setting 117 low elements to zero.
## transform_counts: Found 117 values equal to 0, adding 1 to the matrix.
t_cf_monocyte_v2_de_sva
## A pairwise differential expression with results from: basic, deseq, ebseq, edger, limma, noiseq.
## This used a surrogate/batch estimate from: svaseq.
## The primary analysis performed 15 comparisons.
## The logFC agreement among the methods follows:
##                 Tmcflr_v_T
## limma_vs_deseq      0.8480
## limma_vs_edger      0.8416
## limma_vs_ebseq      0.7855
## limma_vs_basic      0.8817
## limma_vs_noiseq    -0.8037
## deseq_vs_edger      0.9980
## deseq_vs_ebseq      0.9491
## deseq_vs_basic      0.8728
## deseq_vs_noiseq    -0.8881
## edger_vs_ebseq      0.9485
## edger_vs_basic      0.8658
## edger_vs_noiseq    -0.8791
## ebseq_vs_basic      0.8717
## ebseq_vs_noiseq    -0.8882
## basic_vs_noiseq    -0.9042
t_cf_monocyte_v2_tables_sva <- combine_de_tables(
  t_cf_monocyte_v2_de_sva, keepers = cf_contrast,
  excel = glue("{cf_prefix}/Monocytes/t_monocyte_v2_cf_tables_sva-v{ver}.xlsx"))
t_cf_monocyte_v2_tables_sva
## A set of combined differential expression results.
##                         table deseq_sigup deseq_sigdown edger_sigup
## 1 Tumacofailure_vs_Tumacocure           0             1           0
##   edger_sigdown limma_sigup limma_sigdown
## 1             0           0             0
## Only outcome_down has information, cannot create an UpSet.
## Plot describing unique/shared genes in a differential expression table.
## NULL
t_cf_monocyte_v2_sig_sva <- extract_significant_genes(
  t_cf_monocyte_v2_tables_sva,
  excel = glue("{cf_prefix}/Monocytes/t_monocyte_v2_cf_sig_sva-v{ver}.xlsx"))
t_cf_monocyte_v2_sig_sva
## A set of genes deemed significant according to limma, edger, deseq, ebseq, basic.
## The parameters defining significant were:
## LFC cutoff: 1 adj P cutoff: 0.05
##         limma_up limma_down edger_up edger_down deseq_up deseq_down ebseq_up
## outcome        0          0        0          0        0          1        1
##         ebseq_down basic_up basic_down
## outcome          5        0          0

dim(t_cf_monocyte_v2_sig_sva$deseq$ups[[1]])
## [1]  0 69
dim(t_cf_monocyte_v2_sig_sva$deseq$downs[[1]])
## [1]  1 69
6.0.4.2.1 Gene set enrichment: gProfiler Monocytes by visit V1

Insufficient data to use in gProfiler.

V2: Up: 1 gene V2: Down: 0 genes.

6.0.4.3 Visit 3

t_cf_monocyte_v3_de_sva <- all_pairwise(tv3_monocytes, model_batch = "svaseq", filter = TRUE)
## 
##    Tumaco_cure Tumaco_failure 
##              6              7
## Removing 0 low-count genes (10377 remaining).
## Setting 58 low elements to zero.
## transform_counts: Found 58 values equal to 0, adding 1 to the matrix.
t_cf_monocyte_v3_de_sva
## A pairwise differential expression with results from: basic, deseq, ebseq, edger, limma, noiseq.
## This used a surrogate/batch estimate from: svaseq.
## The primary analysis performed 15 comparisons.
## The logFC agreement among the methods follows:
##                 Tmcflr_v_T
## limma_vs_deseq      0.8342
## limma_vs_edger      0.8344
## limma_vs_ebseq      0.7169
## limma_vs_basic      0.8937
## limma_vs_noiseq    -0.7371
## deseq_vs_edger      0.9997
## deseq_vs_ebseq      0.8722
## deseq_vs_basic      0.7750
## deseq_vs_noiseq    -0.7603
## edger_vs_ebseq      0.8712
## edger_vs_basic      0.7746
## edger_vs_noiseq    -0.7588
## ebseq_vs_basic      0.8351
## ebseq_vs_noiseq    -0.8624
## basic_vs_noiseq    -0.8441
t_cf_monocyte_v3_tables_sva <- combine_de_tables(
  t_cf_monocyte_v3_de_sva, keepers = cf_contrast,
  excel = glue("{cf_prefix}/Monocytes/t_monocyte_v3_cf_tables_sva-v{ver}.xlsx"))
t_cf_monocyte_v3_tables_sva
## A set of combined differential expression results.
##                         table deseq_sigup deseq_sigdown edger_sigup
## 1 Tumacofailure_vs_Tumacocure           0             4           0
##   edger_sigdown limma_sigup limma_sigdown
## 1             8           0             0
## Only outcome_down has information, cannot create an UpSet.
## Plot describing unique/shared genes in a differential expression table.
## NULL
t_cf_monocyte_v3_sig_sva <- extract_significant_genes(
  t_cf_monocyte_v3_tables_sva,
  excel = glue("{cf_prefix}/Monocytes/t_monocyte_v3_cf_sig_sva-v{ver}.xlsx"))
t_cf_monocyte_v3_sig_sva
## A set of genes deemed significant according to limma, edger, deseq, ebseq, basic.
## The parameters defining significant were:
## LFC cutoff: 1 adj P cutoff: 0.05
##         limma_up limma_down edger_up edger_down deseq_up deseq_down ebseq_up
## outcome        0          0        0          8        0          4        0
##         ebseq_down basic_up basic_down
## outcome          1        0          0

dim(t_cf_monocyte_v3_sig_sva$deseq$ups[[1]])
## [1]  0 69
dim(t_cf_monocyte_v3_sig_sva$deseq$downs[[1]])
## [1]  4 69
6.0.4.3.1 Gene set enrichment: gProfiler Monocytes by visit, V3

V3: Up: 4 genes. V3: Down: 0 genes.

6.0.4.4 Monocytes: Compare sva to batch-in-model

sva_aucc <- calculate_aucc(t_cf_monocyte_tables_sva[["data"]][[1]],
                           tbl2 = t_cf_monocyte_tables_batchvisit[["data"]][[1]],
                           py = "deseq_adjp", ly = "deseq_logfc")
sva_aucc
## These two tables have an aucc value of: 0.694269508631419 and correlation:
## 
##  Pearson's product-moment correlation
## 
## data:  tbl[[lx]] and tbl[[ly]]
## t = 182, df = 10860, p-value <2e-16
## alternative hypothesis: true correlation is not equal to 0
## 95 percent confidence interval:
##  0.8634 0.8726
## sample estimates:
##    cor 
## 0.8681

shared_ids <- rownames(t_cf_monocyte_tables_sva[["data"]][[1]]) %in%
  rownames(t_cf_monocyte_tables_batchvisit[["data"]][[1]])
first <- t_cf_monocyte_tables_sva[["data"]][[1]][shared_ids, ]
second <- t_cf_monocyte_tables_batchvisit[["data"]][[1]][rownames(first), ]
cor.test(first[["deseq_logfc"]], second[["deseq_logfc"]])
## 
##  Pearson's product-moment correlation
## 
## data:  first[["deseq_logfc"]] and second[["deseq_logfc"]]
## t = 182, df = 10860, p-value <2e-16
## alternative hypothesis: true correlation is not equal to 0
## 95 percent confidence interval:
##  0.8634 0.8726
## sample estimates:
##    cor 
## 0.8681

6.0.5 Neutrophil samples

Switch context to the Neutrophils, once again repeat the analysis using SVA and visit as a batch factor.

t_cf_neutrophil_de_sva <- all_pairwise(t_neutrophils, model_batch = "svaseq", filter = TRUE)
## 
##    Tumaco_cure Tumaco_failure 
##             20             21
## Removing 0 low-count genes (9101 remaining).
## Setting 754 low elements to zero.
## transform_counts: Found 754 values equal to 0, adding 1 to the matrix.
t_cf_neutrophil_de_sva
## A pairwise differential expression with results from: basic, deseq, ebseq, edger, limma, noiseq.
## This used a surrogate/batch estimate from: svaseq.
## The primary analysis performed 15 comparisons.
## The logFC agreement among the methods follows:
##                 Tmcflr_v_T
## limma_vs_deseq      0.8742
## limma_vs_edger      0.8784
## limma_vs_ebseq      0.8430
## limma_vs_basic      0.9321
## limma_vs_noiseq    -0.8237
## deseq_vs_edger      0.9994
## deseq_vs_ebseq      0.9062
## deseq_vs_basic      0.8755
## deseq_vs_noiseq    -0.8196
## edger_vs_ebseq      0.9068
## edger_vs_basic      0.8813
## edger_vs_noiseq    -0.8269
## ebseq_vs_basic      0.8587
## ebseq_vs_noiseq    -0.8164
## basic_vs_noiseq    -0.8903
t_cf_neutrophil_tables_sva <- combine_de_tables(
  t_cf_neutrophil_de_sva, keepers = cf_contrast,
  excel = glue("{cf_prefix}/Neutrophils/t_neutrophil_cf_tables_sva-v{ver}.xlsx"))
t_cf_neutrophil_tables_sva
## A set of combined differential expression results.
##                         table deseq_sigup deseq_sigdown edger_sigup
## 1 Tumacofailure_vs_Tumacocure         129            30         120
##   edger_sigdown limma_sigup limma_sigdown
## 1            27          12            12
## `geom_line()`: Each group consists of only one observation.
## i Do you need to adjust the group aesthetic?
## Plot describing unique/shared genes in a differential expression table.

t_cf_neutrophil_sig_sva <- extract_significant_genes(
  t_cf_neutrophil_tables_sva,
  excel = glue("{cf_prefix}/Neutrophils/t_neutrophil_cf_sig_sva-v{ver}.xlsx"))
t_cf_neutrophil_sig_sva
## A set of genes deemed significant according to limma, edger, deseq, ebseq, basic.
## The parameters defining significant were:
## LFC cutoff: 1 adj P cutoff: 0.05
##         limma_up limma_down edger_up edger_down deseq_up deseq_down ebseq_up
## outcome       12         12      120         27      129         30        7
##         ebseq_down basic_up basic_down
## outcome          7        4          2

dim(t_cf_neutrophil_sig_sva$deseq$ups[[1]])
## [1] 129  69
dim(t_cf_neutrophil_sig_sva$deseq$downs[[1]])
## [1] 30 69
t_cf_neutrophil_de_batchvisit <- all_pairwise(t_neutrophils, model_batch = TRUE, filter = TRUE)
## 
##    Tumaco_cure Tumaco_failure 
##             20             21 
## 
##  3  2  1 
## 12 13 16
t_cf_neutrophil_de_batchvisit
## A pairwise differential expression with results from: basic, deseq, ebseq, edger, limma, noiseq.
## This used a surrogate/batch estimate from: batch in model/limma.
## The primary analysis performed 15 comparisons.
## The logFC agreement among the methods follows:
##                 Tmcflr_v_T
## limma_vs_deseq      0.8380
## limma_vs_edger      0.8401
## limma_vs_ebseq      0.8284
## limma_vs_basic      0.9658
## limma_vs_noiseq    -0.8544
## deseq_vs_edger      0.9999
## deseq_vs_ebseq      0.9813
## deseq_vs_basic      0.8644
## deseq_vs_noiseq    -0.8164
## edger_vs_ebseq      0.9818
## edger_vs_basic      0.8671
## edger_vs_noiseq    -0.8202
## ebseq_vs_basic      0.8587
## ebseq_vs_noiseq    -0.8164
## basic_vs_noiseq    -0.8903
t_cf_neutrophil_tables_batchvisit <- combine_de_tables(
  t_cf_neutrophil_de_batchvisit, keepers = cf_contrast,
  excel = glue("{cf_prefix}/Neutrophils/t_neutrophil_cf_tables_batchvisit-v{ver}.xlsx"))
t_cf_neutrophil_tables_batchvisit
## A set of combined differential expression results.
##                         table deseq_sigup deseq_sigdown edger_sigup
## 1 Tumacofailure_vs_Tumacocure          92            47         101
##   edger_sigdown limma_sigup limma_sigdown
## 1            44           3             1
## `geom_line()`: Each group consists of only one observation.
## i Do you need to adjust the group aesthetic?
## Plot describing unique/shared genes in a differential expression table.

t_cf_neutrophil_sig_batchvisit <- extract_significant_genes(
  t_cf_neutrophil_tables_batchvisit,
  excel = glue("{cf_prefix}/Neutrophils/t_neutrophil_cf_sig_batchvisit-v{ver}.xlsx"))
t_cf_neutrophil_sig_batchvisit
## A set of genes deemed significant according to limma, edger, deseq, ebseq, basic.
## The parameters defining significant were:
## LFC cutoff: 1 adj P cutoff: 0.05
##         limma_up limma_down edger_up edger_down deseq_up deseq_down ebseq_up
## outcome        3          1      101         44       92         47        7
##         ebseq_down basic_up basic_down
## outcome          7        4          2

dim(t_cf_neutrophil_sig_batchvisit$deseq$ups[[1]])
## [1] 92 69
dim(t_cf_neutrophil_sig_batchvisit$deseq$downs[[1]])
## [1] 47 69
6.0.5.0.1 Gene set enrichment: gProfiler Neutrophils

Up: 84 genes; 5 GO, 2 Reactome, 3 TF, no others. Down: 29 genes: 12 GO, 1 Reactome, 1 TF, 1 miRNA, 11 HP, 0 others

t_cf_neutrophil_sig_sva_gp <- all_gprofiler(t_cf_neutrophil_sig_sva)
## Did not find the column:  in the significant genes.
## No results to show
## Please make sure that the organism is correct or set significant = FALSE
## No results to show
## Please make sure that the organism is correct or set significant = FALSE
## No results to show
## Please make sure that the organism is correct or set significant = FALSE
## No results to show
## Please make sure that the organism is correct or set significant = FALSE
## Add a little logic here to use enrichplot::dotplot().
## Did not find the column:  in the significant genes.
## No results to show
## Please make sure that the organism is correct or set significant = FALSE
## No results to show
## Please make sure that the organism is correct or set significant = FALSE
## No results to show
## Please make sure that the organism is correct or set significant = FALSE
## No results to show
## Please make sure that the organism is correct or set significant = FALSE
## No results to show
## Please make sure that the organism is correct or set significant = FALSE
## No results to show
## Please make sure that the organism is correct or set significant = FALSE
## Add a little logic here to use enrichplot::dotplot().
t_cf_neutrophil_sig_sva_gp
## Running gProfiler on every set of significant genes found:
##              GO KEGG REAC WP TF MIRNA HPA CORUM HP
## outcome_up   72    0    5  2 53     1   0     0  0
## outcome_down  3    0    0  0  0     1   0     0  1
written <- write_gprofiler_data(
  t_cf_neutrophil_sig_sva_gp[["outcome_up"]],
  excel = glue("{xlsx_prefix}/Gene set enrichment/t_cf_neutrophil_up-v{ver}.xlsx"))
## `geom_line()`: Each group consists of only one observation.
## i Do you need to adjust the group aesthetic?
## `geom_line()`: Each group consists of only one observation.
## i Do you need to adjust the group aesthetic?
## `geom_line()`: Each group consists of only one observation.
## i Do you need to adjust the group aesthetic?
## `geom_line()`: Each group consists of only one observation.
## i Do you need to adjust the group aesthetic?
## `geom_line()`: Each group consists of only one observation.
## i Do you need to adjust the group aesthetic?
## `geom_line()`: Each group consists of only one observation.
## i Do you need to adjust the group aesthetic?
## `geom_line()`: Each group consists of only one observation.
## i Do you need to adjust the group aesthetic?
## `geom_line()`: Each group consists of only one observation.
## i Do you need to adjust the group aesthetic?
written <- write_gprofiler_data(
  t_cf_neutrophil_sig_sva_gp[["outcome_down"]],
  excel = glue("{xlsx_prefix}/Gene set enrichment/t_cf_neutrophil_down-v{ver}.xlsx"))
## `geom_line()`: Each group consists of only one observation.
## i Do you need to adjust the group aesthetic?
## `geom_line()`: Each group consists of only one observation.
## i Do you need to adjust the group aesthetic?
## `geom_line()`: Each group consists of only one observation.
## i Do you need to adjust the group aesthetic?
## `geom_line()`: Each group consists of only one observation.
## i Do you need to adjust the group aesthetic?
## `geom_line()`: Each group consists of only one observation.
## i Do you need to adjust the group aesthetic?
## `geom_line()`: Each group consists of only one observation.
## i Do you need to adjust the group aesthetic?
## `geom_line()`: Each group consists of only one observation.
## i Do you need to adjust the group aesthetic?
## `geom_line()`: Each group consists of only one observation.
## i Do you need to adjust the group aesthetic?
enrichplot::dotplot(t_cf_neutrophil_sig_sva_gp[["outcome_up"]][["GO_enrich"]])

enrichplot::dotplot(t_cf_neutrophil_sig_sva_gp[["outcome_up"]][["TF_enrich"]])

enrichplot::dotplot(t_cf_neutrophil_sig_sva_gp[["outcome_down"]][["GO_enrich"]])

## enrichplot::dotplot(t_cf_neutrophil_sig_sva_gp[["outcome_down"]][["HP_enrich"]])

6.0.5.1 Neutrophils by visit

When I did this with the monocytes, I split it up into multiple blocks for each visit. This time I am just going to run them all together.

visitcf_factor <- paste0("v", pData(t_neutrophils)[["visitnumber"]],
                         pData(t_neutrophils)[["finaloutcome"]])
t_neutrophil_visitcf <- set_expt_conditions(t_neutrophils, fact=visitcf_factor)
## The numbers of samples by condition are:
## 
##    v1cure v1failure    v2cure v2failure    v3cure v3failure 
##         8         8         7         6         5         7
t_cf_neutrophil_visits_de_sva <- all_pairwise(t_neutrophil_visitcf, model_batch = "svaseq",
                                              filter = TRUE)
## 
##    v1cure v1failure    v2cure v2failure    v3cure v3failure 
##         8         8         7         6         5         7
## Removing 0 low-count genes (9101 remaining).
## Setting 685 low elements to zero.
## transform_counts: Found 685 values equal to 0, adding 1 to the matrix.
t_cf_neutrophil_visits_de_sva
## A pairwise differential expression with results from: basic, deseq, edger, limma, noiseq.
## This used a surrogate/batch estimate from: svaseq.
## The primary analysis performed 10 comparisons.
t_cf_neutrophil_visits_tables_sva <- combine_de_tables(
  t_cf_neutrophil_visits_de_sva, keepers = visitcf_contrasts,
  excel = glue("{cf_prefix}/Neutrophils/t_neutrophil_visitcf_tables_sva-v{ver}.xlsx"))
t_cf_neutrophil_visits_tables_sva
## A set of combined differential expression results.
##                 table deseq_sigup deseq_sigdown edger_sigup edger_sigdown
## 1 v1failure_vs_v1cure          12             6           6             6
## 2 v2failure_vs_v2cure           2             6           2             3
## 3 v3failure_vs_v3cure           2             2           0             2
##   limma_sigup limma_sigdown
## 1           1             0
## 2           0             0
## 3           0             0
## Plot describing unique/shared genes in a differential expression table.

t_cf_neutrophil_visits_sig_sva <- extract_significant_genes(
  t_cf_neutrophil_visits_tables_sva,
  excel = glue("{cf_prefix}/Neutrophils/t_neutrophil_visitcf_sig_sva-v{ver}.xlsx"))
t_cf_neutrophil_visits_sig_sva
## A set of genes deemed significant according to limma, edger, deseq, basic.
## The parameters defining significant were:
## LFC cutoff: 1 adj P cutoff: 0.05
##      limma_up limma_down edger_up edger_down deseq_up deseq_down basic_up
## v1cf        1          0        6          6       12          6        0
## v2cf        0          0        2          3        2          6        0
## v3cf        0          0        0          2        2          2        0
##      basic_down
## v1cf          0
## v2cf          0
## v3cf          0

dim(t_cf_neutrophil_visits_sig_sva$deseq$ups[[1]])
## [1] 12 59
dim(t_cf_neutrophil_visits_sig_sva$deseq$downs[[1]])
## [1]  6 59
t_cf_neutrophil_v1_de_sva <- all_pairwise(tv1_neutrophils, model_batch = "svaseq", filter = TRUE)
## 
##    Tumaco_cure Tumaco_failure 
##              8              8
## Removing 0 low-count genes (8717 remaining).
## Setting 145 low elements to zero.
## transform_counts: Found 145 values equal to 0, adding 1 to the matrix.
t_cf_neutrophil_v1_de_sva
## A pairwise differential expression with results from: basic, deseq, ebseq, edger, limma, noiseq.
## This used a surrogate/batch estimate from: svaseq.
## The primary analysis performed 15 comparisons.
## The logFC agreement among the methods follows:
##                 Tmcflr_v_T
## limma_vs_deseq      0.8182
## limma_vs_edger      0.8319
## limma_vs_ebseq      0.7986
## limma_vs_basic      0.8910
## limma_vs_noiseq    -0.8084
## deseq_vs_edger      0.9946
## deseq_vs_ebseq      0.9420
## deseq_vs_basic      0.8627
## deseq_vs_noiseq    -0.8290
## edger_vs_ebseq      0.9422
## edger_vs_basic      0.8792
## edger_vs_noiseq    -0.8474
## ebseq_vs_basic      0.8706
## ebseq_vs_noiseq    -0.8574
## basic_vs_noiseq    -0.9014
t_cf_neutrophil_v1_tables_sva <- combine_de_tables(
  t_cf_neutrophil_v1_de_sva, keepers = cf_contrast,
  excel = glue("{cf_prefix}/Neutrophils/t_neutrophil_v1_cf_tables_sva-v{ver}.xlsx"))
t_cf_neutrophil_v1_tables_sva
## A set of combined differential expression results.
##                         table deseq_sigup deseq_sigdown edger_sigup
## 1 Tumacofailure_vs_Tumacocure           5             8           5
##   edger_sigdown limma_sigup limma_sigdown
## 1            11           0             0
## `geom_line()`: Each group consists of only one observation.
## i Do you need to adjust the group aesthetic?
## Plot describing unique/shared genes in a differential expression table.

t_cf_neutrophil_v1_sig_sva <- extract_significant_genes(
  t_cf_neutrophil_v1_tables_sva,
  excel = glue("{cf_prefix}/Neutrophils/t_neutrophil_v1_cf_sig_sva-v{ver}.xlsx"))
t_cf_neutrophil_v1_sig_sva
## A set of genes deemed significant according to limma, edger, deseq, ebseq, basic.
## The parameters defining significant were:
## LFC cutoff: 1 adj P cutoff: 0.05
##         limma_up limma_down edger_up edger_down deseq_up deseq_down ebseq_up
## outcome        0          0        5         11        5          8        0
##         ebseq_down basic_up basic_down
## outcome          2        0          0

dim(t_cf_neutrophil_v1_sig_sva$deseq$ups[[1]])
## [1]  5 69
dim(t_cf_neutrophil_v1_sig_sva$deseq$downs[[1]])
## [1]  8 69
t_cf_neutrophil_v2_de_sva <- all_pairwise(tv2_neutrophils, model_batch = "svaseq", filter = TRUE)
## 
##    Tumaco_cure Tumaco_failure 
##              7              6
## Removing 0 low-count genes (8452 remaining).
## Setting 78 low elements to zero.
## transform_counts: Found 78 values equal to 0, adding 1 to the matrix.
t_cf_neutrophil_v2_de_sva
## A pairwise differential expression with results from: basic, deseq, ebseq, edger, limma, noiseq.
## This used a surrogate/batch estimate from: svaseq.
## The primary analysis performed 15 comparisons.
## The logFC agreement among the methods follows:
##                 Tmcflr_v_T
## limma_vs_deseq      0.8893
## limma_vs_edger      0.8880
## limma_vs_ebseq      0.8654
## limma_vs_basic      0.9485
## limma_vs_noiseq    -0.8394
## deseq_vs_edger      0.9986
## deseq_vs_ebseq      0.9777
## deseq_vs_basic      0.9021
## deseq_vs_noiseq    -0.9024
## edger_vs_ebseq      0.9754
## edger_vs_basic      0.9026
## edger_vs_noiseq    -0.9009
## ebseq_vs_basic      0.8977
## ebseq_vs_noiseq    -0.9151
## basic_vs_noiseq    -0.8742
t_cf_neutrophil_v2_tables_sva <- combine_de_tables(
  t_cf_neutrophil_v2_de_sva,
  keepers = cf_contrast,
  excel = glue("{cf_prefix}/Neutrophils/t_neutrophil_v2_cf_tables_sva-v{ver}.xlsx"))
t_cf_neutrophil_v2_tables_sva
## A set of combined differential expression results.
##                         table deseq_sigup deseq_sigdown edger_sigup
## 1 Tumacofailure_vs_Tumacocure           9             3          20
##   edger_sigdown limma_sigup limma_sigdown
## 1             6           0             0
## `geom_line()`: Each group consists of only one observation.
## i Do you need to adjust the group aesthetic?
## Plot describing unique/shared genes in a differential expression table.

t_cf_neutrophil_v2_sig_sva <- extract_significant_genes(
  t_cf_neutrophil_v2_tables_sva,
  excel = glue("{cf_prefix}/Neutrophils/t_neutrophil_v2_cf_sig_sva-v{ver}.xlsx"))
t_cf_neutrophil_v2_sig_sva
## A set of genes deemed significant according to limma, edger, deseq, ebseq, basic.
## The parameters defining significant were:
## LFC cutoff: 1 adj P cutoff: 0.05
##         limma_up limma_down edger_up edger_down deseq_up deseq_down ebseq_up
## outcome        0          0       20          6        9          3        1
##         ebseq_down basic_up basic_down
## outcome          1        0          0

dim(t_cf_neutrophil_v2_sig_sva$deseq$ups[[1]])
## [1]  9 69
dim(t_cf_neutrophil_v2_sig_sva$deseq$downs[[1]])
## [1]  3 69
t_cf_neutrophil_v3_de_sva <- all_pairwise(tv3_neutrophils, model_batch = "svaseq", filter = TRUE)
## 
##    Tumaco_cure Tumaco_failure 
##              5              7
## Removing 0 low-count genes (8505 remaining).
## Setting 83 low elements to zero.
## transform_counts: Found 83 values equal to 0, adding 1 to the matrix.
t_cf_neutrophil_v3_de_sva
## A pairwise differential expression with results from: basic, deseq, ebseq, edger, limma, noiseq.
## This used a surrogate/batch estimate from: svaseq.
## The primary analysis performed 15 comparisons.
## The logFC agreement among the methods follows:
##                 Tmcflr_v_T
## limma_vs_deseq      0.8848
## limma_vs_edger      0.8859
## limma_vs_ebseq      0.7501
## limma_vs_basic      0.7953
## limma_vs_noiseq    -0.7096
## deseq_vs_edger      0.9993
## deseq_vs_ebseq      0.7551
## deseq_vs_basic      0.7530
## deseq_vs_noiseq    -0.7575
## edger_vs_ebseq      0.7595
## edger_vs_basic      0.7515
## edger_vs_noiseq    -0.7564
## ebseq_vs_basic      0.8738
## ebseq_vs_noiseq    -0.8915
## basic_vs_noiseq    -0.8892
t_cf_neutrophil_v3_tables_sva <- combine_de_tables(
  t_cf_neutrophil_v3_de_sva, keepers = cf_contrast,
  excel = glue("{cf_prefix}/Neutrophils/t_neutrophil_v3_cf_tables_sva-v{ver}.xlsx"))
t_cf_neutrophil_v3_tables_sva
## A set of combined differential expression results.
##                         table deseq_sigup deseq_sigdown edger_sigup
## 1 Tumacofailure_vs_Tumacocure           5             1           5
##   edger_sigdown limma_sigup limma_sigdown
## 1             1           0             0
## `geom_line()`: Each group consists of only one observation.
## i Do you need to adjust the group aesthetic?
## Plot describing unique/shared genes in a differential expression table.

t_cf_neutrophil_v3_sig_sva <- extract_significant_genes(
  t_cf_neutrophil_v3_tables_sva,
  excel = glue("{cf_prefix}/Neutrophils/t_neutrophil_v3_cf_sig_sva-v{ver}.xlsx"))
t_cf_neutrophil_v3_sig_sva
## A set of genes deemed significant according to limma, edger, deseq, ebseq, basic.
## The parameters defining significant were:
## LFC cutoff: 1 adj P cutoff: 0.05
##         limma_up limma_down edger_up edger_down deseq_up deseq_down ebseq_up
## outcome        0          0        5          1        5          1        2
##         ebseq_down basic_up basic_down
## outcome          3        0          0

dim(t_cf_neutrophil_v3_sig_sva$deseq$ups[[1]])
## [1]  5 69
dim(t_cf_monocyte_v3_sig_sva$deseq$downs[[1]])
## [1]  4 69
6.0.5.1.1 Gene set enrichment: gProfiler Neutrophils V1

V1: Up: 5 genes V1: Down: 8 genes; 14 GO.

t_cf_neutrophil_v1_sig_sva_gp <- all_gprofiler(t_cf_neutrophil_v1_sig_sva)
## Did not find the column:  in the significant genes.
## No results to show
## Please make sure that the organism is correct or set significant = FALSE
## No results to show
## Please make sure that the organism is correct or set significant = FALSE
## No results to show
## Please make sure that the organism is correct or set significant = FALSE
## No results to show
## Please make sure that the organism is correct or set significant = FALSE
## No results to show
## Please make sure that the organism is correct or set significant = FALSE
## No results to show
## Please make sure that the organism is correct or set significant = FALSE
## No results to show
## Please make sure that the organism is correct or set significant = FALSE
## No results to show
## Please make sure that the organism is correct or set significant = FALSE
## No results to show
## Please make sure that the organism is correct or set significant = FALSE
## Add a little logic here to use enrichplot::dotplot().
## Did not find the column:  in the significant genes.
## No results to show
## Please make sure that the organism is correct or set significant = FALSE
## No results to show
## Please make sure that the organism is correct or set significant = FALSE
## No results to show
## Please make sure that the organism is correct or set significant = FALSE
## No results to show
## Please make sure that the organism is correct or set significant = FALSE
## No results to show
## Please make sure that the organism is correct or set significant = FALSE
## No results to show
## Please make sure that the organism is correct or set significant = FALSE
## Add a little logic here to use enrichplot::dotplot().
t_cf_neutrophil_v1_sig_sva_gp
## Running gProfiler on every set of significant genes found:
##              GO KEGG REAC WP TF MIRNA HPA CORUM HP
## outcome_up    0    0    0  0  0     0   0     0  0
## outcome_down 17    0    0  0  0     3   0     1  0
written <- write_gprofiler_data(
  t_cf_neutrophil_v1_sig_sva_gp[["outcome_up"]],
  excel = glue("{xlsx_prefix}/Gene set enrichment/t_cf_neutrophil_v1_up-v{ver}.xlsx"))
## Warning: Workbook does not contain any worksheets. A worksheet will be added.
written <- write_gprofiler_data(
  t_cf_neutrophil_v1_sig_sva_gp[["outcome_down"]],
  excel = glue("{xlsx_prefix}/Gene set enrichment/t_cf_neutrophil_v1_down-v{ver}.xlsx"))
## `geom_line()`: Each group consists of only one observation.
## i Do you need to adjust the group aesthetic?
## `geom_line()`: Each group consists of only one observation.
## i Do you need to adjust the group aesthetic?
## `geom_line()`: Each group consists of only one observation.
## i Do you need to adjust the group aesthetic?
## `geom_line()`: Each group consists of only one observation.
## i Do you need to adjust the group aesthetic?
enrichplot::dotplot(t_cf_neutrophil_v1_sig_sva_gp[["outcome_down"]][["GO_enrich"]])

6.0.5.1.2 Gene set enrichment: gProfiler Neutrophils by visit, V2

Up: 5 genes; 3 GO, 10 TF. Down: 1 gene.

6.0.5.2 Neutrophils: Compare sva to batch-in-model

sva_aucc <- calculate_aucc(t_cf_neutrophil_tables_sva[["data"]][[1]],
                           tbl2 = t_cf_neutrophil_tables_batchvisit[["data"]][[1]],
                           py = "deseq_adjp", ly = "deseq_logfc")
sva_aucc
## These two tables have an aucc value of: 0.673368382537023 and correlation:
## 
##  Pearson's product-moment correlation
## 
## data:  tbl[[lx]] and tbl[[ly]]
## t = 209, df = 9099, p-value <2e-16
## alternative hypothesis: true correlation is not equal to 0
## 95 percent confidence interval:
##  0.9060 0.9131
## sample estimates:
##    cor 
## 0.9096

shared_ids <- rownames(t_cf_neutrophil_tables_sva[["data"]][[1]]) %in%
  rownames(t_cf_neutrophil_tables_batchvisit[["data"]][[1]])
first <- t_cf_neutrophil_tables_sva[["data"]][[1]][shared_ids, ]
second <- t_cf_neutrophil_tables_batchvisit[["data"]][[1]][rownames(first), ]
cor.test(first[["deseq_logfc"]], second[["deseq_logfc"]])
## 
##  Pearson's product-moment correlation
## 
## data:  first[["deseq_logfc"]] and second[["deseq_logfc"]]
## t = 209, df = 9099, p-value <2e-16
## alternative hypothesis: true correlation is not equal to 0
## 95 percent confidence interval:
##  0.9060 0.9131
## sample estimates:
##    cor 
## 0.9096

6.0.6 Eosinophils

This time, with feeling! Repeating the same set of tasks with the eosinophil samples.

t_cf_eosinophil_de_sva <- all_pairwise(t_eosinophils, model_batch = "svaseq", filter = TRUE)
## 
##    Tumaco_cure Tumaco_failure 
##             17              9
## Removing 0 low-count genes (10532 remaining).
## Setting 327 low elements to zero.
## transform_counts: Found 327 values equal to 0, adding 1 to the matrix.
t_cf_eosinophil_de_sva
## A pairwise differential expression with results from: basic, deseq, ebseq, edger, limma, noiseq.
## This used a surrogate/batch estimate from: svaseq.
## The primary analysis performed 15 comparisons.
## The logFC agreement among the methods follows:
##                 Tmcflr_v_T
## limma_vs_deseq      0.9099
## limma_vs_edger      0.9174
## limma_vs_ebseq      0.8005
## limma_vs_basic      0.8755
## limma_vs_noiseq    -0.7909
## deseq_vs_edger      0.9973
## deseq_vs_ebseq      0.8058
## deseq_vs_basic      0.8488
## deseq_vs_noiseq    -0.7864
## edger_vs_ebseq      0.8134
## edger_vs_basic      0.8546
## edger_vs_noiseq    -0.7963
## ebseq_vs_basic      0.8636
## ebseq_vs_noiseq    -0.8453
## basic_vs_noiseq    -0.8713
t_cf_eosinophil_tables_sva <- combine_de_tables(
  t_cf_eosinophil_de_sva, keepers = cf_contrast,
  excel = glue("{cf_prefix}/Eosinophils/t_eosinophil_cf_tables_sva-v{ver}.xlsx"))
t_cf_eosinophil_tables_sva
## A set of combined differential expression results.
##                         table deseq_sigup deseq_sigdown edger_sigup
## 1 Tumacofailure_vs_Tumacocure         116            73         112
##   edger_sigdown limma_sigup limma_sigdown
## 1            63          57            34
## `geom_line()`: Each group consists of only one observation.
## i Do you need to adjust the group aesthetic?
## Plot describing unique/shared genes in a differential expression table.

t_cf_eosinophil_sig_sva <- extract_significant_genes(
  t_cf_eosinophil_tables_sva,
  excel = glue("{cf_prefix}/Eosinophils/t_eosinophil_cf_sig_sva-v{ver}.xlsx"))
t_cf_eosinophil_sig_sva
## A set of genes deemed significant according to limma, edger, deseq, ebseq, basic.
## The parameters defining significant were:
## LFC cutoff: 1 adj P cutoff: 0.05
##         limma_up limma_down edger_up edger_down deseq_up deseq_down ebseq_up
## outcome       57         34      112         63      116         73        7
##         ebseq_down basic_up basic_down
## outcome         33        0          0

dim(t_cf_eosinophil_sig_sva$deseq$ups[[1]])
## [1] 116  69
dim(t_cf_eosinophil_sig_sva$deseq$downs[[1]])
## [1] 73 69
t_cf_eosinophil_de_batchvisit <- all_pairwise(t_eosinophils, model_batch = TRUE, filter = TRUE)
## 
##    Tumaco_cure Tumaco_failure 
##             17              9 
## 
## 3 2 1 
## 9 9 8
t_cf_eosinophil_de_batchvisit
## A pairwise differential expression with results from: basic, deseq, ebseq, edger, limma, noiseq.
## This used a surrogate/batch estimate from: batch in model/limma.
## The primary analysis performed 15 comparisons.
## The logFC agreement among the methods follows:
##                 Tmcflr_v_T
## limma_vs_deseq      0.8678
## limma_vs_edger      0.8696
## limma_vs_ebseq      0.8328
## limma_vs_basic      0.9676
## limma_vs_noiseq    -0.8444
## deseq_vs_edger      0.9998
## deseq_vs_ebseq      0.9519
## deseq_vs_basic      0.8961
## deseq_vs_noiseq    -0.8351
## edger_vs_ebseq      0.9559
## edger_vs_basic      0.8977
## edger_vs_noiseq    -0.8396
## ebseq_vs_basic      0.8636
## ebseq_vs_noiseq    -0.8453
## basic_vs_noiseq    -0.8713
t_cf_eosinophil_tables_batchvisit <- combine_de_tables(
  t_cf_eosinophil_de_batchvisit, keepers = cf_contrast,
  excel = glue("{cf_prefix}/Eosinophils/t_eosinophil_cf_tables_batchvisit-v{ver}.xlsx"))
t_cf_eosinophil_tables_batchvisit
## A set of combined differential expression results.
##                         table deseq_sigup deseq_sigdown edger_sigup
## 1 Tumacofailure_vs_Tumacocure          99            35         103
##   edger_sigdown limma_sigup limma_sigdown
## 1            24          35            15
## `geom_line()`: Each group consists of only one observation.
## i Do you need to adjust the group aesthetic?
## Plot describing unique/shared genes in a differential expression table.

t_cf_eosinophil_sig_batchvisit <- extract_significant_genes(
  t_cf_eosinophil_tables_batchvisit,
  excel = glue("{cf_prefix}/Eosinophils/t_eosinophil_cf_sig_batchvisit-v{ver}.xlsx"))
t_cf_eosinophil_sig_batchvisit
## A set of genes deemed significant according to limma, edger, deseq, ebseq, basic.
## The parameters defining significant were:
## LFC cutoff: 1 adj P cutoff: 0.05
##         limma_up limma_down edger_up edger_down deseq_up deseq_down ebseq_up
## outcome       35         15      103         24       99         35        7
##         ebseq_down basic_up basic_down
## outcome         33        0          0

dim(t_cf_eosinophil_sig_batchvisit$deseq$ups[[1]])
## [1] 99 69
dim(t_cf_eosinophil_sig_batchvisit$deseq$downs[[1]])
## [1] 35 69
visitcf_factor <- paste0("v", pData(t_eosinophils)[["visitnumber"]],
                         pData(t_eosinophils)[["finaloutcome"]])
t_eosinophil_visitcf <- set_expt_conditions(t_eosinophils, fact = visitcf_factor)
## The numbers of samples by condition are:
## 
##    v1cure v1failure    v2cure v2failure    v3cure v3failure 
##         5         3         6         3         6         3
t_cf_eosinophil_visits_de_sva <- all_pairwise(t_eosinophil_visitcf, model_batch = "svaseq",
                                              filter = TRUE)
## 
##    v1cure v1failure    v2cure v2failure    v3cure v3failure 
##         5         3         6         3         6         3
## Removing 0 low-count genes (10532 remaining).
## Setting 373 low elements to zero.
## transform_counts: Found 373 values equal to 0, adding 1 to the matrix.

t_cf_eosinophil_visits_de_sva
## A pairwise differential expression with results from: basic, deseq, edger, limma, noiseq.
## This used a surrogate/batch estimate from: svaseq.
## The primary analysis performed 10 comparisons.
t_cf_eosinophil_visits_tables_sva <- combine_de_tables(
  t_cf_eosinophil_visits_de_sva, keepers = visitcf_contrasts,
  excel = glue("{cf_prefix}/Eosinophils/t_eosinophil_visitcf_tables_sva-v{ver}.xlsx"))
t_cf_eosinophil_visits_tables_sva
## A set of combined differential expression results.
##                 table deseq_sigup deseq_sigdown edger_sigup edger_sigdown
## 1 v1failure_vs_v1cure           9            11           2             3
## 2 v2failure_vs_v2cure           4             3           5             2
## 3 v3failure_vs_v3cure          14             7          17             2
##   limma_sigup limma_sigdown
## 1           0             1
## 2           0             0
## 3           0             0
## Plot describing unique/shared genes in a differential expression table.

t_cf_eosinophil_visits_sig_sva <- extract_significant_genes(
  t_cf_eosinophil_visits_tables_sva,
  excel = glue("{cf_prefix}/Eosinophils/t_eosinophil_visitcf_sig_sva-v{ver}.xlsx"))
t_cf_eosinophil_visits_sig_sva
## A set of genes deemed significant according to limma, edger, deseq, basic.
## The parameters defining significant were:
## LFC cutoff: 1 adj P cutoff: 0.05
##      limma_up limma_down edger_up edger_down deseq_up deseq_down basic_up
## v1cf        0          1        2          3        9         11        0
## v2cf        0          0        5          2        4          3        0
## v3cf        0          0       17          2       14          7        0
##      basic_down
## v1cf          0
## v2cf          0
## v3cf          0

dim(t_cf_eosinophil_visits_sig_sva$deseq$ups[[1]])
## [1]  9 59
dim(t_cf_eosinophil_visits_sig_sva$deseq$downs[[1]])
## [1] 11 59
6.0.6.0.1 Gene set enrichment: gProfiler Eosinophils

Up: 116 genes; 123 GO, 2 KEGG, 7 Reactome, 5 WP, 69 TF, 1 miRNA, 0 others Down: 74 genes; 5 GO, 1 Reactome, 4 TF, 0 others

t_cf_eosinophil_sig_sva_gp <- all_gprofiler(t_cf_eosinophil_sig_sva)
## Did not find the column:  in the significant genes.
## No results to show
## Please make sure that the organism is correct or set significant = FALSE
## No results to show
## Please make sure that the organism is correct or set significant = FALSE
## No results to show
## Please make sure that the organism is correct or set significant = FALSE
## Add a little logic here to use enrichplot::dotplot().
## Did not find the column:  in the significant genes.
## No results to show
## Please make sure that the organism is correct or set significant = FALSE
## No results to show
## Please make sure that the organism is correct or set significant = FALSE
## No results to show
## Please make sure that the organism is correct or set significant = FALSE
## No results to show
## Please make sure that the organism is correct or set significant = FALSE
## No results to show
## Please make sure that the organism is correct or set significant = FALSE
## No results to show
## Please make sure that the organism is correct or set significant = FALSE
## Add a little logic here to use enrichplot::dotplot().
t_cf_eosinophil_sig_sva_gp
## Running gProfiler on every set of significant genes found:
##               GO KEGG REAC WP TF MIRNA HPA CORUM HP
## outcome_up   148    2    7  5 68     1   0     0  0
## outcome_down   6    0    1  0  1     0   0     0  0
written <- write_gprofiler_data(
  t_cf_eosinophil_sig_sva_gp[["outcome_up"]],
  excel = glue("{xlsx_prefix}/Gene set enrichment/t_cf_eosinophil_up-v{ver}.xlsx"))
## `geom_line()`: Each group consists of only one observation.
## i Do you need to adjust the group aesthetic?
## `geom_line()`: Each group consists of only one observation.
## i Do you need to adjust the group aesthetic?
## `geom_line()`: Each group consists of only one observation.
## i Do you need to adjust the group aesthetic?
## `geom_line()`: Each group consists of only one observation.
## i Do you need to adjust the group aesthetic?
written <- write_gprofiler_data(
  t_cf_eosinophil_sig_sva_gp[["outcome_down"]],
  excel = glue("{xlsx_prefix}/Gene set enrichment/t_cf_eosinophil_down-v{ver}.xlsx"))
## `geom_line()`: Each group consists of only one observation.
## i Do you need to adjust the group aesthetic?
## `geom_line()`: Each group consists of only one observation.
## i Do you need to adjust the group aesthetic?
## `geom_line()`: Each group consists of only one observation.
## i Do you need to adjust the group aesthetic?
## `geom_line()`: Each group consists of only one observation.
## i Do you need to adjust the group aesthetic?
## `geom_line()`: Each group consists of only one observation.
## i Do you need to adjust the group aesthetic?
## `geom_line()`: Each group consists of only one observation.
## i Do you need to adjust the group aesthetic?
## `geom_line()`: Each group consists of only one observation.
## i Do you need to adjust the group aesthetic?
## `geom_line()`: Each group consists of only one observation.
## i Do you need to adjust the group aesthetic?
enrichplot::dotplot(t_cf_eosinophil_sig_sva_gp[["outcome_up"]][["GO_enrich"]])

enrichplot::dotplot(t_cf_eosinophil_sig_sva_gp[["outcome_up"]][["REAC_enrich"]])

enrichplot::dotplot(t_cf_eosinophil_sig_sva_gp[["outcome_up"]][["WP_enrich"]])

enrichplot::dotplot(t_cf_eosinophil_sig_sva_gp[["outcome_up"]][["TF_enrich"]])

enrichplot::dotplot(t_cf_eosinophil_sig_sva_gp[["outcome_down"]][["GO_enrich"]])

enrichplot::dotplot(t_cf_eosinophil_sig_sva_gp[["outcome_down"]][["TF_enrich"]])

6.0.6.1 C/F celltype volcano plots with specific labels

6.0.7 Figure 4B: Volcano plots

Note to self, when I rendered the html, stupid R ran out of temp files and so did not actually print the darn html document, as a result I modified the render function to try to make sure there is a clean directory in which to work; testing now. If it continues to not work, I will need to remove some of the images created in this document.

num_color <- color_choices[["clinic_cf"]][["Tumaco_failure"]]
den_color <- color_choices[["clinic_cf"]][["Tumaco_cure"]]
wanted_genes <- c("FI44L", "IFI27", "PRR5", "PRR5-ARHGAP8", "RHCE",
                  "FBXO39", "RSAD2", "SMTNL1", "USP18", "AFAP1")

cf_monocyte_table <- t_cf_monocyte_tables_sva[["data"]][["outcome"]]
cf_monocyte_volcano <- plot_volcano_condition_de(
  cf_monocyte_table, "outcome", label = wanted_genes,
  fc_col = "deseq_logfc", p_col = "deseq_adjp", line_position = NULL,
  color_high = num_color, color_low = den_color, label_size = 6)
pp(file = glue("images/cf_monocyte_volcano_labeled-v{ver}.svg"))
## Warning in pp(file = glue("images/cf_monocyte_volcano_labeled-v{ver}.svg")):
## The directory: images does not exist, will attempt to create it.
cf_monocyte_volcano$plot
dev.off()
## png 
##   2
cf_monocyte_volcano$plot

cf_eosinophil_table <- t_cf_eosinophil_tables_sva[["data"]][["outcome"]]
cf_eosinophil_volcano <- plot_volcano_condition_de(
  cf_eosinophil_table, "outcome", label = wanted_genes,
  fc_col = "deseq_logfc", p_col = "deseq_adjp", line_position = NULL,
  color_high = num_color, color_low = den_color, label_size = 6)
pp(file = glue("images/cf_eosinophil_volcano_labeled-v{ver}.svg"))
cf_eosinophil_volcano$plot
dev.off()
## png 
##   2
cf_eosinophil_volcano$plot

cf_neutrophil_table <- t_cf_neutrophil_tables_sva[["data"]][["outcome"]]
cf_neutrophil_volcano <- plot_volcano_condition_de(
  cf_neutrophil_table, "outcome", label = wanted_genes,
  fc_col = "deseq_logfc", p_col = "deseq_adjp", line_position = NULL,
  color_high = num_color, color_low = den_color, label_size = 6)
pp(file = glue("images/cf_neutrophil_volcano_labeled-v{ver}.svg"))
cf_neutrophil_volcano$plot
dev.off()
## png 
##   2
cf_neutrophil_volcano$plot

6.0.8 Eosinophil time comparisons

t_cf_eosinophil_v1_de_sva <- all_pairwise(tv1_eosinophils, model_batch = "svaseq", filter = TRUE)
## 
##    Tumaco_cure Tumaco_failure 
##              5              3
## Removing 0 low-count genes (9979 remaining).
## Setting 57 low elements to zero.
## transform_counts: Found 57 values equal to 0, adding 1 to the matrix.
t_cf_eosinophil_v1_de_sva
## A pairwise differential expression with results from: basic, deseq, ebseq, edger, limma, noiseq.
## This used a surrogate/batch estimate from: svaseq.
## The primary analysis performed 15 comparisons.
## The logFC agreement among the methods follows:
##                 Tmcflr_v_T
## limma_vs_deseq      0.8465
## limma_vs_edger      0.8498
## limma_vs_ebseq      0.8494
## limma_vs_basic      0.9207
## limma_vs_noiseq    -0.8343
## deseq_vs_edger      0.9996
## deseq_vs_ebseq      0.8648
## deseq_vs_basic      0.8702
## deseq_vs_noiseq    -0.7807
## edger_vs_ebseq      0.8683
## edger_vs_basic      0.8716
## edger_vs_noiseq    -0.7850
## ebseq_vs_basic      0.8820
## ebseq_vs_noiseq    -0.9448
## basic_vs_noiseq    -0.8407
t_cf_eosinophil_v1_tables_sva <- combine_de_tables(
  t_cf_eosinophil_v1_de_sva, keepers = cf_contrast,
  excel = glue("{cf_prefix}/Eosinophils/t_eosinophil_v1_cf_tables_sva-v{ver}.xlsx"))
t_cf_eosinophil_v1_tables_sva
## A set of combined differential expression results.
##                         table deseq_sigup deseq_sigdown edger_sigup
## 1 Tumacofailure_vs_Tumacocure          13            19          11
##   edger_sigdown limma_sigup limma_sigdown
## 1            10           0             0
## `geom_line()`: Each group consists of only one observation.
## i Do you need to adjust the group aesthetic?
## Plot describing unique/shared genes in a differential expression table.

t_cf_eosinophil_v1_sig_sva <- extract_significant_genes(
  t_cf_eosinophil_v1_tables_sva,
  excel = glue("{cf_prefix}/Eosinophils/t_eosinophil_v1_cf_sig_sva-v{ver}.xlsx"))
t_cf_eosinophil_v1_tables_sva
## A set of combined differential expression results.
##                         table deseq_sigup deseq_sigdown edger_sigup
## 1 Tumacofailure_vs_Tumacocure          13            19          11
##   edger_sigdown limma_sigup limma_sigdown
## 1            10           0             0
## `geom_line()`: Each group consists of only one observation.
## i Do you need to adjust the group aesthetic?
## Plot describing unique/shared genes in a differential expression table.

dim(t_cf_eosinophil_v1_sig_sva$deseq$ups[[1]])
## [1] 13 69
dim(t_cf_eosinophil_v1_sig_sva$deseq$downs[[1]])
## [1] 19 69
t_cf_eosinophil_v2_de_sva <- all_pairwise(tv2_eosinophils, model_batch = "svaseq", filter = TRUE)
## 
##    Tumaco_cure Tumaco_failure 
##              6              3
## Removing 0 low-count genes (10117 remaining).
## Setting 90 low elements to zero.
## transform_counts: Found 90 values equal to 0, adding 1 to the matrix.
t_cf_eosinophil_v2_de_sva
## A pairwise differential expression with results from: basic, deseq, ebseq, edger, limma, noiseq.
## This used a surrogate/batch estimate from: svaseq.
## The primary analysis performed 15 comparisons.
## The logFC agreement among the methods follows:
##                 Tmcflr_v_T
## limma_vs_deseq      0.8540
## limma_vs_edger      0.8581
## limma_vs_ebseq      0.7590
## limma_vs_basic      0.8937
## limma_vs_noiseq    -0.7844
## deseq_vs_edger      0.9996
## deseq_vs_ebseq      0.8803
## deseq_vs_basic      0.8446
## deseq_vs_noiseq    -0.8332
## edger_vs_ebseq      0.8816
## edger_vs_basic      0.8465
## edger_vs_noiseq    -0.8360
## ebseq_vs_basic      0.8616
## ebseq_vs_noiseq    -0.8954
## basic_vs_noiseq    -0.8616
t_cf_eosinophil_v2_tables_sva <- combine_de_tables(
  t_cf_eosinophil_v2_de_sva, keepers = cf_contrast,
  excel = glue("{cf_prefix}/Eosinophils/t_eosinophil_v2_cf_tables_sva-v{ver}.xlsx"))
t_cf_eosinophil_v2_tables_sva
## A set of combined differential expression results.
##                         table deseq_sigup deseq_sigdown edger_sigup
## 1 Tumacofailure_vs_Tumacocure           9             4          10
##   edger_sigdown limma_sigup limma_sigdown
## 1             1           0             0
## `geom_line()`: Each group consists of only one observation.
## i Do you need to adjust the group aesthetic?
## Plot describing unique/shared genes in a differential expression table.

t_cf_eosinophil_v2_sig_sva <- extract_significant_genes(
  t_cf_eosinophil_v2_tables_sva,
  excel = glue("{cf_prefix}/Eosinophils/t_eosinophil_v2_cf_sig_sva-v{ver}.xlsx"))
t_cf_eosinophil_v2_sig_sva
## A set of genes deemed significant according to limma, edger, deseq, ebseq, basic.
## The parameters defining significant were:
## LFC cutoff: 1 adj P cutoff: 0.05
##         limma_up limma_down edger_up edger_down deseq_up deseq_down ebseq_up
## outcome        0          0       10          1        9          4        9
##         ebseq_down basic_up basic_down
## outcome         17        0          0

dim(t_cf_eosinophil_v2_sig_sva$deseq$ups[[1]])
## [1]  9 69
dim(t_cf_eosinophil_v2_sig_sva$deseq$downs[[1]])
## [1]  4 69
t_cf_eosinophil_v3_de_sva <- all_pairwise(tv3_eosinophils, model_batch = "svaseq", filter = TRUE)
## 
##    Tumaco_cure Tumaco_failure 
##              6              3
## Removing 0 low-count genes (10080 remaining).
## Setting 48 low elements to zero.
## transform_counts: Found 48 values equal to 0, adding 1 to the matrix.
t_cf_eosinophil_v3_de_sva
## A pairwise differential expression with results from: basic, deseq, ebseq, edger, limma, noiseq.
## This used a surrogate/batch estimate from: svaseq.
## The primary analysis performed 15 comparisons.
## The logFC agreement among the methods follows:
##                 Tmcflr_v_T
## limma_vs_deseq      0.9137
## limma_vs_edger      0.9138
## limma_vs_ebseq      0.7984
## limma_vs_basic      0.8620
## limma_vs_noiseq    -0.7838
## deseq_vs_edger      1.0000
## deseq_vs_ebseq      0.8832
## deseq_vs_basic      0.8019
## deseq_vs_noiseq    -0.8252
## edger_vs_ebseq      0.8833
## edger_vs_basic      0.8021
## edger_vs_noiseq    -0.8258
## ebseq_vs_basic      0.8927
## ebseq_vs_noiseq    -0.9333
## basic_vs_noiseq    -0.8696
t_cf_eosinophil_v3_tables_sva <- combine_de_tables(
  t_cf_eosinophil_v3_de_sva, keepers = cf_contrast,
  excel = glue("{cf_prefix}/Eosinophils/t_eosinophil_v3_cf_tables_sva-v{ver}.xlsx"))
t_cf_eosinophil_v3_tables_sva
## A set of combined differential expression results.
##                         table deseq_sigup deseq_sigdown edger_sigup
## 1 Tumacofailure_vs_Tumacocure          68            29          73
##   edger_sigdown limma_sigup limma_sigdown
## 1            10           0             0
## `geom_line()`: Each group consists of only one observation.
## i Do you need to adjust the group aesthetic?
## Plot describing unique/shared genes in a differential expression table.

t_cf_eosinophil_v3_sig_sva <- extract_significant_genes(
  t_cf_eosinophil_v3_tables_sva,
  excel = glue("{cf_prefix}/Eosinophils/t_eosinophil_v3_cf_sig_sva-v{ver}.xlsx"))
t_cf_eosinophil_v3_sig_sva
## A set of genes deemed significant according to limma, edger, deseq, ebseq, basic.
## The parameters defining significant were:
## LFC cutoff: 1 adj P cutoff: 0.05
##         limma_up limma_down edger_up edger_down deseq_up deseq_down ebseq_up
## outcome        0          0       73         10       68         29        2
##         ebseq_down basic_up basic_down
## outcome          9        0          0

dim(t_cf_eosinophil_v3_sig_sva$deseq$ups[[1]])
## [1] 68 69
dim(t_cf_eosinophil_v3_sig_sva$deseq$downs[[1]])
## [1] 29 69
6.0.8.0.1 Gene set enrichment: gProfiler Eosinophils V1

Up: 13 genes, no hits. Down: 19 genes; 11 GO, 1 Reactome, 1 TF

t_cf_eosinophil_v1_sig_sva_gp <- all_gprofiler(t_cf_eosinophil_v1_sig_sva)
## Did not find the column:  in the significant genes.
## No results to show
## Please make sure that the organism is correct or set significant = FALSE
## No results to show
## Please make sure that the organism is correct or set significant = FALSE
## No results to show
## Please make sure that the organism is correct or set significant = FALSE
## No results to show
## Please make sure that the organism is correct or set significant = FALSE
## No results to show
## Please make sure that the organism is correct or set significant = FALSE
## No results to show
## Please make sure that the organism is correct or set significant = FALSE
## No results to show
## Please make sure that the organism is correct or set significant = FALSE
## No results to show
## Please make sure that the organism is correct or set significant = FALSE
## No results to show
## Please make sure that the organism is correct or set significant = FALSE
## Add a little logic here to use enrichplot::dotplot().
## Did not find the column:  in the significant genes.
## No results to show
## Please make sure that the organism is correct or set significant = FALSE
## No results to show
## Please make sure that the organism is correct or set significant = FALSE
## No results to show
## Please make sure that the organism is correct or set significant = FALSE
## No results to show
## Please make sure that the organism is correct or set significant = FALSE
## No results to show
## Please make sure that the organism is correct or set significant = FALSE
## No results to show
## Please make sure that the organism is correct or set significant = FALSE
## Add a little logic here to use enrichplot::dotplot().
t_cf_eosinophil_v1_sig_sva_gp
## Running gProfiler on every set of significant genes found:
##              GO KEGG REAC WP TF MIRNA HPA CORUM HP
## outcome_up    0    0    0  0  0     0   0     0  0
## outcome_down  9    0    1  0  1     0   0     0  0
written <- write_gprofiler_data(
  t_cf_eosinophil_v1_sig_sva_gp[["outcome_up"]],
  excel = glue("{xlsx_prefix}/Gene set enrichment/t_cf_eosinophil_v1_up-v{ver}.xlsx"))
## Warning: Workbook does not contain any worksheets. A worksheet will be added.
written <- write_gprofiler_data(
  t_cf_eosinophil_v1_sig_sva_gp[["outcome_down"]],
  excel = glue("{xlsx_prefix}/Gene set enrichment/t_cf_eosinophil_v1_down-v{ver}.xlsx"))
## `geom_line()`: Each group consists of only one observation.
## i Do you need to adjust the group aesthetic?
## `geom_line()`: Each group consists of only one observation.
## i Do you need to adjust the group aesthetic?
## `geom_line()`: Each group consists of only one observation.
## i Do you need to adjust the group aesthetic?
## `geom_line()`: Each group consists of only one observation.
## i Do you need to adjust the group aesthetic?
## `geom_line()`: Each group consists of only one observation.
## i Do you need to adjust the group aesthetic?
## `geom_line()`: Each group consists of only one observation.
## i Do you need to adjust the group aesthetic?
## `geom_line()`: Each group consists of only one observation.
## i Do you need to adjust the group aesthetic?
## `geom_line()`: Each group consists of only one observation.
## i Do you need to adjust the group aesthetic?
enrichplot::dotplot(t_cf_eosinophil_sig_sva_gp[["outcome_down"]][["GO_enrich"]])

enrichplot::dotplot(t_cf_eosinophil_sig_sva_gp[["outcome_down"]][["TF_enrich"]])

6.0.8.0.2 Gene set enrichment: gProfiler Eosinophils V2

Up: 9 genes; 23 GO, 2 KEGG, 2 Reactome, 4 WP Down: 4 genes; no hits

t_cf_eosinophil_v2_sig_sva_gp <- all_gprofiler(t_cf_eosinophil_v2_sig_sva)
## Did not find the column:  in the significant genes.
## No results to show
## Please make sure that the organism is correct or set significant = FALSE
## No results to show
## Please make sure that the organism is correct or set significant = FALSE
## No results to show
## Please make sure that the organism is correct or set significant = FALSE
## No results to show
## Please make sure that the organism is correct or set significant = FALSE
## No results to show
## Please make sure that the organism is correct or set significant = FALSE
## Add a little logic here to use enrichplot::dotplot().
## Did not find the column:  in the significant genes.
## No results to show
## Please make sure that the organism is correct or set significant = FALSE
## No results to show
## Please make sure that the organism is correct or set significant = FALSE
## No results to show
## Please make sure that the organism is correct or set significant = FALSE
## No results to show
## Please make sure that the organism is correct or set significant = FALSE
## No results to show
## Please make sure that the organism is correct or set significant = FALSE
## No results to show
## Please make sure that the organism is correct or set significant = FALSE
## No results to show
## Please make sure that the organism is correct or set significant = FALSE
## Add a little logic here to use enrichplot::dotplot().
t_cf_eosinophil_v2_sig_sva_gp
## Running gProfiler on every set of significant genes found:
##              GO KEGG REAC WP TF MIRNA HPA CORUM HP
## outcome_up   26    2    2  4  0     0   0     0  0
## outcome_down  1    0    0  1  0     0   0     0  0
written <- write_gprofiler_data(
  t_cf_eosinophil_v2_sig_sva_gp[["outcome_up"]],
  excel = glue("{xlsx_prefix}/Gene set enrichment/t_cf_eosinophil_v2_up-v{ver}.xlsx"))
written <- write_gprofiler_data(
  t_cf_eosinophil_v2_sig_sva_gp[["outcome_down"]],
  excel = glue("{xlsx_prefix}/Gene set enrichment/t_cf_eosinophil_v2_down-v{ver}.xlsx"))
## `geom_line()`: Each group consists of only one observation.
## i Do you need to adjust the group aesthetic?
## `geom_line()`: Each group consists of only one observation.
## i Do you need to adjust the group aesthetic?
## `geom_line()`: Each group consists of only one observation.
## i Do you need to adjust the group aesthetic?
## `geom_line()`: Each group consists of only one observation.
## i Do you need to adjust the group aesthetic?
enrichplot::dotplot(t_cf_eosinophil_sig_sva_gp[["outcome_up"]][["GO_enrich"]])

enrichplot::dotplot(t_cf_eosinophil_sig_sva_gp[["outcome_up"]][["WP_enrich"]])

6.0.8.1 gProfiler: Eosinophils V3

Up: 68 genes; 95 GO, 2 KEGG, 12 Reactome, 3 WP, 63 TF, 1 miRNA Down: 29 genes; 3 GO, 1 WP, 1 TF, 3 miRNA

t_cf_eosinophil_v3_sig_sva_gp <- all_gprofiler(t_cf_eosinophil_v3_sig_sva)
## Did not find the column:  in the significant genes.
## No results to show
## Please make sure that the organism is correct or set significant = FALSE
## No results to show
## Please make sure that the organism is correct or set significant = FALSE
## No results to show
## Please make sure that the organism is correct or set significant = FALSE
## Add a little logic here to use enrichplot::dotplot().
## Did not find the column:  in the significant genes.
## No results to show
## Please make sure that the organism is correct or set significant = FALSE
## No results to show
## Please make sure that the organism is correct or set significant = FALSE
## No results to show
## Please make sure that the organism is correct or set significant = FALSE
## No results to show
## Please make sure that the organism is correct or set significant = FALSE
## Add a little logic here to use enrichplot::dotplot().
t_cf_eosinophil_v3_sig_sva_gp
## Running gProfiler on every set of significant genes found:
##               GO KEGG REAC WP TF MIRNA HPA CORUM HP
## outcome_up   113    2   15  3 64     1   0     0  0
## outcome_down   3    0    0  1  1     3   0     0  1
written <- write_gprofiler_data(
  t_cf_eosinophil_v3_sig_sva_gp[["outcome_up"]],
  excel = glue("{xlsx_prefix}/Gene set enrichment/t_cf_eosinophil_v3_up-v{ver}.xlsx"))
## `geom_line()`: Each group consists of only one observation.
## i Do you need to adjust the group aesthetic?
## `geom_line()`: Each group consists of only one observation.
## i Do you need to adjust the group aesthetic?
## `geom_line()`: Each group consists of only one observation.
## i Do you need to adjust the group aesthetic?
## `geom_line()`: Each group consists of only one observation.
## i Do you need to adjust the group aesthetic?
written <- write_gprofiler_data(
  t_cf_eosinophil_v3_sig_sva_gp[["outcome_down"]],
  excel = glue("{xlsx_prefix}/Gene set enrichment/t_cf_eosinophil_v3_down-v{ver}.xlsx"))
## `geom_line()`: Each group consists of only one observation.
## i Do you need to adjust the group aesthetic?
## `geom_line()`: Each group consists of only one observation.
## i Do you need to adjust the group aesthetic?
## `geom_line()`: Each group consists of only one observation.
## i Do you need to adjust the group aesthetic?
## `geom_line()`: Each group consists of only one observation.
## i Do you need to adjust the group aesthetic?
## `geom_line()`: Each group consists of only one observation.
## i Do you need to adjust the group aesthetic?
## `geom_line()`: Each group consists of only one observation.
## i Do you need to adjust the group aesthetic?
## `geom_line()`: Each group consists of only one observation.
## i Do you need to adjust the group aesthetic?
## `geom_line()`: Each group consists of only one observation.
## i Do you need to adjust the group aesthetic?
## `geom_line()`: Each group consists of only one observation.
## i Do you need to adjust the group aesthetic?
## `geom_line()`: Each group consists of only one observation.
## i Do you need to adjust the group aesthetic?
## `geom_line()`: Each group consists of only one observation.
## i Do you need to adjust the group aesthetic?
## `geom_line()`: Each group consists of only one observation.
## i Do you need to adjust the group aesthetic?
enrichplot::dotplot(t_cf_eosinophil_sig_sva_gp[["outcome_up"]][["GO_enrich"]])

enrichplot::dotplot(t_cf_eosinophil_sig_sva_gp[["outcome_up"]][["WP_enrich"]])

6.0.8.2 Eosinophils: Compare sva to batch-in-visit

sva_aucc <- calculate_aucc(t_cf_eosinophil_tables_sva[["data"]][[1]],
                           tbl2 = t_cf_eosinophil_tables_batchvisit[["data"]][[1]],
                           py = "deseq_adjp", ly = "deseq_logfc")
sva_aucc
## These two tables have an aucc value of: 0.575992158061818 and correlation:
## 
##  Pearson's product-moment correlation
## 
## data:  tbl[[lx]] and tbl[[ly]]
## t = 152, df = 10530, p-value <2e-16
## alternative hypothesis: true correlation is not equal to 0
## 95 percent confidence interval:
##  0.8232 0.8351
## sample estimates:
##    cor 
## 0.8292

shared_ids <- rownames(t_cf_eosinophil_tables_sva[["data"]][[1]]) %in%
  rownames(t_cf_eosinophil_tables_batchvisit[["data"]][[1]])
first <- t_cf_eosinophil_tables_sva[["data"]][[1]][shared_ids, ]
second <- t_cf_eosinophil_tables_batchvisit[["data"]][[1]][rownames(first), ]
cor.test(first[["deseq_logfc"]], second[["deseq_logfc"]])
## 
##  Pearson's product-moment correlation
## 
## data:  first[["deseq_logfc"]] and second[["deseq_logfc"]]
## t = 152, df = 10530, p-value <2e-16
## alternative hypothesis: true correlation is not equal to 0
## 95 percent confidence interval:
##  0.8232 0.8351
## sample estimates:
##    cor 
## 0.8292

6.0.8.3 Compare monocyte CF, neutrophil CF, eosinophil CF

t_mono_neut_sva_aucc <- calculate_aucc(t_cf_monocyte_tables_sva[["data"]][["outcome"]],
                                       tbl2 = t_cf_neutrophil_tables_sva[["data"]][["outcome"]],
                                       py = "deseq_adjp", ly = "deseq_logfc")
t_mono_neut_sva_aucc
## These two tables have an aucc value of: 0.204260579576817 and correlation:
## 
##  Pearson's product-moment correlation
## 
## data:  tbl[[lx]] and tbl[[ly]]
## t = 43, df = 8577, p-value <2e-16
## alternative hypothesis: true correlation is not equal to 0
## 95 percent confidence interval:
##  0.4028 0.4376
## sample estimates:
##    cor 
## 0.4204

t_mono_eo_sva_aucc <- calculate_aucc(t_cf_monocyte_tables_sva[["data"]][["outcome"]],
                                     tbl2 = t_cf_eosinophil_tables_sva[["data"]][["outcome"]],
                                     py = "deseq_adjp", ly = "deseq_logfc")
t_mono_eo_sva_aucc
## These two tables have an aucc value of: 0.0963272498511824 and correlation:
## 
##  Pearson's product-moment correlation
## 
## data:  tbl[[lx]] and tbl[[ly]]
## t = 22, df = 9765, p-value <2e-16
## alternative hypothesis: true correlation is not equal to 0
## 95 percent confidence interval:
##  0.2016 0.2393
## sample estimates:
##    cor 
## 0.2206

t_neut_eo_sva_aucc <- calculate_aucc(t_cf_neutrophil_tables_sva[["data"]][["outcome"]],
                                     tbl2 = t_cf_eosinophil_tables_sva[["data"]][["outcome"]],
                                     py = "deseq_adjp", ly = "deseq_logfc")
t_neut_eo_sva_aucc
## These two tables have an aucc value of: 0.201619581335336 and correlation:
## 
##  Pearson's product-moment correlation
## 
## data:  tbl[[lx]] and tbl[[ly]]
## t = 42, df = 8571, p-value <2e-16
## alternative hypothesis: true correlation is not equal to 0
## 95 percent confidence interval:
##  0.3974 0.4324
## sample estimates:
##    cor 
## 0.4151

6.0.9 By visit

For these contrasts, we want to see fail_v1 vs. cure_v1, fail_v2 vs. cure_v2 etc. As a result, we will need to juggle the data slightly and add another set of contrasts.

6.0.9.1 Cure/Fail by visits, all cell types

t_visit_cf_all_de_sva <- all_pairwise(t_visitcf, model_batch = "svaseq", filter = TRUE)
## 
##    v1cure v1failure    v2cure v2failure    v3cure v3failure 
##        30        24        20        15        17        17
## Removing 0 low-count genes (14156 remaining).
## Setting 17161 low elements to zero.
## transform_counts: Found 17161 values equal to 0, adding 1 to the matrix.
t_visit_cf_all_de_sva
## A pairwise differential expression with results from: basic, deseq, edger, limma, noiseq.
## This used a surrogate/batch estimate from: svaseq.
## The primary analysis performed 10 comparisons.
t_visit_cf_all_tables_sva <- combine_de_tables(
  t_visit_cf_all_de_sva, keepers = visitcf_contrasts,
  excel = glue("{cf_prefix}/t_all_visitcf_tables_sva-v{ver}.xlsx"))
t_visit_cf_all_tables_sva
## A set of combined differential expression results.
##                 table deseq_sigup deseq_sigdown edger_sigup edger_sigdown
## 1 v1failure_vs_v1cure          26            82          26            58
## 2 v2failure_vs_v2cure          51            41          43            28
## 3 v3failure_vs_v3cure          77            32          33            25
##   limma_sigup limma_sigdown
## 1           9            17
## 2           3             0
## 3           3             0
## Plot describing unique/shared genes in a differential expression table.

t_visit_cf_all_sig_sva <- extract_significant_genes(
  t_visit_cf_all_tables_sva,
  excel = glue("{cf_prefix}/t_all_visitcf_sig_sva-v{ver}.xlsx"))
t_visit_cf_all_sig_sva
## A set of genes deemed significant according to limma, edger, deseq, basic.
## The parameters defining significant were:
## LFC cutoff: 1 adj P cutoff: 0.05
##      limma_up limma_down edger_up edger_down deseq_up deseq_down basic_up
## v1cf        9         17       26         58       26         82        0
## v2cf        3          0       43         28       51         41        0
## v3cf        3          0       33         25       77         32        0
##      basic_down
## v1cf          0
## v2cf          0
## v3cf          0

6.0.9.1.1 Gene set enrichment: Tumaco all samples C/F

I am adding every gprofiler call to this document, but I have a strong feeling that this one is redundant.

t_visit_cf_all_gp <- all_gprofiler(t_visit_cf_all_sig_sva)
## Did not find the column:  in the significant genes.
## No results to show
## Please make sure that the organism is correct or set significant = FALSE
## No results to show
## Please make sure that the organism is correct or set significant = FALSE
## No results to show
## Please make sure that the organism is correct or set significant = FALSE
## No results to show
## Please make sure that the organism is correct or set significant = FALSE
## No results to show
## Please make sure that the organism is correct or set significant = FALSE
## No results to show
## Please make sure that the organism is correct or set significant = FALSE
## No results to show
## Please make sure that the organism is correct or set significant = FALSE
## Add a little logic here to use enrichplot::dotplot().
## Did not find the column:  in the significant genes.
## No results to show
## Please make sure that the organism is correct or set significant = FALSE
## No results to show
## Please make sure that the organism is correct or set significant = FALSE
## No results to show
## Please make sure that the organism is correct or set significant = FALSE
## No results to show
## Please make sure that the organism is correct or set significant = FALSE
## Add a little logic here to use enrichplot::dotplot().
## Did not find the column:  in the significant genes.
## No results to show
## Please make sure that the organism is correct or set significant = FALSE
## No results to show
## Please make sure that the organism is correct or set significant = FALSE
## No results to show
## Please make sure that the organism is correct or set significant = FALSE
## Add a little logic here to use enrichplot::dotplot().
## Did not find the column:  in the significant genes.
## No results to show
## Please make sure that the organism is correct or set significant = FALSE
## No results to show
## Please make sure that the organism is correct or set significant = FALSE
## No results to show
## Please make sure that the organism is correct or set significant = FALSE
## No results to show
## Please make sure that the organism is correct or set significant = FALSE
## Add a little logic here to use enrichplot::dotplot().
## Did not find the column:  in the significant genes.
## No results to show
## Please make sure that the organism is correct or set significant = FALSE
## No results to show
## Please make sure that the organism is correct or set significant = FALSE
## No results to show
## Please make sure that the organism is correct or set significant = FALSE
## No results to show
## Please make sure that the organism is correct or set significant = FALSE
## No results to show
## Please make sure that the organism is correct or set significant = FALSE
## Add a little logic here to use enrichplot::dotplot().
## Did not find the column:  in the significant genes.
## No results to show
## Please make sure that the organism is correct or set significant = FALSE
## No results to show
## Please make sure that the organism is correct or set significant = FALSE
## No results to show
## Please make sure that the organism is correct or set significant = FALSE
## No results to show
## Please make sure that the organism is correct or set significant = FALSE
## No results to show
## Please make sure that the organism is correct or set significant = FALSE
## Add a little logic here to use enrichplot::dotplot().
t_visit_cf_all_gp
## Running gProfiler on every set of significant genes found:
##           GO KEGG REAC WP TF MIRNA HPA CORUM HP
## v1cf_up    5    0    0  0  2     0   0     0  0
## v1cf_down 40    0    4  2  0     1   1     0  0
## v2cf_up   66    1    4  4 40     3   0     0  0
## v2cf_down 35    0    1  2  2     0   0     0  2
## v3cf_up   26    0    5  0 11     0   1     0  0
## v3cf_down  8    1    0  0  0     4   0     0  2

6.0.9.2 Cure/Fail by visit, Monocytes

visitcf_factor <- paste0("v", pData(t_monocytes)[["visitnumber"]], "_",
                         pData(t_monocytes)[["finaloutcome"]])
t_monocytes_visitcf <- set_expt_conditions(t_monocytes, fact = visitcf_factor)
## The numbers of samples by condition are:
## 
##    v1_cure v1_failure    v2_cure v2_failure    v3_cure v3_failure 
##          8          8          7          6          6          7
t_visit_cf_monocyte_de_sva <- all_pairwise(t_monocytes_visitcf, model_batch = "svaseq",
                                           filter = TRUE)
## 
##    v1_cure v1_failure    v2_cure v2_failure    v3_cure v3_failure 
##          8          8          7          6          6          7
## Removing 0 low-count genes (10862 remaining).
## Setting 700 low elements to zero.
## transform_counts: Found 700 values equal to 0, adding 1 to the matrix.
t_visit_cf_monocyte_de_sva
## A pairwise differential expression with results from: basic, deseq, edger, limma, noiseq.
## This used a surrogate/batch estimate from: svaseq.
## The primary analysis performed 10 comparisons.
t_visit_cf_monocyte_tables_sva <- combine_de_tables(
  t_visit_cf_monocyte_de_sva, keepers = visitcf_contrasts,
  excel = glue("{cf_prefix}/Monocytes/t_monocyte_visitcf_tables_sva-v{ver}.xlsx"))
t_visit_cf_monocyte_tables_sva
## A set of combined differential expression results.
##                 table deseq_sigup deseq_sigdown edger_sigup edger_sigdown
## 1 v1failure_vs_v1cure          15            10          10            13
## 2 v2failure_vs_v2cure           0             0           0             0
## 3 v3failure_vs_v3cure           0             0           0             0
##   limma_sigup limma_sigdown
## 1           1             1
## 2           0             0
## 3           0             0
## `geom_line()`: Each group consists of only one observation.
## i Do you need to adjust the group aesthetic?
## Plot describing unique/shared genes in a differential expression table.

t_visit_cf_monocyte_sig_sva <- extract_significant_genes(
  t_visit_cf_monocyte_tables_sva,
  excel = glue("{cf_prefix}/Monocytes/t_monocyte_visitcf_sig_sva-v{ver}.xlsx"))
t_visit_cf_monocyte_sig_sva
## A set of genes deemed significant according to limma, edger, deseq, basic.
## The parameters defining significant were:
## LFC cutoff: 1 adj P cutoff: 0.05
##      limma_up limma_down edger_up edger_down deseq_up deseq_down basic_up
## v1cf        1          1       10         13       15         10        0
## v2cf        0          0        0          0        0          0        0
## v3cf        0          0        0          0        0          0        0
##      basic_down
## v1cf          0
## v2cf          0
## v3cf          0

t_v1fc_deseq_ma <- t_visit_cf_monocyte_tables_sva[["plots"]][["v1cf"]][["deseq_ma_plots"]][["plot"]]
dev <- pp(file = "images/monocyte_cf_de_v1_maplot.png")
t_v1fc_deseq_ma
## NULL
closed <- dev.off()
t_v1fc_deseq_ma
## NULL
t_v2fc_deseq_ma <- t_visit_cf_monocyte_tables_sva[["plots"]][["v2cf"]][["deseq_ma_plots"]][["plot"]]
dev <- pp(file = "images/monocyte_cf_de_v2_maplot.png")
t_v2fc_deseq_ma
## NULL
closed <- dev.off()
t_v2fc_deseq_ma
## NULL
t_v3fc_deseq_ma <- t_visit_cf_monocyte_tables_sva[["plots"]][["v3cf"]][["deseq_ma_plots"]][["plot"]]
dev <- pp(file = "images/monocyte_cf_de_v3_maplot.png")
t_v3fc_deseq_ma
## NULL
closed <- dev.off()
t_v3fc_deseq_ma
## NULL

One query from Alejandro is to look at the genes shared up/down across visits. I am not entirely certain we have enough samples for this to work, but let us find out.

I am thinking this is a good place to use the AUCC curves I learned about thanks to Julie Cridland.

Note that the following is all monocyte samples, this should therefore potentially be moved up and a version of this with only the Tumaco samples put here?

v1cf <- t_visit_cf_monocyte_tables_sva[["data"]][["v1cf"]]
v2cf <- t_visit_cf_monocyte_tables_sva[["data"]][["v2cf"]]
v3cf <- t_visit_cf_monocyte_tables_sva[["data"]][["v3cf"]]

v1_sig <- c(
  rownames(t_visit_cf_monocyte_sig_sva[["deseq"]][["ups"]][["v1cf"]]),
  rownames(t_visit_cf_monocyte_sig_sva[["deseq"]][["downs"]][["v1cf"]]))
length(v1_sig)
## [1] 25
v2_sig <- c(
  rownames(t_visit_cf_monocyte_sig_sva[["deseq"]][["ups"]][["v2cf"]]),
  rownames(t_visit_cf_monocyte_sig_sva[["deseq"]][["downs"]][["v2cf"]]))
length(v2_sig)
## [1] 0
v3_sig <- c(
  rownames(t_visit_cf_monocyte_sig_sva[["deseq"]][["ups"]][["v2cf"]]),
  rownames(t_visit_cf_monocyte_sig_sva[["deseq"]][["downs"]][["v2cf"]]))
length(v3_sig)
## [1] 0
t_monocyte_visit_aucc_v2v1 <- calculate_aucc(v1cf, tbl2 = v2cf,
                                             py = "deseq_adjp", ly = "deseq_logfc")
dev <- pp(file = "images/monocyte_visit_v2v1_aucc.png")
t_monocyte_visit_aucc_v2v1[["plot"]]
closed <- dev.off()
t_monocyte_visit_aucc_v2v1[["plot"]]

t_monocyte_visit_aucc_v3v1 <- calculate_aucc(v1cf, tbl2 = v3cf,
                                             py = "deseq_adjp", ly = "deseq_logfc")
dev <- pp(file = "images/monocyte_visit_v3v1_aucc.png")
t_monocyte_visit_aucc_v3v1[["plot"]]
closed <- dev.off()
t_monocyte_visit_aucc_v3v1[["plot"]]

6.0.9.3 Cure/Fail by visit, Neutrophils

visitcf_factor <- paste0("v", pData(t_neutrophils)[["visitnumber"]], "_",
                         pData(t_neutrophils)[["finaloutcome"]])
t_neutrophil_visitcf <- set_expt_conditions(t_neutrophils, fact = visitcf_factor)
## The numbers of samples by condition are:
## 
##    v1_cure v1_failure    v2_cure v2_failure    v3_cure v3_failure 
##          8          8          7          6          5          7
t_visit_cf_neutrophil_de_sva <- all_pairwise(t_neutrophil_visitcf, model_batch = "svaseq",
                                             filter = TRUE)
## 
##    v1_cure v1_failure    v2_cure v2_failure    v3_cure v3_failure 
##          8          8          7          6          5          7
## Removing 0 low-count genes (9101 remaining).
## Setting 685 low elements to zero.
## transform_counts: Found 685 values equal to 0, adding 1 to the matrix.
t_visit_cf_neutrophil_de_sva
## A pairwise differential expression with results from: basic, deseq, edger, limma, noiseq.
## This used a surrogate/batch estimate from: svaseq.
## The primary analysis performed 10 comparisons.
t_visit_cf_neutrophil_tables_sva <- combine_de_tables(
  t_visit_cf_neutrophil_de_sva, keepers = visitcf_contrasts,
  excel = glue("{cf_prefix}/Neutrophils/t_neutrophil_visitcf_tables_sva-v{ver}.xlsx"))
## Deleting the file analyses/4_tumaco/DE_Cure_vs_Fail/Neutrophils/t_neutrophil_visitcf_tables_sva-v202406.xlsx before writing the tables.
t_visit_cf_neutrophil_tables_sva
## A set of combined differential expression results.
##                 table deseq_sigup deseq_sigdown edger_sigup edger_sigdown
## 1 v1failure_vs_v1cure          12             6           6             6
## 2 v2failure_vs_v2cure           2             6           2             3
## 3 v3failure_vs_v3cure           2             2           0             2
##   limma_sigup limma_sigdown
## 1           1             0
## 2           0             0
## 3           0             0
## Plot describing unique/shared genes in a differential expression table.

t_visit_cf_neutrophil_sig_sva <- extract_significant_genes(
  t_visit_cf_neutrophil_tables_sva,
  excel = glue("{cf_prefix}/Neutrophils/t_neutrophil_visitcf_sig_sva-v{ver}.xlsx"))
## Deleting the file analyses/4_tumaco/DE_Cure_vs_Fail/Neutrophils/t_neutrophil_visitcf_sig_sva-v202406.xlsx before writing the tables.
t_visit_cf_neutrophil_sig_sva
## A set of genes deemed significant according to limma, edger, deseq, basic.
## The parameters defining significant were:
## LFC cutoff: 1 adj P cutoff: 0.05
##      limma_up limma_down edger_up edger_down deseq_up deseq_down basic_up
## v1cf        1          0        6          6       12          6        0
## v2cf        0          0        2          3        2          6        0
## v3cf        0          0        0          2        2          2        0
##      basic_down
## v1cf          0
## v2cf          0
## v3cf          0

6.0.9.4 Cure/Fail by visit, Eosinophils

visitcf_factor <- paste0("v", pData(t_eosinophils)[["visitnumber"]], "_",
                         pData(t_eosinophils)[["finaloutcome"]])
t_eosinophil_visitcf <- set_expt_conditions(t_eosinophils, fact = visitcf_factor)
## The numbers of samples by condition are:
## 
##    v1_cure v1_failure    v2_cure v2_failure    v3_cure v3_failure 
##          5          3          6          3          6          3
t_visit_cf_eosinophil_de_sva <- all_pairwise(t_eosinophil_visitcf, model_batch = "svaseq",
                                             filter = TRUE)
## 
##    v1_cure v1_failure    v2_cure v2_failure    v3_cure v3_failure 
##          5          3          6          3          6          3
## Removing 0 low-count genes (10532 remaining).
## Setting 373 low elements to zero.
## transform_counts: Found 373 values equal to 0, adding 1 to the matrix.
t_visit_cf_eosinophil_de_sva
## A pairwise differential expression with results from: basic, deseq, edger, limma, noiseq.
## This used a surrogate/batch estimate from: svaseq.
## The primary analysis performed 10 comparisons.
t_visit_cf_eosinophil_tables_sva <- combine_de_tables(
  t_visit_cf_eosinophil_de_sva, keepers = visitcf_contrasts,
  excel = glue("{cf_prefix}/Eosinophils/t_eosinophil_visitcf_tables_sva-v{ver}.xlsx"))
## Deleting the file analyses/4_tumaco/DE_Cure_vs_Fail/Eosinophils/t_eosinophil_visitcf_tables_sva-v202406.xlsx before writing the tables.
t_visit_cf_eosinophil_tables_sva
## A set of combined differential expression results.
##                 table deseq_sigup deseq_sigdown edger_sigup edger_sigdown
## 1 v1failure_vs_v1cure           9            11           2             3
## 2 v2failure_vs_v2cure           4             3           5             2
## 3 v3failure_vs_v3cure          14             7          17             2
##   limma_sigup limma_sigdown
## 1           0             1
## 2           0             0
## 3           0             0
## Plot describing unique/shared genes in a differential expression table.

t_visit_cf_eosinophil_sig_sva <- extract_significant_genes(
  t_visit_cf_eosinophil_tables_sva,
  excel = glue("{cf_prefix}/Eosinophils/t_eosinophil_visitcf_sig_sva-v{ver}.xlsx"))
## Deleting the file analyses/4_tumaco/DE_Cure_vs_Fail/Eosinophils/t_eosinophil_visitcf_sig_sva-v202406.xlsx before writing the tables.
t_visit_cf_eosinophil_sig_sva
## A set of genes deemed significant according to limma, edger, deseq, basic.
## The parameters defining significant were:
## LFC cutoff: 1 adj P cutoff: 0.05
##      limma_up limma_down edger_up edger_down deseq_up deseq_down basic_up
## v1cf        0          1        2          3        9         11        0
## v2cf        0          0        5          2        4          3        0
## v3cf        0          0       17          2       14          7        0
##      basic_down
## v1cf          0
## v2cf          0
## v3cf          0

6.1 Persistence in visit 3

Having put some SL read mapping information in the sample sheet, Maria Adelaida added a new column using it with the putative persistence state on a per-sample basis. One question which arised from that: what differences are observable between the persistent yes vs. no samples on a per-cell-type basis among the visit 3 samples.

6.1.1 Setting up

First things first, create the datasets.

persistence_expt <- subset_expt(t_clinical, subset = "persistence=='Y'|persistence=='N'") %>%
  subset_expt(subset = 'visitnumber==3') %>%
  set_expt_conditions(fact = 'persistence')
## The samples excluded are: TMRC30016, TMRC30017, TMRC30018, TMRC30019, TMRC30020, TMRC30094, TMRC30082, TMRC30022, TMRC30093, TMRC30029, TMRC30032, TMRC30083, TMRC30028, TMRC30118, TMRC30014, TMRC30196, TMRC30030, TMRC30021, TMRC30026, TMRC30037, TMRC30031, TMRC30027, TMRC30044, TMRC30194, TMRC30195, TMRC30045, TMRC30191, TMRC30041, TMRC30171, TMRC30192, TMRC30042, TMRC30072, TMRC30043, TMRC30241, TMRC30237, TMRC30238, TMRC30074, TMRC30077, TMRC30264, TMRC30265.
## subset_expt(): There were 123, now there are 83 samples.
## The samples excluded are: TMRC30071, TMRC30056, TMRC30113, TMRC30058, TMRC30080, TMRC30119, TMRC30103, TMRC30107, TMRC30096, TMRC30180, TMRC30165, TMRC30166, TMRC30048, TMRC30054, TMRC30046, TMRC30049, TMRC30047, TMRC30053, TMRC30158, TMRC30132, TMRC30157, TMRC30167, TMRC30123, TMRC30181, TMRC30116, TMRC30184, TMRC30076, TMRC30159, TMRC30129, TMRC30134, TMRC30174, TMRC30137, TMRC30142, TMRC30175, TMRC30143, TMRC30168, TMRC30197, TMRC30182, TMRC30199, TMRC30198, TMRC30200, TMRC30203, TMRC30204, TMRC30152, TMRC30177, TMRC30155, TMRC30154, TMRC30207, TMRC30217, TMRC30208, TMRC30218, TMRC30135, TMRC30144.
## subset_expt(): There were 83, now there are 30 samples.
## The numbers of samples by condition are:
## 
##  N  Y 
##  6 24
## persistence_biopsy <- subset_expt(persistence_expt, subset = "typeofcells=='biopsy'")
persistence_monocyte <- subset_expt(persistence_expt, subset = "typeofcells=='monocytes'")
## The samples excluded are: TMRC30164, TMRC30122, TMRC30170, TMRC30121, TMRC30070, TMRC30068, TMRC30160, TMRC30133, TMRC30088, TMRC30161, TMRC30146, TMRC30202, TMRC30206, TMRC30136, TMRC30079, TMRC30220, TMRC30173, TMRC30147.
## subset_expt(): There were 30, now there are 12 samples.
persistence_neutrophil <- subset_expt(persistence_expt, subset = "typeofcells=='neutrophils'")
## The samples excluded are: TMRC30105, TMRC30164, TMRC30122, TMRC30169, TMRC30115, TMRC30070, TMRC30055, TMRC30139, TMRC30183, TMRC30078, TMRC30172, TMRC30161, TMRC30145, TMRC30201, TMRC30205, TMRC30136, TMRC30219, TMRC30079, TMRC30173, TMRC30147.
## subset_expt(): There were 30, now there are 10 samples.
persistence_eosinophil <- subset_expt(persistence_expt, subset = "typeofcells=='eosinophils'")
## The samples excluded are: TMRC30105, TMRC30169, TMRC30170, TMRC30115, TMRC30121, TMRC30055, TMRC30068, TMRC30139, TMRC30160, TMRC30183, TMRC30133, TMRC30078, TMRC30088, TMRC30172, TMRC30145, TMRC30146, TMRC30201, TMRC30202, TMRC30205, TMRC30206, TMRC30219, TMRC30220.
## subset_expt(): There were 30, now there are 8 samples.

6.1.2 Take a look

See if there are any patterns which look usable.

## All
persistence_norm <- normalize_expt(persistence_expt, transform = "log2", convert = "cpm",
                                   norm = "quant", filter = TRUE)
## Removing 8563 low-count genes (11389 remaining).
## transform_counts: Found 15 values equal to 0, adding 1 to the matrix.
plot_pca(persistence_norm)$plot

persistence_nb <- normalize_expt(persistence_expt, transform = "log2", convert = "cpm",
                                 batch = "svaseq", filter = TRUE)
## Removing 8563 low-count genes (11389 remaining).
## Setting 1544 low elements to zero.
## transform_counts: Found 1544 values equal to 0, adding 1 to the matrix.
plot_pca(persistence_nb)$plot

## Biopsies
##persistence_biopsy_norm <- normalize_expt(persistence_biopsy, transform = "log2", convert = "cpm",
##                                   norm = "quant", filter = TRUE)
##plot_pca(persistence_biopsy_norm)$plot
## Insufficient data

## Monocytes
persistence_monocyte_norm <- normalize_expt(persistence_monocyte, transform = "log2", convert = "cpm",
                                            norm = "quant", filter = TRUE)
## Removing 9623 low-count genes (10329 remaining).
## transform_counts: Found 1 values equal to 0, adding 1 to the matrix.
plot_pca(persistence_monocyte_norm)$plot

persistence_monocyte_nb <- normalize_expt(persistence_monocyte, transform = "log2", convert = "cpm",
                                          batch = "svaseq", filter = TRUE)
## Removing 9623 low-count genes (10329 remaining).
## Setting 47 low elements to zero.
## transform_counts: Found 47 values equal to 0, adding 1 to the matrix.
plot_pca(persistence_monocyte_nb)$plot

## Neutrophils
persistence_neutrophil_norm <- normalize_expt(persistence_neutrophil, transform = "log2", convert = "cpm",
                                              norm = "quant", filter = TRUE)
## Removing 11558 low-count genes (8394 remaining).
## transform_counts: Found 2 values equal to 0, adding 1 to the matrix.
plot_pca(persistence_neutrophil_norm)$plot

persistence_neutrophil_nb <- normalize_expt(persistence_neutrophil, transform = "log2", convert = "cpm",
                                            batch = "svaseq", filter = TRUE)
## Removing 11558 low-count genes (8394 remaining).
## Setting 46 low elements to zero.
## transform_counts: Found 46 values equal to 0, adding 1 to the matrix.
plot_pca(persistence_neutrophil_nb)$plot

## Eosinophils
persistence_eosinophil_norm <- normalize_expt(persistence_eosinophil, transform = "log2", convert = "cpm",
                                              norm = "quant", filter = TRUE)
## Removing 9922 low-count genes (10030 remaining).
## transform_counts: Found 1 values equal to 0, adding 1 to the matrix.
plot_pca(persistence_eosinophil_norm)$plot

persistence_eosinophil_nb <- normalize_expt(persistence_eosinophil, transform = "log2", convert = "cpm",
                                            batch = "svaseq", filter = TRUE)
## Removing 9922 low-count genes (10030 remaining).
## Setting 25 low elements to zero.
## transform_counts: Found 25 values equal to 0, adding 1 to the matrix.
plot_pca(persistence_eosinophil_nb)$plot

6.1.3 persistence DE

persistence_de_sva <- all_pairwise(persistence_expt, filter = TRUE, model_batch = "svaseq")
## 
##  N  Y 
##  6 24
## Removing 0 low-count genes (11389 remaining).
## Setting 1544 low elements to zero.
## transform_counts: Found 1544 values equal to 0, adding 1 to the matrix.
persistence_de_sva
## A pairwise differential expression with results from: basic, deseq, ebseq, edger, limma, noiseq.
## This used a surrogate/batch estimate from: svaseq.
## The primary analysis performed 15 comparisons.
## The logFC agreement among the methods follows:
##                  Y_vs_N
## limma_vs_deseq   0.8111
## limma_vs_edger   0.8765
## limma_vs_ebseq   0.7876
## limma_vs_basic   0.8218
## limma_vs_noiseq -0.6444
## deseq_vs_edger   0.9605
## deseq_vs_ebseq   0.7777
## deseq_vs_basic   0.7178
## deseq_vs_noiseq -0.5868
## edger_vs_ebseq   0.7900
## edger_vs_basic   0.7791
## edger_vs_noiseq -0.6433
## ebseq_vs_basic   0.7451
## ebseq_vs_noiseq -0.7651
## basic_vs_noiseq -0.7960
persistence_table_sva <- combine_de_tables(
  persistence_de_sva,
  excel = glue("{xlsx_prefix}/DE_Persistence/persistence_all_de_sva-v{ver}.xlsx"))
persistence_table_sva
## A set of combined differential expression results.
##    table deseq_sigup deseq_sigdown edger_sigup edger_sigdown limma_sigup
## 1 Y_vs_N          55            44          26            49           7
##   limma_sigdown
## 1            22
## `geom_line()`: Each group consists of only one observation.
## i Do you need to adjust the group aesthetic?
## Plot describing unique/shared genes in a differential expression table.

persistence_monocyte_de_sva <- all_pairwise(persistence_monocyte, filter = TRUE, model_batch = "svaseq")
## 
##  N  Y 
##  2 10
## Removing 0 low-count genes (10329 remaining).
## Setting 47 low elements to zero.
## transform_counts: Found 47 values equal to 0, adding 1 to the matrix.
persistence_monocyte_de_sva
## A pairwise differential expression with results from: basic, deseq, ebseq, edger, limma, noiseq.
## This used a surrogate/batch estimate from: svaseq.
## The primary analysis performed 15 comparisons.
## The logFC agreement among the methods follows:
##                  Y_vs_N
## limma_vs_deseq   0.9260
## limma_vs_edger   0.9270
## limma_vs_ebseq   0.9239
## limma_vs_basic   0.9858
## limma_vs_noiseq -0.9013
## deseq_vs_edger   1.0000
## deseq_vs_ebseq   0.9808
## deseq_vs_basic   0.9237
## deseq_vs_noiseq -0.9181
## edger_vs_ebseq   0.9809
## edger_vs_basic   0.9245
## edger_vs_noiseq -0.9193
## ebseq_vs_basic   0.9209
## ebseq_vs_noiseq -0.9275
## basic_vs_noiseq -0.9039
persistence_monocyte_table_sva <- combine_de_tables(
  persistence_monocyte_de_sva,
  excel = glue("{xlsx_prefix}/DE_Persistence/persistence_monocyte_de_sva-v{ver}.xlsx"))
persistence_monocyte_table_sva
## A set of combined differential expression results.
##    table deseq_sigup deseq_sigdown edger_sigup edger_sigdown limma_sigup
## 1 Y_vs_N           1             0           0             1           0
##   limma_sigdown
## 1             0
## Only Y_vs_N_up has information, cannot create an UpSet.
## Plot describing unique/shared genes in a differential expression table.
## NULL
persistence_neutrophil_de_sva <- all_pairwise(persistence_neutrophil, filter = TRUE, model_batch = "svaseq")
## 
## N Y 
## 3 7
## Removing 0 low-count genes (8394 remaining).
## Setting 46 low elements to zero.
## transform_counts: Found 46 values equal to 0, adding 1 to the matrix.
persistence_neutrophil_de_sva
## A pairwise differential expression with results from: basic, deseq, ebseq, edger, limma, noiseq.
## This used a surrogate/batch estimate from: svaseq.
## The primary analysis performed 15 comparisons.
## The logFC agreement among the methods follows:
##                  Y_vs_N
## limma_vs_deseq   0.9407
## limma_vs_edger   0.9408
## limma_vs_ebseq   0.7777
## limma_vs_basic   0.8808
## limma_vs_noiseq -0.7817
## deseq_vs_edger   0.9985
## deseq_vs_ebseq   0.7486
## deseq_vs_basic   0.8271
## deseq_vs_noiseq -0.7593
## edger_vs_ebseq   0.7602
## edger_vs_basic   0.8283
## edger_vs_noiseq -0.7602
## ebseq_vs_basic   0.9144
## ebseq_vs_noiseq -0.9143
## basic_vs_noiseq -0.9003
persistence_neutrophil_table_sva <- combine_de_tables(
  persistence_neutrophil_de_sva,
  excel = glue("{xlsx_prefix}/DE_Persistence/persistence_neutrophil_de_sva-v{ver}.xlsx"))
persistence_neutrophil_table_sva
## A set of combined differential expression results.
##    table deseq_sigup deseq_sigdown edger_sigup edger_sigdown limma_sigup
## 1 Y_vs_N          26            49          17            35           0
##   limma_sigdown
## 1             0
## `geom_line()`: Each group consists of only one observation.
## i Do you need to adjust the group aesthetic?
## Plot describing unique/shared genes in a differential expression table.

## There are insufficient samples (1) in the 'N' category.
##persistence_eosinophil_de_sva <- all_pairwise(persistence_eosinophil, filter = TRUE, model_batch = "svaseq")
##persistence_eosinophil_de_sva
##persistence_eosinophil_table_sva <- combine_de_tables(
##  persistence_eosinophil_de_sva,
##  excel = glue("{xlsx_prefix}/DE_Persistence/persistence_eosinophil_de_sva-v{ver}.xlsx"))

6.2 Comparing visits without regard to cure/fail

6.2.1 All cell types

t_visit_all_de_sva <- all_pairwise(t_visit, filter = TRUE, model_batch = "svaseq")
## 
##  3  2  1 
## 34 35 40
## Removing 0 low-count genes (11910 remaining).
## Setting 9636 low elements to zero.
## transform_counts: Found 9636 values equal to 0, adding 1 to the matrix.
t_visit_all_de_sva
## A pairwise differential expression with results from: basic, deseq, ebseq, edger, limma, noiseq.
## This used a surrogate/batch estimate from: svaseq.
## The primary analysis performed 15 comparisons.
t_visit_all_table_sva <- combine_de_tables(
  t_visit_all_de_sva, keepers = visit_contrasts,
  excel = glue("{xlsx_prefix}/DE_Visits/t_all_visit_tables_sva-v{ver}.xlsx"))
t_visit_all_table_sva
## A set of combined differential expression results.
##      table deseq_sigup deseq_sigdown edger_sigup edger_sigdown limma_sigup
## 1 c2_vs_c1          25             9          20            10          19
## 2 c3_vs_c1          20            20          18            16          21
## 3 c3_vs_c2           0             2           0             2           0
##   limma_sigdown
## 1             7
## 2             7
## 3             0
## Plot describing unique/shared genes in a differential expression table.

t_visit_all_sig_sva <- extract_significant_genes(
  t_visit_all_table_sva,
  excel = glue("{xlsx_prefix}/DE_Visits/t_all_visit_sig_sva-v{ver}.xlsx"))
t_visit_all_sig_sva
## A set of genes deemed significant according to limma, edger, deseq, ebseq, basic.
## The parameters defining significant were:
## LFC cutoff: 1 adj P cutoff: 0.05
##      limma_up limma_down edger_up edger_down deseq_up deseq_down ebseq_up
## v2v1       19          7       20         10       25          9        0
## v3v1       21          7       18         16       20         20        0
## v3v2        0          0        0          2        0          2        0
##      ebseq_down basic_up basic_down
## v2v1          0        0          0
## v3v1          0        0          0
## v3v2          0        0          0

6.2.2 Monocyte samples

t_visit_monocytes <- set_expt_conditions(t_monocytes, fact = "visitnumber")
## The numbers of samples by condition are:
## 
##  3  2  1 
## 13 13 16
t_visit_monocyte_de_sva <- all_pairwise(t_visit_monocytes, filter = TRUE, model_batch = "svaseq")
## 
##  3  2  1 
## 13 13 16
## Removing 0 low-count genes (10862 remaining).
## Setting 658 low elements to zero.
## transform_counts: Found 658 values equal to 0, adding 1 to the matrix.
t_visit_monocyte_de_sva
## A pairwise differential expression with results from: basic, deseq, ebseq, edger, limma, noiseq.
## This used a surrogate/batch estimate from: svaseq.
## The primary analysis performed 15 comparisons.
t_visit_monocyte_table_sva <- combine_de_tables(
  t_visit_monocyte_de_sva, keepers = visit_contrasts,
  excel = glue("{xlsx_prefix}/DE_Visits/Monocytes/t_monocyte_visit_tables_sva-v{ver}.xlsx"))
t_visit_monocyte_table_sva
## A set of combined differential expression results.
##      table deseq_sigup deseq_sigdown edger_sigup edger_sigdown limma_sigup
## 1 c2_vs_c1           1             2           1             1           0
## 2 c3_vs_c1           2             1           1             1           0
## 3 c3_vs_c2           0             0           0             0           0
##   limma_sigdown
## 1             0
## 2             0
## 3             0
## `geom_line()`: Each group consists of only one observation.
## i Do you need to adjust the group aesthetic?
## Plot describing unique/shared genes in a differential expression table.

t_visit_monocyte_sig_sva <- extract_significant_genes(
  t_visit_monocyte_table_sva,
  excel = glue("{xlsx_prefix}/DE_Visits/Monocytes/t_monocyte_visit_sig_sva-v{ver}.xlsx"))
t_visit_monocyte_sig_sva
## A set of genes deemed significant according to limma, edger, deseq, ebseq, basic.
## The parameters defining significant were:
## LFC cutoff: 1 adj P cutoff: 0.05
##      limma_up limma_down edger_up edger_down deseq_up deseq_down ebseq_up
## v2v1        0          0        1          1        1          2        0
## v3v1        0          0        1          1        2          1        0
## v3v2        0          0        0          0        0          0        0
##      ebseq_down basic_up basic_down
## v2v1          1        0          0
## v3v1          0        0          0
## v3v2          1        0          0

6.2.3 Neutrophil samples

t_visit_neutrophils <- set_expt_conditions(t_neutrophils, fact = "visitnumber")
## The numbers of samples by condition are:
## 
##  3  2  1 
## 12 13 16
t_visit_neutrophil_de_sva <- all_pairwise(t_visit_neutrophils, filter = TRUE, model_batch = "svaseq")
## 
##  3  2  1 
## 12 13 16
## Removing 0 low-count genes (9101 remaining).
## Setting 593 low elements to zero.
## transform_counts: Found 593 values equal to 0, adding 1 to the matrix.
t_visit_neutrophil_de_sva
## A pairwise differential expression with results from: basic, deseq, ebseq, edger, limma, noiseq.
## This used a surrogate/batch estimate from: svaseq.
## The primary analysis performed 15 comparisons.
t_visit_neutrophil_table_sva <- combine_de_tables(
  t_visit_neutrophil_de_sva, keepers = visit_contrasts,
  excel = glue("{xlsx_prefix}/DE_Visits/Neutrophils/t_neutrophil_visit_table_sva-v{ver}.xlsx"))
t_visit_neutrophil_table_sva
## A set of combined differential expression results.
##      table deseq_sigup deseq_sigdown edger_sigup edger_sigdown limma_sigup
## 1 c2_vs_c1         111            88         111            88         116
## 2 c3_vs_c1         127            45         122            44          93
## 3 c3_vs_c2           1             0           0             0           0
##   limma_sigdown
## 1            52
## 2            67
## 3             0
## Plot describing unique/shared genes in a differential expression table.

t_visit_neutrophil_sig_sva <- extract_significant_genes(
  t_visit_neutrophil_table_sva,
  excel = glue("{xlsx_prefix}/DE_Visits/Neutrophils/t_neutrophil_visit_sig_sva-v{ver}.xlsx"))
t_visit_neutrophil_sig_sva
## A set of genes deemed significant according to limma, edger, deseq, ebseq, basic.
## The parameters defining significant were:
## LFC cutoff: 1 adj P cutoff: 0.05
##      limma_up limma_down edger_up edger_down deseq_up deseq_down ebseq_up
## v2v1      116         52      111         88      111         88       64
## v3v1       93         67      122         44      127         45       36
## v3v2        0          0        0          0        1          0        1
##      ebseq_down basic_up basic_down
## v2v1         20       83         35
## v3v1          7       52         17
## v3v2          0        0          0

6.2.4 Eosinophil samples

t_visit_eosinophils <- set_expt_conditions(t_eosinophils, fact="visitnumber")
## The numbers of samples by condition are:
## 
## 3 2 1 
## 9 9 8
t_visit_eosinophil_de <- all_pairwise(t_visit_eosinophils, filter = TRUE, model_batch = "svaseq")
## 
## 3 2 1 
## 9 9 8
## Removing 0 low-count genes (10532 remaining).
## Setting 271 low elements to zero.
## transform_counts: Found 271 values equal to 0, adding 1 to the matrix.

t_visit_eosinophil_de
## A pairwise differential expression with results from: basic, deseq, ebseq, edger, limma, noiseq.
## This used a surrogate/batch estimate from: svaseq.
## The primary analysis performed 15 comparisons.
t_visit_eosinophil_table <- combine_de_tables(
  t_visit_eosinophil_de, keepers = visit_contrasts,
  excel = glue("{xlsx_prefix}/DE_Visits/Eosinophils/t_eosinophil_visit_table_sva-v{ver}.xlsx"))
t_visit_eosinophil_table
## A set of combined differential expression results.
##      table deseq_sigup deseq_sigdown edger_sigup edger_sigdown limma_sigup
## 1 c2_vs_c1           0             0           0             0           0
## 2 c3_vs_c1           0             0           0             0           0
## 3 c3_vs_c2           0             0           0             0           0
##   limma_sigdown
## 1             0
## 2             0
## 3             0
## Only  has information, cannot create an UpSet.
## Plot describing unique/shared genes in a differential expression table.
## NULL
t_visit_eosinophil_sig <- extract_significant_genes(
  t_visit_eosinophil_table,
  excel = glue("{xlsx_prefix}/DE_Visits/Eosinophils/t_eosinophil_visit_sig_sva-v{ver}.xlsx"))
## No significant genes observed.

7 Explore ROC

Alejandro showed some ROC curves for eosinophil data showing sensitivity vs. specificity of a couple genes which were observed in v1 eosinophils vs. all-times eosinophils across cure/fail. I am curious to better understand how this was done and what utility it might have in other contexts.

To that end, I want to try something similar myself. In order to properly perform the analysis with these various tools, I need to reconfigure the data in a pretty specific format:

  1. Single df with 1 row per set of observations (sample in this case I think)
  2. The outcome column(s) need to be 1 (or more?) metadata factor(s) (cure/fail or a paste0 of relevant queries (eo_v1_cure, eo_v123_cure, etc)
  3. The predictor column(s) are the measurements (rpkm of 1 or more genes), 1 column each gene.

If I intend to use this for our tx data, I will likely need a utility function to create the properly formatted input df.

For the purposes of my playing, I will choose three genes from the eosinophil C/F table, one which is significant, one which is not, and an arbitrary.

The input genes will therefore be chosen from the data structure: t_cf_eosinophil_tables_sva:

ENSG00000198178, ENSG00000179344, ENSG00000182628

eo_rpkm <- normalize_expt(tv1_eosinophils, convert = "rpkm", column = "cds_length")
## There appear to be 5355 genes without a length.

8 An external dataset

This paper is DOI:10.1126/scitranslmed.aax4204

Variable gene expression and parasite load predict treatment outcome in cutaneous leishmaniasis.

One query from Maria Adelaida is to see how this data fits with ours. I have read this paper a couple of times now and I get confused on a couple of points every time, which I will explain in a moment. The expermental design is key to my confusion and key to what I think is being missed in our interpretation of the results:

  1. The PCA is not cure vs. fail but healthy skin vs. CL lesion.

8.1 Only the Scott data

external_cf
## 
external_norm <- normalize_expt(external_cf, filter = TRUE, norm = "quant",
                                convert = "cpm", transform = "log2")
## Removing 7327 low-count genes (14154 remaining).
plot_pca(external_norm)
## The result of performing a fast_svd dimension reduction.
## The x-axis is PC1 and the y-axis is PC2
## Colors are defined by cure, failure
## Shapes are defined by female, male.

external_nb <- normalize_expt(external_cf, filter = TRUE, batch = "svaseq",
                                convert = "cpm", transform = "log2")
## Removing 7327 low-count genes (14154 remaining).
## Setting 171 low elements to zero.
## transform_counts: Found 171 values equal to 0, adding 1 to the matrix.
plot_pca(external_nb)
## The result of performing a fast_svd dimension reduction.
## The x-axis is PC1 and the y-axis is PC2
## Colors are defined by cure, failure
## Shapes are defined by female, male.

external_de <- all_pairwise(external_cf, filter = TRUE, model_batch = "svaseq")
## 
##    cure failure 
##      14       7
## Removing 0 low-count genes (14154 remaining).
## Setting 171 low elements to zero.
## transform_counts: Found 171 values equal to 0, adding 1 to the matrix.
external_de
## A pairwise differential expression with results from: basic, deseq, ebseq, edger, limma, noiseq.
## This used a surrogate/batch estimate from: svaseq.
## The primary analysis performed 15 comparisons.
## The logFC agreement among the methods follows:
##                 falr_vs_cr
## limma_vs_deseq      0.8487
## limma_vs_edger      0.8497
## limma_vs_ebseq      0.3577
## limma_vs_basic      0.4180
## limma_vs_noiseq    -0.3286
## deseq_vs_edger      0.9997
## deseq_vs_ebseq      0.4149
## deseq_vs_basic      0.3908
## deseq_vs_noiseq    -0.3756
## edger_vs_ebseq      0.4177
## edger_vs_basic      0.3914
## edger_vs_noiseq    -0.3768
## ebseq_vs_basic      0.9027
## ebseq_vs_noiseq    -0.8917
## basic_vs_noiseq    -0.9338
external_table <- combine_de_tables(external_de, excel = "excel/scott_table.xlsx")
external_table
## A set of combined differential expression results.
##             table deseq_sigup deseq_sigdown edger_sigup edger_sigdown
## 1 failure_vs_cure           0             0           0             0
##   limma_sigup limma_sigdown
## 1           0             0
## Only  has information, cannot create an UpSet.
## Plot describing unique/shared genes in a differential expression table.
## NULL
external_sig <- extract_significant_genes(external_table, excel = "excel/scott_sig.xlsx")
external_sig
## A set of genes deemed significant according to limma, edger, deseq, ebseq, basic.
## The parameters defining significant were:
## LFC cutoff: 1 adj P cutoff: 0.05
##                 limma_up limma_down edger_up edger_down deseq_up deseq_down
## failure_vs_cure        0          0        0          0        0          0
##                 ebseq_up ebseq_down basic_up basic_down
## failure_vs_cure        0          0        0          0
external_top100 <- extract_significant_genes(external_table, n = 100)
external_up <- external_top100[["deseq"]][["ups"]][["failure_vs_cure"]]
external_down <- external_top100[["deseq"]][["downs"]][["failure_vs_cure"]]

9 An explicit comparison of methods.

I think I am getting a significantly different result from Scott, so I am going to do an explicit side-by-side comparison of our results at each step. In order to do this, I am using the capsule they kindly provided with their publication.

I am copy/pasting material from their publication with some modification which I will note as I go.

Here is their block ‘r packages’

Note/Spoiler alert: It actually turns out our results are basically relatively similar, I just didn’t understand what comparisons are actually in paper vs those I have primary interest. In addition, we handled gene IDs differently (gene card vs. EnsemblID) which has a surprisingly big effect.

Oh, I just realized that when I did these analyses, I did them in a completely separate tree and compared the results post-facto. This assumption remains in this document and therefore is unlikely to work properly in the containerized environment I am attempting to create. Given that the primary goal of this section is to show to myself that I compared the two datasets as thoroughly as I could, perhaps I should just disable them for the container and allow the reader to perform the exercise de-novo.

library(tidyverse)
library(ggthemes)
library(reshape2)
library(edgeR)
library(patchwork)
library(vegan)
library(DT)
library(tximport)
library(gplots)
library(FinCal)
library(ggrepel)
library(gt)
library(ggExtra)
library(EnsDb.Hsapiens.v86)
library(stringr)
library(cowplot)
library(ggpubr)

I have a separate tree in which I copied the capsule and data. I performed exactly their steps kallisto quant steps within it and put the output data into the same place within it. I did change the commands slightly because I downloaded the files from SRA and so don’t have them with names like ‘host_CL01’, but instead ‘PRJNA…’. But the samples are in the same order, so I sent the output files to the same final filenames. Here is an example from the first sample:

cd preprocessing
module add kallisto
kallisto index -i Homo_sapiens.GRCh38.cdna.all.Index Homo_sapiens.GRCh38.cdna.all.fa
# Map reads to the indexed reference transcriptome for HOST
# first the healthy subjects (HS)
export LESS = '--buffers 0 -B'
kallisto quant -i Homo_sapiens.GRCh38.cdna.all.Index -o host_HS01 -t 24 -b 60 \
         --single -l 250 -s 30 <(less SRR8668755/*-trimmed.fastq.xz) 2>host_HS01.log 1>&2 &

10 Block ‘sample_info’

I am going to change the path very slightly in the following block simply because I put the capsule in a separate directory and do not want to copy it here. Otherwise it is unmodified. Also, the function gt::tab_header() annoys the crap out of me.

import <- read_tsv("../scott_2019/capsule-6534016/data/studydesign.txt")
import %>% dplyr::filter(disease == "cutaneous") %>%
  dplyr::select(-2) %>%  gt() %>%
  tab_header(title = md("Clinical metadata from patients with cutaneous leishmaniasis (CL)"),
             subtitle = md("`(n=21)`")) %>%  cols_align(align = "center", columns = TRUE)
targets.lesion <- import
targets.onlypatients <- targets.lesion[8:28,] # only CL lesions (n=21)

# Making factors that will be used for pairwise comparisons:
# HS vs. CL lesions as a factor:
disease.lesion <- factor(targets.lesion$disease)
# Cure vs. Failure lesions as a factor:
treatment.lesion <- factor(targets.onlypatients$treatment_outcome)

11 Importing the data and annotations

They did use a slightly different annotation set, Ensembl revision 86. Once again I am modifying the paths slightly to reflect where I put the capsule.

# capturing Ensembl transcript IDs (tx) and gene symbols ("gene_name") from
# EnsDb.Hsapiens.v86 annotation package
Tx <- as.data.frame(transcripts(EnsDb.Hsapiens.v86,
                                columns=c(listColumns(EnsDb.Hsapiens.v86, "tx"),
                                          "gene_name")))

Tx <- dplyr::rename(Tx, target_id = tx_id)
row.names(Tx) <- NULL
Tx <- Tx[,c(6,12)]

# getting file paths for Kallisto outputs
paths.all <- file.path("../scott_2019/capsule-6534016/data/readMapping/human", targets.lesion$sample, "abundance.h5")
paths.patients <- file.path("../scott_2019/capsule-6534016/data/readMapping/human", targets.onlypatients$sample, "abundance.h5")

# importing .h5 Kallisto data and collapsing transcript-level data to genes
Txi.lesion.coding <- tximport(paths.all,
                              type = "kallisto",
                              tx2gene = Tx,
                              txOut = FALSE,
                              ignoreTxVersion = TRUE,
                              countsFromAbundance = "lengthScaledTPM")

# importing againg, but this time just the CL patients
Txi.lesion.coding.onlypatients <- tximport(paths.patients,
                                           type = "kallisto",
                                           tx2gene = Tx,
                                           txOut = FALSE,
                                           ignoreTxVersion = TRUE,
                                           countsFromAbundance = "lengthScaledTPM")

12 Filtering and normalization

The block ‘visualizationDatasets’ follows unchanged. In the next block I will add another plot or perhaps 2

# First make a DGEList from the counts:
Txi.lesion.coding.DGEList <- DGEList(Txi.lesion.coding$counts)
colnames(Txi.lesion.coding.DGEList$counts) <- targets.lesion$sample
colnames(Txi.lesion.coding$counts) <- targets.lesion$sample

Txi.lesion.coding.DGEList.OP <- DGEList(Txi.lesion.coding.onlypatients$counts)
colnames(Txi.lesion.coding.DGEList.OP) <- targets.onlypatients$sample

# Convert to counts per million:
Txi.lesion.coding.DGEList.cpm <- edgeR::cpm(Txi.lesion.coding.DGEList, log = TRUE)
Txi.lesion.coding.DGEList.OP.cpm <- edgeR::cpm(Txi.lesion.coding.DGEList.OP, log = TRUE)

keepers.coding <- rowSums(Txi.lesion.coding.DGEList.cpm>1)>=7
keepers.coding.OP <- rowSums(Txi.lesion.coding.DGEList.OP.cpm>1)>=7

Txi.lesion.coding.DGEList.filtered <- Txi.lesion.coding.DGEList[keepers.coding,]
Txi.lesion.coding.DGEList.OP.filtered <- Txi.lesion.coding.DGEList.OP[keepers.coding.OP,]

# convert back to cpm:
Txi.lesion.coding.DGEList.LogCPM.filtered <- edgeR::cpm(Txi.lesion.coding.DGEList.filtered,
                                                        log=TRUE)
Txi.lesion.coding.DGEList.LogCPM.OP.filtered <- edgeR::cpm(Txi.lesion.coding.DGEList.OP.filtered,
                                                           log=TRUE)

# Normalizing data:
calcNorm1 <- calcNormFactors(Txi.lesion.coding.DGEList.filtered, method = "TMM")
calcNorm2 <- calcNormFactors(Txi.lesion.coding.DGEList.OP.filtered, method = "TMM")

Txi.lesion.coding.DGEList.LogCPM.filtered.norm <- edgeR::cpm(calcNorm1, log=TRUE)
colnames(Txi.lesion.coding.DGEList.LogCPM.filtered.norm) <- targets.lesion$sample
Txi.lesion.coding.DGEList.OP.LogCPM.filtered.norm <- edgeR::cpm(calcNorm2, log=TRUE)
colnames(Txi.lesion.coding.DGEList.OP.LogCPM.filtered.norm) <- targets.onlypatients$sample
# Raw dataset:
V1 <- as.data.frame(Txi.lesion.coding.DGEList.cpm)
colnames(V1) <- targets.lesion$sample
V1 <- melt(V1)
colnames(V1) <- c("sample","expression")

# Filtered dataset:
V1.1 <- as.data.frame(Txi.lesion.coding.DGEList.LogCPM.filtered)
colnames(V1.1) <- targets.lesion$sample
V1.1 <- melt(V1.1)
colnames(V1.1) <- c("sample","expression")

# Filtered-normalized dataset:
V1.1.1 <- as.data.frame(Txi.lesion.coding.DGEList.LogCPM.filtered.norm)
colnames(V1.1.1) <- targets.lesion$sample
V1.1.1 <- melt(V1.1.1)
colnames(V1.1.1) <- c("sample","expression")

# plotting:
ggplot(V1, aes(x=sample, y=expression, fill=sample)) +
  geom_violin(trim = TRUE, show.legend = TRUE) +
  stat_summary(fun.y = "median", geom = "point", shape = 95, size = 10, color = "black") +
  theme_bw() +
  theme(legend.position = "none", axis.title=element_text(size=7),
        axis.title.x=element_blank(), axis.text=element_text(size=5),
        axis.text.x = element_text(angle = 90, hjust = 1),
        plot.title = element_text(size = 7)) +
  ggtitle("Raw dataset") +
  ggplot(V1.1, aes(x=sample, y=expression, fill=sample)) +
  geom_violin(trim = TRUE, show.legend = TRUE) +
  stat_summary(fun.y = "median", geom = "point", shape = 95, size = 10, color = "black") +
  theme_bw() +
  theme(legend.position = "none", axis.title=element_text(size=7),
        axis.title.x=element_blank(), axis.text=element_text(size=5),
        axis.text.x = element_text(angle = 90, hjust = 1),
        plot.title = element_text(size = 7)) +
  ggtitle("Filtered dataset") +
  ggplot(V1.1.1, aes(x=sample, y=expression, fill=sample)) +
  geom_violin(trim = TRUE, show.legend = TRUE) +
  stat_summary(fun.y = "median", geom = "point", shape = 95, size = 10, color = "black") +
  theme_bw() +
  theme(legend.position = "none", axis.title=element_text(size=7),
        axis.title.x=element_blank(), axis.text=element_text(size=5),
        axis.text.x = element_text(angle = 90, hjust = 1),
        plot.title = element_text(size = 7)) +
  ggtitle("Filtered and normalized dataset")

13 The unfiltered data

The following block in their dataset recreated the matrix without filtering and will use that for differential expression. It is a little hard to follow for me because they subset based on the sample numbers (8 to 28, which if I am not mistaken just drops the healthy samples?).

DataNotFiltered_Norm_OP <- calcNormFactors(Txi.lesion.coding.DGEList[,8:28],
                                           method = "TMM")
DataNotFiltered_Norm_log2CPM_OP <- edgeR::cpm(DataNotFiltered_Norm_OP, log=TRUE)
colnames(DataNotFiltered_Norm_log2CPM_OP) <- targets.onlypatients$sample
CPM_normData_notfiltered_OP <- 2^(DataNotFiltered_Norm_log2CPM_OP)
#uncomment the next line to produce raw data that was uploaded to the Gene Expression Omnibus (GEO) for publication.
#write.table(Txi.lesion.coding$counts, file = "Amorim_GEO_raw.txt", sep = "\t", quote = FALSE)

# Including all the individuals (HS and CL patients) for public domain submission:
DataNotFiltered_Norm <- calcNormFactors(Txi.lesion.coding.DGEList, method = "TMM")
DataNotFiltered_Norm_log2CPM <- edgeR::cpm(DataNotFiltered_Norm, log=TRUE)
colnames(DataNotFiltered_Norm_log2CPM) <- targets.lesion$sample
CPM_normData_notfiltered <- 2^(DataNotFiltered_Norm_log2CPM)
#uncomment the next line to produce the normalized data file that was uploaded to the Gene Expression Omnibus (GEO) for publication.
#write.table(DataNotFiltered_Norm_log2CPM, "Amorim_GEO_normalized.txt", sep = "\t", quote = FALSE)

14 The scott exploratory analysis

The following block generated a couple of the figures in the paper and comprise a pretty straightforward PCA. I am going to make a following block containing the same image with the cure/fail visualization using the same method/data.

pca.res <- prcomp(t(Txi.lesion.coding.DGEList.LogCPM.filtered.norm), scale.=F, retx=T)
pc.var <- pca.res$sdev^2
pc.per <- round(pc.var/sum(pc.var)*100, 1)
data.frame <- as.data.frame(pca.res$x)

# Calculate distance between samples by permanova:
allsamples.dist <- vegdist(t(2^Txi.lesion.coding.DGEList.LogCPM.filtered.norm),
                           method = "bray")

vegan <- adonis2(allsamples.dist~targets.lesion$disease,
                 data=targets.lesion,
                 permutations = 999, method="bray")

targets.lesion$disease
ggplot(data.frame, aes(x=PC1, y=PC2, color=factor(targets.lesion$disease))) +
  geom_point(size=5, shape=20) +
  theme_calc() +
  theme(panel.grid.major = element_blank(), panel.grid.minor = element_blank(),
        axis.text.x = element_text(size = 15, vjust = 0.5),
        axis.text.y = element_text(size = 15), axis.title = element_text(size = 15),
        legend.position="none") +
  scale_color_manual(values = c("#073F80","#EB512C")) +
  annotate("text", x=-50, y=80, label=paste("Permanova Pr(>F) =",
                                            vegan[1,5]), size=3, fontface="bold") +
  xlab(paste("PC1 -",pc.per[1],"%")) +
  ylab(paste("PC2 -",pc.per[2],"%")) +
  xlim(-200,110)

14.0.1 My most similar pca

external_l2cpm <- normalize_expt(external_cf, filter = TRUE,
                                convert = "cpm", transform = "log2")
## Removing 7327 low-count genes (14154 remaining).
## transform_counts: Found 165 values equal to 0, adding 1 to the matrix.
plot_pca(external_l2cpm, plot_labels = "repel")
## The result of performing a fast_svd dimension reduction.
## The x-axis is PC1 and the y-axis is PC2
## Colors are defined by cure, failure
## Shapes are defined by female, male.

14.1 Cure/Fail PCA using the same prcomp result

I am just copy/pasting their code again, but changing the color factor so that cure is purple, failure is red, and na(uninfected) is black.

The following plot should be the first direct comparison point between the two analysis pipelines. Thus, if you look back a few block at my invocation of plot_pca(external_norm), you will see a green/orange plot which is functionally identical if you note:

  1. The x and y axes are flipped, which ok whatever it is PCA.
  2. I excluded the healthy samples.
  3. I dropped to gene level and used hisat.

With those caveats in mind, it is trivial to find the same relationshipes in the samples. E.g. the bottom red/purple individual samples are in the same relative position as my top orange/green pair. the same 4 samples are relative x-axis outliers (my right green, their left purple). The last 6 samples (my orange, their red) are all in the relative orientation.

I think I can further prove the similarity of our inputs via a direct comparison of the datastructures: Txi.lesion.coding.DGEList.LogCPM.filtered.norm (ugh what a name) vs. external_cf. In order to make that comparison, I need to rename my rows to the genecard IDs and the columns.

their_norm_exprs <- Txi.lesion.coding.DGEList.LogCPM.filtered.norm

my_hgnc_ids <- make.names(fData(external_cf)[["hgnc_symbol"]], unique = TRUE)
my_renamed <- set_expt_genenames(external_cf, ids = my_hgnc_ids)
my_norm <- normalize_expt(my_renamed, filter = TRUE, transform = "log2", convert = "cpm")
my_norm_exprs <- as.data.frame(exprs(my_norm))

our_exprs <- merge(their_norm_exprs, my_norm_exprs, by = "row.names")
rownames(our_exprs) <- our_exprs[["Row.names"]]
our_exprs[["Row.names"]] <- NULL
dim(our_exprs)

## I fully expected a correlation heatmap of the combined
## data to show a set of paired samples across the board.
## That is absolutely not true.
correlations <- plot_corheat(our_exprs)
correlations$plot
color_fact <- factor(targets.lesion$treatment_outcome)
levels(color_fact)
## Added by atb to see cure/fail on the same dataset
ggplot(data.frame, aes(x=PC1, y=PC2, color=color_fact)) +
  geom_point(size=5, shape=20) +
  theme_calc() +
  theme(panel.grid.major = element_blank(), panel.grid.minor = element_blank(),
        axis.text.x = element_text(size = 15, vjust = 0.5),
        axis.text.y = element_text(size = 15), axis.title = element_text(size = 15),
        legend.position="none") +
  scale_color_manual(values = c("purple", "red","black")) +
  annotate("text", x=-50, y=80, label=paste("Permanova Pr(>F) =",
                                            vegan[1,5]), size=3, fontface="bold") +
  xlab(paste("PC1 -",pc.per[1],"%")) +
  ylab(paste("PC2 -",pc.per[2],"%")) +
  xlim(-200,110)

15 DE comparisons

The following is their comparison of healthy tissue vs. CL lesion and Failure vs. Cure. I am going to follow it with my analagous examination using limma. Note, each of the pairs of variables created in the following block is xxx followed by xxx.treat; the former is healthy vs lesion and the latter is the fail vs cure set.

# Model matrices:
# CL lesions vs. HS:
design.lesion <- model.matrix(~0 + disease.lesion)
colnames(design.lesion) <- levels(disease.lesion)

# Failure vs. Cure:
design.lesion.treatment <- model.matrix(~0 + treatment.lesion)
colnames(design.lesion.treatment) <- levels(treatment.lesion)

myDGEList.lesion.coding <- DGEList(calcNorm1$counts)
myDGEList.OP.NotFil <- DGEList(CPM_normData_notfiltered_OP)

# Model mean-variance trend and fit linear model to data.
# Use VOOM function from Limma package to model the mean-variance relationship
normData.lesion.coding <- voom(myDGEList.lesion.coding, design.lesion)
normData.OP.NotFil <- voom(myDGEList.OP.NotFil, design.lesion.treatment)

colnames(normData.lesion.coding) <- targets.lesion$sample
colnames(normData.OP.NotFil) <- targets.onlypatients$sample

# fit a linear model to your data
fit.lesion.coding <- lmFit(normData.lesion.coding, design.lesion)
fit.lesion.coding.treatment <- lmFit(normData.OP.NotFil, design.lesion.treatment)

# contrast matrix
contrast.matrix.lesion <- makeContrasts(CL.vs.CON = cutaneous - control,
                                        levels=design.lesion)
contrast.matrix.lesion.treat <- makeContrasts(failure.vs.cure = failure - cure,
                                              levels=design.lesion.treatment)

# extract the linear model fit
fits.lesion.coding <- contrasts.fit(fit.lesion.coding,
                                    contrast.matrix.lesion)
fits.lesion.coding.treat <- contrasts.fit(fit.lesion.coding.treatment,
                                          contrast.matrix.lesion.treat)

# get bayesian stats for your linear model fit
ebFit.lesion.coding <- eBayes(fits.lesion.coding)
ebFit.lesion.coding.treat <- eBayes(fits.lesion.coding.treat)

# TopTable ----
allHits.lesion.coding <- topTable(ebFit.lesion.coding,
                                  adjust ="BH", coef=1,
                                  number=34935, sort.by="logFC")
allHits.lesion.coding.treat <- topTable(ebFit.lesion.coding.treat,
                                        adjust ="BH", coef=1,
                                        number=34776, sort.by="logFC")
myTopHits <- rownames_to_column(allHits.lesion.coding, "geneID")
myTopHits.treat <- rownames_to_column(allHits.lesion.coding.treat, "geneID")

# mutate the format of numeric values:
myTopHits <- mutate(myTopHits, log10Pval = round(-log10(adj.P.Val),2),
                    adj.P.Val = round(adj.P.Val, 2),
                    B = round(B, 2),
                    AveExpr = round(AveExpr, 2),
                    t = round(t, 2),
                    logFC = round(logFC, 2),
                    geneID = geneID)

myTopHits.treat <- mutate(myTopHits.treat, log10Pval = round(-log10(adj.P.Val),2),
                          adj.P.Val = round(adj.P.Val, 2),
                          B = round(B, 2),
                          AveExpr = round(AveExpr, 2),
                          t = round(t, 2),
                          logFC = round(logFC, 2),
                          geneID = geneID)
#save(myTopHits, file = "myTopHits")
#save(myTopHits.treat, file = "myTopHits.treat")

16 Perform my analagous limma analysis

limma_cf <- limma_pairwise(my_renamed, model_batch = FALSE)

my_table <- limma_cf[["all_tables"]][["failure_vs_cure"]]
their_table <- myTopHits.treat

dim(my_table)
dim(myTopHits.treat)
our_table <- merge(my_table, myTopHits.treat, by.x = "row.names", by.y = "geneID")
dim(our_table)
comparison <- plot_linear_scatter(our_table[, c("logFC.x", "logFC.y")])
comparison$scatter
comparison$correlation
comparison$lm_model

Ok, so there is a constituitive difference in our results, and it is significant. What does that mean for the set of genes observed?

17 See if there are shared DE genes

!!NOTE!! I am using a non-adjusted p-value filter here because I want to use the same filter they used for the volcano plot.

my_filter <- abs(my_table[["logFC"]]) > 1.0 & my_table[["P.Value"]] <= 0.05
sum(my_filter)
their_filter <- abs(their_table[["logFC"]]) > 1.0 & their_table[["P.Value"]] <= 0.05
sum(their_filter)

my_shared <- rownames(my_table)[my_filter] %in% their_table[their_filter, "geneID"]
sum(my_shared)

shared <- rownames(my_table)[my_filter]
shared[my_shared]

17.1 Compare the two datasets directly

only_tmrc3 <- subset_expt(tmrc3_external, subset = "condition=='Colombia'") %>%
  set_expt_conditions(fact = "finaloutcome")
## The samples excluded are: SRR8668762, SRR8668763, SRR8668764, SRR8668765, SRR8668766, SRR8668767, SRR8668768, SRR8668769, SRR8668770, SRR8668771, SRR8668772, SRR8668773, SRR8668774, SRR8668775, SRR8668776, SRR8668777, SRR8668778, SRR8668779, SRR8668780, SRR8668781, SRR8668782.
## subset_expt(): There were 39, now there are 18 samples.
## The numbers of samples by condition are:
## 
## failure    cure 
##       5      13
only_tmrc3_de <- all_pairwise(only_tmrc3, model_batch = "svaseq", filter = TRUE)
## 
## failure    cure 
##       5      13
## Removing 0 low-count genes (13615 remaining).
## Setting 225 low elements to zero.
## transform_counts: Found 225 values equal to 0, adding 1 to the matrix.
only_tmrc3_de
## A pairwise differential expression with results from: basic, deseq, ebseq, edger, limma, noiseq.
## This used a surrogate/batch estimate from: svaseq.
## The primary analysis performed 15 comparisons.
## The logFC agreement among the methods follows:
##                 falr_vs_cr
## limma_vs_deseq      0.7154
## limma_vs_edger      0.8311
## limma_vs_ebseq      0.7494
## limma_vs_basic      0.9061
## limma_vs_noiseq    -0.8065
## deseq_vs_edger      0.9248
## deseq_vs_ebseq      0.8921
## deseq_vs_basic      0.7782
## deseq_vs_noiseq    -0.7250
## edger_vs_ebseq      0.9223
## edger_vs_basic      0.8963
## edger_vs_noiseq    -0.8438
## ebseq_vs_basic      0.7965
## ebseq_vs_noiseq    -0.7862
## basic_vs_noiseq    -0.8787
only_tmrc3_table <- combine_de_tables(only_tmrc3_de)
only_tmrc3_table
## A set of combined differential expression results.
##             table deseq_sigup deseq_sigdown edger_sigup edger_sigdown
## 1 failure_vs_cure          27            26          28            15
##   limma_sigup limma_sigdown
## 1           1             0
## `geom_line()`: Each group consists of only one observation.
## i Do you need to adjust the group aesthetic?
## Plot describing unique/shared genes in a differential expression table.

only_tmrc3_top100 <- extract_significant_genes(only_tmrc3_table, n = 100)
only_tmrc3_up <- only_tmrc3_top100[["deseq"]][["ups"]][["failure_vs_cure"]]
only_tmrc3_down <- only_tmrc3_top100[["deseq"]][["downs"]][["failure_vs_cure"]]

tmrc3_external_de <- all_pairwise(tmrc3_external, model_batch = "svaseq", filter = "simple")
## 
##   Brazil Colombia 
##       21       18
## Removing 4594 low-count genes (14577 remaining).
## Setting 3653 low elements to zero.
## transform_counts: Found 3653 values equal to 0, adding 1 to the matrix.
tmrc3_external_table <- combine_de_tables(tmrc3_external_de, excel = "excel/tmrc3_scott_biopsies.xlsx")
tmrc3_external_sig <- extract_significant_genes(tmrc3_external_table, excel = "excel/tmrc3_scott_biopsies_sig.xlsx")

tmrc3_external_cf <- set_expt_conditions(tmrc3_external, fact = "finaloutcome") %>%
  set_expt_batches(fact = "lab")
## The numbers of samples by condition are:
## 
## failure    cure 
##      12      27
## The number of samples by batch are:
## 
##   Brazil Colombia 
##       21       18
tmrc3_external_cf_norm <- normalize_expt(tmrc3_external_cf, filter = TRUE, norm = "quant", convert = "cpm", transform = "log2")
## Removing 6904 low-count genes (14577 remaining).
## transform_counts: Found 18 values equal to 0, adding 1 to the matrix.
plot_pca(tmrc3_external_cf_norm)
## The result of performing a fast_svd dimension reduction.
## The x-axis is PC1 and the y-axis is PC2
## Colors are defined by failure, cure
## Shapes are defined by Brazil, Colombia.

tmrc3_external_cf_nb <- normalize_expt(tmrc3_external_cf, filter = TRUE, batch = "svaseq", convert = "cpm", transform = "log2")
## Removing 6904 low-count genes (14577 remaining).
## Setting 1515 low elements to zero.
## transform_counts: Found 1515 values equal to 0, adding 1 to the matrix.
plot_pca(tmrc3_external_cf_nb)
## The result of performing a fast_svd dimension reduction.
## The x-axis is PC1 and the y-axis is PC2
## Colors are defined by failure, cure
## Shapes are defined by Brazil, Colombia.

tmrc3_external_cf_de <- all_pairwise(tmrc3_external_cf, model_batch = "svaseq", filter = TRUE)
## 
## failure    cure 
##      12      27
## Removing 0 low-count genes (14577 remaining).
## Setting 1515 low elements to zero.
## transform_counts: Found 1515 values equal to 0, adding 1 to the matrix.
tmrc3_external_cf_de
## A pairwise differential expression with results from: basic, deseq, ebseq, edger, limma, noiseq.
## This used a surrogate/batch estimate from: svaseq.
## The primary analysis performed 15 comparisons.
## The logFC agreement among the methods follows:
##                 falr_vs_cr
## limma_vs_deseq      0.7961
## limma_vs_edger      0.8569
## limma_vs_ebseq      0.7870
## limma_vs_basic      0.9167
## limma_vs_noiseq    -0.8305
## deseq_vs_edger      0.9500
## deseq_vs_ebseq      0.9092
## deseq_vs_basic      0.7726
## deseq_vs_noiseq    -0.7365
## edger_vs_ebseq      0.9177
## edger_vs_basic      0.8165
## edger_vs_noiseq    -0.7909
## ebseq_vs_basic      0.8250
## ebseq_vs_noiseq    -0.7993
## basic_vs_noiseq    -0.9183
tmrc3_external_cf_table <- combine_de_tables(tmrc3_external_cf_de, excel = "excel/tmrc3_scott_cf_table.xlsx")
tmrc3_external_cf_table
## A set of combined differential expression results.
##             table deseq_sigup deseq_sigdown edger_sigup edger_sigdown
## 1 failure_vs_cure          37           127          38            91
##   limma_sigup limma_sigdown
## 1           7             0
## `geom_line()`: Each group consists of only one observation.
## i Do you need to adjust the group aesthetic?
## Plot describing unique/shared genes in a differential expression table.

tmrc3_external_cf_sig <- extract_significant_genes(tmrc3_external_cf_table, excel = "excel/tmrc3_scott_cf_sig.xlsx")
tmrc3_external_cf_sig
## A set of genes deemed significant according to limma, edger, deseq, ebseq, basic.
## The parameters defining significant were:
## LFC cutoff: 1 adj P cutoff: 0.05
##                 limma_up limma_down edger_up edger_down deseq_up deseq_down
## failure_vs_cure        7          0       38         91       37        127
##                 ebseq_up ebseq_down basic_up basic_down
## failure_vs_cure        3          6        0          0

tmrc3_external_species <- set_expt_conditions(tmrc3_external, fact = "ParasiteSpecies") %>%
  set_expt_colors(color_choices[["parasite"]])
## The numbers of samples by condition are:
## 
## lvbraziliensis   lvpanamensis  notapplicable 
##             22             14              3
## Warning in set_expt_colors(., color_choices[["parasite"]]): Colors for the
## following categories are not being used: lvguyanensis.

18 Compare the l2FC values

Let us look at the top/bottom 100 genes of these two datasets and see if they have any similarities.

Note to self, set up s4 dispatch on compare_de_tables!

compared <- compare_de_tables(only_tmrc3_table, external_table, first_table = 1, second_table = 1)
compared$scatter

compared$correlation
## 
##  Pearson's product-moment correlation
## 
## data:  df[[xcol]] and df[[ycol]]
## t = 14, df = 13240, p-value <2e-16
## alternative hypothesis: true correlation is not equal to 0
## 95 percent confidence interval:
##  0.1033 0.1369
## sample estimates:
##    cor 
## 0.1201
tmp <- loadme(filename = savefile)
LS0tCnRpdGxlOiAiVE1SQzMgYHIgU3lzLmdldGVudignVkVSU0lPTicpYDogRGlmZmVyZW50aWFsIEV4cHJlc3Npb24gYW5hbHlzZXMsIFR1bWFjbyBvbmx5LiIKYXV0aG9yOiAiYXRiIGFiZWxld0BnbWFpbC5jb20iCmRhdGU6ICJgciBTeXMuRGF0ZSgpYCIKcnVudGltZTogc2hpbnkKb3V0cHV0OgogIGh0bWxfZG9jdW1lbnQ6CiAgICBjb2RlX2Rvd25sb2FkOiB0cnVlCiAgICBjb2RlX2ZvbGRpbmc6IHNob3cKICAgIGZpZ19jYXB0aW9uOiB0cnVlCiAgICBmaWdfaGVpZ2h0OiA3CiAgICBmaWdfd2lkdGg6IDcKICAgIGhpZ2hsaWdodDogemVuYnVybgogICAga2VlcF9tZDogZmFsc2UKICAgIG1vZGU6IHNlbGZjb250YWluZWQKICAgIG51bWJlcl9zZWN0aW9uczogdHJ1ZQogICAgc2VsZl9jb250YWluZWQ6IHRydWUKICAgIHRoZW1lOiByZWFkYWJsZQogICAgdG9jOiB0cnVlCiAgICB0b2NfZmxvYXQ6CiAgICAgIGNvbGxhcHNlZDogZmFsc2UKICAgICAgc21vb3RoX3Njcm9sbDogZmFsc2UKLS0tCgo8c3R5bGUgdHlwZT0idGV4dC9jc3MiPgpib2R5IC5tYWluLWNvbnRhaW5lciB7CiAgbWF4LXdpZHRoOiAxNjAwcHg7Cn0KYm9keSwgdGQgewogIGZvbnQtc2l6ZTogMTZweDsKfQpjb2RlLnJ7CiAgZm9udC1zaXplOiAxNnB4Owp9CnByZSB7CiAgZm9udC1zaXplOiAxNnB4Cn0KPC9zdHlsZT4KCmBgYHtyIG9wdGlvbnMsIGluY2x1ZGU9RkFMU0V9CmxpYnJhcnkoaHBnbHRvb2xzKQpsaWJyYXJ5KGRwbHlyKQpsaWJyYXJ5KGZvcmNhdHMpCmxpYnJhcnkoZ2x1ZSkKIyMgbGlicmFyeShET1NFKSAgIyMgSWYgSSBjYW5ub3QgZ2V0IHRoZSBkYXJuIGltcG9ydENsYXNzZXNGcm9tIHdvcmtpbmcgcmlnaHQganVzdCBsaWJyYXJ5IGl0Li4uCgprbml0cjo6b3B0c19rbml0JHNldChwcm9ncmVzcyA9IFRSVUUsIHZlcmJvc2UgPSBUUlVFLCB3aWR0aCA9IDkwLCBlY2hvID0gVFJVRSkKa25pdHI6Om9wdHNfY2h1bmskc2V0KAogIGVycm9yID0gVFJVRSwgZmlnLndpZHRoID0gOCwgZmlnLmhlaWdodCA9IDgsIGZpZy5yZXRpbmEgPSAyLAogIG91dC53aWR0aCA9ICIxMDAlIiwgZGV2ID0gInBuZyIsCiAgZGV2LmFyZ3MgPSBsaXN0KHBuZyA9IGxpc3QodHlwZSA9ICJjYWlyby1wbmciKSkpCm9sZF9vcHRpb25zIDwtIG9wdGlvbnMoZGlnaXRzID0gNCwgc3RyaW5nc0FzRmFjdG9ycyA9IEZBTFNFLCBrbml0ci5kdXBsaWNhdGUubGFiZWwgPSAiYWxsb3ciKQpnZ3Bsb3QyOjp0aGVtZV9zZXQoZ2dwbG90Mjo6dGhlbWVfYncoYmFzZV9zaXplID0gMTIpKQp2ZXIgPC0gU3lzLmdldGVudigiVkVSU0lPTiIpCnByZXZpb3VzX2ZpbGUgPC0gIiIKcnVuZGF0ZSA8LSBmb3JtYXQoU3lzLkRhdGUoKSwgZm9ybWF0ID0gIiVZJW0lZCIpCgojI3RtcCA8LSB0cnkoc20obG9hZG1lKGZpbGVuYW1lID0gZ3N1YihwYXR0ZXJuID0gIlxcLlJtZCIsIHJlcGxhY2UgPSAiXFwucmRhXFwueHoiLCB4ID0gcHJldmlvdXNfZmlsZSkpKSkKcm1kX2ZpbGUgPC0gZ2x1ZSgidG1yYzNfZGlmZmVyZW50aWFsX2V4cHJlc3Npb25fdHVtYWNvX3t2ZXJ9LlJtZCIpCnNhdmVmaWxlIDwtIGdzdWIocGF0dGVybiA9ICJcXC5SbWQiLCByZXBsYWNlID0gIlxcLnJkYVxcLnh6IiwgeCA9IHJtZF9maWxlKQpsb2FkZWQgPC0gbG9hZChmaWxlID0gZ2x1ZSgicmRhL3RtcmMzX2RhdGFfc3RydWN0dXJlcy12e3Zlcn0ucmRhIikpCnhsc3hfcHJlZml4IDwtICJhbmFseXNlcy80X3R1bWFjbyIKY2ZfcHJlZml4IDwtIGdsdWUoInt4bHN4X3ByZWZpeH0vREVfQ3VyZV92c19GYWlsIikKYGBgCgojIENoYW5nZWxvZwoKKiAyMDI0MDY6IFdvcmtpbmcgZW50aXJlbHkgb3V0IG9mIHRoZSBjb250YWluZXIgbm93LCBzZXBhcmF0ZWQKICBHU0UvR1NFQSBhbmFseXNlcy4KKiAyMDIzMDk6IERpc2FibGVkIEdTVkEgYW5hbHlzZXMgdW50aWwvdW5sZXNzIHdlIGdldCBwZXJtaXNzaW9uIHRvCiAgaW5jbHVkZSB0aGUgbVNpZ0RCIDcuNS4xIHJlbGVhc2UuICBJIHdpbGwgc2ltcGxpZnkgdGhlIGZpbGVuYW1lcyBzbwogIHRoYXQgb25lIG1heSBlYXNpbHkgZHJvcCBpbiBhIGRvd25sb2FkZWQgY29weSBvZiB0aGUgZGF0YSBhbmQgcnVuCiAgdGhvc2UgYmxvY2tzLiAgVW50aWwgdGhlbiwgSSBndWVzcyB5b3Ugd2lsbCBoYXZlIHRvIHRydXN0IG1lIHdoZW4gSQogIHNheSB0aG9zZSBibG9ja3MgYWxsIHdvcms/CiogMjAyMzA5OiBNb3ZlZCBhbGwgR2VuZSBzZXQgZW5yaWNobWVudCBhbmFseXNlcyB0byAwNGxydF9nc2VhX2dzdmEuUm1kCiogMjAyMzA5IG5leHQgZGF5OiBNb3ZpbmcgR2VuZSBzZXQgZW5yaWNobWVudCBiYWNrIGJlY2F1c2UgaXQgYWRkcyB0b28gbXVjaAogIGNvbXBsZXhpdHkgdG8gc2F2ZS9yZWxvYWQgdGhlIERFIHJlc3VsdHMgZm9yIGdQcm9maWxlciBhbmQgZnJpZW5kcy4KKiBTdGlsbCBodW50aW5nIGZvciBtZXNzZWQgdXAgY29sb3JzLCBjaGFuZ2VkIGlucHV0IGRhdGEgdG8gbWF0Y2ggbmV3IHZlcnNpb24uCgojIEludHJvZHVjdGlvbgoKVGhlIHZhcmlvdXMgZGlmZmVyZW50aWFsIGV4cHJlc3Npb24gYW5hbHlzZXMgb2YgdGhlIGRhdGEgZ2VuZXJhdGVkIGluIHRtcmMzX2RhdGFzZXRzCndpbGwgb2NjdXIgaW4gdGhpcyBkb2N1bWVudC4KCiMjIERlZmluZSBjb250cmFzdHMgZm9yIERFIGFuYWx5c2VzCgpFYWNoIG9mIHRoZSBmb2xsb3dpbmcgbGlzdHMgZGVzY3JpYmVzIHRoZSBzZXQgb2YgY29udHJhc3RzIHRoYXQgSQp0aGluayBhcmUgaW50ZXJlc3RpbmcgZm9yIHRoZSB2YXJpb3VzIHdheXMgb25lIG1pZ2h0IGNvbnNpZGVyIHRoZQpUTVJDMyBkYXRhc2V0LiAgVGhlIHZhcmlhYmxlcyBhcmUgbmFtZWQgYWNjb3JkaW5nIHRvIHRoZSBhc3N1bWVkIGRhdGEKd2l0aCB3aGljaCB0aGV5IHdpbGwgYmUgdXNlZCwgdGh1cyB0Y19jZl9jb250cmFzdHMgaXMgZXhwZWN0ZWQgdG8gYmUKdXNlZCBmb3IgdGhlIFR1bWFjbytDYWxpIGRhdGEgYW5kIHByb3ZpZGUgYSBzZXJpZXMgb2YgY3VyZS9mYWlsCmNvbXBhcmlzb25zIHdoaWNoICh0byB0aGUgZXh0ZW50IHBvc3NpYmxlKSBhY3Jvc3MgYm90aCBsb2NhdGlvbnMuICBJbgpldmVyeSBjYXNlLCB0aGUgbmFtZSBvZiB0aGUgbGlzdCBlbGVtZW50IHdpbGwgYmUgdXNlZCBhcyB0aGUgY29udHJhc3QKbmFtZSwgYW5kIHdpbGwgdGh1cyBiZSBzZWVuIGFzIHRoZSBzaGVldCBuYW1lIGluIHRoZSBvdXRwdXQgeGxzeApmaWxlKHMpOyB0aGUgdHdvIHBpZWNlcyBvZiB0aGUgY2hhcmFjdGVyIHZlY3RvciB2YWx1ZSBhcmUgdGhlCm51bWVyYXRvciBhbmQgZGVub21pbmF0b3Igb2YgdGhlIGFzc29jaWF0ZWQgY29udHJhc3QuCgojIyBHZW5lIHNldCBlbnJpY2htZW50CgpUaGUgR2VuZSBzZXQgZW5yaWNobWVudCB3aWxsIGZvbGxvdyBlYWNoIERFIGFuYWx5c2lzIGR1cmluZyB0aGlzCmRvY3VtZW50LiAgSSBhbSBhZGRpbmcgYSBzZXJpZXMgb2YgZXhwbGljaXRseSBHU0VBIGFuYWx5c2VzIGluIHRoaXMKbW9zdCByZWNlbnQgaXRlcmF0aW9uLCBpbiB0aGVzZSBJIHdpbGwgcGFzcyB0aGUgZnVsbCBERSB0YWJsZSBhbmQKY2hlY2sgdGhlIGRpc3RyaWJ1dGlvbiBvZiBsb2dGQyB2YWx1ZXMgYWdhaW5zdCB0aGUgZ2VuZXMgaW4gZWFjaApjYXRlZ29yeSBhcyBvcHBvc2VkIHRvIHRoZSBzaW1wbGVyIG92ZXItZW5yaWNobWVudCBvZiB0aGUgaGlnaC9sb3cgREUKdmFsdWVzLgoKTW9zdCAoYWxsPykgb2YgdGhlIEdlbmUgc2V0IGVucmljaG1lbnQgYW5hbHlzZXMgdXNlZCBpbiB0aGlzIHBhcGVyIHdlcmUgZG9uZSB2aWEKZ1Byb2ZpbGVyIHJhdGhlciB0aGFuIGdvc2VxL2NsdXN0ZXJQcm9maWxlci90b3BHTy9HT3N0YXRzLiAgUHJpbWFyaWx5CmJlY2F1c2UgaXQgaXMgc28gZWFzeSB0byBpbnZva2UgZ3Byb2ZpbGVyLgoKYGBge3J9CmNsaW5pY19jb250cmFzdHMgPC0gbGlzdCgKICAiY2xpbmljcyIgPSBjKCJDYWxpIiwgIlR1bWFjbyIpKQojIyBJbiBzb21lIGNhc2VzIHdlIGhhdmUgbm8gQ2FsaSBmYWlsdXJlIHNhbXBsZXMsIHNvIHRoZXJlIHJlbWFpbiBvbmx5IDIKIyMgY29udHJhc3RzIHRoYXQgYXJlIGxpa2VseSBvZiBpbnRlcmVzdAp0Y19jZl9jb250cmFzdHMgPC0gbGlzdCgKICAidHVtYWNvIiA9IGMoIlR1bWFjb2ZhaWx1cmUiLCAiVHVtYWNvY3VyZSIpLAogICJjdXJlIiA9IGMoIlR1bWFjb2N1cmUiLCAiQ2FsaWN1cmUiKSkKIyMgSW4gb3RoZXIgY2FzZXMsIHdlIGhhdmUgY3VyZS9mYWlsIGZvciBib3RoIHBsYWNlcy4KY2xpbmljX2NmX2NvbnRyYXN0cyA8LSBsaXN0KAogICJjYWxpIiA9IGMoIkNhbGlmYWlsdXJlIiwgIkNhbGljdXJlIiksCiAgInR1bWFjbyIgPSBjKCJUdW1hY29mYWlsdXJlIiwgIlR1bWFjb2N1cmUiKSwKICAiY3VyZSIgPSBjKCJUdW1hY29jdXJlIiwgIkNhbGljdXJlIiksCiAgImZhaWwiID0gYygiVHVtYWNvZmFpbHVyZSIsICJDYWxpZmFpbHVyZSIpKQpjZl9jb250cmFzdCA8LSBsaXN0KAogICJvdXRjb21lIiA9IGMoIlR1bWFjb2ZhaWx1cmUiLCAiVHVtYWNvY3VyZSIpKQp0X2NmX2NvbnRyYXN0IDwtIGxpc3QoCiAgIm91dGNvbWUiID0gYygiZmFpbHVyZSIsICJjdXJlIikpCnZpc2l0Y2ZfY29udHJhc3RzIDwtIGxpc3QoCiAgInYxY2YiID0gYygidjFmYWlsdXJlIiwgInYxY3VyZSIpLAogICJ2MmNmIiA9IGMoInYyZmFpbHVyZSIsICJ2MmN1cmUiKSwKICAidjNjZiIgPSBjKCJ2M2ZhaWx1cmUiLCAidjNjdXJlIikpCnZpc2l0X2NvbnRyYXN0cyA8LSBsaXN0KAogICJ2MnYxIiA9IGMoImMyIiwgImMxIiksCiAgInYzdjEiID0gYygiYzMiLCAiYzEiKSwKICAidjN2MiIgPSBjKCJjMyIsICJjMiIpKQp2aXNpdF92MWxhdGVyIDwtIGxpc3QoCiAgImxhdGVyX3ZzX2ZpcnN0IiA9IGMoImxhdGVyIiwgImZpcnN0IikpCmNlbGx0eXBlcyA8LSBsaXN0KAogICJlb19tb25vIiA9IGMoImVvc2lub3BoaWxzIiwgIm1vbm9jeXRlcyIpLAogICJuZV9tb25vIiA9IGMoIm5ldXRyb3BoaWxzIiwgIm1vbm9jeXRlcyIpLAogICJlb19uZSIgPSBjKCJlb3Npbm9waGlscyIsICJuZXV0cm9waGlscyIpKQpldGhuaWNpdHlfY29udHJhc3RzIDwtIGxpc3QoCiAgIm1lc3Rpem9faW5kaWdlbm91cyIgPSBjKCJtZXN0aXphIiwgImluZGlnZW5hIiksCiAgIm1lc3Rpem9fYWZyb2NvbCIgPSBjKCJtZXN0aXphIiwgImFmcm9jb2wiKSwKICAiaW5kaWdlbm91c19hZnJvY29sIiA9IGMoImluZGlnZW5hIiwgImFmcm9jb2wiKSkKYGBgCgojIE9ubHkgVHVtYWNvIHNhbXBsZXMKClN0YXJ0IG92ZXIsIHRoaXMgdGltZSB3aXRoIG9ubHkgdGhlIHNhbXBsZXMgZnJvbSBUdW1hY28uICBXZSBjdXJyZW50bHkKYXJlIGFzc3VtaW5nIHRoZXNlIHdpbGwgcHJvdmUgdG8gYmUgdGhlIG9ubHkgYW5hbHlzZXMgdXNlZCBmb3IgZmluYWwKaW50ZXJwcmV0YXRpb24uICBUaGlzIGlzIHByaW1hcmlseSBiZWNhdXNlIHdlIGhhdmUgaW5zdWZmaWNpZW50CmZhaWxlZCB0cmVhdG1lbnQgc2FtcGxlcyBmcm9tIENhbGkuCgojIyBBbGwgc2FtcGxlcwoKU3RhcnQgYnkgY29uc2lkZXJpbmcgYWxsIFR1bWFjbyBjZWxsIHR5cGVzLiAgTm90ZSB0aGF0IGluIHRoaXMgY2FzZSB3ZQpvbmx5IHVzZSBTVkEsIHByaW1hcmlseSBiZWNhdXNlIEkgYW0gbm90IGNlcnRhaW4gd2hhdCB3b3VsZCBiZSBhbgphcHByb3ByaWF0ZSBiYXRjaCBmYWN0b3IsIHBlcmhhcHMgdmlzaXQ/CgpgYGB7cn0KdF9jZl9jbGluaWNhbF9kZV9zdmEgPC0gYWxsX3BhaXJ3aXNlKHRfY2xpbmljYWwsIG1vZGVsX2JhdGNoID0gInN2YXNlcSIsIGZpbHRlciA9IFRSVUUpCnRfY2ZfY2xpbmljYWxfZGVfc3ZhCnRfY2ZfY2xpbmljYWxfdGFibGVfc3ZhIDwtIGNvbWJpbmVfZGVfdGFibGVzKAogIHRfY2ZfY2xpbmljYWxfZGVfc3ZhLCBrZWVwZXJzID0gdF9jZl9jb250cmFzdCwKICBleGNlbCA9IGdsdWUoIntjZl9wcmVmaXh9L0FsbF9TYW1wbGVzL3RfY2xpbmljYWxfY2ZfdGFibGVzX3N2YS12e3Zlcn0ueGxzeCIpKQp0X2NmX2NsaW5pY2FsX3RhYmxlX3N2YQp0X2NmX2NsaW5pY2FsX3RhYmxlX3N2YVtbInBsb3RzIl1dW1sib3V0Y29tZSJdXVtbImRlc2VxX21hX3Bsb3RzIl1dCnRfY2ZfY2xpbmljYWxfc2lnX3N2YSA8LSBleHRyYWN0X3NpZ25pZmljYW50X2dlbmVzKAogIHRfY2ZfY2xpbmljYWxfdGFibGVfc3ZhLAogIGV4Y2VsID0gZ2x1ZSgie2NmX3ByZWZpeH0vQWxsX1NhbXBsZXMvdF9jbGluaWNhbF9jZl9zaWdfc3ZhLXZ7dmVyfS54bHN4IikpCnRfY2ZfY2xpbmljYWxfc2lnX3N2YQoKZGltKHRfY2ZfY2xpbmljYWxfc2lnX3N2YSRkZXNlcSR1cHNbWzFdXSkKZGltKHRfY2ZfY2xpbmljYWxfc2lnX3N2YSRkZXNlcSRkb3duc1tbMV1dKQpgYGAKCiMjIGdQcm9maWxlciBzZWFyY2ggb2YgYWxsIFR1bWFjbyBzYW1wbGVzCgpUaGUgZm9sbG93aW5nIGdQcm9maWxlciBzZWFyY2hlcyB1c2UgdGhlIGFsbF9ncHJvZmlsZXIoKSBmdW5jdGlvbgppbnN0ZWFkIG9mIHNpbXBsZV9ncHJvZmlsZXIoKS4gIEFzIGEgcmVzdWx0LCB0aGUgcmVzdWx0cyBhcmUgc2VwYXJhdGVkCmJ5IHtjb250cmFzdH1fe2RpcmVjdGlvbn0uICBUaHVzICdvdXRjb21lX2Rvd24nLgoKVGhlIHNhbWUgcGxvdHMgYXJlIGF2YWlsYWJsZSBhcyB0aGUgcHJldmlvdXMgZ1Byb2ZpbGVyIHNlYXJjaGVzLCBidXQKaW4gbWFueSBvZiB0aGUgZm9sbG93aW5nIHJ1bnMsIEkgdXNlZCB0aGUgZG90cGxvdCgpIGZ1bmN0aW9uIHRvIGdldCBhCnNsaWdodGx5IGRpZmZlcmVudCB2aWV3IG9mIHRoZSByZXN1bHRzLgoKYGBge3J9CnRfY2ZfY2xpbmljYWxfZ3AgPC0gYWxsX2dwcm9maWxlcih0X2NmX2NsaW5pY2FsX3NpZ19zdmEpCnRfY2ZfY2xpbmljYWxfZ3AKCndyaXR0ZW4gPC0gd3JpdGVfZ3Byb2ZpbGVyX2RhdGEoCiAgdF9jZl9jbGluaWNhbF9ncFtbIm91dGNvbWVfdXAiXV0sCiAgZXhjZWwgPSBnbHVlKCJ7eGxzeF9wcmVmaXh9L0dlbmUgc2V0IGVucmljaG1lbnQvY2xpbmljYWxfY3VyZV91cC12e3Zlcn0ueGxzeCIpKQp3cml0dGVuIDwtIHdyaXRlX2dwcm9maWxlcl9kYXRhKAogIHRfY2ZfY2xpbmljYWxfZ3BbWyJvdXRjb21lX2Rvd24iXV0sCiAgZXhjZWwgPSBnbHVlKCJ7eGxzeF9wcmVmaXh9L0dlbmUgc2V0IGVucmljaG1lbnQvY2xpbmljYWxfY3VyZV9kb3duLXZ7dmVyfS54bHN4IikpCiMjIFdpa2lwYXRod2F5cyBvZiB0aGUgdXAgYy9mIGdlbmVzCmVucmljaHBsb3Q6OmRvdHBsb3QodF9jZl9jbGluaWNhbF9ncFtbIm91dGNvbWVfdXAiXV1bWyJXUF9lbnJpY2giXV0pCgojIyBUcmFuc2NyaXB0aW9uIGZhY3RvciBkYXRhYmFzZSBvZiB0aGUgdXAgYy9mIGdlbmVzCmVucmljaHBsb3Q6OmRvdHBsb3QodF9jZl9jbGluaWNhbF9ncFtbIm91dGNvbWVfdXAiXV1bWyJURl9lbnJpY2giXV0pCgojIyBSZWFjdG9tZSBvZiB0aGUgdXAgYy9mIGdlbmVzCmVucmljaHBsb3Q6OmRvdHBsb3QodF9jZl9jbGluaWNhbF9ncFtbIm91dGNvbWVfdXAiXV1bWyJSRUFDX2VucmljaCJdXSkKCiMjIEdPIG9mIHRoZSBkb3duIGMvZiBnZW5lcwplbnJpY2hwbG90Ojpkb3RwbG90KHRfY2ZfY2xpbmljYWxfZ3BbWyJvdXRjb21lX2Rvd24iXV1bWyJHT19lbnJpY2giXV0pCnRfY2ZfY2xpbmljYWxfZ3BbWyJvdXRjb21lX3VwIl1dW1sicHZhbHVlX3Bsb3RzIl1dW1siQlAiXV0KCiMjIFJlYWN0b21lIG9mIHRoZSBkb3duIGMvZiBnZW5lcwplbnJpY2hwbG90Ojpkb3RwbG90KHRfY2ZfY2xpbmljYWxfZ3BbWyJvdXRjb21lX2Rvd24iXV1bWyJHT19lbnJpY2giXV0pCmVucmljaHBsb3Q6OmRvdHBsb3QodF9jZl9jbGluaWNhbF9ncFtbIm91dGNvbWVfdXAiXV1bWyJHT19lbnJpY2giXV0pCmBgYAoKIyMgY2x1c3RlclByb2ZpbGVyIHNlYXJjaCBvZiBhbGwgVHVtYWNvIHNhbXBsZXMKCmBgYHtyfQp0X2NmX2NsaW5pY2FsX2dwIDwtIGFsbF9jcHJvZmlsZXIodF9jZl9jbGluaWNhbF9zaWdfc3ZhLCB0X2NmX2NsaW5pY2FsX3RhYmxlX3N2YSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZ2RiID0gIm9yZy5Icy5lZy5kYiIpCgoKYGBgCgojIFZpc2l0IGNvbXBhcmlzb25zCgpMYXRlciBpbiB0aGlzIGRvY3VtZW50IEkgZG8gYSBidW5jaCBvZiB2aXNpdC9jZiBjb21wYXJpc29ucy4gIEluIHRoaXMKYmxvY2sgSSB3YW50IHRvIGV4cGxpY2l0bHkgb25seSBjb21wYXJlIHYxIHRvIG90aGVyIHZpc2l0cy4gIFRoaXMgaXMKc29tZXRoaW5nIEkgZGlkIHF1aXRlIGEgbG90IGluIHRoZSAyMDE5IGRhdGFzZXRzLCBidXQgbmV2ZXIgYWN0dWFsbHkKbW92ZWQgdG8gdGhpcyBkb2N1bWVudC4KCmBgYHtyfQp0djFfdnNfbGF0ZXIgPC0gYWxsX3BhaXJ3aXNlKHRfdjF2cywgbW9kZWxfYmF0Y2ggPSAic3Zhc2VxIiwgZmlsdGVyID0gVFJVRSkKdHYxX3ZzX2xhdGVyCnR2MV92c19sYXRlcl90YWJsZSA8LSBjb21iaW5lX2RlX3RhYmxlcygKICB0djFfdnNfbGF0ZXIsIGtlZXBlcnMgPSB2aXNpdF92MWxhdGVyLAogIGV4Y2VsID0gZ2x1ZSgie3hsc3hfcHJlZml4fS9ERV9WaXNpdHMvdHYxX3ZzX2xhdGVyX3RhYmxlcy12e3Zlcn0ueGxzeCIpKQp0djFfdnNfbGF0ZXJfdGFibGUKdHYxX3ZzX2xhdGVyX3NpZyA8LSBleHRyYWN0X3NpZ25pZmljYW50X2dlbmVzKAogIHR2MV92c19sYXRlcl90YWJsZSwKICBleGNlbCA9IGdsdWUoInt4bHN4X3ByZWZpeH0vREVfVmlzaXRzL3R2MV92c19sYXRlcl9zaWctdnt2ZXJ9Lnhsc3giKSkKdHYxX3ZzX2xhdGVyX3NpZwpgYGAKCiMjIyMgR2VuZSBzZXQgZW5yaWNobWVudDogVjEgdnMgb3RoZXIgdmlzaXRzLgoKYGBge3J9CnR2MWxhdGVyX2dwIDwtIGFsbF9ncHJvZmlsZXIodHYxX3ZzX2xhdGVyX3NpZykKdHYxbGF0ZXJfZ3AKCnR2MWxhdGVyX2dwW1sxXV0kcHZhbHVlX3Bsb3RzJEJQCnR2MWxhdGVyX2dwW1syXV0kcHZhbHVlX3Bsb3RzJEJQCmBgYAoKIyBTZXggY29tcGFyaXNvbgoKYGBge3J9CnRfc2V4IDwtIHN1YnNldF9leHB0KHRjX3NleCwgc3Vic2V0ID0gImNsaW5pYyA9PSAnVHVtYWNvJyIpCnRfc2V4CnRfc2V4X2RlIDwtIGFsbF9wYWlyd2lzZSh0X3NleCwgbW9kZWxfYmF0Y2ggPSAic3Zhc2VxIiwgZmlsdGVyID0gVFJVRSkKdF9zZXhfZGUKdF9zZXhfdGFibGUgPC0gY29tYmluZV9kZV90YWJsZXMoCiAgdF9zZXhfZGUsIGV4Y2VsID0gZ2x1ZSgie3hsc3hfcHJlZml4fS9HZW5lIHNldCBlbnJpY2htZW50L3Rfc2V4X3RhYmxlLXZ7dmVyfS54bHN4IikpCnRfc2V4X3RhYmxlCnRfc2V4X3NpZyA8LSBleHRyYWN0X3NpZ25pZmljYW50X2dlbmVzKAogIHRfc2V4X3RhYmxlLCBleGNlbCA9IGdsdWUoInt4bHN4X3ByZWZpeH0vR2VuZSBzZXQgZW5yaWNobWVudC90X3NleF9zaWctdnt2ZXJ9Lnhsc3giKSkKdF9zZXhfc2lnCmBgYAoKIyMjIyBHZW5lIHNldCBlbnJpY2htZW50OiBDb21wYXJpbmcgVHVtYWNvIE0vRgoKTGV0IHVzIHNlZSBpZiB3ZSBvYnNlcnZlIGdlbmVyYWwgbWFsZS9mZW1hbGUgZGlmZmVyZW5jZXMgaW4gdGhlIGRhdGEuClRoaXMgaGFzIGFuIGltcG9ydGFudCBjYXZlYXQ6IHRoZXJlIGFyZSBmZXcgZmVtYWxlIGZhaWx1cmVzIGluIHRoZQpkYXRhc2V0IGFuZCBzbyB0aGUgcmVzdWx0cyBtYXkgcmVmbGVjdCB0aGF0LgoKYGBge3J9CnRfc2V4X2dwIDwtIGFsbF9ncHJvZmlsZXIodF9zZXhfc2lnKQp0X3NleF9ncAoKd3JpdHRlbiA8LSB3cml0ZV9ncHJvZmlsZXJfZGF0YSgKICB0X3NleF9ncFtbMV1dLAogIGV4Y2VsID0gZ2x1ZSgie3hsc3hfcHJlZml4fS9HZW5lIHNldCBlbnJpY2htZW50L3NleF9mZW1hbGVfdXAtdnt2ZXJ9Lnhsc3giKSkKd3JpdHRlbiA8LSB3cml0ZV9ncHJvZmlsZXJfZGF0YSgKICB0X3NleF9ncFtbMl1dLAogIGV4Y2VsID0gZ2x1ZSgie3hsc3hfcHJlZml4fS9HZW5lIHNldCBlbnJpY2htZW50L3NleF9tYWxlX3VwLXZ7dmVyfS54bHN4IikpCmBgYAoKYGBge3J9CnRjX3NleF9jdXJlIDwtIHN1YnNldF9leHB0KHRjX3NleCwgc3Vic2V0ID0gImZpbmFsb3V0Y29tZT09J2N1cmUnIikKdF9zZXhfY3VyZSA8LSBzdWJzZXRfZXhwdCh0Y19zZXhfY3VyZSwgc3Vic2V0ID0gImNsaW5pYyA9PSAnVHVtYWNvJyIpCgp0X3NleF9jdXJlX2RlIDwtIGFsbF9wYWlyd2lzZSh0X3NleF9jdXJlLCBtb2RlbF9iYXRjaCA9ICJzdmFzZXEiLCBmaWx0ZXIgPSBUUlVFKQp0X3NleF9jdXJlX2RlCnRfc2V4X2N1cmVfdGFibGUgPC0gY29tYmluZV9kZV90YWJsZXMoCiAgdF9zZXhfY3VyZV9kZSwgZXhjZWwgPSBnbHVlKCJ7eGxzeF9wcmVmaXh9L0RFX1NleC90X3NleF9jdXJlX3RhYmxlLXZ7dmVyfS54bHN4IikpCnRfc2V4X2N1cmVfdGFibGUKdF9zZXhfY3VyZV9zaWcgPC0gZXh0cmFjdF9zaWduaWZpY2FudF9nZW5lcygKICB0X3NleF9jdXJlX3RhYmxlLCBleGNlbCA9IGdsdWUoInt4bHN4X3ByZWZpeH0vREVfU2V4L3Rfc2V4X2N1cmVfc2lnLXZ7dmVyfS54bHN4IikpCnRfc2V4X2N1cmVfc2lnCmBgYAoKIyMjIyMgR2VuZSBzZXQgZW5yaWNobWVudDogVHVtYWNvIGNvbXBhcmlzb25zIG9mIE0vRgoKYGBge3J9CnRfc2V4X2N1cmVfZ3AgPC0gYWxsX2dwcm9maWxlcih0X3NleF9jdXJlX3NpZykKdF9zZXhfY3VyZV9ncApgYGAKCiMgRXRobmljaXR5IGNvbXBhcmlzb25zCgpgYGB7cn0KdF9ldGhuaWNpdHlfZGUgPC0gYWxsX3BhaXJ3aXNlKHRfZXRuaWFfZXhwdCwgbW9kZWxfYmF0Y2ggPSAic3Zhc2VxIiwgZmlsdGVyID0gVFJVRSkKdF9ldGhuaWNpdHlfZGUKdF9ldGhuaWNpdHlfdGFibGUgPC0gY29tYmluZV9kZV90YWJsZXMoCiAga2VlcGVycyA9IGV0aG5pY2l0eV9jb250cmFzdHMsCiAgdF9ldGhuaWNpdHlfZGUsIGV4Y2VsID0gZ2x1ZSgie3hsc3hfcHJlZml4fS9ERV9FdGhuaWNpdHkvdF9ldGhuaWNpdHlfdGFibGUtdnt2ZXJ9Lnhsc3giKSkKdF9ldGhuaWNpdHlfdGFibGUKdF9ldGhuaWNpdHlfc2lnIDwtIGV4dHJhY3Rfc2lnbmlmaWNhbnRfZ2VuZXMoCiAgdF9ldGhuaWNpdHlfdGFibGUsIGV4Y2VsID0gZ2x1ZSgie3hsc3hfcHJlZml4fS9ERV9FdGhuaWNpdHkvdF9ldGhuaWNpdHlfc2lnLXZ7dmVyfS54bHN4IikpCnRfZXRobmljaXR5X3NpZwpgYGAKCiMjIyMgR2VuZSBzZXQgZW5yaWNobWVudDogRXRobmljaXR5IGRpZmZlcmVuY2VzCgpQZXJmb3JtZWQgb25jZSB3aXRoIGJvdGggY2xpbmljcyBhbmQgYWdhaW4gd2l0aCBvbmx5IFR1bWFjby4KCmBgYHtyfQp0X2V0aG5pY2l0eV9ncCA8LSBhbGxfZ3Byb2ZpbGVyKHRfZXRobmljaXR5X3NpZykKdF9ldGhuaWNpdHlfZ3AKCndyaXR0ZW4gPC0gd3JpdGVfZ3Byb2ZpbGVyX2RhdGEoCiAgdF9ldGhuaWNpdHlfZ3BbWzFdXSwKICBleGNlbCA9IGdsdWUoInt4bHN4X3ByZWZpeH0vR2VuZSBzZXQgZW5yaWNobWVudC9ldGhuaWNpdHlfbWlfdXAtdnt2ZXJ9Lnhsc3giKSkKd3JpdHRlbiA8LSB3cml0ZV9ncHJvZmlsZXJfZGF0YSgKICB0X2V0aG5pY2l0eV9ncFtbMl1dLAogIGV4Y2VsID0gZ2x1ZSgie3hsc3hfcHJlZml4fS9HZW5lIHNldCBlbnJpY2htZW50L2V0aG5pY2l0eV9taV9kb3duLXZ7dmVyfS54bHN4IikpCndyaXR0ZW4gPC0gd3JpdGVfZ3Byb2ZpbGVyX2RhdGEoCiAgdF9ldGhuaWNpdHlfZ3BbWzNdXSwKICBleGNlbCA9IGdsdWUoInt4bHN4X3ByZWZpeH0vR2VuZSBzZXQgZW5yaWNobWVudC9ldGhuaWNpdHlfbWFfdXAtdnt2ZXJ9Lnhsc3giKSkKd3JpdHRlbiA8LSB3cml0ZV9ncHJvZmlsZXJfZGF0YSgKICB0X2V0aG5pY2l0eV9ncFtbNF1dLAogIGV4Y2VsID0gZ2x1ZSgie3hsc3hfcHJlZml4fS9HZW5lIHNldCBlbnJpY2htZW50L2V0aG5pY2l0eV9tYV9kb3duLXZ7dmVyfS54bHN4IikpCndyaXR0ZW4gPC0gd3JpdGVfZ3Byb2ZpbGVyX2RhdGEoCiAgdF9ldGhuaWNpdHlfZ3BbWzVdXSwKICBleGNlbCA9IGdsdWUoInt4bHN4X3ByZWZpeH0vR2VuZSBzZXQgZW5yaWNobWVudC9ldGhuaWNpdHlfaWFfdXAtdnt2ZXJ9Lnhsc3giKSkKd3JpdHRlbiA8LSB3cml0ZV9ncHJvZmlsZXJfZGF0YSgKICB0X2V0aG5pY2l0eV9ncFtbNl1dLAogIGV4Y2VsID0gZ2x1ZSgie3hsc3hfcHJlZml4fS9HZW5lIHNldCBlbnJpY2htZW50L2V0aG5pY2l0eV9pYV9kb3duLXZ7dmVyfS54bHN4IikpCmBgYAoKIyMjIyBHZW5lIHNldCBlbnJpY2htZW50OiBFdGhuaWNpdHkgZGlmZmVyZW5jZXMgYW1vbmcgY3VyZXMKCmBgYHtyfQp3cml0dGVuIDwtIHdyaXRlX2dwcm9maWxlcl9kYXRhKAogIHRfZXRobmljaXR5X2dwW1siaW5kaWdlbm91c19hZnJvY29sX2Rvd24iXV0sCiAgZXhjZWwgPSBnbHVlKCJ7eGxzeF9wcmVmaXh9L0dlbmUgc2V0IGVucmljaG1lbnQvZXRobmljaXR5X2Fmcm9jb2xfZG93bi12e3Zlcn0ueGxzeCIpKQpgYGAKCiMjIyBTZXBhcmF0ZSB0aGUgVHVtYWNvIGRhdGEgYnkgdmlzaXQKCk9uZSBvZiB0aGUgbW9zdCBjb21wZWxsaW5nIGlkZWFzIGluIHRoZSBkYXRhIGlzIHRoZSBvcHBvcnR1bml0eSB0bwpmaW5kIGdlbmVzIGluIHRoZSBmaXJzdCB2aXNpdCB3aGljaCBtYXkgaGVscCBwcmVkaWN0IHRoZSBsaWtlbGlob29kCnRoYXQgYSBwZXJzb24gd2lsbCByZXNwb25kIHdlbGwgdG8gdHJlYXRtZW50LiAgVGhlIGZvbGxvd2luZyBibG9jawp3aWxsIHRoZXJlZm9yZSBsb29rIGF0IGN1cmUvZmFpbCBmcm9tIFR1bWFjbyBhdCB2aXNpdCAxLgoKIyMjIyBDdXJlL0ZhaWwsIFR1bWFjbyBWaXNpdCAxCgpgYGB7cn0KdF9jZl9jbGluaWNhbF92MV9kZV9zdmEgPC0gYWxsX3BhaXJ3aXNlKHR2MV9zYW1wbGVzLCBtb2RlbF9iYXRjaCA9ICJzdmFzZXEiLCBmaWx0ZXIgPSBUUlVFKQp0X2NmX2NsaW5pY2FsX3YxX2RlX3N2YQp0X2NmX2NsaW5pY2FsX3YxX3RhYmxlX3N2YSA8LSBjb21iaW5lX2RlX3RhYmxlcygKICB0X2NmX2NsaW5pY2FsX3YxX2RlX3N2YSwga2VlcGVycyA9IHRfY2ZfY29udHJhc3QsCiAgZXhjZWwgPSBnbHVlKCJ7Y2ZfcHJlZml4fS9WaXNpdHMvdF9jbGluaWNhbF92MV9jZl90YWJsZXNfc3ZhLXZ7dmVyfS54bHN4IikpCnRfY2ZfY2xpbmljYWxfdjFfdGFibGVfc3ZhCnRfY2ZfY2xpbmljYWxfdjFfc2lnX3N2YSA8LSBleHRyYWN0X3NpZ25pZmljYW50X2dlbmVzKAogIHRfY2ZfY2xpbmljYWxfdjFfdGFibGVfc3ZhLAogIGV4Y2VsID0gZ2x1ZSgie2NmX3ByZWZpeH0vVmlzaXRzL3RfY2xpbmljYWxfdjFfY2Zfc2lnX3N2YS12e3Zlcn0ueGxzeCIpKQp0X2NmX2NsaW5pY2FsX3YxX3NpZ19zdmEKCmRpbSh0X2NmX2NsaW5pY2FsX3YxX3NpZ19zdmEkZGVzZXEkdXBzW1sxXV0pCmRpbSh0X2NmX2NsaW5pY2FsX3YxX3NpZ19zdmEkZGVzZXEkZG93bnNbWzFdXSkKYGBgCgojIyMjIyBHZW5lIHNldCBlbnJpY2htZW50OiBWMSBnUHJvZmlsZXIgY29tcGFyaXNvbgoKSXQgbG9va3MgbGlrZSB0aGVyZSBhcmUgdmVyeSBmZXcgZ3JvdXBzIGluIHRoZSB2aXNpdCAxIHNpZ25pZmljYW50IGdlbmVzLgoKYGBge3J9CnRfY2ZfY2xpbmljYWxfdjFfc2lnX3N2YV9ncCA8LSBhbGxfZ3Byb2ZpbGVyKHRfY2ZfY2xpbmljYWxfdjFfc2lnX3N2YSkKdF9jZl9jbGluaWNhbF92MV9zaWdfc3ZhX2dwCgojIyBXaWtpcGF0aHdheXMgb2YgdGhlIHVwIGMvZiBnZW5lcwplbnJpY2hwbG90Ojpkb3RwbG90KHRfY2ZfY2xpbmljYWxfdjFfc2lnX3N2YV9ncFtbIm91dGNvbWVfdXAiXV1bWyJHT19lbnJpY2giXV0pCmVucmljaHBsb3Q6OmRvdHBsb3QodF9jZl9jbGluaWNhbF92MV9zaWdfc3ZhX2dwW1sib3V0Y29tZV9kb3duIl1dW1siR09fZW5yaWNoIl1dKQpgYGAKCiMjIyMgQ3VyZS9GYWlsLCBUdW1hY28gVmlzaXQgMgoKVGhlIHZpc2l0IDIgYW5kIHZpc2l0IDMgc2FtcGxlcyBhcmUgaW50ZXJlc3RpbmcgYmVjYXVzZSB0aGV5IHByb3ZpZGUKYW4gb3Bwb3J0dW5pdHkgdG8gc2VlIGlmIHdlIGNhbiBvYnNlcnZlIGNoYW5nZXMgaW4gcmVzcG9uc2UgaW4gdGhlCm1pZGRsZSBhbmQgZW5kIG9mIHRyZWF0bWVudC4uLgoKYGBge3J9CnRfY2ZfY2xpbmljYWxfdjJfZGVfc3ZhIDwtIGFsbF9wYWlyd2lzZSh0djJfc2FtcGxlcywgbW9kZWxfYmF0Y2ggPSAic3Zhc2VxIiwgZmlsdGVyID0gVFJVRSkKdF9jZl9jbGluaWNhbF92Ml9kZV9zdmEKdF9jZl9jbGluaWNhbF92Ml90YWJsZV9zdmEgPC0gY29tYmluZV9kZV90YWJsZXMoCiAgdF9jZl9jbGluaWNhbF92Ml9kZV9zdmEsIGtlZXBlcnMgPSB0X2NmX2NvbnRyYXN0LAogIGV4Y2VsID0gZ2x1ZSgie2NmX3ByZWZpeH0vVmlzaXRzL3RfY2xpbmljYWxfdjJfY2ZfdGFibGVzX3N2YS12e3Zlcn0ueGxzeCIpKQp0X2NmX2NsaW5pY2FsX3YyX3RhYmxlX3N2YQp0X2NmX2NsaW5pY2FsX3YyX3NpZ19zdmEgPC0gZXh0cmFjdF9zaWduaWZpY2FudF9nZW5lcygKICB0X2NmX2NsaW5pY2FsX3YyX3RhYmxlX3N2YSwKICBleGNlbCA9IGdsdWUoIntjZl9wcmVmaXh9L1Zpc2l0cy90X2NsaW5pY2FsX3YyX2NmX3NpZ19zdmEtdnt2ZXJ9Lnhsc3giKSkKdF9jZl9jbGluaWNhbF92Ml9zaWdfc3ZhCgpkaW0odF9jZl9jbGluaWNhbF92Ml9zaWdfc3ZhJGRlc2VxJHVwc1tbMV1dKQpkaW0odF9jZl9jbGluaWNhbF92Ml9zaWdfc3ZhJGRlc2VxJGRvd25zW1sxXV0pCmBgYAoKIyMjIyMgR2VuZSBzZXQgZW5yaWNobWVudDogVmlzaXQgMiBnUHJvZmlsZXIgc2VhcmNoZXMKClVwOiA3NCBHTywgNCBLRUdHLCA2IHJlYWN0b21lLCA0IFdQLCA1NiBURiwgMSBtaVJOQSwgMCBIUC9IUEEvQ09SVU0uCkRvd246ICAxOSBHTywgMSBLRUdHLCAxIEhQLCAyIEhQQSwgMCByZWFjdG9tZS93cC90Zi9jb3J1bQoKYGBge3J9CnRfY2ZfY2xpbmljYWxfdjJfc2lnX3N2YV9ncCA8LSBhbGxfZ3Byb2ZpbGVyKHRfY2ZfY2xpbmljYWxfdjJfc2lnX3N2YSkKdF9jZl9jbGluaWNhbF92Ml9zaWdfc3ZhX2dwCgp3cml0dGVuIDwtIHdyaXRlX2dwcm9maWxlcl9kYXRhKAogIHRfY2ZfY2xpbmljYWxfdjJfc2lnX3N2YV9ncFtbIm91dGNvbWVfdXAiXV0sCiAgZXhjZWwgPSBnbHVlKCJ7eGxzeF9wcmVmaXh9L0dlbmUgc2V0IGVucmljaG1lbnQvdF9jZl9jbGluaWNhbF92Ml91cC12e3Zlcn0ueGxzeCIpKQp3cml0dGVuIDwtIHdyaXRlX2dwcm9maWxlcl9kYXRhKAogIHRfY2ZfY2xpbmljYWxfdjJfc2lnX3N2YV9ncFtbIm91dGNvbWVfZG93biJdXSwKICBleGNlbCA9IGdsdWUoInt4bHN4X3ByZWZpeH0vR2VuZSBzZXQgZW5yaWNobWVudC90X2NmX2NsaW5pY2FsX3YyX2Rvd24tdnt2ZXJ9Lnhsc3giKSkKCiMjIFdpa2lwYXRod2F5cyBvZiB0aGUgdXAgYy9mIGdlbmVzCmVucmljaHBsb3Q6OmRvdHBsb3QodF9jZl9jbGluaWNhbF92Ml9zaWdfc3ZhX2dwW1sib3V0Y29tZV91cCJdXVtbIkdPX2VucmljaCJdXSkKZW5yaWNocGxvdDo6ZG90cGxvdCh0X2NmX2NsaW5pY2FsX3YyX3NpZ19zdmFfZ3BbWyJvdXRjb21lX3VwIl1dW1siUkVBQ19lbnJpY2giXV0pCmVucmljaHBsb3Q6OmRvdHBsb3QodF9jZl9jbGluaWNhbF92Ml9zaWdfc3ZhX2dwW1sib3V0Y29tZV91cCJdXVtbIlRGX2VucmljaCJdXSkKCmVucmljaHBsb3Q6OmRvdHBsb3QodF9jZl9jbGluaWNhbF92Ml9zaWdfc3ZhX2dwW1sib3V0Y29tZV9kb3duIl1dW1siR09fZW5yaWNoIl1dKQpgYGAKCiMjIyMgQ3VyZS9GYWlsLCBUdW1hY28gVmlzaXQgMwoKYGBge3J9CnRfY2ZfY2xpbmljYWxfdjNfZGVfc3ZhIDwtIGFsbF9wYWlyd2lzZSh0djNfc2FtcGxlcywgbW9kZWxfYmF0Y2ggPSAic3Zhc2VxIiwgZmlsdGVyID0gVFJVRSkKdF9jZl9jbGluaWNhbF92M19kZV9zdmEKdF9jZl9jbGluaWNhbF92M190YWJsZV9zdmEgPC0gY29tYmluZV9kZV90YWJsZXMoCiAgdF9jZl9jbGluaWNhbF92M19kZV9zdmEsIGtlZXBlcnMgPSB0X2NmX2NvbnRyYXN0LAogIGV4Y2VsID0gZ2x1ZSgie2NmX3ByZWZpeH0vVmlzaXRzL3RfY2xpbmljYWxfdjNfY2ZfdGFibGVzX3N2YS12e3Zlcn0ueGxzeCIpKQp0X2NmX2NsaW5pY2FsX3YzX3RhYmxlX3N2YQp0X2NmX2NsaW5pY2FsX3YzX3NpZ19zdmEgPC0gZXh0cmFjdF9zaWduaWZpY2FudF9nZW5lcygKICB0X2NmX2NsaW5pY2FsX3YzX3RhYmxlX3N2YSwKICBleGNlbCA9IGdsdWUoIntjZl9wcmVmaXh9L1Zpc2l0cy90X2NsaW5pY2FsX3YzX2NmX3NpZ19zdmEtdnt2ZXJ9Lnhsc3giKSkKdF9jZl9jbGluaWNhbF92M19zaWdfc3ZhCgpkaW0odF9jZl9jbGluaWNhbF92M19zaWdfc3ZhJGRlc2VxJHVwc1tbMV1dKQpkaW0odF9jZl9jbGluaWNhbF92M19zaWdfc3ZhJGRlc2VxJGRvd25zW1sxXV0pCmBgYAoKIyMjIyMgR2VuZSBzZXQgZW5yaWNobWVudDogVmlzaXQgMyBnUHJvZmlsZXIgc2VhcmNoZXMKClVwOiAxMjAgZ2VuZXM7IDE0MSBHTywgMSBLRUdHLCA1IFJlYWN0b21lLCAyIFdQLCAzMCBURiwgMSBtaVJOQSwgMCBIUEEvQ09SVU0vSFAKRG93bjogNjIgZ2VuZXM7IDMwIEdPLCAyIEtFR0csIDEgUmVhY3RvbWUsIDAgV1AvVEYvbWlSTkEvSFBBL0NPUlVNL0hQLAoKYGBge3J9CnRfY2ZfY2xpbmljYWxfdjNfc2lnX3N2YV9ncCA8LSBhbGxfZ3Byb2ZpbGVyKHRfY2ZfY2xpbmljYWxfdjNfc2lnX3N2YSkKdF9jZl9jbGluaWNhbF92M19zaWdfc3ZhX2dwCgp3cml0dGVuIDwtIHdyaXRlX2dwcm9maWxlcl9kYXRhKAogIHRfY2ZfY2xpbmljYWxfdjNfc2lnX3N2YV9ncFtbIm91dGNvbWVfdXAiXV0sCiAgZXhjZWwgPSBnbHVlKCJ7eGxzeF9wcmVmaXh9L0dlbmUgc2V0IGVucmljaG1lbnQvdF9jZl9jbGluaWNhbF92M191cC12e3Zlcn0ueGxzeCIpKQp3cml0dGVuIDwtIHdyaXRlX2dwcm9maWxlcl9kYXRhKAogIHRfY2ZfY2xpbmljYWxfdjNfc2lnX3N2YV9ncFtbIm91dGNvbWVfZG93biJdXSwKICBleGNlbCA9IGdsdWUoInt4bHN4X3ByZWZpeH0vR2VuZSBzZXQgZW5yaWNobWVudC90X2NmX2NsaW5pY2FsX3YzX2Rvd24tdnt2ZXJ9Lnhsc3giKSkKCiMjIFdpa2lwYXRod2F5cyBvZiB0aGUgdXAgYy9mIGdlbmVzCmVucmljaHBsb3Q6OmRvdHBsb3QodF9jZl9jbGluaWNhbF92M19zaWdfc3ZhX2dwW1sib3V0Y29tZV91cCJdXVtbIkdPX2VucmljaCJdXSkKZW5yaWNocGxvdDo6ZG90cGxvdCh0X2NmX2NsaW5pY2FsX3YzX3NpZ19zdmFfZ3BbWyJvdXRjb21lX3VwIl1dW1siUkVBQ19lbnJpY2giXV0pCmVucmljaHBsb3Q6OmRvdHBsb3QodF9jZl9jbGluaWNhbF92M19zaWdfc3ZhX2dwW1sib3V0Y29tZV91cCJdXVtbIlRGX2VucmljaCJdXSkKCmVucmljaHBsb3Q6OmRvdHBsb3QodF9jZl9jbGluaWNhbF92M19zaWdfc3ZhX2dwW1sib3V0Y29tZV9kb3duIl1dW1siR09fZW5yaWNoIl1dKQpgYGAKCiMjIyBSZXBlYXQgbm8gYmlvcHNpZXMKClRoZSBiaW9wc3kgc2FtcGxlcyBhcmUgcHJvYmxlbWF0aWMgZm9yIGEgZmV3IHJlYXNvbnMsIHNvIGxldCB1cyByZXBlYXQKd2l0aG91dCB0aGVtLgoKYGBge3J9CnRfY2ZfY2xpbmljYWxfbm9iaW9wX2RlX3N2YSA8LSBhbGxfcGFpcndpc2UodF9jbGluaWNhbF9ub2Jpb3AsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kZWxfYmF0Y2ggPSAic3Zhc2VxIiwgZmlsdGVyID0gVFJVRSkKdF9jZl9jbGluaWNhbF9ub2Jpb3BfZGVfc3ZhCnRfY2ZfY2xpbmljYWxfbm9iaW9wX3RhYmxlX3N2YSA8LSBjb21iaW5lX2RlX3RhYmxlcygKICB0X2NmX2NsaW5pY2FsX25vYmlvcF9kZV9zdmEsIGtlZXBlcnMgPSB0X2NmX2NvbnRyYXN0LAogIGV4Y2VsID0gZ2x1ZSgie2NmX3ByZWZpeH0vTm9fQmlvcHNpZXMvdF9jbGluaWNhbF9ub2Jpb3BfY2ZfdGFibGVzX3N2YS12e3Zlcn0ueGxzeCIpKQp0X2NmX2NsaW5pY2FsX25vYmlvcF90YWJsZV9zdmEKdF9jZl9jbGluaWNhbF9ub2Jpb3Bfc2lnX3N2YSA8LSBleHRyYWN0X3NpZ25pZmljYW50X2dlbmVzKAogIHRfY2ZfY2xpbmljYWxfbm9iaW9wX3RhYmxlX3N2YSwKICBleGNlbCA9IGdsdWUoIntjZl9wcmVmaXh9L05vX0Jpb3BzaWVzL3RfY2xpbmljYWxfbm9iaW9wX2NmX3NpZ19zdmEtdnt2ZXJ9Lnhsc3giKSkKdF9jZl9jbGluaWNhbF9ub2Jpb3Bfc2lnX3N2YQoKZGltKHRfY2ZfY2xpbmljYWxfbm9iaW9wX3NpZ19zdmEkZGVzZXEkdXBzW1sxXV0pCmRpbSh0X2NmX2NsaW5pY2FsX25vYmlvcF9zaWdfc3ZhJGRlc2VxJGRvd25zW1sxXV0pCmBgYAoKIyMjIyMgR2VuZSBzZXQgZW5yaWNobWVudDogZ1Byb2ZpbGVyIG9mIGNsaW5pY2FsIHNhbXBsZXMgd2l0aG91dCBiaW9wc2llcwoKVXA6IDEzNyBnZW5lczsgODggR08sIDAgS0VHRywgNiBSZWFjdG9tZSwgMSBXUCwgNDYgVEYsIDEgbWlSTkEsIDAgb3RoZXJzCkRvd246IDczIGdlbmVzOyA3OCBHTywgMSBLRUdHLCAxIFJlYWN0b21lLCA5IFRGLCAwIG90aGVycwoKYGBge3J9CnRfY2ZfY2xpbmljYWxfbm9iaW9wX3NpZ19zdmFfZ3AgPC0gYWxsX2dwcm9maWxlcih0X2NmX2NsaW5pY2FsX25vYmlvcF9zaWdfc3ZhKQp0X2NmX2NsaW5pY2FsX25vYmlvcF9zaWdfc3ZhX2dwCgp3cml0dGVuIDwtIHdyaXRlX2dwcm9maWxlcl9kYXRhKAogIHRfY2ZfY2xpbmljYWxfbm9iaW9wX3NpZ19zdmFfZ3BbWyJvdXRjb21lX3VwIl1dLAogIGV4Y2VsID0gZ2x1ZSgie3hsc3hfcHJlZml4fS9HZW5lIHNldCBlbnJpY2htZW50L3RfY2ZfY2xpbmljYWxfbm9iaW9wX3VwLXZ7dmVyfS54bHN4IikpCndyaXR0ZW4gPC0gd3JpdGVfZ3Byb2ZpbGVyX2RhdGEoCiAgdF9jZl9jbGluaWNhbF9ub2Jpb3Bfc2lnX3N2YV9ncFtbIm91dGNvbWVfZG93biJdXSwKICBleGNlbCA9IGdsdWUoInt4bHN4X3ByZWZpeH0vR2VuZSBzZXQgZW5yaWNobWVudC90X2NmX2NsaW5pY2FsX25vYmlvcF9kb3duLXZ7dmVyfS54bHN4IikpCgplbnJpY2hwbG90Ojpkb3RwbG90KHRfY2ZfY2xpbmljYWxfbm9iaW9wX3NpZ19zdmFfZ3BbWyJvdXRjb21lX3VwIl1dW1siR09fZW5yaWNoIl1dKQplbnJpY2hwbG90Ojpkb3RwbG90KHRfY2ZfY2xpbmljYWxfbm9iaW9wX3NpZ19zdmFfZ3BbWyJvdXRjb21lX3VwIl1dW1siVEZfZW5yaWNoIl1dKQoKZW5yaWNocGxvdDo6ZG90cGxvdCh0X2NmX2NsaW5pY2FsX25vYmlvcF9zaWdfc3ZhX2dwW1sib3V0Y29tZV9kb3duIl1dW1siR09fZW5yaWNoIl1dKQpgYGAKCiMjIyBCeSBjZWxsIHR5cGUKCk5vdyBsZXQgdXMgc3dpdGNoIG91ciB2aWV3IHRvIGVhY2ggaW5kaXZpZHVhbCBjZWxsIHR5cGUgY29sbGVjdGVkLgpUaGUgaG9wZSBoZXJlIGlzIHRoYXQgd2Ugd2lsbCBiZSBhYmxlIHRvIGxlYXJuIHNvbWUgY2VsbC1zcGVjaWZpYwpkaWZmZXJlbmNlcyBpbiB0aGUgcmVzcG9uc2UgZm9yIHBlb3BsZSB3aG8gZGlkKG5vdCkgcmVzcG9uZCB3ZWxsLgoKIyMjIyBDdXJlL0ZhaWwsIEJpb3BzaWVzCgpgYGB7cn0KdF9jZl9iaW9wc3lfZGVfc3ZhIDwtIGFsbF9wYWlyd2lzZSh0X2Jpb3BzaWVzLCBtb2RlbF9iYXRjaCA9ICJzdmFzZXEiLCBmaWx0ZXIgPSBUUlVFKQp0X2NmX2Jpb3BzeV9kZV9zdmEKdF9jZl9iaW9wc3lfdGFibGVfc3ZhIDwtIGNvbWJpbmVfZGVfdGFibGVzKAogIHRfY2ZfYmlvcHN5X2RlX3N2YSwga2VlcGVycyA9IGNmX2NvbnRyYXN0LAogIGV4Y2VsID0gZ2x1ZSgie2NmX3ByZWZpeH0vQmlvcHNpZXMvdF9iaW9wc3lfY2ZfdGFibGVzX3N2YS12e3Zlcn0ueGxzeCIpKQp0X2NmX2Jpb3BzeV90YWJsZV9zdmEKdF9jZl9iaW9wc3lfc2lnX3N2YSA8LSBleHRyYWN0X3NpZ25pZmljYW50X2dlbmVzKAogIHRfY2ZfYmlvcHN5X3RhYmxlX3N2YSwKICBleGNlbCA9IGdsdWUoIntjZl9wcmVmaXh9L0Jpb3BzaWVzL3RfY2ZfYmlvcHN5X3NpZ19zdmEtdnt2ZXJ9Lnhsc3giKSkKdF9jZl9iaW9wc3lfc2lnX3N2YQoKZGltKHRfY2ZfYmlvcHN5X3NpZ19zdmEkZGVzZXEkdXBzW1sxXV0pCmRpbSh0X2NmX2Jpb3BzeV9zaWdfc3ZhJGRlc2VxJGRvd25zW1sxXV0pCmBgYAoKIyMjIyMgR2VuZSBzZXQgZW5yaWNobWVudDogZ1Byb2ZpbGVyIEJpb3BzaWVzCgpVcDogMTcgZ2VuZXM7IDc0IEdPLCAzIEtFR0csIDEgUmVhY3RvbWUsIDMgV1AsIDEgVEYsIDAgb3RoZXJzCkRvd246IDExIGdlbmVzOyAyIEdPLCAwIG90aGVycwoKRklYTUU6IEFkZCB3cml0ZV9ncHJvZmlsZXJfZGF0YSgpIHRvIG90aGVyIHN0YW56YXMuCgpgYGB7cn0KdF9jZl9iaW9wc3lfc2lnX3N2YV9ncCA8LSBhbGxfZ3Byb2ZpbGVyKHRfY2ZfYmlvcHN5X3NpZ19zdmEpCnRfY2ZfYmlvcHN5X3NpZ19zdmFfZ3AKCnRfY2ZfYmlvcHN5X2dwX3VwX3dyaXR0ZW4gPC0gd3JpdGVfZ3Byb2ZpbGVyX2RhdGEoCiAgdF9jZl9iaW9wc3lfc2lnX3N2YV9ncFtbMV1dLAogIGV4Y2VsID0gZ2x1ZSgie3hsc3hfcHJlZml4fS9HZW5lIHNldCBlbnJpY2htZW50L3RfY2ZfYmlvcHN5X3NpZ19zdmFfdXAueGxzeCIpKQp0X2NmX2Jpb3BzeV9ncF9kb3duX3dyaXR0ZW4gPC0gd3JpdGVfZ3Byb2ZpbGVyX2RhdGEoCiAgdF9jZl9iaW9wc3lfc2lnX3N2YV9ncFtbMl1dLAogIGV4Y2VsID0gZ2x1ZSgie3hsc3hfcHJlZml4fS9HZW5lIHNldCBlbnJpY2htZW50L3RfY2ZfYmlvcHN5X3NpZ19zdmFfZG93bi54bHN4IikpCgplbnJpY2hwbG90Ojpkb3RwbG90KHRfY2ZfYmlvcHN5X3NpZ19zdmFfZ3BbWyJvdXRjb21lX3VwIl1dW1siR09fZW5yaWNoIl1dKQplbnJpY2hwbG90Ojpkb3RwbG90KHRfY2ZfYmlvcHN5X3NpZ19zdmFfZ3BbWyJvdXRjb21lX3VwIl1dW1siV1BfZW5yaWNoIl1dKQoKZW5yaWNocGxvdDo6ZG90cGxvdCh0X2NmX2Jpb3BzeV9zaWdfc3ZhX2dwW1sib3V0Y29tZV9kb3duIl1dW1siR09fZW5yaWNoIl1dKQpgYGAKCiMjIyMgQ3VyZS9GYWlsLCBNb25vY3l0ZXMKClNhbWUgcXVlc3Rpb24sIGJ1dCB0aGlzIHRpbWUgbG9va2luZyBhdCBtb25vY3l0ZXMuICBJbiBhZGRpdGlvbiwgdGhpcwpjb21wYXJpc29uIHdhcyBkb25lIHR3aWNlLCBvbmNlIHVzaW5nIFNWQSBhbmQgb25jZSB1c2luZyB2aXNpdCBhcyBhCmJhdGNoIGZhY3Rvci4KCmBgYHtyfQp0X2NmX21vbm9jeXRlX2RlX3N2YSA8LSBhbGxfcGFpcndpc2UodF9tb25vY3l0ZXMsIG1vZGVsX2JhdGNoID0gInN2YXNlcSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWx0ZXIgPSBUUlVFKQp0X2NmX21vbm9jeXRlX2RlX3N2YQp0X2NmX21vbm9jeXRlX3RhYmxlc19zdmEgPC0gY29tYmluZV9kZV90YWJsZXMoCiAgdF9jZl9tb25vY3l0ZV9kZV9zdmEsIGtlZXBlcnMgPSBjZl9jb250cmFzdCwKICBleGNlbCA9IGdsdWUoIntjZl9wcmVmaXh9L01vbm9jeXRlcy90X21vbm9jeXRlX2NmX3RhYmxlc19zdmEtdnt2ZXJ9Lnhsc3giKSkKdF9jZl9tb25vY3l0ZV90YWJsZXNfc3ZhCnRfY2ZfbW9ub2N5dGVfc2lnX3N2YSA8LSBleHRyYWN0X3NpZ25pZmljYW50X2dlbmVzKAogIHRfY2ZfbW9ub2N5dGVfdGFibGVzX3N2YSwKICBleGNlbCA9IGdsdWUoIntjZl9wcmVmaXh9L01vbm9jeXRlcy90X21vbm9jeXRlX2NmX3NpZ19zdmEtdnt2ZXJ9Lnhsc3giKSkKdF9jZl9tb25vY3l0ZV9zaWdfc3ZhCgpkaW0odF9jZl9tb25vY3l0ZV9zaWdfc3ZhJGRlc2VxJHVwc1tbMV1dKQpkaW0odF9jZl9tb25vY3l0ZV9zaWdfc3ZhJGRlc2VxJGRvd25zW1sxXV0pCgp0X2NmX21vbm9jeXRlX2RlX2JhdGNodmlzaXQgPC0gYWxsX3BhaXJ3aXNlKHRfbW9ub2N5dGVzLCBtb2RlbF9iYXRjaCA9IFRSVUUsIGZpbHRlciA9IFRSVUUpCnRfY2ZfbW9ub2N5dGVfZGVfYmF0Y2h2aXNpdAp0X2NmX21vbm9jeXRlX3RhYmxlc19iYXRjaHZpc2l0IDwtIGNvbWJpbmVfZGVfdGFibGVzKAogIHRfY2ZfbW9ub2N5dGVfZGVfYmF0Y2h2aXNpdCwga2VlcGVycyA9IGNmX2NvbnRyYXN0LAogIGV4Y2VsID0gZ2x1ZSgie2NmX3ByZWZpeH0vTW9ub2N5dGVzL3RfbW9ub2N5dGVfY2ZfdGFibGVzX2JhdGNodmlzaXQtdnt2ZXJ9Lnhsc3giKSkKdF9jZl9tb25vY3l0ZV90YWJsZXNfYmF0Y2h2aXNpdAp0X2NmX21vbm9jeXRlX3NpZ19iYXRjaHZpc2l0IDwtIGV4dHJhY3Rfc2lnbmlmaWNhbnRfZ2VuZXMoCiAgdF9jZl9tb25vY3l0ZV90YWJsZXNfYmF0Y2h2aXNpdCwKICBleGNlbCA9IGdsdWUoIntjZl9wcmVmaXh9L01vbm9jeXRlcy90X21vbm9jeXRlX2NmX3NpZ19iYXRjaHZpc2l0LXZ7dmVyfS54bHN4IikpCnRfY2ZfbW9ub2N5dGVfc2lnX2JhdGNodmlzaXQKCmRpbSh0X2NmX21vbm9jeXRlX3NpZ19iYXRjaHZpc2l0JGRlc2VxJHVwc1tbMV1dKQpkaW0odF9jZl9tb25vY3l0ZV9zaWdfYmF0Y2h2aXNpdCRkZXNlcSRkb3duc1tbMV1dKQpgYGAKCiMjIyMjIEdlbmUgc2V0IGVucmljaG1lbnQ6IGdQcm9maWxlciBNb25vY3l0ZXMKCk5vdyB0aGF0IEkgYW0gbG9va2luZyBiYWNrIG92ZXIgdGhlc2UgcmVzdWx0cywgSSBhbSBub3QgY29tcGVsdGVseQpjZXJ0YWluIHdoeSBJIG9ubHkgZGlkIHRoZSBncHJvZmlsZXIgc2VhcmNoIGZvciB0aGUgc3ZhIGRhdGEuLi4KClVwOiA2MCBnZW5lczsgMTIgR08sIDEgS0VHRywgMSBXUCwgNCBURiwgMCBvdGhlcnMKRG93bjogNTMgZ2VuZXM7IDI2IEdPLCAxIEtFR0csIDEgUmVhY3RvbWUsIDIgVEYsIDAgb3RoZXJzCgpgYGB7cn0KdF9jZl9tb25vY3l0ZV9zaWdfc3ZhX2dwIDwtIGFsbF9ncHJvZmlsZXIodF9jZl9tb25vY3l0ZV9zaWdfc3ZhKQp0X2NmX21vbm9jeXRlX3NpZ19zdmFfZ3AKCndyaXR0ZW4gPC0gd3JpdGVfZ3Byb2ZpbGVyX2RhdGEoCiAgdF9jZl9tb25vY3l0ZV9zaWdfc3ZhX2dwW1sib3V0Y29tZV91cCJdXSwKICBleGNlbCA9IGdsdWUoInt4bHN4X3ByZWZpeH0vR2VuZSBzZXQgZW5yaWNobWVudC90X2NmX21vbm9jeXRlX3VwLXZ7dmVyfS54bHN4IikpCndyaXR0ZW4gPC0gd3JpdGVfZ3Byb2ZpbGVyX2RhdGEoCiAgdF9jZl9tb25vY3l0ZV9zaWdfc3ZhX2dwW1sib3V0Y29tZV9kb3duIl1dLAogIGV4Y2VsID0gZ2x1ZSgie3hsc3hfcHJlZml4fS9HZW5lIHNldCBlbnJpY2htZW50L3RfY2ZfbW9ub2N5dGVfZG93bi12e3Zlcn0ueGxzeCIpKQoKZW5yaWNocGxvdDo6ZG90cGxvdCh0X2NmX21vbm9jeXRlX3NpZ19zdmFfZ3BbWyJvdXRjb21lX3VwIl1dW1siR09fZW5yaWNoIl1dKQplbnJpY2hwbG90Ojpkb3RwbG90KHRfY2ZfbW9ub2N5dGVfc2lnX3N2YV9ncFtbIm91dGNvbWVfdXAiXV1bWyJURl9lbnJpY2giXV0pCgplbnJpY2hwbG90Ojpkb3RwbG90KHRfY2ZfbW9ub2N5dGVfc2lnX3N2YV9ncFtbIm91dGNvbWVfZG93biJdXVtbIkdPX2VucmljaCJdXSkKCnRfY2ZfbW9ub2N5dGVfc2lnX2JhdGNoX2dwIDwtIGFsbF9ncHJvZmlsZXIodF9jZl9tb25vY3l0ZV9zaWdfYmF0Y2h2aXNpdCkKdF9jZl9tb25vY3l0ZV9zaWdfYmF0Y2hfZ3AKCndyaXR0ZW4gPC0gd3JpdGVfZ3Byb2ZpbGVyX2RhdGEoCiAgdF9jZl9tb25vY3l0ZV9zaWdfYmF0Y2hfZ3BbWyJvdXRjb21lX3VwIl1dLAogIGV4Y2VsID0gZ2x1ZSgie3hsc3hfcHJlZml4fS9HZW5lIHNldCBlbnJpY2htZW50L3RfY2ZfbW9ub2N5dGVfYmF0Y2hfdXAtdnt2ZXJ9Lnhsc3giKSkKd3JpdHRlbiA8LSB3cml0ZV9ncHJvZmlsZXJfZGF0YSgKICB0X2NmX21vbm9jeXRlX3NpZ19iYXRjaF9ncFtbIm91dGNvbWVfZG93biJdXSwKICBleGNlbCA9IGdsdWUoInt4bHN4X3ByZWZpeH0vR2VuZSBzZXQgZW5yaWNobWVudC90X2NmX21vbm9jeXRlX2JhdGNoX2Rvd24tdnt2ZXJ9Lnhsc3giKSkKZW5yaWNocGxvdDo6ZG90cGxvdCh0X2NmX21vbm9jeXRlX3NpZ19iYXRjaF9ncFtbIm91dGNvbWVfdXAiXV1bWyJHT19lbnJpY2giXV0pCmVucmljaHBsb3Q6OmRvdHBsb3QodF9jZl9tb25vY3l0ZV9zaWdfYmF0Y2hfZ3BbWyJvdXRjb21lX3VwIl1dW1siSFBfZW5yaWNoIl1dKQpgYGAKCiMjIyBJbmRpdmlkdWFsIHZpc2l0cywgTW9ub2N5dGVzCgpOb3cgZm9jdXMgaW4gb24gdGhlIG1vbm9jeXRlIHNhbXBsZXMgb24gYSBwZXItdmlzaXQgYmFzaXMuCgojIyMjIFZpc2l0IDEKCmBgYHtyfQp0X2NmX21vbm9jeXRlX3YxX2RlX3N2YSA8LSBhbGxfcGFpcndpc2UodHYxX21vbm9jeXRlcywgbW9kZWxfYmF0Y2ggPSAic3Zhc2VxIiwgZmlsdGVyID0gVFJVRSkKdF9jZl9tb25vY3l0ZV92MV9kZV9zdmEKdF9jZl9tb25vY3l0ZV92MV90YWJsZXNfc3ZhIDwtIGNvbWJpbmVfZGVfdGFibGVzKAogIHRfY2ZfbW9ub2N5dGVfdjFfZGVfc3ZhLCBrZWVwZXJzID0gY2ZfY29udHJhc3QsCiAgZXhjZWwgPSBnbHVlKCJ7Y2ZfcHJlZml4fS9Nb25vY3l0ZXMvdF9tb25vY3l0ZV92MV9jZl90YWJsZXNfc3ZhLXZ7dmVyfS54bHN4IikpCnRfY2ZfbW9ub2N5dGVfdjFfdGFibGVzX3N2YQp0X2NmX21vbm9jeXRlX3YxX3NpZ19zdmEgPC0gZXh0cmFjdF9zaWduaWZpY2FudF9nZW5lcygKICB0X2NmX21vbm9jeXRlX3YxX3RhYmxlc19zdmEsCiAgZXhjZWwgPSBnbHVlKCJ7Y2ZfcHJlZml4fS9Nb25vY3l0ZXMvdF9tb25vY3l0ZV92MV9jZl9zaWdfc3ZhLXZ7dmVyfS54bHN4IikpCnRfY2ZfbW9ub2N5dGVfdjFfc2lnX3N2YQoKZGltKHRfY2ZfbW9ub2N5dGVfdjFfc2lnX3N2YSRkZXNlcSR1cHNbWzFdXSkKZGltKHRfY2ZfbW9ub2N5dGVfdjFfc2lnX3N2YSRkZXNlcSRkb3duc1tbMV1dKQpgYGAKCiMjIyMjIEdlbmUgc2V0IGVucmljaG1lbnQ6IGdQcm9maWxlciBNb25vY3l0ZXMgYnkgdmlzaXQsIFYxCgpWMTogVXA6IDE0IGdlbmVzOyBObyBjYXRlZ29yaWVzClYxOiBEb3duOiA1MiBnZW5lczsgMjAgR08sIDUgVEYKCmBgYHtyfQp0X2NmX21vbm9jeXRlX3YxX3NpZ19zdmFfZ3AgPC0gYWxsX2dwcm9maWxlcih0X2NmX21vbm9jeXRlX3YxX3NpZ19zdmEpCnRfY2ZfbW9ub2N5dGVfdjFfc2lnX3N2YV9ncAoKd3JpdHRlbiA8LSB3cml0ZV9ncHJvZmlsZXJfZGF0YSgKICB0X2NmX21vbm9jeXRlX3YxX3NpZ19zdmFfZ3BbWyJvdXRjb21lX3VwIl1dLAogIGV4Y2VsID0gZ2x1ZSgie3hsc3hfcHJlZml4fS9HZW5lIHNldCBlbnJpY2htZW50L3RfY2ZfbW9ub2N5dGVfdjFfdXAtdnt2ZXJ9Lnhsc3giKSkKd3JpdHRlbiA8LSB3cml0ZV9ncHJvZmlsZXJfZGF0YSgKICB0X2NmX21vbm9jeXRlX3YxX3NpZ19zdmFfZ3BbWyJvdXRjb21lX2Rvd24iXV0sCiAgZXhjZWwgPSBnbHVlKCJ7eGxzeF9wcmVmaXh9L0dlbmUgc2V0IGVucmljaG1lbnQvdF9jZl9tb25vY3l0ZV92MV9kb3duLXZ7dmVyfS54bHN4IikpCgplbnJpY2hwbG90Ojpkb3RwbG90KHRfY2ZfbW9ub2N5dGVfdjFfc2lnX3N2YV9ncFtbIm91dGNvbWVfZG93biJdXVtbIkdPX2VucmljaCJdXSkKYGBgCgojIyMjIFZpc2l0IDIKCmBgYHtyfQp0X2NmX21vbm9jeXRlX3YyX2RlX3N2YSA8LSBhbGxfcGFpcndpc2UodHYyX21vbm9jeXRlcywgbW9kZWxfYmF0Y2ggPSAic3Zhc2VxIiwgZmlsdGVyID0gVFJVRSkKdF9jZl9tb25vY3l0ZV92Ml9kZV9zdmEKdF9jZl9tb25vY3l0ZV92Ml90YWJsZXNfc3ZhIDwtIGNvbWJpbmVfZGVfdGFibGVzKAogIHRfY2ZfbW9ub2N5dGVfdjJfZGVfc3ZhLCBrZWVwZXJzID0gY2ZfY29udHJhc3QsCiAgZXhjZWwgPSBnbHVlKCJ7Y2ZfcHJlZml4fS9Nb25vY3l0ZXMvdF9tb25vY3l0ZV92Ml9jZl90YWJsZXNfc3ZhLXZ7dmVyfS54bHN4IikpCnRfY2ZfbW9ub2N5dGVfdjJfdGFibGVzX3N2YQp0X2NmX21vbm9jeXRlX3YyX3NpZ19zdmEgPC0gZXh0cmFjdF9zaWduaWZpY2FudF9nZW5lcygKICB0X2NmX21vbm9jeXRlX3YyX3RhYmxlc19zdmEsCiAgZXhjZWwgPSBnbHVlKCJ7Y2ZfcHJlZml4fS9Nb25vY3l0ZXMvdF9tb25vY3l0ZV92Ml9jZl9zaWdfc3ZhLXZ7dmVyfS54bHN4IikpCnRfY2ZfbW9ub2N5dGVfdjJfc2lnX3N2YQoKZGltKHRfY2ZfbW9ub2N5dGVfdjJfc2lnX3N2YSRkZXNlcSR1cHNbWzFdXSkKZGltKHRfY2ZfbW9ub2N5dGVfdjJfc2lnX3N2YSRkZXNlcSRkb3duc1tbMV1dKQpgYGAKCiMjIyMjIEdlbmUgc2V0IGVucmljaG1lbnQ6IGdQcm9maWxlciBNb25vY3l0ZXMgYnkgdmlzaXQgVjEKCkluc3VmZmljaWVudCBkYXRhIHRvIHVzZSBpbiBnUHJvZmlsZXIuCgpWMjogVXA6IDEgZ2VuZQpWMjogRG93bjogMCBnZW5lcy4KCgojIyMjIFZpc2l0IDMKCmBgYHtyfQp0X2NmX21vbm9jeXRlX3YzX2RlX3N2YSA8LSBhbGxfcGFpcndpc2UodHYzX21vbm9jeXRlcywgbW9kZWxfYmF0Y2ggPSAic3Zhc2VxIiwgZmlsdGVyID0gVFJVRSkKdF9jZl9tb25vY3l0ZV92M19kZV9zdmEKdF9jZl9tb25vY3l0ZV92M190YWJsZXNfc3ZhIDwtIGNvbWJpbmVfZGVfdGFibGVzKAogIHRfY2ZfbW9ub2N5dGVfdjNfZGVfc3ZhLCBrZWVwZXJzID0gY2ZfY29udHJhc3QsCiAgZXhjZWwgPSBnbHVlKCJ7Y2ZfcHJlZml4fS9Nb25vY3l0ZXMvdF9tb25vY3l0ZV92M19jZl90YWJsZXNfc3ZhLXZ7dmVyfS54bHN4IikpCnRfY2ZfbW9ub2N5dGVfdjNfdGFibGVzX3N2YQp0X2NmX21vbm9jeXRlX3YzX3NpZ19zdmEgPC0gZXh0cmFjdF9zaWduaWZpY2FudF9nZW5lcygKICB0X2NmX21vbm9jeXRlX3YzX3RhYmxlc19zdmEsCiAgZXhjZWwgPSBnbHVlKCJ7Y2ZfcHJlZml4fS9Nb25vY3l0ZXMvdF9tb25vY3l0ZV92M19jZl9zaWdfc3ZhLXZ7dmVyfS54bHN4IikpCnRfY2ZfbW9ub2N5dGVfdjNfc2lnX3N2YQoKZGltKHRfY2ZfbW9ub2N5dGVfdjNfc2lnX3N2YSRkZXNlcSR1cHNbWzFdXSkKZGltKHRfY2ZfbW9ub2N5dGVfdjNfc2lnX3N2YSRkZXNlcSRkb3duc1tbMV1dKQpgYGAKCiMjIyMjIEdlbmUgc2V0IGVucmljaG1lbnQ6IGdQcm9maWxlciBNb25vY3l0ZXMgYnkgdmlzaXQsIFYzCgpWMzogVXA6IDQgZ2VuZXMuClYzOiBEb3duOiAwIGdlbmVzLgoKIyMjIyBNb25vY3l0ZXM6IENvbXBhcmUgc3ZhIHRvIGJhdGNoLWluLW1vZGVsCgpgYGB7cn0Kc3ZhX2F1Y2MgPC0gY2FsY3VsYXRlX2F1Y2ModF9jZl9tb25vY3l0ZV90YWJsZXNfc3ZhW1siZGF0YSJdXVtbMV1dLAogICAgICAgICAgICAgICAgICAgICAgICAgICB0YmwyID0gdF9jZl9tb25vY3l0ZV90YWJsZXNfYmF0Y2h2aXNpdFtbImRhdGEiXV1bWzFdXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgcHkgPSAiZGVzZXFfYWRqcCIsIGx5ID0gImRlc2VxX2xvZ2ZjIikKc3ZhX2F1Y2MKCnNoYXJlZF9pZHMgPC0gcm93bmFtZXModF9jZl9tb25vY3l0ZV90YWJsZXNfc3ZhW1siZGF0YSJdXVtbMV1dKSAlaW4lCiAgcm93bmFtZXModF9jZl9tb25vY3l0ZV90YWJsZXNfYmF0Y2h2aXNpdFtbImRhdGEiXV1bWzFdXSkKZmlyc3QgPC0gdF9jZl9tb25vY3l0ZV90YWJsZXNfc3ZhW1siZGF0YSJdXVtbMV1dW3NoYXJlZF9pZHMsIF0Kc2Vjb25kIDwtIHRfY2ZfbW9ub2N5dGVfdGFibGVzX2JhdGNodmlzaXRbWyJkYXRhIl1dW1sxXV1bcm93bmFtZXMoZmlyc3QpLCBdCmNvci50ZXN0KGZpcnN0W1siZGVzZXFfbG9nZmMiXV0sIHNlY29uZFtbImRlc2VxX2xvZ2ZjIl1dKQpgYGAKCiMjIyBOZXV0cm9waGlsIHNhbXBsZXMKClN3aXRjaCBjb250ZXh0IHRvIHRoZSBOZXV0cm9waGlscywgb25jZSBhZ2FpbiByZXBlYXQgdGhlIGFuYWx5c2lzCnVzaW5nIFNWQSBhbmQgdmlzaXQgYXMgYSBiYXRjaCBmYWN0b3IuCgpgYGB7cn0KdF9jZl9uZXV0cm9waGlsX2RlX3N2YSA8LSBhbGxfcGFpcndpc2UodF9uZXV0cm9waGlscywgbW9kZWxfYmF0Y2ggPSAic3Zhc2VxIiwgZmlsdGVyID0gVFJVRSkKdF9jZl9uZXV0cm9waGlsX2RlX3N2YQp0X2NmX25ldXRyb3BoaWxfdGFibGVzX3N2YSA8LSBjb21iaW5lX2RlX3RhYmxlcygKICB0X2NmX25ldXRyb3BoaWxfZGVfc3ZhLCBrZWVwZXJzID0gY2ZfY29udHJhc3QsCiAgZXhjZWwgPSBnbHVlKCJ7Y2ZfcHJlZml4fS9OZXV0cm9waGlscy90X25ldXRyb3BoaWxfY2ZfdGFibGVzX3N2YS12e3Zlcn0ueGxzeCIpKQp0X2NmX25ldXRyb3BoaWxfdGFibGVzX3N2YQp0X2NmX25ldXRyb3BoaWxfc2lnX3N2YSA8LSBleHRyYWN0X3NpZ25pZmljYW50X2dlbmVzKAogIHRfY2ZfbmV1dHJvcGhpbF90YWJsZXNfc3ZhLAogIGV4Y2VsID0gZ2x1ZSgie2NmX3ByZWZpeH0vTmV1dHJvcGhpbHMvdF9uZXV0cm9waGlsX2NmX3NpZ19zdmEtdnt2ZXJ9Lnhsc3giKSkKdF9jZl9uZXV0cm9waGlsX3NpZ19zdmEKCmRpbSh0X2NmX25ldXRyb3BoaWxfc2lnX3N2YSRkZXNlcSR1cHNbWzFdXSkKZGltKHRfY2ZfbmV1dHJvcGhpbF9zaWdfc3ZhJGRlc2VxJGRvd25zW1sxXV0pCgp0X2NmX25ldXRyb3BoaWxfZGVfYmF0Y2h2aXNpdCA8LSBhbGxfcGFpcndpc2UodF9uZXV0cm9waGlscywgbW9kZWxfYmF0Y2ggPSBUUlVFLCBmaWx0ZXIgPSBUUlVFKQp0X2NmX25ldXRyb3BoaWxfZGVfYmF0Y2h2aXNpdAp0X2NmX25ldXRyb3BoaWxfdGFibGVzX2JhdGNodmlzaXQgPC0gY29tYmluZV9kZV90YWJsZXMoCiAgdF9jZl9uZXV0cm9waGlsX2RlX2JhdGNodmlzaXQsIGtlZXBlcnMgPSBjZl9jb250cmFzdCwKICBleGNlbCA9IGdsdWUoIntjZl9wcmVmaXh9L05ldXRyb3BoaWxzL3RfbmV1dHJvcGhpbF9jZl90YWJsZXNfYmF0Y2h2aXNpdC12e3Zlcn0ueGxzeCIpKQp0X2NmX25ldXRyb3BoaWxfdGFibGVzX2JhdGNodmlzaXQKdF9jZl9uZXV0cm9waGlsX3NpZ19iYXRjaHZpc2l0IDwtIGV4dHJhY3Rfc2lnbmlmaWNhbnRfZ2VuZXMoCiAgdF9jZl9uZXV0cm9waGlsX3RhYmxlc19iYXRjaHZpc2l0LAogIGV4Y2VsID0gZ2x1ZSgie2NmX3ByZWZpeH0vTmV1dHJvcGhpbHMvdF9uZXV0cm9waGlsX2NmX3NpZ19iYXRjaHZpc2l0LXZ7dmVyfS54bHN4IikpCnRfY2ZfbmV1dHJvcGhpbF9zaWdfYmF0Y2h2aXNpdAoKZGltKHRfY2ZfbmV1dHJvcGhpbF9zaWdfYmF0Y2h2aXNpdCRkZXNlcSR1cHNbWzFdXSkKZGltKHRfY2ZfbmV1dHJvcGhpbF9zaWdfYmF0Y2h2aXNpdCRkZXNlcSRkb3duc1tbMV1dKQpgYGAKCiMjIyMjIEdlbmUgc2V0IGVucmljaG1lbnQ6IGdQcm9maWxlciBOZXV0cm9waGlscwoKVXA6IDg0IGdlbmVzOyA1IEdPLCAyIFJlYWN0b21lLCAzIFRGLCBubyBvdGhlcnMuCkRvd246IDI5IGdlbmVzOiAxMiBHTywgMSBSZWFjdG9tZSwgMSBURiwgMSBtaVJOQSwgMTEgSFAsIDAgb3RoZXJzCgpgYGB7cn0KdF9jZl9uZXV0cm9waGlsX3NpZ19zdmFfZ3AgPC0gYWxsX2dwcm9maWxlcih0X2NmX25ldXRyb3BoaWxfc2lnX3N2YSkKdF9jZl9uZXV0cm9waGlsX3NpZ19zdmFfZ3AKCndyaXR0ZW4gPC0gd3JpdGVfZ3Byb2ZpbGVyX2RhdGEoCiAgdF9jZl9uZXV0cm9waGlsX3NpZ19zdmFfZ3BbWyJvdXRjb21lX3VwIl1dLAogIGV4Y2VsID0gZ2x1ZSgie3hsc3hfcHJlZml4fS9HZW5lIHNldCBlbnJpY2htZW50L3RfY2ZfbmV1dHJvcGhpbF91cC12e3Zlcn0ueGxzeCIpKQp3cml0dGVuIDwtIHdyaXRlX2dwcm9maWxlcl9kYXRhKAogIHRfY2ZfbmV1dHJvcGhpbF9zaWdfc3ZhX2dwW1sib3V0Y29tZV9kb3duIl1dLAogIGV4Y2VsID0gZ2x1ZSgie3hsc3hfcHJlZml4fS9HZW5lIHNldCBlbnJpY2htZW50L3RfY2ZfbmV1dHJvcGhpbF9kb3duLXZ7dmVyfS54bHN4IikpCgplbnJpY2hwbG90Ojpkb3RwbG90KHRfY2ZfbmV1dHJvcGhpbF9zaWdfc3ZhX2dwW1sib3V0Y29tZV91cCJdXVtbIkdPX2VucmljaCJdXSkKZW5yaWNocGxvdDo6ZG90cGxvdCh0X2NmX25ldXRyb3BoaWxfc2lnX3N2YV9ncFtbIm91dGNvbWVfdXAiXV1bWyJURl9lbnJpY2giXV0pCgplbnJpY2hwbG90Ojpkb3RwbG90KHRfY2ZfbmV1dHJvcGhpbF9zaWdfc3ZhX2dwW1sib3V0Y29tZV9kb3duIl1dW1siR09fZW5yaWNoIl1dKQojIyBlbnJpY2hwbG90Ojpkb3RwbG90KHRfY2ZfbmV1dHJvcGhpbF9zaWdfc3ZhX2dwW1sib3V0Y29tZV9kb3duIl1dW1siSFBfZW5yaWNoIl1dKQpgYGAKCiMjIyMgTmV1dHJvcGhpbHMgYnkgdmlzaXQKCldoZW4gSSBkaWQgdGhpcyB3aXRoIHRoZSBtb25vY3l0ZXMsIEkgc3BsaXQgaXQgdXAgaW50byBtdWx0aXBsZSBibG9ja3MKZm9yIGVhY2ggdmlzaXQuICBUaGlzIHRpbWUgSSBhbSBqdXN0IGdvaW5nIHRvIHJ1biB0aGVtIGFsbCB0b2dldGhlci4KCmBgYHtyfQp2aXNpdGNmX2ZhY3RvciA8LSBwYXN0ZTAoInYiLCBwRGF0YSh0X25ldXRyb3BoaWxzKVtbInZpc2l0bnVtYmVyIl1dLAogICAgICAgICAgICAgICAgICAgICAgICAgcERhdGEodF9uZXV0cm9waGlscylbWyJmaW5hbG91dGNvbWUiXV0pCnRfbmV1dHJvcGhpbF92aXNpdGNmIDwtIHNldF9leHB0X2NvbmRpdGlvbnModF9uZXV0cm9waGlscywgZmFjdD12aXNpdGNmX2ZhY3RvcikKCnRfY2ZfbmV1dHJvcGhpbF92aXNpdHNfZGVfc3ZhIDwtIGFsbF9wYWlyd2lzZSh0X25ldXRyb3BoaWxfdmlzaXRjZiwgbW9kZWxfYmF0Y2ggPSAic3Zhc2VxIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbHRlciA9IFRSVUUpCnRfY2ZfbmV1dHJvcGhpbF92aXNpdHNfZGVfc3ZhCnRfY2ZfbmV1dHJvcGhpbF92aXNpdHNfdGFibGVzX3N2YSA8LSBjb21iaW5lX2RlX3RhYmxlcygKICB0X2NmX25ldXRyb3BoaWxfdmlzaXRzX2RlX3N2YSwga2VlcGVycyA9IHZpc2l0Y2ZfY29udHJhc3RzLAogIGV4Y2VsID0gZ2x1ZSgie2NmX3ByZWZpeH0vTmV1dHJvcGhpbHMvdF9uZXV0cm9waGlsX3Zpc2l0Y2ZfdGFibGVzX3N2YS12e3Zlcn0ueGxzeCIpKQp0X2NmX25ldXRyb3BoaWxfdmlzaXRzX3RhYmxlc19zdmEKdF9jZl9uZXV0cm9waGlsX3Zpc2l0c19zaWdfc3ZhIDwtIGV4dHJhY3Rfc2lnbmlmaWNhbnRfZ2VuZXMoCiAgdF9jZl9uZXV0cm9waGlsX3Zpc2l0c190YWJsZXNfc3ZhLAogIGV4Y2VsID0gZ2x1ZSgie2NmX3ByZWZpeH0vTmV1dHJvcGhpbHMvdF9uZXV0cm9waGlsX3Zpc2l0Y2Zfc2lnX3N2YS12e3Zlcn0ueGxzeCIpKQp0X2NmX25ldXRyb3BoaWxfdmlzaXRzX3NpZ19zdmEKCmRpbSh0X2NmX25ldXRyb3BoaWxfdmlzaXRzX3NpZ19zdmEkZGVzZXEkdXBzW1sxXV0pCmRpbSh0X2NmX25ldXRyb3BoaWxfdmlzaXRzX3NpZ19zdmEkZGVzZXEkZG93bnNbWzFdXSkKCnRfY2ZfbmV1dHJvcGhpbF92MV9kZV9zdmEgPC0gYWxsX3BhaXJ3aXNlKHR2MV9uZXV0cm9waGlscywgbW9kZWxfYmF0Y2ggPSAic3Zhc2VxIiwgZmlsdGVyID0gVFJVRSkKdF9jZl9uZXV0cm9waGlsX3YxX2RlX3N2YQp0X2NmX25ldXRyb3BoaWxfdjFfdGFibGVzX3N2YSA8LSBjb21iaW5lX2RlX3RhYmxlcygKICB0X2NmX25ldXRyb3BoaWxfdjFfZGVfc3ZhLCBrZWVwZXJzID0gY2ZfY29udHJhc3QsCiAgZXhjZWwgPSBnbHVlKCJ7Y2ZfcHJlZml4fS9OZXV0cm9waGlscy90X25ldXRyb3BoaWxfdjFfY2ZfdGFibGVzX3N2YS12e3Zlcn0ueGxzeCIpKQp0X2NmX25ldXRyb3BoaWxfdjFfdGFibGVzX3N2YQp0X2NmX25ldXRyb3BoaWxfdjFfc2lnX3N2YSA8LSBleHRyYWN0X3NpZ25pZmljYW50X2dlbmVzKAogIHRfY2ZfbmV1dHJvcGhpbF92MV90YWJsZXNfc3ZhLAogIGV4Y2VsID0gZ2x1ZSgie2NmX3ByZWZpeH0vTmV1dHJvcGhpbHMvdF9uZXV0cm9waGlsX3YxX2NmX3NpZ19zdmEtdnt2ZXJ9Lnhsc3giKSkKdF9jZl9uZXV0cm9waGlsX3YxX3NpZ19zdmEKCmRpbSh0X2NmX25ldXRyb3BoaWxfdjFfc2lnX3N2YSRkZXNlcSR1cHNbWzFdXSkKZGltKHRfY2ZfbmV1dHJvcGhpbF92MV9zaWdfc3ZhJGRlc2VxJGRvd25zW1sxXV0pCgp0X2NmX25ldXRyb3BoaWxfdjJfZGVfc3ZhIDwtIGFsbF9wYWlyd2lzZSh0djJfbmV1dHJvcGhpbHMsIG1vZGVsX2JhdGNoID0gInN2YXNlcSIsIGZpbHRlciA9IFRSVUUpCnRfY2ZfbmV1dHJvcGhpbF92Ml9kZV9zdmEKdF9jZl9uZXV0cm9waGlsX3YyX3RhYmxlc19zdmEgPC0gY29tYmluZV9kZV90YWJsZXMoCiAgdF9jZl9uZXV0cm9waGlsX3YyX2RlX3N2YSwKICBrZWVwZXJzID0gY2ZfY29udHJhc3QsCiAgZXhjZWwgPSBnbHVlKCJ7Y2ZfcHJlZml4fS9OZXV0cm9waGlscy90X25ldXRyb3BoaWxfdjJfY2ZfdGFibGVzX3N2YS12e3Zlcn0ueGxzeCIpKQp0X2NmX25ldXRyb3BoaWxfdjJfdGFibGVzX3N2YQp0X2NmX25ldXRyb3BoaWxfdjJfc2lnX3N2YSA8LSBleHRyYWN0X3NpZ25pZmljYW50X2dlbmVzKAogIHRfY2ZfbmV1dHJvcGhpbF92Ml90YWJsZXNfc3ZhLAogIGV4Y2VsID0gZ2x1ZSgie2NmX3ByZWZpeH0vTmV1dHJvcGhpbHMvdF9uZXV0cm9waGlsX3YyX2NmX3NpZ19zdmEtdnt2ZXJ9Lnhsc3giKSkKdF9jZl9uZXV0cm9waGlsX3YyX3NpZ19zdmEKCmRpbSh0X2NmX25ldXRyb3BoaWxfdjJfc2lnX3N2YSRkZXNlcSR1cHNbWzFdXSkKZGltKHRfY2ZfbmV1dHJvcGhpbF92Ml9zaWdfc3ZhJGRlc2VxJGRvd25zW1sxXV0pCgp0X2NmX25ldXRyb3BoaWxfdjNfZGVfc3ZhIDwtIGFsbF9wYWlyd2lzZSh0djNfbmV1dHJvcGhpbHMsIG1vZGVsX2JhdGNoID0gInN2YXNlcSIsIGZpbHRlciA9IFRSVUUpCnRfY2ZfbmV1dHJvcGhpbF92M19kZV9zdmEKdF9jZl9uZXV0cm9waGlsX3YzX3RhYmxlc19zdmEgPC0gY29tYmluZV9kZV90YWJsZXMoCiAgdF9jZl9uZXV0cm9waGlsX3YzX2RlX3N2YSwga2VlcGVycyA9IGNmX2NvbnRyYXN0LAogIGV4Y2VsID0gZ2x1ZSgie2NmX3ByZWZpeH0vTmV1dHJvcGhpbHMvdF9uZXV0cm9waGlsX3YzX2NmX3RhYmxlc19zdmEtdnt2ZXJ9Lnhsc3giKSkKdF9jZl9uZXV0cm9waGlsX3YzX3RhYmxlc19zdmEKdF9jZl9uZXV0cm9waGlsX3YzX3NpZ19zdmEgPC0gZXh0cmFjdF9zaWduaWZpY2FudF9nZW5lcygKICB0X2NmX25ldXRyb3BoaWxfdjNfdGFibGVzX3N2YSwKICBleGNlbCA9IGdsdWUoIntjZl9wcmVmaXh9L05ldXRyb3BoaWxzL3RfbmV1dHJvcGhpbF92M19jZl9zaWdfc3ZhLXZ7dmVyfS54bHN4IikpCnRfY2ZfbmV1dHJvcGhpbF92M19zaWdfc3ZhCgpkaW0odF9jZl9uZXV0cm9waGlsX3YzX3NpZ19zdmEkZGVzZXEkdXBzW1sxXV0pCmRpbSh0X2NmX21vbm9jeXRlX3YzX3NpZ19zdmEkZGVzZXEkZG93bnNbWzFdXSkKYGBgCgojIyMjIyBHZW5lIHNldCBlbnJpY2htZW50OiBnUHJvZmlsZXIgTmV1dHJvcGhpbHMgVjEKClYxOiBVcDogNSBnZW5lcwpWMTogRG93bjogOCBnZW5lczsgMTQgR08uCgpgYGB7cn0KdF9jZl9uZXV0cm9waGlsX3YxX3NpZ19zdmFfZ3AgPC0gYWxsX2dwcm9maWxlcih0X2NmX25ldXRyb3BoaWxfdjFfc2lnX3N2YSkKdF9jZl9uZXV0cm9waGlsX3YxX3NpZ19zdmFfZ3AKCndyaXR0ZW4gPC0gd3JpdGVfZ3Byb2ZpbGVyX2RhdGEoCiAgdF9jZl9uZXV0cm9waGlsX3YxX3NpZ19zdmFfZ3BbWyJvdXRjb21lX3VwIl1dLAogIGV4Y2VsID0gZ2x1ZSgie3hsc3hfcHJlZml4fS9HZW5lIHNldCBlbnJpY2htZW50L3RfY2ZfbmV1dHJvcGhpbF92MV91cC12e3Zlcn0ueGxzeCIpKQp3cml0dGVuIDwtIHdyaXRlX2dwcm9maWxlcl9kYXRhKAogIHRfY2ZfbmV1dHJvcGhpbF92MV9zaWdfc3ZhX2dwW1sib3V0Y29tZV9kb3duIl1dLAogIGV4Y2VsID0gZ2x1ZSgie3hsc3hfcHJlZml4fS9HZW5lIHNldCBlbnJpY2htZW50L3RfY2ZfbmV1dHJvcGhpbF92MV9kb3duLXZ7dmVyfS54bHN4IikpCgplbnJpY2hwbG90Ojpkb3RwbG90KHRfY2ZfbmV1dHJvcGhpbF92MV9zaWdfc3ZhX2dwW1sib3V0Y29tZV9kb3duIl1dW1siR09fZW5yaWNoIl1dKQpgYGAKCiMjIyMjIEdlbmUgc2V0IGVucmljaG1lbnQ6IGdQcm9maWxlciBOZXV0cm9waGlscyBieSB2aXNpdCwgVjIKClVwOiA1IGdlbmVzOyAzIEdPLCAxMCBURi4KRG93bjogMSBnZW5lLgoKCiMjIyMgTmV1dHJvcGhpbHM6IENvbXBhcmUgc3ZhIHRvIGJhdGNoLWluLW1vZGVsCgpgYGB7cn0Kc3ZhX2F1Y2MgPC0gY2FsY3VsYXRlX2F1Y2ModF9jZl9uZXV0cm9waGlsX3RhYmxlc19zdmFbWyJkYXRhIl1dW1sxXV0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHRibDIgPSB0X2NmX25ldXRyb3BoaWxfdGFibGVzX2JhdGNodmlzaXRbWyJkYXRhIl1dW1sxXV0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHB5ID0gImRlc2VxX2FkanAiLCBseSA9ICJkZXNlcV9sb2dmYyIpCnN2YV9hdWNjCgpzaGFyZWRfaWRzIDwtIHJvd25hbWVzKHRfY2ZfbmV1dHJvcGhpbF90YWJsZXNfc3ZhW1siZGF0YSJdXVtbMV1dKSAlaW4lCiAgcm93bmFtZXModF9jZl9uZXV0cm9waGlsX3RhYmxlc19iYXRjaHZpc2l0W1siZGF0YSJdXVtbMV1dKQpmaXJzdCA8LSB0X2NmX25ldXRyb3BoaWxfdGFibGVzX3N2YVtbImRhdGEiXV1bWzFdXVtzaGFyZWRfaWRzLCBdCnNlY29uZCA8LSB0X2NmX25ldXRyb3BoaWxfdGFibGVzX2JhdGNodmlzaXRbWyJkYXRhIl1dW1sxXV1bcm93bmFtZXMoZmlyc3QpLCBdCmNvci50ZXN0KGZpcnN0W1siZGVzZXFfbG9nZmMiXV0sIHNlY29uZFtbImRlc2VxX2xvZ2ZjIl1dKQpgYGAKCiMjIyBFb3Npbm9waGlscwoKVGhpcyB0aW1lLCB3aXRoIGZlZWxpbmchICBSZXBlYXRpbmcgdGhlIHNhbWUgc2V0IG9mIHRhc2tzIHdpdGggdGhlCmVvc2lub3BoaWwgc2FtcGxlcy4KCmBgYHtyfQp0X2NmX2Vvc2lub3BoaWxfZGVfc3ZhIDwtIGFsbF9wYWlyd2lzZSh0X2Vvc2lub3BoaWxzLCBtb2RlbF9iYXRjaCA9ICJzdmFzZXEiLCBmaWx0ZXIgPSBUUlVFKQp0X2NmX2Vvc2lub3BoaWxfZGVfc3ZhCnRfY2ZfZW9zaW5vcGhpbF90YWJsZXNfc3ZhIDwtIGNvbWJpbmVfZGVfdGFibGVzKAogIHRfY2ZfZW9zaW5vcGhpbF9kZV9zdmEsIGtlZXBlcnMgPSBjZl9jb250cmFzdCwKICBleGNlbCA9IGdsdWUoIntjZl9wcmVmaXh9L0Vvc2lub3BoaWxzL3RfZW9zaW5vcGhpbF9jZl90YWJsZXNfc3ZhLXZ7dmVyfS54bHN4IikpCnRfY2ZfZW9zaW5vcGhpbF90YWJsZXNfc3ZhCnRfY2ZfZW9zaW5vcGhpbF9zaWdfc3ZhIDwtIGV4dHJhY3Rfc2lnbmlmaWNhbnRfZ2VuZXMoCiAgdF9jZl9lb3Npbm9waGlsX3RhYmxlc19zdmEsCiAgZXhjZWwgPSBnbHVlKCJ7Y2ZfcHJlZml4fS9Fb3Npbm9waGlscy90X2Vvc2lub3BoaWxfY2Zfc2lnX3N2YS12e3Zlcn0ueGxzeCIpKQp0X2NmX2Vvc2lub3BoaWxfc2lnX3N2YQoKZGltKHRfY2ZfZW9zaW5vcGhpbF9zaWdfc3ZhJGRlc2VxJHVwc1tbMV1dKQpkaW0odF9jZl9lb3Npbm9waGlsX3NpZ19zdmEkZGVzZXEkZG93bnNbWzFdXSkKCnRfY2ZfZW9zaW5vcGhpbF9kZV9iYXRjaHZpc2l0IDwtIGFsbF9wYWlyd2lzZSh0X2Vvc2lub3BoaWxzLCBtb2RlbF9iYXRjaCA9IFRSVUUsIGZpbHRlciA9IFRSVUUpCnRfY2ZfZW9zaW5vcGhpbF9kZV9iYXRjaHZpc2l0CnRfY2ZfZW9zaW5vcGhpbF90YWJsZXNfYmF0Y2h2aXNpdCA8LSBjb21iaW5lX2RlX3RhYmxlcygKICB0X2NmX2Vvc2lub3BoaWxfZGVfYmF0Y2h2aXNpdCwga2VlcGVycyA9IGNmX2NvbnRyYXN0LAogIGV4Y2VsID0gZ2x1ZSgie2NmX3ByZWZpeH0vRW9zaW5vcGhpbHMvdF9lb3Npbm9waGlsX2NmX3RhYmxlc19iYXRjaHZpc2l0LXZ7dmVyfS54bHN4IikpCnRfY2ZfZW9zaW5vcGhpbF90YWJsZXNfYmF0Y2h2aXNpdAp0X2NmX2Vvc2lub3BoaWxfc2lnX2JhdGNodmlzaXQgPC0gZXh0cmFjdF9zaWduaWZpY2FudF9nZW5lcygKICB0X2NmX2Vvc2lub3BoaWxfdGFibGVzX2JhdGNodmlzaXQsCiAgZXhjZWwgPSBnbHVlKCJ7Y2ZfcHJlZml4fS9Fb3Npbm9waGlscy90X2Vvc2lub3BoaWxfY2Zfc2lnX2JhdGNodmlzaXQtdnt2ZXJ9Lnhsc3giKSkKdF9jZl9lb3Npbm9waGlsX3NpZ19iYXRjaHZpc2l0CgpkaW0odF9jZl9lb3Npbm9waGlsX3NpZ19iYXRjaHZpc2l0JGRlc2VxJHVwc1tbMV1dKQpkaW0odF9jZl9lb3Npbm9waGlsX3NpZ19iYXRjaHZpc2l0JGRlc2VxJGRvd25zW1sxXV0pCgp2aXNpdGNmX2ZhY3RvciA8LSBwYXN0ZTAoInYiLCBwRGF0YSh0X2Vvc2lub3BoaWxzKVtbInZpc2l0bnVtYmVyIl1dLAogICAgICAgICAgICAgICAgICAgICAgICAgcERhdGEodF9lb3Npbm9waGlscylbWyJmaW5hbG91dGNvbWUiXV0pCnRfZW9zaW5vcGhpbF92aXNpdGNmIDwtIHNldF9leHB0X2NvbmRpdGlvbnModF9lb3Npbm9waGlscywgZmFjdCA9IHZpc2l0Y2ZfZmFjdG9yKQoKdF9jZl9lb3Npbm9waGlsX3Zpc2l0c19kZV9zdmEgPC0gYWxsX3BhaXJ3aXNlKHRfZW9zaW5vcGhpbF92aXNpdGNmLCBtb2RlbF9iYXRjaCA9ICJzdmFzZXEiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsdGVyID0gVFJVRSkKdF9jZl9lb3Npbm9waGlsX3Zpc2l0c19kZV9zdmEKdF9jZl9lb3Npbm9waGlsX3Zpc2l0c190YWJsZXNfc3ZhIDwtIGNvbWJpbmVfZGVfdGFibGVzKAogIHRfY2ZfZW9zaW5vcGhpbF92aXNpdHNfZGVfc3ZhLCBrZWVwZXJzID0gdmlzaXRjZl9jb250cmFzdHMsCiAgZXhjZWwgPSBnbHVlKCJ7Y2ZfcHJlZml4fS9Fb3Npbm9waGlscy90X2Vvc2lub3BoaWxfdmlzaXRjZl90YWJsZXNfc3ZhLXZ7dmVyfS54bHN4IikpCnRfY2ZfZW9zaW5vcGhpbF92aXNpdHNfdGFibGVzX3N2YQp0X2NmX2Vvc2lub3BoaWxfdmlzaXRzX3NpZ19zdmEgPC0gZXh0cmFjdF9zaWduaWZpY2FudF9nZW5lcygKICB0X2NmX2Vvc2lub3BoaWxfdmlzaXRzX3RhYmxlc19zdmEsCiAgZXhjZWwgPSBnbHVlKCJ7Y2ZfcHJlZml4fS9Fb3Npbm9waGlscy90X2Vvc2lub3BoaWxfdmlzaXRjZl9zaWdfc3ZhLXZ7dmVyfS54bHN4IikpCnRfY2ZfZW9zaW5vcGhpbF92aXNpdHNfc2lnX3N2YQoKZGltKHRfY2ZfZW9zaW5vcGhpbF92aXNpdHNfc2lnX3N2YSRkZXNlcSR1cHNbWzFdXSkKZGltKHRfY2ZfZW9zaW5vcGhpbF92aXNpdHNfc2lnX3N2YSRkZXNlcSRkb3duc1tbMV1dKQpgYGAKCiMjIyMjIEdlbmUgc2V0IGVucmljaG1lbnQ6IGdQcm9maWxlciBFb3Npbm9waGlscwoKVXA6IDExNiBnZW5lczsgMTIzIEdPLCAyIEtFR0csIDcgUmVhY3RvbWUsIDUgV1AsIDY5IFRGLCAxIG1pUk5BLCAwIG90aGVycwpEb3duOiAgNzQgZ2VuZXM7IDUgR08sIDEgUmVhY3RvbWUsIDQgVEYsIDAgb3RoZXJzCgpgYGB7cn0KdF9jZl9lb3Npbm9waGlsX3NpZ19zdmFfZ3AgPC0gYWxsX2dwcm9maWxlcih0X2NmX2Vvc2lub3BoaWxfc2lnX3N2YSkKdF9jZl9lb3Npbm9waGlsX3NpZ19zdmFfZ3AKCndyaXR0ZW4gPC0gd3JpdGVfZ3Byb2ZpbGVyX2RhdGEoCiAgdF9jZl9lb3Npbm9waGlsX3NpZ19zdmFfZ3BbWyJvdXRjb21lX3VwIl1dLAogIGV4Y2VsID0gZ2x1ZSgie3hsc3hfcHJlZml4fS9HZW5lIHNldCBlbnJpY2htZW50L3RfY2ZfZW9zaW5vcGhpbF91cC12e3Zlcn0ueGxzeCIpKQp3cml0dGVuIDwtIHdyaXRlX2dwcm9maWxlcl9kYXRhKAogIHRfY2ZfZW9zaW5vcGhpbF9zaWdfc3ZhX2dwW1sib3V0Y29tZV9kb3duIl1dLAogIGV4Y2VsID0gZ2x1ZSgie3hsc3hfcHJlZml4fS9HZW5lIHNldCBlbnJpY2htZW50L3RfY2ZfZW9zaW5vcGhpbF9kb3duLXZ7dmVyfS54bHN4IikpCgplbnJpY2hwbG90Ojpkb3RwbG90KHRfY2ZfZW9zaW5vcGhpbF9zaWdfc3ZhX2dwW1sib3V0Y29tZV91cCJdXVtbIkdPX2VucmljaCJdXSkKZW5yaWNocGxvdDo6ZG90cGxvdCh0X2NmX2Vvc2lub3BoaWxfc2lnX3N2YV9ncFtbIm91dGNvbWVfdXAiXV1bWyJSRUFDX2VucmljaCJdXSkKZW5yaWNocGxvdDo6ZG90cGxvdCh0X2NmX2Vvc2lub3BoaWxfc2lnX3N2YV9ncFtbIm91dGNvbWVfdXAiXV1bWyJXUF9lbnJpY2giXV0pCmVucmljaHBsb3Q6OmRvdHBsb3QodF9jZl9lb3Npbm9waGlsX3NpZ19zdmFfZ3BbWyJvdXRjb21lX3VwIl1dW1siVEZfZW5yaWNoIl1dKQoKZW5yaWNocGxvdDo6ZG90cGxvdCh0X2NmX2Vvc2lub3BoaWxfc2lnX3N2YV9ncFtbIm91dGNvbWVfZG93biJdXVtbIkdPX2VucmljaCJdXSkKZW5yaWNocGxvdDo6ZG90cGxvdCh0X2NmX2Vvc2lub3BoaWxfc2lnX3N2YV9ncFtbIm91dGNvbWVfZG93biJdXVtbIlRGX2VucmljaCJdXSkKYGBgCgojIyMjIEMvRiBjZWxsdHlwZSB2b2xjYW5vIHBsb3RzIHdpdGggc3BlY2lmaWMgbGFiZWxzCgojIyMgRmlndXJlIDRCOiBWb2xjYW5vIHBsb3RzCgpOb3RlIHRvIHNlbGYsIHdoZW4gSSByZW5kZXJlZCB0aGUgaHRtbCwgc3R1cGlkIFIgcmFuIG91dCBvZiB0ZW1wIGZpbGVzCmFuZCBzbyBkaWQgbm90IGFjdHVhbGx5IHByaW50IHRoZSBkYXJuIGh0bWwgZG9jdW1lbnQsIGFzIGEgcmVzdWx0IEkKbW9kaWZpZWQgdGhlIHJlbmRlciBmdW5jdGlvbiB0byB0cnkgdG8gbWFrZSBzdXJlIHRoZXJlIGlzIGEgY2xlYW4KZGlyZWN0b3J5IGluIHdoaWNoIHRvIHdvcms7IHRlc3Rpbmcgbm93LiAgSWYgaXQgY29udGludWVzIHRvIG5vdCB3b3JrLApJIHdpbGwgbmVlZCB0byByZW1vdmUgc29tZSBvZiB0aGUgaW1hZ2VzIGNyZWF0ZWQgaW4gdGhpcyBkb2N1bWVudC4KCmBgYHtyfQpudW1fY29sb3IgPC0gY29sb3JfY2hvaWNlc1tbImNsaW5pY19jZiJdXVtbIlR1bWFjb19mYWlsdXJlIl1dCmRlbl9jb2xvciA8LSBjb2xvcl9jaG9pY2VzW1siY2xpbmljX2NmIl1dW1siVHVtYWNvX2N1cmUiXV0Kd2FudGVkX2dlbmVzIDwtIGMoIkZJNDRMIiwgIklGSTI3IiwgIlBSUjUiLCAiUFJSNS1BUkhHQVA4IiwgIlJIQ0UiLAogICAgICAgICAgICAgICAgICAiRkJYTzM5IiwgIlJTQUQyIiwgIlNNVE5MMSIsICJVU1AxOCIsICJBRkFQMSIpCgpjZl9tb25vY3l0ZV90YWJsZSA8LSB0X2NmX21vbm9jeXRlX3RhYmxlc19zdmFbWyJkYXRhIl1dW1sib3V0Y29tZSJdXQpjZl9tb25vY3l0ZV92b2xjYW5vIDwtIHBsb3Rfdm9sY2Fub19jb25kaXRpb25fZGUoCiAgY2ZfbW9ub2N5dGVfdGFibGUsICJvdXRjb21lIiwgbGFiZWwgPSB3YW50ZWRfZ2VuZXMsCiAgZmNfY29sID0gImRlc2VxX2xvZ2ZjIiwgcF9jb2wgPSAiZGVzZXFfYWRqcCIsIGxpbmVfcG9zaXRpb24gPSBOVUxMLAogIGNvbG9yX2hpZ2ggPSBudW1fY29sb3IsIGNvbG9yX2xvdyA9IGRlbl9jb2xvciwgbGFiZWxfc2l6ZSA9IDYpCnBwKGZpbGUgPSBnbHVlKCJpbWFnZXMvY2ZfbW9ub2N5dGVfdm9sY2Fub19sYWJlbGVkLXZ7dmVyfS5zdmciKSkKY2ZfbW9ub2N5dGVfdm9sY2FubyRwbG90CmRldi5vZmYoKQpjZl9tb25vY3l0ZV92b2xjYW5vJHBsb3QKCmNmX2Vvc2lub3BoaWxfdGFibGUgPC0gdF9jZl9lb3Npbm9waGlsX3RhYmxlc19zdmFbWyJkYXRhIl1dW1sib3V0Y29tZSJdXQpjZl9lb3Npbm9waGlsX3ZvbGNhbm8gPC0gcGxvdF92b2xjYW5vX2NvbmRpdGlvbl9kZSgKICBjZl9lb3Npbm9waGlsX3RhYmxlLCAib3V0Y29tZSIsIGxhYmVsID0gd2FudGVkX2dlbmVzLAogIGZjX2NvbCA9ICJkZXNlcV9sb2dmYyIsIHBfY29sID0gImRlc2VxX2FkanAiLCBsaW5lX3Bvc2l0aW9uID0gTlVMTCwKICBjb2xvcl9oaWdoID0gbnVtX2NvbG9yLCBjb2xvcl9sb3cgPSBkZW5fY29sb3IsIGxhYmVsX3NpemUgPSA2KQpwcChmaWxlID0gZ2x1ZSgiaW1hZ2VzL2NmX2Vvc2lub3BoaWxfdm9sY2Fub19sYWJlbGVkLXZ7dmVyfS5zdmciKSkKY2ZfZW9zaW5vcGhpbF92b2xjYW5vJHBsb3QKZGV2Lm9mZigpCmNmX2Vvc2lub3BoaWxfdm9sY2FubyRwbG90CgpjZl9uZXV0cm9waGlsX3RhYmxlIDwtIHRfY2ZfbmV1dHJvcGhpbF90YWJsZXNfc3ZhW1siZGF0YSJdXVtbIm91dGNvbWUiXV0KY2ZfbmV1dHJvcGhpbF92b2xjYW5vIDwtIHBsb3Rfdm9sY2Fub19jb25kaXRpb25fZGUoCiAgY2ZfbmV1dHJvcGhpbF90YWJsZSwgIm91dGNvbWUiLCBsYWJlbCA9IHdhbnRlZF9nZW5lcywKICBmY19jb2wgPSAiZGVzZXFfbG9nZmMiLCBwX2NvbCA9ICJkZXNlcV9hZGpwIiwgbGluZV9wb3NpdGlvbiA9IE5VTEwsCiAgY29sb3JfaGlnaCA9IG51bV9jb2xvciwgY29sb3JfbG93ID0gZGVuX2NvbG9yLCBsYWJlbF9zaXplID0gNikKcHAoZmlsZSA9IGdsdWUoImltYWdlcy9jZl9uZXV0cm9waGlsX3ZvbGNhbm9fbGFiZWxlZC12e3Zlcn0uc3ZnIikpCmNmX25ldXRyb3BoaWxfdm9sY2FubyRwbG90CmRldi5vZmYoKQpjZl9uZXV0cm9waGlsX3ZvbGNhbm8kcGxvdApgYGAKCiMjIyBFb3Npbm9waGlsIHRpbWUgY29tcGFyaXNvbnMKCmBgYHtyfQp0X2NmX2Vvc2lub3BoaWxfdjFfZGVfc3ZhIDwtIGFsbF9wYWlyd2lzZSh0djFfZW9zaW5vcGhpbHMsIG1vZGVsX2JhdGNoID0gInN2YXNlcSIsIGZpbHRlciA9IFRSVUUpCnRfY2ZfZW9zaW5vcGhpbF92MV9kZV9zdmEKdF9jZl9lb3Npbm9waGlsX3YxX3RhYmxlc19zdmEgPC0gY29tYmluZV9kZV90YWJsZXMoCiAgdF9jZl9lb3Npbm9waGlsX3YxX2RlX3N2YSwga2VlcGVycyA9IGNmX2NvbnRyYXN0LAogIGV4Y2VsID0gZ2x1ZSgie2NmX3ByZWZpeH0vRW9zaW5vcGhpbHMvdF9lb3Npbm9waGlsX3YxX2NmX3RhYmxlc19zdmEtdnt2ZXJ9Lnhsc3giKSkKdF9jZl9lb3Npbm9waGlsX3YxX3RhYmxlc19zdmEKdF9jZl9lb3Npbm9waGlsX3YxX3NpZ19zdmEgPC0gZXh0cmFjdF9zaWduaWZpY2FudF9nZW5lcygKICB0X2NmX2Vvc2lub3BoaWxfdjFfdGFibGVzX3N2YSwKICBleGNlbCA9IGdsdWUoIntjZl9wcmVmaXh9L0Vvc2lub3BoaWxzL3RfZW9zaW5vcGhpbF92MV9jZl9zaWdfc3ZhLXZ7dmVyfS54bHN4IikpCnRfY2ZfZW9zaW5vcGhpbF92MV90YWJsZXNfc3ZhCgpkaW0odF9jZl9lb3Npbm9waGlsX3YxX3NpZ19zdmEkZGVzZXEkdXBzW1sxXV0pCmRpbSh0X2NmX2Vvc2lub3BoaWxfdjFfc2lnX3N2YSRkZXNlcSRkb3duc1tbMV1dKQoKdF9jZl9lb3Npbm9waGlsX3YyX2RlX3N2YSA8LSBhbGxfcGFpcndpc2UodHYyX2Vvc2lub3BoaWxzLCBtb2RlbF9iYXRjaCA9ICJzdmFzZXEiLCBmaWx0ZXIgPSBUUlVFKQp0X2NmX2Vvc2lub3BoaWxfdjJfZGVfc3ZhCnRfY2ZfZW9zaW5vcGhpbF92Ml90YWJsZXNfc3ZhIDwtIGNvbWJpbmVfZGVfdGFibGVzKAogIHRfY2ZfZW9zaW5vcGhpbF92Ml9kZV9zdmEsIGtlZXBlcnMgPSBjZl9jb250cmFzdCwKICBleGNlbCA9IGdsdWUoIntjZl9wcmVmaXh9L0Vvc2lub3BoaWxzL3RfZW9zaW5vcGhpbF92Ml9jZl90YWJsZXNfc3ZhLXZ7dmVyfS54bHN4IikpCnRfY2ZfZW9zaW5vcGhpbF92Ml90YWJsZXNfc3ZhCnRfY2ZfZW9zaW5vcGhpbF92Ml9zaWdfc3ZhIDwtIGV4dHJhY3Rfc2lnbmlmaWNhbnRfZ2VuZXMoCiAgdF9jZl9lb3Npbm9waGlsX3YyX3RhYmxlc19zdmEsCiAgZXhjZWwgPSBnbHVlKCJ7Y2ZfcHJlZml4fS9Fb3Npbm9waGlscy90X2Vvc2lub3BoaWxfdjJfY2Zfc2lnX3N2YS12e3Zlcn0ueGxzeCIpKQp0X2NmX2Vvc2lub3BoaWxfdjJfc2lnX3N2YQoKZGltKHRfY2ZfZW9zaW5vcGhpbF92Ml9zaWdfc3ZhJGRlc2VxJHVwc1tbMV1dKQpkaW0odF9jZl9lb3Npbm9waGlsX3YyX3NpZ19zdmEkZGVzZXEkZG93bnNbWzFdXSkKCnRfY2ZfZW9zaW5vcGhpbF92M19kZV9zdmEgPC0gYWxsX3BhaXJ3aXNlKHR2M19lb3Npbm9waGlscywgbW9kZWxfYmF0Y2ggPSAic3Zhc2VxIiwgZmlsdGVyID0gVFJVRSkKdF9jZl9lb3Npbm9waGlsX3YzX2RlX3N2YQp0X2NmX2Vvc2lub3BoaWxfdjNfdGFibGVzX3N2YSA8LSBjb21iaW5lX2RlX3RhYmxlcygKICB0X2NmX2Vvc2lub3BoaWxfdjNfZGVfc3ZhLCBrZWVwZXJzID0gY2ZfY29udHJhc3QsCiAgZXhjZWwgPSBnbHVlKCJ7Y2ZfcHJlZml4fS9Fb3Npbm9waGlscy90X2Vvc2lub3BoaWxfdjNfY2ZfdGFibGVzX3N2YS12e3Zlcn0ueGxzeCIpKQp0X2NmX2Vvc2lub3BoaWxfdjNfdGFibGVzX3N2YQp0X2NmX2Vvc2lub3BoaWxfdjNfc2lnX3N2YSA8LSBleHRyYWN0X3NpZ25pZmljYW50X2dlbmVzKAogIHRfY2ZfZW9zaW5vcGhpbF92M190YWJsZXNfc3ZhLAogIGV4Y2VsID0gZ2x1ZSgie2NmX3ByZWZpeH0vRW9zaW5vcGhpbHMvdF9lb3Npbm9waGlsX3YzX2NmX3NpZ19zdmEtdnt2ZXJ9Lnhsc3giKSkKdF9jZl9lb3Npbm9waGlsX3YzX3NpZ19zdmEKCmRpbSh0X2NmX2Vvc2lub3BoaWxfdjNfc2lnX3N2YSRkZXNlcSR1cHNbWzFdXSkKZGltKHRfY2ZfZW9zaW5vcGhpbF92M19zaWdfc3ZhJGRlc2VxJGRvd25zW1sxXV0pCmBgYAoKIyMjIyMgR2VuZSBzZXQgZW5yaWNobWVudDogZ1Byb2ZpbGVyIEVvc2lub3BoaWxzIFYxCgpVcDogMTMgZ2VuZXMsIG5vIGhpdHMuCkRvd246IDE5IGdlbmVzOyAxMSBHTywgMSBSZWFjdG9tZSwgMSBURgoKYGBge3J9CnRfY2ZfZW9zaW5vcGhpbF92MV9zaWdfc3ZhX2dwIDwtIGFsbF9ncHJvZmlsZXIodF9jZl9lb3Npbm9waGlsX3YxX3NpZ19zdmEpCnRfY2ZfZW9zaW5vcGhpbF92MV9zaWdfc3ZhX2dwCgp3cml0dGVuIDwtIHdyaXRlX2dwcm9maWxlcl9kYXRhKAogIHRfY2ZfZW9zaW5vcGhpbF92MV9zaWdfc3ZhX2dwW1sib3V0Y29tZV91cCJdXSwKICBleGNlbCA9IGdsdWUoInt4bHN4X3ByZWZpeH0vR2VuZSBzZXQgZW5yaWNobWVudC90X2NmX2Vvc2lub3BoaWxfdjFfdXAtdnt2ZXJ9Lnhsc3giKSkKd3JpdHRlbiA8LSB3cml0ZV9ncHJvZmlsZXJfZGF0YSgKICB0X2NmX2Vvc2lub3BoaWxfdjFfc2lnX3N2YV9ncFtbIm91dGNvbWVfZG93biJdXSwKICBleGNlbCA9IGdsdWUoInt4bHN4X3ByZWZpeH0vR2VuZSBzZXQgZW5yaWNobWVudC90X2NmX2Vvc2lub3BoaWxfdjFfZG93bi12e3Zlcn0ueGxzeCIpKQoKZW5yaWNocGxvdDo6ZG90cGxvdCh0X2NmX2Vvc2lub3BoaWxfc2lnX3N2YV9ncFtbIm91dGNvbWVfZG93biJdXVtbIkdPX2VucmljaCJdXSkKZW5yaWNocGxvdDo6ZG90cGxvdCh0X2NmX2Vvc2lub3BoaWxfc2lnX3N2YV9ncFtbIm91dGNvbWVfZG93biJdXVtbIlRGX2VucmljaCJdXSkKYGBgCgojIyMjIyBHZW5lIHNldCBlbnJpY2htZW50OiBnUHJvZmlsZXIgRW9zaW5vcGhpbHMgVjIKClVwOiA5IGdlbmVzOyAyMyBHTywgMiBLRUdHLCAyIFJlYWN0b21lLCA0IFdQCkRvd246IDQgZ2VuZXM7IG5vIGhpdHMKCmBgYHtyfQp0X2NmX2Vvc2lub3BoaWxfdjJfc2lnX3N2YV9ncCA8LSBhbGxfZ3Byb2ZpbGVyKHRfY2ZfZW9zaW5vcGhpbF92Ml9zaWdfc3ZhKQp0X2NmX2Vvc2lub3BoaWxfdjJfc2lnX3N2YV9ncAoKd3JpdHRlbiA8LSB3cml0ZV9ncHJvZmlsZXJfZGF0YSgKICB0X2NmX2Vvc2lub3BoaWxfdjJfc2lnX3N2YV9ncFtbIm91dGNvbWVfdXAiXV0sCiAgZXhjZWwgPSBnbHVlKCJ7eGxzeF9wcmVmaXh9L0dlbmUgc2V0IGVucmljaG1lbnQvdF9jZl9lb3Npbm9waGlsX3YyX3VwLXZ7dmVyfS54bHN4IikpCndyaXR0ZW4gPC0gd3JpdGVfZ3Byb2ZpbGVyX2RhdGEoCiAgdF9jZl9lb3Npbm9waGlsX3YyX3NpZ19zdmFfZ3BbWyJvdXRjb21lX2Rvd24iXV0sCiAgZXhjZWwgPSBnbHVlKCJ7eGxzeF9wcmVmaXh9L0dlbmUgc2V0IGVucmljaG1lbnQvdF9jZl9lb3Npbm9waGlsX3YyX2Rvd24tdnt2ZXJ9Lnhsc3giKSkKCmVucmljaHBsb3Q6OmRvdHBsb3QodF9jZl9lb3Npbm9waGlsX3NpZ19zdmFfZ3BbWyJvdXRjb21lX3VwIl1dW1siR09fZW5yaWNoIl1dKQplbnJpY2hwbG90Ojpkb3RwbG90KHRfY2ZfZW9zaW5vcGhpbF9zaWdfc3ZhX2dwW1sib3V0Y29tZV91cCJdXVtbIldQX2VucmljaCJdXSkKYGBgCgojIyMjIGdQcm9maWxlcjogRW9zaW5vcGhpbHMgVjMKClVwOiA2OCBnZW5lczsgOTUgR08sIDIgS0VHRywgMTIgUmVhY3RvbWUsIDMgV1AsIDYzIFRGLCAxIG1pUk5BCkRvd246IDI5IGdlbmVzOyAzIEdPLCAxIFdQLCAxIFRGLCAzIG1pUk5BCgpgYGB7cn0KdF9jZl9lb3Npbm9waGlsX3YzX3NpZ19zdmFfZ3AgPC0gYWxsX2dwcm9maWxlcih0X2NmX2Vvc2lub3BoaWxfdjNfc2lnX3N2YSkKdF9jZl9lb3Npbm9waGlsX3YzX3NpZ19zdmFfZ3AKCndyaXR0ZW4gPC0gd3JpdGVfZ3Byb2ZpbGVyX2RhdGEoCiAgdF9jZl9lb3Npbm9waGlsX3YzX3NpZ19zdmFfZ3BbWyJvdXRjb21lX3VwIl1dLAogIGV4Y2VsID0gZ2x1ZSgie3hsc3hfcHJlZml4fS9HZW5lIHNldCBlbnJpY2htZW50L3RfY2ZfZW9zaW5vcGhpbF92M191cC12e3Zlcn0ueGxzeCIpKQp3cml0dGVuIDwtIHdyaXRlX2dwcm9maWxlcl9kYXRhKAogIHRfY2ZfZW9zaW5vcGhpbF92M19zaWdfc3ZhX2dwW1sib3V0Y29tZV9kb3duIl1dLAogIGV4Y2VsID0gZ2x1ZSgie3hsc3hfcHJlZml4fS9HZW5lIHNldCBlbnJpY2htZW50L3RfY2ZfZW9zaW5vcGhpbF92M19kb3duLXZ7dmVyfS54bHN4IikpCgplbnJpY2hwbG90Ojpkb3RwbG90KHRfY2ZfZW9zaW5vcGhpbF9zaWdfc3ZhX2dwW1sib3V0Y29tZV91cCJdXVtbIkdPX2VucmljaCJdXSkKZW5yaWNocGxvdDo6ZG90cGxvdCh0X2NmX2Vvc2lub3BoaWxfc2lnX3N2YV9ncFtbIm91dGNvbWVfdXAiXV1bWyJXUF9lbnJpY2giXV0pCmBgYAoKIyMjIyBFb3Npbm9waGlsczogQ29tcGFyZSBzdmEgdG8gYmF0Y2gtaW4tdmlzaXQKCmBgYHtyfQpzdmFfYXVjYyA8LSBjYWxjdWxhdGVfYXVjYyh0X2NmX2Vvc2lub3BoaWxfdGFibGVzX3N2YVtbImRhdGEiXV1bWzFdXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgdGJsMiA9IHRfY2ZfZW9zaW5vcGhpbF90YWJsZXNfYmF0Y2h2aXNpdFtbImRhdGEiXV1bWzFdXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgcHkgPSAiZGVzZXFfYWRqcCIsIGx5ID0gImRlc2VxX2xvZ2ZjIikKc3ZhX2F1Y2MKCnNoYXJlZF9pZHMgPC0gcm93bmFtZXModF9jZl9lb3Npbm9waGlsX3RhYmxlc19zdmFbWyJkYXRhIl1dW1sxXV0pICVpbiUKICByb3duYW1lcyh0X2NmX2Vvc2lub3BoaWxfdGFibGVzX2JhdGNodmlzaXRbWyJkYXRhIl1dW1sxXV0pCmZpcnN0IDwtIHRfY2ZfZW9zaW5vcGhpbF90YWJsZXNfc3ZhW1siZGF0YSJdXVtbMV1dW3NoYXJlZF9pZHMsIF0Kc2Vjb25kIDwtIHRfY2ZfZW9zaW5vcGhpbF90YWJsZXNfYmF0Y2h2aXNpdFtbImRhdGEiXV1bWzFdXVtyb3duYW1lcyhmaXJzdCksIF0KY29yLnRlc3QoZmlyc3RbWyJkZXNlcV9sb2dmYyJdXSwgc2Vjb25kW1siZGVzZXFfbG9nZmMiXV0pCmBgYAoKIyMjIyBDb21wYXJlIG1vbm9jeXRlIENGLCBuZXV0cm9waGlsIENGLCBlb3Npbm9waGlsIENGCgpgYGB7cn0KdF9tb25vX25ldXRfc3ZhX2F1Y2MgPC0gY2FsY3VsYXRlX2F1Y2ModF9jZl9tb25vY3l0ZV90YWJsZXNfc3ZhW1siZGF0YSJdXVtbIm91dGNvbWUiXV0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRibDIgPSB0X2NmX25ldXRyb3BoaWxfdGFibGVzX3N2YVtbImRhdGEiXV1bWyJvdXRjb21lIl1dLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBweSA9ICJkZXNlcV9hZGpwIiwgbHkgPSAiZGVzZXFfbG9nZmMiKQp0X21vbm9fbmV1dF9zdmFfYXVjYwoKdF9tb25vX2VvX3N2YV9hdWNjIDwtIGNhbGN1bGF0ZV9hdWNjKHRfY2ZfbW9ub2N5dGVfdGFibGVzX3N2YVtbImRhdGEiXV1bWyJvdXRjb21lIl1dLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGJsMiA9IHRfY2ZfZW9zaW5vcGhpbF90YWJsZXNfc3ZhW1siZGF0YSJdXVtbIm91dGNvbWUiXV0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBweSA9ICJkZXNlcV9hZGpwIiwgbHkgPSAiZGVzZXFfbG9nZmMiKQp0X21vbm9fZW9fc3ZhX2F1Y2MKCnRfbmV1dF9lb19zdmFfYXVjYyA8LSBjYWxjdWxhdGVfYXVjYyh0X2NmX25ldXRyb3BoaWxfdGFibGVzX3N2YVtbImRhdGEiXV1bWyJvdXRjb21lIl1dLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGJsMiA9IHRfY2ZfZW9zaW5vcGhpbF90YWJsZXNfc3ZhW1siZGF0YSJdXVtbIm91dGNvbWUiXV0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBweSA9ICJkZXNlcV9hZGpwIiwgbHkgPSAiZGVzZXFfbG9nZmMiKQp0X25ldXRfZW9fc3ZhX2F1Y2MKYGBgCgojIyMgQnkgdmlzaXQKCkZvciB0aGVzZSBjb250cmFzdHMsIHdlIHdhbnQgdG8gc2VlIGZhaWxfdjEgdnMuIGN1cmVfdjEsIGZhaWxfdjIKdnMuIGN1cmVfdjIgZXRjLiAgQXMgYSByZXN1bHQsIHdlIHdpbGwgbmVlZCB0byBqdWdnbGUgdGhlIGRhdGEKc2xpZ2h0bHkgYW5kIGFkZCBhbm90aGVyIHNldCBvZiBjb250cmFzdHMuCgojIyMjIEN1cmUvRmFpbCBieSB2aXNpdHMsIGFsbCBjZWxsIHR5cGVzCgpgYGB7cn0KdF92aXNpdF9jZl9hbGxfZGVfc3ZhIDwtIGFsbF9wYWlyd2lzZSh0X3Zpc2l0Y2YsIG1vZGVsX2JhdGNoID0gInN2YXNlcSIsIGZpbHRlciA9IFRSVUUpCnRfdmlzaXRfY2ZfYWxsX2RlX3N2YQp0X3Zpc2l0X2NmX2FsbF90YWJsZXNfc3ZhIDwtIGNvbWJpbmVfZGVfdGFibGVzKAogIHRfdmlzaXRfY2ZfYWxsX2RlX3N2YSwga2VlcGVycyA9IHZpc2l0Y2ZfY29udHJhc3RzLAogIGV4Y2VsID0gZ2x1ZSgie2NmX3ByZWZpeH0vdF9hbGxfdmlzaXRjZl90YWJsZXNfc3ZhLXZ7dmVyfS54bHN4IikpCnRfdmlzaXRfY2ZfYWxsX3RhYmxlc19zdmEKdF92aXNpdF9jZl9hbGxfc2lnX3N2YSA8LSBleHRyYWN0X3NpZ25pZmljYW50X2dlbmVzKAogIHRfdmlzaXRfY2ZfYWxsX3RhYmxlc19zdmEsCiAgZXhjZWwgPSBnbHVlKCJ7Y2ZfcHJlZml4fS90X2FsbF92aXNpdGNmX3NpZ19zdmEtdnt2ZXJ9Lnhsc3giKSkKdF92aXNpdF9jZl9hbGxfc2lnX3N2YQpgYGAKCiMjIyMjIEdlbmUgc2V0IGVucmljaG1lbnQ6IFR1bWFjbyBhbGwgc2FtcGxlcyBDL0YKCkkgYW0gYWRkaW5nIGV2ZXJ5IGdwcm9maWxlciBjYWxsIHRvIHRoaXMgZG9jdW1lbnQsIGJ1dCBJIGhhdmUgYSBzdHJvbmcKZmVlbGluZyB0aGF0IHRoaXMgb25lIGlzIHJlZHVuZGFudC4KCmBgYHtyfQp0X3Zpc2l0X2NmX2FsbF9ncCA8LSBhbGxfZ3Byb2ZpbGVyKHRfdmlzaXRfY2ZfYWxsX3NpZ19zdmEpCnRfdmlzaXRfY2ZfYWxsX2dwCmBgYAoKIyMjIyBDdXJlL0ZhaWwgYnkgdmlzaXQsIE1vbm9jeXRlcwoKYGBge3J9CnZpc2l0Y2ZfZmFjdG9yIDwtIHBhc3RlMCgidiIsIHBEYXRhKHRfbW9ub2N5dGVzKVtbInZpc2l0bnVtYmVyIl1dLCAiXyIsCiAgICAgICAgICAgICAgICAgICAgICAgICBwRGF0YSh0X21vbm9jeXRlcylbWyJmaW5hbG91dGNvbWUiXV0pCnRfbW9ub2N5dGVzX3Zpc2l0Y2YgPC0gc2V0X2V4cHRfY29uZGl0aW9ucyh0X21vbm9jeXRlcywgZmFjdCA9IHZpc2l0Y2ZfZmFjdG9yKQoKdF92aXNpdF9jZl9tb25vY3l0ZV9kZV9zdmEgPC0gYWxsX3BhaXJ3aXNlKHRfbW9ub2N5dGVzX3Zpc2l0Y2YsIG1vZGVsX2JhdGNoID0gInN2YXNlcSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWx0ZXIgPSBUUlVFKQp0X3Zpc2l0X2NmX21vbm9jeXRlX2RlX3N2YQp0X3Zpc2l0X2NmX21vbm9jeXRlX3RhYmxlc19zdmEgPC0gY29tYmluZV9kZV90YWJsZXMoCiAgdF92aXNpdF9jZl9tb25vY3l0ZV9kZV9zdmEsIGtlZXBlcnMgPSB2aXNpdGNmX2NvbnRyYXN0cywKICBleGNlbCA9IGdsdWUoIntjZl9wcmVmaXh9L01vbm9jeXRlcy90X21vbm9jeXRlX3Zpc2l0Y2ZfdGFibGVzX3N2YS12e3Zlcn0ueGxzeCIpKQp0X3Zpc2l0X2NmX21vbm9jeXRlX3RhYmxlc19zdmEKdF92aXNpdF9jZl9tb25vY3l0ZV9zaWdfc3ZhIDwtIGV4dHJhY3Rfc2lnbmlmaWNhbnRfZ2VuZXMoCiAgdF92aXNpdF9jZl9tb25vY3l0ZV90YWJsZXNfc3ZhLAogIGV4Y2VsID0gZ2x1ZSgie2NmX3ByZWZpeH0vTW9ub2N5dGVzL3RfbW9ub2N5dGVfdmlzaXRjZl9zaWdfc3ZhLXZ7dmVyfS54bHN4IikpCnRfdmlzaXRfY2ZfbW9ub2N5dGVfc2lnX3N2YQoKdF92MWZjX2Rlc2VxX21hIDwtIHRfdmlzaXRfY2ZfbW9ub2N5dGVfdGFibGVzX3N2YVtbInBsb3RzIl1dW1sidjFjZiJdXVtbImRlc2VxX21hX3Bsb3RzIl1dW1sicGxvdCJdXQpkZXYgPC0gcHAoZmlsZSA9ICJpbWFnZXMvbW9ub2N5dGVfY2ZfZGVfdjFfbWFwbG90LnBuZyIpCnRfdjFmY19kZXNlcV9tYQpjbG9zZWQgPC0gZGV2Lm9mZigpCnRfdjFmY19kZXNlcV9tYQoKdF92MmZjX2Rlc2VxX21hIDwtIHRfdmlzaXRfY2ZfbW9ub2N5dGVfdGFibGVzX3N2YVtbInBsb3RzIl1dW1sidjJjZiJdXVtbImRlc2VxX21hX3Bsb3RzIl1dW1sicGxvdCJdXQpkZXYgPC0gcHAoZmlsZSA9ICJpbWFnZXMvbW9ub2N5dGVfY2ZfZGVfdjJfbWFwbG90LnBuZyIpCnRfdjJmY19kZXNlcV9tYQpjbG9zZWQgPC0gZGV2Lm9mZigpCnRfdjJmY19kZXNlcV9tYQoKdF92M2ZjX2Rlc2VxX21hIDwtIHRfdmlzaXRfY2ZfbW9ub2N5dGVfdGFibGVzX3N2YVtbInBsb3RzIl1dW1sidjNjZiJdXVtbImRlc2VxX21hX3Bsb3RzIl1dW1sicGxvdCJdXQpkZXYgPC0gcHAoZmlsZSA9ICJpbWFnZXMvbW9ub2N5dGVfY2ZfZGVfdjNfbWFwbG90LnBuZyIpCnRfdjNmY19kZXNlcV9tYQpjbG9zZWQgPC0gZGV2Lm9mZigpCnRfdjNmY19kZXNlcV9tYQpgYGAKCk9uZSBxdWVyeSBmcm9tIEFsZWphbmRybyBpcyB0byBsb29rIGF0IHRoZSBnZW5lcyBzaGFyZWQgdXAvZG93biBhY3Jvc3MKdmlzaXRzLiAgSSBhbSBub3QgZW50aXJlbHkgY2VydGFpbiB3ZSBoYXZlIGVub3VnaCBzYW1wbGVzIGZvciB0aGlzIHRvCndvcmssIGJ1dCBsZXQgdXMgZmluZCBvdXQuCgpJIGFtIHRoaW5raW5nIHRoaXMgaXMgYSBnb29kIHBsYWNlIHRvIHVzZSB0aGUgQVVDQyBjdXJ2ZXMgSSBsZWFybmVkCmFib3V0IHRoYW5rcyB0byBKdWxpZSBDcmlkbGFuZC4KCk5vdGUgdGhhdCB0aGUgZm9sbG93aW5nIGlzIGFsbCBtb25vY3l0ZSBzYW1wbGVzLCB0aGlzIHNob3VsZCB0aGVyZWZvcmUKcG90ZW50aWFsbHkgYmUgbW92ZWQgdXAgYW5kIGEgdmVyc2lvbiBvZiB0aGlzIHdpdGggb25seSB0aGUgVHVtYWNvCnNhbXBsZXMgcHV0IGhlcmU/CgpgYGB7cn0KdjFjZiA8LSB0X3Zpc2l0X2NmX21vbm9jeXRlX3RhYmxlc19zdmFbWyJkYXRhIl1dW1sidjFjZiJdXQp2MmNmIDwtIHRfdmlzaXRfY2ZfbW9ub2N5dGVfdGFibGVzX3N2YVtbImRhdGEiXV1bWyJ2MmNmIl1dCnYzY2YgPC0gdF92aXNpdF9jZl9tb25vY3l0ZV90YWJsZXNfc3ZhW1siZGF0YSJdXVtbInYzY2YiXV0KCnYxX3NpZyA8LSBjKAogIHJvd25hbWVzKHRfdmlzaXRfY2ZfbW9ub2N5dGVfc2lnX3N2YVtbImRlc2VxIl1dW1sidXBzIl1dW1sidjFjZiJdXSksCiAgcm93bmFtZXModF92aXNpdF9jZl9tb25vY3l0ZV9zaWdfc3ZhW1siZGVzZXEiXV1bWyJkb3ducyJdXVtbInYxY2YiXV0pKQpsZW5ndGgodjFfc2lnKQoKdjJfc2lnIDwtIGMoCiAgcm93bmFtZXModF92aXNpdF9jZl9tb25vY3l0ZV9zaWdfc3ZhW1siZGVzZXEiXV1bWyJ1cHMiXV1bWyJ2MmNmIl1dKSwKICByb3duYW1lcyh0X3Zpc2l0X2NmX21vbm9jeXRlX3NpZ19zdmFbWyJkZXNlcSJdXVtbImRvd25zIl1dW1sidjJjZiJdXSkpCmxlbmd0aCh2Ml9zaWcpCgp2M19zaWcgPC0gYygKICByb3duYW1lcyh0X3Zpc2l0X2NmX21vbm9jeXRlX3NpZ19zdmFbWyJkZXNlcSJdXVtbInVwcyJdXVtbInYyY2YiXV0pLAogIHJvd25hbWVzKHRfdmlzaXRfY2ZfbW9ub2N5dGVfc2lnX3N2YVtbImRlc2VxIl1dW1siZG93bnMiXV1bWyJ2MmNmIl1dKSkKbGVuZ3RoKHYzX3NpZykKCnRfbW9ub2N5dGVfdmlzaXRfYXVjY192MnYxIDwtIGNhbGN1bGF0ZV9hdWNjKHYxY2YsIHRibDIgPSB2MmNmLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBweSA9ICJkZXNlcV9hZGpwIiwgbHkgPSAiZGVzZXFfbG9nZmMiKQpkZXYgPC0gcHAoZmlsZSA9ICJpbWFnZXMvbW9ub2N5dGVfdmlzaXRfdjJ2MV9hdWNjLnBuZyIpCnRfbW9ub2N5dGVfdmlzaXRfYXVjY192MnYxW1sicGxvdCJdXQpjbG9zZWQgPC0gZGV2Lm9mZigpCnRfbW9ub2N5dGVfdmlzaXRfYXVjY192MnYxW1sicGxvdCJdXQoKdF9tb25vY3l0ZV92aXNpdF9hdWNjX3YzdjEgPC0gY2FsY3VsYXRlX2F1Y2ModjFjZiwgdGJsMiA9IHYzY2YsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB5ID0gImRlc2VxX2FkanAiLCBseSA9ICJkZXNlcV9sb2dmYyIpCmRldiA8LSBwcChmaWxlID0gImltYWdlcy9tb25vY3l0ZV92aXNpdF92M3YxX2F1Y2MucG5nIikKdF9tb25vY3l0ZV92aXNpdF9hdWNjX3YzdjFbWyJwbG90Il1dCmNsb3NlZCA8LSBkZXYub2ZmKCkKdF9tb25vY3l0ZV92aXNpdF9hdWNjX3YzdjFbWyJwbG90Il1dCmBgYAoKIyMjIyBDdXJlL0ZhaWwgYnkgdmlzaXQsIE5ldXRyb3BoaWxzCgpgYGB7cn0KdmlzaXRjZl9mYWN0b3IgPC0gcGFzdGUwKCJ2IiwgcERhdGEodF9uZXV0cm9waGlscylbWyJ2aXNpdG51bWJlciJdXSwgIl8iLAogICAgICAgICAgICAgICAgICAgICAgICAgcERhdGEodF9uZXV0cm9waGlscylbWyJmaW5hbG91dGNvbWUiXV0pCnRfbmV1dHJvcGhpbF92aXNpdGNmIDwtIHNldF9leHB0X2NvbmRpdGlvbnModF9uZXV0cm9waGlscywgZmFjdCA9IHZpc2l0Y2ZfZmFjdG9yKQoKdF92aXNpdF9jZl9uZXV0cm9waGlsX2RlX3N2YSA8LSBhbGxfcGFpcndpc2UodF9uZXV0cm9waGlsX3Zpc2l0Y2YsIG1vZGVsX2JhdGNoID0gInN2YXNlcSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbHRlciA9IFRSVUUpCnRfdmlzaXRfY2ZfbmV1dHJvcGhpbF9kZV9zdmEKdF92aXNpdF9jZl9uZXV0cm9waGlsX3RhYmxlc19zdmEgPC0gY29tYmluZV9kZV90YWJsZXMoCiAgdF92aXNpdF9jZl9uZXV0cm9waGlsX2RlX3N2YSwga2VlcGVycyA9IHZpc2l0Y2ZfY29udHJhc3RzLAogIGV4Y2VsID0gZ2x1ZSgie2NmX3ByZWZpeH0vTmV1dHJvcGhpbHMvdF9uZXV0cm9waGlsX3Zpc2l0Y2ZfdGFibGVzX3N2YS12e3Zlcn0ueGxzeCIpKQp0X3Zpc2l0X2NmX25ldXRyb3BoaWxfdGFibGVzX3N2YQp0X3Zpc2l0X2NmX25ldXRyb3BoaWxfc2lnX3N2YSA8LSBleHRyYWN0X3NpZ25pZmljYW50X2dlbmVzKAogIHRfdmlzaXRfY2ZfbmV1dHJvcGhpbF90YWJsZXNfc3ZhLAogIGV4Y2VsID0gZ2x1ZSgie2NmX3ByZWZpeH0vTmV1dHJvcGhpbHMvdF9uZXV0cm9waGlsX3Zpc2l0Y2Zfc2lnX3N2YS12e3Zlcn0ueGxzeCIpKQp0X3Zpc2l0X2NmX25ldXRyb3BoaWxfc2lnX3N2YQpgYGAKCiMjIyMgQ3VyZS9GYWlsIGJ5IHZpc2l0LCBFb3Npbm9waGlscwoKYGBge3J9CnZpc2l0Y2ZfZmFjdG9yIDwtIHBhc3RlMCgidiIsIHBEYXRhKHRfZW9zaW5vcGhpbHMpW1sidmlzaXRudW1iZXIiXV0sICJfIiwKICAgICAgICAgICAgICAgICAgICAgICAgIHBEYXRhKHRfZW9zaW5vcGhpbHMpW1siZmluYWxvdXRjb21lIl1dKQp0X2Vvc2lub3BoaWxfdmlzaXRjZiA8LSBzZXRfZXhwdF9jb25kaXRpb25zKHRfZW9zaW5vcGhpbHMsIGZhY3QgPSB2aXNpdGNmX2ZhY3RvcikKCnRfdmlzaXRfY2ZfZW9zaW5vcGhpbF9kZV9zdmEgPC0gYWxsX3BhaXJ3aXNlKHRfZW9zaW5vcGhpbF92aXNpdGNmLCBtb2RlbF9iYXRjaCA9ICJzdmFzZXEiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWx0ZXIgPSBUUlVFKQp0X3Zpc2l0X2NmX2Vvc2lub3BoaWxfZGVfc3ZhCnRfdmlzaXRfY2ZfZW9zaW5vcGhpbF90YWJsZXNfc3ZhIDwtIGNvbWJpbmVfZGVfdGFibGVzKAogIHRfdmlzaXRfY2ZfZW9zaW5vcGhpbF9kZV9zdmEsIGtlZXBlcnMgPSB2aXNpdGNmX2NvbnRyYXN0cywKICBleGNlbCA9IGdsdWUoIntjZl9wcmVmaXh9L0Vvc2lub3BoaWxzL3RfZW9zaW5vcGhpbF92aXNpdGNmX3RhYmxlc19zdmEtdnt2ZXJ9Lnhsc3giKSkKdF92aXNpdF9jZl9lb3Npbm9waGlsX3RhYmxlc19zdmEKdF92aXNpdF9jZl9lb3Npbm9waGlsX3NpZ19zdmEgPC0gZXh0cmFjdF9zaWduaWZpY2FudF9nZW5lcygKICB0X3Zpc2l0X2NmX2Vvc2lub3BoaWxfdGFibGVzX3N2YSwKICBleGNlbCA9IGdsdWUoIntjZl9wcmVmaXh9L0Vvc2lub3BoaWxzL3RfZW9zaW5vcGhpbF92aXNpdGNmX3NpZ19zdmEtdnt2ZXJ9Lnhsc3giKSkKdF92aXNpdF9jZl9lb3Npbm9waGlsX3NpZ19zdmEKYGBgCgojIyBQZXJzaXN0ZW5jZSBpbiB2aXNpdCAzCgpIYXZpbmcgcHV0IHNvbWUgU0wgcmVhZCBtYXBwaW5nIGluZm9ybWF0aW9uIGluIHRoZSBzYW1wbGUgc2hlZXQsIE1hcmlhCkFkZWxhaWRhIGFkZGVkIGEgbmV3IGNvbHVtbiB1c2luZyBpdCB3aXRoIHRoZSBwdXRhdGl2ZSBwZXJzaXN0ZW5jZQpzdGF0ZSBvbiBhIHBlci1zYW1wbGUgYmFzaXMuICBPbmUgcXVlc3Rpb24gd2hpY2ggYXJpc2VkIGZyb20gdGhhdDoKd2hhdCBkaWZmZXJlbmNlcyBhcmUgb2JzZXJ2YWJsZSBiZXR3ZWVuIHRoZSBwZXJzaXN0ZW50IHllcyB2cy4gbm8Kc2FtcGxlcyBvbiBhIHBlci1jZWxsLXR5cGUgYmFzaXMgYW1vbmcgdGhlIHZpc2l0IDMgc2FtcGxlcy4KCiMjIyBTZXR0aW5nIHVwCgpGaXJzdCB0aGluZ3MgZmlyc3QsIGNyZWF0ZSB0aGUgZGF0YXNldHMuCgpgYGB7cn0KcGVyc2lzdGVuY2VfZXhwdCA8LSBzdWJzZXRfZXhwdCh0X2NsaW5pY2FsLCBzdWJzZXQgPSAicGVyc2lzdGVuY2U9PSdZJ3xwZXJzaXN0ZW5jZT09J04nIikgJT4lCiAgc3Vic2V0X2V4cHQoc3Vic2V0ID0gJ3Zpc2l0bnVtYmVyPT0zJykgJT4lCiAgc2V0X2V4cHRfY29uZGl0aW9ucyhmYWN0ID0gJ3BlcnNpc3RlbmNlJykKCiMjIHBlcnNpc3RlbmNlX2Jpb3BzeSA8LSBzdWJzZXRfZXhwdChwZXJzaXN0ZW5jZV9leHB0LCBzdWJzZXQgPSAidHlwZW9mY2VsbHM9PSdiaW9wc3knIikKcGVyc2lzdGVuY2VfbW9ub2N5dGUgPC0gc3Vic2V0X2V4cHQocGVyc2lzdGVuY2VfZXhwdCwgc3Vic2V0ID0gInR5cGVvZmNlbGxzPT0nbW9ub2N5dGVzJyIpCnBlcnNpc3RlbmNlX25ldXRyb3BoaWwgPC0gc3Vic2V0X2V4cHQocGVyc2lzdGVuY2VfZXhwdCwgc3Vic2V0ID0gInR5cGVvZmNlbGxzPT0nbmV1dHJvcGhpbHMnIikKcGVyc2lzdGVuY2VfZW9zaW5vcGhpbCA8LSBzdWJzZXRfZXhwdChwZXJzaXN0ZW5jZV9leHB0LCBzdWJzZXQgPSAidHlwZW9mY2VsbHM9PSdlb3Npbm9waGlscyciKQpgYGAKCiMjIyBUYWtlIGEgbG9vawoKU2VlIGlmIHRoZXJlIGFyZSBhbnkgcGF0dGVybnMgd2hpY2ggbG9vayB1c2FibGUuCgpgYGB7cn0KIyMgQWxsCnBlcnNpc3RlbmNlX25vcm0gPC0gbm9ybWFsaXplX2V4cHQocGVyc2lzdGVuY2VfZXhwdCwgdHJhbnNmb3JtID0gImxvZzIiLCBjb252ZXJ0ID0gImNwbSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9ybSA9ICJxdWFudCIsIGZpbHRlciA9IFRSVUUpCnBsb3RfcGNhKHBlcnNpc3RlbmNlX25vcm0pJHBsb3QKcGVyc2lzdGVuY2VfbmIgPC0gbm9ybWFsaXplX2V4cHQocGVyc2lzdGVuY2VfZXhwdCwgdHJhbnNmb3JtID0gImxvZzIiLCBjb252ZXJ0ID0gImNwbSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhdGNoID0gInN2YXNlcSIsIGZpbHRlciA9IFRSVUUpCnBsb3RfcGNhKHBlcnNpc3RlbmNlX25iKSRwbG90CgojIyBCaW9wc2llcwojI3BlcnNpc3RlbmNlX2Jpb3BzeV9ub3JtIDwtIG5vcm1hbGl6ZV9leHB0KHBlcnNpc3RlbmNlX2Jpb3BzeSwgdHJhbnNmb3JtID0gImxvZzIiLCBjb252ZXJ0ID0gImNwbSIsCiMjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub3JtID0gInF1YW50IiwgZmlsdGVyID0gVFJVRSkKIyNwbG90X3BjYShwZXJzaXN0ZW5jZV9iaW9wc3lfbm9ybSkkcGxvdAojIyBJbnN1ZmZpY2llbnQgZGF0YQoKIyMgTW9ub2N5dGVzCnBlcnNpc3RlbmNlX21vbm9jeXRlX25vcm0gPC0gbm9ybWFsaXplX2V4cHQocGVyc2lzdGVuY2VfbW9ub2N5dGUsIHRyYW5zZm9ybSA9ICJsb2cyIiwgY29udmVydCA9ICJjcG0iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vcm0gPSAicXVhbnQiLCBmaWx0ZXIgPSBUUlVFKQpwbG90X3BjYShwZXJzaXN0ZW5jZV9tb25vY3l0ZV9ub3JtKSRwbG90CnBlcnNpc3RlbmNlX21vbm9jeXRlX25iIDwtIG5vcm1hbGl6ZV9leHB0KHBlcnNpc3RlbmNlX21vbm9jeXRlLCB0cmFuc2Zvcm0gPSAibG9nMiIsIGNvbnZlcnQgPSAiY3BtIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmF0Y2ggPSAic3Zhc2VxIiwgZmlsdGVyID0gVFJVRSkKcGxvdF9wY2EocGVyc2lzdGVuY2VfbW9ub2N5dGVfbmIpJHBsb3QKCiMjIE5ldXRyb3BoaWxzCnBlcnNpc3RlbmNlX25ldXRyb3BoaWxfbm9ybSA8LSBub3JtYWxpemVfZXhwdChwZXJzaXN0ZW5jZV9uZXV0cm9waGlsLCB0cmFuc2Zvcm0gPSAibG9nMiIsIGNvbnZlcnQgPSAiY3BtIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vcm0gPSAicXVhbnQiLCBmaWx0ZXIgPSBUUlVFKQpwbG90X3BjYShwZXJzaXN0ZW5jZV9uZXV0cm9waGlsX25vcm0pJHBsb3QKcGVyc2lzdGVuY2VfbmV1dHJvcGhpbF9uYiA8LSBub3JtYWxpemVfZXhwdChwZXJzaXN0ZW5jZV9uZXV0cm9waGlsLCB0cmFuc2Zvcm0gPSAibG9nMiIsIGNvbnZlcnQgPSAiY3BtIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYXRjaCA9ICJzdmFzZXEiLCBmaWx0ZXIgPSBUUlVFKQpwbG90X3BjYShwZXJzaXN0ZW5jZV9uZXV0cm9waGlsX25iKSRwbG90CgojIyBFb3Npbm9waGlscwpwZXJzaXN0ZW5jZV9lb3Npbm9waGlsX25vcm0gPC0gbm9ybWFsaXplX2V4cHQocGVyc2lzdGVuY2VfZW9zaW5vcGhpbCwgdHJhbnNmb3JtID0gImxvZzIiLCBjb252ZXJ0ID0gImNwbSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub3JtID0gInF1YW50IiwgZmlsdGVyID0gVFJVRSkKcGxvdF9wY2EocGVyc2lzdGVuY2VfZW9zaW5vcGhpbF9ub3JtKSRwbG90CnBlcnNpc3RlbmNlX2Vvc2lub3BoaWxfbmIgPC0gbm9ybWFsaXplX2V4cHQocGVyc2lzdGVuY2VfZW9zaW5vcGhpbCwgdHJhbnNmb3JtID0gImxvZzIiLCBjb252ZXJ0ID0gImNwbSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmF0Y2ggPSAic3Zhc2VxIiwgZmlsdGVyID0gVFJVRSkKcGxvdF9wY2EocGVyc2lzdGVuY2VfZW9zaW5vcGhpbF9uYikkcGxvdApgYGAKCiMjIyBwZXJzaXN0ZW5jZSBERQoKYGBge3J9CnBlcnNpc3RlbmNlX2RlX3N2YSA8LSBhbGxfcGFpcndpc2UocGVyc2lzdGVuY2VfZXhwdCwgZmlsdGVyID0gVFJVRSwgbW9kZWxfYmF0Y2ggPSAic3Zhc2VxIikKcGVyc2lzdGVuY2VfZGVfc3ZhCnBlcnNpc3RlbmNlX3RhYmxlX3N2YSA8LSBjb21iaW5lX2RlX3RhYmxlcygKICBwZXJzaXN0ZW5jZV9kZV9zdmEsCiAgZXhjZWwgPSBnbHVlKCJ7eGxzeF9wcmVmaXh9L0RFX1BlcnNpc3RlbmNlL3BlcnNpc3RlbmNlX2FsbF9kZV9zdmEtdnt2ZXJ9Lnhsc3giKSkKcGVyc2lzdGVuY2VfdGFibGVfc3ZhCnBlcnNpc3RlbmNlX21vbm9jeXRlX2RlX3N2YSA8LSBhbGxfcGFpcndpc2UocGVyc2lzdGVuY2VfbW9ub2N5dGUsIGZpbHRlciA9IFRSVUUsIG1vZGVsX2JhdGNoID0gInN2YXNlcSIpCnBlcnNpc3RlbmNlX21vbm9jeXRlX2RlX3N2YQpwZXJzaXN0ZW5jZV9tb25vY3l0ZV90YWJsZV9zdmEgPC0gY29tYmluZV9kZV90YWJsZXMoCiAgcGVyc2lzdGVuY2VfbW9ub2N5dGVfZGVfc3ZhLAogIGV4Y2VsID0gZ2x1ZSgie3hsc3hfcHJlZml4fS9ERV9QZXJzaXN0ZW5jZS9wZXJzaXN0ZW5jZV9tb25vY3l0ZV9kZV9zdmEtdnt2ZXJ9Lnhsc3giKSkKcGVyc2lzdGVuY2VfbW9ub2N5dGVfdGFibGVfc3ZhCgpwZXJzaXN0ZW5jZV9uZXV0cm9waGlsX2RlX3N2YSA8LSBhbGxfcGFpcndpc2UocGVyc2lzdGVuY2VfbmV1dHJvcGhpbCwgZmlsdGVyID0gVFJVRSwgbW9kZWxfYmF0Y2ggPSAic3Zhc2VxIikKcGVyc2lzdGVuY2VfbmV1dHJvcGhpbF9kZV9zdmEKcGVyc2lzdGVuY2VfbmV1dHJvcGhpbF90YWJsZV9zdmEgPC0gY29tYmluZV9kZV90YWJsZXMoCiAgcGVyc2lzdGVuY2VfbmV1dHJvcGhpbF9kZV9zdmEsCiAgZXhjZWwgPSBnbHVlKCJ7eGxzeF9wcmVmaXh9L0RFX1BlcnNpc3RlbmNlL3BlcnNpc3RlbmNlX25ldXRyb3BoaWxfZGVfc3ZhLXZ7dmVyfS54bHN4IikpCnBlcnNpc3RlbmNlX25ldXRyb3BoaWxfdGFibGVfc3ZhCgojIyBUaGVyZSBhcmUgaW5zdWZmaWNpZW50IHNhbXBsZXMgKDEpIGluIHRoZSAnTicgY2F0ZWdvcnkuCiMjcGVyc2lzdGVuY2VfZW9zaW5vcGhpbF9kZV9zdmEgPC0gYWxsX3BhaXJ3aXNlKHBlcnNpc3RlbmNlX2Vvc2lub3BoaWwsIGZpbHRlciA9IFRSVUUsIG1vZGVsX2JhdGNoID0gInN2YXNlcSIpCiMjcGVyc2lzdGVuY2VfZW9zaW5vcGhpbF9kZV9zdmEKIyNwZXJzaXN0ZW5jZV9lb3Npbm9waGlsX3RhYmxlX3N2YSA8LSBjb21iaW5lX2RlX3RhYmxlcygKIyMgIHBlcnNpc3RlbmNlX2Vvc2lub3BoaWxfZGVfc3ZhLAojIyAgZXhjZWwgPSBnbHVlKCJ7eGxzeF9wcmVmaXh9L0RFX1BlcnNpc3RlbmNlL3BlcnNpc3RlbmNlX2Vvc2lub3BoaWxfZGVfc3ZhLXZ7dmVyfS54bHN4IikpCmBgYAoKIyMgQ29tcGFyaW5nIHZpc2l0cyB3aXRob3V0IHJlZ2FyZCB0byBjdXJlL2ZhaWwKCiMjIyBBbGwgY2VsbCB0eXBlcwoKYGBge3J9CnRfdmlzaXRfYWxsX2RlX3N2YSA8LSBhbGxfcGFpcndpc2UodF92aXNpdCwgZmlsdGVyID0gVFJVRSwgbW9kZWxfYmF0Y2ggPSAic3Zhc2VxIikKdF92aXNpdF9hbGxfZGVfc3ZhCnRfdmlzaXRfYWxsX3RhYmxlX3N2YSA8LSBjb21iaW5lX2RlX3RhYmxlcygKICB0X3Zpc2l0X2FsbF9kZV9zdmEsIGtlZXBlcnMgPSB2aXNpdF9jb250cmFzdHMsCiAgZXhjZWwgPSBnbHVlKCJ7eGxzeF9wcmVmaXh9L0RFX1Zpc2l0cy90X2FsbF92aXNpdF90YWJsZXNfc3ZhLXZ7dmVyfS54bHN4IikpCnRfdmlzaXRfYWxsX3RhYmxlX3N2YQp0X3Zpc2l0X2FsbF9zaWdfc3ZhIDwtIGV4dHJhY3Rfc2lnbmlmaWNhbnRfZ2VuZXMoCiAgdF92aXNpdF9hbGxfdGFibGVfc3ZhLAogIGV4Y2VsID0gZ2x1ZSgie3hsc3hfcHJlZml4fS9ERV9WaXNpdHMvdF9hbGxfdmlzaXRfc2lnX3N2YS12e3Zlcn0ueGxzeCIpKQp0X3Zpc2l0X2FsbF9zaWdfc3ZhCmBgYAoKIyMjIE1vbm9jeXRlIHNhbXBsZXMKCmBgYHtyfQp0X3Zpc2l0X21vbm9jeXRlcyA8LSBzZXRfZXhwdF9jb25kaXRpb25zKHRfbW9ub2N5dGVzLCBmYWN0ID0gInZpc2l0bnVtYmVyIikKCnRfdmlzaXRfbW9ub2N5dGVfZGVfc3ZhIDwtIGFsbF9wYWlyd2lzZSh0X3Zpc2l0X21vbm9jeXRlcywgZmlsdGVyID0gVFJVRSwgbW9kZWxfYmF0Y2ggPSAic3Zhc2VxIikKdF92aXNpdF9tb25vY3l0ZV9kZV9zdmEKdF92aXNpdF9tb25vY3l0ZV90YWJsZV9zdmEgPC0gY29tYmluZV9kZV90YWJsZXMoCiAgdF92aXNpdF9tb25vY3l0ZV9kZV9zdmEsIGtlZXBlcnMgPSB2aXNpdF9jb250cmFzdHMsCiAgZXhjZWwgPSBnbHVlKCJ7eGxzeF9wcmVmaXh9L0RFX1Zpc2l0cy9Nb25vY3l0ZXMvdF9tb25vY3l0ZV92aXNpdF90YWJsZXNfc3ZhLXZ7dmVyfS54bHN4IikpCnRfdmlzaXRfbW9ub2N5dGVfdGFibGVfc3ZhCnRfdmlzaXRfbW9ub2N5dGVfc2lnX3N2YSA8LSBleHRyYWN0X3NpZ25pZmljYW50X2dlbmVzKAogIHRfdmlzaXRfbW9ub2N5dGVfdGFibGVfc3ZhLAogIGV4Y2VsID0gZ2x1ZSgie3hsc3hfcHJlZml4fS9ERV9WaXNpdHMvTW9ub2N5dGVzL3RfbW9ub2N5dGVfdmlzaXRfc2lnX3N2YS12e3Zlcn0ueGxzeCIpKQp0X3Zpc2l0X21vbm9jeXRlX3NpZ19zdmEKYGBgCgojIyMgTmV1dHJvcGhpbCBzYW1wbGVzCgpgYGB7cn0KdF92aXNpdF9uZXV0cm9waGlscyA8LSBzZXRfZXhwdF9jb25kaXRpb25zKHRfbmV1dHJvcGhpbHMsIGZhY3QgPSAidmlzaXRudW1iZXIiKQoKdF92aXNpdF9uZXV0cm9waGlsX2RlX3N2YSA8LSBhbGxfcGFpcndpc2UodF92aXNpdF9uZXV0cm9waGlscywgZmlsdGVyID0gVFJVRSwgbW9kZWxfYmF0Y2ggPSAic3Zhc2VxIikKdF92aXNpdF9uZXV0cm9waGlsX2RlX3N2YQp0X3Zpc2l0X25ldXRyb3BoaWxfdGFibGVfc3ZhIDwtIGNvbWJpbmVfZGVfdGFibGVzKAogIHRfdmlzaXRfbmV1dHJvcGhpbF9kZV9zdmEsIGtlZXBlcnMgPSB2aXNpdF9jb250cmFzdHMsCiAgZXhjZWwgPSBnbHVlKCJ7eGxzeF9wcmVmaXh9L0RFX1Zpc2l0cy9OZXV0cm9waGlscy90X25ldXRyb3BoaWxfdmlzaXRfdGFibGVfc3ZhLXZ7dmVyfS54bHN4IikpCnRfdmlzaXRfbmV1dHJvcGhpbF90YWJsZV9zdmEKdF92aXNpdF9uZXV0cm9waGlsX3NpZ19zdmEgPC0gZXh0cmFjdF9zaWduaWZpY2FudF9nZW5lcygKICB0X3Zpc2l0X25ldXRyb3BoaWxfdGFibGVfc3ZhLAogIGV4Y2VsID0gZ2x1ZSgie3hsc3hfcHJlZml4fS9ERV9WaXNpdHMvTmV1dHJvcGhpbHMvdF9uZXV0cm9waGlsX3Zpc2l0X3NpZ19zdmEtdnt2ZXJ9Lnhsc3giKSkKdF92aXNpdF9uZXV0cm9waGlsX3NpZ19zdmEKYGBgCgojIyMgRW9zaW5vcGhpbCBzYW1wbGVzCgpgYGB7cn0KdF92aXNpdF9lb3Npbm9waGlscyA8LSBzZXRfZXhwdF9jb25kaXRpb25zKHRfZW9zaW5vcGhpbHMsIGZhY3Q9InZpc2l0bnVtYmVyIikKCnRfdmlzaXRfZW9zaW5vcGhpbF9kZSA8LSBhbGxfcGFpcndpc2UodF92aXNpdF9lb3Npbm9waGlscywgZmlsdGVyID0gVFJVRSwgbW9kZWxfYmF0Y2ggPSAic3Zhc2VxIikKdF92aXNpdF9lb3Npbm9waGlsX2RlCnRfdmlzaXRfZW9zaW5vcGhpbF90YWJsZSA8LSBjb21iaW5lX2RlX3RhYmxlcygKICB0X3Zpc2l0X2Vvc2lub3BoaWxfZGUsIGtlZXBlcnMgPSB2aXNpdF9jb250cmFzdHMsCiAgZXhjZWwgPSBnbHVlKCJ7eGxzeF9wcmVmaXh9L0RFX1Zpc2l0cy9Fb3Npbm9waGlscy90X2Vvc2lub3BoaWxfdmlzaXRfdGFibGVfc3ZhLXZ7dmVyfS54bHN4IikpCnRfdmlzaXRfZW9zaW5vcGhpbF90YWJsZQp0X3Zpc2l0X2Vvc2lub3BoaWxfc2lnIDwtIGV4dHJhY3Rfc2lnbmlmaWNhbnRfZ2VuZXMoCiAgdF92aXNpdF9lb3Npbm9waGlsX3RhYmxlLAogIGV4Y2VsID0gZ2x1ZSgie3hsc3hfcHJlZml4fS9ERV9WaXNpdHMvRW9zaW5vcGhpbHMvdF9lb3Npbm9waGlsX3Zpc2l0X3NpZ19zdmEtdnt2ZXJ9Lnhsc3giKSkKIyMgTm8gc2lnbmlmaWNhbnQgZ2VuZXMgb2JzZXJ2ZWQuCmBgYAoKIyBFeHBsb3JlIFJPQwoKQWxlamFuZHJvIHNob3dlZCBzb21lIFJPQyBjdXJ2ZXMgZm9yIGVvc2lub3BoaWwgZGF0YSBzaG93aW5nCnNlbnNpdGl2aXR5IHZzLiBzcGVjaWZpY2l0eSBvZiBhIGNvdXBsZSBnZW5lcyB3aGljaCB3ZXJlIG9ic2VydmVkIGluCnYxIGVvc2lub3BoaWxzIHZzLiBhbGwtdGltZXMgZW9zaW5vcGhpbHMgYWNyb3NzIGN1cmUvZmFpbC4gIEkgYW0KY3VyaW91cyB0byBiZXR0ZXIgdW5kZXJzdGFuZCBob3cgdGhpcyB3YXMgZG9uZSBhbmQgd2hhdCB1dGlsaXR5IGl0Cm1pZ2h0IGhhdmUgaW4gb3RoZXIgY29udGV4dHMuCgpUbyB0aGF0IGVuZCwgSSB3YW50IHRvIHRyeSBzb21ldGhpbmcgc2ltaWxhciBteXNlbGYuIEluIG9yZGVyIHRvCnByb3Blcmx5IHBlcmZvcm0gdGhlIGFuYWx5c2lzIHdpdGggdGhlc2UgdmFyaW91cyB0b29scywgSSBuZWVkIHRvCnJlY29uZmlndXJlIHRoZSBkYXRhIGluIGEgcHJldHR5IHNwZWNpZmljIGZvcm1hdDoKCjEuICBTaW5nbGUgZGYgd2l0aCAxIHJvdyBwZXIgc2V0IG9mIG9ic2VydmF0aW9ucyAoc2FtcGxlIGluIHRoaXMgY2FzZQpJIHRoaW5rKQoyLiAgVGhlIG91dGNvbWUgY29sdW1uKHMpIG5lZWQgdG8gYmUgMSAob3IgbW9yZT8pIG1ldGFkYXRhIGZhY3RvcihzKQooY3VyZS9mYWlsIG9yIGEgcGFzdGUwIG9mIHJlbGV2YW50IHF1ZXJpZXMgKGVvX3YxX2N1cmUsCmVvX3YxMjNfY3VyZSwgZXRjKQozLiAgVGhlIHByZWRpY3RvciBjb2x1bW4ocykgYXJlIHRoZSBtZWFzdXJlbWVudHMgKHJwa20gb2YgMSBvciBtb3JlCmdlbmVzKSwgMSBjb2x1bW4gZWFjaCBnZW5lLgoKSWYgSSBpbnRlbmQgdG8gdXNlIHRoaXMgZm9yIG91ciB0eCBkYXRhLCBJIHdpbGwgbGlrZWx5IG5lZWQgYSB1dGlsaXR5CmZ1bmN0aW9uIHRvIGNyZWF0ZSB0aGUgcHJvcGVybHkgZm9ybWF0dGVkIGlucHV0IGRmLgoKRm9yIHRoZSBwdXJwb3NlcyBvZiBteSBwbGF5aW5nLCBJIHdpbGwgY2hvb3NlIHRocmVlIGdlbmVzIGZyb20gdGhlCmVvc2lub3BoaWwgQy9GIHRhYmxlLCBvbmUgd2hpY2ggaXMgc2lnbmlmaWNhbnQsIG9uZSB3aGljaCBpcyBub3QsIGFuZAphbiBhcmJpdHJhcnkuCgpUaGUgaW5wdXQgZ2VuZXMgd2lsbCB0aGVyZWZvcmUgYmUgY2hvc2VuIGZyb20gdGhlIGRhdGEgc3RydWN0dXJlOgp0X2NmX2Vvc2lub3BoaWxfdGFibGVzX3N2YToKCkVOU0cwMDAwMDE5ODE3OCwgRU5TRzAwMDAwMTc5MzQ0LCBFTlNHMDAwMDAxODI2MjgKCmBgYHtyfQplb19ycGttIDwtIG5vcm1hbGl6ZV9leHB0KHR2MV9lb3Npbm9waGlscywgY29udmVydCA9ICJycGttIiwgY29sdW1uID0gImNkc19sZW5ndGgiKQpgYGAKCiMgQW4gZXh0ZXJuYWwgZGF0YXNldAoKVGhpcyBwYXBlciBpcyBET0k6MTAuMTEyNi9zY2l0cmFuc2xtZWQuYWF4NDIwNAoKVmFyaWFibGUgZ2VuZSBleHByZXNzaW9uIGFuZCBwYXJhc2l0ZSBsb2FkIHByZWRpY3QgdHJlYXRtZW50IG91dGNvbWUgaW4gY3V0YW5lb3VzIGxlaXNobWFuaWFzaXMuCgpPbmUgcXVlcnkgZnJvbSBNYXJpYSBBZGVsYWlkYSBpcyB0byBzZWUgaG93IHRoaXMgZGF0YSBmaXRzIHdpdGggb3Vycy4KSSBoYXZlIHJlYWQgdGhpcyBwYXBlciBhIGNvdXBsZSBvZiB0aW1lcyBub3cgYW5kIEkgZ2V0IGNvbmZ1c2VkIG9uIGEKY291cGxlIG9mIHBvaW50cyBldmVyeSB0aW1lLCB3aGljaCBJIHdpbGwgZXhwbGFpbiBpbiBhIG1vbWVudC4gIFRoZQpleHBlcm1lbnRhbCBkZXNpZ24gaXMga2V5IHRvIG15IGNvbmZ1c2lvbiBhbmQga2V5IHRvIHdoYXQgSSB0aGluayBpcwpiZWluZyBtaXNzZWQgaW4gb3VyIGludGVycHJldGF0aW9uIG9mIHRoZSByZXN1bHRzOgoKMS4gIFRoZSBQQ0EgaXMgbm90IGN1cmUgdnMuIGZhaWwgYnV0IGhlYWx0aHkgc2tpbiB2cy4gQ0wgbGVzaW9uLgoKIyMgT25seSB0aGUgU2NvdHQgZGF0YQoKYGBge3J9CmV4dGVybmFsX2NmCgpleHRlcm5hbF9ub3JtIDwtIG5vcm1hbGl6ZV9leHB0KGV4dGVybmFsX2NmLCBmaWx0ZXIgPSBUUlVFLCBub3JtID0gInF1YW50IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb252ZXJ0ID0gImNwbSIsIHRyYW5zZm9ybSA9ICJsb2cyIikKcGxvdF9wY2EoZXh0ZXJuYWxfbm9ybSkKZXh0ZXJuYWxfbmIgPC0gbm9ybWFsaXplX2V4cHQoZXh0ZXJuYWxfY2YsIGZpbHRlciA9IFRSVUUsIGJhdGNoID0gInN2YXNlcSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udmVydCA9ICJjcG0iLCB0cmFuc2Zvcm0gPSAibG9nMiIpCnBsb3RfcGNhKGV4dGVybmFsX25iKQoKZXh0ZXJuYWxfZGUgPC0gYWxsX3BhaXJ3aXNlKGV4dGVybmFsX2NmLCBmaWx0ZXIgPSBUUlVFLCBtb2RlbF9iYXRjaCA9ICJzdmFzZXEiKQpleHRlcm5hbF9kZQpleHRlcm5hbF90YWJsZSA8LSBjb21iaW5lX2RlX3RhYmxlcyhleHRlcm5hbF9kZSwgZXhjZWwgPSAiZXhjZWwvc2NvdHRfdGFibGUueGxzeCIpCmV4dGVybmFsX3RhYmxlCmV4dGVybmFsX3NpZyA8LSBleHRyYWN0X3NpZ25pZmljYW50X2dlbmVzKGV4dGVybmFsX3RhYmxlLCBleGNlbCA9ICJleGNlbC9zY290dF9zaWcueGxzeCIpCmV4dGVybmFsX3NpZwoKZXh0ZXJuYWxfdG9wMTAwIDwtIGV4dHJhY3Rfc2lnbmlmaWNhbnRfZ2VuZXMoZXh0ZXJuYWxfdGFibGUsIG4gPSAxMDApCmV4dGVybmFsX3VwIDwtIGV4dGVybmFsX3RvcDEwMFtbImRlc2VxIl1dW1sidXBzIl1dW1siZmFpbHVyZV92c19jdXJlIl1dCmV4dGVybmFsX2Rvd24gPC0gZXh0ZXJuYWxfdG9wMTAwW1siZGVzZXEiXV1bWyJkb3ducyJdXVtbImZhaWx1cmVfdnNfY3VyZSJdXQpgYGAKCiMgQW4gZXhwbGljaXQgY29tcGFyaXNvbiBvZiBtZXRob2RzLgoKSSB0aGluayBJIGFtIGdldHRpbmcgYSBzaWduaWZpY2FudGx5IGRpZmZlcmVudCByZXN1bHQgZnJvbSBTY290dCwgc28gSQphbSBnb2luZyB0byBkbyBhbiBleHBsaWNpdCBzaWRlLWJ5LXNpZGUgY29tcGFyaXNvbiBvZiBvdXIgcmVzdWx0cyBhdAplYWNoIHN0ZXAuICBJbiBvcmRlciB0byBkbyB0aGlzLCBJIGFtIHVzaW5nIHRoZSBjYXBzdWxlIHRoZXkga2luZGx5CnByb3ZpZGVkIHdpdGggdGhlaXIgcHVibGljYXRpb24uCgpJIGFtIGNvcHkvcGFzdGluZyBtYXRlcmlhbCBmcm9tIHRoZWlyIHB1YmxpY2F0aW9uIHdpdGggc29tZQptb2RpZmljYXRpb24gd2hpY2ggSSB3aWxsIG5vdGUgYXMgSSBnby4KCkhlcmUgaXMgdGhlaXIgYmxvY2sgJ3IgcGFja2FnZXMnCgoqTm90ZS9TcG9pbGVyIGFsZXJ0KjogSXQgYWN0dWFsbHkgdHVybnMgb3V0IG91ciByZXN1bHRzIGFyZSBiYXNpY2FsbHkKcmVsYXRpdmVseSBzaW1pbGFyLCBJIGp1c3QgZGlkbid0IHVuZGVyc3RhbmQgd2hhdCBjb21wYXJpc29ucyBhcmUKYWN0dWFsbHkgaW4gcGFwZXIgdnMgdGhvc2UgSSBoYXZlIHByaW1hcnkgaW50ZXJlc3QuICBJbiBhZGRpdGlvbiwgd2UKaGFuZGxlZCBnZW5lIElEcyBkaWZmZXJlbnRseSAoZ2VuZSBjYXJkIHZzLiBFbnNlbWJsSUQpIHdoaWNoIGhhcyBhCnN1cnByaXNpbmdseSBiaWcgZWZmZWN0LgoKT2gsIEkganVzdCByZWFsaXplZCB0aGF0IHdoZW4gSSBkaWQgdGhlc2UgYW5hbHlzZXMsIEkgZGlkIHRoZW0gaW4gYQpjb21wbGV0ZWx5IHNlcGFyYXRlIHRyZWUgYW5kIGNvbXBhcmVkIHRoZSByZXN1bHRzIHBvc3QtZmFjdG8uICBUaGlzCmFzc3VtcHRpb24gcmVtYWlucyBpbiB0aGlzIGRvY3VtZW50IGFuZCB0aGVyZWZvcmUgaXMgdW5saWtlbHkgdG8gd29yawpwcm9wZXJseSBpbiB0aGUgY29udGFpbmVyaXplZCBlbnZpcm9ubWVudCBJIGFtIGF0dGVtcHRpbmcgdG8gY3JlYXRlLgpHaXZlbiB0aGF0IHRoZSBwcmltYXJ5IGdvYWwgb2YgdGhpcyBzZWN0aW9uIGlzIHRvIHNob3cgdG8gbXlzZWxmIHRoYXQKSSBjb21wYXJlZCB0aGUgdHdvIGRhdGFzZXRzIGFzIHRob3JvdWdobHkgYXMgSSBjb3VsZCwgcGVyaGFwcyBJIHNob3VsZApqdXN0IGRpc2FibGUgdGhlbSBmb3IgdGhlIGNvbnRhaW5lciBhbmQgYWxsb3cgdGhlIHJlYWRlciB0byBwZXJmb3JtCnRoZSBleGVyY2lzZSBkZS1ub3ZvLgoKYGBge3IsIGV2YWw9RkFMU0V9CmxpYnJhcnkodGlkeXZlcnNlKQpsaWJyYXJ5KGdndGhlbWVzKQpsaWJyYXJ5KHJlc2hhcGUyKQpsaWJyYXJ5KGVkZ2VSKQpsaWJyYXJ5KHBhdGNod29yaykKbGlicmFyeSh2ZWdhbikKbGlicmFyeShEVCkKbGlicmFyeSh0eGltcG9ydCkKbGlicmFyeShncGxvdHMpCmxpYnJhcnkoRmluQ2FsKQpsaWJyYXJ5KGdncmVwZWwpCmxpYnJhcnkoZ3QpCmxpYnJhcnkoZ2dFeHRyYSkKbGlicmFyeShFbnNEYi5Ic2FwaWVucy52ODYpCmxpYnJhcnkoc3RyaW5ncikKbGlicmFyeShjb3dwbG90KQpsaWJyYXJ5KGdncHVicikKYGBgCgpJIGhhdmUgYSBzZXBhcmF0ZSB0cmVlIGluIHdoaWNoIEkgY29waWVkIHRoZSBjYXBzdWxlIGFuZCBkYXRhLiAgSQpwZXJmb3JtZWQgZXhhY3RseSB0aGVpciBzdGVwcyBrYWxsaXN0byBxdWFudCBzdGVwcyB3aXRoaW4gaXQgYW5kIHB1dAp0aGUgb3V0cHV0IGRhdGEgaW50byB0aGUgc2FtZSBwbGFjZSB3aXRoaW4gaXQuICBJIGRpZCBjaGFuZ2UgdGhlCmNvbW1hbmRzIHNsaWdodGx5IGJlY2F1c2UgSSBkb3dubG9hZGVkIHRoZSBmaWxlcyBmcm9tIFNSQSBhbmQgc28gZG9uJ3QKaGF2ZSB0aGVtIHdpdGggbmFtZXMgbGlrZSAnaG9zdF9DTDAxJywgYnV0IGluc3RlYWQgJ1BSSk5BLi4uJy4gIEJ1dAp0aGUgc2FtcGxlcyBhcmUgaW4gdGhlIHNhbWUgb3JkZXIsIHNvIEkgc2VudCB0aGUgb3V0cHV0IGZpbGVzIHRvIHRoZQpzYW1lIGZpbmFsIGZpbGVuYW1lcy4gIEhlcmUgaXMgYW4gZXhhbXBsZSBmcm9tIHRoZSBmaXJzdCBzYW1wbGU6CgpgYGB7YmFzaCBmaXJzdF9zYW1wbGUsIGV2YWw9RkFMU0V9CmNkIHByZXByb2Nlc3NpbmcKbW9kdWxlIGFkZCBrYWxsaXN0bwprYWxsaXN0byBpbmRleCAtaSBIb21vX3NhcGllbnMuR1JDaDM4LmNkbmEuYWxsLkluZGV4IEhvbW9fc2FwaWVucy5HUkNoMzguY2RuYS5hbGwuZmEKIyBNYXAgcmVhZHMgdG8gdGhlIGluZGV4ZWQgcmVmZXJlbmNlIHRyYW5zY3JpcHRvbWUgZm9yIEhPU1QKIyBmaXJzdCB0aGUgaGVhbHRoeSBzdWJqZWN0cyAoSFMpCmV4cG9ydCBMRVNTID0gJy0tYnVmZmVycyAwIC1CJwprYWxsaXN0byBxdWFudCAtaSBIb21vX3NhcGllbnMuR1JDaDM4LmNkbmEuYWxsLkluZGV4IC1vIGhvc3RfSFMwMSAtdCAyNCAtYiA2MCBcCiAgICAgICAgIC0tc2luZ2xlIC1sIDI1MCAtcyAzMCA8KGxlc3MgU1JSODY2ODc1NS8qLXRyaW1tZWQuZmFzdHEueHopIDI+aG9zdF9IUzAxLmxvZyAxPiYyICYKYGBgCgojIEJsb2NrICdzYW1wbGVfaW5mbycKCkkgYW0gZ29pbmcgdG8gY2hhbmdlIHRoZSBwYXRoIHZlcnkgc2xpZ2h0bHkgaW4gdGhlIGZvbGxvd2luZyBibG9jawpzaW1wbHkgYmVjYXVzZSBJIHB1dCB0aGUgY2Fwc3VsZSBpbiBhIHNlcGFyYXRlIGRpcmVjdG9yeSBhbmQgZG8gbm90CndhbnQgdG8gY29weSBpdCBoZXJlLiAgT3RoZXJ3aXNlIGl0IGlzIHVubW9kaWZpZWQuICBBbHNvLCB0aGUgZnVuY3Rpb24KZ3Q6OnRhYl9oZWFkZXIoKSBhbm5veXMgdGhlIGNyYXAgb3V0IG9mIG1lLgoKYGBge3IsIGV2YWw9RkFMU0V9CmltcG9ydCA8LSByZWFkX3RzdigiLi4vc2NvdHRfMjAxOS9jYXBzdWxlLTY1MzQwMTYvZGF0YS9zdHVkeWRlc2lnbi50eHQiKQppbXBvcnQgJT4lIGRwbHlyOjpmaWx0ZXIoZGlzZWFzZSA9PSAiY3V0YW5lb3VzIikgJT4lCiAgZHBseXI6OnNlbGVjdCgtMikgJT4lICBndCgpICU+JQogIHRhYl9oZWFkZXIodGl0bGUgPSBtZCgiQ2xpbmljYWwgbWV0YWRhdGEgZnJvbSBwYXRpZW50cyB3aXRoIGN1dGFuZW91cyBsZWlzaG1hbmlhc2lzIChDTCkiKSwKICAgICAgICAgICAgIHN1YnRpdGxlID0gbWQoImAobj0yMSlgIikpICU+JSAgY29sc19hbGlnbihhbGlnbiA9ICJjZW50ZXIiLCBjb2x1bW5zID0gVFJVRSkKdGFyZ2V0cy5sZXNpb24gPC0gaW1wb3J0CnRhcmdldHMub25seXBhdGllbnRzIDwtIHRhcmdldHMubGVzaW9uWzg6MjgsXSAjIG9ubHkgQ0wgbGVzaW9ucyAobj0yMSkKCiMgTWFraW5nIGZhY3RvcnMgdGhhdCB3aWxsIGJlIHVzZWQgZm9yIHBhaXJ3aXNlIGNvbXBhcmlzb25zOgojIEhTIHZzLiBDTCBsZXNpb25zIGFzIGEgZmFjdG9yOgpkaXNlYXNlLmxlc2lvbiA8LSBmYWN0b3IodGFyZ2V0cy5sZXNpb24kZGlzZWFzZSkKIyBDdXJlIHZzLiBGYWlsdXJlIGxlc2lvbnMgYXMgYSBmYWN0b3I6CnRyZWF0bWVudC5sZXNpb24gPC0gZmFjdG9yKHRhcmdldHMub25seXBhdGllbnRzJHRyZWF0bWVudF9vdXRjb21lKQpgYGAKCiMgSW1wb3J0aW5nIHRoZSBkYXRhIGFuZCBhbm5vdGF0aW9ucwoKVGhleSBkaWQgdXNlIGEgc2xpZ2h0bHkgZGlmZmVyZW50IGFubm90YXRpb24gc2V0LCBFbnNlbWJsIHJldmlzaW9uIDg2LgpPbmNlIGFnYWluIEkgYW0gbW9kaWZ5aW5nIHRoZSBwYXRocyBzbGlnaHRseSB0byByZWZsZWN0IHdoZXJlIEkgcHV0CnRoZSBjYXBzdWxlLgoKYGBge3IsIGV2YWw9RkFMU0V9CiMgY2FwdHVyaW5nIEVuc2VtYmwgdHJhbnNjcmlwdCBJRHMgKHR4KSBhbmQgZ2VuZSBzeW1ib2xzICgiZ2VuZV9uYW1lIikgZnJvbQojIEVuc0RiLkhzYXBpZW5zLnY4NiBhbm5vdGF0aW9uIHBhY2thZ2UKVHggPC0gYXMuZGF0YS5mcmFtZSh0cmFuc2NyaXB0cyhFbnNEYi5Ic2FwaWVucy52ODYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sdW1ucz1jKGxpc3RDb2x1bW5zKEVuc0RiLkhzYXBpZW5zLnY4NiwgInR4IiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJnZW5lX25hbWUiKSkpCgpUeCA8LSBkcGx5cjo6cmVuYW1lKFR4LCB0YXJnZXRfaWQgPSB0eF9pZCkKcm93Lm5hbWVzKFR4KSA8LSBOVUxMClR4IDwtIFR4WyxjKDYsMTIpXQoKIyBnZXR0aW5nIGZpbGUgcGF0aHMgZm9yIEthbGxpc3RvIG91dHB1dHMKcGF0aHMuYWxsIDwtIGZpbGUucGF0aCgiLi4vc2NvdHRfMjAxOS9jYXBzdWxlLTY1MzQwMTYvZGF0YS9yZWFkTWFwcGluZy9odW1hbiIsIHRhcmdldHMubGVzaW9uJHNhbXBsZSwgImFidW5kYW5jZS5oNSIpCnBhdGhzLnBhdGllbnRzIDwtIGZpbGUucGF0aCgiLi4vc2NvdHRfMjAxOS9jYXBzdWxlLTY1MzQwMTYvZGF0YS9yZWFkTWFwcGluZy9odW1hbiIsIHRhcmdldHMub25seXBhdGllbnRzJHNhbXBsZSwgImFidW5kYW5jZS5oNSIpCgojIGltcG9ydGluZyAuaDUgS2FsbGlzdG8gZGF0YSBhbmQgY29sbGFwc2luZyB0cmFuc2NyaXB0LWxldmVsIGRhdGEgdG8gZ2VuZXMKVHhpLmxlc2lvbi5jb2RpbmcgPC0gdHhpbXBvcnQocGF0aHMuYWxsLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlID0gImthbGxpc3RvIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHgyZ2VuZSA9IFR4LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eE91dCA9IEZBTFNFLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZ25vcmVUeFZlcnNpb24gPSBUUlVFLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudHNGcm9tQWJ1bmRhbmNlID0gImxlbmd0aFNjYWxlZFRQTSIpCgojIGltcG9ydGluZyBhZ2FpbmcsIGJ1dCB0aGlzIHRpbWUganVzdCB0aGUgQ0wgcGF0aWVudHMKVHhpLmxlc2lvbi5jb2Rpbmcub25seXBhdGllbnRzIDwtIHR4aW1wb3J0KHBhdGhzLnBhdGllbnRzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZSA9ICJrYWxsaXN0byIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eDJnZW5lID0gVHgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eE91dCA9IEZBTFNFLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWdub3JlVHhWZXJzaW9uID0gVFJVRSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50c0Zyb21BYnVuZGFuY2UgPSAibGVuZ3RoU2NhbGVkVFBNIikKYGBgCgojIEZpbHRlcmluZyBhbmQgbm9ybWFsaXphdGlvbgoKVGhlIGJsb2NrICd2aXN1YWxpemF0aW9uRGF0YXNldHMnIGZvbGxvd3MgdW5jaGFuZ2VkLiAgSW4gdGhlIG5leHQKYmxvY2sgSSB3aWxsIGFkZCBhbm90aGVyIHBsb3Qgb3IgcGVyaGFwcyAyCgpgYGB7ciwgZXZhbD1GQUxTRX0KIyBGaXJzdCBtYWtlIGEgREdFTGlzdCBmcm9tIHRoZSBjb3VudHM6ClR4aS5sZXNpb24uY29kaW5nLkRHRUxpc3QgPC0gREdFTGlzdChUeGkubGVzaW9uLmNvZGluZyRjb3VudHMpCmNvbG5hbWVzKFR4aS5sZXNpb24uY29kaW5nLkRHRUxpc3QkY291bnRzKSA8LSB0YXJnZXRzLmxlc2lvbiRzYW1wbGUKY29sbmFtZXMoVHhpLmxlc2lvbi5jb2RpbmckY291bnRzKSA8LSB0YXJnZXRzLmxlc2lvbiRzYW1wbGUKClR4aS5sZXNpb24uY29kaW5nLkRHRUxpc3QuT1AgPC0gREdFTGlzdChUeGkubGVzaW9uLmNvZGluZy5vbmx5cGF0aWVudHMkY291bnRzKQpjb2xuYW1lcyhUeGkubGVzaW9uLmNvZGluZy5ER0VMaXN0Lk9QKSA8LSB0YXJnZXRzLm9ubHlwYXRpZW50cyRzYW1wbGUKCiMgQ29udmVydCB0byBjb3VudHMgcGVyIG1pbGxpb246ClR4aS5sZXNpb24uY29kaW5nLkRHRUxpc3QuY3BtIDwtIGVkZ2VSOjpjcG0oVHhpLmxlc2lvbi5jb2RpbmcuREdFTGlzdCwgbG9nID0gVFJVRSkKVHhpLmxlc2lvbi5jb2RpbmcuREdFTGlzdC5PUC5jcG0gPC0gZWRnZVI6OmNwbShUeGkubGVzaW9uLmNvZGluZy5ER0VMaXN0Lk9QLCBsb2cgPSBUUlVFKQoKa2VlcGVycy5jb2RpbmcgPC0gcm93U3VtcyhUeGkubGVzaW9uLmNvZGluZy5ER0VMaXN0LmNwbT4xKT49NwprZWVwZXJzLmNvZGluZy5PUCA8LSByb3dTdW1zKFR4aS5sZXNpb24uY29kaW5nLkRHRUxpc3QuT1AuY3BtPjEpPj03CgpUeGkubGVzaW9uLmNvZGluZy5ER0VMaXN0LmZpbHRlcmVkIDwtIFR4aS5sZXNpb24uY29kaW5nLkRHRUxpc3Rba2VlcGVycy5jb2RpbmcsXQpUeGkubGVzaW9uLmNvZGluZy5ER0VMaXN0Lk9QLmZpbHRlcmVkIDwtIFR4aS5sZXNpb24uY29kaW5nLkRHRUxpc3QuT1Bba2VlcGVycy5jb2RpbmcuT1AsXQoKIyBjb252ZXJ0IGJhY2sgdG8gY3BtOgpUeGkubGVzaW9uLmNvZGluZy5ER0VMaXN0LkxvZ0NQTS5maWx0ZXJlZCA8LSBlZGdlUjo6Y3BtKFR4aS5sZXNpb24uY29kaW5nLkRHRUxpc3QuZmlsdGVyZWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nPVRSVUUpClR4aS5sZXNpb24uY29kaW5nLkRHRUxpc3QuTG9nQ1BNLk9QLmZpbHRlcmVkIDwtIGVkZ2VSOjpjcG0oVHhpLmxlc2lvbi5jb2RpbmcuREdFTGlzdC5PUC5maWx0ZXJlZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2c9VFJVRSkKCiMgTm9ybWFsaXppbmcgZGF0YToKY2FsY05vcm0xIDwtIGNhbGNOb3JtRmFjdG9ycyhUeGkubGVzaW9uLmNvZGluZy5ER0VMaXN0LmZpbHRlcmVkLCBtZXRob2QgPSAiVE1NIikKY2FsY05vcm0yIDwtIGNhbGNOb3JtRmFjdG9ycyhUeGkubGVzaW9uLmNvZGluZy5ER0VMaXN0Lk9QLmZpbHRlcmVkLCBtZXRob2QgPSAiVE1NIikKClR4aS5sZXNpb24uY29kaW5nLkRHRUxpc3QuTG9nQ1BNLmZpbHRlcmVkLm5vcm0gPC0gZWRnZVI6OmNwbShjYWxjTm9ybTEsIGxvZz1UUlVFKQpjb2xuYW1lcyhUeGkubGVzaW9uLmNvZGluZy5ER0VMaXN0LkxvZ0NQTS5maWx0ZXJlZC5ub3JtKSA8LSB0YXJnZXRzLmxlc2lvbiRzYW1wbGUKVHhpLmxlc2lvbi5jb2RpbmcuREdFTGlzdC5PUC5Mb2dDUE0uZmlsdGVyZWQubm9ybSA8LSBlZGdlUjo6Y3BtKGNhbGNOb3JtMiwgbG9nPVRSVUUpCmNvbG5hbWVzKFR4aS5sZXNpb24uY29kaW5nLkRHRUxpc3QuT1AuTG9nQ1BNLmZpbHRlcmVkLm5vcm0pIDwtIHRhcmdldHMub25seXBhdGllbnRzJHNhbXBsZQojIFJhdyBkYXRhc2V0OgpWMSA8LSBhcy5kYXRhLmZyYW1lKFR4aS5sZXNpb24uY29kaW5nLkRHRUxpc3QuY3BtKQpjb2xuYW1lcyhWMSkgPC0gdGFyZ2V0cy5sZXNpb24kc2FtcGxlClYxIDwtIG1lbHQoVjEpCmNvbG5hbWVzKFYxKSA8LSBjKCJzYW1wbGUiLCJleHByZXNzaW9uIikKCiMgRmlsdGVyZWQgZGF0YXNldDoKVjEuMSA8LSBhcy5kYXRhLmZyYW1lKFR4aS5sZXNpb24uY29kaW5nLkRHRUxpc3QuTG9nQ1BNLmZpbHRlcmVkKQpjb2xuYW1lcyhWMS4xKSA8LSB0YXJnZXRzLmxlc2lvbiRzYW1wbGUKVjEuMSA8LSBtZWx0KFYxLjEpCmNvbG5hbWVzKFYxLjEpIDwtIGMoInNhbXBsZSIsImV4cHJlc3Npb24iKQoKIyBGaWx0ZXJlZC1ub3JtYWxpemVkIGRhdGFzZXQ6ClYxLjEuMSA8LSBhcy5kYXRhLmZyYW1lKFR4aS5sZXNpb24uY29kaW5nLkRHRUxpc3QuTG9nQ1BNLmZpbHRlcmVkLm5vcm0pCmNvbG5hbWVzKFYxLjEuMSkgPC0gdGFyZ2V0cy5sZXNpb24kc2FtcGxlClYxLjEuMSA8LSBtZWx0KFYxLjEuMSkKY29sbmFtZXMoVjEuMS4xKSA8LSBjKCJzYW1wbGUiLCJleHByZXNzaW9uIikKCiMgcGxvdHRpbmc6CmdncGxvdChWMSwgYWVzKHg9c2FtcGxlLCB5PWV4cHJlc3Npb24sIGZpbGw9c2FtcGxlKSkgKwogIGdlb21fdmlvbGluKHRyaW0gPSBUUlVFLCBzaG93LmxlZ2VuZCA9IFRSVUUpICsKICBzdGF0X3N1bW1hcnkoZnVuLnkgPSAibWVkaWFuIiwgZ2VvbSA9ICJwb2ludCIsIHNoYXBlID0gOTUsIHNpemUgPSAxMCwgY29sb3IgPSAiYmxhY2siKSArCiAgdGhlbWVfYncoKSArCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiLCBheGlzLnRpdGxlPWVsZW1lbnRfdGV4dChzaXplPTcpLAogICAgICAgIGF4aXMudGl0bGUueD1lbGVtZW50X2JsYW5rKCksIGF4aXMudGV4dD1lbGVtZW50X3RleHQoc2l6ZT01KSwKICAgICAgICBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDkwLCBoanVzdCA9IDEpLAogICAgICAgIHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDcpKSArCiAgZ2d0aXRsZSgiUmF3IGRhdGFzZXQiKSArCiAgZ2dwbG90KFYxLjEsIGFlcyh4PXNhbXBsZSwgeT1leHByZXNzaW9uLCBmaWxsPXNhbXBsZSkpICsKICBnZW9tX3Zpb2xpbih0cmltID0gVFJVRSwgc2hvdy5sZWdlbmQgPSBUUlVFKSArCiAgc3RhdF9zdW1tYXJ5KGZ1bi55ID0gIm1lZGlhbiIsIGdlb20gPSAicG9pbnQiLCBzaGFwZSA9IDk1LCBzaXplID0gMTAsIGNvbG9yID0gImJsYWNrIikgKwogIHRoZW1lX2J3KCkgKwogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIiwgYXhpcy50aXRsZT1lbGVtZW50X3RleHQoc2l6ZT03KSwKICAgICAgICBheGlzLnRpdGxlLng9ZWxlbWVudF9ibGFuaygpLCBheGlzLnRleHQ9ZWxlbWVudF90ZXh0KHNpemU9NSksCiAgICAgICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA5MCwgaGp1c3QgPSAxKSwKICAgICAgICBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSA3KSkgKwogIGdndGl0bGUoIkZpbHRlcmVkIGRhdGFzZXQiKSArCiAgZ2dwbG90KFYxLjEuMSwgYWVzKHg9c2FtcGxlLCB5PWV4cHJlc3Npb24sIGZpbGw9c2FtcGxlKSkgKwogIGdlb21fdmlvbGluKHRyaW0gPSBUUlVFLCBzaG93LmxlZ2VuZCA9IFRSVUUpICsKICBzdGF0X3N1bW1hcnkoZnVuLnkgPSAibWVkaWFuIiwgZ2VvbSA9ICJwb2ludCIsIHNoYXBlID0gOTUsIHNpemUgPSAxMCwgY29sb3IgPSAiYmxhY2siKSArCiAgdGhlbWVfYncoKSArCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiLCBheGlzLnRpdGxlPWVsZW1lbnRfdGV4dChzaXplPTcpLAogICAgICAgIGF4aXMudGl0bGUueD1lbGVtZW50X2JsYW5rKCksIGF4aXMudGV4dD1lbGVtZW50X3RleHQoc2l6ZT01KSwKICAgICAgICBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDkwLCBoanVzdCA9IDEpLAogICAgICAgIHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDcpKSArCiAgZ2d0aXRsZSgiRmlsdGVyZWQgYW5kIG5vcm1hbGl6ZWQgZGF0YXNldCIpCmBgYAoKIyBUaGUgdW5maWx0ZXJlZCBkYXRhCgpUaGUgZm9sbG93aW5nIGJsb2NrIGluIHRoZWlyIGRhdGFzZXQgcmVjcmVhdGVkIHRoZSBtYXRyaXggd2l0aG91dApmaWx0ZXJpbmcgYW5kIHdpbGwgdXNlIHRoYXQgZm9yIGRpZmZlcmVudGlhbCBleHByZXNzaW9uLiAgSXQgaXMgYQpsaXR0bGUgaGFyZCB0byBmb2xsb3cgZm9yIG1lIGJlY2F1c2UgdGhleSBzdWJzZXQgYmFzZWQgb24gdGhlIHNhbXBsZQpudW1iZXJzICg4IHRvIDI4LCB3aGljaCBpZiBJIGFtIG5vdCBtaXN0YWtlbiBqdXN0IGRyb3BzIHRoZSBoZWFsdGh5CnNhbXBsZXM/KS4KCmBgYHtyLCBldmFsPUZBTFNFfQpEYXRhTm90RmlsdGVyZWRfTm9ybV9PUCA8LSBjYWxjTm9ybUZhY3RvcnMoVHhpLmxlc2lvbi5jb2RpbmcuREdFTGlzdFssODoyOF0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRob2QgPSAiVE1NIikKRGF0YU5vdEZpbHRlcmVkX05vcm1fbG9nMkNQTV9PUCA8LSBlZGdlUjo6Y3BtKERhdGFOb3RGaWx0ZXJlZF9Ob3JtX09QLCBsb2c9VFJVRSkKY29sbmFtZXMoRGF0YU5vdEZpbHRlcmVkX05vcm1fbG9nMkNQTV9PUCkgPC0gdGFyZ2V0cy5vbmx5cGF0aWVudHMkc2FtcGxlCkNQTV9ub3JtRGF0YV9ub3RmaWx0ZXJlZF9PUCA8LSAyXihEYXRhTm90RmlsdGVyZWRfTm9ybV9sb2cyQ1BNX09QKQojdW5jb21tZW50IHRoZSBuZXh0IGxpbmUgdG8gcHJvZHVjZSByYXcgZGF0YSB0aGF0IHdhcyB1cGxvYWRlZCB0byB0aGUgR2VuZSBFeHByZXNzaW9uIE9tbmlidXMgKEdFTykgZm9yIHB1YmxpY2F0aW9uLgojd3JpdGUudGFibGUoVHhpLmxlc2lvbi5jb2RpbmckY291bnRzLCBmaWxlID0gIkFtb3JpbV9HRU9fcmF3LnR4dCIsIHNlcCA9ICJcdCIsIHF1b3RlID0gRkFMU0UpCgojIEluY2x1ZGluZyBhbGwgdGhlIGluZGl2aWR1YWxzIChIUyBhbmQgQ0wgcGF0aWVudHMpIGZvciBwdWJsaWMgZG9tYWluIHN1Ym1pc3Npb246CkRhdGFOb3RGaWx0ZXJlZF9Ob3JtIDwtIGNhbGNOb3JtRmFjdG9ycyhUeGkubGVzaW9uLmNvZGluZy5ER0VMaXN0LCBtZXRob2QgPSAiVE1NIikKRGF0YU5vdEZpbHRlcmVkX05vcm1fbG9nMkNQTSA8LSBlZGdlUjo6Y3BtKERhdGFOb3RGaWx0ZXJlZF9Ob3JtLCBsb2c9VFJVRSkKY29sbmFtZXMoRGF0YU5vdEZpbHRlcmVkX05vcm1fbG9nMkNQTSkgPC0gdGFyZ2V0cy5sZXNpb24kc2FtcGxlCkNQTV9ub3JtRGF0YV9ub3RmaWx0ZXJlZCA8LSAyXihEYXRhTm90RmlsdGVyZWRfTm9ybV9sb2cyQ1BNKQojdW5jb21tZW50IHRoZSBuZXh0IGxpbmUgdG8gcHJvZHVjZSB0aGUgbm9ybWFsaXplZCBkYXRhIGZpbGUgdGhhdCB3YXMgdXBsb2FkZWQgdG8gdGhlIEdlbmUgRXhwcmVzc2lvbiBPbW5pYnVzIChHRU8pIGZvciBwdWJsaWNhdGlvbi4KI3dyaXRlLnRhYmxlKERhdGFOb3RGaWx0ZXJlZF9Ob3JtX2xvZzJDUE0sICJBbW9yaW1fR0VPX25vcm1hbGl6ZWQudHh0Iiwgc2VwID0gIlx0IiwgcXVvdGUgPSBGQUxTRSkKYGBgCgojIFRoZSBzY290dCBleHBsb3JhdG9yeSBhbmFseXNpcwoKVGhlIGZvbGxvd2luZyBibG9jayBnZW5lcmF0ZWQgYSBjb3VwbGUgb2YgdGhlIGZpZ3VyZXMgaW4gdGhlIHBhcGVyIGFuZApjb21wcmlzZSBhIHByZXR0eSBzdHJhaWdodGZvcndhcmQgUENBLiAgSSBhbSBnb2luZyB0byBtYWtlIGEgZm9sbG93aW5nCmJsb2NrIGNvbnRhaW5pbmcgdGhlIHNhbWUgaW1hZ2Ugd2l0aCB0aGUgY3VyZS9mYWlsIHZpc3VhbGl6YXRpb24gdXNpbmcKdGhlIHNhbWUgbWV0aG9kL2RhdGEuCgpgYGB7ciwgZXZhbD1GQUxTRX0KcGNhLnJlcyA8LSBwcmNvbXAodChUeGkubGVzaW9uLmNvZGluZy5ER0VMaXN0LkxvZ0NQTS5maWx0ZXJlZC5ub3JtKSwgc2NhbGUuPUYsIHJldHg9VCkKcGMudmFyIDwtIHBjYS5yZXMkc2Rldl4yCnBjLnBlciA8LSByb3VuZChwYy52YXIvc3VtKHBjLnZhcikqMTAwLCAxKQpkYXRhLmZyYW1lIDwtIGFzLmRhdGEuZnJhbWUocGNhLnJlcyR4KQoKIyBDYWxjdWxhdGUgZGlzdGFuY2UgYmV0d2VlbiBzYW1wbGVzIGJ5IHBlcm1hbm92YToKYWxsc2FtcGxlcy5kaXN0IDwtIHZlZ2Rpc3QodCgyXlR4aS5sZXNpb24uY29kaW5nLkRHRUxpc3QuTG9nQ1BNLmZpbHRlcmVkLm5vcm0pLAogICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRob2QgPSAiYnJheSIpCgp2ZWdhbiA8LSBhZG9uaXMyKGFsbHNhbXBsZXMuZGlzdH50YXJnZXRzLmxlc2lvbiRkaXNlYXNlLAogICAgICAgICAgICAgICAgIGRhdGE9dGFyZ2V0cy5sZXNpb24sCiAgICAgICAgICAgICAgICAgcGVybXV0YXRpb25zID0gOTk5LCBtZXRob2Q9ImJyYXkiKQoKdGFyZ2V0cy5sZXNpb24kZGlzZWFzZQpnZ3Bsb3QoZGF0YS5mcmFtZSwgYWVzKHg9UEMxLCB5PVBDMiwgY29sb3I9ZmFjdG9yKHRhcmdldHMubGVzaW9uJGRpc2Vhc2UpKSkgKwogIGdlb21fcG9pbnQoc2l6ZT01LCBzaGFwZT0yMCkgKwogIHRoZW1lX2NhbGMoKSArCiAgdGhlbWUocGFuZWwuZ3JpZC5tYWpvciA9IGVsZW1lbnRfYmxhbmsoKSwgcGFuZWwuZ3JpZC5taW5vciA9IGVsZW1lbnRfYmxhbmsoKSwKICAgICAgICBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTUsIHZqdXN0ID0gMC41KSwKICAgICAgICBheGlzLnRleHQueSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTUpLCBheGlzLnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNSksCiAgICAgICAgbGVnZW5kLnBvc2l0aW9uPSJub25lIikgKwogIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXMgPSBjKCIjMDczRjgwIiwiI0VCNTEyQyIpKSArCiAgYW5ub3RhdGUoInRleHQiLCB4PS01MCwgeT04MCwgbGFiZWw9cGFzdGUoIlBlcm1hbm92YSBQcig+RikgPSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVnYW5bMSw1XSksIHNpemU9MywgZm9udGZhY2U9ImJvbGQiKSArCiAgeGxhYihwYXN0ZSgiUEMxIC0iLHBjLnBlclsxXSwiJSIpKSArCiAgeWxhYihwYXN0ZSgiUEMyIC0iLHBjLnBlclsyXSwiJSIpKSArCiAgeGxpbSgtMjAwLDExMCkKYGBgCgojIyMgTXkgbW9zdCBzaW1pbGFyIHBjYQoKYGBge3J9CmV4dGVybmFsX2wyY3BtIDwtIG5vcm1hbGl6ZV9leHB0KGV4dGVybmFsX2NmLCBmaWx0ZXIgPSBUUlVFLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnZlcnQgPSAiY3BtIiwgdHJhbnNmb3JtID0gImxvZzIiKQpwbG90X3BjYShleHRlcm5hbF9sMmNwbSwgcGxvdF9sYWJlbHMgPSAicmVwZWwiKQpgYGAKCiMjIEN1cmUvRmFpbCBQQ0EgdXNpbmcgdGhlIHNhbWUgcHJjb21wIHJlc3VsdAoKSSBhbSBqdXN0IGNvcHkvcGFzdGluZyB0aGVpciBjb2RlIGFnYWluLCBidXQgY2hhbmdpbmcgdGhlIGNvbG9yIGZhY3RvcgpzbyB0aGF0IGN1cmUgaXMgcHVycGxlLCBmYWlsdXJlIGlzIHJlZCwgYW5kIG5hKHVuaW5mZWN0ZWQpIGlzIGJsYWNrLgoKVGhlIGZvbGxvd2luZyBwbG90IHNob3VsZCBiZSB0aGUgZmlyc3QgZGlyZWN0IGNvbXBhcmlzb24gcG9pbnQgYmV0d2Vlbgp0aGUgdHdvIGFuYWx5c2lzIHBpcGVsaW5lcy4gIFRodXMsIGlmIHlvdSBsb29rIGJhY2sgYSBmZXcgYmxvY2sgYXQgbXkKaW52b2NhdGlvbiBvZiBwbG90X3BjYShleHRlcm5hbF9ub3JtKSwgeW91IHdpbGwgc2VlIGEgZ3JlZW4vb3JhbmdlCnBsb3Qgd2hpY2ggaXMgZnVuY3Rpb25hbGx5IGlkZW50aWNhbCBpZiB5b3Ugbm90ZToKCjEuICBUaGUgeCBhbmQgeSBheGVzIGFyZSBmbGlwcGVkLCB3aGljaCBvayB3aGF0ZXZlciBpdCBpcyBQQ0EuCjIuICBJIGV4Y2x1ZGVkIHRoZSBoZWFsdGh5IHNhbXBsZXMuCjMuICBJIGRyb3BwZWQgdG8gZ2VuZSBsZXZlbCBhbmQgdXNlZCBoaXNhdC4KCldpdGggdGhvc2UgY2F2ZWF0cyBpbiBtaW5kLCBpdCBpcyB0cml2aWFsIHRvIGZpbmQgdGhlIHNhbWUKcmVsYXRpb25zaGlwZXMgaW4gdGhlIHNhbXBsZXMuICBFLmcuIHRoZSBib3R0b20gcmVkL3B1cnBsZSBpbmRpdmlkdWFsCnNhbXBsZXMgYXJlIGluIHRoZSBzYW1lIHJlbGF0aXZlIHBvc2l0aW9uIGFzIG15IHRvcCBvcmFuZ2UvZ3JlZW4gcGFpci4KdGhlIHNhbWUgNCBzYW1wbGVzIGFyZSByZWxhdGl2ZSB4LWF4aXMgb3V0bGllcnMgKG15IHJpZ2h0IGdyZWVuLCB0aGVpcgpsZWZ0IHB1cnBsZSkuICBUaGUgbGFzdCA2IHNhbXBsZXMgKG15IG9yYW5nZSwgdGhlaXIgcmVkKSBhcmUgYWxsIGluCnRoZSByZWxhdGl2ZSBvcmllbnRhdGlvbi4KCkkgdGhpbmsgSSBjYW4gZnVydGhlciBwcm92ZSB0aGUgc2ltaWxhcml0eSBvZiBvdXIgaW5wdXRzIHZpYSBhIGRpcmVjdApjb21wYXJpc29uIG9mIHRoZSBkYXRhc3RydWN0dXJlczoKVHhpLmxlc2lvbi5jb2RpbmcuREdFTGlzdC5Mb2dDUE0uZmlsdGVyZWQubm9ybSAodWdoIHdoYXQgYSBuYW1lKQp2cy4gZXh0ZXJuYWxfY2YuICBJbiBvcmRlciB0byBtYWtlIHRoYXQgY29tcGFyaXNvbiwgSSBuZWVkIHRvIHJlbmFtZQpteSByb3dzIHRvIHRoZSBnZW5lY2FyZCBJRHMgYW5kIHRoZSBjb2x1bW5zLgoKYGBge3IsIGV2YWw9RkFMU0V9CnRoZWlyX25vcm1fZXhwcnMgPC0gVHhpLmxlc2lvbi5jb2RpbmcuREdFTGlzdC5Mb2dDUE0uZmlsdGVyZWQubm9ybQoKbXlfaGduY19pZHMgPC0gbWFrZS5uYW1lcyhmRGF0YShleHRlcm5hbF9jZilbWyJoZ25jX3N5bWJvbCJdXSwgdW5pcXVlID0gVFJVRSkKbXlfcmVuYW1lZCA8LSBzZXRfZXhwdF9nZW5lbmFtZXMoZXh0ZXJuYWxfY2YsIGlkcyA9IG15X2hnbmNfaWRzKQpteV9ub3JtIDwtIG5vcm1hbGl6ZV9leHB0KG15X3JlbmFtZWQsIGZpbHRlciA9IFRSVUUsIHRyYW5zZm9ybSA9ICJsb2cyIiwgY29udmVydCA9ICJjcG0iKQpteV9ub3JtX2V4cHJzIDwtIGFzLmRhdGEuZnJhbWUoZXhwcnMobXlfbm9ybSkpCgpvdXJfZXhwcnMgPC0gbWVyZ2UodGhlaXJfbm9ybV9leHBycywgbXlfbm9ybV9leHBycywgYnkgPSAicm93Lm5hbWVzIikKcm93bmFtZXMob3VyX2V4cHJzKSA8LSBvdXJfZXhwcnNbWyJSb3cubmFtZXMiXV0Kb3VyX2V4cHJzW1siUm93Lm5hbWVzIl1dIDwtIE5VTEwKZGltKG91cl9leHBycykKCiMjIEkgZnVsbHkgZXhwZWN0ZWQgYSBjb3JyZWxhdGlvbiBoZWF0bWFwIG9mIHRoZSBjb21iaW5lZAojIyBkYXRhIHRvIHNob3cgYSBzZXQgb2YgcGFpcmVkIHNhbXBsZXMgYWNyb3NzIHRoZSBib2FyZC4KIyMgVGhhdCBpcyBhYnNvbHV0ZWx5IG5vdCB0cnVlLgpjb3JyZWxhdGlvbnMgPC0gcGxvdF9jb3JoZWF0KG91cl9leHBycykKY29ycmVsYXRpb25zJHBsb3QKYGBgCgpgYGB7ciwgZXZhbD1GQUxTRX0KY29sb3JfZmFjdCA8LSBmYWN0b3IodGFyZ2V0cy5sZXNpb24kdHJlYXRtZW50X291dGNvbWUpCmxldmVscyhjb2xvcl9mYWN0KQojIyBBZGRlZCBieSBhdGIgdG8gc2VlIGN1cmUvZmFpbCBvbiB0aGUgc2FtZSBkYXRhc2V0CmdncGxvdChkYXRhLmZyYW1lLCBhZXMoeD1QQzEsIHk9UEMyLCBjb2xvcj1jb2xvcl9mYWN0KSkgKwogIGdlb21fcG9pbnQoc2l6ZT01LCBzaGFwZT0yMCkgKwogIHRoZW1lX2NhbGMoKSArCiAgdGhlbWUocGFuZWwuZ3JpZC5tYWpvciA9IGVsZW1lbnRfYmxhbmsoKSwgcGFuZWwuZ3JpZC5taW5vciA9IGVsZW1lbnRfYmxhbmsoKSwKICAgICAgICBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTUsIHZqdXN0ID0gMC41KSwKICAgICAgICBheGlzLnRleHQueSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTUpLCBheGlzLnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNSksCiAgICAgICAgbGVnZW5kLnBvc2l0aW9uPSJub25lIikgKwogIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXMgPSBjKCJwdXJwbGUiLCAicmVkIiwiYmxhY2siKSkgKwogIGFubm90YXRlKCJ0ZXh0IiwgeD0tNTAsIHk9ODAsIGxhYmVsPXBhc3RlKCJQZXJtYW5vdmEgUHIoPkYpID0iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlZ2FuWzEsNV0pLCBzaXplPTMsIGZvbnRmYWNlPSJib2xkIikgKwogIHhsYWIocGFzdGUoIlBDMSAtIixwYy5wZXJbMV0sIiUiKSkgKwogIHlsYWIocGFzdGUoIlBDMiAtIixwYy5wZXJbMl0sIiUiKSkgKwogIHhsaW0oLTIwMCwxMTApCmBgYAoKIyBERSBjb21wYXJpc29ucwoKVGhlIGZvbGxvd2luZyBpcyB0aGVpciBjb21wYXJpc29uIG9mIGhlYWx0aHkgdGlzc3VlIHZzLiAgQ0wgbGVzaW9uIGFuZApGYWlsdXJlIHZzLiBDdXJlLiAgSSBhbSBnb2luZyB0byBmb2xsb3cgaXQgd2l0aCBteSBhbmFsYWdvdXMKZXhhbWluYXRpb24gdXNpbmcgbGltbWEuICBOb3RlLCBlYWNoIG9mIHRoZSBwYWlycyBvZiB2YXJpYWJsZXMgY3JlYXRlZAppbiB0aGUgZm9sbG93aW5nIGJsb2NrIGlzIHh4eCBmb2xsb3dlZCBieSB4eHgudHJlYXQ7IHRoZSBmb3JtZXIgaXMKaGVhbHRoeSB2cyBsZXNpb24gYW5kIHRoZSBsYXR0ZXIgaXMgdGhlIGZhaWwgdnMgY3VyZSBzZXQuCgpgYGB7ciwgZXZhbD1GQUxTRX0KIyBNb2RlbCBtYXRyaWNlczoKIyBDTCBsZXNpb25zIHZzLiBIUzoKZGVzaWduLmxlc2lvbiA8LSBtb2RlbC5tYXRyaXgofjAgKyBkaXNlYXNlLmxlc2lvbikKY29sbmFtZXMoZGVzaWduLmxlc2lvbikgPC0gbGV2ZWxzKGRpc2Vhc2UubGVzaW9uKQoKIyBGYWlsdXJlIHZzLiBDdXJlOgpkZXNpZ24ubGVzaW9uLnRyZWF0bWVudCA8LSBtb2RlbC5tYXRyaXgofjAgKyB0cmVhdG1lbnQubGVzaW9uKQpjb2xuYW1lcyhkZXNpZ24ubGVzaW9uLnRyZWF0bWVudCkgPC0gbGV2ZWxzKHRyZWF0bWVudC5sZXNpb24pCgpteURHRUxpc3QubGVzaW9uLmNvZGluZyA8LSBER0VMaXN0KGNhbGNOb3JtMSRjb3VudHMpCm15REdFTGlzdC5PUC5Ob3RGaWwgPC0gREdFTGlzdChDUE1fbm9ybURhdGFfbm90ZmlsdGVyZWRfT1ApCgojIE1vZGVsIG1lYW4tdmFyaWFuY2UgdHJlbmQgYW5kIGZpdCBsaW5lYXIgbW9kZWwgdG8gZGF0YS4KIyBVc2UgVk9PTSBmdW5jdGlvbiBmcm9tIExpbW1hIHBhY2thZ2UgdG8gbW9kZWwgdGhlIG1lYW4tdmFyaWFuY2UgcmVsYXRpb25zaGlwCm5vcm1EYXRhLmxlc2lvbi5jb2RpbmcgPC0gdm9vbShteURHRUxpc3QubGVzaW9uLmNvZGluZywgZGVzaWduLmxlc2lvbikKbm9ybURhdGEuT1AuTm90RmlsIDwtIHZvb20obXlER0VMaXN0Lk9QLk5vdEZpbCwgZGVzaWduLmxlc2lvbi50cmVhdG1lbnQpCgpjb2xuYW1lcyhub3JtRGF0YS5sZXNpb24uY29kaW5nKSA8LSB0YXJnZXRzLmxlc2lvbiRzYW1wbGUKY29sbmFtZXMobm9ybURhdGEuT1AuTm90RmlsKSA8LSB0YXJnZXRzLm9ubHlwYXRpZW50cyRzYW1wbGUKCiMgZml0IGEgbGluZWFyIG1vZGVsIHRvIHlvdXIgZGF0YQpmaXQubGVzaW9uLmNvZGluZyA8LSBsbUZpdChub3JtRGF0YS5sZXNpb24uY29kaW5nLCBkZXNpZ24ubGVzaW9uKQpmaXQubGVzaW9uLmNvZGluZy50cmVhdG1lbnQgPC0gbG1GaXQobm9ybURhdGEuT1AuTm90RmlsLCBkZXNpZ24ubGVzaW9uLnRyZWF0bWVudCkKCiMgY29udHJhc3QgbWF0cml4CmNvbnRyYXN0Lm1hdHJpeC5sZXNpb24gPC0gbWFrZUNvbnRyYXN0cyhDTC52cy5DT04gPSBjdXRhbmVvdXMgLSBjb250cm9sLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWxzPWRlc2lnbi5sZXNpb24pCmNvbnRyYXN0Lm1hdHJpeC5sZXNpb24udHJlYXQgPC0gbWFrZUNvbnRyYXN0cyhmYWlsdXJlLnZzLmN1cmUgPSBmYWlsdXJlIC0gY3VyZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldmVscz1kZXNpZ24ubGVzaW9uLnRyZWF0bWVudCkKCiMgZXh0cmFjdCB0aGUgbGluZWFyIG1vZGVsIGZpdApmaXRzLmxlc2lvbi5jb2RpbmcgPC0gY29udHJhc3RzLmZpdChmaXQubGVzaW9uLmNvZGluZywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udHJhc3QubWF0cml4Lmxlc2lvbikKZml0cy5sZXNpb24uY29kaW5nLnRyZWF0IDwtIGNvbnRyYXN0cy5maXQoZml0Lmxlc2lvbi5jb2RpbmcudHJlYXRtZW50LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250cmFzdC5tYXRyaXgubGVzaW9uLnRyZWF0KQoKIyBnZXQgYmF5ZXNpYW4gc3RhdHMgZm9yIHlvdXIgbGluZWFyIG1vZGVsIGZpdAplYkZpdC5sZXNpb24uY29kaW5nIDwtIGVCYXllcyhmaXRzLmxlc2lvbi5jb2RpbmcpCmViRml0Lmxlc2lvbi5jb2RpbmcudHJlYXQgPC0gZUJheWVzKGZpdHMubGVzaW9uLmNvZGluZy50cmVhdCkKCiMgVG9wVGFibGUgLS0tLQphbGxIaXRzLmxlc2lvbi5jb2RpbmcgPC0gdG9wVGFibGUoZWJGaXQubGVzaW9uLmNvZGluZywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkanVzdCA9IkJIIiwgY29lZj0xLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVtYmVyPTM0OTM1LCBzb3J0LmJ5PSJsb2dGQyIpCmFsbEhpdHMubGVzaW9uLmNvZGluZy50cmVhdCA8LSB0b3BUYWJsZShlYkZpdC5sZXNpb24uY29kaW5nLnRyZWF0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRqdXN0ID0iQkgiLCBjb2VmPTEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudW1iZXI9MzQ3NzYsIHNvcnQuYnk9ImxvZ0ZDIikKbXlUb3BIaXRzIDwtIHJvd25hbWVzX3RvX2NvbHVtbihhbGxIaXRzLmxlc2lvbi5jb2RpbmcsICJnZW5lSUQiKQpteVRvcEhpdHMudHJlYXQgPC0gcm93bmFtZXNfdG9fY29sdW1uKGFsbEhpdHMubGVzaW9uLmNvZGluZy50cmVhdCwgImdlbmVJRCIpCgojIG11dGF0ZSB0aGUgZm9ybWF0IG9mIG51bWVyaWMgdmFsdWVzOgpteVRvcEhpdHMgPC0gbXV0YXRlKG15VG9wSGl0cywgbG9nMTBQdmFsID0gcm91bmQoLWxvZzEwKGFkai5QLlZhbCksMiksCiAgICAgICAgICAgICAgICAgICAgYWRqLlAuVmFsID0gcm91bmQoYWRqLlAuVmFsLCAyKSwKICAgICAgICAgICAgICAgICAgICBCID0gcm91bmQoQiwgMiksCiAgICAgICAgICAgICAgICAgICAgQXZlRXhwciA9IHJvdW5kKEF2ZUV4cHIsIDIpLAogICAgICAgICAgICAgICAgICAgIHQgPSByb3VuZCh0LCAyKSwKICAgICAgICAgICAgICAgICAgICBsb2dGQyA9IHJvdW5kKGxvZ0ZDLCAyKSwKICAgICAgICAgICAgICAgICAgICBnZW5lSUQgPSBnZW5lSUQpCgpteVRvcEhpdHMudHJlYXQgPC0gbXV0YXRlKG15VG9wSGl0cy50cmVhdCwgbG9nMTBQdmFsID0gcm91bmQoLWxvZzEwKGFkai5QLlZhbCksMiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgYWRqLlAuVmFsID0gcm91bmQoYWRqLlAuVmFsLCAyKSwKICAgICAgICAgICAgICAgICAgICAgICAgICBCID0gcm91bmQoQiwgMiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgQXZlRXhwciA9IHJvdW5kKEF2ZUV4cHIsIDIpLAogICAgICAgICAgICAgICAgICAgICAgICAgIHQgPSByb3VuZCh0LCAyKSwKICAgICAgICAgICAgICAgICAgICAgICAgICBsb2dGQyA9IHJvdW5kKGxvZ0ZDLCAyKSwKICAgICAgICAgICAgICAgICAgICAgICAgICBnZW5lSUQgPSBnZW5lSUQpCiNzYXZlKG15VG9wSGl0cywgZmlsZSA9ICJteVRvcEhpdHMiKQojc2F2ZShteVRvcEhpdHMudHJlYXQsIGZpbGUgPSAibXlUb3BIaXRzLnRyZWF0IikKYGBgCgojIFBlcmZvcm0gbXkgYW5hbGFnb3VzIGxpbW1hIGFuYWx5c2lzCgpgYGB7ciBjb21wYXJlX3Jlc3VsdCwgZXZhbD1GQUxTRX0KbGltbWFfY2YgPC0gbGltbWFfcGFpcndpc2UobXlfcmVuYW1lZCwgbW9kZWxfYmF0Y2ggPSBGQUxTRSkKCm15X3RhYmxlIDwtIGxpbW1hX2NmW1siYWxsX3RhYmxlcyJdXVtbImZhaWx1cmVfdnNfY3VyZSJdXQp0aGVpcl90YWJsZSA8LSBteVRvcEhpdHMudHJlYXQKCmRpbShteV90YWJsZSkKZGltKG15VG9wSGl0cy50cmVhdCkKb3VyX3RhYmxlIDwtIG1lcmdlKG15X3RhYmxlLCBteVRvcEhpdHMudHJlYXQsIGJ5LnggPSAicm93Lm5hbWVzIiwgYnkueSA9ICJnZW5lSUQiKQpkaW0ob3VyX3RhYmxlKQpjb21wYXJpc29uIDwtIHBsb3RfbGluZWFyX3NjYXR0ZXIob3VyX3RhYmxlWywgYygibG9nRkMueCIsICJsb2dGQy55IildKQpjb21wYXJpc29uJHNjYXR0ZXIKY29tcGFyaXNvbiRjb3JyZWxhdGlvbgpjb21wYXJpc29uJGxtX21vZGVsCmBgYAoKT2ssIHNvIHRoZXJlIGlzIGEgY29uc3RpdHVpdGl2ZSBkaWZmZXJlbmNlIGluIG91ciByZXN1bHRzLCBhbmQgaXQgaXMKc2lnbmlmaWNhbnQuICBXaGF0IGRvZXMgdGhhdCBtZWFuIGZvciB0aGUgc2V0IG9mIGdlbmVzIG9ic2VydmVkPwoKIyBTZWUgaWYgdGhlcmUgYXJlIHNoYXJlZCBERSBnZW5lcwoKISFOT1RFISEgIEkgYW0gdXNpbmcgYSBub24tYWRqdXN0ZWQgcC12YWx1ZSBmaWx0ZXIgaGVyZSBiZWNhdXNlIEkgd2FudAp0byB1c2UgdGhlIHNhbWUgZmlsdGVyIHRoZXkgdXNlZCBmb3IgdGhlIHZvbGNhbm8gcGxvdC4KCmBgYHtyIHNoYXJlZF9nZW5lcywgZXZhbD1GQUxTRX0KbXlfZmlsdGVyIDwtIGFicyhteV90YWJsZVtbImxvZ0ZDIl1dKSA+IDEuMCAmIG15X3RhYmxlW1siUC5WYWx1ZSJdXSA8PSAwLjA1CnN1bShteV9maWx0ZXIpCnRoZWlyX2ZpbHRlciA8LSBhYnModGhlaXJfdGFibGVbWyJsb2dGQyJdXSkgPiAxLjAgJiB0aGVpcl90YWJsZVtbIlAuVmFsdWUiXV0gPD0gMC4wNQpzdW0odGhlaXJfZmlsdGVyKQoKbXlfc2hhcmVkIDwtIHJvd25hbWVzKG15X3RhYmxlKVtteV9maWx0ZXJdICVpbiUgdGhlaXJfdGFibGVbdGhlaXJfZmlsdGVyLCAiZ2VuZUlEIl0Kc3VtKG15X3NoYXJlZCkKCnNoYXJlZCA8LSByb3duYW1lcyhteV90YWJsZSlbbXlfZmlsdGVyXQpzaGFyZWRbbXlfc2hhcmVkXQpgYGAKCiMjIENvbXBhcmUgdGhlIHR3byBkYXRhc2V0cyBkaXJlY3RseQoKYGBge3Igc2NvdHRfZXh0ZXJuYWx9Cm9ubHlfdG1yYzMgPC0gc3Vic2V0X2V4cHQodG1yYzNfZXh0ZXJuYWwsIHN1YnNldCA9ICJjb25kaXRpb249PSdDb2xvbWJpYSciKSAlPiUKICBzZXRfZXhwdF9jb25kaXRpb25zKGZhY3QgPSAiZmluYWxvdXRjb21lIikKb25seV90bXJjM19kZSA8LSBhbGxfcGFpcndpc2Uob25seV90bXJjMywgbW9kZWxfYmF0Y2ggPSAic3Zhc2VxIiwgZmlsdGVyID0gVFJVRSkKb25seV90bXJjM19kZQpvbmx5X3RtcmMzX3RhYmxlIDwtIGNvbWJpbmVfZGVfdGFibGVzKG9ubHlfdG1yYzNfZGUpCm9ubHlfdG1yYzNfdGFibGUKb25seV90bXJjM190b3AxMDAgPC0gZXh0cmFjdF9zaWduaWZpY2FudF9nZW5lcyhvbmx5X3RtcmMzX3RhYmxlLCBuID0gMTAwKQpvbmx5X3RtcmMzX3VwIDwtIG9ubHlfdG1yYzNfdG9wMTAwW1siZGVzZXEiXV1bWyJ1cHMiXV1bWyJmYWlsdXJlX3ZzX2N1cmUiXV0Kb25seV90bXJjM19kb3duIDwtIG9ubHlfdG1yYzNfdG9wMTAwW1siZGVzZXEiXV1bWyJkb3ducyJdXVtbImZhaWx1cmVfdnNfY3VyZSJdXQoKdG1yYzNfZXh0ZXJuYWxfZGUgPC0gYWxsX3BhaXJ3aXNlKHRtcmMzX2V4dGVybmFsLCBtb2RlbF9iYXRjaCA9ICJzdmFzZXEiLCBmaWx0ZXIgPSAic2ltcGxlIikKdG1yYzNfZXh0ZXJuYWxfdGFibGUgPC0gY29tYmluZV9kZV90YWJsZXModG1yYzNfZXh0ZXJuYWxfZGUsIGV4Y2VsID0gImV4Y2VsL3RtcmMzX3Njb3R0X2Jpb3BzaWVzLnhsc3giKQp0bXJjM19leHRlcm5hbF9zaWcgPC0gZXh0cmFjdF9zaWduaWZpY2FudF9nZW5lcyh0bXJjM19leHRlcm5hbF90YWJsZSwgZXhjZWwgPSAiZXhjZWwvdG1yYzNfc2NvdHRfYmlvcHNpZXNfc2lnLnhsc3giKQoKdG1yYzNfZXh0ZXJuYWxfY2YgPC0gc2V0X2V4cHRfY29uZGl0aW9ucyh0bXJjM19leHRlcm5hbCwgZmFjdCA9ICJmaW5hbG91dGNvbWUiKSAlPiUKICBzZXRfZXhwdF9iYXRjaGVzKGZhY3QgPSAibGFiIikKdG1yYzNfZXh0ZXJuYWxfY2Zfbm9ybSA8LSBub3JtYWxpemVfZXhwdCh0bXJjM19leHRlcm5hbF9jZiwgZmlsdGVyID0gVFJVRSwgbm9ybSA9ICJxdWFudCIsIGNvbnZlcnQgPSAiY3BtIiwgdHJhbnNmb3JtID0gImxvZzIiKQpwbG90X3BjYSh0bXJjM19leHRlcm5hbF9jZl9ub3JtKQp0bXJjM19leHRlcm5hbF9jZl9uYiA8LSBub3JtYWxpemVfZXhwdCh0bXJjM19leHRlcm5hbF9jZiwgZmlsdGVyID0gVFJVRSwgYmF0Y2ggPSAic3Zhc2VxIiwgY29udmVydCA9ICJjcG0iLCB0cmFuc2Zvcm0gPSAibG9nMiIpCnBsb3RfcGNhKHRtcmMzX2V4dGVybmFsX2NmX25iKQoKdG1yYzNfZXh0ZXJuYWxfY2ZfZGUgPC0gYWxsX3BhaXJ3aXNlKHRtcmMzX2V4dGVybmFsX2NmLCBtb2RlbF9iYXRjaCA9ICJzdmFzZXEiLCBmaWx0ZXIgPSBUUlVFKQp0bXJjM19leHRlcm5hbF9jZl9kZQp0bXJjM19leHRlcm5hbF9jZl90YWJsZSA8LSBjb21iaW5lX2RlX3RhYmxlcyh0bXJjM19leHRlcm5hbF9jZl9kZSwgZXhjZWwgPSAiZXhjZWwvdG1yYzNfc2NvdHRfY2ZfdGFibGUueGxzeCIpCnRtcmMzX2V4dGVybmFsX2NmX3RhYmxlCnRtcmMzX2V4dGVybmFsX2NmX3NpZyA8LSBleHRyYWN0X3NpZ25pZmljYW50X2dlbmVzKHRtcmMzX2V4dGVybmFsX2NmX3RhYmxlLCBleGNlbCA9ICJleGNlbC90bXJjM19zY290dF9jZl9zaWcueGxzeCIpCnRtcmMzX2V4dGVybmFsX2NmX3NpZwoKdG1yYzNfZXh0ZXJuYWxfc3BlY2llcyA8LSBzZXRfZXhwdF9jb25kaXRpb25zKHRtcmMzX2V4dGVybmFsLCBmYWN0ID0gIlBhcmFzaXRlU3BlY2llcyIpICU+JQogIHNldF9leHB0X2NvbG9ycyhjb2xvcl9jaG9pY2VzW1sicGFyYXNpdGUiXV0pCmBgYAoKIyBDb21wYXJlIHRoZSBsMkZDIHZhbHVlcwoKTGV0IHVzIGxvb2sgYXQgdGhlIHRvcC9ib3R0b20gMTAwIGdlbmVzIG9mIHRoZXNlIHR3byBkYXRhc2V0cyBhbmQgc2VlIGlmIHRoZXkKaGF2ZSBhbnkgc2ltaWxhcml0aWVzLgoKTm90ZSB0byBzZWxmLCBzZXQgdXAgczQgZGlzcGF0Y2ggb24gY29tcGFyZV9kZV90YWJsZXMhCgpgYGB7cn0KY29tcGFyZWQgPC0gY29tcGFyZV9kZV90YWJsZXMob25seV90bXJjM190YWJsZSwgZXh0ZXJuYWxfdGFibGUsIGZpcnN0X3RhYmxlID0gMSwgc2Vjb25kX3RhYmxlID0gMSkKY29tcGFyZWQkc2NhdHRlcgpjb21wYXJlZCRjb3JyZWxhdGlvbgpgYGAKCmBgYHtyIGxvYWRtZV9hZnRlciwgZXZhbD1GQUxTRX0KdG1wIDwtIGxvYWRtZShmaWxlbmFtZSA9IHNhdmVmaWxlKQpgYGAK