L. panamensis 202212: TMRC3 Differential Expression analyses

atb

2022-12-08

1 Changelog

  • Still hunting for messed up colors, changed input data to match new version.

2 TODO

Also some TMRC2:

Some concern about macrophage document and how to move it forward. Maria Adelaida will pick up the variant TMRC2 data. Defining parasite populations via variants and typing.

Review text on SVs and loadings in methods of current document.

Revisit the TMRC2 powerpoint and make sure that it includes DE tables.p

3 Introduction

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

3.1 Naming conventions

I am going to try to standardize how I name the various data structures created in this document. Most of the large data created are either sets of differential expression analyses, their combined results, or the set of results deemed ‘significant’.

Hopefully by now they all follow these guidelines:

{clinic(s)}sample-subset}{primary-question(s)}{datatype}{batch-method}

  • {clinic}: This is either tc or t for Tumaco and Cali, or just Tumaco.
  • {sample-subset}: Things like ‘all’ or ‘monocytes’.
  • {primary-question}: Shorthand name for the primary contrasts performed, thus ‘clinics’ would suggest a comparison of Tumaco vs. Cali. ‘visits’ would compare v2/v1, etc.
  • {datatype}: de, table, sig
  • {batch-type}: nobatch, batch{factor}, sva. {factor} in this instance should be a column from the metadata.

With this in mind, ‘tc_biopsies_clinic_de_sva’ should be the Tumaco+Cali biopsy data after performing the differential expression analyses comparing the clinics using sva.

I suspect there remain some exceptions and/or errors.

3.2 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.

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"))

4 Compare samples by clinic

4.1 DE: Compare clinics, all samples

Perform a svaseq-guided comparison of the two clinics. Ideally this will give some clue about just how strong the clinic-based batch effect really is and what its causes are.

tc_clinic_type <- tc_valid %>%
  set_expt_conditions(fact="clinic") %>%
  set_expt_batches(fact="typeofcells")

table(pData(tc_clinic_type)[["condition"]])
## 
##   Cali Tumaco 
##     61    123
tc_all_clinic_de_sva <- all_pairwise(tc_clinic_type, model_batch="svaseq", filter=TRUE, parallel=FALSE)
## This DE analysis will perform all pairwise comparisons among:
## 
##   Cali Tumaco 
##     61    123
## This analysis will include surrogate estimates from: svaseq.
## This will pre-filter the input data using normalize_expt's: TRUE argument.
## Removing 0 low-count genes (14290 remaining).
## Setting 31271 low elements to zero.
## transform_counts: Found 31271 values equal to 0, adding 1 to the matrix.
## Starting basic_pairwise().
## Starting basic pairwise comparison.
## Basic step 0/3: Normalizing data.
## Basic step 0/3: Converting data.
## Basic step 0/3: Transforming data.
## Basic step 1/3: Creating mean and variance tables.
## Basic step 2/3: Performing 3 comparisons.
## Basic step 3/3: Creating faux DE Tables.
## Basic: Returning tables.
## Starting deseq_pairwise().
## Starting DESeq2 pairwise comparisons.
## The data should be suitable for EdgeR/DESeq/EBSeq. If they freak out, check the state of the count table and ensure that it is in integer counts.
## Including batch estimates from sva/ruv/pca in the model.
## Choosing the non-intercept containing model.
## DESeq2 step 1/5: Including a matrix of batch estimates in the deseq model.
## converting counts to integer mode
## DESeq2 step 2/5: Estimate size factors.
## DESeq2 step 3/5: Estimate dispersions.
## gene-wise dispersion estimates
## mean-dispersion relationship
## final dispersion estimates
## Using a parametric fitting seems to have worked.
## DESeq2 step 4/5: nbinomWaldTest.
## Starting ebseq_pairwise().
## The data should be suitable for EdgeR/DESeq/EBSeq. If they freak out, check the state of the count table and ensure that it is in integer counts.
## Starting EBSeq pairwise subset.
## Choosing the non-intercept containing model.
## Starting EBTest of Cali vs. Tumaco.
## Copying ppee values as ajusted p-values until I figure out how to deal with them.
## Starting edger_pairwise().
## Starting edgeR pairwise comparisons.
## The data should be suitable for EdgeR/DESeq/EBSeq. If they freak out, check the state of the count table and ensure that it is in integer counts.
## Including batch estimates from sva/ruv/pca in the model.
## Choosing the non-intercept containing model.
## EdgeR step 1/9: Importing and normalizing data.
## EdgeR step 2/9: Estimating the common dispersion.
## EdgeR step 3/9: Estimating dispersion across genes.
## EdgeR step 4/9: Estimating GLM Common dispersion.
## EdgeR step 5/9: Estimating GLM Trended dispersion.
## EdgeR step 6/9: Estimating GLM Tagged dispersion.
## EdgeR step 7/9: Running glmFit, switch to glmQLFit by changing the argument 'edger_test'.
## EdgeR step 8/9: Making pairwise contrasts.

## Starting limma_pairwise().
##                        Length Class         Mode     
## title                    1    -none-        character
## notes                    1    -none-        character
## initial_metadata       148    data.frame    list     
## expressionset            1    ExpressionSet S4       
## design                 148    data.frame    list     
## conditions             184    -none-        character
## batches                184    factor        numeric  
## samplenames            184    -none-        character
## colors                 184    -none-        character
## state                    5    -none-        list     
## libsize                184    -none-        numeric  
## original_expressionset   1    ExpressionSet S4       
## normalized               6    -none-        list     
## best_libsize           184    -none-        numeric  
## norm_result              6    -none-        list
## Starting limma pairwise comparison.
## libsize was not specified, this parameter has profound effects on limma's result.
## Using the libsize from expt$best_libsize.
## Limma step 1/6: choosing model.
## Including batch estimates from sva/ruv/pca in the model.
## Choosing the non-intercept containing model.
## Limma step 2/6: running limma::voom(), switch with the argument 'which_voom'.
## Using normalize.method = quantile for voom.

## Limma step 3/6: running lmFit with method: ls.
## Limma step 4/6: making and fitting contrasts with no intercept. (~ 0 + factors)
## Limma step 5/6: Running eBayes with robust = FALSE and trend = FALSE.
## Limma step 6/6: Writing limma outputs.
## Limma step 6/6: 1/1: Creating table: Tumaco_vs_Cali.  Adjust = BH
## Limma step 6/6: 1/2: Creating table: Cali.  Adjust = BH
## Limma step 6/6: 2/2: Creating table: Tumaco.  Adjust = BH
##                        Length Class         Mode     
## title                    1    -none-        character
## notes                    1    -none-        character
## initial_metadata       148    data.frame    list     
## expressionset            1    ExpressionSet S4       
## design                 148    data.frame    list     
## conditions             184    -none-        character
## batches                184    factor        numeric  
## samplenames            184    -none-        character
## colors                 184    -none-        character
## state                    5    -none-        list     
## libsize                184    -none-        numeric  
## original_expressionset   1    ExpressionSet S4       
## normalized               6    -none-        list     
## best_libsize           184    -none-        numeric  
## norm_result              6    -none-        list
## Comparing analyses.

tc_all_clinic_de_sva[["deseq"]][["contrasts_performed"]]
## [1] "Tumaco_vs_Cali"
tc_all_clinic_table_sva <- combine_de_tables(
    tc_all_clinic_de_sva, keepers=clinic_contrasts,
    rda=glue::glue("rda/tc_all_clinic_table_sva-v{ver}.rda"),
    excel=glue::glue("analyses/3_cali_and_tumaco/compare_clinics/tc_all_clinic_table_sva-v{ver}.xlsx"))
## Starting combine_extracted_plots() with do_inverse as: TRUE.
## Plotting volcano plot of the DE results of Tumaco_vs_Cali according to the columns: logFC and adj.P.Val using the expressionset colors.
## Plotting volcano plot of the DE results of Tumaco_vs_Cali according to the columns: logFC and FDR using the expressionset colors.
## Plotting volcano plot of the DE results of Tumaco_vs_Cali according to the columns: logFC and adj.P.Val using the expressionset colors.
## Saving de result as tc_all_clinic_table_sva-v202212 to rda/tc_all_clinic_table_sva-v202212.rda.
tc_all_clinic_sig_sva <- extract_significant_genes(
    tc_all_clinic_table_sva,
    excel=glue::glue("analyses/3_cali_and_tumaco/compare_clinics/tc_clinic_type_sig_sva-v{ver}.xlsx"))
## Plotting volcano plot of the DE results of Tumaco_vs_Cali according to the columns: logFC and adj.P.Val using the expressionset colors.
## Plotting volcano plot of the DE results of Tumaco_vs_Cali according to the columns: logFC and FDR using the expressionset colors.
## Plotting volcano plot of the DE results of Tumaco_vs_Cali according to the columns: logFC and adj.P.Val using the expressionset colors.

4.1.1 Visualize clinic differences

Let us take a quick look at the results of the comparison of Tumaco/Cali

Note: I keep re-introducing an error which causes these (volcano and MA) plots to be reversed with respect to the logFC values. Pay careful attention to these and make sure that they agree with the numbers of genes observed in the contrast.

## Check that up is up
summary(tc_all_clinic_table_sva[["data"]][["clinics"]][["deseq_logfc"]])
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
## -20.580  -0.584  -0.155  -0.255   0.172   3.515
## I think we can assume that most genes are down when considering Tumaco/Cali.
sum(tc_all_clinic_table_sva$data$clinics$deseq_logfc < -1 & tc_all_clinic_table_sva$data$clinics$deseq_adjp < 0.05)
## [1] 1792
tc_all_clinic_table_sva[["plots"]][["clinics"]][["deseq_vol_plots"]][["plot"]]

## Ok, so it says 1794 up, but that is clearly the down side...  Something is definitely messed up.
## The points are on the correct sides of the plot, but the categories of up/down are reversed.
## Theresa noted that she colors differently, and I think better: left side gets called
## 'increased in denominator', right side gets called 'increased in numerator';
## these two groups are colored according to their condition colors, and everything else is gray.
## I am checking out Theresa's helper_functions.R to get a sense of how she handles this, I think
## I can use a variant of her idea pretty easily:
##  1.  Add a column 'Significance', which is a factor, and contains either 'Not enriched',
##      'Enriched in x', or 'Enriched in y' according to the logfc/adjp.
##  2.  use the significance column for the geom_point color/fill in the volcano plot.
## My change to this idea would be to extract the colors from the input expressionset.

4.1.2 Ontology Search by clinic

increased_tumaco_categories <- simple_gprofiler(tc_all_clinic_sig_sva[["deseq"]][["ups"]][["clinics"]])
## Warning: `gather_()` was deprecated in tidyr 1.2.0.
## ℹ Please use `gather()` instead.
## ℹ The deprecated feature was likely used in the plotly package.
##   Please report the issue at <https://github.com/plotly/plotly.R/issues>.
## 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
increased_tumaco_categories[["pvalue_plots"]][["BP"]]

increased_cali_categories <- simple_gprofiler(tc_all_clinic_sig_sva[["deseq"]][["downs"]][["clinics"]])
## 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
increased_cali_categories[["pvalue_plots"]][["BP"]]

There appear to be many more genes which are increased in the Tumaco samples with respect to the Cali samples.

4.2 DE: Compare clinics, eosinophil samples

The remaining cell types all have pretty strong clinic-based variance; but I am not certain if it is consistent across cell types.

table(pData(tc_eosinophils)[["condition"]])
## 
##      Cali_cure    Tumaco_cure Tumaco_failure 
##             15             17              9
tc_eosinophils_clinic_de_nobatch <- all_pairwise(tc_eosinophils, model_batch=FALSE, filter=TRUE)
## This DE analysis will perform all pairwise comparisons among:
## 
##      Cali_cure    Tumaco_cure Tumaco_failure 
##             15             17              9
## This will pre-filter the input data using normalize_expt's: TRUE argument.
## Finished running DE analyses, collecting outputs.
## Comparing analyses.

tc_eosinophils_clinic_de_nobatch[["deseq"]][["contrasts_performed"]]
## [1] "Tumacofailure_vs_Tumacocure" "Tumacofailure_vs_Calicure"  
## [3] "Tumacocure_vs_Calicure"
tc_eosinophils_clinic_table_nobatch <- combine_de_tables(
    tc_eosinophils_clinic_de_nobatch, keepers=tc_cf_contrasts,
    rda=glue::glue("rda/tc_eosinophils_clinic_table_nobatch-v{ver}.rda"),
    excel=glue::glue("analyses/3_cali_and_tumaco/clinic_cf/Eosinophils/tc_eosinophils_clinic_table_nobatch-v{ver}.xlsx"))
## Starting combine_extracted_plots() with do_inverse as: FALSE.
## Plotting volcano plot of the DE results of Tumacofailure_vs_Tumacocure according to the columns: logFC and adj.P.Val using the expressionset colors.
## Plotting volcano plot of the DE results of Tumacofailure_vs_Tumacocure according to the columns: logFC and FDR using the expressionset colors.
## Starting combine_extracted_plots() with do_inverse as: FALSE.
## Plotting volcano plot of the DE results of Tumacocure_vs_Calicure according to the columns: logFC and adj.P.Val using the expressionset colors.
## Plotting volcano plot of the DE results of Tumacocure_vs_Calicure according to the columns: logFC and FDR using the expressionset colors.
## Saving de result as tc_eosinophils_clinic_table_nobatch-v202212 to rda/tc_eosinophils_clinic_table_nobatch-v202212.rda.
tc_eosinophils_clinic_sig_nobatch <- extract_significant_genes(
    tc_eosinophils_clinic_table_nobatch,
    excel=glue::glue("analyses/3_cali_and_tumaco/clinic_cf/Eosinophils/tc_eosinophils_clinic_sig_nobatch-v{ver}.xlsx"))
## Plotting volcano plot of the DE results of Tumacofailure_vs_Tumacocure according to the columns: logFC and FDR using the expressionset colors.
## Plotting volcano plot of the DE results of Tumacocure_vs_Calicure according to the columns: logFC and FDR using the expressionset colors.
## Plotting volcano plot of the DE results of Tumacofailure_vs_Tumacocure according to the columns: logFC and adj.P.Val using the expressionset colors.
## Plotting volcano plot of the DE results of Tumacocure_vs_Calicure according to the columns: logFC and adj.P.Val using the expressionset colors.
tc_eosinophils_clinic_de_sva <- all_pairwise(tc_eosinophils, model_batch="svaseq", filter=TRUE)
## This DE analysis will perform all pairwise comparisons among:
## 
##      Cali_cure    Tumaco_cure Tumaco_failure 
##             15             17              9
## This analysis will include surrogate estimates from: svaseq.
## This will pre-filter the input data using normalize_expt's: TRUE argument.
## Removing 0 low-count genes (10864 remaining).
## Setting 1043 low elements to zero.
## transform_counts: Found 1043 values equal to 0, adding 1 to the matrix.
## Finished running DE analyses, collecting outputs.
## Comparing analyses.

tc_eosinophils_clinic_de_sva[["deseq"]][["contrasts_performed"]]
## [1] "Tumacofailure_vs_Tumacocure" "Tumacofailure_vs_Calicure"  
## [3] "Tumacocure_vs_Calicure"
tc_eosinophils_clinic_table_sva <- combine_de_tables(
    tc_eosinophils_clinic_de_sva, keepers=tc_cf_contrasts,
    rda=glue::glue("rda/tc_eosinophils_clinic_table_sva-v{ver}.rda"),
    excel=glue::glue("analyses/3_cali_and_tumaco/clinic_cf/Eosinophils/tc_eosinophils_clinic_table_sva-v{ver}.xlsx"))
## Starting combine_extracted_plots() with do_inverse as: FALSE.
## Plotting volcano plot of the DE results of Tumacofailure_vs_Tumacocure according to the columns: logFC and adj.P.Val using the expressionset colors.
## Plotting volcano plot of the DE results of Tumacofailure_vs_Tumacocure according to the columns: logFC and FDR using the expressionset colors.
## Starting combine_extracted_plots() with do_inverse as: FALSE.
## Plotting volcano plot of the DE results of Tumacocure_vs_Calicure according to the columns: logFC and adj.P.Val using the expressionset colors.
## Plotting volcano plot of the DE results of Tumacocure_vs_Calicure according to the columns: logFC and FDR using the expressionset colors.
## Saving de result as tc_eosinophils_clinic_table_sva-v202212 to rda/tc_eosinophils_clinic_table_sva-v202212.rda.
tc_eosinophils_clinic_sig_sva <- extract_significant_genes(
    tc_eosinophils_clinic_table_sva,
    excel=glue::glue("analyses/3_cali_and_tumaco/clinic_cf/Eosinophils/tc_eosinophils_clinic_sig_sva-v{ver}.xlsx"))
## Plotting volcano plot of the DE results of Tumacofailure_vs_Tumacocure according to the columns: logFC and FDR using the expressionset colors.
## Plotting volcano plot of the DE results of Tumacocure_vs_Calicure according to the columns: logFC and FDR using the expressionset colors.
## Plotting volcano plot of the DE results of Tumacofailure_vs_Tumacocure according to the columns: logFC and adj.P.Val using the expressionset colors.
## Plotting volcano plot of the DE results of Tumacocure_vs_Calicure according to the columns: logFC and adj.P.Val using the expressionset colors.

4.3 DE: Compare clinics, biopsy samples

Interestingly to me, the biopsy samples appear to have the least location-based variance. But we can perform an explicit DE and see how well that hypothesis holds up.

Note that these data include cure and fail samples for

table(pData(tc_biopsies)[["condition"]])
## 
##      Cali_cure    Tumaco_cure Tumaco_failure 
##              4              9              5
tc_biopsies_clinic_de_sva <- all_pairwise(tc_biopsies, model_batch="svaseq", filter=TRUE)
## This DE analysis will perform all pairwise comparisons among:
## 
##      Cali_cure    Tumaco_cure Tumaco_failure 
##              4              9              5
## This analysis will include surrogate estimates from: svaseq.
## This will pre-filter the input data using normalize_expt's: TRUE argument.
## Removing 0 low-count genes (13608 remaining).
## Setting 290 low elements to zero.
## transform_counts: Found 290 values equal to 0, adding 1 to the matrix.
## Finished running DE analyses, collecting outputs.
## Comparing analyses.

tc_biopsies_clinic_de_sva[["deseq"]][["contrasts_performed"]]
## [1] "Tumacofailure_vs_Tumacocure" "Tumacofailure_vs_Calicure"  
## [3] "Tumacocure_vs_Calicure"
tc_biopsies_clinic_table_sva <- combine_de_tables(
    tc_biopsies_clinic_de_sva, keepers=tc_cf_contrasts,
    rda=glue::glue("rda/tc_biopsies_clinic_table_sva-v{ver}.xlsx"),
    excel=glue::glue("analyses/3_cali_and_tumaco/clinic_cf/Biopsies/tc_biopsies_clinic_table_sva-v{ver}.xlsx"))
## Starting combine_extracted_plots() with do_inverse as: FALSE.
## Plotting volcano plot of the DE results of Tumacofailure_vs_Tumacocure according to the columns: logFC and adj.P.Val using the expressionset colors.
## Plotting volcano plot of the DE results of Tumacofailure_vs_Tumacocure according to the columns: logFC and FDR using the expressionset colors.
## Starting combine_extracted_plots() with do_inverse as: FALSE.
## Plotting volcano plot of the DE results of Tumacocure_vs_Calicure according to the columns: logFC and adj.P.Val using the expressionset colors.
## Plotting volcano plot of the DE results of Tumacocure_vs_Calicure according to the columns: logFC and FDR using the expressionset colors.
## Saving de result as tc_biopsies_clinic_table_sva-v202212.xlsx to rda/tc_biopsies_clinic_table_sva-v202212.xlsx.
tc_biopsies_clinic_sig_sva <- extract_significant_genes(
    tc_biopsies_clinic_table_sva,
    excel=glue::glue("analyses/3_cali_and_tumaco/clinic_cf/Biopsies/tc_biopsies_clinic_sig_sva-v{ver}.xlsx"))
## Plotting volcano plot of the DE results of Tumacofailure_vs_Tumacocure according to the columns: logFC and FDR using the expressionset colors.
## Plotting volcano plot of the DE results of Tumacocure_vs_Calicure according to the columns: logFC and FDR using the expressionset colors.
## Plotting volcano plot of the DE results of Tumacofailure_vs_Tumacocure according to the columns: logFC and adj.P.Val using the expressionset colors.
## Plotting volcano plot of the DE results of Tumacocure_vs_Calicure according to the columns: logFC and adj.P.Val using the expressionset colors.

4.4 DE: Compare clinics, monocyte samples

At least for the moment, I am only looking at the differences between no-batch vs. sva across clinics for the monocyte samples. This was chosen mostly arbitrarily.

4.4.1 DE: Compare clinics, monocytes without batch estimation

Our baseline is the comparison of the monocytes samples without batch in the model or surrogate estimation. In theory at least, this should correspond to the PCA plot above when no batch estimation was performed.

tc_monocytes_de_nobatch <- all_pairwise(tc_monocytes, model_batch=FALSE, filter=TRUE)
## This DE analysis will perform all pairwise comparisons among:
## 
##      Cali_cure   Cali_failure    Tumaco_cure Tumaco_failure 
##             18              3             21             21
## This will pre-filter the input data using normalize_expt's: TRUE argument.
## Finished running DE analyses, collecting outputs.
## Comparing analyses.

tc_monocytes_table_nobatch <- combine_de_tables(
    tc_monocytes_de_nobatch, keepers=clinic_cf_contrasts,
    rda=glue::glue("rda/tc_monocytes_clinic_table_nobatch-v{ver}.rda"),
    excel=glue::glue("analyses/3_cali_and_tumaco/clinic_cf/Monocytes/tc_monocytes_clinic_table_nobatch-v{ver}.xlsx"))
## Starting combine_extracted_plots() with do_inverse as: FALSE.
## Plotting volcano plot of the DE results of Califailure_vs_Calicure according to the columns: logFC and adj.P.Val using the expressionset colors.
## Plotting volcano plot of the DE results of Califailure_vs_Calicure according to the columns: logFC and FDR using the expressionset colors.
## Starting combine_extracted_plots() with do_inverse as: FALSE.
## Plotting volcano plot of the DE results of Tumacofailure_vs_Tumacocure according to the columns: logFC and adj.P.Val using the expressionset colors.
## Plotting volcano plot of the DE results of Tumacofailure_vs_Tumacocure according to the columns: logFC and FDR using the expressionset colors.
## Starting combine_extracted_plots() with do_inverse as: FALSE.
## Plotting volcano plot of the DE results of Tumacocure_vs_Calicure according to the columns: logFC and adj.P.Val using the expressionset colors.
## Plotting volcano plot of the DE results of Tumacocure_vs_Calicure according to the columns: logFC and FDR using the expressionset colors.
## Starting combine_extracted_plots() with do_inverse as: FALSE.
## Plotting volcano plot of the DE results of Tumacofailure_vs_Califailure according to the columns: logFC and adj.P.Val using the expressionset colors.
## Plotting volcano plot of the DE results of Tumacofailure_vs_Califailure according to the columns: logFC and FDR using the expressionset colors.
## Saving de result as tc_monocytes_clinic_table_nobatch-v202212 to rda/tc_monocytes_clinic_table_nobatch-v202212.rda.
tc_monocytes_sig_nobatch <- extract_significant_genes(
    tc_monocytes_table_nobatch,
    excel=glue::glue("analyses/3_cali_and_tumaco/clinic_cf/Monocytes/tc_monocytes_clinic_sig_nobatch-v{ver}.xlsx"))
## Plotting volcano plot of the DE results of Califailure_vs_Calicure according to the columns: logFC and FDR using the expressionset colors.
## Plotting volcano plot of the DE results of Tumacofailure_vs_Tumacocure according to the columns: logFC and FDR using the expressionset colors.
## Plotting volcano plot of the DE results of Tumacocure_vs_Calicure according to the columns: logFC and FDR using the expressionset colors.
## Plotting volcano plot of the DE results of Tumacofailure_vs_Califailure according to the columns: logFC and FDR using the expressionset colors.
## Plotting volcano plot of the DE results of Califailure_vs_Calicure according to the columns: logFC and adj.P.Val using the expressionset colors.
## Plotting volcano plot of the DE results of Tumacofailure_vs_Tumacocure according to the columns: logFC and adj.P.Val using the expressionset colors.
## Plotting volcano plot of the DE results of Tumacocure_vs_Calicure according to the columns: logFC and adj.P.Val using the expressionset colors.
## Plotting volcano plot of the DE results of Tumacofailure_vs_Califailure according to the columns: logFC and adj.P.Val using the expressionset colors.

4.4.2 DE: Compare clinics, monocytes with svaseq

In contrast, the following comparison should give a view of the data corresponding to the svaseq PCA plot above. In the best case scenario, we should therefore be able to see some significane differences between the Tumaco cure and fail samples.

tc_monocytes_de_sva <- all_pairwise(tc_monocytes, model_batch="svaseq", filter=TRUE)
## This DE analysis will perform all pairwise comparisons among:
## 
##      Cali_cure   Cali_failure    Tumaco_cure Tumaco_failure 
##             18              3             21             21
## This analysis will include surrogate estimates from: svaseq.
## This will pre-filter the input data using normalize_expt's: TRUE argument.
## Removing 0 low-count genes (11104 remaining).
## Setting 1447 low elements to zero.
## transform_counts: Found 1447 values equal to 0, adding 1 to the matrix.
## Finished running DE analyses, collecting outputs.
## Comparing analyses.

tc_monocytes_table_sva <- combine_de_tables(
    tc_monocytes_de_sva, keepers=clinic_cf_contrasts,
    rda=glue::glue("rda/tc_monocytes_clinic_table_sva-v{ver}.rda"),
    excel=glue::glue("analyses/3_cali_and_tumaco/clinic_cf/Monocytes/tc_monocytes_clinic_table_sva-v{ver}.xlsx"))
## Starting combine_extracted_plots() with do_inverse as: FALSE.
## Plotting volcano plot of the DE results of Califailure_vs_Calicure according to the columns: logFC and adj.P.Val using the expressionset colors.
## Plotting volcano plot of the DE results of Califailure_vs_Calicure according to the columns: logFC and FDR using the expressionset colors.
## Starting combine_extracted_plots() with do_inverse as: FALSE.
## Plotting volcano plot of the DE results of Tumacofailure_vs_Tumacocure according to the columns: logFC and adj.P.Val using the expressionset colors.
## Plotting volcano plot of the DE results of Tumacofailure_vs_Tumacocure according to the columns: logFC and FDR using the expressionset colors.
## Starting combine_extracted_plots() with do_inverse as: FALSE.
## Plotting volcano plot of the DE results of Tumacocure_vs_Calicure according to the columns: logFC and adj.P.Val using the expressionset colors.
## Plotting volcano plot of the DE results of Tumacocure_vs_Calicure according to the columns: logFC and FDR using the expressionset colors.
## Starting combine_extracted_plots() with do_inverse as: FALSE.
## Plotting volcano plot of the DE results of Tumacofailure_vs_Califailure according to the columns: logFC and adj.P.Val using the expressionset colors.
## Plotting volcano plot of the DE results of Tumacofailure_vs_Califailure according to the columns: logFC and FDR using the expressionset colors.
## Saving de result as tc_monocytes_clinic_table_sva-v202212 to rda/tc_monocytes_clinic_table_sva-v202212.rda.
tc_monocytes_sig_sva <- extract_significant_genes(
    tc_monocytes_table_sva,
    excel=glue::glue("analyses/3_cali_and_tumaco/clinic_cf/Monocytes/tc_monocytes_clinic_sig_sva-v{ver}.xlsx"))
## Plotting volcano plot of the DE results of Califailure_vs_Calicure according to the columns: logFC and FDR using the expressionset colors.
## Plotting volcano plot of the DE results of Tumacofailure_vs_Tumacocure according to the columns: logFC and FDR using the expressionset colors.
## Plotting volcano plot of the DE results of Tumacocure_vs_Calicure according to the columns: logFC and FDR using the expressionset colors.
## Plotting volcano plot of the DE results of Tumacofailure_vs_Califailure according to the columns: logFC and FDR using the expressionset colors.
## Plotting volcano plot of the DE results of Califailure_vs_Calicure according to the columns: logFC and adj.P.Val using the expressionset colors.
## Plotting volcano plot of the DE results of Tumacofailure_vs_Tumacocure according to the columns: logFC and adj.P.Val using the expressionset colors.
## Plotting volcano plot of the DE results of Tumacocure_vs_Calicure according to the columns: logFC and adj.P.Val using the expressionset colors.
## Plotting volcano plot of the DE results of Tumacofailure_vs_Califailure according to the columns: logFC and adj.P.Val using the expressionset colors.

4.4.3 DE Compare: How similar are the no-batch vs. SVA results?

The following block shows that these two results are exceedingly different, sugesting that the Cali cure/fail and Tumaco cure/fail cannot easily be considered in the same analysis. I did some playing around with my calculate_aucc function in this block and found that it is in some important way broken, at least if one expands the top-n genes to more than 20% of the number of genes in the data.

cali_table <- tc_monocytes_table_nobatch[["data"]][["cali"]]
table <- tc_monocytes_table_nobatch[["data"]][["tumaco"]]

cali_merged <- merge(cali_table, table, by="row.names")
cor.test(cali_merged[, "deseq_logfc.x"], cali_merged[, "deseq_logfc.y"])
## 
##  Pearson's product-moment correlation
## 
## data:  cali_merged[, "deseq_logfc.x"] and cali_merged[, "deseq_logfc.y"]
## t = 0.92, df = 11102, p-value = 0.4
## alternative hypothesis: true correlation is not equal to 0
## 95 percent confidence interval:
##  -0.009917  0.027280
## sample estimates:
##      cor 
## 0.008685
cali_aucc <- calculate_aucc(cali_table, table, px="deseq_adjp", py="deseq_adjp",
                            lx="deseq_logfc", ly="deseq_logfc")
cali_aucc$plot

cali_table_sva <- tc_monocytes_table_sva[["data"]][["cali"]]
tumaco_table_sva <- tc_monocytes_table_sva[["data"]][["tumaco"]]

cali_merged_sva <- merge(cali_table_sva, tumaco_table_sva, by="row.names")
cor.test(cali_merged_sva[, "deseq_logfc.x"], cali_merged_sva[, "deseq_logfc.y"])
## 
##  Pearson's product-moment correlation
## 
## data:  cali_merged_sva[, "deseq_logfc.x"] and cali_merged_sva[, "deseq_logfc.y"]
## t = 16, df = 11102, p-value <2e-16
## alternative hypothesis: true correlation is not equal to 0
## 95 percent confidence interval:
##  0.1356 0.1720
## sample estimates:
##    cor 
## 0.1539
cali_aucc_sva <- calculate_aucc(cali_table_sva, tumaco_table_sva, px="deseq_adjp", py="deseq_adjp",
                                lx="deseq_logfc", ly="deseq_logfc")
cali_aucc_sva$plot

4.5 DE: Compare clinics, neutrophil samples

tc_neutrophils_de_nobatch <- all_pairwise(tc_neutrophils, model_batch=FALSE, filter=TRUE)
## This DE analysis will perform all pairwise comparisons among:
## 
##      Cali_cure   Cali_failure    Tumaco_cure Tumaco_failure 
##             18              3             20             21
## This will pre-filter the input data using normalize_expt's: TRUE argument.
## Finished running DE analyses, collecting outputs.
## Comparing analyses.

tc_neutrophils_table_nobatch <- combine_de_tables(
    tc_neutrophils_de_nobatch, keepers=clinic_cf_contrasts,
    rda=glue::glue("rda/tc_neutrophils_clinic_table_nobatch-v{ver}.rda"),
    excel=glue::glue("analyses/3_cali_and_tumaco/clinic_cf/Neutrophils/tc_neutrophils_table_nobatch-v{ver}.xlsx"))
## Starting combine_extracted_plots() with do_inverse as: FALSE.
## Plotting volcano plot of the DE results of Califailure_vs_Calicure according to the columns: logFC and adj.P.Val using the expressionset colors.
## Plotting volcano plot of the DE results of Califailure_vs_Calicure according to the columns: logFC and FDR using the expressionset colors.
## Starting combine_extracted_plots() with do_inverse as: FALSE.
## Plotting volcano plot of the DE results of Tumacofailure_vs_Tumacocure according to the columns: logFC and adj.P.Val using the expressionset colors.
## Plotting volcano plot of the DE results of Tumacofailure_vs_Tumacocure according to the columns: logFC and FDR using the expressionset colors.
## Starting combine_extracted_plots() with do_inverse as: FALSE.
## Plotting volcano plot of the DE results of Tumacocure_vs_Calicure according to the columns: logFC and adj.P.Val using the expressionset colors.
## Plotting volcano plot of the DE results of Tumacocure_vs_Calicure according to the columns: logFC and FDR using the expressionset colors.
## Starting combine_extracted_plots() with do_inverse as: FALSE.
## Plotting volcano plot of the DE results of Tumacofailure_vs_Califailure according to the columns: logFC and adj.P.Val using the expressionset colors.
## Plotting volcano plot of the DE results of Tumacofailure_vs_Califailure according to the columns: logFC and FDR using the expressionset colors.
## Saving de result as tc_neutrophils_clinic_table_nobatch-v202212 to rda/tc_neutrophils_clinic_table_nobatch-v202212.rda.
tc_neutrophils_sig_nobatch <- extract_significant_genes(
    tc_neutrophils_table_nobatch,
    excel=glue::glue("analyses/3_cali_and_tumaco/clinic_cf/Neutrophils/tc_neutrophils_sig_nobatch-v{ver}.xlsx"))
## Plotting volcano plot of the DE results of Califailure_vs_Calicure according to the columns: logFC and FDR using the expressionset colors.
## Plotting volcano plot of the DE results of Tumacofailure_vs_Tumacocure according to the columns: logFC and FDR using the expressionset colors.
## Plotting volcano plot of the DE results of Tumacocure_vs_Calicure according to the columns: logFC and FDR using the expressionset colors.
## Plotting volcano plot of the DE results of Tumacofailure_vs_Califailure according to the columns: logFC and FDR using the expressionset colors.
## Plotting volcano plot of the DE results of Califailure_vs_Calicure according to the columns: logFC and adj.P.Val using the expressionset colors.
## Plotting volcano plot of the DE results of Tumacofailure_vs_Tumacocure according to the columns: logFC and adj.P.Val using the expressionset colors.
## Plotting volcano plot of the DE results of Tumacocure_vs_Calicure according to the columns: logFC and adj.P.Val using the expressionset colors.
## Plotting volcano plot of the DE results of Tumacofailure_vs_Califailure according to the columns: logFC and adj.P.Val using the expressionset colors.
tc_neutrophils_de_sva <- all_pairwise(tc_neutrophils, model_batch="svaseq", filter=TRUE)
## This DE analysis will perform all pairwise comparisons among:
## 
##      Cali_cure   Cali_failure    Tumaco_cure Tumaco_failure 
##             18              3             20             21
## This analysis will include surrogate estimates from: svaseq.
## This will pre-filter the input data using normalize_expt's: TRUE argument.
## Removing 0 low-count genes (9242 remaining).
## Setting 1541 low elements to zero.
## transform_counts: Found 1541 values equal to 0, adding 1 to the matrix.
## Finished running DE analyses, collecting outputs.
## Comparing analyses.

tc_neutrophils_table_sva <- combine_de_tables(
    tc_neutrophils_de_sva, keepers=clinic_cf_contrasts,
    rda=glue::glue("rda/tc_neutrophils_clinic_table_sva-v{ver}.rda"),
    excel=glue::glue("analyses/3_cali_and_tumaco/clinic_cf/Neutrophils/tc_neutrophils_table_sva-v{ver}.xlsx"))
## Starting combine_extracted_plots() with do_inverse as: FALSE.
## Plotting volcano plot of the DE results of Califailure_vs_Calicure according to the columns: logFC and adj.P.Val using the expressionset colors.
## Plotting volcano plot of the DE results of Califailure_vs_Calicure according to the columns: logFC and FDR using the expressionset colors.
## Starting combine_extracted_plots() with do_inverse as: FALSE.
## Plotting volcano plot of the DE results of Tumacofailure_vs_Tumacocure according to the columns: logFC and adj.P.Val using the expressionset colors.
## Plotting volcano plot of the DE results of Tumacofailure_vs_Tumacocure according to the columns: logFC and FDR using the expressionset colors.
## Starting combine_extracted_plots() with do_inverse as: FALSE.
## Plotting volcano plot of the DE results of Tumacocure_vs_Calicure according to the columns: logFC and adj.P.Val using the expressionset colors.
## Plotting volcano plot of the DE results of Tumacocure_vs_Calicure according to the columns: logFC and FDR using the expressionset colors.
## Starting combine_extracted_plots() with do_inverse as: FALSE.
## Plotting volcano plot of the DE results of Tumacofailure_vs_Califailure according to the columns: logFC and adj.P.Val using the expressionset colors.
## Plotting volcano plot of the DE results of Tumacofailure_vs_Califailure according to the columns: logFC and FDR using the expressionset colors.
## Saving de result as tc_neutrophils_clinic_table_sva-v202212 to rda/tc_neutrophils_clinic_table_sva-v202212.rda.
tc_neutrophils_sig_sva <- extract_significant_genes(
    tc_neutrophils_table_sva,
    excel=glue::glue("analyses/3_cali_and_tumaco/clinic_cf/Neutrophils/tc_neutrophils_sig_sva-v{ver}.xlsx"))
## Plotting volcano plot of the DE results of Califailure_vs_Calicure according to the columns: logFC and FDR using the expressionset colors.
## Plotting volcano plot of the DE results of Tumacofailure_vs_Tumacocure according to the columns: logFC and FDR using the expressionset colors.
## Plotting volcano plot of the DE results of Tumacocure_vs_Calicure according to the columns: logFC and FDR using the expressionset colors.
## Plotting volcano plot of the DE results of Tumacofailure_vs_Califailure according to the columns: logFC and FDR using the expressionset colors.
## Plotting volcano plot of the DE results of Califailure_vs_Calicure according to the columns: logFC and adj.P.Val using the expressionset colors.
## Plotting volcano plot of the DE results of Tumacofailure_vs_Tumacocure according to the columns: logFC and adj.P.Val using the expressionset colors.
## Plotting volcano plot of the DE results of Tumacocure_vs_Calicure according to the columns: logFC and adj.P.Val using the expressionset colors.
## Plotting volcano plot of the DE results of Tumacofailure_vs_Califailure according to the columns: logFC and adj.P.Val using the expressionset colors.

5 Compare DE: How similar are Tumaco C/F vs. Cali C/F

The following expands the cross-clinic query above to also test the neutrophils. Once again, I think it will pretty strongly support the hypothesis that the two clinics are not compatible.

We are concerned that the clinic-based batch effect may make our results essentially useless. One way to test this concern is to compare the set of genes observed different between the Cali Cure/Fail vs. the Tumaco Cure/Fail.

cali_table_nobatch <- tc_neutrophils_table_nobatch[["data"]][["cali"]]
tumaco_table_nobatch <- tc_neutrophils_table_nobatch[["data"]][["tumaco"]]

cali_merged_nobatch <- merge(cali_table_nobatch, tumaco_table_nobatch, by="row.names")
cor.test(cali_merged_nobatch[, "deseq_logfc.x"], cali_merged_nobatch[, "deseq_logfc.y"])
## 
##  Pearson's product-moment correlation
## 
## data:  cali_merged_nobatch[, "deseq_logfc.x"] and cali_merged_nobatch[, "deseq_logfc.y"]
## t = -16, df = 9240, p-value <2e-16
## alternative hypothesis: true correlation is not equal to 0
## 95 percent confidence interval:
##  -0.1800 -0.1403
## sample estimates:
##     cor 
## -0.1602
cali_aucc_nobatch <- calculate_aucc(cali_table_nobatch, tumaco_table_nobatch, px="deseq_adjp",
                                    py="deseq_adjp", lx="deseq_logfc", ly="deseq_logfc")
cali_aucc_nobatch$plot

5.1 GSEA: Extract clinic-specific genes

Given the above comparisons, we can extract some gene sets which resulted from those DE analyses and eventually perform some ontology/KEGG/reactome/etc searches. This reminds me, I want to make my extract_significant_ functions to return gene-set data structures and my various ontology searches to take them as inputs. This should help avoid potential errors when extracting up/down genes.

clinic_sigenes_up <- rownames(tc_all_clinic_sig_sva[["deseq"]][["ups"]][["clinics"]])
clinic_sigenes_down <- rownames(tc_all_clinic_sig_sva[["deseq"]][["downs"]][["clinics"]])
clinic_sigenes <- c(clinic_sigenes_up, clinic_sigenes_down)

tc_eosinophils_sigenes_up <- rownames(tc_eosinophils_clinic_sig_sva[["deseq"]][["ups"]][["cure"]])
tc_eosinophils_sigenes_down <- rownames(tc_eosinophils_clinic_sig_sva[["deseq"]][["downs"]][["cure"]])
tc_monocytes_sigenes_up <- rownames(tc_monocytes_sig_sva[["deseq"]][["ups"]][["cure"]])
tc_monocytes_sigenes_down <- rownames(tc_monocytes_sig_sva[["deseq"]][["downs"]][["cure"]])
tc_neutrophils_sigenes_up <- rownames(tc_neutrophils_sig_sva[["deseq"]][["ups"]][["cure"]])
tc_neutrophils_sigenes_down <- rownames(tc_neutrophils_sig_sva[["deseq"]][["downs"]][["cure"]])

tc_eosinophils_sigenes <- c(tc_eosinophils_sigenes_up,
                            tc_eosinophils_sigenes_down)
tc_monocytes_sigenes <- c(tc_monocytes_sigenes_up,
                          tc_monocytes_sigenes_down)
tc_neutrophils_sigenes <- c(tc_neutrophils_sigenes_up,
                            tc_neutrophils_sigenes_down)

5.2 GSEA: gProfiler of genes deemed up/down when comparing Cali and Tumaco

I was curious to try to understand why the two clinics appear to be so different vis a vis their PCA/DE; so I thought that gProfiler might help boil those results down to something more digestible.

5.2.1 GSEA: Compare clinics, all samples

Note that in the following block I used the function simple_gprofiler(), but later in this document I will use all_gprofiler(). The first invocation limits the search to a single table, while the second will iterate over every result in a pairwise differential expression analysis.

In this instance, we are looking at the vector of gene IDs deemed significantly different between the two clinics in either the up or down direction.

One other thing worth noting, the new version of gProfiler provides some fun interactive plots. I will add an example here.

clinic_gp <- simple_gprofiler(clinic_sigenes)
## 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
clinic_gp$pvalue_plots$REAC

clinic_gp$pvalue_plots$BP

clinic_gp$pvalue_plots$TF

clinic_gp$interactive_plots$GO

6 GSVA Load mSigDB data

Conversely, I can load some of the MsigDB categories from broad and perform a similar analysis using goseq to see if there are over represented categories.

broad_c7 <- load_gmt_signatures(signatures = "reference/msigdb/c7.all.v7.5.1.entrez.gmt",
                                signature_category = "c7")
broad_c2 <- load_gmt_signatures(signatures = "reference/msigdb/c2.all.v7.5.1.entrez.gmt",
                                signature_category = "c2")
broad_h <- load_gmt_signatures(signatures = "reference/msigdb/h.all.v7.5.1.entrez.gmt",
                               signature_category = "h")

clinic_gsea_msig_c2 <- goseq_msigdb(clinic_sigenes, length_db = hs_length,
                                    signatures = broad_c2, signature_category = "c2")
## Before conversion: 2065, after conversion: 2046.
## Error in rownames(length_db): object 'hs_length' not found

6.0.1 GSEA: Compare clinics, Eosinophil samples

In the following block, I am looking at the gProfiler over represented groups observed across clinics in only the Eosinophils. First I do so for all genes(up or down), followed by only the up and down groups. Each of the following will include only the Reactome and GO:BP plots. These searches did not have too many other hits, excepting the transcription factor database.

tc_eosinophils_gp <- simple_gprofiler(tc_eosinophils_sigenes)
## 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
tc_eosinophils_gp$pvalue_plots$REAC

tc_eosinophils_gp$pvalue_plots$BP

tc_eosinophils_up_gp <- simple_gprofiler(tc_eosinophils_sigenes_up)
## 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
tc_eosinophils_up_gp$pvalue_plots$REAC

tc_eosinophils_up_gp$pvalue_plots$BP

tc_eosinophils_down_gp <- simple_gprofiler(tc_eosinophils_sigenes_down)
## 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
tc_eosinophils_down_gp$pvalue_plots$REAC

tc_eosinophils_down_gp$pvalue_plots$BP

6.0.2 GSEA: Compare clinics, Monocyte samples

In the following block I repeated the above query, but this time looking at the monocyte samples.

tc_monocytes_gp <- simple_gprofiler(tc_monocytes_sigenes)
## 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
tc_monocytes_gp$pvalue_plots$REAC

tc_monocytes_gp$pvalue_plots$BP

tc_monocytes_up_gp <- simple_gprofiler(tc_monocytes_sigenes_up)
## 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
tc_monocytes_up_gp$pvalue_plots$REAC

tc_monocytes_up_gp$pvalue_plots$BP

tc_monocytes_down_gp <- simple_gprofiler(tc_monocytes_sigenes_down)
## 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
tc_monocytes_down_gp$pvalue_plots$REAC

tc_monocytes_down_gp$pvalue_plots$BP

6.0.3 GSEA: Compare clinics, Neutrophil samples

Ibid. This time looking at the Neutrophils. Thus the first two images should be a superset of the second and third pairs of images; assuming that the genes in the up/down list do not cause the groups to no longer be significant. Interestingly, the reactome search did not return any hits for the increased search.

tc_neutrophils_gp <- simple_gprofiler(tc_neutrophils_sigenes)
## 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
## tc_neutrophils_gp$pvalue_plots$REAC ## no hits
tc_neutrophils_gp$pvalue_plots$BP

tc_neutrophils_gp$pvalue_plots$TF

tc_neutrophils_up_gp <- simple_gprofiler(tc_neutrophils_sigenes_up)
## 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
## tc_neutrophils_up_gp$pvalue_plots$REAC ## No hits
tc_neutrophils_up_gp$pvalue_plots$BP

tc_neutrophils_down_gp <- simple_gprofiler(tc_neutrophils_sigenes_down)
## 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
tc_neutrophils_down_gp$pvalue_plots$REAC

tc_neutrophils_down_gp$pvalue_plots$BP

7 Tumaco and Cali, cure vs. fail

In all of the above, we are looking to understand the differences between the two location. Let us now step back and perform the original question: fail/cure without regard to location.

I performed this query with a few different parameters, notably with(out) sva and again using each cell type, including biopsies. The main reasion I am keeping these comparisons is in the relatively weak hope that there will be sufficient signal in the full dataset that it might be able to overcome the apparently ridiculous batch effect from the two clinics.

7.1 All cell types together, with(out) SVA

tc_all_cf_de_sva <- all_pairwise(tc_valid, filter=TRUE, model_batch="svaseq")
## This DE analysis will perform all pairwise comparisons among:
## 
##    cure failure 
##     122      62
## This analysis will include surrogate estimates from: svaseq.
## This will pre-filter the input data using normalize_expt's: TRUE argument.
## Removing 0 low-count genes (14290 remaining).
## Setting 27033 low elements to zero.
## transform_counts: Found 27033 values equal to 0, adding 1 to the matrix.
## Finished running DE analyses, collecting outputs.
## Comparing analyses.
tc_all_cf_table_sva <- combine_de_tables(
    tc_all_cf_de_sva, keepers=t_cf_contrast,
    rda=glue::glue("rda/tc_valid_cf_table_sva-v{ver}.rda"),
    excel=glue::glue("analyses/3_cali_and_tumaco/cf/All_Samples/tc_valid_cf_table_sva-v{ver}.xlsx"))
## Starting combine_extracted_plots() with do_inverse as: FALSE.
## Plotting volcano plot of the DE results of failure_vs_cure according to the columns: logFC and adj.P.Val using the expressionset colors.
## Plotting volcano plot of the DE results of failure_vs_cure according to the columns: logFC and FDR using the expressionset colors.
## Saving de result as tc_valid_cf_table_sva-v202212 to rda/tc_valid_cf_table_sva-v202212.rda.
tc_all_cf_sig_sva <- extract_significant_genes(
    tc_all_cf_table_sva,
    excel=glue::glue("analyses/3_cali_and_tumaco/cf/All_Samples/tc_valid_cf_sig_sva-v{ver}.xlsx"))
## Plotting volcano plot of the DE results of failure_vs_cure according to the columns: logFC and FDR using the expressionset colors.
## Plotting volcano plot of the DE results of failure_vs_cure according to the columns: logFC and adj.P.Val using the expressionset colors.
tc_all_cf_de_batch <- all_pairwise(tc_valid, filter=TRUE, model_batch=TRUE)
## This DE analysis will perform all pairwise comparisons among:
## 
##    cure failure 
##     122      62
## This analysis will include a batch factor in the model comprised of:
## 
##  1  2  3 
## 83 50 51
## This will pre-filter the input data using normalize_expt's: TRUE argument.
## Using limma's removeBatchEffect to visualize with(out) batch inclusion.
## Finished running DE analyses, collecting outputs.
## Comparing analyses.
tc_all_cf_table_batch <- combine_de_tables(
    tc_all_cf_de_batch,
    keepers=t_cf_contrast,
    rda=glue::glue("rda/tc_valid_cf_table_batch-v{ver}.rda"),
    excel=glue::glue("analyses/3_cali_and_tumaco/cf/All_Samples/tc_valid_cf_table_batch-v{ver}.xlsx"))
## Starting combine_extracted_plots() with do_inverse as: FALSE.
## Plotting volcano plot of the DE results of failure_vs_cure according to the columns: logFC and adj.P.Val using the expressionset colors.
## Plotting volcano plot of the DE results of failure_vs_cure according to the columns: logFC and FDR using the expressionset colors.
## Saving de result as tc_valid_cf_table_batch-v202212 to rda/tc_valid_cf_table_batch-v202212.rda.
tc_all_cf_sig_batch <- extract_significant_genes(
    tc_all_cf_table_batch,
    excel=glue::glue("analyses/3_cali_and_tumaco/cf/All_Samples/tc_valid_cf_sig_batch-v{ver}.xlsx"))
## Plotting volcano plot of the DE results of failure_vs_cure according to the columns: logFC and FDR using the expressionset colors.
## Plotting volcano plot of the DE results of failure_vs_cure according to the columns: logFC and adj.P.Val using the expressionset colors.

7.2 Biopsies, with(out) SVA

In the following block, we repeat the same question, but using only the biopsy samples from both clinics.

tc_biopsies_cf <- set_expt_conditions(tc_biopsies, fact="finaloutcome")
tc_biopsies_cf_de_sva <- all_pairwise(tc_biopsies_cf, filter=TRUE, model_batch="svaseq")
## This DE analysis will perform all pairwise comparisons among:
## 
##    cure failure 
##      13       5
## This analysis will include surrogate estimates from: svaseq.
## This will pre-filter the input data using normalize_expt's: TRUE argument.
## Removing 0 low-count genes (13608 remaining).
## Setting 222 low elements to zero.
## transform_counts: Found 222 values equal to 0, adding 1 to the matrix.
## Finished running DE analyses, collecting outputs.
## Comparing analyses.
tc_biopsies_cf_table_sva <- combine_de_tables(
    tc_biopsies_cf_de_sva, keepers=t_cf_contrast,
    rda=glue::glue("rda/tc_biopsies_cf_table_sva-v{ver}.rda"),
    excel=glue::glue("analyses/3_cali_and_tumaco/cf/Biopsies/tc_biopsies_cf_table_sva-v{ver}.xlsx"))
## Starting combine_extracted_plots() with do_inverse as: FALSE.
## Plotting volcano plot of the DE results of failure_vs_cure according to the columns: logFC and adj.P.Val using the expressionset colors.
## Plotting volcano plot of the DE results of failure_vs_cure according to the columns: logFC and FDR using the expressionset colors.
## Saving de result as tc_biopsies_cf_table_sva-v202212 to rda/tc_biopsies_cf_table_sva-v202212.rda.
tc_biopsies_cf_sig_sva <- extract_significant_genes(
    tc_biopsies_cf_table_sva,
    excel=glue::glue("analyses/3_cali_and_tumaco/cf/All_Samples/tc_biopsies_cf_sig_sva-v{ver}.xlsx"))
## Plotting volcano plot of the DE results of failure_vs_cure according to the columns: logFC and FDR using the expressionset colors.
## Plotting volcano plot of the DE results of failure_vs_cure according to the columns: logFC and adj.P.Val using the expressionset colors.
tc_biopsies_cf_de_batch <- all_pairwise(tc_biopsies_cf, filter=TRUE, model_batch=TRUE)
## This DE analysis will perform all pairwise comparisons among:
## 
##    cure failure 
##      13       5
## This analysis will include a batch factor in the model comprised of:
## 
##  1 
## 18
## This will pre-filter the input data using normalize_expt's: TRUE argument.
## Using limma's removeBatchEffect to visualize with(out) batch inclusion.
## Finished running DE analyses, collecting outputs.
## Comparing analyses.
tc_biopsies_cf_table_batch <- combine_de_tables(
    tc_biopsies_cf_de_batch, keepers=t_cf_contrast,
    rda=glue::glue("rda/tc_biopsies_cf_table_batch-v{ver}.rda"),
    excel=glue::glue("analyses/3_cali_and_tumaco/cf/All_Samples/tc_biopsies_cf_table_batch-v{ver}.xlsx"))
## Starting combine_extracted_plots() with do_inverse as: FALSE.
## Plotting volcano plot of the DE results of failure_vs_cure according to the columns: logFC and adj.P.Val using the expressionset colors.
## Plotting volcano plot of the DE results of failure_vs_cure according to the columns: logFC and FDR using the expressionset colors.
## Saving de result as tc_biopsies_cf_table_batch-v202212 to rda/tc_biopsies_cf_table_batch-v202212.rda.
tc_biopsies_cf_sig_batch <- extract_significant_genes(
    tc_biopsies_cf_table_batch,
    excel=glue::glue("analyses/3_cali_and_tumaco/cf/All_Samples/tc_biopsies_cf_sig_batch-v{ver}.xlsx"))
## Plotting volcano plot of the DE results of failure_vs_cure according to the columns: logFC and FDR using the expressionset colors.
## Plotting volcano plot of the DE results of failure_vs_cure according to the columns: logFC and adj.P.Val using the expressionset colors.

7.3 Eosinophils, with(out) SVA

In the following block, we repeat the same question, but using only the Eosinophil samples from both clinics.

tc_eosinophils_cf <- set_expt_conditions(tc_eosinophils, fact="finaloutcome")
tc_eosinophils_cf_de_sva <- all_pairwise(tc_eosinophils_cf, filter=TRUE, model_batch="svaseq")
## This DE analysis will perform all pairwise comparisons among:
## 
##    cure failure 
##      32       9
## This analysis will include surrogate estimates from: svaseq.
## This will pre-filter the input data using normalize_expt's: TRUE argument.
## Removing 0 low-count genes (10864 remaining).
## Setting 856 low elements to zero.
## transform_counts: Found 856 values equal to 0, adding 1 to the matrix.
## Finished running DE analyses, collecting outputs.
## Comparing analyses.
tc_eosinophils_cf_table_sva <- combine_de_tables(
    tc_eosinophils_cf_de_sva, keepers=t_cf_contrast,
    rda=glue::glue("rda/tc_eosinophils_cf_table_sva-v{ver}.rda"),
    excel=glue::glue("analyses/3_cali_and_tumaco/cf/Eosinophils/tc_eosinophils_cf_table_sva-v{ver}.xlsx"))
## Starting combine_extracted_plots() with do_inverse as: FALSE.
## Plotting volcano plot of the DE results of failure_vs_cure according to the columns: logFC and adj.P.Val using the expressionset colors.
## Plotting volcano plot of the DE results of failure_vs_cure according to the columns: logFC and FDR using the expressionset colors.
## Saving de result as tc_eosinophils_cf_table_sva-v202212 to rda/tc_eosinophils_cf_table_sva-v202212.rda.
tc_eosinophils_cf_sig_sva <- extract_significant_genes(
    tc_eosinophils_cf_table_sva,
    excel=glue::glue("analyses/3_cali_and_tumaco/cf/All_Samples/tc_eosinophils_cf_sig_sva-v{ver}.xlsx"))
## Plotting volcano plot of the DE results of failure_vs_cure according to the columns: logFC and FDR using the expressionset colors.
## Plotting volcano plot of the DE results of failure_vs_cure according to the columns: logFC and adj.P.Val using the expressionset colors.
tc_eosinophils_cf_de_batch <- all_pairwise(tc_eosinophils_cf, filter=TRUE, model_batch=TRUE)
## This DE analysis will perform all pairwise comparisons among:
## 
##    cure failure 
##      32       9
## This analysis will include a batch factor in the model comprised of:
## 
##  3  2  1 
## 13 14 14
## This will pre-filter the input data using normalize_expt's: TRUE argument.
## Using limma's removeBatchEffect to visualize with(out) batch inclusion.
## Finished running DE analyses, collecting outputs.
## Comparing analyses.
tc_eosinophils_cf_table_batch <- combine_de_tables(
    tc_eosinophils_cf_de_batch, keepers=t_cf_contrast,
    rda=glue::glue("rda/tc_eosinophils_cf_table_batch-v{ver}.rda"),
    excel=glue::glue("analyses/3_cali_and_tumaco/cf/All_Samples/tc_eosinophils_cf_table_batch-v{ver}.xlsx"))
## Starting combine_extracted_plots() with do_inverse as: FALSE.
## Plotting volcano plot of the DE results of failure_vs_cure according to the columns: logFC and adj.P.Val using the expressionset colors.
## Plotting volcano plot of the DE results of failure_vs_cure according to the columns: logFC and FDR using the expressionset colors.
## Saving de result as tc_eosinophils_cf_table_batch-v202212 to rda/tc_eosinophils_cf_table_batch-v202212.rda.
tc_eosinophils_cf_sig_batch <- extract_significant_genes(
    tc_eosinophils_cf_table_batch,
    excel=glue::glue("analyses/3_cali_and_tumaco/cf/All_Samples/tc_eosinophils_cf_sig_batch-v{ver}.xlsx"))
## Plotting volcano plot of the DE results of failure_vs_cure according to the columns: logFC and FDR using the expressionset colors.
## Plotting volcano plot of the DE results of failure_vs_cure according to the columns: logFC and adj.P.Val using the expressionset colors.

7.4 Monocytes, with(out) SVA

Repeat yet again, this time with the monocyte samples. The idea is to see if there is a cell type which is particularly good (or bad) at discriminating the two clinics.

tc_monocytes_cf <- set_expt_conditions(tc_monocytes, fact="finaloutcome")
tc_monocytes_cf_de_sva <- all_pairwise(tc_monocytes_cf, filter=TRUE, model_batch="svaseq")
## This DE analysis will perform all pairwise comparisons among:
## 
##    cure failure 
##      39      24
## This analysis will include surrogate estimates from: svaseq.
## This will pre-filter the input data using normalize_expt's: TRUE argument.
## Removing 0 low-count genes (11104 remaining).
## Setting 1326 low elements to zero.
## transform_counts: Found 1326 values equal to 0, adding 1 to the matrix.
## Finished running DE analyses, collecting outputs.
## Comparing analyses.
tc_monocytes_cf_table_sva <- combine_de_tables(
    tc_monocytes_cf_de_sva, keepers=t_cf_contrast,
    rda=glue::glue("rda/tc_monocytes_cf_table_sva-v{ver}.rda"),
    excel=glue::glue("analyses/3_cali_and_tumaco/cf/Monocytes/tc_monocytes_cf_table_sva-v{ver}.xlsx"))
## Starting combine_extracted_plots() with do_inverse as: FALSE.
## Plotting volcano plot of the DE results of failure_vs_cure according to the columns: logFC and adj.P.Val using the expressionset colors.
## Plotting volcano plot of the DE results of failure_vs_cure according to the columns: logFC and FDR using the expressionset colors.
## Saving de result as tc_monocytes_cf_table_sva-v202212 to rda/tc_monocytes_cf_table_sva-v202212.rda.
tc_monocytes_cf_sig_sva <- extract_significant_genes(
    tc_monocytes_cf_table_sva,
    excel=glue::glue("analyses/3_cali_and_tumaco/cf/All_Samples/tc_monocytes_cf_sig_sva-v{ver}.xlsx"))
## Plotting volcano plot of the DE results of failure_vs_cure according to the columns: logFC and FDR using the expressionset colors.
## Plotting volcano plot of the DE results of failure_vs_cure according to the columns: logFC and adj.P.Val using the expressionset colors.
tc_monocytes_cf_de_batch <- all_pairwise(tc_monocytes_cf, filter=TRUE, model_batch=TRUE)
## This DE analysis will perform all pairwise comparisons among:
## 
##    cure failure 
##      39      24
## This analysis will include a batch factor in the model comprised of:
## 
##  3  2  1 
## 19 18 26
## This will pre-filter the input data using normalize_expt's: TRUE argument.
## Using limma's removeBatchEffect to visualize with(out) batch inclusion.
## Finished running DE analyses, collecting outputs.
## Comparing analyses.
tc_monocytes_cf_table_batch <- combine_de_tables(
    tc_monocytes_cf_de_batch, keepers=t_cf_contrast,
    rda=glue::glue("rda/tc_monocytes_cf_table_batch-v{ver}.rda"),
    excel=glue::glue("analyses/3_cali_and_tumaco/cf/All_Samples/tc_monocytes_cf_table_batch-v{ver}.xlsx"))
## Starting combine_extracted_plots() with do_inverse as: FALSE.
## Plotting volcano plot of the DE results of failure_vs_cure according to the columns: logFC and adj.P.Val using the expressionset colors.
## Plotting volcano plot of the DE results of failure_vs_cure according to the columns: logFC and FDR using the expressionset colors.
## Saving de result as tc_monocytes_cf_table_batch-v202212 to rda/tc_monocytes_cf_table_batch-v202212.rda.
tc_monocytes_cf_sig_batch <- extract_significant_genes(
    tc_monocytes_cf_table_batch,
    excel=glue::glue("analyses/3_cali_and_tumaco/cf/All_Samples/tc_monocytes_cf_sig_batch-v{ver}.xlsx"))
## Plotting volcano plot of the DE results of failure_vs_cure according to the columns: logFC and FDR using the expressionset colors.
## Plotting volcano plot of the DE results of failure_vs_cure according to the columns: logFC and adj.P.Val using the expressionset colors.

7.5 Neutrophils, with(out) SVA

Last try, this time using the Neutrophil samples.

tc_neutrophils_cf <- set_expt_conditions(tc_neutrophils, fact="finaloutcome")
tc_neutrophils_cf_de_sva <- all_pairwise(tc_neutrophils_cf, filter=TRUE, model_batch="svaseq")
## This DE analysis will perform all pairwise comparisons among:
## 
##    cure failure 
##      38      24
## This analysis will include surrogate estimates from: svaseq.
## This will pre-filter the input data using normalize_expt's: TRUE argument.
## Removing 0 low-count genes (9242 remaining).
## Setting 1562 low elements to zero.
## transform_counts: Found 1562 values equal to 0, adding 1 to the matrix.
## Finished running DE analyses, collecting outputs.
## Comparing analyses.
tc_neutrophils_cf_table_sva <- combine_de_tables(
    tc_neutrophils_cf_de_sva, keepers=t_cf_contrast,
    rda=glue::glue("rda/tc_neutrophils_cf_table_sva-v{ver}.rda"),
    excel=glue::glue("analyses/3_cali_and_tumaco/cf/Neutrophils/tc_neutrophils_cf_table_sva-v{ver}.xlsx"))
## Starting combine_extracted_plots() with do_inverse as: FALSE.
## Plotting volcano plot of the DE results of failure_vs_cure according to the columns: logFC and adj.P.Val using the expressionset colors.
## Plotting volcano plot of the DE results of failure_vs_cure according to the columns: logFC and FDR using the expressionset colors.
## Saving de result as tc_neutrophils_cf_table_sva-v202212 to rda/tc_neutrophils_cf_table_sva-v202212.rda.
tc_neutrophils_cf_sig_sva <- extract_significant_genes(
    tc_neutrophils_cf_table_sva,
    excel=glue::glue("analyses/3_cali_and_tumaco/cf/All_Samples/tc_neutrophils_cf_sig_sva-v{ver}.xlsx"))
## Plotting volcano plot of the DE results of failure_vs_cure according to the columns: logFC and FDR using the expressionset colors.
## Plotting volcano plot of the DE results of failure_vs_cure according to the columns: logFC and adj.P.Val using the expressionset colors.
tc_neutrophils_cf_de_batch <- all_pairwise(tc_neutrophils_cf, filter=TRUE, model_batch=TRUE)
## This DE analysis will perform all pairwise comparisons among:
## 
##    cure failure 
##      38      24
## This analysis will include a batch factor in the model comprised of:
## 
##  3  2  1 
## 19 18 25
## This will pre-filter the input data using normalize_expt's: TRUE argument.
## Using limma's removeBatchEffect to visualize with(out) batch inclusion.
## Finished running DE analyses, collecting outputs.
## Comparing analyses.
tc_neutrophils_cf_table_batch <- combine_de_tables(
    tc_neutrophils_cf_de_batch, keepers=t_cf_contrast,
    rda=glue::glue("rda/tc_neutrophils_cf_table_batch-v{ver}.rda"),
    excel=glue::glue("analyses/3_cali_and_tumaco/cf/All_Samples/tc_neutrophils_cf_table_batch-v{ver}.xlsx"))
## Starting combine_extracted_plots() with do_inverse as: FALSE.
## Plotting volcano plot of the DE results of failure_vs_cure according to the columns: logFC and adj.P.Val using the expressionset colors.
## Plotting volcano plot of the DE results of failure_vs_cure according to the columns: logFC and FDR using the expressionset colors.
## Saving de result as tc_neutrophils_cf_table_batch-v202212 to rda/tc_neutrophils_cf_table_batch-v202212.rda.
tc_neutrophils_cf_sig_batch <- extract_significant_genes(
    tc_neutrophils_cf_table_batch,
    excel=glue::glue("analyses/3_cali_and_tumaco/cf/All_Samples/tc_neutrophils_cf_sig_batch-v{ver}.xlsx"))
## Plotting volcano plot of the DE results of failure_vs_cure according to the columns: logFC and FDR using the expressionset colors.
## Plotting volcano plot of the DE results of failure_vs_cure according to the columns: logFC and adj.P.Val using the expressionset colors.

8 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.

8.1 Set the xlsx output prefix

xlsx_prefix <- "analyses/4_tumaco/DE_Cure_vs_Fail"

8.2 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)
## This DE analysis will perform all pairwise comparisons among:
## 
##    cure failure 
##      67      56
## This analysis will include surrogate estimates from: svaseq.
## This will pre-filter the input data using normalize_expt's: TRUE argument.
## Removing 0 low-count genes (14149 remaining).
## Setting 17282 low elements to zero.
## transform_counts: Found 17282 values equal to 0, adding 1 to the matrix.
## Finished running DE analyses, collecting outputs.
## Comparing analyses.
t_cf_clinical_table_sva <- combine_de_tables(
    t_cf_clinical_de_sva, keepers = t_cf_contrast,
    rda=glue::glue("rda/t_clinical_cf_table_sva-v{ver}.rda"),
    excel = glue::glue("{xlsx_prefix}/All_Samples/t_clinical_cf_tables_sva-v{ver}.xlsx"))
## Starting combine_extracted_plots() with do_inverse as: FALSE.
## Plotting volcano plot of the DE results of failure_vs_cure according to the columns: logFC and adj.P.Val using the expressionset colors.
## Plotting volcano plot of the DE results of failure_vs_cure according to the columns: logFC and FDR using the expressionset colors.
## Saving de result as t_clinical_cf_table_sva-v202212 to rda/t_clinical_cf_table_sva-v202212.rda.
t_cf_clinical_sig_sva <- extract_significant_genes(
    t_cf_clinical_table_sva,
    excel = glue::glue("{xlsx_prefix}/All_Samples/t_clinical_cf_sig_sva-v{ver}.xlsx"))
## Plotting volcano plot of the DE results of failure_vs_cure according to the columns: logFC and FDR using the expressionset colors.
## Plotting volcano plot of the DE results of failure_vs_cure according to the columns: logFC and adj.P.Val using the expressionset colors.
dim(t_cf_clinical_sig_sva$deseq$ups[[1]])
## [1] 93 58
dim(t_cf_clinical_sig_sva$deseq$downs[[1]])
## [1] 183  58

8.3 gProfiler search of all 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)
## 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
## 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
## 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_up"]][["REAC_enrich"]])

8.3.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.

8.3.1.1 Cure/Fail, Tumaco Visit 1

t_cf_clinical_v1_de_sva <- all_pairwise(tv1_samples, model_batch = "svaseq", filter = TRUE)
## This DE analysis will perform all pairwise comparisons among:
## 
##    cure failure 
##      30      24
## This analysis will include surrogate estimates from: svaseq.
## This will pre-filter the input data using normalize_expt's: TRUE argument.
## Removing 0 low-count genes (14016 remaining).
## Setting 7615 low elements to zero.
## transform_counts: Found 7615 values equal to 0, adding 1 to the matrix.
## Finished running DE analyses, collecting outputs.
## Comparing analyses.
t_cf_clinical_v1_table_sva <- combine_de_tables(
    t_cf_clinical_v1_de_sva, keepers = t_cf_contrast,
    rda = glue::glue("rda/t_clinical_v1_cf_table_sva-v{ver}.rda"),
    excel = glue::glue("{xlsx_prefix}/All_Samples/t_clinical_v1_cf_tables_sva-v{ver}.xlsx"))
## Starting combine_extracted_plots() with do_inverse as: FALSE.
## Plotting volcano plot of the DE results of failure_vs_cure according to the columns: logFC and adj.P.Val using the expressionset colors.
## Plotting volcano plot of the DE results of failure_vs_cure according to the columns: logFC and FDR using the expressionset colors.
## Saving de result as t_clinical_v1_cf_table_sva-v202212 to rda/t_clinical_v1_cf_table_sva-v202212.rda.
t_cf_clinical_v1_sig_sva <- extract_significant_genes(
    t_cf_clinical_v1_table_sva,
    excel = glue::glue("{xlsx_prefix}/All_Samples/t_clinical_v1_cf_sig_sva-v{ver}.xlsx"))
## Plotting volcano plot of the DE results of failure_vs_cure according to the columns: logFC and FDR using the expressionset colors.
## Plotting volcano plot of the DE results of failure_vs_cure according to the columns: logFC and adj.P.Val using the expressionset colors.
dim(t_cf_clinical_v1_sig_sva$deseq$ups[[1]])
## [1] 28 58
dim(t_cf_clinical_v1_sig_sva$deseq$downs[[1]])
## [1] 74 58

8.3.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)
## This DE analysis will perform all pairwise comparisons among:
## 
##    cure failure 
##      20      15
## This analysis will include surrogate estimates from: svaseq.
## This will pre-filter the input data using normalize_expt's: TRUE argument.
## Removing 0 low-count genes (11559 remaining).
## Setting 2848 low elements to zero.
## transform_counts: Found 2848 values equal to 0, adding 1 to the matrix.
## Finished running DE analyses, collecting outputs.
## Comparing analyses.
t_cf_clinical_v2_table_sva <- combine_de_tables(
    t_cf_clinical_v2_de_sva, keepers = t_cf_contrast,
    rda=glue::glue("rda/t_clinical_v2_cf_table_sva-v{ver}.rda"),
    excel = glue::glue("{xlsx_prefix}/All_Samples/t_clinical_v2_cf_tables_sva-v{ver}.xlsx"))
## Starting combine_extracted_plots() with do_inverse as: FALSE.
## Plotting volcano plot of the DE results of failure_vs_cure according to the columns: logFC and adj.P.Val using the expressionset colors.
## Plotting volcano plot of the DE results of failure_vs_cure according to the columns: logFC and FDR using the expressionset colors.
## Saving de result as t_clinical_v2_cf_table_sva-v202212 to rda/t_clinical_v2_cf_table_sva-v202212.rda.
t_cf_clinical_v2_sig_sva <- extract_significant_genes(
    t_cf_clinical_v2_table_sva,
    excel = glue::glue("{xlsx_prefix}/All_Samples/t_clinical_v2_cf_sig_sva-v{ver}.xlsx"))
## Plotting volcano plot of the DE results of failure_vs_cure according to the columns: logFC and FDR using the expressionset colors.
## Plotting volcano plot of the DE results of failure_vs_cure according to the columns: logFC and adj.P.Val using the expressionset colors.
dim(t_cf_clinical_v2_sig_sva$deseq$ups[[1]])
## [1] 51 58
dim(t_cf_clinical_v2_sig_sva$deseq$downs[[1]])
## [1] 15 58

8.3.1.3 Cure/Fail, Tumaco Visit 3

t_cf_clinical_v3_de_sva <- all_pairwise(tv3_samples, model_batch = "svaseq", filter = TRUE)
## This DE analysis will perform all pairwise comparisons among:
## 
##    cure failure 
##      17      17
## This analysis will include surrogate estimates from: svaseq.
## This will pre-filter the input data using normalize_expt's: TRUE argument.
## Removing 0 low-count genes (11449 remaining).
## Setting 1878 low elements to zero.
## transform_counts: Found 1878 values equal to 0, adding 1 to the matrix.
## Finished running DE analyses, collecting outputs.
## Comparing analyses.
t_cf_clinical_v3_table_sva <- combine_de_tables(
    t_cf_clinical_v3_de_sva, keepers = t_cf_contrast,
    rda=glue::glue("rda/t_clinical_v3_cf_table_sva-v{ver}.rda"),
    excel = glue::glue("{xlsx_prefix}/All_Samples/t_clinical_v3_cf_tables_sva-v{ver}.xlsx"))
## Starting combine_extracted_plots() with do_inverse as: FALSE.
## Plotting volcano plot of the DE results of failure_vs_cure according to the columns: logFC and adj.P.Val using the expressionset colors.
## Plotting volcano plot of the DE results of failure_vs_cure according to the columns: logFC and FDR using the expressionset colors.
## Saving de result as t_clinical_v3_cf_table_sva-v202212 to rda/t_clinical_v3_cf_table_sva-v202212.rda.
t_cf_clinical_v3_sig_sva <- extract_significant_genes(
    t_cf_clinical_v3_table_sva,
    excel = glue::glue("{xlsx_prefix}/All_Samples/t_clinical_v3_cf_sig_sva-v{ver}.xlsx"))
## Plotting volcano plot of the DE results of failure_vs_cure according to the columns: logFC and FDR using the expressionset colors.
## Plotting volcano plot of the DE results of failure_vs_cure according to the columns: logFC and adj.P.Val using the expressionset colors.
dim(t_cf_clinical_v3_sig_sva$deseq$ups[[1]])
## [1] 120  58
dim(t_cf_clinical_v3_sig_sva$deseq$downs[[1]])
## [1] 62 58

8.3.1.4 Visit 1 gProfiler searches

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)
## 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
## 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
## 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"]])

8.3.1.5 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)
## 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
## 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"]])

8.3.1.6 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)
## 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
## 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"]])

8.3.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)
## This DE analysis will perform all pairwise comparisons among:
## 
##    cure failure 
##      58      51
## This analysis will include surrogate estimates from: svaseq.
## This will pre-filter the input data using normalize_expt's: TRUE argument.
## Removing 0 low-count genes (11907 remaining).
## Setting 9578 low elements to zero.
## transform_counts: Found 9578 values equal to 0, adding 1 to the matrix.
## Finished running DE analyses, collecting outputs.
## Comparing analyses.
t_cf_clinical_nobiop_table_sva <- combine_de_tables(
    t_cf_clinical_nobiop_de_sva, keepers = t_cf_contrast,
    rda=glue::glue("rda/t_clinical_nobiop_cf_table_sva-v{ver}.rda"),
    excel = glue::glue("{xlsx_prefix}/No_Biopsies/t_clinical_nobiop_cf_tables_sva-v{ver}.xlsx"))
## Starting combine_extracted_plots() with do_inverse as: FALSE.
## Plotting volcano plot of the DE results of failure_vs_cure according to the columns: logFC and adj.P.Val using the expressionset colors.
## Plotting volcano plot of the DE results of failure_vs_cure according to the columns: logFC and FDR using the expressionset colors.
## Saving de result as t_clinical_nobiop_cf_table_sva-v202212 to rda/t_clinical_nobiop_cf_table_sva-v202212.rda.
t_cf_clinical_nobiop_sig_sva <- extract_significant_genes(
    t_cf_clinical_nobiop_table_sva,
    excel = glue::glue("{xlsx_prefix}/No_Biopsies/t_clinical_nobiop_cf_sig_sva-v{ver}.xlsx"))
## Plotting volcano plot of the DE results of failure_vs_cure according to the columns: logFC and FDR using the expressionset colors.
## Plotting volcano plot of the DE results of failure_vs_cure according to the columns: logFC and adj.P.Val using the expressionset colors.
dim(t_cf_clinical_nobiop_sig_sva$deseq$ups[[1]])
## [1] 137  58
dim(t_cf_clinical_nobiop_sig_sva$deseq$downs[[1]])
## [1] 73 58

8.3.2.1 gProfiler: Clinical no 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)
## 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
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"]])

8.3.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.

8.3.3.1 Cure/Fail, Biopsies

t_cf_biopsy_de_sva <- all_pairwise(t_biopsies, model_batch = "svaseq", filter = TRUE)
## This DE analysis will perform all pairwise comparisons among:
## 
##    Tumaco_cure Tumaco_failure 
##              9              5
## This analysis will include surrogate estimates from: svaseq.
## This will pre-filter the input data using normalize_expt's: TRUE argument.
## Removing 0 low-count genes (13506 remaining).
## Setting 145 low elements to zero.
## transform_counts: Found 145 values equal to 0, adding 1 to the matrix.
## Finished running DE analyses, collecting outputs.
## Comparing analyses.
t_cf_biopsy_table_sva <- combine_de_tables(
    t_cf_biopsy_de_sva, keepers = cf_contrast,
    rda=glue::glue("rda/t_biopsy_cf_table_sva-v{ver}.rda"),
    excel = glue::glue("{xlsx_prefix}/Biopsies/t_biopsy_cf_tables_sva-v{ver}.xlsx"))
## Starting combine_extracted_plots() with do_inverse as: FALSE.
## Plotting volcano plot of the DE results of Tumacofailure_vs_Tumacocure according to the columns: logFC and adj.P.Val using the expressionset colors.
## Plotting volcano plot of the DE results of Tumacofailure_vs_Tumacocure according to the columns: logFC and FDR using the expressionset colors.
## Saving de result as t_biopsy_cf_table_sva-v202212 to rda/t_biopsy_cf_table_sva-v202212.rda.
t_cf_biopsy_sig_sva <- extract_significant_genes(
    t_cf_biopsy_table_sva,
    excel = glue::glue("{xlsx_prefix}/Biopsies/t_cf_biopsy_sig_sva-v{ver}.xlsx"))
## Plotting volcano plot of the DE results of Tumacofailure_vs_Tumacocure according to the columns: logFC and FDR using the expressionset colors.
## Plotting volcano plot of the DE results of Tumacofailure_vs_Tumacocure according to the columns: logFC and adj.P.Val using the expressionset colors.
dim(t_cf_biopsy_sig_sva$deseq$ups[[1]])
## [1] 17 58
dim(t_cf_biopsy_sig_sva$deseq$downs[[1]])
## [1] 11 58

8.3.3.2 gProfiler: Biopsies

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

t_cf_biopsy_sig_sva_gp <- all_gprofiler(t_cf_biopsy_sig_sva)
## 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
## 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
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"]])

8.3.3.3 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)
## This DE analysis will perform all pairwise comparisons among:
## 
##    Tumaco_cure Tumaco_failure 
##             21             21
## This analysis will include surrogate estimates from: svaseq.
## This will pre-filter the input data using normalize_expt's: TRUE argument.
## Removing 0 low-count genes (10859 remaining).
## Setting 730 low elements to zero.
## transform_counts: Found 730 values equal to 0, adding 1 to the matrix.
## Finished running DE analyses, collecting outputs.
## Comparing analyses.
t_cf_monocyte_tables_sva <- combine_de_tables(
    t_cf_monocyte_de_sva, keepers = cf_contrast,
    rda=glue::glue("rda/t_monocyte_cf_table_sva-v{ver}.rda"),
    excel = glue::glue("{xlsx_prefix}/Monocytes/t_monocyte_cf_tables_sva-v{ver}.xlsx"))
## Starting combine_extracted_plots() with do_inverse as: FALSE.
## Plotting volcano plot of the DE results of Tumacofailure_vs_Tumacocure according to the columns: logFC and adj.P.Val using the expressionset colors.
## Plotting volcano plot of the DE results of Tumacofailure_vs_Tumacocure according to the columns: logFC and FDR using the expressionset colors.
## Saving de result as t_monocyte_cf_table_sva-v202212 to rda/t_monocyte_cf_table_sva-v202212.rda.
t_cf_monocyte_sig_sva <- extract_significant_genes(
    t_cf_monocyte_tables_sva,
    excel = glue::glue("{xlsx_prefix}/Monocytes/t_monocyte_cf_sig_sva-v{ver}.xlsx"))
## Plotting volcano plot of the DE results of Tumacofailure_vs_Tumacocure according to the columns: logFC and FDR using the expressionset colors.
## Plotting volcano plot of the DE results of Tumacofailure_vs_Tumacocure according to the columns: logFC and adj.P.Val using the expressionset colors.
dim(t_cf_monocyte_sig_sva$deseq$ups[[1]])
## [1] 60 58
dim(t_cf_monocyte_sig_sva$deseq$downs[[1]])
## [1] 53 58
t_cf_monocyte_de_batchvisit <- all_pairwise(t_monocytes, model_batch = TRUE, filter = TRUE)
## This DE analysis will perform all pairwise comparisons among:
## 
##    Tumaco_cure Tumaco_failure 
##             21             21
## This analysis will include a batch factor in the model comprised of:
## 
##  3  2  1 
## 13 13 16
## This will pre-filter the input data using normalize_expt's: TRUE argument.
## Using limma's removeBatchEffect to visualize with(out) batch inclusion.
## Finished running DE analyses, collecting outputs.
## Comparing analyses.
t_cf_monocyte_tables_batchvisit <- combine_de_tables(
    t_cf_monocyte_de_batchvisit, keepers = cf_contrast,
    rda=glue::glue("rda/t_monocyte_cf_table_batchvisit-v{ver}.rda"),
    excel = glue::glue("{xlsx_prefix}/Monocytes/t_monocyte_cf_tables_batchvisit-v{ver}.xlsx"))
## Starting combine_extracted_plots() with do_inverse as: FALSE.
## Plotting volcano plot of the DE results of Tumacofailure_vs_Tumacocure according to the columns: logFC and adj.P.Val using the expressionset colors.
## Plotting volcano plot of the DE results of Tumacofailure_vs_Tumacocure according to the columns: logFC and FDR using the expressionset colors.
## Saving de result as t_monocyte_cf_table_batchvisit-v202212 to rda/t_monocyte_cf_table_batchvisit-v202212.rda.
t_cf_monocyte_sig_batchvisit <- extract_significant_genes(
    t_cf_monocyte_tables_batchvisit,
    excel = glue::glue("{xlsx_prefix}/Monocytes/t_monocyte_cf_sig_batchvisit-v{ver}.xlsx"))
## Plotting volcano plot of the DE results of Tumacofailure_vs_Tumacocure according to the columns: logFC and FDR using the expressionset colors.
## Plotting volcano plot of the DE results of Tumacofailure_vs_Tumacocure according to the columns: logFC and adj.P.Val using the expressionset colors.
dim(t_cf_monocyte_sig_batchvisit$deseq$ups[[1]])
## [1] 43 58
dim(t_cf_monocyte_sig_batchvisit$deseq$downs[[1]])
## [1] 93 58

8.3.3.4 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)
## 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
## No results to show
## Please make sure that the organism is correct or set significant = FALSE
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)
## 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
enrichplot::dotplot(t_cf_monocyte_sig_batch_gp[["outcome_up"]][["GO_enrich"]])

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

8.3.4 Individual visits, Monocytes

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

8.3.4.1 Visit 1

t_cf_monocyte_v1_de_sva <- all_pairwise(tv1_monocytes, model_batch = "svaseq", filter = TRUE)
## This DE analysis will perform all pairwise comparisons among:
## 
##    Tumaco_cure Tumaco_failure 
##              8              8
## This analysis will include surrogate estimates from: svaseq.
## This will pre-filter the input data using normalize_expt's: TRUE argument.
## Removing 0 low-count genes (10479 remaining).
## Setting 187 low elements to zero.
## transform_counts: Found 187 values equal to 0, adding 1 to the matrix.
## Finished running DE analyses, collecting outputs.
## Comparing analyses.
t_cf_monocyte_v1_tables_sva <- combine_de_tables(
    t_cf_monocyte_v1_de_sva, keepers = cf_contrast,
    rda=glue::glue("rda/t_monocyte_v1_cf_table_sva-v{ver}.rda"),
    excel = glue::glue("{xlsx_prefix}/Monocytes/t_monocyte_v1_cf_tables_sva-v{ver}.xlsx"))
## Starting combine_extracted_plots() with do_inverse as: FALSE.
## Plotting volcano plot of the DE results of Tumacofailure_vs_Tumacocure according to the columns: logFC and adj.P.Val using the expressionset colors.
## Plotting volcano plot of the DE results of Tumacofailure_vs_Tumacocure according to the columns: logFC and FDR using the expressionset colors.
## Saving de result as t_monocyte_v1_cf_table_sva-v202212 to rda/t_monocyte_v1_cf_table_sva-v202212.rda.
t_cf_monocyte_v1_sig_sva <- extract_significant_genes(
    t_cf_monocyte_v1_tables_sva,
    excel = glue::glue("{xlsx_prefix}/Monocytes/t_monocyte_v1_cf_sig_sva-v{ver}.xlsx"))
## Plotting volcano plot of the DE results of Tumacofailure_vs_Tumacocure according to the columns: logFC and FDR using the expressionset colors.
## Plotting volcano plot of the DE results of Tumacofailure_vs_Tumacocure according to the columns: logFC and adj.P.Val using the expressionset colors.
dim(t_cf_monocyte_v1_sig_sva$deseq$ups[[1]])
## [1] 14 58
dim(t_cf_monocyte_v1_sig_sva$deseq$downs[[1]])
## [1] 52 58

8.3.4.2 Visit 2

t_cf_monocyte_v2_de_sva <- all_pairwise(tv2_monocytes, model_batch = "svaseq", filter = TRUE)
## This DE analysis will perform all pairwise comparisons among:
## 
##    Tumaco_cure Tumaco_failure 
##              7              6
## This analysis will include surrogate estimates from: svaseq.
## This will pre-filter the input data using normalize_expt's: TRUE argument.
## Removing 0 low-count genes (10520 remaining).
## Setting 115 low elements to zero.
## transform_counts: Found 115 values equal to 0, adding 1 to the matrix.
## Finished running DE analyses, collecting outputs.
## Comparing analyses.
t_cf_monocyte_v2_tables_sva <- combine_de_tables(
    t_cf_monocyte_v2_de_sva, keepers = cf_contrast,
    rda=glue::glue("rda/t_monocyte_v2_cf_table_sva-v{ver}.rda"),
    excel = glue::glue("{xlsx_prefix}/Monocytes/t_monocyte_v2_cf_tables_sva-v{ver}.xlsx"))
## Starting combine_extracted_plots() with do_inverse as: FALSE.
## Plotting volcano plot of the DE results of Tumacofailure_vs_Tumacocure according to the columns: logFC and adj.P.Val using the expressionset colors.
## Plotting volcano plot of the DE results of Tumacofailure_vs_Tumacocure according to the columns: logFC and FDR using the expressionset colors.
## Saving de result as t_monocyte_v2_cf_table_sva-v202212 to rda/t_monocyte_v2_cf_table_sva-v202212.rda.
t_cf_monocyte_v2_sig_sva <- extract_significant_genes(
    t_cf_monocyte_v2_tables_sva,
    excel = glue::glue("{xlsx_prefix}/Monocytes/t_monocyte_v2_cf_sig_sva-v{ver}.xlsx"))
## Plotting volcano plot of the DE results of Tumacofailure_vs_Tumacocure according to the columns: logFC and FDR using the expressionset colors.
## Plotting volcano plot of the DE results of Tumacofailure_vs_Tumacocure according to the columns: logFC and adj.P.Val using the expressionset colors.
dim(t_cf_monocyte_v2_sig_sva$deseq$ups[[1]])
## [1]  0 58
dim(t_cf_monocyte_v2_sig_sva$deseq$downs[[1]])
## [1]  1 58

8.3.4.3 Visit 3

t_cf_monocyte_v3_de_sva <- all_pairwise(tv3_monocytes, model_batch = "svaseq", filter = TRUE)
## This DE analysis will perform all pairwise comparisons among:
## 
##    Tumaco_cure Tumaco_failure 
##              6              7
## This analysis will include surrogate estimates from: svaseq.
## This will pre-filter the input data using normalize_expt's: TRUE argument.
## Removing 0 low-count genes (10374 remaining).
## Setting 55 low elements to zero.
## transform_counts: Found 55 values equal to 0, adding 1 to the matrix.
## Finished running DE analyses, collecting outputs.
## Comparing analyses.
t_cf_monocyte_v3_tables_sva <- combine_de_tables(
    t_cf_monocyte_v3_de_sva, keepers = cf_contrast,
    rda=glue::glue("rda/t_monocyte_v3_cf_table_sva-v{ver}.rda"),
    excel = glue::glue("{xlsx_prefix}/Monocytes/t_monocyte_v3_cf_tables_sva-v{ver}.xlsx"))
## Starting combine_extracted_plots() with do_inverse as: FALSE.
## Plotting volcano plot of the DE results of Tumacofailure_vs_Tumacocure according to the columns: logFC and adj.P.Val using the expressionset colors.
## Plotting volcano plot of the DE results of Tumacofailure_vs_Tumacocure according to the columns: logFC and FDR using the expressionset colors.
## Saving de result as t_monocyte_v3_cf_table_sva-v202212 to rda/t_monocyte_v3_cf_table_sva-v202212.rda.
t_cf_monocyte_v3_sig_sva <- extract_significant_genes(
    t_cf_monocyte_v3_tables_sva,
    excel = glue::glue("{xlsx_prefix}/Monocytes/t_monocyte_v3_cf_sig_sva-v{ver}.xlsx"))
## Plotting volcano plot of the DE results of Tumacofailure_vs_Tumacocure according to the columns: logFC and FDR using the expressionset colors.
## Plotting volcano plot of the DE results of Tumacofailure_vs_Tumacocure according to the columns: logFC and adj.P.Val using the expressionset colors.
dim(t_cf_monocyte_v3_sig_sva$deseq$ups[[1]])
## [1]  0 58
dim(t_cf_monocyte_v3_sig_sva$deseq$downs[[1]])
## [1]  4 58

8.3.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
## $aucc
## [1] 0.6943
## 
## $cor
## 
##  Pearson's product-moment correlation
## 
## data:  tbl[[lx]] and tbl[[ly]]
## t = 180, df = 10857, p-value <2e-16
## alternative hypothesis: true correlation is not equal to 0
## 95 percent confidence interval:
##  0.8611 0.8705
## sample estimates:
##    cor 
## 0.8659 
## 
## 
## $plot

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 = 180, df = 10857, p-value <2e-16
## alternative hypothesis: true correlation is not equal to 0
## 95 percent confidence interval:
##  0.8611 0.8705
## sample estimates:
##    cor 
## 0.8659
8.3.4.4.1 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)
## 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
## 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
enrichplot::dotplot(t_cf_monocyte_v1_sig_sva_gp[["outcome_down"]][["GO_enrich"]])

8.3.4.4.2 gProfiler: Monocytes by visit, V2

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

8.3.4.4.3 gProfiler: Monocytes by visit, V3

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

8.3.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)
## This DE analysis will perform all pairwise comparisons among:
## 
##    Tumaco_cure Tumaco_failure 
##             20             21
## This analysis will include surrogate estimates from: svaseq.
## This will pre-filter the input data using normalize_expt's: TRUE argument.
## Removing 0 low-count genes (9099 remaining).
## Setting 750 low elements to zero.
## transform_counts: Found 750 values equal to 0, adding 1 to the matrix.
## Finished running DE analyses, collecting outputs.
## Comparing analyses.
t_cf_neutrophil_tables_sva <- combine_de_tables(
    t_cf_neutrophil_de_sva, keepers = cf_contrast,
    rda=glue::glue("rda/t_neutrophil_cf_table_sva-v{ver}.rda"),
    excel = glue::glue("{xlsx_prefix}/Neutrophils/t_neutrophil_cf_tables_sva-v{ver}.xlsx"))
## Starting combine_extracted_plots() with do_inverse as: FALSE.
## Plotting volcano plot of the DE results of Tumacofailure_vs_Tumacocure according to the columns: logFC and adj.P.Val using the expressionset colors.
## Plotting volcano plot of the DE results of Tumacofailure_vs_Tumacocure according to the columns: logFC and FDR using the expressionset colors.
## Saving de result as t_neutrophil_cf_table_sva-v202212 to rda/t_neutrophil_cf_table_sva-v202212.rda.
t_cf_neutrophil_sig_sva <- extract_significant_genes(
    t_cf_neutrophil_tables_sva,
    excel = glue::glue("{xlsx_prefix}/Neutrophils/t_neutrophil_cf_sig_sva-v{ver}.xlsx"))
## Plotting volcano plot of the DE results of Tumacofailure_vs_Tumacocure according to the columns: logFC and FDR using the expressionset colors.
## Plotting volcano plot of the DE results of Tumacofailure_vs_Tumacocure according to the columns: logFC and adj.P.Val using the expressionset colors.
dim(t_cf_neutrophil_sig_sva$deseq$ups[[1]])
## [1] 84 58
dim(t_cf_neutrophil_sig_sva$deseq$downs[[1]])
## [1] 29 58
t_cf_neutrophil_de_batchvisit <- all_pairwise(t_neutrophils, model_batch = TRUE, filter = TRUE)
## This DE analysis will perform all pairwise comparisons among:
## 
##    Tumaco_cure Tumaco_failure 
##             20             21
## This analysis will include a batch factor in the model comprised of:
## 
##  3  2  1 
## 12 13 16
## This will pre-filter the input data using normalize_expt's: TRUE argument.
## Using limma's removeBatchEffect to visualize with(out) batch inclusion.
## Finished running DE analyses, collecting outputs.
## Comparing analyses.
t_cf_neutrophil_tables_batchvisit <- combine_de_tables(
    t_cf_neutrophil_de_batchvisit, keepers = cf_contrast,
    rda=glue::glue("rda/t_neutrophil_cf_table_batchvisit-v{ver}.rda"),
    excel = glue::glue("{xlsx_prefix}/Neutrophils/t_neutrophil_cf_tables_batchvisit-v{ver}.xlsx"))
## Starting combine_extracted_plots() with do_inverse as: FALSE.
## Plotting volcano plot of the DE results of Tumacofailure_vs_Tumacocure according to the columns: logFC and adj.P.Val using the expressionset colors.
## Plotting volcano plot of the DE results of Tumacofailure_vs_Tumacocure according to the columns: logFC and FDR using the expressionset colors.
## Saving de result as t_neutrophil_cf_table_batchvisit-v202212 to rda/t_neutrophil_cf_table_batchvisit-v202212.rda.
t_cf_neutrophil_sig_batchvisit <- extract_significant_genes(
    t_cf_neutrophil_tables_batchvisit,
    excel = glue::glue("{xlsx_prefix}/Neutrophils/t_neutrophil_cf_sig_batchvisit-v{ver}.xlsx"))
## Plotting volcano plot of the DE results of Tumacofailure_vs_Tumacocure according to the columns: logFC and FDR using the expressionset colors.
## Plotting volcano plot of the DE results of Tumacofailure_vs_Tumacocure according to the columns: logFC and adj.P.Val using the expressionset colors.
dim(t_cf_neutrophil_sig_batchvisit$deseq$ups[[1]])
## [1] 92 58
dim(t_cf_neutrophil_sig_batchvisit$deseq$downs[[1]])
## [1] 47 58

8.3.5.1 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)
## 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
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"]])

8.3.5.2 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)

t_cf_neutrophil_visits_de_sva <- all_pairwise(t_neutrophil_visitcf, model_batch = "svaseq",
                                              filter = TRUE)
## This DE analysis will perform all pairwise comparisons among:
## 
##    v1cure v1failure    v2cure v2failure    v3cure v3failure 
##         8         8         7         6         5         7
## This analysis will include surrogate estimates from: svaseq.
## This will pre-filter the input data using normalize_expt's: TRUE argument.
## Removing 0 low-count genes (9099 remaining).
## Setting 686 low elements to zero.
## transform_counts: Found 686 values equal to 0, adding 1 to the matrix.
## Finished running DE analyses, collecting outputs.
## Comparing analyses.

t_cf_neutrophil_visits_tables_sva <- combine_de_tables(
    t_cf_neutrophil_visits_de_sva, keepers = visitcf_contrasts,
    rda=glue::glue("rda/t_neutrophil_visitcf_table_sva-v{ver}.rda"),
    excel = glue::glue("{xlsx_prefix}/Neutrophils/t_neutrophil_visitcf_tables_sva-v{ver}.xlsx"))
## Starting combine_extracted_plots() with do_inverse as: FALSE.
## Plotting volcano plot of the DE results of v1failure_vs_v1cure according to the columns: logFC and adj.P.Val using the expressionset colors.
## Plotting volcano plot of the DE results of v1failure_vs_v1cure according to the columns: logFC and FDR using the expressionset colors.
## Starting combine_extracted_plots() with do_inverse as: FALSE.
## Plotting volcano plot of the DE results of v2failure_vs_v2cure according to the columns: logFC and adj.P.Val using the expressionset colors.
## Plotting volcano plot of the DE results of v2failure_vs_v2cure according to the columns: logFC and FDR using the expressionset colors.
## Starting combine_extracted_plots() with do_inverse as: FALSE.
## Plotting volcano plot of the DE results of v3failure_vs_v3cure according to the columns: logFC and adj.P.Val using the expressionset colors.
## Plotting volcano plot of the DE results of v3failure_vs_v3cure according to the columns: logFC and FDR using the expressionset colors.
## Saving de result as t_neutrophil_visitcf_table_sva-v202212 to rda/t_neutrophil_visitcf_table_sva-v202212.rda.
t_cf_neutrophil_visits_sig_sva <- extract_significant_genes(
    t_cf_neutrophil_visits_tables_sva,
    excel = glue::glue("{xlsx_prefix}/Neutrophils/t_neutrophil_visitcf_sig_sva-v{ver}.xlsx"))
## Plotting volcano plot of the DE results of v1failure_vs_v1cure according to the columns: logFC and FDR using the expressionset colors.
## Plotting volcano plot of the DE results of v2failure_vs_v2cure according to the columns: logFC and FDR using the expressionset colors.
## Plotting volcano plot of the DE results of v3failure_vs_v3cure according to the columns: logFC and FDR using the expressionset colors.
## Plotting volcano plot of the DE results of v1failure_vs_v1cure according to the columns: logFC and adj.P.Val using the expressionset colors.
## Plotting volcano plot of the DE results of v2failure_vs_v2cure according to the columns: logFC and adj.P.Val using the expressionset colors.
## Plotting volcano plot of the DE results of v3failure_vs_v3cure according to the columns: logFC and adj.P.Val using the expressionset colors.
dim(t_cf_neutrophil_visits_sig_sva$deseq$ups[[1]])
## [1] 12 47
dim(t_cf_neutrophil_visits_sig_sva$deseq$downs[[1]])
## [1]  6 47
t_cf_neutrophil_v1_de_sva <- all_pairwise(tv1_neutrophils, model_batch = "svaseq", filter = TRUE)
## This DE analysis will perform all pairwise comparisons among:
## 
##    Tumaco_cure Tumaco_failure 
##              8              8
## This analysis will include surrogate estimates from: svaseq.
## This will pre-filter the input data using normalize_expt's: TRUE argument.
## Removing 0 low-count genes (8715 remaining).
## Setting 145 low elements to zero.
## transform_counts: Found 145 values equal to 0, adding 1 to the matrix.
## Finished running DE analyses, collecting outputs.
## Comparing analyses.
t_cf_neutrophil_v1_tables_sva <- combine_de_tables(
    t_cf_neutrophil_v1_de_sva, keepers = cf_contrast,
    rda=glue::glue("rda/t_neutrophil_v1_cf_table_sva-v{ver}.rda"),
    excel = glue::glue("{xlsx_prefix}/Neutrophils/t_neutrophil_v1_cf_tables_sva-v{ver}.xlsx"))
## Starting combine_extracted_plots() with do_inverse as: FALSE.
## Plotting volcano plot of the DE results of Tumacofailure_vs_Tumacocure according to the columns: logFC and adj.P.Val using the expressionset colors.
## Plotting volcano plot of the DE results of Tumacofailure_vs_Tumacocure according to the columns: logFC and FDR using the expressionset colors.
## Saving de result as t_neutrophil_v1_cf_table_sva-v202212 to rda/t_neutrophil_v1_cf_table_sva-v202212.rda.
t_cf_neutrophil_v1_sig_sva <- extract_significant_genes(
    t_cf_neutrophil_v1_tables_sva,
    excel = glue::glue("{xlsx_prefix}/Neutrophils/t_neutrophil_v1_cf_sig_sva-v{ver}.xlsx"))
## Plotting volcano plot of the DE results of Tumacofailure_vs_Tumacocure according to the columns: logFC and FDR using the expressionset colors.
## Plotting volcano plot of the DE results of Tumacofailure_vs_Tumacocure according to the columns: logFC and adj.P.Val using the expressionset colors.
dim(t_cf_neutrophil_v1_sig_sva$deseq$ups[[1]])
## [1]  5 58
dim(t_cf_neutrophil_v1_sig_sva$deseq$downs[[1]])
## [1]  8 58
t_cf_neutrophil_v2_de_sva <- all_pairwise(tv2_neutrophils, model_batch = "svaseq", filter = TRUE)
## This DE analysis will perform all pairwise comparisons among:
## 
##    Tumaco_cure Tumaco_failure 
##              7              6
## This analysis will include surrogate estimates from: svaseq.
## This will pre-filter the input data using normalize_expt's: TRUE argument.
## Removing 0 low-count genes (8450 remaining).
## Setting 78 low elements to zero.
## transform_counts: Found 78 values equal to 0, adding 1 to the matrix.
## Finished running DE analyses, collecting outputs.
## Comparing analyses.
t_cf_neutrophil_v2_tables_sva <- combine_de_tables(
    t_cf_neutrophil_v2_de_sva,
    keepers = cf_contrast,
    rda=glue::glue("rda/t_neutrophil_v2_cf_table_sva-v{ver}.rda"),
    excel = glue::glue("{xlsx_prefix}/Neutrophils/t_neutrophil_v2_cf_tables_sva-v{ver}.xlsx"))
## Starting combine_extracted_plots() with do_inverse as: FALSE.
## Plotting volcano plot of the DE results of Tumacofailure_vs_Tumacocure according to the columns: logFC and adj.P.Val using the expressionset colors.
## Plotting volcano plot of the DE results of Tumacofailure_vs_Tumacocure according to the columns: logFC and FDR using the expressionset colors.
## Saving de result as t_neutrophil_v2_cf_table_sva-v202212 to rda/t_neutrophil_v2_cf_table_sva-v202212.rda.
t_cf_neutrophil_v2_sig_sva <- extract_significant_genes(
    t_cf_neutrophil_v2_tables_sva,
    excel = glue::glue("{xlsx_prefix}/Neutrophils/t_neutrophil_v2_cf_sig_sva-v{ver}.xlsx"))
## Plotting volcano plot of the DE results of Tumacofailure_vs_Tumacocure according to the columns: logFC and FDR using the expressionset colors.
## Plotting volcano plot of the DE results of Tumacofailure_vs_Tumacocure according to the columns: logFC and adj.P.Val using the expressionset colors.
dim(t_cf_neutrophil_v2_sig_sva$deseq$ups[[1]])
## [1]  9 58
dim(t_cf_neutrophil_v2_sig_sva$deseq$downs[[1]])
## [1]  3 58
t_cf_neutrophil_v3_de_sva <- all_pairwise(tv3_neutrophils, model_batch = "svaseq", filter = TRUE)
## This DE analysis will perform all pairwise comparisons among:
## 
##    Tumaco_cure Tumaco_failure 
##              5              7
## This analysis will include surrogate estimates from: svaseq.
## This will pre-filter the input data using normalize_expt's: TRUE argument.
## Removing 0 low-count genes (8503 remaining).
## Setting 83 low elements to zero.
## transform_counts: Found 83 values equal to 0, adding 1 to the matrix.
## Finished running DE analyses, collecting outputs.
## Comparing analyses.
t_cf_neutrophil_v3_tables_sva <- combine_de_tables(
    t_cf_neutrophil_v3_de_sva, keepers = cf_contrast,
    rda=glue::glue("rda/t_neutrophil_v3_cf_table_sva-v{ver}.rda"),
    excel = glue::glue("{xlsx_prefix}/Neutrophils/t_neutrophil_v3_cf_tables_sva-v{ver}.xlsx"))
## Starting combine_extracted_plots() with do_inverse as: FALSE.
## Plotting volcano plot of the DE results of Tumacofailure_vs_Tumacocure according to the columns: logFC and adj.P.Val using the expressionset colors.
## Plotting volcano plot of the DE results of Tumacofailure_vs_Tumacocure according to the columns: logFC and FDR using the expressionset colors.
## Saving de result as t_neutrophil_v3_cf_table_sva-v202212 to rda/t_neutrophil_v3_cf_table_sva-v202212.rda.
t_cf_neutrophil_v3_sig_sva <- extract_significant_genes(
    t_cf_neutrophil_v3_tables_sva,
    excel = glue::glue("{xlsx_prefix}/Neutrophils/t_neutrophil_v3_cf_sig_sva-v{ver}.xlsx"))
## Plotting volcano plot of the DE results of Tumacofailure_vs_Tumacocure according to the columns: logFC and FDR using the expressionset colors.
## Plotting volcano plot of the DE results of Tumacofailure_vs_Tumacocure according to the columns: logFC and adj.P.Val using the expressionset colors.
dim(t_cf_neutrophil_v3_sig_sva$deseq$ups[[1]])
## [1]  5 58
dim(t_cf_monocyte_v3_sig_sva$deseq$downs[[1]])
## [1]  4 58
8.3.5.2.1 gProfiler: Neutrophils by visit, 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)
## 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
## 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
enrichplot::dotplot(t_cf_neutrophil_v1_sig_sva_gp[["outcome_down"]][["GO_enrich"]])

8.3.5.2.2 gProfiler: Neutrophils by visit, V2

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

8.3.5.3 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
## $aucc
## [1] 0.611
## 
## $cor
## 
##  Pearson's product-moment correlation
## 
## data:  tbl[[lx]] and tbl[[ly]]
## t = 192, df = 9097, p-value <2e-16
## alternative hypothesis: true correlation is not equal to 0
## 95 percent confidence interval:
##  0.8915 0.8996
## sample estimates:
##    cor 
## 0.8956 
## 
## 
## $plot

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 = 192, df = 9097, p-value <2e-16
## alternative hypothesis: true correlation is not equal to 0
## 95 percent confidence interval:
##  0.8915 0.8996
## sample estimates:
##    cor 
## 0.8956

8.3.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)
## This DE analysis will perform all pairwise comparisons among:
## 
##    Tumaco_cure Tumaco_failure 
##             17              9
## This analysis will include surrogate estimates from: svaseq.
## This will pre-filter the input data using normalize_expt's: TRUE argument.
## Removing 0 low-count genes (10530 remaining).
## Setting 325 low elements to zero.
## transform_counts: Found 325 values equal to 0, adding 1 to the matrix.
## Finished running DE analyses, collecting outputs.
## Comparing analyses.
t_cf_eosinophil_tables_sva <- combine_de_tables(
    t_cf_eosinophil_de_sva, keepers = cf_contrast,
    rda=glue::glue("rda/t_eosinophil_cf_table_sva-v{ver}.rda"),
    excel = glue::glue("{xlsx_prefix}/Eosinophils/t_eosinophil_cf_tables_sva-v{ver}.xlsx"))
## Starting combine_extracted_plots() with do_inverse as: FALSE.
## Plotting volcano plot of the DE results of Tumacofailure_vs_Tumacocure according to the columns: logFC and adj.P.Val using the expressionset colors.
## Plotting volcano plot of the DE results of Tumacofailure_vs_Tumacocure according to the columns: logFC and FDR using the expressionset colors.
## Saving de result as t_eosinophil_cf_table_sva-v202212 to rda/t_eosinophil_cf_table_sva-v202212.rda.
t_cf_eosinophil_sig_sva <- extract_significant_genes(
    t_cf_eosinophil_tables_sva,
    excel = glue::glue("{xlsx_prefix}/Eosinophils/t_eosinophil_cf_sig_sva-v{ver}.xlsx"))
## Plotting volcano plot of the DE results of Tumacofailure_vs_Tumacocure according to the columns: logFC and FDR using the expressionset colors.
## Plotting volcano plot of the DE results of Tumacofailure_vs_Tumacocure according to the columns: logFC and adj.P.Val using the expressionset colors.
dim(t_cf_eosinophil_sig_sva$deseq$ups[[1]])
## [1] 116  58
dim(t_cf_eosinophil_sig_sva$deseq$downs[[1]])
## [1] 74 58
t_cf_eosinophil_de_batchvisit <- all_pairwise(t_eosinophils, model_batch = TRUE, filter = TRUE)
## This DE analysis will perform all pairwise comparisons among:
## 
##    Tumaco_cure Tumaco_failure 
##             17              9
## This analysis will include a batch factor in the model comprised of:
## 
## 3 2 1 
## 9 9 8
## This will pre-filter the input data using normalize_expt's: TRUE argument.
## Using limma's removeBatchEffect to visualize with(out) batch inclusion.
## Finished running DE analyses, collecting outputs.
## Comparing analyses.
t_cf_eosinophil_tables_batchvisit <- combine_de_tables(
    t_cf_eosinophil_de_batchvisit, keepers = cf_contrast,
    rda=glue::glue("rda/t_eosinophil_cf_table_batchvisit-v{ver}.rda"),
    excel = glue::glue("{xlsx_prefix}/Eosinophils/t_eosinophil_cf_tables_batchvisit-v{ver}.xlsx"))
## Starting combine_extracted_plots() with do_inverse as: FALSE.
## Plotting volcano plot of the DE results of Tumacofailure_vs_Tumacocure according to the columns: logFC and adj.P.Val using the expressionset colors.
## Plotting volcano plot of the DE results of Tumacofailure_vs_Tumacocure according to the columns: logFC and FDR using the expressionset colors.
## Saving de result as t_eosinophil_cf_table_batchvisit-v202212 to rda/t_eosinophil_cf_table_batchvisit-v202212.rda.
t_cf_eosinophil_sig_batchvisit <- extract_significant_genes(
    t_cf_eosinophil_tables_batchvisit,
    excel = glue::glue("excel/t_eosinophil_cf_sig_batchvisit-v{ver}.xlsx"))
## Plotting volcano plot of the DE results of Tumacofailure_vs_Tumacocure according to the columns: logFC and FDR using the expressionset colors.
## Plotting volcano plot of the DE results of Tumacofailure_vs_Tumacocure according to the columns: logFC and adj.P.Val using the expressionset colors.
dim(t_cf_eosinophil_sig_batchvisit$deseq$ups[[1]])
## [1] 99 58
dim(t_cf_eosinophil_sig_batchvisit$deseq$downs[[1]])
## [1] 35 58
visitcf_factor <- paste0("v", pData(t_eosinophils)[["visitnumber"]],
                         pData(t_eosinophils)[["finaloutcome"]])
t_eosinophil_visitcf <- set_expt_conditions(t_eosinophils, fact=visitcf_factor)
t_cf_eosinophil_visits_de_sva <- all_pairwise(t_eosinophil_visitcf, model_batch = "svaseq",
                                              filter = TRUE)
## This DE analysis will perform all pairwise comparisons among:
## 
##    v1cure v1failure    v2cure v2failure    v3cure v3failure 
##         5         3         6         3         6         3
## This analysis will include surrogate estimates from: svaseq.
## This will pre-filter the input data using normalize_expt's: TRUE argument.
## Removing 0 low-count genes (10530 remaining).
## Setting 374 low elements to zero.
## transform_counts: Found 374 values equal to 0, adding 1 to the matrix.
## Finished running DE analyses, collecting outputs.
## Comparing analyses.

t_cf_eosinophil_visits_tables_sva <- combine_de_tables(
    t_cf_eosinophil_visits_de_sva, keepers = visitcf_contrasts,
    rda=glue::glue("rda/t_eosinophil_visitcf_table_sva-v{ver}.rda"),
    excel = glue::glue("{xlsx_prefix}/Eosinophils/t_eosinophil_visitcf_tables_sva-v{ver}.xlsx"))
## Starting combine_extracted_plots() with do_inverse as: FALSE.
## Plotting volcano plot of the DE results of v1failure_vs_v1cure according to the columns: logFC and adj.P.Val using the expressionset colors.
## Plotting volcano plot of the DE results of v1failure_vs_v1cure according to the columns: logFC and FDR using the expressionset colors.
## Starting combine_extracted_plots() with do_inverse as: FALSE.
## Plotting volcano plot of the DE results of v2failure_vs_v2cure according to the columns: logFC and adj.P.Val using the expressionset colors.
## Plotting volcano plot of the DE results of v2failure_vs_v2cure according to the columns: logFC and FDR using the expressionset colors.
## Starting combine_extracted_plots() with do_inverse as: FALSE.
## Plotting volcano plot of the DE results of v3failure_vs_v3cure according to the columns: logFC and adj.P.Val using the expressionset colors.
## Plotting volcano plot of the DE results of v3failure_vs_v3cure according to the columns: logFC and FDR using the expressionset colors.
## Saving de result as t_eosinophil_visitcf_table_sva-v202212 to rda/t_eosinophil_visitcf_table_sva-v202212.rda.
t_cf_eosinophil_visits_sig_sva <- extract_significant_genes(
    t_cf_eosinophil_visits_tables_sva,
    excel = glue::glue("{xlsx_prefix}/Eosinophils/t_eosinophil_visitcf_sig_sva-v{ver}.xlsx"))
## Plotting volcano plot of the DE results of v1failure_vs_v1cure according to the columns: logFC and FDR using the expressionset colors.
## Plotting volcano plot of the DE results of v2failure_vs_v2cure according to the columns: logFC and FDR using the expressionset colors.
## Plotting volcano plot of the DE results of v3failure_vs_v3cure according to the columns: logFC and FDR using the expressionset colors.
## Plotting volcano plot of the DE results of v1failure_vs_v1cure according to the columns: logFC and adj.P.Val using the expressionset colors.
## Plotting volcano plot of the DE results of v2failure_vs_v2cure according to the columns: logFC and adj.P.Val using the expressionset colors.
## Plotting volcano plot of the DE results of v3failure_vs_v3cure according to the columns: logFC and adj.P.Val using the expressionset colors.
dim(t_cf_eosinophil_visits_sig_sva$deseq$ups[[1]])
## [1]  9 47
dim(t_cf_eosinophil_visits_sig_sva$deseq$downs[[1]])
## [1] 11 47

8.3.6.1 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)
## 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
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"]])

8.3.7 Eosinophil time comparisons

t_cf_eosinophil_v1_de_sva <- all_pairwise(tv1_eosinophils, model_batch = "svaseq", filter = TRUE)
## This DE analysis will perform all pairwise comparisons among:
## 
##    Tumaco_cure Tumaco_failure 
##              5              3
## This analysis will include surrogate estimates from: svaseq.
## This will pre-filter the input data using normalize_expt's: TRUE argument.
## Removing 0 low-count genes (9977 remaining).
## Setting 57 low elements to zero.
## transform_counts: Found 57 values equal to 0, adding 1 to the matrix.
## Finished running DE analyses, collecting outputs.
## Comparing analyses.
t_cf_eosinophil_v1_tables_sva <- combine_de_tables(
    t_cf_eosinophil_v1_de_sva, keepers = cf_contrast,
    rda=glue::glue("rda/t_eosinophil_v1_cf_table_sva-v{ver}.rda"),
    excel = glue::glue("{xlsx_prefix}/Eosinophils/t_eosinophil_v1_cf_tables_sva-v{ver}.xlsx"))
## Starting combine_extracted_plots() with do_inverse as: FALSE.
## Plotting volcano plot of the DE results of Tumacofailure_vs_Tumacocure according to the columns: logFC and adj.P.Val using the expressionset colors.
## Plotting volcano plot of the DE results of Tumacofailure_vs_Tumacocure according to the columns: logFC and FDR using the expressionset colors.
## Saving de result as t_eosinophil_v1_cf_table_sva-v202212 to rda/t_eosinophil_v1_cf_table_sva-v202212.rda.
t_cf_eosinophil_v1_sig_sva <- extract_significant_genes(
    t_cf_eosinophil_v1_tables_sva,
    excel = glue::glue("{xlsx_prefix}/Eosinophils/t_eosinophil_v1_cf_sig_sva-v{ver}.xlsx"))
## Plotting volcano plot of the DE results of Tumacofailure_vs_Tumacocure according to the columns: logFC and FDR using the expressionset colors.
## Plotting volcano plot of the DE results of Tumacofailure_vs_Tumacocure according to the columns: logFC and adj.P.Val using the expressionset colors.
dim(t_cf_eosinophil_v1_sig_sva$deseq$ups[[1]])
## [1] 13 58
dim(t_cf_eosinophil_v1_sig_sva$deseq$downs[[1]])
## [1] 19 58
t_cf_eosinophil_v2_de_sva <- all_pairwise(tv2_eosinophils, model_batch = "svaseq", filter = TRUE)
## This DE analysis will perform all pairwise comparisons among:
## 
##    Tumaco_cure Tumaco_failure 
##              6              3
## This analysis will include surrogate estimates from: svaseq.
## This will pre-filter the input data using normalize_expt's: TRUE argument.
## Removing 0 low-count genes (10115 remaining).
## Setting 90 low elements to zero.
## transform_counts: Found 90 values equal to 0, adding 1 to the matrix.
## Finished running DE analyses, collecting outputs.
## Comparing analyses.
t_cf_eosinophil_v2_tables_sva <- combine_de_tables(
    t_cf_eosinophil_v2_de_sva, keepers = cf_contrast,
    rda=glue::glue("rda/t_eosinophil_v2_cf_table_sva-v{ver}.rda"),
    excel = glue::glue("{xlsx_prefix}/Eosinophils/t_eosinophil_v2_cf_tables_sva-v{ver}.xlsx"))
## Starting combine_extracted_plots() with do_inverse as: FALSE.
## Plotting volcano plot of the DE results of Tumacofailure_vs_Tumacocure according to the columns: logFC and adj.P.Val using the expressionset colors.
## Plotting volcano plot of the DE results of Tumacofailure_vs_Tumacocure according to the columns: logFC and FDR using the expressionset colors.
## Saving de result as t_eosinophil_v2_cf_table_sva-v202212 to rda/t_eosinophil_v2_cf_table_sva-v202212.rda.
t_cf_eosinophil_v2_sig_sva <- extract_significant_genes(
    t_cf_eosinophil_v2_tables_sva,
    excel = glue::glue("{xlsx_prefix}/Eosinophils/t_eosinophil_v2_cf_sig_sva-v{ver}.xlsx"))
## Plotting volcano plot of the DE results of Tumacofailure_vs_Tumacocure according to the columns: logFC and FDR using the expressionset colors.
## Plotting volcano plot of the DE results of Tumacofailure_vs_Tumacocure according to the columns: logFC and adj.P.Val using the expressionset colors.
dim(t_cf_eosinophil_v2_sig_sva$deseq$ups[[1]])
## [1]  9 58
dim(t_cf_eosinophil_v2_sig_sva$deseq$downs[[1]])
## [1]  4 58
t_cf_eosinophil_v3_de_sva <- all_pairwise(tv3_eosinophils, model_batch = "svaseq", filter = TRUE)
## This DE analysis will perform all pairwise comparisons among:
## 
##    Tumaco_cure Tumaco_failure 
##              6              3
## This analysis will include surrogate estimates from: svaseq.
## This will pre-filter the input data using normalize_expt's: TRUE argument.
## Removing 0 low-count genes (10078 remaining).
## Setting 48 low elements to zero.
## transform_counts: Found 48 values equal to 0, adding 1 to the matrix.
## Finished running DE analyses, collecting outputs.
## Comparing analyses.
t_cf_eosinophil_v3_tables_sva <- combine_de_tables(
    t_cf_eosinophil_v3_de_sva, keepers = cf_contrast,
    rda=glue::glue("rda/t_eosinophil_v3_cf_table_sva-v{ver}.rda"),
    excel = glue::glue("{xlsx_prefix}/Eosinophils/t_eosinophil_v3_cf_tables_sva-v{ver}.xlsx"))
## Starting combine_extracted_plots() with do_inverse as: FALSE.
## Plotting volcano plot of the DE results of Tumacofailure_vs_Tumacocure according to the columns: logFC and adj.P.Val using the expressionset colors.
## Plotting volcano plot of the DE results of Tumacofailure_vs_Tumacocure according to the columns: logFC and FDR using the expressionset colors.
## Saving de result as t_eosinophil_v3_cf_table_sva-v202212 to rda/t_eosinophil_v3_cf_table_sva-v202212.rda.
t_cf_eosinophil_v3_sig_sva <- extract_significant_genes(
    t_cf_eosinophil_v3_tables_sva,
    excel = glue::glue("{xlsx_prefix}/Eosinophils/t_eosinophil_v3_cf_sig_sva-v{ver}.xlsx"))
## Plotting volcano plot of the DE results of Tumacofailure_vs_Tumacocure according to the columns: logFC and FDR using the expressionset colors.
## Plotting volcano plot of the DE results of Tumacofailure_vs_Tumacocure according to the columns: logFC and adj.P.Val using the expressionset colors.
dim(t_cf_eosinophil_v3_sig_sva$deseq$ups[[1]])
## [1] 68 58
dim(t_cf_eosinophil_v3_sig_sva$deseq$downs[[1]])
## [1] 29 58

8.3.7.1 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)
## 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
## 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
enrichplot::dotplot(t_cf_eosinophil_sig_sva_gp[["outcome_down"]][["GO_enrich"]])

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

8.3.7.2 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)
## 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
## 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
enrichplot::dotplot(t_cf_eosinophil_sig_sva_gp[["outcome_up"]][["GO_enrich"]])

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

8.3.7.3 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)
## 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
enrichplot::dotplot(t_cf_eosinophil_sig_sva_gp[["outcome_up"]][["GO_enrich"]])

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

8.3.7.4 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
## $aucc
## [1] 0.5764
## 
## $cor
## 
##  Pearson's product-moment correlation
## 
## data:  tbl[[lx]] and tbl[[ly]]
## t = 152, df = 10528, p-value <2e-16
## alternative hypothesis: true correlation is not equal to 0
## 95 percent confidence interval:
##  0.8232 0.8352
## sample estimates:
##    cor 
## 0.8293 
## 
## 
## $plot

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 = 10528, p-value <2e-16
## alternative hypothesis: true correlation is not equal to 0
## 95 percent confidence interval:
##  0.8232 0.8352
## sample estimates:
##    cor 
## 0.8293

8.3.7.5 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
## $aucc
## [1] 0.2058
## 
## $cor
## 
##  Pearson's product-moment correlation
## 
## data:  tbl[[lx]] and tbl[[ly]]
## t = 43, df = 8575, p-value <2e-16
## alternative hypothesis: true correlation is not equal to 0
## 95 percent confidence interval:
##  0.4033 0.4381
## sample estimates:
##    cor 
## 0.4209 
## 
## 
## $plot

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
## $aucc
## [1] 0.09657
## 
## $cor
## 
##  Pearson's product-moment correlation
## 
## data:  tbl[[lx]] and tbl[[ly]]
## t = 22, df = 9763, p-value <2e-16
## alternative hypothesis: true correlation is not equal to 0
## 95 percent confidence interval:
##  0.2028 0.2405
## sample estimates:
##    cor 
## 0.2217 
## 
## 
## $plot

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
## $aucc
## [1] 0.1583
## 
## $cor
## 
##  Pearson's product-moment correlation
## 
## data:  tbl[[lx]] and tbl[[ly]]
## t = 36, df = 8569, p-value <2e-16
## alternative hypothesis: true correlation is not equal to 0
## 95 percent confidence interval:
##  0.3467 0.3834
## sample estimates:
##    cor 
## 0.3652 
## 
## 
## $plot

8.3.8 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.

8.3.8.1 Cure/Fail by visits, all cell types

t_visit_cf_all_de_sva <- all_pairwise(t_visitcf, model_batch = "svaseq", filter = TRUE)
## This DE analysis will perform all pairwise comparisons among:
## 
##    v1cure v1failure    v2cure v2failure    v3cure v3failure 
##        30        24        20        15        17        17
## This analysis will include surrogate estimates from: svaseq.
## This will pre-filter the input data using normalize_expt's: TRUE argument.
## Removing 0 low-count genes (14149 remaining).
## Setting 17117 low elements to zero.
## transform_counts: Found 17117 values equal to 0, adding 1 to the matrix.
## Finished running DE analyses, collecting outputs.
## Comparing analyses.

t_visit_cf_all_tables_sva <- combine_de_tables(
    t_visit_cf_all_de_sva, keepers = visitcf_contrasts,
    rda=glue::glue("rda/t_all_visitcf_table_sva-v{ver}.rda"),
    excel = glue::glue("analyses/4_tumaco/DE_Cure_vs_Fail/t_all_visitcf_tables_sva-v{ver}.xlsx"))
## Starting combine_extracted_plots() with do_inverse as: FALSE.
## Plotting volcano plot of the DE results of v1failure_vs_v1cure according to the columns: logFC and adj.P.Val using the expressionset colors.
## Plotting volcano plot of the DE results of v1failure_vs_v1cure according to the columns: logFC and FDR using the expressionset colors.
## Starting combine_extracted_plots() with do_inverse as: FALSE.
## Plotting volcano plot of the DE results of v2failure_vs_v2cure according to the columns: logFC and adj.P.Val using the expressionset colors.
## Plotting volcano plot of the DE results of v2failure_vs_v2cure according to the columns: logFC and FDR using the expressionset colors.
## Starting combine_extracted_plots() with do_inverse as: FALSE.
## Plotting volcano plot of the DE results of v3failure_vs_v3cure according to the columns: logFC and adj.P.Val using the expressionset colors.
## Plotting volcano plot of the DE results of v3failure_vs_v3cure according to the columns: logFC and FDR using the expressionset colors.
## Saving de result as t_all_visitcf_table_sva-v202212 to rda/t_all_visitcf_table_sva-v202212.rda.
t_visit_cf_all_sig_sva <- extract_significant_genes(
    t_visit_cf_all_tables_sva,
    excel = glue::glue("analyses/4_tumaco/DE_Cure_vs_Fail/t_all_visitcf_sig_sva-v{ver}.xlsx"))
## Plotting volcano plot of the DE results of v1failure_vs_v1cure according to the columns: logFC and FDR using the expressionset colors.
## Plotting volcano plot of the DE results of v2failure_vs_v2cure according to the columns: logFC and FDR using the expressionset colors.
## Plotting volcano plot of the DE results of v3failure_vs_v3cure according to the columns: logFC and FDR using the expressionset colors.
## Plotting volcano plot of the DE results of v1failure_vs_v1cure according to the columns: logFC and adj.P.Val using the expressionset colors.
## Plotting volcano plot of the DE results of v2failure_vs_v2cure according to the columns: logFC and adj.P.Val using the expressionset colors.
## Plotting volcano plot of the DE results of v3failure_vs_v3cure according to the columns: logFC and adj.P.Val using the expressionset colors.

8.3.8.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)

t_visit_cf_monocyte_de_sva <- all_pairwise(t_monocytes_visitcf, model_batch = "svaseq",
                                           filter = TRUE)
## This DE analysis will perform all pairwise comparisons among:
## 
##    v1_cure v1_failure    v2_cure v2_failure    v3_cure v3_failure 
##          8          8          7          6          6          7
## This analysis will include surrogate estimates from: svaseq.
## This will pre-filter the input data using normalize_expt's: TRUE argument.
## Removing 0 low-count genes (10859 remaining).
## Setting 688 low elements to zero.
## transform_counts: Found 688 values equal to 0, adding 1 to the matrix.
## Finished running DE analyses, collecting outputs.
## Comparing analyses.

t_visit_cf_monocyte_tables_sva <- combine_de_tables(
    t_visit_cf_monocyte_de_sva, keepers = visitcf_contrasts,
    rda=glue::glue("rda/t_monocyte_visitcf_table_sva-v{ver}.rda"),
    excel = glue::glue("{xlsx_prefix}/Monocytes/t_monocyte_visitcf_tables_sva-v{ver}.xlsx"))
## Starting combine_extracted_plots() with do_inverse as: FALSE.
## Plotting volcano plot of the DE results of v1failure_vs_v1cure according to the columns: logFC and adj.P.Val using the expressionset colors.
## Plotting volcano plot of the DE results of v1failure_vs_v1cure according to the columns: logFC and FDR using the expressionset colors.
## Starting combine_extracted_plots() with do_inverse as: FALSE.
## Plotting volcano plot of the DE results of v2failure_vs_v2cure according to the columns: logFC and adj.P.Val using the expressionset colors.
## Plotting volcano plot of the DE results of v2failure_vs_v2cure according to the columns: logFC and FDR using the expressionset colors.
## Starting combine_extracted_plots() with do_inverse as: FALSE.
## Plotting volcano plot of the DE results of v3failure_vs_v3cure according to the columns: logFC and adj.P.Val using the expressionset colors.
## Plotting volcano plot of the DE results of v3failure_vs_v3cure according to the columns: logFC and FDR using the expressionset colors.
## Saving de result as t_monocyte_visitcf_table_sva-v202212 to rda/t_monocyte_visitcf_table_sva-v202212.rda.
t_visit_cf_monocyte_sig_sva <- extract_significant_genes(
    t_visit_cf_monocyte_tables_sva,
    excel = glue::glue("{xlsx_prefix}/Monocytes/t_monocyte_visitcf_sig_sva-v{ver}.xlsx"))
## Plotting volcano plot of the DE results of v1failure_vs_v1cure according to the columns: logFC and FDR using the expressionset colors.
## Plotting volcano plot of the DE results of v2failure_vs_v2cure according to the columns: logFC and FDR using the expressionset colors.
## Plotting volcano plot of the DE results of v3failure_vs_v3cure according to the columns: logFC and FDR using the expressionset colors.
## Plotting volcano plot of the DE results of v1failure_vs_v1cure according to the columns: logFC and adj.P.Val using the expressionset colors.
## Plotting volcano plot of the DE results of v2failure_vs_v2cure according to the columns: logFC and adj.P.Val using the expressionset colors.
## Plotting volcano plot of the DE results of v3failure_vs_v3cure according to the columns: logFC and adj.P.Val using the expressionset colors.
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
closed <- dev.off()
t_v1fc_deseq_ma

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
closed <- dev.off()
t_v2fc_deseq_ma

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
closed <- dev.off()
t_v3fc_deseq_ma

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"]]

8.3.8.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)
t_visit_cf_neutrophil_de_sva <- all_pairwise(t_neutrophil_visitcf, model_batch = "svaseq",
                                             filter = TRUE)
## This DE analysis will perform all pairwise comparisons among:
## 
##    v1_cure v1_failure    v2_cure v2_failure    v3_cure v3_failure 
##          8          8          7          6          5          7
## This analysis will include surrogate estimates from: svaseq.
## This will pre-filter the input data using normalize_expt's: TRUE argument.
## Removing 0 low-count genes (9099 remaining).
## Setting 686 low elements to zero.
## transform_counts: Found 686 values equal to 0, adding 1 to the matrix.
## Finished running DE analyses, collecting outputs.
## Comparing analyses.

t_visit_cf_neutrophil_tables_sva <- combine_de_tables(
    t_visit_cf_neutrophil_de_sva, keepers = visitcf_contrasts,
    rda=glue::glue("rda/t_neutrophil_visitcf_table_sva-v{ver}.rda"),
    excel = glue::glue("{xlsx_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-v202212.xlsx before writing the tables.
## Starting combine_extracted_plots() with do_inverse as: FALSE.
## Plotting volcano plot of the DE results of v1failure_vs_v1cure according to the columns: logFC and adj.P.Val using the expressionset colors.
## Plotting volcano plot of the DE results of v1failure_vs_v1cure according to the columns: logFC and FDR using the expressionset colors.
## Starting combine_extracted_plots() with do_inverse as: FALSE.
## Plotting volcano plot of the DE results of v2failure_vs_v2cure according to the columns: logFC and adj.P.Val using the expressionset colors.
## Plotting volcano plot of the DE results of v2failure_vs_v2cure according to the columns: logFC and FDR using the expressionset colors.
## Starting combine_extracted_plots() with do_inverse as: FALSE.
## Plotting volcano plot of the DE results of v3failure_vs_v3cure according to the columns: logFC and adj.P.Val using the expressionset colors.
## Plotting volcano plot of the DE results of v3failure_vs_v3cure according to the columns: logFC and FDR using the expressionset colors.
## Saving de result as t_neutrophil_visitcf_table_sva-v202212 to rda/t_neutrophil_visitcf_table_sva-v202212.rda.
t_visit_cf_neutrophil_sig_sva <- extract_significant_genes(
    t_visit_cf_neutrophil_tables_sva,
    excel = glue::glue("{xlsx_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-v202212.xlsx before writing the tables.
## Plotting volcano plot of the DE results of v1failure_vs_v1cure according to the columns: logFC and FDR using the expressionset colors.
## Plotting volcano plot of the DE results of v2failure_vs_v2cure according to the columns: logFC and FDR using the expressionset colors.
## Plotting volcano plot of the DE results of v3failure_vs_v3cure according to the columns: logFC and FDR using the expressionset colors.
## Plotting volcano plot of the DE results of v1failure_vs_v1cure according to the columns: logFC and adj.P.Val using the expressionset colors.
## Plotting volcano plot of the DE results of v2failure_vs_v2cure according to the columns: logFC and adj.P.Val using the expressionset colors.
## Plotting volcano plot of the DE results of v3failure_vs_v3cure according to the columns: logFC and adj.P.Val using the expressionset colors.

8.3.8.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)
t_visit_cf_eosinophil_de_sva <- all_pairwise(t_eosinophil_visitcf, model_batch = "svaseq",
                                             filter = TRUE)
## This DE analysis will perform all pairwise comparisons among:
## 
##    v1_cure v1_failure    v2_cure v2_failure    v3_cure v3_failure 
##          5          3          6          3          6          3
## This analysis will include surrogate estimates from: svaseq.
## This will pre-filter the input data using normalize_expt's: TRUE argument.
## Removing 0 low-count genes (10530 remaining).
## Setting 374 low elements to zero.
## transform_counts: Found 374 values equal to 0, adding 1 to the matrix.
## Finished running DE analyses, collecting outputs.
## Comparing analyses.

t_visit_cf_eosinophil_tables_sva <- combine_de_tables(
    t_visit_cf_eosinophil_de_sva, keepers = visitcf_contrasts,
    rda=glue::glue("rda/t_eosinophil_visitcf_table_sva-v{ver}.rda"),
    excel = glue::glue("{xlsx_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-v202212.xlsx before writing the tables.
## Starting combine_extracted_plots() with do_inverse as: FALSE.
## Plotting volcano plot of the DE results of v1failure_vs_v1cure according to the columns: logFC and adj.P.Val using the expressionset colors.
## Plotting volcano plot of the DE results of v1failure_vs_v1cure according to the columns: logFC and FDR using the expressionset colors.
## Starting combine_extracted_plots() with do_inverse as: FALSE.
## Plotting volcano plot of the DE results of v2failure_vs_v2cure according to the columns: logFC and adj.P.Val using the expressionset colors.
## Plotting volcano plot of the DE results of v2failure_vs_v2cure according to the columns: logFC and FDR using the expressionset colors.
## Starting combine_extracted_plots() with do_inverse as: FALSE.
## Plotting volcano plot of the DE results of v3failure_vs_v3cure according to the columns: logFC and adj.P.Val using the expressionset colors.
## Plotting volcano plot of the DE results of v3failure_vs_v3cure according to the columns: logFC and FDR using the expressionset colors.
## Saving de result as t_eosinophil_visitcf_table_sva-v202212 to rda/t_eosinophil_visitcf_table_sva-v202212.rda.
t_visit_cf_eosinophil_sig_sva <- extract_significant_genes(
    t_visit_cf_eosinophil_tables_sva,
    excel = glue::glue("{xlsx_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-v202212.xlsx before writing the tables.
## Plotting volcano plot of the DE results of v1failure_vs_v1cure according to the columns: logFC and FDR using the expressionset colors.
## Plotting volcano plot of the DE results of v2failure_vs_v2cure according to the columns: logFC and FDR using the expressionset colors.
## Plotting volcano plot of the DE results of v3failure_vs_v3cure according to the columns: logFC and FDR using the expressionset colors.
## Plotting volcano plot of the DE results of v1failure_vs_v1cure according to the columns: logFC and adj.P.Val using the expressionset colors.
## Plotting volcano plot of the DE results of v2failure_vs_v2cure according to the columns: logFC and adj.P.Val using the expressionset colors.
## Plotting volcano plot of the DE results of v3failure_vs_v3cure according to the columns: logFC and adj.P.Val using the expressionset colors.

8.4 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.

8.4.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')
## subset_expt(): There were 123, now there are 97 samples.
## subset_expt(): There were 97, now there are 30 samples.
## persistence_biopsy <- subset_expt(persistence_expt, subset = "typeofcells=='biopsy'")
persistence_monocyte <- subset_expt(persistence_expt, subset = "typeofcells=='monocytes'")
## subset_expt(): There were 30, now there are 12 samples.
persistence_neutrophil <- subset_expt(persistence_expt, subset = "typeofcells=='neutrophils'")
## subset_expt(): There were 30, now there are 10 samples.
persistence_eosinophil <- subset_expt(persistence_expt, subset = "typeofcells=='eosinophils'")
## subset_expt(): There were 30, now there are 8 samples.

8.4.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 8537 low-count genes (11386 remaining).
## transform_counts: Found 15 values equal to 0, adding 1 to the matrix.
plot_pca(persistence_norm)$plot
## Warning: ggrepel: 6 unlabeled data points (too many overlaps). Consider
## increasing max.overlaps

persistence_nb <- normalize_expt(persistence_expt, transform = "log2", convert = "cpm",
                                 batch = "svaseq", filter = TRUE)
## Removing 8537 low-count genes (11386 remaining).
## Setting 1538 low elements to zero.
## transform_counts: Found 1538 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 9597 low-count genes (10326 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 9597 low-count genes (10326 remaining).
## Setting 46 low elements to zero.
## transform_counts: Found 46 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 11531 low-count genes (8392 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 11531 low-count genes (8392 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 9895 low-count genes (10028 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 9895 low-count genes (10028 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

8.4.3 persistence DE

persistence_de_sva <- all_pairwise(persistence_expt, filter = TRUE, model_batch = "svaseq")
## This DE analysis will perform all pairwise comparisons among:
## 
##  N  Y 
##  6 24
## This analysis will include surrogate estimates from: svaseq.
## This will pre-filter the input data using normalize_expt's: TRUE argument.
## Removing 0 low-count genes (11386 remaining).
## Setting 1538 low elements to zero.
## transform_counts: Found 1538 values equal to 0, adding 1 to the matrix.
## Finished running DE analyses, collecting outputs.
## Comparing analyses.
persistence_table_sva <- combine_de_tables(
    persistence_de_sva,
    excel = glue::glue("analyses/4_tumaco/DE_Persistence/persistence_all_de_sva-v{ver}.xlsx"))
## Starting combine_extracted_plots() with do_inverse as: FALSE.
## Plotting volcano plot of the DE results of Y_vs_N according to the columns: logFC and adj.P.Val using the expressionset colors.
## Plotting volcano plot of the DE results of Y_vs_N according to the columns: logFC and FDR using the expressionset colors.
persistence_monocyte_de_sva <- all_pairwise(persistence_monocyte, filter = TRUE, model_batch = "svaseq")
## This DE analysis will perform all pairwise comparisons among:
## 
##  N  Y 
##  2 10
## This analysis will include surrogate estimates from: svaseq.
## This will pre-filter the input data using normalize_expt's: TRUE argument.
## Removing 0 low-count genes (10326 remaining).
## Setting 46 low elements to zero.
## transform_counts: Found 46 values equal to 0, adding 1 to the matrix.
## Finished running DE analyses, collecting outputs.
## Comparing analyses.
persistence_monocyte_table_sva <- combine_de_tables(
    persistence_monocyte_de_sva,
    excel = glue::glue("analyses/4_tumaco/DE_Persistence/persistence_monocyte_de_sva-v{ver}.xlsx"))
## Starting combine_extracted_plots() with do_inverse as: FALSE.
## Plotting volcano plot of the DE results of Y_vs_N according to the columns: logFC and adj.P.Val using the expressionset colors.
## Plotting volcano plot of the DE results of Y_vs_N according to the columns: logFC and FDR using the expressionset colors.
persistence_neutrophil_de_sva <- all_pairwise(persistence_neutrophil, filter = TRUE, model_batch = "svaseq")
## This DE analysis will perform all pairwise comparisons among:
## 
## N Y 
## 3 7
## This analysis will include surrogate estimates from: svaseq.
## This will pre-filter the input data using normalize_expt's: TRUE argument.
## Removing 0 low-count genes (8392 remaining).
## Setting 46 low elements to zero.
## transform_counts: Found 46 values equal to 0, adding 1 to the matrix.
## Finished running DE analyses, collecting outputs.
## Comparing analyses.
persistence_neutrophil_table_sva <- combine_de_tables(
    persistence_neutrophil_de_sva,
    excel = glue::glue("analyses/4_tumaco/DE_Persistence/persistence_neutrophil_de_sva-v{ver}.xlsx"))
## Starting combine_extracted_plots() with do_inverse as: FALSE.
## Plotting volcano plot of the DE results of Y_vs_N according to the columns: logFC and adj.P.Val using the expressionset colors.
## Plotting volcano plot of the DE results of Y_vs_N according to the columns: logFC and FDR using the expressionset colors.
persistence_eosinophil_de_sva <- all_pairwise(persistence_eosinophil, filter = TRUE, model_batch = "svaseq")
## This DE analysis will perform all pairwise comparisons among:
## 
## N Y 
## 1 7
## This analysis will include surrogate estimates from: svaseq.
## This will pre-filter the input data using normalize_expt's: TRUE argument.
## Removing 0 low-count genes (10028 remaining).
## Setting 25 low elements to zero.
## transform_counts: Found 25 values equal to 0, adding 1 to the matrix.
## Finished running DE analyses, collecting outputs.
## Comparing analyses.
persistence_eosinophil_table_sva <- combine_de_tables(
    persistence_eosinophil_de_sva,
    excel = glue::glue("analyses/4_tumaco/DE_Persistence/persistence_eosinophil_de_sva-v{ver}.xlsx"))
## Starting combine_extracted_plots() with do_inverse as: FALSE.
## Plotting volcano plot of the DE results of Y_vs_N according to the columns: logFC and adj.P.Val using the expressionset colors.
## Plotting volcano plot of the DE results of Y_vs_N according to the columns: logFC and FDR using the expressionset colors.

8.5 Comparing visits without regard to cure/fail

8.5.1 All cell types

t_visit_all_de_sva <- all_pairwise(t_visit, filter = TRUE, model_batch = "svaseq")
## This DE analysis will perform all pairwise comparisons among:
## 
##  3  2  1 
## 34 35 40
## This analysis will include surrogate estimates from: svaseq.
## This will pre-filter the input data using normalize_expt's: TRUE argument.
## Removing 0 low-count genes (11907 remaining).
## Setting 9614 low elements to zero.
## transform_counts: Found 9614 values equal to 0, adding 1 to the matrix.
## Finished running DE analyses, collecting outputs.
## Comparing analyses.

t_visit_all_table_sva <- combine_de_tables(
    t_visit_all_de_sva, keepers = visit_contrasts,
    rda=glue::glue("rda/t_all_visit_table_sva-v{ver}.rda"),
    excel = glue::glue("analyses/4_tumaco/DE_Visits/t_all_visit_tables_sva-v{ver}.xlsx"))
## Starting combine_extracted_plots() with do_inverse as: FALSE.
## Plotting volcano plot of the DE results of c2_vs_c1 according to the columns: logFC and adj.P.Val using the expressionset colors.
## Plotting volcano plot of the DE results of c2_vs_c1 according to the columns: logFC and FDR using the expressionset colors.
## Starting combine_extracted_plots() with do_inverse as: FALSE.
## Plotting volcano plot of the DE results of c3_vs_c1 according to the columns: logFC and adj.P.Val using the expressionset colors.
## Plotting volcano plot of the DE results of c3_vs_c1 according to the columns: logFC and FDR using the expressionset colors.
## Starting combine_extracted_plots() with do_inverse as: FALSE.
## Plotting volcano plot of the DE results of c3_vs_c2 according to the columns: logFC and adj.P.Val using the expressionset colors.
## Plotting volcano plot of the DE results of c3_vs_c2 according to the columns: logFC and FDR using the expressionset colors.
## Saving de result as t_all_visit_table_sva-v202212 to rda/t_all_visit_table_sva-v202212.rda.
t_visit_all_sig_sva <- extract_significant_genes(
    t_visit_all_table_sva,
    excel = glue::glue("analyses/4_tumaco/DE_Visits/t_all_visit_sig_sva-v{ver}.xlsx"))
## Plotting volcano plot of the DE results of c2_vs_c1 according to the columns: logFC and FDR using the expressionset colors.
## Plotting volcano plot of the DE results of c3_vs_c1 according to the columns: logFC and FDR using the expressionset colors.
## Plotting volcano plot of the DE results of c3_vs_c2 according to the columns: logFC and FDR using the expressionset colors.
## Plotting volcano plot of the DE results of c2_vs_c1 according to the columns: logFC and adj.P.Val using the expressionset colors.
## Plotting volcano plot of the DE results of c3_vs_c1 according to the columns: logFC and adj.P.Val using the expressionset colors.
## Plotting volcano plot of the DE results of c3_vs_c2 according to the columns: logFC and adj.P.Val using the expressionset colors.

8.5.2 Monocyte samples

t_visit_monocytes <- set_expt_conditions(t_monocytes, fact="visitnumber")
t_visit_monocyte_de_sva <- all_pairwise(t_visit_monocytes, filter = TRUE, model_batch = "svaseq")
## This DE analysis will perform all pairwise comparisons among:
## 
##  3  2  1 
## 13 13 16
## This analysis will include surrogate estimates from: svaseq.
## This will pre-filter the input data using normalize_expt's: TRUE argument.
## Removing 0 low-count genes (10859 remaining).
## Setting 648 low elements to zero.
## transform_counts: Found 648 values equal to 0, adding 1 to the matrix.
## Finished running DE analyses, collecting outputs.
## Comparing analyses.

t_visit_monocyte_table_sva <- combine_de_tables(
    t_visit_monocyte_de_sva, keepers = visit_contrasts,
    rda=glue::glue("rda/t_monocyte_visit_table_sva-v{ver}.rda"),
    excel = glue::glue("analyses/4_tumaco/DE_Visits/Monocytes/t_monocyte_visit_tables_sva-v{ver}.xlsx"))
## Starting combine_extracted_plots() with do_inverse as: FALSE.
## Plotting volcano plot of the DE results of c2_vs_c1 according to the columns: logFC and adj.P.Val using the expressionset colors.
## Plotting volcano plot of the DE results of c2_vs_c1 according to the columns: logFC and FDR using the expressionset colors.
## Starting combine_extracted_plots() with do_inverse as: FALSE.
## Plotting volcano plot of the DE results of c3_vs_c1 according to the columns: logFC and adj.P.Val using the expressionset colors.
## Plotting volcano plot of the DE results of c3_vs_c1 according to the columns: logFC and FDR using the expressionset colors.
## Starting combine_extracted_plots() with do_inverse as: FALSE.
## Plotting volcano plot of the DE results of c3_vs_c2 according to the columns: logFC and adj.P.Val using the expressionset colors.
## Plotting volcano plot of the DE results of c3_vs_c2 according to the columns: logFC and FDR using the expressionset colors.
## Saving de result as t_monocyte_visit_table_sva-v202212 to rda/t_monocyte_visit_table_sva-v202212.rda.
t_visit_monocyte_sig_sva <- extract_significant_genes(
    t_visit_monocyte_table_sva,
    excel = glue::glue("analyses/4_tumaco/DE_Visits/Monocytes/t_monocyte_visit_sig_sva-v{ver}.xlsx"))
## Plotting volcano plot of the DE results of c2_vs_c1 according to the columns: logFC and FDR using the expressionset colors.
## Plotting volcano plot of the DE results of c3_vs_c1 according to the columns: logFC and FDR using the expressionset colors.
## Plotting volcano plot of the DE results of c3_vs_c2 according to the columns: logFC and FDR using the expressionset colors.
## Plotting volcano plot of the DE results of c2_vs_c1 according to the columns: logFC and adj.P.Val using the expressionset colors.
## Plotting volcano plot of the DE results of c3_vs_c1 according to the columns: logFC and adj.P.Val using the expressionset colors.
## Plotting volcano plot of the DE results of c3_vs_c2 according to the columns: logFC and adj.P.Val using the expressionset colors.

8.5.3 Neutrophil samples

t_visit_neutrophils <- set_expt_conditions(t_neutrophils, fact="visitnumber")
t_visit_neutrophil_de_sva <- all_pairwise(t_visit_neutrophils, filter = TRUE, model_batch = "svaseq")
## This DE analysis will perform all pairwise comparisons among:
## 
##  3  2  1 
## 12 13 16
## This analysis will include surrogate estimates from: svaseq.
## This will pre-filter the input data using normalize_expt's: TRUE argument.
## Removing 0 low-count genes (9099 remaining).
## Setting 589 low elements to zero.
## transform_counts: Found 589 values equal to 0, adding 1 to the matrix.
## Finished running DE analyses, collecting outputs.
## Comparing analyses.

t_visit_neutrophil_table_sva <- combine_de_tables(
    t_visit_neutrophil_de_sva, keepers = visit_contrasts,
    rda=glue::glue("rda/t_neutrophil_visit_table_sva-v{ver}.rda"),
    excel = glue::glue("analyses/4_tumaco/DE_Visits/Neutrophils/t_neutrophil_visit_table_sva-v{ver}.xlsx"))
## Starting combine_extracted_plots() with do_inverse as: FALSE.
## Plotting volcano plot of the DE results of c2_vs_c1 according to the columns: logFC and adj.P.Val using the expressionset colors.
## Plotting volcano plot of the DE results of c2_vs_c1 according to the columns: logFC and FDR using the expressionset colors.
## Starting combine_extracted_plots() with do_inverse as: FALSE.
## Plotting volcano plot of the DE results of c3_vs_c1 according to the columns: logFC and adj.P.Val using the expressionset colors.
## Plotting volcano plot of the DE results of c3_vs_c1 according to the columns: logFC and FDR using the expressionset colors.
## Starting combine_extracted_plots() with do_inverse as: FALSE.
## Plotting volcano plot of the DE results of c3_vs_c2 according to the columns: logFC and adj.P.Val using the expressionset colors.
## Plotting volcano plot of the DE results of c3_vs_c2 according to the columns: logFC and FDR using the expressionset colors.
## Saving de result as t_neutrophil_visit_table_sva-v202212 to rda/t_neutrophil_visit_table_sva-v202212.rda.
t_visit_neutrophil_sig_sva <- extract_significant_genes(
    t_visit_neutrophil_table_sva,
    excel = glue::glue("analyses/4_tumaco/DE_Visits/Neutrophils/t_neutrophil_visit_sig_sva-v{ver}.xlsx"))
## Plotting volcano plot of the DE results of c2_vs_c1 according to the columns: logFC and FDR using the expressionset colors.
## Plotting volcano plot of the DE results of c3_vs_c1 according to the columns: logFC and FDR using the expressionset colors.
## Plotting volcano plot of the DE results of c3_vs_c2 according to the columns: logFC and FDR using the expressionset colors.
## Plotting volcano plot of the DE results of c2_vs_c1 according to the columns: logFC and adj.P.Val using the expressionset colors.
## Plotting volcano plot of the DE results of c3_vs_c1 according to the columns: logFC and adj.P.Val using the expressionset colors.
## Plotting volcano plot of the DE results of c3_vs_c2 according to the columns: logFC and adj.P.Val using the expressionset colors.

8.5.4 Eosinophil samples

t_visit_eosinophils <- set_expt_conditions(t_eosinophils, fact="visitnumber")
t_visit_eosinophil_de <- all_pairwise(t_visit_eosinophils, filter = TRUE, model_batch = "svaseq")
## This DE analysis will perform all pairwise comparisons among:
## 
## 3 2 1 
## 9 9 8
## This analysis will include surrogate estimates from: svaseq.
## This will pre-filter the input data using normalize_expt's: TRUE argument.
## Removing 0 low-count genes (10530 remaining).
## Setting 272 low elements to zero.
## transform_counts: Found 272 values equal to 0, adding 1 to the matrix.
## Finished running DE analyses, collecting outputs.
## Comparing analyses.

t_visit_eosinophil_table <- combine_de_tables(
    t_visit_eosinophil_de, keepers = visit_contrasts,
    rda=glue::glue("rda/t_eosinophil_visit_table_sva-v{ver}.rda"),
    excel = glue::glue("analyses/4_tumaco/DE_Visits/Eosinophils/t_eosinophil_visit_table_sva-v{ver}.xlsx"))
## Starting combine_extracted_plots() with do_inverse as: FALSE.
## Plotting volcano plot of the DE results of c2_vs_c1 according to the columns: logFC and adj.P.Val using the expressionset colors.
## Plotting volcano plot of the DE results of c2_vs_c1 according to the columns: logFC and FDR using the expressionset colors.
## Starting combine_extracted_plots() with do_inverse as: FALSE.
## Plotting volcano plot of the DE results of c3_vs_c1 according to the columns: logFC and adj.P.Val using the expressionset colors.
## Plotting volcano plot of the DE results of c3_vs_c1 according to the columns: logFC and FDR using the expressionset colors.
## Starting combine_extracted_plots() with do_inverse as: FALSE.
## Plotting volcano plot of the DE results of c3_vs_c2 according to the columns: logFC and adj.P.Val using the expressionset colors.
## Plotting volcano plot of the DE results of c3_vs_c2 according to the columns: logFC and FDR using the expressionset colors.
## Saving de result as t_eosinophil_visit_table_sva-v202212 to rda/t_eosinophil_visit_table_sva-v202212.rda.
t_visit_eosinophil_sig <- extract_significant_genes(
    t_visit_eosinophil_table,
    excel = glue::glue("analyses/4_tumaco/DE_Visits/Eosinophils/t_eosinophil_visit_sig_sva-v{ver}.xlsx"))
## Plotting volcano plot of the DE results of c2_vs_c1 according to the columns: logFC and FDR using the expressionset colors.
## Plotting volcano plot of the DE results of c3_vs_c1 according to the columns: logFC and FDR using the expressionset colors.
## Plotting volcano plot of the DE results of c3_vs_c2 according to the columns: logFC and FDR using the expressionset colors.
## Plotting volcano plot of the DE results of c2_vs_c1 according to the columns: logFC and adj.P.Val using the expressionset colors.
## Plotting volcano plot of the DE results of c3_vs_c1 according to the columns: logFC and adj.P.Val using the expressionset colors.
## Plotting volcano plot of the DE results of c3_vs_c2 according to the columns: logFC and adj.P.Val using the expressionset colors.

9 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")
if (!isTRUE(get0("skip_load"))) {
  pander::pander(sessionInfo())
  message(paste0("This is hpgltools commit: ", get_git_commit()))
  message(paste0("Saving to ", savefile))
  tmp <- sm(saveme(filename=savefile))
}
## If you wish to reproduce this exact build of hpgltools, invoke the following:
## > git clone http://github.com/abelew/hpgltools.git
## > git reset f667fa3c9cf70499d2e286e5a727b8507bd03956
## This is hpgltools commit: Thu Dec 8 10:24:14 2022 -0500: f667fa3c9cf70499d2e286e5a727b8507bd03956
## Saving to tmrc3_differential_expression_202212.rda.xz
tmp <- loadme(filename=savefile)
LS0tCnRpdGxlOiAiTC4gcGFuYW1lbnNpcyAyMDIyMTI6IFRNUkMzIERpZmZlcmVudGlhbCBFeHByZXNzaW9uIGFuYWx5c2VzIgphdXRob3I6ICJhdGIgYWJlbGV3QGdtYWlsLmNvbSIKZGF0ZTogImByIFN5cy5EYXRlKClgIgpydW50aW1lOiBzaGlueQpvdXRwdXQ6CiAgaHRtbF9kb2N1bWVudDoKICAgIGNvZGVfZG93bmxvYWQ6IHRydWUKICAgIGNvZGVfZm9sZGluZzogc2hvdwogICAgZmlnX2NhcHRpb246IHRydWUKICAgIGZpZ19oZWlnaHQ6IDcKICAgIGZpZ193aWR0aDogNwogICAgaGlnaGxpZ2h0OiBkZWZhdWx0CiAgICBrZWVwX21kOiBmYWxzZQogICAgbW9kZTogc2VsZmNvbnRhaW5lZAogICAgbnVtYmVyX3NlY3Rpb25zOiB0cnVlCiAgICBzZWxmX2NvbnRhaW5lZDogdHJ1ZQogICAgdGhlbWU6IHJlYWRhYmxlCiAgICB0b2M6IHRydWUKICAgIHRvY19mbG9hdDoKICAgICAgY29sbGFwc2VkOiBmYWxzZQogICAgICBzbW9vdGhfc2Nyb2xsOiBmYWxzZQotLS0KCjxzdHlsZT4KICBib2R5IC5tYWluLWNvbnRhaW5lciB7CiAgICBtYXgtd2lkdGg6IDE2MDBweDsKICB9Cjwvc3R5bGU+CgpgYGB7ciBvcHRpb25zLCBpbmNsdWRlPUZBTFNFfQpsaWJyYXJ5KGhwZ2x0b29scykKbGlicmFyeShkcGx5cikKbGlicmFyeShmb3JjYXRzKQp0dCA8LSBzbShkZXZ0b29sczo6bG9hZF9hbGwoIn4vaHBnbHRvb2xzIikpCmtuaXRyOjpvcHRzX2tuaXQkc2V0KHByb2dyZXNzPVRSVUUsCiAgICAgICAgICAgICAgICAgICAgIHZlcmJvc2U9VFJVRSwKICAgICAgICAgICAgICAgICAgICAgd2lkdGg9OTAsCiAgICAgICAgICAgICAgICAgICAgIGVjaG89VFJVRSkKa25pdHI6Om9wdHNfY2h1bmskc2V0KGVycm9yPVRSVUUsCiAgICAgICAgICAgICAgICAgICAgICBmaWcud2lkdGg9OCwKICAgICAgICAgICAgICAgICAgICAgIGZpZy5oZWlnaHQ9OCwKICAgICAgICAgICAgICAgICAgICAgIGRwaT05NikKb2xkX29wdGlvbnMgPC0gb3B0aW9ucyhkaWdpdHM9NCwKICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmdzQXNGYWN0b3JzPUZBTFNFLAogICAgICAgICAgICAgICAgICAgICAgIGtuaXRyLmR1cGxpY2F0ZS5sYWJlbD0iYWxsb3ciKQpnZ3Bsb3QyOjp0aGVtZV9zZXQoZ2dwbG90Mjo6dGhlbWVfYncoYmFzZV9zaXplPTEyKSkKdmVyIDwtICIyMDIyMTIiCnByZXZpb3VzX2ZpbGUgPC0gIiIKcnVuZGF0ZSA8LSBmb3JtYXQoU3lzLkRhdGUoKSwgZm9ybWF0PSIlWSVtJWQiKQoKIyN0bXAgPC0gdHJ5KHNtKGxvYWRtZShmaWxlbmFtZT1nc3ViKHBhdHRlcm49IlxcLlJtZCIsIHJlcGxhY2U9IlxcLnJkYVxcLnh6IiwgeD1wcmV2aW91c19maWxlKSkpKQpybWRfZmlsZSA8LSBnbHVlOjpnbHVlKCJ0bXJjM19kaWZmZXJlbnRpYWxfZXhwcmVzc2lvbl97dmVyfS5SbWQiKQpzYXZlZmlsZSA8LSBnc3ViKHBhdHRlcm49IlxcLlJtZCIsIHJlcGxhY2U9IlxcLnJkYVxcLnh6IiwgeD1ybWRfZmlsZSkKbG9hZGVkIDwtIGxvYWQoZmlsZT1nbHVlOjpnbHVlKCJyZGEvdG1yYzNfZGF0YV9zdHJ1Y3R1cmVzLXZ7dmVyfS5yZGEiKSkKYGBgCgojIENoYW5nZWxvZwoKKiBTdGlsbCBodW50aW5nIGZvciBtZXNzZWQgdXAgY29sb3JzLCBjaGFuZ2VkIGlucHV0IGRhdGEgdG8gbWF0Y2ggbmV3IHZlcnNpb24uCgojIFRPRE8KCkFsc28gc29tZSBUTVJDMjoKClNvbWUgY29uY2VybiBhYm91dCBtYWNyb3BoYWdlIGRvY3VtZW50IGFuZCBob3cgdG8gbW92ZSBpdCBmb3J3YXJkLgpNYXJpYSBBZGVsYWlkYSB3aWxsIHBpY2sgdXAgdGhlIHZhcmlhbnQgVE1SQzIgZGF0YS4gIERlZmluaW5nIHBhcmFzaXRlCnBvcHVsYXRpb25zIHZpYSB2YXJpYW50cyBhbmQgdHlwaW5nLgoKUmV2aWV3IHRleHQgb24gU1ZzIGFuZCBsb2FkaW5ncyBpbiBtZXRob2RzIG9mIGN1cnJlbnQgZG9jdW1lbnQuCgpSZXZpc2l0IHRoZSBUTVJDMiBwb3dlcnBvaW50IGFuZCBtYWtlIHN1cmUgdGhhdCBpdCBpbmNsdWRlcyBERSB0YWJsZXMucAoKIyBJbnRyb2R1Y3Rpb24KClRoZSB2YXJpb3VzIGRpZmZlcmVudGlhbCBleHByZXNzaW9uIGFuYWx5c2VzIG9mIHRoZSBkYXRhIGdlbmVyYXRlZCBpbiB0bXJjM19kYXRhc2V0cwp3aWxsIG9jY3VyIGluIHRoaXMgZG9jdW1lbnQuCgojIyBOYW1pbmcgY29udmVudGlvbnMKCkkgYW0gZ29pbmcgdG8gdHJ5IHRvIHN0YW5kYXJkaXplIGhvdyBJIG5hbWUgdGhlIHZhcmlvdXMgZGF0YQpzdHJ1Y3R1cmVzIGNyZWF0ZWQgaW4gdGhpcyBkb2N1bWVudC4gIE1vc3Qgb2YgdGhlIGxhcmdlIGRhdGEgY3JlYXRlZAphcmUgZWl0aGVyIHNldHMgb2YgZGlmZmVyZW50aWFsIGV4cHJlc3Npb24gYW5hbHlzZXMsIHRoZWlyIGNvbWJpbmVkCnJlc3VsdHMsIG9yIHRoZSBzZXQgb2YgcmVzdWx0cyBkZWVtZWQgJ3NpZ25pZmljYW50Jy4KCkhvcGVmdWxseSBieSBub3cgdGhleSBhbGwgZm9sbG93IHRoZXNlIGd1aWRlbGluZXM6Cgp7Y2xpbmljKHMpfV9zYW1wbGUtc3Vic2V0fV97cHJpbWFyeS1xdWVzdGlvbihzKX1fe2RhdGF0eXBlfV97YmF0Y2gtbWV0aG9kfQoKKiB7Y2xpbmljfTogVGhpcyBpcyBlaXRoZXIgdGMgb3IgdCBmb3IgVHVtYWNvIGFuZCBDYWxpLCBvciBqdXN0CiAgVHVtYWNvLgoqIHtzYW1wbGUtc3Vic2V0fTogVGhpbmdzIGxpa2UgJ2FsbCcgb3IgJ21vbm9jeXRlcycuCioge3ByaW1hcnktcXVlc3Rpb259OiBTaG9ydGhhbmQgbmFtZSBmb3IgdGhlIHByaW1hcnkgY29udHJhc3RzCiAgcGVyZm9ybWVkLCB0aHVzICdjbGluaWNzJyB3b3VsZCBzdWdnZXN0IGEgY29tcGFyaXNvbiBvZiBUdW1hY28KICB2cy4gQ2FsaS4gICd2aXNpdHMnIHdvdWxkIGNvbXBhcmUgdjIvdjEsIGV0Yy4KKiB7ZGF0YXR5cGV9OiBkZSwgdGFibGUsIHNpZwoqIHtiYXRjaC10eXBlfTogbm9iYXRjaCwgYmF0Y2h7ZmFjdG9yfSwgc3ZhLiAge2ZhY3Rvcn0gaW4gdGhpcwogIGluc3RhbmNlIHNob3VsZCBiZSBhIGNvbHVtbiBmcm9tIHRoZSBtZXRhZGF0YS4KCldpdGggdGhpcyBpbiBtaW5kLCAndGNfYmlvcHNpZXNfY2xpbmljX2RlX3N2YScgc2hvdWxkIGJlIHRoZSBUdW1hY28rQ2FsaQpiaW9wc3kgZGF0YSBhZnRlciBwZXJmb3JtaW5nIHRoZSBkaWZmZXJlbnRpYWwgZXhwcmVzc2lvbiBhbmFseXNlcwpjb21wYXJpbmcgdGhlIGNsaW5pY3MgdXNpbmcgc3ZhLgoKSSBzdXNwZWN0IHRoZXJlIHJlbWFpbiBzb21lIGV4Y2VwdGlvbnMgYW5kL29yIGVycm9ycy4KCiMjIERlZmluZSBjb250cmFzdHMgZm9yIERFIGFuYWx5c2VzCgpFYWNoIG9mIHRoZSBmb2xsb3dpbmcgbGlzdHMgZGVzY3JpYmVzIHRoZSBzZXQgb2YgY29udHJhc3RzIHRoYXQgSQp0aGluayBhcmUgaW50ZXJlc3RpbmcgZm9yIHRoZSB2YXJpb3VzIHdheXMgb25lIG1pZ2h0IGNvbnNpZGVyIHRoZQpUTVJDMyBkYXRhc2V0LiAgVGhlIHZhcmlhYmxlcyBhcmUgbmFtZWQgYWNjb3JkaW5nIHRvIHRoZSBhc3N1bWVkIGRhdGEKd2l0aCB3aGljaCB0aGV5IHdpbGwgYmUgdXNlZCwgdGh1cyB0Y19jZl9jb250cmFzdHMgaXMgZXhwZWN0ZWQgdG8gYmUKdXNlZCBmb3IgdGhlIFR1bWFjbytDYWxpIGRhdGEgYW5kIHByb3ZpZGUgYSBzZXJpZXMgb2YgY3VyZS9mYWlsCmNvbXBhcmlzb25zIHdoaWNoICh0byB0aGUgZXh0ZW50IHBvc3NpYmxlKSBhY3Jvc3MgYm90aCBsb2NhdGlvbnMuICBJbgpldmVyeSBjYXNlLCB0aGUgbmFtZSBvZiB0aGUgbGlzdCBlbGVtZW50IHdpbGwgYmUgdXNlZCBhcyB0aGUgY29udHJhc3QKbmFtZSwgYW5kIHdpbGwgdGh1cyBiZSBzZWVuIGFzIHRoZSBzaGVldCBuYW1lIGluIHRoZSBvdXRwdXQgeGxzeApmaWxlKHMpOyB0aGUgdHdvIHBpZWNlcyBvZiB0aGUgY2hhcmFjdGVyIHZlY3RvciB2YWx1ZSBhcmUgdGhlCm51bWVyYXRvciBhbmQgZGVub21pbmF0b3Igb2YgdGhlIGFzc29jaWF0ZWQgY29udHJhc3QuCgpgYGB7ciBzZXR1cF9jb250cmFzdHN9CmNsaW5pY19jb250cmFzdHMgPC0gbGlzdCgKICAgICJjbGluaWNzIiA9IGMoIkNhbGkiLCAiVHVtYWNvIikpCiMjIEluIHNvbWUgY2FzZXMgd2UgaGF2ZSBubyBDYWxpIGZhaWx1cmUgc2FtcGxlcywgc28gdGhlcmUgcmVtYWluIG9ubHkgMgojIyBjb250cmFzdHMgdGhhdCBhcmUgbGlrZWx5IG9mIGludGVyZXN0CnRjX2NmX2NvbnRyYXN0cyA8LSBsaXN0KAogICAgInR1bWFjbyIgPSBjKCJUdW1hY29mYWlsdXJlIiwgIlR1bWFjb2N1cmUiKSwKICAgICJjdXJlIiA9IGMoIlR1bWFjb2N1cmUiLCAiQ2FsaWN1cmUiKSkKIyMgSW4gb3RoZXIgY2FzZXMsIHdlIGhhdmUgY3VyZS9mYWlsIGZvciBib3RoIHBsYWNlcy4KY2xpbmljX2NmX2NvbnRyYXN0cyA8LSBsaXN0KAogICAgImNhbGkiID0gYygiQ2FsaWZhaWx1cmUiLCAiQ2FsaWN1cmUiKSwKICAgICJ0dW1hY28iID0gYygiVHVtYWNvZmFpbHVyZSIsICJUdW1hY29jdXJlIiksCiAgICAiY3VyZSIgPSBjKCJUdW1hY29jdXJlIiwgIkNhbGljdXJlIiksCiAgICAiZmFpbCIgPSBjKCJUdW1hY29mYWlsdXJlIiwgIkNhbGlmYWlsdXJlIikpCmNmX2NvbnRyYXN0IDwtIGxpc3QoCiAgICAib3V0Y29tZSIgPSBjKCJUdW1hY29mYWlsdXJlIiwgIlR1bWFjb2N1cmUiKSkKdF9jZl9jb250cmFzdCA8LSBsaXN0KAogICAgIm91dGNvbWUiID0gYygiZmFpbHVyZSIsICJjdXJlIikpCnZpc2l0Y2ZfY29udHJhc3RzIDwtIGxpc3QoCiAgICAidjFjZiIgPSBjKCJ2MWZhaWx1cmUiLCAidjFjdXJlIiksCiAgICAidjJjZiIgPSBjKCJ2MmZhaWx1cmUiLCAidjJjdXJlIiksCiAgICAidjNjZiIgPSBjKCJ2M2ZhaWx1cmUiLCAidjNjdXJlIikpCnZpc2l0X2NvbnRyYXN0cyA8LSBsaXN0KAogICAgInYydjEiID0gYygiYzIiLCAiYzEiKSwKICAgICJ2M3YxIiA9IGMoImMzIiwgImMxIiksCiAgICAidjN2MiIgPSBjKCJjMyIsICJjMiIpKQpgYGAKCiMgQ29tcGFyZSBzYW1wbGVzIGJ5IGNsaW5pYwoKIyMgREU6IENvbXBhcmUgY2xpbmljcywgYWxsIHNhbXBsZXMKClBlcmZvcm0gYSBzdmFzZXEtZ3VpZGVkIGNvbXBhcmlzb24gb2YgdGhlIHR3byBjbGluaWNzLiAgSWRlYWxseSB0aGlzCndpbGwgZ2l2ZSBzb21lIGNsdWUgYWJvdXQganVzdCBob3cgc3Ryb25nIHRoZSBjbGluaWMtYmFzZWQgYmF0Y2gKZWZmZWN0IHJlYWxseSBpcyBhbmQgd2hhdCBpdHMgY2F1c2VzIGFyZS4KCmBgYHtyIGNsaW5pY19jb21wYXJpc29uc19hbGx9CnRjX2NsaW5pY190eXBlIDwtIHRjX3ZhbGlkICU+JQogIHNldF9leHB0X2NvbmRpdGlvbnMoZmFjdD0iY2xpbmljIikgJT4lCiAgc2V0X2V4cHRfYmF0Y2hlcyhmYWN0PSJ0eXBlb2ZjZWxscyIpCgp0YWJsZShwRGF0YSh0Y19jbGluaWNfdHlwZSlbWyJjb25kaXRpb24iXV0pCnRjX2FsbF9jbGluaWNfZGVfc3ZhIDwtIGFsbF9wYWlyd2lzZSh0Y19jbGluaWNfdHlwZSwgbW9kZWxfYmF0Y2g9InN2YXNlcSIsIGZpbHRlcj1UUlVFLCBwYXJhbGxlbD1GQUxTRSkKdGNfYWxsX2NsaW5pY19kZV9zdmFbWyJkZXNlcSJdXVtbImNvbnRyYXN0c19wZXJmb3JtZWQiXV0KCnRjX2FsbF9jbGluaWNfdGFibGVfc3ZhIDwtIGNvbWJpbmVfZGVfdGFibGVzKAogICAgdGNfYWxsX2NsaW5pY19kZV9zdmEsIGtlZXBlcnM9Y2xpbmljX2NvbnRyYXN0cywKICAgIHJkYT1nbHVlOjpnbHVlKCJyZGEvdGNfYWxsX2NsaW5pY190YWJsZV9zdmEtdnt2ZXJ9LnJkYSIpLAogICAgZXhjZWw9Z2x1ZTo6Z2x1ZSgiYW5hbHlzZXMvM19jYWxpX2FuZF90dW1hY28vY29tcGFyZV9jbGluaWNzL3RjX2FsbF9jbGluaWNfdGFibGVfc3ZhLXZ7dmVyfS54bHN4IikpCnRjX2FsbF9jbGluaWNfc2lnX3N2YSA8LSBleHRyYWN0X3NpZ25pZmljYW50X2dlbmVzKAogICAgdGNfYWxsX2NsaW5pY190YWJsZV9zdmEsCiAgICBleGNlbD1nbHVlOjpnbHVlKCJhbmFseXNlcy8zX2NhbGlfYW5kX3R1bWFjby9jb21wYXJlX2NsaW5pY3MvdGNfY2xpbmljX3R5cGVfc2lnX3N2YS12e3Zlcn0ueGxzeCIpKQpgYGAKCiMjIyBWaXN1YWxpemUgY2xpbmljIGRpZmZlcmVuY2VzCgpMZXQgdXMgdGFrZSBhIHF1aWNrIGxvb2sgYXQgdGhlIHJlc3VsdHMgb2YgdGhlIGNvbXBhcmlzb24gb2YKVHVtYWNvL0NhbGkKCk5vdGU6IEkga2VlcCByZS1pbnRyb2R1Y2luZyBhbiBlcnJvciB3aGljaCBjYXVzZXMgdGhlc2UgKHZvbGNhbm8gYW5kIE1BKSBwbG90cyB0byBiZQpyZXZlcnNlZCB3aXRoIHJlc3BlY3QgdG8gdGhlIGxvZ0ZDIHZhbHVlcy4gIFBheSBjYXJlZnVsIGF0dGVudGlvbiB0bwp0aGVzZSBhbmQgbWFrZSBzdXJlIHRoYXQgdGhleSBhZ3JlZSB3aXRoIHRoZSBudW1iZXJzIG9mIGdlbmVzIG9ic2VydmVkCmluIHRoZSBjb250cmFzdC4KCmBgYHtyIGNvbXBhcmVfY2xpbmljX3Zpc3VhbGl6YXRpb259CiMjIENoZWNrIHRoYXQgdXAgaXMgdXAKc3VtbWFyeSh0Y19hbGxfY2xpbmljX3RhYmxlX3N2YVtbImRhdGEiXV1bWyJjbGluaWNzIl1dW1siZGVzZXFfbG9nZmMiXV0pCiMjIEkgdGhpbmsgd2UgY2FuIGFzc3VtZSB0aGF0IG1vc3QgZ2VuZXMgYXJlIGRvd24gd2hlbiBjb25zaWRlcmluZyBUdW1hY28vQ2FsaS4Kc3VtKHRjX2FsbF9jbGluaWNfdGFibGVfc3ZhJGRhdGEkY2xpbmljcyRkZXNlcV9sb2dmYyA8IC0xICYgdGNfYWxsX2NsaW5pY190YWJsZV9zdmEkZGF0YSRjbGluaWNzJGRlc2VxX2FkanAgPCAwLjA1KQoKdGNfYWxsX2NsaW5pY190YWJsZV9zdmFbWyJwbG90cyJdXVtbImNsaW5pY3MiXV1bWyJkZXNlcV92b2xfcGxvdHMiXV1bWyJwbG90Il1dCiMjIE9rLCBzbyBpdCBzYXlzIDE3OTQgdXAsIGJ1dCB0aGF0IGlzIGNsZWFybHkgdGhlIGRvd24gc2lkZS4uLiAgU29tZXRoaW5nIGlzIGRlZmluaXRlbHkgbWVzc2VkIHVwLgojIyBUaGUgcG9pbnRzIGFyZSBvbiB0aGUgY29ycmVjdCBzaWRlcyBvZiB0aGUgcGxvdCwgYnV0IHRoZSBjYXRlZ29yaWVzIG9mIHVwL2Rvd24gYXJlIHJldmVyc2VkLgojIyBUaGVyZXNhIG5vdGVkIHRoYXQgc2hlIGNvbG9ycyBkaWZmZXJlbnRseSwgYW5kIEkgdGhpbmsgYmV0dGVyOiBsZWZ0IHNpZGUgZ2V0cyBjYWxsZWQKIyMgJ2luY3JlYXNlZCBpbiBkZW5vbWluYXRvcicsIHJpZ2h0IHNpZGUgZ2V0cyBjYWxsZWQgJ2luY3JlYXNlZCBpbiBudW1lcmF0b3InOwojIyB0aGVzZSB0d28gZ3JvdXBzIGFyZSBjb2xvcmVkIGFjY29yZGluZyB0byB0aGVpciBjb25kaXRpb24gY29sb3JzLCBhbmQgZXZlcnl0aGluZyBlbHNlIGlzIGdyYXkuCiMjIEkgYW0gY2hlY2tpbmcgb3V0IFRoZXJlc2EncyBoZWxwZXJfZnVuY3Rpb25zLlIgdG8gZ2V0IGEgc2Vuc2Ugb2YgaG93IHNoZSBoYW5kbGVzIHRoaXMsIEkgdGhpbmsKIyMgSSBjYW4gdXNlIGEgdmFyaWFudCBvZiBoZXIgaWRlYSBwcmV0dHkgZWFzaWx5OgojIyAgMS4gIEFkZCBhIGNvbHVtbiAnU2lnbmlmaWNhbmNlJywgd2hpY2ggaXMgYSBmYWN0b3IsIGFuZCBjb250YWlucyBlaXRoZXIgJ05vdCBlbnJpY2hlZCcsCiMjICAgICAgJ0VucmljaGVkIGluIHgnLCBvciAnRW5yaWNoZWQgaW4geScgYWNjb3JkaW5nIHRvIHRoZSBsb2dmYy9hZGpwLgojIyAgMi4gIHVzZSB0aGUgc2lnbmlmaWNhbmNlIGNvbHVtbiBmb3IgdGhlIGdlb21fcG9pbnQgY29sb3IvZmlsbCBpbiB0aGUgdm9sY2FubyBwbG90LgojIyBNeSBjaGFuZ2UgdG8gdGhpcyBpZGVhIHdvdWxkIGJlIHRvIGV4dHJhY3QgdGhlIGNvbG9ycyBmcm9tIHRoZSBpbnB1dCBleHByZXNzaW9uc2V0LgoKYGBgCgojIyMgT250b2xvZ3kgU2VhcmNoIGJ5IGNsaW5pYwoKYGBge3IgZ3Byb2ZpbGVyX2NsaW5pY30KaW5jcmVhc2VkX3R1bWFjb19jYXRlZ29yaWVzIDwtIHNpbXBsZV9ncHJvZmlsZXIodGNfYWxsX2NsaW5pY19zaWdfc3ZhW1siZGVzZXEiXV1bWyJ1cHMiXV1bWyJjbGluaWNzIl1dKQppbmNyZWFzZWRfdHVtYWNvX2NhdGVnb3JpZXNbWyJwdmFsdWVfcGxvdHMiXV1bWyJCUCJdXQoKaW5jcmVhc2VkX2NhbGlfY2F0ZWdvcmllcyA8LSBzaW1wbGVfZ3Byb2ZpbGVyKHRjX2FsbF9jbGluaWNfc2lnX3N2YVtbImRlc2VxIl1dW1siZG93bnMiXV1bWyJjbGluaWNzIl1dKQppbmNyZWFzZWRfY2FsaV9jYXRlZ29yaWVzW1sicHZhbHVlX3Bsb3RzIl1dW1siQlAiXV0KYGBgCgpUaGVyZSBhcHBlYXIgdG8gYmUgbWFueSBtb3JlIGdlbmVzIHdoaWNoIGFyZSBpbmNyZWFzZWQgaW4gdGhlIFR1bWFjbwpzYW1wbGVzIHdpdGggcmVzcGVjdCB0byB0aGUgQ2FsaSBzYW1wbGVzLgoKIyMgREU6IENvbXBhcmUgY2xpbmljcywgZW9zaW5vcGhpbCBzYW1wbGVzCgpUaGUgcmVtYWluaW5nIGNlbGwgdHlwZXMgYWxsIGhhdmUgcHJldHR5IHN0cm9uZyBjbGluaWMtYmFzZWQgdmFyaWFuY2U7CmJ1dCBJIGFtIG5vdCBjZXJ0YWluIGlmIGl0IGlzIGNvbnNpc3RlbnQgYWNyb3NzIGNlbGwgdHlwZXMuCgpgYGB7ciB0Y19lb3Npbm9waGlsc19kZX0KdGFibGUocERhdGEodGNfZW9zaW5vcGhpbHMpW1siY29uZGl0aW9uIl1dKQp0Y19lb3Npbm9waGlsc19jbGluaWNfZGVfbm9iYXRjaCA8LSBhbGxfcGFpcndpc2UodGNfZW9zaW5vcGhpbHMsIG1vZGVsX2JhdGNoPUZBTFNFLCBmaWx0ZXI9VFJVRSkKdGNfZW9zaW5vcGhpbHNfY2xpbmljX2RlX25vYmF0Y2hbWyJkZXNlcSJdXVtbImNvbnRyYXN0c19wZXJmb3JtZWQiXV0KCnRjX2Vvc2lub3BoaWxzX2NsaW5pY190YWJsZV9ub2JhdGNoIDwtIGNvbWJpbmVfZGVfdGFibGVzKAogICAgdGNfZW9zaW5vcGhpbHNfY2xpbmljX2RlX25vYmF0Y2gsIGtlZXBlcnM9dGNfY2ZfY29udHJhc3RzLAogICAgcmRhPWdsdWU6OmdsdWUoInJkYS90Y19lb3Npbm9waGlsc19jbGluaWNfdGFibGVfbm9iYXRjaC12e3Zlcn0ucmRhIiksCiAgICBleGNlbD1nbHVlOjpnbHVlKCJhbmFseXNlcy8zX2NhbGlfYW5kX3R1bWFjby9jbGluaWNfY2YvRW9zaW5vcGhpbHMvdGNfZW9zaW5vcGhpbHNfY2xpbmljX3RhYmxlX25vYmF0Y2gtdnt2ZXJ9Lnhsc3giKSkKdGNfZW9zaW5vcGhpbHNfY2xpbmljX3NpZ19ub2JhdGNoIDwtIGV4dHJhY3Rfc2lnbmlmaWNhbnRfZ2VuZXMoCiAgICB0Y19lb3Npbm9waGlsc19jbGluaWNfdGFibGVfbm9iYXRjaCwKICAgIGV4Y2VsPWdsdWU6OmdsdWUoImFuYWx5c2VzLzNfY2FsaV9hbmRfdHVtYWNvL2NsaW5pY19jZi9Fb3Npbm9waGlscy90Y19lb3Npbm9waGlsc19jbGluaWNfc2lnX25vYmF0Y2gtdnt2ZXJ9Lnhsc3giKSkKCnRjX2Vvc2lub3BoaWxzX2NsaW5pY19kZV9zdmEgPC0gYWxsX3BhaXJ3aXNlKHRjX2Vvc2lub3BoaWxzLCBtb2RlbF9iYXRjaD0ic3Zhc2VxIiwgZmlsdGVyPVRSVUUpCnRjX2Vvc2lub3BoaWxzX2NsaW5pY19kZV9zdmFbWyJkZXNlcSJdXVtbImNvbnRyYXN0c19wZXJmb3JtZWQiXV0KCnRjX2Vvc2lub3BoaWxzX2NsaW5pY190YWJsZV9zdmEgPC0gY29tYmluZV9kZV90YWJsZXMoCiAgICB0Y19lb3Npbm9waGlsc19jbGluaWNfZGVfc3ZhLCBrZWVwZXJzPXRjX2NmX2NvbnRyYXN0cywKICAgIHJkYT1nbHVlOjpnbHVlKCJyZGEvdGNfZW9zaW5vcGhpbHNfY2xpbmljX3RhYmxlX3N2YS12e3Zlcn0ucmRhIiksCiAgICBleGNlbD1nbHVlOjpnbHVlKCJhbmFseXNlcy8zX2NhbGlfYW5kX3R1bWFjby9jbGluaWNfY2YvRW9zaW5vcGhpbHMvdGNfZW9zaW5vcGhpbHNfY2xpbmljX3RhYmxlX3N2YS12e3Zlcn0ueGxzeCIpKQp0Y19lb3Npbm9waGlsc19jbGluaWNfc2lnX3N2YSA8LSBleHRyYWN0X3NpZ25pZmljYW50X2dlbmVzKAogICAgdGNfZW9zaW5vcGhpbHNfY2xpbmljX3RhYmxlX3N2YSwKICAgIGV4Y2VsPWdsdWU6OmdsdWUoImFuYWx5c2VzLzNfY2FsaV9hbmRfdHVtYWNvL2NsaW5pY19jZi9Fb3Npbm9waGlscy90Y19lb3Npbm9waGlsc19jbGluaWNfc2lnX3N2YS12e3Zlcn0ueGxzeCIpKQpgYGAKCiMjIERFOiBDb21wYXJlIGNsaW5pY3MsIGJpb3BzeSBzYW1wbGVzCgpJbnRlcmVzdGluZ2x5IHRvIG1lLCB0aGUgYmlvcHN5IHNhbXBsZXMgYXBwZWFyIHRvIGhhdmUgdGhlIGxlYXN0CmxvY2F0aW9uLWJhc2VkIHZhcmlhbmNlLiAgQnV0IHdlIGNhbiBwZXJmb3JtIGFuIGV4cGxpY2l0IERFIGFuZCBzZWUKaG93IHdlbGwgdGhhdCBoeXBvdGhlc2lzIGhvbGRzIHVwLgoKTm90ZSB0aGF0IHRoZXNlIGRhdGEgaW5jbHVkZSBjdXJlIGFuZCBmYWlsIHNhbXBsZXMgZm9yCgpgYGB7ciB0Y19iaW9wc2llc19kZX0KdGFibGUocERhdGEodGNfYmlvcHNpZXMpW1siY29uZGl0aW9uIl1dKQp0Y19iaW9wc2llc19jbGluaWNfZGVfc3ZhIDwtIGFsbF9wYWlyd2lzZSh0Y19iaW9wc2llcywgbW9kZWxfYmF0Y2g9InN2YXNlcSIsIGZpbHRlcj1UUlVFKQp0Y19iaW9wc2llc19jbGluaWNfZGVfc3ZhW1siZGVzZXEiXV1bWyJjb250cmFzdHNfcGVyZm9ybWVkIl1dCgp0Y19iaW9wc2llc19jbGluaWNfdGFibGVfc3ZhIDwtIGNvbWJpbmVfZGVfdGFibGVzKAogICAgdGNfYmlvcHNpZXNfY2xpbmljX2RlX3N2YSwga2VlcGVycz10Y19jZl9jb250cmFzdHMsCiAgICByZGE9Z2x1ZTo6Z2x1ZSgicmRhL3RjX2Jpb3BzaWVzX2NsaW5pY190YWJsZV9zdmEtdnt2ZXJ9Lnhsc3giKSwKICAgIGV4Y2VsPWdsdWU6OmdsdWUoImFuYWx5c2VzLzNfY2FsaV9hbmRfdHVtYWNvL2NsaW5pY19jZi9CaW9wc2llcy90Y19iaW9wc2llc19jbGluaWNfdGFibGVfc3ZhLXZ7dmVyfS54bHN4IikpCnRjX2Jpb3BzaWVzX2NsaW5pY19zaWdfc3ZhIDwtIGV4dHJhY3Rfc2lnbmlmaWNhbnRfZ2VuZXMoCiAgICB0Y19iaW9wc2llc19jbGluaWNfdGFibGVfc3ZhLAogICAgZXhjZWw9Z2x1ZTo6Z2x1ZSgiYW5hbHlzZXMvM19jYWxpX2FuZF90dW1hY28vY2xpbmljX2NmL0Jpb3BzaWVzL3RjX2Jpb3BzaWVzX2NsaW5pY19zaWdfc3ZhLXZ7dmVyfS54bHN4IikpCmBgYAoKIyMgREU6IENvbXBhcmUgY2xpbmljcywgbW9ub2N5dGUgc2FtcGxlcwoKQXQgbGVhc3QgZm9yIHRoZSBtb21lbnQsIEkgYW0gb25seSBsb29raW5nIGF0IHRoZSBkaWZmZXJlbmNlcyBiZXR3ZWVuCm5vLWJhdGNoIHZzLiBzdmEgYWNyb3NzIGNsaW5pY3MgZm9yIHRoZSBtb25vY3l0ZSBzYW1wbGVzLiAgVGhpcwp3YXMgY2hvc2VuIG1vc3RseSBhcmJpdHJhcmlseS4KCiMjIyBERTogQ29tcGFyZSBjbGluaWNzLCBtb25vY3l0ZXMgd2l0aG91dCBiYXRjaCBlc3RpbWF0aW9uCgpPdXIgYmFzZWxpbmUgaXMgdGhlIGNvbXBhcmlzb24gb2YgdGhlIG1vbm9jeXRlcyBzYW1wbGVzIHdpdGhvdXQgYmF0Y2gKaW4gdGhlIG1vZGVsIG9yIHN1cnJvZ2F0ZSBlc3RpbWF0aW9uLiAgSW4gdGhlb3J5IGF0IGxlYXN0LCB0aGlzIHNob3VsZApjb3JyZXNwb25kIHRvIHRoZSBQQ0EgcGxvdCBhYm92ZSB3aGVuIG5vIGJhdGNoIGVzdGltYXRpb24gd2FzIHBlcmZvcm1lZC4KCmBgYHtyIHRjX21vbm9jeXRlc19kZX0KdGNfbW9ub2N5dGVzX2RlX25vYmF0Y2ggPC0gYWxsX3BhaXJ3aXNlKHRjX21vbm9jeXRlcywgbW9kZWxfYmF0Y2g9RkFMU0UsIGZpbHRlcj1UUlVFKQoKdGNfbW9ub2N5dGVzX3RhYmxlX25vYmF0Y2ggPC0gY29tYmluZV9kZV90YWJsZXMoCiAgICB0Y19tb25vY3l0ZXNfZGVfbm9iYXRjaCwga2VlcGVycz1jbGluaWNfY2ZfY29udHJhc3RzLAogICAgcmRhPWdsdWU6OmdsdWUoInJkYS90Y19tb25vY3l0ZXNfY2xpbmljX3RhYmxlX25vYmF0Y2gtdnt2ZXJ9LnJkYSIpLAogICAgZXhjZWw9Z2x1ZTo6Z2x1ZSgiYW5hbHlzZXMvM19jYWxpX2FuZF90dW1hY28vY2xpbmljX2NmL01vbm9jeXRlcy90Y19tb25vY3l0ZXNfY2xpbmljX3RhYmxlX25vYmF0Y2gtdnt2ZXJ9Lnhsc3giKSkKdGNfbW9ub2N5dGVzX3NpZ19ub2JhdGNoIDwtIGV4dHJhY3Rfc2lnbmlmaWNhbnRfZ2VuZXMoCiAgICB0Y19tb25vY3l0ZXNfdGFibGVfbm9iYXRjaCwKICAgIGV4Y2VsPWdsdWU6OmdsdWUoImFuYWx5c2VzLzNfY2FsaV9hbmRfdHVtYWNvL2NsaW5pY19jZi9Nb25vY3l0ZXMvdGNfbW9ub2N5dGVzX2NsaW5pY19zaWdfbm9iYXRjaC12e3Zlcn0ueGxzeCIpKQpgYGAKCiMjIyBERTogQ29tcGFyZSBjbGluaWNzLCBtb25vY3l0ZXMgd2l0aCBzdmFzZXEKCkluIGNvbnRyYXN0LCB0aGUgZm9sbG93aW5nIGNvbXBhcmlzb24gc2hvdWxkIGdpdmUgYSB2aWV3IG9mIHRoZSBkYXRhCmNvcnJlc3BvbmRpbmcgdG8gdGhlIHN2YXNlcSBQQ0EgcGxvdCBhYm92ZS4gIEluIHRoZSBiZXN0IGNhc2UKc2NlbmFyaW8sIHdlIHNob3VsZCB0aGVyZWZvcmUgYmUgYWJsZSB0byBzZWUgc29tZSBzaWduaWZpY2FuZQpkaWZmZXJlbmNlcyBiZXR3ZWVuIHRoZSBUdW1hY28gY3VyZSBhbmQgZmFpbCBzYW1wbGVzLgoKYGBge3IgdGNfbW9ub2N5dGVzX2RlX3N2YX0KdGNfbW9ub2N5dGVzX2RlX3N2YSA8LSBhbGxfcGFpcndpc2UodGNfbW9ub2N5dGVzLCBtb2RlbF9iYXRjaD0ic3Zhc2VxIiwgZmlsdGVyPVRSVUUpCgp0Y19tb25vY3l0ZXNfdGFibGVfc3ZhIDwtIGNvbWJpbmVfZGVfdGFibGVzKAogICAgdGNfbW9ub2N5dGVzX2RlX3N2YSwga2VlcGVycz1jbGluaWNfY2ZfY29udHJhc3RzLAogICAgcmRhPWdsdWU6OmdsdWUoInJkYS90Y19tb25vY3l0ZXNfY2xpbmljX3RhYmxlX3N2YS12e3Zlcn0ucmRhIiksCiAgICBleGNlbD1nbHVlOjpnbHVlKCJhbmFseXNlcy8zX2NhbGlfYW5kX3R1bWFjby9jbGluaWNfY2YvTW9ub2N5dGVzL3RjX21vbm9jeXRlc19jbGluaWNfdGFibGVfc3ZhLXZ7dmVyfS54bHN4IikpCnRjX21vbm9jeXRlc19zaWdfc3ZhIDwtIGV4dHJhY3Rfc2lnbmlmaWNhbnRfZ2VuZXMoCiAgICB0Y19tb25vY3l0ZXNfdGFibGVfc3ZhLAogICAgZXhjZWw9Z2x1ZTo6Z2x1ZSgiYW5hbHlzZXMvM19jYWxpX2FuZF90dW1hY28vY2xpbmljX2NmL01vbm9jeXRlcy90Y19tb25vY3l0ZXNfY2xpbmljX3NpZ19zdmEtdnt2ZXJ9Lnhsc3giKSkKYGBgCgojIyMgREUgQ29tcGFyZTogSG93IHNpbWlsYXIgYXJlIHRoZSBuby1iYXRjaCB2cy4gU1ZBIHJlc3VsdHM/CgpUaGUgZm9sbG93aW5nIGJsb2NrIHNob3dzIHRoYXQgdGhlc2UgdHdvIHJlc3VsdHMgYXJlIGV4Y2VlZGluZ2x5CmRpZmZlcmVudCwgc3VnZXN0aW5nIHRoYXQgdGhlIENhbGkgY3VyZS9mYWlsIGFuZCBUdW1hY28gY3VyZS9mYWlsCmNhbm5vdCBlYXNpbHkgYmUgY29uc2lkZXJlZCBpbiB0aGUgc2FtZSBhbmFseXNpcy4gIEkgZGlkIHNvbWUgcGxheWluZwphcm91bmQgd2l0aCBteSBjYWxjdWxhdGVfYXVjYyBmdW5jdGlvbiBpbiB0aGlzIGJsb2NrIGFuZCBmb3VuZCB0aGF0IGl0CmlzIGluIHNvbWUgaW1wb3J0YW50IHdheSBicm9rZW4sIGF0IGxlYXN0IGlmIG9uZSBleHBhbmRzIHRoZSB0b3AtbgpnZW5lcyB0byBtb3JlIHRoYW4gMjAlIG9mIHRoZSBudW1iZXIgb2YgZ2VuZXMgaW4gdGhlIGRhdGEuCgpgYGB7ciB2c19jYWxpX21vbm9jeXRlfQpjYWxpX3RhYmxlIDwtIHRjX21vbm9jeXRlc190YWJsZV9ub2JhdGNoW1siZGF0YSJdXVtbImNhbGkiXV0KdGFibGUgPC0gdGNfbW9ub2N5dGVzX3RhYmxlX25vYmF0Y2hbWyJkYXRhIl1dW1sidHVtYWNvIl1dCgpjYWxpX21lcmdlZCA8LSBtZXJnZShjYWxpX3RhYmxlLCB0YWJsZSwgYnk9InJvdy5uYW1lcyIpCmNvci50ZXN0KGNhbGlfbWVyZ2VkWywgImRlc2VxX2xvZ2ZjLngiXSwgY2FsaV9tZXJnZWRbLCAiZGVzZXFfbG9nZmMueSJdKQpjYWxpX2F1Y2MgPC0gY2FsY3VsYXRlX2F1Y2MoY2FsaV90YWJsZSwgdGFibGUsIHB4PSJkZXNlcV9hZGpwIiwgcHk9ImRlc2VxX2FkanAiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgbHg9ImRlc2VxX2xvZ2ZjIiwgbHk9ImRlc2VxX2xvZ2ZjIikKY2FsaV9hdWNjJHBsb3QKCmNhbGlfdGFibGVfc3ZhIDwtIHRjX21vbm9jeXRlc190YWJsZV9zdmFbWyJkYXRhIl1dW1siY2FsaSJdXQp0dW1hY29fdGFibGVfc3ZhIDwtIHRjX21vbm9jeXRlc190YWJsZV9zdmFbWyJkYXRhIl1dW1sidHVtYWNvIl1dCgpjYWxpX21lcmdlZF9zdmEgPC0gbWVyZ2UoY2FsaV90YWJsZV9zdmEsIHR1bWFjb190YWJsZV9zdmEsIGJ5PSJyb3cubmFtZXMiKQpjb3IudGVzdChjYWxpX21lcmdlZF9zdmFbLCAiZGVzZXFfbG9nZmMueCJdLCBjYWxpX21lcmdlZF9zdmFbLCAiZGVzZXFfbG9nZmMueSJdKQpjYWxpX2F1Y2Nfc3ZhIDwtIGNhbGN1bGF0ZV9hdWNjKGNhbGlfdGFibGVfc3ZhLCB0dW1hY29fdGFibGVfc3ZhLCBweD0iZGVzZXFfYWRqcCIsIHB5PSJkZXNlcV9hZGpwIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBseD0iZGVzZXFfbG9nZmMiLCBseT0iZGVzZXFfbG9nZmMiKQpjYWxpX2F1Y2Nfc3ZhJHBsb3QKYGBgCgojIyBERTogQ29tcGFyZSBjbGluaWNzLCBuZXV0cm9waGlsIHNhbXBsZXMKCmBgYHtyIHRjX25ldXRyb3BoaWxzX2RlfQp0Y19uZXV0cm9waGlsc19kZV9ub2JhdGNoIDwtIGFsbF9wYWlyd2lzZSh0Y19uZXV0cm9waGlscywgbW9kZWxfYmF0Y2g9RkFMU0UsIGZpbHRlcj1UUlVFKQoKdGNfbmV1dHJvcGhpbHNfdGFibGVfbm9iYXRjaCA8LSBjb21iaW5lX2RlX3RhYmxlcygKICAgIHRjX25ldXRyb3BoaWxzX2RlX25vYmF0Y2gsIGtlZXBlcnM9Y2xpbmljX2NmX2NvbnRyYXN0cywKICAgIHJkYT1nbHVlOjpnbHVlKCJyZGEvdGNfbmV1dHJvcGhpbHNfY2xpbmljX3RhYmxlX25vYmF0Y2gtdnt2ZXJ9LnJkYSIpLAogICAgZXhjZWw9Z2x1ZTo6Z2x1ZSgiYW5hbHlzZXMvM19jYWxpX2FuZF90dW1hY28vY2xpbmljX2NmL05ldXRyb3BoaWxzL3RjX25ldXRyb3BoaWxzX3RhYmxlX25vYmF0Y2gtdnt2ZXJ9Lnhsc3giKSkKdGNfbmV1dHJvcGhpbHNfc2lnX25vYmF0Y2ggPC0gZXh0cmFjdF9zaWduaWZpY2FudF9nZW5lcygKICAgIHRjX25ldXRyb3BoaWxzX3RhYmxlX25vYmF0Y2gsCiAgICBleGNlbD1nbHVlOjpnbHVlKCJhbmFseXNlcy8zX2NhbGlfYW5kX3R1bWFjby9jbGluaWNfY2YvTmV1dHJvcGhpbHMvdGNfbmV1dHJvcGhpbHNfc2lnX25vYmF0Y2gtdnt2ZXJ9Lnhsc3giKSkKCnRjX25ldXRyb3BoaWxzX2RlX3N2YSA8LSBhbGxfcGFpcndpc2UodGNfbmV1dHJvcGhpbHMsIG1vZGVsX2JhdGNoPSJzdmFzZXEiLCBmaWx0ZXI9VFJVRSkKCnRjX25ldXRyb3BoaWxzX3RhYmxlX3N2YSA8LSBjb21iaW5lX2RlX3RhYmxlcygKICAgIHRjX25ldXRyb3BoaWxzX2RlX3N2YSwga2VlcGVycz1jbGluaWNfY2ZfY29udHJhc3RzLAogICAgcmRhPWdsdWU6OmdsdWUoInJkYS90Y19uZXV0cm9waGlsc19jbGluaWNfdGFibGVfc3ZhLXZ7dmVyfS5yZGEiKSwKICAgIGV4Y2VsPWdsdWU6OmdsdWUoImFuYWx5c2VzLzNfY2FsaV9hbmRfdHVtYWNvL2NsaW5pY19jZi9OZXV0cm9waGlscy90Y19uZXV0cm9waGlsc190YWJsZV9zdmEtdnt2ZXJ9Lnhsc3giKSkKdGNfbmV1dHJvcGhpbHNfc2lnX3N2YSA8LSBleHRyYWN0X3NpZ25pZmljYW50X2dlbmVzKAogICAgdGNfbmV1dHJvcGhpbHNfdGFibGVfc3ZhLAogICAgZXhjZWw9Z2x1ZTo6Z2x1ZSgiYW5hbHlzZXMvM19jYWxpX2FuZF90dW1hY28vY2xpbmljX2NmL05ldXRyb3BoaWxzL3RjX25ldXRyb3BoaWxzX3NpZ19zdmEtdnt2ZXJ9Lnhsc3giKSkKYGBgCgojIENvbXBhcmUgREU6IEhvdyBzaW1pbGFyIGFyZSBUdW1hY28gQy9GIHZzLiBDYWxpIEMvRgoKVGhlIGZvbGxvd2luZyBleHBhbmRzIHRoZSBjcm9zcy1jbGluaWMgcXVlcnkgYWJvdmUgdG8gYWxzbyB0ZXN0IHRoZQpuZXV0cm9waGlscy4gIE9uY2UgYWdhaW4sIEkgdGhpbmsgaXQgd2lsbCBwcmV0dHkgc3Ryb25nbHkgc3VwcG9ydCB0aGUKaHlwb3RoZXNpcyB0aGF0IHRoZSB0d28gY2xpbmljcyBhcmUgbm90IGNvbXBhdGlibGUuCgpXZSBhcmUgY29uY2VybmVkIHRoYXQgdGhlIGNsaW5pYy1iYXNlZCBiYXRjaCBlZmZlY3QgbWF5IG1ha2Ugb3VyCnJlc3VsdHMgZXNzZW50aWFsbHkgdXNlbGVzcy4gIE9uZSB3YXkgdG8gdGVzdCB0aGlzIGNvbmNlcm4gaXMgdG8KY29tcGFyZSB0aGUgc2V0IG9mIGdlbmVzIG9ic2VydmVkIGRpZmZlcmVudCBiZXR3ZWVuIHRoZSBDYWxpIEN1cmUvRmFpbAp2cy4gdGhlIFR1bWFjbyBDdXJlL0ZhaWwuCgpgYGB7ciB2c19jYWxpX25ldXRyb3BoaWxzfQpjYWxpX3RhYmxlX25vYmF0Y2ggPC0gdGNfbmV1dHJvcGhpbHNfdGFibGVfbm9iYXRjaFtbImRhdGEiXV1bWyJjYWxpIl1dCnR1bWFjb190YWJsZV9ub2JhdGNoIDwtIHRjX25ldXRyb3BoaWxzX3RhYmxlX25vYmF0Y2hbWyJkYXRhIl1dW1sidHVtYWNvIl1dCgpjYWxpX21lcmdlZF9ub2JhdGNoIDwtIG1lcmdlKGNhbGlfdGFibGVfbm9iYXRjaCwgdHVtYWNvX3RhYmxlX25vYmF0Y2gsIGJ5PSJyb3cubmFtZXMiKQpjb3IudGVzdChjYWxpX21lcmdlZF9ub2JhdGNoWywgImRlc2VxX2xvZ2ZjLngiXSwgY2FsaV9tZXJnZWRfbm9iYXRjaFssICJkZXNlcV9sb2dmYy55Il0pCmNhbGlfYXVjY19ub2JhdGNoIDwtIGNhbGN1bGF0ZV9hdWNjKGNhbGlfdGFibGVfbm9iYXRjaCwgdHVtYWNvX3RhYmxlX25vYmF0Y2gsIHB4PSJkZXNlcV9hZGpwIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHk9ImRlc2VxX2FkanAiLCBseD0iZGVzZXFfbG9nZmMiLCBseT0iZGVzZXFfbG9nZmMiKQpjYWxpX2F1Y2Nfbm9iYXRjaCRwbG90CmBgYAoKIyMgR1NFQTogRXh0cmFjdCBjbGluaWMtc3BlY2lmaWMgZ2VuZXMKCkdpdmVuIHRoZSBhYm92ZSBjb21wYXJpc29ucywgd2UgY2FuIGV4dHJhY3Qgc29tZSBnZW5lIHNldHMgd2hpY2gKcmVzdWx0ZWQgZnJvbSB0aG9zZSBERSBhbmFseXNlcyBhbmQgZXZlbnR1YWxseSBwZXJmb3JtIHNvbWUKb250b2xvZ3kvS0VHRy9yZWFjdG9tZS9ldGMgc2VhcmNoZXMuICBUaGlzIHJlbWluZHMgbWUsIEkgd2FudCB0byBtYWtlCm15IGV4dHJhY3Rfc2lnbmlmaWNhbnRfIGZ1bmN0aW9ucyB0byByZXR1cm4gZ2VuZS1zZXQgZGF0YSBzdHJ1Y3R1cmVzCmFuZCBteSB2YXJpb3VzIG9udG9sb2d5IHNlYXJjaGVzIHRvIHRha2UgdGhlbSBhcyBpbnB1dHMuICBUaGlzIHNob3VsZApoZWxwIGF2b2lkIHBvdGVudGlhbCBlcnJvcnMgd2hlbiBleHRyYWN0aW5nIHVwL2Rvd24gZ2VuZXMuCgpgYGB7ciBjb21wYXJlX2NsaW5pY19nZW5lc30KY2xpbmljX3NpZ2VuZXNfdXAgPC0gcm93bmFtZXModGNfYWxsX2NsaW5pY19zaWdfc3ZhW1siZGVzZXEiXV1bWyJ1cHMiXV1bWyJjbGluaWNzIl1dKQpjbGluaWNfc2lnZW5lc19kb3duIDwtIHJvd25hbWVzKHRjX2FsbF9jbGluaWNfc2lnX3N2YVtbImRlc2VxIl1dW1siZG93bnMiXV1bWyJjbGluaWNzIl1dKQpjbGluaWNfc2lnZW5lcyA8LSBjKGNsaW5pY19zaWdlbmVzX3VwLCBjbGluaWNfc2lnZW5lc19kb3duKQoKdGNfZW9zaW5vcGhpbHNfc2lnZW5lc191cCA8LSByb3duYW1lcyh0Y19lb3Npbm9waGlsc19jbGluaWNfc2lnX3N2YVtbImRlc2VxIl1dW1sidXBzIl1dW1siY3VyZSJdXSkKdGNfZW9zaW5vcGhpbHNfc2lnZW5lc19kb3duIDwtIHJvd25hbWVzKHRjX2Vvc2lub3BoaWxzX2NsaW5pY19zaWdfc3ZhW1siZGVzZXEiXV1bWyJkb3ducyJdXVtbImN1cmUiXV0pCnRjX21vbm9jeXRlc19zaWdlbmVzX3VwIDwtIHJvd25hbWVzKHRjX21vbm9jeXRlc19zaWdfc3ZhW1siZGVzZXEiXV1bWyJ1cHMiXV1bWyJjdXJlIl1dKQp0Y19tb25vY3l0ZXNfc2lnZW5lc19kb3duIDwtIHJvd25hbWVzKHRjX21vbm9jeXRlc19zaWdfc3ZhW1siZGVzZXEiXV1bWyJkb3ducyJdXVtbImN1cmUiXV0pCnRjX25ldXRyb3BoaWxzX3NpZ2VuZXNfdXAgPC0gcm93bmFtZXModGNfbmV1dHJvcGhpbHNfc2lnX3N2YVtbImRlc2VxIl1dW1sidXBzIl1dW1siY3VyZSJdXSkKdGNfbmV1dHJvcGhpbHNfc2lnZW5lc19kb3duIDwtIHJvd25hbWVzKHRjX25ldXRyb3BoaWxzX3NpZ19zdmFbWyJkZXNlcSJdXVtbImRvd25zIl1dW1siY3VyZSJdXSkKCnRjX2Vvc2lub3BoaWxzX3NpZ2VuZXMgPC0gYyh0Y19lb3Npbm9waGlsc19zaWdlbmVzX3VwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGNfZW9zaW5vcGhpbHNfc2lnZW5lc19kb3duKQp0Y19tb25vY3l0ZXNfc2lnZW5lcyA8LSBjKHRjX21vbm9jeXRlc19zaWdlbmVzX3VwLAogICAgICAgICAgICAgICAgICAgICAgICAgIHRjX21vbm9jeXRlc19zaWdlbmVzX2Rvd24pCnRjX25ldXRyb3BoaWxzX3NpZ2VuZXMgPC0gYyh0Y19uZXV0cm9waGlsc19zaWdlbmVzX3VwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGNfbmV1dHJvcGhpbHNfc2lnZW5lc19kb3duKQpgYGAKCiMjIEdTRUE6IGdQcm9maWxlciBvZiBnZW5lcyBkZWVtZWQgdXAvZG93biB3aGVuIGNvbXBhcmluZyBDYWxpIGFuZCBUdW1hY28KCkkgd2FzIGN1cmlvdXMgdG8gdHJ5IHRvIHVuZGVyc3RhbmQgd2h5IHRoZSB0d28gY2xpbmljcyBhcHBlYXIgdG8gYmUgc28KZGlmZmVyZW50IHZpcyBhIHZpcyB0aGVpciBQQ0EvREU7IHNvIEkgdGhvdWdodCB0aGF0IGdQcm9maWxlciBtaWdodApoZWxwIGJvaWwgdGhvc2UgcmVzdWx0cyBkb3duIHRvIHNvbWV0aGluZyBtb3JlIGRpZ2VzdGlibGUuCgojIyMgR1NFQTogQ29tcGFyZSBjbGluaWNzLCBhbGwgc2FtcGxlcwoKTm90ZSB0aGF0IGluIHRoZSBmb2xsb3dpbmcgYmxvY2sgSSB1c2VkIHRoZSBmdW5jdGlvbgpzaW1wbGVfZ3Byb2ZpbGVyKCksIGJ1dCBsYXRlciBpbiB0aGlzIGRvY3VtZW50IEkgd2lsbCB1c2UKYWxsX2dwcm9maWxlcigpLiAgVGhlIGZpcnN0IGludm9jYXRpb24gbGltaXRzIHRoZSBzZWFyY2ggdG8gYSBzaW5nbGUKdGFibGUsIHdoaWxlIHRoZSBzZWNvbmQgd2lsbCBpdGVyYXRlIG92ZXIgZXZlcnkgcmVzdWx0IGluIGEgcGFpcndpc2UKZGlmZmVyZW50aWFsIGV4cHJlc3Npb24gYW5hbHlzaXMuCgpJbiB0aGlzIGluc3RhbmNlLCB3ZSBhcmUgbG9va2luZyBhdCB0aGUgdmVjdG9yIG9mIGdlbmUgSURzIGRlZW1lZApzaWduaWZpY2FudGx5IGRpZmZlcmVudCBiZXR3ZWVuIHRoZSB0d28gY2xpbmljcyBpbiBlaXRoZXIgdGhlIHVwIG9yCmRvd24gZGlyZWN0aW9uLgoKT25lIG90aGVyIHRoaW5nIHdvcnRoIG5vdGluZywgdGhlIG5ldyB2ZXJzaW9uIG9mIGdQcm9maWxlciBwcm92aWRlcwpzb21lIGZ1biBpbnRlcmFjdGl2ZSBwbG90cy4gIEkgd2lsbCBhZGQgYW4gZXhhbXBsZSBoZXJlLgoKYGBge3IgZ3NlYV9jbGluaWNfZ3Byb2ZpbGVyfQpjbGluaWNfZ3AgPC0gc2ltcGxlX2dwcm9maWxlcihjbGluaWNfc2lnZW5lcykKY2xpbmljX2dwJHB2YWx1ZV9wbG90cyRSRUFDCmNsaW5pY19ncCRwdmFsdWVfcGxvdHMkQlAKY2xpbmljX2dwJHB2YWx1ZV9wbG90cyRURgpjbGluaWNfZ3AkaW50ZXJhY3RpdmVfcGxvdHMkR08KYGBgCgojIEdTVkEgTG9hZCBtU2lnREIgZGF0YQoKQ29udmVyc2VseSwgSSBjYW4gbG9hZCBzb21lIG9mIHRoZSBNc2lnREIgY2F0ZWdvcmllcyBmcm9tIGJyb2FkIGFuZApwZXJmb3JtIGEgc2ltaWxhciBhbmFseXNpcyB1c2luZyBnb3NlcSB0byBzZWUgaWYgdGhlcmUgYXJlIG92ZXIKcmVwcmVzZW50ZWQgY2F0ZWdvcmllcy4KCmBgYHtyIGdzdmFfbXNpZ30KYnJvYWRfYzcgPC0gbG9hZF9nbXRfc2lnbmF0dXJlcyhzaWduYXR1cmVzID0gInJlZmVyZW5jZS9tc2lnZGIvYzcuYWxsLnY3LjUuMS5lbnRyZXouZ210IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaWduYXR1cmVfY2F0ZWdvcnkgPSAiYzciKQpicm9hZF9jMiA8LSBsb2FkX2dtdF9zaWduYXR1cmVzKHNpZ25hdHVyZXMgPSAicmVmZXJlbmNlL21zaWdkYi9jMi5hbGwudjcuNS4xLmVudHJlei5nbXQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpZ25hdHVyZV9jYXRlZ29yeSA9ICJjMiIpCmJyb2FkX2ggPC0gbG9hZF9nbXRfc2lnbmF0dXJlcyhzaWduYXR1cmVzID0gInJlZmVyZW5jZS9tc2lnZGIvaC5hbGwudjcuNS4xLmVudHJlei5nbXQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2lnbmF0dXJlX2NhdGVnb3J5ID0gImgiKQoKY2xpbmljX2dzZWFfbXNpZ19jMiA8LSBnb3NlcV9tc2lnZGIoY2xpbmljX3NpZ2VuZXMsIGxlbmd0aF9kYiA9IGhzX2xlbmd0aCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2lnbmF0dXJlcyA9IGJyb2FkX2MyLCBzaWduYXR1cmVfY2F0ZWdvcnkgPSAiYzIiKQpgYGAKCiMjIyBHU0VBOiBDb21wYXJlIGNsaW5pY3MsIEVvc2lub3BoaWwgc2FtcGxlcwoKSW4gdGhlIGZvbGxvd2luZyBibG9jaywgSSBhbSBsb29raW5nIGF0IHRoZSBnUHJvZmlsZXIgb3ZlciByZXByZXNlbnRlZApncm91cHMgb2JzZXJ2ZWQgYWNyb3NzIGNsaW5pY3MgaW4gb25seSB0aGUgRW9zaW5vcGhpbHMuICBGaXJzdCBJIGRvIHNvCmZvciBhbGwgZ2VuZXModXAgb3IgZG93biksIGZvbGxvd2VkIGJ5IG9ubHkgdGhlIHVwIGFuZCBkb3duIGdyb3Vwcy4KRWFjaCBvZiB0aGUgZm9sbG93aW5nIHdpbGwgaW5jbHVkZSBvbmx5IHRoZSBSZWFjdG9tZSBhbmQgR086QlAgcGxvdHMuClRoZXNlIHNlYXJjaGVzIGRpZCBub3QgaGF2ZSB0b28gbWFueSBvdGhlciBoaXRzLCBleGNlcHRpbmcgdGhlCnRyYW5zY3JpcHRpb24gZmFjdG9yIGRhdGFiYXNlLgoKYGBge3IgZ3NlYV9jbGluaWNfZW99CnRjX2Vvc2lub3BoaWxzX2dwIDwtIHNpbXBsZV9ncHJvZmlsZXIodGNfZW9zaW5vcGhpbHNfc2lnZW5lcykKdGNfZW9zaW5vcGhpbHNfZ3AkcHZhbHVlX3Bsb3RzJFJFQUMKdGNfZW9zaW5vcGhpbHNfZ3AkcHZhbHVlX3Bsb3RzJEJQCgp0Y19lb3Npbm9waGlsc191cF9ncCA8LSBzaW1wbGVfZ3Byb2ZpbGVyKHRjX2Vvc2lub3BoaWxzX3NpZ2VuZXNfdXApCnRjX2Vvc2lub3BoaWxzX3VwX2dwJHB2YWx1ZV9wbG90cyRSRUFDCnRjX2Vvc2lub3BoaWxzX3VwX2dwJHB2YWx1ZV9wbG90cyRCUAoKdGNfZW9zaW5vcGhpbHNfZG93bl9ncCA8LSBzaW1wbGVfZ3Byb2ZpbGVyKHRjX2Vvc2lub3BoaWxzX3NpZ2VuZXNfZG93bikKdGNfZW9zaW5vcGhpbHNfZG93bl9ncCRwdmFsdWVfcGxvdHMkUkVBQwp0Y19lb3Npbm9waGlsc19kb3duX2dwJHB2YWx1ZV9wbG90cyRCUApgYGAKCiMjIyBHU0VBOiBDb21wYXJlIGNsaW5pY3MsIE1vbm9jeXRlIHNhbXBsZXMKCkluIHRoZSBmb2xsb3dpbmcgYmxvY2sgSSByZXBlYXRlZCB0aGUgYWJvdmUgcXVlcnksIGJ1dCB0aGlzIHRpbWUKbG9va2luZyBhdCB0aGUgbW9ub2N5dGUgc2FtcGxlcy4KCmBgYHtyIGdzZWFfY2xpbmljX21ub2N5dGV9CnRjX21vbm9jeXRlc19ncCA8LSBzaW1wbGVfZ3Byb2ZpbGVyKHRjX21vbm9jeXRlc19zaWdlbmVzKQp0Y19tb25vY3l0ZXNfZ3AkcHZhbHVlX3Bsb3RzJFJFQUMKdGNfbW9ub2N5dGVzX2dwJHB2YWx1ZV9wbG90cyRCUAoKdGNfbW9ub2N5dGVzX3VwX2dwIDwtIHNpbXBsZV9ncHJvZmlsZXIodGNfbW9ub2N5dGVzX3NpZ2VuZXNfdXApCnRjX21vbm9jeXRlc191cF9ncCRwdmFsdWVfcGxvdHMkUkVBQwp0Y19tb25vY3l0ZXNfdXBfZ3AkcHZhbHVlX3Bsb3RzJEJQCgp0Y19tb25vY3l0ZXNfZG93bl9ncCA8LSBzaW1wbGVfZ3Byb2ZpbGVyKHRjX21vbm9jeXRlc19zaWdlbmVzX2Rvd24pCnRjX21vbm9jeXRlc19kb3duX2dwJHB2YWx1ZV9wbG90cyRSRUFDCnRjX21vbm9jeXRlc19kb3duX2dwJHB2YWx1ZV9wbG90cyRCUApgYGAKCiMjIyBHU0VBOiBDb21wYXJlIGNsaW5pY3MsIE5ldXRyb3BoaWwgc2FtcGxlcwoKSWJpZC4gIFRoaXMgdGltZSBsb29raW5nIGF0IHRoZSBOZXV0cm9waGlscy4gIFRodXMgdGhlIGZpcnN0IHR3bwppbWFnZXMgc2hvdWxkIGJlIGEgc3VwZXJzZXQgb2YgdGhlIHNlY29uZCBhbmQgdGhpcmQgcGFpcnMgb2YgaW1hZ2VzOwphc3N1bWluZyB0aGF0IHRoZSBnZW5lcyBpbiB0aGUgdXAvZG93biBsaXN0IGRvIG5vdCBjYXVzZSB0aGUgZ3JvdXBzIHRvCm5vIGxvbmdlciBiZSBzaWduaWZpY2FudC4gIEludGVyZXN0aW5nbHksIHRoZSByZWFjdG9tZSBzZWFyY2ggZGlkIG5vdApyZXR1cm4gYW55IGhpdHMgZm9yIHRoZSBpbmNyZWFzZWQgc2VhcmNoLgoKYGBge3IgZ3NlYV9jbGluaWNfbmV1dHJvcGhpbHN9CnRjX25ldXRyb3BoaWxzX2dwIDwtIHNpbXBsZV9ncHJvZmlsZXIodGNfbmV1dHJvcGhpbHNfc2lnZW5lcykKIyMgdGNfbmV1dHJvcGhpbHNfZ3AkcHZhbHVlX3Bsb3RzJFJFQUMgIyMgbm8gaGl0cwp0Y19uZXV0cm9waGlsc19ncCRwdmFsdWVfcGxvdHMkQlAKdGNfbmV1dHJvcGhpbHNfZ3AkcHZhbHVlX3Bsb3RzJFRGCgp0Y19uZXV0cm9waGlsc191cF9ncCA8LSBzaW1wbGVfZ3Byb2ZpbGVyKHRjX25ldXRyb3BoaWxzX3NpZ2VuZXNfdXApCiMjIHRjX25ldXRyb3BoaWxzX3VwX2dwJHB2YWx1ZV9wbG90cyRSRUFDICMjIE5vIGhpdHMKdGNfbmV1dHJvcGhpbHNfdXBfZ3AkcHZhbHVlX3Bsb3RzJEJQCgp0Y19uZXV0cm9waGlsc19kb3duX2dwIDwtIHNpbXBsZV9ncHJvZmlsZXIodGNfbmV1dHJvcGhpbHNfc2lnZW5lc19kb3duKQp0Y19uZXV0cm9waGlsc19kb3duX2dwJHB2YWx1ZV9wbG90cyRSRUFDCnRjX25ldXRyb3BoaWxzX2Rvd25fZ3AkcHZhbHVlX3Bsb3RzJEJQCmBgYAoKIyBUdW1hY28gYW5kIENhbGksIGN1cmUgdnMuIGZhaWwKCkluIGFsbCBvZiB0aGUgYWJvdmUsIHdlIGFyZSBsb29raW5nIHRvIHVuZGVyc3RhbmQgdGhlIGRpZmZlcmVuY2VzIGJldHdlZW4gdGhlIHR3byBsb2NhdGlvbi4KTGV0IHVzIG5vdyBzdGVwIGJhY2sgYW5kIHBlcmZvcm0gdGhlIG9yaWdpbmFsIHF1ZXN0aW9uOiBmYWlsL2N1cmUgd2l0aG91dCByZWdhcmQgdG8gbG9jYXRpb24uCgpJIHBlcmZvcm1lZCB0aGlzIHF1ZXJ5IHdpdGggYSBmZXcgZGlmZmVyZW50IHBhcmFtZXRlcnMsIG5vdGFibHkgd2l0aChvdXQpCnN2YSBhbmQgYWdhaW4gdXNpbmcgZWFjaCBjZWxsIHR5cGUsIGluY2x1ZGluZyBiaW9wc2llcy4gVGhlIG1haW4KcmVhc2lvbiBJIGFtIGtlZXBpbmcgdGhlc2UgY29tcGFyaXNvbnMgaXMgaW4gdGhlIHJlbGF0aXZlbHkgd2VhayBob3BlCnRoYXQgdGhlcmUgd2lsbCBiZSBzdWZmaWNpZW50IHNpZ25hbCBpbiB0aGUgZnVsbCBkYXRhc2V0IHRoYXQgaXQgbWlnaHQKYmUgYWJsZSB0byBvdmVyY29tZSB0aGUgYXBwYXJlbnRseSByaWRpY3Vsb3VzIGJhdGNoIGVmZmVjdCBmcm9tIHRoZQp0d28gY2xpbmljcy4KCiMjIEFsbCBjZWxsIHR5cGVzIHRvZ2V0aGVyLCB3aXRoKG91dCkgU1ZBCgpgYGB7ciBjZl90dW1hY29fY2FsaV9hbGx9CnRjX2FsbF9jZl9kZV9zdmEgPC0gYWxsX3BhaXJ3aXNlKHRjX3ZhbGlkLCBmaWx0ZXI9VFJVRSwgbW9kZWxfYmF0Y2g9InN2YXNlcSIpCnRjX2FsbF9jZl90YWJsZV9zdmEgPC0gY29tYmluZV9kZV90YWJsZXMoCiAgICB0Y19hbGxfY2ZfZGVfc3ZhLCBrZWVwZXJzPXRfY2ZfY29udHJhc3QsCiAgICByZGE9Z2x1ZTo6Z2x1ZSgicmRhL3RjX3ZhbGlkX2NmX3RhYmxlX3N2YS12e3Zlcn0ucmRhIiksCiAgICBleGNlbD1nbHVlOjpnbHVlKCJhbmFseXNlcy8zX2NhbGlfYW5kX3R1bWFjby9jZi9BbGxfU2FtcGxlcy90Y192YWxpZF9jZl90YWJsZV9zdmEtdnt2ZXJ9Lnhsc3giKSkKdGNfYWxsX2NmX3NpZ19zdmEgPC0gZXh0cmFjdF9zaWduaWZpY2FudF9nZW5lcygKICAgIHRjX2FsbF9jZl90YWJsZV9zdmEsCiAgICBleGNlbD1nbHVlOjpnbHVlKCJhbmFseXNlcy8zX2NhbGlfYW5kX3R1bWFjby9jZi9BbGxfU2FtcGxlcy90Y192YWxpZF9jZl9zaWdfc3ZhLXZ7dmVyfS54bHN4IikpCgp0Y19hbGxfY2ZfZGVfYmF0Y2ggPC0gYWxsX3BhaXJ3aXNlKHRjX3ZhbGlkLCBmaWx0ZXI9VFJVRSwgbW9kZWxfYmF0Y2g9VFJVRSkKdGNfYWxsX2NmX3RhYmxlX2JhdGNoIDwtIGNvbWJpbmVfZGVfdGFibGVzKAogICAgdGNfYWxsX2NmX2RlX2JhdGNoLAogICAga2VlcGVycz10X2NmX2NvbnRyYXN0LAogICAgcmRhPWdsdWU6OmdsdWUoInJkYS90Y192YWxpZF9jZl90YWJsZV9iYXRjaC12e3Zlcn0ucmRhIiksCiAgICBleGNlbD1nbHVlOjpnbHVlKCJhbmFseXNlcy8zX2NhbGlfYW5kX3R1bWFjby9jZi9BbGxfU2FtcGxlcy90Y192YWxpZF9jZl90YWJsZV9iYXRjaC12e3Zlcn0ueGxzeCIpKQp0Y19hbGxfY2Zfc2lnX2JhdGNoIDwtIGV4dHJhY3Rfc2lnbmlmaWNhbnRfZ2VuZXMoCiAgICB0Y19hbGxfY2ZfdGFibGVfYmF0Y2gsCiAgICBleGNlbD1nbHVlOjpnbHVlKCJhbmFseXNlcy8zX2NhbGlfYW5kX3R1bWFjby9jZi9BbGxfU2FtcGxlcy90Y192YWxpZF9jZl9zaWdfYmF0Y2gtdnt2ZXJ9Lnhsc3giKSkKYGBgCgojIyBCaW9wc2llcywgd2l0aChvdXQpIFNWQQoKSW4gdGhlIGZvbGxvd2luZyBibG9jaywgd2UgcmVwZWF0IHRoZSBzYW1lIHF1ZXN0aW9uLCBidXQgdXNpbmcgb25seQp0aGUgYmlvcHN5IHNhbXBsZXMgZnJvbSBib3RoIGNsaW5pY3MuCgpgYGB7ciBjZl90dW1hY29fY2FsaV9iaW9wc2llc30KdGNfYmlvcHNpZXNfY2YgPC0gc2V0X2V4cHRfY29uZGl0aW9ucyh0Y19iaW9wc2llcywgZmFjdD0iZmluYWxvdXRjb21lIikKdGNfYmlvcHNpZXNfY2ZfZGVfc3ZhIDwtIGFsbF9wYWlyd2lzZSh0Y19iaW9wc2llc19jZiwgZmlsdGVyPVRSVUUsIG1vZGVsX2JhdGNoPSJzdmFzZXEiKQp0Y19iaW9wc2llc19jZl90YWJsZV9zdmEgPC0gY29tYmluZV9kZV90YWJsZXMoCiAgICB0Y19iaW9wc2llc19jZl9kZV9zdmEsIGtlZXBlcnM9dF9jZl9jb250cmFzdCwKICAgIHJkYT1nbHVlOjpnbHVlKCJyZGEvdGNfYmlvcHNpZXNfY2ZfdGFibGVfc3ZhLXZ7dmVyfS5yZGEiKSwKICAgIGV4Y2VsPWdsdWU6OmdsdWUoImFuYWx5c2VzLzNfY2FsaV9hbmRfdHVtYWNvL2NmL0Jpb3BzaWVzL3RjX2Jpb3BzaWVzX2NmX3RhYmxlX3N2YS12e3Zlcn0ueGxzeCIpKQp0Y19iaW9wc2llc19jZl9zaWdfc3ZhIDwtIGV4dHJhY3Rfc2lnbmlmaWNhbnRfZ2VuZXMoCiAgICB0Y19iaW9wc2llc19jZl90YWJsZV9zdmEsCiAgICBleGNlbD1nbHVlOjpnbHVlKCJhbmFseXNlcy8zX2NhbGlfYW5kX3R1bWFjby9jZi9BbGxfU2FtcGxlcy90Y19iaW9wc2llc19jZl9zaWdfc3ZhLXZ7dmVyfS54bHN4IikpCgp0Y19iaW9wc2llc19jZl9kZV9iYXRjaCA8LSBhbGxfcGFpcndpc2UodGNfYmlvcHNpZXNfY2YsIGZpbHRlcj1UUlVFLCBtb2RlbF9iYXRjaD1UUlVFKQp0Y19iaW9wc2llc19jZl90YWJsZV9iYXRjaCA8LSBjb21iaW5lX2RlX3RhYmxlcygKICAgIHRjX2Jpb3BzaWVzX2NmX2RlX2JhdGNoLCBrZWVwZXJzPXRfY2ZfY29udHJhc3QsCiAgICByZGE9Z2x1ZTo6Z2x1ZSgicmRhL3RjX2Jpb3BzaWVzX2NmX3RhYmxlX2JhdGNoLXZ7dmVyfS5yZGEiKSwKICAgIGV4Y2VsPWdsdWU6OmdsdWUoImFuYWx5c2VzLzNfY2FsaV9hbmRfdHVtYWNvL2NmL0FsbF9TYW1wbGVzL3RjX2Jpb3BzaWVzX2NmX3RhYmxlX2JhdGNoLXZ7dmVyfS54bHN4IikpCnRjX2Jpb3BzaWVzX2NmX3NpZ19iYXRjaCA8LSBleHRyYWN0X3NpZ25pZmljYW50X2dlbmVzKAogICAgdGNfYmlvcHNpZXNfY2ZfdGFibGVfYmF0Y2gsCiAgICBleGNlbD1nbHVlOjpnbHVlKCJhbmFseXNlcy8zX2NhbGlfYW5kX3R1bWFjby9jZi9BbGxfU2FtcGxlcy90Y19iaW9wc2llc19jZl9zaWdfYmF0Y2gtdnt2ZXJ9Lnhsc3giKSkKYGBgCgojIyBFb3Npbm9waGlscywgd2l0aChvdXQpIFNWQQoKSW4gdGhlIGZvbGxvd2luZyBibG9jaywgd2UgcmVwZWF0IHRoZSBzYW1lIHF1ZXN0aW9uLCBidXQgdXNpbmcgb25seQp0aGUgRW9zaW5vcGhpbCBzYW1wbGVzIGZyb20gYm90aCBjbGluaWNzLgoKYGBge3IgY2ZfdHVtYWNvX2NhbGlfZW9zaW5vcGhpbHN9CnRjX2Vvc2lub3BoaWxzX2NmIDwtIHNldF9leHB0X2NvbmRpdGlvbnModGNfZW9zaW5vcGhpbHMsIGZhY3Q9ImZpbmFsb3V0Y29tZSIpCnRjX2Vvc2lub3BoaWxzX2NmX2RlX3N2YSA8LSBhbGxfcGFpcndpc2UodGNfZW9zaW5vcGhpbHNfY2YsIGZpbHRlcj1UUlVFLCBtb2RlbF9iYXRjaD0ic3Zhc2VxIikKdGNfZW9zaW5vcGhpbHNfY2ZfdGFibGVfc3ZhIDwtIGNvbWJpbmVfZGVfdGFibGVzKAogICAgdGNfZW9zaW5vcGhpbHNfY2ZfZGVfc3ZhLCBrZWVwZXJzPXRfY2ZfY29udHJhc3QsCiAgICByZGE9Z2x1ZTo6Z2x1ZSgicmRhL3RjX2Vvc2lub3BoaWxzX2NmX3RhYmxlX3N2YS12e3Zlcn0ucmRhIiksCiAgICBleGNlbD1nbHVlOjpnbHVlKCJhbmFseXNlcy8zX2NhbGlfYW5kX3R1bWFjby9jZi9Fb3Npbm9waGlscy90Y19lb3Npbm9waGlsc19jZl90YWJsZV9zdmEtdnt2ZXJ9Lnhsc3giKSkKdGNfZW9zaW5vcGhpbHNfY2Zfc2lnX3N2YSA8LSBleHRyYWN0X3NpZ25pZmljYW50X2dlbmVzKAogICAgdGNfZW9zaW5vcGhpbHNfY2ZfdGFibGVfc3ZhLAogICAgZXhjZWw9Z2x1ZTo6Z2x1ZSgiYW5hbHlzZXMvM19jYWxpX2FuZF90dW1hY28vY2YvQWxsX1NhbXBsZXMvdGNfZW9zaW5vcGhpbHNfY2Zfc2lnX3N2YS12e3Zlcn0ueGxzeCIpKQoKdGNfZW9zaW5vcGhpbHNfY2ZfZGVfYmF0Y2ggPC0gYWxsX3BhaXJ3aXNlKHRjX2Vvc2lub3BoaWxzX2NmLCBmaWx0ZXI9VFJVRSwgbW9kZWxfYmF0Y2g9VFJVRSkKdGNfZW9zaW5vcGhpbHNfY2ZfdGFibGVfYmF0Y2ggPC0gY29tYmluZV9kZV90YWJsZXMoCiAgICB0Y19lb3Npbm9waGlsc19jZl9kZV9iYXRjaCwga2VlcGVycz10X2NmX2NvbnRyYXN0LAogICAgcmRhPWdsdWU6OmdsdWUoInJkYS90Y19lb3Npbm9waGlsc19jZl90YWJsZV9iYXRjaC12e3Zlcn0ucmRhIiksCiAgICBleGNlbD1nbHVlOjpnbHVlKCJhbmFseXNlcy8zX2NhbGlfYW5kX3R1bWFjby9jZi9BbGxfU2FtcGxlcy90Y19lb3Npbm9waGlsc19jZl90YWJsZV9iYXRjaC12e3Zlcn0ueGxzeCIpKQp0Y19lb3Npbm9waGlsc19jZl9zaWdfYmF0Y2ggPC0gZXh0cmFjdF9zaWduaWZpY2FudF9nZW5lcygKICAgIHRjX2Vvc2lub3BoaWxzX2NmX3RhYmxlX2JhdGNoLAogICAgZXhjZWw9Z2x1ZTo6Z2x1ZSgiYW5hbHlzZXMvM19jYWxpX2FuZF90dW1hY28vY2YvQWxsX1NhbXBsZXMvdGNfZW9zaW5vcGhpbHNfY2Zfc2lnX2JhdGNoLXZ7dmVyfS54bHN4IikpCmBgYAoKIyMgTW9ub2N5dGVzLCB3aXRoKG91dCkgU1ZBCgpSZXBlYXQgeWV0IGFnYWluLCB0aGlzIHRpbWUgd2l0aCB0aGUgbW9ub2N5dGUgc2FtcGxlcy4gIFRoZSBpZGVhIGlzIHRvCnNlZSBpZiB0aGVyZSBpcyBhIGNlbGwgdHlwZSB3aGljaCBpcyBwYXJ0aWN1bGFybHkgZ29vZCAob3IgYmFkKSBhdApkaXNjcmltaW5hdGluZyB0aGUgdHdvIGNsaW5pY3MuCgpgYGB7ciBjZl90dW1hY29fY2FsaV9tb25vY3l0ZXN9CnRjX21vbm9jeXRlc19jZiA8LSBzZXRfZXhwdF9jb25kaXRpb25zKHRjX21vbm9jeXRlcywgZmFjdD0iZmluYWxvdXRjb21lIikKdGNfbW9ub2N5dGVzX2NmX2RlX3N2YSA8LSBhbGxfcGFpcndpc2UodGNfbW9ub2N5dGVzX2NmLCBmaWx0ZXI9VFJVRSwgbW9kZWxfYmF0Y2g9InN2YXNlcSIpCnRjX21vbm9jeXRlc19jZl90YWJsZV9zdmEgPC0gY29tYmluZV9kZV90YWJsZXMoCiAgICB0Y19tb25vY3l0ZXNfY2ZfZGVfc3ZhLCBrZWVwZXJzPXRfY2ZfY29udHJhc3QsCiAgICByZGE9Z2x1ZTo6Z2x1ZSgicmRhL3RjX21vbm9jeXRlc19jZl90YWJsZV9zdmEtdnt2ZXJ9LnJkYSIpLAogICAgZXhjZWw9Z2x1ZTo6Z2x1ZSgiYW5hbHlzZXMvM19jYWxpX2FuZF90dW1hY28vY2YvTW9ub2N5dGVzL3RjX21vbm9jeXRlc19jZl90YWJsZV9zdmEtdnt2ZXJ9Lnhsc3giKSkKdGNfbW9ub2N5dGVzX2NmX3NpZ19zdmEgPC0gZXh0cmFjdF9zaWduaWZpY2FudF9nZW5lcygKICAgIHRjX21vbm9jeXRlc19jZl90YWJsZV9zdmEsCiAgICBleGNlbD1nbHVlOjpnbHVlKCJhbmFseXNlcy8zX2NhbGlfYW5kX3R1bWFjby9jZi9BbGxfU2FtcGxlcy90Y19tb25vY3l0ZXNfY2Zfc2lnX3N2YS12e3Zlcn0ueGxzeCIpKQoKdGNfbW9ub2N5dGVzX2NmX2RlX2JhdGNoIDwtIGFsbF9wYWlyd2lzZSh0Y19tb25vY3l0ZXNfY2YsIGZpbHRlcj1UUlVFLCBtb2RlbF9iYXRjaD1UUlVFKQp0Y19tb25vY3l0ZXNfY2ZfdGFibGVfYmF0Y2ggPC0gY29tYmluZV9kZV90YWJsZXMoCiAgICB0Y19tb25vY3l0ZXNfY2ZfZGVfYmF0Y2gsIGtlZXBlcnM9dF9jZl9jb250cmFzdCwKICAgIHJkYT1nbHVlOjpnbHVlKCJyZGEvdGNfbW9ub2N5dGVzX2NmX3RhYmxlX2JhdGNoLXZ7dmVyfS5yZGEiKSwKICAgIGV4Y2VsPWdsdWU6OmdsdWUoImFuYWx5c2VzLzNfY2FsaV9hbmRfdHVtYWNvL2NmL0FsbF9TYW1wbGVzL3RjX21vbm9jeXRlc19jZl90YWJsZV9iYXRjaC12e3Zlcn0ueGxzeCIpKQp0Y19tb25vY3l0ZXNfY2Zfc2lnX2JhdGNoIDwtIGV4dHJhY3Rfc2lnbmlmaWNhbnRfZ2VuZXMoCiAgICB0Y19tb25vY3l0ZXNfY2ZfdGFibGVfYmF0Y2gsCiAgICBleGNlbD1nbHVlOjpnbHVlKCJhbmFseXNlcy8zX2NhbGlfYW5kX3R1bWFjby9jZi9BbGxfU2FtcGxlcy90Y19tb25vY3l0ZXNfY2Zfc2lnX2JhdGNoLXZ7dmVyfS54bHN4IikpCmBgYAoKIyMgTmV1dHJvcGhpbHMsIHdpdGgob3V0KSBTVkEKCkxhc3QgdHJ5LCB0aGlzIHRpbWUgdXNpbmcgdGhlIE5ldXRyb3BoaWwgc2FtcGxlcy4KCmBgYHtyIGNmX3R1bWFjb19jYWxpX25ldXRyb3BoaWxzfQp0Y19uZXV0cm9waGlsc19jZiA8LSBzZXRfZXhwdF9jb25kaXRpb25zKHRjX25ldXRyb3BoaWxzLCBmYWN0PSJmaW5hbG91dGNvbWUiKQp0Y19uZXV0cm9waGlsc19jZl9kZV9zdmEgPC0gYWxsX3BhaXJ3aXNlKHRjX25ldXRyb3BoaWxzX2NmLCBmaWx0ZXI9VFJVRSwgbW9kZWxfYmF0Y2g9InN2YXNlcSIpCnRjX25ldXRyb3BoaWxzX2NmX3RhYmxlX3N2YSA8LSBjb21iaW5lX2RlX3RhYmxlcygKICAgIHRjX25ldXRyb3BoaWxzX2NmX2RlX3N2YSwga2VlcGVycz10X2NmX2NvbnRyYXN0LAogICAgcmRhPWdsdWU6OmdsdWUoInJkYS90Y19uZXV0cm9waGlsc19jZl90YWJsZV9zdmEtdnt2ZXJ9LnJkYSIpLAogICAgZXhjZWw9Z2x1ZTo6Z2x1ZSgiYW5hbHlzZXMvM19jYWxpX2FuZF90dW1hY28vY2YvTmV1dHJvcGhpbHMvdGNfbmV1dHJvcGhpbHNfY2ZfdGFibGVfc3ZhLXZ7dmVyfS54bHN4IikpCnRjX25ldXRyb3BoaWxzX2NmX3NpZ19zdmEgPC0gZXh0cmFjdF9zaWduaWZpY2FudF9nZW5lcygKICAgIHRjX25ldXRyb3BoaWxzX2NmX3RhYmxlX3N2YSwKICAgIGV4Y2VsPWdsdWU6OmdsdWUoImFuYWx5c2VzLzNfY2FsaV9hbmRfdHVtYWNvL2NmL0FsbF9TYW1wbGVzL3RjX25ldXRyb3BoaWxzX2NmX3NpZ19zdmEtdnt2ZXJ9Lnhsc3giKSkKCnRjX25ldXRyb3BoaWxzX2NmX2RlX2JhdGNoIDwtIGFsbF9wYWlyd2lzZSh0Y19uZXV0cm9waGlsc19jZiwgZmlsdGVyPVRSVUUsIG1vZGVsX2JhdGNoPVRSVUUpCnRjX25ldXRyb3BoaWxzX2NmX3RhYmxlX2JhdGNoIDwtIGNvbWJpbmVfZGVfdGFibGVzKAogICAgdGNfbmV1dHJvcGhpbHNfY2ZfZGVfYmF0Y2gsIGtlZXBlcnM9dF9jZl9jb250cmFzdCwKICAgIHJkYT1nbHVlOjpnbHVlKCJyZGEvdGNfbmV1dHJvcGhpbHNfY2ZfdGFibGVfYmF0Y2gtdnt2ZXJ9LnJkYSIpLAogICAgZXhjZWw9Z2x1ZTo6Z2x1ZSgiYW5hbHlzZXMvM19jYWxpX2FuZF90dW1hY28vY2YvQWxsX1NhbXBsZXMvdGNfbmV1dHJvcGhpbHNfY2ZfdGFibGVfYmF0Y2gtdnt2ZXJ9Lnhsc3giKSkKdGNfbmV1dHJvcGhpbHNfY2Zfc2lnX2JhdGNoIDwtIGV4dHJhY3Rfc2lnbmlmaWNhbnRfZ2VuZXMoCiAgICB0Y19uZXV0cm9waGlsc19jZl90YWJsZV9iYXRjaCwKICAgIGV4Y2VsPWdsdWU6OmdsdWUoImFuYWx5c2VzLzNfY2FsaV9hbmRfdHVtYWNvL2NmL0FsbF9TYW1wbGVzL3RjX25ldXRyb3BoaWxzX2NmX3NpZ19iYXRjaC12e3Zlcn0ueGxzeCIpKQpgYGAKCiMgT25seSBUdW1hY28gc2FtcGxlcwoKU3RhcnQgb3ZlciwgdGhpcyB0aW1lIHdpdGggb25seSB0aGUgc2FtcGxlcyBmcm9tIFR1bWFjby4gIFdlIGN1cnJlbnRseQphcmUgYXNzdW1pbmcgdGhlc2Ugd2lsbCBwcm92ZSB0byBiZSB0aGUgb25seSBhbmFseXNlcyB1c2VkIGZvciBmaW5hbAppbnRlcnByZXRhdGlvbi4gIFRoaXMgaXMgcHJpbWFyaWx5IGJlY2F1c2Ugd2UgaGF2ZSBpbnN1ZmZpY2llbnQKZmFpbGVkIHRyZWF0bWVudCBzYW1wbGVzIGZyb20gQ2FsaS4KCiMjIFNldCB0aGUgeGxzeCBvdXRwdXQgcHJlZml4CgpgYGB7ciB4bHN4X3ByZWZpeH0KeGxzeF9wcmVmaXggPC0gImFuYWx5c2VzLzRfdHVtYWNvL0RFX0N1cmVfdnNfRmFpbCIKYGBgCgojIyBBbGwgc2FtcGxlcwoKU3RhcnQgYnkgY29uc2lkZXJpbmcgYWxsIFR1bWFjbyBjZWxsIHR5cGVzLiAgTm90ZSB0aGF0IGluIHRoaXMgY2FzZSB3ZQpvbmx5IHVzZSBTVkEsIHByaW1hcmlseSBiZWNhdXNlIEkgYW0gbm90IGNlcnRhaW4gd2hhdCB3b3VsZCBiZSBhbgphcHByb3ByaWF0ZSBiYXRjaCBmYWN0b3IsIHBlcmhhcHMgdmlzaXQ/CgpgYGB7ciBjZl9hbGxfZGV9CnRfY2ZfY2xpbmljYWxfZGVfc3ZhIDwtIGFsbF9wYWlyd2lzZSh0X2NsaW5pY2FsLCBtb2RlbF9iYXRjaCA9ICJzdmFzZXEiLCBmaWx0ZXIgPSBUUlVFKQp0X2NmX2NsaW5pY2FsX3RhYmxlX3N2YSA8LSBjb21iaW5lX2RlX3RhYmxlcygKICAgIHRfY2ZfY2xpbmljYWxfZGVfc3ZhLCBrZWVwZXJzID0gdF9jZl9jb250cmFzdCwKICAgIHJkYT1nbHVlOjpnbHVlKCJyZGEvdF9jbGluaWNhbF9jZl90YWJsZV9zdmEtdnt2ZXJ9LnJkYSIpLAogICAgZXhjZWwgPSBnbHVlOjpnbHVlKCJ7eGxzeF9wcmVmaXh9L0FsbF9TYW1wbGVzL3RfY2xpbmljYWxfY2ZfdGFibGVzX3N2YS12e3Zlcn0ueGxzeCIpKQp0X2NmX2NsaW5pY2FsX3NpZ19zdmEgPC0gZXh0cmFjdF9zaWduaWZpY2FudF9nZW5lcygKICAgIHRfY2ZfY2xpbmljYWxfdGFibGVfc3ZhLAogICAgZXhjZWwgPSBnbHVlOjpnbHVlKCJ7eGxzeF9wcmVmaXh9L0FsbF9TYW1wbGVzL3RfY2xpbmljYWxfY2Zfc2lnX3N2YS12e3Zlcn0ueGxzeCIpKQoKZGltKHRfY2ZfY2xpbmljYWxfc2lnX3N2YSRkZXNlcSR1cHNbWzFdXSkKZGltKHRfY2ZfY2xpbmljYWxfc2lnX3N2YSRkZXNlcSRkb3duc1tbMV1dKQpgYGAKCiMjIGdQcm9maWxlciBzZWFyY2ggb2YgYWxsIHNhbXBsZXMKClRoZSBmb2xsb3dpbmcgZ1Byb2ZpbGVyIHNlYXJjaGVzIHVzZSB0aGUgYWxsX2dwcm9maWxlcigpIGZ1bmN0aW9uCmluc3RlYWQgb2Ygc2ltcGxlX2dwcm9maWxlcigpLiAgQXMgYSByZXN1bHQsIHRoZSByZXN1bHRzIGFyZSBzZXBhcmF0ZWQKYnkge2NvbnRyYXN0fV97ZGlyZWN0aW9ufS4gIFRodXMgJ291dGNvbWVfZG93bicuCgpUaGUgc2FtZSBwbG90cyBhcmUgYXZhaWxhYmxlIGFzIHRoZSBwcmV2aW91cyBnUHJvZmlsZXIgc2VhcmNoZXMsIGJ1dAppbiBtYW55IG9mIHRoZSBmb2xsb3dpbmcgcnVucywgSSB1c2VkIHRoZSBkb3RwbG90KCkgZnVuY3Rpb24gdG8gZ2V0IGEKc2xpZ2h0bHkgZGlmZmVyZW50IHZpZXcgb2YgdGhlIHJlc3VsdHMuCgpgYGB7ciB0X2NmX2NsaW5pY2FsX2dwcm9maWxlcn0KdF9jZl9jbGluaWNhbF9ncCA8LSBhbGxfZ3Byb2ZpbGVyKHRfY2ZfY2xpbmljYWxfc2lnX3N2YSkKIyMgV2lraXBhdGh3YXlzIG9mIHRoZSB1cCBjL2YgZ2VuZXMKZW5yaWNocGxvdDo6ZG90cGxvdCh0X2NmX2NsaW5pY2FsX2dwW1sib3V0Y29tZV91cCJdXVtbIldQX2VucmljaCJdXSkKCiMjIFRyYW5zY3JpcHRpb24gZmFjdG9yIGRhdGFiYXNlIG9mIHRoZSB1cCBjL2YgZ2VuZXMKZW5yaWNocGxvdDo6ZG90cGxvdCh0X2NmX2NsaW5pY2FsX2dwW1sib3V0Y29tZV91cCJdXVtbIlRGX2VucmljaCJdXSkKCiMjIFJlYWN0b21lIG9mIHRoZSB1cCBjL2YgZ2VuZXMKZW5yaWNocGxvdDo6ZG90cGxvdCh0X2NmX2NsaW5pY2FsX2dwW1sib3V0Y29tZV91cCJdXVtbIlJFQUNfZW5yaWNoIl1dKQoKIyMgR08gb2YgdGhlIGRvd24gYy9mIGdlbmVzCmVucmljaHBsb3Q6OmRvdHBsb3QodF9jZl9jbGluaWNhbF9ncFtbIm91dGNvbWVfZG93biJdXVtbIkdPX2VucmljaCJdXSkKdF9jZl9jbGluaWNhbF9ncFtbIm91dGNvbWVfdXAiXV1bWyJwdmFsdWVfcGxvdHMiXV1bWyJCUCJdXQoKIyMgUmVhY3RvbWUgb2YgdGhlIGRvd24gYy9mIGdlbmVzCmVucmljaHBsb3Q6OmRvdHBsb3QodF9jZl9jbGluaWNhbF9ncFtbIm91dGNvbWVfdXAiXV1bWyJSRUFDX2VucmljaCJdXSkKYGBgCgojIyMgU2VwYXJhdGUgdGhlIFR1bWFjbyBkYXRhIGJ5IHZpc2l0CgpPbmUgb2YgdGhlIG1vc3QgY29tcGVsbGluZyBpZGVhcyBpbiB0aGUgZGF0YSBpcyB0aGUgb3Bwb3J0dW5pdHkgdG8KZmluZCBnZW5lcyBpbiB0aGUgZmlyc3QgdmlzaXQgd2hpY2ggbWF5IGhlbHAgcHJlZGljdCB0aGUgbGlrZWxpaG9vZAp0aGF0IGEgcGVyc29uIHdpbGwgcmVzcG9uZCB3ZWxsIHRvIHRyZWF0bWVudC4gIFRoZSBmb2xsb3dpbmcgYmxvY2sKd2lsbCB0aGVyZWZvcmUgbG9vayBhdCBjdXJlL2ZhaWwgZnJvbSBUdW1hY28gYXQgdmlzaXQgMS4KCiMjIyMgQ3VyZS9GYWlsLCBUdW1hY28gVmlzaXQgMQoKYGBge3IgdHVtYWNvX3RpbWVwb2ludHNfdjF9CnRfY2ZfY2xpbmljYWxfdjFfZGVfc3ZhIDwtIGFsbF9wYWlyd2lzZSh0djFfc2FtcGxlcywgbW9kZWxfYmF0Y2ggPSAic3Zhc2VxIiwgZmlsdGVyID0gVFJVRSkKdF9jZl9jbGluaWNhbF92MV90YWJsZV9zdmEgPC0gY29tYmluZV9kZV90YWJsZXMoCiAgICB0X2NmX2NsaW5pY2FsX3YxX2RlX3N2YSwga2VlcGVycyA9IHRfY2ZfY29udHJhc3QsCiAgICByZGEgPSBnbHVlOjpnbHVlKCJyZGEvdF9jbGluaWNhbF92MV9jZl90YWJsZV9zdmEtdnt2ZXJ9LnJkYSIpLAogICAgZXhjZWwgPSBnbHVlOjpnbHVlKCJ7eGxzeF9wcmVmaXh9L0FsbF9TYW1wbGVzL3RfY2xpbmljYWxfdjFfY2ZfdGFibGVzX3N2YS12e3Zlcn0ueGxzeCIpKQp0X2NmX2NsaW5pY2FsX3YxX3NpZ19zdmEgPC0gZXh0cmFjdF9zaWduaWZpY2FudF9nZW5lcygKICAgIHRfY2ZfY2xpbmljYWxfdjFfdGFibGVfc3ZhLAogICAgZXhjZWwgPSBnbHVlOjpnbHVlKCJ7eGxzeF9wcmVmaXh9L0FsbF9TYW1wbGVzL3RfY2xpbmljYWxfdjFfY2Zfc2lnX3N2YS12e3Zlcn0ueGxzeCIpKQpkaW0odF9jZl9jbGluaWNhbF92MV9zaWdfc3ZhJGRlc2VxJHVwc1tbMV1dKQpkaW0odF9jZl9jbGluaWNhbF92MV9zaWdfc3ZhJGRlc2VxJGRvd25zW1sxXV0pCmBgYAoKIyMjIyBDdXJlL0ZhaWwsIFR1bWFjbyBWaXNpdCAyCgpUaGUgdmlzaXQgMiBhbmQgdmlzaXQgMyBzYW1wbGVzIGFyZSBpbnRlcmVzdGluZyBiZWNhdXNlIHRoZXkgcHJvdmlkZQphbiBvcHBvcnR1bml0eSB0byBzZWUgaWYgd2UgY2FuIG9ic2VydmUgY2hhbmdlcyBpbiByZXNwb25zZSBpbiB0aGUKbWlkZGxlIGFuZCBlbmQgb2YgdHJlYXRtZW50Li4uCgpgYGB7ciB0dW1hY29fdGltZV92Mn0KdF9jZl9jbGluaWNhbF92Ml9kZV9zdmEgPC0gYWxsX3BhaXJ3aXNlKHR2Ml9zYW1wbGVzLCBtb2RlbF9iYXRjaCA9ICJzdmFzZXEiLCBmaWx0ZXIgPSBUUlVFKQp0X2NmX2NsaW5pY2FsX3YyX3RhYmxlX3N2YSA8LSBjb21iaW5lX2RlX3RhYmxlcygKICAgIHRfY2ZfY2xpbmljYWxfdjJfZGVfc3ZhLCBrZWVwZXJzID0gdF9jZl9jb250cmFzdCwKICAgIHJkYT1nbHVlOjpnbHVlKCJyZGEvdF9jbGluaWNhbF92Ml9jZl90YWJsZV9zdmEtdnt2ZXJ9LnJkYSIpLAogICAgZXhjZWwgPSBnbHVlOjpnbHVlKCJ7eGxzeF9wcmVmaXh9L0FsbF9TYW1wbGVzL3RfY2xpbmljYWxfdjJfY2ZfdGFibGVzX3N2YS12e3Zlcn0ueGxzeCIpKQp0X2NmX2NsaW5pY2FsX3YyX3NpZ19zdmEgPC0gZXh0cmFjdF9zaWduaWZpY2FudF9nZW5lcygKICAgIHRfY2ZfY2xpbmljYWxfdjJfdGFibGVfc3ZhLAogICAgZXhjZWwgPSBnbHVlOjpnbHVlKCJ7eGxzeF9wcmVmaXh9L0FsbF9TYW1wbGVzL3RfY2xpbmljYWxfdjJfY2Zfc2lnX3N2YS12e3Zlcn0ueGxzeCIpKQpkaW0odF9jZl9jbGluaWNhbF92Ml9zaWdfc3ZhJGRlc2VxJHVwc1tbMV1dKQpkaW0odF9jZl9jbGluaWNhbF92Ml9zaWdfc3ZhJGRlc2VxJGRvd25zW1sxXV0pCmBgYAoKIyMjIyBDdXJlL0ZhaWwsIFR1bWFjbyBWaXNpdCAzCgpgYGB7ciB0dW1hY29fdGltZV92M30KdF9jZl9jbGluaWNhbF92M19kZV9zdmEgPC0gYWxsX3BhaXJ3aXNlKHR2M19zYW1wbGVzLCBtb2RlbF9iYXRjaCA9ICJzdmFzZXEiLCBmaWx0ZXIgPSBUUlVFKQp0X2NmX2NsaW5pY2FsX3YzX3RhYmxlX3N2YSA8LSBjb21iaW5lX2RlX3RhYmxlcygKICAgIHRfY2ZfY2xpbmljYWxfdjNfZGVfc3ZhLCBrZWVwZXJzID0gdF9jZl9jb250cmFzdCwKICAgIHJkYT1nbHVlOjpnbHVlKCJyZGEvdF9jbGluaWNhbF92M19jZl90YWJsZV9zdmEtdnt2ZXJ9LnJkYSIpLAogICAgZXhjZWwgPSBnbHVlOjpnbHVlKCJ7eGxzeF9wcmVmaXh9L0FsbF9TYW1wbGVzL3RfY2xpbmljYWxfdjNfY2ZfdGFibGVzX3N2YS12e3Zlcn0ueGxzeCIpKQp0X2NmX2NsaW5pY2FsX3YzX3NpZ19zdmEgPC0gZXh0cmFjdF9zaWduaWZpY2FudF9nZW5lcygKICAgIHRfY2ZfY2xpbmljYWxfdjNfdGFibGVfc3ZhLAogICAgZXhjZWwgPSBnbHVlOjpnbHVlKCJ7eGxzeF9wcmVmaXh9L0FsbF9TYW1wbGVzL3RfY2xpbmljYWxfdjNfY2Zfc2lnX3N2YS12e3Zlcn0ueGxzeCIpKQpkaW0odF9jZl9jbGluaWNhbF92M19zaWdfc3ZhJGRlc2VxJHVwc1tbMV1dKQpkaW0odF9jZl9jbGluaWNhbF92M19zaWdfc3ZhJGRlc2VxJGRvd25zW1sxXV0pCmBgYAoKIyMjIyBWaXNpdCAxIGdQcm9maWxlciBzZWFyY2hlcwoKSXQgbG9va3MgbGlrZSB0aGVyZSBhcmUgdmVyeSBmZXcgZ3JvdXBzIGluIHRoZSB2aXNpdCAxIHNpZ25pZmljYW50IGdlbmVzLgoKYGBge3IgdF9jZl9jbGluaWNhbF92MV9zaWdfc3ZhX2dwfQp0X2NmX2NsaW5pY2FsX3YxX3NpZ19zdmFfZ3AgPC0gYWxsX2dwcm9maWxlcih0X2NmX2NsaW5pY2FsX3YxX3NpZ19zdmEpCgojIyBXaWtpcGF0aHdheXMgb2YgdGhlIHVwIGMvZiBnZW5lcwplbnJpY2hwbG90Ojpkb3RwbG90KHRfY2ZfY2xpbmljYWxfdjFfc2lnX3N2YV9ncFtbIm91dGNvbWVfdXAiXV1bWyJHT19lbnJpY2giXV0pCmVucmljaHBsb3Q6OmRvdHBsb3QodF9jZl9jbGluaWNhbF92MV9zaWdfc3ZhX2dwW1sib3V0Y29tZV9kb3duIl1dW1siR09fZW5yaWNoIl1dKQpgYGAKCiMjIyMgVmlzaXQgMiBnUHJvZmlsZXIgc2VhcmNoZXMKClVwOiA3NCBHTywgNCBLRUdHLCA2IHJlYWN0b21lLCA0IFdQLCA1NiBURiwgMSBtaVJOQSwgMCBIUC9IUEEvQ09SVU0uCkRvd246ICAxOSBHTywgMSBLRUdHLCAxIEhQLCAyIEhQQSwgMCByZWFjdG9tZS93cC90Zi9jb3J1bQoKYGBge3IgdF9jZl9jbGluaWNhbF92Ml9zaWdfc3ZhX2dwfQp0X2NmX2NsaW5pY2FsX3YyX3NpZ19zdmFfZ3AgPC0gYWxsX2dwcm9maWxlcih0X2NmX2NsaW5pY2FsX3YyX3NpZ19zdmEpCgojIyBXaWtpcGF0aHdheXMgb2YgdGhlIHVwIGMvZiBnZW5lcwplbnJpY2hwbG90Ojpkb3RwbG90KHRfY2ZfY2xpbmljYWxfdjJfc2lnX3N2YV9ncFtbIm91dGNvbWVfdXAiXV1bWyJHT19lbnJpY2giXV0pCmVucmljaHBsb3Q6OmRvdHBsb3QodF9jZl9jbGluaWNhbF92Ml9zaWdfc3ZhX2dwW1sib3V0Y29tZV91cCJdXVtbIlJFQUNfZW5yaWNoIl1dKQplbnJpY2hwbG90Ojpkb3RwbG90KHRfY2ZfY2xpbmljYWxfdjJfc2lnX3N2YV9ncFtbIm91dGNvbWVfdXAiXV1bWyJURl9lbnJpY2giXV0pCgplbnJpY2hwbG90Ojpkb3RwbG90KHRfY2ZfY2xpbmljYWxfdjJfc2lnX3N2YV9ncFtbIm91dGNvbWVfZG93biJdXVtbIkdPX2VucmljaCJdXSkKYGBgCgojIyMjIFZpc2l0IDMgZ1Byb2ZpbGVyIHNlYXJjaGVzCgpVcDogMTIwIGdlbmVzOyAxNDEgR08sIDEgS0VHRywgNSBSZWFjdG9tZSwgMiBXUCwgMzAgVEYsIDEgbWlSTkEsIDAgSFBBL0NPUlVNL0hQCkRvd246IDYyIGdlbmVzOyAzMCBHTywgMiBLRUdHLCAxIFJlYWN0b21lLCAwIFdQL1RGL21pUk5BL0hQQS9DT1JVTS9IUCwKCmBgYHtyIHRfY2ZfY2xpbmljYWxfdjNfc2lnX3N2YV9ncHYyfQp0X2NmX2NsaW5pY2FsX3YzX3NpZ19zdmFfZ3AgPC0gYWxsX2dwcm9maWxlcih0X2NmX2NsaW5pY2FsX3YzX3NpZ19zdmEpCgojIyBXaWtpcGF0aHdheXMgb2YgdGhlIHVwIGMvZiBnZW5lcwplbnJpY2hwbG90Ojpkb3RwbG90KHRfY2ZfY2xpbmljYWxfdjNfc2lnX3N2YV9ncFtbIm91dGNvbWVfdXAiXV1bWyJHT19lbnJpY2giXV0pCmVucmljaHBsb3Q6OmRvdHBsb3QodF9jZl9jbGluaWNhbF92M19zaWdfc3ZhX2dwW1sib3V0Y29tZV91cCJdXVtbIlJFQUNfZW5yaWNoIl1dKQplbnJpY2hwbG90Ojpkb3RwbG90KHRfY2ZfY2xpbmljYWxfdjNfc2lnX3N2YV9ncFtbIm91dGNvbWVfdXAiXV1bWyJURl9lbnJpY2giXV0pCgplbnJpY2hwbG90Ojpkb3RwbG90KHRfY2ZfY2xpbmljYWxfdjNfc2lnX3N2YV9ncFtbIm91dGNvbWVfZG93biJdXVtbIkdPX2VucmljaCJdXSkKYGBgCgojIyMgUmVwZWF0IG5vIGJpb3BzaWVzCgpUaGUgYmlvcHN5IHNhbXBsZXMgYXJlIHByb2JsZW1hdGljIGZvciBhIGZldyByZWFzb25zLCBzbyBsZXQgdXMgcmVwZWF0CndpdGhvdXQgdGhlbS4KCmBgYHtyIGNmX2FsbF9kZV9ub2Jpb3B9CnRfY2ZfY2xpbmljYWxfbm9iaW9wX2RlX3N2YSA8LSBhbGxfcGFpcndpc2UodF9jbGluaWNhbF9ub2Jpb3AsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kZWxfYmF0Y2ggPSAic3Zhc2VxIiwgZmlsdGVyID0gVFJVRSkKdF9jZl9jbGluaWNhbF9ub2Jpb3BfdGFibGVfc3ZhIDwtIGNvbWJpbmVfZGVfdGFibGVzKAogICAgdF9jZl9jbGluaWNhbF9ub2Jpb3BfZGVfc3ZhLCBrZWVwZXJzID0gdF9jZl9jb250cmFzdCwKICAgIHJkYT1nbHVlOjpnbHVlKCJyZGEvdF9jbGluaWNhbF9ub2Jpb3BfY2ZfdGFibGVfc3ZhLXZ7dmVyfS5yZGEiKSwKICAgIGV4Y2VsID0gZ2x1ZTo6Z2x1ZSgie3hsc3hfcHJlZml4fS9Ob19CaW9wc2llcy90X2NsaW5pY2FsX25vYmlvcF9jZl90YWJsZXNfc3ZhLXZ7dmVyfS54bHN4IikpCnRfY2ZfY2xpbmljYWxfbm9iaW9wX3NpZ19zdmEgPC0gZXh0cmFjdF9zaWduaWZpY2FudF9nZW5lcygKICAgIHRfY2ZfY2xpbmljYWxfbm9iaW9wX3RhYmxlX3N2YSwKICAgIGV4Y2VsID0gZ2x1ZTo6Z2x1ZSgie3hsc3hfcHJlZml4fS9Ob19CaW9wc2llcy90X2NsaW5pY2FsX25vYmlvcF9jZl9zaWdfc3ZhLXZ7dmVyfS54bHN4IikpCgpkaW0odF9jZl9jbGluaWNhbF9ub2Jpb3Bfc2lnX3N2YSRkZXNlcSR1cHNbWzFdXSkKZGltKHRfY2ZfY2xpbmljYWxfbm9iaW9wX3NpZ19zdmEkZGVzZXEkZG93bnNbWzFdXSkKYGBgCgojIyMjIGdQcm9maWxlcjogQ2xpbmljYWwgbm8gYmlvcHNpZXMKClVwOiAxMzcgZ2VuZXM7IDg4IEdPLCAwIEtFR0csIDYgUmVhY3RvbWUsIDEgV1AsIDQ2IFRGLCAxIG1pUk5BLCAwIG90aGVycwpEb3duOiA3MyBnZW5lczsgNzggR08sIDEgS0VHRywgMSBSZWFjdG9tZSwgOSBURiwgMCBvdGhlcnMKCmBgYHtyIHRfY2Zfbm9iaW9wY2xpbmljYWxfdjNfc2lnX3N2YV9ncH0KdF9jZl9jbGluaWNhbF9ub2Jpb3Bfc2lnX3N2YV9ncCA8LSBhbGxfZ3Byb2ZpbGVyKHRfY2ZfY2xpbmljYWxfbm9iaW9wX3NpZ19zdmEpCgplbnJpY2hwbG90Ojpkb3RwbG90KHRfY2ZfY2xpbmljYWxfbm9iaW9wX3NpZ19zdmFfZ3BbWyJvdXRjb21lX3VwIl1dW1siR09fZW5yaWNoIl1dKQplbnJpY2hwbG90Ojpkb3RwbG90KHRfY2ZfY2xpbmljYWxfbm9iaW9wX3NpZ19zdmFfZ3BbWyJvdXRjb21lX3VwIl1dW1siVEZfZW5yaWNoIl1dKQoKZW5yaWNocGxvdDo6ZG90cGxvdCh0X2NmX2NsaW5pY2FsX25vYmlvcF9zaWdfc3ZhX2dwW1sib3V0Y29tZV9kb3duIl1dW1siR09fZW5yaWNoIl1dKQpgYGAKCiMjIyBCeSBjZWxsIHR5cGUKCk5vdyBsZXQgdXMgc3dpdGNoIG91ciB2aWV3IHRvIGVhY2ggaW5kaXZpZHVhbCBjZWxsIHR5cGUgY29sbGVjdGVkLgpUaGUgaG9wZSBoZXJlIGlzIHRoYXQgd2Ugd2lsbCBiZSBhYmxlIHRvIGxlYXJuIHNvbWUgY2VsbC1zcGVjaWZpYwpkaWZmZXJlbmNlcyBpbiB0aGUgcmVzcG9uc2UgZm9yIHBlb3BsZSB3aG8gZGlkKG5vdCkgcmVzcG9uZCB3ZWxsLgoKIyMjIyBDdXJlL0ZhaWwsIEJpb3BzaWVzCgpgYGB7ciBjZl9iaW9wc3lfZGV9CnRfY2ZfYmlvcHN5X2RlX3N2YSA8LSBhbGxfcGFpcndpc2UodF9iaW9wc2llcywgbW9kZWxfYmF0Y2ggPSAic3Zhc2VxIiwgZmlsdGVyID0gVFJVRSkKdF9jZl9iaW9wc3lfdGFibGVfc3ZhIDwtIGNvbWJpbmVfZGVfdGFibGVzKAogICAgdF9jZl9iaW9wc3lfZGVfc3ZhLCBrZWVwZXJzID0gY2ZfY29udHJhc3QsCiAgICByZGE9Z2x1ZTo6Z2x1ZSgicmRhL3RfYmlvcHN5X2NmX3RhYmxlX3N2YS12e3Zlcn0ucmRhIiksCiAgICBleGNlbCA9IGdsdWU6OmdsdWUoInt4bHN4X3ByZWZpeH0vQmlvcHNpZXMvdF9iaW9wc3lfY2ZfdGFibGVzX3N2YS12e3Zlcn0ueGxzeCIpKQp0X2NmX2Jpb3BzeV9zaWdfc3ZhIDwtIGV4dHJhY3Rfc2lnbmlmaWNhbnRfZ2VuZXMoCiAgICB0X2NmX2Jpb3BzeV90YWJsZV9zdmEsCiAgICBleGNlbCA9IGdsdWU6OmdsdWUoInt4bHN4X3ByZWZpeH0vQmlvcHNpZXMvdF9jZl9iaW9wc3lfc2lnX3N2YS12e3Zlcn0ueGxzeCIpKQoKZGltKHRfY2ZfYmlvcHN5X3NpZ19zdmEkZGVzZXEkdXBzW1sxXV0pCmRpbSh0X2NmX2Jpb3BzeV9zaWdfc3ZhJGRlc2VxJGRvd25zW1sxXV0pCmBgYAoKIyMjIyBnUHJvZmlsZXI6IEJpb3BzaWVzCgpVcDogMTcgZ2VuZXM7IDc0IEdPLCAzIEtFR0csIDEgUmVhY3RvbWUsIDMgV1AsIDEgVEYsIDAgb3RoZXJzCkRvd246IDExIGdlbmVzOyAyIEdPLCAwIG90aGVycwoKYGBge3IgdF9jZl9jbGluaWNhbF92M19zaWdfc3ZhX2dwfQp0X2NmX2Jpb3BzeV9zaWdfc3ZhX2dwIDwtIGFsbF9ncHJvZmlsZXIodF9jZl9iaW9wc3lfc2lnX3N2YSkKCmVucmljaHBsb3Q6OmRvdHBsb3QodF9jZl9iaW9wc3lfc2lnX3N2YV9ncFtbIm91dGNvbWVfdXAiXV1bWyJHT19lbnJpY2giXV0pCmVucmljaHBsb3Q6OmRvdHBsb3QodF9jZl9iaW9wc3lfc2lnX3N2YV9ncFtbIm91dGNvbWVfdXAiXV1bWyJXUF9lbnJpY2giXV0pCgplbnJpY2hwbG90Ojpkb3RwbG90KHRfY2ZfYmlvcHN5X3NpZ19zdmFfZ3BbWyJvdXRjb21lX2Rvd24iXV1bWyJHT19lbnJpY2giXV0pCmBgYAoKIyMjIyBDdXJlL0ZhaWwsIE1vbm9jeXRlcwoKU2FtZSBxdWVzdGlvbiwgYnV0IHRoaXMgdGltZSBsb29raW5nIGF0IG1vbm9jeXRlcy4gIEluIGFkZGl0aW9uLCB0aGlzCmNvbXBhcmlzb24gd2FzIGRvbmUgdHdpY2UsIG9uY2UgdXNpbmcgU1ZBIGFuZCBvbmNlIHVzaW5nIHZpc2l0IGFzIGEKYmF0Y2ggZmFjdG9yLgoKYGBge3IgY2ZfbW9ub2N5dGVfZGV9CnRfY2ZfbW9ub2N5dGVfZGVfc3ZhIDwtIGFsbF9wYWlyd2lzZSh0X21vbm9jeXRlcywgbW9kZWxfYmF0Y2ggPSAic3Zhc2VxIiwgZmlsdGVyID0gVFJVRSkKCnRfY2ZfbW9ub2N5dGVfdGFibGVzX3N2YSA8LSBjb21iaW5lX2RlX3RhYmxlcygKICAgIHRfY2ZfbW9ub2N5dGVfZGVfc3ZhLCBrZWVwZXJzID0gY2ZfY29udHJhc3QsCiAgICByZGE9Z2x1ZTo6Z2x1ZSgicmRhL3RfbW9ub2N5dGVfY2ZfdGFibGVfc3ZhLXZ7dmVyfS5yZGEiKSwKICAgIGV4Y2VsID0gZ2x1ZTo6Z2x1ZSgie3hsc3hfcHJlZml4fS9Nb25vY3l0ZXMvdF9tb25vY3l0ZV9jZl90YWJsZXNfc3ZhLXZ7dmVyfS54bHN4IikpCnRfY2ZfbW9ub2N5dGVfc2lnX3N2YSA8LSBleHRyYWN0X3NpZ25pZmljYW50X2dlbmVzKAogICAgdF9jZl9tb25vY3l0ZV90YWJsZXNfc3ZhLAogICAgZXhjZWwgPSBnbHVlOjpnbHVlKCJ7eGxzeF9wcmVmaXh9L01vbm9jeXRlcy90X21vbm9jeXRlX2NmX3NpZ19zdmEtdnt2ZXJ9Lnhsc3giKSkKCmRpbSh0X2NmX21vbm9jeXRlX3NpZ19zdmEkZGVzZXEkdXBzW1sxXV0pCmRpbSh0X2NmX21vbm9jeXRlX3NpZ19zdmEkZGVzZXEkZG93bnNbWzFdXSkKCnRfY2ZfbW9ub2N5dGVfZGVfYmF0Y2h2aXNpdCA8LSBhbGxfcGFpcndpc2UodF9tb25vY3l0ZXMsIG1vZGVsX2JhdGNoID0gVFJVRSwgZmlsdGVyID0gVFJVRSkKCnRfY2ZfbW9ub2N5dGVfdGFibGVzX2JhdGNodmlzaXQgPC0gY29tYmluZV9kZV90YWJsZXMoCiAgICB0X2NmX21vbm9jeXRlX2RlX2JhdGNodmlzaXQsIGtlZXBlcnMgPSBjZl9jb250cmFzdCwKICAgIHJkYT1nbHVlOjpnbHVlKCJyZGEvdF9tb25vY3l0ZV9jZl90YWJsZV9iYXRjaHZpc2l0LXZ7dmVyfS5yZGEiKSwKICAgIGV4Y2VsID0gZ2x1ZTo6Z2x1ZSgie3hsc3hfcHJlZml4fS9Nb25vY3l0ZXMvdF9tb25vY3l0ZV9jZl90YWJsZXNfYmF0Y2h2aXNpdC12e3Zlcn0ueGxzeCIpKQp0X2NmX21vbm9jeXRlX3NpZ19iYXRjaHZpc2l0IDwtIGV4dHJhY3Rfc2lnbmlmaWNhbnRfZ2VuZXMoCiAgICB0X2NmX21vbm9jeXRlX3RhYmxlc19iYXRjaHZpc2l0LAogICAgZXhjZWwgPSBnbHVlOjpnbHVlKCJ7eGxzeF9wcmVmaXh9L01vbm9jeXRlcy90X21vbm9jeXRlX2NmX3NpZ19iYXRjaHZpc2l0LXZ7dmVyfS54bHN4IikpCgpkaW0odF9jZl9tb25vY3l0ZV9zaWdfYmF0Y2h2aXNpdCRkZXNlcSR1cHNbWzFdXSkKZGltKHRfY2ZfbW9ub2N5dGVfc2lnX2JhdGNodmlzaXQkZGVzZXEkZG93bnNbWzFdXSkKYGBgCgojIyMjIGdQcm9maWxlcjogTW9ub2N5dGVzCgpOb3cgdGhhdCBJIGFtIGxvb2tpbmcgYmFjayBvdmVyIHRoZXNlIHJlc3VsdHMsIEkgYW0gbm90IGNvbXBlbHRlbHkKY2VydGFpbiB3aHkgSSBvbmx5IGRpZCB0aGUgZ3Byb2ZpbGVyIHNlYXJjaCBmb3IgdGhlIHN2YSBkYXRhLi4uCgpVcDogNjAgZ2VuZXM7IDEyIEdPLCAxIEtFR0csIDEgV1AsIDQgVEYsIDAgb3RoZXJzCkRvd246IDUzIGdlbmVzOyAyNiBHTywgMSBLRUdHLCAxIFJlYWN0b21lLCAyIFRGLCAwIG90aGVycwoKYGBge3IgdF9jZl9tb25vY3l0ZV9zaWdfc3ZhX2dwfQp0X2NmX21vbm9jeXRlX3NpZ19zdmFfZ3AgPC0gYWxsX2dwcm9maWxlcih0X2NmX21vbm9jeXRlX3NpZ19zdmEpCgplbnJpY2hwbG90Ojpkb3RwbG90KHRfY2ZfbW9ub2N5dGVfc2lnX3N2YV9ncFtbIm91dGNvbWVfdXAiXV1bWyJHT19lbnJpY2giXV0pCmVucmljaHBsb3Q6OmRvdHBsb3QodF9jZl9tb25vY3l0ZV9zaWdfc3ZhX2dwW1sib3V0Y29tZV91cCJdXVtbIlRGX2VucmljaCJdXSkKCmVucmljaHBsb3Q6OmRvdHBsb3QodF9jZl9tb25vY3l0ZV9zaWdfc3ZhX2dwW1sib3V0Y29tZV9kb3duIl1dW1siR09fZW5yaWNoIl1dKQoKdF9jZl9tb25vY3l0ZV9zaWdfYmF0Y2hfZ3AgPC0gYWxsX2dwcm9maWxlcih0X2NmX21vbm9jeXRlX3NpZ19iYXRjaHZpc2l0KQplbnJpY2hwbG90Ojpkb3RwbG90KHRfY2ZfbW9ub2N5dGVfc2lnX2JhdGNoX2dwW1sib3V0Y29tZV91cCJdXVtbIkdPX2VucmljaCJdXSkKZW5yaWNocGxvdDo6ZG90cGxvdCh0X2NmX21vbm9jeXRlX3NpZ19iYXRjaF9ncFtbIm91dGNvbWVfdXAiXV1bWyJIUF9lbnJpY2giXV0pCmBgYAoKIyMjIEluZGl2aWR1YWwgdmlzaXRzLCBNb25vY3l0ZXMKCk5vdyBmb2N1cyBpbiBvbiB0aGUgbW9ub2N5dGUgc2FtcGxlcyBvbiBhIHBlci12aXNpdCBiYXNpcy4KCiMjIyMgVmlzaXQgMQoKYGBge3IgY2ZfbW9ub2N5dGVfZGVfdmlzaXRzX3YxfQp0X2NmX21vbm9jeXRlX3YxX2RlX3N2YSA8LSBhbGxfcGFpcndpc2UodHYxX21vbm9jeXRlcywgbW9kZWxfYmF0Y2ggPSAic3Zhc2VxIiwgZmlsdGVyID0gVFJVRSkKdF9jZl9tb25vY3l0ZV92MV90YWJsZXNfc3ZhIDwtIGNvbWJpbmVfZGVfdGFibGVzKAogICAgdF9jZl9tb25vY3l0ZV92MV9kZV9zdmEsIGtlZXBlcnMgPSBjZl9jb250cmFzdCwKICAgIHJkYT1nbHVlOjpnbHVlKCJyZGEvdF9tb25vY3l0ZV92MV9jZl90YWJsZV9zdmEtdnt2ZXJ9LnJkYSIpLAogICAgZXhjZWwgPSBnbHVlOjpnbHVlKCJ7eGxzeF9wcmVmaXh9L01vbm9jeXRlcy90X21vbm9jeXRlX3YxX2NmX3RhYmxlc19zdmEtdnt2ZXJ9Lnhsc3giKSkKdF9jZl9tb25vY3l0ZV92MV9zaWdfc3ZhIDwtIGV4dHJhY3Rfc2lnbmlmaWNhbnRfZ2VuZXMoCiAgICB0X2NmX21vbm9jeXRlX3YxX3RhYmxlc19zdmEsCiAgICBleGNlbCA9IGdsdWU6OmdsdWUoInt4bHN4X3ByZWZpeH0vTW9ub2N5dGVzL3RfbW9ub2N5dGVfdjFfY2Zfc2lnX3N2YS12e3Zlcn0ueGxzeCIpKQpkaW0odF9jZl9tb25vY3l0ZV92MV9zaWdfc3ZhJGRlc2VxJHVwc1tbMV1dKQpkaW0odF9jZl9tb25vY3l0ZV92MV9zaWdfc3ZhJGRlc2VxJGRvd25zW1sxXV0pCmBgYAoKIyMjIyBWaXNpdCAyCgpgYGB7ciBjZl9tb25vY3l0ZV9kZV92aXNpdHNfdjJ9CnRfY2ZfbW9ub2N5dGVfdjJfZGVfc3ZhIDwtIGFsbF9wYWlyd2lzZSh0djJfbW9ub2N5dGVzLCBtb2RlbF9iYXRjaCA9ICJzdmFzZXEiLCBmaWx0ZXIgPSBUUlVFKQp0X2NmX21vbm9jeXRlX3YyX3RhYmxlc19zdmEgPC0gY29tYmluZV9kZV90YWJsZXMoCiAgICB0X2NmX21vbm9jeXRlX3YyX2RlX3N2YSwga2VlcGVycyA9IGNmX2NvbnRyYXN0LAogICAgcmRhPWdsdWU6OmdsdWUoInJkYS90X21vbm9jeXRlX3YyX2NmX3RhYmxlX3N2YS12e3Zlcn0ucmRhIiksCiAgICBleGNlbCA9IGdsdWU6OmdsdWUoInt4bHN4X3ByZWZpeH0vTW9ub2N5dGVzL3RfbW9ub2N5dGVfdjJfY2ZfdGFibGVzX3N2YS12e3Zlcn0ueGxzeCIpKQp0X2NmX21vbm9jeXRlX3YyX3NpZ19zdmEgPC0gZXh0cmFjdF9zaWduaWZpY2FudF9nZW5lcygKICAgIHRfY2ZfbW9ub2N5dGVfdjJfdGFibGVzX3N2YSwKICAgIGV4Y2VsID0gZ2x1ZTo6Z2x1ZSgie3hsc3hfcHJlZml4fS9Nb25vY3l0ZXMvdF9tb25vY3l0ZV92Ml9jZl9zaWdfc3ZhLXZ7dmVyfS54bHN4IikpCmRpbSh0X2NmX21vbm9jeXRlX3YyX3NpZ19zdmEkZGVzZXEkdXBzW1sxXV0pCmRpbSh0X2NmX21vbm9jeXRlX3YyX3NpZ19zdmEkZGVzZXEkZG93bnNbWzFdXSkKYGBgCgojIyMjIFZpc2l0IDMKCmBgYHtyIGNmX21vbm9jeXRlX2RlX3Zpc2l0c192M30KdF9jZl9tb25vY3l0ZV92M19kZV9zdmEgPC0gYWxsX3BhaXJ3aXNlKHR2M19tb25vY3l0ZXMsIG1vZGVsX2JhdGNoID0gInN2YXNlcSIsIGZpbHRlciA9IFRSVUUpCnRfY2ZfbW9ub2N5dGVfdjNfdGFibGVzX3N2YSA8LSBjb21iaW5lX2RlX3RhYmxlcygKICAgIHRfY2ZfbW9ub2N5dGVfdjNfZGVfc3ZhLCBrZWVwZXJzID0gY2ZfY29udHJhc3QsCiAgICByZGE9Z2x1ZTo6Z2x1ZSgicmRhL3RfbW9ub2N5dGVfdjNfY2ZfdGFibGVfc3ZhLXZ7dmVyfS5yZGEiKSwKICAgIGV4Y2VsID0gZ2x1ZTo6Z2x1ZSgie3hsc3hfcHJlZml4fS9Nb25vY3l0ZXMvdF9tb25vY3l0ZV92M19jZl90YWJsZXNfc3ZhLXZ7dmVyfS54bHN4IikpCnRfY2ZfbW9ub2N5dGVfdjNfc2lnX3N2YSA8LSBleHRyYWN0X3NpZ25pZmljYW50X2dlbmVzKAogICAgdF9jZl9tb25vY3l0ZV92M190YWJsZXNfc3ZhLAogICAgZXhjZWwgPSBnbHVlOjpnbHVlKCJ7eGxzeF9wcmVmaXh9L01vbm9jeXRlcy90X21vbm9jeXRlX3YzX2NmX3NpZ19zdmEtdnt2ZXJ9Lnhsc3giKSkKZGltKHRfY2ZfbW9ub2N5dGVfdjNfc2lnX3N2YSRkZXNlcSR1cHNbWzFdXSkKZGltKHRfY2ZfbW9ub2N5dGVfdjNfc2lnX3N2YSRkZXNlcSRkb3duc1tbMV1dKQpgYGAKCiMjIyMgTW9ub2N5dGVzOiBDb21wYXJlIHN2YSB0byBiYXRjaC1pbi1tb2RlbAoKYGBge3IgYXVjY19tb25vY3l0ZX0Kc3ZhX2F1Y2MgPC0gY2FsY3VsYXRlX2F1Y2ModF9jZl9tb25vY3l0ZV90YWJsZXNfc3ZhW1siZGF0YSJdXVtbMV1dLAogICAgICAgICAgICAgICAgICAgICAgICAgICB0YmwyPXRfY2ZfbW9ub2N5dGVfdGFibGVzX2JhdGNodmlzaXRbWyJkYXRhIl1dW1sxXV0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHB5PSJkZXNlcV9hZGpwIiwgbHk9ImRlc2VxX2xvZ2ZjIikKc3ZhX2F1Y2MKCnNoYXJlZF9pZHMgPC0gcm93bmFtZXModF9jZl9tb25vY3l0ZV90YWJsZXNfc3ZhW1siZGF0YSJdXVtbMV1dKSAlaW4lCiAgcm93bmFtZXModF9jZl9tb25vY3l0ZV90YWJsZXNfYmF0Y2h2aXNpdFtbImRhdGEiXV1bWzFdXSkKZmlyc3QgPC0gdF9jZl9tb25vY3l0ZV90YWJsZXNfc3ZhW1siZGF0YSJdXVtbMV1dW3NoYXJlZF9pZHMsIF0Kc2Vjb25kIDwtIHRfY2ZfbW9ub2N5dGVfdGFibGVzX2JhdGNodmlzaXRbWyJkYXRhIl1dW1sxXV1bcm93bmFtZXMoZmlyc3QpLCBdCmNvci50ZXN0KGZpcnN0W1siZGVzZXFfbG9nZmMiXV0sIHNlY29uZFtbImRlc2VxX2xvZ2ZjIl1dKQpgYGAKCiMjIyMjIGdQcm9maWxlcjogTW9ub2N5dGVzIGJ5IHZpc2l0LCBWMQoKVjE6IFVwOiAxNCBnZW5lczsgTm8gY2F0ZWdvcmllcwpWMTogRG93bjogNTIgZ2VuZXM7IDIwIEdPLCA1IFRGCgpgYGB7ciB0X2NmX21vbm9jeXRlX3NpZ19zdmFfZ3BfdmlzaXRzfQp0X2NmX21vbm9jeXRlX3YxX3NpZ19zdmFfZ3AgPC0gYWxsX2dwcm9maWxlcih0X2NmX21vbm9jeXRlX3YxX3NpZ19zdmEpCgplbnJpY2hwbG90Ojpkb3RwbG90KHRfY2ZfbW9ub2N5dGVfdjFfc2lnX3N2YV9ncFtbIm91dGNvbWVfZG93biJdXVtbIkdPX2VucmljaCJdXSkKYGBgCgojIyMjIyBnUHJvZmlsZXI6IE1vbm9jeXRlcyBieSB2aXNpdCwgVjIKClYyOiBVcDogMSBnZW5lClYyOiBEb3duOiAwIGdlbmVzLgoKIyMjIyMgZ1Byb2ZpbGVyOiBNb25vY3l0ZXMgYnkgdmlzaXQsIFYzCgpWMzogVXA6IDQgZ2VuZXMuClYzOiBEb3duOiAwIGdlbmVzLgoKIyMjIE5ldXRyb3BoaWwgc2FtcGxlcwoKU3dpdGNoIGNvbnRleHQgdG8gdGhlIE5ldXRyb3BoaWxzLCBvbmNlIGFnYWluIHJlcGVhdCB0aGUgYW5hbHlzaXMKdXNpbmcgU1ZBIGFuZCB2aXNpdCBhcyBhIGJhdGNoIGZhY3Rvci4KCmBgYHtyIG5ldXRyb3BoaWxfb25seX0KdF9jZl9uZXV0cm9waGlsX2RlX3N2YSA8LSBhbGxfcGFpcndpc2UodF9uZXV0cm9waGlscywgbW9kZWxfYmF0Y2ggPSAic3Zhc2VxIiwgZmlsdGVyID0gVFJVRSkKCnRfY2ZfbmV1dHJvcGhpbF90YWJsZXNfc3ZhIDwtIGNvbWJpbmVfZGVfdGFibGVzKAogICAgdF9jZl9uZXV0cm9waGlsX2RlX3N2YSwga2VlcGVycyA9IGNmX2NvbnRyYXN0LAogICAgcmRhPWdsdWU6OmdsdWUoInJkYS90X25ldXRyb3BoaWxfY2ZfdGFibGVfc3ZhLXZ7dmVyfS5yZGEiKSwKICAgIGV4Y2VsID0gZ2x1ZTo6Z2x1ZSgie3hsc3hfcHJlZml4fS9OZXV0cm9waGlscy90X25ldXRyb3BoaWxfY2ZfdGFibGVzX3N2YS12e3Zlcn0ueGxzeCIpKQp0X2NmX25ldXRyb3BoaWxfc2lnX3N2YSA8LSBleHRyYWN0X3NpZ25pZmljYW50X2dlbmVzKAogICAgdF9jZl9uZXV0cm9waGlsX3RhYmxlc19zdmEsCiAgICBleGNlbCA9IGdsdWU6OmdsdWUoInt4bHN4X3ByZWZpeH0vTmV1dHJvcGhpbHMvdF9uZXV0cm9waGlsX2NmX3NpZ19zdmEtdnt2ZXJ9Lnhsc3giKSkKCmRpbSh0X2NmX25ldXRyb3BoaWxfc2lnX3N2YSRkZXNlcSR1cHNbWzFdXSkKZGltKHRfY2ZfbmV1dHJvcGhpbF9zaWdfc3ZhJGRlc2VxJGRvd25zW1sxXV0pCgp0X2NmX25ldXRyb3BoaWxfZGVfYmF0Y2h2aXNpdCA8LSBhbGxfcGFpcndpc2UodF9uZXV0cm9waGlscywgbW9kZWxfYmF0Y2ggPSBUUlVFLCBmaWx0ZXIgPSBUUlVFKQoKdF9jZl9uZXV0cm9waGlsX3RhYmxlc19iYXRjaHZpc2l0IDwtIGNvbWJpbmVfZGVfdGFibGVzKAogICAgdF9jZl9uZXV0cm9waGlsX2RlX2JhdGNodmlzaXQsIGtlZXBlcnMgPSBjZl9jb250cmFzdCwKICAgIHJkYT1nbHVlOjpnbHVlKCJyZGEvdF9uZXV0cm9waGlsX2NmX3RhYmxlX2JhdGNodmlzaXQtdnt2ZXJ9LnJkYSIpLAogICAgZXhjZWwgPSBnbHVlOjpnbHVlKCJ7eGxzeF9wcmVmaXh9L05ldXRyb3BoaWxzL3RfbmV1dHJvcGhpbF9jZl90YWJsZXNfYmF0Y2h2aXNpdC12e3Zlcn0ueGxzeCIpKQp0X2NmX25ldXRyb3BoaWxfc2lnX2JhdGNodmlzaXQgPC0gZXh0cmFjdF9zaWduaWZpY2FudF9nZW5lcygKICAgIHRfY2ZfbmV1dHJvcGhpbF90YWJsZXNfYmF0Y2h2aXNpdCwKICAgIGV4Y2VsID0gZ2x1ZTo6Z2x1ZSgie3hsc3hfcHJlZml4fS9OZXV0cm9waGlscy90X25ldXRyb3BoaWxfY2Zfc2lnX2JhdGNodmlzaXQtdnt2ZXJ9Lnhsc3giKSkKCmRpbSh0X2NmX25ldXRyb3BoaWxfc2lnX2JhdGNodmlzaXQkZGVzZXEkdXBzW1sxXV0pCmRpbSh0X2NmX25ldXRyb3BoaWxfc2lnX2JhdGNodmlzaXQkZGVzZXEkZG93bnNbWzFdXSkKYGBgCgojIyMjIGdQcm9maWxlcjogTmV1dHJvcGhpbHMKClVwOiA4NCBnZW5lczsgNSBHTywgMiBSZWFjdG9tZSwgMyBURiwgbm8gb3RoZXJzLgpEb3duOiAyOSBnZW5lczogMTIgR08sIDEgUmVhY3RvbWUsIDEgVEYsIDEgbWlSTkEsIDExIEhQLCAwIG90aGVycwoKYGBge3IgdF9jZl9uZXV0cm9waGlsX3NpZ19zdmFfZ3B9CnRfY2ZfbmV1dHJvcGhpbF9zaWdfc3ZhX2dwIDwtIGFsbF9ncHJvZmlsZXIodF9jZl9uZXV0cm9waGlsX3NpZ19zdmEpCgplbnJpY2hwbG90Ojpkb3RwbG90KHRfY2ZfbmV1dHJvcGhpbF9zaWdfc3ZhX2dwW1sib3V0Y29tZV91cCJdXVtbIkdPX2VucmljaCJdXSkKZW5yaWNocGxvdDo6ZG90cGxvdCh0X2NmX25ldXRyb3BoaWxfc2lnX3N2YV9ncFtbIm91dGNvbWVfdXAiXV1bWyJURl9lbnJpY2giXV0pCgplbnJpY2hwbG90Ojpkb3RwbG90KHRfY2ZfbmV1dHJvcGhpbF9zaWdfc3ZhX2dwW1sib3V0Y29tZV9kb3duIl1dW1siR09fZW5yaWNoIl1dKQplbnJpY2hwbG90Ojpkb3RwbG90KHRfY2ZfbmV1dHJvcGhpbF9zaWdfc3ZhX2dwW1sib3V0Y29tZV9kb3duIl1dW1siSFBfZW5yaWNoIl1dKQpgYGAKCiMjIyMgTmV1dHJvcGhpbHMgYnkgdmlzaXQKCldoZW4gSSBkaWQgdGhpcyB3aXRoIHRoZSBtb25vY3l0ZXMsIEkgc3BsaXQgaXQgdXAgaW50byBtdWx0aXBsZSBibG9ja3MKZm9yIGVhY2ggdmlzaXQuICBUaGlzIHRpbWUgSSBhbSBqdXN0IGdvaW5nIHRvIHJ1biB0aGVtIGFsbCB0b2dldGhlci4KCmBgYHtyIG5ldXRyb3BoaWxfdmlzaXRzfQp2aXNpdGNmX2ZhY3RvciA8LSBwYXN0ZTAoInYiLCBwRGF0YSh0X25ldXRyb3BoaWxzKVtbInZpc2l0bnVtYmVyIl1dLAogICAgICAgICAgICAgICAgICAgICAgICAgcERhdGEodF9uZXV0cm9waGlscylbWyJmaW5hbG91dGNvbWUiXV0pCnRfbmV1dHJvcGhpbF92aXNpdGNmIDwtIHNldF9leHB0X2NvbmRpdGlvbnModF9uZXV0cm9waGlscywgZmFjdD12aXNpdGNmX2ZhY3RvcikKCnRfY2ZfbmV1dHJvcGhpbF92aXNpdHNfZGVfc3ZhIDwtIGFsbF9wYWlyd2lzZSh0X25ldXRyb3BoaWxfdmlzaXRjZiwgbW9kZWxfYmF0Y2ggPSAic3Zhc2VxIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbHRlciA9IFRSVUUpCgp0X2NmX25ldXRyb3BoaWxfdmlzaXRzX3RhYmxlc19zdmEgPC0gY29tYmluZV9kZV90YWJsZXMoCiAgICB0X2NmX25ldXRyb3BoaWxfdmlzaXRzX2RlX3N2YSwga2VlcGVycyA9IHZpc2l0Y2ZfY29udHJhc3RzLAogICAgcmRhPWdsdWU6OmdsdWUoInJkYS90X25ldXRyb3BoaWxfdmlzaXRjZl90YWJsZV9zdmEtdnt2ZXJ9LnJkYSIpLAogICAgZXhjZWwgPSBnbHVlOjpnbHVlKCJ7eGxzeF9wcmVmaXh9L05ldXRyb3BoaWxzL3RfbmV1dHJvcGhpbF92aXNpdGNmX3RhYmxlc19zdmEtdnt2ZXJ9Lnhsc3giKSkKdF9jZl9uZXV0cm9waGlsX3Zpc2l0c19zaWdfc3ZhIDwtIGV4dHJhY3Rfc2lnbmlmaWNhbnRfZ2VuZXMoCiAgICB0X2NmX25ldXRyb3BoaWxfdmlzaXRzX3RhYmxlc19zdmEsCiAgICBleGNlbCA9IGdsdWU6OmdsdWUoInt4bHN4X3ByZWZpeH0vTmV1dHJvcGhpbHMvdF9uZXV0cm9waGlsX3Zpc2l0Y2Zfc2lnX3N2YS12e3Zlcn0ueGxzeCIpKQpkaW0odF9jZl9uZXV0cm9waGlsX3Zpc2l0c19zaWdfc3ZhJGRlc2VxJHVwc1tbMV1dKQpkaW0odF9jZl9uZXV0cm9waGlsX3Zpc2l0c19zaWdfc3ZhJGRlc2VxJGRvd25zW1sxXV0pCgp0X2NmX25ldXRyb3BoaWxfdjFfZGVfc3ZhIDwtIGFsbF9wYWlyd2lzZSh0djFfbmV1dHJvcGhpbHMsIG1vZGVsX2JhdGNoID0gInN2YXNlcSIsIGZpbHRlciA9IFRSVUUpCnRfY2ZfbmV1dHJvcGhpbF92MV90YWJsZXNfc3ZhIDwtIGNvbWJpbmVfZGVfdGFibGVzKAogICAgdF9jZl9uZXV0cm9waGlsX3YxX2RlX3N2YSwga2VlcGVycyA9IGNmX2NvbnRyYXN0LAogICAgcmRhPWdsdWU6OmdsdWUoInJkYS90X25ldXRyb3BoaWxfdjFfY2ZfdGFibGVfc3ZhLXZ7dmVyfS5yZGEiKSwKICAgIGV4Y2VsID0gZ2x1ZTo6Z2x1ZSgie3hsc3hfcHJlZml4fS9OZXV0cm9waGlscy90X25ldXRyb3BoaWxfdjFfY2ZfdGFibGVzX3N2YS12e3Zlcn0ueGxzeCIpKQp0X2NmX25ldXRyb3BoaWxfdjFfc2lnX3N2YSA8LSBleHRyYWN0X3NpZ25pZmljYW50X2dlbmVzKAogICAgdF9jZl9uZXV0cm9waGlsX3YxX3RhYmxlc19zdmEsCiAgICBleGNlbCA9IGdsdWU6OmdsdWUoInt4bHN4X3ByZWZpeH0vTmV1dHJvcGhpbHMvdF9uZXV0cm9waGlsX3YxX2NmX3NpZ19zdmEtdnt2ZXJ9Lnhsc3giKSkKZGltKHRfY2ZfbmV1dHJvcGhpbF92MV9zaWdfc3ZhJGRlc2VxJHVwc1tbMV1dKQpkaW0odF9jZl9uZXV0cm9waGlsX3YxX3NpZ19zdmEkZGVzZXEkZG93bnNbWzFdXSkKCnRfY2ZfbmV1dHJvcGhpbF92Ml9kZV9zdmEgPC0gYWxsX3BhaXJ3aXNlKHR2Ml9uZXV0cm9waGlscywgbW9kZWxfYmF0Y2ggPSAic3Zhc2VxIiwgZmlsdGVyID0gVFJVRSkKdF9jZl9uZXV0cm9waGlsX3YyX3RhYmxlc19zdmEgPC0gY29tYmluZV9kZV90YWJsZXMoCiAgICB0X2NmX25ldXRyb3BoaWxfdjJfZGVfc3ZhLAogICAga2VlcGVycyA9IGNmX2NvbnRyYXN0LAogICAgcmRhPWdsdWU6OmdsdWUoInJkYS90X25ldXRyb3BoaWxfdjJfY2ZfdGFibGVfc3ZhLXZ7dmVyfS5yZGEiKSwKICAgIGV4Y2VsID0gZ2x1ZTo6Z2x1ZSgie3hsc3hfcHJlZml4fS9OZXV0cm9waGlscy90X25ldXRyb3BoaWxfdjJfY2ZfdGFibGVzX3N2YS12e3Zlcn0ueGxzeCIpKQp0X2NmX25ldXRyb3BoaWxfdjJfc2lnX3N2YSA8LSBleHRyYWN0X3NpZ25pZmljYW50X2dlbmVzKAogICAgdF9jZl9uZXV0cm9waGlsX3YyX3RhYmxlc19zdmEsCiAgICBleGNlbCA9IGdsdWU6OmdsdWUoInt4bHN4X3ByZWZpeH0vTmV1dHJvcGhpbHMvdF9uZXV0cm9waGlsX3YyX2NmX3NpZ19zdmEtdnt2ZXJ9Lnhsc3giKSkKZGltKHRfY2ZfbmV1dHJvcGhpbF92Ml9zaWdfc3ZhJGRlc2VxJHVwc1tbMV1dKQpkaW0odF9jZl9uZXV0cm9waGlsX3YyX3NpZ19zdmEkZGVzZXEkZG93bnNbWzFdXSkKCnRfY2ZfbmV1dHJvcGhpbF92M19kZV9zdmEgPC0gYWxsX3BhaXJ3aXNlKHR2M19uZXV0cm9waGlscywgbW9kZWxfYmF0Y2ggPSAic3Zhc2VxIiwgZmlsdGVyID0gVFJVRSkKdF9jZl9uZXV0cm9waGlsX3YzX3RhYmxlc19zdmEgPC0gY29tYmluZV9kZV90YWJsZXMoCiAgICB0X2NmX25ldXRyb3BoaWxfdjNfZGVfc3ZhLCBrZWVwZXJzID0gY2ZfY29udHJhc3QsCiAgICByZGE9Z2x1ZTo6Z2x1ZSgicmRhL3RfbmV1dHJvcGhpbF92M19jZl90YWJsZV9zdmEtdnt2ZXJ9LnJkYSIpLAogICAgZXhjZWwgPSBnbHVlOjpnbHVlKCJ7eGxzeF9wcmVmaXh9L05ldXRyb3BoaWxzL3RfbmV1dHJvcGhpbF92M19jZl90YWJsZXNfc3ZhLXZ7dmVyfS54bHN4IikpCnRfY2ZfbmV1dHJvcGhpbF92M19zaWdfc3ZhIDwtIGV4dHJhY3Rfc2lnbmlmaWNhbnRfZ2VuZXMoCiAgICB0X2NmX25ldXRyb3BoaWxfdjNfdGFibGVzX3N2YSwKICAgIGV4Y2VsID0gZ2x1ZTo6Z2x1ZSgie3hsc3hfcHJlZml4fS9OZXV0cm9waGlscy90X25ldXRyb3BoaWxfdjNfY2Zfc2lnX3N2YS12e3Zlcn0ueGxzeCIpKQpkaW0odF9jZl9uZXV0cm9waGlsX3YzX3NpZ19zdmEkZGVzZXEkdXBzW1sxXV0pCmRpbSh0X2NmX21vbm9jeXRlX3YzX3NpZ19zdmEkZGVzZXEkZG93bnNbWzFdXSkKYGBgCgojIyMjIyBnUHJvZmlsZXI6IE5ldXRyb3BoaWxzIGJ5IHZpc2l0LCBWMQoKVjE6IFVwOiA1IGdlbmVzClYxOiBEb3duOiA4IGdlbmVzOyAxNCBHTy4KCmBgYHtyIHRfY2ZfbmV1dHJvcGhpbF9zaWdfc3ZhX2dwX3Zpc2l0czF9CnRfY2ZfbmV1dHJvcGhpbF92MV9zaWdfc3ZhX2dwIDwtIGFsbF9ncHJvZmlsZXIodF9jZl9uZXV0cm9waGlsX3YxX3NpZ19zdmEpCgplbnJpY2hwbG90Ojpkb3RwbG90KHRfY2ZfbmV1dHJvcGhpbF92MV9zaWdfc3ZhX2dwW1sib3V0Y29tZV9kb3duIl1dW1siR09fZW5yaWNoIl1dKQpgYGAKCiMjIyMjIGdQcm9maWxlcjogTmV1dHJvcGhpbHMgYnkgdmlzaXQsIFYyCgpVcDogNSBnZW5lczsgMyBHTywgMTAgVEYuCkRvd246IDEgZ2VuZS4KCiMjIyMgTmV1dHJvcGhpbHM6IENvbXBhcmUgc3ZhIHRvIGJhdGNoLWluLW1vZGVsCgpgYGB7ciBjb21wYXJlX25ldXRyb3BoaWxfYXVjY30Kc3ZhX2F1Y2MgPC0gY2FsY3VsYXRlX2F1Y2ModF9jZl9uZXV0cm9waGlsX3RhYmxlc19zdmFbWyJkYXRhIl1dW1sxXV0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHRibDI9dF9jZl9uZXV0cm9waGlsX3RhYmxlc19iYXRjaHZpc2l0W1siZGF0YSJdXVtbMV1dLAogICAgICAgICAgICAgICAgICAgICAgICAgICBweT0iZGVzZXFfYWRqcCIsIGx5PSJkZXNlcV9sb2dmYyIpCnN2YV9hdWNjCgpzaGFyZWRfaWRzIDwtIHJvd25hbWVzKHRfY2ZfbmV1dHJvcGhpbF90YWJsZXNfc3ZhW1siZGF0YSJdXVtbMV1dKSAlaW4lCiAgcm93bmFtZXModF9jZl9uZXV0cm9waGlsX3RhYmxlc19iYXRjaHZpc2l0W1siZGF0YSJdXVtbMV1dKQpmaXJzdCA8LSB0X2NmX25ldXRyb3BoaWxfdGFibGVzX3N2YVtbImRhdGEiXV1bWzFdXVtzaGFyZWRfaWRzLCBdCnNlY29uZCA8LSB0X2NmX25ldXRyb3BoaWxfdGFibGVzX2JhdGNodmlzaXRbWyJkYXRhIl1dW1sxXV1bcm93bmFtZXMoZmlyc3QpLCBdCmNvci50ZXN0KGZpcnN0W1siZGVzZXFfbG9nZmMiXV0sIHNlY29uZFtbImRlc2VxX2xvZ2ZjIl1dKQpgYGAKCiMjIyBFb3Npbm9waGlscwoKVGhpcyB0aW1lLCB3aXRoIGZlZWxpbmchICBSZXBlYXRpbmcgdGhlIHNhbWUgc2V0IG9mIHRhc2tzIHdpdGggdGhlCmVvc2lub3BoaWwgc2FtcGxlcy4KCmBgYHtyIGVvc2lub3BoaWxfb25seX0KdF9jZl9lb3Npbm9waGlsX2RlX3N2YSA8LSBhbGxfcGFpcndpc2UodF9lb3Npbm9waGlscywgbW9kZWxfYmF0Y2ggPSAic3Zhc2VxIiwgZmlsdGVyID0gVFJVRSkKCnRfY2ZfZW9zaW5vcGhpbF90YWJsZXNfc3ZhIDwtIGNvbWJpbmVfZGVfdGFibGVzKAogICAgdF9jZl9lb3Npbm9waGlsX2RlX3N2YSwga2VlcGVycyA9IGNmX2NvbnRyYXN0LAogICAgcmRhPWdsdWU6OmdsdWUoInJkYS90X2Vvc2lub3BoaWxfY2ZfdGFibGVfc3ZhLXZ7dmVyfS5yZGEiKSwKICAgIGV4Y2VsID0gZ2x1ZTo6Z2x1ZSgie3hsc3hfcHJlZml4fS9Fb3Npbm9waGlscy90X2Vvc2lub3BoaWxfY2ZfdGFibGVzX3N2YS12e3Zlcn0ueGxzeCIpKQp0X2NmX2Vvc2lub3BoaWxfc2lnX3N2YSA8LSBleHRyYWN0X3NpZ25pZmljYW50X2dlbmVzKAogICAgdF9jZl9lb3Npbm9waGlsX3RhYmxlc19zdmEsCiAgICBleGNlbCA9IGdsdWU6OmdsdWUoInt4bHN4X3ByZWZpeH0vRW9zaW5vcGhpbHMvdF9lb3Npbm9waGlsX2NmX3NpZ19zdmEtdnt2ZXJ9Lnhsc3giKSkKCmRpbSh0X2NmX2Vvc2lub3BoaWxfc2lnX3N2YSRkZXNlcSR1cHNbWzFdXSkKZGltKHRfY2ZfZW9zaW5vcGhpbF9zaWdfc3ZhJGRlc2VxJGRvd25zW1sxXV0pCgp0X2NmX2Vvc2lub3BoaWxfZGVfYmF0Y2h2aXNpdCA8LSBhbGxfcGFpcndpc2UodF9lb3Npbm9waGlscywgbW9kZWxfYmF0Y2ggPSBUUlVFLCBmaWx0ZXIgPSBUUlVFKQp0X2NmX2Vvc2lub3BoaWxfdGFibGVzX2JhdGNodmlzaXQgPC0gY29tYmluZV9kZV90YWJsZXMoCiAgICB0X2NmX2Vvc2lub3BoaWxfZGVfYmF0Y2h2aXNpdCwga2VlcGVycyA9IGNmX2NvbnRyYXN0LAogICAgcmRhPWdsdWU6OmdsdWUoInJkYS90X2Vvc2lub3BoaWxfY2ZfdGFibGVfYmF0Y2h2aXNpdC12e3Zlcn0ucmRhIiksCiAgICBleGNlbCA9IGdsdWU6OmdsdWUoInt4bHN4X3ByZWZpeH0vRW9zaW5vcGhpbHMvdF9lb3Npbm9waGlsX2NmX3RhYmxlc19iYXRjaHZpc2l0LXZ7dmVyfS54bHN4IikpCnRfY2ZfZW9zaW5vcGhpbF9zaWdfYmF0Y2h2aXNpdCA8LSBleHRyYWN0X3NpZ25pZmljYW50X2dlbmVzKAogICAgdF9jZl9lb3Npbm9waGlsX3RhYmxlc19iYXRjaHZpc2l0LAogICAgZXhjZWwgPSBnbHVlOjpnbHVlKCJleGNlbC90X2Vvc2lub3BoaWxfY2Zfc2lnX2JhdGNodmlzaXQtdnt2ZXJ9Lnhsc3giKSkKCmRpbSh0X2NmX2Vvc2lub3BoaWxfc2lnX2JhdGNodmlzaXQkZGVzZXEkdXBzW1sxXV0pCmRpbSh0X2NmX2Vvc2lub3BoaWxfc2lnX2JhdGNodmlzaXQkZGVzZXEkZG93bnNbWzFdXSkKCnZpc2l0Y2ZfZmFjdG9yIDwtIHBhc3RlMCgidiIsIHBEYXRhKHRfZW9zaW5vcGhpbHMpW1sidmlzaXRudW1iZXIiXV0sCiAgICAgICAgICAgICAgICAgICAgICAgICBwRGF0YSh0X2Vvc2lub3BoaWxzKVtbImZpbmFsb3V0Y29tZSJdXSkKdF9lb3Npbm9waGlsX3Zpc2l0Y2YgPC0gc2V0X2V4cHRfY29uZGl0aW9ucyh0X2Vvc2lub3BoaWxzLCBmYWN0PXZpc2l0Y2ZfZmFjdG9yKQp0X2NmX2Vvc2lub3BoaWxfdmlzaXRzX2RlX3N2YSA8LSBhbGxfcGFpcndpc2UodF9lb3Npbm9waGlsX3Zpc2l0Y2YsIG1vZGVsX2JhdGNoID0gInN2YXNlcSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWx0ZXIgPSBUUlVFKQoKdF9jZl9lb3Npbm9waGlsX3Zpc2l0c190YWJsZXNfc3ZhIDwtIGNvbWJpbmVfZGVfdGFibGVzKAogICAgdF9jZl9lb3Npbm9waGlsX3Zpc2l0c19kZV9zdmEsIGtlZXBlcnMgPSB2aXNpdGNmX2NvbnRyYXN0cywKICAgIHJkYT1nbHVlOjpnbHVlKCJyZGEvdF9lb3Npbm9waGlsX3Zpc2l0Y2ZfdGFibGVfc3ZhLXZ7dmVyfS5yZGEiKSwKICAgIGV4Y2VsID0gZ2x1ZTo6Z2x1ZSgie3hsc3hfcHJlZml4fS9Fb3Npbm9waGlscy90X2Vvc2lub3BoaWxfdmlzaXRjZl90YWJsZXNfc3ZhLXZ7dmVyfS54bHN4IikpCnRfY2ZfZW9zaW5vcGhpbF92aXNpdHNfc2lnX3N2YSA8LSBleHRyYWN0X3NpZ25pZmljYW50X2dlbmVzKAogICAgdF9jZl9lb3Npbm9waGlsX3Zpc2l0c190YWJsZXNfc3ZhLAogICAgZXhjZWwgPSBnbHVlOjpnbHVlKCJ7eGxzeF9wcmVmaXh9L0Vvc2lub3BoaWxzL3RfZW9zaW5vcGhpbF92aXNpdGNmX3NpZ19zdmEtdnt2ZXJ9Lnhsc3giKSkKCmRpbSh0X2NmX2Vvc2lub3BoaWxfdmlzaXRzX3NpZ19zdmEkZGVzZXEkdXBzW1sxXV0pCmRpbSh0X2NmX2Vvc2lub3BoaWxfdmlzaXRzX3NpZ19zdmEkZGVzZXEkZG93bnNbWzFdXSkKYGBgCgojIyMjIGdQcm9maWxlcjogRW9zaW5vcGhpbHMKClVwOiAxMTYgZ2VuZXM7IDEyMyBHTywgMiBLRUdHLCA3IFJlYWN0b21lLCA1IFdQLCA2OSBURiwgMSBtaVJOQSwgMCBvdGhlcnMKRG93bjogIDc0IGdlbmVzOyA1IEdPLCAxIFJlYWN0b21lLCA0IFRGLCAwIG90aGVycwoKYGBge3IgdF9jZl9lb3Npbm9waGlsX3NpZ19zdmFfZ3B9CnRfY2ZfZW9zaW5vcGhpbF9zaWdfc3ZhX2dwIDwtIGFsbF9ncHJvZmlsZXIodF9jZl9lb3Npbm9waGlsX3NpZ19zdmEpCgplbnJpY2hwbG90Ojpkb3RwbG90KHRfY2ZfZW9zaW5vcGhpbF9zaWdfc3ZhX2dwW1sib3V0Y29tZV91cCJdXVtbIkdPX2VucmljaCJdXSkKZW5yaWNocGxvdDo6ZG90cGxvdCh0X2NmX2Vvc2lub3BoaWxfc2lnX3N2YV9ncFtbIm91dGNvbWVfdXAiXV1bWyJSRUFDX2VucmljaCJdXSkKZW5yaWNocGxvdDo6ZG90cGxvdCh0X2NmX2Vvc2lub3BoaWxfc2lnX3N2YV9ncFtbIm91dGNvbWVfdXAiXV1bWyJXUF9lbnJpY2giXV0pCmVucmljaHBsb3Q6OmRvdHBsb3QodF9jZl9lb3Npbm9waGlsX3NpZ19zdmFfZ3BbWyJvdXRjb21lX3VwIl1dW1siVEZfZW5yaWNoIl1dKQoKZW5yaWNocGxvdDo6ZG90cGxvdCh0X2NmX2Vvc2lub3BoaWxfc2lnX3N2YV9ncFtbIm91dGNvbWVfZG93biJdXVtbIkdPX2VucmljaCJdXSkKZW5yaWNocGxvdDo6ZG90cGxvdCh0X2NmX2Vvc2lub3BoaWxfc2lnX3N2YV9ncFtbIm91dGNvbWVfZG93biJdXVtbIlRGX2VucmljaCJdXSkKYGBgCgojIyMgRW9zaW5vcGhpbCB0aW1lIGNvbXBhcmlzb25zCgpgYGB7ciBlb3Npbm9waGlsX3Zpc2l0c30KdF9jZl9lb3Npbm9waGlsX3YxX2RlX3N2YSA8LSBhbGxfcGFpcndpc2UodHYxX2Vvc2lub3BoaWxzLCBtb2RlbF9iYXRjaCA9ICJzdmFzZXEiLCBmaWx0ZXIgPSBUUlVFKQp0X2NmX2Vvc2lub3BoaWxfdjFfdGFibGVzX3N2YSA8LSBjb21iaW5lX2RlX3RhYmxlcygKICAgIHRfY2ZfZW9zaW5vcGhpbF92MV9kZV9zdmEsIGtlZXBlcnMgPSBjZl9jb250cmFzdCwKICAgIHJkYT1nbHVlOjpnbHVlKCJyZGEvdF9lb3Npbm9waGlsX3YxX2NmX3RhYmxlX3N2YS12e3Zlcn0ucmRhIiksCiAgICBleGNlbCA9IGdsdWU6OmdsdWUoInt4bHN4X3ByZWZpeH0vRW9zaW5vcGhpbHMvdF9lb3Npbm9waGlsX3YxX2NmX3RhYmxlc19zdmEtdnt2ZXJ9Lnhsc3giKSkKdF9jZl9lb3Npbm9waGlsX3YxX3NpZ19zdmEgPC0gZXh0cmFjdF9zaWduaWZpY2FudF9nZW5lcygKICAgIHRfY2ZfZW9zaW5vcGhpbF92MV90YWJsZXNfc3ZhLAogICAgZXhjZWwgPSBnbHVlOjpnbHVlKCJ7eGxzeF9wcmVmaXh9L0Vvc2lub3BoaWxzL3RfZW9zaW5vcGhpbF92MV9jZl9zaWdfc3ZhLXZ7dmVyfS54bHN4IikpCmRpbSh0X2NmX2Vvc2lub3BoaWxfdjFfc2lnX3N2YSRkZXNlcSR1cHNbWzFdXSkKZGltKHRfY2ZfZW9zaW5vcGhpbF92MV9zaWdfc3ZhJGRlc2VxJGRvd25zW1sxXV0pCgp0X2NmX2Vvc2lub3BoaWxfdjJfZGVfc3ZhIDwtIGFsbF9wYWlyd2lzZSh0djJfZW9zaW5vcGhpbHMsIG1vZGVsX2JhdGNoID0gInN2YXNlcSIsIGZpbHRlciA9IFRSVUUpCnRfY2ZfZW9zaW5vcGhpbF92Ml90YWJsZXNfc3ZhIDwtIGNvbWJpbmVfZGVfdGFibGVzKAogICAgdF9jZl9lb3Npbm9waGlsX3YyX2RlX3N2YSwga2VlcGVycyA9IGNmX2NvbnRyYXN0LAogICAgcmRhPWdsdWU6OmdsdWUoInJkYS90X2Vvc2lub3BoaWxfdjJfY2ZfdGFibGVfc3ZhLXZ7dmVyfS5yZGEiKSwKICAgIGV4Y2VsID0gZ2x1ZTo6Z2x1ZSgie3hsc3hfcHJlZml4fS9Fb3Npbm9waGlscy90X2Vvc2lub3BoaWxfdjJfY2ZfdGFibGVzX3N2YS12e3Zlcn0ueGxzeCIpKQp0X2NmX2Vvc2lub3BoaWxfdjJfc2lnX3N2YSA8LSBleHRyYWN0X3NpZ25pZmljYW50X2dlbmVzKAogICAgdF9jZl9lb3Npbm9waGlsX3YyX3RhYmxlc19zdmEsCiAgICBleGNlbCA9IGdsdWU6OmdsdWUoInt4bHN4X3ByZWZpeH0vRW9zaW5vcGhpbHMvdF9lb3Npbm9waGlsX3YyX2NmX3NpZ19zdmEtdnt2ZXJ9Lnhsc3giKSkKZGltKHRfY2ZfZW9zaW5vcGhpbF92Ml9zaWdfc3ZhJGRlc2VxJHVwc1tbMV1dKQpkaW0odF9jZl9lb3Npbm9waGlsX3YyX3NpZ19zdmEkZGVzZXEkZG93bnNbWzFdXSkKCnRfY2ZfZW9zaW5vcGhpbF92M19kZV9zdmEgPC0gYWxsX3BhaXJ3aXNlKHR2M19lb3Npbm9waGlscywgbW9kZWxfYmF0Y2ggPSAic3Zhc2VxIiwgZmlsdGVyID0gVFJVRSkKdF9jZl9lb3Npbm9waGlsX3YzX3RhYmxlc19zdmEgPC0gY29tYmluZV9kZV90YWJsZXMoCiAgICB0X2NmX2Vvc2lub3BoaWxfdjNfZGVfc3ZhLCBrZWVwZXJzID0gY2ZfY29udHJhc3QsCiAgICByZGE9Z2x1ZTo6Z2x1ZSgicmRhL3RfZW9zaW5vcGhpbF92M19jZl90YWJsZV9zdmEtdnt2ZXJ9LnJkYSIpLAogICAgZXhjZWwgPSBnbHVlOjpnbHVlKCJ7eGxzeF9wcmVmaXh9L0Vvc2lub3BoaWxzL3RfZW9zaW5vcGhpbF92M19jZl90YWJsZXNfc3ZhLXZ7dmVyfS54bHN4IikpCnRfY2ZfZW9zaW5vcGhpbF92M19zaWdfc3ZhIDwtIGV4dHJhY3Rfc2lnbmlmaWNhbnRfZ2VuZXMoCiAgICB0X2NmX2Vvc2lub3BoaWxfdjNfdGFibGVzX3N2YSwKICAgIGV4Y2VsID0gZ2x1ZTo6Z2x1ZSgie3hsc3hfcHJlZml4fS9Fb3Npbm9waGlscy90X2Vvc2lub3BoaWxfdjNfY2Zfc2lnX3N2YS12e3Zlcn0ueGxzeCIpKQpkaW0odF9jZl9lb3Npbm9waGlsX3YzX3NpZ19zdmEkZGVzZXEkdXBzW1sxXV0pCmRpbSh0X2NmX2Vvc2lub3BoaWxfdjNfc2lnX3N2YSRkZXNlcSRkb3duc1tbMV1dKQpgYGAKCiMjIyMgZ1Byb2ZpbGVyOiBFb3Npbm9waGlscyBWMQoKVXA6IDEzIGdlbmVzLCBubyBoaXRzLgpEb3duOiAxOSBnZW5lczsgMTEgR08sIDEgUmVhY3RvbWUsIDEgVEYKCmBgYHtyIHRfY2ZfZW9zaW5vcGhpbF9zaWdfc3ZhX2dwdjJ9CnRfY2ZfZW9zaW5vcGhpbF92MV9zaWdfc3ZhX2dwIDwtIGFsbF9ncHJvZmlsZXIodF9jZl9lb3Npbm9waGlsX3YxX3NpZ19zdmEpCgplbnJpY2hwbG90Ojpkb3RwbG90KHRfY2ZfZW9zaW5vcGhpbF9zaWdfc3ZhX2dwW1sib3V0Y29tZV9kb3duIl1dW1siR09fZW5yaWNoIl1dKQplbnJpY2hwbG90Ojpkb3RwbG90KHRfY2ZfZW9zaW5vcGhpbF9zaWdfc3ZhX2dwW1sib3V0Y29tZV9kb3duIl1dW1siVEZfZW5yaWNoIl1dKQpgYGAKCiMjIyMgZ1Byb2ZpbGVyOiBFb3Npbm9waGlscyBWMgoKVXA6IDkgZ2VuZXM7IDIzIEdPLCAyIEtFR0csIDIgUmVhY3RvbWUsIDQgV1AKRG93bjogNCBnZW5lczsgbm8gaGl0cwoKYGBge3IgdF9jZl9lb3Npbm9waGlsX3NpZ19zdmFfZ3B2M30KdF9jZl9lb3Npbm9waGlsX3YyX3NpZ19zdmFfZ3AgPC0gYWxsX2dwcm9maWxlcih0X2NmX2Vvc2lub3BoaWxfdjJfc2lnX3N2YSkKCmVucmljaHBsb3Q6OmRvdHBsb3QodF9jZl9lb3Npbm9waGlsX3NpZ19zdmFfZ3BbWyJvdXRjb21lX3VwIl1dW1siR09fZW5yaWNoIl1dKQplbnJpY2hwbG90Ojpkb3RwbG90KHRfY2ZfZW9zaW5vcGhpbF9zaWdfc3ZhX2dwW1sib3V0Y29tZV91cCJdXVtbIldQX2VucmljaCJdXSkKYGBgCgojIyMjIGdQcm9maWxlcjogRW9zaW5vcGhpbHMgVjMKClVwOiA2OCBnZW5lczsgOTUgR08sIDIgS0VHRywgMTIgUmVhY3RvbWUsIDMgV1AsIDYzIFRGLCAxIG1pUk5BCkRvd246IDI5IGdlbmVzOyAzIEdPLCAxIFdQLCAxIFRGLCAzIG1pUk5BCgpgYGB7ciB0X2NmX2Vvc2lub3BoaWxfc2lnX3N2YV9ncHY0fQp0X2NmX2Vvc2lub3BoaWxfdjNfc2lnX3N2YV9ncCA8LSBhbGxfZ3Byb2ZpbGVyKHRfY2ZfZW9zaW5vcGhpbF92M19zaWdfc3ZhKQoKZW5yaWNocGxvdDo6ZG90cGxvdCh0X2NmX2Vvc2lub3BoaWxfc2lnX3N2YV9ncFtbIm91dGNvbWVfdXAiXV1bWyJHT19lbnJpY2giXV0pCmVucmljaHBsb3Q6OmRvdHBsb3QodF9jZl9lb3Npbm9waGlsX3NpZ19zdmFfZ3BbWyJvdXRjb21lX3VwIl1dW1siV1BfZW5yaWNoIl1dKQpgYGAKCiMjIyMgRW9zaW5vcGhpbHM6IENvbXBhcmUgc3ZhIHRvIGJhdGNoLWluLXZpc2l0CgpgYGB7ciBlb3Npbm9waGlsX2F1Y2N9CnN2YV9hdWNjIDwtIGNhbGN1bGF0ZV9hdWNjKHRfY2ZfZW9zaW5vcGhpbF90YWJsZXNfc3ZhW1siZGF0YSJdXVtbMV1dLAogICAgICAgICAgICAgICAgICAgICAgICAgICB0YmwyPXRfY2ZfZW9zaW5vcGhpbF90YWJsZXNfYmF0Y2h2aXNpdFtbImRhdGEiXV1bWzFdXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgcHk9ImRlc2VxX2FkanAiLCBseT0iZGVzZXFfbG9nZmMiKQpzdmFfYXVjYwoKc2hhcmVkX2lkcyA8LSByb3duYW1lcyh0X2NmX2Vvc2lub3BoaWxfdGFibGVzX3N2YVtbImRhdGEiXV1bWzFdXSkgJWluJQogIHJvd25hbWVzKHRfY2ZfZW9zaW5vcGhpbF90YWJsZXNfYmF0Y2h2aXNpdFtbImRhdGEiXV1bWzFdXSkKZmlyc3QgPC0gdF9jZl9lb3Npbm9waGlsX3RhYmxlc19zdmFbWyJkYXRhIl1dW1sxXV1bc2hhcmVkX2lkcywgXQpzZWNvbmQgPC0gdF9jZl9lb3Npbm9waGlsX3RhYmxlc19iYXRjaHZpc2l0W1siZGF0YSJdXVtbMV1dW3Jvd25hbWVzKGZpcnN0KSwgXQpjb3IudGVzdChmaXJzdFtbImRlc2VxX2xvZ2ZjIl1dLCBzZWNvbmRbWyJkZXNlcV9sb2dmYyJdXSkKYGBgCgojIyMjIENvbXBhcmUgbW9ub2N5dGUgQ0YsIG5ldXRyb3BoaWwgQ0YsIGVvc2lub3BoaWwgQ0YKCmBgYHtyIGNvbXBhcmVfbW9ub19uZXV0X2VvfQp0X21vbm9fbmV1dF9zdmFfYXVjYyA8LSBjYWxjdWxhdGVfYXVjYyh0X2NmX21vbm9jeXRlX3RhYmxlc19zdmFbWyJkYXRhIl1dW1sib3V0Y29tZSJdXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGJsMj10X2NmX25ldXRyb3BoaWxfdGFibGVzX3N2YVtbImRhdGEiXV1bWyJvdXRjb21lIl1dLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBweT0iZGVzZXFfYWRqcCIsIGx5PSJkZXNlcV9sb2dmYyIpCnRfbW9ub19uZXV0X3N2YV9hdWNjCgp0X21vbm9fZW9fc3ZhX2F1Y2MgPC0gY2FsY3VsYXRlX2F1Y2ModF9jZl9tb25vY3l0ZV90YWJsZXNfc3ZhW1siZGF0YSJdXVtbIm91dGNvbWUiXV0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YmwyPXRfY2ZfZW9zaW5vcGhpbF90YWJsZXNfc3ZhW1siZGF0YSJdXVtbIm91dGNvbWUiXV0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBweT0iZGVzZXFfYWRqcCIsIGx5PSJkZXNlcV9sb2dmYyIpCnRfbW9ub19lb19zdmFfYXVjYwoKdF9uZXV0X2VvX3N2YV9hdWNjIDwtIGNhbGN1bGF0ZV9hdWNjKHRfY2ZfbmV1dHJvcGhpbF90YWJsZXNfc3ZhW1siZGF0YSJdXVtbIm91dGNvbWUiXV0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YmwyPXRfY2ZfZW9zaW5vcGhpbF90YWJsZXNfc3ZhW1siZGF0YSJdXVtbIm91dGNvbWUiXV0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBweT0iZGVzZXFfYWRqcCIsIGx5PSJkZXNlcV9sb2dmYyIpCnRfbmV1dF9lb19zdmFfYXVjYwpgYGAKCiMjIyBCeSB2aXNpdAoKRm9yIHRoZXNlIGNvbnRyYXN0cywgd2Ugd2FudCB0byBzZWUgZmFpbF92MSB2cy4gY3VyZV92MSwgZmFpbF92Mgp2cy4gY3VyZV92MiBldGMuICBBcyBhIHJlc3VsdCwgd2Ugd2lsbCBuZWVkIHRvIGp1Z2dsZSB0aGUgZGF0YQpzbGlnaHRseSBhbmQgYWRkIGFub3RoZXIgc2V0IG9mIGNvbnRyYXN0cy4KCiMjIyMgQ3VyZS9GYWlsIGJ5IHZpc2l0cywgYWxsIGNlbGwgdHlwZXMKCmBgYHtyIHZpc2l0X2NmX2FsbF9kZX0KdF92aXNpdF9jZl9hbGxfZGVfc3ZhIDwtIGFsbF9wYWlyd2lzZSh0X3Zpc2l0Y2YsIG1vZGVsX2JhdGNoID0gInN2YXNlcSIsIGZpbHRlciA9IFRSVUUpCgp0X3Zpc2l0X2NmX2FsbF90YWJsZXNfc3ZhIDwtIGNvbWJpbmVfZGVfdGFibGVzKAogICAgdF92aXNpdF9jZl9hbGxfZGVfc3ZhLCBrZWVwZXJzID0gdmlzaXRjZl9jb250cmFzdHMsCiAgICByZGE9Z2x1ZTo6Z2x1ZSgicmRhL3RfYWxsX3Zpc2l0Y2ZfdGFibGVfc3ZhLXZ7dmVyfS5yZGEiKSwKICAgIGV4Y2VsID0gZ2x1ZTo6Z2x1ZSgiYW5hbHlzZXMvNF90dW1hY28vREVfQ3VyZV92c19GYWlsL3RfYWxsX3Zpc2l0Y2ZfdGFibGVzX3N2YS12e3Zlcn0ueGxzeCIpKQp0X3Zpc2l0X2NmX2FsbF9zaWdfc3ZhIDwtIGV4dHJhY3Rfc2lnbmlmaWNhbnRfZ2VuZXMoCiAgICB0X3Zpc2l0X2NmX2FsbF90YWJsZXNfc3ZhLAogICAgZXhjZWwgPSBnbHVlOjpnbHVlKCJhbmFseXNlcy80X3R1bWFjby9ERV9DdXJlX3ZzX0ZhaWwvdF9hbGxfdmlzaXRjZl9zaWdfc3ZhLXZ7dmVyfS54bHN4IikpCmBgYAoKIyMjIyBDdXJlL0ZhaWwgYnkgdmlzaXQsIE1vbm9jeXRlcwoKYGBge3IgdmlzaXRfY2ZfbW9ub2N5dGVfZGV9CnZpc2l0Y2ZfZmFjdG9yIDwtIHBhc3RlMCgidiIsIHBEYXRhKHRfbW9ub2N5dGVzKVtbInZpc2l0bnVtYmVyIl1dLCAiXyIsCiAgICAgICAgICAgICAgICAgICAgICAgICBwRGF0YSh0X21vbm9jeXRlcylbWyJmaW5hbG91dGNvbWUiXV0pCnRfbW9ub2N5dGVzX3Zpc2l0Y2YgPC0gc2V0X2V4cHRfY29uZGl0aW9ucyh0X21vbm9jeXRlcywgZmFjdD12aXNpdGNmX2ZhY3RvcikKCnRfdmlzaXRfY2ZfbW9ub2N5dGVfZGVfc3ZhIDwtIGFsbF9wYWlyd2lzZSh0X21vbm9jeXRlc192aXNpdGNmLCBtb2RlbF9iYXRjaCA9ICJzdmFzZXEiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsdGVyID0gVFJVRSkKCnRfdmlzaXRfY2ZfbW9ub2N5dGVfdGFibGVzX3N2YSA8LSBjb21iaW5lX2RlX3RhYmxlcygKICAgIHRfdmlzaXRfY2ZfbW9ub2N5dGVfZGVfc3ZhLCBrZWVwZXJzID0gdmlzaXRjZl9jb250cmFzdHMsCiAgICByZGE9Z2x1ZTo6Z2x1ZSgicmRhL3RfbW9ub2N5dGVfdmlzaXRjZl90YWJsZV9zdmEtdnt2ZXJ9LnJkYSIpLAogICAgZXhjZWwgPSBnbHVlOjpnbHVlKCJ7eGxzeF9wcmVmaXh9L01vbm9jeXRlcy90X21vbm9jeXRlX3Zpc2l0Y2ZfdGFibGVzX3N2YS12e3Zlcn0ueGxzeCIpKQp0X3Zpc2l0X2NmX21vbm9jeXRlX3NpZ19zdmEgPC0gZXh0cmFjdF9zaWduaWZpY2FudF9nZW5lcygKICAgIHRfdmlzaXRfY2ZfbW9ub2N5dGVfdGFibGVzX3N2YSwKICAgIGV4Y2VsID0gZ2x1ZTo6Z2x1ZSgie3hsc3hfcHJlZml4fS9Nb25vY3l0ZXMvdF9tb25vY3l0ZV92aXNpdGNmX3NpZ19zdmEtdnt2ZXJ9Lnhsc3giKSkKCnRfdjFmY19kZXNlcV9tYSA8LSB0X3Zpc2l0X2NmX21vbm9jeXRlX3RhYmxlc19zdmFbWyJwbG90cyJdXVtbInYxY2YiXV1bWyJkZXNlcV9tYV9wbG90cyJdXVtbInBsb3QiXV0KZGV2IDwtIHBwKGZpbGU9ImltYWdlcy9tb25vY3l0ZV9jZl9kZV92MV9tYXBsb3QucG5nIikKdF92MWZjX2Rlc2VxX21hCmNsb3NlZCA8LSBkZXYub2ZmKCkKdF92MWZjX2Rlc2VxX21hCgp0X3YyZmNfZGVzZXFfbWEgPC0gdF92aXNpdF9jZl9tb25vY3l0ZV90YWJsZXNfc3ZhW1sicGxvdHMiXV1bWyJ2MmNmIl1dW1siZGVzZXFfbWFfcGxvdHMiXV1bWyJwbG90Il1dCmRldiA8LSBwcChmaWxlPSJpbWFnZXMvbW9ub2N5dGVfY2ZfZGVfdjJfbWFwbG90LnBuZyIpCnRfdjJmY19kZXNlcV9tYQpjbG9zZWQgPC0gZGV2Lm9mZigpCnRfdjJmY19kZXNlcV9tYQoKdF92M2ZjX2Rlc2VxX21hIDwtIHRfdmlzaXRfY2ZfbW9ub2N5dGVfdGFibGVzX3N2YVtbInBsb3RzIl1dW1sidjNjZiJdXVtbImRlc2VxX21hX3Bsb3RzIl1dW1sicGxvdCJdXQpkZXYgPC0gcHAoZmlsZT0iaW1hZ2VzL21vbm9jeXRlX2NmX2RlX3YzX21hcGxvdC5wbmciKQp0X3YzZmNfZGVzZXFfbWEKY2xvc2VkIDwtIGRldi5vZmYoKQp0X3YzZmNfZGVzZXFfbWEKYGBgCgpPbmUgcXVlcnkgZnJvbSBBbGVqYW5kcm8gaXMgdG8gbG9vayBhdCB0aGUgZ2VuZXMgc2hhcmVkIHVwL2Rvd24gYWNyb3NzCnZpc2l0cy4gIEkgYW0gbm90IGVudGlyZWx5IGNlcnRhaW4gd2UgaGF2ZSBlbm91Z2ggc2FtcGxlcyBmb3IgdGhpcyB0bwp3b3JrLCBidXQgbGV0IHVzIGZpbmQgb3V0LgoKSSBhbSB0aGlua2luZyB0aGlzIGlzIGEgZ29vZCBwbGFjZSB0byB1c2UgdGhlIEFVQ0MgY3VydmVzIEkgbGVhcm5lZAphYm91dCB0aGFua3MgdG8gSnVsaWUgQ3JpZGxhbmQuCgpOb3RlIHRoYXQgdGhlIGZvbGxvd2luZyBpcyBhbGwgbW9ub2N5dGUgc2FtcGxlcywgdGhpcyBzaG91bGQgdGhlcmVmb3JlCnBvdGVudGlhbGx5IGJlIG1vdmVkIHVwIGFuZCBhIHZlcnNpb24gb2YgdGhpcyB3aXRoIG9ubHkgdGhlIFR1bWFjbwpzYW1wbGVzIHB1dCBoZXJlPwoKYGBge3IgbW9ub2N5dGVfc2hhcmVkX2RlX2dlbmVzfQp2MWNmIDwtIHRfdmlzaXRfY2ZfbW9ub2N5dGVfdGFibGVzX3N2YVtbImRhdGEiXV1bWyJ2MWNmIl1dCnYyY2YgPC0gdF92aXNpdF9jZl9tb25vY3l0ZV90YWJsZXNfc3ZhW1siZGF0YSJdXVtbInYyY2YiXV0KdjNjZiA8LSB0X3Zpc2l0X2NmX21vbm9jeXRlX3RhYmxlc19zdmFbWyJkYXRhIl1dW1sidjNjZiJdXQoKdjFfc2lnIDwtIGMoCiAgICByb3duYW1lcyh0X3Zpc2l0X2NmX21vbm9jeXRlX3NpZ19zdmFbWyJkZXNlcSJdXVtbInVwcyJdXVtbInYxY2YiXV0pLAogICAgcm93bmFtZXModF92aXNpdF9jZl9tb25vY3l0ZV9zaWdfc3ZhW1siZGVzZXEiXV1bWyJkb3ducyJdXVtbInYxY2YiXV0pKQpsZW5ndGgodjFfc2lnKQoKdjJfc2lnIDwtIGMoCiAgICByb3duYW1lcyh0X3Zpc2l0X2NmX21vbm9jeXRlX3NpZ19zdmFbWyJkZXNlcSJdXVtbInVwcyJdXVtbInYyY2YiXV0pLAogICAgcm93bmFtZXModF92aXNpdF9jZl9tb25vY3l0ZV9zaWdfc3ZhW1siZGVzZXEiXV1bWyJkb3ducyJdXVtbInYyY2YiXV0pKQpsZW5ndGgodjJfc2lnKQoKdjNfc2lnIDwtIGMoCiAgICByb3duYW1lcyh0X3Zpc2l0X2NmX21vbm9jeXRlX3NpZ19zdmFbWyJkZXNlcSJdXVtbInVwcyJdXVtbInYyY2YiXV0pLAogICAgcm93bmFtZXModF92aXNpdF9jZl9tb25vY3l0ZV9zaWdfc3ZhW1siZGVzZXEiXV1bWyJkb3ducyJdXVtbInYyY2YiXV0pKQpsZW5ndGgodjNfc2lnKQoKdF9tb25vY3l0ZV92aXNpdF9hdWNjX3YydjEgPC0gY2FsY3VsYXRlX2F1Y2ModjFjZiwgdGJsMj12MmNmLCBweT0iZGVzZXFfYWRqcCIsIGx5PSJkZXNlcV9sb2dmYyIpCmRldiA8LSBwcChmaWxlPSJpbWFnZXMvbW9ub2N5dGVfdmlzaXRfdjJ2MV9hdWNjLnBuZyIpCnRfbW9ub2N5dGVfdmlzaXRfYXVjY192MnYxW1sicGxvdCJdXQpjbG9zZWQgPC0gZGV2Lm9mZigpCnRfbW9ub2N5dGVfdmlzaXRfYXVjY192MnYxW1sicGxvdCJdXQoKdF9tb25vY3l0ZV92aXNpdF9hdWNjX3YzdjEgPC0gY2FsY3VsYXRlX2F1Y2ModjFjZiwgdGJsMj12M2NmLCBweT0iZGVzZXFfYWRqcCIsIGx5PSJkZXNlcV9sb2dmYyIpCmRldiA8LSBwcChmaWxlPSJpbWFnZXMvbW9ub2N5dGVfdmlzaXRfdjN2MV9hdWNjLnBuZyIpCnRfbW9ub2N5dGVfdmlzaXRfYXVjY192M3YxW1sicGxvdCJdXQpjbG9zZWQgPC0gZGV2Lm9mZigpCnRfbW9ub2N5dGVfdmlzaXRfYXVjY192M3YxW1sicGxvdCJdXQpgYGAKCiMjIyMgQ3VyZS9GYWlsIGJ5IHZpc2l0LCBOZXV0cm9waGlscwoKYGBge3IgdmlzaXRfY2ZfbmV1dHJvcGhpbF9kZX0KdmlzaXRjZl9mYWN0b3IgPC0gcGFzdGUwKCJ2IiwgcERhdGEodF9uZXV0cm9waGlscylbWyJ2aXNpdG51bWJlciJdXSwgIl8iLAogICAgICAgICAgICAgICAgICAgICAgICAgcERhdGEodF9uZXV0cm9waGlscylbWyJmaW5hbG91dGNvbWUiXV0pCnRfbmV1dHJvcGhpbF92aXNpdGNmIDwtIHNldF9leHB0X2NvbmRpdGlvbnModF9uZXV0cm9waGlscywgZmFjdD12aXNpdGNmX2ZhY3RvcikKdF92aXNpdF9jZl9uZXV0cm9waGlsX2RlX3N2YSA8LSBhbGxfcGFpcndpc2UodF9uZXV0cm9waGlsX3Zpc2l0Y2YsIG1vZGVsX2JhdGNoID0gInN2YXNlcSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbHRlciA9IFRSVUUpCgp0X3Zpc2l0X2NmX25ldXRyb3BoaWxfdGFibGVzX3N2YSA8LSBjb21iaW5lX2RlX3RhYmxlcygKICAgIHRfdmlzaXRfY2ZfbmV1dHJvcGhpbF9kZV9zdmEsIGtlZXBlcnMgPSB2aXNpdGNmX2NvbnRyYXN0cywKICAgIHJkYT1nbHVlOjpnbHVlKCJyZGEvdF9uZXV0cm9waGlsX3Zpc2l0Y2ZfdGFibGVfc3ZhLXZ7dmVyfS5yZGEiKSwKICAgIGV4Y2VsID0gZ2x1ZTo6Z2x1ZSgie3hsc3hfcHJlZml4fS9OZXV0cm9waGlscy90X25ldXRyb3BoaWxfdmlzaXRjZl90YWJsZXNfc3ZhLXZ7dmVyfS54bHN4IikpCnRfdmlzaXRfY2ZfbmV1dHJvcGhpbF9zaWdfc3ZhIDwtIGV4dHJhY3Rfc2lnbmlmaWNhbnRfZ2VuZXMoCiAgICB0X3Zpc2l0X2NmX25ldXRyb3BoaWxfdGFibGVzX3N2YSwKICAgIGV4Y2VsID0gZ2x1ZTo6Z2x1ZSgie3hsc3hfcHJlZml4fS9OZXV0cm9waGlscy90X25ldXRyb3BoaWxfdmlzaXRjZl9zaWdfc3ZhLXZ7dmVyfS54bHN4IikpCmBgYAoKIyMjIyBDdXJlL0ZhaWwgYnkgdmlzaXQsIEVvc2lub3BoaWxzCgpgYGB7ciB2aXNpdF9jZl9lb3Npbm9waGlsX2RlfQp2aXNpdGNmX2ZhY3RvciA8LSBwYXN0ZTAoInYiLCBwRGF0YSh0X2Vvc2lub3BoaWxzKVtbInZpc2l0bnVtYmVyIl1dLCAiXyIsCiAgICAgICAgICAgICAgICAgICAgICAgICBwRGF0YSh0X2Vvc2lub3BoaWxzKVtbImZpbmFsb3V0Y29tZSJdXSkKdF9lb3Npbm9waGlsX3Zpc2l0Y2YgPC0gc2V0X2V4cHRfY29uZGl0aW9ucyh0X2Vvc2lub3BoaWxzLCBmYWN0PXZpc2l0Y2ZfZmFjdG9yKQp0X3Zpc2l0X2NmX2Vvc2lub3BoaWxfZGVfc3ZhIDwtIGFsbF9wYWlyd2lzZSh0X2Vvc2lub3BoaWxfdmlzaXRjZiwgbW9kZWxfYmF0Y2ggPSAic3Zhc2VxIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsdGVyID0gVFJVRSkKCnRfdmlzaXRfY2ZfZW9zaW5vcGhpbF90YWJsZXNfc3ZhIDwtIGNvbWJpbmVfZGVfdGFibGVzKAogICAgdF92aXNpdF9jZl9lb3Npbm9waGlsX2RlX3N2YSwga2VlcGVycyA9IHZpc2l0Y2ZfY29udHJhc3RzLAogICAgcmRhPWdsdWU6OmdsdWUoInJkYS90X2Vvc2lub3BoaWxfdmlzaXRjZl90YWJsZV9zdmEtdnt2ZXJ9LnJkYSIpLAogICAgZXhjZWwgPSBnbHVlOjpnbHVlKCJ7eGxzeF9wcmVmaXh9L0Vvc2lub3BoaWxzL3RfZW9zaW5vcGhpbF92aXNpdGNmX3RhYmxlc19zdmEtdnt2ZXJ9Lnhsc3giKSkKdF92aXNpdF9jZl9lb3Npbm9waGlsX3NpZ19zdmEgPC0gZXh0cmFjdF9zaWduaWZpY2FudF9nZW5lcygKICAgIHRfdmlzaXRfY2ZfZW9zaW5vcGhpbF90YWJsZXNfc3ZhLAogICAgZXhjZWwgPSBnbHVlOjpnbHVlKCJ7eGxzeF9wcmVmaXh9L0Vvc2lub3BoaWxzL3RfZW9zaW5vcGhpbF92aXNpdGNmX3NpZ19zdmEtdnt2ZXJ9Lnhsc3giKSkKYGBgCgojIyBQZXJzaXN0ZW5jZSBpbiB2aXNpdCAzCgpIYXZpbmcgcHV0IHNvbWUgU0wgcmVhZCBtYXBwaW5nIGluZm9ybWF0aW9uIGluIHRoZSBzYW1wbGUgc2hlZXQsIE1hcmlhCkFkZWxhaWRhIGFkZGVkIGEgbmV3IGNvbHVtbiB1c2luZyBpdCB3aXRoIHRoZSBwdXRhdGl2ZSBwZXJzaXN0ZW5jZQpzdGF0ZSBvbiBhIHBlci1zYW1wbGUgYmFzaXMuICBPbmUgcXVlc3Rpb24gd2hpY2ggYXJpc2VkIGZyb20gdGhhdDoKd2hhdCBkaWZmZXJlbmNlcyBhcmUgb2JzZXJ2YWJsZSBiZXR3ZWVuIHRoZSBwZXJzaXN0ZW50IHllcyB2cy4gbm8Kc2FtcGxlcyBvbiBhIHBlci1jZWxsLXR5cGUgYmFzaXMgYW1vbmcgdGhlIHZpc2l0IDMgc2FtcGxlcy4KCiMjIyBTZXR0aW5nIHVwCgpGaXJzdCB0aGluZ3MgZmlyc3QsIGNyZWF0ZSB0aGUgZGF0YXNldHMuCgpgYGB7ciBwZXJzaXN0ZW5jZV9zZXR1cH0KcGVyc2lzdGVuY2VfZXhwdCA8LSBzdWJzZXRfZXhwdCh0X2NsaW5pY2FsLCBzdWJzZXQgPSAicGVyc2lzdGVuY2U9PSdZJ3xwZXJzaXN0ZW5jZT09J04nIikgJT4lCiAgc3Vic2V0X2V4cHQoc3Vic2V0ID0gJ3Zpc2l0bnVtYmVyPT0zJykgJT4lCiAgc2V0X2V4cHRfY29uZGl0aW9ucyhmYWN0ID0gJ3BlcnNpc3RlbmNlJykKCiMjIHBlcnNpc3RlbmNlX2Jpb3BzeSA8LSBzdWJzZXRfZXhwdChwZXJzaXN0ZW5jZV9leHB0LCBzdWJzZXQgPSAidHlwZW9mY2VsbHM9PSdiaW9wc3knIikKcGVyc2lzdGVuY2VfbW9ub2N5dGUgPC0gc3Vic2V0X2V4cHQocGVyc2lzdGVuY2VfZXhwdCwgc3Vic2V0ID0gInR5cGVvZmNlbGxzPT0nbW9ub2N5dGVzJyIpCnBlcnNpc3RlbmNlX25ldXRyb3BoaWwgPC0gc3Vic2V0X2V4cHQocGVyc2lzdGVuY2VfZXhwdCwgc3Vic2V0ID0gInR5cGVvZmNlbGxzPT0nbmV1dHJvcGhpbHMnIikKcGVyc2lzdGVuY2VfZW9zaW5vcGhpbCA8LSBzdWJzZXRfZXhwdChwZXJzaXN0ZW5jZV9leHB0LCBzdWJzZXQgPSAidHlwZW9mY2VsbHM9PSdlb3Npbm9waGlscyciKQpgYGAKCiMjIyBUYWtlIGEgbG9vawoKU2VlIGlmIHRoZXJlIGFyZSBhbnkgcGF0dGVybnMgd2hpY2ggbG9vayB1c2FibGUuCgpgYGB7ciBwZXJzaXN0ZW5jZV9wbG90fQojIyBBbGwKcGVyc2lzdGVuY2Vfbm9ybSA8LSBub3JtYWxpemVfZXhwdChwZXJzaXN0ZW5jZV9leHB0LCB0cmFuc2Zvcm0gPSAibG9nMiIsIGNvbnZlcnQgPSAiY3BtIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub3JtID0gInF1YW50IiwgZmlsdGVyID0gVFJVRSkKcGxvdF9wY2EocGVyc2lzdGVuY2Vfbm9ybSkkcGxvdApwZXJzaXN0ZW5jZV9uYiA8LSBub3JtYWxpemVfZXhwdChwZXJzaXN0ZW5jZV9leHB0LCB0cmFuc2Zvcm0gPSAibG9nMiIsIGNvbnZlcnQgPSAiY3BtIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmF0Y2ggPSAic3Zhc2VxIiwgZmlsdGVyID0gVFJVRSkKcGxvdF9wY2EocGVyc2lzdGVuY2VfbmIpJHBsb3QKCiMjIEJpb3BzaWVzCiMjcGVyc2lzdGVuY2VfYmlvcHN5X25vcm0gPC0gbm9ybWFsaXplX2V4cHQocGVyc2lzdGVuY2VfYmlvcHN5LCB0cmFuc2Zvcm0gPSAibG9nMiIsIGNvbnZlcnQgPSAiY3BtIiwKIyMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vcm0gPSAicXVhbnQiLCBmaWx0ZXIgPSBUUlVFKQojI3Bsb3RfcGNhKHBlcnNpc3RlbmNlX2Jpb3BzeV9ub3JtKSRwbG90CiMjIEluc3VmZmljaWVudCBkYXRhCgojIyBNb25vY3l0ZXMKcGVyc2lzdGVuY2VfbW9ub2N5dGVfbm9ybSA8LSBub3JtYWxpemVfZXhwdChwZXJzaXN0ZW5jZV9tb25vY3l0ZSwgdHJhbnNmb3JtID0gImxvZzIiLCBjb252ZXJ0ID0gImNwbSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9ybSA9ICJxdWFudCIsIGZpbHRlciA9IFRSVUUpCnBsb3RfcGNhKHBlcnNpc3RlbmNlX21vbm9jeXRlX25vcm0pJHBsb3QKcGVyc2lzdGVuY2VfbW9ub2N5dGVfbmIgPC0gbm9ybWFsaXplX2V4cHQocGVyc2lzdGVuY2VfbW9ub2N5dGUsIHRyYW5zZm9ybSA9ICJsb2cyIiwgY29udmVydCA9ICJjcG0iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYXRjaCA9ICJzdmFzZXEiLCBmaWx0ZXIgPSBUUlVFKQpwbG90X3BjYShwZXJzaXN0ZW5jZV9tb25vY3l0ZV9uYikkcGxvdAoKIyMgTmV1dHJvcGhpbHMKcGVyc2lzdGVuY2VfbmV1dHJvcGhpbF9ub3JtIDwtIG5vcm1hbGl6ZV9leHB0KHBlcnNpc3RlbmNlX25ldXRyb3BoaWwsIHRyYW5zZm9ybSA9ICJsb2cyIiwgY29udmVydCA9ICJjcG0iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9ybSA9ICJxdWFudCIsIGZpbHRlciA9IFRSVUUpCnBsb3RfcGNhKHBlcnNpc3RlbmNlX25ldXRyb3BoaWxfbm9ybSkkcGxvdApwZXJzaXN0ZW5jZV9uZXV0cm9waGlsX25iIDwtIG5vcm1hbGl6ZV9leHB0KHBlcnNpc3RlbmNlX25ldXRyb3BoaWwsIHRyYW5zZm9ybSA9ICJsb2cyIiwgY29udmVydCA9ICJjcG0iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhdGNoID0gInN2YXNlcSIsIGZpbHRlciA9IFRSVUUpCnBsb3RfcGNhKHBlcnNpc3RlbmNlX25ldXRyb3BoaWxfbmIpJHBsb3QKCiMjIEVvc2lub3BoaWxzCnBlcnNpc3RlbmNlX2Vvc2lub3BoaWxfbm9ybSA8LSBub3JtYWxpemVfZXhwdChwZXJzaXN0ZW5jZV9lb3Npbm9waGlsLCB0cmFuc2Zvcm0gPSAibG9nMiIsIGNvbnZlcnQgPSAiY3BtIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vcm0gPSAicXVhbnQiLCBmaWx0ZXIgPSBUUlVFKQpwbG90X3BjYShwZXJzaXN0ZW5jZV9lb3Npbm9waGlsX25vcm0pJHBsb3QKcGVyc2lzdGVuY2VfZW9zaW5vcGhpbF9uYiA8LSBub3JtYWxpemVfZXhwdChwZXJzaXN0ZW5jZV9lb3Npbm9waGlsLCB0cmFuc2Zvcm0gPSAibG9nMiIsIGNvbnZlcnQgPSAiY3BtIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYXRjaCA9ICJzdmFzZXEiLCBmaWx0ZXIgPSBUUlVFKQpwbG90X3BjYShwZXJzaXN0ZW5jZV9lb3Npbm9waGlsX25iKSRwbG90CmBgYAoKIyMjIHBlcnNpc3RlbmNlIERFCgpgYGB7ciBwZXJzaXN0ZW5jZV9kZX0KcGVyc2lzdGVuY2VfZGVfc3ZhIDwtIGFsbF9wYWlyd2lzZShwZXJzaXN0ZW5jZV9leHB0LCBmaWx0ZXIgPSBUUlVFLCBtb2RlbF9iYXRjaCA9ICJzdmFzZXEiKQpwZXJzaXN0ZW5jZV90YWJsZV9zdmEgPC0gY29tYmluZV9kZV90YWJsZXMoCiAgICBwZXJzaXN0ZW5jZV9kZV9zdmEsCiAgICBleGNlbCA9IGdsdWU6OmdsdWUoImFuYWx5c2VzLzRfdHVtYWNvL0RFX1BlcnNpc3RlbmNlL3BlcnNpc3RlbmNlX2FsbF9kZV9zdmEtdnt2ZXJ9Lnhsc3giKSkKCnBlcnNpc3RlbmNlX21vbm9jeXRlX2RlX3N2YSA8LSBhbGxfcGFpcndpc2UocGVyc2lzdGVuY2VfbW9ub2N5dGUsIGZpbHRlciA9IFRSVUUsIG1vZGVsX2JhdGNoID0gInN2YXNlcSIpCnBlcnNpc3RlbmNlX21vbm9jeXRlX3RhYmxlX3N2YSA8LSBjb21iaW5lX2RlX3RhYmxlcygKICAgIHBlcnNpc3RlbmNlX21vbm9jeXRlX2RlX3N2YSwKICAgIGV4Y2VsID0gZ2x1ZTo6Z2x1ZSgiYW5hbHlzZXMvNF90dW1hY28vREVfUGVyc2lzdGVuY2UvcGVyc2lzdGVuY2VfbW9ub2N5dGVfZGVfc3ZhLXZ7dmVyfS54bHN4IikpCgpwZXJzaXN0ZW5jZV9uZXV0cm9waGlsX2RlX3N2YSA8LSBhbGxfcGFpcndpc2UocGVyc2lzdGVuY2VfbmV1dHJvcGhpbCwgZmlsdGVyID0gVFJVRSwgbW9kZWxfYmF0Y2ggPSAic3Zhc2VxIikKcGVyc2lzdGVuY2VfbmV1dHJvcGhpbF90YWJsZV9zdmEgPC0gY29tYmluZV9kZV90YWJsZXMoCiAgICBwZXJzaXN0ZW5jZV9uZXV0cm9waGlsX2RlX3N2YSwKICAgIGV4Y2VsID0gZ2x1ZTo6Z2x1ZSgiYW5hbHlzZXMvNF90dW1hY28vREVfUGVyc2lzdGVuY2UvcGVyc2lzdGVuY2VfbmV1dHJvcGhpbF9kZV9zdmEtdnt2ZXJ9Lnhsc3giKSkKCnBlcnNpc3RlbmNlX2Vvc2lub3BoaWxfZGVfc3ZhIDwtIGFsbF9wYWlyd2lzZShwZXJzaXN0ZW5jZV9lb3Npbm9waGlsLCBmaWx0ZXIgPSBUUlVFLCBtb2RlbF9iYXRjaCA9ICJzdmFzZXEiKQpwZXJzaXN0ZW5jZV9lb3Npbm9waGlsX3RhYmxlX3N2YSA8LSBjb21iaW5lX2RlX3RhYmxlcygKICAgIHBlcnNpc3RlbmNlX2Vvc2lub3BoaWxfZGVfc3ZhLAogICAgZXhjZWwgPSBnbHVlOjpnbHVlKCJhbmFseXNlcy80X3R1bWFjby9ERV9QZXJzaXN0ZW5jZS9wZXJzaXN0ZW5jZV9lb3Npbm9waGlsX2RlX3N2YS12e3Zlcn0ueGxzeCIpKQpgYGAKCiMjIENvbXBhcmluZyB2aXNpdHMgd2l0aG91dCByZWdhcmQgdG8gY3VyZS9mYWlsCgojIyMgQWxsIGNlbGwgdHlwZXMKCmBgYHtyIGRlX2NmX3Zpc2l0X2FsbH0KdF92aXNpdF9hbGxfZGVfc3ZhIDwtIGFsbF9wYWlyd2lzZSh0X3Zpc2l0LCBmaWx0ZXIgPSBUUlVFLCBtb2RlbF9iYXRjaCA9ICJzdmFzZXEiKQoKdF92aXNpdF9hbGxfdGFibGVfc3ZhIDwtIGNvbWJpbmVfZGVfdGFibGVzKAogICAgdF92aXNpdF9hbGxfZGVfc3ZhLCBrZWVwZXJzID0gdmlzaXRfY29udHJhc3RzLAogICAgcmRhPWdsdWU6OmdsdWUoInJkYS90X2FsbF92aXNpdF90YWJsZV9zdmEtdnt2ZXJ9LnJkYSIpLAogICAgZXhjZWwgPSBnbHVlOjpnbHVlKCJhbmFseXNlcy80X3R1bWFjby9ERV9WaXNpdHMvdF9hbGxfdmlzaXRfdGFibGVzX3N2YS12e3Zlcn0ueGxzeCIpKQp0X3Zpc2l0X2FsbF9zaWdfc3ZhIDwtIGV4dHJhY3Rfc2lnbmlmaWNhbnRfZ2VuZXMoCiAgICB0X3Zpc2l0X2FsbF90YWJsZV9zdmEsCiAgICBleGNlbCA9IGdsdWU6OmdsdWUoImFuYWx5c2VzLzRfdHVtYWNvL0RFX1Zpc2l0cy90X2FsbF92aXNpdF9zaWdfc3ZhLXZ7dmVyfS54bHN4IikpCmBgYAoKIyMjIE1vbm9jeXRlIHNhbXBsZXMKCmBgYHtyIGRlX2NmX3Zpc2l0X21vbm9jeXRlfQp0X3Zpc2l0X21vbm9jeXRlcyA8LSBzZXRfZXhwdF9jb25kaXRpb25zKHRfbW9ub2N5dGVzLCBmYWN0PSJ2aXNpdG51bWJlciIpCnRfdmlzaXRfbW9ub2N5dGVfZGVfc3ZhIDwtIGFsbF9wYWlyd2lzZSh0X3Zpc2l0X21vbm9jeXRlcywgZmlsdGVyID0gVFJVRSwgbW9kZWxfYmF0Y2ggPSAic3Zhc2VxIikKCnRfdmlzaXRfbW9ub2N5dGVfdGFibGVfc3ZhIDwtIGNvbWJpbmVfZGVfdGFibGVzKAogICAgdF92aXNpdF9tb25vY3l0ZV9kZV9zdmEsIGtlZXBlcnMgPSB2aXNpdF9jb250cmFzdHMsCiAgICByZGE9Z2x1ZTo6Z2x1ZSgicmRhL3RfbW9ub2N5dGVfdmlzaXRfdGFibGVfc3ZhLXZ7dmVyfS5yZGEiKSwKICAgIGV4Y2VsID0gZ2x1ZTo6Z2x1ZSgiYW5hbHlzZXMvNF90dW1hY28vREVfVmlzaXRzL01vbm9jeXRlcy90X21vbm9jeXRlX3Zpc2l0X3RhYmxlc19zdmEtdnt2ZXJ9Lnhsc3giKSkKdF92aXNpdF9tb25vY3l0ZV9zaWdfc3ZhIDwtIGV4dHJhY3Rfc2lnbmlmaWNhbnRfZ2VuZXMoCiAgICB0X3Zpc2l0X21vbm9jeXRlX3RhYmxlX3N2YSwKICAgIGV4Y2VsID0gZ2x1ZTo6Z2x1ZSgiYW5hbHlzZXMvNF90dW1hY28vREVfVmlzaXRzL01vbm9jeXRlcy90X21vbm9jeXRlX3Zpc2l0X3NpZ19zdmEtdnt2ZXJ9Lnhsc3giKSkKYGBgCgojIyMgTmV1dHJvcGhpbCBzYW1wbGVzCgpgYGB7ciBkZV9jZl92aXNpdF9uZXV0cm9waGlsfQp0X3Zpc2l0X25ldXRyb3BoaWxzIDwtIHNldF9leHB0X2NvbmRpdGlvbnModF9uZXV0cm9waGlscywgZmFjdD0idmlzaXRudW1iZXIiKQp0X3Zpc2l0X25ldXRyb3BoaWxfZGVfc3ZhIDwtIGFsbF9wYWlyd2lzZSh0X3Zpc2l0X25ldXRyb3BoaWxzLCBmaWx0ZXIgPSBUUlVFLCBtb2RlbF9iYXRjaCA9ICJzdmFzZXEiKQoKdF92aXNpdF9uZXV0cm9waGlsX3RhYmxlX3N2YSA8LSBjb21iaW5lX2RlX3RhYmxlcygKICAgIHRfdmlzaXRfbmV1dHJvcGhpbF9kZV9zdmEsIGtlZXBlcnMgPSB2aXNpdF9jb250cmFzdHMsCiAgICByZGE9Z2x1ZTo6Z2x1ZSgicmRhL3RfbmV1dHJvcGhpbF92aXNpdF90YWJsZV9zdmEtdnt2ZXJ9LnJkYSIpLAogICAgZXhjZWwgPSBnbHVlOjpnbHVlKCJhbmFseXNlcy80X3R1bWFjby9ERV9WaXNpdHMvTmV1dHJvcGhpbHMvdF9uZXV0cm9waGlsX3Zpc2l0X3RhYmxlX3N2YS12e3Zlcn0ueGxzeCIpKQp0X3Zpc2l0X25ldXRyb3BoaWxfc2lnX3N2YSA8LSBleHRyYWN0X3NpZ25pZmljYW50X2dlbmVzKAogICAgdF92aXNpdF9uZXV0cm9waGlsX3RhYmxlX3N2YSwKICAgIGV4Y2VsID0gZ2x1ZTo6Z2x1ZSgiYW5hbHlzZXMvNF90dW1hY28vREVfVmlzaXRzL05ldXRyb3BoaWxzL3RfbmV1dHJvcGhpbF92aXNpdF9zaWdfc3ZhLXZ7dmVyfS54bHN4IikpCmBgYAoKIyMjIEVvc2lub3BoaWwgc2FtcGxlcwoKYGBge3IgZGVfY2ZfdmlzaXRfZW9zaW5vcGhpbH0KdF92aXNpdF9lb3Npbm9waGlscyA8LSBzZXRfZXhwdF9jb25kaXRpb25zKHRfZW9zaW5vcGhpbHMsIGZhY3Q9InZpc2l0bnVtYmVyIikKdF92aXNpdF9lb3Npbm9waGlsX2RlIDwtIGFsbF9wYWlyd2lzZSh0X3Zpc2l0X2Vvc2lub3BoaWxzLCBmaWx0ZXIgPSBUUlVFLCBtb2RlbF9iYXRjaCA9ICJzdmFzZXEiKQoKdF92aXNpdF9lb3Npbm9waGlsX3RhYmxlIDwtIGNvbWJpbmVfZGVfdGFibGVzKAogICAgdF92aXNpdF9lb3Npbm9waGlsX2RlLCBrZWVwZXJzID0gdmlzaXRfY29udHJhc3RzLAogICAgcmRhPWdsdWU6OmdsdWUoInJkYS90X2Vvc2lub3BoaWxfdmlzaXRfdGFibGVfc3ZhLXZ7dmVyfS5yZGEiKSwKICAgIGV4Y2VsID0gZ2x1ZTo6Z2x1ZSgiYW5hbHlzZXMvNF90dW1hY28vREVfVmlzaXRzL0Vvc2lub3BoaWxzL3RfZW9zaW5vcGhpbF92aXNpdF90YWJsZV9zdmEtdnt2ZXJ9Lnhsc3giKSkKdF92aXNpdF9lb3Npbm9waGlsX3NpZyA8LSBleHRyYWN0X3NpZ25pZmljYW50X2dlbmVzKAogICAgdF92aXNpdF9lb3Npbm9waGlsX3RhYmxlLAogICAgZXhjZWwgPSBnbHVlOjpnbHVlKCJhbmFseXNlcy80X3R1bWFjby9ERV9WaXNpdHMvRW9zaW5vcGhpbHMvdF9lb3Npbm9waGlsX3Zpc2l0X3NpZ19zdmEtdnt2ZXJ9Lnhsc3giKSkKYGBgCgojIEV4cGxvcmUgUk9DCgpBbGVqYW5kcm8gc2hvd2VkIHNvbWUgUk9DIGN1cnZlcyBmb3IgZW9zaW5vcGhpbCBkYXRhIHNob3dpbmcKc2Vuc2l0aXZpdHkgdnMuIHNwZWNpZmljaXR5IG9mIGEgY291cGxlIGdlbmVzIHdoaWNoIHdlcmUgb2JzZXJ2ZWQgaW4KdjEgZW9zaW5vcGhpbHMgdnMuIGFsbC10aW1lcyBlb3Npbm9waGlscyBhY3Jvc3MgY3VyZS9mYWlsLiAgSSBhbQpjdXJpb3VzIHRvIGJldHRlciB1bmRlcnN0YW5kIGhvdyB0aGlzIHdhcyBkb25lIGFuZCB3aGF0IHV0aWxpdHkgaXQKbWlnaHQgaGF2ZSBpbiBvdGhlciBjb250ZXh0cy4KClRvIHRoYXQgZW5kLCBJIHdhbnQgdG8gdHJ5IHNvbWV0aGluZyBzaW1pbGFyIG15c2VsZi4gSW4gb3JkZXIgdG8KcHJvcGVybHkgcGVyZm9ybSB0aGUgYW5hbHlzaXMgd2l0aCB0aGVzZSB2YXJpb3VzIHRvb2xzLCBJIG5lZWQgdG8KcmVjb25maWd1cmUgdGhlIGRhdGEgaW4gYSBwcmV0dHkgc3BlY2lmaWMgZm9ybWF0OgoKMS4gIFNpbmdsZSBkZiB3aXRoIDEgcm93IHBlciBzZXQgb2Ygb2JzZXJ2YXRpb25zIChzYW1wbGUgaW4gdGhpcyBjYXNlCiAgICBJIHRoaW5rKQoyLiAgVGhlIG91dGNvbWUgY29sdW1uKHMpIG5lZWQgdG8gYmUgMSAob3IgbW9yZT8pIG1ldGFkYXRhIGZhY3RvcihzKQogICAgKGN1cmUvZmFpbCBvciBhIHBhc3RlMCBvZiByZWxldmFudCBxdWVyaWVzIChlb192MV9jdXJlLAogICAgZW9fdjEyM19jdXJlLCBldGMpCjMuICBUaGUgcHJlZGljdG9yIGNvbHVtbihzKSBhcmUgdGhlIG1lYXN1cmVtZW50cyAocnBrbSBvZiAxIG9yIG1vcmUKICAgIGdlbmVzKSwgMSBjb2x1bW4gZWFjaCBnZW5lLgoKSWYgSSBpbnRlbmQgdG8gdXNlIHRoaXMgZm9yIG91ciB0eCBkYXRhLCBJIHdpbGwgbGlrZWx5IG5lZWQgYSB1dGlsaXR5CmZ1bmN0aW9uIHRvIGNyZWF0ZSB0aGUgcHJvcGVybHkgZm9ybWF0dGVkIGlucHV0IGRmLgoKRm9yIHRoZSBwdXJwb3NlcyBvZiBteSBwbGF5aW5nLCBJIHdpbGwgY2hvb3NlIHRocmVlIGdlbmVzIGZyb20gdGhlCmVvc2lub3BoaWwgQy9GIHRhYmxlLCBvbmUgd2hpY2ggaXMgc2lnbmlmaWNhbnQsIG9uZSB3aGljaCBpcyBub3QsIGFuZAphbiBhcmJpdHJhcnkuCgpUaGUgaW5wdXQgZ2VuZXMgd2lsbCB0aGVyZWZvcmUgYmUgY2hvc2VuIGZyb20gdGhlIGRhdGEgc3RydWN0dXJlOgp0X2NmX2Vvc2lub3BoaWxfdGFibGVzX3N2YToKCkVOU0cwMDAwMDE5ODE3OCwgRU5TRzAwMDAwMTc5MzQ0LCBFTlNHMDAwMDAxODI2MjgKCmBgYHtyIHJvY30KZW9fcnBrbSA8LSBub3JtYWxpemVfZXhwdCh0djFfZW9zaW5vcGhpbHMsIGNvbnZlcnQ9InJwa20iLCBjb2x1bW49ImNkc19sZW5ndGgiKQpgYGAKCgpgYGB7ciBzYXZlbWV9CmlmICghaXNUUlVFKGdldDAoInNraXBfbG9hZCIpKSkgewogIHBhbmRlcjo6cGFuZGVyKHNlc3Npb25JbmZvKCkpCiAgbWVzc2FnZShwYXN0ZTAoIlRoaXMgaXMgaHBnbHRvb2xzIGNvbW1pdDogIiwgZ2V0X2dpdF9jb21taXQoKSkpCiAgbWVzc2FnZShwYXN0ZTAoIlNhdmluZyB0byAiLCBzYXZlZmlsZSkpCiAgdG1wIDwtIHNtKHNhdmVtZShmaWxlbmFtZT1zYXZlZmlsZSkpCn0KYGBgCgpgYGB7ciBsb2FkbWVfYWZ0ZXIsIGV2YWw9RkFMU0V9CnRtcCA8LSBsb2FkbWUoZmlsZW5hbWU9c2F2ZWZpbGUpCmBgYAo=