Setup

library(ithi.utils)
load_base_libs()

library(methods)

library(ithi.meta)
library(ithi.figures)
library(ithi.utils)
library(ithi.seq)
library(ithi.clones)
library(ithi.supp)
library(ithi.xcr)
ihc_table_path <- snakemake@input$ihc_table
xcr_table_path <- snakemake@input$xcr_table
neoediting_outdir <- snakemake@input$neoediting_outdir
snv_cluster_files <- snakemake@input$snv_cluster_files
clone_tree_file <- snakemake@input$clone_tree_file
clone_branch_length_file <- snakemake@input$clone_branch_length_file
clone_prevalence_file <- snakemake@input$clone_prevalence_file
tcr_diversity_file <- snakemake@input$tcr_diversity
bcr_diversity_file <- snakemake@input$bcr_diversity
remixt_ploidy_file <- snakemake@input$remixt_cellularity_ploidy_file
clonal_measures_file <- snakemake@input$ith_stats

db_path <- snakemake@params$db
ith_stat_types <- snakemake@params$ith_stat_types

xcr_diversity_measures <- as.vector(outer(c("tcr", "bcr"), c("clonotypes_unique", 
    "shannon_entropy", "inverse_simpson", "D50_index", "chao1"), function(x, 
    y) paste(x, y, sep = "_")))
annotation_colours <- ithi.figures::get_annotation_colours()

ihc_table <- fread(ihc_table_path)
xcr_table <- read_clonotypes(xcr_table_path, duplicates = FALSE, db_path = db_path)

Read 19.7% of 304822 rows
Read 62.3% of 304822 rows
Read 88.6% of 304822 rows
Read 304822 rows and 18 (of 18) columns from 0.070 GB file in 00:00:05
tree_branch_data <- read_clone_tree_data(clone_tree_file, clone_branch_length_file, 
    clone_prevalence_file, db_path)

neoediting_res <- supp_neoediting(neoediting_outdir, ihc_table, db_path, tree_branch_data, 
    wtfilter = TRUE, full_epitopes = FALSE, snv_cluster_files = snv_cluster_files)

xcr_diversity <- ithi.supp::get_xcr_diversity(tcr_diversity_file, bcr_diversity_file, 
    db_path, xcr_table)

remixt_ploidy <- read.table(remixt_ploidy_file, row.names = 1, header = TRUE, 
    stringsAsFactors = FALSE)

remixt_ploidy <- remixt_ploidy %>% rownames_to_column(var = "voa")
remixt_ploidy$patient_id <- ithi.meta::factor_id(remixt_ploidy$patient_id, type = "patient_id", 
    db_path)
remixt_ploidy$condensed_id <- ithi.meta::map_id(remixt_ploidy$voa, from = "voa", 
    to = "condensed_id", db_path)

clonal_measures <- read_ith_stats(clonal_measures_file, db_path, duplicates = FALSE)

Analysis

The purpose of this analysis is to show whether or not TCR repertoire diversity associates with subclonal neoepitope depletion. If so, I suppose the biological interpretation would be that a more diverse TCR repertoire would be better able to eliminate specific (subclonal) antigens.

There are 2 things we should use to address this line of thinking:

  • Show that TCR/BCR repertoire diversity is NOT associated with ITH
  • Show whether or not TCR repertoire diversity has anything to do with subclonal neoepitope depletion

The first point – at a high level – challenges the assumption that more diverse TCR repertoires may contend with antigenic diversity associated with subclonal diversification, while the latter point directly addresses the reviewer comment. To then explain how TCR diversity can be collinear with epithelial CD8+ TIL density but not be associated with ITH, I need to review the results of the TIL cluster vs. XCR diversity analysis. (TODO!)

XCR diversity-ITH association

We mention this in the paper, but to show a plot:

xcr_diversity_melted <- melt(xcr_diversity, id.vars = c("patient_id", "condensed_id"), 
    measure.vars = xcr_diversity_measures)

xcr_clonal_diversity <- merge(clonal_measures, xcr_diversity_melted)
for (stat_type in ith_stat_types) {
    pvals <- ithi.utils::compute_pvals_subsets(xcr_clonal_diversity, facet_vars = c("variable"), 
        formula = as.formula(paste0("~ ", stat_type, "+ value")), corfun = cor.test, 
        method = "spearman")
    
    p <- ggplot(xcr_clonal_diversity, aes_string(x = stat_type, y = "value")) + 
        geom_point(aes(colour = patient_id)) + theme_bw() + theme_Publication() + 
        theme_nature() + scale_colour_manual(values = annotation_colours$patient_id) + 
        xlab(stat_type) + ylab("XCR diversity") + facet_wrap(~variable, scales = "free") + 
        geom_text(data = pvals, aes(x = Inf, y = Inf, label = p.value.text), 
            hjust = 1.1, vjust = 1.5, size = 2.5, parse = TRUE)
    
    print(p)
}

Even when working with uncorrected p-values, it’s quite obvious that there’s no correlation between ITH and XCR diversity.

Subclonal neoepitope depletion

rates_xcr_analysis <- function(rates_unmerged, xcr_diversity, divcol = "tcr_clonotypes_unique") {
    rates_unmerged_xcr <- plyr::join(rates_unmerged, xcr_diversity)
    rates_unmerged_xcr$patient_id <- ithi.meta::map_id(rates_unmerged_xcr$condensed_id, 
        from = "condensed_id", to = "patient_id", db_path)
    div_cols <- c("tcr_clonotypes_unique", "tcr_shannon_entropy", "tcr_inverse_simpson", 
        "bcr_clonotypes_unique", "bcr_shannon_entropy", "bcr_inverse_simpson")
    
    for (col in div_cols) {
        rates_unmerged_xcr[, col] <- rates_unmerged_xcr[, col]/max(rates_unmerged_xcr[, 
            col], na.rm = TRUE)
    }
    
    mod <- glmer(as.formula(paste0("expratio/obsratio ~ ", divcol, "+ (1 | patient_id)")), 
        data = rates_unmerged_xcr[!is.na(rates_unmerged_xcr[, divcol]), ], family = Gamma(link = "log"))
    summod <- summary(mod)
    pval <- unname(summod$coefficients[, 4][2])
    
    rates_unmerged_xcr$ei <- with(rates_unmerged_xcr, expratio/obsratio)
    
    labeller_vector <- c(paste("Patient", unique(rates_unmerged_xcr$patient_id)))
    names(labeller_vector) <- as.character(unique(rates_unmerged_xcr$patient_id))
    
    p1 <- ggplot(rates_unmerged_xcr, aes_string(x = divcol, y = "ei")) + theme_bw() + 
        ithi.utils::theme_Publication() + ithi.utils::theme_nature() + ithi.utils::stripped_theme() + 
        ylab("Expected/observed neoantigen ratio") + geom_point() + scale_color_manual(values = annotation_colours$patient_id) + 
        facet_wrap(~patient_id, scales = "free", labeller = as_labeller(labeller_vector)) + 
        xlab(divcol) + guides(colour = guide_legend(title = "Patient", nrow = 2)) + 
        ithi.utils::ggmargins(type = "topminus")
    
    return(list(plot = p1, pval = pval))
}
subclonal_rates_unmerged <- neoediting_res$subclonal_rates_unmerged %>% plyr::rename(c(sample_key = "condensed_id"))

tcr_uniqclone_neoediting_subclonal_res <- rates_xcr_analysis(subclonal_rates_unmerged, 
    xcr_diversity, divcol = "tcr_clonotypes_unique")
bcr_uniqclone_neoediting_subclonal_res <- rates_xcr_analysis(subclonal_rates_unmerged, 
    xcr_diversity, divcol = "bcr_clonotypes_unique")

tcr_shannon_neoediting_subclonal_res <- rates_xcr_analysis(subclonal_rates_unmerged, 
    xcr_diversity, divcol = "tcr_shannon_entropy")
bcr_shannon_neoediting_subclonal_res <- rates_xcr_analysis(subclonal_rates_unmerged, 
    xcr_diversity, divcol = "bcr_shannon_entropy")

tcr_simpson_neoediting_subclonal_res <- rates_xcr_analysis(subclonal_rates_unmerged, 
    xcr_diversity, divcol = "tcr_inverse_simpson")
bcr_simpson_neoediting_subclonal_res <- rates_xcr_analysis(subclonal_rates_unmerged, 
    xcr_diversity, divcol = "bcr_inverse_simpson")

(These are for subclonal neoediting.)

clonal_rates_unmerged <- neoediting_res$clonal_rates_unmerged %>% plyr::rename(c(sample_key = "condensed_id"))

tcr_uniqclone_neoediting_clonal_res <- rates_xcr_analysis(clonal_rates_unmerged, 
    xcr_diversity, divcol = "tcr_clonotypes_unique")
bcr_uniqclone_neoediting_clonal_res <- rates_xcr_analysis(clonal_rates_unmerged, 
    xcr_diversity, divcol = "bcr_clonotypes_unique")

tcr_shannon_neoediting_clonal_res <- rates_xcr_analysis(clonal_rates_unmerged, 
    xcr_diversity, divcol = "tcr_shannon_entropy")
bcr_shannon_neoediting_clonal_res <- rates_xcr_analysis(clonal_rates_unmerged, 
    xcr_diversity, divcol = "bcr_shannon_entropy")

tcr_simpson_neoediting_clonal_res <- rates_xcr_analysis(clonal_rates_unmerged, 
    xcr_diversity, divcol = "tcr_inverse_simpson")
bcr_simpson_neoediting_clonal_res <- rates_xcr_analysis(clonal_rates_unmerged, 
    xcr_diversity, divcol = "bcr_inverse_simpson")

So, this is a bit interesting. While we don’t really see any robust results for clonal neoediting and TCR/BCR diversity, we do see that TCR, but not BCR diversity is (negatively) correlated with E_i. The plots aren’t super convincing:

tcr_shannon_neoediting_subclonal_res$plot

But this implies that perhaps less diverse – more expanded? – TCR populations are also a sign of immunoediting.

A natural question to ask is whether or not this is merely because TCR diversity and CD8+ TIL densities may be negatively correlated within patients. We can see whether that’s the case:

ihc_table$patient_id <- ithi.meta::factor_id(ihc_table$patient_id, type = "patient_id", 
    db_path)
ihc_xcr_div <- ihc_table %>% plyr::join(xcr_diversity)
ihc_xcr_div$E_CD8_rescaled <- ihc_xcr_div$E_CD8_density/max(ihc_xcr_div$E_CD8_density, 
    na.rm = TRUE)
ihc_xcr_div$tcr_shannon_entropy_rescaled <- ihc_xcr_div$tcr_shannon_entropy/max(ihc_xcr_div$tcr_shannon_entropy, 
    na.rm = TRUE)

dat <- subset(ihc_xcr_div, !is.na(E_CD8_density) & !is.na(tcr_shannon_entropy))
singleton_patients <- (dat %>% group_by(patient_id) %>% summarise(n = n()) %>% 
    subset(n == 1))$patient_id

glmer(as.formula(paste0("E_CD8_rescaled ~ ", "tcr_shannon_entropy_rescaled", 
    "+ (1 | patient_id)")), data = dat %>% subset(!patient_id %in% singleton_patients), 
    family = Gamma(link = "log")) %>% summary
Generalized linear mixed model fit by maximum likelihood (Laplace
  Approximation) [glmerMod]
 Family: Gamma  ( log )
Formula: E_CD8_rescaled ~ tcr_shannon_entropy_rescaled + (1 | patient_id)
   Data: dat %>% subset(!patient_id %in% singleton_patients)

     AIC      BIC   logLik deviance df.resid 
  -178.5   -169.5     93.3   -186.5       67 

Scaled residuals: 
    Min      1Q  Median      3Q     Max 
-1.2181 -0.6581 -0.1140  0.4331  2.7443 

Random effects:
 Groups     Name        Variance Std.Dev.
 patient_id (Intercept) 1.1756   1.084   
 Residual               0.6022   0.776   
Number of obs: 71, groups:  patient_id, 17

Fixed effects:
                             Estimate Std. Error t value Pr(>|z|)    
(Intercept)                   -2.5896     0.3663  -7.070 1.55e-12 ***
tcr_shannon_entropy_rescaled   0.4004     0.6402   0.626    0.532    
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Correlation of Fixed Effects:
            (Intr)
tcr_shnnn__ -0.384

And there’s no correlation here. So it’s not true that, within patients, samples with higher epithelial CD8+ TIL densities necessarily have lower TCR diversity.

subclonal_rates_ihc_xcr_div <- plyr::join(subclonal_rates_unmerged, ihc_xcr_div)

mod <- glmer(expratio/obsratio ~ E_CD8_rescaled + tcr_shannon_entropy_rescaled + 
    (1 | patient_id), data = subset(subclonal_rates_ihc_xcr_div, !is.na(E_CD8_density) & 
    !is.na(tcr_shannon_entropy_rescaled)), family = Gamma(link = "log"))
summod <- summary(mod)
summod
Generalized linear mixed model fit by maximum likelihood (Laplace
  Approximation) [glmerMod]
 Family: Gamma  ( log )
Formula: 
expratio/obsratio ~ E_CD8_rescaled + tcr_shannon_entropy_rescaled +  
    (1 | patient_id)
   Data: 
subset(subclonal_rates_ihc_xcr_div, !is.na(E_CD8_density) & !is.na(tcr_shannon_entropy_rescaled))

     AIC      BIC   logLik deviance df.resid 
   -32.4    -23.5     21.2    -42.4       39 

Scaled residuals: 
     Min       1Q   Median       3Q      Max 
-1.88529 -0.53689 -0.09274  0.51294  1.35377 

Random effects:
 Groups     Name        Variance Std.Dev.
 patient_id (Intercept) 0.02579  0.1606  
 Residual               0.01519  0.1233  
Number of obs: 44, groups:  patient_id, 12

Fixed effects:
                             Estimate Std. Error t value Pr(>|z|)    
(Intercept)                    0.1487     0.1039   1.431 0.152303    
E_CD8_rescaled                 0.4192     0.1112   3.769 0.000164 ***
tcr_shannon_entropy_rescaled  -0.2673     0.1446  -1.849 0.064454 .  
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Correlation of Fixed Effects:
            (Intr) E_CD8_
E_CD8_rscld -0.215       
tcr_shnnn__ -0.276  0.160

Note how the sign (of the TCR coefficient) changes.

Adding in ploidy …

subclonal_rates_ihc_xcr_div_ploidy <- plyr::join(subclonal_rates_ihc_xcr_div, 
    remixt_ploidy, by = c("condensed_id", "patient_id"))

mod <- glmer(expratio/obsratio ~ E_CD8_rescaled + tcr_shannon_entropy_rescaled + 
    psi + Cellularity + (1 | patient_id), data = subset(subclonal_rates_ihc_xcr_div_ploidy, 
    !is.na(E_CD8_density) & !is.na(tcr_shannon_entropy_rescaled)), family = Gamma(link = "log"))
summod <- summary(mod)
summod
Generalized linear mixed model fit by maximum likelihood (Laplace
  Approximation) [glmerMod]
 Family: Gamma  ( log )
Formula: 
expratio/obsratio ~ E_CD8_rescaled + tcr_shannon_entropy_rescaled +  
    psi + Cellularity + (1 | patient_id)
   Data: 
subset(subclonal_rates_ihc_xcr_div_ploidy, !is.na(E_CD8_density) &  
    !is.na(tcr_shannon_entropy_rescaled))

     AIC      BIC   logLik deviance df.resid 
   -51.7    -38.8     32.9    -65.7       40 

Scaled residuals: 
     Min       1Q   Median       3Q      Max 
-2.03133 -0.40851 -0.02773  0.52020  1.35785 

Random effects:
 Groups     Name        Variance Std.Dev.
 patient_id (Intercept) 0.02473  0.1573  
 Residual               0.01090  0.1044  
Number of obs: 47, groups:  patient_id, 12

Fixed effects:
                             Estimate Std. Error t value Pr(>|z|)    
(Intercept)                  -0.03317    0.14038  -0.236 0.813223    
E_CD8_rescaled                0.32928    0.09320   3.533 0.000411 ***
tcr_shannon_entropy_rescaled -0.13896    0.12053  -1.153 0.248942    
psi                          -0.01147    0.02750  -0.417 0.676676    
Cellularity                   0.37558    0.08830   4.253  2.1e-05 ***
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Correlation of Fixed Effects:
            (Intr) E_CD8_ tcr___ psi   
E_CD8_rscld -0.019                     
tcr_shnnn__ -0.152  0.104              
psi         -0.539 -0.034 -0.171       
Cellularity -0.380 -0.244  0.221  0.020

So, putting everything together we still have epithelial CD8+ TIL density being significant, TCR diversity being a negatively associated factor at the edge of significance, while controlling for ploidy and cellularity.

In summary, TCR entropy alone isn’t significantly correlated with subclonal neoepitope elimination. When you add epithelial CD8+ TIL density to the explanatory variables, all of a sudden it is – but likely because it’s collinear with E_CD8_rescaled, given that the sign of the coefficient changes. Regularization could help here but no idea how to do it in glmer.

Some extensions might be to use other diversity indices (e.g. D50 or Berger-Parker indices).

LS0tCnRpdGxlOiAiVENSLW5lb2VwaXRvcGUgY29ycmVsYXRpb24iCi0tLQogICAgICAgICAgICAgICAgICAgICAgICBgYGB7ciwgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0KCiMjIyMjIyMjIFNuYWtlbWFrZSBoZWFkZXIgIyMjIyMjIyMKbGlicmFyeShtZXRob2RzKQpTbmFrZW1ha2UgPC0gc2V0Q2xhc3MoCiAgICAiU25ha2VtYWtlIiwKICAgIHNsb3RzID0gYygKICAgICAgICBpbnB1dCA9ICJsaXN0IiwKICAgICAgICBvdXRwdXQgPSAibGlzdCIsCiAgICAgICAgcGFyYW1zID0gImxpc3QiLAogICAgICAgIHdpbGRjYXJkcyA9ICJsaXN0IiwKICAgICAgICB0aHJlYWRzID0gIm51bWVyaWMiLAogICAgICAgIGxvZyA9ICJsaXN0IiwKICAgICAgICByZXNvdXJjZXMgPSAibGlzdCIsCiAgICAgICAgY29uZmlnID0gImxpc3QiLAogICAgICAgIHJ1bGUgPSAiY2hhcmFjdGVyIgogICAgKQopCnNuYWtlbWFrZSA8LSBTbmFrZW1ha2UoCiAgICBpbnB1dCA9IGxpc3QoJy9zaGFobGFiL2FsemhhbmcvcHJvamVjdHMvSVRIX0ltbXVuZS9wYXBlci9yZXN1bHRzL3RhYmxlcy9ydW4yL2l0aF9zdGF0aXN0aWNzLnRzdicsICdub3RlYm9va3MvdGNyX25lb2VwaXRvcGVfY29ycmVsYXRpb24uUm1kJywgJy9zaGFobGFiL2FsemhhbmcvcHJvamVjdHMvSVRIX0ltbXVuZS9wYXBlci9yZXN1bHRzL3RhYmxlcy9ydW4yL2Nsb25lcy90cmVlX2RhdGEudHN2JywgJy9zaGFobGFiL2FsemhhbmcvcHJvamVjdHMvSVRIX0ltbXVuZS9wYXBlci9yZXN1bHRzL3RhYmxlcy9ydW4yL2Nsb25lcy9jbG9uZV9kYXRhLnRzdicsICcvc2hhaGxhYi9hbHpoYW5nL3Byb2plY3RzL0lUSF9JbW11bmUvcGFwZXIvcmVzdWx0cy90YWJsZXMvcnVuMi9jbG9uZXMvc252X2NsdXN0ZXIvcGF0aWVudF8xLnRzdicsICcvc2hhaGxhYi9hbHpoYW5nL3Byb2plY3RzL0lUSF9JbW11bmUvcGFwZXIvcmVzdWx0cy90YWJsZXMvcnVuMi9jbG9uZXMvc252X2NsdXN0ZXIvcGF0aWVudF8yLnRzdicsICcvc2hhaGxhYi9hbHpoYW5nL3Byb2plY3RzL0lUSF9JbW11bmUvcGFwZXIvcmVzdWx0cy90YWJsZXMvcnVuMi9jbG9uZXMvc252X2NsdXN0ZXIvcGF0aWVudF8zLnRzdicsICcvc2hhaGxhYi9hbHpoYW5nL3Byb2plY3RzL0lUSF9JbW11bmUvcGFwZXIvcmVzdWx0cy90YWJsZXMvcnVuMi9jbG9uZXMvc252X2NsdXN0ZXIvcGF0aWVudF80LnRzdicsICcvc2hhaGxhYi9hbHpoYW5nL3Byb2plY3RzL0lUSF9JbW11bmUvcGFwZXIvcmVzdWx0cy90YWJsZXMvcnVuMi9jbG9uZXMvc252X2NsdXN0ZXIvcGF0aWVudF83LnRzdicsICcvc2hhaGxhYi9hbHpoYW5nL3Byb2plY3RzL0lUSF9JbW11bmUvcGFwZXIvcmVzdWx0cy90YWJsZXMvcnVuMi9jbG9uZXMvc252X2NsdXN0ZXIvcGF0aWVudF85LnRzdicsICcvc2hhaGxhYi9hbHpoYW5nL3Byb2plY3RzL0lUSF9JbW11bmUvcGFwZXIvcmVzdWx0cy90YWJsZXMvcnVuMi9jbG9uZXMvc252X2NsdXN0ZXIvcGF0aWVudF8xMC50c3YnLCAnL3NoYWhsYWIvYWx6aGFuZy9wcm9qZWN0cy9JVEhfSW1tdW5lL3BhcGVyL3Jlc3VsdHMvdGFibGVzL3J1bjIvY2xvbmVzL3Nudl9jbHVzdGVyL3BhdGllbnRfMTEudHN2JywgJy9zaGFobGFiL2FsemhhbmcvcHJvamVjdHMvSVRIX0ltbXVuZS9wYXBlci9yZXN1bHRzL3RhYmxlcy9ydW4yL2Nsb25lcy9zbnZfY2x1c3Rlci9wYXRpZW50XzEyLnRzdicsICcvc2hhaGxhYi9hbHpoYW5nL3Byb2plY3RzL0lUSF9JbW11bmUvcGFwZXIvcmVzdWx0cy90YWJsZXMvcnVuMi9jbG9uZXMvc252X2NsdXN0ZXIvcGF0aWVudF8xMy50c3YnLCAnL3NoYWhsYWIvYWx6aGFuZy9wcm9qZWN0cy9JVEhfSW1tdW5lL3BhcGVyL3Jlc3VsdHMvdGFibGVzL3J1bjIvY2xvbmVzL3Nudl9jbHVzdGVyL3BhdGllbnRfMTQudHN2JywgJy9zaGFobGFiL2FsemhhbmcvcHJvamVjdHMvSVRIX0ltbXVuZS9wYXBlci9yZXN1bHRzL3RhYmxlcy9ydW4yL2Nsb25lcy9zbnZfY2x1c3Rlci9wYXRpZW50XzE1LnRzdicsICcvc2hhaGxhYi9hbHpoYW5nL3Byb2plY3RzL0lUSF9JbW11bmUvcGFwZXIvcmVzdWx0cy90YWJsZXMvcnVuMi9jbG9uZXMvc252X2NsdXN0ZXIvcGF0aWVudF8xNi50c3YnLCAnL3NoYWhsYWIvYWx6aGFuZy9wcm9qZWN0cy9JVEhfSW1tdW5lL3BhcGVyL3Jlc3VsdHMvdGFibGVzL3J1bjIvY2xvbmVzL3Nudl9jbHVzdGVyL3BhdGllbnRfMTcudHN2JywgJy9zaGFobGFiL2FsemhhbmcvcHJvamVjdHMvSVRIX0ltbXVuZS9wYXBlci9yZXN1bHRzL3RhYmxlcy9ydW4yL3JlbWl4dF9jZWxsdWxhcml0eV9wbG9pZHkudHN2JywgJy9zaGFobGFiL2FsemhhbmcvcHJvamVjdHMvSVRIX0ltbXVuZS9wYXBlci9yZXN1bHRzL3RhYmxlcy9ydW4yL2loY190YWJsZS50c3YnLCAnL3NoYWhsYWIvYWx6aGFuZy9waXBlbGluZV9vdXRwdXRzL2l0aF9pbW11bmUvbmVvZWRpdGluZy9ydW42JywgJy9zaGFobGFiL2FsemhhbmcvcHJvamVjdHMvSVRIX0ltbXVuZS9wYXBlci9yZXN1bHRzL3RhYmxlcy9ydW4yL3hjcl90YWJsZS50c3YnLCAnL3NoYWhsYWIvYWx6aGFuZy9waXBlbGluZV9vdXRwdXRzL2l0aF9pbW11bmUvbWl4Y3IvbWl4Y3JfcnVucy9pdGhfMV8yXzMvbWl4Y3I1L3Bvc3Rwcm9jZXNzL0lHSC9wb3N0ZmlsdGVyX2RpdmVyc2l0eV9zdGF0cy9kaXZlcnNpdHkuc3RyaWN0LnJlc2FtcGxlZC50eHQnLCAnL3NoYWhsYWIvYWx6aGFuZy9wcm9qZWN0cy9JVEhfSW1tdW5lL3BhcGVyL3Jlc3VsdHMvdGFibGVzL3J1bjIvY2xvbmVzL2JyYW5jaF9kYXRhLnRzdicsICcvc2hhaGxhYi9hbHpoYW5nL3BpcGVsaW5lX291dHB1dHMvaXRoX2ltbXVuZS9taXhjci9taXhjcl9ydW5zL2l0aF8xXzJfMy9taXhjcjUvcG9zdHByb2Nlc3MvVFJCL3Bvc3RmaWx0ZXJfZGl2ZXJzaXR5X3N0YXRzL2RpdmVyc2l0eS5zdHJpY3QucmVzYW1wbGVkLnR4dCcsICJpdGhfc3RhdHMiID0gJy9zaGFobGFiL2FsemhhbmcvcHJvamVjdHMvSVRIX0ltbXVuZS9wYXBlci9yZXN1bHRzL3RhYmxlcy9ydW4yL2l0aF9zdGF0aXN0aWNzLnRzdicsICJub3RlYm9vayIgPSAnbm90ZWJvb2tzL3Rjcl9uZW9lcGl0b3BlX2NvcnJlbGF0aW9uLlJtZCcsICJjbG9uZV90cmVlX2ZpbGUiID0gJy9zaGFobGFiL2FsemhhbmcvcHJvamVjdHMvSVRIX0ltbXVuZS9wYXBlci9yZXN1bHRzL3RhYmxlcy9ydW4yL2Nsb25lcy90cmVlX2RhdGEudHN2JywgImNsb25lX3ByZXZhbGVuY2VfZmlsZSIgPSAnL3NoYWhsYWIvYWx6aGFuZy9wcm9qZWN0cy9JVEhfSW1tdW5lL3BhcGVyL3Jlc3VsdHMvdGFibGVzL3J1bjIvY2xvbmVzL2Nsb25lX2RhdGEudHN2JywgInNudl9jbHVzdGVyX2ZpbGVzIiA9IGMoJy9zaGFobGFiL2FsemhhbmcvcHJvamVjdHMvSVRIX0ltbXVuZS9wYXBlci9yZXN1bHRzL3RhYmxlcy9ydW4yL2Nsb25lcy9zbnZfY2x1c3Rlci9wYXRpZW50XzEudHN2JywgJy9zaGFobGFiL2FsemhhbmcvcHJvamVjdHMvSVRIX0ltbXVuZS9wYXBlci9yZXN1bHRzL3RhYmxlcy9ydW4yL2Nsb25lcy9zbnZfY2x1c3Rlci9wYXRpZW50XzIudHN2JywgJy9zaGFobGFiL2FsemhhbmcvcHJvamVjdHMvSVRIX0ltbXVuZS9wYXBlci9yZXN1bHRzL3RhYmxlcy9ydW4yL2Nsb25lcy9zbnZfY2x1c3Rlci9wYXRpZW50XzMudHN2JywgJy9zaGFobGFiL2FsemhhbmcvcHJvamVjdHMvSVRIX0ltbXVuZS9wYXBlci9yZXN1bHRzL3RhYmxlcy9ydW4yL2Nsb25lcy9zbnZfY2x1c3Rlci9wYXRpZW50XzQudHN2JywgJy9zaGFobGFiL2FsemhhbmcvcHJvamVjdHMvSVRIX0ltbXVuZS9wYXBlci9yZXN1bHRzL3RhYmxlcy9ydW4yL2Nsb25lcy9zbnZfY2x1c3Rlci9wYXRpZW50XzcudHN2JywgJy9zaGFobGFiL2FsemhhbmcvcHJvamVjdHMvSVRIX0ltbXVuZS9wYXBlci9yZXN1bHRzL3RhYmxlcy9ydW4yL2Nsb25lcy9zbnZfY2x1c3Rlci9wYXRpZW50XzkudHN2JywgJy9zaGFobGFiL2FsemhhbmcvcHJvamVjdHMvSVRIX0ltbXVuZS9wYXBlci9yZXN1bHRzL3RhYmxlcy9ydW4yL2Nsb25lcy9zbnZfY2x1c3Rlci9wYXRpZW50XzEwLnRzdicsICcvc2hhaGxhYi9hbHpoYW5nL3Byb2plY3RzL0lUSF9JbW11bmUvcGFwZXIvcmVzdWx0cy90YWJsZXMvcnVuMi9jbG9uZXMvc252X2NsdXN0ZXIvcGF0aWVudF8xMS50c3YnLCAnL3NoYWhsYWIvYWx6aGFuZy9wcm9qZWN0cy9JVEhfSW1tdW5lL3BhcGVyL3Jlc3VsdHMvdGFibGVzL3J1bjIvY2xvbmVzL3Nudl9jbHVzdGVyL3BhdGllbnRfMTIudHN2JywgJy9zaGFobGFiL2FsemhhbmcvcHJvamVjdHMvSVRIX0ltbXVuZS9wYXBlci9yZXN1bHRzL3RhYmxlcy9ydW4yL2Nsb25lcy9zbnZfY2x1c3Rlci9wYXRpZW50XzEzLnRzdicsICcvc2hhaGxhYi9hbHpoYW5nL3Byb2plY3RzL0lUSF9JbW11bmUvcGFwZXIvcmVzdWx0cy90YWJsZXMvcnVuMi9jbG9uZXMvc252X2NsdXN0ZXIvcGF0aWVudF8xNC50c3YnLCAnL3NoYWhsYWIvYWx6aGFuZy9wcm9qZWN0cy9JVEhfSW1tdW5lL3BhcGVyL3Jlc3VsdHMvdGFibGVzL3J1bjIvY2xvbmVzL3Nudl9jbHVzdGVyL3BhdGllbnRfMTUudHN2JywgJy9zaGFobGFiL2FsemhhbmcvcHJvamVjdHMvSVRIX0ltbXVuZS9wYXBlci9yZXN1bHRzL3RhYmxlcy9ydW4yL2Nsb25lcy9zbnZfY2x1c3Rlci9wYXRpZW50XzE2LnRzdicsICcvc2hhaGxhYi9hbHpoYW5nL3Byb2plY3RzL0lUSF9JbW11bmUvcGFwZXIvcmVzdWx0cy90YWJsZXMvcnVuMi9jbG9uZXMvc252X2NsdXN0ZXIvcGF0aWVudF8xNy50c3YnKSwgInJlbWl4dF9jZWxsdWxhcml0eV9wbG9pZHlfZmlsZSIgPSAnL3NoYWhsYWIvYWx6aGFuZy9wcm9qZWN0cy9JVEhfSW1tdW5lL3BhcGVyL3Jlc3VsdHMvdGFibGVzL3J1bjIvcmVtaXh0X2NlbGx1bGFyaXR5X3Bsb2lkeS50c3YnLCAiaWhjX3RhYmxlIiA9ICcvc2hhaGxhYi9hbHpoYW5nL3Byb2plY3RzL0lUSF9JbW11bmUvcGFwZXIvcmVzdWx0cy90YWJsZXMvcnVuMi9paGNfdGFibGUudHN2JywgIm5lb2VkaXRpbmdfb3V0ZGlyIiA9ICcvc2hhaGxhYi9hbHpoYW5nL3BpcGVsaW5lX291dHB1dHMvaXRoX2ltbXVuZS9uZW9lZGl0aW5nL3J1bjYnLCAieGNyX3RhYmxlIiA9ICcvc2hhaGxhYi9hbHpoYW5nL3Byb2plY3RzL0lUSF9JbW11bmUvcGFwZXIvcmVzdWx0cy90YWJsZXMvcnVuMi94Y3JfdGFibGUudHN2JywgImJjcl9kaXZlcnNpdHkiID0gJy9zaGFobGFiL2FsemhhbmcvcGlwZWxpbmVfb3V0cHV0cy9pdGhfaW1tdW5lL21peGNyL21peGNyX3J1bnMvaXRoXzFfMl8zL21peGNyNS9wb3N0cHJvY2Vzcy9JR0gvcG9zdGZpbHRlcl9kaXZlcnNpdHlfc3RhdHMvZGl2ZXJzaXR5LnN0cmljdC5yZXNhbXBsZWQudHh0JywgImNsb25lX2JyYW5jaF9sZW5ndGhfZmlsZSIgPSAnL3NoYWhsYWIvYWx6aGFuZy9wcm9qZWN0cy9JVEhfSW1tdW5lL3BhcGVyL3Jlc3VsdHMvdGFibGVzL3J1bjIvY2xvbmVzL2JyYW5jaF9kYXRhLnRzdicsICJ0Y3JfZGl2ZXJzaXR5IiA9ICcvc2hhaGxhYi9hbHpoYW5nL3BpcGVsaW5lX291dHB1dHMvaXRoX2ltbXVuZS9taXhjci9taXhjcl9ydW5zL2l0aF8xXzJfMy9taXhjcjUvcG9zdHByb2Nlc3MvVFJCL3Bvc3RmaWx0ZXJfZGl2ZXJzaXR5X3N0YXRzL2RpdmVyc2l0eS5zdHJpY3QucmVzYW1wbGVkLnR4dCcpLAogICAgb3V0cHV0ID0gbGlzdCgnL3NoYWhsYWIvYWx6aGFuZy9wcm9qZWN0cy9JVEhfSW1tdW5lL3BhcGVyL3Jlc3VsdHMvcmV2aWV3L25vdGVib29rcy9ydW4yL3Rjcl9uZW9lcGl0b3BlX2NvcnJlbGF0aW9uLm5iLmh0bWwnKSwKICAgIHBhcmFtcyA9IGxpc3QoJy9zaGFobGFiL2FsemhhbmcvcHJvamVjdHMvSVRIX0ltbXVuZS9tZXRhZGF0YS9kYi9pbW11bmVfcHJvamVjdC5zcWxpdGUzJywgJ3Rjcl9uZW9lcGl0b3BlX2NvcnJlbGF0aW9uX2FuYWx5c2lzJywgImRiIiA9ICcvc2hhaGxhYi9hbHpoYW5nL3Byb2plY3RzL0lUSF9JbW11bmUvbWV0YWRhdGEvZGIvaW1tdW5lX3Byb2plY3Quc3FsaXRlMycsICJuYW1lIiA9ICd0Y3JfbmVvZXBpdG9wZV9jb3JyZWxhdGlvbl9hbmFseXNpcycpLAogICAgd2lsZGNhcmRzID0gbGlzdCgpLAogICAgdGhyZWFkcyA9IDEsCiAgICBsb2cgPSBsaXN0KCcvc2hhaGxhYi9hbHpoYW5nL2NsdXN0dG1wL3BhcGVycmV2aWV3Mi9ub3RlYm9va3MvdGNyX25lb2VwaXRvcGVfY29ycmVsYXRpb25fYW5hbHlzaXMubG9nJyksCiAgICByZXNvdXJjZXMgPSBsaXN0KCksCiAgICBjb25maWcgPSBsaXN0KCJuYW5vc3RyaW5nX2Fubm90YXRpb25zIiA9ICcvc2hhaGxhYi9hbHpoYW5nL3Byb2plY3RzL0lUSF9JbW11bmUvZGF0YS9leHByZXNzaW9uL25hbm9zdHJpbmcvcGFuY2FuY2VyX2Fubm90YXRpb25zLnRzdicsICJjbG9sYV9yZXN1bHRfZmlsZSIgPSAnL3NoYWhsYWIvYWx6aGFuZy9waXBlbGluZV9vdXRwdXRzL2l0aF9pbW11bmUvY2xvbGEvcnVuNC9jbG9sYV9jb25kZW5zZWRfcmVzdWx0cy9iZXRhL2Nsb2xhX3Jlc3VsdHMudHN2JywgImNsb25lX3ByZXZhbGVuY2VzIiA9ICcvc2hhaGxhYi9hbHpoYW5nL3Byb2plY3RzL0lUSF9JbW11bmUvcGFwZXIvcmVzdWx0cy90YWJsZXMvcnVuMi9jbG9uZXMvY2xvbmVfZGF0YS50c3YnLCAic29tYXRpY19jb2RpbmdfcmVzdWx0X2RpciIgPSAnL3NoYWhsYWIvYWx6aGFuZy9wcm9qZWN0cy9JVEhfSW1tdW5lL3BhcGVyL3Jlc3VsdHMvdGFibGVzL3J1bjIvc29tYXRpY19jb2RpbmdfdmFyaWFudHMnLCAicmVmc2VxX2dlbmVfZmlsZSIgPSAnL3NoYWhsYWIvYWx6aGFuZy9kYXRhL2dlbm9tZS9oZzE5L3JlZnNlcV9nZW5lcy5iZWQnLCAidGlsY2x1c3Rlcl9zdXBlcnZpc2VkX2lweW5iIiA9ICcvc2hhaGxhYi9hbHpoYW5nL3Byb2plY3RzL0lUSF9JbW11bmUvcGFwZXIvcmV2aWV3L2lweS90aWxjbHVzdGVyX3N1cGVydmlzZWRtdWx0aWNsYXNzLmlweW5iJywgImljZ2Nfc3BlY2ltZW4iID0gJy9zaGFobGFiL2FsemhhbmcvZGF0YS9JQ0dDL3NwZWNpbWVuLnRzdicsICJuYW5vc3RyaW5nX2RhdGEiID0gJy9zaGFobGFiL2FsemhhbmcvcHJvamVjdHMvSVRIX0ltbXVuZS9yZXN1bHRzL25hbm9zdHJpbmdfcmVzdWx0cy9pdGhfZnVsbC9xYy9saW1tYV9xdWFudGlsZS9ub3JtYWxpemVkX2V4cHJlc3Npb25fdm9hX2xhYmVsc19maWx0ZXJlZC50c3YnLCAiaXRoX2ljZ2NfYmMiID0gJy9zaGFobGFiL2FsemhhbmcvcHJvamVjdHMvSVRIX0ltbXVuZS9wYXBlci9yZXN1bHRzL3RhYmxlcy9ydW4yL2l0aF9pY2djX21lcmdlZF9iYy50c3YnLCAiaWhjX3RhYmxlIiA9ICcvc2hhaGxhYi9hbHpoYW5nL3Byb2plY3RzL0lUSF9JbW11bmUvcGFwZXIvcmVzdWx0cy90YWJsZXMvcnVuMi9paGNfdGFibGUudHN2JywgIm5lb2VkaXRpbmdfb3V0ZGlyIiA9ICcvc2hhaGxhYi9hbHpoYW5nL3BpcGVsaW5lX291dHB1dHMvaXRoX2ltbXVuZS9uZW9lZGl0aW5nL3J1bjYnLCAidHVtb3VyX3B1cml0eSIgPSAnL3NoYWhsYWIvYWx6aGFuZy9wcm9qZWN0cy9JVEhfSW1tdW5lL3BhcGVyL3Jlc3VsdHMvdGFibGVzL3J1bjIvdHVtb3VyX3B1cml0eS50c3YnLCAiaWNnY19zdWJ0eXBlcyIgPSAnL3NoYWhsYWIvYWx6aGFuZy9kYXRhL0lDR0MvaWNnY19wcmltYXJ5X3R1bW91cl9zdWJ0eXBlcy50c3YnLCAiaXRoX3N0YXRzIiA9ICcvc2hhaGxhYi9hbHpoYW5nL3Byb2plY3RzL0lUSF9JbW11bmUvcGFwZXIvcmVzdWx0cy90YWJsZXMvcnVuMi9pdGhfc3RhdGlzdGljcy50c3YnLCAicm9vbmV5X211dHNpZ2N2X2ZpbGUiID0gJy9zaGFobGFiL2FsemhhbmcvcHJvamVjdHMvSVRIX0ltbXVuZS9leHRlcm5hbC9vdGhlcl9wYXBlcnMvbW1jNi54bHN4JywgInNudl90YWJsZSIgPSAnL3NoYWhsYWIvYW1jcGhlcnNvbi9wcm9qZWN0cy9pdGgzL2l0aDMvbm90ZWJvb2tzL2Jlc3Bva2UvaXRoX3NudnMudHN2JywgIm5vdGVib29rX2RpciIgPSAnL3NoYWhsYWIvYWx6aGFuZy9wcm9qZWN0cy9JVEhfSW1tdW5lL3BhcGVyL3Jlc3VsdHMvcmV2aWV3L25vdGVib29rcy9ydW4yJywgInZhcmlhYmlsaXR5X3R5cGUiID0gJ3N0YWJpbGl6ZScsICJpZ3BhcnRpdGlvbl9vdXRkaXIiID0gJy9zaGFobGFiL2FsemhhbmcvcGlwZWxpbmVfb3V0cHV0cy9pdGhfaW1tdW5lL2lncGFydGl0aW9uL3J1bjIyJywgInRhYmxlX2RpciIgPSAnL3NoYWhsYWIvYWx6aGFuZy9wcm9qZWN0cy9JVEhfSW1tdW5lL3BhcGVyL3Jlc3VsdHMvcmV2aWV3L3RhYmxlcy9ydW4yJywgInBhdGllbnRzX2Zvcl9jbG9uYWwiID0gYygxLCAyLCAzLCA0LCA3LCA5LCAxMCwgMTEsIDEyLCAxMywgMTQsIDE1LCAxNiwgMTcpLCAiaXRoX3N0YXRfdHlwZXMiID0gYygnZW50cm9weScsICdwb3N0cHJvY2Vzc2VkX2RpdmVyZ2VuY2UnLCAnY29tYmluZWRfaXRoX25vcm1hbGl6ZWQnLCAncHJvcG9ydGlvbl9zdWJjbG9uYWwnKSwgImZpbm5oZV9waXBlbGluZV9yZXN1bHRzX2RpciIgPSAnL3NoYWhsYWIvYWx6aGFuZy9waXBlbGluZV9vdXRwdXRzL2l0aF9pbW11bmUvZmlubmhlL3J1bjEnLCAia25vd25fc3VidHlwZXNfYXJyYXkiID0gJy9zaGFobGFiL2FsemhhbmcvcHJvamVjdHMvSVRIX0ltbXVuZS9kYXRhL2V4cHJlc3Npb24vYXJyYXkvc3VidHlwZXMva25vd25fc3VidHlwZXMudHN2JywgInRpbF9jbHVzdGVyc19vdXRwdXQiID0gJy9zaGFobGFiL2FsemhhbmcvcHJvamVjdHMvSVRIX0ltbXVuZS9wYXBlci9yZXN1bHRzL2ludGVybWVkaWF0ZXMvcnVuMi90aWxfY2x1c3RlcnNfb3V0cHV0LnR4dCcsICJwcmV2YWxlbmNlX3RocmVzaG9sZCIgPSAwLjAxLCAiYnJlYWtwb2ludF90YWJsZSIgPSAnL3NoYWhsYWIvYW1jcGhlcnNvbi9wcm9qZWN0cy9pdGgzL2l0aDMvbm90ZWJvb2tzL2Jlc3Bva2UvaXRoX2JyZWFrcG9pbnRzLnRzdicsICJlcGl0b3Blc191bmlxdWVfZmlsdGVyZWQiID0gJy9zaGFobGFiL2FsemhhbmcvcHJvamVjdHMvSVRIX0ltbXVuZS9wYXBlci9yZXN1bHRzL3RhYmxlcy9ydW4yL2VwaXRvcGVzX3VuaXF1ZV9maWx0ZXJlZC50c3YnLCAiZGIiID0gJy9zaGFobGFiL2FsemhhbmcvcHJvamVjdHMvSVRIX0ltbXVuZS9tZXRhZGF0YS9kYi9pbW11bmVfcHJvamVjdC5zcWxpdGUzJywgImRpc3RhbmNlX21ldGhvZCIgPSAnaG9ybicsICJyZW1peHRfY2VsbHVsYXJpdHlfcGxvaWR5IiA9ICcvc2hhaGxhYi9hbHpoYW5nL3Byb2plY3RzL0lUSF9JbW11bmUvcGFwZXIvcmVzdWx0cy90YWJsZXMvcnVuMi9yZW1peHRfY2VsbHVsYXJpdHlfcGxvaWR5LnRzdicsICJsb2dkaXIiID0gJy9zaGFobGFiL2FsemhhbmcvY2x1c3R0bXAvcGFwZXJyZXZpZXcyJywgImltYWdlX3N1bW1hcnkiID0gJy9zaGFobGFiL2FsemhhbmcvZGF0YS9pdGhpL3l1YW5faGVjcl9pbWFnZV9yZXN1bHRzLmNzdicsICJiY3JfZGl2ZXJzaXR5IiA9ICcvc2hhaGxhYi9hbHpoYW5nL3BpcGVsaW5lX291dHB1dHMvaXRoX2ltbXVuZS9taXhjci9taXhjcl9ydW5zL2l0aF8xXzJfMy9taXhjcjUvcG9zdHByb2Nlc3MvSUdIL3Bvc3RmaWx0ZXJfZGl2ZXJzaXR5X3N0YXRzL2RpdmVyc2l0eS5zdHJpY3QucmVzYW1wbGVkLnR4dCcsICJ0b3RhbF90aWx0eXBlcyIgPSBjKCdUX0NEOF9kZW5zaXR5JywgJ1RfQ0Q0X2RlbnNpdHknLCAnVF9DRDIwX2RlbnNpdHknLCAnVF9QbGFzbWFfZGVuc2l0eScpLCAidGNyX2RpdmVyc2l0eSIgPSAnL3NoYWhsYWIvYWx6aGFuZy9waXBlbGluZV9vdXRwdXRzL2l0aF9pbW11bmUvbWl4Y3IvbWl4Y3JfcnVucy9pdGhfMV8yXzMvbWl4Y3I1L3Bvc3Rwcm9jZXNzL1RSQi9wb3N0ZmlsdGVyX2RpdmVyc2l0eV9zdGF0cy9kaXZlcnNpdHkuc3RyaWN0LnJlc2FtcGxlZC50eHQnLCAiY29weW51bWJlcl90YWJsZSIgPSAnL3NoYWhsYWIvYWx6aGFuZy9kYXRhL2l0aGkvbWFzdGVyX2NvcHludW1iZXJfZmlsZS50c3YnLCAic252X2NsdXN0ZXJfZGlyIiA9ICcvc2hhaGxhYi9hbHpoYW5nL3Byb2plY3RzL0lUSF9JbW11bmUvcGFwZXIvcmVzdWx0cy90YWJsZXMvcnVuMi9jbG9uZXMvc252X2NsdXN0ZXInLCAidGlsc19mb3JfdmFyaWFiaWxpdHkiID0gYygnVF9DRDhfZGVuc2l0eScsICdUX0NENF9kZW5zaXR5JywgJ1RfQ0QyMF9kZW5zaXR5JywgJ1RfUGxhc21hX2RlbnNpdHknKSwgImFsbF90aWx0eXBlcyIgPSBjKCdUX0NEOF9kZW5zaXR5JywgJ1RfQ0Q0X2RlbnNpdHknLCAnVF9DRDIwX2RlbnNpdHknLCAnVF9QbGFzbWFfZGVuc2l0eScsICdFX0NEOF9kZW5zaXR5JywgJ0VfQ0Q0X2RlbnNpdHknLCAnRV9DRDIwX2RlbnNpdHknLCAnRV9QbGFzbWFfZGVuc2l0eScsICdTX0NEOF9kZW5zaXR5JywgJ1NfQ0Q0X2RlbnNpdHknLCAnU19DRDIwX2RlbnNpdHknLCAnU19QbGFzbWFfZGVuc2l0eScpLCAibW1jdG1fZmluYWxfcGF0aWVudF9kaXIiID0gJy9zaGFobGFiL2FsemhhbmcvcHJvamVjdHMvSVRIX0ltbXVuZS9yZXN1bHRzL21tY3RtX3Jlc3VsdHMvaXRoX2J5LXBhdGllbnRfd2l0aC1vdicsICJ0aWxzX2Zvcl9jbHVzdGVyIiA9IGMoJ0VfQ0Q4X2RlbnNpdHknLCAnRV9DRDRfZGVuc2l0eScsICdFX0NEMjBfZGVuc2l0eScsICdFX1BsYXNtYV9kZW5zaXR5JywgJ1NfQ0Q4X2RlbnNpdHknLCAnU19DRDRfZGVuc2l0eScsICdTX0NEMjBfZGVuc2l0eScsICdTX1BsYXNtYV9kZW5zaXR5JyksICJhcnJheV9leHByZXNzaW9uX2ZpbGUiID0gJy9zaGFobGFiL2FsemhhbmcvcHJvamVjdHMvSVRIX0ltbXVuZS9kYXRhL2V4cHJlc3Npb24vYXJyYXkvZ2VuZV9leHByc19ybWFfYmF0Y2hfY29ycmVjdGVkLnR4dCcsICJtb2xzdWJ0eXBlcyIgPSAnL3NoYWhsYWIvYWx6aGFuZy9wcm9qZWN0cy9JVEhfSW1tdW5lL3BhcGVyL3Jlc3VsdHMvdGFibGVzL3J1bjIvbW9sc3VidHlwZXMudHN2JywgImloY19mZWF0dXJlc19vdXRwdXQiID0gJy9zaGFobGFiL2FsemhhbmcvcHJvamVjdHMvSVRIX0ltbXVuZS9wYXBlci9yZXN1bHRzL2ludGVybWVkaWF0ZXMvcnVuMi9paGNfZmVhdHVyZXNfb3V0cHV0LnR4dCcsICJjbG9uZV9icmFuY2hfbGVuZ3RocyIgPSAnL3NoYWhsYWIvYWx6aGFuZy9wcm9qZWN0cy9JVEhfSW1tdW5lL3BhcGVyL3Jlc3VsdHMvdGFibGVzL3J1bjIvY2xvbmVzL2JyYW5jaF9kYXRhLnRzdicsICJ4Y3JfdGFibGUiID0gJy9zaGFobGFiL2FsemhhbmcvcHJvamVjdHMvSVRIX0ltbXVuZS9wYXBlci9yZXN1bHRzL3RhYmxlcy9ydW4yL3hjcl90YWJsZS50c3YnLCAiaGVfcmVzdWx0c19kaXIiID0gJy9zaGFobGFiL2FsemhhbmcvZGF0YS9pdGhpL2Zpbm5fcmVzdWx0cy9oZV9vdXRwdXRfTm92MjknLCAiY2xvbmVfdHJlZXMiID0gJy9zaGFobGFiL2FsemhhbmcvcHJvamVjdHMvSVRIX0ltbXVuZS9wYXBlci9yZXN1bHRzL3RhYmxlcy9ydW4yL2Nsb25lcy90cmVlX2RhdGEudHN2JywgImJlbmNobWFya2RpciIgPSAnL3NoYWhsYWIvYWx6aGFuZy9iZW5jaG1hcmtzL3BhcGVycmV2aWV3MicsICJpbWFnZV9zdW1tYXJ5MiIgPSAnL3NoYWhsYWIvYWx6aGFuZy9kYXRhL2l0aGkveXVhbl9oZWNyX2ltYWdlX3Jlc3VsdHNfMi5jc3YnKSwKICAgIHJ1bGUgPSAndGNyX25lb2VwaXRvcGVfY29ycmVsYXRpb25fYW5hbHlzaXMnCikKIyMjIyMjIyMgT3JpZ2luYWwgc2NyaXB0ICMjIyMjIyMjIwoKICAgICAgICAgICAgICAgICAgICAgICAgYGBgCgoKIyMgU2V0dXAKCmBgYHtyIGdsb2JhbF9jaHVua19vcHRpb25zLCBpbmNsdWRlPUZBTFNFfQprbml0cjo6b3B0c19jaHVuayRzZXQoZWNobyA9IFRSVUUsIHRpZHk9VFJVRSwgd2FybmluZz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgY2FjaGU9VFJVRSkgI2NhY2hlPVRSVUUKYGBgCgpgYGB7cn0KbGlicmFyeShpdGhpLnV0aWxzKQpsb2FkX2Jhc2VfbGlicygpCgpsaWJyYXJ5KG1ldGhvZHMpCgpsaWJyYXJ5KGl0aGkubWV0YSkKbGlicmFyeShpdGhpLmZpZ3VyZXMpCmxpYnJhcnkoaXRoaS51dGlscykKbGlicmFyeShpdGhpLnNlcSkKbGlicmFyeShpdGhpLmNsb25lcykKbGlicmFyeShpdGhpLnN1cHApCmxpYnJhcnkoaXRoaS54Y3IpCmBgYAoKYGBge3J9CmloY190YWJsZV9wYXRoIDwtIHNuYWtlbWFrZUBpbnB1dCRpaGNfdGFibGUKeGNyX3RhYmxlX3BhdGggPC0gc25ha2VtYWtlQGlucHV0JHhjcl90YWJsZQpuZW9lZGl0aW5nX291dGRpciA8LSBzbmFrZW1ha2VAaW5wdXQkbmVvZWRpdGluZ19vdXRkaXIKc252X2NsdXN0ZXJfZmlsZXMgPC0gc25ha2VtYWtlQGlucHV0JHNudl9jbHVzdGVyX2ZpbGVzCmNsb25lX3RyZWVfZmlsZSA8LSBzbmFrZW1ha2VAaW5wdXQkY2xvbmVfdHJlZV9maWxlCmNsb25lX2JyYW5jaF9sZW5ndGhfZmlsZSA8LSBzbmFrZW1ha2VAaW5wdXQkY2xvbmVfYnJhbmNoX2xlbmd0aF9maWxlCmNsb25lX3ByZXZhbGVuY2VfZmlsZSA8LSBzbmFrZW1ha2VAaW5wdXQkY2xvbmVfcHJldmFsZW5jZV9maWxlCnRjcl9kaXZlcnNpdHlfZmlsZSA8LSBzbmFrZW1ha2VAaW5wdXQkdGNyX2RpdmVyc2l0eQpiY3JfZGl2ZXJzaXR5X2ZpbGUgPC0gc25ha2VtYWtlQGlucHV0JGJjcl9kaXZlcnNpdHkKcmVtaXh0X3Bsb2lkeV9maWxlIDwtIHNuYWtlbWFrZUBpbnB1dCRyZW1peHRfY2VsbHVsYXJpdHlfcGxvaWR5X2ZpbGUKY2xvbmFsX21lYXN1cmVzX2ZpbGUgPC0gc25ha2VtYWtlQGlucHV0JGl0aF9zdGF0cwoKZGJfcGF0aCA8LSBzbmFrZW1ha2VAcGFyYW1zJGRiCml0aF9zdGF0X3R5cGVzIDwtIHNuYWtlbWFrZUBwYXJhbXMkaXRoX3N0YXRfdHlwZXMKCnhjcl9kaXZlcnNpdHlfbWVhc3VyZXMgPC0gYXMudmVjdG9yKG91dGVyKGMoInRjciIsICJiY3IiKSwgYygiY2xvbm90eXBlc191bmlxdWUiLCAic2hhbm5vbl9lbnRyb3B5IiwgImludmVyc2Vfc2ltcHNvbiIsICJENTBfaW5kZXgiLCAiY2hhbzEiKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbih4LCB5KSBwYXN0ZSh4LCB5LCBzZXA9Il8iKSkpCmBgYAoKYGBge3J9CmFubm90YXRpb25fY29sb3VycyA8LSBpdGhpLmZpZ3VyZXM6OmdldF9hbm5vdGF0aW9uX2NvbG91cnMoKQoKaWhjX3RhYmxlIDwtIGZyZWFkKGloY190YWJsZV9wYXRoKQp4Y3JfdGFibGUgPC0gcmVhZF9jbG9ub3R5cGVzKHhjcl90YWJsZV9wYXRoLCBkdXBsaWNhdGVzID0gRkFMU0UsIGRiX3BhdGggPSBkYl9wYXRoKQoKdHJlZV9icmFuY2hfZGF0YSA8LSByZWFkX2Nsb25lX3RyZWVfZGF0YShjbG9uZV90cmVlX2ZpbGUsIGNsb25lX2JyYW5jaF9sZW5ndGhfZmlsZSwgY2xvbmVfcHJldmFsZW5jZV9maWxlLCBkYl9wYXRoKQoKbmVvZWRpdGluZ19yZXMgPC0gc3VwcF9uZW9lZGl0aW5nKG5lb2VkaXRpbmdfb3V0ZGlyLCBpaGNfdGFibGUsIGRiX3BhdGgsIHRyZWVfYnJhbmNoX2RhdGEsIHd0ZmlsdGVyID0gVFJVRSwgZnVsbF9lcGl0b3BlcyA9IEZBTFNFLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNudl9jbHVzdGVyX2ZpbGVzID0gc252X2NsdXN0ZXJfZmlsZXMpCgp4Y3JfZGl2ZXJzaXR5IDwtIGl0aGkuc3VwcDo6Z2V0X3hjcl9kaXZlcnNpdHkodGNyX2RpdmVyc2l0eV9maWxlLCBiY3JfZGl2ZXJzaXR5X2ZpbGUsIGRiX3BhdGgsIHhjcl90YWJsZSkKCnJlbWl4dF9wbG9pZHkgPC0gcmVhZC50YWJsZShyZW1peHRfcGxvaWR5X2ZpbGUsIHJvdy5uYW1lcyA9IDEsIGhlYWRlciA9IFRSVUUsIHN0cmluZ3NBc0ZhY3RvcnMgPSBGQUxTRSkKCnJlbWl4dF9wbG9pZHkgPC0gcmVtaXh0X3Bsb2lkeSAlPiUgcm93bmFtZXNfdG9fY29sdW1uKHZhciA9ICJ2b2EiKQpyZW1peHRfcGxvaWR5JHBhdGllbnRfaWQgPC0gaXRoaS5tZXRhOjpmYWN0b3JfaWQocmVtaXh0X3Bsb2lkeSRwYXRpZW50X2lkLCB0eXBlID0gInBhdGllbnRfaWQiLCBkYl9wYXRoKQpyZW1peHRfcGxvaWR5JGNvbmRlbnNlZF9pZCA8LSBpdGhpLm1ldGE6Om1hcF9pZChyZW1peHRfcGxvaWR5JHZvYSwgZnJvbSA9ICJ2b2EiLCB0byA9ICJjb25kZW5zZWRfaWQiLCBkYl9wYXRoKQoKY2xvbmFsX21lYXN1cmVzIDwtIHJlYWRfaXRoX3N0YXRzKGNsb25hbF9tZWFzdXJlc19maWxlLCBkYl9wYXRoLCBkdXBsaWNhdGVzID0gRkFMU0UpCmBgYAoKCiMjIEFuYWx5c2lzCgpUaGUgcHVycG9zZSBvZiB0aGlzIGFuYWx5c2lzIGlzIHRvIHNob3cgd2hldGhlciBvciBub3QgVENSIHJlcGVydG9pcmUgZGl2ZXJzaXR5IGFzc29jaWF0ZXMgd2l0aCBzdWJjbG9uYWwgbmVvZXBpdG9wZSBkZXBsZXRpb24uIElmIHNvLCBJIHN1cHBvc2UgdGhlIGJpb2xvZ2ljYWwgaW50ZXJwcmV0YXRpb24gd291bGQgYmUgdGhhdCBhIG1vcmUgZGl2ZXJzZSBUQ1IgcmVwZXJ0b2lyZSB3b3VsZCBiZSBiZXR0ZXIgYWJsZSB0byBlbGltaW5hdGUgc3BlY2lmaWMgKHN1YmNsb25hbCkgYW50aWdlbnMuIAoKVGhlcmUgYXJlIDIgdGhpbmdzIHdlIHNob3VsZCB1c2UgdG8gYWRkcmVzcyB0aGlzIGxpbmUgb2YgdGhpbmtpbmc6CgoqIFNob3cgdGhhdCBUQ1IvQkNSIHJlcGVydG9pcmUgZGl2ZXJzaXR5IGlzIE5PVCBhc3NvY2lhdGVkIHdpdGggSVRICiogU2hvdyB3aGV0aGVyIG9yIG5vdCBUQ1IgcmVwZXJ0b2lyZSBkaXZlcnNpdHkgaGFzIGFueXRoaW5nIHRvIGRvIHdpdGggc3ViY2xvbmFsIG5lb2VwaXRvcGUgZGVwbGV0aW9uCgpUaGUgZmlyc3QgcG9pbnQgLS0gYXQgYSBoaWdoIGxldmVsIC0tIGNoYWxsZW5nZXMgdGhlIGFzc3VtcHRpb24gdGhhdCBtb3JlIGRpdmVyc2UgVENSIHJlcGVydG9pcmVzIG1heSBjb250ZW5kIHdpdGggYW50aWdlbmljIGRpdmVyc2l0eSBhc3NvY2lhdGVkIHdpdGggc3ViY2xvbmFsIGRpdmVyc2lmaWNhdGlvbiwgd2hpbGUgdGhlIGxhdHRlciBwb2ludCBkaXJlY3RseSBhZGRyZXNzZXMgdGhlIHJldmlld2VyIGNvbW1lbnQuIFRvIHRoZW4gZXhwbGFpbiBob3cgVENSIGRpdmVyc2l0eSBjYW4gYmUgY29sbGluZWFyIHdpdGggZXBpdGhlbGlhbCBDRDgrIFRJTCBkZW5zaXR5IGJ1dCBub3QgYmUgYXNzb2NpYXRlZCB3aXRoIElUSCwgSSBuZWVkIHRvIHJldmlldyB0aGUgcmVzdWx0cyBvZiB0aGUgVElMIGNsdXN0ZXIgdnMuIFhDUiBkaXZlcnNpdHkgYW5hbHlzaXMuIChUT0RPISkKCiMjIyBYQ1IgZGl2ZXJzaXR5LUlUSCBhc3NvY2lhdGlvbgoKV2UgbWVudGlvbiB0aGlzIGluIHRoZSBwYXBlciwgYnV0IHRvIHNob3cgYSBwbG90OgoKYGBge3J9Cnhjcl9kaXZlcnNpdHlfbWVsdGVkIDwtIG1lbHQoeGNyX2RpdmVyc2l0eSwgaWQudmFycyA9IGMoInBhdGllbnRfaWQiLCAiY29uZGVuc2VkX2lkIiksIG1lYXN1cmUudmFycyA9IHhjcl9kaXZlcnNpdHlfbWVhc3VyZXMpCgp4Y3JfY2xvbmFsX2RpdmVyc2l0eSA8LSBtZXJnZShjbG9uYWxfbWVhc3VyZXMsIHhjcl9kaXZlcnNpdHlfbWVsdGVkKQpgYGAKCmBgYHtyfQpmb3IgKHN0YXRfdHlwZSBpbiBpdGhfc3RhdF90eXBlcykgewogIHB2YWxzIDwtIGl0aGkudXRpbHM6OmNvbXB1dGVfcHZhbHNfc3Vic2V0cyh4Y3JfY2xvbmFsX2RpdmVyc2l0eSwgZmFjZXRfdmFycyA9IGMoInZhcmlhYmxlIiksIGZvcm11bGEgPSBhcy5mb3JtdWxhKHBhc3RlMCgifiAiLCBzdGF0X3R5cGUsICIrIHZhbHVlIikpLCBjb3JmdW4gPSBjb3IudGVzdCwgbWV0aG9kID0gInNwZWFybWFuIikKICAKICBwIDwtIGdncGxvdCh4Y3JfY2xvbmFsX2RpdmVyc2l0eSwgYWVzX3N0cmluZyh4PXN0YXRfdHlwZSwgeT0idmFsdWUiKSkgKyBnZW9tX3BvaW50KGFlcyhjb2xvdXI9cGF0aWVudF9pZCkpICsgdGhlbWVfYncoKSArIHRoZW1lX1B1YmxpY2F0aW9uKCkgKyAKICAgIHRoZW1lX25hdHVyZSgpICsgc2NhbGVfY29sb3VyX21hbnVhbCh2YWx1ZXMgPSBhbm5vdGF0aW9uX2NvbG91cnMkcGF0aWVudF9pZCkgKyB4bGFiKHN0YXRfdHlwZSkgKyB5bGFiKCJYQ1IgZGl2ZXJzaXR5IikgKyAKICAgIGZhY2V0X3dyYXAofiB2YXJpYWJsZSwgc2NhbGVzID0gImZyZWUiKSArIGdlb21fdGV4dChkYXRhPXB2YWxzLCBhZXMoeD1JbmYsIHk9SW5mLCBsYWJlbD1wLnZhbHVlLnRleHQpLCBoanVzdD0xLjEsIHZqdXN0PTEuNSxzaXplPTIuNSxwYXJzZT1UUlVFKQogIAogIHByaW50KHApCn0KYGBgCgpFdmVuIHdoZW4gd29ya2luZyB3aXRoIHVuY29ycmVjdGVkIHAtdmFsdWVzLCBpdCdzIHF1aXRlIG9idmlvdXMgdGhhdCB0aGVyZSdzIG5vIGNvcnJlbGF0aW9uIGJldHdlZW4gSVRIIGFuZCBYQ1IgZGl2ZXJzaXR5LiAKCiMjIyBTdWJjbG9uYWwgbmVvZXBpdG9wZSBkZXBsZXRpb24KCgpgYGB7cn0KcmF0ZXNfeGNyX2FuYWx5c2lzIDwtIGZ1bmN0aW9uKHJhdGVzX3VubWVyZ2VkLCB4Y3JfZGl2ZXJzaXR5LCBkaXZjb2wgPSAidGNyX2Nsb25vdHlwZXNfdW5pcXVlIikgewogIHJhdGVzX3VubWVyZ2VkX3hjciA8LSBwbHlyOjpqb2luKHJhdGVzX3VubWVyZ2VkLCB4Y3JfZGl2ZXJzaXR5KQogIHJhdGVzX3VubWVyZ2VkX3hjciRwYXRpZW50X2lkIDwtIGl0aGkubWV0YTo6bWFwX2lkKHJhdGVzX3VubWVyZ2VkX3hjciRjb25kZW5zZWRfaWQsIGZyb20gPSAiY29uZGVuc2VkX2lkIiwgdG8gPSAicGF0aWVudF9pZCIsIGRiX3BhdGgpCiAgZGl2X2NvbHMgPC0gYygidGNyX2Nsb25vdHlwZXNfdW5pcXVlIiwgInRjcl9zaGFubm9uX2VudHJvcHkiLCAidGNyX2ludmVyc2Vfc2ltcHNvbiIsCiAgICAgICAgICAgICAgICAiYmNyX2Nsb25vdHlwZXNfdW5pcXVlIiwgImJjcl9zaGFubm9uX2VudHJvcHkiLCAiYmNyX2ludmVyc2Vfc2ltcHNvbiIpCiAgCiAgZm9yIChjb2wgaW4gZGl2X2NvbHMpIHsKICAgIHJhdGVzX3VubWVyZ2VkX3hjclssY29sXSA8LSByYXRlc191bm1lcmdlZF94Y3JbLGNvbF0vbWF4KHJhdGVzX3VubWVyZ2VkX3hjclssY29sXSxuYS5ybT1UUlVFKQogIH0KICAKICBtb2QgPC0gZ2xtZXIoYXMuZm9ybXVsYShwYXN0ZTAoImV4cHJhdGlvL29ic3JhdGlvIH4gIiwgZGl2Y29sLCAiKyAoMSB8IHBhdGllbnRfaWQpIikpLCBkYXRhPXJhdGVzX3VubWVyZ2VkX3hjclshaXMubmEocmF0ZXNfdW5tZXJnZWRfeGNyWyxkaXZjb2xdKSxdLCBmYW1pbHkgPSBHYW1tYShsaW5rPSJsb2ciKSkKICBzdW1tb2QgPC0gc3VtbWFyeShtb2QpCiAgcHZhbCA8LSB1bm5hbWUoc3VtbW9kJGNvZWZmaWNpZW50c1ssNF1bMl0pCiAgCiAgcmF0ZXNfdW5tZXJnZWRfeGNyJGVpIDwtIHdpdGgocmF0ZXNfdW5tZXJnZWRfeGNyLCBleHByYXRpby9vYnNyYXRpbykKICAKICBsYWJlbGxlcl92ZWN0b3IgPC0gYyhwYXN0ZSgiUGF0aWVudCIsIHVuaXF1ZShyYXRlc191bm1lcmdlZF94Y3IkcGF0aWVudF9pZCkpKQogIG5hbWVzKGxhYmVsbGVyX3ZlY3RvcikgPC0gYXMuY2hhcmFjdGVyKHVuaXF1ZShyYXRlc191bm1lcmdlZF94Y3IkcGF0aWVudF9pZCkpCiAgCiAgcDEgPC0gZ2dwbG90KHJhdGVzX3VubWVyZ2VkX3hjciwgYWVzX3N0cmluZyh4ID0gZGl2Y29sLCB5ID0gImVpIikpICsgdGhlbWVfYncoKSArIAogICAgICBpdGhpLnV0aWxzOjp0aGVtZV9QdWJsaWNhdGlvbigpICsgaXRoaS51dGlsczo6dGhlbWVfbmF0dXJlKCkgKyBpdGhpLnV0aWxzOjpzdHJpcHBlZF90aGVtZSgpICsgeWxhYigiRXhwZWN0ZWQvb2JzZXJ2ZWQgbmVvYW50aWdlbiByYXRpbyIpICsgZ2VvbV9wb2ludCgpICsgCiAgICAgIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXMgPSBhbm5vdGF0aW9uX2NvbG91cnMkcGF0aWVudF9pZCkgKyBmYWNldF93cmFwKH5wYXRpZW50X2lkLCBzY2FsZXMgPSAiZnJlZSIsIGxhYmVsbGVyID0gYXNfbGFiZWxsZXIobGFiZWxsZXJfdmVjdG9yKSkgKyAKICAgICAgeGxhYihkaXZjb2wpICsgZ3VpZGVzKGNvbG91cj1ndWlkZV9sZWdlbmQodGl0bGUgPSAiUGF0aWVudCIsIG5yb3cgPSAyKSkgKyBpdGhpLnV0aWxzOjpnZ21hcmdpbnModHlwZSA9ICJ0b3BtaW51cyIpIAogIAogIHJldHVybihsaXN0KHBsb3Q9cDEsIHB2YWw9cHZhbCkpCn0KCmBgYAoKYGBge3IsIGNhY2hlPVRSVUV9CnN1YmNsb25hbF9yYXRlc191bm1lcmdlZCA8LSBuZW9lZGl0aW5nX3JlcyRzdWJjbG9uYWxfcmF0ZXNfdW5tZXJnZWQgJT4lIHBseXI6OnJlbmFtZShjKCdzYW1wbGVfa2V5Jz0nY29uZGVuc2VkX2lkJykpCgp0Y3JfdW5pcWNsb25lX25lb2VkaXRpbmdfc3ViY2xvbmFsX3JlcyA8LSByYXRlc194Y3JfYW5hbHlzaXMoc3ViY2xvbmFsX3JhdGVzX3VubWVyZ2VkLCB4Y3JfZGl2ZXJzaXR5LCBkaXZjb2wgPSAidGNyX2Nsb25vdHlwZXNfdW5pcXVlIikKYmNyX3VuaXFjbG9uZV9uZW9lZGl0aW5nX3N1YmNsb25hbF9yZXMgPC0gcmF0ZXNfeGNyX2FuYWx5c2lzKHN1YmNsb25hbF9yYXRlc191bm1lcmdlZCwgeGNyX2RpdmVyc2l0eSwgZGl2Y29sID0gImJjcl9jbG9ub3R5cGVzX3VuaXF1ZSIpCgp0Y3Jfc2hhbm5vbl9uZW9lZGl0aW5nX3N1YmNsb25hbF9yZXMgPC0gcmF0ZXNfeGNyX2FuYWx5c2lzKHN1YmNsb25hbF9yYXRlc191bm1lcmdlZCwgeGNyX2RpdmVyc2l0eSwgZGl2Y29sID0gInRjcl9zaGFubm9uX2VudHJvcHkiKQpiY3Jfc2hhbm5vbl9uZW9lZGl0aW5nX3N1YmNsb25hbF9yZXMgPC0gcmF0ZXNfeGNyX2FuYWx5c2lzKHN1YmNsb25hbF9yYXRlc191bm1lcmdlZCwgeGNyX2RpdmVyc2l0eSwgZGl2Y29sID0gImJjcl9zaGFubm9uX2VudHJvcHkiKQoKdGNyX3NpbXBzb25fbmVvZWRpdGluZ19zdWJjbG9uYWxfcmVzIDwtIHJhdGVzX3hjcl9hbmFseXNpcyhzdWJjbG9uYWxfcmF0ZXNfdW5tZXJnZWQsIHhjcl9kaXZlcnNpdHksIGRpdmNvbCA9ICJ0Y3JfaW52ZXJzZV9zaW1wc29uIikKYmNyX3NpbXBzb25fbmVvZWRpdGluZ19zdWJjbG9uYWxfcmVzIDwtIHJhdGVzX3hjcl9hbmFseXNpcyhzdWJjbG9uYWxfcmF0ZXNfdW5tZXJnZWQsIHhjcl9kaXZlcnNpdHksIGRpdmNvbCA9ICJiY3JfaW52ZXJzZV9zaW1wc29uIikKYGBgCgooVGhlc2UgYXJlIGZvciBzdWJjbG9uYWwgbmVvZWRpdGluZy4pCgpgYGB7ciwgY2FjaGU9VFJVRX0KY2xvbmFsX3JhdGVzX3VubWVyZ2VkIDwtIG5lb2VkaXRpbmdfcmVzJGNsb25hbF9yYXRlc191bm1lcmdlZCAlPiUgcGx5cjo6cmVuYW1lKGMoJ3NhbXBsZV9rZXknPSdjb25kZW5zZWRfaWQnKSkKCnRjcl91bmlxY2xvbmVfbmVvZWRpdGluZ19jbG9uYWxfcmVzIDwtIHJhdGVzX3hjcl9hbmFseXNpcyhjbG9uYWxfcmF0ZXNfdW5tZXJnZWQsIHhjcl9kaXZlcnNpdHksIGRpdmNvbCA9ICJ0Y3JfY2xvbm90eXBlc191bmlxdWUiKQpiY3JfdW5pcWNsb25lX25lb2VkaXRpbmdfY2xvbmFsX3JlcyA8LSByYXRlc194Y3JfYW5hbHlzaXMoY2xvbmFsX3JhdGVzX3VubWVyZ2VkLCB4Y3JfZGl2ZXJzaXR5LCBkaXZjb2wgPSAiYmNyX2Nsb25vdHlwZXNfdW5pcXVlIikKCnRjcl9zaGFubm9uX25lb2VkaXRpbmdfY2xvbmFsX3JlcyA8LSByYXRlc194Y3JfYW5hbHlzaXMoY2xvbmFsX3JhdGVzX3VubWVyZ2VkLCB4Y3JfZGl2ZXJzaXR5LCBkaXZjb2wgPSAidGNyX3NoYW5ub25fZW50cm9weSIpCmJjcl9zaGFubm9uX25lb2VkaXRpbmdfY2xvbmFsX3JlcyA8LSByYXRlc194Y3JfYW5hbHlzaXMoY2xvbmFsX3JhdGVzX3VubWVyZ2VkLCB4Y3JfZGl2ZXJzaXR5LCBkaXZjb2wgPSAiYmNyX3NoYW5ub25fZW50cm9weSIpCgp0Y3Jfc2ltcHNvbl9uZW9lZGl0aW5nX2Nsb25hbF9yZXMgPC0gcmF0ZXNfeGNyX2FuYWx5c2lzKGNsb25hbF9yYXRlc191bm1lcmdlZCwgeGNyX2RpdmVyc2l0eSwgZGl2Y29sID0gInRjcl9pbnZlcnNlX3NpbXBzb24iKQpiY3Jfc2ltcHNvbl9uZW9lZGl0aW5nX2Nsb25hbF9yZXMgPC0gcmF0ZXNfeGNyX2FuYWx5c2lzKGNsb25hbF9yYXRlc191bm1lcmdlZCwgeGNyX2RpdmVyc2l0eSwgZGl2Y29sID0gImJjcl9pbnZlcnNlX3NpbXBzb24iKQpgYGAKClNvLCB0aGlzIGlzIGEgYml0IGludGVyZXN0aW5nLiBXaGlsZSB3ZSBkb24ndCByZWFsbHkgc2VlIGFueSByb2J1c3QgcmVzdWx0cyBmb3IgY2xvbmFsIG5lb2VkaXRpbmcgYW5kIFRDUi9CQ1IgZGl2ZXJzaXR5LCB3ZSBkbyBzZWUgdGhhdCBUQ1IsIGJ1dCBub3QgQkNSIGRpdmVyc2l0eSBpcyAobmVnYXRpdmVseSkgY29ycmVsYXRlZCB3aXRoIEVfaS4gVGhlIHBsb3RzIGFyZW4ndCBzdXBlciBjb252aW5jaW5nOgoKYGBge3J9CnRjcl9zaGFubm9uX25lb2VkaXRpbmdfc3ViY2xvbmFsX3JlcyRwbG90CmBgYAoKQnV0IHRoaXMgaW1wbGllcyB0aGF0IHBlcmhhcHMgbGVzcyBkaXZlcnNlIC0tIG1vcmUgZXhwYW5kZWQ/IC0tIFRDUiBwb3B1bGF0aW9ucyBhcmUgYWxzbyBhIHNpZ24gb2YgaW1tdW5vZWRpdGluZy4gCgpBIG5hdHVyYWwgcXVlc3Rpb24gdG8gYXNrIGlzIHdoZXRoZXIgb3Igbm90IHRoaXMgaXMgbWVyZWx5IGJlY2F1c2UgVENSIGRpdmVyc2l0eSBhbmQgQ0Q4KyBUSUwgZGVuc2l0aWVzIG1heSBiZSBuZWdhdGl2ZWx5IGNvcnJlbGF0ZWQgd2l0aGluIHBhdGllbnRzLiBXZSBjYW4gc2VlIHdoZXRoZXIgdGhhdCdzIHRoZSBjYXNlOgoKYGBge3J9CmloY190YWJsZSRwYXRpZW50X2lkIDwtIGl0aGkubWV0YTo6ZmFjdG9yX2lkKGloY190YWJsZSRwYXRpZW50X2lkLCB0eXBlID0gInBhdGllbnRfaWQiLCBkYl9wYXRoKQppaGNfeGNyX2RpdiA8LSBpaGNfdGFibGUgJT4lIHBseXI6OmpvaW4oeGNyX2RpdmVyc2l0eSkKaWhjX3hjcl9kaXYkRV9DRDhfcmVzY2FsZWQgPC0gaWhjX3hjcl9kaXYkRV9DRDhfZGVuc2l0eS9tYXgoaWhjX3hjcl9kaXYkRV9DRDhfZGVuc2l0eSxuYS5ybT1UUlVFKQppaGNfeGNyX2RpdiR0Y3Jfc2hhbm5vbl9lbnRyb3B5X3Jlc2NhbGVkIDwtIGloY194Y3JfZGl2JHRjcl9zaGFubm9uX2VudHJvcHkvbWF4KGloY194Y3JfZGl2JHRjcl9zaGFubm9uX2VudHJvcHksbmEucm09VFJVRSkKCmRhdCA8LSBzdWJzZXQoaWhjX3hjcl9kaXYsICFpcy5uYShFX0NEOF9kZW5zaXR5KSAmICFpcy5uYSh0Y3Jfc2hhbm5vbl9lbnRyb3B5KSkKc2luZ2xldG9uX3BhdGllbnRzIDwtIChkYXQgJT4lIGdyb3VwX2J5KHBhdGllbnRfaWQpICU+JSBzdW1tYXJpc2Uobj1uKCkpICU+JSBzdWJzZXQobiA9PSAxKSkkcGF0aWVudF9pZAoKZ2xtZXIoYXMuZm9ybXVsYShwYXN0ZTAoIkVfQ0Q4X3Jlc2NhbGVkIH4gIiwgInRjcl9zaGFubm9uX2VudHJvcHlfcmVzY2FsZWQiLCAiKyAoMSB8IHBhdGllbnRfaWQpIikpLCBkYXRhPWRhdCAlPiUgc3Vic2V0KCFwYXRpZW50X2lkICVpbiUgc2luZ2xldG9uX3BhdGllbnRzKSwgZmFtaWx5ID0gR2FtbWEobGluaz0ibG9nIikpICU+JSBzdW1tYXJ5CmBgYAoKQW5kIHRoZXJlJ3Mgbm8gY29ycmVsYXRpb24gaGVyZS4gU28gaXQncyBub3QgdHJ1ZSB0aGF0LCB3aXRoaW4gcGF0aWVudHMsIHNhbXBsZXMgd2l0aCBoaWdoZXIgZXBpdGhlbGlhbCBDRDgrIFRJTCBkZW5zaXRpZXMgbmVjZXNzYXJpbHkgaGF2ZSBsb3dlciBUQ1IgZGl2ZXJzaXR5LiAKCgpgYGB7cn0Kc3ViY2xvbmFsX3JhdGVzX2loY194Y3JfZGl2IDwtIHBseXI6OmpvaW4oc3ViY2xvbmFsX3JhdGVzX3VubWVyZ2VkLCBpaGNfeGNyX2RpdikKCm1vZCA8LSBnbG1lcihleHByYXRpby9vYnNyYXRpbyB+IEVfQ0Q4X3Jlc2NhbGVkICsgdGNyX3NoYW5ub25fZW50cm9weV9yZXNjYWxlZCArICgxIHwgcGF0aWVudF9pZCksIGRhdGE9c3Vic2V0KHN1YmNsb25hbF9yYXRlc19paGNfeGNyX2RpdiwgIWlzLm5hKEVfQ0Q4X2RlbnNpdHkpICYgIWlzLm5hKHRjcl9zaGFubm9uX2VudHJvcHlfcmVzY2FsZWQpKSwgZmFtaWx5ID0gR2FtbWEobGluaz0ibG9nIikpCnN1bW1vZCA8LSBzdW1tYXJ5KG1vZCkKc3VtbW9kCmBgYAoKTm90ZSBob3cgdGhlIHNpZ24gKG9mIHRoZSBUQ1IgY29lZmZpY2llbnQpIGNoYW5nZXMuIAoKQWRkaW5nIGluIHBsb2lkeSAuLi4KCmBgYHtyfQpzdWJjbG9uYWxfcmF0ZXNfaWhjX3hjcl9kaXZfcGxvaWR5IDwtIHBseXI6OmpvaW4oc3ViY2xvbmFsX3JhdGVzX2loY194Y3JfZGl2LCByZW1peHRfcGxvaWR5LCBieSA9IGMoImNvbmRlbnNlZF9pZCIsICJwYXRpZW50X2lkIikpIAoKbW9kIDwtIGdsbWVyKGV4cHJhdGlvL29ic3JhdGlvIH4gRV9DRDhfcmVzY2FsZWQgKyB0Y3Jfc2hhbm5vbl9lbnRyb3B5X3Jlc2NhbGVkICsgcHNpICsgQ2VsbHVsYXJpdHkgKyAoMSB8IHBhdGllbnRfaWQpLCBkYXRhPXN1YnNldChzdWJjbG9uYWxfcmF0ZXNfaWhjX3hjcl9kaXZfcGxvaWR5LCAhaXMubmEoRV9DRDhfZGVuc2l0eSkgJiAhaXMubmEodGNyX3NoYW5ub25fZW50cm9weV9yZXNjYWxlZCkpLCBmYW1pbHkgPSBHYW1tYShsaW5rPSJsb2ciKSkKc3VtbW9kIDwtIHN1bW1hcnkobW9kKQpzdW1tb2QKYGBgCgpTbywgcHV0dGluZyBldmVyeXRoaW5nIHRvZ2V0aGVyIHdlIHN0aWxsIGhhdmUgZXBpdGhlbGlhbCBDRDgrIFRJTCBkZW5zaXR5IGJlaW5nIHNpZ25pZmljYW50LCBUQ1IgZGl2ZXJzaXR5IGJlaW5nIGEgbmVnYXRpdmVseSBhc3NvY2lhdGVkIGZhY3RvciBhdCB0aGUgZWRnZSBvZiBzaWduaWZpY2FuY2UsIHdoaWxlIGNvbnRyb2xsaW5nIGZvciBwbG9pZHkgYW5kIGNlbGx1bGFyaXR5LiAKCkluIHN1bW1hcnksIFRDUiBlbnRyb3B5IGFsb25lIGlzbid0IHNpZ25pZmljYW50bHkgY29ycmVsYXRlZCB3aXRoIHN1YmNsb25hbCBuZW9lcGl0b3BlIGVsaW1pbmF0aW9uLiBXaGVuIHlvdSBhZGQgZXBpdGhlbGlhbCBDRDgrIFRJTCBkZW5zaXR5IHRvIHRoZSBleHBsYW5hdG9yeSB2YXJpYWJsZXMsIGFsbCBvZiBhIHN1ZGRlbiBpdCBpcyAtLSBidXQgbGlrZWx5IGJlY2F1c2UgaXQncyBjb2xsaW5lYXIgd2l0aCBFX0NEOF9yZXNjYWxlZCwgZ2l2ZW4gdGhhdCB0aGUgc2lnbiBvZiB0aGUgY29lZmZpY2llbnQgY2hhbmdlcy4gUmVndWxhcml6YXRpb24gY291bGQgaGVscCBoZXJlIGJ1dCBubyBpZGVhIGhvdyB0byBkbyBpdCBpbiBnbG1lci4gCgpTb21lIGV4dGVuc2lvbnMgbWlnaHQgYmUgdG8gdXNlIG90aGVyIGRpdmVyc2l0eSBpbmRpY2VzIChlLmcuIEQ1MCBvciBCZXJnZXItUGFya2VyIGluZGljZXMpLgo=